nagios-4.3.4/000077500000000000000000000000001314764422400130115ustar00rootroot00000000000000nagios-4.3.4/.gitignore000066400000000000000000000006401314764422400150010ustar00rootroot00000000000000pkg subst pkginfo Prototype nagios.SPARC.pkg.tar.gz autom4te.cache config.log config.status daemon-init openrc-init Makefile tags .deps/ .libs/ nbproject/ .kdev4/ .settings/ .cproject .project *.kdev4 *.o *.la *.lo *.gcda *.gcno *.gcov *.a *.so cgi/run* gmon.out core.[1-9]* /Documentation *.pre-indent *.swp html/angularjs/angular-1.3.9 html/angularjs/ui-utils-0.2.1 html/bootstrap-3.3.0 html/d3 html/index.php nagios-4.3.4/CONTRIBUTING.md000066400000000000000000000142211314764422400152420ustar00rootroot00000000000000# Contributing Thank you for considering contributing your time and effort to this Nagios project. This document serves as our guidelines for contribution. Keep in mind that these are simply *guidelines* - nothing here is set in stone. ## Questions If you have a question, you don't need to file an Issue. You can simply connect with the Nagios Support Team via the [Nagios Support Forum](https://support.nagios.com/forum/). Not to say that you **can't** open an Issue - but you'll likely get a much faster response by posting it on the forum. ## Ideas If you have an idea your best bet is to open an Issue. This gets it on the radar much quicker than any other method. First, let's define what an "Idea" really is. An Idea is simply an [Enhancement](#enhancements) request in its infancy. There's really nothing to it! Something as simple as "I think that this project should somehow connect with a widget" is a valid Idea. These are unrefined and raw. That's why you open an issue - so everyone gets a chance to chime in and come up with a plan! ## Feedback Feedback can be given via several methods. The *easiest* method is by opening an Issue. You're more than welcome to leave feedback on the [Nagios Support Forum](https://support.nagios.com/forum/) as well. By opening an Issue, however, you're insuring that the maintainers and reviewers are the first ones to see the feedback. In most cases, this is likely ideal. ## Bugs Here's where it starts to get serious. Following the guidelines outlined in this section allows the maintainers, developers, and community to understand and reproduce your bug report. Make sure to search existing open and closed [Issues](https://guides.github.com/features/issues/) before opening a bug report. If you find a closed Issue that seems like it's the same thing that you're experiencing, open a new Issue and include a link to the original Issue in the body of the new one. **If you have a bug, you *NEED* to open an Issue.** Not only that, but when you open the Issue, this is what we ***absolutely require***: * Use a clear and concise title for the Issue to identify the problem accurately * Describe the bug with as much detail as you can * Include the version of the project containing the bug you're reporting * Include your operating system information (`uname -a`) * Include a list of third party modules that are installed and/or loaded * Explain the behavior you expected to see (and why) vs. what actually happened Once you've got that covered - there's still more to include if you want to make a ***killer*** report: * Describe the ***exact steps*** that reproduce the problem * Provide **specific** examples to demonstrate those steps * If your bug is from an older version, make sure test against the latest (and/or the `maint` branch) * Include any screenshots that can help explain the issue * Include a file containing `strace` and/or `valgrind` output * Explain when the problem started happening: was it after an upgrade? or was it always present? * Define how reliably you can reproduce the bug * Any other information that you decide is relevant is also welcome ## Enhancements An enhancement is either a completely new feature or an improvement to existing functionality. We consider it to be a bit different than idea - based solely on the fact that it's more detailed than an idea would be. So you've got an idea for an ehancement? Great! Following the guidelines outlined in this section allows maintainers, developers, and the community to understand your enhancement and determine whether or not it's worth doing and/or what's involved in carrying it out. Make sure to search open and closed Issues and Pull Requests to determine if someone has either submitted the enhancement. If you feel like your enhancement is similar to one found, make sure to link the original in your request. Enhancements are submitted by opening an Issue. Unlike an [Idea](#idea), when you decide to submit your enhancement and open the Issue, we require at least the following information: * Use a clear and descriptive title to illustrate the enhancement you're requesting * Describe the current behavior (if it exists) and what changes you think should be made * Explain the enhancement in detail - make sure it makes sense and is easily understandable * Specify why the enhancement would be useful and who it would be useful to * If there is some other project or program where this enhancement already exists, make sure to link to it Beyond that, there are a few more things you can do to make sure you **really** get your point across: * Create a mockup of the enhancement (if applicable) and attach whatever files you can * Provide a step-by-step description of the suggested enhancement * Generate a fully dressed use-case for the enhancement request * Create a specification for the preferred implementation of the enhancement * Include a timeline regarding development expectations towards the request ## Submitting Code Everything else in this document has lead up to this moment - how can ***you*** submit code to the **project**. We allow code submissions via [Pull Requests](https://help.github.com/articles/about-pull-requests/). These let you (and us) discuss and review any changes to code in any repository you've made. How to create and manage Pull Requests is outside of the scope of this document, but make sure to check out GitHub's official documentation ([link here](https://help.github.com/)) to get a handle on it. While you're forking the repository to create a patch or an enhancement, create a *new branch* to make the change - it will be easier to submit a pull request using a new branch in your forked repository! When you submit a Pull Request, make sure you follow the guidelines: * Make sure you're submitting to the proper branch. Branch `maint` is used for the **next** bugfix release. The next enhancement release branch will vary. * ***NEVER*** submit a Pull Request to `master` branch. * Keep commit messages as concise as possible. * Update the appropriate files in regards to your changes: * `CHANGES` * `THANKS` * End all committed files with a newline. * Test your changes and include the results as a comment. nagios-4.3.4/Changelog000066400000000000000000000566161314764422400146410ustar00rootroot00000000000000######################## Nagios Core 4 Change Log ######################## 4.3.4 - 2017-08-24 ------------------ * Improved config file parsing (Mark Felder) * Fixed configure script to check for existence of /run for lock file (in regards to CVE-2017-12847, Bryan Heden) * Use absolute paths when deleting check results files (Emmanuel Dreyfus) * Add sanity checking in reassign_worker (sq5bpf) 4.3.3 - 2017-08-12 ------------------ * xodtemplate.c wrong option-deprecation code warning (alex2grad / John Frickson) * On-demand host check always use cached host state (John Frickson) * 'á' causes Serivce Status Information to not be displayed (John Frickson) * New Macro(s) to generate URL for host / service object (John Frickson) * Fix minor map issues (Troy Lea) * Fix lockfile issues (Bryan Heden) * Switch order of daemon_init and drop_priveleges (CVE-2017-12847, Bryan Heden) * Add an OpenRC init script (Michael Orlitzky) 4.3.2 - 2017-05-09 ------------------ FIXED * Every 15sec /var/log/messages is flooded with "nagios: set_environment_var" (John Frickson) * Changed release date to ISO format (yyyy-mm-dd) (John Frickson) * `make all` fails if unzip is not installed (John Frickson) * Quick Search no longer allows search by Alias (John Frickson) * flexible downtime on a service immediately turns off notifications (John Frickson) * Fix to allow url_encode to be called twice (Z. Liu) * Update timeperiods.cfg.in (spelling) (Parth Laxmikant Kolekar) * Spelling fixes (Josh Soref) * Vent command pipe before remove to avoid deadlocks on writing end (Kai Kunstmann) * CGI utility cgiutil.c does not process relative config file path names properly (John Frickson) * xdata/xodtemplate.c bug in option-deprecation code (John Frickson) * Wildcard searching causes service status links to not work properly (John Frickson) * Quick search with no hits shows a permission denied error (John Frickson) * Setting a service as its own parent is not caught by the sanity checker (-v) and causes a segfault (John Frickson) 4.3.1 - 2017-02-23 ------------------ FIXES * Service hard state generation and host hard or soft down status (John Frickson) * Comments are duplicated through Nagios reload (John Frickson) * host hourly value is incorrectly dumped as json boolean (John Frickson) * Bug - Quick Search no longer allows search by IP (John Frickson) * Config: status_update_interval can not be set to 1 (John Frickson) * Check attempts not increasing if nagios is reloaded (John Frickson) * nagios hangs on reload while sending external command to cmd file (John Frickson) * Feature Request: return code xxx out of bounds - include message as well (John Frickson) 4.3.0 - 2017-02-21 ------------------ SECURITY FIXES * Fix for CVE-2016-6209 - The "corewindow" parameter (as in http://localhost/nagios?corewindow=www.somewhere.com) has been disabled by default. See the UPGRADING document for how to enable it. (John Frickson) FIXES * Fix early event scheduling (pmalek / John Frickson) * on-demand host checks triggered by service checks cause attempt number increments (fredericve) * Service notification not being send when host is in soft down state (John Frickson) * configure does not error if no perl installed on CentOS 7 (John Frickson) * failed passive requests leave .ok files in checkresults dir (caronc) * Services don't show in status.cgi if "noheader" specified (John Frickson) * Standardized check interval config file names (John Frickson) * "Event Log" (showlog.cgi) could not open log file (John Frickson) * "nagios_check_command" has been deprecated since v3.0. Last vestiges removed (John Frickson) ENHANCEMENTS * Added new flag to cgi.cfg: tac_cgi_hard_only to show only HARD states (John Frickson) * Add broker-event for the end of a timed event (NEBTYPE_TIMEDEVENT_END) (John Frickson) * There is no Macro to retrieve addresses of hostgroup members (now $HOSTGROUPMEMBERADDRESSES$) (John Frickson) * Add "Page Tour" videos to several of the core web pages (John Frickson) * Added a login page, and a `Logoff` links (John Frickson) * On the status map, the host name will be colored if services are not all OK. (John Frickson) * Added "Clear flapping state" command on host and services detail pages. (John Frickson) * User-entered comment now displays below generated comment for downtime (John Frickson) 4.2.4 - 2016-12-07 ------------------ SECURITY FIXES * Fixed another root privilege escalation (CVE-2016-9566) Thanks for bringing this to our attention go to Dawid Golunski (http://legalhackers.com). 4.2.3 - 2016-11-21 ------------------- SECURITY FIXES * Fixed a root privilege escalation (CVE-2016-8641) (John Frickson) FIXES * external command during reload doesn't work (John Frickson) * Nagios provides no error condition as to why it fails on the verify for serviceescalation (John Frickson) * No root group in FreeBSD and Apple OS X (John Frickson) * jsonquery.html doesn't display scheduled_time_ok correctly (John Frickson) * daemon_dumps_core=1 has no effect on Linux when Nagios started as root (John Frickson) * Configuration check in hostgroup - misspelled hostname does not error (John Frickson) * contacts or contact_groups directive with no value should not be allowed (John Frickson) * Compile 64-bit on SPARC produces LD error (John Frickson) * HOSTSTATEID returns 0 even if host does not exist (John Frickson) * Submitting UNREACHABLE passive result for host sets it as DOWN if the host has no parents (John Frickson) * nagios: job XX (pid=YY): read() returned error 11 (changed from LOG_ERR to LOG_NOTICE) (John Frickson) * Fix for quick search not showing services if wildcard used (John Frickson) 4.2.2 - 2016-10-24 ------------------ SECURITY FIXES * There was a fix to vulnerability CVE-2008-4796 in the 4.2.0 release on August 1, 2016. The fix was apparently incomplete, as there was still a problem. However, we are now getting all RSS feeds using AJAX calls instead of the (outdated) MagpieRSS package. Thanks for bringing this to our attention go to Dawid Golunski (http://legalhackers.com). ENHANCEMENTS * Update status.c to display passive check icon for hosts when passive checks are enabled and actives disabled (John Frickson) FIXES * Fix permissions for Host Groups reports (status.cgi) (Patrik Halfar) * Service Parents does not appear to be functioning as intended (lev) * Availability report mixes up scheduled and unscheduled warning percentages (Helmut Mikulcik) * Invalid values for saved_stamp in compute_subject_downtime_times() (John Frickson) * Remove deprecated "framespacing" (John Frickson) * The nagios tarball contains two identical jquery copies (John Frickson) * extinfo.cgi does not set content-type (most cgi's don't) (John Frickson) * Timeperiods are corrupted by external command CHANGE_SVC_CHECK_TIMEPERIOD (xoubih) * Quick search doesn't show hosts without services (service status detail page) (John Frickson) * In host/services details view, if exactly 100 entries would not show last one (John Frickson) * nagios host URL parameter for NEW map doesn`t work - Network Map for All Hosts (John Frickson) * next_problem_id is improperly initialized (gherteg) * Passive problems not showing as "unhandled" (John Frickson) * September reported as Sept instead of Sep (Rostislav Opočenský) * Notifications are not sent for active alerts after scheduled downtime ends (John Frickson) * Nagios 4.2.0 not working on Solaris (John Frickson) * install-exfoliation and install-classicui don't work FreeBSD and Mac OS X (John Frickson) * Updated makefile to delete some no-longer-needed files (John Frickson) 4.2.1 - 2016-09-06 ------------------ FIXES * Fix undefined variable php error (John Frickson) * Links on the sidebar menu under 'Problems' are indented too far (John Frickson) * Using $ARGn$ Macros in perfdata (John Frickson) * using a wildcard in search returns service status total all zero's (John Frickson) * read_only does not take priority (deppy) * Running nagios -v on 4.2.0 takes 90+ seconds (John Frickson) * Bare "make" invoked in subtarget (mjo) * Theme images/stylesheets installed with inconsistent permissions (mjo / John Frickson) * Missing Image for Host and Service State Trends in Availability Report (nichokap / John Frickson) * Maintain non-persistent comments through reload (John Frickson) * Servicegroup availability report ignores includesoftstates in service report links (PriceChild) * error: format not a string literal and no format arguments (Karsten Weiss) * Synced config.guess and config.sub with GNU (Zakhar Kleyman) 4.2.0 - 2016-08-01 ------------------ SECURITY FIXES * Fixed vulnerability CVE-2008-4796 (John Frickson) * Fixed vulnerability CVE-2013-4214 (John Frickson) * web interface vulnerable to Cross-Site Request Forgery attacks (John Frickson) ENHANCEMENTS * Increase socket queue length for listen() * Added host name to the website page title (leres / John Frickson) * Added additional icons for NetBSD and SuSE (John Frickson) * The new Status Map will now use cgi.cfg options (John Frickson) default_statusmap_layout will default to "6" for the new map * The new Status Map will now show some valid values in the popup for "Nagios Process" (John Frickson) FIXES * Network outage view without access to all hosts (John Frickson) * Core workers looping (John Frickson) * service query returns duplicate host_name and description fields in the returned data (John Frickson) * HTML output of plug-ins is parsed in wrong way => webgui unusable (John Frickson) * Command worker fails to handle SIGPIPE * "View Status" links under "Map" broken in Nagios Core Version 4.1.1 (John Frickson) * Can't send big buffer - wproc: Core Worker seems to be choked (velripn / John Frickson) * Too big CPU load on FreeBSD and other systems using poll() interface (cejkar) * Flexible downtime recorded as unscheduled downtime (John Frickson) * Service Flexible downtimes produce 1 notification before entering (John Frickson) * Once you "set flap_detection_enabled 0" it should remove flapping state from the host/services page (John Frickson) * New map doesn't finish loading if a logo image is not found (John Frickson) * Extraneous Div end tag in map.html (Scott Wilkerson) * Issue with "Problems" section (John Frickson) * Status Map icons and online/offline status dots disappear in IE11 (John Frickson) * New network map overlays the nagios process with objects (John Frickson) * Added Default-Start and Default-Stop to the init script (John Frickson) * Compile / logging issues with BSD 6 * Related to above, Fixed a lot of incorrectly handled time_t's in *printf's (John Frickson) * New map not working for RU locale (actually, most locales) (John Frickson) * Replaced all instances of signal() with sigaction() + blocking (John Frickson) * UTF-8 characters like german ä are not processed properly by function url_encode (John Frickson) * nagios worker processes can hog CPU (huxley / John Frickson) * custom time periods that include special characters were not being handled in reports (John Frickson) * Fixed init script to wait up to 90 seconds then kill the nagios process (John Frickson) * No Host Groups results in wrong error message (John Frickson) * Setup Nagios users to view specific host is not working in the new network map (John Frickson) * statusjson.cgi fails glibc realloc truncate response output (John Frickson) * Report Time Period does not work if an @ character is in the timeperiod name (John Frickson) * State History does not use actual plugin long_output (John Frickson) * Time period corruption (xoubih) * Tactical Overview - Disabled Flap Detection Link (John Frickson) 4.1.1 - 08/19/2015 ------------------ FIXES * CGI Could not read object configuration data (broken by error in 4.1.0) * exclude (!) not working (broken by mis-applied fix for 4.1.0) 4.1.0 - 08/18/2015 ------------------ ENHANCEMENTS * Promoted JSON CGIs to released status (Eric Stanley) * New graphical CGI displays: statusmap, trends, histogram (Eric Stanley) * Make sticky status for acks and comments configurable enhancement #20 (Trevor McDonald / Scott Wilkerson) * Add host_down_disable_service_checks directive to nagios.cfg #44 (Trevor McDonald / Scott Wilkerson) * httpd.conf doesn't support Apache versions > 2.3 (DanielB / John Frickson) FIXES * Fix for not all service dependencies created (John Frickson) * Fix SIGSEGV with empty custom variable (orbis / John Frickson) * Fix contact macros in environment variables (dvoryanchikov) * Fixed host's current attempt goes to 1 after going to hard state (John Frickson) * Fixed two bugs/problems: Replace use of %zd in base/utils.c & incorrect va_start() in cgi/jsonutils.c (Peter Eriksson) * Fixed: Let remove_specialized actually remove all workers (Phil Mayers) * Fixed log file spam caused when using perfdata command directives in nagios.cfg (shashikanthbussa) * Fixed off-by-one error in bounds check leads to segfault (Phil Mayers) * Added links for legacy graphical displays (Eric Stanley) * Update embedded URL's to https versions of Nagios websites (scottwilkerson) * Fixed doxygen comments to work with latest doxygen 1.8.9.1 #30 (Trevor McDonald) * Fixed makefile target "html" to PHONY to fix GitHub issue #28 (Trevor McDonald) * Fixed typo as per GitHub issue #27 (Trevor McDonald) * Fixed jsonquery.php 404 not found error, and disabled Send Query button until form populates #43 (Scott Wilkerson) * Fixed linking in Tactical Overview for several of the Host entries in Featured section #48 (Scott Wilkerson) * Fixed passing limit and sort options to pagination and sort links #42 (Scott Wilkerson) * Added form field for icon URL and clean-up when it changes in CGI Status Map. (Eric Stanley) * Added options to cgi.cfg to uncheck sticky and send when acknowledging a problem (Trevor McDonald) * Low impact changes to automate the generation of RPMs from nagios.spec file. (T.J. Yang) * Update index.php (Trevor McDonald) * Fixed escaping of corewindow parameter to account for possible XSS injection (Scott Wilkerson) * Typo correction (T.J. Yang) * Make getCoreStatus respect cgi_base_url (Moritz Schlarb) * Adjusted map layout to work within frames (Eric Stanley) * Fixed map displays are now the full size of browser window (Eric Stanley) * Fixed labels and icons on circular markup no longer scale on zoom (Eric Stanley) * Got all maps except circular markup working with icons (Eric Stanley) * Fixes to make legacy CGIs work again. (Eric Stanley) * Fixes to make all/html target tolerant of being run multiple times (Eric Stanley) * For user-supplied maps, converted node group to have transform (Eric Stanley) * Fixed issue transitioning from circular markup map to other maps (Eric Stanley) * Fix displayForm to trigger on the button press (Scott Wilkerson) * Fix fo getBBox crash on Firefox (Eric Stanley) * Fixed map now resets zoom when form apply()'d (Eric Stanley) * Fixed so close box on dialogs actually closes dialog (Eric Stanley) * Corrected directive in trends display (Eric Stanley) * Fixed minor issue with link in trends links (Eric Stanley) * Fixed issue with map displaying on Firefox (Eric Stanley) * Added exclusions for ctags generation (Eric Stanley) * Update map-popup.html (Scott Wilkerson) * Initial commit of new graphical CGIs (Eric Stanley) * Fixed Github bug #18 - archivejson.cgi returns wrong host for state change query (Eric Stanley) * Status JSON: Added next_check to service details (Eric Stanley) * Fixed escaping of keys for scalar values in JSON CGIs (Eric Stanley) * build: Include if it exists. (Eric J. Mislivec) * lib-tests: test-io{cache|broker} need -lsocket to link. (Eric J. Mislivec) * lib-tests: test-runcmd assumes GNU echo. (Eric J. Mislivec) * lib-tests: Signal handlers don't return int on most platforms, and using a cast was the wrong way to resolve this. (Eric J. Mislivec) * Fix some type/format mismatch warnings for pid_t. (Eric J. Mislivec) * Fix build on Solaris. (Eric J. Mislivec) * runcmd: Fix build when we don't HAVE_SETENV. (Eric J. Mislivec) * Fixed checkresult output processing (Eric Mislivec) * Corrected escaping of long output macros (Eric Mislivec) * Fixed null pointer dereferences in archive JSON (Eric Stanley) * Fixed memory overwrite issue in JSON string escaping (Eric Stanley) * JSON CGI: Now escaping object and array keys (Eric Stanley) KNOWN ISSUES * New map does not account for multiple parents, leaving "legacy" map as an option in the menu 4.0.8 - 08/12/2014 ------------------ ENHANCEMENTS * Removed 8 kB string size limitation in JSON CGIs (Eric Stanley) * Re-implemented auto-rescheduling of checks (Eric Mislivec) * Avoid bunching of checks delayed due to timeperiod constraints (Eric Stanley) * Limit the number of autocalculated core workers to not spawn too many on large systems (Eric Mislivec, Janice Singh) FIXES * Removed quotes from numeric duration values in JSON CGIs (Eric Stanley) * Fixed escaping in JSON CGIs so all required characters are escaped, and in the correct order (Eric Stanley) * Fixed segfault in archive JSON CGI when plugin output was empty (Eric Stanley) * Fixed several possibilities for buffer overflow (Eric Mislivec, Dirkjan Bussink) * Fixed Tracker #582, #626: Handle VAR=VAL assignments at the start of simple commands (Eric Mislivec, Phil Randal) * Fixed Tracker #630: Recognize '<' and '>' as redirection operators (Eric Mislivec) * Corrected worker communication protocol documentation (Phil Mayers) * Fixed init script to leave config test log in a better location, let sysconfig override init script variables, and not remove nagios.cmd when attempting to start with another instance running (Eric Mislivec, Robin Kearney) * Fixed Tracker #361: Downtime notifications not displayed properly (Andrew Widdersheim) 4.0.7 - 06/03/2014 ------------------ ENHANCEMENTS * Added value of custom variables to Object JSON output for hosts, services and contacts (Eric Stanley) FIXES * Fixed bug #616: Unescape plugin output read from checkresult files, fix multiline perf data concatenation, and avoid extra memory allocation and copies. (Eric Mislivec) * Fixed bug #609: Image on home page doesn't have correct image path prefix. (Derek Brewer) * Fixed bug #608: Extra newline in service check timeout output string. (Mauno Pihelgas) * Fixed bug #596: Crashes checking contact authorization for host escalations. (Alexey Dvoryanchikov - duplicates #590, #586) * Fixed bug #496: Syntax error in exfoliation's common.css. (Karsten Weiss) 4.0.6 - 04/29/2014 ------------------ ENHANCEMENTS * Added name of authenticated user to JSON CGI results object (Eric Stanley) * Added Nagios Core version to the Status JSON CGI programstatus query (Eric Stanley) * Added daemon status to main page (Eric Mislivec) FIXES * Fixed bug #600: Service Check Timeout State always returns OK (0) status (Mauno Pihelgas, Eric Stanley) * Fixed bug #583: Status Check Output of (No output on stdout) stderr: (Eric Stanley - duplicate of bug #573) * Fixed bug #573: Service checks returns (No output on stdout) stderr (Eric Stanley) * Fixed bug #438: Reloads during downtime causes wrong availability calculations (Eric Stanley) * Fixed feed updates when daemon can not access external networks (Eric Mislivec) * Archive JSON: Fixed bugs calculating availability (Eric Stanley) * Archive JSON: Allow missing logs to be skipped (Eric Stanley) 4.0.5 - 04/11/2014 ------------------ * Fixed bug #595: Nagios 4 security fix (Alexey Dvoryanchikov, Eric Stanley) * Fixed bug #594: Nagios 4 fix contactgroups parsing (Alexey Dvoryanchikov, Eric Stanley) * Fixed bug #577: Nagios 4 checks stalled when write to socket failed (Alexey Dvoryanchikov) * Fixed bug #580: Nagios 4 memory leak (Eric Stanley) * Fixed init script to remove the switching of users when performing configuration verification which was causing failures if nagios user was set to nologin (Scott Wilkerson) * Fixed auto creation of RAMDISK via environment variables in init script to properly check existence using $RAMDISK_DIR environment variable. (Scott Wilkerson) * Fixed unreferenced variable NagiosVarDir in daemon-init (Eric Mislivec) * Fixed bug where audio alerts wouldn't work with a 0 height and width - https://support.nagios.com/forum/viewtopic.php?t=26387 (Scott Wilkerson) 4.0.4 - 03/14/2014 ------------------ ENHANCEMENTS * JSON CGIs moved to beta status (Eric Stanley) FIXES * Fixed bug #491,#553: Rebuilt the daemon-init scripts back to something that should work on all systems (Scott Wilkerson) 4.0.3 - 02/28/2014 ------------------ ENHANCEMENTS * Aliased hourly_value to importance and minimum_value to minimum_importance and deprecated the former (Eric Stanley) * Added host and service importance macros (Eric Stanley) * Added notifications on flexible downtime expiration (Dan Wittenberg) FIXES * Bug #548: Temporary fix that rejects all external command during restart to prevent Core from crashing (Eric Stanley) * Corrected calculation of host importance and importance defaults (Eric Stanley) * Fixed bug #498: Nagios 4 enable_environment_macros=1 not working (Eric Stanley, Alexey Dvoryanchikov) * No longer checks whether logs can be written when verifying configuration (Eric Stanley) * Fixed CGI bug where the CGI could read past the end of the list of CGI variables, potentially crashing the CGI (Scott Wilkerson) * Fixed inheritance of hourly_value from host and service templates (Scott Wilkerson) * Fixed bug #502: 4.0.0: Configuration -> Service Escalations = incomplete list (Eric Stanley) * Fixed bug #523: quotes and double quotes in plugin message are converted to HTML escapes in Nagios 4.0 (duplicate of bug #524) * Fixed bug #524: URLs returned in plugin check results are not correctly displayed (Eric Stanley) * Fixed bug where passive service checks would return "Service check timed out after 0.00 seconds" (Scott Wilkerson) 4.0.2 - 11/25/2013 ------------------ FIXES * Fixed bug 528: Nagios 4.0.1: Logrotation: Only current host- and servicestates saved in rotated logfiles (duplicate of 507) * Fixed bug 507: Nagios 4.0.0 - Problem during log rotate (Stefano Ghelfi) * Fixed bug 530: RPM spec file sets wrong permissions on plugins directory (duplicate of bug 494) * Fixed bug 494: nagios.spec fixes (with patch) (Karsten Weiss) * Fixed bug 515: Segsegv after starting up nagios (duplicate of bug 526) * Fixed bug 513: Crash while entering downtime for service (duplicate of bug 526) * Fixed bug 529: Core Worker failed to reap child in 4.0.1 Description * Fixed bug 514: scheduled downtime not showing in web interface (Eric Stanley) * Fixed bug 526: sort_downtime() corrupts scheduled_downtime_list causing segfault (Adam James) * Fixed bug 492: Nagios 4 fails to remove/add checks upon reload (Eric Stanley) * Fixed Bug 484: Beta4.0.0b4 service checks returning (No output on stdout) (Eric Stanley) * Fixed Bug 470: statusmap doesn't display info (Cameron Moore) * Fixed Bug 499: Security issue in daemon-init.in, function check_config (Tómas Edwardsson) 4.0.1 - 10/15/2013 ------------------ ENHANCEMENTS * Added compiler flags in RPM spec file to reduce compiler noise (Dan Wittenberg) * Added logging of failure in dlclose() call (Anton Lofgren) * Added a simple query handler interface, nagios-qh.rb (Dan Wittenberg) * Multiple code simplifications, additional error handling in downtime code (Andreas Ericsson) FIXES * Reverted commit f99a9a7b which set check_interval to 1 if it was configured as zero. * Corrected order of arguments when logging unknown hosts/services (Scott Wilkerson) * Downtime initialized before retention data read (Eric Stanley) * Patches to make RPM build again (Dan Wittenberg) * Ensure that scheduled_downtime_depth never drops below zero (Andreas Ericsson) 4.0.0 - 09/20/2013 ------------------ See http://nagios.sourceforge.net/docs/nagioscore/4/en/whatsnew.html for a list of the changes in Nagios Core 4 nagios-4.3.4/INSTALLING000066400000000000000000000006461314764422400144060ustar00rootroot00000000000000Nagios Installation Instructions -------------------------------- A quickstart installation guide can now be found in the HTML documentation. You can find the quickstart guide (quickstart.html) in the following subdirectory: html/docs/ The quickstart covers all the basic steps you need to follow to install Nagios, the Nagios plugins, and start out monitoring the machine that Nagios is installed on. Good luck! nagios-4.3.4/LEGAL000066400000000000000000000015111314764422400135560ustar00rootroot00000000000000Copyright(c) 1999-2009: Ethan Galstad Copyright(c) 2009 until further notice: Nagios Core Development Team and Nagios Community Contributors For detailed authorship information, refer to the source control management history and pay particular attention to commit messages and the THANKS file. All source code, binaries, documentation, information, and other files contained in this distribution are provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE WARRANTY OF DESIGN, MERCHANTABILITY, AND FITNESS FOR A PARTICULAR PURPOSE. Nagios and the Nagios logo are trademarks, servicemarks, registered trademarks or registered servicemarks owned by Nagios Enterprises, LLC. All other trademarks, servicemarks, registered trademarks, and registered servicemarks are the property of their respective owner(s). nagios-4.3.4/LICENSE000066400000000000000000000431221314764422400140200ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 19yy This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19yy name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. nagios-4.3.4/Makefile.in000066400000000000000000000341751314764422400150700ustar00rootroot00000000000000############################### # Makefile for Nagios # ############################### # Source code directories SRC_BASE=@srcdir@/base SRC_LIB=@srcdir@/lib SRC_CGI=@srcdir@/cgi SRC_HTM=@srcdir@/html SRC_MODULE=@srcdir@/module SRC_INCLUDE=@srcdir@/include SRC_COMMON=@srcdir@/common SRC_XDATA=@srcdir@/xdata SRC_CONTRIB=@srcdir@/contrib SRC_TTAP=@srcdir@/t-tap SRC_WORKERS=@srcdir@/worker CC=@CC@ CFLAGS=@CFLAGS@ @DEFS@ LDFLAGS=@LDFLAGS@ @LIBS@ prefix=@prefix@ exec_prefix=@exec_prefix@ LOGDIR=@localstatedir@ CHECKRESULTDIR=@CHECKRESULTDIR@ CFGDIR=@sysconfdir@ BINDIR=@bindir@ CGIDIR=@sbindir@ LIBEXECDIR=@libexecdir@ LIBDIR=@libdir@ INCLUDEDIR=@includedir@/nagios HTMLDIR=@datadir@ datarootdir=@datarootdir@ LN_S=@LN_S@ INSTALL=@INSTALL@ INSTALL_OPTS=@INSTALL_OPTS@ COMMAND_OPTS=@COMMAND_OPTS@ HTTPD_CONF=@HTTPD_CONF@ LN_HTTPD_SITES_ENABLED=@LN_HTTPD_SITES_ENABLED@ INIT_DIR=@init_dir@ INIT_OPTS=@INIT_OPTS@ CGICFGDIR=$(CGIDIR) USE_EVENTBROKER=@USE_EVENTBROKER@ USE_LIBTAP=@USE_LIBTAP@ CGIEXTRAS=@CGIEXTRAS@ CP=@CP@ @SET_MAKE@ none: @echo "Please supply a command line argument (i.e. 'make all'). Other targets are:" @echo " nagios cgis contrib modules workers" @echo " clean" @echo " install install-base install-cgis install-html install-exfoliation install-config install-init install-commandmode fullinstall" # @echo " uninstall" # FreeBSD make does not support -C option, so we'll use the Apache style... (patch by Stanley Hopcroft 12/27/1999) pretty: indent indent: @sh indent-all.sh ctags: ctags -R --exclude=html/angularjs --exclude=html/d3 --exclude=t-tap all: cd $(SRC_BASE) && $(MAKE) cd $(SRC_CGI) && $(MAKE) cd $(SRC_HTM) && $(MAKE) if [ x$(USE_EVENTBROKER) = xyes ]; then \ cd $(SRC_MODULE) && $(MAKE); \ fi cd $(SRC_WORKERS) && $(MAKE) $@ @echo "" @echo "*** Compile finished ***" @echo "" @echo "If the main program and CGIs compiled without any errors, you" @echo "can continue with installing Nagios as follows (type 'make'" @echo "without any arguments for a list of all possible options):" @echo "" @echo " make install" @echo " - This installs the main program, CGIs, and HTML files" @echo "" @echo " make install-init" @echo " - This installs the init script in $(DESTDIR)$(INIT_DIR)" @echo "" @echo " make install-commandmode" @echo " - This installs and configures permissions on the" @echo " directory for holding the external command file" @echo "" @echo " make install-config" @echo " - This installs *SAMPLE* config files in $(DESTDIR)$(CFGDIR)" @echo " You'll have to modify these sample files before you can" @echo " use Nagios. Read the HTML documentation for more info" @echo " on doing this. Pay particular attention to the docs on" @echo " object configuration files, as they determine what/how" @echo " things get monitored!" @echo "" @echo " make install-webconf" @echo " - This installs the Apache config file for the Nagios" @echo " web interface" @echo "" @echo " make install-exfoliation" @echo " - This installs the Exfoliation theme for the Nagios" @echo " web interface" @echo "" @echo " make install-classicui" @echo " - This installs the classic theme for the Nagios" @echo " web interface" @echo "" @echo "" @echo "*** Support Notes *******************************************" @echo "" @echo "If you have questions about configuring or running Nagios," @echo "please make sure that you:" @echo "" @echo " - Look at the sample config files" @echo " - Read the documentation on the Nagios Library at:" @echo " https://library.nagios.com" @echo "" @echo "before you post a question to one of the mailing lists." @echo "Also make sure to include pertinent information that could" @echo "help others help you. This might include:" @echo "" @echo " - What version of Nagios you are using" @echo " - What version of the plugins you are using" @echo " - Relevant snippets from your config files" @echo " - Relevant error messages from the Nagios log file" @echo "" @echo "For more information on obtaining support for Nagios, visit:" @echo "" @echo " https://support.nagios.com" @echo "" @echo "*************************************************************" @echo "" @echo "Enjoy." @echo "" $(SRC_LIB)/libnagios.a: cd $(SRC_LIB) && $(MAKE) nagios: cd $(SRC_BASE) && $(MAKE) config: @echo "Sample config files are automatically generated once you run the" @echo "configure script. You can install the sample config files on your" @echo "system by using the 'make install-config' command." cgis: cd $(SRC_CGI) && $(MAKE) html: cd $(SRC_HTM) && $(MAKE) contrib: cd $(SRC_CONTRIB) && $(MAKE) modules: cd $(SRC_MODULE) && $(MAKE) workers: cd $(SRC_WORKERS) && $(MAKE) all clean: cd $(SRC_LIB) && $(MAKE) $@ cd $(SRC_BASE) && $(MAKE) $@ cd $(SRC_CGI) && $(MAKE) $@ cd $(SRC_COMMON) && $(MAKE) $@ cd $(SRC_XDATA) && $(MAKE) $@ cd $(SRC_HTM) && $(MAKE) $@ cd $(SRC_INCLUDE) && $(MAKE) $@ cd $(SRC_CONTRIB) && $(MAKE) $@ cd $(SRC_MODULE) && $(MAKE) $@ cd $(SRC_TTAP) && $(MAKE) $@ cd $(SRC_WORKERS) && $(MAKE) $@ rm -f *.cfg core rm -f *~ *.*~ */*~ */*.*~ */*/*.*~ distclean: clean cd $(SRC_LIB) && $(MAKE) $@ cd $(SRC_BASE) && $(MAKE) $@ cd $(SRC_CGI) && $(MAKE) $@ cd $(SRC_COMMON) && $(MAKE) $@ cd $(SRC_XDATA) && $(MAKE) $@ cd $(SRC_HTM) && $(MAKE) $@ cd $(SRC_INCLUDE) && $(MAKE) $@ cd $(SRC_CONTRIB) && $(MAKE) $@ cd $(SRC_MODULE) && $(MAKE) $@ cd $(SRC_TTAP) && $(MAKE) $@ cd $(SRC_WORKERS) && $(MAKE) $@ rm -f sample-config/*.cfg sample-config/*.conf sample-config/template-object/*.cfg rm -f daemon-init openrc-init pkginfo rm -f Makefile subst rm -f config.log config.status config.cache rm -f tags devclean: distclean test: nagios cgis cd $(SRC_LIB) && $(MAKE) test $(MAKE) test-perl $(MAKE) test-tap test-tap: tap/src/tap.o nagios cgis @if [ x$(USE_LIBTAP) = xyes ]; then \ cd $(SRC_TTAP) && $(MAKE) test; \ else \ echo "NOTE: You must run configure with --enable-libtap to run the C tap tests"; \ fi tap/src/tap.o: cd tap && $(MAKE) test-perl: cgis cd t && $(MAKE) test install-html: cd $(SRC_HTM) && $(MAKE) install $(MAKE) install-exfoliation install-base: cd $(SRC_BASE) && $(MAKE) install install-cgis: cd $(SRC_CGI) && $(MAKE) install install: cd $(SRC_BASE) && $(MAKE) $@ cd $(SRC_CGI) && $(MAKE) $@ cd $(SRC_HTM) && $(MAKE) $@ $(MAKE) install-exfoliation $(MAKE) install-basic install-unstripped: cd $(SRC_BASE) && $(MAKE) $@ cd $(SRC_CGI) && $(MAKE) $@ cd $(SRC_HTM) && $(MAKE) $@ $(MAKE) install-exfoliation $(MAKE) install-basic install-basic: $(INSTALL) -m 775 $(INSTALL_OPTS) -d $(DESTDIR)$(LIBEXECDIR) $(INSTALL) -m 775 $(INSTALL_OPTS) -d $(DESTDIR)$(LOGDIR) $(INSTALL) -m 775 $(INSTALL_OPTS) -d $(DESTDIR)$(LOGDIR)/archives $(INSTALL) -m 775 $(COMMAND_OPTS) -d $(DESTDIR)$(CHECKRESULTDIR) chmod g+s $(DESTDIR)$(CHECKRESULTDIR) @echo "" @echo "*** Main program, CGIs and HTML files installed ***" @echo "" @echo "You can continue with installing Nagios as follows (type 'make'" @echo "without any arguments for a list of all possible options):" @echo "" @echo " make install-init" @echo " - This installs the init script in $(DESTDIR)$(INIT_DIR)" @echo "" @echo " make install-commandmode" @echo " - This installs and configures permissions on the" @echo " directory for holding the external command file" @echo "" @echo " make install-config" @echo " - This installs sample config files in $(DESTDIR)$(CFGDIR)" @echo "" install-config: $(INSTALL) -m 775 $(INSTALL_OPTS) -d $(DESTDIR)$(CFGDIR) $(INSTALL) -m 775 $(INSTALL_OPTS) -d $(DESTDIR)$(CFGDIR)/objects $(INSTALL) -b -m 664 $(INSTALL_OPTS) sample-config/nagios.cfg $(DESTDIR)$(CFGDIR)/nagios.cfg $(INSTALL) -b -m 664 $(INSTALL_OPTS) sample-config/cgi.cfg $(DESTDIR)$(CFGDIR)/cgi.cfg $(INSTALL) -b -m 660 $(INSTALL_OPTS) sample-config/resource.cfg $(DESTDIR)$(CFGDIR)/resource.cfg $(INSTALL) -b -m 664 $(INSTALL_OPTS) sample-config/template-object/templates.cfg $(DESTDIR)$(CFGDIR)/objects/templates.cfg $(INSTALL) -b -m 664 $(INSTALL_OPTS) sample-config/template-object/commands.cfg $(DESTDIR)$(CFGDIR)/objects/commands.cfg $(INSTALL) -b -m 664 $(INSTALL_OPTS) sample-config/template-object/contacts.cfg $(DESTDIR)$(CFGDIR)/objects/contacts.cfg $(INSTALL) -b -m 664 $(INSTALL_OPTS) sample-config/template-object/timeperiods.cfg $(DESTDIR)$(CFGDIR)/objects/timeperiods.cfg $(INSTALL) -b -m 664 $(INSTALL_OPTS) sample-config/template-object/localhost.cfg $(DESTDIR)$(CFGDIR)/objects/localhost.cfg $(INSTALL) -b -m 664 $(INSTALL_OPTS) sample-config/template-object/windows.cfg $(DESTDIR)$(CFGDIR)/objects/windows.cfg $(INSTALL) -b -m 664 $(INSTALL_OPTS) sample-config/template-object/printer.cfg $(DESTDIR)$(CFGDIR)/objects/printer.cfg $(INSTALL) -b -m 664 $(INSTALL_OPTS) sample-config/template-object/switch.cfg $(DESTDIR)$(CFGDIR)/objects/switch.cfg @echo "" @echo "*** Config files installed ***" @echo "" @echo "Remember, these are *SAMPLE* config files. You'll need to read" @echo "the documentation for more information on how to actually define" @echo "services, hosts, etc. to fit your particular needs." @echo "" install-webconf: $(INSTALL) -m 644 sample-config/httpd.conf $(DESTDIR)$(HTTPD_CONF)/nagios.conf if [ $(LN_HTTPD_SITES_ENABLED) -eq 1 ]; then \ $(LN_S) $(DESTDIR)$(HTTPD_CONF)/nagios.conf $(DESTDIR)/etc/apache2/sites-enabled/nagios.conf; \ fi @echo "" @echo "*** Nagios/Apache conf file installed ***" @echo "" install-exfoliation: @cd contrib/exfoliation; \ $(INSTALL) $(INSTALL_OPTS) -d $(DESTDIR)$(HTMLDIR)/stylesheets; \ for file in $$(find ./stylesheets/ -type f); do \ $(INSTALL) -m 644 $(INSTALL_OPTS) $${file} $(DESTDIR)$(HTMLDIR)/$${file}; \ done; \ $(INSTALL) $(INSTALL_OPTS) -d $(DESTDIR)$(HTMLDIR)/images; \ for file in $$(find ./images -type f); do \ $(INSTALL) -m 644 $(INSTALL_OPTS) $${file} $(DESTDIR)$(HTMLDIR)/$${file}; \ done; \ cd ../.. @echo "" @echo "*** Exfoliation theme installed ***" @echo "NOTE: Use 'make install-classicui' to revert to classic Nagios theme"; @echo "" install-classicui: @cd html; \ $(INSTALL) $(INSTALL_OPTS) -d $(DESTDIR)$(HTMLDIR)/stylesheets; \ for file in $$(find ./stylesheets/ -type f); do \ $(INSTALL) -m 644 $(INSTALL_OPTS) $${file} $(DESTDIR)$(HTMLDIR)/$${file}; \ done; \ $(INSTALL) $(INSTALL_OPTS) -d $(DESTDIR)$(HTMLDIR)/images; \ for file in $$(find ./images -type f); do \ $(INSTALL) -m 644 $(INSTALL_OPTS) $${file} $(DESTDIR)$(HTMLDIR)/$${file}; \ done; \ cd .. @echo "" @echo "*** Classic theme installed ***" @echo "NOTE: Use 'make install-exfoliation' to use new Nagios theme"; @echo "" install-init: install-daemoninit install-daemoninit: $(INSTALL) -m 755 -d $(INIT_OPTS) $(DESTDIR)$(INIT_DIR) $(INSTALL) -m 755 $(INIT_OPTS) daemon-init $(DESTDIR)$(INIT_DIR)/nagios @echo "" @echo "*** Init script installed ***" @echo "" install-commandmode: $(INSTALL) -m 775 $(COMMAND_OPTS) -d $(DESTDIR)$(LOGDIR)/rw chmod g+s $(DESTDIR)$(LOGDIR)/rw @echo "" @echo "*** External command directory configured ***" @echo "" install-devel: install-headers install-lib install-headers: $(INSTALL) -d -m 755 $(DESTDIR)$(INCLUDEDIR) $(INSTALL) -d -m 755 $(DESTDIR)$(INCLUDEDIR)/lib $(INSTALL) -m 644 include/*.h $(DESTDIR)$(INCLUDEDIR) $(INSTALL) -m 644 lib/*.h $(DESTDIR)$(INCLUDEDIR)/lib rm -f $(DESTDIR)$(INCLUDEDIR)/config*.h install-lib: $(SRC_LIB)/libnagios.a $(INSTALL) -d -m 755 $(DESTDIR)$(LIBDIR) $(INSTALL) -m 644 $(SRC_LIB)/libnagios.a $(DESTDIR)$(LIBDIR) dox: @rm -rf Documentation doxygen doxy.conf fullinstall: install install-init install-commandmode install-webconf install-devel # Uninstall is too destructive if base install directory is /usr, etc. #uninstall: # rm -rf $(DESTDIR)$(BINDIR)/nagios $(DESTDIR)$(CGIDIR)/*.cgi $(DESTDIR)$(CFGDIR)/*.cfg $(DESTDIR)$(HTMLDIR) # # Targets for creating packages on various architectures # # Solaris pkgmk PACKDIR=@PACKDIR@ VERSION=@VERSION@ Prototype: if [ ! -d $(PACKDIR) ] ; then mkdir $(PACKDIR); fi if [ ! -d $(PACKDIR)/etc ] ; then mkdir $(PACKDIR)/etc; fi if [ ! -d $(PACKDIR)/etc/init.d ] ; then mkdir $(PACKDIR)/etc/init.d; fi if [ ! -d $(PACKDIR)/etc/nagios ] ; then mkdir $(PACKDIR)/etc/nagios; fi $(MAKE) all $(MAKE) DESTDIR=$(PACKDIR) INIT_OPTS='' INSTALL_OPTS='' COMMAND_OPTS='' nagios_grp='' nagios_usr='' fullinstall $(INSTALL) -m 644 sample-config/nagios.cfg $(PACKDIR)$(CFGDIR)/nagios.cfg.$(VERSION) $(INSTALL) -m 644 sample-config/cgi.cfg $(PACKDIR)$(CFGDIR)/cgi.cfg.$(VERSION) $(INSTALL) -m 640 sample-config/resource.cfg $(PACKDIR)$(CFGDIR)/resource.cfg.$(VERSION) $(INSTALL) -m 664 sample-config/template-object/bigger.cfg $(PACKDIR)$(CFGDIR)/bigger.cfg.$(VERSION) $(INSTALL) -m 664 sample-config/template-object/minimal.cfg $(PACKDIR)$(CFGDIR)/minimal.cfg.$(VERSION) $(INSTALL) -m 664 sample-config/template-object/checkcommands.cfg $(PACKDIR)$(CFGDIR)/checkcommands.cfg.$(VERSION) $(INSTALL) -m 664 sample-config/template-object/misccommands.cfg $(PACKDIR)$(CFGDIR)/misccommands.cfg.$(VERSION) cd contrib; $(MAKE) all; $(MAKE) DESTDIR=$(PACKDIR) INIT_OPTS='' INSTALL_OPTS='' COMMAND_OPTS='' nagios_grp='' nagios_usr='' install echo i pkginfo> Prototype if [ -f checkinstall ] ; then echo i checkinstall>> Prototype; fi if [ -f preinstall ] ; then echo i preinstall>> Prototype; fi if [ -f postinstall ] ; then echo i postinstall>> Prototype; fi pkgproto $(PACKDIR)=/ | sed -e "s|$(LOGNAME) $(GROUP)$$|root root|" | egrep -v "(s|d) none (/|/etc|/var|/usr|/usr/local) " >> Prototype pkg/nagios/pkgmap: Prototype mkdir $(PACKDIR)/nagios pkgmk -o -r / -f Prototype -d $(PACKDIR) nagios nagios.SPARC.pkg.tar.gz: pkg/nagios/pkgmap cd $(PACKDIR) && tar -cf - nagios | gzip -9 -c > ../nagios.SPARC.pkg.tar.gz pkgset: nagios.SPARC.pkg.tar.gz pkgclean: rm -rf pkg Prototype nagios.SPARC.pkg.tar.gz dist: distclean rm -f nagios-$(VERSION) ln -s . nagios-$(VERSION) tar zhcf nagios-$(VERSION).tar.gz --exclude nagios-$(VERSION)/nagios-$(VERSION).tar.gz --exclude nagios-$(VERSION)/nagios-$(VERSION) --exclude RCS --exclude CVS --exclude build-* --exclude *~ --exclude .git* nagios-$(VERSION)/ rm -f nagios-$(VERSION) # Targets that always get built .PHONY: indent clean clean distclean dox test html nagios-4.3.4/README000066400000000000000000000000171314764422400136670ustar00rootroot00000000000000README.asciidocnagios-4.3.4/README.asciidoc000066400000000000000000000061251314764422400154520ustar00rootroot00000000000000Nagios 4.x README ================= Nagios is a host/service/network monitoring program written in C and released under the GNU General Public License, version 2. CGI programs are included to allow you to view the current status, history, etc via a web interface if you so desire. Visit the Nagios homepage at https://www.nagios.org for documentation, new releases, bug reports, information on discussion forums, and more. https://www.nagios.org/about/features/[Features] ----------------------------------------------- * Monitoring of network services (via SMTP, POP3, HTTP, PING, etc). * Monitoring of host resources (processor load, disk usage, etc.). * A plugin interface to allow for user-developed service monitoring methods. * Ability to define network host hierarchy using "parent" hosts, allowing detection of and distinction between hosts that are down and those that are unreachable. * Notifications when problems occur and get resolved (via email, pager, or user-defined method). * Ability to define event handlers for proactive problem resolution. * Automatic log file rotation/archiving. * Optional web interface for viewing current network status, notification and problem history, log file, etc. Changes ------- See the https://raw.githubusercontent.com/NagiosEnterprises/nagioscore/master/Changelog[Changelog] for a summary of important changes and fixes, or the https://github.com/NagiosEnterprises/nagioscore/commits/master[commit history] for more detail. Download -------- Latest releases can be downloaded from https://www.nagios.org/download/ Installation ------------ http://nagios.sourceforge.net/docs/nagioscore/4/en/quickstart.html[Quickstart installation guides] are available to help you get Nagios up and monitoring. Documentation & Support ----------------------- * http://nagios.sourceforge.net/docs/nagioscore/4/en/[User Guide] * https://library.nagios.com/library/products/nagioscore/[Nagios Core Documentation Library] * https://support.nagios.com/forum/viewforum.php?f=7[Support Forums] * https://www.nagios.org/support/[Additional Support Resources] Contributing ------------ The Nagios source code is hosted on GitHub: https://github.com/NagiosEnterprises/nagioscore Do you have an idea or feature request to make Nagios better? Join or start a discussion on the https://support.nagios.com/forum/viewforum.php?f=34[Nagios Core Development forum]. Bugs can be reported by https://github.com/NagiosEnterprises/nagioscore/issues/new[opening an issue on GitHub]. If you have identified a security related issue in Nagios, please contact security@nagios.com. Patches and GitHub pull requests are welcome. Pull requests on GitHub link commits in version control to review and discussion of the changes, helping to show how and why changes were made, in addition to who was involved. Created by Ethan Galstad, the success of Nagios has been due to the fantastic community members that support it and provide bug reports, patches, and great ideas. See the https://raw.githubusercontent.com/NagiosEnterprises/nagioscore/master/THANKS[THANKS file] for some of the many who have contributed since 1999. nagios-4.3.4/THANKS000066400000000000000000000130221314764422400137220ustar00rootroot00000000000000======= THANKS! ======= The success of Nagios has been due to the fantastic community members that support it and provide bug reports, patches, and great ideas. Here are a few of the many members that have contributed to Nagios in various ways since 1999. If I missed your name, misspelled it or otherwise got it wrong, please let me know. * Adam Bowen * Ahmon Dancy * Alain Radix * Albrecht Dress * Alessandro Ren * Alex Peeters * Alexios Chouhoulas * Allan Clark * Alok Dubey * Aman Gupta * Amir Rosenblatt * Anders K. Lindgren * Andreas Ericsson * Andreas Kirchwitz * Andrew Kaplan * Andrew Widdersheim * Andy Finkenstadt * Andy Shellam * Anton Lofgren * Ari Edelkind * Armin Wolfermann * Arne Hinrichsen * Badri Pillai * Bastian Friedrich * Ben Bell * Ben Heavner * Bernard Li * Bernd Arnold * Bill Pier * Bo Kersey * Bob (Netshell) * Bob Rentschler * Bogdan Sandu * Brad Werschler * Brandon Knitter * Brian Riggs * Brian Seklecki * Burkhard Klaus * Carlos Velasco * Cary Petterborg * Charlie Cook * Chris Bensend * Chris Kolquist * Chris Rothecker * Chris Witterholt * Christian Masopust * Christian Mies * Christoph Biedl * Christoph Kron * Christoph Maser * Cliff Woolley * Dan Gailey * Daniel Burke * Daniel Koffler * Daniel Pouzzner * Daniel Wittenberg * Darren Gamble * Dave Viner * David Allan * David Kmoch * David Schlecht * David Tilloy * David Walser * Dawid Golunski * Dean Lane * Denis Seleznyov * Dennis Biringer * Derrick Bennett * Devin Bayer * Dietmar Rieder * Dirkjan Bussink * Don Carroll * Duncan Ferguson * Eirik Robertstad * Emanuel Massano * Ernst-Deiter Martin * Erwan Arzur * Esteban Manchado Velazquez * Evan Winter * Felipe Almeida * Florian Weimer * Fran Boon * Franky Van Liedekerke * Frederic Schaer * Frederic Van Espen * Garry Cook * Gary Berger * Gary Miller * Gavin Adams * Geert Vanderkelen * Gennaro Tortone * Geoff Montee * Gerd Mueller * Gerhard Lausser * gherteg * Glenn Thompson * Gordon Messmer * Gordon Smith * Grant Byers * Greg Abrams * Greg Woods * Hayakawa Shinya * Helmut Mikulcik * Hendrik Baecker * Henning Brauer * Herbert Straub * Hiren Patel * Holger Weiss * Horvath Tamas * Hugo Gayosso * Hugo Hallqvist * Ian Blenke * Ian Cass * Igno Kley * Ingo Lantschner * Ivan Kuncl * Jacob Lundqvist * James "Showkilr" Peterson * James Maddison * James Moseley * Jan David * Jan Grant * Jan Vejvalka * Janet Post * Janice Singh * Jason Blakey * Jason Hedden * Jean Gabes * Jean-Eric Cuendet * Jeff Cours * Jeff Johnson * Jeffrey Blank * Jeffrey Goldschrafe * Jeremy Bouse * Jeremy Weatherford * Jim Crilley * Jim Dumser * Jim Popovitch * Jiri Kostern * Jochen Bern * Joel Berry * Joel Crisp * Joerg Linge * John Calcote * John Rouillard * Jon Andrews * Jonathan Clarke * Jonathan Kamens * Jonathan Saggau * Jorge Sanchez * Joseph Maiorana * Josh Soref * Josh Thorstad * Justin Clarke * Kai Kunstmann * Kai Ung * Karel Salavec * Karl DeBisschop * Karl Hegbloom * Karsten Weiss * Kenneth Ray * Kevin Benton * Kevin Stone * Larry Low * Lars Hansson * Lars Hecking * Lars Kellogg-Stedman * Lars Michelson * Lars Vogdt * lev * Lonny Selinger * Lou Sneddon * Ludo Bosmans * Luigi Balzano * Luiz Felipe R E * Luke Ross * Emmanuel Dreyfus * Marc Powell * Marcus Fleige * Marcus Hildenbrand * Mark DeTrano * Mark Felder * Mark Frost * Mark Goldfinch * Mark Schenker * Mark Spieth * Markus Almroth * Markus Baertschi * Marlo Bell * Martin Green * Martin Mielke * Mathieu Gagne * Matt Ezell * Matthew Grant * Matthew Richardson * Matthias Cramer * Matthias Eble * Matthias Eichler * Matthias Flacke * Matthias Flittner * Matthias Kerk * Matthieu Kermagoret * Matthieu Kermagoret * Mattias Ryrlen * Max Schubert * Max Sikstrom * Michael Anthon * Michael Bailey * Michael Bunk * Michael Little * Michael Lubben * Michael Marineau * Michael O'Reilly * Michael Orlitzky * Michael Smedius * Michal Zimen * Michelle Craft * Mika Fischer * Mike Bird * Mike Dorman * Mike McHenry * Mindaugas Riauba * Mitch Wright * Moshe Sharon * Nate Shafer * Nathan Grennan * Nicholas Tang * Nick Cleaton * Nick Reinking * Nick Shore * Nikola Vassilev * Olivier Beytrison * Olivier Jan * Parth Laxmikant Kolekar * Patrick Proy * Patrik Halfar * Paul Kent * Paul Pot * Pavel Satrapa * Pawel Zuzelski * Pedro Leite * Percy Jahn * Perry Clarke * Peter Ringe * Peter Valdemar Morch * Peter Westlake * Petr Adamec * Petya Kohts * Phil Mayers * Phil Randal * Phil Walther * Ralph Rossner * Ray Bengen * Remi Paulmier * Rémi Verschelde * Rene Klootwijk * Ricardo Maraschini * Richard Mayhew * Rob Enders * Rob Patrick * Rob Remus * Robert August Vincent II * Robert Gash * Robert Thompson * Roberto Marrodan * Robin Kearney * Robin Sonefors * Ronald Ho * Rostislav Opočenský * Russell Scibetti * Ryan Skorstad * Ryoji Kobayashi * Sam Howard * Sean Finney * Sebastian Guarino * Sebastien Barbereau * Sergio Guzman * Shad Lords * Simon Beale * sq5bpf * Stanley Hopcroft * Stefan Rompf * Stefan Schurtz * Stephane Urbanovski * Stephen Davies * Stephen Gran * Steve Underwood * Steven Pokrandt * Stewart James * Stig Jacobsen * Subhendu Ghosh * SUSE Linux Team * Sven Nierlein * Sven Strickroth * Sven-Göran Bergh * Sylvain Falardeau * Szabo Gabor * Thomas Dohl * Thomas Dunkel * Thomas Guyot-Sionnest * Thomas Hepper * Thomas Sebastien * Thomas Stolle * Tim Starling * Tim Wilde * Time Niemueller * Tobias Klausmann * Tobias Mucke * Todd Green * Todd Wheeler * Tom Bertelson * Tom De Blende * Tom Welsh * Tomer Okavi * Ton Voon * Torsten Huebler * Troy Lea * Tyler Lund * Uwe Knop * Uwe Knop * Vadim Okun * Volkan Yazici * Volker Aust * William Leibzon * William Preston * Wolfgang Barth * xoubih * Yves Rubin * Zakhar Kleyman * Z. Liu nagios-4.3.4/UPGRADING000066400000000000000000000012031314764422400142500ustar00rootroot00000000000000Upgrading Nagios Core ===================== nagios-4.3.0 - 2017-02-21 ------------------------- If you use "corewindow", as in http://localhost/nagios?corewindow=www.somewhere.com note that this functionality has been disabled by default in this release. If you still want to use it, run ./configure with the parameter --enable-corewindow nagios-3.0 ---------- The HTML documentation covers what you need to know in order to upgrade from Nagios 2.x You can find the documentation in the following subdirectory: html/docs Make sure to read the following sections: - "What's New" (whatsnew.html) - "Upgrading Nagios" (upgrading.html) nagios-4.3.4/base/000077500000000000000000000000001314764422400137235ustar00rootroot00000000000000nagios-4.3.4/base/.gitignore000066400000000000000000000000261314764422400157110ustar00rootroot00000000000000*.o nagios nagiostats nagios-4.3.4/base/Makefile.in000066400000000000000000000121731314764422400157740ustar00rootroot00000000000000############################ # Makefile for Nagios # ############################ # Source code directories SRC_COMMON=../common SRC_INCLUDE=../include SRC_XDATA=../xdata SRC_LIB=../lib CC=@CC@ CFLAGS=-Wall -I.. @CFLAGS@ @DEFS@ -DNSCORE # Compiler flags for use with gprof #CFLAGS=-pg -DHAVE_CONFIG_H -DNSCORE # Compiler flags for use with Valgrind #CFLAGS=-O0 -g -DHAVE_CONFIG_H -DNSCORE # Compiler flags for optimization (overrides default) #CFLAGS=-O3 -Wall -fno-strict-aliasing -Wshadow -Wpointer-arith -Wcast-qual -Wcast-align -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -DHAVE_CONFIG_H -DNSCORE # Compiler flags for optimization (complements default) #CFLAGS_WARN=-Wall -Wshadow -Wpointer-arith -Wcast-qual -Wcast-align -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs #CFLAGS_DEBUG=-ggdb3 -g3 #CFLAGS_GPROF=-pg #CFLAGS+=$(CFLAGS_WARN) $(CFLAGS_DEBUG) $(CFLAGS_GPROF) LDFLAGS=@LDFLAGS@ LIBS=@LIBS@ prefix=@prefix@ exec_prefix=@exec_prefix@ LOGDIR=@localstatedir@ CFGDIR=@sysconfdir@ BINDIR=@bindir@ CGIDIR=@sbindir@ HTMLDIR=@datarootdir@ INSTALL=@INSTALL@ INSTALL_OPTS=@INSTALL_OPTS@ COMMAND_OPTS=@COMMAND_OPTS@ STRIP=@STRIP@ CGIURL=@cgiurl@ HTMURL=@htmurl@ MATHLIBS=-lm SOCKETLIBS=@SOCKETLIBS@ BROKERLIBS=@BROKERLIBS@ BROKER_LDFLAGS=@BROKER_LDFLAGS@ CP=@CP@ # Extra base code BASEEXTRALIBS=@BASEEXTRALIBS@ # Generated automatically from configure script BROKER_O=@BROKER_O@ BROKER_H=@BROKER_H@ # Object data ODATALIBS=objects-base.o xobjects-base.o ODATAHDRS= ODATADEPS=$(ODATALIBS) # Retention data RDATALIBS=retention-base.o xretention-base.o RDATAHDRS= RDATADEPS=$(RDATALIBS) # Comment data CDATALIBS=comments-base.o xcomments-base.o CDATAHDRS= CDATADEPS=$(CDATALIBS) # Status data SDATALIBS=statusdata-base.o xstatusdata-base.o SDATAHDRS= SDATADEPS=$(SDATALIBS) # Performance data PDATALIBS=perfdata-base.o xperfdata-base.o PDATAHDRS= PDATADEPS=$(PDATALIBS) # Downtime data DDATALIBS=downtime-base.o DDATAHDRS= DDATADEPS=$(DDATALIBS) OBJS=$(BROKER_O) $(SRC_COMMON)/shared.o nerd.o query-handler.o workers.o checks.o config.o commands.o events.o flapping.o logging.o macros-base.o netutils.o notifications.o sehandlers.o utils.o $(RDATALIBS) $(CDATALIBS) $(ODATALIBS) $(SDATALIBS) $(PDATALIBS) $(DDATALIBS) $(BASEEXTRALIBS) OBJDEPS=$(ODATADEPS) $(ODATADEPS) $(RDATADEPS) $(CDATADEPS) $(SDATADEPS) $(PDATADEPS) $(DDATADEPS) $(BROKER_H) all: nagios nagiostats ######## REQUIRED FILES ########## macros-base.o: $(SRC_COMMON)/macros.c $(SRC_INCLUDE)/macros.h $(CC) $(CFLAGS) -c -o $@ $(SRC_COMMON)/macros.c objects-base.o: $(SRC_COMMON)/objects.c $(SRC_INCLUDE)/objects.h $(CC) $(CFLAGS) -c -o $@ $(SRC_COMMON)/objects.c xobjects-base.o: $(SRC_XDATA)/xodtemplate.c $(SRC_XDATA)/xodtemplate.h $(CC) $(CFLAGS) -c -o $@ $(SRC_XDATA)/xodtemplate.c statusdata-base.o: $(SRC_COMMON)/statusdata.c $(SRC_INCLUDE)/statusdata.h $(CC) $(CFLAGS) -c -o $@ $(SRC_COMMON)/statusdata.c xstatusdata-base.o: $(SRC_XDATA)/xsddefault.c $(SRC_XDATA)/xsddefault.h $(CC) $(CFLAGS) -c -o $@ $(SRC_XDATA)/xsddefault.c comments-base.o: $(SRC_COMMON)/comments.c $(SRC_INCLUDE)/comments.h $(CC) $(CFLAGS) -c -o $@ $(SRC_COMMON)/comments.c xcomments-base.o: $(SRC_XDATA)/xcddefault.c $(SRC_XDATA)/xcddefault.h $(CC) $(CFLAGS) -c -o $@ $(SRC_XDATA)/xcddefault.c downtime-base.o: $(SRC_COMMON)/downtime.c $(SRC_INCLUDE)/downtime.h $(CC) $(CFLAGS) -c -o $@ $(SRC_COMMON)/downtime.c perfdata-base.o: perfdata.c $(SRC_INCLUDE)/perfdata.h $(CC) $(CFLAGS) -c -o $@ perfdata.c xperfdata-base.o: $(SRC_XDATA)/xpddefault.c $(SRC_XDATA)/xpddefault.h $(CC) $(CFLAGS) -c -o $@ $(SRC_XDATA)/xpddefault.c retention-base.o: sretention.c $(SRC_INCLUDE)/sretention.h $(CC) $(CFLAGS) -c -o $@ sretention.c xretention-base.o: $(SRC_XDATA)/xrddefault.c $(SRC_XDATA)/xrddefault.h $(CC) $(CFLAGS) -c -o $@ $(SRC_XDATA)/xrddefault.c $(SRC_COMMON)/shared.o: $(SRC_COMMON)/shared.c $(CC) $(CFLAGS) -c -o $@ $< workers.o: workers.c wpres-phash.h $(CC) $(CFLAGS) -c -o $@ $< wpres-phash.h: wpres.gperf gperf -S 1 -t -H wpres_key_phash -N wpres_get_key $< > $@ ########## NAGIOS ########## libnagios: $(MAKE) -C $(SRC_LIB) nagios.o: nagios.c $(SRC_INCLUDE)/nagios.h $(SRC_INCLUDE)/locations.h $(CC) $(CFLAGS) -c -o $@ nagios.c nagios: nagios.o $(OBJS) $(OBJDEPS) libnagios $(CC) $(CFLAGS) -o $@ $< $(OBJS) $(BROKER_LDFLAGS) $(LDFLAGS) $(MATHLIBS) $(SOCKETLIBS) $(BROKERLIBS) $(LIBS) $(SRC_LIB)/libnagios.a nagiostats: nagiostats.c $(SRC_INCLUDE)/locations.h libnagios $(CC) $(CFLAGS) -o $@ nagiostats.c $(LDFLAGS) $(MATHLIBS) $(LIBS) $(SRC_LIB)/libnagios.a $(OBJS): $(SRC_INCLUDE)/locations.h clean: rm -f nagios nagiostats core *.o gmon.out rm -f *~ *.*~ distclean: clean rm -f perlxsi.c rm -f Makefile devclean: distclean rm -f wpres-phash.h install: $(MAKE) install-basic $(MAKE) strip-post-install install-unstripped: $(MAKE) install-basic install-basic: $(INSTALL) -m 775 $(INSTALL_OPTS) -d $(DESTDIR)$(BINDIR) $(INSTALL) -m 774 $(INSTALL_OPTS) @nagios_name@ $(DESTDIR)$(BINDIR) $(INSTALL) -m 774 $(INSTALL_OPTS) @nagiostats_name@ $(DESTDIR)$(BINDIR) strip-post-install: $(STRIP) $(DESTDIR)$(BINDIR)/@nagios_name@ $(STRIP) $(DESTDIR)$(BINDIR)/@nagiostats_name@ .PHONY: libnagios nagios-4.3.4/base/broker.c000066400000000000000000000674101314764422400153630ustar00rootroot00000000000000/***************************************************************************** * * BROKER.C - Event broker routines for Nagios * * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #include "../include/config.h" #include "../include/common.h" #include "../include/nagios.h" #include "../include/broker.h" #include "../include/nebcallbacks.h" #include "../include/nebstructs.h" #include "../include/nebmods.h" #ifdef USE_EVENT_BROKER /******************************************************************/ /************************* EVENT FUNCTIONS ************************/ /******************************************************************/ /* sends program data (starts, restarts, stops, etc.) to broker */ void broker_program_state(int type, int flags, int attr, struct timeval *timestamp) { nebstruct_process_data ds; if(!(event_broker_options & BROKER_PROGRAM_STATE)) return; /* fill struct with relevant data */ ds.type = type; ds.flags = flags; ds.attr = attr; ds.timestamp = get_broker_timestamp(timestamp); /* make callbacks */ neb_make_callbacks(NEBCALLBACK_PROCESS_DATA, (void *)&ds); return; } /* send timed event data to broker */ void broker_timed_event(int type, int flags, int attr, timed_event *event, struct timeval *timestamp) { nebstruct_timed_event_data ds; if(!(event_broker_options & BROKER_TIMED_EVENTS)) return; if(event == NULL) return; /* fill struct with relevant data */ ds.type = type; ds.flags = flags; ds.attr = attr; ds.timestamp = get_broker_timestamp(timestamp); ds.event_type = event->event_type; ds.recurring = event->recurring; ds.run_time = event->run_time; ds.event_data = event->event_data; ds.event_ptr = (void *)event; /* make callbacks */ neb_make_callbacks(NEBCALLBACK_TIMED_EVENT_DATA, (void *)&ds); return; } /* send log data to broker */ void broker_log_data(int type, int flags, int attr, char *data, unsigned long data_type, time_t entry_time, struct timeval *timestamp) { nebstruct_log_data ds; if(!(event_broker_options & BROKER_LOGGED_DATA)) return; /* fill struct with relevant data */ ds.type = type; ds.flags = flags; ds.attr = attr; ds.timestamp = get_broker_timestamp(timestamp); ds.entry_time = entry_time; ds.data_type = data_type; ds.data = data; /* make callbacks */ neb_make_callbacks(NEBCALLBACK_LOG_DATA, (void *)&ds); return; } /* send system command data to broker */ void broker_system_command(int type, int flags, int attr, struct timeval start_time, struct timeval end_time, double exectime, int timeout, int early_timeout, int retcode, char *cmd, char *output, struct timeval *timestamp) { nebstruct_system_command_data ds; if(!(event_broker_options & BROKER_SYSTEM_COMMANDS)) return; if(cmd == NULL) return; /* fill struct with relevant data */ ds.type = type; ds.flags = flags; ds.attr = attr; ds.timestamp = get_broker_timestamp(timestamp); ds.start_time = start_time; ds.end_time = end_time; ds.timeout = timeout; ds.command_line = cmd; ds.early_timeout = early_timeout; ds.execution_time = exectime; ds.return_code = retcode; ds.output = output; /* make callbacks */ neb_make_callbacks(NEBCALLBACK_SYSTEM_COMMAND_DATA, (void *)&ds); return; } /* send event handler data to broker */ int broker_event_handler(int type, int flags, int attr, int eventhandler_type, void *data, int state, int state_type, struct timeval start_time, struct timeval end_time, double exectime, int timeout, int early_timeout, int retcode, char *cmd, char *cmdline, char *output, struct timeval *timestamp) { service *temp_service = NULL; host *temp_host = NULL; char *command_buf = NULL; char *command_name = NULL; char *command_args = NULL; nebstruct_event_handler_data ds; int return_code = OK; if(!(event_broker_options & BROKER_EVENT_HANDLERS)) return return_code; if(data == NULL) return ERROR; /* get command name/args */ if(cmd != NULL) { command_buf = (char *)strdup(cmd); command_name = strtok(command_buf, "!"); command_args = strtok(NULL, "\x0"); } /* fill struct with relevant data */ ds.type = type; ds.flags = flags; ds.attr = attr; ds.timestamp = get_broker_timestamp(timestamp); ds.eventhandler_type = eventhandler_type; if(eventhandler_type == SERVICE_EVENTHANDLER || eventhandler_type == GLOBAL_SERVICE_EVENTHANDLER) { temp_service = (service *)data; ds.host_name = temp_service->host_name; ds.service_description = temp_service->description; } else { temp_host = (host *)data; ds.host_name = temp_host->name; ds.service_description = NULL; } ds.object_ptr = data; ds.state = state; ds.state_type = state_type; ds.start_time = start_time; ds.end_time = end_time; ds.timeout = timeout; ds.command_name = command_name; ds.command_args = command_args; ds.command_line = cmdline; ds.early_timeout = early_timeout; ds.execution_time = exectime; ds.return_code = retcode; ds.output = output; /* make callbacks */ return_code = neb_make_callbacks(NEBCALLBACK_EVENT_HANDLER_DATA, (void *)&ds); /* free memory */ my_free(command_buf); return return_code; } /* send host check data to broker */ int broker_host_check(int type, int flags, int attr, host *hst, int check_type, int state, int state_type, struct timeval start_time, struct timeval end_time, char *cmd, double latency, double exectime, int timeout, int early_timeout, int retcode, char *cmdline, char *output, char *long_output, char *perfdata, struct timeval *timestamp, check_result *cr) { char *command_buf = NULL; char *command_name = NULL; char *command_args = NULL; nebstruct_host_check_data ds; int return_code = OK; if(!(event_broker_options & BROKER_HOST_CHECKS)) return OK; if(hst == NULL) return ERROR; /* get command name/args */ if(cmd != NULL) { command_buf = (char *)strdup(cmd); command_name = strtok(command_buf, "!"); command_args = strtok(NULL, "\x0"); } /* fill struct with relevant data */ ds.type = type; ds.flags = flags; ds.attr = attr; ds.timestamp = get_broker_timestamp(timestamp); ds.host_name = hst->name; ds.object_ptr = (void *)hst; ds.check_type = check_type; ds.current_attempt = hst->current_attempt; ds.max_attempts = hst->max_attempts; ds.state = state; ds.state_type = state_type; ds.timeout = timeout; ds.command_name = command_name; ds.command_args = command_args; ds.command_line = cmdline; ds.start_time = start_time; ds.end_time = end_time; ds.early_timeout = early_timeout; ds.execution_time = exectime; ds.latency = latency; ds.return_code = retcode; ds.output = output; ds.long_output = long_output; ds.perf_data = perfdata; ds.check_result_ptr = cr; /* make callbacks */ return_code = neb_make_callbacks(NEBCALLBACK_HOST_CHECK_DATA, (void *)&ds); /* free data */ my_free(command_buf); return return_code; } /* send service check data to broker */ int broker_service_check(int type, int flags, int attr, service *svc, int check_type, struct timeval start_time, struct timeval end_time, char *cmd, double latency, double exectime, int timeout, int early_timeout, int retcode, char *cmdline, struct timeval *timestamp, check_result *cr) { char *command_buf = NULL; char *command_name = NULL; char *command_args = NULL; nebstruct_service_check_data ds; int return_code = OK; if(!(event_broker_options & BROKER_SERVICE_CHECKS)) return OK; if(svc == NULL) return ERROR; /* get command name/args */ if(cmd != NULL) { command_buf = (char *)strdup(cmd); command_name = strtok(command_buf, "!"); command_args = strtok(NULL, "\x0"); } /* fill struct with relevant data */ ds.type = type; ds.flags = flags; ds.attr = attr; ds.timestamp = get_broker_timestamp(timestamp); ds.host_name = svc->host_name; ds.service_description = svc->description; ds.object_ptr = (void *)svc; ds.check_type = check_type; ds.current_attempt = svc->current_attempt; ds.max_attempts = svc->max_attempts; ds.state = svc->current_state; ds.state_type = svc->state_type; ds.timeout = timeout; ds.command_name = command_name; ds.command_args = command_args; ds.command_line = cmdline; ds.start_time = start_time; ds.end_time = end_time; ds.early_timeout = early_timeout; ds.execution_time = exectime; ds.latency = latency; ds.return_code = retcode; ds.output = svc->plugin_output; ds.long_output = svc->long_plugin_output; ds.perf_data = svc->perf_data; ds.check_result_ptr = cr; /* make callbacks */ return_code = neb_make_callbacks(NEBCALLBACK_SERVICE_CHECK_DATA, (void *)&ds); /* free data */ my_free(command_buf); return return_code; } /* send comment data to broker */ void broker_comment_data(int type, int flags, int attr, int comment_type, int entry_type, char *host_name, char *svc_description, time_t entry_time, char *author_name, char *comment_data, int persistent, int source, int expires, time_t expire_time, unsigned long comment_id, struct timeval *timestamp) { nebstruct_comment_data ds; if(!(event_broker_options & BROKER_COMMENT_DATA)) return; /* fill struct with relevant data */ ds.type = type; ds.flags = flags; ds.attr = attr; ds.timestamp = get_broker_timestamp(timestamp); ds.comment_type = comment_type; ds.entry_type = entry_type; ds.host_name = host_name; ds.service_description = svc_description; ds.object_ptr = NULL; /* not implemented yet */ ds.entry_time = entry_time; ds.author_name = author_name; ds.comment_data = comment_data; ds.persistent = persistent; ds.source = source; ds.expires = expires; ds.expire_time = expire_time; ds.comment_id = comment_id; /* make callbacks */ neb_make_callbacks(NEBCALLBACK_COMMENT_DATA, (void *)&ds); return; } /* send downtime data to broker */ void broker_downtime_data(int type, int flags, int attr, int downtime_type, char *host_name, char *svc_description, time_t entry_time, char *author_name, char *comment_data, time_t start_time, time_t end_time, int fixed, unsigned long triggered_by, unsigned long duration, unsigned long downtime_id, struct timeval *timestamp) { nebstruct_downtime_data ds; if(!(event_broker_options & BROKER_DOWNTIME_DATA)) return; /* fill struct with relevant data */ ds.type = type; ds.flags = flags; ds.attr = attr; ds.timestamp = get_broker_timestamp(timestamp); ds.downtime_type = downtime_type; ds.host_name = host_name; ds.service_description = svc_description; ds.object_ptr = NULL; /* not implemented yet */ ds.entry_time = entry_time; ds.author_name = author_name; ds.comment_data = comment_data; ds.start_time = start_time; ds.end_time = end_time; ds.fixed = fixed; ds.duration = duration; ds.triggered_by = triggered_by; ds.downtime_id = downtime_id; /* make callbacks */ neb_make_callbacks(NEBCALLBACK_DOWNTIME_DATA, (void *)&ds); return; } /* send flapping data to broker */ void broker_flapping_data(int type, int flags, int attr, int flapping_type, void *data, double percent_change, double high_threshold, double low_threshold, struct timeval *timestamp) { nebstruct_flapping_data ds; host *temp_host = NULL; service *temp_service = NULL; if(!(event_broker_options & BROKER_FLAPPING_DATA)) return; if(data == NULL) return; /* fill struct with relevant data */ ds.type = type; ds.flags = flags; ds.attr = attr; ds.timestamp = get_broker_timestamp(timestamp); ds.flapping_type = flapping_type; if(flapping_type == SERVICE_FLAPPING) { temp_service = (service *)data; ds.host_name = temp_service->host_name; ds.service_description = temp_service->description; ds.comment_id = temp_service->flapping_comment_id; } else { temp_host = (host *)data; ds.host_name = temp_host->name; ds.service_description = NULL; ds.comment_id = temp_host->flapping_comment_id; } ds.object_ptr = data; ds.percent_change = percent_change; ds.high_threshold = high_threshold; ds.low_threshold = low_threshold; /* make callbacks */ neb_make_callbacks(NEBCALLBACK_FLAPPING_DATA, (void *)&ds); return; } /* sends program status updates to broker */ void broker_program_status(int type, int flags, int attr, struct timeval *timestamp) { nebstruct_program_status_data ds; if(!(event_broker_options & BROKER_STATUS_DATA)) return; /* fill struct with relevant data */ ds.type = type; ds.flags = flags; ds.attr = attr; ds.timestamp = get_broker_timestamp(timestamp); ds.program_start = program_start; ds.pid = nagios_pid; ds.daemon_mode = daemon_mode; ds.last_log_rotation = last_log_rotation; ds.notifications_enabled = enable_notifications; ds.active_service_checks_enabled = execute_service_checks; ds.passive_service_checks_enabled = accept_passive_service_checks; ds.active_host_checks_enabled = execute_host_checks; ds.passive_host_checks_enabled = accept_passive_host_checks; ds.event_handlers_enabled = enable_event_handlers; ds.flap_detection_enabled = enable_flap_detection; ds.process_performance_data = process_performance_data; ds.obsess_over_hosts = obsess_over_hosts; ds.obsess_over_services = obsess_over_services; ds.modified_host_attributes = modified_host_process_attributes; ds.modified_service_attributes = modified_service_process_attributes; ds.global_host_event_handler = global_host_event_handler; ds.global_service_event_handler = global_service_event_handler; /* make callbacks */ neb_make_callbacks(NEBCALLBACK_PROGRAM_STATUS_DATA, (void *)&ds); return; } /* sends host status updates to broker */ void broker_host_status(int type, int flags, int attr, host *hst, struct timeval *timestamp) { nebstruct_host_status_data ds; if(!(event_broker_options & BROKER_STATUS_DATA)) return; /* fill struct with relevant data */ ds.type = type; ds.flags = flags; ds.attr = attr; ds.timestamp = get_broker_timestamp(timestamp); ds.object_ptr = (void *)hst; /* make callbacks */ neb_make_callbacks(NEBCALLBACK_HOST_STATUS_DATA, (void *)&ds); return; } /* sends service status updates to broker */ void broker_service_status(int type, int flags, int attr, service *svc, struct timeval *timestamp) { nebstruct_service_status_data ds; if(!(event_broker_options & BROKER_STATUS_DATA)) return; /* fill struct with relevant data */ ds.type = type; ds.flags = flags; ds.attr = attr; ds.timestamp = get_broker_timestamp(timestamp); ds.object_ptr = (void *)svc; /* make callbacks */ neb_make_callbacks(NEBCALLBACK_SERVICE_STATUS_DATA, (void *)&ds); return; } /* sends contact status updates to broker */ void broker_contact_status(int type, int flags, int attr, contact *cntct, struct timeval *timestamp) { nebstruct_service_status_data ds; if(!(event_broker_options & BROKER_STATUS_DATA)) return; /* fill struct with relevant data */ ds.type = type; ds.flags = flags; ds.attr = attr; ds.timestamp = get_broker_timestamp(timestamp); ds.object_ptr = (void *)cntct; /* make callbacks */ neb_make_callbacks(NEBCALLBACK_CONTACT_STATUS_DATA, (void *)&ds); return; } /* send notification data to broker */ int broker_notification_data(int type, int flags, int attr, int notification_type, int reason_type, struct timeval start_time, struct timeval end_time, void *data, char *ack_author, char *ack_data, int escalated, int contacts_notified, struct timeval *timestamp) { nebstruct_notification_data ds; host *temp_host = NULL; service *temp_service = NULL; int return_code = OK; if(!(event_broker_options & BROKER_NOTIFICATIONS)) return return_code; /* fill struct with relevant data */ ds.type = type; ds.flags = flags; ds.attr = attr; ds.timestamp = get_broker_timestamp(timestamp); ds.notification_type = notification_type; ds.start_time = start_time; ds.end_time = end_time; ds.reason_type = reason_type; if(notification_type == SERVICE_NOTIFICATION) { temp_service = (service *)data; ds.host_name = temp_service->host_name; ds.service_description = temp_service->description; ds.state = temp_service->current_state; ds.output = temp_service->plugin_output; } else { temp_host = (host *)data; ds.host_name = temp_host->name; ds.service_description = NULL; ds.state = temp_host->current_state; ds.output = temp_host->plugin_output; } ds.object_ptr = data; ds.ack_author = ack_author; ds.ack_data = ack_data; ds.escalated = escalated; ds.contacts_notified = contacts_notified; /* make callbacks */ return_code = neb_make_callbacks(NEBCALLBACK_NOTIFICATION_DATA, (void *)&ds); return return_code; } /* send contact notification data to broker */ int broker_contact_notification_data(int type, int flags, int attr, int notification_type, int reason_type, struct timeval start_time, struct timeval end_time, void *data, contact *cntct, char *ack_author, char *ack_data, int escalated, struct timeval *timestamp) { nebstruct_contact_notification_data ds; host *temp_host = NULL; service *temp_service = NULL; int return_code = OK; if(!(event_broker_options & BROKER_NOTIFICATIONS)) return return_code; /* fill struct with relevant data */ ds.type = type; ds.flags = flags; ds.attr = attr; ds.timestamp = get_broker_timestamp(timestamp); ds.notification_type = notification_type; ds.start_time = start_time; ds.end_time = end_time; ds.reason_type = reason_type; ds.contact_name = cntct->name; if(notification_type == SERVICE_NOTIFICATION) { temp_service = (service *)data; ds.host_name = temp_service->host_name; ds.service_description = temp_service->description; ds.state = temp_service->current_state; ds.output = temp_service->plugin_output; } else { temp_host = (host *)data; ds.host_name = temp_host->name; ds.service_description = NULL; ds.state = temp_host->current_state; ds.output = temp_host->plugin_output; } ds.object_ptr = data; ds.contact_ptr = (void *)cntct; ds.ack_author = ack_author; ds.ack_data = ack_data; ds.escalated = escalated; /* make callbacks */ return_code = neb_make_callbacks(NEBCALLBACK_CONTACT_NOTIFICATION_DATA, (void *)&ds); return return_code; } /* send contact notification data to broker */ int broker_contact_notification_method_data(int type, int flags, int attr, int notification_type, int reason_type, struct timeval start_time, struct timeval end_time, void *data, contact *cntct, char *cmd, char *ack_author, char *ack_data, int escalated, struct timeval *timestamp) { nebstruct_contact_notification_method_data ds; host *temp_host = NULL; service *temp_service = NULL; char *command_buf = NULL; char *command_name = NULL; char *command_args = NULL; int return_code = OK; if(!(event_broker_options & BROKER_NOTIFICATIONS)) return return_code; /* get command name/args */ if(cmd != NULL) { command_buf = (char *)strdup(cmd); command_name = strtok(command_buf, "!"); command_args = strtok(NULL, "\x0"); } /* fill struct with relevant data */ ds.type = type; ds.flags = flags; ds.attr = attr; ds.timestamp = get_broker_timestamp(timestamp); ds.notification_type = notification_type; ds.start_time = start_time; ds.end_time = end_time; ds.reason_type = reason_type; ds.contact_name = cntct->name; ds.command_name = command_name; ds.command_args = command_args; if(notification_type == SERVICE_NOTIFICATION) { temp_service = (service *)data; ds.host_name = temp_service->host_name; ds.service_description = temp_service->description; ds.state = temp_service->current_state; ds.output = temp_service->plugin_output; } else { temp_host = (host *)data; ds.host_name = temp_host->name; ds.service_description = NULL; ds.state = temp_host->current_state; ds.output = temp_host->plugin_output; } ds.object_ptr = data; ds.contact_ptr = (void *)cntct; ds.ack_author = ack_author; ds.ack_data = ack_data; ds.escalated = escalated; /* make callbacks */ return_code = neb_make_callbacks(NEBCALLBACK_CONTACT_NOTIFICATION_METHOD_DATA, (void *)&ds); /* free memory */ my_free(command_buf); return return_code; } /* sends adaptive programs updates to broker */ void broker_adaptive_program_data(int type, int flags, int attr, int command_type, unsigned long modhattr, unsigned long modhattrs, unsigned long modsattr, unsigned long modsattrs, struct timeval *timestamp) { nebstruct_adaptive_program_data ds; if(!(event_broker_options & BROKER_ADAPTIVE_DATA)) return; /* fill struct with relevant data */ ds.type = type; ds.flags = flags; ds.attr = attr; ds.timestamp = get_broker_timestamp(timestamp); ds.command_type = command_type; ds.modified_host_attribute = modhattr; ds.modified_host_attributes = modhattrs; ds.modified_service_attribute = modsattr; ds.modified_service_attributes = modsattrs; /* make callbacks */ neb_make_callbacks(NEBCALLBACK_ADAPTIVE_PROGRAM_DATA, (void *)&ds); return; } /* sends adaptive host updates to broker */ void broker_adaptive_host_data(int type, int flags, int attr, host *hst, int command_type, unsigned long modattr, unsigned long modattrs, struct timeval *timestamp) { nebstruct_adaptive_host_data ds; if(!(event_broker_options & BROKER_ADAPTIVE_DATA)) return; /* fill struct with relevant data */ ds.type = type; ds.flags = flags; ds.attr = attr; ds.timestamp = get_broker_timestamp(timestamp); ds.command_type = command_type; ds.modified_attribute = modattr; ds.modified_attributes = modattrs; ds.object_ptr = (void *)hst; /* make callbacks */ neb_make_callbacks(NEBCALLBACK_ADAPTIVE_HOST_DATA, (void *)&ds); return; } /* sends adaptive service updates to broker */ void broker_adaptive_service_data(int type, int flags, int attr, service *svc, int command_type, unsigned long modattr, unsigned long modattrs, struct timeval *timestamp) { nebstruct_adaptive_service_data ds; if(!(event_broker_options & BROKER_ADAPTIVE_DATA)) return; /* fill struct with relevant data */ ds.type = type; ds.flags = flags; ds.attr = attr; ds.timestamp = get_broker_timestamp(timestamp); ds.command_type = command_type; ds.modified_attribute = modattr; ds.modified_attributes = modattrs; ds.object_ptr = (void *)svc; /* make callbacks */ neb_make_callbacks(NEBCALLBACK_ADAPTIVE_SERVICE_DATA, (void *)&ds); return; } /* sends adaptive contact updates to broker */ void broker_adaptive_contact_data(int type, int flags, int attr, contact *cntct, int command_type, unsigned long modattr, unsigned long modattrs, unsigned long modhattr, unsigned long modhattrs, unsigned long modsattr, unsigned long modsattrs, struct timeval *timestamp) { nebstruct_adaptive_contact_data ds; if(!(event_broker_options & BROKER_ADAPTIVE_DATA)) return; /* fill struct with relevant data */ ds.type = type; ds.flags = flags; ds.attr = attr; ds.timestamp = get_broker_timestamp(timestamp); ds.command_type = command_type; ds.modified_attribute = modattr; ds.modified_attributes = modattrs; ds.modified_host_attribute = modhattr; ds.modified_host_attributes = modhattrs; ds.modified_service_attribute = modsattr; ds.modified_service_attributes = modsattrs; ds.object_ptr = (void *)cntct; /* make callbacks */ neb_make_callbacks(NEBCALLBACK_ADAPTIVE_CONTACT_DATA, (void *)&ds); return; } /* sends external commands to broker */ void broker_external_command(int type, int flags, int attr, int command_type, time_t entry_time, char *command_string, char *command_args, struct timeval *timestamp) { nebstruct_external_command_data ds; if(!(event_broker_options & BROKER_EXTERNALCOMMAND_DATA)) return; /* fill struct with relevant data */ ds.type = type; ds.flags = flags; ds.attr = attr; ds.timestamp = get_broker_timestamp(timestamp); ds.command_type = command_type; ds.entry_time = entry_time; ds.command_string = command_string; ds.command_args = command_args; /* make callbacks */ neb_make_callbacks(NEBCALLBACK_EXTERNAL_COMMAND_DATA, (void *)&ds); return; } /* brokers aggregated status dumps */ void broker_aggregated_status_data(int type, int flags, int attr, struct timeval *timestamp) { nebstruct_aggregated_status_data ds; if(!(event_broker_options & BROKER_STATUS_DATA)) return; /* fill struct with relevant data */ ds.type = type; ds.flags = flags; ds.attr = attr; ds.timestamp = get_broker_timestamp(timestamp); /* make callbacks */ neb_make_callbacks(NEBCALLBACK_AGGREGATED_STATUS_DATA, (void *)&ds); return; } /* brokers retention data */ void broker_retention_data(int type, int flags, int attr, struct timeval *timestamp) { nebstruct_retention_data ds; if(!(event_broker_options & BROKER_RETENTION_DATA)) return; /* fill struct with relevant data */ ds.type = type; ds.flags = flags; ds.attr = attr; ds.timestamp = get_broker_timestamp(timestamp); /* make callbacks */ neb_make_callbacks(NEBCALLBACK_RETENTION_DATA, (void *)&ds); return; } /* send acknowledgement data to broker */ void broker_acknowledgement_data(int type, int flags, int attr, int acknowledgement_type, void *data, char *ack_author, char *ack_data, int subtype, int notify_contacts, int persistent_comment, struct timeval *timestamp) { nebstruct_acknowledgement_data ds; host *temp_host = NULL; service *temp_service = NULL; if(!(event_broker_options & BROKER_ACKNOWLEDGEMENT_DATA)) return; /* fill struct with relevant data */ ds.type = type; ds.flags = flags; ds.attr = attr; ds.timestamp = get_broker_timestamp(timestamp); ds.acknowledgement_type = acknowledgement_type; if(acknowledgement_type == SERVICE_ACKNOWLEDGEMENT) { temp_service = (service *)data; ds.host_name = temp_service->host_name; ds.service_description = temp_service->description; ds.state = temp_service->current_state; } else { temp_host = (host *)data; ds.host_name = temp_host->name; ds.service_description = NULL; ds.state = temp_host->current_state; } ds.object_ptr = data; ds.author_name = ack_author; ds.comment_data = ack_data; ds.is_sticky = (subtype == ACKNOWLEDGEMENT_STICKY) ? TRUE : FALSE; ds.notify_contacts = notify_contacts; ds.persistent_comment = persistent_comment; /* make callbacks */ neb_make_callbacks(NEBCALLBACK_ACKNOWLEDGEMENT_DATA, (void *)&ds); return; } /* send state change data to broker */ void broker_statechange_data(int type, int flags, int attr, int statechange_type, void *data, int state, int state_type, int current_attempt, int max_attempts, struct timeval *timestamp) { nebstruct_statechange_data ds; host *temp_host = NULL; service *temp_service = NULL; if(!(event_broker_options & BROKER_STATECHANGE_DATA)) return; /* fill struct with relevant data */ ds.type = type; ds.flags = flags; ds.attr = attr; ds.timestamp = get_broker_timestamp(timestamp); ds.statechange_type = statechange_type; if(statechange_type == SERVICE_STATECHANGE) { temp_service = (service *)data; ds.host_name = temp_service->host_name; ds.service_description = temp_service->description; ds.output = temp_service->plugin_output; ds.longoutput = temp_service->long_plugin_output; } else { temp_host = (host *)data; ds.host_name = temp_host->name; ds.service_description = NULL; ds.output = temp_host->plugin_output; ds.longoutput = temp_host->long_plugin_output; } ds.object_ptr = data; ds.state = state; ds.state_type = state_type; ds.current_attempt = current_attempt; ds.max_attempts = max_attempts; /* make callbacks */ neb_make_callbacks(NEBCALLBACK_STATE_CHANGE_DATA, (void *)&ds); return; } /******************************************************************/ /************************ UTILITY FUNCTIONS ***********************/ /******************************************************************/ /* gets timestamp for use by broker */ struct timeval get_broker_timestamp(struct timeval *timestamp) { struct timeval tv; if(timestamp == NULL) gettimeofday(&tv, NULL); else tv = *timestamp; return tv; } #endif nagios-4.3.4/base/checks.c000066400000000000000000003651731314764422400153460ustar00rootroot00000000000000/***************************************************************************** * * CHECKS.C - Service and host check functions for Nagios * * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #include "../include/config.h" #include "../include/comments.h" #include "../include/common.h" #include "../include/statusdata.h" #include "../include/downtime.h" #include "../include/macros.h" #include "../include/nagios.h" #include "../include/broker.h" #include "../include/perfdata.h" #include "../include/workers.h" /*#define DEBUG_CHECKS*/ /*#define DEBUG_HOST_CHECKS 1*/ #ifdef USE_EVENT_BROKER #include "../include/neberrors.h" #endif /******************************************************************/ /********************** CHECK REAPER FUNCTIONS ********************/ /******************************************************************/ /* reaps host and service check results */ int reap_check_results(void) { int reaped_checks = 0; log_debug_info(DEBUGL_FUNCTIONS, 0, "reap_check_results() start\n"); log_debug_info(DEBUGL_CHECKS, 0, "Starting to reap check results.\n"); /* process files in the check result queue */ reaped_checks = process_check_result_queue(check_result_path); log_debug_info(DEBUGL_CHECKS, 0, "Finished reaping %d check results\n", reaped_checks); log_debug_info(DEBUGL_FUNCTIONS, 0, "reap_check_results() end\n"); return OK; } /******************************************************************/ /****************** SERVICE MONITORING FUNCTIONS ******************/ /******************************************************************/ /* executes a scheduled service check */ int run_scheduled_service_check(service *svc, int check_options, double latency) { int result = OK; time_t current_time = 0L; time_t preferred_time = 0L; time_t next_valid_time = 0L; int time_is_valid = TRUE; if(svc == NULL) return ERROR; log_debug_info(DEBUGL_FUNCTIONS, 0, "run_scheduled_service_check() start\n"); log_debug_info(DEBUGL_CHECKS, 0, "Attempting to run scheduled check of service '%s' on host '%s': check options=%d, latency=%lf\n", svc->description, svc->host_name, check_options, latency); /* * reset the next_check_event so we know it's * no longer in the scheduling queue */ svc->next_check_event = NULL; /* attempt to run the check */ result = run_async_service_check(svc, check_options, latency, TRUE, TRUE, &time_is_valid, &preferred_time); /* an error occurred, so reschedule the check */ if(result == ERROR) { log_debug_info(DEBUGL_CHECKS, 1, "Unable to run scheduled service check at this time\n"); /* only attempt to (re)schedule checks that should get checked... */ if(svc->should_be_scheduled == TRUE) { /* get current time */ time(¤t_time); /* determine next time we should check the service if needed */ /* if service has no check interval, schedule it again for 5 minutes from now */ if(current_time >= preferred_time) preferred_time = current_time + ((svc->check_interval <= 0) ? 300 : (svc->check_interval * interval_length)); /* make sure we rescheduled the next service check at a valid time */ get_next_valid_time(preferred_time, &next_valid_time, svc->check_period_ptr); /* * If we really can't reschedule the service properly, we * just push the check to preferred_time plus some reasonable * random value and try again then. */ if(time_is_valid == FALSE && check_time_against_period(next_valid_time, svc->check_period_ptr) == ERROR) { svc->next_check = preferred_time + ranged_urand(0, check_window(svc)); logit(NSLOG_RUNTIME_WARNING, TRUE, "Warning: Check of service '%s' on host '%s' could not be rescheduled properly. Scheduling check for %s...\n", svc->description, svc->host_name, ctime(&preferred_time)); log_debug_info(DEBUGL_CHECKS, 1, "Unable to find any valid times to reschedule the next service check!\n"); } /* this service could be rescheduled... */ else { svc->next_check = next_valid_time; if(next_valid_time > preferred_time) { /* Next valid time is further in the future because of * timeperiod constraints. Add a random amount so we * don't get all checks subject to that timeperiod * constraint scheduled at the same time */ svc->next_check += ranged_urand(0, check_window(svc)); } svc->should_be_scheduled = TRUE; log_debug_info(DEBUGL_CHECKS, 1, "Rescheduled next service check for %s", ctime(&next_valid_time)); } } /* * reschedule the next service check - unless we couldn't * find a valid next check time, but keep original options */ if(svc->should_be_scheduled == TRUE) schedule_service_check(svc, svc->next_check, check_options); /* update the status log */ update_service_status(svc, FALSE); return ERROR; } return OK; } /* forks a child process to run a service check, but does not wait for the service check result */ int run_async_service_check(service *svc, int check_options, double latency, int scheduled_check, int reschedule_check, int *time_is_valid, time_t *preferred_time) { nagios_macros mac; char *raw_command = NULL; char *processed_command = NULL; struct timeval start_time, end_time; host *temp_host = NULL; double old_latency = 0.0; check_result *cr; int runchk_result = OK; int macro_options = STRIP_ILLEGAL_MACRO_CHARS | ESCAPE_MACRO_CHARS; #ifdef USE_EVENT_BROKER int neb_result = OK; #endif log_debug_info(DEBUGL_FUNCTIONS, 0, "run_async_service_check()\n"); /* make sure we have something */ if(svc == NULL) return ERROR; /* is the service check viable at this time? */ if(check_service_check_viability(svc, check_options, time_is_valid, preferred_time) == ERROR) return ERROR; /* find the host associated with this service */ if((temp_host = svc->host_ptr) == NULL) return ERROR; /******** GOOD TO GO FOR A REAL SERVICE CHECK AT THIS POINT ********/ #ifdef USE_EVENT_BROKER /* initialize start/end times */ start_time.tv_sec = 0L; start_time.tv_usec = 0L; end_time.tv_sec = 0L; end_time.tv_usec = 0L; /* send data to event broker */ neb_result = broker_service_check(NEBTYPE_SERVICECHECK_ASYNC_PRECHECK, NEBFLAG_NONE, NEBATTR_NONE, svc, CHECK_TYPE_ACTIVE, start_time, end_time, svc->check_command, svc->latency, 0.0, 0, FALSE, 0, NULL, NULL, NULL); if (neb_result == NEBERROR_CALLBACKCANCEL || neb_result == NEBERROR_CALLBACKOVERRIDE) { log_debug_info(DEBUGL_CHECKS, 0, "Check of service '%s' on host '%s' (id=%u) was %s by a module\n", svc->description, svc->host_name, svc->id, neb_result == NEBERROR_CALLBACKCANCEL ? "cancelled" : "overridden"); } /* neb module wants to cancel the service check - the check will be rescheduled for a later time by the scheduling logic */ if(neb_result == NEBERROR_CALLBACKCANCEL) { if(preferred_time) *preferred_time += (svc->check_interval * interval_length); return ERROR; } /* neb module wants to override (or cancel) the service check - perhaps it will check the service itself */ /* NOTE: if a module does this, it has to do a lot of the stuff found below to make sure things don't get whacked out of shape! */ /* NOTE: if would be easier for modules to override checks when the NEBTYPE_SERVICECHECK_INITIATE event is called (later) */ if(neb_result == NEBERROR_CALLBACKOVERRIDE) return OK; #endif log_debug_info(DEBUGL_CHECKS, 0, "Checking service '%s' on host '%s'...\n", svc->description, svc->host_name); /* clear check options - we don't want old check options retained */ /* only clear check options for scheduled checks - ondemand checks shouldn't affected retained check options */ if(scheduled_check == TRUE) svc->check_options = CHECK_OPTION_NONE; /* update latency for macros, event broker, save old value for later */ old_latency = svc->latency; svc->latency = latency; /* grab the host and service macro variables */ memset(&mac, 0, sizeof(mac)); grab_host_macros_r(&mac, temp_host); grab_service_macros_r(&mac, svc); /* get the raw command line */ get_raw_command_line_r(&mac, svc->check_command_ptr, svc->check_command, &raw_command, macro_options); if(raw_command == NULL) { clear_volatile_macros_r(&mac); log_debug_info(DEBUGL_CHECKS, 0, "Raw check command for service '%s' on host '%s' was NULL - aborting.\n", svc->description, svc->host_name); if(preferred_time) *preferred_time += (svc->check_interval * interval_length); svc->latency = old_latency; return ERROR; } /* process any macros contained in the argument */ process_macros_r(&mac, raw_command, &processed_command, macro_options); my_free(raw_command); if(processed_command == NULL) { clear_volatile_macros_r(&mac); log_debug_info(DEBUGL_CHECKS, 0, "Processed check command for service '%s' on host '%s' was NULL - aborting.\n", svc->description, svc->host_name); if(preferred_time) *preferred_time += (svc->check_interval * interval_length); svc->latency = old_latency; return ERROR; } /* get the command start time */ gettimeofday(&start_time, NULL); cr = calloc(1, sizeof(*cr)); if (!cr) { clear_volatile_macros_r(&mac); svc->latency = old_latency; my_free(processed_command); return ERROR; } init_check_result(cr); /* save check info */ cr->object_check_type = SERVICE_CHECK; cr->check_type = CHECK_TYPE_ACTIVE; cr->check_options = check_options; cr->scheduled_check = scheduled_check; cr->reschedule_check = reschedule_check; cr->latency = latency; cr->start_time = start_time; cr->finish_time = start_time; cr->early_timeout = FALSE; cr->exited_ok = TRUE; cr->return_code = STATE_OK; cr->output = NULL; cr->host_name = (char *)strdup(svc->host_name); cr->service_description = (char *)strdup(svc->description); #ifdef USE_EVENT_BROKER /* send data to event broker */ neb_result = broker_service_check(NEBTYPE_SERVICECHECK_INITIATE, NEBFLAG_NONE, NEBATTR_NONE, svc, CHECK_TYPE_ACTIVE, start_time, end_time, svc->check_command, svc->latency, 0.0, service_check_timeout, FALSE, 0, processed_command, NULL, cr); /* neb module wants to override the service check - perhaps it will check the service itself */ if(neb_result == NEBERROR_CALLBACKOVERRIDE) { clear_volatile_macros_r(&mac); svc->latency = old_latency; free_check_result(cr); my_free(processed_command); return OK; } #endif /* reset latency (permanent value will be set later) */ svc->latency = old_latency; /* paw off the check to a worker to run */ runchk_result = wproc_run_check(cr, processed_command, &mac); if (runchk_result == ERROR) { logit(NSLOG_RUNTIME_ERROR, TRUE, "Unable to run check for service '%s' on host '%s'\n", svc->description, svc->host_name); } else { /* do the book-keeping */ currently_running_service_checks++; svc->is_executing = TRUE; update_check_stats((scheduled_check == TRUE) ? ACTIVE_SCHEDULED_SERVICE_CHECK_STATS : ACTIVE_ONDEMAND_SERVICE_CHECK_STATS, start_time.tv_sec); } /* free memory */ my_free(processed_command); clear_volatile_macros_r(&mac); return runchk_result; } static int get_service_check_return_code(service *temp_service, check_result *queued_check_result) { int rc; char *temp_plugin_output = NULL; log_debug_info(DEBUGL_FUNCTIONS, 0, "get_service_check_return_code()\n"); if(NULL == temp_service || NULL == queued_check_result) { return STATE_UNKNOWN; } /* grab the return code */ rc = queued_check_result->return_code; /* adjust return code (active checks only) */ if(queued_check_result->check_type == CHECK_TYPE_ACTIVE) { if(queued_check_result->early_timeout == TRUE) { logit(NSLOG_RUNTIME_WARNING, TRUE, "Warning: Check of service '%s' on host '%s' timed out after %.3fs!\n", temp_service->description, temp_service->host_name, temp_service->execution_time); my_free(temp_service->plugin_output); my_free(temp_service->long_plugin_output); my_free(temp_service->perf_data); asprintf(&temp_service->plugin_output, "(Service check timed out after %.2lf seconds)", temp_service->execution_time); rc = service_check_timeout_state; } /* if there was some error running the command, just skip it (this shouldn't be happening) */ else if(queued_check_result->exited_ok == FALSE) { logit(NSLOG_RUNTIME_WARNING, TRUE, "Warning: Check of service '%s' on host '%s' did not exit properly!\n", temp_service->description, temp_service->host_name); my_free(temp_service->plugin_output); my_free(temp_service->long_plugin_output); my_free(temp_service->perf_data); temp_service->plugin_output = (char *)strdup("(Service check did not exit properly)"); rc = STATE_CRITICAL; } /* make sure the return code is within bounds */ else if(queued_check_result->return_code < 0 || queued_check_result->return_code > 3) { logit(NSLOG_RUNTIME_WARNING, TRUE, "Warning: Return code of %d for check of service '%s' on host '%s' was out of bounds.%s\n", queued_check_result->return_code, temp_service->description, temp_service->host_name, (queued_check_result->return_code == 126 ? "Make sure the plugin you're trying to run is executable." : (queued_check_result->return_code == 127 ? " Make sure the plugin you're trying to run actually exists." : ""))); asprintf(&temp_plugin_output, "(Return code of %d is out of bounds%s : %s)", queued_check_result->return_code, (queued_check_result->return_code == 126 ? " - plugin may not be executable" : (queued_check_result->return_code == 127 ? " - plugin may be missing" : "")), temp_service->plugin_output); my_free(temp_service->plugin_output); asprintf(&temp_service->plugin_output, "%s)", temp_plugin_output); my_free(temp_plugin_output); my_free(temp_service->long_plugin_output); my_free(temp_service->perf_data); rc = STATE_CRITICAL; } } return rc; } /* handles asynchronous service check results */ int handle_async_service_check_result(service *temp_service, check_result *queued_check_result) { host *temp_host = NULL; time_t next_service_check = 0L; time_t preferred_time = 0L; time_t next_valid_time = 0L; int reschedule_check = FALSE; int state_change = FALSE; int hard_state_change = FALSE; int first_host_check_initiated = FALSE; int route_result = HOST_UP; time_t current_time = 0L; int state_was_logged = FALSE; char *old_plugin_output = NULL; char *temp_plugin_output = NULL; char *temp_ptr = NULL; servicedependency *temp_dependency = NULL; service *master_service = NULL; int flapping_check_done = FALSE; log_debug_info(DEBUGL_FUNCTIONS, 0, "handle_async_service_check_result()\n"); /* make sure we have what we need */ if(temp_service == NULL || queued_check_result == NULL) return ERROR; /* get the current time */ time(¤t_time); if (current_time < temp_service->next_check) next_service_check = temp_service->next_check + check_window(temp_service); else next_service_check = current_time + check_window(temp_service); log_debug_info(DEBUGL_CHECKS, 0, "** Handling check result for service '%s' on host '%s' from '%s'...\n", temp_service->description, temp_service->host_name, check_result_source(queued_check_result)); log_debug_info(DEBUGL_CHECKS, 1, "HOST: %s, SERVICE: %s, CHECK TYPE: %s, OPTIONS: %d, SCHEDULED: %s, RESCHEDULE: %s, EXITED OK: %s, RETURN CODE: %d, OUTPUT: %s\n", temp_service->host_name, temp_service->description, (queued_check_result->check_type == CHECK_TYPE_ACTIVE) ? "Active" : "Passive", queued_check_result->check_options, (queued_check_result->scheduled_check == TRUE) ? "Yes" : "No", (queued_check_result->reschedule_check == TRUE) ? "Yes" : "No", (queued_check_result->exited_ok == TRUE) ? "Yes" : "No", queued_check_result->return_code, queued_check_result->output); /* decrement the number of service checks still out there... */ if(queued_check_result->check_type == CHECK_TYPE_ACTIVE && currently_running_service_checks > 0) currently_running_service_checks--; /* skip this service check results if its passive and we aren't accepting passive check results */ if(queued_check_result->check_type == CHECK_TYPE_PASSIVE) { if(accept_passive_service_checks == FALSE) { log_debug_info(DEBUGL_CHECKS, 0, "Discarding passive service check result because passive service checks are disabled globally.\n"); return ERROR; } if(temp_service->accept_passive_checks == FALSE) { log_debug_info(DEBUGL_CHECKS, 0, "Discarding passive service check result because passive checks are disabled for this service.\n"); return ERROR; } } /* clear the freshening flag (it would have been set if this service was determined to be stale) */ if(queued_check_result->check_options & CHECK_OPTION_FRESHNESS_CHECK) temp_service->is_being_freshened = FALSE; /* clear the execution flag if this was an active check */ if(queued_check_result->check_type == CHECK_TYPE_ACTIVE) temp_service->is_executing = FALSE; /* DISCARD INVALID FRESHNESS CHECK RESULTS */ /* If a services goes stale, Nagios will initiate a forced check in order to freshen it. There is a race condition whereby a passive check could arrive between the 1) initiation of the forced check and 2) the time when the forced check result is processed here. This would make the service fresh again, so we do a quick check to make sure the service is still stale before we accept the check result. */ if((queued_check_result->check_options & CHECK_OPTION_FRESHNESS_CHECK) && is_service_result_fresh(temp_service, current_time, FALSE) == TRUE) { log_debug_info(DEBUGL_CHECKS, 0, "Discarding service freshness check result because the service is currently fresh (race condition avoided).\n"); return OK; } /* check latency is passed to us */ temp_service->latency = queued_check_result->latency; /* update the execution time for this check (millisecond resolution) */ temp_service->execution_time = (double)((double)(queued_check_result->finish_time.tv_sec - queued_check_result->start_time.tv_sec) + (double)((queued_check_result->finish_time.tv_usec - queued_check_result->start_time.tv_usec) / 1000.0) / 1000.0); if(temp_service->execution_time < 0.0) temp_service->execution_time = 0.0; /* get the last check time */ temp_service->last_check = queued_check_result->start_time.tv_sec; /* was this check passive or active? */ temp_service->check_type = (queued_check_result->check_type == CHECK_TYPE_ACTIVE) ? CHECK_TYPE_ACTIVE : CHECK_TYPE_PASSIVE; /* update check statistics for passive checks */ if(queued_check_result->check_type == CHECK_TYPE_PASSIVE) update_check_stats(PASSIVE_SERVICE_CHECK_STATS, queued_check_result->start_time.tv_sec); /* should we reschedule the next service check? NOTE: This may be overridden later... */ reschedule_check = queued_check_result->reschedule_check; /* save the old service status info */ temp_service->last_state = temp_service->current_state; /* save old plugin output */ if(temp_service->plugin_output) old_plugin_output = (char *)strdup(temp_service->plugin_output); /* clear the old plugin output and perf data buffers */ my_free(temp_service->plugin_output); my_free(temp_service->long_plugin_output); my_free(temp_service->perf_data); /* parse check output to get: (1) short output, (2) long output, (3) perf data */ parse_check_output(queued_check_result->output, &temp_service->plugin_output, &temp_service->long_plugin_output, &temp_service->perf_data, TRUE, FALSE); /* make sure the plugin output isn't null */ if(temp_service->plugin_output == NULL) temp_service->plugin_output = (char *)strdup("(No output returned from plugin)"); /* replace semicolons in plugin output (but not performance data) with colons */ else if((temp_ptr = temp_service->plugin_output)) { while((temp_ptr = strchr(temp_ptr, ';'))) * temp_ptr = ':'; } /* grab the return code */ temp_service->current_state = get_service_check_return_code(temp_service, queued_check_result); log_debug_info(DEBUGL_CHECKS, 2, "Parsing check output...\n"); log_debug_info(DEBUGL_CHECKS, 2, "Short Output: %s\n", (temp_service->plugin_output == NULL) ? "NULL" : temp_service->plugin_output); log_debug_info(DEBUGL_CHECKS, 2, "Long Output: %s\n", (temp_service->long_plugin_output == NULL) ? "NULL" : temp_service->long_plugin_output); log_debug_info(DEBUGL_CHECKS, 2, "Perf Data: %s\n", (temp_service->perf_data == NULL) ? "NULL" : temp_service->perf_data); /* record the time the last state ended */ switch(temp_service->last_state) { case STATE_OK: temp_service->last_time_ok = temp_service->last_check; break; case STATE_WARNING: temp_service->last_time_warning = temp_service->last_check; break; case STATE_UNKNOWN: temp_service->last_time_unknown = temp_service->last_check; break; case STATE_CRITICAL: temp_service->last_time_critical = temp_service->last_check; break; default: break; } /* log passive checks - we need to do this here, as some my bypass external commands by getting dropped in checkresults dir */ if(temp_service->check_type == CHECK_TYPE_PASSIVE) { if(log_passive_checks == TRUE) logit(NSLOG_PASSIVE_CHECK, FALSE, "PASSIVE SERVICE CHECK: %s;%s;%d;%s\n", temp_service->host_name, temp_service->description, temp_service->current_state, temp_service->plugin_output); } /* get the host that this service runs on */ temp_host = (host *)temp_service->host_ptr; /* if the service check was okay... */ if(temp_service->current_state == STATE_OK) { /* if the host has never been checked before, verify its status */ /* only do this if 1) the initial state was set to non-UP or 2) the host is not scheduled to be checked soon (next 5 minutes) */ if(temp_host->has_been_checked == FALSE && (temp_host->initial_state != HOST_UP || (unsigned long)temp_host->next_check == 0L || (unsigned long)(temp_host->next_check - current_time) > 300)) { /* set a flag to remember that we launched a check */ first_host_check_initiated = TRUE; schedule_host_check(temp_host, current_time, CHECK_OPTION_DEPENDENCY_CHECK); } } /* increment the current attempt number if this is a soft state (service was rechecked) */ if(temp_service->state_type == SOFT_STATE && (temp_service->current_attempt < temp_service->max_attempts)) temp_service->current_attempt = temp_service->current_attempt + 1; log_debug_info(DEBUGL_CHECKS, 2, "ST: %s CA: %d MA: %d CS: %d LS: %d LHS: %d\n", (temp_service->state_type == SOFT_STATE) ? "SOFT" : "HARD", temp_service->current_attempt, temp_service->max_attempts, temp_service->current_state, temp_service->last_state, temp_service->last_hard_state); /* check for a state change (either soft or hard) */ if(temp_service->current_state != temp_service->last_state) { log_debug_info(DEBUGL_CHECKS, 2, "Service has changed state since last check!\n"); state_change = TRUE; } /* checks for a hard state change where host was down at last service check */ /* this occurs in the case where host goes down and service current attempt gets reset to 1 */ /* if this check is not made, the service recovery looks like a soft recovery instead of a hard one */ if(temp_service->host_problem_at_last_check == TRUE && temp_service->current_state == STATE_OK) { log_debug_info(DEBUGL_CHECKS, 2, "Service had a HARD STATE CHANGE!!\n"); hard_state_change = TRUE; } /* check for a "normal" hard state change where max check attempts is reached */ if(temp_service->current_attempt >= temp_service->max_attempts && temp_service->current_state != temp_service->last_hard_state) { log_debug_info(DEBUGL_CHECKS, 2, "Service had a HARD STATE CHANGE!!\n"); hard_state_change = TRUE; } /* a state change occurred... */ /* reset last and next notification times and acknowledgement flag if necessary, misc other stuff */ if(state_change == TRUE || hard_state_change == TRUE) { /* reschedule the service check */ reschedule_check = TRUE; /* reset notification times */ temp_service->last_notification = (time_t)0; temp_service->next_notification = (time_t)0; /* reset notification suppression option */ temp_service->no_more_notifications = FALSE; if(temp_service->acknowledgement_type == ACKNOWLEDGEMENT_NORMAL && (state_change == TRUE || hard_state_change == FALSE)) { temp_service->problem_has_been_acknowledged = FALSE; temp_service->acknowledgement_type = ACKNOWLEDGEMENT_NONE; /* remove any non-persistant comments associated with the ack */ delete_service_acknowledgement_comments(temp_service); } else if(temp_service->acknowledgement_type == ACKNOWLEDGEMENT_STICKY && temp_service->current_state == STATE_OK) { temp_service->problem_has_been_acknowledged = FALSE; temp_service->acknowledgement_type = ACKNOWLEDGEMENT_NONE; /* remove any non-persistant comments associated with the ack */ delete_service_acknowledgement_comments(temp_service); } /* * hard changes between non-OK states should continue * to be escalated, so don't reset current notification number */ } /* initialize the last host and service state change times if necessary */ if(temp_service->last_state_change == (time_t)0) temp_service->last_state_change = temp_service->last_check; if(temp_service->last_hard_state_change == (time_t)0) temp_service->last_hard_state_change = temp_service->last_check; if(temp_host->last_state_change == (time_t)0) temp_host->last_state_change = temp_service->last_check; if(temp_host->last_hard_state_change == (time_t)0) temp_host->last_hard_state_change = temp_service->last_check; /* update last service state change times */ if(state_change == TRUE) temp_service->last_state_change = temp_service->last_check; if(hard_state_change == TRUE) temp_service->last_hard_state_change = temp_service->last_check; /* update the event and problem ids */ if(state_change == TRUE) { /* always update the event id on a state change */ temp_service->last_event_id = temp_service->current_event_id; temp_service->current_event_id = next_event_id; next_event_id++; /* update the problem id when transitioning to a problem state */ if(temp_service->last_state == STATE_OK) { /* don't reset last problem id, or it will be zero the next time a problem is encountered */ temp_service->current_problem_id = next_problem_id; next_problem_id++; } /* clear the problem id when transitioning from a problem state to an OK state */ if(temp_service->current_state == STATE_OK) { temp_service->last_problem_id = temp_service->current_problem_id; temp_service->current_problem_id = 0L; } } /**************************************/ /******* SERVICE CHECK OK LOGIC *******/ /**************************************/ /* if the service is up and running OK... */ if(temp_service->current_state == STATE_OK) { log_debug_info(DEBUGL_CHECKS, 1, "Service is OK.\n"); /* reset the acknowledgement flag (this should already have been done, but just in case...) */ temp_service->problem_has_been_acknowledged = FALSE; temp_service->acknowledgement_type = ACKNOWLEDGEMENT_NONE; /* verify the route to the host and send out host recovery notifications */ if(temp_host->current_state != HOST_UP) { log_debug_info(DEBUGL_CHECKS, 1, "Host is NOT UP, so we'll check it to see if it recovered...\n"); if(first_host_check_initiated == TRUE) log_debug_info(DEBUGL_CHECKS, 1, "First host check was already initiated, so we'll skip a new host check.\n"); else { /* can we use the last cached host state? */ /* usually only use cached host state if no service state change has occurred */ if(state_change == FALSE && temp_host->has_been_checked == TRUE && ((current_time - temp_host->last_check) <= cached_host_check_horizon)) { log_debug_info(DEBUGL_CHECKS, 1, "* Using cached host state: %d\n", temp_host->current_state); update_check_stats(ACTIVE_ONDEMAND_HOST_CHECK_STATS, current_time); update_check_stats(ACTIVE_CACHED_HOST_CHECK_STATS, current_time); } /* else launch an async (parallel) check of the host */ else schedule_host_check(temp_host, current_time, CHECK_OPTION_DEPENDENCY_CHECK); } } /* if a hard service recovery has occurred... */ if(hard_state_change == TRUE) { log_debug_info(DEBUGL_CHECKS, 1, "Service experienced a HARD RECOVERY.\n"); /* set the state type macro */ temp_service->state_type = HARD_STATE; /* log the service recovery */ log_service_event(temp_service); state_was_logged = TRUE; /* 10/04/07 check to see if the service and/or associate host is flapping */ /* this should be done before a notification is sent out to ensure the host didn't just start flapping */ check_for_service_flapping(temp_service, TRUE, TRUE); check_for_host_flapping(temp_host, TRUE, FALSE, TRUE); flapping_check_done = TRUE; /* notify contacts about the service recovery */ service_notification(temp_service, NOTIFICATION_NORMAL, NULL, NULL, NOTIFICATION_OPTION_NONE); /* run the service event handler to handle the hard state change */ handle_service_event(temp_service); } /* else if a soft service recovery has occurred... */ else if(state_change == TRUE) { log_debug_info(DEBUGL_CHECKS, 1, "Service experienced a SOFT RECOVERY.\n"); /* this is a soft recovery */ temp_service->state_type = SOFT_STATE; /* log the soft recovery */ log_service_event(temp_service); state_was_logged = TRUE; /* run the service event handler to handle the soft state change */ handle_service_event(temp_service); } /* else no service state change has occurred... */ else { log_debug_info(DEBUGL_CHECKS, 1, "Service did not change state.\n"); } /* should we obsessive over service checks? */ if(obsess_over_services == TRUE) obsessive_compulsive_service_check_processor(temp_service); /* reset all service variables because its okay now... */ temp_service->host_problem_at_last_check = FALSE; temp_service->current_attempt = 1; temp_service->state_type = HARD_STATE; temp_service->last_hard_state = STATE_OK; temp_service->last_notification = (time_t)0; temp_service->next_notification = (time_t)0; temp_service->current_notification_number = 0; temp_service->problem_has_been_acknowledged = FALSE; temp_service->acknowledgement_type = ACKNOWLEDGEMENT_NONE; temp_service->notified_on = 0; if(reschedule_check == TRUE) next_service_check = (time_t)(temp_service->last_check + (temp_service->check_interval * interval_length)); } /*******************************************/ /******* SERVICE CHECK PROBLEM LOGIC *******/ /*******************************************/ /* hey, something's not working quite like it should... */ else { log_debug_info(DEBUGL_CHECKS, 1, "Service is in a non-OK state!\n"); /* check the route to the host if its up right now... */ if(temp_host->current_state == HOST_UP) { log_debug_info(DEBUGL_CHECKS, 1, "Host is currently UP, so we'll recheck its state to make sure...\n"); /* only run a new check if we can and have to */ if(execute_host_checks && state_change == TRUE && temp_host->last_check + cached_host_check_horizon < current_time) { schedule_host_check(temp_host, current_time, CHECK_OPTION_DEPENDENCY_CHECK); } else { log_debug_info(DEBUGL_CHECKS, 1, "* Using cached host state: %d\n", temp_host->current_state); route_result = temp_host->current_state; update_check_stats(ACTIVE_ONDEMAND_HOST_CHECK_STATS, current_time); update_check_stats(ACTIVE_CACHED_HOST_CHECK_STATS, current_time); } } /* else the host is either down or unreachable, so recheck it if necessary */ else { log_debug_info(DEBUGL_CHECKS, 1, "Host is currently %s.\n", host_state_name(temp_host->current_state)); if(execute_host_checks && state_change == TRUE) { schedule_host_check(temp_host, current_time, CHECK_OPTION_NONE); } /* else fake the host check, but (possibly) resend host notifications to contacts... */ else { log_debug_info(DEBUGL_CHECKS, 1, "Assuming host is in same state as before...\n"); /* if the host has never been checked before, set the checked flag and last check time */ /* This probably never evaluates to FALSE, present for historical reasons only, can probably be removed in the future */ if(temp_host->has_been_checked == FALSE) { temp_host->has_been_checked = TRUE; temp_host->last_check = temp_service->last_check; } /* fake the route check result */ route_result = temp_host->current_state; /* possibly re-send host notifications... */ host_notification(temp_host, NOTIFICATION_NORMAL, NULL, NULL, NOTIFICATION_OPTION_NONE); } } /* if the host is down or unreachable ... */ if(route_result != HOST_UP) { if (temp_host->state_type == HARD_STATE) { log_debug_info(DEBUGL_CHECKS, 2, "Host is not UP, so we mark state changes if appropriate\n"); /* "fake" a hard state change for the service - well, its not really fake, but it didn't get caught earlier... */ if(temp_service->last_hard_state != temp_service->current_state) hard_state_change = TRUE; /* update last state change times */ if(state_change == TRUE || hard_state_change == TRUE) temp_service->last_state_change = temp_service->last_check; if(hard_state_change == TRUE) { temp_service->last_hard_state_change = temp_service->last_check; temp_service->state_type = HARD_STATE; temp_service->last_hard_state = temp_service->current_state; } /* put service into a hard state without attempting check retries and don't send out notifications about it */ temp_service->host_problem_at_last_check = TRUE; } else if (temp_service->last_state == STATE_OK) temp_service->state_type = SOFT_STATE; } /* the host is up - it recovered since the last time the service was checked... */ else if(temp_service->host_problem_at_last_check == TRUE) { /* next time the service is checked we shouldn't get into this same case... */ temp_service->host_problem_at_last_check = FALSE; /* reset the current check counter, so we give the service a chance */ /* this helps prevent the case where service has N max check attempts, N-1 of which have already occurred. */ /* if we didn't do this, the next check might fail and result in a hard problem - we should really give it more time */ /* ADDED IF STATEMENT 01-17-05 EG */ /* 01-17-05: Services in hard problem states before hosts went down would sometimes come back as soft problem states after */ /* the hosts recovered. This caused problems, so hopefully this will fix it */ if(temp_service->state_type == SOFT_STATE) temp_service->current_attempt = 1; } log_debug_info(DEBUGL_CHECKS, 1, "Current/Max Attempt(s): %d/%d\n", temp_service->current_attempt, temp_service->max_attempts); /* if we should retry the service check, do so (except if the host is down or unreachable!) */ if(temp_service->current_attempt < temp_service->max_attempts) { /* the host is down or unreachable, so don't attempt to retry the service check */ if(route_result != HOST_UP) { log_debug_info(DEBUGL_CHECKS, 1, "Host isn't UP, so we won't retry the service check...\n"); /* the host is not up, so reschedule the next service check at regular interval */ if(reschedule_check == TRUE) next_service_check = (time_t)(temp_service->last_check + (temp_service->check_interval * interval_length)); /* log the problem as a hard state if the host just went down */ if(hard_state_change == TRUE) { log_service_event(temp_service); state_was_logged = TRUE; /* run the service event handler to handle the hard state */ handle_service_event(temp_service); } } /* the host is up, so continue to retry the service check */ else { log_debug_info(DEBUGL_CHECKS, 1, "Host is UP, so we'll retry the service check...\n"); /* this is a soft state */ temp_service->state_type = SOFT_STATE; /* log the service check retry */ log_service_event(temp_service); state_was_logged = TRUE; /* run the service event handler to handle the soft state */ handle_service_event(temp_service); if(reschedule_check == TRUE) next_service_check = (time_t)(temp_service->last_check + (temp_service->retry_interval * interval_length)); } /* perform dependency checks on the second to last check of the service */ if(execute_service_checks && enable_predictive_service_dependency_checks == TRUE && temp_service->current_attempt == (temp_service->max_attempts - 1)) { objectlist *list; log_debug_info(DEBUGL_CHECKS, 1, "Looking for services to check for predictive dependency checks...\n"); /* check services that THIS ONE depends on for notification AND execution */ /* we do this because we might be sending out a notification soon and we want the dependency logic to be accurate */ for(list = temp_service->exec_deps; list; list = list->next) { temp_dependency = (servicedependency *)list->object_ptr; if(temp_dependency->dependent_service_ptr == temp_service && temp_dependency->master_service_ptr != NULL) { master_service = (service *)temp_dependency->master_service_ptr; log_debug_info(DEBUGL_CHECKS, 2, "Predictive check of service '%s' on host '%s' queued.\n", master_service->description, master_service->host_name); schedule_service_check(master_service, current_time, CHECK_OPTION_DEPENDENCY_CHECK); } } for(list = temp_service->notify_deps; list; list = list->next) { temp_dependency = (servicedependency *)list->object_ptr; if(temp_dependency->dependent_service_ptr == temp_service && temp_dependency->master_service_ptr != NULL) { master_service = (service *)temp_dependency->master_service_ptr; log_debug_info(DEBUGL_CHECKS, 2, "Predictive check of service '%s' on host '%s' queued.\n", master_service->description, master_service->host_name); schedule_service_check(master_service, current_time, CHECK_OPTION_DEPENDENCY_CHECK); } } } } /* we've reached the maximum number of service rechecks, so handle the error */ else { log_debug_info(DEBUGL_CHECKS, 1, "Service has reached max number of rechecks, so we'll handle the error...\n"); /* this is a hard state */ temp_service->state_type = HARD_STATE; /* check for start of flexible (non-fixed) scheduled downtime if we just had a hard error */ /* we need to check for both, state_change (SOFT) and hard_state_change (HARD) values */ if((hard_state_change == TRUE || state_change == TRUE) && temp_service->pending_flex_downtime > 0) check_pending_flex_service_downtime(temp_service); /* if we've hard a hard state change... */ if(hard_state_change == TRUE) { /* log the service problem (even if host is not up, which is new in 0.0.5) */ log_service_event(temp_service); state_was_logged = TRUE; } /* else log the problem (again) if this service is flagged as being volatile */ else if(temp_service->is_volatile == TRUE) { log_service_event(temp_service); state_was_logged = TRUE; } /* 10/04/07 check to see if the service and/or associate host is flapping */ /* this should be done before a notification is sent out to ensure the host didn't just start flapping */ check_for_service_flapping(temp_service, TRUE, TRUE); check_for_host_flapping(temp_host, TRUE, FALSE, TRUE); flapping_check_done = TRUE; /* (re)send notifications out about this service problem if the host is up (and was at last check also) and the dependencies were okay... */ service_notification(temp_service, NOTIFICATION_NORMAL, NULL, NULL, NOTIFICATION_OPTION_NONE); /* run the service event handler if we changed state from the last hard state or if this service is flagged as being volatile */ if(hard_state_change == TRUE || temp_service->is_volatile == TRUE) handle_service_event(temp_service); /* save the last hard state */ temp_service->last_hard_state = temp_service->current_state; /* reschedule the next check at the regular interval */ if(reschedule_check == TRUE) next_service_check = (time_t)(temp_service->last_check + (temp_service->check_interval * interval_length)); } /* should we obsessive over service checks? */ if(obsess_over_services == TRUE) obsessive_compulsive_service_check_processor(temp_service); } /* reschedule the next service check ONLY for active, scheduled checks */ if(reschedule_check == TRUE) { log_debug_info(DEBUGL_CHECKS, 1, "Rescheduling next check of service at %s", ctime(&next_service_check)); /* default is to reschedule service check unless a test below fails... */ temp_service->should_be_scheduled = TRUE; /* next check time was calculated above */ temp_service->next_check = next_service_check; /* make sure we don't get ourselves into too much trouble... */ if(current_time > temp_service->next_check) temp_service->next_check = current_time; /* make sure we rescheduled the next service check at a valid time */ preferred_time = temp_service->next_check; get_next_valid_time(preferred_time, &next_valid_time, temp_service->check_period_ptr); temp_service->next_check = next_valid_time; if(next_valid_time > preferred_time) { /* Next valid time is further in the future because of timeperiod * constraints. Add a random amount so we don't get all checks * subject to that timeperiod constraint scheduled at the same time */ temp_service->next_check += ranged_urand(0, check_window(temp_service)); } /* services with non-recurring intervals do not get rescheduled */ if(temp_service->check_interval == 0) temp_service->should_be_scheduled = FALSE; /* services with active checks disabled do not get rescheduled */ if(temp_service->checks_enabled == FALSE) temp_service->should_be_scheduled = FALSE; /* schedule a non-forced check if we can */ if(temp_service->should_be_scheduled == TRUE) schedule_service_check(temp_service, temp_service->next_check, CHECK_OPTION_NONE); } /* if we're stalking this state type and state was not already logged AND the plugin output changed since last check, log it now.. */ if(temp_service->state_type == HARD_STATE && state_change == FALSE && state_was_logged == FALSE && compare_strings(old_plugin_output, temp_service->plugin_output)) { if(should_stalk(temp_service)) log_service_event(temp_service); } #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_service_check(NEBTYPE_SERVICECHECK_PROCESSED, NEBFLAG_NONE, NEBATTR_NONE, temp_service, temp_service->check_type, queued_check_result->start_time, queued_check_result->finish_time, NULL, temp_service->latency, temp_service->execution_time, service_check_timeout, queued_check_result->early_timeout, queued_check_result->return_code, NULL, NULL, queued_check_result); #endif /* set the checked flag */ temp_service->has_been_checked = TRUE; /* update the current service status log */ update_service_status(temp_service, FALSE); /* check to see if the service and/or associate host is flapping */ if(flapping_check_done == FALSE) { check_for_service_flapping(temp_service, TRUE, TRUE); check_for_host_flapping(temp_host, TRUE, FALSE, TRUE); } /* update service performance info */ update_service_performance_data(temp_service); /* free allocated memory */ my_free(temp_plugin_output); my_free(old_plugin_output); return OK; } /* schedules an immediate or delayed service check */ void schedule_service_check(service *svc, time_t check_time, int options) { timed_event *temp_event = NULL; int use_original_event = TRUE; log_debug_info(DEBUGL_FUNCTIONS, 0, "schedule_service_check()\n"); if(svc == NULL) return; log_debug_info(DEBUGL_CHECKS, 0, "Scheduling a %s, active check of service '%s' on host '%s' @ %s", (options & CHECK_OPTION_FORCE_EXECUTION) ? "forced" : "non-forced", svc->description, svc->host_name, ctime(&check_time)); /* don't schedule a check if active checks of this service are disabled */ if(svc->checks_enabled == FALSE && !(options & CHECK_OPTION_FORCE_EXECUTION)) { log_debug_info(DEBUGL_CHECKS, 0, "Active checks of this service are disabled.\n"); return; } /* we may have to nudge this check a bit */ if (options == CHECK_OPTION_DEPENDENCY_CHECK) { if (svc->last_check + cached_service_check_horizon > check_time) { log_debug_info(DEBUGL_CHECKS, 0, "Last check result is recent enough (%s)", ctime(&svc->last_check)); return; } } /* default is to use the new event */ use_original_event = FALSE; temp_event = (timed_event *)svc->next_check_event; /* * If the service already has a check scheduled, * we need to decide which of the events to use */ if(temp_event != NULL) { log_debug_info(DEBUGL_CHECKS, 2, "Found another service check event for this service @ %s", ctime(&temp_event->run_time)); /* use the originally scheduled check unless we decide otherwise */ use_original_event = TRUE; /* the original event is a forced check... */ if((temp_event->event_options & CHECK_OPTION_FORCE_EXECUTION)) { /* the new event is also forced and its execution time is earlier than the original, so use it instead */ if((options & CHECK_OPTION_FORCE_EXECUTION) && (check_time < temp_event->run_time)) { use_original_event = FALSE; log_debug_info(DEBUGL_CHECKS, 2, "New service check event is forced and occurs before the existing event, so the new event will be used instead.\n"); } } /* the original event is not a forced check... */ else { /* the new event is a forced check, so use it instead */ if((options & CHECK_OPTION_FORCE_EXECUTION)) { use_original_event = FALSE; log_debug_info(DEBUGL_CHECKS, 2, "New service check event is forced, so it will be used instead of the existing event.\n"); } /* the new event is not forced either and its execution time is earlier than the original, so use it instead */ else if(check_time < temp_event->run_time) { use_original_event = FALSE; log_debug_info(DEBUGL_CHECKS, 2, "New service check event occurs before the existing (older) event, so it will be used instead.\n"); } /* the new event is older, so override the existing one */ else { log_debug_info(DEBUGL_CHECKS, 2, "New service check event occurs after the existing event, so we'll ignore it.\n"); } } } /* schedule a new event */ if(use_original_event == FALSE) { /* make sure we remove the old event from the queue */ if(temp_event) { remove_event(nagios_squeue, temp_event); } else { /* allocate memory for a new event item */ temp_event = (timed_event *)calloc(1, sizeof(timed_event)); if(temp_event == NULL) { logit(NSLOG_RUNTIME_WARNING, TRUE, "Warning: Could not reschedule check of service '%s' on host '%s'!\n", svc->description, svc->host_name); return; } } log_debug_info(DEBUGL_CHECKS, 2, "Scheduling new service check event.\n"); /* set the next service check event and time */ svc->next_check_event = temp_event; svc->next_check = check_time; /* save check options for retention purposes */ svc->check_options = options; /* place the new event in the event queue */ temp_event->event_type = EVENT_SERVICE_CHECK; temp_event->event_data = (void *)svc; temp_event->event_args = (void *)NULL; temp_event->event_options = options; temp_event->run_time = svc->next_check; temp_event->recurring = FALSE; temp_event->event_interval = 0L; temp_event->timing_func = NULL; temp_event->compensate_for_time_change = TRUE; add_event(nagios_squeue, temp_event); } else { /* reset the next check time (it may be out of sync) */ if(temp_event != NULL) svc->next_check = temp_event->run_time; log_debug_info(DEBUGL_CHECKS, 2, "Keeping original service check event (ignoring the new one).\n"); } /* update the status log */ update_service_status(svc, FALSE); return; } /* checks viability of performing a service check */ int check_service_check_viability(service *svc, int check_options, int *time_is_valid, time_t *new_time) { int result = OK; int perform_check = TRUE; time_t current_time = 0L; time_t preferred_time = 0L; int check_interval = 0; host *temp_host = NULL; log_debug_info(DEBUGL_FUNCTIONS, 0, "check_service_check_viability()\n"); /* make sure we have a service */ if(svc == NULL) return ERROR; /* get the check interval to use if we need to reschedule the check */ if(svc->state_type == SOFT_STATE && svc->current_state != STATE_OK) check_interval = (svc->retry_interval * interval_length); else check_interval = (svc->check_interval * interval_length); /* get the current time */ time(¤t_time); /* initialize the next preferred check time */ preferred_time = current_time; /* can we check the host right now? */ if(!(check_options & CHECK_OPTION_FORCE_EXECUTION)) { /* if checks of the service are currently disabled... */ if(svc->checks_enabled == FALSE) { preferred_time = current_time + check_interval; perform_check = FALSE; log_debug_info(DEBUGL_CHECKS, 2, "Active checks of the service are currently disabled.\n"); } /* make sure this is a valid time to check the service */ if(check_time_against_period((unsigned long)current_time, svc->check_period_ptr) == ERROR) { preferred_time = current_time; if(time_is_valid) *time_is_valid = FALSE; perform_check = FALSE; log_debug_info(DEBUGL_CHECKS, 2, "This is not a valid time for this service to be actively checked.\n"); } /* check service dependencies for execution */ if(check_service_dependencies(svc, EXECUTION_DEPENDENCY) == DEPENDENCIES_FAILED) { preferred_time = current_time + check_interval; perform_check = FALSE; log_debug_info(DEBUGL_CHECKS, 2, "Execution dependencies for this service failed, so it will not be actively checked.\n"); } } /* check if parent service is OK */ if(check_service_parents(svc) == DEPENDENCIES_FAILED) { preferred_time = current_time + check_interval; perform_check = FALSE; log_debug_info(DEBUGL_CHECKS, 2, "Execution parents for this service failed, so it will not be actively checked.\n"); } /* check if host is up - if not, do not perform check */ if(host_down_disable_service_checks) { if((temp_host = svc->host_ptr) == NULL) { log_debug_info(DEBUGL_CHECKS, 2, "Host pointer NULL in check_service_check_viability().\n"); return ERROR; } else { if(temp_host->current_state != HOST_UP) { log_debug_info(DEBUGL_CHECKS, 2, "Host state not UP, so service check will not be performed - will be rescheduled as normal.\n"); perform_check = FALSE; } } } /* pass back the next viable check time */ if(new_time) *new_time = preferred_time; result = (perform_check == TRUE) ? OK : ERROR; return result; } /* checks service parents */ int check_service_parents(service *svc) { servicesmember *temp_servicesmember = NULL; int state = STATE_OK; log_debug_info(DEBUGL_FUNCTIONS, 0, "check_service_parents()\n"); /* check all parents... */ for(temp_servicesmember = svc->parents; temp_servicesmember; temp_servicesmember = temp_servicesmember->next) { service *parent_service; /* find the service we depend on... */ if((parent_service = temp_servicesmember->service_ptr) == NULL) { logit(NSLOG_RUNTIME_WARNING, TRUE, "Warning: service '%s' on host '%s' is NULL ptr\n", temp_servicesmember->service_description, temp_servicesmember->host_name); continue; } state = parent_service->last_hard_state; /* is the service we depend on in a state that fails the dependency tests? */ if((state == STATE_CRITICAL) || (state == STATE_UNKNOWN)) return DEPENDENCIES_FAILED; if(check_service_parents(parent_service) != DEPENDENCIES_OK) return DEPENDENCIES_FAILED; } return DEPENDENCIES_OK; } /* checks service dependencies */ int check_service_dependencies(service *svc, int dependency_type) { objectlist *list; int state = STATE_OK; time_t current_time = 0L; log_debug_info(DEBUGL_FUNCTIONS, 0, "check_service_dependencies()\n"); /* only check dependencies of the desired type */ if(dependency_type == NOTIFICATION_DEPENDENCY) list = svc->notify_deps; else list = svc->exec_deps; /* check all dependencies of the desired type... */ for(; list; list = list->next) { service *temp_service; servicedependency *temp_dependency = (servicedependency *)list->object_ptr; /* find the service we depend on... */ if((temp_service = temp_dependency->master_service_ptr) == NULL) continue; /* skip this dependency if it has a timeperiod and the current time isn't valid */ time(¤t_time); if(temp_dependency->dependency_period != NULL && check_time_against_period(current_time, temp_dependency->dependency_period_ptr) == ERROR) return FALSE; /* get the status to use (use last hard state if its currently in a soft state) */ if(temp_service->state_type == SOFT_STATE && soft_state_dependencies == FALSE) state = temp_service->last_hard_state; else state = temp_service->current_state; /* is the service we depend on in state that fails the dependency tests? */ if(flag_isset(temp_dependency->failure_options, 1 << state)) return DEPENDENCIES_FAILED; /* immediate dependencies ok at this point - check parent dependencies if necessary */ if(temp_dependency->inherits_parent == TRUE) { if(check_service_dependencies(temp_service, dependency_type) != DEPENDENCIES_OK) return DEPENDENCIES_FAILED; } } return DEPENDENCIES_OK; } /* check for services that never returned from a check... */ void check_for_orphaned_services(void) { service *temp_service = NULL; time_t current_time = 0L; time_t expected_time = 0L; log_debug_info(DEBUGL_FUNCTIONS, 0, "check_for_orphaned_services()\n"); /* get the current time */ time(¤t_time); /* check all services... */ for(temp_service = service_list; temp_service != NULL; temp_service = temp_service->next) { /* skip services that are not currently executing */ if(temp_service->is_executing == FALSE) continue; /* determine the time at which the check results should have come in (allow 10 minutes slack time) */ expected_time = (time_t)(temp_service->next_check + temp_service->latency + service_check_timeout + check_reaper_interval + 600); /* this service was supposed to have executed a while ago, but for some reason the results haven't come back in... */ if(expected_time < current_time) { /* log a warning */ logit(NSLOG_RUNTIME_WARNING, TRUE, "Warning: The check of service '%s' on host '%s' looks like it was orphaned (results never came back; last_check=%lu; next_check=%lu). I'm scheduling an immediate check of the service...\n", temp_service->description, temp_service->host_name, temp_service->last_check, temp_service->next_check); log_debug_info(DEBUGL_CHECKS, 1, "Service '%s' on host '%s' was orphaned, so we're scheduling an immediate check...\n", temp_service->description, temp_service->host_name); log_debug_info(DEBUGL_CHECKS, 1, " next_check=%lu (%s); last_check=%lu (%s);\n", temp_service->next_check, ctime(&temp_service->next_check), temp_service->last_check, ctime(&temp_service->last_check)); /* decrement the number of running service checks */ if(currently_running_service_checks > 0) currently_running_service_checks--; /* disable the executing flag */ temp_service->is_executing = FALSE; /* schedule an immediate check of the service */ schedule_service_check(temp_service, current_time, CHECK_OPTION_ORPHAN_CHECK); } } return; } /* check freshness of service results */ void check_service_result_freshness(void) { service *temp_service = NULL; time_t current_time = 0L; log_debug_info(DEBUGL_FUNCTIONS, 0, "check_service_result_freshness()\n"); log_debug_info(DEBUGL_CHECKS, 1, "Checking the freshness of service check results...\n"); /* bail out if we're not supposed to be checking freshness */ if(check_service_freshness == FALSE) { log_debug_info(DEBUGL_CHECKS, 1, "Service freshness checking is disabled.\n"); return; } /* get the current time */ time(¤t_time); /* check all services... */ for(temp_service = service_list; temp_service != NULL; temp_service = temp_service->next) { /* skip services we shouldn't be checking for freshness */ if(temp_service->check_freshness == FALSE) continue; /* skip services that are currently executing (problems here will be caught by orphaned service check) */ if(temp_service->is_executing == TRUE) continue; /* skip services that have both active and passive checks disabled */ if(temp_service->checks_enabled == FALSE && temp_service->accept_passive_checks == FALSE) continue; /* skip services that are already being freshened */ if(temp_service->is_being_freshened == TRUE) continue; /* see if the time is right... */ if(check_time_against_period(current_time, temp_service->check_period_ptr) == ERROR) continue; /* EXCEPTION */ /* don't check freshness of services without regular check intervals if we're using auto-freshness threshold */ if(temp_service->check_interval == 0 && temp_service->freshness_threshold == 0) continue; /* the results for the last check of this service are stale! */ if(is_service_result_fresh(temp_service, current_time, TRUE) == FALSE) { /* set the freshen flag */ temp_service->is_being_freshened = TRUE; /* schedule an immediate forced check of the service */ schedule_service_check(temp_service, current_time, CHECK_OPTION_FORCE_EXECUTION | CHECK_OPTION_FRESHNESS_CHECK); } } return; } /* tests whether or not a service's check results are fresh */ int is_service_result_fresh(service *temp_service, time_t current_time, int log_this) { int freshness_threshold = 0; time_t expiration_time = 0L; int days = 0; int hours = 0; int minutes = 0; int seconds = 0; int tdays = 0; int thours = 0; int tminutes = 0; int tseconds = 0; log_debug_info(DEBUGL_CHECKS, 2, "Checking freshness of service '%s' on host '%s'...\n", temp_service->description, temp_service->host_name); /* use user-supplied freshness threshold or auto-calculate a freshness threshold to use? */ if(temp_service->freshness_threshold == 0) { if(temp_service->state_type == HARD_STATE || temp_service->current_state == STATE_OK) freshness_threshold = (temp_service->check_interval * interval_length) + temp_service->latency + additional_freshness_latency; else freshness_threshold = (temp_service->retry_interval * interval_length) + temp_service->latency + additional_freshness_latency; } else freshness_threshold = temp_service->freshness_threshold; log_debug_info(DEBUGL_CHECKS, 2, "Freshness thresholds: service=%d, use=%d\n", temp_service->freshness_threshold, freshness_threshold); /* calculate expiration time */ /* * CHANGED 11/10/05 EG - * program start is only used in expiration time calculation * if > last check AND active checks are enabled, so active checks * can become stale immediately upon program startup */ /* * CHANGED 02/25/06 SG - * passive checks also become stale, so remove dependence on active * check logic */ if(temp_service->has_been_checked == FALSE) expiration_time = (time_t)(event_start + freshness_threshold); /* * CHANGED 06/19/07 EG - * Per Ton's suggestion (and user requests), only use program start * time over last check if no specific threshold has been set by user. * Problems can occur if Nagios is restarted more frequently that * freshness threshold intervals (services never go stale). */ /* * CHANGED 10/07/07 EG: * Only match next condition for services that * have active checks enabled... */ /* * CHANGED 10/07/07 EG: * Added max_service_check_spread to expiration time as suggested * by Altinity */ else if(temp_service->checks_enabled == TRUE && event_start > temp_service->last_check && temp_service->freshness_threshold == 0) expiration_time = (time_t)(event_start + freshness_threshold + (max_service_check_spread * interval_length)); else expiration_time = (time_t)(temp_service->last_check + freshness_threshold); /* * If the check was last done passively, we assume it's going * to continue that way and we need to handle the fact that * Nagios might have been shut off for quite a long time. If so, * we mustn't spam freshness notifications but use event_start * instead of last_check to determine freshness expiration time. * The threshold for "long time" is determined as 61.8% of the normal * freshness threshold based on vast heuristical research (ie, "some * guy once told me the golden ratio is good for loads of stuff"). */ if (temp_service->check_type == CHECK_TYPE_PASSIVE) { if (temp_service->last_check < event_start && event_start - last_program_stop > freshness_threshold * 0.618) { expiration_time = event_start + freshness_threshold; } } log_debug_info(DEBUGL_CHECKS, 2, "HBC: %d, PS: %lu, ES: %lu, LC: %lu, CT: %lu, ET: %lu\n", temp_service->has_been_checked, (unsigned long)program_start, (unsigned long)event_start, (unsigned long)temp_service->last_check, (unsigned long)current_time, (unsigned long)expiration_time); /* the results for the last check of this service are stale */ if(expiration_time < current_time) { get_time_breakdown((current_time - expiration_time), &days, &hours, &minutes, &seconds); get_time_breakdown(freshness_threshold, &tdays, &thours, &tminutes, &tseconds); /* log a warning */ if(log_this == TRUE) logit(NSLOG_RUNTIME_WARNING, TRUE, "Warning: The results of service '%s' on host '%s' are stale by %dd %dh %dm %ds (threshold=%dd %dh %dm %ds). I'm forcing an immediate check of the service.\n", temp_service->description, temp_service->host_name, days, hours, minutes, seconds, tdays, thours, tminutes, tseconds); log_debug_info(DEBUGL_CHECKS, 1, "Check results for service '%s' on host '%s' are stale by %dd %dh %dm %ds (threshold=%dd %dh %dm %ds). Forcing an immediate check of the service...\n", temp_service->description, temp_service->host_name, days, hours, minutes, seconds, tdays, thours, tminutes, tseconds); return FALSE; } log_debug_info(DEBUGL_CHECKS, 1, "Check results for service '%s' on host '%s' are fresh.\n", temp_service->description, temp_service->host_name); return TRUE; } /******************************************************************/ /*************** COMMON ROUTE/HOST CHECK FUNCTIONS ****************/ /******************************************************************/ /* schedules an immediate or delayed host check */ void schedule_host_check(host *hst, time_t check_time, int options) { timed_event *temp_event = NULL; int use_original_event = TRUE; log_debug_info(DEBUGL_FUNCTIONS, 0, "schedule_host_check()\n"); if(hst == NULL) return; log_debug_info(DEBUGL_CHECKS, 0, "Scheduling a %s, active check of host '%s' @ %s", (options & CHECK_OPTION_FORCE_EXECUTION) ? "forced" : "non-forced", hst->name, ctime(&check_time)); /* don't schedule a check if active checks of this host are disabled */ if(hst->checks_enabled == FALSE && !(options & CHECK_OPTION_FORCE_EXECUTION)) { log_debug_info(DEBUGL_CHECKS, 0, "Active checks are disabled for this host.\n"); return; } if (options == CHECK_OPTION_DEPENDENCY_CHECK) { if (hst->last_check + cached_host_check_horizon > check_time) { log_debug_info(DEBUGL_CHECKS, 0, "Last check result is recent enough (%s)\n", ctime(&hst->last_check)); return; } } /* default is to use the new event */ use_original_event = FALSE; temp_event = (timed_event *)hst->next_check_event; /* * If the host already had a check scheduled we need * to decide which check event to use */ if(temp_event != NULL) { log_debug_info(DEBUGL_CHECKS, 2, "Found another host check event for this host @ %s", ctime(&temp_event->run_time)); /* use the originally scheduled check unless we decide otherwise */ use_original_event = TRUE; /* the original event is a forced check... */ if((temp_event->event_options & CHECK_OPTION_FORCE_EXECUTION)) { /* the new event is also forced and its execution time is earlier than the original, so use it instead */ if((options & CHECK_OPTION_FORCE_EXECUTION) && (check_time < temp_event->run_time)) { log_debug_info(DEBUGL_CHECKS, 2, "New host check event is forced and occurs before the existing event, so the new event be used instead.\n"); use_original_event = FALSE; } } /* the original event is not a forced check... */ else { /* the new event is a forced check, so use it instead */ if((options & CHECK_OPTION_FORCE_EXECUTION)) { use_original_event = FALSE; log_debug_info(DEBUGL_CHECKS, 2, "New host check event is forced, so it will be used instead of the existing event.\n"); } /* the new event is not forced either and its execution time is earlier than the original, so use it instead */ else if(check_time < temp_event->run_time) { use_original_event = FALSE; log_debug_info(DEBUGL_CHECKS, 2, "New host check event occurs before the existing (older) event, so it will be used instead.\n"); } /* the new event is older, so override the existing one */ else { log_debug_info(DEBUGL_CHECKS, 2, "New host check event occurs after the existing event, so we'll ignore it.\n"); } } } /* use the new event */ if(use_original_event == FALSE) { log_debug_info(DEBUGL_CHECKS, 2, "Scheduling new host check event.\n"); /* possibly allocate memory for a new event item */ if (temp_event) { remove_event(nagios_squeue, temp_event); } else if((temp_event = (timed_event *)calloc(1, sizeof(timed_event))) == NULL) { logit(NSLOG_RUNTIME_WARNING, TRUE, "Warning: Could not reschedule check of host '%s'!\n", hst->name); return; } /* set the next host check event and time */ hst->next_check_event = temp_event; hst->next_check = check_time; /* save check options for retention purposes */ hst->check_options = options; /* place the new event in the event queue */ temp_event->event_type = EVENT_HOST_CHECK; temp_event->event_data = (void *)hst; temp_event->event_args = (void *)NULL; temp_event->event_options = options; temp_event->run_time = hst->next_check; temp_event->recurring = FALSE; temp_event->event_interval = 0L; temp_event->timing_func = NULL; temp_event->compensate_for_time_change = TRUE; add_event(nagios_squeue, temp_event); } else { /* reset the next check time (it may be out of sync) */ if(temp_event != NULL) hst->next_check = temp_event->run_time; log_debug_info(DEBUGL_CHECKS, 2, "Keeping original host check event (ignoring the new one).\n"); } /* update the status log */ update_host_status(hst, FALSE); return; } /* checks host dependencies */ int check_host_dependencies(host *hst, int dependency_type) { hostdependency *temp_dependency = NULL; objectlist *list; host *temp_host = NULL; int state = HOST_UP; time_t current_time = 0L; log_debug_info(DEBUGL_FUNCTIONS, 0, "check_host_dependencies()\n"); if (dependency_type == NOTIFICATION_DEPENDENCY) { list = hst->notify_deps; } else { list = hst->exec_deps; } /* check all dependencies... */ for(; list; list = list->next) { temp_dependency = (hostdependency *)list->object_ptr; /* find the host we depend on... */ if((temp_host = temp_dependency->master_host_ptr) == NULL) continue; /* skip this dependency if it has a timeperiod and the current time isn't valid */ time(¤t_time); if(temp_dependency->dependency_period != NULL && check_time_against_period(current_time, temp_dependency->dependency_period_ptr) == ERROR) return FALSE; /* get the status to use (use last hard state if its currently in a soft state) */ if(temp_host->state_type == SOFT_STATE && soft_state_dependencies == FALSE) state = temp_host->last_hard_state; else state = temp_host->current_state; /* is the host we depend on in state that fails the dependency tests? */ if(flag_isset(temp_dependency->failure_options, 1 << state)) return DEPENDENCIES_FAILED; /* immediate dependencies ok at this point - check parent dependencies if necessary */ if(temp_dependency->inherits_parent == TRUE) { if(check_host_dependencies(temp_host, dependency_type) != DEPENDENCIES_OK) return DEPENDENCIES_FAILED; } } return DEPENDENCIES_OK; } /* check for hosts that never returned from a check... */ void check_for_orphaned_hosts(void) { host *temp_host = NULL; time_t current_time = 0L; time_t expected_time = 0L; log_debug_info(DEBUGL_FUNCTIONS, 0, "check_for_orphaned_hosts()\n"); /* get the current time */ time(¤t_time); /* check all hosts... */ for(temp_host = host_list; temp_host != NULL; temp_host = temp_host->next) { /* skip hosts that don't have a set check interval (on-demand checks are missed by the orphan logic) */ if(temp_host->next_check == (time_t)0L) continue; /* skip hosts that are not currently executing */ if(temp_host->is_executing == FALSE) continue; /* determine the time at which the check results should have come in (allow 10 minutes slack time) */ expected_time = (time_t)(temp_host->next_check + temp_host->latency + host_check_timeout + check_reaper_interval + 600); /* this host was supposed to have executed a while ago, but for some reason the results haven't come back in... */ if(expected_time < current_time) { /* log a warning */ logit(NSLOG_RUNTIME_WARNING, TRUE, "Warning: The check of host '%s' looks like it was orphaned (results never came back). I'm scheduling an immediate check of the host...\n", temp_host->name); log_debug_info(DEBUGL_CHECKS, 1, "Host '%s' was orphaned, so we're scheduling an immediate check...\n", temp_host->name); /* decrement the number of running host checks */ if(currently_running_host_checks > 0) currently_running_host_checks--; /* disable the executing flag */ temp_host->is_executing = FALSE; /* schedule an immediate check of the host */ schedule_host_check(temp_host, current_time, CHECK_OPTION_ORPHAN_CHECK); } } return; } /* check freshness of host results */ void check_host_result_freshness(void) { host *temp_host = NULL; time_t current_time = 0L; log_debug_info(DEBUGL_FUNCTIONS, 0, "check_host_result_freshness()\n"); log_debug_info(DEBUGL_CHECKS, 2, "Attempting to check the freshness of host check results...\n"); /* bail out if we're not supposed to be checking freshness */ if(check_host_freshness == FALSE) { log_debug_info(DEBUGL_CHECKS, 2, "Host freshness checking is disabled.\n"); return; } /* get the current time */ time(¤t_time); /* check all hosts... */ for(temp_host = host_list; temp_host != NULL; temp_host = temp_host->next) { /* skip hosts we shouldn't be checking for freshness */ if(temp_host->check_freshness == FALSE) continue; /* skip hosts that have both active and passive checks disabled */ if(temp_host->checks_enabled == FALSE && temp_host->accept_passive_checks == FALSE) continue; /* skip hosts that are currently executing (problems here will be caught by orphaned host check) */ if(temp_host->is_executing == TRUE) continue; /* skip hosts that are already being freshened */ if(temp_host->is_being_freshened == TRUE) continue; /* see if the time is right... */ if(check_time_against_period(current_time, temp_host->check_period_ptr) == ERROR) continue; /* the results for the last check of this host are stale */ if(is_host_result_fresh(temp_host, current_time, TRUE) == FALSE) { /* set the freshen flag */ temp_host->is_being_freshened = TRUE; /* schedule an immediate forced check of the host */ schedule_host_check(temp_host, current_time, CHECK_OPTION_FORCE_EXECUTION | CHECK_OPTION_FRESHNESS_CHECK); } } return; } /* checks to see if a hosts's check results are fresh */ int is_host_result_fresh(host *temp_host, time_t current_time, int log_this) { time_t expiration_time = 0L; int freshness_threshold = 0; int days = 0; int hours = 0; int minutes = 0; int seconds = 0; int tdays = 0; int thours = 0; int tminutes = 0; int tseconds = 0; double interval = 0; log_debug_info(DEBUGL_CHECKS, 2, "Checking freshness of host '%s'...\n", temp_host->name); /* use user-supplied freshness threshold or auto-calculate a freshness threshold to use? */ if(temp_host->freshness_threshold == 0) { if(temp_host->state_type == HARD_STATE || temp_host->current_state == STATE_OK) { interval = temp_host->check_interval; } else { interval = temp_host->retry_interval; } freshness_threshold = (interval * interval_length) + temp_host->latency + additional_freshness_latency; } else freshness_threshold = temp_host->freshness_threshold; log_debug_info(DEBUGL_CHECKS, 2, "Freshness thresholds: host=%d, use=%d\n", temp_host->freshness_threshold, freshness_threshold); /* calculate expiration time */ /* * CHANGED 11/10/05 EG: * program start is only used in expiration time calculation * if > last check AND active checks are enabled, so active checks * can become stale immediately upon program startup */ if(temp_host->has_been_checked == FALSE) expiration_time = (time_t)(event_start + freshness_threshold); /* * CHANGED 06/19/07 EG: * Per Ton's suggestion (and user requests), only use program start * time over last check if no specific threshold has been set by user. * Problems can occur if Nagios is restarted more frequently that * freshness threshold intervals (hosts never go stale). */ /* * CHANGED 10/07/07 EG: * Added max_host_check_spread to expiration time as suggested by * Altinity */ else if(temp_host->checks_enabled == TRUE && event_start > temp_host->last_check && temp_host->freshness_threshold == 0) expiration_time = (time_t)(event_start + freshness_threshold + (max_host_check_spread * interval_length)); else expiration_time = (time_t)(temp_host->last_check + freshness_threshold); /* * If the check was last done passively, we assume it's going * to continue that way and we need to handle the fact that * Nagios might have been shut off for quite a long time. If so, * we mustn't spam freshness notifications but use event_start * instead of last_check to determine freshness expiration time. * The threshold for "long time" is determined as 61.8% of the normal * freshness threshold based on vast heuristical research (ie, "some * guy once told me the golden ratio is good for loads of stuff"). */ if (temp_host->check_type == CHECK_TYPE_PASSIVE) { if (temp_host->last_check < event_start && event_start - last_program_stop > freshness_threshold * 0.618) { expiration_time = event_start + freshness_threshold; } } log_debug_info(DEBUGL_CHECKS, 2, "HBC: %d, PS: %lu, ES: %lu, LC: %lu, CT: %lu, ET: %lu\n", temp_host->has_been_checked, (unsigned long)program_start, (unsigned long)event_start, (unsigned long)temp_host->last_check, (unsigned long)current_time, (unsigned long)expiration_time); /* the results for the last check of this host are stale */ if(expiration_time < current_time) { get_time_breakdown((current_time - expiration_time), &days, &hours, &minutes, &seconds); get_time_breakdown(freshness_threshold, &tdays, &thours, &tminutes, &tseconds); /* log a warning */ if(log_this == TRUE) logit(NSLOG_RUNTIME_WARNING, TRUE, "Warning: The results of host '%s' are stale by %dd %dh %dm %ds (threshold=%dd %dh %dm %ds). I'm forcing an immediate check of the host.\n", temp_host->name, days, hours, minutes, seconds, tdays, thours, tminutes, tseconds); log_debug_info(DEBUGL_CHECKS, 1, "Check results for host '%s' are stale by %dd %dh %dm %ds (threshold=%dd %dh %dm %ds). Forcing an immediate check of the host...\n", temp_host->name, days, hours, minutes, seconds, tdays, thours, tminutes, tseconds); return FALSE; } else log_debug_info(DEBUGL_CHECKS, 1, "Check results for host '%s' are fresh.\n", temp_host->name); return TRUE; } /* run a scheduled host check asynchronously */ int run_scheduled_host_check(host *hst, int check_options, double latency) { int result = OK; time_t current_time = 0L; time_t preferred_time = 0L; time_t next_valid_time = 0L; int time_is_valid = TRUE; log_debug_info(DEBUGL_FUNCTIONS, 0, "run_scheduled_host_check()\n"); if(hst == NULL) return ERROR; log_debug_info(DEBUGL_CHECKS, 0, "Attempting to run scheduled check of host '%s': check options=%d, latency=%lf\n", hst->name, check_options, latency); /* * reset the next_check_event so we know this host * check is no longer in the scheduling queue */ hst->next_check_event = NULL; /* attempt to run the check */ result = run_async_host_check(hst, check_options, latency, TRUE, TRUE, &time_is_valid, &preferred_time); /* an error occurred, so reschedule the check */ if(result == ERROR) { log_debug_info(DEBUGL_CHECKS, 1, "Unable to run scheduled host check at this time\n"); /* only attempt to (re)schedule checks that should get checked... */ if(hst->should_be_scheduled == TRUE) { /* get current time */ time(¤t_time); /* determine next time we should check the host if needed */ /* if host has no check interval, schedule it again for 5 minutes from now */ if(current_time >= preferred_time) preferred_time = current_time + ((hst->check_interval <= 0) ? 300 : (hst->check_interval * interval_length)); /* make sure we rescheduled the next host check at a valid time */ get_next_valid_time(preferred_time, &next_valid_time, hst->check_period_ptr); /* * If the host really can't be rescheduled properly we * set next check time to preferred_time and try again then */ if(time_is_valid == FALSE && check_time_against_period(next_valid_time, hst->check_period_ptr) == ERROR) { hst->next_check = preferred_time + ranged_urand(0, check_window(hst)); logit(NSLOG_RUNTIME_WARNING, TRUE, "Warning: Check of host '%s' could not be rescheduled properly. Scheduling check for %s...\n", hst->name, ctime(&preferred_time)); log_debug_info(DEBUGL_CHECKS, 1, "Unable to find any valid times to reschedule the next host check!\n"); } /* this service could be rescheduled... */ else { hst->next_check = next_valid_time; if(next_valid_time > preferred_time) { /* Next valid time is further in the future because of * timeperiod constraints. Add a random amount so we * don't get all checks subject to that timeperiod * constraint scheduled at the same time */ hst->next_check += ranged_urand(0, check_window(hst)); } hst->should_be_scheduled = TRUE; log_debug_info(DEBUGL_CHECKS, 1, "Rescheduled next host check for %s", ctime(&next_valid_time)); } } /* update the status log */ update_host_status(hst, FALSE); /* reschedule the next host check - unless we couldn't find a valid next check time */ /* 10/19/07 EG - keep original check options */ if(hst->should_be_scheduled == TRUE) schedule_host_check(hst, hst->next_check, check_options); return ERROR; } return OK; } /* perform an asynchronous check of a host */ /* scheduled host checks will use this, as will some checks that result from on-demand checks... */ int run_async_host_check(host *hst, int check_options, double latency, int scheduled_check, int reschedule_check, int *time_is_valid, time_t *preferred_time) { nagios_macros mac; char *raw_command = NULL; char *processed_command = NULL; struct timeval start_time, end_time; double old_latency = 0.0; check_result *cr; int runchk_result = OK; int macro_options = STRIP_ILLEGAL_MACRO_CHARS | ESCAPE_MACRO_CHARS; #ifdef USE_EVENT_BROKER int neb_result = OK; #endif log_debug_info(DEBUGL_FUNCTIONS, 0, "run_async_host_check(%s ...)\n", hst ? hst->name : "(NULL host!)"); /* make sure we have a host */ if(hst == NULL) return ERROR; log_debug_info(DEBUGL_CHECKS, 0, "** Running async check of host '%s'...\n", hst->name); /* abort if check is already running or was recently completed */ if (!(check_options & CHECK_OPTION_FORCE_EXECUTION)) { if(hst->is_executing == TRUE) { log_debug_info(DEBUGL_CHECKS, 1, "A check of this host is already being executed, so we'll pass for the moment...\n"); return ERROR; } if (hst->last_check + cached_host_check_horizon > time(NULL)) { log_debug_info(DEBUGL_CHECKS, 0, "Host '%s' was last checked within its cache horizon. Aborting check\n", hst->name); return ERROR; } } log_debug_info(DEBUGL_CHECKS, 0, "Host '%s' passed first hurdle (caching/execution)\n", hst->name); /* is the host check viable at this time? */ if(check_host_check_viability(hst, check_options, time_is_valid, preferred_time) == ERROR) { log_debug_info(DEBUGL_CHECKS, 0, "Host check isn't viable at this point.\n"); return ERROR; } /******** GOOD TO GO FOR A REAL HOST CHECK AT THIS POINT ********/ #ifdef USE_EVENT_BROKER /* initialize start/end times */ start_time.tv_sec = 0L; start_time.tv_usec = 0L; end_time.tv_sec = 0L; end_time.tv_usec = 0L; /* send data to event broker */ neb_result = broker_host_check(NEBTYPE_HOSTCHECK_ASYNC_PRECHECK, NEBFLAG_NONE, NEBATTR_NONE, hst, CHECK_TYPE_ACTIVE, hst->current_state, hst->state_type, start_time, end_time, hst->check_command, hst->latency, 0.0, host_check_timeout, FALSE, 0, NULL, NULL, NULL, NULL, NULL, NULL); if(neb_result == NEBERROR_CALLBACKCANCEL || neb_result == NEBERROR_CALLBACKOVERRIDE) { log_debug_info(DEBUGL_CHECKS, 0, "Check of host '%s' (id=%u) was %s by a module\n", hst->name, hst->id, neb_result == NEBERROR_CALLBACKCANCEL ? "cancelled" : "overridden"); } /* neb module wants to cancel the host check - the check will be rescheduled for a later time by the scheduling logic */ if(neb_result == NEBERROR_CALLBACKCANCEL) { if(preferred_time) *preferred_time += check_window(hst); return ERROR; } /* neb module wants to override the host check - perhaps it will check the host itself */ /* NOTE: if a module does this, it has to do a lot of the stuff found below to make sure things don't get whacked out of shape! */ /* NOTE: if would be easier for modules to override checks when the NEBTYPE_SERVICECHECK_INITIATE event is called (later) */ if(neb_result == NEBERROR_CALLBACKOVERRIDE) return OK; #endif log_debug_info(DEBUGL_CHECKS, 0, "Checking host '%s'...\n", hst->name); /* clear check options - we don't want old check options retained */ /* only clear options if this was a scheduled check - on demand check options shouldn't affect retained info */ if(scheduled_check == TRUE) hst->check_options = CHECK_OPTION_NONE; /* adjust host check attempt */ adjust_host_check_attempt(hst, TRUE); /* set latency (temporarily) for macros and event broker */ old_latency = hst->latency; hst->latency = latency; /* grab the host macro variables */ memset(&mac, 0, sizeof(mac)); grab_host_macros_r(&mac, hst); /* get the raw command line */ get_raw_command_line_r(&mac, hst->check_command_ptr, hst->check_command, &raw_command, macro_options); if(raw_command == NULL) { clear_volatile_macros_r(&mac); log_debug_info(DEBUGL_CHECKS, 0, "Raw check command for host '%s' was NULL - aborting.\n", hst->name); return ERROR; } /* process any macros contained in the argument */ process_macros_r(&mac, raw_command, &processed_command, macro_options); my_free(raw_command); if(processed_command == NULL) { clear_volatile_macros_r(&mac); log_debug_info(DEBUGL_CHECKS, 0, "Processed check command for host '%s' was NULL - aborting.\n", hst->name); return ERROR; } /* get the command start time */ gettimeofday(&start_time, NULL); cr = calloc(1, sizeof(*cr)); if (!cr) { log_debug_info(DEBUGL_CHECKS, 0, "Failed to allocate checkresult struct\n"); clear_volatile_macros_r(&mac); clear_host_macros_r(&mac); return ERROR; } init_check_result(cr); /* save check info */ cr->object_check_type = HOST_CHECK; cr->host_name = (char *)strdup(hst->name); cr->service_description = NULL; cr->check_type = CHECK_TYPE_ACTIVE; cr->check_options = check_options; cr->scheduled_check = scheduled_check; cr->reschedule_check = reschedule_check; cr->latency = latency; cr->start_time = start_time; cr->finish_time = start_time; cr->early_timeout = FALSE; cr->exited_ok = TRUE; cr->return_code = STATE_OK; cr->output = NULL; #ifdef USE_EVENT_BROKER /* send data to event broker */ neb_result = broker_host_check(NEBTYPE_HOSTCHECK_INITIATE, NEBFLAG_NONE, NEBATTR_NONE, hst, CHECK_TYPE_ACTIVE, hst->current_state, hst->state_type, start_time, end_time, hst->check_command, hst->latency, 0.0, host_check_timeout, FALSE, 0, processed_command, NULL, NULL, NULL, NULL, cr); /* neb module wants to override the service check - perhaps it will check the service itself */ if (neb_result == NEBERROR_CALLBACKOVERRIDE) { clear_volatile_macros_r(&mac); hst->latency = old_latency; free_check_result(cr); my_free(processed_command); return OK; } #endif /* reset latency (permanent value for this check will get set later) */ hst->latency = old_latency; runchk_result = wproc_run_check(cr, processed_command, &mac); if (runchk_result == ERROR) { logit(NSLOG_RUNTIME_ERROR, TRUE, "Unable to send check for host '%s' to worker (ret=%d)\n", hst->name, runchk_result); } else { /* do the book-keeping */ currently_running_host_checks++; hst->is_executing = TRUE; update_check_stats((scheduled_check == TRUE) ? ACTIVE_SCHEDULED_HOST_CHECK_STATS : ACTIVE_ONDEMAND_HOST_CHECK_STATS, start_time.tv_sec); update_check_stats(PARALLEL_HOST_CHECK_STATS, start_time.tv_sec); } /* free memory */ clear_volatile_macros_r(&mac); my_free(processed_command); return runchk_result; } static int get_host_check_return_code(host *temp_host, check_result *queued_check_result) { int rc; char *temp_plugin_output = NULL; log_debug_info(DEBUGL_FUNCTIONS, 0, "get_host_check_return_code()\n"); /* get the unprocessed return code */ /* NOTE: for passive checks, this is the final/processed state */ rc = queued_check_result->return_code; /* adjust return code (active checks only) */ if(queued_check_result->check_type == CHECK_TYPE_ACTIVE) { if(queued_check_result->early_timeout) { logit(NSLOG_RUNTIME_WARNING, TRUE, "Warning: Check of host '%s' timed out after %.2lf seconds\n", temp_host->name, temp_host->execution_time); my_free(temp_host->plugin_output); my_free(temp_host->long_plugin_output); my_free(temp_host->perf_data); asprintf(&temp_host->plugin_output, "(Host check timed out after %.2lf seconds)", temp_host->execution_time); rc = STATE_UNKNOWN; } /* if there was some error running the command, just skip it (this shouldn't be happening) */ else if(queued_check_result->exited_ok == FALSE) { logit(NSLOG_RUNTIME_WARNING, TRUE, "Warning: Check of host '%s' did not exit properly!\n", temp_host->name); my_free(temp_host->plugin_output); my_free(temp_host->long_plugin_output); my_free(temp_host->perf_data); temp_host->plugin_output = (char *)strdup("(Host check did not exit properly)"); rc = STATE_CRITICAL; } /* make sure the return code is within bounds */ else if(queued_check_result->return_code < 0 || queued_check_result->return_code > 3) { logit(NSLOG_RUNTIME_WARNING, TRUE, "Warning: Return code of %d for check of host '%s' was out of bounds.%s\n", queued_check_result->return_code, temp_host->name, (queued_check_result->return_code == 126 || queued_check_result->return_code == 127) ? " Make sure the plugin you're trying to run actually exists." : ""); asprintf(&temp_plugin_output, "(Return code of %d is out of bounds%s : %s)", queued_check_result->return_code, (queued_check_result->return_code == 126 || queued_check_result->return_code == 127) ? " - plugin may be missing" : "", temp_host->plugin_output); my_free(temp_host->plugin_output); asprintf(&temp_host->plugin_output, "%s)", temp_plugin_output); my_free(temp_plugin_output); my_free(temp_host->long_plugin_output); my_free(temp_host->perf_data); rc = STATE_CRITICAL; } /* a NULL host check command means we should assume the host is UP */ if(temp_host->check_command == NULL) { my_free(temp_host->plugin_output); temp_host->plugin_output = (char *)strdup("(Host assumed to be UP)"); rc = STATE_OK; } } return rc; } /* process results of an asynchronous host check */ int handle_async_host_check_result(host *temp_host, check_result *queued_check_result) { time_t current_time; int result = STATE_OK; int reschedule_check = FALSE; char *old_plugin_output = NULL; char *temp_ptr = NULL; struct timeval start_time_hires; struct timeval end_time_hires; log_debug_info(DEBUGL_FUNCTIONS, 0, "handle_async_host_check_result(%s ...)\n", temp_host ? temp_host->name : "(NULL host!)"); /* make sure we have what we need */ if(temp_host == NULL || queued_check_result == NULL) return ERROR; time(¤t_time); log_debug_info(DEBUGL_CHECKS, 1, "** Handling async check result for host '%s' from '%s'...\n", temp_host->name, check_result_source(queued_check_result)); log_debug_info(DEBUGL_CHECKS, 2, "\tCheck Type: %s\n", (queued_check_result->check_type == CHECK_TYPE_ACTIVE) ? "Active" : "Passive"); log_debug_info(DEBUGL_CHECKS, 2, "\tCheck Options: %d\n", queued_check_result->check_options); log_debug_info(DEBUGL_CHECKS, 2, "\tScheduled Check?: %s\n", (queued_check_result->scheduled_check == TRUE) ? "Yes" : "No"); log_debug_info(DEBUGL_CHECKS, 2, "\tReschedule Check?: %s\n", (queued_check_result->reschedule_check == TRUE) ? "Yes" : "No"); log_debug_info(DEBUGL_CHECKS, 2, "\tExited OK?: %s\n", (queued_check_result->exited_ok == TRUE) ? "Yes" : "No"); log_debug_info(DEBUGL_CHECKS, 2, "\tExec Time: %.3f\n", temp_host->execution_time); log_debug_info(DEBUGL_CHECKS, 2, "\tLatency: %.3f\n", temp_host->latency); log_debug_info(DEBUGL_CHECKS, 2, "\tReturn Status: %d\n", queued_check_result->return_code); log_debug_info(DEBUGL_CHECKS, 2, "\tOutput: %s\n", (queued_check_result == NULL) ? "NULL" : queued_check_result->output); /* decrement the number of host checks still out there... */ if(queued_check_result->check_type == CHECK_TYPE_ACTIVE && currently_running_host_checks > 0) currently_running_host_checks--; /* skip this host check results if its passive and we aren't accepting passive check results */ if(queued_check_result->check_type == CHECK_TYPE_PASSIVE) { if(accept_passive_host_checks == FALSE) { log_debug_info(DEBUGL_CHECKS, 0, "Discarding passive host check result because passive host checks are disabled globally.\n"); return ERROR; } if(temp_host->accept_passive_checks == FALSE) { log_debug_info(DEBUGL_CHECKS, 0, "Discarding passive host check result because passive checks are disabled for this host.\n"); return ERROR; } } /* clear the freshening flag (it would have been set if this host was determined to be stale) */ if(queued_check_result->check_options & CHECK_OPTION_FRESHNESS_CHECK) temp_host->is_being_freshened = FALSE; /* DISCARD INVALID FRESHNESS CHECK RESULTS */ /* If a host goes stale, Nagios will initiate a forced check in order to freshen it. There is a race condition whereby a passive check could arrive between the 1) initiation of the forced check and 2) the time when the forced check result is processed here. This would make the host fresh again, so we do a quick check to make sure the host is still stale before we accept the check result. */ if((queued_check_result->check_options & CHECK_OPTION_FRESHNESS_CHECK) && is_host_result_fresh(temp_host, current_time, FALSE) == TRUE) { log_debug_info(DEBUGL_CHECKS, 0, "Discarding host freshness check result because the host is currently fresh (race condition avoided).\n"); return OK; } /* was this check passive or active? */ temp_host->check_type = (queued_check_result->check_type == CHECK_TYPE_ACTIVE) ? CHECK_TYPE_ACTIVE : CHECK_TYPE_PASSIVE; /* update check statistics for passive results */ if(queued_check_result->check_type == CHECK_TYPE_PASSIVE) update_check_stats(PASSIVE_HOST_CHECK_STATS, queued_check_result->start_time.tv_sec); /* should we reschedule the next check of the host? NOTE: this might be overridden later... */ reschedule_check = queued_check_result->reschedule_check; /* check latency is passed to us for both active and passive checks */ temp_host->latency = queued_check_result->latency; /* update the execution time for this check (millisecond resolution) */ temp_host->execution_time = (double)((double)(queued_check_result->finish_time.tv_sec - queued_check_result->start_time.tv_sec) + (double)((queued_check_result->finish_time.tv_usec - queued_check_result->start_time.tv_usec) / 1000.0) / 1000.0); if(temp_host->execution_time < 0.0) temp_host->execution_time = 0.0; /* set the checked flag */ temp_host->has_been_checked = TRUE; /* clear the execution flag if this was an active check */ if(queued_check_result->check_type == CHECK_TYPE_ACTIVE) temp_host->is_executing = FALSE; /* get the last check time */ temp_host->last_check = queued_check_result->start_time.tv_sec; /* was this check passive or active? */ temp_host->check_type = (queued_check_result->check_type == CHECK_TYPE_ACTIVE) ? CHECK_TYPE_ACTIVE : CHECK_TYPE_PASSIVE; /* save the old host state */ temp_host->last_state = temp_host->current_state; if(temp_host->state_type == HARD_STATE) temp_host->last_hard_state = temp_host->current_state; /* save old plugin output */ if(temp_host->plugin_output) old_plugin_output = (char *)strdup(temp_host->plugin_output); /* clear the old plugin output and perf data buffers */ my_free(temp_host->plugin_output); my_free(temp_host->long_plugin_output); my_free(temp_host->perf_data); /* parse check output to get: (1) short output, (2) long output, (3) perf data */ parse_check_output(queued_check_result->output, &temp_host->plugin_output, &temp_host->long_plugin_output, &temp_host->perf_data, TRUE, FALSE); /* make sure we have some data */ if(temp_host->plugin_output == NULL || !strcmp(temp_host->plugin_output, "")) { my_free(temp_host->plugin_output); temp_host->plugin_output = (char *)strdup("(No output returned from host check)"); } /* replace semicolons in plugin output (but not performance data) with colons */ if((temp_ptr = temp_host->plugin_output)) { while((temp_ptr = strchr(temp_ptr, ';'))) * temp_ptr = ':'; } log_debug_info(DEBUGL_CHECKS, 2, "Parsing check output...\n"); log_debug_info(DEBUGL_CHECKS, 2, "Short Output: %s\n", (temp_host->plugin_output == NULL) ? "NULL" : temp_host->plugin_output); log_debug_info(DEBUGL_CHECKS, 2, "Long Output: %s\n", (temp_host->long_plugin_output == NULL) ? "NULL" : temp_host->long_plugin_output); log_debug_info(DEBUGL_CHECKS, 2, "Perf Data: %s\n", (temp_host->perf_data == NULL) ? "NULL" : temp_host->perf_data); /* get the check return code */ result = get_host_check_return_code(temp_host, queued_check_result); /* translate return code to basic UP/DOWN state - the DOWN/UNREACHABLE state determination is made later */ /* NOTE: only do this for active checks - passive check results already have the final state */ if(queued_check_result->check_type == CHECK_TYPE_ACTIVE) { /* if we're not doing aggressive host checking, let WARNING states indicate the host is up (fake the result to be STATE_OK) */ if(use_aggressive_host_checking == FALSE && result == STATE_WARNING) result = STATE_OK; /* OK states means the host is UP */ if(result == STATE_OK) result = HOST_UP; /* any problem state indicates the host is not UP */ else result = HOST_DOWN; } /******************* PROCESS THE CHECK RESULTS ******************/ /* process the host check result */ process_host_check_result(temp_host, result, old_plugin_output, CHECK_OPTION_NONE, reschedule_check, TRUE, cached_host_check_horizon); /* free memory */ my_free(old_plugin_output); log_debug_info(DEBUGL_CHECKS, 1, "** Async check result for host '%s' handled: new state=%d\n", temp_host->name, temp_host->current_state); /* high resolution start time for event broker */ start_time_hires = queued_check_result->start_time; /* high resolution end time for event broker */ gettimeofday(&end_time_hires, NULL); #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_host_check(NEBTYPE_HOSTCHECK_PROCESSED, NEBFLAG_NONE, NEBATTR_NONE, temp_host, temp_host->check_type, temp_host->current_state, temp_host->state_type, start_time_hires, end_time_hires, temp_host->check_command, temp_host->latency, temp_host->execution_time, host_check_timeout, queued_check_result->early_timeout, queued_check_result->return_code, NULL, temp_host->plugin_output, temp_host->long_plugin_output, temp_host->perf_data, NULL, queued_check_result); #endif return OK; } /* processes the result of a synchronous or asynchronous host check */ int process_host_check_result(host *hst, int new_state, char *old_plugin_output, int check_options, int reschedule_check, int use_cached_result, unsigned long check_timestamp_horizon) { hostsmember *temp_hostsmember = NULL; host *child_host = NULL; host *parent_host = NULL; host *master_host = NULL; time_t current_time = 0L; time_t next_check = 0L; time_t preferred_time = 0L; time_t next_valid_time = 0L; log_debug_info(DEBUGL_FUNCTIONS, 0, "process_host_check_result()\n"); log_debug_info(DEBUGL_CHECKS, 1, "HOST: %s, ATTEMPT=%d/%d, CHECK TYPE=%s, STATE TYPE=%s, OLD STATE=%d, NEW STATE=%d\n", hst->name, hst->current_attempt, hst->max_attempts, (hst->check_type == CHECK_TYPE_ACTIVE) ? "ACTIVE" : "PASSIVE", (hst->state_type == HARD_STATE) ? "HARD" : "SOFT", hst->current_state, new_state); /* get the current time */ time(¤t_time); /* default next check time */ next_check = current_time + normal_check_window(hst); /* we have to adjust current attempt # for passive checks, as it isn't done elsewhere */ if(hst->check_type == CHECK_TYPE_PASSIVE && passive_host_checks_are_soft == TRUE) adjust_host_check_attempt(hst, FALSE); /* log passive checks - we need to do this here, as some my bypass external commands by getting dropped in checkresults dir */ if(hst->check_type == CHECK_TYPE_PASSIVE) { if(log_passive_checks == TRUE) logit(NSLOG_PASSIVE_CHECK, FALSE, "PASSIVE HOST CHECK: %s;%d;%s\n", hst->name, new_state, hst->plugin_output); } /******* HOST WAS DOWN/UNREACHABLE INITIALLY *******/ if(hst->current_state != HOST_UP) { log_debug_info(DEBUGL_CHECKS, 1, "Host was %s.\n", host_state_name(hst->current_state)); /***** HOST IS NOW UP *****/ /* the host just recovered! */ if(new_state == HOST_UP) { /* set the current state */ hst->current_state = HOST_UP; /* set the state type */ /* set state type to HARD for passive checks and active checks that were previously in a HARD STATE */ if(hst->state_type == HARD_STATE || (hst->check_type == CHECK_TYPE_PASSIVE && passive_host_checks_are_soft == FALSE)) hst->state_type = HARD_STATE; else hst->state_type = SOFT_STATE; log_debug_info(DEBUGL_CHECKS, 1, "Host experienced a %s recovery (it's now UP).\n", (hst->state_type == HARD_STATE) ? "HARD" : "SOFT"); /* reschedule the next check of the host at the normal interval */ reschedule_check = TRUE; next_check = (unsigned long)(current_time + (hst->check_interval * interval_length)); /* propagate checks to immediate parents if they are not already UP */ /* we do this because a parent host (or grandparent) may have recovered somewhere and we should catch the recovery as soon as possible */ log_debug_info(DEBUGL_CHECKS, 1, "Propagating checks to parent host(s)...\n"); for(temp_hostsmember = hst->parent_hosts; temp_hostsmember != NULL; temp_hostsmember = temp_hostsmember->next) { parent_host = temp_hostsmember->host_ptr; if(parent_host->current_state != HOST_UP) { log_debug_info(DEBUGL_CHECKS, 1, "Check of parent host '%s' queued.\n", parent_host->name); schedule_host_check(parent_host, current_time, CHECK_OPTION_DEPENDENCY_CHECK); } } /* propagate checks to immediate children if they are not already UP */ /* we do this because children may currently be UNREACHABLE, but may (as a result of this recovery) switch to UP or DOWN states */ log_debug_info(DEBUGL_CHECKS, 1, "Propagating checks to child host(s)...\n"); for(temp_hostsmember = hst->child_hosts; temp_hostsmember != NULL; temp_hostsmember = temp_hostsmember->next) { child_host = temp_hostsmember->host_ptr; if(child_host->current_state != HOST_UP) { log_debug_info(DEBUGL_CHECKS, 1, "Check of child host '%s' queued.\n", child_host->name); schedule_host_check(child_host, current_time, CHECK_OPTION_DEPENDENCY_CHECK); } } } /***** HOST IS STILL DOWN/UNREACHABLE *****/ /* we're still in a problem state... */ else { log_debug_info(DEBUGL_CHECKS, 1, "Host is still %s.\n", host_state_name(hst->current_state)); /* passive checks are treated as HARD states by default... */ if(hst->check_type == CHECK_TYPE_PASSIVE && passive_host_checks_are_soft == FALSE) { /* set the state type */ hst->state_type = HARD_STATE; /* reset the current attempt */ hst->current_attempt = 1; } /* active checks and passive checks (treated as SOFT states) */ else { /* set the state type */ /* we've maxed out on the retries */ if(hst->current_attempt == hst->max_attempts) hst->state_type = HARD_STATE; /* the host was in a hard problem state before, so it still is now */ /* 2015-07-23 with the change adjust_host_check_attempt, this can no longer happen else if(hst->current_attempt == 1) hst->state_type = HARD_STATE; */ /* the host is in a soft state and the check will be retried */ else hst->state_type = SOFT_STATE; } /* make a determination of the host's state */ /* translate host state between DOWN/UNREACHABLE (only for passive checks if enabled) */ hst->current_state = new_state; if(hst->check_type == CHECK_TYPE_ACTIVE || translate_passive_host_checks == TRUE) hst->current_state = determine_host_reachability(hst); /* reschedule the next check if the host state changed */ if(hst->last_state != hst->current_state || hst->last_hard_state != hst->current_state) { reschedule_check = TRUE; /* schedule a re-check of the host at the retry interval because we can't determine its final state yet... */ if(hst->state_type == SOFT_STATE) next_check = (unsigned long)(current_time + (hst->retry_interval * interval_length)); /* host has maxed out on retries (or was previously in a hard problem state), so reschedule the next check at the normal interval */ else next_check = (unsigned long)(current_time + (hst->check_interval * interval_length)); } } } /******* HOST WAS UP INITIALLY *******/ else { log_debug_info(DEBUGL_CHECKS, 1, "Host was UP.\n"); /***** HOST IS STILL UP *****/ /* either the host never went down since last check */ if(new_state == HOST_UP) { log_debug_info(DEBUGL_CHECKS, 1, "Host is still UP.\n"); /* set the current state */ hst->current_state = HOST_UP; /* set the state type */ hst->state_type = HARD_STATE; /* reschedule the next check at the normal interval */ if(reschedule_check == TRUE) next_check = (unsigned long)(current_time + (hst->check_interval * interval_length)); } /***** HOST IS NOW DOWN/UNREACHABLE *****/ else { log_debug_info(DEBUGL_CHECKS, 1, "Host is now %s.\n", host_state_name(hst->current_state)); /* active and (in some cases) passive check results are treated as SOFT states */ if(hst->check_type == CHECK_TYPE_ACTIVE || passive_host_checks_are_soft == TRUE) { /* set the state type */ hst->state_type = SOFT_STATE; } /* by default, passive check results are treated as HARD states */ else { /* set the state type */ hst->state_type = HARD_STATE; /* reset the current attempt */ hst->current_attempt = 1; } /* make a (in some cases) preliminary determination of the host's state */ /* translate host state between DOWN/UNREACHABLE (for passive checks only if enabled) */ hst->current_state = new_state; if(hst->check_type == CHECK_TYPE_ACTIVE || translate_passive_host_checks == TRUE) hst->current_state = determine_host_reachability(hst); /* reschedule a check of the host */ reschedule_check = TRUE; /* schedule a re-check of the host at the retry interval because we can't determine its final state yet... */ if(hst->check_type == CHECK_TYPE_ACTIVE || passive_host_checks_are_soft == TRUE) next_check = (unsigned long)(current_time + (hst->retry_interval * interval_length)); /* schedule a re-check of the host at the normal interval */ else next_check = (unsigned long)(current_time + (hst->check_interval * interval_length)); /* propagate checks to immediate parents if they are UP */ /* we do this because a parent host (or grandparent) may have gone down and blocked our route */ /* checking the parents ASAP will allow us to better determine the final state (DOWN/UNREACHABLE) of this host later */ log_debug_info(DEBUGL_CHECKS, 1, "Propagating checks to immediate parent hosts that are UP...\n"); for(temp_hostsmember = hst->parent_hosts; temp_hostsmember != NULL; temp_hostsmember = temp_hostsmember->next) { parent_host = temp_hostsmember->host_ptr; if(parent_host->current_state == HOST_UP) { schedule_host_check(parent_host, current_time, CHECK_OPTION_DEPENDENCY_CHECK); log_debug_info(DEBUGL_CHECKS, 1, "Check of host '%s' queued.\n", parent_host->name); } } /* propagate checks to immediate children if they are not UNREACHABLE */ /* we do this because we may now be blocking the route to child hosts */ log_debug_info(DEBUGL_CHECKS, 1, "Propagating checks to immediate non-UNREACHABLE child hosts...\n"); for(temp_hostsmember = hst->child_hosts; temp_hostsmember != NULL; temp_hostsmember = temp_hostsmember->next) { child_host = temp_hostsmember->host_ptr; if(child_host->current_state != HOST_UNREACHABLE) { log_debug_info(DEBUGL_CHECKS, 1, "Check of child host '%s' queued.\n", child_host->name); schedule_host_check(child_host, current_time, CHECK_OPTION_NONE); } } /* check dependencies on second to last host check */ if(enable_predictive_host_dependency_checks == TRUE && hst->current_attempt == (hst->max_attempts - 1)) { objectlist *list; /* propagate checks to hosts that THIS ONE depends on for notifications AND execution */ /* we do to help ensure that the dependency checks are accurate before it comes time to notify */ log_debug_info(DEBUGL_CHECKS, 1, "Propagating predictive dependency checks to hosts this one depends on...\n"); for(list = hst->notify_deps; list; list = list->next) { hostdependency *dep = (hostdependency *)list->object_ptr; if(dep->dependent_host_ptr == hst && dep->master_host_ptr != NULL) { master_host = (host *)dep->master_host_ptr; log_debug_info(DEBUGL_CHECKS, 1, "Check of host '%s' queued.\n", master_host->name); schedule_host_check(master_host, current_time, CHECK_OPTION_NONE); } } for(list = hst->exec_deps; list; list = list->next) { hostdependency *dep = (hostdependency *)list->object_ptr; if(dep->dependent_host_ptr == hst && dep->master_host_ptr != NULL) { master_host = (host *)dep->master_host_ptr; log_debug_info(DEBUGL_CHECKS, 1, "Check of host '%s' queued.\n", master_host->name); schedule_host_check(master_host, current_time, CHECK_OPTION_NONE); } } } } } log_debug_info(DEBUGL_CHECKS, 1, "Pre-handle_host_state() Host: %s, Attempt=%d/%d, Type=%s, Final State=%d (%s)\n", hst->name, hst->current_attempt, hst->max_attempts, (hst->state_type == HARD_STATE) ? "HARD" : "SOFT", hst->current_state, host_state_name(hst->current_state)); /* handle the host state */ handle_host_state(hst); log_debug_info(DEBUGL_CHECKS, 1, "Post-handle_host_state() Host: %s, Attempt=%d/%d, Type=%s, Final State=%d (%s)\n", hst->name, hst->current_attempt, hst->max_attempts, (hst->state_type == HARD_STATE) ? "HARD" : "SOFT", hst->current_state, host_state_name(hst->current_state)); /******************** POST-PROCESSING STUFF *********************/ /* if the plugin output differs from previous check and no state change, log the current state/output if state stalking is enabled */ if(hst->last_state == hst->current_state && should_stalk(hst) && compare_strings(old_plugin_output, hst->plugin_output)) { log_host_event(hst); } /* check to see if the associated host is flapping */ check_for_host_flapping(hst, TRUE, TRUE, TRUE); /* reschedule the next check of the host (usually ONLY for scheduled, active checks, unless overridden above) */ if(reschedule_check == TRUE) { log_debug_info(DEBUGL_CHECKS, 1, "Rescheduling next check of host at %s", ctime(&next_check)); /* default is to reschedule host check unless a test below fails... */ hst->should_be_scheduled = TRUE; /* get the new current time */ time(¤t_time); /* make sure we don't get ourselves into too much trouble... */ if(current_time > next_check) hst->next_check = current_time; else hst->next_check = next_check; /* make sure we rescheduled the next service check at a valid time */ preferred_time = hst->next_check; get_next_valid_time(preferred_time, &next_valid_time, hst->check_period_ptr); hst->next_check = next_valid_time; if(next_valid_time > preferred_time) { /* Next valid time is further in the future because of timeperiod * constraints. Add a random amount so we don't get all checks * subject to that timeperiod constraint scheduled at the same time */ hst->next_check += ranged_urand(0, check_window(hst)); } /* hosts with non-recurring intervals do not get rescheduled if we're in a HARD or UP state */ if(hst->check_interval == 0 && (hst->state_type == HARD_STATE || hst->current_state == HOST_UP)) hst->should_be_scheduled = FALSE; /* host with active checks disabled do not get rescheduled */ if(hst->checks_enabled == FALSE) hst->should_be_scheduled = FALSE; /* schedule a non-forced check if we can */ if(hst->should_be_scheduled == TRUE) { schedule_host_check(hst, hst->next_check, CHECK_OPTION_NONE); } } /* update host status - for both active (scheduled) and passive (non-scheduled) hosts */ update_host_status(hst, FALSE); return OK; } /* checks viability of performing a host check */ int check_host_check_viability(host *hst, int check_options, int *time_is_valid, time_t *new_time) { int result = OK; int perform_check = TRUE; time_t current_time = 0L; time_t preferred_time = 0L; int check_interval = 0; log_debug_info(DEBUGL_FUNCTIONS, 0, "check_host_check_viability()\n"); /* make sure we have a host */ if(hst == NULL) return ERROR; /* get the check interval to use if we need to reschedule the check */ if(hst->state_type == SOFT_STATE && hst->current_state != HOST_UP) check_interval = (hst->retry_interval * interval_length); else check_interval = (hst->check_interval * interval_length); /* make sure check interval is positive - otherwise use 5 minutes out for next check */ if(check_interval <= 0) check_interval = 300; /* get the current time */ time(¤t_time); /* initialize the next preferred check time */ preferred_time = current_time; /* can we check the host right now? */ if(!(check_options & CHECK_OPTION_FORCE_EXECUTION)) { /* if checks of the host are currently disabled... */ if(hst->checks_enabled == FALSE) { preferred_time = current_time + check_interval; perform_check = FALSE; } /* make sure this is a valid time to check the host */ if(check_time_against_period((unsigned long)current_time, hst->check_period_ptr) == ERROR) { log_debug_info(DEBUGL_CHECKS, 0, "Timeperiod check failed\n"); preferred_time = current_time; if(time_is_valid) *time_is_valid = FALSE; perform_check = FALSE; } /* check host dependencies for execution */ if(check_host_dependencies(hst, EXECUTION_DEPENDENCY) == DEPENDENCIES_FAILED) { log_debug_info(DEBUGL_CHECKS, 0, "Host check dependencies failed\n"); preferred_time = current_time + check_interval; perform_check = FALSE; } } /* pass back the next viable check time */ if(new_time) *new_time = preferred_time; result = (perform_check == TRUE) ? OK : ERROR; return result; } /* adjusts current host check attempt before a new check is performed */ int adjust_host_check_attempt(host *hst, int is_active) { log_debug_info(DEBUGL_FUNCTIONS, 0, "adjust_host_check_attempt()\n"); if(hst == NULL) return ERROR; log_debug_info(DEBUGL_CHECKS, 2, "Adjusting check attempt number for host '%s': current attempt=%d/%d, state=%d, state type=%d\n", hst->name, hst->current_attempt, hst->max_attempts, hst->current_state, hst->state_type); /* if host is in a hard state, reset current attempt number */ /* 2015-07-23 only reset current_attempt if host is up */ if(hst->state_type == HARD_STATE && hst->current_state == HOST_UP) hst->current_attempt = 1; /* if host is in a soft UP state, reset current attempt number (active checks only) */ else if(is_active == TRUE && hst->state_type == SOFT_STATE && hst->current_state == HOST_UP) hst->current_attempt = 1; /* increment current attempt number */ else if(hst->current_attempt < hst->max_attempts) hst->current_attempt++; log_debug_info(DEBUGL_CHECKS, 2, "New check attempt number = %d\n", hst->current_attempt); return OK; } /* determination of the host's state based on route availability*/ /* used only to determine difference between DOWN and UNREACHABLE states */ int determine_host_reachability(host *hst) { host *parent_host = NULL; hostsmember *temp_hostsmember = NULL; log_debug_info(DEBUGL_FUNCTIONS, 0, "determine_host_reachability(host=%s)\n", hst ? hst->name : "(NULL host!)"); if(hst == NULL) return HOST_DOWN; log_debug_info(DEBUGL_CHECKS, 2, "Determining state of host '%s': current state=%d (%s)\n", hst->name, hst->current_state, host_state_name(hst->current_state)); /* host is UP - no translation needed */ if(hst->current_state == HOST_UP) { log_debug_info(DEBUGL_CHECKS, 2, "Host is UP, no state translation needed.\n"); return HOST_UP; } /* host has no parents, so it is DOWN */ if(hst->check_type == CHECK_TYPE_PASSIVE && hst->current_state == HOST_UNREACHABLE) { log_debug_info(DEBUGL_CHECKS, 2, "Passive check so keep it UNREACHABLE.\n"); return HOST_UNREACHABLE; } else if(hst->parent_hosts == NULL) { log_debug_info(DEBUGL_CHECKS, 2, "Host has no parents, so it is DOWN.\n"); return HOST_DOWN; } /* check all parent hosts to see if we're DOWN or UNREACHABLE */ else { for(temp_hostsmember = hst->parent_hosts; temp_hostsmember != NULL; temp_hostsmember = temp_hostsmember->next) { parent_host = temp_hostsmember->host_ptr; log_debug_info(DEBUGL_CHECKS, 2, " Parent '%s' is %s\n", parent_host->name, host_state_name(parent_host->current_state)); /* bail out as soon as we find one parent host that is UP */ if(parent_host->current_state == HOST_UP) { /* set the current state */ log_debug_info(DEBUGL_CHECKS, 2, "At least one parent (%s) is up, so host is DOWN.\n", parent_host->name); return HOST_DOWN; } } } log_debug_info(DEBUGL_CHECKS, 2, "No parents were up, so host is UNREACHABLE.\n"); return HOST_UNREACHABLE; } /******************************************************************/ /****************** HOST STATE HANDLER FUNCTIONS ******************/ /******************************************************************/ /* top level host state handler - occurs after every host check (soft/hard and active/passive) */ int handle_host_state(host *hst) { int state_change = FALSE; int hard_state_change = FALSE; time_t current_time = 0L; log_debug_info(DEBUGL_FUNCTIONS, 0, "handle_host_state()\n"); /* get current time */ time(¤t_time); /* obsess over this host check */ obsessive_compulsive_host_check_processor(hst); /* update performance data */ update_host_performance_data(hst); /* record the time the last state ended */ switch(hst->last_state) { case HOST_UP: hst->last_time_up = current_time; break; case HOST_DOWN: hst->last_time_down = current_time; break; case HOST_UNREACHABLE: hst->last_time_unreachable = current_time; break; default: break; } /* has the host state changed? */ if(hst->last_state != hst->current_state || (hst->current_state == HOST_UP && hst->state_type == SOFT_STATE)) state_change = TRUE; if(hst->current_attempt >= hst->max_attempts && hst->last_hard_state != hst->current_state) hard_state_change = TRUE; /* if the host state has changed... */ if(state_change == TRUE || hard_state_change == TRUE) { /* reset the next and last notification times */ hst->last_notification = (time_t)0; hst->next_notification = (time_t)0; /* reset notification suppression option */ hst->no_more_notifications = FALSE; /* reset the acknowledgement flag if necessary */ if(hst->acknowledgement_type == ACKNOWLEDGEMENT_NORMAL && (state_change == TRUE || hard_state_change == FALSE)) { hst->problem_has_been_acknowledged = FALSE; hst->acknowledgement_type = ACKNOWLEDGEMENT_NONE; /* remove any non-persistant comments associated with the ack */ delete_host_acknowledgement_comments(hst); } else if(hst->acknowledgement_type == ACKNOWLEDGEMENT_STICKY && hst->current_state == HOST_UP) { hst->problem_has_been_acknowledged = FALSE; hst->acknowledgement_type = ACKNOWLEDGEMENT_NONE; /* remove any non-persistant comments associated with the ack */ delete_host_acknowledgement_comments(hst); } } /* Not sure about this, but is old behaviour */ if(hst->last_hard_state != hst->current_state) hard_state_change = TRUE; if(state_change == TRUE || hard_state_change == TRUE) { /* update last state change times */ hst->last_state_change = current_time; if(hst->state_type == HARD_STATE) hst->last_hard_state_change = current_time; /* update the event id */ hst->last_event_id = hst->current_event_id; hst->current_event_id = next_event_id; next_event_id++; /* update the problem id when transitioning to a problem state */ if(hst->last_state == HOST_UP) { /* don't reset last problem id, or it will be zero the next time a problem is encountered */ hst->current_problem_id = next_problem_id; next_problem_id++; } /* clear the problem id when transitioning from a problem state to an UP state */ if(hst->current_state == HOST_UP) { hst->last_problem_id = hst->current_problem_id; hst->current_problem_id = 0L; } /* write the host state change to the main log file */ if(hst->state_type == HARD_STATE || (hst->state_type == SOFT_STATE && log_host_retries == TRUE)) log_host_event(hst); /* check for start of flexible (non-fixed) scheduled downtime */ /* It can start on soft states */ check_pending_flex_host_downtime(hst); /* notify contacts about the recovery or problem if its a "hard" state */ if(hst->state_type == HARD_STATE) host_notification(hst, NOTIFICATION_NORMAL, NULL, NULL, NOTIFICATION_OPTION_NONE); /* handle the host state change */ handle_host_event(hst); /* the host just recovered, so reset the current host attempt */ if(hst->current_state == HOST_UP) hst->current_attempt = 1; /* the host recovered, so reset the current notification number and state flags (after the recovery notification has gone out) */ if(hst->current_state == HOST_UP) { hst->current_notification_number = 0; hst->notified_on = 0; } } /* else the host state has not changed */ else { /* notify contacts if host is still down or unreachable */ if(hst->current_state != HOST_UP && hst->state_type == HARD_STATE) host_notification(hst, NOTIFICATION_NORMAL, NULL, NULL, NOTIFICATION_OPTION_NONE); /* if we're in a soft state and we should log host retries, do so now... */ if(hst->state_type == SOFT_STATE && log_host_retries == TRUE) log_host_event(hst); } return OK; } /* Parses raw plugin output and returns: short and long output, perf data. */ int parse_check_output(char *buf, char **short_output, char **long_output, char **perf_data, int escape_newlines_please, int newlines_are_escaped) { int current_line = 0; int eof = FALSE; int in_perf_data = FALSE; const int dbuf_chunk = 1024; dbuf long_text; dbuf perf_text; char *ptr = NULL; int x = 0; int y = 0; /* Initialize output values. */ if (short_output) *short_output = NULL; if (long_output) *long_output = NULL; if (perf_data) *perf_data = NULL; /* No input provided or no output requested, nothing to do. */ if (!buf || !*buf || (!short_output && !long_output && !perf_data)) return OK; /* Initialize dynamic buffers (1KB chunk size). */ dbuf_init(&long_text, dbuf_chunk); dbuf_init(&perf_text, dbuf_chunk); /* We should never need to worry about unescaping here again. We assume a * common internal plugin output format that is newline delimited. */ if (newlines_are_escaped) { for (x = 0, y = 0; buf[x]; x++) { if (buf[x] == '\\' && buf[x + 1] == '\\') { x++; buf[y++] = buf[x]; } else if (buf[x] == '\\' && buf[x + 1] == 'n') { x++; buf[y++] = '\n'; } else buf[y++] = buf[x]; } buf[y] = '\0'; } /* Process each line of input. */ for (x = 0; !eof && buf[0]; x++) { /* Continue on until we reach the end of a line (or input). */ if (buf[x] == '\n') buf[x] = '\0'; else if (buf[x] == '\0') eof = TRUE; else continue; /* Handle this line of input. */ current_line++; /* The first line contains short plugin output and optional perf data. */ if (current_line == 1) { /* Get the short plugin output. If buf[0] is '|', strtok() will * return buf+1 or NULL if buf[1] is '\0'. We use my_strtok() * instead which returns a pointer to '\0' in this case. */ if ((ptr = my_strtok(buf, "|"))) { if (short_output) { strip(ptr); /* Remove leading and trailing whitespace. */ *short_output = strdup(ptr); } /* Get the optional perf data. */ if ((ptr = my_strtok(NULL, "\n"))) dbuf_strcat(&perf_text, ptr); } } /* Additional lines contain long plugin output and optional perf data. * Once we've hit perf data, the rest of the output is perf data. */ else if (in_perf_data) { if (perf_text.buf && *perf_text.buf) dbuf_strcat(&perf_text, " "); dbuf_strcat(&perf_text, buf); } /* Look for the perf data separator. */ else if (strchr(buf, '|')) { in_perf_data = TRUE; if ((ptr = my_strtok(buf, "|"))) { /* Get the remaining long plugin output. */ if (current_line > 2) dbuf_strcat(&long_text, "\n"); dbuf_strcat(&long_text, ptr); /* Get the perf data. */ if ((ptr = my_strtok(NULL, "\n"))) { if (perf_text.buf && *perf_text.buf) dbuf_strcat(&perf_text, " "); dbuf_strcat(&perf_text, ptr); } } } /* Otherwise it's still just long output. */ else { if (current_line > 2) dbuf_strcat(&long_text, "\n"); dbuf_strcat(&long_text, buf); } /* Point buf to the start of the next line. *(buf+x+1) will be a valid * memory reference on our next iteration or we are at the end of input * (eof == TRUE) and *(buf+x+1) will never be referenced. */ buf += x + 1; x = -1; /* x will be incremented to 0 by the loop update. */ } /* Save long output. */ if (long_output && long_text.buf && *long_text.buf) { /* Escape newlines (and backslashes) in long output if requested. */ if (escape_newlines_please) *long_output = escape_newlines(long_text.buf); else *long_output = strdup(long_text.buf); } /* Save perf data. */ if (perf_data && perf_text.buf && *perf_text.buf) { strip(perf_text.buf); /* Remove leading and trailing whitespace. */ *perf_data = strdup(perf_text.buf); } /* free dynamic buffers */ dbuf_free(&long_text); dbuf_free(&perf_text); return OK; } nagios-4.3.4/base/commands.c000066400000000000000000004565521314764422400157110ustar00rootroot00000000000000/***************************************************************************** * * COMMANDS.C - External command functions for Nagios * * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #include "../include/config.h" #include "../include/common.h" #include "../include/comments.h" #include "../include/downtime.h" #include "../include/statusdata.h" #include "../include/perfdata.h" #include "../include/sretention.h" #include "../include/broker.h" #include "../include/nagios.h" #include "../include/workers.h" extern int sigrestart; static int command_file_fd; static FILE *command_file_fp; static int command_file_created = FALSE; /* The command file worker process */ static struct { /* these must come first for check source detection */ const char *type; const char *source_name; int pid; int sd; iocache *ioc; } command_worker = { "command file", "command file worker", 0, 0, NULL }; /******************************************************************/ /************* EXTERNAL COMMAND WORKER CONTROLLERS ****************/ /******************************************************************/ /* creates external command file as a named pipe (FIFO) and opens it for reading (non-blocked mode) */ int open_command_file(void) { struct stat st; int result = 0; /* if we're not checking external commands, don't do anything */ if(check_external_commands == FALSE) return OK; /* the command file was already created */ if(command_file_created == TRUE) return OK; /* reset umask (group needs write permissions) */ umask(S_IWOTH); /* use existing FIFO if possible */ if(!(stat(command_file, &st) != -1 && (st.st_mode & S_IFIFO))) { /* create the external command file as a named pipe (FIFO) */ if((result = mkfifo(command_file, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP)) != 0) { logit(NSLOG_RUNTIME_ERROR, TRUE, "Error: Could not create external command file '%s' as named pipe: (%d) -> %s. If this file already exists and you are sure that another copy of Nagios is not running, you should delete this file.\n", command_file, errno, strerror(errno)); return ERROR; } } /* open the command file for reading (non-blocked) - O_TRUNC flag cannot be used due to errors on some systems */ /* NOTE: file must be opened read-write for poll() to work */ if((command_file_fd = open(command_file, O_RDWR | O_NONBLOCK)) < 0) { logit(NSLOG_RUNTIME_ERROR, TRUE, "Error: Could not open external command file for reading via open(): (%d) -> %s\n", errno, strerror(errno)); return ERROR; } /* set a flag to remember we already created the file */ command_file_created = TRUE; return OK; } /* closes the external command file FIFO and deletes it */ int close_command_file(void) { /* if we're not checking external commands, don't do anything */ if(check_external_commands == FALSE) return OK; /* the command file wasn't created or was already cleaned up */ if(command_file_created == FALSE) return OK; /* reset our flag */ command_file_created = FALSE; /* close the command file */ fclose(command_file_fp); return OK; } /* shutdown command file worker thread */ int shutdown_command_file_worker(void) { if (!command_worker.pid) return 0; iocache_destroy(command_worker.ioc); command_worker.ioc = NULL; iobroker_close(nagios_iobs, command_worker.sd); command_worker.sd = -1; kill(command_worker.pid, SIGKILL); command_worker.pid = 0; return 0; } static int command_input_handler(int sd, int events, void *discard) { int ret, cmd_ret; char *buf; unsigned long size; if (sigrestart) return 0; ret = iocache_read(command_worker.ioc, sd); log_debug_info(DEBUGL_COMMANDS, 2, "Read %d bytes from command worker\n", ret); if (ret == 0) { logit(NSLOG_RUNTIME_WARNING, TRUE, "Command file worker seems to have died. Respawning\n"); shutdown_command_file_worker(); launch_command_file_worker(); return 0; } while ((buf = iocache_use_delim(command_worker.ioc, "\n", 1, &size))) { if (buf[0] == '[') { /* raw external command */ buf[size] = 0; log_debug_info(DEBUGL_COMMANDS, 1, "Read raw external command '%s'\n", buf); } if ((cmd_ret = process_external_command1(buf)) != CMD_ERROR_OK) { logit(NSLOG_EXTERNAL_COMMAND | NSLOG_RUNTIME_WARNING, TRUE, "External command error: %s\n", cmd_error_strerror(cmd_ret)); } } return 0; } /* main controller of command file helper process */ static int command_file_worker(int sd) { iocache *ioc; if (open_command_file() == ERROR) return (EXIT_FAILURE); ioc = iocache_create(65536); if (!ioc) exit(EXIT_FAILURE); while(1) { struct pollfd pfd; int pollval, ret; char *buf; unsigned long size; /* if our master has gone away, we need to die */ if (kill(nagios_pid, 0) < 0 && errno == ESRCH) { return EXIT_SUCCESS; } errno = 0; /* wait for data to arrive */ /* select seems to not work, so we have to use poll instead */ /* 10-15-08 EG check into implementing William's patch @ http://blog.netways.de/2008/08/15/nagios-unter-mac-os-x-installieren/ */ /* 10-15-08 EG poll() seems broken on OSX - see Jonathan's patch a few lines down */ pfd.fd = command_file_fd; pfd.events = POLLIN; pollval = poll(&pfd, 1, 500); /* loop if no data */ if(pollval == 0) continue; /* check for errors */ if(pollval == -1) { /* @todo printf("Failed to poll() command file pipe: %m\n"); */ if (errno == EINTR) continue; return EXIT_FAILURE; } errno = 0; ret = iocache_read(ioc, command_file_fd); if (ret < 1) { if (errno == EINTR) continue; return EXIT_FAILURE; } size = iocache_available(ioc); buf = iocache_use_size(ioc, size); ret = write(sd, buf, size); /* * @todo Add libio to get io_write_all(), which handles * EINTR and EAGAIN properly instead of just exiting. */ if (ret < 0 && errno != EINTR) return EXIT_FAILURE; } /* while(1) */ } int launch_command_file_worker(void) { int ret, sv[2]; char *str; #ifdef HAVE_SIGACTION struct sigaction sig_action; #endif /* * if we're restarting, we may well already have a command * file worker process attached. Keep it if that's so. */ if (command_worker.pid && kill(command_worker.pid, 0) == 0 && iobroker_is_registered(nagios_iobs, command_worker.sd)) { return 0; } if (socketpair(AF_UNIX, SOCK_STREAM, 0, sv) < 0) { logit(NSLOG_RUNTIME_ERROR, TRUE, "Failed to create socketpair for command file worker: %m\n"); return ERROR; } command_worker.pid = fork(); if (command_worker.pid < 0) { logit(NSLOG_RUNTIME_ERROR, TRUE, "Failed to fork() command file worker: %m\n"); goto err_close; } if (command_worker.pid) { command_worker.ioc = iocache_create(512 * 1024); if (!command_worker.ioc) { logit(NSLOG_RUNTIME_ERROR, TRUE, "Failed to create I/O cache for command file worker: %m\n"); goto err_close; } command_worker.sd = sv[0]; ret = iobroker_register(nagios_iobs, command_worker.sd, NULL, command_input_handler); if (ret < 0) { logit(NSLOG_RUNTIME_ERROR, TRUE, "Failed to register command file worker socket %d with io broker %p: %s; errno=%d: %s\n", command_worker.sd, nagios_iobs, iobroker_strerror(ret), errno, strerror(errno)); iocache_destroy(command_worker.ioc); goto err_close; } logit(NSLOG_INFO_MESSAGE, TRUE, "Successfully launched command file worker with pid %d\n", command_worker.pid); return OK; } /* child goes here */ close(sv[0]); /* make our own process-group so we can be traced into and stuff */ setpgid(0, 0); /* we must preserve command_file before nuking memory */ (void)chdir("/tmp"); (void)chdir("nagios-cfw"); str = strdup(command_file); free_memory(get_global_macros()); command_file = str; #ifdef HAVE_SIGACTION sig_action.sa_sigaction = NULL; sig_action.sa_handler = SIG_IGN; sigemptyset(&sig_action.sa_mask); sig_action.sa_flags = 0; sigaction(SIGPIPE, &sig_action, NULL); #else signal(SIGPIPE, SIG_IGN); #endif exit(command_file_worker(sv[1])); /* error conditions for parent */ err_close: close(sv[0]); close(sv[1]); command_worker.pid = 0; command_worker.sd = -1; return ERROR; } /******************************************************************/ /****************** EXTERNAL COMMAND PROCESSING *******************/ /******************************************************************/ /*** stupid helpers ****/ static host *find_host_by_name_or_address(const char *name) { host *h; if ((h = find_host(name)) || !name) return h; for (h = host_list; h; h = h->next) if (!strcmp(h->address, name)) return h; return NULL; } /* processes all external commands in a (regular) file */ int process_external_commands_from_file(char *fname, int delete_file) { mmapfile *thefile = NULL; char *input = NULL; log_debug_info(DEBUGL_FUNCTIONS, 0, "process_external_commands_from_file()\n"); if(fname == NULL) return ERROR; log_debug_info(DEBUGL_EXTERNALCOMMANDS, 1, "Processing commands from file '%s'. File will %s deleted after processing.\n", fname, (delete_file == TRUE) ? "be" : "NOT be"); /* open the config file for reading */ if((thefile = mmap_fopen(fname)) == NULL) { logit(NSLOG_INFO_MESSAGE, FALSE, "Error: Cannot open file '%s' to process external commands!", fname); return ERROR; } /* process all commands in the file */ while(1) { /* free memory */ my_free(input); /* read the next line */ if((input = mmap_fgets(thefile)) == NULL) break; /* process the command */ process_external_command1(input); } /* close the file */ mmap_fclose(thefile); /* delete the file */ if(delete_file == TRUE) unlink(fname); return OK; } /* top-level external command processor */ int process_external_command1(char *cmd) { char *temp_buffer = NULL; char *command_id = NULL; char *args = NULL; time_t entry_time = 0L; int command_type = CMD_NONE; char *temp_ptr = NULL; int external_command_ret = OK; log_debug_info(DEBUGL_FUNCTIONS, 0, "process_external_command1()\n"); if(cmd == NULL) return CMD_ERROR_MALFORMED_COMMAND; /* strip the command of newlines and carriage returns */ strip(cmd); log_debug_info(DEBUGL_EXTERNALCOMMANDS, 2, "Raw command entry: %s\n", cmd); /* get the command entry time */ if((temp_ptr = my_strtok(cmd, "[")) == NULL) return CMD_ERROR_MALFORMED_COMMAND; if((temp_ptr = my_strtok(NULL, "]")) == NULL) return CMD_ERROR_MALFORMED_COMMAND; entry_time = (time_t)strtoul(temp_ptr, NULL, 10); /* get the command identifier */ if((temp_ptr = my_strtok(NULL, ";")) == NULL) return CMD_ERROR_MALFORMED_COMMAND; if((command_id = (char *)strdup(temp_ptr + 1)) == NULL) return CMD_ERROR_INTERNAL_ERROR; /* get the command arguments */ if((temp_ptr = my_strtok(NULL, "\n")) == NULL) args = (char *)strdup(""); else args = (char *)strdup(temp_ptr); if(args == NULL) { my_free(command_id); return CMD_ERROR_INTERNAL_ERROR; } /* decide what type of command this is... */ /**************************/ /**** PROCESS COMMANDS ****/ /**************************/ if(!strcmp(command_id, "ENTER_STANDBY_MODE") || !strcmp(command_id, "DISABLE_NOTIFICATIONS")) command_type = CMD_DISABLE_NOTIFICATIONS; else if(!strcmp(command_id, "ENTER_ACTIVE_MODE") || !strcmp(command_id, "ENABLE_NOTIFICATIONS")) command_type = CMD_ENABLE_NOTIFICATIONS; else if(!strcmp(command_id, "SHUTDOWN_PROGRAM") || !strcmp(command_id, "SHUTDOWN_PROCESS")) command_type = CMD_SHUTDOWN_PROCESS; else if(!strcmp(command_id, "RESTART_PROGRAM") || !strcmp(command_id, "RESTART_PROCESS")) command_type = CMD_RESTART_PROCESS; else if(!strcmp(command_id, "SAVE_STATE_INFORMATION")) command_type = CMD_SAVE_STATE_INFORMATION; else if(!strcmp(command_id, "READ_STATE_INFORMATION")) command_type = CMD_READ_STATE_INFORMATION; else if(!strcmp(command_id, "ENABLE_EVENT_HANDLERS")) command_type = CMD_ENABLE_EVENT_HANDLERS; else if(!strcmp(command_id, "DISABLE_EVENT_HANDLERS")) command_type = CMD_DISABLE_EVENT_HANDLERS; else if(!strcmp(command_id, "ENABLE_PERFORMANCE_DATA")) command_type = CMD_ENABLE_PERFORMANCE_DATA; else if(!strcmp(command_id, "DISABLE_PERFORMANCE_DATA")) command_type = CMD_DISABLE_PERFORMANCE_DATA; else if(!strcmp(command_id, "START_EXECUTING_HOST_CHECKS")) command_type = CMD_START_EXECUTING_HOST_CHECKS; else if(!strcmp(command_id, "STOP_EXECUTING_HOST_CHECKS")) command_type = CMD_STOP_EXECUTING_HOST_CHECKS; else if(!strcmp(command_id, "START_EXECUTING_SVC_CHECKS")) command_type = CMD_START_EXECUTING_SVC_CHECKS; else if(!strcmp(command_id, "STOP_EXECUTING_SVC_CHECKS")) command_type = CMD_STOP_EXECUTING_SVC_CHECKS; else if(!strcmp(command_id, "START_ACCEPTING_PASSIVE_HOST_CHECKS")) command_type = CMD_START_ACCEPTING_PASSIVE_HOST_CHECKS; else if(!strcmp(command_id, "STOP_ACCEPTING_PASSIVE_HOST_CHECKS")) command_type = CMD_STOP_ACCEPTING_PASSIVE_HOST_CHECKS; else if(!strcmp(command_id, "START_ACCEPTING_PASSIVE_SVC_CHECKS")) command_type = CMD_START_ACCEPTING_PASSIVE_SVC_CHECKS; else if(!strcmp(command_id, "STOP_ACCEPTING_PASSIVE_SVC_CHECKS")) command_type = CMD_STOP_ACCEPTING_PASSIVE_SVC_CHECKS; else if(!strcmp(command_id, "START_OBSESSING_OVER_HOST_CHECKS")) command_type = CMD_START_OBSESSING_OVER_HOST_CHECKS; else if(!strcmp(command_id, "STOP_OBSESSING_OVER_HOST_CHECKS")) command_type = CMD_STOP_OBSESSING_OVER_HOST_CHECKS; else if(!strcmp(command_id, "START_OBSESSING_OVER_SVC_CHECKS")) command_type = CMD_START_OBSESSING_OVER_SVC_CHECKS; else if(!strcmp(command_id, "STOP_OBSESSING_OVER_SVC_CHECKS")) command_type = CMD_STOP_OBSESSING_OVER_SVC_CHECKS; else if(!strcmp(command_id, "ENABLE_FLAP_DETECTION")) command_type = CMD_ENABLE_FLAP_DETECTION; else if(!strcmp(command_id, "DISABLE_FLAP_DETECTION")) command_type = CMD_DISABLE_FLAP_DETECTION; else if(!strcmp(command_id, "CHANGE_GLOBAL_HOST_EVENT_HANDLER")) command_type = CMD_CHANGE_GLOBAL_HOST_EVENT_HANDLER; else if(!strcmp(command_id, "CHANGE_GLOBAL_SVC_EVENT_HANDLER")) command_type = CMD_CHANGE_GLOBAL_SVC_EVENT_HANDLER; else if(!strcmp(command_id, "ENABLE_SERVICE_FRESHNESS_CHECKS")) command_type = CMD_ENABLE_SERVICE_FRESHNESS_CHECKS; else if(!strcmp(command_id, "DISABLE_SERVICE_FRESHNESS_CHECKS")) command_type = CMD_DISABLE_SERVICE_FRESHNESS_CHECKS; else if(!strcmp(command_id, "ENABLE_HOST_FRESHNESS_CHECKS")) command_type = CMD_ENABLE_HOST_FRESHNESS_CHECKS; else if(!strcmp(command_id, "DISABLE_HOST_FRESHNESS_CHECKS")) command_type = CMD_DISABLE_HOST_FRESHNESS_CHECKS; /*******************************/ /**** HOST-RELATED COMMANDS ****/ /*******************************/ else if(!strcmp(command_id, "ADD_HOST_COMMENT")) command_type = CMD_ADD_HOST_COMMENT; else if(!strcmp(command_id, "DEL_HOST_COMMENT")) command_type = CMD_DEL_HOST_COMMENT; else if(!strcmp(command_id, "DEL_ALL_HOST_COMMENTS")) command_type = CMD_DEL_ALL_HOST_COMMENTS; else if(!strcmp(command_id, "DELAY_HOST_NOTIFICATION")) command_type = CMD_DELAY_HOST_NOTIFICATION; else if(!strcmp(command_id, "ENABLE_HOST_NOTIFICATIONS")) command_type = CMD_ENABLE_HOST_NOTIFICATIONS; else if(!strcmp(command_id, "DISABLE_HOST_NOTIFICATIONS")) command_type = CMD_DISABLE_HOST_NOTIFICATIONS; else if(!strcmp(command_id, "ENABLE_ALL_NOTIFICATIONS_BEYOND_HOST")) command_type = CMD_ENABLE_ALL_NOTIFICATIONS_BEYOND_HOST; else if(!strcmp(command_id, "DISABLE_ALL_NOTIFICATIONS_BEYOND_HOST")) command_type = CMD_DISABLE_ALL_NOTIFICATIONS_BEYOND_HOST; else if(!strcmp(command_id, "ENABLE_HOST_AND_CHILD_NOTIFICATIONS")) command_type = CMD_ENABLE_HOST_AND_CHILD_NOTIFICATIONS; else if(!strcmp(command_id, "DISABLE_HOST_AND_CHILD_NOTIFICATIONS")) command_type = CMD_DISABLE_HOST_AND_CHILD_NOTIFICATIONS; else if(!strcmp(command_id, "ENABLE_HOST_SVC_NOTIFICATIONS")) command_type = CMD_ENABLE_HOST_SVC_NOTIFICATIONS; else if(!strcmp(command_id, "DISABLE_HOST_SVC_NOTIFICATIONS")) command_type = CMD_DISABLE_HOST_SVC_NOTIFICATIONS; else if(!strcmp(command_id, "ENABLE_HOST_SVC_CHECKS")) command_type = CMD_ENABLE_HOST_SVC_CHECKS; else if(!strcmp(command_id, "DISABLE_HOST_SVC_CHECKS")) command_type = CMD_DISABLE_HOST_SVC_CHECKS; else if(!strcmp(command_id, "ENABLE_PASSIVE_HOST_CHECKS")) command_type = CMD_ENABLE_PASSIVE_HOST_CHECKS; else if(!strcmp(command_id, "DISABLE_PASSIVE_HOST_CHECKS")) command_type = CMD_DISABLE_PASSIVE_HOST_CHECKS; else if(!strcmp(command_id, "SCHEDULE_HOST_SVC_CHECKS")) command_type = CMD_SCHEDULE_HOST_SVC_CHECKS; else if(!strcmp(command_id, "SCHEDULE_FORCED_HOST_SVC_CHECKS")) command_type = CMD_SCHEDULE_FORCED_HOST_SVC_CHECKS; else if(!strcmp(command_id, "ACKNOWLEDGE_HOST_PROBLEM")) command_type = CMD_ACKNOWLEDGE_HOST_PROBLEM; else if(!strcmp(command_id, "REMOVE_HOST_ACKNOWLEDGEMENT")) command_type = CMD_REMOVE_HOST_ACKNOWLEDGEMENT; else if(!strcmp(command_id, "ENABLE_HOST_EVENT_HANDLER")) command_type = CMD_ENABLE_HOST_EVENT_HANDLER; else if(!strcmp(command_id, "DISABLE_HOST_EVENT_HANDLER")) command_type = CMD_DISABLE_HOST_EVENT_HANDLER; else if(!strcmp(command_id, "ENABLE_HOST_CHECK")) command_type = CMD_ENABLE_HOST_CHECK; else if(!strcmp(command_id, "DISABLE_HOST_CHECK")) command_type = CMD_DISABLE_HOST_CHECK; else if(!strcmp(command_id, "SCHEDULE_HOST_CHECK")) command_type = CMD_SCHEDULE_HOST_CHECK; else if(!strcmp(command_id, "SCHEDULE_FORCED_HOST_CHECK")) command_type = CMD_SCHEDULE_FORCED_HOST_CHECK; else if(!strcmp(command_id, "SCHEDULE_HOST_DOWNTIME")) command_type = CMD_SCHEDULE_HOST_DOWNTIME; else if(!strcmp(command_id, "SCHEDULE_HOST_SVC_DOWNTIME")) command_type = CMD_SCHEDULE_HOST_SVC_DOWNTIME; else if(!strcmp(command_id, "DEL_HOST_DOWNTIME")) command_type = CMD_DEL_HOST_DOWNTIME; else if(!strcmp(command_id, "DEL_DOWNTIME_BY_HOST_NAME")) command_type = CMD_DEL_DOWNTIME_BY_HOST_NAME; else if(!strcmp(command_id, "DEL_DOWNTIME_BY_HOSTGROUP_NAME")) command_type = CMD_DEL_DOWNTIME_BY_HOSTGROUP_NAME; else if(!strcmp(command_id, "DEL_DOWNTIME_BY_START_TIME_COMMENT")) command_type = CMD_DEL_DOWNTIME_BY_START_TIME_COMMENT; else if(!strcmp(command_id, "ENABLE_HOST_FLAP_DETECTION")) command_type = CMD_ENABLE_HOST_FLAP_DETECTION; else if(!strcmp(command_id, "DISABLE_HOST_FLAP_DETECTION")) command_type = CMD_DISABLE_HOST_FLAP_DETECTION; else if(!strcmp(command_id, "START_OBSESSING_OVER_HOST")) command_type = CMD_START_OBSESSING_OVER_HOST; else if(!strcmp(command_id, "STOP_OBSESSING_OVER_HOST")) command_type = CMD_STOP_OBSESSING_OVER_HOST; else if(!strcmp(command_id, "CHANGE_HOST_EVENT_HANDLER")) command_type = CMD_CHANGE_HOST_EVENT_HANDLER; else if(!strcmp(command_id, "CHANGE_HOST_CHECK_COMMAND")) command_type = CMD_CHANGE_HOST_CHECK_COMMAND; else if(!strcmp(command_id, "CHANGE_NORMAL_HOST_CHECK_INTERVAL")) command_type = CMD_CHANGE_NORMAL_HOST_CHECK_INTERVAL; else if(!strcmp(command_id, "CHANGE_RETRY_HOST_CHECK_INTERVAL")) command_type = CMD_CHANGE_RETRY_HOST_CHECK_INTERVAL; else if(!strcmp(command_id, "CHANGE_MAX_HOST_CHECK_ATTEMPTS")) command_type = CMD_CHANGE_MAX_HOST_CHECK_ATTEMPTS; else if(!strcmp(command_id, "SCHEDULE_AND_PROPAGATE_TRIGGERED_HOST_DOWNTIME")) command_type = CMD_SCHEDULE_AND_PROPAGATE_TRIGGERED_HOST_DOWNTIME; else if(!strcmp(command_id, "SCHEDULE_AND_PROPAGATE_HOST_DOWNTIME")) command_type = CMD_SCHEDULE_AND_PROPAGATE_HOST_DOWNTIME; else if(!strcmp(command_id, "SET_HOST_NOTIFICATION_NUMBER")) command_type = CMD_SET_HOST_NOTIFICATION_NUMBER; else if(!strcmp(command_id, "CHANGE_HOST_CHECK_TIMEPERIOD")) command_type = CMD_CHANGE_HOST_CHECK_TIMEPERIOD; else if(!strcmp(command_id, "CHANGE_CUSTOM_HOST_VAR")) command_type = CMD_CHANGE_CUSTOM_HOST_VAR; else if(!strcmp(command_id, "SEND_CUSTOM_HOST_NOTIFICATION")) command_type = CMD_SEND_CUSTOM_HOST_NOTIFICATION; else if(!strcmp(command_id, "CHANGE_HOST_NOTIFICATION_TIMEPERIOD")) command_type = CMD_CHANGE_HOST_NOTIFICATION_TIMEPERIOD; else if(!strcmp(command_id, "CHANGE_HOST_MODATTR")) command_type = CMD_CHANGE_HOST_MODATTR; else if (!strcmp(command_id,"CLEAR_HOST_FLAPPING_STATE")) command_type = CMD_CLEAR_HOST_FLAPPING_STATE; /************************************/ /**** HOSTGROUP-RELATED COMMANDS ****/ /************************************/ else if(!strcmp(command_id, "ENABLE_HOSTGROUP_HOST_NOTIFICATIONS")) command_type = CMD_ENABLE_HOSTGROUP_HOST_NOTIFICATIONS; else if(!strcmp(command_id, "DISABLE_HOSTGROUP_HOST_NOTIFICATIONS")) command_type = CMD_DISABLE_HOSTGROUP_HOST_NOTIFICATIONS; else if(!strcmp(command_id, "ENABLE_HOSTGROUP_SVC_NOTIFICATIONS")) command_type = CMD_ENABLE_HOSTGROUP_SVC_NOTIFICATIONS; else if(!strcmp(command_id, "DISABLE_HOSTGROUP_SVC_NOTIFICATIONS")) command_type = CMD_DISABLE_HOSTGROUP_SVC_NOTIFICATIONS; else if(!strcmp(command_id, "ENABLE_HOSTGROUP_HOST_CHECKS")) command_type = CMD_ENABLE_HOSTGROUP_HOST_CHECKS; else if(!strcmp(command_id, "DISABLE_HOSTGROUP_HOST_CHECKS")) command_type = CMD_DISABLE_HOSTGROUP_HOST_CHECKS; else if(!strcmp(command_id, "ENABLE_HOSTGROUP_PASSIVE_HOST_CHECKS")) command_type = CMD_ENABLE_HOSTGROUP_PASSIVE_HOST_CHECKS; else if(!strcmp(command_id, "DISABLE_HOSTGROUP_PASSIVE_HOST_CHECKS")) command_type = CMD_DISABLE_HOSTGROUP_PASSIVE_HOST_CHECKS; else if(!strcmp(command_id, "ENABLE_HOSTGROUP_SVC_CHECKS")) command_type = CMD_ENABLE_HOSTGROUP_SVC_CHECKS; else if(!strcmp(command_id, "DISABLE_HOSTGROUP_SVC_CHECKS")) command_type = CMD_DISABLE_HOSTGROUP_SVC_CHECKS; else if(!strcmp(command_id, "ENABLE_HOSTGROUP_PASSIVE_SVC_CHECKS")) command_type = CMD_ENABLE_HOSTGROUP_PASSIVE_SVC_CHECKS; else if(!strcmp(command_id, "DISABLE_HOSTGROUP_PASSIVE_SVC_CHECKS")) command_type = CMD_DISABLE_HOSTGROUP_PASSIVE_SVC_CHECKS; else if(!strcmp(command_id, "SCHEDULE_HOSTGROUP_HOST_DOWNTIME")) command_type = CMD_SCHEDULE_HOSTGROUP_HOST_DOWNTIME; else if(!strcmp(command_id, "SCHEDULE_HOSTGROUP_SVC_DOWNTIME")) command_type = CMD_SCHEDULE_HOSTGROUP_SVC_DOWNTIME; /**********************************/ /**** SERVICE-RELATED COMMANDS ****/ /**********************************/ else if(!strcmp(command_id, "ADD_SVC_COMMENT")) command_type = CMD_ADD_SVC_COMMENT; else if(!strcmp(command_id, "DEL_SVC_COMMENT")) command_type = CMD_DEL_SVC_COMMENT; else if(!strcmp(command_id, "DEL_ALL_SVC_COMMENTS")) command_type = CMD_DEL_ALL_SVC_COMMENTS; else if(!strcmp(command_id, "SCHEDULE_SVC_CHECK")) command_type = CMD_SCHEDULE_SVC_CHECK; else if(!strcmp(command_id, "SCHEDULE_FORCED_SVC_CHECK")) command_type = CMD_SCHEDULE_FORCED_SVC_CHECK; else if(!strcmp(command_id, "ENABLE_SVC_CHECK")) command_type = CMD_ENABLE_SVC_CHECK; else if(!strcmp(command_id, "DISABLE_SVC_CHECK")) command_type = CMD_DISABLE_SVC_CHECK; else if(!strcmp(command_id, "ENABLE_PASSIVE_SVC_CHECKS")) command_type = CMD_ENABLE_PASSIVE_SVC_CHECKS; else if(!strcmp(command_id, "DISABLE_PASSIVE_SVC_CHECKS")) command_type = CMD_DISABLE_PASSIVE_SVC_CHECKS; else if(!strcmp(command_id, "DELAY_SVC_NOTIFICATION")) command_type = CMD_DELAY_SVC_NOTIFICATION; else if(!strcmp(command_id, "ENABLE_SVC_NOTIFICATIONS")) command_type = CMD_ENABLE_SVC_NOTIFICATIONS; else if(!strcmp(command_id, "DISABLE_SVC_NOTIFICATIONS")) command_type = CMD_DISABLE_SVC_NOTIFICATIONS; else if(!strcmp(command_id, "PROCESS_SERVICE_CHECK_RESULT")) command_type = CMD_PROCESS_SERVICE_CHECK_RESULT; else if(!strcmp(command_id, "PROCESS_HOST_CHECK_RESULT")) command_type = CMD_PROCESS_HOST_CHECK_RESULT; else if(!strcmp(command_id, "ENABLE_SVC_EVENT_HANDLER")) command_type = CMD_ENABLE_SVC_EVENT_HANDLER; else if(!strcmp(command_id, "DISABLE_SVC_EVENT_HANDLER")) command_type = CMD_DISABLE_SVC_EVENT_HANDLER; else if(!strcmp(command_id, "ENABLE_SVC_FLAP_DETECTION")) command_type = CMD_ENABLE_SVC_FLAP_DETECTION; else if(!strcmp(command_id, "DISABLE_SVC_FLAP_DETECTION")) command_type = CMD_DISABLE_SVC_FLAP_DETECTION; else if(!strcmp(command_id, "SCHEDULE_SVC_DOWNTIME")) command_type = CMD_SCHEDULE_SVC_DOWNTIME; else if(!strcmp(command_id, "DEL_SVC_DOWNTIME")) command_type = CMD_DEL_SVC_DOWNTIME; else if(!strcmp(command_id, "ACKNOWLEDGE_SVC_PROBLEM")) command_type = CMD_ACKNOWLEDGE_SVC_PROBLEM; else if(!strcmp(command_id, "REMOVE_SVC_ACKNOWLEDGEMENT")) command_type = CMD_REMOVE_SVC_ACKNOWLEDGEMENT; else if(!strcmp(command_id, "START_OBSESSING_OVER_SVC")) command_type = CMD_START_OBSESSING_OVER_SVC; else if(!strcmp(command_id, "STOP_OBSESSING_OVER_SVC")) command_type = CMD_STOP_OBSESSING_OVER_SVC; else if(!strcmp(command_id, "CHANGE_SVC_EVENT_HANDLER")) command_type = CMD_CHANGE_SVC_EVENT_HANDLER; else if(!strcmp(command_id, "CHANGE_SVC_CHECK_COMMAND")) command_type = CMD_CHANGE_SVC_CHECK_COMMAND; else if(!strcmp(command_id, "CHANGE_NORMAL_SVC_CHECK_INTERVAL")) command_type = CMD_CHANGE_NORMAL_SVC_CHECK_INTERVAL; else if(!strcmp(command_id, "CHANGE_RETRY_SVC_CHECK_INTERVAL")) command_type = CMD_CHANGE_RETRY_SVC_CHECK_INTERVAL; else if(!strcmp(command_id, "CHANGE_MAX_SVC_CHECK_ATTEMPTS")) command_type = CMD_CHANGE_MAX_SVC_CHECK_ATTEMPTS; else if(!strcmp(command_id, "SET_SVC_NOTIFICATION_NUMBER")) command_type = CMD_SET_SVC_NOTIFICATION_NUMBER; else if(!strcmp(command_id, "CHANGE_SVC_CHECK_TIMEPERIOD")) command_type = CMD_CHANGE_SVC_CHECK_TIMEPERIOD; else if(!strcmp(command_id, "CHANGE_CUSTOM_SVC_VAR")) command_type = CMD_CHANGE_CUSTOM_SVC_VAR; else if(!strcmp(command_id, "CHANGE_CUSTOM_CONTACT_VAR")) command_type = CMD_CHANGE_CUSTOM_CONTACT_VAR; else if(!strcmp(command_id, "SEND_CUSTOM_SVC_NOTIFICATION")) command_type = CMD_SEND_CUSTOM_SVC_NOTIFICATION; else if(!strcmp(command_id, "CHANGE_SVC_NOTIFICATION_TIMEPERIOD")) command_type = CMD_CHANGE_SVC_NOTIFICATION_TIMEPERIOD; else if(!strcmp(command_id, "CHANGE_SVC_MODATTR")) command_type = CMD_CHANGE_SVC_MODATTR; else if (!strcmp(command_id,"CLEAR_SVC_FLAPPING_STATE")) command_type = CMD_CLEAR_SVC_FLAPPING_STATE; /***************************************/ /**** SERVICEGROUP-RELATED COMMANDS ****/ /***************************************/ else if(!strcmp(command_id, "ENABLE_SERVICEGROUP_HOST_NOTIFICATIONS")) command_type = CMD_ENABLE_SERVICEGROUP_HOST_NOTIFICATIONS; else if(!strcmp(command_id, "DISABLE_SERVICEGROUP_HOST_NOTIFICATIONS")) command_type = CMD_DISABLE_SERVICEGROUP_HOST_NOTIFICATIONS; else if(!strcmp(command_id, "ENABLE_SERVICEGROUP_SVC_NOTIFICATIONS")) command_type = CMD_ENABLE_SERVICEGROUP_SVC_NOTIFICATIONS; else if(!strcmp(command_id, "DISABLE_SERVICEGROUP_SVC_NOTIFICATIONS")) command_type = CMD_DISABLE_SERVICEGROUP_SVC_NOTIFICATIONS; else if(!strcmp(command_id, "ENABLE_SERVICEGROUP_HOST_CHECKS")) command_type = CMD_ENABLE_SERVICEGROUP_HOST_CHECKS; else if(!strcmp(command_id, "DISABLE_SERVICEGROUP_HOST_CHECKS")) command_type = CMD_DISABLE_SERVICEGROUP_HOST_CHECKS; else if(!strcmp(command_id, "ENABLE_SERVICEGROUP_PASSIVE_HOST_CHECKS")) command_type = CMD_ENABLE_SERVICEGROUP_PASSIVE_HOST_CHECKS; else if(!strcmp(command_id, "DISABLE_SERVICEGROUP_PASSIVE_HOST_CHECKS")) command_type = CMD_DISABLE_SERVICEGROUP_PASSIVE_HOST_CHECKS; else if(!strcmp(command_id, "ENABLE_SERVICEGROUP_SVC_CHECKS")) command_type = CMD_ENABLE_SERVICEGROUP_SVC_CHECKS; else if(!strcmp(command_id, "DISABLE_SERVICEGROUP_SVC_CHECKS")) command_type = CMD_DISABLE_SERVICEGROUP_SVC_CHECKS; else if(!strcmp(command_id, "ENABLE_SERVICEGROUP_PASSIVE_SVC_CHECKS")) command_type = CMD_ENABLE_SERVICEGROUP_PASSIVE_SVC_CHECKS; else if(!strcmp(command_id, "DISABLE_SERVICEGROUP_PASSIVE_SVC_CHECKS")) command_type = CMD_DISABLE_SERVICEGROUP_PASSIVE_SVC_CHECKS; else if(!strcmp(command_id, "SCHEDULE_SERVICEGROUP_HOST_DOWNTIME")) command_type = CMD_SCHEDULE_SERVICEGROUP_HOST_DOWNTIME; else if(!strcmp(command_id, "SCHEDULE_SERVICEGROUP_SVC_DOWNTIME")) command_type = CMD_SCHEDULE_SERVICEGROUP_SVC_DOWNTIME; /**********************************/ /**** CONTACT-RELATED COMMANDS ****/ /**********************************/ else if(!strcmp(command_id, "ENABLE_CONTACT_HOST_NOTIFICATIONS")) command_type = CMD_ENABLE_CONTACT_HOST_NOTIFICATIONS; else if(!strcmp(command_id, "DISABLE_CONTACT_HOST_NOTIFICATIONS")) command_type = CMD_DISABLE_CONTACT_HOST_NOTIFICATIONS; else if(!strcmp(command_id, "ENABLE_CONTACT_SVC_NOTIFICATIONS")) command_type = CMD_ENABLE_CONTACT_SVC_NOTIFICATIONS; else if(!strcmp(command_id, "DISABLE_CONTACT_SVC_NOTIFICATIONS")) command_type = CMD_DISABLE_CONTACT_SVC_NOTIFICATIONS; else if(!strcmp(command_id, "CHANGE_CONTACT_HOST_NOTIFICATION_TIMEPERIOD")) command_type = CMD_CHANGE_CONTACT_HOST_NOTIFICATION_TIMEPERIOD; else if(!strcmp(command_id, "CHANGE_CONTACT_SVC_NOTIFICATION_TIMEPERIOD")) command_type = CMD_CHANGE_CONTACT_SVC_NOTIFICATION_TIMEPERIOD; else if(!strcmp(command_id, "CHANGE_CONTACT_MODATTR")) command_type = CMD_CHANGE_CONTACT_MODATTR; else if(!strcmp(command_id, "CHANGE_CONTACT_MODHATTR")) command_type = CMD_CHANGE_CONTACT_MODHATTR; else if(!strcmp(command_id, "CHANGE_CONTACT_MODSATTR")) command_type = CMD_CHANGE_CONTACT_MODSATTR; /***************************************/ /**** CONTACTGROUP-RELATED COMMANDS ****/ /***************************************/ else if(!strcmp(command_id, "ENABLE_CONTACTGROUP_HOST_NOTIFICATIONS")) command_type = CMD_ENABLE_CONTACTGROUP_HOST_NOTIFICATIONS; else if(!strcmp(command_id, "DISABLE_CONTACTGROUP_HOST_NOTIFICATIONS")) command_type = CMD_DISABLE_CONTACTGROUP_HOST_NOTIFICATIONS; else if(!strcmp(command_id, "ENABLE_CONTACTGROUP_SVC_NOTIFICATIONS")) command_type = CMD_ENABLE_CONTACTGROUP_SVC_NOTIFICATIONS; else if(!strcmp(command_id, "DISABLE_CONTACTGROUP_SVC_NOTIFICATIONS")) command_type = CMD_DISABLE_CONTACTGROUP_SVC_NOTIFICATIONS; /**************************/ /****** MISC COMMANDS *****/ /**************************/ else if(!strcmp(command_id, "PROCESS_FILE")) command_type = CMD_PROCESS_FILE; /****************************/ /****** CUSTOM COMMANDS *****/ /****************************/ else if(command_id[0] == '_') command_type = CMD_CUSTOM_COMMAND; /**** UNKNOWN COMMAND ****/ else { /* log the bad external command */ logit(NSLOG_EXTERNAL_COMMAND | NSLOG_RUNTIME_WARNING, TRUE, "Warning: Unrecognized external command -> %s;%s\n", command_id, args); /* free memory */ my_free(command_id); my_free(args); return CMD_ERROR_UNKNOWN_COMMAND; } /* update statistics for external commands */ update_check_stats(EXTERNAL_COMMAND_STATS, time(NULL)); /* log the external command */ asprintf(&temp_buffer, "EXTERNAL COMMAND: %s;%s\n", command_id, args); if(command_type == CMD_PROCESS_SERVICE_CHECK_RESULT || command_type == CMD_PROCESS_HOST_CHECK_RESULT) { /* passive checks are logged in checks.c as well, as some my bypass external commands by getting dropped in checkresults dir */ if(log_passive_checks == TRUE) write_to_all_logs(temp_buffer, NSLOG_PASSIVE_CHECK); } else { if(log_external_commands == TRUE) write_to_all_logs(temp_buffer, NSLOG_EXTERNAL_COMMAND); } my_free(temp_buffer); #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_external_command(NEBTYPE_EXTERNALCOMMAND_START, NEBFLAG_NONE, NEBATTR_NONE, command_type, entry_time, command_id, args, NULL); #endif /* process the command */ external_command_ret = (process_external_command2(command_type, entry_time, args) == OK) ? CMD_ERROR_OK : CMD_ERROR_FAILURE; if (external_command_ret != CMD_ERROR_OK) { logit(NSLOG_EXTERNAL_COMMAND | NSLOG_RUNTIME_WARNING, TRUE, "Error: External command failed -> %s;%s\n", command_id, args); } #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_external_command(NEBTYPE_EXTERNALCOMMAND_END, NEBFLAG_NONE, NEBATTR_NONE, command_type, entry_time, command_id, args, NULL); #endif /* free memory */ my_free(command_id); my_free(args); return external_command_ret; } const char *cmd_error_strerror(int code) { switch(code) { case CMD_ERROR_OK: return "No error"; case CMD_ERROR_FAILURE: return "Command failed"; case CMD_ERROR_INTERNAL_ERROR: return "Internal error"; case CMD_ERROR_UNKNOWN_COMMAND: return "Unknown or unsupported command"; case CMD_ERROR_MALFORMED_COMMAND: return "Malformed command"; } return "Unknown error"; } /* top-level processor for a single external command */ int process_external_command2(int cmd, time_t entry_time, char *args) { int ret = OK; log_debug_info(DEBUGL_FUNCTIONS, 0, "process_external_command2()\n"); log_debug_info(DEBUGL_EXTERNALCOMMANDS, 1, "External Command Type: %d\n", cmd); log_debug_info(DEBUGL_EXTERNALCOMMANDS, 1, "Command Entry Time: %lu\n", (unsigned long)entry_time); log_debug_info(DEBUGL_EXTERNALCOMMANDS, 1, "Command Arguments: %s\n", (args == NULL) ? "" : args); /* how shall we execute the command? */ switch(cmd) { /***************************/ /***** SYSTEM COMMANDS *****/ /***************************/ case CMD_SHUTDOWN_PROCESS: case CMD_RESTART_PROCESS: ret = cmd_signal_process(cmd, args); break; case CMD_SAVE_STATE_INFORMATION: ret = save_state_information(FALSE); break; case CMD_READ_STATE_INFORMATION: ret = read_initial_state_information(); break; case CMD_ENABLE_NOTIFICATIONS: enable_all_notifications(); break; case CMD_DISABLE_NOTIFICATIONS: disable_all_notifications(); break; case CMD_START_EXECUTING_SVC_CHECKS: start_executing_service_checks(); break; case CMD_STOP_EXECUTING_SVC_CHECKS: stop_executing_service_checks(); break; case CMD_START_ACCEPTING_PASSIVE_SVC_CHECKS: start_accepting_passive_service_checks(); break; case CMD_STOP_ACCEPTING_PASSIVE_SVC_CHECKS: stop_accepting_passive_service_checks(); break; case CMD_START_OBSESSING_OVER_SVC_CHECKS: start_obsessing_over_service_checks(); break; case CMD_STOP_OBSESSING_OVER_SVC_CHECKS: stop_obsessing_over_service_checks(); break; case CMD_START_EXECUTING_HOST_CHECKS: start_executing_host_checks(); break; case CMD_STOP_EXECUTING_HOST_CHECKS: stop_executing_host_checks(); break; case CMD_START_ACCEPTING_PASSIVE_HOST_CHECKS: start_accepting_passive_host_checks(); break; case CMD_STOP_ACCEPTING_PASSIVE_HOST_CHECKS: stop_accepting_passive_host_checks(); break; case CMD_START_OBSESSING_OVER_HOST_CHECKS: start_obsessing_over_host_checks(); break; case CMD_STOP_OBSESSING_OVER_HOST_CHECKS: stop_obsessing_over_host_checks(); break; case CMD_ENABLE_EVENT_HANDLERS: start_using_event_handlers(); break; case CMD_DISABLE_EVENT_HANDLERS: stop_using_event_handlers(); break; case CMD_ENABLE_FLAP_DETECTION: enable_flap_detection_routines(); break; case CMD_DISABLE_FLAP_DETECTION: disable_flap_detection_routines(); break; case CMD_ENABLE_SERVICE_FRESHNESS_CHECKS: enable_service_freshness_checks(); break; case CMD_DISABLE_SERVICE_FRESHNESS_CHECKS: disable_service_freshness_checks(); break; case CMD_ENABLE_HOST_FRESHNESS_CHECKS: enable_host_freshness_checks(); break; case CMD_DISABLE_HOST_FRESHNESS_CHECKS: disable_host_freshness_checks(); break; case CMD_ENABLE_PERFORMANCE_DATA: enable_performance_data(); break; case CMD_DISABLE_PERFORMANCE_DATA: disable_performance_data(); break; /***************************/ /***** HOST COMMANDS *****/ /***************************/ case CMD_ENABLE_HOST_CHECK: case CMD_DISABLE_HOST_CHECK: case CMD_ENABLE_PASSIVE_HOST_CHECKS: case CMD_DISABLE_PASSIVE_HOST_CHECKS: case CMD_ENABLE_HOST_SVC_CHECKS: case CMD_DISABLE_HOST_SVC_CHECKS: case CMD_ENABLE_HOST_NOTIFICATIONS: case CMD_DISABLE_HOST_NOTIFICATIONS: case CMD_ENABLE_ALL_NOTIFICATIONS_BEYOND_HOST: case CMD_DISABLE_ALL_NOTIFICATIONS_BEYOND_HOST: case CMD_ENABLE_HOST_AND_CHILD_NOTIFICATIONS: case CMD_DISABLE_HOST_AND_CHILD_NOTIFICATIONS: case CMD_ENABLE_HOST_SVC_NOTIFICATIONS: case CMD_DISABLE_HOST_SVC_NOTIFICATIONS: case CMD_ENABLE_HOST_FLAP_DETECTION: case CMD_DISABLE_HOST_FLAP_DETECTION: case CMD_ENABLE_HOST_EVENT_HANDLER: case CMD_DISABLE_HOST_EVENT_HANDLER: case CMD_START_OBSESSING_OVER_HOST: case CMD_STOP_OBSESSING_OVER_HOST: case CMD_SET_HOST_NOTIFICATION_NUMBER: case CMD_SEND_CUSTOM_HOST_NOTIFICATION: case CMD_CLEAR_HOST_FLAPPING_STATE: ret = process_host_command(cmd, entry_time, args); break; /*****************************/ /***** HOSTGROUP COMMANDS ****/ /*****************************/ case CMD_ENABLE_HOSTGROUP_HOST_NOTIFICATIONS: case CMD_DISABLE_HOSTGROUP_HOST_NOTIFICATIONS: case CMD_ENABLE_HOSTGROUP_SVC_NOTIFICATIONS: case CMD_DISABLE_HOSTGROUP_SVC_NOTIFICATIONS: case CMD_ENABLE_HOSTGROUP_HOST_CHECKS: case CMD_DISABLE_HOSTGROUP_HOST_CHECKS: case CMD_ENABLE_HOSTGROUP_PASSIVE_HOST_CHECKS: case CMD_DISABLE_HOSTGROUP_PASSIVE_HOST_CHECKS: case CMD_ENABLE_HOSTGROUP_SVC_CHECKS: case CMD_DISABLE_HOSTGROUP_SVC_CHECKS: case CMD_ENABLE_HOSTGROUP_PASSIVE_SVC_CHECKS: case CMD_DISABLE_HOSTGROUP_PASSIVE_SVC_CHECKS: ret = process_hostgroup_command(cmd, entry_time, args); break; /***************************/ /***** SERVICE COMMANDS ****/ /***************************/ case CMD_ENABLE_SVC_CHECK: case CMD_DISABLE_SVC_CHECK: case CMD_ENABLE_PASSIVE_SVC_CHECKS: case CMD_DISABLE_PASSIVE_SVC_CHECKS: case CMD_ENABLE_SVC_NOTIFICATIONS: case CMD_DISABLE_SVC_NOTIFICATIONS: case CMD_ENABLE_SVC_FLAP_DETECTION: case CMD_DISABLE_SVC_FLAP_DETECTION: case CMD_ENABLE_SVC_EVENT_HANDLER: case CMD_DISABLE_SVC_EVENT_HANDLER: case CMD_START_OBSESSING_OVER_SVC: case CMD_STOP_OBSESSING_OVER_SVC: case CMD_SET_SVC_NOTIFICATION_NUMBER: case CMD_SEND_CUSTOM_SVC_NOTIFICATION: case CMD_CLEAR_SVC_FLAPPING_STATE: ret = process_service_command(cmd, entry_time, args); break; /********************************/ /***** SERVICEGROUP COMMANDS ****/ /********************************/ case CMD_ENABLE_SERVICEGROUP_HOST_NOTIFICATIONS: case CMD_DISABLE_SERVICEGROUP_HOST_NOTIFICATIONS: case CMD_ENABLE_SERVICEGROUP_SVC_NOTIFICATIONS: case CMD_DISABLE_SERVICEGROUP_SVC_NOTIFICATIONS: case CMD_ENABLE_SERVICEGROUP_HOST_CHECKS: case CMD_DISABLE_SERVICEGROUP_HOST_CHECKS: case CMD_ENABLE_SERVICEGROUP_PASSIVE_HOST_CHECKS: case CMD_DISABLE_SERVICEGROUP_PASSIVE_HOST_CHECKS: case CMD_ENABLE_SERVICEGROUP_SVC_CHECKS: case CMD_DISABLE_SERVICEGROUP_SVC_CHECKS: case CMD_ENABLE_SERVICEGROUP_PASSIVE_SVC_CHECKS: case CMD_DISABLE_SERVICEGROUP_PASSIVE_SVC_CHECKS: ret = process_servicegroup_command(cmd, entry_time, args); break; /**********************************/ /**** CONTACT-RELATED COMMANDS ****/ /**********************************/ case CMD_ENABLE_CONTACT_HOST_NOTIFICATIONS: case CMD_DISABLE_CONTACT_HOST_NOTIFICATIONS: case CMD_ENABLE_CONTACT_SVC_NOTIFICATIONS: case CMD_DISABLE_CONTACT_SVC_NOTIFICATIONS: ret = process_contact_command(cmd, entry_time, args); break; /***************************************/ /**** CONTACTGROUP-RELATED COMMANDS ****/ /***************************************/ case CMD_ENABLE_CONTACTGROUP_HOST_NOTIFICATIONS: case CMD_DISABLE_CONTACTGROUP_HOST_NOTIFICATIONS: case CMD_ENABLE_CONTACTGROUP_SVC_NOTIFICATIONS: case CMD_DISABLE_CONTACTGROUP_SVC_NOTIFICATIONS: ret = process_contactgroup_command(cmd, entry_time, args); break; /***************************/ /**** UNSORTED COMMANDS ****/ /***************************/ case CMD_ADD_HOST_COMMENT: case CMD_ADD_SVC_COMMENT: ret= cmd_add_comment(cmd, entry_time, args); break; case CMD_DEL_HOST_COMMENT: case CMD_DEL_SVC_COMMENT: ret = cmd_delete_comment(cmd, args); break; case CMD_DELAY_HOST_NOTIFICATION: case CMD_DELAY_SVC_NOTIFICATION: ret = cmd_delay_notification(cmd, args); break; case CMD_SCHEDULE_SVC_CHECK: case CMD_SCHEDULE_FORCED_SVC_CHECK: ret =cmd_schedule_check(cmd, args); break; case CMD_SCHEDULE_HOST_SVC_CHECKS: case CMD_SCHEDULE_FORCED_HOST_SVC_CHECKS: ret = cmd_schedule_check(cmd, args); break; case CMD_DEL_ALL_HOST_COMMENTS: case CMD_DEL_ALL_SVC_COMMENTS: ret = cmd_delete_all_comments(cmd, args); break; case CMD_PROCESS_SERVICE_CHECK_RESULT: ret = cmd_process_service_check_result(cmd, entry_time, args); break; case CMD_PROCESS_HOST_CHECK_RESULT: ret = cmd_process_host_check_result(cmd, entry_time, args); break; case CMD_ACKNOWLEDGE_HOST_PROBLEM: case CMD_ACKNOWLEDGE_SVC_PROBLEM: ret = cmd_acknowledge_problem(cmd, args); break; case CMD_REMOVE_HOST_ACKNOWLEDGEMENT: case CMD_REMOVE_SVC_ACKNOWLEDGEMENT: ret = cmd_remove_acknowledgement(cmd, args); break; case CMD_SCHEDULE_HOST_DOWNTIME: case CMD_SCHEDULE_SVC_DOWNTIME: case CMD_SCHEDULE_HOST_SVC_DOWNTIME: case CMD_SCHEDULE_HOSTGROUP_HOST_DOWNTIME: case CMD_SCHEDULE_HOSTGROUP_SVC_DOWNTIME: case CMD_SCHEDULE_SERVICEGROUP_HOST_DOWNTIME: case CMD_SCHEDULE_SERVICEGROUP_SVC_DOWNTIME: case CMD_SCHEDULE_AND_PROPAGATE_HOST_DOWNTIME: case CMD_SCHEDULE_AND_PROPAGATE_TRIGGERED_HOST_DOWNTIME: ret = cmd_schedule_downtime(cmd, entry_time, args); break; case CMD_DEL_HOST_DOWNTIME: case CMD_DEL_SVC_DOWNTIME: ret = cmd_delete_downtime(cmd, args); break; case CMD_DEL_DOWNTIME_BY_HOST_NAME: ret = cmd_delete_downtime_by_host_name(cmd, args); break; case CMD_DEL_DOWNTIME_BY_HOSTGROUP_NAME: ret = cmd_delete_downtime_by_hostgroup_name(cmd, args); break; case CMD_DEL_DOWNTIME_BY_START_TIME_COMMENT: ret = cmd_delete_downtime_by_start_time_comment(cmd, args); break; case CMD_SCHEDULE_HOST_CHECK: case CMD_SCHEDULE_FORCED_HOST_CHECK: ret = cmd_schedule_check(cmd, args); break; case CMD_CHANGE_GLOBAL_HOST_EVENT_HANDLER: case CMD_CHANGE_GLOBAL_SVC_EVENT_HANDLER: case CMD_CHANGE_HOST_EVENT_HANDLER: case CMD_CHANGE_SVC_EVENT_HANDLER: case CMD_CHANGE_HOST_CHECK_COMMAND: case CMD_CHANGE_SVC_CHECK_COMMAND: case CMD_CHANGE_HOST_CHECK_TIMEPERIOD: case CMD_CHANGE_SVC_CHECK_TIMEPERIOD: case CMD_CHANGE_HOST_NOTIFICATION_TIMEPERIOD: case CMD_CHANGE_SVC_NOTIFICATION_TIMEPERIOD: case CMD_CHANGE_CONTACT_HOST_NOTIFICATION_TIMEPERIOD: case CMD_CHANGE_CONTACT_SVC_NOTIFICATION_TIMEPERIOD: ret = cmd_change_object_char_var(cmd, args); break; case CMD_CHANGE_NORMAL_HOST_CHECK_INTERVAL: case CMD_CHANGE_RETRY_HOST_CHECK_INTERVAL: case CMD_CHANGE_NORMAL_SVC_CHECK_INTERVAL: case CMD_CHANGE_RETRY_SVC_CHECK_INTERVAL: case CMD_CHANGE_MAX_HOST_CHECK_ATTEMPTS: case CMD_CHANGE_MAX_SVC_CHECK_ATTEMPTS: case CMD_CHANGE_HOST_MODATTR: case CMD_CHANGE_SVC_MODATTR: case CMD_CHANGE_CONTACT_MODATTR: case CMD_CHANGE_CONTACT_MODHATTR: case CMD_CHANGE_CONTACT_MODSATTR: ret = cmd_change_object_int_var(cmd, args); break; case CMD_CHANGE_CUSTOM_HOST_VAR: case CMD_CHANGE_CUSTOM_SVC_VAR: case CMD_CHANGE_CUSTOM_CONTACT_VAR: ret = cmd_change_object_custom_var(cmd, args); break; /***********************/ /**** MISC COMMANDS ****/ /***********************/ case CMD_PROCESS_FILE: ret = cmd_process_external_commands_from_file(cmd, args); break; /*************************/ /**** CUSTOM COMMANDS ****/ /*************************/ case CMD_CUSTOM_COMMAND: /* custom commands aren't handled internally by Nagios, but may be by NEB modules */ break; default: return CMD_ERROR_UNKNOWN_COMMAND; break; } return ret; } /* processes an external host command */ int process_host_command(int cmd, time_t entry_time, char *args) { char *host_name = NULL; host *temp_host = NULL; service *temp_service = NULL; servicesmember *temp_servicesmember = NULL; char *str = NULL; char *buf[2] = {NULL, NULL}; int intval = 0; printf("ARGS: %s\n", args); /* get the host name */ if((host_name = my_strtok(args, ";")) == NULL) return ERROR; /* find the host */ if((temp_host = find_host(host_name)) == NULL) return ERROR; switch(cmd) { case CMD_ENABLE_HOST_NOTIFICATIONS: enable_host_notifications(temp_host); break; case CMD_DISABLE_HOST_NOTIFICATIONS: disable_host_notifications(temp_host); break; case CMD_ENABLE_HOST_AND_CHILD_NOTIFICATIONS: enable_and_propagate_notifications(temp_host, 0, TRUE, TRUE, FALSE); break; case CMD_DISABLE_HOST_AND_CHILD_NOTIFICATIONS: disable_and_propagate_notifications(temp_host, 0, TRUE, TRUE, FALSE); break; case CMD_ENABLE_ALL_NOTIFICATIONS_BEYOND_HOST: enable_and_propagate_notifications(temp_host, 0, FALSE, TRUE, TRUE); break; case CMD_DISABLE_ALL_NOTIFICATIONS_BEYOND_HOST: disable_and_propagate_notifications(temp_host, 0, FALSE, TRUE, TRUE); break; case CMD_ENABLE_HOST_SVC_NOTIFICATIONS: case CMD_DISABLE_HOST_SVC_NOTIFICATIONS: for(temp_servicesmember = temp_host->services; temp_servicesmember != NULL; temp_servicesmember = temp_servicesmember->next) { if((temp_service = temp_servicesmember->service_ptr) == NULL) continue; if(cmd == CMD_ENABLE_HOST_SVC_NOTIFICATIONS) enable_service_notifications(temp_service); else disable_service_notifications(temp_service); } break; case CMD_ENABLE_HOST_SVC_CHECKS: case CMD_DISABLE_HOST_SVC_CHECKS: for(temp_servicesmember = temp_host->services; temp_servicesmember != NULL; temp_servicesmember = temp_servicesmember->next) { if((temp_service = temp_servicesmember->service_ptr) == NULL) continue; if(cmd == CMD_ENABLE_HOST_SVC_CHECKS) enable_service_checks(temp_service); else disable_service_checks(temp_service); } break; case CMD_ENABLE_HOST_CHECK: enable_host_checks(temp_host); break; case CMD_DISABLE_HOST_CHECK: disable_host_checks(temp_host); break; case CMD_ENABLE_HOST_EVENT_HANDLER: enable_host_event_handler(temp_host); break; case CMD_DISABLE_HOST_EVENT_HANDLER: disable_host_event_handler(temp_host); break; case CMD_ENABLE_HOST_FLAP_DETECTION: enable_host_flap_detection(temp_host); break; case CMD_DISABLE_HOST_FLAP_DETECTION: disable_host_flap_detection(temp_host); break; case CMD_ENABLE_PASSIVE_HOST_CHECKS: enable_passive_host_checks(temp_host); break; case CMD_DISABLE_PASSIVE_HOST_CHECKS: disable_passive_host_checks(temp_host); break; case CMD_START_OBSESSING_OVER_HOST: start_obsessing_over_host(temp_host); break; case CMD_STOP_OBSESSING_OVER_HOST: stop_obsessing_over_host(temp_host); break; case CMD_SET_HOST_NOTIFICATION_NUMBER: if((str = my_strtok(NULL, ";"))) { intval = atoi(str); set_host_notification_number(temp_host, intval); } break; case CMD_CLEAR_HOST_FLAPPING_STATE: clear_host_flapping_state(temp_host); break; case CMD_SEND_CUSTOM_HOST_NOTIFICATION: if((str = my_strtok(NULL, ";"))) intval = atoi(str); str = my_strtok(NULL, ";"); if(str) buf[0] = strdup(str); str = my_strtok(NULL, ";"); if(str) buf[1] = strdup(str); if(buf[0] && buf[1]) host_notification(temp_host, NOTIFICATION_CUSTOM, buf[0], buf[1], intval); break; default: break; } return OK; } /* processes an external hostgroup command */ int process_hostgroup_command(int cmd, time_t entry_time, char *args) { char *hostgroup_name = NULL; hostgroup *temp_hostgroup = NULL; hostsmember *temp_member = NULL; host *temp_host = NULL; service *temp_service = NULL; servicesmember *temp_servicesmember = NULL; /* get the hostgroup name */ if((hostgroup_name = my_strtok(args, ";")) == NULL) return ERROR; /* find the hostgroup */ if((temp_hostgroup = find_hostgroup(hostgroup_name)) == NULL) return ERROR; /* loop through all hosts in the hostgroup */ for(temp_member = temp_hostgroup->members; temp_member != NULL; temp_member = temp_member->next) { if((temp_host = (host *)temp_member->host_ptr) == NULL) continue; switch(cmd) { case CMD_ENABLE_HOSTGROUP_HOST_NOTIFICATIONS: enable_host_notifications(temp_host); break; case CMD_DISABLE_HOSTGROUP_HOST_NOTIFICATIONS: disable_host_notifications(temp_host); break; case CMD_ENABLE_HOSTGROUP_HOST_CHECKS: enable_host_checks(temp_host); break; case CMD_DISABLE_HOSTGROUP_HOST_CHECKS: disable_host_checks(temp_host); break; case CMD_ENABLE_HOSTGROUP_PASSIVE_HOST_CHECKS: enable_passive_host_checks(temp_host); break; case CMD_DISABLE_HOSTGROUP_PASSIVE_HOST_CHECKS: disable_passive_host_checks(temp_host); break; default: /* loop through all services on the host */ for(temp_servicesmember = temp_host->services; temp_servicesmember != NULL; temp_servicesmember = temp_servicesmember->next) { if((temp_service = temp_servicesmember->service_ptr) == NULL) continue; switch(cmd) { case CMD_ENABLE_HOSTGROUP_SVC_NOTIFICATIONS: enable_service_notifications(temp_service); break; case CMD_DISABLE_HOSTGROUP_SVC_NOTIFICATIONS: disable_service_notifications(temp_service); break; case CMD_ENABLE_HOSTGROUP_SVC_CHECKS: enable_service_checks(temp_service); break; case CMD_DISABLE_HOSTGROUP_SVC_CHECKS: disable_service_checks(temp_service); break; case CMD_ENABLE_HOSTGROUP_PASSIVE_SVC_CHECKS: enable_passive_service_checks(temp_service); break; case CMD_DISABLE_HOSTGROUP_PASSIVE_SVC_CHECKS: disable_passive_service_checks(temp_service); break; default: break; } } break; } } return OK; } /* processes an external service command */ int process_service_command(int cmd, time_t entry_time, char *args) { char *host_name = NULL; char *svc_description = NULL; service *temp_service = NULL; char *str = NULL; char *buf[2] = {NULL, NULL}; int intval = 0; /* get the host name */ if((host_name = my_strtok(args, ";")) == NULL) return ERROR; /* get the service description */ if((svc_description = my_strtok(NULL, ";")) == NULL) return ERROR; /* find the service */ if((temp_service = find_service(host_name, svc_description)) == NULL) return ERROR; switch(cmd) { case CMD_ENABLE_SVC_NOTIFICATIONS: enable_service_notifications(temp_service); break; case CMD_DISABLE_SVC_NOTIFICATIONS: disable_service_notifications(temp_service); break; case CMD_ENABLE_SVC_CHECK: enable_service_checks(temp_service); break; case CMD_DISABLE_SVC_CHECK: disable_service_checks(temp_service); break; case CMD_ENABLE_SVC_EVENT_HANDLER: enable_service_event_handler(temp_service); break; case CMD_DISABLE_SVC_EVENT_HANDLER: disable_service_event_handler(temp_service); break; case CMD_ENABLE_SVC_FLAP_DETECTION: enable_service_flap_detection(temp_service); break; case CMD_DISABLE_SVC_FLAP_DETECTION: disable_service_flap_detection(temp_service); break; case CMD_ENABLE_PASSIVE_SVC_CHECKS: enable_passive_service_checks(temp_service); break; case CMD_DISABLE_PASSIVE_SVC_CHECKS: disable_passive_service_checks(temp_service); break; case CMD_START_OBSESSING_OVER_SVC: start_obsessing_over_service(temp_service); break; case CMD_STOP_OBSESSING_OVER_SVC: stop_obsessing_over_service(temp_service); break; case CMD_SET_SVC_NOTIFICATION_NUMBER: if((str = my_strtok(NULL, ";"))) { intval = atoi(str); set_service_notification_number(temp_service, intval); } break; case CMD_CLEAR_SVC_FLAPPING_STATE: clear_service_flapping_state(temp_service); break; case CMD_SEND_CUSTOM_SVC_NOTIFICATION: if((str = my_strtok(NULL, ";"))) intval = atoi(str); str = my_strtok(NULL, ";"); if(str) buf[0] = strdup(str); str = my_strtok(NULL, ";"); if(str) buf[1] = strdup(str); if(buf[0] && buf[1]) service_notification(temp_service, NOTIFICATION_CUSTOM, buf[0], buf[1], intval); break; default: break; } return OK; } /* processes an external servicegroup command */ int process_servicegroup_command(int cmd, time_t entry_time, char *args) { char *servicegroup_name = NULL; servicegroup *temp_servicegroup = NULL; servicesmember *temp_member = NULL; host *temp_host = NULL; host *last_host = NULL; service *temp_service = NULL; /* get the servicegroup name */ if((servicegroup_name = my_strtok(args, ";")) == NULL) return ERROR; /* find the servicegroup */ if((temp_servicegroup = find_servicegroup(servicegroup_name)) == NULL) return ERROR; switch(cmd) { case CMD_ENABLE_SERVICEGROUP_SVC_NOTIFICATIONS: case CMD_DISABLE_SERVICEGROUP_SVC_NOTIFICATIONS: case CMD_ENABLE_SERVICEGROUP_SVC_CHECKS: case CMD_DISABLE_SERVICEGROUP_SVC_CHECKS: case CMD_ENABLE_SERVICEGROUP_PASSIVE_SVC_CHECKS: case CMD_DISABLE_SERVICEGROUP_PASSIVE_SVC_CHECKS: /* loop through all servicegroup members */ for(temp_member = temp_servicegroup->members; temp_member != NULL; temp_member = temp_member->next) { temp_service = find_service(temp_member->host_name, temp_member->service_description); if(temp_service == NULL) continue; switch(cmd) { case CMD_ENABLE_SERVICEGROUP_SVC_NOTIFICATIONS: enable_service_notifications(temp_service); break; case CMD_DISABLE_SERVICEGROUP_SVC_NOTIFICATIONS: disable_service_notifications(temp_service); break; case CMD_ENABLE_SERVICEGROUP_SVC_CHECKS: enable_service_checks(temp_service); break; case CMD_DISABLE_SERVICEGROUP_SVC_CHECKS: disable_service_checks(temp_service); break; case CMD_ENABLE_SERVICEGROUP_PASSIVE_SVC_CHECKS: enable_passive_service_checks(temp_service); break; case CMD_DISABLE_SERVICEGROUP_PASSIVE_SVC_CHECKS: disable_passive_service_checks(temp_service); break; default: break; } } break; case CMD_ENABLE_SERVICEGROUP_HOST_NOTIFICATIONS: case CMD_DISABLE_SERVICEGROUP_HOST_NOTIFICATIONS: case CMD_ENABLE_SERVICEGROUP_HOST_CHECKS: case CMD_DISABLE_SERVICEGROUP_HOST_CHECKS: case CMD_ENABLE_SERVICEGROUP_PASSIVE_HOST_CHECKS: case CMD_DISABLE_SERVICEGROUP_PASSIVE_HOST_CHECKS: /* loop through all hosts that have services belonging to the servicegroup */ last_host = NULL; for(temp_member = temp_servicegroup->members; temp_member != NULL; temp_member = temp_member->next) { if((temp_host = find_host(temp_member->host_name)) == NULL) continue; if(temp_host == last_host) continue; switch(cmd) { case CMD_ENABLE_SERVICEGROUP_HOST_NOTIFICATIONS: enable_host_notifications(temp_host); break; case CMD_DISABLE_SERVICEGROUP_HOST_NOTIFICATIONS: disable_host_notifications(temp_host); break; case CMD_ENABLE_SERVICEGROUP_HOST_CHECKS: enable_host_checks(temp_host); break; case CMD_DISABLE_SERVICEGROUP_HOST_CHECKS: disable_host_checks(temp_host); break; case CMD_ENABLE_SERVICEGROUP_PASSIVE_HOST_CHECKS: enable_passive_host_checks(temp_host); break; case CMD_DISABLE_SERVICEGROUP_PASSIVE_HOST_CHECKS: disable_passive_host_checks(temp_host); break; default: break; } last_host = temp_host; } break; default: break; } return OK; } /* processes an external contact command */ int process_contact_command(int cmd, time_t entry_time, char *args) { char *contact_name = NULL; contact *temp_contact = NULL; /* get the contact name */ if((contact_name = my_strtok(args, ";")) == NULL) return ERROR; /* find the contact */ if((temp_contact = find_contact(contact_name)) == NULL) return ERROR; switch(cmd) { case CMD_ENABLE_CONTACT_HOST_NOTIFICATIONS: enable_contact_host_notifications(temp_contact); break; case CMD_DISABLE_CONTACT_HOST_NOTIFICATIONS: disable_contact_host_notifications(temp_contact); break; case CMD_ENABLE_CONTACT_SVC_NOTIFICATIONS: enable_contact_service_notifications(temp_contact); break; case CMD_DISABLE_CONTACT_SVC_NOTIFICATIONS: disable_contact_service_notifications(temp_contact); break; default: break; } return OK; } /* processes an external contactgroup command */ int process_contactgroup_command(int cmd, time_t entry_time, char *args) { char *contactgroup_name = NULL; contactgroup *temp_contactgroup = NULL; contactsmember *temp_member = NULL; contact *temp_contact = NULL; /* get the contactgroup name */ if((contactgroup_name = my_strtok(args, ";")) == NULL) return ERROR; /* find the contactgroup */ if((temp_contactgroup = find_contactgroup(contactgroup_name)) == NULL) return ERROR; switch(cmd) { case CMD_ENABLE_CONTACTGROUP_HOST_NOTIFICATIONS: case CMD_DISABLE_CONTACTGROUP_HOST_NOTIFICATIONS: case CMD_ENABLE_CONTACTGROUP_SVC_NOTIFICATIONS: case CMD_DISABLE_CONTACTGROUP_SVC_NOTIFICATIONS: /* loop through all contactgroup members */ for(temp_member = temp_contactgroup->members; temp_member != NULL; temp_member = temp_member->next) { if((temp_contact = temp_member->contact_ptr) == NULL) continue; switch(cmd) { case CMD_ENABLE_CONTACTGROUP_HOST_NOTIFICATIONS: enable_contact_host_notifications(temp_contact); break; case CMD_DISABLE_CONTACTGROUP_HOST_NOTIFICATIONS: disable_contact_host_notifications(temp_contact); break; case CMD_ENABLE_CONTACTGROUP_SVC_NOTIFICATIONS: enable_contact_service_notifications(temp_contact); break; case CMD_DISABLE_CONTACTGROUP_SVC_NOTIFICATIONS: disable_contact_service_notifications(temp_contact); break; default: break; } } break; default: break; } return OK; } /******************************************************************/ /*************** EXTERNAL COMMAND IMPLEMENTATIONS ****************/ /******************************************************************/ /* adds a host or service comment to the status log */ int cmd_add_comment(int cmd, time_t entry_time, char *args) { char *temp_ptr = NULL; host *temp_host = NULL; service *temp_service = NULL; char *host_name = NULL; char *svc_description = NULL; char *user = NULL; char *comment_data = NULL; int persistent = 0; int result = 0; /* get the host name */ if((host_name = my_strtok(args, ";")) == NULL) return ERROR; /* if we're adding a service comment... */ if(cmd == CMD_ADD_SVC_COMMENT) { /* get the service description */ if((svc_description = my_strtok(NULL, ";")) == NULL) return ERROR; /* verify that the service is valid */ if((temp_service = find_service(host_name, svc_description)) == NULL) return ERROR; } /* else verify that the host is valid */ if((temp_host = find_host(host_name)) == NULL) return ERROR; /* get the persistent flag */ if((temp_ptr = my_strtok(NULL, ";")) == NULL) return ERROR; persistent = atoi(temp_ptr); if(persistent > 1) persistent = 1; else if(persistent < 0) persistent = 0; /* get the name of the user who entered the comment */ if((user = my_strtok(NULL, ";")) == NULL) return ERROR; /* get the comment */ if((comment_data = my_strtok(NULL, "\n")) == NULL) return ERROR; /* add the comment */ result = add_new_comment((cmd == CMD_ADD_HOST_COMMENT) ? HOST_COMMENT : SERVICE_COMMENT, USER_COMMENT, host_name, svc_description, entry_time, user, comment_data, persistent, COMMENTSOURCE_EXTERNAL, FALSE, (time_t)0, NULL); if(result < 0) return ERROR; return OK; } /* removes a host or service comment from the status log */ int cmd_delete_comment(int cmd, char *args) { unsigned long comment_id = 0L; /* get the comment id we should delete */ if((comment_id = strtoul(args, NULL, 10)) == 0) return ERROR; /* delete the specified comment */ if(cmd == CMD_DEL_HOST_COMMENT) delete_host_comment(comment_id); else delete_service_comment(comment_id); return OK; } /* removes all comments associated with a host or service from the status log */ int cmd_delete_all_comments(int cmd, char *args) { service *temp_service = NULL; host *temp_host = NULL; char *host_name = NULL; char *svc_description = NULL; /* get the host name */ if((host_name = my_strtok(args, ";")) == NULL) return ERROR; /* if we're deleting service comments... */ if(cmd == CMD_DEL_ALL_SVC_COMMENTS) { /* get the service description */ if((svc_description = my_strtok(NULL, ";")) == NULL) return ERROR; /* verify that the service is valid */ if((temp_service = find_service(host_name, svc_description)) == NULL) return ERROR; } /* else verify that the host is valid */ if((temp_host = find_host(host_name)) == NULL) return ERROR; /* delete comments */ delete_all_comments((cmd == CMD_DEL_ALL_HOST_COMMENTS) ? HOST_COMMENT : SERVICE_COMMENT, host_name, svc_description); return OK; } /* delays a host or service notification for given number of minutes */ int cmd_delay_notification(int cmd, char *args) { char *temp_ptr = NULL; host *temp_host = NULL; service *temp_service = NULL; char *host_name = NULL; char *svc_description = NULL; time_t delay_time = 0L; /* get the host name */ if((host_name = my_strtok(args, ";")) == NULL) return ERROR; /* if this is a service notification delay... */ if(cmd == CMD_DELAY_SVC_NOTIFICATION) { /* get the service description */ if((svc_description = my_strtok(NULL, ";")) == NULL) return ERROR; /* verify that the service is valid */ if((temp_service = find_service(host_name, svc_description)) == NULL) return ERROR; } /* else verify that the host is valid */ else { if((temp_host = find_host(host_name)) == NULL) return ERROR; } /* get the time that we should delay until... */ if((temp_ptr = my_strtok(NULL, "\n")) == NULL) return ERROR; delay_time = strtoul(temp_ptr, NULL, 10); /* delay the next notification... */ if(cmd == CMD_DELAY_SVC_NOTIFICATION) temp_service->next_notification = delay_time; else temp_host->next_notification = delay_time; return OK; } /* schedules a host check at a particular time */ int cmd_schedule_check(int cmd, char *args) { char *temp_ptr = NULL; host *temp_host = NULL; service *temp_service = NULL; servicesmember *temp_servicesmember = NULL; char *host_name = NULL; char *svc_description = NULL; time_t delay_time = 0L; /* get the host name */ if((host_name = my_strtok(args, ";")) == NULL) return ERROR; if(cmd == CMD_SCHEDULE_HOST_CHECK || cmd == CMD_SCHEDULE_FORCED_HOST_CHECK || cmd == CMD_SCHEDULE_HOST_SVC_CHECKS || cmd == CMD_SCHEDULE_FORCED_HOST_SVC_CHECKS) { /* verify that the host is valid */ if((temp_host = find_host(host_name)) == NULL) return ERROR; } else { /* get the service description */ if((svc_description = my_strtok(NULL, ";")) == NULL) return ERROR; /* verify that the service is valid */ if((temp_service = find_service(host_name, svc_description)) == NULL) return ERROR; } /* get the next check time */ if((temp_ptr = my_strtok(NULL, "\n")) == NULL) return ERROR; delay_time = strtoul(temp_ptr, NULL, 10); /* schedule the host check */ if(cmd == CMD_SCHEDULE_HOST_CHECK || cmd == CMD_SCHEDULE_FORCED_HOST_CHECK) schedule_host_check(temp_host, delay_time, (cmd == CMD_SCHEDULE_FORCED_HOST_CHECK) ? CHECK_OPTION_FORCE_EXECUTION : CHECK_OPTION_NONE); /* schedule service checks */ else if(cmd == CMD_SCHEDULE_HOST_SVC_CHECKS || cmd == CMD_SCHEDULE_FORCED_HOST_SVC_CHECKS) { for(temp_servicesmember = temp_host->services; temp_servicesmember != NULL; temp_servicesmember = temp_servicesmember->next) { if((temp_service = temp_servicesmember->service_ptr) == NULL) continue; schedule_service_check(temp_service, delay_time, (cmd == CMD_SCHEDULE_FORCED_HOST_SVC_CHECKS) ? CHECK_OPTION_FORCE_EXECUTION : CHECK_OPTION_NONE); } } else schedule_service_check(temp_service, delay_time, (cmd == CMD_SCHEDULE_FORCED_SVC_CHECK) ? CHECK_OPTION_FORCE_EXECUTION : CHECK_OPTION_NONE); return OK; } /* schedules all service checks on a host for a particular time */ int cmd_schedule_host_service_checks(int cmd, char *args, int force) { char *temp_ptr = NULL; service *temp_service = NULL; servicesmember *temp_servicesmember = NULL; host *temp_host = NULL; char *host_name = NULL; time_t delay_time = 0L; /* get the host name */ if((host_name = my_strtok(args, ";")) == NULL) return ERROR; /* verify that the host is valid */ if((temp_host = find_host(host_name)) == NULL) return ERROR; /* get the next check time */ if((temp_ptr = my_strtok(NULL, "\n")) == NULL) return ERROR; delay_time = strtoul(temp_ptr, NULL, 10); /* reschedule all services on the specified host */ for(temp_servicesmember = temp_host->services; temp_servicesmember != NULL; temp_servicesmember = temp_servicesmember->next) { if((temp_service = temp_servicesmember->service_ptr) == NULL) continue; schedule_service_check(temp_service, delay_time, (force == TRUE) ? CHECK_OPTION_FORCE_EXECUTION : CHECK_OPTION_NONE); } return OK; } /* schedules a program shutdown or restart */ int cmd_signal_process(int cmd, char *args) { time_t scheduled_time = 0L; char *temp_ptr = NULL; /* get the time to schedule the event */ if((temp_ptr = my_strtok(args, "\n")) == NULL) scheduled_time = 0L; else scheduled_time = strtoul(temp_ptr, NULL, 10); /* add a scheduled program shutdown or restart to the event list */ if (!schedule_new_event((cmd == CMD_SHUTDOWN_PROCESS) ? EVENT_PROGRAM_SHUTDOWN : EVENT_PROGRAM_RESTART, TRUE, scheduled_time, FALSE, 0, NULL, FALSE, NULL, NULL, 0)) return ERROR; return OK; } /* processes results of an external service check */ int cmd_process_service_check_result(int cmd, time_t check_time, char *args) { char *temp_ptr = NULL; char *host_name = NULL; char *svc_description = NULL; int return_code = 0; char *output = NULL; int result = 0; /* get the host name */ if((temp_ptr = my_strtok(args, ";")) == NULL) return ERROR; host_name = (char *)strdup(temp_ptr); /* get the service description */ if((temp_ptr = my_strtok(NULL, ";")) == NULL) { my_free(host_name); return ERROR; } svc_description = (char *)strdup(temp_ptr); /* get the service check return code */ if((temp_ptr = my_strtok(NULL, ";")) == NULL) { my_free(host_name); my_free(svc_description); return ERROR; } return_code = atoi(temp_ptr); /* get the plugin output (may be empty) */ temp_ptr = my_strtok(NULL, "\n"); /* Interpolate backslash and newline escape sequences to the literal * characters they represent. This converts to the format we use internally * so we don't have to worry about different representations later. */ output = (temp_ptr) ? unescape_check_result_output(temp_ptr) : strdup(""); /* submit the passive check result */ result = process_passive_service_check(check_time, host_name, svc_description, return_code, output); /* free memory */ my_free(host_name); my_free(svc_description); my_free(output); return result; } /* submits a passive service check result for later processing */ int process_passive_service_check(time_t check_time, char *host_name, char *svc_description, int return_code, char *output) { check_result cr; host *temp_host = NULL; service *temp_service = NULL; struct timeval tv; /* skip this service check result if we aren't accepting passive service checks */ if(accept_passive_service_checks == FALSE) return ERROR; /* make sure we have all required data */ if(host_name == NULL || svc_description == NULL || output == NULL) return ERROR; temp_host = find_host_by_name_or_address(host_name); /* we couldn't find the host */ if(temp_host == NULL) { logit(NSLOG_RUNTIME_WARNING, TRUE, "Warning: Passive check result was received for service '%s' on host '%s', but the host could not be found!\n", svc_description, host_name); return ERROR; } /* make sure the service exists */ if((temp_service = find_service(temp_host->name, svc_description)) == NULL) { logit(NSLOG_RUNTIME_WARNING, TRUE, "Warning: Passive check result was received for service '%s' on host '%s', but the service could not be found!\n", svc_description, host_name); return ERROR; } /* skip this is we aren't accepting passive checks for this service */ if(temp_service->accept_passive_checks == FALSE) return ERROR; memset(&cr, 0, sizeof(cr)); cr.exited_ok = 1; cr.check_type = CHECK_TYPE_PASSIVE; cr.host_name = temp_host->name; cr.service_description = temp_service->description; cr.output = output; cr.start_time.tv_sec = cr.finish_time.tv_sec = check_time; cr.source = command_worker.source_name; /* save the return code and make sure it's sane */ cr.return_code = return_code; if (cr.return_code < 0 || cr.return_code > 3) cr.return_code = STATE_UNKNOWN; /* calculate latency */ gettimeofday(&tv, NULL); cr.latency = (double)((double)(tv.tv_sec - check_time) + (double)(tv.tv_usec / 1000.0) / 1000.0); if(cr.latency < 0.0) cr.latency = 0.0; return handle_async_service_check_result(temp_service, &cr); } /* process passive host check result */ int cmd_process_host_check_result(int cmd, time_t check_time, char *args) { char *temp_ptr = NULL; char *host_name = NULL; int return_code = 0; char *output = NULL; int result = 0; /* get the host name */ if((temp_ptr = my_strtok(args, ";")) == NULL) return ERROR; host_name = (char *)strdup(temp_ptr); /* get the host check return code */ if((temp_ptr = my_strtok(NULL, ";")) == NULL) { my_free(host_name); return ERROR; } return_code = atoi(temp_ptr); /* get the plugin output (may be empty) */ temp_ptr = my_strtok(NULL, "\n"); /* Interpolate backslash and newline escape sequences to the literal * characters they represent. This converts to the format we use internally * so we don't have to worry about different representations later. */ output = (temp_ptr) ? unescape_check_result_output(temp_ptr) : strdup(""); /* submit the check result */ result = process_passive_host_check(check_time, host_name, return_code, output); /* free memory */ my_free(host_name); my_free(output); return result; } /* process passive host check result */ int process_passive_host_check(time_t check_time, char *host_name, int return_code, char *output) { check_result cr; host *temp_host = NULL; struct timeval tv; /* skip this host check result if we aren't accepting passive host checks */ if(accept_passive_service_checks == FALSE) return ERROR; /* make sure we have all required data */ if(host_name == NULL || output == NULL) return ERROR; /* make sure we have a reasonable return code */ if(return_code < 0 || return_code > 2) return ERROR; /* find the host by its name or address */ temp_host = find_host_by_name_or_address(host_name); /* we couldn't find the host */ if(temp_host == NULL) { logit(NSLOG_RUNTIME_WARNING, TRUE, "Warning: Passive check result was received for host '%s', but the host could not be found!\n", host_name); return ERROR; } /* skip this is we aren't accepting passive checks for this host */ if(temp_host->accept_passive_checks == FALSE) return ERROR; memset(&cr, 0, sizeof(cr)); cr.exited_ok = 1; cr.check_type = CHECK_TYPE_PASSIVE; cr.host_name = temp_host->name; cr.output = output; cr.start_time.tv_sec = cr.finish_time.tv_sec = check_time; cr.source = command_worker.source_name; cr.return_code = return_code; /* calculate latency */ gettimeofday(&tv, NULL); cr.latency = (double)((double)(tv.tv_sec - check_time) + (double)(tv.tv_usec / 1000.0) / 1000.0); if(cr.latency < 0.0) cr.latency = 0.0; handle_async_host_check_result(temp_host, &cr); return OK; } /* acknowledges a host or service problem */ int cmd_acknowledge_problem(int cmd, char *args) { service *temp_service = NULL; host *temp_host = NULL; char *host_name = NULL; char *svc_description = NULL; char *ack_author = NULL; char *ack_data = NULL; char *temp_ptr = NULL; int type = ACKNOWLEDGEMENT_NORMAL; int notify = TRUE; int persistent = TRUE; /* get the host name */ if((host_name = my_strtok(args, ";")) == NULL) return ERROR; /* verify that the host is valid */ if((temp_host = find_host(host_name)) == NULL) return ERROR; /* this is a service acknowledgement */ if(cmd == CMD_ACKNOWLEDGE_SVC_PROBLEM) { /* get the service name */ if((svc_description = my_strtok(NULL, ";")) == NULL) return ERROR; /* verify that the service is valid */ if((temp_service = find_service(temp_host->name, svc_description)) == NULL) return ERROR; } /* get the type */ if((temp_ptr = my_strtok(NULL, ";")) == NULL) return ERROR; type = atoi(temp_ptr); /* get the notification option */ if((temp_ptr = my_strtok(NULL, ";")) == NULL) return ERROR; notify = (atoi(temp_ptr) > 0) ? TRUE : FALSE; /* get the persistent option */ if((temp_ptr = my_strtok(NULL, ";")) == NULL) return ERROR; persistent = (atoi(temp_ptr) > 0) ? TRUE : FALSE; /* get the acknowledgement author */ if((temp_ptr = my_strtok(NULL, ";")) == NULL) return ERROR; ack_author = (char *)strdup(temp_ptr); /* get the acknowledgement data */ if((temp_ptr = my_strtok(NULL, "\n")) == NULL) { my_free(ack_author); return ERROR; } ack_data = (char *)strdup(temp_ptr); /* acknowledge the host problem */ if(cmd == CMD_ACKNOWLEDGE_HOST_PROBLEM) acknowledge_host_problem(temp_host, ack_author, ack_data, type, notify, persistent); /* acknowledge the service problem */ else acknowledge_service_problem(temp_service, ack_author, ack_data, type, notify, persistent); /* free memory */ my_free(ack_author); my_free(ack_data); return OK; } /* removes a host or service acknowledgement */ int cmd_remove_acknowledgement(int cmd, char *args) { service *temp_service = NULL; host *temp_host = NULL; char *host_name = NULL; char *svc_description = NULL; /* get the host name */ if((host_name = my_strtok(args, ";")) == NULL) return ERROR; /* verify that the host is valid */ if((temp_host = find_host(host_name)) == NULL) return ERROR; /* we are removing a service acknowledgement */ if(cmd == CMD_REMOVE_SVC_ACKNOWLEDGEMENT) { /* get the service name */ if((svc_description = my_strtok(NULL, ";")) == NULL) return ERROR; /* verify that the service is valid */ if((temp_service = find_service(temp_host->name, svc_description)) == NULL) return ERROR; } /* acknowledge the host problem */ if(cmd == CMD_REMOVE_HOST_ACKNOWLEDGEMENT) remove_host_acknowledgement(temp_host); /* acknowledge the service problem */ else remove_service_acknowledgement(temp_service); return OK; } /* schedules downtime for a specific host or service */ int cmd_schedule_downtime(int cmd, time_t entry_time, char *args) { servicesmember *temp_servicesmember = NULL; service *temp_service = NULL; host *temp_host = NULL; host *last_host = NULL; hostgroup *temp_hostgroup = NULL; hostsmember *temp_hgmember = NULL; servicegroup *temp_servicegroup = NULL; servicesmember *temp_sgmember = NULL; char *host_name = NULL; char *hostgroup_name = NULL; char *servicegroup_name = NULL; char *svc_description = NULL; char *temp_ptr = NULL; time_t start_time = 0L; time_t end_time = 0L; int fixed = 0; unsigned long triggered_by = 0L; unsigned long duration = 0L; char *author = NULL; char *comment_data = NULL; unsigned long downtime_id = 0L; if(cmd == CMD_SCHEDULE_HOSTGROUP_HOST_DOWNTIME || cmd == CMD_SCHEDULE_HOSTGROUP_SVC_DOWNTIME) { /* get the hostgroup name */ if((hostgroup_name = my_strtok(args, ";")) == NULL) return ERROR; /* verify that the hostgroup is valid */ if((temp_hostgroup = find_hostgroup(hostgroup_name)) == NULL) return ERROR; } else if(cmd == CMD_SCHEDULE_SERVICEGROUP_HOST_DOWNTIME || cmd == CMD_SCHEDULE_SERVICEGROUP_SVC_DOWNTIME) { /* get the servicegroup name */ if((servicegroup_name = my_strtok(args, ";")) == NULL) return ERROR; /* verify that the servicegroup is valid */ if((temp_servicegroup = find_servicegroup(servicegroup_name)) == NULL) return ERROR; } else { /* get the host name */ if((host_name = my_strtok(args, ";")) == NULL) return ERROR; /* verify that the host is valid */ if((temp_host = find_host(host_name)) == NULL) return ERROR; /* this is a service downtime */ if(cmd == CMD_SCHEDULE_SVC_DOWNTIME) { /* get the service name */ if((svc_description = my_strtok(NULL, ";")) == NULL) return ERROR; /* verify that the service is valid */ if((temp_service = find_service(temp_host->name, svc_description)) == NULL) return ERROR; } } /* get the start time */ if((temp_ptr = my_strtok(NULL, ";")) == NULL) return ERROR; start_time = (time_t)strtoul(temp_ptr, NULL, 10); /* get the end time */ if((temp_ptr = my_strtok(NULL, ";")) == NULL) return ERROR; end_time = (time_t)strtoul(temp_ptr, NULL, 10); /* get the fixed flag */ if((temp_ptr = my_strtok(NULL, ";")) == NULL) return ERROR; fixed = atoi(temp_ptr); /* get the trigger id */ if((temp_ptr = my_strtok(NULL, ";")) == NULL) return ERROR; triggered_by = strtoul(temp_ptr, NULL, 10); /* get the duration */ if((temp_ptr = my_strtok(NULL, ";")) == NULL) return ERROR; duration = strtoul(temp_ptr, NULL, 10); /* get the author */ if((author = my_strtok(NULL, ";")) == NULL) return ERROR; /* get the comment */ if((comment_data = my_strtok(NULL, ";")) == NULL) return ERROR; /* check if flexible downtime demanded and duration set to non-zero. according to the documentation, a flexible downtime is started between start and end time and will last for "duration" seconds. strtoul converts a NULL value to 0 so if set to 0, bail out as a duration>0 is needed. */ if(fixed == 0 && duration == 0) return ERROR; /* duration should be auto-calculated, not user-specified */ if(fixed > 0) duration = (unsigned long)(end_time - start_time); /* schedule downtime */ switch(cmd) { case CMD_SCHEDULE_HOST_DOWNTIME: schedule_downtime(HOST_DOWNTIME, host_name, NULL, entry_time, author, comment_data, start_time, end_time, fixed, triggered_by, duration, &downtime_id); break; case CMD_SCHEDULE_SVC_DOWNTIME: schedule_downtime(SERVICE_DOWNTIME, host_name, svc_description, entry_time, author, comment_data, start_time, end_time, fixed, triggered_by, duration, &downtime_id); break; case CMD_SCHEDULE_HOST_SVC_DOWNTIME: for(temp_servicesmember = temp_host->services; temp_servicesmember != NULL; temp_servicesmember = temp_servicesmember->next) { if((temp_service = temp_servicesmember->service_ptr) == NULL) continue; schedule_downtime(SERVICE_DOWNTIME, host_name, temp_service->description, entry_time, author, comment_data, start_time, end_time, fixed, triggered_by, duration, &downtime_id); } break; case CMD_SCHEDULE_HOSTGROUP_HOST_DOWNTIME: for(temp_hgmember = temp_hostgroup->members; temp_hgmember != NULL; temp_hgmember = temp_hgmember->next) schedule_downtime(HOST_DOWNTIME, temp_hgmember->host_name, NULL, entry_time, author, comment_data, start_time, end_time, fixed, triggered_by, duration, &downtime_id); break; case CMD_SCHEDULE_HOSTGROUP_SVC_DOWNTIME: for(temp_hgmember = temp_hostgroup->members; temp_hgmember != NULL; temp_hgmember = temp_hgmember->next) { if((temp_host = temp_hgmember->host_ptr) == NULL) continue; for(temp_servicesmember = temp_host->services; temp_servicesmember != NULL; temp_servicesmember = temp_servicesmember->next) { if((temp_service = temp_servicesmember->service_ptr) == NULL) continue; schedule_downtime(SERVICE_DOWNTIME, temp_service->host_name, temp_service->description, entry_time, author, comment_data, start_time, end_time, fixed, triggered_by, duration, &downtime_id); } } break; case CMD_SCHEDULE_SERVICEGROUP_HOST_DOWNTIME: last_host = NULL; for(temp_sgmember = temp_servicegroup->members; temp_sgmember != NULL; temp_sgmember = temp_sgmember->next) { temp_host = find_host(temp_sgmember->host_name); if(temp_host == NULL) continue; if(last_host == temp_host) continue; schedule_downtime(HOST_DOWNTIME, temp_sgmember->host_name, NULL, entry_time, author, comment_data, start_time, end_time, fixed, triggered_by, duration, &downtime_id); last_host = temp_host; } break; case CMD_SCHEDULE_SERVICEGROUP_SVC_DOWNTIME: for(temp_sgmember = temp_servicegroup->members; temp_sgmember != NULL; temp_sgmember = temp_sgmember->next) schedule_downtime(SERVICE_DOWNTIME, temp_sgmember->host_name, temp_sgmember->service_description, entry_time, author, comment_data, start_time, end_time, fixed, triggered_by, duration, &downtime_id); break; case CMD_SCHEDULE_AND_PROPAGATE_HOST_DOWNTIME: /* schedule downtime for "parent" host */ schedule_downtime(HOST_DOWNTIME, host_name, NULL, entry_time, author, comment_data, start_time, end_time, fixed, triggered_by, duration, &downtime_id); /* schedule (non-triggered) downtime for all child hosts */ schedule_and_propagate_downtime(temp_host, entry_time, author, comment_data, start_time, end_time, fixed, 0, duration); break; case CMD_SCHEDULE_AND_PROPAGATE_TRIGGERED_HOST_DOWNTIME: /* schedule downtime for "parent" host */ schedule_downtime(HOST_DOWNTIME, host_name, NULL, entry_time, author, comment_data, start_time, end_time, fixed, triggered_by, duration, &downtime_id); /* schedule triggered downtime for all child hosts */ schedule_and_propagate_downtime(temp_host, entry_time, author, comment_data, start_time, end_time, fixed, downtime_id, duration); break; default: break; } return OK; } /* deletes scheduled host or service downtime */ int cmd_delete_downtime(int cmd, char *args) { unsigned long downtime_id = 0L; char *temp_ptr = NULL; /* get the id of the downtime to delete */ if((temp_ptr = my_strtok(args, "\n")) == NULL) return ERROR; downtime_id = strtoul(temp_ptr, NULL, 10); if(cmd == CMD_DEL_HOST_DOWNTIME) unschedule_downtime(HOST_DOWNTIME, downtime_id); else unschedule_downtime(SERVICE_DOWNTIME, downtime_id); return OK; } /* Deletes scheduled host and service downtime based on hostname and optionally other filter arguments */ int cmd_delete_downtime_by_host_name(int cmd, char *args) { char *temp_ptr = NULL; char *end_ptr = NULL; char *hostname = NULL; char *service_description = NULL; char *downtime_comment = NULL; time_t downtime_start_time = 0L; int deleted = 0; /* get the host name of the downtime to delete */ temp_ptr = my_strtok(args, ";"); if(temp_ptr == NULL) return ERROR; hostname = temp_ptr; /* get the optional service name */ temp_ptr = my_strtok(NULL, ";"); if(temp_ptr != NULL) { if(*temp_ptr != '\0') service_description = temp_ptr; /* get the optional start time */ temp_ptr = my_strtok(NULL, ";"); if(temp_ptr != NULL) { downtime_start_time = strtoul(temp_ptr, &end_ptr, 10); /* get the optional comment */ temp_ptr = my_strtok(NULL, ";"); if(temp_ptr != NULL) { if(*temp_ptr != '\0') downtime_comment = temp_ptr; } } } deleted = delete_downtime_by_hostname_service_description_start_time_comment(hostname, service_description, downtime_start_time, downtime_comment); if(deleted == 0) return ERROR; return OK; } int cmd_delete_downtime_by_hostgroup_name(int cmd, char *args) { char *temp_ptr = NULL; char *end_ptr = NULL; host *temp_host = NULL; hostgroup *temp_hostgroup = NULL; hostsmember *temp_member = NULL; char *service_description = NULL; char *downtime_comment = NULL; char *host_name = NULL; time_t downtime_start_time = 0L; int deleted = 0; /* get the host group name of the downtime to delete */ temp_ptr = my_strtok(args, ";"); if(temp_ptr == NULL) return ERROR; temp_hostgroup = find_hostgroup(temp_ptr); if(temp_hostgroup == NULL) return ERROR; /* get the optional host name */ temp_ptr = my_strtok(NULL, ";"); if(temp_ptr != NULL) { if(*temp_ptr != '\0') host_name = temp_ptr; /* get the optional service name */ temp_ptr = my_strtok(NULL, ";"); if(temp_ptr != NULL) { if(*temp_ptr != '\0') service_description = temp_ptr; /* get the optional start time */ temp_ptr = my_strtok(NULL, ";"); if(temp_ptr != NULL) { downtime_start_time = strtoul(temp_ptr, &end_ptr, 10); /* get the optional comment */ temp_ptr = my_strtok(NULL, ";"); if(temp_ptr != NULL) { if(*temp_ptr != '\0') downtime_comment = temp_ptr; } } } /* get the optional service name */ temp_ptr = my_strtok(NULL, ";"); if(temp_ptr != NULL) { if(*temp_ptr != '\0') service_description = temp_ptr; /* get the optional start time */ temp_ptr = my_strtok(NULL, ";"); if(temp_ptr != NULL) { downtime_start_time = strtoul(temp_ptr, &end_ptr, 10); /* get the optional comment */ temp_ptr = my_strtok(NULL, ";"); if(temp_ptr != NULL) { if(*temp_ptr != '\0') downtime_comment = temp_ptr; } } } } for(temp_member = temp_hostgroup->members; temp_member != NULL; temp_member = temp_member->next) { if((temp_host = (host *)temp_member->host_ptr) == NULL) continue; if(host_name != NULL && strcmp(temp_host->name, host_name) != 0) continue; deleted = +delete_downtime_by_hostname_service_description_start_time_comment(temp_host->name, service_description, downtime_start_time, downtime_comment); } if(deleted == 0) return ERROR; return OK; } int cmd_delete_downtime_by_start_time_comment(int cmd, char *args) { time_t downtime_start_time = 0L; char *downtime_comment = NULL; char *temp_ptr = NULL; char *end_ptr = NULL; int deleted = 0; /* Get start time if set */ temp_ptr = my_strtok(args, ";"); if(temp_ptr != NULL) { /* This will be set to 0 if no start_time is entered or data is bad */ downtime_start_time = strtoul(temp_ptr, &end_ptr, 10); } /* Get comment - not sure if this should be also tokenised by ; */ temp_ptr = my_strtok(NULL, "\n"); if(temp_ptr != NULL && *temp_ptr != '\0') { downtime_comment = temp_ptr; } /* No args should give an error */ if(downtime_start_time == 0 && downtime_comment == NULL) return ERROR; deleted = delete_downtime_by_hostname_service_description_start_time_comment(NULL, NULL, downtime_start_time, downtime_comment); if(deleted == 0) return ERROR; return OK; } /* changes a host or service (integer) variable */ int cmd_change_object_int_var(int cmd, char *args) { service *temp_service = NULL; host *temp_host = NULL; contact *temp_contact = NULL; char *host_name = NULL; char *svc_description = NULL; char *contact_name = NULL; char *temp_ptr = NULL; int intval = 0; double dval = 0.0; double old_dval = 0.0; time_t preferred_time = 0L; time_t next_valid_time = 0L; unsigned long attr = MODATTR_NONE; unsigned long hattr = MODATTR_NONE; unsigned long sattr = MODATTR_NONE; switch(cmd) { case CMD_CHANGE_NORMAL_SVC_CHECK_INTERVAL: case CMD_CHANGE_RETRY_SVC_CHECK_INTERVAL: case CMD_CHANGE_MAX_SVC_CHECK_ATTEMPTS: case CMD_CHANGE_SVC_MODATTR: /* get the host name */ if((host_name = my_strtok(args, ";")) == NULL) return ERROR; /* get the service name */ if((svc_description = my_strtok(NULL, ";")) == NULL) return ERROR; /* verify that the service is valid */ if((temp_service = find_service(host_name, svc_description)) == NULL) return ERROR; break; case CMD_CHANGE_NORMAL_HOST_CHECK_INTERVAL: case CMD_CHANGE_RETRY_HOST_CHECK_INTERVAL: case CMD_CHANGE_MAX_HOST_CHECK_ATTEMPTS: case CMD_CHANGE_HOST_MODATTR: /* get the host name */ if((host_name = my_strtok(args, ";")) == NULL) return ERROR; /* verify that the host is valid */ if((temp_host = find_host(host_name)) == NULL) return ERROR; break; case CMD_CHANGE_CONTACT_MODATTR: case CMD_CHANGE_CONTACT_MODHATTR: case CMD_CHANGE_CONTACT_MODSATTR: /* get the contact name */ if((contact_name = my_strtok(args, ";")) == NULL) return ERROR; /* verify that the contact is valid */ if((temp_contact = find_contact(contact_name)) == NULL) return ERROR; break; default: /* unknown command */ return ERROR; break; } /* get the value */ if((temp_ptr = my_strtok(NULL, ";")) == NULL) return ERROR; intval = (int)strtol(temp_ptr, NULL, 0); if(intval < 0 || (intval == 0 && errno == EINVAL)) return ERROR; dval = (int)strtod(temp_ptr, NULL); switch(cmd) { case CMD_CHANGE_NORMAL_HOST_CHECK_INTERVAL: /* save the old check interval */ old_dval = temp_host->check_interval; /* modify the check interval */ temp_host->check_interval = dval; attr = MODATTR_NORMAL_CHECK_INTERVAL; /* schedule a host check if previous interval was 0 (checks were not regularly scheduled) */ if(old_dval == 0 && temp_host->checks_enabled == TRUE) { /* set the host check flag */ temp_host->should_be_scheduled = TRUE; /* schedule a check for right now (or as soon as possible) */ time(&preferred_time); if(check_time_against_period(preferred_time, temp_host->check_period_ptr) == ERROR) { get_next_valid_time(preferred_time, &next_valid_time, temp_host->check_period_ptr); temp_host->next_check = next_valid_time; } else temp_host->next_check = preferred_time; /* schedule a check if we should */ if(temp_host->should_be_scheduled == TRUE) schedule_host_check(temp_host, temp_host->next_check, CHECK_OPTION_NONE); } break; case CMD_CHANGE_RETRY_HOST_CHECK_INTERVAL: temp_host->retry_interval = dval; attr = MODATTR_RETRY_CHECK_INTERVAL; break; case CMD_CHANGE_MAX_HOST_CHECK_ATTEMPTS: temp_host->max_attempts = intval; attr = MODATTR_MAX_CHECK_ATTEMPTS; /* adjust current attempt number if in a hard state */ if(temp_host->state_type == HARD_STATE && temp_host->current_state != HOST_UP && temp_host->current_attempt > 1) temp_host->current_attempt = temp_host->max_attempts; break; case CMD_CHANGE_NORMAL_SVC_CHECK_INTERVAL: /* save the old check interval */ old_dval = temp_service->check_interval; /* modify the check interval */ temp_service->check_interval = dval; attr = MODATTR_NORMAL_CHECK_INTERVAL; /* schedule a service check if previous interval was 0 (checks were not regularly scheduled) */ if(old_dval == 0 && temp_service->checks_enabled == TRUE && temp_service->check_interval != 0) { /* set the service check flag */ temp_service->should_be_scheduled = TRUE; /* schedule a check for right now (or as soon as possible) */ time(&preferred_time); if(check_time_against_period(preferred_time, temp_service->check_period_ptr) == ERROR) { get_next_valid_time(preferred_time, &next_valid_time, temp_service->check_period_ptr); temp_service->next_check = next_valid_time; } else temp_service->next_check = preferred_time; /* schedule a check if we should */ if(temp_service->should_be_scheduled == TRUE) schedule_service_check(temp_service, temp_service->next_check, CHECK_OPTION_NONE); } break; case CMD_CHANGE_RETRY_SVC_CHECK_INTERVAL: temp_service->retry_interval = dval; attr = MODATTR_RETRY_CHECK_INTERVAL; break; case CMD_CHANGE_MAX_SVC_CHECK_ATTEMPTS: temp_service->max_attempts = intval; attr = MODATTR_MAX_CHECK_ATTEMPTS; /* adjust current attempt number if in a hard state */ if(temp_service->state_type == HARD_STATE && temp_service->current_state != STATE_OK && temp_service->current_attempt > 1) temp_service->current_attempt = temp_service->max_attempts; break; case CMD_CHANGE_HOST_MODATTR: case CMD_CHANGE_SVC_MODATTR: case CMD_CHANGE_CONTACT_MODATTR: attr = intval; break; case CMD_CHANGE_CONTACT_MODHATTR: hattr = intval; break; case CMD_CHANGE_CONTACT_MODSATTR: sattr = intval; break; default: break; } /* send data to event broker and update status file */ switch(cmd) { case CMD_CHANGE_RETRY_SVC_CHECK_INTERVAL: case CMD_CHANGE_NORMAL_SVC_CHECK_INTERVAL: case CMD_CHANGE_MAX_SVC_CHECK_ATTEMPTS: case CMD_CHANGE_SVC_MODATTR: /* set the modified service attribute */ if(cmd == CMD_CHANGE_SVC_MODATTR) temp_service->modified_attributes = attr; else temp_service->modified_attributes |= attr; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_adaptive_service_data(NEBTYPE_ADAPTIVESERVICE_UPDATE, NEBFLAG_NONE, NEBATTR_NONE, temp_service, cmd, attr, temp_service->modified_attributes, NULL); #endif /* update the status log with the service info */ update_service_status(temp_service, FALSE); break; case CMD_CHANGE_NORMAL_HOST_CHECK_INTERVAL: case CMD_CHANGE_RETRY_HOST_CHECK_INTERVAL: case CMD_CHANGE_MAX_HOST_CHECK_ATTEMPTS: case CMD_CHANGE_HOST_MODATTR: /* set the modified host attribute */ if(cmd == CMD_CHANGE_HOST_MODATTR) temp_host->modified_attributes = attr; else temp_host->modified_attributes |= attr; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_adaptive_host_data(NEBTYPE_ADAPTIVEHOST_UPDATE, NEBFLAG_NONE, NEBATTR_NONE, temp_host, cmd, attr, temp_host->modified_attributes, NULL); #endif /* update the status log with the host info */ update_host_status(temp_host, FALSE); break; case CMD_CHANGE_CONTACT_MODATTR: case CMD_CHANGE_CONTACT_MODHATTR: case CMD_CHANGE_CONTACT_MODSATTR: /* set the modified attribute */ switch(cmd) { case CMD_CHANGE_CONTACT_MODATTR: temp_contact->modified_attributes = attr; break; case CMD_CHANGE_CONTACT_MODHATTR: temp_contact->modified_host_attributes = hattr; break; case CMD_CHANGE_CONTACT_MODSATTR: temp_contact->modified_service_attributes = sattr; break; default: break; } #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_adaptive_contact_data(NEBTYPE_ADAPTIVECONTACT_UPDATE, NEBFLAG_NONE, NEBATTR_NONE, temp_contact, cmd, attr, temp_contact->modified_attributes, hattr, temp_contact->modified_host_attributes, sattr, temp_contact->modified_service_attributes, NULL); #endif /* update the status log with the contact info */ update_contact_status(temp_contact, FALSE); break; default: break; } return OK; } /* changes a host or service (char) variable */ int cmd_change_object_char_var(int cmd, char *args) { service *temp_service = NULL; host *temp_host = NULL; contact *temp_contact = NULL; timeperiod *temp_timeperiod = NULL; command *temp_command = NULL; char *host_name = NULL; char *svc_description = NULL; char *contact_name = NULL; char *charval = NULL; char *temp_ptr = NULL; char *temp_ptr2 = NULL; unsigned long attr = MODATTR_NONE; unsigned long hattr = MODATTR_NONE; unsigned long sattr = MODATTR_NONE; /* SECURITY PATCH - disable these for the time being */ switch(cmd) { case CMD_CHANGE_GLOBAL_HOST_EVENT_HANDLER: case CMD_CHANGE_GLOBAL_SVC_EVENT_HANDLER: case CMD_CHANGE_HOST_EVENT_HANDLER: case CMD_CHANGE_SVC_EVENT_HANDLER: case CMD_CHANGE_HOST_CHECK_COMMAND: case CMD_CHANGE_SVC_CHECK_COMMAND: return ERROR; } /* get the command arguments */ switch(cmd) { case CMD_CHANGE_GLOBAL_HOST_EVENT_HANDLER: case CMD_CHANGE_GLOBAL_SVC_EVENT_HANDLER: if((charval = my_strtok(args, "\n")) == NULL) return ERROR; break; case CMD_CHANGE_HOST_EVENT_HANDLER: case CMD_CHANGE_HOST_CHECK_COMMAND: case CMD_CHANGE_HOST_CHECK_TIMEPERIOD: case CMD_CHANGE_HOST_NOTIFICATION_TIMEPERIOD: /* get the host name */ if((host_name = my_strtok(args, ";")) == NULL) return ERROR; /* verify that the host is valid */ if((temp_host = find_host(host_name)) == NULL) return ERROR; if((charval = my_strtok(NULL, "\n")) == NULL) return ERROR; break; case CMD_CHANGE_SVC_EVENT_HANDLER: case CMD_CHANGE_SVC_CHECK_COMMAND: case CMD_CHANGE_SVC_CHECK_TIMEPERIOD: case CMD_CHANGE_SVC_NOTIFICATION_TIMEPERIOD: /* get the host name */ if((host_name = my_strtok(args, ";")) == NULL) return ERROR; /* get the service name */ if((svc_description = my_strtok(NULL, ";")) == NULL) return ERROR; /* verify that the service is valid */ if((temp_service = find_service(host_name, svc_description)) == NULL) return ERROR; if((charval = my_strtok(NULL, "\n")) == NULL) return ERROR; break; case CMD_CHANGE_CONTACT_HOST_NOTIFICATION_TIMEPERIOD: case CMD_CHANGE_CONTACT_SVC_NOTIFICATION_TIMEPERIOD: /* get the contact name */ if((contact_name = my_strtok(args, ";")) == NULL) return ERROR; /* verify that the contact is valid */ if((temp_contact = find_contact(contact_name)) == NULL) return ERROR; if((charval = my_strtok(NULL, "\n")) == NULL) return ERROR; break; default: /* invalid command */ return ERROR; break; } if((temp_ptr = (char *)strdup(charval)) == NULL) return ERROR; /* do some validation */ switch(cmd) { case CMD_CHANGE_HOST_CHECK_TIMEPERIOD: case CMD_CHANGE_SVC_CHECK_TIMEPERIOD: case CMD_CHANGE_HOST_NOTIFICATION_TIMEPERIOD: case CMD_CHANGE_SVC_NOTIFICATION_TIMEPERIOD: case CMD_CHANGE_CONTACT_HOST_NOTIFICATION_TIMEPERIOD: case CMD_CHANGE_CONTACT_SVC_NOTIFICATION_TIMEPERIOD: /* make sure the timeperiod is valid */ if((temp_timeperiod = find_timeperiod(temp_ptr)) == NULL) { my_free(temp_ptr); return ERROR; } break; case CMD_CHANGE_GLOBAL_HOST_EVENT_HANDLER: case CMD_CHANGE_GLOBAL_SVC_EVENT_HANDLER: case CMD_CHANGE_HOST_EVENT_HANDLER: case CMD_CHANGE_SVC_EVENT_HANDLER: case CMD_CHANGE_HOST_CHECK_COMMAND: case CMD_CHANGE_SVC_CHECK_COMMAND: /* make sure the command exists */ temp_ptr2 = my_strtok(temp_ptr, "!"); if((temp_command = find_command(temp_ptr2)) == NULL) { my_free(temp_ptr); return ERROR; } my_free(temp_ptr); if((temp_ptr = (char *)strdup(charval)) == NULL) return ERROR; break; default: break; } /* update the variable */ switch(cmd) { case CMD_CHANGE_GLOBAL_HOST_EVENT_HANDLER: my_free(global_host_event_handler); global_host_event_handler = temp_ptr; global_host_event_handler_ptr = temp_command; attr = MODATTR_EVENT_HANDLER_COMMAND; break; case CMD_CHANGE_GLOBAL_SVC_EVENT_HANDLER: my_free(global_service_event_handler); global_service_event_handler = temp_ptr; global_service_event_handler_ptr = temp_command; attr = MODATTR_EVENT_HANDLER_COMMAND; break; case CMD_CHANGE_HOST_EVENT_HANDLER: my_free(temp_host->event_handler); temp_host->event_handler = temp_ptr; temp_host->event_handler_ptr = temp_command; attr = MODATTR_EVENT_HANDLER_COMMAND; break; case CMD_CHANGE_HOST_CHECK_COMMAND: my_free(temp_host->check_command); temp_host->check_command = temp_ptr; temp_host->check_command_ptr = temp_command; attr = MODATTR_CHECK_COMMAND; break; case CMD_CHANGE_HOST_CHECK_TIMEPERIOD: my_free(temp_host->check_period); temp_host->check_period = temp_ptr; temp_host->check_period_ptr = temp_timeperiod; attr = MODATTR_CHECK_TIMEPERIOD; break; case CMD_CHANGE_HOST_NOTIFICATION_TIMEPERIOD: my_free(temp_host->notification_period); temp_host->notification_period = temp_ptr; temp_host->notification_period_ptr = temp_timeperiod; attr = MODATTR_NOTIFICATION_TIMEPERIOD; break; case CMD_CHANGE_SVC_EVENT_HANDLER: my_free(temp_service->event_handler); temp_service->event_handler = temp_ptr; temp_service->event_handler_ptr = temp_command; attr = MODATTR_EVENT_HANDLER_COMMAND; break; case CMD_CHANGE_SVC_CHECK_COMMAND: my_free(temp_service->check_command); temp_service->check_command = temp_ptr; temp_service->check_command_ptr = temp_command; attr = MODATTR_CHECK_COMMAND; break; case CMD_CHANGE_SVC_CHECK_TIMEPERIOD: my_free(temp_service->check_period); temp_service->check_period = temp_ptr; temp_service->check_period_ptr = temp_timeperiod; attr = MODATTR_CHECK_TIMEPERIOD; break; case CMD_CHANGE_SVC_NOTIFICATION_TIMEPERIOD: my_free(temp_service->notification_period); temp_service->notification_period = temp_ptr; temp_service->notification_period_ptr = temp_timeperiod; attr = MODATTR_NOTIFICATION_TIMEPERIOD; break; case CMD_CHANGE_CONTACT_HOST_NOTIFICATION_TIMEPERIOD: my_free(temp_contact->host_notification_period); temp_contact->host_notification_period = temp_ptr; temp_contact->host_notification_period_ptr = temp_timeperiod; hattr = MODATTR_NOTIFICATION_TIMEPERIOD; break; case CMD_CHANGE_CONTACT_SVC_NOTIFICATION_TIMEPERIOD: my_free(temp_contact->service_notification_period); temp_contact->service_notification_period = temp_ptr; temp_contact->service_notification_period_ptr = temp_timeperiod; sattr = MODATTR_NOTIFICATION_TIMEPERIOD; break; default: break; } /* send data to event broker and update status file */ switch(cmd) { case CMD_CHANGE_GLOBAL_HOST_EVENT_HANDLER: /* set the modified host attribute */ modified_host_process_attributes |= attr; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_adaptive_program_data(NEBTYPE_ADAPTIVEPROGRAM_UPDATE, NEBFLAG_NONE, NEBATTR_NONE, cmd, attr, modified_host_process_attributes, MODATTR_NONE, modified_service_process_attributes, NULL); #endif /* update program status */ update_program_status(FALSE); break; case CMD_CHANGE_GLOBAL_SVC_EVENT_HANDLER: /* set the modified service attribute */ modified_service_process_attributes |= attr; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_adaptive_program_data(NEBTYPE_ADAPTIVEPROGRAM_UPDATE, NEBFLAG_NONE, NEBATTR_NONE, cmd, MODATTR_NONE, modified_host_process_attributes, attr, modified_service_process_attributes, NULL); #endif /* update program status */ update_program_status(FALSE); break; case CMD_CHANGE_SVC_EVENT_HANDLER: case CMD_CHANGE_SVC_CHECK_COMMAND: case CMD_CHANGE_SVC_CHECK_TIMEPERIOD: case CMD_CHANGE_SVC_NOTIFICATION_TIMEPERIOD: /* set the modified service attribute */ temp_service->modified_attributes |= attr; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_adaptive_service_data(NEBTYPE_ADAPTIVESERVICE_UPDATE, NEBFLAG_NONE, NEBATTR_NONE, temp_service, cmd, attr, temp_service->modified_attributes, NULL); #endif /* update the status log with the service info */ update_service_status(temp_service, FALSE); break; case CMD_CHANGE_HOST_EVENT_HANDLER: case CMD_CHANGE_HOST_CHECK_COMMAND: case CMD_CHANGE_HOST_CHECK_TIMEPERIOD: case CMD_CHANGE_HOST_NOTIFICATION_TIMEPERIOD: /* set the modified host attribute */ temp_host->modified_attributes |= attr; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_adaptive_host_data(NEBTYPE_ADAPTIVEHOST_UPDATE, NEBFLAG_NONE, NEBATTR_NONE, temp_host, cmd, attr, temp_host->modified_attributes, NULL); #endif /* update the status log with the host info */ update_host_status(temp_host, FALSE); break; case CMD_CHANGE_CONTACT_HOST_NOTIFICATION_TIMEPERIOD: case CMD_CHANGE_CONTACT_SVC_NOTIFICATION_TIMEPERIOD: /* set the modified attributes */ temp_contact->modified_host_attributes |= hattr; temp_contact->modified_service_attributes |= sattr; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_adaptive_contact_data(NEBTYPE_ADAPTIVECONTACT_UPDATE, NEBFLAG_NONE, NEBATTR_NONE, temp_contact, cmd, attr, temp_contact->modified_attributes, hattr, temp_contact->modified_host_attributes, sattr, temp_contact->modified_service_attributes, NULL); #endif /* update the status log with the contact info */ update_contact_status(temp_contact, FALSE); break; default: break; } return OK; } /* changes a custom host or service variable */ int cmd_change_object_custom_var(int cmd, char *args) { host *temp_host = NULL; service *temp_service = NULL; contact *temp_contact = NULL; customvariablesmember *temp_customvariablesmember = NULL; char *temp_ptr = NULL; char *name1 = NULL; char *name2 = NULL; char *varname = NULL; char *varvalue = NULL; register int x = 0; /* get the host or contact name */ if((temp_ptr = my_strtok(args, ";")) == NULL) return ERROR; if((name1 = (char *)strdup(temp_ptr)) == NULL) return ERROR; /* get the service description if necessary */ if(cmd == CMD_CHANGE_CUSTOM_SVC_VAR) { if((temp_ptr = my_strtok(NULL, ";")) == NULL) { my_free(name1); return ERROR; } if((name2 = (char *)strdup(temp_ptr)) == NULL) { my_free(name1); return ERROR; } } /* get the custom variable name */ if((temp_ptr = my_strtok(NULL, ";")) == NULL) { my_free(name1); my_free(name2); return ERROR; } if((varname = (char *)strdup(temp_ptr)) == NULL) { my_free(name1); my_free(name2); return ERROR; } /* get the custom variable value */ if((temp_ptr = my_strtok(NULL, ";")) == NULL) { my_free(name1); my_free(name2); my_free(varname); return ERROR; } if((varvalue = (char *)strdup(temp_ptr)) == NULL) { my_free(name1); my_free(name2); my_free(varname); return ERROR; } /* find the object */ switch(cmd) { case CMD_CHANGE_CUSTOM_HOST_VAR: if((temp_host = find_host(name1)) == NULL) return ERROR; temp_customvariablesmember = temp_host->custom_variables; break; case CMD_CHANGE_CUSTOM_SVC_VAR: if((temp_service = find_service(name1, name2)) == NULL) return ERROR; temp_customvariablesmember = temp_service->custom_variables; break; case CMD_CHANGE_CUSTOM_CONTACT_VAR: if((temp_contact = find_contact(name1)) == NULL) return ERROR; temp_customvariablesmember = temp_contact->custom_variables; break; default: break; } /* capitalize the custom variable name */ for(x = 0; varname[x] != '\x0'; x++) varname[x] = toupper(varname[x]); /* find the proper variable */ for(; temp_customvariablesmember != NULL; temp_customvariablesmember = temp_customvariablesmember->next) { /* we found the variable, so update the value */ if(!strcmp(varname, temp_customvariablesmember->variable_name)) { /* update the value */ if(temp_customvariablesmember->variable_value) my_free(temp_customvariablesmember->variable_value); temp_customvariablesmember->variable_value = (char *)strdup(varvalue); /* mark the variable value as having been changed */ temp_customvariablesmember->has_been_modified = TRUE; break; } } /* free memory */ my_free(name1); my_free(name2); my_free(varname); my_free(varvalue); /* set the modified attributes and update the status of the object */ switch(cmd) { case CMD_CHANGE_CUSTOM_HOST_VAR: temp_host->modified_attributes |= MODATTR_CUSTOM_VARIABLE; update_host_status(temp_host, FALSE); break; case CMD_CHANGE_CUSTOM_SVC_VAR: temp_service->modified_attributes |= MODATTR_CUSTOM_VARIABLE; update_service_status(temp_service, FALSE); break; case CMD_CHANGE_CUSTOM_CONTACT_VAR: temp_contact->modified_attributes |= MODATTR_CUSTOM_VARIABLE; update_contact_status(temp_contact, FALSE); break; default: break; } return OK; } /* processes an external host command */ int cmd_process_external_commands_from_file(int cmd, char *args) { char *fname = NULL; char *temp_ptr = NULL; int delete_file = FALSE; /* get the file name */ if((temp_ptr = my_strtok(args, ";")) == NULL) return ERROR; if((fname = (char *)strdup(temp_ptr)) == NULL) return ERROR; /* find the deletion option */ if((temp_ptr = my_strtok(NULL, "\n")) == NULL) { my_free(fname); return ERROR; } if(atoi(temp_ptr) == 0) delete_file = FALSE; else delete_file = TRUE; /* process the file */ process_external_commands_from_file(fname, delete_file); /* free memory */ my_free(fname); return OK; } /******************************************************************/ /*************** INTERNAL COMMAND IMPLEMENTATIONS ****************/ /******************************************************************/ /* temporarily disables a service check */ void disable_service_checks(service *svc) { unsigned long attr = MODATTR_ACTIVE_CHECKS_ENABLED; /* checks are already disabled */ if(svc->checks_enabled == FALSE) return; /* set the attribute modified flag */ svc->modified_attributes |= attr; /* disable the service check... */ svc->checks_enabled = FALSE; svc->should_be_scheduled = FALSE; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_adaptive_service_data(NEBTYPE_ADAPTIVESERVICE_UPDATE, NEBFLAG_NONE, NEBATTR_NONE, svc, CMD_NONE, attr, svc->modified_attributes, NULL); #endif /* update the status log to reflect the new service state */ update_service_status(svc, FALSE); return; } /* enables a service check */ void enable_service_checks(service *svc) { time_t preferred_time = 0L; time_t next_valid_time = 0L; unsigned long attr = MODATTR_ACTIVE_CHECKS_ENABLED; /* checks are already enabled */ if(svc->checks_enabled == TRUE) return; /* set the attribute modified flag */ svc->modified_attributes |= attr; /* enable the service check... */ svc->checks_enabled = TRUE; svc->should_be_scheduled = TRUE; /* services with no check intervals don't get checked */ if(svc->check_interval == 0) svc->should_be_scheduled = FALSE; /* schedule a check for right now (or as soon as possible) */ time(&preferred_time); if(check_time_against_period(preferred_time, svc->check_period_ptr) == ERROR) { get_next_valid_time(preferred_time, &next_valid_time, svc->check_period_ptr); svc->next_check = next_valid_time; } else svc->next_check = preferred_time; /* schedule a check if we should */ if(svc->should_be_scheduled == TRUE) schedule_service_check(svc, svc->next_check, CHECK_OPTION_NONE); #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_adaptive_service_data(NEBTYPE_ADAPTIVESERVICE_UPDATE, NEBFLAG_NONE, NEBATTR_NONE, svc, CMD_NONE, attr, svc->modified_attributes, NULL); #endif /* update the status log to reflect the new service state */ update_service_status(svc, FALSE); return; } /* enable notifications on a program-wide basis */ void enable_all_notifications(void) { unsigned long attr = MODATTR_NOTIFICATIONS_ENABLED; /* bail out if we're already set... */ if(enable_notifications == TRUE) return; /* set the attribute modified flag */ modified_host_process_attributes |= attr; modified_service_process_attributes |= attr; /* update notification status */ enable_notifications = TRUE; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_adaptive_program_data(NEBTYPE_ADAPTIVEPROGRAM_UPDATE, NEBFLAG_NONE, NEBATTR_NONE, CMD_NONE, attr, modified_host_process_attributes, attr, modified_service_process_attributes, NULL); #endif /* update the status log */ update_program_status(FALSE); return; } /* disable notifications on a program-wide basis */ void disable_all_notifications(void) { unsigned long attr = MODATTR_NOTIFICATIONS_ENABLED; /* bail out if we're already set... */ if(enable_notifications == FALSE) return; /* set the attribute modified flag */ modified_host_process_attributes |= attr; modified_service_process_attributes |= attr; /* update notification status */ enable_notifications = FALSE; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_adaptive_program_data(NEBTYPE_ADAPTIVEPROGRAM_UPDATE, NEBFLAG_NONE, NEBATTR_NONE, CMD_NONE, attr, modified_host_process_attributes, attr, modified_service_process_attributes, NULL); #endif /* update the status log */ update_program_status(FALSE); return; } /* enables notifications for a service */ void enable_service_notifications(service *svc) { unsigned long attr = MODATTR_NOTIFICATIONS_ENABLED; /* no change */ if(svc->notifications_enabled == TRUE) return; /* set the attribute modified flag */ svc->modified_attributes |= attr; /* enable the service notifications... */ svc->notifications_enabled = TRUE; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_adaptive_service_data(NEBTYPE_ADAPTIVESERVICE_UPDATE, NEBFLAG_NONE, NEBATTR_NONE, svc, CMD_NONE, attr, svc->modified_attributes, NULL); #endif /* update the status log to reflect the new service state */ update_service_status(svc, FALSE); return; } /* disables notifications for a service */ void disable_service_notifications(service *svc) { unsigned long attr = MODATTR_NOTIFICATIONS_ENABLED; /* no change */ if(svc->notifications_enabled == FALSE) return; /* set the attribute modified flag */ svc->modified_attributes |= attr; /* disable the service notifications... */ svc->notifications_enabled = FALSE; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_adaptive_service_data(NEBTYPE_ADAPTIVESERVICE_UPDATE, NEBFLAG_NONE, NEBATTR_NONE, svc, CMD_NONE, attr, svc->modified_attributes, NULL); #endif /* update the status log to reflect the new service state */ update_service_status(svc, FALSE); return; } /* enables notifications for a host */ void enable_host_notifications(host *hst) { unsigned long attr = MODATTR_NOTIFICATIONS_ENABLED; /* no change */ if(hst->notifications_enabled == TRUE) return; /* set the attribute modified flag */ hst->modified_attributes |= attr; /* enable the host notifications... */ hst->notifications_enabled = TRUE; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_adaptive_host_data(NEBTYPE_ADAPTIVEHOST_UPDATE, NEBFLAG_NONE, NEBATTR_NONE, hst, CMD_NONE, attr, hst->modified_attributes, NULL); #endif /* update the status log to reflect the new host state */ update_host_status(hst, FALSE); return; } /* disables notifications for a host */ void disable_host_notifications(host *hst) { unsigned long attr = MODATTR_NOTIFICATIONS_ENABLED; /* no change */ if(hst->notifications_enabled == FALSE) return; /* set the attribute modified flag */ hst->modified_attributes |= attr; /* disable the host notifications... */ hst->notifications_enabled = FALSE; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_adaptive_host_data(NEBTYPE_ADAPTIVEHOST_UPDATE, NEBFLAG_NONE, NEBATTR_NONE, hst, CMD_NONE, attr, hst->modified_attributes, NULL); #endif /* update the status log to reflect the new host state */ update_host_status(hst, FALSE); return; } /* enables notifications for all hosts and services "beyond" a given host */ void enable_and_propagate_notifications(host *hst, int level, int affect_top_host, int affect_hosts, int affect_services) { host *child_host = NULL; service *temp_service = NULL; servicesmember *temp_servicesmember = NULL; hostsmember *temp_hostsmember = NULL; /* enable notification for top level host */ if(affect_top_host == TRUE && level == 0) enable_host_notifications(hst); /* check all child hosts... */ for(temp_hostsmember = hst->child_hosts; temp_hostsmember != NULL; temp_hostsmember = temp_hostsmember->next) { if((child_host = temp_hostsmember->host_ptr) == NULL) continue; /* recurse... */ enable_and_propagate_notifications(child_host, level + 1, affect_top_host, affect_hosts, affect_services); /* enable notifications for this host */ if(affect_hosts == TRUE) enable_host_notifications(child_host); /* enable notifications for all services on this host... */ if(affect_services == TRUE) { for(temp_servicesmember = child_host->services; temp_servicesmember != NULL; temp_servicesmember = temp_servicesmember->next) { if((temp_service = temp_servicesmember->service_ptr) == NULL) continue; enable_service_notifications(temp_service); } } } return; } /* disables notifications for all hosts and services "beyond" a given host */ void disable_and_propagate_notifications(host *hst, int level, int affect_top_host, int affect_hosts, int affect_services) { host *child_host = NULL; service *temp_service = NULL; servicesmember *temp_servicesmember = NULL; hostsmember *temp_hostsmember = NULL; if(hst == NULL) return; /* disable notifications for top host */ if(affect_top_host == TRUE && level == 0) disable_host_notifications(hst); /* check all child hosts... */ for(temp_hostsmember = hst->child_hosts; temp_hostsmember != NULL; temp_hostsmember = temp_hostsmember->next) { if((child_host = temp_hostsmember->host_ptr) == NULL) continue; /* recurse... */ disable_and_propagate_notifications(child_host, level + 1, affect_top_host, affect_hosts, affect_services); /* disable notifications for this host */ if(affect_hosts == TRUE) disable_host_notifications(child_host); /* disable notifications for all services on this host... */ if(affect_services == TRUE) { for(temp_servicesmember = child_host->services; temp_servicesmember != NULL; temp_servicesmember = temp_servicesmember->next) { if((temp_service = temp_servicesmember->service_ptr) == NULL) continue; disable_service_notifications(temp_service); } } } return; } /* enables host notifications for a contact */ void enable_contact_host_notifications(contact *cntct) { unsigned long attr = MODATTR_NOTIFICATIONS_ENABLED; /* no change */ if(cntct->host_notifications_enabled == TRUE) return; /* set the attribute modified flag */ cntct->modified_host_attributes |= attr; /* enable the host notifications... */ cntct->host_notifications_enabled = TRUE; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_adaptive_contact_data(NEBTYPE_ADAPTIVECONTACT_UPDATE, NEBFLAG_NONE, NEBATTR_NONE, cntct, CMD_NONE, MODATTR_NONE, cntct->modified_attributes, attr, cntct->modified_host_attributes, MODATTR_NONE, cntct->modified_service_attributes, NULL); #endif /* update the status log to reflect the new contact state */ update_contact_status(cntct, FALSE); return; } /* disables host notifications for a contact */ void disable_contact_host_notifications(contact *cntct) { unsigned long attr = MODATTR_NOTIFICATIONS_ENABLED; /* no change */ if(cntct->host_notifications_enabled == FALSE) return; /* set the attribute modified flag */ cntct->modified_host_attributes |= attr; /* enable the host notifications... */ cntct->host_notifications_enabled = FALSE; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_adaptive_contact_data(NEBTYPE_ADAPTIVECONTACT_UPDATE, NEBFLAG_NONE, NEBATTR_NONE, cntct, CMD_NONE, MODATTR_NONE, cntct->modified_attributes, attr, cntct->modified_host_attributes, MODATTR_NONE, cntct->modified_service_attributes, NULL); #endif /* update the status log to reflect the new contact state */ update_contact_status(cntct, FALSE); return; } /* enables service notifications for a contact */ void enable_contact_service_notifications(contact *cntct) { unsigned long attr = MODATTR_NOTIFICATIONS_ENABLED; /* no change */ if(cntct->service_notifications_enabled == TRUE) return; /* set the attribute modified flag */ cntct->modified_service_attributes |= attr; /* enable the host notifications... */ cntct->service_notifications_enabled = TRUE; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_adaptive_contact_data(NEBTYPE_ADAPTIVECONTACT_UPDATE, NEBFLAG_NONE, NEBATTR_NONE, cntct, CMD_NONE, MODATTR_NONE, cntct->modified_attributes, MODATTR_NONE, cntct->modified_host_attributes, attr, cntct->modified_service_attributes, NULL); #endif /* update the status log to reflect the new contact state */ update_contact_status(cntct, FALSE); return; } /* disables service notifications for a contact */ void disable_contact_service_notifications(contact *cntct) { unsigned long attr = MODATTR_NOTIFICATIONS_ENABLED; /* no change */ if(cntct->service_notifications_enabled == FALSE) return; /* set the attribute modified flag */ cntct->modified_service_attributes |= attr; /* enable the host notifications... */ cntct->service_notifications_enabled = FALSE; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_adaptive_contact_data(NEBTYPE_ADAPTIVECONTACT_UPDATE, NEBFLAG_NONE, NEBATTR_NONE, cntct, CMD_NONE, MODATTR_NONE, cntct->modified_attributes, MODATTR_NONE, cntct->modified_host_attributes, attr, cntct->modified_service_attributes, NULL); #endif /* update the status log to reflect the new contact state */ update_contact_status(cntct, FALSE); return; } /* schedules downtime for all hosts "beyond" a given host */ void schedule_and_propagate_downtime(host *temp_host, time_t entry_time, char *author, char *comment_data, time_t start_time, time_t end_time, int fixed, unsigned long triggered_by, unsigned long duration) { host *child_host = NULL; hostsmember *temp_hostsmember = NULL; /* check all child hosts... */ for(temp_hostsmember = temp_host->child_hosts; temp_hostsmember != NULL; temp_hostsmember = temp_hostsmember->next) { if((child_host = temp_hostsmember->host_ptr) == NULL) continue; /* recurse... */ schedule_and_propagate_downtime(child_host, entry_time, author, comment_data, start_time, end_time, fixed, triggered_by, duration); /* schedule downtime for this host */ schedule_downtime(HOST_DOWNTIME, child_host->name, NULL, entry_time, author, comment_data, start_time, end_time, fixed, triggered_by, duration, NULL); } return; } /* acknowledges a host problem */ void acknowledge_host_problem(host *hst, char *ack_author, char *ack_data, int type, int notify, int persistent) { time_t current_time = 0L; /* cannot acknowledge a non-existent problem */ if(hst->current_state == HOST_UP) return; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_acknowledgement_data(NEBTYPE_ACKNOWLEDGEMENT_ADD, NEBFLAG_NONE, NEBATTR_NONE, HOST_ACKNOWLEDGEMENT, (void *)hst, ack_author, ack_data, type, notify, persistent, NULL); #endif /* send out an acknowledgement notification */ if(notify == TRUE) host_notification(hst, NOTIFICATION_ACKNOWLEDGEMENT, ack_author, ack_data, NOTIFICATION_OPTION_NONE); /* set the acknowledgement flag */ hst->problem_has_been_acknowledged = TRUE; /* set the acknowledgement type */ hst->acknowledgement_type = (type == ACKNOWLEDGEMENT_STICKY) ? ACKNOWLEDGEMENT_STICKY : ACKNOWLEDGEMENT_NORMAL; /* update the status log with the host info */ update_host_status(hst, FALSE); /* add a comment for the acknowledgement */ time(¤t_time); add_new_host_comment(ACKNOWLEDGEMENT_COMMENT, hst->name, current_time, ack_author, ack_data, persistent, COMMENTSOURCE_INTERNAL, FALSE, (time_t)0, NULL); return; } /* acknowledges a service problem */ void acknowledge_service_problem(service *svc, char *ack_author, char *ack_data, int type, int notify, int persistent) { time_t current_time = 0L; /* cannot acknowledge a non-existent problem */ if(svc->current_state == STATE_OK) return; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_acknowledgement_data(NEBTYPE_ACKNOWLEDGEMENT_ADD, NEBFLAG_NONE, NEBATTR_NONE, SERVICE_ACKNOWLEDGEMENT, (void *)svc, ack_author, ack_data, type, notify, persistent, NULL); #endif /* send out an acknowledgement notification */ if(notify == TRUE) service_notification(svc, NOTIFICATION_ACKNOWLEDGEMENT, ack_author, ack_data, NOTIFICATION_OPTION_NONE); /* set the acknowledgement flag */ svc->problem_has_been_acknowledged = TRUE; /* set the acknowledgement type */ svc->acknowledgement_type = (type == ACKNOWLEDGEMENT_STICKY) ? ACKNOWLEDGEMENT_STICKY : ACKNOWLEDGEMENT_NORMAL; /* update the status log with the service info */ update_service_status(svc, FALSE); /* add a comment for the acknowledgement */ time(¤t_time); add_new_service_comment(ACKNOWLEDGEMENT_COMMENT, svc->host_name, svc->description, current_time, ack_author, ack_data, persistent, COMMENTSOURCE_INTERNAL, FALSE, (time_t)0, NULL); return; } /* removes a host acknowledgement */ void remove_host_acknowledgement(host *hst) { /* set the acknowledgement flag */ hst->problem_has_been_acknowledged = FALSE; /* update the status log with the host info */ update_host_status(hst, FALSE); /* remove any non-persistant comments associated with the ack */ delete_host_acknowledgement_comments(hst); return; } /* removes a service acknowledgement */ void remove_service_acknowledgement(service *svc) { /* set the acknowledgement flag */ svc->problem_has_been_acknowledged = FALSE; /* update the status log with the service info */ update_service_status(svc, FALSE); /* remove any non-persistant comments associated with the ack */ delete_service_acknowledgement_comments(svc); return; } /* starts executing service checks */ void start_executing_service_checks(void) { unsigned long attr = MODATTR_ACTIVE_CHECKS_ENABLED; /* bail out if we're already executing services */ if(execute_service_checks == TRUE) return; /* set the attribute modified flag */ modified_service_process_attributes |= attr; /* set the service check execution flag */ execute_service_checks = TRUE; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_adaptive_program_data(NEBTYPE_ADAPTIVEPROGRAM_UPDATE, NEBFLAG_NONE, NEBATTR_NONE, CMD_NONE, MODATTR_NONE, modified_host_process_attributes, attr, modified_service_process_attributes, NULL); #endif /* update the status log with the program info */ update_program_status(FALSE); return; } /* stops executing service checks */ void stop_executing_service_checks(void) { unsigned long attr = MODATTR_ACTIVE_CHECKS_ENABLED; /* bail out if we're already not executing services */ if(execute_service_checks == FALSE) return; /* set the attribute modified flag */ modified_service_process_attributes |= attr; /* set the service check execution flag */ execute_service_checks = FALSE; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_adaptive_program_data(NEBTYPE_ADAPTIVEPROGRAM_UPDATE, NEBFLAG_NONE, NEBATTR_NONE, CMD_NONE, MODATTR_NONE, modified_host_process_attributes, attr, modified_service_process_attributes, NULL); #endif /* update the status log with the program info */ update_program_status(FALSE); return; } /* starts accepting passive service checks */ void start_accepting_passive_service_checks(void) { unsigned long attr = MODATTR_PASSIVE_CHECKS_ENABLED; /* bail out if we're already accepting passive services */ if(accept_passive_service_checks == TRUE) return; /* set the attribute modified flag */ modified_service_process_attributes |= attr; /* set the service check flag */ accept_passive_service_checks = TRUE; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_adaptive_program_data(NEBTYPE_ADAPTIVEPROGRAM_UPDATE, NEBFLAG_NONE, NEBATTR_NONE, CMD_NONE, MODATTR_NONE, modified_host_process_attributes, attr, modified_service_process_attributes, NULL); #endif /* update the status log with the program info */ update_program_status(FALSE); return; } /* stops accepting passive service checks */ void stop_accepting_passive_service_checks(void) { unsigned long attr = MODATTR_PASSIVE_CHECKS_ENABLED; /* bail out if we're already not accepting passive services */ if(accept_passive_service_checks == FALSE) return; /* set the attribute modified flag */ modified_service_process_attributes |= attr; /* set the service check flag */ accept_passive_service_checks = FALSE; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_adaptive_program_data(NEBTYPE_ADAPTIVEPROGRAM_UPDATE, NEBFLAG_NONE, NEBATTR_NONE, CMD_NONE, MODATTR_NONE, modified_host_process_attributes, attr, modified_service_process_attributes, NULL); #endif /* update the status log with the program info */ update_program_status(FALSE); return; } /* enables passive service checks for a particular service */ void enable_passive_service_checks(service *svc) { unsigned long attr = MODATTR_PASSIVE_CHECKS_ENABLED; /* no change */ if(svc->accept_passive_checks == TRUE) return; /* set the attribute modified flag */ svc->modified_attributes |= attr; /* set the passive check flag */ svc->accept_passive_checks = TRUE; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_adaptive_service_data(NEBTYPE_ADAPTIVESERVICE_UPDATE, NEBFLAG_NONE, NEBATTR_NONE, svc, CMD_NONE, attr, svc->modified_attributes, NULL); #endif /* update the status log with the service info */ update_service_status(svc, FALSE); return; } /* disables passive service checks for a particular service */ void disable_passive_service_checks(service *svc) { unsigned long attr = MODATTR_PASSIVE_CHECKS_ENABLED; /* no change */ if(svc->accept_passive_checks == FALSE) return; /* set the attribute modified flag */ svc->modified_attributes |= attr; /* set the passive check flag */ svc->accept_passive_checks = FALSE; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_adaptive_service_data(NEBTYPE_ADAPTIVESERVICE_UPDATE, NEBFLAG_NONE, NEBATTR_NONE, svc, CMD_NONE, attr, svc->modified_attributes, NULL); #endif /* update the status log with the service info */ update_service_status(svc, FALSE); return; } /* starts executing host checks */ void start_executing_host_checks(void) { unsigned long attr = MODATTR_ACTIVE_CHECKS_ENABLED; /* bail out if we're already executing hosts */ if(execute_host_checks == TRUE) return; /* set the attribute modified flag */ modified_host_process_attributes |= attr; /* set the host check execution flag */ execute_host_checks = TRUE; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_adaptive_program_data(NEBTYPE_ADAPTIVEPROGRAM_UPDATE, NEBFLAG_NONE, NEBATTR_NONE, CMD_NONE, attr, modified_host_process_attributes, MODATTR_NONE, modified_service_process_attributes, NULL); #endif /* update the status log with the program info */ update_program_status(FALSE); return; } /* stops executing host checks */ void stop_executing_host_checks(void) { unsigned long attr = MODATTR_ACTIVE_CHECKS_ENABLED; /* bail out if we're already not executing hosts */ if(execute_host_checks == FALSE) return; /* set the attribute modified flag */ modified_host_process_attributes |= attr; /* set the host check execution flag */ execute_host_checks = FALSE; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_adaptive_program_data(NEBTYPE_ADAPTIVEPROGRAM_UPDATE, NEBFLAG_NONE, NEBATTR_NONE, CMD_NONE, attr, modified_host_process_attributes, MODATTR_NONE, modified_service_process_attributes, NULL); #endif /* update the status log with the program info */ update_program_status(FALSE); return; } /* starts accepting passive host checks */ void start_accepting_passive_host_checks(void) { unsigned long attr = MODATTR_PASSIVE_CHECKS_ENABLED; /* bail out if we're already accepting passive hosts */ if(accept_passive_host_checks == TRUE) return; /* set the attribute modified flag */ modified_host_process_attributes |= attr; /* set the host check flag */ accept_passive_host_checks = TRUE; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_adaptive_program_data(NEBTYPE_ADAPTIVEPROGRAM_UPDATE, NEBFLAG_NONE, NEBATTR_NONE, CMD_NONE, attr, modified_host_process_attributes, MODATTR_NONE, modified_service_process_attributes, NULL); #endif /* update the status log with the program info */ update_program_status(FALSE); return; } /* stops accepting passive host checks */ void stop_accepting_passive_host_checks(void) { unsigned long attr = MODATTR_PASSIVE_CHECKS_ENABLED; /* bail out if we're already not accepting passive hosts */ if(accept_passive_host_checks == FALSE) return; /* set the attribute modified flag */ modified_host_process_attributes |= attr; /* set the host check flag */ accept_passive_host_checks = FALSE; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_adaptive_program_data(NEBTYPE_ADAPTIVEPROGRAM_UPDATE, NEBFLAG_NONE, NEBATTR_NONE, CMD_NONE, attr, modified_host_process_attributes, MODATTR_NONE, modified_service_process_attributes, NULL); #endif /* update the status log with the program info */ update_program_status(FALSE); return; } /* enables passive host checks for a particular host */ void enable_passive_host_checks(host *hst) { unsigned long attr = MODATTR_PASSIVE_CHECKS_ENABLED; /* no change */ if(hst->accept_passive_checks == TRUE) return; /* set the attribute modified flag */ hst->modified_attributes |= attr; /* set the passive check flag */ hst->accept_passive_checks = TRUE; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_adaptive_host_data(NEBTYPE_ADAPTIVEHOST_UPDATE, NEBFLAG_NONE, NEBATTR_NONE, hst, CMD_NONE, attr, hst->modified_attributes, NULL); #endif /* update the status log with the host info */ update_host_status(hst, FALSE); return; } /* disables passive host checks for a particular host */ void disable_passive_host_checks(host *hst) { unsigned long attr = MODATTR_PASSIVE_CHECKS_ENABLED; /* no change */ if(hst->accept_passive_checks == FALSE) return; /* set the attribute modified flag */ hst->modified_attributes |= attr; /* set the passive check flag */ hst->accept_passive_checks = FALSE; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_adaptive_host_data(NEBTYPE_ADAPTIVEHOST_UPDATE, NEBFLAG_NONE, NEBATTR_NONE, hst, CMD_NONE, attr, hst->modified_attributes, NULL); #endif /* update the status log with the host info */ update_host_status(hst, FALSE); return; } /* enables event handlers on a program-wide basis */ void start_using_event_handlers(void) { unsigned long attr = MODATTR_EVENT_HANDLER_ENABLED; /* no change */ if(enable_event_handlers == TRUE) return; /* set the attribute modified flag */ modified_host_process_attributes |= attr; modified_service_process_attributes |= attr; /* set the event handler flag */ enable_event_handlers = TRUE; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_adaptive_program_data(NEBTYPE_ADAPTIVEPROGRAM_UPDATE, NEBFLAG_NONE, NEBATTR_NONE, CMD_NONE, attr, modified_host_process_attributes, attr, modified_service_process_attributes, NULL); #endif /* update the status log with the program info */ update_program_status(FALSE); return; } /* disables event handlers on a program-wide basis */ void stop_using_event_handlers(void) { unsigned long attr = MODATTR_EVENT_HANDLER_ENABLED; /* no change */ if(enable_event_handlers == FALSE) return; /* set the attribute modified flag */ modified_host_process_attributes |= attr; modified_service_process_attributes |= attr; /* set the event handler flag */ enable_event_handlers = FALSE; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_adaptive_program_data(NEBTYPE_ADAPTIVEPROGRAM_UPDATE, NEBFLAG_NONE, NEBATTR_NONE, CMD_NONE, attr, modified_host_process_attributes, attr, modified_service_process_attributes, NULL); #endif /* update the status log with the program info */ update_program_status(FALSE); return; } /* enables the event handler for a particular service */ void enable_service_event_handler(service *svc) { unsigned long attr = MODATTR_EVENT_HANDLER_ENABLED; /* no change */ if(svc->event_handler_enabled == TRUE) return; /* set the attribute modified flag */ svc->modified_attributes |= attr; /* set the event handler flag */ svc->event_handler_enabled = TRUE; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_adaptive_service_data(NEBTYPE_ADAPTIVESERVICE_UPDATE, NEBFLAG_NONE, NEBATTR_NONE, svc, CMD_NONE, attr, svc->modified_attributes, NULL); #endif /* update the status log with the service info */ update_service_status(svc, FALSE); return; } /* disables the event handler for a particular service */ void disable_service_event_handler(service *svc) { unsigned long attr = MODATTR_EVENT_HANDLER_ENABLED; /* no change */ if(svc->event_handler_enabled == FALSE) return; /* set the attribute modified flag */ svc->modified_attributes |= attr; /* set the event handler flag */ svc->event_handler_enabled = FALSE; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_adaptive_service_data(NEBTYPE_ADAPTIVESERVICE_UPDATE, NEBFLAG_NONE, NEBATTR_NONE, svc, CMD_NONE, attr, svc->modified_attributes, NULL); #endif /* update the status log with the service info */ update_service_status(svc, FALSE); return; } /* enables the event handler for a particular host */ void enable_host_event_handler(host *hst) { unsigned long attr = MODATTR_EVENT_HANDLER_ENABLED; /* no change */ if(hst->event_handler_enabled == TRUE) return; /* set the attribute modified flag */ hst->modified_attributes |= attr; /* set the event handler flag */ hst->event_handler_enabled = TRUE; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_adaptive_host_data(NEBTYPE_ADAPTIVEHOST_UPDATE, NEBFLAG_NONE, NEBATTR_NONE, hst, CMD_NONE, attr, hst->modified_attributes, NULL); #endif /* update the status log with the host info */ update_host_status(hst, FALSE); return; } /* disables the event handler for a particular host */ void disable_host_event_handler(host *hst) { unsigned long attr = MODATTR_EVENT_HANDLER_ENABLED; /* no change */ if(hst->event_handler_enabled == FALSE) return; /* set the attribute modified flag */ hst->modified_attributes |= attr; /* set the event handler flag */ hst->event_handler_enabled = FALSE; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_adaptive_host_data(NEBTYPE_ADAPTIVEHOST_UPDATE, NEBFLAG_NONE, NEBATTR_NONE, hst, CMD_NONE, attr, hst->modified_attributes, NULL); #endif /* update the status log with the host info */ update_host_status(hst, FALSE); return; } /* disables checks of a particular host */ void disable_host_checks(host *hst) { unsigned long attr = MODATTR_ACTIVE_CHECKS_ENABLED; /* checks are already disabled */ if(hst->checks_enabled == FALSE) return; /* set the attribute modified flag */ hst->modified_attributes |= attr; /* set the host check flag */ hst->checks_enabled = FALSE; hst->should_be_scheduled = FALSE; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_adaptive_host_data(NEBTYPE_ADAPTIVEHOST_UPDATE, NEBFLAG_NONE, NEBATTR_NONE, hst, CMD_NONE, attr, hst->modified_attributes, NULL); #endif /* update the status log with the host info */ update_host_status(hst, FALSE); return; } /* enables checks of a particular host */ void enable_host_checks(host *hst) { time_t preferred_time = 0L; time_t next_valid_time = 0L; unsigned long attr = MODATTR_ACTIVE_CHECKS_ENABLED; /* checks are already enabled */ if(hst->checks_enabled == TRUE) return; /* set the attribute modified flag */ hst->modified_attributes |= attr; /* set the host check flag */ hst->checks_enabled = TRUE; hst->should_be_scheduled = TRUE; /* hosts with no check intervals don't get checked */ if(hst->check_interval == 0) hst->should_be_scheduled = FALSE; /* schedule a check for right now (or as soon as possible) */ time(&preferred_time); if(check_time_against_period(preferred_time, hst->check_period_ptr) == ERROR) { get_next_valid_time(preferred_time, &next_valid_time, hst->check_period_ptr); hst->next_check = next_valid_time; } else hst->next_check = preferred_time; /* schedule a check if we should */ if(hst->should_be_scheduled == TRUE) schedule_host_check(hst, hst->next_check, CHECK_OPTION_NONE); #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_adaptive_host_data(NEBTYPE_ADAPTIVEHOST_UPDATE, NEBFLAG_NONE, NEBATTR_NONE, hst, CMD_NONE, attr, hst->modified_attributes, NULL); #endif /* update the status log with the host info */ update_host_status(hst, FALSE); return; } /* start obsessing over service check results */ void start_obsessing_over_service_checks(void) { unsigned long attr = MODATTR_OBSESSIVE_HANDLER_ENABLED; /* no change */ if(obsess_over_services == TRUE) return; /* set the attribute modified flag */ modified_service_process_attributes |= attr; /* set the service obsession flag */ obsess_over_services = TRUE; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_adaptive_program_data(NEBTYPE_ADAPTIVEPROGRAM_UPDATE, NEBFLAG_NONE, NEBATTR_NONE, CMD_NONE, MODATTR_NONE, modified_host_process_attributes, attr, modified_service_process_attributes, NULL); #endif /* update the status log with the program info */ update_program_status(FALSE); return; } /* stop obsessing over service check results */ void stop_obsessing_over_service_checks(void) { unsigned long attr = MODATTR_OBSESSIVE_HANDLER_ENABLED; /* no change */ if(obsess_over_services == FALSE) return; /* set the attribute modified flag */ modified_service_process_attributes |= attr; /* set the service obsession flag */ obsess_over_services = FALSE; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_adaptive_program_data(NEBTYPE_ADAPTIVEPROGRAM_UPDATE, NEBFLAG_NONE, NEBATTR_NONE, CMD_NONE, MODATTR_NONE, modified_host_process_attributes, attr, modified_service_process_attributes, NULL); #endif /* update the status log with the program info */ update_program_status(FALSE); return; } /* start obsessing over host check results */ void start_obsessing_over_host_checks(void) { unsigned long attr = MODATTR_OBSESSIVE_HANDLER_ENABLED; /* no change */ if(obsess_over_hosts == TRUE) return; /* set the attribute modified flag */ modified_host_process_attributes |= attr; /* set the host obsession flag */ obsess_over_hosts = TRUE; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_adaptive_program_data(NEBTYPE_ADAPTIVEPROGRAM_UPDATE, NEBFLAG_NONE, NEBATTR_NONE, CMD_NONE, attr, modified_host_process_attributes, MODATTR_NONE, modified_service_process_attributes, NULL); #endif /* update the status log with the program info */ update_program_status(FALSE); return; } /* stop obsessing over host check results */ void stop_obsessing_over_host_checks(void) { unsigned long attr = MODATTR_OBSESSIVE_HANDLER_ENABLED; /* no change */ if(obsess_over_hosts == FALSE) return; /* set the attribute modified flag */ modified_host_process_attributes |= attr; /* set the host obsession flag */ obsess_over_hosts = FALSE; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_adaptive_program_data(NEBTYPE_ADAPTIVEPROGRAM_UPDATE, NEBFLAG_NONE, NEBATTR_NONE, CMD_NONE, attr, modified_host_process_attributes, MODATTR_NONE, modified_service_process_attributes, NULL); #endif /* update the status log with the program info */ update_program_status(FALSE); return; } /* enables service freshness checking */ void enable_service_freshness_checks(void) { unsigned long attr = MODATTR_FRESHNESS_CHECKS_ENABLED; /* no change */ if(check_service_freshness == TRUE) return; /* set the attribute modified flag */ modified_service_process_attributes |= attr; /* set the freshness check flag */ check_service_freshness = TRUE; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_adaptive_program_data(NEBTYPE_ADAPTIVEPROGRAM_UPDATE, NEBFLAG_NONE, NEBATTR_NONE, CMD_NONE, MODATTR_NONE, modified_host_process_attributes, attr, modified_service_process_attributes, NULL); #endif /* update the status log with the program info */ update_program_status(FALSE); return; } /* disables service freshness checking */ void disable_service_freshness_checks(void) { unsigned long attr = MODATTR_FRESHNESS_CHECKS_ENABLED; /* no change */ if(check_service_freshness == FALSE) return; /* set the attribute modified flag */ modified_service_process_attributes |= attr; /* set the freshness check flag */ check_service_freshness = FALSE; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_adaptive_program_data(NEBTYPE_ADAPTIVEPROGRAM_UPDATE, NEBFLAG_NONE, NEBATTR_NONE, CMD_NONE, MODATTR_NONE, modified_host_process_attributes, attr, modified_service_process_attributes, NULL); #endif /* update the status log with the program info */ update_program_status(FALSE); return; } /* enables host freshness checking */ void enable_host_freshness_checks(void) { unsigned long attr = MODATTR_FRESHNESS_CHECKS_ENABLED; /* no change */ if(check_host_freshness == TRUE) return; /* set the attribute modified flag */ modified_host_process_attributes |= attr; /* set the freshness check flag */ check_host_freshness = TRUE; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_adaptive_program_data(NEBTYPE_ADAPTIVEPROGRAM_UPDATE, NEBFLAG_NONE, NEBATTR_NONE, CMD_NONE, attr, modified_host_process_attributes, MODATTR_NONE, modified_service_process_attributes, NULL); #endif /* update the status log with the program info */ update_program_status(FALSE); return; } /* disables host freshness checking */ void disable_host_freshness_checks(void) { unsigned long attr = MODATTR_FRESHNESS_CHECKS_ENABLED; /* no change */ if(check_host_freshness == FALSE) return; /* set the attribute modified flag */ modified_host_process_attributes |= attr; /* set the freshness check flag */ check_host_freshness = FALSE; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_adaptive_program_data(NEBTYPE_ADAPTIVEPROGRAM_UPDATE, NEBFLAG_NONE, NEBATTR_NONE, CMD_NONE, attr, modified_host_process_attributes, MODATTR_NONE, modified_service_process_attributes, NULL); #endif /* update the status log with the program info */ update_program_status(FALSE); return; } /* enable performance data on a program-wide basis */ void enable_performance_data(void) { unsigned long attr = MODATTR_PERFORMANCE_DATA_ENABLED; /* bail out if we're already set... */ if(process_performance_data == TRUE) return; /* set the attribute modified flag */ modified_host_process_attributes |= attr; modified_service_process_attributes |= attr; process_performance_data = TRUE; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_adaptive_program_data(NEBTYPE_ADAPTIVEPROGRAM_UPDATE, NEBFLAG_NONE, NEBATTR_NONE, CMD_NONE, attr, modified_host_process_attributes, attr, modified_service_process_attributes, NULL); #endif /* update the status log */ update_program_status(FALSE); return; } /* disable performance data on a program-wide basis */ void disable_performance_data(void) { unsigned long attr = MODATTR_PERFORMANCE_DATA_ENABLED; # /* bail out if we're already set... */ if(process_performance_data == FALSE) return; /* set the attribute modified flag */ modified_host_process_attributes |= attr; modified_service_process_attributes |= attr; process_performance_data = FALSE; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_adaptive_program_data(NEBTYPE_ADAPTIVEPROGRAM_UPDATE, NEBFLAG_NONE, NEBATTR_NONE, CMD_NONE, attr, modified_host_process_attributes, attr, modified_service_process_attributes, NULL); #endif /* update the status log */ update_program_status(FALSE); return; } /* start obsessing over a particular service */ void start_obsessing_over_service(service *svc) { unsigned long attr = MODATTR_OBSESSIVE_HANDLER_ENABLED; /* no change */ if(svc->obsess == TRUE) return; /* set the attribute modified flag */ svc->modified_attributes |= attr; /* set the obsess over service flag */ svc->obsess = TRUE; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_adaptive_service_data(NEBTYPE_ADAPTIVESERVICE_UPDATE, NEBFLAG_NONE, NEBATTR_NONE, svc, CMD_NONE, attr, svc->modified_attributes, NULL); #endif /* update the status log with the service info */ update_service_status(svc, FALSE); return; } /* stop obsessing over a particular service */ void stop_obsessing_over_service(service *svc) { unsigned long attr = MODATTR_OBSESSIVE_HANDLER_ENABLED; /* no change */ if(svc->obsess == FALSE) return; /* set the attribute modified flag */ svc->modified_attributes |= attr; /* set the obsess over service flag */ svc->obsess = FALSE; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_adaptive_service_data(NEBTYPE_ADAPTIVESERVICE_UPDATE, NEBFLAG_NONE, NEBATTR_NONE, svc, CMD_NONE, attr, svc->modified_attributes, NULL); #endif /* update the status log with the service info */ update_service_status(svc, FALSE); return; } /* start obsessing over a particular host */ void start_obsessing_over_host(host *hst) { unsigned long attr = MODATTR_OBSESSIVE_HANDLER_ENABLED; /* no change */ if(hst->obsess == TRUE) return; /* set the attribute modified flag */ hst->modified_attributes |= attr; /* set the obsess flag */ hst->obsess = TRUE; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_adaptive_host_data(NEBTYPE_ADAPTIVEHOST_UPDATE, NEBFLAG_NONE, NEBATTR_NONE, hst, CMD_NONE, attr, hst->modified_attributes, NULL); #endif /* update the status log with the host info */ update_host_status(hst, FALSE); return; } /* stop obsessing over a particular host */ void stop_obsessing_over_host(host *hst) { unsigned long attr = MODATTR_OBSESSIVE_HANDLER_ENABLED; /* no change */ if(hst->obsess == FALSE) return; /* set the attribute modified flag */ hst->modified_attributes |= attr; /* set the obsess over host flag */ hst->obsess = FALSE; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_adaptive_host_data(NEBTYPE_ADAPTIVEHOST_UPDATE, NEBFLAG_NONE, NEBATTR_NONE, hst, CMD_NONE, attr, hst->modified_attributes, NULL); #endif /* update the status log with the host info */ update_host_status(hst, FALSE); return; } /* sets the current notification number for a specific host */ void set_host_notification_number(host *hst, int num) { /* set the notification number */ hst->current_notification_number = num; /* update the status log with the host info */ update_host_status(hst, FALSE); return; } /* sets the current notification number for a specific service */ void set_service_notification_number(service *svc, int num) { /* set the notification number */ svc->current_notification_number = num; /* update the status log with the service info */ update_service_status(svc, FALSE); return; } /* clears the flapping state for a specific host */ void clear_host_flapping_state(host *hst) { int i; double low_threshold = 0.0; double high_threshold = 0.0; if (enable_flap_detection == FALSE || hst->flap_detection_enabled == FALSE) return; low_threshold = (hst->low_flap_threshold <= 0.0) ? low_host_flap_threshold : hst->low_flap_threshold; high_threshold = (hst->high_flap_threshold <= 0.0) ? high_host_flap_threshold : hst->high_flap_threshold; for (i = 0; i < MAX_STATE_HISTORY_ENTRIES; ++i) hst->state_history[i] = 0; /* clear the history */ hst->state_history_index = 0; hst->percent_state_change = 0.0; if(hst->flapping_comment_id != 0) /* delete the comment we added earlier */ delete_host_comment(hst->flapping_comment_id); hst->flapping_comment_id = 0; hst->is_flapping = FALSE; /* clear the flapping indicator */ if (hst->is_flapping) { log_debug_info(DEBUGL_FLAPPING, 1, "Host '%s' flapping state cleared.\n", hst->name); /* log a notice - this one is parsed by the history CGI */ logit(NSLOG_INFO_MESSAGE, FALSE, "HOST FLAPPING ALERT: %s;STOPPED; Flapping state cleared for host. (%2.1f%% change < %2.1f%% threshold)\n", hst->name, hst->percent_state_change, low_threshold); #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_flapping_data(NEBTYPE_FLAPPING_STOP, NEBFLAG_NONE, NEBATTR_FLAPPING_STOP_NORMAL, HOST_FLAPPING, hst, hst->percent_state_change, high_threshold, low_threshold, NULL); #endif /* send a notification */ host_notification(hst, NOTIFICATION_FLAPPINGSTOP, NULL, NULL, NOTIFICATION_OPTION_NONE); /* should we send a recovery notification? */ if(hst->check_flapping_recovery_notification == TRUE && hst->current_state == HOST_UP) host_notification(hst, NOTIFICATION_NORMAL, NULL, NULL, NOTIFICATION_OPTION_NONE); } /* clear the recovery notification flag */ hst->check_flapping_recovery_notification = FALSE; } /* clears the flapping state for a specific service */ void clear_service_flapping_state(service *svc) { int i; double low_threshold = 0.0; double high_threshold = 0.0; if (enable_flap_detection == FALSE || svc->flap_detection_enabled == FALSE) return; low_threshold = (svc->low_flap_threshold <= 0.0) ? low_service_flap_threshold : svc->low_flap_threshold; high_threshold = (svc->high_flap_threshold <= 0.0) ? high_service_flap_threshold : svc->high_flap_threshold; for (i = 0; i < MAX_STATE_HISTORY_ENTRIES; ++i) svc->state_history[i] = 0; /* clear the history */ svc->state_history_index = 0; svc->percent_state_change = 0.0; if(svc->flapping_comment_id != 0) /* delete the comment we added earlier */ delete_service_comment(svc->flapping_comment_id); svc->flapping_comment_id = 0; svc->is_flapping = FALSE; /* clear the flapping indicator */ if (svc->is_flapping) { log_debug_info(DEBUGL_FLAPPING, 1, "Service '%s' on host '%s' flapping state cleared.\n", svc->description, svc->host_name); /* log a notice - this one is parsed by the history CGI */ logit(NSLOG_INFO_MESSAGE, FALSE, "SERVICE FLAPPING ALERT: %s;%s;STOPPED; Flapping state cleared for service. (%2.1f%% change < %2.1f%% threshold)\n", svc->host_name, svc->description, svc->percent_state_change, low_threshold); #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_flapping_data(NEBTYPE_FLAPPING_STOP, NEBFLAG_NONE, NEBATTR_FLAPPING_STOP_NORMAL, SERVICE_FLAPPING, svc, svc->percent_state_change, high_threshold, low_threshold, NULL); #endif /* send a notification */ service_notification(svc, NOTIFICATION_FLAPPINGSTOP, NULL, NULL, NOTIFICATION_OPTION_NONE); /* should we send a recovery notification? */ if(svc->check_flapping_recovery_notification == TRUE && svc->current_state == STATE_OK) service_notification(svc, NOTIFICATION_NORMAL, NULL, NULL, NOTIFICATION_OPTION_NONE); } /* clear the recovery notification flag */ svc->check_flapping_recovery_notification = FALSE; } nagios-4.3.4/base/config.c000066400000000000000000002152341314764422400153430ustar00rootroot00000000000000/***************************************************************************** * * CONFIG.C - Configuration input and verification routines for Nagios * * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #include "../include/config.h" #include "../include/common.h" #include "../include/objects.h" #include "../include/macros.h" #include "../include/nagios.h" #include "../include/broker.h" #include "../include/nebmods.h" #include "../include/nebmodules.h" /*** helpers ****/ /* * find a command with arguments still attached * if we're unsuccessful, the buffer pointed to by 'name' is modified * to have only the real command name (everything up until the first '!') */ static command *find_bang_command(char *name) { char *bang; command *cmd; if (!name) return NULL; bang = strchr(name, '!'); if (!bang) return find_command(name); *bang = 0; cmd = find_command(name); *bang = '!'; return cmd; } /******************************************************************/ /************** CONFIGURATION INPUT FUNCTIONS *********************/ /******************************************************************/ /* read all configuration data */ int read_all_object_data(char *main_config_file) { int result = OK; int options = 0; options = READ_ALL_OBJECT_DATA; /* read in all host configuration data from external sources */ result = read_object_config_data(main_config_file, options); if(result != OK) return ERROR; return OK; } static objectlist *deprecated = NULL; static void obsoleted_warning(const char *key, const char *msg) { char *buf; asprintf(&buf, "Warning: %s is deprecated and will be removed.%s%s\n", key, msg ? " " : "", msg ? msg : ""); if (!buf) return; prepend_object_to_objectlist(&deprecated, buf); } /* process the main configuration file */ int read_main_config_file(char *main_config_file) { char *input = NULL; char *variable = NULL; char *value = NULL; char *error_message = NULL; char *temp_ptr = NULL; mmapfile *thefile = NULL; int current_line = 0; int error = FALSE; char *modptr = NULL; char *argptr = NULL; DIR *tmpdir = NULL; nagios_macros *mac; objectlist *list; mac = get_global_macros(); /* open the config file for reading */ if((thefile = mmap_fopen(main_config_file)) == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Cannot open main configuration file '%s' for reading!", main_config_file); exit(ERROR); } /* save the main config file macro */ my_free(mac->x[MACRO_MAINCONFIGFILE]); if((mac->x[MACRO_MAINCONFIGFILE] = (char *)strdup(main_config_file))) strip(mac->x[MACRO_MAINCONFIGFILE]); /* process all lines in the config file */ while(1) { /* free memory */ my_free(input); my_free(variable); my_free(value); /* read the next line */ if((input = mmap_fgets_multiline(thefile)) == NULL) break; current_line = thefile->current_line; strip(input); /* skip blank lines and comments */ if(input[0] == '\x0' || input[0] == '#') continue; /* get the variable name */ if((temp_ptr = my_strtok(input, "=")) == NULL) { asprintf(&error_message, "NULL variable"); error = TRUE; break; } if((variable = (char *)strdup(temp_ptr)) == NULL) { asprintf(&error_message, "malloc() error"); error = TRUE; break; } /* get the value */ if((temp_ptr = my_strtok(NULL, "\n")) == NULL) { asprintf(&error_message, "NULL value"); error = TRUE; break; } if((value = (char *)strdup(temp_ptr)) == NULL) { asprintf(&error_message, "malloc() error"); error = TRUE; break; } strip(variable); strip(value); /* process the variable/value */ if(!strcmp(variable, "resource_file")) { /* save the macro */ my_free(mac->x[MACRO_RESOURCEFILE]); mac->x[MACRO_RESOURCEFILE] = nspath_absolute(value, config_file_dir); /* process the resource file */ if(read_resource_file(mac->x[MACRO_RESOURCEFILE]) == ERROR) { error = TRUE; } } else if(!strcmp(variable, "website_url")) { my_free(website_url); website_url = strdup(value); } else if(!strcmp(variable, "loadctl_options")) error = set_loadctl_options(value, strlen(value)) != OK; else if(!strcmp(variable, "check_workers")) num_check_workers = atoi(value); else if(!strcmp(variable, "query_socket")) { my_free(qh_socket_path); qh_socket_path = nspath_absolute(value, config_file_dir); } else if(!strcmp(variable, "log_file")) { if(strlen(value) > MAX_FILENAME_LENGTH - 1) { asprintf(&error_message, "Log file is too long"); error = TRUE; break; } my_free(log_file); log_file = nspath_absolute(value, config_file_dir); /* make sure the configured logfile takes effect */ close_log_file(); } else if(!strcmp(variable, "debug_level")) debug_level = atoi(value); else if(!strcmp(variable, "debug_verbosity")) debug_verbosity = atoi(value); else if(!strcmp(variable, "debug_file")) { if(strlen(value) > MAX_FILENAME_LENGTH - 1) { asprintf(&error_message, "Debug log file is too long"); error = TRUE; break; } my_free(debug_file); debug_file = nspath_absolute(value, config_file_dir); } else if(!strcmp(variable, "max_debug_file_size")) max_debug_file_size = strtoul(value, NULL, 0); else if(!strcmp(variable, "command_file")) { if(strlen(value) > MAX_FILENAME_LENGTH - 1) { asprintf(&error_message, "Command file is too long"); error = TRUE; break; } my_free(command_file); command_file = nspath_absolute(value, config_file_dir); /* save the macro */ mac->x[MACRO_COMMANDFILE] = command_file; } else if(!strcmp(variable, "temp_file")) { my_free(temp_file); temp_file = strdup(value); } else if(!strcmp(variable, "temp_path")) { my_free(temp_path); temp_path = nspath_absolute(value, config_file_dir); } else if(!strcmp(variable, "check_result_path")) { if(strlen(value) > MAX_FILENAME_LENGTH - 1) { asprintf(&error_message, "Check result path is too long"); error = TRUE; break; } my_free(check_result_path); check_result_path = nspath_absolute(value, config_file_dir); /* make sure we don't have a trailing slash */ if(check_result_path[strlen(check_result_path) - 1] == '/') check_result_path[strlen(check_result_path) - 1] = '\x0'; if((tmpdir = opendir(check_result_path)) == NULL) { asprintf(&error_message, "Check result path '%s' is not a valid directory", check_result_path); error = TRUE; break; } closedir(tmpdir); } else if(!strcmp(variable, "max_check_result_file_age")) max_check_result_file_age = strtoul(value, NULL, 0); else if(!strcmp(variable, "lock_file")) { if(strlen(value) > MAX_FILENAME_LENGTH - 1) { asprintf(&error_message, "Lock file is too long"); error = TRUE; break; } my_free(lock_file); lock_file = nspath_absolute(value, config_file_dir); } else if(!strcmp(variable, "global_host_event_handler")) { my_free(global_host_event_handler); global_host_event_handler = (char *)strdup(value); } else if(!strcmp(variable, "global_service_event_handler")) { my_free(global_service_event_handler); global_service_event_handler = (char *)strdup(value); } else if(!strcmp(variable, "ocsp_command")) { my_free(ocsp_command); ocsp_command = (char *)strdup(value); } else if(!strcmp(variable, "ochp_command")) { my_free(ochp_command); ochp_command = (char *)strdup(value); } else if(!strcmp(variable, "nagios_user")) { my_free(nagios_user); nagios_user = (char *)strdup(value); } else if(!strcmp(variable, "nagios_group")) { my_free(nagios_group); nagios_group = (char *)strdup(value); } else if(!strcmp(variable, "admin_email")) { /* save the macro */ my_free(mac->x[MACRO_ADMINEMAIL]); mac->x[MACRO_ADMINEMAIL] = (char *)strdup(value); } else if(!strcmp(variable, "admin_pager")) { /* save the macro */ my_free(mac->x[MACRO_ADMINPAGER]); mac->x[MACRO_ADMINPAGER] = (char *)strdup(value); } else if(!strcmp(variable, "use_syslog")) { if(strlen(value) != 1 || value[0] < '0' || value[0] > '1') { asprintf(&error_message, "Illegal value for use_syslog"); error = TRUE; break; } use_syslog = (atoi(value) > 0) ? TRUE : FALSE; } else if(!strcmp(variable, "log_notifications")) { if(strlen(value) != 1 || value[0] < '0' || value[0] > '1') { asprintf(&error_message, "Illegal value for log_notifications"); error = TRUE; break; } log_notifications = (atoi(value) > 0) ? TRUE : FALSE; } else if(!strcmp(variable, "log_service_retries")) { if(strlen(value) != 1 || value[0] < '0' || value[0] > '1') { asprintf(&error_message, "Illegal value for log_service_retries"); error = TRUE; break; } log_service_retries = (atoi(value) > 0) ? TRUE : FALSE; } else if(!strcmp(variable, "log_host_retries")) { if(strlen(value) != 1 || value[0] < '0' || value[0] > '1') { asprintf(&error_message, "Illegal value for log_host_retries"); error = TRUE; break; } log_host_retries = (atoi(value) > 0) ? TRUE : FALSE; } else if(!strcmp(variable, "log_event_handlers")) { if(strlen(value) != 1 || value[0] < '0' || value[0] > '1') { asprintf(&error_message, "Illegal value for log_event_handlers"); error = TRUE; break; } log_event_handlers = (atoi(value) > 0) ? TRUE : FALSE; } else if(!strcmp(variable, "log_external_commands")) { if(strlen(value) != 1 || value[0] < '0' || value[0] > '1') { asprintf(&error_message, "Illegal value for log_external_commands"); error = TRUE; break; } log_external_commands = (atoi(value) > 0) ? TRUE : FALSE; } else if(!strcmp(variable, "log_passive_checks")) { if(strlen(value) != 1 || value[0] < '0' || value[0] > '1') { asprintf(&error_message, "Illegal value for log_passive_checks"); error = TRUE; break; } log_passive_checks = (atoi(value) > 0) ? TRUE : FALSE; } else if(!strcmp(variable, "log_initial_states")) { if(strlen(value) != 1 || value[0] < '0' || value[0] > '1') { asprintf(&error_message, "Illegal value for log_initial_states"); error = TRUE; break; } log_initial_states = (atoi(value) > 0) ? TRUE : FALSE; } else if(!strcmp(variable, "log_current_states")) { if(strlen(value) != 1 || value[0] < '0' || value[0] > '1') { asprintf(&error_message, "Illegal value for log_current_states"); error = TRUE; break; } log_current_states = (atoi(value) > 0) ? TRUE : FALSE; } else if(!strcmp(variable, "retain_state_information")) { if(strlen(value) != 1 || value[0] < '0' || value[0] > '1') { asprintf(&error_message, "Illegal value for retain_state_information"); error = TRUE; break; } retain_state_information = (atoi(value) > 0) ? TRUE : FALSE; } else if(!strcmp(variable, "retention_update_interval")) { retention_update_interval = atoi(value); if(retention_update_interval < 0) { asprintf(&error_message, "Illegal value for retention_update_interval"); error = TRUE; break; } } else if(!strcmp(variable, "use_retained_program_state")) { if(strlen(value) != 1 || value[0] < '0' || value[0] > '1') { asprintf(&error_message, "Illegal value for use_retained_program_state"); error = TRUE; break; } use_retained_program_state = (atoi(value) > 0) ? TRUE : FALSE; } else if(!strcmp(variable, "use_retained_scheduling_info")) { if(strlen(value) != 1 || value[0] < '0' || value[0] > '1') { asprintf(&error_message, "Illegal value for use_retained_scheduling_info"); error = TRUE; break; } use_retained_scheduling_info = (atoi(value) > 0) ? TRUE : FALSE; } else if(!strcmp(variable, "retention_scheduling_horizon")) { retention_scheduling_horizon = atoi(value); if(retention_scheduling_horizon <= 0) { asprintf(&error_message, "Illegal value for retention_scheduling_horizon"); error = TRUE; break; } } else if(!strcmp(variable, "additional_freshness_latency")) additional_freshness_latency = atoi(value); else if(!strcmp(variable, "retained_host_attribute_mask")) retained_host_attribute_mask = strtoul(value, NULL, 0); else if(!strcmp(variable, "retained_service_attribute_mask")) retained_service_attribute_mask = strtoul(value, NULL, 0); else if(!strcmp(variable, "retained_process_host_attribute_mask")) retained_process_host_attribute_mask = strtoul(value, NULL, 0); else if(!strcmp(variable, "retained_process_service_attribute_mask")) retained_process_service_attribute_mask = strtoul(value, NULL, 0); else if(!strcmp(variable, "retained_contact_host_attribute_mask")) retained_contact_host_attribute_mask = strtoul(value, NULL, 0); else if(!strcmp(variable, "retained_contact_service_attribute_mask")) retained_contact_service_attribute_mask = strtoul(value, NULL, 0); else if(!strcmp(variable, "obsess_over_services")) { if(strlen(value) != 1 || value[0] < '0' || value[0] > '1') { asprintf(&error_message, "Illegal value for obsess_over_services"); error = TRUE; break; } obsess_over_services = (atoi(value) > 0) ? TRUE : FALSE; } else if(!strcmp(variable, "obsess_over_hosts")) { if(strlen(value) != 1 || value[0] < '0' || value[0] > '1') { asprintf(&error_message, "Illegal value for obsess_over_hosts"); error = TRUE; break; } obsess_over_hosts = (atoi(value) > 0) ? TRUE : FALSE; } else if(!strcmp(variable, "translate_passive_host_checks")) { if(strlen(value) != 1 || value[0] < '0' || value[0] > '1') { asprintf(&error_message, "Illegal value for translate_passive_host_checks"); error = TRUE; break; } translate_passive_host_checks = (atoi(value) > 0) ? TRUE : FALSE; } else if(!strcmp(variable, "passive_host_checks_are_soft")) passive_host_checks_are_soft = (atoi(value) > 0) ? TRUE : FALSE; else if(!strcmp(variable, "service_check_timeout")) { service_check_timeout = atoi(value); if(service_check_timeout <= 0) { asprintf(&error_message, "Illegal value for service_check_timeout"); error = TRUE; break; } } else if(!strcmp(variable,"service_check_timeout_state")){ if(!strcmp(value,"o")) service_check_timeout_state=STATE_OK; else if(!strcmp(value,"w")) service_check_timeout_state=STATE_WARNING; else if(!strcmp(value,"c")) service_check_timeout_state=STATE_CRITICAL; else if(!strcmp(value,"u")) service_check_timeout_state=STATE_UNKNOWN; else{ asprintf(&error_message,"Illegal value for service_check_timeout_state"); error=TRUE; break; } } else if(!strcmp(variable, "host_check_timeout")) { host_check_timeout = atoi(value); if(host_check_timeout <= 0) { asprintf(&error_message, "Illegal value for host_check_timeout"); error = TRUE; break; } } else if(!strcmp(variable, "event_handler_timeout")) { event_handler_timeout = atoi(value); if(event_handler_timeout <= 0) { asprintf(&error_message, "Illegal value for event_handler_timeout"); error = TRUE; break; } } else if(!strcmp(variable, "notification_timeout")) { notification_timeout = atoi(value); if(notification_timeout <= 0) { asprintf(&error_message, "Illegal value for notification_timeout"); error = TRUE; break; } } else if(!strcmp(variable, "ocsp_timeout")) { ocsp_timeout = atoi(value); if(ocsp_timeout <= 0) { asprintf(&error_message, "Illegal value for ocsp_timeout"); error = TRUE; break; } } else if(!strcmp(variable, "ochp_timeout")) { ochp_timeout = atoi(value); if(ochp_timeout <= 0) { asprintf(&error_message, "Illegal value for ochp_timeout"); error = TRUE; break; } } else if(!strcmp(variable, "use_agressive_host_checking") || !strcmp(variable, "use_aggressive_host_checking")) { if(strlen(value) != 1 || value[0] < '0' || value[0] > '1') { asprintf(&error_message, "Illegal value for use_aggressive_host_checking"); error = TRUE; break; } use_aggressive_host_checking = (atoi(value) > 0) ? TRUE : FALSE; } else if(!strcmp(variable, "cached_host_check_horizon")) cached_host_check_horizon = strtoul(value, NULL, 0); else if(!strcmp(variable, "enable_predictive_host_dependency_checks")) enable_predictive_host_dependency_checks = (atoi(value) > 0) ? TRUE : FALSE; else if(!strcmp(variable, "cached_service_check_horizon")) cached_service_check_horizon = strtoul(value, NULL, 0); else if(!strcmp(variable, "enable_predictive_service_dependency_checks")) enable_predictive_service_dependency_checks = (atoi(value) > 0) ? TRUE : FALSE; else if(!strcmp(variable, "soft_state_dependencies")) { if(strlen(value) != 1 || value[0] < '0' || value[0] > '1') { asprintf(&error_message, "Illegal value for soft_state_dependencies"); error = TRUE; break; } soft_state_dependencies = (atoi(value) > 0) ? TRUE : FALSE; } else if(!strcmp(variable, "log_rotation_method")) { if(!strcmp(value, "n")) log_rotation_method = LOG_ROTATION_NONE; else if(!strcmp(value, "h")) log_rotation_method = LOG_ROTATION_HOURLY; else if(!strcmp(value, "d")) log_rotation_method = LOG_ROTATION_DAILY; else if(!strcmp(value, "w")) log_rotation_method = LOG_ROTATION_WEEKLY; else if(!strcmp(value, "m")) log_rotation_method = LOG_ROTATION_MONTHLY; else { asprintf(&error_message, "Illegal value for log_rotation_method"); error = TRUE; break; } } else if(!strcmp(variable, "log_archive_path")) { if(strlen(value) > MAX_FILENAME_LENGTH - 1) { asprintf(&error_message, "Log archive path too long"); error = TRUE; break; } my_free(log_archive_path); log_archive_path = nspath_absolute(value, config_file_dir); } else if(!strcmp(variable, "enable_event_handlers")) enable_event_handlers = (atoi(value) > 0) ? TRUE : FALSE; else if(!strcmp(variable, "enable_notifications")) enable_notifications = (atoi(value) > 0) ? TRUE : FALSE; else if(!strcmp(variable, "execute_service_checks")) execute_service_checks = (atoi(value) > 0) ? TRUE : FALSE; else if(!strcmp(variable, "accept_passive_service_checks")) accept_passive_service_checks = (atoi(value) > 0) ? TRUE : FALSE; else if(!strcmp(variable, "execute_host_checks")) execute_host_checks = (atoi(value) > 0) ? TRUE : FALSE; else if(!strcmp(variable, "accept_passive_host_checks")) accept_passive_host_checks = (atoi(value) > 0) ? TRUE : FALSE; else if(!strcmp(variable, "service_inter_check_delay_method")) { if(!strcmp(value, "n")) service_inter_check_delay_method = ICD_NONE; else if(!strcmp(value, "d")) service_inter_check_delay_method = ICD_DUMB; else if(!strcmp(value, "s")) service_inter_check_delay_method = ICD_SMART; else { service_inter_check_delay_method = ICD_USER; scheduling_info.service_inter_check_delay = strtod(value, NULL); if(scheduling_info.service_inter_check_delay <= 0.0) { asprintf(&error_message, "Illegal value for service_inter_check_delay_method"); error = TRUE; break; } } } else if(!strcmp(variable, "max_service_check_spread")) { strip(value); max_service_check_spread = atoi(value); if(max_service_check_spread < 1) { asprintf(&error_message, "Illegal value for max_service_check_spread"); error = TRUE; break; } } else if(!strcmp(variable, "host_inter_check_delay_method")) { if(!strcmp(value, "n")) host_inter_check_delay_method = ICD_NONE; else if(!strcmp(value, "d")) host_inter_check_delay_method = ICD_DUMB; else if(!strcmp(value, "s")) host_inter_check_delay_method = ICD_SMART; else { host_inter_check_delay_method = ICD_USER; scheduling_info.host_inter_check_delay = strtod(value, NULL); if(scheduling_info.host_inter_check_delay <= 0.0) { asprintf(&error_message, "Illegal value for host_inter_check_delay_method"); error = TRUE; break; } } } else if(!strcmp(variable, "max_host_check_spread")) { max_host_check_spread = atoi(value); if(max_host_check_spread < 1) { asprintf(&error_message, "Illegal value for max_host_check_spread"); error = TRUE; break; } } else if(!strcmp(variable, "service_interleave_factor")) { if(!strcmp(value, "s")) service_interleave_factor_method = ILF_SMART; else { service_interleave_factor_method = ILF_USER; scheduling_info.service_interleave_factor = atoi(value); if(scheduling_info.service_interleave_factor < 1) scheduling_info.service_interleave_factor = 1; } } else if(!strcmp(variable, "max_concurrent_checks")) { max_parallel_service_checks = atoi(value); if(max_parallel_service_checks < 0) { asprintf(&error_message, "Illegal value for max_concurrent_checks"); error = TRUE; break; } } else if(!strcmp(variable, "check_result_reaper_frequency") || !strcmp(variable, "service_reaper_frequency")) { check_reaper_interval = atoi(value); if(check_reaper_interval < 1) { asprintf(&error_message, "Illegal value for check_result_reaper_frequency"); error = TRUE; break; } } else if(!strcmp(variable, "max_check_result_reaper_time")) { max_check_reaper_time = atoi(value); if(max_check_reaper_time < 1) { asprintf(&error_message, "Illegal value for max_check_result_reaper_time"); error = TRUE; break; } } else if(!strcmp(variable, "sleep_time")) { obsoleted_warning(variable, NULL); } else if(!strcmp(variable, "interval_length")) { interval_length = atoi(value); if(interval_length < 1) { asprintf(&error_message, "Illegal value for interval_length"); error = TRUE; break; } } else if(!strcmp(variable, "check_external_commands")) { if(strlen(value) != 1 || value[0] < '0' || value[0] > '1') { asprintf(&error_message, "Illegal value for check_external_commands"); error = TRUE; break; } check_external_commands = (atoi(value) > 0) ? TRUE : FALSE; } /* @todo Remove before Nagios 4.3 */ else if(!strcmp(variable, "command_check_interval")) { obsoleted_warning(variable, "Commands are always handled on arrival"); } else if(!strcmp(variable, "check_for_orphaned_services")) { if(strlen(value) != 1 || value[0] < '0' || value[0] > '1') { asprintf(&error_message, "Illegal value for check_for_orphaned_services"); error = TRUE; break; } check_orphaned_services = (atoi(value) > 0) ? TRUE : FALSE; } else if(!strcmp(variable, "check_for_orphaned_hosts")) { if(strlen(value) != 1 || value[0] < '0' || value[0] > '1') { asprintf(&error_message, "Illegal value for check_for_orphaned_hosts"); error = TRUE; break; } check_orphaned_hosts = (atoi(value) > 0) ? TRUE : FALSE; } else if(!strcmp(variable, "check_service_freshness")) { if(strlen(value) != 1 || value[0] < '0' || value[0] > '1') { asprintf(&error_message, "Illegal value for check_service_freshness"); error = TRUE; break; } check_service_freshness = (atoi(value) > 0) ? TRUE : FALSE; } else if(!strcmp(variable, "check_host_freshness")) { if(strlen(value) != 1 || value[0] < '0' || value[0] > '1') { asprintf(&error_message, "Illegal value for check_host_freshness"); error = TRUE; break; } check_host_freshness = (atoi(value) > 0) ? TRUE : FALSE; } else if(!strcmp(variable, "service_freshness_check_interval") || !strcmp(variable, "freshness_check_interval")) { service_freshness_check_interval = atoi(value); if(service_freshness_check_interval <= 0) { asprintf(&error_message, "Illegal value for service_freshness_check_interval"); error = TRUE; break; } } else if(!strcmp(variable, "host_freshness_check_interval")) { host_freshness_check_interval = atoi(value); if(host_freshness_check_interval <= 0) { asprintf(&error_message, "Illegal value for host_freshness_check_interval"); error = TRUE; break; } } else if(!strcmp(variable, "auto_reschedule_checks")) { if(strlen(value) != 1 || value[0] < '0' || value[0] > '1') { asprintf(&error_message, "Illegal value for auto_reschedule_checks"); error = TRUE; break; } auto_reschedule_checks = (atoi(value) > 0) ? TRUE : FALSE; } else if(!strcmp(variable, "auto_rescheduling_interval")) { auto_rescheduling_interval = atoi(value); if(auto_rescheduling_interval <= 0) { asprintf(&error_message, "Illegal value for auto_rescheduling_interval"); error = TRUE; break; } } else if(!strcmp(variable, "auto_rescheduling_window")) { auto_rescheduling_window = atoi(value); if(auto_rescheduling_window <= 0) { asprintf(&error_message, "Illegal value for auto_rescheduling_window"); error = TRUE; break; } } else if(!strcmp(variable, "status_update_interval")) { status_update_interval = atoi(value); if(status_update_interval < 1) { asprintf(&error_message, "Illegal value for status_update_interval"); error = TRUE; break; } } else if(!strcmp(variable, "time_change_threshold")) { time_change_threshold = atoi(value); if(time_change_threshold <= 5) { asprintf(&error_message, "Illegal value for time_change_threshold"); error = TRUE; break; } } else if(!strcmp(variable, "process_performance_data")) process_performance_data = (atoi(value) > 0) ? TRUE : FALSE; else if(!strcmp(variable, "enable_flap_detection")) enable_flap_detection = (atoi(value) > 0) ? TRUE : FALSE; else if(!strcmp(variable, "enable_failure_prediction")) obsoleted_warning(variable, NULL); else if(!strcmp(variable, "low_service_flap_threshold")) { low_service_flap_threshold = strtod(value, NULL); if(low_service_flap_threshold <= 0.0 || low_service_flap_threshold >= 100.0) { asprintf(&error_message, "Illegal value for low_service_flap_threshold"); error = TRUE; break; } } else if(!strcmp(variable, "high_service_flap_threshold")) { high_service_flap_threshold = strtod(value, NULL); if(high_service_flap_threshold <= 0.0 || high_service_flap_threshold > 100.0) { asprintf(&error_message, "Illegal value for high_service_flap_threshold"); error = TRUE; break; } } else if(!strcmp(variable, "low_host_flap_threshold")) { low_host_flap_threshold = strtod(value, NULL); if(low_host_flap_threshold <= 0.0 || low_host_flap_threshold >= 100.0) { asprintf(&error_message, "Illegal value for low_host_flap_threshold"); error = TRUE; break; } } else if(!strcmp(variable, "high_host_flap_threshold")) { high_host_flap_threshold = strtod(value, NULL); if(high_host_flap_threshold <= 0.0 || high_host_flap_threshold > 100.0) { asprintf(&error_message, "Illegal value for high_host_flap_threshold"); error = TRUE; break; } } else if(!strcmp(variable, "date_format")) { if(!strcmp(value, "euro")) date_format = DATE_FORMAT_EURO; else if(!strcmp(value, "iso8601")) date_format = DATE_FORMAT_ISO8601; else if(!strcmp(value, "strict-iso8601")) date_format = DATE_FORMAT_STRICT_ISO8601; else date_format = DATE_FORMAT_US; } else if(!strcmp(variable, "use_timezone")) { my_free(use_timezone); use_timezone = (char *)strdup(value); } else if(!strcmp(variable, "event_broker_options")) { if(!strcmp(value, "-1")) event_broker_options = BROKER_EVERYTHING; else event_broker_options = strtoul(value, NULL, 0); } else if(!strcmp(variable, "illegal_object_name_chars")) illegal_object_chars = (char *)strdup(value); else if(!strcmp(variable, "illegal_macro_output_chars")) illegal_output_chars = (char *)strdup(value); else if(!strcmp(variable, "broker_module")) { modptr = strtok(value, " \n"); argptr = strtok(NULL, "\n"); #ifdef USE_EVENT_BROKER modptr = nspath_absolute(modptr, config_file_dir); if (modptr) { neb_add_module(modptr, argptr, TRUE); free(modptr); } else { logit(NSLOG_RUNTIME_ERROR, TRUE, "Error: Failed to allocate module path memory for '%s'\n", value); } #endif } else if(!strcmp(variable, "use_regexp_matching")) use_regexp_matches = (atoi(value) > 0) ? TRUE : FALSE; else if(!strcmp(variable, "use_true_regexp_matching")) use_true_regexp_matching = (atoi(value) > 0) ? TRUE : FALSE; else if(!strcmp(variable, "daemon_dumps_core")) { if(strlen(value) != 1 || value[0] < '0' || value[0] > '1') { asprintf(&error_message, "Illegal value for daemon_dumps_core"); error = TRUE; break; } daemon_dumps_core = (atoi(value) > 0) ? TRUE : FALSE; } else if(!strcmp(variable, "use_large_installation_tweaks")) { if(strlen(value) != 1 || value[0] < '0' || value[0] > '1') { asprintf(&error_message, "Illegal value for use_large_installation_tweaks "); error = TRUE; break; } use_large_installation_tweaks = (atoi(value) > 0) ? TRUE : FALSE; } else if(!strcmp(variable, "enable_environment_macros")) enable_environment_macros = (atoi(value) > 0) ? TRUE : FALSE; else if(!strcmp(variable, "free_child_process_memory")) free_child_process_memory = (atoi(value) > 0) ? TRUE : FALSE; else if(!strcmp(variable, "child_processes_fork_twice")) child_processes_fork_twice = (atoi(value) > 0) ? TRUE : FALSE; /*** embedded perl variables are deprecated now ***/ else if(!strcmp(variable, "enable_embedded_perl")) obsoleted_warning(variable, NULL); else if(!strcmp(variable, "use_embedded_perl_implicitly")) obsoleted_warning(variable, NULL); else if(!strcmp(variable, "auth_file")) obsoleted_warning(variable, NULL); else if(!strcmp(variable, "p1_file")) obsoleted_warning(variable, NULL); /*** as is external_command_buffer_slots */ else if(!strcmp(variable, "external_command_buffer_slots")) obsoleted_warning(variable, "All commands are always processed upon arrival"); else if(!strcmp(variable, "check_for_updates")) check_for_updates = (atoi(value) > 0) ? TRUE : FALSE; else if(!strcmp(variable, "bare_update_check")) bare_update_check = (atoi(value) > 0) ? TRUE : FALSE; /* BEGIN status data variables */ else if(!strcmp(variable, "status_file")) status_file = nspath_absolute(value, config_file_dir); else if(strstr(input, "state_retention_file=") == input) retention_file = nspath_absolute(value, config_file_dir); /* END status data variables */ /*** BEGIN perfdata variables ***/ else if(!strcmp(variable, "perfdata_timeout")) { perfdata_timeout = atoi(value); } else if(!strcmp(variable, "host_perfdata_command")) host_perfdata_command = (char *)strdup(value); else if(!strcmp(variable, "service_perfdata_command")) service_perfdata_command = (char *)strdup(value); else if(!strcmp(variable, "host_perfdata_file_template")) host_perfdata_file_template = (char *)strdup(value); else if(!strcmp(variable, "service_perfdata_file_template")) service_perfdata_file_template = (char *)strdup(value); else if(!strcmp(variable, "host_perfdata_file")) host_perfdata_file = nspath_absolute(value, config_file_dir); else if(!strcmp(variable, "service_perfdata_file")) service_perfdata_file = nspath_absolute(value, config_file_dir); else if(!strcmp(variable, "host_perfdata_file_mode")) { host_perfdata_file_pipe = FALSE; if(strstr(value, "p") != NULL) host_perfdata_file_pipe = TRUE; else if(strstr(value, "w") != NULL) host_perfdata_file_append = FALSE; else host_perfdata_file_append = TRUE; } else if(!strcmp(variable, "service_perfdata_file_mode")) { service_perfdata_file_pipe = FALSE; if(strstr(value, "p") != NULL) service_perfdata_file_pipe = TRUE; else if(strstr(value, "w") != NULL) service_perfdata_file_append = FALSE; else service_perfdata_file_append = TRUE; } else if(!strcmp(variable, "host_perfdata_file_processing_interval")) host_perfdata_file_processing_interval = strtoul(value, NULL, 0); else if(!strcmp(variable, "service_perfdata_file_processing_interval")) service_perfdata_file_processing_interval = strtoul(value, NULL, 0); else if(!strcmp(variable, "host_perfdata_file_processing_command")) host_perfdata_file_processing_command = (char *)strdup(value); else if(!strcmp(variable, "service_perfdata_file_processing_command")) service_perfdata_file_processing_command = (char *)strdup(value); else if(!strcmp(variable,"host_perfdata_process_empty_results")) host_perfdata_process_empty_results = (atoi(value) > 0) ? TRUE : FALSE; else if(!strcmp(variable,"service_perfdata_process_empty_results")) service_perfdata_process_empty_results = (atoi(value) > 0) ? TRUE : FALSE; /*** END perfdata variables */ else if(strstr(input, "cfg_file=") == input || strstr(input, "cfg_dir=") == input) continue; else if(strstr(input, "object_cache_file=") == input) { my_free(object_cache_file); object_cache_file = nspath_absolute(value, config_file_dir); my_free(mac->x[MACRO_OBJECTCACHEFILE]); mac->x[MACRO_OBJECTCACHEFILE] = strdup(object_cache_file); } else if(strstr(input, "precached_object_file=") == input) { my_free(object_precache_file); object_precache_file = nspath_absolute(value, config_file_dir); } else if(!strcmp(variable, "allow_empty_hostgroup_assignment")) { allow_empty_hostgroup_assignment = (atoi(value) > 0) ? TRUE : FALSE; } /* skip external data directives */ else if(strstr(input, "x") == input) continue; else if(!strcmp(variable,"host_down_disable_service_checks")) { host_down_disable_service_checks = strtoul(value, NULL, 0); } /* we don't know what this variable is... */ else { asprintf(&error_message, "UNKNOWN VARIABLE"); error = TRUE; break; } } if (deprecated) { for (list = deprecated; list; list = list->next) { logit(NSLOG_CONFIG_WARNING, TRUE, "%s", (char *)list->object_ptr); free(list->object_ptr); } free_objectlist(&deprecated); deprecated = NULL; } if (!temp_path && !(temp_path = getenv("TMPDIR")) && !(temp_path = getenv("TMP"))) { temp_path = strdup("/tmp"); } else { /* make sure we don't have a trailing slash */ if(temp_path[strlen(temp_path) - 1] == '/') temp_path[strlen(temp_path) - 1] = '\x0'; } if((strlen(temp_path) > MAX_FILENAME_LENGTH - 1)) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: temp_path is too long\n"); return ERROR; } if((tmpdir = opendir(temp_path)) == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: temp_path '%s' is not a valid directory\n", temp_path); return ERROR; } closedir(tmpdir); /* now that we know we have temp_path, we can set temp_file properly */ if (!temp_file) { temp_file = nspath_absolute("nagios.tmp", temp_path); } else if (*temp_file == '.') { /* temp_file is relative. Make it nagios.cfg-relative */ char *foo = temp_file; temp_file = nspath_absolute(temp_file, config_file_dir); free(foo); } else if (*temp_file != '/') { /* * tempfile is not relative and not absolute, so * put it in temp_path */ char *foo = temp_file; temp_file = nspath_absolute(temp_file, temp_path); free(foo); } if(strlen(temp_file) > MAX_FILENAME_LENGTH - 1) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Temp file '%s' is too long\n", temp_file); return ERROR; } /* save the macros */ mac->x[MACRO_TEMPPATH] = temp_path; mac->x[MACRO_TEMPFILE] = temp_file; /* adjust timezone values */ if(use_timezone != NULL) set_environment_var("TZ", use_timezone, 1); tzset(); /* adjust tweaks */ if(free_child_process_memory == -1) free_child_process_memory = (use_large_installation_tweaks == TRUE) ? FALSE : TRUE; if(child_processes_fork_twice == -1) child_processes_fork_twice = (use_large_installation_tweaks == TRUE) ? FALSE : TRUE; /* handle errors */ if(error == TRUE) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error in configuration file '%s' - Line %d (%s)", main_config_file, current_line, (error_message == NULL) ? "NULL" : error_message); return ERROR; } /* free leftover memory and close the file */ my_free(input); mmap_fclose(thefile); /* free memory */ my_free(error_message); my_free(input); my_free(variable); my_free(value); /* make sure a log file has been specified */ if(log_file == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Log file is not specified anywhere in main config file '%s'!", main_config_file); exit(ERROR); } strip(log_file); return OK; } /* processes macros in resource file */ int read_resource_file(char *resource_file) { char *input = NULL; char *variable = NULL; char *value = NULL; char *temp_ptr = NULL; mmapfile *thefile = NULL; int current_line = 1; int error = FALSE; int user_index = 0; if((thefile = mmap_fopen(resource_file)) == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Cannot open resource file '%s' for reading!", resource_file); return ERROR; } /* process all lines in the resource file */ while(1) { /* free memory */ my_free(input); my_free(variable); my_free(value); /* read the next line */ if((input = mmap_fgets_multiline(thefile)) == NULL) break; current_line = thefile->current_line; /* skip blank lines and comments */ if(input[0] == '#' || input[0] == '\x0' || input[0] == '\n' || input[0] == '\r') continue; strip(input); /* get the variable name */ if((temp_ptr = my_strtok(input, "=")) == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: NULL variable - Line %d of resource file '%s'", current_line, resource_file); error = TRUE; break; } if((variable = (char *)strdup(temp_ptr)) == NULL) { error = TRUE; break; } /* get the value */ if((temp_ptr = my_strtok(NULL, "\n")) == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: NULL variable value - Line %d of resource file '%s'", current_line, resource_file); error = TRUE; break; } if((value = (char *)strdup(temp_ptr)) == NULL) { error = TRUE; break; } /* what should we do with the variable/value pair? */ /* check for macro declarations */ if(variable[0] == '$' && variable[strlen(variable) - 1] == '$') { /* $USERx$ macro declarations */ if(strstr(variable, "$USER") == variable && strlen(variable) > 5) { user_index = atoi(variable + 5) - 1; if(user_index >= 0 && user_index < MAX_USER_MACROS) { my_free(macro_user[user_index]); macro_user[user_index] = (char *)strdup(value); } } } } /* free leftover memory and close the file */ my_free(input); mmap_fclose(thefile); /* free memory */ my_free(variable); my_free(value); if(error == TRUE) return ERROR; return OK; } /****************************************************************/ /**************** CONFIG VERIFICATION FUNCTIONS *****************/ /****************************************************************/ /* do a pre-flight check to make sure object relationships, etc. make sense */ int pre_flight_check(void) { char *buf = NULL; int warnings = 0; int errors = 0; struct timeval tv[4]; double runtime[4]; int temp_path_fd = -1; if(test_scheduling == TRUE) gettimeofday(&tv[0], NULL); /********************************************/ /* check object relationships */ /********************************************/ pre_flight_object_check(&warnings, &errors); if(test_scheduling == TRUE) gettimeofday(&tv[1], NULL); /********************************************/ /* check for circular paths between hosts */ /********************************************/ pre_flight_circular_check(&warnings, &errors); if(test_scheduling == TRUE) gettimeofday(&tv[2], NULL); /********************************************/ /* check global event handler commands... */ /********************************************/ if(verify_config) printf("Checking global event handlers...\n"); if(global_host_event_handler != NULL) { global_host_event_handler_ptr = find_bang_command(global_host_event_handler); if (global_host_event_handler_ptr == NULL) { logit(NSLOG_VERIFICATION_ERROR, TRUE, "Error: Global host event handler command '%s' is not defined anywhere!", global_host_event_handler); errors++; } } if(global_service_event_handler != NULL) { global_service_event_handler_ptr = find_bang_command(global_service_event_handler); if (global_service_event_handler_ptr == NULL) { logit(NSLOG_VERIFICATION_ERROR, TRUE, "Error: Global service event handler command '%s' is not defined anywhere!", global_service_event_handler); errors++; } } /**************************************************/ /* check obsessive processor commands... */ /**************************************************/ if(verify_config) printf("Checking obsessive compulsive processor commands...\n"); if(ocsp_command != NULL) { ocsp_command_ptr = find_bang_command(ocsp_command); if (!ocsp_command_ptr) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: OCSP command '%s' is not defined anywhere!\n", ocsp_command); errors++; } } if(ochp_command != NULL) { ochp_command_ptr = find_bang_command(ochp_command); if (!ochp_command_ptr) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: OCHP command '%s' is not defined anywhere!\n", ochp_command); errors++; } } /**************************************************/ /* check various settings... */ /**************************************************/ if(verify_config) printf("Checking misc settings...\n"); /* check if we can write to temp_path */ asprintf(&buf, "%s/nagiosXXXXXX", temp_path); if((temp_path_fd = mkstemp(buf)) == -1) { logit(NSLOG_VERIFICATION_ERROR, TRUE, "\tError: Unable to write to temp_path ('%s') - %s\n", temp_path, strerror(errno)); errors++; } else { close(temp_path_fd); remove(buf); } my_free(buf); /* check if we can write to check_result_path */ asprintf(&buf, "%s/nagiosXXXXXX", check_result_path); if((temp_path_fd = mkstemp(buf)) == -1) { logit(NSLOG_VERIFICATION_WARNING, TRUE, "\tError: Unable to write to check_result_path ('%s') - %s\n", check_result_path, strerror(errno)); errors++; } else { close(temp_path_fd); remove(buf); } my_free(buf); /* warn if user didn't specify any illegal macro output chars */ if(illegal_output_chars == NULL) { logit(NSLOG_VERIFICATION_WARNING, TRUE, "%s", "Warning: Nothing specified for illegal_macro_output_chars variable!\n"); warnings++; } else { char *p; for(p = illegal_output_chars; *p; p++) { illegal_output_char_map[(int)*p] = 1; } } if(verify_config) { printf("\n"); printf("Total Warnings: %d\n", warnings); printf("Total Errors: %d\n", errors); } if(test_scheduling == TRUE) gettimeofday(&tv[3], NULL); if(test_scheduling == TRUE) { runtime[0] = tv_delta_f(&tv[0], &tv[1]); runtime[1] = tv_delta_f(&tv[1], &tv[2]); runtime[2] = (double)((double)(tv[3].tv_sec - tv[2].tv_sec) + (double)((tv[3].tv_usec - tv[2].tv_usec) / 1000.0) / 1000.0); runtime[3] = runtime[0] + runtime[1] + runtime[2]; printf("Timing information on configuration verification is listed below.\n\n"); printf("CONFIG VERIFICATION TIMES\n"); printf("----------------------------------\n"); printf("Object Relationships: %.6lf sec\n", runtime[0]); printf("Circular Paths: %.6lf sec\n", runtime[1]); printf("Misc: %.6lf sec\n", runtime[2]); printf(" ============\n"); printf("TOTAL: %.6lf sec\n", runtime[3]); printf("\n\n"); } return (errors > 0) ? ERROR : OK; } /* do a pre-flight check to make sure object relationships make sense */ int pre_flight_object_check(int *w, int *e) { contact *temp_contact = NULL; commandsmember *temp_commandsmember = NULL; contactgroup *temp_contactgroup = NULL; host *temp_host = NULL; host *temp_host2 = NULL; hostsmember *temp_hostsmember = NULL; servicesmember *sm = NULL; hostgroup *temp_hostgroup = NULL; servicegroup *temp_servicegroup = NULL; service *temp_service = NULL; command *temp_command = NULL; timeperiod *temp_timeperiod = NULL; timeperiod *temp_timeperiod2 = NULL; timeperiodexclusion *temp_timeperiodexclusion = NULL; int total_objects = 0; int warnings = 0; int errors = 0; #ifdef TEST void *ptr = NULL; char *buf1 = ""; char *buf2 = ""; buf1 = "temptraxe1"; buf2 = "Probe 2"; for(temp_se = get_first_serviceescalation_by_service(buf1, buf2, &ptr); temp_se != NULL; temp_se = get_next_serviceescalation_by_service(buf1, buf2, &ptr)) { printf("FOUND ESCALATION FOR SVC '%s'/'%s': %d-%d/%.3f, PTR=%p\n", buf1, buf2, temp_se->first_notification, temp_se->last_notification, temp_se->notification_interval, ptr); } for(temp_he = get_first_hostescalation_by_host(buf1, &ptr); temp_he != NULL; temp_he = get_next_hostescalation_by_host(buf1, &ptr)) { printf("FOUND ESCALATION FOR HOST '%s': %d-%d/%d, PTR=%p\n", buf1, temp_he->first_notification, temp_he->last_notification, temp_he->notification_interval, ptr); } #endif if(verify_config) printf("Checking objects...\n"); /*****************************************/ /* check each service... */ /*****************************************/ if(get_service_count() == 0) { logit(NSLOG_VERIFICATION_ERROR, TRUE, "Error: There are no services defined!"); errors++; } total_objects = 0; for(temp_service = service_list; temp_service != NULL; temp_service = temp_service->next) { total_objects++; /* check the event handler command */ if(temp_service->event_handler != NULL) { temp_service->event_handler_ptr = find_bang_command(temp_service->event_handler); if(temp_service->event_handler_ptr == NULL) { logit(NSLOG_VERIFICATION_ERROR, TRUE, "Error: Event handler command '%s' specified in service '%s' for host '%s' not defined anywhere", temp_service->event_handler, temp_service->description, temp_service->host_name); errors++; } } /* check the service check_command */ temp_service->check_command_ptr = find_bang_command(temp_service->check_command); if(temp_service->check_command_ptr == NULL) { logit(NSLOG_VERIFICATION_ERROR, TRUE, "Error: Service check command '%s' specified in service '%s' for host '%s' not defined anywhere!", temp_service->check_command, temp_service->description, temp_service->host_name); errors++; } /* check for sane recovery options */ if(temp_service->notification_options == OPT_RECOVERY) { logit(NSLOG_VERIFICATION_WARNING, TRUE, "Warning: Recovery notification option in service '%s' for host '%s' doesn't make any sense - specify warning and/or critical options as well", temp_service->description, temp_service->host_name); warnings++; } /* check to see if there is at least one contact/group */ if(temp_service->contacts == NULL && temp_service->contact_groups == NULL) { logit(NSLOG_VERIFICATION_WARNING, TRUE, "Warning: Service '%s' on host '%s' has no default contacts or contactgroups defined!", temp_service->description, temp_service->host_name); warnings++; } /* verify service check timeperiod */ if(temp_service->check_period == NULL) { logit(NSLOG_VERIFICATION_WARNING, TRUE, "Warning: Service '%s' on host '%s' has no check time period defined!", temp_service->description, temp_service->host_name); warnings++; } /* check service notification timeperiod */ if(temp_service->notification_period == NULL) { logit(NSLOG_VERIFICATION_WARNING, TRUE, "Warning: Service '%s' on host '%s' has no notification time period defined!", temp_service->description, temp_service->host_name); warnings++; } /* check parent services */ for(sm = temp_service->parents; sm; sm = sm->next) { sm->service_ptr = find_service(sm->host_name, sm->service_description); if(sm->service_ptr == NULL) { logit(NSLOG_VERIFICATION_ERROR, TRUE, "Error: Service '%s' on host '%s' is not a valid parent for service '%s' on host '%s'\n", sm->host_name, sm->service_description, temp_service->host_name, temp_service->description); errors++; } /* add a reverse (child) link to make searches faster later on */ add_child_link_to_service(sm->service_ptr, temp_service); } /* see if the notification interval is less than the check interval */ if(temp_service->notification_interval < temp_service->check_interval && temp_service->notification_interval != 0) { logit(NSLOG_VERIFICATION_WARNING, TRUE, "Warning: Service '%s' on host '%s' has a notification interval less than its check interval! Notifications are only re-sent after checks are made, so the effective notification interval will be that of the check interval.", temp_service->description, temp_service->host_name); warnings++; } /* check for illegal characters in service description */ if(use_precached_objects == FALSE) { if(contains_illegal_object_chars(temp_service->description) == TRUE) { logit(NSLOG_VERIFICATION_ERROR, TRUE, "Error: The description string for service '%s' on host '%s' contains one or more illegal characters.", temp_service->description, temp_service->host_name); errors++; } } } if(verify_config) printf("\tChecked %d services.\n", total_objects); /*****************************************/ /* check all hosts... */ /*****************************************/ if(get_host_count() == 0) { logit(NSLOG_VERIFICATION_ERROR, TRUE, "Error: There are no hosts defined!"); errors++; } total_objects = 0; for(temp_host = host_list; temp_host != NULL; temp_host = temp_host->next) { total_objects++; /* make sure each host has at least one service associated with it */ if(temp_host->total_services == 0 && verify_config >= 2) { logit(NSLOG_VERIFICATION_WARNING, TRUE, "Warning: Host '%s' has no services associated with it!", temp_host->name); warnings++; } /* check the event handler command */ if(temp_host->event_handler != NULL) { temp_host->event_handler_ptr = find_bang_command(temp_host->event_handler); if(temp_host->event_handler_ptr == NULL) { logit(NSLOG_VERIFICATION_ERROR, TRUE, "Error: Event handler command '%s' specified for host '%s' not defined anywhere", temp_host->event_handler, temp_host->name); errors++; } } /* hosts that don't have check commands defined shouldn't ever be checked... */ if(temp_host->check_command != NULL) { temp_host->check_command_ptr = find_bang_command(temp_host->check_command); if(temp_host->check_command_ptr == NULL) { logit(NSLOG_VERIFICATION_ERROR, TRUE, "Error: Host check command '%s' specified for host '%s' is not defined anywhere!", temp_host->check_command, temp_host->name); errors++; } } /* check host check timeperiod */ if(temp_host->check_period != NULL) { temp_timeperiod = find_timeperiod(temp_host->check_period); if(temp_timeperiod == NULL) { logit(NSLOG_VERIFICATION_ERROR, TRUE, "Error: Check period '%s' specified for host '%s' is not defined anywhere!", temp_host->check_period, temp_host->name); errors++; } /* save the pointer to the check timeperiod for later */ temp_host->check_period_ptr = temp_timeperiod; } /* check to see if there is at least one contact/group */ if(temp_host->contacts == NULL && temp_host->contact_groups == NULL) { logit(NSLOG_VERIFICATION_WARNING, TRUE, "Warning: Host '%s' has no default contacts or contactgroups defined!", temp_host->name); warnings++; } /* check notification timeperiod */ if(temp_host->notification_period != NULL) { temp_timeperiod = find_timeperiod(temp_host->notification_period); if(temp_timeperiod == NULL) { logit(NSLOG_VERIFICATION_ERROR, TRUE, "Error: Notification period '%s' specified for host '%s' is not defined anywhere!", temp_host->notification_period, temp_host->name); errors++; } /* save the pointer to the notification timeperiod for later */ temp_host->notification_period_ptr = temp_timeperiod; } /* check all parent parent host */ for(temp_hostsmember = temp_host->parent_hosts; temp_hostsmember != NULL; temp_hostsmember = temp_hostsmember->next) { if((temp_host2 = find_host(temp_hostsmember->host_name)) == NULL) { logit(NSLOG_VERIFICATION_ERROR, TRUE, "Error: '%s' is not a valid parent for host '%s'!", temp_hostsmember->host_name, temp_host->name); errors++; } /* save the parent host pointer for later */ temp_hostsmember->host_ptr = temp_host2; /* add a reverse (child) link to make searches faster later on */ add_child_link_to_host(temp_host2, temp_host); } /* check for sane recovery options */ if(temp_host->notification_options == OPT_RECOVERY) { logit(NSLOG_VERIFICATION_WARNING, TRUE, "Warning: Recovery notification option in host '%s' definition doesn't make any sense - specify down and/or unreachable options as well", temp_host->name); warnings++; } /* check for illegal characters in host name */ if(use_precached_objects == FALSE) { if(contains_illegal_object_chars(temp_host->name) == TRUE) { logit(NSLOG_VERIFICATION_ERROR, TRUE, "Error: The name of host '%s' contains one or more illegal characters.", temp_host->name); errors++; } } } if(verify_config) printf("\tChecked %d hosts.\n", total_objects); /*****************************************/ /* check each host group... */ /*****************************************/ for(temp_hostgroup = hostgroup_list, total_objects = 0; temp_hostgroup != NULL; temp_hostgroup = temp_hostgroup->next, total_objects++) { /* check for illegal characters in hostgroup name */ if(use_precached_objects == FALSE) { if(contains_illegal_object_chars(temp_hostgroup->group_name) == TRUE) { logit(NSLOG_VERIFICATION_ERROR, TRUE, "Error: The name of hostgroup '%s' contains one or more illegal characters.", temp_hostgroup->group_name); errors++; } } } if(verify_config) printf("\tChecked %d host groups.\n", total_objects); /*****************************************/ /* check each service group... */ /*****************************************/ for(temp_servicegroup = servicegroup_list, total_objects = 0; temp_servicegroup != NULL; temp_servicegroup = temp_servicegroup->next, total_objects++) { /* check for illegal characters in servicegroup name */ if(use_precached_objects == FALSE) { if(contains_illegal_object_chars(temp_servicegroup->group_name) == TRUE) { logit(NSLOG_VERIFICATION_ERROR, TRUE, "Error: The name of servicegroup '%s' contains one or more illegal characters.", temp_servicegroup->group_name); errors++; } } } if(verify_config) printf("\tChecked %d service groups.\n", total_objects); /*****************************************/ /* check all contacts... */ /*****************************************/ if(contact_list == NULL) { logit(NSLOG_VERIFICATION_ERROR, TRUE, "Error: There are no contacts defined!"); errors++; } for(temp_contact = contact_list, total_objects = 0; temp_contact != NULL; temp_contact = temp_contact->next, total_objects++) { /* check service notification commands */ if(temp_contact->service_notification_commands == NULL) { logit(NSLOG_VERIFICATION_ERROR, TRUE, "Error: Contact '%s' has no service notification commands defined!", temp_contact->name); errors++; } else for(temp_commandsmember = temp_contact->service_notification_commands; temp_commandsmember != NULL; temp_commandsmember = temp_commandsmember->next) { temp_commandsmember->command_ptr = find_bang_command(temp_commandsmember->command); if(temp_commandsmember->command_ptr == NULL) { logit(NSLOG_VERIFICATION_ERROR, TRUE, "Error: Service notification command '%s' specified for contact '%s' is not defined anywhere!", temp_commandsmember->command, temp_contact->name); errors++; } } /* check host notification commands */ if(temp_contact->host_notification_commands == NULL) { logit(NSLOG_VERIFICATION_ERROR, TRUE, "Error: Contact '%s' has no host notification commands defined!", temp_contact->name); errors++; } else for(temp_commandsmember = temp_contact->host_notification_commands; temp_commandsmember != NULL; temp_commandsmember = temp_commandsmember->next) { temp_commandsmember->command_ptr = find_bang_command(temp_commandsmember->command); if(temp_commandsmember->command_ptr == NULL) { logit(NSLOG_VERIFICATION_ERROR, TRUE, "Error: Host notification command '%s' specified for contact '%s' is not defined anywhere!", temp_commandsmember->command, temp_contact->name); errors++; } } /* check service notification timeperiod */ if(temp_contact->service_notification_period == NULL) { logit(NSLOG_VERIFICATION_WARNING, TRUE, "Warning: Contact '%s' has no service notification time period defined!", temp_contact->name); warnings++; } else { temp_timeperiod = find_timeperiod(temp_contact->service_notification_period); if(temp_timeperiod == NULL) { logit(NSLOG_VERIFICATION_ERROR, TRUE, "Error: Service notification period '%s' specified for contact '%s' is not defined anywhere!", temp_contact->service_notification_period, temp_contact->name); errors++; } /* save the pointer to the service notification timeperiod for later */ temp_contact->service_notification_period_ptr = temp_timeperiod; } /* check host notification timeperiod */ if(temp_contact->host_notification_period == NULL) { logit(NSLOG_VERIFICATION_WARNING, TRUE, "Warning: Contact '%s' has no host notification time period defined!", temp_contact->name); warnings++; } else { temp_timeperiod = find_timeperiod(temp_contact->host_notification_period); if(temp_timeperiod == NULL) { logit(NSLOG_VERIFICATION_ERROR, TRUE, "Error: Host notification period '%s' specified for contact '%s' is not defined anywhere!", temp_contact->host_notification_period, temp_contact->name); errors++; } /* save the pointer to the host notification timeperiod for later */ temp_contact->host_notification_period_ptr = temp_timeperiod; } /* check for sane host recovery options */ if(temp_contact->host_notification_options == OPT_RECOVERY) { logit(NSLOG_VERIFICATION_WARNING, TRUE, "Warning: Host recovery notification option for contact '%s' doesn't make any sense - specify down and/or unreachable options as well", temp_contact->name); warnings++; } /* check for sane service recovery options */ if(temp_contact->service_notification_options == OPT_RECOVERY) { logit(NSLOG_VERIFICATION_WARNING, TRUE, "Warning: Service recovery notification option for contact '%s' doesn't make any sense - specify critical and/or warning options as well", temp_contact->name); warnings++; } /* check for illegal characters in contact name */ if(use_precached_objects == FALSE) { if(contains_illegal_object_chars(temp_contact->name) == TRUE) { logit(NSLOG_VERIFICATION_ERROR, TRUE, "Error: The name of contact '%s' contains one or more illegal characters.", temp_contact->name); errors++; } } } if(verify_config) printf("\tChecked %d contacts.\n", total_objects); /*****************************************/ /* check each contact group... */ /*****************************************/ for(temp_contactgroup = contactgroup_list, total_objects = 0; temp_contactgroup != NULL; temp_contactgroup = temp_contactgroup->next, total_objects++) { /* check for illegal characters in contactgroup name */ if(use_precached_objects == FALSE) { if(contains_illegal_object_chars(temp_contactgroup->group_name) == TRUE) { logit(NSLOG_VERIFICATION_ERROR, TRUE, "Error: The name of contact group '%s' contains one or more illegal characters.", temp_contactgroup->group_name); errors++; } } } if(verify_config) printf("\tChecked %d contact groups.\n", total_objects); /*****************************************/ /* check all commands... */ /*****************************************/ for(temp_command = command_list, total_objects = 0; temp_command != NULL; temp_command = temp_command->next, total_objects++) { /* check for illegal characters in command name */ if(use_precached_objects == FALSE) { if(contains_illegal_object_chars(temp_command->name) == TRUE) { logit(NSLOG_VERIFICATION_ERROR, TRUE, "Error: The name of command '%s' contains one or more illegal characters.", temp_command->name); errors++; } } } if(verify_config) printf("\tChecked %d commands.\n", total_objects); /*****************************************/ /* check all timeperiods... */ /*****************************************/ for(temp_timeperiod = timeperiod_list, total_objects = 0; temp_timeperiod != NULL; temp_timeperiod = temp_timeperiod->next, total_objects++) { /* check for illegal characters in timeperiod name */ if(use_precached_objects == FALSE) { if(contains_illegal_object_chars(temp_timeperiod->name) == TRUE) { logit(NSLOG_VERIFICATION_ERROR, TRUE, "Error: The name of time period '%s' contains one or more illegal characters.", temp_timeperiod->name); errors++; } } /* check for valid timeperiod names in exclusion list */ for(temp_timeperiodexclusion = temp_timeperiod->exclusions; temp_timeperiodexclusion != NULL; temp_timeperiodexclusion = temp_timeperiodexclusion->next) { temp_timeperiod2 = find_timeperiod(temp_timeperiodexclusion->timeperiod_name); if(temp_timeperiod2 == NULL) { logit(NSLOG_VERIFICATION_ERROR, TRUE, "Error: Excluded time period '%s' specified in timeperiod '%s' is not defined anywhere!", temp_timeperiodexclusion->timeperiod_name, temp_timeperiod->name); errors++; } /* save the timeperiod pointer for later */ temp_timeperiodexclusion->timeperiod_ptr = temp_timeperiod2; } } if(verify_config) printf("\tChecked %d time periods.\n", total_objects); /* help people use scripts to verify that objects are loaded */ if(verify_config) { printf("\tChecked %u host escalations.\n", num_objects.hostescalations); printf("\tChecked %u service escalations.\n", num_objects.serviceescalations); } /* update warning and error count */ *w += warnings; *e += errors; return (errors > 0) ? ERROR : OK; } /* dfs status values */ #define DFS_UNCHECKED 0 /* default value */ #define DFS_TEMP_CHECKED 1 /* check just one time */ #define DFS_OK 2 /* no problem */ #define DFS_NEAR_LOOP 3 /* has trouble sons */ #define DFS_LOOPY 4 /* is a part of a loop */ #define dfs_get_status(obj) (obj ? ary[obj->id] : DFS_OK) #define dfs_set_status(obj, value) ary[obj->id] = (value) /** * Modified version of Depth-first Search * http://en.wikipedia.org/wiki/Depth-first_search * * In a dependency tree like this (parent->child, dep->dep or whatever): * A - B C * \ / * D * / \ * E - F - G * / \\ * H H * * ... we look at the nodes in the following order: * A B D C G (marking all of them as OK) * E F D G H F (D,G are already OK, E is marked near-loopy F and H are loopy) * H (which is already marked as loopy, so we don't follow it) * * We look at each node at most once per parent, so the algorithm has * O(nx) worst-case complexity,, where x is the average number of * parents. */ /* * same as dfs_host_path, but we flip the the tree and traverse it * backwards, since core Nagios doesn't need the child pointer at * later stages. */ static int dfs_servicedep_path(char *ary, service *root, int dep_type, int *errors) { objectlist *olist; int status; status = dfs_get_status(root); if(status != DFS_UNCHECKED) return status; dfs_set_status(root, DFS_TEMP_CHECKED); if (dep_type == NOTIFICATION_DEPENDENCY) { olist = root->notify_deps; } else { olist = root->exec_deps; } if (!olist) { /* no children, so we can't be loopy */ dfs_set_status(root, DFS_OK); return DFS_OK; } for (; olist; olist = olist->next) { int child_status; service *child; servicedependency *child_dep = (servicedependency *)olist->object_ptr; /* tree is upside down, so look to master */ child = child_dep->master_service_ptr; child_status = dfs_servicedep_path(ary, child, dep_type, errors); if (child_status == DFS_OK) continue; if(child_status == DFS_TEMP_CHECKED) { logit(NSLOG_VERIFICATION_ERROR, TRUE, "Error: Circular %s dependency detected for services '%s;%s' and '%s;%s'\n", dep_type == NOTIFICATION_DEPENDENCY ? "notification" : "execution", root->host_name, root->description, child->host_name, child->description); (*errors)++; dfs_set_status(child, DFS_LOOPY); dfs_set_status(root, DFS_LOOPY); continue; } } /* * if we've hit ourself, we'll have marked us as loopy * above, so if we're TEMP_CHECKED still we're ok */ if (dfs_get_status(root) == DFS_TEMP_CHECKED) dfs_set_status(root, DFS_OK); return dfs_get_status(root); } static int dfs_hostdep_path(char *ary, host *root, int dep_type, int *errors) { objectlist *olist; int status; status = dfs_get_status(root); if(status != DFS_UNCHECKED) return status; dfs_set_status(root, DFS_TEMP_CHECKED); if (dep_type == NOTIFICATION_DEPENDENCY) { olist = root->notify_deps; } else { olist = root->exec_deps; } for (; olist; olist = olist->next) { int child_status; host *child; hostdependency *child_dep = (hostdependency *)olist->object_ptr; child = child_dep->master_host_ptr; child_status = dfs_hostdep_path(ary, child, dep_type, errors); if (child_status == DFS_OK) continue; if(child_status == DFS_TEMP_CHECKED) { logit(NSLOG_VERIFICATION_ERROR, TRUE, "Error: Circular %s dependency detected for hosts '%s' and '%s'\n", dep_type == NOTIFICATION_DEPENDENCY ? "notification" : "execution", root->name, child->name); dfs_set_status(child, DFS_LOOPY); dfs_set_status(root, DFS_LOOPY); (*errors)++; continue; } } /* * if we've hit ourself, we'll have marked us as loopy * above, so if we're still TEMP_CHECKED we're ok */ if (dfs_get_status(root) == DFS_TEMP_CHECKED) dfs_set_status(root, DFS_OK); return dfs_get_status(root); } static int dfs_host_path(char *ary, host *root, int *errors) { hostsmember *child = NULL; if(dfs_get_status(root) != DFS_UNCHECKED) return dfs_get_status(root); /* Mark the root temporary checked */ dfs_set_status(root, DFS_TEMP_CHECKED); /* We are scanning the children */ for(child = root->child_hosts; child != NULL; child = child->next) { int child_status = dfs_host_path(ary, child->host_ptr, errors); /* we can move on quickly if child is ok */ if(child_status == DFS_OK) continue; /* If a child already temporary checked, its a problem, * loop inside, and its a acked status */ if(child_status == DFS_TEMP_CHECKED) { logit(NSLOG_VERIFICATION_ERROR, TRUE, "Error: The hosts '%s' and '%s' form or lead into a circular parent/child chain!", root->name, child->host_ptr->name); (*errors)++; dfs_set_status(child->host_ptr, DFS_LOOPY); dfs_set_status(root, DFS_LOOPY); continue; } } /* * If root have been modified, do not set it OK * A node is OK if and only if all of his children are OK * If it does not have child, goes ok */ if(dfs_get_status(root) == DFS_TEMP_CHECKED) dfs_set_status(root, DFS_OK); return dfs_get_status(root); } static int dfs_timeperiod_path(char *ary, timeperiod *root, int *errors) { timeperiodexclusion *exc; if(dfs_get_status(root) != DFS_UNCHECKED) return dfs_get_status(root); /* Mark the root temporary checked */ dfs_set_status(root, DFS_TEMP_CHECKED); for (exc = root->exclusions; exc; exc = exc->next) { int child_status = dfs_timeperiod_path(ary, exc->timeperiod_ptr, errors); if(child_status == DFS_TEMP_CHECKED) { logit(NSLOG_VERIFICATION_ERROR, TRUE, "Error: The timeperiods '%s' and '%s' form or lead into a circular exclusion chain!", root->name, exc->timeperiod_ptr->name); (*errors)++; dfs_set_status(exc->timeperiod_ptr, DFS_LOOPY); dfs_set_status(root, DFS_LOOPY); continue; } } if(dfs_get_status(root) == DFS_TEMP_CHECKED) dfs_set_status(root, DFS_OK); return dfs_get_status(root); } /* check for circular paths and dependencies */ int pre_flight_circular_check(int *w, int *e) { host *temp_host = NULL; servicedependency *temp_sd = NULL; hostdependency *temp_hd = NULL; timeperiod *tp; unsigned int i; int errors = 0; unsigned int alloc, dep_type; char *ary[2]; if(num_objects.hosts > num_objects.services) alloc = num_objects.hosts; else alloc = num_objects.services; if(num_objects.timeperiods > alloc) alloc = num_objects.timeperiods; for (i = 0; i < ARRAY_SIZE(ary); i++) { if (!(ary[i] = calloc(1, alloc))) { while (i) { my_free(ary[--i]); } logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Unable to allocate memory for circular path checks.\n"); errors++; return ERROR; } } /********************************************/ /* check for circular paths between hosts */ /********************************************/ if(verify_config) printf("Checking for circular paths...\n"); for(temp_host = host_list; temp_host != NULL; temp_host = temp_host->next) { dfs_host_path(ary[0], temp_host, &errors); } if (verify_config) printf("\tChecked %u hosts\n", num_objects.hosts); /********************************************/ /* check for circular dependencies */ /********************************************/ /* check service dependencies */ /* We must clean the dfs status from previous check */ for (i = 0; i < ARRAY_SIZE(ary); i++) memset(ary[i], 0, alloc); for(i = 0; i < num_objects.servicedependencies; i++) { temp_sd = servicedependency_ary[i]; dep_type = temp_sd->dependency_type; /* * this shouldn't happen, but it can in case dependencies are * added to services on hosts in empty hostgroups (ie, nonexistent) */ if(dep_type < 1 || dep_type > ARRAY_SIZE(ary)) continue; dfs_servicedep_path(ary[dep_type - 1], temp_sd->dependent_service_ptr, dep_type, &errors); } if(verify_config) printf("\tChecked %u service dependencies\n", num_objects.servicedependencies); /* check host dependencies */ for (i = 0; i < ARRAY_SIZE(ary); i++) memset(ary[i], 0, alloc); for(i = 0; i < num_objects.hostdependencies; i++) { temp_hd = hostdependency_ary[i]; dep_type = temp_hd->dependency_type; /* see above */ if(dep_type < 1 || dep_type > ARRAY_SIZE(ary)) continue; dfs_hostdep_path(ary[dep_type - 1], temp_hd->dependent_host_ptr, dep_type, &errors); } if(verify_config) printf("\tChecked %u host dependencies\n", num_objects.hostdependencies); /* check timeperiod exclusion chains */ for (i = 0; i < ARRAY_SIZE(ary); i++) memset(ary[i], 0, alloc); for (tp = timeperiod_list; tp; tp = tp->next) { dfs_timeperiod_path(ary[0], tp, &errors); } if (verify_config) printf("\tChecked %u timeperiods\n", num_objects.timeperiods); /* update warning and error count */ *e += errors; for (i = 0; i < ARRAY_SIZE(ary); i++) free(ary[i]); return (errors > 0) ? ERROR : OK; } nagios-4.3.4/base/events.c000066400000000000000000001723121314764422400154010ustar00rootroot00000000000000/***************************************************************************** * * EVENTS.C - Timed event functions for Nagios * * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #include "../include/config.h" #include "../include/common.h" #include "../include/downtime.h" #include "../include/comments.h" #include "../include/statusdata.h" #include "../include/nagios.h" #include "../include/broker.h" #include "../include/sretention.h" #include "../include/workers.h" #include "../lib/squeue.h" /* the event we're currently processing */ static timed_event *current_event; static unsigned int event_count[EVENT_USER_FUNCTION + 1]; /******************************************************************/ /************ EVENT SCHEDULING/HANDLING FUNCTIONS *****************/ /******************************************************************/ int dump_event_stats(int sd) { unsigned int i; for (i = 0; i < ARRAY_SIZE(event_count); i++) { nsock_printf(sd, "%s=%u;", EVENT_TYPE_STR(i), event_count[i]); /* * VERSIONFIX: Make EVENT_SLEEP and EVENT_USER_FUNCTION * appear in linear order in include/nagios.h when we go * from 4.0 -> 4.1, so we can remove this junk. */ if (i == 16) i = 97; } nsock_printf_nul(sd, "SQUEUE_ENTRIES=%u", squeue_size(nagios_squeue)); return OK; } static void track_events(unsigned int type, int add) { /* * remove_event() calls track_events() with add being -1. * add_event() calls us with add being 1 */ if (type < ARRAY_SIZE(event_count)) event_count[type] += add; } /* initialize the event timing loop before we start monitoring */ void init_timing_loop(void) { host *temp_host = NULL; service *temp_service = NULL; time_t current_time = 0L; int total_interleave_blocks = 0; int current_interleave_block = 1; int interleave_block_index = 0; int mult_factor = 0; int is_valid_time = 0; time_t next_valid_time = 0L; int schedule_check = 0; double max_inter_check_delay = 0.0; struct timeval tv[9]; double runtime[9]; struct timeval now; unsigned int fixed_hosts = 0, fixed_services = 0; int check_delay = 0; log_debug_info(DEBUGL_FUNCTIONS, 0, "init_timing_loop() start\n"); /* get the time and seed the prng */ gettimeofday(&now, NULL); current_time = now.tv_sec; srand((now.tv_sec << 10) ^ now.tv_usec); /******** GET BASIC HOST/SERVICE INFO ********/ scheduling_info.total_services = 0; scheduling_info.total_scheduled_services = 0; scheduling_info.total_hosts = 0; scheduling_info.total_scheduled_hosts = 0; scheduling_info.average_services_per_host = 0.0; scheduling_info.average_scheduled_services_per_host = 0.0; scheduling_info.average_service_execution_time = 0.0; scheduling_info.service_check_interval_total = 0; scheduling_info.average_service_inter_check_delay = 0.0; scheduling_info.host_check_interval_total = 0; scheduling_info.average_host_inter_check_delay = 0.0; if(test_scheduling == TRUE) gettimeofday(&tv[0], NULL); /* get info on service checks to be scheduled */ for(temp_service = service_list; temp_service != NULL; temp_service = temp_service->next) { schedule_check = TRUE; /* service has no check interval */ if(temp_service->check_interval == 0) schedule_check = FALSE; /* active checks are disabled */ if(temp_service->checks_enabled == FALSE) schedule_check = FALSE; /* are there any valid times this service can be checked? */ is_valid_time = check_time_against_period(current_time, temp_service->check_period_ptr); if(is_valid_time == ERROR) { get_next_valid_time(current_time, &next_valid_time, temp_service->check_period_ptr); if(current_time == next_valid_time) schedule_check = FALSE; } if(schedule_check == TRUE) { double exec_time; /* get real exec time, or make a pessimistic guess */ exec_time = temp_service->execution_time ? temp_service->execution_time : 2.0; scheduling_info.total_scheduled_services++; /* used later in inter-check delay calculations */ scheduling_info.service_check_interval_total += temp_service->check_interval; /* calculate rolling average execution time (available from retained state information) */ scheduling_info.average_service_execution_time = (double)(((scheduling_info.average_service_execution_time * (scheduling_info.total_scheduled_services - 1)) + exec_time) / (double)scheduling_info.total_scheduled_services); } else { temp_service->should_be_scheduled = FALSE; log_debug_info(DEBUGL_EVENTS, 1, "Service '%s' on host '%s' should not be scheduled.\n", temp_service->description, temp_service->host_name); } scheduling_info.total_services++; } if(test_scheduling == TRUE) gettimeofday(&tv[1], NULL); /* get info on host checks to be scheduled */ for(temp_host = host_list; temp_host != NULL; temp_host = temp_host->next) { schedule_check = TRUE; /* host has no check interval */ if(temp_host->check_interval == 0) schedule_check = FALSE; /* active checks are disabled */ if(temp_host->checks_enabled == FALSE) schedule_check = FALSE; /* are there any valid times this host can be checked? */ is_valid_time = check_time_against_period(current_time, temp_host->check_period_ptr); if(is_valid_time == ERROR) { get_next_valid_time(current_time, &next_valid_time, temp_host->check_period_ptr); if(current_time == next_valid_time) schedule_check = FALSE; } if(schedule_check == TRUE) { scheduling_info.total_scheduled_hosts++; /* this is used later in inter-check delay calculations */ scheduling_info.host_check_interval_total += temp_host->check_interval; } else { temp_host->should_be_scheduled = FALSE; log_debug_info(DEBUGL_EVENTS, 1, "Host '%s' should not be scheduled.\n", temp_host->name); } scheduling_info.total_hosts++; } if(test_scheduling == TRUE) gettimeofday(&tv[2], NULL); scheduling_info.average_services_per_host = (double)((double)scheduling_info.total_services / (double)scheduling_info.total_hosts); scheduling_info.average_scheduled_services_per_host = (double)((double)scheduling_info.total_scheduled_services / (double)scheduling_info.total_hosts); /* adjust the check interval total to correspond to the interval length */ scheduling_info.service_check_interval_total = (scheduling_info.service_check_interval_total * interval_length); /* calculate the average check interval for services */ scheduling_info.average_service_check_interval = (double)((double)scheduling_info.service_check_interval_total / (double)scheduling_info.total_scheduled_services); /******** DETERMINE SERVICE SCHEDULING PARAMS ********/ log_debug_info(DEBUGL_EVENTS, 2, "Determining service scheduling parameters...\n"); /* default max service check spread (in minutes) */ scheduling_info.max_service_check_spread = max_service_check_spread; /* how should we determine the service inter-check delay to use? */ switch(service_inter_check_delay_method) { case ICD_NONE: /* don't spread checks out - useful for testing parallelization code */ scheduling_info.service_inter_check_delay = 0.0; break; case ICD_DUMB: /* be dumb and just schedule checks 1 second apart */ scheduling_info.service_inter_check_delay = 1.0; break; case ICD_USER: /* the user specified a delay, so don't try to calculate one */ break; case ICD_SMART: default: /* be smart and calculate the best delay to use to minimize local load... */ if(scheduling_info.total_scheduled_services > 0 && scheduling_info.service_check_interval_total > 0) { /* calculate the average inter check delay (in seconds) needed to evenly space the service checks out */ scheduling_info.average_service_inter_check_delay = (double)(scheduling_info.average_service_check_interval / (double)scheduling_info.total_scheduled_services); /* set the global inter check delay value */ scheduling_info.service_inter_check_delay = scheduling_info.average_service_inter_check_delay; /* calculate max inter check delay and see if we should use that instead */ max_inter_check_delay = (double)((scheduling_info.max_service_check_spread * 60.0) / (double)scheduling_info.total_scheduled_services); if(scheduling_info.service_inter_check_delay > max_inter_check_delay) scheduling_info.service_inter_check_delay = max_inter_check_delay; } else scheduling_info.service_inter_check_delay = 0.0; log_debug_info(DEBUGL_EVENTS, 1, "Total scheduled service checks: %d\n", scheduling_info.total_scheduled_services); log_debug_info(DEBUGL_EVENTS, 1, "Average service check interval: %0.2f sec\n", scheduling_info.average_service_check_interval); log_debug_info(DEBUGL_EVENTS, 1, "Service inter-check delay: %0.2f sec\n", scheduling_info.service_inter_check_delay); } /* how should we determine the service interleave factor? */ switch(service_interleave_factor_method) { case ILF_USER: /* the user supplied a value, so don't do any calculation */ break; case ILF_SMART: default: /* protect against a divide by zero problem - shouldn't happen, but just in case... */ if(scheduling_info.total_hosts == 0) scheduling_info.total_hosts = 1; scheduling_info.service_interleave_factor = (int)(ceil(scheduling_info.average_scheduled_services_per_host)); log_debug_info(DEBUGL_EVENTS, 1, "Total scheduled service checks: %d\n", scheduling_info.total_scheduled_services); log_debug_info(DEBUGL_EVENTS, 1, "Total hosts: %d\n", scheduling_info.total_hosts); log_debug_info(DEBUGL_EVENTS, 1, "Service Interleave factor: %d\n", scheduling_info.service_interleave_factor); } /* calculate number of service interleave blocks */ if(scheduling_info.service_interleave_factor == 0) total_interleave_blocks = scheduling_info.total_scheduled_services; else total_interleave_blocks = (int)ceil((double)scheduling_info.total_scheduled_services / (double)scheduling_info.service_interleave_factor); scheduling_info.first_service_check = (time_t)0L; scheduling_info.last_service_check = (time_t)0L; log_debug_info(DEBUGL_EVENTS, 1, "Total scheduled services: %d\n", scheduling_info.total_scheduled_services); log_debug_info(DEBUGL_EVENTS, 1, "Service Interleave factor: %d\n", scheduling_info.service_interleave_factor); log_debug_info(DEBUGL_EVENTS, 1, "Total service interleave blocks: %d\n", total_interleave_blocks); log_debug_info(DEBUGL_EVENTS, 1, "Service inter-check delay: %2.1f\n", scheduling_info.service_inter_check_delay); if(test_scheduling == TRUE) gettimeofday(&tv[3], NULL); /******** SCHEDULE SERVICE CHECKS ********/ log_debug_info(DEBUGL_EVENTS, 2, "Scheduling service checks...\n"); /* determine check times for service checks (with interleaving to minimize remote load) */ current_interleave_block = 0; for(temp_service = service_list; temp_service != NULL && scheduling_info.service_interleave_factor > 0;) { log_debug_info(DEBUGL_EVENTS, 2, "Current Interleave Block: %d\n", current_interleave_block); for(interleave_block_index = 0; interleave_block_index < scheduling_info.service_interleave_factor && temp_service != NULL; temp_service = temp_service->next) { log_debug_info(DEBUGL_EVENTS, 2, "Service '%s' on host '%s'\n", temp_service->description, temp_service->host_name); /* skip this service if it shouldn't be scheduled */ if(temp_service->should_be_scheduled == FALSE) { log_debug_info(DEBUGL_EVENTS, 2, "Service check should not be scheduled.\n"); continue; } /* * skip services that are already scheduled for the (near) * future from retention data, but reschedule ones that * were supposed to happen while we weren't running... * We check to make sure the check isn't scheduled to run * far in the future to make sure checks who've hade their * timeperiods changed during the restart aren't left * hanging too long without being run. */ check_delay = temp_service->next_check - current_time; if(check_delay > 0 && check_delay < check_window(temp_service)) { log_debug_info(DEBUGL_EVENTS, 2, "Service is already scheduled to be checked in the future: %s\n", ctime(&temp_service->next_check)); continue; } /* interleave block index should only be increased when we find a schedulable service */ /* moved from for() loop 11/05/05 EG */ interleave_block_index++; mult_factor = current_interleave_block + (interleave_block_index * total_interleave_blocks); log_debug_info(DEBUGL_EVENTS, 2, "CIB: %d, IBI: %d, TIB: %d, SIF: %d\n", current_interleave_block, interleave_block_index, total_interleave_blocks, scheduling_info.service_interleave_factor); log_debug_info(DEBUGL_EVENTS, 2, "Mult factor: %d\n", mult_factor); /* * set the preferred next check time for the service * If we end up too far into the future, grab a random * time within the service's window instead. */ check_delay = mult_factor * scheduling_info.service_inter_check_delay; if(check_delay > check_window(temp_service)) { log_debug_info(DEBUGL_EVENTS, 0, " Fixing check time %lu secs too far away\n", check_delay - check_window(temp_service)); fixed_services++; check_delay = ranged_urand(0, check_window(temp_service)); log_debug_info(DEBUGL_EVENTS, 0, " New check offset: %d\n", check_delay); } temp_service->next_check = (time_t)(current_time + check_delay); log_debug_info(DEBUGL_EVENTS, 2, "Preferred Check Time: %lu --> %s\n", (unsigned long)temp_service->next_check, ctime(&temp_service->next_check)); /* make sure the service can actually be scheduled when we want */ is_valid_time = check_time_against_period(temp_service->next_check, temp_service->check_period_ptr); if(is_valid_time == ERROR) { log_debug_info(DEBUGL_EVENTS, 2, "Preferred Time is Invalid In Timeperiod '%s': %lu --> %s\n", temp_service->check_period_ptr->name, (unsigned long)temp_service->next_check, ctime(&temp_service->next_check)); get_next_valid_time(temp_service->next_check, &next_valid_time, temp_service->check_period_ptr); temp_service->next_check = (time_t)(next_valid_time + check_delay); } log_debug_info(DEBUGL_EVENTS, 2, "Actual Check Time: %lu --> %s\n", (unsigned long)temp_service->next_check, ctime(&temp_service->next_check)); if(scheduling_info.first_service_check == (time_t)0 || (temp_service->next_check < scheduling_info.first_service_check)) scheduling_info.first_service_check = temp_service->next_check; if(temp_service->next_check > scheduling_info.last_service_check) scheduling_info.last_service_check = temp_service->next_check; } current_interleave_block++; } if(test_scheduling == TRUE) gettimeofday(&tv[4], NULL); /* add scheduled service checks to event queue */ for(temp_service = service_list; temp_service != NULL; temp_service = temp_service->next) { /* Nagios XI/NDOUtils MOD */ /* update status of all services (scheduled or not) */ update_service_status(temp_service, FALSE); /* skip most services that shouldn't be scheduled */ if(temp_service->should_be_scheduled == FALSE) { /* passive checks are an exception if a forced check was scheduled before Nagios was restarted */ if(!(temp_service->checks_enabled == FALSE && temp_service->next_check != (time_t)0L && (temp_service->check_options & CHECK_OPTION_FORCE_EXECUTION))) continue; } /* create a new service check event */ temp_service->next_check_event = schedule_new_event(EVENT_SERVICE_CHECK, FALSE, temp_service->next_check, FALSE, 0, NULL, TRUE, (void *)temp_service, NULL, temp_service->check_options); } if(test_scheduling == TRUE) gettimeofday(&tv[5], NULL); /******** DETERMINE HOST SCHEDULING PARAMS ********/ log_debug_info(DEBUGL_EVENTS, 2, "Determining host scheduling parameters...\n"); scheduling_info.first_host_check = (time_t)0L; scheduling_info.last_host_check = (time_t)0L; /* default max host check spread (in minutes) */ scheduling_info.max_host_check_spread = max_host_check_spread; /* how should we determine the host inter-check delay to use? */ switch(host_inter_check_delay_method) { case ICD_NONE: /* don't spread checks out */ scheduling_info.host_inter_check_delay = 0.0; break; case ICD_DUMB: /* be dumb and just schedule checks 1 second apart */ scheduling_info.host_inter_check_delay = 1.0; break; case ICD_USER: /* the user specified a delay, so don't try to calculate one */ break; case ICD_SMART: default: /* be smart and calculate the best delay to use to minimize local load... */ if(scheduling_info.total_scheduled_hosts > 0 && scheduling_info.host_check_interval_total > 0) { /* adjust the check interval total to correspond to the interval length */ scheduling_info.host_check_interval_total = (scheduling_info.host_check_interval_total * interval_length); /* calculate the average check interval for hosts */ scheduling_info.average_host_check_interval = (double)((double)scheduling_info.host_check_interval_total / (double)scheduling_info.total_scheduled_hosts); /* calculate the average inter check delay (in seconds) needed to evenly space the host checks out */ scheduling_info.average_host_inter_check_delay = (double)(scheduling_info.average_host_check_interval / (double)scheduling_info.total_scheduled_hosts); /* set the global inter check delay value */ scheduling_info.host_inter_check_delay = scheduling_info.average_host_inter_check_delay; /* calculate max inter check delay and see if we should use that instead */ max_inter_check_delay = (double)((scheduling_info.max_host_check_spread * 60.0) / (double)scheduling_info.total_scheduled_hosts); if(scheduling_info.host_inter_check_delay > max_inter_check_delay) scheduling_info.host_inter_check_delay = max_inter_check_delay; } else scheduling_info.host_inter_check_delay = 0.0; log_debug_info(DEBUGL_EVENTS, 2, "Total scheduled host checks: %d\n", scheduling_info.total_scheduled_hosts); log_debug_info(DEBUGL_EVENTS, 2, "Host check interval total: %lu\n", scheduling_info.host_check_interval_total); log_debug_info(DEBUGL_EVENTS, 2, "Average host check interval: %0.2f sec\n", scheduling_info.average_host_check_interval); log_debug_info(DEBUGL_EVENTS, 2, "Host inter-check delay: %0.2f sec\n", scheduling_info.host_inter_check_delay); } if(test_scheduling == TRUE) gettimeofday(&tv[6], NULL); /******** SCHEDULE HOST CHECKS ********/ log_debug_info(DEBUGL_EVENTS, 2, "Scheduling host checks...\n"); /* determine check times for host checks */ mult_factor = 0; for(temp_host = host_list; temp_host != NULL; temp_host = temp_host->next) { log_debug_info(DEBUGL_EVENTS, 2, "Host '%s'\n", temp_host->name); /* skip hosts that shouldn't be scheduled */ if(temp_host->should_be_scheduled == FALSE) { log_debug_info(DEBUGL_EVENTS, 2, "Host check should not be scheduled.\n"); continue; } /* skip hosts that are already scheduled for the future (from retention data), but reschedule ones that were supposed to be checked before we started */ if(temp_host->next_check > current_time) { log_debug_info(DEBUGL_EVENTS, 2, "Host is already scheduled to be checked in the future: %s\n", ctime(&temp_host->next_check)); continue; } /* * calculate preferred host check time. * If it's too far into the future, we grab a random time * within this host's max check window instead */ check_delay = mult_factor * scheduling_info.host_inter_check_delay; if(check_delay > check_window(temp_host)) { log_debug_info(DEBUGL_EVENTS, 1, "Fixing check time (off by %lu)\n", check_delay - check_window(temp_host)); fixed_hosts++; check_delay = ranged_urand(0, check_window(temp_host)); } temp_host->next_check = (time_t)(current_time + check_delay); log_debug_info(DEBUGL_EVENTS, 2, "Preferred Check Time: %lu --> %s", (unsigned long)temp_host->next_check, ctime(&temp_host->next_check)); /* make sure the host can actually be scheduled at this time */ is_valid_time = check_time_against_period(temp_host->next_check, temp_host->check_period_ptr); if(is_valid_time == ERROR) { get_next_valid_time(temp_host->next_check, &next_valid_time, temp_host->check_period_ptr); temp_host->next_check = (time_t)(next_valid_time | check_delay); } log_debug_info(DEBUGL_EVENTS, 2, "Actual Check Time: %lu --> %s\n", (unsigned long)temp_host->next_check, ctime(&temp_host->next_check)); if(scheduling_info.first_host_check == (time_t)0 || (temp_host->next_check < scheduling_info.first_host_check)) scheduling_info.first_host_check = temp_host->next_check; if(temp_host->next_check > scheduling_info.last_host_check) scheduling_info.last_host_check = temp_host->next_check; mult_factor++; } log_debug_info(DEBUGL_EVENTS, 0, "Fixed scheduling for %u hosts and %u services\n", fixed_hosts, fixed_services); if(test_scheduling == TRUE) gettimeofday(&tv[7], NULL); /* add scheduled host checks to event queue */ for(temp_host = host_list; temp_host != NULL; temp_host = temp_host->next) { /* Nagios XI/NDOUtils Mod */ /* update status of all hosts (scheduled or not) */ update_host_status(temp_host, FALSE); /* skip most hosts that shouldn't be scheduled */ if(temp_host->should_be_scheduled == FALSE) { /* passive checks are an exception if a forced check was scheduled before Nagios was restarted */ if(!(temp_host->checks_enabled == FALSE && temp_host->next_check != (time_t)0L && (temp_host->check_options & CHECK_OPTION_FORCE_EXECUTION))) continue; } /* schedule a new host check event */ temp_host->next_check_event = schedule_new_event(EVENT_HOST_CHECK, FALSE, temp_host->next_check, FALSE, 0, NULL, TRUE, (void *)temp_host, NULL, temp_host->check_options); } if(test_scheduling == TRUE) gettimeofday(&tv[8], NULL); /******** SCHEDULE MISC EVENTS ********/ /* add a host and service check rescheduling event */ if(auto_reschedule_checks == TRUE) schedule_new_event(EVENT_RESCHEDULE_CHECKS, TRUE, current_time + auto_rescheduling_interval, TRUE, auto_rescheduling_interval, NULL, TRUE, NULL, NULL, 0); /* add a check result reaper event */ schedule_new_event(EVENT_CHECK_REAPER, TRUE, current_time + check_reaper_interval, TRUE, check_reaper_interval, NULL, TRUE, NULL, NULL, 0); /* add an orphaned check event */ if(check_orphaned_services == TRUE || check_orphaned_hosts == TRUE) schedule_new_event(EVENT_ORPHAN_CHECK, TRUE, current_time + DEFAULT_ORPHAN_CHECK_INTERVAL, TRUE, DEFAULT_ORPHAN_CHECK_INTERVAL, NULL, TRUE, NULL, NULL, 0); /* add a service result "freshness" check event */ if(check_service_freshness == TRUE) schedule_new_event(EVENT_SFRESHNESS_CHECK, TRUE, current_time + service_freshness_check_interval, TRUE, service_freshness_check_interval, NULL, TRUE, NULL, NULL, 0); /* add a host result "freshness" check event */ if(check_host_freshness == TRUE) schedule_new_event(EVENT_HFRESHNESS_CHECK, TRUE, current_time + host_freshness_check_interval, TRUE, host_freshness_check_interval, NULL, TRUE, NULL, NULL, 0); /* add a status save event */ schedule_new_event(EVENT_STATUS_SAVE, TRUE, current_time + status_update_interval, TRUE, status_update_interval, NULL, TRUE, NULL, NULL, 0); /* add a log rotation event if necessary */ if(log_rotation_method != LOG_ROTATION_NONE) schedule_new_event(EVENT_LOG_ROTATION, TRUE, get_next_log_rotation_time(), TRUE, 0, (void *)get_next_log_rotation_time, TRUE, NULL, NULL, 0); /* add a retention data save event if needed */ if(retain_state_information == TRUE && retention_update_interval > 0) schedule_new_event(EVENT_RETENTION_SAVE, TRUE, current_time + (retention_update_interval * 60), TRUE, (retention_update_interval * 60), NULL, TRUE, NULL, NULL, 0); if(test_scheduling == TRUE) { runtime[0] = (double)((double)(tv[1].tv_sec - tv[0].tv_sec) + (double)((tv[1].tv_usec - tv[0].tv_usec) / 1000.0) / 1000.0); runtime[1] = (double)((double)(tv[2].tv_sec - tv[1].tv_sec) + (double)((tv[2].tv_usec - tv[1].tv_usec) / 1000.0) / 1000.0); runtime[2] = (double)((double)(tv[3].tv_sec - tv[2].tv_sec) + (double)((tv[3].tv_usec - tv[2].tv_usec) / 1000.0) / 1000.0); runtime[3] = (double)((double)(tv[4].tv_sec - tv[3].tv_sec) + (double)((tv[4].tv_usec - tv[3].tv_usec) / 1000.0) / 1000.0); runtime[4] = (double)((double)(tv[5].tv_sec - tv[4].tv_sec) + (double)((tv[5].tv_usec - tv[4].tv_usec) / 1000.0) / 1000.0); runtime[5] = (double)((double)(tv[6].tv_sec - tv[5].tv_sec) + (double)((tv[6].tv_usec - tv[5].tv_usec) / 1000.0) / 1000.0); runtime[6] = (double)((double)(tv[7].tv_sec - tv[6].tv_sec) + (double)((tv[7].tv_usec - tv[6].tv_usec) / 1000.0) / 1000.0); runtime[7] = (double)((double)(tv[8].tv_sec - tv[7].tv_sec) + (double)((tv[8].tv_usec - tv[7].tv_usec) / 1000.0) / 1000.0); runtime[8] = (double)((double)(tv[8].tv_sec - tv[0].tv_sec) + (double)((tv[8].tv_usec - tv[0].tv_usec) / 1000.0) / 1000.0); printf("EVENT SCHEDULING TIMES\n"); printf("-------------------------------------\n"); printf("Get service info: %.6lf sec\n", runtime[0]); printf("Get host info info: %.6lf sec\n", runtime[1]); printf("Get service params: %.6lf sec\n", runtime[2]); printf("Schedule service times: %.6lf sec\n", runtime[3]); printf("Schedule service events: %.6lf sec\n", runtime[4]); printf("Get host params: %.6lf sec\n", runtime[5]); printf("Schedule host times: %.6lf sec\n", runtime[6]); printf("Schedule host events: %.6lf sec\n", runtime[7]); printf(" ============\n"); printf("TOTAL: %.6lf sec\n", runtime[8]); printf("\n\n"); } log_debug_info(DEBUGL_FUNCTIONS, 0, "init_timing_loop() end\n"); return; } /* displays service check scheduling information */ void display_scheduling_info(void) { float minimum_concurrent_checks = 0.0; int suggestions = 0; printf("Projected scheduling information for host and service checks\n"); printf("is listed below. This information assumes that you are going\n"); printf("to start running Nagios with your current config files.\n\n"); printf("HOST SCHEDULING INFORMATION\n"); printf("---------------------------\n"); printf("Total hosts: %d\n", scheduling_info.total_hosts); printf("Total scheduled hosts: %d\n", scheduling_info.total_scheduled_hosts); printf("Host inter-check delay method: "); if(host_inter_check_delay_method == ICD_NONE) printf("NONE\n"); else if(host_inter_check_delay_method == ICD_DUMB) printf("DUMB\n"); else if(host_inter_check_delay_method == ICD_SMART) { printf("SMART\n"); printf("Average host check interval: %.2f sec\n", scheduling_info.average_host_check_interval); } else printf("USER-SUPPLIED VALUE\n"); printf("Host inter-check delay: %.2f sec\n", scheduling_info.host_inter_check_delay); printf("Max host check spread: %d min\n", scheduling_info.max_host_check_spread); printf("First scheduled check: %s", (scheduling_info.total_scheduled_hosts == 0) ? "N/A\n" : ctime(&scheduling_info.first_host_check)); printf("Last scheduled check: %s", (scheduling_info.total_scheduled_hosts == 0) ? "N/A\n" : ctime(&scheduling_info.last_host_check)); printf("\n\n"); printf("SERVICE SCHEDULING INFORMATION\n"); printf("-------------------------------\n"); printf("Total services: %d\n", scheduling_info.total_services); printf("Total scheduled services: %d\n", scheduling_info.total_scheduled_services); printf("Service inter-check delay method: "); if(service_inter_check_delay_method == ICD_NONE) printf("NONE\n"); else if(service_inter_check_delay_method == ICD_DUMB) printf("DUMB\n"); else if(service_inter_check_delay_method == ICD_SMART) { printf("SMART\n"); printf("Average service check interval: %.2f sec\n", scheduling_info.average_service_check_interval); } else printf("USER-SUPPLIED VALUE\n"); printf("Inter-check delay: %.2f sec\n", scheduling_info.service_inter_check_delay); printf("Interleave factor method: %s\n", (service_interleave_factor_method == ILF_USER) ? "USER-SUPPLIED VALUE" : "SMART"); if(service_interleave_factor_method == ILF_SMART) printf("Average services per host: %.2f\n", scheduling_info.average_services_per_host); printf("Service interleave factor: %d\n", scheduling_info.service_interleave_factor); printf("Max service check spread: %d min\n", scheduling_info.max_service_check_spread); printf("First scheduled check: %s", ctime(&scheduling_info.first_service_check)); printf("Last scheduled check: %s", ctime(&scheduling_info.last_service_check)); printf("\n\n"); /***** MINIMUM CONCURRENT CHECKS RECOMMENDATION *****/ minimum_concurrent_checks = ceil((((scheduling_info.total_scheduled_services / scheduling_info.average_service_check_interval) + (scheduling_info.total_scheduled_hosts / scheduling_info.average_host_check_interval)) * 1.4 * scheduling_info.average_service_execution_time)); printf("CHECK PROCESSING INFORMATION\n"); printf("----------------------------\n"); printf("Average check execution time: %.2fs%s", scheduling_info.average_service_execution_time, scheduling_info.average_service_execution_time == 2.0 ? " (pessimistic guesstimate)\n" : "\n"); printf("Estimated concurrent checks: %.0f (%.2f per cpu core)\n", minimum_concurrent_checks, (float)minimum_concurrent_checks / (float)online_cpus()); printf("Max concurrent service checks: "); if(max_parallel_service_checks == 0) printf("Unlimited\n"); else printf("%d\n", max_parallel_service_checks); printf("\n\n"); printf("PERFORMANCE SUGGESTIONS\n"); printf("-----------------------\n"); /* compare with configured value */ if(((int)minimum_concurrent_checks > max_parallel_service_checks) && max_parallel_service_checks != 0) { printf("* Value for 'max_concurrent_checks' option should be >= %d\n", (int)minimum_concurrent_checks); suggestions++; } if(loadctl.nofile_limit * 0.4 < minimum_concurrent_checks) { printf("* Increase the \"open files\" ulimit for user '%s'\n", nagios_user); printf(" - You can do this by adding\n %s hard nofiles %d\n to /etc/security/limits.conf\n", nagios_user, rup2pof2(minimum_concurrent_checks * 2)); suggestions++; } if(loadctl.nproc_limit * 0.75 < minimum_concurrent_checks) { printf("* Increase the \"max user processes\" ulimit for user '%s'\n", nagios_user); printf(" - You can do this by adding\n %s hard nproc %d\n to /etc/security/limits.conf\n", nagios_user, rup2pof2(minimum_concurrent_checks)); suggestions++; } if(minimum_concurrent_checks > online_cpus() * 75) { printf("* Aim for a max of 50 concurrent checks / cpu core (current: %.2f)\n", (float)minimum_concurrent_checks / (float)online_cpus()); suggestions++; } if(suggestions) { printf("\nNOTE: These are just guidelines and *not* hard numbers.\n\n"); printf("Ultimately, only testing will tell if your settings and hardware are\n"); printf("suitable for the types and number of checks you're planning to run.\n"); } else { printf("I have no suggestions - things look okay.\n"); } printf("\n"); return; } /* * Create the event queue * We oversize it somewhat to avoid unnecessary growing */ int init_event_queue(void) { unsigned int size; size = num_objects.hosts + num_objects.services; if(size < 4096) size = 4096; nagios_squeue = squeue_create(size); return 0; } /* schedule a new timed event */ timed_event *schedule_new_event(int event_type, int high_priority, time_t run_time, int recurring, unsigned long event_interval, void *timing_func, int compensate_for_time_change, void *event_data, void *event_args, int event_options) { timed_event *new_event; char run_time_string[MAX_DATETIME_LENGTH] = ""; log_debug_info(DEBUGL_FUNCTIONS, 0, "schedule_new_event()\n"); get_datetime_string(&run_time, run_time_string, MAX_DATETIME_LENGTH, SHORT_DATE_TIME); log_debug_info(DEBUGL_EVENTS, 0, "New Event Details:\n"); log_debug_info(DEBUGL_EVENTS, 0, " Type: EVENT_%s\n", EVENT_TYPE_STR(event_type)); log_debug_info(DEBUGL_EVENTS, 0, " High Priority: %s\n", ( high_priority ? "Yes" : "No")); log_debug_info(DEBUGL_EVENTS, 0, " Run Time: %s\n", run_time_string); log_debug_info(DEBUGL_EVENTS, 0, " Recurring: %s\n", ( recurring ? "Yes" : "No")); log_debug_info(DEBUGL_EVENTS, 0, " Event Interval: %lu\n", event_interval); log_debug_info(DEBUGL_EVENTS, 0, " Compensate for Time Change: %s\n", ( compensate_for_time_change ? "Yes" : "No")); log_debug_info(DEBUGL_EVENTS, 0, " Event Options: %d\n", event_options); new_event = (timed_event *)calloc(1, sizeof(timed_event)); if(new_event != NULL) { new_event->event_type = event_type; new_event->event_data = event_data; new_event->event_args = event_args; new_event->event_options = event_options; new_event->run_time = run_time; new_event->recurring = recurring; new_event->event_interval = event_interval; new_event->timing_func = timing_func; new_event->compensate_for_time_change = compensate_for_time_change; new_event->priority = high_priority; } else return NULL; log_debug_info(DEBUGL_EVENTS, 0, " Event ID: %p\n", new_event); /* add the event to the event list */ add_event(nagios_squeue, new_event); return new_event; } /* reschedule an event in order of execution time */ void reschedule_event(squeue_t *sq, timed_event *event) { time_t current_time = 0L; time_t (*timingfunc)(void); log_debug_info(DEBUGL_FUNCTIONS, 0, "reschedule_event()\n"); /* reschedule recurring events... */ if(event->recurring == TRUE) { /* use custom timing function */ if(event->timing_func != NULL) { timingfunc = event->timing_func; event->run_time = (*timingfunc)(); } /* normal recurring events */ else { event->run_time = event->run_time + event->event_interval; time(¤t_time); if(event->run_time < current_time) event->run_time = current_time; } } /* add the event to the event list */ add_event(sq, event); return; } /* add an event to list ordered by execution time */ void add_event(squeue_t *sq, timed_event *event) { log_debug_info(DEBUGL_FUNCTIONS, 0, "add_event()\n"); if(event->sq_event) { logit(NSLOG_RUNTIME_ERROR, TRUE, "Error: Adding %s event that seems to already be scheduled\n", EVENT_TYPE_STR(event->event_type)); remove_event(sq, event); } if(event->priority) { event->sq_event = squeue_add_usec(sq, event->run_time, event->priority - 1, event); } else { event->sq_event = squeue_add(sq, event->run_time, event); } if(!event->sq_event) { logit(NSLOG_RUNTIME_ERROR, TRUE, "Error: Failed to add event to squeue '%p' with prio %u: %s\n", sq, event->priority, strerror(errno)); } if(sq == nagios_squeue) track_events(event->event_type, +1); #ifdef USE_EVENT_BROKER else { /* send event data to broker */ broker_timed_event(NEBTYPE_TIMEDEVENT_ADD, NEBFLAG_NONE, NEBATTR_NONE, event, NULL); } #endif return; } /* remove an event from the queue */ void remove_event(squeue_t *sq, timed_event *event) { #ifdef USE_EVENT_BROKER /* send event data to broker */ broker_timed_event(NEBTYPE_TIMEDEVENT_REMOVE, NEBFLAG_NONE, NEBATTR_NONE, event, NULL); #endif if(!event || !event->sq_event) return; if (sq) squeue_remove(sq, event->sq_event); else logit(NSLOG_RUNTIME_ERROR, TRUE, "Error: remove_event() called for %s event with NULL sq parameter\n", EVENT_TYPE_STR(event->event_type)); if(sq == nagios_squeue) track_events(event->event_type, -1); event->sq_event = NULL; /* mark this event as unscheduled */ /* * if we catch an event from the queue which gets removed when * we go polling for input (as might happen with f.e. downtime * events that we get "cancel" commands for just as they are * about to start or expire), we must make sure we mark the * current event as no longer scheduled, or we'll run into * segfaults and memory corruptions for sure. */ if (event == current_event) { current_event = NULL; } } static int should_run_event(timed_event *temp_event) { int run_event = TRUE; /* default action is to execute the event */ int nudge_seconds = 0; /* we only care about jobs that cause processes to run */ if (temp_event->event_type != EVENT_HOST_CHECK && temp_event->event_type != EVENT_SERVICE_CHECK) { return TRUE; } /* if we can't spawn any more jobs, don't bother */ if (!wproc_can_spawn(&loadctl)) { wproc_reap(1, 1); /* Try to reap one job for one msec. */ return FALSE; } /* run a few checks before executing a service check... */ if(temp_event->event_type == EVENT_SERVICE_CHECK) { service *temp_service = (service *)temp_event->event_data; /* forced checks override normal check logic */ if((temp_service->check_options & CHECK_OPTION_FORCE_EXECUTION)) return TRUE; /* don't run a service check if we're already maxed out on the number of parallel service checks... */ if(max_parallel_service_checks != 0 && (currently_running_service_checks >= max_parallel_service_checks)) { nudge_seconds = ranged_urand(NUDGE_MIN, NUDGE_MAX); logit(NSLOG_RUNTIME_WARNING, TRUE, "\tMax concurrent service checks (%d) has been reached. Nudging %s:%s by %d seconds...\n", max_parallel_service_checks, temp_service->host_name, temp_service->description, nudge_seconds); run_event = FALSE; } /* don't run a service check if active checks are disabled */ if(execute_service_checks == FALSE) { log_debug_info(DEBUGL_EVENTS | DEBUGL_CHECKS, 1, "We're not executing service checks right now, so we'll skip check event for service '%s;%s'.\n", temp_service->host_name, temp_service->description); run_event = FALSE; } /* reschedule the check if we can't run it now */ if(run_event == FALSE) { remove_event(nagios_squeue, temp_event); if(nudge_seconds) { /* We nudge the next check time when it is due to too many concurrent service checks */ temp_service->next_check = (time_t)(temp_service->next_check + nudge_seconds); } else { temp_service->next_check += check_window(temp_service); } temp_event->run_time = temp_service->next_check; reschedule_event(nagios_squeue, temp_event); update_service_status(temp_service, FALSE); run_event = FALSE; } } /* run a few checks before executing a host check... */ else if(temp_event->event_type == EVENT_HOST_CHECK) { host *temp_host = (host *)temp_event->event_data; /* forced checks override normal check logic */ if((temp_host->check_options & CHECK_OPTION_FORCE_EXECUTION)) return TRUE; /* don't run a host check if active checks are disabled */ if(execute_host_checks == FALSE) { log_debug_info(DEBUGL_EVENTS | DEBUGL_CHECKS, 1, "We're not executing host checks right now, so we'll skip host check event for host '%s'.\n", temp_host->name); run_event = FALSE; } /* reschedule the host check if we can't run it right now */ if(run_event == FALSE) { remove_event(nagios_squeue, temp_event); temp_host->next_check += check_window(temp_host); temp_event->run_time = temp_host->next_check; reschedule_event(nagios_squeue, temp_event); update_host_status(temp_host, FALSE); run_event = FALSE; } } return run_event; } /* this is the main event handler loop */ int event_execution_loop(void) { timed_event *temp_event, *last_event = NULL; time_t last_time = 0L; time_t current_time = 0L; time_t last_status_update = 0L; int poll_time_ms; log_debug_info(DEBUGL_FUNCTIONS, 0, "event_execution_loop() start\n"); time(&last_time); while(1) { struct timeval now; const struct timeval *event_runtime; int inputs; /* super-priority (hardcoded) events come first */ /* see if we should exit or restart (a signal was encountered) */ if(sigshutdown == TRUE || sigrestart == TRUE) break; /* get the current time */ time(¤t_time); /* hey, wait a second... we traveled back in time! */ if(current_time < last_time) compensate_for_system_time_change((unsigned long)last_time, (unsigned long)current_time); /* else if the time advanced over the specified threshold, try and compensate... */ else if((current_time - last_time) >= time_change_threshold) compensate_for_system_time_change((unsigned long)last_time, (unsigned long)current_time); /* get next scheduled event */ current_event = temp_event = (timed_event *)squeue_peek(nagios_squeue); /* if we don't have any events to handle, exit */ if(!temp_event) { log_debug_info(DEBUGL_EVENTS, 0, "There aren't any events that need to be handled! Exiting...\n"); break; } /* keep track of the last time */ last_time = current_time; /* update status information occasionally - NagVis watches the NDOUtils DB to see if Nagios is alive */ if((unsigned long)(current_time - last_status_update) > 5) { last_status_update = current_time; update_program_status(FALSE); } event_runtime = squeue_event_runtime(temp_event->sq_event); if (temp_event != last_event) { log_debug_info(DEBUGL_EVENTS, 1, "** Event Check Loop\n"); log_debug_info(DEBUGL_EVENTS, 1, "Next Event Time: %s", ctime(&temp_event->run_time)); log_debug_info(DEBUGL_EVENTS, 1, "Current/Max Service Checks: %d/%d (%.3lf%% saturation)\n", currently_running_service_checks, max_parallel_service_checks, ((float)currently_running_service_checks / (float)max_parallel_service_checks) * 100); } last_event = temp_event; gettimeofday(&now, NULL); poll_time_ms = tv_delta_msec(&now, event_runtime); if (poll_time_ms < 0) poll_time_ms = 0; else if(poll_time_ms >= 1500) poll_time_ms = 1500; log_debug_info(DEBUGL_SCHEDULING | DEBUGL_IPC, 1, "## Polling %dms; sockets=%d; events=%u; iobs=%p\n", poll_time_ms, iobroker_get_num_fds(nagios_iobs), squeue_size(nagios_squeue), nagios_iobs); inputs = iobroker_poll(nagios_iobs, poll_time_ms); if (inputs < 0 && errno != EINTR) { logit(NSLOG_RUNTIME_ERROR, TRUE, "Error: Polling for input on %p failed: %s", nagios_iobs, iobroker_strerror(inputs)); break; } log_debug_info(DEBUGL_IPC, 2, "## %d descriptors had input\n", inputs); /* * if the event we peaked was removed from the queue from * one of the I/O operations, we must take care not to * try to run at, as we're (almost) sure to access free'd * or invalid memory if we do. */ if (!current_event) { log_debug_info(DEBUGL_EVENTS, 0, "Event was cancelled by iobroker input\n"); continue; } /* 5 milliseconds allowance for firing off events early */ gettimeofday(&now, NULL); if (tv_delta_msec(&now, event_runtime) > 5) continue; /* move on if we shouldn't run this event */ if(should_run_event(temp_event) == FALSE) continue; /* handle the event */ handle_timed_event(temp_event); /* * we must remove the entry we've peeked, or * we'll keep getting the same one over and over. * This also maintains sync with broker modules. */ remove_event(nagios_squeue, temp_event); /* reschedule the event if necessary */ if(temp_event->recurring == TRUE) reschedule_event(nagios_squeue, temp_event); /* else free memory associated with the event */ else my_free(temp_event); } log_debug_info(DEBUGL_FUNCTIONS, 0, "event_execution_loop() end\n"); return OK; } /* handles a timed event */ int handle_timed_event(timed_event *event) { host *temp_host = NULL; service *temp_service = NULL; void (*userfunc)(void *); struct timeval tv; const struct timeval *event_runtime; double latency; log_debug_info(DEBUGL_FUNCTIONS, 0, "handle_timed_event() start\n"); #ifdef USE_EVENT_BROKER /* send event data to broker */ broker_timed_event(NEBTYPE_TIMEDEVENT_EXECUTE, NEBFLAG_NONE, NEBATTR_NONE, event, NULL); #endif log_debug_info(DEBUGL_EVENTS, 0, "** Timed Event ** Type: EVENT_%s, Run Time: %s", EVENT_TYPE_STR(event->event_type), ctime(&event->run_time)); /* get event latency */ gettimeofday(&tv, NULL); event_runtime = squeue_event_runtime(event->sq_event); latency = (double)(tv_delta_f(event_runtime, &tv)); if (latency < 0.0) /* events may run up to 0.005 seconds early */ latency = 0.0; /* how should we handle the event? */ switch(event->event_type) { case EVENT_SERVICE_CHECK: temp_service = (service *)event->event_data; log_debug_info(DEBUGL_EVENTS, 0, "** Service Check Event ==> Host: '%s', Service: '%s', Options: %d, Latency: %f sec\n", temp_service->host_name, temp_service->description, event->event_options, latency); /* run the service check */ run_scheduled_service_check(temp_service, event->event_options, latency); break; case EVENT_HOST_CHECK: temp_host = (host *)event->event_data; log_debug_info(DEBUGL_EVENTS, 0, "** Host Check Event ==> Host: '%s', Options: %d, Latency: %f sec\n", temp_host->name, event->event_options, latency); /* run the host check */ run_scheduled_host_check(temp_host, event->event_options, latency); break; case EVENT_LOG_ROTATION: log_debug_info(DEBUGL_EVENTS, 0, "** Log File Rotation Event. Latency: %.3fs\n", latency); /* rotate the log file */ rotate_log_file(event->run_time); break; case EVENT_PROGRAM_SHUTDOWN: log_debug_info(DEBUGL_EVENTS, 0, "** Program Shutdown Event. Latency: %.3fs\n", latency); /* set the shutdown flag */ sigshutdown = TRUE; /* log the shutdown */ logit(NSLOG_PROCESS_INFO, TRUE, "PROGRAM_SHUTDOWN event encountered, shutting down...\n"); break; case EVENT_PROGRAM_RESTART: log_debug_info(DEBUGL_EVENTS, 0, "** Program Restart Event. Latency: %.3fs\n", latency); /* set the restart flag */ sigrestart = TRUE; /* log the restart */ logit(NSLOG_PROCESS_INFO, TRUE, "PROGRAM_RESTART event encountered, restarting...\n"); break; case EVENT_CHECK_REAPER: log_debug_info(DEBUGL_EVENTS, 0, "** Check Result Reaper. Latency: %.3fs\n", latency); /* reap host and service check results */ reap_check_results(); break; case EVENT_ORPHAN_CHECK: log_debug_info(DEBUGL_EVENTS, 0, "** Orphaned Host and Service Check Event. Latency: %.3fs\n", latency); /* check for orphaned hosts and services */ if(check_orphaned_hosts == TRUE) check_for_orphaned_hosts(); if(check_orphaned_services == TRUE) check_for_orphaned_services(); break; case EVENT_RETENTION_SAVE: log_debug_info(DEBUGL_EVENTS, 0, "** Retention Data Save Event. Latency: %.3fs\n", latency); /* save state retention data */ save_state_information(TRUE); break; case EVENT_STATUS_SAVE: log_debug_info(DEBUGL_EVENTS, 0, "** Status Data Save Event. Latency: %.3fs\n", latency); /* save all status data (program, host, and service) */ update_all_status_data(); break; case EVENT_SCHEDULED_DOWNTIME: log_debug_info(DEBUGL_EVENTS, 0, "** Scheduled Downtime Event. Latency: %.3fs\n", latency); /* process scheduled downtime info */ if(event->event_data) { handle_scheduled_downtime_by_id(*(unsigned long *)event->event_data); free(event->event_data); event->event_data = NULL; } break; case EVENT_SFRESHNESS_CHECK: log_debug_info(DEBUGL_EVENTS, 0, "** Service Result Freshness Check Event. Latency: %.3fs\n", latency); /* check service result freshness */ check_service_result_freshness(); break; case EVENT_HFRESHNESS_CHECK: log_debug_info(DEBUGL_EVENTS, 0, "** Host Result Freshness Check Event. Latency: %.3fs\n", latency); /* check host result freshness */ check_host_result_freshness(); break; case EVENT_EXPIRE_DOWNTIME: log_debug_info(DEBUGL_EVENTS, 0, "** Expire Downtime Event. Latency: %.3fs\n", latency); /* check for expired scheduled downtime entries */ check_for_expired_downtime(); break; case EVENT_RESCHEDULE_CHECKS: /* adjust scheduling of host and service checks */ log_debug_info(DEBUGL_EVENTS, 0, "** Reschedule Checks Event. Latency: %.3fs\n", latency); adjust_check_scheduling(); break; case EVENT_EXPIRE_COMMENT: log_debug_info(DEBUGL_EVENTS, 0, "** Expire Comment Event. Latency: %.3fs\n", latency); /* check for expired comment */ check_for_expired_comment((unsigned long)event->event_data); break; case EVENT_CHECK_PROGRAM_UPDATE: log_debug_info(DEBUGL_EVENTS, 0, "** Check For Program Update. Latency: %.3fs\n", latency); /* check for new versions of Nagios */ check_for_nagios_updates(FALSE, TRUE); break; case EVENT_USER_FUNCTION: log_debug_info(DEBUGL_EVENTS, 0, "** User Function Event. Latency: %.3fs\n", latency); /* run a user-defined function */ if(event->event_data != NULL) { userfunc = event->event_data; (*userfunc)(event->event_args); } break; default: break; } #ifdef USE_EVENT_BROKER /* send event data to broker */ broker_timed_event(NEBTYPE_TIMEDEVENT_END, NEBFLAG_NONE, NEBATTR_NONE, event, NULL); #endif log_debug_info(DEBUGL_FUNCTIONS, 0, "handle_timed_event() end\n"); return OK; } /* The squeue internal event type, declared again here so we can manipulate the * scheduling queue without a malloc/free for each add/remove. * @todo: Refactor this to not depend so heavily on the event queue * implementation, doing so efficiently may require a different scheduling queue * data structure. */ struct squeue_event { unsigned int pos; pqueue_pri_t pri; struct timeval when; void *data; }; /* * Adjusts scheduling of active, non-forced host and service checks. */ void adjust_check_scheduling(void) { pqueue_t *temp_pqueue; /* squeue_t is a typedef of pqueue_t. */ struct squeue_event *sq_event; struct squeue_event **events_to_reschedule; timed_event *temp_event; service *temp_service = NULL; host *temp_host = NULL; const double INTER_CHECK_RESCHEDULE_THRESHOLD = scheduling_info.service_inter_check_delay * 0.25; double inter_check_delay = 0.0; double new_run_time_offset = 0.0; time_t first_window_time; time_t last_window_time; struct timeval last_check_tv = { (time_t)0, (suseconds_t)0 }; int adjust_scheduling = FALSE; int total_checks = 0; int i; log_debug_info(DEBUGL_FUNCTIONS, 0, "adjust_check_scheduling() start\n"); /* Determine our adjustment window. */ first_window_time = time(NULL); last_window_time = first_window_time + auto_rescheduling_window; /* Nothing to do if the first event is after the reschedule window. */ sq_event = pqueue_peek(nagios_squeue); temp_event = sq_event ? sq_event->data : NULL; if (!temp_event || temp_event->run_time > last_window_time) return; /* Get a sorted array of all check events to reschedule. First we need a * duplicate of nagios_squeue so we can get the events in-order without * having to remove them from the original queue. We will use * pqueue_change_priority() to move the check events in the original queue. * @note: This is horribly dependent on implementation details of squeue * and pqueue, but we don't have much choice to avoid a free/malloc of each * squeue_event from the head to last_window_time, or avoid paying the full * O(n lg n) penalty twice to drain and rebuild the queue. */ temp_pqueue = malloc(sizeof(*temp_pqueue)); if (!temp_pqueue) { logit(NSLOG_RUNTIME_ERROR, TRUE, "Failed to allocate queue needed to adjust check scheduling.\n"); return; } *temp_pqueue = *nagios_squeue; /* We need a separate copy of the underlying queue array. */ temp_pqueue->d = malloc(temp_pqueue->size * sizeof(void*)); if (!temp_pqueue->d) { logit(NSLOG_RUNTIME_ERROR, TRUE, "Failed to allocate queue data needed to adjust check scheduling.\n"); free(temp_pqueue); return; } memcpy(temp_pqueue->d, nagios_squeue->d, temp_pqueue->size * sizeof(void*)); temp_pqueue->avail = temp_pqueue->size; /* Now allocate space for a sorted array of check events. We shouldn't need * space for all events, but we can't really calculate how many we'll need * without looking at all events. */ events_to_reschedule = malloc((temp_pqueue->size - 1) * sizeof(void*)); if (!events_to_reschedule) { logit(NSLOG_RUNTIME_ERROR, TRUE, "Failed to allocate memory needed to adjust check scheduling.\n"); pqueue_free(temp_pqueue); /* pqueue_free() to keep the events. */ return; } /* Now we get the events to reschedule and collect some scheduling info. */ while ((sq_event = pqueue_pop(temp_pqueue))) { /* We need a timed_event and event data. */ temp_event = sq_event->data; if (!temp_event || !temp_event->event_data) continue; /* Skip events before our current window. */ if (temp_event->run_time < first_window_time) continue; /* We're done once past the end of the window. */ if (temp_event->run_time > last_window_time) break; switch (temp_event->event_type) { case EVENT_HOST_CHECK: temp_host = temp_event->event_data; /* Leave forced checks. */ if (temp_host->check_options & CHECK_OPTION_FORCE_EXECUTION) continue; break; case EVENT_SERVICE_CHECK: temp_service = temp_event->event_data; /* Leave forced checks. */ if (temp_service->check_options & CHECK_OPTION_FORCE_EXECUTION) continue; break; default: continue; } /* Reschedule if the last check overlap into this one. */ if (last_check_tv.tv_sec > 0 && tv_delta_msec(&last_check_tv, &sq_event->when) < INTER_CHECK_RESCHEDULE_THRESHOLD * 1000) { /* log_debug_info(DEBUGL_SCHEDULING, 2, "Rescheduling event %d: %.3fs delay.\n", total_checks, tv_delta_f(&last_check_tv, &sq_event->when)); */ adjust_scheduling = TRUE; } last_check_tv = sq_event->when; events_to_reschedule[total_checks++] = sq_event; } /* Removing squeue_events from temp_pqueue invalidates the positions of * those events in nagios_squeue, so we need to fix that up before we * return or change their priorities. Start at i=1 since i=0 is unused. */ for (i = 1; i < (int)nagios_squeue->size; ++i) { if ((sq_event = nagios_squeue->d[i])) sq_event->pos = i; } /* No checks to reschedule, nothing to do... */ if (total_checks < 2 || !adjust_scheduling) { log_debug_info(DEBUGL_SCHEDULING, 0, "No events need to be rescheduled (%d checks in %ds window).\n", total_checks, auto_rescheduling_window); pqueue_free(temp_pqueue); free(events_to_reschedule); return; } inter_check_delay = auto_rescheduling_window / (double)total_checks; log_debug_info(DEBUGL_SCHEDULING, 0, "Rescheduling events: %d checks in %ds window, ICD: %.3fs.\n", total_checks, auto_rescheduling_window, inter_check_delay); /* Now smooth out the schedule. */ new_run_time_offset = inter_check_delay * 0.5; for (i = 0; i < total_checks; ++i, new_run_time_offset += inter_check_delay) { struct timeval new_run_time; /* All events_to_reschedule are valid squeue_events with data pointers * to timed_events for non-forced host or service checks. */ sq_event = events_to_reschedule[i]; temp_event = sq_event->data; /* Calculate and apply a new queue 'when' time. */ new_run_time.tv_sec = first_window_time + (time_t)floor(new_run_time_offset); new_run_time.tv_usec = (suseconds_t)(fmod(new_run_time_offset, 1.0) * 1E6); /* log_debug_info(DEBUGL_SCHEDULING, 2, "Check %d: offset %.3fs, new run time %lu.%06ld.\n", i, new_run_time_offset, (unsigned long)new_run_time.tv_sec, (long)new_run_time.tv_usec); */ squeue_change_priority_tv(nagios_squeue, sq_event, &new_run_time); if (temp_event->run_time != new_run_time.tv_sec) temp_event->run_time = new_run_time.tv_sec; switch (temp_event->event_type) { case EVENT_HOST_CHECK: temp_host = temp_event->event_data; if (temp_host->next_check != new_run_time.tv_sec) { temp_host->next_check = new_run_time.tv_sec; update_host_status(temp_host, FALSE); } break; case EVENT_SERVICE_CHECK: temp_service = temp_event->event_data; if (temp_service->next_check != new_run_time.tv_sec) { temp_service->next_check = new_run_time.tv_sec; update_service_status(temp_service, FALSE); } break; default: break; } } log_debug_info(DEBUGL_FUNCTIONS, 0, "adjust_check_scheduling() end\n"); pqueue_free(temp_pqueue); free(events_to_reschedule); return; } static void adjust_squeue_for_time_change(squeue_t **q, int delta) { timed_event *event; squeue_t *sq_new; /* * this is pretty inefficient in terms of free() + malloc(), * but it should be pretty rare that we have to adjust times * so we go with the well-tested codepath. */ sq_new = squeue_create(squeue_size(*q)); while ((event = squeue_pop(*q))) { if (event->compensate_for_time_change == TRUE) { if (event->timing_func) { time_t (*timingfunc)(void); timingfunc = event->timing_func; event->run_time = timingfunc(); } else { event->run_time += delta; } } if(event->priority) { event->sq_event = squeue_add_usec(sq_new, event->run_time, event->priority - 1, event); } else { event->sq_event = squeue_add(sq_new, event->run_time, event); } } squeue_destroy(*q, 0); *q = sq_new; } /* attempts to compensate for a change in the system time */ void compensate_for_system_time_change(unsigned long last_time, unsigned long current_time) { unsigned long time_difference = 0L; service *temp_service = NULL; host *temp_host = NULL; int days = 0; int hours = 0; int minutes = 0; int seconds = 0; int delta = 0; log_debug_info(DEBUGL_FUNCTIONS, 0, "compensate_for_system_time_change() start\n"); /* * if current_time < last_time, delta will be negative so we can * still use addition to all effected timestamps */ delta = current_time - last_time; /* we moved back in time... */ if(last_time > current_time) { time_difference = last_time - current_time; get_time_breakdown(time_difference, &days, &hours, &minutes, &seconds); log_debug_info(DEBUGL_EVENTS, 0, "Detected a backwards time change of %dd %dh %dm %ds.\n", days, hours, minutes, seconds); } /* we moved into the future... */ else { time_difference = current_time - last_time; get_time_breakdown(time_difference, &days, &hours, &minutes, &seconds); log_debug_info(DEBUGL_EVENTS, 0, "Detected a forwards time change of %dd %dh %dm %ds.\n", days, hours, minutes, seconds); } /* log the time change */ logit(NSLOG_PROCESS_INFO | NSLOG_RUNTIME_WARNING, TRUE, "Warning: A system time change of %d seconds (%dd %dh %dm %ds %s in time) has been detected. Compensating...\n", delta, days, hours, minutes, seconds, (last_time > current_time) ? "backwards" : "forwards"); adjust_squeue_for_time_change(&nagios_squeue, delta); /* adjust service timestamps */ for(temp_service = service_list; temp_service != NULL; temp_service = temp_service->next) { adjust_timestamp_for_time_change(last_time, current_time, time_difference, &temp_service->last_notification); adjust_timestamp_for_time_change(last_time, current_time, time_difference, &temp_service->last_check); adjust_timestamp_for_time_change(last_time, current_time, time_difference, &temp_service->next_check); adjust_timestamp_for_time_change(last_time, current_time, time_difference, &temp_service->last_state_change); adjust_timestamp_for_time_change(last_time, current_time, time_difference, &temp_service->last_hard_state_change); /* recalculate next re-notification time */ temp_service->next_notification = get_next_service_notification_time(temp_service, temp_service->last_notification); /* update the status data */ update_service_status(temp_service, FALSE); } /* adjust host timestamps */ for(temp_host = host_list; temp_host != NULL; temp_host = temp_host->next) { adjust_timestamp_for_time_change(last_time, current_time, time_difference, &temp_host->last_notification); adjust_timestamp_for_time_change(last_time, current_time, time_difference, &temp_host->last_check); adjust_timestamp_for_time_change(last_time, current_time, time_difference, &temp_host->next_check); adjust_timestamp_for_time_change(last_time, current_time, time_difference, &temp_host->last_state_change); adjust_timestamp_for_time_change(last_time, current_time, time_difference, &temp_host->last_hard_state_change); adjust_timestamp_for_time_change(last_time, current_time, time_difference, &temp_host->last_state_history_update); /* recalculate next re-notification time */ temp_host->next_notification = get_next_host_notification_time(temp_host, temp_host->last_notification); /* update the status data */ update_host_status(temp_host, FALSE); } /* adjust program timestamps */ adjust_timestamp_for_time_change(last_time, current_time, time_difference, &program_start); adjust_timestamp_for_time_change(last_time, current_time, time_difference, &event_start); /* update the status data */ update_program_status(FALSE); return; } /* adjusts a timestamp variable in accordance with a system time change */ void adjust_timestamp_for_time_change(time_t last_time, time_t current_time, unsigned long time_difference, time_t *ts) { log_debug_info(DEBUGL_FUNCTIONS, 0, "adjust_timestamp_for_time_change()\n"); /* we shouldn't do anything with epoch values */ if(*ts == (time_t)0) return; /* we moved back in time... */ if(last_time > current_time) { /* we can't precede the UNIX epoch */ if(time_difference > (unsigned long)*ts) *ts = (time_t)0; else *ts = (time_t)(*ts - time_difference); } /* we moved into the future... */ else *ts = (time_t)(*ts + time_difference); return; } nagios-4.3.4/base/flapping.c000066400000000000000000000650111314764422400156720ustar00rootroot00000000000000/***************************************************************************** * * FLAPPING.C - State flap detection and handling routines for Nagios * * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ /*********** COMMON HEADER FILES ***********/ #include "../include/config.h" #include "../include/common.h" #include "../include/objects.h" #include "../include/comments.h" #include "../include/statusdata.h" #include "../include/nagios.h" #include "../include/broker.h" /******************************************************************/ /******************** FLAP DETECTION FUNCTIONS ********************/ /******************************************************************/ /* detects service flapping */ void check_for_service_flapping(service *svc, int update, int allow_flapstart_notification) { int update_history = TRUE; int is_flapping = FALSE; register int x = 0; register int y = 0; int last_state_history_value = STATE_OK; double curved_changes = 0.0; double curved_percent_change = 0.0; double low_threshold = 0.0; double high_threshold = 0.0; double low_curve_value = 0.75; double high_curve_value = 1.25; /* large install tweaks skips all flap detection logic - including state change calculation */ log_debug_info(DEBUGL_FUNCTIONS, 0, "check_for_service_flapping()\n"); if(svc == NULL) return; log_debug_info(DEBUGL_FLAPPING, 1, "Checking service '%s' on host '%s' for flapping...\n", svc->description, svc->host_name); /* if this is a soft service state and not a soft recovery, don't record this in the history */ /* only hard states and soft recoveries get recorded for flap detection */ if(svc->state_type == SOFT_STATE && svc->current_state != STATE_OK) return; /* what threshold values should we use (global or service-specific)? */ low_threshold = (svc->low_flap_threshold <= 0.0) ? low_service_flap_threshold : svc->low_flap_threshold; high_threshold = (svc->high_flap_threshold <= 0.0) ? high_service_flap_threshold : svc->high_flap_threshold; update_history = update; /* should we update state history for this state? */ if(update_history == TRUE) { if(!should_flap_detect(svc)) update_history = FALSE; } /* record current service state */ if(update_history == TRUE) { /* record the current state in the state history */ svc->state_history[svc->state_history_index] = svc->current_state; /* increment state history index to next available slot */ svc->state_history_index++; if(svc->state_history_index >= MAX_STATE_HISTORY_ENTRIES) svc->state_history_index = 0; } /* calculate overall and curved percent state changes */ for(x = 0, y = svc->state_history_index; x < MAX_STATE_HISTORY_ENTRIES; x++) { if(x == 0) { last_state_history_value = svc->state_history[y]; y++; if(y >= MAX_STATE_HISTORY_ENTRIES) y = 0; continue; } if(last_state_history_value != svc->state_history[y]) curved_changes += (((double)(x - 1) * (high_curve_value - low_curve_value)) / ((double)(MAX_STATE_HISTORY_ENTRIES - 2))) + low_curve_value; last_state_history_value = svc->state_history[y]; y++; if(y >= MAX_STATE_HISTORY_ENTRIES) y = 0; } /* calculate overall percent change in state */ curved_percent_change = (double)(((double)curved_changes * 100.0) / (double)(MAX_STATE_HISTORY_ENTRIES - 1)); svc->percent_state_change = curved_percent_change; log_debug_info(DEBUGL_FLAPPING, 2, "LFT=%.2f, HFT=%.2f, CPC=%.2f, PSC=%.2f%%\n", low_threshold, high_threshold, curved_percent_change, curved_percent_change); /* don't do anything if we don't have flap detection enabled on a program-wide basis or for this service */ if(enable_flap_detection == FALSE || svc->flap_detection_enabled == FALSE) { if(svc->is_flapping == TRUE) clear_service_flap(svc, curved_percent_change, high_threshold, low_threshold, 1); return; } /* are we flapping, undecided, or what?... */ /* we're undecided, so don't change the current flap state */ if(curved_percent_change > low_threshold && curved_percent_change < high_threshold) return; /* we're below the lower bound, so we're not flapping */ else if(curved_percent_change <= low_threshold) is_flapping = FALSE; /* else we're above the upper bound, so we are flapping */ else if(curved_percent_change >= high_threshold) is_flapping = TRUE; log_debug_info(DEBUGL_FLAPPING, 1, "Service %s flapping (%.2f%% state change).\n", (is_flapping == TRUE) ? "is" : "is not", curved_percent_change); /* did the service just start flapping? */ if(is_flapping == TRUE && svc->is_flapping == FALSE) set_service_flap(svc, curved_percent_change, high_threshold, low_threshold, allow_flapstart_notification); /* did the service just stop flapping? */ else if(is_flapping == FALSE && svc->is_flapping == TRUE) clear_service_flap(svc, curved_percent_change, high_threshold, low_threshold, 0); return; } /* detects host flapping */ void check_for_host_flapping(host *hst, int update, int actual_check, int allow_flapstart_notification) { int update_history = TRUE; int is_flapping = FALSE; register int x = 0; register int y = 0; int last_state_history_value = HOST_UP; unsigned long wait_threshold = 0L; double curved_changes = 0.0; double curved_percent_change = 0.0; time_t current_time = 0L; double low_threshold = 0.0; double high_threshold = 0.0; double low_curve_value = 0.75; double high_curve_value = 1.25; log_debug_info(DEBUGL_FUNCTIONS, 0, "check_for_host_flapping()\n"); if(hst == NULL) return; log_debug_info(DEBUGL_FLAPPING, 1, "Checking host '%s' for flapping...\n", hst->name); time(¤t_time); /* period to wait for updating archived state info if we have no state change */ if(hst->total_services == 0) wait_threshold = hst->notification_interval * interval_length; else wait_threshold = (hst->total_service_check_interval * interval_length) / hst->total_services; update_history = update; /* should we update state history for this state? */ if(update_history == TRUE) { if(!(hst->flap_detection_options & (1 << hst->current_state))) update_history = FALSE; } /* if we didn't have an actual check, only update if we've waited long enough */ if(update_history == TRUE && actual_check == FALSE && (current_time - hst->last_state_history_update) < wait_threshold) { update_history = FALSE; } /* what thresholds should we use (global or host-specific)? */ low_threshold = (hst->low_flap_threshold <= 0.0) ? low_host_flap_threshold : hst->low_flap_threshold; high_threshold = (hst->high_flap_threshold <= 0.0) ? high_host_flap_threshold : hst->high_flap_threshold; /* record current host state */ if(update_history == TRUE) { /* update the last record time */ hst->last_state_history_update = current_time; /* record the current state in the state history */ hst->state_history[hst->state_history_index] = hst->current_state; /* increment state history index to next available slot */ hst->state_history_index++; if(hst->state_history_index >= MAX_STATE_HISTORY_ENTRIES) hst->state_history_index = 0; } /* calculate overall changes in state */ for(x = 0, y = hst->state_history_index; x < MAX_STATE_HISTORY_ENTRIES; x++) { if(x == 0) { last_state_history_value = hst->state_history[y]; y++; if(y >= MAX_STATE_HISTORY_ENTRIES) y = 0; continue; } if(last_state_history_value != hst->state_history[y]) curved_changes += (((double)(x - 1) * (high_curve_value - low_curve_value)) / ((double)(MAX_STATE_HISTORY_ENTRIES - 2))) + low_curve_value; last_state_history_value = hst->state_history[y]; y++; if(y >= MAX_STATE_HISTORY_ENTRIES) y = 0; } /* calculate overall percent change in state */ curved_percent_change = (double)(((double)curved_changes * 100.0) / (double)(MAX_STATE_HISTORY_ENTRIES - 1)); hst->percent_state_change = curved_percent_change; log_debug_info(DEBUGL_FLAPPING, 2, "LFT=%.2f, HFT=%.2f, CPC=%.2f, PSC=%.2f%%\n", low_threshold, high_threshold, curved_percent_change, curved_percent_change); /* don't do anything if we don't have flap detection enabled on a program-wide basis or for this service */ if(enable_flap_detection == FALSE || hst->flap_detection_enabled == FALSE) { if(hst->is_flapping == TRUE) clear_host_flap(hst, curved_percent_change, high_threshold, low_threshold, 1); return; } /* are we flapping, undecided, or what?... */ /* we're undecided, so don't change the current flap state */ if(curved_percent_change > low_threshold && curved_percent_change < high_threshold) return; /* we're below the lower bound, so we're not flapping */ else if(curved_percent_change <= low_threshold) is_flapping = FALSE; /* else we're above the upper bound, so we are flapping */ else if(curved_percent_change >= high_threshold) is_flapping = TRUE; log_debug_info(DEBUGL_FLAPPING, 1, "Host %s flapping (%.2f%% state change).\n", (is_flapping == TRUE) ? "is" : "is not", curved_percent_change); /* did the host just start flapping? */ if(is_flapping == TRUE && hst->is_flapping == FALSE) set_host_flap(hst, curved_percent_change, high_threshold, low_threshold, allow_flapstart_notification); /* did the host just stop flapping? */ else if(is_flapping == FALSE && hst->is_flapping == TRUE) clear_host_flap(hst, curved_percent_change, high_threshold, low_threshold, 0); return; } /******************************************************************/ /********************* FLAP HANDLING FUNCTIONS ********************/ /******************************************************************/ /* handles a service that is flapping */ void set_service_flap(service *svc, double percent_change, double high_threshold, double low_threshold, int allow_flapstart_notification) { char *temp_buffer = NULL; log_debug_info(DEBUGL_FUNCTIONS, 0, "set_service_flap()\n"); if(svc == NULL) return; log_debug_info(DEBUGL_FLAPPING, 1, "Service '%s' on host '%s' started flapping!\n", svc->description, svc->host_name); /* log a notice - this one is parsed by the history CGI */ logit(NSLOG_RUNTIME_WARNING, FALSE, "SERVICE FLAPPING ALERT: %s;%s;STARTED; Service appears to have started flapping (%2.1f%% change >= %2.1f%% threshold)\n", svc->host_name, svc->description, percent_change, high_threshold); /* add a non-persistent comment to the service */ asprintf(&temp_buffer, "Notifications for this service are being suppressed because it was detected as having been flapping between different states (%2.1f%% change >= %2.1f%% threshold). When the service state stabilizes and the flapping stops, notifications will be re-enabled.", percent_change, high_threshold); add_new_service_comment(FLAPPING_COMMENT, svc->host_name, svc->description, time(NULL), "(Nagios Process)", temp_buffer, 0, COMMENTSOURCE_INTERNAL, FALSE, (time_t)0, &(svc->flapping_comment_id)); my_free(temp_buffer); /* set the flapping indicator */ svc->is_flapping = TRUE; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_flapping_data(NEBTYPE_FLAPPING_START, NEBFLAG_NONE, NEBATTR_NONE, SERVICE_FLAPPING, svc, percent_change, high_threshold, low_threshold, NULL); #endif /* see if we should check to send a recovery notification out when flapping stops */ if(svc->current_state != STATE_OK && svc->current_notification_number > 0) svc->check_flapping_recovery_notification = TRUE; else svc->check_flapping_recovery_notification = FALSE; /* send a notification */ if(allow_flapstart_notification == TRUE) service_notification(svc, NOTIFICATION_FLAPPINGSTART, NULL, NULL, NOTIFICATION_OPTION_NONE); return; } /* handles a service that has stopped flapping */ void clear_service_flap(service *svc, double percent_change, double high_threshold, double low_threshold, int is_disabled) { log_debug_info(DEBUGL_FUNCTIONS, 0, "clear_service_flap()\n"); if(svc == NULL) return; if (is_disabled == 0) { log_debug_info(DEBUGL_FLAPPING, 1, "Service '%s' on host '%s' stopped flapping.\n", svc->description, svc->host_name); /* log a notice - this one is parsed by the history CGI */ logit(NSLOG_INFO_MESSAGE, FALSE, "SERVICE FLAPPING ALERT: %s;%s;STOPPED; Service appears to have stopped flapping (%2.1f%% change < %2.1f%% threshold)\n", svc->host_name, svc->description, percent_change, low_threshold); } else { log_debug_info(DEBUGL_FLAPPING, 1, "Disabled flap detection for service '%s' on host '%s'.\n", svc->description, svc->host_name); /* log a notice - this one is parsed by the history CGI */ logit(NSLOG_INFO_MESSAGE, FALSE, "SERVICE FLAPPING ALERT: %s;%s;STOPPED; Disabled flap detection for service\n", svc->host_name, svc->description); } /* delete the comment we added earlier */ if(svc->flapping_comment_id != 0) delete_service_comment(svc->flapping_comment_id); svc->flapping_comment_id = 0; /* clear the flapping indicator */ svc->is_flapping = FALSE; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_flapping_data(NEBTYPE_FLAPPING_STOP, NEBFLAG_NONE, NEBATTR_FLAPPING_STOP_NORMAL, SERVICE_FLAPPING, svc, percent_change, high_threshold, low_threshold, NULL); #endif if (is_disabled == 0) { /* send a notification */ service_notification(svc, NOTIFICATION_FLAPPINGSTOP, NULL, NULL, NOTIFICATION_OPTION_NONE); /* should we send a recovery notification? */ if(svc->check_flapping_recovery_notification == TRUE && svc->current_state == STATE_OK) service_notification(svc, NOTIFICATION_NORMAL, NULL, NULL, NOTIFICATION_OPTION_NONE); } /* clear the recovery notification flag */ svc->check_flapping_recovery_notification = FALSE; return; } /* handles a host that is flapping */ void set_host_flap(host *hst, double percent_change, double high_threshold, double low_threshold, int allow_flapstart_notification) { char *temp_buffer = NULL; log_debug_info(DEBUGL_FUNCTIONS, 0, "set_host_flap()\n"); if(hst == NULL) return; log_debug_info(DEBUGL_FLAPPING, 1, "Host '%s' started flapping!\n", hst->name); /* log a notice - this one is parsed by the history CGI */ logit(NSLOG_RUNTIME_WARNING, FALSE, "HOST FLAPPING ALERT: %s;STARTED; Host appears to have started flapping (%2.1f%% change > %2.1f%% threshold)\n", hst->name, percent_change, high_threshold); /* add a non-persistent comment to the host */ asprintf(&temp_buffer, "Notifications for this host are being suppressed because it was detected as having been flapping between different states (%2.1f%% change > %2.1f%% threshold). When the host state stabilizes and the flapping stops, notifications will be re-enabled.", percent_change, high_threshold); add_new_host_comment(FLAPPING_COMMENT, hst->name, time(NULL), "(Nagios Process)", temp_buffer, 0, COMMENTSOURCE_INTERNAL, FALSE, (time_t)0, &(hst->flapping_comment_id)); my_free(temp_buffer); /* set the flapping indicator */ hst->is_flapping = TRUE; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_flapping_data(NEBTYPE_FLAPPING_START, NEBFLAG_NONE, NEBATTR_NONE, HOST_FLAPPING, hst, percent_change, high_threshold, low_threshold, NULL); #endif /* see if we should check to send a recovery notification out when flapping stops */ if(hst->current_state != HOST_UP && hst->current_notification_number > 0) hst->check_flapping_recovery_notification = TRUE; else hst->check_flapping_recovery_notification = FALSE; /* send a notification */ if(allow_flapstart_notification == TRUE) host_notification(hst, NOTIFICATION_FLAPPINGSTART, NULL, NULL, NOTIFICATION_OPTION_NONE); return; } /* handles a host that has stopped flapping */ void clear_host_flap(host *hst, double percent_change, double high_threshold, double low_threshold, int is_disabled) { log_debug_info(DEBUGL_FUNCTIONS, 0, "clear_host_flap()\n"); if(hst == NULL) return; if (is_disabled == 0) { log_debug_info(DEBUGL_FLAPPING, 1, "Host '%s' stopped flapping.\n", hst->name); /* log a notice - this one is parsed by the history CGI */ logit(NSLOG_INFO_MESSAGE, FALSE, "HOST FLAPPING ALERT: %s;STOPPED; Host appears to have stopped flapping (%2.1f%% change < %2.1f%% threshold)\n", hst->name, percent_change, low_threshold); } else { log_debug_info(DEBUGL_FLAPPING, 1, "Disabled flap detection for host '%s'.\n", hst->name); /* log a notice - this one is parsed by the history CGI */ logit(NSLOG_INFO_MESSAGE, FALSE, "HOST FLAPPING ALERT: %s;STOPPED; Disabled flap detection\n", hst->name); } /* delete the comment we added earlier */ if(hst->flapping_comment_id != 0) delete_host_comment(hst->flapping_comment_id); hst->flapping_comment_id = 0; /* clear the flapping indicator */ hst->is_flapping = FALSE; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_flapping_data(NEBTYPE_FLAPPING_STOP, NEBFLAG_NONE, NEBATTR_FLAPPING_STOP_NORMAL, HOST_FLAPPING, hst, percent_change, high_threshold, low_threshold, NULL); #endif if (is_disabled == 0) { /* send a notification */ host_notification(hst, NOTIFICATION_FLAPPINGSTOP, NULL, NULL, NOTIFICATION_OPTION_NONE); /* should we send a recovery notification? */ if(hst->check_flapping_recovery_notification == TRUE && hst->current_state == HOST_UP) host_notification(hst, NOTIFICATION_NORMAL, NULL, NULL, NOTIFICATION_OPTION_NONE); } /* clear the recovery notification flag */ hst->check_flapping_recovery_notification = FALSE; return; } /******************************************************************/ /***************** FLAP DETECTION STATUS FUNCTIONS ****************/ /******************************************************************/ /* enables flap detection on a program wide basis */ void enable_flap_detection_routines(void) { unsigned int i; unsigned long attr = MODATTR_FLAP_DETECTION_ENABLED; log_debug_info(DEBUGL_FUNCTIONS, 0, "enable_flap_detection_routines()\n"); /* bail out if we're already set */ if(enable_flap_detection == TRUE) return; /* set the attribute modified flag */ modified_host_process_attributes |= attr; modified_service_process_attributes |= attr; /* set flap detection flag */ enable_flap_detection = TRUE; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_adaptive_program_data(NEBTYPE_ADAPTIVEPROGRAM_UPDATE, NEBFLAG_NONE, NEBATTR_NONE, CMD_NONE, attr, modified_host_process_attributes, attr, modified_service_process_attributes, NULL); #endif /* update program status */ update_program_status(FALSE); /* check for flapping */ for(i = 0; i < num_objects.hosts; i++) check_for_host_flapping(host_ary[i], FALSE, FALSE, TRUE); for(i = 0; i < num_objects.services; i++) check_for_service_flapping(service_ary[i], FALSE, TRUE); } /* disables flap detection on a program wide basis */ void disable_flap_detection_routines(void) { unsigned int i; unsigned long attr = MODATTR_FLAP_DETECTION_ENABLED; log_debug_info(DEBUGL_FUNCTIONS, 0, "disable_flap_detection_routines()\n"); /* bail out if we're already set */ if(enable_flap_detection == FALSE) return; /* set the attribute modified flag */ modified_host_process_attributes |= attr; modified_service_process_attributes |= attr; /* set flap detection flag */ enable_flap_detection = FALSE; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_adaptive_program_data(NEBTYPE_ADAPTIVEPROGRAM_UPDATE, NEBFLAG_NONE, NEBATTR_NONE, CMD_NONE, attr, modified_host_process_attributes, attr, modified_service_process_attributes, NULL); #endif /* update program status */ update_program_status(FALSE); /* handle the details... */ for(i = 0; i < num_objects.hosts; i++) handle_host_flap_detection_disabled(host_ary[i]); for(i = 0; i < num_objects.services; i++) handle_service_flap_detection_disabled(service_ary[i]); return; } /* enables flap detection for a specific host */ void enable_host_flap_detection(host *hst) { unsigned long attr = MODATTR_FLAP_DETECTION_ENABLED; log_debug_info(DEBUGL_FUNCTIONS, 0, "enable_host_flap_detection()\n"); if(hst == NULL) return; log_debug_info(DEBUGL_FLAPPING, 1, "Enabling flap detection for host '%s'.\n", hst->name); /* nothing to do... */ if(hst->flap_detection_enabled == TRUE) return; /* set the attribute modified flag */ hst->modified_attributes |= attr; /* set the flap detection enabled flag */ hst->flap_detection_enabled = TRUE; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_adaptive_host_data(NEBTYPE_ADAPTIVEHOST_UPDATE, NEBFLAG_NONE, NEBATTR_NONE, hst, CMD_NONE, attr, hst->modified_attributes, NULL); #endif /* check for flapping */ check_for_host_flapping(hst, FALSE, FALSE, TRUE); /* update host status */ update_host_status(hst, FALSE); return; } /* disables flap detection for a specific host */ void disable_host_flap_detection(host *hst) { unsigned long attr = MODATTR_FLAP_DETECTION_ENABLED; log_debug_info(DEBUGL_FUNCTIONS, 0, "disable_host_flap_detection()\n"); if(hst == NULL) return; log_debug_info(DEBUGL_FLAPPING, 1, "Disabling flap detection for host '%s'.\n", hst->name); /* nothing to do... */ if(hst->flap_detection_enabled == FALSE) return; /* set the attribute modified flag */ hst->modified_attributes |= attr; /* set the flap detection enabled flag */ hst->flap_detection_enabled = FALSE; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_adaptive_host_data(NEBTYPE_ADAPTIVEHOST_UPDATE, NEBFLAG_NONE, NEBATTR_NONE, hst, CMD_NONE, attr, hst->modified_attributes, NULL); #endif /* handle the details... */ handle_host_flap_detection_disabled(hst); return; } /* handles the details for a host when flap detection is disabled (globally or per-host) */ void handle_host_flap_detection_disabled(host *hst) { log_debug_info(DEBUGL_FUNCTIONS, 0, "handle_host_flap_detection_disabled()\n"); if(hst == NULL) return; /* if the host was flapping, remove the flapping indicator */ if(hst->is_flapping == TRUE) { hst->is_flapping = FALSE; /* delete the original comment we added earlier */ if(hst->flapping_comment_id != 0) delete_host_comment(hst->flapping_comment_id); hst->flapping_comment_id = 0; /* log a notice - this one is parsed by the history CGI */ logit(NSLOG_INFO_MESSAGE, FALSE, "HOST FLAPPING ALERT: %s;DISABLED; Flap detection has been disabled\n", hst->name); #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_flapping_data(NEBTYPE_FLAPPING_STOP, NEBFLAG_NONE, NEBATTR_FLAPPING_STOP_DISABLED, HOST_FLAPPING, hst, hst->percent_state_change, 0.0, 0.0, NULL); #endif /* send a notification */ host_notification(hst, NOTIFICATION_FLAPPINGDISABLED, NULL, NULL, NOTIFICATION_OPTION_NONE); /* should we send a recovery notification? */ if(hst->check_flapping_recovery_notification == TRUE && hst->current_state == HOST_UP) host_notification(hst, NOTIFICATION_NORMAL, NULL, NULL, NOTIFICATION_OPTION_NONE); /* clear the recovery notification flag */ hst->check_flapping_recovery_notification = FALSE; } /* update host status */ update_host_status(hst, FALSE); return; } /* enables flap detection for a specific service */ void enable_service_flap_detection(service *svc) { unsigned long attr = MODATTR_FLAP_DETECTION_ENABLED; log_debug_info(DEBUGL_FUNCTIONS, 0, "enable_service_flap_detection()\n"); if(svc == NULL) return; log_debug_info(DEBUGL_FLAPPING, 1, "Enabling flap detection for service '%s' on host '%s'.\n", svc->description, svc->host_name); /* nothing to do... */ if(svc->flap_detection_enabled == TRUE) return; /* set the attribute modified flag */ svc->modified_attributes |= attr; /* set the flap detection enabled flag */ svc->flap_detection_enabled = TRUE; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_adaptive_service_data(NEBTYPE_ADAPTIVESERVICE_UPDATE, NEBFLAG_NONE, NEBATTR_NONE, svc, CMD_NONE, attr, svc->modified_attributes, NULL); #endif /* check for flapping */ check_for_service_flapping(svc, FALSE, TRUE); /* update service status */ update_service_status(svc, FALSE); return; } /* disables flap detection for a specific service */ void disable_service_flap_detection(service *svc) { unsigned long attr = MODATTR_FLAP_DETECTION_ENABLED; log_debug_info(DEBUGL_FUNCTIONS, 0, "disable_service_flap_detection()\n"); if(svc == NULL) return; log_debug_info(DEBUGL_FLAPPING, 1, "Disabling flap detection for service '%s' on host '%s'.\n", svc->description, svc->host_name); /* nothing to do... */ if(svc->flap_detection_enabled == FALSE) return; /* set the attribute modified flag */ svc->modified_attributes |= attr; /* set the flap detection enabled flag */ svc->flap_detection_enabled = FALSE; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_adaptive_service_data(NEBTYPE_ADAPTIVESERVICE_UPDATE, NEBFLAG_NONE, NEBATTR_NONE, svc, CMD_NONE, attr, svc->modified_attributes, NULL); #endif /* handle the details... */ handle_service_flap_detection_disabled(svc); return; } /* handles the details for a service when flap detection is disabled (globally or per-service) */ void handle_service_flap_detection_disabled(service *svc) { log_debug_info(DEBUGL_FUNCTIONS, 0, "handle_service_flap_detection_disabled()\n"); if(svc == NULL) return; /* if the service was flapping, remove the flapping indicator */ if(svc->is_flapping == TRUE) { svc->is_flapping = FALSE; /* delete the original comment we added earlier */ if(svc->flapping_comment_id != 0) delete_service_comment(svc->flapping_comment_id); svc->flapping_comment_id = 0; /* log a notice - this one is parsed by the history CGI */ logit(NSLOG_INFO_MESSAGE, FALSE, "SERVICE FLAPPING ALERT: %s;%s;DISABLED; Flap detection has been disabled\n", svc->host_name, svc->description); #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_flapping_data(NEBTYPE_FLAPPING_STOP, NEBFLAG_NONE, NEBATTR_FLAPPING_STOP_DISABLED, SERVICE_FLAPPING, svc, svc->percent_state_change, 0.0, 0.0, NULL); #endif /* send a notification */ service_notification(svc, NOTIFICATION_FLAPPINGDISABLED, NULL, NULL, NOTIFICATION_OPTION_NONE); /* should we send a recovery notification? */ if(svc->check_flapping_recovery_notification == TRUE && svc->current_state == STATE_OK) service_notification(svc, NOTIFICATION_NORMAL, NULL, NULL, NOTIFICATION_OPTION_NONE); /* clear the recovery notification flag */ svc->check_flapping_recovery_notification = FALSE; } /* update service status */ update_service_status(svc, FALSE); return; } nagios-4.3.4/base/logging.c000066400000000000000000000342501314764422400155210ustar00rootroot00000000000000/***************************************************************************** * * LOGGING.C - Log file functions for use with Nagios * * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #include "../include/config.h" #include "../include/common.h" #include "../include/statusdata.h" #include "../include/macros.h" #include "../include/nagios.h" #include "../include/broker.h" #include static FILE *debug_file_fp; static FILE *log_fp; /******************************************************************/ /************************ LOGGING FUNCTIONS ***********************/ /******************************************************************/ /* write something to the console */ static void write_to_console(char *buffer) { /* should we print to the console? */ if(daemon_mode == FALSE) printf("%s\n", buffer); } /* write something to the log file, syslog, and possibly the console */ static void write_to_logs_and_console(char *buffer, unsigned long data_type, int display) { register int len = 0; register int x = 0; /* strip unnecessary newlines */ len = strlen(buffer); for(x = len - 1; x >= 0; x--) { if(buffer[x] == '\n') buffer[x] = '\x0'; else break; } /* write messages to the logs */ write_to_all_logs(buffer, data_type); /* write message to the console */ if(display == TRUE) { /* don't display warnings if we're just testing scheduling */ if(test_scheduling == TRUE && data_type == NSLOG_VERIFICATION_WARNING) return; write_to_console(buffer); } } /* The main logging function */ void logit(int data_type, int display, const char *fmt, ...) { va_list ap; char *buffer = NULL; va_start(ap, fmt); if(vasprintf(&buffer, fmt, ap) > 0) { write_to_logs_and_console(buffer, data_type, display); free(buffer); } va_end(ap); } /* write something to the log file and syslog facility */ int write_to_all_logs(char *buffer, unsigned long data_type) { /* write to syslog */ write_to_syslog(buffer, data_type); /* write to main log */ write_to_log(buffer, data_type, NULL); return OK; } /* write something to the log file and syslog facility */ static void write_to_all_logs_with_timestamp(char *buffer, unsigned long data_type, time_t *timestamp) { /* write to syslog */ write_to_syslog(buffer, data_type); /* write to main log */ write_to_log(buffer, data_type, timestamp); } static FILE *open_log_file(void) { int fh; struct stat st; if(log_fp) /* keep it open unless we rotate */ return log_fp; if ((fh = open(log_file, O_RDWR|O_APPEND|O_CREAT|O_NOFOLLOW, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH)) == -1) { if (daemon_mode == FALSE) printf("Warning: Cannot open log file '%s' for writing\n", log_file); return NULL; } log_fp = fdopen(fh, "a+"); if(log_fp == NULL) { if (daemon_mode == FALSE) printf("Warning: Cannot open log file '%s' for writing\n", log_file); return NULL; } if ((fstat(fh, &st)) == -1) { log_fp = NULL; close(fh); if (daemon_mode == FALSE) printf("Warning: Cannot fstat log file '%s'\n", log_file); return NULL; } if (st.st_nlink != 1 || (st.st_mode & S_IFMT) != S_IFREG) { log_fp = NULL; close(fh); if (daemon_mode == FALSE) printf("Warning: log file '%s' has an invalid mode\n", log_file); return NULL; } (void)fcntl(fileno(log_fp), F_SETFD, FD_CLOEXEC); return log_fp; } int fix_log_file_owner(uid_t uid, gid_t gid) { int r1 = 0, r2 = 0; if (!(log_fp = open_log_file())) return -1; r1 = fchown(fileno(log_fp), uid, gid); if (open_debug_log() != OK) return -1; if (debug_file_fp) r2 = fchown(fileno(debug_file_fp), uid, gid); /* return 0 if both are 0 and otherwise < 0 */ return r1 < r2 ? r1 : r2; } int close_log_file(void) { if(!log_fp) return 0; fflush(log_fp); fclose(log_fp); log_fp = NULL; return 0; } /* write something to the nagios log file */ int write_to_log(char *buffer, unsigned long data_type, time_t *timestamp) { FILE *fp; time_t log_time = 0L; if(buffer == NULL) return ERROR; /* don't log anything if we're not actually running... */ if(verify_config || test_scheduling == TRUE) return OK; /* make sure we can log this type of entry */ if(!(data_type & logging_options)) return OK; fp = open_log_file(); if (fp == NULL) return ERROR; /* what timestamp should we use? */ if(timestamp == NULL) time(&log_time); else log_time = *timestamp; /* strip any newlines from the end of the buffer */ strip(buffer); /* write the buffer to the log file */ fprintf(fp, "[%llu] %s\n", (unsigned long long)log_time, buffer); fflush(fp); #ifdef USE_EVENT_BROKER /* send data to the event broker */ broker_log_data(NEBTYPE_LOG_DATA, NEBFLAG_NONE, NEBATTR_NONE, buffer, data_type, log_time, NULL); #endif return OK; } /* write something to the syslog facility */ int write_to_syslog(char *buffer, unsigned long data_type) { if(buffer == NULL) return ERROR; /* don't log anything if we're not actually running... */ if(verify_config || test_scheduling == TRUE) return OK; /* bail out if we shouldn't write to syslog */ if(use_syslog == FALSE) return OK; /* make sure we should log this type of entry */ if(!(data_type & syslog_options)) return OK; /* write the buffer to the syslog facility */ syslog(LOG_USER | LOG_INFO, "%s", buffer); return OK; } /* write a service problem/recovery to the nagios log file */ int log_service_event(service *svc) { char *temp_buffer = NULL; unsigned long log_options = 0L; host *temp_host = NULL; /* don't log soft errors if the user doesn't want to */ if(svc->state_type == SOFT_STATE && !log_service_retries) return OK; /* get the log options */ if(svc->current_state == STATE_UNKNOWN) log_options = NSLOG_SERVICE_UNKNOWN; else if(svc->current_state == STATE_WARNING) log_options = NSLOG_SERVICE_WARNING; else if(svc->current_state == STATE_CRITICAL) log_options = NSLOG_SERVICE_CRITICAL; else log_options = NSLOG_SERVICE_OK; /* find the associated host */ if((temp_host = svc->host_ptr) == NULL) return ERROR; asprintf(&temp_buffer, "SERVICE ALERT: %s;%s;%s;%s;%d;%s\n", svc->host_name, svc->description, service_state_name(svc->current_state), state_type_name(svc->state_type), svc->current_attempt, (svc->plugin_output == NULL) ? "" : svc->plugin_output); write_to_all_logs(temp_buffer, log_options); free(temp_buffer); return OK; } /* write a host problem/recovery to the log file */ int log_host_event(host *hst) { char *temp_buffer = NULL; unsigned long log_options = 0L; /* get the log options */ if(hst->current_state == HOST_DOWN) log_options = NSLOG_HOST_DOWN; else if(hst->current_state == HOST_UNREACHABLE) log_options = NSLOG_HOST_UNREACHABLE; else log_options = NSLOG_HOST_UP; asprintf(&temp_buffer, "HOST ALERT: %s;%s;%s;%d;%s\n", hst->name, host_state_name(hst->current_state), state_type_name(hst->state_type), hst->current_attempt, (hst->plugin_output == NULL) ? "" : hst->plugin_output); write_to_all_logs(temp_buffer, log_options); my_free(temp_buffer); return OK; } /* logs host states */ int log_host_states(int type, time_t *timestamp) { char *temp_buffer = NULL; host *temp_host = NULL;; /* bail if we shouldn't be logging initial states */ if(type == INITIAL_STATES && log_initial_states == FALSE) return OK; for(temp_host = host_list; temp_host != NULL; temp_host = temp_host->next) { asprintf(&temp_buffer, "%s HOST STATE: %s;%s;%s;%d;%s\n", (type == INITIAL_STATES) ? "INITIAL" : "CURRENT", temp_host->name, host_state_name(temp_host->current_state), state_type_name(temp_host->state_type), temp_host->current_attempt, (temp_host->plugin_output == NULL) ? "" : temp_host->plugin_output); write_to_all_logs_with_timestamp(temp_buffer, NSLOG_INFO_MESSAGE, timestamp); my_free(temp_buffer); } return OK; } /* logs service states */ int log_service_states(int type, time_t *timestamp) { char *temp_buffer = NULL; service *temp_service = NULL; host *temp_host = NULL;; /* bail if we shouldn't be logging initial states */ if(type == INITIAL_STATES && log_initial_states == FALSE) return OK; for(temp_service = service_list; temp_service != NULL; temp_service = temp_service->next) { /* find the associated host */ if((temp_host = temp_service->host_ptr) == NULL) continue; asprintf(&temp_buffer, "%s SERVICE STATE: %s;%s;%s;%s;%d;%s\n", (type == INITIAL_STATES) ? "INITIAL" : "CURRENT", temp_service->host_name, temp_service->description, service_state_name(temp_service->current_state), state_type_name(temp_service->state_type), temp_service->current_attempt, temp_service->plugin_output); write_to_all_logs_with_timestamp(temp_buffer, NSLOG_INFO_MESSAGE, timestamp); my_free(temp_buffer); } return OK; } /* rotates the main log file */ int rotate_log_file(time_t rotation_time) { char *temp_buffer = NULL; char method_string[16] = ""; char *log_archive = NULL; struct tm *t, tm_s; int rename_result = 0; int stat_result = -1; struct stat log_file_stat; struct stat archive_stat; int archive_stat_result; if(log_rotation_method == LOG_ROTATION_NONE) { return OK; } else if(log_rotation_method == LOG_ROTATION_HOURLY) strcpy(method_string, "HOURLY"); else if(log_rotation_method == LOG_ROTATION_DAILY) strcpy(method_string, "DAILY"); else if(log_rotation_method == LOG_ROTATION_WEEKLY) strcpy(method_string, "WEEKLY"); else if(log_rotation_method == LOG_ROTATION_MONTHLY) strcpy(method_string, "MONTHLY"); else return ERROR; /* update the last log rotation time and status log */ last_log_rotation = time(NULL); update_program_status(FALSE); t = localtime_r(&rotation_time, &tm_s); stat_result = stat(log_file, &log_file_stat); close_log_file(); /* get the archived filename to use */ asprintf(&log_archive, "%s%snagios-%02d-%02d-%d-%02d.log", log_archive_path, (log_archive_path[strlen(log_archive_path) - 1] == '/') ? "" : "/", t->tm_mon + 1, t->tm_mday, t->tm_year + 1900, t->tm_hour); /* HACK: If the archive exists, don't overwrite it. This is a hack because the real problem is that some log rotations are executed early and as a result the next log rotation is scheduled for the same time as the one that ran early */ archive_stat_result = stat(log_archive, &archive_stat); if((0 == archive_stat_result) || ((-1 == archive_stat_result) && (ENOENT != errno))) { return OK; } /* rotate the log file */ rename_result = my_rename(log_file, log_archive); log_fp = open_log_file(); if (log_fp == NULL) return ERROR; if(rename_result) { my_free(log_archive); return ERROR; } /* record the log rotation after it has been done... */ asprintf(&temp_buffer, "LOG ROTATION: %s\n", method_string); write_to_all_logs_with_timestamp(temp_buffer, NSLOG_PROCESS_INFO, &rotation_time); my_free(temp_buffer); /* record log file version format */ write_log_file_info(&rotation_time); if(stat_result == 0) { chmod(log_file, log_file_stat.st_mode); chown(log_file, log_file_stat.st_uid, log_file_stat.st_gid); } /* log current host and service state if activated */ if(log_current_states==TRUE) { log_host_states(CURRENT_STATES, &rotation_time); log_service_states(CURRENT_STATES, &rotation_time); } /* free memory */ my_free(log_archive); return OK; } /* record log file version/info */ int write_log_file_info(time_t *timestamp) { char *temp_buffer = NULL; /* write log version */ asprintf(&temp_buffer, "LOG VERSION: %s\n", LOG_VERSION_2); write_to_all_logs_with_timestamp(temp_buffer, NSLOG_PROCESS_INFO, timestamp); my_free(temp_buffer); return OK; } /* opens the debug log for writing */ int open_debug_log(void) { int fh; struct stat st; /* don't do anything if we're not actually running... */ if(verify_config || test_scheduling == TRUE) return OK; /* don't do anything if we're not debugging */ if(debug_level == DEBUGL_NONE) return OK; if ((fh = open(debug_file, O_RDWR|O_APPEND|O_CREAT|O_NOFOLLOW, S_IRUSR|S_IWUSR)) == -1) return ERROR; if((debug_file_fp = fdopen(fh, "a+")) == NULL) return ERROR; if ((fstat(fh, &st)) == -1) { debug_file_fp = NULL; close(fh); return ERROR; } if (st.st_nlink != 1 || (st.st_mode & S_IFMT) != S_IFREG) { debug_file_fp = NULL; close(fh); return ERROR; } (void)fcntl(fh, F_SETFD, FD_CLOEXEC); return OK; } /* closes the debug log */ int close_debug_log(void) { if(debug_file_fp != NULL) fclose(debug_file_fp); debug_file_fp = NULL; return OK; } /* write to the debug log */ int log_debug_info(int level, int verbosity, const char *fmt, ...) { va_list ap; char *tmppath = NULL; struct timeval current_time; if(!(debug_level == DEBUGL_ALL || (level & debug_level))) return OK; if(verbosity > debug_verbosity) return OK; if(debug_file_fp == NULL) return ERROR; /* write the timestamp */ gettimeofday(¤t_time, NULL); fprintf(debug_file_fp, "[%lu.%06lu] [%03d.%d] [pid=%lu] ", current_time.tv_sec, current_time.tv_usec, level, verbosity, (unsigned long)getpid()); /* write the data */ va_start(ap, fmt); vfprintf(debug_file_fp, fmt, ap); va_end(ap); /* flush, so we don't have problems tailing or when fork()ing */ fflush(debug_file_fp); /* if file has grown beyond max, rotate it */ if((unsigned long)ftell(debug_file_fp) > max_debug_file_size && max_debug_file_size > 0L) { /* close the file */ close_debug_log(); /* rotate the log file */ asprintf(&tmppath, "%s.old", debug_file); if(tmppath) { /* unlink the old debug file */ unlink(tmppath); /* rotate the debug file */ my_rename(debug_file, tmppath); /* free memory */ my_free(tmppath); } /* open a new file */ open_debug_log(); } return OK; } nagios-4.3.4/base/nagios.c000066400000000000000000000654551314764422400153660ustar00rootroot00000000000000/***************************************************************************** * * NAGIOS.C - Core Program Code For Nagios * * Program: Nagios Core * License: GPL * * First Written: 01-28-1999 (start of development) * * Description: * * Nagios is a network monitoring tool that will check hosts and services * that you specify. It has the ability to notify contacts via email, pager, * or other user-defined methods when a service or host goes down and * recovers. Service and host monitoring is done through the use of external * plugins which can be developed independently of Nagios. * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #include "../include/config.h" #include "../include/common.h" #include "../include/objects.h" #include "../include/comments.h" #include "../include/downtime.h" #include "../include/statusdata.h" #include "../include/macros.h" #include "../include/nagios.h" #include "../include/sretention.h" #include "../include/perfdata.h" #include "../include/broker.h" #include "../include/nebmods.h" #include "../include/nebmodules.h" #include "../include/workers.h" /*#define DEBUG_MEMORY 1*/ #ifdef DEBUG_MEMORY #include #endif static int is_worker; static void set_loadctl_defaults(void) { struct rlimit rlim; /* Workers need to up 'em, master needs to know 'em */ getrlimit(RLIMIT_NOFILE, &rlim); rlim.rlim_cur = rlim.rlim_max; setrlimit(RLIMIT_NOFILE, &rlim); loadctl.nofile_limit = rlim.rlim_max; #ifdef RLIMIT_NPROC getrlimit(RLIMIT_NPROC, &rlim); rlim.rlim_cur = rlim.rlim_max; setrlimit(RLIMIT_NPROC, &rlim); loadctl.nproc_limit = rlim.rlim_max; #else loadctl.nproc_limit = loadctl.nofile_limit / 2; #endif /* * things may have been configured already. Otherwise we * set some sort of sane defaults here */ if (!loadctl.jobs_max) { loadctl.jobs_max = loadctl.nproc_limit - 100; if (!is_worker && loadctl.jobs_max > (loadctl.nofile_limit - 50) * wproc_num_workers_online) { loadctl.jobs_max = (loadctl.nofile_limit - 50) * wproc_num_workers_online; } } if (!loadctl.jobs_limit) loadctl.jobs_limit = loadctl.jobs_max; if (!loadctl.backoff_limit) loadctl.backoff_limit = online_cpus() * 2.5; if (!loadctl.rampup_limit) loadctl.rampup_limit = online_cpus() * 0.8; if (!loadctl.backoff_change) loadctl.backoff_change = loadctl.jobs_limit * 0.3; if (!loadctl.rampup_change) loadctl.rampup_change = loadctl.backoff_change * 0.25; if (!loadctl.check_interval) loadctl.check_interval = 60; if (!loadctl.jobs_min) loadctl.jobs_min = online_cpus() * 20; /* pessimistic */ } static int test_path_access(const char *program, int mode) { char *envpath, *p, *colon; int ret, our_errno = 1500; /* outside errno range */ if (program[0] == '/' || !(envpath = getenv("PATH"))) return access(program, mode); if (!(envpath = strdup(envpath))) { errno = ENOMEM; return -1; } for (p = envpath; p; p = colon + 1) { char *path; colon = strchr(p, ':'); if (colon) *colon = 0; asprintf(&path, "%s/%s", p, program); ret = access(path, mode); free(path); if (!ret) break; if (ret < 0) { if (errno == ENOENT) continue; if (our_errno > errno) our_errno = errno; } if (!colon) break; } free(envpath); if (!ret) errno = 0; else errno = our_errno; return ret; } static int nagios_core_worker(const char *path) { int sd, ret; char response[128]; is_worker = 1; set_loadctl_defaults(); sd = nsock_unix(path, NSOCK_TCP | NSOCK_CONNECT); if (sd < 0) { printf("Failed to connect to query socket '%s': %s: %s\n", path, nsock_strerror(sd), strerror(errno)); return 1; } ret = nsock_printf_nul(sd, "@wproc register name=Core Worker %ld;pid=%ld", (long)getpid(), (long)getpid()); if (ret < 0) { printf("Failed to register as worker.\n"); return 1; } ret = read(sd, response, 3); if (ret != 3) { printf("Failed to read response from wproc manager\n"); return 1; } if (memcmp(response, "OK", 3)) { read(sd, response + 3, sizeof(response) - 4); response[sizeof(response) - 2] = 0; printf("Failed to register with wproc manager: %s\n", response); return 1; } enter_worker(sd, start_cmd); return 0; } /* * only handles logfile for now, which we stash in macros to * make sure we can log *somewhere* in case the new path is * completely inaccessible. */ static int test_configured_paths(void) { FILE *fp; nagios_macros *mac; mac = get_global_macros(); fp = fopen(log_file, "a+"); if (!fp) { /* * we do some variable trashing here so logit() can * open the old logfile (if any), in case we got a * restart command or a SIGHUP */ char *value_absolute = log_file; log_file = mac->x[MACRO_LOGFILE]; logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Failed to open logfile '%s' for writing: %s\n", value_absolute, strerror(errno)); return ERROR; } fclose(fp); /* save the macro */ mac->x[MACRO_LOGFILE] = log_file; return OK; } int main(int argc, char **argv) { int result; int error = FALSE; int display_license = FALSE; int display_help = FALSE; int c = 0; struct tm *tm, tm_s; time_t now; char datestring[256]; nagios_macros *mac; const char *worker_socket = NULL; int i; #ifdef HAVE_SIGACTION struct sigaction sig_action; #endif #ifdef HAVE_GETOPT_H int option_index = 0; static struct option long_options[] = { {"help", no_argument, 0, 'h'}, {"version", no_argument, 0, 'V'}, {"license", no_argument, 0, 'V'}, {"verify-config", no_argument, 0, 'v'}, {"daemon", no_argument, 0, 'd'}, {"test-scheduling", no_argument, 0, 's'}, {"precache-objects", no_argument, 0, 'p'}, {"use-precached-objects", no_argument, 0, 'u'}, {"enable-timing-point", no_argument, 0, 'T'}, {"worker", required_argument, 0, 'W'}, {0, 0, 0, 0} }; #define getopt(argc, argv, o) getopt_long(argc, argv, o, long_options, &option_index) #endif memset(&loadctl, 0, sizeof(loadctl)); mac = get_global_macros(); /* make sure we have the correct number of command line arguments */ if(argc < 2) error = TRUE; /* get all command line arguments */ while(1) { c = getopt(argc, argv, "+hVvdspuxTW"); if(c == -1 || c == EOF) break; switch(c) { case '?': /* usage */ case 'h': display_help = TRUE; break; case 'V': /* version */ display_license = TRUE; break; case 'v': /* verify */ verify_config++; break; case 's': /* scheduling check */ test_scheduling = TRUE; break; case 'd': /* daemon mode */ daemon_mode = TRUE; break; case 'p': /* precache object config */ precache_objects = TRUE; break; case 'u': /* use precached object config */ use_precached_objects = TRUE; break; case 'T': enable_timing_point = TRUE; break; case 'W': worker_socket = optarg; break; case 'x': printf("Warning: -x is deprecated and will be removed\n"); break; default: break; } } #ifdef DEBUG_MEMORY mtrace(); #endif /* if we're a worker we can skip everything below */ if(worker_socket) { exit(nagios_core_worker(worker_socket)); } /* Initialize configuration variables */ init_main_cfg_vars(1); init_shared_cfg_vars(1); if(daemon_mode == FALSE) { printf("\nNagios Core %s\n", PROGRAM_VERSION); printf("Copyright (c) 2009-present Nagios Core Development Team and Community Contributors\n"); printf("Copyright (c) 1999-2009 Ethan Galstad\n"); printf("Last Modified: %s\n", PROGRAM_MODIFICATION_DATE); printf("License: GPL\n\n"); printf("Website: https://www.nagios.org\n"); } /* just display the license */ if(display_license == TRUE) { printf("This program is free software; you can redistribute it and/or modify\n"); printf("it under the terms of the GNU General Public License version 2 as\n"); printf("published by the Free Software Foundation.\n\n"); printf("This program is distributed in the hope that it will be useful,\n"); printf("but WITHOUT ANY WARRANTY; without even the implied warranty of\n"); printf("MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"); printf("GNU General Public License for more details.\n\n"); printf("You should have received a copy of the GNU General Public License\n"); printf("along with this program; if not, write to the Free Software\n"); printf("Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\n\n"); exit(OK); } /* make sure we got the main config file on the command line... */ if(optind >= argc) error = TRUE; /* if there are no command line options (or if we encountered an error), print usage */ if(error == TRUE || display_help == TRUE) { printf("Usage: %s [options] \n", argv[0]); printf("\n"); printf("Options:\n"); printf("\n"); printf(" -v, --verify-config Verify all configuration data (-v -v for more info)\n"); printf(" -s, --test-scheduling Shows projected/recommended check scheduling and other\n"); printf(" diagnostic info based on the current configuration files.\n"); printf(" -T, --enable-timing-point Enable timed commentary on initialization\n"); printf(" -x, --dont-verify-paths Deprecated (Don't check for circular object paths)\n"); printf(" -p, --precache-objects Precache object configuration\n"); printf(" -u, --use-precached-objects Use precached object config file\n"); printf(" -d, --daemon Starts Nagios in daemon mode, instead of as a foreground process\n"); printf(" -W, --worker /path/to/socket Act as a worker for an already running daemon\n"); printf("\n"); printf("Visit the Nagios website at https://www.nagios.org/ for bug fixes, new\n"); printf("releases, online documentation, FAQs, information on subscribing to\n"); printf("the mailing lists, and commercial support options for Nagios.\n"); printf("\n"); exit(ERROR); } /* * config file is last argument specified. * Make sure it uses an absolute path */ config_file = nspath_absolute(argv[optind], NULL); if(config_file == NULL) { printf("Error allocating memory.\n"); exit(ERROR); } config_file_dir = nspath_absolute_dirname(config_file, NULL); /* * Set the signal handler for the SIGXFSZ signal here because * we may encounter this signal before the other signal handlers * are set. */ #ifdef HAVE_SIGACTION sig_action.sa_sigaction = NULL; sig_action.sa_handler = handle_sigxfsz; sigfillset(&sig_action.sa_mask); sig_action.sa_flags = SA_NODEFER|SA_RESTART; sigaction(SIGXFSZ, &sig_action, NULL); #else signal(SIGXFSZ, handle_sigxfsz); #endif /* * let's go to town. We'll be noisy if we're verifying config * or running scheduling tests. */ if(verify_config || test_scheduling || precache_objects) { reset_variables(); /* * if we don't beef up our resource limits as much as * we can, it's quite possible we'll run headlong into * EAGAIN due to too many processes when we try to * drop privileges later. */ set_loadctl_defaults(); if(verify_config) printf("Reading configuration data...\n"); /* read our config file */ result = read_main_config_file(config_file); if(result != OK) { printf(" Error processing main config file!\n\n"); exit(EXIT_FAILURE); } if(verify_config) printf(" Read main config file okay...\n"); /* drop privileges */ if((result = drop_privileges(nagios_user, nagios_group)) == ERROR) { printf(" Failed to drop privileges. Aborting."); exit(EXIT_FAILURE); } /* * this must come after dropping privileges, so we make * sure to test access permissions as the right user. */ if (!verify_config && test_configured_paths() == ERROR) { printf(" One or more path problems detected. Aborting.\n"); exit(EXIT_FAILURE); } /* read object config files */ result = read_all_object_data(config_file); if(result != OK) { printf(" Error processing object config files!\n\n"); /* if the config filename looks fishy, warn the user */ if(!strstr(config_file, "nagios.cfg")) { printf("\n***> The name of the main configuration file looks suspicious...\n"); printf("\n"); printf(" Make sure you are specifying the name of the MAIN configuration file on\n"); printf(" the command line and not the name of another configuration file. The\n"); printf(" main configuration file is typically '%s'\n", DEFAULT_CONFIG_FILE); } printf("\n***> One or more problems was encountered while processing the config files...\n"); printf("\n"); printf(" Check your configuration file(s) to ensure that they contain valid\n"); printf(" directives and data definitions. If you are upgrading from a previous\n"); printf(" version of Nagios, you should be aware that some variables/definitions\n"); printf(" may have been removed or modified in this version. Make sure to read\n"); printf(" the HTML documentation regarding the config files, as well as the\n"); printf(" 'Whats New' section to find out what has changed.\n\n"); exit(EXIT_FAILURE); } if(verify_config) { printf(" Read object config files okay...\n\n"); printf("Running pre-flight check on configuration data...\n\n"); } /* run the pre-flight check to make sure things look okay... */ result = pre_flight_check(); if(result != OK) { printf("\n***> One or more problems was encountered while running the pre-flight check...\n"); printf("\n"); printf(" Check your configuration file(s) to ensure that they contain valid\n"); printf(" directives and data definitions. If you are upgrading from a previous\n"); printf(" version of Nagios, you should be aware that some variables/definitions\n"); printf(" may have been removed or modified in this version. Make sure to read\n"); printf(" the HTML documentation regarding the config files, as well as the\n"); printf(" 'Whats New' section to find out what has changed.\n\n"); exit(EXIT_FAILURE); } if(verify_config) { printf("\nThings look okay - No serious problems were detected during the pre-flight check\n"); } /* scheduling tests need a bit more than config verifications */ if(test_scheduling == TRUE) { /* we'll need the event queue here so we can time insertions */ init_event_queue(); timing_point("Done initializing event queue\n"); /* read initial service and host state information */ initialize_retention_data(config_file); read_initial_state_information(); timing_point("Retention data and initial state parsed\n"); /* initialize the event timing loop */ init_timing_loop(); timing_point("Timing loop initialized\n"); /* display scheduling information */ display_scheduling_info(); } if(precache_objects) { result = fcache_objects(object_precache_file); timing_point("Done precaching objects\n"); if(result == OK) { printf("Object precache file created:\n%s\n", object_precache_file); } else { printf("Failed to precache objects to '%s': %s\n", object_precache_file, strerror(errno)); } } /* clean up after ourselves */ cleanup(); /* exit */ timing_point("Exiting\n"); /* make valgrind shut up about still reachable memory */ neb_free_module_list(); free(config_file_dir); free(config_file); exit(result); } /* else start to monitor things... */ else { /* * if we're called with a relative path we must make * it absolute so we can launch our workers. * If not, we needn't bother, as we're using execvp() */ if (strchr(argv[0], '/')) nagios_binary_path = nspath_absolute(argv[0], NULL); else nagios_binary_path = strdup(argv[0]); if (!nagios_binary_path) { logit(NSLOG_RUNTIME_ERROR, TRUE, "Error: Unable to allocate memory for nagios_binary_path\n"); exit(EXIT_FAILURE); } if (!(nagios_iobs = iobroker_create())) { logit(NSLOG_RUNTIME_ERROR, TRUE, "Error: Failed to create IO broker set: %s\n", strerror(errno)); exit(EXIT_FAILURE); } /* keep monitoring things until we get a shutdown command */ do { /* reset internal book-keeping (in case we're restarting) */ wproc_num_workers_spawned = wproc_num_workers_online = 0; caught_signal = sigshutdown = FALSE; sig_id = 0; /* reset program variables */ reset_variables(); timing_point("Variables reset\n"); /* get PID */ nagios_pid = (int)getpid(); /* read in the configuration files (main and resource config files) */ result = read_main_config_file(config_file); if (result != OK) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Failed to process config file '%s'. Aborting\n", config_file); exit(EXIT_FAILURE); } timing_point("Main config file read\n"); /* NOTE 11/06/07 EG moved to after we read config files, as user may have overridden timezone offset */ /* get program (re)start time and save as macro */ program_start = time(NULL); my_free(mac->x[MACRO_PROCESSSTARTTIME]); asprintf(&mac->x[MACRO_PROCESSSTARTTIME], "%llu", (unsigned long long)program_start); /* enter daemon mode (unless we're restarting...) */ if(daemon_mode == TRUE && sigrestart == FALSE) { result = daemon_init(); /* we had an error daemonizing, so bail... */ if(result == ERROR) { logit(NSLOG_PROCESS_INFO | NSLOG_RUNTIME_ERROR, TRUE, "Bailing out due to failure to daemonize. (PID=%d)", (int)getpid()); cleanup(); exit(EXIT_FAILURE); } /* get new PID */ nagios_pid = (int)getpid(); } /* drop privileges */ if(drop_privileges(nagios_user, nagios_group) == ERROR) { logit(NSLOG_PROCESS_INFO | NSLOG_RUNTIME_ERROR | NSLOG_CONFIG_ERROR, TRUE, "Failed to drop privileges. Aborting."); cleanup(); exit(ERROR); } if (test_path_access(nagios_binary_path, X_OK)) { logit(NSLOG_RUNTIME_ERROR, TRUE, "Error: failed to access() %s: %s\n", nagios_binary_path, strerror(errno)); logit(NSLOG_RUNTIME_ERROR, TRUE, "Error: Spawning workers will be impossible. Aborting.\n"); exit(EXIT_FAILURE); } if (test_configured_paths() == ERROR) { /* error has already been logged */ exit(EXIT_FAILURE); } /* this must be logged after we read config data, as user may have changed location of main log file */ logit(NSLOG_PROCESS_INFO, TRUE, "Nagios %s starting... (PID=%d)\n", PROGRAM_VERSION, (int)getpid()); /* log the local time - may be different than clock time due to timezone offset */ now = time(NULL); tm = localtime_r(&now, &tm_s); strftime(datestring, sizeof(datestring), "%a %b %d %H:%M:%S %Z %Y", tm); logit(NSLOG_PROCESS_INFO, TRUE, "Local time is %s", datestring); /* write log version/info */ write_log_file_info(NULL); /* open debug log now that we're the right user */ open_debug_log(); #ifdef USE_EVENT_BROKER /* initialize modules */ neb_init_modules(); neb_init_callback_list(); #endif timing_point("NEB module API initialized\n"); /* handle signals (interrupts) before we do any socket I/O */ setup_sighandler(); /* * Initialize query handler and event subscription service. * This must be done before modules are initialized, so * the modules can use our in-core stuff properly */ if (qh_init(qh_socket_path ? qh_socket_path : DEFAULT_QUERY_SOCKET) != OK) { logit(NSLOG_RUNTIME_ERROR, TRUE, "Error: Failed to initialize query handler. Aborting\n"); exit(EXIT_FAILURE); } timing_point("Query handler initialized\n"); nerd_init(); timing_point("NERD initialized\n"); /* initialize check workers */ if(init_workers(num_check_workers) < 0) { logit(NSLOG_RUNTIME_ERROR, TRUE, "Failed to spawn workers. Aborting\n"); exit(EXIT_FAILURE); } timing_point("%u workers spawned\n", wproc_num_workers_spawned); i = 0; while (i < 50 && wproc_num_workers_online < wproc_num_workers_spawned) { iobroker_poll(nagios_iobs, 50); i++; } timing_point("%u workers connected\n", wproc_num_workers_online); /* now that workers have arrived we can set the defaults */ set_loadctl_defaults(); #ifdef USE_EVENT_BROKER /* load modules */ if (neb_load_all_modules() != OK) { logit(NSLOG_CONFIG_ERROR, ERROR, "Error: Module loading failed. Aborting.\n"); /* if we're dumping core, we must remove all dl-files */ if (daemon_dumps_core) neb_unload_all_modules(NEBMODULE_FORCE_UNLOAD, NEBMODULE_NEB_SHUTDOWN); exit(EXIT_FAILURE); } timing_point("Modules loaded\n"); /* send program data to broker */ broker_program_state(NEBTYPE_PROCESS_PRELAUNCH, NEBFLAG_NONE, NEBATTR_NONE, NULL); timing_point("First callback made\n"); #endif /* read in all object config data */ if(result == OK) result = read_all_object_data(config_file); /* there was a problem reading the config files */ if(result != OK) logit(NSLOG_PROCESS_INFO | NSLOG_RUNTIME_ERROR | NSLOG_CONFIG_ERROR, TRUE, "Bailing out due to one or more errors encountered in the configuration files. Run Nagios from the command line with the -v option to verify your config before restarting. (PID=%d)", (int)getpid()); else { /* run the pre-flight check to make sure everything looks okay*/ if((result = pre_flight_check()) != OK) logit(NSLOG_PROCESS_INFO | NSLOG_RUNTIME_ERROR | NSLOG_VERIFICATION_ERROR, TRUE, "Bailing out due to errors encountered while running the pre-flight check. Run Nagios from the command line with the -v option to verify your config before restarting. (PID=%d)\n", (int)getpid()); } /* an error occurred that prevented us from (re)starting */ if(result != OK) { /* if we were restarting, we need to cleanup from the previous run */ if(sigrestart == TRUE) { /* clean up the status data */ cleanup_status_data(TRUE); } #ifdef USE_EVENT_BROKER /* send program data to broker */ broker_program_state(NEBTYPE_PROCESS_SHUTDOWN, NEBFLAG_PROCESS_INITIATED, NEBATTR_SHUTDOWN_ABNORMAL, NULL); #endif cleanup(); exit(ERROR); } timing_point("Object configuration parsed and understood\n"); /* write the objects.cache file */ fcache_objects(object_cache_file); timing_point("Objects cached\n"); init_event_queue(); timing_point("Event queue initialized\n"); #ifdef USE_EVENT_BROKER /* send program data to broker */ broker_program_state(NEBTYPE_PROCESS_START, NEBFLAG_NONE, NEBATTR_NONE, NULL); #endif /* initialize status data unless we're starting */ if(sigrestart == FALSE) { initialize_status_data(config_file); timing_point("Status data initialized\n"); } /* initialize scheduled downtime data */ initialize_downtime_data(); timing_point("Downtime data initialized\n"); /* read initial service and host state information */ initialize_retention_data(config_file); timing_point("Retention data initialized\n"); read_initial_state_information(); timing_point("Initial state information read\n"); /* initialize comment data */ initialize_comment_data(); timing_point("Comment data initialized\n"); /* initialize performance data */ initialize_performance_data(config_file); timing_point("Performance data initialized\n"); /* initialize the event timing loop */ init_timing_loop(); timing_point("Event timing loop initialized\n"); /* initialize check statistics */ init_check_stats(); timing_point("check stats initialized\n"); /* check for updates */ check_for_nagios_updates(FALSE, TRUE); timing_point("Update check concluded\n"); /* update all status data (with retained information) */ update_all_status_data(); timing_point("Status data updated\n"); /* log initial host and service state */ log_host_states(INITIAL_STATES, NULL); log_service_states(INITIAL_STATES, NULL); timing_point("Initial states logged\n"); /* reset the restart flag */ sigrestart = FALSE; /* fire up command file worker */ launch_command_file_worker(); timing_point("Command file worker launched\n"); #ifdef USE_EVENT_BROKER /* send program data to broker */ broker_program_state(NEBTYPE_PROCESS_EVENTLOOPSTART, NEBFLAG_NONE, NEBATTR_NONE, NULL); #endif /* get event start time and save as macro */ event_start = time(NULL); my_free(mac->x[MACRO_EVENTSTARTTIME]); asprintf(&mac->x[MACRO_EVENTSTARTTIME], "%llu", (unsigned long long)event_start); timing_point("Entering event execution loop\n"); /***** start monitoring all services *****/ /* (doesn't return until a restart or shutdown signal is encountered) */ event_execution_loop(); /* * immediately deinitialize the query handler so it * can remove modules that have stashed data with it */ qh_deinit(qh_socket_path ? qh_socket_path : DEFAULT_QUERY_SOCKET); /* 03/01/2007 EG Moved from sighandler() to prevent FUTEX locking problems under NPTL */ /* 03/21/2007 EG SIGSEGV signals are still logged in sighandler() so we don't loose them */ /* did we catch a signal? */ if(caught_signal == TRUE) { if(sig_id == SIGHUP) logit(NSLOG_PROCESS_INFO, TRUE, "Caught SIGHUP, restarting...\n"); } #ifdef USE_EVENT_BROKER /* send program data to broker */ broker_program_state(NEBTYPE_PROCESS_EVENTLOOPEND, NEBFLAG_NONE, NEBATTR_NONE, NULL); if(sigshutdown == TRUE) broker_program_state(NEBTYPE_PROCESS_SHUTDOWN, NEBFLAG_USER_INITIATED, NEBATTR_SHUTDOWN_NORMAL, NULL); else if(sigrestart == TRUE) broker_program_state(NEBTYPE_PROCESS_RESTART, NEBFLAG_USER_INITIATED, NEBATTR_RESTART_NORMAL, NULL); #endif /* save service and host state information */ save_state_information(FALSE); cleanup_retention_data(); /* clean up performance data */ cleanup_performance_data(); /* clean up the scheduled downtime data */ cleanup_downtime_data(); /* clean up the status data unless we're restarting */ if(sigrestart == FALSE) { cleanup_status_data(TRUE); } free_worker_memory(WPROC_FORCE); /* shutdown stuff... */ if(sigshutdown == TRUE) { iobroker_destroy(nagios_iobs, IOBROKER_CLOSE_SOCKETS); nagios_iobs = NULL; /* log a shutdown message */ logit(NSLOG_PROCESS_INFO, TRUE, "Successfully shutdown... (PID=%d)\n", (int)getpid()); } /* clean up after ourselves */ cleanup(); /* close debug log */ close_debug_log(); } while(sigrestart == TRUE && sigshutdown == FALSE); if(daemon_mode == TRUE) unlink(lock_file); /* free misc memory */ my_free(lock_file); my_free(config_file); my_free(config_file_dir); my_free(nagios_binary_path); } return OK; } nagios-4.3.4/base/nagiostats.c000066400000000000000000001723621314764422400162560ustar00rootroot00000000000000/***************************************************************************** * * NAGIOSTATS.C - Displays Nagios Statistics * * Program: Nagiostats * License: GPL * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #include "../lib/libnagios.h" #include "../include/config.h" #include "../include/common.h" #include "../include/nagios.h" #include "../include/locations.h" #define STATUS_NO_DATA 0 #define STATUS_INFO_DATA 1 #define STATUS_PROGRAM_DATA 2 #define STATUS_HOST_DATA 3 #define STATUS_SERVICE_DATA 4 static char *main_config_file = NULL; char *status_file = NULL; static char *mrtg_variables = NULL; static const char *mrtg_delimiter = "\n"; static int mrtg_mode = FALSE; static time_t status_creation_date = 0L; static char *status_version = NULL; time_t program_start = 0L; static int status_service_entries = 0; static int status_host_entries = 0; int nagios_pid = 0; static double min_service_state_change = 0.0; static int have_min_service_state_change = FALSE; static double max_service_state_change = 0.0; static int have_max_service_state_change = FALSE; static double average_service_state_change = 0.0; static double min_active_service_state_change = 0.0; static int have_min_active_service_state_change = FALSE; static double max_active_service_state_change = 0.0; static int have_max_active_service_state_change = FALSE; static double average_active_service_state_change = 0.0; static double min_active_service_latency = 0.0; static int have_min_active_service_latency = FALSE; static double max_active_service_latency = 0.0; static int have_max_active_service_latency = FALSE; static double average_active_service_latency = 0.0; static double min_active_service_execution_time = 0.0; static int have_min_active_service_execution_time = FALSE; static double max_active_service_execution_time = 0.0; static int have_max_active_service_execution_time = FALSE; static double average_active_service_execution_time = 0.0; static double min_passive_service_state_change = 0.0; static int have_min_passive_service_state_change = FALSE; static double max_passive_service_state_change = 0.0; static int have_max_passive_service_state_change = FALSE; static double average_passive_service_state_change = 0.0; static double min_passive_service_latency = 0.0; static int have_min_passive_service_latency = FALSE; static double max_passive_service_latency = 0.0; static int have_max_passive_service_latency = FALSE; static double average_passive_service_latency = 0.0; static int have_min_host_state_change = FALSE; static double min_host_state_change = 0.0; static int have_max_host_state_change = FALSE; static double max_host_state_change = 0.0; static double average_host_state_change = 0.0; static int have_min_active_host_state_change = FALSE; static double min_active_host_state_change = 0.0; static int have_max_active_host_state_change = FALSE; static double max_active_host_state_change = 0.0; static double average_active_host_state_change = 0.0; static int have_min_active_host_latency = FALSE; static double min_active_host_latency = 0.0; static int have_max_active_host_latency = FALSE; static double max_active_host_latency = 0.0; static double average_active_host_latency = 0.0; static int have_min_active_host_execution_time = FALSE; static double min_active_host_execution_time = 0.0; static int have_max_active_host_execution_time = FALSE; static double max_active_host_execution_time = 0.0; static double average_active_host_execution_time = 0.0; static int have_min_passive_host_latency = FALSE; static double min_passive_host_latency = 0.0; static int have_max_passive_host_latency = FALSE; static double max_passive_host_latency = 0.0; static double average_passive_host_latency = 0.0; static double min_passive_host_state_change = 0.0; static int have_min_passive_host_state_change = FALSE; static double max_passive_host_state_change = 0.0; static int have_max_passive_host_state_change = FALSE; static double average_passive_host_state_change = 0.0; static int passive_service_checks = 0; static int active_service_checks = 0; static int services_ok = 0; static int services_warning = 0; static int services_unknown = 0; static int services_critical = 0; static int services_flapping = 0; static int services_in_downtime = 0; static int services_checked = 0; static int services_scheduled = 0; static int passive_host_checks = 0; static int active_host_checks = 0; static int hosts_up = 0; static int hosts_down = 0; static int hosts_unreachable = 0; static int hosts_flapping = 0; static int hosts_in_downtime = 0; static int hosts_checked = 0; static int hosts_scheduled = 0; static int passive_services_checked_last_1min = 0; static int passive_services_checked_last_5min = 0; static int passive_services_checked_last_15min = 0; static int passive_services_checked_last_1hour = 0; static int active_services_checked_last_1min = 0; static int active_services_checked_last_5min = 0; static int active_services_checked_last_15min = 0; static int active_services_checked_last_1hour = 0; static int passive_hosts_checked_last_1min = 0; static int passive_hosts_checked_last_5min = 0; static int passive_hosts_checked_last_15min = 0; static int passive_hosts_checked_last_1hour = 0; static int active_hosts_checked_last_1min = 0; static int active_hosts_checked_last_5min = 0; static int active_hosts_checked_last_15min = 0; static int active_hosts_checked_last_1hour = 0; static int active_host_checks_last_1min = 0; static int active_host_checks_last_5min = 0; static int active_host_checks_last_15min = 0; static int active_ondemand_host_checks_last_1min = 0; static int active_ondemand_host_checks_last_5min = 0; static int active_ondemand_host_checks_last_15min = 0; static int active_scheduled_host_checks_last_1min = 0; static int active_scheduled_host_checks_last_5min = 0; static int active_scheduled_host_checks_last_15min = 0; static int passive_host_checks_last_1min = 0; static int passive_host_checks_last_5min = 0; static int passive_host_checks_last_15min = 0; static int active_cached_host_checks_last_1min = 0; static int active_cached_host_checks_last_5min = 0; static int active_cached_host_checks_last_15min = 0; static int parallel_host_checks_last_1min = 0; static int parallel_host_checks_last_5min = 0; static int parallel_host_checks_last_15min = 0; static int serial_host_checks_last_1min = 0; static int serial_host_checks_last_5min = 0; static int serial_host_checks_last_15min = 0; static int active_service_checks_last_1min = 0; static int active_service_checks_last_5min = 0; static int active_service_checks_last_15min = 0; static int active_ondemand_service_checks_last_1min = 0; static int active_ondemand_service_checks_last_5min = 0; static int active_ondemand_service_checks_last_15min = 0; static int active_scheduled_service_checks_last_1min = 0; static int active_scheduled_service_checks_last_5min = 0; static int active_scheduled_service_checks_last_15min = 0; static int passive_service_checks_last_1min = 0; static int passive_service_checks_last_5min = 0; static int passive_service_checks_last_15min = 0; static int active_cached_service_checks_last_1min = 0; static int active_cached_service_checks_last_5min = 0; static int active_cached_service_checks_last_15min = 0; static int external_commands_last_1min = 0; static int external_commands_last_5min = 0; static int external_commands_last_15min = 0; static int display_mrtg_values(void); static int display_stats(void); static int read_config_file(void); static int read_status_file(void); int main(int argc, char **argv) { int result; int error = FALSE; int display_license = FALSE; int display_help = FALSE; int c; #ifdef HAVE_GETOPT_H int option_index = 0; static struct option long_options[] = { {"help", no_argument, NULL, 'h'}, {"version", no_argument, NULL, 'V'}, {"license", no_argument, NULL, 'L'}, {"config", required_argument, NULL, 'c'}, {"statsfile", required_argument, NULL, 's'}, {"mrtg", no_argument, NULL, 'm'}, {"data", required_argument, NULL, 'd'}, {"delimiter", required_argument, NULL, 'D'}, {NULL, 0, NULL, 0} }; #define getopt(argc, argv, OPTSTR) getopt_long(argc, argv, OPTSTR, long_options, &option_index) #endif /* defaults */ main_config_file = strdup(DEFAULT_CONFIG_FILE); /* get all command line arguments */ while(1) { c = getopt(argc, argv, "+hVLc:ms:d:D:"); if(c == -1 || c == EOF) break; switch(c) { case '?': case 'h': display_help = TRUE; break; case 'V': display_license = TRUE; break; case 'L': display_license = TRUE; break; case 'c': if(main_config_file) free(main_config_file); main_config_file = strdup(optarg); break; case 's': status_file = strdup(optarg); break; case 'm': mrtg_mode = TRUE; break; case 'd': mrtg_variables = strdup(optarg); break; case 'D': mrtg_delimiter = strdup(optarg); break; default: break; } } if(mrtg_mode == FALSE) { printf("\nNagios Stats %s\n", PROGRAM_VERSION); printf("Copyright (c) 2003-2008 Ethan Galstad (www.nagios.org)\n"); printf("Last Modified: %s\n", PROGRAM_MODIFICATION_DATE); printf("License: GPL\n\n"); } /* just display the license */ if(display_license == TRUE) { printf("This program is free software; you can redistribute it and/or modify\n"); printf("it under the terms of the GNU General Public License version 2 as\n"); printf("published by the Free Software Foundation.\n\n"); printf("This program is distributed in the hope that it will be useful,\n"); printf("but WITHOUT ANY WARRANTY; without even the implied warranty of\n"); printf("MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"); printf("GNU General Public License for more details.\n\n"); printf("You should have received a copy of the GNU General Public License\n"); printf("along with this program; if not, write to the Free Software\n"); printf("Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\n\n"); exit(OK); } /* if there are no command line options (or if we encountered an error), print usage */ if(error == TRUE || display_help == TRUE) { printf("Usage: %s [options]\n", argv[0]); printf("\n"); printf("Startup:\n"); printf(" -V, --version display program version information and exit.\n"); printf(" -L, --license display license information and exit.\n"); printf(" -h, --help display usage information and exit.\n"); printf("\n"); printf("Input file:\n"); printf(" -c, --config=FILE specifies location of main Nagios config file.\n"); printf(" -s, --statsfile=FILE specifies alternate location of file to read Nagios\n"); printf(" performance data from.\n"); printf("\n"); printf("Output:\n"); printf(" -m, --mrtg display output in MRTG compatible format.\n"); printf(" -d, --data=VARS comma-separated list of variables to output in MRTG\n"); printf(" (or compatible) format. See possible values below.\n"); printf(" Percentages are rounded, times are in milliseconds.\n"); printf(" -D, --delimiter=C character to use as delimiter in MRTG output mode.\n"); printf(" Defaults to a newline.\n"); printf("\n"); printf("MRTG DATA VARIABLES (-d option):\n"); printf(" PROGRUNTIME string with time Nagios process has been running.\n"); printf(" PROGRUNTIMETT time Nagios process has been running (time_t format).\n"); printf(" STATUSFILEAGE string with age of status data file.\n"); printf(" STATUSFILEAGETT string with age of status data file (time_t format).\n"); printf(" NAGIOSVERSION string with Nagios version.\n"); printf(" NAGIOSPID pid number of Nagios daemon.\n"); printf(" NAGIOSVERPID string with Nagios version and PID.\n"); printf(" TOTCMDBUF total number of external command buffer slots available.\n"); printf(" USEDCMDBUF number of external command buffer slots currently in use.\n"); printf(" HIGHCMDBUF highest number of external command buffer slots ever in use.\n"); printf(" NUMSERVICES total number of services.\n"); printf(" NUMHOSTS total number of hosts.\n"); printf(" NUMSVCOK number of services OK.\n"); printf(" NUMSVCWARN number of services WARNING.\n"); printf(" NUMSVCUNKN number of services UNKNOWN.\n"); printf(" NUMSVCCRIT number of services CRITICAL.\n"); printf(" NUMSVCPROB number of service problems (WARNING, UNKNOWN or CRITICAL).\n"); printf(" NUMSVCCHECKED number of services that have been checked since start.\n"); printf(" NUMSVCSCHEDULED number of services that are currently scheduled to be checked.\n"); printf(" NUMSVCFLAPPING number of services that are currently flapping.\n"); printf(" NUMSVCDOWNTIME number of services that are currently in downtime.\n"); printf(" NUMHSTUP number of hosts UP.\n"); printf(" NUMHSTDOWN number of hosts DOWN.\n"); printf(" NUMHSTUNR number of hosts UNREACHABLE.\n"); printf(" NUMHSTPROB number of host problems (DOWN or UNREACHABLE).\n"); printf(" NUMHSTCHECKED number of hosts that have been checked since start.\n"); printf(" NUMHSTSCHEDULED number of hosts that are currently scheduled to be checked.\n"); printf(" NUMHSTFLAPPING number of hosts that are currently flapping.\n"); printf(" NUMHSTDOWNTIME number of hosts that are currently in downtime.\n"); printf(" NUMHSTACTCHKxM number of hosts actively checked in last 1/5/15/60 minutes.\n"); printf(" NUMHSTPSVCHKxM number of hosts passively checked in last 1/5/15/60 minutes.\n"); printf(" NUMSVCACTCHKxM number of services actively checked in last 1/5/15/60 minutes.\n"); printf(" NUMSVCPSVCHKxM number of services passively checked in last 1/5/15/60 minutes.\n"); printf(" xxxACTSVCLAT MIN/MAX/AVG active service check latency (ms).\n"); printf(" xxxACTSVCEXT MIN/MAX/AVG active service check execution time (ms).\n"); printf(" xxxACTSVCPSC MIN/MAX/AVG active service check %% state change.\n"); printf(" xxxPSVSVCLAT MIN/MAX/AVG passive service check latency (ms).\n"); printf(" xxxPSVSVCPSC MIN/MAX/AVG passive service check %% state change.\n"); printf(" xxxSVCPSC MIN/MAX/AVG service check %% state change.\n"); printf(" xxxACTHSTLAT MIN/MAX/AVG active host check latency (ms).\n"); printf(" xxxACTHSTEXT MIN/MAX/AVG active host check execution time (ms).\n"); printf(" xxxACTHSTPSC MIN/MAX/AVG active host check %% state change.\n"); printf(" xxxPSVHSTLAT MIN/MAX/AVG passive host check latency (ms).\n"); printf(" xxxPSVHSTPSC MIN/MAX/AVG passive host check %% state change.\n"); printf(" xxxHSTPSC MIN/MAX/AVG host check %% state change.\n"); printf(" NUMACTHSTCHECKSxM number of total active host checks occurring in last 1/5/15 minutes.\n"); printf(" NUMOACTHSTCHECKSxM number of on-demand active host checks occurring in last 1/5/15 minutes.\n"); printf(" NUMCACHEDHSTCHECKSxM number of cached host checks occurring in last 1/5/15 minutes.\n"); printf(" NUMSACTHSTCHECKSxM number of scheduled active host checks occurring in last 1/5/15 minutes.\n"); printf(" NUMPARHSTCHECKSxM number of parallel host checks occurring in last 1/5/15 minutes.\n"); printf(" NUMSERHSTCHECKSxM number of serial host checks occurring in last 1/5/15 minutes.\n"); printf(" NUMPSVHSTCHECKSxM number of passive host checks occurring in last 1/5/15 minutes.\n"); printf(" NUMACTSVCCHECKSxM number of total active service checks occurring in last 1/5/15 minutes.\n"); printf(" NUMOACTSVCCHECKSxM number of on-demand active service checks occurring in last 1/5/15 minutes.\n"); printf(" NUMCACHEDSVCCHECKSxM number of cached service checks occurring in last 1/5/15 minutes.\n"); printf(" NUMSACTSVCCHECKSxM number of scheduled active service checks occurring in last 1/5/15 minutes.\n"); printf(" NUMPSVSVCCHECKSxM number of passive service checks occurring in last 1/5/15 minutes.\n"); printf(" NUMEXTCMDSxM number of external commands processed in last 1/5/15 minutes.\n"); printf("\n"); printf(" Note: Replace x's in MRTG variable names with 'MIN', 'MAX', 'AVG', or the\n"); printf(" the appropriate number (i.e. '1', '5', '15', or '60').\n"); printf("\n"); exit(ERROR); } /* if we got no -s option, we must read the main config file */ if (status_file == NULL) { /* read main config file */ result = read_config_file(); if(result == ERROR && mrtg_mode == FALSE) { printf("Error processing config file '%s'\n", main_config_file); return ERROR; } } /* read status file */ result = read_status_file(); if(result == ERROR && mrtg_mode == FALSE) { printf("Error reading status file '%s': %s\n", status_file, strerror(errno)); return ERROR; } /* display stats */ if(mrtg_mode == FALSE) display_stats(); else display_mrtg_values(); /* Opsera patch - return based on error, because mrtg_mode was always returning OK */ if(result == ERROR) return ERROR; else return OK; } static int display_mrtg_values(void) { char *temp_ptr; time_t current_time; unsigned long time_difference; int days; int hours; int minutes; int seconds; time(¤t_time); if(mrtg_variables == NULL) return OK; /* process all variables */ for(temp_ptr = strtok(mrtg_variables, ","); temp_ptr != NULL; temp_ptr = strtok(NULL, ",")) { if(!strcmp(temp_ptr, "PROGRUNTIME")) { time_difference = (current_time - program_start); get_time_breakdown(time_difference, &days, &hours, &minutes, &seconds); printf("%dd %dh %dm %ds%s", days, hours, minutes, seconds, mrtg_delimiter); } else if(!strcmp(temp_ptr, "PROGRUNTIMETT")) { time_difference = (current_time - program_start); printf("%lu%s", time_difference, mrtg_delimiter); } else if(!strcmp(temp_ptr, "STATUSFILEAGE")) { time_difference = (current_time - status_creation_date); get_time_breakdown(time_difference, &days, &hours, &minutes, &seconds); printf("%dd %dh %dm %ds%s", days, hours, minutes, seconds, mrtg_delimiter); } else if(!strcmp(temp_ptr, "STATUSFILEAGETT")) { time_difference = (current_time - status_creation_date); printf("%lu%s", time_difference, mrtg_delimiter); } else if(!strcmp(temp_ptr, "NAGIOSVERSION")) printf("%s%s", status_version, mrtg_delimiter); else if(!strcmp(temp_ptr, "NAGIOSPID")) printf("%d%s", nagios_pid, mrtg_delimiter); else if(!strcmp(temp_ptr, "NAGIOSVERPID")) printf("Nagios %s (pid=%d)%s", status_version, nagios_pid, mrtg_delimiter); else if(!strcmp(temp_ptr, "NUMSERVICES")) printf("%d%s", status_service_entries, mrtg_delimiter); else if(!strcmp(temp_ptr, "NUMHOSTS")) printf("%d%s", status_host_entries, mrtg_delimiter); /* active service check latency */ else if(!strcmp(temp_ptr, "MINACTSVCLAT")) printf("%d%s", (int)(min_active_service_latency * 1000), mrtg_delimiter); else if(!strcmp(temp_ptr, "MAXACTSVCLAT")) printf("%d%s", (int)(max_active_service_latency * 1000), mrtg_delimiter); else if(!strcmp(temp_ptr, "AVGACTSVCLAT")) printf("%d%s", (int)(average_active_service_latency * 1000), mrtg_delimiter); /* active service check execution time */ else if(!strcmp(temp_ptr, "MINACTSVCEXT")) printf("%d%s", (int)(min_active_service_execution_time * 1000), mrtg_delimiter); else if(!strcmp(temp_ptr, "MAXACTSVCEXT")) printf("%d%s", (int)(max_active_service_execution_time * 1000), mrtg_delimiter); else if(!strcmp(temp_ptr, "AVGACTSVCEXT")) printf("%d%s", (int)(average_active_service_execution_time * 1000), mrtg_delimiter); /* active service check percent state change */ else if(!strcmp(temp_ptr, "MINACTSVCPSC")) printf("%d%s", (int)min_active_service_state_change, mrtg_delimiter); else if(!strcmp(temp_ptr, "MAXACTSVCPSC")) printf("%d%s", (int)max_active_service_state_change, mrtg_delimiter); else if(!strcmp(temp_ptr, "AVGACTSVCPSC")) printf("%d%s", (int)average_active_service_state_change, mrtg_delimiter); /* passive service check latency */ else if(!strcmp(temp_ptr, "MINPSVSVCLAT")) printf("%d%s", (int)(min_passive_service_latency * 1000), mrtg_delimiter); else if(!strcmp(temp_ptr, "MAXPSVSVCLAT")) printf("%d%s", (int)(max_passive_service_latency * 1000), mrtg_delimiter); else if(!strcmp(temp_ptr, "AVGPSVSVCLAT")) printf("%d%s", (int)(average_passive_service_latency * 1000), mrtg_delimiter); /* passive service check percent state change */ else if(!strcmp(temp_ptr, "MINPSVSVCPSC")) printf("%d%s", (int)min_passive_service_state_change, mrtg_delimiter); else if(!strcmp(temp_ptr, "MAXPSVSVCPSC")) printf("%d%s", (int)max_passive_service_state_change, mrtg_delimiter); else if(!strcmp(temp_ptr, "AVGPSVSVCPSC")) printf("%d%s", (int)average_passive_service_state_change, mrtg_delimiter); /* service check percent state change */ else if(!strcmp(temp_ptr, "MINSVCPSC")) printf("%d%s", (int)min_service_state_change, mrtg_delimiter); else if(!strcmp(temp_ptr, "MAXSVCPSC")) printf("%d%s", (int)max_service_state_change, mrtg_delimiter); else if(!strcmp(temp_ptr, "AVGSVCPSC")) printf("%d%s", (int)average_service_state_change, mrtg_delimiter); /* active host check latency */ else if(!strcmp(temp_ptr, "MINACTHSTLAT")) printf("%d%s", (int)(min_active_host_latency * 1000), mrtg_delimiter); else if(!strcmp(temp_ptr, "MAXACTHSTLAT")) printf("%d%s", (int)(max_active_host_latency * 1000), mrtg_delimiter); else if(!strcmp(temp_ptr, "AVGACTHSTLAT")) printf("%d%s", (int)(average_active_host_latency * 1000), mrtg_delimiter); /* active host check execution time */ else if(!strcmp(temp_ptr, "MINACTHSTEXT")) printf("%d%s", (int)(min_active_host_execution_time * 1000), mrtg_delimiter); else if(!strcmp(temp_ptr, "MAXACTHSTEXT")) printf("%d%s", (int)(max_active_host_execution_time * 1000), mrtg_delimiter); else if(!strcmp(temp_ptr, "AVGACTHSTEXT")) printf("%d%s", (int)(average_active_host_execution_time * 1000), mrtg_delimiter); /* active host check percent state change */ else if(!strcmp(temp_ptr, "MINACTHSTPSC")) printf("%d%s", (int)min_active_host_state_change, mrtg_delimiter); else if(!strcmp(temp_ptr, "MAXACTHSTPSC")) printf("%d%s", (int)max_active_host_state_change, mrtg_delimiter); else if(!strcmp(temp_ptr, "AVGACTHSTPSC")) printf("%d%s", (int)average_active_host_state_change, mrtg_delimiter); /* passive host check latency */ else if(!strcmp(temp_ptr, "MINPSVHSTLAT")) printf("%d%s", (int)(min_passive_host_latency * 1000), mrtg_delimiter); else if(!strcmp(temp_ptr, "MAXPSVHSTLAT")) printf("%d%s", (int)(max_passive_host_latency * 1000), mrtg_delimiter); else if(!strcmp(temp_ptr, "AVGPSVHSTLAT")) printf("%d%s", (int)(average_passive_host_latency * 1000), mrtg_delimiter); /* passive host check percent state change */ else if(!strcmp(temp_ptr, "MINPSVHSTPSC")) printf("%d%s", (int)min_passive_host_state_change, mrtg_delimiter); else if(!strcmp(temp_ptr, "MAXPSVHSTPSC")) printf("%d%s", (int)max_passive_host_state_change, mrtg_delimiter); else if(!strcmp(temp_ptr, "AVGPSVHSTPSC")) printf("%d%s", (int)average_passive_host_state_change, mrtg_delimiter); /* host check percent state change */ else if(!strcmp(temp_ptr, "MINHSTPSC")) printf("%d%s", (int)min_host_state_change, mrtg_delimiter); else if(!strcmp(temp_ptr, "MAXHSTPSC")) printf("%d%s", (int)max_host_state_change, mrtg_delimiter); else if(!strcmp(temp_ptr, "AVGHSTPSC")) printf("%d%s", (int)average_host_state_change, mrtg_delimiter); /* active host checks over time */ else if(!strcmp(temp_ptr, "NUMHSTACTCHK1M")) printf("%d%s", active_hosts_checked_last_1min, mrtg_delimiter); else if(!strcmp(temp_ptr, "NUMHSTACTCHK5M")) printf("%d%s", active_hosts_checked_last_5min, mrtg_delimiter); else if(!strcmp(temp_ptr, "NUMHSTACTCHK15M")) printf("%d%s", active_hosts_checked_last_15min, mrtg_delimiter); else if(!strcmp(temp_ptr, "NUMHSTACTCHK60M")) printf("%d%s", active_hosts_checked_last_1hour, mrtg_delimiter); /* passive host checks over time */ else if(!strcmp(temp_ptr, "NUMHSTPSVCHK1M")) printf("%d%s", passive_hosts_checked_last_1min, mrtg_delimiter); else if(!strcmp(temp_ptr, "NUMHSTPSVCHK5M")) printf("%d%s", passive_hosts_checked_last_5min, mrtg_delimiter); else if(!strcmp(temp_ptr, "NUMHSTPSVCHK15M")) printf("%d%s", passive_hosts_checked_last_15min, mrtg_delimiter); else if(!strcmp(temp_ptr, "NUMHSTPSVCHK60M")) printf("%d%s", passive_hosts_checked_last_1hour, mrtg_delimiter); /* active service checks over time */ else if(!strcmp(temp_ptr, "NUMSVCACTCHK1M")) printf("%d%s", active_services_checked_last_1min, mrtg_delimiter); else if(!strcmp(temp_ptr, "NUMSVCACTCHK5M")) printf("%d%s", active_services_checked_last_5min, mrtg_delimiter); else if(!strcmp(temp_ptr, "NUMSVCACTCHK15M")) printf("%d%s", active_services_checked_last_15min, mrtg_delimiter); else if(!strcmp(temp_ptr, "NUMSVCACTCHK60M")) printf("%d%s", active_services_checked_last_1hour, mrtg_delimiter); /* passive service checks over time */ else if(!strcmp(temp_ptr, "NUMSVCPSVCHK1M")) printf("%d%s", passive_services_checked_last_1min, mrtg_delimiter); else if(!strcmp(temp_ptr, "NUMSVCPSVCHK5M")) printf("%d%s", passive_services_checked_last_5min, mrtg_delimiter); else if(!strcmp(temp_ptr, "NUMSVCPSVCHK15M")) printf("%d%s", passive_services_checked_last_15min, mrtg_delimiter); else if(!strcmp(temp_ptr, "NUMSVCPSVCHK60M")) printf("%d%s", passive_services_checked_last_1hour, mrtg_delimiter); /* host check statistics */ else if(!strcmp(temp_ptr, "NUMACTHSTCHECKS1M")) printf("%d%s", active_host_checks_last_1min, mrtg_delimiter); else if(!strcmp(temp_ptr, "NUMACTHSTCHECKS5M")) printf("%d%s", active_host_checks_last_5min, mrtg_delimiter); else if(!strcmp(temp_ptr, "NUMACTHSTCHECKS15M")) printf("%d%s", active_host_checks_last_15min, mrtg_delimiter); else if(!strcmp(temp_ptr, "NUMOACTHSTCHECKS1M")) printf("%d%s", active_ondemand_host_checks_last_1min, mrtg_delimiter); else if(!strcmp(temp_ptr, "NUMOACTHSTCHECKS5M")) printf("%d%s", active_ondemand_host_checks_last_5min, mrtg_delimiter); else if(!strcmp(temp_ptr, "NUMOACTHSTCHECKS15M")) printf("%d%s", active_ondemand_host_checks_last_15min, mrtg_delimiter); else if(!strcmp(temp_ptr, "NUMSACTHSTCHECKS1M")) printf("%d%s", active_scheduled_host_checks_last_1min, mrtg_delimiter); else if(!strcmp(temp_ptr, "NUMSACTHSTCHECKS5M")) printf("%d%s", active_scheduled_host_checks_last_5min, mrtg_delimiter); else if(!strcmp(temp_ptr, "NUMSACTHSTCHECKS15M")) printf("%d%s", active_scheduled_host_checks_last_15min, mrtg_delimiter); else if(!strcmp(temp_ptr, "NUMPARHSTCHECKS1M")) printf("%d%s", parallel_host_checks_last_1min, mrtg_delimiter); else if(!strcmp(temp_ptr, "NUMPARHSTCHECKS5M")) printf("%d%s", parallel_host_checks_last_5min, mrtg_delimiter); else if(!strcmp(temp_ptr, "NUMPARHSTCHECKS15M")) printf("%d%s", parallel_host_checks_last_15min, mrtg_delimiter); else if(!strcmp(temp_ptr, "NUMSERHSTCHECKS1M")) printf("%d%s", serial_host_checks_last_1min, mrtg_delimiter); else if(!strcmp(temp_ptr, "NUMSERHSTCHECKS5M")) printf("%d%s", serial_host_checks_last_5min, mrtg_delimiter); else if(!strcmp(temp_ptr, "NUMSERHSTCHECKS15M")) printf("%d%s", serial_host_checks_last_15min, mrtg_delimiter); else if(!strcmp(temp_ptr, "NUMPSVHSTCHECKS1M")) printf("%d%s", passive_host_checks_last_1min, mrtg_delimiter); else if(!strcmp(temp_ptr, "NUMPSVHSTCHECKS5M")) printf("%d%s", passive_host_checks_last_5min, mrtg_delimiter); else if(!strcmp(temp_ptr, "NUMPSVHSTCHECKS15M")) printf("%d%s", passive_host_checks_last_15min, mrtg_delimiter); else if(!strcmp(temp_ptr, "NUMCACHEDHSTCHECKS1M")) printf("%d%s", active_cached_host_checks_last_1min, mrtg_delimiter); else if(!strcmp(temp_ptr, "NUMCACHEDHSTCHECKS5M")) printf("%d%s", active_cached_host_checks_last_5min, mrtg_delimiter); else if(!strcmp(temp_ptr, "NUMCACHEDHSTCHECKS15M")) printf("%d%s", active_cached_host_checks_last_15min, mrtg_delimiter); /* service check statistics */ else if(!strcmp(temp_ptr, "NUMACTSVCCHECKS1M")) printf("%d%s", active_service_checks_last_1min, mrtg_delimiter); else if(!strcmp(temp_ptr, "NUMACTSVCCHECKS5M")) printf("%d%s", active_service_checks_last_5min, mrtg_delimiter); else if(!strcmp(temp_ptr, "NUMACTSVCCHECKS15M")) printf("%d%s", active_service_checks_last_15min, mrtg_delimiter); else if(!strcmp(temp_ptr, "NUMOACTSVCCHECKS1M")) printf("%d%s", active_ondemand_service_checks_last_1min, mrtg_delimiter); else if(!strcmp(temp_ptr, "NUMOACTSVCCHECKS5M")) printf("%d%s", active_ondemand_service_checks_last_5min, mrtg_delimiter); else if(!strcmp(temp_ptr, "NUMOACTSVCCHECKS15M")) printf("%d%s", active_ondemand_service_checks_last_15min, mrtg_delimiter); else if(!strcmp(temp_ptr, "NUMSACTSVCCHECKS1M")) printf("%d%s", active_scheduled_service_checks_last_1min, mrtg_delimiter); else if(!strcmp(temp_ptr, "NUMSACTSVCCHECKS5M")) printf("%d%s", active_scheduled_service_checks_last_5min, mrtg_delimiter); else if(!strcmp(temp_ptr, "NUMSACTSVCCHECKS15M")) printf("%d%s", active_scheduled_service_checks_last_15min, mrtg_delimiter); else if(!strcmp(temp_ptr, "NUMPSVSVCCHECKS1M")) printf("%d%s", passive_service_checks_last_1min, mrtg_delimiter); else if(!strcmp(temp_ptr, "NUMPSVSVCCHECKS5M")) printf("%d%s", passive_service_checks_last_5min, mrtg_delimiter); else if(!strcmp(temp_ptr, "NUMPSVSVCCHECKS15M")) printf("%d%s", passive_service_checks_last_15min, mrtg_delimiter); else if(!strcmp(temp_ptr, "NUMCACHEDSVCCHECKS1M")) printf("%d%s", active_cached_service_checks_last_1min, mrtg_delimiter); else if(!strcmp(temp_ptr, "NUMCACHEDSVCCHECKS5M")) printf("%d%s", active_cached_service_checks_last_5min, mrtg_delimiter); else if(!strcmp(temp_ptr, "NUMCACHEDSVCCHECKS15M")) printf("%d%s", active_cached_service_checks_last_15min, mrtg_delimiter); /* external command stats */ else if(!strcmp(temp_ptr, "NUMEXTCMDS1M")) printf("%d%s", external_commands_last_1min, mrtg_delimiter); else if(!strcmp(temp_ptr, "NUMEXTCMDS5M")) printf("%d%s", external_commands_last_5min, mrtg_delimiter); else if(!strcmp(temp_ptr, "NUMEXTCMDS15M")) printf("%d%s", external_commands_last_15min, mrtg_delimiter); /* service states */ else if(!strcmp(temp_ptr, "NUMSVCOK")) printf("%d%s", services_ok, mrtg_delimiter); else if(!strcmp(temp_ptr, "NUMSVCWARN")) printf("%d%s", services_warning, mrtg_delimiter); else if(!strcmp(temp_ptr, "NUMSVCUNKN")) printf("%d%s", services_unknown, mrtg_delimiter); else if(!strcmp(temp_ptr, "NUMSVCCRIT")) printf("%d%s", services_critical, mrtg_delimiter); else if(!strcmp(temp_ptr, "NUMSVCPROB")) printf("%d%s", services_warning + services_unknown + services_critical, mrtg_delimiter); /* misc service info */ else if(!strcmp(temp_ptr, "NUMSVCCHECKED")) printf("%d%s", services_checked, mrtg_delimiter); else if(!strcmp(temp_ptr, "NUMSVCSCHEDULED")) printf("%d%s", services_scheduled, mrtg_delimiter); else if(!strcmp(temp_ptr, "NUMSVCFLAPPING")) printf("%d%s", services_flapping, mrtg_delimiter); else if(!strcmp(temp_ptr, "NUMSVCDOWNTIME")) printf("%d%s", services_in_downtime, mrtg_delimiter); /* host states */ else if(!strcmp(temp_ptr, "NUMHSTUP")) printf("%d%s", hosts_up, mrtg_delimiter); else if(!strcmp(temp_ptr, "NUMHSTDOWN")) printf("%d%s", hosts_down, mrtg_delimiter); else if(!strcmp(temp_ptr, "NUMHSTUNR")) printf("%d%s", hosts_unreachable, mrtg_delimiter); else if(!strcmp(temp_ptr, "NUMHSTPROB")) printf("%d%s", hosts_down + hosts_unreachable, mrtg_delimiter); /* misc host info */ else if(!strcmp(temp_ptr, "NUMHSTCHECKED")) printf("%d%s", hosts_checked, mrtg_delimiter); else if(!strcmp(temp_ptr, "NUMHSTSCHEDULED")) printf("%d%s", hosts_scheduled, mrtg_delimiter); else if(!strcmp(temp_ptr, "NUMHSTFLAPPING")) printf("%d%s", hosts_flapping, mrtg_delimiter); else if(!strcmp(temp_ptr, "NUMHSTDOWNTIME")) printf("%d%s", hosts_in_downtime, mrtg_delimiter); else printf("%s%s", temp_ptr, mrtg_delimiter); } /* add a newline if necessary */ if(strcmp(mrtg_delimiter, "\n")) printf("\n"); return OK; } static int display_stats(void) { time_t current_time; unsigned long time_difference; int days; int hours; int minutes; int seconds; time(¤t_time); printf("CURRENT STATUS DATA\n"); printf("------------------------------------------------------\n"); printf("Status File: %s\n", status_file); time_difference = (current_time - status_creation_date); get_time_breakdown(time_difference, &days, &hours, &minutes, &seconds); printf("Status File Age: %dd %dh %dm %ds\n", days, hours, minutes, seconds); printf("Status File Version: %s\n", status_version); printf("\n"); time_difference = (current_time - program_start); get_time_breakdown(time_difference, &days, &hours, &minutes, &seconds); printf("Program Running Time: %dd %dh %dm %ds\n", days, hours, minutes, seconds); printf("Nagios PID: %d\n", nagios_pid); printf("\n"); printf("Total Services: %d\n", status_service_entries); printf("Services Checked: %d\n", services_checked); printf("Services Scheduled: %d\n", services_scheduled); printf("Services Actively Checked: %d\n", active_service_checks); printf("Services Passively Checked: %d\n", passive_service_checks); printf("Total Service State Change: %.3f / %.3f / %.3f %%\n", min_service_state_change, max_service_state_change, average_service_state_change); printf("Active Service Latency: %.3f / %.3f / %.3f sec\n", min_active_service_latency, max_active_service_latency, average_active_service_latency); printf("Active Service Execution Time: %.3f / %.3f / %.3f sec\n", min_active_service_execution_time, max_active_service_execution_time, average_active_service_execution_time); printf("Active Service State Change: %.3f / %.3f / %.3f %%\n", min_active_service_state_change, max_active_service_state_change, average_active_service_state_change); printf("Active Services Last 1/5/15/60 min: %d / %d / %d / %d\n", active_services_checked_last_1min, active_services_checked_last_5min, active_services_checked_last_15min, active_services_checked_last_1hour); printf("Passive Service Latency: %.3f / %.3f / %.3f sec\n", min_passive_service_latency, max_passive_service_latency, average_passive_service_latency); printf("Passive Service State Change: %.3f / %.3f / %.3f %%\n", min_passive_service_state_change, max_passive_service_state_change, average_passive_service_state_change); printf("Passive Services Last 1/5/15/60 min: %d / %d / %d / %d\n", passive_services_checked_last_1min, passive_services_checked_last_5min, passive_services_checked_last_15min, passive_services_checked_last_1hour); printf("Services Ok/Warn/Unk/Crit: %d / %d / %d / %d\n", services_ok, services_warning, services_unknown, services_critical); printf("Services Flapping: %d\n", services_flapping); printf("Services In Downtime: %d\n", services_in_downtime); printf("\n"); printf("Total Hosts: %d\n", status_host_entries); printf("Hosts Checked: %d\n", hosts_checked); printf("Hosts Scheduled: %d\n", hosts_scheduled); printf("Hosts Actively Checked: %d\n", active_host_checks); printf("Host Passively Checked: %d\n", passive_host_checks); printf("Total Host State Change: %.3f / %.3f / %.3f %%\n", min_host_state_change, max_host_state_change, average_host_state_change); printf("Active Host Latency: %.3f / %.3f / %.3f sec\n", min_active_host_latency, max_active_host_latency, average_active_host_latency); printf("Active Host Execution Time: %.3f / %.3f / %.3f sec\n", min_active_host_execution_time, max_active_host_execution_time, average_active_host_execution_time); printf("Active Host State Change: %.3f / %.3f / %.3f %%\n", min_active_host_state_change, max_active_host_state_change, average_active_host_state_change); printf("Active Hosts Last 1/5/15/60 min: %d / %d / %d / %d\n", active_hosts_checked_last_1min, active_hosts_checked_last_5min, active_hosts_checked_last_15min, active_hosts_checked_last_1hour); printf("Passive Host Latency: %.3f / %.3f / %.3f sec\n", min_passive_host_latency, max_passive_host_latency, average_passive_host_latency); printf("Passive Host State Change: %.3f / %.3f / %.3f %%\n", min_passive_host_state_change, max_passive_host_state_change, average_passive_host_state_change); printf("Passive Hosts Last 1/5/15/60 min: %d / %d / %d / %d\n", passive_hosts_checked_last_1min, passive_hosts_checked_last_5min, passive_hosts_checked_last_15min, passive_hosts_checked_last_1hour); printf("Hosts Up/Down/Unreach: %d / %d / %d\n", hosts_up, hosts_down, hosts_unreachable); printf("Hosts Flapping: %d\n", hosts_flapping); printf("Hosts In Downtime: %d\n", hosts_in_downtime); printf("\n"); printf("Active Host Checks Last 1/5/15 min: %d / %d / %d\n", active_host_checks_last_1min, active_host_checks_last_5min, active_host_checks_last_15min); printf(" Scheduled: %d / %d / %d\n", active_scheduled_host_checks_last_1min, active_scheduled_host_checks_last_5min, active_scheduled_host_checks_last_15min); printf(" On-demand: %d / %d / %d\n", active_ondemand_host_checks_last_1min, active_ondemand_host_checks_last_5min, active_ondemand_host_checks_last_15min); printf(" Parallel: %d / %d / %d\n", parallel_host_checks_last_1min, parallel_host_checks_last_5min, parallel_host_checks_last_15min); printf(" Serial: %d / %d / %d\n", serial_host_checks_last_1min, serial_host_checks_last_5min, serial_host_checks_last_15min); printf(" Cached: %d / %d / %d\n", active_cached_host_checks_last_1min, active_cached_host_checks_last_5min, active_cached_host_checks_last_15min); printf("Passive Host Checks Last 1/5/15 min: %d / %d / %d\n", passive_host_checks_last_1min, passive_host_checks_last_5min, passive_host_checks_last_15min); printf("Active Service Checks Last 1/5/15 min: %d / %d / %d\n", active_service_checks_last_1min, active_service_checks_last_5min, active_service_checks_last_15min); printf(" Scheduled: %d / %d / %d\n", active_scheduled_service_checks_last_1min, active_scheduled_service_checks_last_5min, active_scheduled_service_checks_last_15min); printf(" On-demand: %d / %d / %d\n", active_ondemand_service_checks_last_1min, active_ondemand_service_checks_last_5min, active_ondemand_service_checks_last_15min); printf(" Cached: %d / %d / %d\n", active_cached_service_checks_last_1min, active_cached_service_checks_last_5min, active_cached_service_checks_last_15min); printf("Passive Service Checks Last 1/5/15 min: %d / %d / %d\n", passive_service_checks_last_1min, passive_service_checks_last_5min, passive_service_checks_last_15min); printf("\n"); printf("External Commands Last 1/5/15 min: %d / %d / %d\n", external_commands_last_1min, external_commands_last_5min, external_commands_last_15min); printf("\n"); printf("\n"); /* printf("CURRENT COMMENT DATA\n"); printf("----------------------------------------------------\n"); printf("\n"); printf("\n"); printf("CURRENT DOWNTIME DATA\n"); printf("----------------------------------------------------\n"); printf("\n"); */ return OK; } static int read_config_file(void) { char temp_buffer[MAX_INPUT_BUFFER]; FILE *fp; char *var; char *val; char *main_cfg_dir = NULL; char *slash = NULL; main_cfg_dir = nspath_absolute(main_config_file, NULL); if ((slash = strrchr(main_cfg_dir, '/'))) *slash = 0; fp = fopen(main_config_file, "r"); if(fp == NULL) return ERROR; /* read all lines from the main nagios config file */ while(fgets(temp_buffer, sizeof(temp_buffer) - 1, fp)) { strip(temp_buffer); /* skip blank lines and comments */ if(temp_buffer[0] == '#' || temp_buffer[0] == '\x0') continue; var = strtok(temp_buffer, "="); val = strtok(NULL, "\n"); if(val == NULL) continue; if(!strcmp(var, "status_file") || !strcmp(var, "status_log") || !strcmp(var, "xsddefault_status_log")) { if(status_file) free(status_file); status_file = nspath_absolute(val, main_cfg_dir); } } fclose(fp); return OK; } static int read_status_file(void) { char temp_buffer[MAX_INPUT_BUFFER]; FILE *fp = NULL; int data_type = STATUS_NO_DATA; char *var = NULL; char *val = NULL; char *temp_ptr = NULL; time_t current_time; unsigned long time_difference = 0L; double execution_time = 0.0; double latency = 0.0; int check_type = CHECK_TYPE_ACTIVE; int current_state = STATE_OK; double state_change = 0.0; int is_flapping = FALSE; int downtime_depth = 0; time_t last_check = 0L; int should_be_scheduled = TRUE; int has_been_checked = TRUE; time(¤t_time); fp = fopen(status_file, "r"); if(fp == NULL) return ERROR; /* read all lines in the status file */ while(fgets(temp_buffer, sizeof(temp_buffer) - 1, fp)) { /* skip blank lines and comments */ if(temp_buffer[0] == '#' || temp_buffer[0] == '\x0') continue; strip(temp_buffer); /* start of definition */ if(!strcmp(temp_buffer, "servicestatus {")) { data_type = STATUS_SERVICE_DATA; status_service_entries++; } else if(!strcmp(temp_buffer, "hoststatus {")) { data_type = STATUS_HOST_DATA; status_host_entries++; } else if(!strcmp(temp_buffer, "info {")) data_type = STATUS_INFO_DATA; else if(!strcmp(temp_buffer, "programstatus {")) data_type = STATUS_PROGRAM_DATA; /* end of definition */ else if(!strcmp(temp_buffer, "}")) { switch(data_type) { case STATUS_INFO_DATA: break; case STATUS_PROGRAM_DATA: /* 02-15-2008 exclude cached host checks from total (they were ondemand checks that never actually executed) */ active_host_checks_last_1min = active_scheduled_host_checks_last_1min + active_ondemand_host_checks_last_1min; active_host_checks_last_5min = active_scheduled_host_checks_last_5min + active_ondemand_host_checks_last_5min; active_host_checks_last_15min = active_scheduled_host_checks_last_15min + active_ondemand_host_checks_last_15min; /* 02-15-2008 exclude cached service checks from total (they were ondemand checks that never actually executed) */ active_service_checks_last_1min = active_scheduled_service_checks_last_1min + active_ondemand_service_checks_last_1min; active_service_checks_last_5min = active_scheduled_service_checks_last_5min + active_ondemand_service_checks_last_5min; active_service_checks_last_15min = active_scheduled_service_checks_last_15min + active_ondemand_service_checks_last_15min; break; case STATUS_HOST_DATA: average_host_state_change = (((average_host_state_change * ((double)status_host_entries - 1.0)) + state_change) / (double)status_host_entries); if(have_min_host_state_change == FALSE || min_host_state_change > state_change) { have_min_host_state_change = TRUE; min_host_state_change = state_change; } if(have_max_host_state_change == FALSE || max_host_state_change < state_change) { have_max_host_state_change = TRUE; max_host_state_change = state_change; } if(check_type == CHECK_TYPE_ACTIVE) { active_host_checks++; average_active_host_latency = (((average_active_host_latency * ((double)active_host_checks - 1.0)) + latency) / (double)active_host_checks); if(have_min_active_host_latency == FALSE || min_active_host_latency > latency) { have_min_active_host_latency = TRUE; min_active_host_latency = latency; } if(have_max_active_host_latency == FALSE || max_active_host_latency < latency) { have_max_active_host_latency = TRUE; max_active_host_latency = latency; } average_active_host_execution_time = (((average_active_host_execution_time * ((double)active_host_checks - 1.0)) + execution_time) / (double)active_host_checks); if(have_min_active_host_execution_time == FALSE || min_active_host_execution_time > execution_time) { have_min_active_host_execution_time = TRUE; min_active_host_execution_time = execution_time; } if(have_max_active_host_execution_time == FALSE || max_active_host_execution_time < execution_time) { have_max_active_host_execution_time = TRUE; max_active_host_execution_time = execution_time; } average_active_host_state_change = (((average_active_host_state_change * ((double)active_host_checks - 1.0)) + state_change) / (double)active_host_checks); if(have_min_active_host_state_change == FALSE || min_active_host_state_change > state_change) { have_min_active_host_state_change = TRUE; min_active_host_state_change = state_change; } if(have_max_active_host_state_change == FALSE || max_active_host_state_change < state_change) { have_max_active_host_state_change = TRUE; max_active_host_state_change = state_change; } time_difference = current_time - last_check; if(time_difference <= 3600) active_hosts_checked_last_1hour++; if(time_difference <= 900) active_hosts_checked_last_15min++; if(time_difference <= 300) active_hosts_checked_last_5min++; if(time_difference <= 60) active_hosts_checked_last_1min++; } else { passive_host_checks++; average_passive_host_latency = (((average_passive_host_latency * ((double)passive_host_checks - 1.0)) + latency) / (double)passive_host_checks); if(have_min_passive_host_latency == FALSE || min_passive_host_latency > latency) { have_min_passive_host_latency = TRUE; min_passive_host_latency = latency; } if(have_max_passive_host_latency == FALSE || max_passive_host_latency < latency) { have_max_passive_host_latency = TRUE; max_passive_host_latency = latency; } average_passive_host_state_change = (((average_passive_host_state_change * ((double)passive_host_checks - 1.0)) + state_change) / (double)passive_host_checks); if(have_min_passive_host_state_change == FALSE || min_passive_host_state_change > state_change) { have_min_passive_host_state_change = TRUE; min_passive_host_state_change = state_change; } if(have_max_passive_host_state_change == FALSE || max_passive_host_state_change < state_change) { have_max_passive_host_state_change = TRUE; max_passive_host_state_change = state_change; } time_difference = current_time - last_check; if(time_difference <= 3600) passive_hosts_checked_last_1hour++; if(time_difference <= 900) passive_hosts_checked_last_15min++; if(time_difference <= 300) passive_hosts_checked_last_5min++; if(time_difference <= 60) passive_hosts_checked_last_1min++; } switch(current_state) { case HOST_UP: hosts_up++; break; case HOST_DOWN: hosts_down++; break; case HOST_UNREACHABLE: hosts_unreachable++; break; default: break; } if(is_flapping == TRUE) hosts_flapping++; if(downtime_depth > 0) hosts_in_downtime++; if(has_been_checked == TRUE) hosts_checked++; if(should_be_scheduled == TRUE) hosts_scheduled++; break; case STATUS_SERVICE_DATA: average_service_state_change = (((average_service_state_change * ((double)status_service_entries - 1.0)) + state_change) / (double)status_service_entries); if(have_min_service_state_change == FALSE || min_service_state_change > state_change) { have_min_service_state_change = TRUE; min_service_state_change = state_change; } if(have_max_service_state_change == FALSE || max_service_state_change < state_change) { have_max_service_state_change = TRUE; max_service_state_change = state_change; } if(check_type == CHECK_TYPE_ACTIVE) { active_service_checks++; average_active_service_latency = (((average_active_service_latency * ((double)active_service_checks - 1.0)) + latency) / (double)active_service_checks); if(have_min_active_service_latency == FALSE || min_active_service_latency > latency) { have_min_active_service_latency = TRUE; min_active_service_latency = latency; } if(have_max_active_service_latency == FALSE || max_active_service_latency < latency) { have_max_active_service_latency = TRUE; max_active_service_latency = latency; } average_active_service_execution_time = (((average_active_service_execution_time * ((double)active_service_checks - 1.0)) + execution_time) / (double)active_service_checks); if(have_min_active_service_execution_time == FALSE || min_active_service_execution_time > execution_time) { have_min_active_service_execution_time = TRUE; min_active_service_execution_time = execution_time; } if(have_max_active_service_execution_time == FALSE || max_active_service_execution_time < execution_time) { have_max_active_service_execution_time = TRUE; max_active_service_execution_time = execution_time; } average_active_service_state_change = (((average_active_service_state_change * ((double)active_service_checks - 1.0)) + state_change) / (double)active_service_checks); if(have_min_active_service_state_change == FALSE || min_active_service_state_change > state_change) { have_min_active_service_state_change = TRUE; min_active_service_state_change = state_change; } if(have_max_active_service_state_change == FALSE || max_active_service_state_change < state_change) { have_max_active_service_state_change = TRUE; max_active_service_state_change = state_change; } time_difference = current_time - last_check; if(time_difference <= 3600) active_services_checked_last_1hour++; if(time_difference <= 900) active_services_checked_last_15min++; if(time_difference <= 300) active_services_checked_last_5min++; if(time_difference <= 60) active_services_checked_last_1min++; } else { passive_service_checks++; average_passive_service_latency = (((average_passive_service_latency * ((double)passive_service_checks - 1.0)) + latency) / (double)passive_service_checks); if(have_min_passive_service_latency == FALSE || min_passive_service_latency > latency) { have_min_passive_service_latency = TRUE; min_passive_service_latency = latency; } if(have_max_passive_service_latency == FALSE || max_passive_service_latency < latency) { have_max_passive_service_latency = TRUE; max_passive_service_latency = latency; } average_passive_service_state_change = (((average_passive_service_state_change * ((double)passive_service_checks - 1.0)) + state_change) / (double)passive_service_checks); if(have_min_passive_service_state_change == FALSE || min_passive_service_state_change > state_change) { have_min_passive_service_state_change = TRUE; min_passive_service_state_change = state_change; } if(have_max_passive_service_state_change == FALSE || max_passive_service_state_change < state_change) { have_max_passive_service_state_change = TRUE; max_passive_service_state_change = state_change; } time_difference = current_time - last_check; if(time_difference <= 3600) passive_services_checked_last_1hour++; if(time_difference <= 900) passive_services_checked_last_15min++; if(time_difference <= 300) passive_services_checked_last_5min++; if(time_difference <= 60) passive_services_checked_last_1min++; } switch(current_state) { case STATE_OK: services_ok++; break; case STATE_WARNING: services_warning++; break; case STATE_UNKNOWN: services_unknown++; break; case STATE_CRITICAL: services_critical++; break; default: break; } if(is_flapping == TRUE) services_flapping++; if(downtime_depth > 0) services_in_downtime++; if(has_been_checked == TRUE) services_checked++; if(should_be_scheduled == TRUE) services_scheduled++; break; default: break; } data_type = STATUS_NO_DATA; execution_time = 0.0; latency = 0.0; check_type = 0; current_state = 0; state_change = 0.0; is_flapping = FALSE; downtime_depth = 0; last_check = (time_t)0; has_been_checked = FALSE; should_be_scheduled = FALSE; } /* inside definition */ else if(data_type != STATUS_NO_DATA) { var = strtok(temp_buffer, "="); val = strtok(NULL, "\n"); if(val == NULL) continue; switch(data_type) { case STATUS_INFO_DATA: if(!strcmp(var, "created")) status_creation_date = strtoul(val, NULL, 10); else if(!strcmp(var, "version")) status_version = strdup(val); break; case STATUS_PROGRAM_DATA: if(!strcmp(var, "program_start")) program_start = strtoul(val, NULL, 10); else if(!strcmp(var, "nagios_pid")) nagios_pid = strtoul(val, NULL, 10); else if(!strcmp(var, "active_scheduled_host_check_stats")) { if((temp_ptr = strtok(val, ","))) active_scheduled_host_checks_last_1min = atoi(temp_ptr); if((temp_ptr = strtok(NULL, ","))) active_scheduled_host_checks_last_5min = atoi(temp_ptr); if((temp_ptr = strtok(NULL, ","))) active_scheduled_host_checks_last_15min = atoi(temp_ptr); } else if(!strcmp(var, "active_ondemand_host_check_stats")) { if((temp_ptr = strtok(val, ","))) active_ondemand_host_checks_last_1min = atoi(temp_ptr); if((temp_ptr = strtok(NULL, ","))) active_ondemand_host_checks_last_5min = atoi(temp_ptr); if((temp_ptr = strtok(NULL, ","))) active_ondemand_host_checks_last_15min = atoi(temp_ptr); } else if(!strcmp(var, "cached_host_check_stats")) { if((temp_ptr = strtok(val, ","))) active_cached_host_checks_last_1min = atoi(temp_ptr); if((temp_ptr = strtok(NULL, ","))) active_cached_host_checks_last_5min = atoi(temp_ptr); if((temp_ptr = strtok(NULL, ","))) active_cached_host_checks_last_15min = atoi(temp_ptr); } else if(!strcmp(var, "passive_host_check_stats")) { if((temp_ptr = strtok(val, ","))) passive_host_checks_last_1min = atoi(temp_ptr); if((temp_ptr = strtok(NULL, ","))) passive_host_checks_last_5min = atoi(temp_ptr); if((temp_ptr = strtok(NULL, ","))) passive_host_checks_last_15min = atoi(temp_ptr); } else if(!strcmp(var, "active_scheduled_service_check_stats")) { if((temp_ptr = strtok(val, ","))) active_scheduled_service_checks_last_1min = atoi(temp_ptr); if((temp_ptr = strtok(NULL, ","))) active_scheduled_service_checks_last_5min = atoi(temp_ptr); if((temp_ptr = strtok(NULL, ","))) active_scheduled_service_checks_last_15min = atoi(temp_ptr); } else if(!strcmp(var, "active_ondemand_service_check_stats")) { if((temp_ptr = strtok(val, ","))) active_ondemand_service_checks_last_1min = atoi(temp_ptr); if((temp_ptr = strtok(NULL, ","))) active_ondemand_service_checks_last_5min = atoi(temp_ptr); if((temp_ptr = strtok(NULL, ","))) active_ondemand_service_checks_last_15min = atoi(temp_ptr); } else if(!strcmp(var, "cached_service_check_stats")) { if((temp_ptr = strtok(val, ","))) active_cached_service_checks_last_1min = atoi(temp_ptr); if((temp_ptr = strtok(NULL, ","))) active_cached_service_checks_last_5min = atoi(temp_ptr); if((temp_ptr = strtok(NULL, ","))) active_cached_service_checks_last_15min = atoi(temp_ptr); } else if(!strcmp(var, "passive_service_check_stats")) { if((temp_ptr = strtok(val, ","))) passive_service_checks_last_1min = atoi(temp_ptr); if((temp_ptr = strtok(NULL, ","))) passive_service_checks_last_5min = atoi(temp_ptr); if((temp_ptr = strtok(NULL, ","))) passive_service_checks_last_15min = atoi(temp_ptr); } else if(!strcmp(var, "external_command_stats")) { if((temp_ptr = strtok(val, ","))) external_commands_last_1min = atoi(temp_ptr); if((temp_ptr = strtok(NULL, ","))) external_commands_last_5min = atoi(temp_ptr); if((temp_ptr = strtok(NULL, ","))) external_commands_last_15min = atoi(temp_ptr); } else if(!strcmp(var, "parallel_host_check_stats")) { if((temp_ptr = strtok(val, ","))) parallel_host_checks_last_1min = atoi(temp_ptr); if((temp_ptr = strtok(NULL, ","))) parallel_host_checks_last_5min = atoi(temp_ptr); if((temp_ptr = strtok(NULL, ","))) parallel_host_checks_last_15min = atoi(temp_ptr); } else if(!strcmp(var, "serial_host_check_stats")) { if((temp_ptr = strtok(val, ","))) serial_host_checks_last_1min = atoi(temp_ptr); if((temp_ptr = strtok(NULL, ","))) serial_host_checks_last_5min = atoi(temp_ptr); if((temp_ptr = strtok(NULL, ","))) serial_host_checks_last_15min = atoi(temp_ptr); } break; case STATUS_HOST_DATA: if(!strcmp(var, "check_execution_time")) execution_time = strtod(val, NULL); else if(!strcmp(var, "check_latency")) latency = strtod(val, NULL); else if(!strcmp(var, "percent_state_change")) state_change = strtod(val, NULL); else if(!strcmp(var, "check_type")) check_type = atoi(val); else if(!strcmp(var, "current_state")) current_state = atoi(val); else if(!strcmp(var, "is_flapping")) is_flapping = (atoi(val) > 0) ? TRUE : FALSE; else if(!strcmp(var, "scheduled_downtime_depth")) downtime_depth = atoi(val); else if(!strcmp(var, "last_check")) last_check = strtoul(val, NULL, 10); else if(!strcmp(var, "has_been_checked")) has_been_checked = (atoi(val) > 0) ? TRUE : FALSE; else if(!strcmp(var, "should_be_scheduled")) should_be_scheduled = (atoi(val) > 0) ? TRUE : FALSE; break; case STATUS_SERVICE_DATA: if(!strcmp(var, "check_execution_time")) execution_time = strtod(val, NULL); else if(!strcmp(var, "check_latency")) latency = strtod(val, NULL); else if(!strcmp(var, "percent_state_change")) state_change = strtod(val, NULL); else if(!strcmp(var, "check_type")) check_type = atoi(val); else if(!strcmp(var, "current_state")) current_state = atoi(val); else if(!strcmp(var, "is_flapping")) is_flapping = (atoi(val) > 0) ? TRUE : FALSE; else if(!strcmp(var, "scheduled_downtime_depth")) downtime_depth = atoi(val); else if(!strcmp(var, "last_check")) last_check = strtoul(val, NULL, 10); else if(!strcmp(var, "has_been_checked")) has_been_checked = (atoi(val) > 0) ? TRUE : FALSE; else if(!strcmp(var, "should_be_scheduled")) should_be_scheduled = (atoi(val) > 0) ? TRUE : FALSE; break; default: break; } } } fclose(fp); return OK; } /* strip newline, carriage return, and tab characters from beginning and end of a string */ void strip(char *buffer) { register int x; register int y; register int z; if(buffer == NULL || buffer[0] == '\x0') return; /* strip end of string */ y = (int)strlen(buffer); for(x = y - 1; x >= 0; x--) { if(buffer[x] == ' ' || buffer[x] == '\n' || buffer[x] == '\r' || buffer[x] == '\t' || buffer[x] == 13) buffer[x] = '\x0'; else break; } /* strip beginning of string (by shifting) */ y = (int)strlen(buffer); for(x = 0; x < y; x++) { if(buffer[x] == ' ' || buffer[x] == '\n' || buffer[x] == '\r' || buffer[x] == '\t' || buffer[x] == 13) continue; else break; } if(x > 0) { for(z = x; z < y; z++) buffer[z - x] = buffer[z]; buffer[y - x] = '\x0'; } return; } /* get days, hours, minutes, and seconds from a raw time_t format or total seconds */ void get_time_breakdown(unsigned long raw_time, int *days, int *hours, int *minutes, int *seconds) { unsigned long temp_time; int temp_days; int temp_hours; int temp_minutes; int temp_seconds; temp_time = raw_time; temp_days = temp_time / 86400; temp_time -= (temp_days * 86400); temp_hours = temp_time / 3600; temp_time -= (temp_hours * 3600); temp_minutes = temp_time / 60; temp_time -= (temp_minutes * 60); temp_seconds = (int)temp_time; *days = temp_days; *hours = temp_hours; *minutes = temp_minutes; *seconds = temp_seconds; return; } nagios-4.3.4/base/nebmods.c000066400000000000000000000414761314764422400155320ustar00rootroot00000000000000/***************************************************************************** * * NEBMODS.C - Event Broker Module Functions * * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #include "../include/config.h" #include "../include/common.h" #include "../include/nebmods.h" #include "../include/neberrors.h" #include "../include/nagios.h" #ifdef USE_EVENT_BROKER static nebmodule *neb_module_list; static nebcallback **neb_callback_list; /* compat stuff for USE_LTDL */ #ifdef USE_LTDL # define dlopen(p, flags) lt_dlopen(p) # define dlclose(p) lt_dlclose(p) # define dlerror() lt_dlerror() # define dlsym(hdl, sym) lt_dlsym(hdl, sym) # define RTLD_NOW 0 # define RTLD_GLOBAL 0 #else # define lt_dlinit() 0 # define lt_dlexit() 0 #endif /****************************************************************************/ /****************************************************************************/ /* INITIALIZATION/CLEANUP FUNCTIONS */ /****************************************************************************/ /****************************************************************************/ /* initialize module routines */ int neb_init_modules(void) { if(lt_dlinit()) return ERROR; return OK; } /* deinitialize module routines */ int neb_deinit_modules(void) { if(lt_dlexit()) return ERROR; return OK; } /* add a new module to module list */ int neb_add_module(char *filename, char *args, int should_be_loaded) { nebmodule *new_module = NULL; int x = OK; if(filename == NULL) return ERROR; /* allocate memory */ new_module = (nebmodule *)calloc(1, sizeof(nebmodule)); if(new_module == NULL) return ERROR; /* initialize vars */ new_module->filename = (char *)strdup(filename); new_module->args = (args == NULL) ? NULL : (char *)strdup(args); new_module->should_be_loaded = should_be_loaded; new_module->is_currently_loaded = FALSE; for(x = 0; x < NEBMODULE_MODINFO_NUMITEMS; x++) new_module->info[x] = NULL; new_module->module_handle = NULL; new_module->init_func = NULL; new_module->deinit_func = NULL; /* add module to head of list */ new_module->next = neb_module_list; neb_module_list = new_module; log_debug_info(DEBUGL_EVENTBROKER, 0, "Added module: name='%s', args='%s', should_be_loaded='%d'\n", filename, args, should_be_loaded); return OK; } int neb_add_core_module(nebmodule *mod) { mod->should_be_loaded = FALSE; mod->is_currently_loaded = TRUE; mod->core_module = TRUE; #ifdef USE_LTDL mod->module_handle = (lt_dlhandle)mod; #else mod->module_handle = mod; #endif mod->next = neb_module_list; neb_module_list = mod; return 0; } /* free memory allocated to module list */ int neb_free_module_list(void) { nebmodule *temp_module = NULL; nebmodule *next_module = NULL; int x = OK; for(temp_module = neb_module_list; temp_module; temp_module = next_module) { next_module = temp_module->next; for(x = 0; x < NEBMODULE_MODINFO_NUMITEMS; x++) my_free(temp_module->info[x]); /* don't free this stuff for core modules */ if (temp_module->core_module) continue; my_free(temp_module->filename); my_free(temp_module->args); my_free(temp_module); } neb_module_list = NULL; return OK; } /****************************************************************************/ /****************************************************************************/ /* LOAD/UNLOAD FUNCTIONS */ /****************************************************************************/ /****************************************************************************/ /* load all modules */ int neb_load_all_modules(void) { nebmodule *temp_module = NULL; int ret, errors = 0; for(temp_module = neb_module_list; temp_module; temp_module = temp_module->next) { ret = neb_load_module(temp_module); if (ret != OK) { logit(NSLOG_RUNTIME_ERROR, TRUE, "Error: Failed to load module '%s'.\n", temp_module->filename ? temp_module->filename : "(no file?)"); errors++; } } return errors ? ERROR : OK; } /* load a particular module */ int neb_load_module(nebmodule *mod) { int (*initfunc)(int, char *, void *); int *module_version_ptr = NULL; int result = OK; if(mod == NULL) return ERROR; /* don't reopen the module */ if(mod->is_currently_loaded == TRUE) return OK; /* don't load modules unless they should be loaded */ if(mod->should_be_loaded == FALSE || mod->filename == NULL) return ERROR; /* load the module */ mod->module_handle = dlopen(mod->filename, RTLD_NOW | RTLD_GLOBAL); if(mod->module_handle == NULL) { logit(NSLOG_RUNTIME_ERROR, TRUE, "Error: Could not load module '%s' -> %s\n", mod->filename, dlerror()); return ERROR; } /* mark the module as being loaded */ mod->is_currently_loaded = TRUE; /* find module API version */ module_version_ptr = (int *)dlsym(mod->module_handle, "__neb_api_version"); /* check the module API version */ if(module_version_ptr == NULL || ((*module_version_ptr) != CURRENT_NEB_API_VERSION)) { logit(NSLOG_RUNTIME_ERROR, TRUE, "Error: Module '%s' is using an old or unspecified version of the event broker API. Module will be unloaded.\n", mod->filename); neb_unload_module(mod, NEBMODULE_FORCE_UNLOAD, NEBMODULE_ERROR_API_VERSION); return ERROR; } /* locate the initialization function */ mod->init_func = dlsym(mod->module_handle, "nebmodule_init"); /* if the init function could not be located, unload the module */ if(mod->init_func == NULL) { logit(NSLOG_RUNTIME_ERROR, TRUE, "Error: Could not locate nebmodule_init() in module '%s'. Module will be unloaded.\n", mod->filename); neb_unload_module(mod, NEBMODULE_FORCE_UNLOAD, NEBMODULE_ERROR_NO_INIT); return ERROR; } /* run the module's init function */ initfunc = mod->init_func; result = (*initfunc)(NEBMODULE_NORMAL_LOAD, mod->args, mod->module_handle); /* if the init function returned an error, unload the module */ if(result != OK) { logit(NSLOG_RUNTIME_ERROR, TRUE, "Error: Function nebmodule_init() in module '%s' returned an error. Module will be unloaded.\n", mod->filename); neb_unload_module(mod, NEBMODULE_FORCE_UNLOAD, NEBMODULE_ERROR_BAD_INIT); return ERROR; } logit(NSLOG_INFO_MESSAGE, TRUE, "Event broker module '%s' initialized successfully.\n", mod->filename); /* locate the de-initialization function (may or may not be present) */ mod->deinit_func = dlsym(mod->module_handle, "nebmodule_deinit"); log_debug_info(DEBUGL_EVENTBROKER, 0, "Module '%s' loaded with return code of '%d'\n", mod->filename, result); if(mod->deinit_func != NULL) log_debug_info(DEBUGL_EVENTBROKER, 0, "nebmodule_deinit() found\n"); return OK; } /* close (unload) all modules that are currently loaded */ int neb_unload_all_modules(int flags, int reason) { nebmodule *temp_module; for(temp_module = neb_module_list; temp_module; temp_module = temp_module->next) { /* skip modules that are not loaded */ if(temp_module->is_currently_loaded == FALSE) continue; /* skip modules that do not have a valid handle */ if(temp_module->module_handle == NULL) continue; /* close/unload the module */ neb_unload_module(temp_module, flags, reason); } return OK; } /* close (unload) a particular module */ int neb_unload_module(nebmodule *mod, int flags, int reason) { int (*deinitfunc)(int, int); int result = OK; if(mod == NULL) return ERROR; log_debug_info(DEBUGL_EVENTBROKER, 0, "Attempting to unload module '%s': flags=%d, reason=%d\n", mod->filename, flags, reason); /* remove the module's demand-loaded file */ if(daemon_dumps_core == TRUE && mod->dl_file) { (void)unlink(mod->dl_file); my_free(mod->dl_file); } /* call the de-initialization function if available (and the module was initialized) */ if(mod->deinit_func && reason != NEBMODULE_ERROR_BAD_INIT) { deinitfunc = mod->deinit_func; /* module can opt to not be unloaded */ result = (*deinitfunc)(flags, reason); /* if module doesn't want to be unloaded, exit with error (unless its being forced) */ if(result != OK && !(flags & NEBMODULE_FORCE_UNLOAD)) return ERROR; } /* deregister all of the module's callbacks */ neb_deregister_module_callbacks(mod); if(mod->core_module == FALSE) { /* unload the module */ result = dlclose(mod->module_handle); if (result != 0) { logit(NSLOG_RUNTIME_ERROR, TRUE, "Error: Could not unload module '%s' -> %s\n", mod->filename, dlerror()); return ERROR; } } /* mark the module as being unloaded */ mod->is_currently_loaded = FALSE; log_debug_info(DEBUGL_EVENTBROKER, 0, "Module '%s' unloaded successfully.\n", mod->filename); logit(NSLOG_INFO_MESSAGE, FALSE, "Event broker module '%s' deinitialized successfully.\n", mod->filename); return OK; } /****************************************************************************/ /****************************************************************************/ /* INFO FUNCTIONS */ /****************************************************************************/ /****************************************************************************/ /* sets module information */ int neb_set_module_info(void *handle, int type, char *data) { nebmodule *temp_module = NULL; if(handle == NULL) return NEBERROR_NOMODULE; /* check type */ if(type < 0 || type >= NEBMODULE_MODINFO_NUMITEMS) return NEBERROR_MODINFOBOUNDS; /* find the module */ for(temp_module = neb_module_list; temp_module != NULL; temp_module = temp_module->next) { if(temp_module->module_handle == handle) break; } if(temp_module == NULL) return NEBERROR_BADMODULEHANDLE; /* free any previously allocated memory */ my_free(temp_module->info[type]); /* allocate memory for the new data */ if((temp_module->info[type] = (char *)strdup(data)) == NULL) return NEBERROR_NOMEM; return OK; } /****************************************************************************/ /****************************************************************************/ /* CALLBACK FUNCTIONS */ /****************************************************************************/ /****************************************************************************/ /* allows a module to register a callback function */ int neb_register_callback(int callback_type, void *mod_handle, int priority, int (*callback_func)(int, void *)) { nebmodule *temp_module = NULL; nebcallback *new_callback = NULL; nebcallback *temp_callback = NULL; nebcallback *last_callback = NULL; if(callback_func == NULL) return NEBERROR_NOCALLBACKFUNC; if(neb_callback_list == NULL) return NEBERROR_NOCALLBACKLIST; if(mod_handle == NULL) return NEBERROR_NOMODULEHANDLE; /* make sure the callback type is within bounds */ if(callback_type < 0 || callback_type >= NEBCALLBACK_NUMITEMS) return NEBERROR_CALLBACKBOUNDS; /* make sure module handle is valid */ for(temp_module = neb_module_list; temp_module; temp_module = temp_module->next) { if(temp_module->module_handle == mod_handle) break; } if(temp_module == NULL) return NEBERROR_BADMODULEHANDLE; /* allocate memory */ new_callback = (nebcallback *)malloc(sizeof(nebcallback)); if(new_callback == NULL) return NEBERROR_NOMEM; new_callback->priority = priority; new_callback->module_handle = mod_handle; new_callback->callback_func = callback_func; /* add new function to callback list, sorted by priority (first come, first served for same priority) */ new_callback->next = NULL; if(neb_callback_list[callback_type] == NULL) neb_callback_list[callback_type] = new_callback; else { last_callback = NULL; for(temp_callback = neb_callback_list[callback_type]; temp_callback != NULL; temp_callback = temp_callback->next) { if(temp_callback->priority > new_callback->priority) break; last_callback = temp_callback; } if(last_callback == NULL) neb_callback_list[callback_type] = new_callback; else { if(temp_callback == NULL) last_callback->next = new_callback; else { new_callback->next = temp_callback; last_callback->next = new_callback; } } } return OK; } /* dregisters all callback functions for a given module */ int neb_deregister_module_callbacks(nebmodule *mod) { nebcallback *temp_callback = NULL; nebcallback *next_callback = NULL; int callback_type = 0; if(mod == NULL) return NEBERROR_NOMODULE; if(neb_callback_list == NULL) return OK; for(callback_type = 0; callback_type < NEBCALLBACK_NUMITEMS; callback_type++) { for(temp_callback = neb_callback_list[callback_type]; temp_callback != NULL; temp_callback = next_callback) { next_callback = temp_callback->next; if(temp_callback->module_handle == mod->module_handle) neb_deregister_callback(callback_type, (int(*)(int, void*))temp_callback->callback_func); } } return OK; } /* allows a module to deregister a callback function */ int neb_deregister_callback(int callback_type, int (*callback_func)(int, void *)) { nebcallback *temp_callback = NULL; nebcallback *last_callback = NULL; nebcallback *next_callback = NULL; if(callback_func == NULL) return NEBERROR_NOCALLBACKFUNC; if(neb_callback_list == NULL) return NEBERROR_NOCALLBACKLIST; /* make sure the callback type is within bounds */ if(callback_type < 0 || callback_type >= NEBCALLBACK_NUMITEMS) return NEBERROR_CALLBACKBOUNDS; /* find the callback to remove */ for(temp_callback = last_callback = neb_callback_list[callback_type]; temp_callback != NULL; temp_callback = next_callback) { next_callback = temp_callback->next; /* we found it */ if(temp_callback->callback_func == callback_func) break; last_callback = temp_callback; } /* we couldn't find the callback */ if(temp_callback == NULL) return NEBERROR_CALLBACKNOTFOUND; else { /* only one item in the list */ if(temp_callback != last_callback->next) neb_callback_list[callback_type] = NULL; else last_callback->next = next_callback; my_free(temp_callback); } return OK; } /* make callbacks to modules */ int neb_make_callbacks(int callback_type, void *data) { nebcallback *temp_callback, *next_callback; int (*callbackfunc)(int, void *); register int cbresult = 0; int total_callbacks = 0; /* make sure callback list is initialized */ if(neb_callback_list == NULL) return ERROR; /* make sure the callback type is within bounds */ if(callback_type < 0 || callback_type >= NEBCALLBACK_NUMITEMS) return ERROR; log_debug_info(DEBUGL_EVENTBROKER, 1, "Making callbacks (type %d)...\n", callback_type); /* make the callbacks... */ for(temp_callback = neb_callback_list[callback_type]; temp_callback; temp_callback = next_callback) { next_callback = temp_callback->next; callbackfunc = temp_callback->callback_func; cbresult = callbackfunc(callback_type, data); temp_callback = next_callback; total_callbacks++; log_debug_info(DEBUGL_EVENTBROKER, 2, "Callback #%d (type %d) return code = %d\n", total_callbacks, callback_type, cbresult); /* module wants to cancel callbacks to other modules (and potentially cancel the default Nagios handling of an event) */ if(cbresult == NEBERROR_CALLBACKCANCEL) break; /* module wants to override default Nagios handling of an event */ /* not sure if we should bail out here just because one module wants to override things - what about other modules? EG 12/11/2006 */ else if(cbresult == NEBERROR_CALLBACKOVERRIDE) break; } return cbresult; } /* initialize callback list */ int neb_init_callback_list(void) { register int x = 0; /* allocate memory for the callback list */ neb_callback_list = (nebcallback **)malloc(NEBCALLBACK_NUMITEMS * sizeof(nebcallback *)); if(neb_callback_list == NULL) return ERROR; /* initialize list pointers */ for(x = 0; x < NEBCALLBACK_NUMITEMS; x++) neb_callback_list[x] = NULL; return OK; } /* free memory allocated to callback list */ int neb_free_callback_list(void) { nebcallback *temp_callback = NULL; nebcallback *next_callback = NULL; register int x = 0; if(neb_callback_list == NULL) return OK; for(x = 0; x < NEBCALLBACK_NUMITEMS; x++) { for(temp_callback = neb_callback_list[x]; temp_callback != NULL; temp_callback = next_callback) { next_callback = temp_callback->next; my_free(temp_callback); } neb_callback_list[x] = NULL; } my_free(neb_callback_list); return OK; } #endif nagios-4.3.4/base/nerd.c000066400000000000000000000276441314764422400150340ustar00rootroot00000000000000/* * Nagios Event Radio Dispatcher * * This is a subscriber service which initiates a unix domain socket, * listens to it and lets other programs connect to it and subscribe * to various channels using a simple text-based syntax. * * This code uses the eventbroker api to get its data, which means * we're finally eating our own dogfood in that respect. */ #define _GNU_SOURCE 1 #include #include "include/config.h" #include #include #include "lib/libnagios.h" #include "include/common.h" #include "include/objects.h" #include "include/broker.h" #include "include/nebmods.h" #include "include/nebmodules.h" #include "include/nebstructs.h" struct nerd_channel { const char *name; /* name of this channel */ const char *description; /* user-presentable string to document the purpouse of this channel */ unsigned int id; /* channel id (might vary between invocations) */ unsigned int required_options; /* event_broker_options required for this channel */ unsigned int num_callbacks; unsigned int callbacks[NEBCALLBACK_NUMITEMS]; int (*handler)(int , void *); /* callback handler for this channel */ objectlist *subscriptions; /* subscriber list */ }; static nebmodule nerd_mod; /* fake module to get our callbacks accepted */ static struct nerd_channel **channels; static unsigned int num_channels, alloc_channels; static unsigned int chan_host_checks_id, chan_service_checks_id; static unsigned int chan_opath_checks_id; static struct nerd_channel *find_channel(const char *name) { unsigned int i; for(i = 0; i < num_channels; i++) { struct nerd_channel *chan = channels[i]; if(!strcmp(name, chan->name)) { return chan; } } return NULL; } int nerd_get_channel_id(const char *name) { struct nerd_channel *chan; chan = find_channel(name); if (!chan) return -1; return chan->id; } static struct nerd_channel *nerd_get_channel(unsigned int chan_id) { return chan_id >= num_channels ? NULL : channels[chan_id]; } objectlist *nerd_get_subscriptions(int chan_id) { struct nerd_channel *chan = nerd_get_channel(chan_id); return chan ? chan->subscriptions : NULL; } static int nerd_register_channel_callbacks(struct nerd_channel *chan) { unsigned int i; for(i = 0; i < chan->num_callbacks; i++) { int result = neb_register_callback(chan->callbacks[i], &nerd_mod, 0, chan->handler); if(result != 0) { logit(NSLOG_RUNTIME_ERROR, TRUE, "nerd: Failed to register callback %d for channel '%s': %d\n", chan->callbacks[i], chan->name, result); return -1; } } return 0; } static int nerd_deregister_channel_callbacks(struct nerd_channel *chan) { unsigned int i; for(i = 0; i < chan->num_callbacks; i++) { neb_deregister_callback(chan->callbacks[i], chan->handler); } return 0; } static int subscribe(int sd, struct nerd_channel *chan, char *fmt) { struct nerd_subscription *subscr; if(!(subscr = calloc(1, sizeof(*subscr)))) return -1; subscr->sd = sd; subscr->chan = chan; subscr->format = fmt ? strdup(fmt) : NULL; if(!chan->subscriptions) { nerd_register_channel_callbacks(chan); } prepend_object_to_objectlist(&chan->subscriptions, subscr); return 0; } static int cancel_channel_subscription(struct nerd_channel *chan, int sd) { objectlist *list, *next, *prev = NULL; int cancelled = 0; if(!chan) return -1; for(list = chan->subscriptions; list; list = next) { struct nerd_subscription *subscr = (struct nerd_subscription *)list->object_ptr; next = list->next; if(subscr->sd == sd) { cancelled++; free(list); free(subscr); if(prev) { prev->next = next; } else { chan->subscriptions = next; } continue; } prev = list; } if(cancelled) { logit(NSLOG_INFO_MESSAGE, TRUE, "nerd: Cancelled %d subscription%s to channel '%s' for %d\n", cancelled, cancelled == 1 ? "" : "s", chan->name, sd); } if(chan->subscriptions == NULL) nerd_deregister_channel_callbacks(chan); return 0; } static int unsubscribe(int sd, struct nerd_channel *chan) { objectlist *list, *next, *prev = NULL; for(list = chan->subscriptions; list; list = next) { struct nerd_subscription *subscr = (struct nerd_subscription *)list->object_ptr; next = list->next; if(subscr->sd == sd) { /* found it, so remove it */ free(subscr); free(list); if(!prev) { chan->subscriptions = next; continue; } else { prev->next = next; } continue; } prev = list; } if(chan->subscriptions == NULL) { nerd_deregister_channel_callbacks(chan); } return 0; } /* removes a subscriber entirely and closes its socket */ int nerd_cancel_subscriber(int sd) { unsigned int i; for(i = 0; i < num_channels; i++) { cancel_channel_subscription(channels[i], sd); } iobroker_close(nagios_iobs, sd); return 0; } int nerd_broadcast(unsigned int chan_id, void *buf, unsigned int len) { struct nerd_channel *chan; objectlist *list, *next; if (!(chan = nerd_get_channel(chan_id))) return -1; for(list = chan->subscriptions; list; list = next) { struct nerd_subscription *subscr = (struct nerd_subscription *)list->object_ptr; int result; next = list->next; result = send(subscr->sd, buf, len, 0); if(result < 0) { if (errno == EAGAIN) return 0; nerd_cancel_subscriber(subscr->sd); return 500; } } return 0; } static int chan_host_checks(int cb, void *data) { nebstruct_host_check_data *ds = (nebstruct_host_check_data *)data; check_result *cr = (check_result *)ds->check_result_ptr; host *h; char *buf; int len; if(ds->type != NEBTYPE_HOSTCHECK_PROCESSED) return 0; if(channels[chan_host_checks_id]->subscriptions == NULL) return 0; h = (host *)ds->object_ptr; len = asprintf(&buf, "%s from %d -> %d: %s\n", h->name, h->last_state, h->current_state, cr->output); nerd_broadcast(chan_host_checks_id, buf, len); free(buf); return 0; } static int chan_service_checks(int cb, void *data) { nebstruct_service_check_data *ds = (nebstruct_service_check_data *)data; check_result *cr = (check_result *)ds->check_result_ptr; service *s; char *buf; int len; if(ds->type != NEBTYPE_SERVICECHECK_PROCESSED) return 0; s = (service *)ds->object_ptr; len = asprintf(&buf, "%s;%s from %d -> %d: %s\n", s->host_name, s->description, s->last_state, s->current_state, cr->output); nerd_broadcast(chan_service_checks_id, buf, len); free(buf); return 0; } static char **host_parent_path_cache; static const char *host_parent_path(host *leaf, char sep) { char *ret; unsigned int len = 0, pos = 0; objectlist *stack = NULL, *list, *next; host *h = leaf; if(!h->parent_hosts) return h->name; if(!host_parent_path_cache) { host_parent_path_cache = calloc(num_objects.hosts, sizeof(char *)); } if(host_parent_path_cache[h->id]) { return host_parent_path_cache[h->id]; } while(h) { len += strlen(h->name) + 2; /* room for separator */ prepend_object_to_objectlist(&stack, h->name); if(h->parent_hosts && h->parent_hosts->host_ptr) h = h->parent_hosts->host_ptr; else break; } ret = malloc(len + 1); for(list = stack; list; list = next) { char *ppart = (char *)list->object_ptr; next = list->next; free(list); ret[pos++] = sep; memcpy(ret + pos, ppart, strlen(ppart)); pos += strlen(ppart); } ret[pos++] = 0; host_parent_path_cache[leaf->id] = ret; return ret; } static int chan_opath_checks(int cb, void *data) { const int red = 0xff0000, green = 0xff00, blue = 0xff, pale = 0x555555; unsigned int color; check_result *cr; host *h; const char *name = "_HOST_"; char *buf = NULL; if(cb == NEBCALLBACK_HOST_CHECK_DATA) { nebstruct_host_check_data *ds = (nebstruct_host_check_data *)data; if(ds->type != NEBTYPE_HOSTCHECK_PROCESSED) return 0; cr = ds->check_result_ptr; h = ds->object_ptr; color = red | green; } else if(cb == NEBCALLBACK_SERVICE_CHECK_DATA) { nebstruct_service_check_data *ds = (nebstruct_service_check_data *)data; service *s; if(ds->type != NEBTYPE_SERVICECHECK_PROCESSED) return 0; s = (service *)ds->object_ptr; h = s->host_ptr; cr = ds->check_result_ptr; color = (red | green | blue) ^ pale; name = s->description; } else return 0; asprintf(&buf, "%lu|%s|M|%s/%s|%06X\n", cr->finish_time.tv_sec, check_result_source(cr), host_parent_path(h, '/'), name, color); nerd_broadcast(chan_opath_checks_id, buf, strlen(buf)); free(buf); return 0; } static int nerd_deinit(void) { unsigned int i; if(host_parent_path_cache) { for(i = 0; i < num_objects.hosts; i++) { my_free(host_parent_path_cache[i]); } my_free(host_parent_path_cache); } for(i = 0; i < num_channels; i++) { struct nerd_channel *chan = channels[i]; objectlist *list, *next; for(list = chan->subscriptions; list; list = next) { struct nerd_subscription *subscr = (struct nerd_subscription *)list->object_ptr; iobroker_close(nagios_iobs, subscr->sd); next = list->next; free(list); free(subscr); } chan->subscriptions = NULL; my_free(chan); } my_free(channels); num_channels = 0; alloc_channels = 0; return 0; } int nerd_mkchan(const char *name, const char *description, int (*handler)(int, void *), unsigned int callbacks) { struct nerd_channel *chan, **ptr; int i; if(num_channels + 1 >= alloc_channels) { alloc_channels = alloc_nr(alloc_channels); ptr = realloc(channels, alloc_channels * sizeof(struct nerd_channel *)); if(!ptr) return -1; channels = ptr; } if(!(chan = calloc(1, sizeof(*chan)))) return -1; chan->name = name; chan->description = description; chan->handler = handler; for(i = 0; callbacks && i < NEBCALLBACK_NUMITEMS; i++) { if(!(callbacks & (1 << i))) continue; chan->callbacks[chan->num_callbacks++] = i; } channels[num_channels++] = chan; logit(NSLOG_INFO_MESSAGE, TRUE, "nerd: Channel %s registered successfully\n", chan->name); return num_channels - 1; } #define NERD_SUBSCRIBE 0 #define NERD_UNSUBSCRIBE 1 static int nerd_qh_handler(int sd, char *request, unsigned int len) { char *chan_name, *fmt; struct nerd_channel *chan; int action; if (!*request || !strcmp(request, "help")) { nsock_printf_nul(sd, "Manage subscriptions to NERD channels.\n" "Valid commands:\n" " list list available channels\n" " subscribe subscribe to a channel\n" " unsubscribe unsubscribe to a channel\n"); return 0; } if (!strcmp(request, "list")) { unsigned int i; for (i = 0; i < num_channels; i++) { chan = channels[i]; nsock_printf(sd, "%-15s %s\n", chan->name, chan->description); } nsock_printf(sd, "%c", 0); return 0; } chan_name = strchr(request, ' '); if(!chan_name) return 400; *chan_name = 0; chan_name++; if(!strcmp(request, "subscribe")) action = NERD_SUBSCRIBE; else if(!strcmp(request, "unsubscribe")) action = NERD_UNSUBSCRIBE; else { return 400; } /* might have a format-string */ if((fmt = strchr(chan_name, ':'))) *(fmt++) = 0; chan = find_channel(chan_name); if(!chan) { return 400; } if(action == NERD_SUBSCRIBE) subscribe(sd, chan, fmt); else unsubscribe(sd, chan); return 0; } /* nebmod_init(), but loaded even if no modules are */ int nerd_init(void) { nerd_mod.deinit_func = nerd_deinit; nerd_mod.filename = (char *)"NERD"; /* something to log */ if(qh_register_handler("nerd", "Nagios Event Radio Dispatcher - Subscriber Service", 0, nerd_qh_handler) < 0) { logit(NSLOG_RUNTIME_ERROR, TRUE, "nerd: Failed to register with query handler\n"); return ERROR; } neb_add_core_module(&nerd_mod); chan_host_checks_id = nerd_mkchan("hostchecks", "Host check results", chan_host_checks, nebcallback_flag(NEBCALLBACK_HOST_CHECK_DATA)); chan_service_checks_id = nerd_mkchan("servicechecks", "Service check results", chan_service_checks, nebcallback_flag(NEBCALLBACK_SERVICE_CHECK_DATA)); chan_opath_checks_id = nerd_mkchan("opathchecks", "Host and service checks in gource's log format", chan_opath_checks, nebcallback_flag(NEBCALLBACK_HOST_CHECK_DATA) | nebcallback_flag(NEBCALLBACK_SERVICE_CHECK_DATA)); logit(NSLOG_INFO_MESSAGE, TRUE, "nerd: Fully initialized and ready to rock!\n"); return 0; } nagios-4.3.4/base/netutils.c000066400000000000000000000140451314764422400157420ustar00rootroot00000000000000/***************************************************************************** * * NETUTILS.C - Network connection utility functions for Nagios * * Portions Copyright (c) 1999-2008 Nagios Plugin development team * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #include "../include/config.h" #include "../include/common.h" #include "../include/netutils.h" /* connect to a TCP socket in nonblocking fashion */ int my_tcp_connect(const char *host_name, int port, int *sd, int timeout) { struct addrinfo hints; struct addrinfo *res; int result; char port_str[6]; int flags = 0; fd_set rfds; fd_set wfds; struct timeval tv; int optval; socklen_t optlen; memset(&hints, 0, sizeof(hints)); hints.ai_family = PF_INET; hints.ai_socktype = SOCK_STREAM; /* make sure our static port_str is long enough */ if(port > 65535) return ERROR; snprintf(port_str, sizeof(port_str), "%d", port); result = getaddrinfo(host_name, port_str, &hints, &res); if(result != 0) { /*printf("GETADDRINFO: %s (%s) = %s\n",host_name,port_str,gai_strerror(result));*/ return ERROR; } /* create a socket */ *sd = socket(res->ai_family, SOCK_STREAM, res->ai_protocol); if(*sd < 0) { freeaddrinfo(res); return ERROR; } /* make socket non-blocking */ flags = fcntl(*sd, F_GETFL, 0); fcntl(*sd, F_SETFL, flags | O_NONBLOCK); /* attempt to connect */ result = connect(*sd, res->ai_addr, res->ai_addrlen); /* immediately successful connect */ if(result == 0) { result = OK; /*printf("IMMEDIATE SUCCESS\n");*/ } /* connection error */ else if(result < 0 && errno != EINPROGRESS) { result = ERROR; } /* connection in progress - wait for it... */ else { do { /* set connection timeout */ tv.tv_sec = timeout; tv.tv_usec = 0; FD_ZERO(&wfds); FD_SET(*sd, &wfds); rfds = wfds; /* wait for readiness */ result = select((*sd) + 1, &rfds, &wfds, NULL, &tv); /*printf("SELECT RESULT: %d\n",result);*/ /* timeout */ if(result == 0) { /*printf("TIMEOUT\n");*/ result = ERROR; break; } /* an error occurred */ if(result < 0 && errno != EINTR) { result = ERROR; break; } /* got something - check it */ else if(result > 0) { /* get socket options to check for errors */ optlen = sizeof(int); if(getsockopt(*sd, SOL_SOCKET, SO_ERROR, (void *)(&optval), &optlen) < 0) { result = ERROR; break; } /* an error occurred in the connection */ if(optval != 0) { result = ERROR; break; } /* the connection was good! */ /* printf("CONNECT SELECT: ERRNO=%s\n",strerror(errno)); printf("CONNECT SELECT: OPTVAL=%s\n",strerror(optval)); */ result = OK; break; } /* some other error occurred */ else { result = ERROR; break; } } while(1); } freeaddrinfo(res); return result; } /* based on Beej's sendall - thanks Beej! */ int my_sendall(int s, const char *buf, int *len, int timeout) { int total_sent = 0; int bytes_left = 0; int n; fd_set wfds; struct timeval tv; int result = OK; time_t start_time; time_t current_time; time(&start_time); bytes_left = *len; while(total_sent < *len) { /* set send timeout */ tv.tv_sec = timeout; tv.tv_usec = 0; FD_ZERO(&wfds); FD_SET(s, &wfds); /* wait for readiness */ result = select(s + 1, NULL, &wfds, NULL, &tv); /* timeout */ if(result == 0) { /*printf("RECV SELECT TIMEOUT\n");*/ result = ERROR; break; } /* error */ else if(result < 0) { /*printf("RECV SELECT ERROR: %s\n",strerror(errno));*/ result = ERROR; break; } /* we're ready to write some data */ result = OK; /* send the data */ n = send(s, buf + total_sent, bytes_left, 0); if(n == -1) { /*printf("SEND ERROR: (%d) %s\n",s,strerror(errno));*/ break; } total_sent += n; bytes_left -= n; /* make sure we haven't overrun the timeout */ time(¤t_time); if(current_time - start_time > timeout) { result = ERROR; break; } } *len = total_sent; return result; } /* receives all data in non-blocking mode with a timeout - modelled after sendall() */ int my_recvall(int s, char *buf, int *len, int timeout) { int total_received = 0; int bytes_left = *len; int n = 0; time_t start_time; time_t current_time; fd_set rfds; struct timeval tv; int result = OK; /* clear the receive buffer */ bzero(buf, *len); time(&start_time); /* receive all data */ while(total_received < *len) { /* set receive timeout */ tv.tv_sec = timeout; tv.tv_usec = 0; FD_ZERO(&rfds); FD_SET(s, &rfds); /* wait for readiness */ result = select(s + 1, &rfds, NULL, NULL, &tv); /* timeout */ if(result == 0) { /*printf("RECV SELECT TIMEOUT\n");*/ result = ERROR; break; } /* error */ else if(result < 0) { /*printf("RECV SELECT ERROR: %s\n",strerror(errno));*/ result = ERROR; break; } /* we're ready to read some data */ result = OK; /* receive some data */ n = recv(s, buf + total_received, bytes_left, 0); /* server disconnected */ if(n == 0) { /*printf("SERVER DISCONNECT\n");*/ break; } /* apply bytes we received */ total_received += n; bytes_left -= n; /* make sure we haven't overrun the timeout */ time(¤t_time); if(current_time - start_time > timeout) { result = ERROR; break; } } /* return number of bytes actually received here */ *len = total_received; return result; } nagios-4.3.4/base/notifications.c000066400000000000000000002453241314764422400167520ustar00rootroot00000000000000/***************************************************************************** * * NOTIFICATIONS.C - Service and host notification functions for Nagios * * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #include "../include/config.h" #include "../include/common.h" #include "../include/objects.h" #include "../include/statusdata.h" #include "../include/macros.h" #include "../include/nagios.h" #include "../include/broker.h" #include "../include/neberrors.h" #include "../include/workers.h" #include "../include/downtime.h" /*** silly helpers ****/ static contact *find_contact_by_name_or_alias(const char *name) { contact *c = NULL; if (!name || !(c = find_contact(name))) return c; for (c = contact_list; c; c = c->next) if (!strcmp(c->alias, name)) break; return c; } const char *notification_reason_name(unsigned int reason_type) { static const char *names[] = { "NORMAL", "ACKNOWLEDGEMENT", "FLAPPINGSTART", "FLAPPINGSTOP", "FLAPPINGDISABLED", "DOWNTIMESTART", "DOWNTIMEEND", "DOWNTIMECANCELLED", "CUSTOM" }; if (reason_type < sizeof(names)) return names[reason_type]; return "(unknown)"; } /******************************************************************/ /***************** SERVICE NOTIFICATION FUNCTIONS *****************/ /******************************************************************/ /* notify contacts about a service problem or recovery */ int service_notification(service *svc, int type, char *not_author, char *not_data, int options) { host *temp_host = NULL; notification *temp_notification = NULL; contact *temp_contact = NULL; time_t current_time; struct timeval start_time; struct timeval end_time; int escalated = FALSE; int result = OK; int contacts_notified = 0; int increment_notification_number = FALSE; nagios_macros mac; int neb_result; log_debug_info(DEBUGL_FUNCTIONS, 0, "service_notification()\n"); /* get the current time */ time(¤t_time); gettimeofday(&start_time, NULL); log_debug_info(DEBUGL_NOTIFICATIONS, 0, "** Service Notification Attempt ** Host: '%s', Service: '%s', Type: %s, Options: %d, Current State: %d, Last Notification: %s", svc->host_name, svc->description, notification_reason_name(type), options, svc->current_state, ctime(&svc->last_notification)); /* if we couldn't find the host, return an error */ if((temp_host = svc->host_ptr) == NULL) { log_debug_info(DEBUGL_NOTIFICATIONS, 0, "Couldn't find the host associated with this service, so we won't send a notification!\n"); return ERROR; } /* check the viability of sending out a service notification */ if(check_service_notification_viability(svc, type, options) == ERROR) { log_debug_info(DEBUGL_NOTIFICATIONS, 0, "Notification viability test failed. No notification will be sent out.\n"); /* Set next_notification time if we're in a downtime and notification_interval = zero, otherwise if the service doesn't recover after downtime ends, it will never send the notification */ if (svc->notification_interval == 0.0) { if (temp_host->scheduled_downtime_depth > 0 || svc->scheduled_downtime_depth > 0) svc->next_notification = current_time; } return OK; } log_debug_info(DEBUGL_NOTIFICATIONS, 0, "Notification viability test passed.\n"); /* should the notification number be increased? */ if(type == NOTIFICATION_NORMAL || (options & NOTIFICATION_OPTION_INCREMENT)) { svc->current_notification_number++; increment_notification_number = TRUE; } log_debug_info(DEBUGL_NOTIFICATIONS, 1, "Current notification number: %d (%s)\n", svc->current_notification_number, (increment_notification_number == TRUE) ? "incremented" : "unchanged"); /* save and increase the current notification id */ svc->current_notification_id = next_notification_id; next_notification_id++; log_debug_info(DEBUGL_NOTIFICATIONS, 2, "Creating list of contacts to be notified.\n"); #ifdef USE_EVENT_BROKER /* send data to event broker */ end_time.tv_sec = 0L; end_time.tv_usec = 0L; neb_result = broker_notification_data(NEBTYPE_NOTIFICATION_START, NEBFLAG_NONE, NEBATTR_NONE, SERVICE_NOTIFICATION, type, start_time, end_time, (void *)svc, not_author, not_data, escalated, 0, NULL); if(neb_result == NEBERROR_CALLBACKCANCEL || neb_result == NEBERROR_CALLBACKOVERRIDE) { log_debug_info(DEBUGL_CHECKS, 0, "Service notification to %s;%s (id=%u) was blocked by a module\n", svc->host_name, svc->description, svc->id); free_notification_list(); return neb_result == NEBERROR_CALLBACKOVERRIDE ? OK : ERROR; } #endif /* allocate memory for macros */ memset(&mac, 0, sizeof(mac)); /* create the contact notification list for this service */ /* * check viability before adding a contact to the notification * list and build up the $NOTIFICATIONRECIPIENTS$ macro while * we're at it. * This prevents us from running through all the steps again in * notify_contact_of_host|service. * Furthermore the $NOTIFICATIONRECIPIENTS$ macro will contain * only actual recipients (as the name implies), and not all * contacts assigned to that host|service. * * note: checks against timeperiod will happen now(), * and not when the notification is actually being sent. */ create_notification_list_from_service(&mac, svc, options, &escalated, type); /* we have contacts to notify... */ if(notification_list != NULL) { /* grab the macro variables */ grab_host_macros_r(&mac, temp_host); grab_service_macros_r(&mac, svc); /* if this notification has an author, attempt to lookup the associated contact */ if(not_author != NULL) { temp_contact = find_contact_by_name_or_alias(not_author); } /* get author and comment macros */ if(not_author) mac.x[MACRO_NOTIFICATIONAUTHOR] = strdup(not_author); if(temp_contact != NULL) { mac.x[MACRO_NOTIFICATIONAUTHORNAME] = strdup(temp_contact->name); mac.x[MACRO_NOTIFICATIONAUTHORALIAS] = strdup(temp_contact->alias); } if(not_data) mac.x[MACRO_NOTIFICATIONCOMMENT] = strdup(not_data); /* NOTE: these macros are deprecated and will likely disappear in Nagios 4.x */ /* if this is an acknowledgement, get author and comment macros */ if(type == NOTIFICATION_ACKNOWLEDGEMENT) { if(not_author) mac.x[MACRO_SERVICEACKAUTHOR] = strdup(not_author); if(not_data) mac.x[MACRO_SERVICEACKCOMMENT] = strdup(not_data); if(temp_contact != NULL) { mac.x[MACRO_SERVICEACKAUTHORNAME] = strdup(temp_contact->name); mac.x[MACRO_SERVICEACKAUTHORALIAS] = strdup(temp_contact->alias); } } /* set the notification type macro */ if(type == NOTIFICATION_ACKNOWLEDGEMENT) mac.x[MACRO_NOTIFICATIONTYPE] = "ACKNOWLEDGEMENT"; else if(type == NOTIFICATION_FLAPPINGSTART) mac.x[MACRO_NOTIFICATIONTYPE] = "FLAPPINGSTART"; else if(type == NOTIFICATION_FLAPPINGSTOP) mac.x[MACRO_NOTIFICATIONTYPE] = "FLAPPINGSTOP"; else if(type == NOTIFICATION_FLAPPINGDISABLED) mac.x[MACRO_NOTIFICATIONTYPE] = "FLAPPINGDISABLED"; else if(type == NOTIFICATION_DOWNTIMESTART) mac.x[MACRO_NOTIFICATIONTYPE] = "DOWNTIMESTART"; else if(type == NOTIFICATION_DOWNTIMEEND) mac.x[MACRO_NOTIFICATIONTYPE] = "DOWNTIMEEND"; else if(type == NOTIFICATION_DOWNTIMECANCELLED) mac.x[MACRO_NOTIFICATIONTYPE] = "DOWNTIMECANCELLED"; else if(type == NOTIFICATION_CUSTOM) mac.x[MACRO_NOTIFICATIONTYPE] = "CUSTOM"; else if(svc->current_state == STATE_OK) mac.x[MACRO_NOTIFICATIONTYPE] = "RECOVERY"; else mac.x[MACRO_NOTIFICATIONTYPE] = "PROBLEM"; mac.x[MACRO_NOTIFICATIONTYPE] = strdup(mac.x[MACRO_NOTIFICATIONTYPE]); /* set the notification number macro */ asprintf(&mac.x[MACRO_SERVICENOTIFICATIONNUMBER], "%d", svc->current_notification_number); /* the $NOTIFICATIONNUMBER$ macro is maintained for backward compatability */ mac.x[MACRO_NOTIFICATIONNUMBER] = strdup(mac.x[MACRO_SERVICENOTIFICATIONNUMBER]); /* set the notification id macro */ asprintf(&mac.x[MACRO_SERVICENOTIFICATIONID], "%lu", svc->current_notification_id); /* notify each contact (duplicates have been removed) */ for(temp_notification = notification_list; temp_notification != NULL; temp_notification = temp_notification->next) { /* grab the macro variables for this contact */ grab_contact_macros_r(&mac, temp_notification->contact); /* notify this contact */ result = notify_contact_of_service(&mac, temp_notification->contact, svc, type, not_author, not_data, options, escalated); /* keep track of how many contacts were notified */ if(result == OK) contacts_notified++; } /* free memory allocated to the notification list */ free_notification_list(); /* clear out all macros we created */ my_free(mac.x[MACRO_NOTIFICATIONNUMBER]); my_free(mac.x[MACRO_SERVICENOTIFICATIONNUMBER]); my_free(mac.x[MACRO_SERVICENOTIFICATIONID]); my_free(mac.x[MACRO_NOTIFICATIONCOMMENT]); my_free(mac.x[MACRO_NOTIFICATIONTYPE]); my_free(mac.x[MACRO_NOTIFICATIONAUTHOR]); my_free(mac.x[MACRO_NOTIFICATIONAUTHORNAME]); my_free(mac.x[MACRO_NOTIFICATIONAUTHORALIAS]); my_free(mac.x[MACRO_SERVICEACKAUTHORNAME]); my_free(mac.x[MACRO_SERVICEACKAUTHORALIAS]); my_free(mac.x[MACRO_SERVICEACKAUTHOR]); my_free(mac.x[MACRO_SERVICEACKCOMMENT]); /* this gets set in add_notification() */ my_free(mac.x[MACRO_NOTIFICATIONRECIPIENTS]); /* * Clear all macros, or they will linger in memory * now that we're done with the notifications. */ clear_summary_macros_r(&mac); clear_contact_macros_r(&mac); clear_contactgroup_macros_r(&mac); clear_argv_macros_r(&mac); clear_host_macros_r(&mac); clear_hostgroup_macros_r(&mac); clear_service_macros_r(&mac); clear_servicegroup_macros_r(&mac); clear_datetime_macros_r(&mac); if(type == NOTIFICATION_NORMAL) { /* adjust last/next notification time and notification flags if we notified someone */ if(contacts_notified > 0) { /* calculate the next acceptable re-notification time */ svc->next_notification = get_next_service_notification_time(svc, current_time); log_debug_info(DEBUGL_NOTIFICATIONS, 0, "%d contacts were notified. Next possible notification time: %s", contacts_notified, ctime(&svc->next_notification)); /* update the last notification time for this service (this is needed for rescheduling later notifications) */ svc->last_notification = current_time; /* update notifications flags */ add_notified_on(svc, svc->current_state); } /* we didn't end up notifying anyone */ else if(increment_notification_number == TRUE) { /* adjust current notification number */ svc->current_notification_number--; log_debug_info(DEBUGL_NOTIFICATIONS, 0, "No contacts were notified. Next possible notification time: %s", ctime(&svc->next_notification)); } } log_debug_info(DEBUGL_NOTIFICATIONS, 0, "%d contacts were notified.\n", contacts_notified); } /* there were no contacts, so no notification really occurred... */ else { /* readjust current notification number, since one didn't go out */ if(increment_notification_number == TRUE) svc->current_notification_number--; log_debug_info(DEBUGL_NOTIFICATIONS, 0, "No contacts were found for notification purposes. No notification was sent out.\n"); } /* this gets set in create_notification_list_from_service() */ my_free(mac.x[MACRO_NOTIFICATIONISESCALATED]); /* get the time we finished */ gettimeofday(&end_time, NULL); #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_notification_data(NEBTYPE_NOTIFICATION_END, NEBFLAG_NONE, NEBATTR_NONE, SERVICE_NOTIFICATION, type, start_time, end_time, (void *)svc, not_author, not_data, escalated, contacts_notified, NULL); #endif /* update the status log with the service information */ update_service_status(svc, FALSE); return OK; } /* checks the viability of sending out a service alert (top level filters) */ int check_service_notification_viability(service *svc, int type, int options) { host *temp_host; timeperiod *temp_period; time_t current_time; time_t timeperiod_start; time_t first_problem_time; log_debug_info(DEBUGL_FUNCTIONS, 0, "check_service_notification_viability()\n"); /* forced notifications bust through everything */ if(options & NOTIFICATION_OPTION_FORCED) { log_debug_info(DEBUGL_NOTIFICATIONS, 1, "This is a forced service notification, so we'll send it out.\n"); return OK; } /* get current time */ time(¤t_time); /* are notifications enabled? */ if(enable_notifications == FALSE) { log_debug_info(DEBUGL_NOTIFICATIONS, 1, "Notifications are disabled, so service notifications will not be sent out.\n"); return ERROR; } /* find the host this service is associated with */ if((temp_host = (host *)svc->host_ptr) == NULL) return ERROR; /* if we couldn't find the host, return an error */ if(temp_host == NULL) { log_debug_info(DEBUGL_NOTIFICATIONS, 1, "Couldn't find the host associated with this service, so we won't send a notification.\n"); return ERROR; } /* if all parents are bad (usually just one), we shouldn't notify */ if(svc->parents) { int bad_parents = 0, total_parents = 0; servicesmember *sm; for(sm = svc->parents; sm; sm = sm->next) { /* @todo: tweak this so it handles hard states and whatnot */ if(sm->service_ptr->current_state == STATE_OK) bad_parents += !!sm->service_ptr->current_state; total_parents++; } if(bad_parents == total_parents) { log_debug_info(DEBUGL_NOTIFICATIONS, 1, "This service has no good parents, so notification will be blocked.\n"); return ERROR; } } /* if the service has no notification period, inherit one from the host */ temp_period = svc->notification_period_ptr; if(temp_period == NULL) { temp_period = svc->host_ptr->notification_period_ptr; } /* see if the service can have notifications sent out at this time */ if(check_time_against_period(current_time, temp_period) == ERROR) { log_debug_info(DEBUGL_NOTIFICATIONS, 1, "This service shouldn't have notifications sent out at this time.\n"); /* calculate the next acceptable notification time, once the next valid time range arrives... */ if(type == NOTIFICATION_NORMAL) { get_next_valid_time(current_time, &timeperiod_start, svc->notification_period_ptr); /* looks like there are no valid notification times defined, so schedule the next one far into the future (one year)... */ if(timeperiod_start == (time_t)0) svc->next_notification = (time_t)(current_time + (60 * 60 * 24 * 365)); /* else use the next valid notification time */ else svc->next_notification = timeperiod_start; log_debug_info(DEBUGL_NOTIFICATIONS, 1, "Next possible notification time: %s\n", ctime(&svc->next_notification)); } return ERROR; } /* are notifications temporarily disabled for this service? */ if(svc->notifications_enabled == FALSE) { log_debug_info(DEBUGL_NOTIFICATIONS, 1, "Notifications are temporarily disabled for this service, so we won't send one out.\n"); return ERROR; } /*********************************************/ /*** SPECIAL CASE FOR CUSTOM NOTIFICATIONS ***/ /*********************************************/ /* custom notifications are good to go at this point... */ if(type == NOTIFICATION_CUSTOM) { if(svc->scheduled_downtime_depth > 0 || temp_host->scheduled_downtime_depth > 0) { log_debug_info(DEBUGL_NOTIFICATIONS, 1, "We shouldn't send custom notification during scheduled downtime.\n"); return ERROR; } return OK; } /*****************************************/ /*** SPECIAL CASE FOR ACKNOWLEDGEMENTS ***/ /*****************************************/ /* acknowledgements only have to pass three general filters, although they have another test of their own... */ if(type == NOTIFICATION_ACKNOWLEDGEMENT) { /* don't send an acknowledgement if there isn't a problem... */ if(svc->current_state == STATE_OK) { log_debug_info(DEBUGL_NOTIFICATIONS, 1, "The service is currently OK, so we won't send an acknowledgement.\n"); return ERROR; } /* acknowledgement viability test passed, so the notification can be sent out */ return OK; } /****************************************/ /*** SPECIAL CASE FOR FLAPPING ALERTS ***/ /****************************************/ /* flapping notifications only have to pass three general filters */ if(type == NOTIFICATION_FLAPPINGSTART || type == NOTIFICATION_FLAPPINGSTOP || type == NOTIFICATION_FLAPPINGDISABLED) { /* don't send a notification if we're not supposed to... */ if(flag_isset(svc->notification_options, OPT_FLAPPING) == FALSE) { log_debug_info(DEBUGL_NOTIFICATIONS, 1, "We shouldn't notify about FLAPPING events for this service.\n"); return ERROR; } /* don't send notifications during scheduled downtime */ if(svc->scheduled_downtime_depth > 0 || temp_host->scheduled_downtime_depth > 0) { log_debug_info(DEBUGL_NOTIFICATIONS, 1, "We shouldn't notify about FLAPPING events during scheduled downtime.\n"); return ERROR; } /* flapping viability test passed, so the notification can be sent out */ return OK; } /****************************************/ /*** SPECIAL CASE FOR DOWNTIME ALERTS ***/ /****************************************/ /* downtime notifications only have to pass three general filters */ if(type == NOTIFICATION_DOWNTIMESTART || type == NOTIFICATION_DOWNTIMEEND || type == NOTIFICATION_DOWNTIMECANCELLED) { /* don't send a notification if we're not supposed to... */ if(flag_isset(svc->notification_options, OPT_DOWNTIME) == FALSE) { log_debug_info(DEBUGL_NOTIFICATIONS, 1, "We shouldn't notify about DOWNTIME events for this service.\n"); return ERROR; } /* don't send notifications during scheduled downtime (for service only, not host) */ if(svc->scheduled_downtime_depth > 0) { log_debug_info(DEBUGL_NOTIFICATIONS, 1, "We shouldn't notify about DOWNTIME events during scheduled downtime.\n"); return ERROR; } /* downtime viability test passed, so the notification can be sent out */ return OK; } /****************************************/ /*** NORMAL NOTIFICATIONS ***************/ /****************************************/ /* is this a hard problem/recovery? */ if(svc->state_type == SOFT_STATE) { log_debug_info(DEBUGL_NOTIFICATIONS, 1, "This service is in a soft state, so we won't send a notification out.\n"); return ERROR; } /* has this problem already been acknowledged? */ if(svc->problem_has_been_acknowledged == TRUE) { log_debug_info(DEBUGL_NOTIFICATIONS, 1, "This service problem has already been acknowledged, so we won't send a notification out.\n"); return ERROR; } /* check service notification dependencies */ if(check_service_dependencies(svc, NOTIFICATION_DEPENDENCY) == DEPENDENCIES_FAILED) { log_debug_info(DEBUGL_NOTIFICATIONS, 1, "Service notification dependencies for this service have failed, so we won't sent a notification out.\n"); return ERROR; } /* check host notification dependencies */ if(check_host_dependencies(temp_host, NOTIFICATION_DEPENDENCY) == DEPENDENCIES_FAILED) { log_debug_info(DEBUGL_NOTIFICATIONS, 1, "Host notification dependencies for this service have failed, so we won't sent a notification out.\n"); return ERROR; } /* see if we should notify about problems with this service */ if(should_notify(svc) == FALSE) { log_debug_info(DEBUGL_NOTIFICATIONS, 1, "We shouldn't notify about %s states for this service.\n", service_state_name(svc->current_state)); return ERROR; } if(svc->current_state == STATE_OK && svc->notified_on == 0) { log_debug_info(DEBUGL_NOTIFICATIONS, 1, "We shouldn't notify about this recovery.\n"); return ERROR; } /* see if enough time has elapsed for first notification (Mathias Sundman) */ /* 10/02/07 don't place restrictions on recoveries or non-normal notifications, must use last time ok (or program start) in calculation */ /* it is reasonable to assume that if the service was never up, the program start time should be used in this calculation */ if(type == NOTIFICATION_NORMAL && svc->current_notification_number == 0 && svc->current_state != STATE_OK) { first_problem_time = svc->last_time_ok > 0 ? svc->last_time_ok : program_start; if(current_time < first_problem_time + (time_t)(svc->first_notification_delay * interval_length)) { log_debug_info(DEBUGL_NOTIFICATIONS, 1, "Not enough time has elapsed since the service changed to a non-OK state, so we should not notify about this problem yet\n"); return ERROR; } } /* if this service is currently flapping, don't send the notification */ if(svc->is_flapping == TRUE) { log_debug_info(DEBUGL_NOTIFICATIONS, 1, "This service is currently flapping, so we won't send notifications.\n"); return ERROR; } /***** RECOVERY NOTIFICATIONS ARE GOOD TO GO AT THIS POINT *****/ if(svc->current_state == STATE_OK) return OK; /* don't notify contacts about this service problem again if the notification interval is set to 0 */ if(svc->no_more_notifications == TRUE) { log_debug_info(DEBUGL_NOTIFICATIONS, 1, "We shouldn't re-notify contacts about this service problem.\n"); return ERROR; } /* if the host is down or unreachable, don't notify contacts about service failures */ if(temp_host->current_state != STATE_UP && temp_host->state_type == HARD_STATE) { log_debug_info(DEBUGL_NOTIFICATIONS, 1, "The host is either down or unreachable, so we won't notify contacts about this service.\n"); return ERROR; } /* don't notify if we haven't waited long enough since the last time (and the service is not marked as being volatile) */ if((current_time < svc->next_notification) && svc->is_volatile == FALSE) { log_debug_info(DEBUGL_NOTIFICATIONS, 1, "We haven't waited long enough to re-notify contacts about this service.\n"); log_debug_info(DEBUGL_NOTIFICATIONS, 1, "Next valid notification time: %s", ctime(&svc->next_notification)); return ERROR; } /* if this service is currently in a scheduled downtime period, don't send the notification */ if(svc->scheduled_downtime_depth > 0) { log_debug_info(DEBUGL_NOTIFICATIONS, 1, "This service is currently in a scheduled downtime, so we won't send notifications.\n"); return ERROR; } /* if this host is currently in a scheduled downtime period, don't send the notification */ if(temp_host->scheduled_downtime_depth > 0) { log_debug_info(DEBUGL_NOTIFICATIONS, 1, "The host this service is associated with is currently in a scheduled downtime, so we won't send notifications.\n"); return ERROR; } /* if this service is currently in a flex downtime period, don't send the notification */ if(svc->pending_flex_downtime > 0 && is_service_in_pending_flex_downtime(svc) == TRUE) { log_debug_info(DEBUGL_NOTIFICATIONS, 1, "This service is starting a flex downtime, so we won't send notifications.\n"); return ERROR; } /* if this host is currently in a flex downtime period, don't send the notification */ if(temp_host->pending_flex_downtime > 0 && is_host_in_pending_flex_downtime(temp_host) == TRUE) { log_debug_info(DEBUGL_NOTIFICATIONS, 1, "The host this service is associated with is starting a flex downtime, so we won't send notifications.\n"); return ERROR; } return OK; } /* check viability of sending out a service notification to a specific contact (contact-specific filters) */ int check_contact_service_notification_viability(contact *cntct, service *svc, int type, int options) { log_debug_info(DEBUGL_FUNCTIONS, 0, "check_contact_service_notification_viability()\n"); log_debug_info(DEBUGL_NOTIFICATIONS, 2, "** Checking service notification viability for contact '%s'...\n", cntct->name); /* forced notifications bust through everything */ if(options & NOTIFICATION_OPTION_FORCED) { log_debug_info(DEBUGL_NOTIFICATIONS, 1, "This is a forced service notification, so we'll send it out to this contact.\n"); return OK; } /* is this service not important enough? */ if(cntct->minimum_value > svc->hourly_value) { log_debug_info(DEBUGL_NOTIFICATIONS, 2, "Contact's minimum_importance is higher than service's importance. Notification will be blocked\n"); return ERROR; } /* are notifications enabled? */ if(cntct->service_notifications_enabled == FALSE) { log_debug_info(DEBUGL_NOTIFICATIONS, 2, "Service notifications are disabled for this contact.\n"); return ERROR; } /* see if the contact can be notified at this time */ if(check_time_against_period(time(NULL), cntct->service_notification_period_ptr) == ERROR) { log_debug_info(DEBUGL_NOTIFICATIONS, 2, "This contact shouldn't be notified at this time.\n"); return ERROR; } /*********************************************/ /*** SPECIAL CASE FOR CUSTOM NOTIFICATIONS ***/ /*********************************************/ /* custom notifications are good to go at this point... */ if(type == NOTIFICATION_CUSTOM) return OK; /****************************************/ /*** SPECIAL CASE FOR FLAPPING ALERTS ***/ /****************************************/ if(type == NOTIFICATION_FLAPPINGSTART || type == NOTIFICATION_FLAPPINGSTOP || type == NOTIFICATION_FLAPPINGDISABLED) { if((cntct->service_notification_options & OPT_FLAPPING) == FALSE) { log_debug_info(DEBUGL_NOTIFICATIONS, 2, "We shouldn't notify this contact about FLAPPING service events.\n"); return ERROR; } return OK; } /****************************************/ /*** SPECIAL CASE FOR DOWNTIME ALERTS ***/ /****************************************/ if(type == NOTIFICATION_DOWNTIMESTART || type == NOTIFICATION_DOWNTIMEEND || type == NOTIFICATION_DOWNTIMECANCELLED) { if((cntct->service_notification_options & OPT_DOWNTIME) == FALSE) { log_debug_info(DEBUGL_NOTIFICATIONS, 2, "We shouldn't notify this contact about DOWNTIME service events.\n"); return ERROR; } return OK; } /*************************************/ /*** ACKS AND NORMAL NOTIFICATIONS ***/ /*************************************/ /* see if we should notify about problems with this service */ if(!(cntct->service_notification_options & (1 << svc->current_state))) { log_debug_info(DEBUGL_NOTIFICATIONS, 2, "We shouldn't notify this contact about %s service states.\n", service_state_name(svc->current_state)); return ERROR; } if(svc->current_state == STATE_OK) { if((cntct->service_notification_options & OPT_RECOVERY) == FALSE) { log_debug_info(DEBUGL_NOTIFICATIONS, 2, "We shouldn't notify this contact about RECOVERY service states.\n"); return ERROR; } if(!(svc->notified_on & cntct->service_notification_options)) { log_debug_info(DEBUGL_NOTIFICATIONS, 2, "We shouldn't notify about this recovery.\n"); return ERROR; } } log_debug_info(DEBUGL_NOTIFICATIONS, 2, "** Service notification viability for contact '%s' PASSED.\n", cntct->name); return OK; } /* notify a specific contact about a service problem or recovery */ int notify_contact_of_service(nagios_macros *mac, contact *cntct, service *svc, int type, char *not_author, char *not_data, int options, int escalated) { commandsmember *temp_commandsmember = NULL; char *command_name = NULL; char *command_name_ptr = NULL; char *raw_command = NULL; char *processed_command = NULL; char *temp_buffer = NULL; char *processed_buffer = NULL; struct timeval start_time, end_time; struct timeval method_start_time, method_end_time; int macro_options = STRIP_ILLEGAL_MACRO_CHARS | ESCAPE_MACRO_CHARS; int neb_result; log_debug_info(DEBUGL_FUNCTIONS, 0, "notify_contact_of_service()\n"); log_debug_info(DEBUGL_NOTIFICATIONS, 2, "** Notifying contact '%s'\n", cntct->name); /* get start time */ gettimeofday(&start_time, NULL); #ifdef USE_EVENT_BROKER /* send data to event broker */ end_time.tv_sec = 0L; end_time.tv_usec = 0L; neb_result = broker_contact_notification_data(NEBTYPE_CONTACTNOTIFICATION_START, NEBFLAG_NONE, NEBATTR_NONE, SERVICE_NOTIFICATION, type, start_time, end_time, (void *)svc, cntct, not_author, not_data, escalated, NULL); if(NEBERROR_CALLBACKCANCEL == neb_result) return ERROR; else if(NEBERROR_CALLBACKOVERRIDE == neb_result) return OK; #endif /* process all the notification commands this user has */ for(temp_commandsmember = cntct->service_notification_commands; temp_commandsmember != NULL; temp_commandsmember = temp_commandsmember->next) { /* get start time */ gettimeofday(&method_start_time, NULL); #ifdef USE_EVENT_BROKER /* send data to event broker */ method_end_time.tv_sec = 0L; method_end_time.tv_usec = 0L; neb_result = broker_contact_notification_method_data(NEBTYPE_CONTACTNOTIFICATIONMETHOD_START, NEBFLAG_NONE, NEBATTR_NONE, SERVICE_NOTIFICATION, type, method_start_time, method_end_time, (void *)svc, cntct, temp_commandsmember->command, not_author, not_data, escalated, NULL); if(NEBERROR_CALLBACKCANCEL == neb_result) break ; else if(NEBERROR_CALLBACKOVERRIDE == neb_result) continue ; #endif /* get the raw command line */ get_raw_command_line_r(mac, temp_commandsmember->command_ptr, temp_commandsmember->command, &raw_command, macro_options); if(raw_command == NULL) continue; log_debug_info(DEBUGL_NOTIFICATIONS, 2, "Raw notification command: %s\n", raw_command); /* process any macros contained in the argument */ process_macros_r(mac, raw_command, &processed_command, macro_options); my_free(raw_command); if(processed_command == NULL) continue; /* get the command name */ command_name = (char *)strdup(temp_commandsmember->command); command_name_ptr = strtok(command_name, "!"); /* run the notification command... */ log_debug_info(DEBUGL_NOTIFICATIONS, 2, "Processed notification command: %s\n", processed_command); /* log the notification to program log file */ if(log_notifications == TRUE) { switch(type) { case NOTIFICATION_CUSTOM: asprintf(&temp_buffer, "SERVICE NOTIFICATION: %s;%s;%s;CUSTOM ($SERVICESTATE$);%s;$SERVICEOUTPUT$;$NOTIFICATIONAUTHOR$;$NOTIFICATIONCOMMENT$\n", cntct->name, svc->host_name, svc->description, command_name_ptr); break; case NOTIFICATION_ACKNOWLEDGEMENT: asprintf(&temp_buffer, "SERVICE NOTIFICATION: %s;%s;%s;ACKNOWLEDGEMENT ($SERVICESTATE$);%s;$SERVICEOUTPUT$;$NOTIFICATIONAUTHOR$;$NOTIFICATIONCOMMENT$\n", cntct->name, svc->host_name, svc->description, command_name_ptr); break; case NOTIFICATION_FLAPPINGSTART: asprintf(&temp_buffer, "SERVICE NOTIFICATION: %s;%s;%s;FLAPPINGSTART ($SERVICESTATE$);%s;$SERVICEOUTPUT$\n", cntct->name, svc->host_name, svc->description, command_name_ptr); break; case NOTIFICATION_FLAPPINGSTOP: asprintf(&temp_buffer, "SERVICE NOTIFICATION: %s;%s;%s;FLAPPINGSTOP ($SERVICESTATE$);%s;$SERVICEOUTPUT$\n", cntct->name, svc->host_name, svc->description, command_name_ptr); break; case NOTIFICATION_FLAPPINGDISABLED: asprintf(&temp_buffer, "SERVICE NOTIFICATION: %s;%s;%s;FLAPPINGDISABLED ($SERVICESTATE$);%s;$SERVICEOUTPUT$\n", cntct->name, svc->host_name, svc->description, command_name_ptr); break; case NOTIFICATION_DOWNTIMESTART: asprintf(&temp_buffer, "SERVICE NOTIFICATION: %s;%s;%s;DOWNTIMESTART ($SERVICESTATE$);%s;$SERVICEOUTPUT$\n", cntct->name, svc->host_name, svc->description, command_name_ptr); break; case NOTIFICATION_DOWNTIMEEND: asprintf(&temp_buffer, "SERVICE NOTIFICATION: %s;%s;%s;DOWNTIMEEND ($SERVICESTATE$);%s;$SERVICEOUTPUT$\n", cntct->name, svc->host_name, svc->description, command_name_ptr); break; case NOTIFICATION_DOWNTIMECANCELLED: asprintf(&temp_buffer, "SERVICE NOTIFICATION: %s;%s;%s;DOWNTIMECANCELLED ($SERVICESTATE$);%s;$SERVICEOUTPUT$\n", cntct->name, svc->host_name, svc->description, command_name_ptr); break; default: asprintf(&temp_buffer, "SERVICE NOTIFICATION: %s;%s;%s;$SERVICESTATE$;%s;$SERVICEOUTPUT$\n", cntct->name, svc->host_name, svc->description, command_name_ptr); break; } process_macros_r(mac, temp_buffer, &processed_buffer, 0); write_to_all_logs(processed_buffer, NSLOG_SERVICE_NOTIFICATION); my_free(temp_buffer); my_free(processed_buffer); } /* run the notification command */ wproc_notify(cntct->name, svc->host_name, svc->description, processed_command, mac); /* free memory */ my_free(command_name); my_free(processed_command); /* get end time */ gettimeofday(&method_end_time, NULL); #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_contact_notification_method_data(NEBTYPE_CONTACTNOTIFICATIONMETHOD_END, NEBFLAG_NONE, NEBATTR_NONE, SERVICE_NOTIFICATION, type, method_start_time, method_end_time, (void *)svc, cntct, temp_commandsmember->command, not_author, not_data, escalated, NULL); #endif } /* get end time */ gettimeofday(&end_time, NULL); /* update the contact's last service notification time */ cntct->last_service_notification = start_time.tv_sec; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_contact_notification_data(NEBTYPE_CONTACTNOTIFICATION_END, NEBFLAG_NONE, NEBATTR_NONE, SERVICE_NOTIFICATION, type, start_time, end_time, (void *)svc, cntct, not_author, not_data, escalated, NULL); #endif return OK; } /* checks to see if a service escalation entry is a match for the current service notification */ int is_valid_escalation_for_service_notification(service *svc, serviceescalation *se, int options) { int notification_number = 0; time_t current_time = 0L; service *temp_service = NULL; log_debug_info(DEBUGL_FUNCTIONS, 0, "is_valid_escalation_for_service_notification()\n"); /* get the current time */ time(¤t_time); /* if this is a recovery, really we check for who got notified about a previous problem */ if(svc->current_state == STATE_OK) notification_number = svc->current_notification_number - 1; else notification_number = svc->current_notification_number; /* this entry if it is not for this service */ temp_service = se->service_ptr; if(temp_service == NULL || temp_service != svc) return FALSE; /*** EXCEPTION ***/ /* broadcast options go to everyone, so this escalation is valid */ if(options & NOTIFICATION_OPTION_BROADCAST) return TRUE; /* skip this escalation if it happens later */ if(se->first_notification > notification_number) return FALSE; /* skip this escalation if it has already passed */ if(se->last_notification != 0 && se->last_notification < notification_number) return FALSE; /* skip this escalation if the state options don't match */ if(flag_isset(se->escalation_options, 1 << svc->current_state) == FALSE) return FALSE; /* skip this escalation if it has a timeperiod and the current time isn't valid */ if(se->escalation_period != NULL && check_time_against_period(current_time, se->escalation_period_ptr) == ERROR) return FALSE; return TRUE; } /* checks to see whether a service notification should be escalation */ int should_service_notification_be_escalated(service *svc) { objectlist *list; log_debug_info(DEBUGL_FUNCTIONS, 0, "should_service_notification_be_escalated()\n"); /* search the service escalation list */ for (list = svc->escalation_list; list; list = list->next) { serviceescalation *temp_se = (serviceescalation *)list->object_ptr; /* we found a matching entry, so escalate this notification! */ if(is_valid_escalation_for_service_notification(svc, temp_se, NOTIFICATION_OPTION_NONE) == TRUE) { log_debug_info(DEBUGL_NOTIFICATIONS, 1, "Service notification WILL be escalated.\n"); return TRUE; } } log_debug_info(DEBUGL_NOTIFICATIONS, 1, "Service notification will NOT be escalated.\n"); return FALSE; } /* given a service, create a list of contacts to be notified, removing duplicates, checking contact notification viability */ int create_notification_list_from_service(nagios_macros *mac, service *svc, int options, int *escalated, int type) { serviceescalation *temp_se = NULL; contactsmember *temp_contactsmember = NULL; contact *temp_contact = NULL; contactgroupsmember *temp_contactgroupsmember = NULL; contactgroup *temp_contactgroup = NULL; int escalate_notification = FALSE; log_debug_info(DEBUGL_FUNCTIONS, 0, "create_notification_list_from_service()\n"); /* see if this notification should be escalated */ escalate_notification = should_service_notification_be_escalated(svc); /* set the escalation flag */ *escalated = escalate_notification; /* make sure there aren't any leftover contacts */ free_notification_list(); /* set the escalation macro */ mac->x[MACRO_NOTIFICATIONISESCALATED] = strdup(escalate_notification ? "1" : "0"); if(options & NOTIFICATION_OPTION_BROADCAST) log_debug_info(DEBUGL_NOTIFICATIONS, 1, "This notification will be BROADCAST to all (escalated and normal) contacts...\n"); /* use escalated contacts for this notification */ if(escalate_notification == TRUE || (options & NOTIFICATION_OPTION_BROADCAST)) { objectlist *list; log_debug_info(DEBUGL_NOTIFICATIONS, 1, "Adding contacts from service escalation(s) to notification list.\n"); /* search all the escalation entries for valid matches */ for(list = svc->escalation_list; list; list = list->next) { temp_se = (serviceescalation *)list->object_ptr; /* skip this entry if it isn't appropriate */ if(is_valid_escalation_for_service_notification(svc, temp_se, options) == FALSE) continue; log_debug_info(DEBUGL_NOTIFICATIONS, 2, "Adding individual contacts from service escalation(s) to notification list.\n"); /* add all individual contacts for this escalation entry */ for(temp_contactsmember = temp_se->contacts; temp_contactsmember != NULL; temp_contactsmember = temp_contactsmember->next) { if((temp_contact = temp_contactsmember->contact_ptr) == NULL) continue; /* check now if the contact can be notified */ if (check_contact_service_notification_viability(temp_contact, svc, type, options) == OK) add_notification(mac, temp_contact); else log_debug_info(DEBUGL_NOTIFICATIONS, 2, "Not adding contact '%s'\n",temp_contact->name); } log_debug_info(DEBUGL_NOTIFICATIONS, 2, "Adding members of contact groups from service escalation(s) to notification list.\n"); /* add all contacts that belong to contactgroups for this escalation */ for(temp_contactgroupsmember = temp_se->contact_groups; temp_contactgroupsmember != NULL; temp_contactgroupsmember = temp_contactgroupsmember->next) { log_debug_info(DEBUGL_NOTIFICATIONS, 2, "Adding members of contact group '%s' for service escalation to notification list.\n", temp_contactgroupsmember->group_name); if((temp_contactgroup = temp_contactgroupsmember->group_ptr) == NULL) continue; for(temp_contactsmember = temp_contactgroup->members; temp_contactsmember != NULL; temp_contactsmember = temp_contactsmember->next) { if((temp_contact = temp_contactsmember->contact_ptr) == NULL) continue; /* check now if the contact can be notified */ if (check_contact_service_notification_viability(temp_contact, svc, type, options) == OK) add_notification(mac, temp_contact); else log_debug_info(DEBUGL_NOTIFICATIONS, 2, "Not adding contact '%s'\n",temp_contact->name); } } } } /* else use normal, non-escalated contacts */ if(escalate_notification == FALSE || (options & NOTIFICATION_OPTION_BROADCAST)) { log_debug_info(DEBUGL_NOTIFICATIONS, 1, "Adding normal contacts for service to notification list.\n"); /* add all individual contacts for this service */ for(temp_contactsmember = svc->contacts; temp_contactsmember != NULL; temp_contactsmember = temp_contactsmember->next) { if((temp_contact = temp_contactsmember->contact_ptr) == NULL) continue; /* check now if the contact can be notified */ if (check_contact_service_notification_viability(temp_contact, svc, type, options) == OK) add_notification(mac, temp_contact); else log_debug_info(DEBUGL_NOTIFICATIONS, 2, "Not adding contact '%s'\n",temp_contact->name); } /* add all contacts that belong to contactgroups for this service */ for(temp_contactgroupsmember = svc->contact_groups; temp_contactgroupsmember != NULL; temp_contactgroupsmember = temp_contactgroupsmember->next) { log_debug_info(DEBUGL_NOTIFICATIONS, 2, "Adding members of contact group '%s' for service to notification list.\n", temp_contactgroupsmember->group_name); if((temp_contactgroup = temp_contactgroupsmember->group_ptr) == NULL) continue; for(temp_contactsmember = temp_contactgroup->members; temp_contactsmember != NULL; temp_contactsmember = temp_contactsmember->next) { if((temp_contact = temp_contactsmember->contact_ptr) == NULL) continue; /* check now if the contact can be notified */ if (check_contact_service_notification_viability(temp_contact, svc, type, options) == OK) add_notification(mac, temp_contact); else log_debug_info(DEBUGL_NOTIFICATIONS, 2, "Not adding contact '%s'\n",temp_contact->name); } } } return OK; } /******************************************************************/ /******************* HOST NOTIFICATION FUNCTIONS ******************/ /******************************************************************/ /* notify all contacts for a host that the entire host is down or up */ int host_notification(host *hst, int type, char *not_author, char *not_data, int options) { notification *temp_notification = NULL; contact *temp_contact = NULL; time_t current_time; struct timeval start_time; struct timeval end_time; int escalated = FALSE; int result = OK; int contacts_notified = 0; int increment_notification_number = FALSE; nagios_macros mac; int neb_result; /* get the current time */ time(¤t_time); gettimeofday(&start_time, NULL); log_debug_info(DEBUGL_NOTIFICATIONS, 0, "** Host Notification Attempt ** Host: '%s', Type: %s, Options: %d, Current State: %d, Last Notification: %s", hst->name, notification_reason_name(type), options, hst->current_state, ctime(&hst->last_notification)); /* check viability of sending out a host notification */ if(check_host_notification_viability(hst, type, options) == ERROR) { log_debug_info(DEBUGL_NOTIFICATIONS, 0, "Notification viability test failed. No notification will be sent out.\n"); return OK; } log_debug_info(DEBUGL_NOTIFICATIONS, 0, "Notification viability test passed.\n"); /* should the notification number be increased? */ if(type == NOTIFICATION_NORMAL || (options & NOTIFICATION_OPTION_INCREMENT)) { hst->current_notification_number++; increment_notification_number = TRUE; } log_debug_info(DEBUGL_NOTIFICATIONS, 1, "Current notification number: %d (%s)\n", hst->current_notification_number, (increment_notification_number == TRUE) ? "incremented" : "unchanged"); /* save and increase the current notification id */ hst->current_notification_id = next_notification_id; next_notification_id++; log_debug_info(DEBUGL_NOTIFICATIONS, 2, "Creating list of contacts to be notified.\n"); #ifdef USE_EVENT_BROKER /* send data to event broker */ end_time.tv_sec = 0L; end_time.tv_usec = 0L; neb_result = broker_notification_data(NEBTYPE_NOTIFICATION_START, NEBFLAG_NONE, NEBATTR_NONE, HOST_NOTIFICATION, type, start_time, end_time, (void *)hst, not_author, not_data, escalated, 0, NULL); if(neb_result == NEBERROR_CALLBACKCANCEL || neb_result == NEBERROR_CALLBACKOVERRIDE) { log_debug_info(DEBUGL_NOTIFICATIONS, 0, "Host notification to %s (id=%u) was blocked by a module.\n", hst->name, hst->id); free_notification_list(); return neb_result == NEBERROR_CALLBACKOVERRIDE ? OK : ERROR; } #endif /* reset memory for local macro data */ memset(&mac, 0, sizeof(mac)); /* * check viability before adding a contact to the notification * list and build up the $NOTIFICATIONRECIPIENTS$ macro while * we're at it. * This prevents us from running through all the steps again in * notify_contact_of_host|service. * Furthermore the $NOTIFICATIONRECIPIENTS$ macro will contain * only actual recipients (as the name implies), and not all * contacts assigned to that host|service. * * note: checks against timeperiod will happen now(), * and not when the notification is actually being sent. */ create_notification_list_from_host(&mac, hst, options, &escalated, type); /* there are contacts to be notified... */ if(notification_list != NULL) { /* grab the macro variables */ grab_host_macros_r(&mac, hst); /* if this notification has an author, attempt to lookup the associated contact */ if(not_author != NULL) { temp_contact = find_contact_by_name_or_alias(not_author); } /* get author and comment macros */ if(not_author) mac.x[MACRO_NOTIFICATIONAUTHOR] = strdup(not_author); if(temp_contact != NULL) { mac.x[MACRO_NOTIFICATIONAUTHORNAME] = strdup(temp_contact->name); mac.x[MACRO_NOTIFICATIONAUTHORALIAS] = strdup(temp_contact->alias); } if(not_data) mac.x[MACRO_NOTIFICATIONCOMMENT] = strdup(not_data); /* NOTE: these macros are deprecated and will likely disappear in Nagios 4.x */ /* if this is an acknowledgement, get author and comment macros */ if(type == NOTIFICATION_ACKNOWLEDGEMENT) { if(not_author) mac.x[MACRO_HOSTACKAUTHOR] = strdup(not_author); if(not_data) mac.x[MACRO_HOSTACKCOMMENT] = strdup(not_data); if(temp_contact != NULL) { mac.x[MACRO_HOSTACKAUTHORNAME] = strdup(temp_contact->name); mac.x[MACRO_HOSTACKAUTHORALIAS] = strdup(temp_contact->alias); } } /* set the notification type macro */ if(type == NOTIFICATION_ACKNOWLEDGEMENT) mac.x[MACRO_NOTIFICATIONTYPE] = "ACKNOWLEDGEMENT"; else if(type == NOTIFICATION_FLAPPINGSTART) mac.x[MACRO_NOTIFICATIONTYPE] = "FLAPPINGSTART"; else if(type == NOTIFICATION_FLAPPINGSTOP) mac.x[MACRO_NOTIFICATIONTYPE] = "FLAPPINGSTOP"; else if(type == NOTIFICATION_FLAPPINGDISABLED) mac.x[MACRO_NOTIFICATIONTYPE] = "FLAPPINGDISABLED"; else if(type == NOTIFICATION_DOWNTIMESTART) mac.x[MACRO_NOTIFICATIONTYPE] = "DOWNTIMESTART"; else if(type == NOTIFICATION_DOWNTIMEEND) mac.x[MACRO_NOTIFICATIONTYPE] = "DOWNTIMEEND"; else if(type == NOTIFICATION_DOWNTIMECANCELLED) mac.x[MACRO_NOTIFICATIONTYPE] = "DOWNTIMECANCELLED"; else if(type == NOTIFICATION_CUSTOM) mac.x[MACRO_NOTIFICATIONTYPE] = "CUSTOM"; else if(hst->current_state == HOST_UP) mac.x[MACRO_NOTIFICATIONTYPE] = "RECOVERY"; else mac.x[MACRO_NOTIFICATIONTYPE] = "PROBLEM"; mac.x[MACRO_NOTIFICATIONTYPE] = strdup(mac.x[MACRO_NOTIFICATIONTYPE]); /* set the notification number macro */ asprintf(&mac.x[MACRO_HOSTNOTIFICATIONNUMBER], "%d", hst->current_notification_number); /* the $NOTIFICATIONNUMBER$ macro is maintained for backward compatability */ mac.x[MACRO_NOTIFICATIONNUMBER] = strdup(mac.x[MACRO_HOSTNOTIFICATIONNUMBER]); /* set the notification id macro */ asprintf(&mac.x[MACRO_HOSTNOTIFICATIONID], "%lu", hst->current_notification_id); /* notify each contact (duplicates have been removed) */ for(temp_notification = notification_list; temp_notification != NULL; temp_notification = temp_notification->next) { /* grab the macro variables for this contact */ grab_contact_macros_r(&mac, temp_notification->contact); /* clear summary macros (they are customized for each contact) */ clear_summary_macros_r(&mac); /* notify this contact */ result = notify_contact_of_host(&mac, temp_notification->contact, hst, type, not_author, not_data, options, escalated); /* keep track of how many contacts were notified */ if(result == OK) contacts_notified++; } /* free memory allocated to the notification list */ free_notification_list(); /* clear out all macros we created */ my_free(mac.x[MACRO_HOSTNOTIFICATIONID]); my_free(mac.x[MACRO_NOTIFICATIONNUMBER]); my_free(mac.x[MACRO_NOTIFICATIONCOMMENT]); my_free(mac.x[MACRO_HOSTNOTIFICATIONNUMBER]); my_free(mac.x[MACRO_NOTIFICATIONTYPE]); my_free(mac.x[MACRO_NOTIFICATIONAUTHOR]); my_free(mac.x[MACRO_NOTIFICATIONAUTHORNAME]); my_free(mac.x[MACRO_NOTIFICATIONAUTHORALIAS]); my_free(mac.x[MACRO_HOSTACKAUTHORNAME]); my_free(mac.x[MACRO_HOSTACKAUTHORALIAS]); my_free(mac.x[MACRO_HOSTACKAUTHOR]); my_free(mac.x[MACRO_HOSTACKCOMMENT]); /* this gets set in add_notification() */ my_free(mac.x[MACRO_NOTIFICATIONRECIPIENTS]); /* * Clear all macros, or they will linger in memory * now that we're done with the notifications. */ clear_summary_macros_r(&mac); clear_contact_macros_r(&mac); clear_contactgroup_macros_r(&mac); clear_argv_macros_r(&mac); clear_host_macros_r(&mac); clear_hostgroup_macros_r(&mac); clear_datetime_macros_r(&mac); if(type == NOTIFICATION_NORMAL) { /* adjust last/next notification time and notification flags if we notified someone */ if(contacts_notified > 0) { /* calculate the next acceptable re-notification time */ hst->next_notification = get_next_host_notification_time(hst, current_time); /* update the last notification time for this host (this is needed for scheduling the next problem notification) */ hst->last_notification = current_time; /* update notifications flags */ add_notified_on(hst, hst->current_state); log_debug_info(DEBUGL_NOTIFICATIONS, 0, "%d contacts were notified. Next possible notification time: %s", contacts_notified, ctime(&hst->next_notification)); } /* we didn't end up notifying anyone */ else if(increment_notification_number == TRUE) { /* adjust current notification number */ hst->current_notification_number--; log_debug_info(DEBUGL_NOTIFICATIONS, 0, "No contacts were notified. Next possible notification time: %s", ctime(&hst->next_notification)); } } log_debug_info(DEBUGL_NOTIFICATIONS, 0, "%d contacts were notified.\n", contacts_notified); } /* there were no contacts, so no notification really occurred... */ else { /* adjust notification number, since no notification actually went out */ if(increment_notification_number == TRUE) hst->current_notification_number--; log_debug_info(DEBUGL_NOTIFICATIONS, 0, "No contacts were found for notification purposes. No notification was sent out.\n"); } /* this gets set in create_notification_list_from_host() */ my_free(mac.x[MACRO_NOTIFICATIONISESCALATED]); /* get the time we finished */ gettimeofday(&end_time, NULL); #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_notification_data(NEBTYPE_NOTIFICATION_END, NEBFLAG_NONE, NEBATTR_NONE, HOST_NOTIFICATION, type, start_time, end_time, (void *)hst, not_author, not_data, escalated, contacts_notified, NULL); #endif /* update the status log with the host info */ update_host_status(hst, FALSE); return OK; } /* checks viability of sending a host notification */ int check_host_notification_viability(host *hst, int type, int options) { time_t current_time; time_t timeperiod_start; time_t first_problem_time; log_debug_info(DEBUGL_FUNCTIONS, 0, "check_host_notification_viability()\n"); /* forced notifications bust through everything */ if(options & NOTIFICATION_OPTION_FORCED) { log_debug_info(DEBUGL_NOTIFICATIONS, 1, "This is a forced host notification, so we'll send it out.\n"); return OK; } /* get current time */ time(¤t_time); /* are notifications enabled? */ if(enable_notifications == FALSE) { log_debug_info(DEBUGL_NOTIFICATIONS, 1, "Notifications are disabled, so host notifications will not be sent out.\n"); return ERROR; } /* see if the host can have notifications sent out at this time */ if(check_time_against_period(current_time, hst->notification_period_ptr) == ERROR) { log_debug_info(DEBUGL_NOTIFICATIONS, 1, "This host shouldn't have notifications sent out at this time.\n"); /* if this is a normal notification, calculate the next acceptable notification time, once the next valid time range arrives... */ if(type == NOTIFICATION_NORMAL) { get_next_valid_time(current_time, &timeperiod_start, hst->notification_period_ptr); /* it looks like there is no notification time defined, so schedule next one far into the future (one year)... */ if(timeperiod_start == (time_t)0) hst->next_notification = (time_t)(current_time + (60 * 60 * 24 * 365)); /* else use the next valid notification time */ else hst->next_notification = timeperiod_start; log_debug_info(DEBUGL_NOTIFICATIONS, 1, "Next possible notification time: %s\n", ctime(&hst->next_notification)); } return ERROR; } /* are notifications temporarily disabled for this host? */ if(hst->notifications_enabled == FALSE) { log_debug_info(DEBUGL_NOTIFICATIONS, 1, "Notifications are temporarily disabled for this host, so we won't send one out.\n"); return ERROR; } /*********************************************/ /*** SPECIAL CASE FOR CUSTOM NOTIFICATIONS ***/ /*********************************************/ /* custom notifications are good to go at this point... */ if(type == NOTIFICATION_CUSTOM) { if(hst->scheduled_downtime_depth > 0) { log_debug_info(DEBUGL_NOTIFICATIONS, 1, "We shouldn't send custom notification during scheduled downtime.\n"); return ERROR; } return OK; } /*****************************************/ /*** SPECIAL CASE FOR ACKNOWLEDGEMENTS ***/ /*****************************************/ /* acknowledgements only have to pass three general filters, although they have another test of their own... */ if(type == NOTIFICATION_ACKNOWLEDGEMENT) { /* don't send an acknowledgement if there isn't a problem... */ if(hst->current_state == HOST_UP) { log_debug_info(DEBUGL_NOTIFICATIONS, 1, "The host is currently UP, so we won't send an acknowledgement.\n"); return ERROR; } /* acknowledgement viability test passed, so the notification can be sent out */ return OK; } /*****************************************/ /*** SPECIAL CASE FOR FLAPPING ALERTS ***/ /*****************************************/ /* flapping notifications only have to pass three general filters */ if(type == NOTIFICATION_FLAPPINGSTART || type == NOTIFICATION_FLAPPINGSTOP || type == NOTIFICATION_FLAPPINGDISABLED) { /* don't send a notification if we're not supposed to... */ if(!(hst->notification_options & OPT_FLAPPING)) { log_debug_info(DEBUGL_NOTIFICATIONS, 1, "We shouldn't notify about FLAPPING events for this host.\n"); return ERROR; } /* don't send notifications during scheduled downtime */ if(hst->scheduled_downtime_depth > 0) { log_debug_info(DEBUGL_NOTIFICATIONS, 1, "We shouldn't notify about FLAPPING events during scheduled downtime.\n"); return ERROR; } /* flapping viability test passed, so the notification can be sent out */ return OK; } /*****************************************/ /*** SPECIAL CASE FOR DOWNTIME ALERTS ***/ /*****************************************/ /* flapping notifications only have to pass three general filters */ if(type == NOTIFICATION_DOWNTIMESTART || type == NOTIFICATION_DOWNTIMEEND || type == NOTIFICATION_DOWNTIMECANCELLED) { /* don't send a notification if we're not supposed to... */ if((hst->notification_options & OPT_DOWNTIME) == FALSE) { log_debug_info(DEBUGL_NOTIFICATIONS, 1, "We shouldn't notify about DOWNTIME events for this host.\n"); return ERROR; } /* don't send notifications during scheduled downtime */ if(hst->scheduled_downtime_depth > 0) { log_debug_info(DEBUGL_NOTIFICATIONS, 1, "We shouldn't notify about DOWNTIME events during scheduled downtime!\n"); return ERROR; } /* downtime viability test passed, so the notification can be sent out */ return OK; } /****************************************/ /*** NORMAL NOTIFICATIONS ***************/ /****************************************/ /* is this a hard problem/recovery? */ if(hst->state_type == SOFT_STATE) { log_debug_info(DEBUGL_NOTIFICATIONS, 1, "This host is in a soft state, so we won't send a notification out.\n"); return ERROR; } /* has this problem already been acknowledged? */ if(hst->problem_has_been_acknowledged == TRUE) { log_debug_info(DEBUGL_NOTIFICATIONS, 1, "This host problem has already been acknowledged, so we won't send a notification out!\n"); return ERROR; } /* check notification dependencies */ if(check_host_dependencies(hst, NOTIFICATION_DEPENDENCY) == DEPENDENCIES_FAILED) { log_debug_info(DEBUGL_NOTIFICATIONS, 1, "Notification dependencies for this host have failed, so we won't sent a notification out!\n"); return ERROR; } /* see if we should notify about problems with this host */ if((hst->notification_options & (1 << hst->current_state)) == FALSE) { log_debug_info(DEBUGL_NOTIFICATIONS, 1, "We shouldn't notify about %s status for this host.\n", host_state_name(hst->current_state)); return ERROR; } if(hst->current_state == HOST_UP) { if((hst->notification_options & OPT_RECOVERY) == FALSE) { log_debug_info(DEBUGL_NOTIFICATIONS, 1, "We shouldn't notify about RECOVERY states for this host.\n"); return ERROR; } if(!hst->notified_on) { log_debug_info(DEBUGL_NOTIFICATIONS, 1, "We shouldn't notify about this recovery.\n"); return ERROR; } } /* see if enough time has elapsed for first notification (Mathias Sundman) */ /* 10/02/07 don't place restrictions on recoveries or non-normal notifications, must use last time up (or program start) in calculation */ /* it is reasonable to assume that if the host was never up, the program start time should be used in this calculation */ if(type == NOTIFICATION_NORMAL && hst->current_notification_number == 0 && hst->current_state != HOST_UP) { first_problem_time = hst->last_time_up > 0 ? hst->last_time_up : program_start; if(current_time < first_problem_time + (time_t)(hst->first_notification_delay * interval_length)) { log_debug_info(DEBUGL_NOTIFICATIONS, 1, "Not enough time has elapsed since the host changed to a non-UP state (or since program start), so we shouldn't notify about this problem yet.\n"); return ERROR; } } /* if this host is currently flapping, don't send the notification */ if(hst->is_flapping == TRUE) { log_debug_info(DEBUGL_NOTIFICATIONS, 1, "This host is currently flapping, so we won't send notifications.\n"); return ERROR; } /***** RECOVERY NOTIFICATIONS ARE GOOD TO GO AT THIS POINT *****/ if(hst->current_state == HOST_UP) return OK; /* if this host is currently in a scheduled downtime period, don't send the notification */ if(hst->scheduled_downtime_depth > 0) { log_debug_info(DEBUGL_NOTIFICATIONS, 1, "This host is currently in a scheduled downtime, so we won't send notifications.\n"); return ERROR; } /* check if we shouldn't renotify contacts about the host problem */ if(hst->no_more_notifications == TRUE) { log_debug_info(DEBUGL_NOTIFICATIONS, 1, "We shouldn't re-notify contacts about this host problem.\n"); return ERROR; } /* check if its time to re-notify the contacts about the host... */ if(current_time < hst->next_notification) { log_debug_info(DEBUGL_NOTIFICATIONS, 1, "Its not yet time to re-notify the contacts about this host problem...\n"); log_debug_info(DEBUGL_NOTIFICATIONS, 1, "Next acceptable notification time: %s", ctime(&hst->next_notification)); return ERROR; } return OK; } /* checks the viability of notifying a specific contact about a host */ int check_contact_host_notification_viability(contact *cntct, host *hst, int type, int options) { log_debug_info(DEBUGL_FUNCTIONS, 0, "check_contact_host_notification_viability()\n"); log_debug_info(DEBUGL_NOTIFICATIONS, 2, "** Checking host notification viability for contact '%s'...\n", cntct->name); /* forced notifications bust through everything */ if(options & NOTIFICATION_OPTION_FORCED) { log_debug_info(DEBUGL_NOTIFICATIONS, 2, "This is a forced host notification, so we'll send it out for this contact.\n"); return OK; } /* are notifications enabled? */ if(cntct->host_notifications_enabled == FALSE) { log_debug_info(DEBUGL_NOTIFICATIONS, 2, "Host notifications are disabled for this contact.\n"); return ERROR; } /* is this host important enough? */ if(cntct->minimum_value > hst->hourly_value + host_services_value(hst)) { log_debug_info(DEBUGL_NOTIFICATIONS, 2, "Contact's minimum_importance is greater than the importance of the host and all its services. Notification will be blocked\n"); return ERROR; } /* see if the contact can be notified at this time */ if(check_time_against_period(time(NULL), cntct->host_notification_period_ptr) == ERROR) { log_debug_info(DEBUGL_NOTIFICATIONS, 2, "This contact shouldn't be notified at this time.\n"); return ERROR; } /*********************************************/ /*** SPECIAL CASE FOR CUSTOM NOTIFICATIONS ***/ /*********************************************/ /* custom notifications are good to go at this point... */ if(type == NOTIFICATION_CUSTOM) return OK; /****************************************/ /*** SPECIAL CASE FOR FLAPPING ALERTS ***/ /****************************************/ if(type == NOTIFICATION_FLAPPINGSTART || type == NOTIFICATION_FLAPPINGSTOP || type == NOTIFICATION_FLAPPINGDISABLED) { if((cntct->host_notification_options & OPT_FLAPPING) == FALSE) { log_debug_info(DEBUGL_NOTIFICATIONS, 2, "We shouldn't notify this contact about FLAPPING host events.\n"); return ERROR; } return OK; } /****************************************/ /*** SPECIAL CASE FOR DOWNTIME ALERTS ***/ /****************************************/ if(type == NOTIFICATION_DOWNTIMESTART || type == NOTIFICATION_DOWNTIMEEND || type == NOTIFICATION_DOWNTIMECANCELLED) { if(flag_isset(cntct->host_notification_options, OPT_DOWNTIME) == FALSE) { log_debug_info(DEBUGL_NOTIFICATIONS, 2, "We shouldn't notify this contact about DOWNTIME host events.\n"); return ERROR; } return OK; } /*************************************/ /*** ACKS AND NORMAL NOTIFICATIONS ***/ /*************************************/ /* see if we should notify about problems with this host */ if(flag_isset(cntct->host_notification_options, 1 << hst->current_state) == FALSE) { log_debug_info(DEBUGL_NOTIFICATIONS, 2, "We shouldn't notify this contact about %s states.\n", host_state_name(hst->current_state)); return ERROR; } if(hst->current_state == HOST_UP && hst->notified_on == 0) { log_debug_info(DEBUGL_NOTIFICATIONS, 2, "We shouldn't notify about this recovery.\n"); return ERROR; } log_debug_info(DEBUGL_NOTIFICATIONS, 2, "** Host notification viability for contact '%s' PASSED.\n", cntct->name); return OK; } /* notify a specific contact that an entire host is down or up */ int notify_contact_of_host(nagios_macros *mac, contact *cntct, host *hst, int type, char *not_author, char *not_data, int options, int escalated) { commandsmember *temp_commandsmember = NULL; char *command_name = NULL; char *command_name_ptr = NULL; char *temp_buffer = NULL; char *processed_buffer = NULL; char *raw_command = NULL; char *processed_command = NULL; struct timeval start_time; struct timeval end_time; struct timeval method_start_time; struct timeval method_end_time; int macro_options = STRIP_ILLEGAL_MACRO_CHARS | ESCAPE_MACRO_CHARS; int neb_result; log_debug_info(DEBUGL_FUNCTIONS, 0, "notify_contact_of_host()\n"); log_debug_info(DEBUGL_NOTIFICATIONS, 2, "** Notifying contact '%s'\n", cntct->name); /* get start time */ gettimeofday(&start_time, NULL); #ifdef USE_EVENT_BROKER /* send data to event broker */ end_time.tv_sec = 0L; end_time.tv_usec = 0L; neb_result = broker_contact_notification_data(NEBTYPE_CONTACTNOTIFICATION_START, NEBFLAG_NONE, NEBATTR_NONE, HOST_NOTIFICATION, type, start_time, end_time, (void *)hst, cntct, not_author, not_data, escalated, NULL); if(NEBERROR_CALLBACKCANCEL == neb_result) return ERROR; else if(NEBERROR_CALLBACKOVERRIDE == neb_result) return OK; #endif /* process all the notification commands this user has */ for(temp_commandsmember = cntct->host_notification_commands; temp_commandsmember != NULL; temp_commandsmember = temp_commandsmember->next) { /* get start time */ gettimeofday(&method_start_time, NULL); #ifdef USE_EVENT_BROKER /* send data to event broker */ method_end_time.tv_sec = 0L; method_end_time.tv_usec = 0L; neb_result = broker_contact_notification_method_data(NEBTYPE_CONTACTNOTIFICATIONMETHOD_START, NEBFLAG_NONE, NEBATTR_NONE, HOST_NOTIFICATION, type, method_start_time, method_end_time, (void *)hst, cntct, temp_commandsmember->command, not_author, not_data, escalated, NULL); if(NEBERROR_CALLBACKCANCEL == neb_result) break ; else if(NEBERROR_CALLBACKOVERRIDE == neb_result) continue ; #endif /* get the raw command line */ get_raw_command_line_r(mac, temp_commandsmember->command_ptr, temp_commandsmember->command, &raw_command, macro_options); if(raw_command == NULL) continue; log_debug_info(DEBUGL_NOTIFICATIONS, 2, "Raw notification command: %s\n", raw_command); /* process any macros contained in the argument */ process_macros_r(mac, raw_command, &processed_command, macro_options); my_free(raw_command); if(processed_command == NULL) continue; /* get the command name */ command_name = (char *)strdup(temp_commandsmember->command); command_name_ptr = strtok(command_name, "!"); /* run the notification command... */ log_debug_info(DEBUGL_NOTIFICATIONS, 2, "Processed notification command: %s\n", processed_command); /* log the notification to program log file */ if(log_notifications == TRUE) { switch(type) { case NOTIFICATION_CUSTOM: asprintf(&temp_buffer, "HOST NOTIFICATION: %s;%s;CUSTOM ($HOSTSTATE$);%s;$HOSTOUTPUT$;$NOTIFICATIONAUTHOR$;$NOTIFICATIONCOMMENT$\n", cntct->name, hst->name, command_name_ptr); break; case NOTIFICATION_ACKNOWLEDGEMENT: asprintf(&temp_buffer, "HOST NOTIFICATION: %s;%s;ACKNOWLEDGEMENT ($HOSTSTATE$);%s;$HOSTOUTPUT$;$NOTIFICATIONAUTHOR$;$NOTIFICATIONCOMMENT$\n", cntct->name, hst->name, command_name_ptr); break; case NOTIFICATION_FLAPPINGSTART: asprintf(&temp_buffer, "HOST NOTIFICATION: %s;%s;FLAPPINGSTART ($HOSTSTATE$);%s;$HOSTOUTPUT$\n", cntct->name, hst->name, command_name_ptr); break; case NOTIFICATION_FLAPPINGSTOP: asprintf(&temp_buffer, "HOST NOTIFICATION: %s;%s;FLAPPINGSTOP ($HOSTSTATE$);%s;$HOSTOUTPUT$\n", cntct->name, hst->name, command_name_ptr); break; case NOTIFICATION_FLAPPINGDISABLED: asprintf(&temp_buffer, "HOST NOTIFICATION: %s;%s;FLAPPINGDISABLED ($HOSTSTATE$);%s;$HOSTOUTPUT$\n", cntct->name, hst->name, command_name_ptr); break; case NOTIFICATION_DOWNTIMESTART: asprintf(&temp_buffer, "HOST NOTIFICATION: %s;%s;DOWNTIMESTART ($HOSTSTATE$);%s;$HOSTOUTPUT$\n", cntct->name, hst->name, command_name_ptr); break; case NOTIFICATION_DOWNTIMEEND: asprintf(&temp_buffer, "HOST NOTIFICATION: %s;%s;DOWNTIMEEND ($HOSTSTATE$);%s;$HOSTOUTPUT$\n", cntct->name, hst->name, command_name_ptr); break; case NOTIFICATION_DOWNTIMECANCELLED: asprintf(&temp_buffer, "HOST NOTIFICATION: %s;%s;DOWNTIMECANCELLED ($HOSTSTATE$);%s;$HOSTOUTPUT$\n", cntct->name, hst->name, command_name_ptr); break; default: asprintf(&temp_buffer, "HOST NOTIFICATION: %s;%s;$HOSTSTATE$;%s;$HOSTOUTPUT$\n", cntct->name, hst->name, command_name_ptr); break; } process_macros_r(mac, temp_buffer, &processed_buffer, 0); write_to_all_logs(processed_buffer, NSLOG_HOST_NOTIFICATION); my_free(temp_buffer); my_free(processed_buffer); } /* run the notification command */ wproc_notify(cntct->name, hst->name, NULL, processed_command, mac); /* @todo Handle nebmod stuff when getting results from workers */ /* free memory */ my_free(command_name); my_free(processed_command); /* get end time */ gettimeofday(&method_end_time, NULL); #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_contact_notification_method_data(NEBTYPE_CONTACTNOTIFICATIONMETHOD_END, NEBFLAG_NONE, NEBATTR_NONE, HOST_NOTIFICATION, type, method_start_time, method_end_time, (void *)hst, cntct, temp_commandsmember->command, not_author, not_data, escalated, NULL); #endif } /* get end time */ gettimeofday(&end_time, NULL); /* update the contact's last host notification time */ cntct->last_host_notification = start_time.tv_sec; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_contact_notification_data(NEBTYPE_CONTACTNOTIFICATION_END, NEBFLAG_NONE, NEBATTR_NONE, HOST_NOTIFICATION, type, start_time, end_time, (void *)hst, cntct, not_author, not_data, escalated, NULL); #endif return OK; } /* checks to see if a host escalation entry is a match for the current host notification */ int is_valid_escalation_for_host_notification(host *hst, hostescalation *he, int options) { int notification_number = 0; time_t current_time = 0L; host *temp_host = NULL; log_debug_info(DEBUGL_FUNCTIONS, 0, "is_valid_escalation_for_host_notification()\n"); /* get the current time */ time(¤t_time); /* if this is a recovery, really we check for who got notified about a previous problem */ if(hst->current_state == HOST_UP) notification_number = hst->current_notification_number - 1; else notification_number = hst->current_notification_number; /* find the host this escalation entry is associated with */ temp_host = he->host_ptr; if(temp_host == NULL || temp_host != hst) return FALSE; /*** EXCEPTION ***/ /* broadcast options go to everyone, so this escalation is valid */ if(options & NOTIFICATION_OPTION_BROADCAST) return TRUE; /* skip this escalation if it happens later */ if(he->first_notification > notification_number) return FALSE; /* skip this escalation if it has already passed */ if(he->last_notification != 0 && he->last_notification < notification_number) return FALSE; /* skip this escalation if the state options don't match */ if(flag_isset(he->escalation_options, 1 << hst->current_state) == FALSE) return FALSE; /* skip this escalation if it has a timeperiod and the current time isn't valid */ if(he->escalation_period != NULL && check_time_against_period(current_time, he->escalation_period_ptr) == ERROR) return FALSE; return TRUE; } /* checks to see whether a host notification should be escalation */ int should_host_notification_be_escalated(host *hst) { objectlist *list; log_debug_info(DEBUGL_FUNCTIONS, 0, "should_host_notification_be_escalated()\n"); if(hst == NULL) return FALSE; /* search the host escalation list */ for (list = hst->escalation_list; list; list = list->next) { hostescalation *temp_he = (hostescalation *)list->object_ptr; /* we found a matching entry, so escalate this notification! */ if(is_valid_escalation_for_host_notification(hst, temp_he, NOTIFICATION_OPTION_NONE) == TRUE) return TRUE; } log_debug_info(DEBUGL_NOTIFICATIONS, 1, "Host notification will NOT be escalated.\n"); return FALSE; } /* given a host, create a list of contacts to be notified, removing duplicates, checking contact notification viability */ int create_notification_list_from_host(nagios_macros *mac, host *hst, int options, int *escalated, int type) { hostescalation *temp_he = NULL; contactsmember *temp_contactsmember = NULL; contact *temp_contact = NULL; contactgroupsmember *temp_contactgroupsmember = NULL; contactgroup *temp_contactgroup = NULL; int escalate_notification = FALSE; log_debug_info(DEBUGL_FUNCTIONS, 0, "create_notification_list_from_host()\n"); /* see if this notification should be escalated */ escalate_notification = should_host_notification_be_escalated(hst); /* set the escalation flag */ *escalated = escalate_notification; /* make sure there aren't any leftover contacts */ free_notification_list(); /* set the escalation macro */ mac->x[MACRO_NOTIFICATIONISESCALATED] = strdup(escalate_notification ? "1" : "0"); if(options & NOTIFICATION_OPTION_BROADCAST) log_debug_info(DEBUGL_NOTIFICATIONS, 1, "This notification will be BROADCAST to all (escalated and normal) contacts...\n"); /* use escalated contacts for this notification */ if(escalate_notification == TRUE || (options & NOTIFICATION_OPTION_BROADCAST)) { objectlist *list; log_debug_info(DEBUGL_NOTIFICATIONS, 1, "Adding contacts from host escalation(s) to notification list.\n"); /* check all the host escalation entries */ for(list = hst->escalation_list; list; list = list->next) { temp_he = (hostescalation *)list->object_ptr; /* see if this escalation if valid for this notification */ if(is_valid_escalation_for_host_notification(hst, temp_he, options) == FALSE) continue; log_debug_info(DEBUGL_NOTIFICATIONS, 2, "Adding individual contacts from host escalation(s) to notification list.\n"); /* add all individual contacts for this escalation */ for(temp_contactsmember = temp_he->contacts; temp_contactsmember != NULL; temp_contactsmember = temp_contactsmember->next) { if((temp_contact = temp_contactsmember->contact_ptr) == NULL) continue; /* check now if the contact can be notified */ if (check_contact_host_notification_viability(temp_contact, hst, type, options) == OK) add_notification(mac, temp_contact); else log_debug_info(DEBUGL_NOTIFICATIONS, 2, "Not adding contact '%s'\n", temp_contact->name); } log_debug_info(DEBUGL_NOTIFICATIONS, 2, "Adding members of contact groups from host escalation(s) to notification list.\n"); /* add all contacts that belong to contactgroups for this escalation */ for(temp_contactgroupsmember = temp_he->contact_groups; temp_contactgroupsmember != NULL; temp_contactgroupsmember = temp_contactgroupsmember->next) { log_debug_info(DEBUGL_NOTIFICATIONS, 2, "Adding members of contact group '%s' for host escalation to notification list.\n", temp_contactgroupsmember->group_name); if((temp_contactgroup = temp_contactgroupsmember->group_ptr) == NULL) continue; for(temp_contactsmember = temp_contactgroup->members; temp_contactsmember != NULL; temp_contactsmember = temp_contactsmember->next) { if((temp_contact = temp_contactsmember->contact_ptr) == NULL) continue; /* check now if the contact can be notified */ if (check_contact_host_notification_viability(temp_contact, hst, type, options) == OK) add_notification(mac, temp_contact); else log_debug_info(DEBUGL_NOTIFICATIONS, 2, "Not adding contact '%s'\n", temp_contact->name); } } } } /* use normal, non-escalated contacts for this notification */ if(escalate_notification == FALSE || (options & NOTIFICATION_OPTION_BROADCAST)) { log_debug_info(DEBUGL_NOTIFICATIONS, 1, "Adding normal contacts for host to notification list.\n"); log_debug_info(DEBUGL_NOTIFICATIONS, 2, "Adding individual contacts for host to notification list.\n"); /* add all individual contacts for this host */ for(temp_contactsmember = hst->contacts; temp_contactsmember != NULL; temp_contactsmember = temp_contactsmember->next) { if((temp_contact = temp_contactsmember->contact_ptr) == NULL) continue; /* check now if the contact can be notified */ if (check_contact_host_notification_viability(temp_contact, hst, type, options) == OK) add_notification(mac, temp_contact); else log_debug_info(DEBUGL_NOTIFICATIONS, 2, "Not adding contact '%s'\n", temp_contact->name); } log_debug_info(DEBUGL_NOTIFICATIONS, 2, "Adding members of contact groups for host to notification list.\n"); /* add all contacts that belong to contactgroups for this host */ for(temp_contactgroupsmember = hst->contact_groups; temp_contactgroupsmember != NULL; temp_contactgroupsmember = temp_contactgroupsmember->next) { log_debug_info(DEBUGL_NOTIFICATIONS, 2, "Adding members of contact group '%s' for host to notification list.\n", temp_contactgroupsmember->group_name); if((temp_contactgroup = temp_contactgroupsmember->group_ptr) == NULL) continue; for(temp_contactsmember = temp_contactgroup->members; temp_contactsmember != NULL; temp_contactsmember = temp_contactsmember->next) { if((temp_contact = temp_contactsmember->contact_ptr) == NULL) continue; /* check now if the contact can be notified */ if (check_contact_host_notification_viability(temp_contact, hst, type, options) == OK) add_notification(mac, temp_contact); else log_debug_info(DEBUGL_NOTIFICATIONS, 2, "Not adding contact '%s'\n", temp_contact->name); } } } return OK; } /******************************************************************/ /***************** NOTIFICATION TIMING FUNCTIONS ******************/ /******************************************************************/ /* calculates next acceptable re-notification time for a service */ time_t get_next_service_notification_time(service *svc, time_t offset) { time_t next_notification = 0L; double interval_to_use = 0.0; objectlist *list; int have_escalated_interval = FALSE; log_debug_info(DEBUGL_FUNCTIONS, 0, "get_next_service_notification_time()\n"); log_debug_info(DEBUGL_NOTIFICATIONS, 2, "Calculating next valid notification time...\n"); /* default notification interval */ interval_to_use = svc->notification_interval; log_debug_info(DEBUGL_NOTIFICATIONS, 2, "Default interval: %f\n", interval_to_use); /* search all the escalation entries for valid matches for this service (at its current notification number) */ for(list = svc->escalation_list; list; list = list->next) { serviceescalation *temp_se = (serviceescalation *)list->object_ptr; /* interval < 0 means to use non-escalated interval */ if(temp_se->notification_interval < 0.0) continue; /* skip this entry if it isn't appropriate */ if(is_valid_escalation_for_service_notification(svc, temp_se, NOTIFICATION_OPTION_NONE) == FALSE) continue; log_debug_info(DEBUGL_NOTIFICATIONS, 2, "Found a valid escalation w/ interval of %f\n", temp_se->notification_interval); /* if we haven't used a notification interval from an escalation yet, use this one */ if(have_escalated_interval == FALSE) { have_escalated_interval = TRUE; interval_to_use = temp_se->notification_interval; } /* else use the shortest of all valid escalation intervals */ else if(temp_se->notification_interval < interval_to_use) interval_to_use = temp_se->notification_interval; log_debug_info(DEBUGL_NOTIFICATIONS, 2, "New interval: %f\n", interval_to_use); } /* if notification interval is 0, we shouldn't send any more problem notifications (unless service is volatile) */ if(interval_to_use == 0.0 && svc->is_volatile == FALSE) svc->no_more_notifications = TRUE; else svc->no_more_notifications = FALSE; log_debug_info(DEBUGL_NOTIFICATIONS, 2, "Interval used for calculating next valid notification time: %f\n", interval_to_use); /* calculate next notification time */ next_notification = offset + (interval_to_use * interval_length); return next_notification; } /* calculates next acceptable re-notification time for a host */ time_t get_next_host_notification_time(host *hst, time_t offset) { time_t next_notification = 0L; double interval_to_use = 0.0; objectlist *list; int have_escalated_interval = FALSE; log_debug_info(DEBUGL_FUNCTIONS, 0, "get_next_host_notification_time()\n"); log_debug_info(DEBUGL_NOTIFICATIONS, 2, "Calculating next valid notification time...\n"); /* default notification interval */ interval_to_use = hst->notification_interval; log_debug_info(DEBUGL_NOTIFICATIONS, 2, "Default interval: %f\n", interval_to_use); /* check all the host escalation entries for valid matches for this host (at its current notification number) */ for(list = hst->escalation_list; list; list = list->next) { hostescalation *temp_he = (hostescalation *)list->object_ptr; /* interval < 0 means to use non-escalated interval */ if(temp_he->notification_interval < 0.0) continue; /* skip this entry if it isn't appropriate */ if(is_valid_escalation_for_host_notification(hst, temp_he, NOTIFICATION_OPTION_NONE) == FALSE) continue; log_debug_info(DEBUGL_NOTIFICATIONS, 2, "Found a valid escalation w/ interval of %f\n", temp_he->notification_interval); /* if we haven't used a notification interval from an escalation yet, use this one */ if(have_escalated_interval == FALSE) { have_escalated_interval = TRUE; interval_to_use = temp_he->notification_interval; } /* else use the shortest of all valid escalation intervals */ else if(temp_he->notification_interval < interval_to_use) interval_to_use = temp_he->notification_interval; log_debug_info(DEBUGL_NOTIFICATIONS, 2, "New interval: %f\n", interval_to_use); } /* if interval is 0, no more notifications should be sent */ if(interval_to_use == 0.0) hst->no_more_notifications = TRUE; else hst->no_more_notifications = FALSE; log_debug_info(DEBUGL_NOTIFICATIONS, 2, "Interval used for calculating next valid notification time: %f\n", interval_to_use); /* calculate next notification time */ next_notification = offset + (interval_to_use * interval_length); return next_notification; } /******************************************************************/ /***************** NOTIFICATION OBJECT FUNCTIONS ******************/ /******************************************************************/ /* given a contact name, find the notification entry for them for the list in memory */ notification * find_notification(contact *cntct) { notification *temp_notification = NULL; log_debug_info(DEBUGL_FUNCTIONS, 0, "find_notification() start\n"); if(cntct == NULL) return NULL; for(temp_notification = notification_list; temp_notification != NULL; temp_notification = temp_notification->next) { if(temp_notification->contact == cntct) return temp_notification; } /* we couldn't find the contact in the notification list */ return NULL; } /* add a new notification to the list in memory */ int add_notification(nagios_macros *mac, contact *cntct) { notification *new_notification = NULL; notification *temp_notification = NULL; log_debug_info(DEBUGL_FUNCTIONS, 0, "add_notification() start\n"); if(cntct == NULL) return ERROR; log_debug_info(DEBUGL_NOTIFICATIONS, 2, "Adding contact '%s' to notification list.\n", cntct->name); /* don't add anything if this contact is already on the notification list */ if((temp_notification = find_notification(cntct)) != NULL) return OK; /* allocate memory for a new contact in the notification list */ if((new_notification = malloc(sizeof(notification))) == NULL) return ERROR; /* fill in the contact info */ new_notification->contact = cntct; /* add new notification to head of list */ new_notification->next = notification_list; notification_list = new_notification; /* add contact to notification recipients macro */ if(mac->x[MACRO_NOTIFICATIONRECIPIENTS] == NULL) mac->x[MACRO_NOTIFICATIONRECIPIENTS] = (char *)strdup(cntct->name); else { if((mac->x[MACRO_NOTIFICATIONRECIPIENTS] = (char *)realloc(mac->x[MACRO_NOTIFICATIONRECIPIENTS], strlen(mac->x[MACRO_NOTIFICATIONRECIPIENTS]) + strlen(cntct->name) + 2))) { strcat(mac->x[MACRO_NOTIFICATIONRECIPIENTS], ","); strcat(mac->x[MACRO_NOTIFICATIONRECIPIENTS], cntct->name); } } return OK; } nagios-4.3.4/base/perfdata.c000066400000000000000000000051321314764422400156560ustar00rootroot00000000000000/***************************************************************************** * * PERFDATA.C - Performance data routines for Nagios * * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ /*********** COMMON HEADER FILES ***********/ #include "../include/config.h" #include "../include/common.h" #include "../include/objects.h" #include "../include/perfdata.h" #include "../include/macros.h" #include "../xdata/xpddefault.h" /******************************************************************/ /************** INITIALIZATION & CLEANUP FUNCTIONS ****************/ /******************************************************************/ /* initializes performance data */ int initialize_performance_data(const char *cfgfile) { return xpddefault_initialize_performance_data(cfgfile); } /* cleans up performance data */ int cleanup_performance_data(void) { return xpddefault_cleanup_performance_data(); } /******************************************************************/ /****************** PERFORMANCE DATA FUNCTIONS ********************/ /******************************************************************/ /* updates service performance data */ int update_service_performance_data(service *svc) { /* should we be processing performance data for anything? */ if(process_performance_data == FALSE) return OK; /* should we process performance data for this service? */ if(svc->process_performance_data == FALSE) return OK; /* process the performance data! */ xpddefault_update_service_performance_data(svc); return OK; } /* updates host performance data */ int update_host_performance_data(host *hst) { /* should we be processing performance data for anything? */ if(process_performance_data == FALSE) return OK; /* should we process performance data for this host? */ if(hst->process_performance_data == FALSE) return OK; /* process the performance data! */ xpddefault_update_host_performance_data(hst); return OK; } nagios-4.3.4/base/query-handler.c000066400000000000000000000261701314764422400166550ustar00rootroot00000000000000#include "include/config.h" #include "include/nagios.h" #include "lib/libnagios.h" #include "lib/nsock.h" #include #include #include /* A registered handler */ struct query_handler { const char *name; /* also "address" of this handler. Must be unique */ const char *description; /* short description of this handler */ unsigned int options; qh_handler handler; struct query_handler *prev_qh, *next_qh; }; static struct query_handler *qhandlers; static int qh_listen_sock = -1; /* the listening socket */ static unsigned int qh_running; unsigned int qh_max_running = 0; /* defaults to unlimited */ static dkhash_table *qh_table; /* the echo service. stupid, but useful for testing */ static int qh_echo(int sd, char *buf, unsigned int len) { if (!strcmp(buf, "help")) { nsock_printf_nul(sd, "Query handler that simply echoes back what you send it."); return 0; } (void)write(sd, buf, len); return 0; } static struct query_handler *qh_find_handler(const char *name) { return (struct query_handler *)dkhash_get(qh_table, name, NULL); } /* subset of http error codes */ const char *qh_strerror(int code) { if (code < 0) return "Low-level system error"; if (code == 100) return "Continue"; if (code == 101) return "Switching protocols"; if (code < 300) return "OK"; if (code < 400) return "Redirected (possibly deprecated address)"; switch (code) { /* client errors */ case 400: return "Bad request"; case 401: return "Unauthorized"; case 403: return "Forbidden (disabled by config)"; case 404: return "Not found"; case 405: return "Method not allowed"; case 406: return "Not acceptable"; case 407: return "Proxy authentication required"; case 408: return "Request timed out"; case 409: return "Conflict"; case 410: return "Gone"; case 411: return "Length required"; case 412: return "Precondition failed"; case 413: return "Request too large"; case 414: return "Request-URI too long"; /* server errors */ case 500: return "Internal server error"; case 501: return "Not implemented"; case 502: return "Bad gateway"; case 503: return "Service unavailable"; case 504: return "Gateway timeout"; case 505: return "Version not supported"; } return "Unknown error"; } static int qh_input(int sd, int events, void *ioc_) { iocache *ioc = (iocache *)ioc_; /* input on main socket, so accept one */ if(sd == qh_listen_sock) { struct sockaddr sa; socklen_t slen = 0; int nsd; memset(&sa, 0, sizeof(sa)); /* shut valgrind up */ nsd = accept(sd, &sa, &slen); if(qh_max_running && qh_running >= qh_max_running) { nsock_printf(nsd, "503: Server full"); close(nsd); return 0; } if(!(ioc = iocache_create(16384))) { logit(NSLOG_RUNTIME_ERROR, TRUE, "qh: Failed to create iocache for inbound request\n"); nsock_printf(nsd, "500: Internal server error"); close(nsd); return 0; } /* * @todo: Stash the iocache and the socket in some * addressable list so we can release them on deinit */ if(iobroker_register(nagios_iobs, nsd, ioc, qh_input) < 0) { logit(NSLOG_RUNTIME_ERROR, TRUE, "qh: Failed to register input socket %d with I/O broker: %s\n", nsd, strerror(errno)); iocache_destroy(ioc); close(nsd); return 0; } /* make it non-blocking, but leave kernel buffers unchanged */ worker_set_sockopts(nsd, 0); qh_running++; return 0; } else { int result; unsigned long len; unsigned int query_len = 0; char *buf, *space; struct query_handler *qh; char *handler = NULL, *query = NULL; result = iocache_read(ioc, sd); /* disconnect? */ if(result == 0 || (result < 0 && errno == EPIPE)) { iocache_destroy(ioc); iobroker_close(nagios_iobs, sd); qh_running--; return 0; } /* * A request looks like this: '[@|#][][]\0'. * That is, optional '#' (oneshot) or '@' (keepalive), * followed by the name of a registered handler, followed by * an optional space and an optional query. If the handler * has no "default" handler, a query is required or an error * will be thrown. */ /* Use data up to the first nul byte */ buf = iocache_use_delim(ioc, "\0", 1, &len); if(!buf) return 0; /* Identify handler part and any magic query bytes */ if (*buf == '@' || *buf == '#') { handler = buf + 1; } /* Locate query (if any) */ if((space = strchr(buf, ' '))) { *space = 0; query = space + 1; query_len = len - ((unsigned long)query - (unsigned long)buf); } else { query = ""; query_len = 0; } /* locate the handler */ if(!(qh = qh_find_handler(handler))) { /* not found. that's a 404 */ nsock_printf(sd, "404: %s: No such handler", handler); iobroker_close(nagios_iobs, sd); iocache_destroy(ioc); return 0; } /* strip trailing newlines */ while (query_len > 0 && (query[query_len - 1] == 0 || query[query_len - 1] == '\n')) query[--query_len] = 0; /* now pass the query to the handler */ if ((result = qh->handler(sd, query, query_len)) >= 100) { nsock_printf_nul(sd, "%d: %s", result, qh_strerror(result)); } if(result >= 300 || *buf == '#') { /* error code or one-shot query */ iobroker_close(nagios_iobs, sd); iocache_destroy(ioc); return 0; } /* check for magic handler codes */ switch (result) { case QH_CLOSE: /* oneshot handler */ case -1: /* general error */ iobroker_close(nagios_iobs, sd); /* fallthrough */ case QH_TAKEOVER: /* handler takes over */ case 101: /* switch protocol (takeover + message) */ iocache_destroy(ioc); break; } } return 0; } int qh_deregister_handler(const char *name) { struct query_handler *qh, *next, *prev; if (!(qh = dkhash_remove(qh_table, name, NULL))) return 0; next = qh->next_qh; prev = qh->prev_qh; if (next) next->prev_qh = prev; if (prev) prev->next_qh = next; else qhandlers = next; free(qh); return 0; } int qh_register_handler(const char *name, const char *description, unsigned int options, qh_handler handler) { struct query_handler *qh; int result; if(!name) return -1; if(!handler) { logit(NSLOG_RUNTIME_ERROR, TRUE, "qh: Failed to register handler '%s': No handler function specified\n", name); return -1; } if(strlen(name) > 128) { logit(NSLOG_RUNTIME_ERROR, TRUE, "qh: Failed to register handler '%s': Name too long\n", name); return -ENAMETOOLONG; } /* names must be unique */ if(qh_find_handler(name)) { logit(NSLOG_RUNTIME_WARNING, TRUE, "qh: Handler '%s' registered more than once\n", name); return -1; } if (!(qh = calloc(1, sizeof(*qh)))) { logit(NSLOG_RUNTIME_ERROR, TRUE, "qh: Failed to allocate memory for handler '%s'\n", name); return -errno; } qh->name = name; qh->description = description; qh->handler = handler; qh->options = options; qh->next_qh = qhandlers; if (qhandlers) qhandlers->prev_qh = qh; qhandlers = qh; result = dkhash_insert(qh_table, qh->name, NULL, qh); if(result < 0) { logit(NSLOG_RUNTIME_ERROR, TRUE, "qh: Failed to insert query handler '%s' (%p) into hash table %p (%d): %s\n", name, qh, qh_table, result, strerror(errno)); free(qh); return result; } return 0; } void qh_deinit(const char *path) { struct query_handler *qh, *next; for(qh = qhandlers; qh; qh = next) { next = qh->next_qh; qh_deregister_handler(qh->name); } dkhash_destroy(qh_table); qh_table = NULL; qhandlers = NULL; if(!path) return; unlink(path); } static int qh_help(int sd, char *buf, unsigned int len) { struct query_handler *qh; if (!*buf || !strcmp(buf, "help")) { nsock_printf_nul(sd, " help show help for handler \n" " help list list registered handlers\n"); return 0; } if (!strcmp(buf, "list")) { for (qh = qhandlers; qh; qh = qh->next_qh) { nsock_printf(sd, "%-10s %s\n", qh->name, qh->description ? qh->description : "(No description available)"); } nsock_printf(sd, "%c", 0); return 0; } if (!(qh = qh_find_handler(buf))) { nsock_printf_nul(sd, "No handler named '%s' is registered\n", buf); } else if (qh->handler(sd, "help", 4) > 200) { nsock_printf_nul(sd, "The handler %s doesn't have any help yet.", buf); } return 0; } static int qh_core(int sd, char *buf, unsigned int len) { char *space; if (!*buf || !strcmp(buf, "help")) { nsock_printf_nul(sd, "Query handler for manipulating nagios core.\n" "Available commands:\n" " loadctl Print information about current load control settings\n" " loadctl Configure nagios load control.\n" " The options are the same parameters and format as\n" " returned above.\n" " squeuestats scheduling queue statistics\n" ); return 0; } if ((space = memchr(buf, ' ', len))) *(space++) = 0; if (!space && !strcmp(buf, "loadctl")) { nsock_printf_nul (sd, "jobs_max=%u;jobs_min=%u;" "jobs_running=%u;jobs_limit=%u;" "load=%.2f;" "backoff_limit=%.2f;backoff_change=%u;" "rampup_limit=%.2f;rampup_change=%u;" "nproc_limit=%u;nofile_limit=%u;" "options=%u;changes=%u;", loadctl.jobs_max, loadctl.jobs_min, loadctl.jobs_running, loadctl.jobs_limit, loadctl.load[0], loadctl.backoff_limit, loadctl.backoff_change, loadctl.rampup_limit, loadctl.rampup_change, loadctl.nproc_limit, loadctl.nofile_limit, loadctl.options, loadctl.changes); return 0; } if (!space && !strcmp(buf, "squeuestats")) return dump_event_stats(sd); if (space) { len -= (unsigned long)space - (unsigned long)buf; if (!strcmp(buf, "loadctl")) { return set_loadctl_options(space, len) == OK ? 200 : 400; } } /* No matching command found */ return 404; } int qh_init(const char *path) { int result, old_umask; if(qh_listen_sock >= 0) iobroker_close(nagios_iobs, qh_listen_sock); if(!path) { logit(NSLOG_RUNTIME_ERROR, TRUE, "qh: query_socket is NULL. What voodoo is this?\n"); return ERROR; } old_umask = umask(0117); errno = 0; qh_listen_sock = nsock_unix(path, NSOCK_TCP | NSOCK_UNLINK); umask(old_umask); if(qh_listen_sock < 0) { logit(NSLOG_RUNTIME_ERROR, TRUE, "qh: Failed to init socket '%s'. %s: %s\n", path, nsock_strerror(qh_listen_sock), strerror(errno)); return ERROR; } /* plugins shouldn't have this socket */ (void)fcntl(qh_listen_sock, F_SETFD, FD_CLOEXEC); /* most likely overkill, but it's small, so... */ if(!(qh_table = dkhash_create(1024))) { logit(NSLOG_RUNTIME_ERROR, TRUE, "qh: Failed to create hash table\n"); close(qh_listen_sock); return ERROR; } errno = 0; result = iobroker_register(nagios_iobs, qh_listen_sock, NULL, qh_input); if(result < 0) { dkhash_destroy(qh_table); close(qh_listen_sock); logit(NSLOG_RUNTIME_ERROR, TRUE, "qh: Failed to register socket with io broker: %s; errno=%d: %s\n", iobroker_strerror(result), errno, strerror(errno)); return ERROR; } logit(NSLOG_INFO_MESSAGE, FALSE, "qh: Socket '%s' successfully initialized\n", path); /* now register our the in-core handlers */ if(!qh_register_handler("core", "Nagios Core control and info", 0, qh_core)) logit(NSLOG_INFO_MESSAGE, FALSE, "qh: core query handler registered\n"); qh_register_handler("echo", "The Echo Service - What You Put Is What You Get", 0, qh_echo); qh_register_handler("help", "Help for the query handler", 0, qh_help); return 0; } nagios-4.3.4/base/sehandlers.c000066400000000000000000000525541314764422400162320ustar00rootroot00000000000000/***************************************************************************** * * SEHANDLERS.C - Service and host event and state handlers for Nagios * * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #include "../include/config.h" #include "../include/comments.h" #include "../include/common.h" #include "../include/statusdata.h" #include "../include/downtime.h" #include "../include/macros.h" #include "../include/nagios.h" #include "../include/perfdata.h" #include "../include/broker.h" #include "../include/workers.h" #ifdef USE_EVENT_BROKER #include "../include/neberrors.h" #endif /******************************************************************/ /************* OBSESSIVE COMPULSIVE HANDLER FUNCTIONS *************/ /******************************************************************/ /* handles service check results in an obsessive compulsive manner... */ int obsessive_compulsive_service_check_processor(service *svc) { char *raw_command = NULL; char *processed_command = NULL; host *temp_host = NULL; int macro_options = STRIP_ILLEGAL_MACRO_CHARS | ESCAPE_MACRO_CHARS; nagios_macros mac; log_debug_info(DEBUGL_FUNCTIONS, 0, "obsessive_compulsive_service_check_processor()\n"); if(svc == NULL) return ERROR; /* bail out if we shouldn't be obsessing */ if(obsess_over_services == FALSE || svc->obsess == FALSE) return OK; /* if there is no valid command, exit */ if(ocsp_command == NULL) return ERROR; /* find the associated host */ if((temp_host = (host *)svc->host_ptr) == NULL) return ERROR; /* update service macros */ memset(&mac, 0, sizeof(mac)); grab_host_macros_r(&mac, temp_host); grab_service_macros_r(&mac, svc); /* get the raw command line */ get_raw_command_line_r(&mac, ocsp_command_ptr, ocsp_command, &raw_command, macro_options); if(raw_command == NULL) { clear_volatile_macros_r(&mac); return ERROR; } log_debug_info(DEBUGL_CHECKS, 2, "Raw obsessive compulsive service processor command line: %s\n", raw_command); /* process any macros in the raw command line */ process_macros_r(&mac, raw_command, &processed_command, macro_options); my_free(raw_command); if(processed_command == NULL) { clear_volatile_macros_r(&mac); return ERROR; } log_debug_info(DEBUGL_CHECKS, 2, "Processed obsessive compulsive service processor command line: %s\n", processed_command); /* run the command through a worker */ wproc_run_service_job(WPJOB_OCSP, ocsp_timeout, svc, processed_command, &mac); /* free memory */ clear_volatile_macros_r(&mac); my_free(processed_command); return OK; } /* handles host check results in an obsessive compulsive manner... */ int obsessive_compulsive_host_check_processor(host *hst) { char *raw_command = NULL; char *processed_command = NULL; int macro_options = STRIP_ILLEGAL_MACRO_CHARS | ESCAPE_MACRO_CHARS; nagios_macros mac; log_debug_info(DEBUGL_FUNCTIONS, 0, "obsessive_compulsive_host_check_processor()\n"); if(hst == NULL) return ERROR; /* bail out if we shouldn't be obsessing */ if(obsess_over_hosts == FALSE || hst->obsess == FALSE) return OK; /* if there is no valid command, exit */ if(ochp_command == NULL) return ERROR; /* update macros */ memset(&mac, 0, sizeof(mac)); grab_host_macros_r(&mac, hst); /* get the raw command line */ get_raw_command_line_r(&mac, ochp_command_ptr, ochp_command, &raw_command, macro_options); if(raw_command == NULL) { clear_volatile_macros_r(&mac); return ERROR; } log_debug_info(DEBUGL_CHECKS, 2, "Raw obsessive compulsive host processor command line: %s\n", raw_command); /* process any macros in the raw command line */ process_macros_r(&mac, raw_command, &processed_command, macro_options); my_free(raw_command); if(processed_command == NULL) { clear_volatile_macros_r(&mac); return ERROR; } log_debug_info(DEBUGL_CHECKS, 2, "Processed obsessive compulsive host processor command line: %s\n", processed_command); /* run the command through a worker */ wproc_run_host_job(WPJOB_OCHP, ochp_timeout, hst, processed_command, &mac); /* free memory */ clear_volatile_macros_r(&mac); my_free(processed_command); return OK; } /******************************************************************/ /**************** SERVICE EVENT HANDLER FUNCTIONS *****************/ /******************************************************************/ /* handles changes in the state of a service */ int handle_service_event(service *svc) { host *temp_host = NULL; nagios_macros mac; log_debug_info(DEBUGL_FUNCTIONS, 0, "handle_service_event()\n"); if(svc == NULL) return ERROR; #ifdef USE_EVENT_BROKER /* send event data to broker */ broker_statechange_data(NEBTYPE_STATECHANGE_END, NEBFLAG_NONE, NEBATTR_NONE, SERVICE_STATECHANGE, (void *)svc, svc->current_state, svc->state_type, svc->current_attempt, svc->max_attempts, NULL); #endif /* bail out if we shouldn't be running event handlers */ if(enable_event_handlers == FALSE) return OK; if(svc->event_handler_enabled == FALSE) return OK; /* find the host */ if((temp_host = (host *)svc->host_ptr) == NULL) return ERROR; /* update service macros */ memset(&mac, 0, sizeof(mac)); grab_host_macros_r(&mac, temp_host); grab_service_macros_r(&mac, svc); /* run the global service event handler */ run_global_service_event_handler(&mac, svc); /* run the event handler command if there is one */ if(svc->event_handler != NULL) run_service_event_handler(&mac, svc); clear_volatile_macros_r(&mac); return OK; } /* runs the global service event handler */ int run_global_service_event_handler(nagios_macros *mac, service *svc) { char *raw_command = NULL; char *processed_command = NULL; char *raw_logentry = NULL; char *processed_logentry = NULL; char *command_output = NULL; int early_timeout = FALSE; double exectime = 0.0; int result = 0; #ifdef USE_EVENT_BROKER struct timeval start_time; struct timeval end_time; int neb_result = OK; #endif int macro_options = STRIP_ILLEGAL_MACRO_CHARS | ESCAPE_MACRO_CHARS; log_debug_info(DEBUGL_FUNCTIONS, 0, "run_global_service_event_handler()\n"); if(svc == NULL) return ERROR; /* bail out if we shouldn't be running event handlers */ if(enable_event_handlers == FALSE) return OK; /* a global service event handler command has not been defined */ if(global_service_event_handler == NULL) return ERROR; log_debug_info(DEBUGL_EVENTHANDLERS, 1, "Running global event handler for service '%s' on host '%s'...\n", svc->description, svc->host_name); #ifdef USE_EVENT_BROKER /* get start time */ gettimeofday(&start_time, NULL); #endif /* get the raw command line */ get_raw_command_line_r(mac, global_service_event_handler_ptr, global_service_event_handler, &raw_command, macro_options); if(raw_command == NULL) { return ERROR; } log_debug_info(DEBUGL_EVENTHANDLERS, 2, "Raw global service event handler command line: %s\n", raw_command); /* process any macros in the raw command line */ process_macros_r(mac, raw_command, &processed_command, macro_options); my_free(raw_command); if(processed_command == NULL) return ERROR; log_debug_info(DEBUGL_EVENTHANDLERS, 2, "Processed global service event handler command line: %s\n", processed_command); if(log_event_handlers == TRUE) { asprintf(&raw_logentry, "GLOBAL SERVICE EVENT HANDLER: %s;%s;$SERVICESTATE$;$SERVICESTATETYPE$;$SERVICEATTEMPT$;%s\n", svc->host_name, svc->description, global_service_event_handler); process_macros_r(mac, raw_logentry, &processed_logentry, macro_options); logit(NSLOG_EVENT_HANDLER, FALSE, "%s", processed_logentry); } #ifdef USE_EVENT_BROKER /* send event data to broker */ end_time.tv_sec = 0L; end_time.tv_usec = 0L; neb_result = broker_event_handler(NEBTYPE_EVENTHANDLER_START, NEBFLAG_NONE, NEBATTR_NONE, GLOBAL_SERVICE_EVENTHANDLER, (void *)svc, svc->current_state, svc->state_type, start_time, end_time, exectime, event_handler_timeout, early_timeout, result, global_service_event_handler, processed_command, NULL, NULL); /* neb module wants to override (or cancel) the event handler - perhaps it will run the eventhandler itself */ if(neb_result == NEBERROR_CALLBACKOVERRIDE) { my_free(processed_command); my_free(raw_logentry); my_free(processed_logentry); return OK; } #endif /* run the command through a worker */ /* XXX FIXME make base/workers.c handle the eventbroker stuff below */ result = wproc_run(WPJOB_GLOBAL_SVC_EVTHANDLER, processed_command, event_handler_timeout, mac); /* check to see if the event handler timed out */ if(early_timeout == TRUE) logit(NSLOG_EVENT_HANDLER | NSLOG_RUNTIME_WARNING, TRUE, "Warning: Global service event handler command '%s' timed out after %d seconds\n", processed_command, event_handler_timeout); #ifdef USE_EVENT_BROKER /* get end time */ gettimeofday(&end_time, NULL); #endif #ifdef USE_EVENT_BROKER /* send event data to broker */ broker_event_handler(NEBTYPE_EVENTHANDLER_END, NEBFLAG_NONE, NEBATTR_NONE, GLOBAL_SERVICE_EVENTHANDLER, (void *)svc, svc->current_state, svc->state_type, start_time, end_time, exectime, event_handler_timeout, early_timeout, result, global_service_event_handler, processed_command, command_output, NULL); #endif /* free memory */ my_free(command_output); my_free(processed_command); my_free(raw_logentry); my_free(processed_logentry); return OK; } /* runs a service event handler command */ int run_service_event_handler(nagios_macros *mac, service *svc) { char *raw_command = NULL; char *processed_command = NULL; char *raw_logentry = NULL; char *processed_logentry = NULL; char *command_output = NULL; int early_timeout = FALSE; double exectime = 0.0; int result = 0; #ifdef USE_EVENT_BROKER struct timeval start_time; struct timeval end_time; int neb_result = OK; #endif int macro_options = STRIP_ILLEGAL_MACRO_CHARS | ESCAPE_MACRO_CHARS; log_debug_info(DEBUGL_FUNCTIONS, 0, "run_service_event_handler()\n"); if(svc == NULL) return ERROR; /* bail if there's no command */ if(svc->event_handler == NULL) return ERROR; log_debug_info(DEBUGL_EVENTHANDLERS, 1, "Running event handler for service '%s' on host '%s'...\n", svc->description, svc->host_name); #ifdef USE_EVENT_BROKER /* get start time */ gettimeofday(&start_time, NULL); #endif /* get the raw command line */ get_raw_command_line_r(mac, svc->event_handler_ptr, svc->event_handler, &raw_command, macro_options); if(raw_command == NULL) return ERROR; log_debug_info(DEBUGL_EVENTHANDLERS, 2, "Raw service event handler command line: %s\n", raw_command); /* process any macros in the raw command line */ process_macros_r(mac, raw_command, &processed_command, macro_options); my_free(raw_command); if(processed_command == NULL) return ERROR; log_debug_info(DEBUGL_EVENTHANDLERS, 2, "Processed service event handler command line: %s\n", processed_command); if(log_event_handlers == TRUE) { asprintf(&raw_logentry, "SERVICE EVENT HANDLER: %s;%s;$SERVICESTATE$;$SERVICESTATETYPE$;$SERVICEATTEMPT$;%s\n", svc->host_name, svc->description, svc->event_handler); process_macros_r(mac, raw_logentry, &processed_logentry, macro_options); logit(NSLOG_EVENT_HANDLER, FALSE, "%s", processed_logentry); } #ifdef USE_EVENT_BROKER /* send event data to broker */ end_time.tv_sec = 0L; end_time.tv_usec = 0L; neb_result = broker_event_handler(NEBTYPE_EVENTHANDLER_START, NEBFLAG_NONE, NEBATTR_NONE, SERVICE_EVENTHANDLER, (void *)svc, svc->current_state, svc->state_type, start_time, end_time, exectime, event_handler_timeout, early_timeout, result, svc->event_handler, processed_command, NULL, NULL); /* neb module wants to override (or cancel) the event handler - perhaps it will run the eventhandler itself */ if(neb_result == NEBERROR_CALLBACKOVERRIDE) { my_free(processed_command); my_free(raw_logentry); my_free(processed_logentry); return OK; } #endif /* run the command through a worker */ /* XXX FIXME make base/workers.c handle the eventbroker stuff below */ result = wproc_run(WPJOB_SVC_EVTHANDLER, processed_command, event_handler_timeout, mac); /* check to see if the event handler timed out */ if(early_timeout == TRUE) logit(NSLOG_EVENT_HANDLER | NSLOG_RUNTIME_WARNING, TRUE, "Warning: Service event handler command '%s' timed out after %d seconds\n", processed_command, event_handler_timeout); #ifdef USE_EVENT_BROKER /* get end time */ gettimeofday(&end_time, NULL); #endif #ifdef USE_EVENT_BROKER /* send event data to broker */ broker_event_handler(NEBTYPE_EVENTHANDLER_END, NEBFLAG_NONE, NEBATTR_NONE, SERVICE_EVENTHANDLER, (void *)svc, svc->current_state, svc->state_type, start_time, end_time, exectime, event_handler_timeout, early_timeout, result, svc->event_handler, processed_command, command_output, NULL); #endif /* free memory */ my_free(command_output); my_free(processed_command); my_free(raw_logentry); my_free(processed_logentry); return OK; } /******************************************************************/ /****************** HOST EVENT HANDLER FUNCTIONS ******************/ /******************************************************************/ /* handles a change in the status of a host */ int handle_host_event(host *hst) { nagios_macros mac; log_debug_info(DEBUGL_FUNCTIONS, 0, "handle_host_event()\n"); if(hst == NULL) return ERROR; #ifdef USE_EVENT_BROKER /* send event data to broker */ broker_statechange_data(NEBTYPE_STATECHANGE_END, NEBFLAG_NONE, NEBATTR_NONE, HOST_STATECHANGE, (void *)hst, hst->current_state, hst->state_type, hst->current_attempt, hst->max_attempts, NULL); #endif /* bail out if we shouldn't be running event handlers */ if(enable_event_handlers == FALSE) return OK; if(hst->event_handler_enabled == FALSE) return OK; /* update host macros */ memset(&mac, 0, sizeof(mac)); grab_host_macros_r(&mac, hst); /* run the global host event handler */ run_global_host_event_handler(&mac, hst); /* run the event handler command if there is one */ if(hst->event_handler != NULL) run_host_event_handler(&mac, hst); return OK; } /* runs the global host event handler */ int run_global_host_event_handler(nagios_macros *mac, host *hst) { char *raw_command = NULL; char *processed_command = NULL; char *raw_logentry = NULL; char *processed_logentry = NULL; char *command_output = NULL; int early_timeout = FALSE; double exectime = 0.0; int result = 0; #ifdef USE_EVENT_BROKER struct timeval start_time; struct timeval end_time; int neb_result = OK; #endif int macro_options = STRIP_ILLEGAL_MACRO_CHARS | ESCAPE_MACRO_CHARS; log_debug_info(DEBUGL_FUNCTIONS, 0, "run_global_host_event_handler()\n"); if(hst == NULL) return ERROR; /* bail out if we shouldn't be running event handlers */ if(enable_event_handlers == FALSE) return OK; /* no global host event handler command is defined */ if(global_host_event_handler == NULL) return ERROR; log_debug_info(DEBUGL_EVENTHANDLERS, 1, "Running global event handler for host '%s'..\n", hst->name); #ifdef USE_EVENT_BROKER /* get start time */ gettimeofday(&start_time, NULL); #endif /* get the raw command line */ get_raw_command_line_r(mac, global_host_event_handler_ptr, global_host_event_handler, &raw_command, macro_options); if(raw_command == NULL) return ERROR; log_debug_info(DEBUGL_EVENTHANDLERS, 2, "Raw global host event handler command line: %s\n", raw_command); /* process any macros in the raw command line */ process_macros_r(mac, raw_command, &processed_command, macro_options); my_free(raw_command); if(processed_command == NULL) return ERROR; log_debug_info(DEBUGL_EVENTHANDLERS, 2, "Processed global host event handler command line: %s\n", processed_command); if(log_event_handlers == TRUE) { asprintf(&raw_logentry, "GLOBAL HOST EVENT HANDLER: %s;$HOSTSTATE$;$HOSTSTATETYPE$;$HOSTATTEMPT$;%s\n", hst->name, global_host_event_handler); process_macros_r(mac, raw_logentry, &processed_logentry, macro_options); logit(NSLOG_EVENT_HANDLER, FALSE, "%s", processed_logentry); } #ifdef USE_EVENT_BROKER /* send event data to broker */ end_time.tv_sec = 0L; end_time.tv_usec = 0L; neb_result = broker_event_handler(NEBTYPE_EVENTHANDLER_START, NEBFLAG_NONE, NEBATTR_NONE, GLOBAL_HOST_EVENTHANDLER, (void *)hst, hst->current_state, hst->state_type, start_time, end_time, exectime, event_handler_timeout, early_timeout, result, global_host_event_handler, processed_command, NULL, NULL); /* neb module wants to override (or cancel) the event handler - perhaps it will run the eventhandler itself */ if(neb_result == NEBERROR_CALLBACKOVERRIDE) { my_free(processed_command); my_free(raw_logentry); my_free(processed_logentry); return OK; } #endif /* run the command through a worker */ /* XXX FIXME make base/workers.c handle the eventbroker stuff below */ wproc_run(WPJOB_GLOBAL_HOST_EVTHANDLER, processed_command, event_handler_timeout, mac); /* check for a timeout in the execution of the event handler command */ if(early_timeout == TRUE) logit(NSLOG_EVENT_HANDLER | NSLOG_RUNTIME_WARNING, TRUE, "Warning: Global host event handler command '%s' timed out after %d seconds\n", processed_command, event_handler_timeout); #ifdef USE_EVENT_BROKER /* get end time */ gettimeofday(&end_time, NULL); #endif #ifdef USE_EVENT_BROKER /* send event data to broker */ broker_event_handler(NEBTYPE_EVENTHANDLER_END, NEBFLAG_NONE, NEBATTR_NONE, GLOBAL_HOST_EVENTHANDLER, (void *)hst, hst->current_state, hst->state_type, start_time, end_time, exectime, event_handler_timeout, early_timeout, result, global_host_event_handler, processed_command, command_output, NULL); #endif /* free memory */ my_free(command_output); my_free(processed_command); my_free(raw_logentry); my_free(processed_logentry); return OK; } /* runs a host event handler command */ int run_host_event_handler(nagios_macros *mac, host *hst) { char *raw_command = NULL; char *processed_command = NULL; char *raw_logentry = NULL; char *processed_logentry = NULL; char *command_output = NULL; int early_timeout = FALSE; double exectime = 0.0; int result = 0; #ifdef USE_EVENT_BROKER struct timeval start_time; struct timeval end_time; int neb_result = OK; #endif int macro_options = STRIP_ILLEGAL_MACRO_CHARS | ESCAPE_MACRO_CHARS; log_debug_info(DEBUGL_FUNCTIONS, 0, "run_host_event_handler()\n"); if(hst == NULL) return ERROR; /* bail if there's no command */ if(hst->event_handler == NULL) return ERROR; log_debug_info(DEBUGL_EVENTHANDLERS, 1, "Running event handler for host '%s'..\n", hst->name); #ifdef USE_EVENT_BROKER /* get start time */ gettimeofday(&start_time, NULL); #endif /* get the raw command line */ get_raw_command_line_r(mac, hst->event_handler_ptr, hst->event_handler, &raw_command, macro_options); if(raw_command == NULL) return ERROR; log_debug_info(DEBUGL_EVENTHANDLERS, 2, "Raw host event handler command line: %s\n", raw_command); /* process any macros in the raw command line */ process_macros_r(mac, raw_command, &processed_command, macro_options); my_free(raw_command); if(processed_command == NULL) return ERROR; log_debug_info(DEBUGL_EVENTHANDLERS, 2, "Processed host event handler command line: %s\n", processed_command); if(log_event_handlers == TRUE) { asprintf(&raw_logentry, "HOST EVENT HANDLER: %s;$HOSTSTATE$;$HOSTSTATETYPE$;$HOSTATTEMPT$;%s\n", hst->name, hst->event_handler); process_macros_r(mac, raw_logentry, &processed_logentry, macro_options); logit(NSLOG_EVENT_HANDLER, FALSE, "%s", processed_logentry); } #ifdef USE_EVENT_BROKER /* send event data to broker */ end_time.tv_sec = 0L; end_time.tv_usec = 0L; neb_result = broker_event_handler(NEBTYPE_EVENTHANDLER_START, NEBFLAG_NONE, NEBATTR_NONE, HOST_EVENTHANDLER, (void *)hst, hst->current_state, hst->state_type, start_time, end_time, exectime, event_handler_timeout, early_timeout, result, hst->event_handler, processed_command, NULL, NULL); /* neb module wants to override (or cancel) the event handler - perhaps it will run the eventhandler itself */ if(neb_result == NEBERROR_CALLBACKOVERRIDE) { my_free(processed_command); my_free(raw_logentry); my_free(processed_logentry); return OK; } #endif /* run the command through a worker */ result = wproc_run(WPJOB_HOST_EVTHANDLER, processed_command, event_handler_timeout, mac); /* check to see if the event handler timed out */ if(early_timeout == TRUE) logit(NSLOG_EVENT_HANDLER | NSLOG_RUNTIME_WARNING, TRUE, "Warning: Host event handler command '%s' timed out after %d seconds\n", processed_command, event_handler_timeout); #ifdef USE_EVENT_BROKER /* get end time */ gettimeofday(&end_time, NULL); #endif #ifdef USE_EVENT_BROKER /* send event data to broker */ broker_event_handler(NEBTYPE_EVENTHANDLER_END, NEBFLAG_NONE, NEBATTR_NONE, HOST_EVENTHANDLER, (void *)hst, hst->current_state, hst->state_type, start_time, end_time, exectime, event_handler_timeout, early_timeout, result, hst->event_handler, processed_command, command_output, NULL); #endif /* free memory */ my_free(command_output); my_free(processed_command); my_free(raw_logentry); my_free(processed_logentry); return OK; } nagios-4.3.4/base/sretention.c000066400000000000000000000056611314764422400162710ustar00rootroot00000000000000/***************************************************************************** * * SRETENTION.C - State retention routines for Nagios * * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ /*********** COMMON HEADER FILES ***********/ #include "../include/config.h" #include "../include/common.h" #include "../include/objects.h" #include "../include/statusdata.h" #include "../include/nagios.h" #include "../include/sretention.h" #include "../include/broker.h" #include "../xdata/xrddefault.h" /* default routines */ /******************************************************************/ /************* TOP-LEVEL STATE INFORMATION FUNCTIONS **************/ /******************************************************************/ /* initializes retention data at program start */ int initialize_retention_data(const char *cfgfile) { return xrddefault_initialize_retention_data(cfgfile); } /* cleans up retention data before program termination */ int cleanup_retention_data(void) { return xrddefault_cleanup_retention_data(); } /* save all host and service state information */ int save_state_information(int autosave) { int result = OK; if(retain_state_information == FALSE) return OK; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_retention_data(NEBTYPE_RETENTIONDATA_STARTSAVE, NEBFLAG_NONE, NEBATTR_NONE, NULL); #endif result = xrddefault_save_state_information(); #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_retention_data(NEBTYPE_RETENTIONDATA_ENDSAVE, NEBFLAG_NONE, NEBATTR_NONE, NULL); #endif if(result == ERROR) return ERROR; if(autosave == TRUE) logit(NSLOG_PROCESS_INFO, FALSE, "Auto-save of retention data completed successfully.\n"); return OK; } /* reads in initial host and state information */ int read_initial_state_information(void) { int result = OK; if(retain_state_information == FALSE) return OK; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_retention_data(NEBTYPE_RETENTIONDATA_STARTLOAD, NEBFLAG_NONE, NEBATTR_NONE, NULL); #endif result = xrddefault_read_state_information(); #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_retention_data(NEBTYPE_RETENTIONDATA_ENDLOAD, NEBFLAG_NONE, NEBATTR_NONE, NULL); #endif if(result == ERROR) return ERROR; return OK; } nagios-4.3.4/base/utils.c000066400000000000000000003102151314764422400152310ustar00rootroot00000000000000/***************************************************************************** * * UTILS.C - Miscellaneous utility functions for Nagios * * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #include "../include/config.h" #include "../include/common.h" #include "../include/objects.h" #include "../include/statusdata.h" #include "../include/comments.h" #include "../include/macros.h" #include "../include/nagios.h" #include "../include/netutils.h" #include "../include/broker.h" #include "../include/nebmods.h" #include "../include/nebmodules.h" #include "../include/workers.h" /* global variables only used by the daemon */ char *nagios_binary_path = NULL; char *config_file = NULL; char *command_file; char *temp_file; char *temp_path; char *check_result_path; char *lock_file; int num_check_workers; char *qh_socket_path; char *nagios_user; char *nagios_group; char *ocsp_command; char *ochp_command; command *ocsp_command_ptr = NULL; command *ochp_command_ptr = NULL; int ocsp_timeout; int ochp_timeout; char *illegal_object_chars; int use_regexp_matches; int use_true_regexp_matching; int use_syslog; char *log_file; char *log_archive_path; int log_notifications; int log_service_retries; int log_host_retries; int log_event_handlers; int log_initial_states; int log_current_states; int log_external_commands; int log_passive_checks; unsigned long logging_options = 0; unsigned long syslog_options = 0; int service_check_timeout; int service_check_timeout_state; int host_check_timeout; int event_handler_timeout; int notification_timeout; char *object_precache_file; char *global_host_event_handler; char *global_service_event_handler; command *global_host_event_handler_ptr = NULL; command *global_service_event_handler_ptr = NULL; int service_inter_check_delay_method; int host_inter_check_delay_method; int service_interleave_factor_method; int max_host_check_spread; int max_service_check_spread; int check_reaper_interval; int max_check_reaper_time; int service_freshness_check_interval; int host_freshness_check_interval; int auto_rescheduling_interval; struct load_control loadctl; int check_orphaned_services; int check_orphaned_hosts; int check_service_freshness; int check_host_freshness; int auto_reschedule_checks; int auto_rescheduling_window; int additional_freshness_latency; int check_for_updates; int bare_update_check; time_t last_update_check = 0L; unsigned long update_uid = 0L; int update_available = FALSE; char *last_program_version = NULL; char *new_program_version = NULL; time_t last_program_stop = 0L; int use_aggressive_host_checking; time_t cached_host_check_horizon; time_t cached_service_check_horizon; int enable_predictive_host_dependency_checks; int enable_predictive_service_dependency_checks; int soft_state_dependencies; int retain_state_information; int retention_update_interval; int use_retained_program_state; int use_retained_scheduling_info; int retention_scheduling_horizon; char *retention_file; unsigned long modified_process_attributes = MODATTR_NONE; unsigned long modified_host_process_attributes = MODATTR_NONE; unsigned long modified_service_process_attributes = MODATTR_NONE; unsigned long retained_host_attribute_mask; unsigned long retained_service_attribute_mask; unsigned long retained_contact_host_attribute_mask; unsigned long retained_contact_service_attribute_mask; unsigned long retained_process_host_attribute_mask; unsigned long retained_process_service_attribute_mask; unsigned long next_event_id = 0L; unsigned long next_problem_id = 1L; unsigned long next_comment_id = 0L; unsigned long next_notification_id = 0L; int verify_config = FALSE; int test_scheduling = FALSE; int precache_objects = FALSE; int use_precached_objects = FALSE; int sigshutdown = FALSE; int sigrestart = FALSE; int caught_signal = FALSE; int sig_id = 0; int daemon_dumps_core; int max_parallel_service_checks; int currently_running_service_checks = 0; int currently_running_host_checks = 0; time_t event_start = 0L; int translate_passive_host_checks; int passive_host_checks_are_soft; int status_update_interval; int time_change_threshold; unsigned long event_broker_options; double low_service_flap_threshold; double high_service_flap_threshold; double low_host_flap_threshold; double high_host_flap_threshold; int use_large_installation_tweaks; int enable_environment_macros; int free_child_process_memory; int child_processes_fork_twice; char *use_timezone; char *website_url; int allow_empty_hostgroup_assignment; int host_down_disable_service_checks; /*** perfdata variables ***/ int perfdata_timeout; char *host_perfdata_command; char *service_perfdata_command; char *host_perfdata_file_template; char *service_perfdata_file_template; char *host_perfdata_file; char *service_perfdata_file; int host_perfdata_file_append; int service_perfdata_file_append; int host_perfdata_file_pipe; int service_perfdata_file_pipe; unsigned long host_perfdata_file_processing_interval; unsigned long service_perfdata_file_processing_interval; char *host_perfdata_file_processing_command; char *service_perfdata_file_processing_command; int host_perfdata_process_empty_results; int service_perfdata_process_empty_results; /*** end perfdata variables */ /* Filename variables used by handle_sigxfsz */ extern char *status_file; static long long check_file_size(char *, unsigned long, struct rlimit); notification *notification_list; time_t max_check_result_file_age; check_stats check_statistics[MAX_CHECK_STATS_TYPES]; char *debug_file; int debug_level; int debug_verbosity; unsigned long max_debug_file_size; iobroker_set *nagios_iobs = NULL; squeue_t *nagios_squeue = NULL; /* our scheduling queue */ sched_info scheduling_info; /* from GNU defines errno as a macro, since it's a per-thread variable */ #ifndef errno extern int errno; #endif /* Initialize the non-shared main configuration variables */ void init_main_cfg_vars(int first_time) { /* Initialize only the first time */ if(first_time) { num_check_workers = 0; /* auto-decide */ qh_socket_path = NULL; /* disabled */ } log_file = NULL; temp_file = NULL; temp_path = NULL; check_result_path = NULL; command_file = NULL; lock_file = NULL; log_archive_path = NULL; debug_file = NULL; object_precache_file = (char *)strdup(DEFAULT_PRECACHED_OBJECT_FILE); nagios_user = NULL; nagios_group = NULL; website_url = NULL; use_regexp_matches = FALSE; use_true_regexp_matching = FALSE; use_syslog = DEFAULT_USE_SYSLOG; log_service_retries = DEFAULT_LOG_SERVICE_RETRIES; log_host_retries = DEFAULT_LOG_HOST_RETRIES; log_initial_states = DEFAULT_LOG_INITIAL_STATES; if(first_time) { /* Not sure why this is not reset in reset_variables() */ log_current_states = DEFAULT_LOG_CURRENT_STATES; } log_notifications = DEFAULT_NOTIFICATION_LOGGING; log_event_handlers = DEFAULT_LOG_EVENT_HANDLERS; log_external_commands = DEFAULT_LOG_EXTERNAL_COMMANDS; log_passive_checks = DEFAULT_LOG_PASSIVE_CHECKS; service_check_timeout = DEFAULT_SERVICE_CHECK_TIMEOUT; if(first_time) { /* Not sure why this is not reset in reset_variables() */ service_check_timeout_state = STATE_CRITICAL; } host_check_timeout = DEFAULT_HOST_CHECK_TIMEOUT; event_handler_timeout = DEFAULT_EVENT_HANDLER_TIMEOUT; notification_timeout = DEFAULT_NOTIFICATION_TIMEOUT; ocsp_timeout = DEFAULT_OCSP_TIMEOUT; ochp_timeout = DEFAULT_OCHP_TIMEOUT; if(first_time) { /* Not sure why this is not reset in reset_variables() */ illegal_object_chars = NULL; } service_inter_check_delay_method = ICD_SMART; host_inter_check_delay_method = ICD_SMART; service_interleave_factor_method = ILF_SMART; max_service_check_spread = DEFAULT_SERVICE_CHECK_SPREAD; max_host_check_spread = DEFAULT_HOST_CHECK_SPREAD; use_aggressive_host_checking = DEFAULT_AGGRESSIVE_HOST_CHECKING; cached_host_check_horizon = DEFAULT_CACHED_HOST_CHECK_HORIZON; cached_service_check_horizon = DEFAULT_CACHED_SERVICE_CHECK_HORIZON; enable_predictive_host_dependency_checks = DEFAULT_ENABLE_PREDICTIVE_HOST_DEPENDENCY_CHECKS; enable_predictive_service_dependency_checks = DEFAULT_ENABLE_PREDICTIVE_SERVICE_DEPENDENCY_CHECKS; soft_state_dependencies = FALSE; retain_state_information = FALSE; retention_update_interval = DEFAULT_RETENTION_UPDATE_INTERVAL; use_retained_program_state = TRUE; use_retained_scheduling_info = FALSE; retention_scheduling_horizon = DEFAULT_RETENTION_SCHEDULING_HORIZON; if(first_time) { /* Not sure why this is not reset in reset_variables() */ retention_file = NULL; } retained_host_attribute_mask = 0L; retained_service_attribute_mask = 0L; retained_process_host_attribute_mask = 0L; retained_process_service_attribute_mask = 0L; retained_contact_host_attribute_mask = 0L; retained_contact_service_attribute_mask = 0L; check_reaper_interval = DEFAULT_CHECK_REAPER_INTERVAL; max_check_reaper_time = DEFAULT_MAX_REAPER_TIME; max_check_result_file_age = DEFAULT_MAX_CHECK_RESULT_AGE; service_freshness_check_interval = DEFAULT_FRESHNESS_CHECK_INTERVAL; host_freshness_check_interval = DEFAULT_FRESHNESS_CHECK_INTERVAL; auto_rescheduling_interval = DEFAULT_AUTO_RESCHEDULING_INTERVAL; auto_rescheduling_window = DEFAULT_AUTO_RESCHEDULING_WINDOW; check_orphaned_services = DEFAULT_CHECK_ORPHANED_SERVICES; check_orphaned_hosts = DEFAULT_CHECK_ORPHANED_HOSTS; check_service_freshness = DEFAULT_CHECK_SERVICE_FRESHNESS; check_host_freshness = DEFAULT_CHECK_HOST_FRESHNESS; auto_reschedule_checks = DEFAULT_AUTO_RESCHEDULE_CHECKS; if(first_time) { /* Not sure why this is not reset in reset_variables() */ daemon_dumps_core = TRUE; } max_parallel_service_checks = DEFAULT_MAX_PARALLEL_SERVICE_CHECKS; status_update_interval = DEFAULT_STATUS_UPDATE_INTERVAL; event_broker_options = BROKER_NOTHING; time_change_threshold = DEFAULT_TIME_CHANGE_THRESHOLD; low_service_flap_threshold = DEFAULT_LOW_SERVICE_FLAP_THRESHOLD; high_service_flap_threshold = DEFAULT_HIGH_SERVICE_FLAP_THRESHOLD; low_host_flap_threshold = DEFAULT_LOW_HOST_FLAP_THRESHOLD; high_host_flap_threshold = DEFAULT_HIGH_HOST_FLAP_THRESHOLD; translate_passive_host_checks = DEFAULT_TRANSLATE_PASSIVE_HOST_CHECKS; passive_host_checks_are_soft = DEFAULT_PASSIVE_HOST_CHECKS_SOFT; use_large_installation_tweaks = DEFAULT_USE_LARGE_INSTALLATION_TWEAKS; enable_environment_macros = FALSE; free_child_process_memory = -1; child_processes_fork_twice = -1; if(first_time) { /* Not sure why these are not reset in reset_variables() */ use_timezone = NULL; allow_empty_hostgroup_assignment = DEFAULT_ALLOW_EMPTY_HOSTGROUP_ASSIGNMENT; host_down_disable_service_checks = FALSE; perfdata_timeout = 0; host_perfdata_command = NULL; service_perfdata_command = NULL; host_perfdata_file_template = NULL; service_perfdata_file_template = NULL; host_perfdata_file = NULL; service_perfdata_file = NULL; host_perfdata_file_pipe = FALSE; host_perfdata_file_append = TRUE; service_perfdata_file_pipe = FALSE; service_perfdata_file_append = TRUE; host_perfdata_file_processing_interval = 0L; service_perfdata_file_processing_interval = 0L; host_perfdata_file_processing_command = NULL; service_perfdata_file_processing_command = NULL; host_perfdata_process_empty_results = DEFAULT_HOST_PERFDATA_PROCESS_EMPTY_RESULTS; service_perfdata_process_empty_results = DEFAULT_SERVICE_PERFDATA_PROCESS_EMPTY_RESULTS; } additional_freshness_latency = DEFAULT_ADDITIONAL_FRESHNESS_LATENCY; if(first_time) { /* Not sure why these are not reset in reset_variables() */ check_for_updates = DEFAULT_CHECK_FOR_UPDATES; bare_update_check = DEFAULT_BARE_UPDATE_CHECK; debug_level = DEFAULT_DEBUG_LEVEL; debug_verbosity = DEFAULT_DEBUG_VERBOSITY; max_debug_file_size = DEFAULT_MAX_DEBUG_FILE_SIZE; } global_host_event_handler = NULL; global_service_event_handler = NULL; ocsp_command = NULL; ochp_command = NULL; return; } static const char *worker_source_name(const void *source) { return source ? (const char *)source : "unknown internal source (voodoo, perhaps?)"; } static const char *spool_file_source_name(const void *source) { return "check result spool dir"; } struct check_engine nagios_check_engine = { "Nagios Core", worker_source_name, NULL, }; static struct check_engine nagios_spool_check_engine = { "Spooled checkresult file", spool_file_source_name, NULL, }; const char *check_result_source(check_result *cr) { if(cr->engine) return cr->engine->source_name(cr->source); return cr->source ? (const char *)cr->source : "(unknown engine)"; } int set_loadctl_options(char *opts, unsigned int len) { struct kvvec *kvv; int i; kvv = buf2kvvec(opts, len, '=', ';', 0); for (i = 0; i < kvv->kv_pairs; i++) { struct key_value *kv = &kvv->kv[i]; if (!strcmp(kv->key, "enabled")) { if (*kv->value == '1') { if (!(loadctl.options & LOADCTL_ENABLED)) logit(0, 0, "Warning: Enabling experimental load control\n"); loadctl.options |= LOADCTL_ENABLED; } else { if (loadctl.options & LOADCTL_ENABLED) logit(0, 0, "Warning: Disabling experimental load control\n"); loadctl.options &= (~LOADCTL_ENABLED); } } else if (!strcmp(kv->key, "jobs_max")) { loadctl.jobs_max = atoi(kv->value); } else if (!strcmp(kv->key, "jobs_min")) { loadctl.jobs_min = atoi(kv->value); } else if (!strcmp(kv->key, "jobs_limit")) { loadctl.jobs_limit = atoi(kv->value); } else if (!strcmp(kv->key, "check_interval")) { loadctl.check_interval = strtoul(kv->value, NULL, 10); } else if (!strcmp(kv->key, "backoff_limit")) { loadctl.backoff_limit = strtod(kv->value, NULL); } else if (!strcmp(kv->key, "rampup_limit")) { loadctl.rampup_limit = strtod(kv->value, NULL); } else if (!strcmp(kv->key, "backoff_change")) { loadctl.backoff_change = atoi(kv->value); } else if (!strcmp(kv->key, "rampup_change")) { loadctl.rampup_change = atoi(kv->value); } else { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Bad loadctl option; %s = %s\n", kv->key, kv->value); return 400; } } /* precedence order is "jobs_min -> jobs_max -> jobs_limit" */ if (loadctl.jobs_max < loadctl.jobs_min) loadctl.jobs_max = loadctl.jobs_min; if (loadctl.jobs_limit > loadctl.jobs_max) loadctl.jobs_limit = loadctl.jobs_max; if (loadctl.jobs_limit < loadctl.jobs_min) loadctl.jobs_limit = loadctl.jobs_min; kvvec_destroy(kvv, 0); return 0; } /******************************************************************/ /******************** SYSTEM COMMAND FUNCTIONS ********************/ /******************************************************************/ /* executes a system command - used for notifications, event handlers, etc. */ int my_system_r(nagios_macros *mac, char *cmd, int timeout, int *early_timeout, double *exectime, char **output, int max_output_length) { pid_t pid = 0; int status = 0; int result = 0; char buffer[MAX_INPUT_BUFFER] = ""; int fd[2]; FILE *fp = NULL; int bytes_read = 0; struct timeval start_time, end_time; dbuf output_dbuf; int dbuf_chunk = 1024; int flags; #ifdef HAVE_SIGACTION struct sigaction sig_action; #endif log_debug_info(DEBUGL_FUNCTIONS, 0, "my_system_r()\n"); /* initialize return variables */ if(output != NULL) *output = NULL; *early_timeout = FALSE; *exectime = 0.0; /* if no command was passed, return with no error */ if(cmd == NULL) return STATE_OK; log_debug_info(DEBUGL_COMMANDS, 1, "Running command '%s'...\n", cmd); /* create a pipe */ pipe(fd); /* make the pipe non-blocking */ fcntl(fd[0], F_SETFL, O_NONBLOCK); fcntl(fd[1], F_SETFL, O_NONBLOCK); /* get the command start time */ gettimeofday(&start_time, NULL); #ifdef USE_EVENT_BROKER /* send data to event broker */ end_time.tv_sec = 0L; end_time.tv_usec = 0L; broker_system_command(NEBTYPE_SYSTEM_COMMAND_START, NEBFLAG_NONE, NEBATTR_NONE, start_time, end_time, *exectime, timeout, *early_timeout, result, cmd, NULL, NULL); #endif /* fork */ pid = fork(); /* return an error if we couldn't fork */ if(pid == -1) { logit(NSLOG_RUNTIME_WARNING, TRUE, "Warning: fork() in my_system_r() failed for command \"%s\" - errno: %s\n", cmd, strerror(errno)); /* close both ends of the pipe */ close(fd[0]); close(fd[1]); return STATE_UNKNOWN; } /* execute the command in the child process */ if(pid == 0) { /* become process group leader */ setpgid(0, 0); /* set environment variables */ set_all_macro_environment_vars_r(mac, TRUE); /* ADDED 11/12/07 EG */ /* close external command file and shut down worker thread */ close_command_file(); /* reset signal handling */ reset_sighandler(); /* close pipe for reading */ close(fd[0]); /* prevent fd from being inherited by child processed */ flags = fcntl(fd[1], F_GETFD, 0); flags |= FD_CLOEXEC; fcntl(fd[1], F_SETFD, flags); /* trap commands that timeout */ #ifdef HAVE_SIGACTION sig_action.sa_sigaction = NULL; sig_action.sa_handler = my_system_sighandler; sigfillset(&sig_action.sa_mask); sig_action.sa_flags = SA_NODEFER|SA_RESTART; sigaction(SIGALRM, &sig_action, NULL); #else signal(SIGALRM, my_system_sighandler); #endif /* HAVE_SIGACTION */ alarm(timeout); /* run the command */ fp = (FILE *)popen(cmd, "r"); /* report an error if we couldn't run the command */ if(fp == NULL) { strncpy(buffer, "(Error: Could not execute command)\n", sizeof(buffer) - 1); buffer[sizeof(buffer) - 1] = '\x0'; /* write the error back to the parent process */ write(fd[1], buffer, strlen(buffer) + 1); result = STATE_CRITICAL; } else { /* write all the lines of output back to the parent process */ while(fgets(buffer, sizeof(buffer) - 1, fp)) write(fd[1], buffer, strlen(buffer)); /* close the command and get termination status */ status = pclose(fp); /* report an error if we couldn't close the command */ if(status == -1) result = STATE_CRITICAL; else { if(WEXITSTATUS(status) == 0 && WIFSIGNALED(status)) result = 128 + WTERMSIG(status); result = WEXITSTATUS(status); } } /* close pipe for writing */ close(fd[1]); /* reset the alarm */ alarm(0); /* clear environment variables */ set_all_macro_environment_vars_r(mac, FALSE); #ifndef DONT_USE_MEMORY_PERFORMANCE_TWEAKS /* free allocated memory */ /* this needs to be done last, so we don't free memory for variables before they're used above */ if(free_child_process_memory == TRUE) free_memory(mac); #endif _exit(result); } /* parent waits for child to finish executing command */ else { /* close pipe for writing */ close(fd[1]); /* wait for child to exit */ waitpid(pid, &status, 0); /* get the end time for running the command */ gettimeofday(&end_time, NULL); /* return execution time in milliseconds */ *exectime = (double)((double)(end_time.tv_sec - start_time.tv_sec) + (double)((end_time.tv_usec - start_time.tv_usec) / 1000) / 1000.0); if(*exectime < 0.0) *exectime = 0.0; /* get the exit code returned from the program */ result = WEXITSTATUS(status); /* check for possibly missing scripts/binaries/etc */ if(result == 126 || result == 127) { logit(NSLOG_RUNTIME_WARNING, TRUE, "Warning: Attempting to execute the command \"%s\" resulted in a return code of %d. Make sure the script or binary you are trying to execute actually exists...\n", cmd, result); } /* check bounds on the return value */ if(result < -1 || result > 3) result = STATE_UNKNOWN; /* initialize dynamic buffer */ dbuf_init(&output_dbuf, dbuf_chunk); /* Opsera patch to check timeout before attempting to read output via pipe. Originally by Sven Nierlein */ /* if there was a critical return code AND the command time exceeded the timeout thresholds, assume a timeout */ if(result == STATE_CRITICAL && (end_time.tv_sec - start_time.tv_sec) >= timeout) { /* set the early timeout flag */ *early_timeout = TRUE; /* try to kill the command that timed out by sending termination signal to child process group */ kill((pid_t)(-pid), SIGTERM); sleep(1); kill((pid_t)(-pid), SIGKILL); } /* read output if timeout has not occurred */ else { /* initialize output */ strcpy(buffer, ""); /* try and read the results from the command output (retry if we encountered a signal) */ do { bytes_read = read(fd[0], buffer, sizeof(buffer) - 1); /* append data we just read to dynamic buffer */ if(bytes_read > 0) { buffer[bytes_read] = '\x0'; dbuf_strcat(&output_dbuf, buffer); } /* handle errors */ if(bytes_read == -1) { /* we encountered a recoverable error, so try again */ if(errno == EINTR) continue; /* patch by Henning Brauer to prevent CPU hogging */ else if(errno == EAGAIN) { struct pollfd pfd; pfd.fd = fd[0]; pfd.events = POLLIN; poll(&pfd, 1, -1); continue; } else break; } /* we're done */ if(bytes_read == 0) break; } while(1); /* cap output length - this isn't necessary, but it keeps runaway plugin output from causing problems */ if(max_output_length > 0 && (int)output_dbuf.used_size > max_output_length) output_dbuf.buf[max_output_length] = '\x0'; if(output != NULL && output_dbuf.buf) *output = (char *)strdup(output_dbuf.buf); } log_debug_info(DEBUGL_COMMANDS, 1, "Execution time=%.3f sec, early timeout=%d, result=%d, output=%s\n", *exectime, *early_timeout, result, (output_dbuf.buf == NULL) ? "(null)" : output_dbuf.buf); #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_system_command(NEBTYPE_SYSTEM_COMMAND_END, NEBFLAG_NONE, NEBATTR_NONE, start_time, end_time, *exectime, timeout, *early_timeout, result, cmd, (output_dbuf.buf == NULL) ? NULL : output_dbuf.buf, NULL); #endif /* free memory */ dbuf_free(&output_dbuf); /* close the pipe for reading */ close(fd[0]); } return result; } /* * For API compatibility, we must include a my_system() whose * signature doesn't include the nagios_macros variable. * NDOUtils uses this. Possibly other modules as well. */ int my_system(char *cmd, int timeout, int *early_timeout, double *exectime, char **output, int max_output_length) { return my_system_r(get_global_macros(), cmd, timeout, early_timeout, exectime, output, max_output_length); } /* given a "raw" command, return the "expanded" or "whole" command line */ int get_raw_command_line_r(nagios_macros *mac, command *cmd_ptr, char *cmd, char **full_command, int macro_options) { char temp_arg[MAX_COMMAND_BUFFER] = ""; char *arg_buffer = NULL; register int x = 0; register int y = 0; register int arg_index = 0; log_debug_info(DEBUGL_FUNCTIONS, 0, "get_raw_command_line_r()\n"); /* clear the argv macros */ clear_argv_macros_r(mac); /* make sure we've got all the requirements */ if(cmd_ptr == NULL || full_command == NULL) return ERROR; log_debug_info(DEBUGL_COMMANDS | DEBUGL_CHECKS | DEBUGL_MACROS, 2, "Raw Command Input: %s\n", cmd_ptr->command_line); /* get the full command line */ *full_command = (char *)strdup((cmd_ptr->command_line == NULL) ? "" : cmd_ptr->command_line); /* XXX: Crazy indent */ /* get the command arguments */ if(cmd != NULL) { /* skip the command name (we're about to get the arguments)... */ for(arg_index = 0;; arg_index++) { if(cmd[arg_index] == '!' || cmd[arg_index] == '\x0') break; } /* get each command argument */ for(x = 0; x < MAX_COMMAND_ARGUMENTS; x++) { /* we reached the end of the arguments... */ if(cmd[arg_index] == '\x0') break; /* get the next argument */ /* can't use strtok(), as that's used in process_macros... */ for(arg_index++, y = 0; y < (int)sizeof(temp_arg) - 1; arg_index++) { /* handle escaped argument delimiters */ if(cmd[arg_index] == '\\' && cmd[arg_index+1] == '!') { arg_index++; } else if(cmd[arg_index] == '!' || cmd[arg_index] == '\x0') { /* end of argument */ break; } /* copy the character */ temp_arg[y] = cmd[arg_index]; y++; } temp_arg[y] = '\x0'; /* ADDED 01/29/04 EG */ /* process any macros we find in the argument */ process_macros_r(mac, temp_arg, &arg_buffer, macro_options); mac->argv[x] = arg_buffer; } } log_debug_info(DEBUGL_COMMANDS | DEBUGL_CHECKS | DEBUGL_MACROS, 2, "Expanded Command Output: %s\n", *full_command); return OK; } /* * This function modifies the global macro struct and is thus not * threadsafe */ int get_raw_command_line(command *cmd_ptr, char *cmd, char **full_command, int macro_options) { nagios_macros *mac; mac = get_global_macros(); return get_raw_command_line_r(mac, cmd_ptr, cmd, full_command, macro_options); } /******************************************************************/ /******************** ENVIRONMENT FUNCTIONS ***********************/ /******************************************************************/ /* sets or unsets an environment variable */ int set_environment_var(char *name, char *value, int set) { #ifndef HAVE_SETENV char *env_string = NULL; #endif /* we won't mess with null variable names */ if(name == NULL) return ERROR; /* set the environment variable */ if(set == TRUE) { #ifdef HAVE_SETENV setenv(name, (value == NULL) ? "" : value, 1); #else /* needed for Solaris and systems that don't have setenv() */ /* this will leak memory, but in a "controlled" way, since lost memory should be freed when the child process exits */ asprintf(&env_string, "%s=%s", name, (value == NULL) ? "" : value); if(env_string) putenv(env_string); #endif } /* clear the variable */ else { #ifdef HAVE_UNSETENV unsetenv(name); #endif } return OK; } /******************************************************************/ /************************* TIME FUNCTIONS *************************/ /******************************************************************/ /* Checks if the given time is in daylight time saving period */ static int is_dst_time(time_t *time) { struct tm *bt = localtime(time); return bt->tm_isdst; } /* Returns the shift in seconds if the given times are across the daylight time saving period change */ static int get_dst_shift(time_t *start, time_t *end) { int shift = 0, dst_end, dst_start; dst_start = is_dst_time(start); dst_end = is_dst_time(end); if(dst_start < dst_end) { shift = 3600; } else if(dst_start > dst_end) { shift = -3600; } return shift; } /*#define TEST_TIMEPERIODS_A 1*/ static timerange* _get_matching_timerange(time_t test_time, timeperiod *tperiod) { daterange *temp_daterange = NULL; time_t start_time = (time_t)0L; time_t end_time = (time_t)0L; unsigned long days = 0L; int year = 0; int shift = 0; time_t midnight = (time_t)0L; struct tm *t, tm_s; int daterange_type = 0; int test_time_year = 0; int test_time_mon = 0; int test_time_wday = 0; log_debug_info(DEBUGL_FUNCTIONS, 0, "_get_matching_timerange()\n"); if(tperiod == NULL) return NULL; t = localtime_r((time_t *)&test_time, &tm_s); test_time_year = t->tm_year; test_time_mon = t->tm_mon; test_time_wday = t->tm_wday; /* calculate the start of the day (midnight, 00:00 hours) when the specified test time occurs */ t->tm_sec = 0; t->tm_min = 0; t->tm_hour = 0; midnight = mktime(t); /**** check exceptions first ****/ for(daterange_type = 0; daterange_type < DATERANGE_TYPES; daterange_type++) { for(temp_daterange = tperiod->exceptions[daterange_type]; temp_daterange != NULL; temp_daterange = temp_daterange->next) { #ifdef TEST_TIMEPERIODS_A printf("TYPE: %d\n", daterange_type); printf("TEST: %llu = %s", (unsigned long long)test_time, ctime(&test_time)); printf("MIDNIGHT: %llu = %s", (unsigned long long)midnight, ctime(&midnight)); #endif /* get the start time */ switch(daterange_type) { case DATERANGE_CALENDAR_DATE: t->tm_sec = 0; t->tm_min = 0; t->tm_hour = 0; t->tm_wday = 0; t->tm_mday = temp_daterange->smday; t->tm_mon = temp_daterange->smon; t->tm_year = (temp_daterange->syear - 1900); t->tm_isdst = -1; start_time = mktime(t); break; case DATERANGE_MONTH_DATE: start_time = calculate_time_from_day_of_month(test_time_year, temp_daterange->smon, temp_daterange->smday); break; case DATERANGE_MONTH_DAY: start_time = calculate_time_from_day_of_month(test_time_year, test_time_mon, temp_daterange->smday); break; case DATERANGE_MONTH_WEEK_DAY: start_time = calculate_time_from_weekday_of_month(test_time_year, temp_daterange->smon, temp_daterange->swday, temp_daterange->swday_offset); break; case DATERANGE_WEEK_DAY: start_time = calculate_time_from_weekday_of_month(test_time_year, test_time_mon, temp_daterange->swday, temp_daterange->swday_offset); break; default: continue; break; } /* get the end time */ switch(daterange_type) { case DATERANGE_CALENDAR_DATE: t->tm_sec = 0; t->tm_min = 0; t->tm_hour = 0; t->tm_wday = 0; t->tm_mday = temp_daterange->emday; t->tm_mon = temp_daterange->emon; t->tm_year = (temp_daterange->eyear - 1900); t->tm_isdst = -1; end_time = mktime(t); break; case DATERANGE_MONTH_DATE: year = test_time_year; end_time = calculate_time_from_day_of_month(year, temp_daterange->emon, temp_daterange->emday); /* advance a year if necessary: august 2 - february 5 */ if(end_time < start_time) { year++; end_time = calculate_time_from_day_of_month(year, temp_daterange->emon, temp_daterange->emday); } break; case DATERANGE_MONTH_DAY: end_time = calculate_time_from_day_of_month(test_time_year, test_time_mon, temp_daterange->emday); break; case DATERANGE_MONTH_WEEK_DAY: year = test_time_year; end_time = calculate_time_from_weekday_of_month(year, temp_daterange->emon, temp_daterange->ewday, temp_daterange->ewday_offset); /* advance a year if necessary: thursday 2 august - monday 3 february */ if(end_time < start_time) { year++; end_time = calculate_time_from_weekday_of_month(year, temp_daterange->emon, temp_daterange->ewday, temp_daterange->ewday_offset); } break; case DATERANGE_WEEK_DAY: end_time = calculate_time_from_weekday_of_month(test_time_year, test_time_mon, temp_daterange->ewday, temp_daterange->ewday_offset); break; default: continue; break; } #ifdef TEST_TIMEPERIODS_A printf("START: %llu = %s", (unsigned long long)start_time, ctime(&start_time)); printf("END: %llu = %s", (unsigned long long)end_time, ctime(&end_time)); #endif /* start date was bad, so skip this date range */ if((unsigned long)start_time == 0L) continue; /* end date was bad - see if we can handle the error */ if((unsigned long)end_time == 0L) { switch(daterange_type) { case DATERANGE_CALENDAR_DATE: continue; break; case DATERANGE_MONTH_DATE: /* end date can't be helped, so skip it */ if(temp_daterange->emday < 0) continue; /* else end date slipped past end of month, so use last day of month as end date */ /* use same year calculated above */ end_time = calculate_time_from_day_of_month(year, temp_daterange->emon, -1); break; case DATERANGE_MONTH_DAY: /* end date can't be helped, so skip it */ if(temp_daterange->emday < 0) continue; /* else end date slipped past end of month, so use last day of month as end date */ end_time = calculate_time_from_day_of_month(test_time_year, test_time_mon, -1); break; case DATERANGE_MONTH_WEEK_DAY: /* end date can't be helped, so skip it */ if(temp_daterange->ewday_offset < 0) continue; /* else end date slipped past end of month, so use last day of month as end date */ /* use same year calculated above */ end_time = calculate_time_from_day_of_month(year, test_time_mon, -1); break; case DATERANGE_WEEK_DAY: /* end date can't be helped, so skip it */ if(temp_daterange->ewday_offset < 0) continue; /* else end date slipped past end of month, so use last day of month as end date */ end_time = calculate_time_from_day_of_month(test_time_year, test_time_mon, -1); break; default: continue; break; } } /* calculate skip date start (and end) */ if(temp_daterange->skip_interval > 1) { /* skip start date must be before test time */ if(start_time > test_time) continue; /* check if interval is across dlst change and gets the compensation */ shift = get_dst_shift(&start_time, &midnight); /* how many days have passed between skip start date and test time? */ days = (shift + (unsigned long)midnight - (unsigned long)start_time) / (3600 * 24); /* if test date doesn't fall on a skip interval day, bail out early */ if((days % temp_daterange->skip_interval) != 0) continue; /* use midnight of test date as start time */ else start_time = midnight; /* if skipping range has no end, use test date as end */ if((daterange_type == DATERANGE_CALENDAR_DATE) && (is_daterange_single_day(temp_daterange) == TRUE)) end_time = midnight; } #ifdef TEST_TIMEPERIODS_A printf("NEW START: %llu = %s", (unsigned long long)start_time, ctime(&start_time)); printf("NEW END: %llu = %s", (unsigned long long)end_time, ctime(&end_time)); printf("%d DAYS PASSED\n", days); printf("DLST SHIFT: %i\n", shift); #endif /* time falls inside the range of days * end time < start_time when range covers end-of-$unit * (fe. end-of-month) */ if((midnight + 84800UL >= start_time && (midnight <= end_time || start_time > end_time)) || (midnight <= end_time && start_time > end_time)) { #ifdef TEST_TIMEPERIODS_A printf("(MATCH)\n"); #endif return temp_daterange->times; } } } return tperiod->days[test_time_wday]; } /* see if the specified time falls into a valid time range in the given time period */ int check_time_against_period(time_t test_time, timeperiod *tperiod) { timerange *temp_timerange = NULL; timeperiodexclusion *temp_timeperiodexclusion = NULL; struct tm *t, tm_s; time_t midnight = (time_t)0L; time_t day_range_start = (time_t)0L; time_t day_range_end = (time_t)0L; log_debug_info(DEBUGL_FUNCTIONS, 0, "check_time_against_period()\n"); t = localtime_r((time_t *)&test_time, &tm_s); t->tm_sec = 0; t->tm_min = 0; t->tm_hour = 0; midnight = mktime(t); /* if no period was specified, assume the time is good */ if(tperiod == NULL) return OK; for(temp_timeperiodexclusion = tperiod->exclusions; temp_timeperiodexclusion != NULL; temp_timeperiodexclusion = temp_timeperiodexclusion->next) { if(check_time_against_period(test_time, temp_timeperiodexclusion->timeperiod_ptr) == OK) { return ERROR; } } for(temp_timerange = _get_matching_timerange(test_time, tperiod); temp_timerange != NULL; temp_timerange = temp_timerange->next) { day_range_start = (time_t)(midnight + temp_timerange->range_start); day_range_end = (time_t)(midnight + temp_timerange->range_end); if(test_time >= day_range_start && test_time <= day_range_end) return OK; } return ERROR; } /*#define TEST_TIMEPERIODS_B 1*/ void _get_next_valid_time(time_t pref_time, time_t *valid_time, timeperiod *tperiod); static void _get_next_invalid_time(time_t pref_time, time_t *invalid_time, timeperiod *tperiod) { timeperiodexclusion *temp_timeperiodexclusion = NULL; int depth = 0; int max_depth = 300; // commonly roughly equal to "days in the future" struct tm *t, tm_s; time_t earliest_time = pref_time; time_t last_earliest_time = 0; time_t midnight = (time_t)0L; time_t day_range_start = (time_t)0L; time_t day_range_end = (time_t)0L; /* if no period was specified, assume the time is good */ if(tperiod == NULL) { *invalid_time = pref_time; return; } while (earliest_time != last_earliest_time && depth < max_depth) { time_t potential_time = 0; depth++; last_earliest_time = earliest_time; t = localtime_r((time_t *)&earliest_time, &tm_s); t->tm_sec = 0; t->tm_min = 0; t->tm_hour = 0; midnight = mktime(t); timerange *temp_timerange = _get_matching_timerange(earliest_time, tperiod); for(; temp_timerange != NULL; temp_timerange = temp_timerange->next) { /* ranges with start/end of zero mean exclude this day */ if(temp_timerange->range_start == 0 && temp_timerange->range_end == 0) continue; day_range_start = (time_t)(midnight + temp_timerange->range_start); day_range_end = (time_t)(midnight + temp_timerange->range_end); #ifdef TEST_TIMEPERIODS_B printf(" INVALID RANGE START: %lu (%lu) = %s", temp_timerange->range_start, (unsigned long)day_range_start, ctime(&day_range_start)); printf(" INVALID RANGE END: %lu (%lu) = %s", temp_timerange->range_end, (unsigned long)day_range_end, ctime(&day_range_end)); #endif if(day_range_start <= earliest_time && day_range_end > earliest_time) potential_time = day_range_end + 60; else potential_time = earliest_time; if(potential_time > earliest_time) { earliest_time = potential_time; #ifdef TEST_TIMEPERIODS_B printf(" EARLIEST INVALID TIME: %llu = %s", (unsigned long long)earliest_time, ctime(&earliest_time)); #endif } } for(temp_timeperiodexclusion = tperiod->exclusions; temp_timeperiodexclusion != NULL; temp_timeperiodexclusion = temp_timeperiodexclusion->next) { _get_next_valid_time(last_earliest_time, &potential_time, temp_timeperiodexclusion->timeperiod_ptr); if (potential_time + 60 < earliest_time) earliest_time = potential_time + 60; } } #ifdef TEST_TIMEPERIODS_B printf(" FINAL EARLIEST INVALID TIME: %llu = %s", (unsigned long long)earliest_time, ctime(&earliest_time)); #endif if (depth == max_depth) *invalid_time = pref_time; else *invalid_time = earliest_time; } /* Separate this out from public get_next_valid_time for testing */ void _get_next_valid_time(time_t pref_time, time_t *valid_time, timeperiod *tperiod) { timeperiodexclusion *temp_timeperiodexclusion = NULL; int depth = 0; int max_depth = 300; // commonly roughly equal to "days in the future" time_t earliest_time = pref_time; time_t last_earliest_time = 0; struct tm *t, tm_s; time_t midnight = (time_t)0L; time_t day_range_start = (time_t)0L; time_t day_range_end = (time_t)0L; int have_earliest_time = FALSE; /* if no period was specified, assume the time is good */ if(tperiod == NULL) { *valid_time = pref_time; return; } while (earliest_time != last_earliest_time && depth < max_depth) { time_t potential_time = 0; have_earliest_time = FALSE; depth++; last_earliest_time = earliest_time; t = localtime_r((time_t *)&earliest_time, &tm_s); t->tm_sec = 0; t->tm_min = 0; t->tm_hour = 0; midnight = mktime(t); timerange *temp_timerange = _get_matching_timerange(earliest_time, tperiod); #ifdef TEST_TIMEPERIODS_B printf(" RANGE START: %lu\n", temp_timerange ? temp_timerange->range_start : 0); printf(" RANGE END: %lu\n", temp_timerange ? temp_timerange->range_end : 0); #endif for(; temp_timerange != NULL; temp_timerange = temp_timerange->next) { /* ranges with start/end of zero mean exclude this day */ if(temp_timerange->range_start == 0 && temp_timerange->range_end == 0) continue; day_range_start = (time_t)(midnight + temp_timerange->range_start); day_range_end = (time_t)(midnight + temp_timerange->range_end); #ifdef TEST_TIMEPERIODS_B printf(" RANGE START: %lu (%lu) = %s", temp_timerange->range_start, (unsigned long)day_range_start, ctime(&day_range_start)); printf(" RANGE END: %lu (%lu) = %s", temp_timerange->range_end, (unsigned long)day_range_end, ctime(&day_range_end)); #endif /* range is out of bounds */ if(day_range_end < last_earliest_time) continue; /* preferred time occurs before range start, so use range start time as earliest potential time */ if(day_range_start >= last_earliest_time) potential_time = day_range_start; /* preferred time occurs between range start/end, so use preferred time as earliest potential time */ else if(day_range_end >= last_earliest_time) potential_time = last_earliest_time; /* is this the earliest time found thus far? */ if(have_earliest_time == FALSE || potential_time < earliest_time) { earliest_time = potential_time; #ifdef TEST_TIMEPERIODS_B printf(" EARLIEST TIME: %llu = %s", (unsigned long long)earliest_time, ctime(&earliest_time)); #endif } have_earliest_time = TRUE; } if (have_earliest_time == FALSE) { earliest_time = midnight + 86400; } else { for(temp_timeperiodexclusion = tperiod->exclusions; temp_timeperiodexclusion != NULL; temp_timeperiodexclusion = temp_timeperiodexclusion->next) { _get_next_invalid_time(earliest_time, &earliest_time, temp_timeperiodexclusion->timeperiod_ptr); #ifdef TEST_TIMEPERIODS_B printf(" FINAL EARLIEST TIME: %llu = %s", (unsigned long long)earliest_time, ctime(&earliest_time)); #endif } } } if (depth == max_depth) *valid_time = pref_time; else *valid_time = earliest_time; } /* given a preferred time, get the next valid time within a time period */ void get_next_valid_time(time_t pref_time, time_t *valid_time, timeperiod *tperiod) { time_t current_time = (time_t)0L; log_debug_info(DEBUGL_FUNCTIONS, 0, "get_next_valid_time()\n"); /* get time right now, preferred time must be now or in the future */ time(¤t_time); pref_time = (pref_time < current_time) ? current_time : pref_time; _get_next_valid_time(pref_time, valid_time, tperiod); } /* tests if a date range covers just a single day */ int is_daterange_single_day(daterange *dr) { if(dr == NULL) return FALSE; if(dr->syear != dr->eyear) return FALSE; if(dr->smon != dr->emon) return FALSE; if(dr->smday != dr->emday) return FALSE; if(dr->swday != dr->ewday) return FALSE; if(dr->swday_offset != dr->ewday_offset) return FALSE; return TRUE; } /* returns a time (midnight) of particular (3rd, last) day in a given month */ time_t calculate_time_from_day_of_month(int year, int month, int monthday) { time_t midnight; int day = 0; struct tm t; #ifdef TEST_TIMEPERIODS printf("YEAR: %d, MON: %d, MDAY: %d\n", year, month, monthday); #endif /* positive day (3rd day) */ if(monthday > 0) { t.tm_sec = 0; t.tm_min = 0; t.tm_hour = 0; t.tm_year = year; t.tm_mon = month; t.tm_mday = monthday; t.tm_isdst = -1; midnight = mktime(&t); #ifdef TEST_TIMEPERIODS printf("MIDNIGHT CALC: %s", ctime(&midnight)); #endif /* if we rolled over to the next month, time is invalid */ /* assume the user's intention is to keep it in the current month */ if(t.tm_mon != month) midnight = (time_t)0L; } /* negative offset (last day, 3rd to last day) */ else { /* find last day in the month */ day = 32; do { /* back up a day */ day--; /* make the new time */ t.tm_mon = month; t.tm_year = year; t.tm_mday = day; t.tm_isdst = -1; midnight = mktime(&t); } while(t.tm_mon != month); /* now that we know the last day, back up more */ /* make the new time */ t.tm_mon = month; t.tm_year = year; /* -1 means last day of month, so add one to to make this correct - Mike Bird */ t.tm_mday += (monthday < -30) ? -30 : monthday + 1; t.tm_isdst = -1; midnight = mktime(&t); /* if we rolled over to the previous month, time is invalid */ /* assume the user's intention is to keep it in the current month */ if(t.tm_mon != month) midnight = (time_t)0L; } return midnight; } /* returns a time (midnight) of particular (3rd, last) weekday in a given month */ time_t calculate_time_from_weekday_of_month(int year, int month, int weekday, int weekday_offset) { time_t midnight; int days = 0; int weeks = 0; struct tm t; t.tm_sec = 0; t.tm_min = 0; t.tm_hour = 0; t.tm_year = year; t.tm_mon = month; t.tm_mday = 1; t.tm_isdst = -1; midnight = mktime(&t); /* how many days must we advance to reach the first instance of the weekday this month? */ days = weekday - (t.tm_wday); if(days < 0) days += 7; /* positive offset (3rd thursday) */ if(weekday_offset > 0) { /* how many weeks must we advance (no more than 5 possible) */ weeks = (weekday_offset > 5) ? 5 : weekday_offset; days += ((weeks - 1) * 7); /* make the new time */ t.tm_mon = month; t.tm_year = year; t.tm_mday = days + 1; t.tm_isdst = -1; midnight = mktime(&t); /* if we rolled over to the next month, time is invalid */ /* assume the user's intention is to keep it in the current month */ if(t.tm_mon != month) midnight = (time_t)0L; } /* negative offset (last thursday, 3rd to last tuesday) */ else { /* find last instance of weekday in the month */ days += (5 * 7); do { /* back up a week */ days -= 7; /* make the new time */ t.tm_mon = month; t.tm_year = year; t.tm_mday = days + 1; t.tm_isdst = -1; midnight = mktime(&t); } while(t.tm_mon != month); /* now that we know the last instance of the weekday, back up more */ weeks = (weekday_offset < -5) ? -5 : weekday_offset; days = ((weeks + 1) * 7); /* make the new time */ t.tm_mon = month; t.tm_year = year; t.tm_mday += days; t.tm_isdst = -1; midnight = mktime(&t); /* if we rolled over to the previous month, time is invalid */ /* assume the user's intention is to keep it in the current month */ if(t.tm_mon != month) midnight = (time_t)0L; } return midnight; } /* get the next time to schedule a log rotation */ time_t get_next_log_rotation_time(void) { time_t current_time; struct tm *t, tm_s; int is_dst_now = FALSE; time_t run_time; time(¤t_time); t = localtime_r(¤t_time, &tm_s); t->tm_min = 0; t->tm_sec = 0; is_dst_now = (t->tm_isdst > 0) ? TRUE : FALSE; switch(log_rotation_method) { case LOG_ROTATION_HOURLY: t->tm_hour++; run_time = mktime(t); break; case LOG_ROTATION_DAILY: t->tm_mday++; t->tm_hour = 0; run_time = mktime(t); break; case LOG_ROTATION_WEEKLY: t->tm_mday += (7 - t->tm_wday); t->tm_hour = 0; run_time = mktime(t); break; case LOG_ROTATION_MONTHLY: default: t->tm_mon++; t->tm_mday = 1; t->tm_hour = 0; run_time = mktime(t); break; } if(is_dst_now == TRUE && t->tm_isdst == 0) run_time += 3600; else if(is_dst_now == FALSE && t->tm_isdst > 0) run_time -= 3600; return run_time; } /******************************************************************/ /******************** SIGNAL HANDLER FUNCTIONS ********************/ /******************************************************************/ /* trap signals so we can exit gracefully */ void setup_sighandler(void) { #ifdef HAVE_SIGACTION struct sigaction sig_action; #endif /* reset the shutdown flag */ sigshutdown = FALSE; /* remove buffering from stderr, stdin, and stdout */ setbuf(stdin, (char *)NULL); setbuf(stdout, (char *)NULL); setbuf(stderr, (char *)NULL); /* initialize signal handling */ #ifdef HAVE_SIGACTION sig_action.sa_sigaction = NULL; sig_action.sa_handler = SIG_IGN; sigemptyset(&sig_action.sa_mask); sig_action.sa_flags = 0; sigaction(SIGPIPE, &sig_action, NULL); sig_action.sa_handler = sighandler; sigfillset(&sig_action.sa_mask); sig_action.sa_flags = SA_NODEFER|SA_RESTART; sigaction(SIGQUIT, &sig_action, NULL); sigaction(SIGTERM, &sig_action, NULL); sigaction(SIGHUP, &sig_action, NULL); if(daemon_dumps_core == FALSE && daemon_mode == TRUE) sigaction(SIGSEGV, &sig_action, NULL); #else /* HAVE_SIGACTION */ signal(SIGPIPE, SIG_IGN); signal(SIGQUIT, sighandler); signal(SIGTERM, sighandler); signal(SIGHUP, sighandler); if(daemon_dumps_core == FALSE && daemon_mode == TRUE) signal(SIGSEGV, sighandler); #endif /* HAVE_SIGACTION */ return; } /* reset signal handling... */ void reset_sighandler(void) { /* set signal handling to default actions */ #ifdef HAVE_SIGACTION struct sigaction sig_action; sig_action.sa_sigaction = NULL; sig_action.sa_handler = SIG_DFL; sigemptyset(&sig_action.sa_mask); sig_action.sa_flags = 0; sigaction(SIGQUIT, &sig_action, NULL); sigaction(SIGTERM, &sig_action, NULL); sigaction(SIGHUP, &sig_action, NULL); sigaction(SIGSEGV, &sig_action, NULL); sigaction(SIGPIPE, &sig_action, NULL); sigaction(SIGXFSZ, &sig_action, NULL); #else /* HAVE_SIGACTION */ signal(SIGQUIT, SIG_DFL); signal(SIGTERM, SIG_DFL); signal(SIGHUP, SIG_DFL); signal(SIGSEGV, SIG_DFL); signal(SIGPIPE, SIG_DFL); signal(SIGXFSZ, SIG_DFL); #endif /* HAVE_SIGACTION */ return; } /* handle signals */ void sighandler(int sig) { const char *sigs[35] = {"EXIT", "HUP", "INT", "QUIT", "ILL", "TRAP", "ABRT", "BUS", "FPE", "KILL", "USR1", "SEGV", "USR2", "PIPE", "ALRM", "TERM", "STKFLT", "CHLD", "CONT", "STOP", "TSTP", "TTIN", "TTOU", "URG", "XCPU", "XFSZ", "VTALRM", "PROF", "WINCH", "IO", "PWR", "UNUSED", "ZERR", "DEBUG", (char *)NULL}; int x = 0; /* if shutdown is already true, we're in a signal trap loop! */ /* changed 09/07/06 to only exit on segfaults */ if(sigshutdown == TRUE && sig == SIGSEGV) exit(ERROR); caught_signal = TRUE; if(sig < 0) sig = -sig; for(x = 0; sigs[x] != (char *)NULL; x++); sig %= x; sig_id = sig; /* we received a SIGHUP, so restart... */ if(sig == SIGHUP) sigrestart = TRUE; /* else begin shutting down... */ else if(sig < 16) { logit(NSLOG_PROCESS_INFO, TRUE, "Caught SIG%s, shutting down...\n", sigs[sig]); sigshutdown = TRUE; } return; } /* handle timeouts when executing commands via my_system_r() */ void my_system_sighandler(int sig) { /* force the child process to exit... */ _exit(STATE_CRITICAL); } /* Handle the SIGXFSZ signal. A SIGXFSZ signal is received when a file exceeds the maximum allowable size either as dictated by the fzise parameter in /etc/security/limits.conf (ulimit -f) or by the maximum size allowed by the filesystem */ void handle_sigxfsz(int sig) { static time_t lastlog_time = (time_t)0; /* Save the last log time so we don't log too often. */ unsigned long log_interval = 300; /* How frequently to log messages about receiving the signal */ struct rlimit rlim; time_t now; char *files[] = { log_file, debug_file, host_perfdata_file, service_perfdata_file, object_cache_file, object_precache_file, status_file, retention_file, }; int x; char **filep; long long size; long long max_size = 0LL; char *max_name = NULL; if(SIGXFSZ == sig) { /* Make sure we're handling the correct signal */ /* Check the current time and if less time has passed since the last time the signal was received, ignore it */ time(&now); if((unsigned long)(now - lastlog_time) < log_interval) return; /* Get the current file size limit */ if(getrlimit(RLIMIT_FSIZE, &rlim) != 0) { /* Attempt to log the error, realizing that the logging may fail if it is the log file that is over the size limit. */ logit(NSLOG_RUNTIME_ERROR, TRUE, "Unable to determine current resource limits: %s\n", strerror(errno)); } /* Try to figure out which file caused the signal and react appropriately */ for(x = 0, filep = files; x < (sizeof(files) / sizeof(files[0])); x++, filep++) { if((*filep != NULL) && strcmp(*filep, "/dev/null")) { if((size = check_file_size(*filep, 1024, rlim)) == -1) { lastlog_time = now; return; } else if(size > max_size) { max_size = size; max_name = log_file; } } } if((max_size > 0) && (max_name != NULL)) { logit(NSLOG_RUNTIME_ERROR, TRUE, "SIGXFSZ received because a " "file's size may have exceeded the file size limits of " "the filesystem. The largest file checked, '%s', has a " "size of %lld bytes", max_name, max_size); } else { logit(NSLOG_RUNTIME_ERROR, TRUE, "SIGXFSZ received but unable to " "determine which file may have caused it."); } } return; } /* Checks a file to determine whether it exceeds resource limit imposed limits. Returns the file size if file is OK, 0 if it's status could not be determined, or -1 if not OK. fudge is the fudge factor (in bytes) for checking the file size */ static long long check_file_size(char *path, unsigned long fudge, struct rlimit rlim) { struct stat status; /* Make sure we were passed a legitimate file path */ if(NULL == path) { return 0; } /* Get the status of the file */ if(stat(path, &status) == 0) { /* Make sure it is a file */ if(S_ISREG(status.st_mode)) { /* If the file size plus the fudge factor exceeds the current resource limit imposed size limit, log an error */ if(status.st_size + fudge > rlim.rlim_cur) { logit(NSLOG_RUNTIME_ERROR, TRUE, "Size of file '%s' (%llu) " "exceeds (or nearly exceeds) size imposed by resource " "limits (%llu). Consider increasing limits with " "ulimit(1).\n", path, (unsigned long long)status.st_size, (unsigned long long)rlim.rlim_cur); return -1; } else { return status.st_size; } } else { return 0; } } else { /* If we could not determine the file status, log an error message */ logit(NSLOG_RUNTIME_ERROR, TRUE, "Unable to determine status of file %s: %s\n", log_file, strerror(errno)); return 0; } } /******************************************************************/ /************************ DAEMON FUNCTIONS ************************/ /******************************************************************/ int daemon_init(void) { pid_t pid = -1; int pidno = 0; int lockfile = 0; int val = 0; char buf[256]; struct flock lock; char *homedir = NULL; char *cp; #ifdef RLIMIT_CORE struct rlimit limit; #endif /* change working directory. scuttle home if we're dumping core */ if(daemon_dumps_core == TRUE) { homedir = getenv("HOME"); if (homedir && *homedir) chdir(homedir); else if (log_file && *log_file) { homedir = strdup(log_file); cp = strrchr(homedir, '/'); if (cp) *cp = '\0'; else strcpy(homedir, "/"); chdir(homedir); free(homedir); } else chdir("/"); } umask(S_IWGRP | S_IWOTH); /* close existing stdin, stdout, stderr */ close(0); close(1); close(2); /* THIS HAS TO BE DONE TO AVOID PROBLEMS WITH STDERR BEING REDIRECTED TO SERVICE MESSAGE PIPE! */ /* re-open stdin, stdout, stderr with known values */ open("/dev/null", O_RDONLY); open("/dev/null", O_WRONLY); open("/dev/null", O_WRONLY); lockfile = open(lock_file, O_RDWR | O_CREAT, S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH); if(lockfile < 0) { logit(NSLOG_RUNTIME_ERROR, TRUE, "Failed to obtain lock on file %s: %s\n", lock_file, strerror(errno)); logit(NSLOG_PROCESS_INFO | NSLOG_RUNTIME_ERROR, TRUE, "Bailing out due to errors encountered while attempting to daemonize... (PID=%d)", (int)getpid()); cleanup(); exit(ERROR); } /* see if we can read the contents of the lockfile */ if((val = read(lockfile, buf, (size_t)10)) < 0) { logit(NSLOG_RUNTIME_ERROR, TRUE, "Lockfile exists but cannot be read"); cleanup(); exit(ERROR); } /* we read something - check the PID */ if(val > 0) { if((val = sscanf(buf, "%d", &pidno)) < 1) { logit(NSLOG_RUNTIME_ERROR, TRUE, "Lockfile '%s' does not contain a valid PID (%s)", lock_file, buf); cleanup(); exit(ERROR); } } /* check for SIGHUP */ if(val == 1 && (pid = (pid_t)pidno) == getpid()) { close(lockfile); return OK; } /* exit on errors... */ if((pid = fork()) < 0) return(ERROR); /* parent process goes away.. */ else if((int)pid != 0) exit(OK); /* child continues... */ /* child becomes session leader... */ setsid(); /* place a file lock on the lock file */ lock.l_type = F_WRLCK; lock.l_start = 0; lock.l_whence = SEEK_SET; lock.l_len = 0; if(fcntl(lockfile, F_SETLK, &lock) < 0) { if(errno == EACCES || errno == EAGAIN) { fcntl(lockfile, F_GETLK, &lock); logit(NSLOG_RUNTIME_ERROR, TRUE, "Lockfile '%s' looks like its already held by another instance of Nagios (PID %d). Bailing out...", lock_file, (int)lock.l_pid); } else logit(NSLOG_RUNTIME_ERROR, TRUE, "Cannot lock lockfile '%s': %s. Bailing out...", lock_file, strerror(errno)); cleanup(); exit(ERROR); } /* prevent daemon from dumping a core file... */ #ifdef RLIMIT_CORE if(daemon_dumps_core == FALSE) { getrlimit(RLIMIT_CORE, &limit); limit.rlim_cur = 0; setrlimit(RLIMIT_CORE, &limit); } #endif /* write PID to lockfile... */ lseek(lockfile, 0, SEEK_SET); ftruncate(lockfile, 0); sprintf(buf, "%d\n", (int)getpid()); write(lockfile, buf, strlen(buf)); /* make sure lock file stays open while program is executing... */ val = fcntl(lockfile, F_GETFD, 0); val |= FD_CLOEXEC; fcntl(lockfile, F_SETFD, val); #ifdef USE_EVENT_BROKER /* send program data to broker */ broker_program_state(NEBTYPE_PROCESS_DAEMONIZE, NEBFLAG_NONE, NEBATTR_NONE, NULL); #endif return OK; } /******************************************************************/ /*********************** SECURITY FUNCTIONS ***********************/ /******************************************************************/ /* drops privileges */ int drop_privileges(char *user, char *group) { uid_t uid = -1; gid_t gid = -1; struct group *grp = NULL; struct passwd *pw = NULL; int result = OK; #ifdef HAVE_SYS_RESOURCE_H struct rlimit rl; #endif /* only drop privileges if we're running as root, so we don't interfere with being debugged while running as some random user */ if(getuid() != 0) return OK; /* set effective group ID */ if(group != NULL) { /* see if this is a group name */ if(strspn(group, "0123456789") < strlen(group)) { grp = (struct group *)getgrnam(group); if(grp != NULL) gid = (gid_t)(grp->gr_gid); else logit(NSLOG_RUNTIME_WARNING, TRUE, "Warning: Could not get group entry for '%s'", group); } /* else we were passed the GID */ else gid = (gid_t)atoi(group); } /* set effective user ID */ if(user != NULL) { /* see if this is a user name */ if(strspn(user, "0123456789") < strlen(user)) { pw = (struct passwd *)getpwnam(user); if(pw != NULL) uid = (uid_t)(pw->pw_uid); else logit(NSLOG_RUNTIME_WARNING, TRUE, "Warning: Could not get passwd entry for '%s'", user); } /* else we were passed the UID */ else uid = (uid_t)atoi(user); } /* now that we know what to change to, we fix log file permissions */ fix_log_file_owner(uid, gid); /* set effective group ID if other than current EGID */ if(gid != getegid()) { if(setgid(gid) == -1) { logit(NSLOG_RUNTIME_WARNING, TRUE, "Warning: Could not set effective GID=%d", (int)gid); result = ERROR; } } #ifdef HAVE_INITGROUPS if(uid != geteuid()) { /* initialize supplementary groups */ if(initgroups(user, gid) == -1) { if(errno == EPERM) logit(NSLOG_RUNTIME_WARNING, TRUE, "Warning: Unable to change supplementary groups using initgroups() -- I hope you know what you're doing"); else { logit(NSLOG_RUNTIME_WARNING, TRUE, "Warning: Possibly root user failed dropping privileges with initgroups()"); return ERROR; } } } #endif #ifdef HAVE_SYS_RESOURCE_H if (result == OK && daemon_dumps_core == TRUE) { rl.rlim_cur = RLIM_INFINITY; rl.rlim_max = RLIM_INFINITY; setrlimit(RLIMIT_CORE, &rl); } #endif if(setuid(uid) == -1) { logit(NSLOG_RUNTIME_WARNING, TRUE, "Warning: Could not set effective UID=%d", (int)uid); result = ERROR; } #ifdef HAVE_SYS_PRCTL_H if (result == OK && daemon_dumps_core == TRUE) { if (prctl(PR_SET_DUMPABLE, 1)) logit(NSLOG_RUNTIME_WARNING, TRUE, "Warning: Call to prctl(PR_SET_DUMPABLE, 1) failed with error %d", errno); } #endif return result; } /******************************************************************/ /************************* IPC FUNCTIONS **************************/ /******************************************************************/ /* processes files in the check result queue directory */ int process_check_result_queue(char *dirname) { char file[MAX_FILENAME_LENGTH]; DIR *dirp = NULL; struct dirent *dirfile = NULL; register int x = 0; struct stat stat_buf; struct stat ok_stat_buf; char *temp_buffer = NULL; int result = OK, check_result_files = 0; time_t start; /* make sure we have what we need */ if(dirname == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: No check result queue directory specified.\n"); return ERROR; } /* open the directory for reading */ if((dirp = opendir(dirname)) == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not open check result queue directory '%s' for reading.\n", dirname); return ERROR; } log_debug_info(DEBUGL_CHECKS, 1, "Starting to read check result queue '%s'...\n", dirname); start = time(NULL); /* process all files in the directory... */ while((dirfile = readdir(dirp)) != NULL) { /* bail out if we encountered a signal */ if (sigshutdown == TRUE || sigrestart == TRUE) { log_debug_info(DEBUGL_CHECKS, 0, "Breaking out of check result reaper: signal encountered\n"); break; } /* break out if we've been here too long */ if (start + max_check_reaper_time < time(NULL)) { log_debug_info(DEBUGL_CHECKS, 0, "Breaking out of check result reaper: max time (%ds) exceeded\n", max_check_reaper_time); break; } /* create /path/to/file */ snprintf(file, sizeof(file), "%s/%s", dirname, dirfile->d_name); file[sizeof(file) - 1] = '\x0'; /* process this if it's a check result file... */ x = strlen(dirfile->d_name); if(x == 7 && dirfile->d_name[0] == 'c') { if(stat(file, &stat_buf) == -1) { logit(NSLOG_RUNTIME_WARNING, TRUE, "Warning: Could not stat() check result file '%s'.\n", file); continue; } /* we only care about real files */ if (!S_ISREG(stat_buf.st_mode)) continue; /* at this point we have a regular file... */ /* if the file is too old, we delete it */ if (stat_buf.st_mtime + max_check_result_file_age < time(NULL)) { if (delete_check_result_file(file) != OK && delete_check_result_file(dirfile->d_name) != OK) logit(NSLOG_RUNTIME_WARNING, TRUE, "Error: Unable to delete '%s' or '%s'!", file, dirfile->d_name); continue; } /* can we find the associated ok-to-go file ? */ asprintf(&temp_buffer, "%s.ok", file); result = stat(temp_buffer, &ok_stat_buf); my_free(temp_buffer); if(result == -1) continue; /* process the file */ result = process_check_result_file(file); /* break out if we encountered an error */ if(result == ERROR) break; check_result_files++; } } closedir(dirp); return check_result_files; } int process_check_result(check_result *cr) { const char *source_name; if (!cr) return ERROR; source_name = check_result_source(cr); if (cr->object_check_type == SERVICE_CHECK) { service *svc; svc = find_service(cr->host_name, cr->service_description); if (!svc) { logit(NSLOG_RUNTIME_ERROR, TRUE, "Error: Got check result for service '%s' on host '%s'. Unable to find service\n", cr->service_description, cr->host_name); return ERROR; } log_debug_info(DEBUGL_CHECKS, 2, "Processing check result for service '%s' on host '%s'\n", svc->description, svc->host_name); svc->check_source = source_name; return handle_async_service_check_result(svc, cr); } if (cr->object_check_type == HOST_CHECK) { host *hst; hst = find_host(cr->host_name); if (!hst) { logit(NSLOG_RUNTIME_ERROR, TRUE, "Error: Got host checkresult for '%s', but no such host can be found\n", cr->host_name); return ERROR; } log_debug_info(DEBUGL_CHECKS, 2, "Processing check result for host '%s'\n", hst->name); hst->check_source = source_name; return handle_async_host_check_result(hst, cr); } /* We should never end up here */ logit(NSLOG_RUNTIME_ERROR, TRUE, "Error: Unknown object check type for checkresult: %d; (host_name: %s; service_description: %s)\n", cr->object_check_type, cr->host_name ? cr->host_name : "(null)", cr->service_description ? cr->service_description : "(null)"); return ERROR; } /* Unescapes newlines in a string. Declared here for now as it's not used * elsewhere. */ /* static char *unescape_check_result_file_output(char*); */ /* reads check result(s) from a file */ int process_check_result_file(char *fname) { mmapfile *thefile = NULL; char *input = NULL; char *var = NULL; char *val = NULL; char *v1 = NULL, *v2 = NULL; time_t current_time; check_result cr; if(fname == NULL) return ERROR; init_check_result(&cr); cr.engine = &nagios_spool_check_engine; time(¤t_time); log_debug_info(DEBUGL_CHECKS, 1, "Processing check result file: '%s'\n", fname); /* open the file for reading */ if((thefile = mmap_fopen(fname)) == NULL) { /* try removing the file - zero length files can't be mmap()'ed, so it might exist */ log_debug_info(DEBUGL_CHECKS, 1, "Failed to open check result file for reading: '%s'\n", fname); delete_check_result_file(fname); return ERROR; } /* read in all lines from the file */ while(1) { /* free memory */ my_free(input); /* read the next line */ if((input = mmap_fgets_multiline(thefile)) == NULL) break; /* skip comments */ if(input[0] == '#') continue; /* empty line indicates end of record */ else if(input[0] == '\n') { /* do we have the minimum amount of data? */ if(cr.host_name != NULL && cr.output != NULL) { /* process the check result */ process_check_result(&cr); } /* cleanse for next check result */ free_check_result(&cr); init_check_result(&cr); cr.output_file = fname; } if((var = my_strtok(input, "=")) == NULL) continue; if((val = my_strtok(NULL, "\n")) == NULL) continue; /* found the file time */ if(!strcmp(var, "file_time")) { /* file is too old - ignore check results it contains and delete it */ /* this will only work as intended if file_time comes before check results */ if(max_check_result_file_age > 0 && (current_time - (strtoul(val, NULL, 0)) > max_check_result_file_age)) { break; } } /* else we have check result data */ else { if(!strcmp(var, "host_name")) cr.host_name = (char *)strdup(val); else if(!strcmp(var, "service_description")) { cr.service_description = (char *)strdup(val); cr.object_check_type = SERVICE_CHECK; } else if(!strcmp(var, "check_type")) cr.check_type = atoi(val); else if(!strcmp(var, "check_options")) cr.check_options = atoi(val); else if(!strcmp(var, "scheduled_check")) cr.scheduled_check = atoi(val); else if(!strcmp(var, "reschedule_check")) cr.reschedule_check = atoi(val); else if(!strcmp(var, "latency")) cr.latency = strtod(val, NULL); else if(!strcmp(var, "start_time")) { if((v1 = strtok(val, ".")) == NULL) continue; if((v2 = strtok(NULL, "\n")) == NULL) continue; cr.start_time.tv_sec = strtoul(v1, NULL, 0); cr.start_time.tv_usec = strtoul(v2, NULL, 0); } else if(!strcmp(var, "finish_time")) { if((v1 = strtok(val, ".")) == NULL) continue; if((v2 = strtok(NULL, "\n")) == NULL) continue; cr.finish_time.tv_sec = strtoul(v1, NULL, 0); cr.finish_time.tv_usec = strtoul(v2, NULL, 0); } else if(!strcmp(var, "early_timeout")) cr.early_timeout = atoi(val); else if(!strcmp(var, "exited_ok")) cr.exited_ok = atoi(val); else if(!strcmp(var, "return_code")) cr.return_code = atoi(val); else if(!strcmp(var, "output")) /* Interpolate "\\\\" and "\\n" escape sequences to the literal * characters they represent. This converts from the single line * format used to store the output in a checkresult file, to the * newline delimited format we use internally. By converting as * soon as possible after reading from the file we don't have * to worry about two different representations later. */ cr.output = unescape_check_result_output(val); } } /* do we have the minimum amount of data? */ if(cr.host_name != NULL && cr.output != NULL) { /* process check result */ process_check_result(&cr); } else { /* log a debug message */ log_debug_info(DEBUGL_CHECKS, 1, "Minimum amount of data not present; Skipped check result file: '%s'\n", fname); } free_check_result(&cr); /* free memory and close file */ my_free(input); mmap_fclose(thefile); /* delete the file (as well its ok-to-go file) */ delete_check_result_file(fname); return OK; } /* deletes as check result file, as well as its ok-to-go file */ int delete_check_result_file(char *fname) { char *temp_buffer = NULL; int result = OK; /* delete the result file */ result = unlink(fname); /* delete the ok-to-go file */ asprintf(&temp_buffer, "%s.ok", fname); result |= unlink(temp_buffer); my_free(temp_buffer); return result; } /* initializes a host/service check result */ int init_check_result(check_result *info) { if(info == NULL) return ERROR; /* reset vars */ info->object_check_type = HOST_CHECK; info->host_name = NULL; info->service_description = NULL; info->check_type = CHECK_TYPE_ACTIVE; info->check_options = CHECK_OPTION_NONE; info->scheduled_check = FALSE; info->reschedule_check = FALSE; info->output_file_fp = NULL; info->latency = 0.0; info->start_time.tv_sec = 0; info->start_time.tv_usec = 0; info->finish_time.tv_sec = 0; info->finish_time.tv_usec = 0; info->early_timeout = FALSE; info->exited_ok = TRUE; info->return_code = 0; info->output = NULL; info->source = NULL; info->engine = NULL; return OK; } /* frees memory associated with a host/service check result */ int free_check_result(check_result *info) { if(info == NULL) return OK; my_free(info->host_name); my_free(info->service_description); my_free(info->output); return OK; } /******************************************************************/ /************************ STRING FUNCTIONS ************************/ /******************************************************************/ /* gets the next string from a buffer in memory - strings are terminated by newlines, which are removed */ char *get_next_string_from_buf(char *buf, int *start_index, int bufsize) { char *sptr = NULL; const char *nl = "\n"; int x; if(buf == NULL || start_index == NULL) return NULL; if(bufsize < 0) return NULL; if(*start_index >= (bufsize - 1)) return NULL; sptr = buf + *start_index; /* end of buffer */ if(sptr[0] == '\x0') return NULL; x = strcspn(sptr, nl); sptr[x] = '\x0'; *start_index += x + 1; return sptr; } /* determines whether or not an object name (host, service, etc) contains illegal characters */ int contains_illegal_object_chars(char *name) { register int x = 0; register int y = 0; if(name == NULL || illegal_object_chars == NULL) return FALSE; x = (int)strlen(name) - 1; for(; x >= 0; x--) { /* illegal user-specified characters */ if(illegal_object_chars != NULL) for(y = 0; illegal_object_chars[y]; y++) if(name[x] == illegal_object_chars[y]) return TRUE; } return FALSE; } /* Escapes newlines in a string. */ char *escape_newlines(char *rawbuf) { char *newbuf = NULL; int x; int y; if (rawbuf == NULL) return NULL; /* Count the escapes we need to make. */ for (x = 0, y = 0; rawbuf[x]; x++) { if (rawbuf[x] == '\\' || rawbuf[x] == '\n') y++; } /* Just duplicate the string if we have nothing to escape. */ if (y == 0) return strdup(rawbuf); /* Allocate memory for the new string with escapes. */ if ((newbuf = malloc(x + y + 1)) == NULL) return NULL; for (x = 0, y = 0; rawbuf[x]; x++) { /* Escape backslashes. */ if (rawbuf[x] == '\\') { newbuf[y++] = '\\'; newbuf[y++] = '\\'; } /* Escape newlines. */ else if (rawbuf[x] == '\n') { newbuf[y++] = '\\'; newbuf[y++] = 'n'; } else newbuf[y++] = rawbuf[x]; } newbuf[y] = '\0'; return newbuf; } /* Unescapes newlines (and backslashes) in a string. */ char *unescape_check_result_output(const char *rawbuf) { char *newbuf = NULL; int x; int y; if (rawbuf == NULL) return NULL; /* Count the replacements we need to make. */ for (x = 0, y = 0; rawbuf[x]; x++) { if (rawbuf[x] == '\\' && (rawbuf[x + 1] == '\\' || rawbuf[x + 1] == 'n')) x++, y++; /* Consume one more char for each replacement. */ } /* Just duplicate the string if we have nothing to replace. */ if (y == 0) return strdup(rawbuf); /* Allocate memory for the new string, with our escape sequences replaced. */ if ((newbuf = malloc(x - y + 1)) == NULL) return NULL; for (x = 0, y = 0; rawbuf[x]; x++) { /* Unescape backslashes. */ if (rawbuf[x] == '\\' && rawbuf[x + 1] == '\\') { x++; newbuf[y++] = '\\'; } /* Unescape newlines. */ else if (rawbuf[x] == '\\' && rawbuf[x + 1] == 'n') { x++; newbuf[y++] = '\n'; } else newbuf[y++] = rawbuf[x]; } newbuf[y] = '\0'; return newbuf; } /* compares strings */ int compare_strings(char *val1a, char *val2a) { /* use the compare_hashdata() function */ return compare_hashdata(val1a, NULL, val2a, NULL); } /******************************************************************/ /************************* FILE FUNCTIONS *************************/ /******************************************************************/ /* renames a file - works across filesystems (Mike Wiacek) */ int my_rename(char *source, char *dest) { int rename_result = 0; /* make sure we have something */ if(source == NULL || dest == NULL) return -1; /* first see if we can rename file with standard function */ rename_result = rename(source, dest); /* handle any errors... */ if(rename_result == -1) { /* an error occurred because the source and dest files are on different filesystems */ if(errno == EXDEV) { /* try copying the file */ if(my_fcopy(source, dest) == ERROR) { logit(NSLOG_RUNTIME_ERROR, TRUE, "Error: Unable to rename file '%s' to '%s': %s\n", source, dest, strerror(errno)); return -1; } /* delete the original file */ unlink(source); /* reset result since we successfully copied file */ rename_result = 0; } /* some other error occurred */ else { logit(NSLOG_RUNTIME_ERROR, TRUE, "Error: Unable to rename file '%s' to '%s': %s\n", source, dest, strerror(errno)); return rename_result; } } return rename_result; } /* * copy a file from the path at source to the already opened * destination file dest. * This is handy when creating tempfiles with mkstemp() */ int my_fdcopy(char *source, char *dest, int dest_fd) { int source_fd, rd_result = 0, wr_result = 0; int tot_written = 0, tot_read = 0, buf_size = 0; struct stat st; char *buf; /* open source file for reading */ if((source_fd = open(source, O_RDONLY, 0644)) < 0) { logit(NSLOG_RUNTIME_ERROR, TRUE, "Error: Unable to open file '%s' for reading: %s\n", source, strerror(errno)); return ERROR; } /* * find out how large the source-file is so we can be sure * we've written all of it */ if(fstat(source_fd, &st) < 0) { logit(NSLOG_RUNTIME_ERROR, TRUE, "Error: Unable to stat source file '%s' for my_fcopy(): %s\n", source, strerror(errno)); close(source_fd); return ERROR; } /* * If the file is huge, read it and write it in chunks. * This value (128K) is the result of "pick-one-at-random" * with some minimal testing and may not be optimal for all * hardware setups, but it should work ok for most. It's * faster than 1K buffers and 1M buffers, so change at your * own peril. Note that it's useful to make it fit in the L2 * cache, so larger isn't necessarily better. */ buf_size = st.st_size > 128 << 10 ? 128 << 10 : st.st_size; buf = malloc(buf_size); if(!buf) { logit(NSLOG_RUNTIME_ERROR, TRUE, "Error: Unable to malloc(%d) bytes: %s\n", buf_size, strerror(errno)); close(source_fd); return ERROR; } /* most of the times, this loop will be gone through once */ while(tot_written < st.st_size) { int loop_wr = 0; rd_result = read(source_fd, buf, buf_size); if(rd_result < 0) { if(errno == EAGAIN || errno == EINTR) continue; logit(NSLOG_RUNTIME_ERROR, TRUE, "Error: my_fcopy() failed to read from '%s': %s\n", source, strerror(errno)); break; } tot_read += rd_result; while(loop_wr < rd_result) { wr_result = write(dest_fd, buf + loop_wr, rd_result - loop_wr); if(wr_result < 0) { if(errno == EAGAIN || errno == EINTR) continue; logit(NSLOG_RUNTIME_ERROR, TRUE, "Error: my_fcopy() failed to write to '%s': %s\n", dest, strerror(errno)); break; } loop_wr += wr_result; } if(wr_result < 0) break; tot_written += loop_wr; } /* * clean up irregardless of how things went. dest_fd comes from * our caller, so we mustn't close it. */ close(source_fd); free(buf); if(rd_result < 0 || wr_result < 0) { /* don't leave half-written files around */ unlink(dest); return ERROR; } return OK; } /* copies a file */ int my_fcopy(char *source, char *dest) { int dest_fd, result; /* make sure we have something */ if(source == NULL || dest == NULL) return ERROR; /* unlink destination file first (not doing so can cause problems on network file systems like CIFS) */ unlink(dest); /* open destination file for writing */ if((dest_fd = open(dest, O_WRONLY | O_TRUNC | O_CREAT | O_APPEND, 0644)) < 0) { logit(NSLOG_RUNTIME_ERROR, TRUE, "Error: Unable to open file '%s' for writing: %s\n", dest, strerror(errno)); return ERROR; } result = my_fdcopy(source, dest, dest_fd); close(dest_fd); return result; } /******************************************************************/ /******************** DYNAMIC BUFFER FUNCTIONS ********************/ /******************************************************************/ /* initializes a dynamic buffer */ int dbuf_init(dbuf *db, int chunk_size) { if(db == NULL) return ERROR; db->buf = NULL; db->used_size = 0L; db->allocated_size = 0L; db->chunk_size = chunk_size; return OK; } /* frees a dynamic buffer */ int dbuf_free(dbuf *db) { if(db == NULL) return ERROR; if(db->buf != NULL) my_free(db->buf); db->buf = NULL; db->used_size = 0L; db->allocated_size = 0L; return OK; } /* dynamically expands a string */ int dbuf_strcat(dbuf *db, const char *buf) { char *newbuf = NULL; unsigned long buflen = 0L; unsigned long new_size = 0L; unsigned long memory_needed = 0L; if(db == NULL || buf == NULL) return ERROR; /* how much memory should we allocate (if any)? */ buflen = strlen(buf); new_size = db->used_size + buflen + 1; /* we need more memory */ if(db->allocated_size < new_size) { memory_needed = ((ceil(new_size / db->chunk_size) + 1) * db->chunk_size); /* allocate memory to store old and new string */ if((newbuf = (char *)realloc((void *)db->buf, (size_t)memory_needed)) == NULL) return ERROR; /* update buffer pointer */ db->buf = newbuf; /* update allocated size */ db->allocated_size = memory_needed; /* terminate buffer */ db->buf[db->used_size] = '\x0'; } /* append the new string */ strcat(db->buf, buf); /* update size allocated */ db->used_size += buflen; return OK; } /******************************************************************/ /********************** CHECK STATS FUNCTIONS *********************/ /******************************************************************/ /* initialize check statistics data structures */ int init_check_stats(void) { int x = 0; int y = 0; for(x = 0; x < MAX_CHECK_STATS_TYPES; x++) { check_statistics[x].current_bucket = 0; for(y = 0; y < CHECK_STATS_BUCKETS; y++) check_statistics[x].bucket[y] = 0; check_statistics[x].overflow_bucket = 0; for(y = 0; y < 3; y++) check_statistics[x].minute_stats[y] = 0; check_statistics[x].last_update = (time_t)0L; } return OK; } /* records stats for a given type of check */ int update_check_stats(int check_type, time_t check_time) { time_t current_time; unsigned long minutes = 0L; int new_current_bucket = 0; int this_bucket = 0; int x = 0; if(check_type < 0 || check_type >= MAX_CHECK_STATS_TYPES) return ERROR; time(¤t_time); if((unsigned long)check_time == 0L) { #ifdef DEBUG_CHECK_STATS printf("TYPE[%d] CHECK TIME==0!\n", check_type); #endif check_time = current_time; } /* do some sanity checks on the age of the stats data before we start... */ /* get the new current bucket number */ minutes = ((unsigned long)check_time - (unsigned long)program_start) / 60; new_current_bucket = minutes % CHECK_STATS_BUCKETS; /* its been more than 15 minutes since stats were updated, so clear the stats */ if((((unsigned long)current_time - (unsigned long)check_statistics[check_type].last_update) / 60) > CHECK_STATS_BUCKETS) { for(x = 0; x < CHECK_STATS_BUCKETS; x++) check_statistics[check_type].bucket[x] = 0; check_statistics[check_type].overflow_bucket = 0; #ifdef DEBUG_CHECK_STATS printf("CLEARING ALL: TYPE[%d], CURRENT=%llu, LASTUPDATE=%llu\n", check_type, (unsigned long long)current_time, (unsigned long long)check_statistics[check_type].last_update); #endif } /* different current bucket number than last time */ else if(new_current_bucket != check_statistics[check_type].current_bucket) { /* clear stats in buckets between last current bucket and new current bucket - stats haven't been updated in a while */ for(x = check_statistics[check_type].current_bucket; x < (CHECK_STATS_BUCKETS * 2); x++) { this_bucket = (x + CHECK_STATS_BUCKETS + 1) % CHECK_STATS_BUCKETS; if(this_bucket == new_current_bucket) break; #ifdef DEBUG_CHECK_STATS printf("CLEARING BUCKET %d, (NEW=%d, OLD=%d)\n", this_bucket, new_current_bucket, check_statistics[check_type].current_bucket); #endif /* clear old bucket value */ check_statistics[check_type].bucket[this_bucket] = 0; } /* update the current bucket number, push old value to overflow bucket */ check_statistics[check_type].overflow_bucket = check_statistics[check_type].bucket[new_current_bucket]; check_statistics[check_type].current_bucket = new_current_bucket; check_statistics[check_type].bucket[new_current_bucket] = 0; } #ifdef DEBUG_CHECK_STATS else printf("NO CLEARING NEEDED\n"); #endif /* increment the value of the current bucket */ check_statistics[check_type].bucket[new_current_bucket]++; #ifdef DEBUG_CHECK_STATS printf("TYPE[%d].BUCKET[%d]=%d\n", check_type, new_current_bucket, check_statistics[check_type].bucket[new_current_bucket]); printf(" "); for(x = 0; x < CHECK_STATS_BUCKETS; x++) printf("[%d] ", check_statistics[check_type].bucket[x]); printf(" (%d)\n", check_statistics[check_type].overflow_bucket); #endif /* record last update time */ check_statistics[check_type].last_update = current_time; return OK; } /* generate 1/5/15 minute stats for a given type of check */ int generate_check_stats(void) { time_t current_time; int x = 0; int new_current_bucket = 0; int this_bucket = 0; int last_bucket = 0; int this_bucket_value = 0; int last_bucket_value = 0; int bucket_value = 0; int seconds = 0; int minutes = 0; int check_type = 0; float this_bucket_weight = 0.0; float last_bucket_weight = 0.0; time(¤t_time); /* do some sanity checks on the age of the stats data before we start... */ /* get the new current bucket number */ minutes = ((unsigned long)current_time - (unsigned long)program_start) / 60; new_current_bucket = minutes % CHECK_STATS_BUCKETS; for(check_type = 0; check_type < MAX_CHECK_STATS_TYPES; check_type++) { /* its been more than 15 minutes since stats were updated, so clear the stats */ if((((unsigned long)current_time - (unsigned long)check_statistics[check_type].last_update) / 60) > CHECK_STATS_BUCKETS) { for(x = 0; x < CHECK_STATS_BUCKETS; x++) check_statistics[check_type].bucket[x] = 0; check_statistics[check_type].overflow_bucket = 0; #ifdef DEBUG_CHECK_STATS printf("GEN CLEARING ALL: TYPE[%d], CURRENT=%llu, LASTUPDATE=%llu\n", check_type, (unsigned long long)current_time, (unsigned long long)check_statistics[check_type].last_update); #endif } /* different current bucket number than last time */ else if(new_current_bucket != check_statistics[check_type].current_bucket) { /* clear stats in buckets between last current bucket and new current bucket - stats haven't been updated in a while */ for(x = check_statistics[check_type].current_bucket; x < (CHECK_STATS_BUCKETS * 2); x++) { this_bucket = (x + CHECK_STATS_BUCKETS + 1) % CHECK_STATS_BUCKETS; if(this_bucket == new_current_bucket) break; #ifdef DEBUG_CHECK_STATS printf("GEN CLEARING BUCKET %d, (NEW=%d, OLD=%d), CURRENT=%llu, LASTUPDATE=%llu\n", this_bucket, new_current_bucket, check_statistics[check_type].current_bucket, (unsigned long long)current_time, (unsigned long long)check_statistics[check_type].last_update); #endif /* clear old bucket value */ check_statistics[check_type].bucket[this_bucket] = 0; } /* update the current bucket number, push old value to overflow bucket */ check_statistics[check_type].overflow_bucket = check_statistics[check_type].bucket[new_current_bucket]; check_statistics[check_type].current_bucket = new_current_bucket; check_statistics[check_type].bucket[new_current_bucket] = 0; } #ifdef DEBUG_CHECK_STATS else printf("GEN NO CLEARING NEEDED: TYPE[%d], CURRENT=%llu, LASTUPDATE=%llu\n", check_type, (unsigned long long)current_time, (unsigned long long)check_statistics[check_type].last_update); #endif /* update last check time */ check_statistics[check_type].last_update = current_time; } /* determine weights to use for this/last buckets */ seconds = ((unsigned long)current_time - (unsigned long)program_start) % 60; this_bucket_weight = (seconds / 60.0); last_bucket_weight = ((60 - seconds) / 60.0); /* update statistics for all check types */ for(check_type = 0; check_type < MAX_CHECK_STATS_TYPES; check_type++) { /* clear the old statistics */ for(x = 0; x < 3; x++) check_statistics[check_type].minute_stats[x] = 0; /* loop through each bucket */ for(x = 0; x < CHECK_STATS_BUCKETS; x++) { /* which buckets should we use for this/last bucket? */ this_bucket = (check_statistics[check_type].current_bucket + CHECK_STATS_BUCKETS - x) % CHECK_STATS_BUCKETS; last_bucket = (this_bucket + CHECK_STATS_BUCKETS - 1) % CHECK_STATS_BUCKETS; /* raw/unweighted value for this bucket */ this_bucket_value = check_statistics[check_type].bucket[this_bucket]; /* raw/unweighted value for last bucket - use overflow bucket if last bucket is current bucket */ if(last_bucket == check_statistics[check_type].current_bucket) last_bucket_value = check_statistics[check_type].overflow_bucket; else last_bucket_value = check_statistics[check_type].bucket[last_bucket]; /* determine value by weighting this/last buckets... */ /* if this is the current bucket, use its full value + weighted % of last bucket */ if(x == 0) { bucket_value = (int)(this_bucket_value + floor(last_bucket_value * last_bucket_weight)); } /* otherwise use weighted % of this and last bucket */ else { bucket_value = (int)(ceil(this_bucket_value * this_bucket_weight) + floor(last_bucket_value * last_bucket_weight)); } /* 1 minute stats */ if(x == 0) check_statistics[check_type].minute_stats[0] = bucket_value; /* 5 minute stats */ if(x < 5) check_statistics[check_type].minute_stats[1] += bucket_value; /* 15 minute stats */ if(x < 15) check_statistics[check_type].minute_stats[2] += bucket_value; #ifdef DEBUG_CHECK_STATS2 printf("X=%d, THIS[%d]=%d, LAST[%d]=%d, 1/5/15=%d,%d,%d L=%d R=%d\n", x, this_bucket, this_bucket_value, last_bucket, last_bucket_value, check_statistics[check_type].minute_stats[0], check_statistics[check_type].minute_stats[1], check_statistics[check_type].minute_stats[2], left_value, right_value); #endif /* record last update time */ check_statistics[check_type].last_update = current_time; } #ifdef DEBUG_CHECK_STATS printf("TYPE[%d] 1/5/15 = %d, %d, %d (seconds=%d, this_weight=%f, last_weight=%f)\n", check_type, check_statistics[check_type].minute_stats[0], check_statistics[check_type].minute_stats[1], check_statistics[check_type].minute_stats[2], seconds, this_bucket_weight, last_bucket_weight); #endif } return OK; } /******************************************************************/ /************************ UPDATE FUNCTIONS ************************/ /******************************************************************/ /* check for new releases of Nagios */ int check_for_nagios_updates(int force, int reschedule) { time_t current_time; int result = OK; int api_result = OK; int do_check = TRUE; time_t next_check = 0L; unsigned int rand_seed = 0; int randnum = 0; time(¤t_time); /* printf("NOW: %s",ctime(¤t_time)); printf("LAST CHECK: %s",ctime(&last_update_check)); */ /* seed the random generator */ rand_seed = (unsigned int)(current_time + nagios_pid); srand(rand_seed); /* generate a (probably) unique ID for this nagios install */ /* the server api currently sees thousands of nagios installs behind single ip addresses, so this help determine if there are really thousands of servers out there, or if some nagios installs are misbehaving */ if(update_uid == 0L) update_uid = current_time; /* update checks are disabled */ if(check_for_updates == FALSE) do_check = FALSE; /* we checked for updates recently, so don't do it again */ if((current_time - last_update_check) < MINIMUM_UPDATE_CHECK_INTERVAL) do_check = FALSE; /* the check is being forced */ if(force == TRUE) do_check = TRUE; /* do a check */ if(do_check == TRUE) { /*printf("RUNNING QUERY...\n");*/ /* query api */ api_result = query_update_api(); } /* should we reschedule the update check? */ if(reschedule == TRUE) { /*printf("RESCHEDULING...\n");*/ randnum = rand(); /* printf("RAND: %d\n",randnum); printf("RANDMAX: %d\n",RAND_MAX); printf("UCIW: %d\n",UPDATE_CHECK_INTERVAL_WOBBLE); printf("MULT: %f\n",(float)randnum/RAND_MAX); */ /* we didn't do an update, so calculate next possible update time */ if(do_check == FALSE) { next_check = last_update_check + BASE_UPDATE_CHECK_INTERVAL; next_check = next_check + (unsigned long)(((float)randnum / RAND_MAX) * UPDATE_CHECK_INTERVAL_WOBBLE); } /* we tried to check for an update */ else { /* api query was okay */ if(api_result == OK) { next_check = current_time + BASE_UPDATE_CHECK_INTERVAL; next_check += (unsigned long)(((float)randnum / RAND_MAX) * UPDATE_CHECK_INTERVAL_WOBBLE); } /* query resulted in an error - retry at a shorter interval */ else { next_check = current_time + BASE_UPDATE_CHECK_RETRY_INTERVAL; next_check += (unsigned long)(((float)randnum / RAND_MAX) * UPDATE_CHECK_RETRY_INTERVAL_WOBBLE); } } /* make sure next check isn't in the past - if it is, schedule a check in 1 minute */ if(next_check < current_time) next_check = current_time + 60; /*printf("NEXT CHECK: %s",ctime(&next_check));*/ /* schedule the next update event */ schedule_new_event(EVENT_CHECK_PROGRAM_UPDATE, TRUE, next_check, FALSE, BASE_UPDATE_CHECK_INTERVAL, NULL, TRUE, NULL, NULL, 0); } return result; } /* checks for updates at api.nagios.org */ int query_update_api(void) { const char *api_server = "api.nagios.org"; const char *api_path = "/versioncheck/"; char *api_query = NULL; char *api_query_opts = NULL; char *buf = NULL; char recv_buf[1024]; int report_install = FALSE; char *ptr = NULL; int current_line = 0; int buf_index = 0; int in_header = TRUE; char *var = NULL; char *val = NULL; int sd = 0; int send_len = 0; int recv_len = 0; int update_check_succeeded = FALSE; /* report a new install, upgrade, or rollback */ /* Nagios monitors the world and we monitor Nagios taking over the world. :-) */ if(last_update_check == (time_t)0L) report_install = TRUE; if(last_program_version == NULL || strcmp(PROGRAM_VERSION, last_program_version)) report_install = TRUE; if(report_install == TRUE) { asprintf(&api_query_opts, "&firstcheck=1"); if(last_program_version != NULL) { char *qopts2 = NULL; asprintf(&qopts2, "%s&last_version=%s", api_query_opts, last_program_version); my_free(api_query_opts); api_query_opts = qopts2; } } /* generate the query */ asprintf(&api_query, "v=1&product=nagios&tinycheck=1&stableonly=1&uid=%lu", update_uid); if(bare_update_check == FALSE) { char *api_query2 = NULL; asprintf(&api_query2, "%s&version=%s%s", api_query, PROGRAM_VERSION, (api_query_opts == NULL) ? "" : api_query_opts); my_free(api_query); api_query = api_query2; } /* generate the HTTP request */ asprintf(&buf, "POST %s HTTP/1.0\r\nUser-Agent: Nagios/%s\r\n" "Connection: close\r\nHost: %s\r\n" "Content-Type: application/x-www-form-urlencoded\r\n" "Content-Length: %lu\r\n\r\n%s", api_path, PROGRAM_VERSION, api_server, (unsigned long) strlen(api_query), api_query); if (buf == NULL) { abort(); } my_tcp_connect(api_server, 80, &sd, 2); if(sd > 0) { /* send request */ send_len = strlen(buf); my_sendall(sd, buf, &send_len, 2); /* get response */ recv_len = sizeof(recv_buf); my_recvall(sd, recv_buf, &recv_len, 2); recv_buf[sizeof(recv_buf) - 1] = '\x0'; /* close connection */ close(sd); /* parse the result */ in_header = TRUE; while((ptr = get_next_string_from_buf(recv_buf, &buf_index, sizeof(recv_buf)))) { strip(ptr); current_line++; if(!strcmp(ptr, "")) { in_header = FALSE; continue; } if(in_header == TRUE) continue; var = strtok(ptr, "="); val = strtok(NULL, "\n"); if(!strcmp(var, "UPDATE_AVAILABLE")) { update_available = atoi(val); /* we were successful */ update_check_succeeded = TRUE; } else if(!strcmp(var, "UPDATE_VERSION")) { if(new_program_version) my_free(new_program_version); new_program_version = strdup(val); } else if(!strcmp(var, "UPDATE_RELEASEDATE")) { } } } /* cleanup */ my_free(buf); my_free(api_query); my_free(api_query_opts); /* we were successful! */ if(update_check_succeeded == TRUE) { time(&last_update_check); if(last_program_version) free(last_program_version); last_program_version = (char *)strdup(PROGRAM_VERSION); } return OK; } /******************************************************************/ /************************* MISC FUNCTIONS *************************/ /******************************************************************/ /* returns Nagios version */ char *get_program_version(void) { return (char *)PROGRAM_VERSION; } /* returns Nagios modification date */ char *get_program_modification_date(void) { return (char *)PROGRAM_MODIFICATION_DATE; } /******************************************************************/ /*********************** CLEANUP FUNCTIONS ************************/ /******************************************************************/ /* do some cleanup before we exit */ void cleanup(void) { #ifdef USE_EVENT_BROKER /* unload modules */ if(test_scheduling == FALSE && verify_config == FALSE) { neb_free_callback_list(); neb_unload_all_modules(NEBMODULE_FORCE_UNLOAD, (sigshutdown == TRUE) ? NEBMODULE_NEB_SHUTDOWN : NEBMODULE_NEB_RESTART); neb_free_module_list(); neb_deinit_modules(); } #endif /* free all allocated memory - including macros */ free_memory(get_global_macros()); close_log_file(); return; } /* free the memory allocated to the linked lists */ void free_memory(nagios_macros *mac) { int i; /* free all allocated memory for the object definitions */ free_object_data(); /* free memory allocated to comments */ free_comment_data(); /* free event queue data */ squeue_destroy(nagios_squeue, SQUEUE_FREE_DATA); nagios_squeue = NULL; /* free memory for global event handlers */ my_free(global_host_event_handler); my_free(global_service_event_handler); /* free any notification list that may have been overlooked */ free_notification_list(); /* free obsessive compulsive commands */ my_free(ocsp_command); my_free(ochp_command); my_free(object_cache_file); my_free(object_precache_file); /* * free memory associated with macros. * It's ok to only free the volatile ones, as the non-volatile * are always free()'d before assignment if they're set. * Doing a full free of them here means we'll wipe the constant * macros when we get a reload or restart request through the * command pipe, or when we receive a SIGHUP. */ clear_volatile_macros_r(mac); free_macrox_names(); /* free illegal char strings */ my_free(illegal_object_chars); my_free(illegal_output_chars); /* free nagios user and group */ my_free(nagios_user); my_free(nagios_group); /* free version strings */ my_free(last_program_version); my_free(new_program_version); /* free file/path variables */ my_free(debug_file); my_free(log_file); mac->x[MACRO_LOGFILE] = NULL; /* assigned from 'log_file' */ my_free(temp_file); mac->x[MACRO_TEMPFILE] = NULL; /* assigned from temp_file */ my_free(temp_path); mac->x[MACRO_TEMPPATH] = NULL; /*assigned from temp_path */ my_free(check_result_path); my_free(command_file); mac->x[MACRO_COMMANDFILE] = NULL; /* assigned from command_file */ my_free(log_archive_path); my_free(website_url); for (i = 0; i < MAX_USER_MACROS; i++) { my_free(macro_user[i]); } /* these have no other reference */ my_free(mac->x[MACRO_ADMINEMAIL]); my_free(mac->x[MACRO_ADMINPAGER]); my_free(mac->x[MACRO_RESOURCEFILE]); my_free(mac->x[MACRO_OBJECTCACHEFILE]); my_free(mac->x[MACRO_MAINCONFIGFILE]); return; } /* free a notification list that was created */ void free_notification_list(void) { notification *temp_notification = NULL; notification *next_notification = NULL; temp_notification = notification_list; while(temp_notification != NULL) { next_notification = temp_notification->next; my_free(temp_notification); temp_notification = next_notification; } /* reset notification list pointer */ notification_list = NULL; return; } /* reset all system-wide variables, so when we've receive a SIGHUP we can restart cleanly */ int reset_variables(void) { /* First free any variables previously set */ my_free(log_file); my_free(temp_file); my_free(temp_path); my_free(check_result_path); my_free(command_file); my_free(lock_file); my_free(log_archive_path); my_free(debug_file); my_free(object_cache_file); my_free(object_precache_file); my_free(nagios_user); my_free(nagios_group); my_free(global_host_event_handler); my_free(global_service_event_handler); my_free(ocsp_command); my_free(ochp_command); my_free(website_url); /* Next re-initialize configuration variables */ init_main_cfg_vars(0); init_shared_cfg_vars(0); /* Finally, set anything not set in the initialization routines */ log_file = (char *)strdup(DEFAULT_LOG_FILE); temp_file = (char *)strdup(DEFAULT_TEMP_FILE); temp_path = (char *)strdup(DEFAULT_TEMP_PATH); check_result_path = (char *)strdup(DEFAULT_CHECK_RESULT_PATH); command_file = (char *)strdup(DEFAULT_COMMAND_FILE); lock_file = (char *)strdup(DEFAULT_LOCK_FILE); /* this is kept across restarts */ log_archive_path = (char *)strdup(DEFAULT_LOG_ARCHIVE_PATH); debug_file = (char *)strdup(DEFAULT_DEBUG_FILE); /* init_main_cfg_vars(0) sets object_precache_file = strdup(DEFAULT_PRECACHED_OBJECT_FILE); */ nagios_user = (char *)strdup(DEFAULT_NAGIOS_USER); nagios_group = (char *)strdup(DEFAULT_NAGIOS_GROUP); logging_options = NSLOG_RUNTIME_ERROR | NSLOG_RUNTIME_WARNING | NSLOG_VERIFICATION_ERROR | NSLOG_VERIFICATION_WARNING | NSLOG_CONFIG_ERROR | NSLOG_CONFIG_WARNING | NSLOG_PROCESS_INFO | NSLOG_HOST_NOTIFICATION | NSLOG_SERVICE_NOTIFICATION | NSLOG_EVENT_HANDLER | NSLOG_EXTERNAL_COMMAND | NSLOG_PASSIVE_CHECK | NSLOG_HOST_UP | NSLOG_HOST_DOWN | NSLOG_HOST_UNREACHABLE | NSLOG_SERVICE_OK | NSLOG_SERVICE_WARNING | NSLOG_SERVICE_UNKNOWN | NSLOG_SERVICE_CRITICAL | NSLOG_INFO_MESSAGE; syslog_options = NSLOG_RUNTIME_ERROR | NSLOG_RUNTIME_WARNING | NSLOG_VERIFICATION_ERROR | NSLOG_VERIFICATION_WARNING | NSLOG_CONFIG_ERROR | NSLOG_CONFIG_WARNING | NSLOG_PROCESS_INFO | NSLOG_HOST_NOTIFICATION | NSLOG_SERVICE_NOTIFICATION | NSLOG_EVENT_HANDLER | NSLOG_EXTERNAL_COMMAND | NSLOG_PASSIVE_CHECK | NSLOG_HOST_UP | NSLOG_HOST_DOWN | NSLOG_HOST_UNREACHABLE | NSLOG_SERVICE_OK | NSLOG_SERVICE_WARNING | NSLOG_SERVICE_UNKNOWN | NSLOG_SERVICE_CRITICAL | NSLOG_INFO_MESSAGE; modified_host_process_attributes = MODATTR_NONE; modified_service_process_attributes = MODATTR_NONE; last_log_rotation = 0L; currently_running_service_checks = 0; next_comment_id = 0L; /* comment and downtime id get initialized to nonzero elsewhere */ next_downtime_id = 0L; next_event_id = 1; next_notification_id = 1; free_child_process_memory = FALSE; child_processes_fork_twice = FALSE; /* initialize macros */ init_macros(); global_host_event_handler_ptr = NULL; global_service_event_handler_ptr = NULL; ocsp_command_ptr = NULL; ochp_command_ptr = NULL; /* reset umask */ umask(S_IWGRP | S_IWOTH); return OK; } nagios-4.3.4/base/workers.c000066400000000000000000000755101314764422400155730ustar00rootroot00000000000000/* * This file holds all nagios<->libnagios integration stuff, so that * libnagios itself is usable as a standalone library for addon * writers to use as they see fit. * * This means apis inside libnagios can be tested without compiling * all of Nagios into it, and that they can remain general-purpose * code that can be reused for other things later. */ #include "../include/config.h" #include #include "../include/nagios.h" #include "../include/workers.h" /* perfect hash function for wproc response codes */ #include "wpres-phash.h" struct wproc_worker; struct wproc_job { unsigned int id; unsigned int type; unsigned int timeout; char *command; void *arg; struct wproc_worker *wp; }; struct wproc_list; struct wproc_worker { char *name; /**< check-source name of this worker */ int sd; /**< communication socket */ pid_t pid; /**< pid */ int max_jobs; /**< Max number of jobs the worker can handle */ int jobs_running; /**< jobs running */ int jobs_started; /**< jobs started */ int job_index; /**< round-robin slot allocator (this wraps) */ iocache *ioc; /**< iocache for reading from worker */ fanout_table *jobs; /**< array of jobs */ struct wproc_list *wp_list; }; struct wproc_list { unsigned int len; unsigned int idx; struct wproc_worker **wps; }; static struct wproc_list workers = {0, 0, NULL}; static dkhash_table *specialized_workers; static struct wproc_list *to_remove = NULL; typedef struct wproc_callback_job { void *data; void (*callback)(struct wproc_result *, void *, int); } wproc_callback_job; typedef struct wproc_object_job { char *contact_name; char *host_name; char *service_description; } wproc_object_job; unsigned int wproc_num_workers_online = 0, wproc_num_workers_desired = 0; unsigned int wproc_num_workers_spawned = 0; extern struct kvvec * macros_to_kvv(nagios_macros *); #define tv2float(tv) ((float)((tv)->tv_sec) + ((float)(tv)->tv_usec) / 1000000.0) static const char *wpjob_type_name(unsigned int type) { switch (type) { case WPJOB_CHECK: return "CHECK"; case WPJOB_NOTIFY: return "NOTIFY"; case WPJOB_OCSP: return "OCSP"; case WPJOB_OCHP: return "OCHP"; case WPJOB_GLOBAL_SVC_EVTHANDLER: return "GLOBAL SERVICE EVENTHANDLER"; case WPJOB_SVC_EVTHANDLER: return "SERVICE EVENTHANDLER"; case WPJOB_GLOBAL_HOST_EVTHANDLER: return "GLOBAL HOST EVENTHANDLER"; case WPJOB_HOST_EVTHANDLER: return "HOST EVENTHANDLER"; case WPJOB_CALLBACK: return "CALLBACK"; case WPJOB_HOST_PERFDATA: return "HOST PERFDATA"; case WPJOB_SVC_PERFDATA: return "SERVICE PERFDATA"; } return "UNKNOWN"; } static void wproc_logdump_buffer(int level, int show, const char *prefix, char *buf) { char *ptr, *eol; unsigned int line = 1; if (!buf || !*buf) return; for (ptr = buf; ptr && *ptr; ptr = eol ? eol + 1 : NULL) { if ((eol = strchr(ptr, '\n'))) *eol = 0; logit(level, show, "%s line %.02d: %s\n", prefix, line++, ptr); if (eol) *eol = '\n'; else break; } } /* Try to reap 'jobs' jobs for 'msecs' milliseconds. Return early on error. */ void wproc_reap(int jobs, int msecs) { struct timeval start; gettimeofday(&start, NULL); while (jobs > 0 && msecs > 0) { int inputs = iobroker_poll(nagios_iobs, msecs); if (inputs < 0) return; jobs -= inputs; /* One input is roughly equivalent to one job. */ struct timeval now; gettimeofday(&now, NULL); msecs -= tv_delta_msec(&start, &now); start = now; } } int wproc_can_spawn(struct load_control *lc) { unsigned int old = 0; time_t now; /* if no load control is enabled, we can safely run this job */ if (!(lc->options & LOADCTL_ENABLED)) return 1; now = time(NULL); if (lc->last_check + lc->check_interval > now) { lc->last_check = now; if (getloadavg(lc->load, 3) < 0) return lc->jobs_limit > lc->jobs_running; if (lc->load[0] > lc->backoff_limit) { old = lc->jobs_limit; lc->jobs_limit -= lc->backoff_change; } else if (lc->load[0] < lc->rampup_limit) { old = lc->jobs_limit; lc->jobs_limit += lc->rampup_change; } if (lc->jobs_limit > lc->jobs_max) { lc->jobs_limit = lc->jobs_max; } else if (lc->jobs_limit < lc->jobs_min) { logit(NSLOG_RUNTIME_WARNING, TRUE, "Warning: Tried to set jobs_limit to %u, below jobs_min (%u)\n", lc->jobs_limit, lc->jobs_min); lc->jobs_limit = lc->jobs_min; } if (old && old != lc->jobs_limit) { if (lc->jobs_limit < old) { logit(NSLOG_RUNTIME_WARNING, TRUE, "Warning: loadctl.jobs_limit changed from %u to %u\n", old, lc->jobs_limit); } else { logit(NSLOG_INFO_MESSAGE, FALSE, "wproc: loadctl.jobs_limit changed from %u to %u\n", old, lc->jobs_limit); } } } return lc->jobs_limit > lc->jobs_running; } static int get_job_id(struct wproc_worker *wp) { return wp->job_index++; } static struct wproc_job *get_job(struct wproc_worker *wp, int job_id) { return fanout_remove(wp->jobs, job_id); } static struct wproc_list *get_wproc_list(const char *cmd) { struct wproc_list *wp_list; char *cmd_name = NULL, *slash = NULL, *space; if (!specialized_workers) return &workers; /* first, look for a specialized worker for this command */ if ((space = strchr(cmd, ' ')) != NULL) { int namelen = (unsigned long)space - (unsigned long)cmd; cmd_name = calloc(1, namelen + 1); /* not exactly optimal, but what the hells */ if (!cmd_name) return &workers; memcpy(cmd_name, cmd, namelen); slash = strrchr(cmd_name, '/'); } wp_list = dkhash_get(specialized_workers, cmd_name ? cmd_name : cmd, NULL); if (!wp_list && slash) { wp_list = dkhash_get(specialized_workers, ++slash, NULL); } if (wp_list != NULL) { log_debug_info(DEBUGL_CHECKS, 1, "Found specialized worker(s) for '%s'", (slash && *slash != '/') ? slash : cmd_name); } if (cmd_name) free(cmd_name); return wp_list ? wp_list : &workers; } static struct wproc_worker *get_worker(const char *cmd) { struct wproc_list *wp_list; if (!cmd) return NULL; wp_list = get_wproc_list(cmd); if (!wp_list || !wp_list->wps || !wp_list->len) return NULL; return wp_list->wps[wp_list->idx++ % wp_list->len]; } static struct wproc_job *create_job(int type, void *arg, time_t timeout, const char *cmd) { struct wproc_job *job; struct wproc_worker *wp; wp = get_worker(cmd); if (!wp) return NULL; job = calloc(1, sizeof(*job)); if (!job) { logit(NSLOG_RUNTIME_ERROR, TRUE, "Error: Failed to allocate memory for worker job: %s\n", strerror(errno)); return NULL; } job->wp = wp; job->id = get_job_id(wp); job->type = type; job->arg = arg; job->timeout = timeout; if (fanout_add(wp->jobs, job->id, job) < 0 || !(job->command = strdup(cmd))) { free(job); return NULL; } return job; } static void run_job_callback(struct wproc_job *job, struct wproc_result *wpres, int val) { wproc_callback_job *cj; if (!job || !job->arg) return; cj = (struct wproc_callback_job *)job->arg; if (!cj->callback) return; cj->callback(wpres, cj->data, val); cj->callback = NULL; } static void destroy_job(struct wproc_job *job) { if (!job) return; switch (job->type) { case WPJOB_CHECK: free_check_result(job->arg); free(job->arg); break; case WPJOB_NOTIFY: case WPJOB_OCSP: case WPJOB_OCHP: free(job->arg); break; case WPJOB_GLOBAL_SVC_EVTHANDLER: case WPJOB_SVC_EVTHANDLER: case WPJOB_GLOBAL_HOST_EVTHANDLER: case WPJOB_HOST_EVTHANDLER: case WPJOB_HOST_PERFDATA: case WPJOB_SVC_PERFDATA: /* these require nothing special */ break; case WPJOB_CALLBACK: /* call with NULL result to make callback clean things up */ run_job_callback(job, NULL, 0); break; default: logit(NSLOG_RUNTIME_WARNING, TRUE, "wproc: Unknown job type: %d\n", job->type); break; } my_free(job->command); if (job->wp) { fanout_remove(job->wp->jobs, job->id); job->wp->jobs_running--; } loadctl.jobs_running--; free(job); } static void fo_destroy_job(void *job) { destroy_job((struct wproc_job *)job); } static int wproc_is_alive(struct wproc_worker *wp) { if (!wp || !wp->pid) return 0; if (kill(wp->pid, 0) == 0 && iobroker_is_registered(nagios_iobs, wp->sd)) return 1; return 0; } static int wproc_destroy(struct wproc_worker *wp, int flags) { int i = 0, force = 0, self; if (!wp) return 0; force = !!(flags & WPROC_FORCE); self = getpid(); /* master retains workers through restarts */ if (self == nagios_pid && !force) return 0; /* free all memory when either forcing or a worker called us */ iocache_destroy(wp->ioc); wp->ioc = NULL; my_free(wp->name); fanout_destroy(wp->jobs, fo_destroy_job); wp->jobs = NULL; /* workers must never control other workers, so they return early */ if (self != nagios_pid) return 0; /* kill(0, SIGKILL) equals suicide, so we avoid it */ if (wp->pid) { kill(wp->pid, SIGKILL); } iobroker_close(nagios_iobs, wp->sd); /* reap our possibly lost children */ while (waitpid(-1, &i, WNOHANG) > 0) ; /* do nothing */ free(wp); return 0; } /* remove the worker list pointed to by to_remove */ static int remove_specialized(void *data) { if (data == to_remove) { return DKHASH_WALK_REMOVE; } else if (to_remove == NULL) { /* remove all specialised workers and their lists */ struct wproc_list *h = data; int i; for (i=0;ilen;i++) { /* not sure what WPROC_FORCE is actually for. * Nagios does *not* retain workers across * restarts, as stated in wproc_destroy? */ wproc_destroy(h->wps[i], WPROC_FORCE); } h->len = 0; free(h->wps); free(h); return DKHASH_WALK_REMOVE; } return 0; } /* remove worker from job assignment list */ static void remove_worker(struct wproc_worker *worker) { unsigned int i, j = 0; struct wproc_list *wpl = worker->wp_list; for (i = 0; i < wpl->len; i++) { if (wpl->wps[i] == worker) continue; wpl->wps[j++] = wpl->wps[i]; } wpl->len = j; if (!specialized_workers || wpl->len) return; to_remove = wpl; dkhash_walk_data(specialized_workers, remove_specialized); } /* * This gets called from both parent and worker process, so * we must take care not to blindly shut down everything here */ void free_worker_memory(int flags) { if (workers.wps) { unsigned int i; for (i = 0; i < workers.len; i++) { if (!workers.wps[i]) continue; wproc_destroy(workers.wps[i], flags); workers.wps[i] = NULL; } my_free(workers.wps); } workers.len = 0; workers.idx = 0; to_remove = NULL; dkhash_walk_data(specialized_workers, remove_specialized); dkhash_destroy(specialized_workers); specialized_workers = NULL; /* Don't leave pointers to freed memory. */ } static int str2timeval(char *str, struct timeval *tv) { char *ptr, *ptr2; tv->tv_sec = strtoul(str, &ptr, 10); if (ptr == str) { tv->tv_sec = tv->tv_usec = 0; return -1; } if (*ptr == '.' || *ptr == ',') { ptr2 = ptr + 1; tv->tv_usec = strtoul(ptr2, &ptr, 10); } return 0; } static int handle_worker_check(wproc_result *wpres, struct wproc_worker *wp, struct wproc_job *job) { int result = ERROR; check_result *cr = (check_result *)job->arg; memcpy(&cr->rusage, &wpres->rusage, sizeof(wpres->rusage)); cr->start_time.tv_sec = wpres->start.tv_sec; cr->start_time.tv_usec = wpres->start.tv_usec; cr->finish_time.tv_sec = wpres->stop.tv_sec; cr->finish_time.tv_usec = wpres->stop.tv_usec; if (WIFEXITED(wpres->wait_status)) { cr->return_code = WEXITSTATUS(wpres->wait_status); } else { cr->return_code = STATE_UNKNOWN; } if (wpres->outstd && *wpres->outstd) { cr->output = strdup(wpres->outstd); } else if (wpres->outerr) { asprintf(&cr->output, "(No output on stdout) stderr: %s", wpres->outerr); } else { cr->output = NULL; } cr->early_timeout = wpres->early_timeout; cr->exited_ok = wpres->exited_ok; cr->engine = NULL; cr->source = wp->name; process_check_result(cr); free_check_result(cr); return result; } /* * parses a worker result. We do no strdup()'s here, so when * kvv is destroyed, all references to strings will become * invalid */ static int parse_worker_result(wproc_result *wpres, struct kvvec *kvv) { int i; for (i = 0; i < kvv->kv_pairs; i++) { struct wpres_key *k; char *key, *value; key = kvv->kv[i].key; value = kvv->kv[i].value; k = wpres_get_key(key, kvv->kv[i].key_len); if (!k) { logit(NSLOG_RUNTIME_WARNING, TRUE, "wproc: Unrecognized result variable: (i=%d) %s=%s\n", i, key, value); continue; } switch (k->code) { case WPRES_job_id: wpres->job_id = atoi(value); break; case WPRES_type: wpres->type = atoi(value); break; case WPRES_command: wpres->command = value; break; case WPRES_timeout: wpres->timeout = atoi(value); break; case WPRES_wait_status: wpres->wait_status = atoi(value); break; case WPRES_start: str2timeval(value, &wpres->start); break; case WPRES_stop: str2timeval(value, &wpres->stop); break; case WPRES_outstd: wpres->outstd = value; break; case WPRES_outerr: wpres->outerr = value; break; case WPRES_exited_ok: wpres->exited_ok = atoi(value); break; case WPRES_error_msg: wpres->exited_ok = FALSE; wpres->error_msg = value; break; case WPRES_error_code: wpres->exited_ok = FALSE; wpres->error_code = atoi(value); break; case WPRES_runtime: /* ignored */ break; case WPRES_ru_utime: str2timeval(value, &wpres->rusage.ru_utime); break; case WPRES_ru_stime: str2timeval(value, &wpres->rusage.ru_stime); break; case WPRES_ru_minflt: wpres->rusage.ru_minflt = atoi(value); break; case WPRES_ru_majflt: wpres->rusage.ru_majflt = atoi(value); break; case WPRES_ru_nswap: wpres->rusage.ru_nswap = atoi(value); break; case WPRES_ru_inblock: wpres->rusage.ru_inblock = atoi(value); break; case WPRES_ru_oublock: wpres->rusage.ru_oublock = atoi(value); break; case WPRES_ru_msgsnd: wpres->rusage.ru_msgsnd = atoi(value); break; case WPRES_ru_msgrcv: wpres->rusage.ru_msgrcv = atoi(value); break; case WPRES_ru_nsignals: wpres->rusage.ru_nsignals = atoi(value); break; case WPRES_ru_nvcsw: wpres->rusage.ru_nsignals = atoi(value); break; case WPRES_ru_nivcsw: wpres->rusage.ru_nsignals = atoi(value); break; default: logit(NSLOG_RUNTIME_WARNING, TRUE, "wproc: Recognized but unhandled result variable: %s=%s\n", key, value); break; } } return 0; } static int wproc_run_job(struct wproc_job *job, nagios_macros *mac); static void fo_reassign_wproc_job(void *job_) { struct wproc_job *job = (struct wproc_job *)job_; job->wp = get_worker(job->command); if (job->wp != NULL) { job->id = get_job_id(job->wp); /* macros aren't used right now anyways */ wproc_run_job(job, NULL); } else { logit(NSLOG_RUNTIME_WARNING, TRUE, "wproc: Error: can't get_worker() in fo_reassign_wproc_job\n"); } } static int handle_worker_result(int sd, int events, void *arg) { wproc_object_job *oj = NULL; char *buf, *error_reason = NULL; unsigned long size; int ret; static struct kvvec kvv = KVVEC_INITIALIZER; struct wproc_worker *wp = (struct wproc_worker *)arg; if(iocache_capacity(wp->ioc) == 0) { logit(NSLOG_RUNTIME_WARNING, TRUE, "wproc: iocache_capacity() is 0 for worker %s.\n", wp->name); } ret = iocache_read(wp->ioc, wp->sd); if (ret < 0) { logit(NSLOG_RUNTIME_WARNING, TRUE, "wproc: iocache_read() from %s returned %d: %s\n", wp->name, ret, strerror(errno)); return 0; } else if (ret == 0) { logit(NSLOG_INFO_MESSAGE, TRUE, "wproc: Socket to worker %s broken, removing", wp->name); wproc_num_workers_online--; iobroker_unregister(nagios_iobs, sd); if (workers.len <= 0) { /* there aren't global workers left, we can't run any more checks * we should try respawning a few of the standard ones */ logit(NSLOG_RUNTIME_ERROR, TRUE, "wproc: All our workers are dead, we can't do anything!"); } remove_worker(wp); fanout_destroy(wp->jobs, fo_reassign_wproc_job); wp->jobs = NULL; wproc_destroy(wp, 0); return 0; } while ((buf = worker_ioc2msg(wp->ioc, &size, 0))) { struct wproc_job *job; wproc_result wpres; /* log messages are handled first */ if (size > 5 && !memcmp(buf, "log=", 4)) { logit(NSLOG_INFO_MESSAGE, TRUE, "wproc: %s: %s\n", wp->name, buf + 4); continue; } /* for everything else we need to actually parse */ if (buf2kvvec_prealloc(&kvv, buf, size, '=', '\0', KVVEC_ASSIGN) <= 0) { logit(NSLOG_RUNTIME_ERROR, TRUE, "wproc: Failed to parse key/value vector from worker response with len %lu. First kv=%s", size, buf ? buf : "(NULL)"); continue; } memset(&wpres, 0, sizeof(wpres)); wpres.job_id = -1; wpres.type = -1; wpres.response = &kvv; parse_worker_result(&wpres, &kvv); job = get_job(wp, wpres.job_id); if (!job) { logit(NSLOG_RUNTIME_WARNING, TRUE, "wproc: Job with id '%d' doesn't exist on %s.\n", wpres.job_id, wp->name); continue; } if (wpres.type != job->type) { logit(NSLOG_RUNTIME_WARNING, TRUE, "wproc: %s claims job %d is type %d, but we think it's type %d\n", wp->name, job->id, wpres.type, job->type); break; } oj = (wproc_object_job *)job->arg; /* * ETIME ("Timer expired") doesn't really happen * on any modern systems, so we reuse it to mean * "program timed out" */ if (wpres.error_code == ETIME) { wpres.early_timeout = TRUE; } if (wpres.early_timeout) { asprintf(&error_reason, "timed out after %.2fs", tv_delta_f(&wpres.start, &wpres.stop)); } else if (WIFSIGNALED(wpres.wait_status)) { asprintf(&error_reason, "died by signal %d%s after %.2f seconds", WTERMSIG(wpres.wait_status), WCOREDUMP(wpres.wait_status) ? " (core dumped)" : "", tv_delta_f(&wpres.start, &wpres.stop)); } else if (job->type != WPJOB_CHECK && WEXITSTATUS(wpres.wait_status) != 0) { asprintf(&error_reason, "is a non-check helper but exited with return code %d", WEXITSTATUS(wpres.wait_status)); } if (error_reason) { logit(NSLOG_RUNTIME_ERROR, TRUE, "wproc: %s job %d from worker %s %s", wpjob_type_name(job->type), job->id, wp->name, error_reason); #ifdef DEBUG /* The log below could leak sensitive information, such as passwords, so only enable it if you really need it */ logit(NSLOG_RUNTIME_ERROR, TRUE, "wproc: command: %s\n", job->command); #endif if (job->type != WPJOB_CHECK && oj) { logit(NSLOG_RUNTIME_ERROR, TRUE, "wproc: host=%s; service=%s; contact=%s\n", oj->host_name ? oj->host_name : "(none)", oj->service_description ? oj->service_description : "(none)", oj->contact_name ? oj->contact_name : "(none)"); } else if (oj) { struct check_result *cr = (struct check_result *)job->arg; logit(NSLOG_RUNTIME_ERROR, TRUE, "wproc: host=%s; service=%s;\n", cr->host_name, cr->service_description); } logit(NSLOG_RUNTIME_ERROR, TRUE, "wproc: early_timeout=%d; exited_ok=%d; wait_status=%d; error_code=%d;\n", wpres.early_timeout, wpres.exited_ok, wpres.wait_status, wpres.error_code); wproc_logdump_buffer(NSLOG_RUNTIME_ERROR, TRUE, "wproc: stderr", wpres.outerr); wproc_logdump_buffer(NSLOG_RUNTIME_ERROR, TRUE, "wproc: stdout", wpres.outstd); } my_free(error_reason); switch (job->type) { case WPJOB_CHECK: ret = handle_worker_check(&wpres, wp, job); break; case WPJOB_NOTIFY: if (wpres.early_timeout) { if (oj->service_description) { logit(NSLOG_RUNTIME_WARNING, TRUE, "Warning: Notifying contact '%s' of service '%s' on host '%s' by command '%s' timed out after %.2f seconds\n", oj->contact_name, oj->service_description, oj->host_name, job->command, tv2float(&wpres.runtime)); } else { logit(NSLOG_RUNTIME_WARNING, TRUE, "Warning: Notifying contact '%s' of host '%s' by command '%s' timed out after %.2f seconds\n", oj->contact_name, oj->host_name, job->command, tv2float(&wpres.runtime)); } } break; case WPJOB_OCSP: if (wpres.early_timeout) { logit(NSLOG_RUNTIME_WARNING, TRUE, "Warning: OCSP command '%s' for service '%s' on host '%s' timed out after %.2f seconds\n", job->command, oj->service_description, oj->host_name, tv2float(&wpres.runtime)); } break; case WPJOB_OCHP: if (wpres.early_timeout) { logit(NSLOG_RUNTIME_WARNING, TRUE, "Warning: OCHP command '%s' for host '%s' timed out after %.2f seconds\n", job->command, oj->host_name, tv2float(&wpres.runtime)); } break; case WPJOB_GLOBAL_SVC_EVTHANDLER: if (wpres.early_timeout) { logit(NSLOG_EVENT_HANDLER | NSLOG_RUNTIME_WARNING, TRUE, "Warning: Global service event handler command '%s' timed out after %.2f seconds\n", job->command, tv2float(&wpres.runtime)); } break; case WPJOB_SVC_EVTHANDLER: if (wpres.early_timeout) { logit(NSLOG_EVENT_HANDLER | NSLOG_RUNTIME_WARNING, TRUE, "Warning: Service event handler command '%s' timed out after %.2f seconds\n", job->command, tv2float(&wpres.runtime)); } break; case WPJOB_GLOBAL_HOST_EVTHANDLER: if (wpres.early_timeout) { logit(NSLOG_EVENT_HANDLER | NSLOG_RUNTIME_WARNING, TRUE, "Warning: Global host event handler command '%s' timed out after %.2f seconds\n", job->command, tv2float(&wpres.runtime)); } break; case WPJOB_HOST_EVTHANDLER: if (wpres.early_timeout) { logit(NSLOG_EVENT_HANDLER | NSLOG_RUNTIME_WARNING, TRUE, "Warning: Host event handler command '%s' timed out after %.2f seconds\n", job->command, tv2float(&wpres.runtime)); } break; case WPJOB_CALLBACK: run_job_callback(job, &wpres, 0); break; case WPJOB_HOST_PERFDATA: case WPJOB_SVC_PERFDATA: /* these require nothing special */ break; default: logit(NSLOG_RUNTIME_WARNING, TRUE, "Worker %ld: Unknown jobtype: %d\n", (long)wp->pid, job->type); break; } destroy_job(job); } return 0; } int workers_alive(void) { unsigned int i; int alive = 0; for (i = 0; i < workers.len; i++) { if (wproc_is_alive(workers.wps[i])) alive++; } return alive; } /* a service for registering workers */ static int register_worker(int sd, char *buf, unsigned int len) { int i, is_global = 1; struct kvvec *info; struct wproc_worker *worker; logit(NSLOG_INFO_MESSAGE, TRUE, "wproc: Registry request: %s\n", buf); if (!(worker = calloc(1, sizeof(*worker)))) { logit(NSLOG_RUNTIME_ERROR, TRUE, "wproc: Failed to allocate worker: %s\n", strerror(errno)); return 500; } info = buf2kvvec(buf, len, '=', ';', 0); if (info == NULL) { free(worker); logit(NSLOG_RUNTIME_ERROR, TRUE, "wproc: Failed to parse registration request\n"); return 500; } worker->sd = sd; worker->ioc = iocache_create(1 * 1024 * 1024); iobroker_unregister(nagios_iobs, sd); iobroker_register(nagios_iobs, sd, worker, handle_worker_result); for(i = 0; i < info->kv_pairs; i++) { struct key_value *kv = &info->kv[i]; if (!strcmp(kv->key, "name")) { worker->name = strdup(kv->value); } else if (!strcmp(kv->key, "pid")) { worker->pid = atoi(kv->value); } else if (!strcmp(kv->key, "max_jobs")) { worker->max_jobs = atoi(kv->value); } else if (!strcmp(kv->key, "plugin")) { struct wproc_list *command_handlers; is_global = 0; if (!(command_handlers = dkhash_get(specialized_workers, kv->value, NULL))) { command_handlers = calloc(1, sizeof(struct wproc_list)); command_handlers->wps = calloc(1, sizeof(struct wproc_worker**)); command_handlers->len = 1; command_handlers->wps[0] = worker; dkhash_insert(specialized_workers, strdup(kv->value), NULL, command_handlers); } else { command_handlers->len++; command_handlers->wps = realloc(command_handlers->wps, command_handlers->len * sizeof(struct wproc_worker**)); command_handlers->wps[command_handlers->len - 1] = worker; } worker->wp_list = command_handlers; } } if (!worker->max_jobs) { /* * each worker uses two filedescriptors per job, one to * connect to the master and about 13 to handle libraries * and memory allocation, so this guesstimate shouldn't * be too far off (for local workers, at least). */ worker->max_jobs = (iobroker_max_usable_fds() / 2) - 50; } worker->jobs = fanout_create(worker->max_jobs); if (is_global) { workers.len++; workers.wps = realloc(workers.wps, workers.len * sizeof(struct wproc_worker *)); workers.wps[workers.len - 1] = worker; worker->wp_list = &workers; } wproc_num_workers_online++; kvvec_destroy(info, 0); nsock_printf_nul(sd, "OK"); /* signal query handler to release its iocache for this one */ return QH_TAKEOVER; } static int wproc_query_handler(int sd, char *buf, unsigned int len) { char *space, *rbuf = NULL; if (!*buf || !strcmp(buf, "help")) { nsock_printf_nul(sd, "Control worker processes.\n" "Valid commands:\n" " wpstats Print general job information\n" " register Register a new worker\n" " can be name, pid, max_jobs and/or plugin.\n" " There can be many plugin args."); return 0; } if ((space = memchr(buf, ' ', len)) != NULL) *space = 0; rbuf = space ? space + 1 : buf; len -= (unsigned long)rbuf - (unsigned long)buf; if (!strcmp(buf, "register")) return register_worker(sd, rbuf, len); if (!strcmp(buf, "wpstats")) { unsigned int i; for (i = 0; i < workers.len; i++) { struct wproc_worker *wp = workers.wps[i]; nsock_printf(sd, "name=%s;pid=%ld;jobs_running=%u;jobs_started=%u\n", wp->name, (long)wp->pid, wp->jobs_running, wp->jobs_started); } return 0; } return 400; } static int spawn_core_worker(void) { char *argvec[] = {nagios_binary_path, "--worker", qh_socket_path ? qh_socket_path : DEFAULT_QUERY_SOCKET, NULL}; int ret; if ((ret = spawn_helper(argvec)) < 0) logit(NSLOG_RUNTIME_ERROR, TRUE, "wproc: Failed to launch core worker: %s\n", strerror(errno)); else wproc_num_workers_spawned++; return ret; } int init_workers(int desired_workers) { specialized_workers = dkhash_create(512); if (!specialized_workers) { logit(NSLOG_RUNTIME_ERROR, TRUE, "wproc: Failed to allocate specialized worker table.\n"); return -1; } /* Register our query handler before launching workers, so other workers * can join us whenever they're ready. */ if (!qh_register_handler("wproc", "Worker process management and info", 0, wproc_query_handler)) logit(NSLOG_INFO_MESSAGE, TRUE, "wproc: Successfully registered manager as @wproc with query handler\n"); else logit(NSLOG_RUNTIME_ERROR, TRUE, "wproc: Failed to register manager with query handler\n"); if (desired_workers <= 0) { int cpus = online_cpus(); /* Always at least 1 CPU. */ if (desired_workers < 0) { /* @note This is an undocumented case of questionable utility, and * should be removed. Users reading this note have been warned. */ desired_workers = cpus - desired_workers; /* desired_workers is now > 0. */ } else { desired_workers = cpus * 1.5; if (desired_workers < 4) { /* Use at least 4 workers when autocalculating so we have some * level of parallelism. */ desired_workers = 4; } else if (desired_workers > 48) { /* Limit the autocalculated workers so we don't spawn too many * on systems with many schedulable cores (>32). */ desired_workers = 48; } } } wproc_num_workers_desired = desired_workers; if (workers_alive() == desired_workers) return 0; /* can't shrink the number of workers (yet) */ if (desired_workers < (int)workers.len) return -1; while (desired_workers-- > 0) spawn_core_worker(); return 0; } /* * Handles adding the command and macros to the kvvec, * as well as shipping the command off to a designated * worker */ static int wproc_run_job(struct wproc_job *job, nagios_macros *mac) { static struct kvvec kvv = KVVEC_INITIALIZER; struct kvvec_buf *kvvb; struct kvvec *env_kvvp = NULL; struct kvvec_buf *env_kvvb = NULL; struct wproc_worker *wp; int ret, result = OK; ssize_t written = 0; if (!job || !job->wp) return ERROR; wp = job->wp; if (!kvvec_init(&kvv, 4)) /* job_id, type, command and timeout */ return ERROR; kvvec_addkv(&kvv, "job_id", (char *)mkstr("%d", job->id)); kvvec_addkv(&kvv, "type", (char *)mkstr("%d", job->type)); kvvec_addkv(&kvv, "command", job->command); kvvec_addkv(&kvv, "timeout", (char *)mkstr("%u", job->timeout)); /* Add the macro environment variables */ if(mac) { env_kvvp = macros_to_kvv(mac); if(NULL != env_kvvp) { env_kvvb = kvvec2buf(env_kvvp, '=', '\n', 0); if(NULL == env_kvvb) { kvvec_destroy(env_kvvp, KVVEC_FREE_KEYS); } else { kvvec_addkv_wlen(&kvv, "env", strlen("env"), env_kvvb->buf, env_kvvb->buflen); } } } kvvb = build_kvvec_buf(&kvv); /* ret = write(wp->sd, kvvb->buf, kvvb->bufsize); */ ret = nwrite(wp->sd, kvvb->buf, kvvb->bufsize, &written); if (ret != (int)kvvb->bufsize) { logit(NSLOG_RUNTIME_ERROR, TRUE, "wproc: '%s' seems to be choked. ret = %d; bufsize = %lu: written = %lu; errno = %d (%s)\n", wp->name, ret, kvvb->bufsize, written, errno, strerror(errno)); destroy_job(job); result = ERROR; } else { wp->jobs_running++; wp->jobs_started++; loadctl.jobs_running++; } if(NULL != env_kvvp) kvvec_destroy(env_kvvp, KVVEC_FREE_KEYS); if(NULL != env_kvvb) { free(env_kvvb->buf); free(env_kvvb); } free(kvvb->buf); free(kvvb); return result; } static wproc_object_job *create_object_job(char *cname, char *hname, char *sdesc) { wproc_object_job *oj; oj = calloc(1, sizeof(*oj)); if (oj) { oj->host_name = hname; if (cname) oj->contact_name = cname; if (sdesc) oj->service_description = sdesc; } return oj; } int wproc_notify(char *cname, char *hname, char *sdesc, char *cmd, nagios_macros *mac) { struct wproc_job *job; wproc_object_job *oj; if (!(oj = create_object_job(cname, hname, sdesc))) return ERROR; job = create_job(WPJOB_NOTIFY, oj, notification_timeout, cmd); return wproc_run_job(job, mac); } int wproc_run_service_job(int jtype, int timeout, service *svc, char *cmd, nagios_macros *mac) { struct wproc_job *job; wproc_object_job *oj; if (!(oj = create_object_job(NULL, svc->host_name, svc->description))) return ERROR; job = create_job(jtype, oj, timeout, cmd); return wproc_run_job(job, mac); } int wproc_run_host_job(int jtype, int timeout, host *hst, char *cmd, nagios_macros *mac) { struct wproc_job *job; wproc_object_job *oj; if (!(oj = create_object_job(NULL, hst->name, NULL))) return ERROR; job = create_job(jtype, oj, timeout, cmd); return wproc_run_job(job, mac); } int wproc_run_check(check_result *cr, char *cmd, nagios_macros *mac) { struct wproc_job *job; int timeout; if (cr->service_description) timeout = service_check_timeout; else timeout = host_check_timeout; job = create_job(WPJOB_CHECK, cr, timeout, cmd); return wproc_run_job(job, mac); } int wproc_run(int jtype, char *cmd, int timeout, nagios_macros *mac) { struct wproc_job *job; job = create_job(jtype, NULL, timeout, cmd); return wproc_run_job(job, mac); } int wproc_run_callback(char *cmd, int timeout, void (*cb)(struct wproc_result *, void *, int), void *data, nagios_macros *mac) { struct wproc_job *job; struct wproc_callback_job *cj; if (!(cj = calloc(1, sizeof(*cj)))) return ERROR; cj->callback = cb; cj->data = data; job = create_job(WPJOB_CALLBACK, cj, timeout, cmd); return wproc_run_job(job, mac); } nagios-4.3.4/base/wp-phash.c000066400000000000000000000074351314764422400156270ustar00rootroot00000000000000#define WPRES_type 4 #define WPRES_outerr 6 #define WPRES_timeout 7 #define WPRES_ru_nswap 8 #define WPRES_error_msg 9 #define WPRES_error_code 10 #define WPRES_ru_nsignals 11 #define WPRES_command 12 #define WPRES_ru_majflt 14 #define WPRES_start 15 #define WPRES_outstd 16 #define WPRES_ru_stime 18 #define WPRES_exited_ok 19 #define WPRES_ru_inblock 20 #define WPRES_job_id 21 #define WPRES_ru_minflt 24 #define WPRES_ru_oublock 25 #define WPRES_wait_status 26 #define WPRES_runtime 27 #define WPRES_stop 29 #define WPRES_ru_utime 33 /* C code produced by gperf version 3.0.4 */ /* Command-line: gperf -H wp_phash wproc-strings */ /* Computed positions: -k'4-5' */ #if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \ && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \ && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \ && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \ && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \ && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \ && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \ && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \ && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \ && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \ && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \ && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \ && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \ && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \ && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \ && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \ && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \ && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \ && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \ && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \ && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \ && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \ && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126)) /* The character set is not based on ISO-646. */ error "gperf generated tables don't work with this execution character set. Please report a bug to ." #endif static inline unsigned int wp_phash(register const char *str, register unsigned int len) { /* the last 136 entries have been cut, as we don't need them */ static unsigned char asso_values[256] = { 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 5, 34, 0, 34, 34, 34, 0, 34, 34, 34, 10, 34, 34, 34, 5, 0, 0, 25, 34, 0, 0, 10, 15, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, }; register int hval = len; switch (hval) { default: hval += asso_values[(unsigned char)str[4]]; /*FALLTHROUGH*/ case 4: hval += asso_values[(unsigned char)str[3]]; break; } return hval; } nagios-4.3.4/base/wpres-phash.h000066400000000000000000000227541314764422400163470ustar00rootroot00000000000000/* C code produced by gperf version 3.0.3 */ /* Command-line: gperf -S 1 -t -H wpres_key_phash -N wpres_get_key wpres.gperf */ /* Computed positions: -k'4-5,7' */ #if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \ && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \ && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \ && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \ && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \ && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \ && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \ && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \ && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \ && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \ && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \ && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \ && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \ && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \ && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \ && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \ && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \ && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \ && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \ && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \ && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \ && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \ && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126)) /* The character set is not based on ISO-646. */ error "gperf generated tables don't work with this execution character set. Please report a bug to ." #endif #line 1 "wpres.gperf" enum { WPRES_job_id, WPRES_type, WPRES_command, WPRES_timeout, WPRES_wait_status, WPRES_start, WPRES_stop, WPRES_outstd, WPRES_outerr, WPRES_exited_ok, WPRES_error_msg, WPRES_error_code, WPRES_runtime, WPRES_ru_utime, WPRES_ru_stime, WPRES_ru_maxrss, WPRES_ru_ixrss, WPRES_ru_idrss, WPRES_ru_isrss, WPRES_ru_minflt, WPRES_ru_majflt, WPRES_ru_nswap, WPRES_ru_inblock, WPRES_ru_oublock, WPRES_ru_msgsnd, WPRES_ru_msgrcv, WPRES_ru_nsignals, WPRES_ru_nvcsw, WPRES_ru_nivcsw, }; #include /* for strcmp() */ #line 35 "wpres.gperf" struct wpres_key { const char *name; int code; }; #define TOTAL_KEYWORDS 29 #define MIN_WORD_LENGTH 4 #define MAX_WORD_LENGTH 11 #define MIN_HASH_VALUE 4 #define MAX_HASH_VALUE 64 /* maximum key range = 61, duplicates = 0 */ #ifdef __GNUC__ __inline #else #ifdef __cplusplus inline #endif #endif static unsigned int wpres_key_phash (str, len) register const char *str; register unsigned int len; { static unsigned char asso_values[] = { 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 15, 65, 25, 65, 3, 10, 0, 30, 0, 65, 0, 65, 65, 0, 0, 0, 20, 5, 65, 0, 5, 0, 0, 30, 65, 15, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65 }; register int hval = len; switch (hval) { default: hval += asso_values[(unsigned char)str[6]]; /*FALLTHROUGH*/ case 6: case 5: hval += asso_values[(unsigned char)str[4]]; /*FALLTHROUGH*/ case 4: hval += asso_values[(unsigned char)str[3]]; break; } return hval; } #ifdef __GNUC__ __inline #ifdef __GNUC_STDC_INLINE__ __attribute__ ((__gnu_inline__)) #endif #endif struct wpres_key * wpres_get_key (str, len) register const char *str; register unsigned int len; { static struct wpres_key wordlist[] = { #line 41 "wpres.gperf" {"type", WPRES_type}, #line 45 "wpres.gperf" {"start", WPRES_start}, #line 48 "wpres.gperf" {"outerr", WPRES_outerr}, #line 52 "wpres.gperf" {"runtime", WPRES_runtime}, #line 53 "wpres.gperf" {"ru_utime", WPRES_ru_utime}, #line 46 "wpres.gperf" {"stop", WPRES_stop}, #line 62 "wpres.gperf" {"ru_inblock", WPRES_ru_inblock}, #line 47 "wpres.gperf" {"outstd", WPRES_outstd}, #line 68 "wpres.gperf" {"ru_nivcsw", WPRES_ru_nivcsw}, #line 54 "wpres.gperf" {"ru_stime", WPRES_ru_stime}, #line 65 "wpres.gperf" {"ru_msgrcv", WPRES_ru_msgrcv}, #line 66 "wpres.gperf" {"ru_nsignals", WPRES_ru_nsignals}, #line 58 "wpres.gperf" {"ru_isrss", WPRES_ru_isrss}, #line 64 "wpres.gperf" {"ru_msgsnd", WPRES_ru_msgsnd}, #line 40 "wpres.gperf" {"job_id", WPRES_job_id}, #line 57 "wpres.gperf" {"ru_idrss", WPRES_ru_idrss}, #line 49 "wpres.gperf" {"exited_ok", WPRES_exited_ok}, #line 44 "wpres.gperf" {"wait_status", WPRES_wait_status}, #line 43 "wpres.gperf" {"timeout", WPRES_timeout}, #line 56 "wpres.gperf" {"ru_ixrss", WPRES_ru_ixrss}, #line 50 "wpres.gperf" {"error_msg", WPRES_error_msg}, #line 63 "wpres.gperf" {"ru_oublock", WPRES_ru_oublock}, #line 51 "wpres.gperf" {"error_code", WPRES_error_code}, #line 55 "wpres.gperf" {"ru_maxrss", WPRES_ru_maxrss}, #line 61 "wpres.gperf" {"ru_nswap", WPRES_ru_nswap}, #line 59 "wpres.gperf" {"ru_minflt", WPRES_ru_minflt}, #line 42 "wpres.gperf" {"command", WPRES_command}, #line 67 "wpres.gperf" {"ru_nvcsw", WPRES_ru_nvcsw}, #line 60 "wpres.gperf" {"ru_majflt", WPRES_ru_majflt} }; if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) { register int key = wpres_key_phash (str, len); if (key <= MAX_HASH_VALUE && key >= MIN_HASH_VALUE) { register struct wpres_key *resword; switch (key - 4) { case 0: resword = &wordlist[0]; goto compare; case 1: resword = &wordlist[1]; goto compare; case 2: resword = &wordlist[2]; goto compare; case 3: resword = &wordlist[3]; goto compare; case 4: resword = &wordlist[4]; goto compare; case 5: resword = &wordlist[5]; goto compare; case 6: resword = &wordlist[6]; goto compare; case 7: resword = &wordlist[7]; goto compare; case 8: resword = &wordlist[8]; goto compare; case 9: resword = &wordlist[9]; goto compare; case 10: resword = &wordlist[10]; goto compare; case 12: resword = &wordlist[11]; goto compare; case 14: resword = &wordlist[12]; goto compare; case 15: resword = &wordlist[13]; goto compare; case 17: resword = &wordlist[14]; goto compare; case 19: resword = &wordlist[15]; goto compare; case 20: resword = &wordlist[16]; goto compare; case 22: resword = &wordlist[17]; goto compare; case 23: resword = &wordlist[18]; goto compare; case 24: resword = &wordlist[19]; goto compare; case 25: resword = &wordlist[20]; goto compare; case 26: resword = &wordlist[21]; goto compare; case 29: resword = &wordlist[22]; goto compare; case 30: resword = &wordlist[23]; goto compare; case 34: resword = &wordlist[24]; goto compare; case 35: resword = &wordlist[25]; goto compare; case 38: resword = &wordlist[26]; goto compare; case 39: resword = &wordlist[27]; goto compare; case 60: resword = &wordlist[28]; goto compare; } return 0; compare: { register const char *s = resword->name; if (*str == *s && !strcmp (str + 1, s + 1)) return resword; } } } return 0; } nagios-4.3.4/base/wpres.gperf000066400000000000000000000024601314764422400161120ustar00rootroot00000000000000%{ enum { WPRES_job_id, WPRES_type, WPRES_command, WPRES_timeout, WPRES_wait_status, WPRES_start, WPRES_stop, WPRES_outstd, WPRES_outerr, WPRES_exited_ok, WPRES_error_msg, WPRES_error_code, WPRES_runtime, WPRES_ru_utime, WPRES_ru_stime, WPRES_ru_maxrss, WPRES_ru_ixrss, WPRES_ru_idrss, WPRES_ru_isrss, WPRES_ru_minflt, WPRES_ru_majflt, WPRES_ru_nswap, WPRES_ru_inblock, WPRES_ru_oublock, WPRES_ru_msgsnd, WPRES_ru_msgrcv, WPRES_ru_nsignals, WPRES_ru_nvcsw, WPRES_ru_nivcsw, }; #include /* for strcmp() */ %} struct wpres_key { const char *name; int code; }; %% job_id, WPRES_job_id type, WPRES_type command, WPRES_command timeout, WPRES_timeout wait_status, WPRES_wait_status start, WPRES_start stop, WPRES_stop outstd, WPRES_outstd outerr, WPRES_outerr exited_ok, WPRES_exited_ok error_msg, WPRES_error_msg error_code, WPRES_error_code runtime, WPRES_runtime ru_utime, WPRES_ru_utime ru_stime, WPRES_ru_stime ru_maxrss, WPRES_ru_maxrss ru_ixrss, WPRES_ru_ixrss ru_idrss, WPRES_ru_idrss ru_isrss, WPRES_ru_isrss ru_minflt, WPRES_ru_minflt ru_majflt, WPRES_ru_majflt ru_nswap, WPRES_ru_nswap ru_inblock, WPRES_ru_inblock ru_oublock, WPRES_ru_oublock ru_msgsnd, WPRES_ru_msgsnd ru_msgrcv, WPRES_ru_msgrcv ru_nsignals, WPRES_ru_nsignals ru_nvcsw, WPRES_ru_nvcsw ru_nivcsw, WPRES_ru_nivcsw nagios-4.3.4/cgi/000077500000000000000000000000001314764422400135535ustar00rootroot00000000000000nagios-4.3.4/cgi/.gitignore000066400000000000000000000000231314764422400155360ustar00rootroot00000000000000*.o *.cgi Makefile nagios-4.3.4/cgi/Makefile.in000066400000000000000000000147611314764422400156310ustar00rootroot00000000000000############################### # Makefile for Nagios CGIs # ############################### # Source code directories SRC_COMMON=../common SRC_INCLUDE=../include SRC_XDATA=../xdata SRC_LIB=../lib prefix=@prefix@ exec_prefix=@exec_prefix@ LOGDIR=@localstatedir@ CFGDIR=@sysconfdir@ BINDIR=@bindir@ CGIDIR=@sbindir@ HTMLDIR=@datarootdir@ INSTALL=@INSTALL@ INSTALL_OPTS=@INSTALL_OPTS@ COMMAND_OPTS=@COMMAND_OPTS@ STRIP=@STRIP@ CGIEXTRAS=@CGIEXTRAS@ CP=@CP@ CC=@CC@ CFLAGS=-Wall -I.. @CFLAGS@ @DEFS@ -DNSCGI JSONFLAGS=-DJSON_NAGIOS_4X # Compiler flags for optimization (overrides default) #CFLAGS=-O3 -Wall -Wshadow -Wpointer-arith -Wcast-qual -Wcast-align -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -DHAVE_CONFIG_H -DNSCGI # Compiler flags for optimization (complements default) #CFLAGS_WARN=-Wall -Wshadow -Wpointer-arith -Wcast-qual -Wcast-align -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs #CFLAGS_DEBUG=-ggdb3 -g3 #CFLAGS+=$(CFLAGS_WARN) $(CFLAGS_DEBUG) LDFLAGS=@LDFLAGS@ LIBS=@LIBS@ CGIS=archivejson.cgi avail.cgi cmd.cgi config.cgi extinfo.cgi history.cgi notifications.cgi objectjson.cgi outages.cgi showlog.cgi status.cgi statusjson.cgi statuswml.cgi summary.cgi tac.cgi $(CGIEXTRAS) # Object functions ODATALIBS=objects-cgi.o xobjects-cgi.o ODATAHDRS= ODATADEPS=$(ODATALIBS) # Host, service, and program status functions SDATALIBS=statusdata-cgi.o xstatusdata-cgi.o comments-cgi.o downtime-cgi.o SDATAHDRS= SDATADEPS=$(SDATALIBS) # Host and service comment functions CDATALIBS= CDATAHDRS= CDATADEPS=$(CDATALIBS) # Host and service downtime functions DDATALIBS= DDATAHDRS= DDATADEPS=$(DDATALIBS) # Common CGI functions (includes object and status functions) CGILIBS=$(SRC_COMMON)/shared.o getcgi.o cgiutils.o cgiauth.o macros-cgi.o $(SNPRINTF_O) $(ODATALIBS) $(SDATALIBS) $(SRC_LIB)/libnagios.a CGIHDRS=$(SRC_INCLUDE)/config.h $(SRC_INCLUDE)/common.h $(SRC_INCLUDE)/locations.h CGIDEPS=$(CGILIBS) $(ODATADEPS) $(SDATADEPS) $(SRC_LIB)/libnagios.a MATHLIBS=-lm GDLIBS=@GDLIBS@ all cgis: $(CGIS) $(CGILIBS): $(CGIHDRS) ######## REQUIRED LIBRARIES ########## $(SRC_LIB)/libnagios.a: $(MAKE) -C $(SRC_LIB) macros-cgi.o: $(SRC_COMMON)/macros.c $(SRC_INCLUDE)/macros.h $(CC) $(CFLAGS) -c -o $@ $(SRC_COMMON)/macros.c objects-cgi.o: $(SRC_COMMON)/objects.c $(SRC_INCLUDE)/objects.h $(CC) $(CFLAGS) -c -o $@ $(SRC_COMMON)/objects.c xobjects-cgi.o: $(SRC_XDATA)/xodtemplate.c $(SRC_XDATA)/xodtemplate.h $(CC) $(CFLAGS) -c -o $@ $(SRC_XDATA)/xodtemplate.c statusdata-cgi.o: $(SRC_COMMON)/statusdata.c $(SRC_INCLUDE)/statusdata.h $(CC) $(CFLAGS) -c -o $@ $(SRC_COMMON)/statusdata.c xstatusdata-cgi.o: $(SRC_XDATA)/xsddefault.c $(SRC_XDATA)/xsddefault.h $(CC) $(CFLAGS) -c -o $@ $(SRC_XDATA)/xsddefault.c comments-cgi.o: $(SRC_COMMON)/comments.c $(SRC_INCLUDE)/comments.h $(CC) $(CFLAGS) -c -o $@ $(SRC_COMMON)/comments.c downtime-cgi.o: $(SRC_COMMON)/downtime.c $(SRC_INCLUDE)/downtime.h $(CC) $(CFLAGS) -c -o $@ $(SRC_COMMON)/downtime.c $(SRC_COMMON)/shared.o: $(SRC_COMMON)/shared.c $(CC) $(CFLAGS) -c -o $@ $< ########## CGIS ########## avail.cgi: avail.c $(CGIDEPS) $(CC) $(CFLAGS) $(LDFLAGS) -o $@ avail.c $(CGILIBS) $(LIBS) checksanity.cgi: checksanity.c $(CGIDEPS) $(CDATADEPS) $(DDATADEPS) $(CC) $(CFLAGS) $(LDFLAGS) -o $@ checksanity.c $(CGILIBS) $(CDATALIBS) $(DDATALIBS) $(LIBS) cmd.cgi: cmd.c $(CGIDEPS) $(CDATADEPS) $(DDATADEPS) extcmd_list.o $(CC) $(CFLAGS) $(LDFLAGS) -o $@ cmd.c extcmd_list.o $(CGILIBS) $(CDATALIBS) $(DDATALIBS) $(LIBS) config.cgi: config.c $(CGIDEPS) $(CC) $(CFLAGS) $(LDFLAGS) -o $@ config.c $(CGILIBS) $(LIBS) extinfo.cgi: extinfo.c $(CGIDEPS) $(CDATADEPS) $(DDATADEPS) $(CC) $(CFLAGS) $(LDFLAGS) -o $@ extinfo.c $(CGILIBS) $(CDATALIBS) $(DDATALIBS) $(LIBS) history.cgi: history.c $(CGIDEPS) $(CC) $(CFLAGS) $(LDFLAGS) -o $@ history.c $(CGILIBS) $(LIBS) ministatus.cgi: ministatus.c $(CGIDEPS) $(CC) $(CFLAGS) $(LDFLAGS) -o $@ ministatus.c $(CGILIBS) $(LIBS) notifications.cgi: notifications.c $(CGIDEPS) $(CC) $(CFLAGS) $(LDFLAGS) -o $@ notifications.c $(CGILIBS) $(LIBS) outages.cgi: outages.c $(CGIDEPS) $(CDATADEPS) $(CC) $(CFLAGS) $(LDFLAGS) -o $@ outages.c $(CGILIBS) $(CDATALIBS) $(LIBS) showlog.cgi: showlog.c $(CGIDEPS) $(CC) $(CFLAGS) $(LDFLAGS) -o $@ showlog.c $(CGILIBS) $(LIBS) status.cgi: status.c $(CGIDEPS) $(CDATADEPS) $(CC) $(CFLAGS) $(LDFLAGS) -o $@ status.c $(CGILIBS) $(CDATALIBS) $(LIBS) statuswml.cgi: statuswml.c $(CGIDEPS) $(CC) $(CFLAGS) $(LDFLAGS) -o $@ statuswml.c $(CGILIBS) $(LIBS) statusmap.cgi: statusmap.c $(CGIDEPS) $(CC) $(CFLAGS) $(LDFLAGS) -o $@ statusmap.c $(CGILIBS) $(GDLIBS) $(LIBS) statuswrl.cgi: statuswrl.c $(CGIDEPS) $(CC) $(CFLAGS) $(LDFLAGS) -o $@ statuswrl.c $(CGILIBS) $(MATHLIBS) $(LIBS) summary.cgi: summary.c $(CGIDEPS) $(CC) $(CFLAGS) $(LDFLAGS) -o $@ summary.c $(CGILIBS) $(LIBS) tac.cgi: tac.c $(CGIDEPS) $(CDATADEPS) $(CC) $(CFLAGS) $(LDFLAGS) -o $@ tac.c $(CGILIBS) $(CDATALIBS) $(LIBS) tac-xml.cgi: tac-xml.c $(CGIDEPS) $(CDATADEPS) $(CC) $(CFLAGS) $(LDFLAGS) -o $@ tac-xml.c $(CGILIBS) $(CDATALIBS) $(LIBS) trends.cgi: trends.c $(CGIDEPS) $(CC) $(CFLAGS) $(LDFLAGS) -o $@ trends.c $(CGILIBS) $(GDLIBS) $(LIBS) histogram.cgi: histogram.c $(CGIDEPS) $(CC) $(CFLAGS) $(LDFLAGS) -o $@ histogram.c $(CGILIBS) $(GDLIBS) $(LIBS) ########## JSON CGIS ########## jsonutils.o: jsonutils.c $(SRC_INCLUDE)/jsonutils.h $(CC) $(CFLAGS) $(JSONFLAGS) -c -o $@ jsonutils.c archiveutils.o: archiveutils.c $(SRC_INCLUDE)/archiveutils.h $(CC) $(CFLAGS) $(JSONFLAGS) -c -o $@ archiveutils.c archivejson.cgi: archivejson.c $(CGIDEPS) archiveutils.o jsonutils.o $(SRC_INCLUDE)/archivejson.h $(CC) $(CFLAGS) $(JSONFLAGS) $(LDFLAGS) -o $@ archivejson.c $(CGILIBS) archiveutils.o jsonutils.o $(LIBS) objectjson.cgi: objectjson.c $(CGIDEPS) jsonutils.o $(SRC_INCLUDE)/objectjson.h $(CC) $(CFLAGS) $(JSONFLAGS) $(LDFLAGS) -o $@ objectjson.c $(CGILIBS) jsonutils.o $(LIBS) statusjson.cgi: statusjson.c $(CGIDEPS) jsonutils.o $(SRC_INCLUDE)/statusjson.h $(CC) $(CFLAGS) $(JSONFLAGS) $(LDFLAGS) -o $@ statusjson.c $(CGILIBS) jsonutils.o $(LIBS) clean: rm -f $(CGIS) rm -f *.o core gmon.out rm -f *~ *.*~ distclean: clean rm -f Makefile cgiutils.h devclean: distclean install: $(MAKE) install-basic $(MAKE) strip-post-install install-unstripped: $(MAKE) install-basic install-basic: $(INSTALL) -m 775 $(INSTALL_OPTS) -d $(DESTDIR)$(CGIDIR) for file in *.cgi; do \ $(INSTALL) -m 775 $(INSTALL_OPTS) $$file $(DESTDIR)$(CGIDIR); \ done strip-post-install: for file in *.cgi; do \ $(STRIP) $(DESTDIR)$(CGIDIR)/$$file; \ done .PHONY: libnagios nagios-4.3.4/cgi/archivejson.c000066400000000000000000004561561314764422400162530ustar00rootroot00000000000000/************************************************************************** * * ARCHIVEJSON.C - Nagios CGI for returning JSON-formatted archive data * * Copyright (c) 2013 Nagios Enterprises, LLC * Last Modified: 04-13-2013 * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *************************************************************************/ #include "../include/config.h" #include "../include/common.h" #include "../include/objects.h" #include "../include/statusdata.h" #include "../include/cgiutils.h" #include "../include/getcgi.h" #include "../include/cgiauth.h" #include "../include/jsonutils.h" #include "../include/archiveutils.h" #include "../include/archivejson.h" #define THISCGI "archivejson.cgi" #define min(a,b) ((a) < (b) ? (a) : (b)) #define max(a,b) ((a) > (b) ? (a) : (b)) extern char main_config_file[MAX_FILENAME_LENGTH]; extern int log_rotation_method; extern char *status_file; extern host *host_list; extern hostgroup *hostgroup_list; extern service *service_list; extern servicegroup *servicegroup_list; #if 0 extern contact *contact_list; extern contactgroup *contactgroup_list; extern timeperiod *timeperiod_list; extern command *command_list; extern servicedependency *servicedependency_list; extern serviceescalation *serviceescalation_list; extern hostdependency *hostdependency_list; extern hostescalation *hostescalation_list; #endif void document_header(); void document_footer(void); void init_cgi_data(archive_json_cgi_data *); int process_cgivars(json_object *, archive_json_cgi_data *, time_t); void free_cgi_data(archive_json_cgi_data *); int validate_arguments(json_object *, archive_json_cgi_data *, time_t); authdata current_authdata; const string_value_mapping valid_queries[] = { { "help", ARCHIVE_QUERY_HELP, "Display help for this CGI" }, { "alertcount", ARCHIVE_QUERY_ALERTCOUNT, "Return the number of alerts" }, { "alertlist", ARCHIVE_QUERY_ALERTLIST, "Return a list of alerts" }, { "notificationcount", ARCHIVE_QUERY_NOTIFICATIONCOUNT, "Return the number of notifications" }, { "notificationlist", ARCHIVE_QUERY_NOTIFICATIONLIST, "Return a list of notifications" }, { "statechangelist", ARCHIVE_QUERY_STATECHANGELIST, "Return a list of state changes" }, { "availability", ARCHIVE_QUERY_AVAILABILITY, "Return an availability report" }, { NULL, -1, NULL }, }; static const int query_status[][2] = { { ARCHIVE_QUERY_HELP, QUERY_STATUS_RELEASED }, { ARCHIVE_QUERY_ALERTCOUNT, QUERY_STATUS_RELEASED }, { ARCHIVE_QUERY_ALERTLIST, QUERY_STATUS_RELEASED }, { ARCHIVE_QUERY_NOTIFICATIONCOUNT, QUERY_STATUS_RELEASED }, { ARCHIVE_QUERY_NOTIFICATIONLIST, QUERY_STATUS_RELEASED }, { ARCHIVE_QUERY_STATECHANGELIST, QUERY_STATUS_RELEASED }, { ARCHIVE_QUERY_AVAILABILITY, QUERY_STATUS_RELEASED }, { -1, -1 }, }; const string_value_mapping valid_object_types[] = { { "host", AU_OBJTYPE_HOST, "Host" }, { "service", AU_OBJTYPE_SERVICE, "Service" }, { NULL, -1, NULL }, }; const string_value_mapping valid_availability_object_types[] = { { "hosts", AU_OBJTYPE_HOST, "Hosts" }, { "hostgroups", AU_OBJTYPE_HOSTGROUP, "Hostgroups" }, { "services", AU_OBJTYPE_SERVICE, "Services" }, { "servicegroups", AU_OBJTYPE_SERVICEGROUP, "Servicegroups" }, { NULL, -1, NULL }, }; const string_value_mapping valid_state_types[] = { { "hard", AU_STATETYPE_HARD, "Hard" }, { "soft", AU_STATETYPE_SOFT, "Soft" }, { NULL, -1, NULL }, }; const string_value_mapping valid_states[] = { { "no_data", AU_STATE_NO_DATA, "No Data" }, { "host_up", AU_STATE_HOST_UP, "Host Up" }, { "host_down", AU_STATE_HOST_DOWN, "Host Down" }, { "host_unreachable", AU_STATE_HOST_UNREACHABLE, "Host Unreachable" }, { "service_ok", AU_STATE_SERVICE_OK, "Service OK" }, { "service_warning", AU_STATE_SERVICE_WARNING, "Service Warning" }, { "service_critical", AU_STATE_SERVICE_CRITICAL, "Service Critical" }, { "service_unknown", AU_STATE_SERVICE_UNKNOWN, "Service Unknown" }, { "program_start", AU_STATE_PROGRAM_START, "Program Start" }, { "program_end", AU_STATE_PROGRAM_END, "Program End" }, { "downtime_start", AU_STATE_DOWNTIME_START, "Downtime Start" }, { "downtime_end", AU_STATE_DOWNTIME_END, "Downtime End" }, }; const string_value_mapping valid_host_states[] = { { "up", AU_STATE_HOST_UP, "Up" }, { "down", AU_STATE_HOST_DOWN, "Down" }, { "unreachable", AU_STATE_HOST_UNREACHABLE, "Unreachable" }, { NULL, -1, NULL }, }; const string_value_mapping valid_initial_host_states[] = { { "up", AU_STATE_HOST_UP, "Up" }, { "down", AU_STATE_HOST_DOWN, "Down" }, { "unreachable", AU_STATE_HOST_UNREACHABLE, "Unreachable" }, { "current", AU_STATE_CURRENT_STATE, "Current State" }, { NULL, -1, NULL }, }; const string_value_mapping valid_service_states[] = { { "ok", AU_STATE_SERVICE_OK, "Ok" }, { "warning", AU_STATE_SERVICE_WARNING, "Warning" }, { "critical", AU_STATE_SERVICE_CRITICAL, "Critical" }, { "unknown", AU_STATE_SERVICE_UNKNOWN, "Unknown" }, { NULL, -1, NULL }, }; const string_value_mapping valid_initial_service_states[] = { { "ok", AU_STATE_SERVICE_OK, "Ok" }, { "warning", AU_STATE_SERVICE_WARNING, "Warning" }, { "critical", AU_STATE_SERVICE_CRITICAL, "Critical" }, { "unknown", AU_STATE_SERVICE_UNKNOWN, "Unknown" }, { "current", AU_STATE_CURRENT_STATE, "Current State" }, { NULL, -1, NULL }, }; const string_value_mapping valid_host_notification_types[] = { { "nodata", AU_NOTIFICATION_NO_DATA, "No Data" }, { "down", AU_NOTIFICATION_HOST_DOWN, "Host Down" }, { "unreachable", AU_NOTIFICATION_HOST_UNREACHABLE, "Host Unreachable" }, { "recovery", AU_NOTIFICATION_HOST_RECOVERY, "Host Recovery" }, { "hostcustom", AU_NOTIFICATION_HOST_CUSTOM, "Host Custom" }, { "hostack", AU_NOTIFICATION_HOST_ACK, "Host Acknowledgement" }, { "hostflapstart", AU_NOTIFICATION_HOST_FLAPPING_START, "Host Flapping Start" }, { "hostflapstop", AU_NOTIFICATION_HOST_FLAPPING_STOP, "Host Flapping Stop" }, { NULL, -1, NULL }, }; const string_value_mapping valid_service_notification_types[] = { { "nodata", AU_NOTIFICATION_NO_DATA, "No Data" }, { "critical", AU_NOTIFICATION_SERVICE_CRITICAL, "Service Critical" }, { "warning", AU_NOTIFICATION_SERVICE_WARNING, "Service Warning" }, { "recovery", AU_NOTIFICATION_SERVICE_RECOVERY, "Service Recovery" }, { "custom", AU_NOTIFICATION_SERVICE_CUSTOM, "Service Custom" }, { "serviceack", AU_NOTIFICATION_SERVICE_ACK, "Service Acknowledgement" }, { "serviceflapstart", AU_NOTIFICATION_SERVICE_FLAPPING_START, "Service Flapping Start" }, { "serviceflapstop", AU_NOTIFICATION_SERVICE_FLAPPING_STOP, "Service Flapping Stop" }, { "unknown", AU_NOTIFICATION_SERVICE_UNKNOWN, "Service Unknown" }, { NULL, -1, NULL }, }; option_help archive_json_help[] = { { "query", "Query", "enumeration", { "all", NULL }, { NULL }, NULL, "Specifies the type of query to be executed.", valid_queries }, { "formatoptions", "Format Options", "list", { NULL }, { "all", NULL }, NULL, "Specifies the formatting options to be used when displaying the results. Multiple options are allowed and are separated by a plus (+) sign..", svm_format_options }, { "start", "Start", "integer", { NULL }, { "alertlist", "notificationlist", "statechangelist", NULL }, NULL, "Specifies the index (zero-based) of the first object in the list to be returned.", NULL }, { "count", "Count", "integer", { NULL }, { "alertlist", "notificationlist", "statechangelist", NULL }, NULL, "Specifies the number of objects in the list to be returned.", NULL }, { "dateformat", "Date Format", "string", { NULL }, { "all", NULL }, NULL, "strftime format string for values of type time_t. In the absence of a format, the Javascript default format of the number of milliseconds since the beginning of the Unix epoch is used. Because of URL encoding, percent signs must be encoded as %25 and a space must be encoded as a plus (+) sign.", NULL }, { "objecttypes", "Object Types", "list", { NULL }, { "alertcount", "alertlist", "notificationcount", "notificationlist", NULL }, NULL, "Type(s) of object to be included in query results.", valid_object_types }, { "objecttype", "Object Type", "enumeration", { "statechangelist", NULL }, { NULL }, NULL, "Type of object to be included in query results.", valid_object_types }, { "availabilityobjecttype", "Availability Object Type", "enumeration", { "availability", NULL }, { NULL }, NULL, "Type of object to be included in query results.", valid_availability_object_types }, { "statetypes", "State Types", "list", { NULL }, { "alertcount", "alertlist", "statechangelist", "availability", NULL }, NULL, "Type(s) of states to be included in query results.", valid_state_types }, { "hoststates", "Host States", "list", { NULL }, { "alertcount", "alertlist", NULL }, NULL, "Host states to be included in query results.", valid_host_states }, { "servicestates", "Service States", "list", { NULL }, { "alertcount", "alertlist", NULL }, NULL, "Service states to be included in query results.", valid_service_states }, { "hostnotificationtypes", "Host Notification Types", "list", { NULL }, { "notificationcount", "notificationlist", NULL }, NULL, "Host notification types to be included in query results.", valid_host_notification_types }, { "servicenotificationtypes", "Service Notification Types", "list", { NULL }, { "notificationcount", "notificationlist", NULL }, NULL, "Service notification types to be included in query results.", valid_service_notification_types }, { "parenthost", "Parent Host", "nagios:objectjson/hostlist", { NULL }, { "alertcount", "alertlist", "notificationcount", "notificationlist", NULL }, NULL, "Limits the hosts or services returned to those whose host parent is specified. A value of 'none' returns all hosts or services reachable directly by the Nagios core host.", parent_host_extras }, { "childhost", "Child Host", "nagios:objectjson/hostlist", { NULL }, { "alertcount", "alertlist", "notificationcount", "notificationlist", NULL }, NULL, "Limits the hosts or services returned to those whose having the host specified as a child host. A value of 'none' returns all hosts or services with no child hosts.", child_host_extras }, { "hostname", "Host Name", "nagios:objectjson/hostlist", { "statechangelist", NULL }, { "alertcount", "alertlist", "notificationcount", "notificationlist", "availability", NULL }, NULL, "Name for the host requested. For availability reports if the " "availability object type is hosts and the hostname is not " "specified, the report will be generated for all hosts. Likewise, " "if the availability object type is services and the hostname is not " "specified, the report will be generated for all services or all " "services with the same description, depending on the value for " "service description.", NULL }, { "hostgroup", "Host Group", "nagios:objectjson/hostgrouplist", { NULL }, { "alertcount", "alertlist", "notificationcount", "notificationlist", "availability", NULL }, NULL, "Returns information applicable to the hosts in the hostgroup.", NULL }, { "servicegroup", "Service Group", "nagios:objectjson/servicegrouplist", { NULL }, { "alertcount", "alertlist", "notificationcount", "notificationlist", "availability", NULL }, NULL, "Returns information applicable to the services in the servicegroup.", NULL }, { "servicedescription", "Service Description", "nagios:objectjson/servicelist", { NULL }, { "alertcount", "alertlist", "notificationcount", "notificationlist", "statechangelist", "availability", NULL }, "hostname", "Description for the service requested. For availability reports, " "if the availability object type is services and the " "servicedescription is not specified, the report will be generated " "either for all services or for all services on the specified host, " "depending on the value specified for hostname", NULL }, { "contactname", "Contact Name", "nagios:objectjson/contactlist", { NULL }, { "alertcount", "alertlist", "notificationcount", "notificationlist", NULL }, NULL, "Name for the contact requested.", NULL }, { "contactgroup", "Contact Group", "nagios:objectjson/contactgrouplist", { NULL }, { "alertcount", "alertlist", "notificationcount", "notificationlist", NULL }, NULL, "Returns information applicable to the contacts in the contactgroup.", NULL }, { "notificationmethod", "Notification Method", "nagios:objectjson/commandlist", { NULL }, { "notificationcount", "notificationlist", NULL }, NULL, "Returns objects that match the notification method.", NULL }, { "timeperiod", "Report Time Period", "nagios:objectjson/timeperiodlist", { NULL }, { "availability", NULL }, NULL, "Timeperiod to use for the report.", NULL }, { "assumeinitialstate", "Assume Initial State", "boolean", { NULL }, { "availability", NULL }, NULL, "Assume the initial state for the host(s) or service(s). Note that if true, assuming the initial state will be done only if the initial state could not be discovered by looking through the backtracked logs.", NULL }, { "assumestateretention", "Assume State Retention", "boolean", { NULL }, { "availability", NULL }, NULL, "Assume states are retained.", NULL }, { "assumestatesduringnagiosdowntime", "Assume States During Nagios Downtime", "boolean", { NULL }, { "availability", NULL }, NULL, "Assume states are retained during Nagios downtime.", NULL }, { "assumedinitialhoststate", "Assumed Initial Host State", "enumeration", { NULL }, { "availability", NULL }, NULL, "Host state assumed when it is not possible to determine the initial host state.", valid_initial_host_states }, { "assumedinitialservicestate", "Assumed Initial Service State", "enumeration", { NULL }, { "availability", NULL }, NULL, "Service state assumed when it is not possible to determine the initial service state.", valid_initial_service_states }, { "backtrackedarchives", "Backtracked Archives", "integer", { NULL }, { "alertcount", "alertlist", "notificationcount", "notificationlist", "statechangelist", "availability", NULL }, NULL, "Number of backtracked archives to read in an attempt to find initial states.", NULL, }, { "starttime", "Start Time", "integer", { "alertcount", "alertlist", "notificationcount", "notificationlist", "statechangelist", "availability", NULL }, { NULL }, NULL, "Starting time to use. Supplying a plus or minus sign means times relative to the query time.", NULL, }, { "endtime", "End Time", "integer", { "alertcount", "alertlist", "notificationcount", "notificationlist", "statechangelist", "availability", NULL }, { NULL }, NULL, "Ending time to use. Specifying plus or minus sign means times relative to the query time.", NULL, }, { /* The last entry must contain all NULL entries */ NULL, NULL, NULL, { NULL }, { NULL }, NULL, NULL, NULL }, }; extern const json_escape percent_escapes; int json_archive_alert_passes_selection(time_t, time_t, time_t, int, int, au_host *, char *, au_service *, char *, int, host *, int, host *, hostgroup *, servicegroup *, contact *, contactgroup *, unsigned, unsigned, unsigned, unsigned, unsigned); json_object *json_archive_alert_selectors(unsigned, int, int, time_t, time_t, int, char *, char *, int, host *, int, host *, hostgroup *, servicegroup *, contact *, contactgroup *, unsigned, unsigned, unsigned); int json_archive_notification_passes_selection(time_t, time_t, time_t, int, int, au_host *, char *, au_service *, char *, int, host *, int, host *, hostgroup *, servicegroup *, au_contact *, char *, contactgroup *, unsigned, unsigned, unsigned, char *, char *); json_object *json_archive_notification_selectors(unsigned, int, int, time_t, time_t, int, char *, char *, int, host *, int, host *, hostgroup *, servicegroup *, char *, contactgroup *, unsigned, unsigned, char *); int json_archive_statechange_passes_selection(time_t, time_t, int, int, au_host *, char *, au_service *, char *, unsigned, unsigned); json_object *json_archive_statechange_selectors(unsigned, int, int, time_t, time_t, int, char *, char *, unsigned); int get_initial_nagios_state(au_linked_list *, time_t, time_t); int get_initial_downtime_state(au_linked_list *, time_t, time_t); int get_initial_subject_state(au_linked_list *, time_t, time_t); int get_log_entry_state(au_log_entry *); int have_data(au_linked_list *, int); void compute_window_availability(time_t, time_t, int, int, int, timeperiod *, au_availability *, int, int, int); static void compute_availability(au_linked_list *, time_t, time_t, time_t, timeperiod *, au_availability *, int, int, int, int); void compute_host_availability(time_t, time_t, time_t, au_log *, au_host *, timeperiod *, int, int, int, int); void compute_service_availability(time_t, time_t, time_t, au_log *, au_service *, timeperiod *, int, int, int, int); json_object *json_archive_single_host_availability(unsigned, time_t, time_t, time_t, char *, timeperiod *, int, int, int, int, unsigned, au_log *); json_object *json_archive_single_service_availability(unsigned, time_t, time_t, time_t, char *, char *, timeperiod *, int, int, int, int, unsigned, au_log *); json_object *json_archive_host_availability(unsigned, char *, au_availability *); json_object *json_archive_service_availability(unsigned, char *, char *, au_availability *); int main(void) { int result = OK; time_t query_time; archive_json_cgi_data cgi_data; json_object *json_root; au_log *log; time_t last_archive_data_update = (time_t)0; json_object_member *romp = NULL; /* The official time of the query */ time(&query_time); json_root = json_new_object(); if(NULL == json_root) { printf( "Failed to create new json object\n"); exit( 1); } json_object_append_integer(json_root, "format_version", OUTPUT_FORMAT_VERSION); /* Initialize shared configuration variables */ init_shared_cfg_vars(1); init_cgi_data(&cgi_data); document_header(); /* get the arguments passed in the URL */ result = process_cgivars(json_root, &cgi_data, query_time); if(result != RESULT_SUCCESS) { json_object_append_object(json_root, "data", json_help(archive_json_help)); json_object_print(json_root, 0, 1, cgi_data.strftime_format, cgi_data.format_options); document_footer(); return result; } /* reset internal variables */ reset_cgi_vars(); /* read the CGI configuration file */ result = read_cgi_config_file(get_cgi_config_location()); if(result == ERROR) { json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), (time_t)-1, NULL, RESULT_FILE_OPEN_READ_ERROR, "Error: Could not open CGI configuration file '%s' for reading!", get_cgi_config_location())); json_object_append_object(json_root, "data", json_help(archive_json_help)); json_object_print(json_root, 0, 1, cgi_data.strftime_format, cgi_data.format_options); document_footer(); return ERROR; } /* read the main configuration file */ result = read_main_config_file(main_config_file); if(result == ERROR) { json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), (time_t)-1, NULL, RESULT_FILE_OPEN_READ_ERROR, "Error: Could not open main configuration file '%s' for reading!", main_config_file)); json_object_append_object(json_root, "data", json_help(archive_json_help)); document_footer(); return ERROR; } /* Set the number of backtracked archives if it wasn't specified by the user */ if(0 == cgi_data.backtracked_archives) { switch(log_rotation_method) { case LOG_ROTATION_MONTHLY: cgi_data.backtracked_archives = 1; break; case LOG_ROTATION_WEEKLY: cgi_data.backtracked_archives = 2; break; case LOG_ROTATION_DAILY: cgi_data.backtracked_archives = 4; break; case LOG_ROTATION_HOURLY: cgi_data.backtracked_archives = 8; break; default: cgi_data.backtracked_archives = 2; break; } } /* read all object configuration data */ result = read_all_object_configuration_data(main_config_file, READ_ALL_OBJECT_DATA); if(result == ERROR) { json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), (time_t)-1, NULL, RESULT_FILE_OPEN_READ_ERROR, "Error: Could not read some or all object configuration data!")); json_object_append_object(json_root, "data", json_help(archive_json_help)); document_footer(); return ERROR; } /* read all status data */ result = read_all_status_data(status_file, READ_ALL_STATUS_DATA); if(result == ERROR) { json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), (time_t)-1, NULL, RESULT_FILE_OPEN_READ_ERROR, "Error: Could not read host and service status information!")); json_object_append_object(json_root, "data", json_help(archive_json_help)); document_footer(); return ERROR; } /* validate arguments in URL */ result = validate_arguments(json_root, &cgi_data, query_time); if((result != RESULT_SUCCESS) && (result != RESULT_OPTION_IGNORED)) { json_object_append_object(json_root, "data", json_help(archive_json_help)); json_object_print(json_root, 0, 1, cgi_data.strftime_format, cgi_data.format_options); document_footer(); return ERROR; } /* get authentication information */ get_authentication_information(¤t_authdata); /* Allocate the structure for the logs */ if((log = au_init_log()) == NULL) { json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), (time_t)-1, ¤t_authdata, RESULT_MEMORY_ALLOCATION_ERROR, "Unable to allocate memory for log data.")); json_object_append_object(json_root, "data", json_help(archive_json_help)); document_footer(); return ERROR; } /* Return something to the user */ switch( cgi_data.query) { case ARCHIVE_QUERY_HELP: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), compile_time(__DATE__, __TIME__), ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_help(archive_json_help)); break; case ARCHIVE_QUERY_ALERTCOUNT: read_archived_data(cgi_data.start_time, cgi_data.end_time, cgi_data.backtracked_archives, AU_OBJTYPE_ALL, AU_STATETYPE_ALL, AU_LOGTYPE_ALERT | AU_LOGTYPE_STATE, log, &last_archive_data_update); if(result != RESULT_OPTION_IGNORED) { json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_archive_data_update, ¤t_authdata, RESULT_SUCCESS, "")); } else { romp = json_get_object_member(json_root, "result"); json_object_append_time_t(romp->value.object, "last_data_update", last_archive_data_update); } json_object_append_object(json_root, "data", json_archive_alertcount(cgi_data.format_options, cgi_data.start_time, cgi_data.end_time, cgi_data.object_types, cgi_data.host_name, cgi_data.service_description, cgi_data.use_parent_host, cgi_data.parent_host, cgi_data.use_child_host, cgi_data.child_host, cgi_data.hostgroup, cgi_data.servicegroup, cgi_data.contact, cgi_data.contactgroup, cgi_data.state_types, cgi_data.host_states, cgi_data.service_states, log)); break; case ARCHIVE_QUERY_ALERTLIST: read_archived_data(cgi_data.start_time, cgi_data.end_time, cgi_data.backtracked_archives, AU_OBJTYPE_ALL, AU_STATETYPE_ALL, AU_LOGTYPE_ALERT | AU_LOGTYPE_STATE, log, &last_archive_data_update); if(result != RESULT_OPTION_IGNORED) { json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_archive_data_update, ¤t_authdata, RESULT_SUCCESS, "")); } else { romp = json_get_object_member(json_root, "result"); json_object_append_time_t(romp->value.object, "last_data_update", last_archive_data_update); } json_object_append_object(json_root, "data", json_archive_alertlist(cgi_data.format_options, cgi_data.start, cgi_data.count, cgi_data.start_time, cgi_data.end_time, cgi_data.object_types, cgi_data.host_name, cgi_data.service_description, cgi_data.use_parent_host, cgi_data.parent_host, cgi_data.use_child_host, cgi_data.child_host, cgi_data.hostgroup, cgi_data.servicegroup, cgi_data.contact, cgi_data.contactgroup, cgi_data.state_types, cgi_data.host_states, cgi_data.service_states, log)); break; case ARCHIVE_QUERY_NOTIFICATIONCOUNT: read_archived_data(cgi_data.start_time, cgi_data.end_time, cgi_data.backtracked_archives, AU_OBJTYPE_ALL, AU_STATETYPE_ALL, AU_LOGTYPE_NOTIFICATION, log, &last_archive_data_update); if(result != RESULT_OPTION_IGNORED) { json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_archive_data_update, ¤t_authdata, RESULT_SUCCESS, "")); } else { romp = json_get_object_member(json_root, "result"); json_object_append_time_t(romp->value.object, "last_data_update", last_archive_data_update); } json_object_append_object(json_root, "data", json_archive_notificationcount(cgi_data.format_options, cgi_data.start_time, cgi_data.end_time, cgi_data.object_types, cgi_data.host_name, cgi_data.service_description, cgi_data.use_parent_host, cgi_data.parent_host, cgi_data.use_child_host, cgi_data.child_host, cgi_data.hostgroup, cgi_data.servicegroup, cgi_data.contact_name, cgi_data.contactgroup, cgi_data.host_notification_types, cgi_data.service_notification_types, cgi_data.notification_method, log)); break; case ARCHIVE_QUERY_NOTIFICATIONLIST: read_archived_data(cgi_data.start_time, cgi_data.end_time, cgi_data.backtracked_archives, AU_OBJTYPE_ALL, AU_STATETYPE_ALL, AU_LOGTYPE_NOTIFICATION, log, &last_archive_data_update); if(result != RESULT_OPTION_IGNORED) { json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_archive_data_update, ¤t_authdata, RESULT_SUCCESS, "")); } else { romp = json_get_object_member(json_root, "result"); json_object_append_time_t(romp->value.object, "last_data_update", last_archive_data_update); } json_object_append_object(json_root, "data", json_archive_notificationlist(cgi_data.format_options, cgi_data.start, cgi_data.count, cgi_data.start_time, cgi_data.end_time, cgi_data.object_types, cgi_data.host_name, cgi_data.service_description, cgi_data.use_parent_host, cgi_data.parent_host, cgi_data.use_child_host, cgi_data.child_host, cgi_data.hostgroup, cgi_data.servicegroup, cgi_data.contact_name, cgi_data.contactgroup, cgi_data.host_notification_types, cgi_data.service_notification_types, cgi_data.notification_method, log)); break; case ARCHIVE_QUERY_STATECHANGELIST: read_archived_data(cgi_data.start_time, cgi_data.end_time, cgi_data.backtracked_archives, cgi_data.object_type, AU_STATETYPE_ALL, (AU_LOGTYPE_ALERT | AU_LOGTYPE_STATE), log, &last_archive_data_update); if(result != RESULT_OPTION_IGNORED) { json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_archive_data_update, ¤t_authdata, RESULT_SUCCESS, "")); } else { romp = json_get_object_member(json_root, "result"); json_object_append_time_t(romp->value.object, "last_data_update", last_archive_data_update); } json_object_append_object(json_root, "data", json_archive_statechangelist(cgi_data.format_options, cgi_data.start, cgi_data.count, cgi_data.start_time, cgi_data.end_time, cgi_data.object_type, cgi_data.host_name, cgi_data.service_description, cgi_data.assumed_initial_host_state, cgi_data.assumed_initial_service_state, cgi_data.state_types, log)); break; case ARCHIVE_QUERY_AVAILABILITY: switch(cgi_data.object_type) { case AU_OBJTYPE_HOST: case AU_OBJTYPE_HOSTGROUP: read_archived_data(cgi_data.start_time, cgi_data.end_time, cgi_data.backtracked_archives, AU_OBJTYPE_HOST, cgi_data.state_types, (AU_LOGTYPE_NAGIOS | AU_LOGTYPE_ALERT | AU_LOGTYPE_STATE | AU_LOGTYPE_DOWNTIME), log, &last_archive_data_update); break; case AU_OBJTYPE_SERVICE: case AU_OBJTYPE_SERVICEGROUP: read_archived_data(cgi_data.start_time, cgi_data.end_time, cgi_data.backtracked_archives, AU_OBJTYPE_SERVICE, cgi_data.state_types, (AU_LOGTYPE_NAGIOS | AU_LOGTYPE_ALERT | AU_LOGTYPE_STATE | AU_LOGTYPE_DOWNTIME), log, &last_archive_data_update); break; } if(result != RESULT_OPTION_IGNORED) { json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_archive_data_update, ¤t_authdata, RESULT_SUCCESS, "")); } else { romp = json_get_object_member(json_root, "result"); json_object_append_time_t(romp->value.object, "last_data_update", last_archive_data_update); } json_object_append_object(json_root, "data", json_archive_availability(cgi_data.format_options, query_time, cgi_data.start_time, cgi_data.end_time, cgi_data.object_type, cgi_data.host_name, cgi_data.service_description, cgi_data.hostgroup, cgi_data.servicegroup, cgi_data.timeperiod, cgi_data.assume_initial_state, cgi_data.assume_state_retention, cgi_data.assume_states_during_nagios_downtime, cgi_data.assumed_initial_host_state, cgi_data.assumed_initial_service_state, cgi_data.state_types, log)); break; default: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), (time_t)-1, ¤t_authdata, RESULT_OPTION_MISSING, "Error: Object Type not specified. See data for help.")); json_object_append_object(json_root, "data", json_help(archive_json_help)); break; } json_object_print(json_root, 0, 1, cgi_data.strftime_format, cgi_data.format_options); document_footer(); /* free all allocated memory */ free_cgi_data( &cgi_data); json_free_object(json_root, 1); au_free_log(log); free_memory(); return OK; } void document_header() { char date_time[MAX_DATETIME_LENGTH]; time_t expire_time; time_t current_time; time(¤t_time); printf("Cache-Control: no-store\r\n"); printf("Pragma: no-cache\r\n"); get_time_string(¤t_time, date_time, (int)sizeof(date_time), HTTP_DATE_TIME); printf("Last-Modified: %s\r\n", date_time); expire_time = (time_t)0L; get_time_string(&expire_time, date_time, (int)sizeof(date_time), HTTP_DATE_TIME); printf("Expires: %s\r\n", date_time); printf("Content-type: application/json; charset=utf-8\r\n\r\n"); return; } void document_footer(void) { printf( "\n"); return; } void init_cgi_data(archive_json_cgi_data *cgi_data) { cgi_data->format_options = 0; cgi_data->query = ARCHIVE_QUERY_INVALID; cgi_data->start = 0; cgi_data->count = 0; cgi_data->object_types = AU_OBJTYPE_ALL; cgi_data->object_type = 0; cgi_data->state_types = AU_STATETYPE_ALL; cgi_data->host_states = AU_STATE_HOST_ALL; cgi_data->service_states = AU_STATE_SERVICE_ALL; cgi_data->host_notification_types = AU_NOTIFICATION_HOST_ALL; cgi_data->service_notification_types = AU_NOTIFICATION_SERVICE_ALL; #if 0 cgi_data->details = 0; #endif cgi_data->strftime_format = NULL; cgi_data->start_time = (time_t)0; cgi_data->end_time = (time_t)0; cgi_data->parent_host_name = NULL; cgi_data->use_parent_host = 0; cgi_data->parent_host = NULL; cgi_data->child_host_name = NULL; cgi_data->use_child_host = 0; cgi_data->child_host = NULL; cgi_data->host_name = NULL; cgi_data->host = NULL; cgi_data->hostgroup_name = NULL; cgi_data->hostgroup = NULL; cgi_data->servicegroup_name = NULL; cgi_data->servicegroup = NULL; cgi_data->service_description = NULL; cgi_data->service = NULL; cgi_data->contact_name = NULL; cgi_data->contact = NULL; cgi_data->contactgroup_name = NULL; cgi_data->contactgroup = NULL; cgi_data->notification_method = NULL; cgi_data->timeperiod_name = NULL; cgi_data->timeperiod = NULL; cgi_data->assumed_initial_host_state = AU_STATE_NO_DATA; cgi_data->assumed_initial_service_state = AU_STATE_NO_DATA; cgi_data->assume_initial_state = 1; cgi_data->assume_state_retention = 1; cgi_data->assume_states_during_nagios_downtime = 1; cgi_data->backtracked_archives = 0; } void free_cgi_data(archive_json_cgi_data *cgi_data) { if(NULL != cgi_data->strftime_format) free( cgi_data->strftime_format); if(NULL != cgi_data->parent_host_name) free( cgi_data->parent_host_name); if(NULL != cgi_data->child_host_name) free( cgi_data->child_host_name); if(NULL != cgi_data->host_name) free( cgi_data->host_name); if(NULL != cgi_data->hostgroup_name) free( cgi_data->hostgroup_name); if(NULL != cgi_data->servicegroup_name) free(cgi_data->servicegroup_name); if(NULL != cgi_data->service_description) free(cgi_data->service_description); if(NULL != cgi_data->contact_name) free(cgi_data->contact_name); if(NULL != cgi_data->contactgroup_name) free(cgi_data->contactgroup_name); if(NULL != cgi_data->notification_method) free(cgi_data->notification_method); if(NULL != cgi_data->timeperiod_name) free(cgi_data->timeperiod_name); } int process_cgivars(json_object *json_root, archive_json_cgi_data *cgi_data, time_t query_time) { char **variables; int result = RESULT_SUCCESS; int x; authdata *authinfo = NULL; /* Currently always NULL because get_authentication_information() hasn't been called yet, but in case we want to use it in the future... */ variables = getcgivars(); for(x = 0; variables[x] != NULL; x++) { /* We set these each iteration because they could change with each iteration */ if(!strcmp(variables[x], "query")) { if((result = parse_enumeration_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], valid_queries, &(cgi_data->query))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "formatoptions")) { cgi_data->format_options = 0; if((result = parse_bitmask_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], svm_format_options, &(cgi_data->format_options))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "backtrackedarchives")) { if((result = parse_int_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->backtracked_archives))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "start")) { if((result = parse_int_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->start))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "count")) { if((result = parse_int_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->count))) != RESULT_SUCCESS) { break; } if(cgi_data->count == 0) { json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, RESULT_OPTION_VALUE_INVALID, "The count option value is invalid. " "It must be an integer greater than zero")); result = RESULT_OPTION_VALUE_INVALID; break; } x++; } else if(!strcmp(variables[x], "objecttype")) { if((result = parse_enumeration_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], valid_object_types, &(cgi_data->object_type))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "objecttypes")) { cgi_data->object_types = 0; if((result = parse_bitmask_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], valid_object_types, &(cgi_data->object_types))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "availabilityobjecttype")) { if((result = parse_enumeration_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], valid_availability_object_types, &(cgi_data->object_type))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "statetypes")) { cgi_data->state_types = 0; if((result = parse_bitmask_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], valid_state_types, &(cgi_data->state_types))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "hoststates")) { cgi_data->host_states = 0; if((result = parse_bitmask_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], valid_host_states, &(cgi_data->host_states))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "servicestates")) { cgi_data->service_states = 0; if((result = parse_bitmask_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], valid_service_states, &(cgi_data->service_states))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "hostnotificationtypes")) { cgi_data->host_notification_types = 0; if((result = parse_bitmask_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], valid_host_notification_types, &(cgi_data->host_notification_types))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "servicenotificationtypes")) { cgi_data->service_notification_types = 0; if((result = parse_bitmask_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], valid_service_notification_types, &(cgi_data->service_notification_types))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "parenthost")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->parent_host_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "childhost")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->child_host_name))) != RESULT_SUCCESS) { } x++; } else if(!strcmp(variables[x], "hostname")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->host_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "hostgroup")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->hostgroup_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "servicegroup")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->servicegroup_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "servicedescription")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->service_description))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "contactname")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->contact_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "contactgroup")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->contactgroup_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "notificationmethod")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->notification_method))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "timeperiod")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->timeperiod_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "assumeinitialstate")) { if((result = parse_boolean_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->assume_initial_state))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "assumestateretention")) { if((result = parse_boolean_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->assume_state_retention))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "assumestatesduringnagiosdowntime")) { if((result = parse_boolean_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->assume_states_during_nagios_downtime))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "assumedinitialhoststate")) { if((result = parse_enumeration_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], valid_initial_host_states, &(cgi_data->assumed_initial_host_state))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "assumedinitialservicestate")) { if((result = parse_enumeration_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], valid_initial_service_states, &(cgi_data->assumed_initial_service_state))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "dateformat")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->strftime_format))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "starttime")) { if((result = parse_time_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->start_time))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "endtime")) { if((result = parse_time_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->end_time))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "NagFormId")) ++x; else if(!strcmp(variables[x], "")); else { json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, RESULT_OPTION_INVALID, "Invalid option: '%s'.", variables[x])); result = RESULT_OPTION_INVALID; break; } } /* free memory allocated to the CGI variables */ free_cgivars(variables); return result; } int validate_arguments(json_object *json_root, archive_json_cgi_data *cgi_data, time_t query_time) { int result = RESULT_SUCCESS; host *temp_host = NULL; hostgroup *temp_hostgroup = NULL; servicegroup *temp_servicegroup = NULL; contactgroup *temp_contactgroup = NULL; timeperiod *temp_timeperiod = NULL; #if 0 service *temp_service = NULL; contact *temp_contact = NULL; command *temp_command = NULL; #endif authdata *authinfo = NULL; /* Currently always NULL because get_authentication_information() hasn't been called yet, but in case we want to use it in the future... */ /* Validate that required parameters were supplied */ switch(cgi_data->query) { case ARCHIVE_QUERY_HELP: break; case ARCHIVE_QUERY_ALERTCOUNT: case ARCHIVE_QUERY_ALERTLIST: if((0 == cgi_data->start_time) && (0 == cgi_data->end_time)) { result = RESULT_OPTION_MISSING; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "Start and/or end time must be supplied.")); } if(!(cgi_data->object_types & (AU_OBJTYPE_HOST | AU_OBJTYPE_SERVICE))) { result = RESULT_OPTION_MISSING; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "At least one object type must be supplied.")); } break; case ARCHIVE_QUERY_NOTIFICATIONCOUNT: case ARCHIVE_QUERY_NOTIFICATIONLIST: if((0 == cgi_data->start_time) && (0 == cgi_data->end_time)) { result = RESULT_OPTION_MISSING; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "Start and/or end time must be supplied.")); } if(!(cgi_data->object_types & (AU_OBJTYPE_HOST | AU_OBJTYPE_SERVICE))) { result = RESULT_OPTION_MISSING; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "At least one object type must be supplied.")); } break; case ARCHIVE_QUERY_STATECHANGELIST: if((0 == cgi_data->start_time) && (0 == cgi_data->end_time)) { result = RESULT_OPTION_MISSING; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "Start and/or end time must be supplied.")); } if(0 == cgi_data->object_type) { result = RESULT_OPTION_MISSING; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "Object type must be supplied.")); } if(NULL == cgi_data->host_name) { result = RESULT_OPTION_MISSING; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "Host name must be supplied.")); } if((AU_OBJTYPE_SERVICE == cgi_data->object_type) && (NULL == cgi_data->service_description)) { result = RESULT_OPTION_MISSING; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "Service description must be supplied.")); } break; case ARCHIVE_QUERY_AVAILABILITY: if((0 == cgi_data->start_time) && (0 == cgi_data->end_time)) { result = RESULT_OPTION_MISSING; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "Start and/or end time must be supplied.")); } if(0 == cgi_data->object_type) { result = RESULT_OPTION_MISSING; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "Availability object type must be supplied.")); } break; default: result = RESULT_OPTION_MISSING; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "Missing validation for object type %u.", cgi_data->query)); break; } /* Attempt to find the host object associated with host_name. Because we're looking at historical data, the host may no longer exist. */ if(NULL != cgi_data->host_name) { cgi_data->host = find_host(cgi_data->host_name); } /* Attempt to find the service object associated with host_name and service_description. Because we're looking at historical data, the service may no longer exist. */ if((NULL != cgi_data->host_name) && (NULL != cgi_data->service_description)) { cgi_data->service = find_service(cgi_data->host_name, cgi_data->service_description); } /* Validate the requested parent host */ if( NULL != cgi_data->parent_host_name) { if(strcmp(cgi_data->parent_host_name, "none")) { temp_host = find_host(cgi_data->parent_host_name); if( NULL == temp_host) { result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The parenthost '%s' could not be found.", cgi_data->parent_host_name)); } else { cgi_data->use_parent_host = 1; cgi_data->parent_host = temp_host; } } else { cgi_data->use_parent_host = 1; cgi_data->parent_host = NULL; } } /* Validate the requested child host */ if( NULL != cgi_data->child_host_name) { if(strcmp(cgi_data->child_host_name, "none")) { temp_host = find_host(cgi_data->child_host_name); if( NULL == temp_host) { result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The childhost '%s' could not be found.", cgi_data->child_host_name)); } else { cgi_data->use_child_host = 1; cgi_data->child_host = temp_host; } } else { cgi_data->use_child_host = 1; cgi_data->child_host = NULL; } } /* Validate the requested hostgroup */ if( NULL != cgi_data->hostgroup_name) { temp_hostgroup = find_hostgroup(cgi_data->hostgroup_name); if( NULL == temp_hostgroup) { result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The hostgroup '%s' could not be found.", cgi_data->hostgroup_name)); } else { cgi_data->hostgroup = temp_hostgroup; } } /* Validate the requested servicegroup */ if( NULL != cgi_data->servicegroup_name) { temp_servicegroup = find_servicegroup(cgi_data->servicegroup_name); if( NULL == temp_servicegroup) { result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The servicegroup '%s' could not be found.", cgi_data->servicegroup_name)); } else { cgi_data->servicegroup = temp_servicegroup; } } /* Attempt to find the contact object associated with contact_name. Because we're looking at historical data, the contact may no longer exist. */ if(NULL != cgi_data->contact_name) { cgi_data->contact = find_contact(cgi_data->contact_name); } /* Validate the requested contactgroup */ if( NULL != cgi_data->contactgroup_name) { temp_contactgroup = find_contactgroup(cgi_data->contactgroup_name); if( NULL == temp_contactgroup) { result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The contactgroup '%s' could not be found.", cgi_data->contactgroup_name)); } else { cgi_data->contactgroup = temp_contactgroup; } } /* Validate the requested timeperiod */ if( NULL != cgi_data->timeperiod_name) { temp_timeperiod = find_timeperiod(cgi_data->timeperiod_name); if( NULL == temp_timeperiod) { result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The timeperiod '%s' could not be found.", cgi_data->timeperiod_name)); } else { cgi_data->timeperiod = temp_timeperiod; } } /* Validate the requested start time is before the requested end time */ if((cgi_data->start_time > 0) && (cgi_data->end_time > 0) && ( cgi_data->start_time >= cgi_data->end_time)) { result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The requested start time must be before the end time.")); } /* If one or more host states were selected, but host objects were not, notify the user, but continue */ if((cgi_data->host_states != AU_STATE_HOST_ALL) && (!(cgi_data->object_types & AU_OBJTYPE_HOST))) { result = RESULT_OPTION_IGNORED; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The requested host states " "were ignored because host objects were not selected.")); } /* If one or more service states were selected, but service objects were not, notify the user but continue */ else if((cgi_data->service_states != AU_STATE_SERVICE_ALL) && (!(cgi_data->object_types & AU_OBJTYPE_SERVICE))) { result = RESULT_OPTION_IGNORED; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The requested service states " "were ignored because service objects were not selected.")); } /* If one or more host notification types were selected, but host objects were not, notify the user, but continue */ if((cgi_data->host_notification_types != AU_NOTIFICATION_HOST_ALL) && (!(cgi_data->object_types & AU_OBJTYPE_HOST))) { result = RESULT_OPTION_IGNORED; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The requested host notification types were ignored because host objects were not selected.")); } /* If one or more service notification types were selected, but service objects were not, notify the user but continue */ else if((cgi_data->service_notification_types != AU_NOTIFICATION_SERVICE_ALL) && (!(cgi_data->object_types & AU_OBJTYPE_SERVICE))) { result = RESULT_OPTION_IGNORED; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The requested service notification types were ignored because service objects were not selected.")); } return result; } int json_archive_alert_passes_selection(time_t timestamp, time_t start_time, time_t end_time, int current_object_type, int match_object_types, au_host *current_host, char *match_host, au_service *current_service, char *match_service, int use_parent_host, host *parent_host, int use_child_host, host *child_host, hostgroup *match_hostgroup, servicegroup *match_servicegroup, contact *match_contact, contactgroup *match_contactgroup, unsigned current_state_type, unsigned match_state_types, unsigned current_state, unsigned match_host_states, unsigned match_service_states) { host *temp_host; host *temp_host2; service *temp_service; contactgroupsmember *temp_contact_groupsmember; int found; if((start_time > 0) && (timestamp < start_time)) { return 0; } if((end_time > 0) && (timestamp > end_time)) { return 0; } /* Skip if we're not interested in the current state type */ if(!(current_state_type & match_state_types)) { return 0; } switch(current_object_type) { case AU_OBJTYPE_HOST: /* Skip if we're not interested in hosts */ if(!(match_object_types & AU_OBJTYPE_HOST)) { return 0; } /* Skip if user is not authorized for this host */ if((NULL != current_host->hostp) && (FALSE == is_authorized_for_host(current_host->hostp, ¤t_authdata))) { return 0; } /* Skip if we're not interested in the current host state */ if(!(current_state & match_host_states)) { return 0; } /* If a specific host name was specified, skip this host if it's name does not match the one specified */ if((NULL != match_host) && strcmp(current_host->name, match_host)) { return 0; } /* If a host parent was specified, skip this host if it's parent is not the parent host specified */ if((1 == use_parent_host) && (NULL != current_host->hostp) && FALSE == is_host_immediate_child_of_host(parent_host, current_host->hostp)) { return 0; } /* If a hostgroup was specified, skip this host if it is not a member of the hostgroup specified */ if((NULL != match_hostgroup) && (NULL != current_host->hostp) && ( FALSE == is_host_member_of_hostgroup(match_hostgroup, current_host->hostp))) { return 0; } /* If the contact was specified, skip this host if it does not have the contact specified */ if((NULL != match_contact) && (NULL != current_host->hostp) && (FALSE == is_contact_for_host(current_host->hostp, match_contact))) { return 0; } /* If the contact group was specified, skip this host if it does not have the contact group specified */ if((NULL != match_contactgroup) && (NULL != current_host->hostp)) { found = 0; for(temp_contact_groupsmember = current_host->hostp->contact_groups; temp_contact_groupsmember != NULL; temp_contact_groupsmember = temp_contact_groupsmember->next) { if(!strcmp(temp_contact_groupsmember->group_name, match_contactgroup->group_name)) { found = 1; break; } } if(0 == found) return 0; } /* If a child host was specified... */ if((1 == use_child_host) && (NULL != current_host->hostp)) { /* If the child host is "none", skip this host if it has children */ if(NULL == child_host) { for(temp_host2 = host_list; temp_host2 != NULL; temp_host2 = temp_host2->next) { if(TRUE == is_host_immediate_child_of_host(current_host->hostp, temp_host2)) { return 0; } } } /* Otherwise, skip this host if it does not have the specified host as a child */ else if(FALSE == is_host_immediate_child_of_host(current_host->hostp, child_host)) { return 0; } } break; case AU_OBJTYPE_SERVICE: /* Skip if we're not interested in services */ if(!(match_object_types & AU_OBJTYPE_SERVICE)) { return 0; } /* Skip if user is not authorized for this service */ if((NULL != current_service->servicep) && (FALSE == is_authorized_for_service(current_service->servicep, ¤t_authdata))) { return 0; } /* Skip if we're not interested in the current service state */ if(!(current_state & match_service_states)) { return 0; } /* If a specific host name was specified, skip this service if it's host name does not match the one specified */ if((NULL != match_host) && strcmp(current_service->host_name, match_host)) { return 0; } /* If a specific service description was specified, skip this service if it's description does not match the one specified */ if((NULL != match_service) && strcmp(current_service->description, match_service)) { return 0; } /* If a host parent was specified, skip this service if the parent of the host associated with it is not the parent host specified */ if((1 == use_parent_host) && (NULL != current_service->servicep)) { temp_host = find_host(current_service->servicep->host_name); if((NULL != temp_host) && (FALSE == is_host_immediate_child_of_host(parent_host, temp_host))) { return 0; } } /* If a hostgroup was specified, skip this service if it's host is not a member of the hostgroup specified */ if((NULL != match_hostgroup) && (NULL != current_service->servicep)) { temp_host = find_host(current_service->servicep->host_name); if((NULL != temp_host) && (FALSE == is_host_member_of_hostgroup(match_hostgroup, temp_host))) { return 0; } } /* If a servicegroup was specified, skip this service if it is not a member of the servicegroup specified */ if((NULL != match_servicegroup) && (NULL != current_service->servicep)) { temp_service = find_service(current_service->servicep->host_name, current_service->description); if((NULL != temp_service) && (FALSE == is_service_member_of_servicegroup(match_servicegroup, temp_service))) { return 0; } } /* If the contact was specified, skip this service if it does not have the contact specified */ if((NULL != match_contact) && (NULL != current_service->servicep) && (FALSE == is_contact_for_service(current_service->servicep, match_contact))) { return 0; } /* If the contact group was specified, skip this service if it does not have the contact group specified */ if((NULL != match_contactgroup) && (NULL != current_service->servicep)) { found = 0; for(temp_contact_groupsmember = current_service->servicep->contact_groups; temp_contact_groupsmember != NULL; temp_contact_groupsmember = temp_contact_groupsmember->next) { if(!strcmp(temp_contact_groupsmember->group_name, match_contactgroup->group_name)) { found = 1; break; } } if(0 == found) return 0; } /* If a child host was specified... */ if((1 == use_child_host) && (NULL != current_service->servicep)) { temp_host = find_host(current_service->servicep->host_name); if(NULL != temp_host) { /* If the child host is "none", skip this service if it's host has children */ if(NULL == child_host) { for(temp_host2 = host_list; temp_host2 != NULL; temp_host2 = temp_host2->next) { if(TRUE == is_host_immediate_child_of_host(temp_host, temp_host2)) { return 0; } } } /* Otherwise, skip this service if it's host does not have the specified host as a child */ else if(FALSE == is_host_immediate_child_of_host(temp_host, child_host)) { return 0; } } } break; } return 1; } json_object * json_archive_alert_selectors(unsigned format_options, int start, int count, time_t start_time, time_t end_time, int object_types, char *match_host, char *match_service, int use_parent_host, host *parent_host, int use_child_host, host *child_host, hostgroup *match_hostgroup, servicegroup *match_servicegroup, contact *match_contact, contactgroup *match_contactgroup, unsigned match_state_types, unsigned match_host_states, unsigned match_service_states) { json_object *json_selectors; json_selectors = json_new_object(); if( start > 0) { json_object_append_integer(json_selectors, "start", start); } if( count > 0) { json_object_append_integer(json_selectors, "count", count); } if(start_time > 0) { json_object_append_time_t(json_selectors, "starttime", start_time); } if(end_time > 0) { json_object_append_time_t(json_selectors, "endtime", end_time); } if(object_types != AU_OBJTYPE_ALL) { json_bitmask(json_selectors, format_options, "objecttypes", object_types, valid_object_types); } if(match_state_types != AU_STATETYPE_ALL) { json_bitmask(json_selectors, format_options, "statetypes", match_state_types, valid_state_types); } if((object_types & AU_OBJTYPE_HOST) && (match_host_states != AU_STATE_HOST_ALL)) { json_bitmask(json_selectors, format_options, "hoststates", match_host_states, valid_host_states); } if((object_types & AU_OBJTYPE_SERVICE) && (match_service_states != AU_STATE_SERVICE_ALL)) { json_bitmask(json_selectors, format_options, "servicestates", match_service_states, valid_service_states); } if(NULL != match_host) { json_object_append_string(json_selectors, "hostname", &percent_escapes, match_host); } if(NULL != match_service) { json_object_append_string(json_selectors, "servicedescription", &percent_escapes, match_service); } if(1 == use_parent_host) { json_object_append_string(json_selectors, "parenthost", &percent_escapes, ( NULL == parent_host ? "none" : parent_host->name)); } if( 1 == use_child_host) { json_object_append_string(json_selectors, "childhost", &percent_escapes, ( NULL == child_host ? "none" : child_host->name)); } if(NULL != match_hostgroup) { json_object_append_string(json_selectors, "hostgroup", &percent_escapes, match_hostgroup->group_name); } if((object_types & AU_OBJTYPE_SERVICE) && (NULL != match_servicegroup)) { json_object_append_string(json_selectors, "servicegroup", &percent_escapes, match_servicegroup->group_name); } if(NULL != match_contact) { json_object_append_string(json_selectors, "contact", &percent_escapes, match_contact->name); } if(NULL != match_contactgroup) { json_object_append_string(json_selectors, "contactgroup", &percent_escapes, match_contactgroup->group_name); } return json_selectors; } json_object * json_archive_alertcount(unsigned format_options, time_t start_time, time_t end_time, int object_types, char *match_host, char *match_service, int use_parent_host, host *parent_host, int use_child_host, host *child_host, hostgroup *match_hostgroup, servicegroup *match_servicegroup, contact *match_contact, contactgroup *match_contactgroup, unsigned match_state_types, unsigned match_host_states, unsigned match_service_states, au_log *log) { json_object *json_data; au_node *temp_node; au_log_entry *temp_entry; au_log_alert *temp_alert_log; au_host *temp_host = NULL; au_service *temp_service = NULL; int count = 0; json_data = json_new_object(); json_object_append_object(json_data, "selectors", json_archive_alert_selectors(format_options, 0, 0, start_time, end_time, object_types, match_host, match_service, use_parent_host, parent_host, use_child_host, child_host, match_hostgroup, match_servicegroup, match_contact, match_contactgroup, match_state_types, match_host_states, match_service_states)); for(temp_node = log->entry_list->head; temp_node != NULL; temp_node = temp_node->next) { temp_entry = (au_log_entry *)temp_node->data; /* Skip all but alert type messages */ if(AU_LOGTYPE_ALERT != temp_entry->entry_type) continue; /* Get the host/service object */ temp_alert_log = (au_log_alert *)temp_entry->entry; switch(temp_alert_log->obj_type) { case AU_OBJTYPE_HOST: temp_host = (au_host *)temp_alert_log->object; temp_service = NULL; break; case AU_OBJTYPE_SERVICE: temp_host = NULL; temp_service = (au_service *)temp_alert_log->object; break; } /* Skip anything that does not pass the alert selection criteria */ if(json_archive_alert_passes_selection(temp_entry->timestamp, start_time, end_time, temp_alert_log->obj_type, object_types, temp_host, match_host, temp_service, match_service, use_parent_host, parent_host, use_child_host, child_host, match_hostgroup, match_servicegroup, match_contact, match_contactgroup, temp_alert_log->state_type, match_state_types, temp_alert_log->state, match_host_states, match_service_states) == 0) { continue; } count++; } json_object_append_integer(json_data, "count", count); return json_data; } json_object * json_archive_alertlist(unsigned format_options, int start, int count, time_t start_time, time_t end_time, int object_types, char *match_host, char *match_service, int use_parent_host, host *parent_host, int use_child_host, host *child_host, hostgroup *match_hostgroup, servicegroup *match_servicegroup, contact *match_contact, contactgroup *match_contactgroup, unsigned match_state_types, unsigned match_host_states, unsigned match_service_states, au_log *log) { json_object *json_data; json_array *json_alertlist; json_object *json_alert_details; au_node *temp_node; au_log_entry *temp_entry; au_log_alert *temp_alert_log; au_host *temp_host = NULL; au_service *temp_service = NULL; int current = 0; int counted = 0; json_data = json_new_object(); json_object_append_object(json_data, "selectors", json_archive_alert_selectors(format_options, start, count, start_time, end_time, object_types, match_host, match_service, use_parent_host, parent_host, use_child_host, child_host, match_hostgroup, match_servicegroup, match_contact, match_contactgroup, match_state_types, match_host_states, match_service_states)); json_alertlist = json_new_array(); for(temp_node = log->entry_list->head; temp_node != NULL; temp_node = temp_node->next) { temp_entry = (au_log_entry *)temp_node->data; /* Skip all but alert type messages */ if(AU_LOGTYPE_ALERT != temp_entry->entry_type) continue; /* Get the host/service object */ temp_alert_log = (au_log_alert *)temp_entry->entry; switch(temp_alert_log->obj_type) { case AU_OBJTYPE_HOST: temp_host = (au_host *)temp_alert_log->object; temp_service = NULL; break; case AU_OBJTYPE_SERVICE: temp_host = NULL; temp_service = (au_service *)temp_alert_log->object; break; } /* Skip anything that does not pass the alert selection criteria */ if(json_archive_alert_passes_selection(temp_entry->timestamp, start_time, end_time, temp_alert_log->obj_type, object_types, temp_host, match_host, temp_service, match_service, use_parent_host, parent_host, use_child_host, child_host, match_hostgroup, match_servicegroup, match_contact, match_contactgroup, temp_alert_log->state_type, match_state_types, temp_alert_log->state, match_host_states, match_service_states) == 0) { continue; } /* If the current item passes the start and limit tests, display it */ if( passes_start_and_count_limits(start, count, current, counted)) { json_alert_details = json_new_object(); json_archive_alert_details(json_alert_details, format_options, temp_entry->timestamp, (au_log_alert *)temp_entry->entry); json_array_append_object(json_alertlist, json_alert_details); counted++; } current++; } json_object_append_array(json_data, "alertlist", json_alertlist); return json_data; } void json_archive_alert_details(json_object *json_details, unsigned format_options, time_t timestamp, au_log_alert *temp_alert) { au_host *temp_host; au_service *temp_service; json_object_append_time_t(json_details, "timestamp", timestamp); json_enumeration(json_details, format_options, "object_type", temp_alert->obj_type, svm_au_object_types); switch(temp_alert->obj_type) { case AU_OBJTYPE_HOST: temp_host = (au_host *)temp_alert->object; json_object_append_string(json_details, "name", &percent_escapes, temp_host->name); break; case AU_OBJTYPE_SERVICE: temp_service = (au_service *)temp_alert->object; json_object_append_string(json_details, "host_name", &percent_escapes, temp_service->host_name); json_object_append_string(json_details, "description", &percent_escapes, temp_service->description); break; } json_enumeration(json_details, format_options, "state_type", temp_alert->state_type, svm_au_state_types); json_enumeration(json_details, format_options, "state", temp_alert->state, svm_au_states); json_object_append_string(json_details, "plugin_output", &percent_escapes, temp_alert->plugin_output); } int json_archive_notification_passes_selection(time_t timestamp, time_t start_time, time_t end_time, int current_object_type, int match_object_types, au_host *current_host, char *match_host, au_service *current_service, char *match_service, int use_parent_host, host *parent_host, int use_child_host, host *child_host, hostgroup *match_hostgroup, servicegroup *match_servicegroup, au_contact *current_contact, char *match_contact, contactgroup *match_contactgroup, unsigned current_notification_type, unsigned match_host_notification_types, unsigned match_service_notification_types, char *current_notification_method, char *match_notification_method) { host *temp_host; host *temp_host2; service *temp_service; contactgroupsmember *temp_contact_groupsmember; int found; if((start_time > 0) && (timestamp < start_time)) { return 0; } if((end_time > 0) && (timestamp > end_time)) { return 0; } /* If the contact was specified, skip this notification if it does not have the contact specified */ if((NULL != match_contact) && (NULL != current_contact) && strcmp(current_contact->name, match_contact)) { return 0; } /* If the notification method was specified, skip this notification if it does not have the method specified */ if((NULL != match_notification_method) && (NULL != current_notification_method) && strcmp(current_notification_method, match_notification_method)) { return 0; } switch(current_object_type) { case AU_OBJTYPE_HOST: /* Skip if we're not interested in hosts */ if(!(match_object_types & AU_OBJTYPE_HOST)) { return 0; } /* Skip if user is not authorized for this host */ if((NULL != current_host->hostp) && (FALSE == is_authorized_for_host(current_host->hostp, ¤t_authdata))) { return 0; } /* Skip if we're not interested in the current host notification type */ if(!(current_notification_type & match_host_notification_types)) { return 0; } /* If a specific host name was specified, skip this host if it's name does not match the one specified */ if((NULL != match_host) && strcmp(current_host->name, match_host)) { return 0; } /* If a host parent was specified, skip this host if it's parent is not the parent host specified */ if((1 == use_parent_host) && (NULL != current_host->hostp) && FALSE == is_host_immediate_child_of_host(parent_host, current_host->hostp)) { return 0; } /* If a hostgroup was specified, skip this host if it is not a member of the hostgroup specified */ if((NULL != match_hostgroup) && (NULL != current_host->hostp) && ( FALSE == is_host_member_of_hostgroup(match_hostgroup, current_host->hostp))) { return 0; } /* If the contact group was specified, skip this host if it does not have the contact group specified */ if((NULL != match_contactgroup) && (NULL != current_host->hostp)) { found = 0; for(temp_contact_groupsmember = current_host->hostp->contact_groups; temp_contact_groupsmember != NULL; temp_contact_groupsmember = temp_contact_groupsmember->next) { if(!strcmp(temp_contact_groupsmember->group_name, match_contactgroup->group_name)) { found = 1; break; } } if(0 == found) return 0; } /* If a child host was specified... */ if((1 == use_child_host) && (NULL != current_host->hostp)) { /* If the child host is "none", skip this host if it has children */ if(NULL == child_host) { for(temp_host2 = host_list; temp_host2 != NULL; temp_host2 = temp_host2->next) { if(TRUE == is_host_immediate_child_of_host(current_host->hostp, temp_host2)) { return 0; } } } /* Otherwise, skip this host if it does not have the specified host as a child */ else if(FALSE == is_host_immediate_child_of_host(current_host->hostp, child_host)) { return 0; } } break; case AU_OBJTYPE_SERVICE: /* Skip if we're not interested in services */ if(!(match_object_types & AU_OBJTYPE_SERVICE)) { return 0; } /* Skip if user is not authorized for this service */ if((NULL != current_service->servicep) && (FALSE == is_authorized_for_service(current_service->servicep, ¤t_authdata))) { return 0; } /* Skip if we're not interested in the current service notification type */ if(!(current_notification_type & match_service_notification_types)) { return 0; } /* If a specific host name was specified, skip this service if it's host name does not match the one specified */ if((NULL != match_host) && strcmp(current_service->host_name, match_host)) { return 0; } /* If a specific service description was specified, skip this service if it's description does not match the one specified */ if((NULL != match_service) && strcmp(current_service->description, match_service)) { return 0; } /* If a host parent was specified, skip this service if the parent of the host associated with it is not the parent host specified */ if((1 == use_parent_host) && (NULL != current_service->servicep)) { temp_host = find_host(current_service->servicep->host_name); if((NULL != temp_host) && (FALSE == is_host_immediate_child_of_host(parent_host, temp_host))) { return 0; } } /* If a hostgroup was specified, skip this service if it's host is not a member of the hostgroup specified */ if((NULL != match_hostgroup) && (NULL != current_service->servicep)) { temp_host = find_host(current_service->servicep->host_name); if((NULL != temp_host) && (FALSE == is_host_member_of_hostgroup(match_hostgroup, temp_host))) { return 0; } } /* If a servicegroup was specified, skip this service if it is not a member of the servicegroup specified */ if((NULL != match_servicegroup) && (NULL != current_service->servicep)) { temp_service = find_service(current_service->servicep->host_name, current_service->description); if((NULL != temp_service) && (FALSE == is_service_member_of_servicegroup(match_servicegroup, temp_service))) { return 0; } } /* If the contact group was specified, skip this service if it does not have the contact group specified */ if((NULL != match_contactgroup) && (NULL != current_service->servicep)) { found = 0; for(temp_contact_groupsmember = current_service->servicep->contact_groups; temp_contact_groupsmember != NULL; temp_contact_groupsmember = temp_contact_groupsmember->next) { if(!strcmp(temp_contact_groupsmember->group_name, match_contactgroup->group_name)) { found = 1; break; } } if(0 == found) return 0; } /* If a child host was specified... */ if((1 == use_child_host) && (NULL != current_service->servicep)) { temp_host = find_host(current_service->servicep->host_name); if(NULL != temp_host) { /* If the child host is "none", skip this service if it's host has children */ if(NULL == child_host) { for(temp_host2 = host_list; temp_host2 != NULL; temp_host2 = temp_host2->next) { if(TRUE == is_host_immediate_child_of_host(temp_host, temp_host2)) { return 0; } } } /* Otherwise, skip this service if it's host does not have the specified host as a child */ else if(FALSE == is_host_immediate_child_of_host(temp_host, child_host)) { return 0; } } } break; } return 1; } json_object * json_archive_notification_selectors(unsigned format_options, int start, int count, time_t start_time, time_t end_time, int match_object_types, char *match_host, char *match_service, int use_parent_host, host *parent_host, int use_child_host, host *child_host, hostgroup *match_hostgroup, servicegroup *match_servicegroup, char *match_contact, contactgroup *match_contactgroup, unsigned match_host_notification_types, unsigned match_service_notification_types, char *match_notification_method) { json_object *json_selectors; json_selectors = json_new_object(); if( start > 0) { json_object_append_integer(json_selectors, "start", start); } if( count > 0) { json_object_append_integer(json_selectors, "count", count); } if(start_time > 0) { json_object_append_time_t(json_selectors, "starttime", start_time); } if(end_time > 0) { json_object_append_time_t(json_selectors, "endtime", end_time); } if(match_object_types != AU_OBJTYPE_ALL) { json_bitmask(json_selectors, format_options, "objecttypes", match_object_types, valid_object_types); } if((match_object_types & AU_OBJTYPE_HOST) && (match_host_notification_types != AU_NOTIFICATION_HOST_ALL)) { json_bitmask(json_selectors, format_options, "hostnotificationtypes", match_host_notification_types, valid_host_notification_types); } if((match_object_types & AU_OBJTYPE_SERVICE) && (match_service_notification_types != AU_NOTIFICATION_SERVICE_ALL)) { json_bitmask(json_selectors, format_options, "servicenotificationtypes", match_service_notification_types, valid_service_notification_types); } if(NULL != match_host) { json_object_append_string(json_selectors, "hostname", &percent_escapes, match_host); } if(NULL != match_service) { json_object_append_string(json_selectors, "servicedescription", &percent_escapes, match_service); } if(1 == use_parent_host) { json_object_append_string(json_selectors, "parenthost", &percent_escapes, ( NULL == parent_host ? "none" : parent_host->name)); } if( 1 == use_child_host) { json_object_append_string(json_selectors, "childhost", &percent_escapes, ( NULL == child_host ? "none" : child_host->name)); } if(NULL != match_hostgroup) { json_object_append_string(json_selectors, "hostgroup", &percent_escapes, match_hostgroup->group_name); } if((match_object_types & AU_OBJTYPE_SERVICE) && (NULL != match_servicegroup)) { json_object_append_string(json_selectors, "servicegroup", &percent_escapes, match_servicegroup->group_name); } if(NULL != match_contact) { json_object_append_string(json_selectors, "contact", &percent_escapes, match_contact); } if(NULL != match_contactgroup) { json_object_append_string(json_selectors, "contactgroup", &percent_escapes, match_contactgroup->group_name); } if(NULL != match_notification_method) { json_object_append_string(json_selectors, "notificationmethod", &percent_escapes, match_notification_method); } return json_selectors; } json_object * json_archive_notificationcount(unsigned format_options, time_t start_time, time_t end_time, int match_object_types, char *match_host, char *match_service, int use_parent_host, host *parent_host, int use_child_host, host *child_host, hostgroup *match_hostgroup, servicegroup *match_servicegroup, char *match_contact, contactgroup *match_contactgroup, unsigned match_host_notification_types, unsigned match_service_notification_types, char *match_notification_method, au_log *log) { json_object *json_data; au_node *temp_node; au_log_entry *temp_entry; au_log_notification *temp_notification_log; au_host *temp_host = NULL; au_service *temp_service = NULL; int count = 0; json_data = json_new_object(); json_object_append_object(json_data, "selectors", json_archive_notification_selectors(format_options, 0, 0, start_time, end_time, match_object_types, match_host, match_service, use_parent_host, parent_host, use_child_host, child_host, match_hostgroup, match_servicegroup, match_contact, match_contactgroup, match_host_notification_types, match_service_notification_types, match_notification_method)); for(temp_node = log->entry_list->head; temp_node != NULL; temp_node = temp_node->next) { temp_entry = (au_log_entry *)temp_node->data; /* Skip all but notification type messages */ if(AU_LOGTYPE_NOTIFICATION != temp_entry->entry_type) continue; /* Get the host/service object */ temp_notification_log = (au_log_notification *)temp_entry->entry; switch(temp_notification_log->obj_type) { case AU_OBJTYPE_HOST: temp_host = (au_host *)temp_notification_log->object; temp_service = NULL; break; case AU_OBJTYPE_SERVICE: temp_host = NULL; temp_service = (au_service *)temp_notification_log->object; break; } /* Skip anything that does not pass the notification selection criteria */ if(json_archive_notification_passes_selection(temp_entry->timestamp, start_time, end_time, temp_notification_log->obj_type, match_object_types, temp_host, match_host, temp_service, match_service, use_parent_host, parent_host, use_child_host, child_host, match_hostgroup, match_servicegroup, temp_notification_log->contact, match_contact, match_contactgroup, temp_notification_log->notification_type, match_host_notification_types, match_service_notification_types, temp_notification_log->method, match_notification_method) == 0) { continue; } count++; } json_object_append_integer(json_data, "count", count); return json_data; } json_object * json_archive_notificationlist(unsigned format_options, int start, int count, time_t start_time, time_t end_time, int match_object_types, char *match_host, char *match_service, int use_parent_host, host *parent_host, int use_child_host, host *child_host, hostgroup *match_hostgroup, servicegroup *match_servicegroup, char *match_contact, contactgroup *match_contactgroup, unsigned match_host_notification_types, unsigned match_service_notification_types, char *match_notification_method, au_log *log) { json_object *json_data; json_array *json_notificationlist; json_object *json_notification_details; au_node *temp_node; au_log_entry *temp_entry; au_log_notification *temp_notification_log; au_host *temp_host = NULL; au_service *temp_service = NULL; int current = 0; int counted = 0; json_data = json_new_object(); json_object_append_object(json_data, "selectors", json_archive_notification_selectors(format_options, start, count, start_time, end_time, match_object_types, match_host, match_service, use_parent_host, parent_host, use_child_host, child_host, match_hostgroup, match_servicegroup, match_contact, match_contactgroup, match_host_notification_types, match_service_notification_types, match_notification_method)); json_notificationlist = json_new_array(); for(temp_node = log->entry_list->head; temp_node != NULL; temp_node = temp_node->next) { temp_entry = (au_log_entry *)temp_node->data; /* Skip all but notification type messages */ if(AU_LOGTYPE_NOTIFICATION != temp_entry->entry_type) continue; /* Get the host/service object */ temp_notification_log = (au_log_notification *)temp_entry->entry; switch(temp_notification_log->obj_type) { case AU_OBJTYPE_HOST: temp_host = (au_host *)temp_notification_log->object; temp_service = NULL; break; case AU_OBJTYPE_SERVICE: temp_host = NULL; temp_service = (au_service *)temp_notification_log->object; break; } /* Skip anything that does not pass the notification selection criteria */ if(json_archive_notification_passes_selection(temp_entry->timestamp, start_time, end_time, temp_notification_log->obj_type, match_object_types, temp_host, match_host, temp_service, match_service, use_parent_host, parent_host, use_child_host, child_host, match_hostgroup, match_servicegroup, temp_notification_log->contact, match_contact, match_contactgroup, temp_notification_log->notification_type, match_host_notification_types, match_service_notification_types, temp_notification_log->method, match_notification_method) == 0) { continue; } /* If the current item passes the start and limit tests, display it */ if( passes_start_and_count_limits(start, count, current, counted)) { json_notification_details = json_new_object(); json_archive_notification_details(json_notification_details, format_options, temp_entry->timestamp, (au_log_notification *)temp_entry->entry); json_array_append_object(json_notificationlist, json_notification_details); counted++; } current++; } json_object_append_array(json_data, "notificationlist", json_notificationlist); return json_data; } void json_archive_notification_details(json_object *json_details, unsigned format_options, time_t timestamp, au_log_notification *temp_notification) { au_host *temp_host; au_service *temp_service; json_object_append_time_t(json_details, "timestamp", timestamp); json_enumeration(json_details, format_options, "object_type", temp_notification->obj_type, svm_au_object_types); switch(temp_notification->obj_type) { case AU_OBJTYPE_HOST: temp_host = (au_host *)temp_notification->object; json_object_append_string(json_details, "name", &percent_escapes, temp_host->name); break; case AU_OBJTYPE_SERVICE: temp_service = (au_service *)temp_notification->object; json_object_append_string(json_details, "host_name", &percent_escapes, temp_service->host_name); json_object_append_string(json_details, "description", &percent_escapes, temp_service->description); break; } json_object_append_string(json_details, "contact", &percent_escapes, temp_notification->contact->name); json_enumeration(json_details, format_options, "notification_type", temp_notification->notification_type, svm_au_notification_types); json_object_append_string(json_details, "method", &percent_escapes, temp_notification->method); json_object_append_string(json_details, "message", &percent_escapes, temp_notification->message); } int json_archive_statechange_passes_selection(time_t timestamp, time_t end_time, int current_object_type, int match_object_type, au_host *current_host, char *match_host, au_service *current_service, char *match_service, unsigned current_state_type, unsigned match_state_types) { if((end_time > 0) && (timestamp > end_time)) { return 0; } /* Skip if we're not interested in the current state type */ if(!(current_state_type & match_state_types)) { return 0; } switch(current_object_type) { case AU_OBJTYPE_HOST: /* Skip if we're not interested in hosts */ if(match_object_type != AU_OBJTYPE_HOST) { return 0; } /* Skip if user is not authorized for this host */ if((NULL != current_host->hostp) && (FALSE == is_authorized_for_host(current_host->hostp, ¤t_authdata))) { return 0; } /* If a specific host name was specified, skip this host if it's name does not match the one specified */ if((NULL != match_host) && (NULL != current_host) && strcmp(current_host->name, match_host)) { return 0; } break; case AU_OBJTYPE_SERVICE: /* Skip if we're not interested in services */ if(match_object_type != AU_OBJTYPE_SERVICE) { return 0; } /* Skip if user is not authorized for this service */ if((NULL != current_service->servicep) && (FALSE == is_authorized_for_service(current_service->servicep, ¤t_authdata))) { return 0; } /* If a specific service was specified, skip this service if it's host name and service description do not match the one specified */ if((NULL != match_host) && (NULL != match_service) && (NULL != current_service) && ( strcmp(current_service->host_name, match_host) || strcmp(current_service->description, match_service))) { return 0; } break; } return 1; } json_object *json_archive_statechange_selectors(unsigned format_options, int start, int count, time_t start_time, time_t end_time, int object_type, char *host_name, char *service_description, unsigned state_types) { json_object *json_selectors; json_selectors = json_new_object(); if( start > 0) { json_object_append_integer(json_selectors, "start", start); } if( count > 0) { json_object_append_integer(json_selectors, "count", count); } if(start_time > 0) { json_object_append_time_t(json_selectors, "starttime", start_time); } if(end_time > 0) { json_object_append_time_t(json_selectors, "endtime", end_time); } if(NULL != host_name) { json_object_append_string(json_selectors, "hostname", &percent_escapes, host_name); } if(NULL != service_description) { json_object_append_string(json_selectors, "servicedescription", &percent_escapes, service_description); } if(state_types != AU_STATETYPE_ALL) { json_bitmask(json_selectors, format_options, "statetypes", state_types, valid_state_types); } return json_selectors; } json_object *json_archive_statechangelist(unsigned format_options, int start, int count, time_t start_time, time_t end_time, int object_type, char *host_name, char *service_description, int assumed_initial_host_state, int assumed_initial_service_state, unsigned state_types, au_log *log) { json_object *json_data; json_array *json_statechangelist; json_object *json_statechange_details; au_node *temp_node; int initial_host_state = AU_STATE_NO_DATA; int initial_service_state = AU_STATE_NO_DATA; au_log_entry *temp_entry = NULL; au_log_alert *temp_state_log = NULL; au_log_alert *start_log = NULL; au_log_alert *end_log = NULL; au_host *temp_host = NULL; au_service *temp_service = NULL; int have_seen_first_entry = 0; int current = 0; int counted = 0; if(assumed_initial_host_state != AU_STATE_NO_DATA) initial_host_state = assumed_initial_host_state; if(assumed_initial_service_state != AU_STATE_NO_DATA) initial_service_state = assumed_initial_service_state; json_data = json_new_object(); json_object_append_object(json_data, "selectors", json_archive_statechange_selectors(format_options, start, count, start_time, end_time, object_type, host_name, service_description, state_types)); json_statechangelist = json_new_array(); for(temp_node = log->entry_list->head; temp_node != NULL; temp_node = temp_node->next) { /* Skip all but notification type messages */ temp_entry = (au_log_entry *)temp_node->data; if(!(temp_entry->entry_type & (AU_LOGTYPE_STATE | AU_LOGTYPE_ALERT))) { continue; } /* Get the host/service object */ temp_state_log = (au_log_alert *)temp_entry->entry; switch(temp_state_log->obj_type) { case AU_OBJTYPE_HOST: temp_host = (au_host *)temp_state_log->object; temp_service = NULL; break; case AU_OBJTYPE_SERVICE: temp_host = NULL; temp_service = (au_service *)temp_state_log->object; break; } /* Skip any entries not passing the selectors */ if(json_archive_statechange_passes_selection(temp_entry->timestamp, end_time, temp_state_log->obj_type, object_type, temp_host, host_name, temp_service, service_description, temp_state_log->state_type, state_types) == 0) { continue; } if((start_time > 0) && (temp_entry->timestamp < start_time)) { /* If we're before the start time and no initial assumed state was provided, record the state to be used as the initial state */ switch(temp_state_log->obj_type) { case AU_OBJTYPE_HOST: if(AU_STATE_NO_DATA == assumed_initial_host_state) initial_host_state = temp_state_log->state; break; case AU_OBJTYPE_SERVICE: if(AU_STATE_NO_DATA == assumed_initial_service_state) initial_service_state = temp_state_log->state; break; } continue; } else if(0 == have_seen_first_entry) { /* When we get to the first entry after the start, inject a pseudo entry with the initial state */ switch(object_type) { case AU_OBJTYPE_HOST: start_log = au_create_alert_or_state_log(object_type, temp_host, AU_STATETYPE_HARD, initial_host_state, "Initial Host Pseudo-State"); break; case AU_OBJTYPE_SERVICE: start_log = au_create_alert_or_state_log(object_type, temp_service, AU_STATETYPE_HARD, initial_service_state, "Initial Service Pseudo-State"); break; } if(start_log != NULL) { json_statechange_details = json_new_object(); json_archive_alert_details(json_statechange_details, format_options, start_time, start_log); json_array_append_object(json_statechangelist, json_statechange_details); au_free_alert_log(start_log); } have_seen_first_entry = 1; } #if 0 else { /* Ignore ALERT logs if their state is not different from the previous state */ switch(object_type) { case AU_OBJTYPE_HOST: // if((temp_entry->entry_type & (AU_LOGTYPE_ALERT | // AU_LOGTYPE_STATE_INITIAL)) && if((temp_entry->entry_type & AU_LOGTYPE_ALERT) && (last_host_state == temp_state_log->state)) { continue; } last_host_state = temp_state_log->state; break; case AU_OBJTYPE_SERVICE: // if((temp_entry->entry_type & (AU_LOGTYPE_ALERT | // AU_LOGTYPE_STATE_INITIAL)) && if((temp_entry->entry_type & AU_LOGTYPE_ALERT) && (last_service_state == temp_state_log->state)) { continue; } last_service_state = temp_state_log->state; break; } } #endif /* If the current item passes the start and limit tests, display it */ if( passes_start_and_count_limits(start, count, current, counted)) { json_statechange_details = json_new_object(); json_archive_alert_details(json_statechange_details, format_options, temp_entry->timestamp, temp_state_log); json_array_append_object(json_statechangelist, json_statechange_details); counted++; } current++; } /* Inject a pseudo entry with the final state */ switch(object_type) { case AU_OBJTYPE_HOST: temp_host = au_find_host(log->hosts, host_name); if(NULL != temp_host) { end_log = au_create_alert_or_state_log(object_type, temp_host, AU_STATETYPE_HARD, temp_state_log->state, "Final Host Pseudo-State"); } break; case AU_OBJTYPE_SERVICE: temp_service = au_find_service(log->hosts, host_name, service_description); if(NULL != temp_service) { end_log = au_create_alert_or_state_log(object_type, temp_service, AU_STATETYPE_HARD, temp_state_log->state, "Final Service Pseudo-State"); } break; } if(end_log != NULL) { json_statechange_details = json_new_object(); json_archive_alert_details(json_statechange_details, format_options, end_time, end_log); json_array_append_object(json_statechangelist, json_statechange_details); au_free_alert_log(end_log); } json_object_append_array(json_data, "statechangelist", json_statechangelist); return json_data; } /* Return the initial state of Nagios itself. */ int get_initial_nagios_state(au_linked_list *log_entries, time_t start_time, time_t end_time) { au_node *temp_node; au_log_entry *current_log_entry; au_log_nagios *temp_nagios_log; int initial_state = AU_STATE_NO_DATA; for(temp_node = log_entries->head; temp_node != NULL; temp_node = temp_node->next) { current_log_entry = (au_log_entry *)temp_node->data; if(current_log_entry->timestamp < start_time) { /* Any log entries prior to the start time tell us something about the initial state of Nagios so look at all of them */ switch(current_log_entry->entry_type) { case AU_LOGTYPE_NAGIOS: /* If the log is a Nagios start or stop log, that is the current program state */ temp_nagios_log = (au_log_nagios *)current_log_entry->entry; initial_state = temp_nagios_log->type; break; default: /* Any other log indicates that Nagios is running */ initial_state = AU_STATE_PROGRAM_START; break; } } else { if(AU_STATE_NO_DATA != initial_state) { /* Once we cross the threshold of the start time, if we have an initial state, that is THE initial state */ return initial_state; } else { /* Otherwise the first log encountered tells us the initial state of Nagios */ switch(current_log_entry->entry_type) { case AU_LOGTYPE_NAGIOS: /* If the log is a Nagios start or stop log, that is opposite the initial state */ temp_nagios_log = (au_log_nagios *)current_log_entry->entry; switch(temp_nagios_log->type) { case AU_STATE_PROGRAM_START: return AU_STATE_PROGRAM_END; break; case AU_STATE_PROGRAM_END: return AU_STATE_PROGRAM_START; break; } break; default: /* Any other log indicates that Nagios was running at the start time */ return AU_STATE_PROGRAM_START; break; } } } } /* If we reach this point, we are in bad shape because we had nothing in the logs and the initial state should still be AU_STATE_NO_DATA, which we return as an error indication */ return initial_state; } /* Return the initial downtime state of the host or service. */ int get_initial_downtime_state(au_linked_list *log_entries, time_t start_time, time_t end_time) { au_node *temp_node; au_log_entry *current_log_entry; au_log_downtime *temp_downtime_log; int initial_state = AU_STATE_NO_DATA; for(temp_node = log_entries->head; temp_node != NULL; temp_node = temp_node->next) { current_log_entry = (au_log_entry *)temp_node->data; if(current_log_entry->timestamp < start_time) { /* Any downtime log prior to the start time may indicate the initial downtime state so look at all of them */ if(AU_LOGTYPE_DOWNTIME == current_log_entry->entry_type) { temp_downtime_log = (au_log_downtime *)current_log_entry->entry; initial_state = temp_downtime_log->downtime_type; } } else if(current_log_entry->timestamp <= end_time) { if(AU_STATE_NO_DATA != initial_state) { /* Once we cross the start time, if we have a downtime state, we have THE initial downtime state */ return initial_state; } else { /* If we dont' have a downtime state yet, the first downtime state we encounter will be opposite the initial downtime state */ if(AU_LOGTYPE_NOTIFICATION == current_log_entry->entry_type) { temp_downtime_log = (au_log_downtime *)current_log_entry->entry; switch(temp_downtime_log->downtime_type) { case AU_STATE_DOWNTIME_START: return AU_STATE_DOWNTIME_END; break; case AU_STATE_DOWNTIME_END: return AU_STATE_DOWNTIME_START; break; } } } } } /* If we haven't encountered any indication of downtime yet, assume we were not initially in downtime */ if(AU_STATE_NO_DATA == initial_state) { initial_state = AU_STATE_DOWNTIME_END; } return initial_state; } /* Return the initial state of the host or service. */ int get_initial_subject_state(au_linked_list *log_entries, time_t start_time, time_t end_time) { au_node *temp_node; au_log_entry *current_log_entry; int initial_state = AU_STATE_NO_DATA; for(temp_node = log_entries->head; temp_node != NULL; temp_node = temp_node->next) { current_log_entry = (au_log_entry *)temp_node->data; if(current_log_entry->timestamp < start_time) { /* Any state log prior to the start time may indicate the initial state of the subject so look at all of them */ switch(current_log_entry->entry_type) { case AU_LOGTYPE_ALERT: case AU_LOGTYPE_STATE_INITIAL: case AU_LOGTYPE_STATE_CURRENT: initial_state = get_log_entry_state(current_log_entry); break; } } } return initial_state; } int get_log_entry_state(au_log_entry *log_entry) { switch(log_entry->entry_type) { case AU_LOGTYPE_ALERT: case AU_LOGTYPE_STATE_INITIAL: case AU_LOGTYPE_STATE_CURRENT: return ((au_log_alert *)log_entry->entry)->state; break; case AU_LOGTYPE_DOWNTIME: return ((au_log_downtime *)log_entry->entry)->downtime_type; break; case AU_LOGTYPE_NAGIOS: return ((au_log_nagios *)log_entry->entry)->type; break; case AU_LOGTYPE_NOTIFICATION: return ((au_log_notification *)log_entry->entry)->notification_type; break; default: return AU_STATE_NO_DATA; break; } } #define have_real_data(a) have_data((a), \ ~(AU_STATE_NO_DATA | AU_STATE_PROGRAM_START | AU_STATE_PROGRAM_END)) #define have_state_data(a) have_data((a), AU_STATE_ALL) int have_data(au_linked_list *log_entries, int mask) { au_node *temp_node; int state; for(temp_node = log_entries->head; temp_node != NULL; temp_node = temp_node->next) { state = get_log_entry_state((au_log_entry *)temp_node->data); if(state & mask) return TRUE; } return FALSE; } unsigned long calculate_window_duration(time_t start_time, time_t end_time, timeperiod *report_timeperiod) { struct tm *t; unsigned long state_duration; time_t midnight; int weekday; timerange *temp_timerange; unsigned long temp_duration; unsigned long temp_end; unsigned long temp_start; unsigned long start; unsigned long end; /* MickeM - attempt to handle the the report time_period (if any) */ if(report_timeperiod != NULL) { t = localtime((time_t *)&start_time); state_duration = 0; /* calculate the start of the day (midnight, 00:00 hours) */ t->tm_sec = 0; t->tm_min = 0; t->tm_hour = 0; t->tm_isdst = -1; midnight = mktime(t); weekday = t->tm_wday; while(midnight < end_time) { temp_duration = 0; temp_end = min(86400, end_time - midnight); temp_start = 0; if(start_time > midnight) { temp_start = start_time - midnight; } #ifdef DEBUG printf("Matching: %ld -> %ld. (%ld -> %ld)\n", temp_start, temp_end, midnight + temp_start, midnight + temp_end); #endif /* check all time ranges for this day of the week */ for(temp_timerange = report_timeperiod->days[weekday]; temp_timerange != NULL; temp_timerange = temp_timerange->next) { #ifdef DEBUG printf("Matching in timerange[%d]: %lu -> %lu (%lu -> %lu)\n", weekday, temp_timerange->range_start, temp_timerange->range_end, temp_start, temp_end); #endif start = max(temp_timerange->range_start, temp_start); end = min(temp_timerange->range_end, temp_end); if(start < end) { temp_duration += end - start; #ifdef DEBUG printf("Matched time: %ld -> %ld = %lu\n", start, end, temp_duration); #endif } #ifdef DEBUG else { printf("Ignored time: %ld -> %ld\n", start, end); } #endif } state_duration += temp_duration; temp_start = 0; midnight += 86400; if(++weekday > 6) weekday = 0; } } /* No report timeperiod was requested; assume 24x7 */ else { /* Calculate time in this state */ state_duration = (unsigned long)(end_time - start_time); } return state_duration; } #ifdef DEBUG void print_availability(au_availability *availability, const char *padding) { printf("%sAll:: up: %10lu\n", padding, availability->time_up); printf("%s down: %10lu\n", padding, availability->time_down); printf("%s unreachable: %10lu\n", padding, availability->time_unreachable); printf("%s ok: %10lu\n", padding, availability->time_ok); printf("%s warning: %10lu\n", padding, availability->time_warning); printf("%s critical: %10lu\n", padding, availability->time_critical); printf("%s unknown: %10lu\n", padding, availability->time_unknown); printf("%sScheduled:: up: %10lu\n", padding, availability->scheduled_time_up); printf("%s down: %10lu\n", padding, availability->scheduled_time_down); printf("%s unreachable: %10lu\n", padding, availability->scheduled_time_unreachable); printf("%s ok: %10lu\n", padding, availability->scheduled_time_ok); printf("%s warning: %10lu\n", padding, availability->scheduled_time_warning); printf("%s critical: %10lu\n", padding, availability->scheduled_time_critical); printf("%s unknown: %10lu\n", padding, availability->scheduled_time_unknown); printf("%sIndeterminate:: scheduled: %10lu\n", padding, availability->scheduled_time_indeterminate); printf("%s nodata: %10lu\n", padding, availability->time_indeterminate_nodata); printf("%s notrunning: %10lu\n", padding, availability->time_indeterminate_notrunning); } #endif void compute_window_availability(time_t start_time, time_t end_time, int last_subject_state, int last_downtime_state, int last_nagios_state, timeperiod *report_timeperiod, au_availability *availability, int assume_state_during_nagios_downtime, int object_type, int assume_state_retention) { unsigned long state_duration; #ifdef DEBUG printf( " %lu to %lu (%lus): %s/%s/%s\n", start_time, end_time, (end_time - start_time), svm_get_string_from_value(last_subject_state, svm_au_states), svm_get_string_from_value(last_downtime_state, svm_au_states), svm_get_string_from_value(last_nagios_state, svm_au_states)); #endif /* Get the duration of this window as adjusted for the report timeperiod */ state_duration = calculate_window_duration(start_time, end_time, report_timeperiod); /* Determine the appropriate state */ switch(last_nagios_state) { case AU_STATE_PROGRAM_START: switch(last_downtime_state) { case AU_STATE_DOWNTIME_START: switch(last_subject_state) { case AU_STATE_NO_DATA: availability->time_indeterminate_nodata += state_duration; break; case AU_STATE_HOST_UP: availability->scheduled_time_up += state_duration; break; case AU_STATE_HOST_DOWN: availability->scheduled_time_down += state_duration; break; case AU_STATE_HOST_UNREACHABLE: availability->scheduled_time_unreachable += state_duration; break; case AU_STATE_SERVICE_OK: availability->scheduled_time_ok += state_duration; break; case AU_STATE_SERVICE_WARNING: availability->scheduled_time_warning += state_duration; break; case AU_STATE_SERVICE_UNKNOWN: availability->scheduled_time_unknown += state_duration; break; case AU_STATE_SERVICE_CRITICAL: availability->scheduled_time_critical += state_duration; break; } break; case AU_STATE_DOWNTIME_END: switch(last_subject_state) { case AU_STATE_NO_DATA: availability->time_indeterminate_nodata += state_duration; break; case AU_STATE_HOST_UP: availability->time_up += state_duration; break; case AU_STATE_HOST_DOWN: availability->time_down += state_duration; break; case AU_STATE_HOST_UNREACHABLE: availability->time_unreachable += state_duration; break; case AU_STATE_SERVICE_OK: availability->time_ok += state_duration; break; case AU_STATE_SERVICE_WARNING: availability->time_warning += state_duration; break; case AU_STATE_SERVICE_UNKNOWN: availability->time_unknown += state_duration; break; case AU_STATE_SERVICE_CRITICAL: availability->time_critical += state_duration; break; } break; } break; case AU_STATE_PROGRAM_END: if(assume_state_during_nagios_downtime) { switch(last_downtime_state) { case AU_STATE_DOWNTIME_START: switch(last_subject_state) { case AU_STATE_NO_DATA: availability->time_indeterminate_nodata += state_duration; break; case AU_STATE_HOST_UP: availability->scheduled_time_up += state_duration; break; case AU_STATE_HOST_DOWN: availability->scheduled_time_down += state_duration; break; case AU_STATE_HOST_UNREACHABLE: availability->scheduled_time_unreachable += state_duration; break; case AU_STATE_SERVICE_OK: availability->scheduled_time_ok += state_duration; break; case AU_STATE_SERVICE_WARNING: availability->scheduled_time_warning += state_duration; break; case AU_STATE_SERVICE_UNKNOWN: availability->scheduled_time_unknown += state_duration; break; case AU_STATE_SERVICE_CRITICAL: availability->scheduled_time_critical += state_duration; break; } break; case AU_STATE_DOWNTIME_END: switch(last_subject_state) { case AU_STATE_NO_DATA: availability->time_indeterminate_nodata += state_duration; break; case AU_STATE_HOST_UP: availability->time_up += state_duration; break; case AU_STATE_HOST_DOWN: availability->time_down += state_duration; break; case AU_STATE_HOST_UNREACHABLE: availability->time_unreachable += state_duration; break; case AU_STATE_SERVICE_OK: availability->time_ok += state_duration; break; case AU_STATE_SERVICE_WARNING: availability->time_warning += state_duration; break; case AU_STATE_SERVICE_UNKNOWN: availability->time_unknown += state_duration; break; case AU_STATE_SERVICE_CRITICAL: availability->time_critical += state_duration; break; } break; } } else { availability->time_indeterminate_notrunning += state_duration; } break; } #ifdef DEBUG print_availability(availability, " "); #endif return; } static void compute_availability(au_linked_list *log_entries, time_t query_time, time_t start_time, time_t end_time, timeperiod *report_timeperiod, au_availability *availability, int initial_subject_state, int assume_state_during_nagios_downtime, int object_type, int assume_state_retention) { int current_nagios_state; int last_nagios_state; int current_downtime_state; int last_downtime_state; int current_subject_state = initial_subject_state; int last_subject_state = AU_STATE_NO_DATA; au_node *temp_node; au_log_entry *current_log_entry; au_log_entry *last_log_entry = NULL; au_log_alert *temp_alert_log; au_log_downtime *temp_downtime_log; au_log_nagios *temp_nagios_log; time_t last_time = start_time; time_t current_time; #ifdef DEBUG printf(" initial state: %s\n", svm_get_string_from_value(initial_subject_state, valid_states)); #endif /* Determine the initial Nagios state */ if((last_nagios_state = current_nagios_state = get_initial_nagios_state(log_entries, start_time, end_time)) == AU_STATE_NO_DATA) { /* This is bad; I'm giving up. */ return; } #ifdef DEBUG printf(" initial nagios state: %s\n", svm_get_string_from_value(last_nagios_state, valid_states)); #endif /* Determine the initial downtime state */ if((last_downtime_state = current_downtime_state = get_initial_downtime_state(log_entries, start_time, end_time)) == AU_STATE_NO_DATA) { /* This is bad; I'm giving up. */ return; } #ifdef DEBUG printf(" initial downtime state: %s\n", svm_get_string_from_value(last_downtime_state, valid_states)); #endif /* Process all entry pairs */ for(temp_node = log_entries->head; temp_node != NULL; temp_node = temp_node->next) { current_log_entry = (au_log_entry *)temp_node->data; /* Skip everything before the start of the requested query window */ if(current_log_entry->timestamp < start_time) continue; #ifdef DEBUG printf(" Got log of type \"%s\" at %lu\n", svm_get_string_from_value(current_log_entry->entry_type, svm_au_log_types), current_log_entry->timestamp); #endif /* Update states */ last_subject_state = current_subject_state; last_downtime_state = current_downtime_state; last_nagios_state = current_nagios_state; switch(current_log_entry->entry_type) { case AU_LOGTYPE_ALERT: case AU_LOGTYPE_STATE_INITIAL: case AU_LOGTYPE_STATE_CURRENT: temp_alert_log = (au_log_alert *)current_log_entry->entry; current_subject_state = temp_alert_log->state; #ifdef DEBUG printf(" Current alert state: \"%s\"\n", svm_get_string_from_value(current_subject_state, valid_states)); #endif break; case AU_LOGTYPE_DOWNTIME: temp_downtime_log = (au_log_downtime *)current_log_entry->entry; current_downtime_state = temp_downtime_log->downtime_type; #ifdef DEBUG printf(" Current downtime state: \"%s\"\n", svm_get_string_from_value(current_downtime_state, valid_states)); #endif break; case AU_LOGTYPE_NAGIOS: temp_nagios_log = (au_log_nagios *)current_log_entry->entry; current_nagios_state = temp_nagios_log->type; #ifdef DEBUG printf(" Current nagios state: \"%s\"\n", svm_get_string_from_value(current_nagios_state, valid_states)); #endif break; default: continue; break; } /* Record the time ranges for the current log pair */ if(NULL != last_log_entry) last_time = last_log_entry->timestamp; current_time = current_log_entry->timestamp; /* Bail out if we've already passed the end of the requested time range*/ if(last_time > end_time) break; /* Clip last time if it extends beyond the end of the requested time range */ if(current_time > end_time) current_time = end_time; /* Clip first time if it precedes the start of the requested time range */ if(last_time < start_time) last_time = start_time; /* compute availability times for this chunk */ compute_window_availability(last_time, current_time, last_subject_state, last_downtime_state, last_nagios_state, report_timeperiod, availability, assume_state_during_nagios_downtime, object_type, assume_state_retention); /* Return if we've reached the end of the requested time range */ if(current_time >= end_time) { last_log_entry = current_log_entry; break; } /* Keep track of the last item */ last_log_entry = current_log_entry; } /* Process the last entry */ if(last_log_entry != NULL) { /* Update states */ last_subject_state = current_subject_state; last_downtime_state = current_downtime_state; last_nagios_state = current_nagios_state; /* Don't process an entry that is beyond the end of the requested time range */ if(last_log_entry->timestamp < end_time) { current_time = query_time; if(current_time > end_time) current_time = end_time; last_time = last_log_entry->timestamp; if(last_time < start_time) last_time = start_time; /* compute availability times for last state */ compute_window_availability(last_time, current_time, last_subject_state, last_downtime_state, last_nagios_state, report_timeperiod, availability, assume_state_during_nagios_downtime, object_type, assume_state_retention); } } else { /* There were no log entries for the entire queried time, therefore the whole query window was the same state */ compute_window_availability(start_time, end_time, initial_subject_state, last_downtime_state, last_nagios_state, report_timeperiod, availability, assume_state_during_nagios_downtime, object_type, assume_state_retention); } } void compute_host_availability(time_t query_time, time_t start_time, time_t end_time, au_log *log, au_host *host, timeperiod *report_timeperiod, int assume_initial_state, int assumed_initial_host_state, int assume_state_during_nagios_downtime, int assume_state_retention) { hoststatus *host_status = NULL; int last_known_state = AU_STATE_NO_DATA; int initial_host_state = AU_STATE_NO_DATA; #ifdef DEBUG printf("Computing availability for host %s\n from %lu to %lu\n", host->name, start_time, end_time); #endif /* If the start time is in the future, we can't compute anything */ if(start_time > query_time) return; /* Get current host status if possible */ host_status = find_hoststatus(host->name); /* If we don't have any data, the query time falls within the requested query window, and we have the current host status, insert the current state as the pseudo state at the start of the requested query window. */ if((have_state_data(host->log_entries) == FALSE) && (query_time > start_time) && (query_time <= end_time) && (host_status != NULL)) { switch(host_status->status) { case HOST_DOWN: last_known_state = AU_STATE_HOST_DOWN; break; case HOST_UNREACHABLE: last_known_state = AU_STATE_HOST_UNREACHABLE; break; case HOST_UP: last_known_state = AU_STATE_HOST_UP; break; default: last_known_state = AU_STATE_NO_DATA; break; } if(last_known_state != AU_STATE_NO_DATA) { /* Add a dummy current state item */ #ifdef DEBUG printf(" Inserting %s as current service pseudo-state\n", svm_get_string_from_value(last_known_state, valid_states)); #endif (void)au_add_alert_or_state_log(log, start_time, AU_LOGTYPE_STATE_CURRENT, AU_OBJTYPE_HOST, host, AU_STATETYPE_HARD, last_known_state, "Current Host Pseudo-State"); } } /* Next determine the initial state of the host */ initial_host_state = get_initial_subject_state(host->log_entries, start_time, end_time); #ifdef DEBUG printf(" Initial state from logs: %s\n", svm_get_string_from_value(initial_host_state, valid_states)); #endif if((AU_STATE_NO_DATA == initial_host_state) && (1 == assume_initial_state)) { switch(assumed_initial_host_state) { case AU_STATE_HOST_UP: case AU_STATE_HOST_DOWN: case AU_STATE_HOST_UNREACHABLE: initial_host_state = assumed_initial_host_state; break; case AU_STATE_CURRENT_STATE: if(host_status != NULL) { switch(host_status->status) { case HOST_DOWN: initial_host_state = AU_STATE_HOST_DOWN; break; case HOST_UNREACHABLE: initial_host_state = AU_STATE_HOST_UNREACHABLE; break; case HOST_UP: initial_host_state = AU_STATE_HOST_UP; break; } } break; } } /* At this point, if we still don't have any real data, we can't compute anything, so return */ if((have_real_data(host->log_entries) != TRUE) && (AU_STATE_NO_DATA == initial_host_state)) return; /* Compute the availability for every entry in the host's list of log entries */ compute_availability(host->log_entries, query_time, start_time, end_time, report_timeperiod, host->availability, initial_host_state, assume_state_during_nagios_downtime, AU_OBJTYPE_HOST, assume_state_retention); } void compute_service_availability(time_t query_time, time_t start_time, time_t end_time, au_log *log, au_service *service, timeperiod *report_timeperiod, int assume_initial_state, int assumed_initial_service_state, int assume_state_during_nagios_downtime, int assume_state_retention) { servicestatus *service_status = NULL; int last_known_state = AU_STATE_NO_DATA; int initial_service_state = AU_STATE_NO_DATA; #ifdef DEBUG printf("Computing availability for service %s:%s\n from %lu to %lu\n", service->host_name, service->description, start_time, end_time); #endif /* If the start time is in the future, we can't compute anything */ if(start_time > query_time) return; /* Get current service status if possible */ service_status = find_servicestatus(service->host_name, service->description); /* If we don't have any data, the query time falls within the requested query window, and we have the current service status, insert the current state as the pseudo state at the start of the requested query window. */ if((have_state_data(service->log_entries) == FALSE) && (query_time > start_time) && (query_time <= end_time) && (service_status != NULL)) { switch(service_status->status) { case SERVICE_OK: last_known_state = AU_STATE_SERVICE_OK; break; case SERVICE_WARNING: last_known_state = AU_STATE_SERVICE_WARNING; break; case SERVICE_CRITICAL: last_known_state = AU_STATE_SERVICE_CRITICAL; break; case SERVICE_UNKNOWN: last_known_state = AU_STATE_SERVICE_UNKNOWN; break; default: last_known_state = AU_STATE_NO_DATA; break; } if(last_known_state != AU_STATE_NO_DATA) { /* Add a dummy current state item */ #ifdef DEBUG printf(" Inserting %s as current service pseudo-state\n", svm_get_string_from_value(last_known_state, valid_states)); #endif (void)au_add_alert_or_state_log(log, start_time, AU_LOGTYPE_STATE_CURRENT, AU_OBJTYPE_SERVICE, service, AU_STATETYPE_HARD, last_known_state, "Current Service Pseudo-State"); } } /* Next determine the initial state of the service */ initial_service_state = get_initial_subject_state(service->log_entries, start_time, end_time); #ifdef DEBUG printf(" Initial state from logs: %s\n", svm_get_string_from_value(initial_service_state, valid_states)); #endif if((AU_STATE_NO_DATA == initial_service_state) && (1 == assume_initial_state)) { switch(assumed_initial_service_state) { case AU_STATE_SERVICE_OK: case AU_STATE_SERVICE_WARNING: case AU_STATE_SERVICE_UNKNOWN: case AU_STATE_SERVICE_CRITICAL: initial_service_state = assumed_initial_service_state; break; case AU_STATE_CURRENT_STATE: if(service_status == NULL) { switch(service_status->status) { case SERVICE_OK: initial_service_state = AU_STATE_SERVICE_OK; break; case SERVICE_WARNING: initial_service_state = AU_STATE_SERVICE_WARNING; break; case SERVICE_UNKNOWN: initial_service_state = AU_STATE_SERVICE_UNKNOWN; break; case SERVICE_CRITICAL: initial_service_state = AU_STATE_SERVICE_CRITICAL; break; } } break; } } /* At this point, if we still don't have any real data, we can't compute anything, so return */ if((have_real_data(service->log_entries) != TRUE) && (AU_STATE_NO_DATA == initial_service_state)) return; /* Compute the availability for every entry in the service's list of log entries */ compute_availability(service->log_entries, query_time, start_time, end_time, report_timeperiod, service->availability, initial_service_state, assume_state_during_nagios_downtime, AU_OBJTYPE_SERVICE, assume_state_retention); } json_object *json_archive_availability_selectors(unsigned format_options, time_t start_time, time_t end_time, int availability_object_type, char *host_name, char *service_description, hostgroup *hostgroup, servicegroup *servicegroup, timeperiod *report_timeperiod, int assume_initial_state, int assume_state_retention, int assume_state_during_nagios_downtime, int assumed_initial_host_state, int assumed_initial_service_state, unsigned state_types) { json_object *json_selectors; json_selectors = json_new_object(); json_enumeration(json_selectors, format_options, "availabilityobjecttype", availability_object_type, valid_availability_object_types); if(start_time > 0) { json_object_append_time_t(json_selectors, "starttime", start_time); } if(end_time > 0) { json_object_append_time_t(json_selectors, "endtime", end_time); } if(NULL != host_name) { json_object_append_string(json_selectors, "hostname", &percent_escapes, host_name); } if(NULL != service_description) { json_object_append_string(json_selectors, "servicedescription", &percent_escapes, service_description); } if(NULL != hostgroup) { json_object_append_string(json_selectors, "hostgroup", &percent_escapes, hostgroup->group_name); } if(NULL != servicegroup) { json_object_append_string(json_selectors, "servicegroup", &percent_escapes, servicegroup->group_name); } if(NULL != report_timeperiod) { json_object_append_string(json_selectors, "timeperiod", &percent_escapes, report_timeperiod->name); } json_object_append_boolean(json_selectors, "assumeinitialstate", assume_initial_state); json_object_append_boolean(json_selectors, "assumestateretention", assume_state_retention); json_object_append_boolean(json_selectors, "assumestateduringnagiosdowntime", assume_state_during_nagios_downtime); if(assumed_initial_host_state != AU_STATE_NO_DATA) { json_enumeration(json_selectors, format_options, "assumedinitialhoststate", assumed_initial_host_state, valid_initial_host_states); } if(assumed_initial_service_state != AU_STATE_NO_DATA) { json_enumeration(json_selectors, format_options, "assumedinitialservicestate", assumed_initial_service_state, valid_initial_service_states); } if(state_types != AU_STATETYPE_ALL) { json_bitmask(json_selectors, format_options, "statetypes", state_types, valid_state_types); } return json_selectors; } json_object *json_archive_availability(unsigned format_options, time_t query_time, time_t start_time, time_t end_time, int availability_object_type, char *host_name, char *service_description, hostgroup *hostgroup_selector, servicegroup *servicegroup_selector, timeperiod *report_timeperiod, int assume_initial_state, int assume_state_retention, int assume_state_during_nagios_downtime, int assumed_initial_host_state, int assumed_initial_service_state, unsigned state_types, au_log *log) { json_object *json_data; host *temp_host; json_array *json_host_list; json_object *json_host_object; service *temp_service; json_array *json_service_list; json_object *json_service_object; hostgroup *temp_hostgroup; json_object *json_hostgroup_object; json_array *json_hostgroup_list; hostsmember *temp_hostgroup_member; servicegroup *temp_servicegroup; json_object *json_servicegroup_object; json_array *json_servicegroup_list; servicesmember *temp_servicegroup_member; json_data = json_new_object(); json_object_append_object(json_data, "selectors", json_archive_availability_selectors(format_options, start_time, end_time, availability_object_type, host_name, service_description, hostgroup_selector, servicegroup_selector, report_timeperiod, assume_initial_state, assume_state_retention, assume_state_during_nagios_downtime, assumed_initial_host_state, assumed_initial_service_state, state_types)); /* First compute the availability */ switch(availability_object_type) { case AU_OBJTYPE_HOST: if(NULL == host_name) { /* compute for all hosts */ json_host_list = json_new_array(); for(temp_host = host_list; temp_host != NULL; temp_host = temp_host->next) { if(FALSE == is_authorized_for_host(temp_host, ¤t_authdata)) { continue; } json_host_object = json_archive_single_host_availability( format_options, query_time, start_time, end_time, temp_host->name, report_timeperiod, assume_initial_state, assume_state_retention, assume_state_during_nagios_downtime, assumed_initial_host_state, state_types, log); if(NULL != json_host_object) { json_array_append_object(json_host_list, json_host_object); } } json_object_append_array(json_data, "hosts", json_host_list); } else { temp_host = find_host(host_name); if((NULL != temp_host) && (TRUE == is_authorized_for_host(temp_host, ¤t_authdata))) { json_host_object = json_archive_single_host_availability(format_options, query_time, start_time, end_time, host_name, report_timeperiod, assume_initial_state, assume_state_retention, assume_state_during_nagios_downtime, assumed_initial_host_state, state_types, log); if(NULL != json_host_object) { json_object_append_object(json_data, "host", json_host_object); } } } break; case AU_OBJTYPE_SERVICE: if((NULL == host_name) && (NULL == service_description)) { /* compute for all services on all hosts */ json_service_list = json_new_array(); for(temp_service = service_list; temp_service != NULL; temp_service = temp_service->next) { if(FALSE == is_authorized_for_service(temp_service, ¤t_authdata)) { continue; } json_service_object = json_archive_single_service_availability( format_options, query_time, start_time, end_time, temp_service->host_name, temp_service->description, report_timeperiod, assume_initial_state, assume_state_retention, assume_state_during_nagios_downtime, assumed_initial_service_state, state_types, log); if(NULL != json_service_object) { json_array_append_object(json_service_list, json_service_object); } } json_object_append_array(json_data, "services", json_service_list); } else if(NULL == service_description) { /* compute for all services on the specified host */ json_service_list = json_new_array(); for(temp_service = service_list; temp_service != NULL; temp_service = temp_service->next) { if(!strcmp(temp_service->host_name, host_name) && (TRUE == is_authorized_for_service(temp_service, ¤t_authdata))) { json_service_object = json_archive_single_service_availability( format_options, query_time, start_time, end_time, temp_service->host_name, temp_service->description, report_timeperiod, assume_initial_state, assume_state_retention, assume_state_during_nagios_downtime, assumed_initial_service_state, state_types, log); if(NULL != json_service_object) { json_array_append_object(json_service_list, json_service_object); } } } json_object_append_array(json_data, "services", json_service_list); } else if(NULL == host_name) { /* compute for all services on the specified host */ json_service_list = json_new_array(); for(temp_service = service_list; temp_service != NULL; temp_service = temp_service->next) { if(!strcmp(temp_service->description, service_description) && (TRUE == is_authorized_for_service(temp_service, ¤t_authdata))) { json_service_object = json_archive_single_service_availability( format_options, query_time, start_time, end_time, temp_service->host_name, temp_service->description, report_timeperiod, assume_initial_state, assume_state_retention, assume_state_during_nagios_downtime, assumed_initial_service_state, state_types, log); if(NULL != json_service_object) { json_array_append_object(json_service_list, json_service_object); } } } json_object_append_array(json_data, "services", json_service_list); } else { temp_service = find_service(host_name, service_description); if((NULL != temp_service) && (TRUE == is_authorized_for_service(temp_service, ¤t_authdata))) { json_service_object = json_archive_single_service_availability(format_options, query_time, start_time, end_time, host_name, service_description, report_timeperiod, assume_initial_state, assume_state_retention, assume_state_during_nagios_downtime, assumed_initial_service_state, state_types, log); if(NULL != json_service_object) { json_object_append_object(json_data, "service", json_service_object); } } } break; case AU_OBJTYPE_HOSTGROUP: if(NULL == hostgroup_selector) { /* compute for all hosts in all hostgroups */ json_hostgroup_list = json_new_array(); for(temp_hostgroup = hostgroup_list; temp_hostgroup != NULL; temp_hostgroup = temp_hostgroup->next) { json_host_list = json_new_array(); for(temp_hostgroup_member = temp_hostgroup->members; temp_hostgroup_member != NULL; temp_hostgroup_member = temp_hostgroup_member->next) { if(FALSE == is_authorized_for_host(temp_hostgroup_member->host_ptr, ¤t_authdata)) { continue; } json_host_object = json_archive_single_host_availability( format_options, query_time, start_time, end_time, temp_hostgroup_member->host_name, report_timeperiod, assume_initial_state, assume_state_retention, assume_state_during_nagios_downtime, assumed_initial_host_state, state_types, log); if(NULL != json_host_object) { json_array_append_object(json_host_list, json_host_object); } } json_hostgroup_object = json_new_object(); json_object_append_string(json_hostgroup_object, "name", &percent_escapes, temp_hostgroup->group_name); json_object_append_array(json_hostgroup_object, "hosts", json_host_list); json_array_append_object(json_hostgroup_list, json_hostgroup_object); } json_object_append_array(json_data, "hostgroups", json_hostgroup_list); } else { /* compute for all hosts in the specified hostgroup */ json_host_list = json_new_array(); for(temp_hostgroup_member = hostgroup_selector->members; temp_hostgroup_member != NULL; temp_hostgroup_member = temp_hostgroup_member->next) { if(FALSE == is_authorized_for_host(temp_hostgroup_member->host_ptr, ¤t_authdata)) { continue; } json_host_object = json_archive_single_host_availability( format_options, query_time, start_time, end_time, temp_hostgroup_member->host_name, report_timeperiod, assume_initial_state, assume_state_retention, assume_state_during_nagios_downtime, assumed_initial_host_state, state_types, log); if(NULL != json_host_object) { json_array_append_object(json_host_list, json_host_object); } } json_hostgroup_object = json_new_object(); json_object_append_string(json_hostgroup_object, "name", &percent_escapes, hostgroup_selector->group_name); json_object_append_array(json_hostgroup_object, "hosts", json_host_list); json_object_append_object(json_data, "hostgroup", json_hostgroup_object); } break; case AU_OBJTYPE_SERVICEGROUP: if(NULL == servicegroup_selector) { /* compute for all hosts in all hostgroups */ json_servicegroup_list = json_new_array(); for(temp_servicegroup = servicegroup_list; temp_servicegroup != NULL; temp_servicegroup = temp_servicegroup->next) { json_service_list = json_new_array(); for(temp_servicegroup_member = temp_servicegroup->members; temp_servicegroup_member != NULL; temp_servicegroup_member = temp_servicegroup_member->next) { if(FALSE == is_authorized_for_service(temp_servicegroup_member->service_ptr, ¤t_authdata)) { continue; } json_service_object = json_archive_single_service_availability( format_options, query_time, start_time, end_time, temp_servicegroup_member->host_name, temp_servicegroup_member->service_description, report_timeperiod, assume_initial_state, assume_state_retention, assume_state_during_nagios_downtime, assumed_initial_service_state, state_types, log); if(NULL != json_service_object) { json_array_append_object(json_service_list, json_service_object); } } json_servicegroup_object = json_new_object(); json_object_append_string(json_servicegroup_object, "name", &percent_escapes, temp_servicegroup->group_name); json_object_append_array(json_servicegroup_object, "hosts", json_service_list); json_array_append_object(json_servicegroup_list, json_servicegroup_object); } json_object_append_array(json_data, "servicegroups", json_servicegroup_list); } else { /* compute for all services in the specified servicegroup */ json_service_list = json_new_array(); for(temp_servicegroup_member = servicegroup_selector->members; temp_servicegroup_member != NULL; temp_servicegroup_member = temp_servicegroup_member->next) { if(FALSE == is_authorized_for_service(temp_servicegroup_member->service_ptr, ¤t_authdata)) { continue; } json_service_object = json_archive_single_service_availability( format_options, query_time, start_time, end_time, temp_servicegroup_member->host_name, temp_servicegroup_member->service_description, report_timeperiod, assume_initial_state, assume_state_retention, assume_state_during_nagios_downtime, assumed_initial_service_state, state_types, log); if(NULL != json_service_object) { json_array_append_object(json_service_list, json_service_object); } } json_servicegroup_object = json_new_object(); json_object_append_string(json_servicegroup_object, "name", &percent_escapes, servicegroup_selector->group_name); json_object_append_array(json_servicegroup_object, "services", json_service_list); json_object_append_object(json_data, "servicegroup", json_servicegroup_object); } break; default: break; } return json_data; } json_object *json_archive_single_host_availability(unsigned format_options, time_t query_time, time_t start_time, time_t end_time, char *host_name, timeperiod *report_timeperiod, int assume_initial_state, int assume_state_retention, int assume_state_during_nagios_downtime, int assumed_initial_host_state, unsigned state_types, au_log *log) { au_host *host = NULL; au_node *temp_entry = NULL; au_host *global_host = NULL; json_object *json_host_availability = NULL; host = au_find_host(log->hosts, host_name); if(NULL == host) { /* host has no log entries, so create the host */ host = au_add_host(log->hosts, host_name); /* Add global events to this new host */ global_host = au_find_host(log->hosts, "*"); if(NULL != global_host) { for(temp_entry = global_host->log_entries->head; NULL != temp_entry; temp_entry = temp_entry->next) { if(au_list_add_node(host->log_entries, temp_entry->data, au_cmp_log_entries) == 0) { break; } } } } if((host->availability = calloc(1, sizeof(au_availability))) != NULL) { compute_host_availability(query_time, start_time, end_time, log, host, report_timeperiod, assume_initial_state, assumed_initial_host_state, assume_state_during_nagios_downtime, assume_state_retention); json_host_availability = json_archive_host_availability(format_options, host->name, host->availability); } return json_host_availability; } json_object *json_archive_single_service_availability(unsigned format_options, time_t query_time, time_t start_time, time_t end_time, char *host_name, char *service_description, timeperiod *report_timeperiod, int assume_initial_state, int assume_state_retention, int assume_state_during_nagios_downtime, int assumed_initial_service_state, unsigned state_types, au_log *log) { au_service *service = NULL; au_node *temp_entry = NULL; au_host *global_host = NULL; json_object *json_service_availability = NULL; service = au_find_service(log->services, host_name, service_description); if(NULL == service) { /* service has no log entries, so create the service */ service = au_add_service(log->services, host_name, service_description); /* Add global events to this new service */ global_host = au_find_host(log->hosts, "*"); if(NULL != global_host) { for(temp_entry = global_host->log_entries->head; NULL != temp_entry; temp_entry = temp_entry->next) { if(au_list_add_node(service->log_entries, temp_entry->data, au_cmp_log_entries) == 0) { break; } } } } if((service->availability = calloc(1, sizeof(au_availability))) != NULL) { compute_service_availability(query_time, start_time, end_time, log, service, report_timeperiod, assume_initial_state, assumed_initial_service_state, assume_state_during_nagios_downtime, assume_state_retention); json_service_availability = json_archive_service_availability(format_options, service->host_name, service->description, service->availability); } return json_service_availability; } json_object *json_archive_host_availability(unsigned format_options, char *name, au_availability *availability) { json_object *json_host_availability; json_host_availability = json_new_object(); if(name != NULL) { json_object_append_string(json_host_availability, "name", &percent_escapes, name); } json_object_append_duration(json_host_availability, "time_up", availability->time_up); json_object_append_duration(json_host_availability, "time_down", availability->time_down); json_object_append_duration(json_host_availability, "time_unreachable", availability->time_unreachable); json_object_append_duration(json_host_availability, "scheduled_time_up", availability->scheduled_time_up); json_object_append_duration(json_host_availability, "scheduled_time_down", availability->scheduled_time_down); json_object_append_duration(json_host_availability, "scheduled_time_unreachable", availability->scheduled_time_unreachable); json_object_append_duration(json_host_availability, "time_indeterminate_nodata", availability->time_indeterminate_nodata); json_object_append_duration(json_host_availability, "time_indeterminate_notrunning", availability->time_indeterminate_notrunning); return json_host_availability; } json_object *json_archive_service_availability(unsigned format_options, char *host_name, char *description, au_availability *availability) { json_object *json_service_availability; json_service_availability = json_new_object(); if(host_name != NULL) { json_object_append_string(json_service_availability, "host_name", &percent_escapes, host_name); } if(description != NULL) { json_object_append_string(json_service_availability, "description", &percent_escapes, description); } json_object_append_duration(json_service_availability, "time_ok", availability->time_ok); json_object_append_duration(json_service_availability, "time_warning", availability->time_warning); json_object_append_duration(json_service_availability, "time_critical", availability->time_critical); json_object_append_duration(json_service_availability, "time_unknown", availability->time_unknown); json_object_append_duration(json_service_availability, "scheduled_time_ok", availability->scheduled_time_ok); json_object_append_duration(json_service_availability, "scheduled_time_warning", availability->scheduled_time_warning); json_object_append_duration(json_service_availability, "scheduled_time_critical", availability->scheduled_time_critical); json_object_append_duration(json_service_availability, "scheduled_time_unknown", availability->scheduled_time_unknown); json_object_append_duration(json_service_availability, "time_indeterminate_nodata", availability->time_indeterminate_nodata); json_object_append_duration(json_service_availability, "time_indeterminate_notrunning", availability->time_indeterminate_notrunning); return json_service_availability; } nagios-4.3.4/cgi/archiveutils.c000066400000000000000000001325721314764422400164330ustar00rootroot00000000000000/************************************************************************** * * ARCHIVEUTILS.C - Utilities for Nagios CGIs that read archive logs * * Copyright (c) 2013 Nagios Enterprises, LLC * Last Modified: 06-30-2013 * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *************************************************************************/ #include "../include/config.h" #include "../include/common.h" #include "../include/objects.h" #include "../include/statusdata.h" #include "../include/comments.h" #include "../include/cgiutils.h" #include "../include/statusdata.h" #include "../include/archiveutils.h" #define AU_INITIAL_LIST_SIZE 16 const string_value_mapping svm_au_object_types[] = { { "none", AU_OBJTYPE_NONE, "None" }, { "host", AU_OBJTYPE_HOST, "Host" }, { "service", AU_OBJTYPE_SERVICE, "Service" }, { NULL, -1, NULL }, }; const string_value_mapping svm_au_state_types[] = { { "hard", AU_STATETYPE_HARD, "Hard" }, { "soft", AU_STATETYPE_SOFT, "Soft" }, { "nodata", AU_STATETYPE_NO_DATA, "No Data" }, { NULL, -1, NULL }, }; const string_value_mapping svm_au_states[] = { { "nodata", AU_STATE_NO_DATA, "No Data" }, { "up", AU_STATE_HOST_UP, "Host Up" }, { "down", AU_STATE_HOST_DOWN, "How Down" }, { "unreachable", AU_STATE_HOST_UNREACHABLE, "Host Unreachable" }, { "ok", AU_STATE_SERVICE_OK, "Service OK" }, { "warning", AU_STATE_SERVICE_WARNING, "Service Warning" }, { "critical", AU_STATE_SERVICE_CRITICAL, "Service Critical" }, { "unknown", AU_STATE_SERVICE_UNKNOWN, "Service Unknown" }, { "programstart", AU_STATE_PROGRAM_START, "Program Start"}, { "programend", AU_STATE_PROGRAM_END, "Program End"}, { "downtimestart", AU_STATE_DOWNTIME_START, "Downtime Start"}, { "downtimeend", AU_STATE_DOWNTIME_END, "Downtime End"}, { "currentstate", AU_STATE_CURRENT_STATE, "Current State"}, { NULL, -1, NULL }, }; const string_value_mapping svm_au_log_types[] = { { "alert", AU_LOGTYPE_ALERT, "Alert" }, { "initialstate", AU_LOGTYPE_STATE_INITIAL, "Initial State" }, { "currentstate", AU_LOGTYPE_STATE_CURRENT, "Current State" }, { "notification", AU_LOGTYPE_NOTIFICATION, "Notification" }, { "downtime", AU_LOGTYPE_DOWNTIME, "Downtime" }, { "nagios", AU_LOGTYPE_NAGIOS, "Nagios" }, { NULL, -1, NULL }, }; const string_value_mapping svm_au_notification_types[] = { { "nodata", AU_NOTIFICATION_NO_DATA, "No Data" }, { "down", AU_NOTIFICATION_HOST_DOWN, "Host Down" }, { "unreachable", AU_NOTIFICATION_HOST_UNREACHABLE, "Host Unreachable" }, { "recovery", AU_NOTIFICATION_HOST_RECOVERY, "Host Recovery" }, { "hostcustom", AU_NOTIFICATION_HOST_CUSTOM, "Host Custom" }, { "hostack", AU_NOTIFICATION_HOST_ACK, "Host Acknowledgement" }, { "hostflapstart", AU_NOTIFICATION_HOST_FLAPPING_START, "Host Flapping Start" }, { "hostflapstop", AU_NOTIFICATION_HOST_FLAPPING_STOP, "Host Flapping Stop" }, { "critical", AU_NOTIFICATION_SERVICE_CRITICAL, "Service Critical" }, { "warning", AU_NOTIFICATION_SERVICE_WARNING, "Service Warning" }, { "recovery", AU_NOTIFICATION_SERVICE_RECOVERY, "Service Recovery" }, { "custom", AU_NOTIFICATION_SERVICE_CUSTOM, "Service Custom" }, { "serviceack", AU_NOTIFICATION_SERVICE_ACK, "Service Acknowledgement" }, { "serviceflapstart", AU_NOTIFICATION_SERVICE_FLAPPING_START, "Service Flapping Start" }, { "serviceflapstop", AU_NOTIFICATION_SERVICE_FLAPPING_STOP, "Service Flapping Stop" }, { "unknown", AU_NOTIFICATION_SERVICE_UNKNOWN, "Service Unknown" }, { NULL, -1, NULL }, }; /* Function prototypes */ int read_log_file(char *, unsigned, unsigned, unsigned, au_log *); int au_add_nagios_log(au_log *, time_t, int, char *); void au_free_nagios_log(au_log_nagios *); int parse_states_and_alerts(char *, time_t, int, unsigned, unsigned, au_log *); int parse_downtime_alerts(char *, time_t, unsigned, au_log *); int au_add_downtime_log(au_log *, time_t, int, void *, int); void au_free_downtime_log(au_log_downtime *); int parse_notification_log(char *, time_t, int, au_log *); int au_add_notification_log(au_log *, time_t, int, void *, au_contact *, int, char *, char *); void au_free_notification_log(au_log_notification *); au_log_entry *au_add_log_entry(au_log *, time_t, int, void *); void au_free_log_entry_void(void *); void au_free_log_entry(au_log_entry *); au_host *au_add_host_and_sort(au_array *, char *); void au_free_host_void(void *); void au_free_host(au_host *); int au_cmp_hosts(const void *, const void *); au_service *au_add_service_and_sort(au_array *, char *, char *); int au_cmp_services(const void *, const void *); void au_free_service_void(void *); void au_free_service(au_service *); au_contact *au_add_contact_and_sort(au_array *, char *); au_contact *au_add_contact(au_array *, char *); void au_free_contact_void(void *); void au_free_contact(au_contact *); int au_cmp_contacts(const void *, const void *); au_contact *au_find_contact(au_array *, char *); void au_sort_array(au_array *, int(*cmp)(const void *, const void *)); void *au_find_in_array(au_array *, void *, int(*cmp)(const void *, const void *)); au_linked_list *au_init_list(char *); void au_empty_list(au_linked_list *, void(*)(void *)); void au_free_list(au_linked_list *, void(*)(void *)); /* External variables */ extern int log_rotation_method; /* Initialize log structure */ au_log *au_init_log(void) { au_log *log; /* Initialize the log structure itself */ if((log = calloc(1, sizeof( au_log))) == NULL) { return NULL; } /* Initialize the host subjects */ if((log->host_subjects = au_init_array("host_subjects")) == NULL) { au_free_log(log); return NULL; } /* Initialize the service subjects */ if((log->service_subjects = au_init_array("service_subjects")) == NULL) { au_free_log(log); return NULL; } /* Initialize the log entry list */ if((log->entry_list = au_init_list("global log entries")) == NULL) { au_free_log(log); return NULL; } /* Initialize the host list */ if((log->hosts = au_init_array("hosts")) == NULL) { au_free_log(log); return NULL; } /* Initialize the service list */ if((log->services = au_init_array("services")) == NULL) { au_free_log(log); return NULL; } /* Initialize the contact list */ if((log->contacts = au_init_array("contacts")) == NULL) { au_free_log(log); return NULL; } return log; } void au_free_log(au_log *log) { if(NULL == log) return; if(NULL != log->host_subjects) { au_free_array(log->host_subjects, au_free_host_void); } if(NULL != log->service_subjects) { au_free_array(log->service_subjects, au_free_service_void); } if(NULL != log->hosts) { au_free_array(log->hosts, au_free_host_void); } if(NULL != log->services) { au_free_array(log->services, au_free_service_void); } if(NULL != log->contacts) { au_free_array(log->contacts, au_free_contact_void); } if(NULL != log->entry_list) { au_free_list(log->entry_list, au_free_log_entry_void); } free(log); } /* reads log files for archived data */ int read_archived_data(time_t start_time, time_t end_time, int backtrack_archives, unsigned obj_types, unsigned state_types, unsigned log_types, au_log *log, time_t *last_archive_data_update) { char filename[MAX_FILENAME_LENGTH]; int oldest_archive = 0; int newest_archive = 0; int current_archive = 0; int x; int retval = 1; au_host *global_host; au_host *temp_host; au_service *temp_service; au_node *temp_entry; struct stat adstat; /* Determine oldest archive to use when scanning for data (include backtracked archives as well) */ oldest_archive = determine_archive_to_use_from_time(start_time); if(log_rotation_method != LOG_ROTATION_NONE) { oldest_archive += backtrack_archives; } /* determine most recent archive to use when scanning for data */ newest_archive = determine_archive_to_use_from_time(end_time); if(oldest_archive < newest_archive) { oldest_archive = newest_archive; } /* read in all the necessary archived logs (from most recent to earliest) */ for(current_archive = newest_archive; current_archive <= oldest_archive; current_archive++) { #ifdef DEBUG printf("Reading archive #%d... ", current_archive); #endif /* get the name of the log file that contains this archive */ get_log_archive_to_use(current_archive, filename, sizeof(filename) - 1); #ifdef DEBUG printf("Archive name: '%s'\n", filename); #endif /* Record the last modification time of the the archive file */ if(stat(filename, &adstat) < 0) { /* ENOENT is OK because Nagios may have been down when the logs were being rotated */ if(ENOENT != errno) return -1; } else { if(*last_archive_data_update < adstat.st_mtime) { *last_archive_data_update = adstat.st_mtime; } /* scan the log file for archived state data */ if(read_log_file(filename, obj_types, state_types, log_types, log) == 0) { return 0; /* Memory allocation error */ } } } /* Add Nagios log events to all hosts and services found */ global_host = au_find_host(log->hosts, "*"); if(NULL != global_host) { for(temp_entry = global_host->log_entries->head; NULL != temp_entry; temp_entry = temp_entry->next) { for(x = 0; x < log->hosts->count; x++) { temp_host = log->hosts->members[x]; if(temp_host == global_host) continue; if(au_list_add_node(temp_host->log_entries, temp_entry->data, au_cmp_log_entries) == 0) { retval = 0; break; } } if(0 == retval) break; for(x = 0; x < log->services->count; x++) { temp_service = log->services->members[x]; if(au_list_add_node(temp_service->log_entries, temp_entry->data, au_cmp_log_entries) == 0) { retval = 0; break; } } if(0 == retval) break; } } return 1; } /* grabs archives state data from a log file */ int read_log_file(char *filename, unsigned obj_types, unsigned state_types, unsigned log_types, au_log *log) { char *input = NULL; char *input2 = NULL; char *temp_buffer = NULL; time_t time_stamp; mmapfile *thefile = NULL; int retval = 1; if((thefile = mmap_fopen(filename)) == NULL) { return 1; } while(1) { /* free memory */ free(input); free(input2); input = NULL; input2 = NULL; /* read the next line */ if((input = mmap_fgets(thefile)) == NULL) break; strip(input); if((input2 = strdup(input)) == NULL) continue; temp_buffer = my_strtok(input2, "]"); time_stamp = (temp_buffer == NULL) ? (time_t)0 : (time_t)strtoul(temp_buffer + 1, NULL, 10); /* program starts/restarts */ if(strstr(input, " starting...")) { if(au_add_nagios_log(log, time_stamp, AU_STATE_PROGRAM_START, "Program start") == 0) { retval = 0; break; } } if(strstr(input, " restarting...")) { if(au_add_nagios_log(log, time_stamp, AU_STATE_PROGRAM_START, "Program restart") == 0) { retval = 0; break; } } /* program stops */ if(strstr(input, " shutting down...")) { if(au_add_nagios_log(log, time_stamp, AU_STATE_PROGRAM_END, "Normal program termination") == 0) { retval = 0; break; } } if(strstr(input, "Bailing out")) { if(au_add_nagios_log(log, time_stamp, AU_STATE_PROGRAM_END, "Abnormal program termination") == 0) { retval = 0; break; } } if(obj_types & AU_OBJTYPE_HOST) { /* normal host alerts */ if((log_types & AU_LOGTYPE_ALERT) && strstr(input, "HOST ALERT:")) { if(parse_states_and_alerts(input, time_stamp, AU_LOGTYPE_ALERT, AU_OBJTYPE_HOST, state_types, log) == 0) { retval = 0; break; } } /* host initial states */ else if((log_types & AU_LOGTYPE_STATE) && strstr(input, "INITIAL HOST STATE:")) { if(parse_states_and_alerts(input, time_stamp, AU_LOGTYPE_STATE_INITIAL, AU_OBJTYPE_HOST, state_types, log) == 0) { retval = 0; break; } } /* host current states */ else if((log_types & AU_LOGTYPE_STATE) && strstr(input, "CURRENT HOST STATE:")) { if(parse_states_and_alerts(input, time_stamp, AU_LOGTYPE_STATE_CURRENT, AU_OBJTYPE_HOST, state_types, log) == 0) { retval = 0; break; } } /* scheduled downtime notices */ else if((log_types & AU_LOGTYPE_DOWNTIME) && strstr(input, "HOST DOWNTIME ALERT:")) { if(parse_downtime_alerts(input, time_stamp, AU_OBJTYPE_HOST, log) == 0) { retval = 0; break; } } /* host notifications */ else if((log_types & AU_LOGTYPE_NOTIFICATION) && strstr(input, "HOST NOTIFICATION:")) { if(parse_notification_log(input, time_stamp, AU_OBJTYPE_HOST, log) ==0) { retval = 0; break; } } } if(obj_types & AU_OBJTYPE_SERVICE) { /* normal service alerts */ if((log_types & AU_LOGTYPE_ALERT) && strstr(input, "SERVICE ALERT:")) { if(parse_states_and_alerts(input, time_stamp, AU_LOGTYPE_ALERT, AU_OBJTYPE_SERVICE, state_types, log) == 0) { retval = 0; break; } } /* service initial states */ else if((log_types & AU_LOGTYPE_STATE) && strstr(input, "INITIAL SERVICE STATE:")) { if(parse_states_and_alerts(input, time_stamp, AU_LOGTYPE_STATE_INITIAL, AU_OBJTYPE_SERVICE, state_types, log) == 0) { retval = 0; break; } } /* service current states */ else if((log_types & AU_LOGTYPE_STATE) && strstr(input, "CURRENT SERVICE STATE:")) { if(parse_states_and_alerts(input, time_stamp, AU_LOGTYPE_STATE_CURRENT, AU_OBJTYPE_SERVICE, state_types, log) == 0) { retval = 0; break; } } /* scheduled service downtime notices */ else if((log_types & AU_LOGTYPE_DOWNTIME) && strstr(input, "SERVICE DOWNTIME ALERT:")) { if(parse_downtime_alerts(input, time_stamp, AU_OBJTYPE_SERVICE, log) == 0) { retval = 0; break; } } /* service notifications */ else if((log_types & AU_LOGTYPE_NOTIFICATION) && strstr(input, "SERVICE NOTIFICATION:")) { if(parse_notification_log(input, time_stamp, AU_OBJTYPE_SERVICE, log) ==0) { retval = 0; break; } } } } /* free memory and close the file */ free(input); free(input2); mmap_fclose(thefile); return retval; } int au_cmp_log_entries(const void *a, const void *b) { au_log_entry *lea = *(au_log_entry **)a; au_log_entry *leb = *(au_log_entry **)b; if(lea->timestamp == leb->timestamp) return 0; else if(lea->timestamp < leb->timestamp) return -1; else return 1; } int au_add_nagios_log(au_log *log, time_t timestamp, int type, char *description) { au_log_nagios *nagios_log; au_log_entry *new_log_entry; au_host *global_host; /* Create the au_log_nagios */ if((nagios_log = calloc(1, sizeof(au_log_nagios))) == NULL) { return 0; } nagios_log->type = type; if((nagios_log->description = strdup(description)) == NULL) { au_free_nagios_log(nagios_log); return 0; } /* Create the log entry */ if((new_log_entry = au_add_log_entry(log, timestamp, AU_LOGTYPE_NAGIOS, (void *)nagios_log)) == NULL) { au_free_nagios_log(nagios_log); return 0; } /* Find the au_host object associated with the global host */ global_host = au_find_host(log->hosts, "*"); if(NULL == global_host) { global_host = au_add_host_and_sort(log->hosts, "*"); if(NULL == global_host) { /* Could not allocate memory */ return 0; } } /* Add the entry to the global host */ if(au_list_add_node(global_host->log_entries, new_log_entry, au_cmp_log_entries) == 0) { return 0; } return 1; } void au_free_nagios_log(au_log_nagios *nagios_log) { if(NULL == nagios_log) return; if(NULL != nagios_log->description) free(nagios_log->description); free(nagios_log); } /* parse state and alert log entries */ int parse_states_and_alerts(char *input, time_t timestamp, int log_type, unsigned obj_type, unsigned state_types, au_log *log) { char *temp_buffer = NULL; char entry_host_name[MAX_INPUT_BUFFER]; char entry_svc_description[MAX_INPUT_BUFFER]; char *plugin_output; au_host *temp_host_subject; au_host *temp_host = NULL; au_service *temp_service_subject; au_service *temp_service = NULL; int state_type; int state; /* get host name */ temp_buffer = my_strtok(NULL, ":"); temp_buffer = my_strtok(NULL, ";"); strncpy(entry_host_name, (temp_buffer == NULL) ? "" : temp_buffer + 1, sizeof(entry_host_name)); entry_host_name[sizeof(entry_host_name) - 1] = '\x0'; switch(obj_type) { case AU_OBJTYPE_HOST: if(log->host_subjects->count > 0) { /* see if there is a corresponding subject for this host */ temp_host_subject = au_find_host(log->host_subjects, entry_host_name); if(temp_host_subject == NULL) return 1; } /* Find the au_host object associated with the host name */ temp_host = au_find_host(log->hosts, entry_host_name); if(NULL == temp_host) { temp_host = au_add_host_and_sort(log->hosts, entry_host_name); if(NULL == temp_host) { /* Could not allocate memory */ return 0; } } break; case AU_OBJTYPE_SERVICE: /* get service description */ temp_buffer = my_strtok(NULL, ";"); strncpy(entry_svc_description, (temp_buffer == NULL) ? "" : temp_buffer, sizeof(entry_svc_description)); entry_svc_description[sizeof(entry_svc_description) - 1] = '\x0'; if(log->service_subjects->count > 0) { /* see if there is a corresponding subject for this service */ temp_service_subject = au_find_service(log->service_subjects, entry_host_name, entry_svc_description); if(temp_service_subject == NULL) return 1; } /* Find the au_service object associated with the service */ temp_service = au_find_service(log->services, entry_host_name, entry_svc_description); if(NULL == temp_service) { temp_service = au_add_service_and_sort(log->services, entry_host_name, entry_svc_description); if(NULL == temp_service) { /* Could not allocate memory */ return 0; } } break; } /* state types */ if(strstr(input, ";SOFT;")) { if(!(state_types & AU_STATETYPE_SOFT)) return 1; state_type = AU_STATETYPE_SOFT; } if(strstr(input, ";HARD;")) { if(!(state_types & AU_STATETYPE_HARD)) return 1; state_type = AU_STATETYPE_HARD; } /* get the plugin output */ temp_buffer = my_strtok(NULL, ";"); temp_buffer = my_strtok(NULL, ";"); temp_buffer = my_strtok(NULL, ";"); plugin_output = my_strtok(NULL, "\n"); switch(obj_type) { case AU_OBJTYPE_HOST: if(strstr(input, ";DOWN;")) { state = AU_STATE_HOST_DOWN; } else if(strstr(input, ";UNREACHABLE;")) { state = AU_STATE_HOST_UNREACHABLE; } else if(strstr(input, ";RECOVERY") || strstr(input, ";UP;")) { state = AU_STATE_HOST_UP; } else { state = AU_STATE_NO_DATA; state_type = AU_STATETYPE_NO_DATA; } if(au_add_alert_or_state_log(log, timestamp, log_type, AU_OBJTYPE_HOST, (void *)temp_host, state_type, state, plugin_output) == 0) { return 0; } break; case AU_OBJTYPE_SERVICE: if(strstr(input, ";CRITICAL;")) { state = AU_STATE_SERVICE_CRITICAL; } else if(strstr(input, ";WARNING;")) { state = AU_STATE_SERVICE_WARNING; } else if(strstr(input, ";UNKNOWN;")) { state = AU_STATE_SERVICE_UNKNOWN; } else if(strstr(input, ";RECOVERY;") || strstr(input, ";OK;")) { state = AU_STATE_SERVICE_OK; } else { state = AU_STATE_NO_DATA; state_type = AU_STATETYPE_NO_DATA; } if(au_add_alert_or_state_log(log, timestamp, log_type, AU_OBJTYPE_SERVICE, (void *)temp_service, state_type, state, plugin_output) == 0) { return 0; } break; } return 1; } int au_add_alert_or_state_log(au_log *log, time_t timestamp, int log_type, int obj_type, void *object, int state_type, int state, char *plugin_output) { au_log_alert *alert_log; au_log_entry *new_log_entry; /* Create the au_log_alert */ if((alert_log = au_create_alert_or_state_log(obj_type, object, state_type, state, plugin_output)) == NULL) { return 0; } /* Create the log entry */ if((new_log_entry = au_add_log_entry(log, timestamp, log_type, (void *)alert_log)) == NULL) { au_free_alert_log(alert_log); return 0; } /* Add the log entry to the logs for the object supplied */ switch(obj_type) { case AU_OBJTYPE_HOST: if(au_list_add_node(((au_host *)object)->log_entries, new_log_entry, au_cmp_log_entries) == 0) { return 0; } break; case AU_OBJTYPE_SERVICE: if(au_list_add_node(((au_service *)object)->log_entries, new_log_entry, au_cmp_log_entries) == 0) { return 0; } break; } return 1; } au_log_alert *au_create_alert_or_state_log(int obj_type, void *object, int state_type, int state, char *plugin_output) { au_log_alert *alert_log; /* Create the au_log_alert */ if((alert_log = calloc(1, sizeof(au_log_alert))) == NULL) { return NULL; } alert_log->obj_type = obj_type; alert_log->object = object; alert_log->state_type = state_type; alert_log->state = state; alert_log->plugin_output = NULL; if(plugin_output != NULL) { if((alert_log->plugin_output = strdup(plugin_output)) == NULL) { au_free_alert_log(alert_log); return NULL; } } return alert_log; } void au_free_alert_log(au_log_alert *alert_log) { if(NULL == alert_log) return; if(NULL != alert_log->plugin_output) free(alert_log->plugin_output); free(alert_log); } /* parse archive log downtime notifications */ int parse_downtime_alerts(char *input, time_t timestamp, unsigned obj_type, au_log *log) { char *temp_buffer = NULL; char entry_host_name[MAX_INPUT_BUFFER]; char entry_svc_description[MAX_INPUT_BUFFER]; au_host *temp_host_subject; au_host *temp_host = NULL; au_service *temp_service_subject; au_service *temp_service = NULL; /* get host name */ temp_buffer = my_strtok(NULL, ":"); temp_buffer = my_strtok(NULL, ";"); strncpy(entry_host_name, (temp_buffer == NULL) ? "" : temp_buffer + 1, sizeof(entry_host_name)); entry_host_name[sizeof(entry_host_name) - 1] = '\x0'; switch(obj_type) { case AU_OBJTYPE_HOST: if(log->host_subjects->count > 0) { /* see if there is a corresponding subject for this host */ temp_host_subject = au_find_host(log->host_subjects, entry_host_name); if(temp_host_subject == NULL) return 1; } /* Find the au_host object associated with the host name */ temp_host = au_find_host(log->hosts, entry_host_name); if(NULL == temp_host) { temp_host = au_add_host_and_sort(log->hosts, entry_host_name); if(NULL == temp_host) { /* Could not allocate memory */ return 0; } } break; case AU_OBJTYPE_SERVICE: /* get service description */ temp_buffer = my_strtok(NULL, ";"); strncpy(entry_svc_description, (temp_buffer == NULL) ? "" : temp_buffer, sizeof(entry_svc_description)); entry_svc_description[sizeof(entry_svc_description) - 1] = '\x0'; if(log->service_subjects->count > 0) { /* see if there is a corresponding subject for this service */ temp_service_subject = au_find_service(log->service_subjects, entry_host_name, entry_svc_description); if(temp_service_subject == NULL) return 1; } /* Find the au_service object associated with the service */ temp_service = au_find_service(log->services, entry_host_name, entry_svc_description); if(NULL == temp_service) { temp_service = au_add_service_and_sort(log->services, entry_host_name, entry_svc_description); if(NULL == temp_service) { /* Could not allocate memory */ return 0; } } break; } switch(obj_type) { case AU_OBJTYPE_HOST: if(strstr(input, ";STARTED;")) { if(au_add_downtime_log(log, timestamp, AU_OBJTYPE_HOST, (void *)temp_host, AU_STATE_DOWNTIME_START) == 0) { return 0; } } else { if(au_add_downtime_log(log, timestamp, AU_OBJTYPE_HOST, (void *)temp_host, AU_STATE_DOWNTIME_END) == 0) { return 0; } } break; case AU_OBJTYPE_SERVICE: if(strstr(input, ";STARTED;")) { if(au_add_downtime_log(log, timestamp, AU_OBJTYPE_SERVICE, (void *)temp_service, AU_STATE_DOWNTIME_START) == 0) { return 0; } } else { if(au_add_downtime_log(log, timestamp, AU_OBJTYPE_SERVICE, (void *)temp_service, AU_STATE_DOWNTIME_END) == 0) { return 0; } } break; } return 1; } int au_add_downtime_log(au_log *log, time_t timestamp, int obj_type, void *object, int downtime_type) { au_log_downtime *downtime_log; au_log_entry *new_log_entry; /* Create the au_log_downtime */ if((downtime_log = calloc(1, sizeof(au_log_downtime))) == NULL) { return 0; } downtime_log->obj_type = obj_type; downtime_log->object = object; downtime_log->downtime_type = downtime_type; /* Create the log entry */ if((new_log_entry = au_add_log_entry(log, timestamp, AU_LOGTYPE_DOWNTIME, (void *)downtime_log)) == NULL) { au_free_downtime_log(downtime_log); return 0; } /* Add the log entry to the logs for the object supplied */ switch(obj_type) { case AU_OBJTYPE_HOST: if(au_list_add_node(((au_host *)object)->log_entries, new_log_entry, au_cmp_log_entries) == 0) { return 0; } break; case AU_OBJTYPE_SERVICE: if(au_list_add_node(((au_service *)object)->log_entries, new_log_entry, au_cmp_log_entries) == 0) { return 0; } break; } return 1; } void au_free_downtime_log(au_log_downtime *downtime_log) { if(NULL == downtime_log) return; free(downtime_log); } int parse_notification_log(char *input, time_t timestamp, int obj_type, au_log *log) { char entry_contact_name[MAX_INPUT_BUFFER]; char entry_host_name[MAX_INPUT_BUFFER]; char entry_svc_description[MAX_INPUT_BUFFER]; char alert_level[MAX_INPUT_BUFFER]; char method_name[MAX_INPUT_BUFFER]; int notification_detail_type = AU_NOTIFICATION_NO_DATA; char *temp_buffer = NULL; au_host *temp_host_subject; au_service *temp_service_subject; au_contact *temp_contact; au_host *temp_host = NULL; au_service *temp_service = NULL; /* get the contact name */ temp_buffer = my_strtok(NULL, ":"); temp_buffer = my_strtok(NULL, ";"); strncpy(entry_contact_name, (temp_buffer == NULL) ? "" : temp_buffer + 1, sizeof(entry_contact_name)); entry_contact_name[sizeof(entry_contact_name) - 1] = '\x0'; /* Find the au_contact object associated with the contact name */ temp_contact = au_find_contact(log->contacts, entry_contact_name); if(NULL == temp_contact) { temp_contact = au_add_contact_and_sort(log->contacts, entry_contact_name); if(NULL == temp_contact) { /* Could not allocate memory */ return 0; } } /* get the host name */ temp_buffer = (char *)my_strtok(NULL, ";"); snprintf(entry_host_name, sizeof(entry_host_name), "%s", (temp_buffer == NULL) ? "" : temp_buffer); entry_host_name[sizeof(entry_host_name) - 1] = '\x0'; switch(obj_type) { case AU_OBJTYPE_HOST: if(log->host_subjects->count > 0) { /* see if there is a corresponding subject for this host */ temp_host_subject = au_find_host(log->host_subjects, entry_host_name); if(temp_host_subject == NULL) return 1; } /* Find the au_host object associated with the host name */ temp_host = au_find_host(log->hosts, entry_host_name); if(NULL == temp_host) { temp_host = au_add_host_and_sort(log->hosts, entry_host_name); if(NULL == temp_host) { /* Could not allocate memory */ return 0; } } break; case AU_OBJTYPE_SERVICE: /* get service description */ temp_buffer = my_strtok(NULL, ";"); strncpy(entry_svc_description, (temp_buffer == NULL) ? "" : temp_buffer, sizeof(entry_svc_description)); entry_svc_description[sizeof(entry_svc_description) - 1] = '\x0'; if(log->service_subjects->count > 0) { /* see if there is a corresponding subject for this service */ temp_service_subject = au_find_service(log->service_subjects, entry_host_name, entry_svc_description); if(temp_service_subject == NULL) return 1; } /* Find the au_service object associated with the service */ temp_service = au_find_service(log->services, entry_host_name, entry_svc_description); if(NULL == temp_service) { temp_service = au_add_service_and_sort(log->services, entry_host_name, entry_svc_description); if(NULL == temp_service) { /* Could not allocate memory */ return 0; } } break; } /* get the alert level */ temp_buffer = (char *)my_strtok(NULL, ";"); snprintf(alert_level, sizeof(alert_level), "%s", (temp_buffer == NULL) ? "" : temp_buffer); alert_level[sizeof(alert_level) - 1] = '\x0'; switch(obj_type) { case AU_OBJTYPE_HOST: if(!strcmp(alert_level, "DOWN")) { notification_detail_type = AU_NOTIFICATION_HOST_DOWN; } else if(!strcmp(alert_level, "UNREACHABLE")) { notification_detail_type = AU_NOTIFICATION_HOST_UNREACHABLE; } else if(!strcmp(alert_level, "RECOVERY") || !strcmp(alert_level, "UP")) { notification_detail_type = AU_NOTIFICATION_HOST_RECOVERY; } else if(strstr(alert_level, "CUSTOM (")) { notification_detail_type = AU_NOTIFICATION_HOST_CUSTOM; } else if(strstr(alert_level, "ACKNOWLEDGEMENT (")) { notification_detail_type = AU_NOTIFICATION_HOST_ACK; } else if(strstr(alert_level, "FLAPPINGSTART (")) { notification_detail_type = AU_NOTIFICATION_HOST_FLAPPING_START; } else if(strstr(alert_level, "FLAPPINGSTOP (")) { notification_detail_type = AU_NOTIFICATION_HOST_FLAPPING_STOP; } break; case AU_OBJTYPE_SERVICE: if(!strcmp(alert_level, "CRITICAL")) { notification_detail_type = AU_NOTIFICATION_SERVICE_CRITICAL; } else if(!strcmp(alert_level, "WARNING")) { notification_detail_type = AU_NOTIFICATION_SERVICE_WARNING; } else if(!strcmp(alert_level, "RECOVERY") || !strcmp(alert_level, "OK")) { notification_detail_type = AU_NOTIFICATION_SERVICE_RECOVERY; } else if(strstr(alert_level, "CUSTOM (")) { notification_detail_type = AU_NOTIFICATION_SERVICE_CUSTOM; } else if(strstr(alert_level, "ACKNOWLEDGEMENT (")) { notification_detail_type = AU_NOTIFICATION_SERVICE_ACK; } else if(strstr(alert_level, "FLAPPINGSTART (")) { notification_detail_type = AU_NOTIFICATION_SERVICE_FLAPPING_START; } else if(strstr(alert_level, "FLAPPINGSTOP (")) { notification_detail_type = AU_NOTIFICATION_SERVICE_FLAPPING_STOP; } else { notification_detail_type = AU_NOTIFICATION_SERVICE_UNKNOWN; } break; } /* get the method name */ temp_buffer = (char *)my_strtok(NULL, ";"); snprintf(method_name, sizeof(method_name), "%s", (temp_buffer == NULL) ? "" : temp_buffer); method_name[sizeof(method_name) - 1] = '\x0'; /* move to the informational message */ temp_buffer = my_strtok(NULL, ";"); /* Create the log entry */ switch(obj_type) { case AU_OBJTYPE_HOST: if(au_add_notification_log(log, timestamp, AU_OBJTYPE_HOST, (void *)temp_host, temp_contact, notification_detail_type, method_name, temp_buffer) == 0) { return 0; } break; case AU_OBJTYPE_SERVICE: if(au_add_notification_log(log, timestamp, AU_OBJTYPE_SERVICE, (void *)temp_service, temp_contact, notification_detail_type, method_name, temp_buffer) == 0) { return 0; } break; } return 1; } int au_add_notification_log(au_log *log, time_t timestamp, int obj_type, void *object, au_contact *contact, int notification_type, char *method, char *message) { au_log_notification *notification_log; au_log_entry *new_log_entry; /* Create the au_log_downtime */ if((notification_log = calloc(1, sizeof(au_log_notification))) == NULL) { return 0; } notification_log->obj_type = obj_type; notification_log->object = object; notification_log->contact = contact; notification_log->notification_type = notification_type; if((notification_log->method = strdup(method)) == NULL) { au_free_notification_log(notification_log); return 0; } if((notification_log->message = strdup(message)) == NULL) { au_free_notification_log(notification_log); return 0; } /* Create the log entry */ if((new_log_entry = au_add_log_entry(log, timestamp, AU_LOGTYPE_NOTIFICATION, (void *)notification_log)) == NULL) { au_free_notification_log(notification_log); return 0; } /* Add the log entry to the logs for the object supplied */ switch(obj_type) { case AU_OBJTYPE_HOST: if(au_list_add_node((void *)((au_host *)object)->log_entries, new_log_entry, au_cmp_log_entries) == 0) { return 0; } break; case AU_OBJTYPE_SERVICE: if(au_list_add_node((void *)((au_service *)object)->log_entries, new_log_entry, au_cmp_log_entries) == 0) { return 0; } break; } return 1; } void au_free_notification_log(au_log_notification *notification_log) { if(NULL == notification_log) return; if(NULL != notification_log->method) free(notification_log->method); if(NULL != notification_log->message) free(notification_log->message); free(notification_log); } au_log_entry *au_add_log_entry(au_log *log, time_t timestamp, int entry_type, void *entry) { au_log_entry *new_log_entry; /* Create the au_log_entry */ if((new_log_entry = calloc(1, sizeof(au_log_entry))) == NULL) { return NULL; } new_log_entry->timestamp = timestamp; new_log_entry->entry_type = entry_type; new_log_entry->entry = entry; if(au_list_add_node(log->entry_list, (void *)new_log_entry, au_cmp_log_entries) == NULL) { au_free_log_entry(new_log_entry); return NULL; } return new_log_entry; } void au_free_log_entry_void(void *log_entry) { au_free_log_entry((au_log_entry *)log_entry); } void au_free_log_entry(au_log_entry *log_entry) { if(NULL == log_entry) return; switch(log_entry->entry_type) { case AU_LOGTYPE_ALERT: case AU_LOGTYPE_STATE: au_free_alert_log((au_log_alert *)log_entry->entry); break; case AU_LOGTYPE_NOTIFICATION: au_free_notification_log((au_log_notification *)log_entry->entry); break; case AU_LOGTYPE_DOWNTIME: au_free_downtime_log((au_log_downtime *)log_entry->entry); break; case AU_LOGTYPE_NAGIOS: au_free_nagios_log((au_log_nagios *)log_entry->entry); break; } free(log_entry); } /* Add a host to a host list and sort the list */ au_host *au_add_host_and_sort(au_array *host_list, char *name) { au_host *temp_host; temp_host = au_add_host(host_list, name); if(NULL != temp_host) { au_sort_array(host_list, au_cmp_hosts); } return temp_host; } /* Add a host to a host list */ au_host *au_add_host(au_array *host_list, char *name) { au_host *new_host; char buf[8192]; /* Should have been allocated during au_log_init() */ if(NULL == host_list) { return NULL; } /* Create the host */ if((new_host = calloc(1, sizeof(au_host))) == NULL) { return NULL; } if((new_host->name = strdup(name)) == NULL) { au_free_host(new_host); return NULL; } new_host->hostp = find_host(name); new_host->availability = NULL; snprintf(buf, sizeof(buf) - 1, "Host %s log entries", name); if((new_host->log_entries = au_init_list(buf)) == NULL) { au_free_host(new_host); return NULL; } /* Add it to the list of hosts */ if(0 == au_array_append_member(host_list, (void *)new_host)) { au_free_host(new_host); return NULL; } return new_host; } void au_free_host_void(void *host) { au_free_host((au_host *)host); } void au_free_host(au_host *host) { if(NULL == host) return; if(NULL != host->name) free(host->name); /* Do not free the log entry data here because they are freed when the master list's log entries are freed */ if(NULL != host->log_entries) au_free_list(host->log_entries, NULL); if(NULL != host->availability) free(host->availability); free(host); return; } int au_cmp_hosts(const void *a, const void *b) { au_host *hosta = *(au_host **)a; au_host *hostb = *(au_host **)b; return strcmp(hosta->name, hostb->name); } au_host *au_find_host(au_array *host_list, char *name) { au_host key; void *found; if(NULL == host_list) return NULL; key.name = name; found = au_find_in_array(host_list, (void *)&key, au_cmp_hosts); if(NULL == found) return NULL; return *(au_host **)found; } au_service *au_add_service_and_sort(au_array *service_list, char *host_name, char *description) { au_service *temp_service; temp_service = au_add_service(service_list, host_name, description); if(NULL != temp_service) { au_sort_array(service_list, au_cmp_services); } return temp_service; } au_service *au_add_service(au_array *service_list, char *host_name, char *description) { au_service *new_service; char buf[8192]; /* Should have been allocated during au_log_init() */ if(NULL == service_list) { return NULL; } /* Create the service */ if((new_service = calloc(1, sizeof(au_service))) == NULL) { return NULL; } if((new_service->host_name = strdup(host_name)) == NULL) { au_free_service(new_service); return NULL; } if((new_service->description = strdup(description)) == NULL) { au_free_service(new_service); return NULL; } new_service->servicep = find_service(host_name, description); new_service->availability = NULL; snprintf(buf, sizeof(buf) - 1, "Service %s:%s log entries", host_name, description); if((new_service->log_entries = au_init_list(buf)) == NULL) { au_free_service(new_service); return NULL; } /* Add it to the list of services */ if(0 == au_array_append_member(service_list, (void *)new_service)) { au_free_service(new_service); return NULL; } return new_service; } void au_free_service_void(void *service) { au_free_service((au_service *)service); } void au_free_service(au_service *service) { if(NULL == service) return; if(NULL != service->host_name) free(service->host_name); if(NULL != service->description) free(service->description); /* Do not free the log entry data here because they are freed when the master list's log entries are freed */ if(NULL != service->log_entries) au_free_list(service->log_entries, NULL); if(NULL != service->availability) free(service->availability); free(service); return; } au_service *au_find_service(au_array *service_list, char *host_name, char *description) { au_service key; void *found; if(NULL == service_list) return NULL; key.host_name = host_name; key.description = description; found = (au_service *)au_find_in_array(service_list, (void *)&key, au_cmp_services); if(NULL == found) return NULL; return *(au_service **)found; } int au_cmp_services(const void *a, const void *b) { au_service *servicea = *(au_service **)a; au_service *serviceb = *(au_service **)b; int host_result; host_result = strcmp(servicea->host_name, serviceb->host_name); if(0 == host_result) { return strcmp(servicea->description, serviceb->description); } else { return host_result; } } /* Add a contact to a contact list and sort the list */ au_contact *au_add_contact_and_sort(au_array *contact_list, char *name) { au_contact *temp_contact; temp_contact = au_add_contact(contact_list, name); if(NULL != temp_contact) { au_sort_array(contact_list, au_cmp_contacts); } return temp_contact; } /* Add a contact to a contact list */ au_contact *au_add_contact(au_array *contact_list, char *name) { au_contact *new_contact; /* Should have been allocated during au_log_init() */ if(NULL == contact_list) { return NULL; } /* Create the contact */ if((new_contact = calloc(1, sizeof(au_contact))) == NULL) { return NULL; } if((new_contact->name = strdup(name)) == NULL) { au_free_contact(new_contact); return NULL; } /* Add it to the list of contacts */ if(0 == au_array_append_member(contact_list, (void *)new_contact)) { au_free_contact(new_contact); return NULL; } return new_contact; } void au_free_contact_void(void *contact) { au_free_contact((au_contact *)contact); } void au_free_contact(au_contact *contact) { if(NULL == contact) return; if(NULL != contact->name) free(contact->name); free(contact); return; } int au_cmp_contacts(const void *a, const void *b) { au_contact *contacta = (au_contact *)a; au_contact *contactb = (au_contact *)b; return strcmp(contacta->name, contactb->name); } au_contact *au_find_contact(au_array *contact_list, char *name) { au_contact key; void *found; if(NULL == contact_list) return NULL; key.name = name; found = (au_contact *)au_find_in_array(contact_list, (void *)&key, au_cmp_contacts); if(NULL == found) return NULL; return *(au_contact **)found; } au_array *au_init_array(char *label) { au_array *array; if((array = calloc(1, sizeof(au_array))) == NULL) { return NULL; } array->label = NULL; if(NULL != label) { if((array->label = strdup(label)) == NULL) { free(array); return NULL; } } array->size = 0; array->count = 0; array->members = (void **)NULL; array->new = 0; return array; } void au_free_array(au_array *array, void(*datafree)(void *)) { int x; if(NULL == array) return; if(NULL != array->label) free(array->label); for(x = 0; x < array->count; x++) { if((NULL != datafree) && (NULL != array->members[x])) { datafree(array->members[x]); } } if(NULL != array->members) free(array->members); free(array); return; } int au_array_append_member(au_array *array, void *member) { /* Check whether the list needs to be grown before adding the member */ if(array->count == array->size) { /* Need to grow the list */ if(0 == array->count) { /* Never had any members */ if((array->members = (void **)calloc(AU_INITIAL_LIST_SIZE, sizeof(void *))) == NULL) { return 0; } array->size = AU_INITIAL_LIST_SIZE; } else { /* Double the size of the list */ if((array->members = (void **)realloc(array->members, sizeof(void *) * array->size * 2)) == NULL) { return 0; } array->size *= 2; } } array->members[array->count] = member; array->new++; /* Number of appends since last sort */ array->count++; return 1; } void au_sort_array(au_array *array, int(*cmp)(const void *, const void *)) { /* TODO: Use array->new to determine whether to do a quick sort or a bubble sort */ qsort(array->members, array->count, sizeof(void *), cmp); array->new = 0; } void *au_find_in_array(au_array *array, void *key, int(*cmp)(const void *, const void *)) { return bsearch(&key, array->members, array->count, sizeof(void *), cmp); } au_linked_list *au_init_list(char *label) { au_linked_list *list; if((list = calloc(1, sizeof(au_linked_list))) == NULL) { return NULL; } list->label = NULL; if(NULL != label) { if((list->label = strdup(label)) == NULL) { free(list); return NULL; } } list->head = (au_node *)0; list->last_new = (au_node *)0; return list; } au_node *au_list_add_node(au_linked_list *list, void *data, int(*cmp)(const void *, const void *)) { au_node *new_node; au_node *temp_node; /* Create the new node */ if((new_node = calloc(1, sizeof(au_node))) == NULL) { return NULL; } new_node->data = data; new_node->next = NULL; /* Add it to the list */ if(NULL == list->head) { /* If the list is empty, add this node as the only item in the list */ list->head = new_node; } else if(cmp(&(list->last_new->data), &(new_node->data)) <= 0) { /* The new node goes somewhere on the list downstream of the most recently added node */ if(NULL == list->last_new->next) { /* If the most recently added node is the last one on the list, append the list with this node */ list->last_new->next = new_node; } else if(cmp(&(list->last_new->next->data), &(new_node->data)) > 0) { /* If the next node is "greater than" the new node, the new node goes here */ new_node->next = list->last_new->next; list->last_new->next = new_node; } else { /* Visit each node downstream in the list until we reach the end of the list or until we find a node whose next node is "greater than" the new node */ temp_node = list->last_new; while((NULL != temp_node->next) && (cmp(&(temp_node->next->data), &(new_node->data)) <= 0)) { temp_node = temp_node->next; } if(NULL == temp_node->next) { /* If we reach the end of the list, the new node gets appended */ temp_node->next = new_node; } else { /* Otherwise, the new node gets inserted here */ new_node->next = temp_node->next; temp_node->next = new_node; } } } else { /* The new node is "less than" the last new node. Visit each node starting at the beginning of the list until we reach the end of the list (which shouldn't happen because that case was covered earlier) or we find a node whose next node is is "greater than" the new node. */ temp_node = list->head; while((NULL != temp_node->next) && (cmp(&(temp_node->next->data), &(new_node->data)) <= 0)) { temp_node = temp_node->next; } if(temp_node == list->head) { /* We insert at the beginning of the list */ new_node->next = list->head; list->head = new_node; } else if(NULL == temp_node->next) { /* If we reach the end of the list, the new node gets appended */ temp_node->next = new_node; } else { /* Otherwise, the new node gets inserted here */ new_node->next = temp_node->next; temp_node->next = new_node; } } list->last_new = new_node; return new_node; } void au_empty_list(au_linked_list *list, void(*datafree)(void *)) { au_node *temp_node1; au_node *temp_node2; temp_node1 = list->head; while(NULL != temp_node1) { temp_node2 = temp_node1->next; if((NULL != datafree) && (NULL != temp_node1->data)) { datafree(temp_node1->data); } free(temp_node1); temp_node1 = temp_node2; } list->head = NULL; list->last_new = NULL; } void au_free_list(au_linked_list *list, void(*datafree)(void *)) { if(NULL == list) return; if(NULL != list->label) free(list->label); au_empty_list(list, datafree); free(list); } nagios-4.3.4/cgi/avail.c000066400000000000000000005610031314764422400150200ustar00rootroot00000000000000/************************************************************************** * * AVAIL.C - Nagios Availability CGI * * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *************************************************************************/ #include "../include/config.h" #include "../include/common.h" #include "../include/objects.h" #include "../include/comments.h" #include "../include/statusdata.h" #include "../include/cgiutils.h" #include "../include/cgiauth.h" #include "../include/getcgi.h" extern char main_config_file[MAX_FILENAME_LENGTH]; extern char url_html_path[MAX_FILENAME_LENGTH]; extern char url_images_path[MAX_FILENAME_LENGTH]; extern char url_stylesheets_path[MAX_FILENAME_LENGTH]; #ifndef max #define max(a,b) (((a) > (b)) ? (a) : (b)) #endif #ifndef min #define min(a,b) (((a) < (b)) ? (a) : (b)) #endif /* output types */ #define HTML_OUTPUT 0 #define CSV_OUTPUT 1 /* archived state types */ #define AS_CURRENT_STATE -1 /* special case for initial assumed state */ #define AS_NO_DATA 0 #define AS_PROGRAM_END 1 #define AS_PROGRAM_START 2 #define AS_HOST_UP 3 #define AS_HOST_DOWN 4 #define AS_HOST_UNREACHABLE 5 #define AS_SVC_OK 6 #define AS_SVC_UNKNOWN 7 #define AS_SVC_WARNING 8 #define AS_SVC_CRITICAL 9 #define AS_SVC_DOWNTIME_START 10 #define AS_SVC_DOWNTIME_END 11 #define AS_HOST_DOWNTIME_START 12 #define AS_HOST_DOWNTIME_END 13 #define AS_SOFT_STATE 1 #define AS_HARD_STATE 2 /* display types */ #define DISPLAY_NO_AVAIL 0 #define DISPLAY_HOSTGROUP_AVAIL 1 #define DISPLAY_HOST_AVAIL 2 #define DISPLAY_SERVICE_AVAIL 3 #define DISPLAY_SERVICEGROUP_AVAIL 4 /* subject types */ #define HOST_SUBJECT 0 #define SERVICE_SUBJECT 1 /* standard report times */ #define TIMEPERIOD_CUSTOM 0 #define TIMEPERIOD_TODAY 1 #define TIMEPERIOD_YESTERDAY 2 #define TIMEPERIOD_THISWEEK 3 #define TIMEPERIOD_LASTWEEK 4 #define TIMEPERIOD_THISMONTH 5 #define TIMEPERIOD_LASTMONTH 6 #define TIMEPERIOD_THISQUARTER 7 #define TIMEPERIOD_LASTQUARTER 8 #define TIMEPERIOD_THISYEAR 9 #define TIMEPERIOD_LASTYEAR 10 #define TIMEPERIOD_LAST24HOURS 11 #define TIMEPERIOD_LAST7DAYS 12 #define TIMEPERIOD_LAST31DAYS 13 #define MIN_TIMESTAMP_SPACING 10 #define MAX_ARCHIVE_SPREAD 65 #define MAX_ARCHIVE 65 #define MAX_ARCHIVE_BACKTRACKS 60 authdata current_authdata; typedef struct archived_state_struct { time_t time_stamp; int entry_type; int state_type; char *state_info; int processed_state; struct archived_state_struct *misc_ptr; struct archived_state_struct *next; } archived_state; typedef struct avail_subject_struct { int type; char *host_name; char *service_description; archived_state *as_list; /* archived state list */ archived_state *as_list_tail; archived_state *sd_list; /* scheduled downtime list */ int last_known_state; time_t earliest_time; time_t latest_time; int earliest_state; int latest_state; unsigned long time_up; unsigned long time_down; unsigned long time_unreachable; unsigned long time_ok; unsigned long time_warning; unsigned long time_unknown; unsigned long time_critical; unsigned long scheduled_time_up; unsigned long scheduled_time_down; unsigned long scheduled_time_unreachable; unsigned long scheduled_time_ok; unsigned long scheduled_time_warning; unsigned long scheduled_time_unknown; unsigned long scheduled_time_critical; unsigned long scheduled_time_indeterminate; unsigned long time_indeterminate_nodata; unsigned long time_indeterminate_notrunning; struct avail_subject_struct *next; } avail_subject; avail_subject *subject_list = NULL; time_t t1; time_t t2; int display_type = DISPLAY_NO_AVAIL; int timeperiod_type = TIMEPERIOD_LAST24HOURS; int show_log_entries = FALSE; int full_log_entries = FALSE; int show_scheduled_downtime = TRUE; int start_second = 0; int start_minute = 0; int start_hour = 0; int start_day = 1; int start_month = 1; int start_year = 2000; int end_second = 0; int end_minute = 0; int end_hour = 24; int end_day = 1; int end_month = 1; int end_year = 2000; int get_date_parts = FALSE; int select_hostgroups = FALSE; int select_hosts = FALSE; int select_servicegroups = FALSE; int select_services = FALSE; int select_output_format = FALSE; int compute_time_from_parts = FALSE; int show_all_hostgroups = FALSE; int show_all_hosts = FALSE; int show_all_servicegroups = FALSE; int show_all_services = FALSE; int assume_initial_states = TRUE; int assume_state_retention = TRUE; int assume_states_during_notrunning = TRUE; int initial_assumed_host_state = AS_NO_DATA; int initial_assumed_service_state = AS_NO_DATA; int include_soft_states = FALSE; char *hostgroup_name = ""; char *host_name = ""; char *servicegroup_name = ""; char *svc_description = ""; void create_subject_list(void); void add_subject(int, char *, char *); avail_subject *find_subject(int, char *, char *); void compute_availability(void); void compute_subject_availability(avail_subject *, time_t); void compute_subject_availability_times(int, int, time_t, time_t, time_t, avail_subject *, archived_state *); void compute_subject_downtime(avail_subject *, time_t); void compute_subject_downtime_times(time_t, time_t, avail_subject *, archived_state *); void compute_subject_downtime_part_times(time_t, time_t, int, avail_subject *); void display_hostgroup_availability(void); void display_specific_hostgroup_availability(hostgroup *); void display_servicegroup_availability(void); void display_specific_servicegroup_availability(servicegroup *); void display_host_availability(void); void display_service_availability(void); void write_log_entries(avail_subject *); void get_running_average(double *, double, int); void host_report_url(const char *, const char *); void service_report_url(const char *, const char *, const char *); void compute_report_times(void); int convert_host_state_to_archived_state(int); int convert_service_state_to_archived_state(int); void add_global_archived_state(int, int, time_t, const char *); void add_archived_state(int, int, time_t, const char *, avail_subject *); void add_scheduled_downtime(int, time_t, avail_subject *); void free_availability_data(void); void free_archived_state_list(archived_state *); void read_archived_state_data(void); void scan_log_file_for_archived_state_data(char *); void convert_timeperiod_to_times(int); unsigned long calculate_total_time(time_t, time_t); void document_header(int); void document_footer(void); int process_cgivars(void); int backtrack_archives = 2; int earliest_archive = 0; int embedded = FALSE; int display_header = TRUE; timeperiod *current_timeperiod = NULL; int output_format = HTML_OUTPUT; int main(int argc, char **argv) { char temp_buffer[MAX_INPUT_BUFFER]; char start_timestring[MAX_DATETIME_LENGTH]; char end_timestring[MAX_DATETIME_LENGTH]; host *temp_host; service *temp_service; int is_authorized = TRUE; time_t report_start_time; time_t report_end_time; int days, hours, minutes, seconds; hostgroup *temp_hostgroup; servicegroup *temp_servicegroup; timeperiod *temp_timeperiod; time_t t3; time_t current_time; struct tm *t; char *firsthostpointer; /* reset internal CGI variables */ reset_cgi_vars(); cgi_init(document_header, document_footer, READ_ALL_OBJECT_DATA, READ_ALL_STATUS_DATA); /* initialize time period to last 24 hours */ time(¤t_time); t2 = current_time; t1 = (time_t)(current_time - (60 * 60 * 24)); /* default number of backtracked archives */ switch(log_rotation_method) { case LOG_ROTATION_MONTHLY: backtrack_archives = 1; break; case LOG_ROTATION_WEEKLY: backtrack_archives = 2; break; case LOG_ROTATION_DAILY: backtrack_archives = 4; break; case LOG_ROTATION_HOURLY: backtrack_archives = 8; break; default: backtrack_archives = 2; break; } /* get the arguments passed in the URL */ process_cgivars(); document_header(TRUE); /* get authentication information */ get_authentication_information(¤t_authdata); if(compute_time_from_parts == TRUE) compute_report_times(); /* make sure times are sane, otherwise swap them */ if(t2 < t1) { t3 = t2; t2 = t1; t1 = t3; } /* don't let user create reports in the future */ if(t2 > current_time) { t2 = current_time; if(t1 > t2) t1 = t2 - (60 * 60 * 24); } if(display_header == TRUE) { /* begin top table */ printf("\n"); printf("\n"); /* left column of the first row */ printf("\n"); /* center column of top row */ printf("\n"); /* right hand column of top row */ printf("\n"); /* end of top table */ printf("\n"); printf("
\n"); switch(display_type) { case DISPLAY_HOST_AVAIL: snprintf(temp_buffer, sizeof(temp_buffer) - 1, "Host Availability Report"); break; case DISPLAY_SERVICE_AVAIL: snprintf(temp_buffer, sizeof(temp_buffer) - 1, "Service Availability Report"); break; case DISPLAY_HOSTGROUP_AVAIL: snprintf(temp_buffer, sizeof(temp_buffer) - 1, "Hostgroup Availability Report"); break; case DISPLAY_SERVICEGROUP_AVAIL: snprintf(temp_buffer, sizeof(temp_buffer) - 1, "Servicegroup Availability Report"); break; default: snprintf(temp_buffer, sizeof(temp_buffer) - 1, "Availability Report"); break; } temp_buffer[sizeof(temp_buffer) - 1] = '\x0'; display_info_table(temp_buffer, FALSE, ¤t_authdata); if(((display_type == DISPLAY_HOST_AVAIL && show_all_hosts == FALSE) || (display_type == DISPLAY_SERVICE_AVAIL && show_all_services == FALSE)) && get_date_parts == FALSE) { printf("\n"); printf("\n"); printf("\n"); } printf("\n"); if(display_type != DISPLAY_NO_AVAIL && get_date_parts == FALSE) { printf("
\n"); if(display_type == DISPLAY_HOST_AVAIL) { if(show_all_hosts == TRUE) printf("All Hosts"); else printf("Host '%s'", host_name); } else if(display_type == DISPLAY_SERVICE_AVAIL) { if(show_all_services == TRUE) printf("All Services"); else printf("Service '%s' On Host '%s'", svc_description, host_name); } else if(display_type == DISPLAY_HOSTGROUP_AVAIL) { if(show_all_hostgroups == TRUE) printf("All Hostgroups"); else printf("Hostgroup '%s'", hostgroup_name); } else if(display_type == DISPLAY_SERVICEGROUP_AVAIL) { if(show_all_servicegroups == TRUE) printf("All Servicegroups"); else printf("Servicegroup '%s'", servicegroup_name); } printf("
\n"); printf("
\n"); printf("Availability Report\n", url_images_path, TRENDS_ICON); printf("
\n"); get_time_string(&t1, start_timestring, sizeof(start_timestring) - 1, SHORT_DATE_TIME); get_time_string(&t2, end_timestring, sizeof(end_timestring) - 1, SHORT_DATE_TIME); printf("
%s to %s
\n", start_timestring, end_timestring); get_time_breakdown((time_t)(t2 - t1), &days, &hours, &minutes, &seconds); printf("
Duration: %dd %dh %dm %ds", days, hours, minutes, seconds); if (current_timeperiod) printf("
(using timeperiod %s)", current_timeperiod->name); printf("
\n"); } printf("
\n"); printf("
\n", AVAIL_CGI); printf("\n"); if(display_type != DISPLAY_NO_AVAIL && get_date_parts == FALSE) { printf("\n", (display_type == DISPLAY_SERVICE_AVAIL) ? "service" : "host", (display_type == DISPLAY_HOST_AVAIL || display_type == DISPLAY_HOSTGROUP_AVAIL || display_type == DISPLAY_SERVICEGROUP_AVAIL) ? "First assumed service state" : ""); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); } /* display context-sensitive help */ printf("\n"); printf("
First assumed %s state:%s
\n"); printf("\n", (unsigned long)t1); printf("\n", (unsigned long)t2); if(show_log_entries == TRUE) printf("\n"); if(full_log_entries == TRUE) printf("\n"); if(display_type == DISPLAY_HOSTGROUP_AVAIL) printf("\n", escape_string(hostgroup_name)); if(display_type == DISPLAY_HOST_AVAIL || display_type == DISPLAY_SERVICE_AVAIL) printf("\n", escape_string(host_name)); if(display_type == DISPLAY_SERVICE_AVAIL) printf("\n", escape_string(svc_description)); if(display_type == DISPLAY_SERVICEGROUP_AVAIL) printf("\n", escape_string(servicegroup_name)); printf("\n", (assume_initial_states == TRUE) ? "yes" : "no"); printf("\n", (assume_state_retention == TRUE) ? "yes" : "no"); printf("\n", (assume_states_during_notrunning == TRUE) ? "yes" : "no"); printf("\n", (include_soft_states == TRUE) ? "yes" : "no"); if(display_type == DISPLAY_HOST_AVAIL || display_type == DISPLAY_HOSTGROUP_AVAIL || display_type == DISPLAY_SERVICEGROUP_AVAIL) { printf("\n"); } else { printf("", initial_assumed_host_state); printf("\n"); } printf("\n"); if(display_type == DISPLAY_HOST_AVAIL || display_type == DISPLAY_HOSTGROUP_AVAIL || display_type == DISPLAY_SERVICEGROUP_AVAIL) { printf("\n"); } printf("
Report period:Backtracked archives:
\n"); printf("\n"); printf("\n"); printf("\n", backtrack_archives); printf("
\n"); printf("\n"); printf("
\n"); if(get_date_parts == TRUE) display_context_help(CONTEXTHELP_AVAIL_MENU5); else if(select_hostgroups == TRUE) display_context_help(CONTEXTHELP_AVAIL_MENU2); else if(select_hosts == TRUE) display_context_help(CONTEXTHELP_AVAIL_MENU3); else if(select_services == TRUE) display_context_help(CONTEXTHELP_AVAIL_MENU4); else if(display_type == DISPLAY_HOSTGROUP_AVAIL) display_context_help(CONTEXTHELP_AVAIL_HOSTGROUP); else if(display_type == DISPLAY_HOST_AVAIL) display_context_help(CONTEXTHELP_AVAIL_HOST); else if(display_type == DISPLAY_SERVICE_AVAIL) display_context_help(CONTEXTHELP_AVAIL_SERVICE); else if(display_type == DISPLAY_SERVICEGROUP_AVAIL) display_context_help(CONTEXTHELP_AVAIL_SERVICEGROUP); else display_context_help(CONTEXTHELP_AVAIL_MENU1); printf("
\n"); printf("
\n"); printf("
\n"); } /* step 3 - ask user for report date range */ if(get_date_parts == TRUE) { time(¤t_time); t = localtime(¤t_time); start_day = 1; start_year = t->tm_year + 1900; end_day = t->tm_mday; end_year = t->tm_year + 1900; printf("

Step 3: Select Report Options

\n"); printf("

\n"); printf("
\n", AVAIL_CGI); printf("\n"); if(display_type == DISPLAY_HOSTGROUP_AVAIL) printf("\n", escape_string(hostgroup_name)); if(display_type == DISPLAY_HOST_AVAIL || display_type == DISPLAY_SERVICE_AVAIL) printf("\n", escape_string(host_name)); if(display_type == DISPLAY_SERVICE_AVAIL) printf("\n", escape_string(svc_description)); if(display_type == DISPLAY_SERVICEGROUP_AVAIL) printf("\n", escape_string(servicegroup_name)); printf("\n"); printf(""); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf(""); printf("\n"); printf("\n"); printf("\n"); printf(""); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf(""); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); if(display_type != DISPLAY_SERVICE_AVAIL) { printf("\n"); printf("\n"); } printf("\n"); printf("\n"); printf("\n"); printf("\n"); if((display_type == DISPLAY_HOST_AVAIL && show_all_hosts == TRUE) || (display_type == DISPLAY_SERVICE_AVAIL && show_all_services == TRUE)) { printf(""); printf("\n"); printf("\n"); printf("\n"); } printf("\n"); printf("
Report Period:\n"); printf("\n"); printf("
If Custom Report Period...
Start Date (Inclusive):"); printf("\n "); printf(" ", start_day); printf("", start_year); printf("\n"); printf("\n"); printf("\n"); printf("
End Date (Inclusive):"); printf("\n "); printf(" ", end_day); printf("", end_year); printf("\n"); printf("\n"); printf("\n"); printf("

Report time Period:\n"); printf("\n"); printf("

Assume Initial States:\n"); printf("\n"); printf("
Assume State Retention:\n"); printf("\n"); printf("
Assume States During Program Downtime:\n"); printf("\n"); printf("
Include Soft States:\n"); printf("\n"); printf("
First Assumed Host State:\n"); printf("\n"); printf("
First Assumed Service State:\n"); printf("\n"); printf("
Backtracked Archives (To Scan For Initial States):\n"); printf("\n", backtrack_archives); printf("
Output in CSV Format:"); printf("\n"); printf("
\n"); printf("
\n"); printf("

\n"); } /* step 2 - the user wants to select a hostgroup */ else if(select_hostgroups == TRUE) { printf("

Step 2: Select Hostgroup

\n"); printf("

\n"); printf("
\n", AVAIL_CGI); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("
Hostgroup(s):\n"); printf("\n"); printf("
\n"); printf("
\n"); printf("

\n"); } /* step 2 - the user wants to select a host */ else if(select_hosts == TRUE) { printf("

Step 2: Select Host

\n"); printf("

\n"); printf("
\n", AVAIL_CGI); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("
Host(s):\n"); printf("\n"); printf("
\n"); printf("
\n"); printf("

\n"); printf("
Tip: If you want to have the option of getting the availability data in CSV format, select '** ALL HOSTS **' from the pull-down menu.\n"); } /* step 2 - the user wants to select a servicegroup */ else if(select_servicegroups == TRUE) { printf("

Step 2: Select Servicegroup

\n"); printf("

\n"); printf("
\n", AVAIL_CGI); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("
Servicegroup(s):\n"); printf("\n"); printf("
\n"); printf("
\n"); printf("

\n"); } /* step 2 - the user wants to select a service */ else if(select_services == TRUE) { printf("\n"); printf("

Step 2: Select Service

\n"); printf("

\n"); printf("
\n", AVAIL_CGI); printf("\n"); printf("\n", (firsthostpointer == NULL) ? "unknown" : (char *)escape_string(firsthostpointer)); printf("\n"); printf("\n"); printf("\n"); printf("
Service(s):\n"); printf("\n"); printf("
\n"); printf("
\n"); printf("

\n"); printf("
Tip: If you want to have the option of getting the availability data in CSV format, select '** ALL SERVICES **' from the pull-down menu.\n"); } /* generate availability report */ else if(display_type != DISPLAY_NO_AVAIL) { /* check authorization */ is_authorized = TRUE; if((display_type == DISPLAY_HOST_AVAIL && show_all_hosts == FALSE) || (display_type == DISPLAY_SERVICE_AVAIL && show_all_services == FALSE)) { if(display_type == DISPLAY_HOST_AVAIL && show_all_hosts == FALSE) is_authorized = is_authorized_for_host(find_host(host_name), ¤t_authdata); else is_authorized = is_authorized_for_service(find_service(host_name, svc_description), ¤t_authdata); } if(is_authorized == FALSE) printf("

It appears as though you are not authorized to view information for the specified %s...

\n", (display_type == DISPLAY_HOST_AVAIL) ? "host" : "service"); else { time(&report_start_time); /* create list of subjects to collect availability data for */ create_subject_list(); /* read in all necessary archived state data */ read_archived_state_data(); /* compute availability data */ compute_availability(); time(&report_end_time); if(output_format == HTML_OUTPUT) { get_time_breakdown((time_t)(report_end_time - report_start_time), &days, &hours, &minutes, &seconds); printf("
[ Availability report completed in %d min %d sec ]
\n", minutes, seconds); printf("

\n"); } /* display availability data */ if(display_type == DISPLAY_HOST_AVAIL) display_host_availability(); else if(display_type == DISPLAY_SERVICE_AVAIL) display_service_availability(); else if(display_type == DISPLAY_HOSTGROUP_AVAIL) display_hostgroup_availability(); else if(display_type == DISPLAY_SERVICEGROUP_AVAIL) display_servicegroup_availability(); /* free memory allocated to availability data */ free_availability_data(); } } /* step 1 - ask the user what kind of report they want */ else { printf("

Step 1: Select Report Type

\n"); printf("

\n"); printf("
\n", AVAIL_CGI); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("
Type:\n"); printf("\n"); printf("
\n"); printf("
\n"); printf("

\n"); } document_footer(); /* free all other allocated memory */ free_memory(); return OK; } void document_header(int use_stylesheet) { char date_time[MAX_DATETIME_LENGTH]; time_t current_time; time_t expire_time; printf("Cache-Control: no-store\r\n"); printf("Pragma: no-cache\r\n"); time(¤t_time); get_time_string(¤t_time, date_time, sizeof(date_time), HTTP_DATE_TIME); printf("Last-Modified: %s\r\n", date_time); expire_time = (time_t)0; get_time_string(&expire_time, date_time, sizeof(date_time), HTTP_DATE_TIME); printf("Expires: %s\r\n", date_time); if(output_format == HTML_OUTPUT) printf("Content-type: text/html; charset=utf-8\r\n\r\n"); else { printf("Content-type: text/csv\r\n\r\n"); return; } if(embedded == TRUE || output_format == CSV_OUTPUT) return; printf("\n"); printf("\n"); printf("\n", url_images_path); printf("\n"); printf("Nagios Availability\n"); printf("\n"); if(use_stylesheet == TRUE) { printf("\n", url_stylesheets_path, COMMON_CSS); printf("\n", url_stylesheets_path, AVAIL_CSS); } printf("\n"); printf("\n"); /* include user SSI header */ include_ssi_files(AVAIL_CGI, SSI_HEADER); return; } void document_footer(void) { if(output_format != HTML_OUTPUT) return; if(embedded == TRUE) return; /* include user SSI footer */ include_ssi_files(AVAIL_CGI, SSI_FOOTER); printf("\n"); printf("\n"); return; } int process_cgivars(void) { char **variables; int error = FALSE; int x; variables = getcgivars(); for(x = 0; variables[x] != NULL; x++) { /* do some basic length checking on the variable identifier to prevent buffer overflows */ if(strlen(variables[x]) >= MAX_INPUT_BUFFER - 1) { continue; } /* we found the hostgroup argument */ else if(!strcmp(variables[x], "hostgroup")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if((hostgroup_name = (char *)strdup(variables[x])) == NULL) hostgroup_name = ""; strip_html_brackets(hostgroup_name); display_type = DISPLAY_HOSTGROUP_AVAIL; show_all_hostgroups = (strcmp(hostgroup_name, "all")) ? FALSE : TRUE; } /* we found the servicegroup argument */ else if(!strcmp(variables[x], "servicegroup")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if((servicegroup_name = (char *)strdup(variables[x])) == NULL) servicegroup_name = ""; strip_html_brackets(servicegroup_name); display_type = DISPLAY_SERVICEGROUP_AVAIL; show_all_servicegroups = (strcmp(servicegroup_name, "all")) ? FALSE : TRUE; } /* we found the host argument */ else if(!strcmp(variables[x], "host")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if((host_name = (char *)strdup(variables[x])) == NULL) host_name = ""; strip_html_brackets(host_name); display_type = DISPLAY_HOST_AVAIL; show_all_hosts = (strcmp(host_name, "all")) ? FALSE : TRUE; } /* we found the service description argument */ else if(!strcmp(variables[x], "service")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if((svc_description = (char *)strdup(variables[x])) == NULL) svc_description = ""; strip_html_brackets(svc_description); display_type = DISPLAY_SERVICE_AVAIL; show_all_services = (strcmp(svc_description, "all")) ? FALSE : TRUE; } /* we found first time argument */ else if(!strcmp(variables[x], "t1")) { x++; if(variables[x] == NULL) { error = TRUE; break; } t1 = (time_t)strtoul(variables[x], NULL, 10); timeperiod_type = TIMEPERIOD_CUSTOM; compute_time_from_parts = FALSE; } /* we found first time argument */ else if(!strcmp(variables[x], "t2")) { x++; if(variables[x] == NULL) { error = TRUE; break; } t2 = (time_t)strtoul(variables[x], NULL, 10); timeperiod_type = TIMEPERIOD_CUSTOM; compute_time_from_parts = FALSE; } /* we found the assume initial states option */ else if(!strcmp(variables[x], "assumeinitialstates")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(!strcmp(variables[x], "yes")) assume_initial_states = TRUE; else assume_initial_states = FALSE; } /* we found the assume state during program not running option */ else if(!strcmp(variables[x], "assumestatesduringnotrunning")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(!strcmp(variables[x], "yes")) assume_states_during_notrunning = TRUE; else assume_states_during_notrunning = FALSE; } /* we found the initial assumed host state option */ else if(!strcmp(variables[x], "initialassumedhoststate")) { x++; if(variables[x] == NULL) { error = TRUE; break; } initial_assumed_host_state = atoi(variables[x]); } /* we found the initial assumed service state option */ else if(!strcmp(variables[x], "initialassumedservicestate")) { x++; if(variables[x] == NULL) { error = TRUE; break; } initial_assumed_service_state = atoi(variables[x]); } /* we found the assume state retention option */ else if(!strcmp(variables[x], "assumestateretention")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(!strcmp(variables[x], "yes")) assume_state_retention = TRUE; else assume_state_retention = FALSE; } /* we found the include soft states option */ else if(!strcmp(variables[x], "includesoftstates")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(!strcmp(variables[x], "yes")) include_soft_states = TRUE; else include_soft_states = FALSE; } /* we found the backtrack archives argument */ else if(!strcmp(variables[x], "backtrack")) { x++; if(variables[x] == NULL) { error = TRUE; break; } backtrack_archives = atoi(variables[x]); if(backtrack_archives < 0) backtrack_archives = 0; if(backtrack_archives > MAX_ARCHIVE_BACKTRACKS) backtrack_archives = MAX_ARCHIVE_BACKTRACKS; #ifdef DEBUG printf("BACKTRACK ARCHIVES: %d\n", backtrack_archives); #endif } /* we found the standard timeperiod argument */ else if(!strcmp(variables[x], "timeperiod")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(!strcmp(variables[x], "today")) timeperiod_type = TIMEPERIOD_TODAY; else if(!strcmp(variables[x], "yesterday")) timeperiod_type = TIMEPERIOD_YESTERDAY; else if(!strcmp(variables[x], "thisweek")) timeperiod_type = TIMEPERIOD_THISWEEK; else if(!strcmp(variables[x], "lastweek")) timeperiod_type = TIMEPERIOD_LASTWEEK; else if(!strcmp(variables[x], "thismonth")) timeperiod_type = TIMEPERIOD_THISMONTH; else if(!strcmp(variables[x], "lastmonth")) timeperiod_type = TIMEPERIOD_LASTMONTH; else if(!strcmp(variables[x], "thisquarter")) timeperiod_type = TIMEPERIOD_THISQUARTER; else if(!strcmp(variables[x], "lastquarter")) timeperiod_type = TIMEPERIOD_LASTQUARTER; else if(!strcmp(variables[x], "thisyear")) timeperiod_type = TIMEPERIOD_THISYEAR; else if(!strcmp(variables[x], "lastyear")) timeperiod_type = TIMEPERIOD_LASTYEAR; else if(!strcmp(variables[x], "last24hours")) timeperiod_type = TIMEPERIOD_LAST24HOURS; else if(!strcmp(variables[x], "last7days")) timeperiod_type = TIMEPERIOD_LAST7DAYS; else if(!strcmp(variables[x], "last31days")) timeperiod_type = TIMEPERIOD_LAST31DAYS; else if(!strcmp(variables[x], "custom")) timeperiod_type = TIMEPERIOD_CUSTOM; else continue; convert_timeperiod_to_times(timeperiod_type); compute_time_from_parts = FALSE; } /* we found the embed option */ else if(!strcmp(variables[x], "embedded")) embedded = TRUE; /* we found the noheader option */ else if(!strcmp(variables[x], "noheader")) display_header = FALSE; /* we found the CSV output option */ else if(!strcmp(variables[x], "csvoutput")) { display_header = FALSE; output_format = CSV_OUTPUT; } /* we found the log entries option */ else if(!strcmp(variables[x], "show_log_entries")) show_log_entries = TRUE; /* we found the full log entries option */ else if(!strcmp(variables[x], "full_log_entries")) full_log_entries = TRUE; /* we found the get date parts option */ else if(!strcmp(variables[x], "get_date_parts")) get_date_parts = TRUE; /* we found the report type selection option */ else if(!strcmp(variables[x], "report_type")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(!strcmp(variables[x], "hostgroups")) select_hostgroups = TRUE; else if(!strcmp(variables[x], "servicegroups")) select_servicegroups = TRUE; else if(!strcmp(variables[x], "hosts")) select_hosts = TRUE; else select_services = TRUE; } /* we found time argument */ else if(!strcmp(variables[x], "smon")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(timeperiod_type != TIMEPERIOD_CUSTOM) continue; start_month = atoi(variables[x]); timeperiod_type = TIMEPERIOD_CUSTOM; compute_time_from_parts = TRUE; } /* we found time argument */ else if(!strcmp(variables[x], "sday")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(timeperiod_type != TIMEPERIOD_CUSTOM) continue; start_day = atoi(variables[x]); timeperiod_type = TIMEPERIOD_CUSTOM; compute_time_from_parts = TRUE; } /* we found time argument */ else if(!strcmp(variables[x], "syear")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(timeperiod_type != TIMEPERIOD_CUSTOM) continue; start_year = atoi(variables[x]); timeperiod_type = TIMEPERIOD_CUSTOM; compute_time_from_parts = TRUE; } /* we found time argument */ else if(!strcmp(variables[x], "smin")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(timeperiod_type != TIMEPERIOD_CUSTOM) continue; start_minute = atoi(variables[x]); timeperiod_type = TIMEPERIOD_CUSTOM; compute_time_from_parts = TRUE; } /* we found time argument */ else if(!strcmp(variables[x], "ssec")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(timeperiod_type != TIMEPERIOD_CUSTOM) continue; start_second = atoi(variables[x]); timeperiod_type = TIMEPERIOD_CUSTOM; compute_time_from_parts = TRUE; } /* we found time argument */ else if(!strcmp(variables[x], "shour")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(timeperiod_type != TIMEPERIOD_CUSTOM) continue; start_hour = atoi(variables[x]); timeperiod_type = TIMEPERIOD_CUSTOM; compute_time_from_parts = TRUE; } /* we found time argument */ else if(!strcmp(variables[x], "emon")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(timeperiod_type != TIMEPERIOD_CUSTOM) continue; end_month = atoi(variables[x]); timeperiod_type = TIMEPERIOD_CUSTOM; compute_time_from_parts = TRUE; } /* we found time argument */ else if(!strcmp(variables[x], "eday")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(timeperiod_type != TIMEPERIOD_CUSTOM) continue; end_day = atoi(variables[x]); timeperiod_type = TIMEPERIOD_CUSTOM; compute_time_from_parts = TRUE; } /* we found time argument */ else if(!strcmp(variables[x], "eyear")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(timeperiod_type != TIMEPERIOD_CUSTOM) continue; end_year = atoi(variables[x]); timeperiod_type = TIMEPERIOD_CUSTOM; compute_time_from_parts = TRUE; } /* we found time argument */ else if(!strcmp(variables[x], "emin")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(timeperiod_type != TIMEPERIOD_CUSTOM) continue; end_minute = atoi(variables[x]); timeperiod_type = TIMEPERIOD_CUSTOM; compute_time_from_parts = TRUE; } /* we found time argument */ else if(!strcmp(variables[x], "esec")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(timeperiod_type != TIMEPERIOD_CUSTOM) continue; end_second = atoi(variables[x]); timeperiod_type = TIMEPERIOD_CUSTOM; compute_time_from_parts = TRUE; } /* we found time argument */ else if(!strcmp(variables[x], "ehour")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(timeperiod_type != TIMEPERIOD_CUSTOM) continue; end_hour = atoi(variables[x]); timeperiod_type = TIMEPERIOD_CUSTOM; compute_time_from_parts = TRUE; } /* we found the show scheduled downtime option */ else if(!strcmp(variables[x], "showscheduleddowntime")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(!strcmp(variables[x], "yes")) show_scheduled_downtime = TRUE; else show_scheduled_downtime = FALSE; } /* we found the report timeperiod option */ else if(!strcmp(variables[x], "rpttimeperiod")) { timeperiod *temp_timeperiod; x++; if(variables[x] == NULL) { error = TRUE; break; } for(temp_timeperiod = timeperiod_list; temp_timeperiod != NULL; temp_timeperiod = temp_timeperiod->next) { if(!strcmp(temp_timeperiod->name, variables[x])) { current_timeperiod = temp_timeperiod; break; } } } } /* free memory allocated to the CGI variables */ free_cgivars(variables); return error; } /* computes availability data for all subjects */ void compute_availability(void) { avail_subject *temp_subject; time_t current_time; time(¤t_time); for(temp_subject = subject_list; temp_subject != NULL; temp_subject = temp_subject->next) { compute_subject_availability(temp_subject, current_time); compute_subject_downtime(temp_subject, current_time); } return; } /* computes availability data for a given subject */ void compute_subject_availability(avail_subject *subject, time_t current_time) { archived_state *temp_as; archived_state *last_as; time_t a; time_t b; int current_state = AS_NO_DATA; int have_some_real_data = FALSE; hoststatus *hststatus = NULL; servicestatus *svcstatus = NULL; time_t initial_assumed_time; int initial_assumed_state = AS_NO_DATA; int error; /* if left hand of graph is after current time, we can't do anything at all.... */ if(t1 > current_time) return; /* get current state of host or service if possible */ if(subject->type == HOST_SUBJECT) hststatus = find_hoststatus(subject->host_name); else svcstatus = find_servicestatus(subject->host_name, subject->service_description); /************************************/ /* INSERT CURRENT STATE (IF WE CAN) */ /************************************/ /* if current time DOES NOT fall within graph bounds, so we can't do anything as far as assuming current state */ /* if we don't have any data, assume current state (if possible) */ if(subject->as_list == NULL && current_time > t1 && current_time <= t2) { /* we don't have any historical information, but the current time falls within the reporting period, so use */ /* the current status of the host/service as the starting data */ if(subject->type == HOST_SUBJECT) { if(hststatus != NULL) { if(hststatus->status == SD_HOST_DOWN) subject->last_known_state = AS_HOST_DOWN; else if(hststatus->status == SD_HOST_UNREACHABLE) subject->last_known_state = AS_HOST_UNREACHABLE; else if(hststatus->status == SD_HOST_UP) subject->last_known_state = AS_HOST_UP; else subject->last_known_state = AS_NO_DATA; if(subject->last_known_state != AS_NO_DATA) { /* add a dummy archived state item, so something can get graphed */ add_archived_state(subject->last_known_state, AS_HARD_STATE, t1, "Current Host State Assumed (Faked Log Entry)", subject); } } } else { if(svcstatus != NULL) { if(svcstatus->status == SERVICE_OK) subject->last_known_state = AS_SVC_OK; else if(svcstatus->status == SERVICE_WARNING) subject->last_known_state = AS_SVC_WARNING; else if(svcstatus->status == SERVICE_CRITICAL) subject->last_known_state = AS_SVC_CRITICAL; else if(svcstatus->status == SERVICE_UNKNOWN) subject->last_known_state = AS_SVC_UNKNOWN; else subject->last_known_state = AS_NO_DATA; if(subject->last_known_state != AS_NO_DATA) { /* add a dummy archived state item, so something can get graphed */ add_archived_state(subject->last_known_state, AS_HARD_STATE, t1, "Current Service State Assumed (Faked Log Entry)", subject); } } } } /******************************************/ /* INSERT FIRST ASSUMED STATE (IF WE CAN) */ /******************************************/ if((subject->type == HOST_SUBJECT && initial_assumed_host_state != AS_NO_DATA) || (subject->type == SERVICE_SUBJECT && initial_assumed_service_state != AS_NO_DATA)) { /* see if its okay to assume initial state for this subject */ error = FALSE; if(subject->type == SERVICE_SUBJECT) { if(initial_assumed_service_state != AS_SVC_OK && initial_assumed_service_state != AS_SVC_WARNING && initial_assumed_service_state != AS_SVC_UNKNOWN && initial_assumed_service_state != AS_SVC_CRITICAL && initial_assumed_service_state != AS_CURRENT_STATE) error = TRUE; else initial_assumed_state = initial_assumed_service_state; if(initial_assumed_service_state == AS_CURRENT_STATE && svcstatus == NULL) error = TRUE; } else { if(initial_assumed_host_state != AS_HOST_UP && initial_assumed_host_state != AS_HOST_DOWN && initial_assumed_host_state != AS_HOST_UNREACHABLE && initial_assumed_host_state != AS_CURRENT_STATE) error = TRUE; else initial_assumed_state = initial_assumed_host_state; if(initial_assumed_host_state == AS_CURRENT_STATE && hststatus == NULL) error = TRUE; } /* get the current state if applicable */ if(((subject->type == HOST_SUBJECT && initial_assumed_host_state == AS_CURRENT_STATE) || (subject->type == SERVICE_SUBJECT && initial_assumed_service_state == AS_CURRENT_STATE)) && error == FALSE) { if(subject->type == SERVICE_SUBJECT) { switch(svcstatus->status) { case SERVICE_OK: initial_assumed_state = AS_SVC_OK; break; case SERVICE_WARNING: initial_assumed_state = AS_SVC_WARNING; break; case SERVICE_UNKNOWN: initial_assumed_state = AS_SVC_UNKNOWN; break; case SERVICE_CRITICAL: initial_assumed_state = AS_SVC_CRITICAL; break; default: error = TRUE; break; } } else { switch(hststatus->status) { case SD_HOST_DOWN: initial_assumed_state = AS_HOST_DOWN; break; case SD_HOST_UNREACHABLE: initial_assumed_state = AS_HOST_UNREACHABLE; break; case SD_HOST_UP: initial_assumed_state = AS_HOST_UP; break; default: error = TRUE; break; } } } if(error == FALSE) { /* add this assumed state entry before any entries in the list and <= t1 */ if(subject->as_list == NULL) initial_assumed_time = t1; else if(subject->as_list->time_stamp > t1) initial_assumed_time = t1; else initial_assumed_time = subject->as_list->time_stamp - 1; if(subject->type == HOST_SUBJECT) add_archived_state(initial_assumed_state, AS_HARD_STATE, initial_assumed_time, "First Host State Assumed (Faked Log Entry)", subject); else add_archived_state(initial_assumed_state, AS_HARD_STATE, initial_assumed_time, "First Service State Assumed (Faked Log Entry)", subject); } } /**************************************/ /* BAIL OUT IF WE DON'T HAVE ANYTHING */ /**************************************/ have_some_real_data = FALSE; for(temp_as = subject->as_list; temp_as != NULL; temp_as = temp_as->next) { if(temp_as->entry_type != AS_NO_DATA && temp_as->entry_type != AS_PROGRAM_START && temp_as->entry_type != AS_PROGRAM_END) { have_some_real_data = TRUE; break; } } if(have_some_real_data == FALSE) return; last_as = NULL; subject->earliest_time = t2; subject->latest_time = t1; #ifdef DEBUG printf("--- BEGINNING/MIDDLE SECTION ---
\n"); #endif /**********************************/ /* BEGINNING/MIDDLE SECTION */ /**********************************/ for(temp_as = subject->as_list; temp_as != NULL; temp_as = temp_as->next) { /* keep this as last known state if this is the first entry or if it occurs before the starting point of the graph */ if((temp_as->time_stamp <= t1 || temp_as == subject->as_list) && (temp_as->entry_type != AS_NO_DATA && temp_as->entry_type != AS_PROGRAM_END && temp_as->entry_type != AS_PROGRAM_START)) { subject->last_known_state = temp_as->entry_type; #ifdef DEBUG printf("SETTING LAST KNOWN STATE=%d
\n", subject->last_known_state); #endif } /* skip this entry if it occurs before the starting point of the graph */ if(temp_as->time_stamp <= t1) { #ifdef DEBUG printf("SKIPPING PRE-EVENT: %d @ %lu
\n", temp_as->entry_type, temp_as->time_stamp); #endif last_as = temp_as; continue; } /* graph this span if we're not on the first item */ if(last_as != NULL) { a = last_as->time_stamp; b = temp_as->time_stamp; /* we've already passed the last time displayed in the graph */ if(a > t2) break; /* only graph this data if its on the graph */ else if(b > t1) { /* clip last time if it exceeds graph limits */ if(b > t2) b = t2; /* clip first time if it precedes graph limits */ if(a < t1) a = t1; /* save this time if its the earliest we've graphed */ if(a < subject->earliest_time) { subject->earliest_time = a; subject->earliest_state = last_as->entry_type; } /* save this time if its the latest we've graphed */ if(b > subject->latest_time) { subject->latest_time = b; subject->latest_state = last_as->entry_type; } /* compute availability times for this chunk */ compute_subject_availability_times(last_as->entry_type, temp_as->entry_type, last_as->time_stamp, a, b, subject, temp_as); /* return if we've reached the end of the graph limits */ if(b >= t2) { last_as = temp_as; break; } } } /* keep track of the last item */ last_as = temp_as; } #ifdef DEBUG printf("--- END SECTION ---
\n"); #endif /**********************************/ /* END SECTION */ /**********************************/ if(last_as != NULL) { /* don't process an entry that is beyond the limits of the graph */ if(last_as->time_stamp < t2) { time(¤t_time); b = current_time; if(b > t2) b = t2; a = last_as->time_stamp; if(a < t1) a = t1; /* fake the current state (it doesn't really matter for graphing) */ if(subject->type == HOST_SUBJECT) current_state = AS_HOST_UP; else current_state = AS_SVC_OK; /* compute availability times for last state */ compute_subject_availability_times(last_as->entry_type, current_state, last_as->time_stamp, a, b, subject, last_as); } } return; } /* computes availability times */ void compute_subject_availability_times(int first_state, int last_state, time_t real_start_time, time_t start_time, time_t end_time, avail_subject *subject, archived_state *as) { int start_state; unsigned long state_duration; struct tm *t; time_t midnight_today; int weekday; timerange *temp_timerange; unsigned long temp_duration; unsigned long temp_end; unsigned long temp_start; unsigned long start; unsigned long end; #ifdef DEBUG if(subject->type == HOST_SUBJECT) printf("HOST '%s'...\n", subject->host_name); else printf("SERVICE '%s' ON HOST '%s'...\n", subject->service_description, subject->host_name); printf("COMPUTING %d->%d FROM %lu to %lu (%lu seconds) FOR %s
\n", first_state, last_state, start_time, end_time, (end_time - start_time), (subject->type == HOST_SUBJECT) ? "HOST" : "SERVICE"); #endif /* clip times if necessary */ if(start_time < t1) start_time = t1; if(end_time > t2) end_time = t2; /* make sure this is a valid time */ if(start_time > t2) return; if(end_time < t1) return; /* MickeM - attempt to handle the current time_period (if any) */ if(current_timeperiod != NULL) { t = localtime((time_t *)&start_time); state_duration = 0; /* calculate the start of the day (midnight, 00:00 hours) */ t->tm_sec = 0; t->tm_min = 0; t->tm_hour = 0; t->tm_isdst = -1; midnight_today = (unsigned long)mktime(t); weekday = t->tm_wday; while(midnight_today < end_time) { temp_duration = 0; temp_end = min(86400, end_time - midnight_today); temp_start = 0; if(start_time > midnight_today) temp_start = start_time - midnight_today; #ifdef DEBUG printf("Matching: %ld -> %ld. (%ld -> %ld)
\n", temp_start, temp_end, midnight_today + temp_start, midnight_today + temp_end); #endif /* check all time ranges for this day of the week */ for(temp_timerange = current_timeperiod->days[weekday]; temp_timerange != NULL; temp_timerange = temp_timerange->next) { #ifdef DEBUG printf("
  • Matching in timerange[%d]: %d -> %d (%ld -> %ld)
    \n", weekday, temp_timerange->range_start, temp_timerange->range_end, temp_start, temp_end); #endif start = max(temp_timerange->range_start, temp_start); end = min(temp_timerange->range_end, temp_end); if(start < end) { temp_duration += end - start; #ifdef DEBUG printf("
  • Matched time: %ld -> %ld = %d
    \n", start, end, temp_duration); #endif } #ifdef DEBUG else printf("
  • Ignored time: %ld -> %ld
    \n", start, end); #endif } state_duration += temp_duration; temp_start = 0; midnight_today += 86400; if(++weekday > 6) weekday = 0; } } /* no report timeperiod was selected (assume 24x7) */ else { /* calculate time in this state */ state_duration = (unsigned long)(end_time - start_time); } /* can't graph if we don't have data... */ if(first_state == AS_NO_DATA || last_state == AS_NO_DATA) { subject->time_indeterminate_nodata += state_duration; return; } if(first_state == AS_PROGRAM_START && (last_state == AS_PROGRAM_END || last_state == AS_PROGRAM_START)) { if(assume_initial_states == FALSE) { subject->time_indeterminate_nodata += state_duration; return; } } if(first_state == AS_PROGRAM_END) { /* added 7/24/03 */ if(assume_states_during_notrunning == TRUE) { first_state = subject->last_known_state; } else { subject->time_indeterminate_notrunning += state_duration; return; } } /* special case if first entry was program start */ if(first_state == AS_PROGRAM_START) { if(assume_initial_states == TRUE) { if(assume_state_retention == TRUE) start_state = subject->last_known_state; else { if(subject->type == HOST_SUBJECT) start_state = AS_HOST_UP; else start_state = AS_SVC_OK; } } else return; } else { start_state = first_state; subject->last_known_state = first_state; } /* save "processed state" info */ as->processed_state = start_state; #ifdef DEBUG printf("PASSED TIME CHECKS, CLIPPED VALUES: START=%lu, END=%lu\n", start_time, end_time); #endif /* add time in this state to running totals */ switch(start_state) { case AS_HOST_UP: subject->time_up += state_duration; break; case AS_HOST_DOWN: subject->time_down += state_duration; break; case AS_HOST_UNREACHABLE: subject->time_unreachable += state_duration; break; case AS_SVC_OK: subject->time_ok += state_duration; break; case AS_SVC_WARNING: subject->time_warning += state_duration; break; case AS_SVC_UNKNOWN: subject->time_unknown += state_duration; break; case AS_SVC_CRITICAL: subject->time_critical += state_duration; break; default: break; } return; } /* computes downtime data for a given subject */ void compute_subject_downtime(avail_subject *subject, time_t current_time) { archived_state *temp_sd; time_t start_time; time_t end_time; int host_downtime_state = 0; int service_downtime_state = 0; int process_chunk = FALSE; #ifdef DEBUG2 printf("COMPUTE_SUBJECT_DOWNTIME\n"); #endif /* if left hand of graph is after current time, we can't do anything at all.... */ if(t1 > current_time) return; /* no scheduled downtime data for subject... */ if(subject->sd_list == NULL) return; /* all data we have occurs after last time on graph... */ if(subject->sd_list->time_stamp >= t2) return; /* initialize pointer */ temp_sd = subject->sd_list; /* special case if first entry is the end of scheduled downtime */ if((temp_sd->entry_type == AS_HOST_DOWNTIME_END || temp_sd->entry_type == AS_SVC_DOWNTIME_END) && temp_sd->time_stamp > t1) { #ifdef DEBUG2 printf("\tSPECIAL DOWNTIME CASE\n"); #endif start_time = t1; end_time = (temp_sd->time_stamp > t2) ? t2 : temp_sd->time_stamp; compute_subject_downtime_times(start_time, end_time, subject, NULL); temp_sd = temp_sd->next; } /* process all periods of scheduled downtime */ for(; temp_sd != NULL; temp_sd = temp_sd->next) { /* we've passed graph bounds... */ if(temp_sd->time_stamp >= t2) break; if(temp_sd->entry_type == AS_HOST_DOWNTIME_START) host_downtime_state = 1; else if(temp_sd->entry_type == AS_HOST_DOWNTIME_END) host_downtime_state = 0; else if(temp_sd->entry_type == AS_SVC_DOWNTIME_START) service_downtime_state = 1; else if(temp_sd->entry_type == AS_SVC_DOWNTIME_END) service_downtime_state = 0; else continue; process_chunk = FALSE; if(temp_sd->entry_type == AS_HOST_DOWNTIME_START || temp_sd->entry_type == AS_SVC_DOWNTIME_START) process_chunk = TRUE; else if(subject->type == SERVICE_SUBJECT && (host_downtime_state == 1 || service_downtime_state == 1)) process_chunk = TRUE; /* process this specific "chunk" of scheduled downtime */ if(process_chunk == TRUE) { start_time = temp_sd->time_stamp; end_time = (temp_sd->next == NULL) ? current_time : temp_sd->next->time_stamp; /* check time sanity */ if(end_time <= t1) continue; if(start_time >= t2) continue; if(start_time >= end_time) continue; /* clip time values */ if(start_time < t1) start_time = t1; if(end_time > t2) end_time = t2; compute_subject_downtime_times(start_time, end_time, subject, temp_sd); } } return; } /* computes downtime times */ void compute_subject_downtime_times(time_t start_time, time_t end_time, avail_subject *subject, archived_state *sd) { archived_state *temp_as = NULL; time_t part_subject_state = 0L; int saved_status = 0; time_t saved_stamp = 0; int count = 0; archived_state *temp_before = NULL; archived_state *last = NULL; #ifdef DEBUG2 printf("

    ENTERING COMPUTE_SUBJECT_DOWNTIME_TIMES: start=%lu, end=%lu, t1=%lu, t2=%lu

    ", start_time, end_time, t1, t2); #endif /* times are weird, so bail out... */ if(start_time > end_time) return; if(start_time < t1 || end_time > t2) return; /* find starting point in archived state list */ if(sd == NULL) { #ifdef DEBUG2 printf("

    TEMP_AS=SUBJECT->AS_LIST

    "); #endif temp_as = subject->as_list; } else if(sd->misc_ptr == NULL) { #ifdef DEBUG2 printf("

    TEMP_AS=SUBJECT->AS_LIST

    "); #endif temp_as = subject->as_list; } else if(sd->misc_ptr->next == NULL) { #ifdef DEBUG2 printf("

    TEMP_AS=SD->MISC_PTR

    "); #endif temp_as = sd->misc_ptr; } else { #ifdef DEBUG2 printf("

    TEMP_AS=SD->MISC_PTR->NEXT

    "); #endif temp_as = sd->misc_ptr->next; } /* initialize values */ if(temp_as == NULL) part_subject_state = AS_NO_DATA; else if(temp_as->processed_state == AS_PROGRAM_START || temp_as->processed_state == AS_PROGRAM_END || temp_as->processed_state == AS_NO_DATA) { #ifdef DEBUG2 printf("

    ENTRY TYPE #1: %d

    ", temp_as->entry_type); #endif part_subject_state = AS_NO_DATA; } else { #ifdef DEBUG2 printf("

    ENTRY TYPE #2: %d

    ", temp_as->entry_type); #endif part_subject_state = temp_as->processed_state; } #ifdef DEBUG2 printf("

    TEMP_AS=%s

    ", (temp_as == NULL) ? "NULL" : "Not NULL"); printf("

    SD=%s

    ", (sd == NULL) ? "NULL" : "Not NULL"); #endif /* temp_as now points to first event to possibly "break" this chunk */ for(; temp_as != NULL; temp_as = temp_as->next) { count++; last = temp_as; if(temp_before == NULL) { if(last->time_stamp > start_time) { if(last->time_stamp > end_time) compute_subject_downtime_part_times(start_time, end_time, part_subject_state, subject); else compute_subject_downtime_part_times(start_time, last->time_stamp, part_subject_state, subject); } temp_before = temp_as; saved_status = temp_as->entry_type; saved_stamp = temp_as->time_stamp; /* check if first time is before schedule downtime */ if(saved_stamp < start_time) saved_stamp = start_time; continue; } /* if status changed, we have to calculate */ if(saved_status != temp_as->entry_type) { /* is outside schedule time, use end schdule downtime */ if(temp_as->time_stamp > end_time) { if(saved_stamp < start_time) compute_subject_downtime_part_times(start_time, end_time, saved_status, subject); else compute_subject_downtime_part_times(saved_stamp, end_time, saved_status, subject); } else { if(saved_stamp < start_time) compute_subject_downtime_part_times(start_time, temp_as->time_stamp, saved_status, subject); else compute_subject_downtime_part_times(saved_stamp, temp_as->time_stamp, saved_status, subject); } saved_status = temp_as->entry_type; saved_stamp = temp_as->time_stamp; /* check if first time is before schedule downtime */ if(saved_stamp < start_time) saved_stamp = start_time; } } /* just one entry inside the scheduled downtime */ if(count == 0) compute_subject_downtime_part_times(start_time, end_time, part_subject_state, subject); else { /* is outside scheduled time, use end schdule downtime */ if(last->time_stamp > end_time) compute_subject_downtime_part_times(saved_stamp, end_time, saved_status, subject); else compute_subject_downtime_part_times(saved_stamp, last->time_stamp, saved_status, subject); } return; } /* computes downtime times */ void compute_subject_downtime_part_times(time_t start_time, time_t end_time, int subject_state, avail_subject *subject) { unsigned long state_duration; #ifdef DEBUG2 printf("ENTERING COMPUTE_SUBJECT_DOWNTIME_PART_TIMES\n"); #endif /* times are weird */ if(start_time > end_time) return; state_duration = (unsigned long)(end_time - start_time); switch(subject_state) { case AS_HOST_UP: subject->scheduled_time_up += state_duration; break; case AS_HOST_DOWN: subject->scheduled_time_down += state_duration; break; case AS_HOST_UNREACHABLE: subject->scheduled_time_unreachable += state_duration; break; case AS_SVC_OK: subject->scheduled_time_ok += state_duration; break; case AS_SVC_WARNING: subject->scheduled_time_warning += state_duration; break; case AS_SVC_UNKNOWN: subject->scheduled_time_unknown += state_duration; break; case AS_SVC_CRITICAL: subject->scheduled_time_critical += state_duration; break; default: subject->scheduled_time_indeterminate += state_duration; break; } #ifdef DEBUG2 printf("\tSUBJECT DOWNTIME: Host '%s', Service '%s', State=%d, Duration=%lu, Start=%lu\n", subject->host_name, (subject->service_description == NULL) ? "NULL" : subject->service_description, subject_state, state_duration, start_time); #endif return; } /* convert current host state to archived state value */ int convert_host_state_to_archived_state(int current_status) { if(current_status == SD_HOST_UP) return AS_HOST_UP; if(current_status == SD_HOST_DOWN) return AS_HOST_DOWN; if(current_status == SD_HOST_UNREACHABLE) return AS_HOST_UNREACHABLE; return AS_NO_DATA; } /* convert current service state to archived state value */ int convert_service_state_to_archived_state(int current_status) { if(current_status == SERVICE_OK) return AS_SVC_OK; if(current_status == SERVICE_UNKNOWN) return AS_SVC_UNKNOWN; if(current_status == SERVICE_WARNING) return AS_SVC_WARNING; if(current_status == SERVICE_CRITICAL) return AS_SVC_CRITICAL; return AS_NO_DATA; } /* create list of subjects to collect availability data for */ void create_subject_list(void) { hostgroup *temp_hostgroup; hostsmember *temp_hgmember; servicegroup *temp_servicegroup; servicesmember *temp_sgmember; host *temp_host; service *temp_service; const char *last_host_name = ""; /* we're displaying one or more hosts */ if(display_type == DISPLAY_HOST_AVAIL && host_name && strcmp(host_name, "")) { /* we're only displaying a specific host (and summaries for all services associated with it) */ if(show_all_hosts == FALSE) { add_subject(HOST_SUBJECT, host_name, NULL); for(temp_service = service_list; temp_service != NULL; temp_service = temp_service->next) { if(!strcmp(temp_service->host_name, host_name)) add_subject(SERVICE_SUBJECT, host_name, temp_service->description); } } /* we're displaying all hosts */ else { for(temp_host = host_list; temp_host != NULL; temp_host = temp_host->next) add_subject(HOST_SUBJECT, temp_host->name, NULL); } } /* we're displaying a specific service */ else if(display_type == DISPLAY_SERVICE_AVAIL && svc_description && strcmp(svc_description, "")) { /* we're only displaying a specific service */ if(show_all_services == FALSE) add_subject(SERVICE_SUBJECT, host_name, svc_description); /* we're displaying all services */ else { for(temp_service = service_list; temp_service != NULL; temp_service = temp_service->next) add_subject(SERVICE_SUBJECT, temp_service->host_name, temp_service->description); } } /* we're displaying one or more hostgroups (the host members of the groups) */ else if(display_type == DISPLAY_HOSTGROUP_AVAIL && hostgroup_name && strcmp(hostgroup_name, "")) { /* we're displaying all hostgroups */ if(show_all_hostgroups == TRUE) { for(temp_hostgroup = hostgroup_list; temp_hostgroup != NULL; temp_hostgroup = temp_hostgroup->next) { for(temp_hgmember = temp_hostgroup->members; temp_hgmember != NULL; temp_hgmember = temp_hgmember->next) add_subject(HOST_SUBJECT, temp_hgmember->host_name, NULL); } } /* we're only displaying a specific hostgroup */ else { temp_hostgroup = find_hostgroup(hostgroup_name); if(temp_hostgroup != NULL) { for(temp_hgmember = temp_hostgroup->members; temp_hgmember != NULL; temp_hgmember = temp_hgmember->next) add_subject(HOST_SUBJECT, temp_hgmember->host_name, NULL); } } } /* we're displaying one or more servicegroups (the host and service members of the groups) */ else if(display_type == DISPLAY_SERVICEGROUP_AVAIL && servicegroup_name && strcmp(servicegroup_name, "")) { /* we're displaying all servicegroups */ if(show_all_servicegroups == TRUE) { for(temp_servicegroup = servicegroup_list; temp_servicegroup != NULL; temp_servicegroup = temp_servicegroup->next) { for(temp_sgmember = temp_servicegroup->members; temp_sgmember != NULL; temp_sgmember = temp_sgmember->next) { add_subject(SERVICE_SUBJECT, temp_sgmember->host_name, temp_sgmember->service_description); if(strcmp(last_host_name, temp_sgmember->host_name)) add_subject(HOST_SUBJECT, temp_sgmember->host_name, NULL); last_host_name = temp_sgmember->host_name; } } } /* we're only displaying a specific servicegroup */ else { temp_servicegroup = find_servicegroup(servicegroup_name); if(temp_servicegroup != NULL) { for(temp_sgmember = temp_servicegroup->members; temp_sgmember != NULL; temp_sgmember = temp_sgmember->next) { add_subject(SERVICE_SUBJECT, temp_sgmember->host_name, temp_sgmember->service_description); if(strcmp(last_host_name, temp_sgmember->host_name)) add_subject(HOST_SUBJECT, temp_sgmember->host_name, NULL); last_host_name = temp_sgmember->host_name; } } } } return; } /* adds a subject */ void add_subject(int subject_type, char *hn, char *sd) { avail_subject *last_subject = NULL; avail_subject *temp_subject = NULL; avail_subject *new_subject = NULL; int is_authorized = FALSE; /* bail if we've already added the subject */ if(find_subject(subject_type, hn, sd)) return; /* see if the user is authorized to see data for this host or service */ if(subject_type == HOST_SUBJECT) is_authorized = is_authorized_for_host(find_host(hn), ¤t_authdata); else is_authorized = is_authorized_for_service(find_service(hn, sd), ¤t_authdata); if(is_authorized == FALSE) return; /* allocate memory for the new entry */ new_subject = (avail_subject *)malloc(sizeof(avail_subject)); if(new_subject == NULL) return; /* allocate memory for the host name */ if(hn != NULL) { new_subject->host_name = (char *)malloc(strlen(hn) + 1); if(new_subject->host_name != NULL) strcpy(new_subject->host_name, hn); } else new_subject->host_name = NULL; /* allocate memory for the service description */ if(sd != NULL) { new_subject->service_description = (char *)malloc(strlen(sd) + 1); if(new_subject->service_description != NULL) strcpy(new_subject->service_description, sd); } else new_subject->service_description = NULL; new_subject->type = subject_type; new_subject->earliest_state = AS_NO_DATA; new_subject->latest_state = AS_NO_DATA; new_subject->time_up = 0L; new_subject->time_down = 0L; new_subject->time_unreachable = 0L; new_subject->time_ok = 0L; new_subject->time_warning = 0L; new_subject->time_unknown = 0L; new_subject->time_critical = 0L; new_subject->scheduled_time_up = 0L; new_subject->scheduled_time_down = 0L; new_subject->scheduled_time_unreachable = 0L; new_subject->scheduled_time_ok = 0L; new_subject->scheduled_time_warning = 0L; new_subject->scheduled_time_unknown = 0L; new_subject->scheduled_time_critical = 0L; new_subject->scheduled_time_indeterminate = 0L; new_subject->time_indeterminate_nodata = 0L; new_subject->time_indeterminate_notrunning = 0L; new_subject->as_list = NULL; new_subject->as_list_tail = NULL; new_subject->sd_list = NULL; new_subject->last_known_state = AS_NO_DATA; /* add the new entry to the list in memory, sorted by host name */ last_subject = subject_list; for(temp_subject = subject_list; temp_subject != NULL; temp_subject = temp_subject->next) { if(strcmp(new_subject->host_name, temp_subject->host_name) < 0) { new_subject->next = temp_subject; if(temp_subject == subject_list) subject_list = new_subject; else last_subject->next = new_subject; break; } else last_subject = temp_subject; } if(subject_list == NULL) { new_subject->next = NULL; subject_list = new_subject; } else if(temp_subject == NULL) { new_subject->next = NULL; last_subject->next = new_subject; } return; } /* finds a specific subject */ avail_subject *find_subject(int type, char *hn, char *sd) { avail_subject *temp_subject; if(hn == NULL) return NULL; if(type == SERVICE_SUBJECT && sd == NULL) return NULL; for(temp_subject = subject_list; temp_subject != NULL; temp_subject = temp_subject->next) { if(temp_subject->type != type) continue; if(strcmp(hn, temp_subject->host_name)) continue; if(type == SERVICE_SUBJECT && strcmp(sd, temp_subject->service_description)) continue; return temp_subject; } return NULL; } /* adds an archived state entry to all subjects */ void add_global_archived_state(int entry_type, int state_type, time_t time_stamp, const char *state_info) { avail_subject *temp_subject; for(temp_subject = subject_list; temp_subject != NULL; temp_subject = temp_subject->next) add_archived_state(entry_type, state_type, time_stamp, state_info, temp_subject); return; } /* adds an archived state entry to a specific subject */ void add_archived_state(int entry_type, int state_type, time_t time_stamp, const char *state_info, avail_subject *subject) { archived_state *last_as = NULL; archived_state *temp_as = NULL; archived_state *new_as = NULL; /* allocate memory for the new entry */ new_as = (archived_state *)malloc(sizeof(archived_state)); if(new_as == NULL) return; /* allocate memory for the state info */ if(state_info != NULL) { new_as->state_info = (char *)malloc(strlen(state_info) + 1); if(new_as->state_info != NULL) strcpy(new_as->state_info, state_info); } else new_as->state_info = NULL; /* initialize the "processed state" value - this gets modified later for most entries */ if(entry_type != AS_PROGRAM_START && entry_type != AS_PROGRAM_END && entry_type != AS_NO_DATA) new_as->processed_state = entry_type; else new_as->processed_state = AS_NO_DATA; new_as->entry_type = entry_type; new_as->state_type = state_type; new_as->time_stamp = time_stamp; new_as->misc_ptr = NULL; /* add the new entry to the list in memory, sorted by time (more recent entries should appear towards end of list) */ last_as = subject->as_list; for(temp_as = subject->as_list; temp_as != NULL; temp_as = temp_as->next) { if(new_as->time_stamp < temp_as->time_stamp) { new_as->next = temp_as; if(temp_as == subject->as_list) subject->as_list = new_as; else last_as->next = new_as; break; } else last_as = temp_as; } if(subject->as_list == NULL) { new_as->next = NULL; subject->as_list = new_as; } else if(temp_as == NULL) { new_as->next = NULL; last_as->next = new_as; } /* update "tail" of the list - not really the tail, just last item added */ subject->as_list_tail = new_as; return; } /* adds a scheduled downtime entry to a specific subject */ void add_scheduled_downtime(int state_type, time_t time_stamp, avail_subject *subject) { archived_state *last_sd = NULL; archived_state *temp_sd = NULL; archived_state *new_sd = NULL; /* allocate memory for the new entry */ new_sd = (archived_state *)malloc(sizeof(archived_state)); if(new_sd == NULL) return; new_sd->state_info = NULL; new_sd->processed_state = state_type; new_sd->entry_type = state_type; new_sd->time_stamp = time_stamp; new_sd->misc_ptr = subject->as_list_tail; /* add the new entry to the list in memory, sorted by time (more recent entries should appear towards end of list) */ last_sd = subject->sd_list; for(temp_sd = subject->sd_list; temp_sd != NULL; temp_sd = temp_sd->next) { if(new_sd->time_stamp <= temp_sd->time_stamp) { new_sd->next = temp_sd; if(temp_sd == subject->sd_list) subject->sd_list = new_sd; else last_sd->next = new_sd; break; } else last_sd = temp_sd; } if(subject->sd_list == NULL) { new_sd->next = NULL; subject->sd_list = new_sd; } else if(temp_sd == NULL) { new_sd->next = NULL; last_sd->next = new_sd; } return; } /* frees memory allocated to all availability data */ void free_availability_data(void) { avail_subject *this_subject; avail_subject *next_subject; for(this_subject = subject_list; this_subject != NULL;) { next_subject = this_subject->next; if(this_subject->host_name != NULL) free(this_subject->host_name); if(this_subject->service_description != NULL) free(this_subject->service_description); free_archived_state_list(this_subject->as_list); free_archived_state_list(this_subject->sd_list); free(this_subject); this_subject = next_subject; } return; } /* frees memory allocated to the archived state list */ void free_archived_state_list(archived_state *as_list) { archived_state *this_as = NULL; archived_state *next_as = NULL; for(this_as = as_list; this_as != NULL;) { next_as = this_as->next; if(this_as->state_info != NULL) free(this_as->state_info); free(this_as); this_as = next_as; } as_list = NULL; return; } /* reads log files for archived state data */ void read_archived_state_data(void) { char filename[MAX_FILENAME_LENGTH]; int oldest_archive = 0; int newest_archive = 0; int current_archive = 0; /* determine oldest archive to use when scanning for data (include backtracked archives as well) */ oldest_archive = determine_archive_to_use_from_time(t1); if(log_rotation_method != LOG_ROTATION_NONE) oldest_archive += backtrack_archives; /* determine most recent archive to use when scanning for data */ newest_archive = determine_archive_to_use_from_time(t2); if(oldest_archive < newest_archive) oldest_archive = newest_archive; /* read in all the necessary archived logs (from most recent to earliest) */ for(current_archive = newest_archive; current_archive <= oldest_archive; current_archive++) { #ifdef DEBUG printf("Reading archive #%d\n", current_archive); #endif /* get the name of the log file that contains this archive */ get_log_archive_to_use(current_archive, filename, sizeof(filename) - 1); #ifdef DEBUG printf("Archive name: '%s'\n", filename); #endif /* scan the log file for archived state data */ scan_log_file_for_archived_state_data(filename); } return; } /* grabs archives state data from a log file */ void scan_log_file_for_archived_state_data(char *filename) { char *input = NULL; char *input2 = NULL; char entry_host_name[MAX_INPUT_BUFFER]; char entry_svc_description[MAX_INPUT_BUFFER]; char *plugin_output = NULL; char *temp_buffer = NULL; time_t time_stamp; mmapfile *thefile = NULL; avail_subject *temp_subject = NULL; int state_type = 0; if((thefile = mmap_fopen(filename)) == NULL) return; while(1) { /* free memory */ free(input); free(input2); input = NULL; input2 = NULL; /* read the next line */ if((input = mmap_fgets(thefile)) == NULL) break; strip(input); if((input2 = strdup(input)) == NULL) continue; temp_buffer = my_strtok(input2, "]"); time_stamp = (temp_buffer == NULL) ? (time_t)0 : (time_t)strtoul(temp_buffer + 1, NULL, 10); /* program starts/restarts */ if(strstr(input, " starting...")) add_global_archived_state(AS_PROGRAM_START, AS_NO_DATA, time_stamp, "Program start"); if(strstr(input, " restarting...")) add_global_archived_state(AS_PROGRAM_START, AS_NO_DATA, time_stamp, "Program restart"); /* program stops */ if(strstr(input, " shutting down...")) add_global_archived_state(AS_PROGRAM_END, AS_NO_DATA, time_stamp, "Normal program termination"); if(strstr(input, "Bailing out")) add_global_archived_state(AS_PROGRAM_END, AS_NO_DATA, time_stamp, "Abnormal program termination"); if(display_type == DISPLAY_HOST_AVAIL || display_type == DISPLAY_HOSTGROUP_AVAIL || display_type == DISPLAY_SERVICEGROUP_AVAIL) { /* normal host alerts and initial/current states */ if(strstr(input, "HOST ALERT:") || strstr(input, "INITIAL HOST STATE:") || strstr(input, "CURRENT HOST STATE:")) { /* get host name */ temp_buffer = my_strtok(NULL, ":"); temp_buffer = my_strtok(NULL, ";"); strncpy(entry_host_name, (temp_buffer == NULL) ? "" : temp_buffer + 1, sizeof(entry_host_name)); entry_host_name[sizeof(entry_host_name) - 1] = '\x0'; /* see if there is a corresponding subject for this host */ temp_subject = find_subject(HOST_SUBJECT, entry_host_name, NULL); if(temp_subject == NULL) continue; /* state types */ if(strstr(input, ";SOFT;")) { if(include_soft_states == FALSE) continue; state_type = AS_SOFT_STATE; } if(strstr(input, ";HARD;")) state_type = AS_HARD_STATE; /* get the plugin output */ temp_buffer = my_strtok(NULL, ";"); temp_buffer = my_strtok(NULL, ";"); temp_buffer = my_strtok(NULL, ";"); plugin_output = my_strtok(NULL, "\n"); if(strstr(input, ";DOWN;")) add_archived_state(AS_HOST_DOWN, state_type, time_stamp, plugin_output, temp_subject); else if(strstr(input, ";UNREACHABLE;")) add_archived_state(AS_HOST_UNREACHABLE, state_type, time_stamp, plugin_output, temp_subject); else if(strstr(input, ";RECOVERY") || strstr(input, ";UP;")) add_archived_state(AS_HOST_UP, state_type, time_stamp, plugin_output, temp_subject); else add_archived_state(AS_NO_DATA, AS_NO_DATA, time_stamp, plugin_output, temp_subject); } /* scheduled downtime notices */ else if(strstr(input, "HOST DOWNTIME ALERT:")) { /* get host name */ temp_buffer = my_strtok(NULL, ":"); temp_buffer = my_strtok(NULL, ";"); strncpy(entry_host_name, (temp_buffer == NULL) ? "" : temp_buffer + 1, sizeof(entry_host_name)); entry_host_name[sizeof(entry_host_name) - 1] = '\x0'; /* see if there is a corresponding subject for this host */ temp_subject = find_subject(HOST_SUBJECT, entry_host_name, NULL); if(temp_subject == NULL) continue; if(show_scheduled_downtime == FALSE) continue; if(strstr(input, ";STARTED;")) add_scheduled_downtime(AS_HOST_DOWNTIME_START, time_stamp, temp_subject); else add_scheduled_downtime(AS_HOST_DOWNTIME_END, time_stamp, temp_subject); } } if(display_type == DISPLAY_SERVICE_AVAIL || display_type == DISPLAY_HOST_AVAIL || display_type == DISPLAY_SERVICEGROUP_AVAIL) { /* normal service alerts and initial/current states */ if(strstr(input, "SERVICE ALERT:") || strstr(input, "INITIAL SERVICE STATE:") || strstr(input, "CURRENT SERVICE STATE:")) { /* get host name */ temp_buffer = my_strtok(NULL, ":"); temp_buffer = my_strtok(NULL, ";"); strncpy(entry_host_name, (temp_buffer == NULL) ? "" : temp_buffer + 1, sizeof(entry_host_name)); entry_host_name[sizeof(entry_host_name) - 1] = '\x0'; /* get service description */ temp_buffer = my_strtok(NULL, ";"); strncpy(entry_svc_description, (temp_buffer == NULL) ? "" : temp_buffer, sizeof(entry_svc_description)); entry_svc_description[sizeof(entry_svc_description) - 1] = '\x0'; /* see if there is a corresponding subject for this service */ temp_subject = find_subject(SERVICE_SUBJECT, entry_host_name, entry_svc_description); if(temp_subject == NULL) continue; /* state types */ if(strstr(input, ";SOFT;")) { if(include_soft_states == FALSE) continue; state_type = AS_SOFT_STATE; } if(strstr(input, ";HARD;")) state_type = AS_HARD_STATE; /* get the plugin output */ temp_buffer = my_strtok(NULL, ";"); temp_buffer = my_strtok(NULL, ";"); temp_buffer = my_strtok(NULL, ";"); plugin_output = my_strtok(NULL, "\n"); if(strstr(input, ";CRITICAL;")) add_archived_state(AS_SVC_CRITICAL, state_type, time_stamp, plugin_output, temp_subject); else if(strstr(input, ";WARNING;")) add_archived_state(AS_SVC_WARNING, state_type, time_stamp, plugin_output, temp_subject); else if(strstr(input, ";UNKNOWN;")) add_archived_state(AS_SVC_UNKNOWN, state_type, time_stamp, plugin_output, temp_subject); else if(strstr(input, ";RECOVERY;") || strstr(input, ";OK;")) add_archived_state(AS_SVC_OK, state_type, time_stamp, plugin_output, temp_subject); else add_archived_state(AS_NO_DATA, AS_NO_DATA, time_stamp, plugin_output, temp_subject); } /* scheduled service downtime notices */ else if(strstr(input, "SERVICE DOWNTIME ALERT:")) { /* get host name */ temp_buffer = my_strtok(NULL, ":"); temp_buffer = my_strtok(NULL, ";"); strncpy(entry_host_name, (temp_buffer == NULL) ? "" : temp_buffer + 1, sizeof(entry_host_name)); entry_host_name[sizeof(entry_host_name) - 1] = '\x0'; /* get service description */ temp_buffer = my_strtok(NULL, ";"); strncpy(entry_svc_description, (temp_buffer == NULL) ? "" : temp_buffer, sizeof(entry_svc_description)); entry_svc_description[sizeof(entry_svc_description) - 1] = '\x0'; /* see if there is a corresponding subject for this service */ temp_subject = find_subject(SERVICE_SUBJECT, entry_host_name, entry_svc_description); if(temp_subject == NULL) continue; if(show_scheduled_downtime == FALSE) continue; if(strstr(input, ";STARTED;")) add_scheduled_downtime(AS_SVC_DOWNTIME_START, time_stamp, temp_subject); else add_scheduled_downtime(AS_SVC_DOWNTIME_END, time_stamp, temp_subject); } /* scheduled host downtime notices */ else if(strstr(input, "HOST DOWNTIME ALERT:")) { /* get host name */ temp_buffer = my_strtok(NULL, ":"); temp_buffer = my_strtok(NULL, ";"); strncpy(entry_host_name, (temp_buffer == NULL) ? "" : temp_buffer + 1, sizeof(entry_host_name)); entry_host_name[sizeof(entry_host_name) - 1] = '\x0'; /* this host downtime entry must be added to all service subjects associated with the host! */ for(temp_subject = subject_list; temp_subject != NULL; temp_subject = temp_subject->next) { if(temp_subject->type != SERVICE_SUBJECT) continue; if(strcmp(temp_subject->host_name, entry_host_name)) continue; if(show_scheduled_downtime == FALSE) continue; if(strstr(input, ";STARTED;")) add_scheduled_downtime(AS_HOST_DOWNTIME_START, time_stamp, temp_subject); else add_scheduled_downtime(AS_HOST_DOWNTIME_END, time_stamp, temp_subject); } } } } /* free memory and close the file */ free(input); free(input2); mmap_fclose(thefile); return; } void convert_timeperiod_to_times(int type) { time_t current_time; struct tm *t; /* get the current time */ time(¤t_time); t = localtime(¤t_time); t->tm_sec = 0; t->tm_min = 0; t->tm_hour = 0; t->tm_isdst = -1; switch(type) { case TIMEPERIOD_LAST24HOURS: t1 = current_time - (60 * 60 * 24); t2 = current_time; break; case TIMEPERIOD_TODAY: t1 = mktime(t); t2 = current_time; break; case TIMEPERIOD_YESTERDAY: t1 = (time_t)(mktime(t) - (60 * 60 * 24)); t2 = (time_t)mktime(t); break; case TIMEPERIOD_THISWEEK: t1 = (time_t)(mktime(t) - (60 * 60 * 24 * t->tm_wday)); t2 = current_time; break; case TIMEPERIOD_LASTWEEK: t1 = (time_t)(mktime(t) - (60 * 60 * 24 * t->tm_wday) - (60 * 60 * 24 * 7)); t2 = (time_t)(mktime(t) - (60 * 60 * 24 * t->tm_wday)); break; case TIMEPERIOD_THISMONTH: t->tm_mday = 1; t1 = mktime(t); t2 = current_time; break; case TIMEPERIOD_LASTMONTH: t->tm_mday = 1; t2 = mktime(t); if(t->tm_mon == 0) { t->tm_mon = 11; t->tm_year--; } else t->tm_mon--; t1 = mktime(t); break; case TIMEPERIOD_THISQUARTER: /* not implemented */ break; case TIMEPERIOD_LASTQUARTER: /* not implemented */ break; case TIMEPERIOD_THISYEAR: t->tm_mon = 0; t->tm_mday = 1; t1 = mktime(t); t2 = current_time; break; case TIMEPERIOD_LASTYEAR: t->tm_mon = 0; t->tm_mday = 1; t2 = mktime(t); t->tm_year--; t1 = mktime(t); break; case TIMEPERIOD_LAST7DAYS: t2 = current_time; t1 = current_time - (7 * 24 * 60 * 60); break; case TIMEPERIOD_LAST31DAYS: t2 = current_time; t1 = current_time - (31 * 24 * 60 * 60); break; default: break; } return; } void compute_report_times(void) { time_t current_time; struct tm *st; struct tm *et; /* get the current time */ time(¤t_time); st = localtime(¤t_time); st->tm_sec = start_second; st->tm_min = start_minute; st->tm_hour = start_hour; st->tm_mday = start_day; st->tm_mon = start_month - 1; st->tm_year = start_year - 1900; st->tm_isdst = -1; t1 = mktime(st); et = localtime(¤t_time); et->tm_sec = end_second; et->tm_min = end_minute; et->tm_hour = end_hour; et->tm_mday = end_day; et->tm_mon = end_month - 1; et->tm_year = end_year - 1900; et->tm_isdst = -1; t2 = mktime(et); } /* writes log entries to screen */ void write_log_entries(avail_subject *subject) { archived_state *temp_as; archived_state *temp_sd; time_t current_time; char start_date_time[MAX_DATETIME_LENGTH]; char end_date_time[MAX_DATETIME_LENGTH]; char duration[20]; const char *bgclass = ""; const char *ebgclass = ""; const char *entry_type = ""; const char *state_type = ""; int days; int hours; int minutes; int seconds; int odd = 0; if(output_format != HTML_OUTPUT) return; if(show_log_entries == FALSE) return; if(subject == NULL) return; time(¤t_time); /* inject all scheduled downtime entries into the main list for display purposes */ for(temp_sd = subject->sd_list; temp_sd != NULL; temp_sd = temp_sd->next) { switch(temp_sd->entry_type) { case AS_SVC_DOWNTIME_START: case AS_HOST_DOWNTIME_START: entry_type = "Start of scheduled downtime"; break; case AS_SVC_DOWNTIME_END: case AS_HOST_DOWNTIME_END: entry_type = "End of scheduled downtime"; break; default: entry_type = "?"; break; } add_archived_state(temp_sd->entry_type, AS_NO_DATA, temp_sd->time_stamp, entry_type, subject); } printf("

    \n"); printf("
    %s Log Entries:
    \n", (subject->type == HOST_SUBJECT) ? "Host" : "Service"); printf("
    "); if(full_log_entries == TRUE) { full_log_entries = FALSE; if(subject->type == HOST_SUBJECT) host_report_url(subject->host_name, "[ View condensed log entries ]"); else service_report_url(subject->host_name, subject->service_description, "[ View condensed log entries ]"); full_log_entries = TRUE; } else { full_log_entries = TRUE; if(subject->type == HOST_SUBJECT) host_report_url(subject->host_name, "[ View full log entries ]"); else service_report_url(subject->host_name, subject->service_description, "[ View full log entries ]"); full_log_entries = FALSE; } printf("
    \n"); printf("
    \n"); printf("\n"); printf("\n"); /* write all archived state entries */ for(temp_as = subject->as_list; temp_as != NULL; temp_as = temp_as->next) { if(temp_as->state_type == AS_HARD_STATE) state_type = " (HARD)"; else if(temp_as->state_type == AS_SOFT_STATE) state_type = " (SOFT)"; else state_type = ""; switch(temp_as->entry_type) { case AS_NO_DATA: if(full_log_entries == FALSE) continue; entry_type = "NO DATA"; ebgclass = "INDETERMINATE"; break; case AS_PROGRAM_END: if(full_log_entries == FALSE) continue; entry_type = "PROGRAM END"; ebgclass = "INDETERMINATE"; break; case AS_PROGRAM_START: if(full_log_entries == FALSE) continue; entry_type = "PROGRAM (RE)START"; ebgclass = "INDETERMINATE"; break; case AS_HOST_UP: entry_type = "HOST UP"; ebgclass = "UP"; break; case AS_HOST_DOWN: entry_type = "HOST DOWN"; ebgclass = "DOWN"; break; case AS_HOST_UNREACHABLE: entry_type = "HOST UNREACHABLE"; ebgclass = "UNREACHABLE"; break; case AS_SVC_OK: entry_type = "SERVICE OK"; ebgclass = "OK"; break; case AS_SVC_UNKNOWN: entry_type = "SERVICE UNKNOWN"; ebgclass = "UNKNOWN"; break; case AS_SVC_WARNING: entry_type = "SERVICE WARNING"; ebgclass = "WARNING"; break; case AS_SVC_CRITICAL: entry_type = "SERVICE CRITICAL"; ebgclass = "CRITICAL"; break; case AS_SVC_DOWNTIME_START: entry_type = "SERVICE DOWNTIME START"; ebgclass = "INDETERMINATE"; break; case AS_SVC_DOWNTIME_END: entry_type = "SERVICE DOWNTIME END"; ebgclass = "INDETERMINATE"; break; case AS_HOST_DOWNTIME_START: entry_type = "HOST DOWNTIME START"; ebgclass = "INDETERMINATE"; break; case AS_HOST_DOWNTIME_END: entry_type = "HOST DOWNTIME END"; ebgclass = "INDETERMINATE"; break; default: if(full_log_entries == FALSE) continue; entry_type = "?"; ebgclass = "INDETERMINATE"; } get_time_string(&(temp_as->time_stamp), start_date_time, sizeof(start_date_time) - 1, SHORT_DATE_TIME); if(temp_as->next == NULL) { get_time_string(&t2, end_date_time, sizeof(end_date_time) - 1, SHORT_DATE_TIME); get_time_breakdown((time_t)(t2 - temp_as->time_stamp), &days, &hours, &minutes, &seconds); snprintf(duration, sizeof(duration) - 1, "%dd %dh %dm %ds+", days, hours, minutes, seconds); } else { get_time_string(&(temp_as->next->time_stamp), end_date_time, sizeof(end_date_time) - 1, SHORT_DATE_TIME); get_time_breakdown((time_t)(temp_as->next->time_stamp - temp_as->time_stamp), &days, &hours, &minutes, &seconds); snprintf(duration, sizeof(duration) - 1, "%dd %dh %dm %ds", days, hours, minutes, seconds); } if(odd) { bgclass = "Odd"; odd = 0; } else { bgclass = "Even"; odd = 1; } printf("", bgclass); printf("", bgclass, start_date_time); printf("", bgclass, end_date_time); printf("", bgclass, duration); printf("", ebgclass, entry_type, state_type); printf("", bgclass, (temp_as->state_info == NULL) ? "" : html_encode(temp_as->state_info, FALSE)); printf("\n"); } printf("
    Event Start TimeEvent End TimeEvent DurationEvent/State TypeEvent/State Information
    %s%s%s%s%s%s
    \n"); printf("
    \n"); return; } /* display hostgroup availability */ void display_hostgroup_availability(void) { hostgroup *temp_hostgroup; /* display data for a specific hostgroup */ if(show_all_hostgroups == FALSE) { temp_hostgroup = find_hostgroup(hostgroup_name); display_specific_hostgroup_availability(temp_hostgroup); } /* display data for all hostgroups */ else { for(temp_hostgroup = hostgroup_list; temp_hostgroup != NULL; temp_hostgroup = temp_hostgroup->next) display_specific_hostgroup_availability(temp_hostgroup); } return; } /* display availability for a specific hostgroup */ void display_specific_hostgroup_availability(hostgroup *hg) { unsigned long total_time; unsigned long time_determinate; unsigned long time_indeterminate; avail_subject *temp_subject; double percent_time_up = 0.0; double percent_time_down = 0.0; double percent_time_unreachable = 0.0; double percent_time_up_known = 0.0; double percent_time_down_known = 0.0; double percent_time_unreachable_known = 0.0; double percent_time_indeterminate = 0.0; double average_percent_time_up = 0.0; double average_percent_time_up_known = 0.0; double average_percent_time_down = 0.0; double average_percent_time_down_known = 0.0; double average_percent_time_unreachable = 0.0; double average_percent_time_unreachable_known = 0.0; double average_percent_time_indeterminate = 0.0; int current_subject = 0; const char *bgclass = ""; int odd = 1; host *temp_host; if(hg == NULL) return; /* the user isn't authorized to view this hostgroup */ if(is_authorized_for_hostgroup(hg, ¤t_authdata) == FALSE) return; /* calculate total time during period based on timeperiod used for reporting */ total_time = calculate_total_time(t1, t2); printf("

    \n"); printf("
    Hostgroup '%s' Host State Breakdowns:
    \n", hg->group_name); printf("
    \n"); printf("\n"); printf("\n"); for(temp_subject = subject_list; temp_subject != NULL; temp_subject = temp_subject->next) { if(temp_subject->type != HOST_SUBJECT) continue; temp_host = find_host(temp_subject->host_name); if(temp_host == NULL) continue; if(is_host_member_of_hostgroup(hg, temp_host) == FALSE) continue; current_subject++; /* reset variables */ percent_time_up = 0.0; percent_time_down = 0.0; percent_time_unreachable = 0.0; percent_time_indeterminate = 0.0; percent_time_up_known = 0.0; percent_time_down_known = 0.0; percent_time_unreachable_known = 0.0; time_determinate = temp_subject->time_up + temp_subject->time_down + temp_subject->time_unreachable; time_indeterminate = total_time - time_determinate; if(total_time > 0) { percent_time_up = (double)(((double)temp_subject->time_up * 100.0) / (double)total_time); percent_time_down = (double)(((double)temp_subject->time_down * 100.0) / (double)total_time); percent_time_unreachable = (double)(((double)temp_subject->time_unreachable * 100.0) / (double)total_time); percent_time_indeterminate = (double)(((double)time_indeterminate * 100.0) / (double)total_time); if(time_determinate > 0) { percent_time_up_known = (double)(((double)temp_subject->time_up * 100.0) / (double)time_determinate); percent_time_down_known = (double)(((double)temp_subject->time_down * 100.0) / (double)time_determinate); percent_time_unreachable_known = (double)(((double)temp_subject->time_unreachable * 100.0) / (double)time_determinate); } } if(odd) { odd = 0; bgclass = "Odd"; } else { odd = 1; bgclass = "Even"; } printf("\n", percent_time_up, percent_time_up_known, percent_time_down, percent_time_down_known, percent_time_unreachable, percent_time_unreachable_known, bgclass, percent_time_indeterminate); get_running_average(&average_percent_time_up, percent_time_up, current_subject); get_running_average(&average_percent_time_up_known, percent_time_up_known, current_subject); get_running_average(&average_percent_time_down, percent_time_down, current_subject); get_running_average(&average_percent_time_down_known, percent_time_down_known, current_subject); get_running_average(&average_percent_time_unreachable, percent_time_unreachable, current_subject); get_running_average(&average_percent_time_unreachable_known, percent_time_unreachable_known, current_subject); get_running_average(&average_percent_time_indeterminate, percent_time_indeterminate, current_subject); } /* average statistics */ if(odd) { odd = 0; bgclass = "Odd"; } else { odd = 1; bgclass = "Even"; } printf("", bgclass, bgclass, average_percent_time_up, average_percent_time_up_known, average_percent_time_down, average_percent_time_down_known, average_percent_time_unreachable, average_percent_time_unreachable_known, bgclass, average_percent_time_indeterminate); printf("
    Host%% Time Up%% Time Down%% Time Unreachable%% Time Undetermined
    ", bgclass, bgclass); host_report_url(temp_subject->host_name, temp_subject->host_name); printf("%2.3f%% (%2.3f%%)%2.3f%% (%2.3f%%)%2.3f%% (%2.3f%%)%2.3f%%
    Average%2.3f%% (%2.3f%%)%2.3f%% (%2.3f%%)%2.3f%% (%2.3f%%)%2.3f%%
    \n"); printf("
    \n"); return; } /* display servicegroup availability */ void display_servicegroup_availability(void) { servicegroup *temp_servicegroup; /* display data for a specific servicegroup */ if(show_all_servicegroups == FALSE) { temp_servicegroup = find_servicegroup(servicegroup_name); display_specific_servicegroup_availability(temp_servicegroup); } /* display data for all servicegroups */ else { for(temp_servicegroup = servicegroup_list; temp_servicegroup != NULL; temp_servicegroup = temp_servicegroup->next) display_specific_servicegroup_availability(temp_servicegroup); } return; } /* display availability for a specific servicegroup */ void display_specific_servicegroup_availability(servicegroup *sg) { unsigned long total_time; unsigned long time_determinate; unsigned long time_indeterminate; avail_subject *temp_subject; double percent_time_up = 0.0; double percent_time_down = 0.0; double percent_time_unreachable = 0.0; double percent_time_up_known = 0.0; double percent_time_down_known = 0.0; double percent_time_unreachable_known = 0.0; double percent_time_indeterminate = 0.0; double percent_time_ok = 0.0; double percent_time_warning = 0.0; double percent_time_unknown = 0.0; double percent_time_critical = 0.0; double percent_time_ok_known = 0.0; double percent_time_warning_known = 0.0; double percent_time_unknown_known = 0.0; double percent_time_critical_known = 0.0; double average_percent_time_up = 0.0; double average_percent_time_up_known = 0.0; double average_percent_time_down = 0.0; double average_percent_time_down_known = 0.0; double average_percent_time_unreachable = 0.0; double average_percent_time_unreachable_known = 0.0; double average_percent_time_ok = 0.0; double average_percent_time_ok_known = 0.0; double average_percent_time_unknown = 0.0; double average_percent_time_unknown_known = 0.0; double average_percent_time_warning = 0.0; double average_percent_time_warning_known = 0.0; double average_percent_time_critical = 0.0; double average_percent_time_critical_known = 0.0; double average_percent_time_indeterminate = 0.0; int current_subject = 0; const char *bgclass = ""; int odd = 1; host *temp_host; service *temp_service; char last_host[MAX_INPUT_BUFFER]; if(sg == NULL) return; /* the user isn't authorized to view this servicegroup */ if(is_authorized_for_servicegroup(sg, ¤t_authdata) == FALSE) return; /* calculate total time during period based on timeperiod used for reporting */ total_time = calculate_total_time(t1, t2); printf("

    \n"); printf("
    Servicegroup '%s' Host State Breakdowns:
    \n", sg->group_name); printf("
    \n"); printf("\n"); printf("\n"); for(temp_subject = subject_list; temp_subject != NULL; temp_subject = temp_subject->next) { if(temp_subject->type != HOST_SUBJECT) continue; temp_host = find_host(temp_subject->host_name); if(temp_host == NULL) continue; if(is_host_member_of_servicegroup(sg, temp_host) == FALSE) continue; current_subject++; /* reset variables */ percent_time_up = 0.0; percent_time_down = 0.0; percent_time_unreachable = 0.0; percent_time_indeterminate = 0.0; percent_time_up_known = 0.0; percent_time_down_known = 0.0; percent_time_unreachable_known = 0.0; time_determinate = temp_subject->time_up + temp_subject->time_down + temp_subject->time_unreachable; time_indeterminate = total_time - time_determinate; if(total_time > 0) { percent_time_up = (double)(((double)temp_subject->time_up * 100.0) / (double)total_time); percent_time_down = (double)(((double)temp_subject->time_down * 100.0) / (double)total_time); percent_time_unreachable = (double)(((double)temp_subject->time_unreachable * 100.0) / (double)total_time); percent_time_indeterminate = (double)(((double)time_indeterminate * 100.0) / (double)total_time); if(time_determinate > 0) { percent_time_up_known = (double)(((double)temp_subject->time_up * 100.0) / (double)time_determinate); percent_time_down_known = (double)(((double)temp_subject->time_down * 100.0) / (double)time_determinate); percent_time_unreachable_known = (double)(((double)temp_subject->time_unreachable * 100.0) / (double)time_determinate); } } if(odd) { odd = 0; bgclass = "Odd"; } else { odd = 1; bgclass = "Even"; } printf("\n", percent_time_up, percent_time_up_known, percent_time_down, percent_time_down_known, percent_time_unreachable, percent_time_unreachable_known, bgclass, percent_time_indeterminate); get_running_average(&average_percent_time_up, percent_time_up, current_subject); get_running_average(&average_percent_time_up_known, percent_time_up_known, current_subject); get_running_average(&average_percent_time_down, percent_time_down, current_subject); get_running_average(&average_percent_time_down_known, percent_time_down_known, current_subject); get_running_average(&average_percent_time_unreachable, percent_time_unreachable, current_subject); get_running_average(&average_percent_time_unreachable_known, percent_time_unreachable_known, current_subject); get_running_average(&average_percent_time_indeterminate, percent_time_indeterminate, current_subject); } /* average statistics */ if(odd) { odd = 0; bgclass = "Odd"; } else { odd = 1; bgclass = "Even"; } printf("", bgclass, bgclass, average_percent_time_up, average_percent_time_up_known, average_percent_time_down, average_percent_time_down_known, average_percent_time_unreachable, average_percent_time_unreachable_known, bgclass, average_percent_time_indeterminate); printf("
    Host%% Time Up%% Time Down%% Time Unreachable%% Time Undetermined
    ", bgclass, bgclass); host_report_url(temp_subject->host_name, temp_subject->host_name); printf("%2.3f%% (%2.3f%%)%2.3f%% (%2.3f%%)%2.3f%% (%2.3f%%)%2.3f%%
    Average%2.3f%% (%2.3f%%)%2.3f%% (%2.3f%%)%2.3f%% (%2.3f%%)%2.3f%%
    \n"); printf("
    \n"); printf("
    \n"); printf("
    Servicegroup '%s' Service State Breakdowns:
    \n", sg->group_name); printf("
    \n"); printf("\n"); printf("\n"); current_subject = 0; average_percent_time_indeterminate = 0.0; for(temp_subject = subject_list; temp_subject != NULL; temp_subject = temp_subject->next) { if(temp_subject->type != SERVICE_SUBJECT) continue; temp_service = find_service(temp_subject->host_name, temp_subject->service_description); if(temp_service == NULL) continue; if(is_service_member_of_servicegroup(sg, temp_service) == FALSE) continue; current_subject++; time_determinate = temp_subject->time_ok + temp_subject->time_warning + temp_subject->time_unknown + temp_subject->time_critical; time_indeterminate = total_time - time_determinate; /* adjust indeterminate time due to insufficient data (not all was caught) */ temp_subject->time_indeterminate_nodata = time_indeterminate - temp_subject->time_indeterminate_notrunning; /* initialize values */ percent_time_ok = 0.0; percent_time_warning = 0.0; percent_time_unknown = 0.0; percent_time_critical = 0.0; percent_time_indeterminate = 0.0; percent_time_ok_known = 0.0; percent_time_warning_known = 0.0; percent_time_unknown_known = 0.0; percent_time_critical_known = 0.0; if(total_time > 0) { percent_time_ok = (double)(((double)temp_subject->time_ok * 100.0) / (double)total_time); percent_time_warning = (double)(((double)temp_subject->time_warning * 100.0) / (double)total_time); percent_time_unknown = (double)(((double)temp_subject->time_unknown * 100.0) / (double)total_time); percent_time_critical = (double)(((double)temp_subject->time_critical * 100.0) / (double)total_time); percent_time_indeterminate = (double)(((double)time_indeterminate * 100.0) / (double)total_time); if(time_determinate > 0) { percent_time_ok_known = (double)(((double)temp_subject->time_ok * 100.0) / (double)time_determinate); percent_time_warning_known = (double)(((double)temp_subject->time_warning * 100.0) / (double)time_determinate); percent_time_unknown_known = (double)(((double)temp_subject->time_unknown * 100.0) / (double)time_determinate); percent_time_critical_known = (double)(((double)temp_subject->time_critical * 100.0) / (double)time_determinate); } } if(odd) { odd = 0; bgclass = "Odd"; } else { odd = 1; bgclass = "Even"; } printf("\n", percent_time_ok, percent_time_ok_known, percent_time_warning, percent_time_warning_known, percent_time_unknown, percent_time_unknown_known, percent_time_critical, percent_time_critical_known, bgclass, percent_time_indeterminate); strncpy(last_host, temp_subject->host_name, sizeof(last_host) - 1); last_host[sizeof(last_host) - 1] = '\x0'; get_running_average(&average_percent_time_ok, percent_time_ok, current_subject); get_running_average(&average_percent_time_ok_known, percent_time_ok_known, current_subject); get_running_average(&average_percent_time_unknown, percent_time_unknown, current_subject); get_running_average(&average_percent_time_unknown_known, percent_time_unknown_known, current_subject); get_running_average(&average_percent_time_warning, percent_time_warning, current_subject); get_running_average(&average_percent_time_warning_known, percent_time_warning_known, current_subject); get_running_average(&average_percent_time_critical, percent_time_critical, current_subject); get_running_average(&average_percent_time_critical_known, percent_time_critical_known, current_subject); get_running_average(&average_percent_time_indeterminate, percent_time_indeterminate, current_subject); } /* display average stats */ if(odd) { odd = 0; bgclass = "Odd"; } else { odd = 1; bgclass = "Even"; } printf("\n", bgclass, bgclass, average_percent_time_ok, average_percent_time_ok_known, average_percent_time_warning, average_percent_time_warning_known, average_percent_time_unknown, average_percent_time_unknown_known, average_percent_time_critical, average_percent_time_critical_known, bgclass, average_percent_time_indeterminate); printf("
    HostService%% Time OK%% Time Warning%% Time Unknown%% Time Critical%% Time Undetermined
    ", bgclass, bgclass); if(strcmp(temp_subject->host_name, last_host)) host_report_url(temp_subject->host_name, temp_subject->host_name); printf("", bgclass); service_report_url(temp_subject->host_name, temp_subject->service_description, temp_subject->service_description); printf("%2.3f%% (%2.3f%%)%2.3f%% (%2.3f%%)%2.3f%% (%2.3f%%)%2.3f%% (%2.3f%%)%2.3f%%
    Average%2.3f%% (%2.3f%%)%2.3f%% (%2.3f%%)%2.3f%% (%2.3f%%)%2.3f%% (%2.3f%%)%2.3f%%
    \n"); printf("
    \n"); return; } /* display host availability */ void display_host_availability(void) { unsigned long total_time; unsigned long time_determinate; unsigned long time_indeterminate; avail_subject *temp_subject; host *temp_host; service *temp_service; int days, hours, minutes, seconds; char time_indeterminate_string[48]; char time_determinate_string[48]; char total_time_string[48]; double percent_time_ok = 0.0; double percent_time_warning = 0.0; double percent_time_unknown = 0.0; double percent_time_critical = 0.0; double percent_time_indeterminate = 0.0; double percent_time_ok_known = 0.0; double percent_time_warning_known = 0.0; double percent_time_unknown_known = 0.0; double percent_time_critical_known = 0.0; char time_up_string[48]; char time_down_string[48]; char time_unreachable_string[48]; double percent_time_up = 0.0; double percent_time_down = 0.0; double percent_time_unreachable = 0.0; double percent_time_up_known = 0.0; double percent_time_down_known = 0.0; double percent_time_unreachable_known = 0.0; double percent_time_up_scheduled = 0.0; double percent_time_up_unscheduled = 0.0; double percent_time_down_scheduled = 0.0; double percent_time_down_unscheduled = 0.0; double percent_time_unreachable_scheduled = 0.0; double percent_time_unreachable_unscheduled = 0.0; double percent_time_up_scheduled_known = 0.0; double percent_time_up_unscheduled_known = 0.0; double percent_time_down_scheduled_known = 0.0; double percent_time_down_unscheduled_known = 0.0; double percent_time_unreachable_scheduled_known = 0.0; double percent_time_unreachable_unscheduled_known = 0.0; char time_up_scheduled_string[48]; char time_up_unscheduled_string[48]; char time_down_scheduled_string[48]; char time_down_unscheduled_string[48]; char time_unreachable_scheduled_string[48]; char time_unreachable_unscheduled_string[48]; char time_indeterminate_scheduled_string[48]; char time_indeterminate_unscheduled_string[48]; char time_indeterminate_notrunning_string[48]; char time_indeterminate_nodata_string[48]; double percent_time_indeterminate_notrunning = 0.0; double percent_time_indeterminate_nodata = 0.0; double average_percent_time_up = 0.0; double average_percent_time_up_known = 0.0; double average_percent_time_down = 0.0; double average_percent_time_down_known = 0.0; double average_percent_time_unreachable = 0.0; double average_percent_time_unreachable_known = 0.0; double average_percent_time_indeterminate = 0.0; double average_percent_time_ok = 0.0; double average_percent_time_ok_known = 0.0; double average_percent_time_unknown = 0.0; double average_percent_time_unknown_known = 0.0; double average_percent_time_warning = 0.0; double average_percent_time_warning_known = 0.0; double average_percent_time_critical = 0.0; double average_percent_time_critical_known = 0.0; int current_subject = 0; const char *bgclass = ""; int odd = 1; /* calculate total time during period based on timeperiod used for reporting */ total_time = calculate_total_time(t1, t2); #ifdef DEBUG printf("Total time: '%ld' seconds
    \n", total_time); #endif /* show data for a specific host */ if(show_all_hosts == FALSE) { temp_subject = find_subject(HOST_SUBJECT, host_name, NULL); if(temp_subject == NULL) return; temp_host = find_host(temp_subject->host_name); if(temp_host == NULL) return; /* the user isn't authorized to view this host */ if(is_authorized_for_host(temp_host, ¤t_authdata) == FALSE) return; time_determinate = temp_subject->time_up + temp_subject->time_down + temp_subject->time_unreachable; time_indeterminate = total_time - time_determinate; /* adjust indeterminate time due to insufficient data (not all was caught) */ temp_subject->time_indeterminate_nodata = time_indeterminate - temp_subject->time_indeterminate_notrunning; /* up times */ get_time_breakdown(temp_subject->time_up, &days, &hours, &minutes, &seconds); snprintf(time_up_string, sizeof(time_up_string) - 1, "%dd %dh %dm %ds", days, hours, minutes, seconds); get_time_breakdown(temp_subject->scheduled_time_up, &days, &hours, &minutes, &seconds); snprintf(time_up_scheduled_string, sizeof(time_up_scheduled_string) - 1, "%dd %dh %dm %ds", days, hours, minutes, seconds); get_time_breakdown(temp_subject->time_up - temp_subject->scheduled_time_up, &days, &hours, &minutes, &seconds); snprintf(time_up_unscheduled_string, sizeof(time_up_unscheduled_string) - 1, "%dd %dh %dm %ds", days, hours, minutes, seconds); /* down times */ get_time_breakdown(temp_subject->time_down, &days, &hours, &minutes, &seconds); snprintf(time_down_string, sizeof(time_down_string) - 1, "%dd %dh %dm %ds", days, hours, minutes, seconds); get_time_breakdown(temp_subject->scheduled_time_down, &days, &hours, &minutes, &seconds); snprintf(time_down_scheduled_string, sizeof(time_down_scheduled_string) - 1, "%dd %dh %dm %ds", days, hours, minutes, seconds); get_time_breakdown(temp_subject->time_down - temp_subject->scheduled_time_down, &days, &hours, &minutes, &seconds); snprintf(time_down_unscheduled_string, sizeof(time_down_unscheduled_string) - 1, "%dd %dh %dm %ds", days, hours, minutes, seconds); /* unreachable times */ get_time_breakdown(temp_subject->time_unreachable, &days, &hours, &minutes, &seconds); snprintf(time_unreachable_string, sizeof(time_unreachable_string) - 1, "%dd %dh %dm %ds", days, hours, minutes, seconds); get_time_breakdown(temp_subject->scheduled_time_unreachable, &days, &hours, &minutes, &seconds); snprintf(time_unreachable_scheduled_string, sizeof(time_unreachable_scheduled_string) - 1, "%dd %dh %dm %ds", days, hours, minutes, seconds); get_time_breakdown(temp_subject->time_unreachable - temp_subject->scheduled_time_unreachable, &days, &hours, &minutes, &seconds); snprintf(time_unreachable_unscheduled_string, sizeof(time_unreachable_unscheduled_string) - 1, "%dd %dh %dm %ds", days, hours, minutes, seconds); /* indeterminate times */ get_time_breakdown(time_indeterminate, &days, &hours, &minutes, &seconds); snprintf(time_indeterminate_string, sizeof(time_indeterminate_string) - 1, "%dd %dh %dm %ds", days, hours, minutes, seconds); get_time_breakdown(temp_subject->scheduled_time_indeterminate, &days, &hours, &minutes, &seconds); snprintf(time_indeterminate_scheduled_string, sizeof(time_indeterminate_scheduled_string) - 1, "%dd %dh %dm %ds", days, hours, minutes, seconds); get_time_breakdown(time_indeterminate - temp_subject->scheduled_time_indeterminate, &days, &hours, &minutes, &seconds); snprintf(time_indeterminate_unscheduled_string, sizeof(time_indeterminate_unscheduled_string) - 1, "%dd %dh %dm %ds", days, hours, minutes, seconds); get_time_breakdown(temp_subject->time_indeterminate_notrunning, &days, &hours, &minutes, &seconds); snprintf(time_indeterminate_notrunning_string, sizeof(time_indeterminate_notrunning_string) - 1, "%dd %dh %dm %ds", days, hours, minutes, seconds); get_time_breakdown(temp_subject->time_indeterminate_nodata, &days, &hours, &minutes, &seconds); snprintf(time_indeterminate_nodata_string, sizeof(time_indeterminate_nodata_string) - 1, "%dd %dh %dm %ds", days, hours, minutes, seconds); get_time_breakdown(time_determinate, &days, &hours, &minutes, &seconds); snprintf(time_determinate_string, sizeof(time_determinate_string) - 1, "%dd %dh %dm %ds", days, hours, minutes, seconds); get_time_breakdown(total_time, &days, &hours, &minutes, &seconds); snprintf(total_time_string, sizeof(total_time_string) - 1, "%dd %dh %dm %ds", days, hours, minutes, seconds); if(total_time > 0) { percent_time_up = (double)(((double)temp_subject->time_up * 100.0) / (double)total_time); percent_time_up_scheduled = (double)(((double)temp_subject->scheduled_time_up * 100.0) / (double)total_time); percent_time_up_unscheduled = percent_time_up - percent_time_up_scheduled; percent_time_down = (double)(((double)temp_subject->time_down * 100.0) / (double)total_time); percent_time_down_scheduled = (double)(((double)temp_subject->scheduled_time_down * 100.0) / (double)total_time); percent_time_down_unscheduled = percent_time_down - percent_time_down_scheduled; percent_time_unreachable = (double)(((double)temp_subject->time_unreachable * 100.0) / (double)total_time); percent_time_unreachable_scheduled = (double)(((double)temp_subject->scheduled_time_unreachable * 100.0) / (double)total_time); percent_time_unreachable_unscheduled = percent_time_unreachable - percent_time_unreachable_scheduled; percent_time_indeterminate = (double)(((double)time_indeterminate * 100.0) / (double)total_time); percent_time_indeterminate_notrunning = (double)(((double)temp_subject->time_indeterminate_notrunning * 100.0) / (double)total_time); percent_time_indeterminate_nodata = (double)(((double)temp_subject->time_indeterminate_nodata * 100.0) / (double)total_time); if(time_determinate > 0) { percent_time_up_known = (double)(((double)temp_subject->time_up * 100.0) / (double)time_determinate); percent_time_up_scheduled_known = (double)(((double)temp_subject->scheduled_time_up * 100.0) / (double)time_determinate); percent_time_up_unscheduled_known = percent_time_up_known - percent_time_up_scheduled_known; percent_time_down_known = (double)(((double)temp_subject->time_down * 100.0) / (double)time_determinate); percent_time_down_scheduled_known = (double)(((double)temp_subject->scheduled_time_down * 100.0) / (double)time_determinate); percent_time_down_unscheduled_known = percent_time_down_known - percent_time_down_scheduled_known; percent_time_unreachable_known = (double)(((double)temp_subject->time_unreachable * 100.0) / (double)time_determinate); percent_time_unreachable_scheduled_known = (double)(((double)temp_subject->scheduled_time_unreachable * 100.0) / (double)time_determinate); percent_time_unreachable_unscheduled_known = percent_time_unreachable_known - percent_time_unreachable_scheduled_known; } } printf("
    Host State Breakdowns:
    \n"); #ifdef USE_TRENDS printf("

    \n"); printf("", t1, t2, (include_soft_states == TRUE) ? "yes" : "no", (assume_state_retention == TRUE) ? "yes" : "no", (assume_initial_states == TRUE) ? "yes" : "no", (assume_states_during_notrunning == TRUE) ? "yes" : "no", initial_assumed_host_state, backtrack_archives); #ifdef LEGACY_GRAPHICAL_CGIS printf("Host State Trends", t1, t2, (include_soft_states == TRUE) ? "yes" : "no", (assume_state_retention == TRUE) ? "yes" : "no", (assume_initial_states == TRUE) ? "yes" : "no", (assume_states_during_notrunning == TRUE) ? "yes" : "no", initial_assumed_host_state, backtrack_archives); printf("
    \n"); printf("

    \n"); #endif printf("
    \n"); printf("\n"); printf("\n"); /* up times */ printf(""); printf("\n", time_up_unscheduled_string, percent_time_up, percent_time_up_known); printf("\n", time_up_scheduled_string, percent_time_up_scheduled, percent_time_up_scheduled_known); printf("\n", time_up_string, percent_time_up, percent_time_up_known); /* down times */ printf(""); printf("\n", time_down_unscheduled_string, percent_time_down_unscheduled, percent_time_down_unscheduled_known); printf("\n", time_down_scheduled_string, percent_time_down_scheduled, percent_time_down_scheduled_known); printf("\n", time_down_string, percent_time_down, percent_time_down_known); /* unreachable times */ printf(""); printf("\n", time_unreachable_unscheduled_string, percent_time_unreachable, percent_time_unreachable_known); printf("\n", time_unreachable_scheduled_string, percent_time_unreachable_scheduled, percent_time_unreachable_scheduled_known); printf("\n", time_unreachable_string, percent_time_unreachable, percent_time_unreachable_known); /* indeterminate times */ printf(""); printf("\n", time_indeterminate_notrunning_string, percent_time_indeterminate_notrunning); printf("\n", time_indeterminate_nodata_string, percent_time_indeterminate_nodata); printf("\n", time_indeterminate_string, percent_time_indeterminate); printf("\n"); printf("\n", total_time_string); printf("
    StateType / ReasonTime%% Total Time%% Known Time
    UPUnscheduled%s%2.3f%%%2.3f%%
    Scheduled%s%2.3f%%%2.3f%%
    Total%s%2.3f%%%2.3f%%
    DOWNUnscheduled%s%2.3f%%%2.3f%%
    Scheduled%s%2.3f%%%2.3f%%
    Total%s%2.3f%%%2.3f%%
    UNREACHABLEUnscheduled%s%2.3f%%%2.3f%%
    Scheduled%s%2.3f%%%2.3f%%
    Total%s%2.3f%%%2.3f%%
    UndeterminedNagios Not Running%s%2.3f%%
    Insufficient Data%s%2.3f%%
    Total%s%2.3f%%
    AllTotal%s100.000%%100.000%%
    \n"); printf("
    \n"); /* display state breakdowns for all services on this host */ printf("

    \n"); printf("
    State Breakdowns For Host Services:
    \n"); printf("
    \n"); printf("\n"); printf("\n"); for(temp_subject = subject_list; temp_subject != NULL; temp_subject = temp_subject->next) { if(temp_subject->type != SERVICE_SUBJECT) continue; temp_service = find_service(temp_subject->host_name, temp_subject->service_description); if(temp_service == NULL) continue; /* the user isn't authorized to view this service */ if(is_authorized_for_service(temp_service, ¤t_authdata) == FALSE) continue; current_subject++; if(odd) { odd = 0; bgclass = "Odd"; } else { odd = 1; bgclass = "Even"; } /* reset variables */ percent_time_ok = 0.0; percent_time_warning = 0.0; percent_time_unknown = 0.0; percent_time_critical = 0.0; percent_time_indeterminate = 0.0; percent_time_ok_known = 0.0; percent_time_warning_known = 0.0; percent_time_unknown_known = 0.0; percent_time_critical_known = 0.0; time_determinate = temp_subject->time_ok + temp_subject->time_warning + temp_subject->time_unknown + temp_subject->time_critical; time_indeterminate = total_time - time_determinate; if(total_time > 0) { percent_time_ok = (double)(((double)temp_subject->time_ok * 100.0) / (double)total_time); percent_time_warning = (double)(((double)temp_subject->time_warning * 100.0) / (double)total_time); percent_time_unknown = (double)(((double)temp_subject->time_unknown * 100.0) / (double)total_time); percent_time_critical = (double)(((double)temp_subject->time_critical * 100.0) / (double)total_time); percent_time_indeterminate = (double)(((double)time_indeterminate * 100.0) / (double)total_time); if(time_determinate > 0) { percent_time_ok_known = (double)(((double)temp_subject->time_ok * 100.0) / (double)time_determinate); percent_time_warning_known = (double)(((double)temp_subject->time_warning * 100.0) / (double)time_determinate); percent_time_unknown_known = (double)(((double)temp_subject->time_unknown * 100.0) / (double)time_determinate); percent_time_critical_known = (double)(((double)temp_subject->time_critical * 100.0) / (double)time_determinate); } } printf("\n", percent_time_ok, percent_time_ok_known, percent_time_warning, percent_time_warning_known, percent_time_unknown, percent_time_unknown_known, percent_time_critical, percent_time_critical_known, bgclass, percent_time_indeterminate); get_running_average(&average_percent_time_ok, percent_time_ok, current_subject); get_running_average(&average_percent_time_ok_known, percent_time_ok_known, current_subject); get_running_average(&average_percent_time_unknown, percent_time_unknown, current_subject); get_running_average(&average_percent_time_unknown_known, percent_time_unknown_known, current_subject); get_running_average(&average_percent_time_warning, percent_time_warning, current_subject); get_running_average(&average_percent_time_warning_known, percent_time_warning_known, current_subject); get_running_average(&average_percent_time_critical, percent_time_critical, current_subject); get_running_average(&average_percent_time_critical_known, percent_time_critical_known, current_subject); get_running_average(&average_percent_time_indeterminate, percent_time_indeterminate, current_subject); } /* display average stats */ if(odd) { odd = 0; bgclass = "Odd"; } else { odd = 1; bgclass = "Even"; } printf("\n", bgclass, bgclass, average_percent_time_ok, average_percent_time_ok_known, average_percent_time_warning, average_percent_time_warning_known, average_percent_time_unknown, average_percent_time_unknown_known, average_percent_time_critical, average_percent_time_critical_known, bgclass, average_percent_time_indeterminate); printf("
    Service%% Time OK%% Time Warning%% Time Unknown%% Time Critical%% Time Undetermined
    ", bgclass, bgclass); service_report_url(temp_subject->host_name, temp_subject->service_description, temp_subject->service_description); printf("%2.3f%% (%2.3f%%)%2.3f%% (%2.3f%%)%2.3f%% (%2.3f%%)%2.3f%% (%2.3f%%)%2.3f%%
    Average%2.3f%% (%2.3f%%)%2.3f%% (%2.3f%%)%2.3f%% (%2.3f%%)%2.3f%% (%2.3f%%)%2.3f%%
    \n"); printf("
    \n"); /* write log entries for the host */ temp_subject = find_subject(HOST_SUBJECT, host_name, NULL); write_log_entries(temp_subject); } /* display data for all hosts */ else { if(output_format == HTML_OUTPUT) { printf("

    \n"); printf("
    Host State Breakdowns:
    \n"); printf("
    \n"); printf("\n"); printf("\n"); } else if(output_format == CSV_OUTPUT) { printf("HOST_NAME,"); printf(" TIME_UP_SCHEDULED, PERCENT_TIME_UP_SCHEDULED, PERCENT_KNOWN_TIME_UP_SCHEDULED, TIME_UP_UNSCHEDULED, PERCENT_TIME_UP_UNSCHEDULED, PERCENT_KNOWN_TIME_UP_UNSCHEDULED, TOTAL_TIME_UP, PERCENT_TOTAL_TIME_UP, PERCENT_KNOWN_TIME_UP,"); printf(" TIME_DOWN_SCHEDULED, PERCENT_TIME_DOWN_SCHEDULED, PERCENT_KNOWN_TIME_DOWN_SCHEDULED, TIME_DOWN_UNSCHEDULED, PERCENT_TIME_DOWN_UNSCHEDULED, PERCENT_KNOWN_TIME_DOWN_UNSCHEDULED, TOTAL_TIME_DOWN, PERCENT_TOTAL_TIME_DOWN, PERCENT_KNOWN_TIME_DOWN,"); printf(" TIME_UNREACHABLE_SCHEDULED, PERCENT_TIME_UNREACHABLE_SCHEDULED, PERCENT_KNOWN_TIME_UNREACHABLE_SCHEDULED, TIME_UNREACHABLE_UNSCHEDULED, PERCENT_TIME_UNREACHABLE_UNSCHEDULED, PERCENT_KNOWN_TIME_UNREACHABLE_UNSCHEDULED, TOTAL_TIME_UNREACHABLE, PERCENT_TOTAL_TIME_UNREACHABLE, PERCENT_KNOWN_TIME_UNREACHABLE,"); printf(" TIME_UNDETERMINED_NOT_RUNNING, PERCENT_TIME_UNDETERMINED_NOT_RUNNING, TIME_UNDETERMINED_NO_DATA, PERCENT_TIME_UNDETERMINED_NO_DATA, TOTAL_TIME_UNDETERMINED, PERCENT_TOTAL_TIME_UNDETERMINED\n"); } for(temp_subject = subject_list; temp_subject != NULL; temp_subject = temp_subject->next) { if(temp_subject->type != HOST_SUBJECT) continue; temp_host = find_host(temp_subject->host_name); if(temp_host == NULL) continue; /* the user isn't authorized to view this host */ if(is_authorized_for_host(temp_host, ¤t_authdata) == FALSE) continue; current_subject++; time_determinate = temp_subject->time_up + temp_subject->time_down + temp_subject->time_unreachable; time_indeterminate = total_time - time_determinate; /* adjust indeterminate time due to insufficient data (not all was caught) */ temp_subject->time_indeterminate_nodata = time_indeterminate - temp_subject->time_indeterminate_notrunning; /* initialize values */ percent_time_up = 0.0; percent_time_up_scheduled = 0.0; percent_time_up_unscheduled = 0.0; percent_time_down = 0.0; percent_time_down_scheduled = 0.0; percent_time_down_unscheduled = 0.0; percent_time_unreachable = 0.0; percent_time_unreachable_scheduled = 0.0; percent_time_unreachable_unscheduled = 0.0; percent_time_indeterminate = 0.0; percent_time_indeterminate_notrunning = 0.0; percent_time_indeterminate_nodata = 0.0; percent_time_up_known = 0.0; percent_time_up_scheduled_known = 0.0; percent_time_up_unscheduled_known = 0.0; percent_time_down_known = 0.0; percent_time_down_scheduled_known = 0.0; percent_time_down_unscheduled_known = 0.0; percent_time_unreachable_known = 0.0; percent_time_unreachable_scheduled_known = 0.0; percent_time_unreachable_unscheduled_known = 0.0; if(total_time > 0) { percent_time_up = (double)(((double)temp_subject->time_up * 100.0) / (double)total_time); percent_time_up_scheduled = (double)(((double)temp_subject->scheduled_time_up * 100.0) / (double)total_time); percent_time_up_unscheduled = percent_time_up - percent_time_up_scheduled; percent_time_down = (double)(((double)temp_subject->time_down * 100.0) / (double)total_time); percent_time_down_scheduled = (double)(((double)temp_subject->scheduled_time_down * 100.0) / (double)total_time); percent_time_down_unscheduled = percent_time_down - percent_time_down_scheduled; percent_time_unreachable = (double)(((double)temp_subject->time_unreachable * 100.0) / (double)total_time); percent_time_unreachable_scheduled = (double)(((double)temp_subject->scheduled_time_unreachable * 100.0) / (double)total_time); percent_time_unreachable_unscheduled = percent_time_unreachable - percent_time_unreachable_scheduled; percent_time_indeterminate = (double)(((double)time_indeterminate * 100.0) / (double)total_time); percent_time_indeterminate_notrunning = (double)(((double)temp_subject->time_indeterminate_notrunning * 100.0) / (double)total_time); percent_time_indeterminate_nodata = (double)(((double)temp_subject->time_indeterminate_nodata * 100.0) / (double)total_time); if(time_determinate > 0) { percent_time_up_known = (double)(((double)temp_subject->time_up * 100.0) / (double)time_determinate); percent_time_up_scheduled_known = (double)(((double)temp_subject->scheduled_time_up * 100.0) / (double)time_determinate); percent_time_up_unscheduled_known = percent_time_up_known - percent_time_up_scheduled_known; percent_time_down_known = (double)(((double)temp_subject->time_down * 100.0) / (double)time_determinate); percent_time_down_scheduled_known = (double)(((double)temp_subject->scheduled_time_down * 100.0) / (double)time_determinate); percent_time_down_unscheduled_known = percent_time_down_known - percent_time_down_scheduled_known; percent_time_unreachable_known = (double)(((double)temp_subject->time_unreachable * 100.0) / (double)time_determinate); percent_time_unreachable_scheduled_known = (double)(((double)temp_subject->scheduled_time_unreachable * 100.0) / (double)time_determinate); percent_time_unreachable_unscheduled_known = percent_time_unreachable_known - percent_time_unreachable_scheduled_known; } } if(output_format == HTML_OUTPUT) { if(odd) { odd = 0; bgclass = "Odd"; } else { odd = 1; bgclass = "Even"; } printf("\n", percent_time_up, percent_time_up_known, percent_time_down, percent_time_down_known, percent_time_unreachable, percent_time_unreachable_known, bgclass, percent_time_indeterminate); } else if(output_format == CSV_OUTPUT) { /* host name */ printf("\"%s\",", temp_subject->host_name); /* up times */ printf(" %lu, %2.3f%%, %2.3f%%, %lu, %2.3f%%, %2.3f%%, %lu, %2.3f%%, %2.3f%%,", temp_subject->scheduled_time_up, percent_time_up_scheduled, percent_time_up_scheduled_known, temp_subject->time_up - temp_subject->scheduled_time_up, percent_time_up_unscheduled, percent_time_up_unscheduled_known, temp_subject->time_up, percent_time_up, percent_time_up_known); /* down times */ printf(" %lu, %2.3f%%, %2.3f%%, %lu, %2.3f%%, %2.3f%%, %lu, %2.3f%%, %2.3f%%,", temp_subject->scheduled_time_down, percent_time_down_scheduled, percent_time_down_scheduled_known, temp_subject->time_down - temp_subject->scheduled_time_down, percent_time_down_unscheduled, percent_time_down_unscheduled_known, temp_subject->time_down, percent_time_down, percent_time_down_known); /* unreachable times */ printf(" %lu, %2.3f%%, %2.3f%%, %lu, %2.3f%%, %2.3f%%, %lu, %2.3f%%, %2.3f%%,", temp_subject->scheduled_time_unreachable, percent_time_unreachable_scheduled, percent_time_unreachable_scheduled_known, temp_subject->time_unreachable - temp_subject->scheduled_time_unreachable, percent_time_unreachable_unscheduled, percent_time_unreachable_unscheduled_known, temp_subject->time_unreachable, percent_time_unreachable, percent_time_unreachable_known); /* indeterminate times */ printf(" %lu, %2.3f%%, %lu, %2.3f%%, %lu, %2.3f%%\n", temp_subject->time_indeterminate_notrunning, percent_time_indeterminate_notrunning, temp_subject->time_indeterminate_nodata, percent_time_indeterminate_nodata, time_indeterminate, percent_time_indeterminate); } get_running_average(&average_percent_time_up, percent_time_up, current_subject); get_running_average(&average_percent_time_up_known, percent_time_up_known, current_subject); get_running_average(&average_percent_time_down, percent_time_down, current_subject); get_running_average(&average_percent_time_down_known, percent_time_down_known, current_subject); get_running_average(&average_percent_time_unreachable, percent_time_unreachable, current_subject); get_running_average(&average_percent_time_unreachable_known, percent_time_unreachable_known, current_subject); get_running_average(&average_percent_time_indeterminate, percent_time_indeterminate, current_subject); } if(output_format == HTML_OUTPUT) { /* average statistics */ if(odd) { odd = 0; bgclass = "Odd"; } else { odd = 1; bgclass = "Even"; } printf("", bgclass, bgclass, average_percent_time_up, average_percent_time_up_known, average_percent_time_down, average_percent_time_down_known, average_percent_time_unreachable, average_percent_time_unreachable_known, bgclass, average_percent_time_indeterminate); printf("
    Host%% Time Up%% Time Down%% Time Unreachable%% Time Undetermined
    ", bgclass, bgclass); host_report_url(temp_subject->host_name, temp_subject->host_name); printf("%2.3f%% (%2.3f%%)%2.3f%% (%2.3f%%)%2.3f%% (%2.3f%%)%2.3f%%
    Average%2.3f%% (%2.3f%%)%2.3f%% (%2.3f%%)%2.3f%% (%2.3f%%)%2.3f%%
    \n"); printf("
    \n"); } } return; } /* display service availability */ void display_service_availability(void) { unsigned long total_time; unsigned long time_determinate; unsigned long time_indeterminate; avail_subject *temp_subject; service *temp_service; int days, hours, minutes, seconds; char time_ok_string[48]; char time_warning_string[48]; char time_unknown_string[48]; char time_critical_string[48]; char time_indeterminate_string[48]; char time_determinate_string[48]; char total_time_string[48]; double percent_time_ok = 0.0; double percent_time_warning = 0.0; double percent_time_unknown = 0.0; double percent_time_critical = 0.0; double percent_time_indeterminate = 0.0; double percent_time_ok_known = 0.0; double percent_time_warning_known = 0.0; double percent_time_unknown_known = 0.0; double percent_time_critical_known = 0.0; char time_critical_scheduled_string[48]; char time_critical_unscheduled_string[48]; double percent_time_critical_scheduled = 0.0; double percent_time_critical_unscheduled = 0.0; double percent_time_critical_scheduled_known = 0.0; double percent_time_critical_unscheduled_known = 0.0; char time_unknown_scheduled_string[48]; char time_unknown_unscheduled_string[48]; double percent_time_unknown_scheduled = 0.0; double percent_time_unknown_unscheduled = 0.0; double percent_time_unknown_scheduled_known = 0.0; double percent_time_unknown_unscheduled_known = 0.0; char time_warning_scheduled_string[48]; char time_warning_unscheduled_string[48]; double percent_time_warning_scheduled = 0.0; double percent_time_warning_unscheduled = 0.0; double percent_time_warning_scheduled_known = 0.0; double percent_time_warning_unscheduled_known = 0.0; char time_ok_scheduled_string[48]; char time_ok_unscheduled_string[48]; double percent_time_ok_scheduled = 0.0; double percent_time_ok_unscheduled = 0.0; double percent_time_ok_scheduled_known = 0.0; double percent_time_ok_unscheduled_known = 0.0; double average_percent_time_ok = 0.0; double average_percent_time_ok_known = 0.0; double average_percent_time_unknown = 0.0; double average_percent_time_unknown_known = 0.0; double average_percent_time_warning = 0.0; double average_percent_time_warning_known = 0.0; double average_percent_time_critical = 0.0; double average_percent_time_critical_known = 0.0; double average_percent_time_indeterminate = 0.0; int current_subject = 0; char time_indeterminate_scheduled_string[48]; char time_indeterminate_unscheduled_string[48]; char time_indeterminate_notrunning_string[48]; char time_indeterminate_nodata_string[48]; double percent_time_indeterminate_notrunning = 0.0; double percent_time_indeterminate_nodata = 0.0; int odd = 1; const char *bgclass = ""; char last_host[128] = ""; /* calculate total time during period based on timeperiod used for reporting */ total_time = calculate_total_time(t1, t2); /* we're only getting data for one service */ if(show_all_services == FALSE) { temp_subject = find_subject(SERVICE_SUBJECT, host_name, svc_description); if(temp_subject == NULL) return; temp_service = find_service(temp_subject->host_name, temp_subject->service_description); if(temp_service == NULL) return; /* the user isn't authorized to view this service */ if(is_authorized_for_service(temp_service, ¤t_authdata) == FALSE) return; time_determinate = temp_subject->time_ok + temp_subject->time_warning + temp_subject->time_unknown + temp_subject->time_critical; time_indeterminate = total_time - time_determinate; /* adjust indeterminate time due to insufficient data (not all was caught) */ temp_subject->time_indeterminate_nodata = time_indeterminate - temp_subject->time_indeterminate_notrunning; /* ok states */ get_time_breakdown(temp_subject->time_ok, &days, &hours, &minutes, &seconds); snprintf(time_ok_string, sizeof(time_ok_string) - 1, "%dd %dh %dm %ds", days, hours, minutes, seconds); get_time_breakdown(temp_subject->scheduled_time_ok, &days, &hours, &minutes, &seconds); snprintf(time_ok_scheduled_string, sizeof(time_ok_scheduled_string) - 1, "%dd %dh %dm %ds", days, hours, minutes, seconds); get_time_breakdown(temp_subject->time_ok - temp_subject->scheduled_time_ok, &days, &hours, &minutes, &seconds); snprintf(time_ok_unscheduled_string, sizeof(time_ok_unscheduled_string) - 1, "%dd %dh %dm %ds", days, hours, minutes, seconds); /* warning states */ get_time_breakdown(temp_subject->time_warning, &days, &hours, &minutes, &seconds); snprintf(time_warning_string, sizeof(time_warning_string) - 1, "%dd %dh %dm %ds", days, hours, minutes, seconds); get_time_breakdown(temp_subject->scheduled_time_warning, &days, &hours, &minutes, &seconds); snprintf(time_warning_scheduled_string, sizeof(time_warning_scheduled_string) - 1, "%dd %dh %dm %ds", days, hours, minutes, seconds); get_time_breakdown(temp_subject->time_warning - temp_subject->scheduled_time_warning, &days, &hours, &minutes, &seconds); snprintf(time_warning_unscheduled_string, sizeof(time_warning_unscheduled_string) - 1, "%dd %dh %dm %ds", days, hours, minutes, seconds); /* unknown states */ get_time_breakdown(temp_subject->time_unknown, &days, &hours, &minutes, &seconds); snprintf(time_unknown_string, sizeof(time_unknown_string) - 1, "%dd %dh %dm %ds", days, hours, minutes, seconds); get_time_breakdown(temp_subject->scheduled_time_unknown, &days, &hours, &minutes, &seconds); snprintf(time_unknown_scheduled_string, sizeof(time_unknown_scheduled_string) - 1, "%dd %dh %dm %ds", days, hours, minutes, seconds); get_time_breakdown(temp_subject->time_unknown - temp_subject->scheduled_time_unknown, &days, &hours, &minutes, &seconds); snprintf(time_unknown_unscheduled_string, sizeof(time_unknown_unscheduled_string) - 1, "%dd %dh %dm %ds", days, hours, minutes, seconds); /* critical states */ get_time_breakdown(temp_subject->time_critical, &days, &hours, &minutes, &seconds); snprintf(time_critical_string, sizeof(time_critical_string) - 1, "%dd %dh %dm %ds", days, hours, minutes, seconds); get_time_breakdown(temp_subject->scheduled_time_critical, &days, &hours, &minutes, &seconds); snprintf(time_critical_scheduled_string, sizeof(time_critical_scheduled_string) - 1, "%dd %dh %dm %ds", days, hours, minutes, seconds); get_time_breakdown(temp_subject->time_critical - temp_subject->scheduled_time_critical, &days, &hours, &minutes, &seconds); snprintf(time_critical_unscheduled_string, sizeof(time_critical_unscheduled_string) - 1, "%dd %dh %dm %ds", days, hours, minutes, seconds); /* indeterminate time */ get_time_breakdown(time_indeterminate, &days, &hours, &minutes, &seconds); snprintf(time_indeterminate_string, sizeof(time_indeterminate_string) - 1, "%dd %dh %dm %ds", days, hours, minutes, seconds); get_time_breakdown(temp_subject->scheduled_time_indeterminate, &days, &hours, &minutes, &seconds); snprintf(time_indeterminate_scheduled_string, sizeof(time_indeterminate_scheduled_string) - 1, "%dd %dh %dm %ds", days, hours, minutes, seconds); get_time_breakdown(time_indeterminate - temp_subject->scheduled_time_indeterminate, &days, &hours, &minutes, &seconds); snprintf(time_indeterminate_unscheduled_string, sizeof(time_indeterminate_unscheduled_string) - 1, "%dd %dh %dm %ds", days, hours, minutes, seconds); get_time_breakdown(temp_subject->time_indeterminate_notrunning, &days, &hours, &minutes, &seconds); snprintf(time_indeterminate_notrunning_string, sizeof(time_indeterminate_notrunning_string) - 1, "%dd %dh %dm %ds", days, hours, minutes, seconds); get_time_breakdown(temp_subject->time_indeterminate_nodata, &days, &hours, &minutes, &seconds); snprintf(time_indeterminate_nodata_string, sizeof(time_indeterminate_nodata_string) - 1, "%dd %dh %dm %ds", days, hours, minutes, seconds); get_time_breakdown(time_determinate, &days, &hours, &minutes, &seconds); snprintf(time_determinate_string, sizeof(time_determinate_string) - 1, "%dd %dh %dm %ds", days, hours, minutes, seconds); get_time_breakdown(total_time, &days, &hours, &minutes, &seconds); snprintf(total_time_string, sizeof(total_time_string) - 1, "%dd %dh %dm %ds", days, hours, minutes, seconds); if(total_time > 0) { percent_time_ok = (double)(((double)temp_subject->time_ok * 100.0) / (double)total_time); percent_time_ok_scheduled = (double)(((double)temp_subject->scheduled_time_ok * 100.0) / (double)total_time); percent_time_ok_unscheduled = percent_time_ok - percent_time_ok_scheduled; percent_time_warning = (double)(((double)temp_subject->time_warning * 100.0) / (double)total_time); percent_time_warning_scheduled = (double)(((double)temp_subject->scheduled_time_warning * 100.0) / (double)total_time); percent_time_warning_unscheduled = percent_time_warning - percent_time_warning_scheduled; percent_time_unknown = (double)(((double)temp_subject->time_unknown * 100.0) / (double)total_time); percent_time_unknown_scheduled = (double)(((double)temp_subject->scheduled_time_unknown * 100.0) / (double)total_time); percent_time_unknown_unscheduled = percent_time_unknown - percent_time_unknown_scheduled; percent_time_critical = (double)(((double)temp_subject->time_critical * 100.0) / (double)total_time); percent_time_critical_scheduled = (double)(((double)temp_subject->scheduled_time_critical * 100.0) / (double)total_time); percent_time_critical_unscheduled = percent_time_critical - percent_time_critical_scheduled; percent_time_indeterminate = (double)(((double)time_indeterminate * 100.0) / (double)total_time); percent_time_indeterminate_notrunning = (double)(((double)temp_subject->time_indeterminate_notrunning * 100.0) / (double)total_time); percent_time_indeterminate_nodata = (double)(((double)temp_subject->time_indeterminate_nodata * 100.0) / (double)total_time); if(time_determinate > 0) { percent_time_ok_known = (double)(((double)temp_subject->time_ok * 100.0) / (double)time_determinate); percent_time_ok_scheduled_known = (double)(((double)temp_subject->scheduled_time_ok * 100.0) / (double)time_determinate); percent_time_ok_unscheduled_known = percent_time_ok_known - percent_time_ok_scheduled_known; percent_time_warning_known = (double)(((double)temp_subject->time_warning * 100.0) / (double)time_determinate); percent_time_warning_scheduled_known = (double)(((double)temp_subject->scheduled_time_warning * 100.0) / (double)time_determinate); percent_time_warning_unscheduled_known = percent_time_warning_known - percent_time_warning_scheduled_known; percent_time_unknown_known = (double)(((double)temp_subject->time_unknown * 100.0) / (double)time_determinate); percent_time_unknown_scheduled_known = (double)(((double)temp_subject->scheduled_time_unknown * 100.0) / (double)time_determinate); percent_time_unknown_unscheduled_known = percent_time_unknown_known - percent_time_unknown_scheduled_known; percent_time_critical_known = (double)(((double)temp_subject->time_critical * 100.0) / (double)time_determinate); percent_time_critical_scheduled_known = (double)(((double)temp_subject->scheduled_time_critical * 100.0) / (double)time_determinate); percent_time_critical_unscheduled_known = percent_time_critical_known - percent_time_critical_scheduled_known; } } printf("
    Service State Breakdowns:
    \n"); #ifdef USE_TRENDS printf("

    \n"); printf("", url_encode(svc_description), t1, t2, (include_soft_states == TRUE) ? "yes" : "no", (assume_state_retention == TRUE) ? "yes" : "no", (assume_initial_states == TRUE) ? "yes" : "no", (assume_states_during_notrunning == TRUE) ? "yes" : "no", initial_assumed_service_state, backtrack_archives); #ifdef LEGACY_GRAPHICAL_CGIS printf("Service State Trends", url_encode(svc_description), t1, t2, (include_soft_states == TRUE) ? "yes" : "no", (assume_state_retention == TRUE) ? "yes" : "no", (assume_initial_states == TRUE) ? "yes" : "no", (assume_states_during_notrunning == TRUE) ? "yes" : "no", initial_assumed_service_state, backtrack_archives); printf("
    \n"); printf("

    \n"); #endif printf("
    \n"); printf("\n"); printf("\n"); /* ok states */ printf(""); printf("\n", time_ok_unscheduled_string, percent_time_ok_unscheduled, percent_time_ok_unscheduled_known); printf("\n", time_ok_scheduled_string, percent_time_ok_scheduled, percent_time_ok_scheduled_known); printf("\n", time_ok_string, percent_time_ok, percent_time_ok_known); /* warning states */ printf(""); printf("\n", time_warning_unscheduled_string, percent_time_warning_unscheduled, percent_time_warning_unscheduled_known); printf("\n", time_warning_scheduled_string, percent_time_warning_scheduled, percent_time_warning_scheduled_known); printf("\n", time_warning_string, percent_time_warning, percent_time_warning_known); /* unknown states */ printf(""); printf("\n", time_unknown_unscheduled_string, percent_time_unknown_unscheduled, percent_time_unknown_unscheduled_known); printf("\n", time_unknown_scheduled_string, percent_time_unknown_scheduled, percent_time_unknown_scheduled_known); printf("\n", time_unknown_string, percent_time_unknown, percent_time_unknown_known); /* critical states */ printf(""); printf("\n", time_critical_unscheduled_string, percent_time_critical_unscheduled, percent_time_critical_unscheduled_known); printf("\n", time_critical_scheduled_string, percent_time_critical_scheduled, percent_time_critical_scheduled_known); printf("\n", time_critical_string, percent_time_critical, percent_time_critical_known); printf(""); printf("\n", time_indeterminate_notrunning_string, percent_time_indeterminate_notrunning); printf("\n", time_indeterminate_nodata_string, percent_time_indeterminate_nodata); printf("\n", time_indeterminate_string, percent_time_indeterminate); printf("\n"); printf("\n", total_time_string); printf("
    StateType / ReasonTime%% Total Time%% Known Time
    OKUnscheduled%s%2.3f%%%2.3f%%
    Scheduled%s%2.3f%%%2.3f%%
    Total%s%2.3f%%%2.3f%%
    WARNINGUnscheduled%s%2.3f%%%2.3f%%
    Scheduled%s%2.3f%%%2.3f%%
    Total%s%2.3f%%%2.3f%%
    UNKNOWNUnscheduled%s%2.3f%%%2.3f%%
    Scheduled%s%2.3f%%%2.3f%%
    Total%s%2.3f%%%2.3f%%
    CRITICALUnscheduled%s%2.3f%%%2.3f%%
    Scheduled%s%2.3f%%%2.3f%%
    Total%s%2.3f%%%2.3f%%
    UndeterminedNagios Not Running%s%2.3f%%
    Insufficient Data%s%2.3f%%
    Total%s%2.3f%%
    AllTotal%s100.000%%100.000%%
    \n"); printf("
    \n"); write_log_entries(temp_subject); } /* display data for all services */ else { if(output_format == HTML_OUTPUT) { printf("
    Service State Breakdowns:
    \n"); printf("
    \n"); printf("\n"); printf("\n"); } else if(output_format == CSV_OUTPUT) { printf("HOST_NAME, SERVICE_DESCRIPTION,"); printf(" TIME_OK_SCHEDULED, PERCENT_TIME_OK_SCHEDULED, PERCENT_KNOWN_TIME_OK_SCHEDULED, TIME_OK_UNSCHEDULED, PERCENT_TIME_OK_UNSCHEDULED, PERCENT_KNOWN_TIME_OK_UNSCHEDULED, TOTAL_TIME_OK, PERCENT_TOTAL_TIME_OK, PERCENT_KNOWN_TIME_OK,"); printf(" TIME_WARNING_SCHEDULED, PERCENT_TIME_WARNING_SCHEDULED, PERCENT_KNOWN_TIME_WARNING_SCHEDULED, TIME_WARNING_UNSCHEDULED, PERCENT_TIME_WARNING_UNSCHEDULED, PERCENT_KNOWN_TIME_WARNING_UNSCHEDULED, TOTAL_TIME_WARNING, PERCENT_TOTAL_TIME_WARNING, PERCENT_KNOWN_TIME_WARNING,"); printf(" TIME_UNKNOWN_SCHEDULED, PERCENT_TIME_UNKNOWN_SCHEDULED, PERCENT_KNOWN_TIME_UNKNOWN_SCHEDULED, TIME_UNKNOWN_UNSCHEDULED, PERCENT_TIME_UNKNOWN_UNSCHEDULED, PERCENT_KNOWN_TIME_UNKNOWN_UNSCHEDULED, TOTAL_TIME_UNKNOWN, PERCENT_TOTAL_TIME_UNKNOWN, PERCENT_KNOWN_TIME_UNKNOWN,"); printf(" TIME_CRITICAL_SCHEDULED, PERCENT_TIME_CRITICAL_SCHEDULED, PERCENT_KNOWN_TIME_CRITICAL_SCHEDULED, TIME_CRITICAL_UNSCHEDULED, PERCENT_TIME_CRITICAL_UNSCHEDULED, PERCENT_KNOWN_TIME_CRITICAL_UNSCHEDULED, TOTAL_TIME_CRITICAL, PERCENT_TOTAL_TIME_CRITICAL, PERCENT_KNOWN_TIME_CRITICAL,"); printf(" TIME_UNDETERMINED_NOT_RUNNING, PERCENT_TIME_UNDETERMINED_NOT_RUNNING, TIME_UNDETERMINED_NO_DATA, PERCENT_TIME_UNDETERMINED_NO_DATA, TOTAL_TIME_UNDETERMINED, PERCENT_TOTAL_TIME_UNDETERMINED\n"); } for(temp_subject = subject_list; temp_subject != NULL; temp_subject = temp_subject->next) { if(temp_subject->type != SERVICE_SUBJECT) continue; temp_service = find_service(temp_subject->host_name, temp_subject->service_description); if(temp_service == NULL) continue; /* the user isn't authorized to view this service */ if(is_authorized_for_service(temp_service, ¤t_authdata) == FALSE) continue; current_subject++; time_determinate = temp_subject->time_ok + temp_subject->time_warning + temp_subject->time_unknown + temp_subject->time_critical; time_indeterminate = total_time - time_determinate; /* adjust indeterminate time due to insufficient data (not all was caught) */ temp_subject->time_indeterminate_nodata = time_indeterminate - temp_subject->time_indeterminate_notrunning; /* initialize values */ percent_time_ok = 0.0; percent_time_ok_scheduled = 0.0; percent_time_ok_unscheduled = 0.0; percent_time_warning = 0.0; percent_time_warning_scheduled = 0.0; percent_time_warning_unscheduled = 0.0; percent_time_unknown = 0.0; percent_time_unknown_scheduled = 0.0; percent_time_unknown_unscheduled = 0.0; percent_time_critical = 0.0; percent_time_critical_scheduled = 0.0; percent_time_critical_unscheduled = 0.0; percent_time_indeterminate = 0.0; percent_time_indeterminate_notrunning = 0.0; percent_time_indeterminate_nodata = 0.0; percent_time_ok_known = 0.0; percent_time_ok_scheduled_known = 0.0; percent_time_ok_unscheduled_known = 0.0; percent_time_warning_known = 0.0; percent_time_warning_scheduled_known = 0.0; percent_time_warning_unscheduled_known = 0.0; percent_time_unknown_known = 0.0; percent_time_unknown_scheduled_known = 0.0; percent_time_unknown_unscheduled_known = 0.0; percent_time_critical_known = 0.0; percent_time_critical_scheduled_known = 0.0; percent_time_critical_unscheduled_known = 0.0; if(total_time > 0) { percent_time_ok = (double)(((double)temp_subject->time_ok * 100.0) / (double)total_time); percent_time_ok_scheduled = (double)(((double)temp_subject->scheduled_time_ok * 100.0) / (double)total_time); percent_time_ok_unscheduled = percent_time_ok - percent_time_ok_scheduled; percent_time_warning = (double)(((double)temp_subject->time_warning * 100.0) / (double)total_time); percent_time_warning_scheduled = (double)(((double)temp_subject->scheduled_time_warning * 100.0) / (double)total_time); percent_time_warning_unscheduled = percent_time_warning - percent_time_warning_scheduled; percent_time_unknown = (double)(((double)temp_subject->time_unknown * 100.0) / (double)total_time); percent_time_unknown_scheduled = (double)(((double)temp_subject->scheduled_time_unknown * 100.0) / (double)total_time); percent_time_unknown_unscheduled = percent_time_unknown - percent_time_unknown_scheduled; percent_time_critical = (double)(((double)temp_subject->time_critical * 100.0) / (double)total_time); percent_time_critical_scheduled = (double)(((double)temp_subject->scheduled_time_critical * 100.0) / (double)total_time); percent_time_critical_unscheduled = percent_time_critical - percent_time_critical_scheduled; percent_time_indeterminate = (double)(((double)time_indeterminate * 100.0) / (double)total_time); percent_time_indeterminate_notrunning = (double)(((double)temp_subject->time_indeterminate_notrunning * 100.0) / (double)total_time); percent_time_indeterminate_nodata = (double)(((double)temp_subject->time_indeterminate_nodata * 100.0) / (double)total_time); if(time_determinate > 0) { percent_time_ok_known = (double)(((double)temp_subject->time_ok * 100.0) / (double)time_determinate); percent_time_ok_scheduled_known = (double)(((double)temp_subject->scheduled_time_ok * 100.0) / (double)time_determinate); percent_time_ok_unscheduled_known = percent_time_ok_known - percent_time_ok_scheduled_known; percent_time_warning_known = (double)(((double)temp_subject->time_warning * 100.0) / (double)time_determinate); percent_time_warning_scheduled_known = (double)(((double)temp_subject->scheduled_time_warning * 100.0) / (double)time_determinate); percent_time_warning_unscheduled_known = percent_time_warning_known - percent_time_warning_scheduled_known; percent_time_unknown_known = (double)(((double)temp_subject->time_unknown * 100.0) / (double)time_determinate); percent_time_unknown_scheduled_known = (double)(((double)temp_subject->scheduled_time_unknown * 100.0) / (double)time_determinate); percent_time_unknown_unscheduled_known = percent_time_unknown_known - percent_time_unknown_scheduled_known; percent_time_critical_known = (double)(((double)temp_subject->time_critical * 100.0) / (double)time_determinate); percent_time_critical_scheduled_known = (double)(((double)temp_subject->scheduled_time_critical * 100.0) / (double)time_determinate); percent_time_critical_unscheduled_known = percent_time_critical_known - percent_time_critical_scheduled_known; } } if(output_format == HTML_OUTPUT) { if(odd) { odd = 0; bgclass = "Odd"; } else { odd = 1; bgclass = "Even"; } printf("\n", percent_time_ok, percent_time_ok_known, percent_time_warning, percent_time_warning_known, percent_time_unknown, percent_time_unknown_known, percent_time_critical, percent_time_critical_known, bgclass, percent_time_indeterminate); } else if(output_format == CSV_OUTPUT) { /* host name and service description */ printf("\"%s\", \"%s\",", temp_subject->host_name, temp_subject->service_description); /* ok times */ printf(" %lu, %2.3f%%, %2.3f%%, %lu, %2.3f%%, %2.3f%%, %lu, %2.3f%%, %2.3f%%,", temp_subject->scheduled_time_ok, percent_time_ok_scheduled, percent_time_ok_scheduled_known, temp_subject->time_ok - temp_subject->scheduled_time_ok, percent_time_ok_unscheduled, percent_time_ok_unscheduled_known, temp_subject->time_ok, percent_time_ok, percent_time_ok_known); /* warning times */ printf(" %lu, %2.3f%%, %2.3f%%, %lu, %2.3f%%, %2.3f%%, %lu, %2.3f%%, %2.3f%%,", temp_subject->scheduled_time_warning, percent_time_warning_scheduled, percent_time_warning_scheduled_known, temp_subject->time_warning - temp_subject->scheduled_time_warning, percent_time_warning_unscheduled, percent_time_warning_unscheduled_known, temp_subject->time_warning, percent_time_warning, percent_time_warning_known); /* unknown times */ printf(" %lu, %2.3f%%, %2.3f%%, %lu, %2.3f%%, %2.3f%%, %lu, %2.3f%%, %2.3f%%,", temp_subject->scheduled_time_unknown, percent_time_unknown_scheduled, percent_time_unknown_scheduled_known, temp_subject->time_unknown - temp_subject->scheduled_time_unknown, percent_time_unknown_unscheduled, percent_time_unknown_unscheduled_known, temp_subject->time_unknown, percent_time_unknown, percent_time_unknown_known); /* critical times */ printf(" %lu, %2.3f%%, %2.3f%%, %lu, %2.3f%%, %2.3f%%, %lu, %2.3f%%, %2.3f%%,", temp_subject->scheduled_time_critical, percent_time_critical_scheduled, percent_time_critical_scheduled_known, temp_subject->time_critical - temp_subject->scheduled_time_critical, percent_time_critical_unscheduled, percent_time_critical_unscheduled_known, temp_subject->time_critical, percent_time_critical, percent_time_critical_known); /* indeterminate times */ printf(" %lu, %2.3f%%, %lu, %2.3f%%, %lu, %2.3f%%\n", temp_subject->time_indeterminate_notrunning, percent_time_indeterminate_notrunning, temp_subject->time_indeterminate_nodata, percent_time_indeterminate_nodata, time_indeterminate, percent_time_indeterminate); } strncpy(last_host, temp_subject->host_name, sizeof(last_host) - 1); last_host[sizeof(last_host) - 1] = '\x0'; get_running_average(&average_percent_time_ok, percent_time_ok, current_subject); get_running_average(&average_percent_time_ok_known, percent_time_ok_known, current_subject); get_running_average(&average_percent_time_unknown, percent_time_unknown, current_subject); get_running_average(&average_percent_time_unknown_known, percent_time_unknown_known, current_subject); get_running_average(&average_percent_time_warning, percent_time_warning, current_subject); get_running_average(&average_percent_time_warning_known, percent_time_warning_known, current_subject); get_running_average(&average_percent_time_critical, percent_time_critical, current_subject); get_running_average(&average_percent_time_critical_known, percent_time_critical_known, current_subject); get_running_average(&average_percent_time_indeterminate, percent_time_indeterminate, current_subject); } if(output_format == HTML_OUTPUT) { /* average statistics */ if(odd) { odd = 0; bgclass = "Odd"; } else { odd = 1; bgclass = "Even"; } printf("\n", bgclass, bgclass, average_percent_time_ok, average_percent_time_ok_known, average_percent_time_warning, average_percent_time_warning_known, average_percent_time_unknown, average_percent_time_unknown_known, average_percent_time_critical, average_percent_time_critical_known, bgclass, average_percent_time_indeterminate); printf("
    HostService%% Time OK%% Time Warning%% Time Unknown%% Time Critical%% Time Undetermined
    ", bgclass, bgclass); if(strcmp(temp_subject->host_name, last_host)) host_report_url(temp_subject->host_name, temp_subject->host_name); printf("", bgclass); service_report_url(temp_subject->host_name, temp_subject->service_description, temp_subject->service_description); printf("%2.3f%% (%2.3f%%)%2.3f%% (%2.3f%%)%2.3f%% (%2.3f%%)%2.3f%% (%2.3f%%)%2.3f%%
    Average%2.3f%% (%2.3f%%)%2.3f%% (%2.3f%%)%2.3f%% (%2.3f%%)%2.3f%% (%2.3f%%)%2.3f%%
    \n"); printf("
    \n"); } } return; } void host_report_url(const char *hn, const char *label) { printf("%s", label); return; } void service_report_url(const char *hn, const char *sd, const char *label) { printf("%s", label); return; } /* calculates running average */ void get_running_average(double *running_average, double new_value, int current_item) { *running_average = (((*running_average * ((double)current_item - 1.0)) + new_value) / (double)current_item); return; } /* used in reports where a timeperiod is selected */ unsigned long calculate_total_time(time_t start_time, time_t end_time) { struct tm *t; time_t midnight_today; int weekday; unsigned long total_time; timerange *temp_timerange; unsigned long temp_duration; unsigned long temp_end; unsigned long temp_start; unsigned long start; unsigned long end; /* attempt to handle the current time_period */ if(current_timeperiod != NULL) { /* "A day" is 86400 seconds */ t = localtime(&start_time); /* calculate the start of the day (midnight, 00:00 hours) */ t->tm_sec = 0; t->tm_min = 0; t->tm_hour = 0; t->tm_isdst = -1; midnight_today = mktime(t); weekday = t->tm_wday; total_time = 0; while(midnight_today < end_time) { temp_duration = 0; temp_end = min(86400, t2 - midnight_today); temp_start = 0; if(t1 > midnight_today) temp_start = t1 - midnight_today; /* check all time ranges for this day of the week */ for(temp_timerange = current_timeperiod->days[weekday]; temp_timerange != NULL; temp_timerange = temp_timerange->next) { start = max(temp_timerange->range_start, temp_start); end = min(temp_timerange->range_end, temp_end); #ifdef DEBUG printf("
  • Matching in timerange[%d]: %d -> %d (%ld -> %ld) %d -> %d = %ld
    \n", weekday, temp_timerange->range_start, temp_timerange->range_end, temp_start, temp_end, start, end, end - start); #endif if(end > start) temp_duration += end - start; } total_time += temp_duration; temp_start = 0; midnight_today += 86400; if(++weekday > 6) weekday = 0; } return total_time; } /* no timeperiod was selected */ return end_time - start_time; } nagios-4.3.4/cgi/cgiauth.c000066400000000000000000000465131314764422400153540ustar00rootroot00000000000000/***************************************************************************** * * CGIAUTH.C - Authorization utilities for Nagios CGIs * * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #include "../include/config.h" #include "../include/common.h" #include "../include/objects.h" #include "../include/cgiutils.h" #include "../include/cgiauth.h" extern char main_config_file[MAX_FILENAME_LENGTH]; extern int use_authentication; extern int use_ssl_authentication; /* get current authentication information */ int get_authentication_information(authdata *authinfo) { mmapfile *thefile; char *input = NULL; char *temp_ptr = NULL; contact *temp_contact = NULL; contactgroup *temp_contactgroup = NULL; if(authinfo == NULL) return ERROR; /* initial values... */ authinfo->authorized_for_all_hosts = FALSE; authinfo->authorized_for_all_host_commands = FALSE; authinfo->authorized_for_all_services = FALSE; authinfo->authorized_for_all_service_commands = FALSE; authinfo->authorized_for_system_information = FALSE; authinfo->authorized_for_system_commands = FALSE; authinfo->authorized_for_configuration_information = FALSE; authinfo->authorized_for_read_only = FALSE; /* grab username from the environment... */ if(use_ssl_authentication) { /* patch by Pawl Zuzelski - 7/22/08 */ temp_ptr = getenv("SSL_CLIENT_S_DN_CN"); } else { temp_ptr = getenv("REMOTE_USER"); } if(temp_ptr == NULL) { authinfo->username = ""; authinfo->authenticated = FALSE; } else { authinfo->username = (char *)malloc(strlen(temp_ptr) + 1); if(authinfo->username == NULL) authinfo->username = ""; else strcpy(authinfo->username, temp_ptr); if(!strcmp(authinfo->username, "")) authinfo->authenticated = FALSE; else authinfo->authenticated = TRUE; } /* read in authorization override vars from config file... */ if((thefile = mmap_fopen(get_cgi_config_location())) != NULL) { while(1) { /* free memory */ free(input); /* read the next line */ if((input = mmap_fgets_multiline(thefile)) == NULL) break; strip(input); /* we don't have a username yet, so fake the authentication if we find a default username defined */ if(!strcmp(authinfo->username, "") && strstr(input, "default_user_name=") == input) { temp_ptr = strtok(input, "="); temp_ptr = strtok(NULL, ","); authinfo->username = (char *)malloc(strlen(temp_ptr) + 1); if(authinfo->username == NULL) authinfo->username = ""; else strcpy(authinfo->username, temp_ptr); if(!strcmp(authinfo->username, "")) authinfo->authenticated = FALSE; else authinfo->authenticated = TRUE; } else if(strstr(input, "authorized_for_all_hosts=") == input) { temp_ptr = strtok(input, "="); while((temp_ptr = strtok(NULL, ","))) { if(!strcmp(temp_ptr, authinfo->username) || !strcmp(temp_ptr, "*")) authinfo->authorized_for_all_hosts = TRUE; } } else if(strstr(input, "authorized_for_all_services=") == input) { temp_ptr = strtok(input, "="); while((temp_ptr = strtok(NULL, ","))) { if(!strcmp(temp_ptr, authinfo->username) || !strcmp(temp_ptr, "*")) authinfo->authorized_for_all_services = TRUE; } } else if(strstr(input, "authorized_for_system_information=") == input) { temp_ptr = strtok(input, "="); while((temp_ptr = strtok(NULL, ","))) { if(!strcmp(temp_ptr, authinfo->username) || !strcmp(temp_ptr, "*")) authinfo->authorized_for_system_information = TRUE; } } else if(strstr(input, "authorized_for_configuration_information=") == input) { temp_ptr = strtok(input, "="); while((temp_ptr = strtok(NULL, ","))) { if(!strcmp(temp_ptr, authinfo->username) || !strcmp(temp_ptr, "*")) authinfo->authorized_for_configuration_information = TRUE; } } else if(strstr(input, "authorized_for_all_host_commands=") == input) { temp_ptr = strtok(input, "="); while((temp_ptr = strtok(NULL, ","))) { if(!strcmp(temp_ptr, authinfo->username) || !strcmp(temp_ptr, "*")) authinfo->authorized_for_all_host_commands = TRUE; } } else if(strstr(input, "authorized_for_all_service_commands=") == input) { temp_ptr = strtok(input, "="); while((temp_ptr = strtok(NULL, ","))) { if(!strcmp(temp_ptr, authinfo->username) || !strcmp(temp_ptr, "*")) authinfo->authorized_for_all_service_commands = TRUE; } } else if(strstr(input, "authorized_for_system_commands=") == input) { temp_ptr = strtok(input, "="); while((temp_ptr = strtok(NULL, ","))) { if(!strcmp(temp_ptr, authinfo->username) || !strcmp(temp_ptr, "*")) authinfo->authorized_for_system_commands = TRUE; } } else if(strstr(input, "authorized_for_read_only=") == input) { temp_ptr = strtok(input, "="); while((temp_ptr = strtok(NULL, ","))) { if(!strcmp(temp_ptr, authinfo->username) || !strcmp(temp_ptr, "*")) authinfo->authorized_for_read_only = TRUE; } } else if((temp_contact = find_contact(authinfo->username)) != NULL) { if(strstr(input, "authorized_contactgroup_for_all_hosts=") == input) { temp_ptr = strtok(input, "="); while((temp_ptr = strtok(NULL, ","))) { temp_contactgroup = find_contactgroup(temp_ptr); if(is_contact_member_of_contactgroup(temp_contactgroup, temp_contact)) authinfo->authorized_for_all_hosts = TRUE; } } else if(strstr(input, "authorized_contactgroup_for_all_services=") == input) { temp_ptr = strtok(input, "="); while((temp_ptr = strtok(NULL, ","))) { temp_contactgroup = find_contactgroup(temp_ptr); if(is_contact_member_of_contactgroup(temp_contactgroup, temp_contact)) authinfo->authorized_for_all_services = TRUE; } } else if(strstr(input, "authorized_contactgroup_for_system_information=") == input) { temp_ptr = strtok(input, "="); while((temp_ptr = strtok(NULL, ","))) { temp_contactgroup = find_contactgroup(temp_ptr); if(is_contact_member_of_contactgroup(temp_contactgroup, temp_contact)) authinfo->authorized_for_system_information = TRUE; } } else if(strstr(input, "authorized_contactgroup_for_configuration_information=") == input) { temp_ptr = strtok(input, "="); while((temp_ptr = strtok(NULL, ","))) { temp_contactgroup = find_contactgroup(temp_ptr); if(is_contact_member_of_contactgroup(temp_contactgroup, temp_contact)) authinfo->authorized_for_configuration_information = TRUE; } } else if(strstr(input, "authorized_contactgroup_for_all_host_commands=") == input) { temp_ptr = strtok(input, "="); while((temp_ptr = strtok(NULL, ","))) { temp_contactgroup = find_contactgroup(temp_ptr); if(is_contact_member_of_contactgroup(temp_contactgroup, temp_contact)) authinfo->authorized_for_all_host_commands = TRUE; } } else if(strstr(input, "authorized_contactgroup_for_all_service_commands=") == input) { temp_ptr = strtok(input, "="); while((temp_ptr = strtok(NULL, ","))) { temp_contactgroup = find_contactgroup(temp_ptr); if(is_contact_member_of_contactgroup(temp_contactgroup, temp_contact)) authinfo->authorized_for_all_service_commands = TRUE; } } else if(strstr(input, "authorized_contactgroup_for_system_commands=") == input) { temp_ptr = strtok(input, "="); while((temp_ptr = strtok(NULL, ","))) { temp_contactgroup = find_contactgroup(temp_ptr); if(is_contact_member_of_contactgroup(temp_contactgroup, temp_contact)) authinfo->authorized_for_system_commands = TRUE; } } else if(strstr(input, "authorized_contactgroup_for_read_only=") == input) { temp_ptr = strtok(input, "="); while((temp_ptr = strtok(NULL, ","))) { temp_contactgroup = find_contactgroup(temp_ptr); if(is_contact_member_of_contactgroup(temp_contactgroup, temp_contact)) authinfo->authorized_for_read_only = TRUE; } } } } /* free memory and close the file */ free(input); mmap_fclose(thefile); } if(authinfo->authenticated == TRUE) return OK; else return ERROR; } /* check if user is authorized to view information about a particular host */ int is_authorized_for_host(host *hst, authdata *authinfo) { contact *temp_contact; if(hst == NULL) return FALSE; /* if we're not using authentication, fake it */ if(use_authentication == FALSE) return TRUE; /* if this user has not authenticated return error */ if(authinfo->authenticated == FALSE) return FALSE; /* if this user is authorized for all hosts, they are for this one... */ if(is_authorized_for_all_hosts(authinfo) == TRUE) return TRUE; /* find the contact */ temp_contact = find_contact(authinfo->username); /* see if this user is a contact for the host */ if(is_contact_for_host(hst, temp_contact) == TRUE) return TRUE; /* see if this user is an escalated contact for the host */ if(is_escalated_contact_for_host(hst, temp_contact) == TRUE) return TRUE; return FALSE; } /* check if user is authorized to view information about all hosts in a particular hostgroup */ int is_authorized_for_hostgroup(hostgroup *hg, authdata *authinfo) { hostsmember *temp_hostsmember; host *temp_host; if(hg == NULL) return FALSE; /* CHANGED in 2.0 - user must be authorized for ALL hosts in a hostgroup, not just one */ /* see if user is authorized for all hosts in the hostgroup */ /* for(temp_hostsmember = hg->members; temp_hostsmember != NULL; temp_hostsmember = temp_hostsmember->next) { temp_host = find_host(temp_hostsmember->host_name); if(is_authorized_for_host(temp_host, authinfo) == FALSE) return FALSE; } */ /* Reverted for 3.3.2 - must only be a member of one hostgroup */ for(temp_hostsmember = hg->members; temp_hostsmember != NULL; temp_hostsmember = temp_hostsmember->next) { temp_host = find_host(temp_hostsmember->host_name); if(is_authorized_for_host(temp_host, authinfo) == TRUE) return TRUE; } /*return TRUE;*/ return FALSE; } /* check if user is authorized to view information about all services in a particular servicegroup */ int is_authorized_for_servicegroup(servicegroup *sg, authdata *authinfo) { servicesmember *temp_servicesmember; service *temp_service; if(sg == NULL) return FALSE; /* see if user is authorized for all services in the servicegroup */ /* for(temp_servicesmember = sg->members; temp_servicesmember != NULL; temp_servicesmember = temp_servicesmember->next) { temp_service = find_service(temp_servicesmember->host_name, temp_servicesmember->service_description); if(is_authorized_for_service(temp_service, authinfo) == FALSE) return FALSE; } */ /* Reverted for 3.3.2 - must only be a member of one hostgroup */ for(temp_servicesmember = sg->members; temp_servicesmember != NULL; temp_servicesmember = temp_servicesmember->next) { temp_service = find_service(temp_servicesmember->host_name, temp_servicesmember->service_description); if(is_authorized_for_service(temp_service, authinfo) == TRUE) return TRUE; } /*return TRUE*/; return FALSE; } /* check if current user is restricted to read only */ int is_authorized_for_read_only(authdata *authinfo) { /* if we're not using authentication, fake it */ if(use_authentication == FALSE) return FALSE; /* if this user has not authenticated return error */ if(authinfo->authenticated == FALSE) return FALSE; return authinfo->authorized_for_read_only; } /* check if user is authorized to view information about a particular service */ int is_authorized_for_service(service *svc, authdata *authinfo) { host *temp_host; contact *temp_contact; if(svc == NULL) return FALSE; /* if we're not using authentication, fake it */ if(use_authentication == FALSE) return TRUE; /* if this user has not authenticated return error */ if(authinfo->authenticated == FALSE) return FALSE; /* if this user is authorized for all services, they are for this one... */ if(is_authorized_for_all_services(authinfo) == TRUE) return TRUE; /* find the host */ temp_host = find_host(svc->host_name); if(temp_host == NULL) return FALSE; /* if this user is authorized for this host, they are for all services on it as well... */ if(is_authorized_for_host(temp_host, authinfo) == TRUE) return TRUE; /* find the contact */ temp_contact = find_contact(authinfo->username); /* see if this user is a contact for the service */ if(is_contact_for_service(svc, temp_contact) == TRUE) return TRUE; /* see if this user is an escalated contact for the service */ if(is_escalated_contact_for_service(svc, temp_contact) == TRUE) return TRUE; return FALSE; } /* check if current user is authorized to view information on all hosts */ int is_authorized_for_all_hosts(authdata *authinfo) { /* if we're not using authentication, fake it */ if(use_authentication == FALSE) return TRUE; /* if this user has not authenticated return error */ if(authinfo->authenticated == FALSE) return FALSE; return authinfo->authorized_for_all_hosts; } /* check if current user is authorized to view information on all service */ int is_authorized_for_all_services(authdata *authinfo) { /* if we're not using authentication, fake it */ if(use_authentication == FALSE) return TRUE; /* if this user has not authenticated return error */ if(authinfo->authenticated == FALSE) return FALSE; return authinfo->authorized_for_all_services; } /* check if current user is authorized to view system information */ int is_authorized_for_system_information(authdata *authinfo) { /* if we're not using authentication, fake it */ if(use_authentication == FALSE) return TRUE; /* if this user has not authenticated return error */ if(authinfo->authenticated == FALSE) return FALSE; return authinfo->authorized_for_system_information; } /* check if current user is authorized to view configuration information */ int is_authorized_for_configuration_information(authdata *authinfo) { /* if we're not using authentication, fake it */ if(use_authentication == FALSE) return TRUE; /* if this user has not authenticated return error */ if(authinfo->authenticated == FALSE) return FALSE; return authinfo->authorized_for_configuration_information; } /* check if current user is authorized to issue system commands */ int is_authorized_for_system_commands(authdata *authinfo) { /* if we're not using authentication, fake it */ if(use_authentication == FALSE) return TRUE; /* if this user has not authenticated return error */ if(authinfo->authenticated == FALSE) return FALSE; return authinfo->authorized_for_system_commands; } /* check is the current user is authorized to issue commands relating to a particular service */ int is_authorized_for_service_commands(service *svc, authdata *authinfo) { host *temp_host; contact *temp_contact; if(svc == NULL) return FALSE; /* if we're not using authentication, fake it */ if(use_authentication == FALSE) return TRUE; /* if this user has not authenticated return error */ if(authinfo->authenticated == FALSE) return FALSE; /* the user is authorized if they have rights to the service */ if(is_authorized_for_service(svc, authinfo) == TRUE) { /* find the host */ temp_host = find_host(svc->host_name); if(temp_host == NULL) return FALSE; /* find the contact */ temp_contact = find_contact(authinfo->username); /* reject if contact is not allowed to issue commands */ if(temp_contact && temp_contact->can_submit_commands == FALSE) return FALSE; /* see if this user is a contact for the host */ if(is_contact_for_host(temp_host, temp_contact) == TRUE) return TRUE; /* see if this user is an escalated contact for the host */ if(is_escalated_contact_for_host(temp_host, temp_contact) == TRUE) return TRUE; /* this user is a contact for the service, so they have permission... */ if(is_contact_for_service(svc, temp_contact) == TRUE) return TRUE; /* this user is an escalated contact for the service, so they have permission... */ if(is_escalated_contact_for_service(svc, temp_contact) == TRUE) return TRUE; /* this user is not a contact for the host, so they must have been given explicit permissions to all service commands */ if(authinfo->authorized_for_all_service_commands == TRUE) return TRUE; } return FALSE; } /* check is the current user is authorized to issue commands relating to a particular host */ int is_authorized_for_host_commands(host *hst, authdata *authinfo) { contact *temp_contact; if(hst == NULL) return FALSE; /* if we're not using authentication, fake it */ if(use_authentication == FALSE) return TRUE; /* if this user has not authenticated return error */ if(authinfo->authenticated == FALSE) return FALSE; /* the user is authorized if they have rights to the host */ if(is_authorized_for_host(hst, authinfo) == TRUE) { /* find the contact */ temp_contact = find_contact(authinfo->username); /* reject if contact is not allowed to issue commands */ if(temp_contact && temp_contact->can_submit_commands == FALSE) return FALSE; /* this user is a contact for the host, so they have permission... */ if(is_contact_for_host(hst, temp_contact) == TRUE) return TRUE; /* this user is an escalated contact for the host, so they have permission... */ if(is_escalated_contact_for_host(hst, temp_contact) == TRUE) return TRUE; /* this user is not a contact for the host, so they must have been given explicit permissions to all host commands */ if(authinfo->authorized_for_all_host_commands == TRUE) return TRUE; } return FALSE; } /* check is the current user is authorized to issue commands relating to a particular servicegroup */ int is_authorized_for_servicegroup_commands(servicegroup *sg, authdata *authinfo) { servicesmember *temp_servicesmember; service *temp_service; if(sg == NULL) return FALSE; /* see if user is authorized for all services commands in the servicegroup */ for(temp_servicesmember = sg->members; temp_servicesmember != NULL; temp_servicesmember = temp_servicesmember->next) { temp_service = find_service(temp_servicesmember->host_name, temp_servicesmember->service_description); if(is_authorized_for_service_commands(temp_service, authinfo) == FALSE) return FALSE; } return TRUE; } /* check is the current user is authorized to issue commands relating to a particular hostgroup */ int is_authorized_for_hostgroup_commands(hostgroup *hg, authdata *authinfo) { hostsmember *temp_hostsmember; host *temp_host; if(hg == NULL) return FALSE; /* see if user is authorized for all hosts in the hostgroup */ for(temp_hostsmember = hg->members; temp_hostsmember != NULL; temp_hostsmember = temp_hostsmember->next) { temp_host = find_host(temp_hostsmember->host_name); if(is_authorized_for_host_commands(temp_host, authinfo) == FALSE) return FALSE; } return TRUE; } nagios-4.3.4/cgi/cgiutils.c000066400000000000000000001720741314764422400155550ustar00rootroot00000000000000/*********************************************************************** * * CGIUTILS.C - Common utilities for Nagios CGIs * * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ***********************************************************************/ #include "../include/config.h" #include "../include/common.h" #include "../include/locations.h" #include "../include/objects.h" #include "../include/statusdata.h" #include "../include/downtime.h" #include "../include/cgiutils.h" char main_config_file[MAX_FILENAME_LENGTH]; char log_file[MAX_FILENAME_LENGTH]; char log_archive_path[MAX_FILENAME_LENGTH]; char command_file[MAX_FILENAME_LENGTH]; char physical_html_path[MAX_FILENAME_LENGTH]; char physical_images_path[MAX_FILENAME_LENGTH]; char physical_ssi_path[MAX_FILENAME_LENGTH]; char url_html_path[MAX_FILENAME_LENGTH]; char url_docs_path[MAX_FILENAME_LENGTH]; char url_context_help_path[MAX_FILENAME_LENGTH]; char url_images_path[MAX_FILENAME_LENGTH]; char url_logo_images_path[MAX_FILENAME_LENGTH]; char url_stylesheets_path[MAX_FILENAME_LENGTH]; char url_media_path[MAX_FILENAME_LENGTH]; char url_js_path[MAX_FILENAME_LENGTH]; char *service_critical_sound = NULL; char *service_warning_sound = NULL; char *service_unknown_sound = NULL; char *host_down_sound = NULL; char *host_unreachable_sound = NULL; char *normal_sound = NULL; char *statusmap_background_image = NULL; char *statuswrl_include = NULL; char *notes_url_target = NULL; char *action_url_target = NULL; char *ping_syntax = NULL; char nagios_process_info[MAX_INPUT_BUFFER] = ""; int nagios_process_state = STATE_OK; int enable_splunk_integration = FALSE; char *splunk_url = NULL; int lock_author_names = TRUE; int navbar_search_addresses = TRUE; int navbar_search_aliases = TRUE; int ack_no_sticky = FALSE; int ack_no_send = FALSE; int tac_cgi_hard_only = FALSE; time_t this_scheduled_log_rotation = 0L; time_t last_scheduled_log_rotation = 0L; time_t next_scheduled_log_rotation = 0L; int use_authentication = TRUE; int show_context_help = FALSE; int use_pending_states = TRUE; int host_status_has_been_read = FALSE; int service_status_has_been_read = FALSE; int program_status_has_been_read = FALSE; int refresh_rate = DEFAULT_REFRESH_RATE; int result_limit = 100; int escape_html_tags = FALSE; int use_ssl_authentication = FALSE; int default_statusmap_layout_method = 0; int default_statuswrl_layout_method = 0; int color_transparency_index_r = 255; int color_transparency_index_g = 255; int color_transparency_index_b = 255; extern hoststatus *hoststatus_list; extern servicestatus *servicestatus_list; lifo *lifo_list = NULL; char encoded_url_string[2][MAX_INPUT_BUFFER]; // 2 to be able use url_encode twice char *encoded_html_string = NULL; /* * These function stubs allow us to compile a lot of the * source-files common to cgi's and daemon without adding * a whole bunch of #ifdef's everywhere. Note that we can't * have them as macros, since the goal is to compile the * source-files once. A decent linker will make the call * a no-op anyway, so it's not a big issue */ void logit(int data_type, int display, const char *fmt, ...) { return; } int log_debug_info(int leve, int verbosity, const char *fmt, ...) { return 0; } /*** helpers ****/ /* * find a command with arguments still attached * if we're unsuccessful, the buffer pointed to by 'name' is modified * to have only the real command name (everything up until the first '!') */ static command *find_bang_command(char *name) { char *bang; command *cmd; if (!name) return NULL; bang = strchr(name, '!'); if (!bang) return find_command(name); *bang = 0; cmd = find_command(name); *bang = '!'; return cmd; } /********************************************************** ***************** CLEANUP FUNCTIONS ********************** **********************************************************/ /* reset all variables used by the CGIs */ void reset_cgi_vars(void) { strcpy(main_config_file, ""); strcpy(physical_html_path, ""); strcpy(physical_images_path, ""); strcpy(physical_ssi_path, ""); strcpy(url_html_path, ""); strcpy(url_docs_path, ""); strcpy(url_context_help_path, ""); strcpy(url_stylesheets_path, ""); strcpy(url_media_path, ""); strcpy(url_images_path, ""); strcpy(log_file, ""); strcpy(log_archive_path, DEFAULT_LOG_ARCHIVE_PATH); if(log_archive_path[strlen(log_archive_path) - 1] != '/' && strlen(log_archive_path) < sizeof(log_archive_path) - 2) strcat(log_archive_path, "/"); strcpy(command_file, get_cmd_file_location()); strcpy(nagios_process_info, ""); nagios_process_state = STATE_OK; log_rotation_method = LOG_ROTATION_NONE; use_authentication = TRUE; interval_length = 60; refresh_rate = DEFAULT_REFRESH_RATE; default_statusmap_layout_method = 0; default_statusmap_layout_method = 0; service_critical_sound = NULL; service_warning_sound = NULL; service_unknown_sound = NULL; host_down_sound = NULL; host_unreachable_sound = NULL; normal_sound = NULL; statusmap_background_image = NULL; color_transparency_index_r = 255; color_transparency_index_g = 255; color_transparency_index_b = 255; statuswrl_include = NULL; ping_syntax = NULL; return; } /* free all memory for object definitions */ void free_memory(void) { /* free memory for common object definitions */ free_object_data(); /* free memory for status data */ free_status_data(); /* free misc data */ free(service_critical_sound); free(service_warning_sound); free(service_unknown_sound); free(host_down_sound); free(host_unreachable_sound); free(normal_sound); free(statusmap_background_image); free(statuswrl_include); free(ping_syntax); return; } /********************************************************** *************** CONFIG FILE FUNCTIONS ******************** **********************************************************/ /* read the CGI config file location from an environment variable */ const char *get_cgi_config_location(void) { static char *cgiloc = NULL; if(!cgiloc) { cgiloc = getenv("NAGIOS_CGI_CONFIG"); if(!cgiloc) cgiloc = DEFAULT_CGI_CONFIG_FILE; } return cgiloc; } /* read the command file location from an environment variable */ const char *get_cmd_file_location(void) { static char *cmdloc = NULL; if(!cmdloc) { cmdloc = getenv("NAGIOS_COMMAND_FILE"); if(!cmdloc) cmdloc = DEFAULT_COMMAND_FILE; } return cmdloc; } /*read the CGI configuration file */ int read_cgi_config_file(const char *filename) { char *input = NULL; mmapfile *thefile; char *var = NULL; char *val = NULL; char *p = NULL; if((thefile = mmap_fopen(filename)) == NULL) return ERROR; while(1) { /* free memory */ free(input); /* read the next line */ if((input = mmap_fgets_multiline(thefile)) == NULL) break; strip(input); var = strtok(input, "="); val = strtok(NULL, "\n"); if(var == NULL || val == NULL) continue; if(!strcmp(var, "main_config_file")) { strncpy(main_config_file, val, sizeof(main_config_file)); main_config_file[sizeof(main_config_file) - 1] = '\x0'; strip(main_config_file); } else if(!strcmp(var, "show_context_help")) show_context_help = (atoi(val) > 0) ? TRUE : FALSE; else if(!strcmp(var, "use_pending_states")) use_pending_states = (atoi(val) > 0) ? TRUE : FALSE; else if(!strcmp(var, "use_authentication")) use_authentication = (atoi(val) > 0) ? TRUE : FALSE; else if(!strcmp(var, "refresh_rate")) refresh_rate = atoi(val); /* page limit added 2/1/2012 -MG */ else if(!strcmp(var, "result_limit")) result_limit = atoi(val); else if(!strcmp(var, "physical_html_path")) { strncpy(physical_html_path, val, sizeof(physical_html_path)); physical_html_path[sizeof(physical_html_path) - 1] = '\x0'; strip(physical_html_path); if(physical_html_path[strlen(physical_html_path) - 1] != '/' && (strlen(physical_html_path) < sizeof(physical_html_path) - 1)) strcat(physical_html_path, "/"); snprintf(physical_images_path, sizeof(physical_images_path), "%simages/", physical_html_path); physical_images_path[sizeof(physical_images_path) - 1] = '\x0'; snprintf(physical_ssi_path, sizeof(physical_images_path), "%sssi/", physical_html_path); physical_ssi_path[sizeof(physical_ssi_path) - 1] = '\x0'; } else if(!strcmp(var, "url_html_path")) { strncpy(url_html_path, val, sizeof(url_html_path)); url_html_path[sizeof(url_html_path) - 1] = '\x0'; strip(url_html_path); if(url_html_path[strlen(url_html_path) - 1] != '/' && (strlen(url_html_path) < sizeof(url_html_path) - 1)) strcat(url_html_path, "/"); snprintf(url_docs_path, sizeof(url_docs_path), "%sdocs/", url_html_path); url_docs_path[sizeof(url_docs_path) - 1] = '\x0'; snprintf(url_context_help_path, sizeof(url_context_help_path), "%scontexthelp/", url_html_path); url_context_help_path[sizeof(url_context_help_path) - 1] = '\x0'; snprintf(url_images_path, sizeof(url_images_path), "%simages/", url_html_path); url_images_path[sizeof(url_images_path) - 1] = '\x0'; snprintf(url_logo_images_path, sizeof(url_logo_images_path), "%slogos/", url_images_path); url_logo_images_path[sizeof(url_logo_images_path) - 1] = '\x0'; snprintf(url_stylesheets_path, sizeof(url_stylesheets_path), "%sstylesheets/", url_html_path); url_stylesheets_path[sizeof(url_stylesheets_path) - 1] = '\x0'; snprintf(url_media_path, sizeof(url_media_path), "%smedia/", url_html_path); url_media_path[sizeof(url_media_path) - 1] = '\x0'; /* added JS directory 2/1/2012 -MG */ snprintf(url_js_path, sizeof(url_js_path), "%sjs/", url_html_path); url_js_path[sizeof(url_js_path) - 1] = '\x0'; } else if(!strcmp(var, "service_critical_sound")) service_critical_sound = strdup(val); else if(!strcmp(var, "service_warning_sound")) service_warning_sound = strdup(val); else if(!strcmp(var, "service_unknown_sound")) service_unknown_sound = strdup(val); else if(!strcmp(var, "host_down_sound")) host_down_sound = strdup(val); else if(!strcmp(var, "host_unreachable_sound")) host_unreachable_sound = strdup(val); else if(!strcmp(var, "normal_sound")) normal_sound = strdup(val); else if(!strcmp(var, "statusmap_background_image")) statusmap_background_image = strdup(val); else if(!strcmp(var, "color_transparency_index_r")) color_transparency_index_r = atoi(val); else if(!strcmp(var, "color_transparency_index_g")) color_transparency_index_g = atoi(val); else if(!strcmp(var, "color_transparency_index_b")) color_transparency_index_b = atoi(val); else if(!strcmp(var, "default_statusmap_layout")) default_statusmap_layout_method = atoi(val); else if(!strcmp(var, "default_statuswrl_layout")) default_statuswrl_layout_method = atoi(val); else if(!strcmp(var, "statuswrl_include")) statuswrl_include = strdup(val); else if(!strcmp(var, "ping_syntax")) ping_syntax = strdup(val); else if(!strcmp(var, "action_url_target")) action_url_target = strdup(val); else if(!strcmp(var, "illegal_macro_output_chars")) illegal_output_chars = strdup(val); else if(!strcmp(var, "notes_url_target")) notes_url_target = strdup(val); else if(!strcmp(var, "enable_splunk_integration")) enable_splunk_integration = (atoi(val) > 0) ? TRUE : FALSE; else if(!strcmp(var, "splunk_url")) splunk_url = strdup(val); else if(!strcmp(var, "escape_html_tags")) escape_html_tags = (atoi(val) > 0) ? TRUE : FALSE; else if(!strcmp(var, "lock_author_names")) lock_author_names = (atoi(val) > 0) ? TRUE : FALSE; else if(!strcmp(var, "use_ssl_authentication")) use_ssl_authentication = (atoi(val) > 0) ? TRUE : FALSE; else if(!strcmp(var, "navbar_search_addresses")) navbar_search_addresses = (atoi(val) > 0) ? TRUE : FALSE; else if(!strcmp(var, "navbar_search_aliases")) navbar_search_aliases = (atoi(val) > 0) ? TRUE : FALSE; else if(!strcmp(var, "ack_no_sticky")) ack_no_sticky = (atoi(val) > 0) ? TRUE : FALSE; else if(!strcmp(var, "ack_no_send")) ack_no_send = (atoi(val) > 0) ? TRUE : FALSE; else if(!strcmp(var, "tac_cgi_hard_only")) tac_cgi_hard_only = (atoi(val) > 0) ? TRUE : FALSE; } for(p = illegal_output_chars; p && *p; p++) illegal_output_char_map[(int)*p] = 1; /* free memory and close the file */ free(input); mmap_fclose(thefile); if(!strcmp(main_config_file, "")) return ERROR; else return OK; } /* read the main configuration file */ int read_main_config_file(const char *filename) { char *input = NULL; char *temp_buffer; mmapfile *thefile; config_file_dir = nspath_absolute_dirname(filename, NULL); if((thefile = mmap_fopen(filename)) == NULL) return ERROR; while(1) { /* free memory */ free(input); /* read the next line */ if((input = mmap_fgets_multiline(thefile)) == NULL) break; strip(input); if(strstr(input, "interval_length=") == input) { temp_buffer = strtok(input, "="); temp_buffer = strtok(NULL, "\x0"); interval_length = (temp_buffer == NULL) ? 60 : atoi(temp_buffer); } else if(strstr(input, "log_file=") == input) { temp_buffer = strtok(input, "="); temp_buffer = strtok(NULL, "\x0"); strncpy(log_file, (temp_buffer == NULL) ? "" : nspath_absolute(temp_buffer, config_file_dir),sizeof(log_file) - 1); log_file[sizeof(log_file) - 1] = '\x0'; strip(log_file); } else if(strstr(input, "object_cache_file=") == input) { temp_buffer = strtok(input, "="); temp_buffer = strtok(NULL, "\x0"); object_cache_file = nspath_absolute(temp_buffer, config_file_dir); } else if(strstr(input, "status_file=") == input) { temp_buffer = strtok(input, "="); temp_buffer = strtok(NULL, "\x0"); status_file = nspath_absolute(temp_buffer, config_file_dir); } else if(strstr(input, "log_archive_path=") == input) { temp_buffer = strtok(input, "="); temp_buffer = strtok(NULL, "\n"); strncpy(log_archive_path, (temp_buffer == NULL) ? "" : temp_buffer, sizeof(log_archive_path)); log_archive_path[sizeof(log_archive_path) - 1] = '\x0'; strip(physical_html_path); if(log_archive_path[strlen(log_archive_path) - 1] != '/' && (strlen(log_archive_path) < sizeof(log_archive_path) - 1)) strcat(log_archive_path, "/"); } else if(strstr(input, "log_rotation_method=") == input) { temp_buffer = strtok(input, "="); temp_buffer = strtok(NULL, "\x0"); if(temp_buffer == NULL) log_rotation_method = LOG_ROTATION_NONE; else if(!strcmp(temp_buffer, "h")) log_rotation_method = LOG_ROTATION_HOURLY; else if(!strcmp(temp_buffer, "d")) log_rotation_method = LOG_ROTATION_DAILY; else if(!strcmp(temp_buffer, "w")) log_rotation_method = LOG_ROTATION_WEEKLY; else if(!strcmp(temp_buffer, "m")) log_rotation_method = LOG_ROTATION_MONTHLY; } else if(strstr(input, "command_file=") == input) { temp_buffer = strtok(input, "="); temp_buffer = strtok(NULL, "\x0"); strncpy(command_file, (temp_buffer == NULL) ? "" : temp_buffer, sizeof(command_file)); command_file[sizeof(command_file) - 1] = '\x0'; strip(command_file); } else if(strstr(input, "check_external_commands=") == input) { temp_buffer = strtok(input, "="); temp_buffer = strtok(NULL, "\x0"); check_external_commands = (temp_buffer == NULL) ? 0 : atoi(temp_buffer); } else if(strstr(input, "date_format=") == input) { temp_buffer = strtok(input, "="); temp_buffer = strtok(NULL, "\x0"); if(temp_buffer == NULL) date_format = DATE_FORMAT_US; else if(!strcmp(temp_buffer, "euro")) date_format = DATE_FORMAT_EURO; else if(!strcmp(temp_buffer, "iso8601")) date_format = DATE_FORMAT_ISO8601; else if(!strcmp(temp_buffer, "strict-iso8601")) date_format = DATE_FORMAT_STRICT_ISO8601; else date_format = DATE_FORMAT_US; } } /* free memory and close the file */ free(input); mmap_fclose(thefile); return OK; } /* read all object definitions */ int read_all_object_configuration_data(const char *cfgfile, int options) { int result = OK; host *temp_host = NULL; host *parent_host = NULL; hostsmember *temp_hostsmember = NULL; service *temp_service = NULL; service *parent_service = NULL; servicesmember *temp_servicesmember = NULL; /* read in all external config data of the desired type(s) */ result = read_object_config_data(cfgfile, options); /* Resolve objects in the host object */ for(temp_host = host_list; temp_host != NULL; temp_host = temp_host->next) { /* Find the command object for the check command */ temp_host->check_command_ptr = find_bang_command(temp_host->check_command); /* Find the command object for the event handler */ temp_host->event_handler_ptr = find_bang_command(temp_host->event_handler); /* Resolve host child->parent relationships */ for(temp_hostsmember = temp_host->parent_hosts; temp_hostsmember != NULL; temp_hostsmember = temp_hostsmember->next) { if((parent_host = find_host(temp_hostsmember->host_name)) == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: '%s' is not a valid parent for host '%s'!", temp_hostsmember->host_name, temp_host->name); } /* save the parent host pointer for later */ temp_hostsmember->host_ptr = parent_host; /* add a reverse (child) link to make searches faster later on */ if(add_child_link_to_host(parent_host, temp_host) == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Failed to add '%s' as a child host of '%s'", temp_host->name, parent_host->name); } } } /* Resolve objects in the service object */ for(temp_service = service_list; temp_service != NULL; temp_service = temp_service->next) { /* Find the command object for the check command */ temp_service->check_command_ptr = find_bang_command(temp_service->check_command); /* Find the command object for the event handler */ temp_service->event_handler_ptr = find_bang_command(temp_service->event_handler); /* Resolve service child->parent relationships */ for(temp_servicesmember = temp_service->parents; temp_servicesmember != NULL; temp_servicesmember = temp_servicesmember->next) { /* Find the parent service */ if((parent_service = find_service(temp_servicesmember->host_name, temp_servicesmember->service_description)) == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: '%s:%s' is not a valid parent for service '%s:%s'!", temp_servicesmember->host_name, temp_servicesmember->service_description, temp_service->host_name, temp_service->description); } /* add a reverse (child) link to make searches faster later on */ if(add_child_link_to_service(parent_service, temp_service) == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Failed to add '%s:%s' as a child service of '%s:%s'", temp_service->host_name, temp_service->description, parent_service->host_name, parent_service->description); } } } return result; } /* read all status data */ int read_all_status_data(const char *status_file_name, int options) { int result = OK; /* don't duplicate things we've already read in */ if(program_status_has_been_read == TRUE && (options & READ_PROGRAM_STATUS)) options -= READ_PROGRAM_STATUS; if(host_status_has_been_read == TRUE && (options & READ_HOST_STATUS)) options -= READ_HOST_STATUS; if(service_status_has_been_read == TRUE && (options & READ_SERVICE_STATUS)) options -= READ_SERVICE_STATUS; /* bail out if we've already read what we need */ if(options <= 0) return OK; /* Initialize the downtime data */ initialize_downtime_data(); /* read in all external status data */ result = read_status_data(status_file_name, options); /* mark what items we've read in... */ if(options & READ_PROGRAM_STATUS) program_status_has_been_read = TRUE; if(options & READ_HOST_STATUS) host_status_has_been_read = TRUE; if(options & READ_SERVICE_STATUS) service_status_has_been_read = TRUE; return result; } void cgi_init(void (*doc_header)(int), void (*doc_footer)(void), int object_options, int status_options) { int result; /* Initialize shared configuration variables */ init_shared_cfg_vars(1); /* read the CGI configuration file */ result = read_cgi_config_file(get_cgi_config_location()); if(result == ERROR) { doc_header(FALSE); cgi_config_file_error(get_cgi_config_location()); doc_footer(); exit(EXIT_FAILURE); } /* read the main configuration file */ result = read_main_config_file(main_config_file); if(result == ERROR) { doc_header(FALSE); main_config_file_error(main_config_file); doc_footer(); exit(EXIT_FAILURE); } /* read all object configuration data */ result = read_all_object_configuration_data(main_config_file, object_options); if(result == ERROR) { doc_header(FALSE); object_data_error(); doc_footer(); exit(EXIT_FAILURE); } /* read all status data */ result = read_all_status_data(status_file, status_options); if(result == ERROR) { doc_header(FALSE); status_data_error(); doc_footer(); free_memory(); exit(EXIT_FAILURE); } } /********************************************************** ******************* LIFO FUNCTIONS *********************** **********************************************************/ /* reads contents of file into the lifo struct */ int read_file_into_lifo(char *filename) { char *input = NULL; mmapfile *thefile; int lifo_result; if((thefile = mmap_fopen(filename)) == NULL) return LIFO_ERROR_FILE; while(1) { free(input); if((input = mmap_fgets(thefile)) == NULL) break; lifo_result = push_lifo(input); if(lifo_result != LIFO_OK) { free_lifo_memory(); free(input); mmap_fclose(thefile); return lifo_result; } } mmap_fclose(thefile); return LIFO_OK; } /* frees all memory allocated to lifo */ void free_lifo_memory(void) { lifo *temp_lifo; lifo *next_lifo; if(lifo_list == NULL) return; temp_lifo = lifo_list; while(temp_lifo != NULL) { next_lifo = temp_lifo->next; if(temp_lifo->data != NULL) free((void *)temp_lifo->data); free((void *)temp_lifo); temp_lifo = next_lifo; } return; } /* adds an item to lifo */ int push_lifo(char *buffer) { lifo *temp_lifo; temp_lifo = (lifo *)malloc(sizeof(lifo)); if(temp_lifo == NULL) return LIFO_ERROR_MEMORY; if(buffer == NULL) temp_lifo->data = (char *)strdup(""); else temp_lifo->data = (char *)strdup(buffer); if(temp_lifo->data == NULL) { free(temp_lifo); return LIFO_ERROR_MEMORY; } /* add item to front of lifo... */ temp_lifo->next = lifo_list; lifo_list = temp_lifo; return LIFO_OK; } /* returns/clears an item from lifo */ char *pop_lifo(void) { lifo *temp_lifo; char *buf; if(lifo_list == NULL || lifo_list->data == NULL) return NULL; buf = strdup(lifo_list->data); temp_lifo = lifo_list->next; if(lifo_list->data != NULL) free((void *)lifo_list->data); free((void *)lifo_list); lifo_list = temp_lifo; return buf; } /********************************************************** *************** MISC UTILITY FUNCTIONS ******************* **********************************************************/ /* unescapes newlines in a string */ char *unescape_newlines(char *rawbuf) { register int x, y; for(x = 0, y = 0; rawbuf[x] != (char)'\x0'; x++) { if(rawbuf[x] == '\\') { /* unescape newlines */ if(rawbuf[x + 1] == 'n') { rawbuf[y++] = '\n'; x++; } /* unescape backslashes and other stuff */ else if(rawbuf[x + 1] != '\x0') { rawbuf[y++] = rawbuf[x + 1]; x++; } } else rawbuf[y++] = rawbuf[x]; } rawbuf[y] = '\x0'; return rawbuf; } /* strips HTML and bad stuff from plugin output */ void sanitize_plugin_output(char *buffer) { int x = 0; int y = 0; int in_html = FALSE; char *new_buffer; if(buffer == NULL) return; new_buffer = strdup(buffer); if(new_buffer == NULL) return; /* check each character */ for(x = 0, y = 0; buffer[x] != '\x0'; x++) { /* we just started an HTML tag */ if(buffer[x] == '<') { in_html = TRUE; continue; } /* end of an HTML tag */ else if(buffer[x] == '>') { in_html = FALSE; continue; } /* skip everything inside HTML tags */ else if(in_html == TRUE) continue; /* strip single and double quotes */ else if(buffer[x] == '\'' || buffer[x] == '\"') new_buffer[y++] = ' '; /* strip semicolons (replace with colons) */ else if(buffer[x] == ';') new_buffer[y++] = ':'; /* strip pipe and ampersand */ else if(buffer[x] == '&' || buffer[x] == '|') new_buffer[y++] = ' '; /* normal character */ else new_buffer[y++] = buffer[x]; } /* terminate sanitized buffer */ new_buffer[y++] = '\x0'; /* copy the sanitized buffer back to the original */ strcpy(buffer, new_buffer); /* free memory allocated to the new buffer */ free(new_buffer); return; } /* get date/time string */ void get_time_string(time_t *raw_time, char *buffer, int buffer_length, int type) { time_t t; struct tm *tm_ptr = NULL; int hour = 0; int minute = 0; int second = 0; int month = 0; int day = 0; int year = 0; const char *weekdays[7] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; const char *months[12] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; const char *tzone = ""; if(raw_time == NULL) time(&t); else t = *raw_time; if(type == HTTP_DATE_TIME) tm_ptr = gmtime(&t); else tm_ptr = localtime(&t); hour = tm_ptr->tm_hour; minute = tm_ptr->tm_min; second = tm_ptr->tm_sec; month = tm_ptr->tm_mon + 1; day = tm_ptr->tm_mday; year = tm_ptr->tm_year + 1900; #ifdef HAVE_TM_ZONE tzone = (char *)tm_ptr->tm_zone; #else tzone = (tm_ptr->tm_isdst) ? tzname[1] : tzname[0]; #endif /* ctime() style */ if(type == LONG_DATE_TIME) snprintf(buffer, buffer_length, "%s %s %d %02d:%02d:%02d %s %d", weekdays[tm_ptr->tm_wday], months[tm_ptr->tm_mon], day, hour, minute, second, tzone, year); /* short style */ else if(type == SHORT_DATE_TIME) { if(date_format == DATE_FORMAT_EURO) snprintf(buffer, buffer_length, "%02d-%02d-%04d %02d:%02d:%02d", tm_ptr->tm_mday, tm_ptr->tm_mon + 1, tm_ptr->tm_year + 1900, tm_ptr->tm_hour, tm_ptr->tm_min, tm_ptr->tm_sec); else if(date_format == DATE_FORMAT_ISO8601 || date_format == DATE_FORMAT_STRICT_ISO8601) snprintf(buffer, buffer_length, "%04d-%02d-%02d%c%02d:%02d:%02d", tm_ptr->tm_year + 1900, tm_ptr->tm_mon + 1, tm_ptr->tm_mday, (date_format == DATE_FORMAT_STRICT_ISO8601) ? 'T' : ' ', tm_ptr->tm_hour, tm_ptr->tm_min, tm_ptr->tm_sec); else snprintf(buffer, buffer_length, "%02d-%02d-%04d %02d:%02d:%02d", tm_ptr->tm_mon + 1, tm_ptr->tm_mday, tm_ptr->tm_year + 1900, tm_ptr->tm_hour, tm_ptr->tm_min, tm_ptr->tm_sec); } /* short date */ else if(type == SHORT_DATE) { if(date_format == DATE_FORMAT_EURO) snprintf(buffer, buffer_length, "%02d-%02d-%04d", day, month, year); else if(date_format == DATE_FORMAT_ISO8601 || date_format == DATE_FORMAT_STRICT_ISO8601) snprintf(buffer, buffer_length, "%04d-%02d-%02d", year, month, day); else snprintf(buffer, buffer_length, "%02d-%02d-%04d", month, day, year); } /* expiration date/time for HTTP headers */ else if(type == HTTP_DATE_TIME) snprintf(buffer, buffer_length, "%s, %02d %s %d %02d:%02d:%02d GMT", weekdays[tm_ptr->tm_wday], day, months[tm_ptr->tm_mon], year, hour, minute, second); /* short time */ else snprintf(buffer, buffer_length, "%02d:%02d:%02d", hour, minute, second); buffer[buffer_length - 1] = '\x0'; return; } /* get time string for an interval of time */ void get_interval_time_string(double time_units, char *buffer, int buffer_length) { unsigned long total_seconds; int hours = 0; int minutes = 0; int seconds = 0; total_seconds = (unsigned long)(time_units * interval_length); hours = (int)total_seconds / 3600; total_seconds %= 3600; minutes = (int)total_seconds / 60; total_seconds %= 60; seconds = (int)total_seconds; snprintf(buffer, buffer_length, "%dh %dm %ds", hours, minutes, seconds); buffer[buffer_length - 1] = '\x0'; return; } /* encodes a string in proper URL format */ const char *url_encode(const char *input) { int len, output_len; int x, y; char temp_expansion[4]; static int i = 0; char* str = encoded_url_string[i]; /* initialize return string */ strcpy(str, ""); if(input == NULL) return str; len = (int)strlen(input); output_len = (int)sizeof(encoded_url_string[i]); str[0] = '\x0'; for(x = 0, y = 0; x <= len && y < output_len - 1; x++) { /* end of string */ if((char)input[x] == (char)'\x0') { str[y] = '\x0'; break; } /* alpha-numeric characters and a few other characters don't get encoded */ else if(((char)input[x] >= '0' && (char)input[x] <= '9') || ((char)input[x] >= 'A' && (char)input[x] <= 'Z') || ((char)input[x] >= (char)'a' && (char)input[x] <= (char)'z') || (char)input[x] == (char)'.' || (char)input[x] == (char)'-' || (char)input[x] == (char)'_') { str[y] = input[x]; y++; } /* spaces are pluses */ else if(input[x] == ' ') { str[y] = '+'; y++; } /* anything else gets represented by its hex value */ else { str[y] = '\x0'; if((int)strlen(str) < (output_len - 3)) { sprintf(temp_expansion, "%%%02X", (unsigned int)(input[x] & 0xFF)); strcat(str, temp_expansion); y += 3; } } } str[sizeof(encoded_url_string[i]) - 1] = '\x0'; i = !i; return str; } static inline char* encode_character(char in, char *outcp, int output_max) { char *entity = NULL; int rep_lth, out_len = outcp - encoded_html_string; switch(in) { case '&': entity = "&"; break; case '"': entity = """; break; case '\'': entity = "'"; break; case '<': entity = "<"; break; case '>': entity = ">"; break; } if (entity) { rep_lth = strlen(entity); if (out_len + rep_lth < output_max) { strcpy(outcp, entity); outcp += rep_lth; } return outcp; } if (out_len + 6 >= output_max) return outcp; sprintf(outcp, "&#%u", (unsigned int)in); outcp += strlen(outcp); return outcp; } #define WHERE_OUTSIDE_TAG 0 /* Not in an HTML tag */ #define WHERE_IN_TAG_NAME 1 /* In HTML tag name (either opening or closing tag) */ #define WHERE_IN_TAG_OUTSIDE_ATTRIBUTE 2 /* In HTML tag, but before or after an attribute. Should be <, > or space */ #define WHERE_IN_TAG_IN_ATTRIBUTE_NAME 3 /* In the attribute name */ #define WHERE_IN_TAG_AT_EQUALS 4 /* At the equals sign between the attribute name and value */ #define WHERE_IN_TAG_IN_ATTRIBUTE_VALUE 5 /* In the attribute value */ #define WHERE_IN_COMMENT 6 /* In an HTML comment */ /* escapes a string used in HTML */ char * html_encode(char *input, int escape_newlines) { int len; int output_max; char *incp, *outcp; char *tagname = ""; int x; int where_in_tag = WHERE_OUTSIDE_TAG; /* Location in HTML tag */ wchar_t attr_value_start = (wchar_t)0; /* character that starts the attribute value */ int tag_depth = 0; /* depth of nested HTML tags */ /* we need up to six times the space to do the conversion */ len = (int)strlen(input); output_max = len * 6; if(( outcp = encoded_html_string = (char *)malloc(output_max + 1)) == NULL) return ""; strcpy(encoded_html_string, ""); /* Process all converted characters */ for (x = 0, incp = input; x < len && *incp; x++, incp++) { /* Most ASCII characters don't get encoded */ if (*incp >= 0x20 && *incp <= 0x7e && !strchr("'\"&^<>", *incp)) { *outcp++ = *incp; switch(where_in_tag) { case WHERE_IN_TAG_NAME: switch(*incp) { case 0x20: where_in_tag = WHERE_IN_TAG_OUTSIDE_ATTRIBUTE; *incp = 0; break; case '!': where_in_tag = WHERE_IN_COMMENT; break; } break; case WHERE_IN_TAG_OUTSIDE_ATTRIBUTE: if(*incp != 0x20) where_in_tag = WHERE_IN_TAG_IN_ATTRIBUTE_NAME; break; case WHERE_IN_TAG_IN_ATTRIBUTE_NAME: if(*incp == '=') where_in_tag = WHERE_IN_TAG_AT_EQUALS; break; case WHERE_IN_TAG_AT_EQUALS: if(*incp != 0x20) { attr_value_start = *incp; where_in_tag = WHERE_IN_TAG_IN_ATTRIBUTE_VALUE; } break; case WHERE_IN_TAG_IN_ATTRIBUTE_VALUE: if((*incp == 0x20) && (attr_value_start != '"') && (attr_value_start != '\'')) where_in_tag = WHERE_IN_TAG_OUTSIDE_ATTRIBUTE; break; } } /* Special handling for quotes */ else if(escape_html_tags == FALSE && (*incp == '"' || *incp == '\'')) { switch(where_in_tag) { case WHERE_OUTSIDE_TAG: if (tag_depth > 0) *outcp++ = *incp; else outcp = encode_character(*incp, outcp, output_max); break; case WHERE_IN_COMMENT: *outcp++ = *incp; break; case WHERE_IN_TAG_AT_EQUALS: *outcp++ = *incp; attr_value_start = *incp; where_in_tag = WHERE_IN_TAG_IN_ATTRIBUTE_VALUE; break; case WHERE_IN_TAG_IN_ATTRIBUTE_VALUE: if(*(incp-1) == '\\') /* This covers the case where the quote is backslash escaped. */ *outcp++ = *incp; else if(attr_value_start == *incp) { /* If the quote is the same type of quote that started the attribute value and it is not backslash escaped, it signals the end of the attribute value */ *outcp++ = *incp; where_in_tag = WHERE_IN_TAG_OUTSIDE_ATTRIBUTE; } else /* If we encounter an quote that did not start the attribute value and is not backslash escaped, use it as is */ *outcp++ = *incp; break; default: if (tag_depth > 0 && !strcmp(tagname, "script")) *outcp++ = *incp; else outcp = encode_character(*incp, outcp, output_max); break; } } /* newlines turn to
    tags */ else if(escape_newlines == TRUE && *incp == '\n') { strncpy( outcp, "
    ", 4); outcp += 4; } else if(escape_newlines == TRUE && *incp == '\\' && *(incp + 1) == '\n') { strncpy( outcp, "
    ", 4); outcp += 4; incp++; /* needed so loop skips two characters */ } /* TODO - strip all but allowed HTML tags out... */ else if (*incp == '<' && escape_html_tags == FALSE) { switch(where_in_tag) { case WHERE_OUTSIDE_TAG: *outcp++ = *incp; where_in_tag = WHERE_IN_TAG_NAME; switch(*(incp+1)) { case '/': tag_depth--; break; case '!': break; default: tag_depth++; tagname = incp + 1; break; } break; default: if (tag_depth > 0 && !strcmp(tagname, "script")) *outcp++ = *incp; else outcp = encode_character(*incp, outcp, output_max); break; } } else if( *incp == '>' && escape_html_tags == FALSE) { switch(where_in_tag) { case WHERE_IN_TAG_NAME: case WHERE_IN_TAG_OUTSIDE_ATTRIBUTE: case WHERE_IN_COMMENT: case WHERE_IN_TAG_IN_ATTRIBUTE_NAME: *outcp++ = *incp; where_in_tag = WHERE_OUTSIDE_TAG; *incp = 0; break; case WHERE_IN_TAG_IN_ATTRIBUTE_VALUE: if((attr_value_start != '"') && (attr_value_start != '\'')) { *outcp++ = *incp; where_in_tag = WHERE_OUTSIDE_TAG; } else outcp = encode_character(*incp, outcp, output_max); break; default: if (tag_depth > 0 && !strcmp(tagname, "script")) *outcp++ = *incp; else outcp = encode_character(*incp, outcp, output_max); break; } } /* check_multi puts out a '&ndash' so don't encode the '&' in that case */ else if (*incp == '&' && escape_html_tags == FALSE) { if (tag_depth > 0 && !strcmp(incp, "&ndash")) *outcp++ = *incp; else outcp = encode_character(*incp, outcp, output_max); } else if ((unsigned char)*incp > 0x7f) /* pass through UTF-8 characters */ *outcp++ = *incp; /* for simplicity, all other chars represented by their numeric value */ else outcp = encode_character(*incp, outcp, output_max); } /* Null terminate the encoded string */ *outcp = '\x0'; encoded_html_string[ output_max - 1] = '\x0'; return encoded_html_string; } /* strip > and < from string */ void strip_html_brackets(char *buffer) { register int x; register int y; register int z; if(buffer == NULL || buffer[0] == '\x0') return; /* remove all occurrences in string */ z = (int)strlen(buffer); for(x = 0, y = 0; x < z; x++) { if(buffer[x] == '<' || buffer[x] == '>') continue; buffer[y++] = buffer[x]; } buffer[y++] = '\x0'; return; } /* escape string for html form usage */ char *escape_string(const char *input) { int len; int output_max; wchar_t wctemp[1]; size_t mbtowc_result; char mbtemp[ 10]; int wctomb_result; char *stp; char temp_expansion[11]; /* If they don't give us anything to do... */ if( NULL == input) { return ""; } /* We need up to six times the space to do the conversion */ len = (int)strlen(input); output_max = len * 6; if(( stp = encoded_html_string = (char *)malloc(output_max + 1)) == NULL) return ""; strcpy(encoded_html_string, ""); /* Get the first multibyte character in the input string */ mbtowc_result = mbtowc( wctemp, input, MB_CUR_MAX); /* Process all characters until a null character is found */ while( 0 != mbtowc_result) { /* 0 indicates a null character was found */ if(( size_t)-2 == mbtowc_result) { /* No complete multibyte character found - try at next memory address */ input++; } else if((( size_t)-1 == mbtowc_result) && ( EILSEQ == errno)) { /* Invalid multibyte character found - try at next memory address */ input++; } /* Alpha-numeric characters and a few other characters don't get encoded */ else if(( *wctemp >= '0' && *wctemp <= '9') || ( *wctemp >= 'A' && *wctemp <= 'Z') || ( *wctemp >= 'a' && *wctemp <= 'z') || ' ' == *wctemp || '-' == *wctemp || '.' == *wctemp || '_' == *wctemp || ':' == *wctemp) { wctomb_result = wctomb( mbtemp, wctemp[0]); if(( wctomb_result > 0) && ((( stp - encoded_html_string) + wctomb_result) < output_max)) { strncpy( stp, mbtemp, wctomb_result); stp += wctomb_result; } input += mbtowc_result; } /* Encode everything else (this may be excessive) */ else { sprintf( temp_expansion, "&#%u;", ( unsigned int)wctemp[ 0]); if((( stp - encoded_html_string) + strlen( temp_expansion)) < (unsigned int)output_max) { strncpy( stp, temp_expansion, strlen( temp_expansion)); stp += strlen( temp_expansion); } input += mbtowc_result; } /* Read the next character */ mbtowc_result = mbtowc( wctemp, input, MB_CUR_MAX); } /* Null terminate the encoded string */ *stp = '\x0'; encoded_html_string[ output_max - 1] = '\x0'; return encoded_html_string; } /* determines the log file we should use (from current time) */ void get_log_archive_to_use(int archive, char *buffer, int buffer_length) { struct tm *t; /* determine the time at which the log was rotated for this archive # */ determine_log_rotation_times(archive); /* if we're not rotating the logs or if we want the current log, use the main one... */ if(log_rotation_method == LOG_ROTATION_NONE || archive <= 0) { strncpy(buffer, log_file, buffer_length); buffer[buffer_length - 1] = '\x0'; return; } t = localtime(&this_scheduled_log_rotation); /* use the time that the log rotation occurred to figure out the name of the log file */ snprintf(buffer, buffer_length, "%snagios-%02d-%02d-%d-%02d.log", log_archive_path, t->tm_mon + 1, t->tm_mday, t->tm_year + 1900, t->tm_hour); buffer[buffer_length - 1] = '\x0'; return; } /* determines log archive to use, given a specific time */ int determine_archive_to_use_from_time(time_t target_time) { time_t current_time; int current_archive = 0; /* if log rotation is disabled, we don't have archives */ if(log_rotation_method == LOG_ROTATION_NONE) return 0; /* make sure target time is rational */ current_time = time(NULL); if(target_time >= current_time) return 0; /* backtrack through archives to find the one we need for this time */ /* start with archive of 1, subtract one when we find the right time period to compensate for current (non-rotated) log */ for(current_archive = 1;; current_archive++) { /* determine time at which the log rotation occurred for this archive number */ determine_log_rotation_times(current_archive); /* if the target time falls within the times encompassed by this archive, we have the right archive! */ if(target_time >= this_scheduled_log_rotation) return current_archive - 1; } return 0; } /* determines the log rotation times - past, present, future */ void determine_log_rotation_times(int archive) { struct tm *t; int current_month; int is_dst_now = FALSE; time_t current_time; /* negative archive numbers don't make sense */ /* if archive=0 (current log), this_scheduled_log_rotation time is set to next rotation time */ if(archive < 0) return; time(¤t_time); t = localtime(¤t_time); is_dst_now = (t->tm_isdst > 0) ? TRUE : FALSE; t->tm_min = 0; t->tm_sec = 0; switch(log_rotation_method) { case LOG_ROTATION_HOURLY: this_scheduled_log_rotation = mktime(t); this_scheduled_log_rotation = (time_t)(this_scheduled_log_rotation - ((archive - 1) * 3600)); last_scheduled_log_rotation = (time_t)(this_scheduled_log_rotation - 3600); break; case LOG_ROTATION_DAILY: t->tm_hour = 0; this_scheduled_log_rotation = mktime(t); this_scheduled_log_rotation = (time_t)(this_scheduled_log_rotation - ((archive - 1) * 86400)); last_scheduled_log_rotation = (time_t)(this_scheduled_log_rotation - 86400); break; case LOG_ROTATION_WEEKLY: t->tm_hour = 0; this_scheduled_log_rotation = mktime(t); this_scheduled_log_rotation = (time_t)(this_scheduled_log_rotation - (86400 * t->tm_wday)); this_scheduled_log_rotation = (time_t)(this_scheduled_log_rotation - ((archive - 1) * 604800)); last_scheduled_log_rotation = (time_t)(this_scheduled_log_rotation - 604800); break; case LOG_ROTATION_MONTHLY: t = localtime(¤t_time); t->tm_mon++; t->tm_mday = 1; t->tm_hour = 0; t->tm_min = 0; t->tm_sec = 0; for(current_month = 0; current_month <= archive; current_month++) { if(t->tm_mon == 0) { t->tm_mon = 11; t->tm_year--; } else t->tm_mon--; } last_scheduled_log_rotation = mktime(t); t = localtime(¤t_time); t->tm_mon++; t->tm_mday = 1; t->tm_hour = 0; t->tm_min = 0; t->tm_sec = 0; for(current_month = 0; current_month < archive; current_month++) { if(t->tm_mon == 0) { t->tm_mon = 11; t->tm_year--; } else t->tm_mon--; } this_scheduled_log_rotation = mktime(t); break; default: break; } /* adjust this rotation time for daylight savings time */ t = localtime(&this_scheduled_log_rotation); if(t->tm_isdst > 0 && is_dst_now == FALSE) this_scheduled_log_rotation = (time_t)(this_scheduled_log_rotation - 3600); else if(t->tm_isdst == 0 && is_dst_now == TRUE) this_scheduled_log_rotation = (time_t)(this_scheduled_log_rotation + 3600); /* adjust last rotation time for daylight savings time */ t = localtime(&last_scheduled_log_rotation); if(t->tm_isdst > 0 && is_dst_now == FALSE) last_scheduled_log_rotation = (time_t)(last_scheduled_log_rotation - 3600); else if(t->tm_isdst == 0 && is_dst_now == TRUE) last_scheduled_log_rotation = (time_t)(last_scheduled_log_rotation + 3600); return; } /********************************************************** *************** COMMON HTML FUNCTIONS ******************** **********************************************************/ void display_info_table(const char *title, int refresh, authdata *current_authdata) { time_t current_time; char date_time[MAX_DATETIME_LENGTH]; int result; /* read program status */ result = read_all_status_data(status_file, READ_PROGRAM_STATUS); printf("\n"); printf("\n"); printf("
    \n"); printf("
    %s
    \n", title); time(¤t_time); get_time_string(¤t_time, date_time, (int)sizeof(date_time), LONG_DATE_TIME); printf("Last Updated: %s
    \n", date_time); if(refresh == TRUE) printf("Updated every %d seconds
    \n", refresh_rate); printf("Nagios® Core™ %s - www.nagios.org
    \n", PROGRAM_VERSION); if(current_authdata != NULL) printf("Logged in as %s
    \n", (!strcmp(current_authdata->username, "")) ? "?" : current_authdata->username); if(nagios_process_state != STATE_OK) printf("
    Warning: Monitoring process may not be running!
    Click here for more info.
    ", EXTINFO_CGI, DISPLAY_PROCESS_INFO); if(result == ERROR) printf("
    Warning: Could not read program status information!
    "); else { if(enable_notifications == FALSE) printf("
    - Notifications are disabled
    "); if(execute_service_checks == FALSE) printf("
    - Service checks are disabled
    "); } printf("
    \n"); return; } void display_nav_table(char *url, int archive) { char date_time[MAX_DATETIME_LENGTH]; char archive_file[MAX_INPUT_BUFFER]; char *archive_basename; if(log_rotation_method != LOG_ROTATION_NONE) { printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); if(archive != 0) { printf("\n"); } else printf("\n", url_images_path, EMPTY_ICON); printf("\n"); printf("\n"); } /* get archive to use */ get_log_archive_to_use(archive, archive_file, sizeof(archive_file) - 1); /* cut the pathname for security, and the remaining slash for clarity */ archive_basename = (char *)&archive_file; if(strrchr((char *)&archive_basename, '/') != NULL) archive_basename = strrchr((char *)&archive_file, '/') + 1; /* now it's safe to print the filename */ printf("
    \n", archive_basename); return; } /* prints the additional notes or action url for a hostgroup (with macros substituted) */ void print_extra_hostgroup_url(char *group_name, char *url) { char input_buffer[MAX_INPUT_BUFFER] = ""; char output_buffer[MAX_INPUT_BUFFER] = ""; char *temp_buffer; int in_macro = FALSE; hostgroup *temp_hostgroup = NULL; if(group_name == NULL || url == NULL) return; temp_hostgroup = find_hostgroup(group_name); if(temp_hostgroup == NULL) { printf("%s", url); return; } strncpy(input_buffer, url, sizeof(input_buffer) - 1); input_buffer[sizeof(input_buffer) - 1] = '\x0'; for(temp_buffer = my_strtok(input_buffer, "$"); temp_buffer != NULL; temp_buffer = my_strtok(NULL, "$")) { if(in_macro == FALSE) { if(strlen(output_buffer) + strlen(temp_buffer) < sizeof(output_buffer) - 1) { strncat(output_buffer, temp_buffer, sizeof(output_buffer) - strlen(output_buffer) - 1); output_buffer[sizeof(output_buffer) - 1] = '\x0'; } in_macro = TRUE; } else { if(strlen(output_buffer) + strlen(temp_buffer) < sizeof(output_buffer) - 1) { if(!strcmp(temp_buffer, "HOSTGROUPNAME")) strncat(output_buffer, url_encode(temp_hostgroup->group_name), sizeof(output_buffer) - strlen(output_buffer) - 1); } in_macro = FALSE; } } printf("%s", output_buffer); return; } /* prints the additional notes or action url for a servicegroup (with macros substituted) */ void print_extra_servicegroup_url(char *group_name, char *url) { char input_buffer[MAX_INPUT_BUFFER] = ""; char output_buffer[MAX_INPUT_BUFFER] = ""; char *temp_buffer; int in_macro = FALSE; servicegroup *temp_servicegroup = NULL; if(group_name == NULL || url == NULL) return; temp_servicegroup = find_servicegroup(group_name); if(temp_servicegroup == NULL) { printf("%s", url); return; } strncpy(input_buffer, url, sizeof(input_buffer) - 1); input_buffer[sizeof(input_buffer) - 1] = '\x0'; for(temp_buffer = my_strtok(input_buffer, "$"); temp_buffer != NULL; temp_buffer = my_strtok(NULL, "$")) { if(in_macro == FALSE) { if(strlen(output_buffer) + strlen(temp_buffer) < sizeof(output_buffer) - 1) { strncat(output_buffer, temp_buffer, sizeof(output_buffer) - strlen(output_buffer) - 1); output_buffer[sizeof(output_buffer) - 1] = '\x0'; } in_macro = TRUE; } else { if(strlen(output_buffer) + strlen(temp_buffer) < sizeof(output_buffer) - 1) { if(!strcmp(temp_buffer, "SERVICEGROUPNAME")) strncat(output_buffer, url_encode(temp_servicegroup->group_name), sizeof(output_buffer) - strlen(output_buffer) - 1); } in_macro = FALSE; } } printf("%s", output_buffer); return; } /* include user-defined SSI footers or headers */ void include_ssi_files(const char *cgi_name, int type) { char common_ssi_file[MAX_INPUT_BUFFER]; char cgi_ssi_file[MAX_INPUT_BUFFER]; char raw_cgi_name[MAX_INPUT_BUFFER]; char *stripped_cgi_name; /* common header or footer */ snprintf(common_ssi_file, sizeof(common_ssi_file) - 1, "%scommon-%s.ssi", physical_ssi_path, (type == SSI_HEADER) ? "header" : "footer"); common_ssi_file[sizeof(common_ssi_file) - 1] = '\x0'; /* CGI-specific header or footer */ strncpy(raw_cgi_name, cgi_name, sizeof(raw_cgi_name) - 1); raw_cgi_name[sizeof(raw_cgi_name) - 1] = '\x0'; stripped_cgi_name = strtok(raw_cgi_name, "."); snprintf(cgi_ssi_file, sizeof(cgi_ssi_file) - 1, "%s%s-%s.ssi", physical_ssi_path, (stripped_cgi_name == NULL) ? "" : stripped_cgi_name, (type == SSI_HEADER) ? "header" : "footer"); cgi_ssi_file[sizeof(cgi_ssi_file) - 1] = '\x0'; if(type == SSI_HEADER) { printf("\n\n"); include_ssi_file(common_ssi_file); include_ssi_file(cgi_ssi_file); } else { include_ssi_file(cgi_ssi_file); include_ssi_file(common_ssi_file); printf("\n\n"); } return; } /* include user-defined SSI footer or header */ void include_ssi_file(const char *filename) { char buffer[MAX_INPUT_BUFFER]; FILE *fp; struct stat stat_result; int call_return; /* if file is executable, we want to run it rather than print it */ call_return = stat(filename, &stat_result); /* file is executable */ if(call_return == 0 && (stat_result.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) { /* must flush output stream first so that output from script shows up in correct place. Other choice is to open program under pipe and copy the data from the program to our output stream. */ fflush(stdout); /* ignore return status from system call. */ call_return = system(filename); return; } /* an error occurred trying to stat() the file */ else if(call_return != 0) { /* Handle error conditions. Assume that standard posix error codes and errno are available. If not, comment this section out. */ switch(errno) { case ENOTDIR: /* - A component of the path is not a directory. */ case ELOOP: /* Too many symbolic links encountered while traversing the path. */ case EFAULT: /* Bad address. */ case ENOMEM: /* Out of memory (i.e. kernel memory). */ case ENAMETOOLONG: /* File name too long. */ printf("
    A stat call returned %d while looking for the file %s.
    ", errno, filename); return; case EACCES: /* Permission denied. -- The file should be accessible by nagios. */ printf("
    A stat call returned a permissions error(%d) while looking for the file %s.
    ", errno, filename); return; case ENOENT: /* A component of the path file_name does not exist, or the path is an empty string. Just return if the file doesn't exist. */ return; default: return; } } fp = fopen(filename, "r"); if(fp == NULL) return; /* print all lines in the SSI file */ while(fgets(buffer, (int)(sizeof(buffer) - 1), fp) != NULL) printf("%s", buffer); fclose(fp); return; } /* displays an error if CGI config file could not be read */ void cgi_config_file_error(const char *config_file) { printf("

    Whoops!

    \n"); printf("

    Error: Could not open CGI config file '%s' for reading!

    \n", config_file); printf("

    \n"); printf("Here are some things you should check in order to resolve this error:\n"); printf("

    \n"); printf("

    \n"); printf("

      \n"); printf("
    1. Make sure you've installed a CGI config file in its proper location. See the error message about for details on where the CGI is expecting to find the configuration file. A sample CGI configuration file (named cgi.cfg) can be found in the sample-config/ subdirectory of the Nagios source code distribution.\n"); printf("
    2. Make sure the user your web server is running as has permission to read the CGI config file.\n"); printf("
    \n"); printf("

    \n"); printf("

    \n"); printf("Make sure you read the documentation on installing and configuring Nagios thoroughly before continuing. If all else fails, try sending a message to one of the mailing lists. More information can be found at https://www.nagios.org.\n"); printf("

    \n"); return; } /* displays an error if main config file could not be read */ void main_config_file_error(const char *config_file) { printf("

    Whoops!

    \n"); printf("

    Error: Could not open main config file '%s' for reading!

    \n", config_file); printf("

    \n"); printf("Here are some things you should check in order to resolve this error:\n"); printf("

    \n"); printf("

    \n"); printf("

      \n"); printf("
    1. Make sure you've installed a main config file in its proper location. See the error message about for details on where the CGI is expecting to find the configuration file. A sample main configuration file (named nagios.cfg) can be found in the sample-config/ subdirectory of the Nagios source code distribution.\n"); printf("
    2. Make sure the user your web server is running as has permission to read the main config file.\n"); printf("
    \n"); printf("

    \n"); printf("

    \n"); printf("Make sure you read the documentation on installing and configuring Nagios thoroughly before continuing. If all else fails, try sending a message to one of the mailing lists. More information can be found at https://www.nagios.org.\n"); printf("

    \n"); return; } /* displays an error if object data could not be read */ void object_data_error(void) { printf("

    Whoops!

    \n"); printf("

    Error: Could not read object configuration data!

    \n"); printf("

    \n"); printf("Here are some things you should check in order to resolve this error:\n"); printf("

    \n"); printf("

    \n"); printf("

      \n"); printf("
    1. Verify configuration options using the -v command-line option to check for errors.\n"); printf("
    2. Check the Nagios log file for messages relating to startup or status data errors.\n"); printf("
    \n"); printf("

    \n"); printf("

    \n"); printf("Make sure you read the documentation on installing, configuring and running Nagios thoroughly before continuing. If all else fails, try sending a message to one of the mailing lists. More information can be found at https://www.nagios.org.\n"); printf("

    \n"); return; } /* displays an error if status data could not be read */ void status_data_error(void) { printf("

    Whoops!

    \n"); printf("

    Error: Could not read host and service status information!

    \n"); printf("

    \n"); printf("The most common cause of this error message (especially for new users), is the fact that Nagios is not actually running. If Nagios is indeed not running, this is a normal error message. It simply indicates that the CGIs could not obtain the current status of hosts and services that are being monitored. If you've just installed things, make sure you read the documentation on starting Nagios.\n"); printf("

    \n"); printf("

    \n"); printf("Some other things you should check in order to resolve this error include:\n"); printf("

    \n"); printf("

    \n"); printf("

      \n"); printf("
    1. Check the Nagios log file for messages relating to startup or status data errors.\n"); printf("
    2. Always verify configuration options using the -v command-line option before starting or restarting Nagios!\n"); printf("
    \n"); printf("

    \n"); printf("

    \n"); printf("Make sure you read the documentation on installing, configuring and running Nagios thoroughly before continuing. If all else fails, try sending a message to one of the mailing lists. More information can be found at https://www.nagios.org.\n"); printf("

    \n"); return; } /* displays context-sensitive help window */ void display_context_help(const char *chid) { const char *icon = CONTEXT_HELP_ICON1; if(show_context_help == FALSE) return; /* change icon if necessary */ if(!strcmp(chid, CONTEXTHELP_TAC)) icon = CONTEXT_HELP_ICON2; printf("Display context-sensitive help for this screen\n", url_context_help_path, chid, url_context_help_path, chid, url_images_path, icon); return; } void display_splunk_host_url(host *hst) { if(enable_splunk_integration == FALSE) return; if(hst == NULL) return; printf("Splunk It\n", splunk_url, url_encode(hst->name), url_images_path, SPLUNK_SMALL_WHITE_ICON); return; } void display_splunk_service_url(service *svc) { if(enable_splunk_integration == FALSE) return; if(svc == NULL) return; printf("Splunk It\n", url_encode(svc->description), url_images_path, SPLUNK_SMALL_WHITE_ICON); return; } void display_splunk_generic_url(char *buf, int icon) { char *newbuf = NULL; if(enable_splunk_integration == FALSE) return; if(buf == NULL) return; if((newbuf = (char *)strdup(buf)) == NULL) return; strip_splunk_query_terms(newbuf); printf("", splunk_url, url_encode(newbuf)); if(icon > 0) printf("Splunk It", url_images_path, (icon == 1) ? SPLUNK_SMALL_WHITE_ICON : SPLUNK_SMALL_BLACK_ICON); printf("\n"); free(newbuf); return; } /* strip quotes and from string */ void strip_splunk_query_terms(char *buffer) { register int x; register int y; register int z; if(buffer == NULL || buffer[0] == '\x0') return; /* remove all occurrences in string */ z = (int)strlen(buffer); for(x = 0, y = 0; x < z; x++) { if(buffer[x] == '\'' || buffer[x] == '\"' || buffer[x] == ';' || buffer[x] == ':' || buffer[x] == ',' || buffer[x] == '-' || buffer[x] == '=') buffer[y++] = ' '; else buffer[y++] = buffer[x]; } buffer[y++] = '\x0'; return; } nagios-4.3.4/cgi/cmd.c000066400000000000000000003377441314764422400145040ustar00rootroot00000000000000/************************************************************************** * * CMD.C - Nagios Command CGI * * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *************************************************************************/ #include "../include/config.h" #include "../include/common.h" #include "../include/objects.h" #include "../include/comments.h" #include "../include/downtime.h" #include "../include/cgiutils.h" #include "../include/cgiauth.h" #include "../include/getcgi.h" extern const char *extcmd_get_name(int id); extern char main_config_file[MAX_FILENAME_LENGTH]; extern char url_html_path[MAX_FILENAME_LENGTH]; extern char url_images_path[MAX_FILENAME_LENGTH]; extern char command_file[MAX_FILENAME_LENGTH]; extern char url_stylesheets_path[MAX_FILENAME_LENGTH]; extern int nagios_process_state; extern int use_authentication; extern int lock_author_names; extern int ack_no_sticky; extern int ack_no_send; #define MAX_AUTHOR_LENGTH 64 #define MAX_COMMENT_LENGTH 1024 #define HTML_CONTENT 0 #define WML_CONTENT 1 char *host_name = ""; char *hostgroup_name = ""; char *servicegroup_name = ""; char *service_desc = ""; char *comment_author = ""; char *comment_data = ""; char *start_time_string = ""; char *end_time_string = ""; char *cookie_form_id = NULL, *form_id = NULL; unsigned long comment_id = 0; unsigned long downtime_id = 0; int notification_delay = 0; int schedule_delay = 0; int persistent_comment = FALSE; int sticky_ack = FALSE; int send_notification = FALSE; int force_check = FALSE; int plugin_state = STATE_OK; char plugin_output[MAX_INPUT_BUFFER] = ""; char performance_data[MAX_INPUT_BUFFER] = ""; time_t start_time = 0L; time_t end_time = 0L; int affect_host_and_services = FALSE; int propagate_to_children = FALSE; int fixed = FALSE; unsigned long duration = 0L; unsigned long triggered_by = 0L; int child_options = 0; int force_notification = 0; int broadcast_notification = 0; int command_type = CMD_NONE; int command_mode = CMDMODE_REQUEST; int content_type = HTML_CONTENT; int display_header = TRUE; authdata current_authdata; void show_command_help(int); void request_command_data(int); void commit_command_data(int); int commit_command(int); int write_command_to_file(char *); void clean_comment_data(char *); void document_header(int); void document_footer(void); int process_cgivars(void); int string_to_time(char *, time_t *); int main(void) { int result = OK; int formid_ok = OK; /* Initialize shared configuration variables */ init_shared_cfg_vars(1); /* get the arguments passed in the URL */ process_cgivars(); /* reset internal variables */ reset_cgi_vars(); /* read the CGI configuration file */ result = read_cgi_config_file(get_cgi_config_location()); if(result == ERROR) { document_header(FALSE); if(content_type == WML_CONTENT) printf("

    Error: Could not open CGI config file!

    \n"); else cgi_config_file_error(get_cgi_config_location()); document_footer(); return ERROR; } /* read the main configuration file */ result = read_main_config_file(main_config_file); if(result == ERROR) { document_header(FALSE); if(content_type == WML_CONTENT) printf("

    Error: Could not open main config file!

    \n"); else main_config_file_error(main_config_file); document_footer(); return ERROR; } /* This requires the date_format parameter in the main config file */ if(strcmp(start_time_string, "")) string_to_time(start_time_string, &start_time); if(strcmp(end_time_string, "")) string_to_time(end_time_string, &end_time); /* read all object configuration data */ result = read_all_object_configuration_data(main_config_file, READ_ALL_OBJECT_DATA); if(result == ERROR) { document_header(FALSE); if(content_type == WML_CONTENT) printf("

    Error: Could not read object config data!

    \n"); else object_data_error(); document_footer(); return ERROR; } document_header(TRUE); /* get authentication information */ get_authentication_information(¤t_authdata); if(display_header == TRUE) { /* begin top table */ printf("\n"); printf("\n"); /* left column of the first row */ printf("\n"); /* center column of the first row */ printf("\n"); /* right column of the first row */ printf("\n"); /* end of top table */ printf("\n"); printf("
    \n"); display_info_table("External Command Interface", FALSE, ¤t_authdata); printf("\n"); printf("\n"); /* display context-sensitive help */ if(command_mode == CMDMODE_COMMIT) display_context_help(CONTEXTHELP_CMD_COMMIT); else display_context_help(CONTEXTHELP_CMD_INPUT); printf("
    \n"); } /* authorized_for_read_only should take priority */ if(is_authorized_for_read_only(¤t_authdata) == TRUE) { printf("

    It appears as though you do not have permission to submit the command you requested...

    \n"); printf("

    If you believe this is an error, check the HTTP server authentication requirements for accessing this CGI
    "); printf("and check the authorization options in your CGI configuration file.

    \n"); document_footer(); /* free allocated memory */ free_memory(); free_object_data(); return OK; } if (cookie_form_id && *cookie_form_id) { formid_ok = ERROR; if (form_id && *form_id) { if (!strcmp(form_id, cookie_form_id)) formid_ok = OK; } } /* if no command was specified... */ if(command_type == CMD_NONE) { if(content_type == WML_CONTENT) printf("

    Error: No command specified!

    \n"); else printf("

    Error: No command was specified

    \n"); } /* if this is the first request for a command, present option */ else if(command_mode == CMDMODE_REQUEST) request_command_data(command_type); /* the user wants to commit the command */ else if(command_mode == CMDMODE_COMMIT) { if (formid_ok == ERROR) /* we're expecting an id but it wasn't there... */ printf("

    Error: Invalid form id!

    \n"); else commit_command_data(command_type); } document_footer(); /* free allocated memory */ free_memory(); free_object_data(); return OK; } void document_header(int use_stylesheet) { if(content_type == WML_CONTENT) { printf("Content-type: text/vnd.wap.wml\r\n\r\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); } else { printf("Content-type: text/html; charset=utf-8\r\n\r\n"); printf("\n"); printf("\n"); printf("\n", url_images_path); printf("\n"); printf("External Command Interface\n"); printf("\n"); if(use_stylesheet == TRUE) { printf("\n", url_stylesheets_path, COMMON_CSS); printf("\n", url_stylesheets_path, COMMAND_CSS); } printf("\n"); printf("\n"); /* include user SSI header */ include_ssi_files(COMMAND_CGI, SSI_HEADER); } return; } void document_footer(void) { if(content_type == WML_CONTENT) { printf("\n"); printf("\n"); } else { /* include user SSI footer */ include_ssi_files(COMMAND_CGI, SSI_FOOTER); printf("\n"); printf("\n"); } return; } int process_cgivars(void) { char **variables; int error = FALSE; int x; variables = getcgivars(); for(x = 0; variables[x] != NULL; x++) { /* do some basic length checking on the variable identifier to prevent buffer overflows */ if(strlen(variables[x]) >= MAX_INPUT_BUFFER - 1) { continue; } /* we found the command type */ else if(!strcmp(variables[x], "cmd_typ")) { x++; if(variables[x] == NULL) { error = TRUE; break; } command_type = atoi(variables[x]); } /* we found the command mode */ else if(!strcmp(variables[x], "cmd_mod")) { x++; if(variables[x] == NULL) { error = TRUE; break; } command_mode = atoi(variables[x]); } /* we found the comment id */ else if(!strcmp(variables[x], "com_id")) { x++; if(variables[x] == NULL) { error = TRUE; break; } comment_id = strtoul(variables[x], NULL, 10); } /* we found the downtime id */ else if(!strcmp(variables[x], "down_id")) { x++; if(variables[x] == NULL) { error = TRUE; break; } downtime_id = strtoul(variables[x], NULL, 10); } /* we found the notification delay */ else if(!strcmp(variables[x], "not_dly")) { x++; if(variables[x] == NULL) { error = TRUE; break; } notification_delay = atoi(variables[x]); } /* we found the schedule delay */ else if(!strcmp(variables[x], "sched_dly")) { x++; if(variables[x] == NULL) { error = TRUE; break; } schedule_delay = atoi(variables[x]); } /* we found the comment author */ else if(!strcmp(variables[x], "com_author")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if((comment_author = (char *)strdup(variables[x])) == NULL) comment_author = ""; strip_html_brackets(comment_author); } /* we found the comment data */ else if(!strcmp(variables[x], "com_data")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if((comment_data = (char *)strdup(variables[x])) == NULL) comment_data = ""; strip_html_brackets(comment_data); } /* we found the host name */ else if(!strcmp(variables[x], "host")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if((host_name = (char *)strdup(variables[x])) == NULL) host_name = ""; strip_html_brackets(host_name); } /* we found the hostgroup name */ else if(!strcmp(variables[x], "hostgroup")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if((hostgroup_name = (char *)strdup(variables[x])) == NULL) hostgroup_name = ""; strip_html_brackets(hostgroup_name); } /* we found the service name */ else if(!strcmp(variables[x], "service")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if((service_desc = (char *)strdup(variables[x])) == NULL) service_desc = ""; strip_html_brackets(service_desc); } /* we found the servicegroup name */ else if(!strcmp(variables[x], "servicegroup")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if((servicegroup_name = (char *)strdup(variables[x])) == NULL) servicegroup_name = ""; strip_html_brackets(servicegroup_name); } /* we got the persistence option for a comment */ else if(!strcmp(variables[x], "persistent")) persistent_comment = TRUE; /* we got the notification option for an acknowledgement */ else if(!strcmp(variables[x], "send_notification")) send_notification = TRUE; /* we got the acknowledgement type */ else if(!strcmp(variables[x], "sticky_ack")) sticky_ack = TRUE; /* we got the service check force option */ else if(!strcmp(variables[x], "force_check")) force_check = TRUE; /* we got the option to affect host and all its services */ else if(!strcmp(variables[x], "ahas")) affect_host_and_services = TRUE; /* we got the option to propagate to child hosts */ else if(!strcmp(variables[x], "ptc")) propagate_to_children = TRUE; /* we got the option for fixed downtime */ else if(!strcmp(variables[x], "fixed")) { x++; if(variables[x] == NULL) { error = TRUE; break; } fixed = (atoi(variables[x]) > 0) ? TRUE : FALSE; } /* we got the triggered by downtime option */ else if(!strcmp(variables[x], "trigger")) { x++; if(variables[x] == NULL) { error = TRUE; break; } triggered_by = strtoul(variables[x], NULL, 10); } /* we got the child options */ else if(!strcmp(variables[x], "childoptions")) { x++; if(variables[x] == NULL) { error = TRUE; break; } child_options = atoi(variables[x]); } /* we found the plugin output */ else if(!strcmp(variables[x], "plugin_output")) { x++; if(variables[x] == NULL) { error = TRUE; break; } /* protect against buffer overflows */ if(strlen(variables[x]) >= MAX_INPUT_BUFFER - 1) { error = TRUE; break; } else strcpy(plugin_output, variables[x]); } /* we found the performance data */ else if(!strcmp(variables[x], "performance_data")) { x++; if(variables[x] == NULL) { error = TRUE; break; } /* protect against buffer overflows */ if(strlen(variables[x]) >= MAX_INPUT_BUFFER - 1) { error = TRUE; break; } else strcpy(performance_data, variables[x]); } /* we found the plugin state */ else if(!strcmp(variables[x], "plugin_state")) { x++; if(variables[x] == NULL) { error = TRUE; break; } plugin_state = atoi(variables[x]); } /* we found the hour duration */ else if(!strcmp(variables[x], "hours")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(atoi(variables[x]) < 0) { error = TRUE; break; } duration += (unsigned long)(atoi(variables[x]) * 3600); } /* we found the minute duration */ else if(!strcmp(variables[x], "minutes")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(atoi(variables[x]) < 0) { error = TRUE; break; } duration += (unsigned long)(atoi(variables[x]) * 60); } /* we found the start time */ else if(!strcmp(variables[x], "start_time")) { x++; if(variables[x] == NULL) { error = TRUE; break; } start_time_string = (char *)malloc(strlen(variables[x]) + 1); if(start_time_string == NULL) start_time_string = ""; else strcpy(start_time_string, variables[x]); } /* we found the end time */ else if(!strcmp(variables[x], "end_time")) { x++; if(variables[x] == NULL) { error = TRUE; break; } end_time_string = (char *)malloc(strlen(variables[x]) + 1); if(end_time_string == NULL) end_time_string = ""; else strcpy(end_time_string, variables[x]); } /* we found the content type argument */ else if(!strcmp(variables[x], "content")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(!strcmp(variables[x], "wml")) { content_type = WML_CONTENT; display_header = FALSE; } else content_type = HTML_CONTENT; } /* we found the forced notification option */ else if(!strcmp(variables[x], "force_notification")) force_notification = NOTIFICATION_OPTION_FORCED; /* we found the broadcast notification option */ else if(!strcmp(variables[x], "broadcast_notification")) broadcast_notification = NOTIFICATION_OPTION_BROADCAST; /* we found the cookie form id */ else if (!strcmp(variables[x], "NagFormId")) { x++; if (variables[x] == NULL) { error = TRUE; break; } cookie_form_id = (char*)strdup(variables[x]); } /* we found the form id on the form */ else if (!strcmp(variables[x], "nagFormId")) { x++; if (variables[x] == NULL) { error = TRUE; break; } form_id = (char*)strdup(variables[x]); } } /* free memory allocated to the CGI variables */ free_cgivars(variables); return error; } void request_command_data(int cmd) { time_t t; char start_time_str[MAX_DATETIME_LENGTH]; char buffer[MAX_INPUT_BUFFER]; contact *temp_contact; scheduled_downtime *temp_downtime; /* get default name to use for comment author */ temp_contact = find_contact(current_authdata.username); if(temp_contact != NULL && temp_contact->alias != NULL) comment_author = temp_contact->alias; else comment_author = current_authdata.username; printf("

    You are requesting to "); switch(cmd) { case CMD_ADD_HOST_COMMENT: case CMD_ADD_SVC_COMMENT: printf("add a %s comment", (cmd == CMD_ADD_HOST_COMMENT) ? "host" : "service"); break; case CMD_DEL_HOST_COMMENT: case CMD_DEL_SVC_COMMENT: printf("delete a %s comment", (cmd == CMD_DEL_HOST_COMMENT) ? "host" : "service"); break; case CMD_DELAY_HOST_NOTIFICATION: case CMD_DELAY_SVC_NOTIFICATION: printf("delay a %s notification", (cmd == CMD_DELAY_HOST_NOTIFICATION) ? "host" : "service"); break; case CMD_SCHEDULE_SVC_CHECK: printf("schedule a service check"); break; case CMD_ENABLE_SVC_CHECK: case CMD_DISABLE_SVC_CHECK: printf("%s active checks of a particular service", (cmd == CMD_ENABLE_SVC_CHECK) ? "enable" : "disable"); break; case CMD_ENABLE_NOTIFICATIONS: case CMD_DISABLE_NOTIFICATIONS: printf("%s notifications", (cmd == CMD_ENABLE_NOTIFICATIONS) ? "enable" : "disable"); break; case CMD_SHUTDOWN_PROCESS: case CMD_RESTART_PROCESS: printf("%s the Nagios process", (cmd == CMD_SHUTDOWN_PROCESS) ? "shutdown" : "restart"); break; case CMD_ENABLE_HOST_SVC_CHECKS: case CMD_DISABLE_HOST_SVC_CHECKS: printf("%s active checks of all services on a host", (cmd == CMD_ENABLE_HOST_SVC_CHECKS) ? "enable" : "disable"); break; case CMD_SCHEDULE_HOST_SVC_CHECKS: printf("schedule a check of all services for a host"); break; case CMD_DEL_ALL_HOST_COMMENTS: case CMD_DEL_ALL_SVC_COMMENTS: printf("delete all comments for a %s", (cmd == CMD_DEL_ALL_HOST_COMMENTS) ? "host" : "service"); break; case CMD_ENABLE_SVC_NOTIFICATIONS: case CMD_DISABLE_SVC_NOTIFICATIONS: printf("%s notifications for a service", (cmd == CMD_ENABLE_SVC_NOTIFICATIONS) ? "enable" : "disable"); break; case CMD_ENABLE_HOST_NOTIFICATIONS: case CMD_DISABLE_HOST_NOTIFICATIONS: printf("%s notifications for a host", (cmd == CMD_ENABLE_HOST_NOTIFICATIONS) ? "enable" : "disable"); break; case CMD_ENABLE_ALL_NOTIFICATIONS_BEYOND_HOST: case CMD_DISABLE_ALL_NOTIFICATIONS_BEYOND_HOST: printf("%s notifications for all hosts and services beyond a host", (cmd == CMD_ENABLE_ALL_NOTIFICATIONS_BEYOND_HOST) ? "enable" : "disable"); break; case CMD_ENABLE_HOST_SVC_NOTIFICATIONS: case CMD_DISABLE_HOST_SVC_NOTIFICATIONS: printf("%s notifications for all services on a host", (cmd == CMD_ENABLE_HOST_SVC_NOTIFICATIONS) ? "enable" : "disable"); break; case CMD_ACKNOWLEDGE_HOST_PROBLEM: case CMD_ACKNOWLEDGE_SVC_PROBLEM: printf("acknowledge a %s problem", (cmd == CMD_ACKNOWLEDGE_HOST_PROBLEM) ? "host" : "service"); break; case CMD_START_EXECUTING_SVC_CHECKS: case CMD_STOP_EXECUTING_SVC_CHECKS: printf("%s executing active service checks", (cmd == CMD_START_EXECUTING_SVC_CHECKS) ? "start" : "stop"); break; case CMD_START_ACCEPTING_PASSIVE_SVC_CHECKS: case CMD_STOP_ACCEPTING_PASSIVE_SVC_CHECKS: printf("%s accepting passive service checks", (cmd == CMD_START_ACCEPTING_PASSIVE_SVC_CHECKS) ? "start" : "stop"); break; case CMD_ENABLE_PASSIVE_SVC_CHECKS: case CMD_DISABLE_PASSIVE_SVC_CHECKS: printf("%s accepting passive service checks for a particular service", (cmd == CMD_ENABLE_PASSIVE_SVC_CHECKS) ? "start" : "stop"); break; case CMD_ENABLE_EVENT_HANDLERS: case CMD_DISABLE_EVENT_HANDLERS: printf("%s event handlers", (cmd == CMD_ENABLE_EVENT_HANDLERS) ? "enable" : "disable"); break; case CMD_ENABLE_HOST_EVENT_HANDLER: case CMD_DISABLE_HOST_EVENT_HANDLER: printf("%s the event handler for a particular host", (cmd == CMD_ENABLE_HOST_EVENT_HANDLER) ? "enable" : "disable"); break; case CMD_ENABLE_SVC_EVENT_HANDLER: case CMD_DISABLE_SVC_EVENT_HANDLER: printf("%s the event handler for a particular service", (cmd == CMD_ENABLE_SVC_EVENT_HANDLER) ? "enable" : "disable"); break; case CMD_ENABLE_HOST_CHECK: case CMD_DISABLE_HOST_CHECK: printf("%s active checks of a particular host", (cmd == CMD_ENABLE_HOST_CHECK) ? "enable" : "disable"); break; case CMD_STOP_OBSESSING_OVER_SVC_CHECKS: case CMD_START_OBSESSING_OVER_SVC_CHECKS: printf("%s obsessing over service checks", (cmd == CMD_STOP_OBSESSING_OVER_SVC_CHECKS) ? "stop" : "start"); break; case CMD_REMOVE_HOST_ACKNOWLEDGEMENT: case CMD_REMOVE_SVC_ACKNOWLEDGEMENT: printf("remove a %s acknowledgement", (cmd == CMD_REMOVE_HOST_ACKNOWLEDGEMENT) ? "host" : "service"); break; case CMD_SCHEDULE_HOST_DOWNTIME: case CMD_SCHEDULE_SVC_DOWNTIME: printf("schedule downtime for a particular %s", (cmd == CMD_SCHEDULE_HOST_DOWNTIME) ? "host" : "service"); break; case CMD_SCHEDULE_HOST_SVC_DOWNTIME: printf("schedule downtime for all services for a particular host"); break; case CMD_PROCESS_HOST_CHECK_RESULT: case CMD_PROCESS_SERVICE_CHECK_RESULT: printf("submit a passive check result for a particular %s", (cmd == CMD_PROCESS_HOST_CHECK_RESULT) ? "host" : "service"); break; case CMD_ENABLE_HOST_FLAP_DETECTION: case CMD_DISABLE_HOST_FLAP_DETECTION: printf("%s flap detection for a particular host", (cmd == CMD_ENABLE_HOST_FLAP_DETECTION) ? "enable" : "disable"); break; case CMD_ENABLE_SVC_FLAP_DETECTION: case CMD_DISABLE_SVC_FLAP_DETECTION: printf("%s flap detection for a particular service", (cmd == CMD_ENABLE_SVC_FLAP_DETECTION) ? "enable" : "disable"); break; case CMD_ENABLE_FLAP_DETECTION: case CMD_DISABLE_FLAP_DETECTION: printf("%s flap detection for hosts and services", (cmd == CMD_ENABLE_FLAP_DETECTION) ? "enable" : "disable"); break; case CMD_ENABLE_HOSTGROUP_SVC_NOTIFICATIONS: case CMD_DISABLE_HOSTGROUP_SVC_NOTIFICATIONS: printf("%s notifications for all services in a particular hostgroup", (cmd == CMD_ENABLE_HOSTGROUP_SVC_NOTIFICATIONS) ? "enable" : "disable"); break; case CMD_ENABLE_HOSTGROUP_HOST_NOTIFICATIONS: case CMD_DISABLE_HOSTGROUP_HOST_NOTIFICATIONS: printf("%s notifications for all hosts in a particular hostgroup", (cmd == CMD_ENABLE_HOSTGROUP_HOST_NOTIFICATIONS) ? "enable" : "disable"); break; case CMD_ENABLE_HOSTGROUP_SVC_CHECKS: case CMD_DISABLE_HOSTGROUP_SVC_CHECKS: printf("%s active checks of all services in a particular hostgroup", (cmd == CMD_ENABLE_HOSTGROUP_SVC_CHECKS) ? "enable" : "disable"); break; case CMD_DEL_HOST_DOWNTIME: case CMD_DEL_SVC_DOWNTIME: printf("cancel scheduled downtime for a particular %s", (cmd == CMD_DEL_HOST_DOWNTIME) ? "host" : "service"); break; case CMD_ENABLE_PERFORMANCE_DATA: case CMD_DISABLE_PERFORMANCE_DATA: printf("%s performance data processing for hosts and services", (cmd == CMD_ENABLE_PERFORMANCE_DATA) ? "enable" : "disable"); break; case CMD_SCHEDULE_HOSTGROUP_HOST_DOWNTIME: printf("schedule downtime for all hosts in a particular hostgroup"); break; case CMD_SCHEDULE_HOSTGROUP_SVC_DOWNTIME: printf("schedule downtime for all services in a particular hostgroup"); break; case CMD_START_EXECUTING_HOST_CHECKS: case CMD_STOP_EXECUTING_HOST_CHECKS: printf("%s executing host checks", (cmd == CMD_START_EXECUTING_HOST_CHECKS) ? "start" : "stop"); break; case CMD_START_ACCEPTING_PASSIVE_HOST_CHECKS: case CMD_STOP_ACCEPTING_PASSIVE_HOST_CHECKS: printf("%s accepting passive host checks", (cmd == CMD_START_ACCEPTING_PASSIVE_HOST_CHECKS) ? "start" : "stop"); break; case CMD_ENABLE_PASSIVE_HOST_CHECKS: case CMD_DISABLE_PASSIVE_HOST_CHECKS: printf("%s accepting passive checks for a particular host", (cmd == CMD_ENABLE_PASSIVE_HOST_CHECKS) ? "start" : "stop"); break; case CMD_START_OBSESSING_OVER_HOST_CHECKS: case CMD_STOP_OBSESSING_OVER_HOST_CHECKS: printf("%s obsessing over host checks", (cmd == CMD_START_OBSESSING_OVER_HOST_CHECKS) ? "start" : "stop"); break; case CMD_SCHEDULE_HOST_CHECK: printf("schedule a host check"); break; case CMD_START_OBSESSING_OVER_SVC: case CMD_STOP_OBSESSING_OVER_SVC: printf("%s obsessing over a particular service", (cmd == CMD_START_OBSESSING_OVER_SVC) ? "start" : "stop"); break; case CMD_START_OBSESSING_OVER_HOST: case CMD_STOP_OBSESSING_OVER_HOST: printf("%s obsessing over a particular host", (cmd == CMD_START_OBSESSING_OVER_HOST) ? "start" : "stop"); break; case CMD_ENABLE_SERVICEGROUP_SVC_NOTIFICATIONS: case CMD_DISABLE_SERVICEGROUP_SVC_NOTIFICATIONS: printf("%s notifications for all services in a particular servicegroup", (cmd == CMD_ENABLE_SERVICEGROUP_SVC_NOTIFICATIONS) ? "enable" : "disable"); break; case CMD_ENABLE_SERVICEGROUP_HOST_NOTIFICATIONS: case CMD_DISABLE_SERVICEGROUP_HOST_NOTIFICATIONS: printf("%s notifications for all hosts in a particular servicegroup", (cmd == CMD_ENABLE_SERVICEGROUP_HOST_NOTIFICATIONS) ? "enable" : "disable"); break; case CMD_ENABLE_SERVICEGROUP_SVC_CHECKS: case CMD_DISABLE_SERVICEGROUP_SVC_CHECKS: printf("%s active checks of all services in a particular servicegroup", (cmd == CMD_ENABLE_SERVICEGROUP_SVC_CHECKS) ? "enable" : "disable"); break; case CMD_SCHEDULE_SERVICEGROUP_HOST_DOWNTIME: printf("schedule downtime for all hosts in a particular servicegroup"); break; case CMD_SCHEDULE_SERVICEGROUP_SVC_DOWNTIME: printf("schedule downtime for all services in a particular servicegroup"); break; case CMD_CLEAR_HOST_FLAPPING_STATE: case CMD_CLEAR_SVC_FLAPPING_STATE: printf("clear flapping state for a %s", (cmd == CMD_CLEAR_HOST_FLAPPING_STATE) ? "host" : "service"); break; case CMD_SEND_CUSTOM_HOST_NOTIFICATION: case CMD_SEND_CUSTOM_SVC_NOTIFICATION: printf("send a custom %s notification", (cmd == CMD_SEND_CUSTOM_HOST_NOTIFICATION) ? "host" : "service"); break; default: printf("execute an unknown command. Shame on you!
    "); return; } printf("
  • \n"); printf("

    \n"); printf("

    \n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("
    \n"); printf("
    Command Options
    \n"); printf("\n"); printf("\n", cmd, CMDMODE_COMMIT); switch(cmd) { case CMD_ADD_HOST_COMMENT: case CMD_ACKNOWLEDGE_HOST_PROBLEM: printf("\n"); if(cmd == CMD_ACKNOWLEDGE_HOST_PROBLEM) { printf("\n"); printf("\n"); } printf("\n"); printf("\n"); printf("\n"); break; case CMD_ADD_SVC_COMMENT: case CMD_ACKNOWLEDGE_SVC_PROBLEM: printf("\n"); printf("\n"); printf("\n"); } printf("\n"); printf("\n"); printf("\n"); break; case CMD_DEL_HOST_COMMENT: case CMD_DEL_SVC_COMMENT: printf("\n"); break; case CMD_DELAY_HOST_NOTIFICATION: printf("\n"); printf("\n"); break; case CMD_DELAY_SVC_NOTIFICATION: printf("\n"); printf("\n"); break; case CMD_SCHEDULE_SVC_CHECK: case CMD_SCHEDULE_HOST_CHECK: case CMD_SCHEDULE_HOST_SVC_CHECKS: printf("\n"); if(cmd == CMD_SCHEDULE_SVC_CHECK) { printf("\n"); } time(&t); get_time_string(&t, buffer, sizeof(buffer) - 1, SHORT_DATE_TIME); printf("\n"); printf("\n"); break; case CMD_ENABLE_SVC_CHECK: case CMD_DISABLE_SVC_CHECK: case CMD_DEL_ALL_SVC_COMMENTS: case CMD_ENABLE_SVC_NOTIFICATIONS: case CMD_DISABLE_SVC_NOTIFICATIONS: case CMD_ENABLE_PASSIVE_SVC_CHECKS: case CMD_DISABLE_PASSIVE_SVC_CHECKS: case CMD_ENABLE_SVC_EVENT_HANDLER: case CMD_DISABLE_SVC_EVENT_HANDLER: case CMD_REMOVE_SVC_ACKNOWLEDGEMENT: case CMD_ENABLE_SVC_FLAP_DETECTION: case CMD_DISABLE_SVC_FLAP_DETECTION: case CMD_START_OBSESSING_OVER_SVC: case CMD_STOP_OBSESSING_OVER_SVC: case CMD_CLEAR_SVC_FLAPPING_STATE: printf("\n"); printf("\n"); break; case CMD_ENABLE_HOST_SVC_CHECKS: case CMD_DISABLE_HOST_SVC_CHECKS: case CMD_DEL_ALL_HOST_COMMENTS: case CMD_ENABLE_HOST_NOTIFICATIONS: case CMD_DISABLE_HOST_NOTIFICATIONS: case CMD_ENABLE_ALL_NOTIFICATIONS_BEYOND_HOST: case CMD_DISABLE_ALL_NOTIFICATIONS_BEYOND_HOST: case CMD_ENABLE_HOST_SVC_NOTIFICATIONS: case CMD_DISABLE_HOST_SVC_NOTIFICATIONS: case CMD_ENABLE_HOST_EVENT_HANDLER: case CMD_DISABLE_HOST_EVENT_HANDLER: case CMD_ENABLE_HOST_CHECK: case CMD_DISABLE_HOST_CHECK: case CMD_REMOVE_HOST_ACKNOWLEDGEMENT: case CMD_ENABLE_HOST_FLAP_DETECTION: case CMD_DISABLE_HOST_FLAP_DETECTION: case CMD_ENABLE_PASSIVE_HOST_CHECKS: case CMD_DISABLE_PASSIVE_HOST_CHECKS: case CMD_START_OBSESSING_OVER_HOST: case CMD_STOP_OBSESSING_OVER_HOST: case CMD_CLEAR_HOST_FLAPPING_STATE: printf("\n"); if(cmd == CMD_ENABLE_HOST_SVC_CHECKS || cmd == CMD_DISABLE_HOST_SVC_CHECKS || cmd == CMD_ENABLE_HOST_SVC_NOTIFICATIONS || cmd == CMD_DISABLE_HOST_SVC_NOTIFICATIONS) { printf("\n"); } if(cmd == CMD_ENABLE_HOST_NOTIFICATIONS || cmd == CMD_DISABLE_HOST_NOTIFICATIONS) { printf("\n"); } break; case CMD_ENABLE_NOTIFICATIONS: case CMD_DISABLE_NOTIFICATIONS: case CMD_SHUTDOWN_PROCESS: case CMD_RESTART_PROCESS: case CMD_START_EXECUTING_SVC_CHECKS: case CMD_STOP_EXECUTING_SVC_CHECKS: case CMD_START_ACCEPTING_PASSIVE_SVC_CHECKS: case CMD_STOP_ACCEPTING_PASSIVE_SVC_CHECKS: case CMD_ENABLE_EVENT_HANDLERS: case CMD_DISABLE_EVENT_HANDLERS: case CMD_START_OBSESSING_OVER_SVC_CHECKS: case CMD_STOP_OBSESSING_OVER_SVC_CHECKS: case CMD_ENABLE_FLAP_DETECTION: case CMD_DISABLE_FLAP_DETECTION: case CMD_ENABLE_PERFORMANCE_DATA: case CMD_DISABLE_PERFORMANCE_DATA: case CMD_START_EXECUTING_HOST_CHECKS: case CMD_STOP_EXECUTING_HOST_CHECKS: case CMD_START_ACCEPTING_PASSIVE_HOST_CHECKS: case CMD_STOP_ACCEPTING_PASSIVE_HOST_CHECKS: case CMD_START_OBSESSING_OVER_HOST_CHECKS: case CMD_STOP_OBSESSING_OVER_HOST_CHECKS: printf(""); break; case CMD_PROCESS_HOST_CHECK_RESULT: case CMD_PROCESS_SERVICE_CHECK_RESULT: printf("\n"); if(cmd == CMD_PROCESS_SERVICE_CHECK_RESULT) { printf("\n"); } printf("\n"); printf("\n"); printf("\n"); break; case CMD_SCHEDULE_HOST_DOWNTIME: case CMD_SCHEDULE_HOST_SVC_DOWNTIME: case CMD_SCHEDULE_SVC_DOWNTIME: printf("\n"); if(cmd == CMD_SCHEDULE_SVC_DOWNTIME) { printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); time(&t); get_time_string(&t, buffer, sizeof(buffer) - 1, SHORT_DATE_TIME); printf("\n"); t += (unsigned long)7200; get_time_string(&t, buffer, sizeof(buffer) - 1, SHORT_DATE_TIME); printf("\n"); printf("\n"); printf("\n"); printf("\n"); if(cmd == CMD_SCHEDULE_HOST_DOWNTIME) { printf("\n"); } printf("\n"); break; case CMD_ENABLE_HOSTGROUP_SVC_NOTIFICATIONS: case CMD_DISABLE_HOSTGROUP_SVC_NOTIFICATIONS: case CMD_ENABLE_HOSTGROUP_HOST_NOTIFICATIONS: case CMD_DISABLE_HOSTGROUP_HOST_NOTIFICATIONS: case CMD_ENABLE_HOSTGROUP_SVC_CHECKS: case CMD_DISABLE_HOSTGROUP_SVC_CHECKS: printf("\n"); if(cmd == CMD_ENABLE_HOSTGROUP_SVC_CHECKS || cmd == CMD_DISABLE_HOSTGROUP_SVC_CHECKS || cmd == CMD_ENABLE_HOSTGROUP_SVC_NOTIFICATIONS || cmd == CMD_DISABLE_HOSTGROUP_SVC_NOTIFICATIONS) { printf("\n"); } break; case CMD_ENABLE_SERVICEGROUP_SVC_NOTIFICATIONS: case CMD_DISABLE_SERVICEGROUP_SVC_NOTIFICATIONS: case CMD_ENABLE_SERVICEGROUP_HOST_NOTIFICATIONS: case CMD_DISABLE_SERVICEGROUP_HOST_NOTIFICATIONS: case CMD_ENABLE_SERVICEGROUP_SVC_CHECKS: case CMD_DISABLE_SERVICEGROUP_SVC_CHECKS: printf("\n"); if(cmd == CMD_ENABLE_SERVICEGROUP_SVC_CHECKS || cmd == CMD_DISABLE_SERVICEGROUP_SVC_CHECKS || cmd == CMD_ENABLE_SERVICEGROUP_SVC_NOTIFICATIONS || cmd == CMD_DISABLE_SERVICEGROUP_SVC_NOTIFICATIONS) { printf("\n"); } break; case CMD_DEL_HOST_DOWNTIME: case CMD_DEL_SVC_DOWNTIME: printf("\n"); break; case CMD_SCHEDULE_HOSTGROUP_HOST_DOWNTIME: case CMD_SCHEDULE_HOSTGROUP_SVC_DOWNTIME: case CMD_SCHEDULE_SERVICEGROUP_HOST_DOWNTIME: case CMD_SCHEDULE_SERVICEGROUP_SVC_DOWNTIME: if(cmd == CMD_SCHEDULE_HOSTGROUP_HOST_DOWNTIME || cmd == CMD_SCHEDULE_HOSTGROUP_SVC_DOWNTIME) { printf("\n"); } else { printf("\n"); } printf("\n"); printf("\n"); time(&t); get_time_string(&t, buffer, sizeof(buffer) - 1, SHORT_DATE_TIME); printf("\n"); t += (unsigned long)7200; get_time_string(&t, buffer, sizeof(buffer) - 1, SHORT_DATE_TIME); printf("\n"); printf("\n"); printf("\n"); if(cmd == CMD_SCHEDULE_HOSTGROUP_SVC_DOWNTIME || cmd == CMD_SCHEDULE_SERVICEGROUP_SVC_DOWNTIME) { printf("\n"); } break; case CMD_SEND_CUSTOM_HOST_NOTIFICATION: case CMD_SEND_CUSTOM_SVC_NOTIFICATION: printf("\n"); if(cmd == CMD_SEND_CUSTOM_SVC_NOTIFICATION) { printf("\n"); } printf("\n"); printf("\n"); printf("\n"); printf("\n"); break; default: printf("\n"); } printf("\n"); printf("\n"); printf("
    \n"); printf("
    \n", COMMAND_CGI); if (cookie_form_id && *cookie_form_id) printf("\n"); printf("
    Host Name:"); printf("", escape_string(host_name)); printf("
    Sticky Acknowledgement:"); printf("", (ack_no_sticky == TRUE) ? "" : "CHECKED"); printf("
    Send Notification:"); printf("", (ack_no_send == TRUE) ? "" : "CHECKED"); printf("
    Persistent%s:", (cmd == CMD_ACKNOWLEDGE_HOST_PROBLEM) ? " Comment" : ""); printf("", (cmd == CMD_ACKNOWLEDGE_HOST_PROBLEM) ? "" : "CHECKED"); printf("
    Author (Your Name):"); printf("", escape_string(comment_author), (lock_author_names == TRUE) ? "READONLY DISABLED" : ""); printf("
    Comment:"); printf("", escape_string(comment_data)); printf("
    Host Name:"); printf("", escape_string(host_name)); printf("
    Service:"); printf("", escape_string(service_desc)); if(cmd == CMD_ACKNOWLEDGE_SVC_PROBLEM) { printf("
    Sticky Acknowledgement:"); printf("", (ack_no_sticky == TRUE) ? "" : "CHECKED"); printf("
    Send Notification:"); printf("", (ack_no_send == TRUE) ? "" : "CHECKED"); printf("
    Persistent%s:", (cmd == CMD_ACKNOWLEDGE_SVC_PROBLEM) ? " Comment" : ""); printf("", (cmd == CMD_ACKNOWLEDGE_SVC_PROBLEM) ? "" : "CHECKED"); printf("
    Author (Your Name):"); printf("", escape_string(comment_author), (lock_author_names == TRUE) ? "READONLY DISABLED" : ""); printf("
    Comment:"); printf("", escape_string(comment_data)); printf("
    Comment ID:"); printf("", comment_id); printf("
    Host Name:"); printf("", escape_string(host_name)); printf("
    Notification Delay (minutes from now):"); printf("", notification_delay); printf("
    Host Name:"); printf("", escape_string(host_name)); printf("
    Service:"); printf("", escape_string(service_desc)); printf("
    Notification Delay (minutes from now):"); printf("", notification_delay); printf("
    Host Name:"); printf("", escape_string(host_name)); printf("
    Service:"); printf("", escape_string(service_desc)); printf("
    Check Time:"); printf("", buffer); printf("
    Force Check:"); printf("", (force_check == TRUE) ? "CHECKED" : ""); printf("
    Host Name:"); printf("", escape_string(host_name)); printf("
    Service:"); printf("", escape_string(service_desc)); printf("
    Host Name:"); printf("", escape_string(host_name)); printf("
    %s For Host Too:", (cmd == CMD_ENABLE_HOST_SVC_CHECKS || cmd == CMD_ENABLE_HOST_SVC_NOTIFICATIONS) ? "Enable" : "Disable"); printf(""); printf("
    %s Notifications For Child Hosts Too:", (cmd == CMD_ENABLE_HOST_NOTIFICATIONS) ? "Enable" : "Disable"); printf(""); printf("
    There are no options for this command.
    Click the 'Commit' button to submit the command.
    Host Name:"); printf("", escape_string(host_name)); printf("
    Service:"); printf("", escape_string(service_desc)); printf("
    Check Result:"); printf("\n"); printf("
    Check Output:"); printf(""); printf("
    Performance Data:"); printf(""); printf("
    Host Name:"); printf("", escape_string(host_name)); printf("
    Service:"); printf("", escape_string(service_desc)); } printf("
    Author (Your Name):"); printf("", escape_string(comment_author), (lock_author_names == TRUE) ? "READONLY DISABLED" : ""); printf("
    Comment:"); printf("", escape_string(comment_data)); printf("

    Triggered By:\n"); printf("\n"); printf("

    Start Time:"); printf("", buffer); printf("
    End Time:"); printf("", buffer); printf("
    Type:"); printf("\n"); printf("
    If Flexible, Duration:"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("
    HoursMinutes
    \n"); printf("

    Child Hosts:"); printf("\n"); printf("

    Hostgroup Name:"); printf("", escape_string(hostgroup_name)); printf("
    %s For Hosts Too:", (cmd == CMD_ENABLE_HOSTGROUP_SVC_CHECKS || cmd == CMD_ENABLE_HOSTGROUP_SVC_NOTIFICATIONS) ? "Enable" : "Disable"); printf(""); printf("
    Servicegroup Name:"); printf("", escape_string(servicegroup_name)); printf("
    %s For Hosts Too:", (cmd == CMD_ENABLE_SERVICEGROUP_SVC_CHECKS || cmd == CMD_ENABLE_SERVICEGROUP_SVC_NOTIFICATIONS) ? "Enable" : "Disable"); printf(""); printf("
    Scheduled Downtime ID:"); printf("", downtime_id); printf("
    Hostgroup Name:"); printf("", escape_string(hostgroup_name)); printf("
    Servicegroup Name:"); printf("", escape_string(servicegroup_name)); printf("
    Author (Your Name):"); printf("", escape_string(comment_author), (lock_author_names == TRUE) ? "READONLY DISABLED" : ""); printf("
    Comment:"); printf("", escape_string(comment_data)); printf("
    Start Time:"); printf("", buffer); printf("
    End Time:"); printf("", buffer); printf("
    Type:"); printf("\n"); printf("
    If Flexible, Duration:"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("
    HoursMinutes
    \n"); printf("
    Schedule Downtime For Hosts Too:"); printf(""); printf("
    Host Name:"); printf("", escape_string(host_name)); printf("
    Service:"); printf("", escape_string(service_desc)); printf("
    Forced:"); printf("
    Broadcast:"); printf("
    Author (Your Name):"); printf("", escape_string(comment_author), (lock_author_names == TRUE) ? "READONLY DISABLED" : ""); printf("
    Comment:"); printf("", escape_string(comment_data)); printf("
    This should not be happening... :-(
    \n"); printf("\n"); printf("
    \n"); printf("\n"); printf("\n"); /* show information about the command... */ show_command_help(cmd); printf("\n"); printf("\n"); printf("\n"); printf("
    \n"); printf("

    \n"); printf("

    Please enter all required information before committing the command.
    Required fields are marked in red.
    Failure to supply all required values will result in an error.

    "); return; } void commit_command_data(int cmd) { char *error_string = NULL; int result = OK; int authorized = FALSE; service *temp_service; host *temp_host; hostgroup *temp_hostgroup; nagios_comment *temp_comment; scheduled_downtime *temp_downtime; servicegroup *temp_servicegroup = NULL; contact *temp_contact = NULL; /* get authentication information */ get_authentication_information(¤t_authdata); /* get name to use for author */ if(lock_author_names == TRUE) { temp_contact = find_contact(current_authdata.username); if(temp_contact != NULL && temp_contact->alias != NULL) comment_author = temp_contact->alias; else comment_author = current_authdata.username; } switch(cmd) { case CMD_ADD_HOST_COMMENT: case CMD_ACKNOWLEDGE_HOST_PROBLEM: /* make sure we have author name, and comment data... */ if(!strcmp(comment_author, "")) { if(!error_string) error_string = strdup("Author was not entered"); } if(!strcmp(comment_data, "")) { if(!error_string) error_string = strdup("Comment was not entered"); } /* clean up the comment data */ clean_comment_data(comment_author); clean_comment_data(comment_data); /* see if the user is authorized to issue a command... */ temp_host = find_host(host_name); if(is_authorized_for_host_commands(temp_host, ¤t_authdata) == TRUE) authorized = TRUE; break; case CMD_ADD_SVC_COMMENT: case CMD_ACKNOWLEDGE_SVC_PROBLEM: /* make sure we have author name, and comment data... */ if(!strcmp(comment_author, "")) { if(!error_string) error_string = strdup("Author was not entered"); } if(!strcmp(comment_data, "")) { if(!error_string) error_string = strdup("Comment was not entered"); } /* clean up the comment data */ clean_comment_data(comment_author); clean_comment_data(comment_data); /* see if the user is authorized to issue a command... */ temp_service = find_service(host_name, service_desc); if(is_authorized_for_service_commands(temp_service, ¤t_authdata) == TRUE) authorized = TRUE; break; case CMD_DEL_HOST_COMMENT: case CMD_DEL_SVC_COMMENT: /* check the sanity of the comment id */ if(comment_id == 0) { if(!error_string) error_string = strdup("Comment id cannot be 0"); } /* find the comment */ if(cmd == CMD_DEL_HOST_COMMENT) temp_comment = find_host_comment(comment_id); else temp_comment = find_service_comment(comment_id); /* see if the user is authorized to issue a command... */ if(cmd == CMD_DEL_HOST_COMMENT && temp_comment != NULL) { temp_host = find_host(temp_comment->host_name); if(is_authorized_for_host_commands(temp_host, ¤t_authdata) == TRUE) authorized = TRUE; } if(cmd == CMD_DEL_SVC_COMMENT && temp_comment != NULL) { temp_service = find_service(temp_comment->host_name, temp_comment->service_description); if(is_authorized_for_service_commands(temp_service, ¤t_authdata) == TRUE) authorized = TRUE; } /* free comment data */ free_comment_data(); break; case CMD_DEL_HOST_DOWNTIME: case CMD_DEL_SVC_DOWNTIME: /* check the sanity of the downtime id */ if(downtime_id == 0) { if(!error_string) error_string = strdup("Downtime id cannot be 0"); } /* find the downtime entry */ if(cmd == CMD_DEL_HOST_DOWNTIME) temp_downtime = find_host_downtime(downtime_id); else temp_downtime = find_service_downtime(downtime_id); /* see if the user is authorized to issue a command... */ if(cmd == CMD_DEL_HOST_DOWNTIME && temp_downtime != NULL) { temp_host = find_host(temp_downtime->host_name); if(is_authorized_for_host_commands(temp_host, ¤t_authdata) == TRUE) authorized = TRUE; } if(cmd == CMD_DEL_SVC_DOWNTIME && temp_downtime != NULL) { temp_service = find_service(temp_downtime->host_name, temp_downtime->service_description); if(is_authorized_for_service_commands(temp_service, ¤t_authdata) == TRUE) authorized = TRUE; } /* free downtime data */ free_downtime_data(); break; case CMD_SCHEDULE_SVC_CHECK: case CMD_ENABLE_SVC_CHECK: case CMD_DISABLE_SVC_CHECK: case CMD_DEL_ALL_SVC_COMMENTS: case CMD_ENABLE_SVC_NOTIFICATIONS: case CMD_DISABLE_SVC_NOTIFICATIONS: case CMD_ENABLE_PASSIVE_SVC_CHECKS: case CMD_DISABLE_PASSIVE_SVC_CHECKS: case CMD_ENABLE_SVC_EVENT_HANDLER: case CMD_DISABLE_SVC_EVENT_HANDLER: case CMD_REMOVE_SVC_ACKNOWLEDGEMENT: case CMD_PROCESS_SERVICE_CHECK_RESULT: case CMD_SCHEDULE_SVC_DOWNTIME: case CMD_DELAY_SVC_NOTIFICATION: case CMD_ENABLE_SVC_FLAP_DETECTION: case CMD_DISABLE_SVC_FLAP_DETECTION: case CMD_START_OBSESSING_OVER_SVC: case CMD_STOP_OBSESSING_OVER_SVC: case CMD_CLEAR_SVC_FLAPPING_STATE: /* make sure we have author name and comment data... */ if(cmd == CMD_SCHEDULE_SVC_DOWNTIME) { if(!strcmp(comment_data, "")) { if(!error_string) error_string = strdup("Comment was not entered"); } else if(!strcmp(comment_author, "")) { if(!error_string) error_string = strdup("Author was not entered"); } } /* see if the user is authorized to issue a command... */ temp_service = find_service(host_name, service_desc); if(is_authorized_for_service_commands(temp_service, ¤t_authdata) == TRUE) authorized = TRUE; /* make sure we have passive check info (if necessary) */ if(cmd == CMD_PROCESS_SERVICE_CHECK_RESULT && !strcmp(plugin_output, "")) { if(!error_string) error_string = strdup("Plugin output cannot be blank"); } /* make sure we have a notification delay (if necessary) */ if(cmd == CMD_DELAY_SVC_NOTIFICATION && notification_delay <= 0) { if(!error_string) error_string = strdup("Notification delay must be greater than 0"); } /* clean up the comment data if scheduling downtime */ if(cmd == CMD_SCHEDULE_SVC_DOWNTIME) { clean_comment_data(comment_author); clean_comment_data(comment_data); } /* make sure we have check time (if necessary) */ if(cmd == CMD_SCHEDULE_SVC_CHECK && start_time == (time_t)0) { if(!error_string) error_string = strdup("Start time must be non-zero or bad format has been submitted."); } /* make sure we have start/end times for downtime (if necessary) */ if(cmd == CMD_SCHEDULE_SVC_DOWNTIME && (start_time == (time_t)0 || end_time == (time_t)0 || end_time < start_time)) { if(!error_string) error_string = strdup("Start or end time not valid"); } break; case CMD_ENABLE_NOTIFICATIONS: case CMD_DISABLE_NOTIFICATIONS: case CMD_SHUTDOWN_PROCESS: case CMD_RESTART_PROCESS: case CMD_START_EXECUTING_SVC_CHECKS: case CMD_STOP_EXECUTING_SVC_CHECKS: case CMD_START_ACCEPTING_PASSIVE_SVC_CHECKS: case CMD_STOP_ACCEPTING_PASSIVE_SVC_CHECKS: case CMD_ENABLE_EVENT_HANDLERS: case CMD_DISABLE_EVENT_HANDLERS: case CMD_START_OBSESSING_OVER_SVC_CHECKS: case CMD_STOP_OBSESSING_OVER_SVC_CHECKS: case CMD_ENABLE_FLAP_DETECTION: case CMD_DISABLE_FLAP_DETECTION: case CMD_ENABLE_PERFORMANCE_DATA: case CMD_DISABLE_PERFORMANCE_DATA: case CMD_START_EXECUTING_HOST_CHECKS: case CMD_STOP_EXECUTING_HOST_CHECKS: case CMD_START_ACCEPTING_PASSIVE_HOST_CHECKS: case CMD_STOP_ACCEPTING_PASSIVE_HOST_CHECKS: case CMD_START_OBSESSING_OVER_HOST_CHECKS: case CMD_STOP_OBSESSING_OVER_HOST_CHECKS: /* see if the user is authorized to issue a command... */ if(is_authorized_for_system_commands(¤t_authdata) == TRUE) authorized = TRUE; break; case CMD_ENABLE_HOST_SVC_CHECKS: case CMD_DISABLE_HOST_SVC_CHECKS: case CMD_DEL_ALL_HOST_COMMENTS: case CMD_SCHEDULE_HOST_SVC_CHECKS: case CMD_ENABLE_HOST_NOTIFICATIONS: case CMD_DISABLE_HOST_NOTIFICATIONS: case CMD_ENABLE_ALL_NOTIFICATIONS_BEYOND_HOST: case CMD_DISABLE_ALL_NOTIFICATIONS_BEYOND_HOST: case CMD_ENABLE_HOST_SVC_NOTIFICATIONS: case CMD_DISABLE_HOST_SVC_NOTIFICATIONS: case CMD_ENABLE_HOST_EVENT_HANDLER: case CMD_DISABLE_HOST_EVENT_HANDLER: case CMD_ENABLE_HOST_CHECK: case CMD_DISABLE_HOST_CHECK: case CMD_REMOVE_HOST_ACKNOWLEDGEMENT: case CMD_SCHEDULE_HOST_DOWNTIME: case CMD_SCHEDULE_HOST_SVC_DOWNTIME: case CMD_DELAY_HOST_NOTIFICATION: case CMD_ENABLE_HOST_FLAP_DETECTION: case CMD_DISABLE_HOST_FLAP_DETECTION: case CMD_PROCESS_HOST_CHECK_RESULT: case CMD_ENABLE_PASSIVE_HOST_CHECKS: case CMD_DISABLE_PASSIVE_HOST_CHECKS: case CMD_SCHEDULE_HOST_CHECK: case CMD_START_OBSESSING_OVER_HOST: case CMD_STOP_OBSESSING_OVER_HOST: case CMD_CLEAR_HOST_FLAPPING_STATE: /* make sure we have author name and comment data... */ if(cmd == CMD_SCHEDULE_HOST_DOWNTIME || cmd == CMD_SCHEDULE_HOST_SVC_DOWNTIME) { if(!strcmp(comment_data, "")) { if(!error_string) error_string = strdup("Comment was not entered"); } else if(!strcmp(comment_author, "")) { if(!error_string) error_string = strdup("Author was not entered"); } } /* see if the user is authorized to issue a command... */ temp_host = find_host(host_name); if(is_authorized_for_host_commands(temp_host, ¤t_authdata) == TRUE) authorized = TRUE; /* clean up the comment data if scheduling downtime */ if(cmd == CMD_SCHEDULE_HOST_DOWNTIME || cmd == CMD_SCHEDULE_HOST_SVC_DOWNTIME) { clean_comment_data(comment_author); clean_comment_data(comment_data); } /* make sure we have a notification delay (if necessary) */ if(cmd == CMD_DELAY_HOST_NOTIFICATION && notification_delay <= 0) { if(!error_string) error_string = strdup("Notification delay must be greater than 0"); } /* make sure we have start/end times for downtime (if necessary) */ if((cmd == CMD_SCHEDULE_HOST_DOWNTIME || cmd == CMD_SCHEDULE_HOST_SVC_DOWNTIME) && (start_time == (time_t)0 || end_time == (time_t)0 || start_time > end_time)) { if(!error_string) error_string = strdup("Start or end time not valid"); } /* make sure we have check time (if necessary) */ if((cmd == CMD_SCHEDULE_HOST_CHECK || cmd == CMD_SCHEDULE_HOST_SVC_CHECKS) && start_time == (time_t)0) { if(!error_string) error_string = strdup("Start time must be non-zero or bad format has been submitted."); } /* make sure we have passive check info (if necessary) */ if(cmd == CMD_PROCESS_HOST_CHECK_RESULT && !strcmp(plugin_output, "")) { if(!error_string) error_string = strdup("Plugin output cannot be blank"); } break; case CMD_ENABLE_HOSTGROUP_SVC_NOTIFICATIONS: case CMD_DISABLE_HOSTGROUP_SVC_NOTIFICATIONS: case CMD_ENABLE_HOSTGROUP_HOST_NOTIFICATIONS: case CMD_DISABLE_HOSTGROUP_HOST_NOTIFICATIONS: case CMD_ENABLE_HOSTGROUP_SVC_CHECKS: case CMD_DISABLE_HOSTGROUP_SVC_CHECKS: case CMD_SCHEDULE_HOSTGROUP_HOST_DOWNTIME: case CMD_SCHEDULE_HOSTGROUP_SVC_DOWNTIME: /* make sure we have author and comment data */ if(cmd == CMD_SCHEDULE_HOSTGROUP_HOST_DOWNTIME || cmd == CMD_SCHEDULE_HOSTGROUP_SVC_DOWNTIME) { if(!strcmp(comment_data, "")) { if(!error_string) error_string = strdup("Comment was not entered"); } else if(!strcmp(comment_author, "")) { if(!error_string) error_string = strdup("Author was not entered"); } } /* make sure we have start/end times for downtime */ if((cmd == CMD_SCHEDULE_HOSTGROUP_HOST_DOWNTIME || cmd == CMD_SCHEDULE_HOSTGROUP_SVC_DOWNTIME) && (start_time == (time_t)0 || end_time == (time_t)0 || start_time > end_time)) { if(!error_string) error_string = strdup("Start or end time not valid"); } /* see if the user is authorized to issue a command... */ temp_hostgroup = find_hostgroup(hostgroup_name); if(is_authorized_for_hostgroup_commands(temp_hostgroup, ¤t_authdata) == TRUE) authorized = TRUE; /* clean up the comment data if scheduling downtime */ if(cmd == CMD_SCHEDULE_HOSTGROUP_HOST_DOWNTIME || cmd == CMD_SCHEDULE_HOSTGROUP_SVC_DOWNTIME) { clean_comment_data(comment_author); clean_comment_data(comment_data); } break; case CMD_ENABLE_SERVICEGROUP_SVC_NOTIFICATIONS: case CMD_DISABLE_SERVICEGROUP_SVC_NOTIFICATIONS: case CMD_ENABLE_SERVICEGROUP_HOST_NOTIFICATIONS: case CMD_DISABLE_SERVICEGROUP_HOST_NOTIFICATIONS: case CMD_ENABLE_SERVICEGROUP_SVC_CHECKS: case CMD_DISABLE_SERVICEGROUP_SVC_CHECKS: case CMD_SCHEDULE_SERVICEGROUP_HOST_DOWNTIME: case CMD_SCHEDULE_SERVICEGROUP_SVC_DOWNTIME: /* make sure we have author and comment data */ if(cmd == CMD_SCHEDULE_SERVICEGROUP_HOST_DOWNTIME || cmd == CMD_SCHEDULE_SERVICEGROUP_SVC_DOWNTIME) { if(!strcmp(comment_data, "")) { if(!error_string) error_string = strdup("Comment was not entered"); } else if(!strcmp(comment_author, "")) { if(!error_string) error_string = strdup("Author was not entered"); } } /* make sure we have start/end times for downtime */ if((cmd == CMD_SCHEDULE_SERVICEGROUP_HOST_DOWNTIME || cmd == CMD_SCHEDULE_SERVICEGROUP_SVC_DOWNTIME) && (start_time == (time_t)0 || end_time == (time_t)0 || start_time > end_time)) { if(!error_string) error_string = strdup("Start or end time not valid"); } /* see if the user is authorized to issue a command... */ temp_servicegroup = find_servicegroup(servicegroup_name); if(is_authorized_for_servicegroup_commands(temp_servicegroup, ¤t_authdata) == TRUE) authorized = TRUE; break; case CMD_SEND_CUSTOM_HOST_NOTIFICATION: case CMD_SEND_CUSTOM_SVC_NOTIFICATION: /* make sure we have author and comment data */ if(!strcmp(comment_data, "")) { if(!error_string) error_string = strdup("Comment was not entered"); } else if(!strcmp(comment_author, "")) { if(!error_string) error_string = strdup("Author was not entered"); } /* see if the user is authorized to issue a command... */ if(cmd == CMD_SEND_CUSTOM_HOST_NOTIFICATION) { temp_host = find_host(host_name); if(is_authorized_for_host_commands(temp_host, ¤t_authdata) == TRUE) authorized = TRUE; } else { temp_service = find_service(host_name, service_desc); if(is_authorized_for_service_commands(temp_service, ¤t_authdata) == TRUE) authorized = TRUE; } break; default: if(!error_string) error_string = strdup("An error occurred while processing your command!"); } /* to be safe, we are going to REQUIRE that the authentication functionality is enabled... */ if(use_authentication == FALSE) { if(content_type == WML_CONTENT) printf("

    Error: Authentication is not enabled!

    \n"); else { printf("

    \n"); printf("

    Sorry Dave, I can't let you do that...

    "); printf("
    "); printf("It seems that you have chosen to not use the authentication functionality of the CGIs.

    "); printf("I don't want to be personally responsible for what may happen as a result of allowing unauthorized users to issue commands to Nagios,"); printf("so you'll have to disable this safeguard if you are really stubborn and want to invite trouble.

    "); printf("Read the section on CGI authentication in the HTML documentation to learn how you can enable authentication and why you should want to.\n"); printf("
    \n"); printf("

    \n"); } } /* the user is not authorized to issue the given command */ else if(authorized == FALSE) { if(content_type == WML_CONTENT) printf("

    Error: You're not authorized to commit that command!

    \n"); else { printf("

    Sorry, but you are not authorized to commit the specified command.

    \n"); printf("

    Read the section of the documentation that deals with authentication and authorization in the CGIs for more information.

    \n"); printf("Return from whence you came

    \n"); } } /* some error occurred (data was probably missing) */ else if(error_string) { if(content_type == WML_CONTENT) printf("

    %s

    \n", error_string); else { printf("

    %s

    \n", error_string); free(error_string); printf("

    Go back and verify that you entered all required information correctly.
    \n"); printf("Return from whence you came

    \n"); } } /* if Nagios isn't checking external commands, don't do anything... */ else if(check_external_commands == FALSE) { if(content_type == WML_CONTENT) printf("

    Error: Nagios is not checking external commands!

    \n"); else { printf("

    Sorry, but Nagios is currently not checking for external commands, so your command will not be committed!

    \n"); printf("

    Read the documentation for information on how to enable external commands...

    \n"); printf("Return from whence you came

    \n"); } } /* everything looks okay, so let's go ahead and commit the command... */ else { /* commit the command */ result = commit_command(cmd); if(result == OK) { if(content_type == WML_CONTENT) printf("

    Your command was submitted successfully...

    \n"); else { printf("

    Your command request was successfully submitted to Nagios for processing.

    \n"); printf("Note: It may take a while before the command is actually processed.

    \n"); printf("Done

    "); } } else { if(content_type == WML_CONTENT) printf("

    An error occurred while committing your command!

    \n"); else { printf("

    An error occurred while attempting to commit your command for processing.

    \n"); printf("Return from whence you came

    \n"); } } } return; } __attribute__((format(printf, 2, 3))) static int cmd_submitf(int id, const char *fmt, ...) { char cmd[MAX_EXTERNAL_COMMAND_LENGTH]; const char *command_name; int len; int len2; va_list ap; command_name = extcmd_get_name(id); /* * We disallow sending 'CHANGE' commands from the cgi's * until we do proper session handling to prevent cross-site * request forgery */ if(!command_name || (strlen(command_name) > 6 && !memcmp("CHANGE", command_name, 6))) return ERROR; len = snprintf(cmd, sizeof(cmd), "[%lu] %s;", time(NULL), command_name); if(len < 0 || len >= sizeof(cmd)) return ERROR; if(fmt) { va_start(ap, fmt); len2 = vsnprintf(cmd + len, sizeof(cmd) - len, fmt, ap); va_end(ap); len += len2; if(len2 < 0 || len >= sizeof(cmd)) return ERROR; } cmd[len] = 0; /* 0 <= len < sizeof(cmd) */ return write_command_to_file(cmd); } /* commits a command for processing */ int commit_command(int cmd) { time_t current_time; time_t scheduled_time; time_t notification_time; int result; /* get the current time */ time(¤t_time); /* get the scheduled time */ scheduled_time = current_time + (schedule_delay * 60); /* get the notification time */ notification_time = current_time + (notification_delay * 60); /* * these are supposed to be implanted inside the * completed commands shipped off to nagios and * must therefore never contain ';' */ if(host_name && strchr(host_name, ';')) return ERROR; if(service_desc && strchr(service_desc, ';')) return ERROR; if(comment_author && strchr(comment_author, ';')) return ERROR; if(hostgroup_name && strchr(hostgroup_name, ';')) return ERROR; if(servicegroup_name && strchr(servicegroup_name, ';')) return ERROR; /* decide how to form the command line... */ switch(cmd) { /* commands without arguments */ case CMD_START_EXECUTING_SVC_CHECKS: case CMD_STOP_EXECUTING_SVC_CHECKS: case CMD_START_ACCEPTING_PASSIVE_SVC_CHECKS: case CMD_STOP_ACCEPTING_PASSIVE_SVC_CHECKS: case CMD_ENABLE_EVENT_HANDLERS: case CMD_DISABLE_EVENT_HANDLERS: case CMD_START_OBSESSING_OVER_SVC_CHECKS: case CMD_STOP_OBSESSING_OVER_SVC_CHECKS: case CMD_ENABLE_FLAP_DETECTION: case CMD_DISABLE_FLAP_DETECTION: case CMD_ENABLE_PERFORMANCE_DATA: case CMD_DISABLE_PERFORMANCE_DATA: case CMD_START_EXECUTING_HOST_CHECKS: case CMD_STOP_EXECUTING_HOST_CHECKS: case CMD_START_ACCEPTING_PASSIVE_HOST_CHECKS: case CMD_STOP_ACCEPTING_PASSIVE_HOST_CHECKS: case CMD_START_OBSESSING_OVER_HOST_CHECKS: case CMD_STOP_OBSESSING_OVER_HOST_CHECKS: result = cmd_submitf(cmd, NULL); break; /** simple host commands **/ case CMD_ENABLE_HOST_FLAP_DETECTION: case CMD_DISABLE_HOST_FLAP_DETECTION: case CMD_ENABLE_PASSIVE_HOST_CHECKS: case CMD_DISABLE_PASSIVE_HOST_CHECKS: case CMD_START_OBSESSING_OVER_HOST: case CMD_STOP_OBSESSING_OVER_HOST: case CMD_DEL_ALL_HOST_COMMENTS: case CMD_ENABLE_ALL_NOTIFICATIONS_BEYOND_HOST: case CMD_DISABLE_ALL_NOTIFICATIONS_BEYOND_HOST: case CMD_ENABLE_HOST_EVENT_HANDLER: case CMD_DISABLE_HOST_EVENT_HANDLER: case CMD_ENABLE_HOST_CHECK: case CMD_DISABLE_HOST_CHECK: case CMD_REMOVE_HOST_ACKNOWLEDGEMENT: case CMD_CLEAR_HOST_FLAPPING_STATE: result = cmd_submitf(cmd, "%s", host_name); break; /** simple service commands **/ case CMD_ENABLE_SVC_FLAP_DETECTION: case CMD_DISABLE_SVC_FLAP_DETECTION: case CMD_ENABLE_PASSIVE_SVC_CHECKS: case CMD_DISABLE_PASSIVE_SVC_CHECKS: case CMD_START_OBSESSING_OVER_SVC: case CMD_STOP_OBSESSING_OVER_SVC: case CMD_DEL_ALL_SVC_COMMENTS: case CMD_ENABLE_SVC_NOTIFICATIONS: case CMD_DISABLE_SVC_NOTIFICATIONS: case CMD_ENABLE_SVC_EVENT_HANDLER: case CMD_DISABLE_SVC_EVENT_HANDLER: case CMD_ENABLE_SVC_CHECK: case CMD_DISABLE_SVC_CHECK: case CMD_REMOVE_SVC_ACKNOWLEDGEMENT: case CMD_CLEAR_SVC_FLAPPING_STATE: result = cmd_submitf(cmd, "%s;%s", host_name, service_desc); break; case CMD_ADD_HOST_COMMENT: result = cmd_submitf(cmd, "%s;%d;%s;%s", host_name, persistent_comment, comment_author, comment_data); break; case CMD_ADD_SVC_COMMENT: result = cmd_submitf(cmd, "%s;%s;%d;%s;%s", host_name, service_desc, persistent_comment, comment_author, comment_data); break; case CMD_DEL_HOST_COMMENT: case CMD_DEL_SVC_COMMENT: result = cmd_submitf(cmd, "%lu", comment_id); break; case CMD_DELAY_HOST_NOTIFICATION: result = cmd_submitf(cmd, "%s;%lu", host_name, notification_time); break; case CMD_DELAY_SVC_NOTIFICATION: result = cmd_submitf(cmd, "%s;%s;%lu", host_name, service_desc, notification_time); break; case CMD_SCHEDULE_SVC_CHECK: case CMD_SCHEDULE_FORCED_SVC_CHECK: if(force_check == TRUE) cmd = CMD_SCHEDULE_FORCED_SVC_CHECK; result = cmd_submitf(cmd, "%s;%s;%lu", host_name, service_desc, start_time); break; case CMD_DISABLE_NOTIFICATIONS: case CMD_ENABLE_NOTIFICATIONS: case CMD_SHUTDOWN_PROCESS: case CMD_RESTART_PROCESS: result = cmd_submitf(cmd, "%lu", scheduled_time); break; case CMD_ENABLE_HOST_SVC_CHECKS: case CMD_DISABLE_HOST_SVC_CHECKS: result = cmd_submitf(cmd, "%s", host_name); if(affect_host_and_services == TRUE) { cmd = (cmd == CMD_ENABLE_HOST_SVC_CHECKS) ? CMD_ENABLE_HOST_CHECK : CMD_DISABLE_HOST_CHECK; result |= cmd_submitf(cmd, "%s", host_name); } break; case CMD_SCHEDULE_HOST_SVC_CHECKS: if(force_check == TRUE) cmd = CMD_SCHEDULE_FORCED_HOST_SVC_CHECKS; result = cmd_submitf(cmd, "%s;%lu", host_name, scheduled_time); break; case CMD_ENABLE_HOST_NOTIFICATIONS: case CMD_DISABLE_HOST_NOTIFICATIONS: if(propagate_to_children == TRUE) cmd = (cmd == CMD_ENABLE_HOST_NOTIFICATIONS) ? CMD_ENABLE_HOST_AND_CHILD_NOTIFICATIONS : CMD_DISABLE_HOST_AND_CHILD_NOTIFICATIONS; result = cmd_submitf(cmd, "%s", host_name); break; case CMD_ENABLE_HOST_SVC_NOTIFICATIONS: case CMD_DISABLE_HOST_SVC_NOTIFICATIONS: result = cmd_submitf(cmd, "%s", host_name); if(affect_host_and_services == TRUE) { cmd = (cmd == CMD_ENABLE_HOST_SVC_NOTIFICATIONS) ? CMD_ENABLE_HOST_NOTIFICATIONS : CMD_DISABLE_HOST_NOTIFICATIONS; result |= cmd_submitf(cmd, "%s", host_name); } break; case CMD_ACKNOWLEDGE_HOST_PROBLEM: result = cmd_submitf(cmd, "%s;%d;%d;%d;%s;%s", host_name, (sticky_ack == TRUE) ? ACKNOWLEDGEMENT_STICKY : ACKNOWLEDGEMENT_NORMAL, send_notification, persistent_comment, comment_author, comment_data); break; case CMD_ACKNOWLEDGE_SVC_PROBLEM: result = cmd_submitf(cmd, "%s;%s;%d;%d;%d;%s;%s", host_name, service_desc, (sticky_ack == TRUE) ? ACKNOWLEDGEMENT_STICKY : ACKNOWLEDGEMENT_NORMAL, send_notification, persistent_comment, comment_author, comment_data); break; case CMD_PROCESS_SERVICE_CHECK_RESULT: result = cmd_submitf(cmd, "%s;%s;%d;%s|%s", host_name, service_desc, plugin_state, plugin_output, performance_data); break; case CMD_PROCESS_HOST_CHECK_RESULT: result = cmd_submitf(cmd, "%s;%d;%s|%s", host_name, plugin_state, plugin_output, performance_data); break; case CMD_SCHEDULE_HOST_DOWNTIME: if(child_options == 1) cmd = CMD_SCHEDULE_AND_PROPAGATE_TRIGGERED_HOST_DOWNTIME; else if(child_options == 2) cmd = CMD_SCHEDULE_AND_PROPAGATE_HOST_DOWNTIME; result = cmd_submitf(cmd, "%s;%lu;%lu;%d;%lu;%lu;%s;%s", host_name, start_time, end_time, fixed, triggered_by, duration, comment_author, comment_data); break; case CMD_SCHEDULE_HOST_SVC_DOWNTIME: result = cmd_submitf(cmd, "%s;%lu;%lu;%d;%lu;%lu;%s;%s", host_name, start_time, end_time, fixed, triggered_by, duration, comment_author, comment_data); break; case CMD_SCHEDULE_SVC_DOWNTIME: result = cmd_submitf(cmd, "%s;%s;%lu;%lu;%d;%lu;%lu;%s;%s", host_name, service_desc, start_time, end_time, fixed, triggered_by, duration, comment_author, comment_data); break; case CMD_DEL_HOST_DOWNTIME: case CMD_DEL_SVC_DOWNTIME: result = cmd_submitf(cmd, "%lu", downtime_id); break; case CMD_SCHEDULE_HOST_CHECK: if(force_check == TRUE) cmd = CMD_SCHEDULE_FORCED_HOST_CHECK; result = cmd_submitf(cmd, "%s;%lu", host_name, start_time); break; case CMD_SEND_CUSTOM_HOST_NOTIFICATION: result = cmd_submitf(cmd, "%s;%d;%s;%s", host_name, (force_notification | broadcast_notification), comment_author, comment_data); break; case CMD_SEND_CUSTOM_SVC_NOTIFICATION: result = cmd_submitf(cmd, "%s;%s;%d;%s;%s", host_name, service_desc, (force_notification | broadcast_notification), comment_author, comment_data); break; /***** HOSTGROUP COMMANDS *****/ case CMD_ENABLE_HOSTGROUP_SVC_NOTIFICATIONS: case CMD_DISABLE_HOSTGROUP_SVC_NOTIFICATIONS: result = cmd_submitf(cmd, "%s", hostgroup_name); if(affect_host_and_services == TRUE) { cmd = (cmd == CMD_ENABLE_HOSTGROUP_SVC_NOTIFICATIONS) ? CMD_ENABLE_HOSTGROUP_HOST_NOTIFICATIONS : CMD_DISABLE_HOSTGROUP_HOST_NOTIFICATIONS; result |= cmd_submitf(cmd, "%s", hostgroup_name); } break; case CMD_ENABLE_HOSTGROUP_HOST_NOTIFICATIONS: case CMD_DISABLE_HOSTGROUP_HOST_NOTIFICATIONS: result = cmd_submitf(cmd, "%s", hostgroup_name); break; case CMD_ENABLE_HOSTGROUP_SVC_CHECKS: case CMD_DISABLE_HOSTGROUP_SVC_CHECKS: result = cmd_submitf(cmd, "%s", hostgroup_name); if(affect_host_and_services == TRUE) { cmd = (cmd == CMD_ENABLE_HOSTGROUP_SVC_CHECKS) ? CMD_ENABLE_HOSTGROUP_HOST_CHECKS : CMD_DISABLE_HOSTGROUP_HOST_CHECKS; result |= cmd_submitf(cmd, "%s", hostgroup_name); } break; case CMD_SCHEDULE_HOSTGROUP_HOST_DOWNTIME: result = cmd_submitf(cmd, "%s;%lu;%lu;%d;0;%lu;%s;%s", hostgroup_name, start_time, end_time, fixed, duration, comment_author, comment_data); break; case CMD_SCHEDULE_HOSTGROUP_SVC_DOWNTIME: result = cmd_submitf(cmd, "%s;%lu;%lu;%d;0;%lu;%s;%s", hostgroup_name, start_time, end_time, fixed, duration, comment_author, comment_data); if(affect_host_and_services == TRUE) result |= cmd_submitf(CMD_SCHEDULE_HOSTGROUP_HOST_DOWNTIME, "%s;%lu;%lu;%d;0;%lu;%s;%s", hostgroup_name, start_time, end_time, fixed, duration, comment_author, comment_data); break; /***** SERVICEGROUP COMMANDS *****/ case CMD_ENABLE_SERVICEGROUP_SVC_NOTIFICATIONS: case CMD_DISABLE_SERVICEGROUP_SVC_NOTIFICATIONS: result = cmd_submitf(cmd, "%s", servicegroup_name); if(affect_host_and_services == TRUE) { cmd = (cmd == CMD_ENABLE_SERVICEGROUP_SVC_NOTIFICATIONS) ? CMD_ENABLE_SERVICEGROUP_HOST_NOTIFICATIONS : CMD_DISABLE_SERVICEGROUP_HOST_NOTIFICATIONS; result |= cmd_submitf(cmd, "%s", servicegroup_name); } break; case CMD_ENABLE_SERVICEGROUP_HOST_NOTIFICATIONS: case CMD_DISABLE_SERVICEGROUP_HOST_NOTIFICATIONS: result = cmd_submitf(cmd, "%s", servicegroup_name); break; case CMD_ENABLE_SERVICEGROUP_SVC_CHECKS: case CMD_DISABLE_SERVICEGROUP_SVC_CHECKS: result = cmd_submitf(cmd, "%s", servicegroup_name); if(affect_host_and_services == TRUE) { cmd = (cmd == CMD_ENABLE_SERVICEGROUP_SVC_CHECKS) ? CMD_ENABLE_SERVICEGROUP_HOST_CHECKS : CMD_DISABLE_SERVICEGROUP_HOST_CHECKS; result |= cmd_submitf(cmd, "%s", servicegroup_name); } break; case CMD_SCHEDULE_SERVICEGROUP_HOST_DOWNTIME: result = cmd_submitf(cmd, "%s;%lu;%lu;%d;0;%lu;%s;%s", servicegroup_name, start_time, end_time, fixed, duration, comment_author, comment_data); break; case CMD_SCHEDULE_SERVICEGROUP_SVC_DOWNTIME: result = cmd_submitf(cmd, "%s;%lu;%lu;%d;0;%lu;%s;%s", servicegroup_name, start_time, end_time, fixed, duration, comment_author, comment_data); if(affect_host_and_services == TRUE) result |= cmd_submitf(CMD_SCHEDULE_SERVICEGROUP_HOST_DOWNTIME, "%s;%lu;%lu;%d;0;%lu;%s;%s", servicegroup_name, start_time, end_time, fixed, duration, comment_author, comment_data); break; default: return ERROR; break; } return result; } /* write a command entry to the command file */ int write_command_to_file(char *cmd) { FILE *fp; struct stat statbuf; /* * Commands are not allowed to have newlines in them, as * that allows malicious users to hand-craft requests that * bypass the access-restrictions. */ if(!cmd || !*cmd || strchr(cmd, '\n')) return ERROR; /* bail out if the external command file doesn't exist */ if(stat(command_file, &statbuf)) { if(content_type == WML_CONTENT) printf("

    Error: Could not stat() external command file!

    \n"); else { printf("

    Error: Could not stat() command file '%s'!

    \n", command_file); printf("

    "); printf("The external command file may be missing, Nagios may not be running, and/or Nagios may not be checking external commands.\n"); printf("

    \n"); } return ERROR; } /* open the command for writing (since this is a pipe, it will really be appended) */ fp = fopen(command_file, "w"); if(fp == NULL) { if(content_type == WML_CONTENT) printf("

    Error: Could not open command file for update!

    \n"); else { printf("

    Error: Could not open command file '%s' for update!

    \n", command_file); printf("

    "); printf("The permissions on the external command file and/or directory may be incorrect. Read the FAQs on how to setup proper permissions.\n"); printf("

    \n"); } return ERROR; } /* write the command to file */ fprintf(fp, "%s\n", cmd); /* flush buffer */ fflush(fp); fclose(fp); return OK; } /* strips out semicolons from comment data */ void clean_comment_data(char *buffer) { int x; int y; y = (int)strlen(buffer); for(x = 0; x < y; x++) { if(buffer[x] == ';') buffer[x] = ' '; } return; } /* display information about a command */ void show_command_help(int cmd) { printf("
    Command Description
    \n"); printf("\n"); printf("\n"); printf("
    \n"); /* decide what information to print out... */ switch(cmd) { case CMD_ADD_HOST_COMMENT: printf("This command is used to add a comment for the specified host. If you work with other administrators, you may find it useful to share information about a host\n"); printf("that is having problems if more than one of you may be working on it. If you do not check the 'persistent' option, the comment will be automatically be deleted\n"); printf("the next time Nagios is restarted.\n"); break; case CMD_ADD_SVC_COMMENT: printf("This command is used to add a comment for the specified service. If you work with other administrators, you may find it useful to share information about a host\n"); printf("or service that is having problems if more than one of you may be working on it. If you do not check the 'persistent' option, the comment will automatically be\n"); printf("deleted the next time Nagios is restarted.\n"); break; case CMD_DEL_HOST_COMMENT: printf("This command is used to delete a specific host comment.\n"); break; case CMD_DEL_SVC_COMMENT: printf("This command is used to delete a specific service comment.\n"); break; case CMD_DELAY_HOST_NOTIFICATION: printf("This command is used to delay the next problem notification that is sent out for the specified host. The notification delay will be disregarded if\n"); printf("the host changes state before the next notification is scheduled to be sent out. This command has no effect if the host is currently UP.\n"); break; case CMD_DELAY_SVC_NOTIFICATION: printf("This command is used to delay the next problem notification that is sent out for the specified service. The notification delay will be disregarded if\n"); printf("the service changes state before the next notification is scheduled to be sent out. This command has no effect if the service is currently in an OK state.\n"); break; case CMD_SCHEDULE_SVC_CHECK: printf("This command is used to schedule the next check of a particular service. Nagios will re-queue the service to be checked at the time you specify.\n"); printf("If you select the force check option, Nagios will force a check of the service regardless of both what time the scheduled check occurs and whether or not checks are enabled for the service.\n"); break; case CMD_ENABLE_SVC_CHECK: printf("This command is used to enable active checks of a service.\n"); break; case CMD_DISABLE_SVC_CHECK: printf("This command is used to disable active checks of a service.\n"); break; case CMD_DISABLE_NOTIFICATIONS: printf("This command is used to disable host and service notifications on a program-wide basis.\n"); break; case CMD_ENABLE_NOTIFICATIONS: printf("This command is used to enable host and service notifications on a program-wide basis.\n"); break; case CMD_SHUTDOWN_PROCESS: printf("This command is used to shutdown the Nagios process. Note: Once the Nagios has been shutdown, it cannot be restarted via the web interface!\n"); break; case CMD_RESTART_PROCESS: printf("This command is used to restart the Nagios process. Executing a restart command is equivalent to sending the process a HUP signal.\n"); printf("All information will be flushed from memory, the configuration files will be re-read, and Nagios will start monitoring with the new configuration information.\n"); break; case CMD_ENABLE_HOST_SVC_CHECKS: printf("This command is used to enable active checks of all services associated with the specified host. This does not enable checks of the host unless you check the 'Enable for host too' option.\n"); break; case CMD_DISABLE_HOST_SVC_CHECKS: printf("This command is used to disable active checks of all services associated with the specified host. When a service is disabled Nagios will not monitor the service. Doing this will prevent any notifications being sent out for\n"); printf("the specified service while it is disabled. In order to have Nagios check the service in the future you will have to re-enable the service.\n"); printf("Note that disabling service checks may not necessarily prevent notifications from being sent out about the host which those services are associated with. This does not disable checks of the host unless you check the 'Disable for host too' option.\n"); break; case CMD_SCHEDULE_HOST_SVC_CHECKS: printf("This command is used to scheduled the next check of all services on the specified host. If you select the force check option, Nagios will force a check of all services on the host regardless of both what time the scheduled checks occur and whether or not checks are enabled for those services.\n"); break; case CMD_DEL_ALL_HOST_COMMENTS: printf("This command is used to delete all comments associated with the specified host.\n"); break; case CMD_DEL_ALL_SVC_COMMENTS: printf("This command is used to delete all comments associated with the specified service.\n"); break; case CMD_ENABLE_SVC_NOTIFICATIONS: printf("This command is used to enable notifications for the specified service. Notifications will only be sent out for the\n"); printf("service state types you defined in your service definition.\n"); break; case CMD_DISABLE_SVC_NOTIFICATIONS: printf("This command is used to prevent notifications from being sent out for the specified service. You will have to re-enable notifications\n"); printf("for this service before any alerts can be sent out in the future.\n"); break; case CMD_ENABLE_HOST_NOTIFICATIONS: printf("This command is used to enable notifications for the specified host. Notifications will only be sent out for the\n"); printf("host state types you defined in your host definition. Note that this command does not enable notifications\n"); printf("for services associated with this host.\n"); break; case CMD_DISABLE_HOST_NOTIFICATIONS: printf("This command is used to prevent notifications from being sent out for the specified host. You will have to re-enable notifications for this host\n"); printf("before any alerts can be sent out in the future. Note that this command does not disable notifications for services associated with this host.\n"); break; case CMD_ENABLE_ALL_NOTIFICATIONS_BEYOND_HOST: printf("This command is used to enable notifications for all hosts and services that lie \"beyond\" the specified host\n"); printf("(from the view of Nagios).\n"); break; case CMD_DISABLE_ALL_NOTIFICATIONS_BEYOND_HOST: printf("This command is used to temporarily prevent notifications from being sent out for all hosts and services that lie\n"); printf("\"beyond\" the specified host (from the view of Nagios).\n"); break; case CMD_ENABLE_HOST_SVC_NOTIFICATIONS: printf("This command is used to enable notifications for all services on the specified host. Notifications will only be sent out for the\n"); printf("service state types you defined in your service definition. This does not enable notifications for the host unless you check the 'Enable for host too' option.\n"); break; case CMD_DISABLE_HOST_SVC_NOTIFICATIONS: printf("This command is used to prevent notifications from being sent out for all services on the specified host. You will have to re-enable notifications for\n"); printf("all services associated with this host before any alerts can be sent out in the future. This does not prevent notifications from being sent out about the host unless you check the 'Disable for host too' option.\n"); break; case CMD_ACKNOWLEDGE_HOST_PROBLEM: printf("This command is used to acknowledge a host problem. When a host problem is acknowledged, future notifications about problems are temporarily disabled until the host changes from its current state.\n"); printf("If you want acknowledgement to disable notifications until the host recovers, check the 'Sticky Acknowledgement' checkbox.\n"); printf("Contacts for this host will receive a notification about the acknowledgement, so they are aware that someone is working on the problem. Additionally, a comment will also be added to the host.\n"); printf("Make sure to enter your name and fill in a brief description of what you are doing in the comment field. If you would like the host comment to remain once the acknowledgement is removed, check\n"); printf("the 'Persistent Comment' checkbox. If you do not want an acknowledgement notification sent out to the appropriate contacts, uncheck the 'Send Notification' checkbox.\n"); break; case CMD_ACKNOWLEDGE_SVC_PROBLEM: printf("This command is used to acknowledge a service problem. When a service problem is acknowledged, future notifications about problems are temporarily disabled until the service changes from its current state.\n"); printf("If you want acknowledgement to disable notifications until the service recovers, check the 'Sticky Acknowledgement' checkbox.\n"); printf("Contacts for this service will receive a notification about the acknowledgement, so they are aware that someone is working on the problem. Additionally, a comment will also be added to the service.\n"); printf("Make sure to enter your name and fill in a brief description of what you are doing in the comment field. If you would like the service comment to remain once the acknowledgement is removed, check\n"); printf("the 'Persistent Comment' checkbox. If you do not want an acknowledgement notification sent out to the appropriate contacts, uncheck the 'Send Notification' checkbox.\n"); break; case CMD_START_EXECUTING_SVC_CHECKS: printf("This command is used to resume execution of active service checks on a program-wide basis. Individual services which are disabled will still not be checked.\n"); break; case CMD_STOP_EXECUTING_SVC_CHECKS: printf("This command is used to temporarily stop Nagios from actively executing any service checks. This will have the side effect of preventing any notifications from being sent out (for any and all services and hosts).\n"); printf("Service checks will not be executed again until you issue a command to resume service check execution.\n"); break; case CMD_START_ACCEPTING_PASSIVE_SVC_CHECKS: printf("This command is used to make Nagios start accepting passive service check results that it finds in the external command file\n"); break; case CMD_STOP_ACCEPTING_PASSIVE_SVC_CHECKS: printf("This command is use to make Nagios stop accepting passive service check results that it finds in the external command file. All passive check results that are found will be ignored.\n"); break; case CMD_ENABLE_PASSIVE_SVC_CHECKS: printf("This command is used to allow Nagios to accept passive service check results that it finds in the external command file for this particular service.\n"); break; case CMD_DISABLE_PASSIVE_SVC_CHECKS: printf("This command is used to stop Nagios accepting passive service check results that it finds in the external command file for this particular service. All passive check results that are found for this service will be ignored.\n"); break; case CMD_ENABLE_EVENT_HANDLERS: printf("This command is used to allow Nagios to run host and service event handlers.\n"); break; case CMD_DISABLE_EVENT_HANDLERS: printf("This command is used to temporarily prevent Nagios from running any host or service event handlers.\n"); break; case CMD_ENABLE_SVC_EVENT_HANDLER: printf("This command is used to allow Nagios to run the service event handler for a particular service when necessary (if one is defined).\n"); break; case CMD_DISABLE_SVC_EVENT_HANDLER: printf("This command is used to temporarily prevent Nagios from running the service event handler for a particular service.\n"); break; case CMD_ENABLE_HOST_EVENT_HANDLER: printf("This command is used to allow Nagios to run the host event handler for a particular service when necessary (if one is defined).\n"); break; case CMD_DISABLE_HOST_EVENT_HANDLER: printf("This command is used to temporarily prevent Nagios from running the host event handler for a particular host.\n"); break; case CMD_ENABLE_HOST_CHECK: printf("This command is used to enable active checks of this host.\n"); break; case CMD_DISABLE_HOST_CHECK: printf("This command is used to temporarily prevent Nagios from actively checking the status of a particular host. If Nagios needs to check the status of this host, it will assume that it is in the same state that it was in before checks were disabled.\n"); break; case CMD_START_OBSESSING_OVER_SVC_CHECKS: printf("This command is used to have Nagios start obsessing over service checks. Read the documentation on distributed monitoring for more information on this.\n"); break; case CMD_STOP_OBSESSING_OVER_SVC_CHECKS: printf("This command is used stop Nagios from obsessing over service checks.\n"); break; case CMD_REMOVE_HOST_ACKNOWLEDGEMENT: printf("This command is used to remove an acknowledgement for a particular host problem. Once the acknowledgement is removed, notifications may start being\n"); printf("sent out about the host problem. \n"); break; case CMD_REMOVE_SVC_ACKNOWLEDGEMENT: printf("This command is used to remove an acknowledgement for a particular service problem. Once the acknowledgement is removed, notifications may start being\n"); printf("sent out about the service problem.\n"); break; case CMD_PROCESS_SERVICE_CHECK_RESULT: printf("This command is used to submit a passive check result for a particular service. It is particularly useful for resetting security-related services to OK states once they have been dealt with.\n"); break; case CMD_PROCESS_HOST_CHECK_RESULT: printf("This command is used to submit a passive check result for a particular host.\n"); break; case CMD_SCHEDULE_HOST_DOWNTIME: printf("This command is used to schedule downtime for a particular host. During the specified downtime, Nagios will not send notifications out about the host.\n"); printf("When the scheduled downtime expires, Nagios will send out notifications for this host as it normally would. Scheduled downtimes are preserved\n"); printf("across program shutdowns and restarts. Both the start and end times should be specified in the following format: mm/dd/yyyy hh:mm:ss.\n"); printf("If you select the fixed option, the downtime will be in effect between the start and end times you specify. If you do not select the fixed\n"); printf("option, Nagios will treat this as \"flexible\" downtime. Flexible downtime starts when the host goes down or becomes unreachable (sometime between the\n"); printf("start and end times you specified) and lasts as long as the duration of time you enter. The duration fields do not apply for fixed downtime.\n"); break; case CMD_SCHEDULE_HOST_SVC_DOWNTIME: printf("This command is used to schedule downtime for all services on a particular host. During the specified downtime, Nagios will not send notifications out about the host.\n"); printf("Normally, a host in downtime will not send alerts about any services in a failed state. This option will explicitly set downtime for all services for this host.\n"); printf("When the scheduled downtime expires, Nagios will send out notifications for this host as it normally would. Scheduled downtimes are preserved\n"); printf("across program shutdowns and restarts. Both the start and end times should be specified in the following format: mm/dd/yyyy hh:mm:ss.\n"); printf("If you select the fixed option, the downtime will be in effect between the start and end times you specify. If you do not select the fixed\n"); printf("option, Nagios will treat this as \"flexible\" downtime. Flexible downtime starts when the host goes down or becomes unreachable (sometime between the\n"); printf("start and end times you specified) and lasts as long as the duration of time you enter. The duration fields do not apply for fixed downtime.\n"); break; case CMD_SCHEDULE_SVC_DOWNTIME: printf("This command is used to schedule downtime for a particular service. During the specified downtime, Nagios will not send notifications out about the service.\n"); printf("When the scheduled downtime expires, Nagios will send out notifications for this service as it normally would. Scheduled downtimes are preserved\n"); printf("across program shutdowns and restarts. Both the start and end times should be specified in the following format: mm/dd/yyyy hh:mm:ss.\n"); printf("If you select the fixed option, the downtime will be in effect between the start and end times you specify. If you do not select the fixed\n"); printf("option, Nagios will treat this as \"flexible\" downtime. Flexible downtime starts when the service enters a non-OK state (sometime between the\n"); printf("start and end times you specified) and lasts as long as the duration of time you enter. The duration fields do not apply for fixed downtime.\n"); break; case CMD_ENABLE_HOST_FLAP_DETECTION: printf("This command is used to enable flap detection for a specific host. If flap detection is disabled on a program-wide basis, this will have no effect,\n"); break; case CMD_DISABLE_HOST_FLAP_DETECTION: printf("This command is used to disable flap detection for a specific host.\n"); break; case CMD_ENABLE_SVC_FLAP_DETECTION: printf("This command is used to enable flap detection for a specific service. If flap detection is disabled on a program-wide basis, this will have no effect,\n"); break; case CMD_DISABLE_SVC_FLAP_DETECTION: printf("This command is used to disable flap detection for a specific service.\n"); break; case CMD_ENABLE_FLAP_DETECTION: printf("This command is used to enable flap detection for hosts and services on a program-wide basis. Individual hosts and services may have flap detection disabled.\n"); break; case CMD_DISABLE_FLAP_DETECTION: printf("This command is used to disable flap detection for hosts and services on a program-wide basis.\n"); break; case CMD_ENABLE_HOSTGROUP_SVC_NOTIFICATIONS: printf("This command is used to enable notifications for all services in the specified hostgroup. Notifications will only be sent out for the\n"); printf("service state types you defined in your service definitions. This does not enable notifications for the hosts in this hostgroup unless you check the 'Enable for hosts too' option.\n"); break; case CMD_DISABLE_HOSTGROUP_SVC_NOTIFICATIONS: printf("This command is used to prevent notifications from being sent out for all services in the specified hostgroup. You will have to re-enable notifications for\n"); printf("all services in this hostgroup before any alerts can be sent out in the future. This does not prevent notifications from being sent out about the hosts in this hostgroup unless you check the 'Disable for hosts too' option.\n"); break; case CMD_ENABLE_HOSTGROUP_HOST_NOTIFICATIONS: printf("This command is used to enable notifications for all hosts in the specified hostgroup. Notifications will only be sent out for the\n"); printf("host state types you defined in your host definitions.\n"); break; case CMD_DISABLE_HOSTGROUP_HOST_NOTIFICATIONS: printf("This command is used to prevent notifications from being sent out for all hosts in the specified hostgroup. You will have to re-enable notifications for\n"); printf("all hosts in this hostgroup before any alerts can be sent out in the future.\n"); break; case CMD_ENABLE_HOSTGROUP_SVC_CHECKS: printf("This command is used to enable active checks of all services in the specified hostgroup. This does not enable active checks of the hosts in the hostgroup unless you check the 'Enable for hosts too' option.\n"); break; case CMD_DISABLE_HOSTGROUP_SVC_CHECKS: printf("This command is used to disable active checks of all services in the specified hostgroup. This does not disable checks of the hosts in the hostgroup unless you check the 'Disable for hosts too' option.\n"); break; case CMD_DEL_HOST_DOWNTIME: printf("This command is used to cancel active or pending scheduled downtime for the specified host.\n"); break; case CMD_DEL_SVC_DOWNTIME: printf("This command is used to cancel active or pending scheduled downtime for the specified service.\n"); break; case CMD_ENABLE_PERFORMANCE_DATA: printf("This command is used to enable the processing of performance data for hosts and services on a program-wide basis. Individual hosts and services may have performance data processing disabled.\n"); break; case CMD_DISABLE_PERFORMANCE_DATA: printf("This command is used to disable the processing of performance data for hosts and services on a program-wide basis.\n"); break; case CMD_SCHEDULE_HOSTGROUP_HOST_DOWNTIME: printf("This command is used to schedule downtime for all hosts in a particular hostgroup. During the specified downtime, Nagios will not send notifications out about the hosts.\n"); printf("When the scheduled downtime expires, Nagios will send out notifications for the hosts as it normally would. Scheduled downtimes are preserved\n"); printf("across program shutdowns and restarts. Both the start and end times should be specified in the following format: mm/dd/yyyy hh:mm:ss.\n"); printf("If you select the fixed option, the downtime will be in effect between the start and end times you specify. If you do not select the fixed\n"); printf("option, Nagios will treat this as \"flexible\" downtime. Flexible downtime starts when a host goes down or becomes unreachable (sometime between the\n"); printf("start and end times you specified) and lasts as long as the duration of time you enter. The duration fields do not apply for fixed downtime.\n"); break; case CMD_SCHEDULE_HOSTGROUP_SVC_DOWNTIME: printf("This command is used to schedule downtime for all services in a particular hostgroup. During the specified downtime, Nagios will not send notifications out about the services.\n"); printf("When the scheduled downtime expires, Nagios will send out notifications for the services as it normally would. Scheduled downtimes are preserved\n"); printf("across program shutdowns and restarts. Both the start and end times should be specified in the following format: mm/dd/yyyy hh:mm:ss.\n"); printf("If you select the fixed option, the downtime will be in effect between the start and end times you specify. If you do not select the fixed\n"); printf("option, Nagios will treat this as \"flexible\" downtime. Flexible downtime starts when a service enters a non-OK state (sometime between the\n"); printf("start and end times you specified) and lasts as long as the duration of time you enter. The duration fields do not apply for fixed downtime.\n"); printf("Note that scheduling downtime for services does not automatically schedule downtime for the hosts those services are associated with. If you want to also schedule downtime for all hosts in the hostgroup, check the 'Schedule downtime for hosts too' option.\n"); break; case CMD_START_EXECUTING_HOST_CHECKS: printf("This command is used to enable active host checks on a program-wide basis.\n"); break; case CMD_STOP_EXECUTING_HOST_CHECKS: printf("This command is used to disable active host checks on a program-wide basis.\n"); break; case CMD_START_ACCEPTING_PASSIVE_HOST_CHECKS: printf("This command is used to have Nagios start obsessing over host checks. Read the documentation on distributed monitoring for more information on this.\n"); break; case CMD_STOP_ACCEPTING_PASSIVE_HOST_CHECKS: printf("This command is used to stop Nagios from obsessing over host checks.\n"); break; case CMD_ENABLE_PASSIVE_HOST_CHECKS: printf("This command is used to allow Nagios to accept passive host check results that it finds in the external command file for a particular host.\n"); break; case CMD_DISABLE_PASSIVE_HOST_CHECKS: printf("This command is used to stop Nagios from accepting passive host check results that it finds in the external command file for a particular host. All passive check results that are found for this host will be ignored.\n"); break; case CMD_START_OBSESSING_OVER_HOST_CHECKS: printf("This command is used to have Nagios start obsessing over host checks. Read the documentation on distributed monitoring for more information on this.\n"); break; case CMD_STOP_OBSESSING_OVER_HOST_CHECKS: printf("This command is used to stop Nagios from obsessing over host checks.\n"); break; case CMD_SCHEDULE_HOST_CHECK: printf("This command is used to schedule the next check of a particular host. Nagios will re-queue the host to be checked at the time you specify.\n"); printf("If you select the force check option, Nagios will force a check of the host regardless of both what time the scheduled check occurs and whether or not checks are enabled for the host.\n"); break; case CMD_START_OBSESSING_OVER_SVC: printf("This command is used to have Nagios start obsessing over a particular service.\n"); break; case CMD_STOP_OBSESSING_OVER_SVC: printf("This command is used to stop Nagios from obsessing over a particular service.\n"); break; case CMD_START_OBSESSING_OVER_HOST: printf("This command is used to have Nagios start obsessing over a particular host.\n"); break; case CMD_STOP_OBSESSING_OVER_HOST: printf("This command is used to stop Nagios from obsessing over a particular host.\n"); break; case CMD_ENABLE_SERVICEGROUP_SVC_NOTIFICATIONS: printf("This command is used to enable notifications for all services in the specified servicegroup. Notifications will only be sent out for the\n"); printf("service state types you defined in your service definitions. This does not enable notifications for the hosts in this servicegroup unless you check the 'Enable for hosts too' option.\n"); break; case CMD_DISABLE_SERVICEGROUP_SVC_NOTIFICATIONS: printf("This command is used to prevent notifications from being sent out for all services in the specified servicegroup. You will have to re-enable notifications for\n"); printf("all services in this servicegroup before any alerts can be sent out in the future. This does not prevent notifications from being sent out about the hosts in this servicegroup unless you check the 'Disable for hosts too' option.\n"); break; case CMD_ENABLE_SERVICEGROUP_HOST_NOTIFICATIONS: printf("This command is used to enable notifications for all hosts in the specified servicegroup. Notifications will only be sent out for the\n"); printf("host state types you defined in your host definitions.\n"); break; case CMD_DISABLE_SERVICEGROUP_HOST_NOTIFICATIONS: printf("This command is used to prevent notifications from being sent out for all hosts in the specified servicegroup. You will have to re-enable notifications for\n"); printf("all hosts in this servicegroup before any alerts can be sent out in the future.\n"); break; case CMD_ENABLE_SERVICEGROUP_SVC_CHECKS: printf("This command is used to enable active checks of all services in the specified servicegroup. This does not enable active checks of the hosts in the servicegroup unless you check the 'Enable for hosts too' option.\n"); break; case CMD_DISABLE_SERVICEGROUP_SVC_CHECKS: printf("This command is used to disable active checks of all services in the specified servicegroup. This does not disable checks of the hosts in the servicegroup unless you check the 'Disable for hosts too' option.\n"); break; case CMD_SCHEDULE_SERVICEGROUP_HOST_DOWNTIME: printf("This command is used to schedule downtime for all hosts in a particular servicegroup. During the specified downtime, Nagios will not send notifications out about the hosts.\n"); printf("When the scheduled downtime expires, Nagios will send out notifications for the hosts as it normally would. Scheduled downtimes are preserved\n"); printf("across program shutdowns and restarts. Both the start and end times should be specified in the following format: mm/dd/yyyy hh:mm:ss.\n"); printf("If you select the fixed option, the downtime will be in effect between the start and end times you specify. If you do not select the fixed\n"); printf("option, Nagios will treat this as \"flexible\" downtime. Flexible downtime starts when a host goes down or becomes unreachable (sometime between the\n"); printf("start and end times you specified) and lasts as long as the duration of time you enter. The duration fields do not apply for fixed downtime.\n"); break; case CMD_SCHEDULE_SERVICEGROUP_SVC_DOWNTIME: printf("This command is used to schedule downtime for all services in a particular servicegroup. During the specified downtime, Nagios will not send notifications out about the services.\n"); printf("When the scheduled downtime expires, Nagios will send out notifications for the services as it normally would. Scheduled downtimes are preserved\n"); printf("across program shutdowns and restarts. Both the start and end times should be specified in the following format: mm/dd/yyyy hh:mm:ss.\n"); printf("If you select the fixed option, the downtime will be in effect between the start and end times you specify. If you do not select the fixed\n"); printf("option, Nagios will treat this as \"flexible\" downtime. Flexible downtime starts when a service enters a non-OK state (sometime between the\n"); printf("start and end times you specified) and lasts as long as the duration of time you enter. The duration fields do not apply for fixed downtime.\n"); printf("Note that scheduling downtime for services does not automatically schedule downtime for the hosts those services are associated with. If you want to also schedule downtime for all hosts in the servicegroup, check the 'Schedule downtime for hosts too' option.\n"); break; case CMD_CLEAR_HOST_FLAPPING_STATE: case CMD_CLEAR_SVC_FLAPPING_STATE: printf("This command is used to reset the flapping state for the specified %s.\n", (cmd == CMD_CLEAR_HOST_FLAPPING_STATE) ? "host" : "service"); printf("All state history for the specified %s will be cleared.\n", (cmd == CMD_CLEAR_HOST_FLAPPING_STATE) ? "host" : "service"); break; case CMD_SEND_CUSTOM_HOST_NOTIFICATION: case CMD_SEND_CUSTOM_SVC_NOTIFICATION: printf("This command is used to send a custom notification about the specified %s. Useful in emergencies when you need to notify admins of an issue regarding a monitored system or service.\n", (cmd == CMD_SEND_CUSTOM_HOST_NOTIFICATION) ? "host" : "service"); printf("Custom notifications normally follow the regular notification logic in Nagios. Selecting the Forced option will force the notification to be sent out, regardless of the time restrictions, whether or not notifications are enabled, etc. Selecting the Broadcast option causes the notification to be sent out to all normal (non-escalated) and escalated contacts. These options allow you to override the normal notification logic if you need to get an important message out.\n"); break; default: printf("Sorry, but no information is available for this command."); } printf("
    \n"); return; } /* converts a time string to a UNIX timestamp, respecting the date_format option */ int string_to_time(char *buffer, time_t *t) { struct tm lt; int ret = 0; /* Initialize some variables just in case they don't get parsed by the sscanf() call. A better solution is to also check the CGI input for validity, but this should suffice to prevent strange problems if the input is not valid. Jan 15 2003 Steve Bonds */ lt.tm_mon = 0; lt.tm_mday = 1; lt.tm_year = 1900; lt.tm_hour = 0; lt.tm_min = 0; lt.tm_sec = 0; lt.tm_wday = 0; lt.tm_yday = 0; if(date_format == DATE_FORMAT_EURO) ret = sscanf(buffer, "%02d-%02d-%04d %02d:%02d:%02d", <.tm_mday, <.tm_mon, <.tm_year, <.tm_hour, <.tm_min, <.tm_sec); else if(date_format == DATE_FORMAT_ISO8601 || date_format == DATE_FORMAT_STRICT_ISO8601) ret = sscanf(buffer, "%04d-%02d-%02d%*[ T]%02d:%02d:%02d", <.tm_year, <.tm_mon, <.tm_mday, <.tm_hour, <.tm_min, <.tm_sec); else ret = sscanf(buffer, "%02d-%02d-%04d %02d:%02d:%02d", <.tm_mon, <.tm_mday, <.tm_year, <.tm_hour, <.tm_min, <.tm_sec); if(ret != 6) return ERROR; lt.tm_mon--; lt.tm_year -= 1900; /* tell mktime() to try and compute DST automatically */ lt.tm_isdst = -1; *t = mktime(<); return OK; } nagios-4.3.4/cgi/config.c000066400000000000000000002553531314764422400152010ustar00rootroot00000000000000/*********************************************************************** * * CONFIG.C - Nagios Configuration CGI (View Only) * * * This CGI program will display various configuration information. * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ***********************************************************************/ #include "../include/config.h" #include "../include/common.h" #include "../include/objects.h" #include "../include/macros.h" #include "../include/cgiutils.h" #include "../include/cgiauth.h" #include "../include/getcgi.h" static nagios_macros *mac; extern char main_config_file[MAX_FILENAME_LENGTH]; extern char url_html_path[MAX_FILENAME_LENGTH]; extern char url_docs_path[MAX_FILENAME_LENGTH]; extern char url_images_path[MAX_FILENAME_LENGTH]; extern char url_logo_images_path[MAX_FILENAME_LENGTH]; extern char url_stylesheets_path[MAX_FILENAME_LENGTH]; #define DISPLAY_NONE 0 #define DISPLAY_HOSTS 1 #define DISPLAY_HOSTGROUPS 2 #define DISPLAY_CONTACTS 3 #define DISPLAY_CONTACTGROUPS 4 #define DISPLAY_SERVICES 5 #define DISPLAY_TIMEPERIODS 6 #define DISPLAY_COMMANDS 7 #define DISPLAY_HOSTGROUPESCALATIONS 8 /* no longer implemented */ #define DISPLAY_SERVICEDEPENDENCIES 9 #define DISPLAY_SERVICEESCALATIONS 10 #define DISPLAY_HOSTDEPENDENCIES 11 #define DISPLAY_HOSTESCALATIONS 12 #define DISPLAY_SERVICEGROUPS 15 #define DISPLAY_COMMAND_EXPANSION 16211 void document_header(int); void document_footer(void); int process_cgivars(void); void display_options(void); void display_hosts(void); void display_hostgroups(void); void display_servicegroups(void); void display_contacts(void); void display_contactgroups(void); void display_services(void); void display_timeperiods(void); void display_commands(void); void display_servicedependencies(void); void display_serviceescalations(void); void display_hostdependencies(void); void display_hostescalations(void); void display_command_expansion(void); void unauthorized_message(void); authdata current_authdata; int display_type = DISPLAY_NONE; char to_expand[MAX_COMMAND_BUFFER]; char hashed_color[8]; int embedded = FALSE; static void print_expand_input(int type) { const char *seldesc = ""; if(type == DISPLAY_COMMAND_EXPANSION) return; /* Has its own form, w/ larger */ else if(type == DISPLAY_SERVICES) { seldesc = " Services Named or on Host"; } else if(type == DISPLAY_SERVICEDEPENDENCIES) { seldesc = " Dependencies with Host"; } else if(type == DISPLAY_SERVICEESCALATIONS) { seldesc = " Escalations on Host"; } else if(type == DISPLAY_HOSTDEPENDENCIES) { seldesc = " Dependencies on/of Host"; } else if(type == DISPLAY_HOSTESCALATIONS) { seldesc = " Escalations for Host"; } printf("Show Only%s:\n", seldesc); printf("", html_encode(to_expand, FALSE)); } int main(void) { mac = get_global_macros(); /* get the arguments passed in the URL */ process_cgivars(); /* reset internal variables */ reset_cgi_vars(); cgi_init(document_header, document_footer, READ_ALL_OBJECT_DATA, 0); /* initialize macros */ init_macros(); document_header(TRUE); /* get authentication information */ get_authentication_information(¤t_authdata); /* begin top table */ printf("\n"); printf("\n"); /* left column of the first row */ printf("\n"); /* right hand column of top row */ printf("\n"); /* end of top table */ printf("\n"); printf("
    \n"); display_info_table("Configuration", FALSE, ¤t_authdata); printf("\n"); if(display_type != DISPLAY_NONE) { printf("
    \n", CONFIG_CGI); printf("\n"); printf("\n"); printf("\n"); print_expand_input(display_type); printf("\n"); printf("
    Object Type:
    "); printf("\n"); printf("
    \n"); printf("
    \n"); } /* display context-sensitive help */ switch(display_type) { case DISPLAY_HOSTS: display_context_help(CONTEXTHELP_CONFIG_HOSTS); break; case DISPLAY_HOSTGROUPS: display_context_help(CONTEXTHELP_CONFIG_HOSTGROUPS); break; case DISPLAY_SERVICEGROUPS: display_context_help(CONTEXTHELP_CONFIG_SERVICEGROUPS); break; case DISPLAY_CONTACTS: display_context_help(CONTEXTHELP_CONFIG_CONTACTS); break; case DISPLAY_CONTACTGROUPS: display_context_help(CONTEXTHELP_CONFIG_CONTACTGROUPS); break; case DISPLAY_SERVICES: display_context_help(CONTEXTHELP_CONFIG_SERVICES); break; case DISPLAY_TIMEPERIODS: display_context_help(CONTEXTHELP_CONFIG_TIMEPERIODS); break; case DISPLAY_COMMANDS: display_context_help(CONTEXTHELP_CONFIG_COMMANDS); break; case DISPLAY_SERVICEDEPENDENCIES: display_context_help(CONTEXTHELP_CONFIG_SERVICEDEPENDENCIES); break; case DISPLAY_SERVICEESCALATIONS: display_context_help(CONTEXTHELP_CONFIG_HOSTESCALATIONS); break; case DISPLAY_HOSTDEPENDENCIES: display_context_help(CONTEXTHELP_CONFIG_HOSTDEPENDENCIES); break; case DISPLAY_HOSTESCALATIONS: display_context_help(CONTEXTHELP_CONFIG_HOSTESCALATIONS); break; case DISPLAY_COMMAND_EXPANSION: /* Reusing DISPLAY_COMMANDS help until further notice */ display_context_help(CONTEXTHELP_CONFIG_COMMANDS); break; default: display_context_help(CONTEXTHELP_CONFIG_MENU); break; } printf("
    \n"); switch(display_type) { case DISPLAY_HOSTS: display_hosts(); break; case DISPLAY_HOSTGROUPS: display_hostgroups(); break; case DISPLAY_SERVICEGROUPS: display_servicegroups(); break; case DISPLAY_CONTACTS: display_contacts(); break; case DISPLAY_CONTACTGROUPS: display_contactgroups(); break; case DISPLAY_SERVICES: display_services(); break; case DISPLAY_TIMEPERIODS: display_timeperiods(); break; case DISPLAY_COMMANDS: display_commands(); break; case DISPLAY_SERVICEDEPENDENCIES: display_servicedependencies(); break; case DISPLAY_SERVICEESCALATIONS: display_serviceescalations(); break; case DISPLAY_HOSTDEPENDENCIES: display_hostdependencies(); break; case DISPLAY_HOSTESCALATIONS: display_hostescalations(); break; case DISPLAY_COMMAND_EXPANSION: display_command_expansion(); break; default: display_options(); break; } document_footer(); return OK; } void document_header(int use_stylesheet) { char date_time[MAX_DATETIME_LENGTH]; time_t t; if(embedded == TRUE) return; time(&t); get_time_string(&t, date_time, sizeof(date_time), HTTP_DATE_TIME); printf("Cache-Control: no-store\r\n"); printf("Pragma: no-cache\r\n"); printf("Last-Modified: %s\r\n", date_time); printf("Expires: %s\r\n", date_time); printf("Content-type: text/html; charset=utf-8\r\n\r\n"); printf("\n"); printf("\n"); printf("\n", url_images_path); printf("\n"); printf("\n"); printf("Configuration\n"); printf("\n"); if(use_stylesheet == TRUE) { printf("\n", url_stylesheets_path, COMMON_CSS); printf("\n", url_stylesheets_path, CONFIG_CSS); } printf("\n"); printf("\n"); /* include user SSI header */ include_ssi_files(CONFIG_CGI, SSI_HEADER); return; } void document_footer(void) { if(embedded == TRUE) return; /* include user SSI footer */ include_ssi_files(CONFIG_CGI, SSI_FOOTER); printf("\n"); printf("\n"); return; } int process_cgivars(void) { char **variables; int error = FALSE; int x; variables = getcgivars(); to_expand[0] = '\0'; for(x = 0; variables[x] != NULL; x++) { /* do some basic length checking on the variable identifier to prevent buffer overflows */ if(strlen(variables[x]) >= MAX_INPUT_BUFFER - 1) { continue; } /* we found the configuration type argument */ else if(!strcmp(variables[x], "type")) { x++; if(variables[x] == NULL) { error = TRUE; break; } /* what information should we display? */ if(!strcmp(variables[x], "hosts")) display_type = DISPLAY_HOSTS; else if(!strcmp(variables[x], "hostgroups")) display_type = DISPLAY_HOSTGROUPS; else if(!strcmp(variables[x], "servicegroups")) display_type = DISPLAY_SERVICEGROUPS; else if(!strcmp(variables[x], "contacts")) display_type = DISPLAY_CONTACTS; else if(!strcmp(variables[x], "contactgroups")) display_type = DISPLAY_CONTACTGROUPS; else if(!strcmp(variables[x], "services")) display_type = DISPLAY_SERVICES; else if(!strcmp(variables[x], "timeperiods")) display_type = DISPLAY_TIMEPERIODS; else if(!strcmp(variables[x], "commands")) display_type = DISPLAY_COMMANDS; else if(!strcmp(variables[x], "servicedependencies")) display_type = DISPLAY_SERVICEDEPENDENCIES; else if(!strcmp(variables[x], "serviceescalations")) display_type = DISPLAY_SERVICEESCALATIONS; else if(!strcmp(variables[x], "hostdependencies")) display_type = DISPLAY_HOSTDEPENDENCIES; else if(!strcmp(variables[x], "hostescalations")) display_type = DISPLAY_HOSTESCALATIONS; else if(!strcmp(variables[x], "command")) display_type = DISPLAY_COMMAND_EXPANSION; /* we found the embed option */ else if(!strcmp(variables[x], "embedded")) embedded = TRUE; } /* we found the string-to-expand argument */ else if(!strcmp(variables[x], "expand")) { x++; if(variables[x] == NULL) { error = TRUE; break; } strncpy(to_expand, variables[x], MAX_COMMAND_BUFFER); to_expand[MAX_COMMAND_BUFFER - 1] = '\0'; } /* we received an invalid argument */ else error = TRUE; } /* free memory allocated to the CGI variables */ free_cgivars(variables); return error; } void display_hosts(void) { host *temp_host = NULL; hostsmember *temp_hostsmember = NULL; contactsmember *temp_contactsmember = NULL; contactgroupsmember *temp_contactgroupsmember = NULL; char *processed_string = NULL; int options = 0; int odd = 0; char time_string[16]; const char *bg_class = ""; int num_contacts = 0; /* see if user is authorized to view host information... */ if(is_authorized_for_configuration_information(¤t_authdata) == FALSE) { unauthorized_message(); return; } printf("

    Host%s%s

    \n", (*to_expand == '\0' ? "s" : " "), (*to_expand == '\0' ? "" : html_encode(to_expand, FALSE))); printf("

    \n"); printf("\n"); printf("\n"); printf(""); printf(""); printf(""); printf(""); printf(""); printf(""); printf(""); printf("\n"); printf("\n"); printf(""); printf(""); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf(""); printf(""); printf(""); printf(""); printf(""); printf(""); printf("\n"); printf(""); printf(""); printf(""); printf("\n"); printf(""); printf(""); printf(""); printf(""); printf(""); printf(""); printf(""); printf(""); printf(""); printf(""); printf(""); printf("\n"); /* check all the hosts... */ for(temp_host = host_list; temp_host != NULL; temp_host = temp_host->next) if(((*to_expand) == '\0') || !strcmp(to_expand, temp_host->name)) { /* grab macros */ grab_host_macros_r(mac, temp_host); if(odd) { odd = 0; bg_class = "dataOdd"; } else { odd = 1; bg_class = "dataEven"; } printf("\n", bg_class); printf("\n", bg_class, url_encode(temp_host->name), CONFIG_CGI, url_encode(temp_host->name), html_encode(temp_host->name, FALSE)); printf("\n", bg_class, html_encode(temp_host->alias, FALSE)); printf("\n", bg_class, html_encode(temp_host->address, FALSE)); printf("\n", bg_class, temp_host->hourly_value); printf("\n", bg_class, temp_host->hourly_value + host_services_value(temp_host)); printf("\n"); printf("\n", bg_class, temp_host->max_attempts); get_interval_time_string(temp_host->check_interval, time_string, sizeof(time_string)); printf("\n", bg_class, time_string); get_interval_time_string(temp_host->retry_interval, time_string, sizeof(time_string)); printf("\n", bg_class, time_string); printf("\n", CONFIG_CGI, url_encode(temp_host->check_command), html_encode(temp_host->check_command, FALSE)); printf("\n"); printf("\n"); printf("\n", bg_class, (temp_host->obsess == TRUE) ? "Yes" : "No"); printf("\n", bg_class, (temp_host->checks_enabled == TRUE) ? "Yes" : "No"); printf("\n", bg_class, (temp_host->accept_passive_checks == TRUE) ? "Yes" : "No"); printf("\n", bg_class, (temp_host->check_freshness == TRUE) ? "Yes" : "No"); printf("\n"); printf("\n"); get_interval_time_string(temp_host->notification_interval, time_string, sizeof(time_string)); printf("\n", bg_class, (temp_host->notification_interval == 0) ? "No Re-notification" : html_encode(time_string, FALSE)); get_interval_time_string(temp_host->first_notification_delay, time_string, sizeof(time_string)); printf("\n", bg_class, time_string); printf("\n"); printf("\n"); printf("\n",CONFIG_CGI,url_encode(strtok(temp_host->event_handler,"!")),html_encode(temp_host->event_handler,FALSE)); */ printf("%s\n", CONFIG_CGI, url_encode(temp_host->event_handler), html_encode(temp_host->event_handler, FALSE)); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("", bg_class, (temp_host->notes == NULL) ? " " : html_encode(temp_host->notes, FALSE)); printf("", bg_class, (temp_host->notes_url == NULL) ? " " : html_encode(temp_host->notes_url, FALSE)); printf("", bg_class, (temp_host->action_url == NULL) ? " " : html_encode(temp_host->action_url, FALSE)); if(temp_host->have_2d_coords == FALSE) printf("", bg_class); else printf("", bg_class, temp_host->x_2d, temp_host->y_2d); if(temp_host->have_3d_coords == FALSE) printf("", bg_class); else printf("", bg_class, temp_host->x_3d, temp_host->y_3d, temp_host->z_3d); if(temp_host->statusmap_image == NULL) printf("", bg_class); else printf("", bg_class, url_logo_images_path, temp_host->statusmap_image, html_encode(temp_host->statusmap_image, FALSE)); if(temp_host->vrml_image == NULL) printf("", bg_class); else printf("", bg_class, url_logo_images_path, temp_host->vrml_image, html_encode(temp_host->vrml_image, FALSE)); if(temp_host->icon_image == NULL) printf("", bg_class); else { process_macros_r(mac, temp_host->icon_image, &processed_string, 0); printf("", bg_class, url_logo_images_path, processed_string, html_encode(temp_host->icon_image, FALSE)); free(processed_string); } printf("", bg_class, (temp_host->icon_image_alt == NULL) ? " " : html_encode(temp_host->icon_image_alt, FALSE)); printf("\n"); printf("\n"); } printf("
    Host NameAlias/DescriptionAddressImportance (Host)Importance (Host + Services)Parent HostsMax. Check AttemptsCheck IntervalRetry IntervalHost Check CommandCheck PeriodObsess OverEnable Active ChecksEnable Passive ChecksCheck FreshnessFreshness ThresholdDefault Contacts/GroupsNotification IntervalFirst Notification DelayNotification OptionsNotification PeriodEvent HandlerEnable Event HandlerStalking OptionsEnable Flap DetectionLow Flap ThresholdHigh Flap ThresholdFlap Detection OptionsProcess Performance DataNotesNotes URLAction URL2-D Coords3-D CoordsStatusmap ImageVRML ImageLogo ImageImage AltRetention Options
    %s%s%s%u%u", bg_class); for(temp_hostsmember = temp_host->parent_hosts; temp_hostsmember != NULL; temp_hostsmember = temp_hostsmember->next) { if(temp_hostsmember != temp_host->parent_hosts) printf(", "); printf("%s\n", CONFIG_CGI, url_encode(temp_hostsmember->host_name), html_encode(temp_hostsmember->host_name, FALSE)); } if(temp_host->parent_hosts == NULL) printf(" "); printf("%d%s%s", bg_class); if(temp_host->check_command == NULL) printf(" "); else printf("%s", bg_class); if(temp_host->check_period == NULL) printf(" "); else printf("%s", CONFIG_CGI, url_encode(temp_host->check_period), html_encode(temp_host->check_period, FALSE)); printf("%s%s%s%s", bg_class); if(temp_host->freshness_threshold == 0) printf("Auto-determined value\n"); else printf("%d seconds\n", temp_host->freshness_threshold); printf("", bg_class); /* find all the contacts for this host... */ num_contacts = 0; for(temp_contactsmember = temp_host->contacts; temp_contactsmember != NULL; temp_contactsmember = temp_contactsmember->next) { num_contacts++; if(num_contacts > 1) printf(", "); printf("%s\n", CONFIG_CGI, url_encode(temp_contactsmember->contact_name), html_encode(temp_contactsmember->contact_name, FALSE)); } for(temp_contactgroupsmember = temp_host->contact_groups; temp_contactgroupsmember != NULL; temp_contactgroupsmember = temp_contactgroupsmember->next) { num_contacts++; if(num_contacts > 1) printf(", "); printf("%s\n", CONFIG_CGI, url_encode(temp_contactgroupsmember->group_name), html_encode(temp_contactgroupsmember->group_name, FALSE)); } if(num_contacts == 0) printf(" "); printf("%s%s", bg_class); options = 0; if(flag_isset(temp_host->notification_options, OPT_DOWN) == TRUE) { options = 1; printf("Down"); } if(flag_isset(temp_host->notification_options, OPT_UNREACHABLE) == TRUE) { printf("%sUnreachable", (options) ? ", " : ""); options = 1; } if(flag_isset(temp_host->notification_options, OPT_RECOVERY) == TRUE) { printf("%sRecovery", (options) ? ", " : ""); options = 1; } if(flag_isset(temp_host->notification_options, OPT_FLAPPING) == TRUE) { printf("%sFlapping", (options) ? ", " : ""); options = 1; } if(flag_isset(temp_host->notification_options, OPT_DOWNTIME) == TRUE) { printf("%sDowntime", (options) ? ", " : ""); options = 1; } if(options == 0) printf("None"); printf("", bg_class); if(temp_host->notification_period == NULL) printf(" "); else printf("%s", CONFIG_CGI, url_encode(temp_host->notification_period), html_encode(temp_host->notification_period, FALSE)); printf("", bg_class); if(temp_host->event_handler == NULL) printf(" "); else /* printf("%s", bg_class); printf("%s\n", (temp_host->event_handler_enabled == TRUE) ? "Yes" : "No"); printf("", bg_class); options = 0; if(flag_isset(temp_host->stalking_options, OPT_UP) == TRUE) { options = 1; printf("Up"); } if(flag_isset(temp_host->stalking_options, OPT_DOWN) == TRUE) { printf("%sDown", (options) ? ", " : ""); options = 1; } if(flag_isset(temp_host->stalking_options, OPT_UNREACHABLE) == TRUE) { printf("%sUnreachable", (options) ? ", " : ""); options = 1; } if(options == 0) printf("None"); printf("", bg_class); printf("%s\n", (temp_host->flap_detection_enabled == TRUE) ? "Yes" : "No"); printf("", bg_class); if(temp_host->low_flap_threshold == 0.0) printf("Program-wide value\n"); else printf("%3.1f%%\n", temp_host->low_flap_threshold); printf("", bg_class); if(temp_host->high_flap_threshold == 0.0) printf("Program-wide value\n"); else printf("%3.1f%%\n", temp_host->high_flap_threshold); printf("", bg_class); options = 0; if(flag_isset(temp_host->flap_detection_options, OPT_UP) == TRUE) { options = 1; printf("Up"); } if(flag_isset(temp_host->flap_detection_options, OPT_DOWN) == TRUE) { printf("%sDown", (options) ? ", " : ""); options = 1; } if(flag_isset(temp_host->flap_detection_options, OPT_UNREACHABLE) == TRUE) { printf("%sUnreachable", (options) ? ", " : ""); options = 1; } if(options == 0) printf("None"); printf("", bg_class); printf("%s\n", (temp_host->process_performance_data == TRUE) ? "Yes" : "No"); printf("%s%s%s %d,%d %.2f,%.2f,%.2f  %s  %s  %s%s", bg_class); options = 0; if(temp_host->retain_status_information == TRUE) { options = 1; printf("Status Information"); } if(temp_host->retain_nonstatus_information == TRUE) { printf("%sNon-Status Information", (options == 1) ? ", " : ""); options = 1; } if(options == 0) printf("None"); printf("
    \n"); printf("
    \n"); printf("

    \n"); return; } void display_hostgroups(void) { hostgroup *temp_hostgroup; hostsmember *temp_hostsmember; int odd = 0; const char *bg_class = ""; /* see if user is authorized to view hostgroup information... */ if(is_authorized_for_configuration_information(¤t_authdata) == FALSE) { unauthorized_message(); return; } printf("

    Host Group%s%s

    \n", (*to_expand == '\0' ? "s" : " "), (*to_expand == '\0' ? "" : html_encode(to_expand, FALSE))); printf("

    \n"); printf("

    \n"); printf("\n"); printf("\n"); printf(""); printf(""); printf(""); printf(""); printf(""); printf(""); printf("\n"); /* check all the hostgroups... */ for(temp_hostgroup = hostgroup_list; temp_hostgroup != NULL; temp_hostgroup = temp_hostgroup->next) if(((*to_expand) == '\0') || (!strcmp(to_expand, temp_hostgroup->group_name))) { if(odd) { odd = 0; bg_class = "dataOdd"; } else { odd = 1; bg_class = "dataEven"; } printf("\n", bg_class); printf("", bg_class, html_encode(temp_hostgroup->group_name, FALSE)); printf("\n", bg_class, html_encode(temp_hostgroup->alias, FALSE)); printf("\n"); printf("", bg_class, (temp_hostgroup->notes == NULL) ? " " : html_encode(temp_hostgroup->notes, FALSE)); printf("", bg_class, (temp_hostgroup->notes_url == NULL) ? " " : html_encode(temp_hostgroup->notes_url, FALSE)); printf("", bg_class, (temp_hostgroup->action_url == NULL) ? " " : html_encode(temp_hostgroup->action_url, FALSE)); printf("\n"); } printf("
    Group NameDescriptionHost MembersNotesNotes URLAction URL
    %s%s", bg_class); /* find all the hosts that are members of this hostgroup... */ for(temp_hostsmember = temp_hostgroup->members; temp_hostsmember != NULL; temp_hostsmember = temp_hostsmember->next) { if(temp_hostsmember != temp_hostgroup->members) printf(", "); printf("%s\n", CONFIG_CGI, url_encode(temp_hostsmember->host_name), html_encode(temp_hostsmember->host_name, FALSE)); } printf("%s%s%s
    \n"); printf("
    \n"); printf("

    \n"); return; } void display_servicegroups(void) { servicegroup *temp_servicegroup; servicesmember *temp_servicesmember; int odd = 0; const char *bg_class = ""; /* see if user is authorized to view servicegroup information... */ if(is_authorized_for_configuration_information(¤t_authdata) == FALSE) { unauthorized_message(); return; } printf("

    Service Group%s%s

    \n", (*to_expand == '\0' ? "s" : " "), (*to_expand == '\0' ? "" : html_encode(to_expand, FALSE))); printf("

    \n"); printf("

    \n"); printf("\n"); printf("\n"); printf(""); printf(""); printf(""); printf(""); printf(""); printf(""); printf("\n"); /* check all the servicegroups... */ for(temp_servicegroup = servicegroup_list; temp_servicegroup != NULL; temp_servicegroup = temp_servicegroup->next) if(((*to_expand) == '\0') || (!strcmp(to_expand, temp_servicegroup->group_name))) { if(odd) { odd = 0; bg_class = "dataOdd"; } else { odd = 1; bg_class = "dataEven"; } printf("\n", bg_class); printf("", bg_class, html_encode(temp_servicegroup->group_name, FALSE)); printf("\n", bg_class, html_encode(temp_servicegroup->alias, FALSE)); printf("\n"); printf("", bg_class, (temp_servicegroup->notes == NULL) ? " " : html_encode(temp_servicegroup->notes, FALSE)); printf("", bg_class, (temp_servicegroup->notes_url == NULL) ? " " : html_encode(temp_servicegroup->notes_url, FALSE)); printf("", bg_class, (temp_servicegroup->action_url == NULL) ? " " : html_encode(temp_servicegroup->action_url, FALSE)); printf("\n"); } printf("
    Group NameDescriptionService MembersNotesNotes URLAction URL
    %s%s", bg_class); /* find all the services that are members of this servicegroup... */ for(temp_servicesmember = temp_servicegroup->members; temp_servicesmember != NULL; temp_servicesmember = temp_servicesmember->next) { printf("%s%s / ", (temp_servicesmember == temp_servicegroup->members) ? "" : ", ", CONFIG_CGI, url_encode(temp_servicesmember->host_name), html_encode(temp_servicesmember->host_name, FALSE)); printf("%s\n", url_encode(temp_servicesmember->service_description), html_encode(temp_servicesmember->service_description, FALSE)); } printf("%s%s%s
    \n"); printf("
    \n"); printf("

    \n"); return; } void display_contacts(void) { contact *temp_contact; commandsmember *temp_commandsmember; int odd = 0; int options; int found; const char *bg_class = ""; /* see if user is authorized to view contact information... */ if(is_authorized_for_configuration_information(¤t_authdata) == FALSE) { unauthorized_message(); return; } printf("

    Contact%s%s

    \n", (*to_expand == '\0' ? "s" : " "), (*to_expand == '\0' ? "" : html_encode(to_expand, FALSE))); printf("

    \n"); printf("

    \n"); printf("\n"); printf("\n"); printf(""); printf(""); printf(""); printf(""); printf(""); printf(""); printf(""); printf(""); printf(""); printf(""); printf(""); printf(""); printf("\n"); /* check all contacts... */ for(temp_contact = contact_list; temp_contact != NULL; temp_contact = temp_contact->next) if(((*to_expand) == '\0') || (!strcmp(to_expand, temp_contact->name))) { if(odd) { odd = 0; bg_class = "dataOdd"; } else { odd = 1; bg_class = "dataEven"; } printf("\n", bg_class); printf("\n", bg_class, url_encode(temp_contact->name), html_encode(temp_contact->name, FALSE)); printf("\n", bg_class, html_encode(temp_contact->alias, FALSE)); printf("\n", bg_class, (temp_contact->email == NULL) ? " " : url_encode(temp_contact->email), (temp_contact->email == NULL) ? " " : html_encode(temp_contact->email, FALSE)); printf("\n", bg_class, (temp_contact->pager == NULL) ? " " : html_encode(temp_contact->pager, FALSE)); printf("\n", bg_class, temp_contact->minimum_value); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); } printf("
    Contact NameAliasEmail AddressPager Address/NumberMinimum ImportanceService Notification OptionsHost Notification OptionsService Notification PeriodHost Notification PeriodService Notification CommandsHost Notification CommandsRetention Options
    %s%s%s%s%u", bg_class); options = 0; if(flag_isset(temp_contact->service_notification_options, OPT_UNKNOWN)) { options = 1; printf("Unknown"); } if(flag_isset(temp_contact->service_notification_options, OPT_WARNING)) { printf("%sWarning", (options) ? ", " : ""); options = 1; } if(flag_isset(temp_contact->service_notification_options, OPT_CRITICAL)) { printf("%sCritical", (options) ? ", " : ""); options = 1; } if(flag_isset(temp_contact->service_notification_options, OPT_RECOVERY)) { printf("%sRecovery", (options) ? ", " : ""); options = 1; } if(flag_isset(temp_contact->service_notification_options, OPT_FLAPPING)) { printf("%sFlapping", (options) ? ", " : ""); options = 1; } if(flag_isset(temp_contact->service_notification_options, OPT_DOWNTIME)) { printf("%sDowntime", (options) ? ", " : ""); options = 1; } if(!options) printf("None"); printf("", bg_class); options = 0; if(flag_isset(temp_contact->host_notification_options, OPT_DOWN) == TRUE) { options = 1; printf("Down"); } if(flag_isset(temp_contact->host_notification_options, OPT_UNREACHABLE) == TRUE) { printf("%sUnreachable", (options) ? ", " : ""); options = 1; } if(flag_isset(temp_contact->host_notification_options, OPT_RECOVERY) == TRUE) { printf("%sRecovery", (options) ? ", " : ""); options = 1; } if(flag_isset(temp_contact->host_notification_options, OPT_FLAPPING) == TRUE) { printf("%sFlapping", (options) ? ", " : ""); options = 1; } if(flag_isset(temp_contact->host_notification_options, OPT_DOWNTIME) == TRUE) { printf("%sDowntime", (options) ? ", " : ""); options = 1; } if(!options) printf("None"); printf("\n", bg_class); if(temp_contact->service_notification_period == NULL) printf(" "); else printf("%s", CONFIG_CGI, url_encode(temp_contact->service_notification_period), html_encode(temp_contact->service_notification_period, FALSE)); printf("\n", bg_class); if(temp_contact->host_notification_period == NULL) printf(" "); else printf("%s", CONFIG_CGI, url_encode(temp_contact->host_notification_period), html_encode(temp_contact->host_notification_period, FALSE)); printf("", bg_class); found = FALSE; for(temp_commandsmember = temp_contact->service_notification_commands; temp_commandsmember != NULL; temp_commandsmember = temp_commandsmember->next) { if(temp_commandsmember != temp_contact->service_notification_commands) printf(", "); /* printf("%s",CONFIG_CGI,url_encode(strtok(temp_commandsmember->command,"!")),html_encode(temp_commandsmember->command,FALSE)); */ printf("%s", CONFIG_CGI, url_encode(temp_commandsmember->command), html_encode(temp_commandsmember->command, FALSE)); found = TRUE; } if(found == FALSE) printf("None"); printf("", bg_class); found = FALSE; for(temp_commandsmember = temp_contact->host_notification_commands; temp_commandsmember != NULL; temp_commandsmember = temp_commandsmember->next) { if(temp_commandsmember != temp_contact->host_notification_commands) printf(", "); /* printf("%s",CONFIG_CGI,url_encode(strtok(temp_commandsmember->command,"!")),html_encode(temp_commandsmember->command,FALSE)); */ printf("%s", CONFIG_CGI, url_encode(temp_commandsmember->command), html_encode(temp_commandsmember->command, FALSE)); found = TRUE; } if(found == FALSE) printf("None"); printf("", bg_class); options = 0; if(temp_contact->retain_status_information == TRUE) { options = 1; printf("Status Information"); } if(temp_contact->retain_nonstatus_information == TRUE) { printf("%sNon-Status Information", (options == 1) ? ", " : ""); options = 1; } if(options == 0) printf("None"); printf("
    \n"); printf("
    \n"); printf("

    \n"); return; } void display_contactgroups(void) { contactgroup *temp_contactgroup; contactsmember *temp_contactsmember; int odd = 0; const char *bg_class = ""; /* see if user is authorized to view contactgroup information... */ if(is_authorized_for_configuration_information(¤t_authdata) == FALSE) { unauthorized_message(); return; } printf("

    Contact Group%s%s

    \n", (*to_expand == '\0' ? "s" : " "), (*to_expand == '\0' ? "" : html_encode(to_expand, FALSE))); printf("

    \n"); printf("

    \n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); /* check all the contact groups... */ for(temp_contactgroup = contactgroup_list; temp_contactgroup != NULL; temp_contactgroup = temp_contactgroup->next) if(((*to_expand) == '\0') || (!strcmp(to_expand, temp_contactgroup->group_name))) { if(odd) { odd = 0; bg_class = "dataOdd"; } else { odd = 1; bg_class = "dataEven"; } printf("\n", bg_class); printf("\n", bg_class, url_encode(temp_contactgroup->group_name), html_encode(temp_contactgroup->group_name, FALSE)); printf("\n", bg_class, html_encode(temp_contactgroup->alias, FALSE)); /* find all the contact who are members of this contact group... */ printf("\n"); printf("\n"); } printf("
    Group NameDescriptionContact Members
    %s%s", bg_class); for(temp_contactsmember = temp_contactgroup->members; temp_contactsmember != NULL; temp_contactsmember = temp_contactsmember->next) { if(temp_contactsmember != temp_contactgroup->members) printf(", "); printf("%s\n", CONFIG_CGI, url_encode(temp_contactsmember->contact_name), html_encode(temp_contactsmember->contact_name, FALSE)); } printf("
    \n"); printf("
    \n"); printf("

    \n"); return; } void display_services(void) { service *temp_service = NULL; contactsmember *temp_contactsmember = NULL; contactgroupsmember *temp_contactgroupsmember = NULL; char *processed_string = NULL; char command_line[MAX_INPUT_BUFFER]; char *command_name; int options; int odd = 0; char time_string[16]; const char *bg_class; int num_contacts = 0; /* see if user is authorized to view service information... */ if(is_authorized_for_configuration_information(¤t_authdata) == FALSE) { unauthorized_message(); return; } printf("

    Service%s%s

    \n", (*to_expand == '\0' ? "s" : "s Named or on Host "), (*to_expand == '\0' ? "" : html_encode(to_expand, FALSE))); printf("

    \n"); printf("

    \n"); printf("\n"); printf("\n"); printf(""); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf(""); printf(""); printf("\n"); printf(""); printf(""); printf(""); printf(""); printf(""); printf(""); printf(""); printf(""); printf(""); printf(""); printf(""); printf("\n"); /* check all the services... */ for(temp_service = service_list; temp_service != NULL; temp_service = temp_service->next) if(((*to_expand) == '\0') || (!strcmp(to_expand, temp_service->host_name)) || (!strcmp(to_expand, temp_service->description))) { /* grab macros */ grab_service_macros_r(mac, temp_service); if(odd) { odd = 0; bg_class = "dataOdd"; } else { odd = 1; bg_class = "dataEven"; } printf("\n", bg_class); printf("\n", CONFIG_CGI, url_encode(temp_service->host_name), html_encode(temp_service->host_name, FALSE)); printf("\n", bg_class, html_encode(temp_service->description, FALSE)); printf("\n", bg_class, temp_service->hourly_value); printf("\n", bg_class, temp_service->max_attempts); get_interval_time_string(temp_service->check_interval, time_string, sizeof(time_string)); printf("\n", bg_class, time_string); get_interval_time_string(temp_service->retry_interval, time_string, sizeof(time_string)); printf("\n", bg_class, time_string); strncpy(command_line, temp_service->check_command, sizeof(command_line)); command_line[sizeof(command_line) - 1] = '\x0'; command_name = strtok(strdup(command_line), "!"); /* printf("\n",bg_class,CONFIG_CGI,url_encode(command_name),html_encode(command_line,FALSE)); */ printf("\n", bg_class, CONFIG_CGI, url_encode(command_line), html_encode(command_line, FALSE)); free(command_name); printf("\n"); printf("\n", bg_class, (temp_service->parallelize == TRUE) ? "Yes" : "No"); printf("\n", bg_class, (temp_service->is_volatile == TRUE) ? "Yes" : "No"); printf("\n", bg_class, (temp_service->obsess == TRUE) ? "Yes" : "No"); printf("\n", bg_class, (temp_service->checks_enabled == TRUE) ? "Yes" : "No"); printf("\n", bg_class, (temp_service->accept_passive_checks == TRUE) ? "Yes" : "No"); printf("\n", bg_class, (temp_service->check_freshness == TRUE) ? "Yes" : "No"); printf("\n"); printf("\n"); printf("\n"); get_interval_time_string(temp_service->notification_interval, time_string, sizeof(time_string)); printf("\n", bg_class, (temp_service->notification_interval == 0) ? "No Re-notification" : html_encode(time_string, FALSE)); get_interval_time_string(temp_service->first_notification_delay, time_string, sizeof(time_string)); printf("\n", bg_class, time_string); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("", bg_class, (temp_service->notes == NULL) ? " " : html_encode(temp_service->notes, FALSE)); printf("", bg_class, (temp_service->notes_url == NULL) ? " " : html_encode(temp_service->notes_url, FALSE)); printf("", bg_class, (temp_service->action_url == NULL) ? " " : html_encode(temp_service->action_url, FALSE)); if(temp_service->icon_image == NULL) printf("", bg_class); else { process_macros_r(mac, temp_service->icon_image, &processed_string, 0); printf("", bg_class, url_logo_images_path, processed_string, html_encode(temp_service->icon_image, FALSE)); free(processed_string); } printf("", bg_class, (temp_service->icon_image_alt == NULL) ? " " : html_encode(temp_service->icon_image_alt, FALSE)); printf("\n"); printf("\n"); } printf("
    Service
    HostDescriptionImportanceMax. Check AttemptsNormal Check IntervalRetry Check IntervalCheck CommandCheck PeriodParallelizeVolatileObsess OverEnable Active ChecksEnable Passive ChecksCheck FreshnessFreshness ThresholdDefault Contacts/GroupsEnable NotificationsNotification IntervalFirst Notification DelayNotification OptionsNotification PeriodEvent HandlerEnable Event HandlerStalking OptionsEnable Flap DetectionLow Flap ThresholdHigh Flap ThresholdFlap Detection OptionsProcess Performance DataNotesNotes URLAction URLLogo ImageImage AltRetention Options
    ", url_encode(temp_service->description)); printf("%s%s%u%d%s%s%s%s", bg_class); if(temp_service->check_period == NULL) printf(" "); else printf("%s", CONFIG_CGI, url_encode(temp_service->check_period), html_encode(temp_service->check_period, FALSE)); printf("%s%s%s%s%s%s", bg_class); if(temp_service->freshness_threshold == 0) printf("Auto-determined value\n"); else printf("%d seconds\n", temp_service->freshness_threshold); printf("", bg_class); num_contacts = 0; for(temp_contactsmember = temp_service->contacts; temp_contactsmember != NULL; temp_contactsmember = temp_contactsmember->next) { num_contacts++; if(num_contacts > 1) printf(", "); printf("%s", CONFIG_CGI, url_encode(temp_contactsmember->contact_name), html_encode(temp_contactsmember->contact_name, FALSE)); } for(temp_contactgroupsmember = temp_service->contact_groups; temp_contactgroupsmember != NULL; temp_contactgroupsmember = temp_contactgroupsmember->next) { num_contacts++; if(num_contacts > 1) printf(", "); printf("%s\n", CONFIG_CGI, url_encode(temp_contactgroupsmember->group_name), html_encode(temp_contactgroupsmember->group_name, FALSE)); } if(num_contacts == 0) printf(" "); printf("", bg_class); printf("%s\n", (temp_service->notifications_enabled == TRUE) ? "Yes" : "No"); printf("%s%s", bg_class); options = 0; if(flag_isset(temp_service->notification_options, OPT_UNKNOWN) == TRUE) { options = 1; printf("Unknown"); } if(flag_isset(temp_service->notification_options, OPT_WARNING) == TRUE) { printf("%sWarning", (options) ? ", " : ""); options = 1; } if(flag_isset(temp_service->notification_options, OPT_CRITICAL) == TRUE) { printf("%sCritical", (options) ? ", " : ""); options = 1; } if(flag_isset(temp_service->notification_options, OPT_RECOVERY) == TRUE) { printf("%sRecovery", (options) ? ", " : ""); options = 1; } if(flag_isset(temp_service->notification_options, OPT_FLAPPING) == TRUE) { printf("%sFlapping", (options) ? ", " : ""); options = 1; } if(flag_isset(temp_service->notification_options, OPT_DOWNTIME) == TRUE) { printf("%sDowntime", (options) ? ", " : ""); options = 1; } if(!options) printf("None"); printf("", bg_class); if(temp_service->notification_period == NULL) printf(" "); else printf("%s", CONFIG_CGI, url_encode(temp_service->notification_period), html_encode(temp_service->notification_period, FALSE)); printf("", bg_class); if(temp_service->event_handler == NULL) printf(" "); else /* printf("%s",CONFIG_CGI,url_encode(strtok(temp_service->event_handler,"!")),html_encode(temp_service->event_handler,FALSE)); */ printf("%s", CONFIG_CGI, url_encode(temp_service->event_handler), html_encode(temp_service->event_handler, FALSE)); printf("", bg_class); printf("%s\n", (temp_service->event_handler_enabled == TRUE) ? "Yes" : "No"); printf("", bg_class); options = 0; if(flag_isset(temp_service->stalking_options, OPT_OK) == TRUE) { options = 1; printf("Ok"); } if(flag_isset(temp_service->stalking_options, OPT_WARNING) == TRUE) { printf("%sWarning", (options) ? ", " : ""); options = 1; } if(flag_isset(temp_service->stalking_options, OPT_UNKNOWN) == TRUE) { printf("%sUnknown", (options) ? ", " : ""); options = 1; } if(flag_isset(temp_service->stalking_options, OPT_CRITICAL) == TRUE) { printf("%sCritical", (options) ? ", " : ""); options = 1; } if(options == 0) printf("None"); printf("", bg_class); printf("%s\n", (temp_service->flap_detection_enabled == TRUE) ? "Yes" : "No"); printf("", bg_class); if(temp_service->low_flap_threshold == 0.0) printf("Program-wide value\n"); else printf("%3.1f%%\n", temp_service->low_flap_threshold); printf("", bg_class); if(temp_service->high_flap_threshold == 0.0) printf("Program-wide value\n"); else printf("%3.1f%%\n", temp_service->high_flap_threshold); printf("", bg_class); options = 0; if(flag_isset(temp_service->flap_detection_options, OPT_OK) == TRUE) { options = 1; printf("Ok"); } if(flag_isset(temp_service->flap_detection_options, OPT_WARNING) == TRUE) { printf("%sWarning", (options) ? ", " : ""); options = 1; } if(flag_isset(temp_service->flap_detection_options, OPT_UNKNOWN) == TRUE) { printf("%sUnknown", (options) ? ", " : ""); options = 1; } if(flag_isset(temp_service->flap_detection_options, OPT_CRITICAL) == TRUE) { printf("%sCritical", (options) ? ", " : ""); options = 1; } if(options == 0) printf("None"); printf("", bg_class); printf("%s\n", (temp_service->process_performance_data == TRUE) ? "Yes" : "No"); printf("%s%s%s  %s%s", bg_class); options = 0; if(temp_service->retain_status_information == TRUE) { options = 1; printf("Status Information"); } if(temp_service->retain_nonstatus_information == TRUE) { printf("%sNon-Status Information", (options == 1) ? ", " : ""); options = 1; } if(options == 0) printf("None"); printf("
    \n"); printf("
    \n"); printf("

    \n"); return; } void display_timeperiods(void) { timerange *temp_timerange = NULL; daterange *temp_daterange = NULL; timeperiod *temp_timeperiod = NULL; timeperiodexclusion *temp_timeperiodexclusion = NULL; const char *months[12] = {"january", "february", "march", "april", "may", "june", "july", "august", "september", "october", "november", "december"}; const char *days[7] = {"sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday"}; int odd = 0; int day = 0; int x = 0; const char *bg_class = ""; char timestring[10]; int hours = 0; int minutes = 0; int seconds = 0; int line = 0; int item = 0; /* see if user is authorized to view time period information... */ if(is_authorized_for_configuration_information(¤t_authdata) == FALSE) { unauthorized_message(); return; } printf("

    Time Period%s%s

    \n", (*to_expand == '\0' ? "s" : " "), (*to_expand == '\0' ? "" : html_encode(to_expand, FALSE))); printf("

    \n"); printf("

    \n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); /* check all the time periods... */ for(temp_timeperiod = timeperiod_list; temp_timeperiod != NULL; temp_timeperiod = temp_timeperiod->next) if(((*to_expand) == '\0') || (!strcmp(to_expand, temp_timeperiod->name))) { if(odd) { odd = 0; bg_class = "dataOdd"; } else { odd = 1; bg_class = "dataEven"; } printf("\n", bg_class); printf("\n", bg_class, url_encode(temp_timeperiod->name), html_encode(temp_timeperiod->name, FALSE)); printf("\n", bg_class, html_encode(temp_timeperiod->alias, FALSE)); printf(""); printf("\n"); printf("\n"); } } for(day = 0; day < 7; day++) { if(temp_timeperiod->days[day] == NULL) continue; line++; if(line > 1) printf("\n"); printf("\n"); } if(line == 0) { printf("\n"); printf("\n"); } } printf("
    NameAlias/DescriptionExclusionsDays/DatesTimes
    %s%s", bg_class); item = 0; for(temp_timeperiodexclusion = temp_timeperiod->exclusions; temp_timeperiodexclusion != NULL; temp_timeperiodexclusion = temp_timeperiodexclusion->next) { item++; printf("%s%s", (item == 1) ? "" : ", ", url_encode(temp_timeperiodexclusion->timeperiod_name), html_encode(temp_timeperiodexclusion->timeperiod_name, FALSE)); } printf("", bg_class); line = 0; for(x = 0; x < DATERANGE_TYPES; x++) { for(temp_daterange = temp_timeperiod->exceptions[x]; temp_daterange != NULL; temp_daterange = temp_daterange->next) { line++; if(line > 1) printf("
    \n", bg_class); switch(temp_daterange->type) { case DATERANGE_CALENDAR_DATE: printf("%d-%02d-%02d", temp_daterange->syear, temp_daterange->smon + 1, temp_daterange->smday); if((temp_daterange->smday != temp_daterange->emday) || (temp_daterange->smon != temp_daterange->emon) || (temp_daterange->syear != temp_daterange->eyear)) printf(" - %d-%02d-%02d", temp_daterange->eyear, temp_daterange->emon + 1, temp_daterange->emday); if(temp_daterange->skip_interval > 1) printf(" / %d", temp_daterange->skip_interval); break; case DATERANGE_MONTH_DATE: printf("%s %d", months[temp_daterange->smon], temp_daterange->smday); if((temp_daterange->smon != temp_daterange->emon) || (temp_daterange->smday != temp_daterange->emday)) { printf(" - %s %d", months[temp_daterange->emon], temp_daterange->emday); if(temp_daterange->skip_interval > 1) printf(" / %d", temp_daterange->skip_interval); } break; case DATERANGE_MONTH_DAY: printf("day %d", temp_daterange->smday); if(temp_daterange->smday != temp_daterange->emday) { printf(" - %d", temp_daterange->emday); if(temp_daterange->skip_interval > 1) printf(" / %d", temp_daterange->skip_interval); } break; case DATERANGE_MONTH_WEEK_DAY: printf("%s %d %s", days[temp_daterange->swday], temp_daterange->swday_offset, months[temp_daterange->smon]); if((temp_daterange->smon != temp_daterange->emon) || (temp_daterange->swday != temp_daterange->ewday) || (temp_daterange->swday_offset != temp_daterange->ewday_offset)) { printf(" - %s %d %s", days[temp_daterange->ewday], temp_daterange->ewday_offset, months[temp_daterange->emon]); if(temp_daterange->skip_interval > 1) printf(" / %d", temp_daterange->skip_interval); } break; case DATERANGE_WEEK_DAY: printf("%s %d", days[temp_daterange->swday], temp_daterange->swday_offset); if((temp_daterange->swday != temp_daterange->ewday) || (temp_daterange->swday_offset != temp_daterange->ewday_offset)) { printf(" - %s %d", days[temp_daterange->ewday], temp_daterange->ewday_offset); if(temp_daterange->skip_interval > 1) printf(" / %d", temp_daterange->skip_interval); } break; default: break; } printf("\n", bg_class); for(temp_timerange = temp_daterange->times; temp_timerange != NULL; temp_timerange = temp_timerange->next) { if(temp_timerange != temp_daterange->times) printf(", "); hours = temp_timerange->range_start / 3600; minutes = (temp_timerange->range_start - (hours * 3600)) / 60; seconds = temp_timerange->range_start - (hours * 3600) - (minutes * 60); snprintf(timestring, sizeof(timestring) - 1, "%02d:%02d:%02d", hours, minutes, seconds); timestring[sizeof(timestring) - 1] = '\x0'; printf("%s - ", timestring); hours = temp_timerange->range_end / 3600; minutes = (temp_timerange->range_end - (hours * 3600)) / 60; seconds = temp_timerange->range_end - (hours * 3600) - (minutes * 60); snprintf(timestring, sizeof(timestring) - 1, "%02d:%02d:%02d", hours, minutes, seconds); timestring[sizeof(timestring) - 1] = '\x0'; printf("%s", timestring); } printf("
    \n", bg_class); printf("%s", days[day]); printf("\n", bg_class); for(temp_timerange = temp_timeperiod->days[day]; temp_timerange != NULL; temp_timerange = temp_timerange->next) { if(temp_timerange != temp_timeperiod->days[day]) printf(", "); hours = temp_timerange->range_start / 3600; minutes = (temp_timerange->range_start - (hours * 3600)) / 60; seconds = temp_timerange->range_start - (hours * 3600) - (minutes * 60); snprintf(timestring, sizeof(timestring) - 1, "%02d:%02d:%02d", hours, minutes, seconds); timestring[sizeof(timestring) - 1] = '\x0'; printf("%s - ", timestring); hours = temp_timerange->range_end / 3600; minutes = (temp_timerange->range_end - (hours * 3600)) / 60; seconds = temp_timerange->range_end - (hours * 3600) - (minutes * 60); snprintf(timestring, sizeof(timestring) - 1, "%02d:%02d:%02d", hours, minutes, seconds); timestring[sizeof(timestring) - 1] = '\x0'; printf("%s", timestring); } printf(" 
    \n"); printf("
    \n"); printf("

    \n"); return; } void display_commands(void) { command *temp_command; int odd = 0; const char *bg_class = ""; /* see if user is authorized to view command information... */ if(is_authorized_for_configuration_information(¤t_authdata) == FALSE) { unauthorized_message(); return; } printf("

    Command%s%s

    \n", (*to_expand == '\0' ? "s" : " "), (*to_expand == '\0' ? "" : html_encode(to_expand, FALSE))); printf("

    \n"); printf("\n"); printf("\n"); /* check all commands */ for(temp_command = command_list; temp_command != NULL; temp_command = temp_command->next) if(((*to_expand) == '\0') || (!strcmp(to_expand, temp_command->name))) { if(odd) { odd = 0; bg_class = "dataEven"; } else { odd = 1; bg_class = "dataOdd"; } printf("\n", bg_class); printf("\n", bg_class, url_encode(temp_command->name), html_encode(temp_command->name, FALSE)); printf("\n", bg_class, html_encode(temp_command->command_line, FALSE)); printf("\n"); } printf("
    Command NameCommand Line
    %s%s
    \n"); printf("

    \n"); return; } static void display_servicedependency(servicedependency *temp_sd) { const char *bg_class; static int odd = 0; int options; if(*to_expand != '\0' && (strcmp(to_expand, temp_sd->dependent_host_name) || strcmp(to_expand, temp_sd->host_name))) return; if(odd) bg_class = "dataOdd"; else bg_class = "dataEven"; odd ^= 1; /* xor with 1 always flips the switch */ printf("\n", bg_class); printf("%s", bg_class, CONFIG_CGI, url_encode(temp_sd->dependent_host_name), html_encode(temp_sd->dependent_host_name, FALSE)); printf("%s\n", url_encode(temp_sd->dependent_service_description), html_encode(temp_sd->dependent_service_description, FALSE)); printf("%s", bg_class, CONFIG_CGI, url_encode(temp_sd->host_name), html_encode(temp_sd->host_name, FALSE)); printf("%s\n", url_encode(temp_sd->service_description), html_encode(temp_sd->service_description, FALSE)); printf("%s", bg_class, (temp_sd->dependency_type == NOTIFICATION_DEPENDENCY) ? "Notification" : "Check Execution"); printf("", bg_class); if(temp_sd->dependency_period == NULL) printf(" "); else printf("%s", CONFIG_CGI, url_encode(temp_sd->dependency_period), html_encode(temp_sd->dependency_period, FALSE)); printf("\n"); printf("", bg_class); options = FALSE; if(flag_isset(temp_sd->failure_options, OPT_OK) == TRUE) { printf("Ok"); options = TRUE; } if(flag_isset(temp_sd->failure_options, OPT_WARNING) == TRUE) { printf("%sWarning", (options == TRUE) ? ", " : ""); options = TRUE; } if(flag_isset(temp_sd->failure_options, OPT_UNKNOWN) == TRUE) { printf("%sUnknown", (options == TRUE) ? ", " : ""); options = TRUE; } if(flag_isset(temp_sd->failure_options, OPT_CRITICAL) == TRUE) { printf("%sCritical", (options == TRUE) ? ", " : ""); options = TRUE; } if(flag_isset(temp_sd->failure_options, OPT_PENDING) == TRUE) { printf("%sPending", (options == TRUE) ? ", " : ""); options = TRUE; } printf("\n"); printf("\n"); } void display_servicedependencies(void) { unsigned int i; /* see if user is authorized to view hostgroup information... */ if(is_authorized_for_configuration_information(¤t_authdata) == FALSE) { unauthorized_message(); return; } printf("

    Service Dependencie%s%s

    \n", (*to_expand == '\0' ? "s" : "s Involving Host "), (*to_expand == '\0' ? "" : html_encode(to_expand, FALSE))); printf("

    \n"); printf("

    \n"); printf("\n"); printf("\n"); printf(""); printf(""); printf("\n"); printf("\n"); printf(""); printf(""); printf(""); printf(""); printf(""); printf(""); printf(""); printf("\n"); for(i = 0; i < num_objects.servicedependencies; i++) { display_servicedependency(servicedependency_ary[i]); } printf("
    Dependent ServiceMaster Service
    HostServiceHostServiceDependency TypeDependency PeriodDependency Failure Options
    \n"); printf("
    \n"); printf("

    \n"); return; } void display_serviceescalations(void) { serviceescalation *temp_se = NULL; contactsmember *temp_contactsmember = NULL; contactgroupsmember *temp_contactgroupsmember = NULL; char time_string[16] = ""; int options = FALSE; int odd = 0; const char *bg_class = ""; int num_contacts = 0; unsigned int i; /* see if user is authorized to view hostgroup information... */ if(is_authorized_for_configuration_information(¤t_authdata) == FALSE) { unauthorized_message(); return; } printf("

    Service Escalation%s%s

    \n", (*to_expand == '\0' ? "s" : "s on Host "), (*to_expand == '\0' ? "" : html_encode(to_expand, FALSE))); printf("

    \n"); printf("

    \n"); printf("\n"); printf("\n"); printf(""); printf("\n"); printf("\n"); printf(""); printf(""); printf(""); printf(""); printf(""); printf(""); printf(""); printf(""); printf("\n"); for(i = 0; i < num_objects.serviceescalations; i++) { temp_se = serviceescalation_ary[i]; if(*to_expand != '\0' && strcmp(to_expand, temp_se->host_name)) continue; if(odd) { odd = 0; bg_class = "dataOdd"; } else { odd = 1; bg_class = "dataEven"; } printf("\n", bg_class); printf("", bg_class, CONFIG_CGI, url_encode(temp_se->host_name), html_encode(temp_se->host_name, FALSE)); printf("\n", url_encode(temp_se->description), html_encode(temp_se->description, FALSE)); printf("\n"); printf("", bg_class, temp_se->first_notification); printf("\n"); get_interval_time_string(temp_se->notification_interval, time_string, sizeof(time_string)); printf("\n"); printf("\n"); printf("\n"); printf("\n"); } printf("
    Service
    HostDescriptionContacts/GroupsFirst NotificationLast NotificationNotification IntervalEscalation PeriodEscalation Options
    %s%s", bg_class); num_contacts = 0; for(temp_contactsmember = temp_se->contacts; temp_contactsmember != NULL; temp_contactsmember = temp_contactsmember->next) { num_contacts++; if(num_contacts > 1) printf(", "); printf("%s\n", CONFIG_CGI, url_encode(temp_contactsmember->contact_name), html_encode(temp_contactsmember->contact_name, FALSE)); } for(temp_contactgroupsmember = temp_se->contact_groups; temp_contactgroupsmember != NULL; temp_contactgroupsmember = temp_contactgroupsmember->next) { num_contacts++; if(num_contacts > 1) printf(", "); printf("%s\n", CONFIG_CGI, url_encode(temp_contactgroupsmember->group_name), html_encode(temp_contactgroupsmember->group_name, FALSE)); } if(num_contacts == 0) printf(" "); printf("%d", bg_class); if(temp_se->last_notification == 0) printf("Infinity"); else printf("%d", temp_se->last_notification); printf("", bg_class); if(temp_se->notification_interval == 0.0) printf("Notify Only Once (No Re-notification)"); else printf("%s", time_string); printf("", bg_class); if(temp_se->escalation_period == NULL) printf(" "); else printf("%s", CONFIG_CGI, url_encode(temp_se->escalation_period), html_encode(temp_se->escalation_period, FALSE)); printf("", bg_class); options = FALSE; if(flag_isset(temp_se->escalation_options, OPT_WARNING) == TRUE) { printf("%sWarning", (options == TRUE) ? ", " : ""); options = TRUE; } if(flag_isset(temp_se->escalation_options, OPT_UNKNOWN) == TRUE) { printf("%sUnknown", (options == TRUE) ? ", " : ""); options = TRUE; } if(flag_isset(temp_se->escalation_options, OPT_CRITICAL) == TRUE) { printf("%sCritical", (options == TRUE) ? ", " : ""); options = TRUE; } if(flag_isset(temp_se->escalation_options, OPT_RECOVERY) == TRUE) { printf("%sRecovery", (options == TRUE) ? ", " : ""); options = TRUE; } if(options == FALSE) printf("None"); printf("
    \n"); printf("
    \n"); printf("

    \n"); return; } static void display_hostdependency(hostdependency *temp_hd) { int options; const char *bg_class = ""; static int odd = 0; if(*to_expand != '\0' && (strcmp(to_expand, temp_hd->dependent_host_name) && !strcmp(to_expand, temp_hd->host_name))) return; if(odd) bg_class = "dataOdd"; else bg_class = "dataEven"; odd ^= 1; printf("\n", bg_class); printf("%s", bg_class, CONFIG_CGI, url_encode(temp_hd->dependent_host_name), html_encode(temp_hd->dependent_host_name, FALSE)); printf("%s", bg_class, CONFIG_CGI, url_encode(temp_hd->host_name), html_encode(temp_hd->host_name, FALSE)); printf("%s", bg_class, (temp_hd->dependency_type == NOTIFICATION_DEPENDENCY) ? "Notification" : "Check Execution"); printf("", bg_class); if(temp_hd->dependency_period == NULL) printf(" "); else printf("%s", CONFIG_CGI, url_encode(temp_hd->dependency_period), html_encode(temp_hd->dependency_period, FALSE)); printf("\n"); printf("", bg_class); options = FALSE; if(flag_isset(temp_hd->failure_options, OPT_UP) == TRUE) { printf("Up"); options = TRUE; } if(flag_isset(temp_hd->failure_options, OPT_DOWN) == TRUE) { printf("%sDown", (options == TRUE) ? ", " : ""); options = TRUE; } if(flag_isset(temp_hd->failure_options, OPT_UNREACHABLE) == TRUE) { printf("%sUnreachable", (options == TRUE) ? ", " : ""); options = TRUE; } if(flag_isset(temp_hd->failure_options, OPT_PENDING) == TRUE) { printf("%sPending", (options == TRUE) ? ", " : ""); options = TRUE; } printf("\n"); printf("\n"); } void display_hostdependencies(void) { unsigned int i; /* see if user is authorized to view hostdependency information... */ if(is_authorized_for_configuration_information(¤t_authdata) == FALSE) { unauthorized_message(); return; } printf("

    Host Dependencie%s%s

    \n", (*to_expand == '\0' ? "s" : "s Involving Host "), (*to_expand == '\0' ? "" : html_encode(to_expand, FALSE))); printf("

    \n"); printf("

    \n"); printf("\n"); printf("\n"); printf(""); printf(""); printf(""); printf(""); printf(""); printf("\n"); /* print all host dependencies... */ for(i = 0; i < num_objects.hostdependencies; i++) display_hostdependency(hostdependency_ary[i]); printf("
    Dependent HostMaster HostDependency TypeDependency PeriodDependency Failure Options
    \n"); printf("
    \n"); printf("

    \n"); return; } void display_hostescalations(void) { hostescalation *temp_he = NULL; contactsmember *temp_contactsmember = NULL; contactgroupsmember *temp_contactgroupsmember = NULL; char time_string[16] = ""; int options = FALSE; int odd = 0; const char *bg_class = ""; int num_contacts = 0; unsigned int i; /* see if user is authorized to view hostgroup information... */ if(is_authorized_for_configuration_information(¤t_authdata) == FALSE) { unauthorized_message(); return; } printf("

    Host Escalation%s%s

    \n", (*to_expand == '\0' ? "s" : "s for Host "), (*to_expand == '\0' ? "" : html_encode(to_expand, FALSE))); printf("

    \n"); printf("

    \n"); printf("\n"); printf("\n"); printf(""); printf(""); printf(""); printf(""); printf(""); printf(""); printf(""); printf("\n"); /* print all hostescalations... */ for(i = 0; i < num_objects.hostescalations; i++) { temp_he = hostescalation_ary[i]; if(*to_expand != '\0' && strcmp(to_expand, temp_he->host_name)) continue; if(odd) { odd = 0; bg_class = "dataOdd"; } else { odd = 1; bg_class = "dataEven"; } printf("\n", bg_class); printf("", bg_class, CONFIG_CGI, url_encode(temp_he->host_name), html_encode(temp_he->host_name, FALSE)); printf("\n"); printf("", bg_class, temp_he->first_notification); printf("\n"); get_interval_time_string(temp_he->notification_interval, time_string, sizeof(time_string)); printf("\n"); printf("\n"); printf("\n"); printf("\n"); } printf("
    HostContacts/GroupsFirst NotificationLast NotificationNotification IntervalEscalation PeriodEscalation Options
    %s", bg_class); num_contacts = 0; for(temp_contactsmember = temp_he->contacts; temp_contactsmember != NULL; temp_contactsmember = temp_contactsmember->next) { num_contacts++; if(num_contacts > 1) printf(", "); printf("%s\n", CONFIG_CGI, url_encode(temp_contactsmember->contact_name), html_encode(temp_contactsmember->contact_name, FALSE)); } for(temp_contactgroupsmember = temp_he->contact_groups; temp_contactgroupsmember != NULL; temp_contactgroupsmember = temp_contactgroupsmember->next) { num_contacts++; if(num_contacts > 1) printf(", "); printf("%s\n", CONFIG_CGI, url_encode(temp_contactgroupsmember->group_name), html_encode(temp_contactgroupsmember->group_name, FALSE)); } if(num_contacts == 0) printf(" "); printf("%d", bg_class); if(temp_he->last_notification == 0) printf("Infinity"); else printf("%d", temp_he->last_notification); printf("", bg_class); if(temp_he->notification_interval == 0.0) printf("Notify Only Once (No Re-notification)"); else printf("%s", time_string); printf("", bg_class); if(temp_he->escalation_period == NULL) printf(" "); else printf("%s", CONFIG_CGI, url_encode(temp_he->escalation_period), html_encode(temp_he->escalation_period, FALSE)); printf("", bg_class); options = FALSE; if(flag_isset(temp_he->escalation_options, OPT_DOWN) == TRUE) { printf("%sDown", (options == TRUE) ? ", " : ""); options = TRUE; } if(flag_isset(temp_he->escalation_options, OPT_UNREACHABLE) == TRUE) { printf("%sUnreachable", (options == TRUE) ? ", " : ""); options = TRUE; } if(flag_isset(temp_he->escalation_options, OPT_RECOVERY) == TRUE) { printf("%sRecovery", (options == TRUE) ? ", " : ""); options = TRUE; } if(options == FALSE) printf("None"); printf("
    \n"); printf("
    \n"); printf("

    \n"); return; } void unauthorized_message(void) { printf("

    It appears as though you do not have permission to view the configuration information you requested...

    \n"); printf("

    If you believe this is an error, check the HTTP server authentication requirements for accessing this CGI
    "); printf("and check the authorization options in your CGI configuration file.

    \n"); return; } static const char *hash_color(int i) { char c; /* This is actually optimized for MAX_COMMAND_ARGUMENTS==32 ... */ if((i % 32) < 16) { if((i % 32) < 8) c = '7'; else c = '4'; } else { if((i % 32) < 24) c = '6'; else c = '5'; } /* Computation for standard case */ hashed_color[0] = '#'; hashed_color[1] = hashed_color[2] = ((i % 2) ? c : '0'); hashed_color[3] = hashed_color[4] = (((i / 2) % 2) ? c : '0'); hashed_color[5] = hashed_color[6] = (((i / 4) % 2) ? c : '0'); hashed_color[7] = '\0'; /* Override shades of grey */ if((i % 8) == 7) hashed_color[1] = hashed_color[3] = '0'; if((i % 8) == 0) hashed_color[2] = hashed_color[3] = hashed_color[4] = hashed_color[6] = c; return(hashed_color); } void display_command_expansion(void) { command *temp_command; int odd = 0; const char *bg_class = ""; int i, j; char *c, *cc; char commandline[MAX_COMMAND_BUFFER]; char *command_args[MAX_COMMAND_ARGUMENTS]; int arg_count[MAX_COMMAND_ARGUMENTS], lead_space[MAX_COMMAND_ARGUMENTS], trail_space[MAX_COMMAND_ARGUMENTS]; /* see if user is authorized to view command information... */ if(is_authorized_for_configuration_information(¤t_authdata) == FALSE) { unauthorized_message(); return; } printf("

    Command Expansion

    \n"); /* Parse to_expand into parts */ for(i = 0; i < MAX_COMMAND_ARGUMENTS; i++) command_args[i] = NULL; for(i = 0, command_args[0] = cc = c = strdup(to_expand); c && ((*c) != '\0') && (i < MAX_COMMAND_ARGUMENTS); c++, cc++) { if((*c) == '\\') c++; else if((*c) == '!') { (*cc) = '\0'; cc = c++; command_args[++i] = (c--); } (*cc) = (*c); } if((*c) == '\0')(*cc) = '\0'; /* Precompute indexes of dangling whitespace */ for(i = 0; i < MAX_COMMAND_ARGUMENTS; i++) { for(cc = command_args[i], lead_space[i] = 0; cc && isspace(*cc); cc++, lead_space[i]++) ; trail_space[i] = 0; for(; cc && ((*cc) != '\0'); cc++) if(isspace(*cc)) trail_space[i]++; else trail_space[i] = 0; } printf("

    \n"); printf("\n"); printf("\n"); if((*to_expand) != '\0') { arg_count[0] = 0; printf("\n"); /* check all commands */ for(temp_command = command_list; temp_command != NULL; temp_command = temp_command->next) { if(!strcmp(temp_command->name, command_args[0])) { arg_count[0]++; if(odd) { odd = 0; bg_class = "dataEven"; } else { odd = 1; bg_class = "dataOdd"; } printf("\n", bg_class); printf("\n", bg_class, url_encode(temp_command->name), html_encode(temp_command->name, FALSE)); printf("\n", bg_class, html_encode(temp_command->command_line, FALSE)); printf("\n\n", bg_class); for(i = 1; i < MAX_COMMAND_ARGUMENTS; i++) arg_count[i] = 0; printf("\n", bg_class); printf("\n"); for(i = 1; (i < MAX_COMMAND_ARGUMENTS) && (command_args[i]); i++) { if(arg_count[i] == 0) { printf("\n", bg_class, bg_class); printf("\n", bg_class, i, hash_color(i), ((lead_space[i] > 0) || (trail_space[i] > 0) ? "‍" : ""), html_encode(command_args[i], FALSE), ((lead_space[i] > 0) || (trail_space[i] > 0) ? "‍" : "")); } else if(arg_count[i] > 1) { printf("\n", bg_class, bg_class, i); printf("\n", bg_class, i, hash_color(i), ((lead_space[i] > 0) || (trail_space[i] > 0) ? "‍" : ""), html_encode(command_args[i], FALSE), ((lead_space[i] > 0) || (trail_space[i] > 0) ? "‍" : "")); } if((lead_space[i] > 0) || (trail_space[i] > 0)) { printf("\n", bg_class, bg_class); printf("\n"); } } } } if(!arg_count[0]) { printf("\n", html_encode(command_args[0], FALSE)); } } printf("\n"); printf("\n"); printf("
    Command NameCommand Line
    To expand:%s", escape_string(command_args[0])); for(i = 1; (i < MAX_COMMAND_ARGUMENTS) && command_args[i]; i++) printf("!%s", hash_color(i), escape_string(command_args[i])); printf("\n
    %s%s
    ->", bg_class); strncpy(commandline, temp_command->command_line, MAX_COMMAND_BUFFER); commandline[MAX_COMMAND_BUFFER - 1] = '\0'; for(c = commandline; c && (cc = strstr(c, "$"));) { (*(cc++)) = '\0'; printf("%s", html_encode(c, FALSE)); if((*cc) == '$') { /* Escaped '$' */ printf("$"); c = (++cc); } else if(strncmp("ARG", cc, 3)) { /* Non-$ARGn$ macro */ c = strstr(cc, "$"); if(c)(*(c++)) = '\0'; printf("$%s%s", html_encode(cc, FALSE), (c ? "$" : "")); if(!c) printf(" (not properly terminated)"); } else { /* $ARGn$ macro */ for(c = (cc += 3); isdigit(*c); c++) ; if(((*c) == '\0') || ((*c) == '$')) { /* Index is numeric */ i = atoi(cc); if((i > 0) && (i <= MAX_COMMAND_ARGUMENTS)) { arg_count[i]++; if(command_args[i]) { if(*(command_args[i]) != '\0') printf("%s%s%s", hash_color(i), ((lead_space[i] > 0) || (trail_space[i] > 0) ? "‍" : ""), html_encode(command_args[i], FALSE), ((lead_space[i] > 0) || (trail_space[i] > 0) ? "‍" : "")); else printf("(empty)"); } else printf("(undefined)"); } else printf("(not a valid $ARGn$ index: %u)", i); if((*c) != '\0') c++; else printf(" (not properly terminated)"); } else { /* Syntax err in index */ c = strstr(cc, "$"); printf("(not an $ARGn$ index: "%s")", html_encode(strtok(cc, "$"), FALSE)); if(c) c++; } } } if(c) printf("%s", html_encode(c, FALSE)); printf("
    unused:$ARG%u$=%s%s%s
    used %u x:$ARG%u$=%s%s%s
    dangling whitespace:$ARG%u$=", bg_class, i); for(c = command_args[i], j = 0; c && isspace(*c); c++, j++) /* TODO: As long as the hyperlinks change all whitespace into actual spaces, we'll output "[WS]" (whitespace) instead of "[SP]"(ace). */ /* if ((*c)==' ') printf("[SP]"); */ if((*c) == ' ') printf("[WS]"); else if((*c) == '\f') printf("[FF]"); else if((*c) == '\n') printf("[LF]"); else if((*c) == '\r') printf("[CR]"); else if((*c) == '\t') printf("[HT]"); else if((*c) == '\v') printf("[VT]"); else printf("[0x%x]", *c); printf("", hash_color(i)); for(; c && ((*c) != '\0') && (j < (int)strlen(command_args[i]) - trail_space[i]); c++, j++) putchar(*c); printf(""); for(; c && ((*c) != '\0'); c++) /* TODO: As long as the hyperlinks change all whitespace into actual spaces, we'll output "[WS]" (whitespace) instead of "[SP]"(ace). */ /* if ((*c)==' ') printf("[SP]"); */ if((*c) == ' ') printf("[WS]"); else if((*c) == '\f') printf("[FF]"); else if((*c) == '\n') printf("[LF]"); else if((*c) == '\r') printf("[CR]"); else if((*c) == '\t') printf("[HT]"); else if((*c) == '\v') printf("[VT]"); else printf("[0x%x]", *c); printf("
    Error:No\n"); printf("command "%s" found

    Enter the command_check definition from a host or service definition and press Go to see the expansion of the command
    To expand:\n", html_encode(to_expand, FALSE)); printf("
    \n"); printf("

    \n"); return; } void display_options(void) { printf("

    \n"); printf("
    Select Type of Config Data You Wish To View
    \n"); printf("

    \n"); printf("
    \n", CONFIG_CGI); printf("
    \n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("
    Object Type:
    "); printf("\n"); printf("
    \n"); printf("
    \n"); printf("
    \n"); return; } nagios-4.3.4/cgi/extcmd_list.c000066400000000000000000000212161314764422400162400ustar00rootroot00000000000000#include #include #include #include "../include/common.h" struct nagios_extcmd { const char *name; int id; /* size_t namelen; int min_args; int (*handler)(struct nagios_extcmd *, int, char **); struct nagios_extcmd *next_handler; */ }; #define CMD_DEF(name, min_args, handler) \ { #name, CMD_ ## name } /* { #name, sizeof(#name) - 1, CMD_ ## name, min_args, handler, NULL } */ struct nagios_extcmd in_core_commands[] = { CMD_DEF(NONE, 0, NULL), CMD_DEF(ADD_HOST_COMMENT, 0, NULL), CMD_DEF(DEL_HOST_COMMENT, 0, NULL), CMD_DEF(ADD_SVC_COMMENT, 0, NULL), CMD_DEF(DEL_SVC_COMMENT, 0, NULL), CMD_DEF(ENABLE_SVC_CHECK, 0, NULL), CMD_DEF(DISABLE_SVC_CHECK, 0, NULL), CMD_DEF(SCHEDULE_SVC_CHECK, 0, NULL), CMD_DEF(DELAY_SVC_NOTIFICATION, 0, NULL), CMD_DEF(DELAY_HOST_NOTIFICATION, 0, NULL), CMD_DEF(DISABLE_NOTIFICATIONS, 0, NULL), CMD_DEF(ENABLE_NOTIFICATIONS, 0, NULL), CMD_DEF(RESTART_PROCESS, 0, NULL), CMD_DEF(SHUTDOWN_PROCESS, 0, NULL), CMD_DEF(ENABLE_HOST_SVC_CHECKS, 0, NULL), CMD_DEF(DISABLE_HOST_SVC_CHECKS, 0, NULL), CMD_DEF(SCHEDULE_HOST_SVC_CHECKS, 0, NULL), CMD_DEF(DELAY_HOST_SVC_NOTIFICATIONS, 0, NULL), CMD_DEF(DEL_ALL_HOST_COMMENTS, 0, NULL), CMD_DEF(DEL_ALL_SVC_COMMENTS, 0, NULL), CMD_DEF(ENABLE_SVC_NOTIFICATIONS, 0, NULL), CMD_DEF(DISABLE_SVC_NOTIFICATIONS, 0, NULL), CMD_DEF(ENABLE_HOST_NOTIFICATIONS, 0, NULL), CMD_DEF(DISABLE_HOST_NOTIFICATIONS, 0, NULL), CMD_DEF(ENABLE_ALL_NOTIFICATIONS_BEYOND_HOST, 0, NULL), CMD_DEF(DISABLE_ALL_NOTIFICATIONS_BEYOND_HOST, 0, NULL), CMD_DEF(ENABLE_HOST_SVC_NOTIFICATIONS, 0, NULL), CMD_DEF(DISABLE_HOST_SVC_NOTIFICATIONS, 0, NULL), CMD_DEF(PROCESS_SERVICE_CHECK_RESULT, 0, NULL), CMD_DEF(SAVE_STATE_INFORMATION, 0, NULL), CMD_DEF(READ_STATE_INFORMATION, 0, NULL), CMD_DEF(ACKNOWLEDGE_HOST_PROBLEM, 0, NULL), CMD_DEF(ACKNOWLEDGE_SVC_PROBLEM, 0, NULL), CMD_DEF(START_EXECUTING_SVC_CHECKS, 0, NULL), CMD_DEF(STOP_EXECUTING_SVC_CHECKS, 0, NULL), CMD_DEF(START_ACCEPTING_PASSIVE_SVC_CHECKS, 0, NULL), CMD_DEF(STOP_ACCEPTING_PASSIVE_SVC_CHECKS, 0, NULL), CMD_DEF(ENABLE_PASSIVE_SVC_CHECKS, 0, NULL), CMD_DEF(DISABLE_PASSIVE_SVC_CHECKS, 0, NULL), CMD_DEF(ENABLE_EVENT_HANDLERS, 0, NULL), CMD_DEF(DISABLE_EVENT_HANDLERS, 0, NULL), CMD_DEF(ENABLE_HOST_EVENT_HANDLER, 0, NULL), CMD_DEF(DISABLE_HOST_EVENT_HANDLER, 0, NULL), CMD_DEF(ENABLE_SVC_EVENT_HANDLER, 0, NULL), CMD_DEF(DISABLE_SVC_EVENT_HANDLER, 0, NULL), CMD_DEF(ENABLE_HOST_CHECK, 0, NULL), CMD_DEF(DISABLE_HOST_CHECK, 0, NULL), CMD_DEF(START_OBSESSING_OVER_SVC_CHECKS, 0, NULL), CMD_DEF(STOP_OBSESSING_OVER_SVC_CHECKS, 0, NULL), CMD_DEF(REMOVE_HOST_ACKNOWLEDGEMENT, 0, NULL), CMD_DEF(REMOVE_SVC_ACKNOWLEDGEMENT, 0, NULL), CMD_DEF(SCHEDULE_FORCED_HOST_SVC_CHECKS, 0, NULL), CMD_DEF(SCHEDULE_FORCED_SVC_CHECK, 0, NULL), CMD_DEF(SCHEDULE_HOST_DOWNTIME, 0, NULL), CMD_DEF(SCHEDULE_SVC_DOWNTIME, 0, NULL), CMD_DEF(ENABLE_HOST_FLAP_DETECTION, 0, NULL), CMD_DEF(DISABLE_HOST_FLAP_DETECTION, 0, NULL), CMD_DEF(ENABLE_SVC_FLAP_DETECTION, 0, NULL), CMD_DEF(DISABLE_SVC_FLAP_DETECTION, 0, NULL), CMD_DEF(ENABLE_FLAP_DETECTION, 0, NULL), CMD_DEF(DISABLE_FLAP_DETECTION, 0, NULL), CMD_DEF(ENABLE_HOSTGROUP_SVC_NOTIFICATIONS, 0, NULL), CMD_DEF(DISABLE_HOSTGROUP_SVC_NOTIFICATIONS, 0, NULL), CMD_DEF(ENABLE_HOSTGROUP_HOST_NOTIFICATIONS, 0, NULL), CMD_DEF(DISABLE_HOSTGROUP_HOST_NOTIFICATIONS, 0, NULL), CMD_DEF(ENABLE_HOSTGROUP_SVC_CHECKS, 0, NULL), CMD_DEF(DISABLE_HOSTGROUP_SVC_CHECKS, 0, NULL), CMD_DEF(DEL_HOST_DOWNTIME, 0, NULL), CMD_DEF(DEL_SVC_DOWNTIME, 0, NULL), CMD_DEF(ENABLE_PERFORMANCE_DATA, 0, NULL), CMD_DEF(DISABLE_PERFORMANCE_DATA, 0, NULL), CMD_DEF(SCHEDULE_HOSTGROUP_HOST_DOWNTIME, 0, NULL), CMD_DEF(SCHEDULE_HOSTGROUP_SVC_DOWNTIME, 0, NULL), CMD_DEF(SCHEDULE_HOST_SVC_DOWNTIME, 0, NULL), CMD_DEF(PROCESS_HOST_CHECK_RESULT, 0, NULL), CMD_DEF(START_EXECUTING_HOST_CHECKS, 0, NULL), CMD_DEF(STOP_EXECUTING_HOST_CHECKS, 0, NULL), CMD_DEF(START_ACCEPTING_PASSIVE_HOST_CHECKS, 0, NULL), CMD_DEF(STOP_ACCEPTING_PASSIVE_HOST_CHECKS, 0, NULL), CMD_DEF(ENABLE_PASSIVE_HOST_CHECKS, 0, NULL), CMD_DEF(DISABLE_PASSIVE_HOST_CHECKS, 0, NULL), CMD_DEF(START_OBSESSING_OVER_HOST_CHECKS, 0, NULL), CMD_DEF(STOP_OBSESSING_OVER_HOST_CHECKS, 0, NULL), CMD_DEF(SCHEDULE_HOST_CHECK, 0, NULL), CMD_DEF(SCHEDULE_FORCED_HOST_CHECK, 0, NULL), CMD_DEF(START_OBSESSING_OVER_SVC, 0, NULL), CMD_DEF(STOP_OBSESSING_OVER_SVC, 0, NULL), CMD_DEF(START_OBSESSING_OVER_HOST, 0, NULL), CMD_DEF(STOP_OBSESSING_OVER_HOST, 0, NULL), CMD_DEF(ENABLE_HOSTGROUP_HOST_CHECKS, 0, NULL), CMD_DEF(DISABLE_HOSTGROUP_HOST_CHECKS, 0, NULL), CMD_DEF(ENABLE_HOSTGROUP_PASSIVE_SVC_CHECKS, 0, NULL), CMD_DEF(DISABLE_HOSTGROUP_PASSIVE_SVC_CHECKS, 0, NULL), CMD_DEF(ENABLE_HOSTGROUP_PASSIVE_HOST_CHECKS, 0, NULL), CMD_DEF(DISABLE_HOSTGROUP_PASSIVE_HOST_CHECKS, 0, NULL), CMD_DEF(ENABLE_SERVICEGROUP_SVC_NOTIFICATIONS, 0, NULL), CMD_DEF(DISABLE_SERVICEGROUP_SVC_NOTIFICATIONS, 0, NULL), CMD_DEF(ENABLE_SERVICEGROUP_HOST_NOTIFICATIONS, 0, NULL), CMD_DEF(DISABLE_SERVICEGROUP_HOST_NOTIFICATIONS, 0, NULL), CMD_DEF(ENABLE_SERVICEGROUP_SVC_CHECKS, 0, NULL), CMD_DEF(DISABLE_SERVICEGROUP_SVC_CHECKS, 0, NULL), CMD_DEF(ENABLE_SERVICEGROUP_HOST_CHECKS, 0, NULL), CMD_DEF(DISABLE_SERVICEGROUP_HOST_CHECKS, 0, NULL), CMD_DEF(ENABLE_SERVICEGROUP_PASSIVE_SVC_CHECKS, 0, NULL), CMD_DEF(DISABLE_SERVICEGROUP_PASSIVE_SVC_CHECKS, 0, NULL), CMD_DEF(ENABLE_SERVICEGROUP_PASSIVE_HOST_CHECKS, 0, NULL), CMD_DEF(DISABLE_SERVICEGROUP_PASSIVE_HOST_CHECKS, 0, NULL), CMD_DEF(SCHEDULE_SERVICEGROUP_HOST_DOWNTIME, 0, NULL), CMD_DEF(SCHEDULE_SERVICEGROUP_SVC_DOWNTIME, 0, NULL), CMD_DEF(CHANGE_GLOBAL_HOST_EVENT_HANDLER, 0, NULL), CMD_DEF(CHANGE_GLOBAL_SVC_EVENT_HANDLER, 0, NULL), CMD_DEF(CHANGE_HOST_EVENT_HANDLER, 0, NULL), CMD_DEF(CHANGE_SVC_EVENT_HANDLER, 0, NULL), CMD_DEF(CHANGE_HOST_CHECK_COMMAND, 0, NULL), CMD_DEF(CHANGE_SVC_CHECK_COMMAND, 0, NULL), CMD_DEF(CHANGE_NORMAL_HOST_CHECK_INTERVAL, 0, NULL), CMD_DEF(CHANGE_NORMAL_SVC_CHECK_INTERVAL, 0, NULL), CMD_DEF(CHANGE_RETRY_SVC_CHECK_INTERVAL, 0, NULL), CMD_DEF(CHANGE_MAX_HOST_CHECK_ATTEMPTS, 0, NULL), CMD_DEF(CHANGE_MAX_SVC_CHECK_ATTEMPTS, 0, NULL), CMD_DEF(SCHEDULE_AND_PROPAGATE_TRIGGERED_HOST_DOWNTIME, 0, NULL), CMD_DEF(ENABLE_HOST_AND_CHILD_NOTIFICATIONS, 0, NULL), CMD_DEF(DISABLE_HOST_AND_CHILD_NOTIFICATIONS, 0, NULL), CMD_DEF(SCHEDULE_AND_PROPAGATE_HOST_DOWNTIME, 0, NULL), CMD_DEF(ENABLE_SERVICE_FRESHNESS_CHECKS, 0, NULL), CMD_DEF(DISABLE_SERVICE_FRESHNESS_CHECKS, 0, NULL), CMD_DEF(ENABLE_HOST_FRESHNESS_CHECKS, 0, NULL), CMD_DEF(DISABLE_HOST_FRESHNESS_CHECKS, 0, NULL), CMD_DEF(SET_HOST_NOTIFICATION_NUMBER, 0, NULL), CMD_DEF(SET_SVC_NOTIFICATION_NUMBER, 0, NULL), CMD_DEF(CHANGE_HOST_CHECK_TIMEPERIOD, 0, NULL), CMD_DEF(CHANGE_SVC_CHECK_TIMEPERIOD, 0, NULL), CMD_DEF(PROCESS_FILE, 0, NULL), CMD_DEF(CHANGE_CUSTOM_HOST_VAR, 0, NULL), CMD_DEF(CHANGE_CUSTOM_SVC_VAR, 0, NULL), CMD_DEF(CHANGE_CUSTOM_CONTACT_VAR, 0, NULL), CMD_DEF(ENABLE_CONTACT_HOST_NOTIFICATIONS, 0, NULL), CMD_DEF(DISABLE_CONTACT_HOST_NOTIFICATIONS, 0, NULL), CMD_DEF(ENABLE_CONTACT_SVC_NOTIFICATIONS, 0, NULL), CMD_DEF(DISABLE_CONTACT_SVC_NOTIFICATIONS, 0, NULL), CMD_DEF(ENABLE_CONTACTGROUP_HOST_NOTIFICATIONS, 0, NULL), CMD_DEF(DISABLE_CONTACTGROUP_HOST_NOTIFICATIONS, 0, NULL), CMD_DEF(ENABLE_CONTACTGROUP_SVC_NOTIFICATIONS, 0, NULL), CMD_DEF(DISABLE_CONTACTGROUP_SVC_NOTIFICATIONS, 0, NULL), CMD_DEF(CHANGE_RETRY_HOST_CHECK_INTERVAL, 0, NULL), CMD_DEF(SEND_CUSTOM_HOST_NOTIFICATION, 0, NULL), CMD_DEF(SEND_CUSTOM_SVC_NOTIFICATION, 0, NULL), CMD_DEF(CHANGE_HOST_NOTIFICATION_TIMEPERIOD, 0, NULL), CMD_DEF(CHANGE_SVC_NOTIFICATION_TIMEPERIOD, 0, NULL), CMD_DEF(CHANGE_CONTACT_HOST_NOTIFICATION_TIMEPERIOD, 0, NULL), CMD_DEF(CHANGE_CONTACT_SVC_NOTIFICATION_TIMEPERIOD, 0, NULL), CMD_DEF(CHANGE_HOST_MODATTR, 0, NULL), CMD_DEF(CHANGE_SVC_MODATTR, 0, NULL), CMD_DEF(CHANGE_CONTACT_MODATTR, 0, NULL), CMD_DEF(CHANGE_CONTACT_MODHATTR, 0, NULL), CMD_DEF(CLEAR_HOST_FLAPPING_STATE, 0, NULL), CMD_DEF(CLEAR_SVC_FLAPPING_STATE, 0, NULL), }; #undef CMD_DEF #ifndef ARRAY_SIZE # define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0])) #endif const char *extcmd_get_name(int id) { unsigned int i; for(i = 0; i < ARRAY_SIZE(in_core_commands); i++) { struct nagios_extcmd *ecmd; ecmd = &in_core_commands[i]; if(ecmd->id == id) return ecmd->name; } return NULL; } #ifdef ECMD_LIST_TESTING int main(int argc, char **argv) { int i, no_handler = 0; for(i = 0; i < ARRAY_SIZE(in_core_commands); i++) { struct nagios_extcmd *cmd = &in_core_commands[i]; if(!cmd->handler) { no_handler++; printf("%s has no handler\n", extcmd_get_name(i)); } } printf("%d of %d commands have no handler\n", no_handler, ARRAY_SIZE(in_core_commands)); return 0; } #endif nagios-4.3.4/cgi/extinfo.c000066400000000000000000004671361314764422400154140ustar00rootroot00000000000000/************************************************************************** * * EXTINFO.C - Nagios Extended Information CGI * * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *************************************************************************/ #include "../include/config.h" #include "../include/common.h" #include "../include/objects.h" #include "../include/macros.h" #include "../include/comments.h" #include "../include/downtime.h" #include "../include/statusdata.h" #include "../include/cgiutils.h" #include "../include/getcgi.h" #include "../include/cgiauth.h" static nagios_macros *mac; extern char nagios_process_info[MAX_INPUT_BUFFER]; extern int nagios_process_state; extern int refresh_rate; extern int buffer_stats[1][3]; extern int program_stats[MAX_CHECK_STATS_TYPES][3]; extern char main_config_file[MAX_FILENAME_LENGTH]; extern char url_html_path[MAX_FILENAME_LENGTH]; extern char url_stylesheets_path[MAX_FILENAME_LENGTH]; extern char url_docs_path[MAX_FILENAME_LENGTH]; extern char url_images_path[MAX_FILENAME_LENGTH]; extern char url_logo_images_path[MAX_FILENAME_LENGTH]; extern char url_js_path[MAX_FILENAME_LENGTH]; extern int enable_splunk_integration; extern char *notes_url_target; extern char *action_url_target; extern hoststatus *hoststatus_list; extern servicestatus *servicestatus_list; #define MAX_MESSAGE_BUFFER 4096 #define HEALTH_WARNING_PERCENTAGE 85 #define HEALTH_CRITICAL_PERCENTAGE 75 /* SORTDATA structure */ typedef struct sortdata_struct { int is_service; servicestatus *svcstatus; hoststatus *hststatus; struct sortdata_struct *next; } sortdata; void document_header(int); void document_footer(void); int process_cgivars(void); void show_process_info(void); void show_host_info(void); void show_service_info(void); void show_all_comments(void); void show_performance_data(void); void show_hostgroup_info(void); void show_servicegroup_info(void); void show_all_downtime(void); void show_scheduling_queue(void); void display_comments(int); int sort_data(int, int); int compare_sortdata_entries(int, int, sortdata *, sortdata *); void free_sortdata_list(void); authdata current_authdata; sortdata *sortdata_list = NULL; char *host_name = ""; char *hostgroup_name = ""; char *servicegroup_name = ""; char *service_desc = ""; int display_type = DISPLAY_PROCESS_INFO; int sort_type = SORT_ASCENDING; int sort_option = SORT_NEXTCHECKTIME; int embedded = FALSE; int display_header = TRUE; int main(void) { int found = FALSE; char temp_buffer[MAX_INPUT_BUFFER] = ""; char *processed_string = NULL; host *temp_host = NULL; hostsmember *temp_parenthost = NULL; hostgroup *temp_hostgroup = NULL; service *temp_service = NULL; servicegroup *temp_servicegroup = NULL; mac = get_global_macros(); /* get the arguments passed in the URL */ process_cgivars(); /* reset internal variables */ reset_cgi_vars(); cgi_init(document_header, document_footer, READ_ALL_OBJECT_DATA, READ_ALL_STATUS_DATA); /* initialize macros */ init_macros(); /* get authentication information */ get_authentication_information(¤t_authdata); document_header(TRUE); if(display_header == TRUE) { /* begin top table */ printf("\n"); printf("\n"); /* left column of the first row */ printf("\n"); /* middle column of top row */ printf("\n"); /* right column of top row */ printf("\n"); /* end of top table */ printf("\n"); printf("
    \n"); if(display_type == DISPLAY_HOST_INFO) snprintf(temp_buffer, sizeof(temp_buffer) - 1, "Host Information"); else if(display_type == DISPLAY_SERVICE_INFO) snprintf(temp_buffer, sizeof(temp_buffer) - 1, "Service Information"); else if(display_type == DISPLAY_COMMENTS) snprintf(temp_buffer, sizeof(temp_buffer) - 1, "All Host and Service Comments"); else if(display_type == DISPLAY_PERFORMANCE) snprintf(temp_buffer, sizeof(temp_buffer) - 1, "Performance Information"); else if(display_type == DISPLAY_HOSTGROUP_INFO) snprintf(temp_buffer, sizeof(temp_buffer) - 1, "Hostgroup Information"); else if(display_type == DISPLAY_SERVICEGROUP_INFO) snprintf(temp_buffer, sizeof(temp_buffer) - 1, "Servicegroup Information"); else if(display_type == DISPLAY_DOWNTIME) snprintf(temp_buffer, sizeof(temp_buffer) - 1, "All Host and Service Scheduled Downtime"); else if(display_type == DISPLAY_SCHEDULING_QUEUE) snprintf(temp_buffer, sizeof(temp_buffer) - 1, "Check Scheduling Queue"); else snprintf(temp_buffer, sizeof(temp_buffer) - 1, "Nagios Process Information"); temp_buffer[sizeof(temp_buffer) - 1] = '\x0'; display_info_table(temp_buffer, TRUE, ¤t_authdata); /* find the host */ if(display_type == DISPLAY_HOST_INFO || display_type == DISPLAY_SERVICE_INFO) { temp_host = find_host(host_name); grab_host_macros_r(mac, temp_host); if(display_type == DISPLAY_SERVICE_INFO) { temp_service = find_service(host_name, service_desc); grab_service_macros_r(mac, temp_service); } /* write some Javascript helper functions */ if(temp_host != NULL) { printf("\n"); } } /* find the hostgroup */ else if(display_type == DISPLAY_HOSTGROUP_INFO) { temp_hostgroup = find_hostgroup(hostgroup_name); grab_hostgroup_macros_r(mac, temp_hostgroup); } /* find the servicegroup */ else if(display_type == DISPLAY_SERVICEGROUP_INFO) { temp_servicegroup = find_servicegroup(servicegroup_name); grab_servicegroup_macros_r(mac, temp_servicegroup); } if((display_type == DISPLAY_HOST_INFO && temp_host != NULL) || (display_type == DISPLAY_SERVICE_INFO && temp_host != NULL && temp_service != NULL) || (display_type == DISPLAY_HOSTGROUP_INFO && temp_hostgroup != NULL) || (display_type == DISPLAY_SERVICEGROUP_INFO && temp_servicegroup != NULL)) { printf("\n"); printf("\n"); printf("\n"); } printf("\n"); if((display_type == DISPLAY_HOST_INFO && temp_host != NULL) || (display_type == DISPLAY_SERVICE_INFO && temp_host != NULL && temp_service != NULL) || (display_type == DISPLAY_HOSTGROUP_INFO && temp_hostgroup != NULL) || (display_type == DISPLAY_SERVICEGROUP_INFO && temp_servicegroup != NULL)) { if(display_type == DISPLAY_HOST_INFO) { printf("
    Host
    \n"); printf("
    %s
    \n", temp_host->alias); printf("
    (%s)

    \n", temp_host->name); if(temp_host->parent_hosts != NULL) { /* print all parent hosts */ printf("
    Parents:
    \n"); for(temp_parenthost = temp_host->parent_hosts; temp_parenthost != NULL; temp_parenthost = temp_parenthost->next) printf("\n", STATUS_CGI, url_encode(temp_parenthost->host_name), temp_parenthost->host_name); printf("
    "); } printf("
    Member of
    "); for(temp_hostgroup = hostgroup_list; temp_hostgroup != NULL; temp_hostgroup = temp_hostgroup->next) { if(is_host_member_of_hostgroup(temp_hostgroup, temp_host) == TRUE) { if(found == TRUE) printf(", "); printf("%s", STATUS_CGI, url_encode(temp_hostgroup->group_name), temp_hostgroup->group_name); found = TRUE; } } if(found == FALSE) printf("No hostgroups"); printf("

    \n"); printf("
    %s
    \n", temp_host->address); } if(display_type == DISPLAY_SERVICE_INFO) { printf("
    Service
    %s
    On Host
    \n", service_desc); printf("
    %s
    \n", temp_host->alias); printf("
    (%s)

    \n", EXTINFO_CGI, DISPLAY_HOST_INFO, url_encode(temp_host->name), temp_host->name); printf("
    Member of
    "); for(temp_servicegroup = servicegroup_list; temp_servicegroup != NULL; temp_servicegroup = temp_servicegroup->next) { if(is_service_member_of_servicegroup(temp_servicegroup, temp_service) == TRUE) { if(found == TRUE) printf(", "); printf("%s", STATUS_CGI, url_encode(temp_servicegroup->group_name), temp_servicegroup->group_name); found = TRUE; } } if(found == FALSE) printf("No servicegroups."); printf("

    \n"); printf("
    %s
    \n", temp_host->address); } if(display_type == DISPLAY_HOSTGROUP_INFO) { printf("
    Hostgroup
    \n"); printf("
    %s
    \n", temp_hostgroup->alias); printf("
    (%s)
    \n", temp_hostgroup->group_name); if(temp_hostgroup->notes != NULL) { process_macros_r(mac, temp_hostgroup->notes, &processed_string, 0); printf("

    %s

    ", processed_string); free(processed_string); } } if(display_type == DISPLAY_SERVICEGROUP_INFO) { printf("
    Servicegroup
    \n"); printf("
    %s
    \n", temp_servicegroup->alias); printf("
    (%s)
    \n", temp_servicegroup->group_name); if(temp_servicegroup->notes != NULL) { process_macros_r(mac, temp_servicegroup->notes, &processed_string, 0); printf("

    %s

    ", processed_string); free(processed_string); } } if(display_type == DISPLAY_SERVICE_INFO) { if(temp_service->icon_image != NULL) { printf("%s
    ", (temp_service->icon_image_alt == NULL) ? "" : temp_service->icon_image_alt, (temp_service->icon_image_alt == NULL) ? "" : temp_service->icon_image_alt); } if(temp_service->icon_image_alt != NULL) printf("( %s )\n", temp_service->icon_image_alt); if(temp_service->notes != NULL) { process_macros_r(mac, temp_service->notes, &processed_string, 0); printf("

    %s

    \n", processed_string); free(processed_string); } } if(display_type == DISPLAY_HOST_INFO) { if(temp_host->icon_image != NULL) { printf("%s
    ", (temp_host->icon_image_alt == NULL) ? "" : temp_host->icon_image_alt, (temp_host->icon_image_alt == NULL) ? "" : temp_host->icon_image_alt); } if(temp_host->icon_image_alt != NULL) printf("( %s )\n", temp_host->icon_image_alt); if(temp_host->notes != NULL) { process_macros_r(mac, temp_host->notes, &processed_string, 0); printf("

    %s

    \n", processed_string); free(processed_string); } } } printf("
    \n"); if(display_type == DISPLAY_HOST_INFO && temp_host != NULL) { printf("\n"); if(temp_host->action_url != NULL && strcmp(temp_host->action_url, "")) { printf("\n"); } if(temp_host->notes_url != NULL && strcmp(temp_host->notes_url, "")) { printf("\n"); } printf("
    \n"); printf("Perform Additional Actions On This Host\n", (action_url_target == NULL) ? "_blank" : action_url_target, url_images_path, ACTION_ICON); printf("
    Extra Actions

    \n"); printf("
    \n"); printf("View Additional Notes For This Host\n", (notes_url_target == NULL) ? "_blank" : notes_url_target, url_images_path, NOTES_ICON); printf("
    Extra Notes

    \n"); printf("
    \n"); } else if(display_type == DISPLAY_SERVICE_INFO && temp_service != NULL) { printf("
    \n"); if(temp_service->action_url != NULL && strcmp(temp_service->action_url, "")) { printf("Perform Additional Actions On This Service\n", (action_url_target == NULL) ? "_blank" : action_url_target, url_images_path, ACTION_ICON); printf("
    Extra Actions

    \n"); } if(temp_service->notes_url != NULL && strcmp(temp_service->notes_url, "")) { printf("View Additional Notes For This Service\n", (notes_url_target == NULL) ? "_blank" : notes_url_target, url_images_path, NOTES_ICON); printf("
    Extra Notes

    \n"); } printf("
    \n"); } if(display_type == DISPLAY_HOSTGROUP_INFO && temp_hostgroup != NULL) { printf("\n"); if(temp_hostgroup->action_url != NULL && strcmp(temp_hostgroup->action_url, "")) { printf("\n"); } if(temp_hostgroup->notes_url != NULL && strcmp(temp_hostgroup->notes_url, "")) { printf("\n"); } printf("
    \n"); printf("Perform Additional Actions On This Hostgroup\n", (action_url_target == NULL) ? "_blank" : action_url_target, url_images_path, ACTION_ICON); printf("
    Extra Actions

    \n"); printf("
    \n"); printf("View Additional Notes For This Hostgroup\n", (notes_url_target == NULL) ? "_blank" : notes_url_target, url_images_path, NOTES_ICON); printf("
    Extra Notes

    \n"); printf("
    \n"); } else if(display_type == DISPLAY_SERVICEGROUP_INFO && temp_servicegroup != NULL) { printf("\n"); if(temp_servicegroup->action_url != NULL && strcmp(temp_servicegroup->action_url, "")) { printf("Perform Additional Actions On This Servicegroup\n", (action_url_target == NULL) ? "_blank" : action_url_target, url_images_path, ACTION_ICON); printf("
    Extra Actions

    \n"); } if(temp_servicegroup->notes_url != NULL && strcmp(temp_servicegroup->notes_url, "")) { printf("View Additional Notes For This Servicegroup\n", (notes_url_target == NULL) ? "_blank" : notes_url_target, url_images_path, NOTES_ICON); printf("
    Extra Notes

    \n"); } printf("
    \n"); } /* display context-sensitive help */ if(display_type == DISPLAY_HOST_INFO) display_context_help(CONTEXTHELP_EXT_HOST); else if(display_type == DISPLAY_SERVICE_INFO) display_context_help(CONTEXTHELP_EXT_SERVICE); else if(display_type == DISPLAY_HOSTGROUP_INFO) display_context_help(CONTEXTHELP_EXT_HOSTGROUP); else if(display_type == DISPLAY_SERVICEGROUP_INFO) display_context_help(CONTEXTHELP_EXT_SERVICEGROUP); else if(display_type == DISPLAY_PROCESS_INFO) display_context_help(CONTEXTHELP_EXT_PROCESS); else if(display_type == DISPLAY_PERFORMANCE) display_context_help(CONTEXTHELP_EXT_PERFORMANCE); else if(display_type == DISPLAY_COMMENTS) display_context_help(CONTEXTHELP_EXT_COMMENTS); else if(display_type == DISPLAY_DOWNTIME) display_context_help(CONTEXTHELP_EXT_DOWNTIME); else if(display_type == DISPLAY_SCHEDULING_QUEUE) display_context_help(CONTEXTHELP_EXT_QUEUE); printf("
    \n"); } printf("
    \n"); if(display_type == DISPLAY_HOST_INFO) show_host_info(); else if(display_type == DISPLAY_SERVICE_INFO) show_service_info(); else if(display_type == DISPLAY_COMMENTS) show_all_comments(); else if(display_type == DISPLAY_PERFORMANCE) show_performance_data(); else if(display_type == DISPLAY_HOSTGROUP_INFO) show_hostgroup_info(); else if(display_type == DISPLAY_SERVICEGROUP_INFO) show_servicegroup_info(); else if(display_type == DISPLAY_DOWNTIME) show_all_downtime(); else if(display_type == DISPLAY_SCHEDULING_QUEUE) show_scheduling_queue(); else show_process_info(); document_footer(); /* free all allocated memory */ free_memory(); free_comment_data(); free_downtime_data(); return OK; } void document_header(int use_stylesheet) { char date_time[MAX_DATETIME_LENGTH]; char *vidurl = NULL; time_t current_time; time_t expire_time; printf("Cache-Control: no-store\r\n"); printf("Pragma: no-cache\r\n"); printf("Refresh: %d\r\n", refresh_rate); time(¤t_time); get_time_string(¤t_time, date_time, (int)sizeof(date_time), HTTP_DATE_TIME); printf("Last-Modified: %s\r\n", date_time); expire_time = (time_t)0L; get_time_string(&expire_time, date_time, (int)sizeof(date_time), HTTP_DATE_TIME); printf("Expires: %s\r\n", date_time); printf("Content-type: text/html; charset=utf-8\r\n\r\n"); if(embedded == TRUE) return; printf("\n"); printf("\n"); printf("\n", url_images_path); printf("\n"); printf("Extended Information\n"); printf("\n"); if(use_stylesheet == TRUE) { printf("", url_stylesheets_path, COMMON_CSS); printf("", url_stylesheets_path, EXTINFO_CSS); printf("\n", url_stylesheets_path, NAGFUNCS_CSS); } if (display_type == DISPLAY_HOST_INFO) vidurl = "https://www.youtube.com/embed/n3QEAf-MxY4"; else if(display_type == DISPLAY_SERVICE_INFO) vidurl = "https://www.youtube.com/embed/f_knwQOS6FI"; if (vidurl) { printf("\n", url_js_path, JQUERY_JS); printf("\n", url_js_path, NAGFUNCS_JS); printf("\n"); } printf("\n"); printf("\n"); /* include user SSI header */ include_ssi_files(EXTINFO_CGI, SSI_HEADER); return; } void document_footer(void) { if(embedded == TRUE) return; /* include user SSI footer */ include_ssi_files(EXTINFO_CGI, SSI_FOOTER); printf("\n"); printf("\n"); return; } int process_cgivars(void) { char **variables; int error = FALSE; int temp_type; int x; variables = getcgivars(); for(x = 0; variables[x] != NULL; x++) { /* do some basic length checking on the variable identifier to prevent buffer overflows */ if(strlen(variables[x]) >= MAX_INPUT_BUFFER - 1) { continue; } /* we found the display type */ else if(!strcmp(variables[x], "type")) { x++; if(variables[x] == NULL) { error = TRUE; break; } temp_type = atoi(variables[x]); if(temp_type == DISPLAY_HOST_INFO) display_type = DISPLAY_HOST_INFO; else if(temp_type == DISPLAY_SERVICE_INFO) display_type = DISPLAY_SERVICE_INFO; else if(temp_type == DISPLAY_COMMENTS) display_type = DISPLAY_COMMENTS; else if(temp_type == DISPLAY_PERFORMANCE) display_type = DISPLAY_PERFORMANCE; else if(temp_type == DISPLAY_HOSTGROUP_INFO) display_type = DISPLAY_HOSTGROUP_INFO; else if(temp_type == DISPLAY_SERVICEGROUP_INFO) display_type = DISPLAY_SERVICEGROUP_INFO; else if(temp_type == DISPLAY_DOWNTIME) display_type = DISPLAY_DOWNTIME; else if(temp_type == DISPLAY_SCHEDULING_QUEUE) display_type = DISPLAY_SCHEDULING_QUEUE; else display_type = DISPLAY_PROCESS_INFO; } /* we found the host name */ else if(!strcmp(variables[x], "host")) { x++; if(variables[x] == NULL) { error = TRUE; break; } host_name = strdup(variables[x]); if(host_name == NULL) host_name = ""; strip_html_brackets(host_name); } /* we found the hostgroup name */ else if(!strcmp(variables[x], "hostgroup")) { x++; if(variables[x] == NULL) { error = TRUE; break; } hostgroup_name = strdup(variables[x]); if(hostgroup_name == NULL) hostgroup_name = ""; strip_html_brackets(hostgroup_name); } /* we found the service name */ else if(!strcmp(variables[x], "service")) { x++; if(variables[x] == NULL) { error = TRUE; break; } service_desc = strdup(variables[x]); if(service_desc == NULL) service_desc = ""; strip_html_brackets(service_desc); } /* we found the servicegroup name */ else if(!strcmp(variables[x], "servicegroup")) { x++; if(variables[x] == NULL) { error = TRUE; break; } servicegroup_name = strdup(variables[x]); if(servicegroup_name == NULL) servicegroup_name = ""; strip_html_brackets(servicegroup_name); } /* we found the sort type argument */ else if(!strcmp(variables[x], "sorttype")) { x++; if(variables[x] == NULL) { error = TRUE; break; } sort_type = atoi(variables[x]); } /* we found the sort option argument */ else if(!strcmp(variables[x], "sortoption")) { x++; if(variables[x] == NULL) { error = TRUE; break; } sort_option = atoi(variables[x]); } /* we found the embed option */ else if(!strcmp(variables[x], "embedded")) embedded = TRUE; /* we found the noheader option */ else if(!strcmp(variables[x], "noheader")) display_header = FALSE; } /* free memory allocated to the CGI variables */ free_cgivars(variables); return error; } void show_process_info(void) { char date_time[MAX_DATETIME_LENGTH]; time_t current_time; unsigned long run_time; char run_time_string[24]; int days = 0; int hours = 0; int minutes = 0; int seconds = 0; /* make sure the user has rights to view system information */ if(is_authorized_for_system_information(¤t_authdata) == FALSE) { printf("

    It appears as though you do not have permission to view process information...

    \n"); printf("

    If you believe this is an error, check the HTTP server authentication requirements for accessing this CGI
    "); printf("and check the authorization options in your CGI configuration file.

    \n"); return; } printf("
    \n"); printf("
    \n"); printf("\n"); printf("
    \n"); printf("
    Process Information
    \n"); printf("\n"); printf("\n"); printf("
    \n"); printf("\n"); /* program version */ printf("\n", PROGRAM_VERSION); /* program start time */ get_time_string(&program_start, date_time, (int)sizeof(date_time), SHORT_DATE_TIME); printf("\n", date_time); /* total running time */ time(¤t_time); run_time = (unsigned long)(current_time - program_start); get_time_breakdown(run_time, &days, &hours, &minutes, &seconds); sprintf(run_time_string, "%dd %dh %dm %ds", days, hours, minutes, seconds); printf("\n", run_time_string); /* last log file rotation */ get_time_string(&last_log_rotation, date_time, (int)sizeof(date_time), SHORT_DATE_TIME); printf("\n", (last_log_rotation == (time_t)0) ? "N/A" : date_time); /* PID */ printf("\n", nagios_pid); /* notifications enabled */ printf("\n", (enable_notifications == TRUE) ? "ENABLED" : "DISABLED", (enable_notifications == TRUE) ? "YES" : "NO"); /* service check execution enabled */ printf("\n", (execute_service_checks == TRUE) ? "ENABLED" : "DISABLED", (execute_service_checks == TRUE) ? "YES" : "NO"); /* passive service check acceptance */ printf("\n", (accept_passive_service_checks == TRUE) ? "ENABLED" : "DISABLED", (accept_passive_service_checks == TRUE) ? "YES" : "NO"); /* host check execution enabled */ printf("\n", (execute_host_checks == TRUE) ? "ENABLED" : "DISABLED", (execute_host_checks == TRUE) ? "YES" : "NO"); /* passive host check acceptance */ printf("\n", (accept_passive_host_checks == TRUE) ? "ENABLED" : "DISABLED", (accept_passive_host_checks == TRUE) ? "YES" : "NO"); /* event handlers enabled */ printf("\n", (enable_event_handlers == TRUE) ? "Yes" : "No"); /* obsessing over services */ printf("\n", (obsess_over_services == TRUE) ? "Yes" : "No"); /* obsessing over hosts */ printf("\n", (obsess_over_hosts == TRUE) ? "Yes" : "No"); /* flap detection enabled */ printf("\n", (enable_flap_detection == TRUE) ? "Yes" : "No"); /* process performance data */ printf("\n", (process_performance_data == TRUE) ? "Yes" : "No"); printf("
    Program Version:%s
    Program Start Time:%s
    Total Running Time:%s
    Last Log File Rotation:%s
    Nagios PID%d
    Notifications Enabled?
      %s  
    Service Checks Being Executed?
      %s  
    Passive Service Checks Being Accepted?
      %s  
    Host Checks Being Executed?
      %s  
    Passive Host Checks Being Accepted?
      %s  
    Event Handlers Enabled?%s
    Obsessing Over Services?%s
    Obsessing Over Hosts?%s
    Flap Detection Enabled?%s
    Performance Data Being Processed?%s
    \n"); printf("
    \n"); printf("
    \n"); printf("
    Process Commands
    \n"); printf("\n"); printf("\n"); printf("
    \n"); if(nagios_process_state == STATE_OK) { printf("\n"); #ifndef DUMMY_INSTALL printf("\n", url_images_path, STOP_ICON, COMMAND_CGI, CMD_SHUTDOWN_PROCESS); printf("\n", url_images_path, RESTART_ICON, COMMAND_CGI, CMD_RESTART_PROCESS); #endif if(enable_notifications == TRUE) printf("\n", url_images_path, DISABLED_ICON, COMMAND_CGI, CMD_DISABLE_NOTIFICATIONS); else printf("\n", url_images_path, ENABLED_ICON, COMMAND_CGI, CMD_ENABLE_NOTIFICATIONS); if(execute_service_checks == TRUE) printf("\n", url_images_path, DISABLED_ICON, COMMAND_CGI, CMD_STOP_EXECUTING_SVC_CHECKS); else printf("\n", url_images_path, ENABLED_ICON, COMMAND_CGI, CMD_START_EXECUTING_SVC_CHECKS); if(accept_passive_service_checks == TRUE) printf("\n", url_images_path, DISABLED_ICON, COMMAND_CGI, CMD_STOP_ACCEPTING_PASSIVE_SVC_CHECKS); else printf("\n", url_images_path, ENABLED_ICON, COMMAND_CGI, CMD_START_ACCEPTING_PASSIVE_SVC_CHECKS); if(execute_host_checks == TRUE) printf("\n", url_images_path, DISABLED_ICON, COMMAND_CGI, CMD_STOP_EXECUTING_HOST_CHECKS); else printf("\n", url_images_path, ENABLED_ICON, COMMAND_CGI, CMD_START_EXECUTING_HOST_CHECKS); if(accept_passive_host_checks == TRUE) printf("\n", url_images_path, DISABLED_ICON, COMMAND_CGI, CMD_STOP_ACCEPTING_PASSIVE_HOST_CHECKS); else printf("\n", url_images_path, ENABLED_ICON, COMMAND_CGI, CMD_START_ACCEPTING_PASSIVE_HOST_CHECKS); if(enable_event_handlers == TRUE) printf("\n", url_images_path, DISABLED_ICON, COMMAND_CGI, CMD_DISABLE_EVENT_HANDLERS); else printf("\n", url_images_path, ENABLED_ICON, COMMAND_CGI, CMD_ENABLE_EVENT_HANDLERS); if(obsess_over_services == TRUE) printf("\n", url_images_path, DISABLED_ICON, COMMAND_CGI, CMD_STOP_OBSESSING_OVER_SVC_CHECKS); else printf("\n", url_images_path, ENABLED_ICON, COMMAND_CGI, CMD_START_OBSESSING_OVER_SVC_CHECKS); if(obsess_over_hosts == TRUE) printf("\n", url_images_path, DISABLED_ICON, COMMAND_CGI, CMD_STOP_OBSESSING_OVER_HOST_CHECKS); else printf("\n", url_images_path, ENABLED_ICON, COMMAND_CGI, CMD_START_OBSESSING_OVER_HOST_CHECKS); if(enable_flap_detection == TRUE) printf("\n", url_images_path, DISABLED_ICON, COMMAND_CGI, CMD_DISABLE_FLAP_DETECTION); else printf("\n", url_images_path, ENABLED_ICON, COMMAND_CGI, CMD_ENABLE_FLAP_DETECTION); if(process_performance_data == TRUE) printf("\n", url_images_path, DISABLED_ICON, COMMAND_CGI, CMD_DISABLE_PERFORMANCE_DATA); else printf("\n", url_images_path, ENABLED_ICON, COMMAND_CGI, CMD_ENABLE_PERFORMANCE_DATA); printf("
    Shutdown the Nagios ProcessShutdown the Nagios process
    Restart the Nagios ProcessRestart the Nagios process
    Disable NotificationsDisable notifications
    Enable NotificationsEnable notifications
    Stop Executing Service ChecksStop executing service checks
    Start Executing Service ChecksStart executing service checks
    Stop Accepting Passive Service ChecksStop accepting passive service checks
    Start Accepting Passive Service ChecksStart accepting passive service checks
    Stop Executing Host ChecksStop executing host checks
    Start Executing Host ChecksStart executing host checks
    Stop Accepting Passive Host ChecksStop accepting passive host checks
    Start Accepting Passive Host ChecksStart accepting passive host checks
    Disable Event HandlersDisable event handlers
    Enable Event HandlersEnable event handlers
    Stop Obsessing Over ServicesStop obsessing over services
    Start Obsessing Over ServicesStart obsessing over services
    Stop Obsessing Over HostsStop obsessing over hosts
    Start Obsessing Over HostsStart obsessing over hosts
    Disable Flap DetectionDisable flap detection
    Enable Flap DetectionEnable flap detection
    Disable Performance DataDisable performance data
    Enable Performance DataEnable performance data
    \n"); } else { printf("
    It appears as though Nagios is not running, so commands are temporarily unavailable...\n"); printf("
    \n"); } printf("
    \n"); printf("
    \n"); printf("
    \n"); } void show_host_info(void) { hoststatus *temp_hoststatus; host *temp_host; char date_time[MAX_DATETIME_LENGTH]; char state_duration[48]; char status_age[48]; char state_string[MAX_INPUT_BUFFER]; const char *bg_class = ""; char *buf = NULL; int days; int hours; int minutes; int seconds; time_t current_time; time_t t; int duration_error = FALSE; /* get host info */ temp_host = find_host(host_name); /* make sure the user has rights to view host information */ if(is_authorized_for_host(temp_host, ¤t_authdata) == FALSE) { printf("

    It appears as though you do not have permission to view information for this host...

    \n"); printf("

    If you believe this is an error, check the HTTP server authentication requirements for accessing this CGI
    "); printf("and check the authorization options in your CGI configuration file.

    \n"); return; } /* get host status info */ temp_hoststatus = find_hoststatus(host_name); /* make sure host information exists */ if(temp_host == NULL) { printf("

    Error: Host Not Found!

    >"); return; } if(temp_hoststatus == NULL) { printf("

    Error: Host Status Information Not Found!
    \n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("
    \n"); printf("
    Host State Information
    \n"); if(temp_hoststatus->has_been_checked == FALSE) printf("

    This host has not yet been checked, so status information is not available.

    \n"); else { printf("\n"); printf("\n"); printf("\n"); printf("
    \n"); printf("\n"); printf("\n"); printf("
    \n"); printf("\n"); current_time = time(NULL); t = 0; duration_error = FALSE; if(temp_hoststatus->last_state_change == (time_t)0) { if(program_start > current_time) duration_error = TRUE; else t = current_time - program_start; } else { if(temp_hoststatus->last_state_change > current_time) duration_error = TRUE; else t = current_time - temp_hoststatus->last_state_change; } get_time_breakdown((unsigned long)t, &days, &hours, &minutes, &seconds); if(duration_error == TRUE) snprintf(state_duration, sizeof(state_duration) - 1, "???"); else snprintf(state_duration, sizeof(state_duration) - 1, "%2dd %2dh %2dm %2ds%s", days, hours, minutes, seconds, (temp_hoststatus->last_state_change == (time_t)0) ? "+" : ""); state_duration[sizeof(state_duration) - 1] = '\x0'; if(temp_hoststatus->status == SD_HOST_UP) { strcpy(state_string, "UP"); bg_class = "hostUP"; } else if(temp_hoststatus->status == SD_HOST_DOWN) { strcpy(state_string, "DOWN"); bg_class = "hostDOWN"; } else if(temp_hoststatus->status == SD_HOST_UNREACHABLE) { strcpy(state_string, "UNREACHABLE"); bg_class = "hostUNREACHABLE"; } printf("\n", bg_class, state_string, state_duration, (temp_hoststatus->problem_has_been_acknowledged == TRUE) ? "  (Has been acknowledged)" : ""); printf("\n"); printf("\n", (temp_hoststatus->perf_data == NULL) ? "" : html_encode(temp_hoststatus->perf_data, TRUE)); printf("\n", (temp_hoststatus->state_type == HARD_STATE) ? "HARD" : "SOFT"); get_time_string(&temp_hoststatus->last_check, date_time, (int)sizeof(date_time), SHORT_DATE_TIME); printf("\n", date_time); printf("\n", (temp_hoststatus->check_type == CHECK_TYPE_ACTIVE) ? "ACTIVE" : "PASSIVE"); printf("\n"); get_time_string(&temp_hoststatus->next_check, date_time, (int)sizeof(date_time), SHORT_DATE_TIME); printf("\n", (temp_hoststatus->checks_enabled && temp_hoststatus->next_check != (time_t)0 && temp_hoststatus->should_be_scheduled == TRUE) ? date_time : "N/A"); get_time_string(&temp_hoststatus->last_state_change, date_time, (int)sizeof(date_time), SHORT_DATE_TIME); printf("\n", (temp_hoststatus->last_state_change == (time_t)0) ? "N/A" : date_time); get_time_string(&temp_hoststatus->last_notification, date_time, (int)sizeof(date_time), SHORT_DATE_TIME); printf("\n", (temp_hoststatus->last_notification == (time_t)0) ? "N/A" : date_time, temp_hoststatus->current_notification_number); printf("\n"); printf("\n", (temp_hoststatus->scheduled_downtime_depth > 0) ? "ACTIVE" : "INACTIVE", (temp_hoststatus->scheduled_downtime_depth > 0) ? "YES" : "NO"); t = 0; duration_error = FALSE; if(temp_hoststatus->last_check > current_time) duration_error = TRUE; else /*t=current_time-temp_hoststatus->last_check;*/ t = current_time - temp_hoststatus->last_update; get_time_breakdown((unsigned long)t, &days, &hours, &minutes, &seconds); if(duration_error == TRUE) snprintf(status_age, sizeof(status_age) - 1, "???"); else if(temp_hoststatus->last_check == (time_t)0) snprintf(status_age, sizeof(status_age) - 1, "N/A"); else snprintf(status_age, sizeof(status_age) - 1, "%2dd %2dh %2dm %2ds", days, hours, minutes, seconds); status_age[sizeof(status_age) - 1] = '\x0'; get_time_string(&temp_hoststatus->last_update, date_time, (int)sizeof(date_time), SHORT_DATE_TIME); printf("\n", (temp_hoststatus->last_update == (time_t)0) ? "N/A" : date_time, status_age); printf("
    Host Status:
      %s  
     (for %s)%s
    Status Information:%s", (temp_hoststatus->plugin_output == NULL) ? "" : html_encode(temp_hoststatus->plugin_output, TRUE)); if(enable_splunk_integration == TRUE) { printf("  "); asprintf(&buf, "%s %s", temp_host->name, temp_hoststatus->plugin_output); display_splunk_generic_url(buf, 1); free(buf); } if(temp_hoststatus->long_plugin_output != NULL) printf("
    %s", html_encode(temp_hoststatus->long_plugin_output, TRUE)); printf("
    Performance Data:%s
    Current Attempt:%d/%d", temp_hoststatus->current_attempt, temp_hoststatus->max_attempts); printf("  (%s state)
    Last Check Time:%s
    Check Type:%s
    Check Latency / Duration:"); if(temp_hoststatus->check_type == CHECK_TYPE_ACTIVE) printf("%.3f", temp_hoststatus->latency); else printf("N/A"); printf(" / %.3f seconds", temp_hoststatus->execution_time); printf("
    Next Scheduled Active Check:  %s
    Last State Change:%s
    Last Notification:%s (notification %d)
    Is This Host Flapping?"); if(temp_hoststatus->flap_detection_enabled == FALSE || enable_flap_detection == FALSE) printf("N/A"); else printf("
      %s  
     (%3.2f%% state change)", (temp_hoststatus->is_flapping == TRUE) ? "" : "not", (temp_hoststatus->is_flapping == TRUE) ? "YES" : "NO", temp_hoststatus->percent_state_change); printf("
    In Scheduled Downtime?
      %s  
    Last Update:%s  (%s ago)
    \n"); printf("
    \n"); printf("
    \n"); printf("\n"); printf("\n"); printf("
    \n"); printf("\n"); printf("\n", (temp_hoststatus->checks_enabled == TRUE) ? "ENABLED" : "DISABLED", (temp_hoststatus->checks_enabled == TRUE) ? "ENABLED" : "DISABLED"); printf("\n", (temp_hoststatus->accept_passive_checks == TRUE) ? "ENABLED" : "DISABLED", (temp_hoststatus->accept_passive_checks) ? "ENABLED" : "DISABLED"); printf("\n", (temp_hoststatus->obsess == TRUE) ? "ENABLED" : "DISABLED", (temp_hoststatus->obsess) ? "ENABLED" : "DISABLED"); printf("\n", (temp_hoststatus->notifications_enabled) ? "ENABLED" : "DISABLED", (temp_hoststatus->notifications_enabled) ? "ENABLED" : "DISABLED"); printf("\n", (temp_hoststatus->event_handler_enabled) ? "ENABLED" : "DISABLED", (temp_hoststatus->event_handler_enabled) ? "ENABLED" : "DISABLED"); printf("\n", (temp_hoststatus->flap_detection_enabled == TRUE) ? "ENABLED" : "DISABLED", (temp_hoststatus->flap_detection_enabled == TRUE) ? "ENABLED" : "DISABLED"); printf("
    Active Checks:
      %s  
    Passive Checks:
      %s  
    Obsessing:
      %s  
    Notifications:
      %s  
    Event Handler:
      %s  
    Flap Detection:
      %s  
    \n"); printf("
    \n"); printf("
    \n"); } printf("
    \n"); printf("\n"); printf("\n"); printf("\n"); printf("
    \n"); printf("
    Host Commands
    \n"); printf("
    \n"); if(nagios_process_state == STATE_OK && is_authorized_for_read_only(¤t_authdata) == FALSE) { printf("\n"); #ifdef USE_STATUSMAP printf("\n", url_images_path, STATUSMAP_ICON, STATUSMAP_CGI, url_encode(host_name)); #endif if(temp_hoststatus->checks_enabled == TRUE) { printf("\n", url_images_path, DISABLED_ICON, COMMAND_CGI, CMD_DISABLE_HOST_CHECK, url_encode(host_name)); } else printf("\n", url_images_path, ENABLED_ICON, COMMAND_CGI, CMD_ENABLE_HOST_CHECK, url_encode(host_name)); printf("\n", url_images_path, DELAY_ICON, COMMAND_CGI, CMD_SCHEDULE_HOST_CHECK, url_encode(host_name), (temp_hoststatus->checks_enabled == TRUE) ? "&force_check" : ""); if(temp_hoststatus->accept_passive_checks == TRUE) { printf("\n", url_images_path, PASSIVE_ICON, COMMAND_CGI, CMD_PROCESS_HOST_CHECK_RESULT, url_encode(host_name)); printf("\n", url_images_path, DISABLED_ICON, COMMAND_CGI, CMD_DISABLE_PASSIVE_HOST_CHECKS, url_encode(host_name)); } else printf("\n", url_images_path, ENABLED_ICON, COMMAND_CGI, CMD_ENABLE_PASSIVE_HOST_CHECKS, url_encode(host_name)); if(temp_hoststatus->obsess == TRUE) printf("\n", url_images_path, DISABLED_ICON, COMMAND_CGI, CMD_STOP_OBSESSING_OVER_HOST, url_encode(host_name)); else printf("\n", url_images_path, ENABLED_ICON, COMMAND_CGI, CMD_START_OBSESSING_OVER_HOST, url_encode(host_name)); if(temp_hoststatus->status == SD_HOST_DOWN || temp_hoststatus->status == SD_HOST_UNREACHABLE) { if(temp_hoststatus->problem_has_been_acknowledged == FALSE) printf("\n", url_images_path, ACKNOWLEDGEMENT_ICON, COMMAND_CGI, CMD_ACKNOWLEDGE_HOST_PROBLEM, url_encode(host_name)); else printf("\n", url_images_path, REMOVE_ACKNOWLEDGEMENT_ICON, COMMAND_CGI, CMD_REMOVE_HOST_ACKNOWLEDGEMENT, url_encode(host_name)); } if(temp_hoststatus->notifications_enabled == TRUE) printf("\n", url_images_path, DISABLED_ICON, COMMAND_CGI, CMD_DISABLE_HOST_NOTIFICATIONS, url_encode(host_name)); else printf("\n", url_images_path, ENABLED_ICON, COMMAND_CGI, CMD_ENABLE_HOST_NOTIFICATIONS, url_encode(host_name)); printf("\n", url_images_path, NOTIFICATION_ICON, COMMAND_CGI, CMD_SEND_CUSTOM_HOST_NOTIFICATION, url_encode(host_name)); if(temp_hoststatus->status != SD_HOST_UP) printf("\n", url_images_path, DELAY_ICON, COMMAND_CGI, CMD_DELAY_HOST_NOTIFICATION, url_encode(host_name)); printf("\n", url_images_path, DOWNTIME_ICON, COMMAND_CGI, CMD_SCHEDULE_HOST_DOWNTIME, url_encode(host_name)); printf("\n", url_images_path, DOWNTIME_ICON, COMMAND_CGI, CMD_SCHEDULE_HOST_SVC_DOWNTIME, url_encode(host_name)); printf("\n", url_images_path, DISABLED_ICON, COMMAND_CGI, CMD_DISABLE_HOST_SVC_NOTIFICATIONS, url_encode(host_name)); printf("\n", url_images_path, ENABLED_ICON, COMMAND_CGI, CMD_ENABLE_HOST_SVC_NOTIFICATIONS, url_encode(host_name)); printf("\n", url_images_path, DELAY_ICON, COMMAND_CGI, CMD_SCHEDULE_HOST_SVC_CHECKS, url_encode(host_name)); printf("\n", url_images_path, DISABLED_ICON, COMMAND_CGI, CMD_DISABLE_HOST_SVC_CHECKS, url_encode(host_name)); printf("\n", url_images_path, ENABLED_ICON, COMMAND_CGI, CMD_ENABLE_HOST_SVC_CHECKS, url_encode(host_name)); if(temp_hoststatus->event_handler_enabled == TRUE) printf("\n", url_images_path, DISABLED_ICON, COMMAND_CGI, CMD_DISABLE_HOST_EVENT_HANDLER, url_encode(host_name)); else printf("\n", url_images_path, ENABLED_ICON, COMMAND_CGI, CMD_ENABLE_HOST_EVENT_HANDLER, url_encode(host_name)); if(temp_hoststatus->flap_detection_enabled == TRUE) { printf("\n", url_images_path, DISABLED_ICON, COMMAND_CGI, CMD_DISABLE_HOST_FLAP_DETECTION, url_encode(host_name)); printf("\n", url_images_path, DISABLED_ICON, COMMAND_CGI, CMD_CLEAR_HOST_FLAPPING_STATE, url_encode(host_name)); } else printf("\n", url_images_path, ENABLED_ICON, COMMAND_CGI, CMD_ENABLE_HOST_FLAP_DETECTION, url_encode(host_name)); printf("
    Locate Host On MapLocate host on map
    Disable Active Checks Of This HostDisable active checks of this host
    Enable Active Checks Of This HostEnable active checks of this host
    Re-schedule Next Host CheckRe-schedule the next check of this host
    Submit Passive Check Result For This HostSubmit passive check result for this host
    Stop Accepting Passive Checks For This HostStop accepting passive checks for this host
    Start Accepting Passive Checks For This HostStart accepting passive checks for this host
    Stop Obsessing Over This HostStop obsessing over this host
    Start Obsessing Over This HostStart obsessing over this host
    Acknowledge This Host ProblemAcknowledge this host problem
    Remove Problem AcknowledgementRemove problem acknowledgement
    Disable Notifications For This HostDisable notifications for this host
    Enable Notifications For This HostEnable notifications for this host
    Send Custom NotificationSend custom host notification
    Delay Next Host NotificationDelay next host notification
    Schedule Downtime For This HostSchedule downtime for this host
    Schedule Downtime For All Services On This HostSchedule downtime for all services on this host
    Disable Notifications For All Services On This HostDisable notifications for all services on this host
    Enable Notifications For All Services On This HostEnable notifications for all services on this host
    Schedule A Check Of All Services On This HostSchedule a check of all services on this host
    Disable Checks Of All Services On This HostDisable checks of all services on this host
    Enable Checks Of All Services On This HostEnable checks of all services on this host
    Disable Event Handler For This HostDisable event handler for this host
    Enable Event Handler For This HostEnable event handler for this host
    Disable Flap Detection For This HostDisable flap detection for this host
    Clear Flapping State For This HostClear flapping state for this host
    Enable Flap Detection For This HostEnable flap detection for this host
    \n"); } else if(is_authorized_for_read_only(¤t_authdata) == TRUE) { printf("
    Your account does not have permissions to execute commands.
    \n"); } else { printf("
    It appears as though Nagios is not running, so commands are temporarily unavailable...
    \n"); printf("Click here to view Nagios process information
    \n", EXTINFO_CGI, DISPLAY_PROCESS_INFO); } printf("
    \n"); printf("
    \n"); /* display comments */ display_comments(HOST_COMMENT); printf("
    \n"); printf("
    \n"); return; } void show_service_info(void) { service *temp_service; char date_time[MAX_DATETIME_LENGTH]; char status_age[48]; char state_duration[48]; servicestatus *temp_svcstatus; char state_string[MAX_INPUT_BUFFER]; const char *bg_class = ""; char *buf = NULL; int days; int hours; int minutes; int seconds; time_t t; time_t current_time; int duration_error = FALSE; /* find the service */ temp_service = find_service(host_name, service_desc); /* make sure the user has rights to view service information */ if(is_authorized_for_service(temp_service, ¤t_authdata) == FALSE) { printf("

    It appears as though you do not have permission to view information for this service...

    \n"); printf("

    If you believe this is an error, check the HTTP server authentication requirements for accessing this CGI
    "); printf("and check the authorization options in your CGI configuration file.

    \n"); return; } /* get service status info */ temp_svcstatus = find_servicestatus(host_name, service_desc); /* make sure service information exists */ if(temp_service == NULL) { printf("

    Error: Service Not Found!

    "); return; } if(temp_svcstatus == NULL) { printf("

    Error: Service Status Not Found!

    "); return; } printf("
    \n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("
    \n"); printf("
    Service State Information
    \n"); if(temp_svcstatus->has_been_checked == FALSE) printf("

    This service has not yet been checked, so status information is not available.

    \n"); else { printf("\n"); printf("\n"); printf("\n"); printf("
    \n"); printf("\n"); printf("\n"); printf("
    \n"); printf("\n"); current_time = time(NULL); t = 0; duration_error = FALSE; if(temp_svcstatus->last_state_change == (time_t)0) { if(program_start > current_time) duration_error = TRUE; else t = current_time - program_start; } else { if(temp_svcstatus->last_state_change > current_time) duration_error = TRUE; else t = current_time - temp_svcstatus->last_state_change; } get_time_breakdown((unsigned long)t, &days, &hours, &minutes, &seconds); if(duration_error == TRUE) snprintf(state_duration, sizeof(state_duration) - 1, "???"); else snprintf(state_duration, sizeof(state_duration) - 1, "%2dd %2dh %2dm %2ds%s", days, hours, minutes, seconds, (temp_svcstatus->last_state_change == (time_t)0) ? "+" : ""); state_duration[sizeof(state_duration) - 1] = '\x0'; if(temp_svcstatus->status == SERVICE_OK) { strcpy(state_string, "OK"); bg_class = "serviceOK"; } else if(temp_svcstatus->status == SERVICE_WARNING) { strcpy(state_string, "WARNING"); bg_class = "serviceWARNING"; } else if(temp_svcstatus->status == SERVICE_CRITICAL) { strcpy(state_string, "CRITICAL"); bg_class = "serviceCRITICAL"; } else { strcpy(state_string, "UNKNOWN"); bg_class = "serviceUNKNOWN"; } printf("\n", bg_class, state_string, state_duration, (temp_svcstatus->problem_has_been_acknowledged == TRUE) ? "  (Has been acknowledged)" : ""); printf("\n"); printf("\n", (temp_svcstatus->perf_data == NULL) ? "" : html_encode(temp_svcstatus->perf_data, TRUE)); printf("\n", (temp_svcstatus->state_type == HARD_STATE) ? "HARD" : "SOFT"); get_time_string(&temp_svcstatus->last_check, date_time, (int)sizeof(date_time), SHORT_DATE_TIME); printf("\n", date_time); printf("\n", (temp_svcstatus->check_type == CHECK_TYPE_ACTIVE) ? "ACTIVE" : "PASSIVE"); printf("\n"); get_time_string(&temp_svcstatus->next_check, date_time, (int)sizeof(date_time), SHORT_DATE_TIME); printf("\n", (temp_svcstatus->checks_enabled && temp_svcstatus->next_check != (time_t)0 && temp_svcstatus->should_be_scheduled == TRUE) ? date_time : "N/A"); get_time_string(&temp_svcstatus->last_state_change, date_time, (int)sizeof(date_time), SHORT_DATE_TIME); printf("\n", (temp_svcstatus->last_state_change == (time_t)0) ? "N/A" : date_time); get_time_string(&temp_svcstatus->last_notification, date_time, (int)sizeof(date_time), SHORT_DATE_TIME); printf("\n", (temp_svcstatus->last_notification == (time_t)0) ? "N/A" : date_time, temp_svcstatus->current_notification_number); printf("\n"); printf("\n", (temp_svcstatus->scheduled_downtime_depth > 0) ? "ACTIVE" : "INACTIVE", (temp_svcstatus->scheduled_downtime_depth > 0) ? "YES" : "NO"); t = 0; duration_error = FALSE; if(temp_svcstatus->last_check > current_time) duration_error = TRUE; else /*t=current_time-temp_svcstatus->last_check;*/ t = current_time - temp_svcstatus->last_update; get_time_breakdown((unsigned long)t, &days, &hours, &minutes, &seconds); if(duration_error == TRUE) snprintf(status_age, sizeof(status_age) - 1, "???"); else if(temp_svcstatus->last_check == (time_t)0) snprintf(status_age, sizeof(status_age) - 1, "N/A"); else snprintf(status_age, sizeof(status_age) - 1, "%2dd %2dh %2dm %2ds", days, hours, minutes, seconds); status_age[sizeof(status_age) - 1] = '\x0'; get_time_string(&temp_svcstatus->last_update, date_time, (int)sizeof(date_time), SHORT_DATE_TIME); printf("\n", (temp_svcstatus->last_update == (time_t)0) ? "N/A" : date_time, status_age); printf("
    Current Status:
      %s  
     (for %s)%s
    Status Information:%s", (temp_svcstatus->plugin_output == NULL) ? "" : html_encode(temp_svcstatus->plugin_output, TRUE)); if(enable_splunk_integration == TRUE) { printf("  "); asprintf(&buf, "%s %s %s", temp_service->host_name, temp_service->description, temp_svcstatus->plugin_output); display_splunk_generic_url(buf, 1); free(buf); } if(temp_svcstatus->long_plugin_output != NULL) printf("
    %s", html_encode(temp_svcstatus->long_plugin_output, TRUE)); printf("
    Performance Data:%s
    Current Attempt:%d/%d", temp_svcstatus->current_attempt, temp_svcstatus->max_attempts); printf("  (%s state)
    Last Check Time:%s
    Check Type:%s
    Check Latency / Duration:"); if(temp_svcstatus->check_type == CHECK_TYPE_ACTIVE) printf("%.3f", temp_svcstatus->latency); else printf("N/A"); printf(" / %.3f seconds", temp_svcstatus->execution_time); printf("
    Next Scheduled Check:  %s
    Last State Change:%s
    Last Notification:%s (notification %d)
    Is This Service Flapping?"); if(temp_svcstatus->flap_detection_enabled == FALSE || enable_flap_detection == FALSE) printf("N/A"); else printf("
      %s  
     (%3.2f%% state change)", (temp_svcstatus->is_flapping == TRUE) ? "" : "not", (temp_svcstatus->is_flapping == TRUE) ? "YES" : "NO", temp_svcstatus->percent_state_change); printf("
    In Scheduled Downtime?
      %s  
    Last Update:%s  (%s ago)
    \n"); printf("
    \n"); printf("
    \n"); printf("\n"); printf("\n"); printf("
    \n"); printf("\n"); printf("\n", (temp_svcstatus->checks_enabled) ? "ENABLED" : "DISABLED", (temp_svcstatus->checks_enabled) ? "ENABLED" : "DISABLED"); printf("\n", (temp_svcstatus->accept_passive_checks == TRUE) ? "ENABLED" : "DISABLED", (temp_svcstatus->accept_passive_checks) ? "ENABLED" : "DISABLED"); printf("\n", (temp_svcstatus->obsess == TRUE) ? "ENABLED" : "DISABLED", (temp_svcstatus->obsess) ? "ENABLED" : "DISABLED"); printf("\n", (temp_svcstatus->notifications_enabled) ? "ENABLED" : "DISABLED", (temp_svcstatus->notifications_enabled) ? "ENABLED" : "DISABLED"); printf("\n", (temp_svcstatus->event_handler_enabled) ? "ENABLED" : "DISABLED", (temp_svcstatus->event_handler_enabled) ? "ENABLED" : "DISABLED"); printf("\n", (temp_svcstatus->flap_detection_enabled == TRUE) ? "ENABLED" : "DISABLED", (temp_svcstatus->flap_detection_enabled == TRUE) ? "ENABLED" : "DISABLED"); printf("
    Active Checks:
      %s  
    Passive Checks:
      %s  
    Obsessing:
      %s  
    Notifications:
      %s  
    Event Handler:
      %s  
    Flap Detection:
      %s  
    \n"); printf("
    \n"); printf("
    \n"); } printf("
    \n"); printf("\n"); printf("\n"); printf("
    \n"); printf("
    Service Commands
    \n"); printf("\n"); printf("\n"); printf("
    \n"); if(nagios_process_state == STATE_OK && is_authorized_for_read_only(¤t_authdata) == FALSE) { printf("\n"); if(temp_svcstatus->checks_enabled) { printf("\n", url_encode(service_desc)); } else { printf("\n", url_encode(service_desc)); } printf("\n", url_encode(service_desc), (temp_svcstatus->checks_enabled == TRUE) ? "&force_check" : ""); if(temp_svcstatus->accept_passive_checks == TRUE) { printf("\n", url_encode(service_desc)); printf("\n", url_encode(service_desc)); } else { printf("\n", url_encode(service_desc)); } if(temp_svcstatus->obsess == TRUE) { printf("\n", url_encode(service_desc)); } else { printf("\n", url_encode(service_desc)); } if((temp_svcstatus->status == SERVICE_WARNING || temp_svcstatus->status == SERVICE_UNKNOWN || temp_svcstatus->status == SERVICE_CRITICAL) && temp_svcstatus->state_type == HARD_STATE) { if(temp_svcstatus->problem_has_been_acknowledged == FALSE) { printf("\n", url_encode(service_desc)); } else { printf("\n", url_encode(service_desc)); } } if(temp_svcstatus->notifications_enabled == TRUE) { printf("\n", url_encode(service_desc)); if(temp_svcstatus->status != SERVICE_OK) { printf("\n", url_encode(service_desc)); } } else { printf("\n", url_encode(service_desc)); } printf("\n", url_encode(service_desc)); printf("\n", url_encode(service_desc)); /* printf("\n",url_encode(service_desc)); */ if(temp_svcstatus->event_handler_enabled == TRUE) { printf("\n", url_encode(service_desc)); } else { printf("\n", url_encode(service_desc)); } if(temp_svcstatus->flap_detection_enabled == TRUE) { printf("\n", url_encode(service_desc)); printf("\n", url_encode(service_desc)); } else { printf("\n", url_encode(service_desc)); } printf("
    Disable Active Checks Of This ServiceDisable active checks of this service
    Enable Active Checks Of This ServiceEnable active checks of this service
    Re-schedule Next Service CheckRe-schedule the next check of this service
    Submit Passive Check Result For This ServiceSubmit passive check result for this service
    Stop Accepting Passive Checks For This ServiceStop accepting passive checks for this service
    Start Accepting Passive Checks For This ServiceStart accepting passive checks for this service
    Stop Obsessing Over This ServiceStop obsessing over this service
    Start Obsessing Over This ServiceStart obsessing over this service
    Acknowledge This Service ProblemAcknowledge this service problem
    Remove Problem AcknowledgementRemove problem acknowledgement
    Disable Notifications For This ServiceDisable notifications for this service
    Delay Next Service NotificationDelay next service notification
    Enable Notifications For This ServiceEnable notifications for this service
    Send Custom NotificationSend custom service notification
    Schedule Downtime For This ServiceSchedule downtime for this service
    Cancel Scheduled Downtime For This ServiceCancel scheduled downtime for this service
    Disable Event Handler For This ServiceDisable event handler for this service
    Enable Event Handler For This ServiceEnable event handler for this service
    Disable Flap Detection For This ServiceDisable flap detection for this service
    Clear Flapping State For This ServiceClear flapping state for this service
    Enable Flap Detection For This ServiceEnable flap detection for this service
    \n"); } else if(is_authorized_for_read_only(¤t_authdata) == TRUE) { printf("
    Your account does not have permissions to execute commands.
    \n"); } else { printf("
    It appears as though Nagios is not running, so commands are temporarily unavailable...
    \n"); printf("Click here to view Nagios process information
    \n", EXTINFO_CGI, DISPLAY_PROCESS_INFO); } printf("
    \n"); printf("

    \n"); /* display comments */ display_comments(SERVICE_COMMENT); printf("
    \n"); printf("
    \n"); return; } void show_hostgroup_info(void) { hostgroup *temp_hostgroup; /* get hostgroup info */ temp_hostgroup = find_hostgroup(hostgroup_name); /* make sure the user has rights to view hostgroup information */ if(is_authorized_for_hostgroup(temp_hostgroup, ¤t_authdata) == FALSE) { printf("

    It appears as though you do not have permission to view information for this hostgroup...

    \n"); printf("

    If you believe this is an error, check the HTTP server authentication requirements for accessing this CGI
    "); printf("and check the authorization options in your CGI configuration file.

    \n"); return; } /* make sure hostgroup information exists */ if(temp_hostgroup == NULL) { printf("

    Error: Hostgroup Not Found!

    "); return; } printf("
    \n"); printf("\n"); printf("\n"); /* top left panel */ printf("\n"); printf("\n"); /* left bottom panel */ printf("\n"); printf("
    \n"); /* right top panel */ printf("\n"); printf("
    Hostgroup Commands
    \n"); if(nagios_process_state == STATE_OK && is_authorized_for_read_only(¤t_authdata) == FALSE) { printf("\n"); printf("\n"); printf("
    \n"); printf("\n"); printf("\n", url_images_path, DOWNTIME_ICON, COMMAND_CGI, CMD_SCHEDULE_HOSTGROUP_HOST_DOWNTIME, url_encode(hostgroup_name)); printf("\n", url_images_path, DOWNTIME_ICON, COMMAND_CGI, CMD_SCHEDULE_HOSTGROUP_SVC_DOWNTIME, url_encode(hostgroup_name)); printf("\n", url_images_path, NOTIFICATION_ICON, COMMAND_CGI, CMD_ENABLE_HOSTGROUP_HOST_NOTIFICATIONS, url_encode(hostgroup_name)); printf("\n", url_images_path, NOTIFICATIONS_DISABLED_ICON, COMMAND_CGI, CMD_DISABLE_HOSTGROUP_HOST_NOTIFICATIONS, url_encode(hostgroup_name)); printf("\n", url_images_path, NOTIFICATION_ICON, COMMAND_CGI, CMD_ENABLE_HOSTGROUP_SVC_NOTIFICATIONS, url_encode(hostgroup_name)); printf("\n", url_images_path, NOTIFICATIONS_DISABLED_ICON, COMMAND_CGI, CMD_DISABLE_HOSTGROUP_SVC_NOTIFICATIONS, url_encode(hostgroup_name)); printf("\n", url_images_path, ENABLED_ICON, COMMAND_CGI, CMD_ENABLE_HOSTGROUP_SVC_CHECKS, url_encode(hostgroup_name)); printf("\n", url_images_path, DISABLED_ICON, COMMAND_CGI, CMD_DISABLE_HOSTGROUP_SVC_CHECKS, url_encode(hostgroup_name)); printf("
    Schedule Downtime For All Hosts In This HostgroupSchedule downtime for all hosts in this hostgroup
    Schedule Downtime For All Services In This HostgroupSchedule downtime for all services in this hostgroup
    Enable Notifications For All Hosts In This HostgroupEnable notifications for all hosts in this hostgroup
    Disable Notifications For All Hosts In This HostgroupDisable notifications for all hosts in this hostgroup
    Enable Notifications For All Services In This HostgroupEnable notifications for all services in this hostgroup
    Disable Notifications For All Services In This HostgroupDisable notifications for all services in this hostgroup
    Enable Active Checks Of All Services In This HostgroupEnable active checks of all services in this hostgroup
    Disable Active Checks Of All Services In This HostgroupDisable active checks of all services in this hostgroup
    \n"); printf("
    \n"); } else if(is_authorized_for_read_only(¤t_authdata) == TRUE) { printf("
    Your account does not have permissions to execute commands.
    \n"); } else { printf("
    It appears as though Nagios is not running, so commands are temporarily unavailable...
    \n"); printf("Click here to view Nagios process information
    \n", EXTINFO_CGI, DISPLAY_PROCESS_INFO); } printf("
    \n"); printf("
    \n"); printf("
    \n"); printf("\n"); printf("\n"); return; } void show_servicegroup_info() { servicegroup *temp_servicegroup; /* get servicegroup info */ temp_servicegroup = find_servicegroup(servicegroup_name); /* make sure the user has rights to view servicegroup information */ if(is_authorized_for_servicegroup(temp_servicegroup, ¤t_authdata) == FALSE) { printf("

    It appears as though you do not have permission to view information for this servicegroup...

    \n"); printf("

    If you believe this is an error, check the HTTP server authentication requirements for accessing this CGI
    "); printf("and check the authorization options in your CGI configuration file.

    \n"); return; } /* make sure servicegroup information exists */ if(temp_servicegroup == NULL) { printf("

    Error: Servicegroup Not Found!

    "); return; } printf("
    \n"); printf("\n"); printf("\n"); /* top left panel */ printf("\n"); printf("\n"); /* left bottom panel */ printf("\n"); printf("
    \n"); /* right top panel */ printf("\n"); printf("
    Servicegroup Commands
    \n"); if(nagios_process_state == STATE_OK) { printf("\n"); printf("\n"); printf("
    \n"); printf("\n"); printf("\n", url_images_path, DOWNTIME_ICON, COMMAND_CGI, CMD_SCHEDULE_SERVICEGROUP_HOST_DOWNTIME, url_encode(servicegroup_name)); printf("\n", url_images_path, DOWNTIME_ICON, COMMAND_CGI, CMD_SCHEDULE_SERVICEGROUP_SVC_DOWNTIME, url_encode(servicegroup_name)); printf("\n", url_images_path, NOTIFICATION_ICON, COMMAND_CGI, CMD_ENABLE_SERVICEGROUP_HOST_NOTIFICATIONS, url_encode(servicegroup_name)); printf("\n", url_images_path, NOTIFICATIONS_DISABLED_ICON, COMMAND_CGI, CMD_DISABLE_SERVICEGROUP_HOST_NOTIFICATIONS, url_encode(servicegroup_name)); printf("\n", url_images_path, NOTIFICATION_ICON, COMMAND_CGI, CMD_ENABLE_SERVICEGROUP_SVC_NOTIFICATIONS, url_encode(servicegroup_name)); printf("\n", url_images_path, NOTIFICATIONS_DISABLED_ICON, COMMAND_CGI, CMD_DISABLE_SERVICEGROUP_SVC_NOTIFICATIONS, url_encode(servicegroup_name)); printf("\n", url_images_path, ENABLED_ICON, COMMAND_CGI, CMD_ENABLE_SERVICEGROUP_SVC_CHECKS, url_encode(servicegroup_name)); printf("\n", url_images_path, DISABLED_ICON, COMMAND_CGI, CMD_DISABLE_SERVICEGROUP_SVC_CHECKS, url_encode(servicegroup_name)); printf("
    Schedule Downtime For All Hosts In This ServicegroupSchedule downtime for all hosts in this servicegroup
    Schedule Downtime For All Services In This ServicegroupSchedule downtime for all services in this servicegroup
    Enable Notifications For All Hosts In This ServicegroupEnable notifications for all hosts in this servicegroup
    Disable Notifications For All Hosts In This ServicegroupDisable notifications for all hosts in this servicegroup
    Enable Notifications For All Services In This ServicegroupEnable notifications for all services in this servicegroup
    Disable Notifications For All Services In This ServicegroupDisable notifications for all services in this servicegroup
    Enable Active Checks Of All Services In This ServicegroupEnable active checks of all services in this servicegroup
    Disable Active Checks Of All Services In This ServicegroupDisable active checks of all services in this servicegroup
    \n"); printf("
    \n"); } else { printf("
    It appears as though Nagios is not running, so commands are temporarily unavailable...
    \n"); printf("Click here to view Nagios process information
    \n", EXTINFO_CGI, DISPLAY_PROCESS_INFO); } printf("
    \n"); printf("
    \n"); printf("
    \n"); printf("\n"); printf("\n"); return; } /* shows all service and host comments */ void show_all_comments(void) { int total_comments = 0; const char *bg_class = ""; int odd = 0; char date_time[MAX_DATETIME_LENGTH]; nagios_comment *temp_comment; host *temp_host; service *temp_service; char *comment_type; char expire_time[MAX_DATETIME_LENGTH]; printf("
    \n"); printf("\n"); printf("
    \n"); printf("\n"); printf("
    Host Comments
    \n"); if(is_authorized_for_read_only(¤t_authdata)==FALSE) { printf("\n"); } printf("
    \n"); printf("
    \n"); printf("\n"); if(is_authorized_for_read_only(¤t_authdata)==FALSE) printf("\n"); else printf("\n"); /* display all the host comments */ for(temp_comment = comment_list, total_comments = 0; temp_comment != NULL; temp_comment = temp_comment->next) { if(temp_comment->comment_type != HOST_COMMENT) continue; temp_host = find_host(temp_comment->host_name); /* make sure the user has rights to view host information */ if(is_authorized_for_host(temp_host, ¤t_authdata) == FALSE) continue; total_comments++; if(odd) { odd = 0; bg_class = "commentOdd"; } else { odd = 1; bg_class = "commentEven"; } switch(temp_comment->entry_type) { case USER_COMMENT: comment_type = "User"; break; case DOWNTIME_COMMENT: comment_type = "Scheduled Downtime"; break; case FLAPPING_COMMENT: comment_type = "Flap Detection"; break; case ACKNOWLEDGEMENT_COMMENT: comment_type = "Acknowledgement"; break; default: comment_type = "?"; } get_time_string(&temp_comment->entry_time, date_time, (int)sizeof(date_time), SHORT_DATE_TIME); get_time_string(&temp_comment->expire_time, expire_time, (int)sizeof(date_time), SHORT_DATE_TIME); printf("", bg_class); printf("", bg_class, EXTINFO_CGI, DISPLAY_HOST_INFO, url_encode(temp_comment->host_name), temp_comment->host_name); printf("", bg_class, date_time, bg_class, temp_comment->author, bg_class, temp_comment->comment_data, bg_class, temp_comment->comment_id, bg_class, (temp_comment->persistent) ? "Yes" : "No", bg_class, comment_type, bg_class, (temp_comment->expires == TRUE) ? expire_time : "N/A"); if(is_authorized_for_read_only(¤t_authdata)==FALSE) printf("", COMMAND_CGI, CMD_DEL_HOST_COMMENT, temp_comment->comment_id, url_images_path, DELETE_ICON); printf("\n"); } if(total_comments == 0) printf(""); printf("
    Host NameEntry TimeAuthorCommentComment IDPersistentTypeExpiresActions
    Host NameEntry TimeAuthorCommentComment IDPersistentTypeExpires
    %s%s%s%s%ld%s%s%sDelete This Comment
    There are no host comments
    \n"); printf("
    \n"); printf("


    \n"); printf("\n"); printf("
    Service Comments
    \n"); if(is_authorized_for_read_only(¤t_authdata)==FALSE){ printf("\n"); } printf("
    \n"); printf("
    \n"); printf("\n"); if(is_authorized_for_read_only(¤t_authdata)==FALSE) printf("\n"); else printf("\n"); /* display all the service comments */ for(temp_comment = comment_list, total_comments = 0; temp_comment != NULL; temp_comment = temp_comment->next) { if(temp_comment->comment_type != SERVICE_COMMENT) continue; temp_service = find_service(temp_comment->host_name, temp_comment->service_description); /* make sure the user has rights to view service information */ if(is_authorized_for_service(temp_service, ¤t_authdata) == FALSE) continue; total_comments++; if(odd) { odd = 0; bg_class = "commentOdd"; } else { odd = 1; bg_class = "commentEven"; } switch(temp_comment->entry_type) { case USER_COMMENT: comment_type = "User"; break; case DOWNTIME_COMMENT: comment_type = "Scheduled Downtime"; break; case FLAPPING_COMMENT: comment_type = "Flap Detection"; break; case ACKNOWLEDGEMENT_COMMENT: comment_type = "Acknowledgement"; break; default: comment_type = "?"; } get_time_string(&temp_comment->entry_time, date_time, (int)sizeof(date_time), SHORT_DATE_TIME); get_time_string(&temp_comment->expire_time, expire_time, (int)sizeof(date_time), SHORT_DATE_TIME); printf("", bg_class); printf("", bg_class, EXTINFO_CGI, DISPLAY_HOST_INFO, url_encode(temp_comment->host_name), temp_comment->host_name); printf("", url_encode(temp_comment->service_description), temp_comment->service_description); printf("", bg_class, date_time, bg_class, temp_comment->author, bg_class, temp_comment->comment_data, bg_class, temp_comment->comment_id, bg_class, (temp_comment->persistent) ? "Yes" : "No", bg_class, comment_type, bg_class, (temp_comment->expires == TRUE) ? expire_time : "N/A"); if(is_authorized_for_read_only(¤t_authdata)==FALSE) printf("", COMMAND_CGI, CMD_DEL_SVC_COMMENT, temp_comment->comment_id, url_images_path, DELETE_ICON); printf("\n"); } if(total_comments == 0) printf(""); printf("
    Host NameServiceEntry TimeAuthorCommentComment IDPersistentTypeExpiresActions
    Host NameServiceEntry TimeAuthorCommentComment IDPersistentTypeExpires
    %s%s%s%s%s%ld%s%s%sDelete This Comment
    There are no service comments
    \n"); printf("
    \n"); return; } void show_performance_data(void) { service *temp_service = NULL; servicestatus *temp_servicestatus = NULL; host *temp_host = NULL; hoststatus *temp_hoststatus = NULL; int total_active_service_checks = 0; int total_passive_service_checks = 0; double min_service_execution_time = 0.0; double max_service_execution_time = 0.0; double total_service_execution_time = 0.0; int have_min_service_execution_time = FALSE; int have_max_service_execution_time = FALSE; double min_service_latency = 0.0; double max_service_latency = 0.0; double long total_service_latency = 0.0; int have_min_service_latency = FALSE; int have_max_service_latency = FALSE; double min_host_latency = 0.0; double max_host_latency = 0.0; double total_host_latency = 0.0; int have_min_host_latency = FALSE; int have_max_host_latency = FALSE; double min_service_percent_change_a = 0.0; double max_service_percent_change_a = 0.0; double total_service_percent_change_a = 0.0; int have_min_service_percent_change_a = FALSE; int have_max_service_percent_change_a = FALSE; double min_service_percent_change_b = 0.0; double max_service_percent_change_b = 0.0; double total_service_percent_change_b = 0.0; int have_min_service_percent_change_b = FALSE; int have_max_service_percent_change_b = FALSE; int active_service_checks_1min = 0; int active_service_checks_5min = 0; int active_service_checks_15min = 0; int active_service_checks_1hour = 0; int active_service_checks_start = 0; int active_service_checks_ever = 0; int passive_service_checks_1min = 0; int passive_service_checks_5min = 0; int passive_service_checks_15min = 0; int passive_service_checks_1hour = 0; int passive_service_checks_start = 0; int passive_service_checks_ever = 0; int total_active_host_checks = 0; int total_passive_host_checks = 0; double min_host_execution_time = 0.0; double max_host_execution_time = 0.0; double total_host_execution_time = 0.0; int have_min_host_execution_time = FALSE; int have_max_host_execution_time = FALSE; double min_host_percent_change_a = 0.0; double max_host_percent_change_a = 0.0; double total_host_percent_change_a = 0.0; int have_min_host_percent_change_a = FALSE; int have_max_host_percent_change_a = FALSE; double min_host_percent_change_b = 0.0; double max_host_percent_change_b = 0.0; double total_host_percent_change_b = 0.0; int have_min_host_percent_change_b = FALSE; int have_max_host_percent_change_b = FALSE; int active_host_checks_1min = 0; int active_host_checks_5min = 0; int active_host_checks_15min = 0; int active_host_checks_1hour = 0; int active_host_checks_start = 0; int active_host_checks_ever = 0; int passive_host_checks_1min = 0; int passive_host_checks_5min = 0; int passive_host_checks_15min = 0; int passive_host_checks_1hour = 0; int passive_host_checks_start = 0; int passive_host_checks_ever = 0; time_t current_time; time(¤t_time); /* check all services */ for(temp_servicestatus = servicestatus_list; temp_servicestatus != NULL; temp_servicestatus = temp_servicestatus->next) { /* find the service */ temp_service = find_service(temp_servicestatus->host_name, temp_servicestatus->description); /* make sure the user has rights to view service information */ if(is_authorized_for_service(temp_service, ¤t_authdata) == FALSE) continue; /* is this an active or passive check? */ if(temp_servicestatus->check_type == CHECK_TYPE_ACTIVE) { total_active_service_checks++; total_service_execution_time += temp_servicestatus->execution_time; if(have_min_service_execution_time == FALSE || temp_servicestatus->execution_time < min_service_execution_time) { have_min_service_execution_time = TRUE; min_service_execution_time = temp_servicestatus->execution_time; } if(have_max_service_execution_time == FALSE || temp_servicestatus->execution_time > max_service_execution_time) { have_max_service_execution_time = TRUE; max_service_execution_time = temp_servicestatus->execution_time; } total_service_percent_change_a += temp_servicestatus->percent_state_change; if(have_min_service_percent_change_a == FALSE || temp_servicestatus->percent_state_change < min_service_percent_change_a) { have_min_service_percent_change_a = TRUE; min_service_percent_change_a = temp_servicestatus->percent_state_change; } if(have_max_service_percent_change_a == FALSE || temp_servicestatus->percent_state_change > max_service_percent_change_a) { have_max_service_percent_change_a = TRUE; max_service_percent_change_a = temp_servicestatus->percent_state_change; } total_service_latency += temp_servicestatus->latency; if(have_min_service_latency == FALSE || temp_servicestatus->latency < min_service_latency) { have_min_service_latency = TRUE; min_service_latency = temp_servicestatus->latency; } if(have_max_service_latency == FALSE || temp_servicestatus->latency > max_service_latency) { have_max_service_latency = TRUE; max_service_latency = temp_servicestatus->latency; } if(temp_servicestatus->last_check >= (current_time - 60)) active_service_checks_1min++; if(temp_servicestatus->last_check >= (current_time - 300)) active_service_checks_5min++; if(temp_servicestatus->last_check >= (current_time - 900)) active_service_checks_15min++; if(temp_servicestatus->last_check >= (current_time - 3600)) active_service_checks_1hour++; if(temp_servicestatus->last_check >= program_start) active_service_checks_start++; if(temp_servicestatus->last_check != (time_t)0) active_service_checks_ever++; } else { total_passive_service_checks++; total_service_percent_change_b += temp_servicestatus->percent_state_change; if(have_min_service_percent_change_b == FALSE || temp_servicestatus->percent_state_change < min_service_percent_change_b) { have_min_service_percent_change_b = TRUE; min_service_percent_change_b = temp_servicestatus->percent_state_change; } if(have_max_service_percent_change_b == FALSE || temp_servicestatus->percent_state_change > max_service_percent_change_b) { have_max_service_percent_change_b = TRUE; max_service_percent_change_b = temp_servicestatus->percent_state_change; } if(temp_servicestatus->last_check >= (current_time - 60)) passive_service_checks_1min++; if(temp_servicestatus->last_check >= (current_time - 300)) passive_service_checks_5min++; if(temp_servicestatus->last_check >= (current_time - 900)) passive_service_checks_15min++; if(temp_servicestatus->last_check >= (current_time - 3600)) passive_service_checks_1hour++; if(temp_servicestatus->last_check >= program_start) passive_service_checks_start++; if(temp_servicestatus->last_check != (time_t)0) passive_service_checks_ever++; } } /* check all hosts */ for(temp_hoststatus = hoststatus_list; temp_hoststatus != NULL; temp_hoststatus = temp_hoststatus->next) { /* find the host */ temp_host = find_host(temp_hoststatus->host_name); /* make sure the user has rights to view host information */ if(is_authorized_for_host(temp_host, ¤t_authdata) == FALSE) continue; /* is this an active or passive check? */ if(temp_hoststatus->check_type == CHECK_TYPE_ACTIVE) { total_active_host_checks++; total_host_execution_time += temp_hoststatus->execution_time; if(have_min_host_execution_time == FALSE || temp_hoststatus->execution_time < min_host_execution_time) { have_min_host_execution_time = TRUE; min_host_execution_time = temp_hoststatus->execution_time; } if(have_max_host_execution_time == FALSE || temp_hoststatus->execution_time > max_host_execution_time) { have_max_host_execution_time = TRUE; max_host_execution_time = temp_hoststatus->execution_time; } total_host_percent_change_a += temp_hoststatus->percent_state_change; if(have_min_host_percent_change_a == FALSE || temp_hoststatus->percent_state_change < min_host_percent_change_a) { have_min_host_percent_change_a = TRUE; min_host_percent_change_a = temp_hoststatus->percent_state_change; } if(have_max_host_percent_change_a == FALSE || temp_hoststatus->percent_state_change > max_host_percent_change_a) { have_max_host_percent_change_a = TRUE; max_host_percent_change_a = temp_hoststatus->percent_state_change; } total_host_latency += temp_hoststatus->latency; if(have_min_host_latency == FALSE || temp_hoststatus->latency < min_host_latency) { have_min_host_latency = TRUE; min_host_latency = temp_hoststatus->latency; } if(have_max_host_latency == FALSE || temp_hoststatus->latency > max_host_latency) { have_max_host_latency = TRUE; max_host_latency = temp_hoststatus->latency; } if(temp_hoststatus->last_check >= (current_time - 60)) active_host_checks_1min++; if(temp_hoststatus->last_check >= (current_time - 300)) active_host_checks_5min++; if(temp_hoststatus->last_check >= (current_time - 900)) active_host_checks_15min++; if(temp_hoststatus->last_check >= (current_time - 3600)) active_host_checks_1hour++; if(temp_hoststatus->last_check >= program_start) active_host_checks_start++; if(temp_hoststatus->last_check != (time_t)0) active_host_checks_ever++; } else { total_passive_host_checks++; total_host_percent_change_b += temp_hoststatus->percent_state_change; if(have_min_host_percent_change_b == FALSE || temp_hoststatus->percent_state_change < min_host_percent_change_b) { have_min_host_percent_change_b = TRUE; min_host_percent_change_b = temp_hoststatus->percent_state_change; } if(have_max_host_percent_change_b == FALSE || temp_hoststatus->percent_state_change > max_host_percent_change_b) { have_max_host_percent_change_b = TRUE; max_host_percent_change_b = temp_hoststatus->percent_state_change; } if(temp_hoststatus->last_check >= (current_time - 60)) passive_host_checks_1min++; if(temp_hoststatus->last_check >= (current_time - 300)) passive_host_checks_5min++; if(temp_hoststatus->last_check >= (current_time - 900)) passive_host_checks_15min++; if(temp_hoststatus->last_check >= (current_time - 3600)) passive_host_checks_1hour++; if(temp_hoststatus->last_check >= program_start) passive_host_checks_start++; if(temp_hoststatus->last_check != (time_t)0) passive_host_checks_ever++; } } printf("
    \n"); printf("
    Program-Wide Performance Information
    \n"); printf("\n"); /***** ACTIVE SERVICE CHECKS *****/ printf("\n"); printf("\n"); printf("\n"); printf("\n"); /***** PASSIVE SERVICE CHECKS *****/ printf("\n"); printf("\n"); printf("\n"); printf("\n"); /***** ACTIVE HOST CHECKS *****/ printf("\n"); printf("\n"); printf("\n"); printf("\n"); /***** PASSIVE HOST CHECKS *****/ printf("\n"); printf("\n"); printf("\n"); printf("\n"); /***** CHECK STATS *****/ printf("\n"); printf("\n"); printf("\n"); printf("\n"); /***** BUFFER STATS *****/ printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("
    Services Actively Checked:
    \n"); /* fake this so we don't divide by zero for just showing the table */ if(total_active_service_checks == 0) total_active_service_checks = 1; printf("\n"); printf("\n"); printf("
    \n"); printf("\n"); printf("\n"); printf("", active_service_checks_1min, (double)(((double)active_service_checks_1min * 100.0) / (double)total_active_service_checks)); printf("", active_service_checks_5min, (double)(((double)active_service_checks_5min * 100.0) / (double)total_active_service_checks)); printf("", active_service_checks_15min, (double)(((double)active_service_checks_15min * 100.0) / (double)total_active_service_checks)); printf("", active_service_checks_1hour, (double)(((double)active_service_checks_1hour * 100.0) / (double)total_active_service_checks)); printf("", active_service_checks_start, (double)(((double)active_service_checks_start * 100.0) / (double)total_active_service_checks)); printf("
    Time FrameServices Checked
    <= 1 minute:%d (%.1f%%)
    <= 5 minutes:%d (%.1f%%)
    <= 15 minutes:%d (%.1f%%)
    <= 1 hour:%d (%.1f%%)
    Since program start:  %d (%.1f%%)
    \n"); printf("
    \n"); printf("
    \n"); printf("\n"); printf("\n"); printf("
    \n"); printf("\n"); printf("\n"); printf("\n", min_service_execution_time, max_service_execution_time, (double)((double)total_service_execution_time / (double)total_active_service_checks)); printf("\n", min_service_latency, max_service_latency, (double)((double)total_service_latency / (double)total_active_service_checks)); printf("\n", min_service_percent_change_a, max_service_percent_change_a, (double)((double)total_service_percent_change_a / (double)total_active_service_checks)); printf("
    MetricMin.Max.Average
    Check Execution Time:  %.2f sec%.2f sec%.3f sec
    Check Latency:%.2f sec%.2f sec%.3f sec
    Percent State Change:%.2f%%%.2f%%%.2f%%
    \n"); printf("
    \n"); printf("
    Services Passively Checked:
    \n"); /* fake this so we don't divide by zero for just showing the table */ if(total_passive_service_checks == 0) total_passive_service_checks = 1; printf("\n"); printf("\n"); printf("
    \n"); printf("\n"); printf("\n"); printf("", passive_service_checks_1min, (double)(((double)passive_service_checks_1min * 100.0) / (double)total_passive_service_checks)); printf("", passive_service_checks_5min, (double)(((double)passive_service_checks_5min * 100.0) / (double)total_passive_service_checks)); printf("", passive_service_checks_15min, (double)(((double)passive_service_checks_15min * 100.0) / (double)total_passive_service_checks)); printf("", passive_service_checks_1hour, (double)(((double)passive_service_checks_1hour * 100.0) / (double)total_passive_service_checks)); printf("", passive_service_checks_start, (double)(((double)passive_service_checks_start * 100.0) / (double)total_passive_service_checks)); printf("
    Time FrameServices Checked
    <= 1 minute:%d (%.1f%%)
    <= 5 minutes:%d (%.1f%%)
    <= 15 minutes:%d (%.1f%%)
    <= 1 hour:%d (%.1f%%)
    Since program start:  %d (%.1f%%)
    \n"); printf("
    \n"); printf("
    \n"); printf("\n"); printf("\n"); printf("
    \n"); printf("\n"); printf("\n"); printf("\n", min_service_percent_change_b, max_service_percent_change_b, (double)((double)total_service_percent_change_b / (double)total_passive_service_checks)); printf("
    MetricMin.Max.Average
    Percent State Change:  %.2f%%%.2f%%%.2f%%
    \n"); printf("
    \n"); printf("
    Hosts Actively Checked:
    \n"); /* fake this so we don't divide by zero for just showing the table */ if(total_active_host_checks == 0) total_active_host_checks = 1; printf("\n"); printf("\n"); printf("
    \n"); printf("\n"); printf("\n"); printf("", active_host_checks_1min, (double)(((double)active_host_checks_1min * 100.0) / (double)total_active_host_checks)); printf("", active_host_checks_5min, (double)(((double)active_host_checks_5min * 100.0) / (double)total_active_host_checks)); printf("", active_host_checks_15min, (double)(((double)active_host_checks_15min * 100.0) / (double)total_active_host_checks)); printf("", active_host_checks_1hour, (double)(((double)active_host_checks_1hour * 100.0) / (double)total_active_host_checks)); printf("", active_host_checks_start, (double)(((double)active_host_checks_start * 100.0) / (double)total_active_host_checks)); printf("
    Time FrameHosts Checked
    <= 1 minute:%d (%.1f%%)
    <= 5 minutes:%d (%.1f%%)
    <= 15 minutes:%d (%.1f%%)
    <= 1 hour:%d (%.1f%%)
    Since program start:  %d (%.1f%%)
    \n"); printf("
    \n"); printf("
    \n"); printf("\n"); printf("\n"); printf("
    \n"); printf("\n"); printf("\n"); printf("\n", min_host_execution_time, max_host_execution_time, (double)((double)total_host_execution_time / (double)total_active_host_checks)); printf("\n", min_host_latency, max_host_latency, (double)((double)total_host_latency / (double)total_active_host_checks)); printf("\n", min_host_percent_change_a, max_host_percent_change_a, (double)((double)total_host_percent_change_a / (double)total_active_host_checks)); printf("
    MetricMin.Max.Average
    Check Execution Time:  %.2f sec%.2f sec%.3f sec
    Check Latency:%.2f sec%.2f sec%.3f sec
    Percent State Change:%.2f%%%.2f%%%.2f%%
    \n"); printf("
    \n"); printf("
    Hosts Passively Checked:
    \n"); /* fake this so we don't divide by zero for just showing the table */ if(total_passive_host_checks == 0) total_passive_host_checks = 1; printf("\n"); printf("\n"); printf("
    \n"); printf("\n"); printf("\n"); printf("", passive_host_checks_1min, (double)(((double)passive_host_checks_1min * 100.0) / (double)total_passive_host_checks)); printf("", passive_host_checks_5min, (double)(((double)passive_host_checks_5min * 100.0) / (double)total_passive_host_checks)); printf("", passive_host_checks_15min, (double)(((double)passive_host_checks_15min * 100.0) / (double)total_passive_host_checks)); printf("", passive_host_checks_1hour, (double)(((double)passive_host_checks_1hour * 100.0) / (double)total_passive_host_checks)); printf("", passive_host_checks_start, (double)(((double)passive_host_checks_start * 100.0) / (double)total_passive_host_checks)); printf("
    Time FrameHosts Checked
    <= 1 minute:%d (%.1f%%)
    <= 5 minutes:%d (%.1f%%)
    <= 15 minutes:%d (%.1f%%)
    <= 1 hour:%d (%.1f%%)
    Since program start:  %d (%.1f%%)
    \n"); printf("
    \n"); printf("
    \n"); printf("\n"); printf("\n"); printf("
    \n"); printf("\n"); printf("\n"); printf("\n", min_host_percent_change_b, max_host_percent_change_b, (double)((double)total_host_percent_change_b / (double)total_passive_host_checks)); printf("
    MetricMin.Max.Average
    Percent State Change:  %.2f%%%.2f%%%.2f%%
    \n"); printf("
    \n"); printf("
    Check Statistics:
    \n"); printf("\n"); printf("\n"); printf("
    \n"); printf("\n"); printf("\n"); printf("", program_stats[ACTIVE_SCHEDULED_HOST_CHECK_STATS][0], program_stats[ACTIVE_SCHEDULED_HOST_CHECK_STATS][1], program_stats[ACTIVE_SCHEDULED_HOST_CHECK_STATS][2]); printf("", program_stats[ACTIVE_ONDEMAND_HOST_CHECK_STATS][0], program_stats[ACTIVE_ONDEMAND_HOST_CHECK_STATS][1], program_stats[ACTIVE_ONDEMAND_HOST_CHECK_STATS][2]); printf("", program_stats[PARALLEL_HOST_CHECK_STATS][0], program_stats[PARALLEL_HOST_CHECK_STATS][1], program_stats[PARALLEL_HOST_CHECK_STATS][2]); printf("", program_stats[SERIAL_HOST_CHECK_STATS][0], program_stats[SERIAL_HOST_CHECK_STATS][1], program_stats[SERIAL_HOST_CHECK_STATS][2]); printf("", program_stats[ACTIVE_CACHED_HOST_CHECK_STATS][0], program_stats[ACTIVE_CACHED_HOST_CHECK_STATS][1], program_stats[ACTIVE_CACHED_HOST_CHECK_STATS][2]); printf("", program_stats[PASSIVE_HOST_CHECK_STATS][0], program_stats[PASSIVE_HOST_CHECK_STATS][1], program_stats[PASSIVE_HOST_CHECK_STATS][2]); printf("", program_stats[ACTIVE_SCHEDULED_SERVICE_CHECK_STATS][0], program_stats[ACTIVE_SCHEDULED_SERVICE_CHECK_STATS][1], program_stats[ACTIVE_SCHEDULED_SERVICE_CHECK_STATS][2]); printf("", program_stats[ACTIVE_ONDEMAND_SERVICE_CHECK_STATS][0], program_stats[ACTIVE_ONDEMAND_SERVICE_CHECK_STATS][1], program_stats[ACTIVE_ONDEMAND_SERVICE_CHECK_STATS][2]); printf("", program_stats[ACTIVE_CACHED_SERVICE_CHECK_STATS][0], program_stats[ACTIVE_CACHED_SERVICE_CHECK_STATS][1], program_stats[ACTIVE_CACHED_SERVICE_CHECK_STATS][2]); printf("", program_stats[PASSIVE_SERVICE_CHECK_STATS][0], program_stats[PASSIVE_SERVICE_CHECK_STATS][1], program_stats[PASSIVE_SERVICE_CHECK_STATS][2]); printf("", program_stats[EXTERNAL_COMMAND_STATS][0], program_stats[EXTERNAL_COMMAND_STATS][1], program_stats[EXTERNAL_COMMAND_STATS][2]); printf("
    TypeLast 1 MinLast 5 MinLast 15 Min
    Active Scheduled Host Checks%d%d%d
    Active On-Demand Host Checks%d%d%d
    Parallel Host Checks%d%d%d
    Serial Host Checks%d%d%d
    Cached Host Checks%d%d%d
    Passive Host Checks%d%d%d
    Active Scheduled Service Checks%d%d%d
    Active On-Demand Service Checks%d%d%d
    Cached Service Checks%d%d%d
    Passive Service Checks%d%d%d
    External Commands%d%d%d
    \n"); printf("
    \n"); printf("
    Buffer Usage:
    \n"); printf("\n"); printf("\n"); printf("
    \n"); printf("\n"); printf("\n"); printf("", buffer_stats[0][1], buffer_stats[0][2], buffer_stats[0][0]); printf("
    TypeIn UseMax UsedTotal Available
    External Commands %d%d%d
    \n"); printf("
    \n"); printf("
    \n"); printf("
    \n"); return; } void display_comments(int type) { host *temp_host = NULL; service *temp_service = NULL; int total_comments = 0; int display_comment = FALSE; const char *bg_class = ""; int odd = 1; char date_time[MAX_DATETIME_LENGTH]; nagios_comment *temp_comment; scheduled_downtime *temp_downtime; char *comment_type; char expire_time[MAX_DATETIME_LENGTH]; /* find the host or service */ if(type == HOST_COMMENT) { temp_host = find_host(host_name); if(temp_host == NULL) return; } else { temp_service = find_service(host_name, service_desc); if(temp_service == NULL) return; } printf("\n"); printf("
    %s Comments
    \n", (type == HOST_COMMENT) ? "Host" : "Service"); if(is_authorized_for_read_only(¤t_authdata)==FALSE){ printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("
    ", url_images_path, COMMENT_ICON); if(type == HOST_COMMENT) printf("", COMMAND_CGI, CMD_ADD_HOST_COMMENT, url_encode(host_name)); else { printf("", url_encode(service_desc)); } printf("Add a new comment", url_images_path, DELETE_ICON); if(type == HOST_COMMENT) printf("", COMMAND_CGI, CMD_DEL_ALL_HOST_COMMENTS, url_encode(host_name)); else { printf("", url_encode(service_desc)); } printf("Delete all comments
    \n"); } printf("
    \n"); printf("\n"); if(is_authorized_for_read_only(¤t_authdata)==FALSE) printf("\n"); else printf("\n"); /* check all the comments to see if they apply to this host or service */ /* Comments are displayed in the order they are read from the status.dat file */ for(temp_comment = get_first_comment_by_host(host_name); temp_comment != NULL; temp_comment = get_next_comment_by_host(host_name, temp_comment)) { display_comment = FALSE; if(type == HOST_COMMENT && temp_comment->comment_type == HOST_COMMENT) display_comment = TRUE; else if(type == SERVICE_COMMENT && temp_comment->comment_type == SERVICE_COMMENT && !strcmp(temp_comment->service_description, service_desc)) display_comment = TRUE; if(display_comment == TRUE) { if(odd) { odd = 0; bg_class = "commentOdd"; } else { odd = 1; bg_class = "commentEven"; } switch(temp_comment->entry_type) { case USER_COMMENT: comment_type = "User"; break; case DOWNTIME_COMMENT: comment_type = "Scheduled Downtime"; break; case FLAPPING_COMMENT: comment_type = "Flap Detection"; break; case ACKNOWLEDGEMENT_COMMENT: comment_type = "Acknowledgement"; break; default: comment_type = "?"; } if (temp_comment->entry_type == DOWNTIME_COMMENT) { for(temp_downtime = scheduled_downtime_list; temp_downtime != NULL; temp_downtime = temp_downtime->next) { if (temp_downtime->comment_id == temp_comment->comment_id) break; } } else temp_downtime = NULL; get_time_string(&temp_comment->entry_time, date_time, (int)sizeof(date_time), SHORT_DATE_TIME); get_time_string(&temp_comment->expire_time, expire_time, (int)sizeof(date_time), SHORT_DATE_TIME); printf("", bg_class); printf("", bg_class, date_time, bg_class, temp_comment->author); printf("", bg_class, temp_comment->comment_id, bg_class, (temp_comment->persistent) ? "Yes" : "No", bg_class, comment_type, bg_class, (temp_comment->expires == TRUE) ? expire_time : "N/A"); if(is_authorized_for_read_only(¤t_authdata)==FALSE) printf("", COMMAND_CGI, (type == HOST_COMMENT) ? CMD_DEL_HOST_COMMENT : CMD_DEL_SVC_COMMENT, temp_comment->comment_id, url_images_path, DELETE_ICON); printf("\n"); total_comments++; } } /* see if this host or service has any comments associated with it */ if(total_comments == 0) printf("", (type == HOST_COMMENT) ? 9 : 10, (type == HOST_COMMENT) ? "host" : "service"); printf("
    Entry TimeAuthorCommentComment IDPersistentTypeExpiresActions
    Entry TimeAuthorCommentComment IDPersistentTypeExpires
    %s%s%s", bg_class, temp_comment->comment_data); if (temp_downtime) printf("
    %s", temp_downtime->comment); printf("
    %lu%s%s%sDelete This Comment
    This %s has no comments associated with it
    \n"); return; } /* shows all service and host scheduled downtime */ void show_all_downtime(void) { int total_downtime = 0; const char *bg_class = ""; int odd = 0; char date_time[MAX_DATETIME_LENGTH]; scheduled_downtime *temp_downtime; host *temp_host; service *temp_service; int days; int hours; int minutes; int seconds; printf("
    \n"); printf("\n"); printf("
    \n"); printf("\n"); printf("
    Scheduled Host Downtime
    \n"); printf("\n"); printf("
    \n"); printf("
    \n"); printf("\n"); printf("\n"); /* display all the host downtime */ for(temp_downtime = scheduled_downtime_list, total_downtime = 0; temp_downtime != NULL; temp_downtime = temp_downtime->next) { if(temp_downtime->type != HOST_DOWNTIME) continue; temp_host = find_host(temp_downtime->host_name); /* make sure the user has rights to view host information */ if(is_authorized_for_host(temp_host, ¤t_authdata) == FALSE) continue; total_downtime++; if(odd) { odd = 0; bg_class = "downtimeOdd"; } else { odd = 1; bg_class = "downtimeEven"; } printf("", bg_class); printf("", bg_class, EXTINFO_CGI, DISPLAY_HOST_INFO, url_encode(temp_downtime->host_name), temp_downtime->host_name); get_time_string(&temp_downtime->entry_time, date_time, (int)sizeof(date_time), SHORT_DATE_TIME); printf("", bg_class, date_time); printf("", bg_class, (temp_downtime->author == NULL) ? "N/A" : temp_downtime->author); printf("", bg_class, (temp_downtime->comment == NULL) ? "N/A" : temp_downtime->comment); get_time_string(&temp_downtime->start_time, date_time, (int)sizeof(date_time), SHORT_DATE_TIME); printf("", bg_class, date_time); get_time_string(&temp_downtime->end_time, date_time, (int)sizeof(date_time), SHORT_DATE_TIME); printf("", bg_class, date_time); printf("", bg_class, (temp_downtime->fixed == TRUE) ? "Fixed" : "Flexible"); get_time_breakdown(temp_downtime->duration, &days, &hours, &minutes, &seconds); printf("", bg_class, days, hours, minutes, seconds); printf("", bg_class, temp_downtime->downtime_id); printf("\n"); printf("", COMMAND_CGI, CMD_DEL_HOST_DOWNTIME, temp_downtime->downtime_id, url_images_path, DELETE_ICON); printf("\n"); } if(total_downtime == 0) printf(""); printf("
    Host NameEntry TimeAuthorCommentStart TimeEnd TimeTypeDurationDowntime IDTrigger IDActions
    %s%s%s%s%s%s%s%dd %dh %dm %ds%lu", bg_class); if(temp_downtime->triggered_by == 0) printf("N/A"); else printf("%lu", temp_downtime->triggered_by); printf("Delete/Cancel This Scheduled Downtime Entry
    There are no hosts with scheduled downtime
    \n"); printf("
    \n"); printf("


    \n"); printf("\n"); printf("
    Scheduled Service Downtime
    \n"); printf("\n"); printf("
    \n"); printf("
    \n"); printf("\n"); printf("\n"); /* display all the service downtime */ for(temp_downtime = scheduled_downtime_list, total_downtime = 0; temp_downtime != NULL; temp_downtime = temp_downtime->next) { if(temp_downtime->type != SERVICE_DOWNTIME) continue; temp_service = find_service(temp_downtime->host_name, temp_downtime->service_description); /* make sure the user has rights to view service information */ if(is_authorized_for_service(temp_service, ¤t_authdata) == FALSE) continue; total_downtime++; if(odd) { odd = 0; bg_class = "downtimeOdd"; } else { odd = 1; bg_class = "downtimeEven"; } printf("", bg_class); printf("", bg_class, EXTINFO_CGI, DISPLAY_HOST_INFO, url_encode(temp_downtime->host_name), temp_downtime->host_name); printf("", url_encode(temp_downtime->service_description), temp_downtime->service_description); get_time_string(&temp_downtime->entry_time, date_time, (int)sizeof(date_time), SHORT_DATE_TIME); printf("", bg_class, date_time); printf("", bg_class, (temp_downtime->author == NULL) ? "N/A" : temp_downtime->author); printf("", bg_class, (temp_downtime->comment == NULL) ? "N/A" : temp_downtime->comment); get_time_string(&temp_downtime->start_time, date_time, (int)sizeof(date_time), SHORT_DATE_TIME); printf("", bg_class, date_time); get_time_string(&temp_downtime->end_time, date_time, (int)sizeof(date_time), SHORT_DATE_TIME); printf("", bg_class, date_time); printf("", bg_class, (temp_downtime->fixed == TRUE) ? "Fixed" : "Flexible"); get_time_breakdown(temp_downtime->duration, &days, &hours, &minutes, &seconds); printf("", bg_class, days, hours, minutes, seconds); printf("", bg_class, temp_downtime->downtime_id); printf("\n"); printf("", COMMAND_CGI, CMD_DEL_SVC_DOWNTIME, temp_downtime->downtime_id, url_images_path, DELETE_ICON); printf("\n"); } if(total_downtime == 0) printf(""); printf("
    Host NameServiceEntry TimeAuthorCommentStart TimeEnd TimeTypeDurationDowntime IDTrigger IDActions
    %s%s%s%s%s%s%s%s%dd %dh %dm %ds%lu", bg_class); if(temp_downtime->triggered_by == 0) printf("N/A"); else printf("%lu", temp_downtime->triggered_by); printf("Delete/Cancel This Scheduled Downtime Entry
    There are no services with scheduled downtime
    \n"); printf("
    \n"); return; } /* shows check scheduling queue */ void show_scheduling_queue(void) { sortdata *temp_sortdata; servicestatus *temp_svcstatus = NULL; hoststatus *temp_hststatus = NULL; char date_time[MAX_DATETIME_LENGTH]; char temp_url[MAX_INPUT_BUFFER]; int odd = 0; const char *bgclass = ""; /* make sure the user has rights to view system information */ if(is_authorized_for_system_information(¤t_authdata) == FALSE) { printf("

    It appears as though you do not have permission to view process information...

    \n"); printf("

    If you believe this is an error, check the HTTP server authentication requirements for accessing this CGI
    "); printf("and check the authorization options in your CGI configuration file.

    \n"); return; } /* sort hosts and services */ sort_data(sort_type, sort_option); printf("
    Entries sorted by "); if(sort_option == SORT_HOSTNAME) printf("host name"); else if(sort_option == SORT_SERVICENAME) printf("service name"); else if(sort_option == SORT_SERVICESTATUS) printf("service status"); else if(sort_option == SORT_LASTCHECKTIME) printf("last check time"); else if(sort_option == SORT_NEXTCHECKTIME) printf("next check time"); printf(" (%s)\n", (sort_type == SORT_ASCENDING) ? "ascending" : "descending"); printf("
    \n"); printf("

    \n"); printf("

    \n"); printf("\n"); printf(""); snprintf(temp_url, sizeof(temp_url) - 1, "%s?type=%d", EXTINFO_CGI, DISPLAY_SCHEDULING_QUEUE); temp_url[sizeof(temp_url) - 1] = '\x0'; printf("", temp_url, SORT_ASCENDING, SORT_HOSTNAME, url_images_path, UP_ARROW_ICON, temp_url, SORT_DESCENDING, SORT_HOSTNAME, url_images_path, DOWN_ARROW_ICON); printf("", temp_url, SORT_ASCENDING, SORT_SERVICENAME, url_images_path, UP_ARROW_ICON, temp_url, SORT_DESCENDING, SORT_SERVICENAME, url_images_path, DOWN_ARROW_ICON); printf("", temp_url, SORT_ASCENDING, SORT_LASTCHECKTIME, url_images_path, UP_ARROW_ICON, temp_url, SORT_DESCENDING, SORT_LASTCHECKTIME, url_images_path, DOWN_ARROW_ICON); printf("", temp_url, SORT_ASCENDING, SORT_NEXTCHECKTIME, url_images_path, UP_ARROW_ICON, temp_url, SORT_DESCENDING, SORT_NEXTCHECKTIME, url_images_path, DOWN_ARROW_ICON); printf("\n"); /* display all services and hosts */ for(temp_sortdata = sortdata_list; temp_sortdata != NULL; temp_sortdata = temp_sortdata->next) { /* skip hosts and services that shouldn't be scheduled */ if(temp_sortdata->is_service == TRUE) { temp_svcstatus = temp_sortdata->svcstatus; if(temp_svcstatus->should_be_scheduled == FALSE) { /* passive-only checks should appear if they're being forced */ if(!(temp_svcstatus->checks_enabled == FALSE && temp_svcstatus->next_check != (time_t)0L && (temp_svcstatus->check_options & CHECK_OPTION_FORCE_EXECUTION))) continue; } } else { temp_hststatus = temp_sortdata->hststatus; if(temp_hststatus->should_be_scheduled == FALSE) { /* passive-only checks should appear if they're being forced */ if(!(temp_hststatus->checks_enabled == FALSE && temp_hststatus->next_check != (time_t)0L && (temp_hststatus->check_options & CHECK_OPTION_FORCE_EXECUTION))) continue; } } if(odd) { odd = 0; bgclass = "Even"; } else { odd = 1; bgclass = "Odd"; } printf("", bgclass); /* get the service status */ if(temp_sortdata->is_service == TRUE) { printf("", bgclass, EXTINFO_CGI, DISPLAY_HOST_INFO, url_encode(temp_svcstatus->host_name), temp_svcstatus->host_name); printf("", url_encode(temp_svcstatus->description), temp_svcstatus->description); get_time_string(&temp_svcstatus->last_check, date_time, (int)sizeof(date_time), SHORT_DATE_TIME); printf("", bgclass, (temp_svcstatus->last_check == (time_t)0) ? "N/A" : date_time); get_time_string(&temp_svcstatus->next_check, date_time, (int)sizeof(date_time), SHORT_DATE_TIME); printf("", bgclass, (temp_svcstatus->next_check == (time_t)0) ? "N/A" : date_time); printf(""); printf("", (temp_svcstatus->checks_enabled == TRUE) ? "ENABLED" : "DISABLED", (temp_svcstatus->checks_enabled == TRUE) ? "ENABLED" : "DISABLED"); printf("\n"); } /* get the host status */ else { printf("", bgclass, EXTINFO_CGI, DISPLAY_HOST_INFO, url_encode(temp_hststatus->host_name), temp_hststatus->host_name); printf("", bgclass); get_time_string(&temp_hststatus->last_check, date_time, (int)sizeof(date_time), SHORT_DATE_TIME); printf("", bgclass, (temp_hststatus->last_check == (time_t)0) ? "N/A" : date_time); get_time_string(&temp_hststatus->next_check, date_time, (int)sizeof(date_time), SHORT_DATE_TIME); printf("", bgclass, (temp_hststatus->next_check == (time_t)0) ? "N/A" : date_time); printf(""); printf("", (temp_hststatus->checks_enabled == TRUE) ? "ENABLED" : "DISABLED", (temp_hststatus->checks_enabled == TRUE) ? "ENABLED" : "DISABLED"); printf("\n"); } printf("\n"); } printf("
    Host Sort by host name (ascending)Sort by host name (descending)Service Sort by service name (ascending)Sort by service name (descending)Last Check Sort by last check time (ascending)Sort by last check time (descending)Next Check Sort by next check time (ascending)Sort by next check time (descending)TypeActive ChecksActions
    %s%s%s%s", bgclass); if(temp_svcstatus->check_options == CHECK_OPTION_NONE) printf("Normal "); else { if(temp_svcstatus->check_options & CHECK_OPTION_FORCE_EXECUTION) printf("Forced "); if(temp_svcstatus->check_options & CHECK_OPTION_FRESHNESS_CHECK) printf("Freshness "); if(temp_svcstatus->check_options & CHECK_OPTION_ORPHAN_CHECK) printf("Orphan "); } printf("%s", bgclass); if(temp_svcstatus->checks_enabled == TRUE) { printf("Disable Active Checks Of This Service\n", url_encode(temp_svcstatus->description), url_images_path, DISABLED_ICON); } else { printf("Enable Active Checks Of This Service\n", url_encode(temp_svcstatus->description), url_images_path, ENABLED_ICON); } printf("Re-schedule This Service Check\n", url_encode(temp_svcstatus->description), (temp_svcstatus->checks_enabled == TRUE) ? "&force_check" : "", url_images_path, DELAY_ICON); printf("%s %s%s", bgclass); if(temp_hststatus->check_options == CHECK_OPTION_NONE) printf("Normal "); else { if(temp_hststatus->check_options & CHECK_OPTION_FORCE_EXECUTION) printf("Forced "); if(temp_hststatus->check_options & CHECK_OPTION_FRESHNESS_CHECK) printf("Freshness "); if(temp_hststatus->check_options & CHECK_OPTION_ORPHAN_CHECK) printf("Orphan "); } printf("%s", bgclass); if(temp_hststatus->checks_enabled == TRUE) { printf("Disable Active Checks Of This Host\n", url_images_path, DISABLED_ICON); } else { printf("Enable Active Checks Of This Host\n", url_images_path, ENABLED_ICON); } printf("Re-schedule This Host Check\n", url_images_path, DELAY_ICON); printf("
    \n"); printf("
    \n"); printf("

    \n"); /* free memory allocated to sorted data list */ free_sortdata_list(); return; } /* sorts host and service data */ int sort_data(int s_type, int s_option) { sortdata *new_sortdata; sortdata *last_sortdata; sortdata *temp_sortdata; servicestatus *temp_svcstatus; hoststatus *temp_hststatus; if(s_type == SORT_NONE) return ERROR; /* sort all service status entries */ for(temp_svcstatus = servicestatus_list; temp_svcstatus != NULL; temp_svcstatus = temp_svcstatus->next) { /* allocate memory for a new sort structure */ new_sortdata = (sortdata *)malloc(sizeof(sortdata)); if(new_sortdata == NULL) return ERROR; new_sortdata->is_service = TRUE; new_sortdata->svcstatus = temp_svcstatus; new_sortdata->hststatus = NULL; last_sortdata = sortdata_list; for(temp_sortdata = sortdata_list; temp_sortdata != NULL; temp_sortdata = temp_sortdata->next) { if(compare_sortdata_entries(s_type, s_option, new_sortdata, temp_sortdata) == TRUE) { new_sortdata->next = temp_sortdata; if(temp_sortdata == sortdata_list) sortdata_list = new_sortdata; else last_sortdata->next = new_sortdata; break; } else last_sortdata = temp_sortdata; } if(sortdata_list == NULL) { new_sortdata->next = NULL; sortdata_list = new_sortdata; } else if(temp_sortdata == NULL) { new_sortdata->next = NULL; last_sortdata->next = new_sortdata; } } /* sort all host status entries */ for(temp_hststatus = hoststatus_list; temp_hststatus != NULL; temp_hststatus = temp_hststatus->next) { /* allocate memory for a new sort structure */ new_sortdata = (sortdata *)malloc(sizeof(sortdata)); if(new_sortdata == NULL) return ERROR; new_sortdata->is_service = FALSE; new_sortdata->svcstatus = NULL; new_sortdata->hststatus = temp_hststatus; last_sortdata = sortdata_list; for(temp_sortdata = sortdata_list; temp_sortdata != NULL; temp_sortdata = temp_sortdata->next) { if(compare_sortdata_entries(s_type, s_option, new_sortdata, temp_sortdata) == TRUE) { new_sortdata->next = temp_sortdata; if(temp_sortdata == sortdata_list) sortdata_list = new_sortdata; else last_sortdata->next = new_sortdata; break; } else last_sortdata = temp_sortdata; } if(sortdata_list == NULL) { new_sortdata->next = NULL; sortdata_list = new_sortdata; } else if(temp_sortdata == NULL) { new_sortdata->next = NULL; last_sortdata->next = new_sortdata; } } return OK; } int compare_sortdata_entries(int s_type, int s_option, sortdata *new_sortdata, sortdata *temp_sortdata) { hoststatus *temp_hststatus = NULL; servicestatus *temp_svcstatus = NULL; time_t last_check[2]; time_t next_check[2]; int current_attempt[2]; int status[2]; char *hname[2]; char *service_description[2]; if(new_sortdata->is_service == TRUE) { temp_svcstatus = new_sortdata->svcstatus; last_check[0] = temp_svcstatus->last_check; next_check[0] = temp_svcstatus->next_check; status[0] = temp_svcstatus->status; hname[0] = temp_svcstatus->host_name; service_description[0] = temp_svcstatus->description; current_attempt[0] = temp_svcstatus->current_attempt; } else { temp_hststatus = new_sortdata->hststatus; last_check[0] = temp_hststatus->last_check; next_check[0] = temp_hststatus->next_check; status[0] = temp_hststatus->status; hname[0] = temp_hststatus->host_name; service_description[0] = ""; current_attempt[0] = temp_hststatus->current_attempt; } if(temp_sortdata->is_service == TRUE) { temp_svcstatus = temp_sortdata->svcstatus; last_check[1] = temp_svcstatus->last_check; next_check[1] = temp_svcstatus->next_check; status[1] = temp_svcstatus->status; hname[1] = temp_svcstatus->host_name; service_description[1] = temp_svcstatus->description; current_attempt[1] = temp_svcstatus->current_attempt; } else { temp_hststatus = temp_sortdata->hststatus; last_check[1] = temp_hststatus->last_check; next_check[1] = temp_hststatus->next_check; status[1] = temp_hststatus->status; hname[1] = temp_hststatus->host_name; service_description[1] = ""; current_attempt[1] = temp_hststatus->current_attempt; } if(s_type == SORT_ASCENDING) { if(s_option == SORT_LASTCHECKTIME) { if(last_check[0] <= last_check[1]) return TRUE; else return FALSE; } if(s_option == SORT_NEXTCHECKTIME) { if(next_check[0] <= next_check[1]) return TRUE; else return FALSE; } else if(s_option == SORT_CURRENTATTEMPT) { if(current_attempt[0] <= current_attempt[1]) return TRUE; else return FALSE; } else if(s_option == SORT_SERVICESTATUS) { if(status[0] <= status[1]) return TRUE; else return FALSE; } else if(s_option == SORT_HOSTNAME) { if(strcasecmp(hname[0], hname[1]) < 0) return TRUE; else return FALSE; } else if(s_option == SORT_SERVICENAME) { if(strcasecmp(service_description[0], service_description[1]) < 0) return TRUE; else return FALSE; } } else { if(s_option == SORT_LASTCHECKTIME) { if(last_check[0] > last_check[1]) return TRUE; else return FALSE; } if(s_option == SORT_NEXTCHECKTIME) { if(next_check[0] > next_check[1]) return TRUE; else return FALSE; } else if(s_option == SORT_CURRENTATTEMPT) { if(current_attempt[0] > current_attempt[1]) return TRUE; else return FALSE; } else if(s_option == SORT_SERVICESTATUS) { if(status[0] > status[1]) return TRUE; else return FALSE; } else if(s_option == SORT_HOSTNAME) { if(strcasecmp(hname[0], hname[1]) > 0) return TRUE; else return FALSE; } else if(s_option == SORT_SERVICENAME) { if(strcasecmp(service_description[0], service_description[1]) > 0) return TRUE; else return FALSE; } } return TRUE; } /* free all memory allocated to the sortdata structures */ void free_sortdata_list(void) { sortdata *this_sortdata; sortdata *next_sortdata; /* free memory for the sortdata list */ for(this_sortdata = sortdata_list; this_sortdata != NULL; this_sortdata = next_sortdata) { next_sortdata = this_sortdata->next; free(this_sortdata); } return; } nagios-4.3.4/cgi/getcgi.c000066400000000000000000000360161314764422400151670ustar00rootroot00000000000000/****************************************** * * GETCGI.C - Nagios CGI Input Routines * * *****************************************/ #include "../include/config.h" #include "../include/getcgi.h" #include #include #undef PARANOID_CGI_INPUT /* Remove potentially harmful characters from CGI input that we don't need or want */ void sanitize_cgi_input(char **cgivars) { char *strptr; int x, y, i; int keep; /* don't strip for now... */ return; for(strptr = cgivars[i = 0]; strptr != NULL; strptr = cgivars[++i]) { for(x = 0, y = 0; strptr[x] != '\x0'; x++) { keep = 1; /* remove potentially nasty characters */ if(strptr[x] == ';' || strptr[x] == '|' || strptr[x] == '&' || strptr[x] == '<' || strptr[x] == '>') keep = 0; #ifdef PARANOID_CGI_INPUT else if(strptr[x] == '/' || strptr[x] == '\\') keep = 0; #endif if(keep == 1) strptr[y++] = strptr[x]; } strptr[y] = '\x0'; } return; } /* convert encoded hex string (2 characters representing an 8-bit number) to its ASCII char equivalent */ unsigned char hex_to_char(char *input) { unsigned char outchar = '\x0'; unsigned int outint; char tempbuf[3]; /* NULL or empty string */ if(input == NULL) return '\x0'; if(input[0] == '\x0') return '\x0'; tempbuf[0] = input[0]; tempbuf[1] = input[1]; tempbuf[2] = '\x0'; sscanf(tempbuf, "%X", &outint); /* only convert "normal" ASCII characters - we don't want the rest. Normally you would convert all characters (i.e. for allowing users to post binary files), but since we aren't doing this, stay on the cautious side of things and reject outsiders... */ #ifdef PARANOID_CGI_INPUT if(outint < 32 || outint > 126) outint = 0; #endif outchar = (unsigned char)outint; return outchar; } /* unescape hex characters in CGI input */ void unescape_cgi_input(char *input) { int x, y; int len; if(input == NULL) return; len = strlen(input); for(x = 0, y = 0; x < len; x++, y++) { if(input[x] == '\x0') break; else if(input[x] == '%') { input[y] = hex_to_char(&input[x + 1]); x += 2; } else input[y] = input[x]; } input[y] = '\x0'; return; } /* read the CGI input and place all name/val pairs into list. returns list containing name1, value1, name2, value2, ... , NULL */ /* this is a hacked version of a routine I found a long time ago somewhere - can't remember where anymore */ char **getcgivars(void) { register int i; char *accept_lang; char *request_method; char *content_type; char *content_length_string; int content_length; char *cgiinput; char **cgivars; char **pairlist; int paircount; char *nvpair; char *eqpos; char *cookies, *formid; /* initialize char variable(s) */ cgiinput = ""; /* Attempt to set the locale */ accept_lang = getenv("HTTP_ACCEPT_LANGUAGE"); process_language(accept_lang); /* depending on the request method, read all CGI input into cgiinput */ request_method = getenv("REQUEST_METHOD"); if(request_method == NULL) request_method = ""; if(!strcmp(request_method, "GET") || !strcmp(request_method, "HEAD")) { /* check for NULL query string environment variable - 04/28/00 (Ludo Bosmans) */ if(getenv("QUERY_STRING") == NULL) { cgiinput = (char *)malloc(1); if(cgiinput != NULL) cgiinput[0] = '\x0'; } else cgiinput = strdup(getenv("QUERY_STRING")); if(cgiinput == NULL) { printf("getcgivars(): Could not allocate memory for CGI input.\n"); exit(1); } } else if(!strcmp(request_method, "POST") || !strcmp(request_method, "PUT")) { /* if CONTENT_TYPE variable is not specified, RFC-2068 says we should assume it is "application/octet-string" */ /* mobile (WAP) stations generate CONTENT_TYPE with charset, we we should only check first 33 chars */ content_type = getenv("CONTENT_TYPE"); if(content_type == NULL) content_type = ""; if(strlen(content_type) && strncasecmp(content_type, "application/x-www-form-urlencoded", 33)) { printf("getcgivars(): Unsupported Content-Type.\n"); exit(1); } content_length_string = getenv("CONTENT_LENGTH"); if(content_length_string == NULL) content_length_string = "0"; if(!(content_length = atoi(content_length_string))) { printf("getcgivars(): No Content-Length was sent with the POST request.\n") ; exit(1); } /* suspicious content length */ if((content_length < 0) || (content_length >= INT_MAX - 1)) { printf("getcgivars(): Suspicious Content-Length was sent with the POST request.\n"); exit(1); } if(!(cgiinput = (char *)malloc(content_length + 1))) { printf("getcgivars(): Could not allocate memory for CGI input.\n"); exit(1); } if(!fread(cgiinput, content_length, 1, stdin)) { printf("getcgivars(): Could not read input from STDIN.\n"); exit(1); } cgiinput[content_length] = '\0'; } else { printf("getcgivars(): Unsupported REQUEST_METHOD -> '%s'\n", request_method); printf("\n"); printf("I'm guessing you're trying to execute the CGI from a command line.\n"); printf("In order to do that, you need to set the REQUEST_METHOD environment\n"); printf("variable to either \"GET\", \"HEAD\", or \"POST\". When using the\n"); printf("GET and HEAD methods, arguments can be passed to the CGI\n"); printf("by setting the \"QUERY_STRING\" environment variable. If you're\n"); printf("using the POST method, data is read from standard input. Also of\n"); printf("note: if you've enabled authentication in the CGIs, you must set the\n"); printf("\"REMOTE_USER\" environment variable to be the name of the user you're\n"); printf("\"authenticated\" as.\n"); printf("\n"); exit(1); } /* change all plus signs back to spaces */ for(i = 0; cgiinput[i]; i++) { if(cgiinput[i] == '+') cgiinput[i] = ' '; } /* first, split on ampersands (&) to extract the name-value pairs into pairlist */ /* allocate memory for 256 name-value pairs at a time, increasing by same amount as necessary... */ pairlist = (char **)malloc(256 * sizeof(char *)); if(pairlist == NULL) { printf("getcgivars(): Could not allocate memory for name-value pairlist.\n"); exit(1); } paircount = 0; nvpair = strtok(cgiinput, "&"); while(nvpair) { pairlist[paircount] = strdup(nvpair); if( NULL == pairlist[paircount]) { printf("getcgivars(): Could not allocate memory for name-value pair #%d.\n", paircount); exit(1); } paircount++; if(!(paircount % 256)) { pairlist = (char **)realloc(pairlist, (paircount + 256) * sizeof(char *)); if(pairlist == NULL) { printf("getcgivars(): Could not re-allocate memory for name-value pairlist.\n"); exit(1); } } nvpair = strtok(NULL, "&"); } /* See if there is a NagFormId cookie & get it if it's available */ cookies = getenv("HTTP_COOKIE"); if (cookies && *cookies) { formid = strstr(cookies, "NagFormId="); if (formid) { if(!(paircount % 256)) { pairlist = (char **)realloc(pairlist, (paircount + 1) * sizeof(char *)); if(pairlist == NULL) { printf("getcgivars(): Could not re-allocate memory for name-value pairlist.\n"); exit(1); } } formid = strtok(formid, ";"); if (strlen(formid) > 10 && strlen(formid) < 21) { for (i = strlen(formid) - 1; i > 9; --i) if (!isxdigit(formid[i])) break; if (i == 9) { pairlist[paircount] = strdup(formid); if (!pairlist[paircount]) { printf("getcgivars(): Could not allocate memory for name-value pair #%d.\n", paircount); exit(1); } paircount++; } } } } /* terminate the list */ pairlist[paircount] = '\x0'; /* extract the names and values from the pairlist */ cgivars = (char **)malloc((paircount * 2 + 1) * sizeof(char *)); if(cgivars == NULL) { printf("getcgivars(): Could not allocate memory for name-value list.\n"); exit(1); } for(i = 0; i < paircount; i++) { /* get the variable name preceding the equal (=) sign */ if((eqpos = strchr(pairlist[i], '=')) != NULL) { *eqpos = '\0'; cgivars[i * 2 + 1] = strdup(eqpos + 1); if( NULL == cgivars[ i * 2 + 1]) { printf("getcgivars(): Could not allocate memory for cgi value #%d.\n", i); exit(1); } unescape_cgi_input(cgivars[i * 2 + 1]); } else { cgivars[i * 2 + 1] = strdup(""); if( NULL == cgivars[ i * 2 + 1]) { printf("getcgivars(): Could not allocate memory for empty stringfor variable value #%d.\n", i); exit(1); } unescape_cgi_input(cgivars[i * 2 + 1]); } /* get the variable value (or name/value of there was no real "pair" in the first place) */ cgivars[i * 2] = strdup(pairlist[i]); if( NULL == cgivars[ i * 2]) { printf("getcgivars(): Could not allocate memory for cgi name #%d.\n", i); exit(1); } unescape_cgi_input(cgivars[i * 2]); } /* terminate the name-value list */ cgivars[paircount * 2] = '\x0'; /* free allocated memory */ free(cgiinput); for(i = 0; pairlist[i] != NULL; i++) free(pairlist[i]); free(pairlist); /* sanitize the name-value strings */ sanitize_cgi_input(cgivars); /* return the list of name-value strings */ return cgivars; } /* Set the locale based on the HTTP_ACCEPT_LANGUAGE variable value sent by the browser */ void process_language( char * accept_lang) { accept_languages *accept_langs = NULL; int x; char locale_string[ 64]; char * locale = NULL; char * locale_failsafe[] = { "en_US.utf8", "POSIX", "C" }; if( accept_lang != NULL) { accept_langs = parse_accept_languages( accept_lang); } if( NULL != accept_langs) { /* Sort the results */ qsort( accept_langs->languages, accept_langs->count, sizeof( accept_langs->languages[ 0]), compare_accept_languages); /* Try each language in order of priority */ for( x = 0; (( x < accept_langs->count) && ( NULL == locale)); x++) { accept_language *l; l = accept_langs->languages[x]; if (!l || !l->locality || !l->language) continue; snprintf( locale_string, sizeof( locale_string), "%s_%s.%s", l->language, l->locality, "utf8"); locale = setlocale( LC_ALL, locale_string); } free_accept_languages( accept_langs); } if( NULL == locale) { /* Still isn't set */ /* Try the fail safe locales */ for( x = 0; (( x < (int)( sizeof( locale_failsafe) / sizeof( char *))) && ( NULL == locale)); x++) { locale = setlocale( LC_ALL, locale_failsafe[ x]); } } } accept_languages * parse_accept_languages( char * acceptlang) { char * langdup; /* Duplicate of accept language for parsing */ accept_languages *langs = NULL; char * langtok; /* Language token (language + locality + q value) */ char * saveptr; /* Save state of tokenization */ char * qdelim; /* location of the delimiter ';q=' */ char * localitydelim; /* Delimiter for locality specifier */ int x; char * stp; /* If the browser did not pass an HTTP_ACCEPT_LANGUAGE variable, there is not much we can do */ if( NULL == acceptlang) { return NULL; } /* Duplicate the browser supplied HTTP_ACCEPT_LANGUAGE variable */ if( NULL == ( langdup = strdup( acceptlang))) { printf( "Unable to allocate memory for langdup\n"); return NULL; } /* Initialize the structure to contain the parsed HTTP_ACCEPT_LANGUAGE information */ if( NULL == ( langs = malloc( sizeof( accept_languages)))) { printf( "Unable to allocate memory for langs\n"); free( langdup); return NULL; } langs->count = 0; langs->languages = ( accept_language **)NULL; /* Tokenize the HTTP_ACCEPT_LANGUAGE string */ langtok = strtok_r( langdup, ",", &saveptr); while( langtok != NULL) { /* Bump the count and allocate memory for structures */ langs->count++; if( NULL == langs->languages) { /* Adding first language */ if( NULL == ( langs->languages = malloc( langs->count * sizeof( accept_language *)))) { printf( "Unable to allocate memory for first language\n"); langs->count--; free_accept_languages( langs); free( langdup); return NULL; } } else { /* Adding additional language */ if( NULL == ( langs->languages = realloc( langs->languages, langs->count * sizeof( accept_language *)))) { printf( "Unable to allocate memory for additional language\n"); langs->count--; free_accept_languages( langs); free( langdup); return NULL; } } if( NULL == ( langs->languages[ langs->count - 1] = malloc( sizeof( accept_language)))) { printf( "Unable to allocate memory for language\n"); langs->count--; free_accept_languages( langs); free( langdup); return NULL; } langs->languages[ langs->count - 1]->language = ( char *)NULL; langs->languages[ langs->count - 1]->locality = ( char *)NULL; langs->languages[ langs->count - 1]->q = 1.0; /* Check to see if there is a q value */ qdelim = strstr( langtok, ACCEPT_LANGUAGE_Q_DELIMITER); if( NULL != qdelim) { /* found a q value */ langs->languages[ langs->count - 1]->q = strtod( qdelim + strlen( ACCEPT_LANGUAGE_Q_DELIMITER), NULL); langtok[ qdelim - langtok] = '\0'; } /* Check to see if there is a locality specifier */ if( NULL == ( localitydelim = strchr( langtok, '-'))) { localitydelim = strchr( langtok, '_'); } if( NULL != localitydelim) { /* We have a locality delimiter, so copy it */ if( NULL == ( langs->languages[ langs->count - 1]->locality = strdup( localitydelim + 1))) { printf( "Unable to allocate memory for locality '%s'\n", langtok); free_accept_languages( langs); free( langdup); return NULL; } /* Ensure it is upper case */ for( x = 0, stp = langs->languages[ langs->count - 1]->locality; x < (int)strlen( langs->languages[ langs->count - 1]->locality); x++, stp++) { *stp = toupper( *stp); } /* Then null out the delimiter so the language copy works */ *localitydelim = '\0'; } if( NULL == ( langs->languages[ langs->count - 1]->language = strdup( langtok))) { printf( "Unable to allocate memory for language '%s'\n", langtok); free_accept_languages( langs); free( langdup); return NULL; } /* Get the next language token */ langtok = strtok_r( NULL, ",", &saveptr); } free( langdup); return langs; } int compare_accept_languages( const void *p1, const void *p2) { accept_language * lang1 = *( accept_language **)p1; accept_language * lang2 = *( accept_language **)p2; if( lang1->q == lang2->q) { if((( NULL == lang1->locality) && ( NULL == lang2->locality)) || (( NULL != lang1->locality) && ( NULL != lang2->locality))) { return 0; } else if( NULL != lang1->locality) { return -1; } else { /* NULL != lang2->locality */ return 1; } } else { return( lang2->q > lang1->q); } } void free_accept_languages( accept_languages * langs) { int x; if( NULL == langs) { return; } for( x = 0; x < langs->count; x++) { if( NULL != langs->languages[ x]) { if( langs->languages[ x]->language != NULL) { free( langs->languages[ x]->language); } if( langs->languages[ x]->locality != NULL) { free( langs->languages[ x]->locality); } free( langs->languages[ x]); } } if( langs->languages != NULL) { free( langs->languages); } free( langs); return; } /* free() memory allocated to storing the CGI variables */ void free_cgivars(char **cgivars) { register int x; for(x = 0; cgivars[x] != '\x0'; x++) free(cgivars[x]); return; } nagios-4.3.4/cgi/histogram.c000066400000000000000000002446601314764422400157300ustar00rootroot00000000000000/************************************************************************** * * HISTOGRAM.C - Nagios Alert Histogram CGI * * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *************************************************************************/ #include "../include/config.h" #include "../include/common.h" #include "../include/objects.h" #include "../include/statusdata.h" #include "../include/cgiutils.h" #include "../include/getcgi.h" #include "../include/cgiauth.h" #include /* Boutell's GD library function */ #include /* GD library small font definition */ /*#define DEBUG 1*/ #define HISTOGRAM_IMAGE "histogram.png" /* archived state types */ #define AS_NO_DATA 0 #define AS_PROGRAM_START 1 #define AS_PROGRAM_END 2 #define AS_HOST_UP 3 #define AS_HOST_DOWN 4 #define AS_HOST_UNREACHABLE 5 #define AS_SVC_OK 6 #define AS_SVC_UNKNOWN 7 #define AS_SVC_WARNING 8 #define AS_SVC_CRITICAL 9 /* display types */ #define DISPLAY_HOST_HISTOGRAM 0 #define DISPLAY_SERVICE_HISTOGRAM 1 #define DISPLAY_NO_HISTOGRAM 2 /* input types */ #define GET_INPUT_NONE 0 #define GET_INPUT_TARGET_TYPE 1 #define GET_INPUT_HOST_TARGET 2 #define GET_INPUT_SERVICE_TARGET 3 #define GET_INPUT_OPTIONS 4 /* breakdown types */ #define BREAKDOWN_MONTHLY 0 #define BREAKDOWN_DAY_OF_MONTH 1 #define BREAKDOWN_DAY_OF_WEEK 2 #define BREAKDOWN_HOURLY 3 /* modes */ #define CREATE_HTML 0 #define CREATE_IMAGE 1 /* standard report times */ #define TIMEPERIOD_CUSTOM 0 #define TIMEPERIOD_TODAY 1 #define TIMEPERIOD_YESTERDAY 2 #define TIMEPERIOD_THISWEEK 3 #define TIMEPERIOD_LASTWEEK 4 #define TIMEPERIOD_THISMONTH 5 #define TIMEPERIOD_LASTMONTH 6 #define TIMEPERIOD_THISQUARTER 7 #define TIMEPERIOD_LASTQUARTER 8 #define TIMEPERIOD_THISYEAR 9 #define TIMEPERIOD_LASTYEAR 10 #define TIMEPERIOD_LAST24HOURS 11 #define TIMEPERIOD_LAST7DAYS 12 #define TIMEPERIOD_LAST31DAYS 13 #define MAX_ARCHIVE_SPREAD 65 #define MAX_ARCHIVE 65 #define MAX_ARCHIVE_BACKTRACKS 60 #define DRAWING_WIDTH 550 #define DRAWING_HEIGHT 195 #define DRAWING_X_OFFSET 60 #define DRAWING_Y_OFFSET 235 #define GRAPH_HOST_UP 1 #define GRAPH_HOST_DOWN 2 #define GRAPH_HOST_UNREACHABLE 4 #define GRAPH_SERVICE_OK 8 #define GRAPH_SERVICE_WARNING 16 #define GRAPH_SERVICE_UNKNOWN 32 #define GRAPH_SERVICE_CRITICAL 64 #define GRAPH_HOST_PROBLEMS 6 #define GRAPH_HOST_ALL 7 #define GRAPH_SERVICE_PROBLEMS 112 #define GRAPH_SERVICE_ALL 120 #define GRAPH_EVERYTHING 255 #define GRAPH_SOFT_STATETYPES 1 #define GRAPH_HARD_STATETYPES 2 #define GRAPH_ALL_STATETYPES 3 extern char main_config_file[MAX_FILENAME_LENGTH]; extern char url_html_path[MAX_FILENAME_LENGTH]; extern char url_images_path[MAX_FILENAME_LENGTH]; extern char url_stylesheets_path[MAX_FILENAME_LENGTH]; extern char physical_images_path[MAX_FILENAME_LENGTH]; extern char *status_file; authdata current_authdata; typedef struct timeslice_data_struct { unsigned long service_ok; unsigned long host_up; unsigned long service_critical; unsigned long host_down; unsigned long service_unknown; unsigned long host_unreachable; unsigned long service_warning; } timeslice_data; timeslice_data *tsdata; void convert_timeperiod_to_times(int); void compute_report_times(void); void graph_all_histogram_data(void); void add_archived_state(int, time_t); void read_archived_state_data(void); void scan_log_file_for_archived_state_data(char *); void draw_line(int, int, int, int, int); void draw_dashed_line(int, int, int, int, int); void document_header(int); void document_footer(void); int process_cgivars(void); time_t t1; time_t t2; int start_second = 0; int start_minute = 0; int start_hour = 0; int start_day = 1; int start_month = 1; int start_year = 2000; int end_second = 0; int end_minute = 0; int end_hour = 24; int end_day = 1; int end_month = 1; int end_year = 2000; int display_type = DISPLAY_NO_HISTOGRAM; int mode = CREATE_HTML; int input_type = GET_INPUT_NONE; int timeperiod_type = TIMEPERIOD_LAST24HOURS; int breakdown_type = BREAKDOWN_HOURLY; int compute_time_from_parts = FALSE; int initial_states_logged = FALSE; int assume_state_retention = TRUE; int new_states_only = FALSE; int last_state = AS_NO_DATA; int program_restart_has_occurred = FALSE; int graph_events = GRAPH_EVERYTHING; int graph_statetypes = GRAPH_HARD_STATETYPES; int embedded = FALSE; int display_header = TRUE; char *host_name = ""; char *svc_description = ""; gdImagePtr histogram_image = 0; int color_white = 0; int color_black = 0; int color_red = 0; int color_darkred = 0; int color_green = 0; int color_yellow = 0; int color_orange = 0; int color_lightgray = 0; FILE *image_file = NULL; int backtrack_archives = 0; int earliest_archive = 0; time_t earliest_time; time_t latest_time; int image_width = 900; int image_height = 320; int total_buckets = 96; int main(int argc, char **argv) { int result = OK; char temp_buffer[MAX_INPUT_BUFFER]; char image_template[MAX_INPUT_BUFFER]; char start_timestring[MAX_INPUT_BUFFER]; char end_timestring[MAX_INPUT_BUFFER]; host *temp_host; service *temp_service; int is_authorized = TRUE; int found = FALSE; int days, hours, minutes, seconds; char *first_service = NULL; int x; time_t t3; time_t current_time; struct tm *t; /* initialize time period to last 24 hours */ time(&t2); t1 = (time_t)(t2 - (60 * 60 * 24)); /* get the arguments passed in the URL */ process_cgivars(); /* reset internal CGI variables */ reset_cgi_vars(); /* Initialize shared configuration variables */ init_shared_cfg_vars(1); /* read the CGI configuration file */ result = read_cgi_config_file(get_cgi_config_location()); if(result == ERROR) { if(mode == CREATE_HTML) { document_header(FALSE); cgi_config_file_error(get_cgi_config_location()); document_footer(); } return ERROR; } /* read the main configuration file */ result = read_main_config_file(main_config_file); if(result == ERROR) { if(mode == CREATE_HTML) { document_header(FALSE); main_config_file_error(main_config_file); document_footer(); } return ERROR; } /* read all object configuration data */ result = read_all_object_configuration_data(main_config_file, READ_ALL_OBJECT_DATA); if(result == ERROR) { if(mode == CREATE_HTML) { document_header(FALSE); object_data_error(); document_footer(); } return ERROR; } /* read all status data */ result = read_all_status_data(status_file, READ_ALL_STATUS_DATA); if(result == ERROR) { if(mode == CREATE_HTML) { document_header(FALSE); status_data_error(); document_footer(); } free_memory(); return ERROR; } document_header(TRUE); /* get authentication information */ get_authentication_information(¤t_authdata); if(compute_time_from_parts == TRUE) compute_report_times(); /* make sure times are sane, otherwise swap them */ if(t2 < t1) { t3 = t2; t2 = t1; t1 = t3; } if(mode == CREATE_HTML && display_header == TRUE) { /* begin top table */ printf("\n"); printf("\n"); /* left column of the first row */ printf("\n"); /* center column of top row */ printf("\n"); /* right hand column of top row */ printf("\n"); /* end of top table */ printf("\n"); printf("
    \n"); if(display_type == DISPLAY_HOST_HISTOGRAM) snprintf(temp_buffer, sizeof(temp_buffer) - 1, "Host Alert Histogram"); else if(display_type == DISPLAY_SERVICE_HISTOGRAM) snprintf(temp_buffer, sizeof(temp_buffer) - 1, "Service Alert Histogram"); else snprintf(temp_buffer, sizeof(temp_buffer) - 1, "Host and Service Alert Histogram"); temp_buffer[sizeof(temp_buffer) - 1] = '\x0'; display_info_table(temp_buffer, FALSE, ¤t_authdata); if(display_type != DISPLAY_NO_HISTOGRAM && input_type == GET_INPUT_NONE) { printf("\n"); printf("\n"); printf("\n"); } printf("\n"); if(display_type != DISPLAY_NO_HISTOGRAM && input_type == GET_INPUT_NONE) { printf("
    \n"); if(display_type == DISPLAY_HOST_HISTOGRAM) printf("Host '%s'", host_name); else if(display_type == DISPLAY_SERVICE_HISTOGRAM) printf("Service '%s' On Host '%s'", svc_description, host_name); printf("
    \n"); printf("
    \n"); printf("%s Event Histogram\n", url_images_path, TRENDS_ICON, (display_type == DISPLAY_HOST_HISTOGRAM) ? "Host" : "Service", (display_type == DISPLAY_HOST_HISTOGRAM) ? "Host" : "Service"); printf("
    \n"); get_time_string(&t1, start_timestring, sizeof(start_timestring) - 1, SHORT_DATE_TIME); get_time_string(&t2, end_timestring, sizeof(end_timestring) - 1, SHORT_DATE_TIME); printf("
    %s to %s
    \n", start_timestring, end_timestring); get_time_breakdown((time_t)(t2 - t1), &days, &hours, &minutes, &seconds); printf("
    Duration: %dd %dh %dm %ds
    \n", days, hours, minutes, seconds); } printf("
    \n"); #ifdef LEGACY_GRAPHICAL_CGIS printf("
    \n", HISTOGRAM_CGI); #else printf("\n", LEGACY_HISTOGRAM_CGI); #endif printf("\n"); if(display_type != DISPLAY_NO_HISTOGRAM && input_type == GET_INPUT_NONE) { printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); } /* display context-sensitive help */ printf("\n"); printf("
    Report period:Assume state retention:
    \n"); printf("\n", (unsigned long)t1); printf("\n", (unsigned long)t2); printf("\n", escape_string(host_name)); if(display_type == DISPLAY_SERVICE_HISTOGRAM) printf("\n", escape_string(svc_description)); printf("\n"); printf("\n"); printf("\n"); printf("
    Breakdown type:Initial states logged:
    \n"); printf("\n"); printf("\n"); printf("\n"); printf("
    Events to graph:Ignore repeated states:
    \n"); printf("\n"); printf("\n"); printf("\n"); printf("
    State types to graph:
    \n"); printf("\n"); printf("\n"); printf("\n"); printf("
    \n"); if(display_type != DISPLAY_NO_HISTOGRAM && input_type == GET_INPUT_NONE) { if(display_type == DISPLAY_HOST_HISTOGRAM) display_context_help(CONTEXTHELP_HISTOGRAM_HOST); else display_context_help(CONTEXTHELP_HISTOGRAM_SERVICE); } else if(display_type == DISPLAY_NO_HISTOGRAM || input_type != GET_INPUT_NONE) { if(input_type == GET_INPUT_NONE) display_context_help(CONTEXTHELP_HISTOGRAM_MENU1); else if(input_type == GET_INPUT_TARGET_TYPE) display_context_help(CONTEXTHELP_HISTOGRAM_MENU1); else if(input_type == GET_INPUT_HOST_TARGET) display_context_help(CONTEXTHELP_HISTOGRAM_MENU2); else if(input_type == GET_INPUT_SERVICE_TARGET) display_context_help(CONTEXTHELP_HISTOGRAM_MENU3); else if(input_type == GET_INPUT_OPTIONS) display_context_help(CONTEXTHELP_HISTOGRAM_MENU4); } printf("
    \n"); printf("
    \n"); printf("
    \n"); } /* check authorization... */ if(display_type == DISPLAY_HOST_HISTOGRAM) { temp_host = find_host(host_name); if(temp_host == NULL || is_authorized_for_host(temp_host, ¤t_authdata) == FALSE) is_authorized = FALSE; } else if(display_type == DISPLAY_SERVICE_HISTOGRAM) { temp_service = find_service(host_name, svc_description); if(temp_service == NULL || is_authorized_for_service(temp_service, ¤t_authdata) == FALSE) is_authorized = FALSE; } if(is_authorized == FALSE) { if(mode == CREATE_HTML) printf("

    It appears as though you are not authorized to view information for the specified %s...

    \n", (display_type == DISPLAY_HOST_HISTOGRAM) ? "host" : "service"); document_footer(); free_memory(); return ERROR; } if(display_type != DISPLAY_NO_HISTOGRAM && input_type == GET_INPUT_NONE) { /* print URL to image */ if(mode == CREATE_HTML) { printf("

    \n"); printf("
    \n"); #ifdef LEGACY_GRAPHICAL_CGIS printf("\n"); printf("
    \n"); } /* read and process state data */ else { /* allocate memory */ tsdata = NULL; if(breakdown_type == BREAKDOWN_MONTHLY) total_buckets = 12; else if(breakdown_type == BREAKDOWN_DAY_OF_MONTH) total_buckets = 31; else if(breakdown_type == BREAKDOWN_DAY_OF_WEEK) total_buckets = 7; else total_buckets = 96; tsdata = (timeslice_data *)malloc(sizeof(timeslice_data) * total_buckets); if(tsdata == NULL) return ERROR; for(x = 0; x < total_buckets; x++) { tsdata[x].service_ok = 0L; tsdata[x].service_unknown = 0L; tsdata[x].service_warning = 0L; tsdata[x].service_critical = 0L; tsdata[x].host_up = 0L; tsdata[x].host_down = 0L; tsdata[x].host_unreachable = 0L; } /* read in all necessary archived state data */ read_archived_state_data(); #ifdef DEBUG printf("Done reading archived state data.\n"); #endif /* location of image template */ snprintf(image_template, sizeof(image_template) - 1, "%s/%s", physical_images_path, HISTOGRAM_IMAGE); image_template[sizeof(image_template) - 1] = '\x0'; /* allocate buffer for storing image */ image_file = fopen(image_template, "r"); if(image_file != NULL) { histogram_image = gdImageCreateFromPng(image_file); fclose(image_file); } if(histogram_image == NULL) histogram_image = gdImageCreate(image_width, image_height); if(histogram_image == NULL) { #ifdef DEBUG printf("Error: Could not allocate memory for image\n"); #endif return ERROR; } /* allocate colors used for drawing */ color_white = gdImageColorAllocate(histogram_image, 255, 255, 255); color_black = gdImageColorAllocate(histogram_image, 0, 0, 0); color_red = gdImageColorAllocate(histogram_image, 255, 0, 0); color_darkred = gdImageColorAllocate(histogram_image, 128, 0, 0); color_green = gdImageColorAllocate(histogram_image, 0, 128, 0); color_yellow = gdImageColorAllocate(histogram_image, 176, 178, 20); color_orange = gdImageColorAllocate(histogram_image, 255, 100, 25); color_lightgray = gdImageColorAllocate(histogram_image, 192, 192, 192); /* set transparency index */ gdImageColorTransparent(histogram_image, color_white); /* make sure the graphic is interlaced */ gdImageInterlace(histogram_image, 1); #ifdef DEBUG printf("Starting to graph data...\n"); #endif /* graph archived state histogram data */ graph_all_histogram_data(); #ifdef DEBUG printf("Done graphing data.\n"); #endif /* use STDOUT for writing the image data... */ image_file = stdout; #ifdef DEBUG image_file = fopen("/tmp/histogram.png", "w"); #endif /* write the image to to STDOUT */ gdImagePng(histogram_image, image_file); #ifdef DEBUG fclose(image_file); #endif /* free memory allocated to image */ gdImageDestroy(histogram_image); /* free memory allocated for data */ free(tsdata); } } /* show user a selection of hosts and services to choose from... */ if(display_type == DISPLAY_NO_HISTOGRAM || input_type != GET_INPUT_NONE) { /* ask the user for what host they want a report for */ if(input_type == GET_INPUT_HOST_TARGET) { printf("

    \n"); printf("
    Step 2: Select Host
    \n"); printf("

    \n"); printf("

    \n"); #ifdef LEGACY_GRAPHICAL_CGIS printf("
    \n", HISTOGRAM_CGI); #else printf("\n", LEGACY_HISTOGRAM_CGI); #endif printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("
    Host:\n"); printf("\n"); printf("
    \n"); printf("\n"); printf("
    \n"); printf("
    \n"); printf("

    \n"); } /* ask the user for what service they want a report for */ else if(input_type == GET_INPUT_SERVICE_TARGET) { printf("\n"); printf("

    \n"); printf("
    Step 2: Select Service
    \n"); printf("

    \n"); printf("

    \n"); #ifdef LEGACY_GRAPHICAL_CGIS printf("
    \n", HISTOGRAM_CGI); #else printf("\n", LEGACY_HISTOGRAM_CGI); #endif printf("\n"); printf("\n", (first_service == NULL) ? "unknown" : (char *)escape_string(first_service)); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("
    Service:\n"); printf("\n"); printf("
    \n"); printf("\n"); printf("
    \n"); printf("
    \n"); printf("

    \n"); } /* ask the user for report range and options */ else if(input_type == GET_INPUT_OPTIONS) { time(¤t_time); t = localtime(¤t_time); start_day = 1; start_year = t->tm_year + 1900; end_day = t->tm_mday; end_year = t->tm_year + 1900; printf("

    \n"); printf("
    Step 3: Select Report Options
    \n"); printf("

    \n"); printf("

    \n"); #ifdef LEGACY_GRAPHICAL_CGIS printf("
    \n", HISTOGRAM_CGI); #else printf("\n", LEGACY_HISTOGRAM_CGI); #endif printf("\n", escape_string(host_name)); if(display_type == DISPLAY_SERVICE_HISTOGRAM) printf("\n", escape_string(svc_description)); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf(""); printf("\n"); printf("\n"); printf("\n"); printf(""); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("
    Report Period:\n"); printf("\n"); printf("
    If Custom Report Period...
    Start Date (Inclusive):"); printf("\n "); printf(" ", start_day); printf("", start_year); printf("\n"); printf("\n"); printf("\n"); printf("
    End Date (Inclusive):"); printf("\n "); printf(" ", end_day); printf("", end_year); printf("\n"); printf("\n"); printf("\n"); printf("

    Statistics Breakdown:\n"); printf("\n"); printf("
    Events To Graph:\n"); printf("\n"); printf("
    State Types To Graph:\n"); printf("\n"); printf("
    Assume State Retention:\n"); printf("\n"); printf("
    Initial States Logged:\n"); printf("\n"); printf("
    Ignore Repeated States:\n"); printf("\n"); printf("
    \n"); printf("
    \n"); printf("

    \n"); } /* as the user whether they want a graph for a host or service */ else { printf("

    \n"); printf("
    Step 1: Select Report Type
    \n"); printf("

    \n"); printf("

    \n"); #ifdef LEGACY_GRAPHICAL_CGIS printf("
    \n", HISTOGRAM_CGI); #else printf("\n", LEGACY_HISTOGRAM_CGI); #endif printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("
    Type:\n"); printf("\n"); printf("
    \n"); printf("\n"); printf("
    \n"); printf("
    \n"); printf("

    \n"); } } document_footer(); /* free all other allocated memory */ free_memory(); return OK; } void document_header(int use_stylesheet) { char date_time[MAX_DATETIME_LENGTH]; time_t current_time; time_t expire_time; if(mode == CREATE_HTML) { printf("Cache-Control: no-store\r\n"); printf("Pragma: no-cache\r\n"); time(¤t_time); get_time_string(¤t_time, date_time, sizeof(date_time), HTTP_DATE_TIME); printf("Last-Modified: %s\r\n", date_time); expire_time = (time_t)0; get_time_string(&expire_time, date_time, sizeof(date_time), HTTP_DATE_TIME); printf("Expires: %s\r\n", date_time); printf("Content-type: text/html; charset=utf-8\r\n\r\n"); if(embedded == TRUE) return; printf("\n"); printf("\n"); printf("\n", url_images_path); printf("\n"); printf("Nagios Histogram\n"); printf("\n"); if(use_stylesheet == TRUE) { printf("\n", url_stylesheets_path, COMMON_CSS); printf("\n", url_stylesheets_path, HISTOGRAM_CSS); } printf("\n"); printf("\n"); /* include user SSI header */ #ifdef LEGACY_GRAPHICAL_CGIS include_ssi_files(HISTOGRAM_CGI, SSI_HEADER); #else include_ssi_files(LEGACY_HISTOGRAM_CGI, SSI_HEADER); #endif printf("
    \n"); } else { printf("Cache-Control: no-store\r\n"); printf("Pragma: no-cache\r\n"); time(¤t_time); get_time_string(¤t_time, date_time, sizeof(date_time), HTTP_DATE_TIME); printf("Last-Modified: %s\r\n", date_time); expire_time = (time_t)0L; get_time_string(&expire_time, date_time, sizeof(date_time), HTTP_DATE_TIME); printf("Expires: %s\r\n", date_time); printf("Content-Type: image/png\r\n\r\n"); } return; } void document_footer(void) { if(embedded == TRUE) return; if(mode == CREATE_HTML) { /* include user SSI footer */ #ifdef LEGACY_GRAPHICAL_CGIS include_ssi_files(HISTOGRAM_CGI, SSI_FOOTER); #else include_ssi_files(LEGACY_HISTOGRAM_CGI, SSI_FOOTER); #endif printf("\n"); printf("\n"); } return; } int process_cgivars(void) { char **variables; int error = FALSE; int x; variables = getcgivars(); for(x = 0; variables[x] != NULL; x++) { /* do some basic length checking on the variable identifier to prevent buffer overflows */ if(strlen(variables[x]) >= MAX_INPUT_BUFFER - 1) { continue; } /* we found the host argument */ else if(!strcmp(variables[x], "host")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if((host_name = (char *)strdup(variables[x])) == NULL) host_name = ""; strip_html_brackets(host_name); display_type = DISPLAY_HOST_HISTOGRAM; } /* we found the node width argument */ else if(!strcmp(variables[x], "service")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if((svc_description = (char *)strdup(variables[x])) == NULL) svc_description = ""; strip_html_brackets(svc_description); display_type = DISPLAY_SERVICE_HISTOGRAM; } /* we found first time argument */ else if(!strcmp(variables[x], "t1")) { x++; if(variables[x] == NULL) { error = TRUE; break; } t1 = (time_t)strtoul(variables[x], NULL, 10); timeperiod_type = TIMEPERIOD_CUSTOM; } /* we found first time argument */ else if(!strcmp(variables[x], "t2")) { x++; if(variables[x] == NULL) { error = TRUE; break; } t2 = (time_t)strtoul(variables[x], NULL, 10); timeperiod_type = TIMEPERIOD_CUSTOM; } /* we found the image creation option */ else if(!strcmp(variables[x], "createimage")) { mode = CREATE_IMAGE; } /* we found the backtrack archives argument */ else if(!strcmp(variables[x], "backtrack")) { x++; if(variables[x] == NULL) { error = TRUE; break; } backtrack_archives = atoi(variables[x]); if(backtrack_archives < 0) backtrack_archives = 0; if(backtrack_archives > MAX_ARCHIVE_BACKTRACKS) backtrack_archives = MAX_ARCHIVE_BACKTRACKS; } /* we found the standard timeperiod argument */ else if(!strcmp(variables[x], "timeperiod")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(!strcmp(variables[x], "today")) timeperiod_type = TIMEPERIOD_TODAY; else if(!strcmp(variables[x], "yesterday")) timeperiod_type = TIMEPERIOD_YESTERDAY; else if(!strcmp(variables[x], "thisweek")) timeperiod_type = TIMEPERIOD_THISWEEK; else if(!strcmp(variables[x], "lastweek")) timeperiod_type = TIMEPERIOD_LASTWEEK; else if(!strcmp(variables[x], "thismonth")) timeperiod_type = TIMEPERIOD_THISMONTH; else if(!strcmp(variables[x], "lastmonth")) timeperiod_type = TIMEPERIOD_LASTMONTH; else if(!strcmp(variables[x], "thisquarter")) timeperiod_type = TIMEPERIOD_THISQUARTER; else if(!strcmp(variables[x], "lastquarter")) timeperiod_type = TIMEPERIOD_LASTQUARTER; else if(!strcmp(variables[x], "thisyear")) timeperiod_type = TIMEPERIOD_THISYEAR; else if(!strcmp(variables[x], "lastyear")) timeperiod_type = TIMEPERIOD_LASTYEAR; else if(!strcmp(variables[x], "last24hours")) timeperiod_type = TIMEPERIOD_LAST24HOURS; else if(!strcmp(variables[x], "last7days")) timeperiod_type = TIMEPERIOD_LAST7DAYS; else if(!strcmp(variables[x], "last31days")) timeperiod_type = TIMEPERIOD_LAST31DAYS; else if(!strcmp(variables[x], "custom")) timeperiod_type = TIMEPERIOD_CUSTOM; else timeperiod_type = TIMEPERIOD_TODAY; if(timeperiod_type != TIMEPERIOD_CUSTOM) convert_timeperiod_to_times(timeperiod_type); } /* we found time argument */ else if(!strcmp(variables[x], "smon")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(timeperiod_type != TIMEPERIOD_CUSTOM) continue; start_month = atoi(variables[x]); timeperiod_type = TIMEPERIOD_CUSTOM; compute_time_from_parts = TRUE; } /* we found time argument */ else if(!strcmp(variables[x], "sday")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(timeperiod_type != TIMEPERIOD_CUSTOM) continue; start_day = atoi(variables[x]); timeperiod_type = TIMEPERIOD_CUSTOM; compute_time_from_parts = TRUE; } /* we found time argument */ else if(!strcmp(variables[x], "syear")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(timeperiod_type != TIMEPERIOD_CUSTOM) continue; start_year = atoi(variables[x]); timeperiod_type = TIMEPERIOD_CUSTOM; compute_time_from_parts = TRUE; } /* we found time argument */ else if(!strcmp(variables[x], "smin")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(timeperiod_type != TIMEPERIOD_CUSTOM) continue; start_minute = atoi(variables[x]); timeperiod_type = TIMEPERIOD_CUSTOM; compute_time_from_parts = TRUE; } /* we found time argument */ else if(!strcmp(variables[x], "ssec")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(timeperiod_type != TIMEPERIOD_CUSTOM) continue; start_second = atoi(variables[x]); timeperiod_type = TIMEPERIOD_CUSTOM; compute_time_from_parts = TRUE; } /* we found time argument */ else if(!strcmp(variables[x], "shour")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(timeperiod_type != TIMEPERIOD_CUSTOM) continue; start_hour = atoi(variables[x]); timeperiod_type = TIMEPERIOD_CUSTOM; compute_time_from_parts = TRUE; } /* we found time argument */ else if(!strcmp(variables[x], "emon")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(timeperiod_type != TIMEPERIOD_CUSTOM) continue; end_month = atoi(variables[x]); timeperiod_type = TIMEPERIOD_CUSTOM; compute_time_from_parts = TRUE; } /* we found time argument */ else if(!strcmp(variables[x], "eday")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(timeperiod_type != TIMEPERIOD_CUSTOM) continue; end_day = atoi(variables[x]); timeperiod_type = TIMEPERIOD_CUSTOM; compute_time_from_parts = TRUE; } /* we found time argument */ else if(!strcmp(variables[x], "eyear")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(timeperiod_type != TIMEPERIOD_CUSTOM) continue; end_year = atoi(variables[x]); timeperiod_type = TIMEPERIOD_CUSTOM; compute_time_from_parts = TRUE; } /* we found time argument */ else if(!strcmp(variables[x], "emin")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(timeperiod_type != TIMEPERIOD_CUSTOM) continue; end_minute = atoi(variables[x]); timeperiod_type = TIMEPERIOD_CUSTOM; compute_time_from_parts = TRUE; } /* we found time argument */ else if(!strcmp(variables[x], "esec")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(timeperiod_type != TIMEPERIOD_CUSTOM) continue; end_second = atoi(variables[x]); timeperiod_type = TIMEPERIOD_CUSTOM; compute_time_from_parts = TRUE; } /* we found time argument */ else if(!strcmp(variables[x], "ehour")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(timeperiod_type != TIMEPERIOD_CUSTOM) continue; end_hour = atoi(variables[x]); timeperiod_type = TIMEPERIOD_CUSTOM; compute_time_from_parts = TRUE; } /* we found the embed option */ else if(!strcmp(variables[x], "embedded")) embedded = TRUE; /* we found the noheader option */ else if(!strcmp(variables[x], "noheader")) display_header = FALSE; /* we found the input option */ else if(!strcmp(variables[x], "input")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(!strcmp(variables[x], "gethost")) input_type = GET_INPUT_HOST_TARGET; else if(!strcmp(variables[x], "getservice")) input_type = GET_INPUT_SERVICE_TARGET; else if(!strcmp(variables[x], "getoptions")) input_type = GET_INPUT_OPTIONS; else input_type = GET_INPUT_TARGET_TYPE; } /* we found the graph states option */ else if(!strcmp(variables[x], "graphevents")) { x++; if(variables[x] == NULL) { error = TRUE; break; } graph_events = atoi(variables[x]); } /* we found the graph state types option */ else if(!strcmp(variables[x], "graphstatetypes")) { x++; if(variables[x] == NULL) { error = TRUE; break; } graph_statetypes = atoi(variables[x]); } /* we found the breakdown option */ else if(!strcmp(variables[x], "breakdown")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(!strcmp(variables[x], "monthly")) breakdown_type = BREAKDOWN_MONTHLY; else if(!strcmp(variables[x], "dayofmonth")) breakdown_type = BREAKDOWN_DAY_OF_MONTH; else if(!strcmp(variables[x], "dayofweek")) breakdown_type = BREAKDOWN_DAY_OF_WEEK; else breakdown_type = BREAKDOWN_HOURLY; } /* we found the assume state retention option */ else if(!strcmp(variables[x], "assumestateretention")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(!strcmp(variables[x], "yes")) assume_state_retention = TRUE; else assume_state_retention = FALSE; } /* we found the initial states logged option */ else if(!strcmp(variables[x], "initialstateslogged")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(!strcmp(variables[x], "yes")) initial_states_logged = TRUE; else initial_states_logged = FALSE; } /* we found the new states only option */ else if(!strcmp(variables[x], "newstatesonly")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(!strcmp(variables[x], "yes")) new_states_only = TRUE; else new_states_only = FALSE; } } /* free memory allocated to the CGI variables */ free_cgivars(variables); return error; } /* graphs histogram data */ void graph_all_histogram_data(void) { int pixel_x; int pixel_y; int last_pixel_y; int current_bucket; int actual_bucket; unsigned long max_value; double x_scaling_factor; double y_scaling_factor; double x_units; double y_units; int current_unit; int actual_unit; char temp_buffer[MAX_INPUT_BUFFER]; int string_width; int string_height; char *days[7] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}; char *months[12] = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"}; char start_time[MAX_INPUT_BUFFER]; char end_time[MAX_INPUT_BUFFER]; unsigned long state1_max = 0L; unsigned long state1_min = 0L; int have_state1_min = FALSE; unsigned long state1_sum = 0L; double state1_avg = 0.0; unsigned long state2_max = 0L; unsigned long state2_min = 0L; int have_state2_min = FALSE; unsigned long state2_sum = 0L; double state2_avg = 0.0; unsigned long state3_max = 0L; unsigned long state3_min = 0L; int have_state3_min = FALSE; unsigned long state3_sum = 0L; double state3_avg = 0.0; unsigned long state4_max = 0L; unsigned long state4_min = 0L; int have_state4_min = FALSE; unsigned long state4_sum = 0L; double state4_avg = 0.0; #ifdef DEBUG printf("Total Buckets: %d\n", total_buckets); #endif /* determine max value in the buckets (for scaling) */ max_value = 0L; for(current_bucket = 0; current_bucket < total_buckets; current_bucket++) { if(tsdata[current_bucket].service_ok > max_value) max_value = tsdata[current_bucket].service_ok; if(tsdata[current_bucket].service_warning > max_value) max_value = tsdata[current_bucket].service_warning; if(tsdata[current_bucket].service_unknown > max_value) max_value = tsdata[current_bucket].service_unknown; if(tsdata[current_bucket].service_critical > max_value) max_value = tsdata[current_bucket].service_critical; if(tsdata[current_bucket].host_up > max_value) max_value = tsdata[current_bucket].host_up; if(tsdata[current_bucket].host_down > max_value) max_value = tsdata[current_bucket].host_down; if(tsdata[current_bucket].host_unreachable > max_value) max_value = tsdata[current_bucket].host_unreachable; } #ifdef DEBUG printf("Done determining max bucket values\n"); printf("MAX_VALUE=%lu\n", max_value); printf("DRAWING_HEIGHT=%lu\n", DRAWING_HEIGHT); #endif /* min number of values to graph */ if(max_value < 10) max_value = 10; #ifdef DEBUG printf("ADJUSTED MAX_VALUE=%lu\n", max_value); #endif /* determine y scaling factor */ /*y_scaling_factor=floor((double)DRAWING_HEIGHT/(double)max_value);*/ y_scaling_factor = (double)((double)DRAWING_HEIGHT / (double)max_value); /* determine x scaling factor */ x_scaling_factor = (double)((double)DRAWING_WIDTH / (double)total_buckets); /* determine y units resolution - we want a max of about 10 y grid lines */ /* y_units=(double)((double)DRAWING_HEIGHT/19.0); y_units=ceil(y_units/y_scaling_factor)*y_scaling_factor; */ y_units = ceil(19.0 / y_scaling_factor); /* determine x units resolution */ if(breakdown_type == BREAKDOWN_HOURLY) x_units = (double)((double)DRAWING_WIDTH / (double)(total_buckets / 4.0)); else x_units = x_scaling_factor; #ifdef DEBUG printf("DRAWING_WIDTH: %d\n", DRAWING_WIDTH); printf("DRAWING_HEIGHT: %d\n", DRAWING_HEIGHT); printf("max_value: %lu\n", max_value); printf("x_scaling_factor: %.3f\n", x_scaling_factor); printf("y_scaling_factor: %.3f\n", y_scaling_factor); printf("x_units: %.3f\n", x_units); printf("y_units: %.3f\n", y_units); printf("y units to draw: %.3f\n", ((double)max_value / y_units)); #endif string_height = gdFontSmall->h; #ifdef DEBUG printf("Starting to draw Y grid lines...\n"); #endif /* draw y grid lines */ if(max_value > 0) { for(current_unit = 1; (current_unit * y_units * y_scaling_factor) <= DRAWING_HEIGHT; current_unit++) { draw_dashed_line(DRAWING_X_OFFSET, DRAWING_Y_OFFSET - (current_unit * y_units * y_scaling_factor), DRAWING_X_OFFSET + DRAWING_WIDTH, DRAWING_Y_OFFSET - (current_unit * y_units * y_scaling_factor), color_lightgray); #ifdef DEBUG printf(" Drawing Y unit #%d @ %d\n", current_unit, (int)(current_unit * y_units * y_scaling_factor)); #endif } } #ifdef DEBUG printf("Starting to draw X grid lines...\n"); #endif /* draw x grid lines */ for(current_unit = 1; (int)(current_unit * x_units) <= DRAWING_WIDTH; current_unit++) draw_dashed_line(DRAWING_X_OFFSET + (int)(current_unit * x_units), DRAWING_Y_OFFSET, DRAWING_X_OFFSET + (int)(current_unit * x_units), DRAWING_Y_OFFSET - DRAWING_HEIGHT, color_lightgray); #ifdef DEBUG printf("Starting to draw grid units...\n"); #endif /* draw y units */ if(max_value > 0) { for(current_unit = 0; (current_unit * y_units * y_scaling_factor) <= DRAWING_HEIGHT; current_unit++) { snprintf(temp_buffer, sizeof(temp_buffer) - 1, "%d", (int)(current_unit * y_units)); temp_buffer[sizeof(temp_buffer) - 1] = '\x0'; string_width = gdFontSmall->w * strlen(temp_buffer); gdImageString(histogram_image, gdFontSmall, DRAWING_X_OFFSET - string_width - 5, DRAWING_Y_OFFSET - (current_unit * y_units * y_scaling_factor) - (string_height / 2), (unsigned char *)temp_buffer, color_black); } } /* draw x units */ for(current_unit = 0, actual_unit = 0; (int)(current_unit * x_units) <= DRAWING_WIDTH; current_unit++, actual_unit++) { if(actual_unit >= total_buckets) actual_unit = 0; if(breakdown_type == BREAKDOWN_MONTHLY) snprintf(temp_buffer, sizeof(temp_buffer) - 1, "%s", months[actual_unit]); else if(breakdown_type == BREAKDOWN_DAY_OF_MONTH) snprintf(temp_buffer, sizeof(temp_buffer) - 1, "%d", actual_unit + 1); else if(breakdown_type == BREAKDOWN_DAY_OF_WEEK) snprintf(temp_buffer, sizeof(temp_buffer) - 1, "%s", days[actual_unit]); else snprintf(temp_buffer, sizeof(temp_buffer) - 1, "%02d:00", (actual_unit == 24) ? 0 : actual_unit); temp_buffer[sizeof(temp_buffer) - 1] = '\x0'; string_width = gdFontSmall->w * strlen(temp_buffer); gdImageStringUp(histogram_image, gdFontSmall, DRAWING_X_OFFSET + (current_unit * x_units) - (string_height / 2), DRAWING_Y_OFFSET + 5 + string_width, (unsigned char *)temp_buffer, color_black); } /* draw y unit measure */ snprintf(temp_buffer, sizeof(temp_buffer) - 1, "Number of Events"); temp_buffer[sizeof(temp_buffer) - 1] = '\x0'; string_width = gdFontSmall->w * strlen(temp_buffer); gdImageStringUp(histogram_image, gdFontSmall, 0, DRAWING_Y_OFFSET - (DRAWING_HEIGHT / 2) + (string_width / 2), (unsigned char *)temp_buffer, color_black); /* draw x unit measure */ if(breakdown_type == BREAKDOWN_MONTHLY) snprintf(temp_buffer, sizeof(temp_buffer) - 1, "Month"); else if(breakdown_type == BREAKDOWN_DAY_OF_MONTH) snprintf(temp_buffer, sizeof(temp_buffer) - 1, "Day of the Month"); else if(breakdown_type == BREAKDOWN_DAY_OF_WEEK) snprintf(temp_buffer, sizeof(temp_buffer) - 1, "Day of the Week"); else snprintf(temp_buffer, sizeof(temp_buffer) - 1, "Hour of the Day (15 minute increments)"); temp_buffer[sizeof(temp_buffer) - 1] = '\x0'; string_width = gdFontSmall->w * strlen(temp_buffer); gdImageString(histogram_image, gdFontSmall, DRAWING_X_OFFSET + (DRAWING_WIDTH / 2) - (string_width / 2), DRAWING_Y_OFFSET + 70, (unsigned char *)temp_buffer, color_black); /* draw title */ snprintf(start_time, sizeof(start_time) - 1, "%s", ctime(&t1)); start_time[sizeof(start_time) - 1] = '\x0'; start_time[strlen(start_time) - 1] = '\x0'; snprintf(end_time, sizeof(end_time) - 1, "%s", ctime(&t2)); end_time[sizeof(end_time) - 1] = '\x0'; end_time[strlen(end_time) - 1] = '\x0'; if(display_type == DISPLAY_HOST_HISTOGRAM) snprintf(temp_buffer, sizeof(temp_buffer) - 1, "Event History For Host '%s'", host_name); else snprintf(temp_buffer, sizeof(temp_buffer) - 1, "Event History For Service '%s' On Host '%s'", svc_description, host_name); temp_buffer[sizeof(temp_buffer) - 1] = '\x0'; string_width = gdFontSmall->w * strlen(temp_buffer); gdImageString(histogram_image, gdFontSmall, DRAWING_X_OFFSET + (DRAWING_WIDTH / 2) - (string_width / 2), 0, (unsigned char *)temp_buffer, color_black); snprintf(temp_buffer, sizeof(temp_buffer) - 1, "%s to %s", start_time, end_time); temp_buffer[sizeof(temp_buffer) - 1] = '\x0'; string_width = gdFontSmall->w * strlen(temp_buffer); gdImageString(histogram_image, gdFontSmall, DRAWING_X_OFFSET + (DRAWING_WIDTH / 2) - (string_width / 2), string_height + 5, (unsigned char *)temp_buffer, color_black); #ifdef DEBUG printf("About to starting graphing (total_buckets=%d)...\n", total_buckets); #endif /* graph service states */ if(display_type == DISPLAY_HOST_HISTOGRAM) { /* graph host recoveries */ if(graph_events & GRAPH_HOST_UP) { last_pixel_y = 0; for(current_bucket = 0, actual_bucket = 0; current_bucket <= total_buckets; current_bucket++, actual_bucket++) { if(actual_bucket >= total_buckets) actual_bucket = 0; pixel_x = (int)(current_bucket * x_scaling_factor); pixel_y = (int)(tsdata[actual_bucket].host_up * y_scaling_factor); if(current_bucket > 0 && !(last_pixel_y == 0 && pixel_y == 0)) draw_line(DRAWING_X_OFFSET + pixel_x - (int)x_scaling_factor, DRAWING_Y_OFFSET - last_pixel_y, DRAWING_X_OFFSET + pixel_x, DRAWING_Y_OFFSET - pixel_y, color_green); last_pixel_y = pixel_y; if(current_bucket < total_buckets) { if(have_state1_min == FALSE || tsdata[actual_bucket].host_up < state1_min) { state1_min = tsdata[actual_bucket].host_up; have_state1_min = TRUE; } if(state1_max == 0 || tsdata[actual_bucket].host_up > state1_max) state1_max = tsdata[actual_bucket].host_up; state1_sum += tsdata[actual_bucket].host_up; } } } #ifdef DEBUG printf("Done graphing HOST UP states...\n"); #endif /* graph host down states */ if(graph_events & GRAPH_HOST_DOWN) { last_pixel_y = 0; for(current_bucket = 0, actual_bucket = 0; current_bucket <= total_buckets; current_bucket++, actual_bucket++) { if(actual_bucket >= total_buckets) actual_bucket = 0; pixel_x = (int)(current_bucket * x_scaling_factor); pixel_y = (int)(tsdata[actual_bucket].host_down * y_scaling_factor); if(current_bucket > 0 && !(last_pixel_y == 0 && pixel_y == 0)) draw_line(DRAWING_X_OFFSET + pixel_x - (int)x_scaling_factor, DRAWING_Y_OFFSET - last_pixel_y, DRAWING_X_OFFSET + pixel_x, DRAWING_Y_OFFSET - pixel_y, color_red); last_pixel_y = pixel_y; if(current_bucket < total_buckets) { if(have_state2_min == FALSE || tsdata[actual_bucket].host_down < state2_min) { state2_min = tsdata[actual_bucket].host_down; have_state2_min = TRUE; } if(state2_max == 0 || tsdata[actual_bucket].host_down > state2_max) state2_max = tsdata[actual_bucket].host_down; state2_sum += tsdata[actual_bucket].host_down; } } } #ifdef DEBUG printf("Done graphing HOST DOWN states...\n"); #endif /* graph host unreachable states */ if(graph_events & GRAPH_HOST_UNREACHABLE) { last_pixel_y = 0; for(current_bucket = 0, actual_bucket = 0; current_bucket <= total_buckets; current_bucket++, actual_bucket++) { if(actual_bucket >= total_buckets) actual_bucket = 0; pixel_x = (int)(current_bucket * x_scaling_factor); pixel_y = (int)(tsdata[actual_bucket].host_unreachable * y_scaling_factor); if(current_bucket > 0 && !(last_pixel_y == 0 && pixel_y == 0)) draw_line(DRAWING_X_OFFSET + pixel_x - (int)x_scaling_factor, DRAWING_Y_OFFSET - last_pixel_y, DRAWING_X_OFFSET + pixel_x, DRAWING_Y_OFFSET - pixel_y, color_darkred); last_pixel_y = pixel_y; if(current_bucket < total_buckets) { if(have_state3_min == FALSE || tsdata[actual_bucket].host_unreachable < state3_min) { state3_min = tsdata[actual_bucket].host_unreachable; have_state3_min = TRUE; } if(state3_max == 0 || tsdata[actual_bucket].host_unreachable > state3_max) state3_max = tsdata[actual_bucket].host_unreachable; state3_sum += tsdata[actual_bucket].host_unreachable; } } } #ifdef DEBUG printf("Done graphing HOST UNREACHABLE states...\n"); #endif } /* graph service states */ else { /* graph service recoveries */ if(graph_events & GRAPH_SERVICE_OK) { last_pixel_y = 0; for(current_bucket = 0, actual_bucket = 0; current_bucket <= total_buckets; current_bucket++, actual_bucket++) { if(actual_bucket >= total_buckets) actual_bucket = 0; pixel_x = (int)(current_bucket * x_scaling_factor); pixel_y = (int)(tsdata[actual_bucket].service_ok * y_scaling_factor); if(current_bucket > 0 && !(last_pixel_y == 0 && pixel_y == 0)) draw_line(DRAWING_X_OFFSET + pixel_x - (int)x_scaling_factor, DRAWING_Y_OFFSET - last_pixel_y, DRAWING_X_OFFSET + pixel_x, DRAWING_Y_OFFSET - pixel_y, color_green); last_pixel_y = pixel_y; if(current_bucket < total_buckets) { if(have_state1_min == FALSE || tsdata[actual_bucket].service_ok < state1_min) { state1_min = tsdata[actual_bucket].service_ok; have_state1_min = TRUE; } if(state1_max == 0 || tsdata[actual_bucket].service_ok > state1_max) state1_max = tsdata[actual_bucket].service_ok; state1_sum += tsdata[actual_bucket].service_ok; } } } /* graph service warning states */ if(graph_events & GRAPH_SERVICE_WARNING) { last_pixel_y = 0; for(current_bucket = 0, actual_bucket = 0; current_bucket <= total_buckets; current_bucket++, actual_bucket++) { if(actual_bucket >= total_buckets) actual_bucket = 0; pixel_x = (int)(current_bucket * x_scaling_factor); pixel_y = (int)(tsdata[actual_bucket].service_warning * y_scaling_factor); if(current_bucket > 0 && !(last_pixel_y == 0 && pixel_y == 0)) draw_line(DRAWING_X_OFFSET + pixel_x - (int)x_scaling_factor, DRAWING_Y_OFFSET - last_pixel_y, DRAWING_X_OFFSET + pixel_x, DRAWING_Y_OFFSET - pixel_y, color_yellow); last_pixel_y = pixel_y; if(current_bucket < total_buckets) { if(have_state2_min == FALSE || tsdata[actual_bucket].service_warning < state2_min) { state2_min = tsdata[actual_bucket].service_warning; have_state2_min = TRUE; } if(state2_max == 0 || tsdata[actual_bucket].service_warning > state2_max) state2_max = tsdata[actual_bucket].service_warning; state2_sum += tsdata[actual_bucket].service_warning; } } } /* graph service unknown states */ if(graph_events & GRAPH_SERVICE_UNKNOWN) { last_pixel_y = 0; for(current_bucket = 0, actual_bucket = 0; current_bucket <= total_buckets; current_bucket++, actual_bucket++) { if(actual_bucket >= total_buckets) actual_bucket = 0; pixel_x = (int)(current_bucket * x_scaling_factor); pixel_y = (int)(tsdata[actual_bucket].service_unknown * y_scaling_factor); if(current_bucket > 0 && !(last_pixel_y == 0 && pixel_y == 0)) draw_line(DRAWING_X_OFFSET + pixel_x - (int)x_scaling_factor, DRAWING_Y_OFFSET - last_pixel_y, DRAWING_X_OFFSET + pixel_x, DRAWING_Y_OFFSET - pixel_y, color_orange); last_pixel_y = pixel_y; if(current_bucket < total_buckets) { if(have_state3_min == FALSE || tsdata[actual_bucket].service_unknown < state3_min) { state3_min = tsdata[actual_bucket].service_unknown; have_state3_min = TRUE; } if(state3_max == 0 || tsdata[actual_bucket].service_unknown > state3_max) state3_max = tsdata[actual_bucket].service_unknown; state3_sum += tsdata[actual_bucket].service_unknown; } } } /* graph service critical states */ if(graph_events & GRAPH_SERVICE_CRITICAL) { last_pixel_y = 0; for(current_bucket = 0, actual_bucket = 0; current_bucket <= total_buckets; current_bucket++, actual_bucket++) { if(actual_bucket >= total_buckets) actual_bucket = 0; pixel_x = (int)(current_bucket * x_scaling_factor); pixel_y = (int)(tsdata[actual_bucket].service_critical * y_scaling_factor); if(current_bucket > 0 && !(last_pixel_y == 0 && pixel_y == 0)) draw_line(DRAWING_X_OFFSET + pixel_x - (int)x_scaling_factor, DRAWING_Y_OFFSET - last_pixel_y, DRAWING_X_OFFSET + pixel_x, DRAWING_Y_OFFSET - pixel_y, color_red); last_pixel_y = pixel_y; if(current_bucket < total_buckets) { if(have_state4_min == FALSE || tsdata[actual_bucket].service_critical < state4_min) { state4_min = tsdata[actual_bucket].service_critical; have_state4_min = TRUE; } if(state4_max == 0 || tsdata[actual_bucket].service_critical > state4_max) state4_max = tsdata[actual_bucket].service_critical; state4_sum += tsdata[actual_bucket].service_critical; } } } } #ifdef DEBUG printf("Done graphing states...\n"); #endif /* draw graph boundaries */ draw_line(DRAWING_X_OFFSET, DRAWING_Y_OFFSET, DRAWING_X_OFFSET, DRAWING_Y_OFFSET - DRAWING_HEIGHT, color_black); draw_line(DRAWING_X_OFFSET + DRAWING_WIDTH, DRAWING_Y_OFFSET, DRAWING_X_OFFSET + DRAWING_WIDTH, DRAWING_Y_OFFSET - DRAWING_HEIGHT, color_black); draw_line(DRAWING_X_OFFSET, DRAWING_Y_OFFSET, DRAWING_X_OFFSET + DRAWING_WIDTH, DRAWING_Y_OFFSET, color_black); /* graph stats */ snprintf(temp_buffer, sizeof(temp_buffer) - 1, "EVENT TYPE"); temp_buffer[sizeof(temp_buffer) - 1] = '\x0'; string_width = gdFontSmall->w * strlen(temp_buffer); gdImageString(histogram_image, gdFontSmall, DRAWING_X_OFFSET + DRAWING_WIDTH + 15, DRAWING_Y_OFFSET - DRAWING_HEIGHT, (unsigned char *)temp_buffer, color_black); snprintf(temp_buffer, sizeof(temp_buffer) - 1, " MIN MAX SUM AVG"); temp_buffer[sizeof(temp_buffer) - 1] = '\x0'; string_width = gdFontSmall->w * strlen(temp_buffer); gdImageString(histogram_image, gdFontSmall, DRAWING_X_OFFSET + DRAWING_WIDTH + 115, DRAWING_Y_OFFSET - DRAWING_HEIGHT, (unsigned char *)temp_buffer, color_black); draw_line(DRAWING_X_OFFSET + DRAWING_WIDTH + 15, DRAWING_Y_OFFSET - DRAWING_HEIGHT + string_height + 2, DRAWING_X_OFFSET + DRAWING_WIDTH + 275, DRAWING_Y_OFFSET - DRAWING_HEIGHT + string_height + 2, color_black); snprintf(temp_buffer, sizeof(temp_buffer) - 1, "Recovery (%s):", (display_type == DISPLAY_SERVICE_HISTOGRAM) ? "Ok" : "Up"); temp_buffer[sizeof(temp_buffer) - 1] = '\x0'; string_width = gdFontSmall->w * strlen(temp_buffer); gdImageString(histogram_image, gdFontSmall, DRAWING_X_OFFSET + DRAWING_WIDTH + 15, DRAWING_Y_OFFSET - DRAWING_HEIGHT + ((string_height + 5) * 1), (unsigned char *)temp_buffer, color_green); state1_avg = (double)((double)state1_sum / (double)total_buckets); snprintf(temp_buffer, sizeof(temp_buffer) - 1, "%5lu %5lu %5lu %.2f", state1_min, state1_max, state1_sum, state1_avg); temp_buffer[sizeof(temp_buffer) - 1] = '\x0'; string_width = gdFontSmall->w * strlen(temp_buffer); gdImageString(histogram_image, gdFontSmall, DRAWING_X_OFFSET + DRAWING_WIDTH + 115, DRAWING_Y_OFFSET - DRAWING_HEIGHT + ((string_height + 5) * 1), (unsigned char *)temp_buffer, color_black); snprintf(temp_buffer, sizeof(temp_buffer) - 1, "%s:", (display_type == DISPLAY_SERVICE_HISTOGRAM) ? "Warning" : "Down"); temp_buffer[sizeof(temp_buffer) - 1] = '\x0'; string_width = gdFontSmall->w * strlen(temp_buffer); gdImageString(histogram_image, gdFontSmall, DRAWING_X_OFFSET + DRAWING_WIDTH + 15, DRAWING_Y_OFFSET - DRAWING_HEIGHT + ((string_height + 5) * 2), (unsigned char *)temp_buffer, (display_type == DISPLAY_SERVICE_HISTOGRAM) ? color_yellow : color_red); state2_avg = (double)((double)state2_sum / (double)total_buckets); snprintf(temp_buffer, sizeof(temp_buffer) - 1, "%5lu %5lu %5lu %.2f", state2_min, state2_max, state2_sum, state2_avg); temp_buffer[sizeof(temp_buffer) - 1] = '\x0'; string_width = gdFontSmall->w * strlen(temp_buffer); gdImageString(histogram_image, gdFontSmall, DRAWING_X_OFFSET + DRAWING_WIDTH + 115, DRAWING_Y_OFFSET - DRAWING_HEIGHT + ((string_height + 5) * 2), (unsigned char *)temp_buffer, color_black); snprintf(temp_buffer, sizeof(temp_buffer) - 1, "%s:", (display_type == DISPLAY_SERVICE_HISTOGRAM) ? "Unknown" : "Unreachable"); temp_buffer[sizeof(temp_buffer) - 1] = '\x0'; string_width = gdFontSmall->w * strlen(temp_buffer); gdImageString(histogram_image, gdFontSmall, DRAWING_X_OFFSET + DRAWING_WIDTH + 15, DRAWING_Y_OFFSET - DRAWING_HEIGHT + ((string_height + 5) * 3), (unsigned char *)temp_buffer, (display_type == DISPLAY_SERVICE_HISTOGRAM) ? color_orange : color_darkred); state3_avg = (double)((double)state3_sum / (double)total_buckets); snprintf(temp_buffer, sizeof(temp_buffer) - 1, "%5lu %5lu %5lu %.2f", state3_min, state3_max, state3_sum, state3_avg); temp_buffer[sizeof(temp_buffer) - 1] = '\x0'; string_width = gdFontSmall->w * strlen(temp_buffer); gdImageString(histogram_image, gdFontSmall, DRAWING_X_OFFSET + DRAWING_WIDTH + 115, DRAWING_Y_OFFSET - DRAWING_HEIGHT + ((string_height + 5) * 3), (unsigned char *)temp_buffer, color_black); if(display_type == DISPLAY_SERVICE_HISTOGRAM) { snprintf(temp_buffer, sizeof(temp_buffer) - 1, "Critical:"); temp_buffer[sizeof(temp_buffer) - 1] = '\x0'; string_width = gdFontSmall->w * strlen(temp_buffer); gdImageString(histogram_image, gdFontSmall, DRAWING_X_OFFSET + DRAWING_WIDTH + 15, DRAWING_Y_OFFSET - DRAWING_HEIGHT + ((string_height + 5) * 4), (unsigned char *)temp_buffer, color_red); state4_avg = (double)((double)state4_sum / (double)total_buckets); snprintf(temp_buffer, sizeof(temp_buffer) - 1, "%5lu %5lu %5lu %.2f", state4_min, state4_max, state4_sum, state4_avg); temp_buffer[sizeof(temp_buffer) - 1] = '\x0'; string_width = gdFontSmall->w * strlen(temp_buffer); gdImageString(histogram_image, gdFontSmall, DRAWING_X_OFFSET + DRAWING_WIDTH + 115, DRAWING_Y_OFFSET - DRAWING_HEIGHT + ((string_height + 5) * 4), (unsigned char *)temp_buffer, color_black); } return; } /* adds an archived state entry */ void add_archived_state(int state_type, time_t time_stamp) { struct tm *our_time; int bucket; int skip_state = FALSE; #ifdef DEBUG2 printf("NEW ENTRY: last=%d this=%d\n", last_state, state_type); #endif /* don't record program starts/stops, just make a note that one occurred */ if(state_type == AS_PROGRAM_START || state_type == AS_PROGRAM_END) { #ifdef DEBUG2 printf("Recording a program start: %d\n", state_type); #endif program_restart_has_occurred = TRUE; return; } /* see if we should even take into account this event */ if(program_restart_has_occurred == TRUE) { #ifdef DEBUG2 printf("program_restart_has_occurred: last=%d this=%d\n", last_state, state_type); #endif if(initial_states_logged == TRUE) { if(state_type == AS_SVC_OK && last_state == AS_SVC_OK) skip_state = TRUE; if(state_type == AS_HOST_UP && last_state == AS_HOST_UP) skip_state = TRUE; } if(assume_state_retention == TRUE && initial_states_logged == TRUE) { if(state_type == AS_SVC_WARNING && last_state == AS_SVC_WARNING) skip_state = TRUE; if(state_type == AS_SVC_UNKNOWN && last_state == AS_SVC_UNKNOWN) skip_state = TRUE; if(state_type == AS_SVC_CRITICAL && last_state == AS_SVC_CRITICAL) skip_state = TRUE; if(state_type == AS_HOST_DOWN && last_state == AS_HOST_DOWN) skip_state = TRUE; if(state_type == AS_HOST_UNREACHABLE && last_state == AS_HOST_UNREACHABLE) skip_state = TRUE; } if(skip_state == TRUE) { program_restart_has_occurred = FALSE; #ifdef DEBUG2 printf("Skipping state...\n"); #endif return; } } /* reset program restart variable */ program_restart_has_occurred = FALSE; /* are we only processing new states */ if(new_states_only == TRUE && state_type == last_state) { #ifdef DEBUG2 printf("Skipping state (not a new state)...\n"); #endif return; } #ifdef DEBUG2 printf("GOODSTATE: %d @ %lu\n", state_type, (unsigned long)time_stamp); #endif our_time = localtime(&time_stamp); /* calculate the correct bucket to dump the data into */ if(breakdown_type == BREAKDOWN_MONTHLY) bucket = our_time->tm_mon; else if(breakdown_type == BREAKDOWN_DAY_OF_MONTH) bucket = our_time->tm_mday - 1; else if(breakdown_type == BREAKDOWN_DAY_OF_WEEK) bucket = our_time->tm_wday; else bucket = (our_time->tm_hour * 4) + (our_time->tm_min / 15); #ifdef DEBUG2 printf("\tBucket=%d\n", bucket); #endif /* save the data in the correct bucket */ if(state_type == AS_SVC_OK) tsdata[bucket].service_ok++; else if(state_type == AS_SVC_UNKNOWN) tsdata[bucket].service_unknown++; else if(state_type == AS_SVC_WARNING) tsdata[bucket].service_warning++; else if(state_type == AS_SVC_CRITICAL) tsdata[bucket].service_critical++; else if(state_type == AS_HOST_UP) tsdata[bucket].host_up++; else if(state_type == AS_HOST_DOWN) tsdata[bucket].host_down++; else if(state_type == AS_HOST_UNREACHABLE) tsdata[bucket].host_unreachable++; /* record last state type */ last_state = state_type; return; } /* reads log files for archived state data */ void read_archived_state_data(void) { char filename[MAX_FILENAME_LENGTH]; int newest_archive = 0; int oldest_archive = 0; int current_archive; #ifdef DEBUG2 printf("Determining archives to use...\n"); #endif /* determine earliest archive to use */ oldest_archive = determine_archive_to_use_from_time(t1); if(log_rotation_method != LOG_ROTATION_NONE) oldest_archive += backtrack_archives; /* determine most recent archive to use */ newest_archive = determine_archive_to_use_from_time(t2); if(oldest_archive < newest_archive) oldest_archive = newest_archive; #ifdef DEBUG2 printf("Oldest archive: %d\n", oldest_archive); printf("Newest archive: %d\n", newest_archive); #endif /* read in all the necessary archived logs */ for(current_archive = newest_archive; current_archive <= oldest_archive; current_archive++) { /* get the name of the log file that contains this archive */ get_log_archive_to_use(current_archive, filename, sizeof(filename) - 1); #ifdef DEBUG2 printf("\tCurrent archive: %d (%s)\n", current_archive, filename); #endif /* scan the log file for archived state data */ scan_log_file_for_archived_state_data(filename); } return; } /* grabs archives state data from a log file */ void scan_log_file_for_archived_state_data(char *filename) { char *input = NULL; char *input2 = NULL; char entry_host_name[MAX_INPUT_BUFFER]; char entry_svc_description[MAX_INPUT_BUFFER]; char *temp_buffer; time_t time_stamp; mmapfile *thefile; /* print something so browser doesn't time out */ if(mode == CREATE_HTML) { printf(" "); fflush(NULL); } if((thefile = mmap_fopen(filename)) == NULL) { #ifdef DEBUG2 printf("Could not open file '%s' for reading.\n", filename); #endif return; } #ifdef DEBUG2 printf("Scanning log file '%s' for archived state data...\n", filename); #endif while(1) { /* free memory */ free(input); free(input2); input = NULL; input2 = NULL; /* read the next line */ if((input = mmap_fgets(thefile)) == NULL) break; strip(input); if((input2 = strdup(input)) == NULL) continue; temp_buffer = my_strtok(input2, "]"); time_stamp = (temp_buffer == NULL) ? (time_t)0 : (time_t)strtoul(temp_buffer + 1, NULL, 10); /* program starts/restarts */ if(strstr(input, " starting...")) add_archived_state(AS_PROGRAM_START, time_stamp); if(strstr(input, " restarting...")) add_archived_state(AS_PROGRAM_START, time_stamp); /* program stops */ if(strstr(input, " shutting down...")) add_archived_state(AS_PROGRAM_END, time_stamp); if(strstr(input, "Bailing out")) add_archived_state(AS_PROGRAM_END, time_stamp); if(display_type == DISPLAY_HOST_HISTOGRAM) { if(strstr(input, "HOST ALERT:")) { /* get host name */ temp_buffer = my_strtok(NULL, ":"); temp_buffer = my_strtok(NULL, ";"); strncpy(entry_host_name, (temp_buffer == NULL) ? "" : temp_buffer + 1, sizeof(entry_host_name)); entry_host_name[sizeof(entry_host_name) - 1] = '\x0'; if(strcmp(host_name, entry_host_name)) continue; /* skip soft states if necessary */ if(!(graph_statetypes & GRAPH_SOFT_STATETYPES) && strstr(input, ";SOFT;")) continue; /* skip hard states if necessary */ if(!(graph_statetypes & GRAPH_HARD_STATETYPES) && strstr(input, ";HARD;")) continue; if(strstr(input, ";DOWN;")) add_archived_state(AS_HOST_DOWN, time_stamp); else if(strstr(input, ";UNREACHABLE;")) add_archived_state(AS_HOST_UNREACHABLE, time_stamp); else if(strstr(input, ";RECOVERY") || strstr(input, ";UP;")) add_archived_state(AS_HOST_UP, time_stamp); } } if(display_type == DISPLAY_SERVICE_HISTOGRAM) { if(strstr(input, "SERVICE ALERT:")) { /* get host name */ temp_buffer = my_strtok(NULL, ":"); temp_buffer = my_strtok(NULL, ";"); strncpy(entry_host_name, (temp_buffer == NULL) ? "" : temp_buffer + 1, sizeof(entry_host_name)); entry_host_name[sizeof(entry_host_name) - 1] = '\x0'; if(strcmp(host_name, entry_host_name)) continue; /* get service description */ temp_buffer = my_strtok(NULL, ";"); strncpy(entry_svc_description, (temp_buffer == NULL) ? "" : temp_buffer, sizeof(entry_svc_description)); entry_svc_description[sizeof(entry_svc_description) - 1] = '\x0'; if(strcmp(svc_description, entry_svc_description)) continue; /* skip soft states if necessary */ if(!(graph_statetypes & GRAPH_SOFT_STATETYPES) && strstr(input, ";SOFT;")) continue; /* skip hard states if necessary */ if(!(graph_statetypes & GRAPH_HARD_STATETYPES) && strstr(input, ";HARD;")) continue; if(strstr(input, ";CRITICAL;")) add_archived_state(AS_SVC_CRITICAL, time_stamp); else if(strstr(input, ";WARNING;")) add_archived_state(AS_SVC_WARNING, time_stamp); else if(strstr(input, ";UNKNOWN;")) add_archived_state(AS_SVC_UNKNOWN, time_stamp); else if(strstr(input, ";RECOVERY;") || strstr(input, ";OK;")) add_archived_state(AS_SVC_OK, time_stamp); } } } /* free memory and close the file */ free(input); free(input2); mmap_fclose(thefile); return; } void convert_timeperiod_to_times(int type) { time_t current_time; struct tm *t; /* get the current time */ time(¤t_time); t = localtime(¤t_time); t->tm_sec = 0; t->tm_min = 0; t->tm_hour = 0; t->tm_isdst = -1; switch(type) { case TIMEPERIOD_LAST24HOURS: t1 = current_time - (60 * 60 * 24); t2 = current_time; break; case TIMEPERIOD_TODAY: t1 = mktime(t); t2 = current_time; break; case TIMEPERIOD_YESTERDAY: t1 = (time_t)(mktime(t) - (60 * 60 * 24)); t2 = (time_t)mktime(t); break; case TIMEPERIOD_THISWEEK: t1 = (time_t)(mktime(t) - (60 * 60 * 24 * t->tm_wday)); t2 = current_time; break; case TIMEPERIOD_LASTWEEK: t1 = (time_t)(mktime(t) - (60 * 60 * 24 * t->tm_wday) - (60 * 60 * 24 * 7)); t2 = (time_t)(mktime(t) - (60 * 60 * 24 * t->tm_wday)); break; case TIMEPERIOD_THISMONTH: t->tm_mday = 1; t1 = mktime(t); t2 = current_time; break; case TIMEPERIOD_LASTMONTH: t->tm_mday = 1; t2 = mktime(t); if(t->tm_mon == 0) { t->tm_mon = 11; t->tm_year--; } else t->tm_mon--; t1 = mktime(t); break; case TIMEPERIOD_THISQUARTER: break; case TIMEPERIOD_LASTQUARTER: break; case TIMEPERIOD_THISYEAR: t->tm_mon = 0; t->tm_mday = 1; t1 = mktime(t); t2 = current_time; break; case TIMEPERIOD_LASTYEAR: t->tm_mon = 0; t->tm_mday = 1; t2 = mktime(t); t->tm_year--; t1 = mktime(t); break; case TIMEPERIOD_LAST7DAYS: t2 = current_time; t1 = current_time - (7 * 24 * 60 * 60); break; case TIMEPERIOD_LAST31DAYS: t2 = current_time; t1 = current_time - (31 * 24 * 60 * 60); break; default: break; } return; } void compute_report_times(void) { time_t current_time; struct tm *st; struct tm *et; /* get the current time */ time(¤t_time); st = localtime(¤t_time); st->tm_sec = start_second; st->tm_min = start_minute; st->tm_hour = start_hour; st->tm_mday = start_day; st->tm_mon = start_month - 1; st->tm_year = start_year - 1900; st->tm_isdst = -1; t1 = mktime(st); et = localtime(¤t_time); et->tm_sec = end_second; et->tm_min = end_minute; et->tm_hour = end_hour; et->tm_mday = end_day; et->tm_mon = end_month - 1; et->tm_year = end_year - 1900; et->tm_isdst = -1; t2 = mktime(et); } /* draws a solid line */ void draw_line(int x1, int y1, int x2, int y2, int color) { int styleSolid[1]; styleSolid[0] = color; /* sets current style to a solid line */ gdImageSetStyle(histogram_image, styleSolid, 1); /* draws a line (dashed) */ gdImageLine(histogram_image, x1, y1, x2, y2, gdStyled); return; } /* draws a dashed line */ void draw_dashed_line(int x1, int y1, int x2, int y2, int color) { int styleDashed[6]; styleDashed[0] = color; styleDashed[1] = color; styleDashed[2] = gdTransparent; styleDashed[3] = gdTransparent; styleDashed[4] = gdTransparent; styleDashed[5] = gdTransparent; /* sets current style to a solid line */ gdImageSetStyle(histogram_image, styleDashed, 6); /* draws a line (dashed) */ gdImageLine(histogram_image, x1, y1, x2, y2, gdStyled); return; } nagios-4.3.4/cgi/history.c000066400000000000000000000726431314764422400154340ustar00rootroot00000000000000/*********************************************************************** * * HISTORY.C - Nagios History CGI * * * This CGI program will display the history for the specified host. * If no host is specified, the history for all hosts will be displayed. * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ***********************************************************************/ #include "../include/config.h" #include "../include/common.h" #include "../include/objects.h" #include "../include/getcgi.h" #include "../include/cgiutils.h" #include "../include/cgiauth.h" #define DISPLAY_HOSTS 0 #define DISPLAY_SERVICES 1 #define SERVICE_HISTORY 0 #define HOST_HISTORY 1 #define SERVICE_FLAPPING_HISTORY 2 #define HOST_FLAPPING_HISTORY 3 #define SERVICE_DOWNTIME_HISTORY 4 #define HOST_DOWNTIME_HISTORY 5 #define STATE_ALL 0 #define STATE_SOFT 1 #define STATE_HARD 2 void get_history(void); void document_header(int); void document_footer(void); int process_cgivars(void); extern char main_config_file[MAX_FILENAME_LENGTH]; extern char url_html_path[MAX_FILENAME_LENGTH]; extern char url_images_path[MAX_FILENAME_LENGTH]; extern char url_stylesheets_path[MAX_FILENAME_LENGTH]; extern int enable_splunk_integration; authdata current_authdata; char log_file_to_use[MAX_FILENAME_LENGTH]; int log_archive = 0; int show_all_hosts = TRUE; char *host_name = "all"; char *svc_description = ""; int display_type = DISPLAY_HOSTS; int use_lifo = TRUE; int history_options = HISTORY_ALL; int state_options = STATE_ALL; int embedded = FALSE; int display_header = TRUE; int display_frills = TRUE; int display_timebreaks = TRUE; int display_system_messages = TRUE; int display_flapping_alerts = TRUE; int display_downtime_alerts = TRUE; int main(void) { char temp_buffer[MAX_INPUT_BUFFER]; char temp_buffer2[MAX_INPUT_BUFFER]; /* get the variables passed to us */ process_cgivars(); /* reset internal CGI variables */ reset_cgi_vars(); cgi_init(document_header, document_footer, READ_ALL_OBJECT_DATA, 0); document_header(TRUE); /* get authentication information */ get_authentication_information(¤t_authdata); /* determine what log file we should be using */ get_log_archive_to_use(log_archive, log_file_to_use, (int)sizeof(log_file_to_use)); if(display_header == TRUE) { /* begin top table */ printf("\n"); printf("\n"); /* left column of the first row */ printf("\n"); /* middle column of top row */ printf("\n"); /* right hand column of top row */ printf("\n"); /* end of top table */ printf("\n"); printf("
    \n"); if(display_type == DISPLAY_SERVICES) snprintf(temp_buffer, sizeof(temp_buffer) - 1, "Service Alert History"); else if(show_all_hosts == TRUE) snprintf(temp_buffer, sizeof(temp_buffer) - 1, "Alert History"); else snprintf(temp_buffer, sizeof(temp_buffer) - 1, "Host Alert History"); temp_buffer[sizeof(temp_buffer) - 1] = '\x0'; display_info_table(temp_buffer, FALSE, ¤t_authdata); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("
    \n"); if(display_type == DISPLAY_SERVICES) printf("Service '%s' On Host '%s'", svc_description, host_name); else if(show_all_hosts == TRUE) printf("All Hosts and Services"); else printf("Host '%s'", host_name); printf("
    \n"); printf("
    \n"); snprintf(temp_buffer, sizeof(temp_buffer) - 1, "%s?%shost=%s&type=%d&statetype=%d&", HISTORY_CGI, (use_lifo == FALSE) ? "oldestfirst&" : "", url_encode(host_name), history_options, state_options); temp_buffer[sizeof(temp_buffer) - 1] = '\x0'; if(display_type == DISPLAY_SERVICES) { snprintf(temp_buffer2, sizeof(temp_buffer2) - 1, "service=%s&", url_encode(svc_description)); temp_buffer2[sizeof(temp_buffer2) - 1] = '\x0'; strncat(temp_buffer, temp_buffer2, sizeof(temp_buffer) - strlen(temp_buffer) - 1); temp_buffer[sizeof(temp_buffer) - 1] = '\x0'; } display_nav_table(temp_buffer, log_archive); printf("
    \n"); printf("
    \n", HISTORY_CGI); printf("\n"); printf("\n", (show_all_hosts == TRUE) ? "all" : escape_string(host_name)); if(display_type == DISPLAY_SERVICES) printf("\n", escape_string(svc_description)); printf("\n", log_archive); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n") ; printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("", (display_flapping_alerts == FALSE) ? "checked" : ""); printf("\n"); printf("\n"); printf("", (display_downtime_alerts == FALSE) ? "checked" : ""); printf("\n"); printf("\n"); printf("", (display_system_messages == FALSE) ? "checked" : ""); printf("\n"); printf("\n"); printf("", (use_lifo == FALSE) ? "checked" : ""); printf("\n"); printf("\n"); printf("\n"); printf("\n"); /* display context-sensitive help */ printf("\n"); printf("\n"); printf("\n"); printf("
    State type options:
    History detail level for "); if(display_type == DISPLAY_HOSTS) printf("%s host%s", (show_all_hosts == TRUE) ? "all" : "this", (show_all_hosts == TRUE) ? "s" : ""); else printf("service"); printf(":
    Hide Flapping Alerts
    Hide Downtime Alerts
    Hide Process Messages
    Older Entries First
    \n"); display_context_help(CONTEXTHELP_HISTORY); printf("
    \n"); printf("
    \n"); printf("
    \n"); } /* display history */ get_history(); document_footer(); /* free allocated memory */ free_memory(); return OK; } void document_header(int use_stylesheet) { char date_time[MAX_DATETIME_LENGTH]; time_t current_time; time_t expire_time; printf("Cache-Control: no-store\r\n"); printf("Pragma: no-cache\r\n"); time(¤t_time); get_time_string(¤t_time, date_time, sizeof(date_time), HTTP_DATE_TIME); printf("Last-Modified: %s\r\n", date_time); expire_time = (time_t)0L; get_time_string(&expire_time, date_time, sizeof(date_time), HTTP_DATE_TIME); printf("Expires: %s\r\n", date_time); printf("Content-type: text/html; charset=utf-8\r\n\r\n"); if(embedded == TRUE) return; printf("\n"); printf("\n"); printf("\n", url_images_path); printf("\n"); printf("Nagios History\n"); printf("\n"); if(use_stylesheet == TRUE) { printf("\n", url_stylesheets_path, COMMON_CSS); printf("\n", url_stylesheets_path, HISTORY_CSS); } printf("\n"); printf("\n"); /* include user SSI header */ include_ssi_files(HISTORY_CGI, SSI_HEADER); return; } void document_footer(void) { if(embedded == TRUE) return; /* include user SSI footer */ include_ssi_files(HISTORY_CGI, SSI_FOOTER); printf("\n"); printf("\n"); return; } int process_cgivars(void) { char **variables; int error = FALSE; int x; variables = getcgivars(); for(x = 0; variables[x] != NULL; x++) { /* do some basic length checking on the variable identifier to prevent buffer overflows */ if(strlen(variables[x]) >= MAX_INPUT_BUFFER - 1) continue; /* we found the host argument */ else if(!strcmp(variables[x], "host")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if((host_name = (char *)strdup(variables[x])) == NULL) host_name = ""; strip_html_brackets(host_name); display_type = DISPLAY_HOSTS; if(!strcmp(host_name, "all")) show_all_hosts = TRUE; else show_all_hosts = FALSE; } /* we found the service argument */ else if(!strcmp(variables[x], "service")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if((svc_description = (char *)strdup(variables[x])) == NULL) svc_description = ""; strip_html_brackets(svc_description); display_type = DISPLAY_SERVICES; } /* we found the history type argument */ else if(!strcmp(variables[x], "type")) { x++; if(variables[x] == NULL) { error = TRUE; break; } history_options = atoi(variables[x]); } /* we found the history state type argument */ else if(!strcmp(variables[x], "statetype")) { x++; if(variables[x] == NULL) { error = TRUE; break; } state_options = atoi(variables[x]); } /* we found the log archive argument */ else if(!strcmp(variables[x], "archive")) { x++; if(variables[x] == NULL) { error = TRUE; break; } log_archive = atoi(variables[x]); if(log_archive < 0) log_archive = 0; } /* we found the order argument */ else if(!strcmp(variables[x], "oldestfirst")) { use_lifo = FALSE; } /* we found the embed option */ else if(!strcmp(variables[x], "embedded")) embedded = TRUE; /* we found the noheader option */ else if(!strcmp(variables[x], "noheader")) display_header = FALSE; /* we found the nofrills option */ else if(!strcmp(variables[x], "nofrills")) display_frills = FALSE; /* we found the notimebreaks option */ else if(!strcmp(variables[x], "notimebreaks")) display_timebreaks = FALSE; /* we found the no system messages option */ else if(!strcmp(variables[x], "nosystem")) display_system_messages = FALSE; /* we found the no flapping alerts option */ else if(!strcmp(variables[x], "noflapping")) display_flapping_alerts = FALSE; /* we found the no downtime alerts option */ else if(!strcmp(variables[x], "nodowntime")) display_downtime_alerts = FALSE; } /* free memory allocated to the CGI variables */ free_cgivars(variables); return error; } void get_history(void) { mmapfile *thefile = NULL; char image[MAX_INPUT_BUFFER]; char image_alt[MAX_INPUT_BUFFER]; char *input = NULL; char *input2 = NULL; char match1[MAX_INPUT_BUFFER]; char match2[MAX_INPUT_BUFFER]; int found_line = FALSE; int system_message = FALSE; int display_line = FALSE; time_t t; char date_time[MAX_DATETIME_LENGTH]; char *temp_buffer = NULL; int history_type = SERVICE_HISTORY; int history_detail_type = HISTORY_SERVICE_CRITICAL; char *entry_host_name = NULL; char *entry_service_desc = NULL; host *temp_host = NULL; service *temp_service = NULL; int result = 0; char last_message_date[MAX_INPUT_BUFFER] = ""; char current_message_date[MAX_INPUT_BUFFER] = ""; struct tm *time_ptr = NULL; if(use_lifo == TRUE) { result = read_file_into_lifo(log_file_to_use); if(result != LIFO_OK) { if(result == LIFO_ERROR_MEMORY) { printf("

    Not enough memory to reverse log file - displaying history in natural order...

    \n"); } else if(result == LIFO_ERROR_FILE) { printf("

    Error: Cannot open log file '%s' for reading!


    ", log_file_to_use); return; } use_lifo = FALSE; } } if(use_lifo == FALSE) { if((thefile = mmap_fopen(log_file_to_use)) == NULL) { printf("

    Error: Cannot open log file '%s' for reading!


    ", log_file_to_use); return; } } printf("

    \n"); while(1) { my_free(input); my_free(input2); if(use_lifo == TRUE) { if((input = pop_lifo()) == NULL) break; } else { if((input = mmap_fgets(thefile)) == NULL) break; } strip(input); strcpy(image, ""); strcpy(image_alt, ""); system_message = FALSE; if((input2 = (char *)strdup(input)) == NULL) continue; /* service state alerts */ if(strstr(input, "SERVICE ALERT:")) { history_type = SERVICE_HISTORY; /* get host and service names */ temp_buffer = my_strtok(input2, "]"); temp_buffer = my_strtok(NULL, ":"); temp_buffer = my_strtok(NULL, ";"); if(temp_buffer) entry_host_name = strdup(temp_buffer + 1); else entry_host_name = NULL; temp_buffer = my_strtok(NULL, ";"); if(temp_buffer) entry_service_desc = strdup(temp_buffer); else entry_service_desc = NULL; if(strstr(input, ";CRITICAL;")) { strncpy(image, CRITICAL_ICON, sizeof(image)); strncpy(image_alt, CRITICAL_ICON_ALT, sizeof(image_alt)); history_detail_type = HISTORY_SERVICE_CRITICAL; } else if(strstr(input, ";WARNING;")) { strncpy(image, WARNING_ICON, sizeof(image)); strncpy(image_alt, WARNING_ICON_ALT, sizeof(image_alt)); history_detail_type = HISTORY_SERVICE_WARNING; } else if(strstr(input, ";UNKNOWN;")) { strncpy(image, UNKNOWN_ICON, sizeof(image)); strncpy(image_alt, UNKNOWN_ICON_ALT, sizeof(image_alt)); history_detail_type = HISTORY_SERVICE_UNKNOWN; } else if(strstr(input, ";RECOVERY;") || strstr(input, ";OK;")) { strncpy(image, OK_ICON, sizeof(image)); strncpy(image_alt, OK_ICON_ALT, sizeof(image_alt)); history_detail_type = HISTORY_SERVICE_RECOVERY; } } /* service flapping alerts */ else if(strstr(input, "SERVICE FLAPPING ALERT:")) { if(display_flapping_alerts == FALSE) continue; history_type = SERVICE_FLAPPING_HISTORY; /* get host and service names */ temp_buffer = my_strtok(input2, "]"); temp_buffer = my_strtok(NULL, ":"); temp_buffer = my_strtok(NULL, ";"); if(temp_buffer) entry_host_name = strdup(temp_buffer + 1); else entry_host_name = NULL; temp_buffer = my_strtok(NULL, ";"); if(temp_buffer) entry_service_desc = strdup(temp_buffer); else entry_service_desc = NULL; strncpy(image, FLAPPING_ICON, sizeof(image)); if(strstr(input, ";STARTED;")) strncpy(image_alt, "Service started flapping", sizeof(image_alt)); else if(strstr(input, ";STOPPED;")) strncpy(image_alt, "Service stopped flapping", sizeof(image_alt)); else if(strstr(input, ";DISABLED;")) strncpy(image_alt, "Service flap detection disabled", sizeof(image_alt)); } /* service downtime alerts */ else if(strstr(input, "SERVICE DOWNTIME ALERT:")) { if(display_downtime_alerts == FALSE) continue; history_type = SERVICE_DOWNTIME_HISTORY; /* get host and service names */ temp_buffer = my_strtok(input2, "]"); temp_buffer = my_strtok(NULL, ":"); temp_buffer = my_strtok(NULL, ";"); if(temp_buffer) entry_host_name = strdup(temp_buffer + 1); else entry_host_name = NULL; temp_buffer = my_strtok(NULL, ";"); if(temp_buffer) entry_service_desc = strdup(temp_buffer); else entry_service_desc = NULL; strncpy(image, SCHEDULED_DOWNTIME_ICON, sizeof(image)); if(strstr(input, ";STARTED;")) strncpy(image_alt, "Service entered a period of scheduled downtime", sizeof(image_alt)); else if(strstr(input, ";STOPPED;")) strncpy(image_alt, "Service exited from a period of scheduled downtime", sizeof(image_alt)); else if(strstr(input, ";CANCELLED;")) strncpy(image_alt, "Service scheduled downtime has been cancelled", sizeof(image_alt)); } /* host state alerts */ else if(strstr(input, "HOST ALERT:")) { history_type = HOST_HISTORY; /* get host name */ temp_buffer = my_strtok(input2, "]"); temp_buffer = my_strtok(NULL, ":"); temp_buffer = my_strtok(NULL, ";"); if(temp_buffer) entry_host_name = strdup(temp_buffer + 1); else entry_host_name = NULL; if(strstr(input, ";DOWN;")) { strncpy(image, HOST_DOWN_ICON, sizeof(image)); strncpy(image_alt, HOST_DOWN_ICON_ALT, sizeof(image_alt)); history_detail_type = HISTORY_HOST_DOWN; } else if(strstr(input, ";UNREACHABLE;")) { strncpy(image, HOST_UNREACHABLE_ICON, sizeof(image)); strncpy(image_alt, HOST_UNREACHABLE_ICON_ALT, sizeof(image_alt)); history_detail_type = HISTORY_HOST_UNREACHABLE; } else if(strstr(input, ";RECOVERY") || strstr(input, ";UP;")) { strncpy(image, HOST_UP_ICON, sizeof(image)); strncpy(image_alt, HOST_UP_ICON_ALT, sizeof(image_alt)); history_detail_type = HISTORY_HOST_RECOVERY; } } /* host flapping alerts */ else if(strstr(input, "HOST FLAPPING ALERT:")) { if(display_flapping_alerts == FALSE) continue; history_type = HOST_FLAPPING_HISTORY; /* get host name */ temp_buffer = my_strtok(input2, "]"); temp_buffer = my_strtok(NULL, ":"); temp_buffer = my_strtok(NULL, ";"); if(temp_buffer) entry_host_name = strdup(temp_buffer + 1); else entry_host_name = NULL; strncpy(image, FLAPPING_ICON, sizeof(image)); if(strstr(input, ";STARTED;")) strncpy(image_alt, "Host started flapping", sizeof(image_alt)); else if(strstr(input, ";STOPPED;")) strncpy(image_alt, "Host stopped flapping", sizeof(image_alt)); else if(strstr(input, ";DISABLED;")) strncpy(image_alt, "Host flap detection disabled", sizeof(image_alt)); } /* host downtime alerts */ else if(strstr(input, "HOST DOWNTIME ALERT:")) { if(display_downtime_alerts == FALSE) continue; history_type = HOST_DOWNTIME_HISTORY; /* get host name */ temp_buffer = my_strtok(input2, "]"); temp_buffer = my_strtok(NULL, ":"); temp_buffer = my_strtok(NULL, ";"); if(temp_buffer) entry_host_name = strdup(temp_buffer + 1); else entry_host_name = NULL; strncpy(image, SCHEDULED_DOWNTIME_ICON, sizeof(image)); if(strstr(input, ";STARTED;")) strncpy(image_alt, "Host entered a period of scheduled downtime", sizeof(image_alt)); else if(strstr(input, ";STOPPED;")) strncpy(image_alt, "Host exited from a period of scheduled downtime", sizeof(image_alt)); else if(strstr(input, ";CANCELLED;")) strncpy(image_alt, "Host scheduled downtime has been cancelled", sizeof(image_alt)); } else if(display_system_messages == FALSE) continue; /* program start */ else if(strstr(input, " starting...")) { strncpy(image, START_ICON, sizeof(image)); strncpy(image_alt, START_ICON_ALT, sizeof(image_alt)); system_message = TRUE; } /* normal program termination */ else if(strstr(input, " shutting down...")) { strncpy(image, STOP_ICON, sizeof(image)); strncpy(image_alt, STOP_ICON_ALT, sizeof(image_alt)); system_message = TRUE; } /* abnormal program termination */ else if(strstr(input, "Bailing out")) { strncpy(image, STOP_ICON, sizeof(image)); strncpy(image_alt, STOP_ICON_ALT, sizeof(image_alt)); system_message = TRUE; } /* program restart */ else if(strstr(input, " restarting...")) { strncpy(image, RESTART_ICON, sizeof(image)); strncpy(image_alt, RESTART_ICON_ALT, sizeof(image_alt)); system_message = TRUE; } image[sizeof(image) - 1] = '\x0'; image_alt[sizeof(image_alt) - 1] = '\x0'; /* get the timestamp */ temp_buffer = strtok(input, "]"); t = (temp_buffer == NULL) ? 0L : strtoul(temp_buffer + 1, NULL, 10); time_ptr = localtime(&t); strftime(current_message_date, sizeof(current_message_date), "%B %d, %Y %H:00\n", time_ptr); current_message_date[sizeof(current_message_date) - 1] = '\x0'; get_time_string(&t, date_time, sizeof(date_time), SHORT_DATE_TIME); strip(date_time); temp_buffer = strtok(NULL, "\n"); if(strcmp(image, "")) { display_line = FALSE; if(system_message == TRUE) display_line = TRUE; else if(display_type == DISPLAY_HOSTS) { if(history_type == HOST_HISTORY || history_type == SERVICE_HISTORY) { snprintf(match1, sizeof( match1), " HOST ALERT: %s;", host_name); snprintf(match2, sizeof( match2), " SERVICE ALERT: %s;", host_name); } else if(history_type == HOST_FLAPPING_HISTORY || history_type == SERVICE_FLAPPING_HISTORY) { snprintf(match1, sizeof( match1), " HOST FLAPPING ALERT: %s;", host_name); snprintf(match2, sizeof( match2), " SERVICE FLAPPING ALERT: %s;", host_name); } else if(history_type == HOST_DOWNTIME_HISTORY || history_type == SERVICE_DOWNTIME_HISTORY) { snprintf(match1, sizeof( match1), " HOST DOWNTIME ALERT: %s;", host_name); snprintf(match2, sizeof( match2), " SERVICE DOWNTIME ALERT: %s;", host_name); } if(show_all_hosts == TRUE) display_line = TRUE; else if(strstr(temp_buffer, match1)) display_line = TRUE; else if(strstr(temp_buffer, match2)) display_line = TRUE; if(display_line == TRUE) { if(history_options == HISTORY_ALL) display_line = TRUE; else if(history_options == HISTORY_HOST_ALL && (history_type == HOST_HISTORY || history_type == HOST_FLAPPING_HISTORY || history_type == HOST_DOWNTIME_HISTORY)) display_line = TRUE; else if(history_options == HISTORY_SERVICE_ALL && (history_type == SERVICE_HISTORY || history_type == SERVICE_FLAPPING_HISTORY || history_type == SERVICE_DOWNTIME_HISTORY)) display_line = TRUE; else if((history_type == HOST_HISTORY || history_type == SERVICE_HISTORY) && (history_detail_type & history_options)) display_line = TRUE; else display_line = FALSE; } /* check alert state types */ if(display_line == TRUE && (history_type == HOST_HISTORY || history_type == SERVICE_HISTORY)) { if(state_options == STATE_ALL) display_line = TRUE; else if((state_options & STATE_SOFT) && strstr(temp_buffer, ";SOFT;")) display_line = TRUE; else if((state_options & STATE_HARD) && strstr(temp_buffer, ";HARD;")) display_line = TRUE; else display_line = FALSE; } } else if(display_type == DISPLAY_SERVICES) { if(history_type == SERVICE_HISTORY) snprintf(match1, sizeof( match1), " SERVICE ALERT: %s;%s;", host_name, svc_description); else if(history_type == SERVICE_FLAPPING_HISTORY) snprintf(match1, sizeof( match1), " SERVICE FLAPPING ALERT: %s;%s;", host_name, svc_description); else if(history_type == SERVICE_DOWNTIME_HISTORY) snprintf(match1, sizeof( match1), " SERVICE DOWNTIME ALERT: %s;%s;", host_name, svc_description); if(strstr(temp_buffer, match1) && (history_type == SERVICE_HISTORY || history_type == SERVICE_FLAPPING_HISTORY || history_type == SERVICE_DOWNTIME_HISTORY)) display_line = TRUE; if(display_line == TRUE) { if(history_options == HISTORY_ALL || history_options == HISTORY_SERVICE_ALL) display_line = TRUE; else if(history_options & history_detail_type) display_line = TRUE; else display_line = FALSE; } /* check alert state type */ if(display_line == TRUE && history_type == SERVICE_HISTORY) { if(state_options == STATE_ALL) display_line = TRUE; else if((state_options & STATE_SOFT) && strstr(temp_buffer, ";SOFT;")) display_line = TRUE; else if((state_options & STATE_HARD) && strstr(temp_buffer, ";HARD;")) display_line = TRUE; else display_line = FALSE; } } /* make sure user is authorized to view this host or service information */ if(system_message == FALSE) { if(history_type == HOST_HISTORY || history_type == HOST_FLAPPING_HISTORY || history_type == HOST_DOWNTIME_HISTORY) { temp_host = find_host(entry_host_name); if(is_authorized_for_host(temp_host, ¤t_authdata) == FALSE) display_line = FALSE; } else { temp_service = find_service(entry_host_name, entry_service_desc); if(is_authorized_for_service(temp_service, ¤t_authdata) == FALSE) display_line = FALSE; } } /* display the entry if we should... */ if(display_line == TRUE) { if(strcmp(last_message_date, current_message_date) != 0 && display_timebreaks == TRUE) { printf("

    \n"); printf("
    \n"); printf(""); printf(""); printf("", current_message_date); printf(""); printf("

    %s
    \n"); printf("
    \n"); printf("
    \n"); strncpy(last_message_date, current_message_date, sizeof(last_message_date)); last_message_date[sizeof(last_message_date) - 1] = '\x0'; } if(display_frills == TRUE) printf("%s", url_images_path, image, image_alt, image_alt); printf("[%s] %s", date_time, html_encode(temp_buffer, FALSE)); if(enable_splunk_integration == TRUE) { printf("   "); display_splunk_generic_url(temp_buffer, 2); } printf("
    \n"); found_line = TRUE; } } /* free memory */ free(entry_host_name); entry_host_name = NULL; free(entry_service_desc); entry_service_desc = NULL; } printf("

    \n"); if(found_line == FALSE) { printf("
    \n"); printf("

    No history information was found "); if(display_type == DISPLAY_HOSTS) printf("%s", (show_all_hosts == TRUE) ? "" : "for this host "); else printf("for this service "); printf("in %s log file

    ", (log_archive == 0) ? "the current" : "this archived"); } printf("
    \n"); my_free(input); my_free(input2); if(use_lifo == TRUE) free_lifo_memory(); else mmap_fclose(thefile); return; } nagios-4.3.4/cgi/jsonutils.c000066400000000000000000001164061314764422400157610ustar00rootroot00000000000000/************************************************************************** * * JSONUTILS.C - Utilities for Nagios CGIs for returning JSON-formatted * object data * * Copyright (c) 2013 Nagios Enterprises, LLC * Last Modified: 04-13-2013 * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *************************************************************************/ #include "../include/config.h" #include "../include/common.h" #include "../include/objects.h" #include "../include/statusdata.h" #include "../include/comments.h" #include "../include/cgiutils.h" #include "../include/getcgi.h" #include "../include/cgiauth.h" #include "../include/jsonutils.h" /* Multiplier to increment the buffer in json_escape_string() to avoid frequent repeated reallocations */ #define BUF_REALLOC_MULTIPLIER 16 const char *result_types[] = { "Success", "Unable to Allocate Memory", "Unable to Open File for Reading", "Option Invalid", "Option Missing", "Option Value Missing", "Option Value Invalid", "Option Ignored" }; const string_value_mapping svm_format_options[] = { { "whitespace", JSON_FORMAT_WHITESPACE, "Pad with whitespace to increase readability" }, { "enumerate", JSON_FORMAT_ENUMERATE, "Use textual representations of enumerated values rather than " "raw numeric values" }, { "bitmask", JSON_FORMAT_BITMASK, "Use textual representations of bitmask values rather than " "raw numeric values" }, { "duration", JSON_FORMAT_DURATION, "Use textual representations (xd xh xm xs) of duration values rather " "than raw number of seconds" }, #if 0 { "datetime", JSON_FORMAT_DATETIME, "Format date/time values according to the supplied strftime format " "or '%%Y-%%m-%%d %%H:%%M:%%S' if no format specified" }, { "date", JSON_FORMAT_DATE, "Format dates according to the supplied strftime format or " "default Javascript format (number of ms since the beginning of the " "Unix epoch) if no format specified" }, { "time", JSON_FORMAT_TIME, "Format times according the supplied strftime format or " "'%%H:%%M:%%S' in for format specified" }, #endif { NULL, -1, NULL }, }; const string_value_mapping query_statuses[] = { { "alpha", QUERY_STATUS_ALPHA, "Alpha" }, { "beta", QUERY_STATUS_BETA, "Beta" }, { "released", QUERY_STATUS_RELEASED, "Released" }, { "deprecated", QUERY_STATUS_DEPRECATED, "Deprecated" }, { NULL, -1, NULL }, }; const string_value_mapping svm_host_statuses[] = { #ifdef JSON_NAGIOS_4X { "up", SD_HOST_UP, "HOST_UP" }, { "down", SD_HOST_DOWN, "HOST_DOWN" }, { "unreachable", SD_HOST_UNREACHABLE, "HOST_UNREACHABLE" }, #else { "up", HOST_UP, "HOST_UP" }, { "down", HOST_DOWN, "HOST_DOWN" }, { "unreachable", HOST_UNREACHABLE, "HOST_UNREACHABLE" }, #endif { "pending", HOST_PENDING, "HOST_PENDING" }, { NULL, -1, NULL }, }; /* Hard-coded values used because the HOST_UP/DOWN/UNREACHABLE macros are host status (and include PENDING), not host state */ const string_value_mapping svm_host_states[] = { { "up", 0, "HOST_UP" }, { "down", 1, "HOST_DOWN" }, { "unreachable", 2, "HOST_UNREACHABLE" }, { NULL, -1, NULL }, }; const string_value_mapping svm_service_statuses[] = { { "ok", SERVICE_OK, "SERVICE_OK" }, { "warning", SERVICE_WARNING, "SERVICE_WARNING" }, { "critical", SERVICE_CRITICAL, "SERVICE_CRITICAL" }, { "unknown", SERVICE_UNKNOWN, "SERVICE_UNKNOWN" }, { "pending", SERVICE_PENDING, "SERVICE_PENDING" }, { NULL, -1, NULL }, }; /* Hard-coded values used because the SERVICE_OK/WARNING/CRITICAL/UNKNOWN macros are service status (and include PENDING), not service state */ const string_value_mapping svm_service_states[] = { { "ok", 0, "SERVICE_OK" }, { "warning", 1, "SERVICE_WARNING" }, { "critical", 2, "SERVICE_CRITICAL" }, { "unknown", 3, "SERVICE_UNKNOWN" }, { NULL, -1, NULL }, }; const string_value_mapping svm_check_options[] = { { "force_execution", CHECK_OPTION_FORCE_EXECUTION, "FORCE_EXECUTION" }, { "freshness_check", CHECK_OPTION_FRESHNESS_CHECK, "FRESHNESS_CHECK" }, { "orphan_check", CHECK_OPTION_ORPHAN_CHECK, "ORPHAN_CHECK" }, { NULL, -1, NULL }, }; const string_value_mapping svm_host_check_types[] = { { "active", HOST_CHECK_ACTIVE, "ACTIVE" }, { "passive", HOST_CHECK_PASSIVE, "PASSIVE" }, { NULL, -1, NULL }, }; const string_value_mapping svm_service_check_types[] = { { "active", SERVICE_CHECK_ACTIVE, "ACTIVE" }, { "passive", SERVICE_CHECK_PASSIVE, "PASSIVE" }, { NULL, -1, NULL }, }; const string_value_mapping svm_state_types[] = { { "soft", SOFT_STATE, "SOFT" }, { "hard", HARD_STATE, "HARD" }, { NULL, -1, NULL }, }; const string_value_mapping svm_acknowledgement_types[] = { { "none", ACKNOWLEDGEMENT_NONE, "NONE" }, { "normal", ACKNOWLEDGEMENT_NORMAL, "NORMAL" }, { "sticky", ACKNOWLEDGEMENT_STICKY, "STICKY" }, { NULL, -1, NULL }, }; const string_value_mapping svm_comment_types[] = { { "host", HOST_COMMENT, "Host Comment" }, { "service", SERVICE_COMMENT, "Service Comment" }, { NULL, -1, NULL }, }; const string_value_mapping svm_comment_entry_types[] = { { "user", USER_COMMENT, "User Comment" }, { "downtime", DOWNTIME_COMMENT, "Downtime Comment" }, { "flapping", FLAPPING_COMMENT, "Flapping Comment" }, { "acknowledgement", ACKNOWLEDGEMENT_COMMENT, "Acknowledgement Comment" }, { NULL, -1, NULL }, }; const string_value_mapping svm_downtime_types[] = { { "service", SERVICE_DOWNTIME, "Service Downtime" }, { "host", HOST_DOWNTIME, "Host Downtime" }, { "any", ANY_DOWNTIME, "Any Downtime" }, { NULL, -1, NULL }, }; #ifdef JSON_NAGIOS_4X const string_value_mapping svm_option_types[] = { { "up", OPT_UP, "Up" }, { "down", OPT_DOWN, "Down" }, { "unreachable", OPT_UNREACHABLE, "Unreachable" }, { "ok", OPT_OK, "OK" }, { "unknown", OPT_UNKNOWN, "Unknown" }, { "warning", OPT_WARNING, "Warning" }, { "critical", OPT_CRITICAL, "Critical" }, { "recovery", OPT_RECOVERY, "Recovery" }, { "pending", OPT_PENDING, "Pending" }, { "flapping", OPT_FLAPPING, "Flapping" }, { "downtime", OPT_DOWNTIME, "Downtime" }, { NULL, -1, NULL }, }; #endif const string_value_mapping parent_host_extras[] = { { "none", 0, "Hosts that are directly reachable by the Nagios Core host" }, { NULL, -1, NULL }, }; const string_value_mapping child_host_extras[] = { { "none", 0, "Hosts that have no child hosts" }, { NULL, -1, NULL }, }; const string_value_mapping parent_service_extras[] = { { "none", 0, "Services that have no parent services" }, { NULL, -1, NULL }, }; const string_value_mapping child_service_extras[] = { { "none", 0, "Services that have no child services" }, { NULL, -1, NULL }, }; const char *dayofweek[7] = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" }; const char *month[12] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }; static const json_escape_pair string_escape_pairs[] = { { L"\\", L"\\\\" }, { L"\x01", L"\\u0001" }, { L"\x02", L"\\u0002" }, { L"\x03", L"\\u0003" }, { L"\x04", L"\\u0004" }, { L"\x05", L"\\u0004" }, { L"\x06", L"\\u0006" }, { L"\a", L"\\a" }, { L"\b", L"\\b" }, { L"\t", L"\\t" }, { L"\n", L"\\n" }, { L"\v", L"\\v" }, { L"\f", L"\\f" }, { L"\r", L"\\r" }, { L"\x0e", L"\\u000e" }, { L"\x0f", L"\\u000f" }, { L"\x10", L"\\u0010" }, { L"\x11", L"\\u0011" }, { L"\x12", L"\\u0012" }, { L"\x13", L"\\u0013" }, { L"\x14", L"\\u0014" }, { L"\x15", L"\\u0015" }, { L"\x16", L"\\u0016" }, { L"\x17", L"\\u0017" }, { L"\x18", L"\\u0018" }, { L"\x19", L"\\u0019" }, { L"\x1a", L"\\u001a" }, { L"\x1b", L"\\u001b" }, { L"\x1c", L"\\u001c" }, { L"\x1d", L"\\u001d" }, { L"\x1e", L"\\u001e" }, { L"\x1f", L"\\u001f" }, { L"\"", L"\\\"" }, }; static const json_escape string_escapes = { (sizeof(string_escape_pairs) / sizeof(string_escape_pairs[0])), string_escape_pairs }; const json_escape_pair percent_escape_pairs[] = { { L"%", L"%%" }, }; const json_escape percent_escapes = { (sizeof(percent_escape_pairs) / sizeof(percent_escape_pairs[0])), percent_escape_pairs }; extern char main_config_file[MAX_FILENAME_LENGTH]; extern time_t program_start; static json_object_member * json_object_add_member(json_object *); json_object *json_new_object(void) { json_object *new; new = calloc(1, sizeof(json_object)); return new; } void json_free_object(json_object *obj, int free_children) { int x; json_object_member **mpp; if(1 == free_children) { for(x = 0, mpp = obj->members; x < obj->member_count; x++, mpp++) { json_free_member(*mpp, free_children); } } free(obj->members); free(obj); } json_array *json_new_array(void) { return (json_array *)json_new_object(); } void json_free_member(json_object_member *mp, int free_children) { if(NULL != mp->key) free(mp->key); switch(mp->type) { case JSON_TYPE_OBJECT: case JSON_TYPE_ARRAY: if(NULL != mp->value.object) { json_free_object(mp->value.object, free_children); } break; case JSON_TYPE_STRING: if(NULL != mp->value.string) { free(mp->value.string); } break; case JSON_TYPE_INTEGER: case JSON_TYPE_REAL: case JSON_TYPE_TIME_T: case JSON_TYPE_BOOLEAN: break; default: break; } free(mp); } /* Adds a member to a JSON object and returns a pointer to the new member. Returns NULL on failure. */ static json_object_member * json_object_add_member(json_object *obj) { if(0 == obj->member_count) { obj->members = calloc(1, sizeof(json_object_member *)); if(NULL == obj->members) { obj->member_count = 0; return NULL; } } else { obj->members = realloc(obj->members, ((obj->member_count + 1) * sizeof(json_object_member *))); if(NULL == obj->members) { obj->member_count = 0; return NULL; } } obj->members[ obj->member_count] = calloc(1, sizeof(json_object_member)); if(NULL == obj->members[ obj->member_count]) { return NULL; } obj->member_count++; return obj->members[ obj->member_count - 1]; } void json_object_append_object(json_object *obj, char *key, json_object *value) { json_object_member *mp; if(NULL == obj) return; if(NULL == value) return; if((mp = json_object_add_member(obj)) == NULL) { return; } mp->type = JSON_TYPE_OBJECT; if(NULL != key) { mp->key = strdup(key); if(NULL == mp->key) { obj->member_count--; return; } } mp->value.object = value; } void json_array_append_object(json_object *obj, json_object *value) { json_object_append_object(obj, NULL, value); } void json_object_append_array(json_object *obj, char *key, json_array *value) { json_object_member *mp; if(NULL == obj) return; if(NULL == value) return; if((mp = json_object_add_member(obj)) == NULL) { return; } mp->type = JSON_TYPE_ARRAY; if(NULL != key) { mp->key = strdup(key); if(NULL == mp->key) { obj->member_count--; return; } } mp->value.object = value; } void json_array_append_array(json_array *obj, json_array *value) { json_object_append_array((json_object *)obj, NULL, value); } void json_object_append_integer(json_object *obj, char *key, int value) { json_object_member *mp; if(NULL == obj) return; if((mp = json_object_add_member(obj)) == NULL) { return; } mp->type = JSON_TYPE_INTEGER; if(NULL != key) { mp->key = strdup(key); if(NULL == mp->key) { obj->member_count--; return; } } mp->value.integer = value; } void json_array_append_integer(json_object *obj, int value) { json_object_append_integer(obj, NULL, value); } void json_object_append_real(json_object *obj, char *key, double value) { json_object_member *mp; if(NULL == obj) return; if((mp = json_object_add_member(obj)) == NULL) { return; } mp->type = JSON_TYPE_REAL; if(NULL != key) { mp->key = strdup(key); if(NULL == mp->key) { obj->member_count--; return; } } mp->value.real = value; } void json_array_append_real(json_array *obj, double value) { json_object_append_real(obj, NULL, value); } void json_object_append_time(json_object *obj, char *key, unsigned long value) { unsigned hours; unsigned minutes; unsigned seconds; hours = (unsigned)(value / 3600); value -= hours * 3600; minutes = (unsigned)(value / 60); value -= minutes * 60; seconds = value; json_object_append_string(obj, key, NULL, "%02u:%02u:%02u", hours, minutes, seconds); } void json_array_append_time(json_array *obj, unsigned long value) { json_object_append_time(obj, NULL, value); } void json_object_append_time_t(json_object *obj, char *key, time_t value) { json_object_member *mp; if(NULL == obj) return; if((mp = json_object_add_member(obj)) == NULL) { return; } mp->type = JSON_TYPE_TIME_T; if(NULL != key) { mp->key = strdup(key); if(NULL == mp->key) { obj->member_count--; return; } } mp->value.time = value; } void json_set_time_t(json_object_member *mp, time_t value) { if(NULL == mp) return; mp->value.time = value; } void json_object_append_string(json_object *obj, char *key, const json_escape *format_escapes, char *format, ...) { json_object_member *mp; va_list a_list; int result; char *escaped_format; char *buf; if(NULL == obj) return; if((mp = json_object_add_member(obj)) == NULL) { return; } mp->type = JSON_TYPE_STRING; if(NULL != key) { mp->key = strdup(key); if(NULL == mp->key) { obj->member_count--; return; } } if((NULL != format_escapes) && (NULL != format)) { escaped_format = json_escape_string(format, format_escapes); } else { escaped_format = format; } if(NULL != escaped_format) { va_start(a_list, format); result = vasprintf(&buf, escaped_format, a_list); va_end(a_list); if(result >= 0) { mp->value.string = buf; } } if((NULL != format_escapes) && (NULL != escaped_format)) { /* free only if format_escapes were passed and the escaping succeeded */ free(escaped_format); } } void json_array_append_string(json_object *obj, const json_escape *format_escapes, char *format, ...) { va_list a_list; int result; char *buf; va_start( a_list, format); result = vasprintf(&buf, format, a_list); va_end( a_list); if(result >= 0) { json_object_append_string(obj, NULL, format_escapes, buf); } } void json_object_append_boolean(json_object *obj, char *key, int value) { json_object_member *mp; if(NULL == obj) return; if((mp = json_object_add_member(obj)) == NULL) { return; } mp->type = JSON_TYPE_BOOLEAN; if(NULL != key) { mp->key = strdup(key); if(NULL == mp->key) { obj->member_count--; return; } } mp->value.boolean = value; } void json_array_append_boolean(json_object *obj, int value) { json_object_append_boolean(obj, NULL, value); } void json_object_append_duration(json_object *obj, char *key, unsigned long value) { json_object_member *mp; if(NULL == obj) return; if((mp = json_object_add_member(obj)) == NULL) { return; } mp->type = JSON_TYPE_DURATION; if(NULL != key) { mp->key = strdup(key); if(NULL == mp->key) { obj->member_count--; return; } } mp->value.unsigned_integer = value; } void json_array_append_duration(json_object *obj, unsigned long value) { json_object_append_duration(obj, NULL, value); } /* Fetch an object member based on the path. The path is a dot-separated list of nodes. Nodes may be either a key or a zero-based array index. For example to return the query_time key in the result object, the path would be "result.query_time". To find the 2nd host host in the list of hosts for a hostlist query, the path would be "data.hostlist.1" */ json_object_member *json_get_object_member(json_object *root, char *path) { char *dot; char node[1024]; int x; json_object_member **mpp; /* Parse the path to get the first node */ dot = strchr(path, '.'); if(NULL == dot) { /* single node path */ strcpy(node, path); } else { strncpy(node, path, (dot - path)); node[dot - path] = '\0'; } /* Loop over the members of the passed root looking for the node name */ for(x = 0, mpp = root->members; x < root->member_count; x++, mpp++) { if(!strcmp((*mpp)->key, node)) { if(NULL == dot) { /* return this node */ return *mpp; } else { switch((*mpp)->type) { case JSON_TYPE_OBJECT: return json_get_object_member((*mpp)->value.object, dot + 1); break; case JSON_TYPE_ARRAY: return json_get_array_member((*mpp)->value.object, dot + 1); break; default: /* It should never happen that we want the child of a childless node */ return NULL; break; } } } } return NULL; } json_object_member *json_get_array_member(json_object *root, char *path) { char *dot; char node[1024]; int index; json_object_member *mp; /* Parse the path to get the first node */ dot = strchr(path, '.'); if(NULL == dot) { /* single node path */ strcpy(node, path); } else { strncpy(node, path, (dot - path)); node[dot - path] = '\0'; } index = (int)strtol(node, NULL, 10); /* Verify that we have a reasonable index */ if(index < 0 || index >= root->member_count) { return NULL; } /* Find the requested member and deal with it appropriately */ mp = root->members[ index]; if(NULL == dot) { /* return this node */ return mp; } else { switch(mp->type) { case JSON_TYPE_OBJECT: return json_get_object_member(mp->value.object, dot + 1); break; case JSON_TYPE_ARRAY: return json_get_array_member(mp->value.object, dot + 1); break; default: /* It should never happen that we want the child of a childless node */ return NULL; break; } } return NULL; } void json_object_print(json_object *obj, int padding, int whitespace, char *strftime_format, unsigned format_options) { int x; json_object_member **mpp; //indentf(padding, whitespace, "{%s", (whitespace ? "\n" : "")); printf( "{%s", (whitespace ? "\n" : "")); padding++; for(x = 0, mpp = obj->members; x < obj->member_count; x++, mpp++) { json_member_print(*mpp, padding, whitespace, strftime_format, format_options); if(x != obj->member_count - 1) printf(","); if(whitespace) printf("\n"); } padding--; indentf(padding, whitespace, "}"); } void json_array_print(json_array *obj, int padding, int whitespace, char *strftime_format, unsigned format_options) { int x; json_object_member **mpp; printf( "[%s", (whitespace ? "\n" : "")); padding++; for(x = 0, mpp = obj->members; x < obj->member_count; x++, mpp++) { json_member_print(*mpp, padding, whitespace, strftime_format, format_options); if(x != obj->member_count - 1) printf(","); if(whitespace) printf("\n"); } padding--; indentf(padding, whitespace, "]"); } void json_member_print(json_object_member *mp, int padding, int whitespace, char *strftime_format, unsigned format_options) { char *buf = NULL; switch(mp->type) { case JSON_TYPE_OBJECT: if(NULL != mp->key) { buf = json_escape_string(mp->key, &string_escapes); indentf(padding, whitespace, "\"%s\": ", buf); if(NULL != buf) free(buf); } else { indentf(padding, whitespace, ""); } json_object_print(mp->value.object, padding, whitespace, strftime_format, format_options); break; case JSON_TYPE_ARRAY: if(NULL != mp->key) { buf = json_escape_string(mp->key, &string_escapes); indentf(padding, whitespace, "\"%s\": ", buf); if(NULL != buf) free(buf); } else { indentf(padding, whitespace, ""); } json_array_print(mp->value.object, padding, whitespace, strftime_format, format_options); break; case JSON_TYPE_INTEGER: json_int(padding, whitespace, mp->key, mp->value.integer); break; case JSON_TYPE_REAL: json_float(padding, whitespace, mp->key, mp->value.real); break; case JSON_TYPE_TIME_T: json_time_t(padding, whitespace, mp->key, mp->value.time, strftime_format); break; case JSON_TYPE_STRING: json_string(padding, whitespace, mp->key, mp->value.string); break; case JSON_TYPE_BOOLEAN: json_boolean(padding, whitespace, mp->key, mp->value.boolean); break; case JSON_TYPE_DURATION: json_duration(padding, whitespace, mp->key, mp->value.unsigned_integer, format_options & JSON_FORMAT_DURATION); break; default: break; } } void indentf(int padding, int whitespace, char *format, ...) { va_list a_list; int padvar; if( whitespace > 0) { for(padvar = 0; padvar < padding; padvar++) printf( " "); } va_start( a_list, format); vprintf(format, a_list); va_end( a_list); } json_object * json_result(time_t query_time, char *cgi, char *query, int query_status, time_t last_data_update, authdata *authinfo, int type, char *message, ...) { json_object *json_result; va_list a_list; char *buf; json_result = json_new_object(); json_object_append_time_t(json_result, "query_time", query_time); json_object_append_string(json_result, "cgi", &percent_escapes, cgi); if(NULL != authinfo) { json_object_append_string(json_result, "user", &percent_escapes, authinfo->username); } if(NULL != query) { json_object_append_string(json_result, "query", &percent_escapes, query); json_object_append_string(json_result, "query_status", &percent_escapes, svm_get_string_from_value(query_status, query_statuses)); } json_object_append_time_t(json_result, "program_start", program_start); if(last_data_update != (time_t)-1) { json_object_append_time_t(json_result, "last_data_update", last_data_update); } json_object_append_integer(json_result, "type_code", type); json_object_append_string(json_result, "type_text", &percent_escapes, (char *)result_types[ type]); va_start( a_list, message); if(vasprintf(&buf, message, a_list) == -1) { buf = NULL; } va_end( a_list); json_object_append_string(json_result, "message", &percent_escapes, buf); if(NULL != buf) free(buf); return json_result; } json_object *json_help(option_help *help) { json_object *json_data = json_new_object(); json_object *json_options = json_new_object(); json_object *json_option; json_array *json_required; json_array *json_optional; json_object *json_validvalues; json_object *json_validvalue; int x; char ** stpp; string_value_mapping *svmp; while(NULL != help->name) { json_option = json_new_object(); json_object_append_string(json_option, "label", &percent_escapes, (char *)help->label); json_object_append_string(json_option, "type", &percent_escapes, (char *)help->type); json_required = json_new_array(); for(x = 0, stpp = (char **)help->required; (( x < sizeof( help->required) / sizeof( help->required[ 0])) && ( NULL != *stpp)); x++, stpp++) { json_array_append_string(json_required, &percent_escapes, *stpp); } json_object_append_array(json_option, "required", json_required); json_optional = json_new_array(); for(x = 0, stpp = (char **)help->optional; (( x < sizeof( help->optional) / sizeof( help->optional[ 0])) && ( NULL != *stpp)); x++, stpp++) { json_array_append_string(json_optional, &percent_escapes, *stpp); } json_object_append_array(json_option, "optional", json_optional); json_object_append_string(json_option, "depends_on", &percent_escapes, (char *)help->depends_on); json_object_append_string(json_option, "description", &percent_escapes, (char *)help->description); if( NULL != help->valid_values) { json_validvalues = json_new_object(); for(svmp = (string_value_mapping *)help->valid_values; NULL != svmp->string; svmp++) { if( NULL != svmp->description) { json_validvalue = json_new_object(); json_object_append_string(json_validvalue, "description", &percent_escapes, svmp->description); json_object_append_object(json_validvalues, svmp->string, json_validvalue); } else { json_array_append_string(json_validvalues, &percent_escapes, svmp->string); } } json_object_append_object(json_option, "valid_values", json_validvalues); } json_object_append_object(json_options, (char *)help->name, json_option); help++; } json_object_append_object(json_data, "options", json_options); return json_data; } int passes_start_and_count_limits(int start, int max, int current, int counted) { int result = FALSE; if(start > 0) { /* The user requested we start at a specific index */ if(current >= start) { if(max > 0) { /* The user requested a limit on the number of items returned */ if(counted < max) { result = TRUE; } } else { /* The user did not request a limit on the number of items returned */ result = TRUE; } } } else { /* The user did not request we start at a specific index */ if(max > 0) { /* The user requested a limit on the number of items returned */ if(counted < max) { result = TRUE; } } else { /* The user did not request a limit on the number of items returned */ result = TRUE; } } return result; } void json_string(int padding, int whitespace, char *key, char *value) { char *keybuf = NULL; char *valbuf = NULL; valbuf = json_escape_string(value, &string_escapes); if( NULL == key) { indentf(padding, whitespace, "\"%s\"", (( NULL == valbuf) ? "" : valbuf)); } else { keybuf = json_escape_string(key, &string_escapes); indentf(padding, whitespace, "\"%s\":%s\"%s\"", keybuf, (( whitespace> 0) ? " " : ""), (( NULL == valbuf) ? "" : valbuf)); } if(NULL != keybuf) free(keybuf); if(NULL != valbuf) free(valbuf); } void json_boolean(int padding, int whitespace, char *key, int value) { char *keybuf = NULL; if( NULL == key) { indentf(padding, whitespace, "%s", (( 0 == value) ? "false" : "true")); } else { keybuf = json_escape_string(key, &string_escapes); indentf(padding, whitespace, "\"%s\":%s%s", keybuf, (( whitespace > 0) ? " " : ""), (( 0 == value) ? "false" : "true")); } if(NULL != keybuf) free(keybuf); } void json_int(int padding, int whitespace, char *key, int value) { char *keybuf = NULL; if( NULL == key) { indentf(padding, whitespace, "%d", value); } else { keybuf = json_escape_string(key, &string_escapes); indentf(padding, whitespace, "\"%s\":%s%d", keybuf, (( whitespace > 0) ? " " : ""), value); } if(NULL != keybuf) free(keybuf); } void json_unsigned(int padding, int whitespace, char *key, unsigned long long value) { char *keybuf = NULL; if( NULL == key) { indentf(padding, whitespace, "%llu", value); } else { keybuf = json_escape_string(key, &string_escapes); indentf(padding, whitespace, "\"%s\":%s%llu", keybuf, (( whitespace > 0) ? " " : ""), value); } if(NULL != keybuf) free(keybuf); } void json_float(int padding, int whitespace, char *key, double value) { char *keybuf = NULL; if( NULL == key) { indentf(padding, whitespace, "%.2f", value); } else { keybuf = json_escape_string(key, &string_escapes); indentf(padding, whitespace, "\"%s\":%s%.2f", keybuf, (( whitespace > 0) ? " " : ""), value); } if(NULL != keybuf) free(keybuf); } void json_time(int padding, int whitespace, char *key, unsigned long value) { char *keybuf = NULL; unsigned hours; unsigned minutes; unsigned seconds; hours = (unsigned)(value / 3600); value -= hours * 3600; minutes = (unsigned)(value / 60); value -= minutes * 60; seconds = value; if( NULL == key) { indentf(padding, whitespace, "\"%02u:%02u:%02u\"", hours, minutes, seconds); } else { keybuf = json_escape_string(key, &string_escapes); indentf(padding, whitespace, "\"%s\":%s\"%02u:%02u:%02u\"", keybuf, (( whitespace > 0) ? " " : ""), hours, minutes, seconds); } if(NULL != keybuf) free(keybuf); } void json_time_t(int padding, int whitespace, char *key, time_t value, char *format) { char *keybuf = NULL; char buf[1024]; struct tm *tmp_tm; if(NULL == format) { snprintf(buf, sizeof(buf)-1, "%llu%s", (unsigned long long)value, ((unsigned long long)value > 0 ? "000" : "")); } else { tmp_tm = localtime(&value); buf[ 0] = '"'; strftime(buf+1, sizeof(buf)-3, format, tmp_tm); strcat(buf, "\""); } if(NULL == key) { indentf(padding, whitespace, "%s", buf); } else { keybuf = json_escape_string(key, &string_escapes); indentf(padding, whitespace, "\"%s\":%s%s", keybuf, (( whitespace > 0) ? " " : ""), buf); } if(NULL != keybuf) free(keybuf); } void json_duration(int padding, int whitespace, char *key, unsigned long value, int format_duration) { char *keybuf = NULL; char buf[1024]; int days = 0; int hours = 0; int minutes = 0; int seconds = 0; if(0 == format_duration) { snprintf(buf, sizeof(buf)-1, "%lu", (unsigned long)value); } else { days = (unsigned)(value / 86400); value -= days * 86400; hours = (unsigned)(value / 3600); value -= hours * 3600; minutes = (unsigned)(value / 60); value -= minutes * 60; seconds = value; snprintf(buf, sizeof(buf)-1, "%ud %uh %um %us", days, hours, minutes, seconds); } if( NULL == key) { indentf(padding, whitespace, "%s", buf); } else { keybuf = json_escape_string(key, &string_escapes); indentf(padding, whitespace, "\"%s\":%s%s%s%s", keybuf, (( whitespace > 0) ? " " : ""), (format_duration ? "\"" : ""), buf, (format_duration ? "\"" : "")); } if(NULL != keybuf) free(keybuf); } void json_enumeration(json_object *json_parent, unsigned format_options, char *key, int value, const string_value_mapping *map) { string_value_mapping *svmp; if(format_options & JSON_FORMAT_ENUMERATE) { for(svmp = (string_value_mapping *)map; NULL != svmp->string; svmp++) { if( value == svmp->value) { json_object_append_string(json_parent, key, &percent_escapes, svmp->string); break; } } if( NULL == svmp->string) { json_object_append_string(json_parent, key, NULL, "Unknown value %d", svmp->value); } } else { json_object_append_integer(json_parent, key, value); } } void json_bitmask(json_object *json_parent, unsigned format_options, char *key, int value, const string_value_mapping *map) { json_array *json_bitmask_array; string_value_mapping *svmp; if(format_options & JSON_FORMAT_BITMASK) { json_bitmask_array = json_new_array(); for(svmp = (string_value_mapping *)map; NULL != svmp->string; svmp++) { if( value & svmp->value) { json_array_append_string(json_bitmask_array, &percent_escapes, svmp->string); } } json_object_append_array(json_parent, key, json_bitmask_array); } else { json_object_append_integer(json_parent, key, value); } } int parse_bitmask_cgivar(char *cgi, char *query, int query_status, json_object *json_parent, time_t query_time, authdata *authinfo, char *key, char *value, const string_value_mapping *svm, unsigned *var) { int result = RESULT_SUCCESS; char *option; char *saveptr; string_value_mapping *svmp; if(value == NULL) { json_object_append_object(json_parent, "result", json_result(query_time, cgi, query, query_status, (time_t)-1, authinfo, RESULT_OPTION_VALUE_MISSING, "No value specified for %s option.", key)); return RESULT_OPTION_VALUE_MISSING; } option = strtok_r(value, " ", &saveptr); while(NULL != option) { for(svmp = (string_value_mapping *)svm; NULL != svmp->string; svmp++) { if( !strcmp( svmp->string, option)) { *var |= svmp->value; break; } } if( NULL == svmp->string) { json_object_append_object(json_parent, "result", json_result(query_time, cgi, query, query_status, (time_t)-1, authinfo, RESULT_OPTION_VALUE_INVALID, "The %s option value '%s' is invalid.", key, option)); result = RESULT_OPTION_VALUE_INVALID; break; } option = strtok_r(NULL, " ", &saveptr); } return result; } int parse_enumeration_cgivar(char *cgi, char *query, int query_status, json_object *json_parent, time_t query_time, authdata *authinfo, char *key, char *value, const string_value_mapping *svm, int *var) { string_value_mapping *svmp; if(value == NULL) { json_object_append_object(json_parent, "result", json_result(query_time, cgi, query, query_status, (time_t)-1, authinfo, RESULT_OPTION_VALUE_MISSING, "No value specified for %s option.", key)); return RESULT_OPTION_VALUE_MISSING; } for(svmp = (string_value_mapping *)svm; NULL != svmp->string; svmp++) { if( !strcmp( svmp->string, value)) { *var = svmp->value; break; } } if( NULL == svmp->string) { json_object_append_object(json_parent, "result", json_result(query_time, cgi, query, query_status, (time_t)-1, authinfo, RESULT_OPTION_VALUE_INVALID, "The %s option value '%s' is invalid.", key, value)); return RESULT_OPTION_VALUE_INVALID; } return RESULT_SUCCESS; } int parse_string_cgivar(char *cgi, char *query, int query_status, json_object *json_parent, time_t query_time, authdata *authinfo, char *key, char *value, char **var) { if(value == NULL) { json_object_append_object(json_parent, "result", json_result(query_time, cgi, query, query_status, (time_t)-1, authinfo, RESULT_OPTION_VALUE_MISSING, "No value specified for %s option.", key)); return RESULT_OPTION_VALUE_MISSING; } if(NULL == (*var = strdup( value))) { json_object_append_object(json_parent, "result", json_result(query_time, cgi, query, query_status, (time_t)-1, authinfo, RESULT_MEMORY_ALLOCATION_ERROR, "Unable to allocate memory for %s option.", key)); return RESULT_MEMORY_ALLOCATION_ERROR; } return RESULT_SUCCESS; } int parse_time_cgivar(char *cgi, char *query, int query_status, json_object *json_parent, time_t query_time, authdata *authinfo, char *key, char *value, time_t *var) { long long templl; if(value == NULL) { json_object_append_object(json_parent, "result", json_result(query_time, cgi, query, query_status, (time_t)-1, authinfo, RESULT_OPTION_VALUE_MISSING, "No value specified for %s option.", key)); return RESULT_OPTION_VALUE_MISSING; } if('+' == value[0]) { templl = strtoll(&(value[1]), NULL, 10); *var = (time_t)((long long)query_time + templl); } else if('-' == value[0]) { templl = strtoll(&(value[1]), NULL, 10); *var = (time_t)((long long)query_time - templl); } else { templl = strtoll(value, NULL, 10); *var = (time_t)templl; } return RESULT_SUCCESS; } int parse_boolean_cgivar(char *cgi, char *query, int query_status, json_object *json_parent, time_t query_time, authdata *authinfo, char *key, char *value, int *var) { if(value == NULL) { json_object_append_object(json_parent, "result", json_result(query_time, cgi, query, query_status, (time_t)-1, authinfo, RESULT_OPTION_VALUE_MISSING, "No value specified for %s option.", key)); return ERROR; } if(!strcmp(value, "true")) { *var = 1; } else if(!strcmp(value, "false")) { *var = 0; } else { json_object_append_object(json_parent, "result", json_result(query_time, cgi, query, query_status, (time_t)-1, authinfo, RESULT_OPTION_VALUE_INVALID, "Value for %s option must be 'true' or 'false'.", key)); return RESULT_OPTION_VALUE_INVALID; } return RESULT_SUCCESS; } int parse_int_cgivar(char *cgi, char *query, int query_status, json_object *json_parent, time_t query_time, authdata *authinfo, char *key, char *value, int *var) { if(value == NULL) { json_object_append_object(json_parent, "result", json_result(query_time, cgi, query, query_status, (time_t)-1, authinfo, RESULT_OPTION_VALUE_MISSING, "No value specified for %s option.", key)); return RESULT_OPTION_VALUE_MISSING; } *var = atoi(value); return RESULT_SUCCESS; } int get_query_status(const int statuses[][2], int query) { int x; for(x = 0; -1 != statuses[x][0]; x++) { if(statuses[x][0] == query) return statuses[x][1]; } return -1; } char *svm_get_string_from_value(int value, const string_value_mapping *svm) { string_value_mapping *svmp; for(svmp = (string_value_mapping *)svm; NULL != svmp->string; svmp++) { if(svmp->value == value) return svmp->string; } return NULL; } char *svm_get_description_from_value(int value, const string_value_mapping *svm) { string_value_mapping *svmp; for(svmp = (string_value_mapping *)svm; NULL != svmp->string; svmp++) { if(svmp->value == value) return svmp->description; } return NULL; } /* Thanks to Jerry Coffin for posting the basis of this function on Stack Overflow */ time_t compile_time(const char *date, const char *time) { char buf[5]; int year; int month; int day; int hour; int minute; int second; struct tm t; const char *months = "JanFebMarAprMayJunJulAugSepOctNovDec"; sscanf(date, "%s %d %d", buf, &day, &year); sscanf(time, "%d:%d:%d", &hour, &minute, &second); month = (strstr(months, buf) - months) / 3; t.tm_year = year - 1900; t.tm_mon = month; t.tm_mday = day; t.tm_hour = hour; t.tm_min = minute; t.tm_sec = second; t.tm_isdst = -1; return mktime(&t); } /* Escape a string based on the values in the escapes parameter */ char *json_escape_string(const char *src, const json_escape *escapes) { wchar_t *wdest; /* wide character version of the output string */ size_t wdest_size; /* number of available wchars in wdest */ size_t wdest_len; /* number of wchars in wdest */ int x; json_escape_pair *escp; /* pointer to current escape pair */ size_t from_len; size_t to_len; wchar_t *fromp; /* pointer to a found "from" string */ long offset; /* offset from beginning of wdest to a "from" string */ size_t wchars; /* number of wide characters to move */ size_t dest_len; /* length of output string "dest" */ char *dest; /* buffer containing the escaped version of src */ /* Make sure we're passed valid parameters */ if((NULL == src) || (NULL == escapes)) { return NULL; } /* Make a wide string copy of src */ wdest_len = mbstowcs(NULL, src, 0); if(wdest_len <= 0) return NULL; if((wdest = calloc(wdest_len + 1, sizeof(wchar_t))) == NULL) { return NULL; } if(mbstowcs(wdest, src, wdest_len) != wdest_len) { free(wdest); return NULL; } wdest_size = wdest_len; /* Process each escape pair */ for(x = 0, escp = (json_escape_pair *)escapes->pairs; x < escapes->count; x++, escp++) { from_len = wcslen(escp->from); to_len = wcslen(escp->to); fromp = wdest; while((fromp = wcsstr(fromp, escp->from)) != NULL) { offset = fromp - wdest; if(from_len < to_len) { if((wdest_size - wdest_len) < (to_len - from_len)) { /* If more room is needed, realloc and update variables */ wdest_size += (to_len - from_len) * BUF_REALLOC_MULTIPLIER; wdest = realloc(wdest, (wdest_size + 1) * sizeof(wchar_t)); if(NULL == wdest) return NULL; fromp = wdest + offset; } wchars = wdest_len - offset - from_len + 1; wmemmove(fromp + to_len, fromp + from_len, wchars); wcsncpy(fromp, escp->to, to_len); wdest_len += (to_len - from_len); fromp += to_len; } else { wchars = wdest_len - offset - to_len; memmove(fromp + to_len, fromp + from_len, wchars * sizeof(wchar_t)); wcsncpy(fromp, escp->to, to_len); fromp += (from_len - to_len); wdest_len -= (from_len - to_len); } } } /* Covert the wide string back to a multibyte string */ dest_len = wcstombs(NULL, wdest, 0); if(0 == dest_len) return NULL; if((dest = calloc(dest_len + 1, sizeof(char))) == NULL) { return NULL; } if(wcstombs(dest, wdest, dest_len) != dest_len) { free(dest); return NULL; } return dest; } nagios-4.3.4/cgi/notifications.c000066400000000000000000000625731314764422400166050ustar00rootroot00000000000000/************************************************************************ * * NOTIFICATIONS.C - Nagios Notifications CGI * * * This CGI program will display the notification events for * a given host or contact or for all contacts/hosts. * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ***********************************************************************/ #include "../include/config.h" #include "../include/common.h" #include "../include/getcgi.h" #include "../include/cgiutils.h" #include "../include/cgiauth.h" extern char main_config_file[MAX_FILENAME_LENGTH]; extern char url_html_path[MAX_FILENAME_LENGTH]; extern char url_images_path[MAX_FILENAME_LENGTH]; extern char url_docs_path[MAX_FILENAME_LENGTH]; extern char url_stylesheets_path[MAX_FILENAME_LENGTH]; #define FIND_HOST 1 #define FIND_CONTACT 2 #define FIND_SERVICE 3 #define MAX_QUERYNAME_LENGTH 256 #define SERVICE_NOTIFICATION 0 #define HOST_NOTIFICATION 1 #define SERVICE_NOTIFICATION_STRING "] SERVICE NOTIFICATION:" #define HOST_NOTIFICATION_STRING "] HOST NOTIFICATION:" void display_notifications(void); void document_header(int); void document_footer(void); int process_cgivars(void); authdata current_authdata; char log_file_to_use[MAX_FILENAME_LENGTH]; int log_archive = 0; int query_type = FIND_HOST; int find_all = TRUE; char *query_contact_name = ""; char *query_host_name = ""; char *query_svc_description = ""; int notification_options = NOTIFICATION_ALL; int use_lifo = TRUE; int embedded = FALSE; int display_header = TRUE; int main(void) { char temp_buffer[MAX_INPUT_BUFFER]; char temp_buffer2[MAX_INPUT_BUFFER]; /* get the arguments passed in the URL */ process_cgivars(); /* reset internal variables */ reset_cgi_vars(); cgi_init(document_header, document_footer, READ_ALL_OBJECT_DATA, 0); document_header(TRUE); /* get authentication information */ get_authentication_information(¤t_authdata); /* determine what log file we should use */ get_log_archive_to_use(log_archive, log_file_to_use, (int)sizeof(log_file_to_use)); if(display_header == TRUE) { /* begin top table */ printf("\n"); printf("\n"); /* left column of top row */ printf("\n"); /* middle column of top row */ printf("\n"); /* right hand column of top row */ printf("\n"); /* end of top table */ printf("\n"); printf("
    \n"); if(query_type == FIND_SERVICE) snprintf(temp_buffer, sizeof(temp_buffer) - 1, "Service Notifications"); else if(query_type == FIND_HOST) { if(find_all == TRUE) snprintf(temp_buffer, sizeof(temp_buffer) - 1, "Notifications"); else snprintf(temp_buffer, sizeof(temp_buffer) - 1, "Host Notifications"); } else snprintf(temp_buffer, sizeof(temp_buffer) - 1, "Contact Notifications"); display_info_table(temp_buffer, FALSE, ¤t_authdata); if(query_type == FIND_HOST || query_type == FIND_SERVICE) { printf("\n"); printf("\n"); printf("\n"); } printf("\n"); printf("
    \n"); if(query_type == FIND_SERVICE) printf("Service '%s' On Host '%s'", query_svc_description, query_host_name); else if(query_type == FIND_HOST) { if(find_all == TRUE) printf("All Hosts and Services"); else printf("Host '%s'", query_host_name); } else { if(find_all == TRUE) printf("All Contacts"); else printf("Contact '%s'", query_contact_name); } printf("
    \n"); printf("
    \n"); if(query_type == FIND_SERVICE) { snprintf(temp_buffer, sizeof(temp_buffer) - 1, "%s?%shost=%s&", NOTIFICATIONS_CGI, (use_lifo == FALSE) ? "oldestfirst&" : "", url_encode(query_host_name)); snprintf(temp_buffer2, sizeof(temp_buffer2) - 1, "service=%s&type=%d&", url_encode(query_svc_description), notification_options); strncat(temp_buffer, temp_buffer2, sizeof(temp_buffer) - strlen(temp_buffer) - 1); } else snprintf(temp_buffer, sizeof(temp_buffer) - 1, "%s?%s%s=%s&type=%d&", NOTIFICATIONS_CGI, (use_lifo == FALSE) ? "oldestfirst&" : "", (query_type == FIND_HOST) ? "host" : "contact", (query_type == FIND_HOST) ? url_encode(query_host_name) : url_encode(query_contact_name), notification_options); temp_buffer[sizeof(temp_buffer) - 1] = '\x0'; display_nav_table(temp_buffer, log_archive); printf("
    \n"); printf("
    \n", NOTIFICATIONS_CGI); if(query_type == FIND_SERVICE) { printf("\n", escape_string(query_host_name)); printf("\n", escape_string(query_svc_description)); } else printf("\n", (query_type == FIND_HOST) ? "host" : "contact", (query_type == FIND_HOST) ? escape_string(query_host_name) : escape_string(query_contact_name)); printf("\n", log_archive); printf("\n"); printf("\n"); if(query_type == FIND_SERVICE) printf(""); else printf("", (find_all == TRUE) ? "all" : "this", (query_type == FIND_HOST) ? "host" : "contact", (find_all == TRUE) ? "s" : ""); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("", (use_lifo == FALSE) ? "checked" : ""); printf("\n"); printf("\n"); /* display context-sensitive help */ printf("\n"); printf("
    Notification detail level for this service:Notification detail level for %s %s%s:
    Older Entries First:
    \n"); display_context_help(CONTEXTHELP_NOTIFICATIONS); printf("
    \n"); printf("
    \n"); printf("
    \n"); } /* display notifications */ display_notifications(); document_footer(); /* free allocated memory */ free_memory(); return OK; } void document_header(int use_stylesheet) { char date_time[MAX_DATETIME_LENGTH]; time_t current_time; time_t expire_time; printf("Cache-Control: no-store\r\n"); printf("Pragma: no-cache\r\n"); time(¤t_time); get_time_string(¤t_time, date_time, (int)sizeof(date_time), HTTP_DATE_TIME); printf("Last-Modified: %s\r\n", date_time); expire_time = (time_t)0L; get_time_string(&expire_time, date_time, (int)sizeof(date_time), HTTP_DATE_TIME); printf("Expires: %s\r\n", date_time); printf("Content-type: text/html; charset=utf-8\r\n\r\n"); if(embedded == TRUE) return; printf("\n"); printf("\n"); printf("\n", url_images_path); printf("\n"); printf("Alert Notifications\n"); printf("\n"); if(use_stylesheet == TRUE) { printf("\n", url_stylesheets_path, COMMON_CSS); printf("\n", url_stylesheets_path, NOTIFICATIONS_CSS); } printf("\n"); printf("\n"); /* include user SSI header */ include_ssi_files(NOTIFICATIONS_CGI, SSI_HEADER); return; } void document_footer(void) { if(embedded == TRUE) return; /* include user SSI footer */ include_ssi_files(NOTIFICATIONS_CGI, SSI_FOOTER); printf("\n"); printf("\n"); return; } int process_cgivars(void) { char **variables; int error = FALSE; int x; variables = getcgivars(); for(x = 0; variables[x] != NULL; x++) { /* do some basic length checking on the variable identifier to prevent buffer overflows */ if(strlen(variables[x]) >= MAX_INPUT_BUFFER - 1) { continue; } /* we found the host argument */ else if(!strcmp(variables[x], "host")) { query_type = FIND_HOST; x++; if(variables[x] == NULL) { error = TRUE; break; } if((query_host_name = strdup(variables[x])) == NULL) query_host_name = ""; strip_html_brackets(query_host_name); if(!strcmp(query_host_name, "all")) find_all = TRUE; else find_all = FALSE; } /* we found the contact argument */ else if(!strcmp(variables[x], "contact")) { query_type = FIND_CONTACT; x++; if(variables[x] == NULL) { error = TRUE; break; } if((query_contact_name = strdup(variables[x])) == NULL) query_contact_name = ""; strip_html_brackets(query_contact_name); if(!strcmp(query_contact_name, "all")) find_all = TRUE; else find_all = FALSE; } /* we found the service argument */ else if(!strcmp(variables[x], "service")) { query_type = FIND_SERVICE; x++; if(variables[x] == NULL) { error = TRUE; break; } if((query_svc_description = strdup(variables[x])) == NULL) query_svc_description = ""; strip_html_brackets(query_svc_description); } /* we found the notification type argument */ else if(!strcmp(variables[x], "type")) { x++; if(variables[x] == NULL) { error = TRUE; break; } notification_options = atoi(variables[x]); } /* we found the log archive argument */ else if(!strcmp(variables[x], "archive")) { x++; if(variables[x] == NULL) { error = TRUE; break; } log_archive = atoi(variables[x]); if(log_archive < 0) log_archive = 0; } /* we found the order argument */ else if(!strcmp(variables[x], "oldestfirst")) { use_lifo = FALSE; } /* we found the embed option */ else if(!strcmp(variables[x], "embedded")) embedded = TRUE; /* we found the noheader option */ else if(!strcmp(variables[x], "noheader")) display_header = FALSE; } /* * Set some default values if not already set. * Done here as they won't be set if variable * not provided via cgi parameters * Only required for hosts & contacts, not services * as there is no service_name=all option */ if(query_type == FIND_HOST && strlen(query_host_name) == 0) { query_host_name = "all"; find_all = TRUE; } if(query_type == FIND_CONTACT && strlen(query_contact_name) == 0) { query_contact_name = "all"; find_all = TRUE; } /* free memory allocated to the CGI variables */ free_cgivars(variables); return error; } void display_notifications(void) { mmapfile *thefile = NULL; char *input = NULL; char *temp_buffer; char date_time[MAX_DATETIME_LENGTH]; char alert_level[MAX_INPUT_BUFFER]; char alert_level_class[MAX_INPUT_BUFFER]; char contact_name[MAX_INPUT_BUFFER]; char service_name[MAX_INPUT_BUFFER]; char host_name[MAX_INPUT_BUFFER]; char method_name[MAX_INPUT_BUFFER]; int show_entry; int total_notifications; int notification_type = SERVICE_NOTIFICATION; int notification_detail_type = NOTIFICATION_SERVICE_CRITICAL; int odd = 0; time_t t; host *temp_host; service *temp_service; int result; if(use_lifo == TRUE) { result = read_file_into_lifo(log_file_to_use); if(result != LIFO_OK) { if(result == LIFO_ERROR_MEMORY) { printf("

    Not enough memory to reverse log file - displaying notifications in natural order...

    "); } else if(result == LIFO_ERROR_FILE) { printf("

    Error: Cannot open log file '%s' for reading!

    ", log_file_to_use); return; } use_lifo = FALSE; } } if(use_lifo == FALSE) { if((thefile = mmap_fopen(log_file_to_use)) == NULL) { printf("

    Error: Cannot open log file '%s' for reading!

    ", log_file_to_use); return; } } printf("

    \n"); printf("

    \n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); total_notifications = 0; while(1) { free(input); if(use_lifo == TRUE) { if((input = pop_lifo()) == NULL) break; } else { if((input = mmap_fgets(thefile)) == NULL) break; } strip(input); /* see if this line contains the notification event string */ if(strstr(input, HOST_NOTIFICATION_STRING) || strstr(input, SERVICE_NOTIFICATION_STRING)) { if(strstr(input, HOST_NOTIFICATION_STRING)) notification_type = HOST_NOTIFICATION; else notification_type = SERVICE_NOTIFICATION; /* get the date/time */ temp_buffer = (char *)strtok(input, "]"); t = (time_t)(temp_buffer == NULL) ? 0L : strtoul(temp_buffer + 1, NULL, 10); get_time_string(&t, date_time, (int)sizeof(date_time), SHORT_DATE_TIME); strip(date_time); /* get the contact name */ temp_buffer = (char *)strtok(NULL, ":"); temp_buffer = (char *)strtok(NULL, ";"); snprintf(contact_name, sizeof(contact_name), "%s", (temp_buffer == NULL) ? "" : temp_buffer + 1); contact_name[sizeof(contact_name) - 1] = '\x0'; /* get the host name */ temp_buffer = (char *)strtok(NULL, ";"); snprintf(host_name, sizeof(host_name), "%s", (temp_buffer == NULL) ? "" : temp_buffer); host_name[sizeof(host_name) - 1] = '\x0'; /* get the service name */ if(notification_type == SERVICE_NOTIFICATION) { temp_buffer = (char *)strtok(NULL, ";"); snprintf(service_name, sizeof(service_name), "%s", (temp_buffer == NULL) ? "" : temp_buffer); service_name[sizeof(service_name) - 1] = '\x0'; } /* get the alert level */ temp_buffer = (char *)strtok(NULL, ";"); snprintf(alert_level, sizeof(alert_level), "%s", (temp_buffer == NULL) ? "" : temp_buffer); alert_level[sizeof(alert_level) - 1] = '\x0'; if(notification_type == SERVICE_NOTIFICATION) { if(!strcmp(alert_level, "CRITICAL")) { notification_detail_type = NOTIFICATION_SERVICE_CRITICAL; strcpy(alert_level_class, "CRITICAL"); } else if(!strcmp(alert_level, "WARNING")) { notification_detail_type = NOTIFICATION_SERVICE_WARNING; strcpy(alert_level_class, "WARNING"); } else if(!strcmp(alert_level, "RECOVERY") || !strcmp(alert_level, "OK")) { strcpy(alert_level, "OK"); notification_detail_type = NOTIFICATION_SERVICE_RECOVERY; strcpy(alert_level_class, "OK"); } else if(strstr(alert_level, "CUSTOM (")) { notification_detail_type = NOTIFICATION_SERVICE_CUSTOM; strcpy(alert_level_class, "CUSTOM"); } else if(strstr(alert_level, "ACKNOWLEDGEMENT (")) { notification_detail_type = NOTIFICATION_SERVICE_ACK; strcpy(alert_level_class, "ACKNOWLEDGEMENT"); } else if(strstr(alert_level, "FLAPPINGSTART (")) { strcpy(alert_level, "FLAPPING START"); notification_detail_type = NOTIFICATION_SERVICE_FLAP; strcpy(alert_level_class, "UNKNOWN"); } else if(strstr(alert_level, "FLAPPINGSTOP (")) { strcpy(alert_level, "FLAPPING STOP"); notification_detail_type = NOTIFICATION_SERVICE_FLAP; strcpy(alert_level_class, "UNKNOWN"); } else if(strstr(alert_level, "DOWNTIME")) { notification_detail_type = NOTIFICATION_SERVICE_DOWNTIME; strcpy(alert_level_class, "DOWNTIME"); } else { strcpy(alert_level, "UNKNOWN"); notification_detail_type = NOTIFICATION_SERVICE_UNKNOWN; strcpy(alert_level_class, "UNKNOWN"); } } else { if(!strcmp(alert_level, "DOWN")) { strncpy(alert_level, "HOST DOWN", sizeof(alert_level)); strcpy(alert_level_class, "HOSTDOWN"); notification_detail_type = NOTIFICATION_HOST_DOWN; } else if(!strcmp(alert_level, "UNREACHABLE")) { strncpy(alert_level, "HOST UNREACHABLE", sizeof(alert_level)); strcpy(alert_level_class, "HOSTUNREACHABLE"); notification_detail_type = NOTIFICATION_HOST_UNREACHABLE; } else if(!strcmp(alert_level, "RECOVERY") || !strcmp(alert_level, "UP")) { strncpy(alert_level, "HOST UP", sizeof(alert_level)); strcpy(alert_level_class, "HOSTUP"); notification_detail_type = NOTIFICATION_HOST_RECOVERY; } else if(strstr(alert_level, "CUSTOM (")) { strcpy(alert_level_class, "HOSTCUSTOM"); notification_detail_type = NOTIFICATION_HOST_CUSTOM; } else if(strstr(alert_level, "ACKNOWLEDGEMENT (")) { strcpy(alert_level_class, "HOSTACKNOWLEDGEMENT"); notification_detail_type = NOTIFICATION_HOST_ACK; } else if(strstr(alert_level, "FLAPPINGSTART (")) { strcpy(alert_level, "FLAPPING START"); strcpy(alert_level_class, "UNKNOWN"); notification_detail_type = NOTIFICATION_HOST_FLAP; } else if(strstr(alert_level, "FLAPPINGSTOP (")) { strcpy(alert_level, "FLAPPING STOP"); strcpy(alert_level_class, "UNKNOWN"); notification_detail_type = NOTIFICATION_HOST_FLAP; } else if(strstr(alert_level, "DOWNTIME")) { strcpy(alert_level_class, "DOWNTIME"); notification_detail_type = NOTIFICATION_HOST_DOWNTIME; } } /* get the method name */ temp_buffer = (char *)strtok(NULL, ";"); snprintf(method_name, sizeof(method_name), "%s", (temp_buffer == NULL) ? "" : temp_buffer); method_name[sizeof(method_name) - 1] = '\x0'; /* move to the informational message */ temp_buffer = strtok(NULL, ";"); show_entry = FALSE; /* if we're searching by contact, filter out unwanted contact */ if(query_type == FIND_CONTACT) { if(find_all == TRUE) show_entry = TRUE; else if(!strcmp(query_contact_name, contact_name)) show_entry = TRUE; } else if(query_type == FIND_HOST) { if(find_all == TRUE) show_entry = TRUE; else if(!strcmp(query_host_name, host_name)) show_entry = TRUE; } else if(query_type == FIND_SERVICE) { if(!strcmp(query_host_name, host_name) && !strcmp(query_svc_description, service_name)) show_entry = TRUE; } if(show_entry == TRUE) { if(notification_options == NOTIFICATION_ALL) show_entry = TRUE; else if(notification_options == NOTIFICATION_HOST_ALL && notification_type == HOST_NOTIFICATION) show_entry = TRUE; else if(notification_options == NOTIFICATION_SERVICE_ALL && notification_type == SERVICE_NOTIFICATION) show_entry = TRUE; else if(notification_detail_type & notification_options) show_entry = TRUE; else show_entry = FALSE; } /* make sure user has authorization to view this notification */ if(notification_type == HOST_NOTIFICATION) { temp_host = find_host(host_name); if(is_authorized_for_host(temp_host, ¤t_authdata) == FALSE) show_entry = FALSE; } else { temp_service = find_service(host_name, service_name); if(is_authorized_for_service(temp_service, ¤t_authdata) == FALSE) show_entry = FALSE; } if(show_entry == TRUE) { total_notifications++; if(odd) { odd = 0; printf("\n"); } else { odd = 1; printf("\n"); } printf("\n", (odd) ? "Even" : "Odd", EXTINFO_CGI, DISPLAY_HOST_INFO, url_encode(host_name), host_name); if(notification_type == SERVICE_NOTIFICATION) { printf("\n", url_encode(service_name), service_name); } else printf("\n", (odd) ? "Even" : "Odd"); printf("\n", alert_level_class, alert_level); printf("\n", (odd) ? "Even" : "Odd", date_time); printf("\n", (odd) ? "Even" : "Odd", CONFIG_CGI, url_encode(contact_name), contact_name); printf("\n", (odd) ? "Even" : "Odd", CONFIG_CGI, url_encode(method_name), method_name); printf("\n", (odd) ? "Even" : "Odd", html_encode(temp_buffer, FALSE)); printf("\n"); } } } printf("
    HostServiceTypeTimeContactNotification CommandInformation
    %s%sN/A%s%s%s%s%s
    \n"); printf("
    \n"); printf("

    \n"); if(total_notifications == 0) { printf("

    No notifications have been recorded"); if(find_all == FALSE) { if(query_type == FIND_SERVICE) printf(" for this service"); else if(query_type == FIND_CONTACT) printf(" for this contact"); else printf(" for this host"); } printf(" in %s log file

    ", (log_archive == 0) ? "the current" : "this archived"); } free(input); if(use_lifo == TRUE) free_lifo_memory(); else mmap_fclose(thefile); return; } nagios-4.3.4/cgi/objectjson.c000066400000000000000000006266701314764422400161000ustar00rootroot00000000000000/************************************************************************** * * OBJECTJSON.C - Nagios CGI for returning JSON-formatted object data * * Copyright (c) 2013 Nagios Enterprises, LLC * Last Modified: 04-13-2013 * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *************************************************************************/ /* TODO: Add code to display customvariables Add sort criteria for *list queries Add core3 flag for backward compatible display of flags that were combined into a single variable in core4 Implement internationalized day of week, month names, and formats for timeperiod details Implement raw numbers for day of week, month for timeperiod details */ #include "../include/config.h" #include "../include/common.h" #include "../include/objects.h" #include "../include/statusdata.h" #include "../include/cgiutils.h" #include "../include/getcgi.h" #include "../include/cgiauth.h" #include "../include/jsonutils.h" #include "../include/objectjson.h" #define THISCGI "objectjson.cgi" extern char main_config_file[MAX_FILENAME_LENGTH]; extern char *status_file; extern host *host_list; extern hostgroup *hostgroup_list; extern service *service_list; extern servicegroup *servicegroup_list; extern contact *contact_list; extern contactgroup *contactgroup_list; extern timeperiod *timeperiod_list; extern command *command_list; extern servicedependency *servicedependency_list; extern serviceescalation *serviceescalation_list; extern hostdependency *hostdependency_list; extern hostescalation *hostescalation_list; void document_header(int); void document_footer(void); void init_cgi_data(object_json_cgi_data *); int process_cgivars(json_object *, object_json_cgi_data *, time_t); void free_cgi_data(object_json_cgi_data *); int validate_arguments(json_object *, object_json_cgi_data *, time_t); authdata current_authdata; const string_value_mapping valid_queries[] = { { "hostcount", OBJECT_QUERY_HOSTCOUNT, "Return the number of hosts" }, { "hostlist", OBJECT_QUERY_HOSTLIST, "Return a list of hosts" }, { "host", OBJECT_QUERY_HOST, "Return the configuration for a single host" }, { "hostgroupcount", OBJECT_QUERY_HOSTGROUPCOUNT, "Return the number of host groups" }, { "hostgrouplist", OBJECT_QUERY_HOSTGROUPLIST, "Return a list of host groups" }, { "hostgroup", OBJECT_QUERY_HOSTGROUP, "Return the configuration for a single hostgroup" }, { "servicecount", OBJECT_QUERY_SERVICECOUNT, "Return a list of services" }, { "servicelist", OBJECT_QUERY_SERVICELIST, "Return a list of services" }, { "service", OBJECT_QUERY_SERVICE, "Return the configuration for a single service" }, { "servicegroupcount", OBJECT_QUERY_SERVICEGROUPCOUNT, "Return the number of service groups" }, { "servicegrouplist", OBJECT_QUERY_SERVICEGROUPLIST, "Return a list of service groups" }, { "servicegroup", OBJECT_QUERY_SERVICEGROUP, "Return the configuration for a single servicegroup" }, { "contactcount", OBJECT_QUERY_CONTACTCOUNT, "Return the number of contacts" }, { "contactlist", OBJECT_QUERY_CONTACTLIST, "Return a list of contacts" }, { "contact", OBJECT_QUERY_CONTACT, "Return the configuration for a single contact" }, { "contactgroupcount", OBJECT_QUERY_CONTACTGROUPCOUNT, "Return the number of contact groups" }, { "contactgrouplist", OBJECT_QUERY_CONTACTGROUPLIST, "Return a list of contact groups" }, { "contactgroup", OBJECT_QUERY_CONTACTGROUP, "Return the configuration for a single contactgroup" }, { "timeperiodcount", OBJECT_QUERY_TIMEPERIODCOUNT, "Return the number of time periods" }, { "timeperiodlist", OBJECT_QUERY_TIMEPERIODLIST, "Return a list of time periods" }, { "timeperiod", OBJECT_QUERY_TIMEPERIOD, "Return the configuration for a single timeperiod" }, { "commandcount", OBJECT_QUERY_COMMANDCOUNT, "Return the number of commands" }, { "commandlist", OBJECT_QUERY_COMMANDLIST, "Return a list of commands" }, { "command", OBJECT_QUERY_COMMAND, "Return the configuration for a single command" }, { "servicedependencycount", OBJECT_QUERY_SERVICEDEPENDENCYCOUNT, "Return the number of service dependencies" }, { "servicedependencylist", OBJECT_QUERY_SERVICEDEPENDENCYLIST, "Return a list of service dependencies" }, { "serviceescalationcount", OBJECT_QUERY_SERVICEESCALATIONCOUNT, "Return the number of service escalations" }, { "serviceescalationlist", OBJECT_QUERY_SERVICEESCALATIONLIST, "Return a list of service escalations" }, { "hostdependencycount", OBJECT_QUERY_HOSTDEPENDENCYCOUNT, "Return the number of host dependencies" }, { "hostdependencylist", OBJECT_QUERY_HOSTDEPENDENCYLIST, "Return a list of host dependencies" }, { "hostescalationcount", OBJECT_QUERY_HOSTESCALATIONCOUNT, "Return the number of host escalations" }, { "hostescalationlist", OBJECT_QUERY_HOSTESCALATIONLIST, "Return a list of host escalations" }, { "help", OBJECT_QUERY_HELP, "Display help for this CGI" }, { NULL, -1, NULL }, }; static const int query_status[][2] = { { OBJECT_QUERY_HOSTCOUNT, QUERY_STATUS_RELEASED }, { OBJECT_QUERY_HOSTLIST, QUERY_STATUS_RELEASED }, { OBJECT_QUERY_HOST, QUERY_STATUS_RELEASED }, { OBJECT_QUERY_HOSTGROUPCOUNT, QUERY_STATUS_RELEASED }, { OBJECT_QUERY_HOSTGROUPLIST, QUERY_STATUS_RELEASED }, { OBJECT_QUERY_HOSTGROUP, QUERY_STATUS_RELEASED }, { OBJECT_QUERY_SERVICECOUNT, QUERY_STATUS_RELEASED }, { OBJECT_QUERY_SERVICELIST, QUERY_STATUS_RELEASED }, { OBJECT_QUERY_SERVICE, QUERY_STATUS_RELEASED }, { OBJECT_QUERY_SERVICEGROUPCOUNT, QUERY_STATUS_RELEASED }, { OBJECT_QUERY_SERVICEGROUPLIST, QUERY_STATUS_RELEASED }, { OBJECT_QUERY_SERVICEGROUP, QUERY_STATUS_RELEASED }, { OBJECT_QUERY_CONTACTCOUNT, QUERY_STATUS_RELEASED }, { OBJECT_QUERY_CONTACTLIST, QUERY_STATUS_RELEASED }, { OBJECT_QUERY_CONTACT, QUERY_STATUS_RELEASED }, { OBJECT_QUERY_CONTACTGROUPCOUNT, QUERY_STATUS_RELEASED }, { OBJECT_QUERY_CONTACTGROUPLIST, QUERY_STATUS_RELEASED }, { OBJECT_QUERY_CONTACTGROUP, QUERY_STATUS_RELEASED }, { OBJECT_QUERY_TIMEPERIODCOUNT, QUERY_STATUS_RELEASED }, { OBJECT_QUERY_TIMEPERIODLIST, QUERY_STATUS_RELEASED }, { OBJECT_QUERY_TIMEPERIOD, QUERY_STATUS_RELEASED }, { OBJECT_QUERY_COMMANDCOUNT, QUERY_STATUS_RELEASED }, { OBJECT_QUERY_COMMANDLIST, QUERY_STATUS_RELEASED }, { OBJECT_QUERY_COMMAND, QUERY_STATUS_RELEASED }, { OBJECT_QUERY_SERVICEDEPENDENCYCOUNT, QUERY_STATUS_RELEASED }, { OBJECT_QUERY_SERVICEDEPENDENCYLIST, QUERY_STATUS_RELEASED }, { OBJECT_QUERY_SERVICEESCALATIONCOUNT, QUERY_STATUS_RELEASED }, { OBJECT_QUERY_SERVICEESCALATIONLIST, QUERY_STATUS_RELEASED }, { OBJECT_QUERY_HOSTDEPENDENCYCOUNT, QUERY_STATUS_RELEASED }, { OBJECT_QUERY_HOSTDEPENDENCYLIST, QUERY_STATUS_RELEASED }, { OBJECT_QUERY_HOSTESCALATIONCOUNT, QUERY_STATUS_RELEASED }, { OBJECT_QUERY_HOSTESCALATIONLIST, QUERY_STATUS_RELEASED }, { OBJECT_QUERY_HELP, QUERY_STATUS_RELEASED }, { -1, -1 }, }; option_help object_json_help[] = { { "query", "Query", "enumeration", { "all", NULL }, { NULL }, NULL, "Specifies the type of query to be executed.", valid_queries }, { "formatoptions", "Format Options", "list", { NULL }, { "all", NULL }, NULL, "Specifies the formatting options to be used when displaying the results. Multiple options are allowed and are separated by a plus (+) sign..", svm_format_options }, { "start", "Start", "integer", { NULL }, { "hostlist", "hostgrouplist", "servicelist", "servicegrouplist", "contactlist", "contactgrouplist", "timeperiodlist", "commandlist", "servicedependencylist", "serviceescalationlist", "hostdependencylist", "hostescalationlist", NULL }, NULL, "Specifies the index (zero-based) of the first object in the list to be returned.", NULL }, { "count", "Count", "integer", { NULL }, { "hostlist", "hostgrouplist", "servicelist", "servicegrouplist", "contactlist", "contactgrouplist", "timeperiodlist", "commandlist", "servicedependencylist", "serviceescalationlist", "hostdependencylist", "hostescalationlist", NULL }, NULL, "Specifies the number of objects in the list to be returned.", NULL }, { "dateformat", "Date Format", "string", { NULL }, { "all", NULL }, NULL, "strftime format string for values of type time_t. In the absence of a format, the Javascript default format of the number of milliseconds since the beginning of the Unix epoch is used. Because of URL encoding, percent signs must be encoded as %25 and a space must be encoded as a plus (+) sign.", NULL }, { "parenthost", "Parent Host", "nagios:objectjson/hostlist", { NULL }, { "hostcount", "hostlist", "servicecount", "servicelist", NULL }, NULL, "Limits the hosts or services returned to those whose host parent is specified. A value of 'none' returns all hosts or services reachable directly by the Nagios core host.", parent_host_extras }, { "childhost", "Child Host", "nagios:objectjson/hostlist", { NULL }, { "hostcount", "hostlist", "servicecount", "servicelist", NULL }, NULL, "Limits the hosts or services returned to those whose having the host specified as a child host. A value of 'none' returns all hosts or services with no child hosts.", child_host_extras }, { "details", "Show Details", "boolean", { NULL }, { "hostlist", "hostgrouplist", "servicelist", "servicegrouplist", "contactlist", "contactgrouplist", "timeperiodlist", "commandlist", NULL }, NULL, "If true, return the details for all entities in the list.", NULL }, { "hostname", "Host Name", "nagios:objectjson/hostlist", { "host", "service", NULL }, { "servicecount", "servicelist", "hostescalationlist", "serviceescalationlist", NULL }, NULL, "Name for the host requested.", NULL }, { "hostgroupmember", "Host Group Member", "nagios:objectjson/hostlist", { NULL }, { "hostgroupcount", "hostgrouplist", NULL }, NULL, "Limits the hostgroups returned to those containing the hostgroupmember.", NULL }, { "hostgroup", "Host Group", "nagios:objectjson/hostgrouplist", { "hostgroup", NULL }, { "hostcount", "hostlist", "servicecount", "servicelist", "hostescalationcount", "hostescalationlist", "serviceescalationcount", "serviceescalationlist", NULL }, NULL, "Returns information applicable to the hostgroup or the hosts in the hostgroup depending on the query.", NULL }, { "servicegroup", "Service Group", "nagios:objectjson/servicegrouplist", { "servicegroup", NULL }, { "servicecount", "servicelist", "serviceescalationcount", "serviceescalationlist", NULL }, NULL, "Returns information applicable to the servicegroup or the services in the servicegroup depending on the query.", NULL }, { "parentservice", "Parent Service", "nagios:objectjson/servicelist", { NULL }, { "servicecount", "servicelist", NULL }, NULL, "Limits the services returned to those whose service parent has the name specified. A value of 'none' returns all services with no service parent.", parent_service_extras }, { "childservice", "Child Service", "nagios:objectjson/servicelist", { NULL }, { "servicecount", "servicelist", NULL }, NULL, "Limits the services returned to those whose having the named service as a child service. A value of 'none' returns all services with no child services.", child_service_extras }, { "contactgroup", "Contact Group", "nagios:objectjson/contactgrouplist", { "contactgroup", NULL }, { "hostcount", "hostlist", "servicecount", "servicelist", "contactcount", "contactlist", "serviceescalationcount", "serviceescalationlist", "hostescalationcount", "hostescalationlist", NULL }, NULL, "Returns information applicable to the contactgroup or the contacts in the contactgroup depending on the query.", NULL }, { "servicedescription", "Service Description", "nagios:objectjson/servicelist", { "service", NULL }, { "servicecount", "servicelist", "serviceescalationcount", "serviceescalationlist", NULL }, "hostname", "Description for the service requested.", NULL }, { "servicegroupmemberhost", "Service Group Member Host", "nagios:objectjson/hostlist", { NULL }, { "servicegroupcount", "servicegrouplist", NULL }, NULL, "Limits the servicegroups returned to those containing the servicegroupmemberhost (and servicegroupmemberservice).", NULL }, { "servicegroupmemberservice", "Service Group Member Service", "nagios:objectjson/servicelist", { NULL }, { "servicegroupcount", "servicegrouplist", NULL }, "servicegroupmemberhost", "Limits the servicegroups returned to those containing the servicegroupmemberservice (and servicegroupmemberhost).", NULL }, { "contactname", "Contact Name", "nagios:objectjson/contactlist", { "contact", NULL }, { "hostcount", "hostlist", "servicecount", "servicelist", "serviceescalationcount", "serviceescalationlist", "hostescalationcount", "hostescalationlist", NULL }, NULL, "Name for the contact requested.", NULL }, { "contactgroupmember", "Contact Group Member", "nagios:objectjson/contactlist", { NULL }, { "contactgroupcount", "contactgrouplist", NULL }, NULL, "Limits the contactgroups returned to those containing the contactgroupmember.", NULL }, { "timeperiod", "Timeperiod Name", "nagios:objectjson/timeperiodlist", { "timeperiod", NULL }, { NULL }, NULL, "Name for the timeperiod requested.", NULL }, { "checktimeperiod", "Check Timeperiod Name", "nagios:objectjson/timeperiodlist", { NULL }, { "hostcount","hostlist", "servicecount", "servicelist", NULL }, NULL, "Name of a check timeperiod to be used as selection criteria.", NULL }, { "hostnotificationtimeperiod", "Host Notification Timeperiod Name", "nagios:objectjson/timeperiodlist", { NULL }, { "hostcount","hostlist", "contactcount", "contactlist", NULL }, NULL, "Name of a host notification timeperiod to be used as selection criteria.", NULL }, { "servicenotificationtimeperiod", "Service Notification Timeperiod Name", "nagios:objectjson/timeperiodlist", { NULL }, { "servicecount", "servicelist", "contactcount", "contactlist", NULL }, NULL, "Name of a service notification timeperiod to be used as selection criteria.", NULL }, { "command", "Command Name", "nagios:objectjson/commandlist", { "command", NULL }, { NULL }, NULL, "Name for the command requested.", NULL }, { "checkcommand", "Check Command Name", "nagios:objectjson/commandlist", { NULL }, { "hostcount", "hostlist", "servicecount", "servicelist", NULL }, NULL, "Name of a check command to be be used as a selector.", NULL }, { "eventhandler", "Event Handler Name", "nagios:objectjson/commandlist", { NULL }, { "hostcount", "hostlist", "servicecount", "servicelist", NULL }, NULL, "Name of an event handler to be be used as a selector.", NULL }, { "masterhostname", "Master Host Name", "nagios:objectjson/hostlist", { NULL }, { "hostdependencycount", "hostdependencylist", "servicedependencycount", "servicedependencylist", NULL }, NULL, "Name for a master host to be used as a selector.", NULL }, { "masterhostgroupname", "Master Hostgroup Name", "nagios:objectjson/hostgrouplist", { NULL }, { "hostdependencycount", "hostdependencylist", "servicedependencycount", "servicedependencylist", NULL }, NULL, "Name for a master hostgroup to be used as a selector.", NULL }, { "masterservicedescription", "Master Service Description", "nagios:objectjson/servicelist", { NULL }, { "servicedependencycount", "servicedependencylist", NULL }, "masterhostname", "Description for a master service to be used as a selector.", NULL }, { "masterservicegroupname", "Master Servicegroup Name", "nagios:objectjson/servicegrouplist", { NULL }, { "servicedependencycount", "servicedependencylist", NULL }, NULL, "Name for a master servicegroup to be used as a selector.", NULL }, { "dependenthostname", "Dependent Host Name", "nagios:objectjson/hostlist", { NULL }, { "hostdependencycount", "hostdependencylist", "servicedependencycount", "servicedependencylist", NULL }, NULL, "Name for a dependent host to be used as a selector.", NULL }, { "dependenthostgroupname", "Dependent Hostgroup Name", "nagios:objectjson/hostgrouplist", { NULL }, { "hostdependencycount", "hostdependencylist", "servicedependencycount", "servicedependencylist", NULL }, NULL, "Name for a dependent hostgroup to be used as a selector.", NULL }, { "dependentservicedescription", "Dependent Service Description", "nagios:objectjson/servicelist", { NULL }, { "servicedependencycount", "servicedependencylist", NULL }, "dependenthostname", "Description for a dependent service to be used as a selector.", NULL }, { "dependentservicegroupname", "Dependent Servicegroup Name", "nagios:objectjson/servicegrouplist", { NULL }, { "servicedependencycount", "servicedependencylist", NULL }, NULL, "Name for a dependent servicegroup to be used as a selector.", NULL }, { /* The last entry must contain all NULL entries */ NULL, NULL, NULL, { NULL }, { NULL }, NULL, NULL, NULL }, }; extern const json_escape percent_escapes; int json_object_host_passes_selection(host *, int, host *, int, host *, hostgroup *, contact *, contactgroup *, timeperiod *, timeperiod *, command *, command *); json_object *json_object_host_selectors(int, int, int, host *, int, host *, hostgroup *, contact *, contactgroup *, timeperiod *, timeperiod *, command *, command *); int json_object_hostgroup_passes_selection(hostgroup *, host *); json_object *json_object_hostgroup_selectors(int, int, host *); int json_object_service_passes_host_selection(host *, int, host *, int, host *, hostgroup *, host *); int json_object_service_passes_service_selection(service *, servicegroup *, contact *, char *, char *, char *, contactgroup *, timeperiod *, timeperiod *, command *, command *); json_object *json_object_service_selectors(int, int, int, host *, int, host *, hostgroup *, host *, servicegroup *, contact *, char *, char *, char *, contactgroup *, timeperiod *, timeperiod *, command *, command *); int json_object_servicegroup_passes_selection(servicegroup *, service *); json_object *json_object_servicegroup_display_selectors(int, int, service *); int json_object_contact_passes_selection(contact *, contactgroup *, timeperiod *, timeperiod *); json_object *json_object_contact_selectors(int, int, contactgroup *, timeperiod *, timeperiod *); int json_object_contactgroup_passes_selection(contactgroup *, contact *); json_object *json_object_contactgroup_display_selectors(int, int, contact *); json_object *json_object_timeperiod_selectors(int, int); json_object *json_object_command_selectors(int, int); int json_object_servicedependency_passes_selection(servicedependency *, host *, hostgroup *, char *, servicegroup *, host *, hostgroup *, char *, servicegroup *); json_object *json_object_servicedependency_selectors(int, int, host *, hostgroup *, char *, servicegroup *, host *, hostgroup *, char *, servicegroup *); int json_object_serviceescalation_passes_selection(serviceescalation *, host *, char *, hostgroup *, servicegroup *, contact *, contactgroup *); json_object *json_object_serviceescalation_selectors(int, int, host *, char *, hostgroup *, servicegroup *, contact *, contactgroup *); int json_object_hostdependency_passes_selection(hostdependency *, host *, hostgroup *, host *, hostgroup *); json_object *json_object_hostdependency_selectors(int, int, host *, hostgroup *, host *, hostgroup *); int json_object_hostescalation_passes_selection(hostescalation *, host *, hostgroup *, contact *, contactgroup *); json_object *json_object_hostescalation_selectors(int, int, host *, hostgroup *, contact *, contactgroup *); int main(void) { int result = OK; time_t query_time; object_json_cgi_data cgi_data; json_object *json_root; struct stat ocstat; time_t last_object_cache_update = (time_t)0; /* The official time of the query */ time(&query_time); json_root = json_new_object(); if(NULL == json_root) { printf( "Failed to create new json object\n"); exit( 1); } json_object_append_integer(json_root, "format_version", OUTPUT_FORMAT_VERSION); /* Initialize shared configuration variables */ init_shared_cfg_vars(1); init_cgi_data(&cgi_data); document_header(cgi_data.format_options & JSON_FORMAT_WHITESPACE); /* get the arguments passed in the URL */ result = process_cgivars(json_root, &cgi_data, query_time); if(result != RESULT_SUCCESS) { json_object_append_object(json_root, "data", json_help(object_json_help)); json_object_print(json_root, 0, 1, cgi_data.strftime_format, cgi_data.format_options); document_footer(); return result; } /* reset internal variables */ reset_cgi_vars(); /* read the CGI configuration file */ result = read_cgi_config_file(get_cgi_config_location()); if(result == ERROR) { json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), (time_t)-1, NULL, RESULT_FILE_OPEN_READ_ERROR, "Error: Could not open CGI configuration file '%s' for reading!", get_cgi_config_location())); json_object_append_object(json_root, "data", json_help(object_json_help)); json_object_print(json_root, 0, 1, cgi_data.strftime_format, cgi_data.format_options); document_footer(); return ERROR; } /* read the main configuration file */ result = read_main_config_file(main_config_file); if(result == ERROR) { json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), (time_t)-1, NULL, RESULT_FILE_OPEN_READ_ERROR, "Error: Could not open main configuration file '%s' for reading!", main_config_file)); json_object_append_object(json_root, "data", json_help(object_json_help)); document_footer(); return ERROR; } /* read all object configuration data */ result = read_all_object_configuration_data(main_config_file, READ_ALL_OBJECT_DATA); if(result == ERROR) { json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), (time_t)-1, NULL, RESULT_FILE_OPEN_READ_ERROR, "Error: Could not read some or all object configuration data!")); json_object_append_object(json_root, "data", json_help(object_json_help)); document_footer(); return ERROR; } /* Get the update time on the object cache file */ if(stat(object_cache_file, &ocstat) < 0) { json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), (time_t)-1, NULL, RESULT_FILE_OPEN_READ_ERROR, "Error: Could not obtain object cache file status: %s!", strerror(errno))); json_object_append_object(json_root, "data", json_help(object_json_help)); document_footer(); return ERROR; } last_object_cache_update = ocstat.st_mtime; /* read all status data */ result = read_all_status_data(status_file, READ_ALL_STATUS_DATA); if(result == ERROR) { json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), (time_t)-1, NULL, RESULT_FILE_OPEN_READ_ERROR, "Error: Could not read host and service status information!")); json_object_append_object(json_root, "data", json_help(object_json_help)); document_footer(); return ERROR; } /* validate arguments in URL */ result = validate_arguments(json_root, &cgi_data, query_time); if(result != RESULT_SUCCESS) { json_object_append_object(json_root, "data", json_help(object_json_help)); json_object_print(json_root, 0, 1, cgi_data.strftime_format, cgi_data.format_options); document_footer(); return ERROR; } /* get authentication information */ get_authentication_information(¤t_authdata); /* For most locales, floats get output with a comma instead of a * decimal point, which messes up the JSON data structure. */ setlocale(LC_NUMERIC, "C"); /* Return something to the user */ switch( cgi_data.query) { case OBJECT_QUERY_HOSTCOUNT: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_object_cache_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_object_hostcount(cgi_data.use_parent_host, cgi_data.parent_host, cgi_data.use_child_host, cgi_data.child_host, cgi_data.hostgroup, cgi_data.contact, cgi_data.contactgroup, cgi_data.check_timeperiod, cgi_data.host_notification_timeperiod, cgi_data.check_command, cgi_data.event_handler)); break; case OBJECT_QUERY_HOSTLIST: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_object_cache_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_object_hostlist(cgi_data.format_options, cgi_data.start, cgi_data.count, cgi_data.details, cgi_data.use_parent_host, cgi_data.parent_host, cgi_data.use_child_host, cgi_data.child_host, cgi_data.hostgroup, cgi_data.contact, cgi_data.contactgroup, cgi_data.check_timeperiod, cgi_data.host_notification_timeperiod, cgi_data.check_command, cgi_data.event_handler)); break; case OBJECT_QUERY_HOST: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_object_cache_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_object_host(cgi_data.format_options, cgi_data.host)); break; case OBJECT_QUERY_HOSTGROUPCOUNT: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_object_cache_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_object_hostgroupcount(cgi_data.format_options, cgi_data.hostgroup_member)); break; case OBJECT_QUERY_HOSTGROUPLIST: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_object_cache_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_object_hostgrouplist(cgi_data.format_options, cgi_data.start, cgi_data.count, cgi_data.details, cgi_data.hostgroup_member)); break; case OBJECT_QUERY_HOSTGROUP: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_object_cache_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_object_hostgroup(cgi_data.format_options, cgi_data.hostgroup)); break; case OBJECT_QUERY_SERVICECOUNT: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_object_cache_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_object_servicecount(cgi_data.host, cgi_data.use_parent_host, cgi_data.parent_host, cgi_data.use_child_host, cgi_data.child_host, cgi_data.hostgroup, cgi_data.servicegroup, cgi_data.contact, cgi_data.service_description, cgi_data.parent_service_name, cgi_data.child_service_name, cgi_data.contactgroup, cgi_data.check_timeperiod, cgi_data.service_notification_timeperiod, cgi_data.check_command, cgi_data.event_handler)); break; case OBJECT_QUERY_SERVICELIST: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_object_cache_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_object_servicelist(cgi_data.format_options, cgi_data.start, cgi_data.count, cgi_data.details, cgi_data.host, cgi_data.use_parent_host, cgi_data.parent_host, cgi_data.use_child_host, cgi_data.child_host, cgi_data.hostgroup, cgi_data.servicegroup, cgi_data.contact, cgi_data.service_description, cgi_data.parent_service_name, cgi_data.child_service_name, cgi_data.contactgroup, cgi_data.check_timeperiod, cgi_data.service_notification_timeperiod, cgi_data.check_command, cgi_data.event_handler)); break; case OBJECT_QUERY_SERVICE: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_object_cache_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_object_service(cgi_data.format_options, cgi_data.service)); break; case OBJECT_QUERY_SERVICEGROUPCOUNT: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_object_cache_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_object_servicegroupcount(cgi_data.servicegroup_member)); break; case OBJECT_QUERY_SERVICEGROUPLIST: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_object_cache_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_object_servicegrouplist(cgi_data.format_options, cgi_data.start, cgi_data.count, cgi_data.details, cgi_data.servicegroup_member)); break; case OBJECT_QUERY_SERVICEGROUP: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_object_cache_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_object_servicegroup(cgi_data.format_options, cgi_data.servicegroup)); break; case OBJECT_QUERY_CONTACTCOUNT: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_object_cache_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_object_contactcount(cgi_data.contactgroup, cgi_data.host_notification_timeperiod, cgi_data.service_notification_timeperiod)); break; case OBJECT_QUERY_CONTACTLIST: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_object_cache_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_object_contactlist(cgi_data.format_options, cgi_data.start, cgi_data.count, cgi_data.details, cgi_data.contactgroup, cgi_data.host_notification_timeperiod, cgi_data.service_notification_timeperiod)); break; case OBJECT_QUERY_CONTACT: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_object_cache_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_object_contact(cgi_data.format_options, cgi_data.contact)); break; case OBJECT_QUERY_CONTACTGROUPCOUNT: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_object_cache_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_object_contactgroupcount(cgi_data.contactgroup_member)); break; case OBJECT_QUERY_CONTACTGROUPLIST: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_object_cache_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_object_contactgrouplist(cgi_data.format_options, cgi_data.start, cgi_data.count, cgi_data.details, cgi_data.contactgroup_member)); break; case OBJECT_QUERY_CONTACTGROUP: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_object_cache_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_object_contactgroup(cgi_data.format_options, cgi_data.contactgroup)); break; case OBJECT_QUERY_TIMEPERIODCOUNT: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_object_cache_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_object_timeperiodcount()); break; case OBJECT_QUERY_TIMEPERIODLIST: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_object_cache_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_object_timeperiodlist(cgi_data.format_options, cgi_data.start, cgi_data.count, cgi_data.details)); break; case OBJECT_QUERY_TIMEPERIOD: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_object_cache_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_object_timeperiod(cgi_data.format_options, cgi_data.timeperiod)); break; case OBJECT_QUERY_COMMANDCOUNT: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_object_cache_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_object_commandcount()); break; case OBJECT_QUERY_COMMANDLIST: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_object_cache_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_object_commandlist(cgi_data.format_options, cgi_data.start, cgi_data.count, cgi_data.details)); break; case OBJECT_QUERY_COMMAND: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_object_cache_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_object_command(cgi_data.format_options, cgi_data.command)); break; case OBJECT_QUERY_SERVICEDEPENDENCYCOUNT: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_object_cache_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_object_servicedependencycount(cgi_data.master_host, cgi_data.master_hostgroup, cgi_data.master_service_description, cgi_data.master_servicegroup, cgi_data.dependent_host, cgi_data.dependent_hostgroup, cgi_data.dependent_service_description, cgi_data.dependent_servicegroup)); break; case OBJECT_QUERY_SERVICEDEPENDENCYLIST: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_object_cache_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_object_servicedependencylist(cgi_data.format_options, cgi_data.start, cgi_data.count, cgi_data.master_host, cgi_data.master_hostgroup, cgi_data.master_service_description, cgi_data.master_servicegroup, cgi_data.dependent_host, cgi_data.dependent_hostgroup, cgi_data.dependent_service_description, cgi_data.dependent_servicegroup)); break; case OBJECT_QUERY_SERVICEESCALATIONCOUNT: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_object_cache_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_object_serviceescalationcount(cgi_data.host, cgi_data.service_description, cgi_data.hostgroup, cgi_data.servicegroup, cgi_data.contact, cgi_data.contactgroup)); break; case OBJECT_QUERY_SERVICEESCALATIONLIST: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_object_cache_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_object_serviceescalationlist(cgi_data.format_options, cgi_data.start, cgi_data.count, cgi_data.host, cgi_data.service_description, cgi_data.hostgroup, cgi_data.servicegroup, cgi_data.contact, cgi_data.contactgroup)); break; case OBJECT_QUERY_HOSTDEPENDENCYCOUNT: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_object_cache_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_object_hostdependencycount(cgi_data.master_host, cgi_data.master_hostgroup, cgi_data.dependent_host, cgi_data.dependent_hostgroup)); break; case OBJECT_QUERY_HOSTDEPENDENCYLIST: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_object_cache_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_object_hostdependencylist(cgi_data.format_options, cgi_data.start, cgi_data.count, cgi_data.master_host, cgi_data.master_hostgroup, cgi_data.dependent_host, cgi_data.dependent_hostgroup)); break; case OBJECT_QUERY_HOSTESCALATIONCOUNT: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_object_cache_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_object_hostescalationcount(cgi_data.host, cgi_data.hostgroup, cgi_data.contact, cgi_data.contactgroup)); break; case OBJECT_QUERY_HOSTESCALATIONLIST: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_object_cache_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_object_hostescalationlist(cgi_data.format_options, cgi_data.start, cgi_data.count, cgi_data.host, cgi_data.hostgroup, cgi_data.contact, cgi_data.contactgroup)); break; case OBJECT_QUERY_HELP: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), compile_time(__DATE__, __TIME__), ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_help(object_json_help)); break; default: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), (time_t)-1, ¤t_authdata, RESULT_OPTION_MISSING, "Error: Object Type not specified. See data for help.")); json_object_append_object(json_root, "data", json_help(object_json_help)); break; } json_object_print(json_root, 0, 1, cgi_data.strftime_format, cgi_data.format_options); document_footer(); /* free all allocated memory */ free_cgi_data( &cgi_data); json_free_object(json_root, 1); free_memory(); return OK; } void document_header(int whitespace) { char date_time[MAX_DATETIME_LENGTH]; time_t expire_time; time_t current_time; time(¤t_time); printf("Cache-Control: no-store\r\n"); printf("Pragma: no-cache\r\n"); get_time_string(¤t_time, date_time, (int)sizeof(date_time), HTTP_DATE_TIME); printf("Last-Modified: %s\r\n", date_time); expire_time = (time_t)0L; get_time_string(&expire_time, date_time, (int)sizeof(date_time), HTTP_DATE_TIME); printf("Expires: %s\r\n", date_time); printf("Content-type: application/json; charset=utf-8\r\n\r\n"); return; } void document_footer(void) { printf( "\n"); return; } void init_cgi_data(object_json_cgi_data *cgi_data) { cgi_data->format_options = 0; cgi_data->query = OBJECT_QUERY_INVALID; cgi_data->start = 0; cgi_data->count = 0; cgi_data->details = 0; cgi_data->strftime_format = NULL; cgi_data->parent_host_name = NULL; cgi_data->use_parent_host = 0; cgi_data->parent_host = NULL; cgi_data->child_host_name = NULL; cgi_data->use_child_host = 0; cgi_data->child_host = NULL; cgi_data->host_name = NULL; cgi_data->host = NULL; cgi_data->hostgroup_member_name = NULL; cgi_data->hostgroup_member = NULL; cgi_data->hostgroup_name = NULL; cgi_data->hostgroup = NULL; cgi_data->servicegroup_name = NULL; cgi_data->servicegroup = NULL; cgi_data->service_description = NULL; cgi_data->service = NULL; cgi_data->servicegroup_member_host_name = NULL; cgi_data->servicegroup_member_service_description = NULL; cgi_data->servicegroup_member = NULL; cgi_data->parent_service_name = NULL; cgi_data->child_service_name = NULL; cgi_data->contactgroup_name = NULL; cgi_data->contactgroup = NULL; cgi_data->contact_name = NULL; cgi_data->contact = NULL; cgi_data->contactgroup_member_name = NULL; cgi_data->contactgroup_member = NULL; cgi_data->timeperiod_name = NULL; cgi_data->timeperiod = NULL; cgi_data->check_timeperiod_name = NULL; cgi_data->check_timeperiod = NULL; cgi_data->host_notification_timeperiod_name = NULL; cgi_data->host_notification_timeperiod = NULL; cgi_data->service_notification_timeperiod_name = NULL; cgi_data->service_notification_timeperiod = NULL; cgi_data->command_name = NULL; cgi_data->command = NULL; cgi_data->check_command_name = NULL; cgi_data->check_command = NULL; cgi_data->event_handler_name = NULL; cgi_data->event_handler = NULL; cgi_data->master_host_name = NULL; cgi_data->master_host = NULL; cgi_data->master_hostgroup_name = NULL; cgi_data->master_hostgroup = NULL; cgi_data->master_service_description = NULL; cgi_data->master_service = NULL; cgi_data->master_servicegroup_name = NULL; cgi_data->master_servicegroup = NULL; cgi_data->dependent_host_name = NULL; cgi_data->dependent_host = NULL; cgi_data->dependent_hostgroup_name = NULL; cgi_data->dependent_hostgroup = NULL; cgi_data->dependent_service_description = NULL; cgi_data->dependent_service = NULL; cgi_data->dependent_servicegroup_name = NULL; cgi_data->dependent_servicegroup = NULL; } void free_cgi_data( object_json_cgi_data *cgi_data) { if( NULL != cgi_data->strftime_format) free( cgi_data->strftime_format); if( NULL != cgi_data->parent_host_name) free( cgi_data->parent_host_name); if( NULL != cgi_data->child_host_name) free( cgi_data->child_host_name); if( NULL != cgi_data->host_name) free( cgi_data->host_name); if( NULL != cgi_data->hostgroup_member_name) free( cgi_data->hostgroup_member_name); if( NULL != cgi_data->hostgroup_name) free( cgi_data->hostgroup_name); if( NULL != cgi_data->servicegroup_name) free(cgi_data->servicegroup_name); if( NULL != cgi_data->service_description) free(cgi_data->service_description); if( NULL != cgi_data->servicegroup_member_host_name) free(cgi_data->servicegroup_member_host_name); if( NULL != cgi_data->servicegroup_member_service_description) free(cgi_data->servicegroup_member_service_description); if( NULL != cgi_data->parent_service_name) free( cgi_data->parent_service_name); if( NULL != cgi_data->child_service_name) free( cgi_data->child_service_name); if( NULL != cgi_data->contactgroup_name) free(cgi_data->contactgroup_name); if( NULL != cgi_data->contact_name) free(cgi_data->contact_name); if( NULL != cgi_data->contactgroup_member_name) free(cgi_data->contactgroup_member_name); if( NULL != cgi_data->timeperiod_name) free(cgi_data->timeperiod_name); if( NULL != cgi_data->check_timeperiod_name) free(cgi_data->check_timeperiod_name); if( NULL != cgi_data->host_notification_timeperiod_name) free(cgi_data->host_notification_timeperiod_name); if( NULL != cgi_data->service_notification_timeperiod_name) free(cgi_data->service_notification_timeperiod_name); if( NULL != cgi_data->command_name) free(cgi_data->command_name); if( NULL != cgi_data->check_command_name) free(cgi_data->check_command_name); if( NULL != cgi_data->event_handler_name) free(cgi_data->event_handler_name); if( NULL != cgi_data->master_host_name) free(cgi_data->master_host_name); if( NULL != cgi_data->master_hostgroup_name) free(cgi_data->master_hostgroup_name); if( NULL != cgi_data->master_service_description) free(cgi_data->master_service_description); if( NULL != cgi_data->master_servicegroup_name) free(cgi_data->master_servicegroup_name); if( NULL != cgi_data->dependent_host_name) free(cgi_data->dependent_host_name); if( NULL != cgi_data->dependent_hostgroup_name) free(cgi_data->dependent_hostgroup_name); if( NULL != cgi_data->dependent_service_description) free(cgi_data->dependent_service_description); if( NULL != cgi_data->dependent_servicegroup_name) free(cgi_data->dependent_servicegroup_name); } int process_cgivars(json_object *json_root, object_json_cgi_data *cgi_data, time_t query_time) { char **variables; int result = RESULT_SUCCESS; int x; authdata *authinfo = NULL; /* Currently always NULL because get_authentication_information() hasn't been called yet, but in case we want to use it in the future... */ variables = getcgivars(); for(x = 0; variables[x] != NULL; x++) { /* We set these each iteration because they could change with each iteration */ if(!strcmp(variables[x], "query")) { if((result = parse_enumeration_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], valid_queries, &(cgi_data->query))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "formatoptions")) { cgi_data->format_options = 0; if((result = parse_bitmask_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], svm_format_options, &(cgi_data->format_options))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "start")) { if((result = parse_int_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->start))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "count")) { if((result = parse_int_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->count))) != RESULT_SUCCESS) { break; } if(cgi_data->count == 0) { json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, RESULT_OPTION_VALUE_INVALID, "The count option value is invalid. " "It must be an integer greater than zero")); result = RESULT_OPTION_VALUE_INVALID; break; } x++; } else if(!strcmp(variables[x], "parenthost")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->parent_host_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "childhost")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->child_host_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "hostname")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->host_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "hostgroupmember")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->hostgroup_member_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "hostgroup")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->hostgroup_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "servicegroup")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->servicegroup_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "parentservice")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->parent_service_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "childservice")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->child_service_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "contactgroup")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->contactgroup_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "servicedescription")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->service_description))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "servicegroupmemberhost")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->servicegroup_member_host_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "servicegroupmemberservice")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->servicegroup_member_service_description))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "contactname")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->contact_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "contactgroupmember")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->contactgroup_member_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "timeperiod")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->timeperiod_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "checktimeperiod")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->check_timeperiod_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "hostnotificationtimeperiod")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->host_notification_timeperiod_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "servicenotificationtimeperiod")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->service_notification_timeperiod_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "command")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->command_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "checkcommand")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->check_command_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "eventhandler")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->event_handler_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "masterhostname")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->master_host_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "masterhostgroupname")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->master_hostgroup_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "masterservicedescription")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->master_service_description))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "masterservicegroupname")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->master_servicegroup_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "dependenthostname")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->dependent_host_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "dependenthostgroupname")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->dependent_hostgroup_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "dependentservicedescription")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->dependent_service_description))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "dependentservicegroupname")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->dependent_servicegroup_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "details")) { if((result = parse_boolean_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->details))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "dateformat")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->strftime_format))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "NagFormId")) ++x; else if(!strcmp(variables[x], "")); else { json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, RESULT_OPTION_INVALID, "Invalid option: '%s'.", variables[x])); result = RESULT_OPTION_INVALID; break; } } /* free memory allocated to the CGI variables */ free_cgivars(variables); return result; } int validate_arguments(json_object *json_root, object_json_cgi_data *cgi_data, time_t query_time) { int result = RESULT_SUCCESS; host *temp_host = NULL; hostgroup *temp_hostgroup = NULL; servicegroup *temp_servicegroup = NULL; service *temp_service = NULL; contactgroup *temp_contactgroup = NULL; contact *temp_contact = NULL; timeperiod *temp_timeperiod = NULL; command *temp_command = NULL; authdata *authinfo = NULL; /* Currently always NULL because get_authentication_information() hasn't been called yet, but in case we want to use it in the future... */ /* Validate that required parameters were supplied */ switch(cgi_data->query) { case OBJECT_QUERY_HOSTCOUNT: break; case OBJECT_QUERY_HOSTLIST: break; case OBJECT_QUERY_HOST: if( NULL == cgi_data->host_name) { result = RESULT_OPTION_MISSING; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "Host information requested, but no host name specified.")); } break; case OBJECT_QUERY_HOSTGROUPCOUNT: break; case OBJECT_QUERY_HOSTGROUPLIST: break; case OBJECT_QUERY_HOSTGROUP: if( NULL == cgi_data->hostgroup_name) { result = RESULT_OPTION_MISSING; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "Hostgroup information requested, but no hostgroup name specified.")); } break; case OBJECT_QUERY_SERVICECOUNT: break; case OBJECT_QUERY_SERVICELIST: break; case OBJECT_QUERY_SERVICE: if( NULL == cgi_data->host_name) { result = RESULT_OPTION_MISSING; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "Service information requested, but no host name specified.")); } if( NULL == cgi_data->service_description) { result = RESULT_OPTION_MISSING; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "Service information requested, but no service description specified.")); } break; case OBJECT_QUERY_SERVICEGROUPCOUNT: break; case OBJECT_QUERY_SERVICEGROUPLIST: break; case OBJECT_QUERY_SERVICEGROUP: if( NULL == cgi_data->servicegroup_name) { result = RESULT_OPTION_MISSING; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "Service group information requested, but no service group name specified.")); } break; case OBJECT_QUERY_CONTACTCOUNT: break; case OBJECT_QUERY_CONTACTLIST: break; case OBJECT_QUERY_CONTACT: if( NULL == cgi_data->contact_name) { result = RESULT_OPTION_MISSING; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "Contact information requested, but no contact name specified.")); } break; case OBJECT_QUERY_CONTACTGROUPCOUNT: break; case OBJECT_QUERY_CONTACTGROUPLIST: break; case OBJECT_QUERY_CONTACTGROUP: if( NULL == cgi_data->contactgroup_name) { result = RESULT_OPTION_MISSING; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "Contactgroup information requested, but no contactgroup name specified.")); } break; case OBJECT_QUERY_TIMEPERIODCOUNT: break; case OBJECT_QUERY_TIMEPERIODLIST: break; case OBJECT_QUERY_TIMEPERIOD: if( NULL == cgi_data->timeperiod_name) { result = RESULT_OPTION_MISSING; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "Timeperiod information requested, but no timeperiod name specified.")); } break; case OBJECT_QUERY_COMMANDCOUNT: break; case OBJECT_QUERY_COMMANDLIST: break; case OBJECT_QUERY_COMMAND: if( NULL == cgi_data->command_name) { result = RESULT_OPTION_MISSING; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "Command information requested, but no command name specified.")); } break; case OBJECT_QUERY_SERVICEDEPENDENCYCOUNT: break; case OBJECT_QUERY_SERVICEDEPENDENCYLIST: break; case OBJECT_QUERY_SERVICEESCALATIONCOUNT: break; case OBJECT_QUERY_SERVICEESCALATIONLIST: break; case OBJECT_QUERY_HOSTDEPENDENCYCOUNT: break; case OBJECT_QUERY_HOSTDEPENDENCYLIST: break; case OBJECT_QUERY_HOSTESCALATIONCOUNT: break; case OBJECT_QUERY_HOSTESCALATIONLIST: break; case OBJECT_QUERY_HELP: break; default: result = RESULT_OPTION_MISSING; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "Missing validation for object type %u.", cgi_data->query)); break; } /* Validate the requested parent host */ if( NULL != cgi_data->parent_host_name) { cgi_data->use_parent_host = 1; cgi_data->parent_host = NULL; if(strcmp(cgi_data->parent_host_name, "none")) { temp_host = find_host(cgi_data->parent_host_name); if( NULL == temp_host) { cgi_data->use_parent_host = 0; result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The parenthost '%s' could not be found.", cgi_data->parent_host_name)); } else { cgi_data->parent_host = temp_host; } } } /* Validate the requested child host */ if( NULL != cgi_data->child_host_name) { cgi_data->use_child_host = 1; cgi_data->child_host = NULL; if(strcmp(cgi_data->child_host_name, "none")) { temp_host = find_host(cgi_data->child_host_name); if( NULL == temp_host) { cgi_data->use_child_host = 0; result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The childhost '%s' could not be found.", cgi_data->child_host_name)); } else { cgi_data->child_host = temp_host; } } } /* Validate the requested host */ if( NULL != cgi_data->host_name) { temp_host = find_host(cgi_data->host_name); if( NULL == temp_host) { result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The host '%s' could not be found.", cgi_data->host_name)); } else { cgi_data->host = temp_host; } } /* Validate the requested hostgroup member */ if( NULL != cgi_data->hostgroup_member_name) { temp_host = find_host(cgi_data->hostgroup_member_name); if( NULL == temp_host) { result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The hostgroup member '%s' could not be found.", cgi_data->hostgroup_member_name)); } else { cgi_data->hostgroup_member = temp_host; } } /* Validate the requested hostgroup */ if( NULL != cgi_data->hostgroup_name) { temp_hostgroup = find_hostgroup(cgi_data->hostgroup_name); if( NULL == temp_hostgroup) { result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The hostgroup '%s' could not be found.", cgi_data->hostgroup_name)); } else { cgi_data->hostgroup = temp_hostgroup; } } /* Validate the requested servicegroup */ if( NULL != cgi_data->servicegroup_name) { temp_servicegroup = find_servicegroup(cgi_data->servicegroup_name); if( NULL == temp_servicegroup) { result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The servicegroup '%s' could not be found.", cgi_data->servicegroup_name)); } else { cgi_data->servicegroup = temp_servicegroup; } } /* Validate the requested contactgroup */ if( NULL != cgi_data->contactgroup_name) { temp_contactgroup = find_contactgroup(cgi_data->contactgroup_name); if( NULL == temp_contactgroup) { result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The contactgroup '%s' could not be found.", cgi_data->contactgroup_name)); } else { cgi_data->contactgroup = temp_contactgroup; } } /* Validate the requested service. Note that the host name is not a required parameter for all queries and so it may not make sense to try to obtain the service associated with a service description */ if((NULL != cgi_data->service_description) && (NULL != cgi_data->host_name)) { temp_service = find_service(cgi_data->host_name, cgi_data->service_description); if( NULL == temp_service) { result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The service '%s' on host '%s' could not be found.", cgi_data->service_description, cgi_data->host_name)); } else { cgi_data->service = temp_service; } } /* Validate the requested servicegroup member host name and service description */ if( NULL != cgi_data->servicegroup_member_host_name || NULL != cgi_data->servicegroup_member_service_description) { if( NULL == cgi_data->servicegroup_member_host_name || NULL == cgi_data->servicegroup_member_service_description) { result = RESULT_OPTION_VALUE_MISSING; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "If either the servicegroupmemberhost or servicegroupmemberservice is specified, both must be specified.")); } else { temp_service = find_service( cgi_data->servicegroup_member_host_name, cgi_data->servicegroup_member_service_description); if( NULL == temp_service) { result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The servicegroup member service '%s' on host '%s' could not be found.", cgi_data->servicegroup_member_service_description, cgi_data->servicegroup_member_host_name)); } else { cgi_data->servicegroup_member = temp_service; } } } /* Validate the requested contact */ if( NULL != cgi_data->contact_name) { temp_contact = find_contact(cgi_data->contact_name); if( NULL == temp_contact) { result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The contact '%s' could not be found.", cgi_data->contact_name)); } else { cgi_data->contact = temp_contact; } } /* Validate the requested contactgroup member */ if( NULL != cgi_data->contactgroup_member_name) { temp_contact = find_contact(cgi_data->contactgroup_member_name); if( NULL == temp_contact) { result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The contactgroup member '%s' could not be found.", cgi_data->contactgroup_member_name)); } else { cgi_data->contactgroup_member = temp_contact; } } /* Validate the requested timeperiod */ if( NULL != cgi_data->timeperiod_name) { temp_timeperiod = find_timeperiod(cgi_data->timeperiod_name); if( NULL == temp_timeperiod) { result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The timeperiod '%s' could not be found.", cgi_data->timeperiod_name)); } else { cgi_data->timeperiod = temp_timeperiod; } } /* Validate the requested check timeperiod */ if( NULL != cgi_data->check_timeperiod_name) { temp_timeperiod = find_timeperiod(cgi_data->check_timeperiod_name); if( NULL == temp_timeperiod) { result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The check timeperiod '%s' could not be found.", cgi_data->check_timeperiod_name)); } else { cgi_data->check_timeperiod = temp_timeperiod; } } /* Validate the requested host notification timeperiod */ if( NULL != cgi_data->host_notification_timeperiod_name) { temp_timeperiod = find_timeperiod(cgi_data->host_notification_timeperiod_name); if( NULL == temp_timeperiod) { result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The host notification timeperiod '%s' could not be found.", cgi_data->host_notification_timeperiod_name)); } else { cgi_data->host_notification_timeperiod = temp_timeperiod; } } /* Validate the requested service notification timeperiod */ if( NULL != cgi_data->service_notification_timeperiod_name) { temp_timeperiod = find_timeperiod(cgi_data->service_notification_timeperiod_name); if( NULL == temp_timeperiod) { result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The service notification timeperiod '%s' could not be found.", cgi_data->service_notification_timeperiod_name)); } else { cgi_data->service_notification_timeperiod = temp_timeperiod; } } /* Validate the requested command */ if( NULL != cgi_data->command_name) { temp_command = find_command(cgi_data->command_name); if( NULL == temp_command) { result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The command '%s' could not be found.", cgi_data->command_name)); } else { cgi_data->command = temp_command; } } /* Validate the requested check command */ if( NULL != cgi_data->check_command_name) { temp_command = find_command(cgi_data->check_command_name); if( NULL == temp_command) { result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The check command '%s' could not be found.", cgi_data->check_command_name)); } else { cgi_data->check_command = temp_command; } } /* Validate the requested event handler */ if( NULL != cgi_data->event_handler_name) { temp_command = find_command(cgi_data->event_handler_name); if( NULL == temp_command) { result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The event handler '%s' could not be found.", cgi_data->event_handler_name)); } else { cgi_data->event_handler = temp_command; } } /* Validate the requested master host */ if( NULL != cgi_data->master_host_name) { temp_host = find_host(cgi_data->master_host_name); if( NULL == temp_host) { result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The master host '%s' could not be found.", cgi_data->master_host_name)); } else { cgi_data->master_host = temp_host; } } /* Validate the requested master hostgroup */ if( NULL != cgi_data->master_hostgroup_name) { temp_hostgroup = find_hostgroup(cgi_data->master_hostgroup_name); if( NULL == temp_hostgroup) { result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The master hostgroup '%s' could not be found.", cgi_data->master_hostgroup_name)); } else { cgi_data->master_hostgroup = temp_hostgroup; } } /* Validate the requested master servicegroup */ if( NULL != cgi_data->master_servicegroup_name) { temp_servicegroup = find_servicegroup(cgi_data->master_servicegroup_name); if( NULL == temp_servicegroup) { result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The master servicegroup '%s' could not be found.", cgi_data->master_servicegroup_name)); } else { cgi_data->master_servicegroup = temp_servicegroup; } } /* Validate the requested dependent host */ if( NULL != cgi_data->dependent_host_name) { temp_host = find_host(cgi_data->dependent_host_name); if( NULL == temp_host) { result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The dependent host '%s' could not be found.", cgi_data->dependent_host_name)); } else { cgi_data->dependent_host = temp_host; } } /* Validate the requested dependent hostgroup */ if( NULL != cgi_data->dependent_hostgroup_name) { temp_hostgroup = find_hostgroup(cgi_data->dependent_hostgroup_name); if( NULL == temp_hostgroup) { result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The dependent hostgroup '%s' could not be found.", cgi_data->dependent_hostgroup_name)); } else { cgi_data->dependent_hostgroup = temp_hostgroup; } } /* Validate the requested dependent servicegroup */ if( NULL != cgi_data->dependent_servicegroup_name) { temp_servicegroup = find_servicegroup(cgi_data->dependent_servicegroup_name); if( NULL == temp_servicegroup) { result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The dependent servicegroup '%s' could not be found.", cgi_data->dependent_servicegroup_name)); } else { cgi_data->dependent_servicegroup = temp_servicegroup; } } return result; } json_object * json_object_custom_variables(struct customvariablesmember *custom_variables) { json_object *json_custom_variables; customvariablesmember *temp_custom_variablesmember; json_custom_variables = json_new_object(); for(temp_custom_variablesmember = custom_variables; temp_custom_variablesmember != NULL; temp_custom_variablesmember = temp_custom_variablesmember->next) { json_object_append_string(json_custom_variables, temp_custom_variablesmember->variable_name, &percent_escapes, temp_custom_variablesmember->variable_value); } return json_custom_variables; } int json_object_host_passes_selection(host *temp_host, int use_parent_host, host *parent_host, int use_child_host, host *child_host, hostgroup *temp_hostgroup, contact *temp_contact, contactgroup *temp_contactgroup, timeperiod *check_timeperiod, timeperiod *notification_timeperiod, command *check_command, command *event_handler) { host *temp_host2; /* Skip if user is not authorized for this host */ if(FALSE == is_authorized_for_host(temp_host, ¤t_authdata)) { return 0; } /* If the host parent was specified, skip this host if it's parent is not the parent host specified */ if( 1 == use_parent_host && FALSE == is_host_immediate_child_of_host(parent_host, temp_host)) { return 0; } /* If the hostgroup was specified, skip this host if it is not a member of the hostgroup specified */ if( NULL != temp_hostgroup && ( FALSE == is_host_member_of_hostgroup(temp_hostgroup, temp_host))) { return 0; } /* If the contact was specified, skip this host if it does not have the contact specified */ if( NULL != temp_contact && ( FALSE == is_contact_for_host(temp_host, temp_contact))) { return 0; } /* If a contactgroup was specified, skip this host if it does not have the contactgroup specified */ if(NULL != temp_contactgroup && (FALSE == is_contactgroup_for_host(temp_host, temp_contactgroup))) { return 0; } /* If a check timeperiod was specified, skip this host if it does not have the check timeperiod specified */ if(NULL != check_timeperiod && (check_timeperiod != temp_host->check_period_ptr)) { return 0; } /* If a notification timeperiod was specified, skip this host if it does not have the notification timeperiod specified */ if(NULL != notification_timeperiod && (notification_timeperiod != temp_host->notification_period_ptr)) { return 0; } /* If a check command was specified, skip this host if it does not have the check command specified */ if(NULL != check_command && (check_command != temp_host->check_command_ptr)) { return 0; } /* If an event handler was specified, skip this host if it does not have the event handler specified */ if(NULL != event_handler && (event_handler != temp_host->event_handler_ptr)) { return 0; } /* If a child host was specified... */ if(1 == use_child_host) { /* If the child host is "none", skip this host if it has children */ if(NULL == child_host) { for(temp_host2 = host_list; temp_host2 != NULL; temp_host2 = temp_host2->next) { if(TRUE == is_host_immediate_child_of_host(temp_host, temp_host2)) { return 0; } } } /* Otherwise, skip this host if it does not have the specified host as a child */ else if(FALSE == is_host_immediate_child_of_host(temp_host, child_host)) { return 0; } } return 1; } json_object * json_object_host_selectors(int start, int count, int use_parent_host, host *parent_host, int use_child_host, host *child_host, hostgroup *temp_hostgroup, contact *temp_contact, contactgroup *temp_contactgroup, timeperiod *check_timeperiod, timeperiod *notification_timeperiod, command *check_command, command *event_handler) { json_object *json_selectors; json_selectors = json_new_object(); if( start > 0) { json_object_append_integer(json_selectors, "start", start); } if( count > 0) { json_object_append_integer(json_selectors, "count", count); } if( 1 == use_parent_host) { json_object_append_string(json_selectors, "parenthost", &percent_escapes, ( NULL == parent_host ? "none" : parent_host->name)); } if( 1 == use_child_host) { json_object_append_string(json_selectors, "childhost", &percent_escapes, ( NULL == child_host ? "none" : child_host->name)); } if( NULL != temp_hostgroup) { json_object_append_string(json_selectors, "hostgroup", &percent_escapes, temp_hostgroup->group_name); } if( NULL != temp_contact) { json_object_append_string(json_selectors, "contact", &percent_escapes, temp_contact->name); } if( NULL != temp_contactgroup) { json_object_append_string(json_selectors, "contactgroup", &percent_escapes, temp_contactgroup->group_name); } if( NULL != check_timeperiod) { json_object_append_string(json_selectors, "checktimeperiod", &percent_escapes, check_timeperiod->name); } if( NULL != notification_timeperiod) { json_object_append_string(json_selectors, "hostnotificationtimeperiod", &percent_escapes, notification_timeperiod->name); } if( NULL != check_command) { json_object_append_string(json_selectors, "checkcommand", &percent_escapes, check_command->name); } if( NULL != event_handler) { json_object_append_string(json_selectors, "eventhandler", &percent_escapes, event_handler->name); } return json_selectors; } json_object * json_object_hostcount(int use_parent_host, host *parent_host, int use_child_host, host *child_host, hostgroup *temp_hostgroup, contact *temp_contact, contactgroup *temp_contactgroup, timeperiod *check_timeperiod, timeperiod *notification_timeperiod, command *check_command, command *event_handler) { json_object *json_data; host *temp_host; int count = 0; json_data = json_new_object(); json_object_append_object(json_data, "selectors", json_object_host_selectors(0, 0, use_parent_host, parent_host, use_child_host, child_host, temp_hostgroup, temp_contact, temp_contactgroup, check_timeperiod, notification_timeperiod, check_command, event_handler)); for(temp_host = host_list; temp_host != NULL; temp_host = temp_host->next) { if(json_object_host_passes_selection(temp_host, use_parent_host, parent_host, use_child_host, child_host, temp_hostgroup, temp_contact, temp_contactgroup, check_timeperiod, notification_timeperiod, check_command, event_handler) == 0) { continue; } count++; } json_object_append_integer(json_data, "count", count); return json_data; } json_object * json_object_hostlist(unsigned format_options, int start, int count, int details, int use_parent_host, host *parent_host, int use_child_host, host *child_host, hostgroup *temp_hostgroup, contact *temp_contact, contactgroup *temp_contactgroup, timeperiod *check_timeperiod, timeperiod *notification_timeperiod, command *check_command, command *event_handler) { json_object *json_data; json_object *json_hostlist_object = NULL; json_array *json_hostlist_array = NULL; json_object *json_host_details; host *temp_host; int current = 0; int counted = 0; json_data = json_new_object(); json_object_append_object(json_data, "selectors", json_object_host_selectors(start, count, use_parent_host, parent_host, use_child_host, child_host, temp_hostgroup, temp_contact, temp_contactgroup, check_timeperiod, notification_timeperiod, check_command, event_handler)); if(details > 0) { json_hostlist_object = json_new_object(); } else { json_hostlist_array = json_new_array(); } for(temp_host = host_list; temp_host != NULL; temp_host = temp_host->next) { if(json_object_host_passes_selection(temp_host, use_parent_host, parent_host, use_child_host, child_host, temp_hostgroup, temp_contact, temp_contactgroup, check_timeperiod, notification_timeperiod, check_command, event_handler) == 0) { continue; } /* If the current item passes the start and limit tests, display it */ if( passes_start_and_count_limits(start, count, current, counted)) { if( details > 0) { json_host_details = json_new_object(); json_object_host_details(json_host_details, format_options, temp_host); json_object_append_object(json_hostlist_object, temp_host->name, json_host_details); } else { json_array_append_string(json_hostlist_array, &percent_escapes, temp_host->name); } counted++; } current++; } if(details > 0) { json_object_append_object(json_data, "hostlist", json_hostlist_object); } else { json_object_append_array(json_data, "hostlist", json_hostlist_array); } return json_data; } json_object *json_object_host(unsigned format_options, host *temp_host) { json_object *json_host = json_new_object(); json_object *json_details = json_new_object(); json_object_append_string(json_details, "name", &percent_escapes, temp_host->name); json_object_host_details(json_details, format_options, temp_host); json_object_append_object(json_host, "host", json_details); return json_host; } void json_object_host_details(json_object *json_details, unsigned format_options, host *temp_host) { json_array *json_parent_hosts; json_array *json_child_hosts; json_array *json_services; json_array *json_contactgroups; json_array *json_contacts; hostsmember *temp_hostsmember; servicesmember *temp_servicesmember; contactgroupsmember *temp_contact_groupsmember; #ifdef NSCORE contactsmember *temp_contactsmember; #else contact *temp_contact; #endif json_object_append_string(json_details, "name", &percent_escapes, temp_host->name); json_object_append_string(json_details, "display_name", &percent_escapes, temp_host->display_name); json_object_append_string(json_details, "alias", &percent_escapes, temp_host->alias); json_object_append_string(json_details, "address", &percent_escapes, temp_host->address); json_parent_hosts = json_new_array(); for(temp_hostsmember = temp_host->parent_hosts; temp_hostsmember != NULL; temp_hostsmember = temp_hostsmember->next) { json_array_append_string(json_parent_hosts, &percent_escapes, temp_hostsmember->host_name); } json_object_append_array(json_details, "parent_hosts", json_parent_hosts); json_child_hosts = json_new_array(); for(temp_hostsmember = temp_host->child_hosts; temp_hostsmember != NULL; temp_hostsmember = temp_hostsmember->next) { json_array_append_string(json_child_hosts, &percent_escapes, temp_hostsmember->host_name); } json_object_append_array(json_details, "child_hosts", json_child_hosts); json_services = json_new_array(); for(temp_servicesmember = temp_host->services; temp_servicesmember != NULL; temp_servicesmember = temp_servicesmember->next) { json_array_append_string(json_services, &percent_escapes, temp_servicesmember->service_description); } json_object_append_array(json_details, "services", json_services); #ifdef JSON_NAGIOS_4X json_object_append_string(json_details, "check_command", &percent_escapes, temp_host->check_command); #else json_object_append_string(json_details, "host_check_command", &percent_escapes, temp_host->host_check_command); #endif json_enumeration(json_details, format_options, "initial_state", temp_host->initial_state, svm_host_states); json_object_append_real(json_details, "check_interval", temp_host->check_interval); json_object_append_real(json_details, "retry_interval", temp_host->retry_interval); json_object_append_integer(json_details, "max_attempts", temp_host->max_attempts); json_object_append_string(json_details, "event_handler", &percent_escapes, temp_host->event_handler); json_contactgroups = json_new_array(); for(temp_contact_groupsmember = temp_host->contact_groups; temp_contact_groupsmember != NULL; temp_contact_groupsmember = temp_contact_groupsmember->next) { json_array_append_string(json_contactgroups, &percent_escapes, temp_contact_groupsmember->group_name); } json_object_append_array(json_details, "contact_groups", json_contactgroups); json_contacts = json_new_array(); #ifdef NSCORE for(temp_contactsmember = temp_host->contacts; temp_contactsmember != NULL; temp_contactsmember = temp_contactsmember->next) { json_array_append_string(json_contacts, &percent_escapes, temp_contactsmember->contact_name); } #else for(temp_contact = contact_list; temp_contact != NULL; temp_contact = temp_contact->next) { if(TRUE == is_contact_for_host(temp_host, temp_contact)) { json_array_append_string(json_contacts, &percent_escapes, temp_contact->name); } } #endif json_object_append_array(json_details, "contacts", json_contacts); json_object_append_real(json_details, "notification_interval", temp_host->notification_interval); json_object_append_real(json_details, "first_notification_delay", temp_host->first_notification_delay); #ifdef JSON_NAGIOS_4X #if 0 if( CORE3_COMPATIBLE) { json_object_append_boolean(json_details, "notify_on_down", flag_isset(temp_host->notification_options, OPT_DOWN)); json_object_append_boolean(json_details, "notify_on_unreachable", flag_isset(temp_host->notification_options, OPT_UNREACHABLE)); json_object_append_boolean(json_details, "notify_on_recovery", flag_isset(temp_host->notification_options, OPT_RECOVERY)); json_object_append_boolean(json_details, "notify_on_flapping", flag_isset(temp_host->notification_options, OPT_FLAPPING)); json_object_append_boolean(json_details, "notify_on_downtime", flag_isset(temp_host->notification_options, OPT_DOWNTIME)); } else { #endif json_bitmask(json_details, format_options, "notifications_options", temp_host->notification_options, svm_option_types); #if 0 } #endif #else json_object_append_boolean(json_details, "notify_on_down", temp_host->notify_on_down); json_object_append_boolean(json_details, "notify_on_unreachable", temp_host->notify_on_unreachable); json_object_append_boolean(json_details, "notify_on_recovery", temp_host->notify_on_recovery); json_object_append_boolean(json_details, "notify_on_flapping", temp_host->notify_on_flapping); json_object_append_boolean(json_details, "notify_on_downtime", temp_host->notify_on_downtime); #endif json_object_append_string(json_details, "notification_period", &percent_escapes, temp_host->notification_period); json_object_append_string(json_details, "check_period", &percent_escapes, temp_host->check_period); json_object_append_boolean(json_details, "flap_detection_enabled", temp_host->flap_detection_enabled); json_object_append_real(json_details, "low_flap_threshold", temp_host->low_flap_threshold); json_object_append_real(json_details, "high_flap_threshold", temp_host->high_flap_threshold); #ifdef JSON_NAGIOS_4X #if 0 if( CORE3_COMPATIBLE) { json_object_append_boolean(json_details "flap_detection_on_up", flag_isset(temp_host->flap_detection_options, OPT_UP)); json_object_append_boolean(json_details "flap_detection_on_down", flag_isset(temp_host->flap_detection_options, OPT_DOWN)); json_object_append_boolean(json_details "flap_detection_on_unreachable", flag_isset(temp_host->flap_detection_options, OPT_UNREACHABLE)); } else { #endif json_bitmask(json_details, format_options, "flap_detection_options", temp_host->flap_detection_options, svm_option_types); #if 0 } #endif #else json_object_append_boolean(json_details, "flap_detection_on_up", temp_host->flap_detection_on_up); json_object_append_boolean(json_details, "flap_detection_on_down", temp_host->flap_detection_on_down); json_object_append_boolean(json_details, "flap_detection_on_unreachable", temp_host->flap_detection_on_unreachable); #endif #ifdef JSON_NAGIOS_4X #if 0 if( CORE3_COMPATIBLE) { json_object_append_boolean(json_details, "stalk_on_up", flag_isset(temp_host->stalking_options, OPT_UP)); json_object_append_boolean(json_details, "stalk_on_down", flag_isset(temp_host->stalking_options, OPT_DOWN)); json_object_append_boolean(json_details, "stalk_on_unreachable", flag_isset(temp_host->stalking_options, OPT_UNREACHABLE)); } else { #endif json_bitmask(json_details, format_options, "stalking_options", temp_host->stalking_options, svm_option_types); #if 0 } #endif #else json_object_append_boolean(json_details, "stalk_on_up", temp_host->stalk_on_up); json_object_append_boolean(json_details, "stalk_on_down", temp_host->stalk_on_down); json_object_append_boolean(json_details, "stalk_on_unreachable", temp_host->stalk_on_unreachable); #endif json_object_append_boolean(json_details, "check_freshness", temp_host->check_freshness); json_object_append_integer(json_details, "freshness_threshold", temp_host->freshness_threshold); json_object_append_boolean(json_details, "process_performance_data", temp_host->process_performance_data); json_object_append_boolean(json_details, "checks_enabled", temp_host->checks_enabled); #ifdef JSON_NAGIOS_4X #if 0 if( CORE3_COMPATIBLE) { json_object_append_boolean(json_details, "accept_passive_host_checks", temp_host->accept_passive_checks); } else { #endif json_object_append_boolean(json_details, "accept_passive_checks", temp_host->accept_passive_checks); #if 0 } #endif #else json_object_append_boolean(json_details, "accept_passive_host_checks", temp_host->accept_passive_host_checks); #endif json_object_append_boolean(json_details, "event_handler_enabled", temp_host->event_handler_enabled); json_object_append_boolean(json_details, "retain_status_information", temp_host->retain_status_information); json_object_append_boolean(json_details, "retain_nonstatus_information", temp_host->retain_nonstatus_information); #ifndef JSON_NAGIOS_4X json_object_append_boolean(json_details, "failure_prediction_enabled", temp_host->failure_prediction_enabled); json_object_append_string(json_details, "failure_prediction_options", NULL, temp_host->failure_prediction_options); #endif #ifdef JSON_NAGIOS_4X #if 0 if( CORE3_COMPATIBLE) { json_object_append_boolean(json_details, "obsess_over_host", temp_host->obsess); } else { #endif json_object_append_boolean(json_details, "obsess", temp_host->obsess); #if 0 } #endif #else json_object_append_boolean(json_details, "obsess_over_host", temp_host->obsess_over_host); #endif #ifdef JSON_NAGIOS_4X json_object_append_integer(json_details, "hourly_value", temp_host->hourly_value); #endif json_object_append_string(json_details, "notes", &percent_escapes, temp_host->notes); json_object_append_string(json_details, "notes_url", &percent_escapes, temp_host->notes_url); json_object_append_string(json_details, "action_url", &percent_escapes, temp_host->action_url); json_object_append_string(json_details, "icon_image", &percent_escapes, temp_host->icon_image); json_object_append_string(json_details, "icon_image_alt", &percent_escapes, temp_host->icon_image_alt); json_object_append_string(json_details, "vrml_image", &percent_escapes, temp_host->vrml_image); json_object_append_string(json_details, "statusmap_image", &percent_escapes, temp_host->statusmap_image); json_object_append_boolean(json_details, "have_2d_coords", temp_host->have_2d_coords); json_object_append_integer(json_details, "x_2d", temp_host->x_2d); json_object_append_integer(json_details, "y_2d", temp_host->y_2d); json_object_append_boolean(json_details, "have_3d_coords", temp_host->have_3d_coords); json_object_append_real(json_details, "x_3d", temp_host->x_3d); json_object_append_real(json_details, "y_3d", temp_host->y_3d); json_object_append_real(json_details, "z_3d", temp_host->z_3d); json_object_append_boolean(json_details, "should_be_drawn", temp_host->should_be_drawn); json_object_append_object(json_details, "custom_variables", json_object_custom_variables(temp_host->custom_variables)); } int json_object_hostgroup_passes_selection(hostgroup *temp_hostgroup, host *temp_hostgroup_member) { /* Skip if user is not authorized for this hostgroup */ if(FALSE == is_authorized_for_hostgroup(temp_hostgroup, ¤t_authdata)) { return 0; } /* Skip if a hostgroup member is specified and the hostgroup member host is not a member of the hostgroup */ if( NULL != temp_hostgroup_member && ( FALSE == is_host_member_of_hostgroup(temp_hostgroup, temp_hostgroup_member))) { return 0; } return 1; } json_object *json_object_hostgroup_selectors(int start, int count, host *temp_hostgroup_member) { json_object *json_selectors; json_selectors = json_new_object(); if( start > 0) { json_object_append_integer(json_selectors, "start", start); } if( count > 0) { json_object_append_integer(json_selectors, "count", count); } if( NULL != temp_hostgroup_member) { json_object_append_string(json_selectors, "hostgroupmember", &percent_escapes, temp_hostgroup_member->name); } return json_selectors; } json_object *json_object_hostgroupcount(unsigned format_options, host *temp_hostgroup_member) { json_object *json_data; hostgroup *temp_hostgroup; int count = 0; json_data = json_new_object(); json_object_append_object(json_data, "selectors", json_object_hostgroup_selectors(0, 0, temp_hostgroup_member)); for(temp_hostgroup = hostgroup_list; temp_hostgroup != NULL; temp_hostgroup = temp_hostgroup->next) { if(json_object_hostgroup_passes_selection(temp_hostgroup, temp_hostgroup_member) == 0) { continue; } count++; } json_object_append_integer(json_data, "count", count); return json_data; } json_object *json_object_hostgrouplist(unsigned format_options, int start, int count, int details, host *temp_hostgroup_member) { json_object *json_data; json_object *json_hostgrouplist_object = NULL; json_array *json_hostgrouplist_array = NULL; json_object *json_hostgroup_details; hostgroup *temp_hostgroup; int current = 0; int counted = 0; json_data = json_new_object(); json_object_append_object(json_data, "selectors", json_object_hostgroup_selectors(start, count, temp_hostgroup_member)); if(details > 0) { json_hostgrouplist_object = json_new_object(); } else { json_hostgrouplist_array = json_new_array(); } for(temp_hostgroup = hostgroup_list; temp_hostgroup != NULL; temp_hostgroup = temp_hostgroup->next) { if(json_object_hostgroup_passes_selection(temp_hostgroup, temp_hostgroup_member) == 0) { continue; } /* If the current item passes the start and limit tests, display it */ if( passes_start_and_count_limits(start, count, current, counted)) { if( details > 0) { json_hostgroup_details = json_new_object(); json_object_hostgroup_details(json_hostgroup_details, format_options, temp_hostgroup); json_object_append_object(json_hostgrouplist_object, temp_hostgroup->group_name, json_hostgroup_details); } else { json_array_append_string(json_hostgrouplist_array, &percent_escapes, temp_hostgroup->group_name); } counted++; } current++; } if(details > 0) { json_object_append_object(json_data, "hostgrouplist", json_hostgrouplist_object); } else { json_object_append_array(json_data, "hostgrouplist", json_hostgrouplist_array); } return json_data; } json_object *json_object_hostgroup(unsigned format_options, hostgroup *temp_hostgroup) { json_object *json_hostgroup = json_new_object(); json_object *json_details = json_new_object(); json_object_append_string(json_details, "group_name", &percent_escapes, temp_hostgroup->group_name); json_object_hostgroup_details(json_details, format_options, temp_hostgroup); json_object_append_object(json_hostgroup, "hostgroup", json_details); return json_hostgroup; } void json_object_hostgroup_details(json_object *json_details, unsigned format_options, hostgroup *temp_hostgroup) { json_array *json_members; hostsmember *temp_member; json_object_append_string(json_details, "group_name", &percent_escapes, temp_hostgroup->group_name); json_object_append_string(json_details, "alias", &percent_escapes, temp_hostgroup->alias); json_members = json_new_array(); for(temp_member = temp_hostgroup->members; temp_member != NULL; temp_member = temp_member->next) { json_array_append_string(json_members, &percent_escapes, temp_member->host_name); } json_object_append_array(json_details, "members", json_members); json_object_append_string(json_details, "notes", &percent_escapes, temp_hostgroup->notes); json_object_append_string(json_details, "notes_url", &percent_escapes, temp_hostgroup->notes_url); json_object_append_string(json_details, "action_url", &percent_escapes, temp_hostgroup->action_url); } int json_object_service_passes_host_selection(host *temp_host, int use_parent_host, host *parent_host, int use_child_host, host *child_host, hostgroup *temp_hostgroup, host *match_host) { host *temp_host2; /* Skip if user is not authorized for this host */ if(FALSE == is_authorized_for_host(temp_host, ¤t_authdata)) { return 0; } /* If the host parent was specified, skip the services whose host is not a child of the parent host specified */ if( 1 == use_parent_host && NULL != temp_host && FALSE == is_host_immediate_child_of_host(parent_host, temp_host)) { return 0; } /* If the hostgroup was specified, skip the services on hosts that are not members of the hostgroup specified */ if( NULL != temp_hostgroup && NULL != temp_host && ( FALSE == is_host_member_of_hostgroup(temp_hostgroup, temp_host))) { return 0; } /* If the host was specified, skip the services not on the host specified */ if( NULL != match_host && NULL != temp_host && temp_host != match_host) { return 0; } /* If a child host was specified... */ if(1 == use_child_host) { /* If the child host is "none", skip this host if it has children */ if(NULL == child_host) { for(temp_host2 = host_list; temp_host2 != NULL; temp_host2 = temp_host2->next) { if(TRUE == is_host_immediate_child_of_host(temp_host, temp_host2)) { return 0; } } } /* Otherwise, skip this host if it does not have the specified host as a child */ else if(FALSE == is_host_immediate_child_of_host(temp_host, child_host)) { return 0; } } return 1; } int json_object_service_passes_service_selection(service *temp_service, servicegroup *temp_servicegroup, contact *temp_contact, char *service_description, char *parent_service_name, char *child_service_name, contactgroup *temp_contactgroup, timeperiod *check_timeperiod, timeperiod *notification_timeperiod, command *check_command, command *event_handler) { servicesmember *temp_servicesmember; /* Skip if user is not authorized for this service */ if(FALSE == is_authorized_for_service(temp_service, ¤t_authdata)) { return 0; } /* If the servicegroup was specified, skip the services that are not members of the servicegroup specified */ if( NULL != temp_servicegroup && ( FALSE == is_service_member_of_servicegroup(temp_servicegroup, temp_service))) { return 0; } /* If the contact was specified, skip the services that do not have the contact specified */ if( NULL != temp_contact && ( FALSE == is_contact_for_service(temp_service, temp_contact))) { return 0; } /* If a contactgroup was specified, skip the services that do not have the contactgroup specified */ if(NULL != temp_contactgroup && (FALSE == is_contactgroup_for_service(temp_service, temp_contactgroup))) { return 0; } /* If the service description was supplied, skip the services that do not have this service description */ if((NULL != service_description) && strcmp(temp_service->description, service_description)) { return 0; } /* If a check timeperiod was specified, skip this service if it does not have the check timeperiod specified */ if(NULL != check_timeperiod && (check_timeperiod != temp_service->check_period_ptr)) { return 0; } /* If a notification timeperiod was specified, skip this service if it does not have the notification timeperiod specified */ if(NULL != notification_timeperiod && (notification_timeperiod != temp_service->notification_period_ptr)) { return 0; } /* If a check command was specified, skip this service if it does not have the check command specified */ if(NULL != check_command && (check_command != temp_service->check_command_ptr)) { return 0; } /* If an event handler was specified, skip this service if it does not have the event handler specified */ if(NULL != event_handler && (event_handler != temp_service->event_handler_ptr)) { return 0; } /* If a parent service was specified... */ if(NULL != parent_service_name) { /* If the parent service is "none", skip this service if it has parentren */ if(!strcmp(parent_service_name,"none")) { if(NULL != temp_service->parents) { return 0; } } /* Otherwise, skip this service if it does not have the specified service as a parent */ else { int found = 0; for(temp_servicesmember = temp_service->parents; temp_servicesmember != NULL; temp_servicesmember = temp_servicesmember->next) { if(!strcmp(temp_servicesmember->service_description, parent_service_name)) { found = 1; } } if(0 == found) { return 0; } } } /* If a child service was specified... */ if(NULL != child_service_name) { /* If the child service is "none", skip this service if it has children */ if(!strcmp(child_service_name,"none")) { if(NULL != temp_service->children) { return 0; } } /* Otherwise, skip this service if it does not have the specified service as a child */ else { int found = 0; for(temp_servicesmember = temp_service->children; temp_servicesmember != NULL; temp_servicesmember = temp_servicesmember->next) { if(!strcmp(temp_servicesmember->service_description, child_service_name)) { found = 1; } } if(0 == found) { return 0; } } } return 1; } json_object *json_object_service_selectors(int start, int count, int use_parent_host, host *parent_host, int use_child_host, host *child_host, hostgroup *temp_hostgroup, host *match_host, servicegroup *temp_servicegroup, contact *temp_contact, char *service_description, char *parent_service_name, char *child_service_name, contactgroup *temp_contactgroup, timeperiod *check_timeperiod, timeperiod *notification_timeperiod, command *check_command, command *event_handler) { json_object *json_selectors; json_selectors = json_new_object(); if( start > 0) { json_object_append_integer(json_selectors, "start", start); } if( count > 0) { json_object_append_integer(json_selectors, "count", count); } if( NULL != match_host) { json_object_append_string(json_selectors, "host", &percent_escapes, match_host->name); } if( 1 == use_parent_host) { json_object_append_string(json_selectors, "parenthost", &percent_escapes, ( NULL == parent_host ? "none" : parent_host->name)); } if( 1 == use_child_host) { json_object_append_string(json_selectors, "childhost", &percent_escapes, ( NULL == child_host ? "none" : child_host->name)); } if( NULL != temp_hostgroup) { json_object_append_string(json_selectors, "hostgroup", &percent_escapes, temp_hostgroup->group_name); } if( NULL != temp_servicegroup) { json_object_append_string(json_selectors, "servicegroup", &percent_escapes, temp_servicegroup->group_name); } if(NULL != temp_contact) { json_object_append_string(json_selectors, "contact",&percent_escapes, temp_contact->name); } if(NULL != temp_contactgroup) { json_object_append_string(json_selectors, "contactgroup", &percent_escapes, temp_contactgroup->group_name); } if( NULL != service_description) { json_object_append_string(json_selectors, "servicedescription", &percent_escapes, service_description); } if( NULL != parent_service_name) { json_object_append_string(json_selectors, "parentservice", &percent_escapes, parent_service_name); } if( NULL != child_service_name) { json_object_append_string(json_selectors, "childservice", &percent_escapes, child_service_name); } if( NULL != check_timeperiod) { json_object_append_string(json_selectors, "checktimeperiod", &percent_escapes, check_timeperiod->name); } if( NULL != notification_timeperiod) { json_object_append_string(json_selectors, "servicenotificationtimeperiod", &percent_escapes, notification_timeperiod->name); } if( NULL != check_command) { json_object_append_string(json_selectors, "checkcommand", &percent_escapes, check_command->name); } if( NULL != event_handler) { json_object_append_string(json_selectors, "eventhandler", &percent_escapes, event_handler->name); } return json_selectors; } json_object *json_object_servicecount(host *match_host, int use_parent_host, host *parent_host, int use_child_host, host *child_host, hostgroup *temp_hostgroup, servicegroup *temp_servicegroup, contact *temp_contact, char *service_description, char *parent_service_name, char *child_service_name, contactgroup *temp_contactgroup, timeperiod *check_timeperiod, timeperiod *notification_timeperiod, command *check_command, command *event_handler) { json_object *json_data; host *temp_host; service *temp_service; int count = 0; json_data = json_new_object(); json_object_append_object(json_data, "selectors", json_object_service_selectors(0, 0, use_parent_host, parent_host, use_child_host, child_host, temp_hostgroup, match_host, temp_servicegroup, temp_contact, service_description, parent_service_name, child_service_name, temp_contactgroup, check_timeperiod, notification_timeperiod, check_command, event_handler)); for(temp_service = service_list; temp_service != NULL; temp_service = temp_service->next) { temp_host = find_host(temp_service->host_name); if(NULL == temp_host) { continue; } if(json_object_service_passes_host_selection(temp_host, use_parent_host, parent_host, use_child_host, child_host, temp_hostgroup, match_host) == 0) { continue; } if(json_object_service_passes_service_selection(temp_service, temp_servicegroup, temp_contact, service_description, parent_service_name, child_service_name, temp_contactgroup, check_timeperiod, notification_timeperiod, check_command, event_handler) == 0) { continue; } count++; } json_object_append_integer(json_data, "count", count); return json_data; } json_object *json_object_servicelist(unsigned format_options, int start, int count, int details, host *match_host, int use_parent_host, host *parent_host, int use_child_host, host *child_host, hostgroup *temp_hostgroup, servicegroup *temp_servicegroup, contact *temp_contact, char *service_description, char *parent_service_name, char *child_service_name, contactgroup *temp_contactgroup, timeperiod *check_timeperiod, timeperiod *notification_timeperiod, command *check_command, command *event_handler) { json_object *json_data; json_object *json_hostlist; json_object *json_servicelist_object = NULL; json_array *json_servicelist_array = NULL; json_object *json_service_details; host *temp_host; service *temp_service; int current = 0; int counted = 0; int service_count; char *buf; json_data = json_new_object(); json_object_append_object(json_data, "selectors", json_object_service_selectors(start, count, use_parent_host, parent_host, use_child_host, child_host, temp_hostgroup, match_host, temp_servicegroup, temp_contact, service_description, parent_service_name, child_service_name, temp_contactgroup, check_timeperiod, notification_timeperiod, check_command, event_handler)); json_hostlist = json_new_object(); for(temp_host = host_list; temp_host != NULL; temp_host = temp_host->next) { if(json_object_service_passes_host_selection(temp_host, use_parent_host, parent_host, use_child_host, child_host, temp_hostgroup, match_host) == 0) { continue; } service_count = 0; if(details > 0) { json_servicelist_object = json_new_object(); } else { json_servicelist_array = json_new_array(); } for(temp_service = service_list; temp_service != NULL; temp_service = temp_service->next) { if(json_object_service_passes_service_selection(temp_service, temp_servicegroup, temp_contact, service_description, parent_service_name, child_service_name, temp_contactgroup, check_timeperiod, notification_timeperiod, check_command, event_handler) == 0) { continue; } /* If this service isn't on the host we're currently working with, skip it */ if( strcmp( temp_host->name, temp_service->host_name)) continue; /* If the current item passes the start and limit tests, display it */ if( passes_start_and_count_limits(start, count, current, counted)) { if( details > 0) { json_service_details = json_new_object(); json_object_service_details(json_service_details, format_options, temp_service); asprintf(&buf, "%s", temp_service->description); json_object_append_object(json_servicelist_object, buf, json_service_details); } else { json_array_append_string(json_servicelist_array, &percent_escapes, temp_service->description); } counted++; service_count++; } current++; } if(service_count > 0) { if(details > 0) { json_object_append_object(json_hostlist, temp_host->name, json_servicelist_object); } else { json_object_append_array(json_hostlist, temp_host->name, json_servicelist_array); } } } json_object_append_object(json_data, "servicelist", json_hostlist); return json_data; } json_object *json_object_service(unsigned format_options, service *temp_service) { json_object *json_service = json_new_object(); json_object *json_details = json_new_object(); /* host_name and description are included when json_object_service_details() is called, so we don't need them here */ /* json_object_append_string(json_details, "host_name", &percent_escapes, temp_service->host_name); json_object_append_string(json_details, "description", &percent_escapes, temp_service->description); */ json_object_service_details(json_details, format_options, temp_service); json_object_append_object(json_service, "service", json_details); return json_service; } void json_object_service_details(json_object *json_details, unsigned format_options, service *temp_service) { json_array *json_contactgroups; json_array *json_contacts; contactgroupsmember *temp_contact_groupsmember; #ifdef NSCORE contactsmember *temp_contactsmember; #else contact *temp_contact; #endif #ifdef JSON_NAGIOS_4X servicesmember *temp_servicesmember; json_object *json_parent_service; json_array *json_parent_services; json_object *json_child_service; json_array *json_child_services; #endif json_object_append_string(json_details, "host_name", &percent_escapes, temp_service->host_name); json_object_append_string(json_details, "description", &percent_escapes, temp_service->description); json_object_append_string(json_details, "display_name", &percent_escapes, temp_service->display_name); #ifdef JSON_NAGIOS_4X #if 0 if( CORE3_COMPATIBLE) { json_object_append_string(json_details, "service_check_command", &percent_escapes, temp_service->check_command); } else { #endif json_object_append_string(json_details, "check_command", &percent_escapes, temp_service->check_command); #if 0 } #endif #else json_object_append_string(json_details, "service_check_command", &percent_escapes, temp_service->service_check_command); #endif json_object_append_string(json_details, "event_handler", &percent_escapes, temp_service->event_handler); json_enumeration(json_details, format_options, "initial_state", temp_service->initial_state, svm_service_states); json_object_append_real(json_details, "check_interval", temp_service->check_interval); json_object_append_real(json_details, "retry_interval", temp_service->retry_interval); json_object_append_integer(json_details, "max_attempts", temp_service->max_attempts); json_object_append_boolean(json_details, "parallelize", temp_service->parallelize); json_contactgroups = json_new_array(); for(temp_contact_groupsmember = temp_service->contact_groups; temp_contact_groupsmember != NULL; temp_contact_groupsmember = temp_contact_groupsmember->next) { json_array_append_string(json_contactgroups, &percent_escapes, temp_contact_groupsmember->group_name); } json_object_append_array(json_details, "contact_groups", json_contactgroups); json_contacts = json_new_array(); #ifdef NSCORE for(temp_contactsmember = temp_service->contacts; temp_contactsmember != NULL; temp_contactsmember = temp_contactsmember->next) { json_array_append_string(json_contacts, &percent_escapes, temp_contactsmember->contact_name); } #else for(temp_contact = contact_list; temp_contact != NULL; temp_contact = temp_contact->next) { if(TRUE == is_contact_for_service(temp_service, temp_contact)) { json_array_append_string(json_contacts, &percent_escapes, temp_contact->name); } } #endif json_object_append_array(json_details, "contacts", json_contacts); json_object_append_real(json_details, "notification_interval", temp_service->notification_interval); json_object_append_real(json_details, "first_notification_delay", temp_service->first_notification_delay); #ifdef JSON_NAGIOS_4X #if 0 if( CORE3_COMPATIBLE) { json_object_append_boolean(json_details, "notify_on_unknown", flag_isset(temp_service->notification_options, OPT_UNKNOWN)); json_object_append_boolean(json_details, "notify_on_warning", flag_isset(temp_service->notification_options, OPT_WARNING)); json_object_append_boolean(json_details, "notify_on_critical", flag_isset(temp_service->notification_options, OPT_CRITICAL)); json_object_append_boolean(json_details, "notify_on_recovery", flag_isset(temp_service->notification_options, OPT_RECOVERY)); json_object_append_boolean(json_details, "notify_on_flapping", flag_isset(temp_service->notification_options, OPT_FLAPPING)); json_object_append_boolean(json_details, "notify_on_downtime", flag_isset(temp_service->notification_options, OPT_DOWNTIME)); } else { #endif json_bitmask(json_details, format_options, "notifications_options", temp_service->notification_options, svm_option_types); #if 0 } #endif #else json_object_append_boolean(json_details, "notify_on_unknown", temp_service->notify_on_unknown); json_object_append_boolean(json_details, "notify_on_warning", temp_service->notify_on_warning); json_object_append_boolean(json_details, "notify_on_critical", temp_service->notify_on_critical); json_object_append_boolean(json_details, "notify_on_recovery", temp_service->notify_on_recovery); json_object_append_boolean(json_details, "notify_on_flapping", temp_service->notify_on_flapping); json_object_append_boolean(json_details, "notify_on_downtime", temp_service->notify_on_downtime); #endif #ifdef JSON_NAGIOS_4X #if 0 if( CORE3_COMPATIBLE) { json_object_append_boolean(json_details, "stalk_on_ok", flag_isset(temp_service->stalking_options, OPT_OK)); json_object_append_boolean(json_details, "stalk_on_warning", flag_isset(temp_service->stalking_options, OPT_WARNING)); json_object_append_boolean(json_details, "stalk_on_unknown", flag_isset(temp_service->stalking_options, OPT_UNKNOWN)); json_object_append_boolean(json_details, "stalk_on_critical", flag_isset(temp_service->stalking_options, OPT_CRITICAL)); } else { #endif json_bitmask(json_details, format_options, "stalking_options", temp_service->stalking_options, svm_option_types); #if 0 } #endif #else json_object_append_boolean(json_details, "stalk_on_ok", temp_service->stalk_on_ok); json_object_append_boolean(json_details, "stalk_on_warning", temp_service->stalk_on_warning); json_object_append_boolean(json_details, "stalk_on_unknown", temp_service->stalk_on_unknown); json_object_append_boolean(json_details, "stalk_on_critical", temp_service->stalk_on_critical); #endif json_object_append_boolean(json_details, "is_volatile", temp_service->is_volatile); json_object_append_string(json_details, "notification_period", &percent_escapes, temp_service->notification_period); json_object_append_string(json_details, "check_period", &percent_escapes, temp_service->check_period); json_object_append_boolean(json_details, "flap_detection_enabled", temp_service->flap_detection_enabled); json_object_append_real(json_details, "low_flap_threshold", temp_service->low_flap_threshold); json_object_append_real(json_details, "high_flap_threshold", temp_service->high_flap_threshold); #ifdef JSON_NAGIOS_4X #if 0 if( CORE3_COMPATIBLE) { json_object_append_boolean(json_details, "flap_detection_on_ok", flag_isset(temp_service->flap_detection_options, OPT_OK)); json_object_append_boolean(json_details, "flap_detection_on_warning", flag_isset(temp_service->flap_detection_options, OPT_WARNING)); json_object_append_boolean(json_details, "flap_detection_on_unknown", flag_isset(temp_service->flap_detection_options, OPT_UNKNOWN)); json_object_append_boolean(json_details, "flap_detection_on_critical", flag_isset(temp_service->flap_detection_options, OPT_CRITICAL)); } else { #endif json_bitmask(json_details, format_options, "flap_detection_options", temp_service->flap_detection_options, svm_option_types); #if 0 } #endif #else json_object_append_boolean(json_details, "flap_detection_on_ok", temp_service->flap_detection_on_ok); json_object_append_boolean(json_details, "flap_detection_on_warning", temp_service->flap_detection_on_warning); json_object_append_boolean(json_details, "flap_detection_on_unknown", temp_service->flap_detection_on_unknown); json_object_append_boolean(json_details, "flap_detection_on_critical", temp_service->flap_detection_on_critical); #endif json_object_append_boolean(json_details, "process_performance_data", temp_service->process_performance_data); json_object_append_boolean(json_details, "check_freshness", temp_service->check_freshness); json_object_append_integer(json_details, "freshness_threshold", temp_service->freshness_threshold); #ifdef JSON_NAGIOS_4X #if 0 if( CORE3_COMPATIBLE) { json_object_append_boolean(json_details, "accept_passive_service_checks", temp_service->accept_passive_checks); } else { #endif json_object_append_boolean(json_details, "accept_passive_checks", temp_service->accept_passive_checks); #if 0 } #endif #else json_object_append_boolean(json_details, "accept_passive_service_checks", temp_service->accept_passive_service_checks); #endif json_object_append_boolean(json_details, "event_handler_enabled", temp_service->event_handler_enabled); json_object_append_boolean(json_details, "checks_enabled", temp_service->checks_enabled); json_object_append_boolean(json_details, "retain_status_information", temp_service->retain_status_information); json_object_append_boolean(json_details, "retain_nonstatus_information", temp_service->retain_nonstatus_information); json_object_append_boolean(json_details, "notifications_enabled", temp_service->notifications_enabled); #ifdef JSON_NAGIOS_4X #if 0 if( CORE3_COMPATIBLE) { json_object_append_boolean(json_details, "obsess_over_service", temp_service->obsess); } else { #endif json_object_append_boolean(json_details, "obsess", temp_service->obsess); #if 0 } #endif #else json_object_append_boolean(json_details, "obsess_over_service", temp_service->obsess_over_service); #endif #ifndef JSON_NAGIOS_4X json_object_append_boolean(json_details, "failure_prediction_enabled", temp_service->failure_prediction_enabled); json_object_append_string(json_details, "failure_prediction_options", NULL, temp_service->failure_prediction_options); #endif #ifdef JSON_NAGIOS_4X json_object_append_integer(json_details, "hourly_value", temp_service->hourly_value); #endif #ifdef JSON_NAGIOS_4X json_parent_services = json_new_array(); for(temp_servicesmember = temp_service->parents; temp_servicesmember != NULL; temp_servicesmember = temp_servicesmember->next) { json_parent_service = json_new_object(); json_object_append_string(json_parent_service, "host_name", &percent_escapes, temp_servicesmember->host_name); json_object_append_string(json_parent_service, "service_description", &percent_escapes, temp_servicesmember->service_description); json_array_append_object(json_parent_services, json_parent_service); } json_object_append_array(json_details, "parents", json_parent_services); json_child_services = json_new_array(); for(temp_servicesmember = temp_service->children; temp_servicesmember != NULL; temp_servicesmember = temp_servicesmember->next) { json_child_service = json_new_object(); json_object_append_string(json_child_service, "host_name", &percent_escapes, temp_servicesmember->host_name); json_object_append_string(json_child_service, "service_description", &percent_escapes, temp_servicesmember->service_description); json_array_append_object(json_child_services, json_child_service); } json_object_append_array(json_details, "children", json_child_services); #endif json_object_append_string(json_details, "notes", &percent_escapes, temp_service->notes); json_object_append_string(json_details, "notes_url", &percent_escapes, temp_service->notes_url); json_object_append_string(json_details, "action_url", &percent_escapes, temp_service->action_url); json_object_append_string(json_details, "icon_image", &percent_escapes, temp_service->icon_image); json_object_append_string(json_details, "icon_image_alt", &percent_escapes, temp_service->icon_image_alt); json_object_append_object(json_details, "custom_variables", json_object_custom_variables(temp_service->custom_variables)); } int json_object_servicegroup_passes_selection(servicegroup *temp_servicegroup, service *temp_servicegroup_member) { /* Skip if user is not authorized for this hostgroup */ if(FALSE == is_authorized_for_servicegroup(temp_servicegroup, ¤t_authdata)) { return 0; } /* Skip if a servicegroup member is specified and the servicegroup member service is not a member of the servicegroup */ if( NULL != temp_servicegroup_member && ( FALSE == is_service_member_of_servicegroup(temp_servicegroup, temp_servicegroup_member))) { return 0; } return 1; } json_object * json_object_servicegroup_selectors(int start, int count, service *temp_servicegroup_member) { json_object *json_selectors; json_selectors = json_new_object(); if( start > 0) { json_object_append_integer(json_selectors, "start", start); } if( count > 0) { json_object_append_integer(json_selectors, "count", count); } if( NULL != temp_servicegroup_member) { json_object_append_string(json_selectors, "servicegroupmemberhost", &percent_escapes, temp_servicegroup_member->host_name); json_object_append_string(json_selectors, "servicegroupmemberservice", &percent_escapes, temp_servicegroup_member->description); } return json_selectors; } json_object *json_object_servicegroupcount(service *temp_servicegroup_member) { json_object *json_data; servicegroup *temp_servicegroup; int count = 0; json_data = json_new_object(); json_object_append_object(json_data, "selectors", json_object_servicegroup_selectors(0, 0, temp_servicegroup_member)); for(temp_servicegroup = servicegroup_list; temp_servicegroup != NULL; temp_servicegroup = temp_servicegroup->next) { if(json_object_servicegroup_passes_selection(temp_servicegroup, temp_servicegroup_member) == 0) { continue; } count++; } json_object_append_integer(json_data, "count", count); return json_data; } json_object *json_object_servicegrouplist(unsigned format_options, int start, int count, int details, service *temp_servicegroup_member) { json_object *json_data; json_object *json_servicegrouplist_object = NULL; json_array *json_servicegrouplist_array = NULL; json_object *json_servicegroup_details; servicegroup *temp_servicegroup; int current = 0; int counted = 0; json_data = json_new_object(); json_object_append_object(json_data, "selectors", json_object_servicegroup_selectors(start, count, temp_servicegroup_member)); if(details > 0) { json_servicegrouplist_object = json_new_object(); } else { json_servicegrouplist_array = json_new_array(); } for(temp_servicegroup = servicegroup_list; temp_servicegroup != NULL; temp_servicegroup = temp_servicegroup->next) { if(json_object_servicegroup_passes_selection(temp_servicegroup, temp_servicegroup_member) == 0) { continue; } /* If the current item passes the start and limit tests, display it */ if( passes_start_and_count_limits(start, count, current, counted)) { if( details > 0) { json_servicegroup_details = json_new_object(); json_object_servicegroup_details(json_servicegroup_details, format_options, temp_servicegroup); json_object_append_object(json_servicegrouplist_object, temp_servicegroup->group_name, json_servicegroup_details); } else { json_object_append_string(json_servicegrouplist_array, NULL, &percent_escapes, temp_servicegroup->group_name); } counted++; } current++; } if(details > 0) { json_object_append_object(json_data, "servicegrouplist", json_servicegrouplist_object); } else { json_object_append_array(json_data, "servicegrouplist", json_servicegrouplist_array); } return json_data; } json_object * json_object_servicegroup(unsigned format_options, servicegroup *temp_servicegroup) { json_object *json_servicegroup = json_new_object(); json_object *json_details = json_new_object(); json_object_append_string(json_details, "group_name", &percent_escapes, temp_servicegroup->group_name); json_object_servicegroup_details(json_details, format_options, temp_servicegroup); json_object_append_object(json_servicegroup, "servicegroup", json_details); return json_servicegroup; } void json_object_servicegroup_details(json_object *json_details, unsigned format_options, servicegroup *temp_servicegroup) { json_array *json_members; servicesmember *temp_member; json_object *json_member; json_object_append_string(json_details, "group_name", &percent_escapes, temp_servicegroup->group_name); json_object_append_string(json_details, "alias", &percent_escapes, temp_servicegroup->alias); json_members = json_new_array(); for(temp_member = temp_servicegroup->members; temp_member != NULL; temp_member = temp_member->next) { json_member = json_new_object(); json_object_append_string(json_member, "host_name", &percent_escapes, temp_member->host_name); json_object_append_string(json_member, "service_description", &percent_escapes, temp_member->service_description); json_array_append_object(json_members, json_member); } json_object_append_array(json_details, "members", json_members); json_object_append_string(json_details, "notes", &percent_escapes, temp_servicegroup->notes); json_object_append_string(json_details, "notes_url", &percent_escapes, temp_servicegroup->notes_url); json_object_append_string(json_details, "action_url", &percent_escapes, temp_servicegroup->action_url); } int json_object_contact_passes_selection(contact *temp_contact, contactgroup *temp_contactgroup, timeperiod *host_notification_timeperiod, timeperiod *service_notification_timeperiod) { /* If the contactgroup was specified, skip the contacts that are not members of the contactgroup specified */ if( NULL != temp_contactgroup && ( FALSE == is_contact_member_of_contactgroup(temp_contactgroup, temp_contact))) { return 0; } /* If a host notification timeperiod was specified, skip this contact if it does not have the host notification timeperiod specified */ if(NULL != host_notification_timeperiod && (host_notification_timeperiod != temp_contact->host_notification_period_ptr)) { return 0; } /* If a service notification timeperiod was specified, skip this contact if it does not have the service notification timeperiod specified */ if(NULL != service_notification_timeperiod && (service_notification_timeperiod != temp_contact->service_notification_period_ptr)) { return 0; } return 1; } json_object *json_object_contact_display_selectors(int start, int count, contactgroup *temp_contactgroup, timeperiod *host_notification_timeperiod, timeperiod *service_notification_timeperiod) { json_object *json_selectors; json_selectors = json_new_object(); if( start > 0) { json_object_append_integer(json_selectors, "start", start); } if( count > 0) { json_object_append_integer(json_selectors, "count", count); } if( NULL != temp_contactgroup) { json_object_append_string(json_selectors, "contactgroup", &percent_escapes, temp_contactgroup->group_name); } if( NULL != host_notification_timeperiod) { json_object_append_string(json_selectors, "hostnotificationtimeperiod", &percent_escapes, host_notification_timeperiod->name); } if( NULL != service_notification_timeperiod) { json_object_append_string(json_selectors, "servicenotificationtimeperiod", &percent_escapes, service_notification_timeperiod->name); } return json_selectors; } json_object *json_object_contactcount(contactgroup *temp_contactgroup, timeperiod *host_notification_timeperiod, timeperiod *service_notification_timeperiod) { json_object *json_data; contact *temp_contact; int count = 0; json_data = json_new_object(); json_object_append_object(json_data, "selectors", json_object_contact_display_selectors(0, 0, temp_contactgroup, host_notification_timeperiod, service_notification_timeperiod)); for(temp_contact = contact_list; temp_contact != NULL; temp_contact = temp_contact->next) { if(json_object_contact_passes_selection(temp_contact, temp_contactgroup, host_notification_timeperiod, service_notification_timeperiod) == 0) { continue; } count++; } json_object_append_integer(json_data, "count", count); return json_data; } json_object *json_object_contactlist(unsigned format_options, int start, int count, int details, contactgroup *temp_contactgroup, timeperiod *host_notification_timeperiod, timeperiod *service_notification_timeperiod) { json_object *json_data; json_object *json_contactlist_object = NULL; json_array *json_contactlist_array = NULL; json_object *json_contact_details; contact *temp_contact; int current = 0; int counted = 0; json_data = json_new_object(); json_object_append_object(json_data, "selectors", json_object_contact_display_selectors(start, count, temp_contactgroup, host_notification_timeperiod, service_notification_timeperiod)); if(details > 0) { json_contactlist_object = json_new_object(); } else { json_contactlist_array = json_new_array(); } for(temp_contact = contact_list; temp_contact != NULL; temp_contact = temp_contact->next) { if(json_object_contact_passes_selection(temp_contact, temp_contactgroup, host_notification_timeperiod, service_notification_timeperiod) == 0) { continue; } /* If the current item passes the start and limit tests, display it */ if( passes_start_and_count_limits(start, count, current, counted)) { if( details > 0) { json_contact_details = json_new_object(); json_object_contact_details(json_contact_details, format_options, temp_contact); json_object_append_object(json_contactlist_object, temp_contact->name, json_contact_details); } else { json_array_append_string(json_contactlist_array, &percent_escapes, temp_contact->name); } counted++; } current++; } if(details > 0) { json_object_append_object(json_data, "contactlist", json_contactlist_object); } else { json_object_append_array(json_data, "contactlist", json_contactlist_array); } return json_data; } json_object *json_object_contact(unsigned format_options, contact *temp_contact) { json_object *json_contact = json_new_object(); json_object *json_details = json_new_object(); json_object_append_string(json_details, "name", &percent_escapes, temp_contact->name); json_object_contact_details(json_details, format_options, temp_contact); json_object_append_object(json_contact, "contact", json_details); return json_contact; } void json_object_contact_details(json_object *json_details, unsigned format_options, contact *temp_contact) { json_array *json_addresses; json_array *json_host_commands; json_array *json_service_commands; int x; commandsmember *temp_commandsmember; json_object_append_string(json_details, "name", &percent_escapes, temp_contact->name); json_object_append_string(json_details, "alias", &percent_escapes, temp_contact->alias); json_object_append_string(json_details, "email", &percent_escapes, temp_contact->email); json_object_append_string(json_details, "pager", &percent_escapes, temp_contact->pager); json_addresses = json_new_array(); for( x = 0; x < MAX_CONTACT_ADDRESSES; x++) { if( NULL != temp_contact->address[ x]) { json_array_append_string(json_addresses, &percent_escapes, temp_contact->address[ x]); } } json_object_append_array(json_details, "addresses", json_addresses); json_host_commands = json_new_array(); for(temp_commandsmember = temp_contact->host_notification_commands; temp_commandsmember != NULL; temp_commandsmember = temp_commandsmember->next) { json_array_append_string(json_host_commands, &percent_escapes, temp_commandsmember->command); } json_object_append_array(json_details, "host_notification_commands", json_host_commands); json_service_commands = json_new_array(); for(temp_commandsmember = temp_contact->service_notification_commands; temp_commandsmember != NULL; temp_commandsmember = temp_commandsmember->next) { json_array_append_string(json_service_commands, &percent_escapes, temp_commandsmember->command); } json_object_append_array(json_details, "service_notification_commands", json_service_commands); #ifdef JSON_NAGIOS_4X #if 0 if( CORE3_COMPATIBLE) { json_object_append_boolean(json_details, "notify_on_service_unknown", flag_isset(temp_contact->service_notification_options, OPT_UNKNOWN)); json_object_append_boolean(json_details, "notify_on_service_warning", flag_isset(temp_contact->service_notification_options, OPT_WARNING)); json_object_append_boolean(json_details, "notify_on_service_critical", flag_isset(temp_contact->service_notification_options, OPT_CRITICAL)); json_object_append_boolean(json_details, "notify_on_service_recovery", flag_isset(temp_contact->service_notification_options, OPT_RECOVERY)); json_object_append_boolean(json_details, "notify_on_service_flapping", flag_isset(temp_contact->service_notification_options, OPT_FLAPPING)); json_object_append_boolean(json_details, "notify_on_service_downtime", flag_isset(temp_contact->service_notification_options, OPT_DOWNTIME)); } else { #endif json_bitmask(json_details, format_options, "service_notification_options", temp_contact->service_notification_options, svm_option_types); #if 0 } #endif #else json_object_append_boolean(json_details, "notify_on_service_unknown", temp_contact->notify_on_service_unknown); json_object_append_boolean(json_details, "notify_on_service_warning", temp_contact->notify_on_service_warning); json_object_append_boolean(json_details, "notify_on_service_critical", temp_contact->notify_on_service_critical); json_object_append_boolean(json_details, "notify_on_service_recovery", temp_contact->notify_on_service_recovery); json_object_append_boolean(json_details, "notify_on_service_flapping", temp_contact->notify_on_service_flapping); json_object_append_boolean(json_details, "notify_on_service_downtime", temp_contact->notify_on_service_downtime); #endif #ifdef JSON_NAGIOS_4X #if 0 if( CORE3_COMPATIBLE) { json_object_append_boolean(json_details, "notify_on_host_down", flag_isset(temp_contact->host_notification_options, OPT_DOWN)); json_object_append_boolean(json_details, "notify_on_host_unreachable", flag_isset(temp_contact->host_notification_options, OPT_UNREACHABLE)); json_object_append_boolean(json_details, "notify_on_host_recovery", flag_isset(temp_contact->host_notification_options, OPT_RECOVERY)); json_object_append_boolean(json_details, "notify_on_host_flapping", flag_isset(temp_contact->host_notification_options, OPT_FLAPPING)); json_object_append_boolean(json_details, "notify_on_host_downtime", flag_isset(temp_contact->host_notification_options, OPT_DOWNTIME)); } else { #endif json_bitmask(json_details, format_options, "host_notification_options", temp_contact->host_notification_options, svm_option_types); #if 0 } #endif #else json_object_append_boolean(json_details, "notify_on_host_down", temp_contact->notify_on_host_down); json_object_append_boolean(json_details, "notify_on_host_unreachable", temp_contact->notify_on_host_unreachable); json_object_append_boolean(json_details, "notify_on_host_recovery", temp_contact->notify_on_host_recovery); json_object_append_boolean(json_details, "notify_on_host_flapping", temp_contact->notify_on_host_flapping); json_object_append_boolean(json_details, "notify_on_host_downtime", temp_contact->notify_on_host_downtime); #endif json_object_append_string(json_details, "host_notification_period", &percent_escapes, temp_contact->host_notification_period); json_object_append_string(json_details, "service_notification_period", &percent_escapes, temp_contact->service_notification_period); json_object_append_boolean(json_details, "host_notifications_enabled", temp_contact->host_notifications_enabled); json_object_append_boolean(json_details, "service_notifications_enabled", temp_contact->service_notifications_enabled); json_object_append_boolean(json_details, "can_submit_commands", temp_contact->can_submit_commands); json_object_append_boolean(json_details, "retain_status_information", temp_contact->retain_status_information); json_object_append_boolean(json_details, "retain_nonstatus_information", temp_contact->retain_nonstatus_information); #ifdef JSON_NAGIOS_4X json_object_append_integer(json_details, "minimum_value", temp_contact->minimum_value); #endif json_object_append_object(json_details, "custom_variables", json_object_custom_variables(temp_contact->custom_variables)); } int json_object_contactgroup_passes_selection(contactgroup *temp_contactgroup, contact *temp_contactgroup_member) { /* Skip if a contactgroup member is specified and the contactgroup member contact is not a member of the contactgroup */ if( NULL != temp_contactgroup_member && ( FALSE == is_contact_member_of_contactgroup(temp_contactgroup, temp_contactgroup_member))) { return 0; } return 1; } json_object *json_object_contactgroup_display_selectors( int start, int count, contact *temp_contactgroup_member) { json_object *json_selectors; json_selectors = json_new_object(); if( start > 0) { json_object_append_integer(json_selectors, "start", start); } if( count > 0) { json_object_append_integer(json_selectors, "count", count); } if( NULL != temp_contactgroup_member) { json_object_append_string(json_selectors, "contactgroupmember", &percent_escapes, temp_contactgroup_member->name); } return json_selectors; } json_object *json_object_contactgroupcount(contact * temp_contactgroup_member) { json_object *json_data; contactgroup *temp_contactgroup; int count = 0; json_data = json_new_object(); json_object_append_object(json_data, "selectors", json_object_contactgroup_display_selectors(0, 0, temp_contactgroup_member)); for(temp_contactgroup = contactgroup_list; temp_contactgroup != NULL; temp_contactgroup = temp_contactgroup->next) { if(json_object_contactgroup_passes_selection(temp_contactgroup, temp_contactgroup_member) == 0) { continue; } count++; } json_object_append_integer(json_data, "count", count); return json_data; } json_object *json_object_contactgrouplist(unsigned format_options, int start, int count, int details, contact * temp_contactgroup_member) { json_object *json_data; json_object *json_contactgrouplist_object = NULL; json_array *json_contactgrouplist_array = NULL; json_object *json_contactgroup_details; contactgroup *temp_contactgroup; int current = 0; int counted = 0; json_data = json_new_object(); json_object_append_object(json_data, "selectors", json_object_contactgroup_display_selectors(start, count, temp_contactgroup_member)); if(details > 0) { json_contactgrouplist_object = json_new_object(); } else { json_contactgrouplist_array = json_new_array(); } for(temp_contactgroup = contactgroup_list; temp_contactgroup != NULL; temp_contactgroup = temp_contactgroup->next) { if(json_object_contactgroup_passes_selection(temp_contactgroup, temp_contactgroup_member) == 0) { continue; } /* If the current item passes the start and limit tests, display it */ if( passes_start_and_count_limits(start, count, current, counted)) { if( details > 0) { json_contactgroup_details = json_new_object(); json_object_contactgroup_details(json_contactgroup_details, format_options, temp_contactgroup); json_object_append_object(json_contactgrouplist_object, temp_contactgroup->group_name, json_contactgroup_details); } else { json_array_append_string(json_contactgrouplist_array, &percent_escapes, temp_contactgroup->group_name); } counted++; } current++; } if(details > 0) { json_object_append_object(json_data, "contactgrouplist", json_contactgrouplist_object); } else { json_object_append_array(json_data, "contactgrouplist", json_contactgrouplist_array); } return json_data; } json_object *json_object_contactgroup(unsigned format_options, contactgroup *temp_contactgroup) { json_object *json_contactgroup = json_new_object(); json_object *json_details = json_new_object(); json_object_append_string(json_details, "group_name", &percent_escapes, temp_contactgroup->group_name); json_object_contactgroup_details(json_details, format_options, temp_contactgroup); json_object_append_object(json_contactgroup, "contactgroup", json_details); return json_contactgroup; } void json_object_contactgroup_details(json_object *json_details, unsigned format_options, contactgroup *temp_contactgroup) { json_array *json_members; contactsmember *temp_member; json_object_append_string(json_details, "group_name", &percent_escapes, temp_contactgroup->group_name); json_object_append_string(json_details, "alias", &percent_escapes, temp_contactgroup->alias); json_members = json_new_array(); for(temp_member = temp_contactgroup->members; temp_member != NULL; temp_member = temp_member->next) { json_array_append_string(json_members, &percent_escapes, temp_member->contact_name); } json_object_append_array(json_details, "members", json_members); } json_object *json_object_timeperiod_selectors(int start, int count) { json_object *json_selectors; json_selectors = json_new_object(); if( start > 0) { json_object_append_integer(json_selectors, "start", start); } if( count > 0) { json_object_append_integer(json_selectors, "count", count); } return json_selectors; } json_object *json_object_timeperiodcount(void) { json_object *json_data; timeperiod *temp_timeperiod; int count = 0; json_data = json_new_object(); json_object_append_object(json_data, "selectors", json_object_timeperiod_selectors(0, 0)); for(temp_timeperiod = timeperiod_list; temp_timeperiod != NULL; temp_timeperiod = temp_timeperiod->next) { count++; } json_object_append_integer(json_data, "count", count); return json_data; } json_object *json_object_timeperiodlist(unsigned format_options, int start, int count, int details) { json_object *json_data; json_object *json_timeperiodlist_object = NULL; json_array *json_timeperiodlist_array = NULL; json_object *json_timeperiod_details; timeperiod *temp_timeperiod; int current = 0; int counted = 0; json_data = json_new_object(); json_object_append_object(json_data, "selectors", json_object_timeperiod_selectors(start, count)); if(details > 0) { json_timeperiodlist_object = json_new_object(); } else { json_timeperiodlist_array = json_new_array(); } for(temp_timeperiod = timeperiod_list; temp_timeperiod != NULL; temp_timeperiod = temp_timeperiod->next) { /* If the current item passes the start and limit tests, display it */ if( passes_start_and_count_limits(start, count, current, counted)) { if( details > 0) { json_timeperiod_details = json_new_object(); json_object_timeperiod_details(json_timeperiod_details, format_options, temp_timeperiod); json_object_append_object(json_timeperiodlist_object, temp_timeperiod->name, json_timeperiod_details); } else { json_array_append_string(json_timeperiodlist_array, &percent_escapes, temp_timeperiod->name); } counted++; } current++; } if(details > 0) { json_object_append_object(json_data, "timeperiodlist", json_timeperiodlist_object); } else { json_object_append_array(json_data, "timeperiodlist", json_timeperiodlist_array); } return json_data; } json_object *json_object_timeperiod(unsigned format_options, timeperiod *temp_timeperiod) { json_object *json_timeperiod = json_new_object(); json_object *json_details = json_new_object(); json_object_append_string(json_details, "name", &percent_escapes, temp_timeperiod->name); json_object_timeperiod_details(json_details, format_options, temp_timeperiod); json_object_append_object(json_timeperiod, "timeperiod", json_details); return json_timeperiod; } void json_object_timeperiod_details(json_object *json_details, unsigned format_options, timeperiod *temp_timeperiod) { json_object *json_days; int x; json_array *json_timeranges; json_array *json_exceptions; json_array *json_exclusions; daterange *temp_daterange; timeperiodexclusion *temp_timeperiodexclusion; json_object_append_string(json_details, "name", &percent_escapes, temp_timeperiod->name); json_object_append_string(json_details, "alias", &percent_escapes, temp_timeperiod->alias); json_days = json_new_object(); for(x = 0; x < sizeof(temp_timeperiod->days) / sizeof(temp_timeperiod->days[0]); x++) { if( NULL != temp_timeperiod->days[x]) { json_timeranges = json_new_array(); json_object_timerange(json_timeranges, format_options, temp_timeperiod->days[x]); json_object_append_array(json_days, (char *)dayofweek[x], json_timeranges); } } json_object_append_object(json_details, "days", json_days); json_exceptions = json_new_array(); for(x = 0; x < DATERANGE_TYPES; x++) { for(temp_daterange = temp_timeperiod->exceptions[x]; temp_daterange != NULL; temp_daterange = temp_daterange->next) { json_array_append_object(json_exceptions, json_object_daterange(format_options, temp_daterange, x)); } } json_object_append_array(json_details, "exceptions", json_exceptions); json_exclusions = json_new_array(); for(temp_timeperiodexclusion = temp_timeperiod->exclusions; temp_timeperiodexclusion != NULL; temp_timeperiodexclusion = temp_timeperiodexclusion->next) { json_array_append_string(json_exclusions, &percent_escapes, temp_timeperiodexclusion->timeperiod_name); } json_object_append_array(json_details, "exclusions", json_exclusions); } json_object * json_object_daterange(unsigned format_options, daterange *temp_daterange, int daterange_type) { json_object *json_daterange; json_array *json_timeranges; json_daterange = json_new_object(); switch(daterange_type) { case DATERANGE_CALENDAR_DATE: json_object_append_string(json_daterange, "type", NULL, "DATERANGE_CALENDAR_DATE"); if(temp_daterange->syear == temp_daterange->eyear && temp_daterange->smon == temp_daterange->emon && temp_daterange->smday == temp_daterange->emday) { json_object_append_string(json_daterange, "date", NULL, "%4d-%02d-%02d", temp_daterange->syear, temp_daterange->smon+1, temp_daterange->smday); } else { json_object_append_string(json_daterange, "startdate", NULL, "%4d-%02d-%02d", temp_daterange->syear, temp_daterange->smon+1, temp_daterange->smday); json_object_append_string(json_daterange, "enddate", NULL, "%4d-%02d-%02d", temp_daterange->eyear, temp_daterange->emon+1, temp_daterange->emday); } if( temp_daterange->skip_interval > 0) { json_object_append_integer(json_daterange, "skip_interval", temp_daterange->skip_interval); } json_timeranges = json_new_array(); json_object_timerange(json_timeranges, format_options, temp_daterange->times); json_object_append_array(json_daterange, "times", json_timeranges); break; case DATERANGE_MONTH_DATE: json_object_append_string(json_daterange, "type", NULL, "DATERANGE_MONTH_DATE"); if(temp_daterange->smon == temp_daterange->emon && temp_daterange->smday == temp_daterange->emday) { json_object_append_string(json_daterange, "month", &percent_escapes, (char *)month[temp_daterange->smon]); json_object_append_integer(json_daterange, "day", temp_daterange->smday); } else { json_object_append_string(json_daterange, "startmonth", &percent_escapes, (char *)month[temp_daterange->smon]); json_object_append_integer(json_daterange, "startday", temp_daterange->smday); json_object_append_string(json_daterange, "endmonth", &percent_escapes, (char *)month[temp_daterange->emon]); json_object_append_integer(json_daterange, "endday", temp_daterange->emday); } if( temp_daterange->skip_interval > 0) { json_object_append_integer(json_daterange, "skip_interval", temp_daterange->skip_interval); } json_timeranges = json_new_array(); json_object_timerange(json_timeranges, format_options, temp_daterange->times); json_object_append_array(json_daterange, "times", json_timeranges); break; case DATERANGE_MONTH_DAY: json_object_append_string(json_daterange, "type", NULL, "DATERANGE_MONTH_DAY"); if(temp_daterange->smday == temp_daterange->emday) { json_object_append_integer(json_daterange, "day", temp_daterange->smday); } else { json_object_append_integer(json_daterange, "startday", temp_daterange->smday); json_object_append_integer(json_daterange, "endday", temp_daterange->emday); } if( temp_daterange->skip_interval > 0) { json_object_append_integer(json_daterange, "skip_interval", temp_daterange->skip_interval); } json_timeranges = json_new_array(); json_object_timerange(json_timeranges, format_options, temp_daterange->times); json_object_append_array(json_daterange, "times", json_timeranges); break; case DATERANGE_MONTH_WEEK_DAY: json_object_append_string(json_daterange, "type", NULL, "DATERANGE_MONTH_WEEK_DAY"); if(temp_daterange->smon == temp_daterange->emon && temp_daterange->swday == temp_daterange->ewday && temp_daterange->swday_offset == temp_daterange->ewday_offset) { json_object_append_string(json_daterange, "month", &percent_escapes, (char *)month[temp_daterange->smon]); json_object_append_string(json_daterange, "weekday", &percent_escapes, (char *)dayofweek[temp_daterange->swday]); json_object_append_integer(json_daterange, "weekdayoffset", temp_daterange->swday_offset); } else { json_object_append_string(json_daterange, "startmonth", &percent_escapes, (char *)month[temp_daterange->smon]); json_object_append_string(json_daterange, "startweekday", &percent_escapes, (char *)dayofweek[temp_daterange->swday]); json_object_append_integer(json_daterange, "startweekdayoffset", temp_daterange->swday_offset); json_object_append_string(json_daterange, "endmonth", &percent_escapes, (char *)month[temp_daterange->emon]); json_object_append_string(json_daterange, "endweekday", &percent_escapes, (char *)dayofweek[temp_daterange->ewday]); json_object_append_integer(json_daterange, "endweekdayoffset", temp_daterange->ewday_offset); } if( temp_daterange->skip_interval > 0) { json_object_append_integer(json_daterange, "skip_interval", temp_daterange->skip_interval); } json_timeranges = json_new_array(); json_object_timerange(json_timeranges, format_options, temp_daterange->times); json_object_append_array(json_daterange, "times", json_timeranges); break; case DATERANGE_WEEK_DAY: json_object_append_string(json_daterange, "type", NULL, "DATERANGE_WEEK_DAY"); if(temp_daterange->swday == temp_daterange->ewday && temp_daterange->swday_offset == temp_daterange->ewday_offset) { json_object_append_string(json_daterange, "weekday", &percent_escapes, (char *)dayofweek[temp_daterange->swday]); json_object_append_integer(json_daterange, "weekdayoffset", temp_daterange->swday_offset); } else { json_object_append_string(json_daterange, "startweekday", &percent_escapes, (char *)dayofweek[temp_daterange->swday]); json_object_append_integer(json_daterange, "startweekdayoffset", temp_daterange->swday_offset); json_object_append_string(json_daterange, "endweekday", &percent_escapes, (char *)dayofweek[temp_daterange->ewday]); json_object_append_integer(json_daterange, "endweekdayoffset", temp_daterange->ewday_offset); } if( temp_daterange->skip_interval > 0) { json_object_append_integer(json_daterange, "skip_interval", temp_daterange->skip_interval); } json_timeranges = json_new_array(); json_object_timerange(json_timeranges, format_options, temp_daterange->times); json_object_append_array(json_daterange, "times", json_timeranges); break; default: json_object_append_string(json_daterange, "type", NULL, "Unknown daterange type: %u", daterange_type); break; } return json_daterange; } void json_object_timerange(json_array *json_parent, unsigned format_options, timerange *temp_timerange) { json_object *json_timerange; for(; temp_timerange != NULL; temp_timerange = temp_timerange->next) { json_timerange = json_new_object(); json_object_append_time(json_timerange, "range_start", temp_timerange->range_start); json_object_append_time(json_timerange, "range_end", temp_timerange->range_end); json_array_append_object(json_parent, json_timerange); } } json_object *json_object_command_selectors(int start, int count) { json_object *json_selectors; json_selectors = json_new_object(); if( start > 0) { json_object_append_integer(json_selectors, "start", start); } if( count > 0) { json_object_append_integer(json_selectors, "count", count); } return json_selectors; } json_object *json_object_commandcount(void) { json_object *json_data; command *temp_command; int count = 0; json_data = json_new_object(); json_object_append_object(json_data, "selectors", json_object_command_selectors(0, 0)); for(temp_command = command_list; temp_command != NULL; temp_command = temp_command->next) { count++; } json_object_append_integer(json_data, "count", count); return json_data; } json_object *json_object_commandlist(unsigned format_options, int start, int count, int details) { json_object *json_data; json_object *json_commandlist_object = NULL; json_array *json_commandlist_array = NULL; json_object *json_command_details; command *temp_command; int current = 0; int counted = 0; json_data = json_new_object(); json_object_append_object(json_data, "selectors", json_object_command_selectors(start, count)); if(details > 0) { json_commandlist_object = json_new_object(); } else { json_commandlist_array = json_new_array(); } for(temp_command = command_list; temp_command != NULL; temp_command = temp_command->next) { /* If the current item passes the start and limit tests, display it */ if( passes_start_and_count_limits(start, count, current, counted)) { if( details > 0) { json_command_details = json_new_object(); json_object_command_details(json_command_details, format_options, temp_command); json_object_append_object(json_commandlist_object, temp_command->name, json_command_details); } else { json_array_append_string(json_commandlist_array, &percent_escapes, temp_command->name); } counted++; } current++; } if(details > 0) { json_object_append_object(json_data, "commandlist", json_commandlist_object); } else { json_object_append_array(json_data, "commandlist", json_commandlist_array); } return json_data; } json_object *json_object_command(unsigned format_options, command *temp_command) { json_object *json_command = json_new_object(); json_object *json_details = json_new_object(); json_object_append_string(json_details, "name", &percent_escapes, temp_command->name); json_object_command_details(json_details, format_options, temp_command); json_object_append_object(json_command, "command", json_details); return json_command; } void json_object_command_details(json_object *json_details, unsigned format_options, command *temp_command) { json_object_append_string(json_details, "name", &percent_escapes, temp_command->name); json_object_append_string(json_details, "command_line", &percent_escapes, temp_command->command_line); } int json_object_servicedependency_passes_selection( servicedependency *temp_servicedependency, host *master_host, hostgroup *master_hostgroup, char *master_service_description, servicegroup *master_servicegroup, host *dependent_host, hostgroup *dependent_hostgroup, char * dependent_service_description, servicegroup *dependent_servicegroup) { host *temp_host = NULL; service *temp_service = NULL; /* Skip if the servicedependency does not have the specified master host */ if(NULL != master_host && strcmp(temp_servicedependency->host_name, master_host->name)) { return 0; } /* Skip if the servicedependency does not have a master host in the specified hostgroup */ if(NULL != master_hostgroup) { temp_host = find_host(temp_servicedependency->host_name); if((NULL != temp_host) && (FALSE == is_host_member_of_hostgroup(master_hostgroup, temp_host))) { return 0; } } /* Skip if the servicedependency does not have the specified master service */ if(NULL != master_service_description && strcmp(temp_servicedependency->service_description, master_service_description)) { return 0; } /* Skip if the servicedependency does not have a master service in the specified servicegroup */ if(NULL != master_servicegroup) { temp_service = find_service(temp_servicedependency->host_name, temp_servicedependency->service_description); if((NULL != temp_service) && (FALSE == is_service_member_of_servicegroup(master_servicegroup, temp_service))) { return 0; } } /* Skip if the servicedependency does not have the specified dependent host */ if(NULL != dependent_host && strcmp(temp_servicedependency->dependent_host_name, dependent_host->name)) { return 0; } /* Skip if the servicedependency does not have a dependent host in the specified hostgroup */ if(NULL != dependent_hostgroup) { temp_host = find_host(temp_servicedependency->dependent_host_name); if((NULL != temp_host) && (FALSE == is_host_member_of_hostgroup(dependent_hostgroup, temp_host))) { return 0; } } /* Skip if the servicedependency does not have the specified dependent service */ if(NULL != dependent_service_description && strcmp(temp_servicedependency->dependent_service_description, dependent_service_description)) { return 0; } /* Skip if the servicedependency does not have a dependent service in the specified servicegroup */ if(NULL != dependent_servicegroup) { temp_service = find_service(temp_servicedependency->dependent_host_name, temp_servicedependency->dependent_service_description); if((NULL != temp_service) && (FALSE == is_service_member_of_servicegroup(dependent_servicegroup, temp_service))) { return 0; } } return 1; } json_object *json_object_servicedependency_selectors(int start, int count, host *master_host, hostgroup *master_hostgroup, char *master_service_description, servicegroup *master_servicegroup, host *dependent_host, hostgroup *dependent_hostgroup, char * dependent_service_description, servicegroup *dependent_servicegroup) { json_object *json_selectors; json_selectors = json_new_object(); if( start > 0) { json_object_append_integer(json_selectors, "start", start); } if( count > 0) { json_object_append_integer(json_selectors, "count", count); } if(NULL != master_host) { json_object_append_string(json_selectors, "masterhostname", &percent_escapes, master_host->name); } if(NULL != master_hostgroup) { json_object_append_string(json_selectors, "masterhostgroupname", &percent_escapes, master_hostgroup->group_name); } if(NULL != master_service_description) { json_object_append_string(json_selectors, "masterservicedescription", &percent_escapes, master_service_description); } if(NULL != master_servicegroup) { json_object_append_string(json_selectors, "masterservicegroupname", &percent_escapes, master_servicegroup->group_name); } if(NULL != dependent_host) { json_object_append_string(json_selectors, "dependenthostname", &percent_escapes, dependent_host->name); } if(NULL != dependent_hostgroup) { json_object_append_string(json_selectors, "dependenthostgroupname", &percent_escapes, dependent_hostgroup->group_name); } if(NULL != dependent_service_description) { json_object_append_string(json_selectors, "dependentservicedescription", &percent_escapes, dependent_service_description); } if(NULL != dependent_servicegroup) { json_object_append_string(json_selectors, "dependentservicegroupname", &percent_escapes, dependent_servicegroup->group_name); } return json_selectors; } json_object *json_object_servicedependencycount(host *master_host, hostgroup *master_hostgroup, char *master_service_description, servicegroup *master_servicegroup, host *dependent_host, hostgroup *dependent_hostgroup, char * dependent_service_description, servicegroup *dependent_servicegroup) { json_object *json_data; #ifdef JSON_NAGIOS_4X int x; #endif servicedependency *temp_servicedependency; int count = 0; json_data = json_new_object(); json_object_append_object(json_data, "selectors", json_object_servicedependency_selectors(0, 0, master_host, master_hostgroup, master_service_description, master_servicegroup, dependent_host, dependent_hostgroup, dependent_service_description, dependent_servicegroup)); #ifdef JSON_NAGIOS_4X for(x = 0; x < num_objects.servicedependencies; x++) { temp_servicedependency = servicedependency_ary[ x]; #else for(temp_servicedependency = servicedependency_list; temp_servicedependency != NULL; temp_servicedependency = temp_servicedependency->next) { #endif if(json_object_servicedependency_passes_selection(temp_servicedependency, master_host, master_hostgroup, master_service_description, master_servicegroup, dependent_host, dependent_hostgroup, dependent_service_description, dependent_servicegroup)) { count++; } } json_object_append_integer(json_data, "count", count); return json_data; } json_object *json_object_servicedependencylist(unsigned format_options, int start, int count, host *master_host, hostgroup *master_hostgroup, char *master_service_description, servicegroup *master_servicegroup, host *dependent_host, hostgroup *dependent_hostgroup, char * dependent_service_description, servicegroup *dependent_servicegroup) { json_object *json_data; json_array *json_servicedependencylist; json_object *json_servicedependency_details; #ifdef JSON_NAGIOS_4X int x; #endif servicedependency *temp_servicedependency; int current = 0; int counted = 0; json_data = json_new_object(); json_object_append_object(json_data, "selectors", json_object_servicedependency_selectors(start, count, master_host, master_hostgroup, master_service_description, master_servicegroup, dependent_host, dependent_hostgroup, dependent_service_description, dependent_servicegroup)); json_servicedependencylist = json_new_array(); #ifdef JSON_NAGIOS_4X for(x = 0; x < num_objects.servicedependencies; x++) { temp_servicedependency = servicedependency_ary[ x]; #else for(temp_servicedependency = servicedependency_list; temp_servicedependency != NULL; temp_servicedependency = temp_servicedependency->next) { #endif if(!json_object_servicedependency_passes_selection(temp_servicedependency, master_host, master_hostgroup, master_service_description, master_servicegroup, dependent_host, dependent_hostgroup, dependent_service_description, dependent_servicegroup)) { continue; } /* If the current item passes the start and limit tests, display it */ if( passes_start_and_count_limits(start, count, current, counted)) { json_servicedependency_details = json_new_object(); json_object_servicedependency_details(json_servicedependency_details, format_options, temp_servicedependency); json_array_append_object(json_servicedependencylist, json_servicedependency_details); } counted++; current++; } json_object_append_array(json_data, "servicedependencylist", json_servicedependencylist); return json_data; } void json_object_servicedependency_details(json_object *json_details, unsigned format_options, servicedependency *temp_servicedependency) { json_object_append_integer(json_details, "dependency_type", temp_servicedependency->dependency_type); json_object_append_string(json_details, "dependent_host_name", &percent_escapes, temp_servicedependency->dependent_host_name); json_object_append_string(json_details, "dependent_service_description", &percent_escapes, temp_servicedependency->dependent_service_description); json_object_append_string(json_details, "host_name", &percent_escapes, temp_servicedependency->host_name); json_object_append_string(json_details, "service_description", &percent_escapes, temp_servicedependency->service_description); json_object_append_string(json_details, "dependency_period", &percent_escapes, temp_servicedependency->dependency_period); json_object_append_boolean(json_details, "inherits_parent", temp_servicedependency->inherits_parent); #ifdef JSON_NAGIOS_4X #if 0 if( CORE3_COMPATIBLE) { json_object_append_boolean(json_details, "fail_on_ok", flag_isset(temp_servicedependency->failure_options, OPT_OK)); json_object_append_boolean(json_details, "fail_on_warning", flag_isset(temp_servicedependency->failure_options, OPT_WARNING)); json_object_append_boolean(json_details, "fail_on_unknown", flag_isset(temp_servicedependency->failure_options, OPT_UNKNOWN)); json_object_append_boolean(json_details, "fail_on_critical", flag_isset(temp_servicedependency->failure_options, OPT_CRITICAL)); json_object_append_boolean(json_details, "fail_on_pending", flag_isset(temp_servicedependency->failure_options, OPT_PENDING)); } else { #endif json_bitmask(json_details, format_options, "failure_options", temp_servicedependency->failure_options, svm_option_types); #if 0 } #endif #else json_object_append_boolean(json_details, "fail_on_ok", temp_servicedependency->fail_on_ok); json_object_append_boolean(json_details, "fail_on_warning", temp_servicedependency->fail_on_warning); json_object_append_boolean(json_details, "fail_on_unknown", temp_servicedependency->fail_on_unknown); json_object_append_boolean(json_details, "fail_on_critical", temp_servicedependency->fail_on_critical); json_object_append_boolean(json_details, "fail_on_pending", temp_servicedependency->fail_on_pending); #endif } int json_object_serviceescalation_passes_selection(serviceescalation *temp_serviceescalation, host *match_host, char *service_description, hostgroup *match_hostgroup, servicegroup *match_servicegroup, contact *match_contact, contactgroup *match_contactgroup) { int found; hostsmember *temp_hostsmember; servicesmember *temp_servicesmember; /* Skip if the serviceescalation is not for the specified host */ if( NULL != match_host && strcmp( temp_serviceescalation->host_name, match_host->name)) { return 0; } if((NULL != service_description) && strcmp(temp_serviceescalation->description, service_description)) { return 0; } if(NULL != match_hostgroup) { found = 0; for(temp_hostsmember = match_hostgroup->members; temp_hostsmember != NULL; temp_hostsmember = temp_hostsmember->next) { if(!strcmp(temp_hostsmember->host_name, temp_serviceescalation->host_name)) { found = 1; break; } } if(0 == found) { return 0; } } if(NULL != match_servicegroup) { found = 0; for(temp_servicesmember = match_servicegroup->members; temp_servicesmember != NULL; temp_servicesmember = temp_servicesmember->next) { if(!strcmp(temp_servicesmember->host_name, temp_serviceescalation->host_name) && !strcmp(temp_servicesmember->service_description, temp_serviceescalation->description)) { found = 1; break; } } if(0 == found) { return 0; } } /* If a contact was specified, skip this service escalation if it does not have the contact specified */ if( NULL != match_contact && ( FALSE == is_contact_for_service_escalation(temp_serviceescalation, match_contact))) { return 0; } /* If a contactgroup was specified, skip this service escalation if it does not have the contactgroup specified */ if(NULL != match_contactgroup && (FALSE == is_contactgroup_for_service_escalation(temp_serviceescalation, match_contactgroup))) { return 0; } return 1; } json_object *json_object_serviceescalation_selectors(int start, int count, host *match_host, char *service_description, hostgroup *match_hostgroup, servicegroup *match_servicegroup, contact *match_contact, contactgroup *match_contactgroup) { json_object *json_selectors; json_selectors = json_new_object(); if(start > 0) { json_object_append_integer(json_selectors, "start", start); } if(count > 0) { json_object_append_integer(json_selectors, "count", count); } if(NULL != match_host) { json_object_append_string(json_selectors, "hostname", &percent_escapes, match_host->name); } if(NULL != service_description) { json_object_append_string(json_selectors, "servicedescription", &percent_escapes, service_description); } if(NULL != match_hostgroup) { json_object_append_string(json_selectors, "hostgroup", &percent_escapes, match_hostgroup->group_name); } if(NULL != match_servicegroup) { json_object_append_string(json_selectors, "servicegroup", &percent_escapes, match_servicegroup->group_name); } if( NULL != match_contact) { json_object_append_string(json_selectors, "contact", &percent_escapes, match_contact->name); } if( NULL != match_contactgroup) { json_object_append_string(json_selectors, "contactgroup", &percent_escapes, match_contactgroup->group_name); } return json_selectors; } json_object *json_object_serviceescalationcount(host *match_host, char *service_description, hostgroup *match_hostgroup, servicegroup *match_servicegroup, contact *match_contact, contactgroup *match_contactgroup) { json_object *json_data; #ifdef JSON_NAGIOS_4X int x; #endif serviceescalation *temp_serviceescalation; int count = 0; json_data = json_new_object(); json_object_append_object(json_data, "selectors", json_object_serviceescalation_selectors(0, 0, match_host, service_description, match_hostgroup, match_servicegroup, match_contact, match_contactgroup)); #ifdef JSON_NAGIOS_4X for(x = 0; x < num_objects.serviceescalations; x++) { temp_serviceescalation=serviceescalation_ary[ x]; #else for(temp_serviceescalation = serviceescalation_list; temp_serviceescalation != NULL; temp_serviceescalation = temp_serviceescalation->next) { #endif if(json_object_serviceescalation_passes_selection(temp_serviceescalation, match_host, service_description, match_hostgroup, match_servicegroup, match_contact, match_contactgroup) == 0) { continue; } count++; } json_object_append_integer(json_data, "count", count); return json_data; } json_object *json_object_serviceescalationlist(unsigned format_options, int start, int count, host *match_host, char *service_description, hostgroup *match_hostgroup, servicegroup *match_servicegroup, contact *match_contact, contactgroup *match_contactgroup) { json_object *json_data; json_array *json_serviceescalationlist; json_object *json_serviceescalation_details; #ifdef JSON_NAGIOS_4X int x; #endif serviceescalation *temp_serviceescalation; int current = 0; int counted = 0; json_data = json_new_object(); json_object_append_object(json_data, "selectors", json_object_serviceescalation_selectors(start, count, match_host, service_description, match_hostgroup, match_servicegroup, match_contact, match_contactgroup)); json_serviceescalationlist = json_new_array(); #ifdef JSON_NAGIOS_4X for(x = 0; x < num_objects.serviceescalations; x++) { temp_serviceescalation=serviceescalation_ary[ x]; #else for(temp_serviceescalation = serviceescalation_list; temp_serviceescalation != NULL; temp_serviceescalation = temp_serviceescalation->next) { #endif if(json_object_serviceescalation_passes_selection(temp_serviceescalation, match_host, service_description, match_hostgroup, match_servicegroup, match_contact, match_contactgroup) == 0) { continue; } /* If the current item passes the start and limit tests, display it */ if( passes_start_and_count_limits(start, count, current, counted)) { json_serviceescalation_details = json_new_object(); json_object_serviceescalation_details(json_serviceescalation_details, format_options, temp_serviceescalation); json_array_append_object(json_serviceescalationlist, json_serviceescalation_details); } counted++; current++; } json_object_append_array(json_data, "serviceescalationlist", json_serviceescalationlist); return json_data; } void json_object_serviceescalation_details(json_object *json_details, unsigned format_options, serviceescalation *temp_serviceescalation) { json_array *json_contactgroups; json_array *json_contacts; contactgroupsmember *temp_contact_groupsmember; contactsmember *temp_contactsmember; json_object_append_string(json_details, "host_name", &percent_escapes, temp_serviceescalation->host_name); json_object_append_string(json_details, "description", &percent_escapes, temp_serviceescalation->description); json_object_append_integer(json_details, "first_notification", temp_serviceescalation->first_notification); json_object_append_integer(json_details, "last_notification", temp_serviceescalation->last_notification); json_object_append_real(json_details, "notification_interval", temp_serviceescalation->notification_interval); json_object_append_string(json_details, "escalation_period", &percent_escapes, temp_serviceescalation->escalation_period); #ifdef JSON_NAGIOS_4X #if 0 if( CORE3_COMPATIBLE) { json_object_append_boolean(json_details, "escalate_on_recovery", flag_isset(temp_serviceescalation->escalation_options, OPT_RECOVERY)); json_object_append_boolean(json_details, "escalate_on_warning", flag_isset(temp_serviceescalation->escalation_options, OPT_WARNING)); json_object_append_boolean(json_details, "escalate_on_unknown", flag_isset(temp_serviceescalation->escalation_options, OPT_UNKNOWN))); json_object_append_boolean(json_details, "escalate_on_critical", flag_isset(temp_serviceescalation->escalation_options, OPT_CRITICAL)); } else { #endif json_bitmask(json_details, format_options, "escalation_options", temp_serviceescalation->escalation_options, svm_option_types); #if 0 } #endif #else json_object_append_boolean(json_details, "escalate_on_recovery", temp_serviceescalation->escalate_on_recovery); json_object_append_boolean(json_details, "escalate_on_warning", temp_serviceescalation->escalate_on_warning); json_object_append_boolean(json_details, "escalate_on_unknown", temp_serviceescalation->escalate_on_unknown); json_object_append_boolean(json_details, "escalate_on_critical", temp_serviceescalation->escalate_on_critical); #endif json_contactgroups = json_new_object(); for(temp_contact_groupsmember = temp_serviceescalation->contact_groups; temp_contact_groupsmember != NULL; temp_contact_groupsmember = temp_contact_groupsmember->next) { json_array_append_string(json_contactgroups, &percent_escapes, temp_contact_groupsmember->group_name); } json_object_append_array(json_details, "contact_groups", json_contactgroups); json_contacts = json_new_object(); for(temp_contactsmember = temp_serviceescalation->contacts; temp_contactsmember != NULL; temp_contactsmember = temp_contactsmember->next) { json_array_append_string(json_contacts, &percent_escapes, temp_contactsmember->contact_name); } json_object_append_array(json_details, "contacts", json_contacts); } int json_object_hostdependency_passes_selection( hostdependency *temp_hostdependency, host *master_host, hostgroup *master_hostgroup, host *dependent_host, hostgroup *dependent_hostgroup) { host *temp_host = NULL; /* Skip if the hostdependency does not have the specified master host */ if(NULL != master_host && strcmp(temp_hostdependency->host_name, master_host->name)) { return 0; } /* Skip if the hostdependency does not have a master host in the specified hostgroup*/ if(NULL != master_hostgroup) { temp_host = find_host(temp_hostdependency->host_name); if((NULL != temp_host) && (FALSE == is_host_member_of_hostgroup(master_hostgroup, temp_host))) { return 0; } } /* Skip if the hostdependency does not have the specified dependent host */ if(NULL != dependent_host && strcmp(temp_hostdependency->dependent_host_name, dependent_host->name)) { return 0; } /* Skip if the hostdependency does not have a dependent host in the specified hostgroup*/ if(NULL != dependent_hostgroup) { temp_host = find_host(temp_hostdependency->dependent_host_name); if((NULL != temp_host) && (FALSE == is_host_member_of_hostgroup(dependent_hostgroup, temp_host))) { return 0; } } return 1; } json_object *json_object_hostdependency_selectors(int start, int count, host *master_host, hostgroup *master_hostgroup, host *dependent_host, hostgroup *dependent_hostgroup) { json_object *json_selectors; json_selectors = json_new_object(); if( start > 0) { json_object_append_integer(json_selectors, "start", start); } if( count > 0) { json_object_append_integer(json_selectors, "count", count); } if(NULL != master_host) { json_object_append_string(json_selectors, "masterhostname", &percent_escapes, master_host->name); } if(NULL != master_hostgroup) { json_object_append_string(json_selectors, "masterhostgroupname", &percent_escapes, master_hostgroup->group_name); } if(NULL != dependent_host) { json_object_append_string(json_selectors, "dependenthostname", &percent_escapes, dependent_host->name); } if(NULL != dependent_hostgroup) { json_object_append_string(json_selectors, "dependenthostgroupname", &percent_escapes, dependent_hostgroup->group_name); } return json_selectors; } json_object *json_object_hostdependencycount(host *master_host, hostgroup *master_hostgroup, host *dependent_host, hostgroup *dependent_hostgroup) { json_object *json_data; #ifdef JSON_NAGIOS_4X int x; #endif hostdependency *temp_hostdependency; int count = 0; json_data = json_new_object(); json_object_append_object(json_data, "selectors", json_object_hostdependency_selectors(0, 0, master_host, master_hostgroup, dependent_host, dependent_hostgroup)); #ifdef JSON_NAGIOS_4X for(x = 0; x < num_objects.hostdependencies; x++) { temp_hostdependency = hostdependency_ary[ x]; #else for(temp_hostdependency = hostdependency_list; temp_hostdependency != NULL; temp_hostdependency = temp_hostdependency->next) { #endif if(json_object_hostdependency_passes_selection( temp_hostdependency, master_host, master_hostgroup, dependent_host, dependent_hostgroup)) { count++; } } json_object_append_integer(json_data, "count", count); return json_data; } json_object *json_object_hostdependencylist(unsigned format_options, int start, int count, host *master_host, hostgroup *master_hostgroup, host *dependent_host, hostgroup *dependent_hostgroup) { json_object *json_data; json_array *json_hostdependencylist; #ifdef JSON_NAGIOS_4X int x; #endif json_object *json_hostdependency_details; hostdependency *temp_hostdependency; int current = 0; int counted = 0; json_data = json_new_object(); json_object_append_object(json_data, "selectors", json_object_hostdependency_selectors(start, count, master_host, master_hostgroup, dependent_host, dependent_hostgroup)); json_hostdependencylist = json_new_array(); #ifdef JSON_NAGIOS_4X for(x = 0; x < num_objects.hostdependencies; x++) { temp_hostdependency = hostdependency_ary[ x]; #else for(temp_hostdependency = hostdependency_list; temp_hostdependency != NULL; temp_hostdependency = temp_hostdependency->next) { #endif if(!json_object_hostdependency_passes_selection( temp_hostdependency, master_host, master_hostgroup, dependent_host, dependent_hostgroup)) { continue; } /* If the current item passes the start and limit tests, display it */ if( passes_start_and_count_limits(start, count, current, counted)) { json_hostdependency_details = json_new_object(); json_object_hostdependency_details(json_hostdependency_details, format_options, temp_hostdependency); json_array_append_object(json_hostdependencylist, json_hostdependency_details); } counted++; current++; } json_object_append_array(json_data, "hostdependencylist", json_hostdependencylist); return json_data; } void json_object_hostdependency_details(json_object *json_details, unsigned format_options, hostdependency *temp_hostdependency) { json_object_append_integer(json_details, "dependency_type", temp_hostdependency->dependency_type); json_object_append_string(json_details, "dependent_host_name", &percent_escapes, temp_hostdependency->dependent_host_name); json_object_append_string(json_details, "host_name", &percent_escapes, temp_hostdependency->host_name); json_object_append_string(json_details, "dependency_period", &percent_escapes, temp_hostdependency->dependency_period); json_object_append_boolean(json_details, "inherits_parent", temp_hostdependency->inherits_parent); #ifdef JSON_NAGIOS_4X #if 0 if( CORE3_COMPATIBLE) { json_object_append_boolean(json_details, "fail_on_up", flag_isset(temp_hostdependency->failure_options, OPT_UP)); json_object_append_boolean(json_details, "fail_on_down", flag_isset(temp_hostdependency->failure_options, OPT_DOWN)); json_object_append_boolean(json_details, "fail_on_unreachable", flag_isset(temp_hostdependency->failure_options, OPT_UNREACHABLE)); json_object_append_boolean(json_details, "fail_on_pending", flag_isset(temp_hostdependency->failure_options, OPT_PENDING)); } else { #endif json_bitmask(json_details, format_options, "failure_options", temp_hostdependency->failure_options, svm_option_types); #if 0 } #endif #else json_object_append_boolean(json_details, "fail_on_up", temp_hostdependency->fail_on_up); json_object_append_boolean(json_details, "fail_on_down", temp_hostdependency->fail_on_down); json_object_append_boolean(json_details, "fail_on_unreachable", temp_hostdependency->fail_on_unreachable); json_object_append_boolean(json_details, "fail_on_pending", temp_hostdependency->fail_on_pending); #endif } int json_object_hostescalation_passes_selection(hostescalation *temp_hostescalation, host *match_host, hostgroup *match_hostgroup, contact *match_contact, contactgroup *match_contactgroup) { int found; hostsmember *temp_hostsmember; /* Skip if the hostescalation is not for the specified host */ if( NULL != match_host && strcmp( temp_hostescalation->host_name, match_host->name)) { return 0; } if(NULL != match_hostgroup) { found = 0; for(temp_hostsmember = match_hostgroup->members; temp_hostsmember != NULL; temp_hostsmember = temp_hostsmember->next) { if(!strcmp(temp_hostsmember->host_name, temp_hostescalation->host_name)) { found = 1; break; } } if(0 == found) { return 0; } } /* If a contact was specified, skip this host escalation if it does not have the contact specified */ if( NULL != match_contact && ( FALSE == is_contact_for_host_escalation(temp_hostescalation, match_contact))) { return 0; } /* If a contactgroup was specified, skip this host escalation if it does not have the contactgroup specified */ if(NULL != match_contactgroup && (FALSE == is_contactgroup_for_host_escalation(temp_hostescalation, match_contactgroup))) { return 0; } return 1; } json_object *json_object_hostescalation_selectors(int start, int count, host *match_host, hostgroup *match_hostgroup, contact *match_contact, contactgroup *match_contactgroup) { json_object *json_selectors; json_selectors = json_new_object(); if( start > 0) { json_object_append_integer(json_selectors, "start", start); } if( count > 0) { json_object_append_integer(json_selectors, "count", count); } if( NULL != match_host) { json_object_append_string(json_selectors, "hostname", &percent_escapes, match_host->name); } if(NULL != match_hostgroup) { json_object_append_string(json_selectors, "hostgroup", &percent_escapes, match_hostgroup->group_name); } if( NULL != match_contact) { json_object_append_string(json_selectors, "contact", &percent_escapes, match_contact->name); } if( NULL != match_contactgroup) { json_object_append_string(json_selectors, "contactgroup", &percent_escapes, match_contactgroup->group_name); } return json_selectors; } json_object *json_object_hostescalationcount(host *match_host, hostgroup *match_hostgroup, contact *match_contact, contactgroup *match_contactgroup) { json_object *json_data; #ifdef JSON_NAGIOS_4X int x; #endif hostescalation *temp_hostescalation; int count = 0; json_data = json_new_object(); json_object_append_object(json_data, "selectors", json_object_hostescalation_selectors(0, 0, match_host, match_hostgroup, match_contact, match_contactgroup)); #ifdef JSON_NAGIOS_4X for(x = 0; x < num_objects.hostescalations; x++) { temp_hostescalation = hostescalation_ary[ x]; #else for(temp_hostescalation = hostescalation_list; temp_hostescalation != NULL; temp_hostescalation = temp_hostescalation->next) { #endif if(json_object_hostescalation_passes_selection(temp_hostescalation, match_host, match_hostgroup, match_contact, match_contactgroup) == 0) { continue; } count++; } json_object_append_integer(json_data, "count", count); return json_data; } json_object *json_object_hostescalationlist(unsigned format_options, int start, int count, host *match_host, hostgroup *match_hostgroup, contact *match_contact, contactgroup *match_contactgroup) { json_object *json_data; json_array *json_hostescalationlist; json_object *json_hostescalation_details; #ifdef JSON_NAGIOS_4X int x; #endif hostescalation *temp_hostescalation; int current = 0; int counted = 0; json_data = json_new_object(); json_object_append_object(json_data, "selectors", json_object_hostescalation_selectors(start, count, match_host, match_hostgroup, match_contact, match_contactgroup)); json_hostescalationlist = json_new_array(); #ifdef JSON_NAGIOS_4X for(x = 0; x < num_objects.hostescalations; x++) { temp_hostescalation = hostescalation_ary[ x]; #else for(temp_hostescalation = hostescalation_list; temp_hostescalation != NULL; temp_hostescalation = temp_hostescalation->next) { #endif if(json_object_hostescalation_passes_selection(temp_hostescalation, match_host, match_hostgroup, match_contact, match_contactgroup) == 0) { continue; } /* If the current item passes the start and limit tests, display it */ if( passes_start_and_count_limits(start, count, current, counted)) { json_hostescalation_details = json_new_object(); json_object_hostescalation_details(json_hostescalation_details, format_options, temp_hostescalation); json_array_append_object(json_hostescalationlist, json_hostescalation_details); } counted++; current++; } json_object_append_array(json_data, "hostescalationlist", json_hostescalationlist); return json_data; } void json_object_hostescalation_details(json_object *json_details, unsigned format_options, hostescalation *temp_hostescalation) { json_array *json_contactgroups; json_array *json_contacts; contactgroupsmember *temp_contact_groupsmember; contactsmember *temp_contactsmember; json_object_append_string(json_details, "host_name", &percent_escapes, temp_hostescalation->host_name); json_object_append_integer(json_details, "first_notification", temp_hostescalation->first_notification); json_object_append_integer(json_details, "last_notification", temp_hostescalation->last_notification); json_object_append_real(json_details, "notification_interval", temp_hostescalation->notification_interval); json_object_append_string(json_details, "escalation_period", &percent_escapes, temp_hostescalation->escalation_period); #ifdef JSON_NAGIOS_4X #if 0 if( CORE3_COMPATIBLE) { json_object_append_boolean(json_details, "escalate_on_recovery", flag_isset(temp_hostescalation->escalation_options, OPT_RECOVERY)); json_object_append_boolean(json_details, "escalate_on_down", flag_isset(temp_hostescalation->escalation_options, OPT_DOWN)); json_object_append_boolean(json_details, "escalate_on_unreachable", flag_isset(temp_hostescalation->escalation_options, OPT_UNREACHABLE)); } else { #endif json_bitmask(json_details, format_options, "escalation_options", temp_hostescalation->escalation_options, svm_option_types); #if 0 } #endif #else json_object_append_boolean(json_details, "escalate_on_recovery", temp_hostescalation->escalate_on_recovery); json_object_append_boolean(json_details, "escalate_on_down", temp_hostescalation->escalate_on_down); json_object_append_boolean(json_details, "escalate_on_unreachable", temp_hostescalation->escalate_on_unreachable); #endif json_contactgroups = json_new_array(); for(temp_contact_groupsmember = temp_hostescalation->contact_groups; temp_contact_groupsmember != NULL; temp_contact_groupsmember = temp_contact_groupsmember->next) { json_array_append_string(json_contactgroups, &percent_escapes, temp_contact_groupsmember->group_name); } json_object_append_array(json_details, "contact_groups", json_contactgroups); json_contacts = json_new_array(); for(temp_contactsmember = temp_hostescalation->contacts; temp_contactsmember != NULL; temp_contactsmember = temp_contactsmember->next) { json_array_append_string(json_contacts, &percent_escapes, temp_contactsmember->contact_name); } json_object_append_array(json_details, "contacts", json_contacts); } nagios-4.3.4/cgi/outages.c000066400000000000000000000462601314764422400153760ustar00rootroot00000000000000/************************************************************************** * * OUTAGES.C - Nagios Network Outages CGI * * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *************************************************************************/ #include "../include/config.h" #include "../include/common.h" #include "../include/objects.h" #include "../include/comments.h" #include "../include/statusdata.h" #include "../include/cgiutils.h" #include "../include/getcgi.h" #include "../include/cgiauth.h" extern int refresh_rate; extern hoststatus *hoststatus_list; extern servicestatus *servicestatus_list; extern char main_config_file[MAX_FILENAME_LENGTH]; extern char url_html_path[MAX_FILENAME_LENGTH]; extern char url_stylesheets_path[MAX_FILENAME_LENGTH]; extern char url_images_path[MAX_FILENAME_LENGTH]; extern char url_logo_images_path[MAX_FILENAME_LENGTH]; /* HOSTOUTAGE structure */ typedef struct hostoutage_struct { host *hst; int severity; int affected_child_hosts; int affected_child_services; unsigned long monitored_time; unsigned long time_up; float percent_time_up; unsigned long time_down; float percent_time_down; unsigned long time_unreachable; float percent_time_unreachable; struct hostoutage_struct *next; } hostoutage; /* HOSTOUTAGESORT structure */ typedef struct hostoutagesort_struct { hostoutage *outage; struct hostoutagesort_struct *next; } hostoutagesort; void document_header(int); void document_footer(void); int process_cgivars(void); void display_network_outages(void); void find_hosts_causing_outages(void); void calculate_outage_effects(void); void calculate_outage_effect_of_host(host *, int *, int *); int is_route_to_host_blocked(host *); int number_of_host_services(host *); void add_hostoutage(host *); void sort_hostoutages(void); void free_hostoutage_list(void); void free_hostoutagesort_list(void); authdata current_authdata; hostoutage *hostoutage_list = NULL; hostoutagesort *hostoutagesort_list = NULL; int service_severity_divisor = 4; /* default = services are 1/4 as important as hosts */ int embedded = FALSE; int display_header = TRUE; int main(void) { /* get the arguments passed in the URL */ process_cgivars(); /* reset internal variables */ reset_cgi_vars(); cgi_init(document_header, document_footer, READ_ALL_OBJECT_DATA, READ_ALL_STATUS_DATA); document_header(TRUE); /* get authentication information */ get_authentication_information(¤t_authdata); if(display_header == TRUE) { /* begin top table */ printf("\n"); printf("\n"); /* left column of the first row */ printf("\n"); /* middle column of top row */ printf("\n"); /* right column of top row */ printf("\n"); /* end of top table */ printf("\n"); printf("
    \n"); display_info_table("Network Outages", TRUE, ¤t_authdata); printf("\n"); printf("\n"); /* display context-sensitive help */ display_context_help(CONTEXTHELP_OUTAGES); printf("
    \n"); } /* display network outage info */ display_network_outages(); document_footer(); /* free memory allocated to comment data */ free_comment_data(); /* free all allocated memory */ free_memory(); return OK; } void document_header(int use_stylesheet) { char date_time[MAX_DATETIME_LENGTH]; time_t current_time; time_t expire_time; printf("Cache-Control: no-store\r\n"); printf("Pragma: no-cache\r\n"); printf("Refresh: %d\r\n", refresh_rate); time(¤t_time); get_time_string(¤t_time, date_time, (int)sizeof(date_time), HTTP_DATE_TIME); printf("Last-Modified: %s\r\n", date_time); expire_time = (time_t)0L; get_time_string(&expire_time, date_time, (int)sizeof(date_time), HTTP_DATE_TIME); printf("Expires: %s\r\n", date_time); printf("Content-type: text/html; charset=utf-8\r\n\r\n"); if(embedded == TRUE) return; printf("\n"); printf("\n"); printf("\n", url_images_path); printf("\n"); printf("Network Outages\n"); printf("\n"); if(use_stylesheet == TRUE) { printf("", url_stylesheets_path, COMMON_CSS); printf("", url_stylesheets_path, OUTAGES_CSS); } printf("\n"); printf("\n"); /* include user SSI header */ include_ssi_files(OUTAGES_CGI, SSI_HEADER); return; } void document_footer(void) { if(embedded == TRUE) return; /* include user SSI footer */ include_ssi_files(OUTAGES_CGI, SSI_FOOTER); printf("\n"); printf("\n"); return; } int process_cgivars(void) { char **variables; int error = FALSE; int x; variables = getcgivars(); for(x = 0; variables[x] != NULL; x++) { /* do some basic length checking on the variable identifier to prevent buffer overflows */ if(strlen(variables[x]) >= MAX_INPUT_BUFFER - 1) { continue; } /* we found the service severity divisor option */ if(!strcmp(variables[x], "service_divisor")) { x++; if(variables[x] == NULL) { error = TRUE; break; } service_severity_divisor = atoi(variables[x]); if(service_severity_divisor < 1) service_severity_divisor = 1; } /* we found the embed option */ else if(!strcmp(variables[x], "embedded")) embedded = TRUE; /* we found the noheader option */ else if(!strcmp(variables[x], "noheader")) display_header = FALSE; } /* free memory allocated to the CGI variables */ free_cgivars(variables); return error; } /* shows all hosts that are causing network outages */ void display_network_outages(void) { char temp_buffer[MAX_INPUT_BUFFER]; int number_of_problem_hosts = 0; int number_of_blocking_problem_hosts = 0; hostoutagesort *temp_hostoutagesort; hostoutage *temp_hostoutage; hoststatus *temp_hoststatus; int odd = 0; const char *bg_class = ""; const char *status = ""; int days; int hours; int minutes; int seconds; int total_comments; time_t t; time_t current_time; char state_duration[48]; int total_entries = 0; /* user must be authorized for all hosts.. */ /* if(is_authorized_for_all_hosts(¤t_authdata) == FALSE) { printf("

    It appears as though you do not have permission to view information you requested...

    \n"); printf("

    If you believe this is an error, check the HTTP server authentication requirements for accessing this CGI
    "); printf("and check the authorization options in your CGI configuration file.

    \n"); return; } */ /* find all hosts that are causing network outages */ find_hosts_causing_outages(); /* calculate outage effects */ calculate_outage_effects(); /* sort the outage list by severity */ sort_hostoutages(); /* count the number of top-level hosts that are down and the ones that are actually blocking children hosts */ for(temp_hostoutage = hostoutage_list; temp_hostoutage != NULL; temp_hostoutage = temp_hostoutage->next) { number_of_problem_hosts++; if(temp_hostoutage->affected_child_hosts > 1) number_of_blocking_problem_hosts++; } /* display the problem hosts... */ printf("

    \n"); printf("
    Blocking Outages
    \n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); for(temp_hostoutagesort = hostoutagesort_list; temp_hostoutagesort != NULL; temp_hostoutagesort = temp_hostoutagesort->next) { temp_hostoutage = temp_hostoutagesort->outage; if(temp_hostoutage == NULL) continue; /* skip hosts that are not blocking anyone */ if(temp_hostoutage->affected_child_hosts <= 1) continue; temp_hoststatus = find_hoststatus(temp_hostoutage->hst->name); if(temp_hoststatus == NULL) continue; /* make sure we only caught valid state types */ if(temp_hoststatus->status != SD_HOST_DOWN && temp_hoststatus->status != SD_HOST_UNREACHABLE) continue; total_entries++; if(odd == 0) { odd = 1; bg_class = "dataOdd"; } else { odd = 0; bg_class = "dataEven"; } if(temp_hoststatus->status == SD_HOST_UNREACHABLE) status = "UNREACHABLE"; else if(temp_hoststatus->status == SD_HOST_DOWN) status = "DOWN"; printf("\n", bg_class); printf("\n", bg_class, temp_hostoutage->severity); printf("\n", bg_class, EXTINFO_CGI, DISPLAY_HOST_INFO, url_encode(temp_hostoutage->hst->name), temp_hostoutage->hst->name); printf("\n", status, status); total_comments = number_of_host_comments(temp_hostoutage->hst->name); if(total_comments > 0) { snprintf(temp_buffer, sizeof(temp_buffer) - 1, "This host has %d comment%s associated with it", total_comments, (total_comments == 1) ? "" : "s"); temp_buffer[sizeof(temp_buffer) - 1] = '\x0'; printf("\n", bg_class, EXTINFO_CGI, DISPLAY_HOST_INFO, url_encode(temp_hostoutage->hst->name), url_images_path, COMMENT_ICON, temp_buffer, temp_buffer); } else printf("\n", bg_class); current_time = time(NULL); if(temp_hoststatus->last_state_change == (time_t)0) t = current_time - program_start; else t = current_time - temp_hoststatus->last_state_change; get_time_breakdown((unsigned long)t, &days, &hours, &minutes, &seconds); snprintf(state_duration, sizeof(state_duration) - 1, "%2dd %2dh %2dm %2ds%s", days, hours, minutes, seconds, (temp_hoststatus->last_state_change == (time_t)0) ? "+" : ""); state_duration[sizeof(state_duration) - 1] = '\x0'; printf("\n", bg_class, state_duration); printf("\n", bg_class, temp_hostoutage->affected_child_hosts); printf("\n", bg_class, temp_hostoutage->affected_child_services); printf("\n"); printf("\n"); } printf("
    SeverityHostStateNotesState Duration# Hosts Affected# Services AffectedActions
    %d%s%s%sN/A%s%d%d", bg_class); printf("View status detail for this host\n", STATUS_CGI, url_encode(temp_hostoutage->hst->name), url_images_path, STATUS_DETAIL_ICON); #ifdef USE_STATUSMAP printf("View status map for this host and its children\n", STATUSMAP_CGI, url_encode(temp_hostoutage->hst->name), url_images_path, STATUSMAP_ICON); #endif #ifdef USE_STATUSWRL printf("View 3-D status map for this host and its children\n", STATUSWORLD_CGI, url_encode(temp_hostoutage->hst->name), url_images_path, STATUSWORLD_ICON); #endif #ifdef USE_TRENDS printf("View trends for this host\n", TRENDS_CGI, url_encode(temp_hostoutage->hst->name), url_images_path, TRENDS_ICON); #endif printf("View alert history for this host\n", HISTORY_CGI, url_encode(temp_hostoutage->hst->name), url_images_path, HISTORY_ICON); printf("View notifications for this host\n", NOTIFICATIONS_CGI, url_encode(temp_hostoutage->hst->name), url_images_path, NOTIFICATION_ICON); printf("
    \n"); printf("

    \n"); if(total_entries == 0) printf("
    %d Blocking Outages Displayed
    \n", total_entries); /* free memory allocated to the host outage list */ free_hostoutage_list(); free_hostoutagesort_list(); return; } /* determine what hosts are causing network outages */ void find_hosts_causing_outages(void) { hoststatus *temp_hoststatus; host *temp_host; /* check all hosts */ for(temp_hoststatus = hoststatus_list; temp_hoststatus != NULL; temp_hoststatus = temp_hoststatus->next) { /* check only hosts that are not up and not pending */ if(temp_hoststatus->status != SD_HOST_UP && temp_hoststatus->status != HOST_PENDING) { /* find the host entry */ temp_host = find_host(temp_hoststatus->host_name); if(temp_host == NULL) continue; if (!is_authorized_for_host(temp_host, ¤t_authdata)) continue; /* if the route to this host is not blocked, it is a causing an outage */ if(is_route_to_host_blocked(temp_host) == FALSE) add_hostoutage(temp_host); } } return; } /* adds a host outage entry */ void add_hostoutage(host *hst) { hostoutage *new_hostoutage; /* allocate memory for a new structure */ new_hostoutage = (hostoutage *)malloc(sizeof(hostoutage)); if(new_hostoutage == NULL) return; new_hostoutage->hst = hst; new_hostoutage->severity = 0; new_hostoutage->affected_child_hosts = 0; new_hostoutage->affected_child_services = 0; /* add the structure to the head of the list in memory */ new_hostoutage->next = hostoutage_list; hostoutage_list = new_hostoutage; return; } /* frees all memory allocated to the host outage list */ void free_hostoutage_list(void) { hostoutage *this_hostoutage; hostoutage *next_hostoutage; /* free all list members */ for(this_hostoutage = hostoutage_list; this_hostoutage != NULL; this_hostoutage = next_hostoutage) { next_hostoutage = this_hostoutage->next; free(this_hostoutage); } /* reset list pointer */ hostoutage_list = NULL; return; } /* frees all memory allocated to the host outage sort list */ void free_hostoutagesort_list(void) { hostoutagesort *this_hostoutagesort; hostoutagesort *next_hostoutagesort; /* free all list members */ for(this_hostoutagesort = hostoutagesort_list; this_hostoutagesort != NULL; this_hostoutagesort = next_hostoutagesort) { next_hostoutagesort = this_hostoutagesort->next; free(this_hostoutagesort); } /* reset list pointer */ hostoutagesort_list = NULL; return; } /* calculates network outage effect of all hosts that are causing blockages */ void calculate_outage_effects(void) { hostoutage *temp_hostoutage; /* check all hosts causing problems */ for(temp_hostoutage = hostoutage_list; temp_hostoutage != NULL; temp_hostoutage = temp_hostoutage->next) { /* calculate the outage effect of this particular hosts */ calculate_outage_effect_of_host(temp_hostoutage->hst, &temp_hostoutage->affected_child_hosts, &temp_hostoutage->affected_child_services); temp_hostoutage->severity = (temp_hostoutage->affected_child_hosts + (temp_hostoutage->affected_child_services / service_severity_divisor)); } return; } /* calculates network outage effect of a particular host being down or unreachable */ void calculate_outage_effect_of_host(host *hst, int *affected_hosts, int *affected_services) { int total_child_hosts_affected = 0; int total_child_services_affected = 0; int temp_child_hosts_affected = 0; int temp_child_services_affected = 0; host *temp_host; /* find all child hosts of this host */ for(temp_host = host_list; temp_host != NULL; temp_host = temp_host->next) { /* skip this host if it is not a child */ if(is_host_immediate_child_of_host(hst, temp_host) == FALSE) continue; /* calculate the outage effect of the child */ calculate_outage_effect_of_host(temp_host, &temp_child_hosts_affected, &temp_child_services_affected); /* keep a running total of outage effects */ total_child_hosts_affected += temp_child_hosts_affected; total_child_services_affected += temp_child_services_affected; } *affected_hosts = total_child_hosts_affected + 1; *affected_services = total_child_services_affected + number_of_host_services(hst); return; } /* tests whether or not a host is "blocked" by upstream parents (host is already assumed to be down or unreachable) */ int is_route_to_host_blocked(host *hst) { hostsmember *temp_hostsmember; hoststatus *temp_hoststatus; /* if the host has no parents, it is not being blocked by anyone */ if(hst->parent_hosts == NULL) return FALSE; /* check all parent hosts */ for(temp_hostsmember = hst->parent_hosts; temp_hostsmember != NULL; temp_hostsmember = temp_hostsmember->next) { /* find the parent host's status */ temp_hoststatus = find_hoststatus(temp_hostsmember->host_name); if(temp_hoststatus == NULL) continue; /* at least one parent it up (or pending), so this host is not blocked */ if(temp_hoststatus->status == SD_HOST_UP || temp_hoststatus->status == HOST_PENDING) return FALSE; } return TRUE; } /* calculates the number of services associated a particular host */ int number_of_host_services(host *hst) { int total_services = 0; service *temp_service; /* check all services */ for(temp_service = service_list; temp_service != NULL; temp_service = temp_service->next) { if(!strcmp(temp_service->host_name, hst->name)) total_services++; } return total_services; } /* sort the host outages by severity */ void sort_hostoutages(void) { hostoutagesort *last_hostoutagesort; hostoutagesort *new_hostoutagesort; hostoutagesort *temp_hostoutagesort; hostoutage *temp_hostoutage; if(hostoutage_list == NULL) return; /* sort all host outage entries */ for(temp_hostoutage = hostoutage_list; temp_hostoutage != NULL; temp_hostoutage = temp_hostoutage->next) { /* allocate memory for a new sort structure */ new_hostoutagesort = (hostoutagesort *)malloc(sizeof(hostoutagesort)); if(new_hostoutagesort == NULL) return; new_hostoutagesort->outage = temp_hostoutage; last_hostoutagesort = hostoutagesort_list; for(temp_hostoutagesort = hostoutagesort_list; temp_hostoutagesort != NULL; temp_hostoutagesort = temp_hostoutagesort->next) { if(new_hostoutagesort->outage->severity >= temp_hostoutagesort->outage->severity) { new_hostoutagesort->next = temp_hostoutagesort; if(temp_hostoutagesort == hostoutagesort_list) hostoutagesort_list = new_hostoutagesort; else last_hostoutagesort->next = new_hostoutagesort; break; } else last_hostoutagesort = temp_hostoutagesort; } if(hostoutagesort_list == NULL) { new_hostoutagesort->next = NULL; hostoutagesort_list = new_hostoutagesort; } else if(temp_hostoutagesort == NULL) { new_hostoutagesort->next = NULL; last_hostoutagesort->next = new_hostoutagesort; } } return; } nagios-4.3.4/cgi/showlog.c000066400000000000000000000366211314764422400154110ustar00rootroot00000000000000/*********************************************************************** * * SHOWLOG.C - Nagios Log File CGI * * * This CGI program will display the contents of the Nagios * log file. * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ***********************************************************************/ #include "../include/config.h" #include "../include/common.h" #include "../include/objects.h" #include "../include/getcgi.h" #include "../include/cgiutils.h" #include "../include/cgiauth.h" extern char main_config_file[MAX_FILENAME_LENGTH]; extern char url_html_path[MAX_FILENAME_LENGTH]; extern char url_images_path[MAX_FILENAME_LENGTH]; extern char url_stylesheets_path[MAX_FILENAME_LENGTH]; extern int enable_splunk_integration; void document_header(int); void document_footer(void); int process_cgivars(void); authdata current_authdata; int display_log(void); char log_file_to_use[MAX_FILENAME_LENGTH] = ""; int log_archive = 0; int use_lifo = TRUE; int embedded = FALSE; int display_header = TRUE; int display_frills = TRUE; int display_timebreaks = TRUE; int main(void) { char temp_buffer[MAX_INPUT_BUFFER]; /* get the CGI variables passed in the URL */ process_cgivars(); /* reset internal variables */ reset_cgi_vars(); cgi_init(document_header, document_footer, READ_ALL_OBJECT_DATA, 0); document_header(TRUE); /* get authentication information */ get_authentication_information(¤t_authdata); /* determine what log file we should be using */ get_log_archive_to_use(log_archive, log_file_to_use, (int)sizeof(log_file_to_use)); if(display_header == TRUE) { /* begin top table */ printf("\n"); printf("\n"); /* left column of top table - info box */ printf("\n"); /* middle column of top table - log file navigation options */ printf("\n"); /* right hand column of top row */ printf("\n"); /* end of top table */ printf("\n"); printf("
    \n"); display_info_table((log_rotation_method == LOG_ROTATION_NONE || log_archive == 0) ? "Current Event Log" : "Archived Event Log", FALSE, ¤t_authdata); printf("\n"); snprintf(temp_buffer, sizeof(temp_buffer) - 1, "%s?%s", SHOWLOG_CGI, (use_lifo == FALSE) ? "oldestfirst&" : ""); temp_buffer[sizeof(temp_buffer) - 1] = '\x0'; display_nav_table(temp_buffer, log_archive); printf("\n"); printf("
    \n", SHOWLOG_CGI); printf("\n", log_archive); printf("\n"); printf(""); printf("", (use_lifo == FALSE) ? "checked" : ""); printf("\n"); printf(""); printf("\n"); printf("\n"); /* display context-sensitive help */ printf("\n"); printf("\n"); printf("\n"); printf("
    Older Entries First:
    \n"); display_context_help(CONTEXTHELP_LOG); printf("
    \n"); printf("
    \n"); printf("
    \n"); printf("

    \n"); } /* display the contents of the log file */ display_log(); document_footer(); /* free allocated memory */ free_memory(); return OK; } void document_header(int use_stylesheet) { char date_time[MAX_DATETIME_LENGTH]; time_t current_time; time_t expire_time; printf("Cache-Control: no-store\r\n"); printf("Pragma: no-cache\r\n"); time(¤t_time); get_time_string(¤t_time, date_time, (int)sizeof(date_time), HTTP_DATE_TIME); printf("Last-Modified: %s\r\n", date_time); expire_time = (time_t)0L; get_time_string(&expire_time, date_time, (int)sizeof(date_time), HTTP_DATE_TIME); printf("Expires: %s\r\n", date_time); printf("Content-type: text/html; charset=utf-8\r\n\r\n"); if(embedded == TRUE) return; printf("\n"); printf("\n"); printf("\n", url_images_path); printf("\n"); printf("Nagios Log File\n"); printf("\n"); if(use_stylesheet == TRUE) { printf("\n", url_stylesheets_path, COMMON_CSS); printf("\n", url_stylesheets_path, SHOWLOG_CSS); } printf("\n"); printf("\n"); /* include user SSI header */ include_ssi_files(SHOWLOG_CGI, SSI_HEADER); return; } void document_footer(void) { if(embedded == TRUE) return; /* include user SSI footer */ include_ssi_files(SHOWLOG_CGI, SSI_FOOTER); printf("\n"); printf("\n"); return; } int process_cgivars(void) { char **variables; int error = FALSE; int x; variables = getcgivars(); for(x = 0; variables[x] != NULL; x++) { /* do some basic length checking on the variable identifier to prevent buffer overflows */ if(strlen(variables[x]) >= MAX_INPUT_BUFFER - 1) { continue; } /* we found the archive argument */ else if(!strcmp(variables[x], "archive")) { x++; if(variables[x] == NULL) { error = TRUE; break; } log_archive = atoi(variables[x]); if(log_archive < 0) log_archive = 0; } /* we found the order argument */ else if(!strcmp(variables[x], "oldestfirst")) { use_lifo = FALSE; } /* we found the embed option */ else if(!strcmp(variables[x], "embedded")) embedded = TRUE; /* we found the noheader option */ else if(!strcmp(variables[x], "noheader")) display_header = FALSE; /* we found the nofrills option */ else if(!strcmp(variables[x], "nofrills")) display_frills = FALSE; /* we found the notimebreaks option */ else if(!strcmp(variables[x], "notimebreaks")) display_timebreaks = FALSE; /* we received an invalid argument */ else error = TRUE; } /* free memory allocated to the CGI variables */ free_cgivars(variables); return error; } /* display the contents of the log file */ int display_log(void) { char *input = NULL; char image[MAX_INPUT_BUFFER]; char image_alt[MAX_INPUT_BUFFER]; time_t t; char *temp_buffer = NULL; char date_time[MAX_DATETIME_LENGTH]; int error = FALSE; mmapfile *thefile = NULL; char last_message_date[MAX_INPUT_BUFFER] = ""; char current_message_date[MAX_INPUT_BUFFER] = ""; struct tm *time_ptr = NULL; /* check to see if the user is authorized to view the log file */ if(is_authorized_for_system_information(¤t_authdata) == FALSE) { printf("
    \n"); printf("
    It appears as though you do not have permission to view the log file...


    \n"); printf("
    If you believe this is an error, check the HTTP server authentication requirements for accessing this CGI
    and check the authorization options in your CGI configuration file.
    \n"); printf("
    \n"); return ERROR; } error = FALSE; if(use_lifo == TRUE) { error = read_file_into_lifo(log_file_to_use); if(error != LIFO_OK) { if(error == LIFO_ERROR_MEMORY) { printf("

    Not enough memory to reverse log file - displaying log in natural order...

    "); error = FALSE; } else error = TRUE; use_lifo = FALSE; } else error = FALSE; } if(use_lifo == FALSE) { if((thefile = mmap_fopen(log_file_to_use)) == NULL) { printf("
    \n"); printf("

    Error: Could not open log file '%s' for reading!

    ", log_file_to_use); printf("
    \n"); error = TRUE; } } if(error == FALSE) { printf("

    \n"); while(1) { free(input); if(use_lifo == TRUE) { if((input = pop_lifo()) == NULL) break; } else if((input = mmap_fgets(thefile)) == NULL) break; strip(input); if(strstr(input, " starting...")) { strcpy(image, START_ICON); strcpy(image_alt, START_ICON_ALT); } else if(strstr(input, " shutting down...")) { strcpy(image, STOP_ICON); strcpy(image_alt, STOP_ICON_ALT); } else if(strstr(input, "Bailing out")) { strcpy(image, STOP_ICON); strcpy(image_alt, STOP_ICON_ALT); } else if(strstr(input, " restarting...")) { strcpy(image, RESTART_ICON); strcpy(image_alt, RESTART_ICON_ALT); } else if(strstr(input, "HOST ALERT:") && strstr(input, ";DOWN;")) { strcpy(image, HOST_DOWN_ICON); strcpy(image_alt, HOST_DOWN_ICON_ALT); } else if(strstr(input, "HOST ALERT:") && strstr(input, ";UNREACHABLE;")) { strcpy(image, HOST_UNREACHABLE_ICON); strcpy(image_alt, HOST_UNREACHABLE_ICON_ALT); } else if(strstr(input, "HOST ALERT:") && (strstr(input, ";RECOVERY;") || strstr(input, ";UP;"))) { strcpy(image, HOST_UP_ICON); strcpy(image_alt, HOST_UP_ICON_ALT); } else if(strstr(input, "HOST NOTIFICATION:")) { strcpy(image, HOST_NOTIFICATION_ICON); strcpy(image_alt, HOST_NOTIFICATION_ICON_ALT); } else if(strstr(input, "SERVICE ALERT:") && strstr(input, ";CRITICAL;")) { strcpy(image, CRITICAL_ICON); strcpy(image_alt, CRITICAL_ICON_ALT); } else if(strstr(input, "SERVICE ALERT:") && strstr(input, ";WARNING;")) { strcpy(image, WARNING_ICON); strcpy(image_alt, WARNING_ICON_ALT); } else if(strstr(input, "SERVICE ALERT:") && strstr(input, ";UNKNOWN;")) { strcpy(image, UNKNOWN_ICON); strcpy(image_alt, UNKNOWN_ICON_ALT); } else if(strstr(input, "SERVICE ALERT:") && (strstr(input, ";RECOVERY;") || strstr(input, ";OK;"))) { strcpy(image, OK_ICON); strcpy(image_alt, OK_ICON_ALT); } else if(strstr(input, "SERVICE NOTIFICATION:")) { strcpy(image, NOTIFICATION_ICON); strcpy(image_alt, NOTIFICATION_ICON_ALT); } else if(strstr(input, "SERVICE EVENT HANDLER:")) { strcpy(image, SERVICE_EVENT_ICON); strcpy(image_alt, SERVICE_EVENT_ICON_ALT); } else if(strstr(input, "HOST EVENT HANDLER:")) { strcpy(image, HOST_EVENT_ICON); strcpy(image_alt, HOST_EVENT_ICON_ALT); } else if(strstr(input, "EXTERNAL COMMAND:")) { strcpy(image, EXTERNAL_COMMAND_ICON); strcpy(image_alt, EXTERNAL_COMMAND_ICON_ALT); } else if(strstr(input, "PASSIVE SERVICE CHECK:")) { strcpy(image, PASSIVE_ICON); strcpy(image_alt, "Passive Service Check"); } else if(strstr(input, "PASSIVE HOST CHECK:")) { strcpy(image, PASSIVE_ICON); strcpy(image_alt, "Passive Host Check"); } else if(strstr(input, "LOG ROTATION:")) { strcpy(image, LOG_ROTATION_ICON); strcpy(image_alt, LOG_ROTATION_ICON_ALT); } else if(strstr(input, "active mode...")) { strcpy(image, ACTIVE_ICON); strcpy(image_alt, ACTIVE_ICON_ALT); } else if(strstr(input, "standby mode...")) { strcpy(image, STANDBY_ICON); strcpy(image_alt, STANDBY_ICON_ALT); } else if(strstr(input, "SERVICE FLAPPING ALERT:") && strstr(input, ";STARTED;")) { strcpy(image, FLAPPING_ICON); strcpy(image_alt, "Service started flapping"); } else if(strstr(input, "SERVICE FLAPPING ALERT:") && strstr(input, ";STOPPED;")) { strcpy(image, FLAPPING_ICON); strcpy(image_alt, "Service stopped flapping"); } else if(strstr(input, "SERVICE FLAPPING ALERT:") && strstr(input, ";DISABLED;")) { strcpy(image, FLAPPING_ICON); strcpy(image_alt, "Service flap detection disabled"); } else if(strstr(input, "HOST FLAPPING ALERT:") && strstr(input, ";STARTED;")) { strcpy(image, FLAPPING_ICON); strcpy(image_alt, "Host started flapping"); } else if(strstr(input, "HOST FLAPPING ALERT:") && strstr(input, ";STOPPED;")) { strcpy(image, FLAPPING_ICON); strcpy(image_alt, "Host stopped flapping"); } else if(strstr(input, "HOST FLAPPING ALERT:") && strstr(input, ";DISABLED;")) { strcpy(image, FLAPPING_ICON); strcpy(image_alt, "Host flap detection disabled"); } else if(strstr(input, "SERVICE DOWNTIME ALERT:") && strstr(input, ";STARTED;")) { strcpy(image, SCHEDULED_DOWNTIME_ICON); strcpy(image_alt, "Service entered a period of scheduled downtime"); } else if(strstr(input, "SERVICE DOWNTIME ALERT:") && strstr(input, ";STOPPED;")) { strcpy(image, SCHEDULED_DOWNTIME_ICON); strcpy(image_alt, "Service exited a period of scheduled downtime"); } else if(strstr(input, "SERVICE DOWNTIME ALERT:") && strstr(input, ";CANCELLED;")) { strcpy(image, SCHEDULED_DOWNTIME_ICON); strcpy(image_alt, "Service scheduled downtime has been cancelled"); } else if(strstr(input, "HOST DOWNTIME ALERT:") && strstr(input, ";STARTED;")) { strcpy(image, SCHEDULED_DOWNTIME_ICON); strcpy(image_alt, "Host entered a period of scheduled downtime"); } else if(strstr(input, "HOST DOWNTIME ALERT:") && strstr(input, ";STOPPED;")) { strcpy(image, SCHEDULED_DOWNTIME_ICON); strcpy(image_alt, "Host exited a period of scheduled downtime"); } else if(strstr(input, "HOST DOWNTIME ALERT:") && strstr(input, ";CANCELLED;")) { strcpy(image, SCHEDULED_DOWNTIME_ICON); strcpy(image_alt, "Host scheduled downtime has been cancelled"); } else { strcpy(image, INFO_ICON); strcpy(image_alt, INFO_ICON_ALT); } temp_buffer = strtok(input, "]"); t = (temp_buffer == NULL) ? 0L : strtoul(temp_buffer + 1, NULL, 10); time_ptr = localtime(&t); strftime(current_message_date, sizeof(current_message_date), "%B %d, %Y %H:00\n", time_ptr); current_message_date[sizeof(current_message_date) - 1] = '\x0'; if(strcmp(last_message_date, current_message_date) != 0 && display_timebreaks == TRUE) { printf("
    \n"); printf("
    \n"); printf(""); printf(""); printf("", current_message_date); printf(""); printf("

    %s
    \n"); printf("
    \n"); printf("
    \n"); strncpy(last_message_date, current_message_date, sizeof(last_message_date)); last_message_date[sizeof(last_message_date) - 1] = '\x0'; } get_time_string(&t, date_time, (int)sizeof(date_time), SHORT_DATE_TIME); strip(date_time); temp_buffer = strtok(NULL, "\n"); if(display_frills == TRUE) printf("%s", url_images_path, image, image_alt, image_alt); printf("[%s] %s", date_time, (temp_buffer == NULL) ? "" : html_encode(temp_buffer, FALSE)); if(enable_splunk_integration == TRUE) { printf("   "); display_splunk_generic_url(temp_buffer, 2); } printf("
    \n"); } printf("

    \n"); printf("
    \n"); free(input); if(use_lifo == FALSE) mmap_fclose(thefile); } if(use_lifo == TRUE) free_lifo_memory(); return OK; } nagios-4.3.4/cgi/status.c000066400000000000000000006421701314764422400152540ustar00rootroot00000000000000/************************************************************************** * * STATUS.C - Nagios Status CGI * * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Tthis program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *************************************************************************/ #include "../include/config.h" #include "../include/common.h" #include "../include/objects.h" #include "../include/comments.h" #include "../include/macros.h" #include "../include/statusdata.h" #include "../include/cgiutils.h" #include "../include/getcgi.h" #include "../include/cgiauth.h" extern int refresh_rate; extern int result_limit; extern char main_config_file[MAX_FILENAME_LENGTH]; extern char url_html_path[MAX_FILENAME_LENGTH]; extern char url_docs_path[MAX_FILENAME_LENGTH]; extern char url_images_path[MAX_FILENAME_LENGTH]; extern char url_stylesheets_path[MAX_FILENAME_LENGTH]; extern char url_logo_images_path[MAX_FILENAME_LENGTH]; extern char url_media_path[MAX_FILENAME_LENGTH]; extern char url_js_path[MAX_FILENAME_LENGTH]; extern char *service_critical_sound; extern char *service_warning_sound; extern char *service_unknown_sound; extern char *host_down_sound; extern char *host_unreachable_sound; extern char *normal_sound; extern char *notes_url_target; extern char *action_url_target; extern int suppress_alert_window; extern int enable_splunk_integration; extern int navbar_search_addresses; extern int navbar_search_aliases; extern hoststatus *hoststatus_list; extern servicestatus *servicestatus_list; static nagios_macros *mac; #define MAX_MESSAGE_BUFFER 4096 #define DISPLAY_HOSTS 0 #define DISPLAY_HOSTGROUPS 1 #define DISPLAY_SERVICEGROUPS 2 #define STYLE_OVERVIEW 0 #define STYLE_DETAIL 1 #define STYLE_SUMMARY 2 #define STYLE_GRID 3 #define STYLE_HOST_DETAIL 4 /* HOSTSORT structure */ typedef struct hostsort_struct { hoststatus *hststatus; struct hostsort_struct *next; } hostsort; /* SERVICESORT structure */ typedef struct servicesort_struct { servicestatus *svcstatus; struct servicesort_struct *next; } servicesort; hostsort *hostsort_list = NULL; servicesort *servicesort_list = NULL; int sort_services(int, int); /* sorts services */ int sort_hosts(int, int); /* sorts hosts */ int compare_servicesort_entries(int, int, servicesort *, servicesort *); /* compares service sort entries */ int compare_hostsort_entries(int, int, hostsort *, hostsort *); /* compares host sort entries */ void free_servicesort_list(void); void free_hostsort_list(void); void show_host_status_totals(void); void show_service_status_totals(void); void show_service_detail(void); void show_host_detail(void); void show_servicegroup_overviews(void); void show_servicegroup_overview(servicegroup *); void show_servicegroup_summaries(void); void show_servicegroup_summary(servicegroup *, int); void show_servicegroup_host_totals_summary(servicegroup *); void show_servicegroup_service_totals_summary(servicegroup *); void show_servicegroup_grids(void); void show_servicegroup_grid(servicegroup *); void show_hostgroup_overviews(void); void show_hostgroup_overview(hostgroup *); void show_servicegroup_hostgroup_member_overview(hoststatus *, int, void *); void show_servicegroup_hostgroup_member_service_status_totals(char *, void *); void show_hostgroup_summaries(void); void show_hostgroup_summary(hostgroup *, int); void show_hostgroup_host_totals_summary(hostgroup *); void show_hostgroup_service_totals_summary(hostgroup *); void show_hostgroup_grids(void); void show_hostgroup_grid(hostgroup *); void show_filters(void); void create_pagenumbers(int total_entries, char *temp_url,int type_service); void create_page_limiter(int result_limit,char *temp_url); int passes_host_properties_filter(hoststatus *); int passes_service_properties_filter(servicestatus *); void document_header(int); void document_footer(void); int process_cgivars(void); authdata current_authdata; time_t current_time; char alert_message[MAX_MESSAGE_BUFFER]; char *host_name = NULL; char *host_address = NULL; char *host_filter = NULL; char *hostgroup_name = NULL; char *servicegroup_name = NULL; char *service_filter = NULL; int host_alert = FALSE; int show_all_hosts = TRUE; int show_all_hostgroups = TRUE; int show_all_servicegroups = TRUE; int display_type = DISPLAY_HOSTS; int overview_columns = 3; int max_grid_width = 8; int group_style_type = STYLE_OVERVIEW; int navbar_search = FALSE; /* experimental paging feature */ int temp_result_limit; int page_start; int limit_results = TRUE; int service_status_types = SERVICE_PENDING | SERVICE_OK | SERVICE_UNKNOWN | SERVICE_WARNING | SERVICE_CRITICAL; int all_service_status_types = SERVICE_PENDING | SERVICE_OK | SERVICE_UNKNOWN | SERVICE_WARNING | SERVICE_CRITICAL; int host_status_types = HOST_PENDING | SD_HOST_UP | SD_HOST_DOWN | SD_HOST_UNREACHABLE; int all_host_status_types = HOST_PENDING | SD_HOST_UP | SD_HOST_DOWN | SD_HOST_UNREACHABLE; int all_service_problems = SERVICE_UNKNOWN | SERVICE_WARNING | SERVICE_CRITICAL; int all_host_problems = SD_HOST_DOWN | SD_HOST_UNREACHABLE; unsigned long host_properties = 0L; unsigned long service_properties = 0L; int num_services = 0; int num_hosts = 0; int sort_type = SORT_NONE; int sort_option = SORT_HOSTNAME; int problem_hosts_down = 0; int problem_hosts_unreachable = 0; int problem_services_critical = 0; int problem_services_warning = 0; int problem_services_unknown = 0; int embedded = FALSE; int display_header = TRUE; int main(void) { char *sound = NULL; host *temp_host = NULL; hostgroup *temp_hostgroup = NULL; servicegroup *temp_servicegroup = NULL; int regex_i = 1, i = 0; int len; mac = get_global_macros(); time(¤t_time); /* get the arguments passed in the URL */ process_cgivars(); /* reset internal variables */ reset_cgi_vars(); cgi_init(document_header, document_footer, READ_ALL_OBJECT_DATA, READ_ALL_STATUS_DATA); /* initialize macros */ init_macros(); /* get authentication information */ get_authentication_information(¤t_authdata); document_header(TRUE); /* if a navbar search was performed, find the host by name, address or partial name */ if(navbar_search == TRUE) { if(host_name != NULL && NULL != strstr(host_name, "*")) { /* allocate for 3 extra chars, ^, $ and \0 */ host_filter = malloc(sizeof(char) * (strlen(host_name) * 2 + 3)); len = strlen(host_name); for(i = 0; i < len; i++, regex_i++) { if(host_name[i] == '*') { host_filter[regex_i++] = '.'; host_filter[regex_i] = '*'; } else host_filter[regex_i] = host_name[i]; } host_filter[0] = '^'; host_filter[regex_i++] = '$'; host_filter[regex_i] = '\0'; } else { if((temp_host = find_host(host_name)) == NULL) { for(temp_host = host_list; temp_host != NULL; temp_host = temp_host->next) { if(is_authorized_for_host(temp_host, ¤t_authdata) == FALSE) continue; if(!strcmp(host_name, temp_host->address)) { host_address = strdup(temp_host->address); host_filter = malloc(sizeof(char) * (strlen(host_address) * 2 + 3)); len = strlen(host_address); for(i = 0; i < len; i++, regex_i++) { host_filter[regex_i] = host_address[i]; } host_filter[0] = '^'; host_filter[regex_i++] = '$'; host_filter[regex_i] = '\0'; break; } } if(temp_host == NULL) { for(temp_host = host_list; temp_host != NULL; temp_host = temp_host->next) { if(is_authorized_for_host(temp_host, ¤t_authdata) == FALSE) continue; if((strstr(temp_host->name, host_name) == temp_host->name) || !strncasecmp(temp_host->name, host_name, strlen(host_name))) { free(host_name); host_name = strdup(temp_host->name); break; } } } } /* last effort, search hostgroups then servicegroups */ if(temp_host == NULL) { if((temp_hostgroup = find_hostgroup(host_name)) != NULL) { display_type = DISPLAY_HOSTGROUPS; show_all_hostgroups = FALSE; free(host_name); hostgroup_name = strdup(temp_hostgroup->group_name); } else if((temp_servicegroup = find_servicegroup(host_name)) != NULL) { display_type = DISPLAY_SERVICEGROUPS; show_all_servicegroups = FALSE; free(host_name); servicegroup_name = strdup(temp_servicegroup->group_name); } } } } if(display_header == TRUE) { /* begin top table */ printf("\n"); printf("\n"); /* left column of the first row */ printf("\n"); /* middle column of top row */ printf("\n"); /* right hand column of top row */ printf("\n"); /* display context-sensitive help */ printf("\n"); /* end of top table */ printf("\n"); printf("
    \n"); /* info table */ display_info_table("Current Network Status", TRUE, ¤t_authdata); printf("\n"); printf("\n"); printf("\n"); printf("\n"); show_host_status_totals(); printf("\n"); show_service_status_totals(); printf("\n"); if(display_type == DISPLAY_HOSTS) display_context_help(CONTEXTHELP_STATUS_DETAIL); else if(display_type == DISPLAY_SERVICEGROUPS) { if(group_style_type == STYLE_HOST_DETAIL) display_context_help(CONTEXTHELP_STATUS_DETAIL); else if(group_style_type == STYLE_OVERVIEW) display_context_help(CONTEXTHELP_STATUS_SGOVERVIEW); else if(group_style_type == STYLE_SUMMARY) display_context_help(CONTEXTHELP_STATUS_SGSUMMARY); else if(group_style_type == STYLE_GRID) display_context_help(CONTEXTHELP_STATUS_SGGRID); } else { if(group_style_type == STYLE_HOST_DETAIL) display_context_help(CONTEXTHELP_STATUS_HOST_DETAIL); else if(group_style_type == STYLE_OVERVIEW) display_context_help(CONTEXTHELP_STATUS_HGOVERVIEW); else if(group_style_type == STYLE_SUMMARY) display_context_help(CONTEXTHELP_STATUS_HGSUMMARY); else if(group_style_type == STYLE_GRID) display_context_help(CONTEXTHELP_STATUS_HGGRID); } printf("
    \n"); } /* embed sound tag if necessary... */ if(problem_hosts_unreachable > 0 && host_unreachable_sound != NULL) sound = host_unreachable_sound; else if(problem_hosts_down > 0 && host_down_sound != NULL) sound = host_down_sound; else if(problem_services_critical > 0 && service_critical_sound != NULL) sound = service_critical_sound; else if(problem_services_warning > 0 && service_warning_sound != NULL) sound = service_warning_sound; else if(problem_services_unknown > 0 && service_unknown_sound != NULL) sound = service_unknown_sound; else if(problem_services_unknown == 0 && problem_services_warning == 0 && problem_services_critical == 0 && problem_hosts_down == 0 && problem_hosts_unreachable == 0 && normal_sound != NULL) sound = normal_sound; if(sound != NULL) { printf("", url_media_path, sound); printf("", url_media_path, sound); printf(""); printf(""); printf(""); } /* Special case where there is a host with no services */ if(display_type == DISPLAY_HOSTS && num_services == 0 && num_hosts != 0 && display_header) { display_type = DISPLAY_HOSTGROUPS; group_style_type = STYLE_HOST_DETAIL; } /* bottom portion of screen - service or hostgroup detail */ if(display_type == DISPLAY_HOSTS) show_service_detail(); else if(display_type == DISPLAY_SERVICEGROUPS) { if(group_style_type == STYLE_OVERVIEW) show_servicegroup_overviews(); else if(group_style_type == STYLE_SUMMARY) show_servicegroup_summaries(); else if(group_style_type == STYLE_GRID) show_servicegroup_grids(); else if(group_style_type == STYLE_HOST_DETAIL) show_host_detail(); else show_service_detail(); } else { if(group_style_type == STYLE_OVERVIEW) show_hostgroup_overviews(); else if(group_style_type == STYLE_SUMMARY) show_hostgroup_summaries(); else if(group_style_type == STYLE_GRID) show_hostgroup_grids(); else if(group_style_type == STYLE_HOST_DETAIL) show_host_detail(); else show_service_detail(); } document_footer(); /* free all allocated memory */ free_memory(); free_comment_data(); /* free memory allocated to the sort lists */ free_servicesort_list(); free_hostsort_list(); return OK; } void document_header(int use_stylesheet) { char date_time[MAX_DATETIME_LENGTH]; char *vidurl = NULL; time_t expire_time; printf("Cache-Control: no-store\r\n"); printf("Pragma: no-cache\r\n"); printf("Refresh: %d\r\n", refresh_rate); get_time_string(¤t_time, date_time, (int)sizeof(date_time), HTTP_DATE_TIME); printf("Last-Modified: %s\r\n", date_time); expire_time = (time_t)0L; get_time_string(&expire_time, date_time, (int)sizeof(date_time), HTTP_DATE_TIME); printf("Expires: %s\r\n", date_time); printf("Content-type: text/html; charset=utf-8\r\n\r\n"); if(embedded == TRUE) return; printf("\n"); printf("\n"); printf("\n", url_images_path); printf("\n"); printf("Current Network Status\n"); printf("\n"); if(use_stylesheet == TRUE) { printf("\n", url_stylesheets_path, COMMON_CSS); printf("\n", url_stylesheets_path, STATUS_CSS); printf("\n", url_stylesheets_path, NAGFUNCS_CSS); } /* added jquery library 1/31/2012 */ printf("\n", url_js_path, JQUERY_JS); printf("\n", url_js_path, NAGFUNCS_JS); /* JS function to append content to elements on page */ printf("\n"); printf("\n"); printf("\n"); /* include user SSI header */ include_ssi_files(STATUS_CGI, SSI_HEADER); return; } void document_footer(void) { if(embedded == TRUE) return; /* include user SSI footer */ include_ssi_files(STATUS_CGI, SSI_FOOTER); printf("\n"); printf("\n"); return; } int process_cgivars(void) { char **variables; int error = FALSE; int x; variables = getcgivars(); for(x = 0; variables[x] != NULL; x++) { /* do some basic length checking on the variable identifier to prevent buffer overflows */ if(strlen(variables[x]) >= MAX_INPUT_BUFFER - 1) { continue; } /* we found the navbar search argument */ else if(!strcmp(variables[x], "navbarsearch")) { x++; if(variables[x] == NULL) { error = TRUE; break; } navbar_search = TRUE; } /* we found the hostgroup argument */ else if(!strcmp(variables[x], "hostgroup")) { display_type = DISPLAY_HOSTGROUPS; x++; if(variables[x] == NULL) { error = TRUE; break; } hostgroup_name = (char *)strdup(variables[x]); strip_html_brackets(hostgroup_name); if(hostgroup_name != NULL && !strcmp(hostgroup_name, "all")) show_all_hostgroups = TRUE; else show_all_hostgroups = FALSE; } /* we found the servicegroup argument */ else if(!strcmp(variables[x], "servicegroup")) { display_type = DISPLAY_SERVICEGROUPS; x++; if(variables[x] == NULL) { error = TRUE; break; } servicegroup_name = strdup(variables[x]); strip_html_brackets(servicegroup_name); if(servicegroup_name != NULL && !strcmp(servicegroup_name, "all")) show_all_servicegroups = TRUE; else show_all_servicegroups = FALSE; } /* we found the host argument */ else if(!strcmp(variables[x], "host")) { display_type = DISPLAY_HOSTS; x++; if(variables[x] == NULL) { error = TRUE; break; } host_name = strdup(variables[x]); strip_html_brackets(host_name); if(host_name != NULL && !strcmp(host_name, "all")) show_all_hosts = TRUE; else show_all_hosts = FALSE; } /* we found the columns argument */ else if(!strcmp(variables[x], "columns")) { x++; if(variables[x] == NULL) { error = TRUE; break; } overview_columns = atoi(variables[x]); if(overview_columns <= 0) overview_columns = 1; } /* we found the service status type argument */ else if(!strcmp(variables[x], "servicestatustypes")) { x++; if(variables[x] == NULL) { error = TRUE; break; } service_status_types = atoi(variables[x]); } /* we found the host status type argument */ else if(!strcmp(variables[x], "hoststatustypes")) { x++; if(variables[x] == NULL) { error = TRUE; break; } host_status_types = atoi(variables[x]); } /* we found the service properties argument */ else if(!strcmp(variables[x], "serviceprops")) { x++; if(variables[x] == NULL) { error = TRUE; break; } service_properties = strtoul(variables[x], NULL, 10); } /* we found the host properties argument */ else if(!strcmp(variables[x], "hostprops")) { x++; if(variables[x] == NULL) { error = TRUE; break; } host_properties = strtoul(variables[x], NULL, 10); } /* we found the host or service group style argument */ else if(!strcmp(variables[x], "style")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(!strcmp(variables[x], "overview")) group_style_type = STYLE_OVERVIEW; else if(!strcmp(variables[x], "detail")) group_style_type = STYLE_DETAIL; else if(!strcmp(variables[x], "summary")) group_style_type = STYLE_SUMMARY; else if(!strcmp(variables[x], "grid")) group_style_type = STYLE_GRID; else if(!strcmp(variables[x], "hostdetail")) group_style_type = STYLE_HOST_DETAIL; else group_style_type = STYLE_DETAIL; } /* we found the sort type argument */ else if(!strcmp(variables[x], "sorttype")) { x++; if(variables[x] == NULL) { error = TRUE; break; } sort_type = atoi(variables[x]); } /* we found the sort option argument */ else if(!strcmp(variables[x], "sortoption")) { x++; if(variables[x] == NULL) { error = TRUE; break; } sort_option = atoi(variables[x]); } /* we found the embed option */ else if(!strcmp(variables[x], "embedded")) embedded = TRUE; /* we found the noheader option */ else if(!strcmp(variables[x], "noheader")) display_header = FALSE; /* servicefilter cgi var */ else if(!strcmp(variables[x], "servicefilter")) { x++; if(variables[x] == NULL) { error = TRUE; break; } service_filter = strdup(variables[x]); strip_html_brackets(service_filter); } /* experimental page limit feature */ else if(!strcmp(variables[x], "start")) { x++; if(variables[x] == NULL) { error = TRUE; break; } page_start = atoi(variables[x]); } else if(!strcmp(variables[x], "limit")) { x++; if(variables[x] == NULL) { error = TRUE; break; } temp_result_limit = atoi(variables[x]); if(temp_result_limit == 0) limit_results = FALSE; else limit_results = TRUE; } } /* free memory allocated to the CGI variables */ free_cgivars(variables); return error; } /* display table with service status totals... */ void show_service_status_totals(void) { int total_ok = 0; int total_warning = 0; int total_unknown = 0; int total_critical = 0; int total_pending = 0; int total_services = 0; int total_problems = 0; servicestatus *temp_servicestatus; service *temp_service; host *temp_host; int count_service; regex_t preg_hostname; if(host_filter != NULL) regcomp(&preg_hostname, host_filter, REG_ICASE); /* check the status of all services... */ for(temp_servicestatus = servicestatus_list; temp_servicestatus != NULL; temp_servicestatus = temp_servicestatus->next) { /* find the host and service... */ temp_host = find_host(temp_servicestatus->host_name); temp_service = find_service(temp_servicestatus->host_name, temp_servicestatus->description); /* make sure user has rights to see this service... */ if(is_authorized_for_service(temp_service, ¤t_authdata) == FALSE) continue; count_service = 0; if(display_type == DISPLAY_HOSTS) { if (show_all_hosts == TRUE) count_service = 1; else if (!strcmp(host_name, temp_servicestatus->host_name)) count_service = 1; else if(host_filter != NULL && 0 == regexec(&preg_hostname, temp_servicestatus->host_name, 0, NULL, 0)) count_service = 1; else if (!strcmp(host_name, temp_host->address)) count_service = 1; else if(host_filter != NULL && navbar_search_addresses == TRUE && 0 == regexec(&preg_hostname, temp_host->address, 0, NULL, 0)) count_service = 1; else if (!strcmp(host_name, temp_host->alias)) count_service = 1; else if(host_filter != NULL && navbar_search_aliases == TRUE && 0 == regexec(&preg_hostname, temp_host->alias, 0, NULL, 0)) count_service = 1; } else if(display_type == DISPLAY_SERVICEGROUPS) { if(show_all_servicegroups == TRUE) { count_service = 1; } else if(is_host_member_of_servicegroup(find_servicegroup(servicegroup_name), temp_host) == TRUE) { count_service = 1; } } else if(display_type == DISPLAY_HOSTGROUPS && (show_all_hostgroups == TRUE || (is_host_member_of_hostgroup(find_hostgroup(hostgroup_name), temp_host) == TRUE))) count_service = 1; if(count_service) { if(temp_servicestatus->status == SERVICE_CRITICAL) { total_critical++; if(temp_servicestatus->problem_has_been_acknowledged == FALSE && (temp_servicestatus->checks_enabled == TRUE || temp_servicestatus->accept_passive_checks == TRUE) && temp_servicestatus->notifications_enabled == TRUE && temp_servicestatus->scheduled_downtime_depth == 0) problem_services_critical++; } else if(temp_servicestatus->status == SERVICE_WARNING) { total_warning++; if(temp_servicestatus->problem_has_been_acknowledged == FALSE && (temp_servicestatus->checks_enabled == TRUE || temp_servicestatus->accept_passive_checks == TRUE) && temp_servicestatus->notifications_enabled == TRUE && temp_servicestatus->scheduled_downtime_depth == 0) problem_services_warning++; } else if(temp_servicestatus->status == SERVICE_UNKNOWN) { total_unknown++; if(temp_servicestatus->problem_has_been_acknowledged == FALSE && (temp_servicestatus->checks_enabled == TRUE || temp_servicestatus->accept_passive_checks == TRUE) && temp_servicestatus->notifications_enabled == TRUE && temp_servicestatus->scheduled_downtime_depth == 0) problem_services_unknown++; } else if(temp_servicestatus->status == SERVICE_OK) total_ok++; else if(temp_servicestatus->status == SERVICE_PENDING) total_pending++; else total_ok++; } } total_services = total_ok + total_unknown + total_warning + total_critical + total_pending; num_services = total_services; total_problems = total_unknown + total_warning + total_critical; printf("
    Service Status Totals
    \n"); printf("\n"); printf("\n"); printf("
    \n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); /* total services ok */ printf("\n", (total_ok > 0) ? "OK" : "", total_ok); /* total services in warning state */ printf("\n", (total_warning > 0) ? "WARNING" : "", total_warning); /* total services in unknown state */ printf("\n", (total_unknown > 0) ? "UNKNOWN" : "", total_unknown); /* total services in critical state */ printf("\n", (total_critical > 0) ? "CRITICAL" : "", total_critical); /* total services in pending state */ printf("\n", (total_pending > 0) ? "PENDING" : "", total_pending); printf("\n"); printf("
    "); printf("", host_status_types); printf("Ok"); printf("", host_status_types); printf("Warning"); printf("", host_status_types); printf("Unknown"); printf("", host_status_types); printf("Critical"); printf("", host_status_types); printf("Pending
    %d%d%d%d%d
    \n"); printf("
    \n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); /* total service problems */ printf("\n", (total_problems > 0) ? "PROBLEMS" : "", total_problems); /* total services */ printf("\n", total_services); printf("\n"); printf("
    "); printf("", host_status_types); printf("All Problems"); printf("", host_status_types); printf("All Types
    %d%d
    \n"); printf("
    \n"); printf("
    \n"); return; } /* display a table with host status totals... */ void show_host_status_totals(void) { int total_up = 0; int total_down = 0; int total_unreachable = 0; int total_pending = 0; int total_hosts = 0; int total_problems = 0; hoststatus *temp_hoststatus; host *temp_host; int count_host; regex_t preg_hostname; if(host_filter != NULL) regcomp(&preg_hostname, host_filter, REG_ICASE); /* check the status of all hosts... */ for(temp_hoststatus = hoststatus_list; temp_hoststatus != NULL; temp_hoststatus = temp_hoststatus->next) { /* find the host... */ temp_host = find_host(temp_hoststatus->host_name); /* make sure user has rights to view this host */ if(is_authorized_for_host(temp_host, ¤t_authdata) == FALSE) continue; count_host = 0; if(display_type == DISPLAY_HOSTS) { if (show_all_hosts == TRUE) count_host = 1; else if (!strcmp(host_name, temp_hoststatus->host_name)) count_host = 1; else if(host_filter != NULL && 0 == regexec(&preg_hostname, temp_hoststatus->host_name, 0, NULL, 0)) count_host = 1; else if (!strcmp(host_name, temp_host->address)) count_host = 1; else if(host_filter != NULL && navbar_search_addresses == TRUE && 0 == regexec(&preg_hostname, temp_host->address, 0, NULL, 0)) count_host = 1; else if (!strcmp(host_name, temp_host->alias)) count_host = 1; else if(host_filter != NULL && navbar_search_aliases == TRUE && 0 == regexec(&preg_hostname, temp_host->alias, 0, NULL, 0)) count_host = 1; } else if(display_type == DISPLAY_SERVICEGROUPS) { if(show_all_servicegroups == TRUE) { count_host = 1; } else if(is_host_member_of_servicegroup(find_servicegroup(servicegroup_name), temp_host) == TRUE) { count_host = 1; } } else if(display_type == DISPLAY_HOSTGROUPS && (show_all_hostgroups == TRUE || (is_host_member_of_hostgroup(find_hostgroup(hostgroup_name), temp_host) == TRUE))) count_host = 1; if(count_host) { if(temp_hoststatus->status == SD_HOST_UP) total_up++; else if(temp_hoststatus->status == SD_HOST_DOWN) { total_down++; if(temp_hoststatus->problem_has_been_acknowledged == FALSE && temp_hoststatus->notifications_enabled == TRUE && temp_hoststatus->checks_enabled == TRUE && temp_hoststatus->scheduled_downtime_depth == 0) problem_hosts_down++; } else if(temp_hoststatus->status == SD_HOST_UNREACHABLE) { total_unreachable++; if(temp_hoststatus->problem_has_been_acknowledged == FALSE && temp_hoststatus->notifications_enabled == TRUE && temp_hoststatus->checks_enabled == TRUE && temp_hoststatus->scheduled_downtime_depth == 0) problem_hosts_unreachable++; } else if(temp_hoststatus->status == HOST_PENDING) total_pending++; else total_up++; } } total_hosts = total_up + total_down + total_unreachable + total_pending; num_hosts = total_hosts; total_problems = total_down + total_unreachable; printf("
    Host Status Totals
    \n"); printf("\n"); printf("\n"); printf("
    \n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); /* total hosts up */ printf("\n", (total_up > 0) ? "UP" : "", total_up); /* total hosts down */ printf("\n", (total_down > 0) ? "DOWN" : "", total_down); /* total hosts unreachable */ printf("\n", (total_unreachable > 0) ? "UNREACHABLE" : "", total_unreachable); /* total hosts pending */ printf("\n", (total_pending > 0) ? "PENDING" : "", total_pending); printf("\n"); printf("
    "); printf("", SD_HOST_UP); printf("Up"); printf("", SD_HOST_DOWN); printf("Down"); printf("", SD_HOST_UNREACHABLE); printf("Unreachable"); printf("", HOST_PENDING); printf("Pending
    %d%d%d%d
    \n"); printf("
    \n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); /* total hosts with problems */ printf("\n", (total_problems > 0) ? "PROBLEMS" : "", total_problems); /* total hosts */ printf("\n", total_hosts); printf("\n"); printf("
    "); printf("", SD_HOST_DOWN | SD_HOST_UNREACHABLE); printf("All Problems"); printf(""); printf("All Types
    %d%d
    \n"); printf("
    \n"); printf("\n"); return; } /* display a detailed listing of the status of all services... */ void show_service_detail(void) { regex_t preg, preg_hostname; time_t t; char date_time[MAX_DATETIME_LENGTH]; char state_duration[48]; char status[MAX_INPUT_BUFFER]; char temp_buffer[MAX_INPUT_BUFFER]; char temp_url[MAX_INPUT_BUFFER]; char *processed_string = NULL; const char *status_class = ""; const char *status_bg_class = ""; const char *host_status_bg_class = ""; const char *last_host = ""; int new_host = FALSE; servicestatus *temp_status = NULL; hostgroup *temp_hostgroup = NULL; servicegroup *temp_servicegroup = NULL; hoststatus *temp_hoststatus = NULL; host *temp_host = NULL; service *temp_service = NULL; int odd = 0; int total_comments = 0; int user_has_seen_something = FALSE; servicesort *temp_servicesort = NULL; int use_sort = FALSE; int result = OK; int first_entry = TRUE; int days; int hours; int minutes; int seconds; int duration_error = FALSE; int total_entries = 0; int show_service = FALSE; int visible_entries = 0; /* sort the service list if necessary */ if(sort_type != SORT_NONE) { result = sort_services(sort_type, sort_option); if(result == ERROR) use_sort = FALSE; else use_sort = TRUE; } else use_sort = FALSE; printf("\n"); printf("\n"); printf(""); printf("\n"); printf("\n"); printf("\n"); printf("
    \n"); if(display_header == TRUE) show_filters(); printf("\n"); printf("
    Service Status Details For "); if(display_type == DISPLAY_HOSTS) { if(show_all_hosts == TRUE) printf("All Hosts"); else printf("Host '%s'", host_name); } else if(display_type == DISPLAY_SERVICEGROUPS) { if(show_all_servicegroups == TRUE) printf("All Service Groups"); else printf("Service Group '%s'", url_encode(servicegroup_name)); } else { if(show_all_hostgroups == TRUE) printf("All Host Groups"); else printf("Host Group '%s'", hostgroup_name); } printf("
    \n"); if(use_sort == TRUE) { printf("
    Entries sorted by "); if(sort_option == SORT_HOSTNAME) printf("host name"); else if(sort_option == SORT_SERVICENAME) printf("service name"); else if(sort_option == SORT_SERVICESTATUS) printf("service status"); else if(sort_option == SORT_LASTCHECKTIME) printf("last check time"); else if(sort_option == SORT_CURRENTATTEMPT) printf("attempt number"); else if(sort_option == SORT_STATEDURATION) printf("state duration"); printf(" (%s)\n", (sort_type == SORT_ASCENDING) ? "ascending" : "descending"); printf("
    \n"); } if(service_filter != NULL) printf("
    Filtered By Services Matching \'%s\'
    ", service_filter); printf("
    "); printf("
    \n"); /* handle navigation GET variables */ snprintf(temp_url, sizeof(temp_url) - 1, "%s?", STATUS_CGI); temp_url[sizeof(temp_url) - 1] = '\x0'; if(display_type == DISPLAY_HOSTS) snprintf(temp_buffer, sizeof(temp_buffer) - 1, "%shost=%s", (navbar_search == TRUE) ? "&navbarsearch=1&" : "", (host_name == NULL) ? "all" : url_encode(host_name)); else if(display_type == DISPLAY_SERVICEGROUPS) snprintf(temp_buffer, sizeof(temp_buffer) - 1, "servicegroup=%s&style=detail", url_encode(servicegroup_name)); else snprintf(temp_buffer, sizeof(temp_buffer) - 1, "hostgroup=%s&style=detail", url_encode(hostgroup_name)); temp_buffer[sizeof(temp_buffer) - 1] = '\x0'; strncat(temp_url, temp_buffer, sizeof(temp_url) - strlen(temp_url) - 1); temp_url[sizeof(temp_url) - 1] = '\x0'; if(service_status_types != all_service_status_types) { snprintf(temp_buffer, sizeof(temp_buffer) - 1, "&servicestatustypes=%d", service_status_types); temp_buffer[sizeof(temp_buffer) - 1] = '\x0'; strncat(temp_url, temp_buffer, sizeof(temp_url) - strlen(temp_url) - 1); temp_url[sizeof(temp_url) - 1] = '\x0'; } if(host_status_types != all_host_status_types) { snprintf(temp_buffer, sizeof(temp_buffer) - 1, "&hoststatustypes=%d", host_status_types); temp_buffer[sizeof(temp_buffer) - 1] = '\x0'; strncat(temp_url, temp_buffer, sizeof(temp_url) - strlen(temp_url) - 1); temp_url[sizeof(temp_url) - 1] = '\x0'; } if(service_properties != 0) { snprintf(temp_buffer, sizeof(temp_buffer) - 1, "&serviceprops=%lu", service_properties); temp_buffer[sizeof(temp_buffer) - 1] = '\x0'; strncat(temp_url, temp_buffer, sizeof(temp_url) - strlen(temp_url) - 1); temp_url[sizeof(temp_url) - 1] = '\x0'; } if(host_properties != 0) { snprintf(temp_buffer, sizeof(temp_buffer) - 1, "&hostprops=%lu", host_properties); temp_buffer[sizeof(temp_buffer) - 1] = '\x0'; strncat(temp_url, temp_buffer, sizeof(temp_url) - strlen(temp_url) - 1); temp_url[sizeof(temp_url) - 1] = '\x0'; } if(temp_result_limit) { snprintf(temp_buffer, sizeof(temp_buffer) - 1, "&limit=%i", temp_result_limit); temp_buffer[sizeof(temp_buffer) - 1] = '\x0'; strncat(temp_url, temp_buffer, sizeof(temp_url) - strlen(temp_url) - 1); temp_url[sizeof(temp_url) - 1] = '\x0'; } if(use_sort) { snprintf(temp_buffer, sizeof(temp_buffer) - 1, "&sorttype=%i", sort_type); temp_buffer[sizeof(temp_buffer) - 1] = '\x0'; strncat(temp_url, temp_buffer, sizeof(temp_url) - strlen(temp_url) - 1); temp_url[sizeof(temp_url) - 1] = '\x0'; snprintf(temp_buffer, sizeof(temp_buffer) - 1, "&sortoption=%i", sort_option); temp_buffer[sizeof(temp_buffer) - 1] = '\x0'; strncat(temp_url, temp_buffer, sizeof(temp_url) - strlen(temp_url) - 1); temp_url[sizeof(temp_url) - 1] = '\x0'; } /* GET input can override cgi.cfg */ if(limit_results==TRUE) result_limit = temp_result_limit ? temp_result_limit : result_limit; else result_limit = 0; /* select box to set result limit */ create_page_limiter(result_limit,temp_url); /* the main list of services */ printf("\n"); printf("\n"); printf("", temp_url, SORT_ASCENDING, SORT_HOSTNAME, url_images_path, UP_ARROW_ICON, temp_url, SORT_DESCENDING, SORT_HOSTNAME, url_images_path, DOWN_ARROW_ICON); printf("", temp_url, SORT_ASCENDING, SORT_SERVICENAME, url_images_path, UP_ARROW_ICON, temp_url, SORT_DESCENDING, SORT_SERVICENAME, url_images_path, DOWN_ARROW_ICON); printf("", temp_url, SORT_ASCENDING, SORT_SERVICESTATUS, url_images_path, UP_ARROW_ICON, temp_url, SORT_DESCENDING, SORT_SERVICESTATUS, url_images_path, DOWN_ARROW_ICON); printf("", temp_url, SORT_ASCENDING, SORT_LASTCHECKTIME, url_images_path, UP_ARROW_ICON, temp_url, SORT_DESCENDING, SORT_LASTCHECKTIME, url_images_path, DOWN_ARROW_ICON); printf("", temp_url, SORT_ASCENDING, SORT_STATEDURATION, url_images_path, UP_ARROW_ICON, temp_url, SORT_DESCENDING, SORT_STATEDURATION, url_images_path, DOWN_ARROW_ICON); printf("", temp_url, SORT_ASCENDING, SORT_CURRENTATTEMPT, url_images_path, UP_ARROW_ICON, temp_url, SORT_DESCENDING, SORT_CURRENTATTEMPT, url_images_path, DOWN_ARROW_ICON); printf("\n"); printf("\n"); if(service_filter != NULL) regcomp(&preg, service_filter, 0); if(host_filter != NULL) regcomp(&preg_hostname, host_filter, REG_ICASE); temp_hostgroup = find_hostgroup(hostgroup_name); temp_servicegroup = find_servicegroup(servicegroup_name); /* check all services... */ while(1) { /* get the next service to display */ if(use_sort == TRUE) { if(first_entry == TRUE) temp_servicesort = servicesort_list; else temp_servicesort = temp_servicesort->next; if(temp_servicesort == NULL) break; temp_status = temp_servicesort->svcstatus; } else { if(first_entry == TRUE) temp_status = servicestatus_list; else temp_status = temp_status->next; } if(temp_status == NULL) break; first_entry = FALSE; /* find the service */ temp_service = find_service(temp_status->host_name, temp_status->description); /* if we couldn't find the service, go to the next service */ if(temp_service == NULL) continue; /* find the host */ temp_host = find_host(temp_service->host_name); /* make sure user has rights to see this... */ if(is_authorized_for_service(temp_service, ¤t_authdata) == FALSE) continue; user_has_seen_something = TRUE; /* get the host status information */ temp_hoststatus = find_hoststatus(temp_service->host_name); /* see if we should display services for hosts with tis type of status */ if(!(host_status_types & temp_hoststatus->status)) continue; /* see if we should display this type of service status */ if(!(service_status_types & temp_status->status)) continue; /* check host properties filter */ if(passes_host_properties_filter(temp_hoststatus) == FALSE) continue; /* check service properties filter */ if(passes_service_properties_filter(temp_status) == FALSE) continue; /* servicefilter cgi var */ if(service_filter != NULL) if(regexec(&preg, temp_status->description, 0, NULL, 0)) continue; show_service = FALSE; if(display_type == DISPLAY_HOSTS) { if(show_all_hosts == TRUE) show_service = TRUE; else if(host_filter != NULL && 0 == regexec(&preg_hostname, temp_status->host_name, 0, NULL, 0)) show_service = TRUE; else if(host_filter != NULL && navbar_search_addresses == TRUE && 0 == regexec(&preg_hostname, temp_host->address, 0, NULL, 0)) show_service = TRUE; else if(host_filter != NULL && navbar_search_aliases == TRUE && 0 == regexec(&preg_hostname, temp_host->alias, 0, NULL, 0)) show_service = TRUE; else if(!strcmp(host_name, temp_status->host_name)) show_service = TRUE; else if(navbar_search_addresses == TRUE && !strcmp(host_name, temp_host->address)) show_service = TRUE; else if(navbar_search_aliases == TRUE && !strcmp(host_name, temp_host->alias)) show_service = TRUE; } else if(display_type == DISPLAY_HOSTGROUPS) { if(show_all_hostgroups == TRUE) show_service = TRUE; else if(is_host_member_of_hostgroup(temp_hostgroup, temp_host) == TRUE) show_service = TRUE; } else if(display_type == DISPLAY_SERVICEGROUPS) { if(show_all_servicegroups == TRUE) show_service = TRUE; else if(is_service_member_of_servicegroup(temp_servicegroup, temp_service) == TRUE) show_service = TRUE; } /* final checks for display visibility, add to total results. Used for page numbers */ if(result_limit == 0) limit_results = FALSE; if( (limit_results == TRUE && show_service== TRUE) && ( (total_entries < page_start) || (total_entries > (page_start + result_limit)) ) ) { total_entries++; show_service = FALSE; } /* a visible entry */ if(show_service == TRUE) { if(strcmp(last_host, temp_status->host_name) || visible_entries == 0 ) new_host = TRUE; else new_host = FALSE; if(new_host == TRUE) { if(strcmp(last_host, "")) { printf("\n"); printf("\n"); } } if(odd) odd = 0; else odd = 1; /* keep track of total number of services we're displaying */ visible_entries++; total_entries++; /* get the last service check time */ t = temp_status->last_check; get_time_string(&t, date_time, (int)sizeof(date_time), SHORT_DATE_TIME); if((unsigned long)temp_status->last_check == 0L) strcpy(date_time, "N/A"); if(temp_status->status == SERVICE_PENDING) { strncpy(status, "PENDING", sizeof(status)); status_class = "PENDING"; status_bg_class = (odd) ? "Even" : "Odd"; } else if(temp_status->status == SERVICE_OK) { strncpy(status, "OK", sizeof(status)); status_class = "OK"; status_bg_class = (odd) ? "Even" : "Odd"; } else if(temp_status->status == SERVICE_WARNING) { strncpy(status, "WARNING", sizeof(status)); status_class = "WARNING"; if(temp_status->problem_has_been_acknowledged == TRUE) status_bg_class = "BGWARNINGACK"; else if(temp_status->scheduled_downtime_depth > 0) status_bg_class = "BGWARNINGSCHED"; else status_bg_class = "BGWARNING"; } else if(temp_status->status == SERVICE_UNKNOWN) { strncpy(status, "UNKNOWN", sizeof(status)); status_class = "UNKNOWN"; if(temp_status->problem_has_been_acknowledged == TRUE) status_bg_class = "BGUNKNOWNACK"; else if(temp_status->scheduled_downtime_depth > 0) status_bg_class = "BGUNKNOWNSCHED"; else status_bg_class = "BGUNKNOWN"; } else if(temp_status->status == SERVICE_CRITICAL) { strncpy(status, "CRITICAL", sizeof(status)); status_class = "CRITICAL"; if(temp_status->problem_has_been_acknowledged == TRUE) status_bg_class = "BGCRITICALACK"; else if(temp_status->scheduled_downtime_depth > 0) status_bg_class = "BGCRITICALSCHED"; else status_bg_class = "BGCRITICAL"; } status[sizeof(status) - 1] = '\x0'; printf("\n"); /* host name column */ if(new_host == TRUE) { /* grab macros */ grab_host_macros_r(mac, temp_host); if(temp_hoststatus->status == SD_HOST_DOWN) { if(temp_hoststatus->problem_has_been_acknowledged == TRUE) host_status_bg_class = "HOSTDOWNACK"; else if(temp_hoststatus->scheduled_downtime_depth > 0) host_status_bg_class = "HOSTDOWNSCHED"; else host_status_bg_class = "HOSTDOWN"; } else if(temp_hoststatus->status == SD_HOST_UNREACHABLE) { if(temp_hoststatus->problem_has_been_acknowledged == TRUE) host_status_bg_class = "HOSTUNREACHABLEACK"; else if(temp_hoststatus->scheduled_downtime_depth > 0) host_status_bg_class = "HOSTUNREACHABLESCHED"; else host_status_bg_class = "HOSTUNREACHABLE"; } else host_status_bg_class = (odd) ? "Even" : "Odd"; printf("\n"); /* grab macros */ grab_service_macros_r(mac, temp_service); /* service name column */ printf("\n"); /* state duration calculation... */ t = 0; duration_error = FALSE; if(temp_status->last_state_change == (time_t)0) { if(program_start > current_time) duration_error = TRUE; else t = current_time - program_start; } else { if(temp_status->last_state_change > current_time) duration_error = TRUE; else t = current_time - temp_status->last_state_change; } get_time_breakdown((unsigned long)t, &days, &hours, &minutes, &seconds); if(duration_error == TRUE) snprintf(state_duration, sizeof(state_duration) - 1, "???"); else snprintf(state_duration, sizeof(state_duration) - 1, "%2dd %2dh %2dm %2ds%s", days, hours, minutes, seconds, (temp_status->last_state_change == (time_t)0) ? "+" : ""); state_duration[sizeof(state_duration) - 1] = '\x0'; /* the rest of the columns... */ printf("\n", status_class, status); printf("\n", status_bg_class, date_time); printf("\n", status_bg_class, state_duration); printf("\n", status_bg_class, temp_status->current_attempt, temp_status->max_attempts); printf("\n"); printf("\n"); /* mod to account for paging */ if(visible_entries != 0) last_host = temp_status->host_name; } } printf("
    Host Sort by host name (ascending)Sort by host name (descending)Service Sort by service name (ascending)Sort by service name (descending)Status Sort by service status (ascending)Sort by service status (descending)Last Check Sort by last check time (ascending)Sort by last check time (descending)Duration Sort by state duration (ascending)Sort by state duration time (descending)Attempt Sort by current attempt (ascending)Sort by current attempt (descending)Status Information
    ", host_status_bg_class); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("
    \n"); printf("\n"); printf("\n"); printf("\n", host_status_bg_class, EXTINFO_CGI, DISPLAY_HOST_INFO, url_encode(temp_status->host_name), temp_host->address, temp_status->host_name); printf("\n"); printf("
    %s
    \n"); printf("
    \n"); printf("\n"); printf("\n"); total_comments = number_of_host_comments(temp_host->name); if(temp_hoststatus->problem_has_been_acknowledged == TRUE) { printf("", EXTINFO_CGI, DISPLAY_HOST_INFO, url_encode(temp_status->host_name), url_images_path, ACKNOWLEDGEMENT_ICON, STATUS_ICON_WIDTH, STATUS_ICON_HEIGHT); } /* only show comments if this is a non-read-only user */ if(is_authorized_for_read_only(¤t_authdata) == FALSE) { if(total_comments > 0) printf("", EXTINFO_CGI, DISPLAY_HOST_INFO, url_encode(temp_status->host_name), url_images_path, COMMENT_ICON, STATUS_ICON_WIDTH, STATUS_ICON_HEIGHT, total_comments, (total_comments == 1) ? "" : "s", total_comments, (total_comments == 1) ? "" : "s"); } if(temp_hoststatus->notifications_enabled == FALSE) { printf("", EXTINFO_CGI, DISPLAY_HOST_INFO, url_encode(temp_status->host_name), url_images_path, NOTIFICATIONS_DISABLED_ICON, STATUS_ICON_WIDTH, STATUS_ICON_HEIGHT); } if(temp_hoststatus->checks_enabled == FALSE) { printf("", EXTINFO_CGI, DISPLAY_HOST_INFO, url_encode(temp_status->host_name), url_images_path, DISABLED_ICON, STATUS_ICON_WIDTH, STATUS_ICON_HEIGHT); } if(temp_hoststatus->is_flapping == TRUE) { printf("", EXTINFO_CGI, DISPLAY_HOST_INFO, url_encode(temp_status->host_name), url_images_path, FLAPPING_ICON, STATUS_ICON_WIDTH, STATUS_ICON_HEIGHT); } if(temp_hoststatus->scheduled_downtime_depth > 0) { printf("", EXTINFO_CGI, DISPLAY_HOST_INFO, url_encode(temp_status->host_name), url_images_path, SCHEDULED_DOWNTIME_ICON, STATUS_ICON_WIDTH, STATUS_ICON_HEIGHT); } if(temp_host->notes_url != NULL) { printf("\n"); } if(temp_host->action_url != NULL) { printf("\n"); } if(temp_host->icon_image != NULL) { printf("\n"); } printf("\n"); printf("
    This host problem has been acknowledgedThis host has %d comment%s associated with itNotifications for this host have been disabledChecks of this host have been disabledThis host is flapping between statesThis host is currently in a period of scheduled downtime"); printf("", (notes_url_target == NULL) ? "_blank" : notes_url_target); printf("%s", url_images_path, NOTES_ICON, STATUS_ICON_WIDTH, STATUS_ICON_HEIGHT, "View Extra Host Notes", "View Extra Host Notes"); printf(""); printf(""); printf("", (action_url_target == NULL) ? "_blank" : action_url_target); printf("%s", url_images_path, ACTION_ICON, STATUS_ICON_WIDTH, STATUS_ICON_HEIGHT, "Perform Extra Host Actions", "Perform Extra Host Actions"); printf(""); printf(""); printf("", EXTINFO_CGI, DISPLAY_HOST_INFO, url_encode(temp_status->host_name)); printf("%s", STATUS_ICON_WIDTH, STATUS_ICON_HEIGHT, (temp_host->icon_image_alt == NULL) ? "" : temp_host->icon_image_alt, (temp_host->icon_image_alt == NULL) ? "" : temp_host->icon_image_alt); printf(""); printf("
    \n"); printf("
    \n"); } else printf("
    "); printf("", status_bg_class); printf(""); printf(""); printf("\n"); printf("\n"); printf(""); printf("
    "); printf("\n"); printf("\n"); printf("", temp_status->description); printf("\n"); printf("
    ", url_encode(temp_status->description)); printf("%s
    \n"); printf("
    \n", status_bg_class); printf("\n"); printf("\n"); total_comments = number_of_service_comments(temp_service->host_name, temp_service->description); /* only show comments if this is a non-read-only user */ if(is_authorized_for_read_only(¤t_authdata) == FALSE) { if(total_comments > 0) { printf("", url_encode(temp_status->description), url_images_path, COMMENT_ICON, STATUS_ICON_WIDTH, STATUS_ICON_HEIGHT, total_comments, (total_comments == 1) ? "" : "s", total_comments, (total_comments == 1) ? "" : "s"); } } if(temp_status->problem_has_been_acknowledged == TRUE) { printf("", url_encode(temp_status->description), url_images_path, ACKNOWLEDGEMENT_ICON, STATUS_ICON_WIDTH, STATUS_ICON_HEIGHT); } if(temp_status->checks_enabled == FALSE && temp_status->accept_passive_checks == FALSE) { printf("", url_encode(temp_status->description), url_images_path, DISABLED_ICON, STATUS_ICON_WIDTH, STATUS_ICON_HEIGHT); } else if(temp_status->checks_enabled == FALSE) { printf("", url_encode(temp_status->description), url_images_path, PASSIVE_ONLY_ICON, STATUS_ICON_WIDTH, STATUS_ICON_HEIGHT); } if(temp_status->notifications_enabled == FALSE) { printf("", url_encode(temp_status->description), url_images_path, NOTIFICATIONS_DISABLED_ICON, STATUS_ICON_WIDTH, STATUS_ICON_HEIGHT); } if(temp_status->is_flapping == TRUE) { printf("", url_encode(temp_status->description), url_images_path, FLAPPING_ICON, STATUS_ICON_WIDTH, STATUS_ICON_HEIGHT); } if(temp_status->scheduled_downtime_depth > 0) { printf("", url_encode(temp_status->description), url_images_path, SCHEDULED_DOWNTIME_ICON, STATUS_ICON_WIDTH, STATUS_ICON_HEIGHT); } if(temp_service->notes_url != NULL) { printf("\n"); } if(temp_service->action_url != NULL) { printf("\n"); } if(temp_service->icon_image != NULL) { printf("\n"); } if(enable_splunk_integration == TRUE) { printf("\n"); } printf("\n"); printf("
    This service has %d comment%s associated with itThis service problem has been acknowledgedActive and passive checks have been disabled for this serviceActive checks of the service have been disabled - only passive checks are being acceptedNotifications for this service have been disabledThis service is flapping between statesThis service is currently in a period of scheduled downtime"); printf("", (notes_url_target == NULL) ? "_blank" : notes_url_target); printf("%s", url_images_path, NOTES_ICON, STATUS_ICON_WIDTH, STATUS_ICON_HEIGHT, "View Extra Service Notes", "View Extra Service Notes"); printf(""); printf(""); printf("", (action_url_target == NULL) ? "_blank" : action_url_target); printf("%s", url_images_path, ACTION_ICON, STATUS_ICON_WIDTH, STATUS_ICON_HEIGHT, "Perform Extra Service Actions", "Perform Extra Service Actions"); printf(""); printf(""); printf("", url_encode(temp_service->description)); printf("%s", STATUS_ICON_WIDTH, STATUS_ICON_HEIGHT, (temp_service->icon_image_alt == NULL) ? "" : temp_service->icon_image_alt, (temp_service->icon_image_alt == NULL) ? "" : temp_service->icon_image_alt); printf(""); printf(""); display_splunk_service_url(temp_service); printf("
    \n"); printf("
    "); printf("
    %s%s%s%d/%d", status_bg_class); printf("%s ", (temp_status->plugin_output == NULL) ? "" : html_encode(temp_status->plugin_output, TRUE)); /* if(enable_splunk_integration==TRUE) display_splunk_service_url(temp_service); */ printf("
    \n"); /* if user couldn't see anything, print out some helpful info... */ if(user_has_seen_something == FALSE) { if(servicestatus_list != NULL) { printf("

    It appears as though you do not have permission to view information for any of the services you requested...

    \n"); printf("

    If you believe this is an error, check the HTTP server authentication requirements for accessing this CGI
    "); printf("and check the authorization options in your CGI configuration file.

    \n"); } else { printf("

    There doesn't appear to be any service status information in the status log...

    \n"); printf("Make sure that Nagios is running and that you have specified the location of you status log correctly in the configuration files.

    \n"); } } else { /* do page numbers if applicable */ create_pagenumbers(total_entries,temp_url,TRUE); } return; } /* display a detailed listing of the status of all hosts... */ void show_host_detail(void) { time_t t; char date_time[MAX_DATETIME_LENGTH]; char state_duration[48]; char status[MAX_INPUT_BUFFER]; char temp_buffer[MAX_INPUT_BUFFER]; char temp_url[MAX_INPUT_BUFFER]; char *processed_string = NULL; const char *status_class = ""; const char *status_bg_class = ""; hoststatus *temp_status = NULL; hostgroup *temp_hostgroup = NULL; host *temp_host = NULL; hostsort *temp_hostsort = NULL; int odd = 0; int total_comments = 0; int user_has_seen_something = FALSE; int use_sort = FALSE; int result = OK; int first_entry = TRUE; int days; int hours; int minutes; int seconds; int duration_error = FALSE; int total_entries = 0; int visible_entries = 0; regex_t preg_hostname; // int show_host = FALSE; if(host_filter != NULL) regcomp(&preg_hostname, host_filter, REG_ICASE); /* sort the host list if necessary */ if(sort_type != SORT_NONE) { result = sort_hosts(sort_type, sort_option); if(result == ERROR) use_sort = FALSE; else use_sort = TRUE; } else use_sort = FALSE; // printf("

    \n"); printf("\n"); printf("\n"); printf(""); printf("\n"); printf("\n"); printf("\n"); printf("
    \n"); if(display_header == TRUE) show_filters(); printf("\n"); printf("
    Host Status Details For "); if(show_all_hostgroups == TRUE) printf("All Host Groups"); else printf("Host Group '%s'", hostgroup_name); printf("
    \n"); if(use_sort == TRUE) { printf("
    Entries sorted by "); if(sort_option == SORT_HOSTNAME) printf("host name"); else if(sort_option == SORT_HOSTSTATUS) printf("host status"); else if(sort_option == SORT_HOSTURGENCY) printf("host urgency"); else if(sort_option == SORT_LASTCHECKTIME) printf("last check time"); else if(sort_option == SORT_CURRENTATTEMPT) printf("attempt number"); else if(sort_option == SORT_STATEDURATION) printf("state duration"); printf(" (%s)\n", (sort_type == SORT_ASCENDING) ? "ascending" : "descending"); printf("
    \n"); } printf("
    "); printf("
    \n"); snprintf(temp_url, sizeof(temp_url) - 1, "%s?", STATUS_CGI); temp_url[sizeof(temp_url) - 1] = '\x0'; snprintf(temp_buffer, sizeof(temp_buffer) - 1, "hostgroup=%s&style=hostdetail", url_encode(hostgroup_name)); temp_buffer[sizeof(temp_buffer) - 1] = '\x0'; strncat(temp_url, temp_buffer, sizeof(temp_url) - strlen(temp_url) - 1); temp_url[sizeof(temp_url) - 1] = '\x0'; if(service_status_types != all_service_status_types) { snprintf(temp_buffer, sizeof(temp_buffer) - 1, "&servicestatustypes=%d", service_status_types); temp_buffer[sizeof(temp_buffer) - 1] = '\x0'; strncat(temp_url, temp_buffer, sizeof(temp_url) - strlen(temp_url) - 1); temp_url[sizeof(temp_url) - 1] = '\x0'; } if(host_status_types != all_host_status_types) { snprintf(temp_buffer, sizeof(temp_buffer) - 1, "&hoststatustypes=%d", host_status_types); temp_buffer[sizeof(temp_buffer) - 1] = '\x0'; strncat(temp_url, temp_buffer, sizeof(temp_url) - strlen(temp_url) - 1); temp_url[sizeof(temp_url) - 1] = '\x0'; } if(service_properties != 0) { snprintf(temp_buffer, sizeof(temp_buffer) - 1, "&serviceprops=%lu", service_properties); temp_buffer[sizeof(temp_buffer) - 1] = '\x0'; strncat(temp_url, temp_buffer, sizeof(temp_url) - strlen(temp_url) - 1); temp_url[sizeof(temp_url) - 1] = '\x0'; } if(host_properties != 0) { snprintf(temp_buffer, sizeof(temp_buffer) - 1, "&hostprops=%lu", host_properties); temp_buffer[sizeof(temp_buffer) - 1] = '\x0'; strncat(temp_url, temp_buffer, sizeof(temp_url) - strlen(temp_url) - 1); temp_url[sizeof(temp_url) - 1] = '\x0'; } /* if(temp_result_limit) { snprintf(temp_buffer, sizeof(temp_buffer) - 1, "&limit=%i", temp_result_limit); temp_buffer[sizeof(temp_buffer) - 1] = '\x0'; strncat(temp_url, temp_buffer, sizeof(temp_url) - strlen(temp_url) - 1); temp_url[sizeof(temp_url) - 1] = '\x0'; } */ /* GET input can override cgi.cfg */ if(limit_results==TRUE) result_limit = temp_result_limit ? temp_result_limit : result_limit; else result_limit = 0; /* select box to set result limit */ create_page_limiter(result_limit,temp_url); /* the main list of hosts */ printf("

    \n"); printf("\n"); printf("\n"); printf("", temp_url, SORT_ASCENDING, SORT_HOSTNAME, url_images_path, UP_ARROW_ICON, temp_url, SORT_DESCENDING, SORT_HOSTNAME, url_images_path, DOWN_ARROW_ICON); printf("", temp_url, SORT_ASCENDING, SORT_HOSTSTATUS, url_images_path, UP_ARROW_ICON, temp_url, SORT_DESCENDING, SORT_HOSTSTATUS, url_images_path, DOWN_ARROW_ICON); printf("", temp_url, SORT_ASCENDING, SORT_LASTCHECKTIME, url_images_path, UP_ARROW_ICON, temp_url, SORT_DESCENDING, SORT_LASTCHECKTIME, url_images_path, DOWN_ARROW_ICON); printf("", temp_url, SORT_ASCENDING, SORT_STATEDURATION, url_images_path, UP_ARROW_ICON, temp_url, SORT_DESCENDING, SORT_STATEDURATION, url_images_path, DOWN_ARROW_ICON); printf("\n"); printf("\n"); /* check all hosts... */ while(1) { /* get the next service to display */ if(use_sort == TRUE) { if(first_entry == TRUE) temp_hostsort = hostsort_list; else temp_hostsort = temp_hostsort->next; if(temp_hostsort == NULL) break; temp_status = temp_hostsort->hststatus; } else { if(first_entry == TRUE) temp_status = hoststatus_list; else temp_status = temp_status->next; } if(temp_status == NULL) break; first_entry = FALSE; /* find the host */ temp_host = find_host(temp_status->host_name); /* if we couldn't find the host, go to the next status entry */ if(temp_host == NULL) continue; /* make sure user has rights to see this... */ if(is_authorized_for_host(temp_host, ¤t_authdata) == FALSE) continue; if (show_all_hosts == FALSE) { if(host_filter != NULL) { if (regexec(&preg_hostname, temp_host->name, 0, NULL, 0) != 0 && regexec(&preg_hostname, temp_host->address, 0, NULL, 0) != 0 && regexec(&preg_hostname, temp_host->alias, 0, NULL, 0) != 0) continue; } else if (strcmp(host_name, temp_host->name)) continue; } user_has_seen_something = TRUE; /* see if we should display services for hosts with this type of status */ if(!(host_status_types & temp_status->status)) continue; /* check host properties filter */ if(passes_host_properties_filter(temp_status) == FALSE) continue; /* see if this host is a member of the hostgroup */ if(show_all_hostgroups == FALSE) { temp_hostgroup = find_hostgroup(hostgroup_name); if(temp_hostgroup == NULL) continue; if(is_host_member_of_hostgroup(temp_hostgroup, temp_host) == FALSE) continue; } total_entries++; /* final checks for display visibility, add to total results. Used for page numbers */ if(result_limit == 0) limit_results = FALSE; if( (limit_results == TRUE) && ( (total_entries < page_start) || (total_entries > (page_start + result_limit)) ) ) { continue; } visible_entries++; /* grab macros */ grab_host_macros_r(mac, temp_host); if(display_type == DISPLAY_HOSTGROUPS) { if(odd) odd = 0; else odd = 1; /* get the last host check time */ t = temp_status->last_check; get_time_string(&t, date_time, (int)sizeof(date_time), SHORT_DATE_TIME); if((unsigned long)temp_status->last_check == 0L) strcpy(date_time, "N/A"); if(temp_status->status == HOST_PENDING) { strncpy(status, "PENDING", sizeof(status)); status_class = "PENDING"; status_bg_class = (odd) ? "Even" : "Odd"; } else if(temp_status->status == SD_HOST_UP) { strncpy(status, "UP", sizeof(status)); status_class = "HOSTUP"; status_bg_class = (odd) ? "Even" : "Odd"; } else if(temp_status->status == SD_HOST_DOWN) { strncpy(status, "DOWN", sizeof(status)); status_class = "HOSTDOWN"; if(temp_status->problem_has_been_acknowledged == TRUE) status_bg_class = "BGDOWNACK"; else if(temp_status->scheduled_downtime_depth > 0) status_bg_class = "BGDOWNSCHED"; else status_bg_class = "BGDOWN"; } else if(temp_status->status == SD_HOST_UNREACHABLE) { strncpy(status, "UNREACHABLE", sizeof(status)); status_class = "HOSTUNREACHABLE"; if(temp_status->problem_has_been_acknowledged == TRUE) status_bg_class = "BGUNREACHABLEACK"; else if(temp_status->scheduled_downtime_depth > 0) status_bg_class = "BGUNREACHABLESCHED"; else status_bg_class = "BGUNREACHABLE"; } status[sizeof(status) - 1] = '\x0'; printf("\n"); /**** host name column ****/ printf("\n"); /* state duration calculation... */ t = 0; duration_error = FALSE; if(temp_status->last_state_change == (time_t)0) { if(program_start > current_time) duration_error = TRUE; else t = current_time - program_start; } else { if(temp_status->last_state_change > current_time) duration_error = TRUE; else t = current_time - temp_status->last_state_change; } get_time_breakdown((unsigned long)t, &days, &hours, &minutes, &seconds); if(duration_error == TRUE) snprintf(state_duration, sizeof(state_duration) - 1, "???"); else snprintf(state_duration, sizeof(state_duration) - 1, "%2dd %2dh %2dm %2ds%s", days, hours, minutes, seconds, (temp_status->last_state_change == (time_t)0) ? "+" : ""); state_duration[sizeof(state_duration) - 1] = '\x0'; /* the rest of the columns... */ printf("\n", status_class, status); printf("\n", status_bg_class, date_time); printf("\n", status_bg_class, state_duration); printf("\n"); printf("\n"); } } printf("
    Host Sort by host name (ascending)Sort by host name (descending)Status Sort by host status (ascending)Sort by host status (descending)Last Check Sort by last check time (ascending)Sort by last check time (descending)Duration Sort by state duration (ascending)Sort by state duration time (descending)Status Information
    ", status_class); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("
    \n"); printf("\n"); printf("\n"); printf("\n", status_class, EXTINFO_CGI, DISPLAY_HOST_INFO, url_encode(temp_status->host_name), temp_host->address, temp_status->host_name); printf("\n"); printf("
    %s 
    \n"); printf("
    \n"); printf("\n"); printf("\n"); total_comments = number_of_host_comments(temp_host->name); if(temp_status->problem_has_been_acknowledged == TRUE) { printf("", EXTINFO_CGI, DISPLAY_HOST_INFO, url_encode(temp_status->host_name), url_images_path, ACKNOWLEDGEMENT_ICON, STATUS_ICON_WIDTH, STATUS_ICON_HEIGHT); } if(total_comments > 0) printf("", EXTINFO_CGI, DISPLAY_HOST_INFO, url_encode(temp_status->host_name), url_images_path, COMMENT_ICON, STATUS_ICON_WIDTH, STATUS_ICON_HEIGHT, total_comments, (total_comments == 1) ? "" : "s", total_comments, (total_comments == 1) ? "" : "s"); if(temp_status->notifications_enabled == FALSE) { printf("", EXTINFO_CGI, DISPLAY_HOST_INFO, url_encode(temp_status->host_name), url_images_path, NOTIFICATIONS_DISABLED_ICON, STATUS_ICON_WIDTH, STATUS_ICON_HEIGHT); } if(temp_status->checks_enabled == FALSE && temp_status->accept_passive_checks == FALSE) { printf("", url_images_path, DISABLED_ICON, STATUS_ICON_WIDTH, STATUS_ICON_HEIGHT); } else if(temp_status->checks_enabled == FALSE) { printf("", url_images_path, PASSIVE_ONLY_ICON, STATUS_ICON_WIDTH, STATUS_ICON_HEIGHT); } if(temp_status->is_flapping == TRUE) { printf("", EXTINFO_CGI, DISPLAY_HOST_INFO, url_encode(temp_status->host_name), url_images_path, FLAPPING_ICON, STATUS_ICON_WIDTH, STATUS_ICON_HEIGHT); } if(temp_status->scheduled_downtime_depth > 0) { printf("", EXTINFO_CGI, DISPLAY_HOST_INFO, url_encode(temp_status->host_name), url_images_path, SCHEDULED_DOWNTIME_ICON, STATUS_ICON_WIDTH, STATUS_ICON_HEIGHT); } if(temp_host->notes_url != NULL) { printf("\n"); } if(temp_host->action_url != NULL) { printf("\n"); } if(temp_host->icon_image != NULL) { printf("\n"); } if(enable_splunk_integration == TRUE) { printf("\n"); } printf("\n"); printf("\n"); printf("
    This host problem has been acknowledgedThis host has %d comment%s associated with itNotifications for this host have been disabled", EXTINFO_CGI, DISPLAY_HOST_INFO, url_encode(temp_status->host_name)); printf("Active and passive checks have been disabled for this host", EXTINFO_CGI, DISPLAY_HOST_INFO, url_encode(temp_status->host_name)); printf("Active checks of this host have been disabled - only passive checks are being acceptedThis host is flapping between statesThis host is currently in a period of scheduled downtime"); printf("", (notes_url_target == NULL) ? "_blank" : notes_url_target); printf("%s", url_images_path, NOTES_ICON, STATUS_ICON_WIDTH, STATUS_ICON_HEIGHT, "View Extra Host Notes", "View Extra Host Notes"); printf(""); printf(""); printf("", (action_url_target == NULL) ? "_blank" : action_url_target); printf("%s", url_images_path, ACTION_ICON, STATUS_ICON_WIDTH, STATUS_ICON_HEIGHT, "Perform Extra Host Actions", "Perform Extra Host Actions"); printf(""); printf(""); printf("", EXTINFO_CGI, DISPLAY_HOST_INFO, url_encode(temp_status->host_name)); printf("%s", STATUS_ICON_WIDTH, STATUS_ICON_HEIGHT, (temp_host->icon_image_alt == NULL) ? "" : temp_host->icon_image_alt, (temp_host->icon_image_alt == NULL) ? "" : temp_host->icon_image_alt); printf(""); printf(""); display_splunk_host_url(temp_host); printf(""); printf("View Service Details For This Host", STATUS_CGI, url_encode(temp_status->host_name), url_images_path, STATUS_DETAIL_ICON); printf("
    \n"); printf("
    \n"); printf("
    %s%s%s", status_bg_class); printf("%s ", (temp_status->plugin_output == NULL) ? "" : html_encode(temp_status->plugin_output, TRUE)); /* if(enable_splunk_integration==TRUE) display_splunk_host_url(temp_host); */ printf("
    \n"); printf("
    \n"); /* if user couldn't see anything, print out some helpful info... */ if(user_has_seen_something == FALSE) { if(hoststatus_list != NULL) { printf("

    It appears as though you do not have permission to view information for any of the hosts you requested...

    \n"); printf("

    If you believe this is an error, check the HTTP server authentication requirements for accessing this CGI
    "); printf("and check the authorization options in your CGI configuration file.

    \n"); } else { printf("

    There doesn't appear to be any host status information in the status log...

    \n"); printf("Make sure that Nagios is running and that you have specified the location of you status log correctly in the configuration files.

    \n"); } } else { /* do page numbers if applicable */ create_pagenumbers(total_entries,temp_url,FALSE); } return; } /* show an overview of servicegroup(s)... */ void show_servicegroup_overviews(void) { servicegroup *temp_servicegroup = NULL; int current_column; int user_has_seen_something = FALSE; int servicegroup_error = FALSE; //printf("

    \n"); printf("\n"); printf("\n"); printf(""); printf("\n"); printf("\n"); printf("\n"); printf("
    \n"); show_filters(); printf("\n"); printf("
    Service Overview For "); if(show_all_servicegroups == TRUE) printf("All Service Groups"); else printf("Service Group '%s'", servicegroup_name); printf("
    \n"); printf("
    "); printf("
    \n"); //printf("

    \n"); /* display status overviews for all servicegroups */ if(show_all_servicegroups == TRUE) { printf("
    \n"); printf("\n"); current_column = 1; /* loop through all servicegroups... */ for(temp_servicegroup = servicegroup_list; temp_servicegroup != NULL; temp_servicegroup = temp_servicegroup->next) { /* make sure the user is authorized to view at least one host in this servicegroup */ if(is_authorized_for_servicegroup(temp_servicegroup, ¤t_authdata) == FALSE) continue; if(current_column == 1) printf("\n"); printf("\n"); if(current_column == overview_columns) printf("\n"); if(current_column < overview_columns) current_column++; else current_column = 1; } if(current_column != 1) { for(; current_column <= overview_columns; current_column++) printf("\n"); printf("\n"); } printf("
    \n"); show_servicegroup_overview(temp_servicegroup); user_has_seen_something = TRUE; printf("
    \n"); printf("
    \n"); } /* else display overview for just a specific servicegroup */ else { temp_servicegroup = find_servicegroup(servicegroup_name); if(temp_servicegroup != NULL) { //printf("

    \n"); printf("

    \n"); printf("
    \n"); if(is_authorized_for_servicegroup(temp_servicegroup, ¤t_authdata) == TRUE) { show_servicegroup_overview(temp_servicegroup); user_has_seen_something = TRUE; } printf("
    \n"); printf("
    \n"); //printf("

    \n"); } else { printf("
    Sorry, but service group '%s' doesn't seem to exist...
    ", servicegroup_name); servicegroup_error = TRUE; } } /* if user couldn't see anything, print out some helpful info... */ if(user_has_seen_something == FALSE && servicegroup_error == FALSE) { //printf("

    \n"); printf("

    \n"); if(servicegroup_list != NULL) { printf("
    It appears as though you do not have permission to view information for any of the hosts you requested...
    \n"); printf("
    If you believe this is an error, check the HTTP server authentication requirements for accessing this CGI
    "); printf("and check the authorization options in your CGI configuration file.
    \n"); } else { printf("
    There are no service groups defined.
    \n"); } printf("
    \n"); //printf("

    \n"); } return; } /* shows an overview of a specific servicegroup... */ void show_servicegroup_overview(servicegroup *temp_servicegroup) { servicesmember *temp_member; host *temp_host; host *last_host; hoststatus *temp_hoststatus = NULL; int odd = 0; printf("
    \n"); printf("%s", STATUS_CGI, url_encode(temp_servicegroup->group_name), temp_servicegroup->alias); printf(" (%s)", EXTINFO_CGI, DISPLAY_SERVICEGROUP_INFO, url_encode(temp_servicegroup->group_name), temp_servicegroup->group_name); printf("
    \n"); printf("
    \n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); /* find all hosts that have services that are members of the servicegroup */ last_host = NULL; for(temp_member = temp_servicegroup->members; temp_member != NULL; temp_member = temp_member->next) { /* find the host */ temp_host = find_host(temp_member->host_name); if(temp_host == NULL) continue; /* make sure user has rights to view this host */ if(is_authorized_for_host(temp_host, ¤t_authdata) == FALSE) continue; /* skip this if it isn't a new host... */ if(temp_host == last_host) continue; /* find the host status */ temp_hoststatus = find_hoststatus(temp_host->name); if(temp_hoststatus == NULL) continue; /* make sure we only display hosts of the specified status levels */ if(!(host_status_types & temp_hoststatus->status)) continue; /* make sure we only display hosts that have the desired properties */ if(passes_host_properties_filter(temp_hoststatus) == FALSE) continue; if(odd) odd = 0; else odd = 1; show_servicegroup_hostgroup_member_overview(temp_hoststatus, odd, temp_servicegroup); last_host = temp_host; } printf("
    HostStatusServicesActions
    \n"); printf("
    \n"); return; } /* show a summary of servicegroup(s)... */ void show_servicegroup_summaries(void) { servicegroup *temp_servicegroup = NULL; int user_has_seen_something = FALSE; int servicegroup_error = FALSE; int odd = 0; printf("

    \n"); printf("\n"); printf("\n"); printf(""); printf("\n"); printf("\n"); printf("\n"); printf("
    \n"); show_filters(); printf("\n"); printf("
    Status Summary For "); if(show_all_servicegroups == TRUE) printf("All Service Groups"); else printf("Service Group '%s'", servicegroup_name); printf("
    \n"); printf("
    "); printf("
    \n"); printf("

    \n"); printf("
    \n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); /* display status summary for all servicegroups */ if(show_all_servicegroups == TRUE) { /* loop through all servicegroups... */ for(temp_servicegroup = servicegroup_list; temp_servicegroup != NULL; temp_servicegroup = temp_servicegroup->next) { /* make sure the user is authorized to view at least one host in this servicegroup */ if(is_authorized_for_servicegroup(temp_servicegroup, ¤t_authdata) == FALSE) continue; if(odd == 0) odd = 1; else odd = 0; /* show summary for this servicegroup */ show_servicegroup_summary(temp_servicegroup, odd); user_has_seen_something = TRUE; } } /* else just show summary for a specific servicegroup */ else { temp_servicegroup = find_servicegroup(servicegroup_name); if(temp_servicegroup == NULL) servicegroup_error = TRUE; else { show_servicegroup_summary(temp_servicegroup, 1); user_has_seen_something = TRUE; } } printf("
    Service GroupHost Status SummaryService Status Summary
    \n"); printf("
    \n"); /* if user couldn't see anything, print out some helpful info... */ if(user_has_seen_something == FALSE && servicegroup_error == FALSE) { printf("

    \n"); if(servicegroup_list != NULL) { printf("
    It appears as though you do not have permission to view information for any of the hosts you requested...
    \n"); printf("
    If you believe this is an error, check the HTTP server authentication requirements for accessing this CGI
    "); printf("and check the authorization options in your CGI configuration file.
    \n"); } else { printf("
    There are no service groups defined.
    \n"); } printf("

    \n"); } /* we couldn't find the servicegroup */ else if(servicegroup_error == TRUE) { printf("

    \n"); printf("
    Sorry, but servicegroup '%s' doesn't seem to exist...
    \n", servicegroup_name); printf("

    \n"); } return; } /* displays status summary information for a specific servicegroup */ void show_servicegroup_summary(servicegroup *temp_servicegroup, int odd) { const char *status_bg_class = ""; if(odd == 1) status_bg_class = "Even"; else status_bg_class = "Odd"; printf("\n", status_bg_class, status_bg_class); printf("%s ", STATUS_CGI, url_encode(temp_servicegroup->group_name), temp_servicegroup->alias); printf("(%s)", EXTINFO_CGI, DISPLAY_SERVICEGROUP_INFO, url_encode(temp_servicegroup->group_name), temp_servicegroup->group_name); printf(""); printf("", status_bg_class); show_servicegroup_host_totals_summary(temp_servicegroup); printf(""); printf("", status_bg_class); show_servicegroup_service_totals_summary(temp_servicegroup); printf(""); printf("\n"); return; } /* shows host total summary information for a specific servicegroup */ void show_servicegroup_host_totals_summary(servicegroup *temp_servicegroup) { servicesmember *temp_member; int hosts_up = 0; int hosts_down = 0; int hosts_unreachable = 0; int hosts_pending = 0; int hosts_down_scheduled = 0; int hosts_down_acknowledged = 0; int hosts_down_disabled = 0; int hosts_down_unacknowledged = 0; int hosts_unreachable_scheduled = 0; int hosts_unreachable_acknowledged = 0; int hosts_unreachable_disabled = 0; int hosts_unreachable_unacknowledged = 0; hoststatus *temp_hoststatus = NULL; host *temp_host = NULL; host *last_host = NULL; int problem = FALSE; /* find all the hosts that belong to the servicegroup */ for(temp_member = temp_servicegroup->members; temp_member != NULL; temp_member = temp_member->next) { /* find the host... */ temp_host = find_host(temp_member->host_name); if(temp_host == NULL) continue; /* make sure user has rights to view this host */ if(is_authorized_for_host(temp_host, ¤t_authdata) == FALSE) continue; /* skip this if it isn't a new host... */ if(temp_host == last_host) continue; /* find the host status */ temp_hoststatus = find_hoststatus(temp_host->name); if(temp_hoststatus == NULL) continue; /* make sure we only display hosts of the specified status levels */ if(!(host_status_types & temp_hoststatus->status)) continue; /* make sure we only display hosts that have the desired properties */ if(passes_host_properties_filter(temp_hoststatus) == FALSE) continue; problem = TRUE; if(temp_hoststatus->status == SD_HOST_UP) hosts_up++; else if(temp_hoststatus->status == SD_HOST_DOWN) { if(temp_hoststatus->scheduled_downtime_depth > 0) { hosts_down_scheduled++; problem = FALSE; } if(temp_hoststatus->problem_has_been_acknowledged == TRUE) { hosts_down_acknowledged++; problem = FALSE; } if(temp_hoststatus->checks_enabled == FALSE) { hosts_down_disabled++; problem = FALSE; } if(problem == TRUE) hosts_down_unacknowledged++; hosts_down++; } else if(temp_hoststatus->status == SD_HOST_UNREACHABLE) { if(temp_hoststatus->scheduled_downtime_depth > 0) { hosts_unreachable_scheduled++; problem = FALSE; } if(temp_hoststatus->problem_has_been_acknowledged == TRUE) { hosts_unreachable_acknowledged++; problem = FALSE; } if(temp_hoststatus->checks_enabled == FALSE) { hosts_unreachable_disabled++; problem = FALSE; } if(problem == TRUE) hosts_unreachable_unacknowledged++; hosts_unreachable++; } else hosts_pending++; last_host = temp_host; } printf("\n"); if(hosts_up > 0) { printf(""); printf("", STATUS_CGI, url_encode(temp_servicegroup->group_name), SD_HOST_UP, host_properties, hosts_up); printf("\n"); } if(hosts_down > 0) { printf("\n"); printf("\n"); printf("\n"); } if(hosts_unreachable > 0) { printf("\n"); printf("\n"); printf("\n"); } if(hosts_pending > 0) printf("\n", STATUS_CGI, url_encode(temp_servicegroup->group_name), HOST_PENDING, host_properties, hosts_pending); printf("
    %d UP
    \n"); printf("\n"); printf("\n", STATUS_CGI, url_encode(temp_servicegroup->group_name), SD_HOST_DOWN, host_properties, hosts_down); printf("\n"); printf("\n"); printf("
    %d DOWN :\n"); if(hosts_down_unacknowledged > 0) printf("\n", STATUS_CGI, url_encode(temp_servicegroup->group_name), SD_HOST_DOWN, HOST_NO_SCHEDULED_DOWNTIME | HOST_STATE_UNACKNOWLEDGED | HOST_CHECKS_ENABLED, hosts_down_unacknowledged); if(hosts_down_scheduled > 0) printf("\n", STATUS_CGI, url_encode(temp_servicegroup->group_name), SD_HOST_DOWN, HOST_SCHEDULED_DOWNTIME, hosts_down_scheduled); if(hosts_down_acknowledged > 0) printf("\n", STATUS_CGI, url_encode(temp_servicegroup->group_name), SD_HOST_DOWN, HOST_STATE_ACKNOWLEDGED, hosts_down_acknowledged); if(hosts_down_disabled > 0) printf("\n", STATUS_CGI, url_encode(temp_servicegroup->group_name), SD_HOST_DOWN, HOST_CHECKS_DISABLED, hosts_down_disabled); printf("
    %d Unhandled
    %d Scheduled
    %d Acknowledged
    %d Disabled
    \n"); printf("\n"); printf("\n", STATUS_CGI, url_encode(temp_servicegroup->group_name), SD_HOST_UNREACHABLE, host_properties, hosts_unreachable); printf("\n"); printf("\n"); printf("
    %d UNREACHABLE :\n"); if(hosts_unreachable_unacknowledged > 0) printf("\n", STATUS_CGI, url_encode(temp_servicegroup->group_name), SD_HOST_UNREACHABLE, HOST_NO_SCHEDULED_DOWNTIME | HOST_STATE_UNACKNOWLEDGED | HOST_CHECKS_ENABLED, hosts_unreachable_unacknowledged); if(hosts_unreachable_scheduled > 0) printf("\n", STATUS_CGI, url_encode(temp_servicegroup->group_name), SD_HOST_UNREACHABLE, HOST_SCHEDULED_DOWNTIME, hosts_unreachable_scheduled); if(hosts_unreachable_acknowledged > 0) printf("\n", STATUS_CGI, url_encode(temp_servicegroup->group_name), SD_HOST_UNREACHABLE, HOST_STATE_ACKNOWLEDGED, hosts_unreachable_acknowledged); if(hosts_unreachable_disabled > 0) printf("\n", STATUS_CGI, url_encode(temp_servicegroup->group_name), SD_HOST_UNREACHABLE, HOST_CHECKS_DISABLED, hosts_unreachable_disabled); printf("
    %d Unhandled
    %d Scheduled
    %d Acknowledged
    %d Disabled
    %d PENDING
    \n"); if((hosts_up + hosts_down + hosts_unreachable + hosts_pending) == 0) printf("No matching hosts"); return; return; } /* shows service total summary information for a specific servicegroup */ void show_servicegroup_service_totals_summary(servicegroup *temp_servicegroup) { int services_ok = 0; int services_warning = 0; int services_unknown = 0; int services_critical = 0; int services_pending = 0; int services_warning_host_problem = 0; int services_warning_scheduled = 0; int services_warning_acknowledged = 0; int services_warning_disabled = 0; int services_warning_unacknowledged = 0; int services_unknown_host_problem = 0; int services_unknown_scheduled = 0; int services_unknown_acknowledged = 0; int services_unknown_disabled = 0; int services_unknown_unacknowledged = 0; int services_critical_host_problem = 0; int services_critical_scheduled = 0; int services_critical_acknowledged = 0; int services_critical_disabled = 0; int services_critical_unacknowledged = 0; servicesmember *temp_member = NULL; servicestatus *temp_servicestatus = NULL; hoststatus *temp_hoststatus = NULL; service *temp_service = NULL; service *last_service = NULL; int problem = FALSE; /* find all the services that belong to the servicegroup */ for(temp_member = temp_servicegroup->members; temp_member != NULL; temp_member = temp_member->next) { /* find the service */ temp_service = find_service(temp_member->host_name, temp_member->service_description); if(temp_service == NULL) continue; /* make sure user has rights to view this service */ if(is_authorized_for_service(temp_service, ¤t_authdata) == FALSE) continue; /* skip this if it isn't a new service... */ if(temp_service == last_service) continue; /* find the service status */ temp_servicestatus = find_servicestatus(temp_service->host_name, temp_service->description); if(temp_servicestatus == NULL) continue; /* find the status of the associated host */ temp_hoststatus = find_hoststatus(temp_servicestatus->host_name); if(temp_hoststatus == NULL) continue; /* make sure we only display hosts of the specified status levels */ if(!(host_status_types & temp_hoststatus->status)) continue; /* make sure we only display hosts that have the desired properties */ if(passes_host_properties_filter(temp_hoststatus) == FALSE) continue; /* make sure we only display services of the specified status levels */ if(!(service_status_types & temp_servicestatus->status)) continue; /* make sure we only display services that have the desired properties */ if(passes_service_properties_filter(temp_servicestatus) == FALSE) continue; problem = TRUE; if(temp_servicestatus->status == SERVICE_OK) services_ok++; else if(temp_servicestatus->status == SERVICE_WARNING) { temp_hoststatus = find_hoststatus(temp_servicestatus->host_name); if(temp_hoststatus != NULL && (temp_hoststatus->status == SD_HOST_DOWN || temp_hoststatus->status == SD_HOST_UNREACHABLE)) { services_warning_host_problem++; problem = FALSE; } if(temp_servicestatus->scheduled_downtime_depth > 0) { services_warning_scheduled++; problem = FALSE; } if(temp_servicestatus->problem_has_been_acknowledged == TRUE) { services_warning_acknowledged++; problem = FALSE; } if(temp_servicestatus->checks_enabled == FALSE) { services_warning_disabled++; problem = FALSE; } if(problem == TRUE) services_warning_unacknowledged++; services_warning++; } else if(temp_servicestatus->status == SERVICE_UNKNOWN) { temp_hoststatus = find_hoststatus(temp_servicestatus->host_name); if(temp_hoststatus != NULL && (temp_hoststatus->status == SD_HOST_DOWN || temp_hoststatus->status == SD_HOST_UNREACHABLE)) { services_unknown_host_problem++; problem = FALSE; } if(temp_servicestatus->scheduled_downtime_depth > 0) { services_unknown_scheduled++; problem = FALSE; } if(temp_servicestatus->problem_has_been_acknowledged == TRUE) { services_unknown_acknowledged++; problem = FALSE; } if(temp_servicestatus->checks_enabled == FALSE) { services_unknown_disabled++; problem = FALSE; } if(problem == TRUE) services_unknown_unacknowledged++; services_unknown++; } else if(temp_servicestatus->status == SERVICE_CRITICAL) { temp_hoststatus = find_hoststatus(temp_servicestatus->host_name); if(temp_hoststatus != NULL && (temp_hoststatus->status == SD_HOST_DOWN || temp_hoststatus->status == SD_HOST_UNREACHABLE)) { services_critical_host_problem++; problem = FALSE; } if(temp_servicestatus->scheduled_downtime_depth > 0) { services_critical_scheduled++; problem = FALSE; } if(temp_servicestatus->problem_has_been_acknowledged == TRUE) { services_critical_acknowledged++; problem = FALSE; } if(temp_servicestatus->checks_enabled == FALSE) { services_critical_disabled++; problem = FALSE; } if(problem == TRUE) services_critical_unacknowledged++; services_critical++; } else if(temp_servicestatus->status == SERVICE_PENDING) services_pending++; last_service = temp_service; } printf("\n"); if(services_ok > 0) printf("\n", STATUS_CGI, url_encode(temp_servicegroup->group_name), SERVICE_OK, host_status_types, service_properties, host_properties, services_ok); if(services_warning > 0) { printf("\n"); printf("\n"); printf("\n"); } if(services_unknown > 0) { printf("\n"); printf("\n"); printf("\n"); } if(services_critical > 0) { printf("\n"); printf("\n"); printf("\n"); } if(services_pending > 0) printf("\n", STATUS_CGI, url_encode(temp_servicegroup->group_name), SERVICE_PENDING, host_status_types, service_properties, host_properties, services_pending); printf("
    %d OK
    \n"); printf("\n"); printf("\n", STATUS_CGI, url_encode(temp_servicegroup->group_name), SERVICE_WARNING, host_status_types, service_properties, host_properties, services_warning); printf("\n"); printf("\n"); printf("
    %d WARNING :\n"); if(services_warning_unacknowledged > 0) printf("\n", STATUS_CGI, url_encode(temp_servicegroup->group_name), SERVICE_WARNING, SD_HOST_UP | HOST_PENDING, SERVICE_NO_SCHEDULED_DOWNTIME | SERVICE_STATE_UNACKNOWLEDGED | SERVICE_CHECKS_ENABLED, services_warning_unacknowledged); if(services_warning_host_problem > 0) printf("\n", STATUS_CGI, url_encode(temp_servicegroup->group_name), SERVICE_WARNING, SD_HOST_DOWN | SD_HOST_UNREACHABLE, services_warning_host_problem); if(services_warning_scheduled > 0) printf("\n", STATUS_CGI, url_encode(temp_servicegroup->group_name), SERVICE_WARNING, SERVICE_SCHEDULED_DOWNTIME, services_warning_scheduled); if(services_warning_acknowledged > 0) printf("\n", STATUS_CGI, url_encode(temp_servicegroup->group_name), SERVICE_WARNING, SERVICE_STATE_ACKNOWLEDGED, services_warning_acknowledged); if(services_warning_disabled > 0) printf("\n", STATUS_CGI, url_encode(temp_servicegroup->group_name), SERVICE_WARNING, SERVICE_CHECKS_DISABLED, services_warning_disabled); printf("
    %d Unhandled
    %d on Problem Hosts
    %d Scheduled
    %d Acknowledged
    %d Disabled
    \n"); printf("\n"); printf("\n", STATUS_CGI, url_encode(temp_servicegroup->group_name), SERVICE_UNKNOWN, host_status_types, service_properties, host_properties, services_unknown); printf("\n"); printf("\n"); printf("
    %d UNKNOWN :\n"); if(services_unknown_unacknowledged > 0) printf("\n", STATUS_CGI, url_encode(temp_servicegroup->group_name), SERVICE_UNKNOWN, SD_HOST_UP | HOST_PENDING, SERVICE_NO_SCHEDULED_DOWNTIME | SERVICE_STATE_UNACKNOWLEDGED | SERVICE_CHECKS_ENABLED, services_unknown_unacknowledged); if(services_unknown_host_problem > 0) printf("\n", STATUS_CGI, url_encode(temp_servicegroup->group_name), SERVICE_UNKNOWN, SD_HOST_DOWN | SD_HOST_UNREACHABLE, services_unknown_host_problem); if(services_unknown_scheduled > 0) printf("\n", STATUS_CGI, url_encode(temp_servicegroup->group_name), SERVICE_UNKNOWN, SERVICE_SCHEDULED_DOWNTIME, services_unknown_scheduled); if(services_unknown_acknowledged > 0) printf("\n", STATUS_CGI, url_encode(temp_servicegroup->group_name), SERVICE_UNKNOWN, SERVICE_STATE_ACKNOWLEDGED, services_unknown_acknowledged); if(services_unknown_disabled > 0) printf("\n", STATUS_CGI, url_encode(temp_servicegroup->group_name), SERVICE_UNKNOWN, SERVICE_CHECKS_DISABLED, services_unknown_disabled); printf("
    %d Unhandled
    %d on Problem Hosts
    %d Scheduled
    %d Acknowledged
    %d Disabled
    \n"); printf("\n"); printf("\n", STATUS_CGI, url_encode(temp_servicegroup->group_name), SERVICE_CRITICAL, host_status_types, service_properties, host_properties, services_critical); printf("\n"); printf("\n"); printf("
    %d CRITICAL :\n"); if(services_critical_unacknowledged > 0) printf("\n", STATUS_CGI, url_encode(temp_servicegroup->group_name), SERVICE_CRITICAL, SD_HOST_UP | HOST_PENDING, SERVICE_NO_SCHEDULED_DOWNTIME | SERVICE_STATE_UNACKNOWLEDGED | SERVICE_CHECKS_ENABLED, services_critical_unacknowledged); if(services_critical_host_problem > 0) printf("\n", STATUS_CGI, url_encode(temp_servicegroup->group_name), SERVICE_CRITICAL, SD_HOST_DOWN | SD_HOST_UNREACHABLE, services_critical_host_problem); if(services_critical_scheduled > 0) printf("\n", STATUS_CGI, url_encode(temp_servicegroup->group_name), SERVICE_CRITICAL, SERVICE_SCHEDULED_DOWNTIME, services_critical_scheduled); if(services_critical_acknowledged > 0) printf("\n", STATUS_CGI, url_encode(temp_servicegroup->group_name), SERVICE_CRITICAL, SERVICE_STATE_ACKNOWLEDGED, services_critical_acknowledged); if(services_critical_disabled > 0) printf("\n", STATUS_CGI, url_encode(temp_servicegroup->group_name), SERVICE_CRITICAL, SERVICE_CHECKS_DISABLED, services_critical_disabled); printf("
    %d Unhandled
    %d on Problem Hosts
    %d Scheduled
    %d Acknowledged
    %d Disabled
    %d PENDING
    \n"); if((services_ok + services_warning + services_unknown + services_critical + services_pending) == 0) printf("No matching services"); return; } /* show a grid layout of servicegroup(s)... */ void show_servicegroup_grids(void) { servicegroup *temp_servicegroup = NULL; int user_has_seen_something = FALSE; int servicegroup_error = FALSE; int odd = 0; printf("

    \n"); printf("\n"); printf("\n"); printf(""); printf("\n"); printf("\n"); printf("\n"); printf("
    \n"); show_filters(); printf("\n"); printf("
    Status Grid For "); if(show_all_servicegroups == TRUE) printf("All Service Groups"); else printf("Service Group '%s'", servicegroup_name); printf("
    \n"); printf("
    "); printf("
    \n"); printf("

    \n"); /* display status grids for all servicegroups */ if(show_all_servicegroups == TRUE) { /* loop through all servicegroups... */ for(temp_servicegroup = servicegroup_list; temp_servicegroup != NULL; temp_servicegroup = temp_servicegroup->next) { /* make sure the user is authorized to view at least one host in this servicegroup */ if(is_authorized_for_servicegroup(temp_servicegroup, ¤t_authdata) == FALSE) continue; if(odd == 0) odd = 1; else odd = 0; /* show grid for this servicegroup */ show_servicegroup_grid(temp_servicegroup); user_has_seen_something = TRUE; } } /* else just show grid for a specific servicegroup */ else { temp_servicegroup = find_servicegroup(servicegroup_name); if(temp_servicegroup == NULL) servicegroup_error = TRUE; else { show_servicegroup_grid(temp_servicegroup); user_has_seen_something = TRUE; } } /* if user couldn't see anything, print out some helpful info... */ if(user_has_seen_something == FALSE && servicegroup_error == FALSE) { printf("

    \n"); if(servicegroup_list != NULL) { printf("
    It appears as though you do not have permission to view information for any of the hosts you requested...
    \n"); printf("
    If you believe this is an error, check the HTTP server authentication requirements for accessing this CGI
    "); printf("and check the authorization options in your CGI configuration file.
    \n"); } else { printf("
    There are no service groups defined.
    \n"); } printf("

    \n"); } /* we couldn't find the servicegroup */ else if(servicegroup_error == TRUE) { printf("

    \n"); printf("
    Sorry, but servicegroup '%s' doesn't seem to exist...
    \n", servicegroup_name); printf("

    \n"); } return; } /* displays status grid for a specific servicegroup */ void show_servicegroup_grid(servicegroup *temp_servicegroup) { const char *status_bg_class = ""; const char *host_status_class = ""; const char *service_status_class = ""; char *processed_string = NULL; servicesmember *temp_member; servicesmember *temp_member2; host *temp_host; host *last_host; hoststatus *temp_hoststatus; servicestatus *temp_servicestatus; int odd = 0; int current_item; printf("

    \n"); printf("

    \n"); printf("
    %s", STATUS_CGI, url_encode(temp_servicegroup->group_name), temp_servicegroup->alias); printf(" (%s)
    ", EXTINFO_CGI, DISPLAY_SERVICEGROUP_INFO, url_encode(temp_servicegroup->group_name), temp_servicegroup->group_name); printf("\n"); printf("\n"); /* find all hosts that have services that are members of the servicegroup */ last_host = NULL; for(temp_member = temp_servicegroup->members; temp_member != NULL; temp_member = temp_member->next) { /* find the host */ temp_host = find_host(temp_member->host_name); if(temp_host == NULL) continue; /* make sure user has rights to view this host */ if(is_authorized_for_host(temp_host, ¤t_authdata) == FALSE) continue; /* get the status of the host */ temp_hoststatus = find_hoststatus(temp_host->name); if(temp_hoststatus == NULL) continue; /* skip this if it isn't a new host... */ if(temp_host == last_host) continue; if(odd == 1) { status_bg_class = "Even"; odd = 0; } else { status_bg_class = "Odd"; odd = 1; } printf("\n", status_bg_class); if(temp_hoststatus->status == SD_HOST_DOWN) host_status_class = "HOStdOWN"; else if(temp_hoststatus->status == SD_HOST_UNREACHABLE) host_status_class = "HOSTUNREACHABLE"; else host_status_class = status_bg_class; printf("\n"); printf("\n"); printf("\n"); last_host = temp_host; } printf("
    HostServicesActions
    ", host_status_class); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("
    \n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("
    ", host_status_class); printf("%s\n", EXTINFO_CGI, DISPLAY_HOST_INFO, url_encode(temp_host->name), temp_host->name); printf("
    \n"); printf("
    \n"); printf("\n"); printf("\n"); if(temp_host->icon_image != NULL) { printf("\n"); printf("
    "); printf("\n", EXTINFO_CGI, DISPLAY_HOST_INFO, url_encode(temp_host->name)); printf("%s", STATUS_ICON_WIDTH, STATUS_ICON_HEIGHT, (temp_host->icon_image_alt == NULL) ? "" : temp_host->icon_image_alt, (temp_host->icon_image_alt == NULL) ? "" : temp_host->icon_image_alt); printf(""); printf("\n"); } printf("
    \n"); printf("
    \n"); printf("
    ", host_status_class); /* display all services on the host that are part of the hostgroup */ current_item = 1; for(temp_member2 = temp_member; temp_member2 != NULL; temp_member2 = temp_member2->next) { /* bail out if we've reached the end of the services that are associated with this servicegroup */ if(strcmp(temp_member2->host_name, temp_host->name)) break; if(current_item > max_grid_width && max_grid_width > 0) { printf("
    \n"); current_item = 1; } /* get the status of the service */ temp_servicestatus = find_servicestatus(temp_member2->host_name, temp_member2->service_description); if(temp_servicestatus == NULL) service_status_class = "NULL"; else if(temp_servicestatus->status == SERVICE_OK) service_status_class = "OK"; else if(temp_servicestatus->status == SERVICE_WARNING) service_status_class = "WARNING"; else if(temp_servicestatus->status == SERVICE_UNKNOWN) service_status_class = "UNKNOWN"; else if(temp_servicestatus->status == SERVICE_CRITICAL) service_status_class = "CRITICAL"; else service_status_class = "PENDING"; printf("%s ", url_encode(temp_servicestatus->description), service_status_class, temp_servicestatus->description); current_item++; } /* actions */ printf("
    ", host_status_class); /* grab macros */ grab_host_macros_r(mac, temp_host); printf("\n", EXTINFO_CGI, DISPLAY_HOST_INFO, url_encode(temp_host->name)); printf("%s", url_images_path, DETAIL_ICON, STATUS_ICON_WIDTH, STATUS_ICON_HEIGHT, "View Extended Information For This Host", "View Extended Information For This Host"); printf(""); if(temp_host->notes_url != NULL) { printf("", (notes_url_target == NULL) ? "_blank" : notes_url_target); printf("%s", url_images_path, NOTES_ICON, STATUS_ICON_WIDTH, STATUS_ICON_HEIGHT, "View Extra Host Notes", "View Extra Host Notes"); printf(""); } if(temp_host->action_url != NULL) { printf("", (action_url_target == NULL) ? "blank" : action_url_target); printf("%s", url_images_path, ACTION_ICON, STATUS_ICON_WIDTH, STATUS_ICON_HEIGHT, "Perform Extra Host Actions", "Perform Extra Host Actions"); printf(""); } printf("View Service Details For This Host\n", STATUS_CGI, url_encode(temp_host->name), url_images_path, STATUS_DETAIL_ICON); #ifdef USE_STATUSMAP printf("%s", STATUSMAP_CGI, url_encode(temp_host->name), url_images_path, STATUSMAP_ICON, STATUS_ICON_WIDTH, STATUS_ICON_HEIGHT, "Locate Host On Map", "Locate Host On Map"); #endif printf("
    \n"); printf("
    \n"); printf("

    \n"); return; } /* show an overview of hostgroup(s)... */ void show_hostgroup_overviews(void) { hostgroup *temp_hostgroup = NULL; int current_column; int user_has_seen_something = FALSE; int hostgroup_error = FALSE; printf("

    \n"); printf("\n"); printf("\n"); printf(""); printf("\n"); printf("\n"); printf("\n"); printf("
    \n"); show_filters(); printf("\n"); printf("
    Service Overview For "); if(show_all_hostgroups == TRUE) printf("All Host Groups"); else printf("Host Group '%s'", hostgroup_name); printf("
    \n"); printf("
    "); printf("
    \n"); printf("

    \n"); /* display status overviews for all hostgroups */ if(show_all_hostgroups == TRUE) { printf("
    \n"); printf("\n"); current_column = 1; /* loop through all hostgroups... */ for(temp_hostgroup = hostgroup_list; temp_hostgroup != NULL; temp_hostgroup = temp_hostgroup->next) { /* make sure the user is authorized to view this hostgroup */ if(is_authorized_for_hostgroup(temp_hostgroup, ¤t_authdata) == FALSE) continue; if(current_column == 1) printf("\n"); printf("\n"); if(current_column == overview_columns) printf("\n"); if(current_column < overview_columns) current_column++; else current_column = 1; } if(current_column != 1) { for(; current_column <= overview_columns; current_column++) printf("\n"); printf("\n"); } printf("
    \n"); show_hostgroup_overview(temp_hostgroup); user_has_seen_something = TRUE; printf("
    \n"); printf("
    \n"); } /* else display overview for just a specific hostgroup */ else { temp_hostgroup = find_hostgroup(hostgroup_name); if(temp_hostgroup != NULL) { printf("

    \n"); printf("

    \n"); printf("
    \n"); if(is_authorized_for_hostgroup(temp_hostgroup, ¤t_authdata) == TRUE) { show_hostgroup_overview(temp_hostgroup); user_has_seen_something = TRUE; } printf("
    \n"); printf("
    \n"); printf("

    \n"); } else { printf("
    Sorry, but host group '%s' doesn't seem to exist...
    ", hostgroup_name); hostgroup_error = TRUE; } } /* if user couldn't see anything, print out some helpful info... */ if(user_has_seen_something == FALSE && hostgroup_error == FALSE) { printf("

    \n"); printf("

    \n"); if(hostgroup_list != NULL) { printf("
    It appears as though you do not have permission to view information for any of the hosts you requested...
    \n"); printf("
    If you believe this is an error, check the HTTP server authentication requirements for accessing this CGI
    "); printf("and check the authorization options in your CGI configuration file.
    \n"); } else { printf("
    There are no host groups defined.
    \n"); } printf("
    \n"); printf("

    \n"); } return; } /* shows an overview of a specific hostgroup... */ void show_hostgroup_overview(hostgroup *hstgrp) { hostsmember *temp_member = NULL; host *temp_host = NULL; hoststatus *temp_hoststatus = NULL; int odd = 0; /* make sure the user is authorized to view this hostgroup */ if(is_authorized_for_hostgroup(hstgrp, ¤t_authdata) == FALSE) return; printf("
    \n"); printf("%s", STATUS_CGI, url_encode(hstgrp->group_name), hstgrp->alias); printf(" (%s)", EXTINFO_CGI, DISPLAY_HOSTGROUP_INFO, url_encode(hstgrp->group_name), hstgrp->group_name); printf("
    \n"); printf("
    \n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); /* find all the hosts that belong to the hostgroup */ for(temp_member = hstgrp->members; temp_member != NULL; temp_member = temp_member->next) { /* find the host... */ temp_host = find_host(temp_member->host_name); if(temp_host == NULL) continue; /* make sure user has rights to view this host */ if(is_authorized_for_host(temp_host, ¤t_authdata) == FALSE) continue; /* find the host status */ temp_hoststatus = find_hoststatus(temp_host->name); if(temp_hoststatus == NULL) continue; /* make sure we only display hosts of the specified status levels */ if(!(host_status_types & temp_hoststatus->status)) continue; /* make sure we only display hosts that have the desired properties */ if(passes_host_properties_filter(temp_hoststatus) == FALSE) continue; if(odd) odd = 0; else odd = 1; show_servicegroup_hostgroup_member_overview(temp_hoststatus, odd, NULL); } printf("
    HostStatusServicesActions
    \n"); printf("
    \n"); return; } /* shows a host status overview... */ void show_servicegroup_hostgroup_member_overview(hoststatus *hststatus, int odd, void *data) { char status[MAX_INPUT_BUFFER]; const char *status_bg_class = ""; const char *status_class = ""; host *temp_host = NULL; char *processed_string = NULL; temp_host = find_host(hststatus->host_name); /* grab macros */ grab_host_macros_r(mac, temp_host); if(hststatus->status == HOST_PENDING) { strncpy(status, "PENDING", sizeof(status)); status_class = "HOSTPENDING"; status_bg_class = (odd) ? "Even" : "Odd"; } else if(hststatus->status == SD_HOST_UP) { strncpy(status, "UP", sizeof(status)); status_class = "HOSTUP"; status_bg_class = (odd) ? "Even" : "Odd"; } else if(hststatus->status == SD_HOST_DOWN) { strncpy(status, "DOWN", sizeof(status)); status_class = "HOStdOWN"; status_bg_class = "HOStdOWN"; } else if(hststatus->status == SD_HOST_UNREACHABLE) { strncpy(status, "UNREACHABLE", sizeof(status)); status_class = "HOSTUNREACHABLE"; status_bg_class = "HOSTUNREACHABLE"; } status[sizeof(status) - 1] = '\x0'; printf("\n", status_bg_class); printf("\n", status_bg_class); printf("\n"); printf("\n", status_bg_class); printf("\n", status_bg_class, STATUS_CGI, url_encode(hststatus->host_name), temp_host->address, hststatus->host_name); if(temp_host->icon_image != NULL) { printf("\n", status_bg_class); printf("\n"); } printf("\n"); printf("
    %s", status_bg_class); printf("", EXTINFO_CGI, DISPLAY_HOST_INFO, url_encode(hststatus->host_name)); printf("%s", STATUS_ICON_WIDTH, STATUS_ICON_HEIGHT, (temp_host->icon_image_alt == NULL) ? "" : temp_host->icon_image_alt, (temp_host->icon_image_alt == NULL) ? "" : temp_host->icon_image_alt); printf(""); printf("
    \n"); printf("\n"); printf("%s\n", status_class, status); printf("\n", status_bg_class); show_servicegroup_hostgroup_member_service_status_totals(hststatus->host_name, data); printf("\n"); printf("", status_bg_class); printf("View Extended Information For This Host\n", EXTINFO_CGI, DISPLAY_HOST_INFO, url_encode(hststatus->host_name), url_images_path, DETAIL_ICON); if(temp_host->notes_url != NULL) { printf("", (notes_url_target == NULL) ? "_blank" : notes_url_target); printf("%s", url_images_path, NOTES_ICON, STATUS_ICON_WIDTH, STATUS_ICON_HEIGHT, "View Extra Host Notes", "View Extra Host Notes"); printf(""); } if(temp_host->action_url != NULL) { printf("", (action_url_target == NULL) ? "_blank" : action_url_target); printf("%s", url_images_path, ACTION_ICON, STATUS_ICON_WIDTH, STATUS_ICON_HEIGHT, "Perform Extra Host Actions", "Perform Extra Host Actions"); printf(""); } printf("View Service Details For This Host\n", STATUS_CGI, url_encode(hststatus->host_name), url_images_path, STATUS_DETAIL_ICON); #ifdef USE_STATUSMAP printf("%s", STATUSMAP_CGI, url_encode(hststatus->host_name), url_images_path, STATUSMAP_ICON, STATUS_ICON_WIDTH, STATUS_ICON_HEIGHT, "Locate Host On Map", "Locate Host On Map"); #endif printf(""); printf("\n"); return; } void show_servicegroup_hostgroup_member_service_status_totals(char *hst_name, void *data) { int total_ok = 0; int total_warning = 0; int total_unknown = 0; int total_critical = 0; int total_pending = 0; servicestatus *temp_servicestatus; service *temp_service; servicegroup *temp_servicegroup = NULL; char temp_buffer[MAX_INPUT_BUFFER]; if(display_type == DISPLAY_SERVICEGROUPS) temp_servicegroup = (servicegroup *)data; /* check all services... */ for(temp_servicestatus = servicestatus_list; temp_servicestatus != NULL; temp_servicestatus = temp_servicestatus->next) { if(!strcmp(hst_name, temp_servicestatus->host_name)) { /* make sure the user is authorized to see this service... */ temp_service = find_service(temp_servicestatus->host_name, temp_servicestatus->description); if(is_authorized_for_service(temp_service, ¤t_authdata) == FALSE) continue; if(display_type == DISPLAY_SERVICEGROUPS) { /* is this service a member of the servicegroup? */ if(is_service_member_of_servicegroup(temp_servicegroup, temp_service) == FALSE) continue; } /* make sure we only display services of the specified status levels */ if(!(service_status_types & temp_servicestatus->status)) continue; /* make sure we only display services that have the desired properties */ if(passes_service_properties_filter(temp_servicestatus) == FALSE) continue; if(temp_servicestatus->status == SERVICE_CRITICAL) total_critical++; else if(temp_servicestatus->status == SERVICE_WARNING) total_warning++; else if(temp_servicestatus->status == SERVICE_UNKNOWN) total_unknown++; else if(temp_servicestatus->status == SERVICE_OK) total_ok++; else if(temp_servicestatus->status == SERVICE_PENDING) total_pending++; else total_ok++; } } printf("\n"); if(display_type == DISPLAY_SERVICEGROUPS) snprintf(temp_buffer, sizeof(temp_buffer) - 1, "servicegroup=%s&style=detail", url_encode(temp_servicegroup->group_name)); else snprintf(temp_buffer, sizeof(temp_buffer) - 1, "host=%s", url_encode(hst_name)); temp_buffer[sizeof(temp_buffer) - 1] = '\x0'; if(total_ok > 0) printf("\n", STATUS_CGI, temp_buffer, SERVICE_OK, host_status_types, service_properties, host_properties, total_ok); if(total_warning > 0) printf("\n", STATUS_CGI, temp_buffer, SERVICE_WARNING, host_status_types, service_properties, host_properties, total_warning); if(total_unknown > 0) printf("\n", STATUS_CGI, temp_buffer, SERVICE_UNKNOWN, host_status_types, service_properties, host_properties, total_unknown); if(total_critical > 0) printf("\n", STATUS_CGI, temp_buffer, SERVICE_CRITICAL, host_status_types, service_properties, host_properties, total_critical); if(total_pending > 0) printf("\n", STATUS_CGI, temp_buffer, SERVICE_PENDING, host_status_types, service_properties, host_properties, total_pending); printf("
    %d OK
    %d WARNING
    %d UNKNOWN
    %d CRITICAL
    %d PENDING
    \n"); if((total_ok + total_warning + total_unknown + total_critical + total_pending) == 0) printf("No matching services"); return; } /* show a summary of hostgroup(s)... */ void show_hostgroup_summaries(void) { hostgroup *temp_hostgroup = NULL; int user_has_seen_something = FALSE; int hostgroup_error = FALSE; int odd = 0; printf("

    \n"); printf("\n"); printf("\n"); printf(""); printf("\n"); printf("\n"); printf("\n"); printf("
    \n"); show_filters(); printf("\n"); printf("
    Status Summary For "); if(show_all_hostgroups == TRUE) printf("All Host Groups"); else printf("Host Group '%s'", hostgroup_name); printf("
    \n"); printf("
    "); printf("
    \n"); printf("

    \n"); printf("
    \n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); /* display status summary for all hostgroups */ if(show_all_hostgroups == TRUE) { /* loop through all hostgroups... */ for(temp_hostgroup = hostgroup_list; temp_hostgroup != NULL; temp_hostgroup = temp_hostgroup->next) { /* make sure the user is authorized to view this hostgroup */ if(is_authorized_for_hostgroup(temp_hostgroup, ¤t_authdata) == FALSE) continue; if(odd == 0) odd = 1; else odd = 0; /* show summary for this hostgroup */ show_hostgroup_summary(temp_hostgroup, odd); user_has_seen_something = TRUE; } } /* else just show summary for a specific hostgroup */ else { temp_hostgroup = find_hostgroup(hostgroup_name); if(temp_hostgroup == NULL) hostgroup_error = TRUE; else { show_hostgroup_summary(temp_hostgroup, 1); user_has_seen_something = TRUE; } } printf("
    Host GroupHost Status SummaryService Status Summary
    \n"); printf("
    \n"); /* if user couldn't see anything, print out some helpful info... */ if(user_has_seen_something == FALSE && hostgroup_error == FALSE) { printf("

    \n"); if(hoststatus_list != NULL) { printf("
    It appears as though you do not have permission to view information for any of the hosts you requested...
    \n"); printf("
    If you believe this is an error, check the HTTP server authentication requirements for accessing this CGI
    "); printf("and check the authorization options in your CGI configuration file.
    \n"); } else { printf("
    There doesn't appear to be any host status information in the status log...

    \n"); printf("Make sure that Nagios is running and that you have specified the location of you status log correctly in the configuration files.
    \n"); } printf("

    \n"); } /* we couldn't find the hostgroup */ else if(hostgroup_error == TRUE) { printf("

    \n"); printf("
    Sorry, but hostgroup '%s' doesn't seem to exist...
    \n", hostgroup_name); printf("

    \n"); } return; } /* displays status summary information for a specific hostgroup */ void show_hostgroup_summary(hostgroup *temp_hostgroup, int odd) { const char *status_bg_class = ""; if(odd == 1) status_bg_class = "Even"; else status_bg_class = "Odd"; printf("\n", status_bg_class, status_bg_class); printf("%s ", STATUS_CGI, url_encode(temp_hostgroup->group_name), temp_hostgroup->alias); printf("(%s)", EXTINFO_CGI, DISPLAY_HOSTGROUP_INFO, url_encode(temp_hostgroup->group_name), temp_hostgroup->group_name); printf(""); printf("", status_bg_class); show_hostgroup_host_totals_summary(temp_hostgroup); printf(""); printf("", status_bg_class); show_hostgroup_service_totals_summary(temp_hostgroup); printf(""); printf("\n"); return; } /* shows host total summary information for a specific hostgroup */ void show_hostgroup_host_totals_summary(hostgroup *temp_hostgroup) { hostsmember *temp_member; int hosts_up = 0; int hosts_down = 0; int hosts_unreachable = 0; int hosts_pending = 0; int hosts_down_scheduled = 0; int hosts_down_acknowledged = 0; int hosts_down_disabled = 0; int hosts_down_unacknowledged = 0; int hosts_unreachable_scheduled = 0; int hosts_unreachable_acknowledged = 0; int hosts_unreachable_disabled = 0; int hosts_unreachable_unacknowledged = 0; hoststatus *temp_hoststatus; host *temp_host; int problem = FALSE; /* find all the hosts that belong to the hostgroup */ for(temp_member = temp_hostgroup->members; temp_member != NULL; temp_member = temp_member->next) { /* find the host... */ temp_host = find_host(temp_member->host_name); if(temp_host == NULL) continue; /* make sure user has rights to view this host */ if(is_authorized_for_host(temp_host, ¤t_authdata) == FALSE) continue; /* find the host status */ temp_hoststatus = find_hoststatus(temp_host->name); if(temp_hoststatus == NULL) continue; /* make sure we only display hosts of the specified status levels */ if(!(host_status_types & temp_hoststatus->status)) continue; /* make sure we only display hosts that have the desired properties */ if(passes_host_properties_filter(temp_hoststatus) == FALSE) continue; problem = TRUE; if(temp_hoststatus->status == SD_HOST_UP) hosts_up++; else if(temp_hoststatus->status == SD_HOST_DOWN) { if(temp_hoststatus->scheduled_downtime_depth > 0) { hosts_down_scheduled++; problem = FALSE; } if(temp_hoststatus->problem_has_been_acknowledged == TRUE) { hosts_down_acknowledged++; problem = FALSE; } if(temp_hoststatus->checks_enabled == FALSE) { hosts_down_disabled++; problem = FALSE; } if(problem == TRUE) hosts_down_unacknowledged++; hosts_down++; } else if(temp_hoststatus->status == SD_HOST_UNREACHABLE) { if(temp_hoststatus->scheduled_downtime_depth > 0) { hosts_unreachable_scheduled++; problem = FALSE; } if(temp_hoststatus->problem_has_been_acknowledged == TRUE) { hosts_unreachable_acknowledged++; problem = FALSE; } if(temp_hoststatus->checks_enabled == FALSE) { hosts_unreachable_disabled++; problem = FALSE; } if(problem == TRUE) hosts_unreachable_unacknowledged++; hosts_unreachable++; } else hosts_pending++; } printf("\n"); if(hosts_up > 0) { printf(""); printf("", STATUS_CGI, url_encode(temp_hostgroup->group_name), SD_HOST_UP, host_properties, hosts_up); printf("\n"); } if(hosts_down > 0) { printf("\n"); printf("\n"); printf("\n"); } if(hosts_unreachable > 0) { printf("\n"); printf("\n"); printf("\n"); } if(hosts_pending > 0) printf("\n", STATUS_CGI, url_encode(temp_hostgroup->group_name), HOST_PENDING, host_properties, hosts_pending); printf("
    %d UP
    \n"); printf("\n"); printf("\n", STATUS_CGI, url_encode(temp_hostgroup->group_name), SD_HOST_DOWN, host_properties, hosts_down); printf("\n"); printf("\n"); printf("
    %d DOWN :\n"); if(hosts_down_unacknowledged > 0) printf("\n", STATUS_CGI, url_encode(temp_hostgroup->group_name), SD_HOST_DOWN, HOST_NO_SCHEDULED_DOWNTIME | HOST_STATE_UNACKNOWLEDGED | HOST_CHECKS_ENABLED, hosts_down_unacknowledged); if(hosts_down_scheduled > 0) printf("\n", STATUS_CGI, url_encode(temp_hostgroup->group_name), SD_HOST_DOWN, HOST_SCHEDULED_DOWNTIME, hosts_down_scheduled); if(hosts_down_acknowledged > 0) printf("\n", STATUS_CGI, url_encode(temp_hostgroup->group_name), SD_HOST_DOWN, HOST_STATE_ACKNOWLEDGED, hosts_down_acknowledged); if(hosts_down_disabled > 0) printf("\n", STATUS_CGI, url_encode(temp_hostgroup->group_name), SD_HOST_DOWN, HOST_CHECKS_DISABLED, hosts_down_disabled); printf("
    %d Unhandled
    %d Scheduled
    %d Acknowledged
    %d Disabled
    \n"); printf("\n"); printf("\n", STATUS_CGI, url_encode(temp_hostgroup->group_name), SD_HOST_UNREACHABLE, host_properties, hosts_unreachable); printf("\n"); printf("\n"); printf("
    %d UNREACHABLE :\n"); if(hosts_unreachable_unacknowledged > 0) printf("\n", STATUS_CGI, url_encode(temp_hostgroup->group_name), SD_HOST_UNREACHABLE, HOST_NO_SCHEDULED_DOWNTIME | HOST_STATE_UNACKNOWLEDGED | HOST_CHECKS_ENABLED, hosts_unreachable_unacknowledged); if(hosts_unreachable_scheduled > 0) printf("\n", STATUS_CGI, url_encode(temp_hostgroup->group_name), SD_HOST_UNREACHABLE, HOST_SCHEDULED_DOWNTIME, hosts_unreachable_scheduled); if(hosts_unreachable_acknowledged > 0) printf("\n", STATUS_CGI, url_encode(temp_hostgroup->group_name), SD_HOST_UNREACHABLE, HOST_STATE_ACKNOWLEDGED, hosts_unreachable_acknowledged); if(hosts_unreachable_disabled > 0) printf("\n", STATUS_CGI, url_encode(temp_hostgroup->group_name), SD_HOST_UNREACHABLE, HOST_CHECKS_DISABLED, hosts_unreachable_disabled); printf("
    %d Unhandled
    %d Scheduled
    %d Acknowledged
    %d Disabled
    %d PENDING
    \n"); if((hosts_up + hosts_down + hosts_unreachable + hosts_pending) == 0) printf("No matching hosts"); return; } /* shows service total summary information for a specific hostgroup */ void show_hostgroup_service_totals_summary(hostgroup *temp_hostgroup) { int services_ok = 0; int services_warning = 0; int services_unknown = 0; int services_critical = 0; int services_pending = 0; int services_warning_host_problem = 0; int services_warning_scheduled = 0; int services_warning_acknowledged = 0; int services_warning_disabled = 0; int services_warning_unacknowledged = 0; int services_unknown_host_problem = 0; int services_unknown_scheduled = 0; int services_unknown_acknowledged = 0; int services_unknown_disabled = 0; int services_unknown_unacknowledged = 0; int services_critical_host_problem = 0; int services_critical_scheduled = 0; int services_critical_acknowledged = 0; int services_critical_disabled = 0; int services_critical_unacknowledged = 0; servicestatus *temp_servicestatus = NULL; hoststatus *temp_hoststatus = NULL; host *temp_host = NULL; int problem = FALSE; /* check all services... */ for(temp_servicestatus = servicestatus_list; temp_servicestatus != NULL; temp_servicestatus = temp_servicestatus->next) { /* find the host this service is associated with */ temp_host = find_host(temp_servicestatus->host_name); if(temp_host == NULL) continue; /* make sure user has rights to view this host */ if(is_authorized_for_host(temp_host, ¤t_authdata) == FALSE) continue; /* see if this service is associated with a host in the specified hostgroup */ if(is_host_member_of_hostgroup(temp_hostgroup, temp_host) == FALSE) continue; /* find the status of the associated host */ temp_hoststatus = find_hoststatus(temp_servicestatus->host_name); if(temp_hoststatus == NULL) continue; /* find the status of the associated host */ temp_hoststatus = find_hoststatus(temp_servicestatus->host_name); if(temp_hoststatus == NULL) continue; /* make sure we only display hosts of the specified status levels */ if(!(host_status_types & temp_hoststatus->status)) continue; /* make sure we only display hosts that have the desired properties */ if(passes_host_properties_filter(temp_hoststatus) == FALSE) continue; /* make sure we only display services of the specified status levels */ if(!(service_status_types & temp_servicestatus->status)) continue; /* make sure we only display services that have the desired properties */ if(passes_service_properties_filter(temp_servicestatus) == FALSE) continue; problem = TRUE; if(temp_servicestatus->status == SERVICE_OK) services_ok++; else if(temp_servicestatus->status == SERVICE_WARNING) { temp_hoststatus = find_hoststatus(temp_servicestatus->host_name); if(temp_hoststatus != NULL && (temp_hoststatus->status == SD_HOST_DOWN || temp_hoststatus->status == SD_HOST_UNREACHABLE)) { services_warning_host_problem++; problem = FALSE; } if(temp_servicestatus->scheduled_downtime_depth > 0) { services_warning_scheduled++; problem = FALSE; } if(temp_servicestatus->problem_has_been_acknowledged == TRUE) { services_warning_acknowledged++; problem = FALSE; } if(temp_servicestatus->checks_enabled == FALSE) { services_warning_disabled++; problem = FALSE; } if(problem == TRUE) services_warning_unacknowledged++; services_warning++; } else if(temp_servicestatus->status == SERVICE_UNKNOWN) { temp_hoststatus = find_hoststatus(temp_servicestatus->host_name); if(temp_hoststatus != NULL && (temp_hoststatus->status == SD_HOST_DOWN || temp_hoststatus->status == SD_HOST_UNREACHABLE)) { services_unknown_host_problem++; problem = FALSE; } if(temp_servicestatus->scheduled_downtime_depth > 0) { services_unknown_scheduled++; problem = FALSE; } if(temp_servicestatus->problem_has_been_acknowledged == TRUE) { services_unknown_acknowledged++; problem = FALSE; } if(temp_servicestatus->checks_enabled == FALSE) { services_unknown_disabled++; problem = FALSE; } if(problem == TRUE) services_unknown_unacknowledged++; services_unknown++; } else if(temp_servicestatus->status == SERVICE_CRITICAL) { temp_hoststatus = find_hoststatus(temp_servicestatus->host_name); if(temp_hoststatus != NULL && (temp_hoststatus->status == SD_HOST_DOWN || temp_hoststatus->status == SD_HOST_UNREACHABLE)) { services_critical_host_problem++; problem = FALSE; } if(temp_servicestatus->scheduled_downtime_depth > 0) { services_critical_scheduled++; problem = FALSE; } if(temp_servicestatus->problem_has_been_acknowledged == TRUE) { services_critical_acknowledged++; problem = FALSE; } if(temp_servicestatus->checks_enabled == FALSE) { services_critical_disabled++; problem = FALSE; } if(problem == TRUE) services_critical_unacknowledged++; services_critical++; } else if(temp_servicestatus->status == SERVICE_PENDING) services_pending++; } printf("\n"); if(services_ok > 0) printf("\n", STATUS_CGI, url_encode(temp_hostgroup->group_name), SERVICE_OK, host_status_types, service_properties, host_properties, services_ok); if(services_warning > 0) { printf("\n"); printf("\n"); printf("\n"); } if(services_unknown > 0) { printf("\n"); printf("\n"); printf("\n"); } if(services_critical > 0) { printf("\n"); printf("\n"); printf("\n"); } if(services_pending > 0) printf("\n", STATUS_CGI, url_encode(temp_hostgroup->group_name), SERVICE_PENDING, host_status_types, service_properties, host_properties, services_pending); printf("
    %d OK
    \n"); printf("\n"); printf("\n", STATUS_CGI, url_encode(temp_hostgroup->group_name), SERVICE_WARNING, host_status_types, service_properties, host_properties, services_warning); printf("\n"); printf("\n"); printf("
    %d WARNING :\n"); if(services_warning_unacknowledged > 0) printf("\n", STATUS_CGI, url_encode(temp_hostgroup->group_name), SERVICE_WARNING, SD_HOST_UP | HOST_PENDING, SERVICE_NO_SCHEDULED_DOWNTIME | SERVICE_STATE_UNACKNOWLEDGED | SERVICE_CHECKS_ENABLED, services_warning_unacknowledged); if(services_warning_host_problem > 0) printf("\n", STATUS_CGI, url_encode(temp_hostgroup->group_name), SERVICE_WARNING, SD_HOST_DOWN | SD_HOST_UNREACHABLE, services_warning_host_problem); if(services_warning_scheduled > 0) printf("\n", STATUS_CGI, url_encode(temp_hostgroup->group_name), SERVICE_WARNING, SERVICE_SCHEDULED_DOWNTIME, services_warning_scheduled); if(services_warning_acknowledged > 0) printf("\n", STATUS_CGI, url_encode(temp_hostgroup->group_name), SERVICE_WARNING, SERVICE_STATE_ACKNOWLEDGED, services_warning_acknowledged); if(services_warning_disabled > 0) printf("\n", STATUS_CGI, url_encode(temp_hostgroup->group_name), SERVICE_WARNING, SERVICE_CHECKS_DISABLED, services_warning_disabled); printf("
    %d Unhandled
    %d on Problem Hosts
    %d Scheduled
    %d Acknowledged
    %d Disabled
    \n"); printf("\n"); printf("\n", STATUS_CGI, url_encode(temp_hostgroup->group_name), SERVICE_UNKNOWN, host_status_types, service_properties, host_properties, services_unknown); printf("\n"); printf("\n"); printf("
    %d UNKNOWN :\n"); if(services_unknown_unacknowledged > 0) printf("\n", STATUS_CGI, url_encode(temp_hostgroup->group_name), SERVICE_UNKNOWN, SD_HOST_UP | HOST_PENDING, SERVICE_NO_SCHEDULED_DOWNTIME | SERVICE_STATE_UNACKNOWLEDGED | SERVICE_CHECKS_ENABLED, services_unknown_unacknowledged); if(services_unknown_host_problem > 0) printf("\n", STATUS_CGI, url_encode(temp_hostgroup->group_name), SERVICE_UNKNOWN, SD_HOST_DOWN | SD_HOST_UNREACHABLE, services_unknown_host_problem); if(services_unknown_scheduled > 0) printf("\n", STATUS_CGI, url_encode(temp_hostgroup->group_name), SERVICE_UNKNOWN, SERVICE_SCHEDULED_DOWNTIME, services_unknown_scheduled); if(services_unknown_acknowledged > 0) printf("\n", STATUS_CGI, url_encode(temp_hostgroup->group_name), SERVICE_UNKNOWN, SERVICE_STATE_ACKNOWLEDGED, services_unknown_acknowledged); if(services_unknown_disabled > 0) printf("\n", STATUS_CGI, url_encode(temp_hostgroup->group_name), SERVICE_UNKNOWN, SERVICE_CHECKS_DISABLED, services_unknown_disabled); printf("
    %d Unhandled
    %d on Problem Hosts
    %d Scheduled
    %d Acknowledged
    %d Disabled
    \n"); printf("\n"); printf("\n", STATUS_CGI, url_encode(temp_hostgroup->group_name), SERVICE_CRITICAL, host_status_types, service_properties, host_properties, services_critical); printf("\n"); printf("\n"); printf("
    %d CRITICAL :\n"); if(services_critical_unacknowledged > 0) printf("\n", STATUS_CGI, url_encode(temp_hostgroup->group_name), SERVICE_CRITICAL, SD_HOST_UP | HOST_PENDING, SERVICE_NO_SCHEDULED_DOWNTIME | SERVICE_STATE_UNACKNOWLEDGED | SERVICE_CHECKS_ENABLED, services_critical_unacknowledged); if(services_critical_host_problem > 0) printf("\n", STATUS_CGI, url_encode(temp_hostgroup->group_name), SERVICE_CRITICAL, SD_HOST_DOWN | SD_HOST_UNREACHABLE, services_critical_host_problem); if(services_critical_scheduled > 0) printf("\n", STATUS_CGI, url_encode(temp_hostgroup->group_name), SERVICE_CRITICAL, SERVICE_SCHEDULED_DOWNTIME, services_critical_scheduled); if(services_critical_acknowledged > 0) printf("\n", STATUS_CGI, url_encode(temp_hostgroup->group_name), SERVICE_CRITICAL, SERVICE_STATE_ACKNOWLEDGED, services_critical_acknowledged); if(services_critical_disabled > 0) printf("\n", STATUS_CGI, url_encode(temp_hostgroup->group_name), SERVICE_CRITICAL, SERVICE_CHECKS_DISABLED, services_critical_disabled); printf("
    %d Unhandled
    %d on Problem Hosts
    %d Scheduled
    %d Acknowledged
    %d Disabled
    %d PENDING
    \n"); if((services_ok + services_warning + services_unknown + services_critical + services_pending) == 0) printf("No matching services"); return; } /* show a grid layout of hostgroup(s)... */ void show_hostgroup_grids(void) { hostgroup *temp_hostgroup = NULL; int user_has_seen_something = FALSE; int hostgroup_error = FALSE; int odd = 0; printf("

    \n"); printf("\n"); printf("\n"); printf(""); printf("\n"); printf("\n"); printf("\n"); printf("
    \n"); show_filters(); printf("\n"); printf("
    Status Grid For "); if(show_all_hostgroups == TRUE) printf("All Host Groups"); else printf("Host Group '%s'", hostgroup_name); printf("
    \n"); printf("
    "); printf("
    \n"); printf("

    \n"); /* display status grids for all hostgroups */ if(show_all_hostgroups == TRUE) { /* loop through all hostgroups... */ for(temp_hostgroup = hostgroup_list; temp_hostgroup != NULL; temp_hostgroup = temp_hostgroup->next) { /* make sure the user is authorized to view this hostgroup */ if(is_authorized_for_hostgroup(temp_hostgroup, ¤t_authdata) == FALSE) continue; if(odd == 0) odd = 1; else odd = 0; /* show grid for this hostgroup */ show_hostgroup_grid(temp_hostgroup); user_has_seen_something = TRUE; } } /* else just show grid for a specific hostgroup */ else { temp_hostgroup = find_hostgroup(hostgroup_name); if(temp_hostgroup == NULL) hostgroup_error = TRUE; else { show_hostgroup_grid(temp_hostgroup); user_has_seen_something = TRUE; } } /* if user couldn't see anything, print out some helpful info... */ if(user_has_seen_something == FALSE && hostgroup_error == FALSE) { printf("

    \n"); if(hoststatus_list != NULL) { printf("
    It appears as though you do not have permission to view information for any of the hosts you requested...
    \n"); printf("
    If you believe this is an error, check the HTTP server authentication requirements for accessing this CGI
    "); printf("and check the authorization options in your CGI configuration file.
    \n"); } else { printf("
    There doesn't appear to be any host status information in the status log...

    \n"); printf("Make sure that Nagios is running and that you have specified the location of you status log correctly in the configuration files.
    \n"); } printf("

    \n"); } /* we couldn't find the hostgroup */ else if(hostgroup_error == TRUE) { printf("

    \n"); printf("
    Sorry, but hostgroup '%s' doesn't seem to exist...
    \n", hostgroup_name); printf("

    \n"); } return; } /* displays status grid for a specific hostgroup */ void show_hostgroup_grid(hostgroup *temp_hostgroup) { hostsmember *temp_member; const char *status_bg_class = ""; const char *host_status_class = ""; const char *service_status_class = ""; host *temp_host; service *temp_service; hoststatus *temp_hoststatus; servicestatus *temp_servicestatus; char *processed_string = NULL; int odd = 0; int current_item; printf("

    \n"); printf("

    \n"); printf("
    %s", STATUS_CGI, url_encode(temp_hostgroup->group_name), temp_hostgroup->alias); printf(" (%s)
    ", EXTINFO_CGI, DISPLAY_HOSTGROUP_INFO, url_encode(temp_hostgroup->group_name), temp_hostgroup->group_name); printf("\n"); printf("\n"); /* find all the hosts that belong to the hostgroup */ for(temp_member = temp_hostgroup->members; temp_member != NULL; temp_member = temp_member->next) { /* find the host... */ temp_host = find_host(temp_member->host_name); if(temp_host == NULL) continue; /* make sure user has rights to view this host */ if(is_authorized_for_host(temp_host, ¤t_authdata) == FALSE) continue; /* grab macros */ grab_host_macros_r(mac, temp_host); /* find the host status */ temp_hoststatus = find_hoststatus(temp_host->name); if(temp_hoststatus == NULL) continue; if(odd == 1) { status_bg_class = "Even"; odd = 0; } else { status_bg_class = "Odd"; odd = 1; } printf("\n", status_bg_class); /* get the status of the host */ if(temp_hoststatus->status == SD_HOST_DOWN) host_status_class = "HOStdOWN"; else if(temp_hoststatus->status == SD_HOST_UNREACHABLE) host_status_class = "HOSTUNREACHABLE"; else host_status_class = status_bg_class; printf("\n"); printf("\n"); /* actions */ printf("\n"); printf("\n"); } printf("
    HostServicesActions
    ", host_status_class); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("
    \n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("
    ", host_status_class); printf("%s\n", EXTINFO_CGI, DISPLAY_HOST_INFO, url_encode(temp_host->name), temp_host->name); printf("
    \n"); printf("
    \n"); printf("\n"); printf("\n"); if(temp_host->icon_image != NULL) { printf("\n"); printf("
    "); printf("\n", EXTINFO_CGI, DISPLAY_HOST_INFO, url_encode(temp_host->name)); printf("%s", STATUS_ICON_WIDTH, STATUS_ICON_HEIGHT, (temp_host->icon_image_alt == NULL) ? "" : temp_host->icon_image_alt, (temp_host->icon_image_alt == NULL) ? "" : temp_host->icon_image_alt); printf(""); printf("\n"); } printf("\n"); printf("
    \n"); printf("
    \n"); printf("
    ", host_status_class); /* display all services on the host */ current_item = 1; for(temp_service = service_list; temp_service; temp_service = temp_service->next) { /* skip this service if it's not associate with the host */ if(strcmp(temp_service->host_name, temp_host->name)) continue; if(current_item > max_grid_width && max_grid_width > 0) { printf("
    \n"); current_item = 1; } /* grab macros */ grab_service_macros_r(mac, temp_service); /* get the status of the service */ temp_servicestatus = find_servicestatus(temp_service->host_name, temp_service->description); if(temp_servicestatus == NULL) service_status_class = "NULL"; else if(temp_servicestatus->status == SERVICE_OK) service_status_class = "OK"; else if(temp_servicestatus->status == SERVICE_WARNING) service_status_class = "WARNING"; else if(temp_servicestatus->status == SERVICE_UNKNOWN) service_status_class = "UNKNOWN"; else if(temp_servicestatus->status == SERVICE_CRITICAL) service_status_class = "CRITICAL"; else service_status_class = "PENDING"; printf("%s ", url_encode(temp_servicestatus->description), service_status_class, temp_servicestatus->description); current_item++; } printf("
    ", host_status_class); printf("\n", EXTINFO_CGI, DISPLAY_HOST_INFO, url_encode(temp_host->name)); printf("%s", url_images_path, DETAIL_ICON, STATUS_ICON_WIDTH, STATUS_ICON_HEIGHT, "View Extended Information For This Host", "View Extended Information For This Host"); printf(""); if(temp_host->notes_url != NULL) { printf("", (notes_url_target == NULL) ? "_blank" : notes_url_target); printf("%s", url_images_path, NOTES_ICON, STATUS_ICON_WIDTH, STATUS_ICON_HEIGHT, "View Extra Host Notes", "View Extra Host Notes"); printf(""); } if(temp_host->action_url != NULL) { printf("", (action_url_target == NULL) ? "_blank" : action_url_target); printf("%s", url_images_path, ACTION_ICON, STATUS_ICON_WIDTH, STATUS_ICON_HEIGHT, "Perform Extra Host Actions", "Perform Extra Host Actions"); printf(""); } printf("View Service Details For This Host\n", STATUS_CGI, url_encode(temp_host->name), url_images_path, STATUS_DETAIL_ICON); #ifdef USE_STATUSMAP printf("%s", STATUSMAP_CGI, url_encode(temp_host->name), url_images_path, STATUSMAP_ICON, STATUS_ICON_WIDTH, STATUS_ICON_HEIGHT, "Locate Host On Map", "Locate Host On Map"); #endif printf("
    \n"); printf("
    \n"); printf("

    \n"); return; } /******************************************************************/ /********** SERVICE SORTING & FILTERING FUNCTIONS ***************/ /******************************************************************/ /* sorts the service list */ int sort_services(int s_type, int s_option) { servicesort *new_servicesort; servicesort *last_servicesort; servicesort *temp_servicesort; servicestatus *temp_svcstatus; if(s_type == SORT_NONE) return ERROR; if(servicestatus_list == NULL) return ERROR; /* sort all services status entries */ for(temp_svcstatus = servicestatus_list; temp_svcstatus != NULL; temp_svcstatus = temp_svcstatus->next) { /* allocate memory for a new sort structure */ new_servicesort = (servicesort *)malloc(sizeof(servicesort)); if(new_servicesort == NULL) return ERROR; new_servicesort->svcstatus = temp_svcstatus; last_servicesort = servicesort_list; for(temp_servicesort = servicesort_list; temp_servicesort != NULL; temp_servicesort = temp_servicesort->next) { if(compare_servicesort_entries(s_type, s_option, new_servicesort, temp_servicesort) == TRUE) { new_servicesort->next = temp_servicesort; if(temp_servicesort == servicesort_list) servicesort_list = new_servicesort; else last_servicesort->next = new_servicesort; break; } else last_servicesort = temp_servicesort; } if(servicesort_list == NULL) { new_servicesort->next = NULL; servicesort_list = new_servicesort; } else if(temp_servicesort == NULL) { new_servicesort->next = NULL; last_servicesort->next = new_servicesort; } } return OK; } int compare_servicesort_entries(int s_type, int s_option, servicesort *new_servicesort, servicesort *temp_servicesort) { servicestatus *new_svcstatus; servicestatus *temp_svcstatus; time_t nt; time_t tt; new_svcstatus = new_servicesort->svcstatus; temp_svcstatus = temp_servicesort->svcstatus; if(s_type == SORT_ASCENDING) { if(s_option == SORT_LASTCHECKTIME) { if(new_svcstatus->last_check < temp_svcstatus->last_check) return TRUE; else return FALSE; } else if(s_option == SORT_CURRENTATTEMPT) { if(new_svcstatus->current_attempt < temp_svcstatus->current_attempt) return TRUE; else return FALSE; } else if(s_option == SORT_SERVICESTATUS) { if(new_svcstatus->status <= temp_svcstatus->status) return TRUE; else return FALSE; } else if(s_option == SORT_HOSTNAME) { if(strcasecmp(new_svcstatus->host_name, temp_svcstatus->host_name) < 0) return TRUE; else return FALSE; } else if(s_option == SORT_SERVICENAME) { if(strcasecmp(new_svcstatus->description, temp_svcstatus->description) < 0) return TRUE; else return FALSE; } else if(s_option == SORT_STATEDURATION) { if(new_svcstatus->last_state_change == (time_t)0) nt = (program_start > current_time) ? 0 : (current_time - program_start); else nt = (new_svcstatus->last_state_change > current_time) ? 0 : (current_time - new_svcstatus->last_state_change); if(temp_svcstatus->last_state_change == (time_t)0) tt = (program_start > current_time) ? 0 : (current_time - program_start); else tt = (temp_svcstatus->last_state_change > current_time) ? 0 : (current_time - temp_svcstatus->last_state_change); if(nt < tt) return TRUE; else return FALSE; } } else { if(s_option == SORT_LASTCHECKTIME) { if(new_svcstatus->last_check > temp_svcstatus->last_check) return TRUE; else return FALSE; } else if(s_option == SORT_CURRENTATTEMPT) { if(new_svcstatus->current_attempt > temp_svcstatus->current_attempt) return TRUE; else return FALSE; } else if(s_option == SORT_SERVICESTATUS) { if(new_svcstatus->status > temp_svcstatus->status) return TRUE; else return FALSE; } else if(s_option == SORT_HOSTNAME) { if(strcasecmp(new_svcstatus->host_name, temp_svcstatus->host_name) > 0) return TRUE; else return FALSE; } else if(s_option == SORT_SERVICENAME) { if(strcasecmp(new_svcstatus->description, temp_svcstatus->description) > 0) return TRUE; else return FALSE; } else if(s_option == SORT_STATEDURATION) { if(new_svcstatus->last_state_change == (time_t)0) nt = (program_start > current_time) ? 0 : (current_time - program_start); else nt = (new_svcstatus->last_state_change > current_time) ? 0 : (current_time - new_svcstatus->last_state_change); if(temp_svcstatus->last_state_change == (time_t)0) tt = (program_start > current_time) ? 0 : (current_time - program_start); else tt = (temp_svcstatus->last_state_change > current_time) ? 0 : (current_time - temp_svcstatus->last_state_change); if(nt > tt) return TRUE; else return FALSE; } } return TRUE; } /* sorts the host list */ int sort_hosts(int s_type, int s_option) { hostsort *new_hostsort; hostsort *last_hostsort; hostsort *temp_hostsort; hoststatus *temp_hststatus; if(s_type == SORT_NONE) return ERROR; if(hoststatus_list == NULL) return ERROR; /* sort all hosts status entries */ for(temp_hststatus = hoststatus_list; temp_hststatus != NULL; temp_hststatus = temp_hststatus->next) { /* allocate memory for a new sort structure */ new_hostsort = (hostsort *)malloc(sizeof(hostsort)); if(new_hostsort == NULL) return ERROR; new_hostsort->hststatus = temp_hststatus; last_hostsort = hostsort_list; for(temp_hostsort = hostsort_list; temp_hostsort != NULL; temp_hostsort = temp_hostsort->next) { if(compare_hostsort_entries(s_type, s_option, new_hostsort, temp_hostsort) == TRUE) { new_hostsort->next = temp_hostsort; if(temp_hostsort == hostsort_list) hostsort_list = new_hostsort; else last_hostsort->next = new_hostsort; break; } else last_hostsort = temp_hostsort; } if(hostsort_list == NULL) { new_hostsort->next = NULL; hostsort_list = new_hostsort; } else if(temp_hostsort == NULL) { new_hostsort->next = NULL; last_hostsort->next = new_hostsort; } } return OK; } int compare_hostsort_entries(int s_type, int s_option, hostsort *new_hostsort, hostsort *temp_hostsort) { hoststatus *new_hststatus; hoststatus *temp_hststatus; time_t nt; time_t tt; new_hststatus = new_hostsort->hststatus; temp_hststatus = temp_hostsort->hststatus; if(s_type == SORT_ASCENDING) { if(s_option == SORT_LASTCHECKTIME) { if(new_hststatus->last_check < temp_hststatus->last_check) return TRUE; else return FALSE; } else if(s_option == SORT_HOSTSTATUS) { if(new_hststatus->status <= temp_hststatus->status) return TRUE; else return FALSE; } else if(s_option == SORT_HOSTURGENCY) { if(HOST_URGENCY(new_hststatus->status) <= HOST_URGENCY(temp_hststatus->status)) return TRUE; else return FALSE; } else if(s_option == SORT_HOSTNAME) { if(strcasecmp(new_hststatus->host_name, temp_hststatus->host_name) < 0) return TRUE; else return FALSE; } else if(s_option == SORT_STATEDURATION) { if(new_hststatus->last_state_change == (time_t)0) nt = (program_start > current_time) ? 0 : (current_time - program_start); else nt = (new_hststatus->last_state_change > current_time) ? 0 : (current_time - new_hststatus->last_state_change); if(temp_hststatus->last_state_change == (time_t)0) tt = (program_start > current_time) ? 0 : (current_time - program_start); else tt = (temp_hststatus->last_state_change > current_time) ? 0 : (current_time - temp_hststatus->last_state_change); if(nt < tt) return TRUE; else return FALSE; } } else { if(s_option == SORT_LASTCHECKTIME) { if(new_hststatus->last_check > temp_hststatus->last_check) return TRUE; else return FALSE; } else if(s_option == SORT_HOSTSTATUS) { if(new_hststatus->status > temp_hststatus->status) return TRUE; else return FALSE; } else if(s_option == SORT_HOSTURGENCY) { if(HOST_URGENCY(new_hststatus->status) > HOST_URGENCY(temp_hststatus->status)) return TRUE; else return FALSE; } else if(s_option == SORT_HOSTNAME) { if(strcasecmp(new_hststatus->host_name, temp_hststatus->host_name) > 0) return TRUE; else return FALSE; } else if(s_option == SORT_STATEDURATION) { if(new_hststatus->last_state_change == (time_t)0) nt = (program_start > current_time) ? 0 : (current_time - program_start); else nt = (new_hststatus->last_state_change > current_time) ? 0 : (current_time - new_hststatus->last_state_change); if(temp_hststatus->last_state_change == (time_t)0) tt = (program_start > current_time) ? 0 : (current_time - program_start); else tt = (temp_hststatus->last_state_change > current_time) ? 0 : (current_time - temp_hststatus->last_state_change); if(nt > tt) return TRUE; else return FALSE; } } return TRUE; } /* free all memory allocated to the servicesort structures */ void free_servicesort_list(void) { servicesort *this_servicesort; servicesort *next_servicesort; /* free memory for the servicesort list */ for(this_servicesort = servicesort_list; this_servicesort != NULL; this_servicesort = next_servicesort) { next_servicesort = this_servicesort->next; free(this_servicesort); } return; } /* free all memory allocated to the hostsort structures */ void free_hostsort_list(void) { hostsort *this_hostsort; hostsort *next_hostsort; /* free memory for the hostsort list */ for(this_hostsort = hostsort_list; this_hostsort != NULL; this_hostsort = next_hostsort) { next_hostsort = this_hostsort->next; free(this_hostsort); } return; } /* check host properties filter */ int passes_host_properties_filter(hoststatus *temp_hoststatus) { if((host_properties & HOST_SCHEDULED_DOWNTIME) && temp_hoststatus->scheduled_downtime_depth <= 0) return FALSE; if((host_properties & HOST_NO_SCHEDULED_DOWNTIME) && temp_hoststatus->scheduled_downtime_depth > 0) return FALSE; if((host_properties & HOST_STATE_ACKNOWLEDGED) && temp_hoststatus->problem_has_been_acknowledged == FALSE) return FALSE; if((host_properties & HOST_STATE_UNACKNOWLEDGED) && temp_hoststatus->problem_has_been_acknowledged == TRUE) return FALSE; if((host_properties & HOST_CHECKS_DISABLED) && temp_hoststatus->checks_enabled == TRUE) return FALSE; if((host_properties & HOST_CHECKS_ENABLED) && temp_hoststatus->checks_enabled == FALSE) return FALSE; if((host_properties & HOST_EVENT_HANDLER_DISABLED) && temp_hoststatus->event_handler_enabled == TRUE) return FALSE; if((host_properties & HOST_EVENT_HANDLER_ENABLED) && temp_hoststatus->event_handler_enabled == FALSE) return FALSE; if((host_properties & HOST_FLAP_DETECTION_DISABLED) && temp_hoststatus->flap_detection_enabled == TRUE) return FALSE; if((host_properties & HOST_FLAP_DETECTION_ENABLED) && temp_hoststatus->flap_detection_enabled == FALSE) return FALSE; if((host_properties & HOST_IS_FLAPPING) && temp_hoststatus->is_flapping == FALSE) return FALSE; if((host_properties & HOST_IS_NOT_FLAPPING) && temp_hoststatus->is_flapping == TRUE) return FALSE; if((host_properties & HOST_NOTIFICATIONS_DISABLED) && temp_hoststatus->notifications_enabled == TRUE) return FALSE; if((host_properties & HOST_NOTIFICATIONS_ENABLED) && temp_hoststatus->notifications_enabled == FALSE) return FALSE; if((host_properties & HOST_PASSIVE_CHECKS_DISABLED) && temp_hoststatus->accept_passive_checks == TRUE) return FALSE; if((host_properties & HOST_PASSIVE_CHECKS_ENABLED) && temp_hoststatus->accept_passive_checks == FALSE) return FALSE; if((host_properties & HOST_PASSIVE_CHECK) && temp_hoststatus->check_type == CHECK_TYPE_ACTIVE) return FALSE; if((host_properties & HOST_ACTIVE_CHECK) && temp_hoststatus->check_type == CHECK_TYPE_PASSIVE) return FALSE; if((host_properties & HOST_HARD_STATE) && temp_hoststatus->state_type == SOFT_STATE) return FALSE; if((host_properties & HOST_SOFT_STATE) && temp_hoststatus->state_type == HARD_STATE) return FALSE; return TRUE; } /* check service properties filter */ int passes_service_properties_filter(servicestatus *temp_servicestatus) { if((service_properties & SERVICE_SCHEDULED_DOWNTIME) && temp_servicestatus->scheduled_downtime_depth <= 0) return FALSE; if((service_properties & SERVICE_NO_SCHEDULED_DOWNTIME) && temp_servicestatus->scheduled_downtime_depth > 0) return FALSE; if((service_properties & SERVICE_STATE_ACKNOWLEDGED) && temp_servicestatus->problem_has_been_acknowledged == FALSE) return FALSE; if((service_properties & SERVICE_STATE_UNACKNOWLEDGED) && temp_servicestatus->problem_has_been_acknowledged == TRUE) return FALSE; if((service_properties & SERVICE_CHECKS_DISABLED) && temp_servicestatus->checks_enabled == TRUE) return FALSE; if((service_properties & SERVICE_CHECKS_ENABLED) && temp_servicestatus->checks_enabled == FALSE) return FALSE; if((service_properties & SERVICE_EVENT_HANDLER_DISABLED) && temp_servicestatus->event_handler_enabled == TRUE) return FALSE; if((service_properties & SERVICE_EVENT_HANDLER_ENABLED) && temp_servicestatus->event_handler_enabled == FALSE) return FALSE; if((service_properties & SERVICE_FLAP_DETECTION_DISABLED) && temp_servicestatus->flap_detection_enabled == TRUE) return FALSE; if((service_properties & SERVICE_FLAP_DETECTION_ENABLED) && temp_servicestatus->flap_detection_enabled == FALSE) return FALSE; if((service_properties & SERVICE_IS_FLAPPING) && temp_servicestatus->is_flapping == FALSE) return FALSE; if((service_properties & SERVICE_IS_NOT_FLAPPING) && temp_servicestatus->is_flapping == TRUE) return FALSE; if((service_properties & SERVICE_NOTIFICATIONS_DISABLED) && temp_servicestatus->notifications_enabled == TRUE) return FALSE; if((service_properties & SERVICE_NOTIFICATIONS_ENABLED) && temp_servicestatus->notifications_enabled == FALSE) return FALSE; if((service_properties & SERVICE_PASSIVE_CHECKS_DISABLED) && temp_servicestatus->accept_passive_checks == TRUE) return FALSE; if((service_properties & SERVICE_PASSIVE_CHECKS_ENABLED) && temp_servicestatus->accept_passive_checks == FALSE) return FALSE; if((service_properties & SERVICE_PASSIVE_CHECK) && temp_servicestatus->check_type == CHECK_TYPE_ACTIVE) return FALSE; if((service_properties & SERVICE_ACTIVE_CHECK) && temp_servicestatus->check_type == CHECK_TYPE_PASSIVE) return FALSE; if((service_properties & SERVICE_HARD_STATE) && temp_servicestatus->state_type == SOFT_STATE) return FALSE; if((service_properties & SERVICE_SOFT_STATE) && temp_servicestatus->state_type == HARD_STATE) return FALSE; return TRUE; } /* shows service and host filters in use */ void show_filters(void) { int found = 0; /* show filters box if necessary */ if(host_properties != 0L || service_properties != 0L || host_status_types != all_host_status_types || service_status_types != all_service_status_types) { printf("\n"); printf(""); printf("
    \n"); printf("\n"); printf(""); printf(""); printf(""); printf(""); printf(""); printf("\n"); printf(""); printf(""); printf(""); printf(""); printf("
    Display Filters:
    Host Status Types:"); if(host_status_types == all_host_status_types) printf("All"); else if(host_status_types == all_host_problems) printf("All problems"); else { found = 0; if(host_status_types & HOST_PENDING) { printf(" Pending"); found = 1; } if(host_status_types & SD_HOST_UP) { printf("%s Up", (found == 1) ? " |" : ""); found = 1; } if(host_status_types & SD_HOST_DOWN) { printf("%s Down", (found == 1) ? " |" : ""); found = 1; } if(host_status_types & SD_HOST_UNREACHABLE) printf("%s Unreachable", (found == 1) ? " |" : ""); } printf("
    Host Properties:"); if(host_properties == 0) printf("Any"); else { found = 0; if(host_properties & HOST_SCHEDULED_DOWNTIME) { printf(" In Scheduled Downtime"); found = 1; } if(host_properties & HOST_NO_SCHEDULED_DOWNTIME) { printf("%s Not In Scheduled Downtime", (found == 1) ? " &" : ""); found = 1; } if(host_properties & HOST_STATE_ACKNOWLEDGED) { printf("%s Has Been Acknowledged", (found == 1) ? " &" : ""); found = 1; } if(host_properties & HOST_STATE_UNACKNOWLEDGED) { printf("%s Has Not Been Acknowledged", (found == 1) ? " &" : ""); found = 1; } if(host_properties & HOST_CHECKS_DISABLED) { printf("%s Checks Disabled", (found == 1) ? " &" : ""); found = 1; } if(host_properties & HOST_CHECKS_ENABLED) { printf("%s Checks Enabled", (found == 1) ? " &" : ""); found = 1; } if(host_properties & HOST_EVENT_HANDLER_DISABLED) { printf("%s Event Handler Disabled", (found == 1) ? " &" : ""); found = 1; } if(host_properties & HOST_EVENT_HANDLER_ENABLED) { printf("%s Event Handler Enabled", (found == 1) ? " &" : ""); found = 1; } if(host_properties & HOST_FLAP_DETECTION_DISABLED) { printf("%s Flap Detection Disabled", (found == 1) ? " &" : ""); found = 1; } if(host_properties & HOST_FLAP_DETECTION_ENABLED) { printf("%s Flap Detection Enabled", (found == 1) ? " &" : ""); found = 1; } if(host_properties & HOST_IS_FLAPPING) { printf("%s Is Flapping", (found == 1) ? " &" : ""); found = 1; } if(host_properties & HOST_IS_NOT_FLAPPING) { printf("%s Is Not Flapping", (found == 1) ? " &" : ""); found = 1; } if(host_properties & HOST_NOTIFICATIONS_DISABLED) { printf("%s Notifications Disabled", (found == 1) ? " &" : ""); found = 1; } if(host_properties & HOST_NOTIFICATIONS_ENABLED) { printf("%s Notifications Enabled", (found == 1) ? " &" : ""); found = 1; } if(host_properties & HOST_PASSIVE_CHECKS_DISABLED) { printf("%s Passive Checks Disabled", (found == 1) ? " &" : ""); found = 1; } if(host_properties & HOST_PASSIVE_CHECKS_ENABLED) { printf("%s Passive Checks Enabled", (found == 1) ? " &" : ""); found = 1; } if(host_properties & HOST_PASSIVE_CHECK) { printf("%s Passive Checks", (found == 1) ? " &" : ""); found = 1; } if(host_properties & HOST_ACTIVE_CHECK) { printf("%s Active Checks", (found == 1) ? " &" : ""); found = 1; } if(host_properties & HOST_HARD_STATE) { printf("%s In Hard State", (found == 1) ? " &" : ""); found = 1; } if(host_properties & HOST_SOFT_STATE) { printf("%s In Soft State", (found == 1) ? " &" : ""); found = 1; } } printf("
    Service Status Types:"); if(service_status_types == all_service_status_types) printf("All"); else if(service_status_types == all_service_problems) printf("All Problems"); else { found = 0; if(service_status_types & SERVICE_PENDING) { printf(" Pending"); found = 1; } if(service_status_types & SERVICE_OK) { printf("%s Ok", (found == 1) ? " |" : ""); found = 1; } if(service_status_types & SERVICE_UNKNOWN) { printf("%s Unknown", (found == 1) ? " |" : ""); found = 1; } if(service_status_types & SERVICE_WARNING) { printf("%s Warning", (found == 1) ? " |" : ""); found = 1; } if(service_status_types & SERVICE_CRITICAL) { printf("%s Critical", (found == 1) ? " |" : ""); found = 1; } } printf("
    Service Properties:"); if(service_properties == 0) printf("Any"); else { found = 0; if(service_properties & SERVICE_SCHEDULED_DOWNTIME) { printf(" In Scheduled Downtime"); found = 1; } if(service_properties & SERVICE_NO_SCHEDULED_DOWNTIME) { printf("%s Not In Scheduled Downtime", (found == 1) ? " &" : ""); found = 1; } if(service_properties & SERVICE_STATE_ACKNOWLEDGED) { printf("%s Has Been Acknowledged", (found == 1) ? " &" : ""); found = 1; } if(service_properties & SERVICE_STATE_UNACKNOWLEDGED) { printf("%s Has Not Been Acknowledged", (found == 1) ? " &" : ""); found = 1; } if(service_properties & SERVICE_CHECKS_DISABLED) { printf("%s Active Checks Disabled", (found == 1) ? " &" : ""); found = 1; } if(service_properties & SERVICE_CHECKS_ENABLED) { printf("%s Active Checks Enabled", (found == 1) ? " &" : ""); found = 1; } if(service_properties & SERVICE_EVENT_HANDLER_DISABLED) { printf("%s Event Handler Disabled", (found == 1) ? " &" : ""); found = 1; } if(service_properties & SERVICE_EVENT_HANDLER_ENABLED) { printf("%s Event Handler Enabled", (found == 1) ? " &" : ""); found = 1; } if(service_properties & SERVICE_FLAP_DETECTION_DISABLED) { printf("%s Flap Detection Disabled", (found == 1) ? " &" : ""); found = 1; } if(service_properties & SERVICE_FLAP_DETECTION_ENABLED) { printf("%s Flap Detection Enabled", (found == 1) ? " &" : ""); found = 1; } if(service_properties & SERVICE_IS_FLAPPING) { printf("%s Is Flapping", (found == 1) ? " &" : ""); found = 1; } if(service_properties & SERVICE_IS_NOT_FLAPPING) { printf("%s Is Not Flapping", (found == 1) ? " &" : ""); found = 1; } if(service_properties & SERVICE_NOTIFICATIONS_DISABLED) { printf("%s Notifications Disabled", (found == 1) ? " &" : ""); found = 1; } if(service_properties & SERVICE_NOTIFICATIONS_ENABLED) { printf("%s Notifications Enabled", (found == 1) ? " &" : ""); found = 1; } if(service_properties & SERVICE_PASSIVE_CHECKS_DISABLED) { printf("%s Passive Checks Disabled", (found == 1) ? " &" : ""); found = 1; } if(service_properties & SERVICE_PASSIVE_CHECKS_ENABLED) { printf("%s Passive Checks Enabled", (found == 1) ? " &" : ""); found = 1; } if(service_properties & SERVICE_PASSIVE_CHECK) { printf("%s Passive Checks", (found == 1) ? " &" : ""); found = 1; } if(service_properties & SERVICE_ACTIVE_CHECK) { printf("%s Active Checks", (found == 1) ? " &" : ""); found = 1; } if(service_properties & SERVICE_HARD_STATE) { printf("%s In Hard State", (found == 1) ? " &" : ""); found = 1; } if(service_properties & SERVICE_SOFT_STATE) { printf("%s In Soft State", (found == 1) ? " &" : ""); found = 1; } } printf("
    \n"); printf("
    \n"); } return; } void create_pagenumbers(int total_entries,char *temp_url,int type_service) { int pages = 1; int tmp_start; int i, last_page; int previous_page; /* do page numbers if applicable */ if(result_limit > 0 && total_entries > result_limit) { pages = (total_entries / result_limit); last_page = pages; if (total_entries % result_limit > 0) ++last_page; previous_page = (page_start-result_limit) > 0 ? (page_start-result_limit) : 0; printf("
    \n"); printf("
    \n"); printf("<<\n",temp_url,result_limit,url_images_path,FIRST_PAGE_ICON); printf("<\n",temp_url,previous_page,result_limit,url_images_path,PREVIOUS_PAGE_ICON); for(i = 0; i < last_page; i++) { tmp_start = (i * result_limit); if(tmp_start == page_start) printf("
    %i
    \n",(i+1)); else printf(" %i \n",temp_url,tmp_start,result_limit,(i+1),(i+1)); } printf(">\n",temp_url,(page_start+result_limit),result_limit,url_images_path,NEXT_PAGE_ICON); printf(">>\n",temp_url,((pages)*result_limit),result_limit,url_images_path,LAST_PAGE_ICON); printf("
    \n"); if(type_service == TRUE) printf("
    Results %i - %i of %d Matching Services
    \n
    \n",page_start,((page_start+result_limit) > total_entries ? total_entries :(page_start+result_limit) ),total_entries ); else printf("
    Results %i - %i of %d Matching Hosts
    \n\n",page_start,((page_start+result_limit) > total_entries ? total_entries :(page_start+result_limit) ),total_entries ); printf(" \n\n"); } else { if(type_service == TRUE) printf("
    Results %i - %i of %d Matching Services
    \n\n",1,total_entries,total_entries); else printf("
    Results %i - %i of %d Matching Hosts
    \n\n",1,total_entries,total_entries); } /* show total results displayed */ //printf("
    Results %i - %i of %d Matching Services
    \n\n",page_start,((page_start+result_limit) > total_entries ? total_entries :(page_start+result_limit) ),total_entries ); } void create_page_limiter(int limit,char *temp_url) { /* Result Limit Select Box */ printf("
    \n
    \n"); printf("\n"); printf("
    \n"); printf("
    \n
    \n"); //page numbers } nagios-4.3.4/cgi/statusjson.c000066400000000000000000005161501314764422400161440ustar00rootroot00000000000000/************************************************************************** * * STATUSJSON.C - Nagios CGI for returning JSON-formatted status data * * Copyright (c) 2013 Nagios Enterprises, LLC * Last Modified: 04-13-2013 * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *************************************************************************/ /* TODO: Return an error when the authenticated user is not authorized for the requested host or service Consolidate criteria functions for *count and *list queries Move static programstatus information to objectjson.c? */ #include "../include/config.h" #include "../include/common.h" #include "../include/objects.h" #include "../include/statusdata.h" #include "../include/comments.h" #include "../include/downtime.h" #include "../include/cgiutils.h" #include "../include/getcgi.h" #include "../include/cgiauth.h" #include "../include/jsonutils.h" #include "../include/objectjson.h" #include "../include/statusjson.h" #define THISCGI "statusjson.cgi" #ifdef JSON_NAGIOS_4X #define HOST_STATUS_ALL (SD_HOST_UP | SD_HOST_DOWN | SD_HOST_UNREACHABLE | HOST_PENDING) #define SERVICE_STATUS_ALL (SERVICE_OK | SERVICE_WARNING | SERVICE_CRITICAL | SERVICE_UNKNOWN | SERVICE_PENDING) #else #define HOST_STATUS_ALL (HOST_UP | HOST_DOWN | HOST_UNREACHABLE | HOST_PENDING) #define SERVICE_STATUS_ALL (SERVICE_OK | SERVICE_WARNING | SERVICE_CRITICAL | SERVICE_UNKNOWN | SERVICE_PENDING) #endif extern char main_config_file[MAX_FILENAME_LENGTH]; extern char *status_file; extern host *host_list; extern hoststatus *hoststatus_list; extern service *service_list; #if 0 extern contact *contact_list; #endif extern servicestatus *servicestatus_list; extern nagios_comment *comment_list; extern scheduled_downtime *scheduled_downtime_list; /* Program status variables */ extern unsigned long modified_host_process_attributes; extern unsigned long modified_service_process_attributes; extern int nagios_pid; extern int daemon_mode; extern time_t program_start; #ifndef JSON_NAGIOS_4X extern time_t last_command_check; #endif extern time_t last_log_rotation; extern int enable_notifications; extern int execute_service_checks; extern int accept_passive_service_checks; extern int execute_host_checks; extern int accept_passive_host_checks; extern int enable_event_handlers; extern int obsess_over_services; extern int obsess_over_hosts; extern int check_service_freshness; extern int check_host_freshness; extern int enable_flap_detection; #ifndef JSON_NAGIOS_4X extern int enable_failure_prediction; #endif extern int process_performance_data; #if 0 extern char *global_host_event_handler; extern char *global_service_event_handler; extern unsigned long next_comment_id; extern unsigned long next_downtime_id; extern unsigned long next_event_id; extern unsigned long next_problem_id; extern unsigned long next_notification_id; extern int external_command_buffer_slots; extern check_stats check_statistics[MAX_CHECK_STATS_TYPES]; #endif /* Performance data variables */ extern int program_stats[MAX_CHECK_STATS_TYPES][3]; extern int buffer_stats[1][3]; void document_header(int); void document_footer(void); void init_cgi_data(status_json_cgi_data *); int process_cgivars(json_object *, status_json_cgi_data *, time_t); void free_cgi_data(status_json_cgi_data *); int validate_arguments(json_object *, status_json_cgi_data *, time_t); authdata current_authdata; const string_value_mapping valid_queries[] = { { "hostcount", STATUS_QUERY_HOSTCOUNT, "Return the number of hosts in each state" }, { "hostlist", STATUS_QUERY_HOSTLIST, "Return a list of hosts and their current status" }, { "host", STATUS_QUERY_HOST, "Return the status of a single host." }, { "servicecount", STATUS_QUERY_SERVICECOUNT, "Return the number of services in each state" }, { "servicelist", STATUS_QUERY_SERVICELIST, "Return a list of services and their current status" }, { "service", STATUS_QUERY_SERVICE, "Return the status of a single service" }, #if 0 { "contactcount", STATUS_QUERY_CONTACTCOUNT, "Return the number of contacts" }, { "contactlist", STATUS_QUERY_CONTACTLIST, "Return a list of of contacts and their current status" }, { "contact", STATUS_QUERY_CONTACT, "Return a single contact" }, #endif { "commentcount", STATUS_QUERY_COMMENTCOUNT, "Return the number of comments" }, { "commentlist", STATUS_QUERY_COMMENTLIST, "Return a list of comments" }, { "comment", STATUS_QUERY_COMMENT, "Return a single comment" }, { "downtimecount", STATUS_QUERY_DOWNTIMECOUNT, "Return the number of downtimes" }, { "downtimelist", STATUS_QUERY_DOWNTIMELIST, "Return a list of downtimes" }, { "downtime", STATUS_QUERY_DOWNTIME, "Return a single downtime" }, { "programstatus", STATUS_QUERY_PROGRAMSTATUS, "Return the Nagios Core program status" }, { "performancedata", STATUS_QUERY_PERFORMANCEDATA, "Return the Nagios Core performance data" }, { "help", STATUS_QUERY_HELP, "Display help for this CGI" }, { NULL, -1, NULL}, }; static const int query_status[][2] = { { STATUS_QUERY_HOSTCOUNT, QUERY_STATUS_RELEASED }, { STATUS_QUERY_HOSTLIST, QUERY_STATUS_RELEASED }, { STATUS_QUERY_HOST, QUERY_STATUS_RELEASED }, { STATUS_QUERY_SERVICECOUNT, QUERY_STATUS_RELEASED }, { STATUS_QUERY_SERVICELIST, QUERY_STATUS_RELEASED }, { STATUS_QUERY_SERVICE, QUERY_STATUS_RELEASED }, #if 0 { STATUS_QUERY_CONTACTCOUNT, QUERY_STATUS_BETA }, { STATUS_QUERY_CONTACTLIST, QUERY_STATUS_BETA }, { STATUS_QUERY_CONTACT, QUERY_STATUS_BETA }, #endif { STATUS_QUERY_COMMENTCOUNT, QUERY_STATUS_RELEASED }, { STATUS_QUERY_COMMENTLIST, QUERY_STATUS_RELEASED }, { STATUS_QUERY_COMMENT, QUERY_STATUS_RELEASED }, { STATUS_QUERY_DOWNTIMECOUNT, QUERY_STATUS_RELEASED }, { STATUS_QUERY_DOWNTIMELIST, QUERY_STATUS_RELEASED }, { STATUS_QUERY_DOWNTIME, QUERY_STATUS_RELEASED }, { STATUS_QUERY_PROGRAMSTATUS, QUERY_STATUS_RELEASED }, { STATUS_QUERY_PERFORMANCEDATA, QUERY_STATUS_RELEASED }, { STATUS_QUERY_HELP, QUERY_STATUS_RELEASED }, { -1, -1}, }; const string_value_mapping svm_host_time_fields[] = { { "lastupdate", STATUS_TIME_LAST_UPDATE, "Last Update" }, { "lastcheck", STATUS_TIME_LAST_CHECK, "Last Check" }, { "nextcheck", STATUS_TIME_NEXT_CHECK, "Next Check" }, { "laststatechange", STATUS_TIME_LAST_STATE_CHANGE, "Last State Change" }, { "lasthardstatechange", STATUS_TIME_LAST_HARD_STATE_CHANGE, "Last Hard State Change" }, { "lasttimeup", STATUS_TIME_LAST_TIME_UP, "Last Time Up" }, { "lasttimedown", STATUS_TIME_LAST_TIME_DOWN, "Last Time Down" }, { "lasttimeunreachable", STATUS_TIME_LAST_TIME_UNREACHABLE, "Last Time Unreachable" }, { "lastnotification", STATUS_TIME_LAST_NOTIFICATION, "Last Notification" }, { "nextnotification", STATUS_TIME_NEXT_NOTIFICATION, "Next Notification" }, { NULL, -1, NULL }, }; const string_value_mapping svm_service_time_fields[] = { { "lastupdate", STATUS_TIME_LAST_UPDATE, "Last Update" }, { "lastcheck", STATUS_TIME_LAST_CHECK, "Last Check" }, { "nextcheck", STATUS_TIME_NEXT_CHECK, "Next Check" }, { "laststatechange", STATUS_TIME_LAST_STATE_CHANGE, "Last State Change" }, { "lasthardstatechange", STATUS_TIME_LAST_HARD_STATE_CHANGE, "Last Hard State Change" }, { "lasttimeok", STATUS_TIME_LAST_TIME_OK, "Last Time OK" }, { "lasttimewarning", STATUS_TIME_LAST_TIME_WARNING, "Last Time Warning" }, { "lasttimecritical", STATUS_TIME_LAST_TIME_CRITICAL, "Last Time Critical" }, { "lasttimeunknown", STATUS_TIME_LAST_TIME_UNKNOWN, "Last Time Unknown" }, { "lastnotification", STATUS_TIME_LAST_NOTIFICATION, "Last Notification" }, { "nextnotification", STATUS_TIME_NEXT_NOTIFICATION, "Next Notification" }, { NULL, -1, NULL }, }; const string_value_mapping svm_valid_comment_types[] = { { "host", COMMENT_TYPE_HOST, "Host Comment" }, { "service", COMMENT_TYPE_SERVICE, "Service Comment" }, { NULL, -1, NULL }, }; const string_value_mapping svm_valid_comment_entry_types[] = { { "user", COMMENT_ENTRY_USER, "User Comment" }, { "downtime", COMMENT_ENTRY_DOWNTIME, "Downtime Comment" }, { "flapping", COMMENT_ENTRY_FLAPPING, "Flapping Comment" }, { "acknowledgement", COMMENT_ENTRY_ACKNOWLEDGEMENT, "Acknowledgement Comment" }, { NULL, -1, NULL }, }; const string_value_mapping svm_valid_persistence[] = { { "yes", BOOLEAN_TRUE, "Persistent Comment" }, { "no", BOOLEAN_FALSE, "Non-Persistent Comment" }, { NULL, -1, NULL }, }; const string_value_mapping svm_valid_expiration[] = { { "yes", BOOLEAN_TRUE, "Comment Expires" }, { "no", BOOLEAN_FALSE, "Comment Does Not Expire" }, { NULL, -1, NULL }, }; const string_value_mapping svm_comment_time_fields[] = { { "entrytime", STATUS_TIME_ENTRY_TIME, "Entry Time" }, { "expiretime", STATUS_TIME_EXPIRE_TIME, "Expiration Time" }, { NULL, -1, NULL }, }; const string_value_mapping svm_downtime_time_fields[] = { { "entrytime", STATUS_TIME_ENTRY_TIME, "Entry Time" }, { "starttime", STATUS_TIME_START_TIME, "Start Time" }, { "flexdowntimestart", STATUS_TIME_FLEX_DOWNTIME_START, "Flex Downtime Start" }, { "endtime", STATUS_TIME_END_TIME, "End Time" }, { NULL, -1, NULL }, }; const string_value_mapping svm_valid_downtime_object_types[] = { { "host", DOWNTIME_OBJECT_TYPE_HOST, "Host Downtime" }, { "service", DOWNTIME_OBJECT_TYPE_SERVICE, "Service Downtime" }, { NULL, -1, NULL }, }; const string_value_mapping svm_valid_downtime_types[] = { { "fixed", DOWNTIME_TYPE_FIXED, "Fixed Downtime" }, { "flexible", DOWNTIME_TYPE_FLEXIBLE, "Flexible Downtime" }, { NULL, -1, NULL }, }; const string_value_mapping svm_valid_triggered_status[] = { { "yes", BOOLEAN_TRUE, "Downtime Triggered" }, { "no", BOOLEAN_FALSE, "Downtime Not Triggered" }, { NULL, -1, NULL }, }; const string_value_mapping svm_valid_in_effect_status[] = { { "yes", BOOLEAN_TRUE, "Downtime In Effect" }, { "no", BOOLEAN_FALSE, "Downtime Not In Effect" }, { NULL, -1, NULL }, }; option_help status_json_help[] = { { "query", "Query", "enumeration", { "all", NULL }, { NULL }, NULL, "Specifies the type of query to be executed.", valid_queries }, { "formatoptions", "Format Options", "list", { NULL }, { "all", NULL }, NULL, "Specifies the formatting options to be used when displaying the results. Multiple options are allowed and are separated by a plus (+) sign..", svm_format_options }, { "start", "Start", "integer", { NULL }, { "hostlist", "servicelist", NULL }, NULL, "Specifies the index (zero-based) of the first object in the list to be returned.", NULL }, { "count", "Count", "integer", { NULL }, { "hostlist", "servicelist", NULL }, NULL, "Specifies the number of objects in the list to be returned.", NULL }, { "parenthost", "Parent Host", "nagios:objectjson/hostlist", { NULL }, { "hostcount", "hostlist", "servicecount", "servicelist", NULL }, NULL, "Limits the hosts or services returned to those whose host parent is specified. A value of 'none' returns all hosts or services reachable directly by the Nagios core host.", parent_host_extras }, { "childhost", "Child Host", "nagios:objectjson/hostlist", { NULL }, { "hostcount", "hostlist", "servicecount", "servicelist", NULL }, NULL, "Limits the hosts or services returned to those whose having the host specified as a child host. A value of 'none' returns all hosts or services with no child hosts.", child_host_extras }, { "details", "Show Details", "boolean", { NULL }, { "hostlist", "servicelist", "commentlist", "downtimelist", NULL }, NULL, "Returns the details for all entities in the list.", NULL }, { "dateformat", "Date Format", "string", { NULL }, { "all", NULL }, NULL, "strftime format string for values of type time_t. In the absence of a format, the Javascript default format of the number of milliseconds since the beginning of the Unix epoch is used. Because of URL encoding, percent signs must be encoded as %25 and a space must be encoded as a plus (+) sign.", NULL }, { "hostname", "Host Name", "nagios:objectjson/hostlist", { "host", "service", NULL }, { "servicecount", "servicelist", "commentcount", "commentlist", "downtimecount", "downtimelist", NULL }, NULL, "Name for the host requested.", NULL }, { "hostgroup", "Host Group", "nagios:objectjson/hostgrouplist", { "hostgroup", NULL }, { "hostcount", "hostlist", "servicecount", "servicelist", NULL }, NULL, "Returns information applicable to the hostgroup or the hosts in the hostgroup depending on the query.", NULL }, { "hoststatus", "Host Status", "list", { NULL }, { "hostcount", "hostlist", "servicecount", "servicelist", NULL }, NULL, "Limits returned information to those hosts whose status matches this list. Host statuses are space separated.", svm_host_statuses }, { "servicegroup", "Service Group", "nagios:objectjson/servicegrouplist", { "servicegroup", NULL }, { "servicecount", "servicelist", NULL }, NULL, "Returns information applicable to the servicegroup or the services in the servicegroup depending on the query.", NULL }, { "servicestatus", "Service Status", "list", { NULL }, { "servicecount", "servicelist" }, NULL, "Limits returned information to those services whose status matches this list. Service statuses are space separated.", svm_service_statuses }, { "parentservice", "Parent Service", "nagios:objectjson/servicelist", { NULL }, { "servicecount", "servicelist", NULL }, NULL, "Limits the services returned to those whose service parent has the name specified. A value of 'none' returns all services with no service parent.", parent_service_extras }, { "childservice", "Child Service", "nagios:objectjson/servicelist", { NULL }, { "servicecount", "servicelist", NULL }, NULL, "Limits the services returned to those whose having the named service as a child service. A value of 'none' returns all services with no child services.", child_service_extras }, { "contactgroup", "Contact Group", "nagios:objectjson/contactgrouplist", { "contactgroup", NULL }, { "hostcount", "hostlist", "servicecount", "servicelist", NULL }, NULL, "Returns information applicable to the contactgroup or the contacts in the contactgroup depending on the query.", NULL }, { "servicedescription", "Service Description", "nagios:objectjson/servicelist", /* "for query: 'service'",*/ { "service", NULL }, { "servicecount", "servicelist", "commentcount", "commentlist", "downtimecount", "downtimelist", NULL }, "hostname", "Description for the service requested.", NULL }, { "checktimeperiod", "Check Timeperiod Name", "nagios:objectjson/timeperiodlist", { NULL }, { "hostcount","hostlist", "servicecount", "servicelist", NULL }, NULL, "Name of a check timeperiod to be used as selection criteria.", NULL }, { "hostnotificationtimeperiod", "Host Notification Timeperiod Name", "nagios:objectjson/timeperiodlist", { NULL }, { "hostcount","hostlist", NULL }, NULL, "Name of a host notification timeperiod to be used as selection criteria.", NULL }, { "servicenotificationtimeperiod", "Service Notification Timeperiod Name", "nagios:objectjson/timeperiodlist", { NULL }, { "servicecount", "servicelist", NULL }, NULL, "Name of a service notification timeperiod to be used as selection criteria.", NULL }, { "checkcommand", "Check Command Name", "nagios:objectjson/commandlist", { NULL }, { "hostcount", "hostlist", "servicecount", "servicelist", NULL }, NULL, "Name of a check command to be be used as a selector.", NULL }, { "eventhandler", "Event Handler Name", "nagios:objectjson/commandlist", { NULL }, { "hostcount", "hostlist", "servicecount", "servicelist", NULL }, NULL, "Name of an event handler to be be used as a selector.", NULL }, { "commenttypes", "Comment Type", "list", { NULL }, { "commentcount", "commentlist", NULL }, NULL, "Comment type for the comment requested.", svm_valid_comment_types }, { "entrytypes", "Entry Type", "list", { NULL }, { "commentcount", "commentlist", NULL }, NULL, "Entry type for the comment requested.", svm_valid_comment_entry_types }, { "persistence", "Comment Persistence", "list", { NULL }, { "commentcount", "commentlist", NULL }, NULL, "Persistence for the comment requested.", svm_valid_persistence }, { "expiring", "Comment Expiration", "list", { NULL }, { "commentcount", "commentlist", NULL }, NULL, "Whether or not the comment expires.", svm_valid_expiration }, { "downtimeobjecttypes", "Downtime Object Type", "list", { NULL }, { "downtimecount", "downtimelist", NULL }, NULL, "The type of object to which the downtime applies.", svm_valid_downtime_object_types }, { "downtimetypes", "Downtime Type", "list", { NULL }, { "downtimecount", "downtimelist", NULL }, NULL, "The type of the downtime.", svm_valid_downtime_types }, { "triggered", "Downtime Triggered", "list", { NULL }, { "downtimecount", "downtimelist", NULL }, NULL, "Whether or not the downtime is triggered.", svm_valid_triggered_status }, { "triggeredby", "Triggered By", "nagios:statusjson/downtimelist", { NULL }, { "downtimecount", "downtimelist", NULL }, NULL, "ID of the downtime which triggers other downtimes.", NULL }, { "ineffect", "Downtime In Effect", "list", { NULL }, { "downtimecount", "downtimelist", NULL }, NULL, "Whether or not the downtime is in effect.", svm_valid_in_effect_status }, { "commentid", "Comment ID", "nagios:statusjson/commentlist", { "comment", NULL }, { NULL }, NULL, "Comment ID for the comment requested.", NULL }, { "downtimeid", "Downtime ID", "nagios:statusjson/downtimelist", { "downtime", NULL }, { NULL }, NULL, "Downtime ID for the downtime requested.", NULL }, { "contactname", "Contact Name", "nagios:objectjson/contactlist", { NULL }, { "hostcount", "hostlist", "servicecount", "servicelist", NULL }, NULL, "Name for the contact requested.", NULL }, { "hosttimefield", "Host Time Field", "enumeration", { NULL }, { "hostcount", "hostlist", NULL }, NULL, "Field to use when comparing times on a hostlist query.", svm_host_time_fields }, { "servicetimefield", "Service Time Field", "enumeration", { NULL }, { "servicecount", "servicelist", NULL }, NULL, "Field to use when comparing times on a servicelist query.", svm_service_time_fields }, { "commenttimefield", "Comment Time Field", "enumeration", { NULL }, { "commentcount", "commentlist", NULL }, NULL, "Field to use when comparing times on a commentlist query.", svm_comment_time_fields }, { "downtimetimefield", "Downtime Time Field", "enumeration", { NULL }, { "downtimecount", "downtimelist", NULL }, NULL, "Field to use when comparing times on a downtimelist query.", svm_downtime_time_fields }, { "starttime", "Start Time", "integer", { NULL }, { "hostcount", "hostlist", "servicecount", "servicelist", "commentcount", "commentlist", "downtimecount", "downtimelist", NULL }, NULL, "Starting time to use when querying based on a time range. Not specifying a start time implies all entries since the beginning of time. Supplying a plus or minus sign means times relative to the query time.", NULL, }, { "endtime", "End Time", "integer", { NULL }, { "hostcount", "hostlist", "servicecount", "servicelist", "commentcount", "commentlist", "downtimecount", "downtimelist", NULL }, NULL, "Ending time to use when querying based on a time range. Not specifying an end time implies all entries until the time of the query. Specifying plus or minus sign means times relative to the query time.", NULL, }, { /* The last entry must contain all NULL entries */ NULL, NULL, NULL, { NULL }, { NULL }, NULL, NULL, NULL }, }; extern const json_escape percent_escapes; int json_status_host_passes_selection(host *, int, host *, int, host *, hostgroup *, contact *, hoststatus *, int, time_t, time_t, contactgroup *, timeperiod *, timeperiod *, command *, command *); json_object *json_status_host_display_selectors(unsigned, int, int, int, host *, int, host *, hostgroup *, int, contact *, int, time_t, time_t, contactgroup *, timeperiod *, timeperiod *, command *, command *); int json_status_service_passes_host_selection(host *, int, host *, int, host *, hostgroup *, host *, int); int json_status_service_passes_service_selection(service *, servicegroup *, contact *, servicestatus *, int, time_t, time_t, char *, char *, char *, contactgroup *, timeperiod *, timeperiod *, command *, command *); json_object *json_status_service_selectors(unsigned, int, int, int, host *, int, host *, hostgroup *, host *, servicegroup *, int, int, contact *, int, time_t, time_t, char *, char *, char *, contactgroup *, timeperiod *, timeperiod *, command *, command *); int json_status_comment_passes_selection(nagios_comment *, int, time_t, time_t, unsigned, unsigned, unsigned, unsigned, char *, char *); json_object *json_status_comment_selectors(unsigned, int, int, int, time_t, time_t, unsigned, unsigned, unsigned, unsigned, char *, char *); int json_status_downtime_passes_selection(scheduled_downtime *, int, time_t, time_t, unsigned, unsigned, unsigned, int, unsigned, char *, char *); json_object *json_status_downtime_selectors(unsigned, int, int, int, time_t, time_t, unsigned, unsigned, unsigned, int, unsigned, char *, char *); int main(void) { int result = OK; time_t query_time; status_json_cgi_data cgi_data; json_object *json_root; struct stat sdstat; time_t last_status_data_update = (time_t)0; hoststatus *temp_hoststatus = NULL; servicestatus *temp_servicestatus = NULL; /* The official time of the query */ time(&query_time); json_root = json_new_object(); if(NULL == json_root) { printf( "Failed to create new json object\n"); exit( 1); } json_object_append_integer(json_root, "format_version", OUTPUT_FORMAT_VERSION); /* Initialize shared configuration variables */ init_shared_cfg_vars(1); init_cgi_data(&cgi_data); document_header(cgi_data.format_options & JSON_FORMAT_WHITESPACE); /* get the arguments passed in the URL */ result = process_cgivars(json_root, &cgi_data, query_time); if(result != RESULT_SUCCESS) { json_object_append_object(json_root, "data", json_help(status_json_help)); json_object_print(json_root, 0, 1, cgi_data.strftime_format, cgi_data.format_options); document_footer(); return ERROR; } /* reset internal variables */ reset_cgi_vars(); /* read the CGI configuration file */ result = read_cgi_config_file(get_cgi_config_location()); if(result == ERROR) { json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), (time_t)-1, NULL, RESULT_FILE_OPEN_READ_ERROR, "Error: Could not open CGI configuration file '%s' for reading!", get_cgi_config_location())); json_object_append_object(json_root, "data", json_help(status_json_help)); json_object_print(json_root, 0, 1, cgi_data.strftime_format, cgi_data.format_options); document_footer(); return ERROR; } /* read the main configuration file */ result = read_main_config_file(main_config_file); if(result == ERROR) { json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), (time_t)-1, NULL, RESULT_FILE_OPEN_READ_ERROR, "Error: Could not open main configuration file '%s' for reading!", main_config_file)); json_object_append_object(json_root, "data", json_help(status_json_help)); json_object_print(json_root, 0, 1, cgi_data.strftime_format, cgi_data.format_options); document_footer(); return ERROR; } /* read all object configuration data */ result = read_all_object_configuration_data(main_config_file, READ_ALL_OBJECT_DATA); if(result == ERROR) { json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), (time_t)-1, NULL, RESULT_FILE_OPEN_READ_ERROR, "Error: Could not read some or all object configuration data!")); json_object_append_object(json_root, "data", json_help(status_json_help)); json_object_print(json_root, 0, 1, cgi_data.strftime_format, cgi_data.format_options); document_footer(); return ERROR; } /* Get the update time on the status data file. This needs to occur before the status data is read because the read_all_status_data() function clears the name of the status file */ if(stat(status_file, &sdstat) < 0) { json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), (time_t)-1, NULL, RESULT_FILE_OPEN_READ_ERROR, "Error: Could not obtain status data file status: %s!", strerror(errno))); json_object_append_object(json_root, "data", json_help(status_json_help)); document_footer(); return ERROR; } last_status_data_update = sdstat.st_mtime; /* read all status data */ result = read_all_status_data(status_file, READ_ALL_STATUS_DATA); if(result == ERROR) { json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), (time_t)-1, NULL, RESULT_FILE_OPEN_READ_ERROR, "Error: Could not read host and service status information!")); json_object_append_object(json_root, "data", json_help(status_json_help)); json_object_print(json_root, 0, 1, cgi_data.strftime_format, cgi_data.format_options); document_footer(); return ERROR; } /* validate arguments in URL */ result = validate_arguments(json_root, &cgi_data, query_time); if(result != RESULT_SUCCESS) { json_object_append_object(json_root, "data", json_help(status_json_help)); json_object_print(json_root, 0, 1, cgi_data.strftime_format, cgi_data.format_options); document_footer(); return ERROR; } /* get authentication information */ get_authentication_information(¤t_authdata); /* For most locales, floats get output with a comma instead of a * decimal point, which messes up the JSON data structure. */ setlocale(LC_NUMERIC, "C"); /* Return something to the user */ switch( cgi_data.query) { case STATUS_QUERY_HOSTCOUNT: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_status_data_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_status_hostcount(cgi_data.format_options, cgi_data.use_parent_host, cgi_data.parent_host, cgi_data.use_child_host, cgi_data.child_host, cgi_data.hostgroup, cgi_data.host_statuses, cgi_data.contact, cgi_data.host_time_field, cgi_data.start_time, cgi_data.end_time, cgi_data.contactgroup, cgi_data.check_timeperiod, cgi_data.host_notification_timeperiod, cgi_data.check_command, cgi_data.event_handler)); break; case STATUS_QUERY_HOSTLIST: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_status_data_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_status_hostlist(cgi_data.format_options, cgi_data.start, cgi_data.count, cgi_data.details, cgi_data.use_parent_host, cgi_data.parent_host, cgi_data.use_child_host, cgi_data.child_host, cgi_data.hostgroup, cgi_data.host_statuses, cgi_data.contact, cgi_data.host_time_field, cgi_data.start_time, cgi_data.end_time, cgi_data.contactgroup, cgi_data.check_timeperiod, cgi_data.host_notification_timeperiod, cgi_data.check_command, cgi_data.event_handler)); break; case STATUS_QUERY_HOST: temp_hoststatus = find_hoststatus(cgi_data.host_name); if( NULL == temp_hoststatus) { json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), (time_t)-1, ¤t_authdata, RESULT_OPTION_VALUE_INVALID, "The status for host '%s' could not be found.", cgi_data.host_name)); result = ERROR; } else { json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_status_data_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_status_host(cgi_data.format_options, cgi_data.host, temp_hoststatus)); } break; case STATUS_QUERY_SERVICECOUNT: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_status_data_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_status_servicecount(cgi_data.format_options, cgi_data.host, cgi_data.use_parent_host, cgi_data.parent_host, cgi_data.use_child_host, cgi_data.child_host, cgi_data.hostgroup, cgi_data.servicegroup, cgi_data.host_statuses, cgi_data.service_statuses, cgi_data.contact, cgi_data.service_time_field, cgi_data.start_time, cgi_data.end_time, cgi_data.service_description, cgi_data.parent_service_name, cgi_data.child_service_name, cgi_data.contactgroup, cgi_data.check_timeperiod, cgi_data.service_notification_timeperiod, cgi_data.check_command, cgi_data.event_handler)); break; case STATUS_QUERY_SERVICELIST: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_status_data_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_status_servicelist(cgi_data.format_options, cgi_data.start, cgi_data.count, cgi_data.details, cgi_data.host, cgi_data.use_parent_host, cgi_data.parent_host, cgi_data.use_child_host, cgi_data.child_host, cgi_data.hostgroup, cgi_data.servicegroup, cgi_data.host_statuses, cgi_data.service_statuses, cgi_data.contact, cgi_data.service_time_field, cgi_data.start_time, cgi_data.end_time, cgi_data.service_description, cgi_data.parent_service_name, cgi_data.child_service_name, cgi_data.contactgroup, cgi_data.check_timeperiod, cgi_data.service_notification_timeperiod, cgi_data.check_command, cgi_data.event_handler)); break; case STATUS_QUERY_SERVICE: temp_servicestatus = find_servicestatus(cgi_data.host_name, cgi_data.service_description); if( NULL == temp_servicestatus) { json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), (time_t)-1, ¤t_authdata, RESULT_OPTION_VALUE_INVALID, "The status for service '%s' on host '%s' could not be found.", cgi_data.service_description, cgi_data.host_name)); result = ERROR; } else { json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_status_data_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_status_service(cgi_data.format_options, cgi_data.service, temp_servicestatus)); } break; #if 0 case STATUS_QUERY_CONTACTCOUNT: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_status_data_update, ¤t_authdata, RESULT_SUCCESS, "")); json_status_contactcount(1, cgi_data.format_options, cgi_data.start, cgi_data.count, cgi_data.details, cgi_data.contactgroup); break; case STATUS_QUERY_CONTACTLIST: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_status_data_update, ¤t_authdata, RESULT_SUCCESS, "")); json_status_contactlist(1, cgi_data.format_options, cgi_data.start, cgi_data.count, cgi_data.details, cgi_data.contactgroup); break; case STATUS_QUERY_CONTACT: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_status_data_update, ¤t_authdata, RESULT_SUCCESS, "")); json_status_contact(1, cgi_data.format_options, cgi_data.contact); break; #endif case STATUS_QUERY_COMMENTCOUNT: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_status_data_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_status_commentcount(cgi_data.format_options, cgi_data.comment_time_field, cgi_data.start_time, cgi_data.end_time, cgi_data.comment_types, cgi_data.entry_types, cgi_data.persistence, cgi_data.expiring, cgi_data.host_name, cgi_data.service_description)); break; case STATUS_QUERY_COMMENTLIST: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_status_data_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_status_commentlist(cgi_data.format_options, cgi_data.start, cgi_data.count, cgi_data.details, cgi_data.comment_time_field, cgi_data.start_time, cgi_data.end_time, cgi_data.comment_types, cgi_data.entry_types, cgi_data.persistence, cgi_data.expiring, cgi_data.host_name, cgi_data.service_description)); break; case STATUS_QUERY_COMMENT: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_status_data_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_status_comment(cgi_data.format_options, cgi_data.comment)); break; case STATUS_QUERY_DOWNTIMECOUNT: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_status_data_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_status_downtimecount(cgi_data.format_options, cgi_data.downtime_time_field, cgi_data.start_time, cgi_data.end_time, cgi_data.downtime_object_types, cgi_data.downtime_types, cgi_data.triggered, cgi_data.triggered_by, cgi_data.in_effect, cgi_data.host_name, cgi_data.service_description)); break; case STATUS_QUERY_DOWNTIMELIST: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_status_data_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_status_downtimelist(cgi_data.format_options, cgi_data.start, cgi_data.count, cgi_data.details, cgi_data.downtime_time_field, cgi_data.start_time, cgi_data.end_time, cgi_data.downtime_object_types, cgi_data.downtime_types, cgi_data.triggered, cgi_data.triggered_by, cgi_data.in_effect, cgi_data.host_name, cgi_data.service_description)); break; case STATUS_QUERY_DOWNTIME: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_status_data_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_status_downtime(cgi_data.format_options, cgi_data.downtime)); break; case STATUS_QUERY_PROGRAMSTATUS: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_status_data_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_status_program(cgi_data.format_options)); break; case STATUS_QUERY_PERFORMANCEDATA: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), last_status_data_update, ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_status_performance()); break; case STATUS_QUERY_HELP: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), compile_time(__DATE__, __TIME__), ¤t_authdata, RESULT_SUCCESS, "")); json_object_append_object(json_root, "data", json_help(status_json_help)); break; default: json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data.query, valid_queries), get_query_status(query_status, cgi_data.query), (time_t)-1, ¤t_authdata, RESULT_OPTION_MISSING, "Error: Object Type not specified. See data for help.")); json_object_append_object(json_root, "data", json_help(status_json_help)); break; } json_object_print(json_root, 0, 1, cgi_data.strftime_format, cgi_data.format_options); document_footer(); /* free all allocated memory */ free_cgi_data( &cgi_data); json_free_object(json_root, 1); free_memory(); return OK; } void document_header(int whitespace) { char date_time[MAX_DATETIME_LENGTH]; time_t expire_time; time_t current_time; time(¤t_time); printf("Cache-Control: no-store\r\n"); printf("Pragma: no-cache\r\n"); get_time_string(¤t_time, date_time, (int)sizeof(date_time), HTTP_DATE_TIME); printf("Last-Modified: %s\r\n", date_time); expire_time = (time_t)0L; get_time_string(&expire_time, date_time, (int)sizeof(date_time), HTTP_DATE_TIME); printf("Expires: %s\r\n", date_time); printf("Content-type: application/json; charset=utf-8\r\n\r\n"); return; } void document_footer(void) { printf( "\n"); return; } void init_cgi_data(status_json_cgi_data *cgi_data) { cgi_data->format_options = 0; cgi_data->query = STATUS_QUERY_INVALID; cgi_data->start = 0; cgi_data->count = 0; cgi_data->details = 0; cgi_data->strftime_format = NULL; cgi_data->parent_host_name = NULL; cgi_data->use_parent_host = 0; cgi_data->parent_host = NULL; cgi_data->child_host_name = NULL; cgi_data->use_child_host = 0; cgi_data->child_host = NULL; cgi_data->host_name = NULL; cgi_data->host = NULL; cgi_data->host_statuses = HOST_STATUS_ALL; cgi_data->hostgroup_name = NULL; cgi_data->hostgroup = NULL; cgi_data->servicegroup_name = NULL; cgi_data->servicegroup = NULL; cgi_data->service_description = NULL; cgi_data->service = NULL; cgi_data->service_statuses = SERVICE_STATUS_ALL; cgi_data->parent_service_name = NULL; cgi_data->child_service_name = NULL; cgi_data->contactgroup_name = NULL; cgi_data->contactgroup = NULL; cgi_data->contact_name = NULL; cgi_data->contact = NULL; cgi_data->check_timeperiod_name = NULL; cgi_data->check_timeperiod = NULL; cgi_data->host_notification_timeperiod_name = NULL; cgi_data->host_notification_timeperiod = NULL; cgi_data->service_notification_timeperiod_name = NULL; cgi_data->service_notification_timeperiod = NULL; cgi_data->check_command_name = NULL; cgi_data->check_command = NULL; cgi_data->event_handler_name = NULL; cgi_data->event_handler = NULL; cgi_data->comment_types = COMMENT_TYPE_ALL; cgi_data->entry_types = COMMENT_ENTRY_ALL; cgi_data->persistence = BOOLEAN_EITHER; cgi_data->expiring = BOOLEAN_EITHER; cgi_data->comment_id = -1; cgi_data->comment = NULL; cgi_data->downtime_id = -1; cgi_data->downtime = NULL; cgi_data->start_time = (time_t)0; cgi_data->end_time = (time_t)0; cgi_data->host_time_field = STATUS_TIME_INVALID; cgi_data->service_time_field = STATUS_TIME_INVALID; cgi_data->comment_time_field = STATUS_TIME_INVALID; cgi_data->downtime_time_field = STATUS_TIME_INVALID; cgi_data->downtime_object_types = DOWNTIME_OBJECT_TYPE_ALL; cgi_data->downtime_types = DOWNTIME_TYPE_ALL; cgi_data->triggered = BOOLEAN_EITHER; cgi_data->triggered_by = -1; cgi_data->in_effect = BOOLEAN_EITHER; } void free_cgi_data( status_json_cgi_data *cgi_data) { if( NULL != cgi_data->parent_host_name) free( cgi_data->parent_host_name); if( NULL != cgi_data->child_host_name) free( cgi_data->child_host_name); if( NULL != cgi_data->host_name) free( cgi_data->host_name); if( NULL != cgi_data->hostgroup_name) free( cgi_data->hostgroup_name); if( NULL != cgi_data->servicegroup_name) free(cgi_data->servicegroup_name); if( NULL != cgi_data->service_description) free(cgi_data->service_description); if( NULL != cgi_data->parent_service_name) free(cgi_data->parent_service_name); if( NULL != cgi_data->child_service_name) free(cgi_data->child_service_name); if( NULL != cgi_data->contactgroup_name) free(cgi_data->contactgroup_name); if( NULL != cgi_data->contact_name) free(cgi_data->contact_name); if( NULL != cgi_data->check_timeperiod_name) free(cgi_data->check_timeperiod_name); if( NULL != cgi_data->host_notification_timeperiod_name) free(cgi_data->host_notification_timeperiod_name); if( NULL != cgi_data->service_notification_timeperiod_name) free(cgi_data->service_notification_timeperiod_name); if( NULL != cgi_data->check_command_name) free(cgi_data->check_command_name); if( NULL != cgi_data->event_handler_name) free(cgi_data->event_handler_name); } int process_cgivars(json_object *json_root, status_json_cgi_data *cgi_data, time_t query_time) { char **variables; int result = RESULT_SUCCESS; int x; authdata *authinfo = NULL; /* Currently always NULL because get_authentication_information() hasn't been called yet, but in case we want to use it in the future... */ variables = getcgivars(); for(x = 0; variables[x] != NULL; x++) { /* We set these each iteration because they could change with each iteration */ /* we found the query argument */ if(!strcmp(variables[x], "query")) { if((result = parse_enumeration_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], valid_queries, &(cgi_data->query))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "formatoptions")) { cgi_data->format_options = 0; if((result = parse_bitmask_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], svm_format_options, &(cgi_data->format_options))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "start")) { if((result = parse_int_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->start))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "count")) { if((result = parse_int_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->count))) != RESULT_SUCCESS) { break; } if(cgi_data->count == 0) { json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, RESULT_OPTION_VALUE_INVALID, "The count option value is invalid. " "It must be an integer greater than zero")); result = RESULT_OPTION_VALUE_INVALID; break; } x++; } else if(!strcmp(variables[x], "parenthost")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->parent_host_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "childhost")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->child_host_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "hostname")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->host_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "hostgroup")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->hostgroup_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "hoststatus")) { cgi_data->host_statuses = 0; if((result = parse_bitmask_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], svm_host_statuses, &(cgi_data->host_statuses))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "servicegroup")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->servicegroup_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "servicestatus")) { cgi_data->service_statuses = 0; if((result = parse_bitmask_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], svm_service_statuses, &(cgi_data->service_statuses))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "parentservice")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->parent_service_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "childservice")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->child_service_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "checktimeperiod")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->check_timeperiod_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "hostnotificationtimeperiod")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->host_notification_timeperiod_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "servicenotificationtimeperiod")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->service_notification_timeperiod_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "checkcommand")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->check_command_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "eventhandler")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->event_handler_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "commenttypes")) { cgi_data->comment_types = 0; if((result = parse_bitmask_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], svm_valid_comment_types, &(cgi_data->comment_types))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "entrytypes")) { cgi_data->entry_types = 0; if((result = parse_bitmask_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], svm_valid_comment_entry_types, &(cgi_data->entry_types))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "persistence")) { cgi_data->persistence = 0; if((result = parse_bitmask_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], svm_valid_persistence, &(cgi_data->persistence))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "expiring")) { cgi_data->expiring = 0; if((result = parse_bitmask_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], svm_valid_expiration, &(cgi_data->expiring))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "commentid")) { if((result = parse_int_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->comment_id))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "downtimeid")) { if((result = parse_int_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->downtime_id))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "downtimeobjecttypes")) { cgi_data->downtime_object_types = 0; if((result = parse_bitmask_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], svm_valid_downtime_object_types, &(cgi_data->downtime_object_types))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "downtimetypes")) { cgi_data->downtime_types = 0; if((result = parse_bitmask_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], svm_valid_downtime_types, &(cgi_data->downtime_types))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "triggered")) { cgi_data->triggered = 0; if((result = parse_bitmask_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], svm_valid_triggered_status, &(cgi_data->triggered))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "triggeredby")) { if((result = parse_int_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->triggered_by))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "ineffect")) { cgi_data->in_effect = 0; if((result = parse_bitmask_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], svm_valid_in_effect_status, &(cgi_data->in_effect))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "contactgroup")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->contactgroup_name))) != RESULT_SUCCESS) { result = ERROR; break; } x++; } else if(!strcmp(variables[x], "servicedescription")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->service_description))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "contactname")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->contact_name))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "details")) { if((result = parse_boolean_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->details))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "dateformat")) { if((result = parse_string_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->strftime_format))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "hosttimefield")) { if((result = parse_enumeration_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], svm_host_time_fields, &(cgi_data->host_time_field))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "servicetimefield")) { if((result = parse_enumeration_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], svm_service_time_fields, &(cgi_data->service_time_field))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "commenttimefield")) { if((result = parse_enumeration_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], svm_comment_time_fields, &(cgi_data->comment_time_field))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "downtimetimefield")) { if((result = parse_enumeration_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], svm_downtime_time_fields, &(cgi_data->downtime_time_field))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "starttime")) { if((result = parse_time_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->start_time))) != RESULT_SUCCESS) { break; } x++; } else if(!strcmp(variables[x], "endtime")) { if((result = parse_time_cgivar(THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), json_root, query_time, authinfo, variables[x], variables[x+1], &(cgi_data->end_time))) != RESULT_SUCCESS) { result = ERROR; break; } x++; } else if(!strcmp(variables[x], "NagFormId")) ++x; else if(!strcmp(variables[x], "")); else { json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, RESULT_OPTION_INVALID, "Invalid option: '%s'.", variables[x])); result = RESULT_OPTION_INVALID; break; } } /* free memory allocated to the CGI variables */ free_cgivars(variables); return result; } int validate_arguments(json_object *json_root, status_json_cgi_data *cgi_data, time_t query_time) { int result = RESULT_SUCCESS; host *temp_host = NULL; hostgroup *temp_hostgroup = NULL; servicegroup *temp_servicegroup = NULL; service *temp_service = NULL; contactgroup *temp_contactgroup = NULL; timeperiod *temp_timeperiod = NULL; command *temp_command = NULL; contact *temp_contact = NULL; nagios_comment *temp_comment = NULL; scheduled_downtime *temp_downtime = NULL; authdata *authinfo = NULL; /* Currently always NULL because get_authentication_information() hasn't been called yet, but in case we want to use it in the future... */ /* Validate that required parameters were supplied */ switch(cgi_data->query) { case STATUS_QUERY_HOSTCOUNT: break; case STATUS_QUERY_HOSTLIST: if(((cgi_data->start_time > 0) || (cgi_data->end_time > 0)) && (STATUS_TIME_INVALID == cgi_data->host_time_field)) { result = RESULT_OPTION_MISSING; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "Start and/or end time supplied, but time field specified.")); } break; case STATUS_QUERY_HOST: if( NULL == cgi_data->host_name) { result = RESULT_OPTION_MISSING; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "Host information requested, but no host name specified.")); } break; case STATUS_QUERY_SERVICECOUNT: break; case STATUS_QUERY_SERVICELIST: if(((cgi_data->start_time > 0) || (cgi_data->end_time > 0)) && (STATUS_TIME_INVALID == cgi_data->service_time_field)) { result = RESULT_OPTION_MISSING; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "Start and/or end time supplied, but time field specified.")); } break; case STATUS_QUERY_SERVICE: if( NULL == cgi_data->host_name) { result = RESULT_OPTION_MISSING; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "Service information requested, but no host name specified.")); } if( NULL == cgi_data->service_description) { result = RESULT_OPTION_MISSING; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "Service information requested, but no service description specified.")); } break; case STATUS_QUERY_COMMENTCOUNT: break; case STATUS_QUERY_COMMENTLIST: if(((cgi_data->start_time > 0) || (cgi_data->end_time > 0)) && (STATUS_TIME_INVALID == cgi_data->comment_time_field)) { result = RESULT_OPTION_MISSING; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "Start and/or end time supplied, but time field specified.")); } break; case STATUS_QUERY_COMMENT: if( -1 == cgi_data->comment_id) { result = RESULT_OPTION_MISSING; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "Comment information requested, but no id specified.")); } break; case STATUS_QUERY_DOWNTIMECOUNT: break; case STATUS_QUERY_DOWNTIMELIST: if(((cgi_data->start_time > 0) || (cgi_data->end_time > 0)) && (STATUS_TIME_INVALID == cgi_data->downtime_time_field)) { result = RESULT_OPTION_MISSING; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "Start and/or end time supplied, but time field specified.")); } break; case STATUS_QUERY_DOWNTIME: if( -1 == cgi_data->downtime_id) { result = RESULT_OPTION_MISSING; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "Downtime information requested, but no id specified.")); } break; case STATUS_QUERY_PROGRAMSTATUS: break; case STATUS_QUERY_PERFORMANCEDATA: break; #if 0 case STATUS_QUERY_CONTACTCOUNT: break; case STATUS_QUERY_CONTACTLIST: break; case STATUS_QUERY_CONTACT: if( NULL == cgi_data->contact_name) { result = RESULT_OPTION_MISSING; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "Contact information requested, but no contact name specified.")); } break; #endif case STATUS_QUERY_HELP: break; default: result = RESULT_OPTION_MISSING; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "Missing validation for object type %u.", cgi_data->query)); break; } /* Validate the requested parent host */ if( NULL != cgi_data->parent_host_name) { cgi_data->use_parent_host = 1; cgi_data->parent_host = NULL; if(strcmp(cgi_data->parent_host_name, "none")) { temp_host = find_host(cgi_data->parent_host_name); if( NULL == temp_host) { cgi_data->use_parent_host = 0; result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The parenthost '%s' could not be found.", cgi_data->parent_host_name)); } else { cgi_data->parent_host = temp_host; } } } /* Validate the requested child host */ if( NULL != cgi_data->child_host_name) { cgi_data->use_child_host = 1; cgi_data->child_host = NULL; if(strcmp(cgi_data->child_host_name, "none")) { temp_host = find_host(cgi_data->child_host_name); if( NULL == temp_host) { cgi_data->use_child_host = 0; result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The childhost '%s' could not be found.", cgi_data->child_host_name)); } else { cgi_data->child_host = temp_host; } } } /* Validate the requested host */ if( NULL != cgi_data->host_name) { temp_host = find_host(cgi_data->host_name); if( NULL == temp_host) { result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The host '%s' could not be found.", cgi_data->host_name)); } else { cgi_data->host = temp_host; } } /* Validate the requested hostgroup */ if( NULL != cgi_data->hostgroup_name) { temp_hostgroup = find_hostgroup(cgi_data->hostgroup_name); if( NULL == temp_hostgroup) { result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The hostgroup '%s' could not be found.", cgi_data->hostgroup_name)); } else { cgi_data->hostgroup = temp_hostgroup; } } /* Validate the requested servicegroup */ if( NULL != cgi_data->servicegroup_name) { temp_servicegroup = find_servicegroup(cgi_data->servicegroup_name); if( NULL == temp_servicegroup) { result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The servicegroup '%s' could not be found.", cgi_data->servicegroup_name)); } else { cgi_data->servicegroup = temp_servicegroup; } } /* Validate the requested contactgroup */ if( NULL != cgi_data->contactgroup_name) { temp_contactgroup = find_contactgroup(cgi_data->contactgroup_name); if( NULL == temp_contactgroup) { result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The contactgroup '%s' could not be found.", cgi_data->contactgroup_name)); } else { cgi_data->contactgroup = temp_contactgroup; } } /* Validate the requested service. Because a service description may be requested without specifying a host name, it may not make sense to look for a specific service object */ if((NULL != cgi_data->service_description) && (NULL != cgi_data->host_name)) { temp_service = find_service(cgi_data->host_name, cgi_data->service_description); if( NULL == temp_service) { result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The service '%s' on host '%s' could not be found.", cgi_data->service_description, cgi_data->host_name)); } else { cgi_data->service = temp_service; } } /* Validate the requested check timeperiod */ if( NULL != cgi_data->check_timeperiod_name) { temp_timeperiod = find_timeperiod(cgi_data->check_timeperiod_name); if( NULL == temp_timeperiod) { result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The check timeperiod '%s' could not be found.", cgi_data->check_timeperiod_name)); } else { cgi_data->check_timeperiod = temp_timeperiod; } } /* Validate the requested host notification timeperiod */ if( NULL != cgi_data->host_notification_timeperiod_name) { temp_timeperiod = find_timeperiod(cgi_data->host_notification_timeperiod_name); if( NULL == temp_timeperiod) { result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The host notification timeperiod '%s' could not be found.", cgi_data->host_notification_timeperiod_name)); } else { cgi_data->host_notification_timeperiod = temp_timeperiod; } } /* Validate the requested service notification timeperiod */ if( NULL != cgi_data->service_notification_timeperiod_name) { temp_timeperiod = find_timeperiod(cgi_data->service_notification_timeperiod_name); if( NULL == temp_timeperiod) { result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The service notification timeperiod '%s' could not be found.", cgi_data->service_notification_timeperiod_name)); } else { cgi_data->service_notification_timeperiod = temp_timeperiod; } } /* Validate the requested check command */ if( NULL != cgi_data->check_command_name) { temp_command = find_command(cgi_data->check_command_name); if( NULL == temp_command) { result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The check command '%s' could not be found.", cgi_data->check_command_name)); } else { cgi_data->check_command = temp_command; } } /* Validate the requested event_handler */ if( NULL != cgi_data->event_handler_name) { temp_command = find_command(cgi_data->event_handler_name); if( NULL == temp_command) { result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The event_handler '%s' could not be found.", cgi_data->event_handler_name)); } else { cgi_data->event_handler = temp_command; } } /* Validate the requested comment */ if(-1 != cgi_data->comment_id) { temp_comment = find_host_comment(cgi_data->comment_id); if(NULL == temp_comment) { temp_comment = find_service_comment(cgi_data->comment_id); } if(NULL == temp_comment) { result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The comment with ID '%d' could not be found.", cgi_data->comment_id)); } else { cgi_data->comment = temp_comment; } } /* Validate the requested downtime */ if(-1 != cgi_data->downtime_id) { temp_downtime = find_downtime(ANY_DOWNTIME, cgi_data->downtime_id); if(NULL == temp_downtime) { result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The downtime with ID '%d' could not be found.", cgi_data->downtime_id)); } else { cgi_data->downtime = temp_downtime; } } /* Validate the requested triggered-by downtime */ if(-1 != cgi_data->triggered_by) { temp_downtime = find_downtime(ANY_DOWNTIME, cgi_data->triggered_by); if(NULL == temp_downtime) { result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The triggering downtime with ID '%d' could not be found.", cgi_data->triggered_by)); } } /* Validate the requested contact */ if( NULL != cgi_data->contact_name) { temp_contact = find_contact(cgi_data->contact_name); if( NULL == temp_contact) { result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The contact '%s' could not be found.", cgi_data->contact_name)); } else { cgi_data->contact = temp_contact; } } /* Validate the requested start time is before the requested end time */ if((cgi_data->start_time > 0) && (cgi_data->end_time > 0) && ( cgi_data->start_time >= cgi_data->end_time)) { result = RESULT_OPTION_VALUE_INVALID; json_object_append_object(json_root, "result", json_result(query_time, THISCGI, svm_get_string_from_value(cgi_data->query, valid_queries), get_query_status(query_status, cgi_data->query), (time_t)-1, authinfo, result, "The requested start time must be before the end time.")); } return result; } int json_status_host_passes_selection(host *temp_host, int use_parent_host, host *parent_host, int use_child_host, host *child_host, hostgroup *temp_hostgroup, contact *temp_contact, hoststatus *temp_hoststatus, int time_field, time_t start_time, time_t end_time, contactgroup *temp_contactgroup, timeperiod *check_timeperiod, timeperiod *notification_timeperiod, command *check_command, command *event_handler) { host *temp_host2; /* Skip if user is not authorized for this host */ if(FALSE == is_authorized_for_host(temp_host, ¤t_authdata)) { return 0; } /* If the host parent was specified, skip the hosts whose parent is not the parent host specified */ if( 1 == use_parent_host && FALSE == is_host_immediate_child_of_host(parent_host, temp_host)) { return 0; } /* If the hostgroup was specified, skip the hosts that are not members of the hostgroup specified */ if( NULL != temp_hostgroup && ( FALSE == is_host_member_of_hostgroup(temp_hostgroup, temp_host))) { return 0; } /* If the contact was specified, skip the hosts that do not have the contact specified */ if( NULL != temp_contact && ( FALSE == is_contact_for_host(temp_host, temp_contact))) { return 0; } /* If a contactgroup was specified, skip the hosts that do not have the contactgroup specified */ if(NULL != temp_contactgroup && (FALSE == is_contactgroup_for_host(temp_host, temp_contactgroup))) { return 0; } switch(time_field) { case STATUS_TIME_INVALID: break; case STATUS_TIME_LAST_UPDATE: if((start_time > 0) && (temp_hoststatus->last_update < start_time)) { return 0; } if((end_time > 0) && (temp_hoststatus->last_update > end_time)) { return 0; } break; case STATUS_TIME_LAST_CHECK: if((start_time > 0) && (temp_hoststatus->last_check < start_time)) { return 0; } if((end_time > 0) && (temp_hoststatus->last_check > end_time)) { return 0; } break; case STATUS_TIME_NEXT_CHECK: if((start_time > 0) && (temp_hoststatus->next_check < start_time)) { return 0; } if((end_time > 0) && (temp_hoststatus->next_check > end_time)) { return 0; } break; case STATUS_TIME_LAST_STATE_CHANGE: if((start_time > 0) && (temp_hoststatus->last_state_change < start_time)) { return 0; } if((end_time > 0) && (temp_hoststatus->last_state_change > end_time)) { return 0; } break; case STATUS_TIME_LAST_HARD_STATE_CHANGE: if((start_time > 0) && (temp_hoststatus->last_hard_state_change < start_time)) { return 0; } if((end_time > 0) && (temp_hoststatus->last_hard_state_change > end_time)) { return 0; } break; case STATUS_TIME_LAST_TIME_UP: if((start_time > 0) && (temp_hoststatus->last_time_up < start_time)) { return 0; } if((end_time > 0) && (temp_hoststatus->last_time_up > end_time)) { return 0; } break; case STATUS_TIME_LAST_TIME_DOWN: if((start_time > 0) && (temp_hoststatus->last_time_down < start_time)) { return 0; } if((end_time > 0) && (temp_hoststatus->last_time_down > end_time)) { return 0; } break; case STATUS_TIME_LAST_TIME_UNREACHABLE: if((start_time > 0) && (temp_hoststatus->last_time_unreachable < start_time)) { return 0; } if((end_time > 0) && (temp_hoststatus->last_time_unreachable > end_time)) { return 0; } break; case STATUS_TIME_LAST_NOTIFICATION: if((start_time > 0) && (temp_hoststatus->last_notification < start_time)) { return 0; } if((end_time > 0) && (temp_hoststatus->last_notification > end_time)) { return 0; } break; case STATUS_TIME_NEXT_NOTIFICATION: if((start_time > 0) && (temp_hoststatus->next_notification < start_time)) { return 0; } if((end_time > 0) && (temp_hoststatus->next_notification > end_time)) { return 0; } break; default: return 0; } /* If a check timeperiod was specified, skip this host if it does not have the check timeperiod specified */ if(NULL != check_timeperiod && (check_timeperiod != temp_host->check_period_ptr)) { return 0; } /* If a notification timeperiod was specified, skip this host if it does not have the notification timeperiod specified */ if(NULL != notification_timeperiod && (notification_timeperiod != temp_host->notification_period_ptr)) { return 0; } /* If a check command was specified, skip this host if it does not have the check command specified */ if(NULL != check_command && (check_command != temp_host->check_command_ptr)) { return 0; } /* If an event handler was specified, skip this host if it does not have the event handler specified */ if(NULL != event_handler && (event_handler != temp_host->event_handler_ptr)) { return 0; } /* If a child host was specified... (leave this for last since it is the most expensive check) */ if(1 == use_child_host) { /* If the child host is "none", skip this host if it has children */ if(NULL == child_host) { for(temp_host2 = host_list; temp_host2 != NULL; temp_host2 = temp_host2->next) { if(TRUE == is_host_immediate_child_of_host(temp_host, temp_host2)) { return 0; } } } /* Otherwise, skip this host if it does not have the specified host as a child */ else if(FALSE == is_host_immediate_child_of_host(temp_host, child_host)) { return 0; } } return 1; } json_object *json_status_host_selectors(unsigned format_options, int start, int count, int use_parent_host, host *parent_host, int use_child_host, host *child_host, hostgroup *temp_hostgroup, int host_statuses, contact *temp_contact, int time_field, time_t start_time, time_t end_time, contactgroup *temp_contactgroup, timeperiod *check_timeperiod, timeperiod *notification_timeperiod, command *check_command, command *event_handler) { json_object *json_selectors; json_selectors = json_new_object(); if(start > 0) { json_object_append_integer(json_selectors, "start", start); } if(count > 0) { json_object_append_integer(json_selectors, "count", count); } if(1 == use_parent_host) { json_object_append_string(json_selectors, "parenthost", &percent_escapes, ( NULL == parent_host ? "none" : parent_host->name)); } if(1 == use_child_host) { json_object_append_string(json_selectors, "childhost", &percent_escapes, ( NULL == child_host ? "none" : child_host->name)); } if(NULL != temp_hostgroup) { json_object_append_string(json_selectors, "hostgroup", &percent_escapes, temp_hostgroup->group_name); } if(HOST_STATUS_ALL != host_statuses) { json_bitmask(json_selectors, format_options, "hoststatus", host_statuses, svm_host_statuses); } if(NULL != temp_contact) { json_object_append_string(json_selectors, "contact",&percent_escapes, temp_contact->name); } if(NULL != temp_contactgroup) { json_object_append_string(json_selectors, "contactgroup", &percent_escapes, temp_contactgroup->group_name); } if(time_field > 0) { json_enumeration(json_selectors, format_options, "hosttimefield", time_field, svm_host_time_fields); } if(start_time > 0) { json_object_append_time_t(json_selectors, "starttime", start_time); } if(end_time > 0) { json_object_append_time_t(json_selectors, "endtime", end_time); } if( NULL != check_timeperiod) { json_object_append_string(json_selectors, "checktimeperiod", &percent_escapes, check_timeperiod->name); } if( NULL != notification_timeperiod) { json_object_append_string(json_selectors, "hostnotificationtimeperiod", &percent_escapes, notification_timeperiod->name); } if( NULL != check_command) { json_object_append_string(json_selectors, "checkcommand", &percent_escapes, check_command->name); } if( NULL != event_handler) { json_object_append_string(json_selectors, "eventhandler", &percent_escapes, event_handler->name); } return json_selectors; } json_object *json_status_hostcount(unsigned format_options, int use_parent_host, host *parent_host, int use_child_host, host *child_host, hostgroup *temp_hostgroup, int host_statuses, contact *temp_contact, int time_field, time_t start_time, time_t end_time, contactgroup *temp_contactgroup, timeperiod *check_timeperiod, timeperiod *notification_timeperiod, command *check_command, command *event_handler) { json_object *json_data; json_object *json_count; host *temp_host; hoststatus *temp_hoststatus; int up = 0; int down = 0; int unreachable = 0; int pending = 0; json_data = json_new_object(); json_object_append_object(json_data, "selectors", json_status_host_selectors(format_options, 0, 0, use_parent_host, parent_host, use_child_host, child_host, temp_hostgroup, host_statuses, temp_contact, time_field, start_time, end_time, temp_contactgroup, check_timeperiod, notification_timeperiod, check_command, event_handler)); json_count = json_new_object(); for(temp_host = host_list; temp_host != NULL; temp_host = temp_host->next) { /* If we cannot get the status of the host, skip it. This should probably return an error and doing so is in the todo list. */ temp_hoststatus = find_hoststatus(temp_host->name); if( NULL == temp_hoststatus) { continue; } if(json_status_host_passes_selection(temp_host, use_parent_host, parent_host, use_child_host, child_host, temp_hostgroup, temp_contact, temp_hoststatus, time_field, start_time, end_time, temp_contactgroup, check_timeperiod, notification_timeperiod, check_command, event_handler) == 0) { continue; } /* Count the hosts in each state */ switch(temp_hoststatus->status) { case HOST_PENDING: pending++; break; #ifdef JSON_NAGIOS_4X case SD_HOST_UP: #else case HOST_UP: #endif up++; break; #ifdef JSON_NAGIOS_4X case SD_HOST_UNREACHABLE: #else case HOST_UNREACHABLE: #endif unreachable++; break; #ifdef JSON_NAGIOS_4X case SD_HOST_DOWN: #else case HOST_DOWN: #endif down++; break; } } #ifdef JSON_NAGIOS_4X if( host_statuses & SD_HOST_UP) #else if( host_statuses & HOST_UP) #endif json_object_append_integer(json_count, "up", up); #ifdef JSON_NAGIOS_4X if( host_statuses & SD_HOST_DOWN) #else if( host_statuses & HOST_DOWN) #endif json_object_append_integer(json_count, "down", down); #ifdef JSON_NAGIOS_4X if( host_statuses & SD_HOST_UNREACHABLE) #else if( host_statuses & HOST_UNREACHABLE) #endif json_object_append_integer(json_count, "unreachable", unreachable); if( host_statuses & HOST_PENDING) json_object_append_integer(json_count, "pending", pending); json_object_append_object(json_data, "count", json_count); return json_data; } json_object *json_status_hostlist(unsigned format_options, int start, int count, int details, int use_parent_host, host *parent_host, int use_child_host, host *child_host, hostgroup *temp_hostgroup, int host_statuses, contact *temp_contact, int time_field, time_t start_time, time_t end_time, contactgroup *temp_contactgroup, timeperiod *check_timeperiod, timeperiod *notification_timeperiod, command *check_command, command *event_handler) { json_object *json_data; json_object *json_hostlist; json_object *json_host_details; host *temp_host; hoststatus *temp_hoststatus; int current = 0; int counted = 0; json_data = json_new_object(); json_object_append_object(json_data, "selectors", json_status_host_selectors(format_options, start, count, use_parent_host, parent_host, use_child_host, child_host, temp_hostgroup, host_statuses, temp_contact, time_field, start_time, end_time, temp_contactgroup, check_timeperiod, notification_timeperiod, check_command, event_handler)); json_hostlist = json_new_object(); for(temp_host = host_list; temp_host != NULL; temp_host = temp_host->next) { /* If we cannot get the status of the host, skip it. This should probably return an error and doing so is in the todo list. */ temp_hoststatus = find_hoststatus(temp_host->name); if( NULL == temp_hoststatus) { continue; } if(json_status_host_passes_selection(temp_host, use_parent_host, parent_host, use_child_host, child_host, temp_hostgroup, temp_contact, temp_hoststatus, time_field, start_time, end_time, temp_contactgroup, check_timeperiod, notification_timeperiod, check_command, event_handler) == 0) { continue; } /* If the status of the host does not match one of the status the user requested, skip the host */ if(!(temp_hoststatus->status & host_statuses)) { continue; } /* If the current item passes the start and limit tests, display it */ if( passes_start_and_count_limits(start, count, current, counted)) { if( details > 0) { json_host_details = json_new_object(); json_status_host_details(json_host_details, format_options, temp_host, temp_hoststatus); json_object_append_object(json_hostlist, temp_host->name, json_host_details); } else { json_enumeration(json_hostlist, format_options, temp_host->name, temp_hoststatus->status, svm_host_statuses); } counted++; } current++; } json_object_append_object(json_data, "hostlist", json_hostlist); return json_data; } json_object *json_status_host(unsigned format_options, host *temp_host, hoststatus *temp_hoststatus) { json_object *json_host = json_new_object(); json_object *json_details = json_new_object(); json_object_append_string(json_details, "name", &percent_escapes, temp_host->name); json_status_host_details(json_details, format_options, temp_host, temp_hoststatus); json_object_append_object(json_host, "host", json_details); return json_host; } void json_status_host_details(json_object *json_details, unsigned format_options, host *temp_host, hoststatus *temp_hoststatus) { json_object_append_string(json_details, "name", &percent_escapes, temp_host->name); json_object_append_string(json_details, "plugin_output", &percent_escapes, temp_hoststatus->plugin_output); json_object_append_string(json_details, "long_plugin_output", &percent_escapes, temp_hoststatus->long_plugin_output); json_object_append_string(json_details, "perf_data", &percent_escapes, temp_hoststatus->perf_data); json_enumeration(json_details, format_options, "status", temp_hoststatus->status, svm_host_statuses); json_object_append_time_t(json_details, "last_update", temp_hoststatus->last_update); json_object_append_boolean(json_details, "has_been_checked", temp_hoststatus->has_been_checked); json_object_append_boolean(json_details, "should_be_scheduled", temp_hoststatus->should_be_scheduled); json_object_append_integer(json_details, "current_attempt", temp_hoststatus->current_attempt); json_object_append_integer(json_details, "max_attempts", temp_hoststatus->max_attempts); json_object_append_time_t(json_details, "last_check", temp_hoststatus->last_check); json_object_append_time_t(json_details, "next_check", temp_hoststatus->next_check); json_bitmask(json_details, format_options, "check_options", temp_hoststatus->check_options, svm_check_options); json_enumeration(json_details, format_options, "check_type", temp_hoststatus->check_type, svm_host_check_types); json_object_append_time_t(json_details, "last_state_change", temp_hoststatus->last_state_change); json_object_append_time_t(json_details, "last_hard_state_change", temp_hoststatus->last_hard_state_change); json_enumeration(json_details, format_options, "last_hard_state", temp_hoststatus->last_hard_state, svm_host_states); json_object_append_time_t(json_details, "last_time_up", temp_hoststatus->last_time_up); json_object_append_time_t(json_details, "last_time_down", temp_hoststatus->last_time_down); json_object_append_time_t(json_details, "last_time_unreachable", temp_hoststatus->last_time_unreachable); json_enumeration(json_details, format_options, "state_type", temp_hoststatus->state_type, svm_state_types); json_object_append_time_t(json_details, "last_notification", temp_hoststatus->last_notification); json_object_append_time_t(json_details, "next_notification", temp_hoststatus->next_notification); json_object_append_boolean(json_details, "no_more_notifications", temp_hoststatus->no_more_notifications); json_object_append_boolean(json_details, "notifications_enabled", temp_hoststatus->notifications_enabled); json_object_append_boolean(json_details, "problem_has_been_acknowledged", temp_hoststatus->problem_has_been_acknowledged); json_enumeration(json_details, format_options, "acknowledgement_type", temp_hoststatus->acknowledgement_type, svm_acknowledgement_types); json_object_append_integer(json_details, "current_notification_number", temp_hoststatus->current_notification_number); #ifdef JSON_NAGIOS_4X json_object_append_boolean(json_details, "accept_passive_checks", temp_hoststatus->accept_passive_checks); #else json_object_append_boolean(json_details, "accept_passive_host_checks", temp_hoststatus->accept_passive_host_checks); #endif json_object_append_boolean(json_details, "event_handler_enabled", temp_hoststatus->event_handler_enabled); json_object_append_boolean(json_details, "checks_enabled", temp_hoststatus->checks_enabled); json_object_append_boolean(json_details, "flap_detection_enabled", temp_hoststatus->flap_detection_enabled); json_object_append_boolean(json_details, "is_flapping", temp_hoststatus->is_flapping); json_object_append_real(json_details, "percent_state_change", temp_hoststatus->percent_state_change); json_object_append_real(json_details, "latency", temp_hoststatus->latency); json_object_append_real(json_details, "execution_time", temp_hoststatus->execution_time); json_object_append_integer(json_details, "scheduled_downtime_depth", temp_hoststatus->scheduled_downtime_depth); #ifndef JSON_NAGIOS_4X json_object_append_boolean(json_details, "failure_prediction_enabled", temp_hoststatus->failure_prediction_enabled); #endif json_object_append_boolean(json_details, "process_performance_data", temp_hoststatus->process_performance_data); #ifdef JSON_NAGIOS_4X json_object_append_boolean(json_details, "obsess", temp_hoststatus->obsess); #else json_object_append_boolean(json_details, "obsess_over_host", temp_hoststatus->obsess_over_host); #endif } int json_status_service_passes_host_selection(host *temp_host, int use_parent_host, host *parent_host, int use_child_host, host *child_host, hostgroup *temp_hostgroup, host *match_host, int host_statuses) { hoststatus *temp_hoststatus; host *temp_host2; /* Skip if user is not authorized for this service */ if(FALSE == is_authorized_for_host(temp_host, ¤t_authdata)) { return 0; } /* If the host parent was specified, skip the services whose host is not a child of the parent host specified */ if( 1 == use_parent_host && NULL != temp_host && FALSE == is_host_immediate_child_of_host(parent_host, temp_host)) { return 0; } /* If the hostgroup was specified, skip the services on hosts that are not members of the hostgroup specified */ if( NULL != temp_hostgroup && NULL != temp_host && ( FALSE == is_host_member_of_hostgroup(temp_hostgroup, temp_host))) { return 0; } /* If the host was specified, skip the services not on the host specified */ if( NULL != match_host && NULL != temp_host && temp_host != match_host) { return 0; } /* If we cannot get the status of the host, skip it. This should probably return an error and doing so is in the todo list. */ temp_hoststatus = find_hoststatus(temp_host->name); if( NULL == temp_hoststatus) { return 0; } /* If a child host was specified... */ if(1 == use_child_host) { /* If the child host is "none", skip this host if it has children */ if(NULL == child_host) { for(temp_host2 = host_list; temp_host2 != NULL; temp_host2 = temp_host2->next) { if(TRUE == is_host_immediate_child_of_host(temp_host, temp_host2)) { return 0; } } } /* Otherwise, skip this host if it does not have the specified host as a child */ else if(FALSE == is_host_immediate_child_of_host(temp_host, child_host)) { return 0; } } return 1; } int json_status_service_passes_service_selection(service *temp_service, servicegroup *temp_servicegroup, contact *temp_contact, servicestatus *temp_servicestatus, int time_field, time_t start_time, time_t end_time, char *service_description, char *parent_service_name, char *child_service_name, contactgroup *temp_contactgroup, timeperiod *check_timeperiod, timeperiod *notification_timeperiod, command *check_command, command *event_handler) { servicesmember *temp_servicesmember; /* Skip if user is not authorized for this service */ if(FALSE == is_authorized_for_service(temp_service, ¤t_authdata)) { return 0; } /* If the servicegroup was specified, skip the services that are not members of the servicegroup specified */ if( NULL != temp_servicegroup && ( FALSE == is_service_member_of_servicegroup(temp_servicegroup, temp_service))) { return 0; } /* If the contact was specified, skip the services that do not have the contact specified */ if( NULL != temp_contact && ( FALSE == is_contact_for_service(temp_service, temp_contact))) { return 0; } /* If a contactgroup was specified, skip the services that do not have the contactgroup specified */ if(NULL != temp_contactgroup && (FALSE == is_contactgroup_for_service(temp_service, temp_contactgroup))) { return 0; } switch(time_field) { case STATUS_TIME_INVALID: break; case STATUS_TIME_LAST_UPDATE: if((start_time > 0) && (temp_servicestatus->last_update < start_time)) { return 0; } if((end_time > 0) && (temp_servicestatus->last_update > end_time)) { return 0; } break; case STATUS_TIME_LAST_CHECK: if((start_time > 0) && (temp_servicestatus->last_check < start_time)) { return 0; } if((end_time > 0) && (temp_servicestatus->last_check > end_time)) { return 0; } break; case STATUS_TIME_NEXT_CHECK: if((start_time > 0) && (temp_servicestatus->next_check < start_time)) { return 0; } if((end_time > 0) && (temp_servicestatus->next_check > end_time)) { return 0; } break; case STATUS_TIME_LAST_STATE_CHANGE: if((start_time > 0) && (temp_servicestatus->last_state_change < start_time)) { return 0; } if((end_time > 0) && (temp_servicestatus->last_state_change > end_time)) { return 0; } break; case STATUS_TIME_LAST_HARD_STATE_CHANGE: if((start_time > 0) && (temp_servicestatus->last_hard_state_change < start_time)) { return 0; } if((end_time > 0) && (temp_servicestatus->last_hard_state_change > end_time)) { return 0; } break; case STATUS_TIME_LAST_TIME_OK: if((start_time > 0) && (temp_servicestatus->last_time_ok < start_time)) { return 0; } if((end_time > 0) && (temp_servicestatus->last_time_ok > end_time)) { return 0; } break; case STATUS_TIME_LAST_TIME_WARNING: if((start_time > 0) && (temp_servicestatus->last_time_warning < start_time)) { return 0; } if((end_time > 0) && (temp_servicestatus->last_time_warning > end_time)) { return 0; } break; case STATUS_TIME_LAST_TIME_CRITICAL: if((start_time > 0) && (temp_servicestatus->last_time_critical < start_time)) { return 0; } if((end_time > 0) && (temp_servicestatus->last_time_critical > end_time)) { return 0; } break; case STATUS_TIME_LAST_TIME_UNKNOWN: if((start_time > 0) && (temp_servicestatus->last_time_unknown < start_time)) { return 0; } if((end_time > 0) && (temp_servicestatus->last_time_unknown > end_time)) { return 0; } break; case STATUS_TIME_LAST_NOTIFICATION: if((start_time > 0) && (temp_servicestatus->last_notification < start_time)) { return 0; } if((end_time > 0) && (temp_servicestatus->last_notification > end_time)) { return 0; } break; case STATUS_TIME_NEXT_NOTIFICATION: if((start_time > 0) && (temp_servicestatus->next_notification < start_time)) { return 0; } if((end_time > 0) && (temp_servicestatus->next_notification > end_time)) { return 0; } break; default: return 0; } /* If a service description was specified, skip the services that do not have the service description specified */ if(NULL != service_description && strcmp(temp_service->description, service_description)) { return 0; } /* If a check timeperiod was specified, skip this service if it does not have the check timeperiod specified */ if(NULL != check_timeperiod && (check_timeperiod != temp_service->check_period_ptr)) { return 0; } /* If a notification timeperiod was specified, skip this service if it does not have the notification timeperiod specified */ if(NULL != notification_timeperiod && (notification_timeperiod != temp_service->notification_period_ptr)) { return 0; } /* If a check command was specified, skip this service if it does not have the check command specified */ if(NULL != check_command && (check_command != temp_service->check_command_ptr)) { return 0; } /* If a event handler was specified, skip this service if it does not have the event handler specified */ if(NULL != event_handler && (event_handler != temp_service->event_handler_ptr)) { return 0; } /* If a parent service was specified... */ if(NULL != parent_service_name) { /* If the parent service is "none", skip this service if it has parentren */ if(!strcmp(parent_service_name,"none")) { if(NULL != temp_service->parents) { return 0; } } /* Otherwise, skip this service if it does not have the specified service as a parent */ else { int found = 0; for(temp_servicesmember = temp_service->parents; temp_servicesmember != NULL; temp_servicesmember = temp_servicesmember->next) { if(!strcmp(temp_servicesmember->service_description, parent_service_name)) { found = 1; } } if(0 == found) { return 0; } } } /* If a child service was specified... */ if(NULL != child_service_name) { /* If the child service is "none", skip this service if it has children */ if(!strcmp(child_service_name,"none")) { if(NULL != temp_service->children) { return 0; } } /* Otherwise, skip this service if it does not have the specified service as a child */ else { int found = 0; for(temp_servicesmember = temp_service->children; temp_servicesmember != NULL; temp_servicesmember = temp_servicesmember->next) { if(!strcmp(temp_servicesmember->service_description, child_service_name)) { found = 1; } } if(0 == found) { return 0; } } } return 1; } json_object *json_status_service_selectors(unsigned format_options, int start, int count, int use_parent_host, host *parent_host, int use_child_host, host *child_host, hostgroup *temp_hostgroup, host *match_host, servicegroup *temp_servicegroup, int host_statuses, int service_statuses, contact *temp_contact, int time_field, time_t start_time, time_t end_time, char *service_description, char *parent_service_name, char *child_service_name, contactgroup *temp_contactgroup, timeperiod *check_timeperiod, timeperiod *notification_timeperiod, command *check_command, command *event_handler) { json_object *json_selectors; json_selectors = json_new_object(); if( start > 0) { json_object_append_integer(json_selectors, "start", start); } if( count > 0) { json_object_append_integer(json_selectors, "count", count); } if( 1 == use_parent_host) { json_object_append_string(json_selectors, "parenthost", &percent_escapes, ( NULL == parent_host ? "none" : parent_host->name)); } if( 1 == use_child_host) { json_object_append_string(json_selectors, "childhost", &percent_escapes, ( NULL == child_host ? "none" : child_host->name)); } if( NULL != temp_hostgroup) { json_object_append_string(json_selectors, "hostgroup", &percent_escapes, temp_hostgroup->group_name); } if( NULL != temp_servicegroup) { json_object_append_string(json_selectors, "servicegroup", &percent_escapes, temp_servicegroup->group_name); } if(HOST_STATUS_ALL != host_statuses) { json_bitmask(json_selectors, format_options, "host_status", host_statuses, svm_host_statuses); } if(SERVICE_STATUS_ALL != service_statuses) { json_bitmask(json_selectors, format_options, "service_status", service_statuses, svm_service_statuses); } if(NULL != temp_contact) { json_object_append_string(json_selectors, "contact",&percent_escapes, temp_contact->name); } if(NULL != temp_contactgroup) { json_object_append_string(json_selectors, "contactgroup", &percent_escapes, temp_contactgroup->group_name); } if(time_field > 0) { json_enumeration(json_selectors, format_options, "servicetimefield", time_field, svm_service_time_fields); } if(start_time > 0) { json_object_append_time_t(json_selectors, "starttime", start_time); } if(end_time > 0) { json_object_append_time_t(json_selectors, "endtime", end_time); } if(NULL != service_description) { json_object_append_string(json_selectors, "servicedescription", &percent_escapes, service_description); } if( NULL != parent_service_name) { json_object_append_string(json_selectors, "parentservice", &percent_escapes, parent_service_name); } if( NULL != child_service_name) { json_object_append_string(json_selectors, "childservice", &percent_escapes, child_service_name); } if( NULL != check_timeperiod) { json_object_append_string(json_selectors, "checktimeperiod", &percent_escapes, check_timeperiod->name); } if( NULL != notification_timeperiod) { json_object_append_string(json_selectors, "servicenotificationtimeperiod", &percent_escapes, notification_timeperiod->name); } if( NULL != check_command) { json_object_append_string(json_selectors, "checkcommand", &percent_escapes, check_command->name); } if( NULL != event_handler) { json_object_append_string(json_selectors, "eventhandler", &percent_escapes, event_handler->name); } return json_selectors; } json_object *json_status_servicecount(unsigned format_options, host *match_host, int use_parent_host, host *parent_host, int use_child_host, host *child_host, hostgroup *temp_hostgroup, servicegroup *temp_servicegroup, int host_statuses, int service_statuses, contact *temp_contact, int time_field, time_t start_time, time_t end_time, char *service_description, char *parent_service_name, char *child_service_name, contactgroup *temp_contactgroup, timeperiod *check_timeperiod, timeperiod *notification_timeperiod, command *check_command, command *event_handler) { json_object *json_data; json_object *json_count; host *temp_host; service *temp_service; servicestatus *temp_servicestatus; int ok = 0; int warning = 0; int critical = 0; int unknown = 0; int pending = 0; json_data = json_new_object(); json_object_append_object(json_data, "selectors", json_status_service_selectors(format_options, 0, 0, use_parent_host, parent_host, use_child_host, child_host, temp_hostgroup, match_host, temp_servicegroup, host_statuses, service_statuses, temp_contact, time_field, start_time, end_time, service_description, parent_service_name, child_service_name, temp_contactgroup, check_timeperiod, notification_timeperiod, check_command, event_handler)); json_count = json_new_object(); for(temp_service = service_list; temp_service != NULL; temp_service = temp_service->next) { temp_host = find_host(temp_service->host_name); if(NULL == temp_host) { continue; } if(!json_status_service_passes_host_selection(temp_host, use_parent_host, parent_host, use_child_host, child_host, temp_hostgroup, match_host, host_statuses)) { continue; } /* Get the service status. If we cannot get the status of the service, skip it. This should probably return an error and doing so is in the todo list. */ temp_servicestatus = find_servicestatus(temp_service->host_name, temp_service->description); if( NULL == temp_servicestatus) { continue; } if(!json_status_service_passes_service_selection(temp_service, temp_servicegroup, temp_contact, temp_servicestatus, time_field, start_time, end_time, service_description, parent_service_name, child_service_name, temp_contactgroup, check_timeperiod, notification_timeperiod, check_command, event_handler)) { continue; } /* Count the services in each state */ switch(temp_servicestatus->status) { case SERVICE_PENDING: pending++; break; case SERVICE_OK: ok++; break; case SERVICE_WARNING: warning++; break; case SERVICE_CRITICAL: critical++; break; case SERVICE_UNKNOWN: unknown++; break; } } if( service_statuses & SERVICE_OK) json_object_append_integer(json_count, "ok", ok); if( service_statuses & SERVICE_WARNING) json_object_append_integer(json_count, "warning", warning); if( service_statuses & SERVICE_CRITICAL) json_object_append_integer(json_count, "critical", critical); if( service_statuses & SERVICE_UNKNOWN) json_object_append_integer(json_count, "unknown", unknown); if( service_statuses & SERVICE_PENDING) json_object_append_integer(json_count, "pending", pending); json_object_append_object(json_data, "count", json_count); return json_data; } json_object *json_status_servicelist(unsigned format_options, int start, int count, int details, host *match_host, int use_parent_host, host *parent_host, int use_child_host, host *child_host, hostgroup *temp_hostgroup, servicegroup *temp_servicegroup, int host_statuses, int service_statuses, contact *temp_contact, int time_field, time_t start_time, time_t end_time, char *service_description, char *parent_service_name, char *child_service_name, contactgroup *temp_contactgroup, timeperiod *check_timeperiod, timeperiod *notification_timeperiod, command *check_command, command *event_handler) { json_object *json_data; json_object *json_hostlist; json_object *json_servicelist; json_object *json_service_details; host *temp_host; service *temp_service; servicestatus *temp_servicestatus; int current = 0; int counted = 0; int service_count; /* number of services on a host */ json_data = json_new_object(); json_object_append_object(json_data, "selectors", json_status_service_selectors(format_options, start, count, use_parent_host, parent_host, use_child_host, child_host, temp_hostgroup, match_host, temp_servicegroup, host_statuses, service_statuses, temp_contact, time_field, start_time, end_time, service_description, parent_service_name, child_service_name, temp_contactgroup, check_timeperiod, notification_timeperiod, check_command, event_handler)); json_hostlist = json_new_object(); for(temp_host = host_list; temp_host != NULL; temp_host = temp_host->next) { if(json_status_service_passes_host_selection(temp_host, use_parent_host, parent_host, use_child_host, child_host, temp_hostgroup, match_host, host_statuses) == 0) { continue; } json_servicelist = json_new_object(); service_count = 0; for(temp_service = service_list; temp_service != NULL; temp_service = temp_service->next) { /* If this service isn't on the host we're currently working with, skip it */ if( strcmp( temp_host->name, temp_service->host_name)) continue; /* Get the service status. If we cannot get the status of the service, skip it. This should probably return an error and doing so is in the todo list. */ temp_servicestatus = find_servicestatus(temp_service->host_name, temp_service->description); if( NULL == temp_servicestatus) { continue; } if(json_status_service_passes_service_selection(temp_service, temp_servicegroup, temp_contact, temp_servicestatus, time_field, start_time, end_time, service_description, parent_service_name, child_service_name, temp_contactgroup, check_timeperiod, notification_timeperiod, check_command, event_handler) == 0) { continue; } /* If the status of the service does not match one of the status the user requested, skip the service */ if(!(temp_servicestatus->status & service_statuses)) { continue; } service_count++; /* If the current item passes the start and limit tests, display it */ if( passes_start_and_count_limits(start, count, current, counted)) { if( details > 0) { json_service_details = json_new_object(); json_status_service_details(json_service_details, format_options, temp_service, temp_servicestatus); json_object_append_object(json_servicelist, temp_service->description, json_service_details); } else { json_enumeration(json_servicelist, format_options, temp_service->description, temp_servicestatus->status, svm_service_statuses); } counted++; } current++; } if( service_count > 0) { json_object_append_object(json_hostlist, temp_host->name, json_servicelist); } } json_object_append_object(json_data, "servicelist", json_hostlist); return json_data; } json_object *json_status_service(unsigned format_options, service *temp_service, servicestatus *temp_servicestatus) { json_object *json_service = json_new_object(); json_object *json_details = json_new_object(); json_object_append_string(json_details, "host_name", &percent_escapes, temp_service->host_name); json_object_append_string(json_details, "description", &percent_escapes, temp_service->description); json_status_service_details(json_details, format_options, temp_service, temp_servicestatus); json_object_append_object(json_service, "service", json_details); return json_service; } void json_status_service_details(json_object *json_details, unsigned format_options, service *temp_service, servicestatus *temp_servicestatus) { json_object_append_string(json_details, "host_name", &percent_escapes, temp_service->host_name); json_object_append_string(json_details, "description", &percent_escapes, temp_service->description); json_object_append_string(json_details, "plugin_output", &percent_escapes, temp_servicestatus->plugin_output); json_object_append_string(json_details, "long_plugin_output", &percent_escapes, temp_servicestatus->long_plugin_output); json_object_append_string(json_details, "perf_data", &percent_escapes, temp_servicestatus->perf_data); json_object_append_integer(json_details, "max_attempts", temp_servicestatus->max_attempts); json_object_append_integer(json_details, "current_attempt", temp_servicestatus->current_attempt); json_enumeration(json_details, format_options, "status", temp_servicestatus->status, svm_service_statuses); json_object_append_time_t(json_details, "last_update", temp_servicestatus->last_update); json_object_append_boolean(json_details, "has_been_checked", temp_servicestatus->has_been_checked); json_object_append_boolean(json_details, "should_be_scheduled", temp_servicestatus->should_be_scheduled); json_object_append_time_t(json_details, "last_check", temp_servicestatus->last_check); json_bitmask(json_details, format_options, "check_options", temp_servicestatus->check_options, svm_check_options); json_enumeration(json_details, format_options, "check_type", temp_servicestatus->check_type, svm_service_check_types); json_object_append_boolean(json_details, "checks_enabled", temp_servicestatus->checks_enabled); json_object_append_time_t(json_details, "last_state_change", temp_servicestatus->last_state_change); json_object_append_time_t(json_details, "last_hard_state_change", temp_servicestatus->last_hard_state_change); json_enumeration(json_details, format_options, "last_hard_state", temp_servicestatus->last_hard_state, svm_service_states); json_object_append_time_t(json_details, "last_time_ok", temp_servicestatus->last_time_ok); json_object_append_time_t(json_details, "last_time_warning", temp_servicestatus->last_time_warning); json_object_append_time_t(json_details, "last_time_unknown", temp_servicestatus->last_time_unknown); json_object_append_time_t(json_details, "last_time_critical", temp_servicestatus->last_time_critical); json_enumeration(json_details, format_options, "state_type", temp_servicestatus->state_type, svm_state_types); json_object_append_time_t(json_details, "last_notification", temp_servicestatus->last_notification); json_object_append_time_t(json_details, "next_notification", temp_servicestatus->next_notification); json_object_append_time_t(json_details, "next_check", temp_servicestatus->next_check); json_object_append_boolean(json_details, "no_more_notifications", temp_servicestatus->no_more_notifications); json_object_append_boolean(json_details, "notifications_enabled", temp_servicestatus->notifications_enabled); json_object_append_boolean(json_details, "problem_has_been_acknowledged", temp_servicestatus->problem_has_been_acknowledged); json_enumeration(json_details, format_options, "acknowledgement_type", temp_servicestatus->acknowledgement_type, svm_acknowledgement_types); json_object_append_integer(json_details, "current_notification_number", temp_servicestatus->current_notification_number); #ifdef JSON_NAGIOS_4X json_object_append_boolean(json_details, "accept_passive_checks", temp_servicestatus->accept_passive_checks); #else json_object_append_boolean(json_details, "accept_passive_service_checks", temp_servicestatus->accept_passive_service_checks); #endif json_object_append_boolean(json_details, "event_handler_enabled", temp_servicestatus->event_handler_enabled); json_object_append_boolean(json_details, "flap_detection_enabled", temp_servicestatus->flap_detection_enabled); json_object_append_boolean(json_details, "is_flapping", temp_servicestatus->is_flapping); json_object_append_real(json_details, "percent_state_change", temp_servicestatus->percent_state_change); json_object_append_real(json_details, "latency", temp_servicestatus->latency); json_object_append_real(json_details, "execution_time", temp_servicestatus->execution_time); json_object_append_integer(json_details, "scheduled_downtime_depth", temp_servicestatus->scheduled_downtime_depth); #ifndef JSON_NAGIOS_4X json_object_append_boolean(json_details, "failure_prediction_enabled", temp_servicestatus->failure_prediction_enabled); #endif json_object_append_boolean(json_details, "process_performance_data", temp_servicestatus->process_performance_data); #ifdef JSON_NAGIOS_4X json_object_append_boolean(json_details, "obsess", temp_servicestatus->obsess); #else json_object_append_boolean(json_details, "obsess_over_service", temp_servicestatus->obsess_over_service); #endif } int json_status_comment_passes_selection(nagios_comment *temp_comment, int time_field, time_t start_time, time_t end_time, unsigned comment_types, unsigned entry_types, unsigned persistence, unsigned expiring, char *host_name, char *service_description) { switch(time_field) { case STATUS_TIME_INVALID: break; case STATUS_TIME_ENTRY_TIME: if((start_time > 0) && (temp_comment->entry_time < start_time)) { return 0; } if((end_time > 0) && (temp_comment->entry_time > end_time)) { return 0; } break; case STATUS_TIME_EXPIRE_TIME: if((start_time > 0) && (temp_comment->expire_time < start_time)) { return 0; } if((end_time > 0) && (temp_comment->expire_time > end_time)) { return 0; } break; default: return 0; } if(comment_types != COMMENT_TYPE_ALL) { switch(temp_comment->comment_type) { case HOST_COMMENT: if(!(comment_types & COMMENT_TYPE_HOST)) { return 0; } break; case SERVICE_COMMENT: if(!(comment_types & COMMENT_TYPE_SERVICE)) { return 0; } break; } } if(entry_types != COMMENT_ENTRY_ALL) { switch(temp_comment->entry_type) { case USER_COMMENT: if(!(entry_types & COMMENT_ENTRY_USER)) { return 0; } break; case DOWNTIME_COMMENT: if(!(entry_types & COMMENT_ENTRY_DOWNTIME)) { return 0; } break; case FLAPPING_COMMENT: if(!(entry_types & COMMENT_ENTRY_FLAPPING)) { return 0; } break; case ACKNOWLEDGEMENT_COMMENT: if(!(entry_types & COMMENT_ENTRY_ACKNOWLEDGEMENT)) { return 0; } break; } } if(persistence != BOOLEAN_EITHER) { switch(temp_comment->persistent) { case 0: /* false */ if(!(persistence & BOOLEAN_FALSE)) { return 0; } break; case 1: /* true */ if(!(persistence & BOOLEAN_TRUE)) { return 0; } break; } } if(expiring != BOOLEAN_EITHER) { switch(temp_comment->expires) { case 0: /* false */ if(!(expiring & BOOLEAN_FALSE)) { return 0; } break; case 1: /* true */ if(!(expiring & BOOLEAN_TRUE)) { return 0; } break; } } if(NULL != host_name) { if((NULL == temp_comment->host_name) || strcmp(temp_comment->host_name, host_name)) { return 0; } } if(NULL != service_description) { if((NULL == temp_comment->service_description) || strcmp(temp_comment->service_description, service_description)) { return 0; } } return 1; } json_object *json_status_comment_selectors(unsigned format_options, int start, int count, int time_field, time_t start_time, time_t end_time, unsigned comment_types, unsigned entry_types, unsigned persistence, unsigned expiring, char *host_name, char *service_description) { json_object *json_selectors; json_selectors = json_new_object(); if( start > 0) { json_object_append_integer(json_selectors, "start", start); } if( count > 0) { json_object_append_integer(json_selectors, "count", count); } if(time_field > 0) { json_enumeration(json_selectors, format_options, "commenttimefield", time_field, svm_comment_time_fields); } if(start_time > 0) { json_object_append_time_t(json_selectors, "starttime", start_time); } if(end_time > 0) { json_object_append_time_t(json_selectors, "endtime", end_time); } if(comment_types != COMMENT_TYPE_ALL) { json_bitmask(json_selectors, format_options, "commenttypes", comment_types, svm_valid_comment_types); } if(entry_types != COMMENT_ENTRY_ALL) { json_bitmask(json_selectors, format_options, "entrytypes", entry_types, svm_valid_comment_entry_types); } if(persistence != BOOLEAN_EITHER) { json_bitmask(json_selectors, format_options, "persistence", persistence, svm_valid_persistence); } if(expiring != BOOLEAN_EITHER) { json_bitmask(json_selectors, format_options, "expiring", expiring, svm_valid_expiration); } if(NULL != host_name) { json_object_append_string(json_selectors, "hostname", &percent_escapes, host_name); } if(NULL != service_description) { json_object_append_string(json_selectors, "servicedescription", &percent_escapes, service_description); } return json_selectors; } json_object *json_status_commentcount(unsigned format_options, int time_field, time_t start_time, time_t end_time, unsigned comment_types, unsigned entry_types, unsigned persistence, unsigned expiring, char *host_name, char *service_description) { json_object *json_data; nagios_comment *temp_comment; int count = 0; json_data = json_new_object(); json_object_append_object(json_data, "selectors", json_status_comment_selectors(format_options, 0, 0, time_field, start_time, end_time, comment_types, entry_types, persistence, expiring, host_name, service_description)); for(temp_comment = comment_list; temp_comment != NULL; temp_comment = temp_comment->next) { if(json_status_comment_passes_selection(temp_comment, time_field, start_time, end_time, comment_types, entry_types, persistence, expiring, host_name, service_description) == 0) { continue; } count++; } json_object_append_integer(json_data, "count", count); return json_data; } json_object *json_status_commentlist(unsigned format_options, int start, int count, int details, int time_field, time_t start_time, time_t end_time, unsigned comment_types, unsigned entry_types, unsigned persistence, unsigned expiring, char *host_name, char *service_description) { json_object *json_data; json_object *json_commentlist_object = NULL; json_object *json_commentlist_array = NULL; json_object *json_comment_details; nagios_comment *temp_comment; int current = 0; int counted = 0; char *buf; json_data = json_new_object(); json_object_append_object(json_data, "selectors", json_status_comment_selectors(format_options, start, count, time_field, start_time, end_time, comment_types, entry_types, persistence, expiring, host_name, service_description)); if(details > 0) { json_commentlist_object = json_new_object(); } else { json_commentlist_array = json_new_array(); } for(temp_comment = comment_list; temp_comment != NULL; temp_comment = temp_comment->next) { if(json_status_comment_passes_selection(temp_comment, time_field, start_time, end_time, comment_types, entry_types, persistence, expiring, host_name, service_description) == 0) { continue; } /* If the current item passes the start and limit tests, display it */ if( passes_start_and_count_limits(start, count, current, counted)) { if( details > 0) { asprintf(&buf, "%lu", temp_comment->comment_id); json_comment_details = json_new_object(); json_status_comment_details(json_comment_details, format_options, temp_comment); json_object_append_object(json_commentlist_object, buf, json_comment_details); } else { json_array_append_integer(json_commentlist_array, temp_comment->comment_id); } counted++; } current++; } if(details > 0) { json_object_append_object(json_data, "commentlist", json_commentlist_object); } else { json_object_append_array(json_data, "commentlist", json_commentlist_array); } return json_data; } json_object *json_status_comment(unsigned format_options, nagios_comment *temp_comment) { json_object *json_comment = json_new_object(); json_object *json_details = json_new_object(); json_object_append_integer(json_details, "comment_id", temp_comment->comment_id); json_status_comment_details(json_details, format_options, temp_comment); json_object_append_object(json_comment, "comment", json_details); return json_comment; } void json_status_comment_details(json_object *json_details, unsigned format_options, nagios_comment *temp_comment) { json_object_append_integer(json_details, "comment_id", temp_comment->comment_id); json_enumeration(json_details, format_options, "comment_type", temp_comment->comment_type, svm_comment_types); json_enumeration(json_details, format_options, "entry_type", temp_comment->entry_type, svm_comment_entry_types); json_object_append_integer(json_details, "source", temp_comment->source); json_object_append_boolean(json_details, "persistent", temp_comment->persistent); json_object_append_time_t(json_details, "entry_time", temp_comment->entry_time); json_object_append_boolean(json_details, "expires", temp_comment->expires); json_object_append_time_t(json_details, "expire_time", temp_comment->expire_time); json_object_append_string(json_details, "host_name", &percent_escapes, temp_comment->host_name); if(SERVICE_COMMENT == temp_comment->comment_type) { json_object_append_string(json_details, "service_description", &percent_escapes, temp_comment->service_description); } json_object_append_string(json_details, "author", &percent_escapes, temp_comment->author); json_object_append_string(json_details, "comment_data", &percent_escapes, temp_comment->comment_data); } int json_status_downtime_passes_selection(scheduled_downtime *temp_downtime, int time_field, time_t start_time, time_t end_time, unsigned object_types, unsigned downtime_types, unsigned triggered, int triggered_by, unsigned in_effect, char *host_name, char *service_description) { switch(time_field) { case STATUS_TIME_INVALID: break; case STATUS_TIME_ENTRY_TIME: if((start_time > 0) && (temp_downtime->entry_time < start_time)) { return 0; } if((end_time > 0) && (temp_downtime->entry_time > end_time)) { return 0; } break; case STATUS_TIME_START_TIME: if((start_time > 0) && (temp_downtime->start_time < start_time)) { return 0; } if((end_time > 0) && (temp_downtime->start_time > end_time)) { return 0; } break; case STATUS_TIME_FLEX_DOWNTIME_START: if((start_time > 0) && (temp_downtime->flex_downtime_start < start_time)) { return 0; } if((end_time > 0) && (temp_downtime->flex_downtime_start > end_time)) { return 0; } break; case STATUS_TIME_END_TIME: if((start_time > 0) && (temp_downtime->end_time < start_time)) { return 0; } if((end_time > 0) && (temp_downtime->end_time > end_time)) { return 0; } break; default: return 0; } if(object_types != DOWNTIME_OBJECT_TYPE_ALL) { switch(temp_downtime->type) { case HOST_DOWNTIME: if(!(object_types & DOWNTIME_OBJECT_TYPE_HOST)) { return 0; } break; case SERVICE_DOWNTIME: if(!(object_types & DOWNTIME_OBJECT_TYPE_SERVICE)) { return 0; } break; } } if(downtime_types != DOWNTIME_TYPE_ALL) { if(temp_downtime->fixed) { if(!(downtime_types & DOWNTIME_TYPE_FIXED)) { return 0; } } else { if(!(downtime_types & DOWNTIME_TYPE_FLEXIBLE)) { return 0; } } } if(triggered != BOOLEAN_EITHER) { if(0 == temp_downtime->triggered_by) { if(!(triggered & BOOLEAN_FALSE)) { return 0; } } else { if(!(triggered & BOOLEAN_TRUE)) { return 0; } } } if(triggered_by != -1) { if(temp_downtime->triggered_by != (unsigned long)triggered_by) { return 0; } } if(in_effect != BOOLEAN_EITHER) { if(0 == temp_downtime->is_in_effect) { if(!(in_effect & BOOLEAN_FALSE)) { return 0; } } else { if(!(in_effect & BOOLEAN_TRUE)) { return 0; } } } if(NULL != host_name) { if((NULL == temp_downtime->host_name) || strcmp(temp_downtime->host_name, host_name)) { return 0; } } if(NULL != service_description) { if((NULL == temp_downtime->service_description) || strcmp(temp_downtime->service_description, service_description)) { return 0; } } return 1; } json_object *json_status_downtime_selectors(unsigned format_options, int start, int count, int time_field, time_t start_time, time_t end_time, unsigned object_types, unsigned downtime_types, unsigned triggered, int triggered_by, unsigned in_effect, char *host_name, char *service_description) { json_object *json_selectors; json_selectors = json_new_object(); if( start > 0) { json_object_append_integer(json_selectors, "start", start); } if( count > 0) { json_object_append_integer(json_selectors, "count", count); } if(time_field > 0) { json_enumeration(json_selectors, format_options, "downtimetimefield", time_field, svm_downtime_time_fields); } if(start_time > 0) { json_object_append_time_t(json_selectors, "starttime", start_time); } if(end_time > 0) { json_object_append_time_t(json_selectors, "endtime", end_time); } if(object_types != DOWNTIME_OBJECT_TYPE_ALL) { json_bitmask(json_selectors, format_options, "downtimeobjecttypes", object_types, svm_valid_downtime_object_types); } if(downtime_types != DOWNTIME_TYPE_ALL) { json_bitmask(json_selectors, format_options, "downtimetypes", downtime_types, svm_valid_downtime_types); } if(triggered != BOOLEAN_EITHER) { json_bitmask(json_selectors, format_options, "triggered", triggered, svm_valid_triggered_status); } if(triggered_by != -1) { json_object_append_integer(json_selectors, "triggeredby", triggered_by); } if(in_effect != BOOLEAN_EITHER) { json_bitmask(json_selectors, format_options, "ineffect", in_effect, svm_valid_in_effect_status); } if(NULL != host_name) { json_object_append_string(json_selectors, "hostname", &percent_escapes, host_name); } if(NULL != service_description) { json_object_append_string(json_selectors, "servicedescription", &percent_escapes, service_description); } return json_selectors; } json_object *json_status_downtimecount(unsigned format_options, int time_field, time_t start_time, time_t end_time, unsigned object_types, unsigned downtime_types, unsigned triggered, int triggered_by, unsigned in_effect, char *host_name, char *service_description) { json_object *json_data; scheduled_downtime *temp_downtime; int count = 0; json_data = json_new_object(); json_object_append_object(json_data, "selectors", json_status_downtime_selectors(format_options, 0, 0, time_field, start_time, end_time, object_types, downtime_types, triggered, triggered_by, in_effect, host_name, service_description)); for(temp_downtime = scheduled_downtime_list; temp_downtime != NULL; temp_downtime = temp_downtime->next) { if(!json_status_downtime_passes_selection(temp_downtime, time_field, start_time, end_time, object_types, downtime_types, triggered, triggered_by, in_effect, host_name, service_description)) { continue; } count++; } json_object_append_integer(json_data, "count", count); return json_data; } json_object *json_status_downtimelist(unsigned format_options, int start, int count, int details, int time_field, time_t start_time, time_t end_time, unsigned object_types, unsigned downtime_types, unsigned triggered, int triggered_by, unsigned in_effect, char *host_name, char *service_description) { json_object *json_data; json_object *json_downtimelist_object = NULL; json_object *json_downtimelist_array = NULL; json_object *json_downtime_details; scheduled_downtime *temp_downtime; int current = 0; int counted = 0; char *buf; json_data = json_new_object(); json_object_append_object(json_data, "selectors", json_status_downtime_selectors(format_options, start, count, time_field, start_time, end_time, object_types, downtime_types, triggered, triggered_by, in_effect, host_name, service_description)); if(details > 0) { json_downtimelist_object = json_new_object(); } else { json_downtimelist_array = json_new_array(); } for(temp_downtime = scheduled_downtime_list; temp_downtime != NULL; temp_downtime = temp_downtime->next) { if(!json_status_downtime_passes_selection(temp_downtime, time_field, start_time, end_time, object_types, downtime_types, triggered, triggered_by, in_effect, host_name, service_description)) { continue; } /* If the current item passes the start and limit tests, display it */ if( passes_start_and_count_limits(start, count, current, counted)) { if( details > 0) { asprintf(&buf, "%lu", temp_downtime->downtime_id); json_downtime_details = json_new_object(); json_status_downtime_details(json_downtime_details, format_options, temp_downtime); json_object_append_object(json_downtimelist_object, buf, json_downtime_details); } else { json_array_append_integer(json_downtimelist_array, temp_downtime->downtime_id); } counted++; } current++; } if(details > 0) { json_object_append_object(json_data, "downtimelist", json_downtimelist_object); } else { json_object_append_array(json_data, "downtimelist", json_downtimelist_array); } return json_data; } json_object *json_status_downtime(unsigned format_options, scheduled_downtime *temp_downtime) { json_object *json_downtime = json_new_object(); json_object *json_details = json_new_object(); json_object_append_integer(json_details, "downtime_id", temp_downtime->downtime_id); json_status_downtime_details(json_details, format_options, temp_downtime); json_object_append_object(json_downtime, "downtime", json_details); return json_downtime; } void json_status_downtime_details(json_object *json_details, unsigned format_options, scheduled_downtime *temp_downtime) { json_object_append_integer(json_details, "downtime_id", temp_downtime->downtime_id); json_enumeration(json_details, format_options, "type", temp_downtime->type, svm_downtime_types); json_object_append_string(json_details, "host_name", &percent_escapes, temp_downtime->host_name); if(SERVICE_DOWNTIME == temp_downtime->type) { json_object_append_string(json_details, "service_description", &percent_escapes, temp_downtime->service_description); } json_object_append_time_t(json_details, "entry_time", temp_downtime->entry_time); json_object_append_time_t(json_details, "start_time", temp_downtime->start_time); json_object_append_time_t(json_details, "flex_downtime_start", temp_downtime->flex_downtime_start); json_object_append_time_t(json_details, "end_time", temp_downtime->end_time); json_object_append_boolean(json_details, "fixed", temp_downtime->fixed); json_object_append_integer(json_details, "triggered_by", (int)temp_downtime->triggered_by); json_object_append_integer(json_details, "duration", (int)temp_downtime->duration); json_object_append_boolean(json_details, "is_in_effect", temp_downtime->is_in_effect); json_object_append_boolean(json_details, "start_notification_sent", temp_downtime->start_notification_sent); json_object_append_string(json_details, "author", &percent_escapes, temp_downtime->author); json_object_append_string(json_details, "comment", &percent_escapes, temp_downtime->comment); } json_object *json_status_program(unsigned format_options) { json_object *json_data; json_object *json_status; json_data = json_new_object(); json_status = json_new_object(); #if 0 json_object_append_unsigned(json_status, "modified_host_attributes", (unsigned long long)modified_host_process_attributes); json_object_append_unsigned(json_status, "modified_service_process_attributes", (unsigned long long)modified_service_process_attributes); #endif json_object_append_string(json_status, "version", NULL, PROGRAM_VERSION); json_object_append_integer(json_status, "nagios_pid", nagios_pid); json_object_append_boolean(json_status, "daemon_mode", daemon_mode); json_object_append_time_t(json_status, "program_start", program_start); #ifndef JSON_NAGIOS_4X json_object_append_time_t(json_status, "last_command_check", last_command_check); #endif json_object_append_time_t(json_status, "last_log_rotation", last_log_rotation); json_object_append_boolean(json_status, "enable_notifications", enable_notifications); json_object_append_boolean(json_status, "execute_service_checks", execute_service_checks); json_object_append_boolean(json_status, "accept_passive_service_checks", accept_passive_service_checks); json_object_append_boolean(json_status, "execute_host_checks", execute_host_checks); json_object_append_boolean(json_status, "accept_passive_host_checks", accept_passive_host_checks); json_object_append_boolean(json_status, "enable_event_handlers", enable_event_handlers); json_object_append_boolean(json_status, "obsess_over_services", obsess_over_services); json_object_append_boolean(json_status, "obsess_over_hosts", obsess_over_hosts); json_object_append_boolean(json_status, "check_service_freshness", check_service_freshness); json_object_append_boolean(json_status, "check_host_freshness", check_host_freshness); json_object_append_boolean(json_status, "enable_flap_detection", enable_flap_detection); #ifndef JSON_NAGIOS_4X json_object_append_boolean(json_status, "enable_failure_prediction", enable_failure_prediction); #endif json_object_append_boolean(json_status, "process_performance_data", process_performance_data); #if 0 json_object_append_string(json_status, "global_host_event_handler", &percent_escapes, global_host_event_handler); json_object_append_string(json_status, "global_service_event_handler", &percent_escapes, global_service_event_handler); json_object_append_unsigned(json_status, "next_comment_id", (unsigned long long)next_comment_id); json_object_append_unsigned(json_status, "next_downtime_id", (unsigned long long)next_downtime_id); json_object_append_unsigned(json_status, "next_event_id", (unsigned long long)next_event_id); json_object_append_unsigned(json_status, "next_problem_id", (unsigned long long)next_problem_id); json_object_append_unsigned(json_status, "next_notification_id", (unsigned long long)next_notification_id); json_object_append_unsigned(json_status, "total_external_command_buffer_slots", (unsigned long long)external_command_buffer_slots); json_object_append_unsigned(json_status, "used_external_command_buffer_slots", (unsigned long long)used_external_command_buffer_slots); json_object_append_unsigned(json_status, "high_external_command_buffer_slots", (unsigned long long)high_external_command_buffer_slots); json_object_append_string(json_status, "active_scheduled_host_check_stats", NULL, "%d,%d,%d", check_statistics[ACTIVE_SCHEDULED_HOST_CHECK_STATS].minute_stats[0], check_statistics[ACTIVE_SCHEDULED_HOST_CHECK_STATS].minute_stats[1], check_statistics[ACTIVE_SCHEDULED_HOST_CHECK_STATS].minute_stats[2]); json_object_append_string(json_status, "active_ondemand_host_check_stats", NULL, "%d,%d,%d", check_statistics[ACTIVE_ONDEMAND_HOST_CHECK_STATS].minute_stats[0], check_statistics[ACTIVE_ONDEMAND_HOST_CHECK_STATS].minute_stats[1], check_statistics[ACTIVE_ONDEMAND_HOST_CHECK_STATS].minute_stats[2]); json_object_append_string(json_status, "passive_host_check_stats", NULL, "%d,%d,%d", check_statistics[PASSIVE_HOST_CHECK_STATS].minute_stats[0], check_statistics[PASSIVE_HOST_CHECK_STATS].minute_stats[1], check_statistics[PASSIVE_HOST_CHECK_STATS].minute_stats[2]); json_object_append_string(json_status, "active_scheduled_service_check_stats", NULL, "%d,%d,%d", check_statistics[ACTIVE_SCHEDULED_SERVICE_CHECK_STATS].minute_stats[0], check_statistics[ACTIVE_SCHEDULED_SERVICE_CHECK_STATS].minute_stats[1], check_statistics[ACTIVE_SCHEDULED_SERVICE_CHECK_STATS].minute_stats[2]); json_object_append_string(json_status, "active_ondemand_service_check_stats", NULL, "%d,%d,%d", check_statistics[ACTIVE_ONDEMAND_SERVICE_CHECK_STATS].minute_stats[0], check_statistics[ACTIVE_ONDEMAND_SERVICE_CHECK_STATS].minute_stats[1], check_statistics[ACTIVE_ONDEMAND_SERVICE_CHECK_STATS].minute_stats[2]); json_object_append_string(json_status, "passive_service_check_stats", NULL, "%d,%d,%d", check_statistics[PASSIVE_SERVICE_CHECK_STATS].minute_stats[0], check_statistics[PASSIVE_SERVICE_CHECK_STATS].minute_stats[1], check_statistics[PASSIVE_SERVICE_CHECK_STATS].minute_stats[2]); json_object_append_string(json_status, "cached_host_check_stats", NULL, "%d,%d,%d", check_statistics[ACTIVE_CACHED_HOST_CHECK_STATS].minute_stats[0], check_statistics[ACTIVE_CACHED_HOST_CHECK_STATS].minute_stats[1], check_statistics[ACTIVE_CACHED_HOST_CHECK_STATS].minute_stats[2]); json_object_append_string(json_status, "cached_service_check_stats", NULL, "%d,%d,%d", check_statistics[ACTIVE_CACHED_SERVICE_CHECK_STATS].minute_stats[0], check_statistics[ACTIVE_CACHED_SERVICE_CHECK_STATS].minute_stats[1], check_statistics[ACTIVE_CACHED_SERVICE_CHECK_STATS].minute_stats[2]); json_object_append_string(json_status, "external_command_stats", NULL, "%d,%d,%d", check_statistics[EXTERNAL_COMMAND_STATS].minute_stats[0], check_statistics[EXTERNAL_COMMAND_STATS].minute_stats[1], check_statistics[EXTERNAL_COMMAND_STATS].minute_stats[2]); json_object_append_string(json_status, "parallel_host_check_stats", NULL, "%d,%d,%d", check_statistics[PARALLEL_HOST_CHECK_STATS].minute_stats[0], check_statistics[PARALLEL_HOST_CHECK_STATS].minute_stats[1], check_statistics[PARALLEL_HOST_CHECK_STATS].minute_stats[2]); json_object_append_string(json_status, "serial_host_check_stats", NULL, "%d,%d,%d", check_statistics[SERIAL_HOST_CHECK_STATS].minute_stats[0], check_statistics[SERIAL_HOST_CHECK_STATS].minute_stats[1], check_statistics[SERIAL_HOST_CHECK_STATS].minute_stats[2]); #endif json_object_append_object(json_data, "programstatus", json_status); return json_data; } json_object *json_status_performance(void) { service *temp_service = NULL; servicestatus *temp_servicestatus = NULL; host *temp_host = NULL; hoststatus *temp_hoststatus = NULL; int total_active_service_checks = 0; int total_passive_service_checks = 0; double min_service_execution_time = 0.0; double max_service_execution_time = 0.0; double total_service_execution_time = 0.0; int have_min_service_execution_time = FALSE; int have_max_service_execution_time = FALSE; double min_service_latency = 0.0; double max_service_latency = 0.0; double long total_service_latency = 0.0; int have_min_service_latency = FALSE; int have_max_service_latency = FALSE; double min_host_latency = 0.0; double max_host_latency = 0.0; double total_host_latency = 0.0; int have_min_host_latency = FALSE; int have_max_host_latency = FALSE; double min_service_percent_change_a = 0.0; double max_service_percent_change_a = 0.0; double total_service_percent_change_a = 0.0; int have_min_service_percent_change_a = FALSE; int have_max_service_percent_change_a = FALSE; double min_service_percent_change_b = 0.0; double max_service_percent_change_b = 0.0; double total_service_percent_change_b = 0.0; int have_min_service_percent_change_b = FALSE; int have_max_service_percent_change_b = FALSE; int active_service_checks_1min = 0; int active_service_checks_5min = 0; int active_service_checks_15min = 0; int active_service_checks_1hour = 0; int active_service_checks_start = 0; int active_service_checks_ever = 0; int passive_service_checks_1min = 0; int passive_service_checks_5min = 0; int passive_service_checks_15min = 0; int passive_service_checks_1hour = 0; int passive_service_checks_start = 0; int passive_service_checks_ever = 0; int total_active_host_checks = 0; int total_passive_host_checks = 0; double min_host_execution_time = 0.0; double max_host_execution_time = 0.0; double total_host_execution_time = 0.0; int have_min_host_execution_time = FALSE; int have_max_host_execution_time = FALSE; double min_host_percent_change_a = 0.0; double max_host_percent_change_a = 0.0; double total_host_percent_change_a = 0.0; int have_min_host_percent_change_a = FALSE; int have_max_host_percent_change_a = FALSE; double min_host_percent_change_b = 0.0; double max_host_percent_change_b = 0.0; double total_host_percent_change_b = 0.0; int have_min_host_percent_change_b = FALSE; int have_max_host_percent_change_b = FALSE; int active_host_checks_1min = 0; int active_host_checks_5min = 0; int active_host_checks_15min = 0; int active_host_checks_1hour = 0; int active_host_checks_start = 0; int active_host_checks_ever = 0; int passive_host_checks_1min = 0; int passive_host_checks_5min = 0; int passive_host_checks_15min = 0; int passive_host_checks_1hour = 0; int passive_host_checks_start = 0; int passive_host_checks_ever = 0; time_t current_time; json_object *json_data; json_object *json_programstatus; json_object *json_service_checks; json_object *json_host_checks; json_object *json_check_statistics; json_object *json_buffer_usage; json_object *json_active; json_object *json_passive; json_object *json_checks; json_object *json_metrics; json_object *json_temp; time(¤t_time); /* check all services */ for(temp_servicestatus = servicestatus_list; temp_servicestatus != NULL; temp_servicestatus = temp_servicestatus->next) { /* find the service */ temp_service = find_service(temp_servicestatus->host_name, temp_servicestatus->description); if(NULL == temp_service) { continue; } /* make sure the user has rights to view service information */ if(FALSE == is_authorized_for_service(temp_service, ¤t_authdata)) { continue; } /* is this an active or passive check? */ if(SERVICE_CHECK_ACTIVE == temp_servicestatus->check_type) { total_active_service_checks++; total_service_execution_time += temp_servicestatus->execution_time; if(have_min_service_execution_time == FALSE || temp_servicestatus->execution_time < min_service_execution_time) { have_min_service_execution_time = TRUE; min_service_execution_time = temp_servicestatus->execution_time; } if(have_max_service_execution_time == FALSE || temp_servicestatus->execution_time > max_service_execution_time) { have_max_service_execution_time = TRUE; max_service_execution_time = temp_servicestatus->execution_time; } total_service_percent_change_a += temp_servicestatus->percent_state_change; if(have_min_service_percent_change_a == FALSE || temp_servicestatus->percent_state_change < min_service_percent_change_a) { have_min_service_percent_change_a = TRUE; min_service_percent_change_a = temp_servicestatus->percent_state_change; } if(have_max_service_percent_change_a == FALSE || temp_servicestatus->percent_state_change > max_service_percent_change_a) { have_max_service_percent_change_a = TRUE; max_service_percent_change_a = temp_servicestatus->percent_state_change; } total_service_latency += temp_servicestatus->latency; if(have_min_service_latency == FALSE || temp_servicestatus->latency < min_service_latency) { have_min_service_latency = TRUE; min_service_latency = temp_servicestatus->latency; } if(have_max_service_latency == FALSE || temp_servicestatus->latency > max_service_latency) { have_max_service_latency = TRUE; max_service_latency = temp_servicestatus->latency; } if(temp_servicestatus->last_check >= (current_time - 60)) active_service_checks_1min++; if(temp_servicestatus->last_check >= (current_time - 300)) active_service_checks_5min++; if(temp_servicestatus->last_check >= (current_time - 900)) active_service_checks_15min++; if(temp_servicestatus->last_check >= (current_time - 3600)) active_service_checks_1hour++; if(temp_servicestatus->last_check >= program_start) active_service_checks_start++; if(temp_servicestatus->last_check != (time_t)0) active_service_checks_ever++; } else { total_passive_service_checks++; total_service_percent_change_b += temp_servicestatus->percent_state_change; if(have_min_service_percent_change_b == FALSE || temp_servicestatus->percent_state_change < min_service_percent_change_b) { have_min_service_percent_change_b = TRUE; min_service_percent_change_b = temp_servicestatus->percent_state_change; } if(have_max_service_percent_change_b == FALSE || temp_servicestatus->percent_state_change > max_service_percent_change_b) { have_max_service_percent_change_b = TRUE; max_service_percent_change_b = temp_servicestatus->percent_state_change; } if(temp_servicestatus->last_check >= (current_time - 60)) passive_service_checks_1min++; if(temp_servicestatus->last_check >= (current_time - 300)) passive_service_checks_5min++; if(temp_servicestatus->last_check >= (current_time - 900)) passive_service_checks_15min++; if(temp_servicestatus->last_check >= (current_time - 3600)) passive_service_checks_1hour++; if(temp_servicestatus->last_check >= program_start) passive_service_checks_start++; if(temp_servicestatus->last_check != (time_t)0) passive_service_checks_ever++; } } /* check all hosts */ for(temp_hoststatus = hoststatus_list; temp_hoststatus != NULL; temp_hoststatus = temp_hoststatus->next) { /* find the host */ temp_host = find_host(temp_hoststatus->host_name); if(NULL == temp_host) { continue; } /* make sure the user has rights to view host information */ if(FALSE == is_authorized_for_host(temp_host, ¤t_authdata)) { continue; } /* is this an active or passive check? */ if(temp_hoststatus->check_type == HOST_CHECK_ACTIVE) { total_active_host_checks++; total_host_execution_time += temp_hoststatus->execution_time; if(have_min_host_execution_time == FALSE || temp_hoststatus->execution_time < min_host_execution_time) { have_min_host_execution_time = TRUE; min_host_execution_time = temp_hoststatus->execution_time; } if(have_max_host_execution_time == FALSE || temp_hoststatus->execution_time > max_host_execution_time) { have_max_host_execution_time = TRUE; max_host_execution_time = temp_hoststatus->execution_time; } total_host_percent_change_a += temp_hoststatus->percent_state_change; if(have_min_host_percent_change_a == FALSE || temp_hoststatus->percent_state_change < min_host_percent_change_a) { have_min_host_percent_change_a = TRUE; min_host_percent_change_a = temp_hoststatus->percent_state_change; } if(have_max_host_percent_change_a == FALSE || temp_hoststatus->percent_state_change > max_host_percent_change_a) { have_max_host_percent_change_a = TRUE; max_host_percent_change_a = temp_hoststatus->percent_state_change; } total_host_latency += temp_hoststatus->latency; if(have_min_host_latency == FALSE || temp_hoststatus->latency < min_host_latency) { have_min_host_latency = TRUE; min_host_latency = temp_hoststatus->latency; } if(have_max_host_latency == FALSE || temp_hoststatus->latency > max_host_latency) { have_max_host_latency = TRUE; max_host_latency = temp_hoststatus->latency; } if(temp_hoststatus->last_check >= (current_time - 60)) active_host_checks_1min++; if(temp_hoststatus->last_check >= (current_time - 300)) active_host_checks_5min++; if(temp_hoststatus->last_check >= (current_time - 900)) active_host_checks_15min++; if(temp_hoststatus->last_check >= (current_time - 3600)) active_host_checks_1hour++; if(temp_hoststatus->last_check >= program_start) active_host_checks_start++; if(temp_hoststatus->last_check != (time_t)0) active_host_checks_ever++; } else { total_passive_host_checks++; total_host_percent_change_b += temp_hoststatus->percent_state_change; if(have_min_host_percent_change_b == FALSE || temp_hoststatus->percent_state_change < min_host_percent_change_b) { have_min_host_percent_change_b = TRUE; min_host_percent_change_b = temp_hoststatus->percent_state_change; } if(have_max_host_percent_change_b == FALSE || temp_hoststatus->percent_state_change > max_host_percent_change_b) { have_max_host_percent_change_b = TRUE; max_host_percent_change_b = temp_hoststatus->percent_state_change; } if(temp_hoststatus->last_check >= (current_time - 60)) passive_host_checks_1min++; if(temp_hoststatus->last_check >= (current_time - 300)) passive_host_checks_5min++; if(temp_hoststatus->last_check >= (current_time - 900)) passive_host_checks_15min++; if(temp_hoststatus->last_check >= (current_time - 3600)) passive_host_checks_1hour++; if(temp_hoststatus->last_check >= program_start) passive_host_checks_start++; if(temp_hoststatus->last_check != (time_t)0) passive_host_checks_ever++; } } /* Avoid divide by zero errors */ if(0 == total_active_service_checks) { total_active_service_checks = 1; } if(0 == total_passive_service_checks) { total_passive_service_checks = 1; } if(0 == total_active_host_checks) { total_active_host_checks = 1; } if(0 == total_passive_host_checks) { total_passive_host_checks = 1; } json_data = json_new_object(); json_programstatus = json_new_object(); json_service_checks = json_new_object(); /* Active Service Checks */ json_active = json_new_object(); json_checks = json_new_object(); json_object_append_integer(json_checks, "1min", active_service_checks_1min); json_object_append_integer(json_checks, "5min", active_service_checks_5min); json_object_append_integer(json_checks, "15min", active_service_checks_15min); json_object_append_integer(json_checks, "1hour", active_service_checks_1hour); json_object_append_integer(json_checks, "start", active_service_checks_start); json_object_append_object(json_active, "checks", json_checks); json_metrics = json_new_object(); json_temp = json_new_object(); json_object_append_real(json_temp, "min", min_service_execution_time); json_object_append_real(json_temp, "max", max_service_execution_time); json_object_append_real(json_temp, "average", (double)((double)total_service_execution_time / (double)total_active_service_checks)); json_object_append_object(json_metrics, "check_execution_time", json_temp); json_temp = json_new_object(); json_object_append_real(json_temp, "min", min_service_latency); json_object_append_real(json_temp, "max", max_service_latency); json_object_append_real(json_temp, "average", (double)((double)total_service_latency / (double)total_active_service_checks)); json_object_append_object(json_metrics, "check_latency", json_temp); json_temp = json_new_object(); json_object_append_real(json_temp, "min", min_service_percent_change_a); json_object_append_real(json_temp, "max", max_service_percent_change_a); json_object_append_real(json_temp, "average", (double)((double)total_service_percent_change_a / (double)total_active_service_checks)); json_object_append_object(json_metrics, "percent_state_change", json_temp); json_object_append_object(json_active, "metrics", json_metrics); json_object_append_object(json_service_checks, "active", json_active); /* Passive Service Checks */ json_passive = json_new_object(); json_checks = json_new_object(); json_object_append_integer(json_checks, "1min", passive_service_checks_1min); json_object_append_integer(json_checks, "5min", passive_service_checks_5min); json_object_append_integer(json_checks, "15min", passive_service_checks_15min); json_object_append_integer(json_checks, "1hour", passive_service_checks_1hour); json_object_append_integer(json_checks, "start", passive_service_checks_start); json_object_append_object(json_passive, "checks", json_checks); json_metrics = json_new_object(); json_temp = json_new_object(); json_object_append_real(json_temp, "min", min_service_percent_change_b); json_object_append_real(json_temp, "max", max_service_percent_change_b); json_object_append_real(json_temp, "average", (double)((double)total_service_percent_change_b / (double)total_active_service_checks)); json_object_append_object(json_metrics, "percent_state_change", json_temp); json_object_append_object(json_passive, "metrics", json_metrics); json_object_append_object(json_service_checks, "passive", json_passive); json_object_append_object(json_programstatus, "service_checks", json_service_checks); json_host_checks = json_new_object(); /* Active Host Checks */ json_active = json_new_object(); json_checks = json_new_object(); json_object_append_integer(json_checks, "1min", active_host_checks_1min); json_object_append_integer(json_checks, "5min", active_host_checks_5min); json_object_append_integer(json_checks, "15min", active_host_checks_15min); json_object_append_integer(json_checks, "1hour", active_host_checks_1hour); json_object_append_integer(json_checks, "start", active_host_checks_start); json_object_append_object(json_active, "checks", json_checks); json_metrics = json_new_object(); json_temp = json_new_object(); json_object_append_real(json_temp, "min", min_host_execution_time); json_object_append_real(json_temp, "max", max_host_execution_time); json_object_append_real(json_temp, "average", (double)((double)total_host_execution_time / (double)total_active_host_checks)); json_object_append_object(json_metrics, "check_execution_time", json_temp); json_temp = json_new_object(); json_object_append_real(json_temp, "min", min_host_latency); json_object_append_real(json_temp, "max", max_host_latency); json_object_append_real(json_temp, "average", (double)((double)total_host_latency / (double)total_active_host_checks)); json_object_append_object(json_metrics, "check_latency", json_temp); json_temp = json_new_object(); json_object_append_real(json_temp, "min", min_host_percent_change_a); json_object_append_real(json_temp, "max", max_host_percent_change_a); json_object_append_real(json_temp, "average", (double)((double)total_host_percent_change_a / (double)total_active_host_checks)); json_object_append_object(json_metrics, "percent_state_change", json_temp); json_object_append_object(json_active, "metrics", json_metrics); json_object_append_object(json_host_checks, "active", json_active); /* Passive Host Checks */ json_passive = json_new_object(); json_checks = json_new_object(); json_object_append_integer(json_checks, "1min", passive_host_checks_1min); json_object_append_integer(json_checks, "5min", passive_host_checks_5min); json_object_append_integer(json_checks, "15min", passive_host_checks_15min); json_object_append_integer(json_checks, "1hour", passive_host_checks_1hour); json_object_append_integer(json_checks, "start", passive_host_checks_start); json_object_append_object(json_passive, "checks", json_checks); json_metrics = json_new_object(); json_temp = json_new_object(); json_object_append_real(json_temp, "min", min_host_percent_change_b); json_object_append_real(json_temp, "max", max_host_percent_change_b); json_object_append_real(json_temp, "average", (double)((double)total_host_percent_change_b / (double)total_active_host_checks)); json_object_append_object(json_metrics, "percent_state_change", json_temp); json_object_append_object(json_passive, "metrics", json_metrics); json_object_append_object(json_host_checks, "passive", json_passive); json_object_append_object(json_programstatus, "host_checks", json_host_checks); /* Check Stats */ json_check_statistics = json_new_object(); json_temp = json_new_object(); json_object_append_integer(json_temp, "1min", program_stats[ACTIVE_SCHEDULED_HOST_CHECK_STATS][0]); json_object_append_integer(json_temp, "5min", program_stats[ACTIVE_SCHEDULED_HOST_CHECK_STATS][1]); json_object_append_integer(json_temp, "15min", program_stats[ACTIVE_SCHEDULED_HOST_CHECK_STATS][2]); json_object_append_object(json_check_statistics, "active_scheduled_host_checks", json_temp); json_temp = json_new_object(); json_object_append_integer(json_temp, "1min", program_stats[ACTIVE_ONDEMAND_HOST_CHECK_STATS][0]); json_object_append_integer(json_temp, "5min", program_stats[ACTIVE_ONDEMAND_HOST_CHECK_STATS][1]); json_object_append_integer(json_temp, "15min", program_stats[ACTIVE_ONDEMAND_HOST_CHECK_STATS][2]); json_object_append_object(json_check_statistics, "active_ondemand_host_checks", json_temp); json_temp = json_new_object(); json_object_append_integer(json_temp, "1min", program_stats[PARALLEL_HOST_CHECK_STATS][0]); json_object_append_integer(json_temp, "5min", program_stats[PARALLEL_HOST_CHECK_STATS][1]); json_object_append_integer(json_temp, "15min", program_stats[PARALLEL_HOST_CHECK_STATS][2]); json_object_append_object(json_check_statistics, "parallel_host_checks", json_temp); json_temp = json_new_object(); json_object_append_integer(json_temp, "1min", program_stats[SERIAL_HOST_CHECK_STATS][0]); json_object_append_integer(json_temp, "5min", program_stats[SERIAL_HOST_CHECK_STATS][1]); json_object_append_integer(json_temp, "15min", program_stats[SERIAL_HOST_CHECK_STATS][2]); json_object_append_object(json_check_statistics, "serial_host_checks", json_temp); json_temp = json_new_object(); json_object_append_integer(json_temp, "1min", program_stats[ACTIVE_CACHED_HOST_CHECK_STATS][0]); json_object_append_integer(json_temp, "5min", program_stats[ACTIVE_CACHED_HOST_CHECK_STATS][1]); json_object_append_integer(json_temp, "15min", program_stats[ACTIVE_CACHED_HOST_CHECK_STATS][2]); json_object_append_object(json_check_statistics, "cached_host_checks", json_temp); json_temp = json_new_object(); json_object_append_integer(json_temp, "1min", program_stats[PASSIVE_HOST_CHECK_STATS][0]); json_object_append_integer(json_temp, "5min", program_stats[PASSIVE_HOST_CHECK_STATS][1]); json_object_append_integer(json_temp, "15min", program_stats[PASSIVE_HOST_CHECK_STATS][2]); json_object_append_object(json_check_statistics, "passive_host_checks", json_temp); json_temp = json_new_object(); json_object_append_integer(json_temp, "1min", program_stats[ACTIVE_SCHEDULED_SERVICE_CHECK_STATS][0]); json_object_append_integer(json_temp, "5min", program_stats[ACTIVE_SCHEDULED_SERVICE_CHECK_STATS][1]); json_object_append_integer(json_temp, "15min", program_stats[ACTIVE_SCHEDULED_SERVICE_CHECK_STATS][2]); json_object_append_object(json_check_statistics, "active_scheduled_service_checks", json_temp); json_temp = json_new_object(); json_object_append_integer(json_temp, "1min", program_stats[ACTIVE_ONDEMAND_SERVICE_CHECK_STATS][0]); json_object_append_integer(json_temp, "5min", program_stats[ACTIVE_ONDEMAND_SERVICE_CHECK_STATS][1]); json_object_append_integer(json_temp, "15min", program_stats[ACTIVE_ONDEMAND_SERVICE_CHECK_STATS][2]); json_object_append_object(json_check_statistics, "active_ondemand_service_checks", json_temp); json_temp = json_new_object(); json_object_append_integer(json_temp, "1min", program_stats[ACTIVE_CACHED_SERVICE_CHECK_STATS][0]); json_object_append_integer(json_temp, "5min", program_stats[ACTIVE_CACHED_SERVICE_CHECK_STATS][1]); json_object_append_integer(json_temp, "15min", program_stats[ACTIVE_CACHED_SERVICE_CHECK_STATS][2]); json_object_append_object(json_check_statistics, "cached_service_checks", json_temp); json_temp = json_new_object(); json_object_append_integer(json_temp, "1min", program_stats[PASSIVE_SERVICE_CHECK_STATS][0]); json_object_append_integer(json_temp, "5min", program_stats[PASSIVE_SERVICE_CHECK_STATS][1]); json_object_append_integer(json_temp, "15min", program_stats[PASSIVE_SERVICE_CHECK_STATS][2]); json_object_append_object(json_check_statistics, "passive_service_checks", json_temp); json_temp = json_new_object(); json_object_append_integer(json_temp, "1min", program_stats[EXTERNAL_COMMAND_STATS][0]); json_object_append_integer(json_temp, "5min", program_stats[EXTERNAL_COMMAND_STATS][1]); json_object_append_integer(json_temp, "15min", program_stats[EXTERNAL_COMMAND_STATS][2]); json_object_append_object(json_check_statistics, "external_commands", json_temp); json_object_append_object(json_programstatus, "check_statistics", json_check_statistics); /* Buffer Stats */ json_buffer_usage = json_new_object(); json_temp = json_new_object(); json_object_append_integer(json_temp, "in_use", buffer_stats[0][1]); json_object_append_integer(json_temp, "max_used", buffer_stats[0][2]); json_object_append_integer(json_temp, "total_available", buffer_stats[0][0]); json_object_append_object(json_buffer_usage, "external_commands", json_temp); json_object_append_object(json_programstatus, "buffer_usage", json_buffer_usage); json_object_append_object(json_data, "programstatus", json_programstatus); return json_data; } nagios-4.3.4/cgi/statusmap.c000066400000000000000000002705601314764422400157520ustar00rootroot00000000000000/***************************************************************************** * * STATUSMAP.C - Nagios Network Status Map CGI * * * Description: * * This CGI will create a map of all hosts that are being monitored on your * network. * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #include "../include/config.h" #include "../include/common.h" #include "../include/objects.h" #include "../include/macros.h" #include "../include/statusdata.h" #include "../include/cgiutils.h" #include "../include/getcgi.h" #include "../include/cgiauth.h" #include /* Boutell's GD library function */ #include /* GD library small font definition */ static nagios_macros *mac; extern int refresh_rate; /*#define DEBUG*/ #define UNKNOWN_GD2_ICON "unknown.gd2" #define UNKNOWN_ICON_IMAGE "unknown.gif" #define NAGIOS_GD2_ICON "nagios.gd2" extern char main_config_file[MAX_FILENAME_LENGTH]; extern char url_html_path[MAX_FILENAME_LENGTH]; extern char physical_images_path[MAX_FILENAME_LENGTH]; extern char url_images_path[MAX_FILENAME_LENGTH]; extern char url_logo_images_path[MAX_FILENAME_LENGTH]; extern char url_stylesheets_path[MAX_FILENAME_LENGTH]; extern char *status_file; extern hoststatus *hoststatus_list; extern servicestatus *servicestatus_list; extern char *statusmap_background_image; extern int default_statusmap_layout_method; #define DEFAULT_NODE_WIDTH 40 #define DEFAULT_NODE_HEIGHT 65 #define DEFAULT_NODE_VSPACING 15 #define DEFAULT_NODE_HSPACING 45 #define DEFAULT_PROXIMITY_WIDTH 1000 #define DEFAULT_PROXIMITY_HEIGHT 800 #define MINIMUM_PROXIMITY_WIDTH 250 #define MINIMUM_PROXIMITY_HEIGHT 200 #define COORDS_WARNING_WIDTH 650 #define COORDS_WARNING_HEIGHT 60 #define CIRCULAR_DRAWING_RADIUS 100 #define CREATE_HTML 0 #define CREATE_IMAGE 1 #define LAYOUT_USER_SUPPLIED 0 #define LAYOUT_SUBLAYERS 1 #define LAYOUT_COLLAPSED_TREE 2 #define LAYOUT_BALANCED_TREE 3 #define LAYOUT_CIRCULAR 4 #define LAYOUT_CIRCULAR_MARKUP 5 #define LAYOUT_CIRCULAR_BALLOON 6 struct layer { char *layer_name; struct layer *next; }; void document_header(int); void document_footer(void); int process_cgivars(void); void display_page_header(void); void display_map(void); void calculate_host_coords(void); void calculate_total_image_bounds(void); void calculate_canvas_bounds(void); void calculate_canvas_bounds_from_host(char *); void calculate_scaling_factor(void); void find_eligible_hosts(void); void load_background_image(void); void draw_background_image(void); void draw_background_extras(void); void draw_host_links(void); void draw_hosts(void); void draw_host_text(char *, int, int); void draw_text(char *, int, int, int); void write_popup_code(void); void write_host_popup_text(host *); int initialize_graphics(void); gdImagePtr load_image_from_file(char *); void write_graphics(void); void cleanup_graphics(void); void draw_line(int, int, int, int, int); void draw_dotted_line(int, int, int, int, int); void draw_dashed_line(int, int, int, int, int); int is_host_in_layer_list(host *); int add_layer(char *); void free_layer_list(void); void print_layer_url(int); int number_of_host_layer_members(host *, int); int max_child_host_layer_members(host *); int host_child_depth_separation(host *, host *); int max_child_host_drawing_width(host *); int number_of_host_services(host *); void calculate_balanced_tree_coords(host *, int, int); void calculate_circular_coords(void); void calculate_circular_layer_coords(host *, double, double, int, int); void draw_circular_markup(void); void draw_circular_layer_markup(host *, double, double, int, int); char physical_logo_images_path[MAX_FILENAME_LENGTH]; authdata current_authdata; int create_type = CREATE_HTML; gdImagePtr unknown_logo_image = NULL; gdImagePtr logo_image = NULL; gdImagePtr map_image = NULL; gdImagePtr background_image = NULL; int color_white = 0; int color_black = 0; int color_red = 0; int color_lightred = 0; int color_green = 0; int color_lightgreen = 0; int color_blue = 0; int color_yellow = 0; int color_orange = 0; int color_grey = 0; int color_lightgrey = 0; int color_transparency_index = 0; extern int color_transparency_index_r; extern int color_transparency_index_g; extern int color_transparency_index_b; int show_all_hosts = TRUE; char *host_name = "all"; int embedded = FALSE; int display_header = TRUE; int display_popups = TRUE; int use_links = TRUE; int use_text = TRUE; int use_highlights = TRUE; int user_supplied_canvas = FALSE; int user_supplied_scaling = FALSE; int layout_method = LAYOUT_USER_SUPPLIED; int proximity_width = DEFAULT_PROXIMITY_WIDTH; int proximity_height = DEFAULT_PROXIMITY_HEIGHT; int coordinates_were_specified = FALSE; /* were any coordinates specified in extended host information entries? */ int scaled_image_width = 0; /* size of the image actually displayed on the screen (after scaling) */ int scaled_image_height = 0; int canvas_width = 0; /* actual size of the image (or portion thereof) that we are drawing */ int canvas_height = 0; int total_image_width = 0; /* actual size of the image that would be created if we drew all hosts */ int total_image_height = 0; int max_image_width = 0; /* max image size the user wants (scaled) */ int max_image_height = 0; double scaling_factor = 1.0; /* scaling factor to use */ double user_scaling_factor = 1.0; /* user-supplied scaling factor */ int background_image_width = 0; int background_image_height = 0; int canvas_x = 0; /* upper left coords of drawing canvas */ int canvas_y = 0; int bottom_margin = 0; int draw_child_links = FALSE; int draw_parent_links = FALSE; int draw_nagios_icon = FALSE; /* should we drawn the Nagios process icon? */ int nagios_icon_x = 0; /* coords of Nagios icon */ int nagios_icon_y = 0; extern hoststatus *hoststatus_list; struct layer *layer_list = NULL; int exclude_layers = TRUE; int all_layers = FALSE; int main(int argc, char **argv) { int result; mac = get_global_macros(); /* reset internal variables */ reset_cgi_vars(); /* Initialize shared configuration variables */ init_shared_cfg_vars(1); /* read the CGI configuration file */ result = read_cgi_config_file(get_cgi_config_location()); if(result == ERROR) { document_header(FALSE); if(create_type == CREATE_HTML) cgi_config_file_error(get_cgi_config_location()); document_footer(); return ERROR; } /* defaults from CGI config file */ layout_method = default_statusmap_layout_method; /* get the arguments passed in the URL */ process_cgivars(); /* read the main configuration file */ result = read_main_config_file(main_config_file); if(result == ERROR) { document_header(FALSE); if(create_type == CREATE_HTML) main_config_file_error(main_config_file); document_footer(); return ERROR; } /* read all object configuration data */ result = read_all_object_configuration_data(main_config_file, READ_ALL_OBJECT_DATA); if(result == ERROR) { document_header(FALSE); if(create_type == CREATE_HTML) object_data_error(); document_footer(); return ERROR; } /* read all status data */ result = read_all_status_data(status_file, READ_ALL_STATUS_DATA); if(result == ERROR) { document_header(FALSE); if(create_type == CREATE_HTML) status_data_error(); document_footer(); free_memory(); return ERROR; } /* initialize macros */ init_macros(); document_header(TRUE); /* get authentication information */ get_authentication_information(¤t_authdata); /* display the network map... */ display_map(); document_footer(); /* free all allocated memory */ free_memory(); free_layer_list(); return OK; } void document_header(int use_stylesheet) { char date_time[MAX_DATETIME_LENGTH]; time_t current_time; time_t expire_time; if(create_type == CREATE_HTML) { printf("Cache-Control: no-store\r\n"); printf("Pragma: no-cache\r\n"); printf("Refresh: %d\r\n", refresh_rate); time(¤t_time); get_time_string(¤t_time, date_time, sizeof(date_time), HTTP_DATE_TIME); printf("Last-Modified: %s\r\n", date_time); expire_time = 0L; get_time_string(&expire_time, date_time, sizeof(date_time), HTTP_DATE_TIME); printf("Expires: %s\r\n", date_time); printf("Content-Type: text/html; charset=utf-8\r\n\r\n"); if(embedded == TRUE) return; printf("\n"); printf("\n"); printf("\n", url_images_path); printf("\n"); printf("Network Map\n"); printf("\n"); if(use_stylesheet == TRUE) { printf("\n", url_stylesheets_path, COMMON_CSS); printf("\n", url_stylesheets_path, STATUSMAP_CSS); } /* write JavaScript code for popup window */ write_popup_code(); printf("\n"); printf("\n"); /* include user SSI header */ #ifdef LEGACY_GRAPHICAL_CGIS include_ssi_files(STATUSMAP_CGI, SSI_HEADER); #else include_ssi_files(LEGACY_STATUSMAP_CGI, SSI_HEADER); #endif printf("
    \n"); } else { printf("Cache-Control: no-store\n"); printf("Pragma: no-cache\n"); time(¤t_time); get_time_string(¤t_time, date_time, sizeof(date_time), HTTP_DATE_TIME); printf("Last-Modified: %s\n", date_time); expire_time = (time_t)0L; get_time_string(&expire_time, date_time, sizeof(date_time), HTTP_DATE_TIME); printf("Expires: %s\n", date_time); printf("Content-Type: image/png\n\n"); } return; } void document_footer(void) { if(embedded == TRUE) return; if(create_type == CREATE_HTML) { /* include user SSI footer */ #ifdef LEGACY_GRAPHICAL_CGIS include_ssi_files(STATUSMAP_CGI, SSI_FOOTER); #else include_ssi_files(LEGACY_STATUSMAP_CGI, SSI_FOOTER); #endif printf("\n"); printf("\n"); } return; } int process_cgivars(void) { char **variables; int error = FALSE; int x; variables = getcgivars(); for(x = 0; variables[x] != NULL; x++) { /* do some basic length checking on the variable identifier to prevent buffer overflows */ if(strlen(variables[x]) >= MAX_INPUT_BUFFER - 1) { continue; } /* we found the host argument */ else if(!strcmp(variables[x], "host")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if((host_name = (char *)strdup(variables[x])) == NULL) host_name = "all"; else strip_html_brackets(host_name); if(!strcmp(host_name, "all")) show_all_hosts = TRUE; else show_all_hosts = FALSE; } /* we found the image creation option */ else if(!strcmp(variables[x], "createimage")) { create_type = CREATE_IMAGE; } /* we found the embed option */ else if(!strcmp(variables[x], "embedded")) embedded = TRUE; /* we found the noheader option */ else if(!strcmp(variables[x], "noheader")) display_header = FALSE; /* we found the canvas origin */ else if(!strcmp(variables[x], "canvas_x")) { x++; if(variables[x] == NULL) { error = TRUE; break; } canvas_x = atoi(variables[x]); user_supplied_canvas = TRUE; } else if(!strcmp(variables[x], "canvas_y")) { x++; if(variables[x] == NULL) { error = TRUE; break; } canvas_y = atoi(variables[x]); user_supplied_canvas = TRUE; } /* we found the canvas size */ else if(!strcmp(variables[x], "canvas_width")) { x++; if(variables[x] == NULL) { error = TRUE; break; } canvas_width = atoi(variables[x]); user_supplied_canvas = TRUE; } else if(!strcmp(variables[x], "canvas_height")) { x++; if(variables[x] == NULL) { error = TRUE; break; } canvas_height = atoi(variables[x]); user_supplied_canvas = TRUE; } else if(!strcmp(variables[x], "proximity_width")) { x++; if(variables[x] == NULL) { error = TRUE; break; } proximity_width = atoi(variables[x]); if(proximity_width < 0) proximity_width = DEFAULT_PROXIMITY_WIDTH; } else if(!strcmp(variables[x], "proximity_height")) { x++; if(variables[x] == NULL) { error = TRUE; break; } proximity_height = atoi(variables[x]); if(proximity_height < 0) proximity_height = DEFAULT_PROXIMITY_HEIGHT; } /* we found the scaling factor */ else if(!strcmp(variables[x], "scaling_factor")) { x++; if(variables[x] == NULL) { error = TRUE; break; } user_scaling_factor = strtod(variables[x], NULL); if(user_scaling_factor > 0.0) user_supplied_scaling = TRUE; } /* we found the max image size */ else if(!strcmp(variables[x], "max_width")) { x++; if(variables[x] == NULL) { error = TRUE; break; } max_image_width = atoi(variables[x]); } else if(!strcmp(variables[x], "max_height")) { x++; if(variables[x] == NULL) { error = TRUE; break; } max_image_height = atoi(variables[x]); } /* we found the layout method option */ else if(!strcmp(variables[x], "layout")) { x++; if(variables[x] == NULL) { error = TRUE; break; } layout_method = atoi(variables[x]); } /* we found the no links argument*/ else if(!strcmp(variables[x], "nolinks")) use_links = FALSE; /* we found the no text argument*/ else if(!strcmp(variables[x], "notext")) use_text = FALSE; /* we found the no highlights argument*/ else if(!strcmp(variables[x], "nohighlights")) use_highlights = FALSE; /* we found the no popups argument*/ else if(!strcmp(variables[x], "nopopups")) display_popups = FALSE; /* we found the layer inclusion/exclusion argument */ else if(!strcmp(variables[x], "layermode")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(!strcmp(variables[x], "include")) exclude_layers = FALSE; else exclude_layers = TRUE; } /* we found the layer argument */ else if(!strcmp(variables[x], "layer")) { x++; if(variables[x] == NULL) { error = TRUE; break; } strip_html_brackets(variables[x]); add_layer(variables[x]); } } /* free memory allocated to the CGI variables */ free_cgivars(variables); return error; } /* top of page */ void display_page_header(void) { char temp_buffer[MAX_INPUT_BUFFER]; int zoom; int zoom_width, zoom_height; int zoom_width_granularity = 0; int zoom_height_granularity = 0; int current_zoom_granularity = 0; hostgroup *temp_hostgroup; struct layer *temp_layer; int found = 0; if(create_type != CREATE_HTML) return; if(display_header == TRUE) { /* begin top table */ printf("\n"); printf("\n"); /* left column of the first row */ printf("\n"); /* center column of top row */ printf("\n"); /* right hand column of top row */ printf("\n"); /* end of top table */ printf("\n"); printf("
    \n"); if(show_all_hosts == TRUE) snprintf(temp_buffer, sizeof(temp_buffer) - 1, "Network Map For All Hosts"); else snprintf(temp_buffer, sizeof(temp_buffer) - 1, "Network Map For Host %s", host_name); temp_buffer[sizeof(temp_buffer) - 1] = '\x0'; display_info_table(temp_buffer, TRUE, ¤t_authdata); printf("\n"); printf("\n"); printf("\n"); printf("\n"); /* print image size and scaling info */ #ifdef DEBUG printf("

    \n"); printf("[ Raw Image Size: %d x %d pixels | Scaling Factor: %1.2lf | Scaled Image Size: %d x %d pixels ]", canvas_width, canvas_height, scaling_factor, (int)(canvas_width * scaling_factor), (int)(canvas_height * scaling_factor)); printf("

    \n"); printf("

    \n"); printf("[ Canvas_x: %d | Canvas_y: %d | Canvas_width: %d | Canvas_height: %d ]", canvas_x, canvas_y, canvas_width, canvas_height); printf("

    \n"); #endif /* zoom links */ if(user_supplied_canvas == FALSE && strcmp(host_name, "all") && display_header == TRUE) { printf("

    \n"); zoom_width_granularity = ((total_image_width - MINIMUM_PROXIMITY_WIDTH) / 11); if(zoom_width_granularity == 0) zoom_width_granularity = 1; zoom_height_granularity = ((total_image_height - MINIMUM_PROXIMITY_HEIGHT) / 11); if(proximity_width <= 0) current_zoom_granularity = 0; else current_zoom_granularity = (total_image_width - proximity_width) / zoom_width_granularity; if(current_zoom_granularity > 10) current_zoom_granularity = 10; printf("\n"); printf("\n"); printf("\n"); for(zoom = 0; zoom <= 10; zoom++) { zoom_width = total_image_width - (zoom * zoom_width_granularity); zoom_height = total_image_height - (zoom * zoom_height_granularity); #ifdef LEGACY_GRAPHICAL_CGIS printf("\n", url_images_path, (current_zoom_granularity == zoom) ? ZOOM2_ICON : ZOOM1_ICON, zoom, zoom); } printf("\n"); printf("\n"); printf("
    Zoom Out  "); printf("%d  Zoom In
    \n"); printf("

    \n"); } printf("
    \n"); #ifdef LEGACY_GRAPHICAL_CGIS printf("
    \n", STATUSMAP_CGI); #else printf("\n", LEGACY_STATUSMAP_CGI); #endif printf("\n"); printf("\n"); printf("
    \n"); printf("\n", escape_string(host_name)); printf("\n", layout_method); printf("\n"); printf("\n"); printf("\n"); printf("\n"); /* printf("\n"); printf("\n"); printf("\n"); printf("\n"); */ printf("\n", max_image_width); printf("\n", max_image_height); printf("\n", proximity_width); printf("\n", proximity_height); printf("\n"); printf("\n"); /* display context-sensitive help */ printf("\n"); printf("
    \n"); printf("Layout Method:
    \n"); printf("\n"); printf("
    \n"); printf("Scaling factor:
    \n"); printf("\n", (user_supplied_scaling == TRUE) ? user_scaling_factor : 0.0); printf("
    \n"); printf("Max image width:
    \n"); printf("\n",max_image_width); printf("
    \n"); printf("Max image height:
    \n"); printf("\n",max_image_height); printf("
    \n"); printf("Proximity width:
    \n"); printf("\n",proximity_width); printf("
    \n"); printf("Proximity height:
    \n"); printf("\n",proximity_height); printf("
    Drawing Layers:
    \n"); printf("\n"); printf("
    Layer mode:
    "); printf("Include
    \n", (exclude_layers == FALSE) ? "CHECKED" : ""); printf("Exclude\n", (exclude_layers == TRUE) ? "CHECKED" : ""); printf("
    \n"); printf("Suppress popups:
    \n"); printf("\n", (display_popups == FALSE) ? "CHECKED" : ""); printf("
    \n"); printf("\n"); printf("
    \n"); display_context_help(CONTEXTHELP_MAP); printf("
    \n"); printf("
    \n"); printf("
    \n"); printf("
    \n"); } return; } /* top-level map generation... */ void display_map(void) { load_background_image(); calculate_host_coords(); calculate_total_image_bounds(); calculate_canvas_bounds(); calculate_scaling_factor(); find_eligible_hosts(); /* display page header */ display_page_header(); initialize_graphics(); draw_background_image(); draw_background_extras(); draw_host_links(); if(create_type == CREATE_HTML) printf("\n"); draw_hosts(); if(create_type == CREATE_HTML) printf("\n"); write_graphics(); cleanup_graphics(); /* write the URL location for the image we just generated - the web browser will come and get it... */ if(create_type == CREATE_HTML) { printf("

    \n"); #ifdef LEGACY_GRAPHICAL_CGIS printf("\n", (int)(canvas_width * scaling_factor), (int)(canvas_height * scaling_factor)); printf("

    \n"); } return; } /******************************************************************/ /********************* CALCULATION FUNCTIONS **********************/ /******************************************************************/ /* calculates host drawing coordinates */ void calculate_host_coords(void) { host *this_host; host *temp_host; int child_hosts = 0; int parent_hosts = 0; int max_layer_width = 1; int current_child_host = 0; int current_parent_host = 0; int center_x = 0; int offset_x = DEFAULT_NODE_WIDTH / 2; int offset_y = DEFAULT_NODE_WIDTH / 2; int current_layer = 0; int layer_members = 0; int current_layer_member = 0; int max_drawing_width = 0; /******************************/ /***** MANUAL LAYOUT MODE *****/ /******************************/ /* user-supplied coords */ if(layout_method == LAYOUT_USER_SUPPLIED) { /* see which hosts we should draw and calculate drawing coords */ for(temp_host = host_list; temp_host != NULL; temp_host = temp_host->next) { if(temp_host->have_2d_coords == TRUE) temp_host->should_be_drawn = TRUE; else temp_host->should_be_drawn = FALSE; } return; } /*****************************/ /***** AUTO-LAYOUT MODES *****/ /*****************************/ /***** DEPTH LAYER MODE *****/ if(layout_method == LAYOUT_SUBLAYERS) { /* find the "main" host we're displaying */ if(show_all_hosts == TRUE) this_host = NULL; else this_host = find_host(host_name); /* find total number of immediate parents/children for this host */ child_hosts = number_of_immediate_child_hosts(this_host); parent_hosts = number_of_immediate_parent_hosts(this_host); if(child_hosts == 0 && parent_hosts == 0) max_layer_width = 1; else max_layer_width = (child_hosts > parent_hosts) ? child_hosts : parent_hosts; /* calculate center x coord */ center_x = (((DEFAULT_NODE_WIDTH * max_layer_width) + (DEFAULT_NODE_HSPACING * (max_layer_width - 1))) / 2) + offset_x; /* coords for Nagios icon if necessary */ if(this_host == NULL || this_host->parent_hosts == NULL) { nagios_icon_x = center_x; nagios_icon_y = offset_y; draw_nagios_icon = TRUE; } /* do we need to draw a link to parent(s)? */ if(this_host != NULL && is_host_immediate_child_of_host(NULL, this_host) == FALSE) { draw_parent_links = TRUE; offset_y += DEFAULT_NODE_HEIGHT + DEFAULT_NODE_VSPACING; } /* see which hosts we should draw and calculate drawing coords */ for(temp_host = host_list; temp_host != NULL; temp_host = temp_host->next) { /* this is an immediate parent of the "main" host we're drawing */ if(is_host_immediate_parent_of_host(this_host, temp_host) == TRUE) { temp_host->should_be_drawn = TRUE; temp_host->have_2d_coords = TRUE; temp_host->x_2d = center_x - (((parent_hosts * DEFAULT_NODE_WIDTH) + ((parent_hosts - 1) * DEFAULT_NODE_HSPACING)) / 2) + (current_parent_host * (DEFAULT_NODE_WIDTH + DEFAULT_NODE_HSPACING)) + (DEFAULT_NODE_WIDTH / 2); temp_host->y_2d = offset_y; current_parent_host++; } /* this is the "main" host we're drawing */ else if(this_host == temp_host) { temp_host->should_be_drawn = TRUE; temp_host->have_2d_coords = TRUE; temp_host->x_2d = center_x; temp_host->y_2d = DEFAULT_NODE_HEIGHT + DEFAULT_NODE_VSPACING + offset_y; } /* this is an immediate child of the "main" host we're drawing */ else if(is_host_immediate_child_of_host(this_host, temp_host) == TRUE) { temp_host->should_be_drawn = TRUE; temp_host->have_2d_coords = TRUE; temp_host->x_2d = center_x - (((child_hosts * DEFAULT_NODE_WIDTH) + ((child_hosts - 1) * DEFAULT_NODE_HSPACING)) / 2) + (current_child_host * (DEFAULT_NODE_WIDTH + DEFAULT_NODE_HSPACING)) + (DEFAULT_NODE_WIDTH / 2); if(this_host == NULL) temp_host->y_2d = (DEFAULT_NODE_HEIGHT + DEFAULT_NODE_VSPACING) + offset_y; else temp_host->y_2d = ((DEFAULT_NODE_HEIGHT + DEFAULT_NODE_VSPACING) * 2) + offset_y; current_child_host++; if(number_of_immediate_child_hosts(temp_host) > 0) { bottom_margin = DEFAULT_NODE_HEIGHT + DEFAULT_NODE_VSPACING; draw_child_links = TRUE; } } /* else do not draw this host */ else { temp_host->should_be_drawn = FALSE; temp_host->have_2d_coords = FALSE; } } } /***** COLLAPSED TREE MODE *****/ else if(layout_method == LAYOUT_COLLAPSED_TREE) { /* find the "main" host we're displaying - DO NOT USE THIS (THIS IS THE OLD METHOD) */ /* if(show_all_hosts==TRUE) this_host=NULL; else this_host=find_host(host_name); */ /* always use NULL as the "main" host, screen coords/dimensions are adjusted automatically */ this_host = NULL; /* find total number of immediate parents for this host */ parent_hosts = number_of_immediate_parent_hosts(this_host); /* find the max layer width we have... */ max_layer_width = max_child_host_layer_members(this_host); if(parent_hosts > max_layer_width) max_layer_width = parent_hosts; /* calculate center x coord */ center_x = (((DEFAULT_NODE_WIDTH * max_layer_width) + (DEFAULT_NODE_HSPACING * (max_layer_width - 1))) / 2) + offset_x; /* coords for Nagios icon if necessary */ if(this_host == NULL || this_host->parent_hosts == NULL) { nagios_icon_x = center_x; nagios_icon_y = offset_y; draw_nagios_icon = TRUE; } /* do we need to draw a link to parent(s)? */ if(this_host != NULL && is_host_immediate_child_of_host(NULL, this_host) == FALSE) { draw_parent_links = TRUE; offset_y += DEFAULT_NODE_HEIGHT + DEFAULT_NODE_VSPACING; } /* see which hosts we should draw and calculate drawing coords */ for(temp_host = host_list; temp_host != NULL; temp_host = temp_host->next) { /* this is an immediate parent of the "main" host we're drawing */ if(is_host_immediate_parent_of_host(this_host, temp_host) == TRUE) { temp_host->should_be_drawn = TRUE; temp_host->have_2d_coords = TRUE; temp_host->x_2d = center_x - (((parent_hosts * DEFAULT_NODE_WIDTH) + ((parent_hosts - 1) * DEFAULT_NODE_HSPACING)) / 2) + (current_parent_host * (DEFAULT_NODE_WIDTH + DEFAULT_NODE_HSPACING)) + (DEFAULT_NODE_WIDTH / 2); temp_host->y_2d = offset_y; current_parent_host++; } /* this is the "main" host we're drawing */ else if(this_host == temp_host) { temp_host->should_be_drawn = TRUE; temp_host->have_2d_coords = TRUE; temp_host->x_2d = center_x; temp_host->y_2d = DEFAULT_NODE_HEIGHT + DEFAULT_NODE_VSPACING + offset_y; } /* else do not draw this host (we might if its a child - see below, but assume no for now) */ else { temp_host->should_be_drawn = FALSE; temp_host->have_2d_coords = FALSE; } } /* TODO: REORDER CHILD LAYER MEMBERS SO THAT WE MINIMIZE LINK CROSSOVERS FROM PARENT HOSTS */ /* draw hosts in child "layers" */ for(current_layer = 1;; current_layer++) { /* how many members in this layer? */ layer_members = number_of_host_layer_members(this_host, current_layer); if(layer_members == 0) break; current_layer_member = 0; /* see which hosts are members of this layer and calculate drawing coords */ for(temp_host = host_list; temp_host != NULL; temp_host = temp_host->next) { /* is this host a member of the current child layer? */ if(host_child_depth_separation(this_host, temp_host) == current_layer) { temp_host->should_be_drawn = TRUE; temp_host->have_2d_coords = TRUE; temp_host->x_2d = center_x - (((layer_members * DEFAULT_NODE_WIDTH) + ((layer_members - 1) * DEFAULT_NODE_HSPACING)) / 2) + (current_layer_member * (DEFAULT_NODE_WIDTH + DEFAULT_NODE_HSPACING)) + (DEFAULT_NODE_WIDTH / 2); if(this_host == NULL) temp_host->y_2d = ((DEFAULT_NODE_HEIGHT + DEFAULT_NODE_VSPACING) * current_layer) + offset_y; else temp_host->y_2d = ((DEFAULT_NODE_HEIGHT + DEFAULT_NODE_VSPACING) * (current_layer + 1)) + offset_y; current_layer_member++; } } } } /***** "BALANCED" TREE MODE *****/ else if(layout_method == LAYOUT_BALANCED_TREE) { /* find the "main" host we're displaying - DO NOT USE THIS (THIS IS THE OLD METHOD) */ /* if(show_all_hosts==TRUE) this_host=NULL; else this_host=find_host(host_name); */ /* always use NULL as the "main" host, screen coords/dimensions are adjusted automatically */ this_host = NULL; /* find total number of immediate parents for this host */ parent_hosts = number_of_immediate_parent_hosts(this_host); /* find the max drawing width we have... */ max_drawing_width = max_child_host_drawing_width(this_host); if(parent_hosts > max_drawing_width) max_drawing_width = parent_hosts; /* calculate center x coord */ center_x = (((DEFAULT_NODE_WIDTH * max_drawing_width) + (DEFAULT_NODE_HSPACING * (max_drawing_width - 1))) / 2) + offset_x; /* coords for Nagios icon if necessary */ if(this_host == NULL || this_host->parent_hosts == NULL) { nagios_icon_x = center_x; nagios_icon_y = offset_y; draw_nagios_icon = TRUE; } /* do we need to draw a link to parent(s)? */ if(this_host != NULL && is_host_immediate_child_of_host(NULL, this_host) == FALSE) { draw_parent_links = TRUE; offset_y += DEFAULT_NODE_HEIGHT + DEFAULT_NODE_VSPACING; } /* see which hosts we should draw and calculate drawing coords */ for(temp_host = host_list; temp_host != NULL; temp_host = temp_host->next) { /* this is an immediate parent of the "main" host we're drawing */ if(is_host_immediate_parent_of_host(this_host, temp_host) == TRUE) { temp_host->should_be_drawn = TRUE; temp_host->have_2d_coords = TRUE; temp_host->x_2d = center_x - (((parent_hosts * DEFAULT_NODE_WIDTH) + ((parent_hosts - 1) * DEFAULT_NODE_HSPACING)) / 2) + (current_parent_host * (DEFAULT_NODE_WIDTH + DEFAULT_NODE_HSPACING)) + (DEFAULT_NODE_WIDTH / 2); temp_host->y_2d = offset_y; current_parent_host++; } /* this is the "main" host we're drawing */ else if(this_host == temp_host) { temp_host->should_be_drawn = TRUE; temp_host->have_2d_coords = TRUE; temp_host->x_2d = center_x; temp_host->y_2d = DEFAULT_NODE_HEIGHT + DEFAULT_NODE_VSPACING + offset_y; } /* else do not draw this host (we might if its a child - see below, but assume no for now) */ else { temp_host->should_be_drawn = FALSE; temp_host->have_2d_coords = FALSE; } } /* draw all children hosts */ calculate_balanced_tree_coords(this_host, center_x, DEFAULT_NODE_HEIGHT + DEFAULT_NODE_VSPACING + offset_y); } /***** CIRCULAR LAYOUT MODE *****/ else if(layout_method == LAYOUT_CIRCULAR || layout_method == LAYOUT_CIRCULAR_MARKUP || layout_method == LAYOUT_CIRCULAR_BALLOON) { /* draw process icon */ nagios_icon_x = 0; nagios_icon_y = 0; draw_nagios_icon = TRUE; /* calculate coordinates for all hosts */ calculate_circular_coords(); } return; } /* calculates max possible image dimensions */ void calculate_total_image_bounds(void) { host *temp_host; total_image_width = 0; total_image_height = 0; /* check all extended host information entries... */ for(temp_host = host_list; temp_host != NULL; temp_host = temp_host->next) { /* only check entries that have 2-D coords specified */ if(temp_host->have_2d_coords == FALSE) continue; /* skip hosts we shouldn't be drawing */ if(temp_host->should_be_drawn == FALSE) continue; if(temp_host->x_2d > total_image_width) total_image_width = temp_host->x_2d; if(temp_host->y_2d > total_image_height) total_image_height = temp_host->y_2d; coordinates_were_specified = TRUE; } /* add some space for icon size and overlapping text... */ if(coordinates_were_specified == TRUE) { total_image_width += (DEFAULT_NODE_WIDTH * 2); total_image_height += DEFAULT_NODE_HEIGHT; /* add space for bottom margin if necessary */ total_image_height += bottom_margin; } /* image size should be at least as large as dimensions of background image */ if(total_image_width < background_image_width) total_image_width = background_image_width; if(total_image_height < background_image_height) total_image_height = background_image_height; /* we didn't find any hosts that had user-supplied coordinates, so we're going to display a warning */ if(coordinates_were_specified == FALSE) { coordinates_were_specified = FALSE; total_image_width = COORDS_WARNING_WIDTH; total_image_height = COORDS_WARNING_HEIGHT; } return; } /* calculates canvas coordinates/dimensions */ void calculate_canvas_bounds(void) { if(user_supplied_canvas == FALSE && strcmp(host_name, "all")) calculate_canvas_bounds_from_host(host_name); /* calculate canvas origin (based on total image bounds) */ if(canvas_x <= 0 || canvas_width > total_image_width) canvas_x = 0; if(canvas_y <= 0 || canvas_height > total_image_height) canvas_y = 0; /* calculate canvas dimensions */ if(canvas_height <= 0) canvas_height = (total_image_height - canvas_y); if(canvas_width <= 0) canvas_width = (total_image_width - canvas_x); if(canvas_x + canvas_width > total_image_width) canvas_width = total_image_width - canvas_x; if(canvas_y + canvas_height > total_image_height) canvas_height = total_image_height - canvas_y; return; } /* calculates canvas coordinates/dimensions around a particular host */ void calculate_canvas_bounds_from_host(char *hname) { host *temp_host; int zoom_width; int zoom_height; /* find the extended host info */ temp_host = find_host(hname); if(temp_host == NULL) return; /* make sure we have 2-D coords */ if(temp_host->have_2d_coords == FALSE) return; if(max_image_width > 0 && proximity_width > max_image_width) zoom_width = max_image_width; else zoom_width = proximity_width; if(max_image_height > 0 && proximity_height > max_image_height) zoom_height = max_image_height; else zoom_height = proximity_height; canvas_width = zoom_width; if(canvas_width >= total_image_width) canvas_x = 0; else canvas_x = (temp_host->x_2d - (zoom_width / 2)); canvas_height = zoom_height; if(canvas_height >= total_image_height) canvas_y = 0; else canvas_y = (temp_host->y_2d - (zoom_height / 2)); return; } /* calculates scaling factor used in image generation */ void calculate_scaling_factor(void) { double x_scaling = 1.0; double y_scaling = 1.0; /* calculate horizontal scaling factor */ if(max_image_width <= 0 || canvas_width <= max_image_width) x_scaling = 1.0; else x_scaling = (double)((double)max_image_width / (double)canvas_width); /* calculate vertical scaling factor */ if(max_image_height <= 0 || canvas_height <= max_image_height) y_scaling = 1.0; else y_scaling = (double)((double)max_image_height / (double)canvas_height); /* calculate general scaling factor to use */ if(x_scaling < y_scaling) scaling_factor = x_scaling; else scaling_factor = y_scaling; /*** USER-SUPPLIED SCALING FACTOR ***/ if(user_supplied_scaling == TRUE) scaling_factor = user_scaling_factor; return; } /* finds hosts that can be drawn in the canvas area */ void find_eligible_hosts(void) { int total_eligible_hosts = 0; host *temp_host; /* check all extended host information entries... */ for(temp_host = host_list; temp_host != NULL; temp_host = temp_host->next) { /* only include hosts that have 2-D coords supplied */ if(temp_host->have_2d_coords == FALSE) temp_host->should_be_drawn = FALSE; /* make sure coords are all positive */ else if(temp_host->x_2d < 0 || temp_host->y_2d < 0) temp_host->should_be_drawn = FALSE; /* make sure x coordinates fall within canvas bounds */ else if(temp_host->x_2d < (canvas_x - DEFAULT_NODE_WIDTH) || temp_host->x_2d > (canvas_x + canvas_width)) temp_host->should_be_drawn = FALSE; /* make sure y coordinates fall within canvas bounds */ else if(temp_host->y_2d < (canvas_y - DEFAULT_NODE_HEIGHT) || temp_host->y_2d > (canvas_y + canvas_height)) temp_host->should_be_drawn = FALSE; /* see if the user is authorized to view the host */ else if(is_authorized_for_host(temp_host, ¤t_authdata) == FALSE) temp_host->should_be_drawn = FALSE; /* all checks passed, so we can draw the host! */ else { temp_host->should_be_drawn = TRUE; total_eligible_hosts++; } } return; } /******************************************************************/ /*********************** DRAWING FUNCTIONS ************************/ /******************************************************************/ /* loads background image from file */ void load_background_image(void) { char temp_buffer[MAX_INPUT_BUFFER]; /* bail out if we shouldn't be drawing a background image */ if(layout_method != LAYOUT_USER_SUPPLIED || statusmap_background_image == NULL) return; snprintf(temp_buffer, sizeof(temp_buffer) - 1, "%s%s", physical_images_path, statusmap_background_image); temp_buffer[sizeof(temp_buffer) - 1] = '\x0'; /* read the background image into memory */ background_image = load_image_from_file(temp_buffer); /* grab background image dimensions for calculating total image width later */ if(background_image != NULL) { background_image_width = background_image->sx; background_image_height = background_image->sy; } /* if we are just creating the html, we don't need the image anymore */ if(create_type == CREATE_HTML && background_image != NULL) gdImageDestroy(background_image); return; } /* draws background image on drawing canvas */ void draw_background_image(void) { /* bail out if we shouldn't be drawing a background image */ if(create_type == CREATE_HTML || layout_method != LAYOUT_USER_SUPPLIED || statusmap_background_image == NULL) return; /* bail out if we don't have an image */ if(background_image == NULL) return; /* copy the background image to the canvas */ gdImageCopy(map_image, background_image, 0, 0, canvas_x, canvas_y, canvas_width, canvas_height); /* free memory for background image, as we don't need it anymore */ gdImageDestroy(background_image); return; } /* draws background "extras" */ void draw_background_extras(void) { /* bail out if we shouldn't be here */ if(create_type == CREATE_HTML) return; /* circular layout stuff... */ if(layout_method == LAYOUT_CIRCULAR_MARKUP) { /* draw colored sections... */ draw_circular_markup(); } return; } /* draws host links */ void draw_host_links(void) { host *this_host; host *main_host; host *parent_host; hostsmember *temp_hostsmember; int status_color = color_black; hoststatus *this_hoststatus; hoststatus *parent_hoststatus; int child_in_layer_list = FALSE; int parent_in_layer_list = FALSE; int dotted_line = FALSE; int x = 0; int y = 0; if(create_type == CREATE_HTML) return; if(use_links == FALSE) return; /* find the "main" host we're drawing */ main_host = find_host(host_name); if(show_all_hosts == TRUE) main_host = NULL; /* check all extended host information entries... */ for(this_host = host_list; this_host != NULL; this_host = this_host->next) { /* only draw link if user is authorized to view this host */ if(is_authorized_for_host(this_host, ¤t_authdata) == FALSE) continue; /* this is a "root" host, so draw link to Nagios process icon if using auto-layout mode */ if(this_host->parent_hosts == NULL && layout_method != LAYOUT_USER_SUPPLIED && draw_nagios_icon == TRUE) { x = this_host->x_2d + (DEFAULT_NODE_WIDTH / 2) - canvas_x; y = this_host->y_2d + (DEFAULT_NODE_WIDTH / 2) - canvas_y; draw_line(x, y, nagios_icon_x + (DEFAULT_NODE_WIDTH / 2) - canvas_x, nagios_icon_y + (DEFAULT_NODE_WIDTH / 2) - canvas_y, color_black); } /* this is a child of the main host we're drawing in auto-layout mode... */ if(layout_method != LAYOUT_USER_SUPPLIED && draw_child_links == TRUE && number_of_immediate_child_hosts(this_host) > 0 && is_host_immediate_child_of_host(main_host, this_host) == TRUE) { /* determine color to use when drawing links to children */ this_hoststatus = find_hoststatus(this_host->name); if(this_hoststatus != NULL) { if(this_hoststatus->status == SD_HOST_DOWN || this_hoststatus->status == SD_HOST_UNREACHABLE) status_color = color_red; else status_color = color_black; } else status_color = color_black; x = this_host->x_2d + (DEFAULT_NODE_WIDTH / 2) - canvas_x; y = (this_host->y_2d + (DEFAULT_NODE_WIDTH) / 2) - canvas_y; draw_dashed_line(x, y, x, y + DEFAULT_NODE_HEIGHT + DEFAULT_NODE_VSPACING, status_color); /* draw arrow tips */ draw_line(x, y + DEFAULT_NODE_HEIGHT + DEFAULT_NODE_VSPACING, x - 5, y + DEFAULT_NODE_HEIGHT + DEFAULT_NODE_VSPACING - 5, color_black); draw_line(x, y + DEFAULT_NODE_HEIGHT + DEFAULT_NODE_VSPACING, x + 5, y + DEFAULT_NODE_HEIGHT + DEFAULT_NODE_VSPACING - 5, color_black); } /* this is a parent of the main host we're drawing in auto-layout mode... */ if(layout_method != LAYOUT_USER_SUPPLIED && draw_parent_links == TRUE && is_host_immediate_child_of_host(this_host, main_host) == TRUE) { x = this_host->x_2d + (DEFAULT_NODE_WIDTH / 2) - canvas_x; y = this_host->y_2d + (DEFAULT_NODE_WIDTH / 2) - canvas_y; draw_dashed_line(x, y, x, y - DEFAULT_NODE_HEIGHT - DEFAULT_NODE_VSPACING, color_black); /* draw arrow tips */ draw_line(x, y - DEFAULT_NODE_HEIGHT - DEFAULT_NODE_VSPACING, x - 5, y - DEFAULT_NODE_HEIGHT - DEFAULT_NODE_VSPACING + 5, color_black); draw_line(x, y - DEFAULT_NODE_HEIGHT - DEFAULT_NODE_VSPACING, x + 5, y - DEFAULT_NODE_HEIGHT - DEFAULT_NODE_VSPACING + 5, color_black); } /* draw links to all parent hosts */ for(temp_hostsmember = this_host->parent_hosts; temp_hostsmember != NULL; temp_hostsmember = temp_hostsmember->next) { /* find the parent host config entry */ parent_host = find_host(temp_hostsmember->host_name); if(parent_host == NULL) continue; /* don't draw the link if we don't have the coords */ if(parent_host->have_2d_coords == FALSE || this_host->have_2d_coords == FALSE) continue; /* only draw link if user is authorized for this parent host */ if(is_authorized_for_host(parent_host, ¤t_authdata) == FALSE) continue; /* are the hosts in the layer list? */ child_in_layer_list = is_host_in_layer_list(this_host); parent_in_layer_list = is_host_in_layer_list(parent_host); /* use dotted or solid line? */ /* either the child or parent should not be drawn, so use a dotted line */ if((child_in_layer_list == TRUE && parent_in_layer_list == FALSE) || (child_in_layer_list == FALSE && parent_in_layer_list == TRUE)) dotted_line = TRUE; /* both hosts should not be drawn, so use a dotted line */ else if((child_in_layer_list == FALSE && parent_in_layer_list == FALSE && exclude_layers == FALSE) || (child_in_layer_list == TRUE && parent_in_layer_list == TRUE && exclude_layers == TRUE)) dotted_line = TRUE; /* both hosts should be drawn, so use a solid line */ else dotted_line = FALSE; /* determine color to use when drawing links to parent host */ parent_hoststatus = find_hoststatus(parent_host->name); if(parent_hoststatus != NULL) { if(parent_hoststatus->status == SD_HOST_DOWN || parent_hoststatus->status == SD_HOST_UNREACHABLE) status_color = color_red; else status_color = color_black; } else status_color = color_black; /* draw the link */ if(dotted_line == TRUE) draw_dotted_line((this_host->x_2d + (DEFAULT_NODE_WIDTH / 2)) - canvas_x, (this_host->y_2d + (DEFAULT_NODE_WIDTH) / 2) - canvas_y, (parent_host->x_2d + (DEFAULT_NODE_WIDTH / 2)) - canvas_x, (parent_host->y_2d + (DEFAULT_NODE_WIDTH / 2)) - canvas_y, status_color); else draw_line((this_host->x_2d + (DEFAULT_NODE_WIDTH / 2)) - canvas_x, (this_host->y_2d + (DEFAULT_NODE_WIDTH) / 2) - canvas_y, (parent_host->x_2d + (DEFAULT_NODE_WIDTH / 2)) - canvas_x, (parent_host->y_2d + (DEFAULT_NODE_WIDTH / 2)) - canvas_y, status_color); } } return; } /* draws hosts */ void draw_hosts(void) { host *temp_host; int x1, x2; int y1; int has_image = FALSE; char image_input_file[MAX_INPUT_BUFFER]; int current_radius = 0; int status_color = color_black; hoststatus *temp_hoststatus; int in_layer_list = FALSE; int average_host_services; int host_services; double host_services_ratio; int outer_radius; int inner_radius; int time_color = 0; time_t current_time; int translated_x; int translated_y; /* user didn't supply any coordinates for hosts, so display a warning */ if(coordinates_were_specified == FALSE) { if(create_type == CREATE_IMAGE) { draw_text("You have not supplied any host drawing coordinates, so you cannot use this layout method.", (COORDS_WARNING_WIDTH / 2), 30, color_black); draw_text("Read the FAQs for more information on specifying drawing coordinates or select a different layout method.", (COORDS_WARNING_WIDTH / 2), 45, color_black); } return; } /* draw Nagios process icon if using auto-layout mode */ if(layout_method != LAYOUT_USER_SUPPLIED && draw_nagios_icon == TRUE) { /* get coords of bounding box */ x1 = nagios_icon_x - canvas_x; x2 = x1 + DEFAULT_NODE_WIDTH; y1 = nagios_icon_y - canvas_y; /* get the name of the image file to open for the logo */ snprintf(image_input_file, sizeof(image_input_file) - 1, "%s%s", physical_logo_images_path, NAGIOS_GD2_ICON); image_input_file[sizeof(image_input_file) - 1] = '\x0'; /* read in the image from file... */ logo_image = load_image_from_file(image_input_file); /* copy the logo image to the canvas image... */ if(logo_image != NULL) { gdImageCopy(map_image, logo_image, x1, y1, 0, 0, logo_image->sx, logo_image->sy); gdImageDestroy(logo_image); } /* if we don't have an image, draw a bounding box */ else { draw_line(x1, y1, x1, y1 + DEFAULT_NODE_WIDTH, color_black); draw_line(x1, y1 + DEFAULT_NODE_WIDTH, x2, y1 + DEFAULT_NODE_WIDTH, color_black); draw_line(x2, y1 + DEFAULT_NODE_WIDTH, x2, y1, color_black); draw_line(x2, y1, x1, y1, color_black); } if(create_type == CREATE_IMAGE) draw_text("Nagios Process", x1 + (DEFAULT_NODE_WIDTH / 2), y1 + DEFAULT_NODE_HEIGHT, color_black); } /* calculate average services per host */ average_host_services = 4; /* draw all hosts... */ for(temp_host = host_list; temp_host != NULL; temp_host = temp_host->next) { /* skip hosts that should not be drawn */ if(temp_host->should_be_drawn == FALSE) continue; /* is this host in the layer inclusion/exclusion list? */ in_layer_list = is_host_in_layer_list(temp_host); if((in_layer_list == TRUE && exclude_layers == TRUE) || (in_layer_list == FALSE && exclude_layers == FALSE)) continue; /* get coords of host bounding box */ x1 = temp_host->x_2d - canvas_x; x2 = x1 + DEFAULT_NODE_WIDTH; y1 = temp_host->y_2d - canvas_y; if(create_type == CREATE_IMAGE) { temp_hoststatus = find_hoststatus(temp_host->name); if(temp_hoststatus != NULL) { if(temp_hoststatus->status == SD_HOST_DOWN) status_color = color_red; else if(temp_hoststatus->status == SD_HOST_UNREACHABLE) status_color = color_red; else if(temp_hoststatus->status == SD_HOST_UP) status_color = color_green; else if(temp_hoststatus->status == HOST_PENDING) status_color = color_grey; } else status_color = color_black; /* use balloons instead of icons... */ if(layout_method == LAYOUT_CIRCULAR_BALLOON) { /* get the number of services associated with the host */ host_services = number_of_host_services(temp_host); if(average_host_services == 0) host_services_ratio = 0.0; else host_services_ratio = (double)((double)host_services / (double)average_host_services); /* calculate size of node */ if(host_services_ratio >= 2.0) outer_radius = DEFAULT_NODE_WIDTH; else if(host_services_ratio >= 1.5) outer_radius = DEFAULT_NODE_WIDTH * 0.8; else if(host_services_ratio >= 1.0) outer_radius = DEFAULT_NODE_WIDTH * 0.6; else if(host_services_ratio >= 0.5) outer_radius = DEFAULT_NODE_WIDTH * 0.4; else outer_radius = DEFAULT_NODE_WIDTH * 0.2; /* calculate width of border */ if(temp_hoststatus == NULL) inner_radius = outer_radius; else if((temp_hoststatus->status == SD_HOST_DOWN || temp_hoststatus->status == SD_HOST_UNREACHABLE) && temp_hoststatus->problem_has_been_acknowledged == FALSE) inner_radius = outer_radius - 3; else inner_radius = outer_radius; /* fill node with color based on how long its been in this state... */ gdImageArc(map_image, x1 + (DEFAULT_NODE_WIDTH / 2), y1 + (DEFAULT_NODE_WIDTH / 2), outer_radius, outer_radius, 0, 360, color_blue); /* determine fill color */ time(¤t_time); if(temp_hoststatus == NULL) time_color = color_white; else if(current_time - temp_hoststatus->last_state_change <= 900) time_color = color_orange; else if(current_time - temp_hoststatus->last_state_change <= 3600) time_color = color_yellow; else time_color = color_white; /* fill node with appropriate time color */ /* the fill function only works with coordinates that are in bounds of the actual image */ translated_x = x1 + (DEFAULT_NODE_WIDTH / 2); translated_y = y1 + (DEFAULT_NODE_WIDTH / 2); if(translated_x > 0 && translated_y > 0 && translated_x < canvas_width && translated_y < canvas_height) gdImageFillToBorder(map_image, translated_x, translated_y, color_blue, time_color); /* border of node should reflect current state */ for(current_radius = outer_radius; current_radius >= inner_radius; current_radius--) gdImageArc(map_image, x1 + (DEFAULT_NODE_WIDTH / 2), y1 + (DEFAULT_NODE_WIDTH / 2), current_radius, current_radius, 0, 360, status_color); /* draw circles around the selected host (if there is one) */ if(!strcmp(host_name, temp_host->name) && use_highlights == TRUE) { for(current_radius = DEFAULT_NODE_WIDTH * 2; current_radius > 0; current_radius -= 10) gdImageArc(map_image, x1 + (DEFAULT_NODE_WIDTH / 2), y1 + (DEFAULT_NODE_WIDTH / 2), current_radius, current_radius, 0, 360, status_color); } } /* normal method is to use icons for hosts... */ else { /* draw a target around root hosts (hosts with no parents) */ if(temp_host != NULL && use_highlights == TRUE) { if(temp_host->parent_hosts == NULL) { gdImageArc(map_image, x1 + (DEFAULT_NODE_WIDTH / 2), y1 + (DEFAULT_NODE_WIDTH / 2), (DEFAULT_NODE_WIDTH * 2), (DEFAULT_NODE_WIDTH * 2), 0, 360, status_color); draw_line(x1 - (DEFAULT_NODE_WIDTH / 2), y1 + (DEFAULT_NODE_WIDTH / 2), x1 + (DEFAULT_NODE_WIDTH * 3 / 2), y1 + (DEFAULT_NODE_WIDTH / 2), status_color); draw_line(x1 + (DEFAULT_NODE_WIDTH / 2), y1 - (DEFAULT_NODE_WIDTH / 2), x1 + (DEFAULT_NODE_WIDTH / 2), y1 + (DEFAULT_NODE_WIDTH * 3 / 2), status_color); } } /* draw circles around the selected host (if there is one) */ if(!strcmp(host_name, temp_host->name) && use_highlights == TRUE) { for(current_radius = DEFAULT_NODE_WIDTH * 2; current_radius > 0; current_radius -= 10) gdImageArc(map_image, x1 + (DEFAULT_NODE_WIDTH / 2), y1 + (DEFAULT_NODE_WIDTH / 2), current_radius, current_radius, 0, 360, status_color); } if(temp_host->statusmap_image != NULL) has_image = TRUE; else has_image = FALSE; /* load the logo associated with this host */ if(has_image == TRUE) { /* get the name of the image file to open for the logo */ snprintf(image_input_file, sizeof(image_input_file) - 1, "%s%s", physical_logo_images_path, temp_host->statusmap_image); image_input_file[sizeof(image_input_file) - 1] = '\x0'; /* read in the logo image from file... */ logo_image = load_image_from_file(image_input_file); /* copy the logo image to the canvas image... */ if(logo_image != NULL) { gdImageCopy(map_image, logo_image, x1, y1, 0, 0, logo_image->sx, logo_image->sy); gdImageDestroy(logo_image); } else has_image = FALSE; } /* if the host doesn't have an image associated with it (or the user doesn't have rights to see this host), use the unknown image */ if(has_image == FALSE) { if(unknown_logo_image != NULL) gdImageCopy(map_image, unknown_logo_image, x1, y1, 0, 0, unknown_logo_image->sx, unknown_logo_image->sy); else { /* last ditch effort - draw a host bounding box */ draw_line(x1, y1, x1, y1 + DEFAULT_NODE_WIDTH, color_black); draw_line(x1, y1 + DEFAULT_NODE_WIDTH, x2, y1 + DEFAULT_NODE_WIDTH, color_black); draw_line(x2, y1 + DEFAULT_NODE_WIDTH, x2, y1, color_black); draw_line(x2, y1, x1, y1, color_black); } } } /* draw host name, status, etc. */ draw_host_text(temp_host->name, x1 + (DEFAULT_NODE_WIDTH / 2), y1 + DEFAULT_NODE_HEIGHT); } /* we're creating HTML image map... */ else { printf("name)) printf("href='%s?host=%s' ", STATUS_CGI, url_encode(temp_host->name)); else { #ifdef LEGACY_GRAPHICAL_CGIS printf("href='%s?host=%s&layout=%d&max_width=%d&max_height=%d&proximity_width=%d&proximity_height=%d%s%s%s%s%s", STATUSMAP_CGI, url_encode(temp_host->name), layout_method, max_image_width, max_image_height, proximity_width, proximity_height, (display_header == TRUE) ? "" : "&noheader", (use_links == FALSE) ? "&nolinks" : "", (use_text == FALSE) ? "¬ext" : "", (use_highlights == FALSE) ? "&nohighlights" : "", (display_popups == FALSE) ? "&nopopups" : ""); #else printf("href='%s?host=%s&layout=%d&max_width=%d&max_height=%d&proximity_width=%d&proximity_height=%d%s%s%s%s%s", LEGACY_STATUSMAP_CGI, url_encode(temp_host->name), layout_method, max_image_width, max_image_height, proximity_width, proximity_height, (display_header == TRUE) ? "" : "&noheader", (use_links == FALSE) ? "&nolinks" : "", (use_text == FALSE) ? "¬ext" : "", (use_highlights == FALSE) ? "&nohighlights" : "", (display_popups == FALSE) ? "&nopopups" : ""); #endif if(user_supplied_scaling == TRUE) printf("&scaling_factor=%2.1f", user_scaling_factor); print_layer_url(TRUE); printf("' "); } /* popup text */ if(display_popups == TRUE) { printf("onMouseOver='showPopup(\""); write_host_popup_text(find_host(temp_host->name)); printf("\",event)' onMouseOut='hidePopup()'"); } printf(">\n"); } } return; } /* draws text */ void draw_text(char *buffer, int x, int y, int text_color) { int string_width = 0; int string_height = 0; /* write the string to the generated image... */ string_height = gdFontSmall->h; string_width = gdFontSmall->w * strlen(buffer); if(layout_method != LAYOUT_CIRCULAR_MARKUP) gdImageFilledRectangle(map_image, x - (string_width / 2) - 2, y - (2 * string_height), x + (string_width / 2) + 2, y - string_height, color_white); gdImageString(map_image, gdFontSmall, x - (string_width / 2), y - (2 * string_height), (unsigned char *)buffer, text_color); return; } /* draws host text */ void draw_host_text(char *name, int x, int y) { hoststatus *temp_hoststatus; int status_color = color_black; char temp_buffer[MAX_INPUT_BUFFER]; if(use_text == FALSE) return; strncpy(temp_buffer, name, sizeof(temp_buffer) - 1); temp_buffer[sizeof(temp_buffer) - 1] = '\x0'; /* write the host status string to the generated image... */ draw_text(temp_buffer, x, y, color_black); /* find the status entry for this host */ temp_hoststatus = find_hoststatus(name); /* get the status of the host (pending, up, down, or unreachable) */ if(temp_hoststatus != NULL) { /* draw the status string */ if(temp_hoststatus->status == SD_HOST_DOWN) { strncpy(temp_buffer, "Down", sizeof(temp_buffer)); status_color = color_red; } else if(temp_hoststatus->status == SD_HOST_UNREACHABLE) { strncpy(temp_buffer, "Unreachable", sizeof(temp_buffer)); status_color = color_red; } else if(temp_hoststatus->status == SD_HOST_UP) { strncpy(temp_buffer, "Up", sizeof(temp_buffer)); status_color = color_green; } else if(temp_hoststatus->status == HOST_PENDING) { strncpy(temp_buffer, "Pending", sizeof(temp_buffer)); status_color = color_grey; } else { strncpy(temp_buffer, "Unknown", sizeof(temp_buffer)); status_color = color_orange; } temp_buffer[sizeof(temp_buffer) - 1] = '\x0'; /* write the host status string to the generated image... */ draw_text(temp_buffer, x, y + gdFontSmall->h, status_color); } return; } /* writes popup text for a specific host */ void write_host_popup_text(host *hst) { hoststatus *temp_status = NULL; hostsmember *temp_hostsmember = NULL; char *processed_string = NULL; int service_totals; char date_time[48]; time_t current_time; time_t t; char state_duration[48]; int days; int hours; int minutes; int seconds; if(hst == NULL) { printf("Host data not found"); return; } /* find the status entry for this host */ temp_status = find_hoststatus(hst->name); if(temp_status == NULL) { printf("Host status information not found"); return; } /* grab macros */ grab_host_macros_r(mac, hst); /* strip nasty stuff from plugin output */ sanitize_plugin_output(temp_status->plugin_output); printf(""); printf(""); printf("", (hst->icon_image_alt == NULL) ? "" : html_encode(hst->icon_image_alt, TRUE)); printf("", escape_string(hst->name)); printf("", escape_string(hst->alias)); printf("", html_encode(hst->address, TRUE)); printf(""); printf("", (temp_status->plugin_output == NULL) ? "" : temp_status->plugin_output); current_time = time(NULL); if(temp_status->last_state_change == (time_t)0) t = current_time - program_start; else t = current_time - temp_status->last_state_change; get_time_breakdown((unsigned long)t, &days, &hours, &minutes, &seconds); snprintf(state_duration, sizeof(state_duration) - 1, "%2dd %2dh %2dm %2ds%s", days, hours, minutes, seconds, (temp_status->last_state_change == (time_t)0) ? "+" : ""); state_duration[sizeof(state_duration) - 1] = '\x0'; printf("", state_duration); get_time_string(&temp_status->last_check, date_time, (int)sizeof(date_time), SHORT_DATE_TIME); printf("", (temp_status->last_check == (time_t)0) ? "N/A" : date_time); get_time_string(&temp_status->last_state_change, date_time, (int)sizeof(date_time), SHORT_DATE_TIME); printf("", (temp_status->last_state_change == (time_t)0) ? "N/A" : date_time); printf(""); printf(""); printf("
    icon_image == NULL) printf("%s", UNKNOWN_ICON_IMAGE); else { process_macros_r(mac, hst->icon_image, &processed_string, 0); printf("%s", processed_string); free(processed_string); } printf("\\\" border=0 width=40 height=40>%s
    Name:%s
    Alias:%s
    Address:%s
    State:"); /* get the status of the host (pending, up, down, or unreachable) */ if(temp_status->status == SD_HOST_DOWN) { printf("Down"); if(temp_status->problem_has_been_acknowledged == TRUE) printf(" (Acknowledged)"); printf(""); } else if(temp_status->status == SD_HOST_UNREACHABLE) { printf("Unreachable"); if(temp_status->problem_has_been_acknowledged == TRUE) printf(" (Acknowledged)"); printf(""); } else if(temp_status->status == SD_HOST_UP) printf("Up"); else if(temp_status->status == HOST_PENDING) printf("Pending"); printf("
    Status Information:%s
    State Duration:%s
    Last Status Check:%s
    Last State Change:%s
    Parent Host(s):"); if(hst->parent_hosts == NULL) printf("None (This is a root host)"); else { for(temp_hostsmember = hst->parent_hosts; temp_hostsmember != NULL; temp_hostsmember = temp_hostsmember->next) printf("%s%s", (temp_hostsmember == hst->parent_hosts) ? "" : ", ", html_encode(temp_hostsmember->host_name, TRUE)); } printf("
    Immediate Child Hosts:"); printf("%d", number_of_immediate_child_hosts(hst)); printf("
    "); printf("
    Services:
    "); service_totals = get_servicestatus_count(hst->name, SERVICE_OK); if(service_totals > 0) printf("- %d ok
    ", service_totals); service_totals = get_servicestatus_count(hst->name, SERVICE_CRITICAL); if(service_totals > 0) printf("- %d critical
    ", service_totals); service_totals = get_servicestatus_count(hst->name, SERVICE_WARNING); if(service_totals > 0) printf("- %d warning
    ", service_totals); service_totals = get_servicestatus_count(hst->name, SERVICE_UNKNOWN); if(service_totals > 0) printf("- %d unknown
    ", service_totals); service_totals = get_servicestatus_count(hst->name, SERVICE_PENDING); if(service_totals > 0) printf("- %d pending
    ", service_totals); return; } /* draws a solid line */ void draw_line(int x1, int y1, int x2, int y2, int color) { if(create_type == CREATE_HTML) return; gdImageLine(map_image, x1, y1, x2, y2, color); return; } /* draws a dotted line */ void draw_dotted_line(int x1, int y1, int x2, int y2, int color) { int styleDotted[12]; styleDotted[0] = color; styleDotted[1] = gdTransparent; styleDotted[2] = gdTransparent; styleDotted[3] = gdTransparent; styleDotted[4] = gdTransparent; styleDotted[5] = gdTransparent; styleDotted[6] = color; styleDotted[7] = gdTransparent; styleDotted[8] = gdTransparent; styleDotted[9] = gdTransparent; styleDotted[10] = gdTransparent; styleDotted[11] = gdTransparent; /* sets current style to a dashed line */ gdImageSetStyle(map_image, styleDotted, 12); /* draws a line (dotted) */ gdImageLine(map_image, x1, y1, x2, y2, gdStyled); return; } /* draws a dashed line */ void draw_dashed_line(int x1, int y1, int x2, int y2, int color) { int styleDashed[12]; styleDashed[0] = color; styleDashed[1] = color; styleDashed[2] = color; styleDashed[3] = color; styleDashed[4] = gdTransparent; styleDashed[5] = gdTransparent; styleDashed[6] = color; styleDashed[7] = color; styleDashed[8] = color; styleDashed[9] = color; styleDashed[10] = gdTransparent; styleDashed[11] = gdTransparent; /* sets current style to a dashed line */ gdImageSetStyle(map_image, styleDashed, 12); /* draws a line (dashed) */ gdImageLine(map_image, x1, y1, x2, y2, gdStyled); return; } /******************************************************************/ /*********************** GRAPHICS FUNCTIONS ***********************/ /******************************************************************/ /* initialize graphics */ int initialize_graphics(void) { char image_input_file[MAX_INPUT_BUFFER]; if(create_type == CREATE_HTML) return ERROR; /* allocate buffer for storing image */ #ifndef HAVE_GDIMAGECREATETRUECOLOR map_image = gdImageCreate(canvas_width, canvas_height); #else map_image = gdImageCreateTrueColor(canvas_width, canvas_height); #endif if(map_image == NULL) return ERROR; /* allocate colors used for drawing */ color_white = gdImageColorAllocate(map_image, 255, 255, 255); color_black = gdImageColorAllocate(map_image, 0, 0, 0); color_grey = gdImageColorAllocate(map_image, 128, 128, 128); color_lightgrey = gdImageColorAllocate(map_image, 210, 210, 210); color_red = gdImageColorAllocate(map_image, 255, 0, 0); color_lightred = gdImageColorAllocate(map_image, 215, 175, 175); color_green = gdImageColorAllocate(map_image, 0, 175, 0); color_lightgreen = gdImageColorAllocate(map_image, 210, 255, 215); color_blue = gdImageColorAllocate(map_image, 0, 0, 255); color_yellow = gdImageColorAllocate(map_image, 255, 255, 0); color_orange = gdImageColorAllocate(map_image, 255, 100, 25); color_transparency_index = gdImageColorAllocate(map_image, color_transparency_index_r, color_transparency_index_g, color_transparency_index_b); /* set transparency index */ #ifndef HAVE_GDIMAGECREATETRUECOLOR gdImageColorTransparent(map_image, color_white); #else gdImageColorTransparent(map_image, color_transparency_index); /* set background */ gdImageFill(map_image, 0, 0, color_transparency_index); #endif /* make sure the graphic is interlaced */ gdImageInterlace(map_image, 1); /* get the path where we will be reading logo images from (GD2 format)... */ snprintf(physical_logo_images_path, sizeof(physical_logo_images_path) - 1, "%slogos/", physical_images_path); physical_logo_images_path[sizeof(physical_logo_images_path) - 1] = '\x0'; /* load the unknown icon to use for hosts that don't have pretty images associated with them... */ snprintf(image_input_file, sizeof(image_input_file) - 1, "%s%s", physical_logo_images_path, UNKNOWN_GD2_ICON); image_input_file[sizeof(image_input_file) - 1] = '\x0'; unknown_logo_image = load_image_from_file(image_input_file); return OK; } /* loads a graphic image (GD2, JPG or PNG) from file into memory */ gdImagePtr load_image_from_file(char *filename) { FILE *fp; gdImagePtr im = NULL; char *ext; /* make sure we were passed a file name */ if(filename == NULL) return NULL; /* find the file extension */ if((ext = rindex(filename, '.')) == NULL) return NULL; /* open the file for reading (binary mode) */ fp = fopen(filename, "rb"); if(fp == NULL) return NULL; /* attempt to read files in various formats */ if(!strcasecmp(ext, ".png")) im = gdImageCreateFromPng(fp); else if(!strcasecmp(ext, ".jpg") || !strcasecmp(ext, ".jpeg")) im = gdImageCreateFromJpeg(fp); else if(!strcasecmp(ext, ".xbm")) im = gdImageCreateFromXbm(fp); else if(!strcasecmp(ext, ".gd2")) im = gdImageCreateFromGd2(fp); else if(!strcasecmp(ext, ".gd")) im = gdImageCreateFromGd(fp); /* fall back to GD2 image format */ else im = gdImageCreateFromGd2(fp); /* close the file */ fclose(fp); return im; } /* draw graphics */ void write_graphics(void) { FILE *image_output_file = NULL; if(create_type == CREATE_HTML) return; /* use STDOUT for writing the image data... */ image_output_file = stdout; /* write the image out in PNG format */ gdImagePng(map_image, image_output_file); /* or we could write the image out in JPG format... */ /*gdImageJpeg(map_image,image_output_file,99);*/ return; } /* cleanup graphics resources */ void cleanup_graphics(void) { if(create_type == CREATE_HTML) return; /* free memory allocated to image */ gdImageDestroy(map_image); return; } /******************************************************************/ /************************* MISC FUNCTIONS *************************/ /******************************************************************/ /* write JavaScript code an layer for popup window */ void write_popup_code(void) { char *border_color = "#000000"; char *background_color = "#ffffcc"; int border = 1; int padding = 3; int x_offset = 3; int y_offset = 3; printf("\n"); return; } /* adds a layer to the list in memory */ int add_layer(char *group_name) { struct layer *new_layer; if(group_name == NULL) return ERROR; /* allocate memory for a new layer */ new_layer = (struct layer *)malloc(sizeof(struct layer)); if(new_layer == NULL) return ERROR; new_layer->layer_name = (char *)malloc(strlen(group_name) + 1); if(new_layer->layer_name == NULL) { free(new_layer); return ERROR; } strcpy(new_layer->layer_name, group_name); /* add new layer to head of layer list */ new_layer->next = layer_list; layer_list = new_layer; return OK; } /* frees memory allocated to the layer list */ void free_layer_list(void) { struct layer *this_layer, *next_layer; return; for(this_layer = layer_list; layer_list != NULL; this_layer = next_layer) { next_layer = this_layer->next; free(this_layer->layer_name); free(this_layer); } return; } /* checks to see if a host is in the layer list */ int is_host_in_layer_list(host *hst) { hostgroup *temp_hostgroup; struct layer *temp_layer; if(hst == NULL) return FALSE; /* check each layer... */ for(temp_layer = layer_list; temp_layer != NULL; temp_layer = temp_layer->next) { /* find the hostgroup */ temp_hostgroup = find_hostgroup(temp_layer->layer_name); if(temp_hostgroup == NULL) continue; /* is the requested host a member of the hostgroup/layer? */ if(is_host_member_of_hostgroup(temp_hostgroup, hst) == TRUE) return TRUE; } return FALSE; } /* print layer url info */ void print_layer_url(int get_method) { struct layer *temp_layer; for(temp_layer = layer_list; temp_layer != NULL; temp_layer = temp_layer->next) { if(get_method == TRUE) printf("&layer=%s", escape_string(temp_layer->layer_name)); else printf("\n", escape_string(temp_layer->layer_name)); } if(get_method == TRUE) printf("&layermode=%s", (exclude_layers == TRUE) ? "exclude" : "include"); else printf("\n", (exclude_layers == TRUE) ? "exclude" : "include"); return; } /******************************************************************/ /************************ UTILITY FUNCTIONS ***********************/ /******************************************************************/ /* calculates how many "layers" separate parent and child - used by collapsed tree layout method */ int host_child_depth_separation(host *parent, host *child) { int this_depth = 0; int min_depth = 0; int have_min_depth = FALSE; host *temp_host; if(child == NULL) return -1; if(parent == child) return 0; if(is_host_immediate_child_of_host(parent, child) == TRUE) return 1; for(temp_host = host_list; temp_host != NULL; temp_host = temp_host->next) { if(is_host_immediate_child_of_host(parent, temp_host) == TRUE) { this_depth = host_child_depth_separation(temp_host, child); if(this_depth >= 0 && (have_min_depth == FALSE || (have_min_depth == TRUE && (this_depth < min_depth)))) { have_min_depth = TRUE; min_depth = this_depth; } } } if(have_min_depth == FALSE) return -1; else return min_depth + 1; } /* calculates how many hosts reside on a specific "layer" - used by collapsed tree layout method */ int number_of_host_layer_members(host *parent, int layer) { int current_layer; int layer_members = 0; host *temp_host; for(temp_host = host_list; temp_host != NULL; temp_host = temp_host->next) { current_layer = host_child_depth_separation(parent, temp_host); if(current_layer == layer) layer_members++; } return layer_members; } /* calculate max number of members on all "layers" beneath and including parent host - used by collapsed tree layout method */ int max_child_host_layer_members(host *parent) { int current_layer; int max_members = 1; int current_members = 0; for(current_layer = 1;; current_layer++) { current_members = number_of_host_layer_members(parent, current_layer); if(current_members <= 0) break; if(current_members > max_members) max_members = current_members; } return max_members; } /* calculate max drawing width for host and children - used by balanced tree layout method */ int max_child_host_drawing_width(host *parent) { host *temp_host; int child_width = 0; for(temp_host = host_list; temp_host != NULL; temp_host = temp_host->next) { if(is_host_immediate_child_of_host(parent, temp_host) == TRUE) child_width += max_child_host_drawing_width(temp_host); } /* no children, so set width to 1 for this host */ if(child_width == 0) return 1; else return child_width; } /* calculates number of services associated with a particular service */ int number_of_host_services(host *hst) { service *temp_service; int total_services = 0; if(hst == NULL) return 0; /* check all the services */ for(temp_service = service_list; temp_service != NULL; temp_service = temp_service->next) { if(!strcmp(temp_service->host_name, hst->name)) total_services++; } return total_services; } /******************************************************************/ /***************** COORDINATE CALCULATION FUNCTIONS ***************/ /******************************************************************/ /* calculates coords of a host's children - used by balanced tree layout method */ void calculate_balanced_tree_coords(host *parent, int x, int y) { int parent_drawing_width; int start_drawing_x; int current_drawing_x; int this_drawing_width; host *temp_host; /* calculate total drawing width of parent host */ parent_drawing_width = max_child_host_drawing_width(parent); /* calculate starting x coord */ start_drawing_x = x - (((DEFAULT_NODE_WIDTH * parent_drawing_width) + (DEFAULT_NODE_HSPACING * (parent_drawing_width - 1))) / 2); current_drawing_x = start_drawing_x; /* calculate coords for children */ for(temp_host = host_list; temp_host != NULL; temp_host = temp_host->next) { if(is_host_immediate_child_of_host(parent, temp_host) == TRUE) { /* get drawing width of child host */ this_drawing_width = max_child_host_drawing_width(temp_host); temp_host->x_2d = current_drawing_x + (((DEFAULT_NODE_WIDTH * this_drawing_width) + (DEFAULT_NODE_HSPACING * (this_drawing_width - 1))) / 2); temp_host->y_2d = y + DEFAULT_NODE_HEIGHT + DEFAULT_NODE_VSPACING; temp_host->have_2d_coords = TRUE; temp_host->should_be_drawn = TRUE; current_drawing_x += (this_drawing_width * DEFAULT_NODE_WIDTH) + ((this_drawing_width - 1) * DEFAULT_NODE_HSPACING) + DEFAULT_NODE_HSPACING; /* recurse into child host ... */ calculate_balanced_tree_coords(temp_host, temp_host->x_2d, temp_host->y_2d); } } return; } /* calculate coords of all hosts in circular layout method */ void calculate_circular_coords(void) { int min_x = 0; int min_y = 0; int have_min_x = FALSE; int have_min_y = FALSE; host *temp_host; /* calculate all host coords, starting with first layer */ calculate_circular_layer_coords(NULL, 0.0, 360.0, 1, CIRCULAR_DRAWING_RADIUS); /* adjust all calculated coords so none are negative in x or y axis... */ /* calculate min x, y coords */ for(temp_host = host_list; temp_host != NULL; temp_host = temp_host->next) { if(have_min_x == FALSE || temp_host->x_2d < min_x) { have_min_x = TRUE; min_x = temp_host->x_2d; } if(have_min_y == FALSE || temp_host->y_2d < min_y) { have_min_y = TRUE; min_y = temp_host->y_2d; } } /* offset all drawing coords by the min x,y coords we found */ for(temp_host = host_list; temp_host != NULL; temp_host = temp_host->next) { if(min_x < 0) temp_host->x_2d -= min_x; if(min_y < 0) temp_host->y_2d -= min_y; } if(min_x < 0) nagios_icon_x -= min_x; if(min_y < 0) nagios_icon_y -= min_y; for(temp_host = host_list; temp_host != NULL; temp_host = temp_host->next) { temp_host->x_2d += (DEFAULT_NODE_WIDTH / 2); temp_host->y_2d += (DEFAULT_NODE_HEIGHT / 2); } nagios_icon_x += (DEFAULT_NODE_WIDTH / 2); nagios_icon_y += (DEFAULT_NODE_HEIGHT / 2); return; } /* calculates coords of all hosts in a particular "layer" in circular layout method */ void calculate_circular_layer_coords(host *parent, double start_angle, double useable_angle, int layer, int radius) { int parent_drawing_width = 0; int this_drawing_width = 0; int immediate_children = 0; double current_drawing_angle = 0.0; double this_drawing_angle = 0.0; double available_angle = 0.0; double clipped_available_angle = 0.0; double x_coord = 0.0; double y_coord = 0.0; host *temp_host; /* get the total number of immediate children to this host */ immediate_children = number_of_immediate_child_hosts(parent); /* bail out if we're done */ if(immediate_children == 0) return; /* calculate total drawing "width" of parent host */ parent_drawing_width = max_child_host_drawing_width(parent); /* calculate initial drawing angle */ current_drawing_angle = start_angle; /* calculate coords for children */ for(temp_host = host_list; temp_host != NULL; temp_host = temp_host->next) { if(is_host_immediate_child_of_host(parent, temp_host) == TRUE) { /* get drawing width of child host */ this_drawing_width = max_child_host_drawing_width(temp_host); /* calculate angle this host gets for drawing */ available_angle = useable_angle * ((double)this_drawing_width / (double)parent_drawing_width); /* clip available angle if necessary */ /* this isn't really necessary, but helps keep things looking a bit more sane with less potential connection crossover */ clipped_available_angle = 360.0 / layer; if(available_angle < clipped_available_angle) clipped_available_angle = available_angle; /* calculate the exact angle at which we should draw this child */ this_drawing_angle = current_drawing_angle + (available_angle / 2.0); /* compensate for angle overflow */ while(this_drawing_angle >= 360.0) this_drawing_angle -= 360.0; while(this_drawing_angle < 0.0) this_drawing_angle += 360.0; /* calculate drawing coords of this host using good ol' geometry... */ x_coord = -(sin(-this_drawing_angle * (M_PI / 180.0)) * radius); y_coord = -(sin((90 + this_drawing_angle) * (M_PI / 180.0)) * radius); temp_host->x_2d = (int)x_coord; temp_host->y_2d = (int)y_coord; temp_host->have_2d_coords = TRUE; temp_host->should_be_drawn = TRUE; /* recurse into child host ... */ calculate_circular_layer_coords(temp_host, current_drawing_angle + ((available_angle - clipped_available_angle) / 2), clipped_available_angle, layer + 1, radius + CIRCULAR_DRAWING_RADIUS); /* increment current drawing angle */ current_drawing_angle += available_angle; } } return; } /* draws background "extras" for all hosts in circular markup layout */ void draw_circular_markup(void) { /* calculate all host sections, starting with first layer */ draw_circular_layer_markup(NULL, 0.0, 360.0, 1, CIRCULAR_DRAWING_RADIUS); return; } /* draws background "extras" for all hosts in a particular "layer" in circular markup layout */ void draw_circular_layer_markup(host *parent, double start_angle, double useable_angle, int layer, int radius) { int parent_drawing_width = 0; int this_drawing_width = 0; int immediate_children = 0; double current_drawing_angle = 0.0; double available_angle = 0.0; double clipped_available_angle = 0.0; double x_coord[4] = {0.0, 0.0, 0.0, 0.0}; double y_coord[4] = {0.0, 0.0, 0.0, 0.0}; hoststatus *temp_hoststatus; host *temp_host; int x_offset = 0; int y_offset = 0; int center_x = 0; int center_y = 0; int bgcolor = 0; double arc_start_angle = 0.0; double arc_end_angle = 0.0; int translated_x = 0; int translated_y = 0; /* get the total number of immediate children to this host */ immediate_children = number_of_immediate_child_hosts(parent); /* bail out if we're done */ if(immediate_children == 0) return; /* calculate total drawing "width" of parent host */ parent_drawing_width = max_child_host_drawing_width(parent); /* calculate initial drawing angle */ current_drawing_angle = start_angle; /* calculate coords for children */ for(temp_host = host_list; temp_host != NULL; temp_host = temp_host->next) { if(is_host_immediate_child_of_host(parent, temp_host) == TRUE) { /* get drawing width of child host */ this_drawing_width = max_child_host_drawing_width(temp_host); /* calculate angle this host gets for drawing */ available_angle = useable_angle * ((double)this_drawing_width / (double)parent_drawing_width); /* clip available angle if necessary */ /* this isn't really necessary, but helps keep things looking a bit more sane with less potential connection crossover */ clipped_available_angle = 360.0 / layer; if(available_angle < clipped_available_angle) clipped_available_angle = available_angle; /* calculate drawing coords of "leftmost" divider using good ol' geometry... */ x_coord[0] = -(sin(-current_drawing_angle * (M_PI / 180.0)) * (radius - (CIRCULAR_DRAWING_RADIUS / 2))); y_coord[0] = -(sin((90 + current_drawing_angle) * (M_PI / 180.0)) * (radius - (CIRCULAR_DRAWING_RADIUS / 2))); x_coord[1] = -(sin(-current_drawing_angle * (M_PI / 180.0)) * (radius + (CIRCULAR_DRAWING_RADIUS / 2))); y_coord[1] = -(sin((90 + current_drawing_angle) * (M_PI / 180.0)) * (radius + (CIRCULAR_DRAWING_RADIUS / 2))); /* calculate drawing coords of "rightmost" divider using good ol' geometry... */ x_coord[2] = -(sin((-(current_drawing_angle + available_angle)) * (M_PI / 180.0)) * (radius - (CIRCULAR_DRAWING_RADIUS / 2))); y_coord[2] = -(sin((90 + current_drawing_angle + available_angle) * (M_PI / 180.0)) * (radius - (CIRCULAR_DRAWING_RADIUS / 2))); x_coord[3] = -(sin((-(current_drawing_angle + available_angle)) * (M_PI / 180.0)) * (radius + (CIRCULAR_DRAWING_RADIUS / 2))); y_coord[3] = -(sin((90 + current_drawing_angle + available_angle) * (M_PI / 180.0)) * (radius + (CIRCULAR_DRAWING_RADIUS / 2))); x_offset = nagios_icon_x + (DEFAULT_NODE_WIDTH / 2) - canvas_x; y_offset = nagios_icon_y + (DEFAULT_NODE_HEIGHT / 2) - canvas_y; /* draw "slice" dividers */ if(immediate_children > 1 || layer > 1) { /* draw "leftmost" divider */ gdImageLine(map_image, (int)x_coord[0] + x_offset, (int)y_coord[0] + y_offset, (int)x_coord[1] + x_offset, (int)y_coord[1] + y_offset, color_lightgrey); /* draw "rightmost" divider */ gdImageLine(map_image, (int)x_coord[2] + x_offset, (int)y_coord[2] + y_offset, (int)x_coord[3] + x_offset, (int)y_coord[3] + y_offset, color_lightgrey); } /* determine arc drawing angles */ arc_start_angle = current_drawing_angle - 90.0; while(arc_start_angle < 0.0) arc_start_angle += 360.0; arc_end_angle = arc_start_angle + available_angle; /* draw inner arc */ gdImageArc(map_image, x_offset, y_offset, (radius - (CIRCULAR_DRAWING_RADIUS / 2)) * 2, (radius - (CIRCULAR_DRAWING_RADIUS / 2)) * 2, floor(arc_start_angle), ceil(arc_end_angle), color_lightgrey); /* draw outer arc */ gdImageArc(map_image, x_offset, y_offset, (radius + (CIRCULAR_DRAWING_RADIUS / 2)) * 2, (radius + (CIRCULAR_DRAWING_RADIUS / 2)) * 2, floor(arc_start_angle), ceil(arc_end_angle), color_lightgrey); /* determine center of "slice" and fill with appropriate color */ center_x = -(sin(-(current_drawing_angle + (available_angle / 2.0)) * (M_PI / 180.0)) * (radius)); center_y = -(sin((90 + current_drawing_angle + (available_angle / 2.0)) * (M_PI / 180.0)) * (radius)); translated_x = center_x + x_offset; translated_y = center_y + y_offset; /* determine background color */ temp_hoststatus = find_hoststatus(temp_host->name); if(temp_hoststatus == NULL) bgcolor = color_lightgrey; else if(temp_hoststatus->status == SD_HOST_DOWN || temp_hoststatus->status == SD_HOST_UNREACHABLE) bgcolor = color_lightred; else bgcolor = color_lightgreen; /* fill slice with background color */ /* the fill function only works with coordinates that are in bounds of the actual image */ if(translated_x > 0 && translated_y > 0 && translated_x < canvas_width && translated_y < canvas_height) gdImageFillToBorder(map_image, translated_x, translated_y, color_lightgrey, bgcolor); /* recurse into child host ... */ draw_circular_layer_markup(temp_host, current_drawing_angle + ((available_angle - clipped_available_angle) / 2), clipped_available_angle, layer + 1, radius + CIRCULAR_DRAWING_RADIUS); /* increment current drawing angle */ current_drawing_angle += available_angle; } } return; } nagios-4.3.4/cgi/statuswml.c000066400000000000000000001417531314764422400157750ustar00rootroot00000000000000/************************************************************************** * * STATUSWML.C - Nagios Status CGI for WAP-enabled devices * * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *************************************************************************/ #include "../include/config.h" #include "../include/common.h" #include "../include/objects.h" #include "../include/statusdata.h" #include "../include/cgiutils.h" #include "../include/getcgi.h" #include "../include/cgiauth.h" extern char main_config_file[MAX_FILENAME_LENGTH]; extern char *status_file; extern hoststatus *hoststatus_list; extern servicestatus *servicestatus_list; extern int use_ssl_authentication; extern int nagios_process_state; extern char *ping_syntax; #define DISPLAY_HOST 0 #define DISPLAY_SERVICE 1 #define DISPLAY_HOSTGROUP 2 #define DISPLAY_INDEX 3 #define DISPLAY_PING 4 #define DISPLAY_TRACEROUTE 5 #define DISPLAY_QUICKSTATS 6 #define DISPLAY_PROCESS 7 #define DISPLAY_ALL_PROBLEMS 8 #define DISPLAY_UNHANDLED_PROBLEMS 9 #define DISPLAY_HOSTGROUP_SUMMARY 0 #define DISPLAY_HOSTGROUP_OVERVIEW 1 #define DISPLAY_HOST_SUMMARY 0 #define DISPLAY_HOST_SERVICES 1 void document_header(void); void document_footer(void); int process_cgivars(void); int validate_arguments(void); int is_valid_hostip(char *hostip); int display_type = DISPLAY_INDEX; int hostgroup_style = DISPLAY_HOSTGROUP_SUMMARY; int host_style = DISPLAY_HOST_SUMMARY; void display_index(void); void display_host(void); void display_host_services(void); void display_service(void); void display_hostgroup_summary(void); void display_hostgroup_overview(void); void display_ping(void); void display_traceroute(void); void display_quick_stats(void); void display_process(void); void display_problems(void); char *host_name = ""; char *hostgroup_name = ""; char *service_desc = ""; char *ping_address = ""; char *traceroute_address = ""; int show_all_hostgroups = TRUE; authdata current_authdata; int main(void) { int result = OK; /* get the arguments passed in the URL */ process_cgivars(); /* reset internal variables */ reset_cgi_vars(); /* Initialize shared configuration variables */ init_shared_cfg_vars(1); document_header(); /* validate arguments in URL */ result = validate_arguments(); if(result == ERROR) { document_footer(); return ERROR; } /* read the CGI configuration file */ result = read_cgi_config_file(get_cgi_config_location()); if(result == ERROR) { printf("

    Error: Could not open CGI configuration file '%s' for reading!

    \n", get_cgi_config_location()); document_footer(); return ERROR; } /* read the main configuration file */ result = read_main_config_file(main_config_file); if(result == ERROR) { printf("

    Error: Could not open main configuration file '%s' for reading!

    \n", main_config_file); document_footer(); return ERROR; } /* read all object configuration data */ result = read_all_object_configuration_data(main_config_file, READ_ALL_OBJECT_DATA); if(result == ERROR) { printf("

    Error: Could not read some or all object configuration data!

    \n"); document_footer(); return ERROR; } /* read all status data */ result = read_all_status_data(status_file, READ_ALL_STATUS_DATA); if(result == ERROR) { printf("

    Error: Could not read host and service status information!

    \n"); document_footer(); free_memory(); return ERROR; } /* get authentication information */ get_authentication_information(¤t_authdata); /* decide what to display to the user */ if(display_type == DISPLAY_HOST && host_style == DISPLAY_HOST_SERVICES) display_host_services(); else if(display_type == DISPLAY_HOST) display_host(); else if(display_type == DISPLAY_SERVICE) display_service(); else if(display_type == DISPLAY_HOSTGROUP && hostgroup_style == DISPLAY_HOSTGROUP_OVERVIEW) display_hostgroup_overview(); else if(display_type == DISPLAY_HOSTGROUP && hostgroup_style == DISPLAY_HOSTGROUP_SUMMARY) display_hostgroup_summary(); else if(display_type == DISPLAY_PING) display_ping(); else if(display_type == DISPLAY_TRACEROUTE) display_traceroute(); else if(display_type == DISPLAY_QUICKSTATS) display_quick_stats(); else if(display_type == DISPLAY_PROCESS) display_process(); else if(display_type == DISPLAY_ALL_PROBLEMS || display_type == DISPLAY_UNHANDLED_PROBLEMS) display_problems(); else display_index(); document_footer(); /* free all allocated memory */ free_memory(); return OK; } void document_header(void) { char date_time[MAX_DATETIME_LENGTH]; time_t expire_time; time_t current_time; time(¤t_time); printf("Cache-Control: no-store\r\n"); printf("Pragma: no-cache\r\n"); get_time_string(¤t_time, date_time, (int)sizeof(date_time), HTTP_DATE_TIME); printf("Last-Modified: %s\r\n", date_time); expire_time = (time_t)0L; get_time_string(&expire_time, date_time, (int)sizeof(date_time), HTTP_DATE_TIME); printf("Expires: %s\r\n", date_time); printf("Content-type: text/vnd.wap.wml\r\n\r\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); return; } void document_footer(void) { printf("\n"); return; } int process_cgivars(void) { char **variables; int error = FALSE; int x; variables = getcgivars(); for(x = 0; variables[x] != NULL; x++) { /* do some basic length checking on the variable identifier to prevent buffer overflows */ if(strlen(variables[x]) >= MAX_INPUT_BUFFER - 1) { continue; } /* we found the hostgroup argument */ else if(!strcmp(variables[x], "hostgroup")) { display_type = DISPLAY_HOSTGROUP; x++; if(variables[x] == NULL) { error = TRUE; break; } if((hostgroup_name = (char *)strdup(variables[x])) == NULL) hostgroup_name = ""; strip_html_brackets(hostgroup_name); if(!strcmp(hostgroup_name, "all")) show_all_hostgroups = TRUE; else show_all_hostgroups = FALSE; } /* we found the host argument */ else if(!strcmp(variables[x], "host")) { display_type = DISPLAY_HOST; x++; if(variables[x] == NULL) { error = TRUE; break; } if((host_name = (char *)strdup(variables[x])) == NULL) host_name = ""; strip_html_brackets(host_name); } /* we found the service argument */ else if(!strcmp(variables[x], "service")) { display_type = DISPLAY_SERVICE; x++; if(variables[x] == NULL) { error = TRUE; break; } if((service_desc = (char *)strdup(variables[x])) == NULL) service_desc = ""; strip_html_brackets(service_desc); } /* we found the hostgroup style argument */ else if(!strcmp(variables[x], "style")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(!strcmp(variables[x], "overview")) hostgroup_style = DISPLAY_HOSTGROUP_OVERVIEW; else if(!strcmp(variables[x], "summary")) hostgroup_style = DISPLAY_HOSTGROUP_SUMMARY; else if(!strcmp(variables[x], "servicedetail")) host_style = DISPLAY_HOST_SERVICES; else if(!strcmp(variables[x], "processinfo")) display_type = DISPLAY_PROCESS; else if(!strcmp(variables[x], "aprobs")) display_type = DISPLAY_ALL_PROBLEMS; else if(!strcmp(variables[x], "uprobs")) display_type = DISPLAY_UNHANDLED_PROBLEMS; else display_type = DISPLAY_QUICKSTATS; } /* we found the ping argument */ else if(!strcmp(variables[x], "ping")) { display_type = DISPLAY_PING; x++; if(variables[x] == NULL) { error = TRUE; break; } if((ping_address = (char *)strdup(variables[x])) == NULL) ping_address = ""; strip_html_brackets(ping_address); } /* we found the traceroute argument */ else if(!strcmp(variables[x], "traceroute")) { display_type = DISPLAY_TRACEROUTE; x++; if(variables[x] == NULL) { error = TRUE; break; } if((traceroute_address = (char *)strdup(variables[x])) == NULL) traceroute_address = ""; strip_html_brackets(traceroute_address); } } /* free memory allocated to the CGI variables */ free_cgivars(variables); return error; } int validate_arguments(void) { int result = OK; if((strcmp(ping_address, "")) && !is_valid_hostip(ping_address)) { printf("

    Invalid host name/ip

    \n"); result = ERROR; } if(strcmp(traceroute_address, "") && !is_valid_hostip(traceroute_address)) { printf("

    Invalid host name/ip

    \n"); result = ERROR; } return result; } int is_valid_hostip(char *hostip) { char *valid_domain_chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.-"; if(strcmp(hostip, "") && strlen(hostip) == strspn(hostip, valid_domain_chars) && hostip[0] != '-' && hostip[strlen(hostip) - 1] != '-') return TRUE; return FALSE; } /* main intro screen */ void display_index(void) { /**** MAIN MENU SCREEN (CARD 1) ****/ printf("\n"); printf("

    \n"); printf("Nagios
    WAP Interface
    \n"); printf("Quick Stats
    \n", STATUSWML_CGI); printf("Status Summary
    \n", STATUSWML_CGI); printf("Status Overview
    \n", STATUSWML_CGI); printf("All Problems
    \n", STATUSWML_CGI); printf("Unhandled Problems
    \n", STATUSWML_CGI); printf("Process Info
    \n", STATUSWML_CGI); printf("Tools
    \n"); printf("About
    \n"); printf("

    \n"); printf("
    \n"); /**** TOOLS SCREEN (CARD 2) ****/ printf("\n"); printf("

    \n"); printf("Network Tools:
    \n"); printf("Ping
    \n", STATUSWML_CGI); printf("Traceroute
    \n", STATUSWML_CGI); printf("View Host
    \n"); printf("View Hostgroup
    \n"); printf("

    \n"); printf("
    \n"); /**** ABOUT SCREEN (CARD 3) ****/ printf("\n"); printf("

    \n"); printf("About
    \n"); printf("

    \n"); printf("

    \n"); printf("Nagios %s
    WAP Interface
    \n", PROGRAM_VERSION); printf("Copyright (C) 2001 Ethan Galstad
    \n"); printf("egalstad@nagios.org

    \n"); printf("License: GPL

    \n"); printf("Based in part on features found in AskAround's Wireless Network Tools
    \n"); printf("www.askaround.com
    \n"); printf("

    \n"); printf("
    \n"); /**** VIEW HOST SCREEN (CARD 4) ****/ printf("\n"); printf("

    \n"); printf("View Host
    \n"); printf("

    \n"); printf("

    \n"); printf("Host Name:
    \n"); printf("\n"); printf("\n"); printf("\n", STATUSWML_CGI); printf("\n"); printf("

    \n"); printf("
    \n"); /**** VIEW HOSTGROUP SCREEN (CARD 5) ****/ printf("\n"); printf("

    \n"); printf("View Hostgroup
    \n"); printf("

    \n"); printf("

    \n"); printf("Hostgroup Name:
    \n"); printf("\n"); printf("\n"); printf("\n", STATUSWML_CGI); printf("\n"); printf("

    \n"); printf("
    \n"); return; } /* displays process info */ void display_process(void) { /**** MAIN SCREEN (CARD 1) ****/ printf("\n"); printf("

    \n"); printf("Process Info

    \n"); /* check authorization */ if(is_authorized_for_system_information(¤t_authdata) == FALSE) { printf("Error: Not authorized for process info!\n"); printf("

    \n"); printf("
    \n"); return; } if(nagios_process_state == STATE_OK) printf("Nagios process is running
    \n"); else printf("Nagios process may not be running
    \n"); if(enable_notifications == TRUE) printf("Notifications are enabled
    \n"); else printf("Notifications are disabled
    \n"); if(execute_service_checks == TRUE) printf("Check execution is enabled
    \n"); else printf("Check execution is disabled
    \n"); printf("
    \n"); printf("Process Commands\n"); printf("

    \n"); printf("\n"); /**** COMMANDS SCREEN (CARD 2) ****/ printf("\n"); printf("

    \n"); printf("Process Commands
    \n"); if(enable_notifications == FALSE) printf("Enable Notifications
    \n", COMMAND_CGI, CMD_ENABLE_NOTIFICATIONS, CMDMODE_COMMIT); else printf("Disable Notifications
    \n", COMMAND_CGI, CMD_DISABLE_NOTIFICATIONS, CMDMODE_COMMIT); if(execute_service_checks == FALSE) printf("Enable Check Execution
    \n", COMMAND_CGI, CMD_START_EXECUTING_SVC_CHECKS, CMDMODE_COMMIT); else printf("Disable Check Execution
    \n", COMMAND_CGI, CMD_STOP_EXECUTING_SVC_CHECKS, CMDMODE_COMMIT); printf("

    \n"); printf("
    \n"); return; } /* displays quick stats */ void display_quick_stats(void) { host *temp_host; hoststatus *temp_hoststatus; service *temp_service; servicestatus *temp_servicestatus; int hosts_unreachable = 0; int hosts_down = 0; int hosts_up = 0; int hosts_pending = 0; int services_critical = 0; int services_unknown = 0; int services_warning = 0; int services_ok = 0; int services_pending = 0; /**** MAIN SCREEN (CARD 1) ****/ printf("\n"); printf("

    \n"); printf("Quick Stats
    \n"); printf("

    \n"); /* check all hosts */ for(temp_host = host_list; temp_host != NULL; temp_host = temp_host->next) { if(is_authorized_for_host(temp_host, ¤t_authdata) == FALSE) continue; temp_hoststatus = find_hoststatus(temp_host->name); if(temp_hoststatus == NULL) continue; if(temp_hoststatus->status == SD_HOST_UNREACHABLE) hosts_unreachable++; else if(temp_hoststatus->status == SD_HOST_DOWN) hosts_down++; else if(temp_hoststatus->status == HOST_PENDING) hosts_pending++; else hosts_up++; } /* check all services */ for(temp_service = service_list; temp_service != NULL; temp_service = temp_service->next) { if(is_authorized_for_service(temp_service, ¤t_authdata) == FALSE) continue; temp_servicestatus = find_servicestatus(temp_service->host_name, temp_service->description); if(temp_servicestatus == NULL) continue; if(temp_servicestatus->status == SERVICE_CRITICAL) services_critical++; else if(temp_servicestatus->status == SERVICE_UNKNOWN) services_unknown++; else if(temp_servicestatus->status == SERVICE_WARNING) services_warning++; else if(temp_servicestatus->status == SERVICE_PENDING) services_pending++; else services_ok++; } printf("

    \n"); printf("Host Totals:
    \n"); printf("%d UP
    \n", hosts_up); printf("%d DOWN
    \n", hosts_down); printf("%d UNREACHABLE
    \n", hosts_unreachable); printf("%d PENDING
    \n", hosts_pending); printf("
    \n"); printf("Service Totals:
    \n"); printf("%d OK
    \n", services_ok); printf("%d WARNING
    \n", services_warning); printf("%d UNKNOWN
    \n", services_unknown); printf("%d CRITICAL
    \n", services_critical); printf("%d PENDING
    \n", services_pending); printf("

    \n"); printf("
    \n"); return; } /* displays hostgroup status overview */ void display_hostgroup_overview(void) { hostgroup *temp_hostgroup; hostsmember *temp_member; host *temp_host; hoststatus *temp_hoststatus; /**** MAIN SCREEN (CARD 1) ****/ printf("\n"); printf("

    \n"); printf("Status Overview

    \n", STATUSWML_CGI, escape_string(hostgroup_name)); /* check all hostgroups */ for(temp_hostgroup = hostgroup_list; temp_hostgroup != NULL; temp_hostgroup = temp_hostgroup->next) { if(show_all_hostgroups == FALSE && strcmp(temp_hostgroup->group_name, hostgroup_name)) continue; if(is_authorized_for_hostgroup(temp_hostgroup, ¤t_authdata) == FALSE) continue; printf("%s\n", temp_hostgroup->alias); printf("\n"); /* check all hosts in this hostgroup */ for(temp_member = temp_hostgroup->members; temp_member != NULL; temp_member = temp_member->next) { temp_host = find_host(temp_member->host_name); if(temp_host == NULL) continue; if(is_host_member_of_hostgroup(temp_hostgroup, temp_host) == FALSE) continue; temp_hoststatus = find_hoststatus(temp_host->name); if(temp_hoststatus == NULL) continue; printf("", STATUSWML_CGI, temp_host->name); printf("\n", temp_host->name); } printf("
    ", temp_host->name); if(temp_hoststatus->status == SD_HOST_UP) printf("UP"); else if(temp_hoststatus->status == HOST_PENDING) printf("PND"); else if(temp_hoststatus->status == SD_HOST_DOWN) printf("DWN"); else if(temp_hoststatus->status == SD_HOST_UNREACHABLE) printf("UNR"); else printf("???"); printf("%s
    \n"); printf("
    \n"); } if(show_all_hostgroups == FALSE) printf("View All Hostgroups\n", STATUSWML_CGI); printf("

    \n"); printf("
    \n"); return; } /* displays hostgroup status summary */ void display_hostgroup_summary(void) { hostgroup *temp_hostgroup; hostsmember *temp_member; host *temp_host; hoststatus *temp_hoststatus; service *temp_service; servicestatus *temp_servicestatus; int hosts_unreachable = 0; int hosts_down = 0; int hosts_up = 0; int hosts_pending = 0; int services_critical = 0; int services_unknown = 0; int services_warning = 0; int services_ok = 0; int services_pending = 0; int found = 0; /**** MAIN SCREEN (CARD 1) ****/ printf("\n"); printf("

    \n"); printf("Status Summary

    \n", STATUSWML_CGI, escape_string(hostgroup_name)); /* check all hostgroups */ for(temp_hostgroup = hostgroup_list; temp_hostgroup != NULL; temp_hostgroup = temp_hostgroup->next) { if(show_all_hostgroups == FALSE && strcmp(temp_hostgroup->group_name, hostgroup_name)) continue; if(is_authorized_for_hostgroup(temp_hostgroup, ¤t_authdata) == FALSE) continue; printf("%s\n", temp_hostgroup->group_name, temp_hostgroup->alias, STATUSWML_CGI, temp_hostgroup->group_name); printf("\n"); hosts_up = 0; hosts_pending = 0; hosts_down = 0; hosts_unreachable = 0; services_ok = 0; services_pending = 0; services_warning = 0; services_unknown = 0; services_critical = 0; /* check all hosts in this hostgroup */ for(temp_member = temp_hostgroup->members; temp_member != NULL; temp_member = temp_member->next) { temp_host = find_host(temp_member->host_name); if(temp_host == NULL) continue; if(is_host_member_of_hostgroup(temp_hostgroup, temp_host) == FALSE) continue; temp_hoststatus = find_hoststatus(temp_host->name); if(temp_hoststatus == NULL) continue; if(temp_hoststatus->status == SD_HOST_UNREACHABLE) hosts_unreachable++; else if(temp_hoststatus->status == SD_HOST_DOWN) hosts_down++; else if(temp_hoststatus->status == HOST_PENDING) hosts_pending++; else hosts_up++; /* check all services on this host */ for(temp_service = service_list; temp_service != NULL; temp_service = temp_service->next) { if(strcmp(temp_service->host_name, temp_host->name)) continue; if(is_authorized_for_service(temp_service, ¤t_authdata) == FALSE) continue; temp_servicestatus = find_servicestatus(temp_service->host_name, temp_service->description); if(temp_servicestatus == NULL) continue; if(temp_servicestatus->status == SERVICE_CRITICAL) services_critical++; else if(temp_servicestatus->status == SERVICE_UNKNOWN) services_unknown++; else if(temp_servicestatus->status == SERVICE_WARNING) services_warning++; else if(temp_servicestatus->status == SERVICE_PENDING) services_pending++; else services_ok++; } } printf("\n"); printf("\n"); printf("
    Hosts:"); found = 0; if(hosts_unreachable > 0) { printf("%d UNR", hosts_unreachable); found = 1; } if(hosts_down > 0) { printf("%s%d DWN", (found == 1) ? ", " : "", hosts_down); found = 1; } if(hosts_pending > 0) { printf("%s%d PND", (found == 1) ? ", " : "", hosts_pending); found = 1; } printf("%s%d UP", (found == 1) ? ", " : "", hosts_up); printf("
    Services:"); found = 0; if(services_critical > 0) { printf("%d CRI", services_critical); found = 1; } if(services_warning > 0) { printf("%s%d WRN", (found == 1) ? ", " : "", services_warning); found = 1; } if(services_unknown > 0) { printf("%s%d UNK", (found == 1) ? ", " : "", services_unknown); found = 1; } if(services_pending > 0) { printf("%s%d PND", (found == 1) ? ", " : "", services_pending); found = 1; } printf("%s%d OK", (found == 1) ? ", " : "", services_ok); printf("
    \n"); printf("
    \n"); } if(show_all_hostgroups == FALSE) printf("View All Hostgroups\n", STATUSWML_CGI); printf("

    \n"); printf("
    \n"); return; } /* displays host status */ void display_host(void) { host *temp_host; hoststatus *temp_hoststatus; char last_check[MAX_DATETIME_LENGTH]; int days; int hours; int minutes; int seconds; time_t current_time; time_t t; char state_duration[48]; int found; /**** MAIN SCREEN (CARD 1) ****/ printf("\n"); printf("

    \n"); printf("Host '%s'
    \n", host_name); /* find the host */ temp_host = find_host(host_name); temp_hoststatus = find_hoststatus(host_name); if(temp_host == NULL || temp_hoststatus == NULL) { printf("Error: Could not find host!\n"); printf("

    \n"); printf("
    \n"); return; } /* check authorization */ if(is_authorized_for_host(temp_host, ¤t_authdata) == FALSE) { printf("Error: Not authorized for host!\n"); printf("

    \n"); printf("\n"); return; } printf("\n"); printf("\n"); printf("\n", temp_hoststatus->plugin_output); get_time_string(&temp_hoststatus->last_check, last_check, sizeof(last_check) - 1, SHORT_DATE_TIME); printf("\n", last_check); current_time = time(NULL); if(temp_hoststatus->last_state_change == (time_t)0) t = current_time - program_start; else t = current_time - temp_hoststatus->last_state_change; get_time_breakdown((unsigned long)t, &days, &hours, &minutes, &seconds); snprintf(state_duration, sizeof(state_duration) - 1, "%2dd %2dh %2dm %2ds%s", days, hours, minutes, seconds, (temp_hoststatus->last_state_change == (time_t)0) ? "+" : ""); printf("\n", state_duration); printf("\n"); printf("
    Status:"); if(temp_hoststatus->status == SD_HOST_UP) printf("UP"); else if(temp_hoststatus->status == HOST_PENDING) printf("PENDING"); else if(temp_hoststatus->status == SD_HOST_DOWN) printf("DOWN"); else if(temp_hoststatus->status == SD_HOST_UNREACHABLE) printf("UNREACHABLE"); else printf("?"); printf("
    Info:%s
    Last Check:%s
    Duration:%s
    Properties:"); found = 0; if(temp_hoststatus->checks_enabled == FALSE) { printf("%sChecks disabled", (found == 1) ? ", " : ""); found = 1; } if(temp_hoststatus->notifications_enabled == FALSE) { printf("%sNotifications disabled", (found == 1) ? ", " : ""); found = 1; } if(temp_hoststatus->problem_has_been_acknowledged == TRUE) { printf("%sProblem acknowledged", (found == 1) ? ", " : ""); found = 1; } if(temp_hoststatus->scheduled_downtime_depth > 0) { printf("%sIn scheduled downtime", (found == 1) ? ", " : ""); found = 1; } if(found == 0) printf("N/A"); printf("
    \n"); printf("
    \n"); printf("View Services\n", STATUSWML_CGI, escape_string(host_name)); printf("Host Commands\n"); printf("

    \n"); printf("\n"); /**** COMMANDS SCREEN (CARD 2) ****/ printf("\n"); printf("

    \n"); printf("Host Commands
    \n"); printf("Ping Host\n", STATUSWML_CGI, temp_host->address); printf("Traceroute\n", STATUSWML_CGI, temp_host->address); if(temp_hoststatus->status != SD_HOST_UP && temp_hoststatus->status != HOST_PENDING) printf("Acknowledge Problem\n"); if(temp_hoststatus->checks_enabled == FALSE) printf("Enable Host Checks
    \n", COMMAND_CGI, escape_string(host_name), CMD_ENABLE_HOST_CHECK, CMDMODE_COMMIT); else printf("Disable Host Checks
    \n", COMMAND_CGI, escape_string(host_name), CMD_DISABLE_HOST_CHECK, CMDMODE_COMMIT); if(temp_hoststatus->notifications_enabled == FALSE) printf("Enable Host Notifications
    \n", COMMAND_CGI, escape_string(host_name), CMD_ENABLE_HOST_NOTIFICATIONS, CMDMODE_COMMIT); else printf("Disable Host Notifications
    \n", COMMAND_CGI, escape_string(host_name), CMD_DISABLE_HOST_NOTIFICATIONS, CMDMODE_COMMIT); printf("Enable All Service Checks
    \n", COMMAND_CGI, escape_string(host_name), CMD_ENABLE_HOST_SVC_CHECKS, CMDMODE_COMMIT); printf("Disable All Service Checks
    \n", COMMAND_CGI, escape_string(host_name), CMD_DISABLE_HOST_SVC_CHECKS, CMDMODE_COMMIT); printf("Enable All Service Notifications
    \n", COMMAND_CGI, escape_string(host_name), CMD_ENABLE_HOST_SVC_NOTIFICATIONS, CMDMODE_COMMIT); printf("Disable All Service Notifications
    \n", COMMAND_CGI, escape_string(host_name), CMD_DISABLE_HOST_SVC_NOTIFICATIONS, CMDMODE_COMMIT); printf("

    \n"); printf("
    \n"); /**** ACKNOWLEDGEMENT SCREEN (CARD 3) ****/ printf("\n"); printf("

    \n"); printf("Acknowledge Problem
    \n"); printf("

    \n"); printf("

    \n"); printf("Your Name:
    \n"); printf("
    \n", ((use_ssl_authentication) ? (getenv("SSL_CLIENT_S_DN_CN")) : (getenv("REMOTE_USER")))); printf("Comment:
    \n"); printf("\n"); printf("\n"); printf("\n", COMMAND_CGI, escape_string(host_name), CMD_ACKNOWLEDGE_HOST_PROBLEM, CMDMODE_COMMIT); printf("\n"); printf("

    \n"); printf("
    \n"); return; } /* displays services on a host */ void display_host_services(void) { service *temp_service; servicestatus *temp_servicestatus; /**** MAIN SCREEN (CARD 1) ****/ printf("\n"); printf("

    \n"); printf("Host ", url_encode(host_name)); printf("'%s' Services
    \n", host_name, STATUSWML_CGI, escape_string(host_name)); printf("\n"); /* check all services */ for(temp_service = service_list; temp_service != NULL; temp_service = temp_service->next) { if(strcmp(temp_service->host_name, host_name)) continue; if(is_authorized_for_service(temp_service, ¤t_authdata) == FALSE) continue; temp_servicestatus = find_servicestatus(temp_service->host_name, temp_service->description); if(temp_servicestatus == NULL) continue; printf("", STATUSWML_CGI, temp_service->host_name, temp_service->description); printf("\n", temp_service->description); } printf("
    ", temp_service->description); if(temp_servicestatus->status == SERVICE_OK) printf("OK"); else if(temp_servicestatus->status == SERVICE_PENDING) printf("PND"); else if(temp_servicestatus->status == SERVICE_WARNING) printf("WRN"); else if(temp_servicestatus->status == SERVICE_UNKNOWN) printf("UNK"); else if(temp_servicestatus->status == SERVICE_CRITICAL) printf("CRI"); else printf("???"); printf("%s
    \n"); printf("

    \n"); printf("
    \n"); return; } /* displays service status */ void display_service(void) { service *temp_service; servicestatus *temp_servicestatus; char last_check[MAX_DATETIME_LENGTH]; int days; int hours; int minutes; int seconds; time_t current_time; time_t t; char state_duration[48]; int found; /**** MAIN SCREEN (CARD 1) ****/ printf("\n"); printf("

    \n"); printf("Service '%s' on host '%s'
    \n", service_desc, host_name); /* find the service */ temp_service = find_service(host_name, service_desc); temp_servicestatus = find_servicestatus(host_name, service_desc); if(temp_service == NULL || temp_servicestatus == NULL) { printf("Error: Could not find service!\n"); printf("

    \n"); printf("
    \n"); return; } /* check authorization */ if(is_authorized_for_service(temp_service, ¤t_authdata) == FALSE) { printf("Error: Not authorized for service!\n"); printf("

    \n"); printf("\n"); return; } printf("\n"); printf("\n"); printf("\n", temp_servicestatus->plugin_output); get_time_string(&temp_servicestatus->last_check, last_check, sizeof(last_check) - 1, SHORT_DATE_TIME); printf("\n", last_check); current_time = time(NULL); if(temp_servicestatus->last_state_change == (time_t)0) t = current_time - program_start; else t = current_time - temp_servicestatus->last_state_change; get_time_breakdown((unsigned long)t, &days, &hours, &minutes, &seconds); snprintf(state_duration, sizeof(state_duration) - 1, "%2dd %2dh %2dm %2ds%s", days, hours, minutes, seconds, (temp_servicestatus->last_state_change == (time_t)0) ? "+" : ""); printf("\n", state_duration); printf("\n"); printf("
    Status:"); if(temp_servicestatus->status == SERVICE_OK) printf("OK"); else if(temp_servicestatus->status == SERVICE_PENDING) printf("PENDING"); else if(temp_servicestatus->status == SERVICE_WARNING) printf("WARNING"); else if(temp_servicestatus->status == SERVICE_UNKNOWN) printf("UNKNOWN"); else if(temp_servicestatus->status == SERVICE_CRITICAL) printf("CRITICAL"); else printf("?"); printf("
    Info:%s
    Last Check:%s
    Duration:%s
    Properties:"); found = 0; if(temp_servicestatus->checks_enabled == FALSE) { printf("%sChecks disabled", (found == 1) ? ", " : ""); found = 1; } if(temp_servicestatus->notifications_enabled == FALSE) { printf("%sNotifications disabled", (found == 1) ? ", " : ""); found = 1; } if(temp_servicestatus->problem_has_been_acknowledged == TRUE) { printf("%sProblem acknowledged", (found == 1) ? ", " : ""); found = 1; } if(temp_servicestatus->scheduled_downtime_depth > 0) { printf("%sIn scheduled downtime", (found == 1) ? ", " : ""); found = 1; } if(found == 0) printf("N/A"); printf("
    \n"); printf("
    \n"); printf("View Host\n", STATUSWML_CGI, escape_string(host_name)); printf("Svc. Commands\n"); printf("

    \n"); printf("\n"); /**** COMMANDS SCREEN (CARD 2) ****/ printf("\n"); printf("

    \n"); printf("Service Commands
    \n"); if(temp_servicestatus->status != SERVICE_OK && temp_servicestatus->status != SERVICE_PENDING) printf("Acknowledge Problem\n"); if(temp_servicestatus->checks_enabled == FALSE) { printf("Enable Checks", COMMAND_CGI, escape_string(host_name)); printf("
    \n", escape_string(service_desc), CMD_ENABLE_SVC_CHECK, CMDMODE_COMMIT); } else { printf("Disable Checks", COMMAND_CGI, escape_string(host_name)); printf("
    \n", escape_string(service_desc), CMD_DISABLE_SVC_CHECK, CMDMODE_COMMIT); printf("Schedule Immediate Check", COMMAND_CGI, escape_string(host_name)); printf("
    \n", escape_string(service_desc), (unsigned long long)current_time, CMD_SCHEDULE_SVC_CHECK, CMDMODE_COMMIT); } if(temp_servicestatus->notifications_enabled == FALSE) { printf("Enable Notifications", COMMAND_CGI, escape_string(host_name)); printf("
    \n", escape_string(service_desc), CMD_ENABLE_SVC_NOTIFICATIONS, CMDMODE_COMMIT); } else { printf("Disable Notifications", COMMAND_CGI, escape_string(host_name)); printf("
    \n", escape_string(service_desc), CMD_DISABLE_SVC_NOTIFICATIONS, CMDMODE_COMMIT); } printf("

    \n"); printf("
    \n"); /**** ACKNOWLEDGEMENT SCREEN (CARD 3) ****/ printf("\n"); printf("

    \n"); printf("Acknowledge Problem
    \n"); printf("

    \n"); printf("

    \n"); printf("Your Name:
    \n"); printf("
    \n", ((use_ssl_authentication) ? (getenv("SSL_CLIENT_S_DN_CN")) : (getenv("REMOTE_USER")))); printf("Comment:
    \n"); printf("\n"); printf("\n"); printf("", COMMAND_CGI, escape_string(host_name)); printf("\n", escape_string(service_desc), CMD_ACKNOWLEDGE_SVC_PROBLEM, CMDMODE_COMMIT); printf("\n"); printf("

    \n"); printf("
    \n"); return; } /* displays ping results */ void display_ping(void) { char input_buffer[MAX_INPUT_BUFFER]; char buffer[MAX_INPUT_BUFFER]; char *temp_ptr; FILE *fp; int odd = 0; int in_macro = FALSE; /**** MAIN SCREEN (CARD 1) ****/ printf("\n"); if(!strcmp(ping_address, "")) { printf("

    \n"); printf("Ping Host
    \n"); printf("

    \n"); printf("

    \n"); printf("Host Name/Address:
    \n"); printf("\n"); printf("\n"); printf("\n", STATUSWML_CGI); printf("\n"); printf("

    \n"); } else { printf("

    \n"); printf("Results For Ping Of %s:
    \n", ping_address); printf("

    \n"); printf("

    \n"); if(ping_syntax == NULL) printf("ping_syntax in CGI config file is NULL!\n"); else { /* process macros in the ping syntax */ strcpy(buffer, ""); strncpy(input_buffer, ping_syntax, sizeof(input_buffer) - 1); input_buffer[strlen(ping_syntax) - 1] = '\x0'; for(temp_ptr = my_strtok(input_buffer, "$"); temp_ptr != NULL; temp_ptr = my_strtok(NULL, "$")) { if(in_macro == FALSE) { if(strlen(buffer) + strlen(temp_ptr) < sizeof(buffer) - 1) { strncat(buffer, temp_ptr, sizeof(buffer) - strlen(buffer) - 1); buffer[sizeof(buffer) - 1] = '\x0'; } in_macro = TRUE; } else { if(strlen(buffer) + strlen(temp_ptr) < sizeof(buffer) - 1) { if(!strcmp(temp_ptr, "HOSTADDRESS")) strncat(buffer, ping_address, sizeof(buffer) - strlen(buffer) - 1); } in_macro = FALSE; } } /* run the ping command */ fp = popen(buffer, "r"); if(fp) { while(1) { fgets(buffer, sizeof(buffer) - 1, fp); if(feof(fp)) break; strip(buffer); if(odd) { odd = 0; printf("%s
    \n", buffer); } else { odd = 1; printf("%s
    \n", buffer); } } } else printf("Error executing ping!\n"); pclose(fp); } printf("

    \n"); } printf("
    \n"); return; } /* displays traceroute results */ void display_traceroute(void) { char buffer[MAX_INPUT_BUFFER]; FILE *fp; int odd = 0; /**** MAIN SCREEN (CARD 1) ****/ printf("\n"); if(!strcmp(traceroute_address, "")) { printf("

    \n"); printf("Traceroute
    \n"); printf("

    \n"); printf("

    \n"); printf("Host Name/Address:
    \n"); printf("\n"); printf("\n"); printf("\n", STATUSWML_CGI); printf("\n"); printf("

    \n"); } else { printf("

    \n"); printf("Results For Traceroute To %s:
    \n", traceroute_address); printf("

    \n"); printf("

    \n"); snprintf(buffer, sizeof(buffer) - 1, "%s %s", TRACEROUTE_COMMAND, traceroute_address); buffer[sizeof(buffer) - 1] = '\x0'; fp = popen(buffer, "r"); if(fp) { while(1) { fgets(buffer, sizeof(buffer) - 1, fp); if(feof(fp)) break; strip(buffer); if(odd) { odd = 0; printf("%s
    \n", buffer); } else { odd = 1; printf("%s
    \n", buffer); } } } else printf("Error executing traceroute!\n"); pclose(fp); printf("

    \n"); } printf("
    \n"); return; } /* displays problems */ void display_problems(void) { host *temp_host; service *temp_service; hoststatus *temp_hoststatus; int total_host_problems = 0; servicestatus *temp_servicestatus; int total_service_problems = 0; /**** MAIN SCREEN (CARD 1) ****/ printf("\n", (display_type == DISPLAY_ALL_PROBLEMS) ? "All" : "Unhandled"); printf("

    \n"); printf("%s Problems

    \n", (display_type == DISPLAY_ALL_PROBLEMS) ? "All" : "Unhandled"); printf("Host Problems:\n"); printf("\n"); /* check all hosts */ for(temp_hoststatus = hoststatus_list; temp_hoststatus != NULL; temp_hoststatus = temp_hoststatus->next) { temp_host = find_host(temp_hoststatus->host_name); if(temp_host == NULL) continue; if(is_authorized_for_host(temp_host, ¤t_authdata) == FALSE) continue; if(temp_hoststatus->status == SD_HOST_UP || temp_hoststatus->status == HOST_PENDING) continue; if(display_type == DISPLAY_UNHANDLED_PROBLEMS) { if(temp_hoststatus->problem_has_been_acknowledged == TRUE) continue; if(temp_hoststatus->notifications_enabled == FALSE) continue; if(temp_hoststatus->scheduled_downtime_depth > 0) continue; } total_host_problems++; printf("", STATUSWML_CGI, temp_host->name); printf("\n", temp_host->name); } if(total_host_problems == 0) printf("\n"); printf("
    ", temp_host->name); if(temp_hoststatus->status == SD_HOST_DOWN) printf("DWN"); else if(temp_hoststatus->status == SD_HOST_UNREACHABLE) printf("UNR"); else printf("???"); printf("%s
    No problems
    \n"); printf("
    \n"); printf("Svc Problems:\n"); printf("\n"); /* check all services */ for(temp_servicestatus = servicestatus_list; temp_servicestatus != NULL; temp_servicestatus = temp_servicestatus->next) { temp_service = find_service(temp_servicestatus->host_name, temp_servicestatus->description); if(temp_service == NULL) continue; if(is_authorized_for_service(temp_service, ¤t_authdata) == FALSE) continue; if(temp_servicestatus->status == SERVICE_OK || temp_servicestatus->status == SERVICE_PENDING) continue; if(display_type == DISPLAY_UNHANDLED_PROBLEMS) { if(temp_servicestatus->problem_has_been_acknowledged == TRUE) continue; if(temp_servicestatus->notifications_enabled == FALSE) continue; if(temp_servicestatus->scheduled_downtime_depth > 0) continue; if((temp_hoststatus = find_hoststatus(temp_service->host_name))) { if(temp_hoststatus->scheduled_downtime_depth > 0) continue; if(temp_hoststatus->problem_has_been_acknowledged == TRUE) continue; } } total_service_problems++; printf("", STATUSWML_CGI, temp_service->host_name, temp_service->description); printf("\n", temp_service->host_name, temp_service->description); } if(total_service_problems == 0) printf("\n"); printf("
    ", temp_servicestatus->description); if(temp_servicestatus->status == SERVICE_CRITICAL) printf("CRI"); else if(temp_servicestatus->status == SERVICE_WARNING) printf("WRN"); else if(temp_servicestatus->status == SERVICE_UNKNOWN) printf("UNK"); else printf("???"); printf("%s/%s
    No problems
    \n"); printf("

    \n"); printf("
    \n"); return; } nagios-4.3.4/cgi/statuswrl.c000066400000000000000000001070451314764422400157760ustar00rootroot00000000000000/***************************************************************************** * * STATUSWRL.C - Nagios 3-D (VRML) Network Status View * * * Description: * * This CGI will dynamically create a 3-D VRML model of all hosts that are * being monitored on your network. * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #include "../include/config.h" #include "../include/common.h" #include "../include/objects.h" #include "../include/statusdata.h" #include "../include/cgiutils.h" #include "../include/getcgi.h" #include "../include/cgiauth.h" extern char main_config_file[MAX_FILENAME_LENGTH]; extern char url_html_path[MAX_FILENAME_LENGTH]; extern char url_images_path[MAX_FILENAME_LENGTH]; extern char url_logo_images_path[MAX_FILENAME_LENGTH]; extern char *status_file; extern char *statuswrl_include; extern int default_statuswrl_layout_method; #define NAGIOS_VRML_IMAGE "nagiosvrml.png" #define DEFAULT_NODE_WIDTH 0.5 #define DEFAULT_HORIZONTAL_SPACING 1.0 #define DEFAULT_VERTICAL_SPACING 1.0 /* needed for auto-layout modes */ #define DEFAULT_NODE_HEIGHT 0.5 #define DEFAULT_NODE_HSPACING 1.0 #define DEFAULT_NODE_VSPACING 1.0 #define CIRCULAR_DRAWING_RADIUS 5.0 #define LAYOUT_USER_SUPPLIED 0 #define LAYOUT_COLLAPSED_TREE 2 #define LAYOUT_BALANCED_TREE 3 #define LAYOUT_CIRCULAR 4 void calculate_host_coords(void); void calculate_world_bounds(void); void display_world(void); void write_global_vrml_data(void); void draw_process_icon(void); void draw_host(host *); void draw_host_links(void); void draw_host_link(host *, double, double, double, double, double, double); void document_header(void); int process_cgivars(void); int number_of_host_layer_members(host *, int); int max_child_host_layer_members(host *); int host_child_depth_separation(host *, host *); int max_child_host_drawing_width(host *); void calculate_balanced_tree_coords(host *, int, int); void calculate_circular_coords(void); void calculate_circular_layer_coords(host *, double, double, int, int); authdata current_authdata; float link_radius = 0.016; float floor_width = 0.0; float floor_depth = 0.0; double min_z_coord = 0.0; double min_x_coord = 0.0; double min_y_coord = 0.0; double max_z_coord = 0.0; double max_x_coord = 0.0; double max_y_coord = 0.0; double max_world_size = 0.0; double nagios_icon_x = 0.0; double nagios_icon_y = 0.0; int draw_nagios_icon = FALSE; double custom_viewpoint_x = 0.0; double custom_viewpoint_y = 0.0; double custom_viewpoint_z = 0.0; int custom_viewpoint = FALSE; float vertical_spacing = DEFAULT_VERTICAL_SPACING; float horizontal_spacing = DEFAULT_HORIZONTAL_SPACING; float node_width = DEFAULT_NODE_WIDTH; float node_height = DEFAULT_NODE_WIDTH; /* should be the same as the node width */ char *host_name = "all"; int show_all_hosts = TRUE; int use_textures = TRUE; int use_text = TRUE; int use_links = TRUE; int layout_method = LAYOUT_USER_SUPPLIED; int coordinates_were_specified = FALSE; /* were drawing coordinates specified with extended host info entries? */ int main(int argc, char **argv) { int result; /* reset internal variables */ reset_cgi_vars(); /* Initialize shared configuration variables */ init_shared_cfg_vars(1); /* read the CGI configuration file */ result = read_cgi_config_file(get_cgi_config_location()); if(result == ERROR) { document_header(); return ERROR; } /* defaults from CGI config file */ layout_method = default_statuswrl_layout_method; /* get the arguments passed in the URL */ process_cgivars(); document_header(); /* read the main configuration file */ result = read_main_config_file(main_config_file); if(result == ERROR) return ERROR; /* read all object configuration data */ result = read_all_object_configuration_data(main_config_file, READ_ALL_OBJECT_DATA); if(result == ERROR) return ERROR; /* read all status data */ result = read_all_status_data(status_file, READ_ALL_STATUS_DATA); if(result == ERROR) { free_memory(); return ERROR; } /* get authentication information */ get_authentication_information(¤t_authdata); /* display the 3-D VRML world... */ display_world(); /* free all allocated memory */ free_memory(); return OK; } void document_header(void) { char date_time[MAX_DATETIME_LENGTH]; time_t current_time; time_t expire_time; printf("Cache-Control: no-store\r\n"); printf("Pragma: no-cache\r\n"); time(¤t_time); get_time_string(¤t_time, date_time, sizeof(date_time), HTTP_DATE_TIME); printf("Last-Modified: %s\r\n", date_time); expire_time = 0L; get_time_string(&expire_time, date_time, sizeof(date_time), HTTP_DATE_TIME); printf("Expires: %s\r\n", date_time); printf("Content-Type: x-world/x-vrml\r\n\r\n"); return; } int process_cgivars(void) { char **variables; int error = FALSE; int x; variables = getcgivars(); for(x = 0; variables[x] != NULL; x++) { /* do some basic length checking on the variable identifier to prevent buffer overflows */ if(strlen(variables[x]) >= MAX_INPUT_BUFFER - 1) { x++; continue; } /* we found the host argument */ else if(!strcmp(variables[x], "host")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if((host_name = (char *)strdup(variables[x])) == NULL) host_name = "all"; else strip_html_brackets(host_name); if(!strcmp(host_name, "all")) show_all_hosts = TRUE; else show_all_hosts = FALSE; } /* we found the no textures argument*/ else if(!strcmp(variables[x], "notextures")) use_textures = FALSE; /* we found the no text argument*/ else if(!strcmp(variables[x], "notext")) use_text = FALSE; /* we found the no links argument*/ else if(!strcmp(variables[x], "nolinks")) use_links = FALSE; /* we found the layout method option */ else if(!strcmp(variables[x], "layout")) { x++; if(variables[x] == NULL) { error = TRUE; break; } layout_method = atoi(variables[x]); } /* we found custom viewpoint coord */ else if(!strcmp(variables[x], "viewx")) { x++; if(variables[x] == NULL) { error = TRUE; break; } custom_viewpoint_x = strtod(variables[x], NULL); custom_viewpoint = TRUE; } else if(!strcmp(variables[x], "viewy")) { x++; if(variables[x] == NULL) { error = TRUE; break; } custom_viewpoint_y = strtod(variables[x], NULL); custom_viewpoint = TRUE; } else if(!strcmp(variables[x], "viewz")) { x++; if(variables[x] == NULL) { error = TRUE; break; } custom_viewpoint_z = strtod(variables[x], NULL); custom_viewpoint = TRUE; } } /* free memory allocated to the CGI variables */ free_cgivars(variables); return error; } /* top-level VRML world generation... */ void display_world(void) { host *temp_host = NULL; /* get the url we will use to grab the logo images... */ snprintf(url_logo_images_path, sizeof(url_logo_images_path), "%slogos/", url_images_path); url_logo_images_path[sizeof(url_logo_images_path) - 1] = '\x0'; /* calculate host drawing coordinates */ calculate_host_coords(); /* calculate world bounds */ calculate_world_bounds(); /* get the floor dimensions */ if(max_x_coord > 0) floor_width = (float)(max_x_coord - min_x_coord) + (node_width * 2); else floor_width = (float)(max_x_coord + min_x_coord) + (node_width * 2); if(max_z_coord > 0) floor_depth = (float)(max_z_coord - min_z_coord) + (node_height * 2); else floor_depth = (float)(max_z_coord + min_z_coord) + (node_height * 2); /* write global VRML data */ write_global_vrml_data(); /* no coordinates were specified, so display warning message */ if(coordinates_were_specified == FALSE) { printf("\n"); printf("Transform{\n"); printf("translation 0.0 0.0 0.0\n"); printf("children[\n"); printf("Billboard{\n"); printf("children[\n"); printf("Shape{\n"); printf("appearance Appearance {\n"); printf("material Material {\n"); printf("diffuseColor 1 0 0\n"); printf("}\n"); printf("}\n"); printf("geometry Text {\n"); printf("string [ \"Error: You have not supplied any 3-D drawing coordinates.\", \"Read the documentation for more information on supplying\", \"3-D drawing coordinates by defining\", \"extended host information entries in your config files.\" ]\n"); printf("fontStyle FontStyle {\n"); printf("family \"TYPEWRITER\"\n"); printf("size 0.3\n"); printf("justify \"MIDDLE\"\n"); printf("}\n"); printf("}\n"); printf("}\n"); printf("]\n"); printf("}\n"); printf("]\n"); printf("}\n"); } /* coordinates were specified... */ else { /* draw Nagios icon */ if(layout_method != LAYOUT_USER_SUPPLIED) draw_process_icon(); /* draw all hosts */ for(temp_host = host_list; temp_host != NULL; temp_host = temp_host->next) draw_host(temp_host); /* draw host links */ draw_host_links(); } return; } /******************************************************************/ /************************ UTILITY FUNCTIONS ***********************/ /******************************************************************/ /* calculates how many "layers" separate parent and child - used by collapsed tree layout method */ int host_child_depth_separation(host *parent, host *child) { int this_depth = 0; int min_depth = 0; int have_min_depth = FALSE; host *temp_host; if(child == NULL) return -1; if(parent == child) return 0; if(is_host_immediate_child_of_host(parent, child) == TRUE) return 1; for(temp_host = host_list; temp_host != NULL; temp_host = temp_host->next) { if(is_host_immediate_child_of_host(parent, temp_host) == TRUE) { this_depth = host_child_depth_separation(temp_host, child); if(this_depth >= 0 && (have_min_depth == FALSE || (have_min_depth == TRUE && (this_depth < min_depth)))) { have_min_depth = TRUE; min_depth = this_depth; } } } if(have_min_depth == FALSE) return -1; else return min_depth + 1; } /* calculates how many hosts reside on a specific "layer" - used by collapsed tree layout method */ int number_of_host_layer_members(host *parent, int layer) { int current_layer; int layer_members = 0; host *temp_host; for(temp_host = host_list; temp_host != NULL; temp_host = temp_host->next) { current_layer = host_child_depth_separation(parent, temp_host); if(current_layer == layer) layer_members++; } return layer_members; } /* calculate max number of members on all "layers" beneath and including parent host - used by collapsed tree layout method */ int max_child_host_layer_members(host *parent) { int current_layer; int max_members = 1; int current_members = 0; for(current_layer = 1;; current_layer++) { current_members = number_of_host_layer_members(parent, current_layer); if(current_members <= 0) break; if(current_members > max_members) max_members = current_members; } return max_members; } /* calculate max drawing width for host and children - used by balanced tree layout method */ int max_child_host_drawing_width(host *parent) { host *temp_host; int child_width = 0; for(temp_host = host_list; temp_host != NULL; temp_host = temp_host->next) { if(is_host_immediate_child_of_host(parent, temp_host) == TRUE) child_width += max_child_host_drawing_width(temp_host); } /* no children, so set width to 1 for this host */ if(child_width == 0) return 1; else return child_width; } /******************************************************************/ /********************* CALCULATION FUNCTIONS **********************/ /******************************************************************/ /* calculates host drawing coordinates */ void calculate_host_coords(void) { host *this_host; host *temp_host; int parent_hosts = 0; int max_layer_width = 1; int current_parent_host = 0; int center_x = 0; int offset_x = DEFAULT_NODE_WIDTH / 2; int offset_y = DEFAULT_NODE_WIDTH / 2; int current_layer = 0; int layer_members = 0; int current_layer_member = 0; int max_drawing_width = 0; /******************************/ /***** MANUAL LAYOUT MODE *****/ /******************************/ /* user-supplied coords */ if(layout_method == LAYOUT_USER_SUPPLIED) { /* see which hosts we should draw (only those with 3-D coords) */ for(temp_host = host_list; temp_host != NULL; temp_host = temp_host->next) { if(temp_host->have_3d_coords == TRUE) temp_host->should_be_drawn = TRUE; else temp_host->should_be_drawn = FALSE; } return; } /*****************************/ /***** AUTO-LAYOUT MODES *****/ /*****************************/ /* add empty extended host info entries for all hosts that don't have any */ for(temp_host = host_list; temp_host != NULL; temp_host = temp_host->next) { /* none was found, so add a blank one */ /* if(temp_hostextinfo==NULL) add_hostextinfo(temp_host->name,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,0,0.0,0.0,0.0,0,0); */ /* default z coord should 0 for auto-layout modes unless overridden later */ /* else */ temp_host->z_3d = 0.0; } /***** COLLAPSED TREE MODE *****/ if(layout_method == LAYOUT_COLLAPSED_TREE) { /* always use NULL as the "main" host, screen coords/dimensions are adjusted automatically */ this_host = NULL; /* find total number of immediate parents for this host */ parent_hosts = number_of_immediate_parent_hosts(this_host); /* find the max layer width we have... */ max_layer_width = max_child_host_layer_members(this_host); if(parent_hosts > max_layer_width) max_layer_width = parent_hosts; /* calculate center x coord */ center_x = (((DEFAULT_NODE_WIDTH * max_layer_width) + (DEFAULT_NODE_HSPACING * (max_layer_width - 1))) / 2) + offset_x; /* coords for Nagios icon if necessary */ if(this_host == NULL || this_host->parent_hosts == NULL) { nagios_icon_x = center_x; nagios_icon_y = offset_y; draw_nagios_icon = TRUE; } /* do we need to draw a link to parent(s)? */ if(this_host != NULL && is_host_immediate_child_of_host(NULL, this_host) == FALSE) offset_y += DEFAULT_NODE_HEIGHT + DEFAULT_NODE_VSPACING; /* see which hosts we should draw and calculate drawing coords */ for(temp_host = host_list; temp_host != NULL; temp_host = temp_host->next) { /* this is an immediate parent of the "main" host we're drawing */ if(is_host_immediate_parent_of_host(this_host, temp_host) == TRUE) { temp_host->should_be_drawn = TRUE; temp_host->have_3d_coords = TRUE; temp_host->x_3d = center_x - (((parent_hosts * DEFAULT_NODE_WIDTH) + ((parent_hosts - 1) * DEFAULT_NODE_HSPACING)) / 2) + (current_parent_host * (DEFAULT_NODE_WIDTH + DEFAULT_NODE_HSPACING)) + (DEFAULT_NODE_WIDTH / 2); temp_host->y_3d = offset_y; current_parent_host++; } /* this is the "main" host we're drawing */ else if(this_host == temp_host) { temp_host->should_be_drawn = TRUE; temp_host->have_3d_coords = TRUE; temp_host->x_3d = center_x; temp_host->y_3d = DEFAULT_NODE_HEIGHT + DEFAULT_NODE_VSPACING + offset_y; } /* else do not draw this host (we might if its a child - see below, but assume no for now) */ else { temp_host->should_be_drawn = FALSE; temp_host->have_3d_coords = FALSE; } } /* TODO: REORDER CHILD LAYER MEMBERS SO THAT WE MINIMIZE LINK CROSSOVERS FROM PARENT HOSTS */ /* draw hosts in child "layers" */ for(current_layer = 1;; current_layer++) { /* how many members in this layer? */ layer_members = number_of_host_layer_members(this_host, current_layer); if(layer_members == 0) break; current_layer_member = 0; /* see which hosts are members of this layer and calculate drawing coords */ for(temp_host = host_list; temp_host != NULL; temp_host = temp_host->next) { /* is this host a member of the current child layer? */ if(host_child_depth_separation(this_host, temp_host) == current_layer) { temp_host->should_be_drawn = TRUE; temp_host->have_3d_coords = TRUE; temp_host->x_3d = center_x - (((layer_members * DEFAULT_NODE_WIDTH) + ((layer_members - 1) * DEFAULT_NODE_HSPACING)) / 2) + (current_layer_member * (DEFAULT_NODE_WIDTH + DEFAULT_NODE_HSPACING)) + (DEFAULT_NODE_WIDTH / 2); if(this_host == NULL) temp_host->y_3d = ((DEFAULT_NODE_HEIGHT + DEFAULT_NODE_VSPACING) * current_layer) + offset_y; else temp_host->y_3d = ((DEFAULT_NODE_HEIGHT + DEFAULT_NODE_VSPACING) * (current_layer + 1)) + offset_y; current_layer_member++; } } } } /***** "BALANCED" TREE MODE *****/ else if(layout_method == LAYOUT_BALANCED_TREE) { /* always use NULL as the "main" host, screen coords/dimensions are adjusted automatically */ this_host = NULL; /* find total number of immediate parents for this host */ parent_hosts = number_of_immediate_parent_hosts(this_host); /* find the max drawing width we have... */ max_drawing_width = max_child_host_drawing_width(this_host); if(parent_hosts > max_drawing_width) max_drawing_width = parent_hosts; /* calculate center x coord */ center_x = (((DEFAULT_NODE_WIDTH * max_drawing_width) + (DEFAULT_NODE_HSPACING * (max_drawing_width - 1))) / 2) + offset_x; /* coords for Nagios icon if necessary */ if(this_host == NULL || this_host->parent_hosts == NULL) { nagios_icon_x = center_x; nagios_icon_y = offset_y; draw_nagios_icon = TRUE; } /* do we need to draw a link to parent(s)? */ if(this_host != NULL && is_host_immediate_child_of_host(NULL, this_host) == FALSE) offset_y += DEFAULT_NODE_HEIGHT + DEFAULT_NODE_VSPACING; /* see which hosts we should draw and calculate drawing coords */ for(temp_host = host_list; temp_host != NULL; temp_host = temp_host->next) { /* this is an immediate parent of the "main" host we're drawing */ if(is_host_immediate_parent_of_host(this_host, temp_host) == TRUE) { temp_host->should_be_drawn = TRUE; temp_host->have_3d_coords = TRUE; temp_host->x_3d = center_x - (((parent_hosts * DEFAULT_NODE_WIDTH) + ((parent_hosts - 1) * DEFAULT_NODE_HSPACING)) / 2) + (current_parent_host * (DEFAULT_NODE_WIDTH + DEFAULT_NODE_HSPACING)) + (DEFAULT_NODE_WIDTH / 2); temp_host->y_3d = offset_y; current_parent_host++; } /* this is the "main" host we're drawing */ else if(this_host == temp_host) { temp_host->should_be_drawn = TRUE; temp_host->have_3d_coords = TRUE; temp_host->x_3d = center_x; temp_host->y_3d = DEFAULT_NODE_HEIGHT + DEFAULT_NODE_VSPACING + offset_y; } /* else do not draw this host (we might if its a child - see below, but assume no for now) */ else { temp_host->should_be_drawn = FALSE; temp_host->have_3d_coords = FALSE; } } /* draw all children hosts */ calculate_balanced_tree_coords(this_host, center_x, DEFAULT_NODE_HEIGHT + DEFAULT_NODE_VSPACING + offset_y); } /***** CIRCULAR LAYOUT MODE *****/ else if(layout_method == LAYOUT_CIRCULAR) { /* draw process icon */ nagios_icon_x = 0; nagios_icon_y = 0; draw_nagios_icon = TRUE; /* calculate coordinates for all hosts */ calculate_circular_coords(); } return; } /* calculate world dimensions */ void calculate_world_bounds(void) { host *temp_host; min_x_coord = 0.0; min_y_coord = 0.0; min_z_coord = 0.0; max_x_coord = 0.0; max_y_coord = 0.0; max_z_coord = 0.0; /* check all extended host entries */ for(temp_host = host_list; temp_host != NULL; temp_host = temp_host->next) { if(temp_host->have_3d_coords == FALSE) { temp_host->should_be_drawn = FALSE; continue; } if(temp_host->should_be_drawn == FALSE) continue; if(temp_host->x_3d < min_x_coord) min_x_coord = temp_host->x_3d; else if(temp_host->x_3d > max_x_coord) max_x_coord = temp_host->x_3d; if(temp_host->y_3d < min_y_coord) min_y_coord = temp_host->y_3d; else if(temp_host->y_3d > max_y_coord) max_y_coord = temp_host->y_3d; if(temp_host->z_3d < min_z_coord) min_z_coord = temp_host->z_3d; else if(temp_host->z_3d > max_z_coord) max_z_coord = temp_host->z_3d; coordinates_were_specified = TRUE; } /* no drawing coordinates were specified */ if(coordinates_were_specified == FALSE) { min_x_coord = 0.0; max_x_coord = 0.0; min_y_coord = 0.0; max_y_coord = 0.0; min_z_coord = 0.0; max_z_coord = 6.0; } max_world_size = max_x_coord - min_x_coord; if(max_world_size < (max_y_coord - min_y_coord)) max_world_size = max_y_coord - min_y_coord; if(max_world_size < (max_z_coord - min_z_coord)) max_world_size = max_z_coord - min_z_coord; return; } /******************************************************************/ /*********************** DRAWING FUNCTIONS ************************/ /******************************************************************/ /* write global VRML data */ void write_global_vrml_data(void) { host *temp_host; float visibility_range = 0.0; float viewpoint_z = 0.0; /* write VRML code header */ printf("#VRML V2.0 utf8\n"); /* write world information */ printf("\n"); printf("WorldInfo{\n"); printf("title \"Nagios 3-D Network Status View\"\n"); printf("info [\"Copyright (c) 1999-2002 Ethan Galstad\"\n"); printf("\"egalstad@nagios.org\"]\n"); printf("}\n"); /* background color */ printf("\n"); printf("Background{\n"); printf("skyColor 0.1 0.1 0.15\n"); printf("}\n"); /* calculate visibility range - don't let it get too low */ visibility_range = (max_world_size * 2.0); if(visibility_range < 25.0) visibility_range = 25.0; /* write fog information */ printf("\n"); printf("Fog{\n"); printf("color 0.1 0.1 0.15\n"); printf("fogType \"EXPONENTIAL\"\n"); printf("visibilityRange %2.2f\n", visibility_range); printf("}\n"); /* custom viewpoint */ if(custom_viewpoint == TRUE) { printf("\n"); printf("Viewpoint{\n"); printf("position %2.2f %2.2f %2.2f\n", custom_viewpoint_x, custom_viewpoint_y, custom_viewpoint_z); printf("fieldOfView 0.78\n"); printf("description \"Entry Viewpoint\"\n"); printf("}\n"); } /* host close-up viewpoint */ if(show_all_hosts == FALSE) { temp_host = find_host(host_name); if(temp_host != NULL && temp_host->have_3d_coords == TRUE) { printf("\n"); printf("Viewpoint{\n"); printf("position %2.3f %2.3f %2.3f\n", temp_host->x_3d, temp_host->y_3d, temp_host->z_3d + 5.0); printf("fieldOfView 0.78\n"); printf("description \"Host Close-Up Viewpoint\"\n"); printf("}\n"); } } /* calculate z coord for default viewpoint - don't get too close */ viewpoint_z = max_world_size; if(viewpoint_z < 10.0) viewpoint_z = 10.0; /* default viewpoint */ printf("\n"); printf("Viewpoint{\n"); printf("position %2.2f %2.2f %2.2f\n", min_x_coord + ((max_x_coord - min_x_coord) / 2.0), min_y_coord + ((max_y_coord - min_y_coord) / 2.0), viewpoint_z); printf("fieldOfView 0.78\n"); printf("description \"Default Viewpoint\"\n"); printf("}\n"); /* problem timer */ printf("DEF ProblemTimer TimeSensor{\n"); printf("loop TRUE\n"); printf("cycleInterval 5\n"); printf("}\n"); /* host text prototype */ printf("PROTO HostText[\n"); printf("field MFString the_text [\"\"]\n"); printf("field SFColor font_color 0.6 0.6 0.6"); printf("]\n"); printf("{\n"); printf("Billboard{\n"); printf("children[\n"); printf("Shape{\n"); printf("appearance Appearance {\n"); printf("material Material {\n"); printf("diffuseColor IS font_color\n"); printf("}\n"); printf("}\n"); printf("geometry Text {\n"); printf("string IS the_text\n"); printf("fontStyle FontStyle {\n"); printf("family \"TYPEWRITER\"\n"); printf("size 0.1\n"); printf("justify \"MIDDLE\"\n"); printf("}\n"); printf("}\n"); printf("}\n"); printf("]\n"); printf("}\n"); printf("}\n"); /* include user-defined world */ if(statuswrl_include != NULL && coordinates_were_specified == TRUE && layout_method == LAYOUT_USER_SUPPLIED) { printf("\n"); printf("Inline{\n"); printf("url \"%s%s\"\n", url_html_path, statuswrl_include); printf("}\n"); } return; } /* draws a host */ void draw_host(host *temp_host) { hoststatus *temp_hoststatus = NULL; char state_string[16] = ""; double x, y, z; char *vrml_safe_hostname = NULL; int a, ch; if(temp_host == NULL) return; /* make sure we have the coordinates */ if(temp_host->have_3d_coords == FALSE) return; else { x = temp_host->x_3d; y = temp_host->y_3d; z = temp_host->z_3d; } /* make the host name safe for embedding in VRML */ vrml_safe_hostname = (char *)strdup(temp_host->name); if(vrml_safe_hostname == NULL) return; for(a = 0; vrml_safe_hostname[a] != '\x0'; a++) { ch = vrml_safe_hostname[a]; if((ch < 'a' || ch > 'z') && (ch < 'A' || ch > 'Z') && (ch < '0' || ch > '9')) vrml_safe_hostname[a] = '_'; } /* see if user is authorized to view this host */ if(is_authorized_for_host(temp_host, ¤t_authdata) == FALSE) return; /* get the status of the host */ temp_hoststatus = find_hoststatus(temp_host->name); printf("\n"); /* host object */ printf("Anchor{\n"); printf("children[\n"); printf("Transform {\n"); printf("translation %2.2f %2.2f %2.2f\n", x, y, z); printf("children [\n"); printf("DEF Host%s Shape{\n", vrml_safe_hostname); printf("appearance Appearance{\n"); printf("material DEF HostMat%s Material{\n", vrml_safe_hostname); if(temp_hoststatus == NULL) printf("emissiveColor 0.2 0.2 0.2\ndiffuseColor 0.2 0.2 0.2\n"); else if(temp_hoststatus->status == SD_HOST_UP) printf("emissiveColor 0.2 1.0 0.2\ndiffuseColor 0.2 1.0 0.2\n"); else printf("emissiveColor 1.0 0.2 0.2\ndiffuseColor 1.0 0.2 0.2\n"); printf("transparency 0.4\n"); printf("}\n"); if(use_textures == TRUE && temp_host->vrml_image != NULL) { printf("texture ImageTexture{\n"); printf("url \"%s%s\"\n", url_logo_images_path, temp_host->vrml_image); printf("}\n"); } printf("}\n"); printf("geometry Box{\n"); printf("size %2.2f %2.2f %2.2f\n", node_width, node_width, node_width); printf("}\n"); printf("}\n"); printf("]\n"); printf("}\n"); printf("]\n"); printf("description \"View status details for host '%s' (%s)\"\n", temp_host->name, temp_host->alias); printf("url \"%s?host=%s\"\n", STATUS_CGI, temp_host->name); printf("}\n"); /* draw status text */ if(use_text == TRUE) { printf("\n"); printf("Transform{\n"); printf("translation %2.3f %2.3f %2.3f\n", x, y + DEFAULT_NODE_WIDTH, z); printf("children[\n"); printf("HostText{\n"); if(temp_hoststatus != NULL) { if(temp_hoststatus->status == SD_HOST_UP) printf("font_color 0 1 0\n"); else if(temp_hoststatus->status == SD_HOST_DOWN || temp_hoststatus->status == SD_HOST_UNREACHABLE) printf("font_color 1 0 0\n"); } printf("the_text [\"%s\", \"%s\", ", temp_host->name, temp_host->alias); if(temp_hoststatus == NULL) strcpy(state_string, "UNKNOWN"); else { if(temp_hoststatus->status == SD_HOST_DOWN) strcpy(state_string, "DOWN"); else if(temp_hoststatus->status == SD_HOST_UNREACHABLE) strcpy(state_string, "UNREACHABLE"); else if(temp_hoststatus->status == HOST_PENDING) strcpy(state_string, "PENDING"); else strcpy(state_string, "UP"); } printf("\"%s\"]\n", state_string); printf("}\n"); printf("]\n"); printf("}\n"); } /* host is down or unreachable, so make it fade in and out */ if(temp_hoststatus != NULL && (temp_hoststatus->status == SD_HOST_DOWN || temp_hoststatus->status == SD_HOST_UNREACHABLE)) printf("ROUTE ProblemTimer.fraction_changed TO HostMat%s.set_transparency\n", vrml_safe_hostname); free(vrml_safe_hostname); return; } /* draw links between hosts */ void draw_host_links(void) { host *parent_host; host *child_host; if(use_links == FALSE) return; for(child_host = host_list; child_host != NULL; child_host = child_host->next) { if(child_host->have_3d_coords == FALSE) continue; /* check authorization */ if(is_authorized_for_host(child_host, ¤t_authdata) == FALSE) continue; /* draw a link from this host to all of its parent hosts */ for(parent_host = host_list; parent_host != NULL; parent_host = parent_host->next) { if(is_host_immediate_child_of_host(child_host, parent_host) == TRUE) { if(parent_host->have_3d_coords == FALSE) continue; /* check authorization */ if(is_authorized_for_host(parent_host, ¤t_authdata) == FALSE) continue; /* draw the link between the child and parent hosts */ draw_host_link(parent_host, parent_host->x_3d, parent_host->y_3d, parent_host->z_3d, child_host->x_3d, child_host->y_3d, child_host->z_3d); } } } return; } /* draws a link from a parent host to a child host */ void draw_host_link(host *hst, double x0, double y0, double z0, double x1, double y1, double z1) { printf("\n"); if(hst != NULL) printf("# Host '%s' LINK\n", hst->name); printf("Shape{\n"); printf("appearance DEF MATslategrey_0_ Appearance {\n"); printf("material Material {\n"); printf("diffuseColor 0.6 0.6 0.6\n"); printf("ambientIntensity 0.5\n"); printf("emissiveColor 0.6 0.6 0.6\n"); printf("}\n"); printf("}\n"); printf("geometry IndexedLineSet{\n"); printf("coord Coordinate{\n"); printf("point [ %2.3f %2.3f %2.3f, %2.3f %2.3f %2.3f ]\n", x0, y0, z0, x1, y1, z1); printf("}\n"); printf("coordIndex [ 0,1,-1 ]\n"); printf("}\n"); printf("}\n"); return; } /* draw process icon */ void draw_process_icon(void) { host *child_host; if(draw_nagios_icon == FALSE) return; /* draw process icon */ printf("\n"); printf("Anchor{\n"); printf("children[\n"); printf("Transform {\n"); printf("translation %2.2f %2.2f %2.2f\n", nagios_icon_x, nagios_icon_y, 0.0); printf("children [\n"); printf("DEF ProcessNode Shape{\n"); printf("appearance Appearance{\n"); printf("material Material{\n"); printf("emissiveColor 0.5 0.5 0.5\n"); printf("diffuseColor 0.5 0.5 0.5\n"); printf("transparency 0.2\n"); printf("}\n"); if(use_textures == TRUE) { printf("texture ImageTexture{\n"); printf("url \"%s%s\"\n", url_logo_images_path, NAGIOS_VRML_IMAGE); printf("}\n"); } printf("}\n"); printf("geometry Box{\n"); printf("size %2.2f %2.2f %2.2f\n", node_width * 3.0, node_width * 3.0, node_width * 3.0); printf("}\n"); printf("}\n"); printf("]\n"); printf("}\n"); printf("]\n"); printf("description \"View Nagios Process Information\"\n"); printf("url \"%s?type=%d\"\n", EXTINFO_CGI, DISPLAY_PROCESS_INFO); printf("}\n"); if(use_links == FALSE) return; /* draw links to immediate child hosts */ for(child_host = host_list; child_host != NULL; child_host = child_host->next) { if(child_host->have_3d_coords == FALSE) continue; /* check authorization */ if(is_authorized_for_host(child_host, ¤t_authdata) == FALSE) continue; /* draw a link to the host */ if(is_host_immediate_child_of_host(NULL, child_host) == TRUE) draw_host_link(NULL, nagios_icon_x, nagios_icon_y, 0.0, child_host->x_3d, child_host->y_3d, child_host->z_3d); } return; } /******************************************************************/ /***************** COORDINATE CALCULATION FUNCTIONS ***************/ /******************************************************************/ /* calculates coords of a host's children - used by balanced tree layout method */ void calculate_balanced_tree_coords(host *parent, int x, int y) { int parent_drawing_width; int start_drawing_x; int current_drawing_x; int this_drawing_width; host *temp_host; /* calculate total drawing width of parent host */ parent_drawing_width = max_child_host_drawing_width(parent); /* calculate starting x coord */ start_drawing_x = x - (((DEFAULT_NODE_WIDTH * parent_drawing_width) + (DEFAULT_NODE_HSPACING * (parent_drawing_width - 1))) / 2); current_drawing_x = start_drawing_x; /* calculate coords for children */ for(temp_host = host_list; temp_host != NULL; temp_host = temp_host->next) { if(is_host_immediate_child_of_host(parent, temp_host) == TRUE) { /* get drawing width of child host */ this_drawing_width = max_child_host_drawing_width(temp_host); temp_host->x_3d = current_drawing_x + (((DEFAULT_NODE_WIDTH * this_drawing_width) + (DEFAULT_NODE_HSPACING * (this_drawing_width - 1))) / 2); temp_host->y_3d = y + DEFAULT_NODE_HEIGHT + DEFAULT_NODE_VSPACING; temp_host->have_3d_coords = TRUE; temp_host->should_be_drawn = TRUE; current_drawing_x += (this_drawing_width * DEFAULT_NODE_WIDTH) + ((this_drawing_width - 1) * DEFAULT_NODE_HSPACING) + DEFAULT_NODE_HSPACING; /* recurse into child host ... */ calculate_balanced_tree_coords(temp_host, temp_host->x_3d, temp_host->y_3d); } } return; } /* calculate coords of all hosts in circular layout method */ void calculate_circular_coords(void) { /* calculate all host coords, starting with first layer */ calculate_circular_layer_coords(NULL, 0.0, 360.0, 1, CIRCULAR_DRAWING_RADIUS); return; } /* calculates coords of all hosts in a particular "layer" in circular layout method */ void calculate_circular_layer_coords(host *parent, double start_angle, double useable_angle, int layer, int radius) { int parent_drawing_width = 0; int this_drawing_width = 0; int immediate_children = 0; double current_drawing_angle = 0.0; double this_drawing_angle = 0.0; double available_angle = 0.0; double clipped_available_angle = 0.0; double x_coord = 0.0; double y_coord = 0.0; host *temp_host; /* get the total number of immediate children to this host */ immediate_children = number_of_immediate_child_hosts(parent); /* bail out if we're done */ if(immediate_children == 0) return; /* calculate total drawing "width" of parent host */ parent_drawing_width = max_child_host_drawing_width(parent); /* calculate initial drawing angle */ current_drawing_angle = start_angle; /* calculate coords for children */ for(temp_host = host_list; temp_host != NULL; temp_host = temp_host->next) { if(is_host_immediate_child_of_host(parent, temp_host) == TRUE) { /* get drawing width of child host */ this_drawing_width = max_child_host_drawing_width(temp_host); /* calculate angle this host gets for drawing */ available_angle = useable_angle * ((double)this_drawing_width / (double)parent_drawing_width); /* clip available angle if necessary */ /* this isn't really necessary, but helps keep things looking a bit more sane with less potential connection crossover */ clipped_available_angle = 360.0 / layer; if(available_angle < clipped_available_angle) clipped_available_angle = available_angle; /* calculate the exact angle at which we should draw this child */ this_drawing_angle = current_drawing_angle + (available_angle / 2.0); /* compensate for angle overflow */ while(this_drawing_angle >= 360.0) this_drawing_angle -= 360.0; while(this_drawing_angle < 0.0) this_drawing_angle += 360.0; /* calculate drawing coords of this host using good ol' geometry... */ x_coord = -(sin(-this_drawing_angle * (M_PI / 180.0)) * radius); y_coord = -(sin((90 + this_drawing_angle) * (M_PI / 180.0)) * radius); temp_host->x_3d = (int)x_coord; temp_host->y_3d = (int)y_coord; temp_host->have_3d_coords = TRUE; temp_host->should_be_drawn = TRUE; /* recurse into child host ... */ calculate_circular_layer_coords(temp_host, current_drawing_angle + ((available_angle - clipped_available_angle) / 2), clipped_available_angle, layer + 1, radius + CIRCULAR_DRAWING_RADIUS); /* increment current drawing angle */ current_drawing_angle += available_angle; } } return; } nagios-4.3.4/cgi/summary.c000066400000000000000000002643301314764422400154240ustar00rootroot00000000000000/************************************************************************** * * SUMMARY.C - Nagios Alert Summary CGI * * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *************************************************************************/ #include "../include/config.h" #include "../include/common.h" #include "../include/objects.h" #include "../include/comments.h" #include "../include/statusdata.h" #include "../include/cgiutils.h" #include "../include/getcgi.h" #include "../include/cgiauth.h" extern char main_config_file[MAX_FILENAME_LENGTH]; extern char url_html_path[MAX_FILENAME_LENGTH]; extern char url_images_path[MAX_FILENAME_LENGTH]; extern char url_stylesheets_path[MAX_FILENAME_LENGTH]; /* output types */ #define HTML_OUTPUT 0 #define CSV_OUTPUT 1 /* custom report types */ #define REPORT_NONE 0 #define REPORT_RECENT_ALERTS 1 #define REPORT_ALERT_TOTALS 2 #define REPORT_TOP_ALERTS 3 #define REPORT_HOSTGROUP_ALERT_TOTALS 4 #define REPORT_HOST_ALERT_TOTALS 5 #define REPORT_SERVICE_ALERT_TOTALS 6 #define REPORT_SERVICEGROUP_ALERT_TOTALS 7 /* standard report types */ #define SREPORT_NONE 0 #define SREPORT_RECENT_ALERTS 1 #define SREPORT_RECENT_HOST_ALERTS 2 #define SREPORT_RECENT_SERVICE_ALERTS 3 #define SREPORT_TOP_HOST_ALERTS 4 #define SREPORT_TOP_SERVICE_ALERTS 5 /* standard report times */ #define TIMEPERIOD_CUSTOM 0 #define TIMEPERIOD_TODAY 1 #define TIMEPERIOD_YESTERDAY 2 #define TIMEPERIOD_THISWEEK 3 #define TIMEPERIOD_LASTWEEK 4 #define TIMEPERIOD_THISMONTH 5 #define TIMEPERIOD_LASTMONTH 6 #define TIMEPERIOD_THISQUARTER 7 #define TIMEPERIOD_LASTQUARTER 8 #define TIMEPERIOD_THISYEAR 9 #define TIMEPERIOD_LASTYEAR 10 #define TIMEPERIOD_LAST24HOURS 11 #define TIMEPERIOD_LAST7DAYS 12 #define TIMEPERIOD_LAST31DAYS 13 #define AE_SOFT_STATE 1 #define AE_HARD_STATE 2 #define AE_HOST_ALERT 1 #define AE_SERVICE_ALERT 2 #define AE_HOST_PRODUCER 1 #define AE_SERVICE_PRODUCER 2 #define AE_HOST_DOWN 1 #define AE_HOST_UNREACHABLE 2 #define AE_HOST_UP 4 #define AE_SERVICE_WARNING 8 #define AE_SERVICE_UNKNOWN 16 #define AE_SERVICE_CRITICAL 32 #define AE_SERVICE_OK 64 typedef struct archived_event_struct { time_t time_stamp; int event_type; int entry_type; char *host_name; char *service_description; int state; int state_type; char *event_info; struct archived_event_struct *next; } archived_event; typedef struct alert_producer_struct { int producer_type; char *host_name; char *service_description; int total_alerts; struct alert_producer_struct *next; } alert_producer; void read_archived_event_data(void); void scan_log_file_for_archived_event_data(char *); void convert_timeperiod_to_times(int); void compute_report_times(void); void determine_standard_report_options(void); void add_archived_event(int, time_t, int, int, char *, char *, char *); alert_producer *find_producer(int, char *, char *); alert_producer *add_producer(int, char *, char *); void free_event_list(void); void free_producer_list(void); void display_report(void); void display_recent_alerts(void); void display_alert_totals(void); void display_hostgroup_alert_totals(void); void display_specific_hostgroup_alert_totals(hostgroup *); void display_servicegroup_alert_totals(void); void display_specific_servicegroup_alert_totals(servicegroup *); void display_host_alert_totals(void); void display_specific_host_alert_totals(host *); void display_service_alert_totals(void); void display_specific_service_alert_totals(service *); void display_top_alerts(void); void document_header(int); void document_footer(void); int process_cgivars(void); archived_event *event_list = NULL; alert_producer *producer_list = NULL; authdata current_authdata; time_t t1; time_t t2; int start_second = 0; int start_minute = 0; int start_hour = 0; int start_day = 1; int start_month = 1; int start_year = 2000; int end_second = 0; int end_minute = 0; int end_hour = 24; int end_day = 1; int end_month = 1; int end_year = 2000; int compute_time_from_parts = FALSE; int timeperiod_type = TIMEPERIOD_CUSTOM; int state_types = AE_HARD_STATE + AE_SOFT_STATE; int alert_types = AE_HOST_ALERT + AE_SERVICE_ALERT; int host_states = AE_HOST_UP + AE_HOST_DOWN + AE_HOST_UNREACHABLE; int service_states = AE_SERVICE_OK + AE_SERVICE_WARNING + AE_SERVICE_UNKNOWN + AE_SERVICE_CRITICAL; int show_all_hostgroups = TRUE; int show_all_servicegroups = TRUE; int show_all_hosts = TRUE; char *target_hostgroup_name = ""; char *target_servicegroup_name = ""; char *target_host_name = ""; hostgroup *target_hostgroup = NULL; servicegroup *target_servicegroup = NULL; host *target_host = NULL; int earliest_archive = 0; int item_limit = 25; int total_items = 0; int embedded = FALSE; int display_header = TRUE; int output_format = HTML_OUTPUT; int display_type = REPORT_RECENT_ALERTS; int standard_report = SREPORT_NONE; int generate_report = FALSE; int main(int argc, char **argv) { char temp_buffer[MAX_INPUT_BUFFER]; char start_timestring[MAX_DATETIME_LENGTH]; char end_timestring[MAX_DATETIME_LENGTH]; host *temp_host; int days, hours, minutes, seconds; hostgroup *temp_hostgroup; servicegroup *temp_servicegroup; time_t t3; time_t current_time; struct tm *t; int x; /* reset internal CGI variables */ reset_cgi_vars(); cgi_init(document_header, document_footer, READ_ALL_OBJECT_DATA, 0); /* initialize report time period to last 24 hours */ time(&t2); t1 = (time_t)(t2 - (60 * 60 * 24)); /* get the arguments passed in the URL */ process_cgivars(); document_header(TRUE); /* get authentication information */ get_authentication_information(¤t_authdata); if(standard_report != SREPORT_NONE) determine_standard_report_options(); if(compute_time_from_parts == TRUE) compute_report_times(); /* make sure times are sane, otherwise swap them */ if(t2 < t1) { t3 = t2; t2 = t1; t1 = t3; } if(display_header == TRUE) { /* begin top table */ printf("\n"); printf("\n"); /* left column of the first row */ printf("\n"); /* center column of top row */ printf("\n"); /* right hand column of top row */ printf("\n"); /* end of top table */ printf("\n"); printf("
    \n"); snprintf(temp_buffer, sizeof(temp_buffer) - 1, "Alert Summary Report"); temp_buffer[sizeof(temp_buffer) - 1] = '\x0'; display_info_table(temp_buffer, FALSE, ¤t_authdata); printf("\n"); if(generate_report == TRUE) { printf("
    \n"); if(display_type == REPORT_TOP_ALERTS) printf("Top Alert Producers"); else if(display_type == REPORT_ALERT_TOTALS || display_type == REPORT_HOSTGROUP_ALERT_TOTALS || display_type == REPORT_SERVICEGROUP_ALERT_TOTALS || display_type == REPORT_HOST_ALERT_TOTALS || display_type == REPORT_SERVICE_ALERT_TOTALS) printf("Alert Totals"); else printf("Most Recent Alerts"); if(show_all_hostgroups == FALSE) printf(" For Hostgroup '%s'", target_hostgroup_name); else if(show_all_servicegroups == FALSE) printf(" For Servicegroup '%s'", target_servicegroup_name); else if(show_all_hosts == FALSE) printf(" For Host '%s'", target_host_name); printf("
    \n"); printf("
    \n"); get_time_string(&t1, start_timestring, sizeof(start_timestring) - 1, SHORT_DATE_TIME); get_time_string(&t2, end_timestring, sizeof(end_timestring) - 1, SHORT_DATE_TIME); printf("
    %s to %s
    \n", start_timestring, end_timestring); get_time_breakdown((time_t)(t2 - t1), &days, &hours, &minutes, &seconds); printf("
    Duration: %dd %dh %dm %ds
    \n", days, hours, minutes, seconds); } printf("
    \n"); if(generate_report == TRUE) { printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); /* display context-sensitive help */ printf("\n"); printf("
    Report Options Summary:
    Alert Types:\n"); if(alert_types & AE_HOST_ALERT) printf("Host"); if(alert_types & AE_SERVICE_ALERT) printf("%sService", (alert_types & AE_HOST_ALERT) ? " & " : ""); printf(" Alerts
    State Types:"); if(state_types & AE_SOFT_STATE) printf("Soft"); if(state_types & AE_HARD_STATE) printf("%sHard", (state_types & AE_SOFT_STATE) ? " & " : ""); printf(" States
    Host States:"); x = 0; if(host_states & AE_HOST_UP) { printf("Up"); x = 1; } if(host_states & AE_HOST_DOWN) { printf("%sDown", (x == 1) ? ", " : ""); x = 1; } if(host_states & AE_HOST_UNREACHABLE) printf("%sUnreachable", (x == 1) ? ", " : ""); if(x == 0) printf("None"); printf("
    Service States:"); x = 0; if(service_states & AE_SERVICE_OK) { printf("Ok"); x = 1; } if(service_states & AE_SERVICE_WARNING) { printf("%sWarning", (x == 1) ? ", " : ""); x = 1; } if(service_states & AE_SERVICE_UNKNOWN) { printf("%sUnknown", (x == 1) ? ", " : ""); x = 1; } if(service_states & AE_SERVICE_CRITICAL) printf("%sCritical", (x == 1) ? ", " : ""); if(x == 0) printf("None"); printf("
    \n"); printf("
    \n", SUMMARY_CGI); printf("\n"); printf("
    \n"); printf("
    \n"); if(display_type == REPORT_TOP_ALERTS) display_context_help(CONTEXTHELP_SUMMARY_ALERT_PRODUCERS); else if(display_type == REPORT_ALERT_TOTALS) display_context_help(CONTEXTHELP_SUMMARY_ALERT_TOTALS); else if(display_type == REPORT_HOSTGROUP_ALERT_TOTALS) display_context_help(CONTEXTHELP_SUMMARY_HOSTGROUP_ALERT_TOTALS); else if(display_type == REPORT_HOST_ALERT_TOTALS) display_context_help(CONTEXTHELP_SUMMARY_HOST_ALERT_TOTALS); else if(display_type == REPORT_SERVICE_ALERT_TOTALS) display_context_help(CONTEXTHELP_SUMMARY_SERVICE_ALERT_TOTALS); else if(display_type == REPORT_SERVICEGROUP_ALERT_TOTALS) display_context_help(CONTEXTHELP_SUMMARY_SERVICEGROUP_ALERT_TOTALS); else display_context_help(CONTEXTHELP_SUMMARY_RECENT_ALERTS); printf("
    \n"); } else { printf("\n"); printf("\n"); printf("
    \n"); display_context_help(CONTEXTHELP_SUMMARY_MENU); printf("
    \n"); } printf("
    \n"); } /*********************************/ /****** GENERATE THE REPORT ******/ /*********************************/ if(generate_report == TRUE) { read_archived_event_data(); display_report(); } /* ask user for report options */ else { time(¤t_time); t = localtime(¤t_time); start_day = 1; start_year = t->tm_year + 1900; end_day = t->tm_mday; end_year = t->tm_year + 1900; printf("
    Standard Reports:
    \n"); printf("
    \n"); printf("
    \n", SUMMARY_CGI); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("
    Report Type:\n"); printf("\n"); printf("
    \n"); printf("
    \n"); printf("
    \n"); printf("
    Custom Report Options:
    \n"); printf("
    \n"); printf("
    \n", SUMMARY_CGI); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf(""); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf(""); printf("\n"); printf("\n"); printf("\n"); printf(""); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("
    Report Type:\n"); printf("\n"); printf("
    Report Period:\n"); printf("\n"); printf("
    If Custom Report Period...
    Start Date (Inclusive):"); printf("\n "); printf(" ", start_day); printf("", start_year); printf("\n"); printf("\n"); printf("\n"); printf("
    End Date (Inclusive):"); printf("\n "); printf(" ", end_day); printf("", end_year); printf("\n"); printf("\n"); printf("\n"); printf("

    Limit To Hostgroup:\n"); printf("\n"); printf("
    Limit To Servicegroup:\n"); printf("\n"); printf("
    Limit To Host:\n"); printf("\n"); printf("
    Alert Types:\n"); printf("\n"); printf("
    State Types:\n"); printf("\n"); printf("
    Host States:\n"); printf("\n"); printf("
    Service States:\n"); printf("\n"); printf("
    Max List Items:\n"); printf("\n", item_limit); printf("
    \n"); printf("
    \n"); printf("
    \n"); } document_footer(); /* free all other allocated memory */ free_memory(); free_event_list(); free_producer_list(); return OK; } void document_header(int use_stylesheet) { char date_time[MAX_DATETIME_LENGTH]; time_t current_time; time_t expire_time; printf("Cache-Control: no-store\r\n"); printf("Pragma: no-cache\r\n"); time(¤t_time); get_time_string(¤t_time, date_time, sizeof(date_time), HTTP_DATE_TIME); printf("Last-Modified: %s\r\n", date_time); expire_time = (time_t)0; get_time_string(&expire_time, date_time, sizeof(date_time), HTTP_DATE_TIME); printf("Expires: %s\r\n", date_time); if(output_format == HTML_OUTPUT) printf("Content-type: text/html; charset=utf-8\r\n\r\n"); else { printf("Content-type: text/plain\r\n\r\n"); return; } if(embedded == TRUE || output_format == CSV_OUTPUT) return; printf("\n"); printf("\n"); printf("\n", url_images_path); printf("\n"); printf("Nagios Event Summary\n"); printf("\n"); if(use_stylesheet == TRUE) { printf("\n", url_stylesheets_path, COMMON_CSS); printf("\n", url_stylesheets_path, SUMMARY_CSS); } printf("\n"); printf("\n"); /* include user SSI header */ include_ssi_files(SUMMARY_CGI, SSI_HEADER); return; } void document_footer(void) { if(output_format != HTML_OUTPUT) return; if(embedded == TRUE) return; /* include user SSI footer */ include_ssi_files(SUMMARY_CGI, SSI_FOOTER); printf("\n"); printf("\n"); return; } int process_cgivars(void) { char **variables; int error = FALSE; int x; variables = getcgivars(); for(x = 0; variables[x] != NULL; x++) { /* do some basic length checking on the variable identifier to prevent buffer overflows */ if(strlen(variables[x]) >= MAX_INPUT_BUFFER - 1) { continue; } /* we found first time argument */ else if(!strcmp(variables[x], "t1")) { x++; if(variables[x] == NULL) { error = TRUE; break; } t1 = (time_t)strtoul(variables[x], NULL, 10); timeperiod_type = TIMEPERIOD_CUSTOM; compute_time_from_parts = FALSE; } /* we found first time argument */ else if(!strcmp(variables[x], "t2")) { x++; if(variables[x] == NULL) { error = TRUE; break; } t2 = (time_t)strtoul(variables[x], NULL, 10); timeperiod_type = TIMEPERIOD_CUSTOM; compute_time_from_parts = FALSE; } /* we found the standard timeperiod argument */ else if(!strcmp(variables[x], "timeperiod")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(!strcmp(variables[x], "today")) timeperiod_type = TIMEPERIOD_TODAY; else if(!strcmp(variables[x], "yesterday")) timeperiod_type = TIMEPERIOD_YESTERDAY; else if(!strcmp(variables[x], "thisweek")) timeperiod_type = TIMEPERIOD_THISWEEK; else if(!strcmp(variables[x], "lastweek")) timeperiod_type = TIMEPERIOD_LASTWEEK; else if(!strcmp(variables[x], "thismonth")) timeperiod_type = TIMEPERIOD_THISMONTH; else if(!strcmp(variables[x], "lastmonth")) timeperiod_type = TIMEPERIOD_LASTMONTH; else if(!strcmp(variables[x], "thisquarter")) timeperiod_type = TIMEPERIOD_THISQUARTER; else if(!strcmp(variables[x], "lastquarter")) timeperiod_type = TIMEPERIOD_LASTQUARTER; else if(!strcmp(variables[x], "thisyear")) timeperiod_type = TIMEPERIOD_THISYEAR; else if(!strcmp(variables[x], "lastyear")) timeperiod_type = TIMEPERIOD_LASTYEAR; else if(!strcmp(variables[x], "last24hours")) timeperiod_type = TIMEPERIOD_LAST24HOURS; else if(!strcmp(variables[x], "last7days")) timeperiod_type = TIMEPERIOD_LAST7DAYS; else if(!strcmp(variables[x], "last31days")) timeperiod_type = TIMEPERIOD_LAST31DAYS; else if(!strcmp(variables[x], "custom")) timeperiod_type = TIMEPERIOD_CUSTOM; else continue; convert_timeperiod_to_times(timeperiod_type); compute_time_from_parts = FALSE; } /* we found the embed option */ else if(!strcmp(variables[x], "embedded")) embedded = TRUE; /* we found the noheader option */ else if(!strcmp(variables[x], "noheader")) display_header = FALSE; /* we found time argument */ else if(!strcmp(variables[x], "smon")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(timeperiod_type != TIMEPERIOD_CUSTOM) continue; start_month = atoi(variables[x]); timeperiod_type = TIMEPERIOD_CUSTOM; compute_time_from_parts = TRUE; } /* we found time argument */ else if(!strcmp(variables[x], "sday")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(timeperiod_type != TIMEPERIOD_CUSTOM) continue; start_day = atoi(variables[x]); timeperiod_type = TIMEPERIOD_CUSTOM; compute_time_from_parts = TRUE; } /* we found time argument */ else if(!strcmp(variables[x], "syear")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(timeperiod_type != TIMEPERIOD_CUSTOM) continue; start_year = atoi(variables[x]); timeperiod_type = TIMEPERIOD_CUSTOM; compute_time_from_parts = TRUE; } /* we found time argument */ else if(!strcmp(variables[x], "smin")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(timeperiod_type != TIMEPERIOD_CUSTOM) continue; start_minute = atoi(variables[x]); timeperiod_type = TIMEPERIOD_CUSTOM; compute_time_from_parts = TRUE; } /* we found time argument */ else if(!strcmp(variables[x], "ssec")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(timeperiod_type != TIMEPERIOD_CUSTOM) continue; start_second = atoi(variables[x]); timeperiod_type = TIMEPERIOD_CUSTOM; compute_time_from_parts = TRUE; } /* we found time argument */ else if(!strcmp(variables[x], "shour")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(timeperiod_type != TIMEPERIOD_CUSTOM) continue; start_hour = atoi(variables[x]); timeperiod_type = TIMEPERIOD_CUSTOM; compute_time_from_parts = TRUE; } /* we found time argument */ else if(!strcmp(variables[x], "emon")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(timeperiod_type != TIMEPERIOD_CUSTOM) continue; end_month = atoi(variables[x]); timeperiod_type = TIMEPERIOD_CUSTOM; compute_time_from_parts = TRUE; } /* we found time argument */ else if(!strcmp(variables[x], "eday")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(timeperiod_type != TIMEPERIOD_CUSTOM) continue; end_day = atoi(variables[x]); timeperiod_type = TIMEPERIOD_CUSTOM; compute_time_from_parts = TRUE; } /* we found time argument */ else if(!strcmp(variables[x], "eyear")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(timeperiod_type != TIMEPERIOD_CUSTOM) continue; end_year = atoi(variables[x]); timeperiod_type = TIMEPERIOD_CUSTOM; compute_time_from_parts = TRUE; } /* we found time argument */ else if(!strcmp(variables[x], "emin")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(timeperiod_type != TIMEPERIOD_CUSTOM) continue; end_minute = atoi(variables[x]); timeperiod_type = TIMEPERIOD_CUSTOM; compute_time_from_parts = TRUE; } /* we found time argument */ else if(!strcmp(variables[x], "esec")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(timeperiod_type != TIMEPERIOD_CUSTOM) continue; end_second = atoi(variables[x]); timeperiod_type = TIMEPERIOD_CUSTOM; compute_time_from_parts = TRUE; } /* we found time argument */ else if(!strcmp(variables[x], "ehour")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(timeperiod_type != TIMEPERIOD_CUSTOM) continue; end_hour = atoi(variables[x]); timeperiod_type = TIMEPERIOD_CUSTOM; compute_time_from_parts = TRUE; } /* we found the item limit argument */ else if(!strcmp(variables[x], "limit")) { x++; if(variables[x] == NULL) { error = TRUE; break; } item_limit = atoi(variables[x]); } /* we found the state types argument */ else if(!strcmp(variables[x], "statetypes")) { x++; if(variables[x] == NULL) { error = TRUE; break; } state_types = atoi(variables[x]); } /* we found the alert types argument */ else if(!strcmp(variables[x], "alerttypes")) { x++; if(variables[x] == NULL) { error = TRUE; break; } alert_types = atoi(variables[x]); } /* we found the host states argument */ else if(!strcmp(variables[x], "hoststates")) { x++; if(variables[x] == NULL) { error = TRUE; break; } host_states = atoi(variables[x]); } /* we found the service states argument */ else if(!strcmp(variables[x], "servicestates")) { x++; if(variables[x] == NULL) { error = TRUE; break; } service_states = atoi(variables[x]); } /* we found the generate report argument */ else if(!strcmp(variables[x], "report")) { x++; if(variables[x] == NULL) { error = TRUE; break; } generate_report = (atoi(variables[x]) > 0) ? TRUE : FALSE; } /* we found the display type argument */ else if(!strcmp(variables[x], "displaytype")) { x++; if(variables[x] == NULL) { error = TRUE; break; } display_type = atoi(variables[x]); } /* we found the standard report argument */ else if(!strcmp(variables[x], "standardreport")) { x++; if(variables[x] == NULL) { error = TRUE; break; } standard_report = atoi(variables[x]); } /* we found the hostgroup argument */ else if(!strcmp(variables[x], "hostgroup")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if((target_hostgroup_name = (char *)strdup(variables[x])) == NULL) target_hostgroup_name = ""; strip_html_brackets(target_hostgroup_name); if(!strcmp(target_hostgroup_name, "all")) show_all_hostgroups = TRUE; else { show_all_hostgroups = FALSE; target_hostgroup = find_hostgroup(target_hostgroup_name); } } /* we found the servicegroup argument */ else if(!strcmp(variables[x], "servicegroup")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if((target_servicegroup_name = (char *)strdup(variables[x])) == NULL) target_servicegroup_name = ""; strip_html_brackets(target_servicegroup_name); if(!strcmp(target_servicegroup_name, "all")) show_all_servicegroups = TRUE; else { show_all_servicegroups = FALSE; target_servicegroup = find_servicegroup(target_servicegroup_name); } } /* we found the host argument */ else if(!strcmp(variables[x], "host")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if((target_host_name = (char *)strdup(variables[x])) == NULL) target_host_name = ""; strip_html_brackets(target_host_name); if(!strcmp(target_host_name, "all")) show_all_hosts = TRUE; else { show_all_hosts = FALSE; target_host = find_host(target_host_name); } } } /* free memory allocated to the CGI variables */ free_cgivars(variables); return error; } /* reads log files for archived event data */ void read_archived_event_data(void) { char filename[MAX_FILENAME_LENGTH]; int oldest_archive = 0; int newest_archive = 0; int current_archive = 0; /* determine oldest archive to use when scanning for data */ oldest_archive = determine_archive_to_use_from_time(t1); /* determine most recent archive to use when scanning for data */ newest_archive = determine_archive_to_use_from_time(t2); if(oldest_archive < newest_archive) oldest_archive = newest_archive; /* read in all the necessary archived logs (from most recent to earliest) */ for(current_archive = newest_archive; current_archive <= oldest_archive; current_archive++) { /* get the name of the log file that contains this archive */ get_log_archive_to_use(current_archive, filename, sizeof(filename) - 1); /* scan the log file for archived state data */ scan_log_file_for_archived_event_data(filename); } return; } /* grabs archived event data from a log file */ void scan_log_file_for_archived_event_data(char *filename) { char *input = NULL; char *input2 = NULL; char entry_host_name[MAX_INPUT_BUFFER]; char entry_svc_description[MAX_INPUT_BUFFER]; int state; int state_type; char *temp_buffer; char *plugin_output; time_t time_stamp; mmapfile *thefile; if((thefile = mmap_fopen(filename)) == NULL) return; while(1) { /* free memory */ free(input); free(input2); input = NULL; input2 = NULL; /* read the next line */ if((input = mmap_fgets(thefile)) == NULL) break; strip(input); if((input2 = strdup(input)) == NULL) continue; /* get the timestamp */ temp_buffer = my_strtok(input2, "]"); time_stamp = (temp_buffer == NULL) ? (time_t)0 : (time_t)strtoul(temp_buffer + 1, NULL, 10); if(time_stamp < t1 || time_stamp > t2) continue; /* host alerts */ if(strstr(input, "HOST ALERT:")) { /* get host name */ temp_buffer = my_strtok(NULL, ":"); temp_buffer = my_strtok(NULL, ";"); strncpy(entry_host_name, (temp_buffer == NULL) ? "" : temp_buffer + 1, sizeof(entry_host_name)); entry_host_name[sizeof(entry_host_name) - 1] = '\x0'; /* state type */ if(strstr(input, ";SOFT;")) state_type = AE_SOFT_STATE; else state_type = AE_HARD_STATE; /* get the plugin output */ temp_buffer = my_strtok(NULL, ";"); temp_buffer = my_strtok(NULL, ";"); temp_buffer = my_strtok(NULL, ";"); plugin_output = my_strtok(NULL, "\n"); /* state */ if(strstr(input, ";DOWN;")) state = AE_HOST_DOWN; else if(strstr(input, ";UNREACHABLE;")) state = AE_HOST_UNREACHABLE; else if(strstr(input, ";RECOVERY") || strstr(input, ";UP;")) state = AE_HOST_UP; else continue; add_archived_event(AE_HOST_ALERT, time_stamp, state, state_type, entry_host_name, NULL, plugin_output); } /* service alerts */ if(strstr(input, "SERVICE ALERT:")) { /* get host name */ temp_buffer = my_strtok(NULL, ":"); temp_buffer = my_strtok(NULL, ";"); strncpy(entry_host_name, (temp_buffer == NULL) ? "" : temp_buffer + 1, sizeof(entry_host_name)); entry_host_name[sizeof(entry_host_name) - 1] = '\x0'; /* get service description */ temp_buffer = my_strtok(NULL, ";"); strncpy(entry_svc_description, (temp_buffer == NULL) ? "" : temp_buffer, sizeof(entry_svc_description)); entry_svc_description[sizeof(entry_svc_description) - 1] = '\x0'; /* state type */ if(strstr(input, ";SOFT;")) state_type = AE_SOFT_STATE; else state_type = AE_HARD_STATE; /* get the plugin output */ temp_buffer = my_strtok(NULL, ";"); temp_buffer = my_strtok(NULL, ";"); temp_buffer = my_strtok(NULL, ";"); plugin_output = my_strtok(NULL, "\n"); /* state */ if(strstr(input, ";WARNING;")) state = AE_SERVICE_WARNING; else if(strstr(input, ";UNKNOWN;")) state = AE_SERVICE_UNKNOWN; else if(strstr(input, ";CRITICAL;")) state = AE_SERVICE_CRITICAL; else if(strstr(input, ";RECOVERY") || strstr(input, ";OK;")) state = AE_SERVICE_OK; else continue; add_archived_event(AE_SERVICE_ALERT, time_stamp, state, state_type, entry_host_name, entry_svc_description, plugin_output); } } /* free memory and close the file */ free(input); free(input2); mmap_fclose(thefile); return; } void convert_timeperiod_to_times(int type) { time_t current_time; struct tm *t; /* get the current time */ time(¤t_time); t = localtime(¤t_time); t->tm_sec = 0; t->tm_min = 0; t->tm_hour = 0; t->tm_isdst = -1; switch(type) { case TIMEPERIOD_LAST24HOURS: t1 = current_time - (60 * 60 * 24); t2 = current_time; break; case TIMEPERIOD_TODAY: t1 = mktime(t); t2 = current_time; break; case TIMEPERIOD_YESTERDAY: t1 = (time_t)(mktime(t) - (60 * 60 * 24)); t2 = (time_t)mktime(t); break; case TIMEPERIOD_THISWEEK: t1 = (time_t)(mktime(t) - (60 * 60 * 24 * t->tm_wday)); t2 = current_time; break; case TIMEPERIOD_LASTWEEK: t1 = (time_t)(mktime(t) - (60 * 60 * 24 * t->tm_wday) - (60 * 60 * 24 * 7)); t2 = (time_t)(mktime(t) - (60 * 60 * 24 * t->tm_wday)); break; case TIMEPERIOD_THISMONTH: t->tm_mday = 1; t1 = mktime(t); t2 = current_time; break; case TIMEPERIOD_LASTMONTH: t->tm_mday = 1; t2 = mktime(t); if(t->tm_mon == 0) { t->tm_mon = 11; t->tm_year--; } else t->tm_mon--; t1 = mktime(t); break; case TIMEPERIOD_THISQUARTER: /* not implemented */ break; case TIMEPERIOD_LASTQUARTER: /* not implemented */ break; case TIMEPERIOD_THISYEAR: t->tm_mon = 0; t->tm_mday = 1; t1 = mktime(t); t2 = current_time; break; case TIMEPERIOD_LASTYEAR: t->tm_mon = 0; t->tm_mday = 1; t2 = mktime(t); t->tm_year--; t1 = mktime(t); break; case TIMEPERIOD_LAST7DAYS: t2 = current_time; t1 = current_time - (7 * 24 * 60 * 60); break; case TIMEPERIOD_LAST31DAYS: t2 = current_time; t1 = current_time - (31 * 24 * 60 * 60); break; default: break; } return; } void compute_report_times(void) { time_t current_time; struct tm *st; struct tm *et; /* get the current time */ time(¤t_time); st = localtime(¤t_time); st->tm_sec = start_second; st->tm_min = start_minute; st->tm_hour = start_hour; st->tm_mday = start_day; st->tm_mon = start_month - 1; st->tm_year = start_year - 1900; st->tm_isdst = -1; t1 = mktime(st); et = localtime(¤t_time); et->tm_sec = end_second; et->tm_min = end_minute; et->tm_hour = end_hour; et->tm_mday = end_day; et->tm_mon = end_month - 1; et->tm_year = end_year - 1900; et->tm_isdst = -1; t2 = mktime(et); } void free_event_list(void) { archived_event *this_event = NULL; archived_event *next_event = NULL; for(this_event = event_list; this_event != NULL;) { next_event = this_event->next; if(this_event->host_name != NULL) free(this_event->host_name); if(this_event->service_description != NULL) free(this_event->service_description); if(this_event->event_info != NULL) free(this_event->event_info); free(this_event); this_event = next_event; } event_list = NULL; return; } /* adds an archived event entry to the list in memory */ void add_archived_event(int event_type, time_t time_stamp, int entry_type, int state_type, char *host_name, char *svc_description, char *event_info) { archived_event *last_event = NULL; archived_event *temp_event = NULL; archived_event *new_event = NULL; service *temp_service = NULL; host *temp_host; /* check timestamp sanity */ if(time_stamp < t1 || time_stamp > t2) return; /* check alert type (host or service alert) */ if(!(alert_types & event_type)) return; /* check state type (soft or hard state) */ if(!(state_types & state_type)) return; /* check state (host or service state) */ if(event_type == AE_HOST_ALERT) { if(!(host_states & entry_type)) return; } else { if(!(service_states & entry_type)) return; } /* find the host this entry is associated with */ temp_host = find_host(host_name); /* check hostgroup match (valid filter for all reports) */ if(show_all_hostgroups == FALSE && is_host_member_of_hostgroup(target_hostgroup, temp_host) == FALSE) return; /* check host match (valid filter for some reports) */ if(show_all_hosts == FALSE && (display_type == REPORT_RECENT_ALERTS || display_type == REPORT_HOST_ALERT_TOTALS || display_type == REPORT_SERVICE_ALERT_TOTALS)) { if(target_host == NULL || temp_host == NULL) return; if(strcmp(target_host->name, temp_host->name)) return; } /* check servicegroup math (valid filter for all reports) */ if(event_type == AE_SERVICE_ALERT) { temp_service = find_service(host_name, svc_description); if(show_all_servicegroups == FALSE && is_service_member_of_servicegroup(target_servicegroup, temp_service) == FALSE) return; } else { if(show_all_servicegroups == FALSE && is_host_member_of_servicegroup(target_servicegroup, temp_host) == FALSE) return; } /* check authorization */ if(event_type == AE_SERVICE_ALERT) { if(is_authorized_for_service(temp_service, ¤t_authdata) == FALSE) return; } else { if(is_authorized_for_host(temp_host, ¤t_authdata) == FALSE) return; } #ifdef DEBUG if(event_type == AE_HOST_ALERT) printf("Adding host alert (%s) @ %llu
    \n", host_name, (unsigned long long)time_stamp); else printf("Adding service alert (%s/%s) @ %llu
    \n", host_name, svc_description, (unsigned long long)time_stamp); #endif /* allocate memory for the new entry */ new_event = (archived_event *)malloc(sizeof(archived_event)); if(new_event == NULL) return; /* allocate memory for the host name */ if(host_name != NULL) { new_event->host_name = (char *)malloc(strlen(host_name) + 1); if(new_event->host_name != NULL) strcpy(new_event->host_name, host_name); } else new_event->host_name = NULL; /* allocate memory for the service description */ if(svc_description != NULL) { new_event->service_description = (char *)malloc(strlen(svc_description) + 1); if(new_event->service_description != NULL) strcpy(new_event->service_description, svc_description); } else new_event->service_description = NULL; /* allocate memory for the event info */ if(event_info != NULL) { new_event->event_info = (char *)malloc(strlen(event_info) + 1); if(new_event->event_info != NULL) strcpy(new_event->event_info, event_info); } else new_event->event_info = NULL; new_event->event_type = event_type; new_event->time_stamp = time_stamp; new_event->entry_type = entry_type; new_event->state_type = state_type; /* add the new entry to the list in memory, sorted by time */ last_event = event_list; for(temp_event = event_list; temp_event != NULL; temp_event = temp_event->next) { if(new_event->time_stamp >= temp_event->time_stamp) { new_event->next = temp_event; if(temp_event == event_list) event_list = new_event; else last_event->next = new_event; break; } else last_event = temp_event; } if(event_list == NULL) { new_event->next = NULL; event_list = new_event; } else if(temp_event == NULL) { new_event->next = NULL; last_event->next = new_event; } total_items++; return; } /* determines standard report options */ void determine_standard_report_options(void) { /* report over last 7 days */ convert_timeperiod_to_times(TIMEPERIOD_LAST7DAYS); compute_time_from_parts = FALSE; /* common options */ state_types = AE_HARD_STATE; item_limit = 25; /* report-specific options */ switch(standard_report) { case SREPORT_RECENT_ALERTS: display_type = REPORT_RECENT_ALERTS; alert_types = AE_HOST_ALERT + AE_SERVICE_ALERT; host_states = AE_HOST_UP + AE_HOST_DOWN + AE_HOST_UNREACHABLE; service_states = AE_SERVICE_OK + AE_SERVICE_WARNING + AE_SERVICE_UNKNOWN + AE_SERVICE_CRITICAL; break; case SREPORT_RECENT_HOST_ALERTS: display_type = REPORT_RECENT_ALERTS; alert_types = AE_HOST_ALERT; host_states = AE_HOST_UP + AE_HOST_DOWN + AE_HOST_UNREACHABLE; break; case SREPORT_RECENT_SERVICE_ALERTS: display_type = REPORT_RECENT_ALERTS; alert_types = AE_SERVICE_ALERT; service_states = AE_SERVICE_OK + AE_SERVICE_WARNING + AE_SERVICE_UNKNOWN + AE_SERVICE_CRITICAL; break; case SREPORT_TOP_HOST_ALERTS: display_type = REPORT_TOP_ALERTS; alert_types = AE_HOST_ALERT; host_states = AE_HOST_UP + AE_HOST_DOWN + AE_HOST_UNREACHABLE; break; case SREPORT_TOP_SERVICE_ALERTS: display_type = REPORT_TOP_ALERTS; alert_types = AE_SERVICE_ALERT; service_states = AE_SERVICE_OK + AE_SERVICE_WARNING + AE_SERVICE_UNKNOWN + AE_SERVICE_CRITICAL; break; default: break; } return; } /* displays report */ void display_report(void) { switch(display_type) { case REPORT_ALERT_TOTALS: display_alert_totals(); break; case REPORT_HOSTGROUP_ALERT_TOTALS: display_hostgroup_alert_totals(); break; case REPORT_HOST_ALERT_TOTALS: display_host_alert_totals(); break; case REPORT_SERVICEGROUP_ALERT_TOTALS: display_servicegroup_alert_totals(); break; case REPORT_SERVICE_ALERT_TOTALS: display_service_alert_totals(); break; case REPORT_TOP_ALERTS: display_top_alerts(); break; default: display_recent_alerts(); break; } return; } /* displays recent alerts */ void display_recent_alerts(void) { archived_event *temp_event; int current_item = 0; int odd = 0; const char *bgclass = ""; const char *status_bgclass = ""; const char *status = ""; char date_time[MAX_DATETIME_LENGTH]; printf("
    \n"); if(item_limit <= 0 || total_items <= item_limit || total_items == 0) printf("
    Displaying all %d matching alerts\n", total_items); else printf("
    Displaying most recent %d of %d total matching alerts\n", item_limit, total_items); printf("
    \n"); printf("\n"); printf("\n"); for(temp_event = event_list; temp_event != NULL; temp_event = temp_event->next, current_item++) { if(current_item >= item_limit && item_limit > 0) break; if(odd) { odd = 0; bgclass = "Odd"; } else { odd = 1; bgclass = "Even"; } printf("", bgclass); get_time_string(&temp_event->time_stamp, date_time, (int)sizeof(date_time), SHORT_DATE_TIME); printf("", bgclass, date_time); printf("", bgclass, (temp_event->event_type == AE_HOST_ALERT) ? "Host Alert" : "Service Alert"); printf("", bgclass, EXTINFO_CGI, DISPLAY_HOST_INFO, url_encode(temp_event->host_name), temp_event->host_name); if(temp_event->event_type == AE_HOST_ALERT) printf("", bgclass); else { printf("", url_encode(temp_event->service_description), temp_event->service_description); } switch(temp_event->entry_type) { case AE_HOST_UP: status_bgclass = "hostUP"; status = "UP"; break; case AE_HOST_DOWN: status_bgclass = "hostDOWN"; status = "DOWN"; break; case AE_HOST_UNREACHABLE: status_bgclass = "hostUNREACHABLE"; status = "UNREACHABLE"; break; case AE_SERVICE_OK: status_bgclass = "serviceOK"; status = "OK"; break; case AE_SERVICE_WARNING: status_bgclass = "serviceWARNING"; status = "WARNING"; break; case AE_SERVICE_UNKNOWN: status_bgclass = "serviceUNKNOWN"; status = "UNKNOWN"; break; case AE_SERVICE_CRITICAL: status_bgclass = "serviceCRITICAL"; status = "CRITICAL"; break; default: status_bgclass = bgclass; status = "???"; break; } printf("", status_bgclass, status); printf("", bgclass, (temp_event->state_type == AE_SOFT_STATE) ? "SOFT" : "HARD"); printf("", bgclass, temp_event->event_info); printf("\n"); } printf("
    TimeAlert TypeHostServiceStateState TypeInformation
    %s%s%sN/A%s%s%s%s
    \n"); printf("
    \n"); return; } /* displays alerts totals */ void display_alert_totals(void) { int hard_host_up_alerts = 0; int soft_host_up_alerts = 0; int hard_host_down_alerts = 0; int soft_host_down_alerts = 0; int hard_host_unreachable_alerts = 0; int soft_host_unreachable_alerts = 0; int hard_service_ok_alerts = 0; int soft_service_ok_alerts = 0; int hard_service_warning_alerts = 0; int soft_service_warning_alerts = 0; int hard_service_unknown_alerts = 0; int soft_service_unknown_alerts = 0; int hard_service_critical_alerts = 0; int soft_service_critical_alerts = 0; archived_event *temp_event; /************************/ /**** OVERALL TOTALS ****/ /************************/ /* process all events */ for(temp_event = event_list; temp_event != NULL; temp_event = temp_event->next) { /* host alerts */ if(temp_event->event_type == AE_HOST_ALERT) { if(temp_event->state_type == AE_SOFT_STATE) { if(temp_event->entry_type == AE_HOST_UP) soft_host_up_alerts++; else if(temp_event->entry_type == AE_HOST_DOWN) soft_host_down_alerts++; else if(temp_event->entry_type == AE_HOST_UNREACHABLE) soft_host_unreachable_alerts++; } else { if(temp_event->entry_type == AE_HOST_UP) hard_host_up_alerts++; else if(temp_event->entry_type == AE_HOST_DOWN) hard_host_down_alerts++; else if(temp_event->entry_type == AE_HOST_UNREACHABLE) hard_host_unreachable_alerts++; } } /* service alerts */ else { if(temp_event->state_type == AE_SOFT_STATE) { if(temp_event->entry_type == AE_SERVICE_OK) soft_service_ok_alerts++; else if(temp_event->entry_type == AE_SERVICE_WARNING) soft_service_warning_alerts++; else if(temp_event->entry_type == AE_SERVICE_UNKNOWN) soft_service_unknown_alerts++; else if(temp_event->entry_type == AE_SERVICE_CRITICAL) soft_service_critical_alerts++; } else { if(temp_event->entry_type == AE_SERVICE_OK) hard_service_ok_alerts++; else if(temp_event->entry_type == AE_SERVICE_WARNING) hard_service_warning_alerts++; else if(temp_event->entry_type == AE_SERVICE_UNKNOWN) hard_service_unknown_alerts++; else if(temp_event->entry_type == AE_SERVICE_CRITICAL) hard_service_critical_alerts++; } } } printf("
    \n"); printf("
    \n"); printf("
    Overall Totals
    \n"); printf("
    \n"); printf("
    \n"); printf("\n"); printf("\n"); if(alert_types & AE_HOST_ALERT) { printf("\n"); } if(alert_types & AE_SERVICE_ALERT) { printf("\n"); } printf("\n"); printf("
    \n"); printf("
    Host Alerts
    \n"); printf("
    \n"); printf("\n"); printf("\n"); printf("\n", soft_host_up_alerts, hard_host_up_alerts, soft_host_up_alerts + hard_host_up_alerts); printf("\n", soft_host_down_alerts, hard_host_down_alerts, soft_host_down_alerts + hard_host_down_alerts); printf("\n", soft_host_unreachable_alerts, hard_host_unreachable_alerts, soft_host_unreachable_alerts + hard_host_unreachable_alerts); printf("\n", soft_host_up_alerts + soft_host_down_alerts + soft_host_unreachable_alerts, hard_host_up_alerts + hard_host_down_alerts + hard_host_unreachable_alerts, soft_host_up_alerts + hard_host_up_alerts + soft_host_down_alerts + hard_host_down_alerts + soft_host_unreachable_alerts + hard_host_unreachable_alerts); printf("
    StateSoft AlertsHard AlertsTotal Alerts
    UP%d%d%d
    DOWN%d%d%d
    UNREACHABLE%d%d%d
    All States%d%d%d
    \n"); printf("
    \n"); printf("
    \n"); printf("
    Service Alerts
    \n"); printf("
    \n"); printf("\n"); printf("\n"); printf("\n", soft_service_ok_alerts, hard_service_ok_alerts, soft_service_ok_alerts + hard_service_ok_alerts); printf("\n", soft_service_warning_alerts, hard_service_warning_alerts, soft_service_warning_alerts + hard_service_warning_alerts); printf("\n", soft_service_unknown_alerts, hard_service_unknown_alerts, soft_service_unknown_alerts + hard_service_unknown_alerts); printf("\n", soft_service_critical_alerts, hard_service_critical_alerts, soft_service_critical_alerts + hard_service_critical_alerts); printf("\n", soft_service_ok_alerts + soft_service_warning_alerts + soft_service_unknown_alerts + soft_service_critical_alerts, hard_service_ok_alerts + hard_service_warning_alerts + hard_service_unknown_alerts + hard_service_critical_alerts, soft_service_ok_alerts + soft_service_warning_alerts + soft_service_unknown_alerts + soft_service_critical_alerts + hard_service_ok_alerts + hard_service_warning_alerts + hard_service_unknown_alerts + hard_service_critical_alerts); printf("
    StateSoft AlertsHard AlertsTotal Alerts
    OK%d%d%d
    WARNING%d%d%d
    UNKNOWN%d%d%d
    CRITICAL%d%d%d
    All States%d%d%d
    \n"); printf("
    \n"); printf("
    \n"); printf("
    \n"); printf("
    \n"); return; } /* displays hostgroup alert totals */ void display_hostgroup_alert_totals(void) { hostgroup *temp_hostgroup; /**************************/ /**** HOSTGROUP TOTALS ****/ /**************************/ printf("
    \n"); printf("
    \n"); printf("
    Totals By Hostgroup
    \n"); if(show_all_hostgroups == FALSE) display_specific_hostgroup_alert_totals(target_hostgroup); else { for(temp_hostgroup = hostgroup_list; temp_hostgroup != NULL; temp_hostgroup = temp_hostgroup->next) display_specific_hostgroup_alert_totals(temp_hostgroup); } printf("
    \n"); return; } /* displays alert totals for a specific hostgroup */ void display_specific_hostgroup_alert_totals(hostgroup *grp) { int hard_host_up_alerts = 0; int soft_host_up_alerts = 0; int hard_host_down_alerts = 0; int soft_host_down_alerts = 0; int hard_host_unreachable_alerts = 0; int soft_host_unreachable_alerts = 0; int hard_service_ok_alerts = 0; int soft_service_ok_alerts = 0; int hard_service_warning_alerts = 0; int soft_service_warning_alerts = 0; int hard_service_unknown_alerts = 0; int soft_service_unknown_alerts = 0; int hard_service_critical_alerts = 0; int soft_service_critical_alerts = 0; archived_event *temp_event; host *temp_host; if(grp == NULL) return; /* make sure the user is authorized to view this hostgroup */ if(is_authorized_for_hostgroup(grp, ¤t_authdata) == FALSE) return; /* process all events */ for(temp_event = event_list; temp_event != NULL; temp_event = temp_event->next) { temp_host = find_host(temp_event->host_name); if(is_host_member_of_hostgroup(grp, temp_host) == FALSE) continue; /* host alerts */ if(temp_event->event_type == AE_HOST_ALERT) { if(temp_event->state_type == AE_SOFT_STATE) { if(temp_event->entry_type == AE_HOST_UP) soft_host_up_alerts++; else if(temp_event->entry_type == AE_HOST_DOWN) soft_host_down_alerts++; else if(temp_event->entry_type == AE_HOST_UNREACHABLE) soft_host_unreachable_alerts++; } else { if(temp_event->entry_type == AE_HOST_UP) hard_host_up_alerts++; else if(temp_event->entry_type == AE_HOST_DOWN) hard_host_down_alerts++; else if(temp_event->entry_type == AE_HOST_UNREACHABLE) hard_host_unreachable_alerts++; } } /* service alerts */ else { if(temp_event->state_type == AE_SOFT_STATE) { if(temp_event->entry_type == AE_SERVICE_OK) soft_service_ok_alerts++; else if(temp_event->entry_type == AE_SERVICE_WARNING) soft_service_warning_alerts++; else if(temp_event->entry_type == AE_SERVICE_UNKNOWN) soft_service_unknown_alerts++; else if(temp_event->entry_type == AE_SERVICE_CRITICAL) soft_service_critical_alerts++; } else { if(temp_event->entry_type == AE_SERVICE_OK) hard_service_ok_alerts++; else if(temp_event->entry_type == AE_SERVICE_WARNING) hard_service_warning_alerts++; else if(temp_event->entry_type == AE_SERVICE_UNKNOWN) hard_service_unknown_alerts++; else if(temp_event->entry_type == AE_SERVICE_CRITICAL) hard_service_critical_alerts++; } } } printf("
    \n"); printf("
    \n"); printf("\n"); printf("\n", grp->group_name, grp->alias); printf("\n"); if(alert_types & AE_HOST_ALERT) { printf("\n"); } if(alert_types & AE_SERVICE_ALERT) { printf("\n"); } printf("\n"); printf("
    Hostgroup '%s' (%s)
    \n"); printf("
    Host Alerts
    \n"); printf("
    \n"); printf("\n"); printf("\n"); printf("\n", soft_host_up_alerts, hard_host_up_alerts, soft_host_up_alerts + hard_host_up_alerts); printf("\n", soft_host_down_alerts, hard_host_down_alerts, soft_host_down_alerts + hard_host_down_alerts); printf("\n", soft_host_unreachable_alerts, hard_host_unreachable_alerts, soft_host_unreachable_alerts + hard_host_unreachable_alerts); printf("\n", soft_host_up_alerts + soft_host_down_alerts + soft_host_unreachable_alerts, hard_host_up_alerts + hard_host_down_alerts + hard_host_unreachable_alerts, soft_host_up_alerts + hard_host_up_alerts + soft_host_down_alerts + hard_host_down_alerts + soft_host_unreachable_alerts + hard_host_unreachable_alerts); printf("
    StateSoft AlertsHard AlertsTotal Alerts
    UP%d%d%d
    DOWN%d%d%d
    UNREACHABLE%d%d%d
    All States%d%d%d
    \n"); printf("
    \n"); printf("
    \n"); printf("
    Service Alerts
    \n"); printf("
    \n"); printf("\n"); printf("\n"); printf("\n", soft_service_ok_alerts, hard_service_ok_alerts, soft_service_ok_alerts + hard_service_ok_alerts); printf("\n", soft_service_warning_alerts, hard_service_warning_alerts, soft_service_warning_alerts + hard_service_warning_alerts); printf("\n", soft_service_unknown_alerts, hard_service_unknown_alerts, soft_service_unknown_alerts + hard_service_unknown_alerts); printf("\n", soft_service_critical_alerts, hard_service_critical_alerts, soft_service_critical_alerts + hard_service_critical_alerts); printf("\n", soft_service_ok_alerts + soft_service_warning_alerts + soft_service_unknown_alerts + soft_service_critical_alerts, hard_service_ok_alerts + hard_service_warning_alerts + hard_service_unknown_alerts + hard_service_critical_alerts, soft_service_ok_alerts + soft_service_warning_alerts + soft_service_unknown_alerts + soft_service_critical_alerts + hard_service_ok_alerts + hard_service_warning_alerts + hard_service_unknown_alerts + hard_service_critical_alerts); printf("
    StateSoft AlertsHard AlertsTotal Alerts
    OK%d%d%d
    WARNING%d%d%d
    UNKNOWN%d%d%d
    CRITICAL%d%d%d
    All States%d%d%d
    \n"); printf("
    \n"); printf("
    \n"); printf("
    \n"); return; } /* displays host alert totals */ void display_host_alert_totals(void) { host *temp_host; /*********************/ /**** HOST TOTALS ****/ /*********************/ printf("
    \n"); printf("
    \n"); printf("
    Totals By Host
    \n"); if(show_all_hosts == FALSE) display_specific_host_alert_totals(target_host); else { for(temp_host = host_list; temp_host != NULL; temp_host = temp_host->next) display_specific_host_alert_totals(temp_host); } printf("
    \n"); return; } /* displays alert totals for a specific host */ void display_specific_host_alert_totals(host *hst) { int hard_host_up_alerts = 0; int soft_host_up_alerts = 0; int hard_host_down_alerts = 0; int soft_host_down_alerts = 0; int hard_host_unreachable_alerts = 0; int soft_host_unreachable_alerts = 0; int hard_service_ok_alerts = 0; int soft_service_ok_alerts = 0; int hard_service_warning_alerts = 0; int soft_service_warning_alerts = 0; int hard_service_unknown_alerts = 0; int soft_service_unknown_alerts = 0; int hard_service_critical_alerts = 0; int soft_service_critical_alerts = 0; archived_event *temp_event; if(hst == NULL) return; /* make sure the user is authorized to view this host */ if(is_authorized_for_host(hst, ¤t_authdata) == FALSE) return; if(show_all_hostgroups == FALSE && target_hostgroup != NULL) { if(is_host_member_of_hostgroup(target_hostgroup, hst) == FALSE) return; } /* process all events */ for(temp_event = event_list; temp_event != NULL; temp_event = temp_event->next) { if(strcmp(temp_event->host_name, hst->name)) continue; /* host alerts */ if(temp_event->event_type == AE_HOST_ALERT) { if(temp_event->state_type == AE_SOFT_STATE) { if(temp_event->entry_type == AE_HOST_UP) soft_host_up_alerts++; else if(temp_event->entry_type == AE_HOST_DOWN) soft_host_down_alerts++; else if(temp_event->entry_type == AE_HOST_UNREACHABLE) soft_host_unreachable_alerts++; } else { if(temp_event->entry_type == AE_HOST_UP) hard_host_up_alerts++; else if(temp_event->entry_type == AE_HOST_DOWN) hard_host_down_alerts++; else if(temp_event->entry_type == AE_HOST_UNREACHABLE) hard_host_unreachable_alerts++; } } /* service alerts */ else { if(temp_event->state_type == AE_SOFT_STATE) { if(temp_event->entry_type == AE_SERVICE_OK) soft_service_ok_alerts++; else if(temp_event->entry_type == AE_SERVICE_WARNING) soft_service_warning_alerts++; else if(temp_event->entry_type == AE_SERVICE_UNKNOWN) soft_service_unknown_alerts++; else if(temp_event->entry_type == AE_SERVICE_CRITICAL) soft_service_critical_alerts++; } else { if(temp_event->entry_type == AE_SERVICE_OK) hard_service_ok_alerts++; else if(temp_event->entry_type == AE_SERVICE_WARNING) hard_service_warning_alerts++; else if(temp_event->entry_type == AE_SERVICE_UNKNOWN) hard_service_unknown_alerts++; else if(temp_event->entry_type == AE_SERVICE_CRITICAL) hard_service_critical_alerts++; } } } printf("
    \n"); printf("
    \n"); printf("\n"); printf("\n", hst->name, hst->alias); printf("\n"); if(alert_types & AE_HOST_ALERT) { printf("\n"); } if(alert_types & AE_SERVICE_ALERT) { printf("\n"); } printf("\n"); printf("
    Host '%s' (%s)
    \n"); printf("
    Host Alerts
    \n"); printf("
    \n"); printf("\n"); printf("\n"); printf("\n", soft_host_up_alerts, hard_host_up_alerts, soft_host_up_alerts + hard_host_up_alerts); printf("\n", soft_host_down_alerts, hard_host_down_alerts, soft_host_down_alerts + hard_host_down_alerts); printf("\n", soft_host_unreachable_alerts, hard_host_unreachable_alerts, soft_host_unreachable_alerts + hard_host_unreachable_alerts); printf("\n", soft_host_up_alerts + soft_host_down_alerts + soft_host_unreachable_alerts, hard_host_up_alerts + hard_host_down_alerts + hard_host_unreachable_alerts, soft_host_up_alerts + hard_host_up_alerts + soft_host_down_alerts + hard_host_down_alerts + soft_host_unreachable_alerts + hard_host_unreachable_alerts); printf("
    StateSoft AlertsHard AlertsTotal Alerts
    UP%d%d%d
    DOWN%d%d%d
    UNREACHABLE%d%d%d
    All States%d%d%d
    \n"); printf("
    \n"); printf("
    \n"); printf("
    Service Alerts
    \n"); printf("
    \n"); printf("\n"); printf("\n"); printf("\n", soft_service_ok_alerts, hard_service_ok_alerts, soft_service_ok_alerts + hard_service_ok_alerts); printf("\n", soft_service_warning_alerts, hard_service_warning_alerts, soft_service_warning_alerts + hard_service_warning_alerts); printf("\n", soft_service_unknown_alerts, hard_service_unknown_alerts, soft_service_unknown_alerts + hard_service_unknown_alerts); printf("\n", soft_service_critical_alerts, hard_service_critical_alerts, soft_service_critical_alerts + hard_service_critical_alerts); printf("\n", soft_service_ok_alerts + soft_service_warning_alerts + soft_service_unknown_alerts + soft_service_critical_alerts, hard_service_ok_alerts + hard_service_warning_alerts + hard_service_unknown_alerts + hard_service_critical_alerts, soft_service_ok_alerts + soft_service_warning_alerts + soft_service_unknown_alerts + soft_service_critical_alerts + hard_service_ok_alerts + hard_service_warning_alerts + hard_service_unknown_alerts + hard_service_critical_alerts); printf("
    StateSoft AlertsHard AlertsTotal Alerts
    OK%d%d%d
    WARNING%d%d%d
    UNKNOWN%d%d%d
    CRITICAL%d%d%d
    All States%d%d%d
    \n"); printf("
    \n"); printf("
    \n"); printf("
    \n"); return; } /* displays servicegroup alert totals */ void display_servicegroup_alert_totals(void) { servicegroup *temp_servicegroup; /**************************/ /**** SERVICEGROUP TOTALS ****/ /**************************/ printf("
    \n"); printf("
    \n"); printf("
    Totals By Servicegroup
    \n"); if(show_all_servicegroups == FALSE) display_specific_servicegroup_alert_totals(target_servicegroup); else { for(temp_servicegroup = servicegroup_list; temp_servicegroup != NULL; temp_servicegroup = temp_servicegroup->next) display_specific_servicegroup_alert_totals(temp_servicegroup); } printf("
    \n"); return; } /* displays alert totals for a specific servicegroup */ void display_specific_servicegroup_alert_totals(servicegroup *grp) { int hard_host_up_alerts = 0; int soft_host_up_alerts = 0; int hard_host_down_alerts = 0; int soft_host_down_alerts = 0; int hard_host_unreachable_alerts = 0; int soft_host_unreachable_alerts = 0; int hard_service_ok_alerts = 0; int soft_service_ok_alerts = 0; int hard_service_warning_alerts = 0; int soft_service_warning_alerts = 0; int hard_service_unknown_alerts = 0; int soft_service_unknown_alerts = 0; int hard_service_critical_alerts = 0; int soft_service_critical_alerts = 0; archived_event *temp_event; host *temp_host; service *temp_service; if(grp == NULL) return; /* make sure the user is authorized to view this servicegroup */ if(is_authorized_for_servicegroup(grp, ¤t_authdata) == FALSE) return; /* process all events */ for(temp_event = event_list; temp_event != NULL; temp_event = temp_event->next) { if(temp_event->event_type == AE_HOST_ALERT) { temp_host = find_host(temp_event->host_name); if(is_host_member_of_servicegroup(grp, temp_host) == FALSE) continue; } else { temp_service = find_service(temp_event->host_name, temp_event->service_description); if(is_service_member_of_servicegroup(grp, temp_service) == FALSE) continue; } /* host alerts */ if(temp_event->event_type == AE_HOST_ALERT) { if(temp_event->state_type == AE_SOFT_STATE) { if(temp_event->entry_type == AE_HOST_UP) soft_host_up_alerts++; else if(temp_event->entry_type == AE_HOST_DOWN) soft_host_down_alerts++; else if(temp_event->entry_type == AE_HOST_UNREACHABLE) soft_host_unreachable_alerts++; } else { if(temp_event->entry_type == AE_HOST_UP) hard_host_up_alerts++; else if(temp_event->entry_type == AE_HOST_DOWN) hard_host_down_alerts++; else if(temp_event->entry_type == AE_HOST_UNREACHABLE) hard_host_unreachable_alerts++; } } /* service alerts */ else { if(temp_event->state_type == AE_SOFT_STATE) { if(temp_event->entry_type == AE_SERVICE_OK) soft_service_ok_alerts++; else if(temp_event->entry_type == AE_SERVICE_WARNING) soft_service_warning_alerts++; else if(temp_event->entry_type == AE_SERVICE_UNKNOWN) soft_service_unknown_alerts++; else if(temp_event->entry_type == AE_SERVICE_CRITICAL) soft_service_critical_alerts++; } else { if(temp_event->entry_type == AE_SERVICE_OK) hard_service_ok_alerts++; else if(temp_event->entry_type == AE_SERVICE_WARNING) hard_service_warning_alerts++; else if(temp_event->entry_type == AE_SERVICE_UNKNOWN) hard_service_unknown_alerts++; else if(temp_event->entry_type == AE_SERVICE_CRITICAL) hard_service_critical_alerts++; } } } printf("
    \n"); printf("
    \n"); printf("\n"); printf("\n", grp->group_name, grp->alias); printf("\n"); if(alert_types & AE_HOST_ALERT) { printf("\n"); } if(alert_types & AE_SERVICE_ALERT) { printf("\n"); } printf("\n"); printf("
    Servicegroup '%s' (%s)
    \n"); printf("
    Host Alerts
    \n"); printf("
    \n"); printf("\n"); printf("\n"); printf("\n", soft_host_up_alerts, hard_host_up_alerts, soft_host_up_alerts + hard_host_up_alerts); printf("\n", soft_host_down_alerts, hard_host_down_alerts, soft_host_down_alerts + hard_host_down_alerts); printf("\n", soft_host_unreachable_alerts, hard_host_unreachable_alerts, soft_host_unreachable_alerts + hard_host_unreachable_alerts); printf("\n", soft_host_up_alerts + soft_host_down_alerts + soft_host_unreachable_alerts, hard_host_up_alerts + hard_host_down_alerts + hard_host_unreachable_alerts, soft_host_up_alerts + hard_host_up_alerts + soft_host_down_alerts + hard_host_down_alerts + soft_host_unreachable_alerts + hard_host_unreachable_alerts); printf("
    StateSoft AlertsHard AlertsTotal Alerts
    UP%d%d%d
    DOWN%d%d%d
    UNREACHABLE%d%d%d
    All States%d%d%d
    \n"); printf("
    \n"); printf("
    \n"); printf("
    Service Alerts
    \n"); printf("
    \n"); printf("\n"); printf("\n"); printf("\n", soft_service_ok_alerts, hard_service_ok_alerts, soft_service_ok_alerts + hard_service_ok_alerts); printf("\n", soft_service_warning_alerts, hard_service_warning_alerts, soft_service_warning_alerts + hard_service_warning_alerts); printf("\n", soft_service_unknown_alerts, hard_service_unknown_alerts, soft_service_unknown_alerts + hard_service_unknown_alerts); printf("\n", soft_service_critical_alerts, hard_service_critical_alerts, soft_service_critical_alerts + hard_service_critical_alerts); printf("\n", soft_service_ok_alerts + soft_service_warning_alerts + soft_service_unknown_alerts + soft_service_critical_alerts, hard_service_ok_alerts + hard_service_warning_alerts + hard_service_unknown_alerts + hard_service_critical_alerts, soft_service_ok_alerts + soft_service_warning_alerts + soft_service_unknown_alerts + soft_service_critical_alerts + hard_service_ok_alerts + hard_service_warning_alerts + hard_service_unknown_alerts + hard_service_critical_alerts); printf("
    StateSoft AlertsHard AlertsTotal Alerts
    OK%d%d%d
    WARNING%d%d%d
    UNKNOWN%d%d%d
    CRITICAL%d%d%d
    All States%d%d%d
    \n"); printf("
    \n"); printf("
    \n"); printf("
    \n"); return; } /* displays service alert totals */ void display_service_alert_totals(void) { service *temp_service; /************************/ /**** SERVICE TOTALS ****/ /************************/ printf("
    \n"); printf("
    \n"); printf("
    Totals By Service
    \n"); for(temp_service = service_list; temp_service != NULL; temp_service = temp_service->next) display_specific_service_alert_totals(temp_service); printf("
    \n"); return; } /* displays alert totals for a specific service */ void display_specific_service_alert_totals(service *svc) { int hard_service_ok_alerts = 0; int soft_service_ok_alerts = 0; int hard_service_warning_alerts = 0; int soft_service_warning_alerts = 0; int hard_service_unknown_alerts = 0; int soft_service_unknown_alerts = 0; int hard_service_critical_alerts = 0; int soft_service_critical_alerts = 0; archived_event *temp_event; host *temp_host; if(svc == NULL) return; /* make sure the user is authorized to view this service */ if(is_authorized_for_service(svc, ¤t_authdata) == FALSE) return; if(show_all_hostgroups == FALSE && target_hostgroup != NULL) { temp_host = find_host(svc->host_name); if(is_host_member_of_hostgroup(target_hostgroup, temp_host) == FALSE) return; } if(show_all_hosts == FALSE && target_host != NULL) { if(strcmp(target_host->name, svc->host_name)) return; } /* process all events */ for(temp_event = event_list; temp_event != NULL; temp_event = temp_event->next) { if(temp_event->event_type != AE_SERVICE_ALERT) continue; if(strcmp(temp_event->host_name, svc->host_name) || strcmp(temp_event->service_description, svc->description)) continue; /* service alerts */ if(temp_event->state_type == AE_SOFT_STATE) { if(temp_event->entry_type == AE_SERVICE_OK) soft_service_ok_alerts++; else if(temp_event->entry_type == AE_SERVICE_WARNING) soft_service_warning_alerts++; else if(temp_event->entry_type == AE_SERVICE_UNKNOWN) soft_service_unknown_alerts++; else if(temp_event->entry_type == AE_SERVICE_CRITICAL) soft_service_critical_alerts++; } else { if(temp_event->entry_type == AE_SERVICE_OK) hard_service_ok_alerts++; else if(temp_event->entry_type == AE_SERVICE_WARNING) hard_service_warning_alerts++; else if(temp_event->entry_type == AE_SERVICE_UNKNOWN) hard_service_unknown_alerts++; else if(temp_event->entry_type == AE_SERVICE_CRITICAL) hard_service_critical_alerts++; } } printf("
    \n"); printf("
    \n"); printf("\n"); printf("\n", svc->description, svc->host_name); printf("\n"); if(alert_types & AE_SERVICE_ALERT) { printf("\n"); } printf("\n"); printf("
    Service '%s' on Host '%s'
    \n"); printf("
    Service Alerts
    \n"); printf("
    \n"); printf("\n"); printf("\n"); printf("\n", soft_service_ok_alerts, hard_service_ok_alerts, soft_service_ok_alerts + hard_service_ok_alerts); printf("\n", soft_service_warning_alerts, hard_service_warning_alerts, soft_service_warning_alerts + hard_service_warning_alerts); printf("\n", soft_service_unknown_alerts, hard_service_unknown_alerts, soft_service_unknown_alerts + hard_service_unknown_alerts); printf("\n", soft_service_critical_alerts, hard_service_critical_alerts, soft_service_critical_alerts + hard_service_critical_alerts); printf("\n", soft_service_ok_alerts + soft_service_warning_alerts + soft_service_unknown_alerts + soft_service_critical_alerts, hard_service_ok_alerts + hard_service_warning_alerts + hard_service_unknown_alerts + hard_service_critical_alerts, soft_service_ok_alerts + soft_service_warning_alerts + soft_service_unknown_alerts + soft_service_critical_alerts + hard_service_ok_alerts + hard_service_warning_alerts + hard_service_unknown_alerts + hard_service_critical_alerts); printf("
    StateSoft AlertsHard AlertsTotal Alerts
    OK%d%d%d
    WARNING%d%d%d
    UNKNOWN%d%d%d
    CRITICAL%d%d%d
    All States%d%d%d
    \n"); printf("
    \n"); printf("
    \n"); printf("
    \n"); return; } /* find a specific alert producer */ alert_producer *find_producer(int type, char *hname, char *sdesc) { alert_producer *temp_producer; for(temp_producer = producer_list; temp_producer != NULL; temp_producer = temp_producer->next) { if(temp_producer->producer_type != type) continue; if(hname != NULL && strcmp(hname, temp_producer->host_name)) continue; if(sdesc != NULL && strcmp(sdesc, temp_producer->service_description)) continue; return temp_producer; } return NULL; } /* adds a new producer to the list in memory */ alert_producer *add_producer(int producer_type, char *host_name, char *service_description) { alert_producer *new_producer = NULL; /* allocate memory for the new entry */ new_producer = (alert_producer *)malloc(sizeof(alert_producer)); if(new_producer == NULL) return NULL; /* allocate memory for the host name */ if(host_name != NULL) { new_producer->host_name = (char *)malloc(strlen(host_name) + 1); if(new_producer->host_name != NULL) strcpy(new_producer->host_name, host_name); } else new_producer->host_name = NULL; /* allocate memory for the service description */ if(service_description != NULL) { new_producer->service_description = (char *)malloc(strlen(service_description) + 1); if(new_producer->service_description != NULL) strcpy(new_producer->service_description, service_description); } else new_producer->service_description = NULL; new_producer->producer_type = producer_type; new_producer->total_alerts = 0; /* add the new entry to the list in memory, sorted by time */ new_producer->next = producer_list; producer_list = new_producer; return new_producer; } void free_producer_list(void) { alert_producer *this_producer = NULL; alert_producer *next_producer = NULL; for(this_producer = producer_list; this_producer != NULL;) { next_producer = this_producer->next; if(this_producer->host_name != NULL) free(this_producer->host_name); if(this_producer->service_description != NULL) free(this_producer->service_description); free(this_producer); this_producer = next_producer; } producer_list = NULL; return; } /* displays top alerts */ void display_top_alerts(void) { archived_event *temp_event = NULL; alert_producer *temp_producer = NULL; alert_producer *next_producer = NULL; alert_producer *last_producer = NULL; alert_producer *new_producer = NULL; alert_producer *temp_list = NULL; int producer_type = AE_HOST_PRODUCER; int current_item = 0; int odd = 0; const char *bgclass = ""; /* process all events */ for(temp_event = event_list; temp_event != NULL; temp_event = temp_event->next) { producer_type = (temp_event->event_type == AE_HOST_ALERT) ? AE_HOST_PRODUCER : AE_SERVICE_PRODUCER; /* see if we already have a record for the producer */ temp_producer = find_producer(producer_type, temp_event->host_name, temp_event->service_description); /* if not, add a record */ if(temp_producer == NULL) temp_producer = add_producer(producer_type, temp_event->host_name, temp_event->service_description); /* producer record could not be added */ if(temp_producer == NULL) continue; /* update stats for producer */ temp_producer->total_alerts++; } /* sort the producer list by total alerts (descending) */ total_items = 0; temp_list = NULL; for(new_producer = producer_list; new_producer != NULL;) { next_producer = new_producer->next; last_producer = temp_list; for(temp_producer = temp_list; temp_producer != NULL; temp_producer = temp_producer->next) { if(new_producer->total_alerts >= temp_producer->total_alerts) { new_producer->next = temp_producer; if(temp_producer == temp_list) temp_list = new_producer; else last_producer->next = new_producer; break; } else last_producer = temp_producer; } if(temp_list == NULL) { new_producer->next = NULL; temp_list = new_producer; } else if(temp_producer == NULL) { new_producer->next = NULL; last_producer->next = new_producer; } new_producer = next_producer; total_items++; } producer_list = temp_list; printf("
    \n"); if(item_limit <= 0 || total_items <= item_limit || total_items == 0) printf("
    Displaying all %d matching alert producers\n", total_items); else printf("
    Displaying top %d of %d total matching alert producers\n", item_limit, total_items); printf("
    \n"); printf("\n"); printf("\n"); /* display top producers */ for(temp_producer = producer_list; temp_producer != NULL; temp_producer = temp_producer->next) { if(current_item >= item_limit && item_limit > 0) break; current_item++; if(odd) { odd = 0; bgclass = "Odd"; } else { odd = 1; bgclass = "Even"; } printf("", bgclass); printf("", bgclass, current_item); printf("", bgclass, (temp_producer->producer_type == AE_HOST_PRODUCER) ? "Host" : "Service"); printf("", bgclass, EXTINFO_CGI, DISPLAY_HOST_INFO, url_encode(temp_producer->host_name), temp_producer->host_name); if(temp_producer->producer_type == AE_HOST_PRODUCER) printf("", bgclass); else { printf("", url_encode(temp_producer->service_description), temp_producer->service_description); } printf("", bgclass, temp_producer->total_alerts); printf("\n"); } printf("
    RankProducer TypeHostServiceTotal Alerts
    #%d%s%sN/A%s%d
    \n"); printf("
    \n"); return; } nagios-4.3.4/cgi/tac.c000066400000000000000000001630071314764422400144750ustar00rootroot00000000000000/*********************************************************************** * * TAC.C - Nagios Tactical Monitoring Overview CGI * * * This CGI program will display the contents of the Nagios * log file. * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ***********************************************************************/ #include "../include/config.h" #include "../include/common.h" #include "../include/objects.h" #include "../include/statusdata.h" #include "../include/getcgi.h" #include "../include/cgiutils.h" #include "../include/cgiauth.h" #define HEALTH_WARNING_PERCENTAGE 90 #define HEALTH_CRITICAL_PERCENTAGE 75 /* HOSTOUTAGE structure */ typedef struct hostoutage_struct { host *hst; int affected_child_hosts; struct hostoutage_struct *next; } hostoutage; extern char main_config_file[MAX_FILENAME_LENGTH]; extern char url_html_path[MAX_FILENAME_LENGTH]; extern char url_images_path[MAX_FILENAME_LENGTH]; extern char url_stylesheets_path[MAX_FILENAME_LENGTH]; extern char url_media_path[MAX_FILENAME_LENGTH]; extern char url_js_path[MAX_FILENAME_LENGTH]; extern int refresh_rate; extern int tac_cgi_hard_only; extern char *service_critical_sound; extern char *service_warning_sound; extern char *service_unknown_sound; extern char *host_down_sound; extern char *host_unreachable_sound; extern char *normal_sound; extern hoststatus *hoststatus_list; extern servicestatus *servicestatus_list; extern int nagios_process_state; void analyze_status_data(void); void display_tac_overview(void); void find_hosts_causing_outages(void); void calculate_outage_effect_of_host(host *, int *); int is_route_to_host_blocked(host *); int number_of_host_services(host *); void add_hostoutage(host *); void free_hostoutage_list(void); void document_header(int); void document_footer(void); int process_cgivars(void); authdata current_authdata; int embedded = FALSE; int display_header = FALSE; hostoutage *hostoutage_list = NULL; int total_blocking_outages = 0; int total_nonblocking_outages = 0; int total_service_health = 0; int total_host_health = 0; int potential_service_health = 0; int potential_host_health = 0; double percent_service_health = 0.0; double percent_host_health = 0.0; int total_hosts = 0; int total_services = 0; int total_active_service_checks = 0; int total_active_host_checks = 0; int total_passive_service_checks = 0; int total_passive_host_checks = 0; double min_service_execution_time = -1.0; double max_service_execution_time = -1.0; double total_service_execution_time = 0.0; double average_service_execution_time = -1.0; double min_host_execution_time = -1.0; double max_host_execution_time = -1.0; double total_host_execution_time = 0.0; double average_host_execution_time = -1.0; double min_service_latency = -1.0; double max_service_latency = -1.0; double total_service_latency = 0.0; double average_service_latency = -1.0; double min_host_latency = -1.0; double max_host_latency = -1.0; double total_host_latency = 0.0; double average_host_latency = -1.0; int flapping_services = 0; int flapping_hosts = 0; int flap_disabled_services = 0; int flap_disabled_hosts = 0; int notification_disabled_services = 0; int notification_disabled_hosts = 0; int event_handler_disabled_services = 0; int event_handler_disabled_hosts = 0; int active_checks_disabled_services = 0; int active_checks_disabled_hosts = 0; int passive_checks_disabled_services = 0; int passive_checks_disabled_hosts = 0; int hosts_pending = 0; int hosts_pending_disabled = 0; int hosts_up_disabled = 0; int hosts_up_unacknowledged = 0; int hosts_up = 0; int hosts_down_scheduled = 0; int hosts_down_acknowledged = 0; int hosts_down_disabled = 0; int hosts_down_unacknowledged = 0; int hosts_down = 0; int hosts_unreachable_scheduled = 0; int hosts_unreachable_acknowledged = 0; int hosts_unreachable_disabled = 0; int hosts_unreachable_unacknowledged = 0; int hosts_unreachable = 0; int services_pending = 0; int services_pending_disabled = 0; int services_ok_disabled = 0; int services_ok_unacknowledged = 0; int services_ok = 0; int services_warning_host_problem = 0; int services_warning_scheduled = 0; int services_warning_acknowledged = 0; int services_warning_disabled = 0; int services_warning_unacknowledged = 0; int services_warning = 0; int services_unknown_host_problem = 0; int services_unknown_scheduled = 0; int services_unknown_acknowledged = 0; int services_unknown_disabled = 0; int services_unknown_unacknowledged = 0; int services_unknown = 0; int services_critical_host_problem = 0; int services_critical_scheduled = 0; int services_critical_acknowledged = 0; int services_critical_disabled = 0; int services_critical_unacknowledged = 0; int services_critical = 0; /*efine DEBUG 1*/ int main(void) { char *sound = NULL; /* get the CGI variables passed in the URL */ process_cgivars(); /* reset internal variables */ reset_cgi_vars(); cgi_init(document_header, document_footer, READ_ALL_OBJECT_DATA, READ_ALL_STATUS_DATA); /* get authentication information */ get_authentication_information(¤t_authdata); document_header(TRUE); if(display_header == TRUE) { /* begin top table */ printf("\n"); printf("\n"); /* left column of top table - info box */ printf("\n"); /* middle column of top table - log file navigation options */ printf("\n"); /* right hand column of top row */ printf("\n"); /* end of top table */ printf("\n"); printf("
    \n"); display_info_table("Tactical Status Overview", TRUE, ¤t_authdata); printf("\n"); printf("\n"); printf("
    \n"); printf("

    \n"); } /* analyze current host and service status data for tac overview */ analyze_status_data(); /* find all hosts that are causing network outages */ find_hosts_causing_outages(); /* embed sound tag if necessary... */ if(hosts_unreachable_unacknowledged > 0 && host_unreachable_sound != NULL) sound = host_unreachable_sound; else if(hosts_down_unacknowledged > 0 && host_down_sound != NULL) sound = host_down_sound; else if(services_critical_unacknowledged > 0 && service_critical_sound != NULL) sound = service_critical_sound; else if(services_warning_unacknowledged > 0 && service_warning_sound != NULL) sound = service_warning_sound; else if(services_unknown_unacknowledged == 0 && services_warning_unacknowledged == 0 && services_critical_unacknowledged == 0 && hosts_down_unacknowledged == 0 && hosts_unreachable_unacknowledged == 0 && normal_sound != NULL) sound = normal_sound; if(sound != NULL) { printf("", url_media_path, sound); printf("", url_media_path, sound); printf(""); printf(""); printf(""); } /**** display main tac screen ****/ display_tac_overview(); document_footer(); /* free memory allocated to the host outage list */ free_hostoutage_list(); /* free allocated memory */ free_memory(); return OK; } void document_header(int use_stylesheet) { char date_time[MAX_DATETIME_LENGTH]; time_t current_time; time_t expire_time; printf("Cache-Control: no-store\r\n"); printf("Pragma: no-cache\r\n"); printf("Refresh: %d\r\n", refresh_rate); time(¤t_time); get_time_string(¤t_time, date_time, (int)sizeof(date_time), HTTP_DATE_TIME); printf("Last-Modified: %s\r\n", date_time); expire_time = (time_t)0L; get_time_string(&expire_time, date_time, (int)sizeof(date_time), HTTP_DATE_TIME); printf("Expires: %s\r\n", date_time); printf("Content-type: text/html; charset=utf-8\r\n\r\n"); if(embedded == TRUE) return; printf("\n"); printf("\n"); printf("\n", url_images_path); printf("\n"); printf("Nagios Tactical Monitoring Overview\n"); printf("\n"); if(use_stylesheet == TRUE) { printf("\n", url_stylesheets_path, COMMON_CSS); printf("\n", url_stylesheets_path, TAC_CSS); printf("\n", url_stylesheets_path, NAGFUNCS_CSS); } printf("\n", url_js_path, JQUERY_JS); printf("\n", url_js_path, NAGFUNCS_JS); printf("\n"); printf("\n"); printf("\n"); /* include user SSI header */ include_ssi_files(TAC_CGI, SSI_HEADER); return; } void document_footer(void) { if(embedded == TRUE) return; /* include user SSI footer */ include_ssi_files(TAC_CGI, SSI_FOOTER); printf("\n"); printf("\n"); return; } int process_cgivars(void) { char **variables; int error = FALSE; int x; variables = getcgivars(); for(x = 0; variables[x] != NULL; x++) { /* do some basic length checking on the variable identifier to prevent buffer overflows */ if(strlen(variables[x]) >= MAX_INPUT_BUFFER - 1) { continue; } /* we found the embed option */ else if(!strcmp(variables[x], "embedded")) embedded = TRUE; /* we found the noheader option */ else if(!strcmp(variables[x], "noheader")) display_header = FALSE; /* we received an invalid argument */ else error = TRUE; } /* free memory allocated to the CGI variables */ free_cgivars(variables); return error; } void analyze_status_data(void) { servicestatus *temp_servicestatus; service *temp_service; hoststatus *temp_hoststatus; host *temp_host; int problem = TRUE; /* check all services */ for(temp_servicestatus = servicestatus_list; temp_servicestatus != NULL; temp_servicestatus = temp_servicestatus->next) { /* see if user is authorized to view this service */ temp_service = find_service(temp_servicestatus->host_name, temp_servicestatus->description); if(is_authorized_for_service(temp_service, ¤t_authdata) == FALSE) continue; /******** CHECK FEATURES *******/ /* check flapping */ if(temp_servicestatus->flap_detection_enabled == FALSE) flap_disabled_services++; else if(temp_servicestatus->is_flapping == TRUE) flapping_services++; /* check notifications */ if(temp_servicestatus->notifications_enabled == FALSE) notification_disabled_services++; /* check event handler */ if(temp_servicestatus->event_handler_enabled == FALSE) event_handler_disabled_services++; /* active check execution */ if(temp_servicestatus->checks_enabled == FALSE) active_checks_disabled_services++; /* passive check acceptance */ if(temp_servicestatus->accept_passive_checks == FALSE) passive_checks_disabled_services++; /********* CHECK STATUS ********/ problem = TRUE; if(temp_servicestatus->status == SERVICE_OK) { if(temp_servicestatus->checks_enabled == FALSE) services_ok_disabled++; else services_ok_unacknowledged++; services_ok++; } else if(temp_servicestatus->status == SERVICE_WARNING) { temp_hoststatus = find_hoststatus(temp_servicestatus->host_name); if(temp_hoststatus != NULL && (temp_hoststatus->status == SD_HOST_DOWN || temp_hoststatus->status == SD_HOST_UNREACHABLE)) { services_warning_host_problem++; problem = FALSE; } if(temp_servicestatus->scheduled_downtime_depth > 0) { services_warning_scheduled++; problem = FALSE; } if(temp_servicestatus->problem_has_been_acknowledged == TRUE) { services_warning_acknowledged++; problem = FALSE; } if(temp_servicestatus->checks_enabled == FALSE) { services_warning_disabled++; problem = FALSE; } if(problem == TRUE) { if (temp_servicestatus->state_type == HARD_STATE || tac_cgi_hard_only == FALSE) services_warning_unacknowledged++; } services_warning++; } else if(temp_servicestatus->status == SERVICE_UNKNOWN) { temp_hoststatus = find_hoststatus(temp_servicestatus->host_name); if(temp_hoststatus != NULL && (temp_hoststatus->status == SD_HOST_DOWN || temp_hoststatus->status == SD_HOST_UNREACHABLE)) { services_unknown_host_problem++; problem = FALSE; } if(temp_servicestatus->scheduled_downtime_depth > 0) { services_unknown_scheduled++; problem = FALSE; } if(temp_servicestatus->problem_has_been_acknowledged == TRUE) { services_unknown_acknowledged++; problem = FALSE; } if(temp_servicestatus->checks_enabled == FALSE) { services_unknown_disabled++; problem = FALSE; } if(problem == TRUE) { if (temp_servicestatus->state_type == HARD_STATE || tac_cgi_hard_only == FALSE) services_unknown_unacknowledged++; } services_unknown++; } else if(temp_servicestatus->status == SERVICE_CRITICAL) { temp_hoststatus = find_hoststatus(temp_servicestatus->host_name); if(temp_hoststatus != NULL && (temp_hoststatus->status == SD_HOST_DOWN || temp_hoststatus->status == SD_HOST_UNREACHABLE)) { services_critical_host_problem++; problem = FALSE; } if(temp_servicestatus->scheduled_downtime_depth > 0) { services_critical_scheduled++; problem = FALSE; } if(temp_servicestatus->problem_has_been_acknowledged == TRUE) { services_critical_acknowledged++; problem = FALSE; } if(temp_servicestatus->checks_enabled == FALSE) { services_critical_disabled++; problem = FALSE; } if(problem == TRUE) { if (temp_servicestatus->state_type == HARD_STATE || tac_cgi_hard_only == FALSE) services_critical_unacknowledged++; } services_critical++; } else if(temp_servicestatus->status == SERVICE_PENDING) { if(temp_servicestatus->checks_enabled == FALSE) services_pending_disabled++; services_pending++; } /* get health stats */ if(temp_servicestatus->status == SERVICE_OK) total_service_health += 2; else if(temp_servicestatus->status == SERVICE_WARNING || temp_servicestatus->status == SERVICE_UNKNOWN) total_service_health++; if(temp_servicestatus->status != SERVICE_PENDING) potential_service_health += 2; /* calculate execution time and latency stats */ if(temp_servicestatus->check_type == CHECK_TYPE_ACTIVE) { total_active_service_checks++; if(min_service_latency == -1.0 || temp_servicestatus->latency < min_service_latency) min_service_latency = temp_servicestatus->latency; if(max_service_latency == -1.0 || temp_servicestatus->latency > max_service_latency) max_service_latency = temp_servicestatus->latency; if(min_service_execution_time == -1.0 || temp_servicestatus->execution_time < min_service_execution_time) min_service_execution_time = temp_servicestatus->execution_time; if(max_service_execution_time == -1.0 || temp_servicestatus->execution_time > max_service_execution_time) max_service_execution_time = temp_servicestatus->execution_time; total_service_latency += temp_servicestatus->latency; total_service_execution_time += temp_servicestatus->execution_time; } else total_passive_service_checks++; total_services++; } /* check all hosts */ for(temp_hoststatus = hoststatus_list; temp_hoststatus != NULL; temp_hoststatus = temp_hoststatus->next) { /* see if user is authorized to view this host */ temp_host = find_host(temp_hoststatus->host_name); if(is_authorized_for_host(temp_host, ¤t_authdata) == FALSE) continue; /******** CHECK FEATURES *******/ /* check flapping */ if(temp_hoststatus->flap_detection_enabled == FALSE) flap_disabled_hosts++; else if(temp_hoststatus->is_flapping == TRUE) flapping_hosts++; /* check notifications */ if(temp_hoststatus->notifications_enabled == FALSE) notification_disabled_hosts++; /* check event handler */ if(temp_hoststatus->event_handler_enabled == FALSE) event_handler_disabled_hosts++; /* active check execution */ if(temp_hoststatus->checks_enabled == FALSE) active_checks_disabled_hosts++; /* passive check acceptance */ if(temp_hoststatus->accept_passive_checks == FALSE) passive_checks_disabled_hosts++; /********* CHECK STATUS ********/ problem = TRUE; if(temp_hoststatus->status == SD_HOST_UP) { if(temp_hoststatus->checks_enabled == FALSE) hosts_up_disabled++; else hosts_up_unacknowledged++; hosts_up++; } else if(temp_hoststatus->status == SD_HOST_DOWN) { if(temp_hoststatus->scheduled_downtime_depth > 0) { hosts_down_scheduled++; problem = FALSE; } if(temp_hoststatus->problem_has_been_acknowledged == TRUE) { hosts_down_acknowledged++; problem = FALSE; } if(temp_hoststatus->checks_enabled == FALSE) { hosts_down_disabled++; problem = FALSE; } if(problem == TRUE) { if (temp_hoststatus->state_type == HARD_STATE || tac_cgi_hard_only == FALSE) hosts_down_unacknowledged++; } hosts_down++; } else if(temp_hoststatus->status == SD_HOST_UNREACHABLE) { if(temp_hoststatus->scheduled_downtime_depth > 0) { hosts_unreachable_scheduled++; problem = FALSE; } if(temp_hoststatus->problem_has_been_acknowledged == TRUE) { hosts_unreachable_acknowledged++; problem = FALSE; } if(temp_hoststatus->checks_enabled == FALSE) { hosts_unreachable_disabled++; problem = FALSE; } if(problem == TRUE) { if (temp_hoststatus->state_type == HARD_STATE || tac_cgi_hard_only == FALSE) hosts_unreachable_unacknowledged++; } hosts_unreachable++; } else if(temp_hoststatus->status == HOST_PENDING) { if(temp_hoststatus->checks_enabled == FALSE) hosts_pending_disabled++; hosts_pending++; } /* get health stats */ if(temp_hoststatus->status == SD_HOST_UP) total_host_health++; if(temp_hoststatus->status != HOST_PENDING) potential_host_health++; /* check type stats */ if(temp_hoststatus->check_type == CHECK_TYPE_ACTIVE) { total_active_host_checks++; if(min_host_latency == -1.0 || temp_hoststatus->latency < min_host_latency) min_host_latency = temp_hoststatus->latency; if(max_host_latency == -1.0 || temp_hoststatus->latency > max_host_latency) max_host_latency = temp_hoststatus->latency; if(min_host_execution_time == -1.0 || temp_hoststatus->execution_time < min_host_execution_time) min_host_execution_time = temp_hoststatus->execution_time; if(max_host_execution_time == -1.0 || temp_hoststatus->execution_time > max_host_execution_time) max_host_execution_time = temp_hoststatus->execution_time; total_host_latency += temp_hoststatus->latency; total_host_execution_time += temp_hoststatus->execution_time; } else total_passive_host_checks++; total_hosts++; } /* calculate service health */ if(potential_service_health == 0) percent_service_health = 0.0; else percent_service_health = ((double)total_service_health / (double)potential_service_health) * 100.0; /* calculate host health */ if(potential_host_health == 0) percent_host_health = 0.0; else percent_host_health = ((double)total_host_health / (double)potential_host_health) * 100.0; /* calculate service latency */ if(total_service_latency == 0L) average_service_latency = 0.0; else average_service_latency = ((double)total_service_latency / (double)total_active_service_checks); /* calculate host latency */ if(total_host_latency == 0L) average_host_latency = 0.0; else average_host_latency = ((double)total_host_latency / (double)total_active_host_checks); /* calculate service execution time */ if(total_service_execution_time == 0.0) average_service_execution_time = 0.0; else average_service_execution_time = ((double)total_service_execution_time / (double)total_active_service_checks); /* calculate host execution time */ if(total_host_execution_time == 0.0) average_host_execution_time = 0.0; else average_host_execution_time = ((double)total_host_execution_time / (double)total_active_host_checks); return; } /* determine what hosts are causing network outages */ void find_hosts_causing_outages(void) { hoststatus *temp_hoststatus; hostoutage *temp_hostoutage; host *temp_host; /* user must be authorized for all hosts in order to see outages */ if(is_authorized_for_all_hosts(¤t_authdata) == FALSE) return; /* check all hosts */ for(temp_hoststatus = hoststatus_list; temp_hoststatus != NULL; temp_hoststatus = temp_hoststatus->next) { /* check only hosts that are not up and not pending */ if(temp_hoststatus->status != SD_HOST_UP && temp_hoststatus->status != HOST_PENDING) { /* find the host entry */ temp_host = find_host(temp_hoststatus->host_name); if(temp_host == NULL) continue; /* if the route to this host is not blocked, it is a causing an outage */ if(is_route_to_host_blocked(temp_host) == FALSE) add_hostoutage(temp_host); } } /* check all hosts that are causing problems and calculate the extent of the problem */ for(temp_hostoutage = hostoutage_list; temp_hostoutage != NULL; temp_hostoutage = temp_hostoutage->next) { /* calculate the outage effect of this particular hosts */ calculate_outage_effect_of_host(temp_hostoutage->hst, &temp_hostoutage->affected_child_hosts); if(temp_hostoutage->affected_child_hosts > 1) total_blocking_outages++; else total_nonblocking_outages++; } return; } /* adds a host outage entry */ void add_hostoutage(host *hst) { hostoutage *new_hostoutage; /* allocate memory for a new structure */ new_hostoutage = (hostoutage *)malloc(sizeof(hostoutage)); if(new_hostoutage == NULL) return; new_hostoutage->hst = hst; new_hostoutage->affected_child_hosts = 0; /* add the structure to the head of the list in memory */ new_hostoutage->next = hostoutage_list; hostoutage_list = new_hostoutage; return; } /* frees all memory allocated to the host outage list */ void free_hostoutage_list(void) { hostoutage *this_hostoutage; hostoutage *next_hostoutage; for(this_hostoutage = hostoutage_list; this_hostoutage != NULL; this_hostoutage = next_hostoutage) { next_hostoutage = this_hostoutage->next; free(this_hostoutage); } return; } /* calculates network outage effect of a particular host being down or unreachable */ void calculate_outage_effect_of_host(host *hst, int *affected_hosts) { int total_child_hosts_affected = 0; int temp_child_hosts_affected = 0; host *temp_host; /* find all child hosts of this host */ for(temp_host = host_list; temp_host != NULL; temp_host = temp_host->next) { /* skip this host if it is not a child */ if(is_host_immediate_child_of_host(hst, temp_host) == FALSE) continue; /* calculate the outage effect of the child */ calculate_outage_effect_of_host(temp_host, &temp_child_hosts_affected); /* keep a running total of outage effects */ total_child_hosts_affected += temp_child_hosts_affected; } *affected_hosts = total_child_hosts_affected + 1; return; } /* tests whether or not a host is "blocked" by upstream parents (host is already assumed to be down or unreachable) */ int is_route_to_host_blocked(host *hst) { hostsmember *temp_hostsmember; hoststatus *temp_hoststatus; /* if the host has no parents, it is not being blocked by anyone */ if(hst->parent_hosts == NULL) return FALSE; /* check all parent hosts */ for(temp_hostsmember = hst->parent_hosts; temp_hostsmember != NULL; temp_hostsmember = temp_hostsmember->next) { /* find the parent host's status */ temp_hoststatus = find_hoststatus(temp_hostsmember->host_name); if(temp_hoststatus == NULL) continue; /* at least one parent it up (or pending), so this host is not blocked */ if(temp_hoststatus->status == SD_HOST_UP || temp_hoststatus->status == HOST_PENDING) return FALSE; } return TRUE; } void display_tac_overview(void) { char host_health_image[16]; char service_health_image[16]; printf("

    \n"); printf("\n"); printf("\n"); /* left column */ printf("\n"); /* right column */ printf("\n"); printf("\n"); printf("
    \n"); display_info_table("Tactical Monitoring Overview", TRUE, ¤t_authdata); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("
    \n"); /* display context-sensitive help */ display_context_help(CONTEXTHELP_TAC); printf("\n"); printf("\n"); printf("\n"); printf("\n", EXTINFO_CGI, DISPLAY_PERFORMANCE); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("
     Monitoring Performance
    \n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("
    \n"); printf("\n"); printf("\n"); printf("", EXTINFO_CGI, DISPLAY_PERFORMANCE); printf("\n", EXTINFO_CGI, DISPLAY_PERFORMANCE, min_service_execution_time, max_service_execution_time, average_service_execution_time); printf("\n"); printf("\n"); printf("", EXTINFO_CGI, DISPLAY_PERFORMANCE); printf("\n", EXTINFO_CGI, DISPLAY_PERFORMANCE, min_service_latency, max_service_latency, average_service_latency); printf("\n"); printf("\n"); printf("", EXTINFO_CGI, DISPLAY_PERFORMANCE); printf("\n", EXTINFO_CGI, DISPLAY_PERFORMANCE, min_host_execution_time, max_host_execution_time, average_host_execution_time); printf("\n"); printf("\n"); printf("", EXTINFO_CGI, DISPLAY_PERFORMANCE); printf("\n", EXTINFO_CGI, DISPLAY_PERFORMANCE, min_host_latency, max_host_latency, average_host_latency); printf("\n"); printf("\n"); printf("", STATUS_CGI, SERVICE_ACTIVE_CHECK); printf("\n", STATUS_CGI, HOST_ACTIVE_CHECK, total_active_host_checks, STATUS_CGI, SERVICE_ACTIVE_CHECK, total_active_service_checks); printf("\n"); printf("\n"); printf("", STATUS_CGI, SERVICE_PASSIVE_CHECK); printf("\n", STATUS_CGI, HOST_PASSIVE_CHECK, total_passive_host_checks, STATUS_CGI, SERVICE_PASSIVE_CHECK, total_passive_service_checks); printf("\n"); printf("
    Service Check Execution Time:%.2f / %.2f / %.3f sec
    Service Check Latency:%.2f / %.2f / %.3f sec
    Host Check Execution Time:%.2f / %.2f / %.3f sec
    Host Check Latency:%.2f / %.2f / %2.3f sec
    # Active Host / Service Checks:%d / %d
    # Passive Host / Service Checks:%d / %d
    \n"); printf("
    \n"); printf("
    \n"); printf("
    \n"); printf("
    \n"); printf("

    \n"); printf("
    \n"); printf("
    \n"); printf("\n"); printf("\n"); printf("\n"); /* right column */ printf("\n"); printf("\n"); printf("
    \n"); /******* OUTAGES ********/ printf("

    \n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("
     Network Outages
    ", OUTAGES_CGI); if(is_authorized_for_all_hosts(¤t_authdata) == FALSE) printf("N/A"); else printf("%d Outages", total_blocking_outages); printf("
    \n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("
        \n"); printf("\n"); if(total_blocking_outages > 0) printf("\n", OUTAGES_CGI, total_blocking_outages); /* if(total_nonblocking_outages>0) printf("\n",OUTAGES_CGI,total_nonblocking_outages); */ printf("
    %d Blocking Outages
    %d Nonblocking Outages
    \n"); printf("
    \n"); printf("
    \n"); printf("

    \n"); printf("
    \n"); if(percent_host_health < HEALTH_CRITICAL_PERCENTAGE) strncpy(host_health_image, THERM_CRITICAL_IMAGE, sizeof(host_health_image)); else if(percent_host_health < HEALTH_WARNING_PERCENTAGE) strncpy(host_health_image, THERM_WARNING_IMAGE, sizeof(host_health_image)); else strncpy(host_health_image, THERM_OK_IMAGE, sizeof(host_health_image)); host_health_image[sizeof(host_health_image) - 1] = '\x0'; if(percent_service_health < HEALTH_CRITICAL_PERCENTAGE) strncpy(service_health_image, THERM_CRITICAL_IMAGE, sizeof(service_health_image)); else if(percent_service_health < HEALTH_WARNING_PERCENTAGE) strncpy(service_health_image, THERM_WARNING_IMAGE, sizeof(service_health_image)); else strncpy(service_health_image, THERM_OK_IMAGE, sizeof(service_health_image)); service_health_image[sizeof(service_health_image) - 1] = '\x0'; printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("
    \n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("
     Network Health
    \n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("
    \n"); printf("\n"); printf("\n"); printf(""); printf("\n", url_images_path, host_health_image, (percent_host_health < 5.0) ? 5 : (int)percent_host_health, percent_host_health, percent_host_health); printf("\n"); printf("\n"); printf(""); printf("\n", url_images_path, service_health_image, (percent_service_health < 5.0) ? 5 : (int)percent_service_health, percent_service_health, percent_service_health); printf("\n"); printf("
    Host Health:%2.1f%% Health
    Service Health:%2.1f%% Health
    \n"); printf("
    \n"); printf("
    \n"); printf("
    \n"); printf("
    \n"); /******* HOSTS ********/ printf("

    \n"); printf("\n"); printf("\n"); printf("\n"); printf("\n", STATUS_CGI, SD_HOST_DOWN, hosts_down); printf("\n", STATUS_CGI, SD_HOST_UNREACHABLE, hosts_unreachable); printf("\n", STATUS_CGI, SD_HOST_UP, hosts_up); printf("\n", STATUS_CGI, HOST_PENDING, hosts_pending); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("
     Hosts
    %d Down%d Unreachable%d Up%d Pending
    \n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("
        \n"); printf("\n"); if(hosts_down_unacknowledged > 0) printf("\n", STATUS_CGI, SD_HOST_DOWN, HOST_NO_SCHEDULED_DOWNTIME | HOST_STATE_UNACKNOWLEDGED | HOST_CHECKS_ENABLED, hosts_down_unacknowledged); if(hosts_down_scheduled > 0) printf("\n", STATUS_CGI, SD_HOST_DOWN, HOST_SCHEDULED_DOWNTIME, hosts_down_scheduled); if(hosts_down_acknowledged > 0) printf("\n", STATUS_CGI, SD_HOST_DOWN, HOST_STATE_ACKNOWLEDGED, hosts_down_acknowledged); if(hosts_down_disabled > 0) printf("\n", STATUS_CGI, SD_HOST_DOWN, HOST_CHECKS_DISABLED, hosts_down_disabled); printf("
    %d Unhandled Problems
    %d Scheduled
    %d Acknowledged
    %d Disabled
    \n"); printf("
    \n"); printf("
    \n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("
      \n"); printf("\n"); if(hosts_unreachable_unacknowledged > 0) printf("\n", STATUS_CGI, SD_HOST_UNREACHABLE, HOST_NO_SCHEDULED_DOWNTIME | HOST_STATE_UNACKNOWLEDGED | HOST_CHECKS_ENABLED, hosts_unreachable_unacknowledged); if(hosts_unreachable_scheduled > 0) printf("\n", STATUS_CGI, SD_HOST_UNREACHABLE, HOST_SCHEDULED_DOWNTIME, hosts_unreachable_scheduled); if(hosts_unreachable_acknowledged > 0) printf("\n", STATUS_CGI, SD_HOST_UNREACHABLE, HOST_STATE_ACKNOWLEDGED, hosts_unreachable_acknowledged); if(hosts_unreachable_disabled > 0) printf("\n", STATUS_CGI, SD_HOST_UNREACHABLE, HOST_CHECKS_DISABLED, hosts_unreachable_disabled); printf("
    %d Unhandled Problems
    %d Scheduled
    %d Acknowledged
    %d Disabled
    \n"); printf("
    \n"); printf("
    \n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("
      \n"); printf("\n"); if(hosts_up_disabled > 0) printf("\n", STATUS_CGI, SD_HOST_UP, HOST_CHECKS_DISABLED, hosts_up_disabled); printf("
    %d Disabled
    \n"); printf("
    \n"); printf("
    \n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("
      \n"); printf("\n"); if(hosts_pending_disabled > 0) printf("\n", STATUS_CGI, HOST_PENDING, HOST_CHECKS_DISABLED, hosts_pending_disabled); printf("
    %d Disabled
    \n"); printf("
    \n"); printf("
    \n"); /* printf("\n"); printf("\n"); */ printf("

    \n"); /*printf("
    \n");*/ /******* SERVICES ********/ printf("

    \n"); printf("\n"); printf("\n"); printf("\n"); printf("\n", STATUS_CGI, SERVICE_CRITICAL, services_critical); printf("\n", STATUS_CGI, SERVICE_WARNING, services_warning); printf("\n", STATUS_CGI, SERVICE_UNKNOWN, services_unknown); printf("\n", STATUS_CGI, SERVICE_OK, services_ok); printf("\n", STATUS_CGI, SERVICE_PENDING, services_pending); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("
     Services
    %d Critical%d Warning%d Unknown%d Ok%d Pending
    \n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("
        \n"); printf("\n"); if(services_critical_unacknowledged > 0) printf("\n", STATUS_CGI, SERVICE_CRITICAL, SD_HOST_UP | HOST_PENDING, SERVICE_NO_SCHEDULED_DOWNTIME | SERVICE_STATE_UNACKNOWLEDGED | SERVICE_CHECKS_ENABLED, services_critical_unacknowledged); if(services_critical_host_problem > 0) printf("\n", STATUS_CGI, SERVICE_CRITICAL, SD_HOST_DOWN | SD_HOST_UNREACHABLE, services_critical_host_problem); if(services_critical_scheduled > 0) printf("\n", STATUS_CGI, SERVICE_CRITICAL, SERVICE_SCHEDULED_DOWNTIME, services_critical_scheduled); if(services_critical_acknowledged > 0) printf("\n", STATUS_CGI, SERVICE_CRITICAL, SERVICE_STATE_ACKNOWLEDGED, services_critical_acknowledged); if(services_critical_disabled > 0) printf("\n", STATUS_CGI, SERVICE_CRITICAL, SERVICE_CHECKS_DISABLED, services_critical_disabled); printf("
    %d Unhandled Problems
    %d on Problem Hosts
    %d Scheduled
    %d Acknowledged
    %d Disabled
    \n"); printf("
    \n"); printf("
    \n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("
      \n"); printf("\n"); if(services_warning_unacknowledged > 0) printf("\n", STATUS_CGI, SERVICE_WARNING, SD_HOST_UP | HOST_PENDING, SERVICE_NO_SCHEDULED_DOWNTIME | SERVICE_STATE_UNACKNOWLEDGED | SERVICE_CHECKS_ENABLED, services_warning_unacknowledged); if(services_warning_host_problem > 0) printf("\n", STATUS_CGI, SERVICE_WARNING, SD_HOST_DOWN | SD_HOST_UNREACHABLE, services_warning_host_problem); if(services_warning_scheduled > 0) printf("\n", STATUS_CGI, SERVICE_WARNING, SERVICE_SCHEDULED_DOWNTIME, services_warning_scheduled); if(services_warning_acknowledged > 0) printf("\n", STATUS_CGI, SERVICE_WARNING, SERVICE_STATE_ACKNOWLEDGED, services_warning_acknowledged); if(services_warning_disabled > 0) printf("\n", STATUS_CGI, SERVICE_WARNING, SERVICE_CHECKS_DISABLED, services_warning_disabled); printf("
    %d Unhandled Problems
    %d on Problem Hosts
    %d Scheduled
    %d Acknowledged
    %d Disabled
    \n"); printf("
    \n"); printf("
    \n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("
      \n"); printf("\n"); if(services_unknown_unacknowledged > 0) printf("\n", STATUS_CGI, SERVICE_UNKNOWN, SD_HOST_UP | HOST_PENDING, SERVICE_NO_SCHEDULED_DOWNTIME | SERVICE_STATE_UNACKNOWLEDGED | SERVICE_CHECKS_ENABLED, services_unknown_unacknowledged); if(services_unknown_host_problem > 0) printf("\n", STATUS_CGI, SERVICE_UNKNOWN, SD_HOST_DOWN | SD_HOST_UNREACHABLE, services_unknown_host_problem); if(services_unknown_scheduled > 0) printf("\n", STATUS_CGI, SERVICE_UNKNOWN, SERVICE_SCHEDULED_DOWNTIME, services_unknown_scheduled); if(services_unknown_acknowledged > 0) printf("\n", STATUS_CGI, SERVICE_UNKNOWN, SERVICE_STATE_ACKNOWLEDGED, services_unknown_acknowledged); if(services_unknown_disabled > 0) printf("\n", STATUS_CGI, SERVICE_UNKNOWN, SERVICE_CHECKS_DISABLED, services_unknown_disabled); printf("
    %d Unhandled Problems
    %d on Problem Hosts
    %d Scheduled
    %d Acknowledged
    %d Disabled
    \n"); printf("
    \n"); printf("
    \n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("
      \n"); printf("\n"); if(services_ok_disabled > 0) printf("\n", STATUS_CGI, SERVICE_OK, SERVICE_CHECKS_DISABLED, services_ok_disabled); printf("
    %d Disabled
    \n"); printf("
    \n"); printf("
    \n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("
      \n"); printf("\n"); if(services_pending_disabled > 0) printf("\n", STATUS_CGI, SERVICE_PENDING, SERVICE_CHECKS_DISABLED, services_pending_disabled); printf("
    %d Disabled
    \n"); printf("
    \n"); printf("
    \n"); printf("

    \n"); /*printf("
    \n");*/ /******* MONITORING FEATURES ********/ printf("

    \n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("
     Monitoring Features
    Flap DetectionNotificationsEvent HandlersActive ChecksPassive Checks
    \n"); printf("\n"); printf("\n"); printf("\n", COMMAND_CGI, (enable_flap_detection == TRUE) ? CMD_DISABLE_FLAP_DETECTION : CMD_ENABLE_FLAP_DETECTION, url_images_path, (enable_flap_detection == TRUE) ? TAC_ENABLED_ICON : TAC_DISABLED_ICON, (enable_flap_detection == TRUE) ? "Enabled" : "Disabled", (enable_flap_detection == TRUE) ? "Enabled" : "Disabled"); printf("\n"); if(enable_flap_detection == TRUE) { printf("\n"); } else printf("\n"); printf("\n"); printf("
    Flap Detection %s \n"); printf("\n"); if(flap_disabled_services > 0) printf("\n", STATUS_CGI, SERVICE_FLAP_DETECTION_DISABLED, flap_disabled_services, (flap_disabled_services == 1) ? "" : "s"); else printf("\n"); if(flapping_services > 0) printf("\n", STATUS_CGI, SERVICE_IS_FLAPPING, flapping_services, (flapping_services == 1) ? "" : "s"); else printf("\n"); if(flap_disabled_hosts > 0) printf("\n", STATUS_CGI, HOST_FLAP_DETECTION_DISABLED, flap_disabled_hosts, (flap_disabled_hosts == 1) ? "" : "s"); else printf("\n"); if(flapping_hosts > 0) printf("\n", STATUS_CGI, HOST_IS_FLAPPING, flapping_hosts, (flapping_hosts == 1) ? "" : "s"); else printf("\n"); printf("
    %d Service%s Disabled
    All Services Enabled
    %d Service%s Flapping
    No Services Flapping
    %d Host%s Disabled
    All Hosts Enabled
    %d Host%s Flapping
    No Hosts Flapping
    \n"); printf("
    N/A
    \n"); printf("
    \n"); printf("\n"); printf("\n"); printf("\n", COMMAND_CGI, (enable_notifications == TRUE) ? CMD_DISABLE_NOTIFICATIONS : CMD_ENABLE_NOTIFICATIONS, url_images_path, (enable_notifications == TRUE) ? TAC_ENABLED_ICON : TAC_DISABLED_ICON, (enable_notifications == TRUE) ? "Enabled" : "Disabled", (enable_notifications == TRUE) ? "Enabled" : "Disabled"); printf("\n"); if(enable_notifications == TRUE) { printf("\n"); } else printf("\n"); printf("\n"); printf("
    Notifications %s \n"); printf("\n"); if(notification_disabled_services > 0) printf("\n", STATUS_CGI, SERVICE_NOTIFICATIONS_DISABLED, notification_disabled_services, (notification_disabled_services == 1) ? "" : "s"); else printf("\n"); if(notification_disabled_hosts > 0) printf("\n", STATUS_CGI, HOST_NOTIFICATIONS_DISABLED, notification_disabled_hosts, (notification_disabled_hosts == 1) ? "" : "s"); else printf("\n"); printf("
    %d Service%s Disabled
    All Services Enabled
    %d Host%s Disabled
    All Hosts Enabled
    \n"); printf("
    N/A
    \n"); printf("
    \n"); printf("\n"); printf("\n"); printf("\n", COMMAND_CGI, (enable_event_handlers == TRUE) ? CMD_DISABLE_EVENT_HANDLERS : CMD_ENABLE_EVENT_HANDLERS, url_images_path, (enable_event_handlers == TRUE) ? TAC_ENABLED_ICON : TAC_DISABLED_ICON, (enable_event_handlers == TRUE) ? "Enabled" : "Disabled", (enable_event_handlers == TRUE) ? "Enabled" : "Disabled"); printf("\n"); if(enable_event_handlers == TRUE) { printf("\n"); } else printf("\n"); printf("\n"); printf("
    Event Handlers %s \n"); printf("\n"); if(event_handler_disabled_services > 0) printf("\n", STATUS_CGI, SERVICE_EVENT_HANDLER_DISABLED, event_handler_disabled_services, (event_handler_disabled_services == 1) ? "" : "s"); else printf("\n"); if(event_handler_disabled_hosts > 0) printf("\n", STATUS_CGI, HOST_EVENT_HANDLER_DISABLED, event_handler_disabled_hosts, (event_handler_disabled_hosts == 1) ? "" : "s"); else printf("\n"); printf("
    %d Service%s Disabled
    All Services Enabled
    %d Host%s Disabled
    All Hosts Enabled
    \n"); printf("
    N/A
    \n"); printf("
    \n"); printf("\n"); printf("\n"); printf("\n", EXTINFO_CGI, DISPLAY_PROCESS_INFO, url_images_path, (execute_service_checks == TRUE) ? TAC_ENABLED_ICON : TAC_DISABLED_ICON, (execute_service_checks == TRUE) ? "Enabled" : "Disabled", (execute_service_checks == TRUE) ? "Enabled" : "Disabled"); printf("\n"); if(execute_service_checks == TRUE) { printf("\n"); } else printf("\n"); printf("\n"); printf("
    Active Checks %s \n"); printf("\n"); if(active_checks_disabled_services > 0) printf("\n", STATUS_CGI, SERVICE_CHECKS_DISABLED, active_checks_disabled_services, (active_checks_disabled_services == 1) ? "" : "s"); else printf("\n"); if(active_checks_disabled_hosts > 0) printf("\n", STATUS_CGI, HOST_CHECKS_DISABLED, active_checks_disabled_hosts, (active_checks_disabled_hosts == 1) ? "" : "s"); else printf("\n"); printf("
    %d Service%s Disabled
    All Services Enabled
    %d Host%s Disabled
    All Hosts Enabled
    \n"); printf("
    N/A
    \n"); printf("
    \n"); printf("\n"); printf("\n"); printf("\n", EXTINFO_CGI, DISPLAY_PROCESS_INFO, url_images_path, (accept_passive_service_checks == TRUE) ? TAC_ENABLED_ICON : TAC_DISABLED_ICON, (accept_passive_service_checks == TRUE) ? "Enabled" : "Disabled", (accept_passive_service_checks == TRUE) ? "Enabled" : "Disabled"); printf("\n"); if(accept_passive_service_checks == TRUE) { printf("\n"); } else printf("\n"); printf("\n"); printf("
    Passive Checks %s \n"); printf("\n"); if(passive_checks_disabled_services > 0) printf("\n", STATUS_CGI, SERVICE_PASSIVE_CHECKS_DISABLED, passive_checks_disabled_services, (passive_checks_disabled_services == 1) ? "" : "s"); else printf("\n"); if(passive_checks_disabled_hosts > 0) printf("\n", STATUS_CGI, HOST_PASSIVE_CHECKS_DISABLED, passive_checks_disabled_hosts, (passive_checks_disabled_hosts == 1) ? "" : "s"); else printf("\n"); printf("
    %d Service%s Disabled
    All Services Enabled
    %d Host%s Disabled
    All Hosts Enabled
    \n"); printf("
    N/A
    \n"); printf("
    \n"); printf("

    \n"); return; } nagios-4.3.4/cgi/trends.c000066400000000000000000003016471314764422400152310ustar00rootroot00000000000000/************************************************************************** * * TRENDS.C - Nagios State Trends CGI * * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *************************************************************************/ #include "../include/config.h" #include "../include/common.h" #include "../include/objects.h" #include "../include/comments.h" #include "../include/statusdata.h" #include "../include/cgiutils.h" #include "../include/getcgi.h" #include "../include/cgiauth.h" #include /* Boutell's GD library function */ #include /* GD library small font definition */ /*#define DEBUG 1*/ extern char main_config_file[MAX_FILENAME_LENGTH]; extern char url_html_path[MAX_FILENAME_LENGTH]; extern char url_images_path[MAX_FILENAME_LENGTH]; extern char url_stylesheets_path[MAX_FILENAME_LENGTH]; extern char physical_images_path[MAX_FILENAME_LENGTH]; extern char *status_file; extern int log_rotation_method; /* archived state types */ #define AS_CURRENT_STATE -1 /* special case for initial assumed state */ #define AS_NO_DATA 0 #define AS_PROGRAM_END 1 #define AS_PROGRAM_START 2 #define AS_HOST_UP 3 #define AS_HOST_DOWN 4 #define AS_HOST_UNREACHABLE 5 #define AS_SVC_OK 6 #define AS_SVC_UNKNOWN 7 #define AS_SVC_WARNING 8 #define AS_SVC_CRITICAL 9 #define AS_SOFT_STATE 1 #define AS_HARD_STATE 2 /* display types */ #define DISPLAY_HOST_TRENDS 0 #define DISPLAY_SERVICE_TRENDS 1 #define DISPLAY_NO_TRENDS 2 /* input types */ #define GET_INPUT_NONE 0 #define GET_INPUT_TARGET_TYPE 1 #define GET_INPUT_HOST_TARGET 2 #define GET_INPUT_SERVICE_TARGET 3 #define GET_INPUT_OPTIONS 4 /* modes */ #define CREATE_HTML 0 #define CREATE_IMAGE 1 /* standard report times */ #define TIMEPERIOD_CUSTOM 0 #define TIMEPERIOD_TODAY 1 #define TIMEPERIOD_YESTERDAY 2 #define TIMEPERIOD_THISWEEK 3 #define TIMEPERIOD_LASTWEEK 4 #define TIMEPERIOD_THISMONTH 5 #define TIMEPERIOD_LASTMONTH 6 #define TIMEPERIOD_THISQUARTER 7 #define TIMEPERIOD_LASTQUARTER 8 #define TIMEPERIOD_THISYEAR 9 #define TIMEPERIOD_LASTYEAR 10 #define TIMEPERIOD_LAST24HOURS 11 #define TIMEPERIOD_LAST7DAYS 12 #define TIMEPERIOD_LAST31DAYS 13 #define TIMEPERIOD_NEXTPROBLEM 14 #define MIN_TIMESTAMP_SPACING 10 #define MAX_ARCHIVE_SPREAD 65 #define MAX_ARCHIVE 65 #define MAX_ARCHIVE_BACKTRACKS 60 authdata current_authdata; typedef struct archived_state_struct { time_t time_stamp; int entry_type; int processed_state; int state_type; char *state_info; struct archived_state_struct *next; } archived_state; archived_state *as_list = NULL; time_t t1; time_t t2; int start_second = 0; int start_minute = 0; int start_hour = 0; int start_day = 1; int start_month = 1; int start_year = 2000; int end_second = 0; int end_minute = 0; int end_hour = 24; int end_day = 1; int end_month = 1; int end_year = 2000; int display_type = DISPLAY_NO_TRENDS; int mode = CREATE_HTML; int input_type = GET_INPUT_NONE; int timeperiod_type = TIMEPERIOD_LAST24HOURS; int compute_time_from_parts = FALSE; int display_popups = TRUE; int use_map = TRUE; int small_image = FALSE; int embedded = FALSE; int display_header = TRUE; int assume_initial_states = TRUE; int assume_state_retention = TRUE; int assume_states_during_notrunning = TRUE; int include_soft_states = FALSE; char *host_name = ""; char *svc_description = ""; void graph_all_trend_data(void); void graph_trend_data(int, int, time_t, time_t, time_t, char *); void draw_timestamps(void); void draw_timestamp(int, time_t); void draw_time_breakdowns(void); void draw_horizontal_grid_lines(void); void draw_dashed_line(int, int, int, int, int); int convert_host_state_to_archived_state(int); int convert_service_state_to_archived_state(int); void add_archived_state(int, int, time_t, char *); void free_archived_state_list(void); void read_archived_state_data(void); void scan_log_file_for_archived_state_data(char *); void convert_timeperiod_to_times(int); void compute_report_times(void); void get_time_breakdown_string(unsigned long, unsigned long, char *, char *buffer, int); void document_header(int); void document_footer(void); int process_cgivars(void); void write_popup_code(void); gdImagePtr trends_image = 0; int color_white = 0; int color_black = 0; int color_red = 0; int color_darkred = 0; int color_green = 0; int color_darkgreen = 0; int color_yellow = 0; int color_orange = 0; FILE *image_file = NULL; int image_width = 900; int image_height = 300; #define HOST_DRAWING_WIDTH 498 #define HOST_DRAWING_HEIGHT 70 #define HOST_DRAWING_X_OFFSET 116 #define HOST_DRAWING_Y_OFFSET 55 #define SVC_DRAWING_WIDTH 498 #define SVC_DRAWING_HEIGHT 90 #define SVC_DRAWING_X_OFFSET 116 #define SVC_DRAWING_Y_OFFSET 55 #define SMALL_HOST_DRAWING_WIDTH 500 #define SMALL_HOST_DRAWING_HEIGHT 20 #define SMALL_HOST_DRAWING_X_OFFSET 0 #define SMALL_HOST_DRAWING_Y_OFFSET 0 #define SMALL_SVC_DRAWING_WIDTH 500 #define SMALL_SVC_DRAWING_HEIGHT 20 #define SMALL_SVC_DRAWING_X_OFFSET 0 #define SMALL_SVC_DRAWING_Y_OFFSET 0 int drawing_width = 0; int drawing_height = 0; int drawing_x_offset = 0; int drawing_y_offset = 0; int last_known_state = AS_NO_DATA; int zoom_factor = 4; int backtrack_archives = 2; int earliest_archive = 0; time_t earliest_time; time_t latest_time; int earliest_state = AS_NO_DATA; int latest_state = AS_NO_DATA; int initial_assumed_host_state = AS_NO_DATA; int initial_assumed_service_state = AS_NO_DATA; unsigned long time_up = 0L; unsigned long time_down = 0L; unsigned long time_unreachable = 0L; unsigned long time_ok = 0L; unsigned long time_warning = 0L; unsigned long time_unknown = 0L; unsigned long time_critical = 0L; int problem_found; int main(int argc, char **argv) { int result = OK; char temp_buffer[MAX_INPUT_BUFFER]; char image_template[MAX_INPUT_BUFFER]; char start_time[MAX_INPUT_BUFFER]; char end_time[MAX_INPUT_BUFFER]; int string_width; int string_height; char start_timestring[MAX_INPUT_BUFFER]; char end_timestring[MAX_INPUT_BUFFER]; host *temp_host; service *temp_service; int is_authorized = TRUE; int found = FALSE; int days, hours, minutes, seconds; char *first_service = NULL; time_t t3; time_t current_time; struct tm *t; /* reset internal CGI variables */ reset_cgi_vars(); /* Initialize shared configuration variables */ init_shared_cfg_vars(1); /* read the CGI configuration file */ result = read_cgi_config_file(get_cgi_config_location()); if(result == ERROR) { if(mode == CREATE_HTML) { document_header(FALSE); cgi_config_file_error(get_cgi_config_location()); document_footer(); } return ERROR; } /* read the main configuration file */ result = read_main_config_file(main_config_file); if(result == ERROR) { if(mode == CREATE_HTML) { document_header(FALSE); main_config_file_error(main_config_file); document_footer(); } return ERROR; } /* initialize time period to last 24 hours */ time(¤t_time); t2 = current_time; t1 = (time_t)(current_time - (60 * 60 * 24)); /* default number of backtracked archives */ switch(log_rotation_method) { case LOG_ROTATION_MONTHLY: backtrack_archives = 1; break; case LOG_ROTATION_WEEKLY: backtrack_archives = 2; break; case LOG_ROTATION_DAILY: backtrack_archives = 4; break; case LOG_ROTATION_HOURLY: backtrack_archives = 8; break; default: backtrack_archives = 2; break; } /* get the arguments passed in the URL */ process_cgivars(); /* get authentication information */ get_authentication_information(¤t_authdata); result = read_all_object_configuration_data(main_config_file, READ_ALL_OBJECT_DATA); if(result == ERROR) { if(mode == CREATE_HTML) { document_header(FALSE); object_data_error(); document_footer(); } return ERROR; } /* read all status data */ result = read_all_status_data(status_file, READ_ALL_STATUS_DATA); if(result == ERROR) { if(mode == CREATE_HTML) { document_header(FALSE); status_data_error(); document_footer(); } return ERROR; } document_header(TRUE); if(compute_time_from_parts == TRUE) compute_report_times(); /* make sure times are sane, otherwise swap them */ if(t2 < t1) { t3 = t2; t2 = t1; t1 = t3; } /* don't let user create reports in the future */ if(t2 > current_time) { t2 = current_time; if(t1 > t2) t1 = t2 - (60 * 60 * 24); } if(mode == CREATE_HTML && display_header == TRUE) { time_t old_t1 = t1, old_t2 = t2; /* begin top table */ printf("\n"); printf("\n"); /* left column of the first row */ printf("\n"); /* center column of top row */ printf("\n"); /* right hand column of top row */ printf("\n"); /* end of top table */ printf("\n"); printf("
    \n"); if(display_type == DISPLAY_HOST_TRENDS) snprintf(temp_buffer, sizeof(temp_buffer) - 1, "Host State Trends"); else if(display_type == DISPLAY_SERVICE_TRENDS) snprintf(temp_buffer, sizeof(temp_buffer) - 1, "Service State Trends"); else snprintf(temp_buffer, sizeof(temp_buffer) - 1, "Host and Service State Trends"); temp_buffer[sizeof(temp_buffer) - 1] = '\x0'; display_info_table(temp_buffer, FALSE, ¤t_authdata); if(timeperiod_type == TIMEPERIOD_NEXTPROBLEM) { archived_state *temp_as; time_t problem_t1, problem_t2 = 0; t1 = t2; t2 = current_time; read_archived_state_data(); problem_found = FALSE; if(display_type == DISPLAY_HOST_TRENDS) { for(temp_as = as_list; temp_as != NULL; temp_as = temp_as->next) { if((temp_as->entry_type == SD_HOST_DOWN || temp_as->entry_type == SD_HOST_UNREACHABLE) && temp_as->time_stamp > t1) { problem_t1 = temp_as->time_stamp; problem_found = TRUE; break; } } if(problem_found == TRUE) { for(; temp_as != NULL; temp_as = temp_as->next) { if(temp_as->entry_type == AS_HOST_UP && temp_as->time_stamp > problem_t1) { problem_t2 = temp_as->time_stamp; break; } } } } else { for(temp_as = as_list; temp_as != NULL; temp_as = temp_as->next) { if((temp_as->entry_type == AS_SVC_UNKNOWN || temp_as->entry_type == AS_SVC_CRITICAL || temp_as->entry_type == AS_SVC_WARNING) && temp_as->time_stamp > t1) { problem_t1 = temp_as->time_stamp; problem_found = TRUE; break; } } if(problem_found == TRUE) { for(; temp_as != NULL; temp_as = temp_as->next) { if(temp_as->entry_type == AS_SVC_OK && temp_as->time_stamp > problem_t1) { problem_t2 = temp_as->time_stamp; break; } } } } if(problem_found == TRUE) { time_t margin; if(problem_t2 == 0) { margin = 12 * 60 * 60; problem_t2 = problem_t1; } else margin = (problem_t2 - problem_t1) / 2; t1 = problem_t1 - margin; t2 = problem_t2 + margin; } } if(timeperiod_type == TIMEPERIOD_NEXTPROBLEM && problem_found == FALSE) { t1 = old_t1; t2 = old_t2; } if(display_type != DISPLAY_NO_TRENDS && input_type == GET_INPUT_NONE) { printf("\n"); printf("\n"); printf("\n"); } printf("\n"); if(display_type != DISPLAY_NO_TRENDS && input_type == GET_INPUT_NONE) { printf("
    \n"); if(display_type == DISPLAY_HOST_TRENDS) printf("Host '%s'", host_name); else if(display_type == DISPLAY_SERVICE_TRENDS) printf("Service '%s' On Host '%s'", svc_description, host_name); printf("
    \n"); printf("
    \n"); printf("%s State Trends\n", url_images_path, TRENDS_ICON, (display_type == DISPLAY_HOST_TRENDS) ? "Host" : "Service", (display_type == DISPLAY_HOST_TRENDS) ? "Host" : "Service"); printf("
    \n"); get_time_string(&t1, start_timestring, sizeof(start_timestring) - 1, SHORT_DATE_TIME); get_time_string(&t2, end_timestring, sizeof(end_timestring) - 1, SHORT_DATE_TIME); printf("
    %s to %s
    \n", start_timestring, end_timestring); get_time_breakdown((time_t)(t2 - t1), &days, &hours, &minutes, &seconds); printf("
    Duration: %dd %dh %dm %ds
    \n", days, hours, minutes, seconds); } printf("
    \n"); #ifdef LEGACY_GRAPHICAL_CGIS printf("
    \n", TRENDS_CGI); #else printf("\n", LEGACY_TRENDS_CGI); #endif printf("\n"); if(display_type != DISPLAY_NO_TRENDS && input_type == GET_INPUT_NONE) { printf("\n", (display_type == DISPLAY_HOST_TRENDS) ? "host" : "service"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); } /* display context-sensitive help */ printf("\n"); printf("
    First assumed %s state:Backtracked archives:
    "); if(display_popups == FALSE) printf("\n"); if(use_map == FALSE) printf("\n"); printf("\n", (unsigned long)t1); printf("\n", (unsigned long)t2); printf("\n", escape_string(host_name)); if(display_type == DISPLAY_SERVICE_TRENDS) printf("\n", escape_string(svc_description)); printf("\n", (assume_initial_states == TRUE) ? "yes" : "no"); printf("\n", (assume_state_retention == TRUE) ? "yes" : "no"); printf("\n", (assume_states_during_notrunning == TRUE) ? "yes" : "no"); printf("\n", (include_soft_states == TRUE) ? "yes" : "no"); if(display_type == DISPLAY_HOST_TRENDS) { printf("", initial_assumed_service_state); printf("", initial_assumed_host_state); printf("\n"); printf("\n"); printf("\n", backtrack_archives); printf("
    Report period:Zoom factor:
    \n"); printf("\n"); printf("\n"); printf("\n"); printf("
    \n"); printf("\n"); printf("\n"); printf("
    \n"); if(display_type != DISPLAY_NO_TRENDS && input_type == GET_INPUT_NONE) { if(display_type == DISPLAY_HOST_TRENDS) display_context_help(CONTEXTHELP_TRENDS_HOST); else display_context_help(CONTEXTHELP_TRENDS_SERVICE); } else if(display_type == DISPLAY_NO_TRENDS || input_type != GET_INPUT_NONE) { if(input_type == GET_INPUT_NONE) display_context_help(CONTEXTHELP_TRENDS_MENU1); else if(input_type == GET_INPUT_TARGET_TYPE) display_context_help(CONTEXTHELP_TRENDS_MENU1); else if(input_type == GET_INPUT_HOST_TARGET) display_context_help(CONTEXTHELP_TRENDS_MENU2); else if(input_type == GET_INPUT_SERVICE_TARGET) display_context_help(CONTEXTHELP_TRENDS_MENU3); else if(input_type == GET_INPUT_OPTIONS) display_context_help(CONTEXTHELP_TRENDS_MENU4); } printf("
    \n"); printf("
    \n"); printf("
    \n"); } #ifndef DEBUG /* check authorization... */ if(display_type == DISPLAY_HOST_TRENDS) { temp_host = find_host(host_name); if(temp_host == NULL || is_authorized_for_host(temp_host, ¤t_authdata) == FALSE) is_authorized = FALSE; } else if(display_type == DISPLAY_SERVICE_TRENDS) { temp_service = find_service(host_name, svc_description); if(temp_service == NULL || is_authorized_for_service(temp_service, ¤t_authdata) == FALSE) is_authorized = FALSE; } if(is_authorized == FALSE) { if(mode == CREATE_HTML) printf("

    It appears as though you are not authorized to view information for the specified %s...

    \n", (display_type == DISPLAY_HOST_TRENDS) ? "host" : "service"); document_footer(); free_memory(); return ERROR; } #endif if(timeperiod_type == TIMEPERIOD_NEXTPROBLEM && problem_found == FALSE) { printf("

    No problem found between end of display and end of recording

    \n"); document_footer(); free_memory(); return ERROR; } /* set drawing parameters, etc */ if(small_image == TRUE) { image_height = 20; image_width = 500; } else { image_height = 300; image_width = 900; } if(display_type == DISPLAY_HOST_TRENDS) { if(small_image == TRUE) { drawing_width = SMALL_HOST_DRAWING_WIDTH; drawing_height = SMALL_HOST_DRAWING_HEIGHT; drawing_x_offset = SMALL_HOST_DRAWING_X_OFFSET; drawing_y_offset = SMALL_HOST_DRAWING_Y_OFFSET; } else { drawing_width = HOST_DRAWING_WIDTH; drawing_height = HOST_DRAWING_HEIGHT; drawing_x_offset = HOST_DRAWING_X_OFFSET; drawing_y_offset = HOST_DRAWING_Y_OFFSET; } } else if(display_type == DISPLAY_SERVICE_TRENDS) { if(small_image == TRUE) { drawing_width = SMALL_SVC_DRAWING_WIDTH; drawing_height = SMALL_SVC_DRAWING_HEIGHT; drawing_x_offset = SMALL_SVC_DRAWING_X_OFFSET; drawing_y_offset = SMALL_SVC_DRAWING_Y_OFFSET; } else { drawing_width = SVC_DRAWING_WIDTH; drawing_height = SVC_DRAWING_HEIGHT; drawing_x_offset = SVC_DRAWING_X_OFFSET; drawing_y_offset = SVC_DRAWING_Y_OFFSET; } } /* last known state should always be initially set to indeterminate! */ last_known_state = AS_NO_DATA; /* initialize PNG image */ if(display_type != DISPLAY_NO_TRENDS && mode == CREATE_IMAGE) { if(small_image == TRUE) { trends_image = gdImageCreate(image_width, image_height); if(trends_image == NULL) { #ifdef DEBUG printf("Error: Could not allocate memory for image\n"); #endif return ERROR; } } else { if(display_type == DISPLAY_HOST_TRENDS) snprintf(image_template, sizeof(image_template) - 1, "%s/trendshost.png", physical_images_path); else snprintf(image_template, sizeof(image_template) - 1, "%s/trendssvc.png", physical_images_path); image_template[sizeof(image_template) - 1] = '\x0'; /* allocate buffer for storing image */ trends_image = NULL; image_file = fopen(image_template, "r"); if(image_file != NULL) { trends_image = gdImageCreateFromPng(image_file); fclose(image_file); } if(trends_image == NULL) trends_image = gdImageCreate(image_width, image_height); if(trends_image == NULL) { #ifdef DEBUG printf("Error: Could not allocate memory for image\n"); #endif return ERROR; } } /* allocate colors used for drawing */ color_white = gdImageColorAllocate(trends_image, 255, 255, 255); color_black = gdImageColorAllocate(trends_image, 0, 0, 0); color_red = gdImageColorAllocate(trends_image, 255, 0, 0); color_darkred = gdImageColorAllocate(trends_image, 128, 0, 0); color_green = gdImageColorAllocate(trends_image, 0, 210, 0); color_darkgreen = gdImageColorAllocate(trends_image, 0, 128, 0); color_yellow = gdImageColorAllocate(trends_image, 176, 178, 20); color_orange = gdImageColorAllocate(trends_image, 255, 100, 25); /* set transparency index */ gdImageColorTransparent(trends_image, color_white); /* make sure the graphic is interlaced */ gdImageInterlace(trends_image, 1); if(small_image == FALSE) { /* title */ snprintf(start_time, sizeof(start_time) - 1, "%s", ctime(&t1)); start_time[sizeof(start_time) - 1] = '\x0'; start_time[strlen(start_time) - 1] = '\x0'; snprintf(end_time, sizeof(end_time) - 1, "%s", ctime(&t2)); end_time[sizeof(end_time) - 1] = '\x0'; end_time[strlen(end_time) - 1] = '\x0'; string_height = gdFontSmall->h; if(display_type == DISPLAY_HOST_TRENDS) snprintf(temp_buffer, sizeof(temp_buffer) - 1, "State History For Host '%s'", host_name); else snprintf(temp_buffer, sizeof(temp_buffer) - 1, "State History For Service '%s' On Host '%s'", svc_description, host_name); temp_buffer[sizeof(temp_buffer) - 1] = '\x0'; string_width = gdFontSmall->w * strlen(temp_buffer); gdImageString(trends_image, gdFontSmall, (drawing_width / 2) - (string_width / 2) + drawing_x_offset, string_height, (unsigned char *)temp_buffer, color_black); snprintf(temp_buffer, sizeof(temp_buffer) - 1, "%s to %s", start_time, end_time); temp_buffer[sizeof(temp_buffer) - 1] = '\x0'; string_width = gdFontSmall->w * strlen(temp_buffer); gdImageString(trends_image, gdFontSmall, (drawing_width / 2) - (string_width / 2) + drawing_x_offset, (string_height * 2) + 5, (unsigned char *)temp_buffer, color_black); /* first time stamp */ snprintf(temp_buffer, sizeof(temp_buffer) - 1, "%s", start_time); temp_buffer[sizeof(temp_buffer) - 1] = '\x0'; string_width = gdFontSmall->w * strlen(temp_buffer); gdImageStringUp(trends_image, gdFontSmall, drawing_x_offset - (string_height / 2), drawing_y_offset + drawing_height + string_width + 5, (unsigned char *)temp_buffer, color_black); } } if(display_type != DISPLAY_NO_TRENDS && input_type == GET_INPUT_NONE) { if(mode == CREATE_IMAGE || (mode == CREATE_HTML && use_map == TRUE)) { /* read in all necessary archived state data */ read_archived_state_data(); /* graph archived state trend data */ graph_all_trend_data(); } /* print URL to image */ if(mode == CREATE_HTML) { printf("

    \n"); printf("
    \n"); #ifdef LEGACY_GRAPHICAL_CGIS printf(" 0) printf("&backtrack=%d", backtrack_archives); printf("&zoom=%d", zoom_factor); printf("' BORDER=0 name='trendsimage' useMap='#trendsmap' width=%d>\n", image_width); printf("
    \n"); } if(mode == CREATE_IMAGE || (mode == CREATE_HTML && use_map == TRUE)) { /* draw timestamps */ draw_timestamps(); /* draw horizontal lines */ draw_horizontal_grid_lines(); /* draw state time breakdowns */ draw_time_breakdowns(); } if(mode == CREATE_IMAGE) { /* use STDOUT for writing the image data... */ image_file = stdout; #ifndef DEBUG /* write the image to file */ gdImagePng(trends_image, image_file); #endif #ifdef DEBUG image_file = fopen("trends.png", "w"); if(image_file == NULL) printf("Could not open trends.png for writing!\n"); else { gdImagePng(trends_image, image_file); fclose(image_file); } #endif /* free memory allocated to image */ gdImageDestroy(trends_image); } } /* show user a selection of hosts and services to choose from... */ if(display_type == DISPLAY_NO_TRENDS || input_type != GET_INPUT_NONE) { /* ask the user for what host they want a report for */ if(input_type == GET_INPUT_HOST_TARGET) { printf("

    \n"); printf("
    Step 2: Select Host
    \n"); printf("

    \n"); printf("

    \n"); #ifdef LEGACY_GRAPHICAL_CGIS printf("
    \n", TRENDS_CGI); #else printf("\n", LEGACY_TRENDS_CGI); #endif printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("
    Host:\n"); printf("\n"); printf("
    \n"); printf("\n"); printf("
    \n"); printf("
    \n"); printf("

    \n"); } /* ask the user for what service they want a report for */ else if(input_type == GET_INPUT_SERVICE_TARGET) { printf("\n"); printf("

    \n"); printf("
    Step 2: Select Service
    \n"); printf("

    \n"); printf("

    \n"); #ifdef LEGACY_GRAPHICAL_CGIS printf("
    \n", TRENDS_CGI); #else printf("\n", LEGACY_TRENDS_CGI); #endif printf("\n"); printf("\n", (first_service == NULL) ? "unknown" : (char *)escape_string(first_service)); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("
    Service:\n"); printf("\n"); printf("
    \n"); printf("\n"); printf("
    \n"); printf("
    \n"); printf("

    \n"); } /* ask the user for report range and options */ else if(input_type == GET_INPUT_OPTIONS) { time(¤t_time); t = localtime(¤t_time); start_day = 1; start_year = t->tm_year + 1900; end_day = t->tm_mday; end_year = t->tm_year + 1900; printf("

    \n"); printf("
    Step 3: Select Report Options
    \n"); printf("

    \n"); printf("

    \n"); #ifdef LEGACY_GRAPHICAL_CGIS printf("
    \n", TRENDS_CGI); #else printf("\n", LEGACY_TRENDS_CGI); #endif printf("\n", escape_string(host_name)); if(display_type == DISPLAY_SERVICE_TRENDS) printf("\n", escape_string(svc_description)); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf(""); printf("\n"); printf("\n"); printf("\n"); printf(""); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n", (display_type == DISPLAY_HOST_TRENDS) ? "Host" : "Service"); printf("\n"); printf("\n"); printf("\n"); printf(""); printf("\n"); printf("\n"); printf("
    Report period:\n"); printf("\n"); printf("
    If Custom Report Period...
    Start Date (Inclusive):"); printf("\n "); printf(" ", start_day); printf("", start_year); printf("\n"); printf("\n"); printf("\n"); printf("
    End Date (Inclusive):"); printf("\n "); printf(" ", end_day); printf("", end_year); printf("\n"); printf("\n"); printf("\n"); printf("

    Assume Initial States:\n"); printf("\n"); printf("
    Assume State Retention:\n"); printf("\n"); printf("
    Assume States During Program Downtime:\n"); printf("\n"); printf("
    Include Soft States:\n"); printf("\n"); printf("
    First Assumed %s State:\n"); if(display_type == DISPLAY_HOST_TRENDS) { printf("\n"); printf("
    Backtracked Archives (To Scan For Initial States):\n"); printf("\n", backtrack_archives); printf("
    Suppress image map:
    Suppress popups:
    \n"); printf("
    \n"); printf("

    \n"); /* printf("

    \n"); printf("Note: Choosing the 'suppress image map' option will make the report run approximately twice as fast as it would otherwise, but it will prevent you from being able to zoom in on specific time periods.\n"); printf("

    \n"); */ } /* as the user whether they want a graph for a host or service */ else { printf("

    \n"); printf("
    Step 1: Select Report Type
    \n"); printf("

    \n"); printf("

    \n"); #ifdef LEGACY_GRAPHICAL_CGIS printf("
    \n", TRENDS_CGI); #else printf("\n", LEGACY_TRENDS_CGI); #endif printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("
    Type:\n"); printf("\n"); printf("
    \n"); printf("\n"); printf("
    \n"); printf("
    \n"); printf("

    \n"); } } document_footer(); /* free memory allocated to the archived state data list */ free_archived_state_list(); /* free all other allocated memory */ free_memory(); return OK; } void document_header(int use_stylesheet) { char date_time[MAX_DATETIME_LENGTH]; time_t current_time; time_t expire_time; if(mode == CREATE_HTML) { printf("Cache-Control: no-store\r\n"); printf("Pragma: no-cache\r\n"); time(¤t_time); get_time_string(¤t_time, date_time, sizeof(date_time), HTTP_DATE_TIME); printf("Last-Modified: %s\r\n", date_time); expire_time = (time_t)0; get_time_string(&expire_time, date_time, sizeof(date_time), HTTP_DATE_TIME); printf("Expires: %s\r\n", date_time); printf("Content-type: text/html; charset=utf-8\r\n\r\n"); if(embedded == TRUE) return; printf("\n"); printf("\n"); printf("\n", url_images_path); printf("\n"); printf("Nagios Trends\n"); printf("\n"); if(use_stylesheet == TRUE) { printf("\n", url_stylesheets_path, COMMON_CSS); printf("\n", url_stylesheets_path, TRENDS_CSS); } /* write JavaScript code for popup window */ if(display_type != DISPLAY_NO_TRENDS) write_popup_code(); printf("\n"); printf("\n"); /* include user SSI header */ #ifdef LEGACY_GRAPHICAL_CGIS include_ssi_files(TRENDS_CGI, SSI_HEADER); #else include_ssi_files(LEGACY_TRENDS_CGI, SSI_HEADER); #endif printf("
    \n"); } else { printf("Cache-Control: no-store\r\n"); printf("Pragma: no-cache\r\n"); time(¤t_time); get_time_string(¤t_time, date_time, sizeof(date_time), HTTP_DATE_TIME); printf("Last-Modified: %s\r\n", date_time); expire_time = (time_t)0L; get_time_string(&expire_time, date_time, sizeof(date_time), HTTP_DATE_TIME); printf("Expires: %s\r\n", date_time); printf("Content-Type: image/png\r\n\r\n"); } return; } void document_footer(void) { if(embedded == TRUE) return; if(mode == CREATE_HTML) { /* include user SSI footer */ #ifdef LEGACY_GRAPHICAL_CGIS include_ssi_files(TRENDS_CGI, SSI_FOOTER); #else include_ssi_files(LEGACY_TRENDS_CGI, SSI_FOOTER); #endif printf("\n"); printf("\n"); } return; } int process_cgivars(void) { char **variables; int error = FALSE; int x; variables = getcgivars(); for(x = 0; variables[x] != NULL; x++) { /* do some basic length checking on the variable identifier to prevent buffer overflows */ if(strlen(variables[x]) >= MAX_INPUT_BUFFER - 1) { continue; } /* we found the host argument */ else if(!strcmp(variables[x], "host")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if((host_name = (char *)strdup(variables[x])) == NULL) host_name = ""; strip_html_brackets(host_name); display_type = DISPLAY_HOST_TRENDS; } /* we found the node width argument */ else if(!strcmp(variables[x], "service")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if((svc_description = (char *)strdup(variables[x])) == NULL) svc_description = ""; strip_html_brackets(svc_description); display_type = DISPLAY_SERVICE_TRENDS; } /* we found first time argument */ else if(!strcmp(variables[x], "t1")) { x++; if(variables[x] == NULL) { error = TRUE; break; } t1 = (time_t)strtoul(variables[x], NULL, 10); timeperiod_type = TIMEPERIOD_CUSTOM; } /* we found first time argument */ else if(!strcmp(variables[x], "t2")) { x++; if(variables[x] == NULL) { error = TRUE; break; } t2 = (time_t)strtoul(variables[x], NULL, 10); timeperiod_type = TIMEPERIOD_CUSTOM; } /* we found the image creation option */ else if(!strcmp(variables[x], "createimage")) { mode = CREATE_IMAGE; } /* we found the assume initial states option */ else if(!strcmp(variables[x], "assumeinitialstates")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(!strcmp(variables[x], "yes")) assume_initial_states = TRUE; else assume_initial_states = FALSE; } /* we found the initial assumed host state option */ else if(!strcmp(variables[x], "initialassumedhoststate")) { x++; if(variables[x] == NULL) { error = TRUE; break; } initial_assumed_host_state = atoi(variables[x]); } /* we found the initial assumed service state option */ else if(!strcmp(variables[x], "initialassumedservicestate")) { x++; if(variables[x] == NULL) { error = TRUE; break; } initial_assumed_service_state = atoi(variables[x]); } /* we found the assume state during program not running option */ else if(!strcmp(variables[x], "assumestatesduringnotrunning")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(!strcmp(variables[x], "yes")) assume_states_during_notrunning = TRUE; else assume_states_during_notrunning = FALSE; } /* we found the assume state retention option */ else if(!strcmp(variables[x], "assumestateretention")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(!strcmp(variables[x], "yes")) assume_state_retention = TRUE; else assume_state_retention = FALSE; } /* we found the include soft states option */ else if(!strcmp(variables[x], "includesoftstates")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(!strcmp(variables[x], "yes")) include_soft_states = TRUE; else include_soft_states = FALSE; } /* we found the zoom factor argument */ else if(!strcmp(variables[x], "zoom")) { x++; if(variables[x] == NULL) { error = TRUE; break; } zoom_factor = atoi(variables[x]); if(zoom_factor == 0) zoom_factor = 1; } /* we found the backtrack archives argument */ else if(!strcmp(variables[x], "backtrack")) { x++; if(variables[x] == NULL) { error = TRUE; break; } backtrack_archives = atoi(variables[x]); if(backtrack_archives < 0) backtrack_archives = 0; if(backtrack_archives > MAX_ARCHIVE_BACKTRACKS) backtrack_archives = MAX_ARCHIVE_BACKTRACKS; } /* we found the standard timeperiod argument */ else if(!strcmp(variables[x], "timeperiod")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(!strcmp(variables[x], "today")) timeperiod_type = TIMEPERIOD_TODAY; else if(!strcmp(variables[x], "yesterday")) timeperiod_type = TIMEPERIOD_YESTERDAY; else if(!strcmp(variables[x], "thisweek")) timeperiod_type = TIMEPERIOD_THISWEEK; else if(!strcmp(variables[x], "lastweek")) timeperiod_type = TIMEPERIOD_LASTWEEK; else if(!strcmp(variables[x], "thismonth")) timeperiod_type = TIMEPERIOD_THISMONTH; else if(!strcmp(variables[x], "lastmonth")) timeperiod_type = TIMEPERIOD_LASTMONTH; else if(!strcmp(variables[x], "thisquarter")) timeperiod_type = TIMEPERIOD_THISQUARTER; else if(!strcmp(variables[x], "lastquarter")) timeperiod_type = TIMEPERIOD_LASTQUARTER; else if(!strcmp(variables[x], "thisyear")) timeperiod_type = TIMEPERIOD_THISYEAR; else if(!strcmp(variables[x], "lastyear")) timeperiod_type = TIMEPERIOD_LASTYEAR; else if(!strcmp(variables[x], "nextproblem")) timeperiod_type = TIMEPERIOD_NEXTPROBLEM; else if(!strcmp(variables[x], "last24hours")) timeperiod_type = TIMEPERIOD_LAST24HOURS; else if(!strcmp(variables[x], "last7days")) timeperiod_type = TIMEPERIOD_LAST7DAYS; else if(!strcmp(variables[x], "last31days")) timeperiod_type = TIMEPERIOD_LAST31DAYS; else if(!strcmp(variables[x], "custom")) timeperiod_type = TIMEPERIOD_CUSTOM; else continue; convert_timeperiod_to_times(timeperiod_type); } /* we found time argument */ else if(!strcmp(variables[x], "smon")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(timeperiod_type != TIMEPERIOD_CUSTOM) continue; start_month = atoi(variables[x]); timeperiod_type = TIMEPERIOD_CUSTOM; compute_time_from_parts = TRUE; } /* we found time argument */ else if(!strcmp(variables[x], "sday")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(timeperiod_type != TIMEPERIOD_CUSTOM) continue; start_day = atoi(variables[x]); timeperiod_type = TIMEPERIOD_CUSTOM; compute_time_from_parts = TRUE; } /* we found time argument */ else if(!strcmp(variables[x], "syear")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(timeperiod_type != TIMEPERIOD_CUSTOM) continue; start_year = atoi(variables[x]); timeperiod_type = TIMEPERIOD_CUSTOM; compute_time_from_parts = TRUE; } /* we found time argument */ else if(!strcmp(variables[x], "smin")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(timeperiod_type != TIMEPERIOD_CUSTOM) continue; start_minute = atoi(variables[x]); timeperiod_type = TIMEPERIOD_CUSTOM; compute_time_from_parts = TRUE; } /* we found time argument */ else if(!strcmp(variables[x], "ssec")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(timeperiod_type != TIMEPERIOD_CUSTOM) continue; start_second = atoi(variables[x]); timeperiod_type = TIMEPERIOD_CUSTOM; compute_time_from_parts = TRUE; } /* we found time argument */ else if(!strcmp(variables[x], "shour")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(timeperiod_type != TIMEPERIOD_CUSTOM) continue; start_hour = atoi(variables[x]); timeperiod_type = TIMEPERIOD_CUSTOM; compute_time_from_parts = TRUE; } /* we found time argument */ else if(!strcmp(variables[x], "emon")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(timeperiod_type != TIMEPERIOD_CUSTOM) continue; end_month = atoi(variables[x]); timeperiod_type = TIMEPERIOD_CUSTOM; compute_time_from_parts = TRUE; } /* we found time argument */ else if(!strcmp(variables[x], "eday")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(timeperiod_type != TIMEPERIOD_CUSTOM) continue; end_day = atoi(variables[x]); timeperiod_type = TIMEPERIOD_CUSTOM; compute_time_from_parts = TRUE; } /* we found time argument */ else if(!strcmp(variables[x], "eyear")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(timeperiod_type != TIMEPERIOD_CUSTOM) continue; end_year = atoi(variables[x]); timeperiod_type = TIMEPERIOD_CUSTOM; compute_time_from_parts = TRUE; } /* we found time argument */ else if(!strcmp(variables[x], "emin")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(timeperiod_type != TIMEPERIOD_CUSTOM) continue; end_minute = atoi(variables[x]); timeperiod_type = TIMEPERIOD_CUSTOM; compute_time_from_parts = TRUE; } /* we found time argument */ else if(!strcmp(variables[x], "esec")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(timeperiod_type != TIMEPERIOD_CUSTOM) continue; end_second = atoi(variables[x]); timeperiod_type = TIMEPERIOD_CUSTOM; compute_time_from_parts = TRUE; } /* we found time argument */ else if(!strcmp(variables[x], "ehour")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(timeperiod_type != TIMEPERIOD_CUSTOM) continue; end_hour = atoi(variables[x]); timeperiod_type = TIMEPERIOD_CUSTOM; compute_time_from_parts = TRUE; } /* we found the embed option */ else if(!strcmp(variables[x], "embedded")) embedded = TRUE; /* we found the noheader option */ else if(!strcmp(variables[x], "noheader")) display_header = FALSE; /* we found the nopopups option */ else if(!strcmp(variables[x], "nopopups")) display_popups = FALSE; /* we found the nomap option */ else if(!strcmp(variables[x], "nomap")) { display_popups = FALSE; use_map = FALSE; } /* we found the input option */ else if(!strcmp(variables[x], "input")) { x++; if(variables[x] == NULL) { error = TRUE; break; } if(!strcmp(variables[x], "gethost")) input_type = GET_INPUT_HOST_TARGET; else if(!strcmp(variables[x], "getservice")) input_type = GET_INPUT_SERVICE_TARGET; else if(!strcmp(variables[x], "getoptions")) input_type = GET_INPUT_OPTIONS; else input_type = GET_INPUT_TARGET_TYPE; } /* we found the small image option */ else if(!strcmp(variables[x], "smallimage")) small_image = TRUE; } /* free memory allocated to the CGI variables */ free_cgivars(variables); return error; } /* top level routine for graphic all trend data */ void graph_all_trend_data(void) { archived_state *temp_as; archived_state *last_as; time_t a; time_t b; time_t current_time; int current_state = AS_NO_DATA; int have_some_real_data = FALSE; hoststatus *hststatus = NULL; servicestatus *svcstatus = NULL; unsigned long wobble = 300; time_t initial_assumed_time; int initial_assumed_state = AS_SVC_OK; int error = FALSE; time(¤t_time); /* if left hand of graph is after current time, we can't do anything at all.... */ if(t1 > current_time) return; /* find current state for host or service */ if(display_type == DISPLAY_HOST_TRENDS) hststatus = find_hoststatus(host_name); else svcstatus = find_servicestatus(host_name, svc_description); /************************************/ /* INSERT CURRENT STATE (IF WE CAN) */ /************************************/ /* if current time DOES NOT fall within graph bounds, so we can't do anything as far as assuming current state */ /* the "wobble" value is necessary because when the CGI is called to do the PNG generation, t2 will actually be less that current_time by a bit */ /* if we don't have any data, assume current state (if possible) */ if(as_list == NULL && current_time > t1 && current_time < (time_t)(t2 + wobble)) { /* we don't have any historical information, but the current time falls within the reporting period, so use */ /* the current status of the host/service as the starting data */ if(display_type == DISPLAY_HOST_TRENDS) { if(hststatus != NULL) { if(hststatus->status == SD_HOST_DOWN) last_known_state = AS_HOST_DOWN; else if(hststatus->status == SD_HOST_UNREACHABLE) last_known_state = AS_HOST_UNREACHABLE; else last_known_state = AS_HOST_UP; /* add a dummy archived state item, so something can get graphed */ add_archived_state(last_known_state, AS_HARD_STATE, t1, "Current Host State Assumed (Faked Log Entry)"); } } else { if(svcstatus != NULL) { if(svcstatus->status == SERVICE_OK) last_known_state = AS_SVC_OK; else if(svcstatus->status == SERVICE_WARNING) last_known_state = AS_SVC_WARNING; else if(svcstatus->status == SERVICE_CRITICAL) last_known_state = AS_SVC_CRITICAL; else if(svcstatus->status == SERVICE_UNKNOWN) last_known_state = AS_SVC_UNKNOWN; /* add a dummy archived state item, so something can get graphed */ add_archived_state(last_known_state, AS_HARD_STATE, t1, "Current Service State Assumed (Faked Log Entry)"); } } } /******************************************/ /* INSERT FIRST ASSUMED STATE (IF WE CAN) */ /******************************************/ if((display_type == DISPLAY_HOST_TRENDS && initial_assumed_host_state != AS_NO_DATA) || (display_type == DISPLAY_SERVICE_TRENDS && initial_assumed_service_state != AS_NO_DATA)) { /* see if its okay to assume initial state for this subject */ error = FALSE; if(display_type == DISPLAY_SERVICE_TRENDS) { if(initial_assumed_service_state != AS_SVC_OK && initial_assumed_service_state != AS_SVC_WARNING && initial_assumed_service_state != AS_SVC_UNKNOWN && initial_assumed_service_state != AS_SVC_CRITICAL && initial_assumed_service_state != AS_CURRENT_STATE) error = TRUE; else initial_assumed_state = initial_assumed_service_state; if(initial_assumed_service_state == AS_CURRENT_STATE && svcstatus == NULL) error = TRUE; } else { if(initial_assumed_host_state != AS_HOST_UP && initial_assumed_host_state != AS_HOST_DOWN && initial_assumed_host_state != AS_HOST_UNREACHABLE && initial_assumed_host_state != AS_CURRENT_STATE) error = TRUE; else initial_assumed_state = initial_assumed_host_state; if(initial_assumed_host_state == AS_CURRENT_STATE && hststatus == NULL) error = TRUE; } /* get the current state if applicable */ if(((display_type == DISPLAY_HOST_TRENDS && initial_assumed_host_state == AS_CURRENT_STATE) || (display_type == DISPLAY_SERVICE_TRENDS && initial_assumed_service_state == AS_CURRENT_STATE)) && error == FALSE) { if(display_type == DISPLAY_HOST_TRENDS) { switch(hststatus->status) { case SD_HOST_DOWN: initial_assumed_state = AS_HOST_DOWN; break; case SD_HOST_UNREACHABLE: initial_assumed_state = AS_HOST_UNREACHABLE; break; case SD_HOST_UP: initial_assumed_state = AS_HOST_UP; break; default: error = TRUE; break; } } else { switch(svcstatus->status) { case SERVICE_OK: initial_assumed_state = AS_SVC_OK; break; case SERVICE_WARNING: initial_assumed_state = AS_SVC_WARNING; break; case SERVICE_UNKNOWN: initial_assumed_state = AS_SVC_UNKNOWN; break; case SERVICE_CRITICAL: initial_assumed_state = AS_SVC_CRITICAL; break; default: error = TRUE; break; } } } if(error == FALSE) { /* add this assumed state entry before any entries in the list and <= t1 */ if(as_list == NULL) initial_assumed_time = t1; else if(as_list->time_stamp > t1) initial_assumed_time = t1; else initial_assumed_time = as_list->time_stamp - 1; if(display_type == DISPLAY_HOST_TRENDS) add_archived_state(initial_assumed_state, AS_HARD_STATE, initial_assumed_time, "First Host State Assumed (Faked Log Entry)"); else add_archived_state(initial_assumed_state, AS_HARD_STATE, initial_assumed_time, "First Service State Assumed (Faked Log Entry)"); } } /**************************************/ /* BAIL OUT IF WE DON'T HAVE ANYTHING */ /**************************************/ have_some_real_data = FALSE; for(temp_as = as_list; temp_as != NULL; temp_as = temp_as->next) { if(temp_as->entry_type != AS_NO_DATA && temp_as->entry_type != AS_PROGRAM_START && temp_as->entry_type != AS_PROGRAM_END) { have_some_real_data = TRUE; break; } } if(have_some_real_data == FALSE) return; /* if we're creating the HTML, start map code... */ if(mode == CREATE_HTML) printf("\n"); last_as = NULL; earliest_time = t2; latest_time = t1; #ifdef DEBUG printf("--- BEGINNING/MIDDLE SECTION ---
    \n"); #endif /**********************************/ /* BEGINNING/MIDDLE SECTION */ /**********************************/ for(temp_as = as_list; temp_as != NULL; temp_as = temp_as->next) { /* keep this as last known state if this is the first entry or if it occurs before the starting point of the graph */ if((temp_as->time_stamp <= t1 || temp_as == as_list) && (temp_as->entry_type != AS_NO_DATA && temp_as->entry_type != AS_PROGRAM_END && temp_as->entry_type != AS_PROGRAM_START)) { last_known_state = temp_as->entry_type; #ifdef DEBUG printf("SETTING LAST KNOWN STATE=%d
    \n", last_known_state); #endif } /* skip this entry if it occurs before the starting point of the graph */ if(temp_as->time_stamp <= t1) { #ifdef DEBUG printf("SKIPPING PRE-EVENT: %d @ %lu
    \n", temp_as->entry_type, temp_as->time_stamp); #endif last_as = temp_as; continue; } /* graph this span if we're not on the first item */ if(last_as != NULL) { a = last_as->time_stamp; b = temp_as->time_stamp; /* we've already passed the last time displayed in the graph */ if(a > t2) break; /* only graph this data if its on the graph */ else if(b > t1) { /* clip last time if it exceeds graph limits */ if(b > t2) b = t2; /* clip first time if it precedes graph limits */ if(a < t1) a = t1; /* save this time if its the earliest we've graphed */ if(a < earliest_time) { earliest_time = a; earliest_state = last_as->entry_type; } /* save this time if its the latest we've graphed */ if(b > latest_time) { latest_time = b; latest_state = last_as->entry_type; } /* compute availability times for this chunk */ graph_trend_data(last_as->entry_type, temp_as->entry_type, last_as->time_stamp, a, b, last_as->state_info); /* return if we've reached the end of the graph limits */ if(b >= t2) { last_as = temp_as; break; } } } /* keep track of the last item */ last_as = temp_as; } #ifdef DEBUG printf("--- END SECTION ---
    \n"); #endif /**********************************/ /* END SECTION */ /**********************************/ if(last_as != NULL) { /* don't process an entry that is beyond the limits of the graph */ if(last_as->time_stamp < t2) { time(¤t_time); b = current_time; if(b > t2) b = t2; a = last_as->time_stamp; if(a < t1) a = t1; /* fake the current state (it doesn't really matter for graphing) */ if(display_type == DISPLAY_HOST_TRENDS) current_state = AS_HOST_UP; else current_state = AS_SVC_OK; /* compute availability times for last state */ graph_trend_data(last_as->entry_type, current_state, a, a, b, last_as->state_info); } } /* if we're creating the HTML, close the map code */ if(mode == CREATE_HTML) printf("
    \n"); return; } /* graphs trend data */ void graph_trend_data(int first_state, int last_state, time_t real_start_time, time_t start_time, time_t end_time, char *state_info) { int start_state; int start_pixel = 0; int end_pixel = 0; int color_to_use = 0; int height = 0; double start_pixel_ratio; double end_pixel_ratio; char temp_buffer[MAX_INPUT_BUFFER]; char state_string[MAX_INPUT_BUFFER]; char end_timestring[MAX_INPUT_BUFFER]; char start_timestring[MAX_INPUT_BUFFER]; time_t center_time; time_t next_start_time; time_t next_end_time; int days = 0; int hours = 0; int minutes = 0; int seconds = 0; /* can't graph if we don't have data... */ if(first_state == AS_NO_DATA || last_state == AS_NO_DATA) return; if(first_state == AS_PROGRAM_START && (last_state == AS_PROGRAM_END || last_state == AS_PROGRAM_START)) { if(assume_initial_states == FALSE) return; } if(first_state == AS_PROGRAM_END) { if(assume_states_during_notrunning == TRUE) first_state = last_known_state; else return; } /* special case if first entry was program start */ if(first_state == AS_PROGRAM_START) { #ifdef DEBUG printf("First state=program start!\n"); #endif if(assume_initial_states == TRUE) { #ifdef DEBUG printf("\tWe are assuming initial states...\n"); #endif if(assume_state_retention == TRUE) { start_state = last_known_state; #ifdef DEBUG printf("\tWe are assuming state retention (%d)...\n", start_state); #endif } else { #ifdef DEBUG printf("\tWe are NOT assuming state retention...\n"); #endif if(display_type == DISPLAY_HOST_TRENDS) start_state = AS_HOST_UP; else start_state = AS_SVC_OK; } } else { #ifdef DEBUG printf("We ARE NOT assuming initial states!\n"); #endif return; } } else { start_state = first_state; last_known_state = first_state; } #ifdef DEBUG printf("Graphing state %d\n", start_state); printf("\tfrom %s", ctime(&start_time)); printf("\tto %s", ctime(&end_time)); #endif if(start_time < t1) start_time = t1; if(end_time > t2) end_time = t2; if(end_time < t1 || start_time > t2) return; /* calculate the first and last pixels to use */ if(start_time == t1) start_pixel = 0; else { start_pixel_ratio = ((double)(start_time - t1)) / ((double)(t2 - t1)); start_pixel = (int)(start_pixel_ratio * (drawing_width - 1)); } if(end_time == t1) end_pixel = 0; else { end_pixel_ratio = ((double)(end_time - t1)) / ((double)(t2 - t1)); end_pixel = (int)(end_pixel_ratio * (drawing_width - 1)); } #ifdef DEBUG printf("\tPixel %d to %d\n\n", start_pixel, end_pixel); #endif /* we're creating the image, so draw... */ if(mode == CREATE_IMAGE) { /* figure out the color to use for drawing */ switch(start_state) { case AS_HOST_UP: color_to_use = color_green; height = 60; break; case AS_HOST_DOWN: color_to_use = color_red; height = 40; break; case AS_HOST_UNREACHABLE: color_to_use = color_darkred; height = 20; break; case AS_SVC_OK: color_to_use = color_green; height = 80; break; case AS_SVC_WARNING: color_to_use = color_yellow; height = 60; break; case AS_SVC_UNKNOWN: color_to_use = color_orange; height = 40; break; case AS_SVC_CRITICAL: color_to_use = color_red; height = 20; break; default: color_to_use = color_black; height = 0; break; } /* draw a rectangle */ if(start_state != AS_NO_DATA) gdImageFilledRectangle(trends_image, start_pixel + drawing_x_offset, drawing_height - height + drawing_y_offset, end_pixel + drawing_x_offset, drawing_height + drawing_y_offset, color_to_use); } /* else we're creating the HTML, so write map area code... */ else { /* figure out the the state string to use */ switch(start_state) { case AS_HOST_UP: strcpy(state_string, "UP"); height = 60; break; case AS_HOST_DOWN: strcpy(state_string, "DOWN"); height = 40; break; case AS_HOST_UNREACHABLE: strcpy(state_string, "UNREACHABLE"); height = 20; break; case AS_SVC_OK: strcpy(state_string, "OK"); height = 80; break; case AS_SVC_WARNING: strcpy(state_string, "WARNING"); height = 60; break; case AS_SVC_UNKNOWN: strcpy(state_string, "UNKNOWN"); height = 40; break; case AS_SVC_CRITICAL: strcpy(state_string, "CRITICAL"); height = 20; break; default: strcpy(state_string, "?"); height = 5; break; } /* get the center of this time range */ center_time = start_time + ((end_time - start_time) / 2); /* determine next start and end time range with zoom factor */ if(zoom_factor > 0) { next_start_time = center_time - (((t2 - t1) / 2) / zoom_factor); next_end_time = center_time + (((t2 - t1) / 2) / zoom_factor); } else { next_start_time = center_time + (((t2 - t1) / 2) * zoom_factor); next_end_time = center_time - (((t2 - t1) / 2) * zoom_factor); } printf(" 0) printf("&backtrack=%d", backtrack_archives); printf("&zoom=%d", zoom_factor); printf("' "); /* display popup text */ if(display_popups == TRUE) { snprintf(start_timestring, sizeof(start_timestring) - 1, "%s", ctime(&real_start_time)); start_timestring[sizeof(start_timestring) - 1] = '\x0'; start_timestring[strlen(start_timestring) - 1] = '\x0'; snprintf(end_timestring, sizeof(end_timestring) - 1, "%s", ctime(&end_time)); end_timestring[sizeof(end_timestring) - 1] = '\x0'; end_timestring[strlen(end_timestring) - 1] = '\x0'; /* calculate total time in this state */ get_time_breakdown((time_t)(end_time - start_time), &days, &hours, &minutes, &seconds); /* sanitize plugin output */ sanitize_plugin_output(state_info); printf("onMouseOver='showPopup(\""); snprintf(temp_buffer, sizeof(temp_buffer) - 1, "%s
    Time Range: %s to %s
    Duration: %dd %dh %dm %ds
    State Info: %s", state_string, start_timestring, end_timestring, days, hours, minutes, seconds, (state_info == NULL) ? "N/A" : state_info); temp_buffer[sizeof(temp_buffer) - 1] = '\x0'; printf("%s", temp_buffer); printf("\",event)' onMouseOut='hidePopup()'"); } printf(">\n"); } /* calculate time in this state */ switch(start_state) { case AS_HOST_UP: time_up += (unsigned long)(end_time - start_time); break; case AS_HOST_DOWN: time_down += (unsigned long)(end_time - start_time); break; case AS_HOST_UNREACHABLE: time_unreachable += (unsigned long)(end_time - start_time); break; case AS_SVC_OK: time_ok += (unsigned long)(end_time - start_time); break; case AS_SVC_WARNING: time_warning += (unsigned long)(end_time - start_time); break; case AS_SVC_UNKNOWN: time_unknown += (unsigned long)(end_time - start_time); break; case AS_SVC_CRITICAL: time_critical += (unsigned long)(end_time - start_time); break; default: break; } return; } /* convert current host state to archived state value */ int convert_host_state_to_archived_state(int current_status) { if(current_status == SD_HOST_UP) return AS_HOST_UP; if(current_status == SD_HOST_DOWN) return AS_HOST_DOWN; if(current_status == SD_HOST_UNREACHABLE) return AS_HOST_UNREACHABLE; return AS_NO_DATA; } /* convert current service state to archived state value */ int convert_service_state_to_archived_state(int current_status) { if(current_status == SERVICE_OK) return AS_SVC_OK; if(current_status == SERVICE_UNKNOWN) return AS_SVC_UNKNOWN; if(current_status == SERVICE_WARNING) return AS_SVC_WARNING; if(current_status == SERVICE_CRITICAL) return AS_SVC_CRITICAL; return AS_NO_DATA; } /* adds an archived state entry */ void add_archived_state(int entry_type, int state_type, time_t time_stamp, char *state_info) { archived_state *last_as = NULL; archived_state *temp_as = NULL; archived_state *new_as = NULL; #ifdef DEBUG printf("Added state %d @ %s", state_type, ctime(&time_stamp)); #endif /* allocate memory for the new entry */ new_as = (archived_state *)malloc(sizeof(archived_state)); if(new_as == NULL) return; /* allocate memory fo the state info */ if(state_info != NULL) { new_as->state_info = (char *)malloc(strlen(state_info) + 1); if(new_as->state_info != NULL) strcpy(new_as->state_info, state_info); } else new_as->state_info = NULL; new_as->entry_type = entry_type; new_as->processed_state = entry_type; new_as->state_type = state_type; new_as->time_stamp = time_stamp; /* add the new entry to the list in memory, sorted by time */ last_as = as_list; for(temp_as = as_list; temp_as != NULL; temp_as = temp_as->next) { if(new_as->time_stamp < temp_as->time_stamp) { new_as->next = temp_as; if(temp_as == as_list) as_list = new_as; else last_as->next = new_as; break; } else last_as = temp_as; } if(as_list == NULL) { new_as->next = NULL; as_list = new_as; } else if(temp_as == NULL) { new_as->next = NULL; last_as->next = new_as; } return; } /* frees memory allocated to the archived state list */ void free_archived_state_list(void) { archived_state *this_as = NULL; archived_state *next_as = NULL; for(this_as = as_list; this_as != NULL;) { next_as = this_as->next; if(this_as->state_info != NULL) free(this_as->state_info); free(this_as); this_as = next_as; } as_list = NULL; return; } /* reads log files for archived state data */ void read_archived_state_data(void) { char filename[MAX_FILENAME_LENGTH]; int newest_archive = 0; int oldest_archive = 0; int current_archive; #ifdef DEBUG printf("Determining archives to use...\n"); #endif /* determine earliest archive to use */ oldest_archive = determine_archive_to_use_from_time(t1); if(log_rotation_method != LOG_ROTATION_NONE) oldest_archive += backtrack_archives; /* determine most recent archive to use */ newest_archive = determine_archive_to_use_from_time(t2); if(oldest_archive < newest_archive) oldest_archive = newest_archive; #ifdef DEBUG printf("Oldest archive: %d\n", oldest_archive); printf("Newest archive: %d\n", newest_archive); #endif /* read in all the necessary archived logs */ for(current_archive = newest_archive; current_archive <= oldest_archive; current_archive++) { /* get the name of the log file that contains this archive */ get_log_archive_to_use(current_archive, filename, sizeof(filename) - 1); #ifdef DEBUG printf("\tCurrent archive: %d (%s)\n", current_archive, filename); #endif /* scan the log file for archived state data */ scan_log_file_for_archived_state_data(filename); } return; } /* grabs archives state data from a log file */ void scan_log_file_for_archived_state_data(char *filename) { char *input = NULL; char *input2 = NULL; char entry_host_name[MAX_INPUT_BUFFER]; char entry_svc_description[MAX_INPUT_BUFFER]; char *plugin_output = NULL; char *temp_buffer = NULL; time_t time_stamp; mmapfile *thefile = NULL; int state_type = 0; /* print something so browser doesn't time out */ if(mode == CREATE_HTML) { printf(" "); fflush(NULL); } if((thefile = mmap_fopen(filename)) == NULL) { #ifdef DEBUG printf("Could not open file '%s' for reading.\n", filename); #endif return; } #ifdef DEBUG printf("Scanning log file '%s' for archived state data...\n", filename); #endif while(1) { /* free memory */ free(input); free(input2); input = NULL; input2 = NULL; /* read the next line */ if((input = mmap_fgets(thefile)) == NULL) break; strip(input); if((input2 = strdup(input)) == NULL) continue; temp_buffer = my_strtok(input2, "]"); time_stamp = (temp_buffer == NULL) ? (time_t)0 : (time_t)strtoul(temp_buffer + 1, NULL, 10); /* program starts/restarts */ if(strstr(input, " starting...")) add_archived_state(AS_PROGRAM_START, AS_NO_DATA, time_stamp, "Program start"); if(strstr(input, " restarting...")) add_archived_state(AS_PROGRAM_START, AS_NO_DATA, time_stamp, "Program restart"); /* program stops */ if(strstr(input, " shutting down...")) add_archived_state(AS_PROGRAM_END, AS_NO_DATA, time_stamp, "Normal program termination"); if(strstr(input, "Bailing out")) add_archived_state(AS_PROGRAM_END, AS_NO_DATA, time_stamp, "Abnormal program termination"); if(display_type == DISPLAY_HOST_TRENDS) { if(strstr(input, "HOST ALERT:") || strstr(input, "INITIAL HOST STATE:") || strstr(input, "CURRENT HOST STATE:")) { free(input2); if((input2 = strdup(input)) == NULL) continue; /* get host name */ temp_buffer = my_strtok(input2, "]"); temp_buffer = my_strtok(NULL, ":"); temp_buffer = my_strtok(NULL, ";"); strncpy(entry_host_name, (temp_buffer == NULL) ? "" : temp_buffer + 1, sizeof(entry_host_name)); entry_host_name[sizeof(entry_host_name) - 1] = '\x0'; if(strcmp(host_name, entry_host_name)) continue; /* state types */ if(strstr(input, ";SOFT;")) { if(include_soft_states == FALSE) continue; state_type = AS_SOFT_STATE; } if(strstr(input, ";HARD;")) state_type = AS_HARD_STATE; /* get the plugin output */ temp_buffer = my_strtok(NULL, ";"); temp_buffer = my_strtok(NULL, ";"); temp_buffer = my_strtok(NULL, ";"); plugin_output = my_strtok(NULL, "\n"); if(strstr(input, ";DOWN;")) add_archived_state(AS_HOST_DOWN, state_type, time_stamp, plugin_output); else if(strstr(input, ";UNREACHABLE;")) add_archived_state(AS_HOST_UNREACHABLE, state_type, time_stamp, plugin_output); else if(strstr(input, ";RECOVERY") || strstr(input, ";UP;")) add_archived_state(AS_HOST_UP, state_type, time_stamp, plugin_output); else add_archived_state(AS_NO_DATA, AS_NO_DATA, time_stamp, plugin_output); } } if(display_type == DISPLAY_SERVICE_TRENDS) { if(strstr(input, "SERVICE ALERT:") || strstr(input, "INITIAL SERVICE STATE:") || strstr(input, "CURRENT SERVICE STATE:")) { free(input2); if((input2 = strdup(input)) == NULL) continue; /* get host name */ temp_buffer = my_strtok(input2, "]"); temp_buffer = my_strtok(NULL, ":"); temp_buffer = my_strtok(NULL, ";"); strncpy(entry_host_name, (temp_buffer == NULL) ? "" : temp_buffer + 1, sizeof(entry_host_name)); entry_host_name[sizeof(entry_host_name) - 1] = '\x0'; if(strcmp(host_name, entry_host_name)) continue; /* get service description */ temp_buffer = my_strtok(NULL, ";"); strncpy(entry_svc_description, (temp_buffer == NULL) ? "" : temp_buffer, sizeof(entry_svc_description)); entry_svc_description[sizeof(entry_svc_description) - 1] = '\x0'; if(strcmp(svc_description, entry_svc_description)) continue; /* state types */ if(strstr(input, ";SOFT;")) { if(include_soft_states == FALSE) continue; state_type = AS_SOFT_STATE; } if(strstr(input, ";HARD;")) state_type = AS_HARD_STATE; /* get the plugin output */ temp_buffer = my_strtok(NULL, ";"); temp_buffer = my_strtok(NULL, ";"); temp_buffer = my_strtok(NULL, ";"); plugin_output = my_strtok(NULL, "\n"); if(strstr(input, ";CRITICAL;")) add_archived_state(AS_SVC_CRITICAL, state_type, time_stamp, plugin_output); else if(strstr(input, ";WARNING;")) add_archived_state(AS_SVC_WARNING, state_type, time_stamp, plugin_output); else if(strstr(input, ";UNKNOWN;")) add_archived_state(AS_SVC_UNKNOWN, state_type, time_stamp, plugin_output); else if(strstr(input, ";RECOVERY;") || strstr(input, ";OK;")) add_archived_state(AS_SVC_OK, state_type, time_stamp, plugin_output); else add_archived_state(AS_NO_DATA, AS_NO_DATA, time_stamp, plugin_output); } } } /* free memory and close the file */ free(input); free(input2); mmap_fclose(thefile); return; } /* write JavaScript code and layer for popup window */ void write_popup_code(void) { char *border_color = "#000000"; char *background_color = "#ffffcc"; int border = 1; int padding = 3; int x_offset = 3; int y_offset = 3; printf("\n"); return; } /* write timestamps */ void draw_timestamps(void) { int last_timestamp = 0; archived_state *temp_as; double start_pixel_ratio; int start_pixel; if(mode != CREATE_IMAGE) return; /* draw first timestamp */ draw_timestamp(0, t1); last_timestamp = 0; for(temp_as = as_list; temp_as != NULL; temp_as = temp_as->next) { if(temp_as->time_stamp < t1 || temp_as->time_stamp > t2) continue; start_pixel_ratio = ((double)(temp_as->time_stamp - t1)) / ((double)(t2 - t1)); start_pixel = (int)(start_pixel_ratio * (drawing_width - 1)); /* draw start timestamp if possible */ if((start_pixel > last_timestamp + MIN_TIMESTAMP_SPACING) && (start_pixel < drawing_width - 1 - MIN_TIMESTAMP_SPACING)) { draw_timestamp(start_pixel, temp_as->time_stamp); last_timestamp = start_pixel; } } /* draw last timestamp */ draw_timestamp(drawing_width - 1, t2); return; } /* write timestamp below graph */ void draw_timestamp(int ts_pixel, time_t ts_time) { char temp_buffer[MAX_INPUT_BUFFER]; int string_height; int string_width; snprintf(temp_buffer, sizeof(temp_buffer) - 1, "%s", ctime(&ts_time)); temp_buffer[sizeof(temp_buffer) - 1] = '\x0'; temp_buffer[strlen(temp_buffer) - 1] = '\x0'; string_height = gdFontSmall->h; string_width = gdFontSmall->w * strlen(temp_buffer); if(small_image == FALSE) gdImageStringUp(trends_image, gdFontSmall, ts_pixel + drawing_x_offset - (string_height / 2), drawing_y_offset + drawing_height + string_width + 5, (unsigned char *)temp_buffer, color_black); /* draw a dashed vertical line at this point */ if(ts_pixel > 0 && ts_pixel < (drawing_width - 1)) draw_dashed_line(ts_pixel + drawing_x_offset, drawing_y_offset, ts_pixel + drawing_x_offset, drawing_y_offset + drawing_height, color_black); return; } /* draw total state times */ void draw_time_breakdowns(void) { char temp_buffer[MAX_INPUT_BUFFER]; unsigned long total_time = 0L; unsigned long total_state_time; unsigned long time_indeterminate = 0L; if(mode == CREATE_HTML) return; if(small_image == TRUE) return; total_time = (unsigned long)(t2 - t1); if(display_type == DISPLAY_HOST_TRENDS) total_state_time = time_up + time_down + time_unreachable; else total_state_time = time_ok + time_warning + time_unknown + time_critical; if(total_state_time >= total_time) time_indeterminate = 0L; else time_indeterminate = total_time - total_state_time; if(display_type == DISPLAY_HOST_TRENDS) { get_time_breakdown_string(total_time, time_up, "Up", &temp_buffer[0], sizeof(temp_buffer)); gdImageString(trends_image, gdFontSmall, drawing_x_offset + drawing_width + 20, drawing_y_offset + 5, (unsigned char *)temp_buffer, color_darkgreen); gdImageString(trends_image, gdFontSmall, drawing_x_offset - 10 - (gdFontSmall->w * 2), drawing_y_offset + 5, (unsigned char *)"Up", color_darkgreen); get_time_breakdown_string(total_time, time_down, "Down", &temp_buffer[0], sizeof(temp_buffer)); gdImageString(trends_image, gdFontSmall, drawing_x_offset + drawing_width + 20, drawing_y_offset + 25, (unsigned char *)temp_buffer, color_red); gdImageString(trends_image, gdFontSmall, drawing_x_offset - 10 - (gdFontSmall->w * 4), drawing_y_offset + 25, (unsigned char *)"Down", color_red); get_time_breakdown_string(total_time, time_unreachable, "Unreachable", &temp_buffer[0], sizeof(temp_buffer)); gdImageString(trends_image, gdFontSmall, drawing_x_offset + drawing_width + 20, drawing_y_offset + 45, (unsigned char *)temp_buffer, color_darkred); gdImageString(trends_image, gdFontSmall, drawing_x_offset - 10 - (gdFontSmall->w * 11), drawing_y_offset + 45, (unsigned char *)"Unreachable", color_darkred); get_time_breakdown_string(total_time, time_indeterminate, "Indeterminate", &temp_buffer[0], sizeof(temp_buffer)); gdImageString(trends_image, gdFontSmall, drawing_x_offset + drawing_width + 20, drawing_y_offset + 65, (unsigned char *)temp_buffer, color_black); gdImageString(trends_image, gdFontSmall, drawing_x_offset - 10 - (gdFontSmall->w * 13), drawing_y_offset + 65, (unsigned char *)"Indeterminate", color_black); } else { get_time_breakdown_string(total_time, time_ok, "Ok", &temp_buffer[0], sizeof(temp_buffer)); gdImageString(trends_image, gdFontSmall, drawing_x_offset + drawing_width + 20, drawing_y_offset + 5, (unsigned char *)temp_buffer, color_darkgreen); gdImageString(trends_image, gdFontSmall, drawing_x_offset - 10 - (gdFontSmall->w * 2), drawing_y_offset + 5, (unsigned char *)"Ok", color_darkgreen); get_time_breakdown_string(total_time, time_warning, "Warning", &temp_buffer[0], sizeof(temp_buffer)); gdImageString(trends_image, gdFontSmall, drawing_x_offset + drawing_width + 20, drawing_y_offset + 25, (unsigned char *)temp_buffer, color_yellow); gdImageString(trends_image, gdFontSmall, drawing_x_offset - 10 - (gdFontSmall->w * 7), drawing_y_offset + 25, (unsigned char *)"Warning", color_yellow); get_time_breakdown_string(total_time, time_unknown, "Unknown", &temp_buffer[0], sizeof(temp_buffer)); gdImageString(trends_image, gdFontSmall, drawing_x_offset + drawing_width + 20, drawing_y_offset + 45, (unsigned char *)temp_buffer, color_orange); gdImageString(trends_image, gdFontSmall, drawing_x_offset - 10 - (gdFontSmall->w * 7), drawing_y_offset + 45, (unsigned char *)"Unknown", color_orange); get_time_breakdown_string(total_time, time_critical, "Critical", &temp_buffer[0], sizeof(temp_buffer)); gdImageString(trends_image, gdFontSmall, drawing_x_offset + drawing_width + 20, drawing_y_offset + 65, (unsigned char *)temp_buffer, color_red); gdImageString(trends_image, gdFontSmall, drawing_x_offset - 10 - (gdFontSmall->w * 8), drawing_y_offset + 65, (unsigned char *)"Critical", color_red); get_time_breakdown_string(total_time, time_indeterminate, "Indeterminate", &temp_buffer[0], sizeof(temp_buffer)); gdImageString(trends_image, gdFontSmall, drawing_x_offset + drawing_width + 20, drawing_y_offset + 85, (unsigned char *)temp_buffer, color_black); gdImageString(trends_image, gdFontSmall, drawing_x_offset - 10 - (gdFontSmall->w * 13), drawing_y_offset + 85, (unsigned char *)"Indeterminate", color_black); } return; } void get_time_breakdown_string(unsigned long total_time, unsigned long state_time, char *state_string, char *buffer, int buffer_length) { int days; int hours; int minutes; int seconds; double percent_time; get_time_breakdown(state_time, &days, &hours, &minutes, &seconds); if(total_time == 0L) percent_time = 0.0; else percent_time = ((double)state_time / total_time) * 100.0; snprintf(buffer, buffer_length - 1, "%-13s: (%.3f%%) %dd %dh %dm %ds", state_string, percent_time, days, hours, minutes, seconds); buffer[buffer_length - 1] = '\x0'; return; } void convert_timeperiod_to_times(int type) { time_t current_time; struct tm *t; /* get the current time */ time(¤t_time); t = localtime(¤t_time); t->tm_sec = 0; t->tm_min = 0; t->tm_hour = 0; t->tm_isdst = -1; switch(type) { case TIMEPERIOD_LAST24HOURS: t1 = current_time - (60 * 60 * 24); t2 = current_time; break; case TIMEPERIOD_TODAY: t1 = mktime(t); t2 = current_time; break; case TIMEPERIOD_YESTERDAY: t1 = (time_t)(mktime(t) - (60 * 60 * 24)); t2 = (time_t)mktime(t); break; case TIMEPERIOD_THISWEEK: t1 = (time_t)(mktime(t) - (60 * 60 * 24 * t->tm_wday)); t2 = current_time; break; case TIMEPERIOD_LASTWEEK: t1 = (time_t)(mktime(t) - (60 * 60 * 24 * t->tm_wday) - (60 * 60 * 24 * 7)); t2 = (time_t)(mktime(t) - (60 * 60 * 24 * t->tm_wday)); break; case TIMEPERIOD_THISMONTH: t->tm_mday = 1; t1 = mktime(t); t2 = current_time; break; case TIMEPERIOD_LASTMONTH: t->tm_mday = 1; t2 = mktime(t); if(t->tm_mon == 0) { t->tm_mon = 11; t->tm_year--; } else t->tm_mon--; t1 = mktime(t); break; case TIMEPERIOD_THISQUARTER: break; case TIMEPERIOD_LASTQUARTER: break; case TIMEPERIOD_THISYEAR: t->tm_mon = 0; t->tm_mday = 1; t1 = mktime(t); t2 = current_time; break; case TIMEPERIOD_LASTYEAR: t->tm_mon = 0; t->tm_mday = 1; t2 = mktime(t); t->tm_year--; t1 = mktime(t); break; case TIMEPERIOD_NEXTPROBLEM: /* Time period will be defined later */ break; case TIMEPERIOD_LAST7DAYS: t2 = current_time; t1 = current_time - (7 * 24 * 60 * 60); break; case TIMEPERIOD_LAST31DAYS: t2 = current_time; t1 = current_time - (31 * 24 * 60 * 60); break; default: break; } return; } void compute_report_times(void) { time_t current_time; struct tm *st; struct tm *et; /* get the current time */ time(¤t_time); st = localtime(¤t_time); st->tm_sec = start_second; st->tm_min = start_minute; st->tm_hour = start_hour; st->tm_mday = start_day; st->tm_mon = start_month - 1; st->tm_year = start_year - 1900; st->tm_isdst = -1; t1 = mktime(st); et = localtime(¤t_time); et->tm_sec = end_second; et->tm_min = end_minute; et->tm_hour = end_hour; et->tm_mday = end_day; et->tm_mon = end_month - 1; et->tm_year = end_year - 1900; et->tm_isdst = -1; t2 = mktime(et); } /* draws a dashed line */ void draw_dashed_line(int x1, int y1, int x2, int y2, int color) { int styleDashed[12]; styleDashed[0] = color; styleDashed[1] = color; styleDashed[2] = gdTransparent; styleDashed[3] = gdTransparent; styleDashed[4] = color; styleDashed[5] = color; styleDashed[6] = gdTransparent; styleDashed[7] = gdTransparent; styleDashed[8] = color; styleDashed[9] = color; styleDashed[10] = gdTransparent; styleDashed[11] = gdTransparent; /* sets current style to a dashed line */ gdImageSetStyle(trends_image, styleDashed, 12); /* draws a line (dashed) */ gdImageLine(trends_image, x1, y1, x2, y2, gdStyled); return; } /* draws horizontal grid lines */ void draw_horizontal_grid_lines(void) { if(mode == CREATE_HTML) return; if(small_image == TRUE) return; draw_dashed_line(drawing_x_offset, drawing_y_offset + 10, drawing_x_offset + drawing_width, drawing_y_offset + 10, color_black); draw_dashed_line(drawing_x_offset, drawing_y_offset + 30, drawing_x_offset + drawing_width, drawing_y_offset + 30, color_black); draw_dashed_line(drawing_x_offset, drawing_y_offset + 50, drawing_x_offset + drawing_width, drawing_y_offset + 50, color_black); if(display_type == DISPLAY_SERVICE_TRENDS) draw_dashed_line(drawing_x_offset, drawing_y_offset + 70, drawing_x_offset + drawing_width, drawing_y_offset + 70, color_black); return; } nagios-4.3.4/common/000077500000000000000000000000001314764422400143015ustar00rootroot00000000000000nagios-4.3.4/common/.gitignore000066400000000000000000000000111314764422400162610ustar00rootroot00000000000000Makefile nagios-4.3.4/common/Makefile.in000066400000000000000000000010151314764422400163430ustar00rootroot00000000000000############################ # Makefile for Nagios # ############################ # Source code directories SRC_BASE=../common SRC_CGI=../cgi CC=@CC@ CFLAGS=@CFLAGS@ @DEFS@ LDFLAGS=@LDFLAGS@ @LIBS@ prefix=@prefix@ exec_prefix=@exec_prefix@ LOGDIR=@localstatedir@ CFGDIR=@sysconfdir@ BINDIR=@bindir@ CGIDIR=@sbindir@ HTMLDIR=@datarootdir@ INSTALL=@INSTALL@ INSTALL_OPTS=@INSTALL_OPTS@ COMMAND_OPTS=@COMMAND_OPTS@ CP=@CP@ clean: rm -f core *.o rm -f *~ distclean: clean rm -f Makefile devclean: distclean install: nagios-4.3.4/common/comments.c000066400000000000000000000514011314764422400162730ustar00rootroot00000000000000/***************************************************************************** * * COMMENTS.C - Comment functions for Nagios * * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #include "../include/config.h" #include "../include/common.h" #include "../include/comments.h" #include "../include/objects.h" #include "../xdata/xcddefault.h" #ifdef NSCORE #include "../include/nagios.h" #include "../include/broker.h" #endif #ifdef NSCGI #include "../include/cgiutils.h" #endif nagios_comment *comment_list = NULL; int defer_comment_sorting = 0; nagios_comment **comment_hashlist = NULL; #ifdef NSCORE /******************************************************************/ /**************** INITIALIZATION/CLEANUP FUNCTIONS ****************/ /******************************************************************/ /* initializes comment data */ int initialize_comment_data(void) { return xcddefault_initialize_comment_data(); } /******************************************************************/ /****************** COMMENT OUTPUT FUNCTIONS **********************/ /******************************************************************/ /* adds a new host or service comment */ int add_new_comment(int type, int entry_type, char *host_name, char *svc_description, time_t entry_time, char *author_name, char *comment_data, int persistent, int source, int expires, time_t expire_time, unsigned long *comment_id) { int result; unsigned long new_comment_id = 0L; if(type == HOST_COMMENT) result = add_new_host_comment(entry_type, host_name, entry_time, author_name, comment_data, persistent, source, expires, expire_time, &new_comment_id); else result = add_new_service_comment(entry_type, host_name, svc_description, entry_time, author_name, comment_data, persistent, source, expires, expire_time, &new_comment_id); /* add an event to expire comment data if necessary... */ if(expires == TRUE) schedule_new_event(EVENT_EXPIRE_COMMENT, FALSE, expire_time, FALSE, 0, NULL, TRUE, (void *)new_comment_id, NULL, 0); /* save comment id */ if(comment_id != NULL) *comment_id = new_comment_id; return result; } /* adds a new host comment */ int add_new_host_comment(int entry_type, char *host_name, time_t entry_time, char *author_name, char *comment_data, int persistent, int source, int expires, time_t expire_time, unsigned long *comment_id) { int result; unsigned long new_comment_id = 0L; result = xcddefault_add_new_host_comment(entry_type, host_name, entry_time, author_name, comment_data, persistent, source, expires, expire_time, &new_comment_id); /* save comment id */ if(comment_id != NULL) *comment_id = new_comment_id; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_comment_data(NEBTYPE_COMMENT_ADD, NEBFLAG_NONE, NEBATTR_NONE, HOST_COMMENT, entry_type, host_name, NULL, entry_time, author_name, comment_data, persistent, source, expires, expire_time, new_comment_id, NULL); #endif return result; } /* adds a new service comment */ int add_new_service_comment(int entry_type, char *host_name, char *svc_description, time_t entry_time, char *author_name, char *comment_data, int persistent, int source, int expires, time_t expire_time, unsigned long *comment_id) { int result; unsigned long new_comment_id = 0L; result = xcddefault_add_new_service_comment(entry_type, host_name, svc_description, entry_time, author_name, comment_data, persistent, source, expires, expire_time, &new_comment_id); /* save comment id */ if(comment_id != NULL) *comment_id = new_comment_id; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_comment_data(NEBTYPE_COMMENT_ADD, NEBFLAG_NONE, NEBATTR_NONE, SERVICE_COMMENT, entry_type, host_name, svc_description, entry_time, author_name, comment_data, persistent, source, expires, expire_time, new_comment_id, NULL); #endif return result; } /******************************************************************/ /***************** COMMENT DELETION FUNCTIONS *********************/ /******************************************************************/ /* deletes a host or service comment */ int delete_comment(int type, unsigned long comment_id) { nagios_comment *this_comment = NULL; nagios_comment *last_comment = NULL; nagios_comment *next_comment = NULL; int hashslot = 0; nagios_comment *this_hash = NULL; nagios_comment *last_hash = NULL; /* find the comment we should remove */ for(this_comment = comment_list, last_comment = comment_list; this_comment != NULL; this_comment = next_comment) { next_comment = this_comment->next; /* we found the comment we should delete */ if(this_comment->comment_id == comment_id && this_comment->comment_type == type) break; last_comment = this_comment; } if(this_comment == NULL) return ERROR; /* remove the comment from the list in memory */ #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_comment_data(NEBTYPE_COMMENT_DELETE, NEBFLAG_NONE, NEBATTR_NONE, type, this_comment->entry_type, this_comment->host_name, this_comment->service_description, this_comment->entry_time, this_comment->author, this_comment->comment_data, this_comment->persistent, this_comment->source, this_comment->expires, this_comment->expire_time, comment_id, NULL); #endif /* first remove from chained hash list */ hashslot = hashfunc(this_comment->host_name, NULL, COMMENT_HASHSLOTS); last_hash = NULL; for(this_hash = comment_hashlist[hashslot]; this_hash; this_hash = this_hash->nexthash) { if(this_hash == this_comment) { if(last_hash) last_hash->nexthash = this_hash->nexthash; else { if(this_hash->nexthash) comment_hashlist[hashslot] = this_hash->nexthash; else comment_hashlist[hashslot] = NULL; } break; } last_hash = this_hash; } /* then removed from linked list */ if(comment_list == this_comment) comment_list = this_comment->next; else last_comment->next = next_comment; /* free memory */ my_free(this_comment->host_name); my_free(this_comment->service_description); my_free(this_comment->author); my_free(this_comment->comment_data); my_free(this_comment); return OK; } /* deletes a host comment */ int delete_host_comment(unsigned long comment_id) { int result = OK; /* delete the comment from memory */ result = delete_comment(HOST_COMMENT, comment_id); return result; } /* deletes a service comment */ int delete_service_comment(unsigned long comment_id) { int result = OK; /* delete the comment from memory */ result = delete_comment(SERVICE_COMMENT, comment_id); return result; } /* deletes all comments for a particular host or service */ int delete_all_comments(int type, char *host_name, char *svc_description) { int result = OK; if(type == HOST_COMMENT) result = delete_all_host_comments(host_name); else result = delete_all_service_comments(host_name, svc_description); return result; } /* deletes all comments for a particular host */ int delete_all_host_comments(char *host_name) { int result = OK; nagios_comment *temp_comment = NULL; nagios_comment *next_comment = NULL; if(host_name == NULL) return ERROR; /* delete host comments from memory */ for(temp_comment = get_first_comment_by_host(host_name); temp_comment != NULL; temp_comment = next_comment) { next_comment = get_next_comment_by_host(host_name, temp_comment); if(temp_comment->comment_type == HOST_COMMENT) delete_comment(HOST_COMMENT, temp_comment->comment_id); } return result; } /* deletes all non-persistent acknowledgement comments for a particular host */ int delete_host_acknowledgement_comments(host *hst) { int result = OK; nagios_comment *temp_comment = NULL; nagios_comment *next_comment = NULL; if(hst == NULL) return ERROR; /* delete comments from memory */ temp_comment = get_first_comment_by_host(hst->name); while (temp_comment) { next_comment = get_next_comment_by_host(hst->name, temp_comment); if(temp_comment->comment_type == HOST_COMMENT && temp_comment->entry_type == ACKNOWLEDGEMENT_COMMENT && temp_comment->persistent == FALSE) { delete_comment(HOST_COMMENT, temp_comment->comment_id); } temp_comment = next_comment; } return result; } /* deletes all comments for a particular service */ int delete_all_service_comments(char *host_name, char *svc_description) { int result = OK; nagios_comment *temp_comment = NULL; nagios_comment *next_comment = NULL; if(host_name == NULL || svc_description == NULL) return ERROR; /* delete service comments from memory */ for(temp_comment = comment_list; temp_comment != NULL; temp_comment = next_comment) { next_comment = temp_comment->next; if(temp_comment->comment_type == SERVICE_COMMENT && !strcmp(temp_comment->host_name, host_name) && !strcmp(temp_comment->service_description, svc_description)) delete_comment(SERVICE_COMMENT, temp_comment->comment_id); } return result; } /* deletes all non-persistent acknowledgement comments for a particular service */ int delete_service_acknowledgement_comments(service *svc) { int result = OK; nagios_comment *temp_comment = NULL; nagios_comment *next_comment = NULL; if(svc == NULL) return ERROR; /* delete comments from memory */ for(temp_comment = comment_list; temp_comment != NULL; temp_comment = next_comment) { next_comment = temp_comment->next; if(temp_comment->comment_type == SERVICE_COMMENT && !strcmp(temp_comment->host_name, svc->host_name) && !strcmp(temp_comment->service_description, svc->description) && temp_comment->entry_type == ACKNOWLEDGEMENT_COMMENT && temp_comment->persistent == FALSE) delete_comment(SERVICE_COMMENT, temp_comment->comment_id); } return result; } /* checks for an expired comment (and removes it) */ int check_for_expired_comment(unsigned long comment_id) { nagios_comment *temp_comment = NULL; /* check all comments */ for(temp_comment = comment_list; temp_comment != NULL; temp_comment = temp_comment->next) { /* delete the now expired comment */ if(temp_comment->comment_id == comment_id && temp_comment->expires == TRUE && temp_comment->expire_time < time(NULL)) { delete_comment(temp_comment->comment_type, comment_id); break; } } return OK; } #endif /******************************************************************/ /****************** CHAINED HASH FUNCTIONS ************************/ /******************************************************************/ /* adds comment to hash list in memory */ int add_comment_to_hashlist(nagios_comment *new_comment) { nagios_comment *temp_comment = NULL; nagios_comment *lastpointer = NULL; int hashslot = 0; /* initialize hash list */ if(comment_hashlist == NULL) { int i; comment_hashlist = (nagios_comment **)malloc(sizeof(nagios_comment *) * COMMENT_HASHSLOTS); if(comment_hashlist == NULL) return 0; for(i = 0; i < COMMENT_HASHSLOTS; i++) comment_hashlist[i] = NULL; } if(!new_comment) return 0; hashslot = hashfunc(new_comment->host_name, NULL, COMMENT_HASHSLOTS); lastpointer = NULL; for(temp_comment = comment_hashlist[hashslot]; temp_comment && compare_hashdata(temp_comment->host_name, NULL, new_comment->host_name, NULL) < 0; temp_comment = temp_comment->nexthash) { if(compare_hashdata(temp_comment->host_name, NULL, new_comment->host_name, NULL) >= 0) break; lastpointer = temp_comment; } /* multiples are allowed */ if(lastpointer) lastpointer->nexthash = new_comment; else comment_hashlist[hashslot] = new_comment; new_comment->nexthash = temp_comment; return 1; } /******************************************************************/ /******************** ADDITION FUNCTIONS **************************/ /******************************************************************/ /* adds a host comment to the list in memory */ int add_host_comment(int entry_type, char *host_name, time_t entry_time, char *author, char *comment_data, unsigned long comment_id, int persistent, int expires, time_t expire_time, int source) { int result = OK; result = add_comment(HOST_COMMENT, entry_type, host_name, NULL, entry_time, author, comment_data, comment_id, persistent, expires, expire_time, source); return result; } /* adds a service comment to the list in memory */ int add_service_comment(int entry_type, char *host_name, char *svc_description, time_t entry_time, char *author, char *comment_data, unsigned long comment_id, int persistent, int expires, time_t expire_time, int source) { int result = OK; result = add_comment(SERVICE_COMMENT, entry_type, host_name, svc_description, entry_time, author, comment_data, comment_id, persistent, expires, expire_time, source); return result; } /* adds a comment to the list in memory */ int add_comment(int comment_type, int entry_type, char *host_name, char *svc_description, time_t entry_time, char *author, char *comment_data, unsigned long comment_id, int persistent, int expires, time_t expire_time, int source) { nagios_comment *new_comment = NULL; nagios_comment *last_comment = NULL; nagios_comment *temp_comment = NULL; int result = OK; /* make sure we have the data we need */ if(host_name == NULL || author == NULL || comment_data == NULL || (comment_type == SERVICE_COMMENT && svc_description == NULL)) return ERROR; /* allocate memory for the comment */ if((new_comment = (nagios_comment *)calloc(1, sizeof(nagios_comment))) == NULL) return ERROR; /* duplicate vars */ if((new_comment->host_name = (char *)strdup(host_name)) == NULL) result = ERROR; if(comment_type == SERVICE_COMMENT) { if((new_comment->service_description = (char *)strdup(svc_description)) == NULL) result = ERROR; } if((new_comment->author = (char *)strdup(author)) == NULL) result = ERROR; if((new_comment->comment_data = (char *)strdup(comment_data)) == NULL) result = ERROR; new_comment->comment_type = comment_type; new_comment->entry_type = entry_type; new_comment->source = source; new_comment->entry_time = entry_time; new_comment->comment_id = comment_id; new_comment->persistent = (persistent == TRUE) ? TRUE : FALSE; new_comment->expires = (expires == TRUE) ? TRUE : FALSE; new_comment->expire_time = expire_time; /* add comment to hash list */ if(result == OK) { if(!add_comment_to_hashlist(new_comment)) result = ERROR; } /* handle errors */ if(result == ERROR) { my_free(new_comment->comment_data); my_free(new_comment->author); my_free(new_comment->service_description); my_free(new_comment->host_name); my_free(new_comment); return ERROR; } if(defer_comment_sorting) { new_comment->next = comment_list; comment_list = new_comment; } else { /* add new comment to comment list, sorted by comment id */ last_comment = comment_list; for(temp_comment = comment_list; temp_comment != NULL; temp_comment = temp_comment->next) { if(new_comment->comment_id < temp_comment->comment_id) { new_comment->next = temp_comment; if(temp_comment == comment_list) comment_list = new_comment; else last_comment->next = new_comment; break; } else last_comment = temp_comment; } if(comment_list == NULL) { new_comment->next = NULL; comment_list = new_comment; } else if(temp_comment == NULL) { new_comment->next = NULL; last_comment->next = new_comment; } } #ifdef NSCORE #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_comment_data(NEBTYPE_COMMENT_LOAD, NEBFLAG_NONE, NEBATTR_NONE, comment_type, entry_type, host_name, svc_description, entry_time, author, comment_data, persistent, source, expires, expire_time, comment_id, NULL); #endif #endif return OK; } static int comment_compar(const void *p1, const void *p2) { nagios_comment *c1 = *(nagios_comment **)p1; nagios_comment *c2 = *(nagios_comment **)p2; return c1->comment_id - c2->comment_id; } int sort_comments(void) { nagios_comment **array, *temp_comment; unsigned long i = 0, unsorted_comments = 0; if(!defer_comment_sorting) return OK; defer_comment_sorting = 0; temp_comment = comment_list; while(temp_comment != NULL) { temp_comment = temp_comment->next; unsorted_comments++; } if(!unsorted_comments) return OK; if(!(array = malloc(sizeof(*array) * unsorted_comments))) return ERROR; while(comment_list) { array[i++] = comment_list; comment_list = comment_list->next; } qsort((void *)array, i, sizeof(*array), comment_compar); comment_list = temp_comment = array[0]; for(i = 1; i < unsorted_comments; i++) { temp_comment->next = array[i]; temp_comment = temp_comment->next; } temp_comment->next = NULL; my_free(array); return OK; } /******************************************************************/ /********************* CLEANUP FUNCTIONS **************************/ /******************************************************************/ /* frees memory allocated for the comment data */ void free_comment_data(void) { nagios_comment *this_comment = NULL; nagios_comment *next_comment = NULL; /* free memory for the comment list */ for(this_comment = comment_list; this_comment != NULL; this_comment = next_comment) { next_comment = this_comment->next; my_free(this_comment->host_name); my_free(this_comment->service_description); my_free(this_comment->author); my_free(this_comment->comment_data); my_free(this_comment); } /* free hash list and reset list pointer */ my_free(comment_hashlist); comment_hashlist = NULL; comment_list = NULL; return; } /******************************************************************/ /********************* UTILITY FUNCTIONS **************************/ /******************************************************************/ /* get the number of comments associated with a particular host */ int number_of_host_comments(char *host_name) { nagios_comment *temp_comment = NULL; int total_comments = 0; if(host_name == NULL) return 0; for(temp_comment = get_first_comment_by_host(host_name); temp_comment != NULL; temp_comment = get_next_comment_by_host(host_name, temp_comment)) { if(temp_comment->comment_type == HOST_COMMENT) total_comments++; } return total_comments; } /* get the number of comments associated with a particular service */ int number_of_service_comments(char *host_name, char *svc_description) { nagios_comment *temp_comment = NULL; int total_comments = 0; if(host_name == NULL || svc_description == NULL) return 0; for(temp_comment = get_first_comment_by_host(host_name); temp_comment != NULL; temp_comment = get_next_comment_by_host(host_name, temp_comment)) { if(temp_comment->comment_type == SERVICE_COMMENT && !strcmp(temp_comment->service_description, svc_description)) total_comments++; } return total_comments; } /******************************************************************/ /********************* TRAVERSAL FUNCTIONS ************************/ /******************************************************************/ nagios_comment *get_first_comment_by_host(char *host_name) { return get_next_comment_by_host(host_name, NULL); } nagios_comment *get_next_comment_by_host(char *host_name, nagios_comment *start) { nagios_comment *temp_comment = NULL; if(host_name == NULL || comment_hashlist == NULL) return NULL; if(start == NULL) temp_comment = comment_hashlist[hashfunc(host_name, NULL, COMMENT_HASHSLOTS)]; else temp_comment = start->nexthash; for(; temp_comment && compare_hashdata(temp_comment->host_name, NULL, host_name, NULL) < 0; temp_comment = temp_comment->nexthash); if(temp_comment && compare_hashdata(temp_comment->host_name, NULL, host_name, NULL) == 0) return temp_comment; return NULL; } /******************************************************************/ /********************** SEARCH FUNCTIONS **************************/ /******************************************************************/ /* find a service comment by id */ nagios_comment *find_service_comment(unsigned long comment_id) { return find_comment(comment_id, SERVICE_COMMENT); } /* find a host comment by id */ nagios_comment *find_host_comment(unsigned long comment_id) { return find_comment(comment_id, HOST_COMMENT); } /* find a comment by id */ nagios_comment *find_comment(unsigned long comment_id, int comment_type) { nagios_comment *temp_comment = NULL; for(temp_comment = comment_list; temp_comment != NULL; temp_comment = temp_comment->next) { if(temp_comment->comment_id == comment_id && temp_comment->comment_type == comment_type) return temp_comment; } return NULL; } nagios-4.3.4/common/downtime.c000066400000000000000000001426421314764422400163040ustar00rootroot00000000000000/***************************************************************************** * * DOWNTIME.C - Scheduled downtime functions for Nagios * * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #include "../include/config.h" #include "../include/common.h" #include "../include/comments.h" #include "../include/downtime.h" #include "../include/statusdata.h" #ifdef NSCGI #include "../include/cgiutils.h" #else #include "../include/nagios.h" #include "../include/broker.h" #endif scheduled_downtime *scheduled_downtime_list = NULL; int defer_downtime_sorting = 0; static fanout_table *dt_fanout; unsigned long next_downtime_id = 0; #define DT_ENULL (-1) #define DT_EHOST (-2) #define DT_ESERVICE (-3) #define DT_ETYPE (-4) #define DT_ETRIGGER (-5) #define DT_ETIME (-6) static const char *dt_strerror(int err) { if (err > 0) return strerror(err); switch(err) { case DT_ENULL: return "NULL pointer"; case DT_EHOST: return "No hostname, or host not found"; case DT_ESERVICE: return "No service_description, or service not found"; case DT_ETYPE: return "Invalid downtime type, or type/data mismatch"; case DT_ETRIGGER: return "Triggering downtime not found"; case DT_ETIME: return "Bad time spec"; } return "Unknown error"; } static int downtime_compar(const void *p1, const void *p2) { scheduled_downtime *d1 = *(scheduled_downtime **)p1; scheduled_downtime *d2 = *(scheduled_downtime **)p2; /* If the start times of two downtimes are equal and one is triggered but the other is not, the triggered downtime should be later in the list than the untriggered one. This is so they are written to the retention.dat and status.dat in the correct order. Previously the triggered downtime always appeared before its triggering downtime in those files. When the downtimes were read from those files, either on a core restart or by the CGIs, the triggered downtime would be discarded because the triggering downtime did not yet exist. The most common case for this is when a downtime is created and the option is selected to create triggered downtimes on all child objects. This change in the sort order does NOT resolve the case where a manually created, triggered downtime is created with a start time earlier than the triggering downtime. This would need to be resolved by comparing the triggered_by value with the downtime ID regardless of the start time. However, this should be a relatively rare case and only caused by intentional scheduling by a human. This change was not implemented because it would cause the downtime list to be out of time order and the implications of this were not well understood. */ if(d1->start_time == d2->start_time) { if(( d1->triggered_by == 0 && d2->triggered_by != 0) || ( d1->triggered_by != 0 && d2->triggered_by == 0)) { return d1->triggered_by == 0 ? -1 : 1; } } return (d1->start_time < d2->start_time) ? -1 : (d1->start_time - d2->start_time); } static int downtime_add(scheduled_downtime *dt) { unsigned long prev_downtime_id; scheduled_downtime *trigger = NULL; struct host *h; struct service *s; if (!dt) return DT_ENULL; log_debug_info(DEBUGL_DOWNTIME, 0, "downtime_add(): id=%lu; type=%s; host=%s; service=%s\n", dt->downtime_id, dt->type == HOST_DOWNTIME ? "host" : "service", dt->host_name, dt->service_description); /* * check for errors. * host_name must always be set */ if (!dt->host_name) return DT_EHOST; /* service_description should only be set for service downtime */ if ((dt->type == HOST_DOWNTIME) != (!dt->service_description)) return DT_ETYPE; /* type must be either SERVICE_DOWNTIME or HOST_DOWNTIME */ if (dt->type != SERVICE_DOWNTIME && dt->type != HOST_DOWNTIME) return DT_ETYPE; /* triggered downtime must be triggered by an existing downtime */ if (dt->triggered_by && !(trigger = find_downtime(ANY_DOWNTIME, dt->triggered_by))) return DT_ETRIGGER; /* non-triggered downtime must have start_time < end_time */ if (!trigger && dt->start_time >= dt->end_time) return DT_ETIME; /* flexible downtime must have a duration */ if (!dt->fixed && !dt->duration) return DT_ETIME; /* the object we're adding downtime for must exist */ if (!dt->service_description) { if (!(h = find_host(dt->host_name))) return DT_EHOST; } else if (!(s = find_service(dt->host_name, dt->service_description))) { return DT_ESERVICE; } /* set downtime_id if not already set */ prev_downtime_id = next_downtime_id; if (!dt->downtime_id) { dt->downtime_id = next_downtime_id++; } else if (dt->downtime_id > next_downtime_id) { next_downtime_id = dt->downtime_id + 1; } if (fanout_add(dt_fanout, dt->downtime_id, dt) < 0) { next_downtime_id = prev_downtime_id; return errno; } if(defer_downtime_sorting || !scheduled_downtime_list || downtime_compar(&dt, &scheduled_downtime_list) < 0) { if (scheduled_downtime_list) { scheduled_downtime_list->prev = dt; } dt->next = scheduled_downtime_list; scheduled_downtime_list = dt; } else { scheduled_downtime *cur; /* add new downtime to downtime list, sorted by start time */ for(cur = scheduled_downtime_list; cur; cur = cur->next) { if(downtime_compar(&dt, &cur) < 0) { dt->prev = cur->prev; dt->next = cur; cur->prev->next = dt; cur->prev = dt; break; } if (!cur->next) { dt->next = NULL; cur->next = dt; dt->prev = cur; break; } } } return OK; } void downtime_remove(scheduled_downtime *dt) { fanout_remove(dt_fanout, dt->downtime_id); if(scheduled_downtime_list == dt) scheduled_downtime_list = dt->next; else { dt->prev->next = dt->next; if (dt->next) dt->next->prev = dt->prev; } } /******************************************************************/ /**************** INITIALIZATION/CLEANUP FUNCTIONS ****************/ /******************************************************************/ /* initializes scheduled downtime data */ int initialize_downtime_data(void) { log_debug_info(DEBUGL_FUNCTIONS, 0, "initialize_downtime_data()\n"); dt_fanout = fanout_create(16384); next_downtime_id = 1; return dt_fanout ? OK : ERROR; } /* cleans up scheduled downtime data */ int cleanup_downtime_data(void) { /* free memory allocated to downtime data */ free_downtime_data(); return OK; } #ifdef NSCORE /******************************************************************/ /********************** SCHEDULING FUNCTIONS **********************/ /******************************************************************/ /* schedules a host or service downtime */ int schedule_downtime(int type, char *host_name, char *service_description, time_t entry_time, char *author, char *comment_data, time_t start_time, time_t end_time, int fixed, unsigned long triggered_by, unsigned long duration, unsigned long *new_downtime_id) { unsigned long downtime_id = 0L; log_debug_info(DEBUGL_FUNCTIONS, 0, "schedule_downtime()\n"); /* don't add old or invalid downtimes */ if(start_time >= end_time || end_time <= time(NULL)) { log_debug_info(DEBUGL_DOWNTIME, 1, "Invalid start (%lu) or end (%lu) times\n", start_time, end_time); return ERROR; } /* add a new downtime entry */ add_new_downtime(type, host_name, service_description, entry_time, author, comment_data, start_time, end_time, fixed, triggered_by, duration, &downtime_id, FALSE, FALSE); /* register the scheduled downtime */ register_downtime(type, downtime_id); /* return downtime id */ if(new_downtime_id != NULL) *new_downtime_id = downtime_id; return OK; } /* unschedules a host or service downtime */ int unschedule_downtime(int type, unsigned long downtime_id) { scheduled_downtime *temp_downtime = NULL; scheduled_downtime *next_downtime = NULL; host *hst = NULL; service *svc = NULL; #ifdef USE_EVENT_BROKER int attr = 0; #endif log_debug_info(DEBUGL_FUNCTIONS, 0, "unschedule_downtime()\n"); /* find the downtime entry in the list in memory */ if((temp_downtime = find_downtime(type, downtime_id)) == NULL) return ERROR; /* find the host or service associated with this downtime */ if(temp_downtime->type == HOST_DOWNTIME) { if((hst = find_host(temp_downtime->host_name)) == NULL) return ERROR; } else { if((svc = find_service(temp_downtime->host_name, temp_downtime->service_description)) == NULL) return ERROR; } /* decrement pending flex downtime if necessary ... */ if(temp_downtime->fixed == FALSE && temp_downtime->incremented_pending_downtime == TRUE) { if(temp_downtime->type == HOST_DOWNTIME) hst->pending_flex_downtime--; else svc->pending_flex_downtime--; } log_debug_info(DEBUGL_DOWNTIME, 0, "Cancelling %s downtime (id=%lu)\n", temp_downtime->type == HOST_DOWNTIME ? "host" : "service", temp_downtime->downtime_id); /* decrement the downtime depth variable and update status data if necessary */ if(temp_downtime->is_in_effect == TRUE) { #ifdef USE_EVENT_BROKER /* send data to event broker */ attr = NEBATTR_DOWNTIME_STOP_CANCELLED; broker_downtime_data(NEBTYPE_DOWNTIME_STOP, NEBFLAG_NONE, attr, temp_downtime->type, temp_downtime->host_name, temp_downtime->service_description, temp_downtime->entry_time, temp_downtime->author, temp_downtime->comment, temp_downtime->start_time, temp_downtime->end_time, temp_downtime->fixed, temp_downtime->triggered_by, temp_downtime->duration, temp_downtime->downtime_id, NULL); #endif if(temp_downtime->type == HOST_DOWNTIME) { if (hst->scheduled_downtime_depth > 0) hst->scheduled_downtime_depth--; update_host_status(hst, FALSE); /* log a notice - this is parsed by the history CGI */ if(hst->scheduled_downtime_depth == 0) { logit(NSLOG_INFO_MESSAGE, FALSE, "HOST DOWNTIME ALERT: %s;CANCELLED; Scheduled downtime for host has been cancelled.\n", hst->name); /* send a notification */ host_notification(hst, NOTIFICATION_DOWNTIMECANCELLED, NULL, NULL, NOTIFICATION_OPTION_NONE); } } else { if (svc->scheduled_downtime_depth > 0) svc->scheduled_downtime_depth--; update_service_status(svc, FALSE); /* log a notice - this is parsed by the history CGI */ if(svc->scheduled_downtime_depth == 0) { logit(NSLOG_INFO_MESSAGE, FALSE, "SERVICE DOWNTIME ALERT: %s;%s;CANCELLED; Scheduled downtime for service has been cancelled.\n", svc->host_name, svc->description); /* send a notification */ service_notification(svc, NOTIFICATION_DOWNTIMECANCELLED, NULL, NULL, NOTIFICATION_OPTION_NONE); } } } /* remove scheduled entries from event queue */ if (temp_downtime->start_event) { remove_event(nagios_squeue, temp_downtime->start_event); my_free(temp_downtime->start_event); } if (temp_downtime->stop_event) { remove_event(nagios_squeue, temp_downtime->stop_event); my_free(temp_downtime->stop_event); } /* delete downtime entry */ if(temp_downtime->type == HOST_DOWNTIME) delete_host_downtime(downtime_id); else delete_service_downtime(downtime_id); /* * unschedule all downtime entries that were triggered by this one * @TODO: Fix this algorithm so it uses something sane instead * of this horrible mess of recursive O(n * t), where t is * "downtime triggered by this downtime" */ while(1) { for(temp_downtime = scheduled_downtime_list; temp_downtime != NULL; temp_downtime = next_downtime) { next_downtime = temp_downtime->next; if(temp_downtime->triggered_by == downtime_id) { unschedule_downtime(ANY_DOWNTIME, temp_downtime->downtime_id); break; } } if(temp_downtime == NULL) break; } return OK; } /* registers scheduled downtime (schedules it, adds comments, etc.) */ int register_downtime(int type, unsigned long downtime_id) { char *temp_buffer = NULL; char start_time_string[MAX_DATETIME_LENGTH] = ""; char flex_start_string[MAX_DATETIME_LENGTH] = ""; char end_time_string[MAX_DATETIME_LENGTH] = ""; scheduled_downtime *temp_downtime = NULL; host *hst = NULL; service *svc = NULL; const char *type_string = NULL; int hours = 0; int minutes = 0; int seconds = 0; unsigned long *new_downtime_id = NULL; int was_in_effect = FALSE; log_debug_info(DEBUGL_FUNCTIONS, 0, "register_downtime( %d, %lu)\n", type, downtime_id); /* find the downtime entry in memory */ temp_downtime = find_downtime(type, downtime_id); if(temp_downtime == NULL) { log_debug_info(DEBUGL_DOWNTIME, 0, "Cannot find downtime ID: %lu\n", downtime_id); return ERROR; } /* find the host or service associated with this downtime */ if(temp_downtime->type == HOST_DOWNTIME) { if((hst = find_host(temp_downtime->host_name)) == NULL) { log_debug_info(DEBUGL_DOWNTIME, 1, "Cannot find host (%s) for downtime ID: %lu\n", temp_downtime->host_name, downtime_id); return ERROR; } } else { if((svc = find_service(temp_downtime->host_name, temp_downtime->service_description)) == NULL) { log_debug_info(DEBUGL_DOWNTIME, 1, "Cannot find service (%s) for host (%s) for downtime ID: %lu\n", temp_downtime->service_description, temp_downtime->host_name, downtime_id); return ERROR; } } /* create the comment */ get_datetime_string(&(temp_downtime->start_time), start_time_string, MAX_DATETIME_LENGTH, SHORT_DATE_TIME); get_datetime_string(&(temp_downtime->flex_downtime_start), flex_start_string, MAX_DATETIME_LENGTH, SHORT_DATE_TIME); get_datetime_string(&(temp_downtime->end_time), end_time_string, MAX_DATETIME_LENGTH, SHORT_DATE_TIME); hours = temp_downtime->duration / 3600; minutes = ((temp_downtime->duration - (hours * 3600)) / 60); seconds = temp_downtime->duration - (hours * 3600) - (minutes * 60); if(temp_downtime->type == HOST_DOWNTIME) type_string = "host"; else type_string = "service"; if(temp_downtime->fixed == TRUE) asprintf(&temp_buffer, "This %s has been scheduled for fixed downtime from %s to %s. Notifications for the %s will not be sent out during that time period.", type_string, start_time_string, end_time_string, type_string); else asprintf(&temp_buffer, "This %s has been scheduled for flexible downtime starting between %s and %s and lasting for a period of %d hours and %d minutes. Notifications for the %s will not be sent out during that time period.", type_string, start_time_string, end_time_string, hours, minutes, type_string); log_debug_info(DEBUGL_DOWNTIME, 0, "Scheduled Downtime Details:\n"); if(temp_downtime->type == HOST_DOWNTIME) { log_debug_info(DEBUGL_DOWNTIME, 0, " Type: Host Downtime\n"); log_debug_info(DEBUGL_DOWNTIME, 0, " Host: %s\n", hst->name); } else { log_debug_info(DEBUGL_DOWNTIME, 0, " Type: Service Downtime\n"); log_debug_info(DEBUGL_DOWNTIME, 0, " Host: %s\n", svc->host_name); log_debug_info(DEBUGL_DOWNTIME, 0, " Service: %s\n", svc->description); } log_debug_info(DEBUGL_DOWNTIME, 0, " Fixed/Flex: %s\n", (temp_downtime->fixed == TRUE) ? "Fixed" : "Flexible"); log_debug_info(DEBUGL_DOWNTIME, 0, " Start: %s\n", start_time_string); if( temp_downtime->flex_downtime_start) { log_debug_info(DEBUGL_DOWNTIME, 0, " Flex Start: %s\n", flex_start_string); } log_debug_info(DEBUGL_DOWNTIME, 0, " End: %s\n", end_time_string); log_debug_info(DEBUGL_DOWNTIME, 0, " Duration: %dh %dm %ds\n", hours, minutes, seconds); log_debug_info(DEBUGL_DOWNTIME, 0, " Downtime ID: %lu\n", temp_downtime->downtime_id); log_debug_info(DEBUGL_DOWNTIME, 0, " Trigger ID: %lu\n", temp_downtime->triggered_by); /* add a non-persistent comment to the host or service regarding the scheduled outage */ if(temp_downtime->type == SERVICE_DOWNTIME) add_new_comment(SERVICE_COMMENT, DOWNTIME_COMMENT, svc->host_name, svc->description, time(NULL), ( NULL == temp_downtime->author ? "(Nagios Process)" : temp_downtime->author), temp_buffer, 0, COMMENTSOURCE_INTERNAL, FALSE, (time_t)0, &(temp_downtime->comment_id)); else add_new_comment(HOST_COMMENT, DOWNTIME_COMMENT, hst->name, NULL, time(NULL), ( NULL == temp_downtime->author ? "(Nagios Process)" : temp_downtime->author), temp_buffer, 0, COMMENTSOURCE_INTERNAL, FALSE, (time_t)0, &(temp_downtime->comment_id)); my_free(temp_buffer); /* only non-triggered downtime is scheduled... */ if((temp_downtime->triggered_by == 0) && ((TRUE == temp_downtime->fixed) || ((FALSE == temp_downtime->fixed) && (TRUE == temp_downtime->is_in_effect)))) { /* If this is a fixed downtime, schedule the event to start it. If this is a flexible downtime, normally we wait for one of the check_pending_flex_*_downtime() functions to start it, but if the downtime is already in effect, this means that we are restarting Nagios and the downtime was in effect when we last shutdown Nagios, so we should restart the flexible downtime now. This should work even if the downtime has ended because the handle_scheduled_downtime() function will immediately schedule another downtime event which will end the downtime. */ if((new_downtime_id = (unsigned long *)malloc(sizeof(unsigned long)))) { *new_downtime_id = downtime_id; temp_downtime->start_event = schedule_new_event(EVENT_SCHEDULED_DOWNTIME, TRUE, temp_downtime->start_time, FALSE, 0, NULL, FALSE, (void *)new_downtime_id, NULL, 0); /* Turn off is_in_effect flag so handle_scheduled_downtime() will handle it correctly */ was_in_effect = temp_downtime->is_in_effect; temp_downtime->is_in_effect = FALSE; } } /* If the downtime is triggered and was in effect, mark it as not in effect so it gets scheduled correctly */ if((temp_downtime->triggered_by != 0) && (TRUE == temp_downtime->is_in_effect)) { was_in_effect = temp_downtime->is_in_effect; temp_downtime->is_in_effect = FALSE; } if((FALSE == temp_downtime->fixed) && (FALSE == was_in_effect)) { /* increment pending flex downtime counter */ if(temp_downtime->type == HOST_DOWNTIME) hst->pending_flex_downtime++; else svc->pending_flex_downtime++; temp_downtime->incremented_pending_downtime = TRUE; /* Since a flex downtime may never start, schedule an expiring event in case the event is never triggered. The expire event will NOT cancel a downtime event that is in effect */ log_debug_info(DEBUGL_DOWNTIME, 1, "Scheduling downtime expire event in case flexible downtime is never triggered\n"); temp_downtime->stop_event = schedule_new_event(EVENT_EXPIRE_DOWNTIME, TRUE, (temp_downtime->end_time + 1), FALSE, 0, NULL, FALSE, NULL, NULL, 0); } #ifdef PROBABLY_NOT_NEEDED /*** FLEXIBLE DOWNTIME SANITY CHECK - ADDED 02/17/2008 ****/ /* if host/service is in a non-OK/UP state right now, see if we should start flexible time immediately */ /* this is new logic added in 3.0rc3 */ if(temp_downtime->fixed == FALSE) { if(temp_downtime->type == HOST_DOWNTIME) check_pending_flex_host_downtime(hst); else check_pending_flex_service_downtime(svc); } #endif return OK; } /* handles scheduled downtime (id passed from timed event queue) */ int handle_scheduled_downtime_by_id(unsigned long downtime_id) { scheduled_downtime *temp_downtime = NULL; log_debug_info(DEBUGL_FUNCTIONS, 0, "handle_scheduled_downtime_by_id()\n"); /* find the downtime entry */ if((temp_downtime = find_downtime(ANY_DOWNTIME, downtime_id)) == NULL) { log_debug_info(DEBUGL_DOWNTIME, 1, "Unable to find downtime id: %lu\n", downtime_id); return ERROR; } /* NULL out this event's start time since the calling function, handle_timed_event(), will free the event, this will prevent unschedule_downtime from freeing something that has already been freed. The start event is not needed within handle_scheduled_downtime(). */ temp_downtime->start_event = NULL; /* handle the downtime */ return handle_scheduled_downtime(temp_downtime); } /* handles scheduled host or service downtime */ int handle_scheduled_downtime(scheduled_downtime *temp_downtime) { scheduled_downtime *this_downtime = NULL; host *hst = NULL; service *svc = NULL; time_t event_time = 0L; unsigned long *new_downtime_id = NULL; #ifdef USE_EVENT_BROKER int attr = 0; #endif log_debug_info(DEBUGL_FUNCTIONS, 0, "handle_scheduled_downtime()\n"); if(temp_downtime == NULL) return ERROR; /* find the host or service associated with this downtime */ if(temp_downtime->type == HOST_DOWNTIME) { if((hst = find_host(temp_downtime->host_name)) == NULL) { log_debug_info(DEBUGL_DOWNTIME, 1, "Unable to find host (%s) for downtime\n", temp_downtime->host_name); return ERROR; } } else { if((svc = find_service(temp_downtime->host_name, temp_downtime->service_description)) == NULL) { log_debug_info(DEBUGL_DOWNTIME, 1, "Unable to find service (%s) host (%s) for downtime\n", temp_downtime->service_description, temp_downtime->host_name); return ERROR; } } /* have we come to the end of the scheduled downtime? */ if(temp_downtime->is_in_effect == TRUE) { #ifdef USE_EVENT_BROKER /* send data to event broker */ attr = NEBATTR_DOWNTIME_STOP_NORMAL; broker_downtime_data(NEBTYPE_DOWNTIME_STOP, NEBFLAG_NONE, attr, temp_downtime->type, temp_downtime->host_name, temp_downtime->service_description, temp_downtime->entry_time, temp_downtime->author, temp_downtime->comment, temp_downtime->start_time, temp_downtime->end_time, temp_downtime->fixed, temp_downtime->triggered_by, temp_downtime->duration, temp_downtime->downtime_id, NULL); #endif /* decrement the downtime depth variable */ if(temp_downtime->type == HOST_DOWNTIME && hst->scheduled_downtime_depth > 0) hst->scheduled_downtime_depth--; else if (svc->scheduled_downtime_depth > 0) svc->scheduled_downtime_depth--; if(temp_downtime->type == HOST_DOWNTIME && hst->scheduled_downtime_depth == 0) { log_debug_info(DEBUGL_DOWNTIME, 0, "Host '%s' has exited from a period of scheduled downtime (id=%lu).\n", hst->name, temp_downtime->downtime_id); /* log a notice - this one is parsed by the history CGI */ logit(NSLOG_INFO_MESSAGE, FALSE, "HOST DOWNTIME ALERT: %s;STOPPED; Host has exited from a period of scheduled downtime", hst->name); /* send a notification */ host_notification(hst, NOTIFICATION_DOWNTIMEEND, temp_downtime->author, temp_downtime->comment, NOTIFICATION_OPTION_NONE); } else if(temp_downtime->type == SERVICE_DOWNTIME && svc->scheduled_downtime_depth == 0) { log_debug_info(DEBUGL_DOWNTIME, 0, "Service '%s' on host '%s' has exited from a period of scheduled downtime (id=%lu).\n", svc->description, svc->host_name, temp_downtime->downtime_id); /* log a notice - this one is parsed by the history CGI */ logit(NSLOG_INFO_MESSAGE, FALSE, "SERVICE DOWNTIME ALERT: %s;%s;STOPPED; Service has exited from a period of scheduled downtime", svc->host_name, svc->description); /* send a notification */ service_notification(svc, NOTIFICATION_DOWNTIMEEND, temp_downtime->author, temp_downtime->comment, NOTIFICATION_OPTION_NONE); } /* update the status data */ if(temp_downtime->type == HOST_DOWNTIME) update_host_status(hst, FALSE); else update_service_status(svc, FALSE); /* decrement pending flex downtime if necessary */ if(temp_downtime->fixed == FALSE && temp_downtime->incremented_pending_downtime == TRUE) { if(temp_downtime->type == HOST_DOWNTIME) { if(hst->pending_flex_downtime > 0) hst->pending_flex_downtime--; } else { if(svc->pending_flex_downtime > 0) svc->pending_flex_downtime--; } } /* handle (stop) downtime that is triggered by this one */ while(1) { /* list contents might change by recursive calls, so we use this inefficient method to prevent segfaults */ for(this_downtime = scheduled_downtime_list; this_downtime != NULL; this_downtime = this_downtime->next) { if(this_downtime->triggered_by == temp_downtime->downtime_id) { handle_scheduled_downtime(this_downtime); break; } } if(this_downtime == NULL) break; } /* delete downtime entry */ if(temp_downtime->type == HOST_DOWNTIME) delete_host_downtime(temp_downtime->downtime_id); else delete_service_downtime(temp_downtime->downtime_id); } /* else we are just starting the scheduled downtime */ else { #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_downtime_data(NEBTYPE_DOWNTIME_START, NEBFLAG_NONE, NEBATTR_NONE, temp_downtime->type, temp_downtime->host_name, temp_downtime->service_description, temp_downtime->entry_time, temp_downtime->author, temp_downtime->comment, temp_downtime->start_time, temp_downtime->end_time, temp_downtime->fixed, temp_downtime->triggered_by, temp_downtime->duration, temp_downtime->downtime_id, NULL); #endif if(temp_downtime->type == HOST_DOWNTIME && hst->scheduled_downtime_depth == 0) { log_debug_info(DEBUGL_DOWNTIME, 0, "Host '%s' has entered a period of scheduled downtime (id=%lu).\n", hst->name, temp_downtime->downtime_id); /* log a notice - this one is parsed by the history CGI */ logit(NSLOG_INFO_MESSAGE, FALSE, "HOST DOWNTIME ALERT: %s;STARTED; Host has entered a period of scheduled downtime", hst->name); /* send a notification */ if( FALSE == temp_downtime->start_notification_sent) { host_notification(hst, NOTIFICATION_DOWNTIMESTART, temp_downtime->author, temp_downtime->comment, NOTIFICATION_OPTION_NONE); temp_downtime->start_notification_sent = TRUE; } } else if(temp_downtime->type == SERVICE_DOWNTIME && svc->scheduled_downtime_depth == 0) { log_debug_info(DEBUGL_DOWNTIME, 0, "Service '%s' on host '%s' has entered a period of scheduled downtime (id=%lu).\n", svc->description, svc->host_name, temp_downtime->downtime_id); /* log a notice - this one is parsed by the history CGI */ logit(NSLOG_INFO_MESSAGE, FALSE, "SERVICE DOWNTIME ALERT: %s;%s;STARTED; Service has entered a period of scheduled downtime", svc->host_name, svc->description); /* send a notification */ if( FALSE == temp_downtime->start_notification_sent) { service_notification(svc, NOTIFICATION_DOWNTIMESTART, temp_downtime->author, temp_downtime->comment, NOTIFICATION_OPTION_NONE); temp_downtime->start_notification_sent = TRUE; } } /* increment the downtime depth variable */ if(temp_downtime->type == HOST_DOWNTIME) hst->scheduled_downtime_depth++; else svc->scheduled_downtime_depth++; /* set the in effect flag */ temp_downtime->is_in_effect = TRUE; /* update the status data */ if(temp_downtime->type == HOST_DOWNTIME) update_host_status(hst, FALSE); else update_service_status(svc, FALSE); /* schedule an event to end the downtime */ if(temp_downtime->fixed == FALSE) { event_time = (time_t)((unsigned long)temp_downtime->flex_downtime_start + temp_downtime->duration); } else { event_time = temp_downtime->end_time; } if((new_downtime_id = (unsigned long *)malloc(sizeof(unsigned long)))) { *new_downtime_id = temp_downtime->downtime_id; schedule_new_event(EVENT_SCHEDULED_DOWNTIME, TRUE, event_time, FALSE, 0, NULL, FALSE, (void *)new_downtime_id, NULL, 0); } /* handle (start) downtime that is triggered by this one */ for(this_downtime = scheduled_downtime_list; this_downtime != NULL; this_downtime = this_downtime->next) { if(this_downtime->triggered_by == temp_downtime->downtime_id) handle_scheduled_downtime(this_downtime); } } return OK; } /* checks for flexible (non-fixed) host downtime that should start now */ int check_pending_flex_host_downtime(host *hst) { scheduled_downtime *temp_downtime = NULL; time_t current_time = 0L; unsigned long * new_downtime_id = NULL; log_debug_info(DEBUGL_FUNCTIONS, 0, "check_pending_flex_host_downtime()\n"); if(hst == NULL) return ERROR; time(¤t_time); /* if host is currently up, nothing to do */ if(hst->current_state == HOST_UP) return OK; /* check all downtime entries */ for(temp_downtime = scheduled_downtime_list; temp_downtime != NULL; temp_downtime = temp_downtime->next) { if(temp_downtime->type != HOST_DOWNTIME) continue; if(temp_downtime->fixed == TRUE) continue; if(temp_downtime->is_in_effect == TRUE) continue; /* triggered downtime entries should be ignored here */ if(temp_downtime->triggered_by != 0) continue; /* this entry matches our host! */ if(find_host(temp_downtime->host_name) == hst) { /* if the time boundaries are okay, start this scheduled downtime */ if(temp_downtime->start_time <= current_time && current_time <= temp_downtime->end_time) { log_debug_info(DEBUGL_DOWNTIME, 0, "Flexible downtime (id=%lu) for host '%s' starting now...\n", temp_downtime->downtime_id, hst->name); temp_downtime->flex_downtime_start = current_time; if((new_downtime_id = (unsigned long *)malloc(sizeof(unsigned long)))) { *new_downtime_id = temp_downtime->downtime_id; temp_downtime->start_event = schedule_new_event(EVENT_SCHEDULED_DOWNTIME, TRUE, temp_downtime->flex_downtime_start, FALSE, 0, NULL, FALSE, (void *)new_downtime_id, NULL, 0); } } } } return OK; } /* checks for flexible (non-fixed) service downtime that should start now */ int check_pending_flex_service_downtime(service *svc) { scheduled_downtime *temp_downtime = NULL; time_t current_time = 0L; log_debug_info(DEBUGL_FUNCTIONS, 0, "check_pending_flex_service_downtime()\n"); if(svc == NULL) return ERROR; time(¤t_time); /* if service is currently ok, nothing to do */ if(svc->current_state == STATE_OK) return OK; /* check all downtime entries */ for(temp_downtime = scheduled_downtime_list; temp_downtime != NULL; temp_downtime = temp_downtime->next) { if(temp_downtime->type != SERVICE_DOWNTIME) continue; if(temp_downtime->fixed == TRUE) continue; if(temp_downtime->is_in_effect == TRUE) continue; /* triggered downtime entries should be ignored here */ if(temp_downtime->triggered_by != 0) continue; /* this entry matches our service! */ if(find_service(temp_downtime->host_name, temp_downtime->service_description) == svc) { /* if the time boundaries are okay, start this scheduled downtime */ if(temp_downtime->start_time <= current_time && current_time <= temp_downtime->end_time) { log_debug_info(DEBUGL_DOWNTIME, 0, "Flexible downtime (id=%lu) for service '%s' on host '%s' starting now...\n", temp_downtime->downtime_id, svc->description, svc->host_name); temp_downtime->flex_downtime_start = current_time; handle_scheduled_downtime_by_id(temp_downtime->downtime_id); } } } return OK; } int is_host_in_pending_flex_downtime(struct host *temp_host) { scheduled_downtime *temp_downtime = NULL; time_t current_time = 0L; log_debug_info(DEBUGL_FUNCTIONS, 0, "is_host_in_pending_flex_downtime()\n"); if (temp_host == NULL) return FALSE; time(¤t_time); /* check all downtime entries */ for (temp_downtime = scheduled_downtime_list; temp_downtime != NULL; temp_downtime = temp_downtime->next) { if(temp_downtime->type != HOST_DOWNTIME) continue; if(temp_downtime->fixed == TRUE) continue; if(temp_downtime->is_in_effect == TRUE) continue; /* triggered downtime entries should be ignored here */ if(temp_downtime->triggered_by != 0) continue; /* this entry matches our host! */ if(find_host(temp_downtime->host_name) == temp_host) { /* if the time boundaries are okay, start this scheduled downtime */ if(temp_downtime->start_time <= current_time && current_time <= temp_downtime->end_time) return TRUE; } } return FALSE; } int is_service_in_pending_flex_downtime(struct service *temp_service) { scheduled_downtime *temp_downtime = NULL; time_t current_time = 0L; log_debug_info(DEBUGL_FUNCTIONS, 0, "is_service_in_pending_flex_downtime()\n"); if(temp_service == NULL) return FALSE; time(¤t_time); /* check all downtime entries */ for(temp_downtime = scheduled_downtime_list; temp_downtime != NULL; temp_downtime = temp_downtime->next) { if(temp_downtime->type != SERVICE_DOWNTIME) continue; if(temp_downtime->fixed == TRUE) continue; if(temp_downtime->is_in_effect == TRUE) continue; /* triggered downtime entries should be ignored here */ if(temp_downtime->triggered_by != 0) continue; /* this entry matches our service! */ if(find_service(temp_downtime->host_name, temp_downtime->service_description) == temp_service) { /* if the time boundaries are okay, start this scheduled downtime */ if(temp_downtime->start_time <= current_time && current_time <= temp_downtime->end_time) return TRUE; } } return FALSE; } /* checks for (and removes) expired downtime entries */ int check_for_expired_downtime(void) { scheduled_downtime *temp_downtime = NULL; scheduled_downtime *next_downtime = NULL; time_t current_time = 0L; service *svc = NULL; host *hst = NULL; log_debug_info(DEBUGL_FUNCTIONS, 0, "check_for_expired_downtime()\n"); time(¤t_time); /* check all downtime entries... */ for(temp_downtime = scheduled_downtime_list; temp_downtime != NULL; temp_downtime = next_downtime) { next_downtime = temp_downtime->next; /* this entry should be removed */ if(temp_downtime->is_in_effect == FALSE && temp_downtime->end_time <= current_time) { log_debug_info(DEBUGL_DOWNTIME, 0, "Expiring %s downtime (id=%lu)...\n", (temp_downtime->type == HOST_DOWNTIME) ? "host" : "service", temp_downtime->downtime_id); /* find the host or service associated with this downtime */ if(temp_downtime->type == HOST_DOWNTIME) { if((hst = find_host(temp_downtime->host_name)) == NULL) { log_debug_info(DEBUGL_DOWNTIME, 1, "Unable to find host (%s) for downtime\n", temp_downtime->host_name); return ERROR; } /* send a notification */ host_notification(hst, NOTIFICATION_DOWNTIMEEND, temp_downtime->author, temp_downtime->comment, NOTIFICATION_OPTION_NONE); } else { if((svc = find_service(temp_downtime->host_name, temp_downtime->service_description)) == NULL) { log_debug_info(DEBUGL_DOWNTIME, 1, "Unable to find service (%s) host (%s) for downtime\n", temp_downtime->service_description, temp_downtime->host_name); return ERROR; } /* send a notification */ service_notification(svc, NOTIFICATION_DOWNTIMEEND, temp_downtime->author, temp_downtime->comment, NOTIFICATION_OPTION_NONE); } /* delete the downtime entry */ if(temp_downtime->type == HOST_DOWNTIME) delete_host_downtime(temp_downtime->downtime_id); else delete_service_downtime(temp_downtime->downtime_id); } } return OK; } /******************************************************************/ /************************* SAVE FUNCTIONS *************************/ /******************************************************************/ /* save a host or service downtime */ int add_new_downtime(int type, char *host_name, char *service_description, time_t entry_time, char *author, char *comment_data, time_t start_time, time_t end_time, int fixed, unsigned long triggered_by, unsigned long duration, unsigned long *downtime_id, int is_in_effect, int start_notification_sent){ int result = OK; if(type == HOST_DOWNTIME) return add_new_host_downtime(host_name, entry_time, author, comment_data, start_time, end_time, fixed, triggered_by, duration, downtime_id, is_in_effect, start_notification_sent); else return add_new_service_downtime(host_name, service_description, entry_time, author, comment_data, start_time, end_time, fixed, triggered_by, duration, downtime_id, is_in_effect, start_notification_sent); return result; } static unsigned long get_next_downtime_id(void) { unsigned long new_dt_id; for (;;) { new_dt_id = next_downtime_id++; if (!find_downtime(ANY_DOWNTIME, next_downtime_id)) { return new_dt_id; } } return 0; } /* saves a host downtime entry */ int add_new_host_downtime(char *host_name, time_t entry_time, char *author, char *comment_data, time_t start_time, time_t end_time, int fixed, unsigned long triggered_by, unsigned long duration, unsigned long *downtime_id, int is_in_effect, int start_notification_sent){ int result = OK; unsigned long new_downtime_id = 0L; if(host_name == NULL) return ERROR; log_debug_info(DEBUGL_FUNCTIONS, 0, "cleanup_downtime_data()\n"); new_downtime_id = get_next_downtime_id(); result = add_host_downtime(host_name, entry_time, author, comment_data, start_time, 0, end_time, fixed, triggered_by, duration, new_downtime_id, is_in_effect, start_notification_sent); /* save downtime id */ if(downtime_id != NULL) *downtime_id = new_downtime_id; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_downtime_data(NEBTYPE_DOWNTIME_ADD, NEBFLAG_NONE, NEBATTR_NONE, HOST_DOWNTIME, host_name, NULL, entry_time, author, comment_data, start_time, end_time, fixed, triggered_by, duration, new_downtime_id, NULL); #endif return result; } /* saves a service downtime entry */ int add_new_service_downtime(char *host_name, char *service_description, time_t entry_time, char *author, char *comment_data, time_t start_time, time_t end_time, int fixed, unsigned long triggered_by, unsigned long duration, unsigned long *downtime_id, int is_in_effect, int start_notification_sent){ int result = OK; unsigned long new_downtime_id = 0L; log_debug_info(DEBUGL_FUNCTIONS, 0, "add_new_service_downtime()\n"); if(host_name == NULL || service_description == NULL) { log_debug_info(DEBUGL_DOWNTIME, 1, "Host name (%s) or service description (%s) is null\n", ((NULL == host_name) ? "null" : host_name), ((NULL == service_description) ? "null" : service_description)); return ERROR; } new_downtime_id = get_next_downtime_id(); result = add_service_downtime(host_name, service_description, entry_time, author, comment_data, start_time, 0, end_time, fixed, triggered_by, duration, new_downtime_id, is_in_effect, start_notification_sent); /* save downtime id */ if(downtime_id != NULL) *downtime_id = new_downtime_id; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_downtime_data(NEBTYPE_DOWNTIME_ADD, NEBFLAG_NONE, NEBATTR_NONE, SERVICE_DOWNTIME, host_name, service_description, entry_time, author, comment_data, start_time, end_time, fixed, triggered_by, duration, new_downtime_id, NULL); #endif return result; } /******************************************************************/ /*********************** DELETION FUNCTIONS ***********************/ /******************************************************************/ /* deletes a scheduled host or service downtime entry from the list in memory */ int delete_downtime(int type, unsigned long downtime_id) { scheduled_downtime *this_downtime = NULL; /* find the downtime we should remove */ this_downtime = find_downtime(type, downtime_id); if(!this_downtime) return ERROR; downtime_remove(this_downtime); /* first remove the comment associated with this downtime */ if(this_downtime->type == HOST_DOWNTIME) delete_host_comment(this_downtime->comment_id); else delete_service_comment(this_downtime->comment_id); #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_downtime_data(NEBTYPE_DOWNTIME_DELETE, NEBFLAG_NONE, NEBATTR_NONE, type, this_downtime->host_name, this_downtime->service_description, this_downtime->entry_time, this_downtime->author, this_downtime->comment, this_downtime->start_time, this_downtime->end_time, this_downtime->fixed, this_downtime->triggered_by, this_downtime->duration, downtime_id, NULL); #endif /* free memory */ my_free(this_downtime->host_name); my_free(this_downtime->service_description); my_free(this_downtime->author); my_free(this_downtime->comment); my_free(this_downtime); return OK; } int delete_host_downtime(unsigned long downtime_id) { return delete_downtime(HOST_DOWNTIME, downtime_id); } int delete_service_downtime(unsigned long downtime_id) { return delete_downtime(SERVICE_DOWNTIME, downtime_id); } /* * Deletes all host and service downtimes on a host by hostname, * optionally filtered by service description, start time and comment. * All char* must be set or NULL - "" will silently fail to match * Returns number deleted */ int delete_downtime_by_hostname_service_description_start_time_comment(char *hostname, char *service_description, time_t start_time, char *cmnt) { scheduled_downtime *temp_downtime; scheduled_downtime *next_downtime; void *downtime_cpy; int deleted = 0; objectlist *matches = NULL, *tmp_match = NULL; /* Do not allow deletion of everything - must have at least 1 filter on */ if(hostname == NULL && service_description == NULL && start_time == 0 && cmnt == NULL) return deleted; for(temp_downtime = scheduled_downtime_list; temp_downtime != NULL; temp_downtime = next_downtime) { next_downtime = temp_downtime->next; if(start_time != 0 && temp_downtime->start_time != start_time) { continue; } if(cmnt != NULL && strcmp(temp_downtime->comment, cmnt) != 0) continue; if(temp_downtime->type == HOST_DOWNTIME) { /* If service is specified, then do not delete the host downtime */ if(service_description != NULL) continue; if(hostname != NULL && strcmp(temp_downtime->host_name, hostname) != 0) continue; } else if(temp_downtime->type == SERVICE_DOWNTIME) { if(hostname != NULL && strcmp(temp_downtime->host_name, hostname) != 0) continue; if(service_description != NULL && strcmp(temp_downtime->service_description, service_description) != 0) continue; } downtime_cpy = malloc(sizeof(scheduled_downtime)); memcpy(downtime_cpy, temp_downtime, sizeof(scheduled_downtime)); prepend_object_to_objectlist(&matches, downtime_cpy); deleted++; } for(tmp_match = matches; tmp_match != NULL; tmp_match = tmp_match->next) { temp_downtime = (scheduled_downtime *)tmp_match->object_ptr; unschedule_downtime(temp_downtime->type, temp_downtime->downtime_id); my_free(temp_downtime); } free_objectlist(&matches); return deleted; } #endif /******************************************************************/ /******************** ADDITION FUNCTIONS **************************/ /******************************************************************/ /* adds a host downtime entry to the list in memory */ int add_host_downtime(char *host_name, time_t entry_time, char *author, char *comment_data, time_t start_time, time_t flex_downtime_start, time_t end_time, int fixed, unsigned long triggered_by, unsigned long duration, unsigned long downtime_id, int is_in_effect, int start_notification_sent){ return add_downtime(HOST_DOWNTIME, host_name, NULL, entry_time, author, comment_data, start_time, flex_downtime_start, end_time, fixed, triggered_by, duration, downtime_id, is_in_effect, start_notification_sent); } /* adds a service downtime entry to the list in memory */ int add_service_downtime(char *host_name, char *svc_description, time_t entry_time, char *author, char *comment_data, time_t start_time, time_t flex_downtime_start, time_t end_time, int fixed, unsigned long triggered_by, unsigned long duration, unsigned long downtime_id, int is_in_effect, int start_notification_sent){ return add_downtime(SERVICE_DOWNTIME, host_name, svc_description, entry_time, author, comment_data, start_time, flex_downtime_start, end_time, fixed, triggered_by, duration, downtime_id, is_in_effect, start_notification_sent); } /* adds a host or service downtime entry to the list in memory */ int add_downtime(int downtime_type, char *host_name, char *svc_description, time_t entry_time, char *author, char *comment_data, time_t start_time, time_t flex_downtime_start, time_t end_time, int fixed, unsigned long triggered_by, unsigned long duration, unsigned long downtime_id, int is_in_effect, int start_notification_sent){ scheduled_downtime *new_downtime = NULL; int result = OK; log_debug_info(DEBUGL_FUNCTIONS, 0, "add_downtime()\n"); /* we don't have enough info */ if(host_name == NULL || (downtime_type == SERVICE_DOWNTIME && svc_description == NULL)) { log_debug_info(DEBUGL_DOWNTIME, 1, "Host name (%s) or service description (%s) is null\n", ((NULL == host_name) ? "null" : host_name), ((NULL == svc_description) ? "null" : svc_description)); return ERROR; } /* allocate memory for the downtime */ if((new_downtime = (scheduled_downtime *)calloc(1, sizeof(scheduled_downtime))) == NULL) { log_debug_info(DEBUGL_DOWNTIME, 1, "Unable to allocate memory for new downtime\n"); return ERROR; } /* duplicate vars */ if((new_downtime->host_name = (char *)strdup(host_name)) == NULL) { log_debug_info(DEBUGL_DOWNTIME, 1, "Unable to allocate memory for new downtime's host name\n"); result = ERROR; } if(downtime_type == SERVICE_DOWNTIME) { if((new_downtime->service_description = (char *)strdup(svc_description)) == NULL) { log_debug_info(DEBUGL_DOWNTIME, 1, "Unable to allocate memory for new downtime's service description\n"); result = ERROR; } } if(author) { if((new_downtime->author = (char *)strdup(author)) == NULL) { log_debug_info(DEBUGL_DOWNTIME, 1, "Unable to allocate memory for new downtime's author\n"); result = ERROR; } } if(comment_data) { if((new_downtime->comment = (char *)strdup(comment_data)) == NULL) { log_debug_info(DEBUGL_DOWNTIME, 1, "Unable to allocate memory for new downtime's comment\n"); result = ERROR; } } new_downtime->type = downtime_type; new_downtime->entry_time = entry_time; new_downtime->start_time = start_time; new_downtime->flex_downtime_start = flex_downtime_start; new_downtime->end_time = end_time; new_downtime->fixed = (fixed > 0) ? TRUE : FALSE; new_downtime->triggered_by = triggered_by; new_downtime->duration = duration; new_downtime->downtime_id = downtime_id; new_downtime->is_in_effect=is_in_effect; new_downtime->start_notification_sent=start_notification_sent; #ifdef NSCORE new_downtime->start_event = ( timed_event *)0; new_downtime->stop_event = ( timed_event *)0; #endif result = downtime_add(new_downtime); if (result) { if (new_downtime->type == SERVICE_DOWNTIME) { log_debug_info(DEBUGL_DOWNTIME, 0, "Failed to add downtime for service '%s' on host '%s': %s\n", new_downtime->service_description, new_downtime->host_name, dt_strerror(result)); } else { log_debug_info(DEBUGL_DOWNTIME, 0, "Failed to add downtime for host '%s': %s\n", new_downtime->host_name, dt_strerror(result)); } result = ERROR; } /* handle errors */ if(result == ERROR) { my_free(new_downtime->comment); my_free(new_downtime->author); my_free(new_downtime->service_description); my_free(new_downtime->host_name); my_free(new_downtime); return ERROR; } #ifdef NSCORE #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_downtime_data(NEBTYPE_DOWNTIME_LOAD, NEBFLAG_NONE, NEBATTR_NONE, downtime_type, host_name, svc_description, entry_time, author, comment_data, start_time, end_time, fixed, triggered_by, duration, downtime_id, NULL); #endif #endif return OK; } int sort_downtime(void) { scheduled_downtime **array, *temp_downtime; unsigned long i = 0, unsorted_downtimes = 0; log_debug_info(DEBUGL_FUNCTIONS, 0, "sort_downtime()\n"); if(!defer_downtime_sorting) return OK; defer_downtime_sorting = 0; temp_downtime = scheduled_downtime_list; while(temp_downtime != NULL) { temp_downtime = temp_downtime->next; unsorted_downtimes++; } if(!unsorted_downtimes) return OK; if(!(array = malloc(sizeof(*array) * unsorted_downtimes))) return ERROR; while(scheduled_downtime_list) { array[i++] = scheduled_downtime_list; scheduled_downtime_list = scheduled_downtime_list->next; } qsort((void *)array, i, sizeof(*array), downtime_compar); scheduled_downtime_list = temp_downtime = array[0]; temp_downtime->prev = NULL; for(i = 1; i < unsorted_downtimes; i++) { temp_downtime->next = array[i]; temp_downtime = temp_downtime->next; temp_downtime->prev = array[i-1]; } temp_downtime->next = NULL; my_free(array); return OK; } /******************************************************************/ /************************ SEARCH FUNCTIONS ************************/ /******************************************************************/ /* finds a specific downtime entry */ scheduled_downtime *find_downtime(int type, unsigned long downtime_id) { scheduled_downtime *dt = NULL; log_debug_info(DEBUGL_FUNCTIONS, 0, "find_downtime()\n"); dt = fanout_get(dt_fanout, downtime_id); if (dt && (type == ANY_DOWNTIME || type == dt->type)) return dt; return NULL; } /* finds a specific host downtime entry */ scheduled_downtime *find_host_downtime(unsigned long downtime_id) { return find_downtime(HOST_DOWNTIME, downtime_id); } /* finds a specific service downtime entry */ scheduled_downtime *find_service_downtime(unsigned long downtime_id) { return find_downtime(SERVICE_DOWNTIME, downtime_id); } /******************************************************************/ /********************* CLEANUP FUNCTIONS **************************/ /******************************************************************/ /* frees memory allocated for the scheduled downtime data */ void free_downtime_data(void) { scheduled_downtime *this_downtime = NULL; scheduled_downtime *next_downtime = NULL; fanout_destroy(dt_fanout, NULL); /* free memory for the scheduled_downtime list */ for(this_downtime = scheduled_downtime_list; this_downtime != NULL; this_downtime = next_downtime) { next_downtime = this_downtime->next; my_free(this_downtime->host_name); my_free(this_downtime->service_description); my_free(this_downtime->author); my_free(this_downtime->comment); my_free(this_downtime); } /* reset list pointer */ scheduled_downtime_list = NULL; return; } nagios-4.3.4/common/macros.c000066400000000000000000003207261314764422400157430ustar00rootroot00000000000000/***************************************************************************** * * MACROS.C - Common macro functions for Nagios * * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #include "../include/config.h" #include "../include/macros.h" #include "../include/common.h" #include "../include/objects.h" #include "../include/statusdata.h" #include "../include/comments.h" #ifdef NSCORE #include "../include/nagios.h" #else #include "../include/cgiutils.h" #endif static char *macro_x_names[MACRO_X_COUNT]; /* the macro names */ char *macro_user[MAX_USER_MACROS]; /* $USERx$ macros */ struct macro_key_code { char *name; /* macro key name */ char *value; /* macro value */ int code; /* numeric macro code, usable in case statements */ int options; /* Options for how the macro can be escaped */ }; static struct macro_key_code macro_keys[MACRO_X_COUNT]; /* * These point to their corresponding pointer arrays in global_macros * AFTER macros have been initialized. * * They really only exist so that eventbroker modules that reference * them won't need to be re-compiled, although modules that rely * on their values after having run a certain command will require an * update */ static char **macro_x = NULL; /* * scoped to this file to prevent (unintentional) mischief, * but see base/notifications.c for how to use it */ static nagios_macros global_macros; nagios_macros *get_global_macros(void) { return &global_macros; } /******************************************************************/ /************************ MACRO FUNCTIONS *************************/ /******************************************************************/ /* * locate a macro key based on its name by using a binary search * over all keys. O(log(n)) complexity and a vast improvement over * the previous linear scan */ static const struct macro_key_code *find_macro_key(const char *name) { unsigned int high, low = 0; int value; struct macro_key_code *key; high = MACRO_X_COUNT; while (high - low > 0) { unsigned int mid = low + ((high - low) / 2); key = ¯o_keys[mid]; value = strcmp(name, key->name); if (value == 0) { return key; } if (value > 0) low = mid + 1; else high = mid; } return NULL; } /* * replace macros in notification commands with their values, * the thread-safe version */ int process_macros_r(nagios_macros *mac, char *input_buffer, char **output_buffer, int options) { char *temp_buffer = NULL; char *save_buffer = NULL; char *buf_ptr = NULL; char *delim_ptr = NULL; int in_macro = FALSE; char *selected_macro = NULL; char *original_macro = NULL; int result = OK; int free_macro = FALSE; int macro_options = 0; log_debug_info(DEBUGL_FUNCTIONS, 0, "process_macros_r()\n"); if(output_buffer == NULL) return ERROR; *output_buffer = (char *)strdup(""); if(input_buffer == NULL) return ERROR; in_macro = FALSE; log_debug_info(DEBUGL_MACROS, 1, "**** BEGIN MACRO PROCESSING ***********\n"); log_debug_info(DEBUGL_MACROS, 1, "Processing: '%s'\n", input_buffer); /* use a duplicate of original buffer, so we don't modify the original */ save_buffer = buf_ptr = (input_buffer ? strdup(input_buffer) : NULL); while(buf_ptr) { /* save pointer to this working part of buffer */ temp_buffer = buf_ptr; /* find the next delimiter - terminate preceding string and advance buffer pointer for next run */ if((delim_ptr = strchr(buf_ptr, '$'))) { delim_ptr[0] = '\x0'; buf_ptr = (char *)delim_ptr + 1; } /* no delimiter found - we already have the last of the buffer */ else buf_ptr = NULL; log_debug_info(DEBUGL_MACROS, 2, " Processing part: '%s'\n", temp_buffer); selected_macro = NULL; /* we're in plain text... */ if(in_macro == FALSE) { /* add the plain text to the end of the already processed buffer */ *output_buffer = (char *)realloc(*output_buffer, strlen(*output_buffer) + strlen(temp_buffer) + 1); strcat(*output_buffer, temp_buffer); log_debug_info(DEBUGL_MACROS, 2, " Not currently in macro. Running output (%lu): '%s'\n", (unsigned long)strlen(*output_buffer), *output_buffer); in_macro = TRUE; } /* looks like we're in a macro, so process it... */ else { /* grab the macro value */ free_macro = FALSE; result = grab_macro_value_r(mac, temp_buffer, &selected_macro, ¯o_options, &free_macro); log_debug_info(DEBUGL_MACROS, 2, " Processed '%s', Free: %d\n", temp_buffer, free_macro); /* an error occurred - we couldn't parse the macro, so continue on */ if(result == ERROR) { log_debug_info(DEBUGL_MACROS, 0, " WARNING: An error occurred processing macro '%s'!\n", temp_buffer); if(free_macro == TRUE) my_free(selected_macro); } if (result == OK) ; /* do nothing special if things worked out ok */ /* an escaped $ is done by specifying two $$ next to each other */ else if(!strcmp(temp_buffer, "")) { log_debug_info(DEBUGL_MACROS, 2, " Escaped $. Running output (%lu): '%s'\n", (unsigned long)strlen(*output_buffer), *output_buffer); *output_buffer = (char *)realloc(*output_buffer, strlen(*output_buffer) + 2); strcat(*output_buffer, "$"); } /* a non-macro, just some user-defined string between two $s */ else { log_debug_info(DEBUGL_MACROS, 2, " Non-macro. Running output (%lu): '%s'\n", (unsigned long)strlen(*output_buffer), *output_buffer); /* add the plain text to the end of the already processed buffer */ *output_buffer = (char *)realloc(*output_buffer, strlen(*output_buffer) + strlen(temp_buffer) + 3); strcat(*output_buffer, "$"); strcat(*output_buffer, temp_buffer); strcat(*output_buffer, "$"); } /* insert macro */ if(selected_macro != NULL) { log_debug_info(DEBUGL_MACROS, 2, " Processed '%s', Free: %d, Cleaning options: %d\n", temp_buffer, free_macro, options); /* URL encode the macro if requested - this allocates new memory */ if(options & URL_ENCODE_MACRO_CHARS) { original_macro = selected_macro; selected_macro = get_url_encoded_string(selected_macro); if(free_macro == TRUE) { my_free(original_macro); } free_macro = TRUE; } /* some macros should sometimes be cleaned */ if(macro_options & options & (STRIP_ILLEGAL_MACRO_CHARS | ESCAPE_MACRO_CHARS)) { char *cleaned_macro = NULL; /* add the (cleaned) processed macro to the end of the already processed buffer */ if(selected_macro != NULL && (cleaned_macro = clean_macro_chars(selected_macro, options)) != NULL) { *output_buffer = (char *)realloc(*output_buffer, strlen(*output_buffer) + strlen(cleaned_macro) + 1); strcat(*output_buffer, cleaned_macro); if(*cleaned_macro) my_free(cleaned_macro); log_debug_info(DEBUGL_MACROS, 2, " Cleaned macro. Running output (%lu): '%s'\n", (unsigned long)strlen(*output_buffer), *output_buffer); } } /* others are not cleaned */ else { /* add the processed macro to the end of the already processed buffer */ if(selected_macro != NULL) { *output_buffer = (char *)realloc(*output_buffer, strlen(*output_buffer) + strlen(selected_macro) + 1); strcat(*output_buffer, selected_macro); log_debug_info(DEBUGL_MACROS, 2, " Uncleaned macro. Running output (%lu): '%s'\n", (unsigned long)strlen(*output_buffer), *output_buffer); } } /* free memory if necessary (if we URL encoded the macro or we were told to do so by grab_macro_value()) */ if(free_macro == TRUE) my_free(selected_macro); log_debug_info(DEBUGL_MACROS, 2, " Just finished macro. Running output (%lu): '%s'\n", (unsigned long)strlen(*output_buffer), *output_buffer); } in_macro = FALSE; } } /* free copy of input buffer */ my_free(save_buffer); log_debug_info(DEBUGL_MACROS, 1, " Done. Final output: '%s'\n", *output_buffer); log_debug_info(DEBUGL_MACROS, 1, "**** END MACRO PROCESSING *************\n"); return OK; } int process_macros(char *input_buffer, char **output_buffer, int options) { return process_macros_r(&global_macros, input_buffer, output_buffer, options); } /******************************************************************/ /********************** MACRO GRAB FUNCTIONS **********************/ /******************************************************************/ /* grab macros that are specific to a particular host */ int grab_host_macros_r(nagios_macros *mac, host *hst) { /* clear host-related macros */ clear_host_macros_r(mac); clear_hostgroup_macros_r(mac); /* save pointer to host */ mac->host_ptr = hst; mac->hostgroup_ptr = NULL; if(hst == NULL) return ERROR; /* save pointer to host's first/primary hostgroup */ if(hst->hostgroups_ptr) mac->hostgroup_ptr = (hostgroup *)hst->hostgroups_ptr->object_ptr; return OK; } int grab_host_macros(host *hst) { return grab_host_macros_r(&global_macros, hst); } /* grab hostgroup macros */ int grab_hostgroup_macros_r(nagios_macros *mac, hostgroup *hg) { /* clear hostgroup macros */ clear_hostgroup_macros_r(mac); /* save the hostgroup pointer for later */ mac->hostgroup_ptr = hg; if(hg == NULL) return ERROR; return OK; } int grab_hostgroup_macros(hostgroup *hg) { return grab_hostgroup_macros_r(&global_macros, hg); } /* grab macros that are specific to a particular service */ int grab_service_macros_r(nagios_macros *mac, service *svc) { /* clear service-related macros */ clear_service_macros_r(mac); clear_servicegroup_macros_r(mac); /* save pointer for later */ mac->service_ptr = svc; mac->servicegroup_ptr = NULL; if(svc == NULL) return ERROR; /* save first/primary servicegroup pointer for later */ if(svc->servicegroups_ptr) mac->servicegroup_ptr = (servicegroup *)svc->servicegroups_ptr->object_ptr; return OK; } int grab_service_macros(service *svc) { return grab_service_macros_r(&global_macros, svc); } /* grab macros that are specific to a particular servicegroup */ int grab_servicegroup_macros_r(nagios_macros *mac, servicegroup *sg) { /* clear servicegroup macros */ clear_servicegroup_macros_r(mac); /* save the pointer for later */ mac->servicegroup_ptr = sg; if(sg == NULL) return ERROR; return OK; } int grab_servicegroup_macros(servicegroup *sg) { return grab_servicegroup_macros_r(&global_macros, sg); } /* grab macros that are specific to a particular contact */ int grab_contact_macros_r(nagios_macros *mac, contact *cntct) { /* clear contact-related macros */ clear_contact_macros_r(mac); clear_contactgroup_macros_r(mac); /* save pointer to contact for later */ mac->contact_ptr = cntct; mac->contactgroup_ptr = NULL; if(cntct == NULL) return ERROR; /* save pointer to first/primary contactgroup for later */ if(cntct->contactgroups_ptr) mac->contactgroup_ptr = (contactgroup *)cntct->contactgroups_ptr->object_ptr; return OK; } int grab_contact_macros(contact *cntct) { return grab_contact_macros_r(&global_macros, cntct); } int grab_argv_macros_r(nagios_macros *mac, char *check_command) { char *cmd_ptr = check_command; char temp_arg[MAX_COMMAND_BUFFER] = ""; char *arg_buffer = NULL; int macro_options = STRIP_ILLEGAL_MACRO_CHARS | ESCAPE_MACRO_CHARS; register int x = 0; register int y = 0; register int arg_index = 0; /* clear the argv macros */ clear_argv_macros_r(mac); /* make sure we've got all the requirements */ if(cmd_ptr == NULL || cmd_ptr[0] == '\0') return ERROR; /* skip the command name (we're about to get the arguments)... */ for(arg_index = 0;; arg_index++) { if(cmd_ptr[arg_index] == '!' || cmd_ptr[arg_index] == '\x0') break; } /* get each command argument */ for(x = 0; x < MAX_COMMAND_ARGUMENTS; x++) { /* we reached the end of the arguments... */ if(cmd_ptr[arg_index] == '\x0') break; /* get the next argument */ /* can't use strtok(), as that's used in process_macros... */ for(arg_index++, y = 0; y < (int)sizeof(temp_arg) - 1; arg_index++) { /* handle escaped argument delimiters */ if(cmd_ptr[arg_index] == '\\' && cmd_ptr[arg_index+1] == '!') { arg_index++; } else if(cmd_ptr[arg_index] == '!' || cmd_ptr[arg_index] == '\x0') { /* end of argument */ break; } /* copy the character */ temp_arg[y] = cmd_ptr[arg_index]; y++; } temp_arg[y] = '\x0'; process_macros_r(mac, temp_arg, &arg_buffer, macro_options); mac->argv[x] = arg_buffer; } return OK; } /******************************************************************/ /******************* MACRO GENERATION FUNCTIONS *******************/ /******************************************************************/ /* this is the big one */ int grab_macro_value_r(nagios_macros *mac, char *macro_buffer, char **output, int *clean_options, int *free_macro) { char *buf = NULL; char *ptr = NULL; char *macro_name = NULL; char *arg[2] = {NULL, NULL}; contact *temp_contact = NULL; contactgroup *temp_contactgroup = NULL; contactsmember *temp_contactsmember = NULL; char *temp_buffer = NULL; int delimiter_len = 0; int x, result = OK; const struct macro_key_code *mkey; /* for the early cases, this is the default */ *free_macro = FALSE; if(output == NULL) return ERROR; /* clear the old macro value */ my_free(*output); if(macro_buffer == NULL || free_macro == NULL) return ERROR; if(clean_options) *clean_options = 0; /* * We handle argv and user macros first, since those are by far * the most commonly accessed ones (3.4 and 1.005 per check, * respectively). Since neither of them requires that we copy * the original buffer, we can also get away with some less * code for these simple cases. */ if(strstr(macro_buffer, "ARG") == macro_buffer) { /* which arg do we want? */ x = atoi(macro_buffer + 3); if(x <= 0 || x > MAX_COMMAND_ARGUMENTS) { return ERROR; } /* use a pre-computed macro value */ *output = mac->argv[x - 1]; return OK; } if(strstr(macro_buffer, "USER") == macro_buffer) { /* which macro do we want? */ x = atoi(macro_buffer + 4); if(x <= 0 || x > MAX_USER_MACROS) { return ERROR; } /* use a pre-computed macro value */ *output = macro_user[x - 1]; return OK; } /* most frequently used "x" macro gets a shortcut */ if(mac->host_ptr && !strcmp(macro_buffer, "HOSTADDRESS")) { if(mac->host_ptr->address) *output = mac->host_ptr->address; return OK; } /* work with a copy of the original buffer */ if((buf = (char *)strdup(macro_buffer)) == NULL) return ERROR; /* macro name is at start of buffer */ macro_name = buf; /* see if there's an argument - if so, this is most likely an on-demand macro */ if((ptr = strchr(buf, ':'))) { ptr[0] = '\x0'; ptr++; /* save the first argument - host name, hostgroup name, etc. */ arg[0] = ptr; /* try and find a second argument */ if((ptr = strchr(ptr, ':'))) { ptr[0] = '\x0'; ptr++; /* save second argument - service description or delimiter */ arg[1] = ptr; } } if ((mkey = find_macro_key(macro_name))) { log_debug_info(DEBUGL_MACROS, 2, " macros[%d] (%s) match.\n", mkey->code, macro_x_names[mkey->code]); /* get the macro value */ result = grab_macrox_value_r(mac, mkey->code, arg[0], arg[1], output, free_macro); /* Return the macro attributes */ if(clean_options) { *clean_options = mkey->options; } } /***** CONTACT ADDRESS MACROS *****/ /* NOTE: the code below should be broken out into a separate function */ else if(strstr(macro_name, "CONTACTADDRESS") == macro_name) { /* which address do we want? */ x = atoi(macro_name + 14) - 1; /* regular macro */ if(arg[0] == NULL) { /* use the saved pointer */ if((temp_contact = mac->contact_ptr) == NULL) { my_free(buf); return ERROR; } /* get the macro value by reference, so no need to free() */ *free_macro = FALSE; result = grab_contact_address_macro(x, temp_contact, output); } /* on-demand macro */ else { /* on-demand contact macro with a contactgroup and a delimiter */ if(arg[1] != NULL) { if((temp_contactgroup = find_contactgroup(arg[0])) == NULL) return ERROR; delimiter_len = strlen(arg[1]); /* concatenate macro values for all contactgroup members */ for(temp_contactsmember = temp_contactgroup->members; temp_contactsmember != NULL; temp_contactsmember = temp_contactsmember->next) { if((temp_contact = temp_contactsmember->contact_ptr) == NULL) continue; /* get the macro value for this contact */ grab_contact_address_macro(x, temp_contact, &temp_buffer); if(temp_buffer == NULL) continue; /* add macro value to already running macro */ if(*output == NULL) *output = (char *)strdup(temp_buffer); else { if((*output = (char *)realloc(*output, strlen(*output) + strlen(temp_buffer) + delimiter_len + 1)) == NULL) continue; strcat(*output, arg[1]); strcat(*output, temp_buffer); } my_free(temp_buffer); } } /* else on-demand contact macro */ else { /* find the contact */ if((temp_contact = find_contact(arg[0])) == NULL) { my_free(buf); return ERROR; } /* get the macro value */ result = grab_contact_address_macro(x, temp_contact, output); } } } /***** CUSTOM VARIABLE MACROS *****/ else if(macro_name[0] == '_') { /* get the macro value */ result = grab_custom_macro_value_r(mac, macro_name, arg[0], arg[1], output); } /* no macro matched... */ else { log_debug_info(DEBUGL_MACROS, 0, " WARNING: Could not find a macro matching '%s'!\n", macro_name); result = ERROR; } /* free memory */ my_free(buf); return result; } int grab_macro_value(char *macro_buffer, char **output, int *clean_options, int *free_macro) { return grab_macro_value_r(&global_macros, macro_buffer, output, clean_options, free_macro); } int grab_macrox_value_r(nagios_macros *mac, int macro_type, char *arg1, char *arg2, char **output, int *free_macro) { host *temp_host = NULL; hostgroup *temp_hostgroup = NULL; hostsmember *temp_hostsmember = NULL; service *temp_service = NULL; servicegroup *temp_servicegroup = NULL; servicesmember *temp_servicesmember = NULL; contact *temp_contact = NULL; contactgroup *temp_contactgroup = NULL; contactsmember *temp_contactsmember = NULL; char *temp_buffer = NULL; int result = OK; int delimiter_len = 0; int free_sub_macro = FALSE; #ifdef NSCORE register int x; int authorized = TRUE; int problem = TRUE; int hosts_up = 0; int hosts_down = 0; int hosts_unreachable = 0; int hosts_down_unhandled = 0; int hosts_unreachable_unhandled = 0; int host_problems = 0; int host_problems_unhandled = 0; int services_ok = 0; int services_warning = 0; int services_unknown = 0; int services_critical = 0; int services_warning_unhandled = 0; int services_unknown_unhandled = 0; int services_critical_unhandled = 0; int service_problems = 0; int service_problems_unhandled = 0; #endif if(output == NULL || free_macro == NULL) return ERROR; *free_macro = FALSE; /* handle the macro */ switch(macro_type) { /***************/ /* HOST MACROS */ /***************/ case MACRO_HOSTGROUPNAMES: case MACRO_HOSTINFOURL: *free_macro = TRUE; case MACRO_HOSTNAME: case MACRO_HOSTALIAS: case MACRO_HOSTADDRESS: case MACRO_LASTHOSTCHECK: case MACRO_LASTHOSTSTATECHANGE: case MACRO_HOSTOUTPUT: case MACRO_HOSTPERFDATA: case MACRO_HOSTSTATE: case MACRO_HOSTSTATEID: case MACRO_HOSTATTEMPT: case MACRO_HOSTEXECUTIONTIME: case MACRO_HOSTLATENCY: case MACRO_HOSTDURATION: case MACRO_HOSTDURATIONSEC: case MACRO_HOSTDOWNTIME: case MACRO_HOSTSTATETYPE: case MACRO_HOSTPERCENTCHANGE: case MACRO_HOSTACKAUTHOR: case MACRO_HOSTACKCOMMENT: case MACRO_LASTHOSTUP: case MACRO_LASTHOSTDOWN: case MACRO_LASTHOSTUNREACHABLE: case MACRO_HOSTCHECKCOMMAND: case MACRO_HOSTDISPLAYNAME: case MACRO_HOSTACTIONURL: case MACRO_HOSTNOTESURL: case MACRO_HOSTNOTES: case MACRO_HOSTCHECKTYPE: case MACRO_LONGHOSTOUTPUT: case MACRO_HOSTNOTIFICATIONNUMBER: case MACRO_HOSTNOTIFICATIONID: case MACRO_HOSTEVENTID: case MACRO_LASTHOSTEVENTID: case MACRO_HOSTACKAUTHORNAME: case MACRO_HOSTACKAUTHORALIAS: case MACRO_MAXHOSTATTEMPTS: case MACRO_TOTALHOSTSERVICES: case MACRO_TOTALHOSTSERVICESOK: case MACRO_TOTALHOSTSERVICESWARNING: case MACRO_TOTALHOSTSERVICESUNKNOWN: case MACRO_TOTALHOSTSERVICESCRITICAL: case MACRO_HOSTPROBLEMID: case MACRO_LASTHOSTPROBLEMID: case MACRO_LASTHOSTSTATE: case MACRO_LASTHOSTSTATEID: case MACRO_HOSTIMPORTANCE: case MACRO_HOSTANDSERVICESIMPORTANCE: /* a standard host macro */ if(arg2 == NULL) { /* find the host for on-demand macros */ if(arg1) { if((temp_host = find_host(arg1)) == NULL) { if (macro_type == MACRO_HOSTSTATEID) { *output = strdup("2"); return OK; } return ERROR; } } /* else use saved host pointer */ else if((temp_host = mac->host_ptr) == NULL) return ERROR; /* get the host macro value */ result = grab_standard_host_macro_r(mac, macro_type, temp_host, output, free_macro); } /* a host macro with a hostgroup name and delimiter */ else { if((temp_hostgroup = find_hostgroup(arg1)) == NULL) return ERROR; delimiter_len = strlen(arg2); /* concatenate macro values for all hostgroup members */ for(temp_hostsmember = temp_hostgroup->members; temp_hostsmember != NULL; temp_hostsmember = temp_hostsmember->next) { if((temp_host = temp_hostsmember->host_ptr) == NULL) continue; /* get the macro value for this host */ grab_standard_host_macro_r(mac, macro_type, temp_host, &temp_buffer, &free_sub_macro); if(temp_buffer == NULL) continue; /* add macro value to already running macro */ if(*output == NULL) *output = (char *)strdup(temp_buffer); else { if((*output = (char *)realloc(*output, strlen(*output) + strlen(temp_buffer) + delimiter_len + 1)) == NULL) continue; strcat(*output, arg2); strcat(*output, temp_buffer); } if(free_sub_macro == TRUE) my_free(temp_buffer); } } break; /********************/ /* HOSTGROUP MACROS */ /********************/ case MACRO_HOSTGROUPMEMBERS: case MACRO_HOSTGROUPMEMBERADDRESSES: *free_macro = TRUE; case MACRO_HOSTGROUPNAME: case MACRO_HOSTGROUPALIAS: case MACRO_HOSTGROUPNOTES: case MACRO_HOSTGROUPNOTESURL: case MACRO_HOSTGROUPACTIONURL: /* a standard hostgroup macro */ /* use the saved hostgroup pointer */ if(arg1 == NULL) { if((temp_hostgroup = mac->hostgroup_ptr) == NULL) return ERROR; } /* else find the hostgroup for on-demand macros */ else { if((temp_hostgroup = find_hostgroup(arg1)) == NULL) return ERROR; } /* get the hostgroup macro value */ result = grab_standard_hostgroup_macro_r(mac, macro_type, temp_hostgroup, output); break; /******************/ /* SERVICE MACROS */ /******************/ case MACRO_SERVICEGROUPNAMES: case MACRO_SERVICEINFOURL: *free_macro = TRUE; case MACRO_SERVICEDESC: case MACRO_SERVICESTATE: case MACRO_SERVICESTATEID: case MACRO_SERVICEATTEMPT: case MACRO_LASTSERVICECHECK: case MACRO_LASTSERVICESTATECHANGE: case MACRO_SERVICEOUTPUT: case MACRO_SERVICEPERFDATA: case MACRO_SERVICEEXECUTIONTIME: case MACRO_SERVICELATENCY: case MACRO_SERVICEDURATION: case MACRO_SERVICEDURATIONSEC: case MACRO_SERVICEDOWNTIME: case MACRO_SERVICESTATETYPE: case MACRO_SERVICEPERCENTCHANGE: case MACRO_SERVICEACKAUTHOR: case MACRO_SERVICEACKCOMMENT: case MACRO_LASTSERVICEOK: case MACRO_LASTSERVICEWARNING: case MACRO_LASTSERVICEUNKNOWN: case MACRO_LASTSERVICECRITICAL: case MACRO_SERVICECHECKCOMMAND: case MACRO_SERVICEDISPLAYNAME: case MACRO_SERVICEACTIONURL: case MACRO_SERVICENOTESURL: case MACRO_SERVICENOTES: case MACRO_SERVICECHECKTYPE: case MACRO_LONGSERVICEOUTPUT: case MACRO_SERVICENOTIFICATIONNUMBER: case MACRO_SERVICENOTIFICATIONID: case MACRO_SERVICEEVENTID: case MACRO_LASTSERVICEEVENTID: case MACRO_SERVICEACKAUTHORNAME: case MACRO_SERVICEACKAUTHORALIAS: case MACRO_MAXSERVICEATTEMPTS: case MACRO_SERVICEISVOLATILE: case MACRO_SERVICEPROBLEMID: case MACRO_LASTSERVICEPROBLEMID: case MACRO_LASTSERVICESTATE: case MACRO_LASTSERVICESTATEID: case MACRO_SERVICEIMPORTANCE: /* use saved service pointer */ if(arg1 == NULL && arg2 == NULL) { if((temp_service = mac->service_ptr) == NULL) return ERROR; result = grab_standard_service_macro_r(mac, macro_type, temp_service, output, free_macro); } /* else and ondemand macro... */ else { /* if first arg is blank, it means use the current host name */ if(arg1 == NULL || arg1[0] == '\x0') { if(mac->host_ptr == NULL) return ERROR; if((temp_service = find_service(mac->host_ptr->name, arg2))) { /* get the service macro value */ result = grab_standard_service_macro_r(mac, macro_type, temp_service, output, free_macro); } } /* on-demand macro with both host and service name */ else if((temp_service = find_service(arg1, arg2))) { /* get the service macro value */ result = grab_standard_service_macro_r(mac, macro_type, temp_service, output, free_macro); } /* else we have a service macro with a servicegroup name and a delimiter... */ else if(arg1 && arg2) { if((temp_servicegroup = find_servicegroup(arg1)) == NULL) { if (macro_type == MACRO_SERVICESTATEID) { *output = strdup("3"); return OK; } return ERROR; } delimiter_len = strlen(arg2); *free_macro = TRUE; /* concatenate macro values for all servicegroup members */ for(temp_servicesmember = temp_servicegroup->members; temp_servicesmember != NULL; temp_servicesmember = temp_servicesmember->next) { if((temp_service = temp_servicesmember->service_ptr) == NULL) continue; /* get the macro value for this service */ grab_standard_service_macro_r(mac, macro_type, temp_service, &temp_buffer, &free_sub_macro); if(temp_buffer == NULL) continue; /* add macro value to already running macro */ if(*output == NULL) *output = (char *)strdup(temp_buffer); else { if((*output = (char *)realloc(*output, strlen(*output) + strlen(temp_buffer) + delimiter_len + 1)) == NULL) continue; strcat(*output, arg2); strcat(*output, temp_buffer); } if(free_sub_macro == TRUE) my_free(temp_buffer); } } else return ERROR; } break; /***********************/ /* SERVICEGROUP MACROS */ /***********************/ case MACRO_SERVICEGROUPMEMBERS: case MACRO_SERVICEGROUPNOTES: case MACRO_SERVICEGROUPNOTESURL: case MACRO_SERVICEGROUPACTIONURL: *free_macro = TRUE; case MACRO_SERVICEGROUPNAME: case MACRO_SERVICEGROUPALIAS: /* a standard servicegroup macro */ /* use the saved servicegroup pointer */ if(arg1 == NULL) { if((temp_servicegroup = mac->servicegroup_ptr) == NULL) return ERROR; } /* else find the servicegroup for on-demand macros */ else { if((temp_servicegroup = find_servicegroup(arg1)) == NULL) return ERROR; } /* get the servicegroup macro value */ result = grab_standard_servicegroup_macro_r(mac, macro_type, temp_servicegroup, output); break; /******************/ /* CONTACT MACROS */ /******************/ case MACRO_CONTACTGROUPNAMES: *free_macro = TRUE; case MACRO_CONTACTNAME: case MACRO_CONTACTALIAS: case MACRO_CONTACTEMAIL: case MACRO_CONTACTPAGER: /* a standard contact macro */ if(arg2 == NULL) { /* find the contact for on-demand macros */ if(arg1) { if((temp_contact = find_contact(arg1)) == NULL) return ERROR; } /* else use saved contact pointer */ else if((temp_contact = mac->contact_ptr) == NULL) return ERROR; /* get the contact macro value */ result = grab_standard_contact_macro_r(mac, macro_type, temp_contact, output); } /* a contact macro with a contactgroup name and delimiter */ else { if((temp_contactgroup = find_contactgroup(arg1)) == NULL) return ERROR; delimiter_len = strlen(arg2); *free_macro = TRUE; /* concatenate macro values for all contactgroup members */ for(temp_contactsmember = temp_contactgroup->members; temp_contactsmember != NULL; temp_contactsmember = temp_contactsmember->next) { if((temp_contact = temp_contactsmember->contact_ptr) == NULL) continue; /* get the macro value for this contact */ grab_standard_contact_macro_r(mac, macro_type, temp_contact, &temp_buffer); if(temp_buffer == NULL) continue; /* add macro value to already running macro */ if(*output == NULL) *output = (char *)strdup(temp_buffer); else { if((*output = (char *)realloc(*output, strlen(*output) + strlen(temp_buffer) + delimiter_len + 1)) == NULL) continue; strcat(*output, arg2); strcat(*output, temp_buffer); } my_free(temp_buffer); } } break; /***********************/ /* CONTACTGROUP MACROS */ /***********************/ case MACRO_CONTACTGROUPMEMBERS: *free_macro = TRUE; case MACRO_CONTACTGROUPNAME: case MACRO_CONTACTGROUPALIAS: /* a standard contactgroup macro */ /* use the saved contactgroup pointer */ if(arg1 == NULL) { if((temp_contactgroup = mac->contactgroup_ptr) == NULL) return ERROR; } /* else find the contactgroup for on-demand macros */ else { if((temp_contactgroup = find_contactgroup(arg1)) == NULL) return ERROR; } /* get the contactgroup macro value */ result = grab_standard_contactgroup_macro(macro_type, temp_contactgroup, output); break; /***********************/ /* NOTIFICATION MACROS */ /***********************/ case MACRO_NOTIFICATIONTYPE: case MACRO_NOTIFICATIONNUMBER: case MACRO_NOTIFICATIONRECIPIENTS: case MACRO_NOTIFICATIONISESCALATED: case MACRO_NOTIFICATIONAUTHOR: case MACRO_NOTIFICATIONAUTHORNAME: case MACRO_NOTIFICATIONAUTHORALIAS: case MACRO_NOTIFICATIONCOMMENT: /* notification macros have already been pre-computed */ *output = mac->x[macro_type]; *free_macro = FALSE; break; /********************/ /* DATE/TIME MACROS */ /********************/ case MACRO_LONGDATETIME: case MACRO_SHORTDATETIME: case MACRO_DATE: case MACRO_TIME: *free_macro = TRUE; case MACRO_TIMET: case MACRO_ISVALIDTIME: case MACRO_NEXTVALIDTIME: /* calculate macros */ result = grab_datetime_macro_r(mac, macro_type, arg1, arg2, output); break; /*****************/ /* STATIC MACROS */ /*****************/ case MACRO_ADMINEMAIL: case MACRO_ADMINPAGER: case MACRO_MAINCONFIGFILE: case MACRO_STATUSDATAFILE: case MACRO_RETENTIONDATAFILE: case MACRO_OBJECTCACHEFILE: case MACRO_TEMPFILE: case MACRO_LOGFILE: case MACRO_RESOURCEFILE: case MACRO_COMMANDFILE: case MACRO_HOSTPERFDATAFILE: case MACRO_SERVICEPERFDATAFILE: case MACRO_PROCESSSTARTTIME: case MACRO_TEMPPATH: case MACRO_EVENTSTARTTIME: /* no need to do any more work - these are already precomputed for us */ *output = global_macros.x[macro_type]; *free_macro = FALSE; break; /******************/ /* SUMMARY MACROS */ /******************/ case MACRO_TOTALHOSTSUP: case MACRO_TOTALHOSTSDOWN: case MACRO_TOTALHOSTSUNREACHABLE: case MACRO_TOTALHOSTSDOWNUNHANDLED: case MACRO_TOTALHOSTSUNREACHABLEUNHANDLED: case MACRO_TOTALHOSTPROBLEMS: case MACRO_TOTALHOSTPROBLEMSUNHANDLED: case MACRO_TOTALSERVICESOK: case MACRO_TOTALSERVICESWARNING: case MACRO_TOTALSERVICESCRITICAL: case MACRO_TOTALSERVICESUNKNOWN: case MACRO_TOTALSERVICESWARNINGUNHANDLED: case MACRO_TOTALSERVICESCRITICALUNHANDLED: case MACRO_TOTALSERVICESUNKNOWNUNHANDLED: case MACRO_TOTALSERVICEPROBLEMS: case MACRO_TOTALSERVICEPROBLEMSUNHANDLED: #ifdef NSCORE /* generate summary macros if needed */ if(mac->x[MACRO_TOTALHOSTSUP] == NULL) { /* get host totals */ for(temp_host = host_list; temp_host != NULL; temp_host = temp_host->next) { /* filter totals based on contact if necessary */ if(mac->contact_ptr != NULL) authorized = is_contact_for_host(temp_host, mac->contact_ptr); if(authorized == TRUE) { problem = TRUE; if(temp_host->current_state == HOST_UP && temp_host->has_been_checked == TRUE) hosts_up++; else if(temp_host->current_state == HOST_DOWN) { if(temp_host->scheduled_downtime_depth > 0) problem = FALSE; if(temp_host->problem_has_been_acknowledged == TRUE) problem = FALSE; if(temp_host->checks_enabled == FALSE) problem = FALSE; if(problem == TRUE) hosts_down_unhandled++; hosts_down++; } else if(temp_host->current_state == HOST_UNREACHABLE) { if(temp_host->scheduled_downtime_depth > 0) problem = FALSE; if(temp_host->problem_has_been_acknowledged == TRUE) problem = FALSE; if(temp_host->checks_enabled == FALSE) problem = FALSE; if(problem == TRUE) hosts_down_unhandled++; hosts_unreachable++; } } } host_problems = hosts_down + hosts_unreachable; host_problems_unhandled = hosts_down_unhandled + hosts_unreachable_unhandled; /* get service totals */ for(temp_service = service_list; temp_service != NULL; temp_service = temp_service->next) { /* filter totals based on contact if necessary */ if(mac->contact_ptr != NULL) authorized = is_contact_for_service(temp_service, mac->contact_ptr); if(authorized == TRUE) { problem = TRUE; if(temp_service->current_state == STATE_OK && temp_service->has_been_checked == TRUE) services_ok++; else if(temp_service->current_state == STATE_WARNING) { temp_host = find_host(temp_service->host_name); if(temp_host != NULL && (temp_host->current_state == HOST_DOWN || temp_host->current_state == HOST_UNREACHABLE)) problem = FALSE; if(temp_service->scheduled_downtime_depth > 0) problem = FALSE; if(temp_service->problem_has_been_acknowledged == TRUE) problem = FALSE; if(temp_service->checks_enabled == FALSE) problem = FALSE; if(problem == TRUE) services_warning_unhandled++; services_warning++; } else if(temp_service->current_state == STATE_UNKNOWN) { temp_host = find_host(temp_service->host_name); if(temp_host != NULL && (temp_host->current_state == HOST_DOWN || temp_host->current_state == HOST_UNREACHABLE)) problem = FALSE; if(temp_service->scheduled_downtime_depth > 0) problem = FALSE; if(temp_service->problem_has_been_acknowledged == TRUE) problem = FALSE; if(temp_service->checks_enabled == FALSE) problem = FALSE; if(problem == TRUE) services_unknown_unhandled++; services_unknown++; } else if(temp_service->current_state == STATE_CRITICAL) { temp_host = find_host(temp_service->host_name); if(temp_host != NULL && (temp_host->current_state == HOST_DOWN || temp_host->current_state == HOST_UNREACHABLE)) problem = FALSE; if(temp_service->scheduled_downtime_depth > 0) problem = FALSE; if(temp_service->problem_has_been_acknowledged == TRUE) problem = FALSE; if(temp_service->checks_enabled == FALSE) problem = FALSE; if(problem == TRUE) services_critical_unhandled++; services_critical++; } } } service_problems = services_warning + services_critical + services_unknown; service_problems_unhandled = services_warning_unhandled + services_critical_unhandled + services_unknown_unhandled; /* these macros are time-intensive to compute, and will likely be used together, so save them all for future use */ for(x = MACRO_TOTALHOSTSUP; x <= MACRO_TOTALSERVICEPROBLEMSUNHANDLED; x++) my_free(mac->x[x]); asprintf(&mac->x[MACRO_TOTALHOSTSUP], "%d", hosts_up); asprintf(&mac->x[MACRO_TOTALHOSTSDOWN], "%d", hosts_down); asprintf(&mac->x[MACRO_TOTALHOSTSUNREACHABLE], "%d", hosts_unreachable); asprintf(&mac->x[MACRO_TOTALHOSTSDOWNUNHANDLED], "%d", hosts_down_unhandled); asprintf(&mac->x[MACRO_TOTALHOSTSUNREACHABLEUNHANDLED], "%d", hosts_unreachable_unhandled); asprintf(&mac->x[MACRO_TOTALHOSTPROBLEMS], "%d", host_problems); asprintf(&mac->x[MACRO_TOTALHOSTPROBLEMSUNHANDLED], "%d", host_problems_unhandled); asprintf(&mac->x[MACRO_TOTALSERVICESOK], "%d", services_ok); asprintf(&mac->x[MACRO_TOTALSERVICESWARNING], "%d", services_warning); asprintf(&mac->x[MACRO_TOTALSERVICESCRITICAL], "%d", services_critical); asprintf(&mac->x[MACRO_TOTALSERVICESUNKNOWN], "%d", services_unknown); asprintf(&mac->x[MACRO_TOTALSERVICESWARNINGUNHANDLED], "%d", services_warning_unhandled); asprintf(&mac->x[MACRO_TOTALSERVICESCRITICALUNHANDLED], "%d", services_critical_unhandled); asprintf(&mac->x[MACRO_TOTALSERVICESUNKNOWNUNHANDLED], "%d", services_unknown_unhandled); asprintf(&mac->x[MACRO_TOTALSERVICEPROBLEMS], "%d", service_problems); asprintf(&mac->x[MACRO_TOTALSERVICEPROBLEMSUNHANDLED], "%d", service_problems_unhandled); } /* return only the macro the user requested */ *output = mac->x[macro_type]; /* tell caller to NOT free memory when done */ *free_macro = FALSE; #endif break; default: log_debug_info(DEBUGL_MACROS, 0, "UNHANDLED MACRO #%d! THIS IS A BUG!\n", macro_type); return ERROR; break; } return result; } int grab_macrox_value(int macro_type, char *arg1, char *arg2, char **output, int *free_macro) { return grab_macrox_value_r(&global_macros, macro_type, arg1, arg2, output, free_macro); } /* calculates the value of a custom macro */ int grab_custom_macro_value_r(nagios_macros *mac, char *macro_name, char *arg1, char *arg2, char **output) { host *temp_host = NULL; hostgroup *temp_hostgroup = NULL; hostsmember *temp_hostsmember = NULL; service *temp_service = NULL; servicegroup *temp_servicegroup = NULL; servicesmember *temp_servicesmember = NULL; contact *temp_contact = NULL; contactgroup *temp_contactgroup = NULL; contactsmember *temp_contactsmember = NULL; int delimiter_len = 0; char *temp_buffer = NULL; int result = OK; if(macro_name == NULL || output == NULL) return ERROR; /***** CUSTOM HOST MACRO *****/ if(strstr(macro_name, "_HOST") == macro_name) { /* a standard host macro */ if(arg2 == NULL) { /* find the host for on-demand macros */ if(arg1) { if((temp_host = find_host(arg1)) == NULL) return ERROR; } /* else use saved host pointer */ else if((temp_host = mac->host_ptr) == NULL) return ERROR; /* get the host macro value */ result = grab_custom_object_macro_r(mac, macro_name + 5, temp_host->custom_variables, output); } /* a host macro with a hostgroup name and delimiter */ else { if((temp_hostgroup = find_hostgroup(arg1)) == NULL) return ERROR; delimiter_len = strlen(arg2); /* concatenate macro values for all hostgroup members */ for(temp_hostsmember = temp_hostgroup->members; temp_hostsmember != NULL; temp_hostsmember = temp_hostsmember->next) { if((temp_host = temp_hostsmember->host_ptr) == NULL) continue; /* get the macro value for this host */ grab_custom_macro_value_r(mac, macro_name, temp_host->name, NULL, &temp_buffer); if(temp_buffer == NULL) continue; /* add macro value to already running macro */ if(*output == NULL) *output = (char *)strdup(temp_buffer); else { if((*output = (char *)realloc(*output, strlen(*output) + strlen(temp_buffer) + delimiter_len + 1)) == NULL) continue; strcat(*output, arg2); strcat(*output, temp_buffer); } my_free(temp_buffer); } } } /***** CUSTOM SERVICE MACRO *****/ else if(strstr(macro_name, "_SERVICE") == macro_name) { /* use saved service pointer */ if(arg1 == NULL && arg2 == NULL) { if((temp_service = mac->service_ptr) == NULL) return ERROR; /* get the service macro value */ result = grab_custom_object_macro_r(mac, macro_name + 8, temp_service->custom_variables, output); } /* else and ondemand macro... */ else { /* if first arg is blank, it means use the current host name */ if(mac->host_ptr == NULL) return ERROR; if((temp_service = find_service((mac->host_ptr) ? mac->host_ptr->name : NULL, arg2))) { /* get the service macro value */ result = grab_custom_object_macro_r(mac, macro_name + 8, temp_service->custom_variables, output); } /* else we have a service macro with a servicegroup name and a delimiter... */ else { if((temp_servicegroup = find_servicegroup(arg1)) == NULL) return ERROR; delimiter_len = strlen(arg2); /* concatenate macro values for all servicegroup members */ for(temp_servicesmember = temp_servicegroup->members; temp_servicesmember != NULL; temp_servicesmember = temp_servicesmember->next) { if((temp_service = temp_servicesmember->service_ptr) == NULL) continue; /* get the macro value for this service */ grab_custom_macro_value_r(mac, macro_name, temp_service->host_name, temp_service->description, &temp_buffer); if(temp_buffer == NULL) continue; /* add macro value to already running macro */ if(*output == NULL) *output = (char *)strdup(temp_buffer); else { if((*output = (char *)realloc(*output, strlen(*output) + strlen(temp_buffer) + delimiter_len + 1)) == NULL) continue; strcat(*output, arg2); strcat(*output, temp_buffer); } my_free(temp_buffer); } } } } /***** CUSTOM CONTACT VARIABLE *****/ else if(strstr(macro_name, "_CONTACT") == macro_name) { /* a standard contact macro */ if(arg2 == NULL) { /* find the contact for on-demand macros */ if(arg1) { if((temp_contact = find_contact(arg1)) == NULL) return ERROR; } /* else use saved contact pointer */ else if((temp_contact = mac->contact_ptr) == NULL) return ERROR; /* get the contact macro value */ result = grab_custom_object_macro_r(mac, macro_name + 8, temp_contact->custom_variables, output); } /* a contact macro with a contactgroup name and delimiter */ else { if((temp_contactgroup = find_contactgroup(arg1)) == NULL) return ERROR; delimiter_len = strlen(arg2); /* concatenate macro values for all contactgroup members */ for(temp_contactsmember = temp_contactgroup->members; temp_contactsmember != NULL; temp_contactsmember = temp_contactsmember->next) { if((temp_contact = temp_contactsmember->contact_ptr) == NULL) continue; /* get the macro value for this contact */ grab_custom_macro_value_r(mac, macro_name, temp_contact->name, NULL, &temp_buffer); if(temp_buffer == NULL) continue; /* add macro value to already running macro */ if(*output == NULL) *output = (char *)strdup(temp_buffer); else { if((*output = (char *)realloc(*output, strlen(*output) + strlen(temp_buffer) + delimiter_len + 1)) == NULL) continue; strcat(*output, arg2); strcat(*output, temp_buffer); } my_free(temp_buffer); } } } else return ERROR; return result; } int grab_custom_macro_value(char *macro_name, char *arg1, char *arg2, char **output) { return grab_custom_macro_value_r(&global_macros, macro_name, arg1, arg2, output); } /* calculates a date/time macro */ int grab_datetime_macro_r(nagios_macros *mac, int macro_type, char *arg1, char *arg2, char **output) { time_t current_time = 0L; timeperiod *temp_timeperiod = NULL; #ifdef NSCORE time_t test_time = 0L; time_t next_valid_time = 0L; #endif if(output == NULL) return ERROR; /* get the current time */ time(¤t_time); /* parse args, do prep work */ switch(macro_type) { case MACRO_ISVALIDTIME: case MACRO_NEXTVALIDTIME: /* find the timeperiod */ if((temp_timeperiod = find_timeperiod(arg1)) == NULL) return ERROR; /* what timestamp should we use? */ #ifdef NSCORE if(arg2) test_time = (time_t)strtoul(arg2, NULL, 0); else test_time = current_time; #endif break; default: break; } /* calculate the value */ switch(macro_type) { case MACRO_LONGDATETIME: if(*output == NULL) *output = (char *)malloc(MAX_DATETIME_LENGTH); if(*output) get_datetime_string(¤t_time, *output, MAX_DATETIME_LENGTH, LONG_DATE_TIME); break; case MACRO_SHORTDATETIME: if(*output == NULL) *output = (char *)malloc(MAX_DATETIME_LENGTH); if(*output) get_datetime_string(¤t_time, *output, MAX_DATETIME_LENGTH, SHORT_DATE_TIME); break; case MACRO_DATE: if(*output == NULL) *output = (char *)malloc(MAX_DATETIME_LENGTH); if(*output) get_datetime_string(¤t_time, *output, MAX_DATETIME_LENGTH, SHORT_DATE); break; case MACRO_TIME: if(*output == NULL) *output = (char *)malloc(MAX_DATETIME_LENGTH); if(*output) get_datetime_string(¤t_time, *output, MAX_DATETIME_LENGTH, SHORT_TIME); break; case MACRO_TIMET: *output = (char *)mkstr("%lu", (unsigned long)current_time); break; #ifdef NSCORE case MACRO_ISVALIDTIME: *output = (char *)mkstr("%d", (check_time_against_period(test_time, temp_timeperiod) == OK) ? 1 : 0); break; case MACRO_NEXTVALIDTIME: get_next_valid_time(test_time, &next_valid_time, temp_timeperiod); if(next_valid_time == test_time && check_time_against_period(test_time, temp_timeperiod) == ERROR) next_valid_time = (time_t)0L; *output = (char *)mkstr("%lu", (unsigned long)next_valid_time); break; #endif default: return ERROR; break; } return OK; } int grab_datetime_macro(int macro_type, char *arg1, char *arg2, char **output) { return grab_datetime_macro_r(&global_macros, macro_type, arg1, arg2, output); } /* calculates a host macro */ int grab_standard_host_macro_r(nagios_macros *mac, int macro_type, host *temp_host, char **output, int *free_macro) { char *temp_buffer = NULL; #ifdef NSCORE hostgroup *temp_hostgroup = NULL; servicesmember *temp_servicesmember = NULL; service *temp_service = NULL; objectlist *temp_objectlist = NULL; time_t current_time = 0L; unsigned long duration = 0L; int days = 0; int hours = 0; int minutes = 0; int seconds = 0; char *buf1 = NULL; char *buf2 = NULL; int total_host_services = 0; int total_host_services_ok = 0; int total_host_services_warning = 0; int total_host_services_unknown = 0; int total_host_services_critical = 0; #endif if(temp_host == NULL || output == NULL || free_macro == NULL) return ERROR; /* get the macro */ switch(macro_type) { case MACRO_HOSTNAME: *output = temp_host->name; break; case MACRO_HOSTDISPLAYNAME: if(temp_host->display_name) *output = temp_host->display_name; break; case MACRO_HOSTALIAS: *output = temp_host->alias; break; case MACRO_HOSTADDRESS: *output = temp_host->address; break; #ifdef NSCORE case MACRO_HOSTSTATE: *output = (char *)host_state_name(temp_host->current_state); break; case MACRO_HOSTSTATEID: *output = (char *)mkstr("%d", temp_host->current_state); break; case MACRO_LASTHOSTSTATE: *output = (char *)host_state_name(temp_host->last_state); break; case MACRO_LASTHOSTSTATEID: *output = (char *)mkstr("%d", temp_host->last_state); break; case MACRO_HOSTCHECKTYPE: *output = (char *)check_type_name(temp_host->check_type); break; case MACRO_HOSTSTATETYPE: *output = (char *)state_type_name(temp_host->state_type); break; case MACRO_HOSTOUTPUT: if(temp_host->plugin_output) *output = temp_host->plugin_output; break; case MACRO_LONGHOSTOUTPUT: if(temp_host->long_plugin_output) *output = temp_host->long_plugin_output; break; case MACRO_HOSTPERFDATA: if(temp_host->perf_data) *output = temp_host->perf_data; break; #endif case MACRO_HOSTCHECKCOMMAND: if(temp_host->check_command) *output = temp_host->check_command; break; #ifdef NSCORE case MACRO_HOSTATTEMPT: *output = (char *)mkstr("%d", temp_host->current_attempt); break; case MACRO_MAXHOSTATTEMPTS: *output = (char *)mkstr("%d", temp_host->max_attempts); break; case MACRO_HOSTDOWNTIME: *output = (char *)mkstr("%d", temp_host->scheduled_downtime_depth); break; case MACRO_HOSTPERCENTCHANGE: *output = (char *)mkstr("%.2f", temp_host->percent_state_change); break; case MACRO_HOSTDURATIONSEC: case MACRO_HOSTDURATION: time(¤t_time); duration = (unsigned long)(current_time - temp_host->last_state_change); if(macro_type == MACRO_HOSTDURATIONSEC) *output = (char *)mkstr("%lu", duration); else { days = duration / 86400; duration -= (days * 86400); hours = duration / 3600; duration -= (hours * 3600); minutes = duration / 60; duration -= (minutes * 60); seconds = duration; *output = (char *)mkstr("%dd %dh %dm %ds", days, hours, minutes, seconds); } break; case MACRO_HOSTEXECUTIONTIME: *output = (char *)mkstr("%.3f", temp_host->execution_time); break; case MACRO_HOSTLATENCY: *output = (char *)mkstr("%.3f", temp_host->latency); break; case MACRO_LASTHOSTCHECK: *output = (char *)mkstr("%lu", (unsigned long)temp_host->last_check); break; case MACRO_LASTHOSTSTATECHANGE: *output = (char *)mkstr("%lu", (unsigned long)temp_host->last_state_change); break; case MACRO_LASTHOSTUP: *output = (char *)mkstr("%lu", (unsigned long)temp_host->last_time_up); break; case MACRO_LASTHOSTDOWN: *output = (char *)mkstr("%lu", (unsigned long)temp_host->last_time_down); break; case MACRO_LASTHOSTUNREACHABLE: *output = (char *)mkstr("%lu", (unsigned long)temp_host->last_time_unreachable); break; case MACRO_HOSTNOTIFICATIONNUMBER: *output = (char *)mkstr("%d", temp_host->current_notification_number); break; case MACRO_HOSTNOTIFICATIONID: *output = (char *)mkstr("%lu", temp_host->current_notification_id); break; case MACRO_HOSTEVENTID: *output = (char *)mkstr("%lu", temp_host->current_event_id); break; case MACRO_LASTHOSTEVENTID: *output = (char *)mkstr("%lu", temp_host->last_event_id); break; case MACRO_HOSTPROBLEMID: *output = (char *)mkstr("%lu", temp_host->current_problem_id); break; case MACRO_LASTHOSTPROBLEMID: *output = (char *)mkstr("%lu", temp_host->last_problem_id); break; #endif case MACRO_HOSTACTIONURL: if(temp_host->action_url) *output = temp_host->action_url; break; case MACRO_HOSTNOTESURL: if(temp_host->notes_url) *output = temp_host->notes_url; break; case MACRO_HOSTNOTES: if(temp_host->notes) *output = temp_host->notes; break; #ifdef NSCORE case MACRO_HOSTGROUPNAMES: /* find all hostgroups this host is associated with */ for(temp_objectlist = temp_host->hostgroups_ptr; temp_objectlist != NULL; temp_objectlist = temp_objectlist->next) { if((temp_hostgroup = (hostgroup *)temp_objectlist->object_ptr) == NULL) continue; asprintf(&buf1, "%s%s%s", (buf2) ? buf2 : "", (buf2) ? "," : "", temp_hostgroup->group_name); my_free(buf2); buf2 = buf1; } if(buf2) { *output = (char *)strdup(buf2); my_free(buf2); } break; case MACRO_TOTALHOSTSERVICES: case MACRO_TOTALHOSTSERVICESOK: case MACRO_TOTALHOSTSERVICESWARNING: case MACRO_TOTALHOSTSERVICESUNKNOWN: case MACRO_TOTALHOSTSERVICESCRITICAL: /* generate host service summary macros (if they haven't already been computed) */ if(mac->x[MACRO_TOTALHOSTSERVICES] == NULL) { for(temp_servicesmember = temp_host->services; temp_servicesmember != NULL; temp_servicesmember = temp_servicesmember->next) { if((temp_service = temp_servicesmember->service_ptr) == NULL) continue; total_host_services++; switch(temp_service->current_state) { case STATE_OK: total_host_services_ok++; break; case STATE_WARNING: total_host_services_warning++; break; case STATE_UNKNOWN: total_host_services_unknown++; break; case STATE_CRITICAL: total_host_services_critical++; break; default: break; } } /* these macros are time-intensive to compute, and will likely be used together, so save them all for future use */ mac->x[MACRO_TOTALHOSTSERVICES] = (char *)mkstr("%d", total_host_services); mac->x[MACRO_TOTALHOSTSERVICESOK] = (char *)mkstr("%d", total_host_services_ok); mac->x[MACRO_TOTALHOSTSERVICESWARNING] = (char *)mkstr("%d", total_host_services_warning); mac->x[MACRO_TOTALHOSTSERVICESUNKNOWN] = (char *)mkstr("%d", total_host_services_unknown); mac->x[MACRO_TOTALHOSTSERVICESCRITICAL] = (char *)mkstr("%d", total_host_services_critical); } /* return only the macro the user requested */ *output = mac->x[macro_type]; break; case MACRO_HOSTIMPORTANCE: *output = (char *)mkstr("%u", temp_host->hourly_value); break; case MACRO_HOSTANDSERVICESIMPORTANCE: *output = (char *)mkstr("%u", temp_host->hourly_value + host_services_value(temp_host)); break; case MACRO_HOSTINFOURL: buf1 = get_url_encoded_string(temp_host->name); asprintf(output, "%s/cgi-bin/extinfo.cgi?type=1&host=%s", website_url ? website_url : "website_url not set", buf1); my_free(buf1); break; #endif /***************/ /* MISC MACROS */ /***************/ case MACRO_HOSTACKAUTHOR: case MACRO_HOSTACKAUTHORNAME: case MACRO_HOSTACKAUTHORALIAS: case MACRO_HOSTACKCOMMENT: /* no need to do any more work - these are already precomputed elsewhere */ /* NOTE: these macros won't work as on-demand macros */ *output = mac->x[macro_type]; break; default: log_debug_info(DEBUGL_MACROS, 0, "UNHANDLED HOST MACRO #%d! THIS IS A BUG!\n", macro_type); return ERROR; break; } /* post-processing */ /* notes, notes URL and action URL macros may themselves contain macros, so process them... */ switch(macro_type) { case MACRO_HOSTACTIONURL: case MACRO_HOSTNOTESURL: *free_macro = TRUE; process_macros_r(mac, *output, &temp_buffer, URL_ENCODE_MACRO_CHARS); *output = temp_buffer; break; case MACRO_HOSTNOTES: *free_macro = TRUE; process_macros_r(mac, *output, &temp_buffer, 0); *output = temp_buffer; break; default: break; } return OK; } int grab_standard_host_macro(int macro_type, host *temp_host, char **output, int *free_macro) { return grab_standard_host_macro_r(&global_macros, macro_type, temp_host, output, free_macro); } /* computes a hostgroup macro */ int grab_standard_hostgroup_macro_r(nagios_macros *mac, int macro_type, hostgroup *temp_hostgroup, char **output) { hostsmember *temp_hostsmember = NULL; char *temp_buffer = NULL; unsigned int temp_len = 0; if(temp_hostgroup == NULL || output == NULL) return ERROR; /* get the macro value */ switch(macro_type) { case MACRO_HOSTGROUPNAME: *output = temp_hostgroup->group_name; break; case MACRO_HOSTGROUPALIAS: if(temp_hostgroup->alias) *output = temp_hostgroup->alias; break; case MACRO_HOSTGROUPMEMBERS: case MACRO_HOSTGROUPMEMBERADDRESSES: /* make the calculations for total string length */ for(temp_hostsmember = temp_hostgroup->members; temp_hostsmember != NULL; temp_hostsmember = temp_hostsmember->next) { if(macro_type == MACRO_HOSTGROUPMEMBERS) { if(temp_hostsmember->host_name != NULL) temp_len += strlen(temp_hostsmember->host_name) + 2; } else { if(temp_hostsmember->host_ptr->address != NULL) temp_len += strlen(temp_hostsmember->host_ptr->address) + 2; } } if(!temp_len) { /* empty group, so return the nul string */ *output = calloc(1, 1); return OK; } /* allocate or reallocate the memory buffer */ if(*output == NULL) { *output = (char *)malloc(temp_len); **output = '\0'; } else { temp_len += strlen(*output); *output = (char *)realloc(*output, temp_len); } /* now fill in the string with the member names or addresses */ for(temp_hostsmember = temp_hostgroup->members; temp_hostsmember != NULL; temp_hostsmember = temp_hostsmember->next) { if(macro_type == MACRO_HOSTGROUPMEMBERS) { if(temp_hostsmember->host_name == NULL) continue; } else { if(temp_hostsmember->host_ptr->address == NULL) continue; } if(**output != '\0') strcat(*output, ","); if(macro_type == MACRO_HOSTGROUPMEMBERS) strcat(*output, temp_hostsmember->host_name); else strcat(*output, temp_hostsmember->host_ptr->address); } break; case MACRO_HOSTGROUPACTIONURL: if(temp_hostgroup->action_url) *output = temp_hostgroup->action_url; break; case MACRO_HOSTGROUPNOTESURL: if(temp_hostgroup->notes_url) *output = temp_hostgroup->notes_url; break; case MACRO_HOSTGROUPNOTES: if(temp_hostgroup->notes) *output = temp_hostgroup->notes; break; default: log_debug_info(DEBUGL_MACROS, 0, "UNHANDLED HOSTGROUP MACRO #%d! THIS IS A BUG!\n", macro_type); return ERROR; break; } /* post-processing */ /* notes, notes URL and action URL macros may themselves contain macros, so process them... */ switch(macro_type) { case MACRO_HOSTGROUPACTIONURL: case MACRO_HOSTGROUPNOTESURL: process_macros_r(mac, *output, &temp_buffer, URL_ENCODE_MACRO_CHARS); *output = temp_buffer; break; case MACRO_HOSTGROUPNOTES: process_macros_r(mac, *output, &temp_buffer, 0); *output = temp_buffer; break; default: break; } return OK; } int grab_standard_hostgroup_macro(int macro_type, hostgroup *temp_hostgroup, char **output) { return grab_standard_hostgroup_macro_r(&global_macros, macro_type, temp_hostgroup, output); } /* computes a service macro */ int grab_standard_service_macro_r(nagios_macros *mac, int macro_type, service *temp_service, char **output, int *free_macro) { char *temp_buffer = NULL; #ifdef NSCORE servicegroup *temp_servicegroup = NULL; objectlist *temp_objectlist = NULL; time_t current_time = 0L; unsigned long duration = 0L; int days = 0; int hours = 0; int minutes = 0; int seconds = 0; char *buf1 = NULL; char *buf2 = NULL; #endif if(temp_service == NULL || output == NULL) return ERROR; /* get the macro value */ switch(macro_type) { case MACRO_SERVICEDESC: *output = temp_service->description; break; case MACRO_SERVICEDISPLAYNAME: if(temp_service->display_name) *output = temp_service->display_name; break; #ifdef NSCORE case MACRO_SERVICEOUTPUT: if(temp_service->plugin_output) *output = temp_service->plugin_output; break; case MACRO_LONGSERVICEOUTPUT: if(temp_service->long_plugin_output) *output = temp_service->long_plugin_output; break; case MACRO_SERVICEPERFDATA: if(temp_service->perf_data) *output = temp_service->perf_data; break; #endif case MACRO_SERVICECHECKCOMMAND: if(temp_service->check_command) *output = temp_service->check_command; break; #ifdef NSCORE case MACRO_SERVICECHECKTYPE: *output = (char *)check_type_name(temp_service->check_type); break; case MACRO_SERVICESTATETYPE: *output = (char *)state_type_name(temp_service->state_type); break; case MACRO_SERVICESTATE: *output = (char *)service_state_name(temp_service->current_state); break; case MACRO_SERVICESTATEID: *output = (char *)mkstr("%d", temp_service->current_state); break; case MACRO_LASTSERVICESTATE: *output = (char *)service_state_name(temp_service->last_state); break; case MACRO_LASTSERVICESTATEID: *output = (char *)mkstr("%d", temp_service->last_state); break; #endif case MACRO_SERVICEISVOLATILE: *output = (char *)mkstr("%d", temp_service->is_volatile); break; #ifdef NSCORE case MACRO_SERVICEATTEMPT: *output = (char *)mkstr("%d", temp_service->current_attempt); break; case MACRO_MAXSERVICEATTEMPTS: *output = (char *)mkstr("%d", temp_service->max_attempts); break; case MACRO_SERVICEEXECUTIONTIME: *output = (char *)mkstr("%.3f", temp_service->execution_time); break; case MACRO_SERVICELATENCY: *output = (char *)mkstr("%.3f", temp_service->latency); break; case MACRO_LASTSERVICECHECK: *output = (char *)mkstr("%lu", (unsigned long)temp_service->last_check); break; case MACRO_LASTSERVICESTATECHANGE: *output = (char *)mkstr("%lu", (unsigned long)temp_service->last_state_change); break; case MACRO_LASTSERVICEOK: *output = (char *)mkstr("%lu", (unsigned long)temp_service->last_time_ok); break; case MACRO_LASTSERVICEWARNING: *output = (char *)mkstr("%lu", (unsigned long)temp_service->last_time_warning); break; case MACRO_LASTSERVICEUNKNOWN: *output = (char *)mkstr("%lu", (unsigned long)temp_service->last_time_unknown); break; case MACRO_LASTSERVICECRITICAL: *output = (char *)mkstr("%lu", (unsigned long)temp_service->last_time_critical); break; case MACRO_SERVICEDOWNTIME: *output = (char *)mkstr("%d", temp_service->scheduled_downtime_depth); break; case MACRO_SERVICEPERCENTCHANGE: *output = (char *)mkstr("%.2f", temp_service->percent_state_change); break; case MACRO_SERVICEDURATIONSEC: case MACRO_SERVICEDURATION: time(¤t_time); duration = (unsigned long)(current_time - temp_service->last_state_change); /* get the state duration in seconds */ if(macro_type == MACRO_SERVICEDURATIONSEC) *output = (char *)mkstr("%lu", duration); /* get the state duration */ else { days = duration / 86400; duration -= (days * 86400); hours = duration / 3600; duration -= (hours * 3600); minutes = duration / 60; duration -= (minutes * 60); seconds = duration; *output = (char *)mkstr("%dd %dh %dm %ds", days, hours, minutes, seconds); } break; case MACRO_SERVICENOTIFICATIONNUMBER: *output = (char *)mkstr("%d", temp_service->current_notification_number); break; case MACRO_SERVICENOTIFICATIONID: *output = (char *)mkstr("%lu", temp_service->current_notification_id); break; case MACRO_SERVICEEVENTID: *output = (char *)mkstr("%lu", temp_service->current_event_id); break; case MACRO_LASTSERVICEEVENTID: *output = (char *)mkstr("%lu", temp_service->last_event_id); break; case MACRO_SERVICEPROBLEMID: *output = (char *)mkstr("%lu", temp_service->current_problem_id); break; case MACRO_LASTSERVICEPROBLEMID: *output = (char *)mkstr("%lu", temp_service->last_problem_id); break; #endif case MACRO_SERVICEACTIONURL: if(temp_service->action_url) *output = temp_service->action_url; break; case MACRO_SERVICENOTESURL: if(temp_service->notes_url) *output = temp_service->notes_url; break; case MACRO_SERVICENOTES: if(temp_service->notes) *output = temp_service->notes; break; #ifdef NSCORE case MACRO_SERVICEGROUPNAMES: /* find all servicegroups this service is associated with */ for(temp_objectlist = temp_service->servicegroups_ptr; temp_objectlist != NULL; temp_objectlist = temp_objectlist->next) { if((temp_servicegroup = (servicegroup *)temp_objectlist->object_ptr) == NULL) continue; asprintf(&buf1, "%s%s%s", (buf2) ? buf2 : "", (buf2) ? "," : "", temp_servicegroup->group_name); my_free(buf2); buf2 = buf1; } if(buf2) { *output = (char *)strdup(buf2); my_free(buf2); } break; case MACRO_SERVICEIMPORTANCE: *output = (char *)mkstr("%u", temp_service->hourly_value); break; case MACRO_SERVICEINFOURL: buf1 = get_url_encoded_string(temp_service->host_name); buf2 = get_url_encoded_string(temp_service->description); asprintf(output, "%s/cgi-bin/extinfo.cgi?type=2&host=%s&service=%s", website_url ? website_url : "website_url not set", buf1, buf2); my_free(buf1); my_free(buf2); break; my_free(buf1); break; #endif /***************/ /* MISC MACROS */ /***************/ case MACRO_SERVICEACKAUTHOR: case MACRO_SERVICEACKAUTHORNAME: case MACRO_SERVICEACKAUTHORALIAS: case MACRO_SERVICEACKCOMMENT: /* no need to do any more work - these are already precomputed elsewhere */ /* NOTE: these macros won't work as on-demand macros */ *output = mac->x[macro_type]; *free_macro = FALSE; break; default: log_debug_info(DEBUGL_MACROS, 0, "UNHANDLED SERVICE MACRO #%d! THIS IS A BUG!\n", macro_type); return ERROR; break; } /* post-processing */ /* notes, notes URL and action URL macros may themselves contain macros, so process them... */ switch(macro_type) { case MACRO_SERVICEACTIONURL: case MACRO_SERVICENOTESURL: process_macros_r(mac, *output, &temp_buffer, URL_ENCODE_MACRO_CHARS); *output = temp_buffer; break; case MACRO_SERVICENOTES: process_macros_r(mac, *output, &temp_buffer, 0); *output = temp_buffer; break; default: break; } return OK; } int grab_standard_service_macro(int macro_type, service *temp_service, char **output, int *free_macro) { return grab_standard_service_macro_r(&global_macros, macro_type, temp_service, output, free_macro); } /* computes a servicegroup macro */ int grab_standard_servicegroup_macro_r(nagios_macros *mac, int macro_type, servicegroup *temp_servicegroup, char **output) { servicesmember *temp_servicesmember = NULL; char *temp_buffer = NULL; unsigned int temp_len = 0; unsigned int init_len = 0; if(temp_servicegroup == NULL || output == NULL) return ERROR; /* get the macro value */ switch(macro_type) { case MACRO_SERVICEGROUPNAME: *output = temp_servicegroup->group_name; break; case MACRO_SERVICEGROUPALIAS: if(temp_servicegroup->alias) *output = temp_servicegroup->alias; break; case MACRO_SERVICEGROUPMEMBERS: /* make the calculations for total string length */ for(temp_servicesmember = temp_servicegroup->members; temp_servicesmember != NULL; temp_servicesmember = temp_servicesmember->next) { if(temp_servicesmember->host_name == NULL || temp_servicesmember->service_description == NULL) continue; if(temp_len == 0) { temp_len += strlen(temp_servicesmember->host_name) + strlen(temp_servicesmember->service_description) + 2; } else { temp_len += strlen(temp_servicesmember->host_name) + strlen(temp_servicesmember->service_description) + 3; } } if(!temp_len) { /* empty group, so return the nul string */ *output = calloc(1, 1); return OK; } /* allocate or reallocate the memory buffer */ if(*output == NULL) { *output = (char *)malloc(temp_len); } else { init_len = strlen(*output); temp_len += init_len; *output = (char *)realloc(*output, temp_len); } /* now fill in the string with the group members */ for(temp_servicesmember = temp_servicegroup->members; temp_servicesmember != NULL; temp_servicesmember = temp_servicesmember->next) { if(temp_servicesmember->host_name == NULL || temp_servicesmember->service_description == NULL) continue; temp_buffer = *output + init_len; if(init_len == 0) { /* If our buffer didn't contain anything, we just need to write "%s,%s" */ init_len += sprintf(temp_buffer, "%s,%s", temp_servicesmember->host_name, temp_servicesmember->service_description); } else { /* Now we need to write ",%s,%s" */ init_len += sprintf(temp_buffer, ",%s,%s", temp_servicesmember->host_name, temp_servicesmember->service_description); } } break; case MACRO_SERVICEGROUPACTIONURL: if(temp_servicegroup->action_url) *output = temp_servicegroup->action_url; break; case MACRO_SERVICEGROUPNOTESURL: if(temp_servicegroup->notes_url) *output = temp_servicegroup->notes_url; break; case MACRO_SERVICEGROUPNOTES: if(temp_servicegroup->notes) *output = temp_servicegroup->notes; break; default: log_debug_info(DEBUGL_MACROS, 0, "UNHANDLED SERVICEGROUP MACRO #%d! THIS IS A BUG!\n", macro_type); return ERROR; } /* post-processing */ /* notes, notes URL and action URL macros may themselves contain macros, so process them... */ switch(macro_type) { case MACRO_SERVICEGROUPACTIONURL: case MACRO_SERVICEGROUPNOTESURL: process_macros_r(mac, *output, &temp_buffer, URL_ENCODE_MACRO_CHARS); *output = temp_buffer; break; case MACRO_SERVICEGROUPNOTES: process_macros_r(mac, *output, &temp_buffer, 0); *output = temp_buffer; break; default: break; } return OK; } int grab_standard_servicegroup_macro(int macro_type, servicegroup *temp_servicegroup, char **output) { return grab_standard_servicegroup_macro_r(&global_macros, macro_type, temp_servicegroup, output); } /* computes a contact macro */ int grab_standard_contact_macro_r(nagios_macros *mac, int macro_type, contact *temp_contact, char **output) { #ifdef NSCORE contactgroup *temp_contactgroup = NULL; objectlist *temp_objectlist = NULL; char *buf1 = NULL; char *buf2 = NULL; #endif if(temp_contact == NULL || output == NULL) return ERROR; /* get the macro value */ switch(macro_type) { case MACRO_CONTACTNAME: *output = temp_contact->name; break; case MACRO_CONTACTALIAS: *output = temp_contact->alias; break; case MACRO_CONTACTEMAIL: if(temp_contact->email) *output = temp_contact->email; break; case MACRO_CONTACTPAGER: if(temp_contact->pager) *output = temp_contact->pager; break; #ifdef NSCORE case MACRO_CONTACTGROUPNAMES: /* get the contactgroup names */ /* find all contactgroups this contact is a member of */ for(temp_objectlist = temp_contact->contactgroups_ptr; temp_objectlist != NULL; temp_objectlist = temp_objectlist->next) { if((temp_contactgroup = (contactgroup *)temp_objectlist->object_ptr) == NULL) continue; asprintf(&buf1, "%s%s%s", (buf2) ? buf2 : "", (buf2) ? "," : "", temp_contactgroup->group_name); my_free(buf2); buf2 = buf1; } if(buf2) { *output = (char *)strdup(buf2); my_free(buf2); } break; #endif default: log_debug_info(DEBUGL_MACROS, 0, "UNHANDLED CONTACT MACRO #%d! THIS IS A BUG!\n", macro_type); return ERROR; } return OK; } int grab_standard_contact_macro(int macro_type, contact *temp_contact, char **output) { return grab_standard_contact_macro_r(&global_macros, macro_type, temp_contact, output); } /* computes a contact address macro */ int grab_contact_address_macro(int macro_num, contact *temp_contact, char **output) { if(macro_num < 0 || macro_num >= MAX_CONTACT_ADDRESSES) return ERROR; if(temp_contact == NULL || output == NULL) return ERROR; /* get the macro */ if(temp_contact->address[macro_num]) *output = temp_contact->address[macro_num]; return OK; } /* computes a contactgroup macro */ int grab_standard_contactgroup_macro(int macro_type, contactgroup *temp_contactgroup, char **output) { contactsmember *temp_contactsmember = NULL; if(temp_contactgroup == NULL || output == NULL) return ERROR; /* get the macro value */ switch(macro_type) { case MACRO_CONTACTGROUPNAME: *output = temp_contactgroup->group_name; break; case MACRO_CONTACTGROUPALIAS: if(temp_contactgroup->alias) *output = temp_contactgroup->alias; break; case MACRO_CONTACTGROUPMEMBERS: /* get the member list */ for(temp_contactsmember = temp_contactgroup->members; temp_contactsmember != NULL; temp_contactsmember = temp_contactsmember->next) { if(temp_contactsmember->contact_name == NULL) continue; if(*output == NULL) *output = (char *)strdup(temp_contactsmember->contact_name); else if((*output = (char *)realloc(*output, strlen(*output) + strlen(temp_contactsmember->contact_name) + 2))) { strcat(*output, ","); strcat(*output, temp_contactsmember->contact_name); } } break; default: log_debug_info(DEBUGL_MACROS, 0, "UNHANDLED CONTACTGROUP MACRO #%d! THIS IS A BUG!\n", macro_type); return ERROR; } return OK; } /* computes a custom object macro */ int grab_custom_object_macro_r(nagios_macros *mac, char *macro_name, customvariablesmember *vars, char **output) { customvariablesmember *temp_customvariablesmember = NULL; int result = ERROR; if(macro_name == NULL || vars == NULL || output == NULL) return ERROR; /* get the custom variable */ for(temp_customvariablesmember = vars; temp_customvariablesmember != NULL; temp_customvariablesmember = temp_customvariablesmember->next) { if(temp_customvariablesmember->variable_name == NULL) continue; if(!strcmp(macro_name, temp_customvariablesmember->variable_name)) { if(temp_customvariablesmember->variable_value) *output = temp_customvariablesmember->variable_value; result = OK; break; } } return result; } int grab_custom_object_macro(char *macro_name, customvariablesmember *vars, char **output) { return grab_custom_object_macro_r(&global_macros, macro_name, vars, output); } /******************************************************************/ /********************* MACRO STRING FUNCTIONS *********************/ /******************************************************************/ /* cleans illegal characters in macros before output */ char *clean_macro_chars(char *macro, int options) { register int x = 0; register int y = 0; register int ch = 0; register int len = 0; char *ret = NULL; if(macro == NULL || !*macro) return ""; len = (int)strlen(macro); ret = strdup(macro); /* strip illegal characters out of macro */ if(options & STRIP_ILLEGAL_MACRO_CHARS) { for(y = 0, x = 0; x < len; x++) { ch = macro[x] & 0xff; /* illegal chars are skipped */ if(!illegal_output_char_map[ch]) ret[y++] = ret[x]; } ret[y++] = '\x0'; } return ret; } /* encodes a string in proper URL format */ char *get_url_encoded_string(char *input) { /* From RFC 3986: segment = *pchar [...] pchar = unreserved / pct-encoded / sub-delims / ":" / "@" query = *( pchar / "/" / "?" ) fragment = *( pchar / "/" / "?" ) pct-encoded = "%" HEXDIG HEXDIG unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" reserved = gen-delims / sub-delims gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@" sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "=" Encode everything but "unreserved", to be on safe side. Another note: nowhere in the RFC states that + is interpreted as space. Therefore, encode space as %20 (as all other characters that should be escaped) */ register int x = 0; register int y = 0; char *encoded_url_string = NULL; /* bail if no input */ if(input == NULL) return NULL; /* allocate enough memory to escape all characters if necessary */ if((encoded_url_string = (char *)malloc((strlen(input) * 3) + 1)) == NULL) return NULL; /* check/encode all characters */ for(x = 0, y = 0; input[x]; x++) { /* alpha-numeric characters and a few other characters don't get encoded */ if(((char)input[x] >= '0' && (char)input[x] <= '9') || ((char)input[x] >= 'A' && (char)input[x] <= 'Z') || ((char)input[x] >= 'a' && (char)input[x] <= 'z') || (char)input[x] == '.' || (char)input[x] == '-' || (char)input[x] == '_' || (char)input[x] == '~') { encoded_url_string[y++] = input[x]; } /* anything else gets represented by its hex value */ else { sprintf(&encoded_url_string[y], "%%%02X", (unsigned int)(input[x] & 0xFF)); y += 3; } } /* terminate encoded string */ encoded_url_string[y] = '\x0'; return encoded_url_string; } static int macro_key_cmp(const void *a_, const void *b_) { struct macro_key_code *a = (struct macro_key_code *)a_; struct macro_key_code *b = (struct macro_key_code *)b_; return strcmp(a->name, b->name); } /******************************************************************/ /***************** MACRO INITIALIZATION FUNCTIONS *****************/ /******************************************************************/ /* initializes global macros */ int init_macros(void) { int x; init_macrox_names(); for(x = 0; x < 32; x++) illegal_output_char_map[x] = 1; illegal_output_char_map[127] = 1; /* * non-volatile macros are free()'d when they're set. * We must do this in order to not lose the constant * ones when we get SIGHUP or a RESTART_PROGRAM event * from the command fifo. Otherwise a memset() would * have been better. */ clear_volatile_macros_r(&global_macros); /* backwards compatibility hack */ macro_x = global_macros.x; /* * Now build an ordered list of X macro names so we can * do binary lookups later and avoid a ton of strcmp()'s * for each and every check that gets run. A hash table * is actually slower, since the most frequently used * keys are so long and a binary lookup is completed in * 7 steps for up to ~200 keys, worst case. */ for (x = 0; x < MACRO_X_COUNT; x++) { macro_keys[x].code = x; macro_keys[x].name = macro_x_names[x]; /* This tells which escaping is possible to do on the macro */ macro_keys[x].options = URL_ENCODE_MACRO_CHARS; switch(x) { case MACRO_HOSTOUTPUT: case MACRO_LONGHOSTOUTPUT: case MACRO_HOSTPERFDATA: case MACRO_HOSTACKAUTHOR: case MACRO_HOSTACKCOMMENT: case MACRO_SERVICEOUTPUT: case MACRO_LONGSERVICEOUTPUT: case MACRO_SERVICEPERFDATA: case MACRO_SERVICEACKAUTHOR: case MACRO_SERVICEACKCOMMENT: macro_keys[x].options |= STRIP_ILLEGAL_MACRO_CHARS | ESCAPE_MACRO_CHARS; break; } } qsort(macro_keys, x, sizeof(struct macro_key_code), macro_key_cmp); return OK; } /* * initializes the names of macros, using this nifty little macro * which ensures we never add any typos to the list */ #define add_macrox_name(name) macro_x_names[MACRO_##name] = strdup(#name) int init_macrox_names(void) { register int x = 0; /* initialize macro names */ for(x = 0; x < MACRO_X_COUNT; x++) macro_x_names[x] = NULL; /* initialize each macro name */ add_macrox_name(HOSTNAME); add_macrox_name(HOSTALIAS); add_macrox_name(HOSTADDRESS); add_macrox_name(SERVICEDESC); add_macrox_name(SERVICESTATE); add_macrox_name(SERVICESTATEID); add_macrox_name(SERVICEATTEMPT); add_macrox_name(SERVICEISVOLATILE); add_macrox_name(LONGDATETIME); add_macrox_name(SHORTDATETIME); add_macrox_name(DATE); add_macrox_name(TIME); add_macrox_name(TIMET); add_macrox_name(LASTHOSTCHECK); add_macrox_name(LASTSERVICECHECK); add_macrox_name(LASTHOSTSTATECHANGE); add_macrox_name(LASTSERVICESTATECHANGE); add_macrox_name(HOSTOUTPUT); add_macrox_name(SERVICEOUTPUT); add_macrox_name(HOSTPERFDATA); add_macrox_name(SERVICEPERFDATA); add_macrox_name(CONTACTNAME); add_macrox_name(CONTACTALIAS); add_macrox_name(CONTACTEMAIL); add_macrox_name(CONTACTPAGER); add_macrox_name(ADMINEMAIL); add_macrox_name(ADMINPAGER); add_macrox_name(HOSTSTATE); add_macrox_name(HOSTSTATEID); add_macrox_name(HOSTATTEMPT); add_macrox_name(NOTIFICATIONTYPE); add_macrox_name(NOTIFICATIONNUMBER); add_macrox_name(NOTIFICATIONISESCALATED); add_macrox_name(HOSTEXECUTIONTIME); add_macrox_name(SERVICEEXECUTIONTIME); add_macrox_name(HOSTLATENCY); add_macrox_name(SERVICELATENCY); add_macrox_name(HOSTDURATION); add_macrox_name(SERVICEDURATION); add_macrox_name(HOSTDURATIONSEC); add_macrox_name(SERVICEDURATIONSEC); add_macrox_name(HOSTDOWNTIME); add_macrox_name(SERVICEDOWNTIME); add_macrox_name(HOSTSTATETYPE); add_macrox_name(SERVICESTATETYPE); add_macrox_name(HOSTPERCENTCHANGE); add_macrox_name(SERVICEPERCENTCHANGE); add_macrox_name(HOSTGROUPNAME); add_macrox_name(HOSTGROUPALIAS); add_macrox_name(SERVICEGROUPNAME); add_macrox_name(SERVICEGROUPALIAS); add_macrox_name(HOSTACKAUTHOR); add_macrox_name(HOSTACKCOMMENT); add_macrox_name(SERVICEACKAUTHOR); add_macrox_name(SERVICEACKCOMMENT); add_macrox_name(LASTSERVICEOK); add_macrox_name(LASTSERVICEWARNING); add_macrox_name(LASTSERVICEUNKNOWN); add_macrox_name(LASTSERVICECRITICAL); add_macrox_name(LASTHOSTUP); add_macrox_name(LASTHOSTDOWN); add_macrox_name(LASTHOSTUNREACHABLE); add_macrox_name(SERVICECHECKCOMMAND); add_macrox_name(HOSTCHECKCOMMAND); add_macrox_name(MAINCONFIGFILE); add_macrox_name(STATUSDATAFILE); add_macrox_name(HOSTDISPLAYNAME); add_macrox_name(SERVICEDISPLAYNAME); add_macrox_name(RETENTIONDATAFILE); add_macrox_name(OBJECTCACHEFILE); add_macrox_name(TEMPFILE); add_macrox_name(LOGFILE); add_macrox_name(RESOURCEFILE); add_macrox_name(COMMANDFILE); add_macrox_name(HOSTPERFDATAFILE); add_macrox_name(SERVICEPERFDATAFILE); add_macrox_name(HOSTACTIONURL); add_macrox_name(HOSTNOTESURL); add_macrox_name(HOSTNOTES); add_macrox_name(SERVICEACTIONURL); add_macrox_name(SERVICENOTESURL); add_macrox_name(SERVICENOTES); add_macrox_name(TOTALHOSTSUP); add_macrox_name(TOTALHOSTSDOWN); add_macrox_name(TOTALHOSTSUNREACHABLE); add_macrox_name(TOTALHOSTSDOWNUNHANDLED); add_macrox_name(TOTALHOSTSUNREACHABLEUNHANDLED); add_macrox_name(TOTALHOSTPROBLEMS); add_macrox_name(TOTALHOSTPROBLEMSUNHANDLED); add_macrox_name(TOTALSERVICESOK); add_macrox_name(TOTALSERVICESWARNING); add_macrox_name(TOTALSERVICESCRITICAL); add_macrox_name(TOTALSERVICESUNKNOWN); add_macrox_name(TOTALSERVICESWARNINGUNHANDLED); add_macrox_name(TOTALSERVICESCRITICALUNHANDLED); add_macrox_name(TOTALSERVICESUNKNOWNUNHANDLED); add_macrox_name(TOTALSERVICEPROBLEMS); add_macrox_name(TOTALSERVICEPROBLEMSUNHANDLED); add_macrox_name(PROCESSSTARTTIME); add_macrox_name(HOSTCHECKTYPE); add_macrox_name(SERVICECHECKTYPE); add_macrox_name(LONGHOSTOUTPUT); add_macrox_name(LONGSERVICEOUTPUT); add_macrox_name(TEMPPATH); add_macrox_name(HOSTNOTIFICATIONNUMBER); add_macrox_name(SERVICENOTIFICATIONNUMBER); add_macrox_name(HOSTNOTIFICATIONID); add_macrox_name(SERVICENOTIFICATIONID); add_macrox_name(HOSTEVENTID); add_macrox_name(LASTHOSTEVENTID); add_macrox_name(SERVICEEVENTID); add_macrox_name(LASTSERVICEEVENTID); add_macrox_name(HOSTGROUPNAMES); add_macrox_name(SERVICEGROUPNAMES); add_macrox_name(HOSTACKAUTHORNAME); add_macrox_name(HOSTACKAUTHORALIAS); add_macrox_name(SERVICEACKAUTHORNAME); add_macrox_name(SERVICEACKAUTHORALIAS); add_macrox_name(MAXHOSTATTEMPTS); add_macrox_name(MAXSERVICEATTEMPTS); add_macrox_name(TOTALHOSTSERVICES); add_macrox_name(TOTALHOSTSERVICESOK); add_macrox_name(TOTALHOSTSERVICESWARNING); add_macrox_name(TOTALHOSTSERVICESUNKNOWN); add_macrox_name(TOTALHOSTSERVICESCRITICAL); add_macrox_name(HOSTGROUPNOTES); add_macrox_name(HOSTGROUPNOTESURL); add_macrox_name(HOSTGROUPACTIONURL); add_macrox_name(SERVICEGROUPNOTES); add_macrox_name(SERVICEGROUPNOTESURL); add_macrox_name(SERVICEGROUPACTIONURL); add_macrox_name(HOSTGROUPMEMBERS); add_macrox_name(SERVICEGROUPMEMBERS); add_macrox_name(CONTACTGROUPNAME); add_macrox_name(CONTACTGROUPALIAS); add_macrox_name(CONTACTGROUPMEMBERS); add_macrox_name(CONTACTGROUPNAMES); add_macrox_name(NOTIFICATIONRECIPIENTS); add_macrox_name(NOTIFICATIONAUTHOR); add_macrox_name(NOTIFICATIONAUTHORNAME); add_macrox_name(NOTIFICATIONAUTHORALIAS); add_macrox_name(NOTIFICATIONCOMMENT); add_macrox_name(EVENTSTARTTIME); add_macrox_name(HOSTPROBLEMID); add_macrox_name(LASTHOSTPROBLEMID); add_macrox_name(SERVICEPROBLEMID); add_macrox_name(LASTSERVICEPROBLEMID); add_macrox_name(ISVALIDTIME); add_macrox_name(NEXTVALIDTIME); add_macrox_name(LASTHOSTSTATE); add_macrox_name(LASTHOSTSTATEID); add_macrox_name(LASTSERVICESTATE); add_macrox_name(LASTSERVICESTATEID); add_macrox_name(HOSTIMPORTANCE); add_macrox_name(SERVICEIMPORTANCE); add_macrox_name(HOSTANDSERVICESIMPORTANCE); add_macrox_name(HOSTGROUPMEMBERADDRESSES); add_macrox_name(HOSTINFOURL); add_macrox_name(SERVICEINFOURL); return OK; } /******************************************************************/ /********************* MACRO CLEANUP FUNCTIONS ********************/ /******************************************************************/ /* free memory associated with the macrox names */ int free_macrox_names(void) { register int x = 0; /* free each macro name */ for(x = 0; x < MACRO_X_COUNT; x++) my_free(macro_x_names[x]); return OK; } /* clear argv macros - used in commands */ int clear_argv_macros_r(nagios_macros *mac) { register int x = 0; /* command argument macros */ for(x = 0; x < MAX_COMMAND_ARGUMENTS; x++) my_free(mac->argv[x]); return OK; } int clear_argv_macros(void) { return clear_argv_macros_r(&global_macros); } /* * copies non-volatile macros from global macro_x to **dest, which * must be large enough to hold at least MACRO_X_COUNT entries. * We use a shortlived macro to save up on typing */ #define cp_macro(name) dest[MACRO_##name] = global_macros.x[MACRO_##name] void copy_constant_macros(char **dest) { cp_macro(ADMINEMAIL); cp_macro(ADMINPAGER); cp_macro(MAINCONFIGFILE); cp_macro(STATUSDATAFILE); cp_macro(RETENTIONDATAFILE); cp_macro(OBJECTCACHEFILE); cp_macro(TEMPFILE); cp_macro(LOGFILE); cp_macro(RESOURCEFILE); cp_macro(COMMANDFILE); cp_macro(HOSTPERFDATAFILE); cp_macro(SERVICEPERFDATAFILE); cp_macro(PROCESSSTARTTIME); cp_macro(TEMPPATH); cp_macro(EVENTSTARTTIME); } #undef cp_macro static void clear_custom_vars(customvariablesmember **vars) { customvariablesmember *this_customvariablesmember = NULL; customvariablesmember *next_customvariablesmember = NULL; for(this_customvariablesmember = *vars; this_customvariablesmember != NULL; this_customvariablesmember = next_customvariablesmember) { next_customvariablesmember = this_customvariablesmember->next; my_free(this_customvariablesmember->variable_name); my_free(this_customvariablesmember->variable_value); my_free(this_customvariablesmember); } *vars = NULL; } /* clear all macros that are not "constant" (i.e. they change throughout the course of monitoring) */ int clear_volatile_macros_r(nagios_macros *mac) { register int x = 0; log_debug_info(DEBUGL_FUNCTIONS, 0, "clear_volatile_macros_r()\n"); clear_host_macros_r(mac); clear_service_macros_r(mac); clear_summary_macros_r(mac); clear_hostgroup_macros_r(mac); clear_servicegroup_macros_r(mac); clear_contactgroup_macros_r(mac); clear_contact_macros_r(mac); clear_datetime_macros_r(mac); /* contact address macros */ for(x = 0; x < MAX_CONTACT_ADDRESSES; x++) my_free(mac->contactaddress[x]); /* clear on-demand macro */ my_free(mac->ondemand); /* clear ARGx macros */ clear_argv_macros_r(mac); return OK; } int clear_volatile_macros(void) { return clear_volatile_macros_r(&global_macros); } /* clear datetime macros */ int clear_datetime_macros_r(nagios_macros *mac) { my_free(mac->x[MACRO_LONGDATETIME]); my_free(mac->x[MACRO_SHORTDATETIME]); my_free(mac->x[MACRO_DATE]); my_free(mac->x[MACRO_TIME]); return OK; } /* clear service macros */ int clear_service_macros_r(nagios_macros *mac) { /* these are recursive but persistent. what to do? */ my_free(mac->x[MACRO_SERVICEACTIONURL]); my_free(mac->x[MACRO_SERVICENOTESURL]); my_free(mac->x[MACRO_SERVICENOTES]); my_free(mac->x[MACRO_SERVICEGROUPNAMES]); /* clear custom service variables */ clear_custom_vars(&(mac->custom_service_vars)); /* clear pointers */ mac->service_ptr = NULL; return OK; } int clear_service_macros(void) { return clear_service_macros_r(&global_macros); } /* clear host macros */ int clear_host_macros_r(nagios_macros *mac) { /* these are recursive but persistent. what to do? */ my_free(mac->x[MACRO_HOSTACTIONURL]); my_free(mac->x[MACRO_HOSTNOTESURL]); my_free(mac->x[MACRO_HOSTNOTES]); /* numbers or by necessity autogenerated strings */ my_free(mac->x[MACRO_HOSTGROUPNAMES]); /* clear custom host variables */ clear_custom_vars(&(mac->custom_host_vars)); /* clear pointers */ mac->host_ptr = NULL; return OK; } int clear_host_macros(void) { return clear_host_macros_r(&global_macros); } /* clear hostgroup macros */ int clear_hostgroup_macros_r(nagios_macros *mac) { /* recursive but persistent. what to do? */ my_free(mac->x[MACRO_HOSTGROUPACTIONURL]); my_free(mac->x[MACRO_HOSTGROUPNOTESURL]); my_free(mac->x[MACRO_HOSTGROUPNOTES]); /* generated */ my_free(mac->x[MACRO_HOSTGROUPMEMBERS]); my_free(mac->x[MACRO_HOSTGROUPMEMBERADDRESSES]); /* clear pointers */ mac->hostgroup_ptr = NULL; return OK; } int clear_hostgroup_macros(void) { return clear_hostgroup_macros_r(&global_macros); } /* clear servicegroup macros */ int clear_servicegroup_macros_r(nagios_macros *mac) { /* recursive but persistent. what to do? */ my_free(mac->x[MACRO_SERVICEGROUPACTIONURL]); my_free(mac->x[MACRO_SERVICEGROUPNOTESURL]); my_free(mac->x[MACRO_SERVICEGROUPNOTES]); /* generated */ my_free(mac->x[MACRO_SERVICEGROUPMEMBERS]); /* clear pointers */ mac->servicegroup_ptr = NULL; return OK; } int clear_servicegroup_macros(void) { return clear_servicegroup_macros_r(&global_macros); } /* clear contact macros */ int clear_contact_macros_r(nagios_macros *mac) { /* generated */ my_free(mac->x[MACRO_CONTACTGROUPNAMES]); /* clear custom contact variables */ clear_custom_vars(&(mac->custom_contact_vars)); /* clear pointers */ mac->contact_ptr = NULL; return OK; } int clear_contact_macros(void) { return clear_contact_macros_r(&global_macros); } /* clear contactgroup macros */ int clear_contactgroup_macros_r(nagios_macros *mac) { /* generated */ my_free(mac->x[MACRO_CONTACTGROUPMEMBERS]); /* clear pointers */ mac->contactgroup_ptr = NULL; return OK; } int clear_contactgroup_macros(void) { return clear_contactgroup_macros_r(&global_macros); } /* clear summary macros */ int clear_summary_macros_r(nagios_macros *mac) { register int x; for(x = MACRO_TOTALHOSTSUP; x <= MACRO_TOTALSERVICEPROBLEMSUNHANDLED; x++) my_free(mac->x[x]); return OK; } int clear_summary_macros(void) { return clear_summary_macros_r(&global_macros); } /******************************************************************/ /****************** ENVIRONMENT MACRO FUNCTIONS *******************/ /******************************************************************/ #ifdef NSCORE /* sets or unsets all macro environment variables */ int set_all_macro_environment_vars_r(nagios_macros *mac, int set) { if(enable_environment_macros == FALSE) return ERROR; set_macrox_environment_vars_r(mac, set); set_argv_macro_environment_vars_r(mac, set); set_custom_macro_environment_vars_r(mac, set); set_contact_address_environment_vars_r(mac, set); return OK; } int set_all_macro_environment_vars(int set) { return set_all_macro_environment_vars_r(&global_macros, set); } /* sets or unsets macrox environment variables */ int set_macrox_environment_vars_r(nagios_macros *mac, int set) { register int x = 0; int free_macro = FALSE; /* set each of the macrox environment variables */ for(x = 0; x < MACRO_X_COUNT; x++) { free_macro = FALSE; /* large installations don't get all macros */ if(use_large_installation_tweaks == TRUE) { /* * member macros tend to overflow the * environment on large installations */ if(x == MACRO_SERVICEGROUPMEMBERS || x == MACRO_HOSTGROUPMEMBERS || x == MACRO_HOSTGROUPMEMBERADDRESSES) continue; /* summary macros are CPU intensive to compute */ if(x >= MACRO_TOTALHOSTSUP && x <= MACRO_TOTALSERVICEPROBLEMSUNHANDLED) continue; } /* generate the macro value if it hasn't already been done */ /* THIS IS EXPENSIVE */ if(set == TRUE) { if(mac->x[x] == NULL) grab_macrox_value_r(mac, x, NULL, NULL, &mac->x[x], &free_macro); } /* set the value */ set_macro_environment_var(macro_x_names[x], mac->x[x], set); } return OK; } int set_macrox_environment_vars(int set) { return set_macrox_environment_vars_r(&global_macros, set); } /* sets or unsets argv macro environment variables */ int set_argv_macro_environment_vars_r(nagios_macros *mac, int set) { char *macro_name = NULL; register int x = 0; /* set each of the argv macro environment variables */ for(x = 0; x < MAX_COMMAND_ARGUMENTS; x++) { asprintf(¯o_name, "ARG%d", x + 1); set_macro_environment_var(macro_name, mac->argv[x], set); my_free(macro_name); } return OK; } int set_argv_macro_environment_vars(int set) { return set_argv_macro_environment_vars_r(&global_macros, set); } /* sets or unsets custom host/service/contact macro environment variables */ int set_custom_macro_environment_vars_r(nagios_macros *mac, int set) { customvariablesmember *temp_customvariablesmember = NULL; host *temp_host = NULL; service *temp_service = NULL; contact *temp_contact = NULL; char *customvarname = NULL; /***** CUSTOM HOST VARIABLES *****/ /* generate variables and save them for later */ if((temp_host = mac->host_ptr) && set == TRUE) { for(temp_customvariablesmember = temp_host->custom_variables; temp_customvariablesmember != NULL; temp_customvariablesmember = temp_customvariablesmember->next) { asprintf(&customvarname, "_HOST%s", temp_customvariablesmember->variable_name); add_custom_variable_to_object(&mac->custom_host_vars, customvarname, temp_customvariablesmember->variable_value); my_free(customvarname); } } /* set variables */ for(temp_customvariablesmember = mac->custom_host_vars; temp_customvariablesmember != NULL; temp_customvariablesmember = temp_customvariablesmember->next) { set_macro_environment_var(temp_customvariablesmember->variable_name, clean_macro_chars(temp_customvariablesmember->variable_value, STRIP_ILLEGAL_MACRO_CHARS | ESCAPE_MACRO_CHARS), set); } /***** CUSTOM SERVICE VARIABLES *****/ /* generate variables and save them for later */ if((temp_service = mac->service_ptr) && set == TRUE) { for(temp_customvariablesmember = temp_service->custom_variables; temp_customvariablesmember != NULL; temp_customvariablesmember = temp_customvariablesmember->next) { asprintf(&customvarname, "_SERVICE%s", temp_customvariablesmember->variable_name); add_custom_variable_to_object(&mac->custom_service_vars, customvarname, temp_customvariablesmember->variable_value); my_free(customvarname); } } /* set variables */ for(temp_customvariablesmember = mac->custom_service_vars; temp_customvariablesmember != NULL; temp_customvariablesmember = temp_customvariablesmember->next) set_macro_environment_var(temp_customvariablesmember->variable_name, clean_macro_chars(temp_customvariablesmember->variable_value, STRIP_ILLEGAL_MACRO_CHARS | ESCAPE_MACRO_CHARS), set); /***** CUSTOM CONTACT VARIABLES *****/ /* generate variables and save them for later */ if((temp_contact = mac->contact_ptr) && set == TRUE) { for(temp_customvariablesmember = temp_contact->custom_variables; temp_customvariablesmember != NULL; temp_customvariablesmember = temp_customvariablesmember->next) { asprintf(&customvarname, "_CONTACT%s", temp_customvariablesmember->variable_name); add_custom_variable_to_object(&mac->custom_contact_vars, customvarname, temp_customvariablesmember->variable_value); my_free(customvarname); } } /* set variables */ for(temp_customvariablesmember = mac->custom_contact_vars; temp_customvariablesmember != NULL; temp_customvariablesmember = temp_customvariablesmember->next) set_macro_environment_var(temp_customvariablesmember->variable_name, clean_macro_chars(temp_customvariablesmember->variable_value, STRIP_ILLEGAL_MACRO_CHARS | ESCAPE_MACRO_CHARS), set); return OK; } int set_custom_macro_environment_vars(int set) { return set_custom_macro_environment_vars_r(&global_macros, set); } /* sets or unsets contact address environment variables */ int set_contact_address_environment_vars_r(nagios_macros *mac, int set) { char *varname = NULL; register int x; /* these only get set during notifications */ if(mac->contact_ptr == NULL) return OK; for(x = 0; x < MAX_CONTACT_ADDRESSES; x++) { asprintf(&varname, "CONTACTADDRESS%d", x); set_macro_environment_var(varname, mac->contact_ptr->address[x], set); my_free(varname); } return OK; } int set_contact_address_environment_vars(int set) { return set_contact_address_environment_vars_r(&global_macros, set); } /* sets or unsets a macro environment variable */ int set_macro_environment_var(char *name, char *value, int set) { char *env_macro_name = NULL; /* we won't mess with null variable names */ if(name == NULL) return ERROR; /* create environment var name */ asprintf(&env_macro_name, "%s%s", MACRO_ENV_VAR_PREFIX, name); /* set or unset the environment variable */ set_environment_var(env_macro_name, value, set); /* free allocated memory */ my_free(env_macro_name); return OK; } static int add_macrox_environment_vars_r(nagios_macros *, struct kvvec *); static int add_argv_macro_environment_vars_r(nagios_macros *, struct kvvec *); static int add_custom_macro_environment_vars_r(nagios_macros *, struct kvvec *); static int add_contact_address_environment_vars_r(nagios_macros *, struct kvvec *); struct kvvec * macros_to_kvv(nagios_macros *mac) { struct kvvec *kvvp; log_debug_info(DEBUGL_FUNCTIONS, 0, "macros_to_kvv()\n"); /* If we're not supposed to export macros as environment variables, just return */ if(FALSE == enable_environment_macros) return NULL; /* Create the kvvec to hold the macros */ if((kvvp = calloc(1, sizeof(struct kvvec))) == NULL) return NULL; if(!kvvec_init(kvvp, MACRO_X_COUNT + MAX_COMMAND_ARGUMENTS + MAX_CONTACT_ADDRESSES + 4)) return NULL; add_macrox_environment_vars_r(mac, kvvp); add_argv_macro_environment_vars_r(mac, kvvp); add_custom_macro_environment_vars_r(mac, kvvp); add_contact_address_environment_vars_r(mac, kvvp); return kvvp; } /* adds macrox environment variables */ static int add_macrox_environment_vars_r(nagios_macros *mac, struct kvvec *kvvp) { /*register*/ int x = 0; int free_macro = FALSE; char *envname; log_debug_info(DEBUGL_FUNCTIONS, 1, "add_macrox_environment_vars_r()\n"); /* set each of the macrox environment variables */ for(x = 0; x < MACRO_X_COUNT; x++) { log_debug_info(DEBUGL_MACROS, 2, "Processing macro %d of %d\n", x, MACRO_X_COUNT); free_macro = FALSE; /* large installations don't get all macros */ if(use_large_installation_tweaks == TRUE) { /* * member macros tend to overflow the * environment on large installations */ if(x == MACRO_SERVICEGROUPMEMBERS || x == MACRO_HOSTGROUPMEMBERS || x == MACRO_HOSTGROUPMEMBERADDRESSES) continue; /* summary macros are CPU intensive to compute */ if(x >= MACRO_TOTALHOSTSUP && x <= MACRO_TOTALSERVICEPROBLEMSUNHANDLED) continue; } /* generate the macro value if it hasn't already been done */ /* THIS IS EXPENSIVE */ if(mac->x[x] == NULL) { log_debug_info(DEBUGL_MACROS, 2, "Grabbing value for macro: %s\n", macro_x_names[x]); grab_macrox_value_r(mac, x, NULL, NULL, &mac->x[x], &free_macro); } /* add the value to the kvvec */ log_debug_info(DEBUGL_MACROS, 2, "Adding macro \"%s\" with value \"%s\" to kvvec\n", macro_x_names[x], mac->x[x]); /* Allocate memory for each environment variable name, but not the values because when kvvec_destroy() is called, it is called with KVVEC_FREE_KEYS */ asprintf(&envname, "%s%s", MACRO_ENV_VAR_PREFIX, macro_x_names[x]); kvvec_addkv(kvvp, envname, mac->x[x]); } log_debug_info(DEBUGL_FUNCTIONS, 2, "add_macrox_environment_vars_r() end\n"); return OK; } /* adds argv macro environment variables */ static int add_argv_macro_environment_vars_r(nagios_macros *mac, struct kvvec *kvvp) { char *macro_name = NULL; register int x = 0; log_debug_info(DEBUGL_FUNCTIONS, 1, "add_argv_macro_environment_vars_r()\n"); /* set each of the argv macro environment variables */ for(x = 0; x < MAX_COMMAND_ARGUMENTS; x++) { /* Allocate memory for each environment variable name, but not the values because when kvvec_destroy() is called, it is called with KVVEC_FREE_KEYS */ asprintf(¯o_name, "%sARG%d", MACRO_ENV_VAR_PREFIX, x + 1); kvvec_addkv(kvvp, macro_name, mac->argv[x]); } return OK; } /* adds custom host/service/contact macro environment variables */ static int add_custom_macro_environment_vars_r(nagios_macros *mac, struct kvvec *kvvp) { customvariablesmember *temp_customvariablesmember = NULL; host *temp_host = NULL; service *temp_service = NULL; contact *temp_contact = NULL; char *customvarname = NULL; char *customvarvalue = NULL; log_debug_info(DEBUGL_FUNCTIONS, 1, "add_custom_macro_environment_vars_r()\n"); /***** CUSTOM HOST VARIABLES *****/ /* generate variables and save them for later */ temp_host = mac->host_ptr; if(temp_host) { for(temp_customvariablesmember = temp_host->custom_variables; temp_customvariablesmember != NULL; temp_customvariablesmember = temp_customvariablesmember->next) { asprintf(&customvarname, "%s_HOST%s", MACRO_ENV_VAR_PREFIX, temp_customvariablesmember->variable_name); add_custom_variable_to_object(&mac->custom_host_vars, customvarname, temp_customvariablesmember->variable_value); my_free(customvarname); } } /* set variables */ for(temp_customvariablesmember = mac->custom_host_vars; temp_customvariablesmember != NULL; temp_customvariablesmember = temp_customvariablesmember->next) { customvarvalue = clean_macro_chars(temp_customvariablesmember->variable_value, STRIP_ILLEGAL_MACRO_CHARS | ESCAPE_MACRO_CHARS); if(customvarvalue && *customvarvalue) { my_free(temp_customvariablesmember->variable_value); temp_customvariablesmember->variable_value = customvarvalue; /* Allocate memory for each environment variable name, but not the values because when kvvec_destroy() is called, it is called with KVVEC_FREE_KEYS */ kvvec_addkv(kvvp, strdup(temp_customvariablesmember->variable_name), customvarvalue); } } /***** CUSTOM SERVICE VARIABLES *****/ /* generate variables and save them for later */ temp_service = mac->service_ptr; if(temp_service) { for(temp_customvariablesmember = temp_service->custom_variables; temp_customvariablesmember != NULL; temp_customvariablesmember = temp_customvariablesmember->next) { asprintf(&customvarname, "%s_SERVICE%s", MACRO_ENV_VAR_PREFIX, temp_customvariablesmember->variable_name); add_custom_variable_to_object(&mac->custom_service_vars, customvarname, temp_customvariablesmember->variable_value); my_free(customvarname); } } /* set variables */ for(temp_customvariablesmember = mac->custom_service_vars; temp_customvariablesmember != NULL; temp_customvariablesmember = temp_customvariablesmember->next) { customvarvalue = clean_macro_chars(temp_customvariablesmember->variable_value, STRIP_ILLEGAL_MACRO_CHARS | ESCAPE_MACRO_CHARS); if(customvarvalue && *customvarvalue) { my_free(temp_customvariablesmember->variable_value); temp_customvariablesmember->variable_value = customvarvalue; /* Allocate memory for each environment variable name, but not the values because when kvvec_destroy() is called, it is called with KVVEC_FREE_KEYS */ kvvec_addkv(kvvp, strdup(temp_customvariablesmember->variable_name), customvarvalue); } } /***** CUSTOM CONTACT VARIABLES *****/ /* generate variables and save them for later */ temp_contact = mac->contact_ptr; if(temp_contact) { for(temp_customvariablesmember = temp_contact->custom_variables; temp_customvariablesmember != NULL; temp_customvariablesmember = temp_customvariablesmember->next) { asprintf(&customvarname, "%s_CONTACT%s", MACRO_ENV_VAR_PREFIX, temp_customvariablesmember->variable_name); add_custom_variable_to_object(&mac->custom_contact_vars, customvarname, temp_customvariablesmember->variable_value); my_free(customvarname); } } /* set variables */ for(temp_customvariablesmember = mac->custom_contact_vars; temp_customvariablesmember != NULL; temp_customvariablesmember = temp_customvariablesmember->next) { customvarvalue = clean_macro_chars(temp_customvariablesmember->variable_value, STRIP_ILLEGAL_MACRO_CHARS | ESCAPE_MACRO_CHARS); if(customvarvalue && *customvarvalue) { my_free(temp_customvariablesmember->variable_value); temp_customvariablesmember->variable_value = customvarvalue; /* Allocate memory for each environment variable name, but not the values because when kvvec_destroy() is called, it is called with KVVEC_FREE_KEYS */ kvvec_addkv(kvvp, strdup(temp_customvariablesmember->variable_name), customvarvalue); } } return OK; } /* add contact address environment variables */ static int add_contact_address_environment_vars_r(nagios_macros *mac, struct kvvec *kvvp) { char *varname = NULL; register int x; log_debug_info(DEBUGL_FUNCTIONS, 1, "add_contact_address_environment_vars_r()\n"); /* these only get set during notifications */ if(mac->contact_ptr == NULL) return OK; asprintf(&varname, "%sCONTACTNAME", MACRO_ENV_VAR_PREFIX); kvvec_addkv(kvvp, varname, mac->contact_ptr->name); asprintf(&varname, "%sCONTACTALIAS", MACRO_ENV_VAR_PREFIX); kvvec_addkv(kvvp, varname, mac->contact_ptr->alias); asprintf(&varname, "%sCONTACTEMAIL", MACRO_ENV_VAR_PREFIX); kvvec_addkv(kvvp, varname, mac->contact_ptr->email); asprintf(&varname, "%sCONTACTPAGER", MACRO_ENV_VAR_PREFIX); kvvec_addkv(kvvp, varname, mac->contact_ptr->pager); for(x = 0; x < MAX_CONTACT_ADDRESSES; x++) { /* Allocate memory for each environment variable name, but not the values because when kvvec_destroy() is called, it is called with KVVEC_FREE_KEYS */ asprintf(&varname, "%sCONTACTADDRESS%d", MACRO_ENV_VAR_PREFIX, x); kvvec_addkv(kvvp, varname, mac->contact_ptr->address[x]); } return OK; } #endif nagios-4.3.4/common/objects.c000066400000000000000000003526331314764422400161120ustar00rootroot00000000000000/***************************************************************************** * * OBJECTS.C - Object addition and search functions for Nagios * * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #include "../include/config.h" #include "../include/common.h" #include "../include/objects.h" #include "../xdata/xodtemplate.h" #ifdef NSCGI #include "../include/cgiutils.h" #else #include "../include/nagios.h" #endif /* * These get created in xdata/xodtemplate.c:xodtemplate_register_objects() * Escalations are attached to the objects they belong to. * Dependencies are attached to the dependent end of the object chain. */ dkhash_table *object_hash_tables[NUM_OBJECT_SKIPLISTS]; command *command_list = NULL; timeperiod *timeperiod_list = NULL; host *host_list = NULL; service *service_list = NULL; contact *contact_list = NULL; hostgroup *hostgroup_list = NULL; servicegroup *servicegroup_list = NULL; contactgroup *contactgroup_list = NULL; hostescalation *hostescalation_list = NULL; serviceescalation *serviceescalation_list = NULL; command **command_ary = NULL; timeperiod **timeperiod_ary = NULL; host **host_ary = NULL; service **service_ary = NULL; contact **contact_ary = NULL; hostgroup **hostgroup_ary = NULL; servicegroup **servicegroup_ary = NULL; contactgroup **contactgroup_ary = NULL; hostescalation **hostescalation_ary = NULL; serviceescalation **serviceescalation_ary = NULL; hostdependency **hostdependency_ary = NULL; servicedependency **servicedependency_ary = NULL; #ifndef NSCGI int __nagios_object_structure_version = CURRENT_OBJECT_STRUCTURE_VERSION; struct flag_map { int opt; int ch; const char *name; }; static const struct flag_map service_flag_map[] = { { OPT_WARNING, 'w', "warning" }, { OPT_UNKNOWN, 'u', "unknown" }, { OPT_CRITICAL, 'c', "critical" }, { OPT_FLAPPING, 'f', "flapping" }, { OPT_DOWNTIME, 's', "downtime" }, { OPT_OK, 'o', "ok" }, { OPT_RECOVERY, 'r', "recovery" }, { OPT_PENDING, 'p', "pending" }, { 0, 0, NULL }, }; static const struct flag_map host_flag_map[] = { { OPT_DOWN, 'd', "down" }, { OPT_UNREACHABLE, 'u', "unreachable" }, { OPT_FLAPPING, 'f', "flapping" }, { OPT_RECOVERY, 'r', "recovery" }, { OPT_DOWNTIME, 's', "downtime" }, { OPT_PENDING, 'p', "pending" }, { 0, 0, NULL }, }; static const char *opts2str(int opts, const struct flag_map *map, char ok_char) { int i, pos = 0; static char buf[16]; if(!opts) return "n"; if(opts == OPT_ALL) return "a"; if(flag_isset(opts, OPT_OK)) { flag_unset(opts, OPT_OK); buf[pos++] = ok_char; buf[pos++] = opts ? ',' : 0; } for (i = 0; map[i].name; i++) { if(flag_isset(opts, map[i].opt)) { buf[pos++] = map[i].ch; flag_unset(opts, map[i].opt); if(!opts) break; buf[pos++] = ','; } } buf[pos++] = 0; return buf; } #endif unsigned int host_services_value(host *h) { servicesmember *sm; unsigned int ret = 0; for(sm = h->services; sm; sm = sm->next) { ret += sm->service_ptr->hourly_value; } return ret; } #ifndef NSCGI /* Host/Service dependencies are not visible in Nagios CGIs, so we exclude them */ static int cmp_sdep(const void *a_, const void *b_) { const servicedependency *a = *(servicedependency **)a_; const servicedependency *b = *(servicedependency **)b_; int ret; ret = a->master_service_ptr->id - b->master_service_ptr->id; return ret ? ret : (int)(a->dependent_service_ptr->id - b->dependent_service_ptr->id); } static int cmp_hdep(const void *a_, const void *b_) { const hostdependency *a = *(const hostdependency **)a_; const hostdependency *b = *(const hostdependency **)b_; int ret; ret = a->master_host_ptr->id - b->master_host_ptr->id; return ret ? ret : (int)(a->dependent_host_ptr->id - b->dependent_host_ptr->id); } static int cmp_serviceesc(const void *a_, const void *b_) { const serviceescalation *a = *(const serviceescalation **)a_; const serviceescalation *b = *(const serviceescalation **)b_; return a->service_ptr->id - b->service_ptr->id; } static int cmp_hostesc(const void *a_, const void *b_) { const hostescalation *a = *(const hostescalation **)a_; const hostescalation *b = *(const hostescalation **)b_; return a->host_ptr->id - b->host_ptr->id; } #endif static void post_process_object_config(void) { objectlist *list; unsigned int i, slot; if(hostdependency_ary) free(hostdependency_ary); if(servicedependency_ary) free(servicedependency_ary); hostdependency_ary = calloc(num_objects.hostdependencies, sizeof(void *)); servicedependency_ary = calloc(num_objects.servicedependencies, sizeof(void *)); slot = 0; for(i = 0; slot < num_objects.servicedependencies && i < num_objects.services; i++) { service *s = service_ary[i]; for(list = s->notify_deps; list; list = list->next) servicedependency_ary[slot++] = (servicedependency *)list->object_ptr; for(list = s->exec_deps; list; list = list->next) servicedependency_ary[slot++] = (servicedependency *)list->object_ptr; } timing_point("Done post-processing servicedependencies\n"); slot = 0; for(i = 0; slot < num_objects.hostdependencies && i < num_objects.hosts; i++) { host *h = host_ary[i]; for(list = h->notify_deps; list; list = list->next) hostdependency_ary[slot++] = (hostdependency *)list->object_ptr; for(list = h->exec_deps; list; list = list->next) hostdependency_ary[slot++] = (hostdependency *)list->object_ptr; } timing_point("Done post-processing host dependencies\n"); #ifndef NSCGI /* cgi's always get their objects in sorted order */ if(servicedependency_ary) qsort(servicedependency_ary, num_objects.servicedependencies, sizeof(servicedependency *), cmp_sdep); if(hostdependency_ary) qsort(hostdependency_ary, num_objects.hostdependencies, sizeof(hostdependency *), cmp_hdep); if(hostescalation_ary) qsort(hostescalation_ary, num_objects.hostescalations, sizeof(hostescalation *), cmp_hostesc); if(serviceescalation_ary) qsort(serviceescalation_ary, num_objects.serviceescalations, sizeof(serviceescalation *), cmp_serviceesc); timing_point("Done post-sorting slave objects\n"); #endif timeperiod_list = timeperiod_ary ? *timeperiod_ary : NULL; command_list = command_ary ? *command_ary : NULL; hostgroup_list = hostgroup_ary ? *hostgroup_ary : NULL; contactgroup_list = contactgroup_ary ? *contactgroup_ary : NULL; servicegroup_list = servicegroup_ary ? *servicegroup_ary : NULL; contact_list = contact_ary ? *contact_ary : NULL; host_list = host_ary ? *host_ary : NULL; service_list = service_ary ? *service_ary : NULL; hostescalation_list = hostescalation_ary ? *hostescalation_ary : NULL; serviceescalation_list = serviceescalation_ary ? *serviceescalation_ary : NULL; } /* simple state-name helpers, nifty to have all over the place */ const char *service_state_name(int state) { switch (state) { case STATE_OK: return "OK"; case STATE_WARNING: return "WARNING"; case STATE_CRITICAL: return "CRITICAL"; } return "UNKNOWN"; } const char *host_state_name(int state) { switch (state) { case HOST_UP: return "UP"; case HOST_DOWN: return "DOWN"; case HOST_UNREACHABLE: return "UNREACHABLE"; } return "(unknown)"; } const char *state_type_name(int state_type) { return state_type == HARD_STATE ? "HARD" : "SOFT"; } const char *check_type_name(int check_type) { return check_type == CHECK_TYPE_PASSIVE ? "PASSIVE" : "ACTIVE"; } /******************************************************************/ /******* TOP-LEVEL HOST CONFIGURATION DATA INPUT FUNCTION *********/ /******************************************************************/ /* read all host configuration data from external source */ int read_object_config_data(const char *main_config_file, int options) { int result = OK; /* reset object counts */ memset(&num_objects, 0, sizeof(num_objects)); /* read in data from all text host config files (template-based) */ result = xodtemplate_read_config_data(main_config_file, options); if(result != OK) return ERROR; /* handle any remaining config mangling */ post_process_object_config(); timing_point("Done post-processing configuration\n"); return result; } /******************************************************************/ /******************** SKIPLIST FUNCTIONS **************************/ /******************************************************************/ int skiplist_compare_text(const char *val1a, const char *val1b, const char *val2a, const char *val2b) { int result = 0; /* check first name */ if(val1a == NULL && val2a == NULL) result = 0; else if(val1a == NULL) result = 1; else if(val2a == NULL) result = -1; else result = strcmp(val1a, val2a); /* check second name if necessary */ if(result == 0) { if(val1b == NULL && val2b == NULL) result = 0; else if(val1b == NULL) result = 1; else if(val2b == NULL) result = -1; else result = strcmp(val1b, val2b); } return result; } int get_host_count(void) { return num_objects.hosts; } int get_service_count(void) { return num_objects.services; } /******************************************************************/ /**************** OBJECT ADDITION FUNCTIONS ***********************/ /******************************************************************/ static int create_object_table(const char *name, unsigned int elems, unsigned int size, void **ptr) { void *ret; if (!elems) { *ptr = NULL; return OK; } ret = calloc(elems, size); if (!ret) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Failed to allocate %s table with %u elements\n", name, elems); return ERROR; } *ptr = ret; return OK; } #define mktable(name, id) \ create_object_table(#name, ocount[id], sizeof(name *), (void **)&name##_ary) /* ocount is an array with NUM_OBJECT_TYPES members */ int create_object_tables(unsigned int *ocount) { int i; for (i = 0; i < NUM_HASHED_OBJECT_TYPES; i++) { const unsigned int hash_size = ocount[i]; if (!hash_size) continue; object_hash_tables[i] = dkhash_create(hash_size); if (!object_hash_tables[i]) { logit(NSLOG_CONFIG_ERROR, TRUE, "Failed to create hash table with %u entries\n", hash_size); } } /* * errors here will always lead to an early exit, so there's no need * to free() successful allocs when later ones fail */ if (mktable(timeperiod, TIMEPERIOD_SKIPLIST) != OK) return ERROR; if (mktable(command, COMMAND_SKIPLIST) != OK) return ERROR; if (mktable(host, HOST_SKIPLIST) != OK) return ERROR; if (mktable(service, SERVICE_SKIPLIST) != OK) return ERROR; if (mktable(contact, CONTACT_SKIPLIST) != OK) return ERROR; if (mktable(hostgroup, HOSTGROUP_SKIPLIST) != OK) return ERROR; if (mktable(servicegroup, SERVICEGROUP_SKIPLIST) != OK) return ERROR; if (mktable(contactgroup, CONTACTGROUP_SKIPLIST) != OK) return ERROR; if (mktable(hostescalation, HOSTESCALATION_SKIPLIST) != OK) return ERROR; if (mktable(hostdependency, HOSTDEPENDENCY_SKIPLIST) != OK) return ERROR; if (mktable(serviceescalation, SERVICEESCALATION_SKIPLIST) != OK) return ERROR; if (mktable(servicedependency, SERVICEDEPENDENCY_SKIPLIST) != OK) return ERROR; return OK; } /* add a new timeperiod to the list in memory */ timeperiod *add_timeperiod(char *name, char *alias) { timeperiod *new_timeperiod = NULL; int result = OK; /* make sure we have the data we need */ if((name == NULL || !strcmp(name, "")) || (alias == NULL || !strcmp(alias, ""))) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Name or alias for timeperiod is NULL\n"); return NULL; } new_timeperiod = calloc(1, sizeof(*new_timeperiod)); if(!new_timeperiod) return NULL; /* copy string vars */ new_timeperiod->name = name; new_timeperiod->alias = alias ? alias : name; /* add new timeperiod to hash table */ if(result == OK) { result = dkhash_insert(object_hash_tables[TIMEPERIOD_SKIPLIST], new_timeperiod->name, NULL, new_timeperiod); switch(result) { case DKHASH_EDUPE: logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Timeperiod '%s' has already been defined\n", name); result = ERROR; break; case DKHASH_OK: result = OK; break; default: logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not add timeperiod '%s' to hash table\n", name); result = ERROR; break; } } /* handle errors */ if(result == ERROR) { free(new_timeperiod); return NULL; } new_timeperiod->id = num_objects.timeperiods++; if(new_timeperiod->id) timeperiod_ary[new_timeperiod->id - 1]->next = new_timeperiod; timeperiod_ary[new_timeperiod->id] = new_timeperiod; return new_timeperiod; } /* adds a new exclusion to a timeperiod */ timeperiodexclusion *add_exclusion_to_timeperiod(timeperiod *period, char *name) { timeperiodexclusion *new_timeperiodexclusion = NULL; /* make sure we have enough data */ if(period == NULL || name == NULL) return NULL; if((new_timeperiodexclusion = (timeperiodexclusion *)malloc(sizeof(timeperiodexclusion))) == NULL) return NULL; new_timeperiodexclusion->timeperiod_name = (char *)strdup(name); new_timeperiodexclusion->next = period->exclusions; period->exclusions = new_timeperiodexclusion; return new_timeperiodexclusion; } /* add a new timerange to a timeperiod */ timerange *add_timerange_to_timeperiod(timeperiod *period, int day, unsigned long start_time, unsigned long end_time) { timerange *prev = NULL, *tr, *new_timerange = NULL; /* make sure we have the data we need */ if(period == NULL) return NULL; if(day < 0 || day > 6) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Day %d is not valid for timeperiod '%s'\n", day, period->name); return NULL; } if(start_time > 86400) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Start time %lu on day %d is not valid for timeperiod '%s'\n", start_time, day, period->name); return NULL; } if(end_time > 86400) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: End time %lu on day %d is not value for timeperiod '%s'\n", end_time, day, period->name); return NULL; } /* allocate memory for the new time range */ if((new_timerange = malloc(sizeof(timerange))) == NULL) return NULL; new_timerange->range_start = start_time; new_timerange->range_end = end_time; /* insertion-sort the new time range into the list for this day */ if(!period->days[day] || period->days[day]->range_start > new_timerange->range_start) { new_timerange->next = period->days[day]; period->days[day] = new_timerange; return new_timerange; } for(tr = period->days[day]; tr; tr = tr->next) { if(new_timerange->range_start < tr->range_start) { new_timerange->next = tr; prev->next = new_timerange; break; } if(!tr->next) { tr->next = new_timerange; new_timerange->next = NULL; break; } prev = tr; } return new_timerange; } /* add a new exception to a timeperiod */ daterange *add_exception_to_timeperiod(timeperiod *period, int type, int syear, int smon, int smday, int swday, int swday_offset, int eyear, int emon, int emday, int ewday, int ewday_offset, int skip_interval) { daterange *new_daterange = NULL; /* make sure we have the data we need */ if(period == NULL) return NULL; /* allocate memory for the date range range */ if((new_daterange = malloc(sizeof(daterange))) == NULL) return NULL; new_daterange->times = NULL; new_daterange->next = NULL; new_daterange->type = type; new_daterange->syear = syear; new_daterange->smon = smon; new_daterange->smday = smday; new_daterange->swday = swday; new_daterange->swday_offset = swday_offset; new_daterange->eyear = eyear; new_daterange->emon = emon; new_daterange->emday = emday; new_daterange->ewday = ewday; new_daterange->ewday_offset = ewday_offset; new_daterange->skip_interval = skip_interval; /* add the new date range to the head of the range list for this exception type */ new_daterange->next = period->exceptions[type]; period->exceptions[type] = new_daterange; return new_daterange; } /* add a new timerange to a daterange */ timerange *add_timerange_to_daterange(daterange *drange, unsigned long start_time, unsigned long end_time) { timerange *new_timerange = NULL; /* make sure we have the data we need */ if(drange == NULL) return NULL; if(start_time > 86400) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Start time %lu is not valid for timeperiod\n", start_time); return NULL; } if(end_time > 86400) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: End time %lu is not value for timeperiod\n", end_time); return NULL; } /* allocate memory for the new time range */ if((new_timerange = malloc(sizeof(timerange))) == NULL) return NULL; new_timerange->range_start = start_time; new_timerange->range_end = end_time; /* add the new time range to the head of the range list for this date range */ new_timerange->next = drange->times; drange->times = new_timerange; return new_timerange; } /* add a new host definition */ host *add_host(char *name, char *display_name, char *alias, char *address, char *check_period, int initial_state, double check_interval, double retry_interval, int max_attempts, int notification_options, double notification_interval, double first_notification_delay, char *notification_period, int notifications_enabled, char *check_command, int checks_enabled, int accept_passive_checks, char *event_handler, int event_handler_enabled, int flap_detection_enabled, double low_flap_threshold, double high_flap_threshold, int flap_detection_options, int stalking_options, int process_perfdata, int check_freshness, int freshness_threshold, char *notes, char *notes_url, char *action_url, char *icon_image, char *icon_image_alt, char *vrml_image, char *statusmap_image, int x_2d, int y_2d, int have_2d_coords, double x_3d, double y_3d, double z_3d, int have_3d_coords, int should_be_drawn, int retain_status_information, int retain_nonstatus_information, int obsess, unsigned int hourly_value) { host *new_host = NULL; timeperiod *check_tp = NULL, *notify_tp = NULL; int result = OK; /* make sure we have the data we need */ if(name == NULL || !strcmp(name, "")) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Host name is NULL\n"); return NULL; } if(check_period && !(check_tp = find_timeperiod(check_period))) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Failed to locate check_period '%s' for host '%s'!\n", check_period, name); return NULL; } if(notification_period && !(notify_tp = find_timeperiod(notification_period))) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Failed to locate notification_period '%s' for host '%s'!\n", notification_period, name); return NULL; } /* check values */ if(max_attempts <= 0) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Invalid max_check_attempts value for host '%s'\n", name); return NULL; } if(check_interval < 0) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Invalid check_interval value for host '%s'\n", name); return NULL; } if(notification_interval < 0) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Invalid notification_interval value for host '%s'\n", name); return NULL; } if(first_notification_delay < 0) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Invalid first_notification_delay value for host '%s'\n", name); return NULL; } if(freshness_threshold < 0) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Invalid freshness_threshold value for host '%s'\n", name); return NULL; } new_host = calloc(1, sizeof(*new_host)); /* assign string vars */ new_host->name = name; new_host->display_name = display_name ? display_name : new_host->name; new_host->alias = alias ? alias : new_host->name; new_host->address = address ? address : new_host->name; new_host->check_period = check_tp ? (char *)strdup(check_tp->name) : NULL; new_host->notification_period = notify_tp ? (char *)strdup(notify_tp->name) : NULL; new_host->notification_period_ptr = notify_tp; new_host->check_period_ptr = check_tp; new_host->check_command = check_command; new_host->event_handler = event_handler; new_host->notes = notes; new_host->notes_url = notes_url; new_host->action_url = action_url; new_host->icon_image = icon_image; new_host->icon_image_alt = icon_image_alt; new_host->vrml_image = vrml_image; new_host->statusmap_image = statusmap_image; /* duplicate non-string vars */ new_host->hourly_value = hourly_value; new_host->max_attempts = max_attempts; new_host->check_interval = check_interval; new_host->retry_interval = retry_interval; new_host->notification_interval = notification_interval; new_host->first_notification_delay = first_notification_delay; new_host->notification_options = notification_options; new_host->flap_detection_enabled = (flap_detection_enabled > 0) ? TRUE : FALSE; new_host->low_flap_threshold = low_flap_threshold; new_host->high_flap_threshold = high_flap_threshold; new_host->flap_detection_options = flap_detection_options; new_host->stalking_options = stalking_options; new_host->process_performance_data = (process_perfdata > 0) ? TRUE : FALSE; new_host->check_freshness = (check_freshness > 0) ? TRUE : FALSE; new_host->freshness_threshold = freshness_threshold; new_host->checks_enabled = (checks_enabled > 0) ? TRUE : FALSE; new_host->accept_passive_checks = (accept_passive_checks > 0) ? TRUE : FALSE; new_host->event_handler_enabled = (event_handler_enabled > 0) ? TRUE : FALSE; new_host->x_2d = x_2d; new_host->y_2d = y_2d; new_host->have_2d_coords = (have_2d_coords > 0) ? TRUE : FALSE; new_host->x_3d = x_3d; new_host->y_3d = y_3d; new_host->z_3d = z_3d; new_host->have_3d_coords = (have_3d_coords > 0) ? TRUE : FALSE; new_host->should_be_drawn = (should_be_drawn > 0) ? TRUE : FALSE; new_host->obsess = (obsess > 0) ? TRUE : FALSE; new_host->retain_status_information = (retain_status_information > 0) ? TRUE : FALSE; new_host->retain_nonstatus_information = (retain_nonstatus_information > 0) ? TRUE : FALSE; #ifdef NSCORE new_host->current_state = initial_state; new_host->last_state = initial_state; new_host->last_hard_state = initial_state; new_host->check_type = CHECK_TYPE_ACTIVE; new_host->should_be_scheduled = TRUE; new_host->current_attempt = (initial_state == HOST_UP) ? 1 : max_attempts; new_host->state_type = HARD_STATE; new_host->acknowledgement_type = ACKNOWLEDGEMENT_NONE; new_host->notifications_enabled = (notifications_enabled > 0) ? TRUE : FALSE; new_host->check_options = CHECK_OPTION_NONE; #endif /* add new host to hash table */ if(result == OK) { result = dkhash_insert(object_hash_tables[HOST_SKIPLIST], new_host->name, NULL, new_host); switch(result) { case DKHASH_EDUPE: logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Host '%s' has already been defined\n", name); result = ERROR; break; case DKHASH_OK: result = OK; break; default: logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not add host '%s' to hash table\n", name); result = ERROR; break; } } /* handle errors */ if(result == ERROR) { my_free(new_host); return NULL; } new_host->id = num_objects.hosts++; host_ary[new_host->id] = new_host; if(new_host->id) host_ary[new_host->id - 1]->next = new_host; return new_host; } hostsmember *add_parent_host_to_host(host *hst, char *host_name) { hostsmember *new_hostsmember = NULL; int result = OK; /* make sure we have the data we need */ if(hst == NULL || host_name == NULL || !strcmp(host_name, "")) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Host is NULL or parent host name is NULL\n"); return NULL; } /* a host cannot be a parent/child of itself */ if(!strcmp(host_name, hst->name)) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Host '%s' cannot be a child/parent of itself\n", hst->name); return NULL; } /* allocate memory */ if((new_hostsmember = (hostsmember *)calloc(1, sizeof(hostsmember))) == NULL) return NULL; /* duplicate string vars */ if((new_hostsmember->host_name = (char *)strdup(host_name)) == NULL) result = ERROR; /* handle errors */ if(result == ERROR) { my_free(new_hostsmember->host_name); my_free(new_hostsmember); return NULL; } /* add the parent host entry to the host definition */ new_hostsmember->next = hst->parent_hosts; hst->parent_hosts = new_hostsmember; return new_hostsmember; } servicesmember *add_parent_service_to_service(service *svc, char *host_name, char *description) { servicesmember *sm; if(!svc || !host_name || !description || !*host_name || !*description) return NULL; if((sm = calloc(1, sizeof(*sm))) == NULL) return NULL; if (strcmp(svc->host_name, host_name) == 0 && strcmp(svc->description, description) == 0) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Host '%s' Service '%s' cannot be a child/parent of itself\n", svc->host_name, svc->description); return NULL; } if ((sm->host_name = strdup(host_name)) == NULL || (sm->service_description = strdup(description)) == NULL) { /* there was an error copying (description is NULL now) */ my_free(sm->host_name); free(sm); return NULL; } sm->next = svc->parents; svc->parents = sm; return sm; } hostsmember *add_child_link_to_host(host *hst, host *child_ptr) { hostsmember *new_hostsmember = NULL; /* make sure we have the data we need */ if(hst == NULL || child_ptr == NULL) return NULL; /* allocate memory */ if((new_hostsmember = (hostsmember *)malloc(sizeof(hostsmember))) == NULL) return NULL; /* assign values */ new_hostsmember->host_name = child_ptr->name; new_hostsmember->host_ptr = child_ptr; /* add the child entry to the host definition */ new_hostsmember->next = hst->child_hosts; hst->child_hosts = new_hostsmember; return new_hostsmember; } servicesmember *add_service_link_to_host(host *hst, service *service_ptr) { servicesmember *new_servicesmember = NULL; /* make sure we have the data we need */ if(hst == NULL || service_ptr == NULL) return NULL; /* allocate memory */ if((new_servicesmember = (servicesmember *)calloc(1, sizeof(servicesmember))) == NULL) return NULL; /* assign values */ new_servicesmember->host_name = service_ptr->host_name; new_servicesmember->service_description = service_ptr->description; new_servicesmember->service_ptr = service_ptr; #ifndef NSCGI hst->total_services++; #endif /* add the child entry to the host definition */ new_servicesmember->next = hst->services; hst->services = new_servicesmember; return new_servicesmember; } servicesmember *add_child_link_to_service(service *svc, service *child_ptr) { servicesmember *new_servicesmember = NULL; /* make sure we have the data we need */ if(svc == NULL || child_ptr == NULL) return NULL; /* allocate memory */ if((new_servicesmember = (servicesmember *)malloc(sizeof(servicesmember))) == NULL) return NULL; /* assign values */ new_servicesmember->host_name = child_ptr->host_name; new_servicesmember->service_description = child_ptr->description; new_servicesmember->service_ptr = child_ptr; /* add the child entry to the host definition */ new_servicesmember->next = svc->children; svc->children = new_servicesmember; return new_servicesmember; } static contactgroupsmember *add_contactgroup_to_object(contactgroupsmember **cg_list, const char *group_name) { contactgroupsmember *cgm; contactgroup *cg; if(!group_name || !*group_name) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Contact name is NULL\n"); return NULL; } if(!(cg = find_contactgroup(group_name))) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Contactgroup '%s' is not defined anywhere\n", group_name); return NULL; } if(!(cgm = malloc(sizeof(*cgm)))) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not allocate memory for contactgroup\n"); return NULL; } cgm->group_name = cg->group_name; cgm->group_ptr = cg; cgm->next = *cg_list; *cg_list = cgm; return cgm; } /* add a new contactgroup to a host */ contactgroupsmember *add_contactgroup_to_host(host *hst, char *group_name) { return add_contactgroup_to_object(&hst->contact_groups, group_name); } /* adds a contact to a host */ contactsmember *add_contact_to_host(host *hst, char *contact_name) { return add_contact_to_object(&hst->contacts, contact_name); } /* adds a custom variable to a host */ customvariablesmember *add_custom_variable_to_host(host *hst, char *varname, char *varvalue) { return add_custom_variable_to_object(&hst->custom_variables, varname, varvalue); } /* add a new host group to the list in memory */ hostgroup *add_hostgroup(char *name, char *alias, char *notes, char *notes_url, char *action_url) { hostgroup *new_hostgroup = NULL; int result = OK; /* make sure we have the data we need */ if(name == NULL || !strcmp(name, "")) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Hostgroup name is NULL\n"); return NULL; } new_hostgroup = calloc(1, sizeof(*new_hostgroup)); /* assign vars */ new_hostgroup->group_name = name; new_hostgroup->alias = alias ? alias : name; new_hostgroup->notes = notes; new_hostgroup->notes_url = notes_url; new_hostgroup->action_url = action_url; /* add new host group to hash table */ if(result == OK) { result = dkhash_insert(object_hash_tables[HOSTGROUP_SKIPLIST], new_hostgroup->group_name, NULL, new_hostgroup); switch(result) { case DKHASH_EDUPE: logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Hostgroup '%s' has already been defined\n", name); result = ERROR; break; case DKHASH_OK: result = OK; break; default: logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not add hostgroup '%s' to hash table\n", name); result = ERROR; break; } } /* handle errors */ if(result == ERROR) { free(new_hostgroup); return NULL; } new_hostgroup->id = num_objects.hostgroups++; hostgroup_ary[new_hostgroup->id] = new_hostgroup; if(new_hostgroup->id) hostgroup_ary[new_hostgroup->id - 1]->next = new_hostgroup; return new_hostgroup; } /* add a new host to a host group */ hostsmember *add_host_to_hostgroup(hostgroup *temp_hostgroup, char *host_name) { hostsmember *new_member = NULL; hostsmember *last_member = NULL; hostsmember *temp_member = NULL; struct host *h; /* make sure we have the data we need */ if(temp_hostgroup == NULL || (host_name == NULL || !strcmp(host_name, ""))) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Hostgroup or group member is NULL\n"); return NULL; } if (!(h = find_host(host_name))) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Failed to locate host '%s' for hostgroup '%s'\n", host_name, temp_hostgroup->group_name); return NULL; } /* allocate memory for a new member */ if((new_member = calloc(1, sizeof(hostsmember))) == NULL) return NULL; /* assign vars */ new_member->host_name = h->name; new_member->host_ptr = h; /* add (unsorted) link from the host to its group */ prepend_object_to_objectlist(&h->hostgroups_ptr, (void *)temp_hostgroup); /* add the new member to the member list, sorted by host name */ #ifndef NSCGI if(use_large_installation_tweaks == TRUE) { new_member->next = temp_hostgroup->members; temp_hostgroup->members = new_member; return new_member; } #endif last_member = temp_hostgroup->members; for(temp_member = temp_hostgroup->members; temp_member != NULL; temp_member = temp_member->next) { if(strcmp(new_member->host_name, temp_member->host_name) < 0) { new_member->next = temp_member; if(temp_member == temp_hostgroup->members) temp_hostgroup->members = new_member; else last_member->next = new_member; break; } else last_member = temp_member; } if(temp_hostgroup->members == NULL) { new_member->next = NULL; temp_hostgroup->members = new_member; } else if(temp_member == NULL) { new_member->next = NULL; last_member->next = new_member; } return new_member; } /* add a new service group to the list in memory */ servicegroup *add_servicegroup(char *name, char *alias, char *notes, char *notes_url, char *action_url) { servicegroup *new_servicegroup = NULL; int result = OK; /* make sure we have the data we need */ if(name == NULL || !strcmp(name, "")) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Servicegroup name is NULL\n"); return NULL; } new_servicegroup = calloc(1, sizeof(*new_servicegroup)); /* duplicate vars */ new_servicegroup->group_name = name; new_servicegroup->alias = alias ? alias : name; new_servicegroup->notes = notes; new_servicegroup->notes_url = notes_url; new_servicegroup->action_url = action_url; /* add new service group to hash table */ if(result == OK) { result = dkhash_insert(object_hash_tables[SERVICEGROUP_SKIPLIST], new_servicegroup->group_name, NULL, new_servicegroup); switch(result) { case DKHASH_EDUPE: logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Servicegroup '%s' has already been defined\n", name); result = ERROR; break; case DKHASH_OK: result = OK; break; default: logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not add servicegroup '%s' to hash table\n", name); result = ERROR; break; } } /* handle errors */ if(result == ERROR) { my_free(new_servicegroup); return NULL; } new_servicegroup->id = num_objects.servicegroups++; servicegroup_ary[new_servicegroup->id] = new_servicegroup; if(new_servicegroup->id) servicegroup_ary[new_servicegroup->id - 1]->next = new_servicegroup; return new_servicegroup; } /* add a new service to a service group */ servicesmember *add_service_to_servicegroup(servicegroup *temp_servicegroup, char *host_name, char *svc_description) { servicesmember *new_member = NULL; servicesmember *last_member = NULL; servicesmember *temp_member = NULL; struct service *svc; /* make sure we have the data we need */ if(temp_servicegroup == NULL || (host_name == NULL || !strcmp(host_name, "")) || (svc_description == NULL || !strcmp(svc_description, ""))) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Servicegroup or group member is NULL\n"); return NULL; } if (!(svc = find_service(host_name, svc_description))) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Failed to locate service '%s' on host '%s' for servicegroup '%s'\n", svc_description, host_name, temp_servicegroup->group_name); return NULL; } /* allocate memory for a new member */ if((new_member = calloc(1, sizeof(servicesmember))) == NULL) return NULL; /* assign vars */ new_member->host_name = svc->host_name; new_member->service_description = svc->description; new_member->service_ptr = svc; /* add (unsorted) link from the service to its groups */ prepend_object_to_objectlist(&svc->servicegroups_ptr, temp_servicegroup); /* * add new member to member list, sorted by host name then * service description, unless we're a large installation, in * which case insertion-sorting will take far too long */ #ifndef NSCGI if(use_large_installation_tweaks == TRUE) { new_member->next = temp_servicegroup->members; temp_servicegroup->members = new_member; return new_member; } #endif last_member = temp_servicegroup->members; for(temp_member = temp_servicegroup->members; temp_member != NULL; temp_member = temp_member->next) { if(strcmp(new_member->host_name, temp_member->host_name) < 0) { new_member->next = temp_member; if(temp_member == temp_servicegroup->members) temp_servicegroup->members = new_member; else last_member->next = new_member; break; } else if(strcmp(new_member->host_name, temp_member->host_name) == 0 && strcmp(new_member->service_description, temp_member->service_description) < 0) { new_member->next = temp_member; if(temp_member == temp_servicegroup->members) temp_servicegroup->members = new_member; else last_member->next = new_member; break; } else last_member = temp_member; } if(temp_servicegroup->members == NULL) { new_member->next = NULL; temp_servicegroup->members = new_member; } else if(temp_member == NULL) { new_member->next = NULL; last_member->next = new_member; } return new_member; } /* add a new contact to the list in memory */ contact *add_contact(char *name, char *alias, char *email, char *pager, char **addresses, char *svc_notification_period, char *host_notification_period, int service_notification_options, int host_notification_options, int host_notifications_enabled, int service_notifications_enabled, int can_submit_commands, int retain_status_information, int retain_nonstatus_information, unsigned int minimum_value) { contact *new_contact = NULL; timeperiod *htp = NULL, *stp = NULL; int x = 0; int result = OK; /* make sure we have the data we need */ if(name == NULL || !*name) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Contact name is NULL\n"); return NULL; } if(svc_notification_period && !(stp = find_timeperiod(svc_notification_period))) { logit(NSLOG_VERIFICATION_ERROR, TRUE, "Error: Service notification period '%s' specified for contact '%s' is not defined anywhere!\n", svc_notification_period, name); return NULL; } if(host_notification_period && !(htp = find_timeperiod(host_notification_period))) { logit(NSLOG_VERIFICATION_ERROR, TRUE, "Error: Host notification period '%s' specified for contact '%s' is not defined anywhere!\n", host_notification_period, name); return NULL; } new_contact = calloc(1, sizeof(*new_contact)); if(!new_contact) return NULL; new_contact->host_notification_period = htp ? (char *)strdup(htp->name) : NULL; new_contact->service_notification_period = stp ? (char *)strdup(stp->name) : NULL; new_contact->host_notification_period_ptr = htp; new_contact->service_notification_period_ptr = stp; new_contact->name = name; new_contact->alias = alias ? alias : name; new_contact->email = email; new_contact->pager = pager; if(addresses) { for(x = 0; x < MAX_CONTACT_ADDRESSES; x++) new_contact->address[x] = addresses[x]; } new_contact->minimum_value = minimum_value; new_contact->service_notification_options = service_notification_options; new_contact->host_notification_options = host_notification_options; new_contact->host_notifications_enabled = (host_notifications_enabled > 0) ? TRUE : FALSE; new_contact->service_notifications_enabled = (service_notifications_enabled > 0) ? TRUE : FALSE; new_contact->can_submit_commands = (can_submit_commands > 0) ? TRUE : FALSE; new_contact->retain_status_information = (retain_status_information > 0) ? TRUE : FALSE; new_contact->retain_nonstatus_information = (retain_nonstatus_information > 0) ? TRUE : FALSE; /* add new contact to hash table */ if(result == OK) { result = dkhash_insert(object_hash_tables[CONTACT_SKIPLIST], new_contact->name, NULL, new_contact); switch(result) { case DKHASH_EDUPE: logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Contact '%s' has already been defined\n", name); result = ERROR; break; case DKHASH_OK: result = OK; break; default: logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not add contact '%s' to hash table\n", name); result = ERROR; break; } } /* handle errors */ if(result == ERROR) { free(new_contact); return NULL; } new_contact->id = num_objects.contacts++; contact_ary[new_contact->id] = new_contact; if(new_contact->id) contact_ary[new_contact->id - 1]->next = new_contact; return new_contact; } /* adds a host notification command to a contact definition */ commandsmember *add_host_notification_command_to_contact(contact *cntct, char *command_name) { commandsmember *new_commandsmember = NULL; int result = OK; /* make sure we have the data we need */ if(cntct == NULL || (command_name == NULL || !strcmp(command_name, ""))) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Contact or host notification command is NULL\n"); return NULL; } /* allocate memory */ if((new_commandsmember = calloc(1, sizeof(commandsmember))) == NULL) return NULL; /* duplicate vars */ if((new_commandsmember->command = (char *)strdup(command_name)) == NULL) result = ERROR; /* handle errors */ if(result == ERROR) { my_free(new_commandsmember->command); my_free(new_commandsmember); return NULL; } /* add the notification command */ new_commandsmember->next = cntct->host_notification_commands; cntct->host_notification_commands = new_commandsmember; return new_commandsmember; } /* adds a service notification command to a contact definition */ commandsmember *add_service_notification_command_to_contact(contact *cntct, char *command_name) { commandsmember *new_commandsmember = NULL; int result = OK; /* make sure we have the data we need */ if(cntct == NULL || (command_name == NULL || !strcmp(command_name, ""))) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Contact or service notification command is NULL\n"); return NULL; } /* allocate memory */ if((new_commandsmember = calloc(1, sizeof(commandsmember))) == NULL) return NULL; /* duplicate vars */ if((new_commandsmember->command = (char *)strdup(command_name)) == NULL) result = ERROR; /* handle errors */ if(result == ERROR) { my_free(new_commandsmember->command); my_free(new_commandsmember); return NULL; } /* add the notification command */ new_commandsmember->next = cntct->service_notification_commands; cntct->service_notification_commands = new_commandsmember; return new_commandsmember; } /* adds a custom variable to a contact */ customvariablesmember *add_custom_variable_to_contact(contact *cntct, char *varname, char *varvalue) { return add_custom_variable_to_object(&cntct->custom_variables, varname, varvalue); } /* add a new contact group to the list in memory */ contactgroup *add_contactgroup(char *name, char *alias) { contactgroup *new_contactgroup = NULL; int result = OK; /* make sure we have the data we need */ if(name == NULL || !strcmp(name, "")) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Contactgroup name is NULL\n"); return NULL; } new_contactgroup = calloc(1, sizeof(*new_contactgroup)); if(!new_contactgroup) return NULL; /* assign vars */ new_contactgroup->group_name = name; new_contactgroup->alias = alias ? alias : name; /* add new contact group to hash table */ if(result == OK) { result = dkhash_insert(object_hash_tables[CONTACTGROUP_SKIPLIST], new_contactgroup->group_name, NULL, new_contactgroup); switch(result) { case DKHASH_EDUPE: logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Contactgroup '%s' has already been defined\n", name); result = ERROR; break; case DKHASH_OK: result = OK; break; default: logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not add contactgroup '%s' to hash table\n", name); result = ERROR; break; } } /* handle errors */ if(result == ERROR) { free(new_contactgroup); return NULL; } new_contactgroup->id = num_objects.contactgroups++; contactgroup_ary[new_contactgroup->id] = new_contactgroup; if(new_contactgroup->id) contactgroup_ary[new_contactgroup->id - 1]->next = new_contactgroup; return new_contactgroup; } /* add a new member to a contact group */ contactsmember *add_contact_to_contactgroup(contactgroup *grp, char *contact_name) { contactsmember *new_contactsmember = NULL; struct contact *c; /* make sure we have the data we need */ if(grp == NULL || (contact_name == NULL || !strcmp(contact_name, ""))) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Contactgroup or contact name is NULL\n"); return NULL; } if (!(c = find_contact(contact_name))) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Failed to locate contact '%s' for contactgroup '%s'\n", contact_name, grp->group_name); return NULL; } /* allocate memory for a new member */ if((new_contactsmember = calloc(1, sizeof(contactsmember))) == NULL) return NULL; /* assign vars */ new_contactsmember->contact_name = c->name; new_contactsmember->contact_ptr = c; /* add the new member to the head of the member list */ new_contactsmember->next = grp->members; grp->members = new_contactsmember; prepend_object_to_objectlist(&c->contactgroups_ptr, (void *)grp); return new_contactsmember; } /* add a new service to the list in memory */ service *add_service(char *host_name, char *description, char *display_name, char *check_period, int initial_state, int max_attempts, int parallelize, int accept_passive_checks, double check_interval, double retry_interval, double notification_interval, double first_notification_delay, char *notification_period, int notification_options, int notifications_enabled, int is_volatile, char *event_handler, int event_handler_enabled, char *check_command, int checks_enabled, int flap_detection_enabled, double low_flap_threshold, double high_flap_threshold, int flap_detection_options, int stalking_options, int process_perfdata, int check_freshness, int freshness_threshold, char *notes, char *notes_url, char *action_url, char *icon_image, char *icon_image_alt, int retain_status_information, int retain_nonstatus_information, int obsess, unsigned int hourly_value) { host *h; timeperiod *cp = NULL, *np = NULL; service *new_service = NULL; int result = OK; /* make sure we have everything we need */ if(host_name == NULL || description == NULL || !*description || check_command == NULL || !*check_command) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Service description, host name, or check command is NULL\n"); return NULL; } if (!(h = find_host(host_name))) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Unable to locate host '%s' for service '%s'\n", host_name, description); return NULL; } if(notification_period && !(np = find_timeperiod(notification_period))) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: notification_period '%s' for service '%s' on host '%s' could not be found!\n", notification_period, description, host_name); return NULL; } if(check_period && !(cp = find_timeperiod(check_period))) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: check_period '%s' for service '%s' on host '%s' not found!\n", check_period, description, host_name); return NULL; } /* check values */ if(max_attempts <= 0 || check_interval < 0 || retry_interval <= 0 || notification_interval < 0) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Invalid max_attempts, check_interval, retry_interval, or notification_interval value for service '%s' on host '%s'\n", description, host_name); return NULL; } if(first_notification_delay < 0) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Invalid first_notification_delay value for service '%s' on host '%s'\n", description, host_name); return NULL; } /* allocate memory */ new_service = calloc(1, sizeof(*new_service)); if(!new_service) return NULL; /* duplicate vars, but assign what we can */ new_service->notification_period_ptr = np; new_service->check_period_ptr = cp; new_service->host_ptr = h; new_service->check_period = cp ? (char *)strdup(cp->name) : NULL; new_service->notification_period = np ? (char *)strdup(np->name) : NULL; new_service->host_name = h->name; if((new_service->description = (char *)strdup(description)) == NULL) result = ERROR; if(display_name) { if((new_service->display_name = (char *)strdup(display_name)) == NULL) result = ERROR; } else { new_service->display_name = new_service->description; } if((new_service->check_command = (char *)strdup(check_command)) == NULL) result = ERROR; if(event_handler) { if((new_service->event_handler = (char *)strdup(event_handler)) == NULL) result = ERROR; } if(notes) { if((new_service->notes = (char *)strdup(notes)) == NULL) result = ERROR; } if(notes_url) { if((new_service->notes_url = (char *)strdup(notes_url)) == NULL) result = ERROR; } if(action_url) { if((new_service->action_url = (char *)strdup(action_url)) == NULL) result = ERROR; } if(icon_image) { if((new_service->icon_image = (char *)strdup(icon_image)) == NULL) result = ERROR; } if(icon_image_alt) { if((new_service->icon_image_alt = (char *)strdup(icon_image_alt)) == NULL) result = ERROR; } new_service->hourly_value = hourly_value; new_service->check_interval = check_interval; new_service->retry_interval = retry_interval; new_service->max_attempts = max_attempts; new_service->parallelize = (parallelize > 0) ? TRUE : FALSE; new_service->notification_interval = notification_interval; new_service->first_notification_delay = first_notification_delay; new_service->notification_options = notification_options; new_service->is_volatile = (is_volatile > 0) ? TRUE : FALSE; new_service->flap_detection_enabled = (flap_detection_enabled > 0) ? TRUE : FALSE; new_service->low_flap_threshold = low_flap_threshold; new_service->high_flap_threshold = high_flap_threshold; new_service->flap_detection_options = flap_detection_options; new_service->stalking_options = stalking_options; new_service->process_performance_data = (process_perfdata > 0) ? TRUE : FALSE; new_service->check_freshness = (check_freshness > 0) ? TRUE : FALSE; new_service->freshness_threshold = freshness_threshold; new_service->accept_passive_checks = (accept_passive_checks > 0) ? TRUE : FALSE; new_service->event_handler_enabled = (event_handler_enabled > 0) ? TRUE : FALSE; new_service->checks_enabled = (checks_enabled > 0) ? TRUE : FALSE; new_service->retain_status_information = (retain_status_information > 0) ? TRUE : FALSE; new_service->retain_nonstatus_information = (retain_nonstatus_information > 0) ? TRUE : FALSE; new_service->notifications_enabled = (notifications_enabled > 0) ? TRUE : FALSE; new_service->obsess = (obsess > 0) ? TRUE : FALSE; #ifdef NSCORE new_service->acknowledgement_type = ACKNOWLEDGEMENT_NONE; new_service->check_type = CHECK_TYPE_ACTIVE; new_service->current_attempt = (initial_state == STATE_OK) ? 1 : max_attempts; new_service->current_state = initial_state; new_service->last_state = initial_state; new_service->last_hard_state = initial_state; new_service->state_type = HARD_STATE; new_service->should_be_scheduled = TRUE; new_service->check_options = CHECK_OPTION_NONE; #endif /* add new service to hash table */ if(result == OK) { result = dkhash_insert(object_hash_tables[SERVICE_SKIPLIST], new_service->host_name, new_service->description, new_service); switch(result) { case DKHASH_EDUPE: logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Service '%s' on host '%s' has already been defined\n", description, host_name); result = ERROR; break; case DKHASH_OK: result = OK; break; default: logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not add service '%s' on host '%s' to hash table\n", description, host_name); result = ERROR; break; } } /* handle errors */ if(result == ERROR) { #ifdef NSCORE my_free(new_service->perf_data); my_free(new_service->plugin_output); my_free(new_service->long_plugin_output); #endif my_free(new_service->event_handler); my_free(new_service->check_command); my_free(new_service->description); if(display_name) my_free(new_service->display_name); return NULL; } add_service_link_to_host(h, new_service); new_service->id = num_objects.services++; service_ary[new_service->id] = new_service; if(new_service->id) service_ary[new_service->id - 1]->next = new_service; return new_service; } /* adds a contact group to a service */ contactgroupsmember *add_contactgroup_to_service(service *svc, char *group_name) { return add_contactgroup_to_object(&svc->contact_groups, group_name); } /* adds a contact to a service */ contactsmember *add_contact_to_service(service *svc, char *contact_name) { return add_contact_to_object(&svc->contacts, contact_name); } /* adds a custom variable to a service */ customvariablesmember *add_custom_variable_to_service(service *svc, char *varname, char *varvalue) { return add_custom_variable_to_object(&svc->custom_variables, varname, varvalue); } /* add a new command to the list in memory */ command *add_command(char *name, char *value) { command *new_command = NULL; int result = OK; /* make sure we have the data we need */ if((name == NULL || !strcmp(name, "")) || (value == NULL || !strcmp(value, ""))) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Command name of command line is NULL\n"); return NULL; } /* allocate memory for the new command */ new_command = calloc(1, sizeof(*new_command)); if(!new_command) return NULL; /* assign vars */ new_command->name = name; new_command->command_line = value; /* add new command to hash table */ if(result == OK) { result = dkhash_insert(object_hash_tables[COMMAND_SKIPLIST], new_command->name, NULL, new_command); switch(result) { case DKHASH_EDUPE: logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Command '%s' has already been defined\n", name); result = ERROR; break; case DKHASH_OK: result = OK; break; default: logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not add command '%s' to hash table\n", name); result = ERROR; break; } } /* handle errors */ if(result == ERROR) { my_free(new_command); return NULL; } new_command->id = num_objects.commands++; command_ary[new_command->id] = new_command; if(new_command->id) command_ary[new_command->id - 1]->next = new_command; return new_command; } /* add a new service escalation to the list in memory */ serviceescalation *add_serviceescalation(char *host_name, char *description, int first_notification, int last_notification, double notification_interval, char *escalation_period, int escalation_options) { serviceescalation *new_serviceescalation = NULL; service *svc; timeperiod *tp = NULL; /* make sure we have the data we need */ if(host_name == NULL || !*host_name || description == NULL || !*description) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Service escalation host name or description is NULL\n"); return NULL; } if(!(svc = find_service(host_name, description))) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Service '%s' on host '%s' has an escalation but is not defined anywhere!\n", host_name, description); return NULL; } if (escalation_period && !(tp = find_timeperiod(escalation_period))) { logit(NSLOG_VERIFICATION_ERROR, TRUE, "Error: Escalation period '%s' specified in service escalation for service '%s' on host '%s' is not defined anywhere!\n", escalation_period, description, host_name); return NULL ; } new_serviceescalation = calloc(1, sizeof(*new_serviceescalation)); if(!new_serviceescalation) return NULL; if(add_object_to_objectlist(&svc->escalation_list, new_serviceescalation) != OK) { logit(NSLOG_CONFIG_ERROR, TRUE, "Could not add escalation to service '%s' on host '%s'\n", svc->host_name, svc->description); return NULL; } /* assign vars. object names are immutable, so no need to copy */ new_serviceescalation->host_name = svc->host_name; new_serviceescalation->description = svc->description; new_serviceescalation->service_ptr = svc; new_serviceescalation->escalation_period_ptr = tp; if(tp) new_serviceescalation->escalation_period = (char *)strdup(tp->name); new_serviceescalation->first_notification = first_notification; new_serviceescalation->last_notification = last_notification; new_serviceescalation->notification_interval = (notification_interval <= 0) ? 0 : notification_interval; new_serviceescalation->escalation_options = escalation_options; new_serviceescalation->id = num_objects.serviceescalations++; serviceescalation_ary[new_serviceescalation->id] = new_serviceescalation; return new_serviceescalation; } /* adds a contact group to a service escalation */ contactgroupsmember *add_contactgroup_to_serviceescalation(serviceescalation *se, char *group_name) { return add_contactgroup_to_object(&se->contact_groups, group_name); } /* adds a contact to a service escalation */ contactsmember *add_contact_to_serviceescalation(serviceescalation *se, char *contact_name) { return add_contact_to_object(&se->contacts, contact_name); } /* adds a service dependency definition */ servicedependency *add_service_dependency(char *dependent_host_name, char *dependent_service_description, char *host_name, char *service_description, int dependency_type, int inherits_parent, int failure_options, char *dependency_period) { servicedependency *new_servicedependency = NULL; service *parent, *child; timeperiod *tp = NULL; int result; /* make sure we have what we need */ parent = find_service(host_name, service_description); if(!parent) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Master service '%s' on host '%s' is not defined anywhere!\n", service_description, host_name); return NULL; } child = find_service(dependent_host_name, dependent_service_description); if(!child) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Dependent service '%s' on host '%s' is not defined anywhere!\n", dependent_service_description, dependent_host_name); return NULL; } if (dependency_period && !(tp = find_timeperiod(dependency_period))) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Failed to locate timeperiod '%s' for dependency from service '%s' on host '%s' to service '%s' on host '%s'\n", dependency_period, dependent_service_description, dependent_host_name, service_description, host_name); return NULL; } /* allocate memory for a new service dependency entry */ if((new_servicedependency = calloc(1, sizeof(*new_servicedependency))) == NULL) return NULL; new_servicedependency->dependent_service_ptr = child; new_servicedependency->master_service_ptr = parent; new_servicedependency->dependency_period_ptr = tp; /* assign vars. object names are immutable, so no need to copy */ new_servicedependency->dependent_host_name = child->host_name; new_servicedependency->dependent_service_description = child->description; new_servicedependency->host_name = parent->host_name; new_servicedependency->service_description = parent->description; if (tp) new_servicedependency->dependency_period = (char *)strdup(tp->name); new_servicedependency->dependency_type = (dependency_type == EXECUTION_DEPENDENCY) ? EXECUTION_DEPENDENCY : NOTIFICATION_DEPENDENCY; new_servicedependency->inherits_parent = (inherits_parent > 0) ? TRUE : FALSE; new_servicedependency->failure_options = failure_options; /* * add new service dependency to its respective services. * Ordering doesn't matter here as we'll have to check them * all anyway. We avoid adding dupes though, since we can * apparently get zillion's and zillion's of them. */ if(dependency_type == NOTIFICATION_DEPENDENCY) result = prepend_unique_object_to_objectlist(&child->notify_deps, new_servicedependency, sizeof(*new_servicedependency)); else result = prepend_unique_object_to_objectlist(&child->exec_deps, new_servicedependency, sizeof(*new_servicedependency)); if(result != OK) { free(new_servicedependency); /* hack to avoid caller bombing out */ return result == OBJECTLIST_DUPE ? (void *)1 : NULL; } num_objects.servicedependencies++; return new_servicedependency; } /* adds a host dependency definition */ hostdependency *add_host_dependency(char *dependent_host_name, char *host_name, int dependency_type, int inherits_parent, int failure_options, char *dependency_period) { hostdependency *new_hostdependency = NULL; host *parent, *child; timeperiod *tp = NULL; int result; /* make sure we have what we need */ parent = find_host(host_name); if (!parent) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Master host '%s' in hostdependency from '%s' to '%s' is not defined anywhere!\n", host_name, dependent_host_name, host_name); return NULL; } child = find_host(dependent_host_name); if (!child) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Dependent host '%s' in hostdependency from '%s' to '%s' is not defined anywhere!\n", dependent_host_name, dependent_host_name, host_name); return NULL; } if (dependency_period && !(tp = find_timeperiod(dependency_period))) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Unable to locate dependency_period '%s' for %s->%s host dependency\n", dependency_period, parent->name, child->name); return NULL ; } if((new_hostdependency = calloc(1, sizeof(*new_hostdependency))) == NULL) return NULL; new_hostdependency->dependent_host_ptr = child; new_hostdependency->master_host_ptr = parent; new_hostdependency->dependency_period_ptr = tp; /* assign vars. Objects are immutable, so no need to copy */ new_hostdependency->dependent_host_name = child->name; new_hostdependency->host_name = parent->name; if(tp) new_hostdependency->dependency_period = (char *)strdup(tp->name); new_hostdependency->dependency_type = (dependency_type == EXECUTION_DEPENDENCY) ? EXECUTION_DEPENDENCY : NOTIFICATION_DEPENDENCY; new_hostdependency->inherits_parent = (inherits_parent > 0) ? TRUE : FALSE; new_hostdependency->failure_options = failure_options; if(dependency_type == NOTIFICATION_DEPENDENCY) result = prepend_unique_object_to_objectlist(&child->notify_deps, new_hostdependency, sizeof(*new_hostdependency)); else result = prepend_unique_object_to_objectlist(&child->exec_deps, new_hostdependency, sizeof(*new_hostdependency)); if(result != OK) { free(new_hostdependency); /* hack to avoid caller bombing out */ return result == OBJECTLIST_DUPE ? (void *)1 : NULL; } num_objects.hostdependencies++; return new_hostdependency; } /* add a new host escalation to the list in memory */ hostescalation *add_hostescalation(char *host_name, int first_notification, int last_notification, double notification_interval, char *escalation_period, int escalation_options) { hostescalation *new_hostescalation = NULL; host *h; timeperiod *tp = NULL; /* make sure we have the data we need */ if(host_name == NULL || !*host_name) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Host escalation host name is NULL\n"); return NULL; } if (!(h = find_host(host_name))) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Host '%s' has an escalation, but is not defined anywhere!\n", host_name); return NULL; } if (escalation_period && !(tp = find_timeperiod(escalation_period))) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Unable to locate timeperiod '%s' for hostescalation '%s'\n", escalation_period, host_name); return NULL; } new_hostescalation = calloc(1, sizeof(*new_hostescalation)); /* add the escalation to its host */ if (add_object_to_objectlist(&h->escalation_list, new_hostescalation) != OK) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not add hostescalation to host '%s'\n", host_name); free(new_hostescalation); return NULL; } /* assign vars. Object names are immutable, so no need to copy */ new_hostescalation->host_name = h->name; new_hostescalation->host_ptr = h; new_hostescalation->escalation_period = tp ? (char *)strdup(tp->name) : NULL; new_hostescalation->escalation_period_ptr = tp; new_hostescalation->first_notification = first_notification; new_hostescalation->last_notification = last_notification; new_hostescalation->notification_interval = (notification_interval <= 0) ? 0 : notification_interval; new_hostescalation->escalation_options = escalation_options; new_hostescalation->id = num_objects.hostescalations++; hostescalation_ary[new_hostescalation->id] = new_hostescalation; return new_hostescalation; } /* adds a contact group to a host escalation */ contactgroupsmember *add_contactgroup_to_hostescalation(hostescalation *he, char *group_name) { return add_contactgroup_to_object(&he->contact_groups, group_name); } /* adds a contact to a host escalation */ contactsmember *add_contact_to_hostescalation(hostescalation *he, char *contact_name) { return add_contact_to_object(&he->contacts, contact_name); } /* adds a contact to an object */ contactsmember *add_contact_to_object(contactsmember **object_ptr, char *contactname) { contactsmember *new_contactsmember = NULL; contact *c; /* make sure we have the data we need */ if(object_ptr == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Contact object is NULL\n"); return NULL; } if(contactname == NULL || !*contactname) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Contact name is NULL\n"); return NULL; } if(!(c = find_contact(contactname))) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Contact '%s' is not defined anywhere!\n", contactname); return NULL; } /* allocate memory for a new member */ if((new_contactsmember = malloc(sizeof(contactsmember))) == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not allocate memory for contact\n"); return NULL; } new_contactsmember->contact_name = c->name; /* set initial values */ new_contactsmember->contact_ptr = c; /* add the new contact to the head of the contact list */ new_contactsmember->next = *object_ptr; *object_ptr = new_contactsmember; return new_contactsmember; } /* adds a custom variable to an object */ customvariablesmember *add_custom_variable_to_object(customvariablesmember **object_ptr, char *varname, char *varvalue) { customvariablesmember *new_customvariablesmember = NULL; /* make sure we have the data we need */ if(object_ptr == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Custom variable object is NULL\n"); return NULL; } if(varname == NULL || !strcmp(varname, "")) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Custom variable name is NULL\n"); return NULL; } /* allocate memory for a new member */ if((new_customvariablesmember = malloc(sizeof(customvariablesmember))) == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not allocate memory for custom variable\n"); return NULL; } if((new_customvariablesmember->variable_name = (char *)strdup(varname)) == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not allocate memory for custom variable name\n"); my_free(new_customvariablesmember); return NULL; } if(varvalue) { if((new_customvariablesmember->variable_value = (char *)strdup(varvalue)) == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not allocate memory for custom variable value\n"); my_free(new_customvariablesmember->variable_name); my_free(new_customvariablesmember); return NULL; } } else new_customvariablesmember->variable_value = NULL; /* set initial values */ new_customvariablesmember->has_been_modified = FALSE; /* add the new member to the head of the member list */ new_customvariablesmember->next = *object_ptr; *object_ptr = new_customvariablesmember; return new_customvariablesmember; } /******************************************************************/ /******************** OBJECT SEARCH FUNCTIONS *********************/ /******************************************************************/ timeperiod *find_timeperiod(const char *name) { return dkhash_get(object_hash_tables[TIMEPERIOD_SKIPLIST], name, NULL); } host *find_host(const char *name) { return dkhash_get(object_hash_tables[HOST_SKIPLIST], name, NULL); } hostgroup *find_hostgroup(const char *name) { return dkhash_get(object_hash_tables[HOSTGROUP_SKIPLIST], name, NULL); } servicegroup *find_servicegroup(const char *name) { return dkhash_get(object_hash_tables[SERVICEGROUP_SKIPLIST], name, NULL); } contact *find_contact(const char *name) { return dkhash_get(object_hash_tables[CONTACT_SKIPLIST], name, NULL); } contactgroup *find_contactgroup(const char *name) { return dkhash_get(object_hash_tables[CONTACTGROUP_SKIPLIST], name, NULL); } command *find_command(const char *name) { return dkhash_get(object_hash_tables[COMMAND_SKIPLIST], name, NULL); } service *find_service(const char *host_name, const char *svc_desc) { return dkhash_get(object_hash_tables[SERVICE_SKIPLIST], host_name, svc_desc); } /* adds a object to a list of objects */ int add_object_to_objectlist(objectlist **list, void *object_ptr) { objectlist *temp_item = NULL; objectlist *new_item = NULL; if(list == NULL || object_ptr == NULL) return ERROR; /* skip this object if its already in the list */ for(temp_item = *list; temp_item; temp_item = temp_item->next) { if(temp_item->object_ptr == object_ptr) break; } if(temp_item) return OK; /* allocate memory for a new list item */ if((new_item = (objectlist *)malloc(sizeof(objectlist))) == NULL) return ERROR; /* initialize vars */ new_item->object_ptr = object_ptr; /* add new item to head of list */ new_item->next = *list; *list = new_item; return OK; } /* useful when we don't care if the object is unique or not */ int prepend_object_to_objectlist(objectlist **list, void *object_ptr) { objectlist *item; if(list == NULL || object_ptr == NULL) return ERROR; if((item = malloc(sizeof(*item))) == NULL) return ERROR; item->next = *list; item->object_ptr = object_ptr; *list = item; return OK; } /* useful for adding dependencies to master objects */ int prepend_unique_object_to_objectlist(objectlist **list, void *object_ptr, size_t size) { objectlist *l; if(list == NULL || object_ptr == NULL) return ERROR; for(l = *list; l; l = l->next) { if(!memcmp(l->object_ptr, object_ptr, size)) return OBJECTLIST_DUPE; } return prepend_object_to_objectlist(list, object_ptr); } /* frees memory allocated to a temporary object list */ int free_objectlist(objectlist **temp_list) { objectlist *this_objectlist = NULL; objectlist *next_objectlist = NULL; if(temp_list == NULL) return ERROR; /* free memory allocated to object list */ for(this_objectlist = *temp_list; this_objectlist != NULL; this_objectlist = next_objectlist) { next_objectlist = this_objectlist->next; my_free(this_objectlist); } *temp_list = NULL; return OK; } /******************************************************************/ /********************* OBJECT QUERY FUNCTIONS *********************/ /******************************************************************/ /* determines whether or not a specific host is an immediate child of another host */ int is_host_immediate_child_of_host(host *parent_host, host *child_host) { hostsmember *temp_hostsmember = NULL; /* not enough data */ if(child_host == NULL) return FALSE; /* root/top-level hosts */ if(parent_host == NULL) { if(child_host->parent_hosts == NULL) return TRUE; } /* mid-level/bottom hosts */ else { for(temp_hostsmember = child_host->parent_hosts; temp_hostsmember != NULL; temp_hostsmember = temp_hostsmember->next) { if(temp_hostsmember->host_ptr == parent_host) return TRUE; } } return FALSE; } /* determines whether or not a specific host is an immediate parent of another host */ int is_host_immediate_parent_of_host(host *child_host, host *parent_host) { if(is_host_immediate_child_of_host(parent_host, child_host) == TRUE) return TRUE; return FALSE; } #ifdef NSCGI int hostsmember_elements(hostsmember *list) { int elems = 0; for (; list; list = list->next) elems++; return elems; } /* returns a count of the immediate children for a given host */ /* NOTE: This function is only used by the CGIS */ int number_of_immediate_child_hosts(host *hst) { int children = 0; host *temp_host = NULL; if(hst == NULL) { for(temp_host = host_list; temp_host != NULL; temp_host = temp_host->next) { if(is_host_immediate_child_of_host(hst, temp_host) == TRUE) children++; } return children; } else { return hostsmember_elements(hst->child_hosts); } } /* get the number of immediate parent hosts for a given host */ /* NOTE: This function is only used by the CGIS */ int number_of_immediate_parent_hosts(host *hst) { int parents = 0; host *temp_host = NULL; if(hst == NULL) { for(temp_host = host_list; temp_host != NULL; temp_host = temp_host->next) { if(is_host_immediate_parent_of_host(hst, temp_host) == TRUE) { parents++; } } return parents; } else { return hostsmember_elements(hst->parent_hosts); } } #endif /* tests whether a host is a member of a particular hostgroup */ /* NOTE: This function is only used by the CGIS */ int is_host_member_of_hostgroup(hostgroup *group, host *hst) { hostsmember *temp_hostsmember = NULL; if(group == NULL || hst == NULL) return FALSE; for(temp_hostsmember = group->members; temp_hostsmember != NULL; temp_hostsmember = temp_hostsmember->next) { if(temp_hostsmember->host_ptr == hst) return TRUE; } return FALSE; } /* tests whether a host is a member of a particular servicegroup */ /* NOTE: This function is only used by the CGIS */ int is_host_member_of_servicegroup(servicegroup *group, host *hst) { servicesmember *temp_servicesmember = NULL; if(group == NULL || hst == NULL) return FALSE; for(temp_servicesmember = group->members; temp_servicesmember != NULL; temp_servicesmember = temp_servicesmember->next) { if(temp_servicesmember->service_ptr != NULL && temp_servicesmember->service_ptr->host_ptr == hst) return TRUE; } return FALSE; } /* tests whether a service is a member of a particular servicegroup */ /* NOTE: This function is only used by the CGIS */ int is_service_member_of_servicegroup(servicegroup *group, service *svc) { servicesmember *temp_servicesmember = NULL; if(group == NULL || svc == NULL) return FALSE; for(temp_servicesmember = group->members; temp_servicesmember != NULL; temp_servicesmember = temp_servicesmember->next) { if(temp_servicesmember->service_ptr == svc) return TRUE; } return FALSE; } /* * tests whether a contact is a member of a particular contactgroup. * The mk-livestatus eventbroker module uses this, so it must hang * around until 4.0 to prevent api breakage. * The cgi's stopped using it quite long ago though, so we need only * compile it if we're building the core */ int is_contact_member_of_contactgroup(contactgroup *group, contact *cntct) { contactsmember *member; if(!group || !cntct) return FALSE; /* search all contacts in this contact group */ for(member = group->members; member; member = member->next) { if (member->contact_ptr == cntct) return TRUE; } return FALSE; } /* tests whether a contact is a contact for a particular host */ int is_contact_for_host(host *hst, contact *cntct) { contactsmember *temp_contactsmember = NULL; contactgroupsmember *temp_contactgroupsmember = NULL; contactgroup *temp_contactgroup = NULL; if(hst == NULL || cntct == NULL) { return FALSE; } /* search all individual contacts of this host */ for(temp_contactsmember = hst->contacts; temp_contactsmember != NULL; temp_contactsmember = temp_contactsmember->next) { if (temp_contactsmember->contact_ptr == cntct) return TRUE; } /* search all contactgroups of this host */ for(temp_contactgroupsmember = hst->contact_groups; temp_contactgroupsmember != NULL; temp_contactgroupsmember = temp_contactgroupsmember->next) { temp_contactgroup = temp_contactgroupsmember->group_ptr; if(is_contact_member_of_contactgroup(temp_contactgroup, cntct)) return TRUE; } return FALSE; } /* tests whether a contactgroup is a contactgroup for a particular host */ int is_contactgroup_for_host(host *hst, contactgroup *group) { contactgroupsmember *temp_contactgroupsmember = NULL; if(hst == NULL || group == NULL) { return FALSE; } /* search all contactgroups of this host */ for(temp_contactgroupsmember = hst->contact_groups; temp_contactgroupsmember != NULL; temp_contactgroupsmember = temp_contactgroupsmember->next) { if(temp_contactgroupsmember->group_ptr == group) { return TRUE; } } return FALSE; } /* tests whether a contact is an escalated contact for a particular host */ int is_escalated_contact_for_host(host *hst, contact *cntct) { hostescalation *temp_hostescalation = NULL; objectlist *list; /* search all host escalations */ for(list = hst->escalation_list; list; list = list->next) { temp_hostescalation = (hostescalation *)list->object_ptr; if(is_contact_for_host_escalation(temp_hostescalation, cntct) == TRUE) { return TRUE; } } return FALSE; } /* tests whether a contact is an contact for a particular host escalation */ int is_contact_for_host_escalation(hostescalation *escalation, contact *cntct) { contactsmember *temp_contactsmember = NULL; contactgroupsmember *temp_contactgroupsmember = NULL; contactgroup *temp_contactgroup = NULL; if(escalation == NULL || cntct == NULL) { return FALSE; } /* search all contacts of this host escalation */ for(temp_contactsmember = escalation->contacts; temp_contactsmember != NULL; temp_contactsmember = temp_contactsmember->next) { if(temp_contactsmember->contact_ptr == cntct) return TRUE; } /* search all contactgroups of this host escalation */ for(temp_contactgroupsmember = escalation->contact_groups; temp_contactgroupsmember != NULL; temp_contactgroupsmember = temp_contactgroupsmember->next) { temp_contactgroup = temp_contactgroupsmember->group_ptr; if(is_contact_member_of_contactgroup(temp_contactgroup, cntct)) return TRUE; } return FALSE; } /* tests whether a contactgroup is a contactgroup for a particular host escalation */ int is_contactgroup_for_host_escalation(hostescalation *escalation, contactgroup *group) { contactgroupsmember *temp_contactgroupsmember = NULL; if(escalation == NULL || group == NULL) { return FALSE; } /* search all contactgroups of this host escalation */ for(temp_contactgroupsmember = escalation->contact_groups; temp_contactgroupsmember != NULL; temp_contactgroupsmember = temp_contactgroupsmember->next) { if(temp_contactgroupsmember->group_ptr == group) { return TRUE; } } return FALSE; } /* tests whether a contact is a contact for a particular service */ int is_contact_for_service(service *svc, contact *cntct) { contactsmember *temp_contactsmember = NULL; contactgroupsmember *temp_contactgroupsmember = NULL; contactgroup *temp_contactgroup = NULL; if(svc == NULL || cntct == NULL) return FALSE; /* search all individual contacts of this service */ for(temp_contactsmember = svc->contacts; temp_contactsmember != NULL; temp_contactsmember = temp_contactsmember->next) { if(temp_contactsmember->contact_ptr == cntct) return TRUE; } /* search all contactgroups of this service */ for(temp_contactgroupsmember = svc->contact_groups; temp_contactgroupsmember != NULL; temp_contactgroupsmember = temp_contactgroupsmember->next) { temp_contactgroup = temp_contactgroupsmember->group_ptr; if(is_contact_member_of_contactgroup(temp_contactgroup, cntct)) return TRUE; } return FALSE; } /* tests whether a contactgroup is a contactgroup for a particular service */ int is_contactgroup_for_service(service *svc, contactgroup *group) { contactgroupsmember *temp_contactgroupsmember = NULL; if(svc == NULL || group == NULL) return FALSE; /* search all contactgroups of this service */ for(temp_contactgroupsmember = svc->contact_groups; temp_contactgroupsmember != NULL; temp_contactgroupsmember = temp_contactgroupsmember->next) { if(temp_contactgroupsmember->group_ptr == group) { return TRUE; } } return FALSE; } /* tests whether a contact is an escalated contact for a particular service */ int is_escalated_contact_for_service(service *svc, contact *cntct) { serviceescalation *temp_serviceescalation = NULL; objectlist *list; /* search all the service escalations */ for(list = svc->escalation_list; list; list = list->next) { temp_serviceescalation = (serviceescalation *)list->object_ptr; if(is_contact_for_service_escalation(temp_serviceescalation, cntct) == TRUE) { return TRUE; } } return FALSE; } /* tests whether a contact is an contact for a particular service escalation */ int is_contact_for_service_escalation(serviceescalation *escalation, contact *cntct) { contactsmember *temp_contactsmember = NULL; contactgroupsmember *temp_contactgroupsmember = NULL; contactgroup *temp_contactgroup = NULL; /* search all contacts of this service escalation */ for(temp_contactsmember = escalation->contacts; temp_contactsmember != NULL; temp_contactsmember = temp_contactsmember->next) { if(temp_contactsmember->contact_ptr == cntct) return TRUE; } /* search all contactgroups of this service escalation */ for(temp_contactgroupsmember =escalation->contact_groups; temp_contactgroupsmember != NULL; temp_contactgroupsmember = temp_contactgroupsmember->next) { temp_contactgroup = temp_contactgroupsmember->group_ptr; if(is_contact_member_of_contactgroup(temp_contactgroup, cntct)) return TRUE; } return FALSE; } /* tests whether a contactgroup is a contactgroup for a particular service escalation */ int is_contactgroup_for_service_escalation(serviceescalation *escalation, contactgroup *group) { contactgroupsmember *temp_contactgroupsmember = NULL; if(escalation == NULL || group == NULL) { return FALSE; } /* search all contactgroups of this service escalation */ for(temp_contactgroupsmember = escalation->contact_groups; temp_contactgroupsmember != NULL; temp_contactgroupsmember = temp_contactgroupsmember->next) { if(temp_contactgroupsmember->group_ptr == group) { return TRUE; } } return FALSE; } /******************************************************************/ /******************* OBJECT DELETION FUNCTIONS ********************/ /******************************************************************/ /* free all allocated memory for objects */ int free_object_data(void) { daterange *this_daterange = NULL; daterange *next_daterange = NULL; timerange *this_timerange = NULL; timerange *next_timerange = NULL; timeperiodexclusion *this_timeperiodexclusion = NULL; timeperiodexclusion *next_timeperiodexclusion = NULL; hostsmember *this_hostsmember = NULL; hostsmember *next_hostsmember = NULL; servicesmember *this_servicesmember = NULL; servicesmember *next_servicesmember = NULL; contactsmember *this_contactsmember = NULL; contactsmember *next_contactsmember = NULL; contactgroupsmember *this_contactgroupsmember = NULL; contactgroupsmember *next_contactgroupsmember = NULL; customvariablesmember *this_customvariablesmember = NULL; customvariablesmember *next_customvariablesmember = NULL; commandsmember *this_commandsmember = NULL; commandsmember *next_commandsmember = NULL; unsigned int i = 0, x = 0; /* * kill off hash tables so lingering modules don't look stuff up * while we're busy removing it. */ for (i = 0; i < ARRAY_SIZE(object_hash_tables); i++) { dkhash_table *t = object_hash_tables[i]; object_hash_tables[i] = NULL; dkhash_destroy(t); } /**** free memory for the timeperiod list ****/ for (i = 0; i < num_objects.timeperiods; i++) { timeperiod *this_timeperiod = timeperiod_ary[i]; /* free the exception time ranges contained in this timeperiod */ for(x = 0; x < DATERANGE_TYPES; x++) { for(this_daterange = this_timeperiod->exceptions[x]; this_daterange != NULL; this_daterange = next_daterange) { next_daterange = this_daterange->next; for(this_timerange = this_daterange->times; this_timerange != NULL; this_timerange = next_timerange) { next_timerange = this_timerange->next; my_free(this_timerange); } my_free(this_daterange); } } /* free the day time ranges contained in this timeperiod */ for(x = 0; x < 7; x++) { for(this_timerange = this_timeperiod->days[x]; this_timerange != NULL; this_timerange = next_timerange) { next_timerange = this_timerange->next; my_free(this_timerange); } } /* free exclusions */ for(this_timeperiodexclusion = this_timeperiod->exclusions; this_timeperiodexclusion != NULL; this_timeperiodexclusion = next_timeperiodexclusion) { next_timeperiodexclusion = this_timeperiodexclusion->next; my_free(this_timeperiodexclusion->timeperiod_name); my_free(this_timeperiodexclusion); } if (this_timeperiod->alias != this_timeperiod->name) my_free(this_timeperiod->alias); my_free(this_timeperiod->name); my_free(this_timeperiod); } /* reset pointers */ my_free(timeperiod_ary); /**** free memory for the host list ****/ for (i = 0; i < num_objects.hosts; i++) { host *this_host = host_ary[i]; /* free memory for parent hosts */ this_hostsmember = this_host->parent_hosts; while(this_hostsmember != NULL) { next_hostsmember = this_hostsmember->next; my_free(this_hostsmember->host_name); my_free(this_hostsmember); this_hostsmember = next_hostsmember; } /* free memory for child host links */ this_hostsmember = this_host->child_hosts; while(this_hostsmember != NULL) { next_hostsmember = this_hostsmember->next; my_free(this_hostsmember); this_hostsmember = next_hostsmember; } /* free memory for service links */ this_servicesmember = this_host->services; while(this_servicesmember != NULL) { next_servicesmember = this_servicesmember->next; my_free(this_servicesmember); this_servicesmember = next_servicesmember; } /* free memory for contact groups */ this_contactgroupsmember = this_host->contact_groups; while(this_contactgroupsmember != NULL) { next_contactgroupsmember = this_contactgroupsmember->next; my_free(this_contactgroupsmember); this_contactgroupsmember = next_contactgroupsmember; } /* free memory for contacts */ this_contactsmember = this_host->contacts; while(this_contactsmember != NULL) { next_contactsmember = this_contactsmember->next; my_free(this_contactsmember); this_contactsmember = next_contactsmember; } /* free memory for custom variables */ this_customvariablesmember = this_host->custom_variables; while(this_customvariablesmember != NULL) { next_customvariablesmember = this_customvariablesmember->next; my_free(this_customvariablesmember->variable_name); my_free(this_customvariablesmember->variable_value); my_free(this_customvariablesmember); this_customvariablesmember = next_customvariablesmember; } if(this_host->display_name != this_host->name) my_free(this_host->display_name); if(this_host->alias != this_host->name) my_free(this_host->alias); if(this_host->address != this_host->name) my_free(this_host->address); my_free(this_host->name); #ifdef NSCORE my_free(this_host->plugin_output); my_free(this_host->long_plugin_output); my_free(this_host->perf_data); #endif free_objectlist(&this_host->hostgroups_ptr); free_objectlist(&this_host->notify_deps); free_objectlist(&this_host->exec_deps); free_objectlist(&this_host->escalation_list); my_free(this_host->check_command); my_free(this_host->event_handler); my_free(this_host->notes); my_free(this_host->notes_url); my_free(this_host->action_url); my_free(this_host->icon_image); my_free(this_host->icon_image_alt); my_free(this_host->vrml_image); my_free(this_host->statusmap_image); my_free(this_host); } /* reset pointers */ my_free(host_ary); /**** free memory for the host group list ****/ for (i = 0; i < num_objects.hostgroups; i++) { hostgroup *this_hostgroup = hostgroup_ary[i]; /* free memory for the group members */ this_hostsmember = this_hostgroup->members; while(this_hostsmember != NULL) { next_hostsmember = this_hostsmember->next; my_free(this_hostsmember); this_hostsmember = next_hostsmember; } if (this_hostgroup->alias != this_hostgroup->group_name) my_free(this_hostgroup->alias); my_free(this_hostgroup->group_name); my_free(this_hostgroup->notes); my_free(this_hostgroup->notes_url); my_free(this_hostgroup->action_url); my_free(this_hostgroup); } /* reset pointers */ my_free(hostgroup_ary); /**** free memory for the service group list ****/ for (i = 0; i < num_objects.servicegroups; i++) { servicegroup *this_servicegroup = servicegroup_ary[i]; /* free memory for the group members */ this_servicesmember = this_servicegroup->members; while(this_servicesmember != NULL) { next_servicesmember = this_servicesmember->next; my_free(this_servicesmember); this_servicesmember = next_servicesmember; } if (this_servicegroup->alias != this_servicegroup->group_name) my_free(this_servicegroup->alias); my_free(this_servicegroup->group_name); my_free(this_servicegroup->notes); my_free(this_servicegroup->notes_url); my_free(this_servicegroup->action_url); my_free(this_servicegroup); } /* reset pointers */ my_free(servicegroup_ary); /**** free memory for the contact list ****/ for (i = 0; i < num_objects.contacts; i++) { int j; contact *this_contact = contact_ary[i]; /* free memory for the host notification commands */ this_commandsmember = this_contact->host_notification_commands; while(this_commandsmember != NULL) { next_commandsmember = this_commandsmember->next; if(this_commandsmember->command != NULL) my_free(this_commandsmember->command); my_free(this_commandsmember); this_commandsmember = next_commandsmember; } /* free memory for the service notification commands */ this_commandsmember = this_contact->service_notification_commands; while(this_commandsmember != NULL) { next_commandsmember = this_commandsmember->next; if(this_commandsmember->command != NULL) my_free(this_commandsmember->command); my_free(this_commandsmember); this_commandsmember = next_commandsmember; } /* free memory for custom variables */ this_customvariablesmember = this_contact->custom_variables; while(this_customvariablesmember != NULL) { next_customvariablesmember = this_customvariablesmember->next; my_free(this_customvariablesmember->variable_name); my_free(this_customvariablesmember->variable_value); my_free(this_customvariablesmember); this_customvariablesmember = next_customvariablesmember; } if (this_contact->alias != this_contact->name) my_free(this_contact->alias); my_free(this_contact->name); my_free(this_contact->email); my_free(this_contact->pager); for(j = 0; j < MAX_CONTACT_ADDRESSES; j++) my_free(this_contact->address[j]); free_objectlist(&this_contact->contactgroups_ptr); my_free(this_contact); } /* reset pointers */ my_free(contact_ary); /**** free memory for the contact group list ****/ for (i = 0; i < num_objects.contactgroups; i++) { contactgroup *this_contactgroup = contactgroup_ary[i]; /* free memory for the group members */ this_contactsmember = this_contactgroup->members; while(this_contactsmember != NULL) { next_contactsmember = this_contactsmember->next; my_free(this_contactsmember); this_contactsmember = next_contactsmember; } if (this_contactgroup->alias != this_contactgroup->group_name) my_free(this_contactgroup->alias); my_free(this_contactgroup->group_name); my_free(this_contactgroup); } /* reset pointers */ my_free(contactgroup_ary); /**** free memory for the service list ****/ for (i = 0; i < num_objects.services; i++) { service *this_service = service_ary[i]; /* free memory for contact groups */ this_contactgroupsmember = this_service->contact_groups; while(this_contactgroupsmember != NULL) { next_contactgroupsmember = this_contactgroupsmember->next; my_free(this_contactgroupsmember); this_contactgroupsmember = next_contactgroupsmember; } /* free memory for contacts */ this_contactsmember = this_service->contacts; while(this_contactsmember != NULL) { next_contactsmember = this_contactsmember->next; my_free(this_contactsmember); this_contactsmember = next_contactsmember; } /* free memory for custom variables */ this_customvariablesmember = this_service->custom_variables; while(this_customvariablesmember != NULL) { next_customvariablesmember = this_customvariablesmember->next; my_free(this_customvariablesmember->variable_name); my_free(this_customvariablesmember->variable_value); my_free(this_customvariablesmember); this_customvariablesmember = next_customvariablesmember; } if(this_service->display_name != this_service->description) my_free(this_service->display_name); my_free(this_service->description); my_free(this_service->check_command); #ifdef NSCORE my_free(this_service->plugin_output); my_free(this_service->long_plugin_output); my_free(this_service->perf_data); my_free(this_service->event_handler_args); my_free(this_service->check_command_args); #endif free_objectlist(&this_service->servicegroups_ptr); free_objectlist(&this_service->notify_deps); free_objectlist(&this_service->exec_deps); free_objectlist(&this_service->escalation_list); my_free(this_service->event_handler); my_free(this_service->notes); my_free(this_service->notes_url); my_free(this_service->action_url); my_free(this_service->icon_image); my_free(this_service->icon_image_alt); my_free(this_service); } /* reset pointers */ my_free(service_ary); /**** free command memory ****/ for (i = 0; i < num_objects.commands; i++) { command *this_command = command_ary[i]; my_free(this_command->name); my_free(this_command->command_line); my_free(this_command); } /* reset pointers */ my_free(command_ary); /**** free service escalation memory ****/ for (i = 0; i < num_objects.serviceescalations; i++) { serviceescalation *this_serviceescalation = serviceescalation_ary[i]; /* free memory for the contact group members */ this_contactgroupsmember = this_serviceescalation->contact_groups; while(this_contactgroupsmember != NULL) { next_contactgroupsmember = this_contactgroupsmember->next; my_free(this_contactgroupsmember); this_contactgroupsmember = next_contactgroupsmember; } /* free memory for contacts */ this_contactsmember = this_serviceescalation->contacts; while(this_contactsmember != NULL) { next_contactsmember = this_contactsmember->next; my_free(this_contactsmember); this_contactsmember = next_contactsmember; } my_free(this_serviceescalation); } /* reset pointers */ my_free(serviceescalation_ary); /**** free service dependency memory ****/ if (servicedependency_ary) { for(i = 0; i < num_objects.servicedependencies; i++) my_free(servicedependency_ary[i]); my_free(servicedependency_ary); } /**** free host dependency memory ****/ if (hostdependency_ary) { for(i = 0; i < num_objects.hostdependencies; i++) my_free(hostdependency_ary[i]); my_free(hostdependency_ary); } /**** free host escalation memory ****/ for (i = 0; i < num_objects.hostescalations; i++) { hostescalation *this_hostescalation = hostescalation_ary[i]; /* free memory for the contact group members */ this_contactgroupsmember = this_hostescalation->contact_groups; while(this_contactgroupsmember != NULL) { next_contactgroupsmember = this_contactgroupsmember->next; my_free(this_contactgroupsmember); this_contactgroupsmember = next_contactgroupsmember; } /* free memory for contacts */ this_contactsmember = this_hostescalation->contacts; while(this_contactsmember != NULL) { next_contactsmember = this_contactsmember->next; my_free(this_contactsmember); this_contactsmember = next_contactsmember; } my_free(this_hostescalation); } /* reset pointers */ my_free(hostescalation_ary); /* we no longer have any objects */ memset(&num_objects, 0, sizeof(num_objects)); return OK; } /******************************************************************/ /*********************** CACHE FUNCTIONS **************************/ /******************************************************************/ #ifndef NSCGI static const char *timerange2str(const timerange *tr) { static char str[12]; int sh, sm, eh, em; if(!tr) return ""; sh = tr->range_start / 3600; sm = (tr->range_start / 60) % 60; eh = tr->range_end / 3600; em = (tr->range_end / 60) % 60; sprintf(str, "%02d:%02d-%02d:%02d", sh, sm, eh, em); return str; } void fcache_contactlist(FILE *fp, const char *prefix, contactsmember *list) { if(list) { contactsmember *l; fprintf(fp, "%s", prefix); for(l = list; l; l = l->next) fprintf(fp, "%s%c", l->contact_name, l->next ? ',' : '\n'); } } void fcache_contactgrouplist(FILE *fp, const char *prefix, contactgroupsmember *list) { if(list) { contactgroupsmember *l; fprintf(fp, "%s", prefix); for(l = list; l; l = l->next) fprintf(fp, "%s%c", l->group_name, l->next ? ',' : '\n'); } } void fcache_hostlist(FILE *fp, const char *prefix, hostsmember *list) { if(list) { hostsmember *l; fprintf(fp, "%s", prefix); for(l = list; l; l = l->next) fprintf(fp, "%s%c", l->host_name, l->next ? ',' : '\n'); } } void fcache_customvars(FILE *fp, customvariablesmember *cvlist) { if(cvlist) { customvariablesmember *l; for(l = cvlist; l; l = l->next) fprintf(fp, "\t_%s\t%s\n", l->variable_name, (l->variable_value == NULL) ? XODTEMPLATE_NULL : l->variable_value); } } void fcache_timeperiod(FILE *fp, timeperiod *temp_timeperiod) { const char *days[7] = {"sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday"}; const char *months[12] = {"january", "february", "march", "april", "may", "june", "july", "august", "september", "october", "november", "december"}; daterange *temp_daterange; timerange *tr; register int x; fprintf(fp, "define timeperiod {\n"); fprintf(fp, "\ttimeperiod_name\t%s\n", temp_timeperiod->name); if(temp_timeperiod->alias) fprintf(fp, "\talias\t%s\n", temp_timeperiod->alias); if(temp_timeperiod->exclusions) { timeperiodexclusion *exclude; fprintf(fp, "\texclude\t"); for(exclude = temp_timeperiod->exclusions; exclude; exclude = exclude->next) { fprintf(fp, "%s%c", exclude->timeperiod_name, exclude->next ? ',' : '\n'); } } for(x = 0; x < DATERANGE_TYPES; x++) { for(temp_daterange = temp_timeperiod->exceptions[x]; temp_daterange != NULL; temp_daterange = temp_daterange->next) { /* skip null entries */ if(temp_daterange->times == NULL) continue; switch(temp_daterange->type) { case DATERANGE_CALENDAR_DATE: fprintf(fp, "\t%d-%02d-%02d", temp_daterange->syear, temp_daterange->smon + 1, temp_daterange->smday); if((temp_daterange->smday != temp_daterange->emday) || (temp_daterange->smon != temp_daterange->emon) || (temp_daterange->syear != temp_daterange->eyear)) fprintf(fp, " - %d-%02d-%02d", temp_daterange->eyear, temp_daterange->emon + 1, temp_daterange->emday); if(temp_daterange->skip_interval > 1) fprintf(fp, " / %d", temp_daterange->skip_interval); break; case DATERANGE_MONTH_DATE: fprintf(fp, "\t%s %d", months[temp_daterange->smon], temp_daterange->smday); if((temp_daterange->smon != temp_daterange->emon) || (temp_daterange->smday != temp_daterange->emday)) { fprintf(fp, " - %s %d", months[temp_daterange->emon], temp_daterange->emday); if(temp_daterange->skip_interval > 1) fprintf(fp, " / %d", temp_daterange->skip_interval); } break; case DATERANGE_MONTH_DAY: fprintf(fp, "\tday %d", temp_daterange->smday); if(temp_daterange->smday != temp_daterange->emday) { fprintf(fp, " - %d", temp_daterange->emday); if(temp_daterange->skip_interval > 1) fprintf(fp, " / %d", temp_daterange->skip_interval); } break; case DATERANGE_MONTH_WEEK_DAY: fprintf(fp, "\t%s %d %s", days[temp_daterange->swday], temp_daterange->swday_offset, months[temp_daterange->smon]); if((temp_daterange->smon != temp_daterange->emon) || (temp_daterange->swday != temp_daterange->ewday) || (temp_daterange->swday_offset != temp_daterange->ewday_offset)) { fprintf(fp, " - %s %d %s", days[temp_daterange->ewday], temp_daterange->ewday_offset, months[temp_daterange->emon]); if(temp_daterange->skip_interval > 1) fprintf(fp, " / %d", temp_daterange->skip_interval); } break; case DATERANGE_WEEK_DAY: fprintf(fp, "\t%s %d", days[temp_daterange->swday], temp_daterange->swday_offset); if((temp_daterange->swday != temp_daterange->ewday) || (temp_daterange->swday_offset != temp_daterange->ewday_offset)) { fprintf(fp, " - %s %d", days[temp_daterange->ewday], temp_daterange->ewday_offset); if(temp_daterange->skip_interval > 1) fprintf(fp, " / %d", temp_daterange->skip_interval); } break; default: break; } fputc('\t', fp); for(tr = temp_daterange->times; tr; tr = tr->next) { fprintf(fp, "%s%c", timerange2str(tr), tr->next ? ',' : '\n'); } } } for(x = 0; x < 7; x++) { /* skip null entries */ if(temp_timeperiod->days[x] == NULL) continue; fprintf(fp, "\t%s\t", days[x]); for(tr = temp_timeperiod->days[x]; tr; tr = tr->next) { fprintf(fp, "%s%c", timerange2str(tr), tr->next ? ',' : '\n'); } } fprintf(fp, "\t}\n\n"); } void fcache_command(FILE *fp, command *temp_command) { fprintf(fp, "define command {\n\tcommand_name\t%s\n\tcommand_line\t%s\n\t}\n\n", temp_command->name, temp_command->command_line); } void fcache_contactgroup(FILE *fp, contactgroup *temp_contactgroup) { fprintf(fp, "define contactgroup {\n"); fprintf(fp, "\tcontactgroup_name\t%s\n", temp_contactgroup->group_name); if(temp_contactgroup->alias) fprintf(fp, "\talias\t%s\n", temp_contactgroup->alias); fcache_contactlist(fp, "\tmembers\t", temp_contactgroup->members); fprintf(fp, "\t}\n\n"); } void fcache_hostgroup(FILE *fp, hostgroup *temp_hostgroup) { fprintf(fp, "define hostgroup {\n"); fprintf(fp, "\thostgroup_name\t%s\n", temp_hostgroup->group_name); if(temp_hostgroup->alias) fprintf(fp, "\talias\t%s\n", temp_hostgroup->alias); if(temp_hostgroup->members) { hostsmember *list; fprintf(fp, "\tmembers\t"); for(list = temp_hostgroup->members; list; list = list->next) fprintf(fp, "%s%c", list->host_name, list->next ? ',' : '\n'); } if(temp_hostgroup->notes) fprintf(fp, "\tnotes\t%s\n", temp_hostgroup->notes); if(temp_hostgroup->notes_url) fprintf(fp, "\tnotes_url\t%s\n", temp_hostgroup->notes_url); if(temp_hostgroup->action_url) fprintf(fp, "\taction_url\t%s\n", temp_hostgroup->action_url); fprintf(fp, "\t}\n\n"); } void fcache_servicegroup(FILE *fp, servicegroup *temp_servicegroup) { fprintf(fp, "define servicegroup {\n"); fprintf(fp, "\tservicegroup_name\t%s\n", temp_servicegroup->group_name); if(temp_servicegroup->alias) fprintf(fp, "\talias\t%s\n", temp_servicegroup->alias); if(temp_servicegroup->members) { servicesmember *list; fprintf(fp, "\tmembers\t"); for(list = temp_servicegroup->members; list; list = list->next) { service *s = list->service_ptr; fprintf(fp, "%s,%s%c", s->host_name, s->description, list->next ? ',' : '\n'); } } if(temp_servicegroup->notes) fprintf(fp, "\tnotes\t%s\n", temp_servicegroup->notes); if(temp_servicegroup->notes_url) fprintf(fp, "\tnotes_url\t%s\n", temp_servicegroup->notes_url); if(temp_servicegroup->action_url) fprintf(fp, "\taction_url\t%s\n", temp_servicegroup->action_url); fprintf(fp, "\t}\n\n"); } void fcache_contact(FILE *fp, contact *temp_contact) { commandsmember *list; int x; fprintf(fp, "define contact {\n"); fprintf(fp, "\tcontact_name\t%s\n", temp_contact->name); if(temp_contact->alias) fprintf(fp, "\talias\t%s\n", temp_contact->alias); if(temp_contact->service_notification_period) fprintf(fp, "\tservice_notification_period\t%s\n", temp_contact->service_notification_period); if(temp_contact->host_notification_period) fprintf(fp, "\thost_notification_period\t%s\n", temp_contact->host_notification_period); fprintf(fp, "\tservice_notification_options\t%s\n", opts2str(temp_contact->service_notification_options, service_flag_map, 'r')); fprintf(fp, "\thost_notification_options\t%s\n", opts2str(temp_contact->host_notification_options, host_flag_map, 'r')); if(temp_contact->service_notification_commands) { fprintf(fp, "\tservice_notification_commands\t"); for(list = temp_contact->service_notification_commands; list; list = list->next) { fprintf(fp, "%s%c", list->command, list->next ? ',' : '\n'); } } if(temp_contact->host_notification_commands) { fprintf(fp, "\thost_notification_commands\t"); for(list = temp_contact->host_notification_commands; list; list = list->next) { fprintf(fp, "%s%c", list->command, list->next ? ',' : '\n'); } } if(temp_contact->email) fprintf(fp, "\temail\t%s\n", temp_contact->email); if(temp_contact->pager) fprintf(fp, "\tpager\t%s\n", temp_contact->pager); for(x = 0; x < MAX_XODTEMPLATE_CONTACT_ADDRESSES; x++) { if(temp_contact->address[x]) fprintf(fp, "\taddress%d\t%s\n", x + 1, temp_contact->address[x]); } fprintf(fp, "\tminimum_importance\t%u\n", temp_contact->minimum_value); fprintf(fp, "\thost_notifications_enabled\t%d\n", temp_contact->host_notifications_enabled); fprintf(fp, "\tservice_notifications_enabled\t%d\n", temp_contact->service_notifications_enabled); fprintf(fp, "\tcan_submit_commands\t%d\n", temp_contact->can_submit_commands); fprintf(fp, "\tretain_status_information\t%d\n", temp_contact->retain_status_information); fprintf(fp, "\tretain_nonstatus_information\t%d\n", temp_contact->retain_nonstatus_information); /* custom variables */ fcache_customvars(fp, temp_contact->custom_variables); fprintf(fp, "\t}\n\n"); } void fcache_host(FILE *fp, host *temp_host) { fprintf(fp, "define host {\n"); fprintf(fp, "\thost_name\t%s\n", temp_host->name); if(temp_host->display_name != temp_host->name) fprintf(fp, "\tdisplay_name\t%s\n", temp_host->display_name); if(temp_host->alias) fprintf(fp, "\talias\t%s\n", temp_host->alias); if(temp_host->address) fprintf(fp, "\taddress\t%s\n", temp_host->address); fcache_hostlist(fp, "\tparents\t", temp_host->parent_hosts); if(temp_host->check_period) fprintf(fp, "\tcheck_period\t%s\n", temp_host->check_period); if(temp_host->check_command) fprintf(fp, "\tcheck_command\t%s\n", temp_host->check_command); if(temp_host->event_handler) fprintf(fp, "\tevent_handler\t%s\n", temp_host->event_handler); fcache_contactlist(fp, "\tcontacts\t", temp_host->contacts); fcache_contactgrouplist(fp, "\tcontact_groups\t", temp_host->contact_groups); if(temp_host->notification_period) fprintf(fp, "\tnotification_period\t%s\n", temp_host->notification_period); fprintf(fp, "\tinitial_state\t"); if(temp_host->initial_state == HOST_DOWN) fprintf(fp, "d\n"); else if(temp_host->initial_state == HOST_UNREACHABLE) fprintf(fp, "u\n"); else fprintf(fp, "o\n"); fprintf(fp, "\timportance\t%u\n", temp_host->hourly_value); fprintf(fp, "\tcheck_interval\t%f\n", temp_host->check_interval); fprintf(fp, "\tretry_interval\t%f\n", temp_host->retry_interval); fprintf(fp, "\tmax_check_attempts\t%d\n", temp_host->max_attempts); fprintf(fp, "\tactive_checks_enabled\t%d\n", temp_host->checks_enabled); fprintf(fp, "\tpassive_checks_enabled\t%d\n", temp_host->accept_passive_checks); fprintf(fp, "\tobsess\t%d\n", temp_host->obsess); fprintf(fp, "\tevent_handler_enabled\t%d\n", temp_host->event_handler_enabled); fprintf(fp, "\tlow_flap_threshold\t%f\n", temp_host->low_flap_threshold); fprintf(fp, "\thigh_flap_threshold\t%f\n", temp_host->high_flap_threshold); fprintf(fp, "\tflap_detection_enabled\t%d\n", temp_host->flap_detection_enabled); fprintf(fp, "\tflap_detection_options\t%s\n", opts2str(temp_host->flap_detection_options, host_flag_map, 'u')); fprintf(fp, "\tfreshness_threshold\t%d\n", temp_host->freshness_threshold); fprintf(fp, "\tcheck_freshness\t%d\n", temp_host->check_freshness); fprintf(fp, "\tnotification_options\t%s\n", opts2str(temp_host->notification_options, host_flag_map, 'r')); fprintf(fp, "\tnotifications_enabled\t%d\n", temp_host->notifications_enabled); fprintf(fp, "\tnotification_interval\t%f\n", temp_host->notification_interval); fprintf(fp, "\tfirst_notification_delay\t%f\n", temp_host->first_notification_delay); fprintf(fp, "\tstalking_options\t%s\n", opts2str(temp_host->stalking_options, host_flag_map, 'u')); fprintf(fp, "\tprocess_perf_data\t%d\n", temp_host->process_performance_data); if(temp_host->icon_image) fprintf(fp, "\ticon_image\t%s\n", temp_host->icon_image); if(temp_host->icon_image_alt) fprintf(fp, "\ticon_image_alt\t%s\n", temp_host->icon_image_alt); if(temp_host->vrml_image) fprintf(fp, "\tvrml_image\t%s\n", temp_host->vrml_image); if(temp_host->statusmap_image) fprintf(fp, "\tstatusmap_image\t%s\n", temp_host->statusmap_image); if(temp_host->have_2d_coords == TRUE) fprintf(fp, "\t2d_coords\t%d,%d\n", temp_host->x_2d, temp_host->y_2d); if(temp_host->have_3d_coords == TRUE) fprintf(fp, "\t3d_coords\t%f,%f,%f\n", temp_host->x_3d, temp_host->y_3d, temp_host->z_3d); if(temp_host->notes) fprintf(fp, "\tnotes\t%s\n", temp_host->notes); if(temp_host->notes_url) fprintf(fp, "\tnotes_url\t%s\n", temp_host->notes_url); if(temp_host->action_url) fprintf(fp, "\taction_url\t%s\n", temp_host->action_url); fprintf(fp, "\tretain_status_information\t%d\n", temp_host->retain_status_information); fprintf(fp, "\tretain_nonstatus_information\t%d\n", temp_host->retain_nonstatus_information); /* custom variables */ fcache_customvars(fp, temp_host->custom_variables); fprintf(fp, "\t}\n\n"); } void fcache_service(FILE *fp, service *temp_service) { fprintf(fp, "define service {\n"); fprintf(fp, "\thost_name\t%s\n", temp_service->host_name); fprintf(fp, "\tservice_description\t%s\n", temp_service->description); if(temp_service->display_name != temp_service->description) fprintf(fp, "\tdisplay_name\t%s\n", temp_service->display_name); if(temp_service->parents) { fprintf(fp, "\tparents\t"); /* same-host, single-parent? */ if(!temp_service->parents->next && temp_service->parents->service_ptr->host_ptr == temp_service->host_ptr) fprintf(fp, "%s\n", temp_service->parents->service_ptr->description); else { servicesmember *sm; for(sm = temp_service->parents; sm; sm = sm->next) { fprintf(fp, "%s,%s%c", sm->host_name, sm->service_description, sm->next ? ',' : '\n'); } } } if(temp_service->check_period) fprintf(fp, "\tcheck_period\t%s\n", temp_service->check_period); if(temp_service->check_command) fprintf(fp, "\tcheck_command\t%s\n", temp_service->check_command); if(temp_service->event_handler) fprintf(fp, "\tevent_handler\t%s\n", temp_service->event_handler); fcache_contactlist(fp, "\tcontacts\t", temp_service->contacts); fcache_contactgrouplist(fp, "\tcontact_groups\t", temp_service->contact_groups); if(temp_service->notification_period) fprintf(fp, "\tnotification_period\t%s\n", temp_service->notification_period); fprintf(fp, "\tinitial_state\t"); if(temp_service->initial_state == STATE_WARNING) fprintf(fp, "w\n"); else if(temp_service->initial_state == STATE_UNKNOWN) fprintf(fp, "u\n"); else if(temp_service->initial_state == STATE_CRITICAL) fprintf(fp, "c\n"); else fprintf(fp, "o\n"); fprintf(fp, "\timportance\t%u\n", temp_service->hourly_value); fprintf(fp, "\tcheck_interval\t%f\n", temp_service->check_interval); fprintf(fp, "\tretry_interval\t%f\n", temp_service->retry_interval); fprintf(fp, "\tmax_check_attempts\t%d\n", temp_service->max_attempts); fprintf(fp, "\tis_volatile\t%d\n", temp_service->is_volatile); fprintf(fp, "\tparallelize_check\t%d\n", temp_service->parallelize); fprintf(fp, "\tactive_checks_enabled\t%d\n", temp_service->checks_enabled); fprintf(fp, "\tpassive_checks_enabled\t%d\n", temp_service->accept_passive_checks); fprintf(fp, "\tobsess\t%d\n", temp_service->obsess); fprintf(fp, "\tevent_handler_enabled\t%d\n", temp_service->event_handler_enabled); fprintf(fp, "\tlow_flap_threshold\t%f\n", temp_service->low_flap_threshold); fprintf(fp, "\thigh_flap_threshold\t%f\n", temp_service->high_flap_threshold); fprintf(fp, "\tflap_detection_enabled\t%d\n", temp_service->flap_detection_enabled); fprintf(fp, "\tflap_detection_options\t%s\n", opts2str(temp_service->flap_detection_options, service_flag_map, 'o')); fprintf(fp, "\tfreshness_threshold\t%d\n", temp_service->freshness_threshold); fprintf(fp, "\tcheck_freshness\t%d\n", temp_service->check_freshness); fprintf(fp, "\tnotification_options\t%s\n", opts2str(temp_service->notification_options, service_flag_map, 'r')); fprintf(fp, "\tnotifications_enabled\t%d\n", temp_service->notifications_enabled); fprintf(fp, "\tnotification_interval\t%f\n", temp_service->notification_interval); fprintf(fp, "\tfirst_notification_delay\t%f\n", temp_service->first_notification_delay); fprintf(fp, "\tstalking_options\t%s\n", opts2str(temp_service->stalking_options, service_flag_map, 'o')); fprintf(fp, "\tprocess_perf_data\t%d\n", temp_service->process_performance_data); if(temp_service->icon_image) fprintf(fp, "\ticon_image\t%s\n", temp_service->icon_image); if(temp_service->icon_image_alt) fprintf(fp, "\ticon_image_alt\t%s\n", temp_service->icon_image_alt); if(temp_service->notes) fprintf(fp, "\tnotes\t%s\n", temp_service->notes); if(temp_service->notes_url) fprintf(fp, "\tnotes_url\t%s\n", temp_service->notes_url); if(temp_service->action_url) fprintf(fp, "\taction_url\t%s\n", temp_service->action_url); fprintf(fp, "\tretain_status_information\t%d\n", temp_service->retain_status_information); fprintf(fp, "\tretain_nonstatus_information\t%d\n", temp_service->retain_nonstatus_information); /* custom variables */ fcache_customvars(fp, temp_service->custom_variables); fprintf(fp, "\t}\n\n"); } void fcache_servicedependency(FILE *fp, servicedependency *temp_servicedependency) { fprintf(fp, "define servicedependency {\n"); fprintf(fp, "\thost_name\t%s\n", temp_servicedependency->host_name); fprintf(fp, "\tservice_description\t%s\n", temp_servicedependency->service_description); fprintf(fp, "\tdependent_host_name\t%s\n", temp_servicedependency->dependent_host_name); fprintf(fp, "\tdependent_service_description\t%s\n", temp_servicedependency->dependent_service_description); if(temp_servicedependency->dependency_period) fprintf(fp, "\tdependency_period\t%s\n", temp_servicedependency->dependency_period); fprintf(fp, "\tinherits_parent\t%d\n", temp_servicedependency->inherits_parent); fprintf(fp, "\t%s_failure_options\t%s\n", temp_servicedependency->dependency_type == NOTIFICATION_DEPENDENCY ? "notification" : "execution", opts2str(temp_servicedependency->failure_options, service_flag_map, 'o')); fprintf(fp, "\t}\n\n"); } void fcache_serviceescalation(FILE *fp, serviceescalation *temp_serviceescalation) { fprintf(fp, "define serviceescalation {\n"); fprintf(fp, "\thost_name\t%s\n", temp_serviceescalation->host_name); fprintf(fp, "\tservice_description\t%s\n", temp_serviceescalation->description); fprintf(fp, "\tfirst_notification\t%d\n", temp_serviceescalation->first_notification); fprintf(fp, "\tlast_notification\t%d\n", temp_serviceescalation->last_notification); fprintf(fp, "\tnotification_interval\t%f\n", temp_serviceescalation->notification_interval); if(temp_serviceescalation->escalation_period) fprintf(fp, "\tescalation_period\t%s\n", temp_serviceescalation->escalation_period); fprintf(fp, "\tescalation_options\t%s\n", opts2str(temp_serviceescalation->escalation_options, service_flag_map, 'r')); if(temp_serviceescalation->contacts) { contactsmember *cl; fprintf(fp, "\tcontacts\t"); for(cl = temp_serviceescalation->contacts; cl; cl = cl->next) fprintf(fp, "%s%c", cl->contact_ptr->name, cl->next ? ',' : '\n'); } if(temp_serviceescalation->contact_groups) { contactgroupsmember *cgl; fprintf(fp, "\tcontact_groups\t"); for (cgl = temp_serviceescalation->contact_groups; cgl; cgl = cgl->next) fprintf(fp, "%s%c", cgl->group_name, cgl->next ? ',' : '\n'); } fprintf(fp, "\t}\n\n"); } void fcache_hostdependency(FILE *fp, hostdependency *temp_hostdependency) { fprintf(fp, "define hostdependency {\n"); fprintf(fp, "\thost_name\t%s\n", temp_hostdependency->host_name); fprintf(fp, "\tdependent_host_name\t%s\n", temp_hostdependency->dependent_host_name); if(temp_hostdependency->dependency_period) fprintf(fp, "\tdependency_period\t%s\n", temp_hostdependency->dependency_period); fprintf(fp, "\tinherits_parent\t%d\n", temp_hostdependency->inherits_parent); fprintf(fp, "\t%s_failure_options\t%s\n", temp_hostdependency->dependency_type == NOTIFICATION_DEPENDENCY ? "notification" : "execution", opts2str(temp_hostdependency->failure_options, host_flag_map, 'o')); fprintf(fp, "\t}\n\n"); } void fcache_hostescalation(FILE *fp, hostescalation *temp_hostescalation) { fprintf(fp, "define hostescalation {\n"); fprintf(fp, "\thost_name\t%s\n", temp_hostescalation->host_name); fprintf(fp, "\tfirst_notification\t%d\n", temp_hostescalation->first_notification); fprintf(fp, "\tlast_notification\t%d\n", temp_hostescalation->last_notification); fprintf(fp, "\tnotification_interval\t%f\n", temp_hostescalation->notification_interval); if(temp_hostescalation->escalation_period) fprintf(fp, "\tescalation_period\t%s\n", temp_hostescalation->escalation_period); fprintf(fp, "\tescalation_options\t%s\n", opts2str(temp_hostescalation->escalation_options, host_flag_map, 'r')); fcache_contactlist(fp, "\tcontacts\t", temp_hostescalation->contacts); fcache_contactgrouplist(fp, "\tcontact_groups\t", temp_hostescalation->contact_groups); fprintf(fp, "\t}\n\n"); } /* writes cached object definitions for use by web interface */ int fcache_objects(char *cache_file) { FILE *fp = NULL; time_t current_time = 0L; unsigned int i; /* some people won't want to cache their objects */ if(!cache_file || !strcmp(cache_file, "/dev/null")) return OK; time(¤t_time); /* open the cache file for writing */ fp = fopen(cache_file, "w"); if(fp == NULL) { logit(NSLOG_CONFIG_WARNING, TRUE, "Warning: Could not open object cache file '%s' for writing!\n", cache_file); return ERROR; } /* write header to cache file */ fprintf(fp, "########################################\n"); fprintf(fp, "# NAGIOS OBJECT CACHE FILE\n"); fprintf(fp, "#\n"); fprintf(fp, "# THIS FILE IS AUTOMATICALLY GENERATED\n"); fprintf(fp, "# BY NAGIOS. DO NOT MODIFY THIS FILE!\n"); fprintf(fp, "#\n"); fprintf(fp, "# Created: %s", ctime(¤t_time)); fprintf(fp, "########################################\n\n"); /* cache timeperiods */ for(i = 0; i < num_objects.timeperiods; i++) fcache_timeperiod(fp, timeperiod_ary[i]); /* cache commands */ for(i = 0; i < num_objects.commands; i++) fcache_command(fp, command_ary[i]); /* cache contactgroups */ for(i = 0; i < num_objects.contactgroups; i++) fcache_contactgroup(fp, contactgroup_ary[i]); /* cache hostgroups */ for(i = 0; i < num_objects.hostgroups; i++) fcache_hostgroup(fp, hostgroup_ary[i]); /* cache servicegroups */ for(i = 0; i < num_objects.servicegroups; i++) fcache_servicegroup(fp, servicegroup_ary[i]); /* cache contacts */ for(i = 0; i < num_objects.contacts; i++) fcache_contact(fp, contact_ary[i]); /* cache hosts */ for(i = 0; i < num_objects.hosts; i++) fcache_host(fp, host_ary[i]); /* cache services */ for(i = 0; i < num_objects.services; i++) fcache_service(fp, service_ary[i]); /* cache service dependencies */ for(i = 0; i < num_objects.servicedependencies; i++) fcache_servicedependency(fp, servicedependency_ary[i]); /* cache service escalations */ for(i = 0; i < num_objects.serviceescalations; i++) fcache_serviceescalation(fp, serviceescalation_ary[i]); /* cache host dependencies */ for(i = 0; i < num_objects.hostdependencies; i++) fcache_hostdependency(fp, hostdependency_ary[i]); /* cache host escalations */ for(i = 0; i < num_objects.hostescalations; i++) fcache_hostescalation(fp, hostescalation_ary[i]); fclose(fp); return OK; } #endif nagios-4.3.4/common/shared.c000066400000000000000000000341661314764422400157250ustar00rootroot00000000000000#include "../include/config.h" #include "../include/common.h" #include "../include/locations.h" #include "../include/defaults.h" /* * This file holds random utility functions shared by cgi's and * core, as well as all global variables needed by both. */ int date_format; int interval_length; char *illegal_output_chars; char illegal_output_char_map[] = CHAR_MAP_INIT(0); time_t program_start = 0L; int check_external_commands; int log_rotation_method; char *object_cache_file; struct object_count num_objects; int process_performance_data; char *status_file; int nagios_pid = 0; int daemon_mode = FALSE; time_t last_log_rotation = 0L; int check_external_commands; int enable_timing_point = FALSE; /* cgi's never set this to TRUE */ int enable_flap_detection; int enable_notifications; int execute_service_checks; int accept_passive_service_checks; int execute_host_checks; int accept_passive_host_checks; int enable_event_handlers; int obsess_over_services; int obsess_over_hosts; char *config_file_dir = NULL; void init_shared_cfg_vars(int first_time) { date_format = DATE_FORMAT_US; interval_length = DEFAULT_INTERVAL_LENGTH; if(first_time) { /* Not sure why these are not reset in reset_variables() */ illegal_output_chars = NULL; } program_start = 0L; log_rotation_method = LOG_ROTATION_NONE; object_cache_file = strdup(DEFAULT_OBJECT_CACHE_FILE); process_performance_data = DEFAULT_PROCESS_PERFORMANCE_DATA; status_file = NULL; check_external_commands = DEFAULT_CHECK_EXTERNAL_COMMANDS; enable_flap_detection = DEFAULT_ENABLE_FLAP_DETECTION; enable_notifications = TRUE; execute_service_checks = TRUE; accept_passive_service_checks = TRUE; execute_host_checks = TRUE; accept_passive_host_checks = TRUE; enable_event_handlers = TRUE; obsess_over_services = FALSE; obsess_over_hosts = FALSE; return; } /* silly debug-ish helper used to track down hotspots in config parsing */ void timing_point(const char *fmt, ...) { static struct timeval last = {0, 0}, first = {0, 0}; struct timeval now; va_list ap; if(!enable_timing_point) return; if(first.tv_sec == 0) { gettimeofday(&first, NULL); last.tv_sec = first.tv_sec; last.tv_usec = first.tv_usec; printf("[0.0000 (+0.0000)] "); } else { gettimeofday(&now, NULL); printf("[%.4f (+%.4f)] ", tv_delta_f(&first, &now), tv_delta_f(&last, &now)); last.tv_sec = now.tv_sec; last.tv_usec = now.tv_usec; } va_start(ap, fmt); vprintf(fmt, ap); va_end(ap); } /* fix the problem with strtok() skipping empty options between tokens */ char *my_strtok(char *buffer, const char *tokens) { char *token_position = NULL; char *sequence_head = NULL; static char *my_strtok_buffer = NULL; static char *original_my_strtok_buffer = NULL; if(buffer != NULL) { my_free(original_my_strtok_buffer); if((my_strtok_buffer = (char *)strdup(buffer)) == NULL) return NULL; original_my_strtok_buffer = my_strtok_buffer; } sequence_head = my_strtok_buffer; if(sequence_head[0] == '\x0') return NULL; token_position = strchr(my_strtok_buffer, tokens[0]); if(token_position == NULL) { my_strtok_buffer = strchr(my_strtok_buffer, '\x0'); return sequence_head; } token_position[0] = '\x0'; my_strtok_buffer = token_position + 1; return sequence_head; } /* fixes compiler problems under Solaris, since strsep() isn't included */ /* this code is taken from the glibc source */ char *my_strsep(char **stringp, const char *delim) { char *begin, *end; begin = *stringp; if(begin == NULL) return NULL; /* A frequent case is when the delimiter string contains only one * character. Here we don't need to call the expensive `strpbrk' * function and instead work using `strchr'. */ if(delim[0] == '\0' || delim[1] == '\0') { char ch = delim[0]; if(ch == '\0' || begin[0] == '\0') end = NULL; else { if(*begin == ch) end = begin; else end = strchr(begin + 1, ch); } } else { /* find the end of the token. */ end = strpbrk(begin, delim); } if(end) { /* terminate the token and set *STRINGP past NUL character. */ *end++ = '\0'; *stringp = end; } else /* no more delimiters; this is the last token. */ *stringp = NULL; return begin; } /* open a file read-only via mmap() */ mmapfile *mmap_fopen(const char *filename) { mmapfile *new_mmapfile = NULL; int fd = 0; void *mmap_buf = NULL; struct stat statbuf; int mode = O_RDONLY; unsigned long file_size = 0L; if(filename == NULL) return NULL; /* allocate memory */ if((new_mmapfile = (mmapfile *) malloc(sizeof(mmapfile))) == NULL) return NULL; /* open the file */ if((fd = open(filename, mode)) == -1) { my_free(new_mmapfile); return NULL; } /* get file info */ if((fstat(fd, &statbuf)) == -1) { close(fd); my_free(new_mmapfile); return NULL; } /* get file size */ file_size = (unsigned long)statbuf.st_size; /* only mmap() if we have a file greater than 0 bytes */ if(file_size > 0) { /* mmap() the file - allocate one extra byte for processing zero-byte files */ if((mmap_buf = (void *)mmap(0, file_size, PROT_READ, MAP_PRIVATE, fd, 0)) == MAP_FAILED) { close(fd); my_free(new_mmapfile); return NULL; } } else mmap_buf = NULL; /* populate struct info for later use */ new_mmapfile->path = (char *)strdup(filename); new_mmapfile->fd = fd; new_mmapfile->file_size = (unsigned long)file_size; new_mmapfile->current_position = 0L; new_mmapfile->current_line = 0L; new_mmapfile->mmap_buf = mmap_buf; return new_mmapfile; } /* close a file originally opened via mmap() */ int mmap_fclose(mmapfile * temp_mmapfile) { if(temp_mmapfile == NULL) return ERROR; /* un-mmap() the file */ if(temp_mmapfile->file_size > 0L) munmap(temp_mmapfile->mmap_buf, temp_mmapfile->file_size); /* close the file */ close(temp_mmapfile->fd); /* free memory */ my_free(temp_mmapfile->path); my_free(temp_mmapfile); return OK; } /* gets one line of input from an mmap()'ed file */ char *mmap_fgets(mmapfile * temp_mmapfile) { char *buf = NULL; unsigned long x = 0L; int len = 0; if(temp_mmapfile == NULL) return NULL; /* size of file is 0 bytes */ if(temp_mmapfile->file_size == 0L) return NULL; /* we've reached the end of the file */ if(temp_mmapfile->current_position >= temp_mmapfile->file_size) return NULL; /* find the end of the string (or buffer) */ for(x = temp_mmapfile->current_position; x < temp_mmapfile->file_size; x++) { if(*((char *)(temp_mmapfile->mmap_buf) + x) == '\n') { x++; break; } } /* calculate length of line we just read */ len = (int)(x - temp_mmapfile->current_position); /* allocate memory for the new line */ if((buf = (char *)malloc(len + 1)) == NULL) return NULL; /* copy string to newly allocated memory and terminate the string */ memcpy(buf, ((char *)(temp_mmapfile->mmap_buf) + temp_mmapfile->current_position), len); buf[len] = '\x0'; /* update the current position */ temp_mmapfile->current_position = x; /* increment the current line */ temp_mmapfile->current_line++; return buf; } /* gets one line of input from an mmap()'ed file (may be contained on more than one line in the source file) */ char *mmap_fgets_multiline(mmapfile * temp_mmapfile) { char *buf = NULL; char *tempbuf = NULL; char *stripped = NULL; int len = 0; int len2 = 0; int end = 0; if(temp_mmapfile == NULL) return NULL; while(1) { my_free(tempbuf); if((tempbuf = mmap_fgets(temp_mmapfile)) == NULL) break; if(buf == NULL) { len = strlen(tempbuf); if((buf = (char *)malloc(len + 1)) == NULL) break; memcpy(buf, tempbuf, len); buf[len] = '\x0'; } else { /* strip leading white space from continuation lines */ stripped = tempbuf; while(*stripped == ' ' || *stripped == '\t') stripped++; len = strlen(stripped); len2 = strlen(buf); if((buf = (char *)realloc(buf, len + len2 + 1)) == NULL) break; strcat(buf, stripped); len += len2; buf[len] = '\x0'; } if(len == 0) break; /* handle Windows/DOS CR/LF */ if(len >= 2 && buf[len - 2] == '\r') end = len - 3; /* normal Unix LF */ else if(len >= 1 && buf[len - 1] == '\n') end = len - 2; else end = len - 1; /* two backslashes found. unescape first backslash first and break */ if(end >= 1 && buf[end - 1] == '\\' && buf[end] == '\\') { buf[end] = '\n'; buf[end + 1] = '\x0'; break; } /* one backslash found. continue reading the next line */ else if(end > 0 && buf[end] == '\\') buf[end] = '\x0'; /* no continuation marker was found, so break */ else break; } my_free(tempbuf); return buf; } /* strip newline, carriage return, and tab characters from beginning and end of a string */ void strip(char *buffer) { register int x, z; int len; if(buffer == NULL || buffer[0] == '\x0') return; /* strip end of string */ len = (int)strlen(buffer); for(x = len - 1; x >= 0; x--) { switch(buffer[x]) { case ' ': case '\n': case '\r': case '\t': buffer[x] = '\x0'; continue; } break; } /* if we stripped all of it, just return */ if(!x) return; /* save last position for later... */ z = x; /* strip beginning of string (by shifting) */ /* NOTE: this is very expensive to do, so avoid it whenever possible */ for(x = 0;; x++) { switch(buffer[x]) { case ' ': case '\n': case '\r': case '\t': continue; } break; } if(x > 0 && z > 0) { /* new length of the string after we stripped the end */ len = z + 1; /* shift chars towards beginning of string to remove leading whitespace */ for(z = x; z < len; z++) buffer[z - x] = buffer[z]; buffer[len - x] = '\x0'; } } /************************************************** *************** HASH FUNCTIONS ******************* **************************************************/ /* dual hash function */ int hashfunc(const char *name1, const char *name2, int hashslots) { unsigned int i, result; result = 0; if(name1) for(i = 0; i < strlen(name1); i++) result += name1[i]; if(name2) for(i = 0; i < strlen(name2); i++) result += name2[i]; result = result % hashslots; return result; } /* dual hash data comparison */ int compare_hashdata(const char *val1a, const char *val1b, const char *val2a, const char *val2b) { int result = 0; /* NOTE: If hash calculation changes, update the compare_strings() function! */ /* check first name */ if(val1a == NULL && val2a == NULL) result = 0; else if(val1a == NULL) result = 1; else if(val2a == NULL) result = -1; else result = strcmp(val1a, val2a); /* check second name if necessary */ if(result == 0) { if(val1b == NULL && val2b == NULL) result = 0; else if(val1b == NULL) result = 1; else if(val2b == NULL) result = -1; else result = strcmp(val1b, val2b); } return result; } /* * given a date/time in time_t format, produce a corresponding * date/time string, including timezone */ void get_datetime_string(time_t * raw_time, char *buffer, int buffer_length, int type) { time_t t; struct tm *tm_ptr, tm_s; int hour; int minute; int second; int month; int day; int year; const char *weekdays[7] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; const char *months[12] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; const char *tzone = ""; if(raw_time == NULL) time(&t); else t = *raw_time; if(type == HTTP_DATE_TIME) tm_ptr = gmtime_r(&t, &tm_s); else tm_ptr = localtime_r(&t, &tm_s); hour = tm_ptr->tm_hour; minute = tm_ptr->tm_min; second = tm_ptr->tm_sec; month = tm_ptr->tm_mon + 1; day = tm_ptr->tm_mday; year = tm_ptr->tm_year + 1900; #ifdef HAVE_TM_ZONE tzone = tm_ptr->tm_zone; #else tzone = (tm_ptr->tm_isdst) ? tzname[1] : tzname[0]; #endif /* ctime() style date/time */ if(type == LONG_DATE_TIME) snprintf(buffer, buffer_length, "%s %s %d %02d:%02d:%02d %s %d", weekdays[tm_ptr->tm_wday], months[tm_ptr->tm_mon], day, hour, minute, second, tzone, year); /* short date/time */ else if(type == SHORT_DATE_TIME) { if(date_format == DATE_FORMAT_EURO) snprintf(buffer, buffer_length, "%02d-%02d-%04d %02d:%02d:%02d", day, month, year, hour, minute, second); else if(date_format == DATE_FORMAT_ISO8601 || date_format == DATE_FORMAT_STRICT_ISO8601) snprintf(buffer, buffer_length, "%04d-%02d-%02d%c%02d:%02d:%02d", year, month, day, (date_format == DATE_FORMAT_STRICT_ISO8601) ? 'T' : ' ', hour, minute, second); else snprintf(buffer, buffer_length, "%02d-%02d-%04d %02d:%02d:%02d", month, day, year, hour, minute, second); } /* short date */ else if(type == SHORT_DATE) { if(date_format == DATE_FORMAT_EURO) snprintf(buffer, buffer_length, "%02d-%02d-%04d", day, month, year); else if(date_format == DATE_FORMAT_ISO8601 || date_format == DATE_FORMAT_STRICT_ISO8601) snprintf(buffer, buffer_length, "%04d-%02d-%02d", year, month, day); else snprintf(buffer, buffer_length, "%02d-%02d-%04d", month, day, year); } /* expiration date/time for HTTP headers */ else if(type == HTTP_DATE_TIME) snprintf(buffer, buffer_length, "%s, %02d %s %d %02d:%02d:%02d GMT", weekdays[tm_ptr->tm_wday], day, months[tm_ptr->tm_mon], year, hour, minute, second); /* short time */ else snprintf(buffer, buffer_length, "%02d:%02d:%02d", hour, minute, second); buffer[buffer_length - 1] = '\x0'; } /* get days, hours, minutes, and seconds from a raw time_t format or total seconds */ void get_time_breakdown(unsigned long raw_time, int *days, int *hours, int *minutes, int *seconds) { unsigned long temp_time; int temp_days; int temp_hours; int temp_minutes; int temp_seconds; temp_time = raw_time; temp_days = temp_time / 86400; temp_time -= (temp_days * 86400); temp_hours = temp_time / 3600; temp_time -= (temp_hours * 3600); temp_minutes = temp_time / 60; temp_time -= (temp_minutes * 60); temp_seconds = (int)temp_time; *days = temp_days; *hours = temp_hours; *minutes = temp_minutes; *seconds = temp_seconds; } nagios-4.3.4/common/statusdata.c000066400000000000000000000361111314764422400166240ustar00rootroot00000000000000/***************************************************************************** * * STATUSDATA.C - External status data for Nagios CGIs * * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ /*********** COMMON HEADER FILES ***********/ #include "../include/config.h" #include "../include/common.h" #include "../include/objects.h" #include "../include/statusdata.h" #include "../xdata/xsddefault.h" /* default routines */ #ifdef NSCGI #include "../include/cgiutils.h" #else #include "../include/nagios.h" #include "../include/broker.h" #endif #ifdef NSCGI hoststatus *hoststatus_list = NULL; hoststatus *hoststatus_list_tail = NULL; servicestatus *servicestatus_list = NULL; servicestatus *servicestatus_list_tail = NULL; hoststatus **hoststatus_hashlist = NULL; servicestatus **servicestatus_hashlist = NULL; extern int use_pending_states; #endif #ifdef NSCORE /******************************************************************/ /****************** TOP-LEVEL OUTPUT FUNCTIONS ********************/ /******************************************************************/ /* initializes status data at program start */ int initialize_status_data(const char *cfgfile) { return xsddefault_initialize_status_data(cfgfile); } /* update all status data (aggregated dump) */ int update_all_status_data(void) { int result = OK; #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_aggregated_status_data(NEBTYPE_AGGREGATEDSTATUS_STARTDUMP, NEBFLAG_NONE, NEBATTR_NONE, NULL); #endif result = xsddefault_save_status_data(); #ifdef USE_EVENT_BROKER /* send data to event broker */ broker_aggregated_status_data(NEBTYPE_AGGREGATEDSTATUS_ENDDUMP, NEBFLAG_NONE, NEBATTR_NONE, NULL); #endif return result; } /* cleans up status data before program termination */ int cleanup_status_data(int delete_status_data) { return xsddefault_cleanup_status_data(delete_status_data); } /* updates program status info */ int update_program_status(int aggregated_dump) { #ifdef USE_EVENT_BROKER /* send data to event broker (non-aggregated dumps only) */ if(aggregated_dump == FALSE) broker_program_status(NEBTYPE_PROGRAMSTATUS_UPDATE, NEBFLAG_NONE, NEBATTR_NONE, NULL); #endif return OK; } /* updates host status info */ int update_host_status(host *hst, int aggregated_dump) { #ifdef USE_EVENT_BROKER /* send data to event broker (non-aggregated dumps only) */ if(aggregated_dump == FALSE) broker_host_status(NEBTYPE_HOSTSTATUS_UPDATE, NEBFLAG_NONE, NEBATTR_NONE, hst, NULL); #endif return OK; } /* updates service status info */ int update_service_status(service *svc, int aggregated_dump) { #ifdef USE_EVENT_BROKER /* send data to event broker (non-aggregated dumps only) */ if(aggregated_dump == FALSE) broker_service_status(NEBTYPE_SERVICESTATUS_UPDATE, NEBFLAG_NONE, NEBATTR_NONE, svc, NULL); #endif return OK; } /* updates contact status info */ int update_contact_status(contact *cntct, int aggregated_dump) { #ifdef USE_EVENT_BROKER /* send data to event broker (non-aggregated dumps only) */ if(aggregated_dump == FALSE) broker_contact_status(NEBTYPE_CONTACTSTATUS_UPDATE, NEBFLAG_NONE, NEBATTR_NONE, cntct, NULL); #endif return OK; } #endif #ifdef NSCGI /******************************************************************/ /******************* TOP-LEVEL INPUT FUNCTIONS ********************/ /******************************************************************/ /* reads in all status data */ int read_status_data(const char *status_file_name, int options) { return xsddefault_read_status_data(status_file_name, options); } /******************************************************************/ /****************** CHAINED HASH FUNCTIONS ************************/ /******************************************************************/ /* adds hoststatus to hash list in memory */ int add_hoststatus_to_hashlist(hoststatus *new_hoststatus) { hoststatus *temp_hoststatus = NULL; hoststatus *lastpointer = NULL; int hashslot = 0; int i = 0; /* initialize hash list */ if(hoststatus_hashlist == NULL) { hoststatus_hashlist = (hoststatus **)malloc(sizeof(hoststatus *) * HOSTSTATUS_HASHSLOTS); if(hoststatus_hashlist == NULL) return 0; for(i = 0; i < HOSTSTATUS_HASHSLOTS; i++) hoststatus_hashlist[i] = NULL; } if(!new_hoststatus) return 0; hashslot = hashfunc(new_hoststatus->host_name, NULL, HOSTSTATUS_HASHSLOTS); lastpointer = NULL; for(temp_hoststatus = hoststatus_hashlist[hashslot]; temp_hoststatus && compare_hashdata(temp_hoststatus->host_name, NULL, new_hoststatus->host_name, NULL) < 0; temp_hoststatus = temp_hoststatus->nexthash) lastpointer = temp_hoststatus; if(!temp_hoststatus || (compare_hashdata(temp_hoststatus->host_name, NULL, new_hoststatus->host_name, NULL) != 0)) { if(lastpointer) lastpointer->nexthash = new_hoststatus; else hoststatus_hashlist[hashslot] = new_hoststatus; new_hoststatus->nexthash = temp_hoststatus; return 1; } /* else already exists */ return 0; } int add_servicestatus_to_hashlist(servicestatus *new_servicestatus) { servicestatus *temp_servicestatus = NULL, *lastpointer = NULL; int hashslot = 0; int i = 0; /* initialize hash list */ if(servicestatus_hashlist == NULL) { servicestatus_hashlist = (servicestatus **)malloc(sizeof(servicestatus *) * SERVICESTATUS_HASHSLOTS); if(servicestatus_hashlist == NULL) return 0; for(i = 0; i < SERVICESTATUS_HASHSLOTS; i++) servicestatus_hashlist[i] = NULL; } if(!new_servicestatus) return 0; hashslot = hashfunc(new_servicestatus->host_name, new_servicestatus->description, SERVICESTATUS_HASHSLOTS); lastpointer = NULL; for(temp_servicestatus = servicestatus_hashlist[hashslot]; temp_servicestatus && compare_hashdata(temp_servicestatus->host_name, temp_servicestatus->description, new_servicestatus->host_name, new_servicestatus->description) < 0; temp_servicestatus = temp_servicestatus->nexthash) lastpointer = temp_servicestatus; if(!temp_servicestatus || (compare_hashdata(temp_servicestatus->host_name, temp_servicestatus->description, new_servicestatus->host_name, new_servicestatus->description) != 0)) { if(lastpointer) lastpointer->nexthash = new_servicestatus; else servicestatus_hashlist[hashslot] = new_servicestatus; new_servicestatus->nexthash = temp_servicestatus; return 1; } /* else already exists */ return 0; } /******************************************************************/ /********************** ADDITION FUNCTIONS ************************/ /******************************************************************/ /* adds a host status entry to the list in memory */ int add_host_status(hoststatus *new_hoststatus) { char date_string[MAX_DATETIME_LENGTH]; /* make sure we have what we need */ if(new_hoststatus == NULL) return ERROR; if(new_hoststatus->host_name == NULL) return ERROR; /* massage host status a bit */ if(new_hoststatus != NULL) { switch(new_hoststatus->status) { case 0: new_hoststatus->status = SD_HOST_UP; break; case 1: new_hoststatus->status = SD_HOST_DOWN; break; case 2: new_hoststatus->status = SD_HOST_UNREACHABLE; break; default: new_hoststatus->status = SD_HOST_UP; break; } if(new_hoststatus->has_been_checked == FALSE) { if(use_pending_states == TRUE) new_hoststatus->status = HOST_PENDING; my_free(new_hoststatus->plugin_output); if(new_hoststatus->should_be_scheduled == TRUE) { get_time_string(&new_hoststatus->next_check, date_string, sizeof(date_string), LONG_DATE_TIME); asprintf(&new_hoststatus->plugin_output, "Host check scheduled for %s", date_string); } else { /* passive-only hosts that have just been scheduled for a forced check */ if(new_hoststatus->checks_enabled == FALSE && new_hoststatus->next_check != (time_t)0L && (new_hoststatus->check_options & CHECK_OPTION_FORCE_EXECUTION)) { get_time_string(&new_hoststatus->next_check, date_string, sizeof(date_string), LONG_DATE_TIME); asprintf(&new_hoststatus->plugin_output, "Forced host check scheduled for %s", date_string); } /* passive-only hosts not scheduled to be checked */ else new_hoststatus->plugin_output = (char *)strdup("Host is not scheduled to be checked..."); } } } new_hoststatus->next = NULL; new_hoststatus->nexthash = NULL; /* add new hoststatus to hoststatus chained hash list */ if(!add_hoststatus_to_hashlist(new_hoststatus)) return ERROR; /* object cache file is already sorted, so just add new items to end of list */ if(hoststatus_list == NULL) { hoststatus_list = new_hoststatus; hoststatus_list_tail = new_hoststatus; } else { hoststatus_list_tail->next = new_hoststatus; hoststatus_list_tail = new_hoststatus; } return OK; } /* adds a service status entry to the list in memory */ int add_service_status(servicestatus *new_svcstatus) { char date_string[MAX_DATETIME_LENGTH]; /* make sure we have what we need */ if(new_svcstatus == NULL) return ERROR; if(new_svcstatus->host_name == NULL || new_svcstatus->description == NULL) return ERROR; /* massage service status a bit */ if(new_svcstatus != NULL) { switch(new_svcstatus->status) { case 0: new_svcstatus->status = SERVICE_OK; break; case 1: new_svcstatus->status = SERVICE_WARNING; break; case 2: new_svcstatus->status = SERVICE_CRITICAL; break; case 3: new_svcstatus->status = SERVICE_UNKNOWN; break; default: new_svcstatus->status = SERVICE_OK; break; } if(new_svcstatus->has_been_checked == FALSE) { if(use_pending_states == TRUE) new_svcstatus->status = SERVICE_PENDING; my_free(new_svcstatus->plugin_output); if(new_svcstatus->should_be_scheduled == TRUE) { get_time_string(&new_svcstatus->next_check, date_string, sizeof(date_string), LONG_DATE_TIME); asprintf(&new_svcstatus->plugin_output, "Service check scheduled for %s", date_string); } else { /* passive-only services that have just been scheduled for a forced check */ if(new_svcstatus->checks_enabled == FALSE && new_svcstatus->next_check != (time_t)0L && (new_svcstatus->check_options & CHECK_OPTION_FORCE_EXECUTION)) { get_time_string(&new_svcstatus->next_check, date_string, sizeof(date_string), LONG_DATE_TIME); asprintf(&new_svcstatus->plugin_output, "Forced service check scheduled for %s", date_string); } /* passive-only services not scheduled to be checked */ else new_svcstatus->plugin_output = (char *)strdup("Service is not scheduled to be checked..."); } } } new_svcstatus->next = NULL; new_svcstatus->nexthash = NULL; /* add new servicestatus to servicestatus chained hash list */ if(!add_servicestatus_to_hashlist(new_svcstatus)) return ERROR; /* object cache file is already sorted, so just add new items to end of list */ if(servicestatus_list == NULL) { servicestatus_list = new_svcstatus; servicestatus_list_tail = new_svcstatus; } else { servicestatus_list_tail->next = new_svcstatus; servicestatus_list_tail = new_svcstatus; } return OK; } /******************************************************************/ /*********************** CLEANUP FUNCTIONS ************************/ /******************************************************************/ /* free all memory for status data */ void free_status_data(void) { hoststatus *this_hoststatus = NULL; hoststatus *next_hoststatus = NULL; servicestatus *this_svcstatus = NULL; servicestatus *next_svcstatus = NULL; /* free memory for the host status list */ for(this_hoststatus = hoststatus_list; this_hoststatus != NULL; this_hoststatus = next_hoststatus) { next_hoststatus = this_hoststatus->next; my_free(this_hoststatus->host_name); my_free(this_hoststatus->plugin_output); my_free(this_hoststatus->long_plugin_output); my_free(this_hoststatus->perf_data); my_free(this_hoststatus); } /* free memory for the service status list */ for(this_svcstatus = servicestatus_list; this_svcstatus != NULL; this_svcstatus = next_svcstatus) { next_svcstatus = this_svcstatus->next; my_free(this_svcstatus->host_name); my_free(this_svcstatus->description); my_free(this_svcstatus->plugin_output); my_free(this_svcstatus->long_plugin_output); my_free(this_svcstatus->perf_data); my_free(this_svcstatus); } /* free hash lists reset list pointers */ my_free(hoststatus_hashlist); my_free(servicestatus_hashlist); hoststatus_list = NULL; servicestatus_list = NULL; return; } /******************************************************************/ /************************ SEARCH FUNCTIONS ************************/ /******************************************************************/ /* find a host status entry */ hoststatus *find_hoststatus(char *host_name) { hoststatus *temp_hoststatus = NULL; if(host_name == NULL || hoststatus_hashlist == NULL) return NULL; for(temp_hoststatus = hoststatus_hashlist[hashfunc(host_name, NULL, HOSTSTATUS_HASHSLOTS)]; temp_hoststatus && compare_hashdata(temp_hoststatus->host_name, NULL, host_name, NULL) < 0; temp_hoststatus = temp_hoststatus->nexthash); if(temp_hoststatus && (compare_hashdata(temp_hoststatus->host_name, NULL, host_name, NULL) == 0)) return temp_hoststatus; return NULL; } /* find a service status entry */ servicestatus *find_servicestatus(char *host_name, char *svc_desc) { servicestatus *temp_servicestatus = NULL; if(host_name == NULL || svc_desc == NULL || servicestatus_hashlist == NULL) return NULL; for(temp_servicestatus = servicestatus_hashlist[hashfunc(host_name, svc_desc, SERVICESTATUS_HASHSLOTS)]; temp_servicestatus && compare_hashdata(temp_servicestatus->host_name, temp_servicestatus->description, host_name, svc_desc) < 0; temp_servicestatus = temp_servicestatus->nexthash); if(temp_servicestatus && (compare_hashdata(temp_servicestatus->host_name, temp_servicestatus->description, host_name, svc_desc) == 0)) return temp_servicestatus; return NULL; } /******************************************************************/ /*********************** UTILITY FUNCTIONS ************************/ /******************************************************************/ /* gets the total number of services of a certain state for a specific host */ int get_servicestatus_count(char *host_name, int type) { servicestatus *temp_status = NULL; int count = 0; if(host_name == NULL) return 0; for(temp_status = servicestatus_list; temp_status != NULL; temp_status = temp_status->next) { if(temp_status->status & type) { if(!strcmp(host_name, temp_status->host_name)) count++; } } return count; } #endif nagios-4.3.4/config.guess000077500000000000000000001253651314764422400153450ustar00rootroot00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright 1992-2016 Free Software Foundation, Inc. timestamp='2016-05-15' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # # Originally written by Per Bothner; maintained since 2000 by Ben Elliston. # # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess # # Please send patches to . me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright 1992-2016 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown case "${UNAME_SYSTEM}" in Linux|GNU|GNU/*) # If the system lacks a compiler, then just pick glibc. # We could probably try harder. LIBC=gnu eval $set_cc_for_build cat <<-EOF > $dummy.c #include #if defined(__UCLIBC__) LIBC=uclibc #elif defined(__dietlibc__) LIBC=dietlibc #else LIBC=gnu #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` ;; esac # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ /sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || \ echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; earmv*) arch=`echo ${UNAME_MACHINE_ARCH} | sed -e 's,^e\(armv[0-9]\).*$,\1,'` endian=`echo ${UNAME_MACHINE_ARCH} | sed -ne 's,^.*\(eb\)$,\1,p'` machine=${arch}${endian}-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently (or will in the future) and ABI. case "${UNAME_MACHINE_ARCH}" in earm*) os=netbsdelf ;; arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # Determine ABI tags. case "${UNAME_MACHINE_ARCH}" in earm*) expr='s/^earmv[0-9]/-eabi/;s/eb$//' abi=`echo ${UNAME_MACHINE_ARCH} | sed -e "$expr"` ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE} | sed -e 's/[-_].*//' | cut -d. -f1,2` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}${abi}" exit ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:LibertyBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` echo ${UNAME_MACHINE_ARCH}-unknown-libertybsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; *:Sortix:*:*) echo ${UNAME_MACHINE}-unknown-sortix exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE=alpha ;; "EV4.5 (21064)") UNAME_MACHINE=alpha ;; "LCA4 (21066/21068)") UNAME_MACHINE=alpha ;; "EV5 (21164)") UNAME_MACHINE=alphaev5 ;; "EV5.6 (21164A)") UNAME_MACHINE=alphaev56 ;; "EV5.6 (21164PC)") UNAME_MACHINE=alphapca56 ;; "EV5.7 (21164PC)") UNAME_MACHINE=alphapca57 ;; "EV6 (21264)") UNAME_MACHINE=alphaev6 ;; "EV6.7 (21264A)") UNAME_MACHINE=alphaev67 ;; "EV6.8CB (21264C)") UNAME_MACHINE=alphaev68 ;; "EV6.8AL (21264B)") UNAME_MACHINE=alphaev68 ;; "EV6.8CX (21264D)") UNAME_MACHINE=alphaev68 ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE=alphaev69 ;; "EV7 (21364)") UNAME_MACHINE=alphaev7 ;; "EV7.9 (21364A)") UNAME_MACHINE=alphaev79 ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm*:riscos:*:*|arm*:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux${UNAME_RELEASE} exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build SUN_ARCH=i386 # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != no_compiler_found ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH=x86_64 fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = x && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/lslpp ] ; then IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH=hppa2.0n ;; 64) HP_ARCH=hppa2.0w ;; '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS="" $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = hppa2.0w ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH=hppa2.0w else HP_ARCH=hppa64 fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case ${UNAME_PROCESSOR} in amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW64*:*) echo ${UNAME_MACHINE}-pc-mingw64 exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; *:MSYS*:*) echo ${UNAME_MACHINE}-pc-msys exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; 8664:Windows_NT:*) echo x86_64-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; aarch64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC=gnulibc1 ; fi echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arc:Linux:*:* | arceb:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-${LIBC} else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi else echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf fi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; cris:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; crisv32:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; e2k:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; frv:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; hexagon:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:Linux:*:*) echo ${UNAME_MACHINE}-pc-linux-${LIBC} exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; k1om:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } ;; openrisc*:Linux:*:*) echo or1k-unknown-linux-${LIBC} exit ;; or32:Linux:*:* | or1k*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; padre:Linux:*:*) echo sparc-unknown-linux-${LIBC} exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-${LIBC} exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-${LIBC} ;; PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; *) echo hppa-unknown-linux-${LIBC} ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-${LIBC} exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-${LIBC} exit ;; ppc64le:Linux:*:*) echo powerpc64le-unknown-linux-${LIBC} exit ;; ppcle:Linux:*:*) echo powerpcle-unknown-linux-${LIBC} exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux-${LIBC} exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; tile*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-${LIBC} exit ;; x86_64:Linux:*:*) echo ${UNAME_MACHINE}-pc-linux-${LIBC} exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configure will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; x86_64:Haiku:*:*) echo x86_64-unknown-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; SX-ACE:SUPER-UX:*:*) echo sxace-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown eval $set_cc_for_build if test "$UNAME_PROCESSOR" = unknown ; then UNAME_PROCESSOR=powerpc fi if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then if [ "$CC_FOR_BUILD" != no_compiler_found ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then case $UNAME_PROCESSOR in i386) UNAME_PROCESSOR=x86_64 ;; powerpc) UNAME_PROCESSOR=powerpc64 ;; esac fi fi elif test "$UNAME_PROCESSOR" = i386 ; then # Avoid executing cc on OS X 10.9, as it ships with a stub # that puts up a graphical alert prompting to install # developer tools. Any system running Mac OS X 10.7 or # later (Darwin 11 and later) is required to have a 64-bit # processor. This is not true of the ARM version of Darwin # that Apple uses in portable devices. UNAME_PROCESSOR=x86_64 fi echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = x86; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NEO-?:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk${UNAME_RELEASE} exit ;; NSE-*:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = 386; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE} | sed -e 's/ .*$//'` exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; i*86:AROS:*:*) echo ${UNAME_MACHINE}-pc-aros exit ;; x86_64:VMkernel:*:*) echo ${UNAME_MACHINE}-unknown-esx exit ;; amd64:Isilon\ OneFS:*:*) echo x86_64-unknown-onefs exit ;; esac cat >&2 </dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: nagios-4.3.4/config.sub000077500000000000000000001067711314764422400150100ustar00rootroot00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright 1992-2016 Free Software Foundation, Inc. timestamp='2016-06-20' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # Please send patches to . # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright 1992-2016 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \ kopensolaris*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; android-linux) os=-linux-android basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray | -microblaze*) os= basic_machine=$1 ;; -bluegene*) os=-cnk ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*178) os=-lynxos178 ;; -lynx*5) os=-lynxos5 ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | aarch64 | aarch64_be \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arceb \ | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ | avr | avr32 \ | ba \ | be32 | be64 \ | bfin \ | c4x | c8051 | clipper \ | d10v | d30v | dlx | dsp16xx \ | e2k | epiphany \ | fido | fr30 | frv | ft32 \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | k1om \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa32r6 | mipsisa32r6el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64r6 | mipsisa64r6el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipsr5900 | mipsr5900el \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ | nios | nios2 | nios2eb | nios2el \ | ns16k | ns32k \ | open8 | or1k | or1knd | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pyramid \ | riscv32 | riscv64 \ | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu \ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ | visium \ | we32k \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; c54x) basic_machine=tic54x-unknown ;; c55x) basic_machine=tic55x-unknown ;; c6x) basic_machine=tic6x-unknown ;; leon|leon[3-9]) basic_machine=sparc-$basic_machine ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; strongarm | thumb | xscale) basic_machine=arm-unknown ;; xgate) basic_machine=$basic_machine-unknown os=-none ;; xscaleeb) basic_machine=armeb-unknown ;; xscaleel) basic_machine=armel-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | aarch64-* | aarch64_be-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | ba-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | c8051-* | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | e2k-* | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | k1om-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ | microblaze-* | microblazeel-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa32r6-* | mipsisa32r6el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64r6-* | mipsisa64r6el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipsr5900-* | mipsr5900el-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ | nios-* | nios2-* | nios2eb-* | nios2el-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | or1k*-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ | pyramid-* \ | riscv32-* | riscv64-* \ | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ | visium-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aros) basic_machine=i386-pc os=-aros ;; asmjs) basic_machine=asmjs-unknown ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) basic_machine=powerpc-ibm os=-cnk ;; c54x-*) basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c55x-*) basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c6x-*) basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16 | cr16-*) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; e500v[12]) basic_machine=powerpc-unknown os=$os"spe" ;; e500v[12]-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` os=$os"spe" ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; leon-*|leon[3-9]-*) basic_machine=sparc-`echo $basic_machine | sed 's/-.*//'` ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze*) basic_machine=microblaze-xilinx ;; mingw64) basic_machine=x86_64-pc os=-mingw64 ;; mingw32) basic_machine=i686-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; moxiebox) basic_machine=moxie-unknown os=-moxiebox ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; msys) basic_machine=i686-pc os=-msys ;; mvs) basic_machine=i370-ibm os=-mvs ;; nacl) basic_machine=le32-unknown os=-nacl ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; neo-tandem) basic_machine=neo-tandem ;; nse-tandem) basic_machine=nse-tandem ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc | ppcbe) basic_machine=powerpc-unknown ;; ppc-* | ppcbe-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos | rdos64) basic_machine=x86_64-pc os=-rdos ;; rdos32) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; strongarm-* | thumb-*) basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tile*) basic_machine=$basic_machine-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; xscale-* | xscalee[bl]-*) basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; z80-*-coff) basic_machine=z80-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -auroraux) os=-auroraux ;; -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* | -plan9* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* | -cloudabi* | -sortix* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -bitrig* | -openbsd* | -solidbsd* | -libertybsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* | -cegcc* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -midipix* | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-musl* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* \ | -onefs* | -tirtos* | -phoenix*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -nacl*) ;; -ios) ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; c8051-*) os=-elf ;; hexagon-*) os=-elf ;; tic54x-*) os=-coff ;; tic55x-*) os=-coff ;; tic6x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -cnk*|-aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: nagios-4.3.4/configure000077500000000000000000006266111314764422400147340ustar00rootroot00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME= PACKAGE_TARNAME= PACKAGE_VERSION= PACKAGE_STRING= PACKAGE_BUGREPORT= PACKAGE_URL= ac_unique_file="base/nagios.c" ac_default_prefix=/usr/local/nagios # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" enable_option_checking=no ac_subst_vars='LTLIBOBJS LIBOBJS UNZIP PERL USE_EVENTBROKER INITDIR BASEEXTRALIBS GDLIBS CGIEXTRAS USE_LIBTAP subdirs VERSION PACKDIR PATH_TO_TRACEROUTE nagiostats_name nagios_name BROKER_H BROKER_O WORKER_LDFLAGS WORKER_CFLAGS MOD_LDFLAGS MOD_CFLAGS BROKERLIBS BROKER_LDFLAGS cgiurl htmurl COREWINDOW lockfile init_dir TMPDIR CHECKRESULTDIR LN_HTTPD_SITES_ENABLED HTTPD_CONF MAIL_PROG COMMAND_OPTS command_grp command_user INSTALL_OPTS nagios_grp nagios_user INIT_OPTS root_grp SOCKETLIBS SNPRINTF_O EGREP GREP CPP STRIP LN_S SET_MAKE OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC host_os host_vendor host_cpu host build_os build_vendor build_cpu build INSTALL INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking with_root_group with_nagios_user with_nagios_group with_command_user with_command_group with_mail with_httpd_conf with_checkresult_dir with_temp_dir with_init_dir with_lockfile with_iobroker with_gd_lib with_gd_inc enable_corewindow enable_statusmap enable_statuswrl with_cgiurl with_htmurl enable_nanosleep enable_event_broker enable_cygwin enable_libtap ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP' ac_subdirs_all='tap' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures this package to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-corewindow enables the 'corewindow' URL argument --disable-statusmap disables compilation of statusmap CGI --disable-statuswrl disables compilation of statuswrl (VRML) CGI --enable-nanosleep enables use of nanosleep (instead of sleep) in event timing --enable-event-broker enables integration of event broker routines --enable-cygwin enables building under the CYGWIN environment --enable-libtap Enable built-in libtap for unit-testing (default: no). Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-root-group= sets group name for installing init --with-nagios-user= sets user name to run nagios --with-nagios-group= sets group name to run nagios --with-command-user= sets user name for command access --with-command-group= sets group name for command access --with-mail= sets path to equivalent program to mail --with-httpd-conf= sets path to Apache conf.d directory --with-checkresult-dir= sets path to check results spool directory --with-temp-dir= sets path to temp directory --with-init-dir= sets directory to place init script into --with-lockfile= sets path for lock file (default: [/var]/run/nagios.lock) --with-iobroker= specify the method to use with iobroker: epoll, poll, or select --with-gd-lib=DIR sets location of the gd library --with-gd-inc=DIR sets location of the gd include files --with-cgiurl= sets URL for cgi programs (do not use a trailing slash) --with-htmurl= sets URL for public html Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF configure generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES # ---------------------------------------------------- # Tries to find if the field MEMBER exists in type AGGR, after including # INCLUDES, setting cache variable VAR accordingly. ac_fn_c_check_member () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5 $as_echo_n "checking for $2.$3... " >&6; } if eval \${$4+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main () { static $2 ac_aggr; if (ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$4=yes" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main () { static $2 ac_aggr; if (sizeof ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$4=yes" else eval "$4=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$4 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_member # ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES # --------------------------------------------- # Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR # accordingly. ac_fn_c_check_decl () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack as_decl_name=`echo $2|sed 's/ *(.*//'` as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'` { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5 $as_echo_n "checking whether $as_decl_name is declared... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { #ifndef $as_decl_name #ifdef __cplusplus (void) $as_decl_use; #else (void) $as_decl_name; #endif #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_decl # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_type LINENO TYPE VAR INCLUDES # ------------------------------------------- # Tests whether TYPE exists after having included INCLUDES, setting cache # variable VAR accordingly. ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else eval "$3=yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_type # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by $as_me, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_config_headers="$ac_config_headers include/config.h lib/snprintf.h lib/iobroker.h" PKG_NAME=nagios PKG_VERSION="4.3.4" PKG_HOME_URL="https://www.nagios.org/" PKG_REL_DATE="2017-08-24" ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac ac_config_files="$ac_config_files html/index.php" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else case $STRIP in [\\/]* | ?:[\\/]*) ac_cv_path_STRIP="$STRIP" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_STRIP="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_STRIP" && ac_cv_path_STRIP="true" ;; esac fi STRIP=$ac_cv_path_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5 $as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; } if ${ac_cv_header_time+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { if ((struct tm *) 0) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_time=yes else ac_cv_header_time=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5 $as_echo "$ac_cv_header_time" >&6; } if test $ac_cv_header_time = yes; then $as_echo "#define TIME_WITH_SYS_TIME 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sys/wait.h that is POSIX.1 compatible" >&5 $as_echo_n "checking for sys/wait.h that is POSIX.1 compatible... " >&6; } if ${ac_cv_header_sys_wait_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #ifndef WEXITSTATUS # define WEXITSTATUS(stat_val) ((unsigned int) (stat_val) >> 8) #endif #ifndef WIFEXITED # define WIFEXITED(stat_val) (((stat_val) & 255) == 0) #endif int main () { int s; wait (&s); s = WIFEXITED (s) ? WEXITSTATUS (s) : 1; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_sys_wait_h=yes else ac_cv_header_sys_wait_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_sys_wait_h" >&5 $as_echo "$ac_cv_header_sys_wait_h" >&6; } if test $ac_cv_header_sys_wait_h = yes; then $as_echo "#define HAVE_SYS_WAIT_H 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in arpa/inet.h ctype.h dirent.h errno.h fcntl.h getopt.h grp.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in libgen.h limits.h math.h netdb.h netinet/in.h pwd.h regex.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in signal.h socket.h stdarg.h string.h strings.h sys/loadavg.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in sys/mman.h sys/types.h sys/time.h sys/resource.h sys/wait.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in sys/socket.h sys/stat.h sys/timeb.h sys/un.h sys/ipc.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in sys/msg.h sys/poll.h syslog.h uio.h unistd.h locale.h wchar.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in sys/prctl.h do : ac_fn_c_check_header_mongrel "$LINENO" "sys/prctl.h" "ac_cv_header_sys_prctl_h" "$ac_includes_default" if test "x$ac_cv_header_sys_prctl_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYS_PRCTL_H 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 $as_echo_n "checking for an ANSI C-conforming const... " >&6; } if ${ac_cv_c_const+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __cplusplus /* Ultrix mips cc rejects this sort of thing. */ typedef int charset[2]; const charset cs = { 0, 0 }; /* SunOS 4.1.1 cc rejects this. */ char const *const *pcpcc; char **ppc; /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; /* AIX XL C 1.02.0.0 rejects this. It does not let you subtract one const X* pointer from another in an arm of an if-expression whose if-part is not a constant expression */ const char *g = "string"; pcpcc = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ ++pcpcc; ppc = (char**) pcpcc; pcpcc = (char const *const *) ppc; { /* SCO 3.2v4 cc rejects this sort of thing. */ char tx; char *t = &tx; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; if (s) return 0; } { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ int x[] = {25, 17}; const int *foo = &x[0]; ++foo; } { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ typedef const int *iptr; iptr p = 0; ++p; } { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; } bx; struct s *b = &bx; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; if (!foo) return 0; } return !cs[0] && !zero.x; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_const=yes else ac_cv_c_const=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 $as_echo "$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then $as_echo "#define const /**/" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether struct tm is in sys/time.h or time.h" >&5 $as_echo_n "checking whether struct tm is in sys/time.h or time.h... " >&6; } if ${ac_cv_struct_tm+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { struct tm tm; int *p = &tm.tm_sec; return !p; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_struct_tm=time.h else ac_cv_struct_tm=sys/time.h fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_tm" >&5 $as_echo "$ac_cv_struct_tm" >&6; } if test $ac_cv_struct_tm = sys/time.h; then $as_echo "#define TM_IN_SYS_TIME 1" >>confdefs.h fi ac_fn_c_check_member "$LINENO" "struct tm" "tm_zone" "ac_cv_member_struct_tm_tm_zone" "#include #include <$ac_cv_struct_tm> " if test "x$ac_cv_member_struct_tm_tm_zone" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_TM_TM_ZONE 1 _ACEOF fi if test "$ac_cv_member_struct_tm_tm_zone" = yes; then $as_echo "#define HAVE_TM_ZONE 1" >>confdefs.h else ac_fn_c_check_decl "$LINENO" "tzname" "ac_cv_have_decl_tzname" "#include " if test "x$ac_cv_have_decl_tzname" = xyes; then : ac_have_decl=1 else ac_have_decl=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_TZNAME $ac_have_decl _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tzname" >&5 $as_echo_n "checking for tzname... " >&6; } if ${ac_cv_var_tzname+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #if !HAVE_DECL_TZNAME extern char *tzname[]; #endif int main () { return tzname[0][0]; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_var_tzname=yes else ac_cv_var_tzname=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_var_tzname" >&5 $as_echo "$ac_cv_var_tzname" >&6; } if test $ac_cv_var_tzname = yes; then $as_echo "#define HAVE_TZNAME 1" >>confdefs.h fi fi ac_fn_c_check_type "$LINENO" "mode_t" "ac_cv_type_mode_t" "$ac_includes_default" if test "x$ac_cv_type_mode_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define mode_t int _ACEOF fi ac_fn_c_check_type "$LINENO" "pid_t" "ac_cv_type_pid_t" "$ac_includes_default" if test "x$ac_cv_type_pid_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define pid_t int _ACEOF fi ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define size_t unsigned int _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking return type of signal handlers" >&5 $as_echo_n "checking return type of signal handlers... " >&6; } if ${ac_cv_type_signal+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { return *(signal (0, 0)) (0) == 1; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_type_signal=int else ac_cv_type_signal=void fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_signal" >&5 $as_echo "$ac_cv_type_signal" >&6; } cat >>confdefs.h <<_ACEOF #define RETSIGTYPE $ac_cv_type_signal _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uid_t in sys/types.h" >&5 $as_echo_n "checking for uid_t in sys/types.h... " >&6; } if ${ac_cv_type_uid_t+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "uid_t" >/dev/null 2>&1; then : ac_cv_type_uid_t=yes else ac_cv_type_uid_t=no fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_uid_t" >&5 $as_echo "$ac_cv_type_uid_t" >&6; } if test $ac_cv_type_uid_t = no; then $as_echo "#define uid_t int" >>confdefs.h $as_echo "#define gid_t int" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking type of array argument to getgroups" >&5 $as_echo_n "checking type of array argument to getgroups... " >&6; } if ${ac_cv_type_getgroups+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_type_getgroups=cross else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Thanks to Mike Rendell for this test. */ $ac_includes_default #define NGID 256 #undef MAX #define MAX(x, y) ((x) > (y) ? (x) : (y)) int main () { gid_t gidset[NGID]; int i, n; union { gid_t gval; long int lval; } val; val.lval = -1; for (i = 0; i < NGID; i++) gidset[i] = val.gval; n = getgroups (sizeof (gidset) / MAX (sizeof (int), sizeof (gid_t)) - 1, gidset); /* Exit non-zero if getgroups seems to require an array of ints. This happens when gid_t is short int but getgroups modifies an array of ints. */ return n > 0 && gidset[n] != val.gval; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_type_getgroups=gid_t else ac_cv_type_getgroups=int fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi if test $ac_cv_type_getgroups = cross; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "getgroups.*int.*gid_t" >/dev/null 2>&1; then : ac_cv_type_getgroups=gid_t else ac_cv_type_getgroups=int fi rm -f conftest* fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_getgroups" >&5 $as_echo "$ac_cv_type_getgroups" >&6; } cat >>confdefs.h <<_ACEOF #define GETGROUPS_T $ac_cv_type_getgroups _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking for va_copy" >&5 $as_echo_n "checking for va_copy... " >&6; } if ${ac_cv_HAVE_VA_COPY+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include va_list ap1,ap2; int main () { va_copy(ap1,ap2); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_HAVE_VA_COPY=yes else ac_cv_HAVE_VA_COPY=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_HAVE_VA_COPY" >&5 $as_echo "$ac_cv_HAVE_VA_COPY" >&6; } if test x"$ac_cv_HAVE_VA_COPY" = x"yes"; then $as_echo "#define HAVE_VA_COPY 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __va_copy" >&5 $as_echo_n "checking for __va_copy... " >&6; } if ${ac_cv_HAVE___VA_COPY+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include va_list ap1,ap2; int main () { __va_copy(ap1,ap2); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_HAVE___VA_COPY=yes else ac_cv_HAVE___VA_COPY=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_HAVE___VA_COPY" >&5 $as_echo "$ac_cv_HAVE___VA_COPY" >&6; } if test x"$ac_cv_HAVE___VA_COPY" = x"yes"; then $as_echo "#define HAVE___VA_COPY 1" >>confdefs.h fi fi ac_fn_c_check_func "$LINENO" "vsnprintf" "ac_cv_func_vsnprintf" if test "x$ac_cv_func_vsnprintf" = xyes; then : else SNPRINTF_O=../lib/snprintf.o fi ac_fn_c_check_func "$LINENO" "snprintf" "ac_cv_func_snprintf" if test "x$ac_cv_func_snprintf" = xyes; then : else SNPRINTF_O=../lib/snprintf.o fi ac_fn_c_check_func "$LINENO" "asprintf" "ac_cv_func_asprintf" if test "x$ac_cv_func_asprintf" = xyes; then : else SNPRINTF_O=../lib/snprintf.o fi ac_fn_c_check_func "$LINENO" "vasprintf" "ac_cv_func_vasprintf" if test "x$ac_cv_func_vasprintf" = xyes; then : else SNPRINTF_O=../lib/snprintf.o fi for ac_func in sigaction do : ac_fn_c_check_func "$LINENO" "sigaction" "ac_cv_func_sigaction" if test "x$ac_cv_func_sigaction" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SIGACTION 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C99 vsnprintf" >&5 $as_echo_n "checking for C99 vsnprintf... " >&6; } if ${ac_cv_HAVE_C99_VSNPRINTF+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_HAVE_C99_VSNPRINTF=cross else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include void foo(const char *format, ...) { va_list ap; int len; char buf[5]; va_start(ap, format); len = vsnprintf(buf, 0, format, ap); va_end(ap); if (len != 5) exit(1); va_start(ap, format); len = vsnprintf(0, 0, format, ap); va_end(ap); if (len != 5) exit(1); if (snprintf(buf, 3, "hello") != 5 || strcmp(buf, "he") != 0) exit(1); exit(0); } main() { foo("hello"); } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_HAVE_C99_VSNPRINTF=yes else ac_cv_HAVE_C99_VSNPRINTF=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_HAVE_C99_VSNPRINTF" >&5 $as_echo "$ac_cv_HAVE_C99_VSNPRINTF" >&6; } if test x"$ac_cv_HAVE_C99_VSNPRINTF" = x"yes"; then $as_echo "#define HAVE_C99_VSNPRINTF 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing getservbyname" >&5 $as_echo_n "checking for library containing getservbyname... " >&6; } if ${ac_cv_search_getservbyname+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char getservbyname (); int main () { return getservbyname (); ; return 0; } _ACEOF for ac_lib in '' nsl; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_getservbyname=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_getservbyname+:} false; then : break fi done if ${ac_cv_search_getservbyname+:} false; then : else ac_cv_search_getservbyname=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_getservbyname" >&5 $as_echo "$ac_cv_search_getservbyname" >&6; } ac_res=$ac_cv_search_getservbyname if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" if test "$ac_cv_search_getservbyname" != "none required"; then SOCKETLIBS="$SOCKETLIBS -lnsl" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing connect" >&5 $as_echo_n "checking for library containing connect... " >&6; } if ${ac_cv_search_connect+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char connect (); int main () { return connect (); ; return 0; } _ACEOF for ac_lib in '' socket; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_connect=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_connect+:} false; then : break fi done if ${ac_cv_search_connect+:} false; then : else ac_cv_search_connect=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_connect" >&5 $as_echo "$ac_cv_search_connect" >&6; } ac_res=$ac_cv_search_connect if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" if test "$ac_cv_search_connect" != "none required"; then SOCKETLIBS="$SOCKETLIBS -lsocket" fi fi for ac_func in initgroups setenv strdup strstr strtoul unsetenv do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for type of socket size" >&5 $as_echo_n "checking for type of socket size... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { int a = send(1, (const void *) 0, (size_t) 0, (int) 0); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : $as_echo "#define SOCKET_SIZE_TYPE size_t" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: size_t" >&5 $as_echo "size_t" >&6; } else $as_echo "#define SOCKET_SIZE_TYPE int" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: int" >&5 $as_echo "int" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing nanosleep" >&5 $as_echo_n "checking for library containing nanosleep... " >&6; } if ${ac_cv_search_nanosleep+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char nanosleep (); int main () { return nanosleep (); ; return 0; } _ACEOF for ac_lib in '' rt posix4; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_nanosleep=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_nanosleep+:} false; then : break fi done if ${ac_cv_search_nanosleep+:} false; then : else ac_cv_search_nanosleep=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_nanosleep" >&5 $as_echo "$ac_cv_search_nanosleep" >&6; } ac_res=$ac_cv_search_nanosleep if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" else echo "Error: nanosleep() needed for timing operations." exit 1 fi case $host_os in *bsd*|darwin*) root_grp=wheel ;; *) root_grp=root ;; esac # Check whether --with-root_group was given. if test "${with_root_group+set}" = set; then : withval=$with_root_group; root_grp=$withval fi INIT_OPTS="-o root -g $root_grp" # Check whether --with-nagios_user was given. if test "${with_nagios_user+set}" = set; then : withval=$with_nagios_user; nagios_user=$withval else nagios_user=nagios fi # Check whether --with-nagios_group was given. if test "${with_nagios_group+set}" = set; then : withval=$with_nagios_group; nagios_grp=$withval else nagios_grp=nagios fi cat >>confdefs.h <<_ACEOF #define DEFAULT_NAGIOS_USER "$nagios_user" _ACEOF cat >>confdefs.h <<_ACEOF #define DEFAULT_NAGIOS_GROUP "$nagios_grp" _ACEOF INSTALL_OPTS="-o $nagios_user -g $nagios_grp" # Check whether --with-command_user was given. if test "${with_command_user+set}" = set; then : withval=$with_command_user; command_user=$withval else command_user=$nagios_user fi # Check whether --with-command_group was given. if test "${with_command_group+set}" = set; then : withval=$with_command_group; command_grp=$withval else command_grp=$nagios_grp fi COMMAND_OPTS="-o $command_user -g $command_grp" MAIL_PROG=no # Check whether --with-mail was given. if test "${with_mail+set}" = set; then : withval=$with_mail; MAIL_PROG=$withval else MAIL_PROG=no fi if test x$MAIL_PROG = xno; then # Extract the first word of "mail", so it can be a program name with args. set dummy mail; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_MAIL_PROG+:} false; then : $as_echo_n "(cached) " >&6 else case $MAIL_PROG in [\\/]* | ?:[\\/]*) ac_cv_path_MAIL_PROG="$MAIL_PROG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_MAIL_PROG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi MAIL_PROG=$ac_cv_path_MAIL_PROG if test -n "$MAIL_PROG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAIL_PROG" >&5 $as_echo "$MAIL_PROG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test x$MAIL_PROG = x; then MAIL_PROG="/bin/mail" fi HTTP_CONF=no # Check whether --with-httpd_conf was given. if test "${with_httpd_conf+set}" = set; then : withval=$with_httpd_conf; HTTPD_CONF=$withval else HTTPD_CONF=no fi LN_HTTPD_SITES_ENABLED=0 if test x$HTTPD_CONF = xno; then if test -d /etc/httpd/conf.d; then HTTPD_CONF="/etc/httpd/conf.d" elif test -d /etc/apache2/conf.d; then HTTPD_CONF="/etc/apache2/conf.d" elif test -d /etc/apache2/sites-available; then HTTPD_CONF="/etc/apache2/sites-available" if test -d /etc/apache2/sites-enabled; then LN_HTTPD_SITES_ENABLED=1 fi elif test -d /etc/apache2/sites-enabled; then HTTPD_CONF="/etc/apache2/sites-enabled" elif test -d /etc/apache/conf.d; then HTTPD_CONF="/etc/apache/conf.d" else HTTPD_CONF="/etc/httpd/conf.d" fi fi CHECKRESULTDIR=no # Check whether --with-checkresult-dir was given. if test "${with_checkresult_dir+set}" = set; then : withval=$with_checkresult_dir; CHECKRESULTDIR=$withval else CHECKRESULTDIR=no fi if test x$CHECKRESULTDIR = xno; then CHECKRESULTDIR="$localstatedir/spool/checkresults" fi TMPDIR=no # Check whether --with-temp-dir was given. if test "${with_temp_dir+set}" = set; then : withval=$with_temp_dir; TMPDIR=$withval else TMPDIR=no fi if test x$TMPDIR = xno; then TMPDIR="/tmp" fi init_dir=/etc/rc.d/init.d if test -d /etc/rc.d/init.d; then init_dir="/etc/rc.d/init.d" elif test -d /usr/local/etc/rc.d; then init_dir="/usr/local/etc/rc.d" elif test -d /etc/rc.d; then init_dir="/etc/rc.d" elif test -d /etc/init.d; then init_dir="/etc/init.d" elif test -d /sbin/init.d; then init_dir="/sbin/init.d" fi # Check whether --with-init_dir was given. if test "${with_init_dir+set}" = set; then : withval=$with_init_dir; init_dir=$withval fi default_lockfile_path=/var/run/nagios.lock if test -d /run; then default_lockfile_path=/run/nagios.lock fi # Check whether --with-lockfile was given. if test "${with_lockfile+set}" = set; then : withval=$with_lockfile; lockfile=$withval else lockfile=$default_lockfile_path fi case $host_os in linux*) { $as_echo "$as_me:${as_lineno-$LINENO}: checking for glibc at least version 2.4" >&5 $as_echo_n "checking for glibc at least version 2.4... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #if defined(__GLIBC__) && defined(__linux) #include # if !__GLIBC_PREREQ(2, 4) # error GLIBC too old # endif #else # error Not using GLIBC #endif _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : GLIBC_NEWER_2_4=1; { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else GLIBC_NEWER_2_4=0; { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f conftest.err conftest.i conftest.$ac_ext if test $GLIBC_NEWER_2_4 -eq 1; then ac_fn_c_check_header_mongrel "$LINENO" "sys/epoll.h" "ac_cv_header_sys_epoll_h" "$ac_includes_default" if test "x$ac_cv_header_sys_epoll_h" = xyes; then : fi fi ;; esac ac_fn_c_check_header_mongrel "$LINENO" "sys/select.h" "ac_cv_header_sys_select_h" "$ac_includes_default" if test "x$ac_cv_header_sys_select_h" = xyes; then : fi # Check whether --with-iobroker was given. if test "${with_iobroker+set}" = set; then : withval=$with_iobroker; IOBROKER_METHOD=$withval else IOBROKER_METHOD="none" fi case $IOBROKER_METHOD in epoll*) if test $GLIBC_NEWER_2_4 -eq 1 -a x$ac_cv_header_sys_epoll_h = xyes ; then $as_echo "#define IOBROKER_USES_EPOLL 1" >>confdefs.h else echo "\"epoll\" is not available as an iobroker method." echo "Please use one of the other options." exit 1 fi ;; poll*) if test x$ac_cv_header_sys_poll_h = xyes -o x$ac_cv_header_poll_h = xyes ; then $as_echo "#define IOBROKER_USES_POLL 1" >>confdefs.h else echo "\"poll\" is not available as an iobroker method." echo "Please use one of the other options." exit 1 fi ;; select*) if test x$ac_cv_header_sys_select_h = xyes ; then $as_echo "#define IOBROKER_USES_SELECT 1" >>confdefs.h else echo "\"select\" is not available as an iobroker method." echo "Please use one of the other options." exit 1 fi ;; none*) if test $GLIBC_NEWER_2_4 -eq 1 -a x$ac_cv_header_sys_epoll_h = xyes ; then $as_echo "#define IOBROKER_USES_EPOLL 1" >>confdefs.h IOBROKER_METHOD="epoll" elif test x$ac_cv_header_sys_poll_h = xyes -o x$ac_cv_header_poll_h = xyes ; then $as_echo "#define IOBROKER_USES_POLL 1" >>confdefs.h IOBROKER_METHOD="poll" elif test x$ac_cv_header_sys_select_h = xyes ; then $as_echo "#define IOBROKER_USES_SELECT 1" >>confdefs.h IOBROKER_METHOD="select" else echo "There are no available options for iobroker polling" exit 1 fi ;; *) echo "\"$IOBROKER_METHOD\" is not a valid method for --with-iobroker" exit 1 ;; esac # Check whether --with-gd-lib was given. if test "${with_gd_lib+set}" = set; then : withval=$with_gd_lib; LDFLAGS="${LDFLAGS} -L${withval}" LD_RUN_PATH="${withval}${LD_RUN_PATH:+:}${LD_RUN_PATH}" fi # Check whether --with-gd-inc was given. if test "${with_gd_inc+set}" = set; then : withval=$with_gd_inc; CFLAGS="${CFLAGS} -I${withval}" fi TRYGD=yep COREWINDOW=no # Check whether --enable-corewindow was given. if test "${enable_corewindow+set}" = set; then : enableval=$enable_corewindow; COREWINDOW=yes fi TRYSTATUSMAP=yep # Check whether --enable-statusmap was given. if test "${enable_statusmap+set}" = set; then : enableval=$enable_statusmap; TRYSTATUSMAP=nope fi TRYSTATUSWRL=yep # Check whether --enable-statuswrl was given. if test "${enable_statuswrl+set}" = set; then : enableval=$enable_statuswrl; TRYSTATUSWRL=nope fi if test x$TRYSTATUSWRL = xyep; then cat >>confdefs.h <<_ACEOF #define USE_STATUSWRL /**/ _ACEOF CGIEXTRAS="$CGIEXTRAS statuswrl.cgi" fi if test x$TRYGD = xyep; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -liconv" >&5 $as_echo_n "checking for main in -liconv... " >&6; } if ${ac_cv_lib_iconv_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-liconv $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_iconv_main=yes else ac_cv_lib_iconv_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_iconv_main" >&5 $as_echo "$ac_cv_lib_iconv_main" >&6; } if test "x$ac_cv_lib_iconv_main" = xyes; then : ICONV=-liconv fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gdImagePng in -lgd (order 1)" >&5 $as_echo_n "checking for gdImagePng in -lgd (order 1)... " >&6; } ac_lib_var=`echo gd'_'gdImagePng'_'1 | sed 'y%./+-%__p_%'` if eval \${ac_cv_lib_$ac_lib_var+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_LIBS="$LIBS" LIBS="-lgd -lttf -lpng -ljpeg -lz -lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char gdImagePng(); int main () { gdImagePng() ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "ac_cv_lib_$ac_lib_var=yes" else eval "ac_cv_lib_$ac_lib_var=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } GDLIBFOUND=yep GDLIBS="-lgd -lttf -lpng -ljpeg -lz -lm" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi if test x$GDLIBFOUND = x; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gdImagePng in -lgd (order 2)" >&5 $as_echo_n "checking for gdImagePng in -lgd (order 2)... " >&6; } ac_lib_var=`echo gd'_'gdImagePng'_'2 | sed 'y%./+-%__p_%'` if eval \${ac_cv_lib_$ac_lib_var+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_LIBS="$LIBS" LIBS="-lgd $ICONV -lpng -ljpeg -lz -lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char gdImagePng(); int main () { gdImagePng() ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "ac_cv_lib_$ac_lib_var=yes" else eval "ac_cv_lib_$ac_lib_var=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } GDLIBFOUND=yep GDLIBS="-lgd $ICONV -lpng -ljpeg -lz -lm" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi fi if test x$GDLIBFOUND = x; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gdImagePng in -lgd (order 3)" >&5 $as_echo_n "checking for gdImagePng in -lgd (order 3)... " >&6; } ac_lib_var=`echo gd'_'gdImagePng'_'3 | sed 'y%./+-%__p_%'` if eval \${ac_cv_lib_$ac_lib_var+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_LIBS="$LIBS" LIBS="-lgd $ICONV -lz -lm -lpng $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char gdImagePng(); int main () { gdImagePng() ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "ac_cv_lib_$ac_lib_var=yes" else eval "ac_cv_lib_$ac_lib_var=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } GDLIBFOUND=yep GDLIBS="-lgd $ICONV -lz -lm -lpng" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi fi if test x$GDLIBFOUND = x; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gdImagePng in -lgd (order 4)" >&5 $as_echo_n "checking for gdImagePng in -lgd (order 4)... " >&6; } ac_lib_var=`echo gd'_'gdImagePng'_'4 | sed 'y%./+-%__p_%'` if eval \${ac_cv_lib_$ac_lib_var+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_LIBS="$LIBS" LIBS="-lgd $ICONV -lpng -lz -lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char gdImagePng(); int main () { gdImagePng() ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "ac_cv_lib_$ac_lib_var=yes" else eval "ac_cv_lib_$ac_lib_var=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } GDLIBFOUND=yep GDLIBS="-lgd $ICONV -lpng -lz -lm" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi fi if test x$GDLIBFOUND = x; then echo "" echo "" echo "*** GD, PNG, and/or JPEG libraries could not be located... *********" echo "" echo "Boutell's GD library is required to compile the statusmap, trends" echo "and histogram CGIs. Get it from http://www.boutell.com/gd/, compile" echo "it, and use the --with-gd-lib and --with-gd-inc arguments to specify" echo "the locations of the GD library and include files." echo "" echo "NOTE: In addition to the gd-devel library, you'll also need to make" echo " sure you have the png-devel and jpeg-devel libraries installed" echo " on your system." echo "" echo "NOTE: After you install the necessary libraries on your system:" echo " 1. Make sure /etc/ld.so.conf has an entry for the directory in" echo " which the GD, PNG, and JPEG libraries are installed." echo " 2. Run 'ldconfig' to update the run-time linker options." echo " 3. Run 'make clean' in the Nagios distribution to clean out" echo " any old references to your previous compile." echo " 4. Rerun the configure script." echo "" echo "NOTE: If you can't get the configure script to recognize the GD libs" echo " on your system, get over it and move on to other things. The" echo " CGIs that use the GD libs are just a small part of the entire" echo " Nagios package. Get everything else working first and then" echo " revisit the problem. Make sure to check the nagios-users" echo " mailing list archives for possible solutions to GD library" echo " problems when you resume your troubleshooting." echo "" echo "********************************************************************" echo "" echo "" else echo "GD library was found!" if test x$TRYSTATUSMAP = xyep; then cat >>confdefs.h <<_ACEOF #define USE_STATUSMAP /**/ _ACEOF CGIEXTRAS="$CGIEXTRAS statusmap.cgi" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gdImageCreateTrueColor in -lgd" >&5 $as_echo_n "checking for gdImageCreateTrueColor in -lgd... " >&6; } if ${ac_cv_lib_gd_gdImageCreateTrueColor+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lgd $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gdImageCreateTrueColor (); int main () { return gdImageCreateTrueColor (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_gd_gdImageCreateTrueColor=yes else ac_cv_lib_gd_gdImageCreateTrueColor=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gd_gdImageCreateTrueColor" >&5 $as_echo "$ac_cv_lib_gd_gdImageCreateTrueColor" >&6; } if test "x$ac_cv_lib_gd_gdImageCreateTrueColor" = xyes; then : $as_echo "#define HAVE_GDIMAGECREATETRUECOLOR 1" >>confdefs.h fi fi cat >>confdefs.h <<_ACEOF #define USE_TRENDS /**/ _ACEOF CGIEXTRAS="$CGIEXTRAS trends.cgi" cat >>confdefs.h <<_ACEOF #define USE_HISTOGRAM /**/ _ACEOF CGIEXTRAS="$CGIEXTRAS histogram.cgi" fi fi # Check whether --with-cgiurl was given. if test "${with_cgiurl+set}" = set; then : withval=$with_cgiurl; cgiurl=$withval else cgiurl=/nagios/cgi-bin fi # Check whether --with-htmurl was given. if test "${with_htmurl+set}" = set; then : withval=$with_htmurl; htmurl=$withval else htmurl=/nagios fi USE_NANOSLEEP=yes # Check whether --enable-nanosleep was given. if test "${enable_nanosleep+set}" = set; then : enableval=$enable_nanosleep; USE_NANOSLEEP=$enableval else USE_NANOSLEEP=yes fi if test x$USE_NANOSLEEP = xyes; then cat >>confdefs.h <<_ACEOF #define USE_NANOSLEEP /**/ _ACEOF fi USE_EVENTBROKER=yes # Check whether --enable-event-broker was given. if test "${enable_event_broker+set}" = set; then : enableval=$enable_event_broker; USE_EVENTBROKER=$enableval else USE_EVENTBROKER=yes fi BROKER_LDFLAGS="" BROKERLIBS=""; some_dl_found="no"; if test x$USE_EVENTBROKER = xyes; then ac_fn_c_check_header_mongrel "$LINENO" "ltdl.h" "ac_cv_header_ltdl_h" "$ac_includes_default" if test "x$ac_cv_header_ltdl_h" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for lt_dlinit in -lltdl" >&5 $as_echo_n "checking for lt_dlinit in -lltdl... " >&6; } if ${ac_cv_lib_ltdl_lt_dlinit+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lltdl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char lt_dlinit (); int main () { return lt_dlinit (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ltdl_lt_dlinit=yes else ac_cv_lib_ltdl_lt_dlinit=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ltdl_lt_dlinit" >&5 $as_echo "$ac_cv_lib_ltdl_lt_dlinit" >&6; } if test "x$ac_cv_lib_ltdl_lt_dlinit" = xyes; then : $as_echo "#define HAVE_LTDL_H /**/" >>confdefs.h some_dl_found="yes" BROKERLIBS="$BROKERLIBS -lltdl" fi fi if test "x$some_dl_found" != xyes; then ac_fn_c_check_header_mongrel "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default" if test "x$ac_cv_header_dlfcn_h" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : $as_echo "#define HAVE_DLFCN_H /**/" >>confdefs.h some_dl_found="yes" BROKERLIBS="$BROKERLIBS -ldl" fi fi fi # Check how to export functions from the broker executable, needed # when dynamically loaded drivers are loaded (so that they can find # broker functions). # OS'es with ELF executables using the GNU linker (Linux and recent *BSD, # in rare cases Solaris) typically need '-Wl,-export-dynamic' (i.e. pass # -export-dynamic to the linker - also known as -rdynamic and some other # variants); some sysVr4 system(s) instead need(s) '-Wl,-Bexport'. # AIX 4.x (perhaps only for x>=2) wants -Wl,-bexpall,-brtl and doesn't # reliably return an error for others, thus we separate it out. # Otherwise we assume that if the linker accepts the flag, it is needed. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for extra flags needed to export symbols" >&5 $as_echo_n "checking for extra flags needed to export symbols... " >&6; } case $host_os in aix4*|aix5*) BROKER_LDFLAGS="$BROKER_LDFLAGS -Wl,-bexpall,-brtl" ;; bsdi*) BROKER_LDFLAGS="$BROKER_LDFLAGS -rdynamic" ;; *) save_ldflags="$LDFLAGS" LDFLAGS=-Wl,-export-dynamic cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : BROKER_LDFLAGS="$BROKER_LDFLAGS -Wl,-export-dynamic" else LDFLAGS=-Wl,-Bexport cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : BROKER_LDFLAGS="$BROKER_LDFLAGS -Wl,-Bexport" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 $as_echo "none" >&6; } fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_ldflags" ;; esac test "x$BROKER_LDFLAGS" != x && { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BROKER_LDFLAGS" >&5 $as_echo "$BROKER_LDFLAGS" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for linker flags for loadable modules" >&5 $as_echo_n "checking for linker flags for loadable modules... " >&6; } case $host_os in solaris2*|sysv4*) MOD_LDFLAGS="-G" MOD_CFLAGS="-fPIC" ;; aix4*|aix5*) #MOD_LDFLAGS="-G -bnoentry -bexpall" MOD_LDFLAGS="-G -bM:SRE -bnoentry -bexpall" ;; freebsd2*) # Non-ELF GNU linker MOD_LDFLAGS="-Bshareable" ;; darwin*) # Mach-O linker, a shared lib and a loadable # object file is not the same thing. MOD_LDFLAGS="-bundle -flat_namespace -undefined suppress" MOD_CFLAGS="$MOD_CFLAGS -fno-common" ;; linux* | k*bsd*-gnu*) # assume GNU linker and ELF MOD_LDFLAGS="-shared" MOD_CFLAGS="-fPIC" ;; *bsd*) MOD_LDFLAGS="-shared" MOD_CFLAGS="-fPIC" ;; *) # assume GNU linker and ELF MOD_LDFLAGS="-shared" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MOD_LDFLAGS" >&5 $as_echo "$MOD_LDFLAGS" >&6; } WORKER_CFLAGS="-I ../../include -I ../.." WORKER_LDFLAGS="-L ../../lib -l nagios" cat >>confdefs.h <<_ACEOF #define USE_EVENT_BROKER /**/ _ACEOF BROKER_O="broker.o nebmods.o" BROKER_H="../include/broker.h ../include/nebmods.h ../include/nebmodules.h ../include/nebcallbacks.h ../include/neberrors.h" fi nagios_name=nagios nagiostats_name=nagiostats cygwin=no # Check whether --enable-cygwin was given. if test "${enable_cygwin+set}" = set; then : enableval=$enable_cygwin; cygwin=$enableval fi if test x$cygwin = xyes; then CFLAGS="${CFLAGS} -DCYGWIN" nagios_name=nagios.exe; nagiostats_name=nagiostats.exe; fi # Extract the first word of "traceroute", so it can be a program name with args. set dummy traceroute; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PATH_TO_TRACEROUTE+:} false; then : $as_echo_n "(cached) " >&6 else case $PATH_TO_TRACEROUTE in [\\/]* | ?:[\\/]*) ac_cv_path_PATH_TO_TRACEROUTE="$PATH_TO_TRACEROUTE" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PATH_TO_TRACEROUTE="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PATH_TO_TRACEROUTE=$ac_cv_path_PATH_TO_TRACEROUTE if test -n "$PATH_TO_TRACEROUTE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PATH_TO_TRACEROUTE" >&5 $as_echo "$PATH_TO_TRACEROUTE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi cat >>confdefs.h <<_ACEOF #define TRACEROUTE_COMMAND "$PATH_TO_TRACEROUTE" _ACEOF VERSION=$PKG_VERSION PACKDIR=`pwd`/pkg { $as_echo "$as_me:${as_lineno-$LINENO}: checking for type va_list" >&5 $as_echo_n "checking for type va_list... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ #include #include #include #else #include #include #include #endif int main () { va_list args; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else $as_echo "#define NEED_VA_LIST /**/" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext # Check whether --enable-libtap was given. if test "${enable_libtap+set}" = set; then : enableval=$enable_libtap; enable_libtap=$enableval else enable_libtap=no fi #Disabled for moment #AM_CONDITIONAL([USE_LIBTAP_LOCAL],[test "$enable_libtap" = "yes"]) # Disabled for moment # If not local, check if we can use the system one #if test "$enable_libtap" != "yes" ; then # dnl Check for libtap, to run perl-like tests # AC_CHECK_LIB(tap, plan_tests, # enable_libtap="yes" # ) #fi # Finally, define tests if we use libtap if test "$enable_libtap" = "yes" ; then subdirs="$subdirs tap" USE_LIBTAP=yes else USE_LIBTAP=no fi # Extract the first word of "perl", so it can be a program name with args. set dummy perl; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PERL+:} false; then : $as_echo_n "(cached) " >&6 else case $PERL in [\\/]* | ?:[\\/]*) ac_cv_path_PERL="$PERL" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PERL="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PERL=$ac_cv_path_PERL if test -n "$PERL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERL" >&5 $as_echo "$PERL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$PERL"; then as_fn_error $? "Cannot continue without perl!" "$LINENO" 5 fi # Extract the first word of "unzip", so it can be a program name with args. set dummy unzip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_UNZIP+:} false; then : $as_echo_n "(cached) " >&6 else case $UNZIP in [\\/]* | ?:[\\/]*) ac_cv_path_UNZIP="$UNZIP" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_UNZIP="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi UNZIP=$ac_cv_path_UNZIP if test -n "$UNZIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $UNZIP" >&5 $as_echo "$UNZIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$UNZIP"; then as_fn_error $? "Cannot continue without unzip!" "$LINENO" 5 fi ac_config_files="$ac_config_files Makefile lib/Makefile subst pkginfo base/Makefile common/Makefile contrib/Makefile cgi/Makefile html/Makefile module/Makefile worker/Makefile worker/ping/Makefile xdata/Makefile daemon-init openrc-init t/Makefile t-tap/Makefile" test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by $as_me, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ config.status configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "include/config.h") CONFIG_HEADERS="$CONFIG_HEADERS include/config.h" ;; "lib/snprintf.h") CONFIG_HEADERS="$CONFIG_HEADERS lib/snprintf.h" ;; "lib/iobroker.h") CONFIG_HEADERS="$CONFIG_HEADERS lib/iobroker.h" ;; "html/index.php") CONFIG_FILES="$CONFIG_FILES html/index.php" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "lib/Makefile") CONFIG_FILES="$CONFIG_FILES lib/Makefile" ;; "subst") CONFIG_FILES="$CONFIG_FILES subst" ;; "pkginfo") CONFIG_FILES="$CONFIG_FILES pkginfo" ;; "base/Makefile") CONFIG_FILES="$CONFIG_FILES base/Makefile" ;; "common/Makefile") CONFIG_FILES="$CONFIG_FILES common/Makefile" ;; "contrib/Makefile") CONFIG_FILES="$CONFIG_FILES contrib/Makefile" ;; "cgi/Makefile") CONFIG_FILES="$CONFIG_FILES cgi/Makefile" ;; "html/Makefile") CONFIG_FILES="$CONFIG_FILES html/Makefile" ;; "module/Makefile") CONFIG_FILES="$CONFIG_FILES module/Makefile" ;; "worker/Makefile") CONFIG_FILES="$CONFIG_FILES worker/Makefile" ;; "worker/ping/Makefile") CONFIG_FILES="$CONFIG_FILES worker/ping/Makefile" ;; "xdata/Makefile") CONFIG_FILES="$CONFIG_FILES xdata/Makefile" ;; "daemon-init") CONFIG_FILES="$CONFIG_FILES daemon-init" ;; "openrc-init") CONFIG_FILES="$CONFIG_FILES openrc-init" ;; "t/Makefile") CONFIG_FILES="$CONFIG_FILES t/Makefile" ;; "t-tap/Makefile") CONFIG_FILES="$CONFIG_FILES t-tap/Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi # # CONFIG_SUBDIRS section. # if test "$no_recursion" != yes; then # Remove --cache-file, --srcdir, and --disable-option-checking arguments # so they do not pile up. ac_sub_configure_args= ac_prev= eval "set x $ac_configure_args" shift for ac_arg do if test -n "$ac_prev"; then ac_prev= continue fi case $ac_arg in -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* \ | --c=*) ;; --config-cache | -C) ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) ;; --disable-option-checking) ;; *) case $ac_arg in *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append ac_sub_configure_args " '$ac_arg'" ;; esac done # Always prepend --prefix to ensure using the same prefix # in subdir configurations. ac_arg="--prefix=$prefix" case $ac_arg in *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac ac_sub_configure_args="'$ac_arg' $ac_sub_configure_args" # Pass --silent if test "$silent" = yes; then ac_sub_configure_args="--silent $ac_sub_configure_args" fi # Always prepend --disable-option-checking to silence warnings, since # different subdirs can have different --enable and --with options. ac_sub_configure_args="--disable-option-checking $ac_sub_configure_args" ac_popdir=`pwd` for ac_dir in : $subdirs; do test "x$ac_dir" = x: && continue # Do not complain, so a configure script can configure whichever # parts of a large source tree are present. test -d "$srcdir/$ac_dir" || continue ac_msg="=== configuring in $ac_dir (`pwd`/$ac_dir)" $as_echo "$as_me:${as_lineno-$LINENO}: $ac_msg" >&5 $as_echo "$ac_msg" >&6 as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" # Check for guested configure; otherwise get Cygnus style configure. if test -f "$ac_srcdir/configure.gnu"; then ac_sub_configure=$ac_srcdir/configure.gnu elif test -f "$ac_srcdir/configure"; then ac_sub_configure=$ac_srcdir/configure elif test -f "$ac_srcdir/configure.in"; then # This should be Cygnus configure. ac_sub_configure=$ac_aux_dir/configure else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: no configuration information is in $ac_dir" >&5 $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2;} ac_sub_configure= fi # The recursion is here. if test -n "$ac_sub_configure"; then # Make the cache file name correct relative to the subdirectory. case $cache_file in [\\/]* | ?:[\\/]* ) ac_sub_cache_file=$cache_file ;; *) # Relative name. ac_sub_cache_file=$ac_top_build_prefix$cache_file ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&5 $as_echo "$as_me: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&6;} # The eval makes quoting arguments work. eval "\$SHELL \"\$ac_sub_configure\" $ac_sub_configure_args \ --cache-file=\"\$ac_sub_cache_file\" --srcdir=\"\$ac_srcdir\"" || as_fn_error $? "$ac_sub_configure failed for $ac_dir" "$LINENO" 5 fi cd "$ac_popdir" done fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi perl subst include/locations.h perl subst html/config.inc.php echo "" echo "Creating sample config files in sample-config/ ..." perl subst sample-config/nagios.cfg perl subst sample-config/cgi.cfg perl subst sample-config/resource.cfg perl subst sample-config/httpd.conf perl subst sample-config/mrtg.cfg perl subst sample-config/template-object/templates.cfg perl subst sample-config/template-object/commands.cfg perl subst sample-config/template-object/timeperiods.cfg perl subst sample-config/template-object/contacts.cfg perl subst sample-config/template-object/localhost.cfg perl subst sample-config/template-object/windows.cfg perl subst sample-config/template-object/printer.cfg perl subst sample-config/template-object/switch.cfg echo "" echo "" { $as_echo "$as_me:${as_lineno-$LINENO}: result: *** Configuration summary for $PKG_NAME $PKG_VERSION $PKG_REL_DATE ***:" >&5 $as_echo "*** Configuration summary for $PKG_NAME $PKG_VERSION $PKG_REL_DATE ***:" >&6; } echo "" echo " General Options:" echo " -------------------------" { $as_echo "$as_me:${as_lineno-$LINENO}: result: Nagios executable: $nagios_name" >&5 $as_echo " Nagios executable: $nagios_name" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: Nagios user/group: $nagios_user,$nagios_grp" >&5 $as_echo " Nagios user/group: $nagios_user,$nagios_grp" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: Command user/group: $command_user,$command_grp" >&5 $as_echo " Command user/group: $command_user,$command_grp" >&6; } if test x$USE_EVENTBROKER = xyes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: Event Broker: yes" >&5 $as_echo " Event Broker: yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: Event Broker: no" >&5 $as_echo " Event Broker: no" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: Install \${prefix}: $prefix" >&5 $as_echo " Install \${prefix}: $prefix" >&6; } incdir=`eval echo $includedir` if test x$incdir = x$prefix/include; then includedir=$prefix/include/nagios fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: Install \${includedir}: $includedir" >&5 $as_echo " Install \${includedir}: $includedir" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: Lock file: $lockfile" >&5 $as_echo " Lock file: $lockfile" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: Check result directory: $CHECKRESULTDIR" >&5 $as_echo " Check result directory: $CHECKRESULTDIR" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: Init directory: $init_dir" >&5 $as_echo " Init directory: $init_dir" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: Apache conf.d directory: $HTTPD_CONF" >&5 $as_echo " Apache conf.d directory: $HTTPD_CONF" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: Mail program: $MAIL_PROG" >&5 $as_echo " Mail program: $MAIL_PROG" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: Host OS: $host_os" >&5 $as_echo " Host OS: $host_os" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: IOBroker Method: $IOBROKER_METHOD" >&5 $as_echo " IOBroker Method: $IOBROKER_METHOD" >&6; } echo "" echo " Web Interface Options:" echo " ------------------------" { $as_echo "$as_me:${as_lineno-$LINENO}: result: HTML URL: http://localhost$htmurl/" >&5 $as_echo " HTML URL: http://localhost$htmurl/" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: CGI URL: http://localhost$cgiurl/" >&5 $as_echo " CGI URL: http://localhost$cgiurl/" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: Traceroute (used by WAP): $PATH_TO_TRACEROUTE" >&5 $as_echo " Traceroute (used by WAP): $PATH_TO_TRACEROUTE" >&6; } echo "" echo "" echo "Review the options above for accuracy. If they look okay," echo "type 'make all' to compile the main program and CGIs." echo "" nagios-4.3.4/configure.ac000066400000000000000000000635351314764422400153130ustar00rootroot00000000000000dnl Process this -*-m4-*- file with autoconf to produce a configure script. dnl Disable caching define([AC_CACHE_LOAD],) define([AC_CACHE_SAVE],) AC_INIT(base/nagios.c) AC_CONFIG_HEADER(include/config.h lib/snprintf.h lib/iobroker.h) AC_PREFIX_DEFAULT(/usr/local/nagios) PKG_NAME=nagios PKG_VERSION="4.3.4" PKG_HOME_URL="https://www.nagios.org/" PKG_REL_DATE="2017-08-24" dnl Figure out how to invoke "install" and what install options to use. AC_PROG_INSTALL AC_SUBST(INSTALL) dnl What OS are we running? AC_CANONICAL_HOST AC_CONFIG_FILES([html/index.php]) dnl Checks for programs. AC_PROG_CC AC_PROG_MAKE_SET AC_PROG_LN_S AC_PATH_PROG([STRIP],[strip],[true]) dnl Checks for header files. AC_HEADER_STDC AC_HEADER_TIME AC_HEADER_SYS_WAIT AC_CHECK_HEADERS(arpa/inet.h ctype.h dirent.h errno.h fcntl.h getopt.h grp.h) AC_CHECK_HEADERS(libgen.h limits.h math.h netdb.h netinet/in.h pwd.h regex.h) AC_CHECK_HEADERS(signal.h socket.h stdarg.h string.h strings.h sys/loadavg.h) AC_CHECK_HEADERS(sys/mman.h sys/types.h sys/time.h sys/resource.h sys/wait.h) AC_CHECK_HEADERS(sys/socket.h sys/stat.h sys/timeb.h sys/un.h sys/ipc.h) AC_CHECK_HEADERS(sys/msg.h sys/poll.h syslog.h uio.h unistd.h locale.h wchar.h) AC_CHECK_HEADERS(sys/prctl.h) dnl Checks for typedefs, structures, and compiler characteristics. AC_C_CONST AC_STRUCT_TM AC_STRUCT_TIMEZONE AC_TYPE_MODE_T AC_TYPE_PID_T AC_TYPE_SIZE_T AC_TYPE_SIGNAL AC_TYPE_GETGROUPS dnl Check for asprintf() and friends... AC_CACHE_CHECK([for va_copy],ac_cv_HAVE_VA_COPY,[ AC_TRY_LINK([#include va_list ap1,ap2;], [va_copy(ap1,ap2);], ac_cv_HAVE_VA_COPY=yes, ac_cv_HAVE_VA_COPY=no)]) if test x"$ac_cv_HAVE_VA_COPY" = x"yes"; then AC_DEFINE(HAVE_VA_COPY,1,[Whether va_copy() is available]) else AC_CACHE_CHECK([for __va_copy],ac_cv_HAVE___VA_COPY,[ AC_TRY_LINK([#include va_list ap1,ap2;], [__va_copy(ap1,ap2);], ac_cv_HAVE___VA_COPY=yes, ac_cv_HAVE___VA_COPY=no)]) if test x"$ac_cv_HAVE___VA_COPY" = x"yes"; then AC_DEFINE(HAVE___VA_COPY,1,[Whether __va_copy() is available]) fi fi AC_CHECK_FUNC(vsnprintf,,SNPRINTF_O=../lib/snprintf.o) AC_CHECK_FUNC(snprintf,,SNPRINTF_O=../lib/snprintf.o) AC_CHECK_FUNC(asprintf,,SNPRINTF_O=../lib/snprintf.o) AC_CHECK_FUNC(vasprintf,,SNPRINTF_O=../lib/snprintf.o) AC_CHECK_FUNCS(sigaction) AC_CACHE_CHECK([for C99 vsnprintf],ac_cv_HAVE_C99_VSNPRINTF,[ AC_TRY_RUN([ #include #include void foo(const char *format, ...) { va_list ap; int len; char buf[5]; va_start(ap, format); len = vsnprintf(buf, 0, format, ap); va_end(ap); if (len != 5) exit(1); va_start(ap, format); len = vsnprintf(0, 0, format, ap); va_end(ap); if (len != 5) exit(1); if (snprintf(buf, 3, "hello") != 5 || strcmp(buf, "he") != 0) exit(1); exit(0); } main() { foo("hello"); } ], ac_cv_HAVE_C99_VSNPRINTF=yes,ac_cv_HAVE_C99_VSNPRINTF=no,ac_cv_HAVE_C99_VSNPRINTF=cross)]) if test x"$ac_cv_HAVE_C99_VSNPRINTF" = x"yes"; then AC_DEFINE(HAVE_C99_VSNPRINTF,1,[Define if system has C99 compatible vsnprintf]) fi dnl AC_CHECK_FUNC(snprintf,AC_DEFINE(HAVE_SNPRINTF),SNPRINTF_O=../common/snprintf.o) AC_SUBST(SNPRINTF_O) dnl Checks for library functions. AC_SEARCH_LIBS([getservbyname],[nsl], [if test "$ac_cv_search_getservbyname" != "none required"; then SOCKETLIBS="$SOCKETLIBS -lnsl" fi]) AC_SEARCH_LIBS([connect],[socket], [if test "$ac_cv_search_connect" != "none required"; then SOCKETLIBS="$SOCKETLIBS -lsocket" fi]) AC_SUBST(SOCKETLIBS) AC_CHECK_FUNCS(initgroups setenv strdup strstr strtoul unsetenv) AC_MSG_CHECKING(for type of socket size) AC_TRY_COMPILE([#include #include #include ], [int a = send(1, (const void *) 0, (size_t) 0, (int) 0);], [AC_DEFINE(SOCKET_SIZE_TYPE, size_t, [typedef for socket size]) AC_MSG_RESULT(size_t)], [AC_DEFINE(SOCKET_SIZE_TYPE, int, [typedef for socket size]) AC_MSG_RESULT(int)]) dnl Solaris needs rt or posix4 libraries for nanosleep() AC_SEARCH_LIBS(nanosleep,[rt posix4],,[ echo "Error: nanosleep() needed for timing operations." exit 1 ]) case $host_os in *bsd*|darwin*) root_grp=wheel ;; *) root_grp=root ;; esac AC_ARG_WITH(root_group,AC_HELP_STRING([--with-root-group=],[sets group name for installing init]),root_grp=$withval) AC_SUBST(root_grp) INIT_OPTS="-o root -g $root_grp" AC_SUBST(INIT_OPTS) AC_ARG_WITH(nagios_user,AC_HELP_STRING([--with-nagios-user=],[sets user name to run nagios]),nagios_user=$withval,nagios_user=nagios) AC_ARG_WITH(nagios_group,AC_HELP_STRING([--with-nagios-group=],[sets group name to run nagios]),nagios_grp=$withval,nagios_grp=nagios) AC_SUBST(nagios_user) AC_SUBST(nagios_grp) AC_DEFINE_UNQUOTED(DEFAULT_NAGIOS_USER,"$nagios_user",[user name to run nagios]) AC_DEFINE_UNQUOTED(DEFAULT_NAGIOS_GROUP,"$nagios_grp",[group name to run nagios]) INSTALL_OPTS="-o $nagios_user -g $nagios_grp" AC_SUBST(INSTALL_OPTS) AC_ARG_WITH(command_user,AC_HELP_STRING([--with-command-user=],[sets user name for command access]),command_user=$withval,command_user=$nagios_user) AC_ARG_WITH(command_group,AC_HELP_STRING([--with-command-group=],[sets group name for command access]),command_grp=$withval,command_grp=$nagios_grp) AC_SUBST(command_user) AC_SUBST(command_grp) COMMAND_OPTS="-o $command_user -g $command_grp" AC_SUBST(COMMAND_OPTS) dnl Check for location of mail program MAIL_PROG=no AC_ARG_WITH(mail, AC_HELP_STRING([--with-mail=], [sets path to equivalent program to mail]), MAIL_PROG=$withval, MAIL_PROG=no ) if test x$MAIL_PROG = xno; then AC_PATH_PROG(MAIL_PROG,mail) fi dnl Fix for systems that don't (yet) have mail/mailx installed... if test x$MAIL_PROG = x; then MAIL_PROG="/bin/mail" fi AC_SUBST(MAIL_PROG) dnl Check for location of Apache conf.d directory HTTP_CONF=no AC_ARG_WITH(httpd_conf, AC_HELP_STRING([--with-httpd-conf=], [sets path to Apache conf.d directory]), HTTPD_CONF=$withval, HTTPD_CONF=no ) LN_HTTPD_SITES_ENABLED=0 if test x$HTTPD_CONF = xno; then if test -d /etc/httpd/conf.d; then HTTPD_CONF="/etc/httpd/conf.d" elif test -d /etc/apache2/conf.d; then HTTPD_CONF="/etc/apache2/conf.d" elif test -d /etc/apache2/sites-available; then HTTPD_CONF="/etc/apache2/sites-available" if test -d /etc/apache2/sites-enabled; then LN_HTTPD_SITES_ENABLED=1 fi elif test -d /etc/apache2/sites-enabled; then HTTPD_CONF="/etc/apache2/sites-enabled" elif test -d /etc/apache/conf.d; then HTTPD_CONF="/etc/apache/conf.d" else HTTPD_CONF="/etc/httpd/conf.d" fi fi AC_SUBST(HTTPD_CONF) AC_SUBST(LN_HTTPD_SITES_ENABLED) dnl Location of check result path CHECKRESULTDIR=no AC_ARG_WITH(checkresult-dir, AC_HELP_STRING([--with-checkresult-dir=], [sets path to check results spool directory]), CHECKRESULTDIR=$withval, CHECKRESULTDIR=no ) if test x$CHECKRESULTDIR = xno; then CHECKRESULTDIR="$localstatedir/spool/checkresults" fi AC_SUBST(CHECKRESULTDIR) dnl Location of check result path TMPDIR=no AC_ARG_WITH(temp-dir, AC_HELP_STRING([--with-temp-dir=], [sets path to temp directory]), TMPDIR=$withval, TMPDIR=no ) if test x$TMPDIR = xno; then TMPDIR="/tmp" fi AC_SUBST(TMPDIR) dnl Check for location of init scripts init_dir=/etc/rc.d/init.d if test -d /etc/rc.d/init.d; then init_dir="/etc/rc.d/init.d" elif test -d /usr/local/etc/rc.d; then init_dir="/usr/local/etc/rc.d" elif test -d /etc/rc.d; then init_dir="/etc/rc.d" elif test -d /etc/init.d; then init_dir="/etc/init.d" elif test -d /sbin/init.d; then init_dir="/sbin/init.d" fi dnl User can override init script location AC_ARG_WITH(init_dir, AC_HELP_STRING([--with-init-dir=], [sets directory to place init script into]), init_dir=$withval ) AC_SUBST(init_dir) dnl User can override lock file location dnl Use the /var/run/ path by default dnl and use /run if it is available default_lockfile_path=/var/run/nagios.lock if test -d /run; then default_lockfile_path=/run/nagios.lock fi AC_ARG_WITH(lockfile, AC_HELP_STRING([--with-lockfile=], [sets path for lock file (default: [/var]/run/nagios.lock)]), lockfile=$withval, lockfile=$default_lockfile_path ) AC_SUBST(lockfile) dnl Determine the library to be used by the iobroker dnl epoll_*() is linux specific and was added to glibc 2.3.2, so we dnl check for 2.4 and use epoll() if we're on that version or later. case $host_os in linux*) AC_MSG_CHECKING(for glibc at least version 2.4) AC_TRY_CPP( [ #include #if defined(__GLIBC__) && defined(__linux) #include # if !__GLIBC_PREREQ(2, 4) # error GLIBC too old # endif #else # error Not using GLIBC #endif ], [GLIBC_NEWER_2_4=1; AC_MSG_RESULT(yes)], [GLIBC_NEWER_2_4=0; AC_MSG_RESULT(no)] ) if test $GLIBC_NEWER_2_4 -eq 1; then AC_CHECK_HEADER([sys/epoll.h]) fi ;; esac AC_CHECK_HEADER([sys/select.h]) AC_ARG_WITH(iobroker, AC_HELP_STRING([--with-iobroker=], [specify the method to use with iobroker: epoll, poll, or select]), IOBROKER_METHOD=$withval, IOBROKER_METHOD="none" ) case $IOBROKER_METHOD in epoll*) if test $GLIBC_NEWER_2_4 -eq 1 -a x$ac_cv_header_sys_epoll_h = xyes ; then AC_DEFINE([IOBROKER_USES_EPOLL]) else echo "\"epoll\" is not available as an iobroker method." echo "Please use one of the other options." exit 1 fi ;; poll*) if test x$ac_cv_header_sys_poll_h = xyes -o x$ac_cv_header_poll_h = xyes ; then AC_DEFINE([IOBROKER_USES_POLL]) else echo "\"poll\" is not available as an iobroker method." echo "Please use one of the other options." exit 1 fi ;; select*) if test x$ac_cv_header_sys_select_h = xyes ; then AC_DEFINE([IOBROKER_USES_SELECT]) else echo "\"select\" is not available as an iobroker method." echo "Please use one of the other options." exit 1 fi ;; none*) if test $GLIBC_NEWER_2_4 -eq 1 -a x$ac_cv_header_sys_epoll_h = xyes ; then AC_DEFINE([IOBROKER_USES_EPOLL]) IOBROKER_METHOD="epoll" elif test x$ac_cv_header_sys_poll_h = xyes -o x$ac_cv_header_poll_h = xyes ; then AC_DEFINE([IOBROKER_USES_POLL]) IOBROKER_METHOD="poll" elif test x$ac_cv_header_sys_select_h = xyes ; then AC_DEFINE([IOBROKER_USES_SELECT]) IOBROKER_METHOD="select" else echo "There are no available options for iobroker polling" exit 1 fi ;; *) echo "\"$IOBROKER_METHOD\" is not a valid method for --with-iobroker" exit 1 ;; esac dnl Optional GD library and include paths AC_ARG_WITH(gd-lib, AC_HELP_STRING([--with-gd-lib=DIR],[sets location of the gd library]), [ LDFLAGS="${LDFLAGS} -L${withval}" LD_RUN_PATH="${withval}${LD_RUN_PATH:+:}${LD_RUN_PATH}" ] ) AC_ARG_WITH(gd-inc, AC_HELP_STRING([--with-gd-inc=DIR],[sets location of the gd include files]), [CFLAGS="${CFLAGS} -I${withval}"] ) TRYGD=yep dnl 'corewindow' is now disabled. Allow it to be enabled if someone wants it COREWINDOW=no AC_ARG_ENABLE(corewindow, AC_HELP_STRING([--enable-corewindow], [enables the 'corewindow' URL argument]), COREWINDOW=yes ) AC_SUBST(COREWINDOW) dnl statusmap CGI enabled by default, unless users chooses not to use it TRYSTATUSMAP=yep AC_ARG_ENABLE(statusmap, AC_HELP_STRING([--disable-statusmap], [disables compilation of statusmap CGI]), TRYSTATUSMAP=nope ) dnl statuswrl CGI enabled by default, unless users chooses not to use it TRYSTATUSWRL=yep AC_ARG_ENABLE(statuswrl, AC_HELP_STRING([--disable-statuswrl], [disables compilation of statuswrl (VRML) CGI]), TRYSTATUSWRL=nope ) if test x$TRYSTATUSWRL = xyep; then AC_DEFINE_UNQUOTED(USE_STATUSWRL,,[statuswrl CGI enabled by default, unless users chooses not to use it]) CGIEXTRAS="$CGIEXTRAS statuswrl.cgi" fi dnl JMD_CHECK_LIB_ORDER(LIBRARY, FUNCTION, ORDER [, ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND dnl [, OTHER-LIBRARIES]]]) AC_DEFUN([JMD_CHECK_LIB_ORDER], [AC_MSG_CHECKING([for $2 in -l$1 (order $3)]) dnl Use a cache variable name containing both the library and function name, dnl because the test really is for library $1 defining function $2, not dnl just for library $1. Separate tests with the same $1 and different $2s dnl may have different results. ac_lib_var=`echo $1['_']$2['_']$3 | sed 'y%./+-%__p_%'` AC_CACHE_VAL(ac_cv_lib_$ac_lib_var, [ac_save_LIBS="$LIBS" LIBS="-l$1 $6 $LIBS" AC_TRY_LINK(dnl ifelse([AC_LANG], [FORTRAN77], , ifelse([$2], [main], , dnl Avoid conflicting decl of main. [/* Override any gcc2 internal prototype to avoid an error. */ ]ifelse([AC_LANG], CPLUSPLUS, [#ifdef __cplusplus extern "C" #endif ])dnl [/* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char $2(); ])), [$2()], eval "ac_cv_lib_$ac_lib_var=yes", eval "ac_cv_lib_$ac_lib_var=no") LIBS="$ac_save_LIBS" ])dnl if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then AC_MSG_RESULT(yes) ifelse([$4], , [changequote(, )dnl ac_tr_lib=HAVE_LIB`echo $1 | sed -e 's/[^a-zA-Z0-9_]/_/g' \ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'` changequote([, ])dnl AC_DEFINE_UNQUOTED($ac_tr_lib) LIBS="-l$1 $LIBS" ], [$4]) else AC_MSG_RESULT(no) ifelse([$5], , , [$5 ])dnl fi ]) dnl Should we try and detect the GD libs? if test x$TRYGD = xyep; then dnl libiconv is required on some systems - tack it on if found AC_CHECK_LIB(iconv,main,ICONV=-liconv,) dnl See if the GD lib is available and supports PNG images... dnl GD > 1.8.3 requires the TrueType library to be present as well, so test for that first... JMD_CHECK_LIB_ORDER(gd,gdImagePng,1,[ GDLIBFOUND=yep GDLIBS="-lgd -lttf -lpng -ljpeg -lz -lm" ],:,[-lttf -lpng -ljpeg -lz -lm]) dnl GD > 1.8.1 requires the jpeg library to be present as well, so test for that... if test x$GDLIBFOUND = x; then JMD_CHECK_LIB_ORDER(gd,gdImagePng,2,[ GDLIBFOUND=yep GDLIBS="-lgd $ICONV -lpng -ljpeg -lz -lm" ],:,[$ICONV -lpng -ljpeg -lz -lm]) fi dnl If we failed the first test, try without jpeg library if test x$GDLIBFOUND = x; then JMD_CHECK_LIB_ORDER(gd,gdImagePng,3,[ GDLIBFOUND=yep GDLIBS="-lgd $ICONV -lz -lm -lpng" ],:,[$ICONV -lz -lm -lpng]) fi dnl We failed again, so try a different library ordering (without jpeg libs) if test x$GDLIBFOUND = x; then JMD_CHECK_LIB_ORDER(gd,gdImagePng,4,[ GDLIBFOUND=yep GDLIBS="-lgd $ICONV -lpng -lz -lm" ],:,[$ICONV -lpng -lz -lm]) fi dnl Did we find the necessary GD libraries? if test x$GDLIBFOUND = x; then echo "" echo "" echo "*** GD, PNG, and/or JPEG libraries could not be located... *********" echo "" echo "Boutell's GD library is required to compile the statusmap, trends" echo "and histogram CGIs. Get it from http://www.boutell.com/gd/, compile" echo "it, and use the --with-gd-lib and --with-gd-inc arguments to specify" echo "the locations of the GD library and include files." echo "" echo "NOTE: In addition to the gd-devel library, you'll also need to make" echo " sure you have the png-devel and jpeg-devel libraries installed" echo " on your system." echo "" echo "NOTE: After you install the necessary libraries on your system:" echo " 1. Make sure /etc/ld.so.conf has an entry for the directory in" echo " which the GD, PNG, and JPEG libraries are installed." echo " 2. Run 'ldconfig' to update the run-time linker options." echo " 3. Run 'make clean' in the Nagios distribution to clean out" echo " any old references to your previous compile." echo " 4. Rerun the configure script." echo "" echo "NOTE: If you can't get the configure script to recognize the GD libs" echo " on your system, get over it and move on to other things. The" echo " CGIs that use the GD libs are just a small part of the entire" echo " Nagios package. Get everything else working first and then" echo " revisit the problem. Make sure to check the nagios-users" echo " mailing list archives for possible solutions to GD library" echo " problems when you resume your troubleshooting." echo "" echo "********************************************************************" echo "" echo "" dnl We found the GD lib! else echo "GD library was found!" if test x$TRYSTATUSMAP = xyep; then AC_DEFINE_UNQUOTED(USE_STATUSMAP,,[defined if the user chose to include status map]) CGIEXTRAS="$CGIEXTRAS statusmap.cgi" AC_CHECK_LIB(gd,gdImageCreateTrueColor, AC_DEFINE(HAVE_GDIMAGECREATETRUECOLOR,1, [Define if your gd library has gdImageCreateTrueColor])) fi dnl compile trends CGI AC_DEFINE_UNQUOTED(USE_TRENDS,,[compile trends CGI]) CGIEXTRAS="$CGIEXTRAS trends.cgi" dnl compile histogram CGI AC_DEFINE_UNQUOTED(USE_HISTOGRAM,,[compile histogram CGI]) CGIEXTRAS="$CGIEXTRAS histogram.cgi" fi fi AC_ARG_WITH(cgiurl, AC_HELP_STRING([--with-cgiurl=], [sets URL for cgi programs (do not use a trailing slash)]), cgiurl=$withval, cgiurl=/nagios/cgi-bin ) AC_ARG_WITH(htmurl, AC_HELP_STRING([--with-htmurl=], [sets URL for public html]), htmurl=$withval, htmurl=/nagios ) AC_SUBST(htmurl) AC_SUBST(cgiurl) USE_NANOSLEEP=yes AC_ARG_ENABLE(nanosleep, AC_HELP_STRING([--enable-nanosleep], [enables use of nanosleep (instead of sleep) in event timing]), USE_NANOSLEEP=$enableval, USE_NANOSLEEP=yes ) if test x$USE_NANOSLEEP = xyes; then AC_DEFINE_UNQUOTED(USE_NANOSLEEP,,[enables use of nanosleep (instead of sleep)]) fi USE_EVENTBROKER=yes AC_ARG_ENABLE(event-broker, AC_HELP_STRING([--enable-event-broker], [enables integration of event broker routines]), USE_EVENTBROKER=$enableval, USE_EVENTBROKER=yes ) BROKER_LDFLAGS="" BROKERLIBS=""; some_dl_found="no"; if test x$USE_EVENTBROKER = xyes; then dnl Which loader library should we use? libtdl or dl? dnl Hopefully this will be portable and not give us headaches... AC_CHECK_HEADER(ltdl.h,[ AC_CHECK_LIB(ltdl,lt_dlinit,[ AC_DEFINE(HAVE_LTDL_H,,[Which loader library should we use? libtdl or dl?]) some_dl_found="yes" BROKERLIBS="$BROKERLIBS -lltdl" ]) ]) if test "x$some_dl_found" != xyes; then AC_CHECK_HEADER(dlfcn.h,[ AC_CHECK_LIB(dl,dlopen,[ AC_DEFINE(HAVE_DLFCN_H,,[Which loader library should we use? libtdl or dl?]) some_dl_found="yes" BROKERLIBS="$BROKERLIBS -ldl" ]) ]) fi dnl - Modified from www.erlang.org # Check how to export functions from the broker executable, needed # when dynamically loaded drivers are loaded (so that they can find # broker functions). # OS'es with ELF executables using the GNU linker (Linux and recent *BSD, # in rare cases Solaris) typically need '-Wl,-export-dynamic' (i.e. pass # -export-dynamic to the linker - also known as -rdynamic and some other # variants); some sysVr4 system(s) instead need(s) '-Wl,-Bexport'. # AIX 4.x (perhaps only for x>=2) wants -Wl,-bexpall,-brtl and doesn't # reliably return an error for others, thus we separate it out. # Otherwise we assume that if the linker accepts the flag, it is needed. AC_MSG_CHECKING(for extra flags needed to export symbols) case $host_os in aix4*|aix5*) BROKER_LDFLAGS="$BROKER_LDFLAGS -Wl,-bexpall,-brtl" ;; bsdi*) BROKER_LDFLAGS="$BROKER_LDFLAGS -rdynamic" ;; *) save_ldflags="$LDFLAGS" LDFLAGS=-Wl,-export-dynamic AC_TRY_LINK(,,[BROKER_LDFLAGS="$BROKER_LDFLAGS -Wl,-export-dynamic"], [ LDFLAGS=-Wl,-Bexport AC_TRY_LINK(,,[BROKER_LDFLAGS="$BROKER_LDFLAGS -Wl,-Bexport"], AC_MSG_RESULT(none))]) LDFLAGS="$save_ldflags" ;; esac AC_SUBST(BROKER_LDFLAGS) AC_SUBST(BROKERLIBS) test "x$BROKER_LDFLAGS" != x && AC_MSG_RESULT([$BROKER_LDFLAGS]) dnl - Modified version from www.erlang.org dnl - Some 12/15/05 mods made after reading http://xaxxon.slackworks.com/phuku/dl.html AC_MSG_CHECKING(for linker flags for loadable modules) case $host_os in solaris2*|sysv4*) MOD_LDFLAGS="-G" MOD_CFLAGS="-fPIC" ;; aix4*|aix5*) #MOD_LDFLAGS="-G -bnoentry -bexpall" MOD_LDFLAGS="-G -bM:SRE -bnoentry -bexpall" ;; freebsd2*) # Non-ELF GNU linker MOD_LDFLAGS="-Bshareable" ;; darwin*) # Mach-O linker, a shared lib and a loadable # object file is not the same thing. MOD_LDFLAGS="-bundle -flat_namespace -undefined suppress" MOD_CFLAGS="$MOD_CFLAGS -fno-common" ;; linux* | k*bsd*-gnu*) # assume GNU linker and ELF MOD_LDFLAGS="-shared" MOD_CFLAGS="-fPIC" ;; *bsd*) MOD_LDFLAGS="-shared" MOD_CFLAGS="-fPIC" ;; *) # assume GNU linker and ELF MOD_LDFLAGS="-shared" ;; esac AC_MSG_RESULT([$MOD_LDFLAGS]) AC_SUBST(MOD_CFLAGS) AC_SUBST(MOD_LDFLAGS) dnl - flags for compiling workers WORKER_CFLAGS="-I ../../include -I ../.." WORKER_LDFLAGS="-L ../../lib -l nagios" AC_SUBST(WORKER_CFLAGS) AC_SUBST(WORKER_LDFLAGS) AC_DEFINE_UNQUOTED(USE_EVENT_BROKER,,[defined to bring in the event broker objects]) BROKER_O="broker.o nebmods.o" AC_SUBST(BROKER_O) BROKER_H="../include/broker.h ../include/nebmods.h ../include/nebmodules.h ../include/nebcallbacks.h ../include/neberrors.h" AC_SUBST(BROKER_H) fi dnl Option for compiling under CYGWIN nagios_name=nagios nagiostats_name=nagiostats cygwin=no AC_ARG_ENABLE(cygwin, AC_HELP_STRING([--enable-cygwin], [enables building under the CYGWIN environment]), [cygwin=$enableval] ) if test x$cygwin = xyes; then CFLAGS="${CFLAGS} -DCYGWIN" nagios_name=nagios.exe; nagiostats_name=nagiostats.exe; fi AC_SUBST(nagios_name) AC_SUBST(nagiostats_name) dnl Should predictive failure routines be compiled in? dnl AC_ARG_ENABLE(failure-prediction,--enable-failure-prediction will enable integration with failure prediction module (NOT HERE YET!),[ dnl AC_DEFINE_UNQUOTED(PREDICT_FAILURES) dnl BASEEXTRALIBS="$BASEEXTRALIBS \$(FDATALIBS)" dnl echo "Failure prediction routines (incomplete!) will be compiled in..." dnl ]) dnl Find traceroute AC_PATH_PROG(PATH_TO_TRACEROUTE,traceroute) AC_DEFINE_UNQUOTED(TRACEROUTE_COMMAND,"$PATH_TO_TRACEROUTE",[traceroute command to use]) dnl Package directory for Solaris pkgmk (and other OSs, eventually) dnl VERSION=`grep 1.0 include/common.h | cut -d ' ' -f 3 | sed 's/"//g'` VERSION=$PKG_VERSION PACKDIR=`pwd`/pkg AC_SUBST(PACKDIR) AC_SUBST(VERSION) AC_MSG_CHECKING(for type va_list) AC_TRY_COMPILE([#ifdef __STDC__ #include #include #include #else #include #include #include #endif], [va_list args;], [AC_MSG_RESULT(yes)], [AC_DEFINE(NEED_VA_LIST,,[defined if va_list fails to compile]) AC_MSG_RESULT(no)]) dnl Check if we should build local libtap dnl From Nagios Plugins dnl Have disabled autodetection of system library until later AC_ARG_ENABLE(libtap, AC_HELP_STRING([--enable-libtap], [Enable built-in libtap for unit-testing (default: no).]), [enable_libtap=$enableval], [enable_libtap=no]) #Disabled for moment #AM_CONDITIONAL([USE_LIBTAP_LOCAL],[test "$enable_libtap" = "yes"]) # Disabled for moment # If not local, check if we can use the system one #if test "$enable_libtap" != "yes" ; then # dnl Check for libtap, to run perl-like tests # AC_CHECK_LIB(tap, plan_tests, # enable_libtap="yes" # ) #fi # Finally, define tests if we use libtap if test "$enable_libtap" = "yes" ; then AC_CONFIG_SUBDIRS([tap]) USE_LIBTAP=yes else USE_LIBTAP=no fi AC_SUBST(USE_LIBTAP) AC_SUBST(CGIEXTRAS) AC_SUBST(GDLIBS) AC_SUBST(BASEEXTRALIBS) AC_SUBST(INITDIR) AC_SUBST(USE_EVENTBROKER) AC_PATH_PROG(PERL,perl) if test -z "$PERL"; then AC_MSG_ERROR([Cannot continue without perl!]) fi AC_PATH_PROG(UNZIP,unzip) if test -z "$UNZIP"; then AC_MSG_ERROR([Cannot continue without unzip!]) fi AC_OUTPUT(Makefile lib/Makefile subst pkginfo base/Makefile common/Makefile contrib/Makefile cgi/Makefile html/Makefile module/Makefile worker/Makefile worker/ping/Makefile xdata/Makefile daemon-init openrc-init t/Makefile t-tap/Makefile) perl subst include/locations.h perl subst html/config.inc.php echo "" echo "Creating sample config files in sample-config/ ..." perl subst sample-config/nagios.cfg perl subst sample-config/cgi.cfg perl subst sample-config/resource.cfg perl subst sample-config/httpd.conf perl subst sample-config/mrtg.cfg perl subst sample-config/template-object/templates.cfg perl subst sample-config/template-object/commands.cfg perl subst sample-config/template-object/timeperiods.cfg perl subst sample-config/template-object/contacts.cfg perl subst sample-config/template-object/localhost.cfg perl subst sample-config/template-object/windows.cfg perl subst sample-config/template-object/printer.cfg perl subst sample-config/template-object/switch.cfg dnl Review options echo "" echo "" AC_MSG_RESULT([*** Configuration summary for $PKG_NAME $PKG_VERSION $PKG_REL_DATE ***:]) echo "" echo " General Options:" echo " -------------------------" AC_MSG_RESULT([ Nagios executable: $nagios_name]) AC_MSG_RESULT([ Nagios user/group: $nagios_user,$nagios_grp]) AC_MSG_RESULT([ Command user/group: $command_user,$command_grp]) if test x$USE_EVENTBROKER = xyes; then AC_MSG_RESULT([ Event Broker: yes]) else AC_MSG_RESULT([ Event Broker: no]) fi AC_MSG_RESULT([ Install \${prefix}: $prefix]) incdir=`eval echo $includedir` if test x$incdir = x$prefix/include; then includedir=$prefix/include/nagios fi AC_MSG_RESULT([ Install \${includedir}: $includedir]) AC_MSG_RESULT([ Lock file: $lockfile]) AC_MSG_RESULT([ Check result directory: $CHECKRESULTDIR]) AC_MSG_RESULT([ Init directory: $init_dir]) AC_MSG_RESULT([ Apache conf.d directory: $HTTPD_CONF]) AC_MSG_RESULT([ Mail program: $MAIL_PROG]) AC_MSG_RESULT([ Host OS: $host_os]) AC_MSG_RESULT([ IOBroker Method: $IOBROKER_METHOD]) echo "" echo " Web Interface Options:" echo " ------------------------" AC_MSG_RESULT([ HTML URL: http://localhost$htmurl/]) AC_MSG_RESULT([ CGI URL: http://localhost$cgiurl/]) AC_MSG_RESULT([ Traceroute (used by WAP): $PATH_TO_TRACEROUTE]) echo "" echo "" echo "Review the options above for accuracy. If they look okay," echo "type 'make all' to compile the main program and CGIs." echo "" nagios-4.3.4/contrib/000077500000000000000000000000001314764422400144515ustar00rootroot00000000000000nagios-4.3.4/contrib/.gitignore000066400000000000000000000000611314764422400164360ustar00rootroot00000000000000Makefile convertcfg daemon-chk.cgi nagios-worker nagios-4.3.4/contrib/Makefile.in000066400000000000000000000060641314764422400165240ustar00rootroot00000000000000############################### # Makefile for contrib software # # Last Modified: 05-19-2008 ############################### CC=@CC@ CFLAGS=-I.. @CFLAGS@ @DEFS@ LDFLAGS=@LDFLAGS@ @LIBS@ # Source code directories SRC_INCLUDE=../include SRC_COMMON=../common SRC_CGI=../cgi SRC_LIB=../lib # Generated automatically from configure script SNPRINTF_O=@SNPRINTF_O@ INSTALL=@INSTALL@ INSTALL_OPTS=@INSTALL_OPTS@ prefix=@prefix@ exec_prefix=@exec_prefix@ CGIDIR=@sbindir@ BINDIR=@bindir@ CGIS=traceroute.cgi daemonchk.cgi UTILS=convertcfg ALL=$(CGIS) $(UTILS) CGI_C=$(SRC_CGI)/getcgi.c CGI_O=$(SRC_CGI)/getcgi.o $(SNPRINTF_O) CGI_H=$(SRC_INCLUDE)/getcgi.h COMMON_H=$(SRC_INCLUDE)/config.h $(SRC_INCLUDE)/common.h $(SRC_INCLUDE)/locations.h ############################################################################## # standard targets (all, clean, distclean, devclean, install) all: $(ALL) clean: rm -f convertcfg daemonchk.cgi core *.o rm -f */*/*~ rm -f */*~ rm -f *~ rm -rf rpmbuild *.rpm distclean: clean rm -f Makefile devclean: distclean install: $(INSTALL) -m 775 $(INSTALL_OPTS) -d $(DESTDIR)$(CGIDIR) $(INSTALL) -m 775 $(INSTALL_OPTS) -d $(DESTDIR)$(BINDIR) for f in $(CGIS); do $(INSTALL) -m 775 $(INSTALL_OPTS) $$f $(DESTDIR)$(CGIDIR); done for f in $(UTILS); do $(INSTALL) -m 775 $(INSTALL_OPTS) $$f $(DESTDIR)$(BINDIR); done ############################################################################## # rules and dependencies for actual target programs $(SRC_LIB)/libnagios.a: make -C $(SRC_LIB) libnagios.a daemonchk.cgi: daemonchk.o $(CGI_O) $(CGI_H) $(COMMON_H) $(SRC_LIB)/libnagios.a $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(CGI_O) $(SRC_LIB)/libnagios.a daemonchk.o: daemonchk.c $(CC) $(CFLAGS) -c -o $@ $< -I$(SRC_INCLUDE) nagios-worker: nagios-worker.c $(CC) $(CFLAGS) -o $@ $< $(LDFLAGS) $(LIBS) $(SRC_LIB)/libnagios.a ############################################################################## # dependencies $(CGI_O): $(CGI_C) cd $(SRC_CGI) && make $(CGI_O) ############################################################################## # implicit rules %.cgi : %.c $(CC) $(CFLAGS) $(LDFLAGS) $< $(CGI_O) -o $@ ############################################################################## # rpm making automation for CentOS/RHEL. ARCH ?= $(shell arch) ifeq ($(ARCH),x86_64) RPM_ARCH := x86_64 else ifeq ($(ARCH),i686) RPM_ARCH := i386 else $(error Unknown arch "$(ARCH)".) endif endif rpm: # create nagios tar ball. @(cd ..;rm -f nagios-@VERSION@) @(cd ..;ln -s . nagios-@VERSION@) @(cd ..;tar zhcf nagios-@VERSION@.tar.gz --exclude nagios-@VERSION@/nagios-@VERSION@.tar.gz --exclude nagios-@VERSION@/nagios-@VERSION@ --exclude RCS --exclude CVS --exclude build-* --exclude *~ --exclude .git* nagios-@VERSION@/) @(cd ..;rm -f nagios-@VERSION@) # build the rpm using rpmbuild from ./rmbuild as topdir @rm -rf rpmbuild && mkdir -p rpmbuild/SOURCES @cp ../nagios-@VERSION@.tar.gz rpmbuild/SOURCES/nagios-@VERSION@.tar.gz @rpmbuild -ba --define "_topdir ${PWD}/rpmbuild" ../nagios.spec @mv rpmbuild/RPMS/$(RPM_ARCH)/*.rpm . @ls -l *.rpm nagios-4.3.4/contrib/README000066400000000000000000000024051314764422400153320ustar00rootroot00000000000000##################### Nagios Contrib README ##################### This directory contains various programs, scripts, etc. that have been contribed by various people. Read the source code if you want to find who did what. Here is a description of what you'll find... Conversion Programs: -------------------- - convertcfg.c is a program to quickly convert old "host" config files to the new template-based object config files. It can also convert extended host information definitions. Type 'make convertcfg' to compile the utility. Additional CGIs: ---------------- - traceroute.cgi is (surprise) a CGI that allows you to do a traceroute to a specific IP address. Simply do a 'chmod +x' to make it executable and place it in the CGI directory (i.e. /usr/local/nagios/sbin). Requires Perl. - daemonchk.c is a CGI contributed by Karl DeBisschop that can test to see whether or not the Nagios process is running. Miscellaneous Goodies: ---------------------- - htaccess.sample is a *sample* .htaccess file that can be used with Apache to require password authentication for access to the web interface. - Automated rpm making. 1. ./configure # to generate contrib/Makefile 2. cd contrib ; make rpm 3. *.rpm will be generated in contrib directory. nagios-4.3.4/contrib/convertcfg.c000066400000000000000000000550261314764422400167650ustar00rootroot00000000000000/************************************************************************ * * CONVERTCFG.C - Config File Convertor * * Copyright (c) 2001-2005 Ethan Galstad (egalstad@nagios.org) * Last Modified: 08-12-2005 * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * ************************************************************************/ #include #include #include char *my_strsep(char **, const char *); int main(int argc, char **argv) { FILE *fp; char *temp_ptr; char *temp_ptr2; char input[8096]; int notify_recovery; int notify_warning; int notify_critical; int notify_down; int notify_unreachable; int option; int have_template = 0; int x = 0, y = 0; char *host_name; char *service_description; char *host_name2; char *service_description2; if(argc != 3) { printf("Nagios Config File Converter\n"); printf("Written by Ethan Galstad (egalstad@nagios.org)\n"); printf("Last Modified: 08-12-2005\n"); printf("\n"); printf("Usage: %s \n", argv[0]); printf("\n"); printf("Valid object types include:\n"); printf("\n"); printf("\ttimeperiods\n"); printf("\tcommands\n"); printf("\tcontacts\n"); printf("\tcontactgroups\n"); printf("\thosts\n"); printf("\thostgroups\n"); printf("\thostgroupescalations\n"); printf("\tservices\n"); printf("\tservicedependencies\n"); printf("\tserviceescalations\n"); printf("\n"); printf("\thostextinfo\n"); printf("\tserviceextinfo\n"); printf("\n"); printf("Notes:\n"); printf("\n"); printf("This utility is designed to aide you in converting your old 'host'\n"); printf("config file(s) to the new template-based config file style. It is\n"); printf("also capable of converting extended host and service information\n"); printf("definitions in your old CGI config file.\n"); printf("\n"); printf("Supply the name of your old 'host' config file (or your old CGI config\n"); printf("file if you're converting extended host/service definitions) on the\n"); printf("command line, along with the type of object you would like to produce\n"); printf("a new config file for. Your old config file is not overwritten - new\n"); printf("configuration data is printed to standard output, so you can redirect it\n"); printf("wherever you like.\n"); printf("\n"); printf("Please note that you can only specify one type of object at a time\n"); printf("on the command line.\n"); printf("\n"); printf("IMPORTANT: This utility will generate Nagios 1.x compliant config files.\n"); printf("However, the config files are not totally compatible with Nagios 2.x, so\n"); printf("you will have to do some manual tweaking.\n"); printf("\n"); return -1; } fp = fopen(argv[1], "r"); if(fp == NULL) { printf("Error: Could not open file '%s' for reading.\n", argv[1]); return -1; } for(fgets(input, sizeof(input) - 1, fp); !feof(fp); fgets(input, sizeof(input) - 1, fp)) { /* skip blank lines and comments */ if(input[0] == '#' || input[0] == '\x0' || input[0] == '\n' || input[0] == '\r') continue; /* timeperiods */ if(strstr(input, "timeperiod[") && !strcmp(argv[2], "timeperiods")) { temp_ptr2 = &input[0]; temp_ptr = my_strsep(&temp_ptr2, "["); temp_ptr = my_strsep(&temp_ptr2, "]"); printf("# '%s' timeperiod definition\n", temp_ptr); printf("define timeperiod{\n"); /*printf("\tname\t\t%s\n",temp_ptr);*/ printf("\ttimeperiod_name\t%s\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";"); printf("\talias\t\t%s\n", temp_ptr + 1); temp_ptr = my_strsep(&temp_ptr2, ";"); if(temp_ptr != NULL && strcmp(temp_ptr, "")) printf("\tsunday\t\t%s\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";"); if(temp_ptr != NULL && strcmp(temp_ptr, "")) printf("\tmonday\t\t%s\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";"); if(temp_ptr != NULL && strcmp(temp_ptr, "")) printf("\ttuesday\t\t%s\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";"); if(temp_ptr != NULL && strcmp(temp_ptr, "")) printf("\twednesday\t%s\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";"); if(temp_ptr != NULL && strcmp(temp_ptr, "")) printf("\tthursday\t%s\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";"); if(temp_ptr != NULL && strcmp(temp_ptr, "")) printf("\tfriday\t\t%s\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";\r\n"); if(temp_ptr != NULL && strcmp(temp_ptr, "")) printf("\tsaturday\t%s\n", temp_ptr); printf("\t}\n\n\n"); } /* commands */ if(strstr(input, "command[") && !strcmp(argv[2], "commands")) { temp_ptr = strtok(input, "["); temp_ptr = strtok(NULL, "]"); printf("# '%s' command definition\n", temp_ptr); printf("define command{\n"); /*printf("\tname\t\t%s\n",temp_ptr);*/ printf("\tcommand_name\t%s\n", temp_ptr); temp_ptr = strtok(NULL, "\n"); printf("\tcommand_line\t%s\n", temp_ptr + 1); printf("\t}\n\n\n"); } /* contacts */ if(strstr(input, "contact[") && !strcmp(argv[2], "contacts")) { temp_ptr2 = &input[0]; temp_ptr = my_strsep(&temp_ptr2, "["); temp_ptr = my_strsep(&temp_ptr2, "]"); printf("# '%s' contact definition\n", temp_ptr); printf("define contact{\n"); /*printf("\tname\t\t\t\t%s\n",temp_ptr);*/ printf("\tcontact_name\t\t\t%s\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";"); printf("\talias\t\t\t\t%s\n", temp_ptr + 1); temp_ptr = my_strsep(&temp_ptr2, ";"); if(temp_ptr != NULL && strcmp(temp_ptr, "")) printf("\tservice_notification_period\t%s\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";"); if(temp_ptr != NULL && strcmp(temp_ptr, "")) printf("\thost_notification_period\t%s\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";"); notify_recovery = atoi(temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";"); notify_critical = atoi(temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";"); notify_warning = atoi(temp_ptr); option = 0; printf("\tservice_notification_options\t"); if(notify_recovery == 1 || notify_critical == 1 || notify_warning == 1) { if(notify_warning == 1) { printf("w,u"); option = 1; } if(notify_critical == 1) { if(option == 1) printf(","); printf("c"); option = 1; } if(notify_recovery == 1) { if(option == 1) printf(","); printf("r"); } } else printf("n"); printf("\n"); temp_ptr = my_strsep(&temp_ptr2, ";"); notify_recovery = atoi(temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";"); notify_down = atoi(temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";"); notify_unreachable = atoi(temp_ptr); option = 0; printf("\thost_notification_options\t"); if(notify_recovery == 1 || notify_down == 1 || notify_unreachable == 1) { if(notify_down == 1) { printf("d"); option = 1; } if(notify_unreachable == 1) { if(option == 1) printf(","); printf("u"); option = 1; } if(notify_recovery == 1) { if(option == 1) printf(","); printf("r"); } } else printf("n"); printf("\n"); temp_ptr = my_strsep(&temp_ptr2, ";"); if(temp_ptr != NULL && strcmp(temp_ptr, "")) printf("\tservice_notification_commands\t%s\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";"); if(temp_ptr != NULL && strcmp(temp_ptr, "")) printf("\thost_notification_commands\t%s\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";"); if(temp_ptr != NULL && strcmp(temp_ptr, "")) printf("\temail\t\t\t\t%s\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";\r\n"); if(temp_ptr != NULL && strcmp(temp_ptr, "")) printf("\tpager\t\t\t\t%s\n", temp_ptr); printf("\t}\n\n\n"); } /* contactgroups */ if(strstr(input, "contactgroup[") && !strcmp(argv[2], "contactgroups")) { temp_ptr = strtok(input, "["); temp_ptr = strtok(NULL, "]"); printf("# '%s' contact group definition\n", temp_ptr); printf("define contactgroup{\n"); /*printf("\tname\t\t\t%s\n",temp_ptr);*/ printf("\tcontactgroup_name\t%s\n", temp_ptr); temp_ptr = strtok(NULL, ";"); printf("\talias\t\t\t%s\n", temp_ptr + 1); temp_ptr = strtok(NULL, "\n"); printf("\tmembers\t\t\t%s\n", temp_ptr); printf("\t}\n\n\n"); } /* hosts */ if(strstr(input, "host[") && !strcmp(argv[2], "hosts")) { if(have_template == 0) { printf("# Generic host definition template\n"); printf("define host{\n"); printf("\tname\t\t\t\tgeneric-host\t; The name of this host template - referenced in other host definitions, used for template recursion/resolution\n"); printf("\tactive_checks_enabled\t\t1\t; Active host checks are enabled\n"); printf("\tpassive_checks_enabled\t\t1\t; Passive host checks are enabled/accepted\n"); printf("\tnotifications_enabled\t\t1\t; Host notifications are enabled\n"); printf("\tevent_handler_enabled\t\t1\t; Host event handler is enabled\n"); printf("\tflap_detection_enabled\t\t1\t; Flap detection is enabled\n"); printf("\tprocess_perf_data\t\t1\t; Process performance data\n"); printf("\tretain_status_information\t1\t; Retain status information across program restarts\n"); printf("\tretain_nonstatus_information\t1\t; Retain non-status information across program restarts\n"); printf("\n"); printf("\tregister\t\t\t0\t; DONT REGISTER THIS DEFINITION - ITS NOT A REAL HOST, JUST A TEMPLATE!\n"); printf("\t}\n\n"); have_template = 1; } temp_ptr2 = &input[0]; temp_ptr = my_strsep(&temp_ptr2, "["); temp_ptr = my_strsep(&temp_ptr2, "]"); printf("# '%s' host definition\n", temp_ptr); printf("define host{\n"); printf("\tuse\t\t\tgeneric-host\t\t; Name of host template to use\n\n"); printf("\thost_name\t\t%s\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";"); printf("\talias\t\t\t%s\n", temp_ptr + 1); temp_ptr = my_strsep(&temp_ptr2, ";"); printf("\taddress\t\t\t%s\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";"); if(temp_ptr != NULL && strcmp(temp_ptr, "")) printf("\tparents\t\t\t%s\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";"); if(temp_ptr != NULL && strcmp(temp_ptr, "")) printf("\tcheck_command\t\t%s\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";"); printf("\tmax_check_attempts\t%d\n", atoi(temp_ptr)); temp_ptr = my_strsep(&temp_ptr2, ";"); printf("\tnotification_interval\t%d\n", atoi(temp_ptr)); temp_ptr = my_strsep(&temp_ptr2, ";"); if(temp_ptr != NULL && strcmp(temp_ptr, "")) printf("\tnotification_period\t%s\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";"); notify_recovery = atoi(temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";"); notify_down = atoi(temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";"); notify_unreachable = atoi(temp_ptr); option = 0; printf("\tnotification_options\t"); if(notify_recovery == 1 || notify_down == 1 || notify_unreachable == 1) { if(notify_down == 1) { printf("d"); option = 1; } if(notify_unreachable == 1) { if(option == 1) printf(","); printf("u"); option = 1; } if(notify_recovery == 1) { if(option == 1) printf(","); printf("r"); } } else printf("n"); printf("\n"); temp_ptr = my_strsep(&temp_ptr2, ";\r\n"); if(temp_ptr != NULL && strcmp(temp_ptr, "")) printf("\tevent_handler\t\t%s\n", temp_ptr); printf("\t}\n\n\n"); } /* hostgroups */ if(strstr(input, "hostgroup[") && !strcmp(argv[2], "hostgroups")) { temp_ptr = strtok(input, "["); temp_ptr = strtok(NULL, "]"); printf("# '%s' host group definition\n", temp_ptr); printf("define hostgroup{\n"); /*printf("\tname\t\t%s\n",temp_ptr);*/ printf("\thostgroup_name\t%s\n", temp_ptr); temp_ptr = strtok(NULL, ";"); printf("\talias\t\t%s\n", temp_ptr + 1); temp_ptr = strtok(NULL, ";"); /*printf("\tcontact_groups\t%s\n",temp_ptr);*/ temp_ptr = strtok(NULL, "\n"); printf("\tmembers\t\t%s\n", temp_ptr); printf("\t}\n\n\n"); } /* services */ if(strstr(input, "service[") && !strcmp(argv[2], "services")) { if(have_template == 0) { printf("# Generic service definition template\n"); printf("define service{\n"); printf("\tname\t\t\t\tgeneric-service\t; The 'name' of this service template, referenced in other service definitions\n"); printf("\tactive_checks_enabled\t\t1\t; Active service checks are enabled\n"); printf("\tpassive_checks_enabled\t\t1\t; Passive service checks are enabled/accepted\n"); printf("\tparallelize_check\t\t1\t; Active service checks should be parallelized (disabling this can lead to major performance problems)\n"); printf("\tobsess_over_service\t\t1\t; We should obsess over this service (if necessary)\n"); printf("\tcheck_freshness\t\t\t0\t; Default is to NOT check service 'freshness'\n"); printf("\tnotifications_enabled\t\t1\t; Service notifications are enabled\n"); printf("\tevent_handler_enabled\t\t1\t; Service event handler is enabled\n"); printf("\tflap_detection_enabled\t\t1\t; Flap detection is enabled\n"); printf("\tprocess_perf_data\t\t1\t; Process performance data\n"); printf("\tretain_status_information\t1\t; Retain status information across program restarts\n"); printf("\tretain_nonstatus_information\t1\t; Retain non-status information across program restarts\n"); printf("\n"); printf("\tregister\t\t\t0\t; DONT REGISTER THIS DEFINITION - ITS NOT A REAL SERVICE, JUST A TEMPLATE!\n"); printf("\t}\n\n"); have_template = 1; } temp_ptr2 = &input[0]; temp_ptr = my_strsep(&temp_ptr2, "["); temp_ptr = my_strsep(&temp_ptr2, "]"); printf("# Service definition\n"); printf("define service{\n"); printf("\tuse\t\t\t\tgeneric-service\t\t; Name of service template to use\n\n"); printf("\thost_name\t\t\t%s\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";"); printf("\tservice_description\t\t%s\n", temp_ptr + 1); temp_ptr = my_strsep(&temp_ptr2, ";"); printf("\tis_volatile\t\t\t%d\n", atoi(temp_ptr)); temp_ptr = my_strsep(&temp_ptr2, ";"); printf("\tcheck_period\t\t\t%s\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";"); printf("\tmax_check_attempts\t\t%d\n", atoi(temp_ptr)); temp_ptr = my_strsep(&temp_ptr2, ";"); printf("\tnormal_check_interval\t\t%d\n", atoi(temp_ptr)); temp_ptr = my_strsep(&temp_ptr2, ";"); printf("\tretry_check_interval\t\t%d\n", atoi(temp_ptr)); temp_ptr = my_strsep(&temp_ptr2, ";"); if(temp_ptr != NULL && strcmp(temp_ptr, "")) printf("\tcontact_groups\t\t\t%s\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";"); printf("\tnotification_interval\t\t%d\n", atoi(temp_ptr)); temp_ptr = my_strsep(&temp_ptr2, ";"); if(temp_ptr != NULL && strcmp(temp_ptr, "")) printf("\tnotification_period\t\t%s\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";"); notify_recovery = atoi(temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";"); notify_critical = atoi(temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";"); notify_warning = atoi(temp_ptr); option = 0; printf("\tnotification_options\t\t"); if(notify_recovery == 1 || notify_critical == 1 || notify_warning == 1) { if(notify_warning == 1) { printf("w,u"); option = 1; } if(notify_critical == 1) { if(option == 1) printf(","); printf("c"); option = 1; } if(notify_recovery == 1) { if(option == 1) printf(","); printf("r"); } } else printf("n"); printf("\n"); temp_ptr = my_strsep(&temp_ptr2, ";"); if(temp_ptr != NULL && strcmp(temp_ptr, "")) printf("\tevent_handler\t\t%s\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";\r\n"); if(temp_ptr != NULL && strcmp(temp_ptr, "")) printf("\tcheck_command\t\t\t%s\n", temp_ptr); printf("\t}\n\n\n"); } /* hostgroup escalations */ if(strstr(input, "hostgroupescalation[") && !strcmp(argv[2], "hostgroupescalations")) { x++; temp_ptr2 = &input[0]; temp_ptr = my_strsep(&temp_ptr2, "["); temp_ptr = my_strsep(&temp_ptr2, "]"); printf("# Hostgroup '%s' escalation definition\n", temp_ptr); printf("define hostgroupescalation{\n"); printf("\thostgroup_name\t\t%s\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, "-"); printf("\tfirst_notification\t\t%d\n", atoi(temp_ptr + 1)); temp_ptr = my_strsep(&temp_ptr2, ";"); printf("\tlast_notification\t\t%d\n", atoi(temp_ptr)); temp_ptr = my_strsep(&temp_ptr2, ";"); printf("\tcontact_groups\t\t\t%s\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";\r\n"); printf("\tnotification_interval\t\t%d\n", atoi(temp_ptr)); printf("\t}\n\n\n"); } /* service escalations */ if(strstr(input, "serviceescalation[") && !strcmp(argv[2], "serviceescalations")) { x++; printf("# Serviceescalation definition\n"); printf("define serviceescalation{\n"); temp_ptr2 = &input[0]; temp_ptr = my_strsep(&temp_ptr2, "["); host_name = my_strsep(&temp_ptr2, ";"); service_description = my_strsep(&temp_ptr2, "]"); printf("\thost_name\t\t%s\n", host_name); printf("\tservice_description\t\t%s\n", service_description); temp_ptr = my_strsep(&temp_ptr2, "-"); printf("\tfirst_notification\t\t%d\n", atoi(temp_ptr + 1)); temp_ptr = my_strsep(&temp_ptr2, ";"); printf("\tlast_notification\t\t%d\n", atoi(temp_ptr)); temp_ptr = my_strsep(&temp_ptr2, ";"); printf("\tcontact_groups\t\t\t%s\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";\r\n"); printf("\tnotification_interval\t\t%d\n", atoi(temp_ptr)); printf("\t}\n\n\n"); } /* service dependencies */ if(strstr(input, "servicedependency[") && !strcmp(argv[2], "servicedependencies")) { temp_ptr2 = &input[0]; temp_ptr = my_strsep(&temp_ptr2, "["); host_name = my_strsep(&temp_ptr2, ";"); service_description = my_strsep(&temp_ptr2, "]"); host_name2 = my_strsep(&temp_ptr2, ";") + 1; service_description2 = my_strsep(&temp_ptr2, ";"); temp_ptr = my_strsep(&temp_ptr2, ";"); x++; printf("# Servicedependency definition\n"); printf("define servicedependency{\n"); printf("\thost_name\t\t\t%s\n", host_name2); printf("\tservice_description\t\t%s\n", service_description2); printf("\tdependent_host_name\t\t%s\n", host_name); printf("\tdependent_service_description\t%s\n", service_description); printf("\texecution_failure_criteria\t"); for(y = 0; temp_ptr[y] != '\x0'; y++) printf("%s%c", (y > 0) ? "," : "", temp_ptr[y]); if(y == 0) printf("n"); printf("\t; These are the criteria for which check execution will be suppressed\n"); temp_ptr = my_strsep(&temp_ptr2, ";\r\n"); printf("\tnotification_failure_criteria\t"); for(y = 0; temp_ptr[y] != '\x0'; y++) printf("%s%c", (y > 0) ? "," : "", temp_ptr[y]); if(y == 0) printf("n"); printf("\t; These are the criteria for which notifications will be suppressed\n"); printf("\t}\n\n\n"); } /* extended host info */ if(strstr(input, "hostextinfo[") && !strcmp(argv[2], "hostextinfo")) { temp_ptr2 = &input[0]; temp_ptr = my_strsep(&temp_ptr2, "["); temp_ptr = my_strsep(&temp_ptr2, "]"); printf("# '%s' hostextinfo definition\n", temp_ptr); printf("define hostextinfo{\n"); printf("\thost_name\t\t%s\t\t; The name of the host this data is associated with\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";"); if(temp_ptr + 1 != NULL && strcmp(temp_ptr + 1, "")) printf("\tnotes_url\t\t\t%s\n", temp_ptr + 1); temp_ptr = my_strsep(&temp_ptr2, ";"); if(temp_ptr != NULL && strcmp(temp_ptr, "")) printf("\ticon_image\t\t%s\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";"); if(temp_ptr != NULL && strcmp(temp_ptr, "")) printf("\tvrml_image\t\t%s\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";"); if(temp_ptr != NULL && strcmp(temp_ptr, "")) printf("\tstatusmap_image\t\t%s\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";"); if(temp_ptr != NULL && strcmp(temp_ptr, "")) printf("\ticon_image_alt\t\t%s\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";"); if(temp_ptr != NULL && strcmp(temp_ptr, "")) printf("\t2d_coords\t\t%s\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";\r\n"); if(temp_ptr != NULL && strcmp(temp_ptr, "")) printf("\t3d_coords\t\t%s\n", temp_ptr); printf("\t}\n\n\n"); } /* extended service info */ if(strstr(input, "serviceextinfo[") && !strcmp(argv[2], "serviceextinfo")) { temp_ptr2 = &input[0]; temp_ptr = my_strsep(&temp_ptr2, "["); temp_ptr = my_strsep(&temp_ptr2, ";"); printf("# serviceextinfo definition\n", temp_ptr); printf("define serviceextinfo{\n"); printf("\thost_name\t\t%s\t\t; The name of the service this data is associated with\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, "]"); printf("\tservice_description\t%s\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";"); if(temp_ptr + 1 != NULL && strcmp(temp_ptr + 1, "")) printf("\tnotes_url\t\t%s\n", temp_ptr + 1); temp_ptr = my_strsep(&temp_ptr2, ";"); if(temp_ptr != NULL && strcmp(temp_ptr, "")) printf("\ticon_image\t\t%s\n", temp_ptr); temp_ptr = my_strsep(&temp_ptr2, ";\r\n"); if(temp_ptr != NULL && strcmp(temp_ptr, "")) printf("\ticon_image_alt\t\t%s\n", temp_ptr); printf("\t}\n\n\n"); } } fclose(fp); return 0; } /* fixes compiler problems under Solaris, since strsep() isn't included */ /* this code is taken from the glibc source */ char *my_strsep(char **stringp, const char *delim) { char *begin, *end; begin = *stringp; if(begin == NULL) return NULL; /* A frequent case is when the delimiter string contains only one character. Here we don't need to call the expensive `strpbrk' function and instead work using `strchr'. */ if(delim[0] == '\0' || delim[1] == '\0') { char ch = delim[0]; if(ch == '\0') end = NULL; else { if(*begin == ch) end = begin; else end = strchr(begin + 1, ch); } } else /* Find the end of the token. */ end = strpbrk(begin, delim); if(end) { /* Terminate the token and set *STRINGP past NUL character. */ *end++ = '\0'; *stringp = end; } else /* No more delimiters; this is the last token. */ *stringp = NULL; return begin; } nagios-4.3.4/contrib/daemonchk.c000066400000000000000000000147701314764422400165570ustar00rootroot00000000000000#include "config.h" #include "common.h" #include "locations.h" #include "cgiutils.h" #include "getcgi.h" #ifdef HAVE_GETOPT_H #include #endif #include #define CHARLEN 256 #define max(a,b) ((a)>(b))?(a):(b) static void document_header(void); //static void document_footer(void); static int process_cgivars(void); static char *strscpy(char *dest, const char *src); static char *ssprintf(char *str, const char *fmt, ...); static void terminate(int result, const char *fmt, ...); static void get_expire_time_string(time_t *raw_time, char *buffer, int buffer_length); int main(int argc, char **argv) { FILE *fp; char *status_file = NULL; char *lock_file = NULL; char *proc_file = NULL; char input_buffer[CHARLEN]; int c, age, pid, testpid, found; int wt = -1; int ct = -1; struct stat statbuf; time_t current_time; #ifdef DEFAULT_STATUS_FILE status_file = strscpy(status_file, DEFAULT_STATUS_FILE); #else status_file = strscpy(status_file, "/var/log/nagios/status.log"); #endif #ifdef DEFAULT_LOCK_FILE lock_file = strscpy(lock_file, DEFAULT_LOCK_FILE); #else lock_file = strscpy(lock_file, "/tmp/nagios.lock"); #endif if(getenv("REQUEST_METHOD")) { process_cgivars(); document_header(); } else { /* get arguments */ while((c = getopt(argc, argv, "+c:w:s:l:")) != EOF) { switch(c) { case 'c': ct = atoi(optarg); break; case 'w': wt = atoi(optarg); break; case 's': status_file = optarg; break; case 'l': lock_file = optarg; break; } } } /* find status file, get lastmod time */ if(stat(status_file, &statbuf) == -1) { printf("NAGIOS CRITICAL - could not find status log: %s\n", status_file); exit(STATE_CRITICAL); } time(¤t_time); age = (int)(current_time - statbuf.st_mtime); /* find lock file. get pid if it exists */ if(stat(lock_file, &statbuf) == -1) { printf("NAGIOS CRITICAL - could not find lock file: %s\n", lock_file); exit(STATE_CRITICAL); } fp = fopen(lock_file, "r"); fscanf(fp, "%d", &pid); fclose(fp); proc_file = ssprintf(proc_file, "/proc/%d", pid); if(stat("/proc", &statbuf) == 0) { if(stat(proc_file, &statbuf) == -1) { printf("NAGIOS CRITICAL - could not find proc file: %s\n", proc_file); exit(STATE_CRITICAL); } } else if(snprintf(proc_file, CHARLEN - 1, "/bin/ps -o pid -p %d", pid) && (fp = popen(proc_file, "r")) != NULL) { fgets(input_buffer, CHARLEN - 1, fp); fgets(input_buffer, CHARLEN - 1, fp); if(sscanf(input_buffer, "%d", &testpid) == 1) { if(testpid != pid) { printf("NAGIOS CRITICAL - could not find process(1): %d\n", pid); exit(STATE_CRITICAL); } } } else if(snprintf(proc_file, CHARLEN - 1, "/bin/ps -eo pid") && (fp = popen(proc_file, "r")) != NULL) { found = FALSE; fgets(input_buffer, CHARLEN - 1, fp); while(fgets(input_buffer, CHARLEN - 1, fp)) { if(sscanf(input_buffer, "%d", &testpid) == 1) if(testpid == pid) found = TRUE; } if(!found) { printf("NAGIOS CRITICAL - could not find process(2): %d\n", pid); exit(STATE_CRITICAL); } } else if(snprintf(proc_file, CHARLEN - 1, "/bin/ps -Ao pid") && (fp = popen(proc_file, "r")) != NULL) { found = FALSE; fgets(input_buffer, CHARLEN - 1, fp); while(fgets(input_buffer, CHARLEN - 1, fp)) { if(sscanf(input_buffer, "%d", &testpid) == 1) if(testpid == pid) found = TRUE; } if(!found) { printf("NAGIOS CRITICAL - could not find process(2): %d\n", pid); exit(STATE_CRITICAL); } } if(ct > 0 && ct < age) { printf("NAGIOS CRITICAL - status written %d seconds ago\n", age); exit(STATE_CRITICAL); } else if(wt > 0 && wt < age) { printf("NAGIOS WARNING - status written %d seconds ago\n", age); exit(STATE_WARNING); } else { printf("NAGIOS ok - status written %d seconds ago\n", age); exit(STATE_OK); } } static void document_header(void) { char date_time[48]; time_t current_time; printf("Cache-Control: no-store\nPragma: no-cache\n"); time(¤t_time); get_expire_time_string(¤t_time, date_time, (int)sizeof(date_time)); printf("Last-Modified: %s\n", date_time); printf("Expires: %s\n", date_time); printf("Content-type: text/html\n\n"); printf("\n\nNagios Daemon Status\n\n"); printf("\n"); return; } static int process_cgivars(void) { char **variables; int error = FALSE; int x; variables = getcgivars(); for(x = 0; variables[x] != NULL; x++) { /* do some basic length checking on the variable identifier to prevent buffer overflows */ if(strlen(variables[x]) >= MAX_INPUT_BUFFER - 1) { continue; } } return error; } /* get date/time string used in META tags for page expiration */ static void get_expire_time_string(time_t *raw_time, char *buffer, int buffer_length) { time_t t; struct tm *tm_ptr; int day; int hour; int minute; int second; int year; char *weekdays[7] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; char *months[12] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; if(raw_time == NULL) time(&t); else t = *raw_time; tm_ptr = gmtime(&t); hour = tm_ptr->tm_hour; minute = tm_ptr->tm_min; second = tm_ptr->tm_sec; day = tm_ptr->tm_mday; year = tm_ptr->tm_year + 1900; snprintf(buffer, buffer_length, "%s, %d %s %d %02d:%02d:%02d GMT", weekdays[tm_ptr->tm_wday], day, months[tm_ptr->tm_mon], year, hour, minute, second); buffer[buffer_length - 1] = '\x0'; return; } static char *strscpy(char *dest, const char *src) { int len; if(src != NULL) len = strlen(src) + 1; else return dest; if(dest == NULL || strlen(dest) < len) dest = realloc(dest, len); if(dest == NULL) terminate(STATE_UNKNOWN, "failed realloc in strscpy\n"); strncpy(dest, src, len); return dest; } static char *ssprintf(char *str, const char *fmt, ...) { va_list ap; int nchars; int size; if(str == NULL) str = malloc(CHARLEN); if(str == NULL) terminate(STATE_UNKNOWN, "malloc failed in ssprintf"); size = max(strlen(str), CHARLEN); va_start(ap, fmt); while(1) { nchars = vsnprintf(str, size, fmt, ap); if(nchars > -1) if(nchars < size) { va_end(ap); return str; } else { size = nchars + 1; } else size *= 2; str = realloc(str, nchars + 1); if(str == NULL) terminate(STATE_UNKNOWN, "realloc failed in ssprintf"); } } static void terminate(int result, const char *fmt, ...) { va_list ap; va_start(ap, fmt); vprintf(fmt, ap); va_end(ap); exit(result); } nagios-4.3.4/contrib/eventhandlers/000077500000000000000000000000001314764422400173135ustar00rootroot00000000000000nagios-4.3.4/contrib/eventhandlers/disable_active_service_checks000077500000000000000000000014741314764422400252450ustar00rootroot00000000000000#!/bin/sh # Write a command to the Nagios command file to cause # it to disable active service checks. This can be # referred to as 'standby' mode in a redundant monitoring # environment. # Notes: # 1) This script is not intended to be used as an # event handler by itself. Instead, it is used by other # event handler scripts (like the redundancy examples). # 2) In order for Nagios to process any commands that # are written to the command file, you must enable # the check_external_commands option in the main # configuration file. printfcmd="/usr/bin/printf" CommandFile="/usr/local/nagios/var/rw/nagios.cmd" # get the current date/time in seconds since UNIX epoch datetime=`date +%s` # pipe the command to the command file `$printfcmd "[%i] STOP_EXECUTING_SVC_CHECKS\n" $datetime >> $CommandFile` nagios-4.3.4/contrib/eventhandlers/disable_notifications000077500000000000000000000013671314764422400236040ustar00rootroot00000000000000#!/bin/sh # Write a command to the Nagios command file to cause # it to disable host and service notifications # Notes: # 1) This script is not intended to be used as an # event handler by itself. Instead, it is used by other # event handler scripts (like the redundancy examples). # 2) In order for Nagios to process any commands that # are written to the command file, you must enable # the check_external_commands option in the main # configuration file. printfcmd="/usr/bin/printf" CommandFile="/usr/local/nagios/var/rw/nagios.cmd" # get the current date/time in seconds since UNIX epoch datetime=`date +%s` # pipe the command to the command file `$printfcmd "[%i] DISABLE_NOTIFICATIONS;%i\n" $datetime $datetime >> $CommandFile` nagios-4.3.4/contrib/eventhandlers/distributed-monitoring/000077500000000000000000000000001314764422400240205ustar00rootroot00000000000000nagios-4.3.4/contrib/eventhandlers/distributed-monitoring/obsessive_svc_handler000077500000000000000000000022331314764422400303200ustar00rootroot00000000000000#!/bin/sh # OBSESSIVE_SVC_HANDLER # Written by Ethan Galstad (nagios@nagios.org) # Last Modified: 07-19-2001 # # This script is intended to run as the OCSP command # on a distributed monitoring server. The script calls # submit_check_result_via_nsca to send the service check # results to the central monitoring server. # # Arguments: # $1 = host_name (Short name of host that the service is # associated with) # $2 = svc_description (Description of the service) # $3 = state_string (A string representing the status of # the given service - "OK", "WARNING", "CRITICAL" # or "UNKNOWN") # $4 = plugin_output (A text string that should be used # as the plugin output for the service checks) # # Location of the submit_check_result_via_nsca script SubmitCmd="/usr/local/nagios/libexec/eventhandlers/submit_check_result_via_nsca" # Convert the state string to the corresponding return code return_code=-1 case "$3" in OK) return_code=0 ;; WARNING) return_code=1 ;; CRITICAL) return_code=2 ;; UNKNOWN) return_code=3 ;; esac # Send the service check results to the central monitoring server $SubmitCmd "$1" "$2" $return_code "$4" nagios-4.3.4/contrib/eventhandlers/distributed-monitoring/submit_check_result_via_nsca000077500000000000000000000023001314764422400316420ustar00rootroot00000000000000#!/bin/sh # SUBMIT_CHECK_RESULT_VIA_NSCA # Written by Ethan Galstad (egalstad@nagios.org) # Last Modified: 10-15-2008 # # This script will send passive check results to the # nsca daemon that runs on the central Nagios server. # If you simply want to submit passive checks from the # same machine that Nagios is running on, look at the # submit_check_result script. # # Arguments: # $1 = host_name (Short name of host that the service is # associated with) # $2 = svc_description (Description of the service) # $3 = return_code (An integer that determines the state # of the service check, 0=OK, 1=WARNING, 2=CRITICAL, # 3=UNKNOWN). # $4 = plugin_output (A text string that should be used # as the plugin output for the service check)s # # # Note: # Modify the NagiosHost parameter to match the name or # IP address of the central server that has the nsca # daemon running. printfcmd="/usr/bin/printf" NscaBin="/usr/local/nagios/libexec/send_nsca" NscaCfg="/usr/local/nagios/etc/send_nsca.cfg" NagiosHost="nagioshost" # Fire the data off to the NSCA daemon using the send_nsca script $printfcmd "%s\t%s\t%s\t%s\n" "$1" "$2" "$3" "$4" | $NscaBin -H $NagiosHost -c $NscaCfg # EOF nagios-4.3.4/contrib/eventhandlers/enable_active_service_checks000077500000000000000000000014731314764422400250670ustar00rootroot00000000000000#!/bin/sh # Write a command to the Nagios command file to cause # it to enable active service checks. This can be # referred to as 'active' mode in a redundant monitoring # environment. # Notes: # 1) This script is not intended to be used as an # event handler by itself. Instead, it is used by other # event handler scripts (like the redundancy examples). # 2) In order for Nagios to process any commands that # are written to the command file, you must enable # the check_external_commands option in the main # configuration file. printfcmd="/usr/bin/printf" CommandFile="/usr/local/nagios/var/rw/nagios.cmd" # get the current date/time in seconds since UNIX epoch datetime=`date +%s` # pipe the command to the command file `$printfcmd "[%i] START_EXECUTING_SVC_CHECKS\n" $datetime >> $CommandFile` nagios-4.3.4/contrib/eventhandlers/enable_notifications000077500000000000000000000013701314764422400234210ustar00rootroot00000000000000#!/bin/sh # Write a command to the Nagios command file to cause # it to enable host and service notifications # Notes: # 1) This script is not intended to be used as an # event handler by itself. Instead, it is used by other # event handler scripts (like the redundancy examples). # 2) In order for Nagios to process any commands that # are written to the command file, you must enable # the check_external_commands option in the main # configuration file. printfcmd="/usr/bin/printf" CommandFile="/usr/local/nagios/var/rw/nagios.cmd" # get the current date/time in seconds since UNIX epoch datetime=`date +%s` # pipe the command to the command file `$printfcmd "[%i] ENABLE_NOTIFICATIONS;%i\n" $datetime $datetime >> $CommandFile` nagios-4.3.4/contrib/eventhandlers/redundancy-scenario1/000077500000000000000000000000001314764422400233315ustar00rootroot00000000000000nagios-4.3.4/contrib/eventhandlers/redundancy-scenario1/handle-master-host-event000077500000000000000000000037661314764422400301110ustar00rootroot00000000000000#!/bin/sh # REDUNDANCY EVENT HANDLER SCRIPT # Written By: Ethan Galstad (egalstad@nagios.org) # Last Modified: 02-19-2004 # # This is an example script for implementing redundancy. # Read the HTML documentation on redundant monitoring for more # information on what this does. # Location of the echo and mail commands echocmd="/bin/echo" mailcmd="/bin/mail" # Location of the event handlers eventhandlerdir="/usr/local/nagios/libexec/eventhandlers" # Only take action on hard host states... case "$2" in HARD) case "$1" in DOWN) # The master host has gone down! # We should now become the master host and take # over the responsibilities of monitoring the # network, so enable notifications... `$eventhandlerdir/enable_notifications` # Notify someone of what has happened with the original # master server and our taking over the monitoring # responsibilities. No one was notified of the master # host going down, since the notification would have # occurred while we were in standby mode, so this is a good idea... #`$echocmd "Master Nagios host is down!" | /bin/mail -s "Master Nagios Host Is Down" root@localhost` #`$echocmd "Slave Nagios host has entered ACTIVE mode and taken over network monitoring responsibilities!" | $mailcmd -s "Slave Nagios Host Has Entered ACTIVE Mode" root@localhost` ;; UP) # The master host has recovered! # We should go back to being the slave host and # let the master host do the monitoring, so # disable notifications... `$eventhandlerdir/disable_notifications` # Notify someone of what has happened. Users were # already notified of the master host recovery because we # were in active mode at the time the recovery happened. # However, we should let someone know that we're switching # back to standby mode... #`$echocmd "The master Nagios host has recovered, so the slave Nagios host has returned to standby mode..." | $mailcmd -s "Slave Nagios Host Has Returned To STANDBY Mode" root@localhost` ;; esac ;; esac exit 0 nagios-4.3.4/contrib/eventhandlers/redundancy-scenario1/handle-master-proc-event000077500000000000000000000023201314764422400300600ustar00rootroot00000000000000#!/bin/sh # REDUNDANCY EVENT HANDLER SCRIPT # Written By: Ethan Galstad (egalstad@nagios.org) # Last Modified: 05-30-2006 # # This is an example script for implementing redundancy. # Read the HTML documentation on redundant monitoring for more # information on what this does. # Location of the echo and mail commands echocmd="/bin/echo" mailcmd="/bin/mail" # Location of the event handlers eventhandlerdir="/usr/local/nagios/libexec/eventhandlers" # Only take action on hard service states... case "$2" in HARD) case "$1" in CRITICAL) # The master Nagios process is not running! # We should now become the master host and # take over the responsibility of monitoring # the network, so enable active checks... `$eventhandlerdir/enable_active_service_checks` ;; WARNING|UNKNOWN) # The master Nagios process may or may not # be running.. We won't do anything here, but # to be on the safe side you may decide you # want the slave host to become the master in # these situations... ;; OK) # The master Nagios process running again! # We should go back to being the slave host, # so disable active checks `eventhandlerdir/disable_active_service_checks` ;; esac ;; esac exit 0 nagios-4.3.4/contrib/eventhandlers/submit_check_result000077500000000000000000000022401314764422400232750ustar00rootroot00000000000000#!/bin/sh # SUBMIT_CHECK_RESULT # Written by Ethan Galstad (egalstad@nagios.org) # Last Modified: 02-18-2002 # # This script will write a command to the Nagios command # file to cause Nagios to process a passive service check # result. Note: This script is intended to be run on the # same host that is running Nagios. If you want to # submit passive check results from a remote machine, look # at using the nsca addon. # # Arguments: # $1 = host_name (Short name of host that the service is # associated with) # $2 = svc_description (Description of the service) # $3 = return_code (An integer that determines the state # of the service check, 0=OK, 1=WARNING, 2=CRITICAL, # 3=UNKNOWN). # $4 = plugin_output (A text string that should be used # as the plugin output for the service check) # echocmd="/bin/echo" CommandFile="/usr/local/nagios/var/rw/nagios.cmd" # get the current date/time in seconds since UNIX epoch datetime=`date +%s` # create the command line to add to the command file cmdline="[$datetime] PROCESS_SERVICE_CHECK_RESULT;$1;$2;$3;$4" # append the command to the end of the command file `$echocmd $cmdline >> $CommandFile` nagios-4.3.4/contrib/exfoliation/000077500000000000000000000000001314764422400167725ustar00rootroot00000000000000nagios-4.3.4/contrib/exfoliation/images/000077500000000000000000000000001314764422400202375ustar00rootroot00000000000000nagios-4.3.4/contrib/exfoliation/images/NagiosEnterprises-whitebg-112x46.png000066400000000000000000000076341314764422400267150ustar00rootroot00000000000000PNG  IHDRp. tIME $ղ pHYs  ~gAMA a+IDATx pǯl!JoE)DK[],=-ZաZCB$ }rOޛLc2,[U*,,4 )))vvv1117o.((6mDrrrN:xgg`777C c>ܦM.]4lؐ┿{Ѿ/_L6kL1܊2lݺ5(֭KU,ХK ۫W/S.^^2J;ǎ+<'dQW<ѣO/WVm۶mq]-ZxeСޔ)SNo߾&LؠP'w7b;<>ץALm~k֬3xzR>c9q˖-+(TRRO֘)2/ dԷmVg}cǎ3fV<|Ps^A1ȩiՊ:&obTɿ[uYL2B8РAM={ȉ@%b͑#GǏ3tׯ:aդI$a aaaX^ 2/_jժ1ch'@UL 5ܹsxLM?\u{bb|Kҩ˒4cASB#˄4c4'aM91>>^Kj,qB AL RVqtڄH5l05ƫrZ fcPD ߖTkM "_MW:dȐFٿ?o%'d.e"58%jн`;4={6􀀀"Xj֬utt׶[B 1Lh6a>u;;;[=UYT3RR=!!B3À-NMR8Ъh1ЎPlPȂi1޽t/:СCrB0b p\&ʴYzn;DiCM .`ӕo6`>D'F}t)͛Gk-ltp R1`XBۛ-}{ #U QmcovM8Äp :І ':D\ُoQXYҰA3 =Zg:E|\f haXY3*\k3Ch}+ZeR=$_'< 8|TAԔ`:qai;uTE͢!>w\xBZ `D%9l .b T{0g Um[/)4;O%R)N}K R̖G"f5YmZ&MHYf?pVjrq-{ܹpyRE!!!;w , ly~?'BƝ0wwwX+Z;.E5~ZtK#l_ zNHqquq(oD(O߶SHљ\MіFTt*AS֟ XyY\L}6hyItBƘ~MKqE7B^Qژ)M`7;iyX3QČG,XҰ{iNz0ͱSg9n%;}NrF䢟ܝ= A9j3fh =5`T^~.s5raˏWj13ĭMv>y8wm{f6~?]>wuq.m@X;c)߫Qu.É켒_S^6k@#;)Y\9S3jж7{AZ]AׇOuCZQb$uE;#3Rs^K _#Z(b.EKQ 1N\O\| jr'~j:to\TvoY˛@F,phg{/5B1aG<qԜ"s ڲ4&!BRez~j{/pslީw_(Z-qx8gW.sdo?FZrq,B A`z6Ƒ.ǥdׅ;ΰ4W"ϴ )[OߩሒQh8N-e-jf ߬m2Dق8IyXbЖ5Em Xx?6lQh[ՠȌ~5*kZ9NU3c8ּI7;WH`U7Ţ >.U|[?~=ApdUR`ޠBXq4A$n"~Zzkogc"^Bi3%3,s n&6p5>ƓDM0!6WȶwS{;OQ'7c+m}1q={nJFswy%5IJjzY.'vIInp~X$fB( #Zq})UkDJT~ܮr|Ĵܬ4>Dܺ~|LVL~ĊĂľtb\Tb\Ƽ䴖Ė̴L^TVT\NTԴLNLdZ\ԮĺLVTlRT̼d^dtR\lfdTV\d^\ľtV\쬮ĺ켢N| ?Ot N'?>es||t pas- 8un fiԦcwhieGrw!,A 0()"A`eX ٭f4k + ]QcΚK +dȩ玌.`nY"\>pqJdg 'LkmFlW` h 4ѵL)%mlٖ}j!iZG bjBMӗt)%k|pP }A#Žk\LfRDJT~ܮr|Ĵܬ4>Dܺ~|LVL~ĊĂľtb\Tb\Ƽ䴖Ė̴L^TVT\NTԴLNLdZ\ԮĺLVTlRT̼d^dtR\lfdTV\d^\ľtV\쬮ĺ켢N| ?Ot N'?>es||t pas- 8un fiԦcwhieGrw!,A 0()"A`eX ٭f4k + ]QcΚK +dȩ玌.`nY"\>pqJdg 'LkmFlW` h 4ѵL)%mlٖ}j!iZG bjBMӗt)%k|pP }A#Žk\LfR+'#xt)LG;nagios-4.3.4/contrib/exfoliation/images/down.gif000066400000000000000000000015301314764422400216740ustar00rootroot00000000000000GIF89a 12h,ddd!, 5H "xā +6\XEqȒ$Ra@;nagios-4.3.4/contrib/exfoliation/images/downtime.gif000066400000000000000000000016451314764422400225620ustar00rootroot00000000000000GIF89a1dd 222!, H8x 00x8_ An<1俐FtdK?D.D9B8il3hK&IO%T)T`ƼZLT VԩD!>z¶p ;nagios-4.3.4/contrib/exfoliation/images/empty.gif000066400000000000000000000014471314764422400220720ustar00rootroot00000000000000GIF89a!,;nagios-4.3.4/contrib/exfoliation/images/enabled.gif000066400000000000000000000001321314764422400223140ustar00rootroot00000000000000GIF89a1T7!,+#CB8oi\&FPٜ&Y9Z;nagios-4.3.4/contrib/exfoliation/images/extinfo.gif000066400000000000000000000016171314764422400224070ustar00rootroot00000000000000GIF89a1!!!!!!)))!)))11)11)1111991JZ99!)911999BBBBBJRBZcJJJ11J9!J91JJJJRZR11RRRRRcRk{R{ZZZ!!ZB9ZZZZccZ{ccc!!c))cJJcR1cRBcZZccccssk99kJ1kRRkcRkkkkkskkkkks))ssss{{Ƅ99{kƌccƌ֔))!!))ZZc֥!!ZZccRRss!!!!1199!!99έεν11֥Ƶkk޽!!cc甔kkﭭﵵ!!))!!99BBJJRRkkss{{gd!,l]2@A*4C.|H!B)>dă9v(R#ȏ5LXR%D $R`K53ّnj87~iqϛ.m(Ҡ/Yujt"TV5;nagios-4.3.4/contrib/exfoliation/images/favicon.ico000066400000000000000000000014661314764422400223670ustar00rootroot00000000000000BM66(  OOOMMM??????FFFdddiiiPPP@@@GGGbbb^^^uuuvvviiiLLLJJJ]]]uuu}}}FFFEEEAAA333888 +++! 賲)'' >;< 655TUU688//.EEHEDG |}A@AOPN  uuvnagios-4.3.4/contrib/exfoliation/images/flapping.gif000066400000000000000000000024161314764422400225310ustar00rootroot00000000000000GIF89a===@N%'! NETSCAPE2.0!GifBuilder 1.1!d,5I 8k}ta9*C(؂gj?a^M'? ym! ,-I 8k} G)䣮*:c8Wy%N(m%! ,-I 8k} G)IO±쎡]J(Zm%! ,,I 8k} G)I*=p )L6k-]0w1J! ,,I 8k} G@;Xt= F1>K;nagios-4.3.4/contrib/exfoliation/images/graph.gif000066400000000000000000000023441314764422400220320ustar00rootroot00000000000000GIF89aL.4μTfdDNL|ND<^TԼ|̶Ě\JT\Z\dJTfl¼̮ļԼ6DJT~ܮr|Ĵܬ4>Dܺ~|LVL~ĊĂľtb\Tb\Ƽ䴖Ė̴L^TVT\NTԴLNLdZ\ԮĺLVTlRT̼d^dtR\lfdTV\d^\ľtV\쬮ĺ켢N| ?Ot N'?>es||t pas- 8un fiԦcwhieGrw!,A 0()"A`eX ٭f4k + ]QcΚK +dȩ玌.`nY"\>pqJdg 'LkmFlW` h 4ѵL)%mlٖ}j!iZG bjBMӗt)%k|pP }A#Žk\LfR""1$qqoojjiihhccPPsGGfEEcCC`00E!jjaaNNo!!/ |{mL<'  !, VH6@`.H &N BÁ6^ظх P܈+I89" %f|E"ıѣH* ;nagios-4.3.4/contrib/exfoliation/images/histogram.png000066400000000000000000000040111314764422400227360ustar00rootroot00000000000000PNG  IHDR@k%sRGB pHYs B4otEXtCommentCreation Time:Wed 3 May 2000 15:22:45 -0600 tIME chunklen 7 ignored: ASCII: ...... HEX: 07D2061E052E0Ep!tEXtSoftwareGraphicConverter (Intel)wIDATx10n 8eFȘQ2f cFȘQ2f cFȘQ2f cFȘQ2f cFȘQ2f sֱ a)dQ62 FF(`#ldQ62 FF(`#ldQ62 FF(ֱ a)dQ62 FF(`#ldQ62 FF(`#ldQ62 FF(ֱ a)dQ62 FF(`#ldQ62 FF(`#ldQ62 FF(ֱ a)dQ62 FF(`#ldQ62 FF(`#ldQ62 FF(ֱ a)dQ62 FF(`#ldQ62 FF(`#ldQ62 FF(ֱ a)dQ62 FF(`#ldQ62 FF(`#ldQ62 FF(ֱ a)dQ62 FF(`#ldQ62 FF(`#ldQ62 FF(ֱ a)dQ62 FF(`#ldQ62 FF(`#ldQ62 FF(ֱ a)dQ62 FF(`#ldQ62 FF(`#ldQ62 FF(ֱ a)dQ62 FF(`#ldQ62 FF(`#ldQ62 FF(ֱ a)dQ62 FF(`#ldQ62 FF(`#ldQ62 FF(ֱ a)dQ62 FF(`#ldQ62 FF(`#ldQ62 FF(ֱ a)dQ62 FF(`#ldQ62 FF(`#ldQ62 FF(ֱ a)dQ62 FF(`#ldQ62 &dDIENDB`nagios-4.3.4/contrib/exfoliation/images/history.gif000066400000000000000000000016231314764422400224310ustar00rootroot00000000000000GIF89a1!PDƾ>r!,p H*,Ç0ŋ@1#Ȉ(#N4˖&W~lI#̏S<ҦO1;YSɝ)e$ZѢE"E*G<.xT ;nagios-4.3.4/contrib/exfoliation/images/hostevent.gif000066400000000000000000000015551314764422400227530ustar00rootroot00000000000000GIF89a1!!))1199BBJJRRZZccss{{2h,!,J9H*\ @ @1rhP#LJ/ذdɈ&OVeG't J =\ȳO;nagios-4.3.4/contrib/exfoliation/images/info.png000066400000000000000000000006061314764422400217020ustar00rootroot00000000000000PNG  IHDRRsRGB pHYs  ~0PLTE-JJJ2MmtRNSރYptEXtCommentCreation Time:Mon 31 Dec 2001 11:56:53 -0600 tIME chunklen 7 ignored: ASCII: ...... HEX: 07D10C1F120002't?!tEXtSoftwareGraphicConverter (Intel)w2IDATxb(bc00g(TFD+&.n2R3ʡ-\TIENDB`nagios-4.3.4/contrib/exfoliation/images/left.gif000066400000000000000000000003131314764422400216550ustar00rootroot00000000000000GIF89a$ 1222!,$ x0I8ͻ`(a$gBb0!U]ܸd<Ba'(Ənh:Vg9Z)Kxbw\;\|v]V ]{nDHvB=,AE<=9';nagios-4.3.4/contrib/exfoliation/images/logofullsize.png000066400000000000000000000225071314764422400234710ustar00rootroot00000000000000PNG  IHDRL^N,tEXtCreation TimeSat 23 Jul 2011 15:23:53 -06006wtIME"'k pHYs  ~gAMA a$IDATxyxTE[eI D0l!Ha 1 EAAVQ  MaMAD2:Qp7|^vwPHx>ܮ[9ouz$7nذaԩSwyڵxGԩCBB (ߞ>}z۶m+WRJjժk׮3boPb:##bŊw}w…+-Z4..n@~9++k̙k.X]wu/^sO5@ 2(=Sί~f͚-\pӦMӧOOHHqxaÆ]t￧w}wݻwҥKwn޼HpٲeO?4\Anjׁڵk۵k4+.sϞ=ׯ_'׬Y?ZD^zhj[@-q+0~[2(Ύd r„ ֯_ԨQիWM2+Wi׿Aփ A._(m`l-X@oLLazjРA'x: J~o/F%KԿ%!}#VS 7))w"n m=ʠk-mA|۶m+Vjg>r䈱0pĕWPھg]ppΒ- V?$ɓhرcNE3yݵ[($1eoxgȁy䑴?FQf(/m K@] ؔ1Vܹ0{wFGG9|ԯ_KTM6ӧO2ekPEGۋ/1ٳUTCƍ{w+ݝA6~ R'߼OU\4\rv0dOѣG:4{}QŢ.+B 95V\yG N07@@Bٶm[;t,^`GE!~Sʂ̙317%%Zr/ر#xx 34o?5k4:KÇiX!;;{ĉKxoǏW0gΜ>};0D5@Fll;BdҥKw |#č)SL6qoփ>%TP/Wn2|S;sX_כoCs$] z*I&ܕזʵ(c6wOD-[`}vYpdd!i2vvK.:"kDpksoݺՓ .G<od%Xvc֬YL={2ԫ\.BIJt!($^n+ `Tl%J-WuP nWu{afTR0˗/f ݼysxѵWj}.^zm\DhѢ5źAB4iҜ9st,DеkW") ̝;WR "XbFXA+x>I킁=z~o޼O>Z+ !3abS9]"OIVlY7u. 64X]u ݻc 7*?>##xIU?EGG͘1OYti,xb|a\\-fh(T_|Eh%j @jG:ISRR:kqUzw̃dg ޶@블VxELTB.n￟hͧOZ*8 ǰ<\F${)C=q;9"p$Q*n I~%X30aʗ/;-N˗/Q5mON@%'d G KBݸqcAU\:~mP>E<.:7lc 4>{1ZYlOMM%sQfPz,r)T3|X3HsC P.@ܰaæMv/^X >Q%-BlٲEM"3TXnnݺĀ{ߜ8qPP۱cǘ{Sc=޹sgadLZ=V`Ah(%;2,YG:,w8PvyJ}QHN_jФz'-- DdKvZj3<G}Ṙ hܟDy҈Q7رcW\c~G JHz62d1I2rJTL[dA  駟¥~_իWw*p;)}Ocƌq[ocYZjhg_\Uz`71xmYf,89r,S#!WiɀΩO:JQՁ,Rf…t[nc~/ 0<]ȳ>+Í򗿐9B_t7laK=۠N@4! zF6%P@16͈ \p7ۡС[rI.D?8:݄mڴaP?YϮDȟj׮c߿_K WS1Lև~^~ecv*MJJȂ.\pCpt7{J SY!!R{E @1`ν{۷љ;v8+֯__/ pvGg}%[b x}ѣG;~Q!Ig{rРAr44&QHutȒIq$ipnBnrR:2.trhޕS0 ؤI , 3ڛ{Y"8I%\,!wާ+LM5J!OѣG)KX$KnZaK.FPb@YcbT{igɼ5&a8-{ނDLJx :tz>.!!/ ,P2(q~D"Hb:GÁ4č&Cěp#@-X]A8gϞi9 QQQFX{{uPŌ-YY^2>P*U0EA RR\\ƶBR-4|b ON||<ݳu5gcN(?~K#bH0܏l1cڰظpVސ;wUp- g (u8YBcb\fQ4 5TAWșV^o]!'8N:D# \0r!3+0:@ |CٱK T{faPyf9TiӦJMqg >p2trcd3C[qXYjCw}8 3ʗ/􇻈;-s@222ăR[gtTӮ"ؒdnS9 oժk-W(tX{!lpMz(J6)1R [ȪU<Eǎ!Cpiii$p/b,$Oq@w\!SDF |Io߂Я^ЧOkbå1 (z=5ִ.nQАxrX 0!dB4. y {-l+iOnܙ"۷> (W0mzzҥKJ5b:e˖3fpA`EgrLہ'0oBz۩ :I##(1G{2|R Lcz}עkK蠤Rl k|,p>IÌ7n|Ģ8%sk =s8o~ 0h1X׹ kzpDEETΈfΜ9bo> jժ@k׮ uBBBZp H3-9Ia /zsm.%3yBX Z5%skY)$;%::ܹsn.vb]TK/)ܠ,:u^'LeI6V\e^1cD$HS[+nG%θgy- y#GPaÆ# Wt+uȅa>>0 \顾?[@13 >xccc׬YENȠTyhfv /\ʘ4LA6lY_ƍ OL`PFH D I|[F n޼9J'QyI8v׾}{ @g 4*)L6R۷c 4nKtubgf ,B!ea٭:u@PRKy&DC ****11H]-1ݴil$++˹L@;w. + ._矇 "{:J:[!\ kQuL" >"LCM!Frj7]a@RJ8eYrʔ)zҿ7uB&AP<< W-()o iDx1EM*{NJJ޽;YX8y7s' 20('L"z,X |"XYcG LP ^2 4pD&!`h|<1Z ܣGrS`ĉC pʼ'-[v!ϋ$W2*򠓯:hȶDڲkGzD |?$x@-?qpzr[rʸL ]7G,GD ^+ 8Lq K#1-1G%Io9㖞-A? W رCO*eW^1. ŋPf2R1ڣ9.AcWlQA;vydϽǍ'''c_ḋeAi>W_zPn(mțy3wBSPnY$MƣȢ7 se-E%s &yV+ x]d^}sB|!X|n-!|q:ݳgAEo(4N eeeC?,!/)AZ9J;k֬٤I6_\ iz"8QQQApvz̍7TX1@DΓ=)%bHt<91Ɛl3xrahףXnv'ׇdYCXDӹ߇ǎ|< \+UcժU |߆ 4YL^IΗ#7Y3AkgddȹxDҰ%lӦSO=Ul;q|8ر#C>rvQxZL ҏ;w.55uڵD a¿Noxn9522P˚5k6Ϯ;f*`ɓ'H֭[O&zGHɒ%4\ HS kr8īB ժU+Vɓrr]o]hQBB#<5qX$,qޱNʁJtI7<9%3}yF2U *T}q>%&&)S|Eۦ (]F?!ua5_~رʛ/^\lIW_>}̙3W\ȍzѢEhDff&B5k(֭;|0L׷s-Fx!hH"UJڒ=R{az> .-[;:7y6 gw=جY3f] noAi0o34 .Tv?;)))xٳgtЭ[6hЀ\Ze)Rz Iz+Tc=Oz[e]SIwL/3xfgHfL> r*&?} ^/uر 䜢?q;ĭ%K;ݎ+rDmUAi@Pr![dITTznܹ\c,9&g#:S{P0_@?x \ꇎҥK3JzC<$JW R{u<-_! 6lHKKS\F(o@?~-($ V35Ex\ɯX+(kI[hsb0 }3yBҮ]Yf)dڵkSNݶm[ʕxp+Aθ8N$fƍ7?/\0iҤ#GS3m>~PՈ!73;nݺ43g4ЗD~Mμ^ׂ?~ۯdx*#n X)CҺukDuYر?g8ڳg;3$^V ={?#ɾOSc7i҄|ȮD~QPrĈ)k7|p}tL2F{NAPR0* qƻvRv\~`mYbEe,jOSǏ=Ϧ!l9u4CUr)n (s!+`ϳAN MʏZxH%܎;E Z"e7(qLo[PN#7" tO 2(N)$ʠ; 2(N J Hj]iIENDB`nagios-4.3.4/contrib/exfoliation/images/logos/000077500000000000000000000000001314764422400213625ustar00rootroot00000000000000nagios-4.3.4/contrib/exfoliation/images/logos/aix.gd2000066400000000000000000000045251314764422400225470ustar00rootroot00000000000000gd2(( 3f3333f333ff3fffff3f3f̙3f3333f3333333333f3333333f3f33ff3f3f3f3333f3333333f3̙333333f333ff3ffffff3f33f3ff3f3f3ffff3fffffffffff3fffffff3fff̙ffff3fffff3f̙3333f33̙3ff3ffff̙f3f̙3f̙̙3f̙3f3333f333ff3fffff̙̙3̙f̙̙̙3f̙3f3f3333f333ff3fffff3f3f̙3f׬׬- ׬- ׬- ׬ 2 ׬- , ׬- , P, -2 ɴJ ׻ дVVVV ɴyV ׻2 ]cʴ̨ 88 ^׬tm 88  ׬-,JV 88  ׬-, ,2 88  ׬- mm ̨- , 88 ׬- J ṃ V 88 ׂ PJPPm,2 88 -^ ṃ 88 -ׁV 88 -ɴJ 8 -׻  88 -д ,  8 -ɴJ Jm 88 -ׂ  88-^  8ׂ  8]]]^ -^ -ׂ -^ -ׂ -^ -^ -ׂ -^-nagios-4.3.4/contrib/exfoliation/images/logos/aix.gif000066400000000000000000000025511314764422400226350ustar00rootroot00000000000000GIF89a(()1)1199BJ{JRsR{Zscs)19Zsckcskkscsk{cZRZR!9!9!9!B{!B!R!R)J{)J)sc1!{1){1B{1J{1J1k9!s9RsB!sBZkJ!kJZkR!kZ!cZ1{ZkcZckZksZsZssRssZ{R{kR{sR{{R{{{{ƜƄƄƜJJJJƌΌΔBBBΜB֥999)R99Ƶ9s1111))έ)ε)!)ֽ!!޵!ﭽ)19BJJ{!,((% H*$8‡%1`Jċ'h#F 1X G A^qDsDȒ0 :4\8A2ɉի:jJ @WJ%Ga/@zPZ騆\S!F{24P1 Pp4 uCG-#k$BC (pLO\wF D=P!d(݄u 96N ma 8N\%ķs! kŲQ6C4pb&@&[FqFOXMf ,@: CVeE rİ5 vXց!QQ@rAQU!>heeX"?CT X[ ldA\H\AuW \nDB=GX]lPx'h!i Uqa%anB}"ɣQR*Q9k^&6XcQzAHT 7Ԋ*F+ ~Q]@&kPꬲdu:AFz, - EI;nagios-4.3.4/contrib/exfoliation/images/logos/aix.jpg000066400000000000000000000032701314764422400226470ustar00rootroot00000000000000JFIFC     C   ((" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?SxCkMC~#"4̓\J%Q՘H7ែ5Gn3a@5?>!={Pբf6W/$HÖĪqN>X|#/^ '$ڔnݒWG'\|c 2!2*]07`0FX/+x?O7u&7$#:WSSҿ$~$|'XZչ.Gs S?h/?]CCu]SE%,pz7>+p8v.Wv]״7c+O*Oy&MC~~|P>/NxvGI+d8`B C`W]^T%fzPT?2z+6w(< FA88>h$ԓzN5u<uuEǟCZ [H'!DVf4LrKN}=+Q6x췲ͨd5$v?e{~E b(Huݝo}YM?TR5}_-%F;zZ>&vVeeaa'jA#HXI!@8f4ma"[yߺpI!.kV[QP[P#*7NHo ™F{a7~۵M6wdx_g_Ye:QjMi&׺w= íJn'1W WlEQt&[~PH`?& |=_iۢ 'AFbԐ `UffVl~lQt)(pcOo|ZuYcbYkH>]{3O^;6Uz._vrS÷(u (cnagios-4.3.4/contrib/exfoliation/images/logos/aix.png000066400000000000000000000025531314764422400226560ustar00rootroot00000000000000PNG  IHDR((/:gAMA atRNS7X}IDATxŗQhu?v7HҼa",,ha/A؃Qu8EtB+ [ eq{ց0, ILw>ԇ%eM#@wٵG B=:^d:+06_{Yk&Τʧ>eoC=R5Ng^=86v*vjݐǃ-K5oاp_[HIU:>;n-,V:u)boo!Ѻj=hl*+rtr[]-H:͙}ǏnS\87~zV۱r [T\6p~ʚ[왻ysn 0 $9#ROLhAKo""W OT@-R8FDn T,9a5؊{{aB:Q\l)!VUVUz3z2uOo|lkɄ4_,#¶Ն>V6w?ǚk1k\%7{Av^twAvb6{)&ͦ*vX݈ވouegJנސwbv˽j['w+rC 5_W폲E/GM6K:XH )XmTKB1%o-y}8b._2#8fGK(cn 3jx A@iĽ}Wb1 t[)XUܐ0 kqE;W~ꛛϽ詫4U Dʵ!E9NƤ7<4%| 1={虗=Lj[C#Q䐮+xHJe8wׇKm"CB=&+ME{Yi:3MsCBH)4ah',k VOe#kC#yjJݠSKY= PI@H3*&tM&s+4C&|gAp;@J.tUW|ܧř9?7s|ݠ*x9=fhؖnLkZ #DU0wu ױD,77U)Aw../o'IMb7+*{XvgqUTh%uk^jՋ߫SU"+T\C[*ZtI%;[b`<5w;ER1:zƜ^5ik'tPq ^k#ӹ+O4; b)-gmݶ LIENDB`nagios-4.3.4/contrib/exfoliation/images/logos/amiga.gd2000066400000000000000000000045251314764422400230440ustar00rootroot00000000000000gd2(( 3f3333f333ff3fffff3f3f̙3f3333f3333333333f3333333f3f33ff3f3f3f3333f3333333f3̙333333f333ff3ffffff3f33f3ff3f3f3ffff3fffffffffff3fffffff3fff̙ffff3fffff3f̙3333f33̙3ff3ffff̙f3f̙3f̙̙3f̙3f3333f333ff3fffff̙̙3̙f̙̙̙3f̙3f3f3333f333ff3fffff3f3f̙3fЬОsssОllllЬllszs׬zszslЬsszzzlHzЬllllsslHHzמzllllllzOHOzץsllllllzVVVOЗlllllllzWVVOOמzzlllllllzWVVVHO׬llsssllllllzWVVVO$מllllzzslllzWVVVO$OЗlllllzssVVVVO$$ץllllslOOVVOH$ХlllllzzlHHHHO$$OХllllllVlHHHHH+$OХllllllsVHHHHHH++OzsllllzOHHHHH$++OszslVOHHHHH$++OszsszVHHHHHH$+++lllzzlllmszzVVHHHHHH$++OllllllsllllllHOOIHHHH$$,2OszzllllllzlllllllHHOVVOI$$+2VVslsslllllzllllllHHHVVVV2++++2VמllzslssllllHHHHOVVVV+++HH$ץllzzzzllllHHHHHOVVV+++$HHHslzzllstzzlllHHHHHHVVV++++HHHVץlszllllllOOHHHHHHHHOVV+++++HHHslsllllllHOVOOHHHHHOV+++++$H$OץHVVzllHHHHHVVVVVVOOOO++++++HHHׁVVVVOHHHHHHHVVVVVVVOH$$++++HHHVHOVVHHHHHHOVVVVVV1+$$$$$$+++O׬VHHHOHHHHHOVVVV2++$$$$$$++2V׬OHHOUOOHHUVV++++$$$$$$+2+V׳VH$+22++++++++$$$$$$+++ׁO++++$$$$$++$$$$$++V׬O++$$$$$$++++$$OׁVOO$$++++OOz׬nagios-4.3.4/contrib/exfoliation/images/logos/amiga.gif000066400000000000000000000040701314764422400231300ustar00rootroot00000000000000GIF89a((BBBBBBB!!JJJJJJJ!!RRZcZRc RR!`kskksksk!C')J)1G66F9BJB9BBBJBBJJJR!!V))]))k))RA=]q8q"֧K[dɳ"9s펱i& >zbgI{йk;~u-+VLeGNΝ\${QMIre "%86gW/z={ Q%O6wA#:(5Kڳ2ԣEiv{ևX_#:DHwȡCgNjtqy -<l"P@0)hxa!V4q{  Ђ0nq6'N6qxxLN< ,|qE H @l1eHN ,h9Yߑ ,@Ф4RLJX:,I'\ˆR 4T@%oAM2}Tըaeyg(2lp9w vL6ߜRKU1x^"k!Cd<B-M.aqGeĩv"Za+<@ 4sM.dcb YrF+,Ŵ8 '̐M4K:AK_$CVJ.r R+/3 -bd- ,p ]@BɳA8 '5bF<1lIP10GL+R\pbmE 1+J` 2` "` Z,iTK(WPaS#<^_: >n"@&aY% R_D j0@|#=WE|aVp"P5 w0@X,O?1\M@(VTe/A챖g]" ]xI  .C,b-"\ PdfsS}`0!ޥ@ x ]p0 ,  '/J`G ^Ѓ4a/"Dg8@D ("6Ёti @pcN -$pAZP=4 dP?1 'ȓC h#9ـ,%(>)H!O[\@0"HBnq#fpO#0 D t@QYb 0f,Yl8 Rqk8FS;nagios-4.3.4/contrib/exfoliation/images/logos/amiga.jpg000066400000000000000000000034771314764422400231550ustar00rootroot00000000000000JFIFC     C   ((" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?@|3`.HUE2HA!$r@' _~֯o<1k{Ki&#yH<sֵh+KSJ/xm~dl_J . k<[x]Ɵixmc"Vs}Mx8*ҪX_{|?Yp0Sk˒/~W'֎>oB_zG?x;I_7+{\0 4˜A\ڟ,%׎>TWn[_KF mlv|}{PnmZMڋڨ |A{M~V,+Ce(s԰QNZ>Wooe78YI;ʛ&Cg?|eU|/z/tp$/9\g]m~Xǟx4+mV+ x6( W˖AY3ҿRu\RZY=U],Kkx:d9noK$}jOY|bUeP/LGcw5`NIn ޕߴ+?gk{ xfrCvlscghk~ 𽎙k6c;$wXB0*mT:YiZ9ړnQNM9rI\_fܡeՓR± w8ws+<5ELs€=2+▗?Z$#[^Alfd1Sd֨|hC!yi0fC]Q1DQ!VE"R?LеjUSUND*HV7X0@Kl3v]9sivvmDD 10B`c3xB3gdsF"ӔR !FNr}p,C;IX i{r@ѡnfo֒իsʓʕoc0k_}ubq))dѻbhq^IHa&ۏD0.| Y1>d S0à|@ \X16Xё_" q>10pDvRlc,v=-b1IR֞ ^r_m?0w|o4Z魷NK 9)CC͜\nfjr+KM]k*dqN@pK&i垞r[[˺uٙ3`8gn{ٳ7~yzi PxSͷʹ<~p ~?G"-V?P>|LD࠻R*lǎ͛ ;յ{vsj ,Yz`W4Y;:O:鴫QaP{~>BB(L_uy+LږiZ3If(o߾Ld\mqTRVˍ1Ms֯/?Ԙi⬧x^fy|xB,$"pq16t FGQ ++jl*%R%l7::Zg "ReưeK+⋷MX TU>BHXjEIF* Pp9E62o:?#PmS spPBhѶBN:@MT̫ zy*{֐۲[3it6TNҾ}^@&S>wNI&9kQuPm l[xpZI< )`!.&=$m=}SS LDRJ# +XǶ|0c5:Igżq ֡ _\ ;$TzCTy5q<*kh R:t|M5MXX,U{SE5MGӊip0nvWڮD-/G H~?JF*`.<`ZuͲUNMU͛SW)L0`@@ߞDVm&Ϟ-TU5&M8ej-8 `P+I3 ;3LhZ@י+-۸S|٣3}<^~]QUy+|>["*@RJ"y-5;T6 N>/PuYdv)l!}[pvmpbTwJeƆX nN G7B*EZHG"~MdQ6V!p b1iWдгN$2}cs ?_ivg8wzoQskK_i^:v]8@ԕ9;u-Î"FKv`n$/FOe~eWԲ_E9XTuGyو`pΝXԻ]d2ß~H$K:R/+SSh4sg]?/0"B$3oƊW/S>Ob9 %KJ-w|73M l6kYmYYrik]iDG^IENDB`nagios-4.3.4/contrib/exfoliation/images/logos/apple.gd2000066400000000000000000000045251314764422400230670ustar00rootroot00000000000000gd2(( @{1ckRޭޭ)s֜Z9k!)199JJ9!RƌskBR筵{)9s絥cޔΔJRޥ֌42754227?:22245;223268222235323228622227122385<4;2765986=7:271>83222222216998:2222222;7222223222222222222322226522232322232222222322232226123222222223232322223223224./////////////////////////0-)))))))))))))))))))))))))+))))))))))))))))))))))))),())))))))))))))))))))))))*"&&&&#&&#&&&&#&&#&&&&#&&#'"########################%"########################%"########################""#########################$ !    nagios-4.3.4/contrib/exfoliation/images/logos/apple.gif000066400000000000000000000022211314764422400231470ustar00rootroot00000000000000GIF89a((ƽ{{{ssskkkcccZZZRRRJJJBBB999111)))!!!JJ999!RƌRsRkcB筽֌J){sR9cޥޔ֭{Bc1)9k֜R)sޭƵZ9kRZ)1!!,((H*L!*i0ŃExGJl GD6 pҢ${iiʊ4#93'A%C~D #D!DGNy$FjG!UrU)dD%d{PvJ wM f̘ڸ߿È+FǐaЈ#3,` Ο; t *R^ͺ]˖ ;"ٸY7%NNq!"HüПG\B"iF|(ho,2ӧ' ˟/ .f;'EGWL 6Qă6hIMLH^R .h9`>DQd,VD4E;nagios-4.3.4/contrib/exfoliation/images/logos/apple.jpg000066400000000000000000000025111314764422400231640ustar00rootroot00000000000000JFIFC     C   ((" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?Sj:>s{pO/SZ7^? eޟs$Arߎs_-q#q"^JiW^δӔg|p 8#X/,`īGsw>B-kνuuu}y#ܫ]3l~A`d۫xR4jɲ Hhs;ISU_2]&d󬑜vįjuƙzȢ?{{w:o4օmdpkB_⤺Nx{ػ1ڧ"GR\W˿ct}yĞV{R-΄^t9[W[;vWϟd/ܶ븤S7 ^Ic+j{Z< +f>4w6iׅbB_k TQnBcm՛؎J$w~"r 8_P:}KEz?۹UiNXe_Š(#nagios-4.3.4/contrib/exfoliation/images/logos/apple.png000066400000000000000000000014551314764422400231760ustar00rootroot00000000000000PNG  IHDR((/:gAMA atRNS7X}IDATxŗ=h0_J@Qd(!6<&˖f딱K;t)@fKxA q77ClX]'eK>~ӳ4&tK@=u}` C}Eg)i\D ;^i䁷Sks`$9b"K߅˵q`?Hy9W>zp l6u0Xa #96,A@ RcYAĎJ?!O#h2|ߍ=͞Rc >o';*-Ӹ۬ Z< ֔(lqm.曩KLqЦK8XKڴ_za*ofJ/"޲9%t΃NrrrB#h}4F5HgJsN&yڨ>UTK z]R>oJDAqX;ϰ'7dQe˞#օ& EE C.0J{4'4å% g5{?Gbk;cWjӆ(L\ Fʆz;lCq4Z+IioV w{4kSl?cيvD&3 vImfQmcyB>wϛXC3whutW6ݴʃ\f !C&>RUo֧;+%o%IENDB`nagios-4.3.4/contrib/exfoliation/images/logos/beos.gd2000066400000000000000000000045251314764422400227160ustar00rootroot00000000000000gd2(( 3f3333f333ff3fffff3f3f̙3f3333f3333333333f3333333f3f33ff3f3f3f3333f3333333f3̙333333f333ff3ffffff3f33f3ff3f3f3ffff3fffffffffff3fffffff3fff̙ffff3fffff3f̙3333f33̙3ff3ffff̙f3f̙3f̙̙3f̙3f3333f333ff3fffff̙̙3̙f̙̙̙3f̙3f3f3333f333ff3fffff3f3f̙3f׬׭339^ׁV ׬]+VVVV2׈V3׈ׂ 2׈׬3׈׭3 V׈׬ Vɞ׈^Vמs׈׳+ОzVVVO׈]3 +VמzVVz׈ ++׬+VЗsz׈,,,  Wץ+zИsO׈+W,, 3מs+׈׬Vm+OVVVVVVO+++׈׬Vs+V׈׬,ss+׈,s+׈msО׈׈mzЗ׈9OsОV׈9 +ХzV׭3W]3Vz+V׭]3+VץssO+V׳V++2VVV2++++V׳VOOOO%++V׬]3332222222233]^tsssssss׈,,+,+,$HHHHHHHHHHHHHH+׬VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVײnagios-4.3.4/contrib/exfoliation/images/logos/beos.gif000066400000000000000000000030531314764422400230020ustar00rootroot00000000000000GIF89a((!9!B1Z!)!1!91R1Z!11J1R)!!!))91B1J!!!!))!BZ)!!))))19)9Z1119!!911B!JRB))J--9BBJ99BBBFJJ9JZBJRBRZJRVRc!s!)s)){)1Z19ZBBcBJVVVcRRcZZkRRsJJ{BBVV9cBc!Jc)Jc19cBRcRZcZZccRcccckcc9kBkZckkkkBsJsBBssssB{J{J{!R{ks{s{{{{{JJR)Z1Zk{JRZRRZZc!c!k)k9kBsZ{!k)kB{R{B{BJRcJRZsc{Ƅƌ!)))1cc{{ƌΌΔ)1ss!)199BƜ֥RRZZssέ!))199έ֭޵!))111JRε޽!))119RZƽ!))111199BBJƜ!))111199BBBBJJJckks{ΥJRccckkkss֭{{眜眥祥ﵵス!,(( H*\ȰÇ#hŋ-26Oboؘ!CI4jH]$,#I.&-%,r.<%HDIVJē媒Sn\XlJTS Ԅ"XJ&Akqb8"[ᚵE}/+ଲd<>wښ\] ) A_؀ V^!<]K@_H4fpZ@zeR֋'rՋN 5ir + uxk杔lX`b-bd/P845޵CZ~$G1d -b≽8 tu]0\EN,Ë !Ï@`B"@N`F:/HDbRexV:& /Jhyc'vWAn B@d ^A8 * 4?Q/Ҙ@`L%YpVI()+Wd/sRѴd_l8<׼ІUKRrOYtjW&'ZтZG_G;]Wλsb'<}T+ҫe3(ZSmcmq}t?h׍fIf1{ @ ֍!ӃvvݮNǭNkCr1M%~f8G=K?i%P )p;!8ԏ4]pueCY- $o~?G*~ [kzGp9YyMt.]FW.dyUS8@g|'_i~ӞG,7WŰI ѢW_t#BIɻ]ok W{8gqX~0l-&R_@U\k?cMkO,4]EopeYd|.^C]7DR9kҧp\z^U?e߈9|O],=̜)*Cz|Tּ7V^g1Xj-){E(]sǕ&Z}_ ~ xUގ'I8O|Yʪ2KgWf~'K|{ _,0I @X`~S¿yXw Yz~dPZ ҼV׶C寉L7;5/7 ;\i;ۓ$kP*7,AhifXĬg< J`d_7۔gLGls>? 12x)b;]=ܿa*x QnE7kEffkZuon"|KcF?3^߅aNՠp#vA1_y{뺦i&Q$? 5dꋯON:TihmܾmY/U*_A@Bc`jwUlVo@M4MEciJi(c,qm>\BVu9x|o,3 ``l>N\4=4V9-& ?L[ahQ뻮[ױ 4M=? WPqw-,mz0{R&fcP#"Ռ;zJ8h}Rkշ6EeKc̶-c`Uqzuv"M3 0UGXM4)9H ll8տlr f[iJϋ_?= fnr8鯈s>;K1yqHhK^B^Kd_@(33DA <~ٳ˲7wwy\~g{*E;40mږvgc77'c3=*P3%sLڹ|bCٞCs|QC "rޥa9zZ4]=[/m+p*I20Xy%U۽B?+#=];u9ђ1d-:{;Qf9,pBƢ1C_6yKO>u?4UG)m9\/^ӝBVMQ,GTMA8EW%z#_{vpדEBwXnˎwڽC(JT" ]4l:`wmq=61zP%׻x\Ţ(MMkM%nl/Yxw@/:9nTz>mZ& 1@hTHw6!MX3r@ 8U/kt1D$*W 4'0S1'Kag]UqUW3DaL𮜧HfvUMD@Ҷ޿94o:B]ߍ|$# &Ɋ^y|oNbܝDcmx{s7DHU >h {&b!]bۓJ4޶X"|+Y>vך~`[.V&v |=!ΌɂcQ{2=\Ov#Ʈlt4D-s"=_ hK\+ ~\/3v@[23B-ֵn+/^_^xj`\J JL_b 4֎Tt'}Kb B!ʶ#e@V)6lL!Bk.3u$k0B-Do1$] jZߧK f YSX! 70Ogpx94&F3s , WwdiAxiDЯTp씸i;[nqH\ ;3EzhʧnޒCRyǟu(@;fCP>\ޑM[XaՂ;C6+I _֧p˥bࡣ+ m( m/P$n%U(v=v')5 ^}ńP:6uǹx]چdH@^QsZf8RR\%% R،Q]º9P 3^SW08 wrZ4>&nIaQ,QܑŅ#Xɮf5ƛ.|@Y 4,9D'qr 57eVRxu]6Zc\h NsTF5=BUkGi[ lY{ 4\ @.=\ϟMڀMY<|e/N3ba䩻&P @QZgOW 5ս=z,p\Þ,5U$:qqea]=fS(=dvQ1zKű/gdH+ɪJ"\kRb[oJFrB dNYWN咍to |&\PRS45X]ZxsJSNnl4DY犨oŕt,>yhcfPNK I3wI-=}xőhr/cΜ|9eTxsJ~*tJ>m{7QmV|(E2ڢuI8 ēI|c#ߏOhpE:*w7j_,81 1u1l:kI !x7D屺lUKep`Fe UV+`G[kIuW&{d<O$ķ+mSFwB%gU+B*g$G x]F0eH2M]-쿢潋 :JU>Jfq|9 D,*1J.1# FR6exE}ޙ<>sh14E b#[Č,eҞW恕ڐVe$ݱq'S"+|Հ&M w8 ;:g&`@͢%N*c{d}X*¯d7ЭJ o4Z $!5fr*P\'z__%6FW0c C" wq8s%u8$U\8(4bfU B3}u«K>!iRR#N;0-H'k!E2Y)O#@jUsbi۬ C&W%s PU.\{?;~IS$5a^ՙW݁W+9XsϪs^@h[ST]9D:_.o}Oe%Vbxp1UaK^Dp8ޢuV}.N5躯 7HcbTJ qǡw1\:Awdy d煑~ e#'..7F+K}A^B:3#j+SQ$HgCJ Pn榜‚W.VxȂE)NM8qo5&k58xnO7p>C%>ۓe:حRo=wA vod8ON+ZCLX "B [8R\DLXQ4 'j;W{~o7˂v2Ǭ|sQ{N=٢\5)I$qyJRm:$4 8/k?ș/8`]oJ/Z͝#D٘b-l%s=T!Њ$J^1g_=d=t}.c#X[߁5G\g;Z! 딨tߵ~1%·]_'"<T\h?sH,# oLDf P\/JS JGkϾSRC7 0 rd|IENDB`nagios-4.3.4/contrib/exfoliation/images/logos/caldera.gd2000066400000000000000000000053761314764422400233660ustar00rootroot00000000000000gd2-- v筭sss999!!!)))RRRֽ{{{199111JJJBBBZZZkkkcccJRR{!!)甔kkc{{1))!!ZccZZcckks{{ksskksƥccZJJZ{Z))ksJ19{R)Z)֥BJRZJ{J))!c!BBk1{9c{))!޽kkZZccޭƽ%!t!!!%!%)%!!8!!""!!t%!`-"!!8%7-"-"!!%%u,-)--!!%%!-%!!%!!-0!!%t>--%!!%!2)!%88"%%!!!"!%!!%!!s!!!8mnopqr%88PeiXUTRjkl!!!%ecb\XUfRdgh%!`!!%a]bcXURMJd^!![X\]\WTRMID^_!VUWXWUTRJIDYZ>!QTTTURRMJDE::!PQRRRRRMJIEA:S%LJMMJJJIEA:NO2HIIJJIDEA@:K!-"-CDDDEE@@:FG->""4"8?@A@@::B<%""-89:::;<=%--5657!"-$4"3-1""2 -0!% -!/-.""  $, -""   ."+    )*+  %$& ' (     "#$     !      nagios-4.3.4/contrib/exfoliation/images/logos/caldera.gif000066400000000000000000000034471314764422400234540ustar00rootroot00000000000000GIF89a--!!!)))111999BBBJJJRRRZZZccckkksss{{{skkcZZRJJ1))!!1)!scJ1!B)B9)!眔scBcR1RB!B11!cBcJR9sc9cR)RBB1cJsRބ{c9BΥ11!!Μ!B1{Zsޥތk{sZRJ1{k9sZ1)RJ9RB{c1){ޭޭkΜ猽RkcJ)s{c{c{֜s{sR{c{sJ{k!kkc{s{{ƥޭ֥Z{ZccJ{Jcckk)Z)ZZ!c!BB))))JZ))JkBc{JR19!ks{1{9RZJ޽ƽ筵Ɯs{{kssckkZccJRR199!!祥kksZZc!!)ֽ{!,--HA8xpC#J 2`pႅ .h0.jА *P@C+ !F0dHY΂ .im # 2h L 2ԁƕ?3j]a B%Ƌ9H (`pMcB ST0'DB s>`qmPBb2<֢oY$*HȠR(f)25@gCp 1U{f3Na96P`0G$BJ($!+I$|#Fm-K/03@x&,/R%7'9(uJ.c, -|M&A܂K."#,CK3#6ti@)r-1K 3xYˢĂ%/*wY 7:iS*XQG /d˟ (JAAi.)*1lrTqHVAc1l2HA|E$S8Y@A\0QLP$LJ*p/Nmapg]AcEs &PrXȶfT2vNSf @A8#j#8 84 @@<εA  ,LtDeR6@670@tA5Wbl@@Wn(6J@5y3@A H p6 %S@@ (5 8U $ ' $P\%  8p3d^E: /#lLD}@7πr$6(998@=4-Bp p4\s@mc 0ه=P$F4hT@ pZY Rlۡ ;nagios-4.3.4/contrib/exfoliation/images/logos/caldera.jpg000066400000000000000000000031661314764422400234650ustar00rootroot00000000000000JFIFC     C   --" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?Sc\MG Q.p{ 5+˵d$H\}희ۻ*$PICyYsTEpZϊ#7^]477?R^2:ޜZ lT|/{Y[ú~Q5F=җ2Nԗ$8}Լ+v#!@ifֱ!E%f΄ҐL*gceܥN >gOAay77pLck֎L ,G(~(jK#1HVh9.V6Fl!H2;iٓcSXDgYU)'F_1OV)qK0;wFc\E 䔌@'J@4o y=TLoP3+6o\Iݵ{l K8H#_?O-^" "ٻ)`p[~ 9<{/qxQymn`#;Y@m72kT͞?kkq|3*jR:=j|6&6"əP&0IWǟ׊|S|/)&{HA?ԣ3}f{i_ d`ƬQAׇe3|'oO7#8 kKZ$Z*y| er{nagios-4.3.4/contrib/exfoliation/images/logos/caldera.png000066400000000000000000000042421314764422400234650ustar00rootroot00000000000000PNG  IHDR--xugAMA atRNS7X}GIDATxOǿy/BBa֮K|="c;Ң { x\i E{fǜb{0 beYV غZo{44GTv(˲R1q-iJJ)Vᶺ-GQ11kmYV[ 906ƭ%&91&ZnB셃 J[rꓫqp8f1$R ܱc& [T_W*:`%flq<8aQaeYڳgQv M´i~"sp+XkRRJuͦ1f0c椔Rź۾ec(\]9ϲl86M!D$RNgTZ5\%TMW[PJsvt:i.,,l 9n< 8ZHU)1&2Qu].\(BssXH%=]/"TyiEQEJpО)% ܢn6cvB?/[(mYhBkhG/..q>*B<BPRG{zKW9)Kc ^~\ƥ.tNE}lG<)2/BVj,6F| @ wzGDx?(xgJc518(WJ) 8?aOppgs+rw30qDmW꫍ J8\FnAnUɊ]Yk0ś V{ EAJ1}Շ4PM^8HL 6y/ `UAl-ZK(l~@xc&`ʙe&ԟccZ+MN;D[j@ X4րYL$a7 &'̳bP +v:څh8VkMu]*T{+9X̆4JYGnS[7Ŷ֎cj3d4%%Z_v 1Aŝ: k)K<Bi*>w>j 9:й !AI$`0o,ސ `+ˏ5 x21"MS"H:4Mvㅅ:w#R˗/O*lZeYjm9~?,4t7ozX߿x8/^|~wcCF#(?~\Jeɓ',˥l~ka$0Xk=??$K-B)"~avv6 å_tiq}汨>($< C!Dߧ6y?zhzz?R޽{/[ƵkpX^^ o(8v]nzJ/_߿իWFc?󼥥Wv: 8W\0 ~YAf3Kd}_pZks:CR>~'f$||vp1/sJ9B:>{ӧfgg[VQdO>VkvK[YY2 6(>|8A՚FO?:;wON﷞&R.//߻wo}}}߾}NujdȃovNAeY۽}h4"Cxx=zȑ#Ν˒8iKKdQdI$ɽ{VWW >tPQ]Z9]Ի=r$XS2W;!OSňkAIENDB`nagios-4.3.4/contrib/exfoliation/images/logos/cat1900.gd2000066400000000000000000000045251314764422400230470ustar00rootroot00000000000000gd2((!!!)))1111k1999BBBJJJJJRRRZZZZZccckkksss{{{֌             nagios-4.3.4/contrib/exfoliation/images/logos/cat2900.gd2000066400000000000000000000045251314764422400230500ustar00rootroot00000000000000gd2((#!!!111999BBBJJRRRZZZZZccckkkkksssss{{{{{ΌΔƭƽ#####################################################################################################################################################################################################################################################!#!#!#!!!#!!!#!!!!!#!!!!!#!!!!!!!#!!!!!!!!!!!#!!!!!!!!!!!!!#####!##!##!##!##!##!##!##!##!##!##!##!####################################################################################################################"#########"#####"#####"#####"#####"#####!#########"#####"#####"#####"#####"#####!#####!!                            ####"#####"#####"#####"#####"#####"###############"###########"###########"#####################################################################################nagios-4.3.4/contrib/exfoliation/images/logos/cat5000.gd2000066400000000000000000000045251314764422400230420ustar00rootroot00000000000000gd2((E)))111999BBBJJJRRRZZZccckkkkk{sssssss{{{{{{{{{Ƅ΄քބƌΌ֌ތ甔ޜ祥޵罽ƽֽEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEBEBBEBBBEBBBBBBBEBBBBBBBBBBBEBBBBBBBBBBBBBBBBBBBEBBBBBBBBBBBBBBEBEDBCCBCCB@CBCCBCCBCCBCCBCCBCCBCCBCDBEEEEE.--**%$%%%%%%%%%%%%%*************5EEEEEE11111%$115EEEEEE511111%11.11111111111115EEEEEE51111. 11-'(51111111115 315EEEEEE51111111-'(51111111115 315EEEEEE511111%11111111111111115EEEEEE51111115EEEEEE155$5DEEEEE."3111111111111111111111111112"?EEEEEE$//3111111111111111111111111115BEEEEEE$1. 8EEEEEE123111111111111111111111111112"?EEEEEE12,**************************+BEEEEEE11 &***************************9DEEEEE116111111111111111111111111115AEEEEEE11  >>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~ZJZYL[AE}׿{AHImjEvܺsQP_]OWY]|dv>OU~yx~òxɈĻߥǞu~ʨowߞ}wëway¶hy"3ݲ;ٛ-۱`٤@ |@ՐdR(*5fχzϣ8Ϲ%/Ȇ.ͺ6!y#/ˌ)XƫfOƴZ$hķn/'5EhnohK5*nagios-4.3.4/contrib/exfoliation/images/logos/database.gif000066400000000000000000000031441314764422400236170ustar00rootroot00000000000000GIF89a((  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! ,((@ H RRǰÇ#B|40k2jȱǍh1cȒ-k iծaƭ7pr3BKٳdzG pj\%Սׯ`Ê%Mלީ]˶۷p=4i옧:ӷ߿;ϫt.Q.%Ŗ ْf&9ϠAh*cS^ )gTlr}=Aٹȓ+_.NسܼO~'seɅO`sO>^6l՝0yD+#-Rh1K5#J*ARR $t!̠K(؍,~!P#Ԍ PPy̑Gr8$/$0\APCh!I'dKԠWZ$"diD3Ο*(FEI86s = :d馜vis@Ytةꪫn?#무j뭸"+vT'$6lA-~lc=fv{O8l3L~bI6뮺ߔ6raJʠ\O?,0|IwR: 3˽1F 0|&D(LWc} EEL5}s8,OI0<#6)$M66Dmt,X3Zc 3D`MRT d8H15C4II#M28@6-y:A;nagios-4.3.4/contrib/exfoliation/images/logos/debian.gd2000066400000000000000000000045251314764422400232100ustar00rootroot00000000000000gd2((@3f3333f333ff3fffff3f3f̙3f3333f3333333333f3333333f3f33ff3f3f3f3333f3333333f3̙333333f333ff3ffffff3f33f3ff3f3f3ffff3fffffffffff3fffffff3fff̙ffff3fffff3f̙3333f33̙3ff3ffff̙f3f̙3f̙̙3f̙3f3333f333ff3fffff̙̙3̙f̙̙̙3f̙3f3f3333f333ff3fffff3f3f̙3fѦ{WWWWWWWWuuu{WWWWWWWWWW{љuWWWW{љ{WWWWWљuWWW|{WW|{{|WWҧW|W{ѠW{W{uWѧ{{W{{W{{{u|{uљ{|u{љ||{{||u||uWu|||nagios-4.3.4/contrib/exfoliation/images/logos/debian.gif000066400000000000000000000026351314764422400233010ustar00rootroot00000000000000GIF89a((lYdlcdllkrlkrlqxvxcqlxvx~Yk~lxFdYkYqvPkl~PkcxYxFkPqYxc~vFkFqlv3kFqPxY~c3k=k=qP~c3kFxlÒ3k=qYlʥ!d*d3k3q=xP~cl3q=xFxY։ָ֛֒F~Pcl܉܉ܛܛܥ钳!,((@ H a"" Pp)u6P MفEa)%2$lH'/l3 L*hDJ%>*]ZçPT(DX,d9eIFA+7Kp(I‰nhyF !@$d4bA>m(9jy$a  P@ 0ġWP0CZIjD!L86A>!!A wժp+O2RZBH9VCap%2$Ș,e~qLP if,А:8`BoHCAETPyXGgIaAD, *3  vnQn{SY^6p]OլO IUAuM_>~wuMϟg Ɇ4HI^z/03_A%E}־N߶ݍoַ;|\WӚ[IV6B`5=Rf×R4̹Jt r:?%C_ƓI]e@߀: ީ(7wQ򒜤"k2ѥj0:%Vh#@n8x{: ^[{[1WRi?,kg6su^H,-)@ GOaY fMX^. aE>\ 65p]E-/]?W4.s4h_+*`;A=ڪ+[Xl1"B@y*JRoVY:%GwayXe@FA_$x3N9mo5ʰ?hh%JcTb@ .:'^Oɮjw^= ONiLFQ$!qٯ7"";s;lQEnagios-4.3.4/contrib/exfoliation/images/logos/debian.png000066400000000000000000000030471314764422400233160ustar00rootroot00000000000000PNG  IHDR((/:gAMA atRNS7X}IDATxXOhTGYN0;Kfߺ.fHڬbP/B[B!/=Rȭ T< PВVEF\1H\4Hb^mc3=Ƙ}o7j7ogfӧOൗX2Y̼" xe8d&0/MRQf ֤'5o|~tgO_rS_bw<ۓo~}#sK) TCz'33ii%C&EYE#.݋*1|J7SH%5\3M A304y{J^,< og!Vw5£ZI!"鵧e,Hmvw>+|>8Bp&4s -(9`:+Wo~EgkZVGjo;|[=h~qnhbh5(&pωso z;qP}a%wXڊߘϥDN@̮dk ϸ1c~!=f<:qZs?' Adr";+pPyZt|=bf 1?ZId mD@MUϞrm'sJ?Y!ד]u9+/}yx* 'XhtHD[G,(z1D x4M~ VniuPθeq]3 j {k+U ګfqx3!+bYl.άwsu#P@Hwv֪P2o?DqQ"L̦ UZl\" gCSҍs!Y)>6(h(0" k9q2.@p婾\_yJ6 'j;!O}o+}S^^=knND6פLJ>qe>HNڸ\lYLXp<'d哈|\:؏D`ڃwlRc5(0>:ƧZN |hFMRm;n!y*AîQc2*Lm 7}g\ws#L8}z$ .t<OYU!HnKw橨E="NA. ".)Κڒ={t >^mguV&`6 S P`zT\$LOuc2dgʃQN.wlEME{!5TӮw&Pa 4TrI\~[/v\zӉS4޲.c̏ ā+W-L=L]K沗@SDqϺ*Z ,//#7I{wm7x6{-i$>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~btNUٰkIڦa?wޞXkڗ_fђY2BͰ1Lع1ʼ1111s1b/1\1=1^GڋD&1|7b1ޢ`=P1ʑS111p1͆j1U111۽1qںUmiظU{wkr׵[ÝnomղkMoƹwi|ԯlNbĵ{bҬsGJxЩ{HUϣTSY[nagios-4.3.4/contrib/exfoliation/images/logos/desktop-server.gif000066400000000000000000000030121314764422400250220ustar00rootroot00000000000000GIF89a((  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! ,((@ H¨[#J|]3Xb($.ic^~ry9K""&ұF/'E0dmߘN" ́By7'L`#8cR 1τ6b(h+Ti( †!4EJWA&9 %!2TY6%AkN9`)&\EnY|:llc,2D ظ|<`~7=&c1NPNϜO>di>Ny 6BB!р=:吳~x&'=RBoZC|^QGR!_8obE6>KRU)c!F,;𣐾!?]uimuI6HÒMӼ d},Ë#&ᆼ9p$}\|hiqLĉё/Կ-,.^4m[Kp Av%7ҁ\.yn^Ǐ9ۿ(|~po@Um-k ^ހH}Px"G.Q[LpkJ5V(gJ9N8ET4AxI\EV{΢~{`= =Tr$u]:@k8CE9t4 \L,$c} EwC :&eU TtmG>ʆ+ B7}F׋.uc%`P|RFo#slW(Z'f@8ZOMVTWRo*Q$R:i::i FZF*DeLNU5qt]u0=y&(C$5ti !]LJL q$t#ZqTI5EI lyaPèD1)RJ:Z@Z|Syr@op󊯧fΞE?wx{cLjbTޝǃ܇p?PiEId$ T[jaљs1Md]y#c]rƃEE!6D@J["ҏ8}[h&!FiY lj74=FT?@Ҥ&݇PW?}{nŽ o;IW!*rP1KylHscqH̷V#e [BlФHiS3gsSWpP9 *[Z9$Yځ&TEew g 5F!fĐJ$qn֌l1v0@KtyjUAb[/dINJŮ<~}̭c e)r0LjhH9gOC#UINr.eYt} MJ&NEq~,FYm6]o '$!y#>WO BEvٹEAEbFdzVuSdJKP*D b bnS0zdtCUF i s 嫿2 ]Bp ZC.Qjvb7Ppd!$ZOBW0y`T&-.؍oc L\BCx?RPqlmw{F17?NbajuDkl0743rlj?8ʓx0~}Mȳ3oZnTp9 QVd8Eȍӓpɋㇿ\I$ҞbxVՁs 37ХKK?'OyF1ՀэL*>b ϞABtCEڊS2 3BmX.i(7XQ0 Gih6,tձ(v;S^0ltLi}j\)w "RUܴV*C*SVm|IݛL**:Wb~GA}T6 QlN8(AM7k[qh5!OmPC+Wж-,K`rs~K"XT O<>3D2\z*>إy~Rw<f &O(Uo4P/W| (shA)_K jhx((2Լţ*ZB'4Kٖ)T( ԩSũ<7f.!fFF@`9h({Hn()EtZgᒸ,c5$dz\>$br!8jUumci>K&cȚ$aQīW/@4赧\.pmHO$K T Sr"MuPi!L; 6@+QGIcR'VAޭݷ*ok66U*RpL.hJAo:KfL[6j{|?9Ep8Lц grwz.k"2B%o}fCWV@{\[6-Cx=k"F # "-yV.E;Dhwwk""S2 (:'"I}D1N(i(7M3g%J1Ws:֙Bye" fl5νVNqSw>A]eĴLFù7*˧%Ӕ?갇&\6Z=[K>7N!c0w>:8(B? d!O-'-;Q;rh䱑4)[ CM#o9p=s/ՕP PE\;˿/Ff;~yNN13_t'r,TxQ Ô5#7 A>L N~GA=5ԒEGy5ÿʅ%C=yA0>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~XVOYbRfwP 2zCHҊ]Pް[bv1gۗbzxؽg`W^&_knJZ5>:g^{=si36K:Rىe,=X.@BLJm[^=S6mi;/75zX/91@ZZP׭Y˩jfvĨY ٗzzcںY|ƉÔؼYuYǺvuY؏Yϫ}Y̅Y¿~YR;ˆYFS"vY7)._޻bY~WV;.ۜYbT( NؙYǻh1_՗Xňhr+ @ҕe]нp[(OȒ{LHҘiF"3A^2Ԓax@zŎaCjГ[oŒsI=ȥqYVƥRZҿoơ^ X͒×fEKȎM 0_no] >nagios-4.3.4/contrib/exfoliation/images/logos/fax.gif000066400000000000000000000035471314764422400226400ustar00rootroot00000000000000GIF89a((  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! ,((@ HV^yҡHq"43l,4IfaHsKcf.Lodgf~\aB&lp2 1F 0a @] 4([ <$Тꪬ2){0_Dc5 SJYXI9Ɣ"l(_| otqaaA<#HHPT 8xAcñl;98L!g c`23OgB{TÆأ=+c&c L(F0sN0[xLM;W#/Dp5N# x ;Tdz 1ɔ; :TM;\ʟ0: :ds4M sc$<ǙH:T4Q9A 3ӬC4Zk4 8f6r;4u箱L!` >{ w#RJ4iA%0("L:T7eUl pC .p{ =⦨"!T@N2 6`&"™Ae0h`V $@4*\x X*Q l& DA30"X8l$t H"4&7pB -d&6sHB-bM/1%@"p#z1&Z ;nagios-4.3.4/contrib/exfoliation/images/logos/firewall.gd2000066400000000000000000000051311314764422400235650ustar00rootroot00000000000000gd2((  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~>uW(:l}M(^v?zg("["~¶L"~÷8"Ļq3"`"~ɫő"~Й)"~ĺʩ)"ǰ)"п)"~Į»ο)"~º̿)"ɻʿ)"źǾ)"~ʾľ)"~ĸ)"ǽǽν)"Ǵůй)"~Ŭʶ)"~ƹɳ)"ȹǯ)"ˬ)"~ɬĩ)"~¥)cĽ)E{Þ)'])0q)B~)R)(`#8oi2MwsC([zLnagios-4.3.4/contrib/exfoliation/images/logos/firewall.gif000066400000000000000000000030531314764422400236570ustar00rootroot00000000000000GIF89a((  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! ,((@ HQYX#+ŋUř0?% 0]1FL5f^Rc!kb*UZ*٬YfִFG⵫ҤK.iDzqEZS&T⥗C7 R-lA?l0bvbL0HRا.#L0&(`'ࢊ+s CM5<@ɒk&$(3ԅ2l6"e M 1‹0 #M2 C5μcG""$2˴4L5 * ]2 /D71D.଼I[ rL/Ȃ˼L/TH t 1#+bC?L.d .r+wB=R+DG %e=!G/ WR dV$iZ)Bt^Pf\Y=8f}w} ,ˇ7ߙ]XQy>eNnV9"wr*C!)oES?' 53<>BU^;N'p+I -, A]RF{%)o(F6]$O1Dgڦ/o$U,G+BHČJo DI" L`\k,c-~QSF7&f dVzP:Vh@?\lBH ͮ:K"tSDvϸ|&zJ -9J)4cX!`(i V EO*e|Ɍ8s5a4y NPYGL(K sdW%z -q漺ƣ15)t܊8r04Sږg~|P&|}@)cٷA[磮7{ލ~ĝ@dO-;:=eN‘)ouF_VO1Y˞=#.מH;,JAָGG®8;/i0i@-Zlh0v_/j}ɲkpw[Hm nagios-4.3.4/contrib/exfoliation/images/logos/freebsd40.gif000066400000000000000000000027231314764422400236330ustar00rootroot00000000000000GIF89a((!!!)))cccsssskkνƌ{{{kkƜsZZB11ZBBB)){JJJJ{91s91skZ1)9)9)R1){9)R91k9)R1kB1J)kZRZ1ZJBkJ9R1R1J)Z1Z)sZJkRBZ9kBs1k)kRkR9cBk9{Bk1{)ƔZc9k1{1Ƅ1{cc{Z޵{sZ9{BƄ)ƥsRsB91֔1Ό)Ƅ!ޔ!skBƔBBƌ1ƌ)֔)ޔޥBƔ9ޜ))県kc{9֥B9!RΥJ֥9֔sJƵ{sﭽRZZ)11Δ{ƄkcsZ{kJZZsBc{1k{ZJs1c9sZk{RkBk1Z1R{BZ{)Bc1JsJZ{ks19J19R!)B)1Rss{BBJRRcJJcRRs191J1)9B1J޵sks{RJRJBJB9BcRcZJZJ9JB1B))1)R!BB)9R)BRBJ9)1Z)B9)cRZB19c)BsZcc1BƭB)1k1BZ9BksckR19J)1B!)k)9B!ckkBJR)1k9B{c19s9B)ckRZk199Bc)19B19{)1k!)JR199B19)1)1!)!)!)1!)!!!n,((H*\Ȱ6<2Ë۸gn4e0bl.ܵg"E+:sG\f D|n3çKE0` gڂlcO;i4jF'v϶z̭EMtFVrLmziC9bUV?j+'.@!E0n.'kܕ&d6N~u&n۳g3Mn_=~? WjOA%@uܐEfL[m5vl (ڪֿL mEY2 ![qu T18e= &c;!D7l2#N5h1*Q1TO?3XtF)S=760:FP6u;hFm2,nO7Ϝyoipy lQ8]6952t)L4y2 TAuvC4r .L5 >.ӵ ĚϚQ-DDR+ʻ s_?E>-vNoʚg`gg~P:'"3O9ω *k#D\BLqJ!;l'uKRw|/JhAq؉(>`zW?5~Rҗu)GjPFRgnagios-4.3.4/contrib/exfoliation/images/logos/freebsd40.png000066400000000000000000000031331314764422400236460ustar00rootroot00000000000000PNG  IHDR((/:gAMA atRNS7X}IDATxŘ?lǿ,@𝁈<RJDu B DKL6[YK+BCtDO—t TdŃ}PG87eqSJd=|~R~~N~9EP;3b.ߵs?#Xy֬3Lof˅ m9"@j{4'Qy!aܓ8n$eGVj}~o-~~V=hѱY?Aq>2{kSEǶA>ؼ:[$8Ɔl$P1X`^ @ڷ+ n0w./00?̿0C XVA?gWOHƍ҉dK@dV,s^"d$$s{ӛV\RhG Ց$Gby5l}$SeC{XqyaI8d8;N#eCFD aZ6)_S~Mmle7Mpӵiټ6ܭY[NՎôi;mB'!̘; 0 96SBCf7澦Y|V)I$vL:pG dݤ Cuq)/u[z,^7lqW=+^&Z ֒565 Zm.fiT,tsKTnUpڬNݯҊYݲe"FV\QqGYCkwK YnX)nHA^Cbq^Z-ڗYkQe|J<> Ői YVtvvI'Yef Z`]9Hg$jmWW>s 0j4 I:b'̎>gP^ݞDA7 {Xܺ&fh@`cPq6PW$k@'րv7 >h`N_L Boj8%=a D:6 X޾2B/ f%§^fX:,MpP-F4 `X9AQIf@$ B#'rn{4OV>EF`[l:+3MBDTڮ< }YdfBvHZ-s0B+-_6 +'(d~d<(:~2 $5Yd%Ѵ(T`{RyfsT7a;Qæ(0# -0D`F/>`F6;)sZv<ł/0 ~h1NX2+Ĭذ,buYW^Jݵ"|@ӛl]%dN9x]S@l\`;7Fڌtu7,  t{ys4p EB0%n˶b|yg:Tᙛ[IENDB`nagios-4.3.4/contrib/exfoliation/images/logos/globe.png000066400000000000000000000110771314764422400231660ustar00rootroot00000000000000PNG  IHDR00WtEXtSoftwareAdobe ImageReadyqe<IDATxZkWV>wtόgZ Kil|J Ȁir( EltiݧN9VO^"A^Qh QxYhM"CU+^)g}#0y`ỳ*8>~iByK:V<ߣ;mȑIg{Y@!ģ17s` qXӸNc8{J|c p|2M9P[4QJ81ѹQsʳr@ЏHn cAnDwj/` #xcd(4t#ID |ݓҙK@Bp^\F߀k{6\j BvS *LmjTeGAuEz!A{y6]`D_:LA>{0@8GS*5RJ=(bE ʅF.@[qBxyǯ{g p}i:dd 袉vA uXPIDf `KӇUw*slhqtqߛ!{$(%pT!}R7ZBPxv#ܩC&z{ȠnǕJ&9 b͉=$6lԗ͸e`L/RE q%a'u ⾩߶1n9{}"B0yws EMAy,OK8"t_~B7sGrhh ׏P,ӠmR!s[{JweEeVೳaI@bYk])F\hZ >ܠɂ)9C9cm\RY}XiX@xn;8|rE$c &-¦`zX:__9l$4RIH@\Q4p Dm` ,9 G"TR'Y[.0Ϧdd=an sfkirH1|6)G*ZҤjeSd!x蓆P(@49S m*>prFLڱ8a?^CQYE cyaL݆,׈ď޼B\<~V"+ 40L5Lu* Q G=h4CG>i:ە,U&rI:1 2\gGc4[)$eP&A.0,s]uyK kYԩh5  \=$-zTYkLޡ#Y"D}G`G{m+ zePT*83JVZȻedxR侏o.zrSޤ$ bt4r#@h%(;YI{b!C'%бł)wn HM;Jl18Ѭj !E( G@p 7 ;U2(EK$7@{{E{ LޡZ$_=D)JMh hl޾\9ٻNt8;s/咓*Yjȅ.^Oa;_5]%.b0="HscfW:<6g @Ԭ_2Y%'%gԈ і;|dcm\7j۬ z..Q*j<ۃ@ [_kSJvlۥu,H *OS~a h]ݢႥ P6 Q3h'@ 4T~{5 inp81xw:Nȣ2YXO40d6<,(;Z$Q\{h.3P_h6Z]zJ0ӉÅ#˦hmBrcZ-dҸ eʊGmkz(ӏG ,{>6AՁU3Vltl`vb#)Z)'_Z݈j+3qi;TEK{g8%yD0 [M^:*:Mt AxȏwqhkD͛pB82xm4}L(NnNpYn>-iMpKzφyw+BD!L-D3"Q<곃BKJSJ^>*{݀>C驒pQĹZ9P&בǭ=&YRW\Q='䮭aEa6QnK|Lאcr~!4tz ߤε}3쯛y o1&bTN~Kcԯ~[hX[Qqgi=:ItJm &Q{݂}$."][7vBk%A_=lō30ًgTAaa!eϏeקڀK /{hv;:5r:5!~O|cM?@((M;HGY^?Uqk+(hXt6"i=x{f-% Gq qD< Yv<8m+jV~hP(I>$0~wJ=n <94$7ίZT@A}<;(6y6>odq v9!CnUU%R m*(]u.=Le<ܿRA/nyUFoNMh=hPn<pg9fW #B:s߉e4=}y؝Mʦ# DPUɠߥzr__@ (m'a#Λy췾% ="b tTǖ?R6"U!{%"I# Fxm.#&6G}D*RDlagU ۢuk6jݺ=$⑎G6 ">L7HZnj?1DwB6®b =Šm }`wI %bډ~l3]>p`!OIIENDB`nagios-4.3.4/contrib/exfoliation/images/logos/graph.gif000066400000000000000000000023441314764422400231550ustar00rootroot00000000000000GIF89aL.4μTfdDNL|ND<^TԼ|̶Ě\JT\Z\dJTfl¼̮ļԼ6DJT~ܮr|Ĵܬ4>Dܺ~|LVL~ĊĂľtb\Tb\Ƽ䴖Ė̴L^TVT\NTԴLNLdZ\ԮĺLVTlRT̼d^dtR\lfdTV\d^\ľtV\쬮ĺ켢N| ?Ot N'?>es||t pas- 8un fiԦcwhieGrw!,A 0()"A`eX ٭f4k + ]QcΚK +dȩ玌.`nY"\>pqJdg 'LkmFlW` h 4ѵL)%mlٖ}j!iZG bjBMӗt)%k|pP }A#Žk\LfR&2iH@B _{`Ѽr-~&zh ׸Y63+,,v{#[]nҖ7n3j[E_-V%"FBZ~捓7 =Eϟ^"fnЏS_(ѓ2OOIr(P@M&`SA;nagios-4.3.4/contrib/exfoliation/images/logos/hp-printer40.jpg000066400000000000000000000027351314764422400243270ustar00rootroot00000000000000JFIFC     C   ((" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?6t4[]#OK4R\־b{Zu?B) 9 m$q. a|>]'\YU&$]͵oTƶmsX.Wm0l(w)e^9Rʫ,I> ?4DԜZ}U.Sw_PX@%Tmdi4'm7tU#oWÿ֢o xN>o-9Բ꧞y,k^-]h1,R0y]A Fkލ^|QyOjSM* 6ᇞzʂ J)MݾRQJnﭕݽ.YʬC) dЊZ +~3> i:uZqiO1`khC4 ՘_g~}W~>eR]sP%2pr pI5X#"]r`6m'|wܚ7ur# <`pE|/[Gz%%$A6 `X2@:kz|M,T;r b9Ʃky Cxfq:cy _C!6mmx23RX%c?t fkY|u /&Bjk.KcL9 ?%^ͥDyqk}tDCG2<-CM@}I(|}3Ş5F fJ[ /',vҍ|> mufWWWD4Me 03i@e'p6=::E(TJ:+owvv$IV"rnn$8(P(`iiillLUՑ+1vppEAgQJWWWP(lQJ`oo/p矇hE)w@P ) ښ؉EQ]8z1KخV$MMMiT*EA7 Hњͦcsqpid>B)e+&ŰzMT#0!1sh  )ـń8kZ8F7ͩ3`)nR1JEQ8O(lˢHƔRJQaap*!ĢX9 R:$bF:FgeP(|wFZ57cx_+Hvx~~Tc2-Oh84*j54rR)[}PuXN$؉Ï=JcĆa u] L|xx]3/a "c{:>].x<^7 "^\.*/Z:E!X,ommNm쌏D"~ PH|%~%XėJB5 '{/H_45IENDB`nagios-4.3.4/contrib/exfoliation/images/logos/hpux.gd2000066400000000000000000000046461314764422400227560ustar00rootroot00000000000000gd2))  *?U_*_nagios-4.3.4/contrib/exfoliation/images/logos/hpux.gif000066400000000000000000000021111314764422400230300ustar00rootroot00000000000000GIF89a))*?*?*_*_U*_*_**U****U****U****U*ߪ***U**UUUUUUUUUUU?U?UU?U?U_U_UU_U_UUUUUUUUUUUUUUUUUUUߪUUUUUUUU??U??__U__UUUUߪUUU??U??__U__UUUUߪUUU??U??__U__UԟԟUԟԟԿԿUԿԿUߪUUU??U??__U__UUUUߪU3fUUUUߪU**U****U***?*?U𠠤!,)) H*\ȰÇ#JPŋ3'â C)RŏI\ - JS,(͐8O_*؉ШM)*tPJuԡRt'Sj{vMKSW2*ݨ+֯ԔA'A.s+h7pN";׮T12 n]*wVXIbgWWF.}ڴ^].lf96˞(EJM vベG*ċӄՌ R&^oX5}׆O<ϿO@;nagios-4.3.4/contrib/exfoliation/images/logos/hpux.jpg000066400000000000000000000033651314764422400230570ustar00rootroot00000000000000JFIFC     C   ))" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?km>.;_IA<?jz(mᱵ$ՉN@f8 $ 4FUK3$J?M/'K) R]?̻`H#Y@_\-U&~6I-= F|;{>W$| XGq3mRd3R{Wk?Qf_ xLky,gѕ+ hO Bugol浒)Z5;f@ H$ pƺo'^& nة#9T$i 7er+x*qs,4mSiu{YJMowMowM|^_f-Ac/.m00s6ᓊ)pWZN5uFy׃q{o[ܴko>iq *9_fEß#K|V6m);-÷Ɨ}o{gx?KNեjd<ۙ؝9{Wk7Qt|z6yjm_OuyzYdbeL 0&:4F2senH]R֪J3V[3 _qg/}";}-+ٌiE|]gOſ׋5}yOyHrX_eP'_w᥄ҡ=#?MN+|mhb;c w2yu5|k{r5ơm#: rk +gNN|^Eʅ9i$|]Ae#Q]Ae#W4WOe?Unagios-4.3.4/contrib/exfoliation/images/logos/hpux.png000066400000000000000000000012261314764422400230550ustar00rootroot00000000000000PNG  IHDR))'gAMA atRNS7X};IDATx=n0)/VAsGbܚ>pu.@! J2"]\_%J4Gr(yq$};>fWmW{Ѡj$LsI9R~:cJ*C8 H"bko>ٍP ~~5#r:IE565ņS[f9 ('IJ֖?h nѧN*D3c1vO7[D{Dˣ1>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~q}X\߲kXeVϘPf|AefWۧ^N։AlyH™gg}GqKœUɉxR^a={Z~w`kMϖkϱtWj֯dVJՋot`nkVOTnvhϘ`81AQbÏ~nqܳ] WgEIFlV|vï]&vXYEs~VӋr]3qaq>98yƽ]>ԱYjh[kkfƽ]ahX_ةQb3:xƽ] tԁ=hjnSaƽW)T:[pݩn"cŽnCnZWLaUQQ0Piʊ_jNiiÞp]~C)Rcq[X?qoZ^IXfAbGpOnagios-4.3.4/contrib/exfoliation/images/logos/hub.gif000066400000000000000000000030251314764422400226270ustar00rootroot00000000000000GIF89a((  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! ,((@ Hq#B| „@TEYDx{Gɓ(%pDq!*)!Qo ՇN^^"x2&ΖSbũׯ8YNٳhӪ(Snhd 7ʪAC2y Lxp;^`0-pr#HjczۼRn: i\HqM֚ˠ2G۴QX3NlX̚&YZ,Piνu \p'^gr*ofS;|ǗaJ1a|M*Q6,lC48sTRK5Q"K0@2E,.l'` %fE@)qGWC%܄䓥1SΕXfy%1|(Xs:diens_90 @ΜtiL eTLG<G-j衈&8,qxF<~0r;t駠1w@!jX X3,3ϭ`D<.nM8đ9D+ރ7( v2 Y1-~\Œ3"r>;á C(ĒhlD+@c#O>tcutCM ja5S2M83lT$9;jq(.t0HHA'В0+T]+~ ?Ph!J*df} p>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~ʸʠʆȢ}ܩuʆʼnŗȐըݼ՟ˆǻ|ie~ϽҽPu™eŶŽ|G5EmZmϮ\1111HߙeA1'++''G™QzT\eeee\OA1+1G1+11+1|6@ZZ1++11+11+11MG@`9@+T161=QocoQ16666669=HllQQ69996T99999999HuvT=@=@==HH===?==QZZZ?C?C?CHuZ?CC@?H|oCCHCHCu`CHCHJlwҗHHIHHPeJJIPmYZqlIPLPqPNJ`{TLIqNPuNY]N]mYmÖqg{uü٥gÿÿim}ܾw}Ҩ֙lw֦iqzuctƚ||||w|nagios-4.3.4/contrib/exfoliation/images/logos/internet.gif000066400000000000000000000034521314764422400237050ustar00rootroot00000000000000GIF89a((  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~!,((@ HCIVnu+Νň!bS21YrL.eb$H1܌>%J@J*)TӦ8Qf*0IBIT!0Aj-[6khJK6o| 2CjUK^={uC&*;vślݳ^԰=FMZϟ/AAWG$Xɞk֬OH\:JRhtkN%76l繢ׯaƌ%&-[3 4y>wd,pBծiMMrx>E&;%52)lN<#<V#&h""8<+c4J \H+`C =D"J*oD! PBklaoK&o 1_QG'M-ef(`lp &|B/rW"d)b mh%`'/d2%qD x r3@L2&]vb̧kYM1m0w pX3֘F뮼j(8'| %+%>-M*u(0M9Sd}nM1@ br5hM9 hO7[ovK%T0`3ڤe2s 2/+wV_)LSp]i[X5#xGS_)Z-a/>];*y^؅;A@K=B1j@Ly7LTIjPD+kT#oԯ>I=&{ Yp_ta(M7Z*0^)`^𪀴a!ZEgwF>z4y*97BX֛ɿ:>{6mm}>$C~X!֘* hMa CggחI: ]0-D: e>mK(JaO_|*4j-d6j6Szwp%$QZ,pF,ey<'Jta_ȗo@RqTGՆAK 5K0 jm0ׇGBQB3,iSΦ+Ԇj)dBɋX2o҉ŸȖ/Ym&&@+*kmUQ%VF(D"TܫHL\D*0 fpL9DRin?'n/y_%fE7(hq?5p>@XOD8HhmGɓ]P8CAmڂO=-hf B mElY1)#!Ra|@"q;;-h`b<"o*O$dq㼕J ɾ-g![S6i3U/#;&o!Ln֘яT2PЧUs+?{[oWpsVmOy`2i ˙|yi 2L)0Y,T)5MⅆCfK4:Y=9ы{3ep<,|msMzR&o5نSkYf:]hDz)qVs 'axb%_?_E 퀎~ևD,VmD9T v`\."L uoM 5ee4@Eo [/dVŪHmw$]^P0*-^kC%{zMd&4z-߇qyQ/NW*hFc8)snXNnb[AW]#C}j $)܋ ie4lT%M !XMlEN`RTyږ-ݨkxQOvsڷA jRAgd@[y̱^B|VYx,NC dHѴ0MlZVz0 յjB^GWWۓ$kIl/<ʕ)ѿc.CO0Bbi٢KtVgAˆB.^cPUWRţ= 4]W ~@ m*]7Vkj~ڋ#ïy_rryX*W}SJL_  MXXCfhi5uO/T: y?r|V6;;{qhpgt[%' {yirV%e$ ^Gome]'Qg鑜[YvAX\Ta=q>777p8W_m-|PW^*󇴭bI-#xfrolReg*l8Yqٮ,\ Gي׹\^5:22w_Nz9S“A XԂX-DL D bXM\ &Ma {=׳LGcnkצ"Sgtl qt#諭#]{ {sݤci%bÑtgC\˻L^wf5 ckA{|` ϣ+Sm*,W &   jZ vVR=ڴar,wbD"֕uAYƕ\ALn p*`ߵ L瑺g9@* _baD86}qmZ#Ć.Qّ+u&xM h94^y:a0tbbY){Ԁ:{MPgLlFl|,p8{v2 scEJV^h9y-bX͕YGS d /tzU(:'|I(2@dPQdVH"^|zaXWpvn6QVt7PW˕rYd.gX_[Q, (/ȘVW R2 @ΞŃwc-A@&U[5\mbXAo_#C87w Y|o[+#}#kko24N0׿mH,[ŋK @wp¹sgq`uuř=`1Wמ2xvlPu*E6|GyMdB ȭP*T=iWZ"SC4=,}lj gG{w;׮EW傟1@^*ӥ'O={# D$Q.[[,#BqyFLF9iJQtX&*%Т"׻7:N/:yx?99ٶQ:?gmX_Gޭ}' ZA,)q|bBeP"I}B &1CFSHRFP`!,(4 (,"%H޻Oņڑŷ]9_V$zy}EwXP?>?d J[2 +NȬz +uY?)ZͱxL_rMU._yk#K9IKS%fF|#?ŒV28Hz++˴rAos*H!g^ `mz(OO}ͩ#/[9DǁݓN l0%q |;ٟD;ՕUQ^#C'sCe-Lh|_>}cG9YW(6ORH{U7rQδ㏫?(77%gC3V5sׇss'\}J,хfg="g\Hpĉ29Tv4Su ֖ǎ}ɓ i{o{عTɶ)YI0NR%}ԩ3?c)ܕ/]y$$fdxXv[&^:xP8|m|NT&ͦUT_91XtzIzK$r Q7Bge2<{jxa˫-eF]Ji/{߮ߠ*$i;6-z3IENDB`nagios-4.3.4/contrib/exfoliation/images/logos/ip-pbx.gd2000066400000000000000000000051311314764422400231570ustar00rootroot00000000000000gd2((  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~Bͦ`qّVhˁ\rgyؚ\hΈZs`sNKPzһoZ|j–fcȭdcm׹d}ͺ`~ƺdSZwҳwdþdOf0Nթlh¾dp;,7bRԜgr¾dĤN=[H:gч`{¾dɧM20_Jw`y¾d̊OOY1cެidb¾Rdu3.]m@ؔe¾π4ܽjZ]?ܤ¿oGٱQ.}٤ϋ#_Ґ֢֠W-xӠԳj;О|"Ǩ͜%YʙӞ\0rǗЬh6Ǿr2 4nagios-4.3.4/contrib/exfoliation/images/logos/ip-pbx.gif000066400000000000000000000031351314764422400232520ustar00rootroot00000000000000GIF89a((  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! ,((@ HDÇKuFa7Zcݼ C 2:nǢ#&cʒj"%čv Ryx VO^mڲQ{̘0_jbEF?K6-kƵ'F†Mƌճ53mBEɝK]^-wIṳTrǸ{m#WaPR%)iBgEѤ2)[ͺuc͞-rЃ Oh U ,Ph`SǼ9Cpɶwkν1aƴ!%Ҷz˟O^=xQCZdd ;pR 5!(P"?C9H=\ÔSd 4XM3E@ 6Q 9H|.i 5q? .\bH,@ Wig Uq"ΛDbŚq 7瞺QfΠj(:h…[Z:F*餔B0s 4G2駠*ꨞAAϫ*무S4lR01% L<k";;@M; JJ3\s 8R>H 4(Y0F!xJd;s5D[TS?JU]@"ɤ 7E?֤t`/ q#|A 5EK'EbI1t]1X=ni#8+84@0|\9A YZ&b/x(#㋟t .P@;nagios-4.3.4/contrib/exfoliation/images/logos/irix.gd2000066400000000000000000000045251314764422400227410ustar00rootroot00000000000000gd2(( ֜ﭭsssތRRRBBB)))ZZZJJJ!!!ccc{{{999kkk111                                                                                                                                                                                     nagios-4.3.4/contrib/exfoliation/images/logos/irix.gif000066400000000000000000000033071314764422400230270ustar00rootroot00000000000000GIF89a((!!!)))111999BBBJJJRRRZZZccckkksss{{{!,((;H*ȡ`Å^  8p`aCĈhB  @` Zp`A 8@A H1@ 4Ifh*4@Е ,ļ@ Dx  :A )CJ O @H TT5X2&D̡ƒ6E0$r@ejw{/t`  4Р0HA TuS Urh!w, $`Zsd/9%h!A B6`4r @X YPZ ,`j R %A u4C`7~myt@G,@FEPp |g@ t؀ITS.Rp@1Q @SBIP6@p@K0 S)nN f^duAh(hYd\@A h @Icd]E6С=Qy@@d#rt O9)@Sd P$g$tu] 4%hEH>up A>R@Za@ Po^>J]bb VZ2@MPQUK2N T0»I,phDNpA@n(p KQAl P@4 ;Wx{Pk糂NPVi؀qsߌWAF,s| uA$pN$-YUv38Aj]8 `|CS w}ϕkT3An@S@9<=p={bit>Bv呉ukA?bP@;nagios-4.3.4/contrib/exfoliation/images/logos/irix.jpg000066400000000000000000000030741314764422400230430ustar00rootroot00000000000000JFIFC     C   ((" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?7~|KZE<ۻ"p'&~W}|V–[NH/b1x([T~_ ?*ω^ԓ,.8P  AÆc?gM:o|0׬qPsK'Fx Kū6zt?]Y܋,(ʤP'ؚaHbƯ Ta,g/Eq(drGJ/|TԾ'xOM'T5ivwܬ3PGWgq[/B}ϻw$;ڀDRHHC#8 ^@'ҖV7:44۶YS 8RC1Go5/+ޛ\)uM2!_m a[⨌+$a_{t ^mėRGC#+aX:/#W44Zm.B`78F[;lr^^4S:?4zm~ bF6ۊ!ʒA/¹KOF%,jr^[@!.[* 0/)ZG"jӄ1ioJsҼֺ"Ե7ka K6rόn(nagios-4.3.4/contrib/exfoliation/images/logos/irix.png000066400000000000000000000045641314764422400230540ustar00rootroot00000000000000PNG  IHDR((/:gAMA atRNS7X} IDATxXQhW,# m 7q$d*8 В}v|}\/RKi!>:wa_2JcfS2Y|Ěv$8$}8vDk󟇐Yfww9˗aw[~;X)"2R9oۜsi1YmBuEV::EѳgdYVeyyYǏiE{z6uC$W\Y^^OOOߺukxxxhh1F)U,˲,0YAqGu!D,BMLLxg?˲lYܜ$I}}}n5 C/$)2!8_}333NGUա-b$yP?e98EjMMM1!f 7MV%2cLuM61xiiB4M駟TVWW/]488H)MDQ!qQqŋB1P9%;d$jRXef*JBYev;w\B#Jŋ, P41!_(J\6M_Qh4E) R4M49y߼ysbk4f\HQbض U.& Xl6[`"Z*,ˢ !v.G;w1y8o$IyR˲!dYϯ >|xΝm۶ٳGu''|woѣGsS*(ضٳJ駟v:ׯSJe7ծreY۶CpP(7 MӢ(m;"4QBciaXTcq7$I"hjբEhbQJ7# vZe]veq1v' rZS(f CqQABhjjJUUI\׽}Ccv'O26MSq~;v (YU*xYuUU7c dY$ Ae Μ93 ݺnC---ر烃9a(*!$"%I%s`!!ժiio߾8_xu==?8B:BqP;2qE0 1}\.u(z,пg9EBH0upu4M6p8ATU0Ν;y^.G97qmI o\:eyqB',i7wBɓ'ssscccz=.d$f5M~zG9}¶,VG].mðۋ1n4?38CCCME !FGG8^YY) 9cL$EQ^x!CQyO뺠A0ߔr0lAtĉJn}}<ޮ.//߾}P(޽{``:f޽{9i 59߿o6/WVV=l1|_uJ4_>5M.W;vZʂ Bk |;ݻASADћRI~30d ˗?4ߦ`Y~m¶(2eVS YXXj1<޾nEUU]ׅMbir! j9ۏESVi RK5 |3;"{ BHr aF).K`.sO^ՉsIENDB`nagios-4.3.4/contrib/exfoliation/images/logos/linux40.gd2000066400000000000000000000045251314764422400232710ustar00rootroot00000000000000gd2((jgiBABWVX̓zz{ Z\fOQZ#$'tw|57:bbaͫ1, fUݿH٩جˡj ުڥ٣ף֥աѝ˝~~w\ֲ8֗ebXћϛ̖ɕaYA ˒feIR;sTok7qlgXaF]D%"}w^~UrMnKC/V>4(mwLrIjE3"YBP<QD-xia`VmDkCS3Q? ,"LE:ķd;mUN-9#A$r=`25&k5<0$:4/0$  PLJ,!0H=:-++IHHZYYXWWǣ}}}wwwtttqqqnnnjjjgggddd___ZZZYYYTTTMMMJJJEEECCC999666555333...---+++%%%"""!!! ûۻ봮Ϯҭ-P W%./jA';)+=Ʈ̌Z()(5TdЮK78Inma㮮 gfwYvĮ⮮Ѥ! Ю㹹赮ӿ»̦ߴʮùݮܹŹȮѮ깹 Ԯl^ ]":& O0,Ʊ~|rT2":ٹN?{XJ鷮}RGD311#^๹ bDU7k>(1122(9bUceeT3*/׶E(22222'Lӹ`RBHE211*MH(2222211X zD(11222)#<⮮tB)222222)$pC)22221)Q_ٮ\@()11122)I̫C)211)>Vs޲\[ZD663)))ZqT1)4B[iʮۡydZFS-nSGVhˮ㡗xo{򆏁r쩮噠ݷu䶮nagios-4.3.4/contrib/exfoliation/images/logos/linux40.gif000066400000000000000000000031521314764422400233550ustar00rootroot00000000000000GIF89a((jgiBABWVX̓zz{ Z\fOQZ#$'tw|57:bbaͫ1, fUݿH٩جˡj ުڥ٣ף֥աѝ˝~~w\ֲ8֗ebXћϛ̖ɕaYA ˒feIR;sTok7qlgXaF]D%"}w^~UrMnKC/V>4(mwLrIjE3"YBP<QD-xia`VmDkCS3Q? ,"LE:ķd;mUN-9#A$r=`25&k5<0$:4/0$  PLJ,!0H=:-++IHHZYYXWWǣ}}}wwwtttqqqnnnjjjgggddd___ZZZYYYTTTMMMJJJEEECCC999666555333...---+++%%%"""!!! !,((@] H@Y> eÇm gď+^%S_Tr/`6ڠ X\*WiX|(ٓ=DPhS(*QeA *p- a(Ԋ2D!,s 3" C S)`-Д (tCAH$|?l ՂY:)3Ŋ+*P5$s?#M+,PS&W Ha` 3hQ$ 5PA(,Ac*2 4rwdaC?( )ń ;B -JNSqweo*3 VU _n@ ^^EZxovи̓X .o";hc*H$`[ߵN?ox/ Jg{nY-0[TH ۏٓ/ 7:łuRcW`=[?˰<[Vuwo}yxuu>xL8KbnA$Qa$"|d׬WeZdO{.qF|+i)BLDm $[i1M`bl}㵍Cbo>=s<vl6낕!Lbbbvvv h&̙3&)V؄#>//o||lJrRjW"õv-9Dg ³C/--mmm ݵ۝N <_ZZz:ŭl6(b),,Ҧ;ra [pvvJnwlWg6eXx<( {?w_y;A!?=S}weٙK.<e_Kee)σyҽh4FT&1wu``@mmbX,F`0X|NVl}(ٻ!!]7o<}|sr<77ٳbIx q0"qWzpp񸳳Rlnn <" kJQUU%evT{89>@.>|˲CwwB:M~_  D">>>AONN&rηh4D>/ &"BʃR*ju8 \gWtDED"DDV6;#(pgmaiJXP)4P!/ުC.\Z,gZ[r9DB<.%}E%ؕ3Q]]! S/:46f{n4P<0hRl߆ݻ1CZv?Y}? ᤤ$8EEТh;_FX!ߜ{_ce2ST FuuG6 0_CF7_ @(-ܐ F+DBo—ؼysr%ǽ[/ \%_>׎TXP,--}ןokT $+$?#s fCCCykhr)R T " "\&ʥW.=-B 2 h [\鋧V5_Uٻ}f /x!ic %'mn `S< ^=|.1ݜMLa w={ر#vVDD9 { ϝ{ 1*++5jFmjՉ'VkDĄVݦV)555k0Я?-$IENDB`nagios-4.3.4/contrib/exfoliation/images/logos/logo.gd2000066400000000000000000000104451314764422400227240ustar00rootroot00000000000000gd2<<  lkm ":9<@?BFEH-,0jhs¾ۣ譪povμԙ[Zfa`j󃂑zy ]]ZZBB_oommffUUzNNpHHg<l>>w >6===:G>>ti:>>Jo:>>!C#] >>zSt>> ]2l 22m 2{J22@PZ{224R 25 22C?24]122S@22k]0l1m <`G!i 4Ec]Sk],/.s(//q ./;`-/.G////,_?/-9//bh/.;kc-/-]//9S//k].+s++3 +r++)M++;D++ 8+.D9++<)/c.+)]7++9S-++&j])('s7((3Z%(('((7$(((c$(('('AO;(('($c+($]((5Q%((([%78_&77L[&%%8;[H<777V^f8%8 VZd%AC778878[&77A*777NNQNNYNRRHTTNNNMVWVN[NNNNNNNNGNNYGNNGꨍTPNꂍUHN[ꢐHGNYY HRVKU UFsFꪘH[YꂞUWOGZLTPlSMZSRRNPOKUVSSWQOKnagios-4.3.4/contrib/exfoliation/images/logos/mac40.gd2000066400000000000000000000045251314764422400226720ustar00rootroot00000000000000gd2((>=>.25"'**2()1Vi6:<)))))))))))))&)))).+))),)'&--,)n-))&,**3,*%s%o,*y6@S6FY5"K^.9%,,3,=E(-&*%.2('))))))))))))))))+)))*)-*))))%1,4.+*(/;82.-+$i+uK^Nc5&]u"Sh>L0l FU3>6B,5*KX-5)EQ(AK%;D/6#3:(8?+59'))))*8(sDS*1"*-'))*+,4&179)))*+;:8))***-445.@DE)))*+8))**+03;)))**1)++--..1(*,-./0*--.8/0122*..1112!!+..UVVA@? 2..(%%533÷uuugggaaaIIIxtkkukddlvjktAk/x:b8ጲb6}d6}?}?ԡx?;;=w>zp46ii029qǩg''h/U DD [(5AnſCFIRV[m{oƾFHN Xlv;ǻFI  0vBBǴIR\fv쎸ôEOVc3AƼF fõK 4üEM%3ÿ \pǼEIQV2ǿEHO Vh塿ǿL evſEJP Yh~rûHP X$2폗FN V%36FI TX`Z4=>.25"'**2()1Vi6:<)))))))))))))&)))).+))),)'&--,)n-))&,**3,*%s%o,*y6@S6FY5"K^.9%,,3,=E(-&*%.2('))))))))))))))))+)))*)-*))))%1,4.+*(/;82.-+$i+uK^Nc5&]u"Sh>L0l FU3>6B,5*KX-5)EQ(AK%;D/6#3:(8?+59'))))*8(sDS*1"*-'))*+,4&179)))*+;:8))***-445.@DE)))*+8))**+03;)))**1)++--..1(*,-./0*--.8/0122*..1112!!+..UVVA@? 2..(%%533÷uuugggaaaIII!,(( H;ȰCwËfCWg 2lɒ5."ː@֠BuV7CI*18 z1#blǔ!< EFsn>Vauoj1W?-oURZiG;F4+d`qT!Sc`8' qEA.rKڴjѢA+-S)RH*[PfO; 8ouN2J!p\ϴqZ4iΎ{EQBP8| 2r ,xB%,bDRpa@5ND|d32 3-ݙ"V1C 2tO#Tc8T2_@Q`# 54N(`C_5L22XJ)W\}@ 0ef33/b)T%FL 3P>4 1{ZX WŎq25J.L؂w:erEK3/y GhV /0C1_)7(j@\aU30oj$^2 fx"d ,lA ^ H* !;.$XP0 4 ^xgܔ lAr hA 3.\z )in!.@$`c@@id # @`0 1 B ?[-tBIx* <@B%@  8lx2hG!P|7.QC Dt( #|PP@ aĐG)GaA`E%dud; ln e{g~PrHQ%[l0,gv -dF>d #mlABiQ=@41yds Cn , !Y;nagios-4.3.4/contrib/exfoliation/images/logos/mac40.jpg000066400000000000000000000031011314764422400227630ustar00rootroot00000000000000JFIFC     C   ((" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?SyF4C~WL 4F=Cx:ƪg]b{Xsa8^½|Y_d~YóSnrז*K;;xT'y9Ff+XđC'XG~oFCտ7LOxXt<=knLw3#~> tFb^wq2sJOW8d%[\OpزNۣyw|sMKQ 3g : 5s?T7Qi۽IIHƀ* )5oſK]/XLo@2i06JG|=~R7v?hUƬUz祐 i~tsMIᶆBydE߀̱lt<%01q+kFT~~I3#0gk:UjI3Iajcoyq4;Asn9BPW^K23HS/K?[^VGt+aivmoJv9fc3y&hxnagios-4.3.4/contrib/exfoliation/images/logos/mac40.png000066400000000000000000000037121314764422400227770ustar00rootroot00000000000000PNG  IHDR((/:gAMA atRNS7X}oIDATxkl5E 4B#D)BH܂bT*'6RDNZD\VHnlaMCqIׁ\͚͜[z}$j9}̙|Nȑ={Lz?577ϝ;wNj0?=2iӦsW`=(`_8sfu_,ի.~I ћ=%% 'scz,{5`݊qCqoŊ_ 8>w? -Dr쪪D⪫+5вʇvd{_|zx Ө3kjj&aRV=ə9kVee%PTZ u{;_--~*((X|:iL* VM+zOο1ps%|:iq\,+]fΝc?loЗ\s#S;BSwg -+ϛ6 *rKv:]ڽcǸnoouOm"C!?$ '\,(/ Ke!4 e飑l4eKl|b4X  .R~D:8nKo~Az-ET `bmc!n 6ȳ@ ɨs]:#8sGF_~啛U9[#,B4tpla4 /QMox^ 4D52B$HD\8{4c0%6<4o:!l(0A e&A$e 7oe'c}V'Wۀ;Kt0^[vd,S;Zg$Idh p`CCøH,IRg#`#F+yjDT.'`kp.*E a'We<pvںɁSaPYB'7eYV1#켢mUٛ @h7d呤']ή~ m\Ro\LRXGͨYr"59MMMwϞ3gԉһrQ%!cYM>U>h (;^]wZ*}F8RjY3KV-5ePH( d|-*qE(6Sc>}&IENDB`nagios-4.3.4/contrib/exfoliation/images/logos/mainframe.gd2000066400000000000000000000041211314764422400237150ustar00rootroot00000000000000gd2(  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~OTğZrȇY]߹vF\yZmӊV@xFcFfFӸ\FʷЪѶ\FöЪʻ\FĵЩĺ\F˶Ш̾ĺ\FµЩĺ\FɴЩ˲ĺ\FЩĺ\FЩƯĺ\F߳ϩůĺ\FݱϦƷĺ\FڰϦ>ȴĺ\FدΨebѬĺ\FծΫtǾĺ\Fӭ̶ͫ˷ĺ\FѬͫϮĺ\FΪ̫Шĺ\F˩˫اú\FȨɫ֥º\FƦǫӤ\Cĥūѣ\Né΢\6_̠Z:]UkʟjT3Ǿ|QKĹR2gi>vuRFYBnagios-4.3.4/contrib/exfoliation/images/logos/mainframe.gif000066400000000000000000000030231314764422400240060ustar00rootroot00000000000000GIF89a((  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! ,(@ Hߓ XvܵHEt3˚dJ%+UB\7j̈隅 GiӦjX3fh-Qd"SJUjV1fXAu,SZJ6Y^1MhU)WlASeֲu꽇9er֭[g:2v eV"o^2Jֳ5K MZ̚ 8J0]Vɮ&5B9Fv(mxcIqt)PUUpMOر+gf*UEEjT_|o1Ou-N*uU+c# |g 6ؼ * +YC|9*tV6\fɔXbCB̊4(hc/%41 (I,D QV@қ Q1%B] 8\rM.v\5ifÉ6#t)g:1P[!S<Πj(*O7 K-j~J,4s =t`Cά J+Kj}|33H +R+~C  b/ +"TS+ά -L44H1EU@pړ0T!G޲X%h =>ݱq"x/E+]Lo CkR O#^9PK9P`AڈǏSzee*;CR8T-H5ZK]X~VI]G0 AduH\WyG} K/vTJxAU35 '&qQ2mSAMna&ct0BdpvUJgxEA<.4[T 0!a.JHȂ `3 pZKH$ZdF$ '- ?8ahɝ`䦃+O<1Ɂy喛8br 0 i` ⃌-y F\LH @vrDN g–BFN1,hZs hf w+Ԫ.B(` %t@ą4)0pRqJA^" R%JX20% St`j U@rCB8g;nagios-4.3.4/contrib/exfoliation/images/logos/mandrake.jpg000066400000000000000000000026701314764422400236530ustar00rootroot00000000000000JFIFC     C   ((" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?NYq1)ws@jt}H'ٵKIʫ2 u8k~(^6؁pS 26~Cxlw-x򼊹v,vU|fxQU)Ůdnɭѫ__Ss VdMot{Ytu2ڪf;c{G,ݮGSzWp_>qSimJ;[zgJ\ OeԊ yWU18k86"UNE'?u^*-+F=wss,:&%վ~; ?jVk6ॗ*OPkJAy& ´yVw'-y^_ecp8ZoDݵl>+IQ('toڭcD8lehR&ʧ+yz^ ޥmΥDO&4 ?lCKNC04m@u2zʡg[ȪtWWձGC5X9ڟZNhˏ5SW_>Ej |JT~&f?pnWUy 0*SU*m6Id]2ͭʉ)UUпl>/Dv ^Α@yM]Gc^?/"H(+":tP~t [0S_cO "`Н0\?r s%nĿfmfÃމ̴Cd'O;ptԽ9ى{3z8uxcIزrj1&B~e :ez!C֮"XU2ĄI*tMdgu"  gr]!2( \z|Cɱ*Bjy;A[xo^vN5bޗx=a Fq=qB^N[nq' e[ۡ[֟z[oo8yvWagػ@[)ps R?snsT~ Hڽ_#uj,ˊ2ͪ yNl·v{$!6pFv .b7D"2 v IHWո&`)@!HV>-r R,Gv¹M޻~!I@%ZAePoyFbT$YȅD)[Q~vC9ɢ&#"J3#bc]4~2iݚt(5lgvW/VJQEVQ+E8 x؁*9(6n^Nv5YU:E.(DL&Vj*ln}M՚h/&M5lmu'q 8k֒ td \$f#̚bpVŊ>`eBlh.Ԭ$!9q&5}Z$(bhp2\Tu2 },XI3- c8`$8Y.\:j#LO>7*]8Qs XZR 2V= ^dISXBS<Ԏk}h!՜(pB3 q Rs(9#G-uN"^$#%,1D( x1p|ɿN 6yH)o]4QTu]eOVK+vBƒ 6"5 <\S(H$C{:ZVZi$C#E-OY [ٕ%I\ )+D*`oۚa|- %X3TPL 0DKB^f(G2πYPjMm_ĢV2I"@nyִֵ#aJ*^"<&@otS#s1Ѣwd8΁XB3%䄲 jDQN6J;%l27sFKNBAˆu:Il$Ġ݌\pm4bZR$g%5;s34N)9,D]88PIhwA0͙]X&>Gd`" >sBȔ0tZ͙rʉȠsQ|M5 taȴ%Pu0$LB`"/1W49C3)*[Zc3- 4&hnDqqmR$|jL4҉IHL+C_Tau.-v!Nu1!$֕Hik089L'+Aȼ0mnzw[{@d7)\I5Hйɽ!_Zl =o"ar_*;tv -I˾yIs":LUbs]%hw[::OԮz"$Jx 5]hIźeM& ƛH/PrJp9=9"nݱmd$`*/S)۾OA=-*Ba7E86p5ҥ .oJdL Td8Rs R׷SpG`oQ@}z:[FLɹzӾkf %HU23U1a98^$x͑ASH5'i؜=y{b+L">BD_w|TS{DG8?whLx33o1<;j>#ӑ_}.u`_ $&mAo393(lJw9ˤ$Jx9w٫T[aѸLUٸЎ.Dawa!5}umS%;w ܇ nó XlSMZ__NspqqV LZ1xQ`>w[Mֳ뜐{ u/ 06mll4o&z?P*m>i;\{>̀a7`wVCvn l;m-_(t@Z:~`vvy҂ sZ.glѣG^,6(KKK[HOq\w~|2& E$7?9['SŞd7݋+ţ(FE slYJau姆wgBYR=[wяZXtn8;Zp ^x^ [ .U#tu+{mR7{Y)\,K~ ? Gޚ4~RTfu 1ڳ%Ͼi{qߝ-|^(ZwWo6?,v b*{{{[Z- JAwvvpAS*"^'Q{SsxxޯJG Y%HQTjՃP ձ`SdOO{.^]]]`&|`\o޼^mllllc:>´c·F]662259|paqayyyu䶂e(aͽ~zww7#+ݻc@0^F58.[[[o߾}Ǐq#^w]pt844~h;\pӅ~_|};{Bzb@?CsP3a³gϾy4z`H•0G&{5|'|`Ơ?|bP/ `_vݛ7omgN{):O BUv+WVʕW)S`a{|/#;ۗ>%5|5DQqV~!?B555c'M' Ax6!3 N333s"uqSHHG,XV9n&J){uTsaz <?:  D"Ք$I3A/Spna`CzI!?\~p{+ EX0 t %YViIec~((Q Ct10r@tACqaT@X&GF&'/T <@g@ͦ:=A`[[}y/I)y[|_J=22_r<'_?I_{6 +/ ䷐XEG&xA0 A7n҅  ߇SV:^+3C߬TJxs C C <wڵK.MNNvvv'羦_T$Y%!Q:q0 +j .q5Xx5)²:96>r}/+\ik8noU#3 2}'o\k|uybP޺u T:>>חf'P Eo$Q__2{)Ģú<7AXEu)~_J],9͔XL'-\G C 5JOV}3D%% S8Ǿs 9i{P}K.*U\]իg]t !V <)4U3M]IaܽML6N%Qh-b{Ls.`~_NΙ"R.aAJ% Yog^*)qO!$$ •'O`;z:@tE:׫@FYreC!W -Sٶu,upҧw ߙ(smˋcKؼd ߽w;nqN?}ՌTPOZii/D[k\0yJj4sHB~T>#z)SQ֜@MGt¨,x===#}Y@+R#uK"%iM?NzBs[}{{L}NG࿓#4X(܎RRҒpn_?GFGw'M訽2!m-%1d~{v8ZeX.6C;7gvO(%G?*uD |'<F_dI緬o"&N9$! o( nTL>tR ƛQ:`-K!rS{D۲ q=?q屮ukowW<{`1J[ %"A>u3|Da8`V0%x^3U҅ C#X2!K&8Kɽ{On r>lԘ*16p]FCwuwK )X`dE)ُͪTƩ,mk*/,,`V7[GߦO֔˥ fKX3&Ј.7&Sk V϶{!+)K|ߩCG;?SM/,ݷ##C`##[+tcޝda b!q;^L#4n^|m͛K}WOgwp kF}K"uKn߾}e, >O8%)Q-?>33STJB*8;|F6;; Kų2~r%P~ i`;1|̓jvVRkuf: BŋSwܹ}Oi ClCY @x@Qqd&=Sj5!yH126/cX$h~|Tv?_vem\YYݿ;bH[2"ARwr bCnS![;n߾Z^"[6@#F%=](0:=x" uu^ERAܫQoOhlq Pު=}rXez(+QMQ~8-UwL-eKf'~GuvVTWiAm_5;KK˓/!3 ;An)gϞ7y!a*ξ",1hzRS֦)aMA!_|5 ]Z .n%Xc'i3 >{eGhAxjJ-_v&\o*|Ni6Y <)f7 w Ad$U3|T*M=HBlZL) X3"& O¹%a.N%5ҬhK=(1ؗ^\ ?<;Y_PdÃNhu.?f|uy|7`V;0d7BL{$UYAU+QEE |x JBN??[_~Cl{B(b0ǚ 9B]Az:l0M >Tmn-++kw}yXoT }MNQ b;Jen6OSoS<YUk ~Wc޻wJ)J͎gϾ/>RdrxwWEir2bƉtDD%WVWӫWbZgx()9ه{Ioj|O\)Hvʕ+4'Or<!~*cbǴNb"oG=y 6 1Z}:^[OU*A&E'QaKXOХm&pbz.2}QrΛ'[T Z$ $x|5Qb@޸q+|%\33ި" R 9c{#'*E;n*0OCg)ڇ<_x.8)eGu6&Y_|cS0hy_DIDHdQH"4zVq$)N::꩓:U,85ZZV&IBvR)?ltuS5V :HB7,t_<{m6j*)jn!~R;^WW814vN-,ξD )& x3Ɔה 0( 3_ qD1P|Jnq_(oݺ].;E0#~ѝFNkU^{ 7h3/Khc҂ԏ _-$z `pI"-T.' <. 2~w|MO^L4IL'a^TQЊb:6Xyd-݉.a}ׇʥ"M[6sX lBN$S,N +#CiR颇ҦN-T}bͧ`Z=\\@0X1fB)XUw|'˃+8[Aʂm?SI%Sʕ4Tr`nQ.U5ɑQmAim:{;2$blM^B&O( =௃C(^1, U 5g@324<:&~c O=77jV-.3)!(h>N?jq<7zj׹,ҪM %{ҌysעWԷ ݦ/g_=|6? >9nin666U{ZKV+%Iw}O=*}v;g̫W ? Q4D]G6114bOMH~k\KW!aYTR-~X"sRE/5 $8<7r8Q$`qaYLALiRAlK{aj.05]@E~A&h ưAEȌ+~*prG"9&znܸ'|ɧ&::hŋ\ylߏ x{A֏KnI=|呑:8No4`F%[In[rmaT ؑ}<~?wW{(rQ f._6V͛R) XAx}w>^|E bvjRQ)QPM'Xk'!0K9'Y0y xM޽{qjԂ+c`Bӛy//^ tuulnb$x:XHWB 6'z;1bxlw0B=2)B@>]JnRyAR֭!Ր&Pro$c :ĬadV7ZbzBofRH߄ ߇2F]l5iNGj^i0 ԋ*C )O\z,L=㶴>vKz{z#ӏkU kAd(P-8tй겅}O*+8 T>}GB$0w_,u1`Xn굮.j?IN?T O z܌#wʇ6VP"h"ʐB*J mo@BPN& 驻#B ݝM oH$ 2]C~}/(}Uk[>tMMO"6%ycJῑQ:% ّ{'i&c Hے&%&hb<4 (*UBlocAܸdذ$I1;:eyƺ=Iɴ/G7?V@I5HΕU\`Mf7qU´YH"zA 9Wz Q{rJzjthIr&(f,r(';ړj6k5n[_dQ:X=I5yxx}^gy;\rZ` uu {jǶۍG-H`H2ANO +ᒁi)H>4uE 5|noAgøTZD` bE=508۟):x螘typ, (&.;*`,G`gw<Lcx~"br S2W[/=R\t tK(!.hScE=6%:1M0K.ʇ`&~ȴ)I\mh' T6)#=vֹpZWz)<:!9c3,:W4Uxd K(w$4I򌺻KzĈe cP5|xHi=COAkeZ+QS3ai`jI!eW$.\|n s$ ^lO,,rGO\Rh3L1|:!W M$I3OL+ψp}m0"[.帟Cݐ􄰁m'Vt>FťB" XX_ˎ;c%Ndx3 . 8 “EX?H_Le,17DDdp2/L|,7_AHe% 4cPHȌ2*`Z%gdDVeƲ,w*SzBtym]j~F&`TCv bKr} E2i wS/rozR:0ME%J*Jg-742(Wx_O.ЭrQ{YBKMV5) bk׮|rqqy_ \l/CV5OL~oL\ʕ+X~eYgE0 f&.:CT@t6'Akg-4*g} NÀe^ z D*5A槣<ёS_1 }$fkwFC,kpV*R(u$Kf)CIytP#F%mm>>~Févr;|DCc돿+h!aɝY5 h'CBHd./-e`20#cL]\=CBR>]L>sV!77775kUKS2u LbM$V[0fD' Ҫsi祿F4/ŏ2~hIt ;81As QFe.N$gg2"*NɹXoht9@ ,! iÈ.W>z/$TAFGN.34>&w߿"-Ĕavdݭ+ʀisx oƖxw8o) .ܽOǨ 4&jdtt6̇~(ȂҝQ !{vsWF6"ѧmdK"R9* "SjNI=,*0#{AebhM[;}av, I]%)^P1鋱zNR`k&]zHt^~2)(XАyRʇS0q@_G=.E&~sEO!INR#C`k6@]reݫrHk})513 G5,)\Kpx}u. !Dvh9nMSŐfV%^eLX>q^|k:]u~wtH17oނJj8]E tK ׯxcޓ;87Q0E=Z;K^o~Z 6V4tKH wq-6GP7 p%(!= raLVo,5 ?XQc ҈)7gf`G{&f(کB[H=dn4Γjy^/wvwWV6y] waKmnPSfs޴ZN*Xy#V,xn[tCKvI0Cct"&#{ފ٩"NBF2a@Kv+4b6RMpHG\ru}u rx;q]tyc< Aۂl'Fkڮic. D/uoaQ!vբ!yiG{\J7u c G0O迦9lx#gQ`%,a͛`ynБ>vbwǦ?N<@,qlVqny#,/ i:I‚z-\̧+J(. ]w4|LfF+/3-0#斵C{#Tݽ=(W kUmnl2%Z6ߏ2Y8BK"β_k\5 u~alBk Wӌwiu>TYᆛC-F_Ě, f0gKrjkפttN6}kRY Kb0'{u5jPZD< wЖmuܱr{6?Ã@7oބ4luMm"66J"HM l] 4<55uu`B<~g^L>x Kаco.>xÇ obzZS9Ҿ8uIpiqq8;QgtH8b<-(K;stwwQiNP*үƼ\/U#cuu1T 92Cި6<.ǔj'ey[󰃽ݢcrB[HL^zz`!7xe'lxfɾ8oQnq}42laBl޽ TZйȍu1qt?ᗙ^S%L%"8 ԕlD;sIT&]̏ռ=VŰyiyx jDD`?s)@ڼx`Y*3 'O$W=2aKneg%s?44ӳ5VqYP]N?,|.}:15}LC8^cnbACX^ 5mvM~zҷ"5REG9dX $sE͛_0k .G^u^ x:n=컓Ii4IcFIo.j`yϹaJi|Y3sϭPXhށ71rIYT s>0TfY9.} 3 hiَ a.ߖ6^=(aM*T8׌0}Pv'e،`Z]2D.=|zP{#x(ڙzJB x&=*xA1 ՝݃Z_=8r»xl5BׯfUC/Mt5KrGuXjbG]!_ d}EokA~V|8ͧw.Dս@$ ?:cZ\x?[G 1T.1}6wAulT%ūskxIEg=iglU !ab!ŋO/-p Y7M@@,j?<2ɹ^`'^@"qQX#ʓ G[G~SfҁfKa UJ孍MlQMgQCSELVaE-anhH=dRz!d TBIfՠԭЖtk{@PV1:: 7I-];ecmmSxX>"1{q k"avc;.?;vb0Ff6CP\9%\BSMrz{AZyi#6bɤfə?qte߿'<%.;$ֲrJn. #Q~jpꭝmdJ@WD4:M׼8.fci6q;g|D襺A6׎z6n=\. Ɨ7_⋴-,G=!qD1+{z:;vxP.>>\GS;^8$" W"/Q.ibY^`kׂ޷]oPS{|0H娆&yB jfW7$9~Uw||BBCCK+Ϟ{}(y+p}ï{ɑ2.uf!O&&S>3Du4U"L•isVi&rI*fdWU![:iwR|ڵ?nv^_]VϚ,۹7- b/R+B-=f6CI$],--A@9qI8{.KI1lDKu 3GJ@%H?_V i"Q:;&9ڴSNɖbkaP< IA~Y+USZo'?3 ?صŨݜ$@ZbAGsttt v?.C$>7j"זv wS"nf¥pgdyo}q *YP.bY%YGQabWȨ"C#5:`")[<J7D (-U/MoiRDȳ.\t>8W ׿"nQwNxn"2`f!aAysIC?K6Xb61i86B@0E"p~䑱Q)V:^:]z+4UW đ^Z#J rZSZG0ݐO?ۅr/Ð|ikY*;*V}>t)G4hht1[e*(pm&#wv拕2W uaEawG60q93c İxSF9QVI>|=pmm6V$  QEQ)$>kׯ_2Jl VRfniwW)}lx02Rp.tD _Wuv*~D A0m dGtn|͛M=1:n-y30wUYD>/73v.v}t"gdf5EW3Nњ]0Y, Wx5&NCe-..LQhWo^f[, H2ԋ oԣf +!RqxhT<#d~ p J?P]\^H*RRn|JCo}p⥱fʶE 2>0 p#>XE )aKPPjf~%<2p)}7Ty`0/NAPu lmi2~9l "d^Q{I;;[2Ò<cgKZtLlT^ ';Ү濃#&._++3mRQArXxdQRJk}d#G-C-2$Im*dw[?{rB*{W@~uq.T'(EQս^`zp5,`";S]S.Gix1~i]̇|jFã&gOa~|Wpn.hZ)~ ,FFͿsa,goF)5?`Ǚ.<3 0xA-u~8= w;wML`BD$=EH==2{lۑ2l8+DGx;;޼.YlݕAuQX;nѦ/;v#}2U-@6kd9{T;pi7L?_[[Qeˬh75bt%H& woDdv;vceß,gTK'=L?6IﴤΜ]qiqMp+$ay<@ Q J<{4}MsG穓=p1aTw>[Ͻ$kvV+E1Rݪ Ԓ%(WZ5ꍞnmtʞD˅"9?[)[furKϖs=5pΰݳKogIWO XVFsl)i6~6}"NƎ,oy!{t:OJ/1srDBޒ[;vXs'6m@a/'Xr4)Z|"%UL%նl^viim9Zؖu7xvjVDQ]Td娶F_.ڽ{._RjpNsYlSp;̱lyOOK=]&&dv2O,êRӂ˼W^=zpi4_Se8"fzx'5.M)oGNIiz'6Tp - ܾ@z*^=]7ƪ89bC{B>bP;8B!m6="׼ڠѐy++cc׮]h/{> GpZhoiGd&yd91'|<:iNQzGh8Y 6 ibbGyA3z.bQuM<`9ាY]Ϙ ]qhtȎo|~߼y3i+duG.͊3=/-,-)H7RPfp:"dSZ ĝ;weU8 $"R!u<*]z#Jr؜##7n'AVduO `h$ ϩ~s6&hnQ_uҏ+l)OųqG^9B75-LbKMc4|خ/_f(ZPVHG~C:baR73rHttL8hekdf7(/^Ą|G>l4ϟ8Iiǚbyy$F]VwMNh4݃f(u\%:1 =laE3 j'% m|9I))Cx Cjr@bε `zX7]vEvN ~:8[֌u(\V1Q ;7&`* !2(I/I-'Y.t2J).ul}<[ym PWAwx@ F-< R cy?|8$NِTyi*xrne7eOۻbj#:9 صhfn)XJ?a-qR) gսfT;3i>d2ҏ?[:ƶXn)gZ"هmy̞$(qvNxYnL&Ɓ ;Kn'{(! [P VBM;pZt9O)#]*Ŧ8%}rKxx@M6R[XR+sʉ[|hwȼC9AGod:pTv>WdyM?H~g}j~!Fߕ?o<7y2KiKYuT>[mPnm ST* +d$`nmdE#(z'엔$,b zj'RҴ6JRARۍ&&J7SAHl8܋2䙌&GF@W(j''DW%|f\w.rH v=DMHqoM$unn'B54yNSn>]qۢxpbH )=R }çݴg| 꾆aO>]qۢEj+^3N;K([lI** Pu (eM F84)2(`+ȳ?:". KP"b[ֈh bdGBA+_DG4Enagios-4.3.4/contrib/exfoliation/images/logos/netbsd.png000066400000000000000000000007111314764422400233460ustar00rootroot00000000000000PNG  IHDR(( H_]PLTEwwwgq {0@P`p ͰbKGDH pHYs  tIME /#HpIDAT8ݔ0 !TE2eJ1]; ؍ڋ.Y= hRjT(i BO ZK-/jVK{ĚˌZ@X5XHЄ$2.daBP Q8DL4ܒM8q3@d6[ّA)hЁ .&p3tN6*rK1ӏ>31lADЂ11UHC|\XB)mbYp\XR)p"H$F"X'a"v4W%@%$0lHp".$q&;j,30dB),SpD@ 0@R,!%|a J&b +Ls9ǚdA#T@0"U!- ,`HGd=@ Dp60DBpjJ bAndC.[P =0'va?PBv`pd쁇N X[0 6p&nnHaB Spс]pPyGptЃ1 @%YLsF Yptt,ݴL 0X"Jj(PD-\тLQba0^f@0+LQ-bRP2 a0Bv`6(` z ,"leqX,RX@!d᭄|0WHjh^0 X@3 6X! \( 쐅%, R( J?A~0v9a. a UHP|}:.D@( @&` 7Xbp` /0/2mg@ Lr0<@f^B HN!z4ЊZ e]"": x_?$0@Pb$`E+OX[%&P4b/`14 ,"Ѩ0bb؄%hAM,BE?} _  CR<cFV4b݀;PT,BE.DQBb!BP31~;!Uv4w2К\"Dd B1 ƅeC&Y;H81XBp,!Q-BA t @0+E#2Q j"E,zQ;nagios-4.3.4/contrib/exfoliation/images/logos/next.jpg000066400000000000000000000031731314764422400230460ustar00rootroot00000000000000JFIFC     C   ((" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?Io] R~\ZM!M[o|ۡCД^Đ o7|B:LRΪ c5E=ݴ iq~Z$dpG83 J jw⵾qƖgJ$xD\Ȁ1?)?s:K<'똬.l/2Y E4!P[vHnc=&o=OF3#vKGĚ>($HGA3σOc8-C|u3âp]Lceh8W[Ǥ񅰺񥞭*jL-յ2xǦ+|7{(~thu{A`K9-)-4Ab#<0\KH|+ƨ2<1>UNc|Q[R vk갣̓n%]8c]}b'%n_b>`@b_ԑҳ|_|>#IjC |a*uetA7sxۍpemS3 $GR9 p)ew ~?:+RފZ7=:P0nS?6GA$u<{,1=YK"ܒF9 ǡ~j -i4fйhd!I;W[zuBz-wFmG|N4ќuwSQk5}|/t{=׺ec-H0T˟% אA/76W5t{ۢ6ť@u[H8o_^r, ?x' k zJS[$w't C6 Wjr[{py5q>ƻ?}IJu');=d[nagios-4.3.4/contrib/exfoliation/images/logos/next.png000066400000000000000000000064331314764422400230540ustar00rootroot00000000000000PNG  IHDR((/:gAMA atRNS7X} IDATxO}ǿ 3Y!w)i,^ے+g 0I P@r)[{( Z)Ԯ^F^Kc 8/)F&`ı31YumtwTD~* x̌hz(H(؟L; ͅ,4𒸝M8a}ąXZs$\++6 D,&Za#iHb[$( YJrbviA΀ʆa|50A`a>?j6LaQXӚ %Nq@qQn!TPDU.%#葊hv386L& v `$2ڡ䘧S|beӬQ%Gv2gJҸ 'l !Tf0G9QU煰d3K)݇GGSd]+4102ݎIUhH2dL4 9uJ[ 6Qnx啗gp0w{GU(b~EqSi. "-# d8HGp VWW?/~(bq,k׮;wu*3ollaDXBA<Զ1kW+V6Ѐ x;n#;ΞX]p0H",lZmzuRʣ C)0Jy߳M}βǽ^^m?ox+3zLБa!H G eԀDTxM$ 2M؈b8ʜA ~٬5+$z # n/$r%QIDyf$YyL8脜 >/i(qܹ0쭭]7A7IƦǻw{G2m7Nh"y>a%޽O&4 c]?h黾뻆a,--8VFj[rE#( 0M Gۊq`ۏ_re; Ųa@]l6#di廿?Y__}0\Ύ4y.1Md41-CZ%TmwYݶѨZᠯZyNC0a-6{lZ^zXׯ_>2ʥҜ(*bFq?2P/$%8U0LjTҴg^E{(Bf,KPDFi`0VMTjю= Q4r͠=9 RA|yLLl8hj #]Si3Ha@aQWWKّ2d|"DZ* N?֭O"Rii]zE&{Y,. z_C&:1d0 ?6nQtm`+Ry`4i6.xaI«oCch/yμLP)poQ..{7-o EQXʕ4ŝ;{Do{nQzQRDKW˯˗ . w( C `^ZKWϝڃ^z;gׄɤ_+ BeƳ!qoփn?iks7]Wt||"b2 0 }!~W(wg^|o:mar@LФa,)bLKrRLҷo|o{f`0VGi_J~ɟ$ayϟfg?IJ62**)# FNIqvgS1!(;:1"A5er>+,k>Hc##.#))1QIPznW8("(PZVy4 \,pO";I?" 2MB|~s`K5"8Wf^VUu g5 (2Ia|v^B?-?W^l( "2IynZ5".x~s`I.Cnagios-4.3.4/contrib/exfoliation/images/logos/ng-switch40.gif000066400000000000000000000025251314764422400241240ustar00rootroot00000000000000GIF89a((!!)!)!!)!)1!!1!19))B)JB11B1BB1JB1RJ)RJ)ZJ1JJ1RJ1ZJ1cJ9JJ9RJ9ZR1JR1RR1ZR1cR9RR9ZR9cRBRRBZRBcRJRZ9RZ9cZBRZBZZBcZBkZJJZJRZJZZJcZJkcBkcJccJkcJscRZcRccRkcRscZkkJkkRkkRskR{kZZkZckZkkZskZ{kckkcskc{sZZsZssZ{sckscssc{sks{cs{c{{c{ks{k{{kkskksss{sss{s{{{{{{{{ƽƽ!,(( H*\ȰÇ#JHŋ3jǏEZ7gP"s$d ڼ43?^dRM)|SLPcH`-Z$sQ]ͧ<c +剀)€)L$a #8 }`XM8DH :ԀB #P7 tfC0j 4eI1gLC(C "QC G,cEPhEP"8 ZX pAB@HC? MGC1K WUԱg0 IA!|?^ 2"zp|!TI0D 6F+VkC;nagios-4.3.4/contrib/exfoliation/images/logos/ng-switch40.jpg000066400000000000000000000022241314764422400241330ustar00rootroot00000000000000JFIFC     C   ((" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?Sy?l "oxIimg%]-|q|n^ԢTv| oC`It'Q]Ɣ~_^baW@ }vOc`Эw_RV⋌_2/=05DS4}E| />+|7?V, >2 yg{T{Vwc($ ((޹J5IEVFaEPEPnagios-4.3.4/contrib/exfoliation/images/logos/ng-switch40.png000066400000000000000000000021501314764422400241350ustar00rootroot00000000000000PNG  IHDR((/:gAMA atRNS7X} IDATx?UG?e|@v"{O0ZMv;@"TNfә*.܀-BRm5{M纅3›0}0EީΟΙsg˗/>{N6mP*]Ch@tV*q"x':q78\[]m*p4ʮGGJD\%x;~6^)h7G7"RXb+܁] 1ji:*=MX^^n/Ǧg>N*6gAA؝Ih܉i/J%:bPt=`8xsК^#i s4mHy<@fDjC~KmE@ E"qa aP5eOV=w)rQp#,Η )@;H/ >S)EߡSx( ` rH0tZkp$aNXS88LQ)S4"]]2{q6-mD$QJGR=V.^_0խwt -( , @RwrN]zMpy`9e(W igB.ճ5\ i BD2kqwl>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~;_?ωirġ~qԴ|-՞~TБԜĊא㱎:घԂՖ֙Ծ迎{$۩ye˒jԤٶ9ْF|كׅmʑI`ΊʽݤN᠐݌”Ԃׅ݉boڋŃḨ]٩ᙪԔ۔ޅ{y㔸͇ƙL#ʑͶץ<ȭӡ~ǐ6ץ꠫ǐYuי\̤PțmC꡹]ԁǒGƐ߬d}ʎp/֜ړ܆+Җ럩V+Һd?鑂d'nagios-4.3.4/contrib/exfoliation/images/logos/notebook.gif000066400000000000000000000033611314764422400236740ustar00rootroot00000000000000GIF89a((  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! ,('@ H_ *\Ȱx;Ep0Ŋ4HR cjDtջ޼wʅ,RvIŏk훿}ݼmonAlf kP}H~A?vO6zTƊ ȻZ+4'G"psLC=0ev[&Tqj Yn?yحݷO"b 3gѢL\e+RnܩǮ]uCnx|1#UBvs$I.!!?q‡,)5!O$w(;\GuS41V>sK1͔$BKCNtRnl(|f #CIA7|#?9=$W (P5M!`@6Վc=fΎM:]b?(I&dJn$7d937|3;iEu/4?X#c:h30^z?JȲ4@)nTG<|ޜ?߈ 3N9 ;5H3 A ?ln=:8721.*thSOMIA@=<7,,44]EE\DDUCCTCCQCCPBBOBBNBBMAAK@@ᯛuu׿ֿssrrC??sssssssssssssssssssssssssssssssssssssssssssssss  ssV!KORPLss )fY* %e\\\g0ss8rn].2jrrrrXss@rrn_18jrrrr[ssBrrrnl5:jrrrpZssBrrrrql7:jrrrpUssBrrrrrql8:jrrrpTssBrrrrrrqm< :jrrrpTssBrrrrrrrqh? :jrrrpTssBrrrrrrrrqh@ :jrrrpTssBrrrrrrrrrqhC! :jrrrpTssBrrrrrrrrrrrjD" :jrrrpTssBrrrrccrrrrrrjE$=jrrrpTssBrrrrionrrrrrrjG3EjrrrpTssBrrrrkHbnrrrrrrjaIjrrrpTssBrrrrjE8]jrrrrrrnoirrrpTssBrrrrj>!+[jrrrrrrccrrrpTssBrrrrj;&FjrrrrrrrrrrpTssBrrrrj: #DjrrrrrrrrrpTssBrrrrj: !BhqrrrrrrrpTssBrrrrj: =mqrrrrrrpTssBrrrrj:8lqrrrrrpTssBrrrrj:6lqrrrrpTssBrrrrj:3`qrrrpTssArrrrj9/_qrrpSss=rrrrj4.^nrpQss -nnnnd' ,[npMss,:>6(&NWJ ss   sssssssssssssssssssssssssssssssssssssssssssssssssssnagios-4.3.4/contrib/exfoliation/images/logos/novell40.gif000066400000000000000000000017601314764422400235200ustar00rootroot00000000000000GIF89a((|yxunkhgec`^YWVTOMKIHFECBA>=:8721.*thSOMIA@=<7,,44]EE\DDUCCTCCQCCPBBOBBNBBMAAK@@ᯛuu׿ֿssrrC??,((s  V!KORPL )fY* %e\g0s8rn].̏2jrrX֌@n_10HmnҸSsæ"H( HON674 &@#G8U6Gdɓ88 FzpdaO7萀'/` hA7KR:)$8hP *ة4!5; |nQtͪ!"|=:WΘ1t!ѡGTUKM#3\+Sk,8Lы6 ljoҼ%=r+ܞxwӳwT`p}y7[X#<7WnI5:"]B8=K#X$=e$95>t;:[Vzkz|-լ9c8)tr2+{?h.&i-6>ӧl= nCb?9a'J85vݟ|MnKN=k(Ts+`:gK~Z}:wU l*ß40];T>~)|/GM$WLZR8bcp*zA?iSdGC+c8 O-ԫ^TWvGF a3,)Fۄ^lմwߩ bFӣuH0Ddwis_,Wóm?=8 N0Ik# ?mO&)Y C~BH#xqV##v"223 $LE na%߀-hqXyAklʹ2irj E^8s#gzׄ|][OEmkNXGK) x>4:-$1g?|E\zRz^0bѥFxri$m'&UZ~$Z̉^F`kz+88;ƫLN2:r]mMxź `YӤfD;11y>-Weˣ(MS0 a^zU?fI6w~nagios-4.3.4/contrib/exfoliation/images/logos/novell40.png000066400000000000000000000016641314764422400235420ustar00rootroot00000000000000PNG  IHDR((/:gAMA akIDATx_HSQ?ڲU&@bM, * j[[?=4)'ˠ RCQҿ{GC&V(˘ma-vNk}99gLDPS6ل frZHb}A`@ۄCr`́BhGxmeeۗ"{ 9 7Y-g9 g= +S]:?~WpfF㟻zӴ` ܅>}u[tKdegׯ>T 9P앇5Me_=Tѓ';B)V@`6s|S0l';[TRw,FP~ǽJ]føנGyY_im]{ww}n*j +ˆxȘJJ < 3-bS1:8.׈YMsz4 $B9z۝y88Uw5TX P ~!J4 @%u66cñ'd 68{j;8aO?|*{z;v$lPk [}>uu@+t8kӳ-){U' |):(`4/I~zNE `?XnjЄIENDB`nagios-4.3.4/contrib/exfoliation/images/logos/openbsd.gd2000066400000000000000000000045251314764422400234200ustar00rootroot00000000000000gd2(( 3f3333f333ff3fffff3f3f̙3f3333f3333333333f3333333f3f33ff3f3f3f3333f3333333f3̙333333f333ff3ffffff3f33f3ff3f3f3ffff3fffffffffff3fffffff3fff̙ffff3fffff3f̙3333f33̙3ff3ffff̙f3f̙3f̙̙3f̙3f3333f333ff3fffff̙̙3̙f̙̙̙3f̙3f3f3333f333ff3fffff3f3f̙3fО׬sץ׬ssׁ~׬sss֬rץrsszNHO׬rsץrsNNNrNNNzzss׬rssNrrsNrOssNsssrsNsrׁrNs׬rryNssׁ$rz׬ssץrsrzNVsr׬sNsׁHs++sr+VrOr+2HN++rVVNszrsssV+Nׁ*rrrrsrssN׭OsrNsNNNrrsrO׫UU׬+NsNNNNrssNNsN׬׬+NrssrrrrsrN׀׬O$$NrrrrN*$NׁzNrrN$$$$NNNNN׬׬+rsssssrNNNN׫ׁNssrNNNNNyցOrsrNN*Nssrr$NO׬NssrrrsssNNNrsrrrO׬NssssNsrrNOOsssyyzsrO׬srsOsrrNzyrO׫VzrrrNVyrrs׬VUUyyyrsrrNsrrO׬׬yׁOsrrssrNssrrOVVׁHssrssrNNssrrOzzsׁ$ysN$NNssrrNzz׬zׁ$yrNrsN*ssrNN׬ץsץ$U$rssrNsrrNOץ׬ss$ONrssNssrNNץOONrsrNsrrNO׫׬ONrrNrrNNO׬VNOץ׬NNNNrrNN*zOHrrrsץץzNrrrNN*NrrlrsssssrץׁV+$***ssssrЬ׬VTUVNrrNssssrrrrnagios-4.3.4/contrib/exfoliation/images/logos/openbsd.gif000066400000000000000000000035131314764422400235050ustar00rootroot00000000000000GIF89a((!!!!91!BB9< J B!N VJ!R!R)!J))Z!Z)Z)!c!kk!c!g%k)s!s!s){!{){)!!))!11!!))!11!!)1!))!11!)11!!)!))11)11111B99R11W96c1)k1)k11e<1kB)s1)s91w95B!99)9/1!1)9)=19!9)1!9!B11!9!9)B11!9!9!ZRJM8]OyP qrMiXX"h+ -YȀ &عJbT pEkVxr-rhJ[Pߑ5 8+P:Ŋ'!0b=f;@N#fBx:ꡫEz@`!j46+&URp51*xI wsD`J.p-[vgI@c% l2bRWa# <Ҁ #@ 1łw<8R6 T20lЁ ^dX Gt>,`a =b%v0TЁT4`JK3 +q <YMYB *P 2<!IHA!<#ehO-kx9(!^Bjx( G `@PcJ!3@/ep0A I8U3}x2Ax3+ొ="A)W  W@%41Y.TOmrsA(@ WPa$ђX4P("54 PQC o]C,^@!t T`2\)5Aq4R c@£twC8P0LRıvZ 5Ё4L;.!h)*AT2h `B B8` M֨*=^PHp`n@G9&1 DdX&Y0m@ t! Cˁ` Fa7@A8@mSy)[&( ioX΀P1P̣`>B $ ;nagios-4.3.4/contrib/exfoliation/images/logos/openbsd.jpg000066400000000000000000000034311314764422400235170ustar00rootroot00000000000000JFIFC     C   ((" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?S$># zj*[%]K*eLg>xKu[q-ʆF'.O'5߷hvm\j7Vmd|4n=簬+J?$Tkhz<9v~~i/$^^.ns,浕R͖7u'-o(5d%:ݮm J-v[*(8 +_ݽDž|;>+X)8+ HJB$E8>:W_ڛᎭh'Wx3hP ijĐHQ(Z=/m==Oj0sUK^7|;4QE}Qxo|kuλ7T, y_Ɵ I+]f=Am=IԿ|D,ݒ󓰷k3Z ?vNt渍A"4Upυ~:?|si>#]fyAaf,\+bQuARjpZ] \ ۭ~z[Zh au;v|&̬xkdϿմt.6M*.mPL'rs;&c\-d"I G$ +$brxoc}m|)~=_[iTVRn2F%J0G}k0juS O|s.m}7j}4>.݆qzV8MBeo;t<}B~a|?/~ umIc s 0psT[__O^RYH>YPM'm__v[_XKthAԳxÜ5mn<)@[ŚD71YPkΧxd nBĺTBW99ʞTnh_yxژW'GO~G$搂7$'eo'n_}3ėqj^"!,mɒNXIקW_Waa[m}rB&~aVOጚ^?nagios-4.3.4/contrib/exfoliation/images/logos/openbsd.png000066400000000000000000000046011314764422400235230ustar00rootroot00000000000000PNG  IHDR((/:gAMA atRNS7X} &IDATxpǿr7͕]L[cJ':tU<I-q4 %ZLʼnf Hk[SikE+(y/3Y["H b#Ia{>9{ιHxj`\H.F\N/y`H Fns^YG3Kǫh͚5$R>kN<<3cE-Mc &yx6(khxaHIu4ӻw8>K۩?_7}͍BuOkf(.Vu}V]i#d_]kk' +n/rR| @jne 15!|b qIi߫%w>{xU)SE/DʗVi-Wb`dR4L0yXiB)++1]/~=•2t4;1<8Imp^ ǧ,M])O膗93%!e;6&"!Fͳ\ tHP{їW2}s?GzZ @M*LRd,f⁺>E5/('!G!wNhDN]yuǶKt]csӝNeee ׇTYwt n4[3nD1M")ȫ+5 C_FnL0sCR>=m^pqM :F)ȓ  ܐKH2@g)j {*}8qؓݭ,EDi۲;nS7GPtm c>=9]Dduy"Am/~{QA!N̿z>J믿j( H8t\LʴϮͅ]3?Wq]u{ϊ(3.84瀦 A$@J.K>J۷k#-#udrӲgcǮ#5Z0J^|l'kcٝ  h"q8D60kV[fuv XTZ${X"utcskQP3'qO鴄e:cf9Il|m.iQ 3N ইϣu1˂eimL3do Q{r0,@+VW_7܂s@+/^nS3N H6$}>_yLPȶu _RܹF͢30H=> }7@714uu=poO7[:[-# NϫW8m9n6ӷ04dx@ 4:jYL']+Hx1oמlβYuUs˶ON20?7[yֱG Kvz"J}+]]ӧ͌iO>hv9 ]ɸBP"ThCx}9|^ @IENDB`nagios-4.3.4/contrib/exfoliation/images/logos/printer.gd2000066400000000000000000000051311314764422400234430ustar00rootroot00000000000000gd2((  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~=<*% Na !m[$R@,Azxd-p{r:b{͒bwZkoϟ}rǃЈj,hwݹwfdޙ׫xᴂ]R#Ή̔IKz/{{ݾtAzᶡs5h}v{ɮs1Erq闿پs4^x{|ûs6|}Vûs|ou֛zzjxûsEnq}|zûs:`ӄ܊ûssWÁ䕩ûs]}ⓦûs}{ʽûs:HU|s+i|h!qqѵzP'[̱y|5ψMǬwزTTÿTSlCnnnndƣrJ[z„ٹW_ȱqyȂʥ]1״jkŁǪm GսrZk`ĪvH;ZS+PssY nagios-4.3.4/contrib/exfoliation/images/logos/printer.gif000066400000000000000000000032231314764422400235340ustar00rootroot00000000000000GIF89a((  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! ,((@ H*,D-!2 O> .D(FXO:`bm1$4< s9(K5L 4h@ $E,v#ӓT'q;8? Q2h FG9)L M-z0Is.|w-R ՠJE>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~0U?!Or|zb6Dr|['?pP5kyK1ar>Xf0J_'GS!,vGkSQoIB}ma`Nhxspma`ZjOi|trpma_bn~Pyvtrpma]cfqҽ~|yvtrpma]dŨ~|yvtrpma\erᥬ~|yvtrpmaTXjUeߒɦ~|yvtrpmaHSEh~O݋̴\~~|yvtrpmaG[#itڑXL~|yvtrph@ 6oؔjZeƵ~|yvtoNDԽגlxkƨǙ~|yt_1Z֍kvxə~{m<*lxjux˙zJ6|ͻhux˙~Z$Phux˙j9Newp˘|GRxL_·kPe9;3N:3g(nagios-4.3.4/contrib/exfoliation/images/logos/rack-server.gif000066400000000000000000000027621314764422400243040ustar00rootroot00000000000000GIF89a((  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! ,(( H*\ȰÇ#JLʏC.G-`G8G G-gpooGo C G%EGooo~ l[{ *7g~Microsoft Photo Edit*<~ J)OJmJ\OJ~ l[P'6"~xpO)gp%o_lAP4oHo ]Jc 9$h ogdhoAloSG8OloHPMdP MMHP@oPMgMAA|PC|PNLPP\oC|P!,(( H* A q-.бdB$XK)W{fT*d`#.<I H&.'ҫH͑@y4UivIe]qFq[VKk:xIA;~?֝2@NjK`[r6hc%l4r4tF͍݀c7.Fե47B(w#f_cmZRyj];0qw 7 :aBڎ{Kq^)`S/=֛=G&^kRyTUP- 10]WCaGB(NdhHoCA-YA.@> @jUN-Q8? bPFakXbI <0@DJD`gnY 4@BY SA,5`'9f2@DTJP1%TN%^8JʏF 4e^*$f+ ;nagios-4.3.4/contrib/exfoliation/images/logos/redhat.jpg000066400000000000000000000032671314764422400233430ustar00rootroot00000000000000JFIFC     C   ((" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?7|I}ZCдWג5>QĀ$ / ෂ1C1A\<p]m@<wqR^ I~2Os'#<v B?v `iz^xo׺mzF=4dE$n:ZJ.]WUՇ4Z/2nɻ+cfjkMv%mU0l}%3 5}"J~-xJR$Z[5BN֝:888_6iV̗o E;HaՅՔ)ih1؀9p.gjr[>6`6UZW_f֊~zD~߉-sGFx.gYQbʓ`AAEt5w__ j-q%[[|J /??%?*?}+zzL\^]$i&G]?9>+o{JUӮ7NT|ѱ`229#?$Wk!2nԵ ،R9g(HQs$s/_|.wxlgiXQ<1ZaF$B 0+v%[l`Жgu}O? xQK @͑9?Gij !ޒ=ǵ}7&We_l,MWC3UQ?}I >fbbZjCtgWB!O:`O.N3x#=:3K_rZky~x_t[7)souFdp=c(|/>0t)HL!=V/gA_EF8Nu?̱T񘺘P䌛i.c(8;xV{tmo &moo](Tw*-ſe,E-k h ޽={m҆x(spJ 6Z'{JI_-Y~~G@x\>G2Ă%Ir'KcS86+qj!; {exf2ϟ/H=4i߾}XdqqqI.K_i}n>}*)mll0"677W,PS>{OZ ò,ۂ>>DQ!0 4ML&Z ש7MI={ֵR*_X_&B!sMY}>#twwj_ceYvC GQO^4!`~peaM4cpt~"4<!r [/lF,Y 4MkeDU*`0h!r@ @Hrx|ž | IϟmSRT"`1:~6a[.d2|urrH$\cv \.-J=zsr$x^*"Iښ}8Mf(NbǓL&lVv:gD>O%8 l.sN;l#\IENDB`nagios-4.3.4/contrib/exfoliation/images/logos/router.gd2000066400000000000000000000051311314764422400233000ustar00rootroot00000000000000gd2((  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~G‹@mv\ޯ_Kܜ@z؁3isa[fڗTv΃O`l`R^p{\ V˰_ޗO^Rl^~{^Zjͪi ­sЈ[?kʣoƥ`Lusjױ^aupİ^+w}}r¶^5v}ʮʽȕǿ^ tкɃǿ^^sѮqǿ^̓sѴhǿU5Ťcloorkƿt>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! ,((@ H[hڸ!rDaB,w CI2KOְG%ev"M^ʐUJ-?v-W2ymm:uJKk4 WXKV3̥[˶۷.Q{WF1V*%k La-B#g 7oQjش5m(R:evHͺu6'̎kiz3ǻa0lBcǼc?^i S9wOxw U:࠺S$A|ǿ1$A^R,s+D(qK:L3EeB/hR$k%]2/!"㌻b&DDiHt,RQq! 7TY7|̔C%2ka :lnCe=`Ξ|83E|"#^84裐Fڎ;pq^H ^8*ꨤ*;APV2!@H%Cϭ뮹# LRL)@F'sϳF+msM, wG"*RHrB !C> o>d#J42%7 O?Ӎ5APrH-L2#TsGC&aL3(7LHQREB<JL4/3Ҥ0DmT+eM'P#1+t,H#dD\!rI*Lb} v\A|;nagios-4.3.4/contrib/exfoliation/images/logos/router40.gd2000066400000000000000000000045251314764422400234520ustar00rootroot00000000000000gd2((!!!!!!!)1))!)).!11A)-%53+)9$I2E=ACN$%!&##/%'$3#%!1$.2% 9$"B!19%.I%99!A<&9G!DK5("4/;14K99J0D9)JJ.FO3LLA/$8 ^ rrnnnnnrWjeed_WP;A nrrrrrrrmjjjjfddbb rrrrtrrrjjfjeedd_X nrrrrtrljjjfejdb^X ljnmrugb.Wq jmnnjy$1F 9^ # jjnjjf'*=K 9d 2 jnmnjK9^TMB:GS' :P njjjjS9bT_SVXZC SU jjljmM9\F\USVXC$UZ fljjgR9\C\SRMU94SX fjjjeK1XFYZRMXB SS djebdQ1XFYXMVX9 MR dfddeM9SKXSRMX3"MM ddfefR4UEXSSQX3 KM bddddK4K;USKKM1 KM ^bb^bK9Q9USJPK4!KM bb^^^E4M9UQKKK4 KG bb^\\F4K9RJEPQ3 FK bb^X\C1E9G9CFG1 AF X^\SS*16,C799D* CD R\UUSj$ %/!G. /; S\XQRn  F' ' MUTQM\Q/F092 MMQKMRQHw?KBW8=< FGGGGTKGCEFEGCF=FD ;GECFCFEFFGGGKCCC3 ;E;9ECC*CDC;C==DA7 A`s~h67D3;:=C7F79 93 7F_ozh?>0 .7:39 $9WhWP> !4Pkxnagios-4.3.4/contrib/exfoliation/images/logos/router40.gif000066400000000000000000000030241314764422400235340ustar00rootroot00000000000000GIF89a((!!!!!!!)1))!)).!11A)-%53+)9$I2E=ACN$%!&##/%'$3#%!1$.2% 9$"B!19%.I%99!A<&9G!DK5("4/;14K99J0D9)JJ.FO3LLA/$tJ1TLEːS'(r&9Re=!$T|qgH\L!EU@aCD X҃X D]/EX4^ 4!EQXJM6 "4(e4TQSDcK )B/ KQ!tFbXE)ŕ!DILA~UD ,qěq9HDPD1F,Xp1D EpDCqAIaS , qC9BCq"$AB%AG ;8XD!750MFx眳a!Q4Q0ݫ4 iQ qK`W4ZzļT9DFqD=pDVG,13l%-Pp;@*:CAܰU`% 6@ ;ЃF@ S F|)!0p3T$phrBJ' P&l;nagios-4.3.4/contrib/exfoliation/images/logos/router40.jpg000066400000000000000000000026241314764422400235540ustar00rootroot00000000000000JFIFC     C   ((" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ??73|5d;D]SvE``!!Iʯ#8o*Fyi>:$90f\` *1W,ݧOjQ lcȶwf%hwUe(* :זjƫf/.&.Mw1xnH֡q$f6:8e`nxpF5RG?k-Xƞ,NcISyw7jNv3g8_E8nǁ?da:CL'-zI ˤUA"?G|tlmr%$F?ҿ2|oe;}]5m.5{K8^IlWsdN0rziD㪹TIwGoF'e{756M"\ټMJ&X09*z^3YTikJ<8+c7W~co7usl}p-n')2\#-[yI XI YlMxO -~?wb=Gú5m ._4U6|~^- ,V>Ն1VrI@Gۿv _+YI]+nagios-4.3.4/contrib/exfoliation/images/logos/router40.png000066400000000000000000000034301314764422400235540ustar00rootroot00000000000000PNG  IHDR((/:gAMA atRNS7X}IDATxŘ[lW;;sfvv{oiSRAFT$BEB/Q-*U !xlC$/җ>!Qq*nRTJ4vb{z3gfy]׉Z4o|{w&nس₁w߹ϲg%n@b69hB~Y%IfQv(gumm\>Gjyb>{fM\׻2t]@v1 ?>sf6<< c\ %| @j2\[p?{h gL߱?R0w)~~4\\U$yT@H$~Ҷ.̭ݶF{ ėN?ꨢ q GXm$Q_EDՇ2Jx# -{Q;%c( BnYwQwK2Z:۷㬧;s^{u:E*J@Ft?F9yoqڕReiZuSRJ@-E,?] q0JCAwxKRE%a6wDR*! $ 0r)i @MT5obhmDIޞYњ|OZCzO2)}Yt N, Pa/dP3iUm`3F>ˬi2iNz$hAG# i{띍2=_ sc~+f8V%P < @_["kHiw{nnr=]sr ۸b[X7V\ˀ..4}omt4*Uӌȅu04DuKWUv0R5bZ0?hyjeB˴*rE\݅GrQc\8^n{F=ӣB߽7~S+׎ 鏞Uz򩧅I%(6k j Pn)b#o!y(V(eHP C !"YdpkE+O.ߵ(P{42LXW&GeRn1[ˑąeZC&=C'ڏ?4udHj, k|>5=iKTZVӖm6ִx@2$r%"5`u]_%Y5@%Ϳw楥꥿M֚qOԡW H*2VXUb#G??5j/E*B[IENDB`nagios-4.3.4/contrib/exfoliation/images/logos/san.gd2000066400000000000000000000051311314764422400225410ustar00rootroot00000000000000gd2((  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~ZJZYL[AE}׿{AHImjEvܺsQP_]OWY]|dv>OU~yx~òxɈĻߥǞu~ʨowߞ}wëway¶hy˼MAڻ9̏ڇ$ݲnT0R۱`,* |@˯A r|R(w3ԑ;=5fq__yz$ʕ9-φ.Ϲ%/˱AHͰ̀ͺ6!yˌ)XƫfOƴZ$hķn/'5EhnohK5*nagios-4.3.4/contrib/exfoliation/images/logos/san.gif000066400000000000000000000032261314764422400226350ustar00rootroot00000000000000GIF89a((  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! ,((@ H RRǰÇ#B|40k2jȱǍh1cȒ-k iծaƭ7pr3BKC*G p g2X}ƕkFٳhӒkAEʝKݻH4vSGGÄUu{ ( *DĖ I>dfjVG'ɞMvmZZ:$<HQN_A[dKNúӮHrҫ_Ͼ蕅'?"hID50F,c+TyR8t9 J9 3LX!tc @8(@(BJ$sV@M$@MDL0UTi%35B*-`)f\APCh!I'dKԠg橅Z$"dyD3ΣF*)FEI8vs = :餪ꪬjs@Yt٭뮻n?#kȂ"4F+vT'dvmA-~lc=覫{O8l3̀bI6믾ߔ6"bJʠ\O?G,1|IwR:s@R4I'D 'K2de. /K@̴UmH =?%L L2iC0 6۸Hp-6ױDe*Ac 14@ cUrvU5R d,AL .Z4VITn Q@ 1PK3@1V5 ތ.6$E)${2Ƭby@B7-Vo=A;nagios-4.3.4/contrib/exfoliation/images/logos/satellite.png000066400000000000000000000052611314764422400240620ustar00rootroot00000000000000PNG  IHDR00WtEXtSoftwareAdobe ImageReadyqe< SIDATxZYL[w 6Lp$Y&MGI4&QR:Uu/jHiR-V}IJ/l2a`~m^ 1F!]#) Hvڮ'> ?GR3詭 n&Ӣ%Չ@4sӸ-\g2N_X`8 :+x.tR;VHY!?+ˮiH8i- X\\/.|@%u8KEfڂ0 AsI3D`ii ΝGow o濙Nqڬ\iGcB*}LƟO"۴sGv*@iZQGI-f|!ā2AAf3˗a'LCp8poh/8:7 ?,ˁbD<^`N%4gЃ,x1p`2b`0f=;'fggOLt?q+ݵƭLRVWLK Hh93;j]kkkf v;bHteX(wM Zd&3vq'ɬX-̴>}LOOCM[K!@4^/3鳱Ph\Yh$P*8o& )d4R j΂ :hjjbZ$Z l/l0jn=;x  `iKD4]`Pt 6vkh'^L| 5h F?p?{[۽= aw!2mVC<eA!ozfse =w1SBh'J6n,xR9t(ޛkW'.~^̬ORXo`GQRfu(젒p:шG;պλCJGkxxܸqUdRɓރw;6hniA / 0VmEfBh$:ooϚ6Va)*V[FggSS)RBjgv.ZHg:\*>dXo؝_c肉-@x[`H"Rp8{_`:}V?#Y${~@ ]6h8(:/\ۋ°A ))C͙pPx 2W:*S)]@MA @޷̟+4g8.9%Xw@H.M/_cj{s扡%>+|qRV籭'uŅ i:?[6)JLesMv0r6b>UZ6qWSlHcHR}a]TìFחC%6!K:b kFv>I4BӉu|7 3G FS7!dd6E/> bX-:1?44A$4,&vW\.Vv,e7c1vo \w.--}jZMLH!4FEpvCEx^p8XL5á@ΦWh3D3.z̸\9Ԃl׹u^vN֩%IDz3o]'^pO _'ݯ}e몫pXzL?m`>|1ؿsb`S6ʊBX1,tWh&&BN?k;|緾z$7tHk*R!]+33ڪmWsR-BdIENDB`nagios-4.3.4/contrib/exfoliation/images/logos/server.png000066400000000000000000000065531314764422400234070ustar00rootroot00000000000000PNG  IHDR00WtEXtSoftwareAdobe ImageReadyqe< IDATxڼZ]]U^{s̝Ni38%jDmHbAK F@ c HLP'yZmA3oZk}ιwf ̈w9sַ>#;+V)@דB8R\Yh4n4j5WOxrT+1  eJ)Z+*s!?nj[SJ_^.4ͫR\krueW-..˵d z)ݿ0>չ<^Gg=j@&c3٨C<6MB k$G#Cq)2Ri@ܹpk{nMn%ʉxk)by0i,> ;]4-Hdm΁QH)LH:=#]D;Jhe0>%6Bή5 ϭW=O FhEفVkN~4#:Vb:qC5sp0F{+|תX*LDDdo"$0$9?!Pǁ&d]I[c AńH<1&I34-(S @+K' L&0 D oF򂒛CtҦ]ܝof6qy8~ pr 桀_k܀8(5ΛdɥZ,Uq A % D"Y+gShH3lK9aV)dw<ppt (Az_ੰeim$ױK5jQPJtxRO9m:T'& w--c/9>g\G`>~*p V\:K'z-Ŭ ]AFKGĤQ~ "- )$Pe›ڛɯlayy/{8@ޛAH霠utvYܞo"@V"I+ֶw(=E8hn'CvB p^<ЁQvI! ^R[f+)LD,9h/ ⹥ vJۻ95 eȴ+kqUc$P[JJB@b lt\z`3C'SGp䳷AXq r%LD|WjlѓIII& FHO*8e=ucRzտ `3Sm*^a|.`ko68+ǰ{q7tqGR$5(~ڣ<$%Dx/k͠8pUd^ `="Z6]pn }:Pv ڴ&du p?^%.8={믷 v)d({iػN{R(zVqºCܡB=qY\wb""L2~)-(|NbP^U%)UxƹAhX1'uI5{aqi46mU]ץ'TRH"Eo19:Ҏ-ʻu4>ÊO>yBpp;o6h%I T9]4qOvVuK\$Fܴ߮;Ium9XOd5}M$"~war45*dDdZvյUڬIcǎk7%2W>) !T<!khI6HQ^D zFILA L^7~\/^e5"pv*$WNS_c=Y3aQ&4; n$pM^}ECGJ"StA ui/kȕ7 IN _T2.dW[Y͹B&mS0WQ^J Mgl~DZ t;NT0 SSG:ZVms:XYYw4sQ{6{'k̈́K0Wx#pEGPA?ļMTpqѯMpqixO/ﰋq)<ދ다ZVآeU!dh6v˔ԖVVF1 \t ;3@? ixWo|OT6|f{vL0BQ A:6kɹ?x,9sϝ΃^,> ǟnJ܋ ru>s z]ݩyd<ҋ0R+b7jko?? /3o" UX bp*af۳?5 ӣp?Y]عAL[e~;=4t ̶;.IENDB`nagios-4.3.4/contrib/exfoliation/images/logos/signal.png000066400000000000000000000073441314764422400233550ustar00rootroot00000000000000PNG  IHDR00WtEXtSoftwareAdobe ImageReadyqe<IDATxYyp]}]"=%;c]1P&LdO;tS:-m%%i iiXMC  6C-ɖ={Ns}dKE 37w=,;sPJ\,|^GgI׳&Fw>O/dԉ*QNr-'fhUW܇6sZw {&'[YJT E +l\b~U8G3k'X4& (GNNUҷ>ZW?qdK#a',c}y!a,QT.D}}1K걮2h||x+ajxqRNq ۑ<"˯^8G'oVBnn,(Nf_Z !!i29M)Wp4@[}^/zR_?*ǐBn)Z`$0C6afiXJ&ngTtؘ؏qy-c!6[*8dI#@l6[ȼG47TG D3vc \za7$}V܁tPV "h(,ՁA9Z`!6F0nz %bJa [Pɦ}"nea!*a\(Y*sF݄-:X3l1Lv!K/,Ѻlj<,yJ&\OGVa0N`T((̓e M2ڋ@*"j>c[UoP[발1bM"؝R y+D|G#O@(9݈#S2%Y3nrS+&G2_ĭeX7|$- #j& aq >S+9RVbTC,q|aOYXAz'"cabt rXTv5Q@"#g1$|dVqZ.aj#L#fBCzՊ,>M گ7) b}* rDFf@3>di6 ~ڋsF+ ؋TP/u4$,0iN_"i<,Чp B/a(xx&S/12|: GpЈSZb &Cx*> ӻ(\ǤP!R*Slg@'J\FGյ4c |e9 73Nۄ6廉Њ6PquG@ Ӵ+^ЁrUrP7h[K%ܿ@5h,W6?WQk?\I >TrW(EvӅz$f1iZ Zk86d;nʋy-ъpV~*"@NFcἏLS3m <44sv< }'.܀Kҗ7xn_z+ (LT5I:g5{:}")1IbڅsmoCw*:[U $ h:]/?"54%E5nB SsZ|Vqb92#;=@XjmQJZ~ܳ<;־WH̾'N`3%`c- $ݥaG' =fʶm}oB$okش*ۇ{yr1nJ4R1˲RBr.RyfQNx[DꇬL~66bqQj HT$%*1gQ &ɪVxː! *hƪj:a qlcl %p6T 6\[?D]B;}o Ll f@+sW/v pдL_swr j jFe3 "2eO@? 1CH)d `(u pOW-DŽ M[c ߯W!f}[n|]&M\X:t fc8(- TexgUJ)՞ S1teV ΌhC95p]Tڱc-$Еj犁s,ca9u -H X@p )d&jFeE`J!.ЌEtkf_57o se^'i(Í7lWvo\.{K;Nkaܖ,^P(m'x<:}iAy64S3%n܂}ɽoTlShBS8|s52hț!6UdGgC}D"PRSR K)_y,QlfI0w˶o=7&2 0ҍ_eIENDB`nagios-4.3.4/contrib/exfoliation/images/logos/slackware.gd2000066400000000000000000000045251314764422400237420ustar00rootroot00000000000000gd2(( ƽƜ{s{kckRRZccc{{ƔZc{JJk9Bc1Bk9Bs9Js9Bk19R19JBBRޔJRkBJ{BRBZJZBR{9Jk99JZZZck{9RBZBJs99BBRs9J{JZBR11BJZ11JkkkZkk{k{s{cs)1JsssJZ{{RZsRZkZZs{RZs1J{{kss{ksksssssk{k{9BZcZcބ{{ckZcRcRcRZJc99RZZk{{kk{RRcZcsZRcJZZk119JJZ!!)!ckBJZ))19RksccsssBBJkkRRkssJJcs{kks֌ZZc)))1)1JJRZkcs{sZcZZ{s{RZ{քckcckkccs{Δ{{RcZcH?®:H_Kbsssd\~H @s&'00(0000/6äI?H33Xs'((((000(0((08/&3:d<(((((0(0(((((((006J K<0((((0((((((((00(((g;:d((0(((0(((<<(<<'<<<000' IK<((0(0(fOOOe(((0?K(((000(cKZWWbWZK~((07'::<(0((0(KXbbK(((70"3b'(((((e~VLW~~LLW(0(((() s((((((BLLjEeeecEWO<(0((('b<((((((Nc((00((c~(000(0(1i &(((((0(~Ne0(0((((lD(000(0(&HK'((((((( x`Kce(((((456(777(0(0(000(00(('89  -.*/0((((((((((((0'12!3 "#$%&'(((((((&)*+, !  nagios-4.3.4/contrib/exfoliation/images/logos/slackware.gif000066400000000000000000000036351314764422400240340ustar00rootroot00000000000000GIF89a((!!!))!))))))1))9)1B)1J1)111911B11J19J19R1Bc1Bk1J{91B99B99J99R9BJ9BZ9Bc9Bk9Bs9Jk9Js9J{9R9RBBJBBRBBcBJZBJkBJsBJ{BRsBR{BRBRBZBZBZJJRJJZJJcJJkJRkJZ{JZJZJZJZJcRJZRRRRRZRRcRRkRRsRZkRZsRZ{RZRZRcRcRcRcZRcZZZZZcZZkZZsZZ{ZcsZc{ZcZcZcZcZkZkZkcZccccccsccccck{ckckckcscskckkkkkk{kkkkkkksksksksksk{k{k{k{ssssssssssss{s{s{s{s{sss{s{{{{{{{{{{{{{Ɯƭƭεεεֽƽƽ!,(( Hqܞ-+5qHE} ->B>*׵2^\/\5Z|̨a5Qp7+˕8ڬ:>jYzͥ6haˡASOBqGp,+*c&SbB„*q) ؿ@~x\Cpۚ5LBע1`m6I(T(TB]jH&HPƚ0um5For4:t8@ ެ&3Zĩ͙3eȐaD )$:_ tE O<]dCav`U>D Jj@! j\B;dшpL1yX\qp1R\rY8ҔM6PI8z2X6rVX_ 2S3hA0G$pW?Hc9u u rBLˆ!aGPL8\|0p9RPdt:T|bIB% 3?RixP3ːr\F!$oT`,LC,̂jxH?`1 P pk,ؖXydAR?H94 ׎̊8AIdLG:MR8v}XhX.o F*)8u%\F,PE qƈ[#KgC l,*0ň"\!p@+AqPd#P-`HBX@f@B-qSP E#U I'nQXȡ$SHA< ?$\ 2O@Fy RGP4Q$C7l"r[QG~Ze !qLccL3018TT) ' $QM~P A``ED-0|E@10Ȓpf( z$3(/HF)\ d`2(<0VHiK^AmYA4@h#,6PJTi"`CY1D9xFԐ1& ih`ld@;nagios-4.3.4/contrib/exfoliation/images/logos/slackware.jpg000066400000000000000000000031301314764422400240350ustar00rootroot00000000000000JFIFC     C   ((" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?=GtγyjI&=Iz76> oFc^a㐹ǡYβ׿ek6xRۏ?z*?Y}U),;mm{Ł$g+>ڿ~]Yئ67-MN9pQ^?6ygu'IL{x8'qjsC&L=%~DZZTiִ'MY9nyFNpB{=i*T7xzOJ[7>+H|G]Us@(JյU?+:}:zoX/ㄔ7רTN {q^U/ RѼ=FeH ZԼXڲ1`U}v|*JvX^*!yNށϪ|s~;R.5Z=6yHUĻNm g95a %{+F=SJe<5-]s]3}oxk[ZïniArՆG^AF5ÛȠxƱX|SU>Y WΕICrS,y8NҊќ#ȖV*ojO4>ڈϚzk?5}/Nj91&i 3L2"\@=k=/}S+7G[+8XSשc^ӼW^i:yE=]H/ j -O2wn? lk6/WU·*oJ54?xī88غ{=ֽ#UG=Rӿ K:QukD+wFT?P?>jgz(;rsහ-?A f$octnagios-4.3.4/contrib/exfoliation/images/logos/slackware.png000066400000000000000000000040361314764422400240470ustar00rootroot00000000000000PNG  IHDR((/:gAMA atRNS7X}IDATxXk$Zla.2iN} rM!_GB8\Lu$`241f}CU-9Cwu{WzիW #CȲjT$Z(RWyXj[B-y++|(X_%Q֘45~HǍN+{v$c̍g+H@"x7ɠf% nH˲~*"h4u DVcfP;9 vpڛWW,w,N\[[ 7>:<lb9y^&SO [|Mp_}.(8wZϛZGM->Jl@'G#~YɊuƓx4rTZ:Fk$D dIHPy@b0+¸x4V %(s3J9hwijveh Zev$>?W\[Ճђ6M|I&ցc|56kUjmպx2[v$HS}'hV"m$("Rp2CSm˭.GO>DZK!{&>EB%J1$]&r =eKi'|cs 6:=Y"6s;kRj)եMvchB` ;|.D@Fr>[kieN"=͝fL`$5}oу!@S{* kdSE('B4ĉ'x*X[z:~s.F?G^}w޳saFB V 䪚$ϊy8DlE*b޻/=ӧO7UZ!ؼ,c/+A?59eM,/J$h4:acEy$Ng v$0Z%bчU1IdCkq';VW,0l6;;YWy^<;t52EjкAvF=Wkm\e+E`VnvTS6`6{|ݟYJb|1r^NZ\EM&bW{,Z]-l}rt-v˝@~17^a>ǟH R^]{8zwQDp?8<Ȁp}ݸTng,'?1^{즋9IǓǟ?ubEzXK:?{4V 5!ƗҩNw3;;,˲c*6zdggE/ɗח_{ےZ3 QrSm \%wgOv:ڴ5vj6|Y2 ED'E~ hmIENDB`nagios-4.3.4/contrib/exfoliation/images/logos/stampede.gd2000066400000000000000000000045251314764422400235700ustar00rootroot00000000000000gd2(( +sBZ9ZֽքBcJcΜc{Ƶ{ƵƔ{ZscskJkZsRkk{ksJck{s *)!)&! '% & "(' $ '%" &'% %!"!! $#  $! "                   nagios-4.3.4/contrib/exfoliation/images/logos/stampede.gif000066400000000000000000000021641314764422400236560ustar00rootroot00000000000000GIF89a((9ZBZBcBcJcJcJkRkRsZsZscsc{k{k{kksss{{{ƭƵƵƵννν!/,((_H*\Ȱ&JD" RL C&谑ᅐ(C~(Aʔ X"e 2 i3DN#|)CN\RRJ)Lqj$Z2D` FcT[iUVlwA: H@A2 |P $ aA^@jClЀpuA .CB+Pܠ[G8z(rE0M,zRX˙2Ԡ['+8d7^|A5E^`GPV XA`BTr{ ӆv (;nagios-4.3.4/contrib/exfoliation/images/logos/stampede.jpg000066400000000000000000000025051314764422400236700ustar00rootroot00000000000000JFIFC     C   ((" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?S4~>]tȖ+FEtoۋßFvN!Q _4ۀ|2rF̪< ujعRj7g<kօ&kp$l0;y'<%||VI`cӮ@@ dFF:k1_ck:չ7VFc!2y]mǘaQ5у:E~hD'#wFL\.Q1z_UdL j"ќo9¨c '9Pj['9cOρ~0MkJիMFXPwRrb= ϋ|n7~0 k:ԢK);mj;gsH͟~ |_<6~}o*Ǡdkϊo^}o\x5,W 0aGwt:ӑ/}Uy9Vw%xƖVū?\+k/ _ݟE#'ï x+6syqͩi\:&I dzImWsE ⬤F/<^t )4Yn0 Q=ZKh)^$ybɍAdIECnN줒QHgnagios-4.3.4/contrib/exfoliation/images/logos/stampede.png000066400000000000000000000016441314764422400236770ustar00rootroot00000000000000PNG  IHDR((/:gAMA atRNS7X}IIDATx!x8; E)CP }C0whG]Yt1e4?(Jz ֵ];_,_{O{BF<j%KO]=g(B(M0Wd sL[*VX-"8ncm6͋i&D.M61{I0x+ԶLX2`Ә%bಫ׻A'#@8w0e06zG#y i0p3Ҩ\?ʟ9`r3}DP }=h.uo聛3.;3*D)ku1\l;!QJ/2mm۲슢W{p¸=3V>k,n&Btq +xSN w<JTUVUTJ$$$$$$Z?JTUVUTJ$$$$$$$$/@IRSUUTJ$$$$$$Z$$$$$$,>KVVRPQI$$$$$$>HMMLOXL$$$$k$Z$$/AYY$$$$k$$$3郂$$k$$DE$$9k$=r)stXY[labm"";?QV!!noXjSl+I@0)69P++aaC[\jS<0E#+,%,,,GW\k`S$B;0/$%,G W\U[4I;b%,,%$e$$%,,iG W\Df'>Sg,,9AAM1ehe W\UDZ$/)c+5J>;@@;)QJ9de[X`D ,a)@bJE00:::@::0"(IPZXY[]K0"""^?!V6/*K6)E:;K_CXYS %1Q0;00E'/%,,1MR(JGZ[\US-,%,<0V/>'==6?0<GWX ,<0JS,+9#/JIH!!''!<T17CG$/:?Q/S,,SBB%  87 4P>OO"E)>QR6/P%$%%,.L ,M)N::""""N0O<+%G CG,1':>'HIJKJ6I'/+,G . D$5E;BCF-.. %1!@'AB9,C.7. %5>":("?5$  .783 49:; 1*R !6, &8zcMNeN,!H-]AdʣϘh@C@sK%\Ӣ *{  4h`VP`)$ 2GX"~丁BJ6(N")! c$*vl1b 7"4j8T~* fe&jvo${k!]FJ7n oJju²M;h8d{h~Q\_?_j|A 5 J?dk>p98MYӾ[JxM59cM5mTvEqF<`r |FI{`&7Bw"fS}+trKI!k{Y2HrA@5h7#RYơ5|m+ߜy*)*($2z?^Z Թav])h ^;Tk L2F5'-ٛ&hedmxk%U8Í0}MALVVE&5qsos'۴2 ,;p~xѴ5k"݁յLg0۩W´eScˇ}8:|Z4~8_ꟲ>zl tD#!lc|r2s5G?tǫ/|"}3b:ug?zI$!]U}&7JҡXE(Y]2ZZ{N^w֑_iio0ʸ֍~x|Cm|q[ .>~'TOcx?yW[M}ᧇxB^[ 2pwI+7VvX3řM fC*7ܜCin>*߬C!>=9>نRx`JfYB^zfT\VIcɶp[" 潟ǜy-~éW:;1187j~XTRZp_,}g8nXNt"zB^& 6JSs*e?|VouŎΖ_-"4P+ c>.qdU ,KzhY:[{J%V3qc{O>)t@k,;PV--KE!:B!Rjs4"= k=_Kf::6ZBJC)-um۫Tl)M)Ǣu,T_f3-}004j/˩`>q|) uRZR}AߺBҒ`hd@2b?b4fg@ӿ//gO=/aON1=kz: `uސNaa6[VY Cc;M3,79R{]:WDf7N麲̴_KTF#l6>Ǐl{nh3gD4}zCg4;9˜HKH ۼ+=ԣDҥ?S{uMN$f2ͱ73_45ݑDW?۷dϝ >2j>om95) RQf6pAD=31{f&f2EԊ"",.f:Tq;z"J|oML}Zoܿ\]ߩV>Mk5^w+._G:-cN98LhD_rEz9-g­L2]*M?μz\0Ba\RZ]y@)z?'zQW\w!VVҞgvf׽0<WRiqVYP{a<8:q Aܝ0Կz Y2Խ{G'R%{ӹn˗ 閟FqG,U&cz~7WaIENDB`nagios-4.3.4/contrib/exfoliation/images/logos/sun40.gd2000066400000000000000000000045251314764422400227370ustar00rootroot00000000000000gd2((//r66w;;z=={>>|@@}AA~BBDDFFEEGGEE}IIJJKKIILLOOPPSSUUSSVV[[``ddiihhjjnnnnqqxxttsswwwwyy{{xx}}{{ÞĠ¢ÓÚǜɤĭë006;;B55;,,1̲ƨþϽμͺ˹ʸɵCCIм˰SSYֳVV[BBFFFJOOSKKOփ??B**,xx}uuzaaeeei446||==?ݏnnq001jjlџ޴||}sstᱱż~~~{{{yyy]]]TTT'''%%%쑴|ޛ|FgސsH SsE/LރH͡&L탼HpϸШ*K턻K Ԇϸ8PLf N̦9ϸ7MހK<(aʕ91PNC"a˖9QN&yB"aɢ9'QiNz,yB"hȕc ;}m~GO3{xzVnBo ;ضmugOO3LS͡Bz6nAb ;] ;5Eɰ$̅B{l 4]veDHOЦ%φCoFw 3]vǰ?͕%ȆC$3XuhΠ?Ϧ%ϢIe-Xj eȠ?Ͳ&e0Xqf̠@ЍY-\jeȠyԲ+\jha 0\kEwR /Zk-Zk,Zཔ`߽ٓs߷nagios-4.3.4/contrib/exfoliation/images/logos/sun40.gif000066400000000000000000000035571314764422400230340ustar00rootroot00000000000000GIF89a((//r66w;;z=={>>|@@}AA~BBDDFFEEGGEE}IIJJKKIILLOOPPSSUUSSVV[[``ddiihhjjnnnnqqxxttsswwwwyy{{xx}}{{ÞĠ¢ÓÚǜɤĭë006;;B55;,,1̲ƨþϽμͺ˹ʸɵCCIм˰SSYֳVV[BBFFFJOOSKKOփ??B**,xx}uuzaaeeei446||==?ݏnnq001jjlџ޴||}sstᱱż~~~{{{yyy]]]TTT'''%%%!,(( H Ar\ȰAvz氢Epm H3 xH h@e$s,-g@ 0\Ά4O3Q$ hvh!akP(WV#ċ4U3.좚!ZLH8 P94Q /RԎzI d"ƨ!I`_!X-1[`V{(B"4<` .C!iH8| Xmh !ALA J@ |X  ¸$@0QO\H/Bpb J#HEUhpȣsGȐj9 ;nagios-4.3.4/contrib/exfoliation/images/logos/sun40.jpg000066400000000000000000000031221314764422400230330ustar00rootroot00000000000000JFIFC     C   ((" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?SW7}+ឃ3K4Ï:l t8UPYo'oơﹺ6{ٰH0H%Tb5]k7Iq:= ֙tk`ʭ4 .#PF%  ZK LVk X->n"G+,6|QҾ(h)yc$kvqje]l:Q}V=9=Y{{ ,΄"K=vSc4ǃO=I4i֭YA 15 K0@11یqw}`WAE{=N/Z]#oŅaE|Ie7>x^.kMp_TKOkL<vS=ɂ>f 3H{5!jzݵ[x`[Ord!a:Zdku}ESm}tW>5|,.*qGxqchOz 59U?dO)u[⿊.<)kx.`,{#{aUuCFu>t N8n6hGLI!,k>d*ZP~ ="ewuY=fO{(PQ@U kOk.oZV >-$~0xhikym'4R qap,g*~V5X-;Dׯ<#Nq)ߤC"w"m-%urb_rNB͚SeQgEYe 1 DUR5Q@U /o jgV?1%`+nagios-4.3.4/contrib/exfoliation/images/logos/sun40.png000066400000000000000000000057061314764422400230510ustar00rootroot00000000000000PNG  IHDR((/:gAMA atRNS7X} kIDATxyPSOV$' !,I@P@@!!be*WRXHN]P@nKU).(I$ȞAm{{~;{a2wh$h4ǫl: ߁pW~|}㧵ZؘyX&ېzqj tiБ#dž僘ge>5]PDY\\0Q[{+55JԧO T{{VGyl +SR+_l.+11ޞ߯;{VTof7o֤laXo4|=VT_}ktEY֖>977'K k5wvёRː>~m$A"1 MˤRA~ o]CR$##ٟ`.//*!a @ /2\$BChtfD Pu Eӧg>uቄ bf۶ll_<+p|?`YPPK"vL&866{sv3BFee^oHIYQYzv5E~򲛝 pT%MOrk׮eee'&&+/@0۹sPh\JIIh4ܬau}mlAAN]]CUU]AA<mEn*11xzfm<珉.QM&ӧp8̮]BU_ߨB-[1"[SӚ^otvr!`z= uvWUuy{X[h$aرq8={vw~}81QBYUp;V-X`ק\F[[Q͍;55322)a(Npq {{GvvB…ionKJtյ;w~noo0L׮]Ȓh|LN^dm{N?+-b45^xp@V;vFXlcoj k׊mmŋ{ڴiNסRե 9::0G5H$"//t[F,2 t:sŋY g:ݤwfƠVzxXQϝS}/=y2MBɉN 9^MM rzzFf0@k4@ pvmi]\B&cV;"F3:dayHj'Ckm67kp8 M11Hdee% Z@ jjmo | xHSZڐ(Pm4ӓa8zL ]xdM$uv(׬5mmvd2iIj:NrVVL\0L{f?i԰wM Y-T*6+s lVO`lȻw{KJjtA& h?J(\CCwF %֭CP(BDKZXCB<=hm={_<s~ې ш]]#&ѹ\󼼚%Kok A\SSCCڬ_^ pHOQl8urrرt:1""cxbbμcA9d ё53W*{,,66tww^SSmo.؁ _z wİiiiίD&xlqq1kiW(C>:E?^A׭|mm$Jd\:p.:ڕ$768pY*uH8'FD,ݽ{A/"pG1 _M{Án|@&Y,3dвDeaAr! [_f2HuuO޽ W|Q|ddXjj*[؏Q(" A}ZQ(dj  S[K`--Ωl*1oV}X\ \)GG/3`H χ RD{ "8:Z2l6U ,.V4.Pf䧟Z|}V#"BSSSI$'D/AjNI֭.tJknТH@[9xCdSl<&&*%%Կ7B<& iiWXYAB!N'(= 77'ԜJtۛ{",)2ryJJ2H| s-75յ[[&MR(tJKy=(g,iU[ly x㘊F׭[@fa| t |pH 6^*99CL8uꔥ%uΝΙ sinn5[Vl޼썞.]CYQQQ;S\Vv7~͛I$Q('rlTu`zZ/:]6G$ na.+|(;;xGpػvei*-nř><5HZ6:F L6\1aI9_UtCW:FBg_\  ~YɁ6!xC?|%v"մK-uM(d+6Q<_[ epnkW ^r:wŒ: 1P[?E-Z ?:x{:jozCOWM9~hn>=[{˰WOò.rw0P%ZW^6ď Y>%4;ٗ ;U<0tF5M\bOu? H^m:@ 0g-a&/>vzZ--v>..ϹCD6$:걤1OЄ]] ђJ0I|W8xGNofC3gȾ&>-vY֯$5; 5ĸːpJ?薄Nev }iO,ڶo 7@Iѓ_sp:pGEzqf{uZSKMJMKWFS~ӧOmaq#!8/||o\K{mM:f5 QoN֣9S3?/1S|do¶ 5$л0vc[֯|GjJ;.rOW _fh禄ZSebǮ`8Uz(U+nagios-4.3.4/contrib/exfoliation/images/logos/sunlogo.png000066400000000000000000000023751314764422400235650ustar00rootroot00000000000000PNG  IHDR-,~$hgAMA aIDATx͘vJ ƿ](jhhZB!}kphЅCȞ:?lzO@r{蓿 ÿ׿ .37D09?K=q333f~yUsΙFy#g@D))gP>1 2 .K53G1Pyj<==x (! @!Cm)MG)("29gڡL1 Y p!dGCms3MiE$r !RPJ"P3u(PUFFGs|:Y#hΙ9{iE }]w][ m8jqVyZRY! `6d"uJ2knd*0,+8 !Vbq|)M"BphA@6`f@sE$l535}p>>H䉹 szZ%|B@ *ĭ|(N9 !YFwjFK)n45NsQyQyqwFu;4M3M鎱9JލFU죞wA|"Jۈuu JJ;#Pv#}(zc"nc 작b<]j5u眸W 'z| xCIENDB`nagios-4.3.4/contrib/exfoliation/images/logos/suse.gif000066400000000000000000000027331314764422400230350ustar00rootroot00000000000000GIF87a(( !# #$"$%#%'$&(%'(&()'+-*,-+./-/1.02/130342463574796897=?AB@EGDGIFJKIJLJNPMOQNPROQSPRTQSTRUVTVWUWYVY[XZ\Y[]Z\^[^`]`b_decghfhigjlimolnpmrtqsurxzwy{x|~{}|~}~e f hipjqp"rq$r%s&t(u)}+w+~,}5~679:;CD3(DL50xIL.50C!t37PB 0t1 %#0b 3䓌k#P8̣IL2HM & Ѓ[$)$#`#'J >B8 4 #I B$ &| P@$& 84 #b? >؄C BcM5C;"4aXS P0  B0 *t A܂$ &BX6m8ɄS;-rL£Lb@-DmH3;nagios-4.3.4/contrib/exfoliation/images/logos/suse.jpg000066400000000000000000000020111314764422400230350ustar00rootroot00000000000000JFIF``C    #%$""!&+7/&)4)!"0A149;>>>%.DIC;C  ;("(;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;(( CK1՛-MvXem  J7#ⴍcNFFNN쓌)CRx!1AQ a?!K%W2÷=2PT։e/)QSG;vZ\ ]]h}o $ 01Aa?!ɠdkQ;!1Aa0q? <-KJQWpF.Ͽ_b;hУx|uQ) Š 1!AQ qa?N- yE0 ufF#Yy[c1u?HW\{W\691:g5R+D 3.+.TQwR"uEq^Ue 튇@0zg}F``a@(@)%2ft|YeE"4C!"k my- w!11ƈ]:BZ}cI^ !ըuҟ<\O`.e1@*  `~H()Qwh)3.8O#Y=Hlz !7?F\+I%cE|@#[_~>ݷ1 ԬN!R*,ⲆZ@ ˊׯ.r<;rݷ24m5m-qq^5 vhS @xV굯Լ)RR;4OZ;G|o/`j4}M _{L`5h*KeRQ<=L,ŀ UU QYPT}(јzB_^L0h{۳z&W_yyb (%Cd-g`zٲF"Us0-ߥUW礩2M?yP r"ΤU0fj5>8ċqw>j ~ww4B(ɔ}c s~11TVP;,􌍍R) ~ݞJ0*NeXl6=}NjBȑ#GΞ=[__hED"35k^3Km6~/f]vޭ뫫 !x._|1<}tAAAkkk#+Դa ~(|ÿ?rEE{{$i߾}VرcH|H$B)4ͽ(wuu544߿ JKK^'xGL&&WUU}h4ݾ}d CCCPHQFIrck׮SN\.a秦$Ijnn~2٤ M^drrrpٳGR!gff(cjrB֭[re:VT7oܹsY|90 =xbhF |CMLLeyǎEQP*2 Ǐb1Ph4//h4 0<<|ANFnw<׮]dYc GQQVAR9sƍd۳e,kZ;::6nx'O ͛7766q7==}QW\\uVټemx<.1>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~NxsݶniآcWАW cu{fİsWbrݎMd\f~{Q2ZWwkzU]A/\]`)m7J]A7]aٓYL^1>hD\yZ^9@hG-[҄a#gfEjMsz\Bime9?vhR]hhmuޓ_;tӁ)s`݊:[e9S;ytK>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! ,((@ HamCDIHVUyˣTL{GwJRJY  \ Nϟ?ҲFqKѧP"kNrjݚ\+P8Ȍ"jF͘SɝK9>HI  &l_,,!C>%?IJ@63*   i_   '4@?3'&% jn%#'@@@@G?O?F:?2//3'Jww_#(,78'ACJOMIH>SNF1$22?@@&&&@PX]ahkqwwwwO'-!@Q>$>HI???3'&3JU[_fimrwwwwwwwwwwwwwk &&3JT[^ahjpwwwwwwwwwwwwwwwwwwwwwwwwfYY]hpwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwnagios-4.3.4/contrib/exfoliation/images/logos/switch40.gif000066400000000000000000000024511314764422400235200ustar00rootroot00000000000000GIF89a((19!9!!9!!B!!J!)B!)J)!1)!9))9))B))J))R)1J)1R)1Z1)B11B11J11R11Z19R19Z19c19k91J99J99R99Z99c9BZ9Bc9BkB9JB9RBBJBBRBBZBBcBBkBBsBJcBJkBJsBJ{JBRJBZJBcJJRJJZJJcJJkJJsJRkJRsJR{RJRRJZRJcRJkRJ{RRZRRcRRkRRsRZkRZsRZRcZRcZRkZZcZZkZZsZZ{Zc{cZscckccscc{kcskkskk{kkss{s{{{{{{{!,(( H*\ȰÇ#JHŋ3jȱǏ(G$5iИ)&/]`BJ#@v̠Bf$0QĆGG0ƌ;xB*U4ff`D+a JMh4U SȪĐ.rH@` 6pPOX @`pƒ'><`e pPCQcpe׭_nanl8GUVL#&ABDB5ɦ)' 2R qGHHV`/:`b?$6̠0 '1{Dv@a|Th-3`B F #T@U#<"fV?P/P`J(p1O4>L1 ?Pe @@EaF5qB D>P?h ITfц сu` JPuEfdEh| ҩꪬ꫰* ;nagios-4.3.4/contrib/exfoliation/images/logos/switch40.jpg000066400000000000000000000021311314764422400235260ustar00rootroot00000000000000JFIFC     C   ((" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?SS~?-9cM||xJ >}E|'/(Z ͼ|4VGM?Tj?+UQ^Kia uހ7 x~?bގH$IRJo %I䙔HJy$h`oa]''yuk}QQf8`^G{ⳳ/?ZBr [nl oөÝgϾ*u}mE]Wު Qaz Ī]g?xarjXÆ Co*}TB2sv'{_&0Ũz\*6fC.֪6zílm{mqJZ:n'4Rupv$a33+3!UN*Nǔ&f32fg1`f`!ͣ޼9|]bJelu8r+/L\"0?$_pQ$5]gV9f|*gL@bw0۷ïkQHB!Rœ6s}GGߍ/^|$hU$IiZ)NQ$3lbr*އ|]|ӄnƇԵFWIe=MY71zﳨVf^fMSMSڇ\9}| >4iuݬ*]xd `{{9> xހ7 gKIENDB`nagios-4.3.4/contrib/exfoliation/images/logos/thin-client.gd2000066400000000000000000000051311314764422400241760ustar00rootroot00000000000000gd2((  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~fb\ΒTGusne߬]/ԏY;r}JkJZJB~bJzp}ç_J|}̊}¹_J|}ʕ¹_J|ӛuȦ~¹_J|tl¹_J|ڐj¹_J|c¹_J|d߁¹_J|d܀¹_Jqc~¹_1c}¹_5c|¹_+ʆbz¹_oȮxbySo6ƛzaw~Qa۩aitYvXpݔE`˙NtcR~N_sj@xs,nWkQPla!9`vHNaK!Wgm/cs@lwl S^ߐTWhc/O}tO(nagios-4.3.4/contrib/exfoliation/images/logos/thin-client.gif000066400000000000000000000031231314764422400242660ustar00rootroot00000000000000GIF89a((  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! ,((@ H&Tb*v"JH1"5 *9wBC r Ǎ2aN}hPd41FhMSpPr}wЍWsK.7_r6O$f|Y)bq}gphc ch/cΔ8rƹMb' |NI//S'7HTX.ES5rIʽ _+_ΜGY+%$+?ν{w{c:u6Ʌ̔IC2r_;~aid|/dK|U 3D:A  +߸M*a$AC d",`1PPJ7|S;x;ވ+%*n/1,ܤCO9N<&}Dd d+WfBG9pY2u9PΞ|7tAr Ρ&b "c饘fj9hAK&}0sϩj9GS~ߐ+}L%">:ا;Ȏb, 3S_=sX4c#0t ;K5N#W1I%ڸϾP5}(CW+!'bbH+T\5 `1J5҄좲ʰApT9p3O7a",,t2FA9ߜ9ߠ6ެcBkP`A9#<쀳N;&HOW4M38Xi;Lrw\SN:9 rh8]9Bf@;nagios-4.3.4/contrib/exfoliation/images/logos/turbolinux.gd2000066400000000000000000000045251314764422400242010ustar00rootroot00000000000000gd2(( 3f3333f333ff3fffff3f3f̙3f3333f3333333333f3333333f3f33ff3f3f3f3333f3333333f3̙333333f333ff3ffffff3f33f3ff3f3f3ffff3fffffffffff3fffffff3fff̙ffff3fffff3f̙3333f33̙3ff3ffff̙f3f̙3f̙̙3f̙3f3333f333ff3fffff̙̙3̙f̙̙̙3f̙3f3f3333f333ff3fffff3f3f̙3fϫͫ+$++π*x~T++~Tzͫ+*~V+*̢~xTTx̢̀$̢T$+VVVVON~~ͫx̢TVUNV̀xx+V+*++UỵNN+U+T֣*x+׬V+xUUy+ͬO*TT*UUͥV׬TT*+*+Nͥ+++++++UUVU+UͫV+++*++*++OV+*T*++׬N*ρ++*x̢ͬש~NUV+~++̢zϬ++̢V֬+$̢TVV+̢~T$+׬V+*$+׬nagios-4.3.4/contrib/exfoliation/images/logos/turbolinux.gif000066400000000000000000000036661314764422400242770ustar00rootroot00000000000000GIF89a((!!!!!!!!!!)!)!)!))!)))1)1)!11)111919191199)991999B1B9B9B9)B91BB1BB9BBBJB1JB9JBBJJBRBRB!RJ9RRJZJZJZRZRBZRJZZRcJcRcRcZJcZZccZkRkRkZkcJkcRkcckkckkksZsZsZsc1sc9ssksss{c{c{c){{k{{{kkk!s){k{{{sk{s{{{cRs)ƽƽƽΜΥΥΥέ!Ƶ֭έεޭޭޭ޵޽Bֽ֭Ό֔֜޵)ޥ!9Zsބ!)1919BJRZRZcks{ބ{,((o%*40aÁ I8D+$q[=VIr#A!G2\aI&1~B2]lIDMrU-Y+VCwLZjr=ꖫmnF+%U,K-ְVj%[[fe +gj5ӗD 8 6k0_dYV5bxwB4 k˃ U QҤ)Ҝ! :WZ|qv+5XiLvSkt4@[X GU-eܜ4T6 ԲkV7_jU++a[ {ĦVDх T`#05@U/_L@0N1 m2L,޸2,fܲ \`Gd0H ?r/`6d,r tх&d 8`# s82/pJ/BGPC",f` 8 <8c2PGJ. 8@~4A *S6v 6w# |8" X؀ (2 -Hc .(3n!8H +zI\ ,0 5AR G`b-Nko@# /:xC)4|H@P<d0$p0P5iA1Ҏs*miB'*pM+|˧/pP(/O; S 7NJs32l*G;Ҫ`ULR<+l6x&2 i}7T@ŮX3Vs,‹4QQ&so2 dō8,#,DK/0*=K.2TD ,⠻g+ A`^3#ɼKHsDҍ8ȴ"x+rA ͢=ޠ #PPm˅,\C3O,r l#OpKbC$7P̂Ѡ0 GOUeQQ^\@ L@pADV7dE  2Xqkb*0q=E^Hb, RHCƅXr(8Hj2#*I M:Ґ, #) %TIO:ِH220DOS5H@;nagios-4.3.4/contrib/exfoliation/images/logos/turbolinux.jpg000066400000000000000000000035231314764422400243020ustar00rootroot00000000000000JFIFC     C   ((" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?3*>i=rFc3w$kYVojK!)DQ8]e5&{-ޣvܭWC}-rx#n|ΰq՘r~!9s1vۚNVc}nvvg3pJ۶jQDhC"91҃EMoȑc~~=3lǾM}CΓXm.,dHwF<X`y J7!fi4eC (fM,|Irq -%q;i'sY̹Z}Uٯc0Wi0fsvv>3Ož+_Y@ɝVXz3@9D)>zoGO-9ut]70~K{Wg>jv@,bqcBFzBky?coS>?/ Z1Ff^1\orq9C񆑤^K񇇯]dۉ@d)JIUqke?k ^220} G21$u_Ӝ1bpqwK{+enCŒOCewυxgXM&'Y\7lYpI|'N|=>%oO݌i$b0JPxR= }aZ¿x$%6FbS 8?_ǭ7jޣncV(AˌEy<>U3 2[}1tƏ%5WKvvkxE/Ԓm[Q*p˖ޡihma WɆfT:{bޢ/T@ߺG^F>^xy*'o?^Еkh5[Ll̠JAVotcӭKOP?B5%ߧ~N7Wnagios-4.3.4/contrib/exfoliation/images/logos/turbolinux.png000066400000000000000000000046731314764422400243150ustar00rootroot00000000000000PNG  IHDR((/:gAMA a rIDATxX]lWblJ7xp3YjAlӪ4TϦyوVlPMGPat*uMKb,yN *xPV|Cì7̽sfv Bߒ$tOHF ]=F*+_F NZ&'6w%yyojX>+hVݝBjo,k$j|ຌDH媣)@"2u Ôc Qa `cdg5(bhH'L ` k,{`ٜ^V1ɧd}cMgKبBt< /\x@7o,cP6D`?CLl SGX_]H;SG1;'7G]E("Vy 'nt ޒy竔p]6{ESW>~lyWdMDw;ka0F b!è9/I2V1eT*F\cFr[`M9FRFó{уTd>/]֭5 4a0C{+k)֪ÚvcWSkkQ^:!IVV*V*VTNmł3^kSWBŞ} tЮrUѾh;RAkZRmA{(D-ضAB8NdIžr5l0vcɠW^9e@Th3fr-sss mXXa&( (ZF"u3AeHNׯ_ /Nj;o,.(%)%ϿzSTAjC?`bJ ]m3ԆJ"ff"AJ~K 9lϊA6'P2ǀ47o' gذ(3ʧU?15cmۆiQ4={M VcF;3 }&g 䬟 Yȸ rzǏ(Iv,<(6 ;sQ1/,}OpqɠDaEʀ8e!-:-M0hq4XyuP#@<2[ou,+c`@ΐa$6_ʘ޽{~gAh 6XՃs;_"l_e@v"p0F#>vu_Gxx߾}7'rvm&N@ =ݻwQ0(~ e@y16P@>0!Ao9kg d{)q~ڹxرp೐g,0&.{1lhWh{˪kmzm*Cl`ԲO!*ER㔯]OjWR~QBk†v[о]/DiaXTDܖ_O!hLrl^h j8l+JEBӮ~>qCueu|R)yxy$kmmC' V5v{P[eej).SkvFa2Oow")er>Prʲ,44%OAa>Fcg^ #gla.d\k3b~U\OE^b>/2*F_ I5U:Q|/E̯<Ϫ}%x^ [FwиV=v5nUg~9r3oC;IENDB`nagios-4.3.4/contrib/exfoliation/images/logos/ultrapenguin.gd2000066400000000000000000000045251314764422400245030ustar00rootroot00000000000000gd2((3f3333f333ff3fffff3f3f̙3f3333f3333333333f3333333f3f33ff3f3f3f3333f3333333f3̙333333f333ff3ffffff3f33f3ff3f3f3ffff3fffffffffff3fffffff3fff̙ffff3fffff3f̙3333f33̙3ff3ffff̙f3f̙3f̙̙3f̙3f3333f333ff3fffff̙̙3̙f̙̙̙3f̙3f3f3333f333ff3fffff3f3f̙3fJ%%%%Jo%oo++%+o%o$o++oo+z++VoPVU**o%x̨~J$x̢%*~̢y~Vo~ր++֬׬%׬ׁJ%V+J%׬+Jo+׬+K%׬%o+++oJפׁ%׬׬o+׫׬%+nxN׬+TVͣ$*TƢ$ǹƢ̨N+լƢx**Nx̢̣$׬¹~V֪׀Ƣ¸xzVNǸ̨׬+N̢xUV+NƢ̢x*NƢxxƢx*%%%%%%%%%NxƢsxxxTOtxxxxxttnotttnagios-4.3.4/contrib/exfoliation/images/logos/ultrapenguin.gif000066400000000000000000000032151314764422400245670ustar00rootroot00000000000000GIF89a((!!!!!!)))!)!!)))))))11!1)1119)9)911999BB9BBBBJBJ9)JBJJJRJJZRcJkJkcJsBR{RuRsZcsZcw-sJRRRZZRkcRZZZskZccckcckkksss{{{{{{{cs{Ƅƌ֔ޜΜΥޥޭޭ޵k!{sҤ۷1-{R]Μ)ح.ҩ=ֵ]{{εswҽνƜέƽεƽ!!))))1111111199999999BBJJJVZJccƄkkskք{{ބƌƌ֌ތތΔޔ֔Μ֜ޜޜΥΥ֥ޥέޭ޽޽޽B!,(( H@9!&$ؠC# bEHQCtI@V`@0?YFui A8lܙP1P&c@`Ȭ|*qC321O \#*ɕ.-L8!-Y!R_5D.R2$@N> Npaʕ*GA1AG5 B: 5S /9ϰ9)Ir>RL*->(0)4>opS *ʘd;GIZE>3K(a)+80զS&4裏;w),(C?SS'4 R 0O;%'}$#쀏սӁ0È.(3"8T !m$9|!T6%v%[nG%ZI60\ tե6.ѵ95V3+0LRD#UṬRU0͝:ôԯ+8¾&jn¶E- mZBBJ++) ?C_\g-Pb2}>迲|Uy Z{\_ Ŏ^wXX8 YJ nyb/o$cմ~԰urEܐxXeg۹ll0s`9#~MB~_/3x+_V){B2FV8m:?Gt;k b! )!'I׾'?#Z 6q} ZvV-+:=+%RԏSilݮ['۝{K鮟?I~D3ӆ=wMPHɌȁT]exi>n#Xr:~3^_QOJ5˚2WMlٞ4(IJc:m4y^hc\v 3_-|`Eo ^5KuK@Uc&n( #u'fm.yviR>uYB?O/쩦:j*]~036s>j3A NrɳfS T`P9q1_R#׬"~*if*xji{HS+K Vu"_I|-x@Ow^:0&(A?ݸz5Q_Il Z]_vyELUGV՟nagios-4.3.4/contrib/exfoliation/images/logos/ultrapenguin.png000066400000000000000000000060501314764422400246060ustar00rootroot00000000000000PNG  IHDR((/:gAMA a IDATxV{pyއ^Yp6&N081vqnp\Ŕ8nҎԓtv8! !aRO3!d 1aHB BZ^sqB?}ad\F.8)iIس10p&uu-]n[Z@:( Ylzл>Q7:dH~|4x^u/~"L E9(34W_co}tk"CL <՛k1]\4QH"&C&A݄$5n9ۇ?h_s紤_r]|r^wҮ֥q{x\:& X<6>:z㓱Lп.E,n`ive[P?Fad엞[bli RFמΏ^ FTbMYsOȐe[w-2& rIP4Q*^:9'Ke'c4kgRhNAk Pp`u*p"NU[Dy`:96^_!0,2ڼ ޷loM{%c}p|]Η=kUa2Dd€ H)sIMozzs#2422zތ}oAH2@J2`SDT$*E*TT iZbE&$"Rba쒯F! 5Q`HUW+CiUFDj:x}iC1DrHVӕRHQ0o] o !c(RaZA4q@;ޞ?hJ^|Z+͘<{Ѿ|?^'nF @3F& M&hܐ& xteDjyꤩLMMũ'vw} z#&+( f@Od]?xt~3y:(xjBWfu-ڏ/L\ K!o!={[\`ӵ0}Qm|rQ!+v6u,I&=/;@tY3@p )HNLʮW瑿|mNcǝFc4/SP-}ccgkK\㣽=}}}٠}٣sҀs}2 # _?HfT+R0~Rw55$&&`܊1ȍլOiL6_>`J)yE0D0RLΝ=kWN9-[%Zyv͏=JL){QB&:|甫1 [Ut^qg;in%a`K@Қ#SrcSXBop,0ܰкw#^lǾcu/Fv{m-UƇ.*ͩ'dV, Us&r0z5ؠ \r0; @TQێе㎈MK=}f/׫r4zj}*4D,pepS%81*]U``S tQ a͋on}ݼ`jbmkmq$F/^|'|T*AdґFvֱCU6  SÑ*vyXa:PW!Sgd5Ӿ-8FrБ{J5+,C-0~mdAD@+X(\ H$P"PA8Xxd~H@@//ȟ( @ 2Љ$XPml J``//X   3f n0&[!8[D0& \ "0"`dЂ0}lCx>,@F ` z;qBiĂd\b'K  Ȍ0C$HA,/Ac ?`AC4"8, hHG4b 11IsNA™)҉ eD={[&! OC(0, eTߘG>"H%6SH4mЃ"@Nb i|t5%NOZ#HIԦ# ;nagios-4.3.4/contrib/exfoliation/images/logos/unicos.jpg000066400000000000000000000026731314764422400233740ustar00rootroot00000000000000JFIFC     C   ((" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?6|y u}LHmqȜ5oӘu.}7۟ƿ)?[DȖ̠999!E~UA㎾i_mUR:JZ=EuQ|σh*k?ZEҡq88c?pƚw\͒N21'C_F~ {5YQÂ$^G=Ͻ~si[ۋ tmNՅD&q9?)8ɫ;vd]"[#'w Չ#>e$ס~K*FOw$ߨ^L5kIbQr[[>5n%# 3&8//m>9`94}'O\C=Mq Ub@2s ,b;i,nɡHfc C*3ǡiak_V-yeCN&#7^42ok7OԿݺq3#''g}Exћ4N>Jk+3 2^~> XŮQ_ʽVov'Zll N-0`睃8x@N/E.6 o'U.m8L3>UwAVH%jʅU3 0 I Žm[)P?w_zcf1LIW`w#MӐfc~Y [v\"0y pC%s=0#q,'p `sF}ߩ"4ʁ0@ܿVd0 83v1'2Tʓ^NPGRy,YAXF{0nܖa O'?~*2[rlledwzsuy5X=4YFm@H*܅;n`A03ŋhUd7q\y[3bb/xA88yYUYfFsRS.veWs %(HlZzt`eD zIn(ON%?"fnb?&فTFFYЛQʼn OƜѶKBj'Wz+&Vxu#z*Lej?JJ\ rܷ׋Mh:&3*0l+ZYuCv yiȋ~-fweeP"vx*G?e7QZ~ .^0SC UU*nŬEijtV +( 0e7lRmӏO cUn}gQZQنNsXNR32kP1X C#;]$g)K8xAZ]t[?;aY#^3S?./UT!kXV@`ms`ǩi(cV gSK^ɕ'ի3k?1wgo3d5C?`{Zj~G WgF#{rOUVh^W,ċ9 ( )šHmZ& ?yd-qt)=Z3V87L_KPÁ촖q ձfy>{ ܙ|v LTs&7ZQ% M]X?}a񑵄䡔txR;׳+w?L&˗wc85KyBL䓍^``VJ4aUm֥ӔDw6ΧvCP<oz)s-UdpfwkM4|/uFc BzF}u)Zzl&WUMֲEֈ$ 8j=8@Ǔ|JZ% 0Ѽ{ ;;CFy`e团=dh7~_mț;V7.z u%O'~'h4MN[nY:<8P)$'<[Yᖦ[# ^NG$Ux=DIb$u2oQ很 ~`¶dvFe9D-\ )qj7 QdgU|{dDD8 N嗀!c>}R}qɊÛD Eۭ$JW.7@B0H t `EG O/6a//^nue~%,DZrg0\ik{4ju=(K,rLy7^0vH"t8ER*v}mdz0GD`2d"礦|xUEudJ[`h<7vUHO%,.efYM~jزHRL ⣏z*D&門W2lɸ"MvM`tf#S^̅ 9EQzޟN*c>e @:JL$:U|X "azߨ \u8tZz5I:MiA M ,HDCFLE 0e3N%I%)A`( PolVLtjih[ni`Nc0VMrK.BFΟ;A}";qyvֶJp gZR-7k$Q6IdU(YvUݡ.-,-M'ֽcIT\^>{9hi5; 2S膱\Sn!T7iD "-Lj M8 &K q*6@^;]Ow/D|~xUg@I^04UҗP0\Nծh1݋Ǩq9(#o1í@&'礦wXD0=;)L[7YIqoyyڈɦ23a0 YG*FCM"x>0y78pgo>wo;7c_,ao?뗷/IENDB`nagios-4.3.4/contrib/exfoliation/images/logos/unknown.gd2000066400000000000000000000045251314764422400234650ustar00rootroot00000000000000gd2((!!!)))111999BBBJJJRRRZZZccckkksss{{{                 nagios-4.3.4/contrib/exfoliation/images/logos/unknown.gif000066400000000000000000000024001314764422400235440ustar00rootroot00000000000000GIF89a((!!!)))111999BBBJJJRRRZZZccckkksss{{{!,((?H*\ȰÇ#JH`2dpCŃ$$ 0@$ @&M`6n24~Ypw"' (AcE:~wDF(CqᇎٓUceCF!iXQiT@`~K$$٦Al`(n9PQ5Zu$;nagios-4.3.4/contrib/exfoliation/images/logos/webcamera.png000066400000000000000000000102631314764422400240200ustar00rootroot00000000000000PNG  IHDR00WtEXtSoftwareAdobe ImageReadyqe<UIDATxڼZ lu~s}py,IQ")/K$˒Ɋ֍ҤHQm0 ;Q4mU@vąʖ7RC:HI(X=s{ %)2t_3;3wJR'qkY=M]XVwNPK[;NUEUb-;#`k9s["Һ]RTŲ,LlJCbښK/I7όO-ma4(^ātK9sKd{TYIﳅ;,2[;2[ʀ= 4P!E/Tq }Z6'!SMj\|:qtml(fH$x hg-W`KfF8F{ ?  lRgR0R8$,TaBf+0+3‘)P +FT8jPe:n꠵kWMTj?@ATD#NT0B۞mıE89 + }^=:BYfh^*JTD p +(ݘD4w4IXum==C)31 ͻT֪lTO#˞9]dU kXVt=g`R8jd2|61g%IO(a`L|k辠šg:YL)a Bue<K^0)ܸu[""~e%r-( ԛn?>4l3k!<Np'F|okN駿M`T6mL= x(ә~4tSU)aXg38gpjC+iska9 *H<ƹsA1@}DPX+C!h?0'5/ vn3ʰC }ri0+^|2J@2 j34C`ED4(3]84pZU,fKrؔK3{WH/‰-ܕ9PAeMp71m,Ɣ!$yGoFUT984}LUkT >@[6UKnKXh\wtP^8D{ugyHT^pZP%)P·cx \9g&sT@+* q<ᯎhPk#߸Ou_\4_:?wH8{欰%;m6mYQda+z9E骔Kpx^w}CޭE N߹w;vaڱs'd2Hrmt~yx"'kE*ߛ[_x_RK!͝L+_w޵y̼s;|oE.`Eש؇ 7xSƪJeOJg~v-MZvׯ{~n-EQv^'lYJ$(SՓQXBMSpI!oy/s\@QzM=gJVA(S4T Q9<(h3B`ӵ7Q{3M?O'?*M93DtM);keAڛ?ZO \Fo;_T/}ȯiATLgX^L% %MkdN:z=rV`w$5$sbXuDzVكDBue4+AE=l# F[-FSܰ!_=$Iyw˥ S5aUA鲫6h:'Zɣ }N9L@z3LO@c;IENDB`nagios-4.3.4/contrib/exfoliation/images/logos/wifi.gd2000066400000000000000000000051311314764422400227160ustar00rootroot00000000000000gd2((  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~WU #xC;?As8-DRh0[NNr{ɢuޗq ʷL[}ħx\gb];y9Sno\bylk`>ȘVisH>Q^y ЉKUovџxM{Rҟ`;ҝ۱['єoq NalΎ֭z9^b̍{hfZꦅʋϕ}oaZqȁΫu|גWs~|ˮv{"Y`3{ʩxX}ގW vlנQ5âu׷gMЉּxGf}ѽF(̦rŚ^/ϖsѽgR~ؼrSayR'IeS8nagios-4.3.4/contrib/exfoliation/images/logos/wifi.gif000066400000000000000000000033331314764422400230110ustar00rootroot00000000000000GIF89a((  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! ,((@ HjbѨY ܸrؽo XBYOi lݼynspɓ-?Č Ydʔ-seu4>@S&^ Ia}pE"4R r8#5t}N9Ȳ} tA0%Et E:sP,r4r8N<NDS5t9;G}1}Ds 54C)bt1yk 4C!`bEĐ92GP '&/,S*oBS8ӈW%ɤ''5t63DCI#b/^Fy6b 24∑HFMh@G!hLS ;p. $IMMf-hs$WTE,#/zLb#dJ0gs$Б<#:{ME^LY N.p8@`QK,}r=/SO>#}T$;Toc5dNfL>觯>M/Q j_,ɋ,Ď,'!aPN@` ouZS;tho әSHHBp`c;v;NpȖ,Ylmגw~ Ip+;o~k"I/]_onTCCáBYu,$i=heNEQk $ R d0mǛ1Z8ɪҶKRi>بT}-EtB>w8±FzDEY<dZi޻vhoۋe T:MʽCF5N|fPuQ>2ҲvIG^Z,&"Άd2$qm;{#p87VjkA_FqF0YmK)+I[[[CO|Q ÂV +Y5 M̀+hn')h6-e`:,{/X,I.wjP]9flA+y0L^zyz xxX &.92WӬFWQ1רp]HxMT,HɌepL#qnRJg2cvztVEz]\:D԰| |۪;񭼸r 9z竢 ^@] (Ph֥Z40SO[fCr_bR: h9p5S=!z' f+%`RẾ5,wdL#{pDϹq1ap`E$/~c# مLRn3cQr80ʂ'n[[[,7<$*h.L׀dҹYh0BVȮrtuwnP,xa'9I>K$ y6rc޽g2ɞO|ΎS7Iط_x.EnA;ڠiWUCRbnmnJE\2]W#- 7M&dΟbK'ܑ:.tȱ3}vcIdOkoVOjۭĜZ@CcR6O!]Ff62H9C UxԼYaD<4;y:$74gASQO S1J'F.]:kf([]ڎiW 7xn9#5mj4n8mRslg*++ &0p>M& XKM7傐sF.]=yxg]]'BPg/؍tFmaB saj"׋nS6D/%Rˌ1QhT`O/  uA\&W2pκ BWۂB}uoܸ7p3hdB2&bsc'{ {q}/27 Df`iP6om~qSS-BAE+ŨE}}Y?(pkصF;+⫀Lj^Ćn^MB,(Le;[鮄. 8:7弩W|e,8<\su1S__/W+=Ѵ:,.-3@hQ G)cWL|TIENDB`nagios-4.3.4/contrib/exfoliation/images/logos/win40.gd2000066400000000000000000000045251314764422400227270ustar00rootroot00000000000000gd2(($:{z)llzzmnxx){{솆~~鋋cc778~~9:p&*I*$xyz`eiw{~=CGU[_y|~EIK ^ \ X I:p `$#""!!!BB=RRLMMHDD@~442դoon[[Z٧߾sco^n]l\aR91q_UG#ҩ*'{Q( r#:KOZfu”׽h q3vxWzt~"{!SRT{KtdL<˪г|||uuurrrfffccc^^^WWWTTTQQQNNNJJJGGGEEEAAA???===:::777555222111,,,&&&!!! $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$E¸$$$$$$$$$$$$$$$$$$$$iG$$$l$$$$$$$$$$$$$$$Dl顅MXXNLH$$$$$l/BOPQRUWM$$$$$$:8JTUVSRI$$$$$$$$5C$E;E$BJTUVUTJ$$$$$$$$>JTUVUTJ$$$$$$Z?JTUVUTJ$$$$$$$$/@IRSUUTJ$$$$$$Z$$$$$$,>KVVRPQI$$$$$$>HMMLOXL$$$$k$Z$$/AYY$$$$k$$$3郂$$k$$DE$$9k$=`:ii>1DQsg5Y^[ $KY~1Ì>#i麍;D_ѹKH$Cyf,0G*+oO:jշ%h?¿V3Ŷ0,nunn>Tye uu-_;/KHf+h  Ğwp@:[IE|VΥƹtE_ 1JE۹@',TH i?k{-&xzShm#dh|?i8{hvӶLG[;N4\[^{/g|=S{=r y1#M}i_I;C~5mαg$fc\q wZts<<\cʦn̳ Otcw=Ƒqi4 %ml;K!pHc">Zx|7mm$ZgCDRƫii"F|uG<hiz2^^ڝ[?5.Kr8ϓxƞ.o&< xieI"E*[6e$qXhm+'U.) Yo-{YZw] N:us6|=MB[4*ӕhwOUy.Kw~njir Z!v+8=z ?|Sj~gd%\p3#=xeT)fn|Uu+}bxJ5K8o^,l0x*Gw,wixM]eg3@ kVFJR1j ⽂3>sT5/ 7HyB9*\(( +{n`G"ʂT Xg{TQ@nagios-4.3.4/contrib/exfoliation/images/logos/win40.png000066400000000000000000000043601314764422400230340ustar00rootroot00000000000000PNG  IHDR((/:gAMA atRNS7X}IDATxXkPWf@ FKHN%PZAZdB~XYkb.TaY>JL6Z\"20 $8# fw4>j֪ӷO{|}N!% EX_Hbj (*77W8R\-?p7n X ^|yfff||<˲@!XV0Ν۰a3RTTTB *BȱcL'Y֛7o ez}LL̳Prr2!T*:t1,liyyJ~#[&&&m6Z@4EQ;5h?z+#,f̰wF`nh~~~ITT 11ci*¤F]"x~2t՛-; @\v5@\bcDNfر###7Xwww111I^e Cpw "!P˯~N߿?##y$h5?~\ק}y8\p #V,P=TY\w뱺%3&¨`#eqRF__CChtǽA+N`/pbU L0\wy*QGɈerh뜜- )A)6M0n^Ǔ'th"qNqjˢcJ2r9hӵ+|c@cEy|ŪT8RM*{+`;*jՙ3ͣEn %MA6Vf G˓@02{ٿޓibG-6Tډ>mVဴգӮA>{z|=~3XvţX_P$V#ʷS׻ ߖp}TrJ`Y6!>ͶZ蟷u9L["۹sڵk333O.grJb6 I,It=o{~iJJ)mlMVX,&n9 bafBЭ'NBY#tvu5HonBNݥjz>&Fq *wvaEA~Wpt:0panntu߾}хWGFFvvv~>3FZ,Z8nuK%/""A%uߛ1(JX~=ATPPewvv&%% h4,XNKKM@f AӠ&! " <)&sNZljRDG94Dyy55x{Ĭ `Ϟ=6e9snl o~rB ;hOC~=3#^<<,NzEAt9CB(y4]d@*+eBQ>{UȰ+ @GØ (:hOO),[kP Ã`Yv͚5)HDJ>b  nJ4 l[[$nBeoX9„pKt:婩`>( jݢFQJ%r8s;A/= M+33\ZJWxQnbR+K}")SīW+W?`W(t֭ɓ*"E9 \1u(ᨮ:{ dEQ㣣fy~/cfb0t:]{{{YYZ.))1z6nܨV]deeIe>R|hV{{ӧpWmE WHKҸE~<%w01qK`())Zuuu CvvKaIENDB`nagios-4.3.4/contrib/exfoliation/images/logos/workstation.gd2000066400000000000000000000051311314764422400243440ustar00rootroot00000000000000gd2((  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~I`˷mbjWڤԽmY=b,$N~e=v~'!#]Z=g_%#+vW=hRer=|̀ѷ=|r⻄y=|td=|ثlq=|ߗp=|ߗo=|ߗn=|ߗnȿ^KƇߗlwp{ӡߗk⼼d?掟ֿޖj[f|׎|ږicm~Γ~oh跤]f]xᖈؔxgڙ]eONryΈs!f]j[GM˂qR]>ZIЮḋWW7jD6UmZ\҇G/˞X!0IjtƬflroô|1 CȾzHXi9ɣdCLq؟]^ADYaxˇT \`.DnLvkJlwQ*oe!CDZkK,|G8{E R۬l$l{~V0~VZnagios-4.3.4/contrib/exfoliation/images/logos/workstation.gif000066400000000000000000000034501314764422400244370ustar00rootroot00000000000000GIF89a((  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~! ,((@ H$*\h->ƝK.Bydni 1LVBMNoJ!L/^ֽS+oxR3cDlTi>~aFmZc\9BȦHzNn\'#*LXω# +7C훗7זvYtSz,!ꅍSg^RWux2_a誉k9r}oOP@$˪4,Q5K'o6Vlp۹sHMŌZDm{ ] YFvHQ$H#|;6K,sN9X&| ӟ<](C3 $ԙ4c!\hc(i8`Q}3N&th29dx :dx-X= H6[pb$|*nLL9@y1;(x $3N1 5w`C6'H0% 1<4 O9l1RL16LA.3ԃ-PO8!&y8Ӛ3&Ҙ4ߓ9|)m#I  433O=hCdq4* L3xE0$T7c +f&T:-i (Ɍd}0(„A 7Í8:,s)B/B!x-{c ӴV8k Á5:֌#H;%33kkc$ ڀUy[ڇP*%%y#-RWhJB>4MR!P%P@ q ^cofvgg;YT% $:ݻ3~99ň㘞ˤg A` eRy|X\XS#>:3444i6aDf6Z\-ת 8d'd)J Z 3 HH Bnx&0'A h64Lx?Rɣ2-`J^]ql7|8T'B`߾}4',SbQz}_J0A. !'<'CV\.ֳΝ;W388XL&Cl uJLa~jv75cr>I"IyKHdG*P'=q&h``>BulvI` j=Jjj yI$A Qĉɜ<>+1 dPسcǎ<:9<0 CPM l|4K =G)s*er}䆔 AA!Pֹ"9C[ G0uU ;j,=MiQU9I2/PI avLXRFLD85U[ ^GAWBߒg<JHWc}>*)EaP*&)#ˈ5C ah|e4[.cBfyQҖ^877Wr =i?jgؔCed*)H㋼5^x|K֔s74*IG` nHEB{M)i<$ю&‰ĪʄX'S/3~e2@?0p&BAZF@ խEUzPB EK46腼%LBB%-ʑs=s1wC8 uE tvLRb"!XD@C -U&q7z-6'hmZҘ|bII{T'flkSzICB>r4n0%s aٺ"cqr>rJNĝ;GV̿#tbv,v|tf«nן*k NW# ӑ# t篒{:yK ߞ.YEC[d[qJgMr~PErބ@SF#Q@;s]Vz5d ȁ*AA:GFqijݝpH x-X 潂y9::w,zN6)yqԶ߳OPm & :## Mi$(-HD76fZ)IjU"W/_c$SSSڵ/͟dҙ7c"`Iz( r,_]\,nm nPcnZFM6X_ ;tl%:w@쒮ռ 1g\s@߹O@(3q" )ତZ9$6-p2/liyyyX,Δ!YiڮΠ3`+zU> "*kr o憨u1?Gwf%a[.njǬ:LC;㻋0=AjA߻PB: X/N1=ݔ衇?#tw c sy>LBRX3 <7cJAUS$ ,cߺ<³GRpuڲe <~) )X UYsuL?.$Jд8u z'y5ԅ4XJ10 a"BL,"kJYcp])GlW31\Ip- :_!O\ [ [BQB a*(kI/is,M+Ԉ)}HT b`p \B4L@($"p+D\IDU8_kW &w|j1xi8*;_>mw3 )2nLY9By P(p#M $E*B$;< 1iGzZ$h pLZ7M[:7S5Ԍ 1vm1^U ҍЕBKqō9:uֲ$U1w@?jT9؅LIZB\}M\ %ѵ",baSpI&4;w^! g6Iu@%-IܵMA4;tVH "7- &L_еDV0RL-?%Vh].I3p1?"Y@Kr0M}% `4gRWjz<CL[Vb(;p5}al}zI|q5jw8&b faO pIHhJNpb`w9;5#((X'QwJ_.Pmz"n@piM鸔=118Oסٺ'su I B \:GVq9)-Fcth@[E;qJю]\t(ہWD LJN_29@ӠO"y YY R4͛,9yObǷNLljק->X I(88oNxh4 m$iG§Zۅ55WJc2m)\Tz,u!_Q_裏>iD:33]w[;Fg2ُߥVH;4/R\Tn!L-gxo*J)ϵH7d]=OYae4X!b{橯}tĆY y1¾^;dϭ:AnϭiK]4ݚeĒ4f@W⳴z Ly`˥RLP8SVA";}:ND TBkmw '(ߧ=9W0G&v %&YPl6<-//'f bf 0/!!T<Ȓڴ  %]6Cp_=t}}Ww(&K啙#G+^YQNi} ӧO3h,J1`/b ^ݽ~|>13?Vm ql+ JHFc?y/lǻ*Go9yɅHb߆zp D:iÈMs PV\.;&SGnDZ6*gϜoc9?r}OBĭ@i/L4K52>><^i C_RB!-ӕMѭvVбcNL}/>Fup#,%qZZzle却ߟEP"3H;v=@yŒxSD1=9S'rxg#k3+ė/=G]iƘش`A\/" ) ~}@Vnv7!^$D㋝ w솼t%wJKf.t= M˃!秒sL[;8t+=*-@6/nXRt :R2+2_/.|ni5i-N1"rXA1; 9-FW4v=-:N~{d}LA٨ 09\Ⱥ ?VǿYA+zo IENDB`nagios-4.3.4/contrib/exfoliation/images/logos/yellowdog.gd2000066400000000000000000000044551314764422400237750ustar00rootroot00000000000000gd2'( 3f3333f333ff3fffff3f3f̙3f3333f3333333333f3333333f3f33ff3f3f3f3333f3333333f3̙333333f333ff3ffffff3f33f3ff3f3f3ffff3fffffffffff3fffffff3fff̙ffff3fffff3f̙3333f33̙3ff3ffff̙f3f̙3f̙̙3f̙3f3333f333ff3fffff̙̙3̙f̙̙̙3f̙3f3f3333f333ff3fffff3f3f̙3fHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH$$$$$$HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHx~~~NHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH~TNxNO$xyHHHHHHHHHHHHHHHHHHHHHHHHHHHHHN$T$HHHHHTHHHHHHHHHHHHHHHHHHHHHHHHHHHNNHNTHHNNHHHHHHHHHHHHHHHHHHHHHHHHHHH$x~NHH$~$HNNHHHxHHHHHHHHHHHHHHHHHHHHHHNxHHHHHxTHUHHHHN~HHHHHHHHHHHHHHHHHHHHN$HHHHHH$$xHHHHHNNHHHHHHHHHHHHHHHHHHHOHHHHHHHTHHHHHHT$HHHHHHHHHHHHHHHHHHx~NNNUHH*NHHHHHHHHxHHHHHHHHHHHHHHHHHHHNx~xOHHHxNHHHHHHHHHxHHHHHHHHHHHHHHHHHHHHHHHHHHO$HHHHHHHHNNHHHHHHHHHHHHHHHHHHHHHHHHHyHHHHHHHHHH~HHHHHHHHHHHHHHHHHHHHHHHHHTHHHHHHHHHHN$HHHHHHHHHHHHHHHHHHHHHHHN$HHHHHHHHHHN%HHHHHHHHHHHHHHHHHHHHHHHxHHHHHHHHHHH%NHHHHHHHHHHHHHHHHHHHHHHNHHHHHHHHHHHH$NHHHHHHHHHHHHHHHHHHHHHHNHHHHHHHHHHHH$%HHHHHHHHHHHHHHHHHHHHH~xHHHHHHHHHHHHH$$$~HHHHHHHHHHHHHHHHHHN$HHHHHHHHHHHHH$~$H~xHHHHHHHHHHHHHHHHHNHHHHHHHHHHHHHHN~HHxxHHHHHHHHHHHHHHHHT~HHHHHHHHHHHHHHHNNHH~xHHHHHHHHHHHHHHH+*HHHHHHHHHHHHHHHTHH$NHHHHHHHHHHHHHH$~HHHHHHHHHHHHHHHHTHH$$HHHHHHHHHHHHHHNTHHHHHHHHHHHHHHHHOHHTxHHHHHHHHHHHHHHHTNHHHHHHHHHHHHHHHOHH$$HHHHHHHHHHHHHHHU%HHHHHHHHHHHHHHHHHHTxHHHHHHHHHHHHHHHHTNHHHHHHHHHHHHHHHHH$HHHHHHHHHHHHHHHHHHTHHHHHHHHHHHHHHHHHxNHHHHHHHHHHHHHHHHHHNHHHHHHHHHHHHHHHHNyHHHHHHHHHHHHHHHHHHHHN~HHHHHNHHHHHHHHH~$HHHHHHHHHHHHHHHHHHHHHHTNHH$~HHHHHHHHONHHHHHHHHHHHHHHHHHHHHHHHHHHH%HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH$xHHHHHHHHHH$$HTT~~xN$HHHHHHHHHHHHHHHHHT$HHH$$$N~~UxN%%N~xHHHHHHHHHHHHHHHHHH̢~~~xNH$HHHHHHHT$HHHHHHHHHHHHHHHHHHO~~~~N$HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHnagios-4.3.4/contrib/exfoliation/images/logos/yellowdog.gif000066400000000000000000000024641314764422400240640ustar00rootroot00000000000000GIF89a'(99!99)BBBB!BBBBB!BB!JJJJJJJJJJ!J!!RRRRRRRRRRR!R!R)ZZZZZ!Z!Z!Z)Z)Z)Z1Z1Z9Z9!Z9)ZBcc!c)c1c1c1!c9c9cBcBcBcJcJ)cRcR!k)k9kBkJkJ!kZkZss)s9sJsJsRsRsRsZsZscscsc)sk{Z{Z{c{c{c{k{k{k!{s1RZcckk!sss){{{{1cs{{{ss{!s{!!!!ƵƵƵƽƽƽεννֵ,'(oH #FpM8: H_~I26`ż}t$pIm$FN: L=xH#sIh7eKhGp2IQSRGGG o.yCllAY\1цMRM(R^Al| pLy 64H~t D GHxpnh`'A ^BP, $vA&pa}n0T)b<6.h% Bx_[JܡPL'qh5lD;nagios-4.3.4/contrib/exfoliation/images/logos/yellowdog.jpg000066400000000000000000000026701314764422400240760ustar00rootroot00000000000000JFIFC     C   ('" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?3A[O2IO30H ,h8H+ -NS}5ku,߽!̊ʣB|qWƩ躮qk:.$SlO sFрA 1t?/$[j:@:-<Ҵ.A>dBbq)V)ռ+ֳw>kDo[^1UNֳ~w>ԴI YĿgm1hTrO$ȭ/ šž-9%@Ȍ nFRTEoRkz} Zzaj]wxǖʊOZXіh7OϪ9S?NQEuO@;uE?! ^%ּe!yD?5'Nc\*"Շ?R^ou7wd;;n!ܯ!3%Rb]mw7]B[%W1ҥ_t)$7)#h:2]"24"CSm#ڶѪki\m?lca9pz,PN*P97M57((k QEw8x#/k@5(k/Vg!$ʲ`ZpGB5b5"t8o zῄWs_54>\ʚMχ6^`X\㠮fSSyZ\7IHÜnNR⥄5:i~1Qo̰r;~I3[TtB3o~a< wA< sE莘AAYnagios-4.3.4/contrib/exfoliation/images/logos/yellowdog.png000066400000000000000000000023511314764422400240760ustar00rootroot00000000000000PNG  IHDR'(tgAMA atRNS7X}IDATxŗ_hUV3-;v3]b", 6"XMJ[kԤX4O% -Pu[)n!J0SZpbpf桠ib>=oι xe . ]Z(~ T@ʐ=U:?2PR%Oك5"ݡw6O}l f̱w?O^7U"@};󘛥nWa91i0xRr. 譢I<:@bg>fb&!I&G[t3!R.}TJE6O%wL%ճc , q5EdU o 7GnCDͽ SX3&uU.9uVزt/`lioZ˺o:+p&| 3+י*駕<Ů}ͳovɝkh*ކb}@"g+nZkê$8TfȿtSV]Q#ȏ^m#F&\nvGr)j:*-j8Sc$;ɽ74dLbc7ZH]lX`F:ijqfJH \OX/Vmc1W*]!pb@J)_3p0Vc 'ӪAιޒJ O˯55LQѲ Cjlٷ0[+yhYBg "y B\fDf~;޹Jh=p|.D_O Z޽ nGdተjvh'[dػame2roASG9|lj3JQ,1Zc -<80;vkȿN,tSh'X/ j axXŲe{IZ . d "LZ4[37ƣK^͏rVo⵺lCIU)ykJ4laA 8.;\^@!dkb9aەr[/ڽӯ}=hߪ!hPJP$ X졫Dl`P@W*!=C5į8^뙺%HֻgIENDB`nagios-4.3.4/contrib/exfoliation/images/logrotate.png000066400000000000000000000006621314764422400227510ustar00rootroot00000000000000PNG  IHDRRsRGB pHYs  ~0PLTEyyy2JJJ+|tRNSރYptEXtCommentCreation Time:Mon 31 Dec 2001 11:56:53 -0600 tIME chunklen 7 ignored: ASCII: ...... HEX: 07D10C1F120002't?!tEXtSoftwareGraphicConverter (Intel)w^IDATxb(40Hg( #X)a5^J 72+4PyS9Q Y $8qېrIENDB`nagios-4.3.4/contrib/exfoliation/images/ndisabled.gif000066400000000000000000000004121314764422400226500ustar00rootroot00000000000000GIF89a1yyy2!!kCreation Time:Mon 31 Dec 2001 11:56:53 -0600 tIME chunklen 7 ignored: ASCII: ...... HEX: 07D10C1F120002!,HI 8k}t %x^iС:QRG <,{㴇yP)c,hJ;nagios-4.3.4/contrib/exfoliation/images/noack.gif000066400000000000000000000001321314764422400220150ustar00rootroot00000000000000GIF89a1!!,+MM`7Mt$ISڜi s b;nagios-4.3.4/contrib/exfoliation/images/notes.gif000066400000000000000000000015751314764422400220660ustar00rootroot00000000000000GIF89a1!!!!!!)))!)))11)11)1111991JZ99!)911999BBBBBJRBZcJJJ11J9!J91JJJJRZR11RRRRRcRk{R{ZZZ!!ZB9ZZZZccZ{ccc!!c))cJJcR1cRBcZZccccssk99kJ1kRRkcRkkkkkskkkkks))ssss{{Ƅ99{kƌccƌ֔))!!))ZZc֥!!ZZccRRss!!!!1199!!99έεν11֥Ƶkk޽!!cc甔kkﭭﵵ!!))!!99BBJJRRkkss{{q!,Z] HX@BHDtDf1G C<9RȖ%"̘gf9P'Ε7)bP2S*ȴ)€;nagios-4.3.4/contrib/exfoliation/images/notify.gif000066400000000000000000000004101314764422400222310ustar00rootroot00000000000000GIF89a1yyy2!kCreation Time:Mon 31 Dec 2001 11:56:53 -0600 tIME chunklen 7 ignored: ASCII: ...... HEX: 07D10C1F120002!,FI 8k}ta1Hz~|[Ƴ싋ګ+""1$qqoojjiihhccPPsGGfEEcCC`00E!jjaaNNo!!/ ְڂxό͂xdPP||{{mmLL<<'  !, VH6@`.H &N BÁ6^ظх P܈+I89" %f|E"ıѣH* ;nagios-4.3.4/contrib/exfoliation/images/passiveonly.gif000066400000000000000000000015621314764422400233060ustar00rootroot00000000000000GIF89a1!!!RRRkkk!!))11BBJJRRZZcckkss{{焄猌甔眜便ﭭﵵス2h,!&,OMH*\(P|HD xq7Z\( %hRH!iB&͚#isbN){ 0 ;nagios-4.3.4/contrib/exfoliation/images/recovery.png000066400000000000000000000005661314764422400226120ustar00rootroot00000000000000PNG  IHDRRsRGB pHYs  ~0PLTE0JJJ(6@NytRNSރYptEXtCommentCreation Time:Mon 31 Dec 2001 11:56:53 -0600 tIME chunklen 7 ignored: ASCII: ...... HEX: 07D10C1F120002't?!tEXtSoftwareGraphicConverter (Intel)w"IDATxb(bc00g(0`œ'+ IZxIENDB`nagios-4.3.4/contrib/exfoliation/images/redundancy.png000066400000000000000000000126171314764422400231100ustar00rootroot00000000000000PNG  IHDRvBtIME  0C. pHYsttk$PLTEBJZc!))))))11)11191)11191B91999199JJJJRJk91k99ss1)s11s91s99s9BsB9sss{sksss{{{19{9B{B9{s{{{s{{s!)!!"IDATx]۶S[@h?Է`IKb [wg s,#oI'Ϧz|I R)f""7OB2$_E2d.*H$=`jp'Vd k剀qO 4O*#<XAy)^d5q1q+d!YxrC>NklSLtŶu-<✱kC#YՍEI&ϓ4Lv8xD9^d<<%mCi44 [ ۖnٶuۀȶd@-E6 m)-mKQ nl[m@v dRm[ ۖnٶuۀȶdpFUaa%<%6\ y{֣6.-E6 m)"یdU|x]{{Zy.aDU<0$ExhGOgc.<$Kn3u$"[$tWpI:<9/.}'zy.*@L-z 6FRݢ=ݢ=%7&$=L-<5#|mcP~m&-ܞ:Dݫ80Jױ(%R^ 5EO}>nZB)aϴAJ Or\K䍦O H5<`56#Yl36#Yl36#Yl36#Yl}?xHi:zozxnl[-ŖzBo8.ȶ2Nv^kK?}r d8(I-q 2Uwp-mMQ{}M- ~tH`uh/V3r d#5wS'?Dx(c'3%L49{B{'V3r dD(/l8aM ~I$޺mBmԪiNNH#6c[ &$S9 ۪ Lեm3Rvj97?ǧחu dۄ$#GQ8 Fk~6҈t󈖲ɥSS>QMJP-m^=vX֌lrNۦb#1DByk.KR^ɴzgwzgwzgwzg \='s4[9Js-u'%bӋRh*ya?܄&>[jRbޜOxKV7O\2RFM<\_f" G֫9S2c<ɦM"F6lSɥ qN~0y>䜕S]q|a:26QT˅u%:7~x?\q|qH):l"S UKr$|riP,8>%-0S̴eg!.#k SO̷JZ3#Yl^<=Z|bYO/-sX/;/w=ڳ+N 9B>x?xbJ[4֞Q&~df$<d=>0R|Bqۙ[/.֫')s>%ᇯ[f$$zyBg[dB}龞ONl8J~Yi Q!4([XAkvIv0Dlcs Ff F6f$"6J }<6dHE6 l4#\624aM7eS.YJF2lɢ',FOȰ Z6gڣrڳjdr0cɂJ3 e.)ɘ8&R[+ZtŘ'\a$KNڲ+H&Mqԏ]qu#Y <^4~[ȓW) 46;\^%ogs@ 5%0lSg#;d opf Y'l1f\Ӫsof,}xvvvQ{qTQ #;%|Ԣ5ծ6d( QLO^YTV$ AOՋoųb6ۼw}]^_tjgA[,5n ϟɸ vxY/?z>l#rP_u|. ~ ߲ b0`XD]53^xNN @8p"OyI#:<};3loYODwZVHޚH֠Φ%eQbz`q0A n;%|Ԣbf'څj?&32 df(}uk(Y{觨=o8T250̠RcJV6[e+i~rrWTތG<+Թ8YQRGoxU[U<04v+1LI+sqfܕg=^5l[ůC:H :nNv$mDnBo˪yty4m١+ Gҡ|v Gbɣ{~Y~Y 2:z#Y`$dw0FH;z֧MS>IENDB`nagios-4.3.4/contrib/exfoliation/images/restart.gif000066400000000000000000000004041314764422400224100ustar00rootroot00000000000000GIF89a1JJJxv(6.@NW!kCreation Time:Mon 31 Dec 2001 11:56:53 -0600 tIME chunklen 7 ignored: ASCII: ...... HEX: 07D10C1F120002!,BI 8k}tBi0wĠvk2N= n`#;K`Nvx10%;nagios-4.3.4/contrib/exfoliation/images/right.gif000066400000000000000000000003151314764422400220420ustar00rootroot00000000000000GIF89a$ 1222!,$ z0I8ͻ`(ad'hk^+ϴQg( P}r,8y2IZFʭBUۮǿ(-|Vڶ; {`V+Xp8S}Hx0~&;nagios-4.3.4/contrib/exfoliation/images/sblogo.png000066400000000000000000000062371314764422400222420ustar00rootroot00000000000000PNG  IHDR'Ry7D,tEXtCreation TimeThu 15 Jan 2009 14:24:06 -0600%tIME0+H pHYs B4gAMA a IDATxwLTłFŊb`n,70V{-QDBT9ww3hC]Z֞b6M{K g/ YKI6 ǓN:m۶aÆt|ӦM.]ʕ+)R۱/6mJ:u)5j4gg/ʞ-תUXD?{lCs,/۷o bcciݻI2e}SJ%2xׯ=~_~|(H),b͛#GIW&ڑ t٫"111IfJvǓ-Zdҍ_v7AJo̘1IϏ="ȑd2a\ ~p9Xb*U"&58ܯϟc|˷CO*_|Yd%J/"##=<\7dȐaV7aζF)UӦMujqƍVYGeXӺرEg'zꥇDnܸHM)={Vj*UaŊZ4ibI$ũ^ B 9bfIN<)-%8#(9X\ ԝ-$MZ0n"5K&ÇٳgwdMʕ[BШo.]*N.8ڕ+WB gj Q 8)]^- Vg$aaape˖]tB3D .rk߿?2fux֭[gx%#;a')2]ӧytϟ/jJT2AIFRXp5-fHL8[l19,cǎu|n ?Ȗ-8LNhԩhӧOtl &L2jڵk+Ǵ޺uK{K^Q N:qxW<% Om&LA#9؀=z@ՈTiРA@JpfbSjQ6Pj_@-ԯ__j(^"k׮:lV"zRlYiEB#ǫ´Mr7C&݃$H>d~[|/j~nu`S j(Ⱥ8҅F Ytg,_~yomKҍC6mP[@[VYH߲eK[J4m`KǎcL*ArRZkIQ _Q g p%j߄tK+ VX1P1((n6+6|;w}1zI uIDDrʕ+t!&Qjavi#C J"5.)y+SG`Ӳ \-`8d:_^=lG$:::"=ŸXDsl 5;!BlpĈEV`7oH d2%Rwv_Ac~} @%##@4(  @0@d̍.n|p.L@BHHoBDZ@ &1H@H*'б:ȀkR T4X1ݐw`@;nagios-4.3.4/contrib/exfoliation/images/splunk2.gif000066400000000000000000000016501314764422400223260ustar00rootroot00000000000000GIF89a! !!!)))999BBBJJJRRRkkk{{{,! H*\B BL8   A^` " pB R .nD& `@țG^ ;n4p`Ȓ@B`4 W.,Њ@$F["ݻx%;nagios-4.3.4/contrib/exfoliation/images/start.gif000066400000000000000000000003671314764422400220710ustar00rootroot00000000000000GIF89a10JJJ(6@NW!kCreation Time:Mon 31 Dec 2001 11:56:53 -0600 tIME chunklen 7 ignored: ASCII: ...... HEX: 07D10C1F120002!,5I8k}7ta9Ciw o,.{9;Ucqzm;nagios-4.3.4/contrib/exfoliation/images/status.gif000066400000000000000000000002301314764422400222440ustar00rootroot00000000000000GIF89a1ddd!,EIA(8EɆqExԭ JD@hШtIZRxLD;nagios-4.3.4/contrib/exfoliation/images/status2.gif000066400000000000000000000002551314764422400223350ustar00rootroot00000000000000GIF89a1JJJddd !,ZIM4q$yDvt}smǠf19&u} }x$,7UㆥF ,2|.c:TpZcOׯY[ ._u'o_n[Ik+..35 CW5xx2b Sڸӭ+zRӕJ~ʤ Ţ✩џ$4Uk⾽K 0\ӫ8P}ZupXWTn.g67E'Ꮖ=L~_xKT6?|%xWGQǝk'/,gA/uO HŗmiW䯅 i"'/<~_O Ǿ1$?u\^eG<ZšF,lF7WXԴmK?_ؼV+ekwFW*NjrVNVkei%%x$٤?\n1x e?ckTX5YѯORO%zs9[Zo> ԟ_]'Vvx4?ែ~&|Hwğ|_7­CPsRGB0PLTExxx /htRNS A!tEXtSoftwareGraphicConverter (Intel)wMIDATxbP\LA-b* ) PIIQ`.H$6A$f*љH!Yd1s8g qIENDB`nagios-4.3.4/contrib/exfoliation/images/tacenabled.jpg000066400000000000000000000033261314764422400230270ustar00rootroot00000000000000JFIFHHCC! }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ??L&ߏOx x4?ex>,>x^,WxXMc7 wW5gTuMF{啻P9~ɟ&h~#񯈾aᝇ8X~9bkeox+ßn|o{>ön#|S!\gTygx(¦"t˅r~bC'JIN{8'stpv&M)TW-*+J IԂ{-?k?3ſCOO-S?? e˟\~/okc_ OH~#z$\h:n㯆Imvm?INͿ<+.2?gh>&+ "\=qƮ<6/-|?hBV?N2Gk3~߶$1|[w x]_-nz6eo%O|ju]gVѴ,51/cxRzG/|>wL> ~?x:'[ E.o|;뫏x"{뿍wڗmx^#;4K8~^1Fuaa(ทiSU뇫EGpY̸fy$#eITL\rrjSFx)9z7hڪ?u>w_Y eτ?_4mo~75 xoڇ4?h k~ U𞍭ZgKӗ6izV"[ DYEUVaquaQMbka15pzUZ0qʘzSF/:qsJ:ʜjJUFUgJ%(Rzҧa*\Ru& g 4/ঁOxV¾X |G}r\ӟNҡJ ,nagios-4.3.4/contrib/exfoliation/images/tacenabled.png000066400000000000000000000004131314764422400230250ustar00rootroot00000000000000PNG  IHDR>sRGB0PLTET7ȁtRNS A!tEXtSoftwareGraphicConverter (Intel)wMIDATx CQWh@&@MZ^~8VKM 0^2&sW1$B"׼"iu,>{RM2IENDB`nagios-4.3.4/contrib/exfoliation/images/thermcrit.png000066400000000000000000000010671314764422400227520ustar00rootroot00000000000000PNG  IHDRdU9,,tEXtCreation TimeSat 12 Jan 2002 13:36:14 -0600;tIME ) n pHYs  ~gAMA aIDATx!n0f ÐJ&ZPclz^#` aTH6 ӡ)YI8J<Ǐ˥2N^//y.4HZ^7aghVLwz8)CK4 ʪ̹\J&DhIQ;i 'j Rp`Ss:9B= `+L$stxA!cJf(Uh_S>Y+IXב,5ND 4/JOBdM=3fyZOԴƐ$uH) 7Ø RV$IB۶7cͦ{SJ`m ٭(: Xu:/nIENDB`nagios-4.3.4/contrib/exfoliation/images/thermok.png000066400000000000000000000014101314764422400224120ustar00rootroot00000000000000PNG  IHDRdU9,,tEXtCreation TimeSat 12 Jan 2002 13:34:16 -0600tIME $1 pHYs  ~gAMA a_IDATxOo06HK] v `.cWƇ'ĉ+Hp`' DvqgNᲭaMl6Eɳl=??z6T*ok4`rr&0ӧFx$eЮ7̙)]򈡈Վ7؝eJ圥Z^Jfe9 O3a򈡈 |njMn,h,G>Jxs:7Mm<jDoG^s ;zFo $/Z%w*Yܬ}\y|oH =؛{Dh}fl" `@a̲zE$CpcP,.ܙgɉQP2N@>r* / 0!D7D#5>,gM2IH԰&(ϚyxPBcwxbRƊf|*gM6>7I^bܶ+Gj# 2Zbݷ`KVAmt4${Φ/%GEvǼzHk䍒$o.=PY[*zѿF!NPE ~{EIENDB`nagios-4.3.4/contrib/exfoliation/images/thermwarn.png000066400000000000000000000012441314764422400227550ustar00rootroot00000000000000PNG  IHDRdU9,,tEXtCreation TimeSat 12 Jan 2002 13:36:21 -0600OtIME &6 pHYs  ~gAMA aIDATxAk0%W3LNOm 6OQhOݗ''; c0CI)q6K4do;i~㽧'˴|q::W!WT*P"VP?2<ן`j4vͭM/S0-x<}Κ/Z]Ǧf)i::<ଡ଼I|qf6MK(lAԷ#LKzqttkL@$X )e&c5Q,>]i=V\@T"AM뱚 PF|,,vX Yi :D*@",@iZݤڸ4,2ADD"k T/">ExRΩ;垢ĥɛR Y!j۠".//sIlllc5I"%g׺_5MJܽHr1L=Ze7ׯ8JjHiG$ _0޿Еۉc뒝ϴh_IB=kOЖ8VIENDB`nagios-4.3.4/contrib/exfoliation/images/trends.gif000066400000000000000000000016451314764422400222330ustar00rootroot00000000000000GIF89a1}C7Ļ!,H @Ç +hŊ)^F `8@ɓ&\9Gbl9%L1i 3g?M =`@Ѣ (Uʳgҥ|TzL_D6XҪ]vm·p;nagios-4.3.4/contrib/exfoliation/images/trendshost.png000066400000000000000000000044221314764422400231440ustar00rootroot00000000000000PNG  IHDR,sRGB pHYs B4otEXtCommentCreation Time:Wed 3 May 2000 15:07:26 -0600 tIME chunklen 7 ignored: ASCII: ....,. HEX: 07D2061E052C2EY-5!tEXtSoftwareGraphicConverter (Intel)wIDATx10n 8eFȘQ2f cFȘQ2f cFȘQ2f cFȘQ2f cFȘQ2f sֱ a)dQ62 FF(`#ldQ62 FF(`#ldQ62 FF( @ ð;-! Kc3(gQ1F8cp1 c3h`hO<ўHly=ئ2F{"M!dD `C61)m:!c'RtBhO<ўHly=ئ2F3~C 0;zBHui63)m:!g'RtBhO<ўHly9=ئrF{"M!D `C63)m:!g'RtBhO<ўHly9=ئrF{"M!D `C63)m:!g'RtBhyBhO<ўHly 0;zBHu63)m:!g'RtBhO<ўHly9=ئrF{"M!D `C63)m:!g'RtBhO<ўHly9=ئrF{"M!D `C63~^o"3&m:!g'RtBhO<ўHly 1H%F+6g'RtBhO<ўHly9=ئrF{"M!D `C63)m:!g'RtBhO<ўHly9=ئrF{"M!D `C63)m:!g'RtBh>3 g3(g^ֱ a)dQ62 FF(`#ldQ62 FF(`#ldQ62 FF(ֱ a)dQ62 FF(`#ldQ62 FF(`#ldQ62 FF(ֱ a)dQ62 FF(`#ldQ62 FF(`#ldQ62 FF(ֱ a)dQ62 FF(`#ldQ62 FF(`#ldQ62 FF(ֱ a)dQ62 FF(`#ldQ62 FF(`#ldQ62 FF(ֱ a)dQ62 FF(`#ldQ62 FF(`#ldQ62 FF(ֱ a)dQ62 FF(`#ldQ62 FF(`#ldQ62 FF(ֱ a)dQ62 FF(`#ldQ62 FF(4" 1dnIENDB`nagios-4.3.4/contrib/exfoliation/images/trendssvc.png000066400000000000000000000047501314764422400227660ustar00rootroot00000000000000PNG  IHDR@k%sRGB pHYs B4otEXtCommentCreation Time:Wed 3 May 2000 15:22:45 -0600 tIME chunklen 7 ignored: ASCII: ....-( HEX: 07D2061E052D28:uO!tEXtSoftwareGraphicConverter (Intel)wIDATx10n 8eFȘQ2f cFȘQ2f cFȘQ2f cFȘQ2f cFȘQ2f sֱ a)dQ62 FF(`#ldQ62 FF(`#ldQ62 FF( @ ð;-! Kc3(gQ1F8cp1 c3h`)hL<јHlyh1ئ2Fc"MeD `C61)m:-c4&RtZhL<јHlyh1ئ2F~C 0;zBHui63)m:-g4&RtZhL<јHlyh91ئrFc"MD `C63)m:-g4&RtZhL<јHlyh91ئrFc"MD `C63)m:-g4&RtZhyZhL<јHlyh 0;zBHu63)m:-g4&RtZhL<јHlyh91ئrFc"MD `C63)m:-g4&RtZhL<јHlyh91ئrFc"MD `C63~^o"3&m:-g4&RtZhL<јHlyh 0;zBHu63)m:-g4&RtZhL<јHlyh91ئrFc"MD `C63)m:-g4&RtZhL<јHlyh91ئrFc"M6[Hƴ `C63)m:-g4&RtZhL<јHlyh @0$" :1ئrFc"MD `C63)m:-g4&RtZhL<јHlyh91ئrFc"MD `C63)m:-g4&RtZhL<\,pF8p3 g3(gֱ a)dQ62 FF(`#ldQ62 FF(`#ldQ62 FF(ֱ a)dQ62 FF(`#ldQ62 FF(`#ldQ62 FF(ֱ a)dQ62 FF(`#ldQ62 FF(`#ldQ62 FF(ֱ a)dQ62 FF(`#ldQ62 FF(`#ldQ62 FF(ֱ a)dQ62 FF(`#ldQ62 FF(`#ldQ62 FF(ֱ a)dQ62 FF(`#ldQ62 FF(`#ldQ62 FF(ֱ a)dQ62 FF(`#ldQ62 FF(`#ldQ62 FF(ֱ a)dQ62 FF(`#ldQ62 &b"tsIENDB`nagios-4.3.4/contrib/exfoliation/images/unknown.png000066400000000000000000000006261314764422400224500ustar00rootroot00000000000000PNG  IHDRRsRGB pHYs  ~0PLTE}KJJJA9\x=6tRNSރYptEXtCommentCreation Time:Mon 31 Dec 2001 11:56:53 -0600 tIME chunklen 7 ignored: ASCII: ...... HEX: 07D10C1F120002't?!tEXtSoftwareGraphicConverter (Intel)wBIDATxb(bc00g(v0/΀JAue\ṔK,9/0{E?IENDB`nagios-4.3.4/contrib/exfoliation/images/up.gif000066400000000000000000000015271314764422400213570ustar00rootroot00000000000000GIF89a 1YYYddd!, 4H`B >Q3k8cƎ -~t8R"Ȑ S\2 ;nagios-4.3.4/contrib/exfoliation/images/warning.png000066400000000000000000000006121314764422400224110ustar00rootroot00000000000000PNG  IHDRRsRGB pHYs  ~0PLTEĻ5JJJ2.PtRNSރYptEXtCommentCreation Time:Mon 31 Dec 2001 11:56:53 -0600 tIME chunklen 7 ignored: ASCII: ...... HEX: 07D10C1F120002't?!tEXtSoftwareGraphicConverter (Intel)w6IDATxb(bc00g(0#+ъƀY s-JQIENDB`nagios-4.3.4/contrib/exfoliation/images/weblogo1.png000066400000000000000000000045411314764422400224700ustar00rootroot00000000000000PNG  IHDRf/(,tEXtCreation TimeFri 31 Jul 2009 11:04:22 -0600_tIME o pHYs B4gAMA aIDATxwhUI5Q,(^cWbh+v*{A+vFQ#(ذqy7oy~̜{̙3#~$KHH0yHXM Cf}/}#+ GV~Zհ;HWoNLJݾn;c][;dN*4B O8 dt_nDYѥ;U1;V޼4gW93ibZ?Ï@*3g铯3-[9s׺yZ߾}2eqƱ111ׯϟ?J[;MB!/_f̘Yn0DGGz#""|m-;uTʕu۷ SR\rEEE>}) .ܶm۬Y2dȠjro|QJ>|gΜR1mڴ)i]@ի۷c.X@>`ʑ#u1v\bEfLm+\F:u`J|Rpch(رcڵf7D6lAAcUV!!!^ڳgUnH&sbŘ^xٳgvFA.]XR۷{1ׯ?~֭Eښ^zn!!B{xU#T_^jǏݭ'OW)!ٓN-^Xʕ?qDϜ9P;Bϗ/_`*V 6LUd(K,4hw5Y jΝ;ݚ,o޼޽&w޽l2E 7n߳n޼)m:tH ڴi#̽zcrM6;wNZi^~}vٿPFYJ.[ni([/]$X2zݻb&_hЏ9ݻrիWSvJT ǏzBoѢ"OXtRtl&ÇqAVbZlѶm[c>KݴiS=W'uq)XNصk+{c=o\֞͒%SO 22|DǎKC ,#۷o/7I z$k֭KjSt1m4lvH׮]f%@_sW@3f䥋-Tf߾}޻wo9s(bF.9k֬)ϟ:l,}e[eW^_GP@D=z|zŘ1cHa$8{ׯ_wd/J5E?<<mߏ;L)/L.િd1[ ^LBNO]fYK?A4iܼysOJ#uO.9{ԨQƓtԉFTRL>}ǎ򉻢 .*΅ HvJ,I JQ4('w8xxr-b^pp0 '&BBB :1)I{7m$l CDUbEAG1N57zҽtAMcbbʔ)kI%((x)L2N:..xz%J Љ'P+%**#%G "F+19#0:uc=Ƃ-wE2@u)>;iNsoVq~*/s.!]b=$ln2}Zͭ@;jY 1$nuD2.~&VX9IENDB`nagios-4.3.4/contrib/exfoliation/images/zoom1.gif000066400000000000000000000015711314764422400217770ustar00rootroot00000000000000GIF89a 1  @@]11Goojjee\\XXDDb++>""1$qqoojjiihhccPPsGGfEEcCC`00E!jjaaNNo!!/ |{mL<'  !, VH6@`.H &N BÁ6^ظх P܈+I89" %f|E"ıѣH* ;nagios-4.3.4/contrib/exfoliation/images/zoom2.gif000066400000000000000000000015711314764422400220000ustar00rootroot00000000000000GIF89a 1  @@]11Goojjee\\XXDDb++>""1$qqoojjiihhccPPsGGfEEcCC`00E!jjaaNNo!!/ ְڂxό͂xdPP||{{mmLL<<'  !, VH6@`.H &N BÁ6^ظх P܈+I89" %f|E"ıѣH* ;nagios-4.3.4/contrib/exfoliation/readme.txt000066400000000000000000000067221314764422400207770ustar00rootroot00000000000000exfoliation - a skin for nagios Copyright (c) 2009-2010 Matthew Wall, all rights reserved Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. To use this skin, replace the stock 'images' and 'stylesheets' folders with those from this tarball. For example: cd /opt/nagios/share tar xvfz exfoliation.tgz On debian/ubuntu installations you might have to modify side.html to include the common.css stylesheet by adding a line like this in the head section: This skin has been tested with Nagios 3.2.0, 3.2.1, 3.2.2, 3.2.3 Revision History: 0.7 25dec10 - minor cleanup to statusmap mouseover matrix (nagios bugs still remain) - added instructions for installations with side.html rather than side.php - added .NavBarTitle, .NavBarItem, and .NavBarSearchItem for side.html in ubuntu/debian installations (thanks to michael berman) - passiveonly is now simply a question mark - fix jpg versions of tacenabled and tacdisabled - punt the globe - added crude service and event handler icons 0.6 16oct10 - change enabled/disabled images to x-mark and check-mark - new trends icon closer to what trends actually does - reduce size of left and right arrow icons 0.5 12feb10 - changed unreachable from red to orange (to parallel unknown) - right-justify filter names - eliminate more redundant css - use blue to indicate 'problem' (nod to vautour) - use purple to indicate indeterminate state - make font sizing more consistent in host/service tables - make font sizing more consistent in data/log/queue tables - another round of cleanup on the icons - include nagios base images (in the images/logos directory) 0.4 29jan10 - lighten the 'dark' color in even/odd listings - fix even/odd background colors across pages - put border on cells that i missed (notifications, status) note: the cgi emits class tags where it should not, so in a few places we end up with borders where there should be none. - include the basic image set in images/logos - tone down heading text color in data tables - underline data table headings instead of background color - more cleanup of tactical layout and stylesheet - fixed queue enabled/disabled border in extinfo listings 0.3 30dec09 - consolidate colors - refactor style sheets for easier editing - eliminate (some) redundant stylesheet entries 0.2 27dec09 - added images for log activity - added images for enabled/disabled - replace images on tactical page 0.1 27dec09 - initial rework of color scheme - eliminate extraneous borders TODO: - fixes that require changes to CGI/PHP/HTML: for extinfo - nested tables with 'command' class for controls (state versus action) for host summary - nested td with class for host listing - statusPENDING should be statusHOSTPENDING for service summary - nested td with class to eliminate 'view status' and 'view ... status' redundancy 'host status totals' -> 'host totals' 'service status totals' -> 'service totals' 'current network status' -> 'status' histogram.cgi contains 'calss' instead of 'class' inconsistent table definitions - some use padding/spacing remove hard-coded tags remove hard-coded center tags - tone down the neon green/red in the trend graphs nagios-4.3.4/contrib/exfoliation/stylesheets/000077500000000000000000000000001314764422400213465ustar00rootroot00000000000000nagios-4.3.4/contrib/exfoliation/stylesheets/avail.css000066400000000000000000000035711314764422400231620ustar00rootroot00000000000000/* exfoliation: a nagios makeover */ /* Copyright 2010 Matthew Wall, all rights reserved */ /* */ /* Permission to use, copy, modify, and distribute this software for any */ /* purpose with or without fee is hereby granted, provided that the above */ /* copyright notice and this permission notice appear in all copies. */ .avail { } .data { font-size: 9pt; } .hostUP { background-color: #cce8cc; padding: 0 4 0 4; } .hostDOWN { background-color: #ffdddd; padding: 0 4 0 4; } .hostUNREACHABLE { background-color: #ffddaa; padding: 0 4 0 4; } .serviceOK { background-color: #cce8cc; padding: 0 4 0 4; } .serviceWARNING { background-color: #feffc1; padding: 0 4 0 4; } .serviceUNKNOWN { background-color: #ffddaa; padding: 0 4 0 4; } .serviceCRITICAL { background-color: #ffdddd; padding: 0 4 0 4; } table.logEntries { font-size: 9pt; padding: 5 0 0 0; } th.logEntries { font-size: 9pt; text-align: left; padding: 0 3px 0 3px; border-bottom: 1px solid #777777; color: #333333; } .logEntriesOdd { background-color: #e7e7e7; padding: 0 4 0 4; } .logEntriesEven { background-color: #f4f2f2; padding: 0 4 0 4; } .logEntriesOK { background-color: #cce8cc; padding: 0 4 0 4; } .logEntriesUNKNOWN { background-color: #ffddaa; padding: 0 4 0 4; } .logEntriesWARNING { background-color: #feffc1; padding: 0 4 0 4; } .logEntriesCRITICAL { background-color: #ffdddd; padding: 0 4 0 4; } .logEntriesUP { background-color: #cce8cc; padding: 0 4 0 4; } .logEntriesDOWN { background-color: #ffdddd; padding: 0 4 0 4; } .logEntriesUNREACHABLE { background-color: #ffddaa; padding: 0 4 0 4; } .logEntriesINDETERMINATE { background-color: #ddccff; padding: 0 4 0 4; } .infoMessage { font-size: 9pt; } nagios-4.3.4/contrib/exfoliation/stylesheets/checksanity.css000066400000000000000000000023551314764422400243720ustar00rootroot00000000000000/* exfoliation: a nagios makeover */ /* Copyright 2010 Matthew Wall, all rights reserved */ /* */ /* Permission to use, copy, modify, and distribute this software for any */ /* purpose with or without fee is hereby granted, provided that the above */ /* copyright notice and this permission notice appear in all copies. */ .extinfo { } .Title { font-size: 12pt; text-align: center; font-weight: bold; } .SectionTitle { font-size: 12pt; text-align: center; font-weight: bold; } .DynamicData { font-size: 10pt; padding: 2; } .StaticData { font-size: 10pt; padding: 2; } .TableHeader { font-size: 10pt; background-color: #d0d0d0; font-weight: bold; } .Item { font-size: 10pt; background-color: #f4f2f2; font-weight: bold; } .DataSource { font-size: 10pt; background-color: #f4f2f2; } .Number { font-size: 10pt; background-color: #f4f2f2; } .Value { font-size: 10pt; background-color: #f4f2f2; font-weight: bold; } .ValueOk { font-size: 10pt; background-color: #88d066; font-weight: bold; } .ValueError { font-size: 10pt; background-color: #f88888; font-weight: bold; } nagios-4.3.4/contrib/exfoliation/stylesheets/cmd.css000066400000000000000000000016771314764422400226360ustar00rootroot00000000000000/* exfoliation: a nagios makeover */ /* Copyright 2010 Matthew Wall, all rights reserved */ /* */ /* Permission to use, copy, modify, and distribute this software for any */ /* purpose with or without fee is hereby granted, provided that the above */ /* copyright notice and this permission notice appear in all copies. */ .cmd { } .cmdType { font-size: 12pt; font-weight: bold; color: #aa0000; padding-bottom: 40; } .commandDescription { font-size: 8pt; background-color: #f4f2f2; border: 1px solid #d0d0d0; margin: 4 0 0 0; padding: 4 4 4 4; } .descriptionTitle { font-size: 10pt; font-weight: bold; } .infoMessage { font-size: 8pt; background-color: #efefaa; border: 1px solid #777777; margin: 40 20% 0 20%; padding: 5 5 5 5; } .optBox { font-size: 9pt; padding: 5 5 5 5; } nagios-4.3.4/contrib/exfoliation/stylesheets/common.css000066400000000000000000000236661314764422400233650ustar00rootroot00000000000000/* exfoliation: a nagios makeover */ /* version: 0.7 */ /* Copyright 2010 Matthew Wall, all rights reserved */ /* */ /* Permission to use, copy, modify, and distribute this software for any */ /* purpose with or without fee is hereby granted, provided that the above */ /* copyright notice and this permission notice appear in all copies. */ /* thanks to jacob.laack for nagiosneat */ /* thanks to nagios authors for a solid base */ /* these are reference colors for the color scheme: color dark light border OK: green 88d066 cce8cc 777777 WARNING: yellow ffff00 feffc1 777777 CRITICAL: red f88888 ffdddd 777777 PENDING: grey acacac fefefe 777777 UNKNOWN: orange ffbb55 ffddaa 777777 UNREACHABLE: orange ffbb55 ffddaa 777777 INDETERMINATE: purple ddccff 777777 PROBLEMS: blue aaccff 777777 ACK: aaaaaa CUSTOM: 778899 important: blue 99aacc 777777 not important: blue aaccff 777777 table header: d0d0d0 odd rows: e7e7e7 even rows: f4f2f2 titles: 12pt body: 10pt table headings: 9pt controls: 9pt data in tables: 8pt or 9pt */ body { margin: 0em; margin: 0.8em 0.8em 2em 0.8em; color: black; background-color: white; font-family: arial, verdana, serif; font-weight: normal; font-size: 10pt; } table { border: none; margin: 0; } th, td { border: none; padding: 0 2px 0 2px; } form { margin: 0; padding: 0; } a img { border: none; } a { text-decoration: none; color: #40529b; } a:hover { text-decoration: underline; color: #3f5bcd; } a:active { color: #496aef; } a:visited { color: #2c3763; } div.navbarlogo { margin: 0 0 10px 0; } div.navsection { margin: 5px 0 10px 0; } div.navsectiontitle { font-size: 9pt; font-weight: bold; padding: 2px; background-color: #efefef; border:1px solid #dddddd; } div.navsectionlinks { margin: 3px 0 0 0; } ul.navsectionlinks { margin: 0; padding: 0; list-style: none; } ul.navsectionlinks li { } ul.navsectionlinks li a { font-weight: bold; font-size: 9pt; text-decoration: none; padding: 0 0 0 15px; /* background: transparent url(../images/greendot.gif) no-repeat scroll 0 0; */ } ul.navsectionlinks li ul { margin: 0px; padding: 0 0 0 30px; list-style: none; } ul.navsectionlinks li ul li { } ul.navsectionlinks li a:hover { /* background: transparent url(../images/orangedot.gif) no-repeat scroll 0 0; */ color: #8391cd; } ul.navsectionlinks li ul li a { background: none; padding: 0; font-weight: normal; } ul.navsectionlinks li ul li a:hover { background: none; } ul.navsectionlinks li ul li ul { margin: 0px; padding: 0 0 0 15px; list-style: none; } div.navsectionheader { padding: 0; margin: 0; } div.navsectionheader ul { margin: 0; padding: 0; list-style: none; } div.navsectionheader ul li { font-size: 9pt; font-weight: bold; padding: 0 0 0 15px; } div.navsectionheader ul li ul li { font-weight: normal; } .navbarsearch { margin: 5px 0 0 0; } .navbarsearch fieldset { border: none; } .navbarsearch fieldset legend { font-size: 8pt; } .navbarsearch input { font-size: 9pt; } #splashpage { text-align: center; } #mainbrandsplash { font-size: 12pt; font-weight: bold; margin: 0 0 35px 0; } #maincopy { margin: 0 0 15px 0; } #currentversioninfo { font-size: 12pt; } #currentversioninfo .product { font-size: 14pt; font-weight: bold; } #currentversioninfo .version { font-size: 14pt; font-weight: bold; } #currentversioninfo .releasedate { font-size: 11pt; margin: 5px 0 0 0; } #currentversioninfo .checkforupdates { font-size: 11pt; font-weight: bold; } #currentversioninfo .whatsnew { font-size: 11pt; font-weight: bold; margin: 50px 0 0 0; } #updateversioninfo { margin: 15px auto 35px auto; width: 400px; } #updateversioninfo div.submessage { clear: left; } .updatechecksdisabled { background-color: #FF9F9F; border: 1px solid red; padding: 10px; } .updatechecksdisabled div.warningmessage { font-weight: bold; } .updateavailable { background-color: #9FD4FF; border: 1px solid blue; padding: 10px; } .updateavailable div.updatemessage { font-size: 12pt; font-weight: bold; } #splashpage #mainfooter { clear: both; font-size: 8pt; padding-top: 35px; margin: auto; width: 800px; } #splashpage #mainfooter .disclaimer { margin: auto; } #splashpage #mainfooter .logos { margin: 15px 0 0 0; } table.infoBox { width: 100%; } td.infoBox { font-size: 8pt; padding: 0 0 1em 0; white-space: nowrap; } div.infoBoxTitle { font-size: 10pt; font-weight: bold; } div.infoBoxBadProcStatus { font-size: 8pt; font-weight: bold; color: red; } .linkBox { font-size: 8pt; padding: 1px; } table.linkBox td { white-space: nowrap; } .filter { font-size: 8pt; padding: 1px; } .filterTitle { font-size: 9pt; font-weight: bold; } .filterName { font-size: 8pt; text-align: right; font-weight: bold; } .filterValue { font-size: 8pt; } .errorDescription { font-size: 10pt; text-align: center; font-weight: bold; } .errorMessage { font-size: 10pt; text-align: center; font-weight: bold; color: red; } .warningMessage { font-size: 10pt; text-align: center; font-weight: bold; color: red; } .statusTitle { text-align: center; font-weight: bold; font-size: 12pt; white-space: nowrap; } .statusSort { font-size: 8pt; } table.data { padding: 0; } th.data { font-size: 9pt; text-align: left; padding: 0 3px 0 3px; border-bottom: 1px solid #777777; color: #333333; } .dataOdd { font-size: 8pt; background-color: #e7e7e7; padding: 0px 4px 0px 4px; } .dataEven { font-size: 8pt; background-color: #f4f2f2; padding: 0px 4px 0px 4px; } .dataTitle { font-size: 12pt; text-align: center; font-weight: bold; } .dataSubTitle { font-size: 10pt; text-align: center; font-weight: bold; } .optBox { font-size: 9pt; white-space: nowrap; padding: 2px 0px 0px 0px; } .optBoxTitle { font-size: 10pt; font-weight: bold; text-align: center; } .optBoxRequiredItem { font-size: 9pt; text-align: right; padding: 0px 5px 0px 5px; color: red; } .optBoxItem { font-size: 9pt; text-align: right; padding: 0px 5px 0px 5px; } .optBoxValue { font-size: 9pt; } .optionBoxTitle { font-size: 10pt; text-align: center; font-weight: bold; } .optionBox { font-size: 10pt; padding: 2px; } .navBoxTitle { font-size: 10pt; font-weight: bold; white-space: nowrap; } .navBoxItem { font-size: 8pt; } .navBoxDate { font-size: 8pt; white-space: nowrap; } .navBoxFile { font-size: 8pt; text-align: center; } .helpfulHint { font-size: 8pt; font-style: italic; text-align: center; } .logEntries { font-size: 8pt; white-space: nowrap; } .dateTimeBreak { font-size: 9pt; font-weight: bold; } .reportRange { font-size: 10pt; white-space: nowrap; } .reportDuration { font-size: 8pt; white-space: nowrap; } .reportTime { font-size: 8pt; white-space: nowrap; text-align: right; font-style: italic; } .reportSelectTitle { font-size: 12pt; text-align: center; font-weight: bold; } .reportSelectSubTitle { font-size: 9pt; text-align: right; } .reportSelectItem { font-size: 9pt; } .reportSelectTip { font-size: 8pt; font-style: italic; } .dateSelectTitle { font-size: 12pt; text-align: center; font-weight: bold; } .dateSelectSubTitle { font-size: 9pt; text-align: right; } .dateSelectItem { font-size: 9pt; } .popupText { font-size: 8pt; background-color: #eeeeaa; border: 1px solid #777777; padding: 10px 10px 10px 10px; } .hostImportantProblem { font-size: 8pt; background-color: #88aadd; border: 1px solid #aaaaaa; padding: 0px 5px 0px 5px; } .hostUnimportantProblem { font-size: 8pt; background-color: #aaccff; border: 1px solid #888888; padding: 0px 5px 0px 5px; } .serviceImportantProblem { font-size: 8pt; background-color: #88aadd; border: 1px solid #aaaaaa; padding: 0px 5px 0px 5px; } .serviceUnimportantProblem { font-size: 8pt; background-color: #aaccff; border: 1px solid #888888; padding: 0px 5px 0px 5px; } .outageImportantProblem { font-size: 8pt; background-color: #88aadd; border: 1px solid #aaaaaa; padding: 0px 5px 0px 5px; } .outageUnimportantProblem { font-size: 8pt; background-color: #aaccff; border: 1px solid #888888; padding: 0px 5px 0px 5px; } /* Some nagios configurations have side.html rather than side.php and define */ /* a slightly different set of nav elements. */ .NavBarTitle { font-size: 9pt; font-weight: bold; margin: 5px 0 10px 0; padding: 2px; background-color: #efefef; border: 1px solid #dddddd; } .NavBarItem { font-size: 9pt; font-weight: bold; list-style: none; text-decoration: none; margin: 0; padding: 0 0 0 0; } .NavBarSearchItem { font-size: 9pt; } #splashboxes { margin: auto; width: 794px; } .splashbox { padding: 5px; margin: 5px; border: 1px solid #AAAAAA; float: left; text-align: left; height: 140px; } .splashbox h2 { margin: 0; font-size: 12pt; } .splashbox ul { margin: 0; padding: 5px 5px 5px 15px; } .splashbox ul li { clear: both; } .splashbox-media { margin: 5px; } .splashbox3-empty { margin: 5px; border: 1px solid #AAAAAA; width: 238px; height: 150px; } .splashbox3-full { margin: 5px; width: 240px; height: 152px; } .splashbox-clear { clear: both; } #splashbox1, #splashbox2, #splashbox4 { width: 250px; } #splashbox3 { float: left; } #splashbox5 { width: 500px; } nagios-4.3.4/contrib/exfoliation/stylesheets/config.css000066400000000000000000000011121314764422400233200ustar00rootroot00000000000000/* exfoliation: a nagios makeover */ /* Copyright 2010 Matthew Wall, all rights reserved */ /* */ /* Permission to use, copy, modify, and distribute this software for any */ /* purpose with or without fee is hereby granted, provided that the above */ /* copyright notice and this permission notice appear in all copies. */ .config { } .reportSelectSubTitle { font-size: 9pt; text-align: left; } .reportSelectItem { font-size: 9pt; } nagios-4.3.4/contrib/exfoliation/stylesheets/extinfo.css000066400000000000000000000127721314764422400235450ustar00rootroot00000000000000/* exfoliation: a nagios makeover */ /* Copyright 2010 Matthew Wall, all rights reserved */ /* */ /* Permission to use, copy, modify, and distribute this software for any */ /* purpose with or without fee is hereby granted, provided that the above */ /* copyright notice and this permission notice appear in all copies. */ .extinfo { } .perfTypeTitle { font-size: 10pt; text-align: right; font-weight: bold; } .stateInfoPanel { font-size: 9pt; } .stateStatisticsPanel { } .stateInfoTable1 { background-color: #f4f2f2; border: 1px solid #d0d0d0; } .stateInfoTable2 { background-color: #f4f2f2; border: 1px solid #d0d0d0; } .dataVar { font-size: 9pt; font-weight: bold; } .dataVal { font-size: 9pt; } /* FIXME: override the defaults until php/html is fixed */ /* .data { font-size: 10pt; font-weight: bold; } */ div.data { font-size: 10pt; font-weight: normal; } .dataTitle { font-size: 10pt; font-weight: bold; padding-bottom: 5; } .commandTitle { font-size: 10pt; text-align: center; font-weight: bold; padding-bottom: 5; } TABLE.command { background-color: #f4f2f2; border: 1px solid #d0d0d0; } .command { font-size: 9pt; } .commandPanel { } .commentPanel { } .commentTitle { font-size: 10pt; text-align: center; font-weight: bold; } DIV.commentNav { font-size: 10pt; text-align: center; } A.commentNav { font-size: 10pt; } TABLE.comment { font-size: 10pt; background-color: white; padding: 2; } TH.comment { font-size: 9pt; text-align: left; padding: 0 3px 0 3px; border-bottom: 1px solid #777777; color: #333333; } .commentOdd { font-size: 9pt; background-color: #e7e7e7; } .commentEven { font-size: 9pt; background-color: #f4f2f2; } DIV.comment,A.comment { font-size: 10pt; background-color: white; text-align: center; } .downtimeTitle { font-size: 12pt; text-align: center; font-weight: bold; } DIV.downtimeNav { font-size: 10pt; text-align: center; } A.downtimeNav { font-size: 10pt; } TABLE.downtime { font-size: 10pt; background-color: white; padding: 2; } TH.downtime { font-size: 9pt; text-align: left; padding: 0 3px 0 3px; border-bottom: 1px solid #777777; color: #333333; } .downtimeOdd { font-size: 9pt; background-color: #e7e7e7; } .downtimeEven { font-size: 9pt; background-color: #f4f2f2; } .notflapping { background-color: #88d066; border: 1px solid #777777; font-weight: bold; float: left; } .flapping { background-color: #f88888; border: 1px solid #777777; font-weight: bold; float: left; } .notificationsENABLED { background-color: #88d066; border: 1px solid #777777; font-weight: bold; } .notificationsDISABLED { background-color: #f88888; border: 1px solid #777777; font-weight: bold; } .checksENABLED { background-color: #88d066; border: 1px solid #777777; font-weight: bold; } .checksDISABLED { background-color: #f88888; border: 1px solid #777777; font-weight: bold; } .eventhandlersENABLED { background-color: #88d066; border: 1px solid #777777; font-weight: bold; } .eventhandlersDISABLED { background-color: #f88888; border: 1px solid #777777; font-weight: bold; } .flapdetectionENABLED { background-color: #88d066; border: 1px solid #777777; font-weight: bold; } .flapdetectionDISABLED { background-color: #f88888; border: 1px solid #777777; font-weight: bold; } .downtimeACTIVE { background-color: #f88888; border: 1px solid #777777; font-weight: bold; float: left; } .downtimeINACTIVE { background-color: #88d066; border: 1px solid #777777; font-weight: bold; float: left; } .processOK { background-color: #88d066; border: 1px solid #777777; font-weight: bold; } .processUNKNOWN { background-color: #ffbb55; border: 1px solid #777777; font-weight: bold; } .processWARNING { background-color: #ffff00; border: 1px solid #777777; font-weight: bold; } .processCRITICAL { background-color: #f88888; border: 1px solid #777777; font-weight: bold; } .modeACTIVE { background-color: #88d066; border: 1px solid #777777; font-weight: bold; } .modeSTANDBY { background-color: #ffff00; border: 1px solid #777777; font-weight: bold; } .hostUP { background-color: #88d066; border: 1px solid #777777; font-weight: bold; float: left; } .hostDOWN { background-color: #f88888; border: 1px solid #777777; font-weight: bold; float: left; } .hostUNREACHABLE { background-color: #f88888; border: 1px solid #777777; font-weight: bold; float: left; } .serviceOK { background-color: #88d066; border: 1px solid #777777; font-weight: bold; float: left; } .serviceWARNING { background-color: #ffff00; border: 1px solid #777777; font-weight: bold; float: left; } .serviceUNKNOWN { background-color: #ffbb55; border: 1px solid #777777; font-weight: bold; float: left; } .serviceCRITICAL { background-color: #f88888; border: 1px solid #777777; font-weight: bold; float: left; } .queueTitle { font-size: 12pt; text-align: center; font-weight: bold; } TABLE.queue { font-size: 9pt; padding: 0; } TH.queue { font-size: 9pt; text-align: left; padding: 0 3px 0 3px; border-bottom: 1px solid #777777; color: #333333; } .queueOdd { font-size: 9pt; background-color: #e7e7e7; padding: 0 4 0 4; } .queueEven { font-size: 9pt; background-color: #f4f2f2; padding: 0 4 0 4; } .queueENABLED { font-size: 9pt; background-color: #88d066; border: 1px solid #777777; padding: 0 4 0 4; } .queueDISABLED { font-size: 9pt; background-color: #f88888; border: 1px solid #777777; padding: 0 4 0 4; } nagios-4.3.4/contrib/exfoliation/stylesheets/histogram.css000066400000000000000000000010601314764422400240520ustar00rootroot00000000000000/* exfoliation: a nagios makeover */ /* Copyright 2010 Matthew Wall, all rights reserved */ /* */ /* Permission to use, copy, modify, and distribute this software for any */ /* purpose with or without fee is hereby granted, provided that the above */ /* copyright notice and this permission notice appear in all copies. */ .histogram { } .helpfulHints { font-size: 10pt; font-style: italic; text-align: center; } nagios-4.3.4/contrib/exfoliation/stylesheets/history.css000066400000000000000000000007421314764422400235640ustar00rootroot00000000000000/* exfoliation: a nagios makeover */ /* Copyright 2010 Matthew Wall, all rights reserved */ /* */ /* Permission to use, copy, modify, and distribute this software for any */ /* purpose with or without fee is hereby granted, provided that the above */ /* copyright notice and this permission notice appear in all copies. */ .history { } nagios-4.3.4/contrib/exfoliation/stylesheets/ministatus.css000066400000000000000000000105061314764422400242620ustar00rootroot00000000000000/* exfoliation: a nagios makeover */ /* Copyright 2010 Matthew Wall, all rights reserved */ /* */ /* Permission to use, copy, modify, and distribute this software for any */ /* purpose with or without fee is hereby granted, provided that the above */ /* copyright notice and this permission notice appear in all copies. */ .status { } TABLE.status { font-size: 9pt; padding: 2; } TH.status { font-size: 9pt; text-align: left; padding: 0 3px 0 3px; border-bottom: 1px solid #777777; color: #333333; } DIV.status { font-size: 10pt; text-align: center; } .statusOdd { font-size: 9pt; background-color: #e7e7e7; } .statusEven { font-size: 9pt; background-color: #f4f2f2; } .statusPENDING { font-size: 9pt; background-color: #acacac; } .statusOK { font-size: 9pt; background-color: #88d066; } .statusRECOVERY { font-size: 9pt; background-color: #88d066; } .statusUNKNOWN { font-size: 9pt; background-color: #ffbb55; } .statusWARNING { font-size: 9pt; background-color: #ffff00; } .statusCRITICAL { font-size: 9pt; background-color: #f88888; } .statusHOSTPENDING { font-size: 9pt; background-color: #acacac; } .statusHOSTUP { font-size: 9pt; background-color: #88d066; } .statusHOSTDOWN { font-size: 9pt; background-color: #f88888; } .statusHOSTUNREACHABLE { font-size: 9pt; background-color: #ffbb55; } .statusBGUNKNOWN { font-size: 9pt; background-color: #ffddaa; } .statusBGWARNING { font-size: 9pt; background-color: #feffc1; } .statusBGCRITICAL { font-size: 9pt; background-color: #ffdddd; } .statusBGDOWN { font-size: 9pt; background-color: #ffdddd; } .statusBGUNREACHABLE { font-size: 9pt; background-color: #ffbb55; } DIV.serviceTotals { font-size: 10pt; text-align: center; font-weight: bold; } TABLE.serviceTotals { font-size: 10pt; font-weight: bold; } TH.serviceTotals,A.serviceTotals { font-size: 9pt; } TD.serviceTotals { font-size: 9pt; text-align: center; background-color: #e0e0e0; border: 1px solid #777777; padding: 2 4 2 4; } .serviceTotalsOK { font-size: 9pt; text-align: center; background-color: #88d066; border: 1px solid #777777; padding: 2 4 2 4; } .serviceTotalsWARNING { font-size: 9pt; text-align: center; background-color: #ffff00; border: 1px solid #777777; padding: 2 4 2 4; } .serviceTotalsUNKNOWN { font-size: 9pt; text-align: center; background-color: #ffbb55; border: 1px solid #777777; padding: 2 4 2 4; } .serviceTotalsCRITICAL { font-size: 9pt; text-align: center; background-color: #f88888; border: 1px solid #777777; padding: 2 4 2 4; } .serviceTotalsPENDING { font-size: 9pt; text-align: center; background-color: #acacac; border: 1px solid #777777; padding: 2 4 2 4; } .serviceTotalsPROBLEMS { font-size: 9pt; text-align: center; background-color: #aaccff; border: 1px solid #777777; padding: 2 4 2 4; } DIV.hostTotals { font-size: 10pt; text-align: center; font-weight: bold; } TABLE.hostTotals { font-size: 10pt; font-weight: bold; } TH.hostTotals,A.hostTotals { font-size: 9pt; } TD.hostTotals { font-size: 9pt; text-align: center; background-color: #e4e4e4; } .hostTotalsUP { font-size: 9pt; text-align: center; background-color: #88d066; } .hostTotalsDOWN { font-size: 9pt; text-align: center; background-color: #f88888; } .hostTotalsUNREACHABLE { font-size: 9pt; text-align: center; background-color: #ffbb55; } .hostTotalsPENDING { font-size: 9pt; text-align: center; background-color: #acacac; } .hostTotalsPROBLEMS { font-size: 9pt; text-align: center; background-color: #aaccff; } .miniStatusPENDING { font-size: 9pt; background-color: #acacac; text-align: center; } .miniStatusOK { font-size: 9pt; background-color: #66ffee; text-align: center; } .miniStatusUNKNOWN { font-size: 9pt; background-color: #ffbb55; text-align: center; } .miniStatusWARNING { font-size: 9pt; background-color: #ffff00; text-align: center; } .miniStatusCRITICAL { font-size: 9pt; background-color: #f88888; text-align: center; } .miniStatusUP { font-size: 9pt; background-color: #66ffee; text-align: center; } .miniStatusDOWN { font-size: 9pt; background-color: #f88888; text-align: center; } .miniStatusUNREACHABLE { font-size: 9pt; background-color: #ffbb55; text-align: center; } nagios-4.3.4/contrib/exfoliation/stylesheets/notifications.css000066400000000000000000000043711314764422400247360ustar00rootroot00000000000000/* exfoliation: a nagios makeover */ /* Copyright 2010 Matthew Wall, all rights reserved */ /* */ /* Permission to use, copy, modify, and distribute this software for any */ /* purpose with or without fee is hereby granted, provided that the above */ /* copyright notice and this permission notice appear in all copies. */ .notifications { } TABLE.notifications { padding: 0; margin: 0; } TH.notifications { font-size: 9pt; text-align: left; padding: 0 3px 0 3px; border-bottom: 1px solid #777777; color: #333333; } .notificationsOdd { font-size: 8pt; background-color: #e7e7e7; padding: 0 4 0 4; } .notificationsEven { font-size: 8pt; background-color: #f4f2f2; padding: 0 4 0 4; } /* these are dark colors */ .notificationsOK { background-color: #88d066; border: 1px solid #777777; padding: 0 4 0 4; } .notificationsUNKNOWN { background-color: #ffbb55; border: 1px solid #777777; padding: 0 4 0 4; } .notificationsWARNING { background-color: #ffff00; border: 1px solid #777777; padding: 0 4 0 4; } .notificationsCRITICAL { background-color: #f88888; border: 1px solid #777777; padding: 0 4 0 4; } .notificationsACKNOWLEDGEMENT { background-color: #aaaaaa; border: 1px solid #777777; padding: 0 4 0 4; } .notificationsCUSTOM { background-color: #778899; border: 1px solid #777777; padding: 0 4 0 4; } .notificationsDOWNTIME { background-color: #aaccff; border: 1px solid #777777; padding: 0 4 0 4; } /* these are dark colors */ .notificationsHOSTUP { background-color: #88d066; border: 1px solid #777777; padding: 0 4 0 4; } .notificationsHOSTDOWN { background-color: #f88888; border: 1px solid #777777; padding: 0 4 0 4; } .notificationsHOSTUNREACHABLE { background-color: #ffbb55; border: 1px solid #777777; padding: 0 4 0 4; } .notificationsHOSTACKNOWLEDGEMENT { background-color: #aaaaaa; border: 1px solid #777777; padding: 0 4 0 4; } .notificationsHOSTCUSTOM { background-color: #778899; border: 1px solid #777777; padding: 0 4 0 4; } .notificationsHOSTDOWNTIME { background-color: #aaccff; border: 1px solid #777777; padding: 0 4 0 4; } nagios-4.3.4/contrib/exfoliation/stylesheets/outages.css000066400000000000000000000013471314764422400235340ustar00rootroot00000000000000/* exfoliation: a nagios makeover */ /* Copyright 2010 Matthew Wall, all rights reserved */ /* */ /* Permission to use, copy, modify, and distribute this software for any */ /* purpose with or without fee is hereby granted, provided that the above */ /* copyright notice and this permission notice appear in all copies. */ .outages { } .itemTotalsTitle { font-size: 8pt; text-align: center; } .hostUP { background-color: #88d066; font-weight: bold; } .hostDOWN { background-color: #f88888; font-weight: bold; } .hostUNREACHABLE { background-color: #ffbb55; font-weight: bold; } nagios-4.3.4/contrib/exfoliation/stylesheets/showlog.css000066400000000000000000000007421314764422400235450ustar00rootroot00000000000000/* exfoliation: a nagios makeover */ /* Copyright 2010 Matthew Wall, all rights reserved */ /* */ /* Permission to use, copy, modify, and distribute this software for any */ /* purpose with or without fee is hereby granted, provided that the above */ /* copyright notice and this permission notice appear in all copies. */ .showlog { } nagios-4.3.4/contrib/exfoliation/stylesheets/status.css000066400000000000000000000161631314764422400234120ustar00rootroot00000000000000/* exfoliation: a nagios makeover */ /* Copyright 2010 Matthew Wall, all rights reserved */ /* */ /* Permission to use, copy, modify, and distribute this software for any */ /* purpose with or without fee is hereby granted, provided that the above */ /* copyright notice and this permission notice appear in all copies. */ .status { } .itemTotalsTitle { font-size: 8pt; font-style: italic; clear:both;} table.status { font-size: 9pt; padding: 0 0 10 0; } th.status { font-size: 9pt; text-align: left; padding: 0 3px 0 3px; border-bottom: 1px solid #777777; color: #333333; } div.status { font-size: 10pt; text-align: center; } .statusOdd { font-size: 8pt; background-color: #e7e7e7; line-height: 150%; padding: 0 4 0 4; } .statusEven { font-size: 8pt; background-color: #f4f2f2; line-height: 150%; padding: 0 4 0 4; } .statusPENDING { font-size: 8pt; background-color: #acacac; border: 1px solid #777777; padding: 0 5 0 5; } .statusOK { font-size: 8pt; background-color: #88d066; border: 1px solid #777777; padding: 0 5 0 5; } .statusRECOVERY { font-size: 8pt; background-color: #88d066; border: 1px solid #777777; padding: 0 5 0 5; } .statusUNKNOWN { font-size: 8pt; background-color: #ffbb55; border: 1px solid #777777; padding: 0 5 0 5; } .statusWARNING { font-size: 8pt; background-color: #ffff00; border: 1px solid #777777; padding: 0 5 0 5; } .statusCRITICAL { font-size: 8pt; background-color: #f88888; border: 1px solid #777777; padding: 0 5 0 5; } .statusHOSTPENDING { font-size: 8pt; background-color: #acacac; line-height: 150%; padding: 0 4 0 4; } .statusHOSTUP { font-size: 8pt; background-color: #cce8cc; line-height: 150%; padding: 0 4 0 4; } .statusHOSTDOWN { font-size: 8pt; background-color: #ffdddd; line-height: 150%; padding: 0 4 0 4; } .statusHOSTDOWNACK { font-size: 8pt; background-color: #ffdddd; line-height: 150%; padding: 0 4 0 4; } .statusHOSTDOWNSCHED { font-size: 8pt; background-color: #ffdddd; line-height: 150%; padding: 0 4 0 4; } .statusHOSTUNREACHABLE { font-size: 8pt; background-color: #ffddaa; line-height: 150%; padding: 0 4 0 4; } .statusHOSTUNREACHABLEACK { font-size: 8pt; background-color: #ffddaa; line-height: 150%; padding: 0 4 0 4; } .statusHOSTUNREACHABLESCHED { font-size: 8pt; background-color: #ffddaa; line-height: 150%; padding: 0 4 0 4; } .statusBGUNKNOWN { font-size: 8pt; background-color: #ffddaa; } .statusBGUNKNOWNACK { font-size: 8pt; background-color: #ffddaa; } .statusBGUNKNOWNSCHED { font-size: 8pt; background-color: #ffddaa; } .statusBGWARNING { font-size: 8pt; background-color: #feffc1; } .statusBGWARNINGACK { font-size: 8pt; background-color: #feffc1; } .statusBGWARNINGSCHED { font-size: 8pt; background-color: #feffc1; } .statusBGCRITICAL { font-size: 8pt; background-color: #ffdddd; } .statusBGCRITICALACK { font-size: 8pt; background-color: #ffdddd; } .statusBGCRITICALSCHED { font-size: 8pt; background-color: #ffdddd; } .statusBGDOWN { font-size: 8pt; background-color: #ffdddd; } .statusBGDOWNACK { font-size: 8pt; background-color: #ffdddd; } .statusBGDOWNSCHED { font-size: 8pt; background-color: #ffdddd; } .statusBGUNREACHABLE { font-size: 8pt; background-color: #ffddaa; } .statusBGUNREACHABLEACK { font-size: 8pt; background-color: #ffddaa; } .statusBGUNREACHABLESCHED { font-size: 8pt; background-color: #ffddaa; } div.serviceTotals { font-size: 10pt; text-align: center; font-weight: bold; } table.serviceTotals { font-size: 10pt; font-weight: bold; } th.serviceTotals,a.serviceTotals { font-size: 8pt; } td.serviceTotals { font-size: 8pt; text-align: center; background-color: #e0e0e0; border: 1px solid #777777; padding: 2 4 2 4; } .serviceTotalsOK { font-size: 8pt; text-align: center; background-color: #88d066; border: 1px solid #777777; padding: 2 4 2 4; } .serviceTotalsWARNING { font-size: 8pt; text-align: center; background-color: #ffff00; border: 1px solid #777777; padding: 2 4 2 4; } .serviceTotalsUNKNOWN { font-size: 8pt; text-align: center; background-color: #ffbb55; border: 1px solid #777777; padding: 2 4 2 4; } .serviceTotalsCRITICAL { font-size: 8pt; text-align: center; background-color: #f88888; border: 1px solid #777777; padding: 2 4 2 4; } .serviceTotalsPENDING { font-size: 8pt; text-align: center; background-color: #acacac; border: 1px solid #777777; padding: 2 4 2 4; } .serviceTotalsPROBLEMS { font-size: 8pt; text-align: center; background-color: #aaccff; border: 1px solid #777777; padding: 2 4 2 4; } div.hostTotals { font-size: 10pt; text-align: center; font-weight: bold; } table.hostTotals { font-size: 10pt; font-weight: bold; } th.hostTotals,a.hostTotals { font-size: 8pt; } td.hostTotals { font-size: 8pt; text-align: center; background-color: #e0e0e0; border: 1px solid #777777; padding: 2 4 2 4; } .hostTotalsUP { font-size: 8pt; text-align: center; background-color: #88d066; border: 1px solid #777777; padding: 2 4 2 4; } .hostTotalsDOWN { font-size: 8pt; text-align: center; background-color: #f88888; border: 1px solid #777777; padding: 2 4 2 4; } .hostTotalsUNREACHABLE { font-size: 8pt; text-align: center; background-color: #ffbb55; border: 1px solid #777777; padding: 2 4 2 4; } .hostTotalsPENDING { font-size: 8pt; text-align: center; background-color: #acacac; border: 1px solid #777777; padding: 2 4 2 4; } .hostTotalsPROBLEMS { font-size: 8pt; text-align: center; background-color: #aaccff; border: 1px solid #777777; padding: 2 4 2 4; } .miniStatusPENDING { font-size: 8pt; text-align: center; background-color: #acacac; border: 1px solid #777777; padding: 0 5 0 5; } .miniStatusOK { font-size: 8pt; text-align: center; background-color: #88d066; border: 1px solid #777777; padding: 0 5 0 5; } .miniStatusUNKNOWN { font-size: 8pt; text-align: center; background-color: #ffbb55; border: 1px solid #777777; padding: 0 5 0 5; } .miniStatusWARNING { font-size: 8pt; text-align: center; background-color: #ffff00; border: 1px solid #777777; padding: 0 5 0 5; } .miniStatusCRITICAL { font-size: 8pt; text-align: center; background-color: #f88888; border: 1px solid #777777; padding: 0 5 0 5; } .miniStatusUP { font-size: 8pt; text-align: center; background-color: #88d066; border: 1px solid #777777; padding: 0 5 0 5; } .miniStatusDOWN { font-size: 8pt; text-align: center; background-color: #f88888; border: 1px solid #777777; padding: 0 5 0 5; } .miniStatusUNREACHABLE { font-size: 8pt; text-align: center; background-color: #ffbb55; border: 1px solid #777777; padding: 0 5 0 5; } /* page number styles, added 2/01/2012 -MG */ #top_page_numbers { float:right;} #result_limit { display:inline;} .pagenumber { display: block; float:left; border: 1px solid #AAAAAA; padding: 0 2px 0 2px; margin: 1px;text-align:center; height:15px; } a.pagenumber:hover { background-color: #EFEFEF;text-decoration:none;} .current_page { color: #AAA; } #inner_numbers { clear:right;} #pagelimit,#bottom_page_numbers { font-size:8pt;} nagios-4.3.4/contrib/exfoliation/stylesheets/statusmap.css000066400000000000000000000013061314764422400241010ustar00rootroot00000000000000/* exfoliation: a nagios makeover */ /* Copyright 2010 Matthew Wall, all rights reserved */ /* */ /* Permission to use, copy, modify, and distribute this software for any */ /* purpose with or without fee is hereby granted, provided that the above */ /* copyright notice and this permission notice appear in all copies. */ .statusmap { } .imageInfo { font-size: 8pt; font-weight: bold; text-align: center; } .zoomTitle { font-size: 8pt; font-weight: bold; } .popupText { font-size: 8pt; background-color: #eeeeaa; border: 1px solid #777777; padding: 0 5 0 5; } nagios-4.3.4/contrib/exfoliation/stylesheets/summary.css000066400000000000000000000033241314764422400235570ustar00rootroot00000000000000/* exfoliation: a nagios makeover */ /* Copyright 2010 Matthew Wall, all rights reserved */ /* */ /* Permission to use, copy, modify, and distribute this software for any */ /* purpose with or without fee is hereby granted, provided that the above */ /* copyright notice and this permission notice appear in all copies. */ .summary { } /* override to match filter table style */ .optBoxItem { font-size: 8pt; font-weight: bold; } .optBoxValue { font-size: 8pt; } /* override to match query info style */ .dataSubTitle { font-size: 8pt; text-align: center; font-weight: normal; } /* override so we get a bit of whitespace */ table.data { padding-top: 15; } .reportDataOdd { font-size: 9pt; background-color: #e7e7e7; padding: 0 4 0 4; } .reportDataEven { font-size: 9pt; background-color: #f4f2f2; padding: 0 4 0 4; } .hostUP { font-size: 9pt; background-color: #88d066; border: 1px solid #777777; padding: 0 4 0 4; } .hostDOWN { font-size: 9pt; background-color: #f88888; border: 1px solid #777777; padding: 0 4 0 4; } .hostUNREACHABLE { font-size: 9pt; background-color: #ffbb55; border: 1px solid #777777; padding: 0 4 0 4; } .serviceOK { font-size: 9pt; background-color: #88d066; border: 1px solid #777777; padding: 0 4 0 4; } .serviceWARNING { font-size: 9pt; background-color: #ffff00; border: 1px solid #777777; padding: 0 4 0 4; } .serviceUNKNOWN { font-size: 9pt; background-color: #ffbb55; border: 1px solid #777777; padding: 0 4 0 4; } .serviceCRITICAL { font-size: 9pt; background-color: #f88888; border: 1px solid #777777; padding: 0 4 0 4; } nagios-4.3.4/contrib/exfoliation/stylesheets/tac.css000066400000000000000000000125401314764422400226310ustar00rootroot00000000000000/* exfoliation: a nagios makeover */ /* Copyright 2010 Matthew Wall, all rights reserved */ /* */ /* Permission to use, copy, modify, and distribute this software for any */ /* purpose with or without fee is hereby granted, provided that the above */ /* copyright notice and this permission notice appear in all copies. */ .tac { font-size: 10pt; } .title { font-weight: bold; } .titleItem { font-size: 8pt; font-weight: bold; } td.perfTitle { font-size: 10pt; font-weight: bold; background-color: #d0d0d0; border: 1px solid #aaaaaa; } .perfBox { background-color: #eeeeee; border: 1px solid #cccccc; } .perfItem { font-size: 8pt; font-weight: bold; } .perfValue { font-size: 8pt; } .healthTitle { font-weight: bold; font-size: 10pt; background-color: #d0d0d0; border: 1px solid #aaaaaa; } .healthBox { } .healthItem { font-size: 10pt; font-weight: bold; } .healthBar { background-color: grey; padding: 2 4 2 4; } .outageTitle { font-weight: bold; background-color: #d0d0d0; border: 1px solid #aaaaaa; } .outageHeader { font-weight: bold; border-bottom: 1px solid #aaaaaa; } .hostTitle { font-weight: bold; background-color: #d0d0d0; border: 1px solid #aaaaaa; } td.hostHeader { font-weight: bold; border-bottom: 1px solid #aaaaaa; } .serviceTitle { font-weight: bold; background-color: #d0d0d0; border: 1px solid #aaaaaa; } td.serviceHeader { font-weight: bold; border-bottom: 1px solid #aaaaaa; } .featureTitle { font-weight: bold; background-color: #d0d0d0; border: 1px solid #aaaaaa; } td.featureHeader { font-weight: bold; border-bottom: 1px solid #aaaaaa; } .featureEnabled { text-align: center; background-color: #ccffcc; } .featureDisabled { text-align: center; background-color: #ffcccc; } .featureEnabledFlapDetection { text-align: center; font-weight: bold; } .featureDisabledFlapDetection { text-align: center; font-weight: bold; } .featureItemEnabledServiceFlapDetection { font-size: 8pt; background-color: #88d066; border: 1px solid #777777; } .featureItemDisabledServiceFlapDetection { font-size: 8pt; background-color: #f88888; border: 1px solid #777777; } .featureItemEnabledHostFlapDetection { font-size: 8pt; background-color: #88d066; border: 1px solid #777777; } .featureItemDisabledHostFlapDetection { font-size: 8pt; background-color: #f88888; border: 1px solid #777777; } .featureItemServicesNotFlapping { font-size: 8pt; background-color: #88d066; border: 1px solid #777777; } .featureItemServicesFlapping { font-size: 8pt; background-color: #f88888; border: 1px solid #777777; } .featureItemHostsNotFlapping { font-size: 8pt; background-color: #88d066; border: 1px solid #777777; } .featureItemHostsFlapping { font-size: 8pt; background-color: #f88888; border: 1px solid #777777; } .featureEnabledNotifications { text-align: center; font-weight: bold; } .featureDisabledNotifications { text-align: center; font-weight: bold; } .featureItemEnabledServiceNotifications { font-size: 8pt; background-color: #88d066; border: 1px solid #777777; } .featureItemDisabledServiceNotifications { font-size: 8pt; background-color: #f88888; border: 1px solid #777777; } .featureItemEnabledHostNotifications { font-size: 8pt; background-color: #88d066; border: 1px solid #777777; } .featureItemDisabledHostNotifications { font-size: 8pt; background-color: #f88888; border: 1px solid #777777; } .featureEnabledHandlers { text-align: center; font-weight: bold; } .featureDisabledHandlers { text-align: center; font-weight: bold; } .featureItemEnabledServiceHandlers { font-size: 8pt; background-color: #88d066; border: 1px solid #777777; } .featureItemDisabledServiceHandlers { font-size: 8pt; background-color: #f88888; border: 1px solid #777777; } .featureItemEnabledHostHandlers { font-size: 8pt; background-color: #88d066; border: 1px solid #777777; } .featureItemDisabledHostHandlers { font-size: 8pt; background-color: #f88888; } .featureEnabledActiveChecks { text-align: center; font-weight: bold; } .featureDisabledActiveChecks { text-align: center; font-weight: bold; } .featureItemEnabledActiveServiceChecks { font-size: 8pt; background-color: #88d066; border: 1px solid #777777; } .featureItemDisabledActiveServiceChecks { font-size: 8pt; background-color: #f88888; border: 1px solid #777777; } .featureItemEnabledActiveHostChecks { font-size: 8pt; background-color: #88d066; border: 1px solid #777777; } .featureItemDisabledActiveHostChecks { font-size: 8pt; background-color: #f88888; border: 1px solid #777777; } .featureEnabledPassiveChecks { text-align: center; font-weight: bold; } .featureDisabledPassiveChecks { text-align: center; font-weight: bold; } .featureItemEnabledPassiveServiceChecks { font-size: 8pt; background-color: #88d066; border: 1px solid #777777; } .featureItemDisabledPassiveServiceChecks { font-size: 8pt; background-color: #f88888; border: 1px solid #777777; } .featureItemEnabledPassiveHostChecks { font-size: 8pt; background-color: #88d066; border: 1px solid #777777; } .featureItemDisabledPassiveHostChecks { font-size: 8pt; background-color: #f88888; border: 1px solid #777777; } nagios-4.3.4/contrib/exfoliation/stylesheets/trends.css000066400000000000000000000007411314764422400233610ustar00rootroot00000000000000/* exfoliation: a nagios makeover */ /* Copyright 2010 Matthew Wall, all rights reserved */ /* */ /* Permission to use, copy, modify, and distribute this software for any */ /* purpose with or without fee is hereby granted, provided that the above */ /* copyright notice and this permission notice appear in all copies. */ .trends { } nagios-4.3.4/contrib/nagios-qh.rb000077500000000000000000000064111314764422400166710ustar00rootroot00000000000000#!/usr/bin/env ruby # Simple interface to interact with the Query Handler # Daniel Wittenberg require "socket" require 'optparse' $DEBUG="false" $DEBUGLOG="" def debug(msg) if($DEBUG == "true") if($DEBUGLOG != "") File.open("#{$DEBUGLOG}",'a') {|f| f.puts("DEBUG: #{msg}")} else puts("DEBUG: #{msg}") end end end def send_cmd(cmd, mysock) mysock="/var/nagios/rw/nagios.qh" if mysock.nil? cmd=cmd.chomp debug("Starting send_cmd with command: #{cmd}") if(cmd == "quit" or cmd == "exit") exit(0) end # If we forget to start with a command type assume # if(! cmd.start_with?('#') and ! cmd.start_with?('@')) cmd = "##{cmd}" end # Cleanup the space if they forget you can't have one cmd.gsub!(/^#\s+/,"#") cmd.gsub!(/^@\s+/,"@") # If no socket we might as well bail if(! File.socket?(mysock)) puts "Not a socket (#{mysock}) sucker!" exit(1) end debug("Writing command to socket: #{cmd}") # open socket and lets get to work! UNIXSocket.open("#{mysock}") do |socket| cmd=cmd + '' socket.send("#{cmd}\000", 0) socket.flush while line = socket.gets # Read lines from the socket puts line.chop # And print with platform line terminator end if(! cmd.start_with?('#')) socket.close puts "" end end end def print_usage() puts " Simple command-line interface to Nagios Query Handler -h, --help Show this help message. -d, --debug Turn on debug mode -s, --socket Specify the query handler socket (default: /var/nagios/rw/nagios.qh) -c, --cmd Run a specific command and exit " exit end ####################################### # __ __ _____ _ _ # | \/ | /\ |_ _| \ | | # | \ / | / \ | | | \| | # | |\/| | / /\ \ | | | . ` | # | | | |/ ____ \ _| |_| |\ | # |_| |_/_/ \_\_____|_| \_| # ####################################### options = {} optparse = OptionParser.new do |opts| opts.banner = "Usage: $0 [options]" opts.on('-d','--debug','Debugging mode on') do options[:debug] = true $DEBUG="true" end opts.on('-h','--help','Help') do print_usage() end opts.on('-s','--socket [socket]','Query Handler Socket') do |socket| options[:socket] = socket end opts.on('-c','--command command','Command') do|command| options[:cmd] = command end end optparse.parse! # If debug mode let's print our options so we confirm what our input was options.each do |o,v| debug("#{o}=#{v}") end if(options[:cmd]) send_cmd("##{options[:cmd]}", options[:socket]) exit puts "Command not specified" print_usage() end puts "Welcome to Nagios Query handler, here's a list of handlers available:" puts "" # We'll give the users a nudge to know what to type next send_cmd("#help list", options[:socket]) puts "use @ for running queries such as '@nerd subscribe servicechecks'" puts "" puts "quit or exit will quit interactive mode" puts "" STDOUT.sync = true print("qh> ") while input = STDIN.gets send_cmd(input, options[:socket]) STDOUT.sync = true print("qh> ") end nagios-4.3.4/contrib/nagios-worker.c000066400000000000000000000032461314764422400174110ustar00rootroot00000000000000#define _GNU_SOURCE #include #include #include #include #include #include "../lib/snprintf.h" #include "../lib/nsock.h" #include "../lib/worker.h" void usage(char *progname) { printf("Usage: %s [--name ] \n", progname); } int main(int argc, char *argv[]) { int sd, i, ret; char *path = NULL, *name = NULL, *cmd = NULL, response[128]; if (argc < 2) { usage(argv[0]); return 1; } for (i = 1; i < argc; i++) { char *opt, *arg = argv[i]; if (*arg != '-') { if (!path) { path = arg; continue; } usage(argv[0]); } if (!strcmp(arg, "-h") || !strcmp(arg, "--help")) { usage(argv[0]); return 0; } if ((opt = strchr(arg, '='))) { opt = '\0'; opt++; } else if (i < argc - 1) { opt = argv[i + 1]; i++; } else { usage(argv[0]); return 1; } if (!strcmp(arg, "--name")) { name = opt; } } if (!path) usage(argv[0]); if (!name) name = basename(argv[0]); sd = nsock_unix(path, NSOCK_TCP | NSOCK_CONNECT); if (sd < 0) { printf("Couldn't open socket: %s\n", nsock_strerror(sd)); return 1; } nsock_printf_nul(sd, "@wproc register name=%s\n", name); /* * we read only 3 bytes here, as we don't want to read any * commands from Nagios before we've entered the worker loop */ ret = read(sd, response, 3); if (ret <= 0) { printf("Failed to read response: %s\n", strerror(errno)); return 1; } if (ret == 3 && !memcmp(response, "OK", 3)) printf("Connected. Wahoo\n"); else { ret = read(sd, response + 3, sizeof(response) - 3); printf("Error: %s\n", response); return 1; } enter_worker(sd, start_cmd); return 0; } nagios-4.3.4/contrib/traceroute.cgi000066400000000000000000000123271314764422400173170ustar00rootroot00000000000000#!/usr/bin/perl # # (c)2004 Andreas Wassatsch # released under GPLv2 # # based on traceroute.cgi of Ian Cass Knowledge Matters Ltd # (c)1999 Ian Cass Knowledge Matters Ltd # # This script should be put in your Nagios cgi-bin directory # (usually /usr/local/nagios/sbin) # # It will perform a traceroute from your Nagios box to # the machine that the check_ping plugin is pinging, # output includes links to host status and status map # for hosts known to Nagios # # This software is provided as-is, without any express or implied # warranty. In no event will the author be held liable for any mental # or physical damages arising from the use of this script. # # Legal note: # Nagios is a registered trademark of Ethan Galstad. # use strict; use File::Basename; use POSIX qw(strftime); # Global Settings #---------------- $| = 1; my($nagios) = "/usr/local/nagios"; my($urlbase) = "/nagios"; my($refresh) = 30; my($self) = basename($0); my($traceroute) = "/usr/sbin/traceroute -m 20 -q 1"; # Generate HTTP header #--------------------- my($mdate)=`date +"%a, %d %b %Y %H:%M:%S %Z"`; print "Cache-Control: no-store\n"; print "Pragma: no-cache\n"; print "Last-Modified: $mdate"; print "Expires: Thu, 01 Jan 1970 00:00:00 GMT\n"; print "Content-type: text/html\n\n"; # accept either traceroute/foo or traceroute?foo; default to REMOTE_ADDR # if nothing else is specified #----------------------------------------------------------------------- my($addr) = $ENV{PATH_INFO} || $ENV{QUERY_STRING} || $ENV{REMOTE_ADDR}; $addr =~ tr/+/ /; $addr =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $addr =~ s,^addr=,,; $addr =~ s/[^A-Za-z0-9\.-]//g; # for security # HTML Head with META Refresh info / stylesheet #---------------------------------------------- print "\n"; print "\n\ntraceroute to host $addr\n"; print "\n"; print "\n"; print "\n\n"; # Info Box #--------- print ""; print ""; print "
    "; print "
    traceroute
    "; print "Generated by $self
    "; print "Last Updated: $mdate
    "; print "Updated every $refresh seconds
    "; print "Nagios® - www.nagios.org
    "; print "Logged in as $ENV{'REMOTE_USER'}
    "; print "
    "; print "

    "; print "Traceroute to Host $addr

    \n"; print "\n"; # read in nagios hosts #--------------------- my(@cfg); my($entry); my($bla); my($host); my(@hostlist); open(HOSTS, "$nagios/etc/hosts.cfg"); @cfg = grep {!/#/ && /host_name/} ; close(HOSTS); foreach $entry (@cfg) { $entry =~ s/^\s+//; ($bla, $host) = split(/\s+/,$entry); push @hostlist,$host; } # open traceroute pipe #--------------------- my($i)=0; open(TRACEROUTE, "$traceroute $addr |" ) || die "
    couldn't open pipe to traceroute! $!
    "; my(@arr); my($class); my($known_host); while () { chomp; s/\&/\&/g; s/\"; print "
    "; print ""; print ""; print ""; print "\n"; } else { # class for odd/even lines #------------------------- if ($i/2 == int($i/2)) { $class="statusEven"; } else { $class="statusOdd"; } # parse traceroute lines #----------------------- s/^\s//g; (@arr) = split(/\s+/, $_, 4); if (grep(/\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/,$arr[1])) { $arr[3] = $arr[2] ." ". $arr[3]; $arr[2] = $arr[1]; $arr[1] = "-"; } $arr[2] =~ s/\(//; $arr[2] =~ s/\)//; # check if host is known to nagios #--------------------------------- $known_host = 0; foreach $host (@hostlist) { if ($host eq $arr[1]) { $known_host++; } } # print table row #---------------- print ""; print "\n"; # hop print "\n"; # ip print "\n"; # rtt print "\n"; } $i++; } close(TRACEROUTE) || die "couldn't close pipe to traceroute! $!"; print "
    HopHostIPRound Trip Time
    $arr[0]"; print "\n"; print "\n"; } else { print "$arr[1]\n"; } print "
    \n"; if ($known_host) { print ""; print "$arr[1]\n"; if ($known_host) { print ""; print "\n"; } print "
    \n"; # host print "
    $arr[2]$arr[3]
    \n"; # footer #------- print " 

     

    "; print "$self by Andreas Wassatsch"; print "\n"; # end #---- exit 0; nagios-4.3.4/daemon-init.in000066400000000000000000000200521314764422400155440ustar00rootroot00000000000000#!/bin/sh # # chkconfig: 345 99 01 # description: Nagios network monitor # processname: nagios # File : nagios # # Author : Jorge Sanchez Aymar (jsanchez@lanchile.cl) # # Changelog : # # 1999-07-09 Karl DeBisschop # - setup for autoconf # - add reload function # 1999-08-06 Ethan Galstad # - Added configuration info for use with RedHat's chkconfig tool # per Fran Boon's suggestion # 1999-08-13 Jim Popovitch # - added variable for nagios/var directory # - cd into nagios/var directory before creating tmp files on startup # 1999-08-16 Ethan Galstad # - Added test for rc.d directory as suggested by Karl DeBisschop # 2000-07-23 Karl DeBisschop # - Clean out redhat macros and other dependencies # 2003-01-11 Ethan Galstad # - Updated su syntax (Gary Miller) # # Description: Starts and stops the Nagios monitor # used to provide network services status. # ### BEGIN INIT INFO # Provides: nagios # Required-Start: $local_fs $syslog $network # Required-Stop: $local_fs $syslog $network # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Starts and stops the Nagios monitoring server # Description: Starts and stops the Nagios monitoring server ### END INIT INFO # Our install-time configuration. prefix=@prefix@ exec_prefix=@exec_prefix@ NagiosBin=@bindir@/nagios NagiosCfgFile=@sysconfdir@/nagios.cfg NagiosCfgtestFile=@localstatedir@/nagios.configtest NagiosStatusFile=@localstatedir@/status.dat NagiosRetentionFile=@localstatedir@/retention.dat NagiosCommandFile=@localstatedir@/rw/nagios.cmd NagiosVarDir=@localstatedir@ NagiosRunFile=@lockfile@ NagiosLockDir=/var/lock/subsys NagiosLockFile=nagios NagiosCGIDir=@sbindir@ NagiosUser=@nagios_user@ NagiosGroup=@nagios_grp@ checkconfig="true" # Source function library # Some *nix do not have an rc.d directory, so do a test first if [ -f /etc/rc.d/init.d/functions ]; then . /etc/rc.d/init.d/functions elif [ -f /etc/init.d/functions ]; then . /etc/init.d/functions elif [ -f /lib/lsb/init-functions ]; then . /lib/lsb/init-functions fi # Load any extra environment variables for Nagios and its plugins. if test -f /etc/sysconfig/nagios; then . /etc/sysconfig/nagios fi # Automate addition of RAMDISK based on environment variables USE_RAMDISK=${USE_RAMDISK:-0} if test "$USE_RAMDISK" -ne 0 && test "$RAMDISK_SIZE"X != "X"; then ramdisk=`mount |grep "${RAMDISK_DIR} type tmpfs"` if [ "$ramdisk"X == "X" ]; then mkdir -p -m 0755 ${RAMDISK_DIR} mount -t tmpfs -o size=${RAMDISK_SIZE}m tmpfs ${RAMDISK_DIR} mkdir -p -m 0755 ${RAMDISK_DIR}/checkresults chown -h -R $NagiosUser:$NagiosGroup ${RAMDISK_DIR} fi fi check_config () { rm -f "$NagiosCfgtestFile"; if test -e "$NagiosCfgtestFile"; then echo "ERROR: Could not delete '$NagiosCfgtestFile'" exit 8 fi if ! su $NagiosUser -c "touch $NagiosCfgtestFile"; then echo "ERROR: Could not create or update '$NagiosCfgtestFile'" exit 8 fi TMPFILE=$(mktemp /tmp/.configtest.XXXXXXXX) $NagiosBin -vp $NagiosCfgFile > "$TMPFILE" WARN=`grep ^"Total Warnings:" "$TMPFILE" |awk -F: '{print \$2}' |sed s/' '//g` ERR=`grep ^"Total Errors:" "$TMPFILE" |awk -F: '{print \$2}' |sed s/' '//g` if test "$WARN" = "0" && test "${ERR}" = "0"; then echo "OK - Configuration check verified" > $NagiosCfgtestFile /bin/rm "$TMPFILE" return 0 elif test "${ERR}" = "0"; then # Write the errors to a file we can have a script watching for. echo "WARNING: Warnings in config files - see log for details: $NagiosCfgtestFile" > $NagiosCfgtestFile egrep -i "(^warning|^error)" "$TMPFILE" >> $NagiosCfgtestFile /bin/rm "$TMPFILE" return 0 else # Write the errors to a file we can have a script watching for. echo "ERROR: Errors in config files - see log for details: $NagiosCfgtestFile" > $NagiosCfgtestFile egrep -i "(^warning|^error)" "$TMPFILE" >> $NagiosCfgtestFile cat "$TMPFILE" exit 8 fi } status_nagios () { if test -x $NagiosCGI/daemonchk.cgi; then if $NagiosCGI/daemonchk.cgi -l $NagiosRunFile > /dev/null 2>&1; then return 0; fi else if ps -p $NagiosPID > /dev/null 2>&1; then return 0; fi fi return 1 } printstatus_nagios () { if status_nagios; then echo "nagios (pid $NagiosPID) is running..." else echo "nagios is not running" fi } killproc_nagios () { kill -s "$1" $NagiosPID } pid_nagios () { if test ! -f $NagiosRunFile; then echo "No lock file found in $NagiosRunFile" exit 1 fi NagiosPID=`head -n 1 $NagiosRunFile` } remove_commandfile () { # Removing a stalled command file, while there are processes trying/waiting to write into it, # will deadlock those processes in a blocking open() system call. To allow such processes to # die on a broken pipe, the pipe must be opened for reading without actually reading from it, # which is what dd does here. To avoid a chicken-egg problem, the pipe is renamed beforehand. # In order for the dd to not deadlock when there is no writing process, it is executed in the # background in a subshell together with an empty echo to have at least one writing process. # see http://unix.stackexchange.com/questions/335406/opening-named-pipe-blocks-forever-if-pipe-is-deleted-without-being-connected if [ -p $NagiosCommandFile ]; then mv -f $NagiosCommandFile $NagiosCommandFile~ (dd if=$NagiosCommandFile~ count=0 2>/dev/null & echo -n "" >$NagiosCommandFile~) fi rm -f $NagiosCommandFile $NagiosCommandFile~ } # Check that nagios exists. if [ ! -f $NagiosBin ]; then echo "Executable file $NagiosBin not found. Exiting." exit 1 fi # Check that nagios.cfg exists. if [ ! -f $NagiosCfgFile ]; then echo "Configuration file $NagiosCfgFile not found. Exiting." exit 1 fi # See how we were called. case "$1" in start) echo -n "Starting nagios:" if test "$checkconfig" = "true"; then check_config # check_config exits on configuration errors. fi if test -f $NagiosRunFile; then NagiosPID=`head -n 1 $NagiosRunFile` if status_nagios; then echo " another instance of nagios is already running." exit 0 fi fi su $NagiosUser -c "touch $NagiosVarDir/nagios.log $NagiosRetentionFile" remove_commandfile touch $NagiosRunFile $NagiosBin -d $NagiosCfgFile if [ -d $NagiosLockDir ]; then touch $NagiosLockDir/$NagiosLockFile; fi echo " done." ;; stop) echo -n "Stopping nagios:" pid_nagios killproc_nagios TERM # now we have to wait for nagios to exit and remove its # own NagiosRunFile, otherwise a following "start" could # happen, and then the exiting nagios will remove the # new NagiosRunFile, allowing multiple nagios daemons # to (sooner or later) run - John Sellens #echo -n 'Waiting for nagios to exit .' for i in {1..90}; do if status_nagios > /dev/null; then echo -n '.' sleep 1 else break fi done if status_nagios > /dev/null; then echo '' echo 'Warning - nagios did not exit in a timely manner - Killing it!' killproc_nagios KILL else echo ' done.' fi remove_commandfile rm -f $NagiosStatusFile $NagiosRunFile $NagiosLockDir/$NagiosLockFile ;; status) pid_nagios printstatus_nagios ;; checkconfig) if test "$checkconfig" = "true"; then printf "Running configuration check...\n" check_config fi if [ $? -eq 0 ]; then echo " OK." else echo " CONFIG ERROR! Check your Nagios configuration." exit 1 fi ;; restart) if test "$checkconfig" = "true"; then printf "Running configuration check...\n" check_config fi $0 stop $0 start ;; reload|force-reload) if test "$checkconfig" = "true"; then printf "Running configuration check...\n" check_config fi if test ! -f $NagiosRunFile; then $0 start else pid_nagios if status_nagios > /dev/null; then printf "Reloading nagios configuration...\n" killproc_nagios HUP echo "done" else $0 stop $0 start fi fi ;; configtest) $NagiosBin -vp $NagiosCfgFile ;; *) echo "Usage: nagios {start|stop|restart|reload|force-reload|status|checkconfig|configtest}" exit 1 ;; esac # End of this script nagios-4.3.4/docs/000077500000000000000000000000001314764422400137415ustar00rootroot00000000000000nagios-4.3.4/docs/api-incompat3to4.dox000066400000000000000000000067551314764422400175650ustar00rootroot00000000000000/**@page api_incompat3to4 API incompatibilities between Nagios 3 and 4 A list of API incompatibilities between Nagios 3 and 4. [TOC] @section globalvars Global Variables @li event_list_{high,low} and event_list_{high,low}_tail are no more. Instead there is "squeue_t *nagios_squeue", which is a single queue to handle all timed events. @li last_command_check, command_check_interval, external_command_buffer and external_command_buffer_slots are no more. @li check_result_list is no more @li passive_check_result_list and passive_check_result_list_tail are no more. @section datastructures Data Structures @li All primary objects have been given an 'id' field, which can be used to store additional data about each object, or mark them in bitmaps, or... @li Container-ish pointers have been removed pretty much everywhere in favour of testable libraries with specific lookup properties and containers. This means 'next_hash' etc no longer exist in any object. The 'next' pointers in primary objects still remain, but you should avoid using them in favour of iterating over objects using the object arrays. @li next and prev have been removed from timed_event. It's no longer possible to sanely loop over all queued elements, since the squeue library keeps its types opaque. Adding an "squeue_foreach()" thing would be as simple as running a breadth-first search in the pqueue library that drives the squeue implementation. @li The scheduled_downtime data type now has start_event and stop_event. @li nebstruct_program_status_data no longer has a last_command_check var. @li The passive_service_check data type is no more. @li The data type circular_buffer has been removed. @li The host object's notify_on_down, notify_on_up, notify_on_blablah variables have been replaced with a single "notification_options" field instead, which is a small hand-managed bitmask of the states we should notify on, based on 1 << current_state. @li As per above, with flap_detection_options @li As per above, with stalking_options @li As per the three above, with services @li As per above, with dependencies which now have a "failure_options" field instead of multiple "fail_on_foo" fields. @li As per above with escalations, which now have an "escalation_options" field instead of multiple "escalate on foo" fields. @section functions Functions @li Event queue management functions have been significantly altered to match the new scheduling queue implementation. add_event(), remove_event(), reschedule_event() and schedule_new_event() are the primary ones. @li submit_external_command() and submit_raw_external_command() have been removed, as has check_for_external_commands(). @li All functions handling adding and removing objects to circular buffers or other types of linked lists used for searching have been removed. @li The *host*_3x() functions are gone. They have been replaced with versions without the _3x suffix. @li run_sync_host_check_3x() is gone. perform_on_demand_host_check(), which previously only called run_sync_host_check_3x(), now does something sensible instead of calling out to a single helper. @li Using the 'struct host_struct *foo' form of type-naming has been obsoleted and will no longer work. Use 'struct host' instead. @li Use of typedef'ed typenames for non-opaque structures is now deprecated. The typedef's will be removed in Nagios 5, and modules that wish to continue using them after that will have to add them themselves. The new preferred form is 'struct host *foo', which clearly shows that we're dealing with a non-opaque type. */ nagios-4.3.4/docs/config-incompat3to4.dox000066400000000000000000000103011314764422400202370ustar00rootroot00000000000000/** @page configincompat3to4 Configuration Incompatibilities 3->4 This page lists configuration incompatibilities between Nagios 3 and Nagios 4. [TOC] @section mainconfig Main Config File Options Since command file handling has been redone, embedded perl has been removed and the event execution loop now sits and waits on input from worker processes rather than spending any time sleeping, the following variables have been obsoleted, will yield a warning when encountered and no longer have any effect on monitoring: @li command_check_interval @li external_command_buffer_slots @li sleep_time @li enable_failure_prediction @li enable_embedded_perl @li use_embedded_perl_implicitly @li auth_file @li p1_file @section nestedgroups Nested Group Includes In Nagios 3, it's possible to have groups include each other cyclically, like this: @verbatim define hostgroup{ hostgroup_name HG1 alias Hostgroup 1 hostgroup_members HG3 } define hostgroup{ hostgroup_name HG2 alias Hostgroup 2 hostgroup_members HG1 } define hostgroup{ hostgroup_name HG3 alias Hostgroup 3 hostgroup_members HG2 } @endverbatim With Nagios 4, that will generate an error. The Nagios 3 behaviour is that the first hostgroup, as determined by alphabetical sorting, will get the members of its included groups, but the later ones in the sorting will not get the members of the previous ones. Since that is an error-prone and illogical way of assigning group members, we now disallow it. This will work the same for all grouptypes. @section groupinherits Group Inheritance Groups no longer inherit each others exclusions. Consider the following scenario: @verbatim define host{ use default-host-template host_name A alias linux Server1 address 127.0.0.1 hostgroups HG1 contact_groups support-group } define hostgroup{ hostgroup_name HG1 alias Hostgroup 1 hostgroup_members HG3 } define hostgroup{ hostgroup_name HG3 alias Hostgroup 3 members E,F,H,!A hostgroup_members HG2 } @endverbatim In Nagios 3, A would *not* be a member of HG1. In Nagios 4, it will, because the logic has been fixed so that group inclusion works only with the actual members, and not the rules concerning how those members were chosen. If you want to carry over exclusions, you can instead make a template and 'use' one hostgroup from another. The same goes for all group types, and not just hostgroups. @section oconfchanges Object Configuration Changes @subsection Deprecations The "obsess_over_host" (for hosts) and "obsess_over_service" (for services) configuration variables have been renamed to simply "obsess". The old values will serve as aliases for the duration of the Nagios 4 lifetime and will be removed in Nagios 5. Users should adjust their configurations accordingly. @subsection additions Additions Services have two new configurable values: @li parents @li hourly_value The 'parents' directive can be used to suppress notifications for a service in much the same way that it can be used for hosts. If all parents of a particular service are in a non-OK state when the child service enters a HARD state (and should have notified), notifications will be suppressed for the child service. The 'hourly_value' directive can be used to set a service 'value' of the service in question. It works in tandem with a new directive for contacts ("minimum_value") in order to suppress notifications, and UI's are encouraged to take it into account to display the most severe and valuable errors in a more prominent fashion. Note that it has no currency attached to it, so whether you interpret it as affected_users, business_value or whatever is entirely up to you. Contacts have one new configurable value, namely 'minimum_value', which sets the minimum notification value for which the contact should get notified. The notification value is determined by the total value of all objects affected by the problem. */ nagios-4.3.4/docs/mainpage.dox000066400000000000000000000000761314764422400162410ustar00rootroot00000000000000/** @mainpage Technical and api documentation for Nagios. */ nagios-4.3.4/docs/queryhandlers.dox000066400000000000000000000112621314764422400173450ustar00rootroot00000000000000/** @page qh Query Handler A brief intro to the Nagios query handler system [TOC] @section purpose Purpose The purpose of the query handler is to provide Nagios Core and its eventbroker modules with the ability to communicate directly with the outside world through a well-defined API, as well as allowing external apps a way to help out with various Nagios tasks. @section caveats Caveats The query handlers run in the main thread. Nagios doesn't provide any parallelism here and main Nagios will be blocked while a query is running. As such, it's a very good idea to make ones queryhandlers complete in as little time as possible. @section qh_registering Registering a query handler This is really for module authors only. To register a query handler, you *must* have a function like the one below: the following arguments: @code int lala_query_handler(int sd, char *query, unsigned int query_len) @endcode The parameters don't have to have those exact names, and the function certainly doesn't have to be called "lala_query_handler()". We're not quite that childish (well, we are, but we like to pretend we're not). They will suffice for this explanation, however. @li sd - The socket you should respond to. @li query - The query, minus the address and the magic byte. @li query_len - Length of the query, in bytes. The call to register it with Nagios so you get all queries directed to the 'lala' address is then: @code qh_register_handler("lala", "The LaLa query handler", 0, lala_query_handler); @endcode The second argument is a description, which will be printed when someone sends a help request. @note It's a good idea to handle queries such as "help" and take them to mean "print me some text telling me at least the basics of how to use this query handler". @section syntax Syntax The query language is remarkably simple (although each handler may implement its own parsers that handle and do pretty much whatever they want). The first byte is magic. If it's an at-sign, we expect the queryer to persist and issue more queries after the first one. If it's a hash-sign, the query handler will disconnect the client as soon as it regains control from whatever handler registered for the particular address. Each particular handler has some control over this behaviour though, and can use specific return codes to denote that it will take over the socket from the query handler. If no at-sign and no hash-sign is present at the first byte, the -1'th byte will be considered an at-sign, and the connection will consequently be considered persistent. @subsection qh_examples Example queries Subscribe for real-time push-events for servicechecks from the NERD radio: @verbatim @nerd subscribe servicechecks\0 @endverbatim One-shot query the core query handler for current load-control options: @verbatim #core loadctl\0 @endverbatim Get Nagios to say hi to you: @verbatim #echo Greetings, Exalted One @endverbatim Ask the help handler to list registered handlers: @verbatim #help list @endverbatim @section icqh In-core query handlers There are a few in-core query handlers. @subsection help The help service The help query handler is quite possibly the most important one. It can be used to list registered handlers (with short descriptions), and can be used to get help about registered handlers (assuming they've implemented it, that is). It should be noted that the ones that *have* implemented it can also be queried directly for their help output, like so: @verbatim @core help @endverbatim @subsection echo The echo service As I'm sure you've already guessed, the echo service just prints the inbound data right back at you. While that's not exactly nobel prize winning material, it's actually pretty nifty to figure out how fast Nagios can parse its inbound data, which in turn shows how fast it can handle its inbound checkresults, which puts an upper cap on how many checks Nagios can handle at any given time (although short bursts that exceed that limit are ok and will be handled just fine). It can be addressed as such: @verbatim @echo foo bar baz said the bunny\0 @endverbatim @subsection nerd Nagios Event Radio Dispatcher The nerd radio is subscribed in fuller detail at @see nerd, but its worth knowing that it's a core part of Nagios 4 and that it will always be available. @subsection wproc Worker process manager The worker process manager lets you register workers that can help out with running checks, send notifications, run eventhandlers or whatever. In order to register a worker that only handles checks supposed to be run by the plugins check_foo and check_bar (irrespective of where in the paths they are), you'd do something like this: @verbatim @wproc register name=foobar;plugin=check_foo;plugin=check_bar\0 @endverbatim */ nagios-4.3.4/docs/workers.dox000066400000000000000000000242561314764422400161620ustar00rootroot00000000000000/** @page wprocs Worker Processes Everything related to worker processes. [TOC] @section philosophy Philosophy The idea behind separate worker processes is to achieve protected parallelization. Protected because a worker being naughty shouldn't affect the core process, and parallel because we use multiple workers. Ideally between 1.5 and 3 per CPU core available to us. Workers are free-standing processes, kept small, and with no knowledge about Nagios' object structure or logic. The reason for this is that small processes can achieve a lot more fork()s per second than large processes (800/sec for a 300MB process against 13900/sec for a 1MB process). While workers can (and do) grow a little bit in memory usage when it's running many checks in parallel, they will still be a lot smaller than the primar Nagios daemon, and the memory they occupy should be released once the checks they're running are done. @section protocol Protocol Workers use a text-based protocol to communicate with workers. It's fairly simple and very easy to debug. The breakdown goes as follows: @li A request consists of a sequence of key/value pairs. @li A key is separated from its value with an equal sign ('='). @li A key/value pair is separated from the next key/value pair with a nul byte ('\0'). @li Each request is separated from the next with a message delimiter sequence made up by a one-byte followed by three nul bytes: "\1\0\0\0". @li Keys cannot contain equal signs. underscores and numbers. @li Values cannot contain nul bytes. @li Neither keys nor values can contain the message delimiter. @li A zero-length value is considered to be the empty string. @note Even though it's technically legal to put almost anything in the key field, you should stick to mnemonic names when extending the protocol and just use lower case letters and underscores. @note Keys are case sensitive. JOB_ID is *not* the same as job_id. @subsection apis API's Worker processes communicate with Nagios using libnagios API's exclusively. Since you're looking at a subpage of the documentation for that documentation right now, I'll just assume you've found it. Although using the libnagios api's when writing a worker is completely optional, it's highly recommended. The key API's to use are: @li nsock - for connecting to and communicating through the qh socket @li kvvec - for parsing requests and building responses @li worker - for utils and stuff nifty to have if you're a worker @li runcmd - for spawning and reaping commands @li squeue - for maintaining a queue of the running job's timeouts @li iocache - for bulk-reading requests and parsing them @li iobroker - for multiplexing between running tasks and the master nagios process. @note In particular, have a look at the "parse_command_kvvec()" and "finish_job()" functions in lib/worker.c. They will do a large part of the request/response handling for you. @section registering Registering a worker - The handshake Workers register with Nagios through the queryhandler, using a query sent to the wproc handler. Since the query handler reserves the nul byte as a magic delimiter for its messages, this one time we use the semicolon instead, as is almost-standard in the internal-only queryhandlers. Typically, the default worker process registers with a query such as this: @verbatim @wproc register name=Core Worker $pid;pid=$pid\0 @endverbatim Nagios will then respond with @verbatim OK\0 @endverbatim followed by a stream of commands. Nagios currently understands the following (short) list of special keys: @li pid - The pid of the worker process. Sometimes used to check if a worker is online @li name - Used to set the name of the worker @li max_jobs - Used to tell Nagios how many concurrent jobs this worker can handle @li plugin - basename() or absolute path of specific plugins that this worker wants to handle checks for. @note plugin can be given multiple times. It is valid for a single single worker to say "plugin=check_snmp;plugin=check_iferrors", for example. @note Many workers can register for the same plugin(s). They will share the load in round-robin fashion. Complete C-code for registering a generic worker with Nagios follows: @code static int nagios_core_worker(const char *path) { int sd, ret; char response[128]; is_worker = 1; set_loadctl_defaults(); sd = nsock_unix(path, NSOCK_TCP | NSOCK_CONNECT); if (sd < 0) { printf("Failed to connect to query socket '%s': %s: %s\n", path, nsock_strerror(sd), strerror(errno)); return 1; } ret = nsock_printf_nul(sd, "@wproc register name=Core Worker %d;pid=%d", getpid(), getpid()); if (ret < 0) { printf("Failed to register as worker.\n"); return 1; } ret = read(sd, response, 3); if (ret != 3) { printf("Failed to read response from wproc manager\n"); return 1; } if (memcmp(response, "OK", 3)) { read(sd, response + 3, sizeof(response) - 4); response[sizeof(response) - 2] = 0; printf("Failed to register with wproc manager: %s\n", response); return 1; } enter_worker(sd, start_cmd); return 0; } @endcode The "enter_worker()" part actually refers to a libnagios function that lives in worker.c. The set_loadctl_defaults() call can be ignored. It's primarily intended to give sane defaults about how many jobs we can run, so we (in theory) can tell Nagios that we're swamped in case we run out of filedescriptors or child processes. @subsection request Requests A complete request looks like this (with C-style format codes replaced with actual values, ofcourse): @verbatim job_id=%d\0type=%d\0command=%s\0timeout=%u\0\1\0\0\0 @endverbatim Note that values can contain equal signs, but cannot contain nul bytes, and cannot contain the message delimiter sequence. By including nagios/lib/worker.h and using worker_ioc2msg() followed by worker_kvvec2buf_prealloc(), you will get a parsed key/value vector handed to you. Have a look in base/workers.c to see how it's done for the core workers. @subsection responses Responses Once the worker is done running a task, it hands over the result to the master Nagios process and forgets it ever ran the job. The workers take no further action, regardless of how the task went. The exception is if the job timed out, or if the worker failed to even start the job, in which case it should report the error to Nagios and only *then* forget it ever got the job. The response is identical to the request in formatting but differs in the understood keys. The request sent from Nagios to the worker must precede the other result variables. In particular, the job_id must be the first variable Nagios sees for it to parse the result as a job result rather than as something else. The variables required for the response to a successfully executed job on a registered worker process are as follows: @li job_id - The job id (as received by Nagios) @li type - The job type (as Nagios sent it) @li start - Timeval struct for start value in $sec.$usec format @li stop - Timeval struct for stop time in $sec.$usec format @li runtime - Floating point value of runtime, in seconds @li outstd - Output caught on stdout @li outerr - Output caught on stderr @li exited_ok - Boolean flag to denote if the job exited ok. A non-zero return code can still be achieved @li wait_status - Integer, as set by the wait() family of system calls The following should only be present when the worker is unable to execute the check due to an error, or when it cannot provide all the variables required for a successfully executed job due to arbitrary system errors: @li error_msg - An error message generated by the worker process @li error_code - The error code generated by the worker process error_code 62 (ETIME - Timer expired) is reserved and means that the job timed out. @note *never* invent error codes in the range 0-10000, since we'll want to reserve that for special cases. The following are completely optional (for now): @li command - The command we executed @li timeout - The timeout Nagios requested for this job @li ru_nsignals - The ru_nsignals field from the rusage struct @li ru_nswap - The ru_nswap field from the rusage struct @li ru_minflt - The ru_minflt field from the rusage struct @li ru_majflt - The ru_majflt field from the rusage struct @li ru_stime - The ru_stime field from the rusage struct @li ru_utime - The ru_utime field from the rusage struct @li ru_inblock - The ru_inblock field from the rusage struct @li ru_oublock - The ru_oublock field from the rusage struct The meaning of the fields of the rusage struct can be viewed in the section 2 man-page for the getrusage() system call. Normally, you would access it by executing the following command: @verbatim man 2 getrusage @endverbatim Note that most systems do not support all the fields of the rusage struct and may leave them empty if so. @section logging Logging Worker processes can send events to the main Nagios process that will end up in the nagios.log file. The format is the same as that in requests and responses, but a log-message consists of a single key/value pair, where the key is always 'log'. Consequently, a request from a worker to the main process to log something looks like this: @verbatim log=A random message that will get logged to nagios.log\0 @endverbatim It's worth noting that Nagios will prefix the message with the worker process name, so as to make grep'ing easy when debugging experimental workers. @section xchgexample Protocol Exchange Example A register + execution of one job on a worker process will, with the standard Nagios core worker look like this, after the worker process has connected to the query handler socket but before it has sent anything. Note that the nul-bytes separating key/value pairs have been replaced with newline to enhance readability. Also note that this depicts only the required steps, which go as follows: @verbatim Step 1, Worker: @wproc register name=Worker Hoopla;max_jobs=100;pid=6196\0 Step 2, Nagios: OK\0 Step 3, Nagios: job_id=0 type=2 timeout=60 command=/opt/plugins/check_ping -H localhost -w 40%,100.0 -c 60%,200.0 \1\0\0\0 Step 4, Worker: job_id=0 type=2 timeout=60 start=1355231532.000123 stop=1355231532.994343 runtime=0.994120 exited_ok=1 outstd=OK: RTA: 12.6ms; PL: 0%|rta=12.6ms;100.0;200.0;0;; pl=0%;40;60 wait_status=0 outerr= \1\0\0\0 @endverbatim Steps 3 and 4 in this chain repeat indefinitely. */ nagios-4.3.4/doxy.conf000066400000000000000000000015661314764422400146530ustar00rootroot00000000000000PROJECT_NAME = Nagios PROJECT_NUMBER = 4.3.4 PROJECT_BRIEF = "Dev docs for Nagios core and neb-module hackers" INPUT = lib/ docs/ FILE_PATTERNS = *.h *.dox EXCLUDE_PATTERNS = worker.h OUTPUT_DIRECTORY = Documentation GENERATE_TAGFILE = Documentation/classes.tag QUIET = YES RECURSIVE = YES GENERATE_LATEX = NO GENERATE_HTML = YES TAB_SIZE = 4 JAVADOC_AUTOBRIEF = YES MACRO_EXPANSION = YES EXPAND_ONLY_PREDEF = YES OPTIMIZE_OUTPUT_FOR_C = YES STRIP_CODE_COMMENTS = NO FULL_PATH_NAMES = NO CASE_SENSE_NAMES = YES ENABLE_PREPROCESSING = YES PREDEFINED = NODOXY "NAGIOS_DEPRECATED(a, b)=" SEARCH_INCLUDES = YES INCLUDE_GRAPH = YES CLASS_GRAPH = YES CLASS_DIAGRAMS = YES COLLABORATION_GRAPH = YES INCLUDED_BY_GRAPH = YES CALL_GRAPH = YES GRAPHICAL_HIERARCHY = YES nagios-4.3.4/functions000077500000000000000000000155611314764422400147570ustar00rootroot00000000000000#!/bin/sh # # functions This file contains functions to be used by most or all # shell scripts in the /etc/init.d directory. # # Version: @(#) /etc/init.d/functions 1.01 26-Oct-1993 # # Author: Miquel van Smoorenburg, # Hacked by: Greg Galloway and Marc Ewing # Karl DeBisschop (19991018 for solaris) # # First set up a default search path. PATH=/opt/gnu/bin:/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin export PATH # Get a sane screen width [ -z "$COLUMNS" ] && COLUMNS=80 # Read in our configuration if [ -z "$BOOTUP" ]; then if [ -f /etc/sysconfig/init ]; then . /etc/sysconfig/init else # This all seem confusing? Look in /etc/sysconfig/init, # or in /usr/doc/initscripts-*/sysconfig.txt BOOTUP=color RES_COL=20 MOVE_TO_COL="printf \033[300C\033[%dD ${RES_COL}" SETCOLOR_SUCCESS='printf \033[1;%dm 32' SETCOLOR_FAILURE='printf \033[1;%dm 31' SETCOLOR_WARNING='printf \033[1;%dm 33' SETCOLOR_NORMAL='printf \033[0;%dm 39' LOGLEVEL=1 fi fi if [ "$BOOTUP" != "verbose" ]; then INITLOG_CMD="initlog -q -c" else INITLOG_CMD="initlog -q -c" fi #if which initlog | egrep "^no initlog" >/dev/null 2&1; then # INITLOG_CMD="" #fi #if which initlog | egrep "^no pidof" >/dev/null 2>&1; then # IN_INITLOG="not found" #else # IN_INITLOG= #fi # A function to start a program. daemon() { # Test syntax. gotbase= case $1 in '') echo '$0: Usage: daemon [+/-nicelevel] {program}' return 1;; --check) shift base=$1 gotbase="yes" shift nicelevel=0 ;; -*|+*) nicelevel=$1 shift;; *) nicelevel=0;; esac # Save basename. [ -z $gotbase ] && base=`basename $1` # See if it's already running. pid=`pidofproc $base` [ -n "$pid" ] && ps -p $pid >/dev/null 2>&1 && return # make sure it doesn't core dump anywhere; while this could mask # problems with the daemon, it also closes some security problems ulimit -c 0 # Echo daemon [ "$BOOTUP" = "verbose" ] && printf " $base" # And start it up. nice -n $nicelevel $INITLOG_CMD "$*" && success "$base startup" || failure "$base startup" } # A function to stop a program. killproc() { # Test syntax. if [ $# = 0 ]; then echo "Usage: killproc {program} [signal]" return 1 fi notset=0 # check for second arg to be kill level if [ "$2" != "" ] ; then killlevel=$2 else notset=1 killlevel="-9" fi # Save basename. base=`basename $1` # Find pid. pid=`pidofproc $base` # Kill it. if [ "$pid" != "" ] ; then [ $BOOTUP = "verbose" ] && printf "$base " if [ "$notset" = "1" ] ; then if ps -p $pid>/dev/null 2>&1; then # TERM first, then KILL if not dead kill -TERM $pid sleep 1 if ps -p $pid >/dev/null 2>&1 ; then sleep 1 if ps -p $pid >/dev/null 2>&1 ; then sleep 3 if ps -p $pid >/dev/null 2>&1 ; then kill -KILL $pid fi fi fi fi ps -p $pid >/dev/null 2>&1 && failure "$base shutdown" || success "$base shutdown" # use specified level only else if ps -p $pid >/dev/null 2>&1; then kill $killlevel $pid && success "$base $killlevel" || failure "$base $killlevel" fi fi else failure "$base shutdown" fi # Remove pid file if any. if [ "$notset" = "1" ]; then rm -f /var/run/$base.pid fi } # A function to find the pid of a program. pidofproc() { # Test syntax. if [ $# = 0 ] ; then echo "Usage: pidofproc {program}" return 1 fi # First try "/var/run/*.pid" files if [ -f /var/run/$1.pid ] ; then pid=`head -1 /var/run/$1.pid` if [ "$pid" != "" ] ; then echo $pid return 0 fi fi # Next try "pidof" # if which pidof | egrep -v "^no pidof" >/dev/null 2>&1; then # pid=`pidof $1` # if [ "$pid" != "" ] ; then # echo $pid # return 0 # fi # fi # Finally try to extract it from ps pid=`ps -eo pid,ppid,fname | egrep -v $$ | awk 'BEGIN { prog=ARGV[1]; ARGC=1 } { if ((prog == $3) || (("(" prog ")") == $3) || (("[" prog "]") == $3) || ((prog ":") == $3)) { print $1 ; exit 0 } }' $1` if [ "$pid" != "" ] ; then echo $pid return 0 fi return 2 } status() { # Test syntax. if [ $# = 0 ] ; then echo "Usage: status {program}" return 1 fi base=`basename $1` pid=`pidofproc $base` if [ "$pid" != "" ] ; then echo "$1 (pid $pid) is running..." return 0 fi # Next try "/var/run/*.pid" files if [ -f /var/run/$1.pid ] ; then pid=`head -1 /var/run/$1.pid` if [ "$pid" != "" ] ; then echo "$1 dead but pid file exists" return 1 fi fi # See if /var/lock/subsys/$1 exists if [ -f /var/lock/subsys/$1 ]; then echo "$1 dead but subsys locked" return 2 fi echo "$1 is stopped" return 3 } echo_success() { [ "$BOOTUP" = "color" ] && $MOVE_TO_COL printf "[ " [ "$BOOTUP" = "color" ] && $SETCOLOR_SUCCESS printf "OK" [ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL printf " ]" return 0 } echo_failure() { [ "$BOOTUP" = "color" ] && $MOVE_TO_COL printf "[" [ "$BOOTUP" = "color" ] && $SETCOLOR_FAILURE printf "FAILED" [ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL printf "]" return 1 } echo_passed() { [ "$BOOTUP" = "color" ] && $MOVE_TO_COL printf "[" [ "$BOOTUP" = "color" ] && $SETCOLOR_WARNING printf "PASSED" [ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL printf "]" return 1 } # Log that something succeeded success() { if [ -z "$IN_INITLOG" ]; then # initlog -n $0 -s "$1" -e 1 logger -t $0 "Success: $1" else logger -t $0 "Success: $1" # echo "-n $0 -s \"$1\" -e 1" >&21 fi [ "$BOOTUP" != "verbose" ] && echo_success return 0 } # Log that something failed failure() { rc=$? if [ -z "$IN_INITLOG" ]; then logger -t $0 "Failure: $1" # initlog -n $0 -s "$1" -e 2 else logger -t $0 "Failure: $1" # echo "-n $0 -s \"$1\" -e 2" >&21 fi [ "$BOOTUP" != "verbose" ] && echo_failure return $rc } # Log that something passed, but may have had errors. Useful for fsck passed() { rc=$? if [ -z "$IN_INITLOG" ]; then logger -t $0 "Success: $1" # initlog -n $0 -s "$1" -e 1 else logger -t $0 "Success: $1" # echo "-n $0 -s \"$1\" -e 1" >&21 fi [ "$BOOTUP" != "verbose" ] && echo_passed return $rc } # Run some action. Log its output. action() { STRING=$1 printf "$STRING " shift $INITLOG_CMD "$*" && success "$STRING" || failure "$STRING" rc=$? echo return $rc } # Confirm whether we really want to run this service confirm() { printf "Start service $1 (Y)es/(N)o/(C)ontinue? [Y] " read answer case $answer in y|Y|"") return 0 ;; c|C) return 2 ;; n|N) return 1 ;; *) confirm $1 return $? ;; esac } nagios-4.3.4/html/000077500000000000000000000000001314764422400137555ustar00rootroot00000000000000nagios-4.3.4/html/.gitignore000066400000000000000000000000551314764422400157450ustar00rootroot00000000000000Makefile index.html side.html config.inc.php nagios-4.3.4/html/Makefile.in000066400000000000000000000145121314764422400160250ustar00rootroot00000000000000CC=@CC@ CFLAGS=@CFLAGS@ @DEFS@ LDFLAGS=@LDFLAGS@ @LIBS@ prefix=@prefix@ exec_prefix=@exec_prefix@ LOGDIR=@localstatedir@ CFGDIR=@sysconfdir@ BINDIR=@bindir@ CGIDIR=@sbindir@ HTMLDIR=@datadir@ datarootdir=@datarootdir@ INSTALL=@INSTALL@ INSTALL_OPTS=@INSTALL_OPTS@ COMMAND_OPTS=@COMMAND_OPTS@ CP=@CP@ all html: (cd angularjs && unzip -u angular-1.3.9.zip) (cd angularjs && unzip -u ui-utils-0.2.1.zip) if [ ! -d bootstrap-3.3.0 ] ; then mkdir -p bootstrap-3.3.0 && ( cd bootstrap-3.3.0 && unzip -u ../bootstrap-3.3.0-dist.zip && mv dist/* . && rmdir dist ) ; fi mkdir -p d3 (cd d3 && unzip -u ../d3-3.5.3.zip) clean: rm -f *.cfg *.sub core rm -f *~ rm -f images/*.jbf rm -f images/logos/*.jbf rm -f contexthelp/*~ rm -f docs/*~ rm -f docs/images/*.jbf rm -f stylesheets/*~ rm -f js/*~ rm -rf angularjs/angular-1.3.9 rm -rf angularjs/ui-utils-0.2.1 rm -rf bootstrap-3.3.0 rm -rf d3 distclean: clean rm -f Makefile config.inc.php devclean: distclean install: $(INSTALL) -m 775 $(INSTALL_OPTS) -d $(DESTDIR)$(HTMLDIR) $(INSTALL) -m 775 $(INSTALL_OPTS) -d $(DESTDIR)$(HTMLDIR)/media $(INSTALL) -m 775 $(INSTALL_OPTS) -d $(DESTDIR)$(HTMLDIR)/stylesheets $(INSTALL) -m 775 $(INSTALL_OPTS) -d $(DESTDIR)$(HTMLDIR)/contexthelp $(INSTALL) -m 775 $(INSTALL_OPTS) -d $(DESTDIR)$(HTMLDIR)/docs $(INSTALL) -m 775 $(INSTALL_OPTS) -d $(DESTDIR)$(HTMLDIR)/docs/images $(INSTALL) -m 775 $(INSTALL_OPTS) -d $(DESTDIR)$(HTMLDIR)/js $(INSTALL) -m 775 $(INSTALL_OPTS) -d $(DESTDIR)$(HTMLDIR)/images $(INSTALL) -m 775 $(INSTALL_OPTS) -d $(DESTDIR)$(HTMLDIR)/images/logos $(INSTALL) -m 775 $(INSTALL_OPTS) -d $(DESTDIR)$(HTMLDIR)/includes $(INSTALL) -m 775 $(INSTALL_OPTS) -d $(DESTDIR)$(HTMLDIR)/ssi # Directories for new CGI pages $(INSTALL) -m 775 $(INSTALL_OPTS) -d $(DESTDIR)$(HTMLDIR)/angularjs $(INSTALL) -m 775 $(INSTALL_OPTS) -d $(DESTDIR)$(HTMLDIR)/angularjs/angular-1.3.9 $(INSTALL) -m 775 $(INSTALL_OPTS) -d $(DESTDIR)$(HTMLDIR)/angularjs/ui-utils-0.2.1 $(INSTALL) -m 775 $(INSTALL_OPTS) -d $(DESTDIR)$(HTMLDIR)/bootstrap-3.3.0 $(INSTALL) -m 775 $(INSTALL_OPTS) -d $(DESTDIR)$(HTMLDIR)/bootstrap-3.3.0/css $(INSTALL) -m 775 $(INSTALL_OPTS) -d $(DESTDIR)$(HTMLDIR)/d3 $(INSTALL) -m 775 $(INSTALL_OPTS) -d $(DESTDIR)$(HTMLDIR)/spin # End of directories for new CGI pages $(INSTALL) -m 664 $(INSTALL_OPTS) robots.txt $(DESTDIR)$(HTMLDIR) # $(INSTALL) -m 664 $(INSTALL_OPTS) docs/robots.txt $(DESTDIR)$(HTMLDIR)/docs # Remove old files rm -f $(DESTDIR)$(HTMLDIR)/index.html rm -f $(DESTDIR)$(HTMLDIR)/main.html rm -f $(DESTDIR)$(HTMLDIR)/side.html rm -f $(DESTDIR)$(HTMLDIR)/map.html rm -f $(DESTDIR)$(HTMLDIR)/rss-* rm -rf $(DESTDIR)$(HTMLDIR)/include/rss $(INSTALL) -m 664 $(INSTALL_OPTS) jsonquery.html $(DESTDIR)$(HTMLDIR) # New graphical CGI pages $(INSTALL) -m 664 $(INSTALL_OPTS) graph-header.html $(DESTDIR)$(HTMLDIR) $(INSTALL) -m 664 $(INSTALL_OPTS) histogram.html $(DESTDIR)$(HTMLDIR) $(INSTALL) -m 664 $(INSTALL_OPTS) histogram-form.html $(DESTDIR)$(HTMLDIR) $(INSTALL) -m 664 $(INSTALL_OPTS) histogram-graph.html $(DESTDIR)$(HTMLDIR) $(INSTALL) -m 664 $(INSTALL_OPTS) histogram-links.html $(DESTDIR)$(HTMLDIR) $(INSTALL) -m 664 $(INSTALL_OPTS) infobox.html $(DESTDIR)$(HTMLDIR) $(INSTALL) -m 664 $(INSTALL_OPTS) map.php $(DESTDIR)$(HTMLDIR) $(INSTALL) -m 664 $(INSTALL_OPTS) map-directive.html $(DESTDIR)$(HTMLDIR) $(INSTALL) -m 664 $(INSTALL_OPTS) map-form.html $(DESTDIR)$(HTMLDIR) $(INSTALL) -m 664 $(INSTALL_OPTS) map-links.html $(DESTDIR)$(HTMLDIR) $(INSTALL) -m 664 $(INSTALL_OPTS) map-popup.html $(DESTDIR)$(HTMLDIR) $(INSTALL) -m 664 $(INSTALL_OPTS) trends.html $(DESTDIR)$(HTMLDIR) $(INSTALL) -m 664 $(INSTALL_OPTS) trends-form.html $(DESTDIR)$(HTMLDIR) $(INSTALL) -m 664 $(INSTALL_OPTS) trends-graph.html $(DESTDIR)$(HTMLDIR) $(INSTALL) -m 664 $(INSTALL_OPTS) trends-host-yaxis.html $(DESTDIR)$(HTMLDIR) $(INSTALL) -m 664 $(INSTALL_OPTS) trends-links.html $(DESTDIR)$(HTMLDIR) $(INSTALL) -m 664 $(INSTALL_OPTS) trends-service-yaxis.html $(DESTDIR)$(HTMLDIR) # End of new graphical CGI pages for file in *.php; \ do $(INSTALL) -m 664 $(INSTALL_OPTS) $$file $(DESTDIR)$(HTMLDIR); done # for file in media/*.wav; \ # do $(INSTALL) -m 664 $(INSTALL_OPTS) $$file $(DESTDIR)$(HTMLDIR)/media; done for file in stylesheets/*.css; \ do $(INSTALL) -m 664 $(INSTALL_OPTS) $$file $(DESTDIR)$(HTMLDIR)/stylesheets; done for file in contexthelp/*.html; \ do $(INSTALL) -m 664 $(INSTALL_OPTS) $$file $(DESTDIR)$(HTMLDIR)/contexthelp; done for file in js/*.js; \ do $(INSTALL) -m 664 $(INSTALL_OPTS) $$file $(DESTDIR)$(HTMLDIR)/js; done # for file in docs/*.html; \ # do $(INSTALL) -m 664 $(INSTALL_OPTS) $$file $(DESTDIR)$(HTMLDIR)/docs; done # for file in docs/images/*.*; \ # do $(INSTALL) -m 664 $(INSTALL_OPTS) $$file $(DESTDIR)$(HTMLDIR)/docs/images; done for file in images/*.gif; \ do $(INSTALL) -m 664 $(INSTALL_OPTS) $$file $(DESTDIR)$(HTMLDIR)/images; done for file in images/*.jpg; \ do $(INSTALL) -m 664 $(INSTALL_OPTS) $$file $(DESTDIR)$(HTMLDIR)/images; done for file in images/*.png; \ do $(INSTALL) -m 664 $(INSTALL_OPTS) $$file $(DESTDIR)$(HTMLDIR)/images; done for file in images/*.ico; \ do $(INSTALL) -m 664 $(INSTALL_OPTS) $$file $(DESTDIR)$(HTMLDIR)/images; done for file in images/logos/*.*; \ do $(INSTALL) -m 664 $(INSTALL_OPTS) $$file $(DESTDIR)$(HTMLDIR)/images/logos; done for file in includes/*.*; \ do $(INSTALL) -m 664 $(INSTALL_OPTS) $$file $(DESTDIR)$(HTMLDIR)/includes; done # Support files for new graphical CGIs $(INSTALL) -m 664 $(INSTALL_OPTS) angularjs/angular-1.3.9/angular.min.js $(DESTDIR)$(HTMLDIR)/angularjs/angular-1.3.9 $(INSTALL) -m 664 $(INSTALL_OPTS) angularjs/angular-1.3.9/angular.min.js.map $(DESTDIR)$(HTMLDIR)/angularjs/angular-1.3.9 $(INSTALL) -m 664 $(INSTALL_OPTS) angularjs/ui-bootstrap-tpls-0.12.0.min.js $(DESTDIR)$(HTMLDIR)/angularjs $(INSTALL) -m 664 $(INSTALL_OPTS) angularjs/ui-utils-0.2.1/ui-utils.js $(DESTDIR)$(HTMLDIR)/angularjs/ui-utils-0.2.1 $(INSTALL) -m 664 $(INSTALL_OPTS) bootstrap-3.3.0/css/bootstrap.min.css $(DESTDIR)$(HTMLDIR)/bootstrap-3.3.0/css $(INSTALL) -m 664 $(INSTALL_OPTS) bootstrap-3.3.0/css/bootstrap-theme.min.css $(DESTDIR)$(HTMLDIR)/bootstrap-3.3.0/css $(INSTALL) -m 664 $(INSTALL_OPTS) d3/d3.min.js $(DESTDIR)$(HTMLDIR)/d3 $(INSTALL) -m 664 $(INSTALL_OPTS) spin/spin.min.js $(DESTDIR)$(HTMLDIR)/spin # End of support files for new graphical CGIs install-unstripped: $(MAKE) install nagios-4.3.4/html/angularjs/000077500000000000000000000000001314764422400157435ustar00rootroot00000000000000nagios-4.3.4/html/angularjs/angular-1.3.9.zip000066400000000000000000440504631314764422400206060ustar00rootroot00000000000000PK y.Fangular-1.3.9/PKy.F angular-1.3.9/angular-animate.js{wSɵ/>ł0blMB1 { Nzgpzek(Ȓ#ɀ7w|TZk`ВV=55͛nVɼ'g?W׫޾s{tz<7~r85^cvyݭ?_&t{3 o6*QMhR׫wkgakկnVMܭcxOd:<ׂdpRWdПp6:hV{/j?5ڷlzt:[TGY׃yj1L#,۫hƙ2/N_ͫ70귣b4936Vgf5( ? G+ HmNONz߻@?lϯVV:2@`QլbZB)HH`>$AY} Y5 ؿ dDz8D~ЗDPМK58!?.A>Obam_ϱ/W,~~/+v~i.Nu8T+Pfz0Y(KhΫ9טܿXkx z1z 1ȀGkrs*:s gjH꾳Y~mGM~U595,봦s4P6~QtB*pE=ۨꗓ)>|_gӳE]O)/ .ڥ z)p#aR +!>0G%>dg/Eu%' SG5kS!^aJ7K4aٞv>9|T2{j# ȦPq9.qX~ڠC/7@jqpn|%M83}c:┠g0ׂKsmAqzr~P'@&4 y3. +%F2P58u^3/{Tb^X< ]t;?HPi ^ɘa8Evu8_7_`ź5PjM}jW8Ѫc]V7ol02& )ˑmH,'`q&eC VNw'O|CaKVc?\$ڕR5@4҈e`A2RY/1RU0C[UqHtzg0FL_u} 4d Ĉ1>upl21?_C}NLAɐsM#5dqZ!DtG<#bE(fƷsp:SHTo x=[1w@ JؕD`FUmd_{t}lN)t*m뷧cKz@I`qI|A9d `.x$sf4ľcaAM~EJ}k1gDJ%BE%T\VKţqi|a~j[*lRqDb?q'"^NJ0'Nړ٦RUZI)|pE:!) b:^OG<'s^ ^ϧdGeH TH1ưfΆתIz z3 zSH FZAg\Tc, a=&BD0.DtrPE>m<89w@qHIYn)&c_͇@|8 iDp&#sdNIa!bP:823i&e[-FHBbѧC%oDL7uo;I梘Bs6-R'm4ȔN!׌O* jȧ6zpFDY`Ph!$INEWg_QREΏw̑R\2)3=D O̤b~09R!Ӑd:^ChHmCD[J0o4fZM&OΩCU/I@H_iu aW>%L(?0$g(9^ZQfh1gsu6;|NjC|p4v^Bq D(>a%]SȅञAU)=ܽsVPhaNd)X+Tu@bz g`q~-aZNOVAW>ԑ@!k#rv\PcEhĩtr _ i=yLJI%(ҼFF;idb>Oiv&ϑ U iEO儯S& A8RQȒ(֥"3 yDEw!n<|~ֱ?Ø_>}@KP dBm5"1cw]Mjxfz) ACh 1@83F3l9*wc7jMUEՅMp83̈́t8l.xiXS8pGpSQ4n奯y9?6H!! m5www<6?=Ԍ8ͪp ;u-ͭ%CDnl.T3iy3+ qS`nH,$"=:9RE. 1h#?&p;ܣV]H`0lh~UOa9t& f9D ՝-5 9X>0$z 4P C5V&l 9F`l(n4"R!Vmf"zqvZ1/HY s`y IMEY7P@|@&@aQO dAi<&*H Wh՛Yx˱,`[v &alBca -'rP+A%e~>\\-)&;GΏ0,P^6({Ogģ#AptwdBP" .$ (T!pE@- 4pTA?SE3en6Ĩh@|IYӽHݼyBa'{pe%[*Aq Rg7aFn0^OE\YHڣbaT&JDI#2Ѱ*ŜoqɫpC1elgF1gd_9+_fIa191GHK$5 -.? S1PmSbqhRfo4Ma0yɿ쨜%:b#'X=@V(2oC2q(ZieZn.΢#$~5fGܾ`7M1DpHE81rMa3tv"'A[CD(>ǖ*3ttՑI$_a)Z$IB s#U7EDq/5'YޖOApz6u ڔ|j10%%_Ķ$'*{\ Z%Ӑ`䵧gjB'SLݰRb'%ͅbT~o $Lv=+uHAM8B:T+nIʬg/)!Ed\“<}!bq DSoIZ&s>z+3G;f;#7Z 9P m 9`[4+st}DŽEr(]`j{&,X0>hs[lɌ2 #ӬXTu;9/a.p6/U"VA (b}it&\#&spC/ :$},xףLBs`5Z x1p.0)6 aLH;].s^F'I5 &y5Z΋=aILKu!R=_*%#Ϡ|SoF)܄[t?4H-`ia!ITQj~wZ/?'Fy0#ӳ,C.E I;S\c \mgQe;>F5^H=B sW(|8~$ }L١јLC ( ؔ[[{P:=;߮{85#&R{JD$΁^jvagݿ>۴ò㸺[AV8EIb9#'Mu|g}oj5"Pk(.xt06s.v:3bԗ?=L(u֔?ݥ6=T)x:#3$gWGzr|˝.PXoCu^t< 483~5w f%Twn>aNYeܯUGi7UfZ|ȌUbm"ߙ!9c^INNp6w||~ !m5M|#bWiNӅS^`lh ;Ո.hNn.udzS˔#~JջbkRnElDDu*˱d /o!%*+2qF&EYijaK,4z[[פy{b: g^خ)֟pL6K@ (: `7 )t FBFC Zg3k} \g/ K -6&I(a,$i+ҭAP钷?s+4 0HXmp𲘔 {S90<ߡ99:R2|$mm9 ƌrxO_ˁb`gSreR O/ |h-K[:OqҤ|J |/axCl:$߫7…IP摬3 TolOTMvMrX+fw'oׇ?}$ڍSH௙"BѸQ8b)aauԊiϥe4Gy8u=׫#Z޽{m g~fDH8@<<#N{CԿA*|m%*]|B< ?*Ly , dHb)5c-Fz#'R=9~] cSg!*0bc=s:Ox8j)P 20l-;b~,9Y}N4@nһ3^t\"g`dƃ̘a um}4vjdUVʺr,'2ր6$"!P ο."`^02+n~H*?aoЧZR|v VـW{{Z+"8S z!@xh.Փ{ճO['eF. #叠حw4("f-k7̊fr[9>~NŇX]^y/'oHs|{6C_bUE)6z86IHh1I~|.3Iо`d4l:IӅY;?ce.taeVk/w|<`pV GƕD0}x89̐.vV'hoJs Í?^$s)t# p?Rj?mH2meqR9>7Ow8' VlLtS݌gsW\'w蚜ꝑ:,ٛ1%Y7n_FZwѷ'L"*nA=M}LƧ/h”t&_9c$ɯ';KMMgon Ka`:\i$1By`I0I>}Sj"07I4` (ᄀJi@ hyh6pG)X>yk7&LCagXH8FBy$Qy*Q;d Y%ZNFb6'؜%ʌ/( %Qwi3P^h0 daۙ'8펖!N_V<8tfB{eV)}\-R^}hj7p!r.gJo>>@N\=񰺦ʼ34[k~18,)ζ_%[tAAޤn,XҢJ]Y`_N@0ǾoȏkwaN롃_KXᠣ_ ~\BJJr\P;1Ǎ\-ex\ !ȟ&3@Ovs#(&rk9FҔn/0p:{D&s_W>)`~Vp[f2/cJwVi6e \FMAVTݫ5zU  6Ia9 Zmjn@j + &S| a[^4WENe>:JT'J_?U$HQ0AaB@Gy '_C) *(0~{ j!l3?.]j Ct %_Ch '[@#@Y8dP? iNT nV*OjinK!{'F[NgHAZؼ^ npb=(Wr+uh]Tdy6sAdɃB3H+y6=>I0PfFs [傳o͡NNwAOȎ(<)Wic?>ĢKR2YҒڠ`C11Y0ƺۖXCj7SKTh,u!:DA>,k ҪT ԒzXFj 8k HK{<-? W)Ҩ7r.2gMz\iEWgZzڜz1EV׌vV8@XAa q'g"5s=G )ۡT쪭H):2Y~p{JVAZyM`OIH,V.w@05i;`5YJlU)[8q $e0Rx0ʫz8ꢬ;H[z8q@ >dСYrD"ṍ&D@U $@ʞmsu@=_[Hb0\U@Y_6f4'ѷoei^v#f'x%9UE{lJN4 턁!ZҜg0ҏgzwԬעy r95`IԚ|Osg lmqGZ685Ңb$քd2GEz&/%k3*F$-g\ǥ1ۤP~N6na4K211KCB:nYg9E^%}K8 4T$83]LI9RSaKNZ749emyT< MSn DTp C/P\":snܳ-]֖+TltD1f"g Rf7/G g/O&t4Ef yL7EeE Kw1J#%RZJ+TA5HCR)!JY5F5ƞk\ﭰV 9/AL}ʶrւ垢;:S*iKkn;5W7|v%%X!օΚemGѶօ#key/۠wbGꡯ  .N9 uG< arcĮ&Ő m X+|YW?Mܕ^E3. R(-A]D??UFĉUG;( Q|vP7 fۋul oE`G~y di8TXH(V;JM Y`R 9Ld53~tˣk eoٽbzc0C1H9M^RwIdjGx [{X:!m2'aP4j CcWMB}%A.t8Շdao2E#I-IKb i,lV_$iG GpE$sAf #YQr+pp[?d= k,"٭26VB8:le,| fFDCx]>ysz)xIǡx9@o/3oX▯Zr흽Ϯ|kQеdld-=CN/E|_~z2,MlO!(eo"IXCr8)(!T'TspYH*;^I뵫0g-puَڡMy<> -%,J%x?F\M@~%?;.Ēo)\`F̳~¾55u:^뗮M BZU s25dJ3om;|Q\LC{}g'鵐H.8s^`!Yݏqi"c=(6,v \0YE&]{AO$ָEjIp`b%}Sha3D"Z)6yj!:'Ã[ǟH>/[ cEqW:y c(BgpYɍA,n#Wd[܂ׂ~l&(Ǡ\x}s[&+54>Loawbgr3+5y1c!.jW9IK/_3FG vuknUa =]Ef(&%"ORaFif)VmQ:w T㮃 CoD6묃6jإƫ|hW>gPmuAa HuFf }JFF8@̢ $^•xrkh> = D_wR6yg}RѠLDz 6L%1S J[+ %Ft;qC([3{p'WɥؤyA^E[_XX wGgr*ʺ T^qF{e0rH*ݲ@𓃧>>>iq]2Cu黰%M wC3RQwP"ݰDϮeIgCe\C+8m/z !Hi}l@~>V_!!XeIW0צV"<č&1.VCNS}TB8RH&R"y :LJ NrRC8o"`sf 9K{ =T#3nXv{rZPn! ʄCxYOHU50 XLk;qVl\iZ| P[y=oEG酉;_kIX4:,C5S#b/V(+ )ͯ8 v_?T ]/ ~pU8d%`m֏>C#z/subj~hM2jX$0|a?^- euiiLuCUJcD ^Rhubt!$&Y-pøߩޞ^ZWtG]ʻM<\{K%y~U#g• 68l ί0O,u䖑jqp0/%皩r\E?<,UG1H"j45BFycٝ6c_Pn'b ?{f'NP8]!z%R)d{h?4'=ȆomTDlUMѕj)ΑB2Z$ |xNxG0sT@ V?PqѱVd䂾lHj[ )Yg^8@Y-Q [tfQZt)G裢|flzA?sYϖoEIWHP}3&'Gڟk9r '%G%ȊkPwrTxV_2M}xVRDndp#ayrEH d6"^_79*(A+%G,@,.kw"Awq|bn > սj]9 H|4E'ؘ@y6K0|yK[($)My)8J1|^O(kp5!a˛&JDLsA5eٰJKGSL{EbW2Fy'P\K8q8KK0BKp2 MĐi~)YbF َK3di_ֱPR lY3IV/ _ҍ,G7a>AkU*XXB$h 4_&7Pʥ'~L\+Hͬ~gM\JՁ_ԫpDJfe]cU{ʋ׮X *෵dSk{Cq~<_XWĠe>ٵ%yYRa .!*KM OeME&T>s)'oLI^BH,[eWHV]/fAff *,|\zn8==<ۈOF} EuW.wD #އ˷ kJ2r]T˂n p u^φPm$gx[܄@|i]m\ʯ#"ͺ&o /=&xpx8f״X"tl d*#bHk{T?Q2mlHGr^˼\.S)Vʓ-_i5\s}8/aOIû`P7+偖>ъ? gI\ :g`O ɬ]q@9@O,Wnel +!40jtȊgOK#/ 0h^I 9@Gj/S,]t\R ޑ"2H@ >ŭ!hc9@gҊ1Wz>\xqÜ3.J-f9/5Hwϥ+PO܊xWG _GgI -p_$*k 6W~*Co @Z_&BSE`,^ U)C)H˃4ŪMan 3J+ rO= UUqaQxn s |cFԈtM>KpY5a~l bρHm*{!2̇v,,+h<9}z]T>(^qah>YZÂlasEi]s 7"يмOI2뾾xP+%E׺"o(_5vTՕߥK)>8%&r&(πOZn}e@@^tp>)NtWI=Y nn!F#Q }J{+W SQK!BdX)i{z FXs:tP?Oc~3 B`ֶ} JT})JX,?-Az:_6o EUBe0ꞙC\ޗUURѫ>U-^JѢk^鰗$nv3wIQ@i6/Q'/Ż?Gx){|!"V&]cS7r*\kW{r_WҶl|϶]nU%> Cw~ZRTzBYg4Šֶ(fOe{\&#\IeؾR-]pUGmd,SȀ6i÷u?xU὾m(yx%a7zrxldX[_(x`kĆab0î?|{t>\J<!G3'G΋ hsǠgeF#k&UCT^1ɔQR6ka̦܌j/( C!|PCLLwu6KC7(yUz1]|GCEuz%E-?qD^Q*{'Sߢn_]vtAPox!:q%O{ЋW(_rꂼGs{i :ooY6BOa=Dfv哿lӿ_OJ)FTIH7d%-Rj uPWX_}(،ˉw,Z6n?yx{o{wHSJkDVY.k11U b}rhͪiw݅~Πrڂ+'3M1-1cqp )3·[t*Zu@Nc\]@!C_{h\S( ^ՓgՋ` f)*ɱҨX5u -r{m(@,S{в?lt@-l|G΁.&׷hWKod?o&Q-\A]=Y O )Ugzx!1N5e!93]«%4ZrDO_jjhq|p)wjlFCP>_آ:G4 -=J_%_Rӝ&fb[7} ] *V^R.Z^umCqr ق!Z3ݺ8/ xPvn[vHMYSx0UZ6)(L#/WUn35pj?OzcY6nG}\"wVbA>nis@Rx4=2hL';ӓq Wk6D- "*;OIej0"cnB[z 'O#v'^Z=jFv4vm^vApp & 0M_$"Zr+RVVL •?Rml  f; <"U)䋰 _-7~gM?e!xXC)N[hF"67 Riz-Ja)R@=- ZL1(|#^|$4&)=PWx0gPp!*?y{z-l< ͘˯meXop\]fPly:(cO-./k8v$51z.6f`- B3r; Aj _k6+;RҴ ԩcu~1p~MxCӔ\_(vi8Qw=k腫r/}H]AĴ.񇷶44dh0ƣ@gghV+$Oǃ6['ˎmLhypO/EїDq7J7S?LoJ@Ca~dՐꥼMD~@[%Y4 JC[D:xetgs)$H K7PUͦi $\Xb>8Bi'_^L[?}#i[MY:d@2{p#|Y?*BW@Ӊ6|er5MUG]ҟfkfgȵu *nP^+UN##Kż%H_Ȗ4ʹ_nI&,USmZC33É8ESTRVg!P6 Bep}R8X~{zwàă$nJ7q.u2 p9S=tB%\{F|>pb!K0O&o'a <ڳKOJ־BK4iߒBTX?75|px{ M>z)T 8d{$s)%ꉹk|Y u' S.uF{\˒u +*͛Qt({kX[X0k?m}w Dg7 s.[Ë4=m.;L&<xWPYWHR6('s*xD='[ `٩O8.XR_O'R owc 2}qdIh)Ô}쫲{%CHZ{ȥPHP &c,{ 褞¶'g;0Px{j Z[T,lRׇ}[דggR5Th 1l'K^_i]p4AfkU>xTs8Y[ |`4o4][º`JHF[+"a ]jzGV,ǵο=a*P՟ (KFػ*+]dճXt=t0"m] 2!en 5F!"Qv#`` M6'" H$kZP|lQiی|ǮQ(~Df/y*ێng[vKkcC=W69fM;l`::8@U-kۖ^ItV&c _ J)^U . ɚ&B~ds!a41 iN[?LbOrϵ~:.^؊ֶ2 'rYB` AK҇O`(9?N<Єä%/`\)نzg*i6K}'.xi wF5ʠ"U8;J Ij ВqQ2j,6Vpokk0AM<)&h 3J$+7Iqq,ۨ ])&w'l8k,!ʙQF- 'b'͎~T&bK E(l=XJ/J~@7+v'|jzk"Ť#FDd#ªQ"쩸lVKCi%f){U^,Z)1V'X3h(OF DGRBDsh(@$Y TJfPy_W4(an.Y&":0+"so_>lIRl<687 RL04{ҶńWJZSQ%Z.8 JqFEY@ fF zn) _EUw!kZZ=z: @R3x;=1c zkإ7oy|2:B |D|1n{6q>Å/Ba^F<j"{gi۔֣>xXl{>O?>wmTz-7JSrQu6)9WbM\Y:17b35Ys}XZb4oFs'u1~͎4lfb{ZVDzxQY<:= S<.:)vk9gR+C9{_ LB 8I2 ~rt{:j1.Mg|Il 6 +l 1"WkpN'upsޭ^.wqHoz^f/eش4ቕS,]22աM5mbju\"D|Sn-"OE^"\g$R!Z[gR*bDK͓,9R?I7BMB`^-0Tڦ$m-oQ=u:-4*m=CaG/mOhDvoVEhtvjq{6ӿ=APRR ~9$|^aIG0v/=߽ǻ?>\s7~CL'Ϳۃ/.|Jy>ݾrw6b<:1$)%.zMBE(6Dqg@#hn 6Q8٘VŶW 6ɵ?,6ndt4Tۧ.&Cv)V-=m|ZVR nK/zL 4wQCkΩW=,^TS2UHwHUcp Oh\y-@E =n8^1¦S42R朜aMP v}c?4o$pHwfSE.+cz{R& Ju2&305/rJc$$uu-ςq*\f{@cNARk{@r%nYhb܃ [GV"KLjG趋'hqi`E,H#@i*}?oTJ)j8{jb=IYNZѓjqr}L]©aj]ha&e=C4+P\}QY^4[EPg$a1"^Oo)׏oT{:CU}M4ܱ2\*ab.XU`.eѻ\ f .S+{L!=65 :\+_7m򇓅tb#K)` ;іqRID'"8nV|f Tޭn{N B,=aik`}Jf/k@ \x%MmoD+I?niMFؿA}}0 9X)>[oX#cKc~1gE D~pUR>O  <}{# LΨx. .p(DSK2:ȭ2Qtl9a9p \~G@Gۨn,[Qx)^dUw֤&Uũi\\hdKKС 9RDKa}8Q-֭LB @Kiy[6I *S!1 D9e cG.JX4v&!T#E ! Խ#v%RyST8AF@cM𷓙l>PKa,>Xj) J@#!qW9!cg]Z_]V+sEX L+]IKc5nbxIkJ)}!rM(? JihK÷OslFX: 9qamʥ湙)/4folR";ZքO~z!:YcV&=I .u"ڢ<0uhob|T-ףAxCD쥀B)b QF^m?yVҲq-W!N(4 W΁K_-PODu<Eu4}ej6 d 2ɕ :$=K\꒶tKU 臡}ޡ+ e[Q.nW`D$rcv8)?{b|קBhQ J)T hǑ dYkp0Tt; i҅ 8> ˌ(0aTи<>S^.Yq % Vi&H ^j۪#et Ё^ɍT,LWw{qի(pUk_qdu Z ׋rwMwE/}7;r$b] JǃYIE-X)H'$$\l퀻ޓI#0[Q<1&I.C=Ni%?yG1=+GL(3SÙLzKL9N/p(xA֋)9h<y"JxՒn֚.mX9ᆘ.ltt]/t[( %R`W[ 6/2scX=U4ŶD?( Q3حʔ ŇrTDr`()1UlXE8q6BVbG]rOJ4JHQ: /i3NnɬxQ]bq.(ˋ`-Xg1c-'(fe'own FO&E_w^Wg]<ցEgrj#e9+ٝ X%faa3m:.["OxUW ԛRt^؞j찚wM!Y.>+qH7tF~qdDuj^_z/F?,%Zb7K֟/tp,5Fk009^ sJLhWϭ=z9Bެf[ܿt>@_CO@P<%!\؍?'s`"Sq!s[r%hISTW0L*߆p:h ):SØ-Fܾ[ĩ3Ep_=q߼,?NA]-rh^ܘLgH^Jm^ބJoB|8 #etP{ OPAy漆uXSy+@eVS5Sam!8:ESzPUaIBU7| L]x #4B &/؏0&.L6i5V`p؅KGqEPW1Qz|4P?KV+-j:';Q\6[CA̟T;L&=_v+QAz==3`;rJ؃'Fv9K)Q^O;g︾.CzL ś)bkw@#hqzPwγﰵW&B44a=̷O G ǐoy%li& .JoErFuzd{'flmMR,6ފC>MfLSn1 CN)>#EON7iPB+9D!瘑Tm+tamSD;7Pϙ~"oħM'rxDTf}wJf(,Ua#״U"3 㦭V5m, =IسDmn5pФ!$HjF̪WgGO8p9ϸHIj>S}$ٞXҤ@N&MdғVP7aM)ٝ?~HGܲ=.@6.f%-\^W]2ZKV2EX#AJ>`/Э*\RWW_T+WQ?AJ[=reM5 G.ͽ.F,]t; `؉ñZpUdk\&.l9iZfllpgx"O顽 IQ꭭Uau7'Lʇc M˫QGI%Cxьm-7}N~~;v<PK4fPKy.F$angular-1.3.9/angular-animate.min.js[iw8_!q|d3ṙq;qST}$(DQ2Iy> r*g* y=ƫTo.7/vnu9<w_-TyIY.Gϟ =_N4Y!G_:ϞwdEtX~X[4*$|R:8E)vi.1z2q.3z\<- {1f X>crnďE)\go8蛿w+h⎛oqx'"*=/a?$]ґ39{"ZeVZ'LC qhW-E,]L7u̺tKn-ykCűEވa&l0>evL-b~)j_ͦSO 7aYgcL%O0|d쩈&,+d 1X_q{&f%뷏_rWYz [XF\`P""{Jk"49Wd$1_,Tj,:ihF}EX*:7\tJ9_X⳼^迮MI }܏{`5~g_-v|v4C.KEIG֛ Я{CPU)?9T ~S?<Գ\KWE,@kNCB"5A^O\9␛fv"E H )6[l霶 <>$E!~_8h7X}bh z됇$1327lx,a =u#>ŗKu0`µ8Q.^7[1(KrD!;\3֓KyZ4i/XIdj=lEփsy⠎cELȗ7@-U1١|ԗwr9_Hݿg?<$a 6B~2ZL3W-m>|n8YB{`He.bJ& D@o8K7ҍťcb|( ...+6\~th7Q;m*6i~Rb &Y#/PbO?t_.~[.e~" h W EZ87<CdJJ~8;,Fco7Gh@ƌugnRvQF 'Yj_L{ I⒛] nMAܠe0VBͬ+Tgs utBZ0GF/1[^& toc?:,~ dtekX֖#b[ԾvrM"JISPI(qN?HӫE-A@@7$b v˃+&B.P#A >D 'n! ^qD*,-dT I0\CQ$x oo=ǒ  lv$5ڏiلs-Aiz5&oi2[S0A(dB f<:E%ςjtr_,Ffp_ޕ2T?%ކih0 f6oΨZ@(DRʼ5f;4f { jhߌs*s5+z,.&;U gH}ePM  X;v%G@o7)zxH+_ _,N᤬Ɔ}B]ևSAQԱڗh_Q2\ AWO`[%#G!\HmVCQ~ 8 a֚ gq;n<Ҁ oo&-\?=r?Ÿf4p 3O(Q(#;*߰ VO#23k'Ts[ DQX`EOڍh/BFpGM 5 h9FQ"XTצ(<Cz)5x"ft5 Et(t4+gAVdQڀh+Ag& TIŽA!PHHIJy g`SC{ș@ESܞ$Cԑ`E+%M A-?3a1j?͓q-NRGZ{^tjUmX_>aB-{M(mRhM$e`[8DSu (u8H̎Q$k:1SZs "^w BzG?<L!G| l9Skz$]G@Z^aQvmUfĔ~?ެhw582R:[~S'H0VIbc 5-=魧Ԭ& -ȉ4% zTZZWwȧTm"pSκŦD$-i952 ?w':8Q!e őQ8 lij{:|b (c4Q•A Ԋ?>inKk&6A%BOش^@Uԏ k6hl[E"tI"![94-"ž=כ|xM,hXKG‡B6H}k¶uZK]5mӏIk"_7&f3?;#I:6̷5i\VB ٫ҡP󹌧HdW3"ZVjD͂\_+@n`M) D/ٛȃFV"Гu1F 9+@PjJSJXnO;d4 s;K}%+aIunR #63U oCG!i^_O_R~ŮleuL{h)CEDՕRCX|5" [-HI:eC`,i.P*ȿ@!F9@Hn> jNV2UVcU5Bsv)Ŕk"X߰d;%[߃Qy&+x\{=w>lGoPUf,sX"a% H\+G}B+u2ph -:ܡBnA !UeBz \˸ Z"S733k6+OW^t "3CN{ C fSC}n,c_v<ѱ'#z:j-}Jyt2~hbCX6&9⫝̸|*e8}E('\ܹy.a'Rxˏ:TWXq[ 7_&[@҇fޠ3<*b9+n$(?L1俕0#O|dՄC>8`71RUWղ(:IQw˫~(gX#!|`h#L\ Mxr~C>99vE,V\iu葁CZk?0S.3k(1k*u+G!vCfZ`vhaQ""cBɨn51غ#WnHpxdJքC#s|h.]Cc({ iT.ȹC#vvpXHXA%ƒO@mC e_\ !--M$E/R4o7^߯w/x9 j,Ru…VMn̍(ȑQ%uiI[3DzJwP>\d+~e KLW/lX`"+ 6MԭAZfC_6_ C{k~#2߭5PBQnS/Q܏pd2߀j:~]Db5hYK+[%帚UkDhxzKI+R$e[k}5.{?fUmŠJN@BQ 'KV{mrؽ= )OMn [ZJ"ݙ3RhPqw1:UYTEv} jeb60r\A408vv9p.HEhEI{·eH\815xbc(078Aޘ17UP@YƛwJ#D  *\UUC1v׃;;D{ۏ..ײ7RH/[ _$ ݋?YnFʵ"d pu`,lH@e}O K6US~fha81lPS#kFT40,%A3>Z~^iAWIre0Ǝ bttXMďP*[mk;kcWp%S!9AT+UjR3GDYۈ?Cw*'e_a##mH[F7RUU gj]>F4 7oHdM=} >@QrS gSx!>┿`_D]ul:qGwhOۚAM65yrH #z{;lظ6ڜ= #&5~;#vQz ɔX  *UTJQWX#"\y m~ L )!uJC0 tz;OPEv-T3P@h缞@xEuKlk"*?ykJ8:_Gޮpb VhrVc \Qə$0Q';n9>CUIґdHL~uNJB!{6O,fzɟ>Z&mHPu.#I_ڔE$ Cށ̐R +Lss&AgmO؁^#LZK Msu_C? eybG=nPwl|CsPK4PKy.F(angular-1.3.9/angular-animate.min.js.map}rʖ ,)(Q(8O:{t,ۧVDvy1/Owa?>jW:eQχ'TǙKQ:ǽip_:A|F|tg| BCzT+@/Ap*۪$ܗs /0oPܗ6Ǐ}9 V FpmrtN AStا5vbq[mwܗ:JSq/ pga,| z,H1l5n6k lxsNh/;`ie8f+s1{B7G|}rh&wCwHpNB^S>aĦN!!Ak=zC2B.Kԭ=i!CM_1AtY~ }V^WN8^' t UP1a>z+j9 MH!4jM\z_t ^{TcwGc+ gӹӰ B>>d<1{ 2FdەW;q}Z^OP? nnbwqȣ 4kD<$v665Vt1>k%rԄͺx 5dKJ!O#YrЋ t&\bWr*|կ U0CPX@}fD|G)9! f! E[}}7AQojگatZ}.>ޡ> z {Vo^=zAЏȁȡ+0$$< 36ǠD>ջM#Q^ASUqq#S'ϪVuڻ`o19$ c444drz)xAM #mHF@nIuOIKQ)b/ UR3 QgBn#Mac :0e%""I&[Ј13(Vd #\kvX7X0VO!?Hh 1ǚ ܤ\cLp{&m"fB{1:1`SГ6AYCi[,$G-Gom]&@ #/V qßYL6#~`ѭLzt%QEr$jpQIJ!N([TުL/` RVo .9 ӻP&$*Ey5KJ/ehHF(x漯z%ۉLv1wAvo%V=qG;=(f \hRhFI„熱Tn d .9br%/M N(bӍG혯PAm>Ԇ!ܓzΣ>{4LUp&z+Zjd7A_d8h'fbZG\j|=|[ ŦXqZ‰Zh\ٗv9#iA M8gA$۠| ״>700l ֢aYCM#Z稀\|#x׮R(. 4'緜z8mhNl׋hiVpP#5x:lЅDM %zBPU{'sŬ5m냃ګsrnJZ$tQi ,J-K.oF'8}ީ65ymq(W1F~ %[emHz5M/|7eM`f_%P%T+>~dIf5Źᗂ'(Ʋ*5\K0B@;J#aq_kd;%-32#qE3rId^:9yfMDMm;D'VV%|C&Df҉? ü FFY´aaa--04tM9I/kdRuփ1]Ի^wIo)EMH=qE׳-joo"T~p:[HTv,]cΞU$I1d#LލYYlA$MEhE6'3=W=55(XLiac Yh/o }`j3ɶ>)! ςLBE?DI@nNlt9;Y^oC8,BLi^W@'WY+xP"z:P[NнfVC>2FO(MĂf J "ɍR[0|)RrZgˌ[c.2|>{GzԕA% ZVeh}C!=؂ 'A_k,b#i!KRC: \zp(NWs;k`^3TƆq:.?bPY4wd pw ?peBKVw&&?jA=#ƱNq>ǺhHhFᆙ'i7[ɹqh+yx>۰6glF"{oJn|W p}N~3 ҰV,F! {7ॻ`H;ǞSBBt99ֽ>6HND!Ne#\]/mVXb}]CW f_w%W vrоNN #NK/s 'ቹ2śE.WiE(iY[[r*n+Tkp?`BVHVVlZoB>p9 1t&Ȏ!Иt A^16 5/o=;~̞J+=dwQR8ř`d9KYN~mNxY $]#Qn^a@5ZW*ɬ'T/ G6t,%SPZ@Yx/9g7-dF"3fDJ1/n} 8Ȋo~ BB#ǃLHzA ?_5@1GC"QFcۆWM?os5oC`-`n'p N)gyM?kddcGmI K#[=wӞdҕfXVߊi|ɳ!"M(bALJKZRQ";PQItҏ |Ql`IdA6}w ~t7+u! xHI< O~%s a W^g$! )NynnfSb׈b9,󴰛&4ݴ S!L)^Ta_;"#FR5ePf̀ǹCCKXkhh_+x a[ak;QSBeP1FH5_E1ATxz aJ‚t旊%]+Z=gHTp$8ƒ1J<Qr^ra$ |"5%R45\KoRS㗰yA,408¾kZJ0@ZVOᶘT[q 0҈V]AZ_9l^ ȶ5߸,±<\nA>B43hjoo*-|)DZK,\qqTiĿyn wB¸p˯+d-l"xĬX;AM؊=?,f5Af<8' Y@{(L"o y֡+%?EA`J% Hz UD2֫U}[VQl5SlƝẘ|ld'Ըg#2)bE큻crW] ŅiJR[1Ǚ&GP!nE 8^9<:Ea% _IV4׹e^TDŽ1zjx*NXJ|2z>) iX34%lsgM0jSq؀8PaYw-!fr>nh(Y7NG`;9~$cq g 9@H (y.wਪ ak_T{oA{i{~$?mrPۛ \-dH\(@칂:?0OE=4*?Eb%' ViNAAQh>T I}Wkk߾rzN,g40H5 P|"Y=C g[%ONॆ)*8:'Eڝ;+@pm=A-F=0N15X2En+~|`!wܫD 1fQD*0\U (w믦.zMF-a IN<~rJr%__X6w:)i [ Gl1/^ߖ6& ӻaV2ɺ|OtƑR,^*͞#lX^ܺwy{@}mgf4ςd)lR" 5cm7RFiC3rzU>@<+(mAT4rb'{*d“(/(eo msc)Bf'JMd4ZRkh.fxcItN:oٟj'O/V*G24X55 }n֗ٸ۴9Onh\ji`rhqA:U5( |c0=qO40~,l,m~k*=$L,qE8wO} MOc"{ w2a}ob Řr+"q57'EpOwLeplJ6"~/hdҼh5A"틇:{BDAh> Ko² Kef)զc~|M3@m$) >,|r(ŸĒc{b.ބs8s{x'L|$G}#96.|Sz:pZubM:oGjj(2p'r/RGm"ō#C[ !&B5O ԡc}G\ɲEU8uilW[KfFU= q Fzoa `"KK4we\Wx|FP66cQWj5STye7@>I |ds76mhJ(\rлl9I0,I &?od܉p2$Z3\!:)FdH˨v"-J.3TWaMͽ4 ab4ÞdtKyЭHbʉ􈑠$ Z"gl%MkTт3_l5*﹬5'l40l:玶Ұ=$]9c 죀QKNnNչf+x`%֩m' oK̪j[-j xVm[V]OkMt86tb(B<-QZ̘OIe~scv:8Ef?ٍx {лa9.ےߢ& Lٝ9kw;ƍHZP^ozDXg[V8"!9~ \3% 4[ - Tom0>k;p|eLdf>v@(KɸПYu#/h!%aQ6Q֕ gw3[(3[lLlmU#E,ꯒui5;FOiJ2ՔI*i}im h ;zK96o^/5v{VȆrO7ښTǀ`UuYW# JLJH7DU%+3lZjBUV%/d"PU~N>AmPUH]C{}f0+ɫslVj >W/R`#S6j>|ʫ0uclT͆~S3x<7eu'&cz^aGKJќIGܠOx9Ke{/oY}sUV ՟m{*/l7Pjμ? EF3$M6f :MaS6O9K3%~[246b[9zy֥IMvj՞f:1(jlya}eFP@ڽUՋWeznۢ؋3Lض}0) nFb,9Fcc2m;_.yotw5H awؙ uZaN"ɀ5s y 4@6/?f=Qb)6+v .q8ٶEUKZ*?kYaAgFs DY Ѭjȝ?v<`[ {Z)DmgFӞh`zt6:Ik偀 a1M# g`;^=zj\@ڒ䫉ȳY5J9BJ jfꢭ'8QzbUGB p 'R|Dh 2_-9 fW&P̏Cak 8×|ږf-B >ID'Ť,5ת4ж!7\c#69ODNxqFm/amٸLMԾP5f1a 0!CD|"i*+mJ,"<5epM(\h7,Y9C@`!|nҐ |M*ہZh8o\\ j OX *S_Pk&E2YOy*֨">#,K$qǑI..* =`a% ]![YcEO%7)Zl}ob~cfɅ 6JnAd{^1>L5$0?C$)ED=dvZV0u m[!H`!r vZe!5G X#m1{ PcS*xHtwiZ*fPޙz0mpFuII{/F<(+MeTTq{k@=:}g`=b"f*]$a%XnRvHXrVǥ즕9^`Ȟ_25,/-kKJ@.x$jJF^[VI(Fw؉$\'^^BIe:hOZp| 2OrY_zjWO hVCu2Ҕ**\'JE\ Cu̓%:aQrT"aZڱl]=e^&X:y.Il($2kNrF&d˥veqnNF3o,9\p+5^MSt܁ƥxuֱ̧jնR\1 cB,]pekx,tfƏJU,!a\k#D #([$M#TsC,C[/=bXt[yX?zDƍL Smp Dl[ꇶHH[_oc^6A@Ռj;e@҃Y20YcoP Fi8^YIyZL}` TPnL''dQB yv-H @,XzOls(8q0 3RA | 1v^G =Q8L'lΦa羨b] `վlK9 Xa7Cs]T ;tFN|a*6G{𰦱RS z.`LF3Pwq] "p@KoG|~r~wK4N[FB O>?( ^%L, 6t D#ijNطp@HfW#,ïWzsfv .{ p텻;q#Z:7Fcu`{ $zg@doJ+Pkpcp@hŽonMSNSP&DmRfE8DȆ~{TO b+_ش1"Kk/k +nV#q} 5vrNއqg|A 73O0$YBSV@0Z2 dt46ձEck&蔠K7/GW dmJ~ݸ `^h>ʐ=9g0Ly-4?a^7|::7yDϝj Ɛ ۉ : G i6 J"Yjc!qF05a`!tfBJX.ljxK=4~&gpj=8}\Shm䇬XAovp)0Saav"mϮ-9dv Ć>/!XSBM &> {q0nLۗsҾRD_QžL6EX#fMW2w6Fz!*wKgx|W "1Xo. ["$`WU껫M%iy6EXC'ml:%r2Pl5< nQ"H\?鵥Ϡ􂹷'HKɧ+*գ= u2 tnt01  419l{FSSe]eb Y{dnE!A|+%ZӸ+  UH.G Ʒ󯢡lL>G;;-p)F;1#c,՟fa?V+lѻn5_7IZ Di:$ |ʦJᵐ7?B07zzզzrJM[ 4iHEhcīn fSEFGqzHad 9< JՆx B"XpM,W lamq, ) ݥF {/].B[Tӆ_i@ZFI a& vq1ܡn<|VI3vmkʧw[lI=FKqgxxWWwzB[6V"f KkRjwphAS˭߰][7oJ`,UkV<ۂ6Xдdz,tEج&;X)-6tt#Q<tfgS{)n7 J*'HQ#ozx D:h m[GHzC}liLt6jX($˒& A,03p ]pYp,>$qסm 0!A x:v}3^֯`j63ԀfCO~A78F}zM8. `JX2?N`PˋP|چ ,mZ  Wa`p @"@/2Kz̯X hw-BqKmSKh!7Y ؃ ʩY7{ks=KB6 <i3Qkednz8ٱ6Ҵy Oe㵭fp> )57?@GPZxd@m# o:|lL=ȐkS*6{xA؜is([գ|wQ$ =-y)J"lcCQ.`*uȝz  vӏ.ƳQReڟSࣇsBl]mRBB,,"np!J\Ui{l؎ RgLXh@G KUư#Zs?ϣp[U{>8efgS #k:hWO\۬)F7O s+'|L .KGԟG˜ L_q8M5+#-&y7[|)Vtq.>,>'jӑ}o'Ofwqvv5r۟~#ɔa6K|q/}x;(/:y0xM)QppI3:Q)]vY }8]]N/yv]y8Hw2sfOdy9Gg? Gx(>>q܊bً&_(L÷6gS'ST/$M|\_yd,A/cCf_Yw2O/=%1q.SE^Bsxw]:ޤ۱BS2M4\;L0]do2^Iw"[.5f3ߖUwWnf6hd=ٰF 3-;/D?ϟ>b27O"8oMoDd!0~:Pc+T+&Ķd"{lW. V3) c-ޗh^NNDg}mʲGjA9{ajT`n@;|U㭗; Lv=ESYy/AUxJ7ޡ&ezާP,')iA0i^&^oxމCv? ȄYJJ3{o[42? *݁oQo9#ZVTE0УVcC/У/pVl9193h.!5$ߥ|C;j6G%^0eT! (u/NFU$NYE=EJIAAO{DdR$O#u/]T/ygBHf$W&$ɌTJt,] 9[?m|!/ŔQ:  țdD()ϛQE7cM\15^AJ1^Pmp͠qDCo8y#K(@D)e_VcATL_K7sh=!#ܛ>(2b+E鼩c.?ˉ@@%}0ՠs9*<,׉1iO shNt2iRPjS?R")|I&F<' r7^طd4n0TCz2)h׼9Pyy+mJy)~C: ss~^GdE~CXʓZY<}҉gQ(zOK Q$*?K9a()sܣ)+wG'q-B9\&|dص䰇|hU`8_Qjk: EHk]ûL(TY.^-ßt.׮Z1Jf|.Rbutca2.Qj>d PKy.Fangular-1.3.9/angular-aria.jsZR)6gwrvvfvdg+0I(,Km[,9!@U!o'wZ10d|}$MZ:N'$􉮾v=/sMӣ4Ӵ,燃A~/Y>-*CxrxeeFٲGvOidqj=, CQqXvXI4ˢEbD4J'yaϙ󭳩ڝ4ϳKXY^8)f3E篃(2.s}(Qb4з4yjJ:ayoOO_x㛋5r/_-getr%-JHQN+s),H88t3aC([Xo(W^0lL-Pii%$6EBZ1)&o :=P,5iYm߼`ag>к (. 8x6OnJ," PdOÛ+s =d"f1qxcdqO~4͖z WKxoA %CgM-)fgYn gĠO#ћ7&k,(zG^>ipqM񍏭Y{UYe'ocqS|Ժ#ΡpjK| YY6Tj /S,cDQY]B"+KdΉ7q 9_eJi!^FY8 " a% .vWh8 )-Gh'wvKaaONNA̢Z`џh$>Pг*FVsw9&($F&wO3SN/k ,tmykE}$"w )#ݎn= nGĖ] tX4my 9?0BJ"AM}9Xpf,RtZYE^6Dfw}FzH=CU!=q\D0h? pޡ:OuqqCl#( N[V uE(z aNX`Sоf}+I ֖lM| ܦl[އ2KB F|k@.+y3Fr`I: bnxG+f=t@?7 oGY Bp S``*bAϢf B9Yu]D<`2HhCY,]'_"8s`RΥSm:~*=V 2 .YH@Мoe#x%QlQ =Mt\nR}q5GTb[/ pzwy*P QnE֒!ULbf؄ n!IeGB^MyX4]~lA'c$7^7 ޺_# - LW]y^kH|sݕ~rś/]1l94Ѕܰw!=v %҂&a0@sc7b~\RH ◳xF "iGRXVԄl;U uSag >{ z!( s 2|P, s4,ڰ=À:7WYbbDElfO <2pink=`Z 5\*@6 e]W]ITO:a.Bb,O R^!xY_YI ٔ;Py]ē4@]QZqT'`;( ӏ2-+L N2S@F9^2eba Q(%)2İO'c2JP /"pb FigpŐի=L 4@*npg)ʥI0Kg3rki]2[4pI.Disb* A(PU`Qf<Cy|h2-0Ie.ޔ F8 J7 v.2Bg&2߷SFNϹwdԼ>ͻnӼ|k歹N17n8L[SZ9˳d*s%g*g.ʣ2gF}rrc} +;Ay(uh[n7> ptoR~n[aK6bW3pڎBGR\YMe (2ɏY-~rF_JlDe_#InW 󨷺{qR#;tH跑O^bqGfǸʉQ\ѤE+2\4&*΂ H&ſX!eK Gc* fIJ@ s#}A_ʺÍpqɝc\@3U'L$PF2S/0g䟡Tٱ Lk(eS/1*r֚o~jLWM'ȶ˫VX/jg* 'hJJ. XKS] nUi 2xVT1+yseW4kS;`-zR=T{:tGI;Xp}lG2DO^[?7HtiKn$m eܨAM^Rәcc\?E;JE1|J(Jl!O-Df RlG@ڰ_;tHz 'G7}(u,t7!pUt2u?=^^|YYIEpގâjpK3֖FhUZ,s*n 5LR =V` =`;wֱ &mOe(ڳlbBGLy^zPre9^@i?IbJ3y_b<-uJrTWGRVp~К6x`*Nugo >VU?9ǎ7_˨Vlɾ݇unQ*fK?u ɍg"/_|#bPCwz!ѝrx1[9mr`e2:h4?|e .8tyY*XL+ZUZ+vڭ_E&Ln-!n?]?·Pv}/7Swa"Z?y%aoRPfB~˹Hxa[=B\&Pk-p;#?7rbCvaUUԏ%MU0TF&{*tC4nFZat#?u՗Ǫ3[(\Eyf(6$%RR$B|[fiA Z;%"?)ӝַe6 OLȕU <%%rбnn`&f !D.Ąq Fb9TvFE_zg%Z2HBEe5x.-% Yt:w[SZqт/éP_Z5 ¦5x C=-Ϸg@-e%L@vSWt=p-VUg+eۉn#CtBļU7yFvm8aO)JSYžFFl }iF5Ӎwlvcao[b|X1qqɉZ'PM wU'_BYL 571EJKt}ަ"ZN+ zio<[lE&LjLTצIACbYEg3#Bi,!^ ,6 K:hui`#E[l U*}!Oi'h>65a} lFEWWffj3g<-2K_ʮkuWοPK*N PKy.F%angular-1.3.9/angular-aria.min.js.mapYVJgpi~?Vڀ9w!la  ̿ODG7;a!JYYY)竝d2Mlʫt|݉|OO8^Nwtfl]X/vM_9s]yk˙a(G^aHE*ȣ}Qzҽ\] {\2hiPa*6u8uF^dBK+-N5<®=s.B4_vQ): 8|>r;/l5αkh5KSr\T LˑRJJD( Psǂ+pG~P,!~}^{ i&AUU쐁K_r.PTLu:i͟qy ]r1`E9ژD ޟ҉3LnZ?ZD\^bW ѝxM9 #c\Z'̛Vb:C=9| )xR 7wwoQ l;P[֫_h}^D}۵C' 7M(C La2|yE_pd6FPUo`)cVcBg"zDX >TL) ܻ #C!ǣ7O`mg©2b4QtmYY&>L MF˚3`WC$dMwej > 2em>X7 v%l?ҹ?*L!pf5@Ec8A9|UÜH|Y+b=/{ʈ̨_虄^o,7x=eH!EJ28},QǞgb'//6m\JaJ*9hK3!#'V/Jz"8nsVpQ/¹YZt#è*46buq@(v@VQ9D=8%pȜ[{Odj M8ס2մ*ڭsnv$len:u~X۹B7 [HV9#QģSQ8q(aƀ8q° o0%1R -͎CkтyiAT'8jy^Cs'T>awP3NiL/#Pdݨh)B2.[`D %hW&5 1#x,?jZ%IΛjԲcOATszEY|-O ]sV v %p:kS X7]>g[ awmȀk>mZy!m6_ft[CwV`-/!ށq-w @Eu&pSt'_IaU,ENh|ua<{s|M򇴗L0h[]}_?^ij ZQ4&0!n 3MQ2=ǢQr7'x>Qg7i]:G?ca=;|z=Mdu`>S5R~z.a`,aC$NdN_e—H,ɨxJb.w:ŒNVh?"tIey/)$~ӄDZ/HM"-.`4i.3Ioz_7 LѯR C|oZ@|w|! ui/ƣp(x-&I26ں"1VUl=ZBN}0'SQٹU}?JF!;htKhCxD?PK4zEE SPKy.F angular-1.3.9/angular-cookies.jsX[oF~ׯ8I啥/unvӤHE8K@cr$18*/RUC}s 9 E lr.;#:'EڲrzyMf}ÛI: 'ܪSzQ3Z7r>7zC=sՊW]O/}>Jm6+}^fn?%gJme^lB2Mh+WKi㲶"ni6S>涖ioy ^y-J]enˆnmEKWQeM+a=or 1S,$P/Rٺ47ǹ][K0Czvi"<-,3yu*h/.mmVŜF#LELƝ\)GI,@`Dmw-vdD510} f$ %qq[JUY`:l Kn>ش&6D&cm`OXvx̗PM'4Tڽ0 Bf4dnIi[Ugvg W)I(LMIQ.Wkom^ljMO)KyY7(l{b3VB%<5~ %xU~-ɵ`|tρiNo,ۊe88tAcPIs}_kH,ޥؙfcM"O39]qtHƁj[9\*|ޝR8*+鱇0)ԍ7{t7|oĭ)joAփ5CNE*|q9r+AQ0d5䆐$>uyn g`FQGNԮ"~bHB<{2`Gl 2%āԙdBNvBx1YN)2|$21w{IY;:pvUb^WK>MnU}IYoJ۶^[w.5k~Dc%=FR5=i5@^"Nq$5\IPRtMCa{UvRKj1)- i]@ɳP^De)]0OdL@mڪ  w*Cۃ6]TH@P~P%{#jo+I/ RXzdMSHE{ `>aֹgu-0NP9pȞCް{~$+I;~b݉|Q4+ !ljx!ڲ|Z /P,Iu z,($漾N F)qZ+JUl<:I8Po?ОޠM w^Xys Q6/gȐ鎛QB<^*tC!QBE:6J' $;ɽ Ӌ>h#Y4'[>wud K=ѵ$~|",S;V86] } DЅ6XWSdt83~00՘Jp~jACp%99OsY[-ȦieO-k5,6 hZҊܲԍust-66:k/LJ7h8՗;׬ 4n_ u;剖]ϳa,x!Su^!4`D(c~n/jG%9,LF*^P3v4 TUUq rcpqW&SIm'|.+><Hus /w~ۚu"N&&L5W%|SwL$Z;'v~5iwb7jV-|)Y;?*h$qGVؑ>pXA@iI hEx"h>~7\}O#b4Jh]T4@r"*7 mF8.B|#"';lz g )>m%0g' 0NR$߃  9,`Q]X!qicz2gFؾ(FgUO=FV$,ĚeȚRH#F$ۛ Dhz F}kl+TbܬlB{)5kI9? 1ؗr }| 9*Hv E)ulgkƧU_tlR{`bilQG &煖94S0sikr/CO*õ> _Cnq[%)%݀+ù}'*Cc j]xaruXoVB{;\7D͏{Ik1KTfYA¢ 4clyED>|;PKFQPKy.Fangular-1.3.9/angular-loader.js[wG_/B_q†}@^> c% (sx琭8Y>XRuwUuU7pC$M&>+{4.Ɲ=;MF{woy>O=&c^,>㼘Ӗܾ{-~ݸlR%yA TeU$jƍ=%bIh6tG?ܪO,q$M37 ֓$;[K_kOj4lWng#M%i~Z+ړpS\E{%`!AE~] Fnğ[;p~YQ\^ϻ(?-+b.sIVVq6.)V 7<.*1$ P:H p[7:9ɧ \Yޱ qC"ejNf8VM0MTI5]B"Y^lPr#_q1>JX }>s3¸U$%X- O $|ӘLl"u2.}A9TV ' $Sln$IHkӸ}qQbZ%dngnZIJ3~5reA$xJ:hwrՉEs`&pZŦJW.x6؎Hd\8LVņIa$&L{츱A2r$ӆR< ]%|*EIZDe;yL} "$-SU\KwNVn אz$YbZ:'e/áj&9 .| Wu4Ӎ0d 9,ɉ؁9gWaiG:|H"X c{Z˝}gDÑPSx!nc=t[!cp*  ud֣{?IGs|HYܾ@w޻0D'|&n(pF.A<#u zhڶ𸌫Ɠlꉹ]#wΈU%3]}0g9ʿG aB[X%ȕ5x7)@2M8@Nΰt/ tJy%`9hOn#N#\Rl~|(b+ؔw= Bb('&gh1;ZH41 *Pf W E{{W !pH9"S˝;A?Ф Е5TϾb1)vQYpw}rc| NAy`FhԼ {\cqp#GVÜ<+ۮ! aN~:cұe)A%ݱRI^)FAɗ$cL "'<`9XPH bʁJ@|')e1d HM9p*$2 f%.1%<)mR.[+L:͉%\9rHG&3U+3Vt|B-ϯ<.$Ҭd8Q`+T.NcI5'WQW}4M_<&9q,@E] ,dDOs ΍зU].٦LP\= )b.A8'b+z&0Er"F zp7$+w, rwkp;b!a7!aR&iHmܕt1Ob)y >!C|<%h1x#Uȃa*^E<ݢfC3m ğFdG7z?ԓ/Mo󓘚|GwO2nW&~JBAV VR\rDzllU ?(<,Yu݊EAY=`lQ 38 nk$1KW,×07#Sg3zs\CʘCVJ=9'0yG~ $h&zIQPOtAb3#/k 1mU#޻+.V"ͫ wZb҈~Cǵ}b+6ь=F>~m4.Gpcz W{{9&hB ǫl%cMٯ|Au6hh6I 1CuPVieI$W)c~8G.ԾRYN5;ٺQB͠Ͼ od5ʮJ_JqkYkͧڧ6Gqi홀6,;6.dO_i]H_Rg?_4ϵq` GԠcr _Rmy3-Ő$"gJ$rg2w=Em F]mzwlN^J}}Kif ݗ.*jk,[{tc*3NPv,_+p Wu84ӛj[S`Ӛ:Ȕ\3CjܿFO~R-`zPӜұߍrT4.G Emv`A-)Xxuyqfz:dˢ0dK%=|*/\a qxR^-X)e(ۑNsgm R g]- "*}~q%3;ZT#S0>[&·f}ES7+El ~M. %]IaSIޓL;̀[W~K›ϘzXFIs|:j&nAS%xMMV3ku??-kнo8]d]9CTS t:7kkݾ;:ɏrѭSwMNoC W2[ݮJ+ ] 0]^O\sux_IfD*x5,TܿH܉GPÔFNizW1ܛ\ڨ<̛ࠩ)n]AFbE#I"dވ\v$P:SftqI2n`MHlؼfq"t +=mo Ϩ}ELF4p(Oi>2q>257}])]#;3G̙b \& /VjmUxMV!8x#(]>V8Wk>u4\ϰ6*a/U||ݫ^%=Kk ]Z[%/f\̩{T,hduvs咐j\z^K ntm] Q>o{rt.<`э|X)=@:UΫ0a;[#6<$qPt!iȟDmM&WRWj3+wh[x|NjxS[ Fj7PKc;PKy.F'angular-1.3.9/angular-loader.min.js.mapW[WI~gp򶳹l6>M7qa=@[ yX|uu稶"\ӻvqS-r*,e^΋6\YeZ%nZ@%4C4b嫧ncxLiF-9/i!\jRP\ %Ruby )d& ;'8cn"?c+'4;6dyN|Hv)y^ jE\V^6Ҹ+_&n݂]Q1zu,"qΜ>r)E~S)y8s7ɴ,ԞEE֝*KO&[ݨ*6 >A.rMDlow]WqTqEZƮ|vE1EIyh}S{ߟ|gM H#\Jg,'ƅ2T" A2&4^UŬߣPK-Mg` PKy.F!angular-1.3.9/angular-messages.js[ks_"#5=ݪ]h6NXHlt7%+s xSTe..ѳgO3SYLmZsQ-6e魹>m|9^ļYvl4ݬ6ȝW>z2oiWfsN̦yQٱtm'OFj1fU6v|eMm/l+f6Ś;]/QOpce^M̴n:33+u?¬<}s_tˢ2]Uvb僾Uk@~i+XlIȘNt˼nT}ƚY~UgcT)ԕS~i=l5x!bف4*poD0i@,l]i1/ v%Cyej [NeOƠHmlԶ&mVZ7Rt'Xb uTnoMނ dC&͸E@Yީ&)o}iڜFmi]uyQQ)/q(,o._o3eScʴ.KtiִSQ$fY%J?(lߏnLyLSFXЙ3j3Ű \x&ƗP޳DM]nT"6o >*N36#؄AS5F[d2YvgslW S-p*g~`a fuL $4'ʠi^40!Z @EN-Vy ^N 1f mj̆vZЊO )d5B̋BE)sz ~he)1WMW{Gsy/Zsz* [On͙ BZ$Q׌gD":w d\; i3 ĸhG)s:U=MD15Wh =<%4oQn <,V |8O58m<!J 7t/4/;* 4W;=%֐Gd]gZ{#8c-}gqdl|o$?3 8BER`r+?D u Lkj2qA{[ l&Ҵ}1f4])9gH^R?0B| НCs{ɱ./,=o͟F SW~"lVQپTw Zÿ;ʍSAy[䫚)S8DG,HH-, `kY/mF>m531 1}vgbA@7YbF"8#VTɯML cZ@v)[$.C57G01g!QSީ$M" pMk cJ[,)v)X=Cָ.JOu@/L](vS#-w[_#aJU9dBoKeP} DʉdJ`-EU0+)4^#cr2; R0xc`eb[,$Hg<{Py,ZsRԄ怴q{\РE,pxflH#Z+*iۻPɐm89M˷oi'Sw);Tb|f¹Eޞ SWI.O{& ^PU+ ᡊ7hHt03neY`̞}B1%[lxvGpmחAt %|B)@FNj/W^KS༴ 8WV h3<~Ԉ19 ʜV墶 9$i+^~rߚOTI{Jb@R'#ǤYHp>}V>4c0=J$x I] |bxc091ot[ĵEAOw_sS܁,1'ԪCZs,SkE B-]ڥ 6zŊnәTk ~r2fd^bNK=b&j=/$ @T(>dxHwf;[,Ѝ< !Q/' P7<щy87R'|>RbɍGvҍ' o}Rhc=8/:~%.Rkm9 #CGEtƓo,OبJ݄qMughjA<=±$#6(&ZOX⩞ff IQOjV{YELnEW$AGA4n "dW@?ʵ{$s̤61k񜺎UN R8VHimi@’@J*yX0";]JPhSdǎk`<2l]XbidaAi'~~JBMچ +lBFY@`O:x|0/9f|ϷP.Bػ =L[l} $1a/p(X3`T]y^ ?hT%*]O{%[t;gqU; @$ǛP$q|X_Wtlx tDϳ3\^JvgdHf1s'>Z`&k~XS%!=wyť/KGyo~kPCI2G=^By3T}nr"þȃR]7m y|<q>%SPB8_U=ti}u;9*6Я{eTsk l/KC6?:z,2ś=Ľނj|.]`\ <,~+g<4Εs,|36{MDDd3N;[IJ=h(sǁ1huNR){nJ94#_%ImUMX /b;W пlw/~V)c>#\),eEkyE+MSdMwo!kgbY j*LS5!S$'Sy?t79qѱT`VdbXeS@5)s`[v:,ϱ s3|}Ɏ3 U 22f܁h;9&;hj+$2w8V}wĽtoGp_?`[4 4;'o^G}D`@ כrnp0 %wK51kq#B9þmcxoҞі4PwXC˟ x8/^О_k:=B+w߾h³\3ޭ'8] #7 aho_Bg1^|}op^w } ~!EsibR.+CӐ{j@}Qܛ^X5_ = i8X9Y|'0̈́s ʾ@N_h0pʱw&ZqYW]VDO(J(1ft 0d&xAѓ`{F$|F7H?jkcn.}_>ƺ.jM' ,bd<,5G9|dp%nhq9m3qk!F/D-3 GqsgWY'{ƥm6m'aRVHA Wl¸m|˭fgd' gBrPK ^<PKy.F%angular-1.3.9/angular-messages.min.jsuU[o6~ׯV=lR(Cm(2SBQ[G/rIrt.Z7&ﴰ|oOW%ns g$ xӝZVߗL zYg+kZі^u-tU4mEm@Ti=\ɺjJ  )+Ʃ8O.>-dgu0;<TZk<ٹlٕ~8Vgu< |Iu`5S0Ee GK"פt-7bWՂKn<]M2Lnu q?<wE`jgץcLj7WZ 9s쒋P]0$£R_Ζ EnIxƥ롹sd]y1o%A!Ƚ6y?5ٷ1qf`Jx13$ʅruWŽᒬ%dWȚiç#nsi]y _-!Cl~3{5hKe1;_j7\wmS!d%I@1&8,)r*%8$޳>\pue? P5x5=t gH5M*=Gě#W~8w~j,uRE]DVKgH9杖6OTe3fx0k:)XAIu~ Kgy-tG0l}Jm}ƮCCJ/09Se`G?E<'{g8PV_s0[%!:6 :??Yw }>?FlN%^\PK@wwlϵ^xstԿ4t2:7;P} ah[I1Va33Ha@MN(<\OB 2L;OwR` 'ų4PwM?qpPqSl݉V7 V9+TK)mܼpW9u3G}Nח>fDxUKzzH<;EvϾu?=EWUcpc"sի<#|`Fm Ywf**pǸ"ɲ(^xڞQESt$0A[bT\0\h7--=U:n^?dP;-N9`ҡx;c-+jpHw:Kn܅h v ThNt[>\J4LnyWb9Ϗ@<IYH$反m6x!0_-^,)iD)|zVFfyDS~r 85Aڻ[ T,X$_u9egHiUO"> ImL]ہc([`/ۥ NNH<ڹ1KD !> %ieV-cm -/j`eY͑n2p2IgpqƸ) bYUDYN#! , sٵ vq)Uq1a0{8zќPbܝy8@ ï<V1L;q5x%Oy='l'AcͮJdG(T_u6IQf|ԟC=@ȪJkٽyVsTg'5j_`zRנIvJ_Wx+L)uVrYu{ٓ P^_FA5Frt'horԟdqlR mֲwC&;q^M'kٛU(1z$aN 9!M𪖁ƤLGs:ޡ7DXA$I\u>F|t|rT 1.Ũ?}eAbRzVsokoc{dk&}-W:2ˬOvW>0y)Pb 鉊DQ?%{x.K.xc))0דPYa,˓j&; Y OAbe/ yyu㤿r?^:g 3OI=C"2NNtr0[A5-g6jQ#0#V*t׽i}^ktߺw/o;4F50FH I =ҢGGZkUք n<W)}Uy1klmP΍3j賻+1)҃)ha;.3'LD J6;b!Ah>AN$HPx"INewP>͹sVp]wSCΪ>*eO@Ccu¦6*(^2ڰXX2bѫOhRyv##Wh!GQ-ڛB/\8ZX&@r4La@OJl}H)-y878v`˶gZJ Q$ ?~+Tl۬6sW6*3!L@y}MΗc]- Ar:iʉv'haĞaӶ<0G _8A.> RGD;:> |f8{ 9 x0#|!PyP`U)+nb r}k4 &RՐ_ԑZ-ˠh%kףKp/3*9XT]C A66.댫@!Q]@[aOR+u[`ÆŤN` x_u kLS n i2t @á `k{qՊڛ&E({Ѧ"e5)ξ?g2NXV>udibN:3anmԖ08M4/wBs*ɔ {5f' q<هfn< tlAd4(m:C1{P[ ".@SOyz3}rg ߜgQꋷM%WВʂ^YLUE#]L}qXVCdS/aI0`9E yS@G!ڂ"V-%LEY*+`۷ dˀÿ.,yk2b|q;x>\̧ oNTVzjR0eo<:>uWŜB=1BsgX8\F/H\'x~O_6KGYG@_bWrK|j<0,;n7Y#Z.թioOAbcy+/}]@'A:"*3UEͩVzVf;XcR RU ÓAIK*Q؄ &OW~yx?#ʛ4g1f:H0yɏ2\ >N;K>wWι|骵 {W~)w'v]93$.| ;0gЮ}n=pA_/Io#(D1s>"\XBQCO+6̀b\nͩSq7;u?Sg aSьۭb칠W`Mlg."PV6է8]- tqWJeʱCOdllG-RbdevcN۪IԥX;~X*iݗֲMס 4x)̀̒uyNKor(V`qPb}ټ򯦈"}nlcܥ', َqc%!Zȇb;Fd/&u=Vbݥ&,L#2xP.=fT)Oak BXvݪ(X;^7 Z\hVk7QsjS:(5Dh[~R*ۓߣV1|qXB4j1eFnNT N$,ÜwV%TdԸd{}2=q%)X). [ *[%Hn(8"݃QХJtRJxZ'>v1Lِ>j{/U"ߚ0[^ReڅR7V8yϯ JnȎW : Vǡ%]\_W;ez&'TfX3T6PH`T="r":j'gb"g`B Ǯ̢4U6`+]C[K*Kr$iM-T/Jwn=M[-54'(Mk٘*ƲOEu9]L$VUiER Mt-rmZ1  1 ?w#@Pz>o@PHXd^HJI{$\LUUCwj{!4`ɻV ohgk)XAD_U9'4|x/=nUʵWmh%̚x ίŝsV#<0ˉ33o91kࡎ93v:h8oS zNAn(ݎCUT)؋F&fYS|) !bJQY ̚U U-nNo;X#'7?x¤J~whX!^i˓徸(vu9. *K[vCڙF [V$)<)~(%VR|8:{aѝtiIX]@&2 ;h`CSei:X삲"G5`1mA|\_` }@*|sW4*)$&0cXߪЋ~a-{5\)FhH$$ܳlO 5jHxb0IrZ Zd 2B6}W5=(AdUi\{t7*r8a899ǂ:3 < 'yuEo7,BP6_&O o""*, pz:5Q&PEYLU5MU~dtvX/{ES{կzSlXu"; MSNMgSazP$[Wd;yO~'9G-:+[,9>Z4MCxp4 ]-?1)X{Ii˷eq]cZkXKS~/'!< !fBP97NuAK޹xN0T#$=< >HH&2[^gv7AzRV!xET !K*_|b Bw=1I -Y̨% ZĕqH% SD;037t?$6>fJrqWVäQ^籽Y{"0abỦ"F8kXytZU MX9B{B 2z bLYJa+tyULv|yQ{<80m?#m@yn9sW(>Obe|@ 2n $ڱk"3EAîIX Ԙ 9˺ kԴ?m[F=jn2ՠL.SLL{YkdU,-0c2tfSyB؝G k= vr̈́iWs_ҍ-썵c [ᩍH& }b,S.S*ln"zQfǕD%!k_sQJv<˰8`=n YOt,vj&p ,NՒP (X]Ivب~(c.D5'80Mѯ62G2}PybRAj6m֢7zAJFq-6jx`pa oD88kT^I)B(D<z7ֶl+rFj%|h˰b~Yֿyƪ ԋ<~6x;/CL,y0;U ) \77<1+h0 ,lkCD 5fJ~Yg` fX'ʘ묳.2BuqID{jV]cd;fАI [jUh@@;-dɳ?˗[,!s$Ge-e"%w_dw4 j]t{w0Zs `tɹL4㄰2!39Ӡ1E*K2q fd4` BUc}ᵓy\M mNlM )3' o5[bߒP ¥.cp6T&]x.;k9=)˲A]@rVv1ulniOo&l3CByXy{_d伾Ju0\T)r) ˑLZEt/uNKJ$ 6VNڂGCmof: ň>r5 s69Dj4oZ1<FmwIqN-gg)J·7L͖`.E{vP/3 `>1c!̕t ;Q8>lrPk4,ѷ2l#e1힘' ɴq⃅&GenDl^OZxC]K0[LlB XoC I ޜyf)Cuq%蟗KU j-W²0tU f11uuU8AB2uvUHABznQ^:Әn.@2HJJ TxLORjp+^* J[#I x0~-,/B3ɡr #_Ə) ġPM`2s,KLVj r8=',gVҘʅMu+yl\_kV0`EigX`܍/2W޹^ƾ^jVa^w#b:TwB mc|U/-uhP6s@x/adK-ƒ詭xBQU~ |&X蓰}ϩlEHndb\g#}d`!IEoCѶ=o=d,&߽FbY(ip2 E +L޵GCW@nOISM`%iZ+[6ȟsk8.R$ 'Gݟls6^ M(ƭm쓛`+f-N5Hz̾pb!rLG`_|Iz;v4;]X'ykݛm/Ha44,00%ewHakt"NݛsXGlQs?kf_V<Ї㼂z-0Gb4**w,nRXkFh`N2AkQ̵y em+.|>,^S զhLk#bqJ6֎ FФ:p$;80Sor{1PnLƲu{\^nxvvh sVd<̟ gϢ#O#S FLu!҃$UzHp7?žk;aPBi;H dZf!pЮiHdxgیk'J!suS8,ky01C p'dcUb䈅yؼYIN>LCXWC֏G( D #h<<9@F At 7B'c4Emintm<CxKOvJJ1r>U ^Rh t09<,cDa,&){枰W#/ cGyK)Z2Ioo3n YqtT;hRI!#a'} kÇ/qCh߅C }>mFT" 12e4_{& G@4YiXcl\~r'Lє"dbre'#\xs7;/oa}v$' F1˱xVT5?x] 'l#D ]pMNN%Qf"^Js!v5sE'tQ ϫ\۬ObxeVlK` :{]gZO *u]&`ws\a B1*j6 .FP$A1 QD3ƓM  ٵ20Tc 3#cr< bNNqbqVże1ZG<] U'lhR DMC~D1+{9ںVag}EGՅ^L|tP4fg:ٚYsI$ޒ|Y/29i1[sg֩#>bs64Ol3^|#&O]޴sC2K(@I υPeQ;)g_b0I,Gd+踤8` э,zgmm'.h9%>CĐδ4Zg6& \ta.tw=h+@1 u29I 7 fg샆h(T7t+v/HbX3b粘F3ԜL.|cNtЍ1vhhBUg*!EE(4kM)CvN-AsbEeY?#TvLpTcm훏Q2Kޫ2z8 ISbDkuF'c-o)O+C7o:!vG`A:gǬ}86{~BxDC0m퀽qV0^ o!ard2H)A#$6q>/B DYCe2@+%sK@p Ѿ&O6F쿐hFhƜC>L\"RߚaFVmJ;y$9 (DȰ1˷c\NKji:$MtEWUӱծ-d>MmplT{ _GBWלq:EhI&-5:fI!ɰ# .{7:Z%^wH`(rZrWeIE Kwc3 xEr0[CK)ᵀA"mv:42:NZ-5 ͇n˪G!v cpe3;qmp;iK؅JjaGc ΋:Ӊ戊,z4Nӻ&,BɷUzKS, F; {8C'o3_tKx"`>`0!Pi36:iYw3`6jO:Y ,CBgH[\ 61;ZbR{|2XdQwqQK?h@47|d$*xXݚ@q=f,LڥZ̄CGOpW?y ~ʤ:dJm @,4%4@W z&ϲ)8TY#-hq+]iVXlEzK{Ǭ3QiϢ@"OĈB|&3'_-4:I0HL:(ӌgf()t[f:lۭ;[59U3 <??Ua&wy=uIW쟣6K3vT^'Cգ`BOB@)KGvH&MƸ^f-cKLjIIc/K'rYTo) UN,R8mXE{{P d_)hN]"hMKo۠|-%|r ѼUI`Λ\E]z3Y ĸYu9]ae 9Q,h!~!TՌU`$Kದ2[cƙ$$5 B`)CĺbÆHs'sYj/,+yF׳;'XZvӣZYR pZ:,j쳰gT=Ix K`(,9u3% ) \W8*tHP- Eح`mɢ $Yc( 2X># Y.B# 1s$/ ҽ6-8Vrd!z*xk"X̞q̨O5' {{mN^OA b( SFWbjU {lP+kl#E(!8![q! 1uhQ0?Hu0n,uQ9"~~wU@x9p#tV96`6[YEoA=DzgEl~i9~.\Q+kSDj t XM FCtx]vdN@"$ƶF84lFZD{MKY .#0,DfE3~8[2E7^K~N_hNr-E v`|^/zquPqt1}!L3Ki-"[a?-$%<ā*_-1=m߆]t]e=㋈>:f׉Q[@pm DeM+݋߳+O>'xs/;l~xw? 7a[ll *L oXN,HS5[|P7Q~]*rb~ڳ՝E'CZI"~gl(Ȏ"~} p)O[=ɖB"5kSH0 Q#@V|_:?IoN^w+;]u'\~w^4ζQ){1n;ȿІu|*ϫ{1..]^J,_ku в`h ql_>COydAb5 A8jج"A*m0rq_Q E;dD [dA)^sgF $w">][8x`o'֟Vvx <;#=ƚ-e[=l G{C3I %v|~ѹJJ>",ZI2]eb'\@PfP rGh8ϏyCV)Pc l^g.Ñ<ԛQ$#rX}%ͤo= Vscd-ak Eg!Ccdc"VNGfʘ Bz|X#I;lG? ^g<_6Qh|n$,ǟk/O|pm&bx'0 H#&$pсJlOU Ү8 !4+(Mks$kvȢrʏP8r$ǕDEȝ a>Iz!滶J~{7s$RH!Pf ܺ[Љ]k8nN/f/D' ^x'en *˒ܢ y̻݆xXarͯ y!ai[Cْ,0 %j}jW9Z#1޲|(uB/ڞX Yk1WpY>s9өeyB'܍9aRG'nsERxz7xӃ >BJZSÔsFiaJ%u z F67 "),4<y*&dQy\ȩ `twiw\iՐNWM~6ljRwa4 >)4n.SA7y! .vTK cco)(;~pM)Z3Qt65b FUh*xqb5tCESջ`2_R`bx}urÍ>AS{dgIo= M54Ht]xv)&sJ2jY" nH9[6^nUw!ir}#7 SnXʆqԚUN{d)ȃȏE67H $G7:J޾a\06*'na:+בwA S1Ba5gSo´J;݀r WtN= q;aK3h6]3Nf\"J2A T׬YQ׼qsYnn8 bܲbH́B5þ\U$*_&XrFBk 97y8Iɤg2 /E1x1:%% Eh9 C-3jSv^t[*br_qSc>vjj9[~v-iʣ]QÃkv'Q8Yӽ5Xר:LPUGcwPva(5Q{K,3ۺ^ ⲥm BX"GyAUq<0]:d] .줅躍\y׀r" OI?Ht@1ri[e)Hch"ss+M(p5{* *&Z\geTR)."SDߕ]j PkzPΕ n.dGHo}cO֯dAq>5Xu'E;Nw1D澛J;#tt[ջ蒈hva"bVaDjC"&4.zÁiNx%%V:CjOs=,'a&n&Ơn}JHQ`{w'g]Iʈ{kfW *qXPHgr ȭ7.[*J -?)ψ9XB{?&\c6cxI]i[㽅la"ކK4'r~j9zC\P*Eƚ9Gm!Dpg$8/iPJ+#K@1r")q:tU ?cuQN&T5" ?#5.:@$+6e2NaMw:-;É^~x[]փuIpe^M376>l1"5xp$Q@p^nT@5spfE*jW5st-Q'V[v#p"2r-ЯX> Q%I ?݄ELKg=B41`Eis~Ġ%,v)@ZVg/n`\jQc Xbxs*Ǽa dJ/Z3%MxZ֩ڊ#Lﲘ|˙ yr[Mн!T惮T [AMV (x[a#ą",y[FIRveh`  $׻!"<%8*^ ]9ݨ\қc. H2Is{Dq o63*M&6~LYW@\>tҠ"75$niHBH(Fi3׼@j鍠;f q3tC.atZ=}avh6M^va;Ͱz|аyвWe0ar,zu{}]DlZ`o_b \?Z{^д0O>*)}>6%ni^ʙWs.gG:_h9BX0&dylsq߈ w8rǔ[)u o~o+c|`m?k~Uc[WJ1?wǝ=5F!Ѐ}qgM7bBGvqihP0_Miq{gMg?mvzn4ky˓b)zO s& G"|o(`>s"q2H,tr$s4l~1xl2p_ ӎ|*?eY @6,6G~{ v7Z>8}m2#^\mt7 /08b&^E{I7X[aC޲$yl5CG~r8TҤCG![Yc_p#PCRԞ5dt y. ȖˀDF< m"|;]Gx"C%)uE{I崑Z7/ dEٚdPCajẐiRVjc'0 g+XB$ Gɽg@D "'-BiMEq۸K^@Q,Bd8l7vnO2Y9u~{/r6 IF4(r>d 79N@io] 8}o丁,8x ٗ'yM~bMJ'z$VN}cM]ޏ矱;,Ovw$ҁ>(V@g0W!z_L˒[T<~V'ApgLo#As+1Ta'4Ut]1dK"Jqs`zn޲?7f:0|< :eIs *5=;9}ֹrjbC8vJF m&8Ȥ;0Z1H}d=?W+tYr_I5h2+ّ6j"(D0 C (g O{\BB  isdrY8f*K6%e:Rzj%P^]8^PMJPj`fb]剩Yڳgp*@1)W=B\d2|,N01 zʑ t0Yc" ag-ֳ LD d ΢Bnb7;cpKq9=)17yJizS |$zCg$kK@\l?,S4ע&:`[mIWd_a %y":GD<̬Fl8 ct%^Z8-޻&!2:NBz2Cɫ=@Zpm,<B}n%KKW]L ]29X 3Ja**taC?T <\Ҕ5 *3bɴu_`1Xk0yXg.ܖ^GXݛn /٢t}Ŏr p_8s.A# :p4!"@`uR!2jہ~tB gR1FS!RgVt^b hKљ":y]k &f ^ X\ =eVdM+fdO?v+ԕL:΍\I$xMRHZA$KDƺw0Py#quAe#I۴bqֿ&_lb”BQýS#ZڰhU"][ggf:A;GC1y!6IAhfjƧ|>;q;[HfkD"tjf)@tf⏓,0os0@8}! _BCK>]242"jpNxh JszH!'t2yݻpO8@!d (_hmWcǀF1l4PKM&U$7PKy.F!angular-1.3.9/angular-resource.js]vǒhH2n6Q1Np6֘\4Y̌0\=$Uu|H잳g}[鮮qmt̊=M8{};,/}{{ l2M6lX{ZDY>a=?b6*lֽHgb>n1',eg2OGe7^ǹ[ϓ"[q:sc=sy6zQ2'A <$o\iZ]YY&c73e'& 2ebN#u(JwQv> N݃gYI^l9M_%n}Eғ={˟<{y/_(ǃ{h{ewk9\Z-2H)o8L\3'OGݧ*7wv\zO.fO +%g ͨLۉ:W55@Mm){yʳMe2sYlKͣi2g_| JbV N% xyM/I׵J# j<ƞh"dI\&,NAQ6K ,r?&MVQ#d:.i,f wl "mqQ3wa81hκxD.`90I8&ԅATt:Qv5jJkW'7)ﲻs;uڋE຀J*5R@Έ8l&gyfoh=ӹ5}lG,êu<{ {B.<[|奻Ha.H0Ncas06[}=N_-1e3XbgBd훯h,I%Um Q50|^F-xp> w:J5/^y(O~[nIK$Y]37̀ه T-;{+l)pG/޵%"}Γqӻ4͉/S0giIUenPQaY>#y'Yiy!pglkN=g4df@3yQ!Z 8 qW-qv]ui2q(aM۷8b Pq bg`E ^sRx:BXB_bs􌆩~Ls%';G'\gn.y3Gc1D 1N-4,r"KT Wİٕi1~B 瑂Uu2 o/+S]lrj(<ʕSAN7J` C87# !FnT5($*$(#8[0(p$PtM $0|x{촜*sPAJE%nՐZo: 1T a%+TH`jS?w{C]k|k+>φK@_%V`6@6GWlv!h$ZTCchC43bF6F0vnW3FP2 }@Lè*mt@v?T>7y'9:^ wt@@1 Vt)"rXo4Ic,!/Ք,3ӚDqH8X&oт6+s5L!B* fOpvR̯d#b6M Fiw329XaB\ĥ4@4$CRѩ0 n^SqrU^%oSa$RǧT:}J-@cvggf'2%: f!3Uehwy =|OO!)Gb$Ac]Fbnx"y_L#&R3)#&R* R%t0s{< 3>A_Jtrc#TITj $. C.CU"-%[çF!5%ten`8 |!1ː#֒@Z<Ԏ" +uF ^#c^<: yz{}+ 0b*^sbj 5ajx_y&N1|27BSt 8S\˜Ƭ&r':2h3i_#fg/;y6;t,3z7мHE9c_97 !˖Fo>jE_zI}F&%Q2Xjsʖ, 2M[iW,[b}5&F_p0n2=K] f%Ģ|!DOO>_ bh0Q6u0U+/+](AOy[\*Rfa&Ҧ"jfIYiLœQ\W$.`Q E8>B |Z[CrXk&?: Qg>P14MO F'-ۑuSy`|}/]нYفiTYd_'"4`To!6 -QI<9GԏXuBÒMóù]_a^P=OG@Z{w[%w20DːU|l spB] B[@[jS.8 r "lC|`fD/s! JդfJ!c0:$qBhV,?2tx"1n9ү#:ZRy\I(\2Xkc%Wǃtܹҕ Kk-o a%9]YSxM'#xzI Fۗg98 ܓcW32Bs./ hm%dhXke' 8aCqQ{"r?K#`^:a]R Mmz0X"o;c!tѝFWEۻ"`L4<]le+Sx٦-(܆Պ3d;Eud +a w$3b6̘!FD cXg kyD.5*%r#idY3$#N6V2dZ"Ax'ʺBfiIPeM`GȬa,I@Աb(=B\Fg|d>$A0q=`'r}l^݋$'n2:jY>Í/IطesW7(86*$ys}@3!D)o2oRKV$ Kq8eF3Y y _XeZɂvb4LTS^$iVAp4`td6eG(t<7A":ܠ2ԹrغjP )$m}/FHPCk~S90݌%l/*>vIXFP k5ApXHsm8`h ¶VQ>0M>bR̓ru*+>4A?/}JW h2>re嗒|p{|Pvȍ92\2ĿUbNaCKv̕ht}=wنjȹA:s}C>Eװ51ͨsa?}e\:u^tBRLJ?!!i`-E^ǝC j'bq͹h/k^khY :#$*4PID{FIG\r"w*,rH.TDDfe7ȟIg|nRbL**qNkEQ#)暷E*sXUN汽98E~mVOdzGT»_v`P69&>͋rS ,Z[?-{c#BCRr/`Ą̀vr)%ڗJ=/3)jdPh"N uQauoEXRoD!\#H#J,7H͓y"X.+oZ~% d\"?y|v,D ߬R˔J*w'[[+,#OdikYUiX76_/p'8z!ih ذRB̋ٲ>m2<.}˭ֻ b4>0 5 k]mГ&"ae)Ǐ<(ҿVSS|a 4H[SБfgE6$pEh2jHp6-xn)K!r(H<$_ΖUmӅEU/Z5VU&HkA+rY:,✬l^UkZ4iՓ< S9v`ŹV/>7 Kȗ-C`eϡaܝ\AE4ȲShmHFy8n1ìX)--HTx}6Xk-hUB[˚{FX`=0QnmKƈKj( j]~*;+{aCnH[{S~%w}? \&$yLf/Ky/C%TܦJ̳jp:}6\!w &nhN 7Ctrgk!:պK#YSjj܂#K4ĭ }4ݼuE uKx06F ^<x7*W(^I {PEor +Z9ɦఊ8,>'/`[\fi~711|dAE6M-#X3FhN θB^(֯ji&=&֚  Gy#QCV xވ<L̻k?>Z_C{zz &W,c0w/z$x rk߭ ,Hث]au' 9\I6 +2 L уoP1Gv!R1)5^Ė9/mCh_vR[#^ #ÙWo ,N 7<$ QFl(B]b]!Ns,ӽ:U"l9 9ՕFg0T+RxnQiw n:XtZrPǸ{ܿ;nQr#h b-kl:ΪƁў&:w6Ԛek)$PM6f3c~hɃ:Lm%w ;Bɐf UVm.ǵ[p 6|^ij%o:d8x_CR.i&D&I(qCq﷝7ǡ'j#Ŭ5^9{oVw^tOf7-X\C]xz2@[P n oQ ƇXjߚՅqkD"si8pN,jMڏMXӴ;*>Xeg {|} {a K#2d#V8}[+H=umEYq1u5m(sȚEчif +kso_ ,_|[;_ g cq*Yb x$R9kP֭ؗPemda n('hb݊-Ҷ+g>e6<8>k%i?UT331 _FVkx/"N{^įV)x+і{c }YzWTCy%R<5yJ^Ն\*dYUJ[[\_qa|V=+2gw:4y}[e/pdbnzzaISevnqӘD+9: ,~GTͲ6QcWug;Hv )gzÈ_ Ds|UPőJ*vyypx'5NG>Ôt޸A@ H16џ?XF'\@rBMG[•=JUf4\QųggTYEʕ|(#&`n܊^0@iB dfTrz˘$CBeGk4Bbv j+yEV8\T~w"Y>K:t+FG#`+rC(b=űAa׽yWo&R޲N'+ ;UyodyÁ p|=c_c)W`wPfjd 3T,k氚r E| ̂{Y ,#F nj,[TYfx0c5P^# ^Y!3_gݎ,D+_tAHF&цj٥;Ч,Zg7qq+ yXɓh8jUcXgFL#ɛ" ^R.p:z;W(BU ^%`xZ%FPXn-tu\F鋈pk:O%ľA`Prءzm(! )Xĩ 2u8y޴%_ZQX=[81%u21ׂP"z]KGTf=+2<꓅0ݬՎ1e4xnlvȰnը5 eD [ t9ekM9 *1pw R51v|6x(+ԸVg&嫪fd"1K)hі6ZVXldо ),}e*nMĐT>Ν0-hEKZ@\DYx 4@zBt`B+avBc5\(UsM-5 5 6 ofW/W܍^_|uoPKKӣUF%hPKy.F%angular-1.3.9/angular-resource.min.js}Wi8_x0]/RjeUDnOjgk]nmF!Y^x,[OƲzjjC܋B (|z(?=,EDBcsn(yEdBt->.d)Rm]gIDž,MJ+n~'Kc!Nx8;m?xEc'I2oK~)[`}ɣ}ӭϫ0*m0`ކBSums0/ZVcUn@ͪJ&y,*ɽ.ɶf X*l(D~{3.q]Vo r7X'چ`.gG>$ʝFWB\nS.1TxT`'WF%ˊ>Va=hDwđ|ɥQqS3@4B;G0x'_ty毉ۍ,Od;C(,TYQeS.*>=.o6;Bp1%Q)$ʼ^z9Q(LV ۫tlFm M#7F'֦pb>lQEIdZ]0?'v3|m5?!OO"#v )oə-D>ҥo +nwC^=!b)On߫E$n;L(~#fWA5K-8 h!!cp"U ; D{2\Dq 2?{5IÉRo mU=몕CAಶMMޠMI,g^xL=n? ^m{]}x|UG[8' 0 豭,d#n#bT$^* MN\KLZz84\uuk0KaJƻRhPH- ̚j ` W+,Q DۖpA[e}OM"{`Ĩ=2͟s\}ȻSEocJcږ|_PKL" PKy.F)angular-1.3.9/angular-resource.min.js.mapZr}p͜KbOZ-e1&$dl@X_rYkmJtRԗ[緝(|A㷝l'iRH|Uli6O}/wYXdIU3%}z wlC6} @Ӏ/~ 7zs3Z߇h|aE4]44 DNDsц~Oot랲C4Є~`F[<ǘy_-&XІ#Oi5of<œfB.*"r}es)aGj¦xkѹ& U>L1% J9&o@ҸCk1 C'l۱x̓]ed#U-NeOvHʂFbJ1QKaLƾ8Wa4i6 ;$.H )^t55ܱ&9n]6J:}}5aANSZ*p=ψ%h5|6]$5:76@P, `_ x \O-= p%h x .~K_*]D"e㱖 t`,rh댦1Z  8H"nEڟZhNWW9MOס`MBȯ"ʯ$^˜\C1LN1h969chx55 jnO Z'"r!D`0pWDjb7ll+vza舘mUH"s5vmSWd9nL4 }Y9݋@W`5pFh-xBTS,we'rKeVqT)[ rdKѷ#&wo-vM1nH}"5KRf8ԑEn!4ՕsGgB*-3':DfD)3kB_Jj9a9]D|[4 ^ph LlTq$dD3<niV96jLȥO:|:Ow")pmLBGnJ==[@T8o(~Q@h׷#$xx"E1,'hZ2,ȍX/qC_c^GMayCh3#q,!jH⾹ R"( ~䖟@ 2Q3&[PLQ8O`'TuZbE1< -EZűBqOb~4˘2j)Fw|.aabţ J'"|ء$]Ze  `v|R7 1NNgZlttU-Wm5nP _h:l])![ `K> D*8܊`k|EnT9ߊ)D^iЮyE5{ˊL;Xl.s Uh'ɭa_ɐ3 ayYUt{[# cel>2K0YZ *ö͠F,H輵RZK"p\h2bUk~ivs,в@)u,u]9G*siu4 ybfmqC] l42%j~[Bvf(^1EQ`05{'אf5/({퀶Xgy)T3|ZE=L#8`x \cG4y.+GVoSC$ٍkPA`;\v.s.5g7]~Ă8{Bfܳem^RzYX򫍲dixwLpFC/بH="o51VCt)tH==>, صyAJqI@5YVH&}È=kػBK˶,kaĎv? MSiHhiP|p KΝ&奃k61h{IP)#3 $  m{jOD* L 3L/HhANڨp;_Dz]>25e֑Y~)5G(~δ}05q+RIuzQ'0ZDT2êoJXS Gn/-^rŋSAgk88s/\om)J8owۿdF㨬n[p_zj>mLh.,cO5Kkopǫ%xW_aB;N[ ~_FF1@>F0l<G>~ab3|f_BCsxAaW@Dm @*ƵZR(t$r(SriNW;Xט7msC>"bj)pBvޕ::0)A* F;/A7 GJ.K7Oۈޓ6pSx^@`? &pMS+nsXADZj և2wHLqi c yTb< BQnbE 38}-+Ϙ'VUqQW,T}1z>OL'T8igi5-]2~&}xeo1B;.ho"JFwxzJRιKid$l{W؉:At},΢ȟq%`1YM%e-I0LӤhhď4Kw9JW y7Ir#|.t&zL_+W2)ɭob 5]pB+_72pӛI=+X%5Lj(34#7xTs ȟez,+zQ?#J 2_.߽{}\C,+9_> A&$: 9.|L%9`sF:(-8Oje2R|bm6ZƟ%P?O\/ȍ*ЧA [iw2&9UƺK<~d<ΈĀWh-LayNo>6q:֋T &ыxhlE,,ZhY]Xc$ƅ=@l D(K3ba~Fe\)&]_U WeNΧ|>ukӜL|6j> FeY n^<;xU7E=4{٤:gd'\mjQWܹ30f'fΚtg*N^5+}0E=h6 `PoXR=;V0e,E0z,|a4/>lxp;2-TݫQЯ/8q}rpΗg`rf'+ټUMh-n86Giط/|ap\O{i{/w;@f?#𢷭3E-KbgOb҈[[g(&>IXCƙ"㲚sZ 3ܻR+l\WKNU9$oVR<\HpTz\jB9qkzvZ-Uo>Z@| HۄVY~NNjj*%,{u H!4Ti3GT.N6rth.f'a>Z-;ƧdDríi3Dp=U@ BbGL|5QCai ^jBE2pQO0e "h|>-'M&ehZbWK#hmeB0|3 ':_BE ʎh̆M 7>'ƫjq~@B; Y+c\5/_CYe:"K}/6mS').a Ju*pZ1 6 ¸̴r^A&xxY<:TI~huwZ": ,Co7j0wTzu"-|pѢ bb9媖B"vhRDHPPup|籙5f: ;ea$H6#h <~54D#:2uu$ JV-[sfE8 ?3^spƶ*16 `یk1)o+@// jc Cs#*K 7d+k} %`O%2MP"/؎HA#hs}j3 bMk@| cq4lit}3 UTl4x|$(-SX7A8ǧs0ɗƥ 9i;\LO'u@2Rc3 {(ŸF'B"ꐋi^WBQeS: v',,מ]=Y,FnB[MS?.hTT3r9$a#Dh ?B(eCě\J>$!&,q&#RR/8G`W2L?@)G>T->!.g9 $CQ ٫gQbFKl 2}?ey. Aa3N&#ÄBG):.c%s]@l16RQ05yb`CAbzOOnUu8PϮCrU6sҢ~{&ȓiT'rIB#o@<%`ecԝ}uY!W1]ƣRƃûorB8Q2unQVj }hKpc'"PUߪgDYܫg8\gq%v-"]!|H"" {.b^ԫeqV?!2V,0dl#鬨Jn5vUڈ]&Z~Q~|Wu#NQ}k+&(t5bp[8 z#ƛFg*r~7B Iq'~g;-C&DN0O ֯rqXYYGid`˦>jz(޳R\H\=pJ-R(-]ׂlVÖ `noմM~Y;ZVD42XC3vk E)D":dsfGfYa]h9/P8iǍ.̨S;A:K7ȣxjMM"|A9%BGJdRi)V0"}b !qdǡ,Ӫ3/a` !#۶  qGq_,f8dB;Xsl?,:z :kbSxu(LZ=CGFwA( B⵾sFzƹSBMQu؈!ޞ叞6/fJH #ηK:jIw9-.#ųٴ4=tO$_U'>s;ҕ t0 ̈힡xAd(VB%UQO Al~Y~MCޗc 0>qL/,M஝tJ<#"8DL %i@7KRd:z.I н.EV(:3O-t:tmR3{౛;\*,Yb^qjXi+DiG uzGx_^k\RG5-ieXHqED/B *겤&ƎGhWТ$æ-uq|J9/%1G,9gz[p $?Y@N EjC1| @X~ Ɍz40i}4@w#QC1jTnj[ 3v$%^XѴ&5)#l}++وWޠ38 ? ڊOGO_w;މ{ y'F`0^~@hH߅aaӯػ1{CN??cu%ah: _|6¡4iw`5lloo'!|z##7Gͽt!zǤl_>ħi7H%Mckcwx9 I%L|c{߶A5L| \'@D\uX#*ߜm`$@@xƸekv vKݥ1c4Jym Z1k@Wn[>}l攻)|SgL@#C0z ~Txtn FW].b6'e綷.KЂ)-uܣG&+=JoYAҬ^oF#@=N㥌iz!vVf d9NXF   ?| O /QXMSul%%WV66^Qt#+)#Q}D&Aur0$jα\OS|89MW[fmlexyHo3M\Q`;E)ł?[9*19mΙ<2J r  y"#cqp%HB4?u-Ir1Q;HBk±T-:XVwB>0IHb5&mnw^0>ӊԻ>9C<aOO>*6!lhdyCgĺz^̉-0xݬ#6,yEcw1 Ćvi;mD̋_|Ag v?ul5)wsXl7|d A)fOQK}uj*)V>["DiT#i~蛼'ASN'nexC3mP(sjb;YN |2ӆjɹ6բQ4)FԓI^xp0԰[A"3uTAn}2:%h=?@kz (:1([ə.?qeH.7 9z2)+sѼd BrգZ ۬y a0 ~0dwr=imdɁx|0!,m_iF6$tZ]R)jDwdqEt<%Y׉{`% V $UhkObˎ0͟}XBE؄yY ;x;ĤL 5vD`Ijay;$;PUWh:Q3V73 `DT th+8V_Vc;-4fgbtOlt? {)E^l`- clҊX)ӂSkߴ'AD+eM;,VX;D{@j 5 8/FSN:[c#^_3Xyoŏa3,O*D9a*(q42?ח3J:AxJwאr .6!ɣO`kG߫8?L1GU.Ew"y~:tdAk*b )VNaEP\,kBЫy_Lu_Bq:]IWJCN;%H#0, kP'jtvEYFUdVe1Skq C mZa=u \?l=MsɈ8 8zrW)Y0rT˩PAPU2Mڨ@ ¸zeV28P5RI SwMT3ѹPuo^znїү,RkxT±Rԭo%<^s|nXKl*Tq\`u-u h)t1+y#0 6F+gVqdW@ɱgU-ђ'& R#ĝ((:%٪S NiH|,@)Ζ4$l̚~@ v^u[iҲ-zWd<נxA?GXv!6ŀqETBzF)k \gj (<ٕ JFBSRꄛ'%+xrkyGg KkT,͙bRsڇ=!RUKezdև/8,y2E-<)=rqic4!quN0 'BcNz:0 HFo^XXgM95 nmp]LNT.^ z. jmANL FM!2Tˠ/:g!Vg lߧz }3s"'Vug凑a&V;uPȢR[))c ~Q8H]Ajr_3V]{n|#Ѵ2S*2Dўgu⊖˵V\X O  KH/gkfv! ,\ @15ɥ(]̺hs<9E:;)>eXHT&/κP3;e ?o—_iJjv1)r%]5^N"29H' c .ϜM(VOȢ\zQC%ȓ&I& v=Ϊ6]Vm= /[_金>6|[eCxO1[6`}QVgKr/28FYzqlVMS^*uNj4&x!9S"IݍJ3.hn6uiLI[3cndm"mmQ*P6gCN HpG(i֬,_&\׸R=qyr(DI-3 FN?)fb܊ar jMSvNzZn8J=3)XtLHݙ+&3N pP$6_EE賚5=̭Mȧ=z鉻;zHKBԋt< ޢR-argmve1n_Ew)4GSxar$k]#5t "|X'qvp'= 8=ҡݒ*E/|؉,p¦f9Gxг8߶mFoM$êɛ) g6fU-'h>v2T'mz~G2Zdλ\5E'f3*mWRxÉ8Fj1$ "7)ZѸ .\7rN~2@:ʯmi P(ҊE\8B \yHV6o^,;R㦤*,9D5N-n-e\IsWrƒXaMP2wY* Dk7]cVLJ,l1ɕrshkq('A"RnB쬋% ßEYW^c#4_M!qt cnH zsph$"< y8@|.rd/$n&sepi8 1Bn%_nmW+DaC-)E!.XXIj!u|N/&.- =gT*un؝3Tw1=}(mֲo]H(U2*j@X6JO&&ZnꦿM;HuRlzGGof`"PU&狚]T?2Kd>yoآmc9 Pûk}j,^%V𪃎f' vawZp[q:mq\W&6łXI30L.ɹwhb(Ws=u\pG [o >Bf&{ >Lq2X5dK u5{,Qƶ:TeijU;S^htmM7x ~z/>no53?%W ȓ;:lY`c^+w d,2y?9$Œtt[\Hٯ%рw_G@>M&vʳ:@+zTjJamlsKb.IoR6}3D 2xq) 'D#cfW Hk;v:@hf4ӧ17#۾l˾K~yf6~ri>ox!3~ [!1p0߅Ӫ>9] qxSylW*.jqtS2>?Gտ8}՟o5p{g9}p2s ~9+WGyE_ɂ%+FIY%>`izT1<{SXz=ќl axnuS|ε d!\m)J]B,̏x& 7#RER2qn }7uRntr%:]|ڠuq*pT(<]<ŸI_[z\j@0P詟Z2feˆ[X~f™oN[J262 λaܮM#%W8&--\!.rt'ϐ:~}//Rp8#΅|g-f Yt1Zs--IPxy.Ge LS6UԕVx5 3$01~XzBwB̂3POҵV ` Դ;I4rYRBh#?ًJ 580her-ʳr@̤u*rYŗ4k̚J\'FֳbQbԖKrc7oƔf˲}_כbwI(Z S#f{vA)Q?%9jbm*v("AҖ[ڗ遣͝[PH C)݀by(^su>QQ05uK(\yzP,_Pw6;I{1͆F-{- FAgib+G:dՂJ8[ BmP\1]KfQp"2Z Ir&NI.{ d?)!ĄC8jGnFN^~toiE胨n$,eV ދ}0=I1T_\Q:2 V(A ]g>!e'ӱAsӻ@QsVmA PKL͢+hPKy.F"angular-1.3.9/angular-route.min.jsXr}WPwf_du)ZeV C&RH{NB@6y̭Ӝu_Wo17b[e4]V?$en|/4_#cºOF|U%҄g2񧪰#Su=e(۲k;&KoDՍ(ͣFN Wu&%qlnk\'q쾍q3ctbl7BnTRűb|I@O\ȸb`Nl-V8ehCYO= m֜/'>ĽǾS9 N/N^(SߙvźA;`٪۪'7hvpɈ,W f]10)LY{F%g}dRS؀ oDôAm !7T2-L´^$Ӊ1/lUi߅@Et.pyKx]LVT6xē qLs9`M4 pT?-f'ХF5ټb8Ӆ5/SM*%/g&xdKdyԡjB9%V@[S:&@,## (B lQ'];"הuZvm3WاB-V-2X> d[&C31wZR1,?؜)ܸ1Qͳk'/ӌXJ#;0Ʈ3[.c⚛qz.ׂ̖k? \?,f2[O !nj?صf&956WuaT8DQhH wfO`[t(OOM(^7uuxnV6j^zo 8_p# qa w|rAF`] E PBmɺ6٨n(!* Ȩ!׀)j VOֶT Դ'jfM4&:['OP9=wU(y0e~2541<+ 8q:iL 힧SޮB㉓!`UXt@E¾W2"nаZ:' EU\~aJU5kQiiwm+uջ%J[{QD %id)Plhط dV«!vS%*Kq ʤ1|8"榎/}H& ubg ih "aǷڣ&AZ @mϰ .P0*kCEbkR*^$RO(;;\N͑i]a˺P4$lSd1z!Ż$x vRA(Gd^+h-7(ZhŜwވD vKz)eu\i4 ;g= 3{Y^p-5"eT#P#AM]asYռ&~=Dm4H׬ ߺ[iPq4aV \%| &s˚Q>A%ݶUxv~# "lE z^Ic6MoO H".PeR 34|:DSn;#ubkF˭%<^N&h}7"F @ct.z'dNSI^FO"UG#6a*)$DeKn8ߤ,k Faӱ CA6/j|YuG;Y:PKnPKy.F&angular-1.3.9/angular-route.min.js.mapZks8>?#o'qb;3@hIq[E˴%R&%?u=4%ѳMUhh48=eUŻ?w{wϲwKjTSeC֏3 ncn'x~[䖇e|ȻO#~6rZOǞc8'݈r9Cj()^tAG/K|B08kw,߇r+!`p~XcvN̽!qH > z 50Z&TS^ DF||pwȵXlMp#@CxmB52];q,wbH;0]4Cf鋡\8 T6B4ޝL11J[?ƍsKh9sN34~`K\LpEuHwoFʸM=t'rcK z4 7vZK2d9)r:5DHx29΂#ngL;gLӠ`?B5կcL*!z z@Zx00^B˥[5O FT.=I;%b}>xOWڅvmd`JajJ|r An\J xHՁ ?x]T 9ش-hf_9"kxwj-t{rL bT64DC,u籛ҫ Zy,6 mf,˧gY"+بQ,b٘$0y5v9)$DpM*aT"atie8#=!n.9>bzcJT" gy"71k#J2ԡ}4wo`0Zr:ċCpJvEHkƊY" qa0KZĔD{ R'(^ZZ)%ݱL!yBVܥ`5^7 ?)ƏBy(Y69gX̅C6SG50Can9Fj A(B]s9KTG4?F$BȤٖr_xB`ݜ8/-jJ o Xj"GԆC玄JcQnhG a@EV3DdGjE, wSa$R-T  kO9:̒h$>X>GK1y'|?uZkYJFBnmKCtљpT0`>hP`3 9^*ӊ GQw!LLKҽjv>G5]ɧc5“c #mr; wڈ;VE~('g:.́WL}a_FO$:_u(HW3O@Pj՝QڤX& [;h_(ǀ8#4<7;]/1O9ʨ3wNZ$e"\vtdBL2M"i| %$#D3)sS8P0- 8/TRճ1ް+;[EjX'}2A kkSHbdxaȳ?EO@e73WTwcbaV?L|b%IδS0\ \,8!%HhG`.{ Y/z'(0h &y/X:~2-2Qsw]ϩ$O:恮rJvFK;.]*%9ces+<t:\ĕD'BPz@[vS"WTJ}-n"а՜bfW>նN}FJLjB%sA|2еဝObOVQ1 gx׿A!nN17m\|aZ7WJ: 7)t9- M,`vpl1V}mAai qg&R}P"+>o]rY:m(55ɒ;*xnZ{=va#T3j.9 MV魴;r6jG; 2V<Π܀S2${atXpNEO]S>aJ)o=2+>}YOum6K8 S4=( #hGp?Eq`[S,<^ AIagcr%x'Y$G9MNYɣ(8oȰw[G䵮qd''5G-4UʖR=qvP)IS6zn~R 1{^_P>2sJp4GgD aq0̃+!鯑IogKvpU?٥j|DGYWSc Dz0<(Q@:yCLR{ %TPSn=\gc%:"eP̸ ӧWH eY`0Z8()qQlQD9pUSHH]0{}gaUti.%4>0$^"Kc!K\7^*-8~8AoTdWSt7b| {PW}l;'U* W[?1^$s}΋InwM֪dIb-Ϟ;I,WoH.Ҫ=' *U.\f~&`Qe/dY%EVRcS傯Y6S2H\V.+-fV:˒b$lQeOyY򔹂kI3rHWU&@HYܟ(.#bb[i23pli=oVBsfeA!Dڍd,M'i}6ϩH[uo 76g3_ul/- )i-^$ێHh"4f=q4SiDDh.I^<|ΪH`ZƅM.E/dgU%S),,H| O!6M biMkbeh\ZpCՍI):JВQ%{4~oܻdQPKe<,PKy.F!angular-1.3.9/angular-sanitize.js\zFh3l'3$[3$3+)6H$"`Po^c͓9@d9sUb@ߪUݿ}%0JHmEUw{{`a0{kw׺F=˲Ii"Դ,~hZ\|&/MwՋ=D[Y."kejgh-dtpΨ9'vIB} ÐG cGl/kԻEa'[#sȥ7έ(T@xL}O'(,NeJu- &U(: )(n Л-SFj+$iAܢ1fi-Vt#2e!5QAuhkk߮{rMIe|5?G>NV߅nzK:ZjGpfk꒠'q9BHRצfRP%Kj<:)|1R./kKx U<>tKHuR䘆Jiziq9>ːAED Xm ?Uٺp_}8ER^\EƜ)V\E|{Ƥ[CFMӧ+PtK蹩=p!++H˾$4h)q08 "hU-~Sh(p_MEFHqь/[$J9k]|K2|՜$&ԘdayI).V.Dm @92%0UnEd?آŚN$60^\"5 `f]ŁI5*tJ%ʅR(v'@ ֮5-0X [oUyZIrImp*W s5X3عㅃ<@oclɋ3+f'4c7RAΠѸ"NC~4h;]9>Qi=,F ~L|"/=Y6xLk{'Vn.9E_ k'ϋo+,"qm{g;~[o?mv?;'<(;p{󠸍_Sv ?o;:(t:;;z([;}8 ?賦.ooIw_Up0ȼv`\ x ȨR콅tJ'o^ymv퇝nwˌ͓oܴ!ncv}yw/].wͳo_?X<'Hg';LcR0J.+Y(:ܧO_쿁38NSUłvp$g[5Z XTr_chd:k :߫p׃\cM rYYPpB<}VPX9\Y#I_8\"Js$&]čpov^8ydã @oJId3]t9βRSxTI &bu=\ȫD*3@\>Up 4{j̮N/NAGjUF#!}Cc k A0\b|zhR旫uE]==9wZ@Hig\cix`xtA-^$-*l!3[+a eMrq3Yz6ӃXFa-`dQ5Nu4cxu,͹ F: {3-|ںNt1S~_0V+E,B`*16x@$>{'fLDo-/+-*'Dpϰf1",ᔋ4J~?'=dl^9I҄Q"uեS.PO$9O(S`!Nγ< &RY+CB'#]lBF,93L[.QkTbҥ$NBjk^dxC{uWc:k; ?y/JgA↽V&^IS~h)12RNQMn|sH /|`R.K'Zp-(2Dujh,w6('Rq([p )V`y87m(lMK|. 7+D ]@zǓi)SI@Hzj"~,Ȉi&3Oe9_k4Ê{Bb"b T ܛaS9૬;bǜ>6ģrjD=e.QHMR?:i.Z$>j ؓVӰгE4Tpk vW>Pxo%vH`Mx b+AUT4cn f/@伊ҎY @ޛK ZL5 qDN­WOfmuiMȂ nI]fP #z)L_رY3&5_o(+8.kYEY S 75I-(cIiœLѸ{!+ك{Pv 0a_^]uQ׭"L7$\ݾI7]&81;;,ReTJd>0u֩JOFzqBCןX3MͪrUe1IGrh#WRxd9v ~=Ex B v kN3Q j{y*M߈t1da>WsFTxSFZzSH%o4w|/[2aM`ڠS 1Nx,i1]3H#Ml&`$;x)wDdFjl&G0pa'9HjI!n T;݀|h59V4 ߶RZJ2U"6O1!|aqT\IV a#Z!v6b=@_8mTX.VE- GwX>-eEبV[w[ԋu2Os-@策[:FA KeNC-TO˓:՜S ڃp+'4J/nY q]}\;Dȳ߈ BZl6v XGk1d(9bϠOQևhd)lUɇؽ1Ypy-f0`Fh4}ɫL9@AQC- )v<{P 7_U0j N _Md3/!|QL=r{[ď'5zF) l8SF?0XN`"ࢩQ|\J`5+2JYYĽDF潟]c" JsGܥc95 k j)RW>:@EcV0N t=0+{8f 0 +!  :R3!p[S~{VQxQ,a5MTb' ˀ\9!C"1{ k,CfLvi8w ҋ )9'`jb@hi3=G(}G87ƴ_KHű.4?P$@[cP(Gr.v!/m杻^ Q XU򰖗dE@=`J YW/v~Ixwf3yLg@d>1'\Y,ɝDjlQf[Dmk$f I㬛8A =1./Dq:HH4HmZޯ m*'%D-q,PLU;M[j1F,E$f.hS`T1x=鍃D,%@%)M{,!x' xOLGV ! xs(tUӤ8ndh!agh!֏K\Mu@"JF1[m69L=Yw<=b=*l}5 )k[I/w9(6&8+&wh/}憢g Հh 5O6Yz #9m%\.)0U 9 *7l=S@g!ap.I$[WowT6W*ޟǦ'"mɷDRmt'Bi E[J+h՝7W q)G T5 -D޻Yw Ӎ#q3n )Otq.c:hBيt8`zHS(8@Fn[ ȱwu?6Vl@3.m5gΛz[˧)7]wvl&$˳lR7f/v8PWjvUՆ/ ^ЪiDF,&*KzS[Nh_ڤH[ћ@fpCA}Q|ApqZzxt^Z=C[%}m'4*n1W|~1!ĪKuڸáQތk (pB=I l {m1b̅>̠y+#^2n i;(2V0_wZ@s?(E_p%ЁhN A% [0h0dLR_K㚡s4qWu崳ѳf2/d24X \Wu$iN4 6q= ?=itɟBВ]b,2X89]:/G2$Ofe[8<&TnNvy3> ]L$}~]3`4p( 7{v븉ȫWV5(L2r`׫린q5Bp#{\9fXxaozඒR7; z|'ǦW^=C(km=U ^.R{|{% SGA.3؝ʱRyuX+:80ȁ ;rx)\pGV$n˩"0\ƾ.47pgnɮUtTXаrnN^ 54J}qƕi@ cHn8Gt]ISiNDVF< چH  M2|K #4{sUEL ظ/ WLn=#cSl,.btAXF( Rޚ6ek!%Z:& zN9rx:w,onk?۝G۸=AVo٫/T#"jC\[l6wW tX,|0*DwKר">M1]`wc2Kc8iA|,[FΎGy][8>'2KS4#9TN'}sOdo8ۇxT FM隽if|s{{n(GpީY{9 @>7{X52;Tx O. X^f$ ,ubV4;ۏ%Ȋ}L^鎒Zi#u;$eJ"=uDYc9J[{)nNSszantm ~md4MW[޸gՕbH|ܘ߄qpj="8Um=R8Tw;{K(_PK>c!]PKy.F%angular-1.3.9/angular-sanitize.min.jsuX{sHߟksXcZ`;>k7٤6ٺr5E$1g_$lH3~wO:iXRsw~б}9;9=qxyea6YY烁Y3tEJ uyV_FYj4\Uh~켴ɰ,EߟI]Pi'EmYbvoҕ"ҶC}d_~Ұ ^O#9'd-)c|=);Bi_0ț>g8Dz(mVv< 0v۹zݮYlv.u>#K<EGsѸˮ h]IJ65U‚GԶXBx`@ 6 1m86) VTl,ITjʫg?G-@Xz*L[H!R&(?W⁈Ʉ`f_lVoQ% 2Vw7{Hi1=j.lqϿ|M>`=k]X߉T@}s| p'ޕa@` ݟ}zrOϞ?=[:O=>;gO>}xpG`m2\B܎{FQ&H!1yo-&o(D"/Gw1G8ηk1/Νɱ`Ӟ aM-hhr|$H(bCpǂW}y%BA* 4` u8 8jCp=V\:cts}܀޸& ^:w`\~Ǘc2|<|== ON^z5M=})|`fr'ږ u&?i VH O8L+l}9%TzY2re%3ĔwKKLXwP2"1N@)1AUQ*G-(Př?Ze"_\*JRi TLAwtGAL(WIú)hfOhfψI5[qZP"sB(wA@V:K*ѩbX:U $=HQ:KW ja/ȋB#ވ@$I"SddT̽b5CsJVdJT$2eJ\FAjSCB& EeIAFp/T m דn3eZ %GՁR@Q^@ ݙލTQB U>\PR%k-4S0:(e KIIT(pzwKXYU;fDhdŦ. 2 ER8sB2%)pjLt6۪\nxAFŻ A3CFF8q~Ο[$”d\\Fy! 2ͶC9<0c1͂i <P`ba7@]p X~JCk)G*J3Q-4iXVwڨ0>MWAYn\%)=Us;̧{~4Qx^$OQJp8_{Vēlєї_ sS$EKBdk`ny9"N[IxU#[o3mC8v$b:CHYtE)gdʰߑba 3SZDo %,Q8|iVa>0S&T;\6$MD׋j?YXGM`DDH)Nٵ3rE[KٝLg 1b )A!iV( &8䝹" u#30(+[oSVVKs4WXĀ{lzIp"6Sd;:psZ^H*X|I s~5,@#’ xͤv Ax=pcs ##:2a[Tfm N:#nW|hWF&6o0+ 'WAR5 Xk"x׾ȋZQMyeSZ5!b=\ju^=l@V0-# W1#y-)[%iQ 5W7 a}\^ƊgFz:FQ+PO\EpOqǶ2i4\gw"!Y:B﮽n[+/ \V}n׿*-T pvy|_i/jLд!+ s-X|e-vo۞ŕ8]`Ÿ*>!8[ϙ!ƟQQ!~sqi+|>4 }72^t7u\º=_9hwО@j]H|T=>{jU9f'u,.t8.|bǺHCrnGG^!fBp{E5:%qә Pn -:A_Ե4CG+h#"KP^nRhnM>Aw@s m kb=U2/znw ,^!_}\:EVi_ydoZSI> PK%ܬr %PKy.F)angular-1.3.9/angular-sanitize.min.js.mapZis:~F*ߢw9o> %QeRlgj*EKL[d-^2;4%ԼTF.]Eꯏ?^]f_|%Y'y~γ+P̲:;c QXYb%bzZ@N |uZ)jR]gRsɫBWƵ؝:qoG5$Tf}G0:@r?v> k3Mѧzx(+'| BS&O2>/k n F RQIr6xbkaI :0tEn1zi8& |mN2ԝg3 J,,cPF?miRYR,h` za$7&Z UkEd9GXV#L9 yIC/ӃzXIݺROJ).DU`[_;uNԧRY{:mHMƜRSLYk 4= 0Xط-GylcWz~dl$@eHR"!EzzF|<2Gfe ?h0'@n0:b99cW #j+GWSK`vZ P[ǐE <|Ǡë7-Jatv? AN+QdGv, `Pk'# $EԜК)zxijڅ_2Ey0w!GN̄۽/cK+dv. %P(a(U OJX+4SbERD#6-ޱޕnpb oC#}bzEdY r>it[/V%"^`K> HL$% 4K2[z3"߇Nضqzr|Pn'ލ(f0Ԣk=0}zX! ڽulC>KߛL[A?6 #ҠFJ*Z%d6ퟑDa.й%= PX:.ۂ)խW1&&3Ww~{l:f-J[%CC“C!>:~4iln;+뱏4Xj,y1!E\5ujpoiD0;7U1/F(īIS`ީlb 0Rfl ؖ"[đUxKѝ{l{ΉGji&8C~SQըk(UXV#a5wZ!Į Pq?a&;P*Ǫg+&yc"% #CDY'e[FdD 2.J{1 3PyՆs Vݝ}X6bofE7g xT=f9gŖhYKQᨡ/BBWU{m emZ8!ĖVJB\7߭!j~P !PNm?jR6A{o#6U׋ަWz1!KQyNj"@烿QM(ܡBsk Gw.::_ÊN9|S1]PܻGX6VzɩG n4e Im0upvhr.0U!z*}g$\@)0 0 %Q)&u岬[DJIm˅_m :()3".0Q z6ã6Fv)97v#Ck8aBZ/&1\6VTKcw[4&-˽)4s<WFdI~0{=A2c^а$r2"C8[Ё?Y/W$5iBq*o'`oОЭu,گԂJU5,P6EV :7u Ic"Wmauoޝ{ .Q&;5TNkت̻$6XqBl{ý8qC0|^^_R4e;-H˩T8lAK,)ϹU[ ,@hכWRUnRѦC*g1;ꌾ C@;,.p[A+Bq1rs-:Zt@T?iVeE6po崍uvdDiGH3n dFNH0 ܲs;siݧr_%Mg/AEmMRa!Q.bx<=ԹŘ8@{Hf/\/^*MKQ^bx%Bb{""%N)UspRe7F\&v{#zYB 6WXT~hpnnt-=[.B>'vЎnDӢ׾!^| A9-QэO'+_KB e>r(j=ШJV`ʢP 3 ʥ6Ҟ6,P ݛ"_k{v۔J `kz.eOYy<i Ő`AAl,&[p'<pHqsɖPμd,"(i~S8/$OjuW2>exVP5Uy47)-ze%7st̨HH u4q:jcaU*E4X;r-vs5tZVhMc\ :یˏ-dk?p_-~]߰eZhu`އ=T[ѾYr(gZ}OFwCHM^`u`#\M8^*/*d4# !t=NZN "^k_^O0h']:\t6\' S%&)]^9ĵ"f9'MU7c?uǝi)y>1+NJ9&,JzEۗ_s%/ \:Q`&4LqT԰vDpwӱҐo=TO3t<ҙJ84hVdx>cNٻ>.&۠1̳[nNγoez]S# ɓgdqDkOK8iwKaUZϫ|vRtm:w|Xz3OnnŽdk<1gN~,# gi>\AXOl¾$Ա&Ym#}q'G-8YsbDtI7I4%Ӭʸ-Xn+dfE6.kjl6l.gɘ˻ps5c͓͘tLۋY.6{2۲o=Oh&x1I|r45a7fMo,^/qJX4zŒn7: ]*=9\JoŜ@ aϏrD3: ]2^DIdç]whEϻ+PUKe@ӇtL1盻4/rM&i~,,Us`2{*,t2 z 7~kaQGx~q *dd47[ξez?O%rTbujg\Y4hzOώFݻwti^Lgn+:<Κn򏵣of4}hmܾ}U}uv",]o|qW/n?bU<~s/xsr63E}CO[5`w+ 4x56gό s_s`C\ Ng3Xdal d^59۳;}zeP@B47``=c==d臆~p){`9y#te%hnsdx BקAt/ً"(7ͯgS[x2>Ȍ3|2NF@hTZAQ!=^7}.h_8+&"Bg&J68 Y}@`l:޿) f3?bT~̞mޙ=~7_\1ӽpKJhw3hq\yxPG'/z8z]6h.2H bq6:9=AۨhFX^utU}qRR:Ӌ߈iқTسwLNDׂlo+MVZbN1Dpv347eׯo6$ <<;:eCdQxb++~Ng͖X:1e\H * 0 P=:6/4GY~-kYCwt͕j츻zp.XQ.$ O'h^1̓&Լo}in"Ҵm@_4. f0hf(d+YYEnmaJ"D|M MT7XZ(D}lI(-J3oGL>zD#$r<W KsA -۞6)#~v YFſ`z9j XKw*O/!sf 6u C_TG{v㤲)/`> |go=t. Shn;;h0la"b:AP x3zsv74gYQ0}ۃ,d\dY]"W*(h}8GM\}ZM5ZSћ\j Ֆg󚯜t>,u6F\ $:{+Ϯƹ«" .M0R+}q6 E# MY_tE_oZ/J-}V<-p'fB&j>B6@Z Nk20km4DkJ%P1bNLO%a'7lOZM?$Dlnia|l|?VVƼֺ]Nxu0TG b)efw۝"EC_ooO46Oț-_{_.tO $Ds |}D0eu0ɲ<XvNty`n-%lK)~3>Ee:mT@n9Z0l?0ΠА7_7~=Ʈ ֽ Ԥt&Z/F4N|އ:xX- OJ(ȱZ[pՊK-g 8N8n3TRlA^2"zR&}kPh:=A@zA'gF.}ck^7Q?oiUP g"gֵ^BWP4,e$̈́Ueƶ}ߔ7|ZXt/(%2vF*Y/ŖF\GNO2aU}M;vސ ~&puSR6`ll̝N5-[eݪehglZdzQ RZB~u^B0dmfV#_\k Gh\O`S,/֞cc" 4mwb5c5a=ݟ]z wQƁ *lY-v4pC< . CPF9fHwG\ēGxn} َ_-F@ey>I/Z 3Q4lP w90^0g/(z| D*hS;I2,otPH2o]Kt6PMz81'+@ly$ɄDN[̸O71Mf 8:|DT@`&,ۉZZd* ߣd{17t@ Zī0,hԀaԴrdzPZ׀ۃ?ށآ wq LEyϺ^@[{%XP a AMڲ=o$lxx,a8̯|Cc2́ &[l_G\:B0owwWN'ܑy,r(%kK|D|"RHl$qT@T٫y;c KL<&).`3D $bn ^ZTШL'hb<,*р}P~jd* #\펶{|z%!@/ώz#A I`F/?-ȰR#uB|NY zW#G)}hfus8@6Iя羚2aD]tWĎ:wѳ9ݒ[.as`cO+ X'Kޣ-gIT/(9iQLnjcj?>($h p1kP@( x+Nyƞ-3?ն-in) (C䵸lrFz6? ڂ`YEpʁGt%j7!{%,0?MG9ӍjxҐ+^Nd4 gk5BZ% |S̨%$)}Т#(Jpغ M;r. ʶJ$lʊ:O:a7_㵯x鹺x!)a܏Os [m t jtWZ,_5OU\y62" _55!z!̛h]GKwC\%:$KK0Qzh ;yRb=ȎPrc\a*BlĐ耹ߥ1qrwfm/`Oc4 xh*40y1*74|7$"BS8Q!ʅdwgEMpT3kn@A^,moXoX5Ɛ D .C<!|Je/z Owx{n'jNVɴt(iYe.B" GZx1, T7ð>|1A P`&׀AdnEH;~ڝ!ʙlL8)؃IxBnB H~BF )NHr6}]4CGҟ"i6kzO:b+pAvC88O43cqy올O`"/1$j'kd!ݐ^@0E HXh^I̛ص l޺g`)XǸ*[ѣH ,l[;u' ?\u/OlQ#,HD\35Hv.L{D&L(jX_;QM囀}2ڴz,WAB^]ZIH'g,oBRck<_O&K9n?Π}!xG͓ə:L5p`YuzQ8C_KH_'{n߄NKߡlKXy1 sfNyJTjBRtF*P^;"}JK蠞x6;vA|4&'ztERc@s,h0J*5wC m ζ]У9 K Vh8RTƧyC\|ϟ#Zl4w4Sk!*nuQgqtbT ҽs"NB17XO<bd;<IĪFbC+ˎX&Wu7vD[Pls~dvM1&3*;.rz,]6T}lFJHLupfv1hrny+Z"1Khv5-h^+M4;\`blHu&Gē. ?rf)§+]ȣV (} OpdDs '|4@MUgtl0h*6? ZB*|~QPB)#C_!|Ul!p;<n%JN,P;d h%Bj kB 8LK,C|0_G55U>lߩcmipoVT ;Q=%<㺚֠f" $~‘u#_*n0UY wF+dc#}^B[Byxo{Z!̙^pS{uBkgdxtݘ阾 GOFB̅|W K yxYXhUH۹z0~:\tRXZ3Px((@1G&(=NR5}]8lhZM:2N,)=ytÝ3$F1#ly-GL2C_F;WuuYR5c7셳񚅖ڕvmaFnoea; Ka5σXQ ;as2]jyhX0;R= i+Cljo<>%R[a/-sz NNPhj{nl[o/Z[ \I@Μp%s5{kn.T14G:~XM+Z/R|f ⴒm+cίP5TxՃͦ:'}[W g)SP)x|T'fC3Ac6~SpxBp$9Xֶy09>8帾%P 3d#_zh ]pUB|&prPxx"6eAC=)8ꙓlBCDl#;$&Ph."XL)VNNCʎI27el L/tpݹ{D]<[Mm񓠿z ֶ$](J[1?r*WD1DG2|&M}qj2dfUg%`I=yDj~èvs(&,D#)ԔrŹkY I6Oͳ2N;QhD2u\dE{c oUGp N?3J/ոf[r0mӥ-?/dGx$@1*#O )߼=r ֠)OwO[pD&@5!~p"Yջr{xT2]oP13=,a"UsX@GՉc=*E3~M=Lhokw0Qrt2Vh7v+ÓG.qZK|c6{-v4Ê#V_&6{0A+-:nW:*JLhMԠ%C=:Bl:*YwZ63|1r/"hukR\7GҳIZF}i JV?o,߼u36 OFJZRK/ÃgVe&PIQZ 'w t" wXBU'5dgԇ{՛'+fz|o !|ϲ7'_F6JfVPX ԌshƋ0!TW23$bśF]k}i cnpZaL8E/60VS[b ̪4H'BXpdgZW8aT҉]|S:KIG f4#bWИ+y i!Vd̅.ԅx+_l l!1xt2R!j)4%H"I$O$(#trX^8?j>ZrM5,k|Ewe/n?/]evO̓'66*,#Cg-Z>J0~6߷Q1krY&-NBY)+³2qZ{%N԰JZsW)HҢwCEХ@HVdE;֙inZ ɣ/3GȄ>}O=6{|ʖ<+A^Jc1˕kZK}͛kW٠,&h;R]RHE͊C\$H}~xNM`%S7hB,0ŢejaJĎ [$/]Mۜ`=F,xQLx՛jܑ'O_w6| F5 l w"YYCbF}Mta9,Հ ;n(ɝ 24w{O--LGKPDC0%#zmzq&noIF.U6 ?c-)IgbA9C+,vc,s/ֶ64#DK2Z)_E3wk;L{QIvolA)|nTjv+T?7l bO}҄m.:4%P eiqdВ,X en:+H=B Җ`M[;`쏥#PIHŠZ.EVEyI:my?Hf˜(8|#jʢ{,IiM~T]21Q <۲ve `=2@^!9k4D,Mϵٺo ~.ozjڊeW GeN_=ɶ0x3g(@bmzgj dp)u>͹ڮ^_n`8?yQ?)Ru ^XD~o@EklBT7#g;SNJ* 4GȡE-4@Xhϴ^dE|/pՖd%k\PhަŽ)!s kLR'p)WN)ⒺĴoZjȚ֗*ac< .mL-0RnGh9pV"EmYג:J9O=>7$ʌ#i1ΰH8+$hyΧ;ΊZ|OImG  E|9\xɪõ^N&Aձ}ů5y}>-GMp8LEW]\)H$ vX=eBrZs3nBWYnǶaT/> dtT zoὸr5ڨsZȆ1d1 6x ȑ 3k76_řnڦYYtsKy&t'R>|eǐe[X(VfxKO/}{<_xS{ wӐg<'sܝz;B{LE'؂ 3Q/ RDXt6;$lV|`݈ !ck(2F4┗lUIjp%:&mL&] y9%Elj[){'}z1f'pY_٦5;6*xLLUxxY\t!@r>H@:N `Lf&כ; lWc2W7$iԔ}x_i :ZJ7ER}[T{zN o 6  )^6-/ė Ű9]|⑏[y3Mh(>|;k+6J~mS( /:ƺev/v.BT`9 i1.y/]8g"[] ӟ?Λk S¦k%nXªh%+ȡRLb1 V1]XV” :eFz%ITK׺.1x]MPk^`Bv[QRqVj0<ҵs*',=f >6+%#j@wIO @/VQm=?nD:32[V HB0a.JWiAplӦ(!.8%$ҠTBYSUtca#2,0fBQ͍2/&/n8<Ł``niښL|5խ*2zB#$UgjsbJK+m⦝^&:L^MQO# jw̒*yctoQo`Vw&T$M67V{BFb3m쾯npGG䚛jrhK^@tN#̴eG1h @?䵷 OS1hɢW%m7X8iPZذtz!VŐ8[vTM X>秥#4(k3i(#MҜ#X037Ac-`pp`uiʤM@RiۇݑxCiMM $g.Ta S*L ^c|1\_?`:3̺x;%fKh֭Ϻw(uH!(R3v6))#i9ʐA ;>ootEY1cCr(]W@AXd>, YO@&^zQ޶ji2`>Qx"PF\]5Vn% Mi3Os{*`Љ-:Ŏa-fiI)S.Q!I Dt.? ~ Eeiٙ-,4l9{-B3ΞZT/%766>^ َZi3|0T~ G(i@猢Mj{TWYͧKץ{q^|݆ikCʠ5N,<楰̲Vg*Eԑ ҎgUx?S@Up_! }R֬~wVEh ,Oof֔x=^ֳVDo3o5@5!?[79۶M~B'4%ּi^_oĈ5qD'l8}ˈl8e<l ͅ <1g!xG_(ϊ}`F^$J39 ~ QJmF#")H $\fV JkBP/B~N}w[7#h 1¿U{s @rmĊm-zدھ>m^O@5@QupO_??tF mϛK|f/c SС羚F@64I}6^T[rݵtN$V{c?VBƝygo4JR4dbT,w7j:1x ;|4?׍kpb^'d(3ts}>yBTY׽H7.{VӗމtXn B3Nl/" A(:DT1 /ǻ8s$;2܊Kwp}>ڸ,\G'Y˽֋EPp0R.d%_0E씵bbnt ^' PVNvcDee(-dxI _ oQfc,/F86}3T ]]3Dy5Sٶh 9*.p[iI1uCy)-k9k^ǡ0fjM $D4YC^Oi6h[mρ+:X.)EKq/}iƣrmjRP(I`=7)Oaz+w,1f#$rRu8n23'5 td:ĕd㋬/ڮV%yНq\M% ʜ->Dc$|rv܌]ξRvM8%L-$tLE̪S9URaz QU}iT%ȗ;z;:-?[ő{RB}2 YqNGOCqG,6Xj`CC|ɼ}0gk/x9 &)6s 7`rJ!h20{\6eFm[9Y/i)6;'5^ڇ!:xiy h&\d92*]?9ϝ2'WuZ? l@ ^ÅXulV>1GtCV`:T@VSJ1(BfWJDLZM/$0q*ZKۮS0?CpZa/kڵF'Fدu:nI(u j80\key65w@uնr{Ȟ6m,E/v.oga|kӿT5Nv,:}1?|z>_$;XtUS%?T.N<%-! 02ҏ#!MWvbߞ%E2H<>lc<,] 4"m.BۙKvYn;CRv X"[<䯳E*GԴBGXngث^uSxb)ˈ]M2Y<e3xL﭅%{2xO/CxGBҖ5ߔ<-VbtHBuQ4GۃfJ8 &[IU>FQnH bA1*/ EiI ~TS,g:{eӽ<#7 'Rr@A:Z9lSDuI?Ch>zQ()õ 0fIO { f.dTT  d::b (.= <:3.FӃ)I<ȴGa 7'~snD2Ov7@t威PHTQ|_,G)*$XDu.w@:2!St/ayV<)Y_s14Րzpha:8Fk3x7l6뭒9wR zY-LWK[r; _X>fAč t!;:$LMYl،)?F3 {x'N{?hRͼlZn7jT75<*T4Ji(oYA},pԒҋfҷ!\# cWigM_=Ld߃[VW"-1:ڙnf: ߰Ohc2M۾s s̴[8۲W\4#d<ں}"_v?1K"1"} aExX/!yap+Y1ws.z'W.^> Jf{,< B7\nBR|_7{`hjᢻ‡SKhpȹcXlcE12̍X˖>AjT+zrA>{( 6$uRp+ * JγXAiNx/{ 7鞧ҏ5|.XPvf,+GyK#Sm+I(\p& .\i) t8^ç%% ]ÅFN9--H,e,M_Hw5:L\F ӯf+laHVpQFŚr%_Ѣ8_1bnUU39žKFw!*o`Žw5Q+ޯ(:K|% y}qY~OMZ֭;(~K%3;3ۤdҔ݂?W7=]6{nl%W6nꟵ?Z5ޥ01O!NaAAcoAi]QqIœ0fHp}B Mx^t ?ݽ<>^ 6YD->3~N#?,ur2j[T Wy=F-~=45yV<4*bk,7_^W5K6Oħ\q.'tJbT֒DTپZ #^q3a~9]fE.n {3x#pmрV.X.[X&np`^%`Wኳ\}ŁԼW9t I4AߥyIo @LJ7QX[|5E=SȌ‰ ZІ6ps|X]@^_Ʉ \*F)`[( $a[%*8Ǝ[vmʩ2upc%tv ~=!M e;Ivd;H3 h)Rc m{V|_OGc!caNymJuo΍HtkCv:$C<:F)^!e2_厸Gay79i>l7 sOO;Q)wR%e95s4sE./U~YM ;|TM)˭BI+We@)[[$,lݭUwV]9` 5P5}q7 %hLp}Lť؂(]Q}ɤv  [7-s%ۙ\=[Q/+Dр!}1" `G2.̔2 q+EҲ5`ifS^E;b{=8"LȘAȩDsպ]sBtW}Zoщ {#/+R|fnK2T B)xVa*\P$ٸЇ63?Sr<~۴ jjǜeAקK [$ V"M $V%yS$?j,zi~̠;y>DgTB,O@Ÿ2L%Uz C`iO8fNW%v|Vd B`B0lg̶ GyzpX{|]U.y$o,oEsO6ٶ?8_Jv&TDUZ^Ե5]tҌ@eiY"n4c@^U(zUq xnbAXuK攇YD/ʰ+Qזs,,#^ y$,*um6r wJ˜3BF5u2œ-m؆Fp2Mk-L0Uh7ЏPj-+ yeNl_̕,2xsbȐ.?g yL_%@`#6ZE'\ē y @f'.i+m%kd:oW}˾U ֋PSvdwU5>ks) =Zg7k|jqWcT'KZY`.S81N(ԦgZRo2)܇]X1`0- rI!d?[iٹyn1Q2bE9fdz22HVdӬ:x 'b' Zfhn{ z&>Nř,40M4ngO& Y|B!$9WЄ9]` kvu x 80f(4r޲RF pM]Vh]pĺ%h}x'$TƾUj):k_"6l(p[Bkzp]9U-{9?g|b!i~ΘkJdܤ٦!.9\e#CblbϑbTٮ-|czX:z ±u[ W>d<=`l .`Ue;tm5G&I 4Q׮)Vc_JJa'GՊ0ps[}q5)]CbSYf;T/nE諻w3 T?<4Ճ0ͯR.pOYGǣLڍ8m,nʗeWC_:"2bc@0OH؜)*;Gg`rԻ('hb+5)tzvDQ | "1Zɔ 0Qk c nCޟFRr=tqh*]dvW:fex%{ *JLUAkYGӌ:ԈWFrRԛtWn A{SL ;5pv1*04KS$N^9}&*q2#.pnOV*CLgZ,mpiS+c1jکX"G1Yga&¥vn̯Ukt$ү!I4/-~d8RVpl֗lB*"o'$CDvyX*4ƒjk1kYwĨ{sI؄[G3l{UKXJP8"a#fA[fɕ@q^ eO >me.*z=۶;fƟ.c%^6o_ PvgacQmmLIg!h7\BDKNf1]J\wbDĢZ'%!ԷEH `s%w3O ȓrÐ`qVD**#CI}q9U FjQnZ2Ic%VW9oڞkOe )Q͂,/~Hf3?Mb{ UWԗrzL`#:-Xfu;TV˓sRuoѶńB/~TiUy\@1t:"y¸%KtvN~RnߣN5Fw9hU+_6qԦc $U|ܡhDs@xPN60*UL?6~ p` KC0MT&6 Ὅ`l|MMNW t}#u)xJ_PbpZQL1 Mؘ3ş =잵CoP#SQuL4]V r2Τm64k<\[+ %h @|cmঋ%/52n ئ`=lK|̪%Js^V"ՈJ$VVVic|K0xu 8齁eZ@\N9' 62Oh|R^/5dGte \LiK%B~YNx Y <ӓ(g 3H;߀!6U R^GYޘ-[qi<;l_]{; x=bF ʘb3_e`-]ץ'<'(\f߸~2ady Ef[Ρҏhᛞb6+ת)y&ګEU:5g?@:"&>y%_h;<2!¥):ta;Ki9yU%C-xWJiK٪|g0kJՏL&KEUVC;QІ+-CS:<_[w h0Ql3!2d;_/lݷ/O&q3^u< .fE%!cC# aN'w?"PmzA1FZp떺˚j?9aD2 tHc,vҠ~%H:IIΙ,4ă( ;bOkHoc>8MY=R7Ǜtcݧ`ޫ-7"\{&9JABi7_5e],>09|8`m~ɤJ]5/"hT\Rq>P%sxr;]Ųw/ȍˇbMH9G'߮sBnG;XBL2a[oGhI(J/`g8`r~1ǴJ&I]{8ځ,n% %q@8m$L%1sل^\<&BP/2\Wbegr"=+U# ̰fg4*Z~R zfڍ +V'$47O̵:/kZ++\\c+eR3dp <d VșOٙYl3FqоÖ&3dKVkp c|@˕\TlE>}\djTL=WEG\"<2w;v8Ηxz 9&q,4<];LBStmJ`8cyR-`R{M?MJ6-M`VrnTz O~;H`-mFu@Mo讜3dL-egX SZcʓ^ͳ2P ڜ{ũw7m9a%hP!=V . Xġ-d"|5Ğ2qXhcTYҾ3QfgsE,cٰ>)} E·.T =kaw+V744"UBS1H;tG8~aQUP`Bc)jeV dg:Kx0A ,Eu+Q~vX"5 l2Z;SeAÉ&)-;w+)mdunx< N5 qxWMR!,ƧvzLG궷ÆՕrV-zp6Wf⍻ի1*7txң49ln}^)dKonq5<2؇U`A~pTkYeKV( S}HzP] pX!68D5¾cՂ5bu=1Ώ\W}_+YV ɹ`8d.7*:A|2Ut:s<ߟ {|zp&kgN?[_WL\]!LLF^UzwJWO>ځ*8޽{AG WTV-r}4.:),CmBDsFo}!qewSR:wY(Aܓ:b cRٳ/@ [Aes[J3o\o5ll߈gjѬ6,ʼHl}d %/|| l`z٦e-} ދj5eBƌ?푨;05swJN\yݎ)> Y,kqa sr[KzBły,"=c q5Ɩ6s5 Raݔ`|VX'*h+."&q aJ~o6 F(Kdvm{j]&9q~ۅ=)若{*\<5_͛ E^73Hԣ*yu}ug~mg{wvw6~J|3cU?o~34k=[i8y}= 阚uJs%(6 髒̀OEU_UQrQ!js<\*4s4aS\ſbSB>#2NU;}(&k+~mnzX&,KNB7TxqW ?=/ okAF}N@%_g6 Zʶ5,>(3LpGEx+ulBMEBRժ-fT'ʏFNޢ兲:dGhf~ :UKE,>/fh*ȱ&Š4~Űvɜc3۱&~9NSl=/%ʈ _ҮeBd{(o N=OɁqN!%/Y@Œ[|iK)ւ:4nFtIJZtz`.Hݟb`c:eAɏ¹&[s<4)6D9ߨE+ŎsxWA=ngkX| Of}"jw%hHS}8_zl4 ;I' hSeYnQ՘f- ]/Y JVDEGhac1 +IV{'^Аseu WW Y I[E=zTRV\(%)3j }7?V($M|tWo3t!LQ.qnĶhG$ UW҈ K oFJ d/',M+><k͚;ï[j~㫏VIg6La@dֹZ%GII ]kc׽{=r {gIW;}q퟿~qG}D,2=8u6D\;A!:eʴk  !qBG `B1[IT0)m/)^ U~#lO"gN2#JGxh:QN}+9Ͽju,Oۍ*Jz2wi֚` 3 ^7a;&}KTl?ug4ή]igH6ZWசJ l%sU$x'dY?'mlh}*m%:S|Q¼ۜ]Zմ8&iLszAlNXD=%)nƤshIMz4 WVEb5>0s}5X/a94+Ր3߷2\E4R>3bYجw|RW,e]q|aouY鹹}$w: e$UIŠtt+S=8&p0AxO >@ nxVPbBGo] RrNYdAgZv I8`@󞊾n Ǝz ml/߄Vy"񹶘wo`0P,8`!:)ϸ k&u_sRD"ZnNd̡֠@63!҃B"DW쵤y.r,tZ@!MWe'Mڬ(9ڲx˩(Mb̗NmB1̅z1~YU@!$Dn _Ѱ8 ycuhN^r@]m-X_qchN4*(͛3#÷3HO+%J-\ҥYVcgXVfѓ2/N6,k.mܚMQdAsi'E  AہaqGiRhlL=L"fCNw sӯuTF(EqM;)T&9D`a$%,@s?ؤ01% %F+ 1ʂTam,w(G 4SB /R8o_E~G+u:¤$r AN;y=I_^2I;9\w_::,쓃 ~>jFv{n)NưV1{MMw7ba*XpD*$UY}@\6U-_Q=-VҪ!gç ָ?YxWLŲ3@;yFopw/,ÃG-WߴL9;-*;t;0W"]G-̃xi cЌ7hwLe:K ʿ{QU_$/.\rA]OQ>UjnPş BE+tjną\j[ە=]>%p^Hgw;.qcĎ~wHE ,=#^Irve{Y2l7MLLc2h%(UR*aP^fE ]PG1٪f*NخŗId⊾݁٢̸a3zZ@'6R!94%EGoYxX~%m$"QNg,u:9=ɶX*Z@oH{͒D<:˧p͵9ϢD FP* ٸ<~:*;H"l]_?v찤<!\vֹVê"%^TUЧwo8}Ɵb"g-K%q\bvl6$N&S0c!ikJUգǜS@~ ]]]ۭvurt޿*Hʑr;qSz $84 ~FX+i\o9 /M@L7yg'0H"C{669kD} E-#=SMd1<tX+|yq9 6=\QW{PΏ  Й3p DQd{Y Yyi5WLv(A;Ǥ$Ǎ -ɭ,D'M[1}]()ha Qx$cl0z"zc19?_n}`u*YYUb@FO߹s;{z ^5"3dGv%fp|>ZS|b<S DKF=> d⃍vFLXbΣ;7}HRa_8nnWܵdNnjmJ{ 1ɏ&gVe Yux[ ppk8vRM=|{x-wET~He1ZâtdZ"@Ma/T(iJUXOoJ_H;c¤F[|G8x2Hgf:@K}gous0i?U0v5H8IvxC>fQߺXP~pK }L`pQ@# ^/mbB"׎hpZ#KESv#޲N]#.p=[FB:aQl[x]L'Y/9ó@; -L~Fd,~/]W&>Gv@? UDqbF6faW͖JnW(wzKZ0]ISㆄOڨ~PFe }W "q0L]z~3)}ިP/c{M7iIFWdI&Ú>yL ܍x_gg!QEέ.qg&qcsU#Q7:L3I uf9I[Z1ޖ3`R˶RI Lʤh~Gx-TߞR~IGdba~!qjk𣨍 ݹRs u4.Ou!nl;X],C:*|Z=:.-EW JZdJɍ.ǃ3%a2bW᫺yQfdkpӰ Qp[zSFM4r1TS_dq;5 vܷ=B-k{R5;ͨ}A@ ÎxVhEe 6R$c/J & =񴢅;\62)Sps:˭⪵;:"`]VrpgZV, E_E/ҍIuv@#5ȓS"{=c>")N ˉX`s'k-5]T8d28SEbkdݟ~nt[vOAR9Kݐa|eWƏ=-PviIDjTA3Lt0ιU"2B,\x *>!X0ߖ072KѓFiRI+k~]8HYM:cOpzE{>߈uX _> ~_ZhO*۟J@5u. N7jLjGc9m6ΰuS֙~qWFu yR}RLB&2C8#*N IM.d=t4BAR((U^QJxf!n-Q{-̭'Xb2^i]6SRG*UJS=ߪFg,Kflmycv?2o?bKfi~_:-74y{M͂_R0X цdMVj5$czYD #ʗ)/$8Hm1H$=w7Eg*cΩA\am'&PX kk prvB*o!AB7CnRlknI ih'e} &.WYToUߦcZs[dbV@UJ_f۵lV1<՝%Np=`M28Îk.L5-e^JqawFtxi4U3ӈz3Kk4+:^FsJDP/  c͎-b󵉎JgϦﱯ:h 6zJ'h`$v33.uY 4óӢqW`N[o"}a{yvmwVPE:4/Ņ#BtY}D&D[6 KY2i;Ћ_Or&eM]տ10 ֨]vӽIP= :*"h iT,?p>FY\ _Q*LĽ )mfz3Ӟ ezu4QBsGoRhEzZ0F^ro%qW}&vUqv*ct ~(,eP(,p XxxCTf`DMu>aO G%Gfc ZxQP)=UvV֋}&v;NۃI^ ŇLJ(N n`ܡh%12]Emb"'Q^݉<2ż`5`EdvQJ}~x^Jr 9MO/^wYC앋ӝXS|>SV26XGܙ8إ,GGHQrh*cMVBi}t{$rU7١ G4$"moU&m&1HWEޑ,1+8$8Kza[1o]OڥtZE#S8!"=V2"r߿#yVCKFޥS>8gw% Y&I h ({0Ms#mXcQxcF/S2V< .k .| %C` Q tҤ?t_Y$$b@;Ⱦ[cڸEוL[]oČG畡8 /X%aP!.ɏhg XMD?CggBowF %\lQh[BSK 8{-1)Y6߂{7sI*zobL h`.j3ƀr={dU[n-} g @G0t9dd9[a<3ba/@AM& 4j9oc:"qneڞI\)t0KU7>t< 2믭{?߾s«wqfZ^UuU$C5[zuqϜ>`]ÒcZꁫ)#b}@e:ޱBXސo9b35y?Fa/dA߇<` C"9 ^<+bkrEoz:pC'Ҡo:*%Iͤ Xr GtdQ> ]mR:9忂DVh7!P|3-wN:zT6;Bt,m]8I[F|KN2Kzi]f!DLz|80ڇH'M~/iQraMҜ鲆RC&4lc5Sf1X;vn!o_9/݃o)Wix uW *W?ừ;7y#f~v T"x*I\K?nyKV;  l$|*FbJ:2@ι|m"Vۊ\QR3˞.pJE7_w%4n1`‰q|oIܤIu~+zv?yIK )ZM#4$[-14QsG#JdKoU,k7ѹR2ӧ\Z uK_Q/WEbe`̿s+zbЂ>zN85vcQcNlOƾU!BwI6 19 ' ++[]Z$djh؂V'ĀOS[ԏӝ_۱tW-8f}XˬR˸r7s6R|c 4kl (Rt&tY.顽dSڱL]ݤU]N8n:2Me*оƳ@㤐\#XJJ\9a\dj|o110TAF>waZ)"٬iJW:503HXzmϼ*=le ryNi g)q5` rCG}$&AjYx i>w&C@F2f^`;q2q3 .8K5p=qֲZvVL-W $jYiO6hvK,hNz ΥR^tDqq.0V5}<,.ヾKyrMꂷ1ZQ⪀YZ$w24O|29@8H`X~  D|є U(íՙX"k>B%fc8a!F^Z7Cm ږMEڧגydq gBVL%WhRۧ?H=YՀwK'%sHΕTXbyoѰ"Ypŋ 0:<20, Sx>BG?y7i:(̫T֓+''QR4gR@\&P۲.4uv{> o{xFjm|kID6 3Dsj:DVDl1vR%6b$i W[H|̽r=;#Ѳ!\̲çC5?qdʾaHIrK&a,\E}n&_m,WdW#"4#˝#ю,oXI73߰w !J=5gAqv-jv$MUv; 3ItgzB4%(%iah6bڹ5y BW<ʠq=6;θjLyv3pʶI:s +PVOp|3߄Tʍqt͸(4%`*Qr͖;E0w9+E K[} H*^RHh")M_Nnw9L-ӡ4OUǿ6JVcv ^tqLMmq1 RutrYNWfvAwJ؝\g4=RMeB !cAi nNg#\$A!U{$(3\VZ3Sbl{br?*=`TȊq|" &,}c5#Q vK+(yn*:v2W 1i]M4C8w=f͘Ibй (7%6VXL.F^Q<Io10:Q5½{?D?]nBHj9AXo9e< WD A SGF!A5iD B(gۢ:LYs5Ȓhl)=bf;hsb2bU(Hb2gId6  لͤuy{FfKg/cM?\π$Qѫm`WR0WYb<{tSOaen"H"=t02 &bS _[!V,nIohr-w> 5 "gqN]cWRōV +d0g)|nPntv8X94h 52RÕP.a`Ք冊>}.r[mMrs')T ~driP[xzaֳձz<̒ #رhE݃-ܓy:gicYJ*lF+\jbwށ+W)"xOLE)8\"X@E+匡<ϱ ɠpD=P(\&O=t"u6FRĐ`<%zB\B0%]Ri$vFҷOb:I\*$`[<,~\9~͒z5Wv<6;1ݙPL&1hy{Y9)ѮLII] IE K $`EiB59&N\{xm i$e? /*a\:FsQ 氾}_qkOiO>?_mlolO"vw>K:#% U|}x߾ľ?Ϳ:F>2KNFp0ҚצJ0qWhGkOː0}_j>#!$L>gb%5-K)gģ#-=ǯ$0{j_q;<>rzL/so"Gփ76^hKt=H#er0G˖Ni7ME\0'& @6eŻC=.01A:!jWXk*$^!i籶m|o%(.&i>sY+ۥ¿NՈɍG*\:OU$c gSBgGmQJ#DH|D^rF}OI46Ktgo~EV8HU6?E`P$w\ˆ̐Q %q|WR@$ "jIIj'u.|txV++9YX2%Gb矖fLg5 G $0I*S^eda P<i&|{g>3ו꣆x?\5 >M#MۉeEj?kȤǃ%S2A!ޓqqVp-omRN <86vSXbg}#)4#KEjLys†7a&yKsxH52ESYDeRv,}Z =j0ˉ@j!{s#Gi> fua rٮFy׵ǥu5o" )g/S|oqdɳ$"wuRjYHh' O\4:&Z8"AiB!Ώ8kb@Lñ6eSDmZNksSH~[: Iu"+H4;ǠQx*YB,u_ rx FG[}L &s>7I%-78srF <{0HT : ]}~=kC6_y %M#k.`8kU  8iGc@vgE$'ȩуbIƙ&T_dEqĻ"M7nkcn}2{D(U3*dt 2Q \|T ڞ52\:/4qPYX k&E]%B茖SC흁_~,%Ջ)\0!-tu-Qbwv, qIG D֥&|taߢImqF!͜kRL!q+ׁ[:Mf0˻^Y|@*7F>f!wr=x5u;) KOZ R [M$DՅ\-d:%)%᭳ek.&hOrǒB{Nξa*AFq_Bkl\Ze3h>n y'T;U۩gKjI"+AG~>fx~ikCpBAj)6Qoh>?X`@y1@⪱?i秉>#󫾡i@H2N2¼uV{J?n5Ao7HkjhЇUҦ@g6Y{50Lk:JJ K_+{EiőlZ#g?e,dܢZF zk$$gqa:ՑF:dMMC=%E4*)R5N>$}DCR+C "" YTb!G86@,PQTD(ČmFJS[R=Q!RPi:A]"1m .[I 5֝ݒXn5*E+${M2=d ؖPa1|y'P cA%d+$j9M.*twL}X Ȏc[IGƋ*C<$&@#&@ n{-.v[TXNWVAAdD*m$)ıuB#ir)U#n']⵷/ifAT%=Ŋ˒x[!p7(,)ӅG| $[8=\*y+5&0$0򵚷@g_c[l(޲n)4Gp8 1.jNڽo/j/ 氲Ś)a4@~7փrj2}IYƷuA^BT|-Ŏ5M6yiE'7-V !" Ho7u)hECΏIzEdmJH7dh9c`gSNSK`_ԍr\Q&I`oxrkΪ1('* ^ki]J"b$gRIQ[DcrW j({7 C8T,E>O[\, cH΃7Z`~ް|T!74d/:Jn?c"%;op|GtI7s!ճZECBЗo `e {MXiJ=!/չ .$k!$]س>l^DG)B3x9Ap{L\C!w? KAj-6ݬ+ [9KO7Kbܼs'-'P^ryU6ǪgxVbH"(sW! X D&۷-)U r umX\̠Cc_o?EhM]Vs)B+V.^-hv%==lHL4 3Of䚼֘$HWet9(;b`RR:CH:}Tkڅrj)Kʸ|-[waV*i;&BBQ1P?}C8:@k$DV2Y61|6[2hBLaha` Zqۊic 9Sbj۷+ؕIM?#}hPU (˫Xq6Fªw˒" c[ !VD|Im9bY4=UMSCt6 òMWO%$T e2 R8Q\Bz/_"_DH^0ԦS#/# w.c^ !ɲ$C`6fjoj'7mja"u! 28[`3sH2 O>yw?xd-QSj_ do{92XJKB7V|t?qi^0e=Ä9Q\u '%`]doY /P-=Yk9"ui.VɚsEބ<i!=(H>Ux!:)!OKW)B,9~jʱndw=j[2MI{(޿ 42ut-?=ףMTicیsg^u149^}:?i Y!ZUVRP'd~N,rzmg6)rx\< OvO Tw֖BΫ5ZbGi4/­wOvJU|Ijks8Y;0]砎2}Q#='@%WsM{iqwS%`A8*A[MgIxWOQR4i%ML9ODs2.<_+EJf]n:8IFQ#!']F`buZ~.҆ۘoǯ6` S\@_]'gV΄ի-XdwiEVbW*=3'2x6;W~&Iv-"oU,Ɔa72K,!zBbk+:ѣx=_a^H N_,[b_<abLB^Q.I4<~(zK_g.)ˆ |?-һZ2ߤڀ>M%^1AʤDGz%w%gP`%y* $ssl/&> c$6D@/+3Gr._y IF]>~ ;Fm2kQF͠x|0L![(ʑ7/{$ `EØ oZ"ȭ SZj9#6txҡ[]x ̗@ޑA]ܭm/Ee:L4N ) bǫΞ#C<Zѳ)H(}ωr;A5lL0[9k9V:`Vs X\kU&f2Pԁ#%?+PH,MŌc;Zӎ+/v}p*mQJ߽Nsf: q/ORM- ~.waÎ` :؇-Վ]pIGYI\gs빸(N '5(-.zHN$r.]RZXU)Nҳ>2{)9-'\.2Hm4$1jEe3%cXQBfS`ȱ%H}xZE Wbi#;՛ij:ǺPRy (^z:1j;!#ɪAJ`P9NP7V\-}0s㐩~6^Ufݜ;JAm})hP U+[è ?)˜f ,bC!FY@{Ph{Or!0F_6wrHgW AO y 긛\8g9z]yU ;F+(2 #n')`7p3wfZln 1m|&= hTqh(͏,G<Fwg6xk82;2ɴ|qo[~tmRE 2IruK7S6'ε#6F_Q^fI.PjqMP\=<"M`_ߺ HqBjg7pVIf[CF䚣f/l05&&ךyFj!Tx6lΧa;HwpZh=&N ;Hy-.:l+ՠN=H5;]~l @i(PjEf7}w|K=S(=T~]~ֳ˜>{}K.\&}o~ 7/ozuݧ;qR oqnmx2ѹeZ4t*qk+(uL)L#IaY`ÂahYC <ư,tmuo=n8E.:@b U o¼`7,V锈]5ЎpH f0̦; K<''hcq@ٯ7%XsۚMXdukP"8^埂{[[bѾ\灿8;+Bh j򥬷J+':*b@xIߢ*ۏr'1P|#Ķl4jƠa:%RBT4L\!c=Wtd< ]{'^XC٣%uA"7b=0<4Pc2FQeUӰ`"k>ݠsxӯ;%^_fkOm(*$JY+Sj$8Auݎ#= }8;Ķ2uF8/T 9D#&aRSSe;G+|MbF~?UL%5ADEՐl#SWܗnJ~(bs['2beN,ZGwuL[ le||TV49P._%#MhC;]*мsKhvj|5⇄0@=3IY!-`_[ aZ${Z@")ظQ/m?_\lXmqy积ݯ~z~zpxKuKjEnlgh37nbhf ǡO_|K~ XKmW n{޵1_:Ȑ_ǟ_~՟x~zGl?V*܇%w8ǧ'%:@xx;&Z֍gѡ/1>qwB0ʤ 6^tywT^vH0_(2QQ#p=}LJGټɝ K|yo? (nHj@rj&WOcyT!D^QoH۽:* %5cpn|iN-wv k>CZAt q# 8 k]KIGqGd&JU *)#F2Ci[jACyl֥6NmHں 'm9}{58msG I>p'#ygfvMiN3g|Nv:\`@\.Urq# ~U4CV7MOvG .UVI7TҒ9]&fZLy:NKQ̖(GFG+ gOFNc._MLqJ]&E֧8LI;ة?6 mx\"t@u~&(E3n\Z'Zٚ\x.dI4OleʗL܇9t?,R¨n(׫KרZ5z nvz.4WNM`Z)ZR l96C՚t;)1rXWA@Xz ][.m)m/a ureq&N`VNN*e:sBy86\Fg;DD alT靠g|^+ƺRՠA la?ޯ:s\H%DSYƭT1~r9cr5Eo|n8][II ػ=J;(24KKBΣ@ XM>.T,G]f+QhlYdS"6K M%9vbxPVj0wA--VPh! ۴6M}{d>0xo9$lrwJC0?RgaTY ¤7`zHԃ&4t-^ uuZf$ Kzz#L*VG=Oho T|ࠛ$i!PZϦĀ%)62 735G((b3M3TEk@V!By'a $bzA/P&h|DkԑePvNa?+ӏ#ळP % ڔOYK*ZtCCn6gҏXv^Q(>Jh V.Ԅ؅O-8egl6v7]Ѝgd .?%޴aҶ:u]5M+B 8!RH4<#\Gozc9Sb?΋/ I,13t ºԨ FW(r}#Ù,ث<~bGP1ǯXMვ*fEOf֍뾰`s`|]Nz*r%(!q'X&h v=(Q1Շ_9! Nn`:O*&̓=j+nXŧ _"\" 0G|tؐSߍڽ?qٝ_P7O1:K@EW$ɳb^;Ap#wb>a1BFxj4{ڈiTJk6:R¸w/^'fpnU;\X Io">qCPB\쎷5cYs0Jxcw?.mdvݟ98!mi:ʼyGgfDWs<[c4 fH D^ձQtFd+DS֓4g϶&®@}Kn^ӷ*lWlqi ZΐJ&zq#(7tTC _RAGJ~H)3ͽyxN(7X1I tZnߴx6UƋp%HrQў (/~Yj' xLCZݰ ˳gL !>"yǏ),Lݓ jIVۖp*f<\2̳PpqvrluqFڴp8`ߏFҦ9 %Z GOH*Ct0Q%zr X?H R/[BE'#1 P_X%@ oZ_4}ѰadE \9q=(1zVNVQhz#-/_wm]o4̠̩7dӂE/{wy _ڨL\|_1ɱ 75dg8@Vqa!0Y|sMMHC`x'KMjK)z)<%f'}LF %̹`h^0gK3r#f"ÖcY?%kFמT-''rk/E*^f6t1 a Ȑ]ON)pr\ !c@Ǭ)y=ɪ@ IǾ1xs 4 BS(ebGoruݯ"b?`W:{1^OѨw*L!<<*V0D{FU&X7Sy24tnWIGQB@3֫`Oi{tխ`,s$#.@a#lhtV:VcU >YKE%9(tȣ b!:^VdZP%bRwwmP.["~)ؘپSaIAcڎ8Ij֞ug@NF%^=MC,Ɲ xps-&׼+ˇSZ쫧qDV;~|֭Tc498bJ<ƿpdzϕAt[YtbWCRݶsGl/,. E\5h֑;xEwSS$)΍ caä8zTCN܏ ld5G0J)D_kc4Z^D{˙_7ږL zd,Y\,W\>鑉nJ P{W}$ , 9NdBKV rj&^AL`v.ƥ ;r@ޓJ/(!P >h2 Ό#W&Mn9w o,K8?luȺ(rY2Jt|lKY}6j 7,#(;ZiݖO}*|@x\%HxN2 wɲG &U&DFVH4i7xc(z;?˥ʵ%mwٱL2O%I}^ ؂ʹ?WSʨEI3>!mSb+ Uc ?7Y`-CTj/ؕHm{BvЅc;7[$tiT' J+{_]l3i~;>"Ë{z*9eĬi\Df&9cr!jJgBcUF#G$ ˨Q]fpfBÚݔOTكy̅Q/$uɏ d?ґwxR$tU|Ǟ**/E{~w&#9lEZ:YPi4<'4 T+sOv\Zp\7P27c$>LJ*ϴac*`hS2Ez#5-y rޡŝ=Aף5ίWŴ)9__ϙ own"B/ =ϴ+WGbFyS L[  lc^ؼ;Ę_:!*Cd*)n: 2O4P0vqNqר8 E1NTmf>Xɬ$E2Ṱ2߼nOX٧EOA2eaz ܃ϒ3)v} %+Y$4p#ZqE_egEXaj_Dv,+R N[ < ˞RGPк `3lo lNjAdIn-{ɡxSI/F,j^hŮ:-.p@DBBY8޴ mh\Y.=B'r ʲԎW|G2S $z}d>jVasA1w6>Hg!X R^v`4rdq׾wHIF֦AݽZY!su gNݷ<,y?D'ײSx5mµ#N糮4T-P,r Ŋ[׽!onIhm9u3kJo[n / 6)=jThrݷdY^Jȵtiy!nv.pӫf>EZy6mhOT}xT.4v>\ $Ե$X2閜Uw0sɒPč"i%`3xo>+9- 1<-5q 3ʾѠw>ڴbSϱŒU>}yq>1sQ_ (lLfϙXɖΝ+hAMv&9U4ҕ aYPIO @HK4X08A]g͢aGI^P3z{ou8L(NH|T<9ї@.B.j`(ޜ`\\=\AZYݭݏH뎸!0&4#tɓTwE " KM|;l2;:LHkS`WAyVC!L+ƭd :$2+']_^մO¹JڭEC.$"HE[x}Hez3+?G6S4` /Vk.,J}ņx4#!,_P-3^O` 営Tѵ2Ҹk4WS/ncy"׈}Y=x`YNC 9&^rs ~/_-=#jWbͧ8U,9zՇi_yh$p?rՁ|+/{PGJJ02栏ql DECZq!3-q{!#ŵa8ʒۧ[1E>`q=ݲ_x>}Mpb:W -k-" ubR` C_DbKWJT{O'_}`R;DGݪ4DҧR@Kfp"t(uե|@@*{UKOuy$o"mdKb hXjH?DGrн5_zy~gV `{B]JZkn 3 &%b,}`ڤz>J?зnKuԺ]_i QD.Ǔ/t% (rC33mV&2/wHp F]5t\i?cQev))ӕoG-Mޢ-9y)9W[8{~ %b.>o 4ju [wd*Ņ RQ,q,k5rYY|bVj4S+(%TPْOor%f{}I"QtDQ |&򚦰GF6/Ok?jE(Tok M6`e HHOPB|6f|ʿ ]U,`3UR1R!5rL(_Ւ5[V `#Ф2Ex OIb!V4nveN@I H(+~9FN~XpM?,kHmٿws0i~!Eؙ{+\"JfGot X'wv(`Wv'ka!O'FX.O2tfs mo8-4PǕۣo:*Fի̦0>g#}$}{^\n (֝T[#βc|k΍t%(}PC.ۮ _q`aX$zlKL+wj8hӕ'O•u Sʡ$Ӈ'l"2%]ys\<[RMuTA*,=D"joxJDf S'>n=6^"SxښQCkhj&yNJhoC y_Ze2Gv]!!eh1t JDIrdD3 ,B q~䙁;(g3E,>QEDs(оd T&3ArtmEl |BOa#ɥ9l܁FrNvO,!@(P u!|@Z|!4bJo 5O`B,Ps:0d]lShaM0`OT . _)&氖hv7+@}*W/`5 X 2$03ޑSۯ(fF7s#d$B[A`D *>m=klh+xz 1loj.k`0CmqI\R3@g*0"Yi<ËS4Nr|OՠWVm m>ݣ ɵe* =g4;"~hB[T(0E}P{[/֖nWSUvy妿uŕ+ђLnPnOr~Ļ|t>[/@eibi+]>l x#7p{ Zɳ9QvP36Ul("K17L[-=.(kUTVBs+@k=$fLC Z;W^]7r0 Ҙ٘I8|WM@ѹX9D dCgS@`Qτ:" w39ՃWn+,\9 ,@#V+d6V>?BRz\NvfNRd[RamR/klNr!چUdwꈒVZ^lagKCY Ϭjԗ]122X1~/AЗU99*KKI}ӇS b[Ozwȴvf?;xZ.ec!yh$(^MQESŏlKIx'ҕ ]B3Kյlbi#c. <2[/93Tm@0F,yL@C ^lnCxCX Lײv+͟X#euNtxfX|v Ga~=mTJ8O7cB6GIP%v'OIIs!3 O|A7̟H68gLEa[=M +1DE 5˦CxὫ/EpAP2t)&in:)>"mAQyj:Qa q:3Z-˞LѫVǟ '?Lʥ0c`E~}vxdE+{;݈͊2]i1|*"|/ fu\xSY8v"w_oYܑ-s I-1g/00`E;y}k;M RHiP>"m E;EA&ؔZ /AYEKr!pMRFA6b^g=2FZh8`W ޿ J/)|}me̘R(nVEg$i#b&޹Y9<xS^fXoYaQRv U.}:}=+=OK b[JYU``qbIr:JNqTA0Cic\r mUH`p qćWUIHcɂ)͊Yճ)!5'zb XlZ633X/Ԏ@H̳MG-\Y"&'>!{mH})'_(IYp5{yu%|V2"054[R Z<=][!b$h&#9xEb. %895P?>@( sNFӌybB q9$nTK90f560g ޒ8B##=w2 g2\+V> GEV|uȵd{ ʀ^P8^k BGPuF8Dj!F]WdΨ]d Jb/i \Ԛ?A_x<ۭR8僽4!h"F Hʖ{p̻`*< n'@q*%*\c3m!0-T CtO'3Mi*Plh,)SBDK)a[Jqx :a'_mńY5#YxƘQr<hCىgS=`FH0L`iGI>I]6ySTpkn͎e!q߼Br@Ԓ$c]\Ք&%UB5Nk(N.rg6Cs ɨI pM$ZVgjPBWKrRu-htG"ץԓl%DҏG8v`>ጬ~a2`p (?!RpTI)$R`!dtwl꠫}#urF%[/{yf{6 6Ŷ(sKu%QLqކG5l6'9T,iH)0EII 8|#,.$?;NC-ڝ _Dqv6F]WiE7GKqBy'Ouuh h~ Cݟ=,Nyױ G\x3A3hr 4J9lx5a2ko BYpUQ/; IXh ͛K{qw9KvOtkloq6:/1T[>?nzV]$xj U$Glv[*l=:ompғcm59UeEGAWu~/L=IdU#pr0[ xP83)eܿWu$iSlT4X`Eۍ9؆bڗ@-$Z[2;"2smILkCd#2RGtNĶ.5YK 'm޼w04b)kII fR0N"8IcV_]=[FBzRFiƀG qavSγ8KBz~h*D+ٳ/Ui>g\S{ Bq=LTdbr@Eiz%~*[c{=*q0&Di>Ӳ4u'J*萇\}C3O9k 69QF0bRa4]<}LJh|bM$;Л /]>fSzpR,>ky:Ukç?KՖyO) _~3Z V>j;emzt5 .]bxn|p|O4ba̺lOg7WAhoӹ<|b.ݦ|#"AGb.dC(ё0,fLfo@6;jCDT!?>ɻjݍ@ni:$8ԑդO50.F'v[+*/%0TWw70?F2O?a mUy2ȅC[VGg|j#]3ts?ƐRlz/I"03VqB/Tae.;PCd}~ ?ip+9U;~݃cL!nEeV&J/_d %!5/9EUZ={DV%<_?K{ȉ CWmBקdedS_Bm,&gJ6AeFHrl(6$9lM DuVi.dƮ͆1ǻ=GVkܥȓ.=u ?PŐY^ѩAp|{ےQ g . @MeP)5I?XCNN)n5LyOLǚt3щO@wm>h%NG.xHQ0];;0-){Qѯ+iRьD~SmwT]'}y9jXsT6%W׫ PX5O[HuNPZ\U({Zi` sKV'T+~DdI)eF9Z`˒ j 9(%> 0 <0S=B\AhZn!%홖-{T>?8 WOu+W#苬Uʥ0h(fԺW,;S3 ?6ehRR ,lzwa'],#nHY),%ťkBX~H"G*Gob5Kh6̲RG,/%[: \8|4V'qQ}a{m/Mw}]˨6 (]2P W ٴ$1+$pǸܐVA6+H$glRڳK7 Dו,p y抮} H~g8w_+b^1m-#,5D?N6D>!)UꄻcDt2[R'ҹxn' iL!ѮCB߭io)@=*3xwpYibfaʢ?pQ4CBf$TbyEY֣Vy:AyEȎ<O~EYیM&NSC$(CJ7|o<0 ON:5ylDѯ;uaܰ8F .+3nF'͟ѯM-Ky.VqT2 ~X)^n5z t< v:BQ丩Q!| Őd2/GWd.fh/W(]4'Њ;sn'zn9 ]x@ 7K36Dy3þ hK9/0ٟZRi߿L5;nm_9st9'w$KZpi»4nlM@*4;b0S _]Nn'.MJ^?ihڈ_?wWR&` :&q n;{h{+!ʭ(X˱.LŸrO*['7A^+bNn]s ¦E&O2z"ffe4/zv)Ofy]ĸn^VvI?La0`t.!VÉA-$--g*CәTqJT&C=J" e#nqEtU!AVF@Il^b/:jFJNH!Y TfËkN>ϽHPfL0VKx[x1H/۞OV"AsPSKw &"tpXӟ12KiU\7'Akw3 p¹2!E4Jе^mWzt:@zo}M/=E96|LvY^V+ N{D60>pWdWzdiCx'nSB jF d0C>^κ5OPLOkeQ _}'0Y*7*׷ )˽4 I(} ]/բ!;:FpDei ȝ19O:{M~ё2\}EKeҐV)x\XW|!T&WpWjpF٥3׸ȵaϦ܍\kՃ_6"3{69Ul; #%CU9ɑao(6Vav4+wn u< 8'3B[t& M;H 7LRXB7\KqTgjXGP5=&!K-pa"2]L-M而v,6I/()}:!יmNepRhfnL66}ߙ؎,18*Y3d>R۝oe]^6/Gmѻ2$.aa8 ~sZ72& PS?+K~oeڄ$ˆ{] c+}WXS r]srPHfJQ3f2t sMMv"K8Ѥ́exe/!HsFQzi;yՒhpxi54H@δ2(IS@WnhI<$ؗ6<d gFz16CT/;};=nK\;k±&^OJm#Md+$= ܚ6{tEM8QrP.NgQ}h1j;ҥ0FyOi5n5HO 6XB#쫩TKnQg9>g!k`,f>Hӌ)T*y,CYZI.ljOUkpإE;xڢ/8פbR/eTmoi<:e} H]9.6v1K9QX[,ѧxIYһ"$=z>uDAMꩫˬh~{HbU7 'UdAȿ3%? nk k` ?-!"9 v ˡ,UM"{Q>wHf>b3y`*(n~mXěKѰ!&\-soЫrb՞f`?qm#M܃LD9L >A!9ba$(mm͑z^PJScZ(-/Gs1~!n4/A ys B1f.0@ORXN )@wTeYؤCYݩV1YϘdky+m商W|@P7ꠑLrDQ"ȭu _xKt/ ##>%1lvwwnز^XCO.j{Vnn[+mgaz] [o@ǻ}jPBN/5do* ꛘclu3]m Zb-ލ@Lmaut)C0R i;1okHTI2R'`_Fפz0jz&F5:s42F4n+ Ӯ>}LڀVv!޾a1iiZQq[}iECmcʟA% MJg1*|D)ye'Unle,~n;@`Cn`;) !Ș&0.9X%?Ȑ75~(9}RXSA6tgAiUfh&&,9x$:uI!PpZQSW|qN</o3tB27j)0#a Y|të,D @YEkqu'gѓcxE|Ƒ<;:{wvn5N ##򾐳oz/7͟6/qduRb_o"DFaR & ҧJ%NZ ͲZۼ{Va=9$ }- jlЩ;\muC'oČ(콥\cs:/߭s;qLl-9J'%Kq`<4g' }I|#!6(u=k~mv%OZ#h\nRh ݗBI6f)?kH*JqT +:+SdoMҌ~x]:֜i^:~ 9>ǝ൭ʙKƄOƏL*ԫ1q*x 2ފ3{/Y1Ϊ!wѥsg_X1sA`gy [/C2%fJEi֧p-^Hu:nSTwnV/FLAxE*Z\aw5^L(2XĢ/I ɓ{)F7k%4XA," * J_{k%$/1KJאs #j{;뚣5.v1 Σ)99"ѝ(-`NeO+Z0B}屉ʄ]j:YEmlYi'Yںl|0bAHw!+=̒i:Z #F'*td-d09<#4dzzPؚ,gX^]@h)O|'呡@͋hZ~ 3ML2'4N:.tV\`We1S6|^98>5"Yjws[gI4()&dN]q4Ii[VC*iS)œDurci>ķȊ\F/a""cs`-ejGF zcI֦Ʃf;eď~SjICQN/CT}Ϗ^O+O-ll]ӫoGЍ(?:8?j1im?tB127H#22v+߈yVԧhݐ]<u*'Ԅ7E.޾AW̯Q3z„y>X*pt5a6of!25桳R3Zɩ?o0Jr(M$Dts2)G흻{_='J55{\PV$@Mo~ҏ}鳸]p:e{p1 rs{ { xIZCq;>|vDd7G_fo/z:dz4o\&87{/+ KnuLdhĿ1Ef6)Q:ot>Bky~Hmܗ/AH'KVY~2hQH48O%i]n {MI`Jp*oq* $i߰ov@X ϒf/Fˋ[H{g-G8C#{CCl@H8rase@W;/|Ǡw3\/ͨa9gŹ>mLx'_t3u,{JQLmߟ9p+3Z>B#(ggxӀX$uQXc.VXGVv)5w ZK. gӽ\bQ$R.D`0N`,FsPe[,X .OacOE.*yOp!Bq|_ŝ@1?1 I>0ASi=(lD+U(sZv#Nnt%iYH ArӒ/RB"M:pېiIU5aB~;KB\amq'AqiQ23'UL iwKC2 r5 e~%oLMnw-DQ{7Ҿ圊S:=mM\<3&I<c}1wdž&E7i4%2H^3ZNdWS' ǯ^9~,'t%]6qiJ^o zKaNG[½}x ..OLzB3@wh=i%KUg')4*Ðɝ~V5Lm-,.<}Me]YKc擳ܬp]-O1K,D^ \Du|'vC WQ_"oDTYB*MS'W BpWIcrܠSTF {ƜKH(Ķ;|Y=y'h ;o/ 3޹xga"]PA)Ȯ/e7rx.^l] !>}EK%֓BTE١,W#_ [XǴf 89}]Pj~{gpcf?k3~qppIKCcP85{ R TvxCwr-v)jc#gC5Tzu[M`̦yxS5Y_FWa*b`L8D`-淘_ @(PNōs`І&73!⤋&)ixGU |kAkO9f[9Gaa{T#G_ w9XmJ??"6ieovQB)Ѥ衙9Xޱ.g} K"İ=4eJ HN}';P) qe$ 3: `OO9s۸Mĕ?Gk?E?a-o\twG.>Of=Hg\|tRS9pzJǛ̌&bq|  l?q#IhPq .kb 7")M O}~k/n]6nM?=>vwѥkk|"7?ݣ˚X1/~si^.s+k,̩"`9{xs Sr&-HҶm8CKNZUKF@| [}v8[edmosGګ[_19Xw0ʡsl'-7Eռ`Ma%z<ևܽ3SG?!3gDHA1/a7We+Y%b>9! C.!HV6)`s* WF,U!swZd%OIxbb [ ՞A?$s^I̿i܋R@죙# Xi)O*Z,2;< g O8-&^~dO59'Mpv%R,Xq[JԊԎKqE#~;akCA - 9nMrYh'uź r2B9L!i,Y#Dr;z #$m$Dj<0Qk9V0SғUzg]`c KP5TRNݢ`%Piڰa(?ۇz L UYW?#h9lƧd~ ``%D]tBO'itGI$Ӯ#K)Q#ˈꓓ) Bk*i;KZ>e5{_0{xb w#q 5o#UN Ο,`iEG"C6FxbGNiSUU҄xb5|Fgbb?ig@[dRON@ TH͢AG~ gd4II|!Κ DoE`vbBfa%6GCg"6v 9[؂eQC+\ٲH>h)$xRZңCTjC]ROί/A  X0|}8 êY@*vAm]ʜkï>HҚfQw/% &֊g1cP>Z>i儚6S_.\ ytfZ?)v~`du=zl}W5+Z,+7}  NN!AZ~5m"~%!E\H%7"vӶY7mܠ4kő)/X]I] e$yaXVQ̱jقܞB &{ 3 hG,!`a=#aAY{l+1??=eEV1!sJN[k{Ӭ2gznqtM4vWU!ғ%+#is Bpy^uWn/.&(s ԆNRAnx8A3~ @ґ6v5M:xڏK>ABKiis=4)) fN.p<}!f۞v~ZXm%<2($/RU6~zX,;/S+auk |ķ~ˠBEF9sͼŃ'|HcԔܶXpJ rͦɉ_@i5ӑ;W.Vt8R`hbC'*Patˋ)d;R _D/pFuIZxkgQݙ!tȇ$(l†wHUj]FUw`pTsY*Y-Uͽ؍|o!-s%yL6BM-̯j㨹 TH{k!C4Z Tx2~/!;xV &iCjN{ط1Gs7rk}>S;bWө9T18AI҂=)wv}3xXi\4v_NME >,;Y"1H6ڞWWEh%dj)ITnz%t\ED"1ܔZkl hknK0ң%ʑdhpΗ;QY*c?_ :x4oPd_&{X h \c²FpS$У=1k^%1, 1xKV'Xۧl2Y@ALt6R[k2?j|.35x^LGd+Έ2c6=IYGB'!JY?FD:0;U~|Ƹqb{yr$?evVZxܔ .{5/ǎK;c[C )"&L] \30^ Y}7ŃÁaڵ4ې {IZ$5% mzpͅq)aWMRx#|^^Hws9⶚Gv_raI <1\4WeNO'M4 ,6/ #\GIP<'F<[ZاS~~Ӱ90H&u*Ps/CD4Eu7xRm)O /?;zd. xaDrtNR# Xm{߫lmAt#Z&b~1TB+yc^̏U_c'‡egľFVv_JKWYGg-Pl }jӰN=pQ~-8:VBJF}&Am27Б.Ar9r9ZX5MQ?[m(~ ,NR]aN>=&*139%ґ  Spr.oСLz)Az<ϭ8>|wUM3_Ij=mb+V)SGs-sبRB(Mo#z(@N6|YZ)h G$QiO|dt29Խ[is?d?c,һꉳ1.xv޵Z9\&?:j@V\I7 |^P5 yr2!s,xqCӦ ?MZI"?AA.COE.]zTK5{ٵMeqŜ$`چR pzXK-)d7;m]s`b&kL˂F"UV.([hL'8r"5(ŃIAh{Fۯ2;]ۻ?zا:h\r?\ad ވ]=#E cT \ LA2 jK8_M)Д0 gHKx,mugI.>9I<6M}k_vG0lX-Tr+s%~"? We`q5_X";y!IA| ԏ9w"cwޑc(ey&uģ|Za7m&ffI1nWRa]@?liέd^%GA)up<˙2iq=E0挹 A:F|.,Af5{FDQ7#*UiM\q}pɌe`Z,ΉHcjzTHP'>U<&?cΕF9ҘRؚ*R"y@QYWH␋d//jeqv\MF5.w ]!vѫ޶~V~OskRY!i{22!ٙf/j8Bs%pҩ4}E}7'(P5I$$$2E= u%;[Iov+ES|XiGmbe瀢i0p{~P;ρwr-;ol;p&PaFƶdc-fyם4Tlz2S \YJtN|}^wW}."8<[jϜ_Ig4AŽW; "soDEF,~RgE1 [:bgw1m9#0OG6N&/ "^(Dװ+ *kతb/]#Pc+Kq_ӔC=ܾ\' VSճ/bC{sP LF?+OIQ3}c;ԔMD2iXPuqă>7SB.غqǪ_OW_8É߽۱#.Q36*Cy1@o]ʙdPHIɆ;BPPo&(Pճv(;ejZ(8izPY}"λ2x-}dŹ2:>i|(AŪZWo w ㌁CZ kn~wC#|Ah7+T"'d( ASj:a+gdPT`&R9b/R;/{PD{s*bAjxrЦ{DpN}0&@*Jj&x(p:#e;q5A̲ 5>9Ҝ9c_pvӛj+=z^v |,p6[ifpt [wT{LM"J`WhG߹A{?JlDT32njC?tfu^cK[%xRF).'c nj|'U h6?w+xBIO H3~#ƲZTs~w]Y9vgtS.ͥ~[8ih@GK)ZD0dtJ˒S}!%g =I>ƭ7'E^뼿ˍ1$myüE䙁gz*t_h!"Y ցghr&zS Ur?UWO Y+;L7|=q(ScSTnXlm<7L XfM4 u68g?w]!uzuN||" Gd2a{"=^|cj0^/ځNG])^8Q=FEpm5Jf_,& jSoLP+-wH3![%hO@]r<«#AuЮhR|?U~uHgc#dY(ssann}[U\_I J$As4* )I{UsݝՉ_̕KGNeڟ}~xE}KC5>2ⴅ˝S<}e9X) RepzySc"+׍g=Qԇq~rw.F[JQJ_Qz Tc͏\j:'s*>t_/G_H6_܅(k7Qn _Td=ѓ 3[.&-)un ?3;_QזXCx5%B>{pmP{;oq:ұCT#^SkÜ#r_VWɉ8Z4 'ȸ+F:Ί>T1Ķ`F1RrJtX $-v;z5kfDI:)9ڈR&aYog(],߶@7%I럵AdLL6гcTmžC#>CPE]]i#+0D>,ԍT#k-cKq Kk $uj6j:t!NɃlj*raC\9Z> qJZ7A)31wd:cOǹ"AA 9yVZ -P6>ظyKjpOp3O)mUgt;=ǤLR,F2=yw\, w.POVsO4j+ Iyz]S-q)*td%cnʍ .,"9= B#8:?x'n i9C: Kq7 Z3xNyNq*a?&Gr1G rҫdJ:Jt $n\$wUK]ɘ@r/XS?mtd5p AmښxX^J6sq6Fu𸘏&"q2ptxc2I ~Dc4T v"L4+lǺ_ 놥\DHplMhp: Gя/^ޏ0"Q&` UXLwP1HǤ#Y"d,4VU!-euNz<7UdkJFB'͎sOwW>&”Ѕ6"UKT襺l'n#+i[!UKyG+RTzOu:[GW?|"4/6u4u]CWE{)MsAJej8d"g2W<~sxEz):Xpˌ bf#(I/o'݂_oU\g-"+.NiO/TEK Rn"}k5c66aO+`̸6J!R s3d?J5r Kɉ i@ԅ}]5IנR4$4!-(;>YN?%+k|p=sS*Fdytҗ -mpre|1J$'3Ah}Hjuzyz4ۨiR[^8tNc$ik0/~%[C2ӭΛ}꧟/_O2;PLWxlQ<7ȕ)g5OFI3x rep hxāBGp_g~||YqEl׻ 5댉n)ItQ |gyZEѳ3]P5"gVT27ŪK+J?q}<QRc݃"Y4{ok?[lKlvM},W Cb_"⨭h+!{ ĭ>) ӒESTAZ{>ॹXzbR&Rd>水9sm'\+MvO(^hcW=c"h|Lq+wۢvj otеx,lrrڼǂޢ/5>~5– \ :dQ$zjDQ߃s@;{\S6 I(_ѰD +8V8P@8|!(NfOu.2hweӉ1>|K0ϗHIbfupֱ\k%L%e-Dp6C^Vm%U/˼ۂ"kk qg# }SsbzlnprrebVj;%%ݲ_Ovn9A|{{V"&YPz%r0mL>;b˩~/7;sF !QJr]&o Wv #/I/nNmßOU9ZBsS|xC k(p);'lXvv^\ހU: ^6F8lLѲl]M*@ިښv]9LH>M>-bዉ(*CB)O8Vd8܎;.`A"﬌F:a6Ҩ;=Ry/x 0-5sXdXuY8DbW_Fa檲Y{]wG(66+t,=o7ϔ>MbjAR8@a밵,kz.\#4Lf1QJT?ɂa@JioE+1 *Ⳣ6NϏH@":XU>ar]$rr $=#"y+/0Z]򵎕n{/8"}zw2J>6/^Խ_nJi ;d4H6qp$LNPń&[G2^GvHLRPѝP7 sWeeRZ?I':L :kNW}rEk#*{>ovyBˊe Ω;"L<Nlٺ (L9;.CD .|fK49lJrk(VNb9Խ{ XݞT[wAu</y^3yZO} 's3^$!(-V,h1Md&0, TGJ }E-$R"-?ZszH n$x[UDj35vk8Q|`&I ̕b b{^JL$ֶ0 <~5)u?Ug~J46obTwn.S-B_sLZ ncױ_xN-ZgJ!~!Z#?K dՄK:| "΍ nћ^[T ҦMK@GcLg6$,S8l͋Atɀ}e펪(f78(~|TϽH+ůRZ9"oi2SЉz Y$Y3Gf{l 43uR)ZvK-iN.RDvI;i)+f\,a4ܲ-HN<$!wbH/Ou^7:r{oiY9.S.ɂC-ޢ1--R20`fՅ.>WÈp^nl$8m@dr@3`!$A)>8GՈ{sm1\-:d?W$$ucB6bC±@ٖ1‚  [jYt|l?Bzz6 Q-o4FWl= _ϕwH$'$xR9;/y/iiN'M pv=P]FrS-'\/C_5~AanF$圯d . NYI'[[#񲱈͵WVjAX#/ #$ZJk Tu֍:--R p:k@!:OOǧv7c~0v8{BW H K bxyv[#1RtqRɀbw6ۣ\:X7 )(,޸(l0@r8!d  k>>PQ1Laȃ'%&M:y5ͭ &Ӆ1"}|bn^`c3)#'jYޓXiRh\6ȡy|vR?(V*/)M2cl>lg$^p SٚƁrK$[U#1]:Ts!DN/ti/l>GCwjdgzSlR]g١HT嘊 6+~BONnh$,6 J ˆ'u.$w3?c3H[[S!mjF9T͘Τ?KKڡd6Xă$db\xb&LfֺNpXW]5)̶d^R֥P,&WdTJXf.T-&VcY69qJǞTex)|` %i<߄t4IZW2&~Z*C֞I^6ߤYAbܗ`mL4,Ҿ$\@,NZ Og՞Su3,QzMs:o%Q#[$u^qfz=2˒=n?QRnoό`}9?f흊14hGC`J*OcYG0y:d3_$u{&?b&^}Í'v?.>F`HY@FLJ鉘K75M._>:xiǣ: f wTY2-uL`8,oG3ƇdVOVaؐ 2VO<-Ǯ^y,$ߔD9CgY9i\i("1a:/ex\H@R!A^KTVb,,R×յ)^ MCLmm]:*="V}ME4Q Mb)/zbݜr;K&DE wdKd}v} q VM 7T48a*!Za k,=Mcrb85\NL%Һ :VfPB{""n7cfm]%'F{}tw#mp-"d(86O|͏7^rb <+hZtWu2SBK ln#~ot D ڪ \ɈgK K\%,cR§9?/xX(P?CzQ9BGQQ0l4 A.y 1"l{e51T=UVx;C?4oQ?ҀO>O`Ww$ƈ?YDT \烼41I}1ߓߞxF˛/%/$ɣSTwp+v͌oVMɬO茾ʈSR~c,v ,,i<4 oyҥCN2M/vsO͌:40iFi$T-@n, UqFZByI7"NJQ>ҲggvMASK=)Qdb}fΈuI_S\FQk`\vI::&W:;b2w_8ubcv}2~ Y1@{$ U^j4OPc0Ns"D5n]P4s^ms[r3N|/g>8Cȑul}+.<{}`.^QNj43E5 !^aAĀ}wo쉽]*‘l;-v6TOQ/d m;A}ޮU{L VPXR?9vQ:r|'6|DwY }Z&8=|7/I`+++|-wj.|/ 5u@tfhEx"oAK*목!ג0hphC qWTRUdFޥT*/|sZH=q>q:\aCi=l 6p)VK`].9Xa3n-{n٠rwz+͞৸3^D,*(e$ǥw w嫿CLvi8;|=Q>kDCp`z|xT*>pDKda 4*mTe XLQNbg)WR5\|89d 쾾a!I}ݵWwztĄX[{LiSkbvJgM-P>ޱ 稠 2F(̺ w[-S/gβNlcF\q7lߵVݧKVmz!_`]Ƕ7]xvsWoʣHCϷNNR叺VMrjQE";$' Đ! p-ԀZ yv|7fo)˷δMhe Xe{YS"1̚HGs]jMPr?Ɲ#|N 2rVbB"d_(D#@5&#8$Y@JQȉv)=vBR(> Fҏ4B3r|dQ t耕` 7]>< 8t8RqVufjǬ{AmFʾ_8&܏0l#IPHm!*4̈́י3b.ZC|df&!T#h&M|k>AOVe"$ .T1qme n5Q S/Ɋ. Кgak81 jr@B}[HFM3Ċ_G_kU{q-b[>[pFwp?bқC?Oa|#n?&8<^Bm I\O_DDQ 8VK .I8£م@ڿZP@]AG hsm~滝KJbێX8w2+&ׯP3vWU.Ui=7`ܜC17[g$߯o* Rvݾ, KJƦM.{?my=` **Y8WL_zyzR_tMy;&ls'sS/ƒ /JUaͅO]{;\<±#fL.!'ƳL 9+G0ؼd:%~H:kw|y Bbuq5/~Iht%dW&I+Sh|K-[[|q_޹ygou{޻uoՀ6뼞f]QEݾAX~/*}o&q y)QkF?>q1>oFabxNm\[}ͻÃ嚵ެ,#8GQplPDb]lv|p;/_y^m{83|0m_yB"}bzH]O7٭kՍC!-鍞,a}_%;#Q ytξ?G{H h 0)tsVkD>gɝw}`w,FwG tu4n-t~l3ߗY?@tӏFx \=F2 '?~-?ө.?`7o}{孯n}ջ鯶n}{w:듛wo|[﾿}c#際_wz?S(4>)&c"ђw45"c4]Sm%^e9J(xpe(!ߨrd$Мq*q/,P!uLe@MM6UXīsa* bɥ8s[a6Bq[F\?b1'l\#"y?44VSqF0U[F?G_ 07*"=BFDݘiުhcܓ>>e?4 am^,k+t,2Ju!`VGMKRQTss׏V/shյ?S>V Yk?[ÿS!1; (n 㶏pmLJ 4B8As3 5"tƶR}[Rʎ|ie:^jiMH5 j#Nc|$v/Dž;HxF ȅPTv|/kݏ haD~`L/P BEp-ܹE4@܂/W$(Mx^84oo/,:5H̽zTGQ P~memanϼ@#!DaR1Ͼ}J\JݲCdddddR*SfiY1;|Q:WDlf^{iQD@* j,: y*UB/|LOHqwu1Uvp *SJͪ!\SCG 7O " {I:lb7؛QBex#PcDAAٕ7;ہW|e쀏m4x@t͛7#I^5[v)0 4ǴOf..N}ap߼4c /am\aM[GL_ot 3|KFOgAZ (#y(=@XZROlWGy ,91ȞQ앺-єܡhPvV6mXTx0ޅYQ6ҜVji5rٍm'M_O4Vvns\>j 3iGPwQbD; Bύ`b'!? *0=Z /objh}L푯`EGo#HfwPWSu J)|1 Sg=~V:iySݸI M17&b K >D3k!PAı HP6D` *;oI51)H4Ep%<{+ >RR6:A G}OoDŽm Վ(d^0 ekimXoYP407+`mOו??t݉jߔikK lZ9*50PLŋ;$FMVR /Zb/il! 19Wީ} KȚϟW/lZ"8VthRԋU欳{>ha~&¨!`sgalѢfٙ6fjf،d㒧hvt;[.[:\rM-BGnRT-@Y_2 O') fSuJ+hy'1 ҥd!AU W8̳r!f5 ]Y4KՁeXeNbn+VեÜa04z!w%W^W~?oQLKPܳQk$w/[Vf튻6=Y8y [/d Iwv#5Ѯ]'T$$ɤ3g s=PaֹDDlF #Z/Wu ///V -5qwc"me T"`d<{l|_\P8GʜrCfǽG[hlgJ^ @ث 25v L}Zɚc s ny@CO+|'#8fIfRU'\BkgQ#?'7H%>O%z={h.(e, ?Hon.$O4x0%F P 4JYqICCn}hgg %bTL-9M͎离Ф\Í^f &էWҋ!$Dy]C: wb6T`a|:>nmX [me6 onkg kMxNŘcCCǼs 'TRn!MsWdas `ˑ R=ȂT3s_*޿D>5+d-0u̯V~lz&iY&ot`qgl"TwB7i2~6l2FsBSZ}v-w٦&=-H 4}\[i @~45oή/e^i]C z6[0^xC!^jNQ,vق'C9uf9{wɰ/zwW<:`P8ڼl Pju||TEKٖ'2ä\!p~vc ;9XFW|\BeT"=}X2Sr4+=CdVo~ڀ.pKNĢ"kR[Aц5@| F K=/jF I,Πf(YJ)JsLV;#dCltm{e2Qe#_gT݃A*u|~% fI-7ǣD4NŇC򮠌oMi`tB@qt70xVkMUk%K1U* &X> =G.݌6E55Eqc6Bc\Ğ$.l(TL]6r5ڶZ '[W cl ]#ZR՘AB=% L?FyfT5mA٧\t~P0~#plނ#8ahugkorxX׌c5 `V @d$fG?~^)>j)*( .SD0Q%YޣbbW&CajIK_qh$Xkׯ=?&c=OkݿKkףtE<"A`r4:fbcW\4-vtÍGdNC_USu}f ~N"ӵ_錳ȫ-KةBqҤ-Sop'|?yu.1t R7O_H b ӹ6߅4%uI#f6ڧjS6N Oɩ=ѹ Diú`dp|"JBfђ3ʋ0s!.Ŏm\踟.vKCYoJKAX՜a!e.Yq% f3I*ri?1 !AkJJX^Y/!sdzyݢS9G~Kg@s&Eax!6TLh3FgTı f/:q6=6`mu濐2P|8m$6;+FA.P %WƩgSR/}A>JxY<͔Zy ]JC*)#\>NyHu<< ;Nr;'-P%p\hi[ĞIi5qi+ 9.BФ--e`,NtdVua'D 85 7uS%$fC8aQ/ʠX*7'\s8M=FU7xy9!wWc)`<|%d XMː_D;Ǣp8r FH];zCW*c[T;H,q |EXђQHH/ 2U.8d6YKP6c::˼"1E5Tfw v]'_Yl3?>fAM |b4:P)KYFoQ,O4:낣^[d .}@MsLdw5NcQ",DiDs p`؝UfsЇK-[c6s 50>K`"ŋCr97\!MB•dmAyTE$ ,K4AăoCEF4T'J-ux(ͦW,\tls1 wNZA6w-H@ӣ`cihޚ7UX_K "K`QY̯+\i 57I)aS$ c*߯dgq!*ecPegV$p# ßw^+.RFXjlyDr=mTڤ̖ĝRfM[K:T@gbdqHi^oEjtuLf]UE h躃Z'<<3*NӾGޅ"DN̮Dt؏XaRJ  sʥx2WRCk kEo%}.4+Rֱ7l,xXİ^pc3bEQ`Ar\b#ً/$宣`vJ'oGr;>4ylzGbH_T_ u K>;| j8*}bﮖ,4HBk%=~ϟ(w'u]A6ߓk^?#cX}$ΑWK{qQMh1?(Iѵ [ڌFs ɖ+{gM 7zsf~^#ݞ( Y8<|,}ugSI)ݰ0*$!N fC䶉gHAYGLNyc353{9Q|Ѩ՟(%;RމWdĭ$*7L#3\'-;X&DνPTԵr1J\%B$`ZAKtֳ$e P#C1 xRd0F2>$_=#waLPݨ楨̈́ZQ1_/ >ډ½$ػ_>(a;,@$ڱPh;H1t"p( o2?Tˌ #KIaz639s{`݋Wަ=Szh_ZAqQΝ.FЃ0$0"5rj !ՠ(4镖p{?X2Fⶲ"AXDHBf﷑³W| n*b90Vu|4ek5';fd Ք=^W!4X $U4'Qٹ;+:XiSj1w_tvKE@01fJg5o@44 w"/.s5*k5oKPMN#f! :vGOm U7>:EHkŸsHLC% a[ʑs'bBx9VœDq-㔫+W%XzBFQi'Ċr!"k0qVSMm!벞ǭI4)WM.ZFCqߛG?aVJo}oi[T&+G8/#>橸ۛRF@MNUgA&jZ+9F9!{䖎tu8#.op;@noYKHcX qeΙ.Q&hB*n9po"=aEK@71-;ms|duNy:isTH#[] o="\v3e0Gr9꬙cu˫,u''1+'?1ן^mkO* r !9vwA^Vފ[xNSUkn'utۗ5]t ┉}vw_GoT|A&S]p+)MH$Ǹg65gCr7u_#5nnJ9҂ͥ֟YQþy+H jk,-D25" yEEH)5UO.-oW>_xDƕ婵xK;6I(,P0)uVg*ac"yȚ{\dH K\X_idbtHqܻF z+8C>K n4ڌECx$7U2{JPi#%mƛD@WZU~T݄e꼒nGE!ePWG)TvƘYׁ uJ2>r:9j}CoZ"t"^~(ʄցjG`ko;c3@ͺ_Mz2>5>?%1KuaO+g5; }:mIf~Ti1_ .XU>+B@Vvxǫ>3^?_MkB<`*oJ;Ywu_OkڧW:-Q#j3e Vw霽?o~/^zexn.X~J(^VT'%r܁۹BxK踈\vk{J!|v˰3Xʷ^Ŝ֐SK| Qq3yp$]G"hpV_r1SMGjQ}l-h&rpt³׻ Ay.A_+thHCs+յ?5\4:>0ț^zi`%_!v}hs~k0rhEሶTN?~)ٺzJ+\:g<@4v SҜ"`V ,O7JrZ1`,2I(ך^4C%2{X/c nӖNC F]}VF͋')X4n1b0'A`Θ6ͱ+l {-ӥ4VS:,%-eyXEF>̙d[ G\n \j3Й)z7".\z}<]e2X.֝PakՔmޙ r]0Ȃ~i2q ]%y=v+2hB}D ^G{#iTrY>⳶W>oUl;օ㒕Jʍ."kB{w|_2OhfM$kM ƦYv-Mz0^a9D7/%,i:Ѣ"7pPYP2NRL-,F‡qB.?=h[:Pd׀{BgF `2 iA5bR{سf𣁥UQ(Z8Sਡ&HG}ӨZA@ P eL#R wX!lJ0coUSh}Ư@lIwc$o"&tν`Ws\WZJȅ!kUV"+_4Jes0,/Y͈Zw[޿۩:`?JdKv$VB8eMWS'0b<@|Nn\$D)[^W4xClpw[#{_ X>`zX. K!oӘ aNtyWT`DRY%={NNXx`$lI 7A3.1 ~gӖev8HC?!"f0h~4ZDl pѤe:ݩjiuyk4Ԭ1QvY=v41&$ ju^ŝFʱ"9v~ cRD+e?Wdܾ>QWjCg %/C1vK x:p@a p n5E1JQmđ >Sx_Nwm3 ~*E[vapVJƫOc;׌7cוig|̘NI#ڑp9?~|t~d2~Ŗg2olxpe6Ή[LVIkR~wHwJΜ6?V&$CP07t:eW(-}<;`&@;}\8gW=70:@δ`]F|%Q$ Þ~KZ n.Cp^@Lq6"i^.\3[z}/f*?Lw;HI ٍUE ,Bh{ ry՗i&#ĜNWU2}sUs^Ϯxs)r+Z<+qtLY\ٰWCkSnd/\]{G:'(J~y)?_9goo豈6,x _vG{]`yHw!ddQڣԴl>"s cEiܨ-)WKA¦ iQ1 AgHԓxobP$tMևPK@ i`=蛱Oo^wnarإb;n'ñBV&+w5k~E8\\'QS}լPԜڬ`:= ,,`m 0m %?nE" jbEpؐlbN`t5zIgN`y>POU  k.lz~w{QNGm8GGdSvl % C+/"bdӂE&)7 01Eݾnoޢ-KՐ 4~ N)Jq(t5i]aro/:] 0nJΝ.1s Q?8Dq7)eR"-1$j*TR\jgZWG%l-˸1Dҩ9nWW;Mg13wf_)k^gm͝,8H?r )B;=wlCAf!I9hgr/]CЯVTLCF{/cBO#dh4X(8 )'R{ΙRj!EOjeȵ)CE۷yA , }l%r=/*޼6v(P!ryy$×?M$FNxj.C^2t{3IW2=9۹F;T'#vcPĊ@wu7ZLKw`W3oBjp/21EL.gW:?$'Po_8ϧ~ҵ<)7 ϐ0НZB蚓tG8XG_jJz춝ذ;\S-~tgaH8&њ b̈3N}1^Nw^:|/Y,RS!U>\TPo%;iDv.~G|⠉֤$o0w9=}aO΍K4aMfK0k#mTּJ:m=4_~歃ЭmeZz u U+Hz0~?_D$l >{ a˷riҔL: ϖZjL ky-5+=WKV+;z8 z-LD@7RCSET+J*%-,}} gCnW(-1"|%/8(!FOu NCjwl|kGuDBO'z7%4,@٫/ԩњfk<&4X*z5tj ,Uh%34q(qJ,DF)N' zѺ (:\cq[&9|%Zt +a/c{C.}qJk“M#VU:4j.?m(6o_u';pmhkF KṀ1R'j bD@\F|+/Y?c8*GMg T<7X Q{oHWҕh}G7r- 7ጳrbV>jv4ެ: M||0HrQVɯ6"yH?+!5$vSB"ͱ'CiaL&y2p Vb Vpt?7UXQ{HS@@ F$SLDZyceRE-^Sh ~{ǟAV MVNOkzg7@밶GTԋ7 ÎSx#sno6(bN+r:Tp& Y 5 q\+6uf냱9c>"X ~Lѣ]vWkE (<\Xl5ZRi5#h6{qg01=?qNT[w_٭>4囃= &٠mOi]-o]2bp1kB ab5!L5^zߣ!frr,bc@&G:䡹nRyWS V4Vޘ#>OFZ>Xz*[;Q|An&jt]` D%_L:fN>P1q96ԥy/? /׎Zf'~Y{8OcA1(`ƒO'`<%S'{2V-W|U%{괛ǭۛ(( ܉8^{?{MI[sY`|%v Z;T4lɌ;g18U3sVm?"*Mj"E ;S 2zg8P/0{d]{n{2RhB=:;3_ℳIq W11ӘP<3͘X;Nl~v (g6U~Q# 8S;Z/LA<ό2*Ѻtrem9ESG''&sxDYy9fv-f;2˯FXRW1ﮟ]{Q0 3O:M2U7#_?Mz#07`шD,â`'~3rR :Ts%4&`5Ce񫾈s33KYd^V'HYڡxi| Žs3* wÌ"&ǸN xWe Yp^܀>^.&{,`iqM|gs(~P{ak9*m%3o9;z%wb )ɳҰ6T>W/J퉻(DAP[Щ[5~jٵ mCmޠ tR>&7W\2KQϼlEyaۜy'ِ X EVNN݊乂ޤ2S=Ω)R,҈Mntt^̋[NҎ84Bh8}C;7C g NCR8fm4Ȣ р\y=)5i 1j:R NBR][dz .Yc;{U1s!cQVA %`(R%`*e3xkYK܇Z}}t'yEH8N#RH5 vppy:R ׫JќcOL$̳Vp{q+68WlZ{$ΙhӒ6}o _Un)N.嘑8r"V#J#&|r=ͦbȽ ۗ4تԳsWcmXU9g׭? ^D=G/ۓ\d>r0f͝; .#,I|O]+KQț_$v@ŋt} /9**4l/Ύ77]MNG m9iͰ(2ЃٛJv')."uD ^3!%G% .B?R0Ӎ4I+[n8mAiuc_)`"v+_h< x 7HKY(9C2xn,O'+D<{bsH(ۉFd|A_qKs ES&(J`jMW^PڀʷWz&}fEN];Q攙̘w]7փ[m]n@ux)w  ֨6Bz.MTt+Fx{ }i J%P.WOV"ϕ>oz $S1 2YDODNBٝ-m2ߠo f ;u'Jtrb{coFM h.ܽh…tDh|]✃ 1!\ep\b0a(gQ^?9#9DQ8E9\;=X@z=>|ӊB]uj9/>Q~\?J@sƇ4Իהh{<1MLon 7~4󢥬Dqf_;@ښ%APL~iفUUqx!5_L6 S(e&ճN~61(Go񠋑⣙$u?dNn*ĖopO70G{W)Xk齝;$lZi2}6/ XlB[X7?uQ-_wrKJ=V6yj͕vF$ t_7ӟnK眱/$-Bܣi%0.QEgh@#^%.-LRki!o vkWzڅǏ}]QǷB_~z}JoߓZM-Br"-oC*&9?sjqA\p"6;'ₘ"yi`,<{)n"ݢp6O( Tڑbқ0ļnǰ o12)ĩaﺆf=دJB ÜʺPu{xp8:1>fDE8L0\eq]5#& q;N])akWgw͟Ej7>6$҆|wMЉ'+ 4<.T eKbJm&Յ3ssdx.YP <eO( _j_T݂ۗ?%k[E1Uf%;C$V<4 \PaƺCi#SSޢcVߊt [j- !y%樝]eQyKЏzژ*Te^=w͗OK; ES'LTv•Q +}TH494g!Q~G 5B[;^E= n^ .锏4нDk2J(U 7ײ]',_Tubڣմl:j60eb,Ib_*tg?%['<`zt3.Wg<)޾GttkBHjڲVw=PG{Bp } ?"tkW7-zA8vޘnV>]$}e-7s&GwBܘ{#"_ _9U޻{7ޟGd -B +b'qz.!WuA[,!~jn§{וVc\^ߟlUTδ *~x(!aCQ ) [O9)w,8dv_%y|sm.?+T煈$#柳t~w||8[;< {u!wɃLyo{_TZM:nwMX^&r(mFyλx:/M^9u~`}`y\h輇?H0OPŎwf˩3+<B4I޷P*]J,̅rѨՇw+tZ&2=tO12t$\9g/qK 5ZtKj(9x(7նSԄޜBnh"k hF!ˍl>H7xit"0$|W^n\k{ty ?Zw CaE/,uN^ɀ(aQq1{6qǧM_渗Gw5QëYAW"bJ-2in5{H.Yu(H Yrge%b I0,5# (uX73OP~=3ؗk/LE1ytz;' ??Sar}zǧR Fc+t#(Eȼ\ޕNyE︁IWf4;eTVB(iy=5;Qf@K8RËI9?2ydY-Ұ;G_S7%$!8yxzg0;^h) +V(6ۮ\6|t'}rgFluQMbE?e'zFFe@!U.dT,jM6?6ArX!jdH+3;"t6peVJr16`rO[ }޶(ItRIv竑xv8 ӝ?VזYp/"fV'ar?m[OJѹ\qt-Kbbe˷v`OO,ڛ]UNSVj[tjt*|=JQBrbq)B *6oeK9O^5e6gBqQ,d┮ mѪPD @eÉŤQ9H۹kITl -UU(*ʔiյ-^J'h]LXji[ J E 0%YC GWt`m>eT;$9,D"L"EMN !B`P||פv-BIJ+WzY9%V(@eOteelr?EwU|WAEڰhoӉQ45Yr+k͢Ds)NФeѧej-J@Fyڶ(@e%JKGA}e\)g:x1uƎ{~NM Yr}Gg7mSE-ޥ1s՞+0IR29_|(dml*'\[QSPd^5%R_=5cj*w1kCE{G/GYwMrBziArgtSQ݂^PKsk!XlѣnG[o:xtѝC౧~:4[([isޫۻICkIs 7uWl MknR ߚCRg!ꑼ&; XfLWxI5&Ut7z#@ۢ d%y.9v̛\#Gad{eRw,]69V @],goڤ{\h89|-6~o:;Koގp^$-}DA<7+ ,cI"+ܴx2yӆ0Wbq:ՃQ|mH3;zdAA^GKRu"daL7H;R s^N 7G^et!),WcP.[`53&:h=1eS[Or,oCʦ{5XD-o>\,K<ȚQ:NMqЀ@SfnNꌤ`bFLr)aIpK|Jz]06E/D9)|vMtEwZiz{WN{_q'iDzO bpTVe''CmrX^(xGdj W"2/P+UmMV yO#6,}?yM=w&KNT8xֺ"^JzJa@ '`q+dތ=-Ĺesj:^`qs0r1JY˓-Dlu-{)}[/8uq8Bg-J٧ bƩ5KZUւSuSxz|؎kj:;av_wHyUaExC s^ ,亸9`uN)VXM#.n;n4ϩr 6gฅd}I@-ω.Å@fKjCq*rcl}F*Ԕ],Jc /r A"4jky"'=iAF ,~Yۚ,QXC^R -e4GD @h+BDC-i=­'9h[c~Ymi nO8RI+ҺYvzځ0H`6|5x{jۚuANؽA`)*E)Fӷu˛҃SO:J@swhUZZ ,?Gvo_D IqOP0 ޏش@u6*ɍx3*ߤwدx-(i.#|=+H Nǒ)> oG兔aPCZl=!ex,rġL,6qntGZGD7XЊ{,GgFwWXV!ޠ7[̏Scdg,65L_fkvdbWxLA,y0)V +?r"9tc~ G\VDqun?793&19?x AA暵ISMXԟ}ny|}2/y[]v֐wpywI_^0;})?m)8YY;woML(KpeI. T=!;PhtP29 JN!ӨLe4]]6cϿ#ONy9L]ۜﴳƋ5_*wM7nw6E?dɳ)bs?n_x5].e^o ^cO >$/͊($̛x^Me9<*jpzNmKbubR-&\Lzg?H^ӌj(gj<,rqe3Lbh2  3̏+fCNOd惕)R[:/.UѺ?ƫr1hr˕?OSkћib@:yx_X_Zj6|ʓم'k__~}ړ'r>C)kj|;ť 7W^L/k_wޝ_^2yyE]Th[^ ʓk{bi.|q]G_rOP|m \_~j ܖ56^()g*tEMk exzmS_tmvbU Ϛʵ㣬vt:> Wrxi驱@`y5ݼ?:mmYtEP۴}lP,. [ͫ7r͑`"?g>v)̄gR =ع6~I@ rN`TKfW{MvwInvĵDg;vē/tf6 .qߵГDXkhD=Z>+u-,зvnm~bImU W [{Jҷ`7jTk.fP%x_e=T?&u-`U/wfG ښg݅KJpFYvz/Qâ4 .K-]пSgNh(dG1rx[P *MQ;q^qwm6RZNX苞~h ʏyRvl̴WnS/3GPL3 )xăl 3;=M^j3$9nAƞ1a@&tUs6u~<$P[sC#lI9GK3e1L*),oᘃI8o@3R9pr6\'h=or se3[oȉ `}. .X˒>vYX={ߐ`hYamV]V\o 7rs[g ɧCj8MJP QƃA0k3K5hqӂo~NYVX52u we"ηQ}IE͡]*oeb@ݵۢ= ʖEW_޹\{s[4pI7Sߨ5\ޖ'5 5)(G&i'O^1h'-%Fe>/@e|3C;bFXirF3wK{MA^M\D.%={77ƃ|wqqW, ”x6< )`vm4 :")>hW̊ebQP?֯8\){svG6%0D ,d &ZTb] Pkue5L? k`#`BZG䛞7>5jO@a0]PNG J$/ ~a-PBXZǢ؅\q) 1C֑ڇN; Ŕvl:FRJSoG?^oRj1 *hZ/a62 !!B7pC `Ia!Qv+G3)kœv G0lDLB_2X0'QjX.RSgDz4Fܒ*9i8}ۻH ݌*I(-UYSکv~)jHtDEgEXuUs5OVr< "h!7p< 5>Я~3{!d|+ Pwz"_&J{sN;"N&ʆ!C]ڡ8}헞Cf>bֹM3G:8Y82*]Wk7Ҩ㬧?lP,K\Ȳd>H䘯AQћ T>nT{M6K>I[>(tS}rc82@}JntYmt#cǰ}P͵2S:ݺ[1{,zuIt~0c^9;Ld QJB7qaefB#{[ۉRtVS>JH =&ɈNq9.}j q>/l/lM'iahVH=0#%B׻ FB5zlkQ_oXZbiP+mMTza,ǺTlS{Si-;!I#͖f H$Ewr- 0h?X]K@yȒl>S"(iIo_=V4g|~.?:I{;fvlmx +8cK ^b*z+O&0xY ƁRwd\>oah:&4J D#8!i4[|"-AcN[4QwFٮ|%>y Z~5cΝ([o*k ~ڋg%-$6'uik0G}#a~2;gD 6M(N%Sԃ_;Α`CVCcʒ'[:wZHE{P2bc oɘm q*PfJ7q*+~$tr'1r_~! dRӌ&OoCԁ\ζ;?A5d7t'de9ЮJljoͱUba:hx ,u* {5<1[`k(inoȚi voLNcH FփtH=ACv8~bx d|%Oip yS١16 ^QwЩZCI;L I˦8p^c4e|( }$_EacI  .E+F/x3&C}&G-r%IUR(9{᎞ Oɺ&Ոx+Zv:#,x׵庎!&|`Nu,-a]7&q4E*Cg@w2$[ 9LEddsrWHoT5?ޛ Z2 e9s;1D.wᙦ]`~n4))P)}pE[7ƪ kr=c^ esj\ =cXA,jKs2'70f)UaS7|ť3$I:|&~l( J߰ jUm Ԑ+ho圤h5d0eDf~֪6) ]T0ySs}ʘe QAw9 h$s`!%_nC{7]ES BO_j:/VBABamHɨfL-"ّ8 k[dН_rʱѥhK#KT߅Jc-i%/_~9xybw7,2(8[ł/uh`x3}+0Mu;m̈́'-h<)cA밿RzMhϦ9UUخJ{9_w~T%HwCy|(Nc="'"FͶʐaGv&͌쁛p5RD*>I. RJ #Qſ쑕+#sS Q^mUt'8*D-c٘ٝfg\Goo/f'HO*NbΜPs&Tt}VU4Y3lY4EfvnMng&1ll5-J۬ H!m$rnpADb),ҽ-4H&[Ӏ\{ۯE`UCAlWhN+ezOK J DA-wSL;fpY04XjvCFplM)$xr%>ی1ұG;х$ut ViZի(e z̥hg[f)}ԳX'7є6+`9zێ)ƕBh\-R潃=+mAej0nʁf!aHK3P8K̑oguT0oʁ LQ7NAQSl-N[|Dz'C^zov:ʶ&bcN ZaSR/L:i/WNGk t 3{?Ѯ^5OD)J|\%Ցd6SMY3!Đf, T;ua9ɢ0 4-#IQ+kj.^~NpNPˋϹІ'[IoR\jÃ/Xx=)/j5HuZ~ty8 .H>x5359-s̱|alrL6o5pʲTJX>q apbuf#5o;;[*vKLoi%pƠz2Tz۫g%ZkYo8CA3LpA_9,,a@zs8tvg8tQ╊3C F'y |w"UQ?ټ.ZPd1WxkjKs#6v:rkx/ U;\_Иs,Y7m2 7eCYF d$ン6kkoGϷdk!lĮDkk{&NRd)_'-8ᬚ 5ou!v.(Y_v*]y eTۋZ&xtCs򘮶8BM&HYňGf}} CtsISNlp%P"#GO tA R,ZR$rV6GAg#\˱^鹏f;]ΒRb-m&|l"de4'9CR # oNmTYL;Ħ a߫eς=knX4u[V[8x:YS6z2 fLUw3Me 30rZowȸ2.UQp~k\e}Z0J#(\Taw77d[fqIzy:b /ݜQyzϕ-@Up6R !Ѻabm&Ҕ;ˑWLѓr8UХ"Nw[MR)k=HByx98|/IzD:4`LiS=6-ؓhG㛡$C3aȨ0)~En;LOp4x 4ѕOs /Ey @)(Ec=`e(NxD,y54)euqBЃX )BQކ>/ m6腾hsY@!QgRWx=NZYXvAsh6A( 9Ϟc]:|~i @4) I >-E@, `\D\kbpd~dUAI95X33222-;mX@4Z GQ@Az to6yOcV-)N!v8ܧILcDω6*͚?!W{CM<. ]'POfV@6#goc13]Ǝ+ `u`וldzݵے)ͧm٭fy^ $|%n<;gwf`/U"[\$M[h< FPb!#~dxrHNIDݺn (-z7.!hTLosI[y,2*j?HdgM^K![?40#:aY%AULHhm Hֻ,``i=xXo:dp]Uf5\rDƶ6k 3 ]rPKIW;Psg3SkexTŦ9Qbj¥F\bi1jY]9 7R=N*(|$WJQH`ǜAf `E(O[<'qDSv5/oB1xYH{u[#?*):SYؒsWr.Cj⤀sp`$Z֟[cGѣ^/lDTmw)!M~ ik?lxȥR']7[K"/VOaوڜP<=۪_$O(v6voȷ<;9X[MDɋw3Ѱ 䕈|cf?l#TZaojA6Mce? dLÈG.+ekv/ oΦ:ڞvy"̆_])G[}MhfV3b)wຉe,4{xS\eo ~7!ȕW^"|m5$n֕}ݧa>~GT0s}z}N{|P{X_>ߎZXZq"Br[o6TUDGcrzpI%A{> f9 Èh: aWZ.w0bɈe}oz p13I|tg]ƥw'>xA4ڊFP;y5Vzrt"\BÍ,ω /Cc:ʰ(ND\I1e}4uvn&:YDss WSc|Tcj-+i'o5*4<\v`vgVw+Qwtwї&CUτ-}5={5B6 WÉzt0,/@s6KÃBިIU^\X *ע {n[Mۧ?M:+ Rs4u'&lBv[>p)O}R<C ڀ[SrbܷFmμ6brO_[Ӭ ڸ|3U 2n&戊>fo 7d M<dUyPz& SAڛvzrm.倳O;0e̅hrɪ9ؤ‰Kq NvoQN 1;q 2F^nxU6N0ǝN\r 1Nӱ!_u'LX\jfqk6kmB')l*(Y&U")Ժ/ ūpT:`4%SЉxB} M껀6ܧ  [˝;K>َ)ά *(,l[>&KUw=Vl/y()&?pڍjJ9r ll2=+\e5RuIoM|}W.alR6Lٷos P-Ud A6Uۣuc1枃-Q0Jـ&{gvƚP&J,Mz>Em^b -:=V6NE > c ["0g-BԔ4D W0M#l8hJ۴3_e1a' ^-7ixj1Az ڴ.b;)m :ɺ.3nFL&;ʺWbW1/ЫW:!<4G#< )âM}Mfph^1EloPm& " 1nBj/P͖ku:mmQ,"6*TvS4@oְBr suol4Дҍ6.jE2iiѢԡ'T € ղyؗ[[ Iv u xOCgNzwS:hMkZ5-ҳlbo`_r7[KoY]#"tv <-%;9qQUbL0O(xLPjZq|ulhlqIA1G΄vj%(g$I2UOՎM%Ypo~}\4q{׽F :&"kQ {?!޿WtV.ZCo= zxy2hW)OAwb$|6 ^p9Vp6w0v`]:->oQܿ07}r׬a:?>a>}MyP@"Ow'Ƚ`!'Ȣ%Lȴ4}rQcmxip%`AW_8R%$$$I ʻ9Sz-Sgbdae]@]b)bD[M v5e= TƼqfؑsq&' +kjQ84%wF:N{ DXp2 Xʏ@Gr\zzQv),d- jLa~+'s[d1Y] (*]ij~!s{0&c 0HG$['9"do4vuxM34.Jξq$eHAv,l:V ؅u63uԀSưԄgnK)6]ƒI~ I@$RKfL9Ԅ{s#&2V*'r2cJkTvIP蕲Q{XDȃU.o`DHZ Z ^v;X%x0dH|6U&-٤*ijqZz~OV#L*߲9 t&4/f*^ 0ɩ8$\7burP( @(Y^YqOZY80YBs{#Vl q'o!,=h_'ºk!qx&c8Wu 9-s/&V#{ɳ~p7 4 `*GQRXq#\8*"R6Jpm(ղ5 oNbSi zK˥Pٍ|Y;HF]jrIlt&bXr]rjY>C98x|? W e^d.4t6`"~ dIhgqO:t&+i e bHVNˌe-匌lu ,'::d9>2q_iP]nEizRhco;60xa qJMPdS0 YN\O/@m>*7PgWYp^Z(N'_ К B2\!c bXiǾkXk!^;W?YANbIJ.c`Q3$rt 4*ֲēWN଼Ƕ`Gf;#ӁUOurG7'Ȗob 1(2)YA7T4n)4o%kj+\[֨ d : A-o[ k|asUn17*?P:Sk0h=n:Qz '3DŽ=fJ]I.ʷ}tP5c]I._;bH]o}8mvnrHi;KCZЕ.c7yQW=\^Dkxq]xg$TP)wCEs^}2-Mӂ{vvãyEs>_gwňکmNP> .u]ZtgbOys (|%'Ÿ}`QH?JtW&+#itOM| 8Ay2ҟPe?+$4,3){IEy2K,nR1m[q8Řzrh?28IN܌曙swB0t Rj@{]T.,. qRԃ4vF s5QT7~ℹReJjf-\$@EP%8R BF.k􇬞2*iK~$wʾ7w+nxaJ F|na%~P\䰐|Bxʵ[>`qWЧ? 2 w;M(+#HhTs0㼉Xݟfn: |w: k&CݰmN0.x]IP~Cі4yy|ƍE#znLf%|uYXM;h(ahX-%S#䎚U`¯Pa]1Ӳ0>cHAR\*tNx[#zbq[m)~s'ʄ >hpڤR /j>o{HyתVW Bn S;KM`8~purZ-Eh>АfxN O)'&].^VFAt(dFNzQPV!!ąHoY*$ʶo)6mA-7W sφwl=],OvIsNk<(o"\Չ)%)9b}KݜYUrKx$0=b[:1"(}"MږF`_}߻9!.ߐC0x5Gk%뚖w9r!5DeBhˮ+7PXI_\u|+m&#Zr9lb'wW_oC?t5fJՓy򔯟-sʘ_PLXLt*]-q蜀__mSMUVpvJ"{G:Ш4c $*Iɜ'fWH D\y/fҷ= Lwh Z@'&\V0U@ DG/V}N _\{S`_I^B8 꼶RH*QʹLAԏ!uә֭`&q8jj[Zܩ2獕}1RGN\)TF 7Wp213FXbd Pdul<⺕\nݧ,H-qdGPY"G8t{ïm ϼ@4|$]WgګC9߽޴rT'[~nۄ/u<.pDZǦ?S 4'̭QR(/0μttlmڈ@CE`rS48iBTi[,!gOӟ\P|ᏇG|ƻ%?-vkaF9$d} zM"Hg^"皀Y%'}˲u.+ݹ-0^ t\6Tˊb ՖϲwEḉ*ws3ʟ̔ `eڮR#.&nR+M,=q(Q20V^j6;& \c? ;:/|YW$e#}NKw=<:?z}8y1H"fkEYiRs_DNo|brr 0%dC5 UW ElG9u>|,@`|g&A՘*wgʾE@t `=DݶaE8 `A3/wy7ڽ?ܻ^"cWĀ.GeXޡ BfL{ t%\-{E?&v1] (Z1 ^:`w>g%v| (wR `4' w:OӅʾfAq+5*cP{M6MkV\?FU,K:dNN2'[H3hcNXd`]sGӫ11qIf tsCsdk$EĎHib-MBή-[JrפOc\i(.Ee*g-CFƋ+-֦*;L$ gtl!7\T|յ8r)uרKb=R~p5ҕEЦ>ۏB+N/D ReNmg7>weoJSLΘldXJQ7^&f;RkPêy`ZF8hC'*o^wH=X?9L<*z-/=&{dWkxpREG+YqxnzuW ?h¬IQY-u&\w/O8{PtA8ru;DޝhoX[3Xd6{e⧥ϲsx*B*f_=1Q=ops8{ ?a:*cT5KX2xyUQG Q⑳'r/q־+mpwQkh)/uNWq8Iqi읠U=St÷hI[ L (i,l*ɫ4o(:J:_|1ԕZ3TxvR"l{ixꎆVs*^٭ZuS4x|F6Cߡe% D7Sˌ\\W)Й^ƪl$צޙI_+%w~~hDK:x@( fe5k+>yٺ)X >"JWRZ}YZfB9eW{d'H'%ҭf׫!neެhԚ/; ܏?n7$}U&sr(G馆e.Vc<;p~]ޢTØGvz G(#бirPXqϟ7o়R[$-n:eKst)R oٓ=WXp`M7+Yt픬ܝ mg07"8-Cշ|&c͗S0u 靣?ʜAר)e LڧdzصJPiLG#Kx`(y)% Uw^^©o'$jOwnfps]%H >2ː.]c7&VjgODzzB;WlKޓ.SYp>U)"V;}X- Yu>C 8V&j)1.߳핏80& jJsO) MI7ҏJL-,OH%ᝮI̫rk0}֤)AC3p%('E7%g iXzjz:ԫ4|V8Dvb^}CG&o,g d"x|FU6!.1.=$ j-bm*vξ|7cwoTCA/MN$ tl2Qw& }9TbqIG0pG^ ?a&dkmfoF"*PI*{x9ְ.)ǮT4Odz 5w7 K_ͯ . 6sn]Hr9 b]j.AH>NZ{Q:ڛx=G*˂7%c#?.\ F>rYQz^~SwWχNdޮ#O둞]t]9]C8[;[ӼpCIS!ז]׍`;"aCm~cnc Qp`t;?'[ػjjL2\˅Ѣ=XPQմex\{hoO7ĿvsVھ,*'>fƶf0.') f;uv,JI;>, P  候y]L-<{m(k-3Ďqdle\: 1%sl%q?f5 % IH"Lf(Fi(Mb}81zNLj8C(A%GPЏ F'otslOе`ptԲʔ4z,}:#>1 ,L˥Z9_}$,OEɕ>o5Se.?ᴅ4>\^8*\Ys7繘NKC`J77EUT+D`T1Hl7mbh21[)Y xD8̆N,7 ַǖ}[8T;HsA-ɠy8P.%7vN[xfkJ2?k!TTj2{ͫ knƛ~vӒ5>!o莙>n{pv&nFI|֔~ua0r$g-T_H5D<@M2>t*[O,(tbVgەPl3~#t=65Us<m-]ָ,f\q{N2^YֳO?'_?a:G}z]dZ/ 0@Xg˝u\ɚ.>Ag|uy1J;oa'p M8P+]"7*聫(2 v焴ȶj-I\^ĈUl?/h0:_FD!VxD)p"1:bZrI;48&,"XS]|z?aS%ij1oS~+Y$ɠtOCq`]PY$ !i/ Dv"hMbcc_raI~H|a9dσ]HcG'˻ p!?£&-g+w qdD[FVD*2K<6&<L% ɘ/ !@ )k/`?vt=B i^iYQ|چz ;\^]^UL |ZLRQhl~2y1  @ГO!>v!C=$k2̑@JX"a$\C3-ۙ LLTQȧ[(e"ϥіi/N^=Z[{Y8KҾls i#q렑}.O؃c0(#N g9?VݐHN-2>1N>*ѕnu.=/Ev2!L_7\ЁFKkEޞ6ʒ2!ḑ$ڨ9$[T6 U_آPpeGQt٠Ckf*(¡ !ޕU%>rt%lDmn tHiQN۳ڱ?7l9&I %F_k8]~`n%1x_iLAnpuMak8x =`n/FH3kpE*202I6bn*?Lw{}M>.9x=iՀ[wF$.wկ_xBzy3˺UhvE';K88>Q_B!Ok*v+MtO|߮sZm_BNډ'Q>ɠ^T)M@= {,"X~`$JCo(H-~FS+U P 獵WjFJ* r>R+(]Y:us# 8N=wݗov6ba:t HqsNaZed_ސ\W%T91"!૗@mq3f W'{Uc EϢ0Dt'~/#Mg=q$O覞9wt GW:uu]7nROMVQdt>kou\k$kEq GLٱQ{H\4&Ԃp+AVjzdCCpegQvzNMtJ̩F4[Y] 1>qpgx/AVTFb]*;<,)_Eh0R_%JحϒKq0\EX!гbu%53S8`BV;(xڧNvh0?^`RHh[eX W5i7d 9. Vwڪͫcs>qK f';orJ vj)M Rtc3ѻTJKع~S#~ˁ^])׫ײ,,O߲^!n')mIMrJ֡םwζmDۛjc~RƹZ LÚFptXNS [ʑs CD"I4)R' ܺ S-ܹŚWM*>UDBD!Y"f%v6~mii7s'ŝ*>FhQ랊Miq[.e,.GҿDYju(\vLlVZp Q(޸~r>7W M*D;"%fam12{"MD a`b/9 SKI&W\~3UDked]]ÏI^t4;"dlxc7`yЍ#l2$p`^#rhyId:HZMӁ;XQ:FZM Vl銎3!=uIc ̦)lKu7;l9T! uKAͧO׹ qlڡT#13$-r2.EMa<:SU8!ʲEpp'r!s% LZՅ %)vȷ⎤ FerMĈ!l:F2N>&lfd֩׻E"7VF8_T9XFCbĎŌd%'nvgl*+O)|C@lNMp,a3ڋk/z7\iL%s!Ski|3ӸĤL"{d}jcS@2:@b/$XNi9{~atT-xIfsnͥ@a*F~{>:,Aw?H ˡ^;1<(ߚ(>+V >࠰ZFǐig4 %Tlhꬶ?5;jѨY*ү|ɛMb +:aAkQ]T OefZuR@HbUIN$EW>r)iur,P:+aj鷀5H%}OP.033NCksvDH5 L_cNt;?Z`r\1QlG>.ۈcNscHN?^o+WA3^4HJ)a1g<(s:fЂxyFBprfHL{lR@ҕghu<ˉA?-DخܮAC^_0d~I]Dy+ meul8gQ.ng->5p9Wգ? n]>4 6L'>1Q(<~p77;DwZqN} R+RXhjۮI ֆ;B"Ztmă7ojСYr\5jqhKƑndq7?xYaKMmv XJ83ffQ23́1*1mSMe8D@i8Qw9;3Qm{ q#T74g_bf2OAFk$"ּXl[ئ#V0 {zQԗD9s='ݿ$7gwfDt܎{D0A@jgn^IhT[9&dgK@ ii1#_aC@7aɨ2i5P:T _skSrmw=ۨ# yn *3 1W"2Vb4#– oXqM]V]K-Z~k5/mӾ]CCKSϷ,N9%}oAGq`̲.셝nTg 4!fG}JH<6TۅKaP3 S"*O3h$ll 6ԡw|2ȉw;Vc͞ZAnDȺK㰬v?7>*?b5f+`?UD]W[ <-=@DUn*Pn6 "wq'T&'i 0L-t$&+4 Z3U?1uE>f?ծ?9H ?9Sk9|M̬Z̅u5Ĝ-e6:>L(j*qqPT੝Wl`n󾌯7KT|n=?9L:]!Am*k- .eEWxWww{e@yv4EYPB7lV{K Jטh[^Td@#WY.ޖ)EtͥYhN:Ԧ)MuН_*C'({ j `TxxR$a,dXscFeD3"sӋAY6`EH*%Ck3oBbOYԶM\{b3[:vzm6c7aO"ɑSO6Ybd4tyIzpJbE~u8Vid:U,8uW`mp临4OEGqq}upԬ9Lҁjp~.+T(> `pL(}qh)qUhKI=mS;Е88{M#Ae6 Hf[gͣuUc}̣o 6Ʉ .yñ Y LwS:z3ÏQ3MPngt=}_=*5ί8LOʓЯbR=g@~-o{tcap?L.x]5x"4mΛ\Teu9e;UN A}͙־{*vr;9zP_&n@M}ySAGm;ǩg9ڧ;Jȍs!Nga44uL`k V1$].$NYhgbm?hgT9YY'(y$t{K='IbM*Btwڴ;{̓ѓD7z 7" fJ_qՊ2s "omb̥S"KV67+"2$%Hl7xuKtv-g= B#{XELkk6ܱb1 [M~1- :MtF2vۈ,xv.mEőHldwrdI/R2qWO%AlRu"͐== u#>OM9B5ÖcHٰ e{!wigmo&YL(7@>CO#HWU_>GIh e_'U&l%Mp NֵXio4RãGst%Tϴ:jB2O[61j8GSA#)bMv +D*F="|hEuK % FJB] 'aUo`*L.>YR X}p{VQwNqJɏ(PmG@XLPdso骐7+/-uMS9#'a`Wot=fV'5xeO/lst=4Xd2cf} [L`!nh3Ik~l5wyj)ԪYQ{6lU6vyϮ ^_k$? FcQV.yg8*S< _Z9}!I6 |g1 廒!qAQM1ڬ a^W^V6MqxiMycT8jT`"ɟe vQrʄ.~Qc*Zjѷv~TA3M* +?UomX ݉ט;i);9P#k76=c\ ʽxyʻҡ.z\n:&5ݏ:t至AKY!O1ξ}IXmV )N` :41O*K0Q$139f'cAWgPͮJշ p~Y-Tǒֆ3U#3Cl@;j^mYĘ_d-5b,Jh0P*&ݺB逩-7a.„<!^p;ڠM ᱪئ6P%`Tߡ鍦wb1=VKq :tBb)%-I)Zw2VO-iU4]1mx|aE?49Fg+.{qdߎRcm̱fHGUf>0Ո)I{O ta:%ҳ>Kkle<5A #&qAW f.r0>&ȇѲZIaJ$g CQ%x{(Yr$qB/(\JP.*24ld%~{%{چztqQR 99pX ՞N2C¢?[;G&=BY;OvcBI?lU~2݊V6[pveUTup:uPKǪj~AvnM+aBwȅyO15(l}oƧfOb0trvjR)%֗YD(Rt٭F_1"1NV@}λ_-/w_7oc H\,+gQ7.ގelL!."e ^[AX?F2vYv>q,.3PǼ".|1'-D2b 3/wEO_EDvscVj}xbϒY_j˲\s+ȀֵL]y%;T?p`%+>W-;S@?Q.ɡ]54^ou;jCг] azNkhwXv &ӕH5JRR\ {Qm]PkP`yE!x9RcMPyMvYLaSulQd-Y>㐫b վ=MfSJ۞&`t,0ڦwć1b<6;+iJ- WlMI *M%Vml(SȇCufUz /X.Ss°1sDuiB2ࢌ`2TxYsOim>$z t{MBzK%De@bUt4U{%ۿۿI?PLe5.!y8*8";^͎^Ӭ.i8-Våz1&,:{-IkkX;46,'{br/7Ǩy1a<@M,A-{s0dZuw]W1߆B TcopeFN7 A}ifbi#eҚkm'ǫ#K3SE#71i:},wKi=pԌ 뗌l7b'߇GE< XTs2z`7#UhUUtہ4 iGtmtm ə]x(YOM:,|3|ENGQ-Qs49ܮ6r@]6rE#wϛ8*,bq@-/JIcټqԚXBW|Z~.^WF\(1vobL7hmu,/T3S>-Bi.J:=EvS1^NY40.0ۍ&0WMNu$ض O-O0zQpI v7ŐdݬN-ډ؈ ݕGqQMڃhጫa,o ]1װCc5H>[je}ø)א˞s{ ϸ{'gk`=l9^$a곈DQ襁ط[jmhϿw߭?wWò ]_e /yϥe֘6SvpζoxJjbZf|U7 ww͓MjӲ5uh)ڵ3EyBю^@T,Oɻt"Ra/cZv:FۆisG֫ ˑ/}@>Jz8&rzxݜ@GP5АC伵jԤPP Kt CEKtҟŧ_)'ǿܸq7R+^)Ug~Ԗos*~7f%k+AҠ[[ׯGH̓e|B'db(Zw_v7n[{>?xȞ,}7e%ξ5iA:8l&ER ҦزK^e)Wp 11i,3V]쵷) $N4p.%V>J> oGR|x-"^r|og4hPj}N2 3z1~o)- ;/>勚{;:v}JMl @p. ׁSbơ`P \NhY;Bk#H㡉XzPGtR JFȲEE'F)Y u٢_f^[l#5jPPZ[˽قWơ/QG-߆B@$2;"[܌ĞQ]9pxmV߻隅Y/&onx.A0E49f5vj 2F5npOP?;,鏞"R}6^*..n5ynژX*z]Ev9v{`Fj9})L=J -r-Ѭ +C"4Z!2(Yݪ0!Ҷ"n܀<80[$"sՅXH,hYCGOkI^dž8Oc<| .i%@L]zV:xAv҆}z{qV}F/˸*1(hXfZ{@OnY=[]Z7-{)^s0eq:fiwtⷈ$w125pn)ߖmT-ܸ7nX\ @ {gsK*_y~s!䇅tD#te2y4G\˝]Gqqf0s^lvdw\#7)y\ݖF6[%]A *('Wpf u.x|m:!8 NM7rLvoPW 4\QE"gt==kU۝GpKFVGOw^denĹׁ4H8p6\b<[2 4Xh^[avU>? *o3K>&CRJqsaf{GC=;h팣W9f[DC}~>,9 ǃE֑hC&J|j⏼ LIU5皩 }v!KFg0X㷩zoƃ*+\iG!tg7, cF qTʾWX<Qvq@J!U'r xћ~C\6  腎AY"^qۇ*)oy;1݁R}n/mj>c>B,jڃKP}?E^F%|= $/lmi $mZڮ,}f`ZNH[fw[ 4jwq;z :㭝4o5o$O^>Mog7^mIM03b2M7ց;/3I{GO`HWL|$g$dkx":>-ֺ7R2낝G6Ɍ!~@Ez{%ᲑJ%x}| _ET>A2ҪR ݌D*h?Қ_sFFь|FKn*>H'$E/ JEH[MtŦ*~<]L g*Ujݼ±9;9\&c<]ogڂ!׍Hb;:}}#5IJ(jeǟT{/uuq ᝵)*.9CQꁄ?0sdF|հ1n:ۧ/u֑/7cу4zΝTF7RA y`7 *$7ܶ*~js2(w*#%3UR'3jn> F{nObtp"|Z6>v2sōzjr{%lԼOK]orv̋P _x N?ƌeqTߦ mϹuvغM_sf_{$@>0\!vaYSEA$7^kOAkfy̍{F6Ȏ sB?j xV?AF^쟭]!wo؂ l]C«zZo7[02dѴ.T ,x\ 0I6*̋+) dd7` wNh" N\VsrTgO#J6k}sF1}H鶳NԒnz*S,S|JV HB 1m{PSF2RM( (q'lPDKUv @kX @]߃lq e$-NCǞ2 E ϚXVvm̵}]aچ N$w Dzޟ+ 1<`P^8Qh_ Y~|) l91)LGREZLUFCg chHz>l }HK%EXSْ]tZDA_-I*$8 UpZKpU6Kgp/uh={K߿fTPf!Bu6,wDS!.INՇE'ᯕOxBHjB9Yfbmh+7t`t\I#[S^V@*`dE#:T~RS԰/#]׶pt{|] \Uk |S6 >Pt4 uC9ZdRWDJe)ɝoVx+ϯyW7q *pR1U;TҚ.eD];/aL} Exu;[zFQ%xeMt  bb!2KMGVj1(M)9I<:Rj5=NbTc$1o4 =Eq"Dw"[|UkfsˊE{@]>ah4RVlww&_'VIP$ydL0>_0[]TnŽpҸYyao7^ 3KpUyۅ:)U2 \9s)~TĬKCq~^2+)damRH6A}WRwī m_,uV D Y>AFs\*)ًYxhEkHQ "w.MDwޕ'']-aF˸+_ !vtDK?{P"zQ12n]%)1JrYkE}Wk~`~]GRkWr|t"@ ;B v%~%Y댬2-\QY 2^MEcmkM^hT~yUVK;a,]n&'S.x[%.mTuZcK%Œ2B렴/IWfQՂ굿 Kf+UƔ.?}g2 `ytLu21V-\ag;H,oZ*kyI n ۇ.23)ԥe=Gg#2^H/X1-XYqOy<2ش)83V)*e#sD3O+nDKB~|e99%/]29 zt.`KmŖjax~7nreGcM(Ds8Yh go61o̮Y  ͔nR<+G_+ĢxVnTl KO=[ԔǟYëDJli%6غ0 Շ G&b!乶ՀYK$q{$yuα|^ʟVazAK9]?9::ӃwBȫyїg[?kpH `JScqO4aws\_!]sB~P݈5zŶÇ ЃBW ȃ5ܮ 4ϱRwZk2oO_o?/3/-s}Pʈ(og׉}ѿ6Οᄚ#8{pnΜSȆl_*bfoǾ-I xdxvzy88q]ɩGKR_6lm|yonno=z8x`WGr<lMYJ}z:uGbn_20UHՋ& TveOyti@>!}$_8\F;Espv&}ޡ`obFB+`?+YR j u4ՀQ&-'-zm*W?>_Sk 9܍ߎ_@y`:-Ticpa{`;?9v5xJ01YPZd bSrFq"JH GuNi -TI#9kL2 Tj䷥7B#+mIj"Y8,'4A_F-dd Vb=Mvk%Bʄk::Pʑ[T1m>%PҠ:rd{,{xalMn qT_!xŭރm5ʭTs[.%&͛L5c'STMVh5Sr%O-q(ٴ]~U̬Me')FSPb*kMKV;a.zKX ^kUH/sP&bX׌ԣ_*4+4fD~OHkX41Wۗ9b"((꺱WPRMQvϒu;]YLN˃:<ߤ9 @q5_y`YC´T1nTf0\.XK#Γ,e|ÖN'x#Js's)7--ӵyP8H" t:S!&bEWY&MKXΟ9Ejf/{OM l5 rT&,Kl1V>eMoLZw0d~;z/-śZ[]m&-pq[>bQI cC[f #},o%7=6h2:s*V]-\9"ysrd??̓ ATf̩t^STDxGؖ:lr.jG7wf''?h/s;׽ `t(RXP2l|vԉ$R~ %!e,&i+S0[ Pa`k+Ԯdv]ctDK#qO5X@{*ev_;Cֆ/g)"A9ڀ4.tMQ5"+'gcA3lOt!gyZL1Ƴiӆ[P*4fϜ (y gDW4Cs|@ql(!Rl*փ`l1t#w!omKZ|rOh+-XG:|ު&T֦jAxjD9w ,^  *$d ; r 6x` 96㫞uQ ֈJ:DpJ.$gi`lQ2 h 3'h)&f줙fw>6`%lӟ#`9K.MWW+'Ў)xԇY,UȒٍ8`i4;JAnmGo+# 2oN8 7S1챽h8, DA,J'JLL͠S"@ -_XR@Ƹu.C*6 ɢ81"PPeN;".Vgn0cGȥ %B;O'Y2BfURMtu8z=U՛5uy{rowK_Evf7 XHo˃whi Rv*R.Ƕ n.Le'g څ 6\ l@.*Tµ;o.8fu 7yľv-EvZ(/fk-3PĨzEt)ո̨rN-hB/,,uftHv51pvN)%r%"dbEhn. RF]Z.(7p#M;(MRNVWJRk܂eK,jqA??7>?xDO.ǢdT4UmK>BǷ?) HEKs O %TK$!^+e2$q5y^l9*尩V`P#np|{5^M=R@e j{/҄綴ɦT-ڨVSk'g%5GuH́}[;oƅb蜵PYެo.N -k$c!$Y ԃ\R$lb8. ){#nĽ12"D(vW*пH^m=ۭ$qim B˯%㯈zCHu2Ð@@īN2F1p59gR䶻[C?pzeـsou(ԖƧڻBohx|v x/p ٣ W qdqTN $*$IYFQJ BT4q์Ɲ0!z1*¥ۣ .DqQcÔb"$x#(&GpŅbYFC$7=MF8{z54Dǘv9`%*:g]+Ҭjt7,ul1z?=94"#:p! D~3+I ׉ ю-v&Lsg۶ d]KD5ײ| ܢZ»}. bD4|f}Nԍ@*ٌ@]V\Fi: ?]w`W&K?%.*7zц;?3=>%+1ugcrJʾ:9UW]:4dZ"8Eʛ`عvE=y$QÞwYA~=sEJlܰ5Te9bTR<$x@4ͰPU.DI:Ce´jyNqmr׀-Rnt+f~DP|Gŕg]> XI99QS #vaH+qo3KT E^qO_Dg, g-JU(!è>eK`\S`[( !()cfE -P 7 q~O9\ISt&c026xՉi7O׃T1a𢡊zYv L-N7ctuh2R.b&v Kp~w6]mÈ><\ll1 7'<٢x_dCߘCR]M2W{`Xi_||wc:*\RzZcN ݞ]Z!J1ԣW3~X _$S]SV{yAj{SYzuq pA}?mtLȕA=9r.>n/ay扊`Sl>${m޴-oS)8wJ+ZEj?X[L@cȳ\iޖ$fgtK G&{5Vq)a-#Wq0_4q_oOic׬9gi35^=OMԨK +\d%~L3c"(1 %A{ hLdv٣kiti^|~J5۪iOp0D5&L 0*%z۵q ^}Cm9YOFue9GӉxC~3jtb`܃;0Q D-&;))f THg8JNS>\&0=L#Z1!}D7a[1_HW,~g؁+L wW _ZMX# e#ZOw|=RDlؘŘAJkdr#H^[u o|P$Op 1& rd gw-* ظ #Xf9"O݇CYA/|A=–,:xPr3r™[@| ]&9d Nzp Olµ2rw8 }ʉA})PDX&Pa梔p4ꡬ3}g|xtzkHPF̒+"cJW9nR a>rm)UG(p5x-q4CpLQ4UG*U]q;WWU!!8ٱatUnBB,hfݴ@03 }Xa6X29mBVK2楃ˤҳێ2 G՝}& 72fEg3''ym`Ӣ%llI!$Ma; O '''Om oJ2B#fjH5MaW$-Ӧ'ld A6Tg9/1$ULkDj_] "_?t :Dx /frB.TmO{@]R)4 5$V3gEⴆ#齃#>Hyk/a1Ŗ=kW84#~u qCeԵN'*I >YzRՈ|biF OPDȖڹ8SvWWAH&OAxd1r*lkh$)`8ۗ#<& NL A7~Ī~# b9J\XjTGYTO!-ZC |ǎ Nu803d??p@sThqzv$PrE6.6օѨ.Qy!4(=;!9!]נUzKj'(GO΁ԘPcǑΈ 'sypTgLR?4?auϡP+ q= V[:ëv=AnՙEZb^Z`MP*~mvKl%֥F@pC%x7aO*_ 7 jCv$&z&^+DL*RP4a %YK c33DS2 lUQ0,YD'!( P80I⬳`(5Fcp+dH2&6,a5NC$w-̓N4Sd޵xafӴ Pa>pDQ_9&J9^E![d_/p]'sfܴIJd&)..F pgC94x#dplhqH69Ck a3w")+(^NN,)`ef CB.IFTrQԍX] .ۙbԯ5p8,IN+J#:=QHtNG|d[pteSu4,dIh,q.Y*7(V;`@IН ɳDR$.}>^1xlR:g!d/cRt`AQ(ϯ)*HUҲ弥wX[o1mHwlxpƳ6aZ5&A<m] #>8wS&=' Gx~D PY5s!ģjTvm^ F oB%0Oe9hx '3)DA* V*Dۛ˯׆ÙR%,T Rς-Jo J#&Um!KC`6i_!q{ᚥRb'7c'G#oY2!"Iǀ+FC @ =^: ˄IV9Ah@%$(; ]>Vr@%d r%w5浸Po,uL2k y?A}jYecn@ 4^Bi:GNRB>GwBym`>qϜY+X'8Gլ`  /{7rmKeB4 =7[}pZ_"$8!N_mw~APQ`Z0Pl_S`=xQp6@c`oң wT8VP@Ŀr9gދΤwM8~ÉGG'HHagcب  c MWHK+Ї.:O;Џn>| ƀ4/zXtR&w*dbcf !!^Wn"#jdцpdGEAWNT RM$vD)Eqd2: Ix;>F;2r[Nލro͍N4( 8&-|8e\"ّX&-yG]VfdDI5}| zc <k9:'hY"֚W/;šSƻ Sv^a`MΈں旎|-'E\vOLF@gl:֪~xF \diP(8ЕIM6N-JqP#7΂yU~xYYX&؟ħAQfUZHV7$Cj0|^m}Vלy݉J$-؝G쯬(MzͻG~3b#}k5_p.:&G"ZtLf@ne .6Bb~\^ 0C%{K-Xxl/*Gҷgdل!!P+;Z4HWex=[̜F=|.-1;dq.LȽM^+[%eɯĈ4̻F/S3ȗMjs_,_SF#FΦߏU!IqYC1T~20/{5 O k/ca$ };>Bco v\_/?*}KmJN,B{Y+9F7pronpac*l93"539i2n|:g*A}*)[< 08Gd2 mnbi=k91_ wp_ɤ%]Z^lq ӸtfHH`0&#'OWlT'ҍ|[w0_8QD$w{c&ܗsKCA(HmCY { 4 u9I", |'5/a8-!aS~9͇ 'pE9q)xupK*4%Q |v$jз!>0f J7CA!Ͳo1ߡ  QGKP> z/=E'DǬtr=E#B9(ZБpB/0K}N`V@*'~iIZ0P K0P%ة B*"XP%`:&bY1DruDLKe&Ľp6,ѹ`i\cں%YfE]z(pm+mt}1̶̡< t-*r8@wtrcjUlhAMgO| m֓ar?+q<ٚͰL(_ŭ Ta}U FWop}x/O5kȻ9f1yGрw(yۿ-E<6^~]fBT9"\hg.o=VXNvk֯cS0m>z N3w{P6x"!>~8%s/WǴ/>ZT%wz%/?r|oì&mdmKmk8/{hc<_DfqV̖i C}_Y: xG/љ;k&Pgb{#˲؃`$OIJ]/݁*ԂMw8j^uCmÉK>}G$v)zqs&beMg KC^ jOBc{8/CCekk`u"lցbT f⠸1]-q `r=Cm:Ǣ"Z.MĬ =؁ < LsK gkcvԏl4GaAF6 W4NV2v9C]h0$2P "@ZNgōk?,M!EiM"f2(&M9c'u2I. #}P8w1g*| 3'LߍZK Z{u}ǔ/%)p]羣1z"9)HVkh}?t@v^{xPL@4OJwЇ$ 5_+ eU IhW^{g>{*r( G3|,omD14b&!hp)2aN)''玉!}7חTwZ ͚kWnԋP<"9FҘ3GI׬j¼PWl.:AJĮ 5h8ߠ& H(TN1 μJPy %3r.G0$@ @) ~}SXP~D4}_LuVX~AHFe9n Q]Q%b}\NDG!Ag*_#Ňy) {`S x'i.Q!kήװP#"Vz[SwFZY񨡦-^Wxn`ok#OH!/DN2 )\B5 n=JnљXό4߫Kf%'6+[AXS%&Dk~i6mCiAC x$~J]Ԭc薢Z.^.p^50-%<-<:w Yhx y^ŀɨ0v5>g@wWZۺb]/ߐo]^3bߕs]5Nu]Gp<^=WbkBOzTR7)N 'd96ZO,-34t$G1"i#],!Wv蓌dJ>_BN-t<@EJn=IJ^=-87g,yo@mo4/v)P3PR,:]!LLJhXPըȏiLK8ʩ 82cۄ*ՂMڞ :l1nHG yC$ ]C1ցJ 6Ÿ, \ڣꦁgɣWJ/r15Y5j(?c7? 60 \T05=iDHNuVǤݕ5Zq@R>=:ed;<` ?r- \?$24 t??$DBR-"â1Ï//ݬb_3X\WTO eu4)~"F2nރ7enz1A2581 z"bGr73[).[*2Yn4JPy6Ś@:C{|)c0M8rKb$~&?c{SҫkΒE`L 'cPА%=!.Ѝ{gB:!aRYLQTx˹Jןh3t@bhçg[_j#]0I>EG849?[z)2/8x[$wm"=eBĠ@1uMGe_?CW8yw1ؾ@Gڶhs[Q>G<9\]LZ} VR8'^="AX'!A,rT}* KrUi FO; o%.ʣhȳ7'ԚBcCh:ixc713i[{ΐbМ~E )UcnCwV+1a&`7siĞj&hx j6+j[^|R/tVZa^&0*YU0z6^zlۿ;ǓSa6~b>`q> 0M qz ~p8e)pvQ 0 GjF^\qJ=|/nSlx4L `}  dB^؆xo*#2$q=ޤ+NiRgzW/=IMMLN"Q-F4[ÎPH{bOzm-~AW"1QKP(5Za[ aZ7zOp>j#0{a^_dOq# qؕPs~KUpvzS1чfcJE8|p 7&ƅQ>(L)#F0WTʅCJ"AA3UƹGܨrRB| zt̑*pn_62FXӯg+2Ǥq(/E9һw p. -#r1$F--i 7݂"8krq!хT34rr0äʩKX :IQm6UBukݤX4nW$6k\,"c^ͣFwx[˰csaZpe'O//eՃβ6y(5n吒 _|\?0t])o//.M{=;JGp^z[w7ߗnY:,qH DoaAr-k̖lɤp Jr\hd<}t .Wh\Nr{&640S*3*e $tU@=g5s4p9 ei}dL \y2AHDys4GFڎW@kTGH~9Łz|@+$^{}JZu5\ qnxtn,(m}? c=ii(JoM"1$ZאQ1wSO"]`tPϡMUjVQw:}k6 OC"a**ktYag5^YBrUj؃h.O 1z kPf-ћN/ ^{nJ%ݠB52s׼ih4W5#ԾlkP!J ÉW `5ZpVoQ9>[VQ=y;н'^Sg_wE@Wד5e[]%-S <`5#weYZLʼn9xk Nt'c{8݋W8[*bY=Is]'bά(CD)R5Gm{HW)1#|an +}:: =rD]^D 2s"(fɩ$ F~` ^~}fK䱅H~N1!>#11F y-uNgkKKa"=MWxM&+2d_JfˆRudu.X\2R#Lkx0A9qC.8-)h= 6ʲ%) Xݷr۬xJbC5lL`!@#eRFAxsjÿ1dSOWB- 7VUe +KlF$i stgܾTwuj`v)/iu\ΎQ?5_TMđYDNmN*&M,n}--CS}TٯEuOs5=#E6ϘMw'9<7c q_kl 1%(At#)gZ Q=c( ehǤWWHm;%$%pcs'Gכr q R7`-Ԉ1e0ChvV{V'p|C`P%1|U PpPq,x_{HLjqH,߀*Zޣ(dg6rm;rMb*^BJ'p`\a$/ӜWk#1A>^c,mXđ'r1X%JmoG1_gԿА6|~wbV1NyOYA+E !"#]`Z߁)dzdoIq,]4Ǜ %.{ŨKa@; RބV'E!BJ;%!c&9zĩ,ӀccJjv1>6ѾI C{qs|ď%p,WVf?(#5@%t.!<ڃyEÈv[fSl4"F WbN*:#BYwj<.c27Zy=W(yaVpO V&eOD&'(O[60A3 b0Dxdy9ԑ[߆0O`:_~4k @>Pߙn3_lA6tCO3;o}V}! ޕxHe!֜aJ~akڑӑIʪ#\&^ad\#5-C*6jZO%~x6K3CFaHsO'.%~5 Q u̯^"(=d 8kPF)5+@䭪VwJ@V؉$x%lKB*,jDR!|ШpO5``k٨+(UEcG=w!4L}nJcΩ5ԍCжv֭)VV`(FZ%:ɼı %we %F9{a KB\\8|$B\z88ݣ:"!DMM0autI_M[ixQ0ou!w&ۉC-d(OiY0+Zte~zTv1m+Zjҟr! U%ukewVJ텨MۿXUI̚EdYmN^lDBDvf`(vE9һT~:ѳgiD?Ita$-`? K#h42k7,6izj7?SJk`L PyۋvL <Ӯ?2:[1d-mnOm-2PLRtjTEթ"(&3µZ *}?3*}oS c;y$/y*]hPJ Ⅺ)>Js#*ȑ\.OR<tI (sbK,>o".?ә垓exD`I uWٸnh*,WdҕN]h [1?`=tp;0 XB$m=%U8`=/LC7NA+ƠXv",i@[BJt'nu.1%b+p5qɱK% oCܰDà[!=҅R߾YN1g|4ۚԍ҄LvRhr@slk9(m1M'蟣8!Q3+[T0S=3*Qdh?]]ikd5N)&>Ү M-"uZ|6y1Q6.Lo-}|Lo/+q~RыiF6@BeĽ}7/ S05tlVelAOLH]ց_\l ORm̹3?^7`yķК=O|<#t,bn^}/GYXcqEg$7"m^/>QW_"#?BشZu O|3d ~VPTcBU$7S'Bl)rA^D%Kd+4u/͂hA(~Hq 0w@;MPcEK׻8bϐ@g;Õ&ɇm%EkfuY.-_` оbGNր|' Oplq·m*ʻ_ÔFp˜%~Y'S_!-4]\H.DOXske{Mm4;x)n4ːHY;$HΙ`Z6W0\2P.ͥ=VA{م?U]09>t[g'r%Rp7K 0p1 'F;kIBF?!ZF<=9H*]!IO1? kD:_b5 6%g!P Evl]-^rc$.h4 _l:?Q P {;=9ZL3A5gzi/֢!K?$r!dkZyk.nR`gp$lWb,G\ ^qȣ6=.ܾ·k'W?o*!\MDx6TT,D.0IEp( n ,ˬ5Jj1˅ڱea +LZQ9n"1XJ 4Jچ_gq -ó)55#WhW]Q5|*Tt7^%NҖj%nf["#(V^(#2])(P)M ^Rݛp܎i*؍؞>@9\u2 Oi{LPya3{f}eV>h&.Q60hkzdZmi1kTJ?t]?攍i^5 i!i;V=mxی[E`L{W1$-AѢSV@D+8Ry|lzbme(dzK˩Ökݪ +v5:\! j#h5*jG+;)nE)?$7$G"p0=2BNplQbTyR8(])PWh85hLkTAu:.$K8\H `Ϊ|i!:W:ׁiPcr8 ˨лJ;\ `OWlsJOpF2կ94pH4)N Zͤˤ楋y-BHMcH*Bwu°b ,xTsk04( p;dSV<Q][ 94#kY]ϛkSEW',(?jڈR6Jb&|4iȜ-~f-괊8 3?k g)镝qlsA[?R**ȀDBI43h=i>#E_hUpQ1.l^kEj { mu=A >pV1xjR#G\t2|Zej~.Vu=ZdTJg+Ġ4ʤ`9ḂExFx6 Qo1G1ţW mQg;2#ǏE_BNk6IjS%DFPȋ}":oӬε ZPjwS\g!9XBqj2 gfVZ`j+ȃl.>r4~D:*}ߊ[&zĺnư|aϽ'UE{Lq,%IԵҸzA ut軿c ]_6!nn%wW2?@+8c8|Fxi6/*G@%-|Yq“(y[w] N;2l24w\c";ZFtHqG L?[G{lzxƄuҪn2P $.:6&\=/(jjT?OY|Tƒ+[mbJKY X Js)kh3H^ 7-Nk=d ^_9Mn dQ4c:HۊZS4Tv"BH;J5(;NV w)^j W](8g^ЉE I_*bsef22U&Rr$_b?P8}\S\@6Z! vdQ^cޝ$ &5A[N)]=:Fg?JyI+3{viG:5v3!rA>k뵡\f؄P#.I0e="ưXf$MR8 dyJS-*3 Ļ͠4m0BYN$q\Y>w$u{} k\ MGэ=pAc)-+8eE#lDc䴀cJnn5˦G$@DL^Yq^El4(=1x4ndͲ#A8 n1Ԓ?1MT\.ܙu`^9Ml$}hHt/!I>vxYܜʼn-B)6'ZNM3i;3aw}^\Wt(;>G0c9i 6j "Z %`stJ38:6Q-le' QL iNCPԁ#>O,[ZaĮ5m-`ҁbJXJ-:X@>u?r5kֆ'H }hsQWc{:_<X:,h\v>IrPk k"{!#yAD8cdoh큚:\i:}T]"9;=лy0>BٳSkh@"A'S-mGPؚr(ghhsCk#i R[|*RDk/o ke[|Bw5q7p0έCG5I'i 7A/$3i^97MA~?؃Jp " [fCόZZQ!m#Di4:;MUbpS-ǵ:PxŪwo Ib `6*ګh$\/"NN|iku*AvϬcklu^Qɀ7}Ӂn̬礼4ܩmߥ\22Ju5 B\ᤢ QPPیW=V 5^YūT'qP O}V)PFCus%t$%\1Ad:P, NtҔyUURׂڊ9/:*iK0l.g:sA$D;My|MTZ!%9@8e4W*l cB q;Jу;00#io$GC3^zrU$2#Ⱥ?ahޗ.zKAfB_,BtD^k4ک&>=e^9DRai<<!Q VHa3a㽭;We*>MyR٭l3 z#jD֟4}|=2z)f) 'Bkqg,wZ0 AVZ\u3ذEt"kޛ6$J*RF7cz~ Poy.(`8Kz{Ħ,PBzJu6U7?MIըz U@P|yC]R zi~]lbŐ%f?C <9Zs@O{I 3.£A, BC߉5Q?fUEcuϗlq bY䌣N>;oQP,Ǜ} LBk e*|x&Izn9Z\rd?bgWgs9Xlt4FLujG[׸ AbjW ,c[z^ljNNޅKlm9TѥIؕHAU%6wa%^پ1HZYk_rf;ַu53}Qu9 S\ȴS *ѓS쇸iwRfRDjZZwtFȭ10Cp>oy ^4z[dk9:: i)$UtT>8-P=^ :t 21Z|E)-^s:+ O/''̰FBk'h IC BI*MzPB-՜xХm *k|&akXiK9Aa%ͫalbk;Z/@KXW]S5uہtl Zf8,Myoە6~ ;堃9q2>4/F]•eZTG:oo~Vnkn{z][٤a':3wRl<&KސC 72݊SjQK#u[?=pWz:#N*,/X⪖xPfBLwYW^-Ґ9 R-de$D07\YY־TѕW_̤߀hETPA/f1<&t *4'5K ۏLZY#/n a{uʴwBMu(lK( N9#KhqF,9`|xH.Qx8mrY%e1(7ʡ=Ioe^H4V1^ {rv@Z?bf2_.MC$(S'>>)aP"t~OF/KVy :j_]^+eT AR9J^%C-6T^+-upe2h6չF6#!Jo2: }Lk}Y)w s4QЭT2<*^6"/z _޸Ǟі}ah}z<w%N(]]`l6:ޜkB#|d ϙW&z=Kuv0w"uqZ@Gg~ČU֙]6scTr͈\bf6;d:Is ^gkï&=uMX2h{+(8K(ƺ;9igO4nȌbD V3c F`PǯbL@8J2n8pqeOq+&rߜ/r <_08O"&)9&\¯t+|s-O+pYL'GgzxO6^Vo0ɾY4|l # ȓB"5d$^Dv9ǯ<{db{.?xD8>-r!eˠ>Axl#)[RkxHk7JCTAv6 $":UHm^e󾞬)&$ 45}eLD}_IQǴOJnHfF`r􃨳EAv&܁U3^!k cΫ6BVb"9؆ži&DPK qN %q,42&vj[A;.!)+f/o 7 ;j/P7` 6ֶ9є X|XDCB}NOƒs^)|/VIZ"&Ӱ jhKF_j!Đ(I-6vt!w/S< O}p|b*Zb N*qj6-S~(GّXڔw~bEIxTpt4u!,, t LQ3vI;C+`"'0* N}nSbxf(Q/,U9ArcV/-4[bW1:jgE5( g.orTkaΛ\sI_le$Sx$pv6yKiHiκLn+]KvM7yT|hw|rl kB(z3{5Zu5D 2iq| y;DX}r|HTp7(cm{-w"yVvl$UMϾU߷\̳ZW>> pn+4HZjfkR19:?0Iyjfe{ ~E&W[G UsFzk8/" Nɐ$3fŎsu-RK)O$pMFP:?>!)eL>\ ?x)oR"0k2y d"ܡ|S ԡA݀q6=VߌDM~0P]7XH 2QLEa{X K' *Xrp#Pw1XE`5G]Զk-ÊN_n̘qA9 ܺ8xGY{ ⿤kCcOK~L'8µ&{haq6P*²Ě 5dZ?۝t'F0e&EYc[ܵX#i0TdGMK= {e=c׳!`m{uq  D&Fpy=֋{G`AzE1D*TFcL<yV~x2ن+f6N R_5AW'w,Lיz{M]Fo.L^ RJV 0lau ץ"e/bJ E͗ZiVH'bWե%5TjTn@J=*_Q̙oC{pIv%6 T{{- {Wo|#roPP =JD{K%FwZ~>-Ю֛ˤt KMz ;Ytޥ"HB\@=-;Usq+mB_,{G80( ulh $FLApk\=W_iADL9u?KsUb[Ɯ|8_\1>`D#ȏnM8*RǡxLd4rsÍub3$찜} `SwLL% SegӴd(_)ho +y<O{xԀR5\YKb êaYcXT|;]Bnox{Za օG7l\_83j<@VQ`l%Z;%s #@>g`0?ŭ[q^Yު&bbьkJ7f H^gkۢ+ OU#wϻRu} 7[9I F3ף OmKVyMR1߈Pbr\ 7sǴ?0Y3-%.5{sIul k`8Le+ɸtf|%; [v֫'? (=: |^s Nvƛy(ߊ0ti~ِ|;M~1>~%05+P^w<!ڀHѿf'EQ ՚{kW\nNI4ƛPRMIo-qkY&F:fL)/7w=fbC9~J;{8/.n|ws[X8+"p Y̊`4ѯO Qs(3˴oD1&&-Gh4yzp[ Ҍ$6ZNu΂zڥ׍lIiȁ') EO{(*f`$9 Yf`98#@L5@?rCU>X.fs]5;+\تfi!Q{z;~R3KƂE6Z%dEi|+F3 'Үߣu* 3ۻ@\[!‘U\ꖑ%:RH@YF@a:~u0-t3؀®C?܇W{tӚ'4(n5腌*pɵPjzt=:&"uw@fici 7R`Ģz"?;vpV2~<~lA2/['ϴ|ڮtG YO^u5\g`6PJH_dI瑩^/_:u݋hAG" @FGfFlaF=X|4mS+ҶǫΆ=-"SJL%,Cu =s+Eu~}N{ĽoC(/N{zDAe9jG8{ޱGgbnuR&j`f$H{}>Ea+Wqi"iMRʝrJQ<$ q.G\"D@Ysy 2Rv!̻Eg ĉO9 ,7S#@sp?ǟgO~9!h#s+>{Vo#?r'gO뭭a8qX!‚\c,e-Olw  B+) CJ@&1*8Fźtw`?MŞGrgMN61&g>M|.#^2#mBw㞬"uD!J8::6v_6L rdRpJ̛%+&k+!ffwx sd6ҥX%@H~w;tГ U7fGpoiwйB(l,lOњQ)gCPUy-Fr6;WzE$5YD6$f ǒ}#Hb  E$d(uNL堇*(]6>F!`3muHuJR(>ӯ?D9UYcwd) OjćAD`p`Hd*.}]& wz Pę.Z"_̵;n)m"FQi!kK\- w/*/VP:wsm^O'bkRkJ?a|pW^~/N8( =#"p N껄<*w7Yiwp %` @M4,ʺ䙐7= ~JSR'ho}W#< -JOd:? g:\Ԕ*$d>ÎYFɏZL_F;T?9) B6LprSzL:p=8c 0ivװF X#Oߛ!Fj*Ǭ؁ V܊@0@z"vǣ{Kі,!D˟()%hR=j0[D=\S-Dۛ>c`Ďҷw_@rb~]k:sfGFojY)P9mp]P*ɵ-d^Zg7-+f/ko[a F3LmPo|NFhnWL{wGe`p橈 +P͓'>crjByZ˧eJ=t_~Tו?Eq9VIA% ۘK m s%BT$cB8~>O|2\Jt֚k^sǘG{yR:F' O^JU 06\դ,_{D8䞠:,f,Pб;Ix ùtPf0ߨGIADEߕƦC*1 >I|7BPyTd:U|D f….tW MY:gy NJig @ 0L}:Rk.{.- DRB|HѦD9c\gU~\Gyö6&dPzGM n{ĉLd@6^X$$CA[@ 鬤pDBk~*6N/<d#d7^"v[͎';8e&\!Upc4vxXEz6*#KМ .xY0p*O$pX fMC]U.ð͉Zi Fc F#2-v\_e4ڵa'>rr"_Hn+qFC*Mv7蠳=+ptHInZo+JnyNo-T|fEt}]θF7`=wrWfܺd7g ?U<Хݯl KXy\ސ7{~Om<ں{V|MϾ>s;! Z''\ dKBP:{lMi &v<?c|~>%rF'\ - S=0Z`XǤDņ;t5B4p-,@GK6։&:Q$Qʻi<#W6`MD`_`l{E6մ hPç/ΩNn_,jX eO3!'nM3>iG6u!"U;+ŊS+Y5>+ 0"|io h3q R*Jm7:a?(Եӷnmd>-cRX1Zcn|ҐK8q|O=n& Sڒn'.شr=Na8!>tëL 1* m(JOA˸c/'4uj23I{[3ByB Bb&!rw"k8ciMn؅d wY#i*9o-xknK][z](8q2% 7CR,k_:xuC:)K#/^~):B4cnѭxx;w-/G$x g)7ͶhSFϫىrS*]9P܁"l‹;ho*;-k>t7-9,h}pwF:|(ʹGأCŽY!iG\r\PxDjdOOfoa>Emۜngi"S 8GGcNX:7,8b-+YNkP.RG$Y mD 5Zz/wZ 5&i3ѐc<^f^SZIX\H;;0y7l:!z71MnR\k*uۜC rS˽LZ9KqPnOjFtCc淋!܅W,@؞lXzRǿ>x\ p:c&RH{K7ޓ (E`7E6UQC= Άuɑȴ> l)wKWms!bMY0a$qY[^J:0&cT)1]=sR#LƋtOA)NN҉as1 ͎Q8@œ!MhgBDtۏ+ʭx}h eRݦvGb]#᤬9Gs9(E){ lʌ]=A#"l`f.U'e1wE05lV(Y }dU՘6!^TYj9R2~}6`sxcd}Dx,i 98=hM$ K{CO({EB U0ʖ";PƓF6%n@\z'᳧`"GY,n!MTiyMmΚH ĪPjfn!rRCv1YUSƫ|7X.4Zpь5\o4;;xL)g Ng/-*ڒQz)vj9m5 }Q GzHҕ^Tz8jn:y x1f%x8κ ii$Hroka=\j7`,vDΒI߮51杞&bmx[ /'FQ4MMn_B2T—}k=+QYzQGD6T:}2d[T%ԬT`[>^o'tCu j %YF"}Q#IK'FL1Eԯ <@VC}A;ݲ?m2ѬFc0Yxظ Qnu$MgH]!52imKŶ fS$w<4H5+y*kәP@ 4E4GaAᖼ.HK%ǫҢGt6NJ U<:r^lȑk%sQ9*.ZckJc#g 9bO]x/dlf{Í@C53y{odRj;~kڔl0jNޑx҈g!ÄV5rR\(4Xv9lFC y[^&by6Oe)Ű<[#wEHU>UI85 T7n,qpjBem f9qY(0aOjK֨Jb{QemfƒKm@4iؔΝltReKMF,eqkyx-[J$WIQNOZآ5"Hq]cedb_糎 qˀg'3wa ˷j~Nm9"PXpq.>Oc-|%R)snPA1G[L*wa4LL۟0+-1H0 `FhT*l*3Z%RAz&3vnjed-dZO%tE[l')sZKGKy^KaKvGb x C}N[ss&nN>^gLũ*KRۮ(! ZI18X9hD.?|^~n8;F(qT\3rC24Tb3[a6UPcY>a:\B>zt[xG׵RІ1+azNl@!e9&s '_҇SMո)ҧWpEXo eI+v a>Xnmi^7qC#ŚԸ3m+Ɗ Dnv,;w!"uzOP4iue`fGDSΩief*./mZ>|9 *$&&Tn c2 PdTڈ&iQsI>iBѭSr~Q/,?9>7ŸfPt)?.tRqf ƅ!ڛc(Rvpkչ`R:ȣxnfbn0F0 _ :yKI"pGTH YU.u cѪUkw'.2qa]6HO9NBEp=Y D/Aq\s1}>TY !; ()k8g< e0MWDiX22bd\[!)]Vc!"^RiArгQ#$yfԫ'aI~na ֲHɲMoEh?h9uJM}&&+I-$b9EiHWR1%=G(V&%=*ujUPJDJ*V-lVʒJAXؗ0Cgt'a50Vڪr!6nvNOZm,F0fHnC}Y,6EݐZmݚS>k&(8 ,cu"ZbH#f8SdHCmW,'~"vNp,?N85ŃvQPB)CxkF4?)鄼VA ~0[hpN" >(Zu8s?;S;] M"߹;¼Qk0-TTU8a?!3 GO/ U<lgV i*Uy֫`X,“BNJz@rt*{[zl1*&+b+nxK8+l>x6B1s:nҜRY]^>%B`R#_"X,=cU`JQkQ9X )%wqd^OpCV!ܟ<$-kEzu3D1RJΪڽNsߖO!(I5 ph<MUvk{BK:0B~^lߦ6õC[ne@45!SШddӾ,i3٤8C]Ő|P 庿NPUeO sd~KL\ X&~*fȲnU20|C8^I6ewekëYPnڋ s_b]C ~jHu:Xe (Tp>)CHZNJ* N`@,w# _Jϛ`?&Qn *`e*-Mz̠L@w 69&ď݀*m }6C#iWfr`\K'?@LT)nZ4R>fr2r( KS{9T[iD9M|z+ٻ܎yu*=ܴaҊ.*4GդtCl7l8 wG#ϩ\gToo(Eߣ-L1N7]&8a\@:$q-mecd&v=U+(L yAr 74(=E8Kbk1X%Gsf=@/ٰ8H*p:)FGB'0EGCU9L2e.,bv^NA$D 9;xz(P#{輾*ul(@8 q >̭^MKT" V._?S»mx$JTAaoG&C<0S+b/N V ma*.#yv{7wp!P,DD"V^3'?լZشfAaGf@o'j̵;9"ώgh"9]1^ i[xYxLOd3|ˏ`#T f;敉Dy2{$X ^Fg J+%RZlgCL:h|AyA--F9V3C!T.j=O(V:UsxXΧ)Xj8͇kRgt8I˥M|;ܙf^/6E, WQ%i pXao--BLf֙2PwS%pIX> 3]ţ.+T oRDQޤ2dX]Y,2&_PD]1C9*Mv ^∂crTB2Z% dMԹs5$׿`%ci=܇jXA&';#|wygcf},M t(❝cP,UeGn! IB-w .#I6BNvӂ };x2D2V Ϥ@-@$/?(W(&^YW, uzDYz!.;W T%@fAKȯXtX]:ج II2쒑f}YE3#ѯv>fdgXK.i:`zPo!>.4(b rC؈2ڄ۪j{$CB4zO6r8PƠ$_VKAwzh p5YALQeDlmT#hU "IcʚBeH8\p{mO !ׅ=+溕!7lv2F郅BD$REܺ<8W{_I6WtbdYL*Es*//4E='7Ĥ6:+%~dғ!VӬh^{T~놛-20CsQ]˘?ܰyp[R;n L< Ex93 eY:cMlZÌcObβC&{?9]b#@#WR Gg0eh8 >ZP=ѴQOh ѱo*-!s>`y#qz"N̜,D.NaֺKNisdw c_XvSI=9Iޫ?_LB6ANAz7 C0mP 2 Sc1c%{.s;?-\+uSg{]{m*Y\{Ruh]KdE'mvJ)Bɍg:Wtw_~CJt 빉Xw "T/Ջe7𚝀Rݛ_hO#z;ųO% [Oo<-~;2' z N<ԪirRy6?YaB4HG&t;C2CmY nJQw2:~yhM[_~ŭ p77Oiޟ̎4F,'ARw?l!ս8i]G||$8yS/3nQH4to[[nEm"j6m=UݻcK C۪8oJΜwCk-<[k 1MnK(Dlv( EI}͉#z6F?vhZ&ҎUZgi:Ty[-bkmgƧK]w%[]ĨxƔu (СYgd:_Hzm?l^ԮCMOE&}u`P&yMv/v,S:g%R =fD'7_vZٱ;Ve  d4u_t8 ~n] >^T@ ft<#8N;\+~ZN,kWMK; _twboMcg,:Z*DugIeۧȔo҃I@B1=]˪ >qq-JNp3 ˚n|m 6l8lPQ)Ex]{h֧=Z̳kz]s 5FAFP*,r*|"{ím}&L`H\0m LvhWcƣiCBXĘ~y_YWG4,QB]UP87k:Bunx!ŅrQuK\jmcwg +ÕēA~SRJ5׿F&~ U˘geWXNE~$K~w TᔖDO}★%\^`B2sVbzb;mN.:)\bR$m'҇@qV,e[eùT0#gsNY' (;C[0 sGR)P/BMk>vg41ٓ5T]utT(%f[ 8 c0_οSZo^igNzDŽqX6U0!Tm\_TU8$uywYc&j[K)c`j-'a_Ϭ1ĀȇF .Zn ~ujeZgHL&)gƢ\G{Bnhi vcQ"UTT{Gvx--N(̅ӑ??sJݿ~g ]%&hΡxrwRsOҬ7Y)ȩ e ~V#wᩲ`VKbӂިj\M$i4uvY`!4rZ~ IU t$_L"^uBoRcs$+pQD]|)l:" 29͏ʔML$kvHGBvh;N5ǻY7\sd8oݯ - #U2D 'v"* Å7^qߴÀ7z;Io6?.cRp#}'!8XA >?27xdK\M=x?Zђ;al,Sݶ KJ-Šac%rq_;^dm)H,%ġeEDZk$R7S/N|ן 5cRة$lKp $yubR"i?M)R+~.ejiDmLJ1 ml҄\-z&Ҭݯc;}덱:XAչv v)#0$^GbNSݯuq7޻w9&W"_Yѝ\cD @; uٷwB675}9ȝT~?~|,l>} Fem1vpT_esxbeǴ@_enywdyϩo{w,W:!^"xDuE"ǶzŝOv(iX6KxؤKƲ]L /qcZ(޳+A oґ6j$3y8#@֧dK.h]Jr ^*VH:Ro|[]HH7Z?-:kr;7c(մUmgz*.zOqj05`^YM7>q  DfM#aNJ?BC{'9%(ǣ̿@d,vB`K#?\ zbw6pw77nnh铻?z)uKG=^^Y<]Dz:w 맢lY>a'\^%|%\bxBl p͏ۧm0{zfoZB~xH3jrRa#&nq D'"PEFW>#{bNX7pj@dG e?~7ie2o_.CXS:cfd7ΝR9Zpޟ,| BYZ * t}gWVeSB7 }lqw:Clc2%PlkEQR5BR2i܎,_+# s L7͒ϰc͕Z*yؘY:f ]T *?/mZmˏ!FiLP,:̱ VKeaКO8CHZ4j%vm *}RGԐnd 'νf9dil+:VC3)uںQ[)I #3 mECGQvM 曈)fӽi7t w ir2-J9 ),esY -̯o dϒ\3Xժo;͵xmajSo~*\(A[e.BF=|(4ĂSeZ!US#qݲ ΂Ҳړeac N46Y8xUdƔ:Me.[@LyR>,,ExEL|3JOcY-=ldLO;h/rbs,]׹}gd|'1h^P-EFZBQvlm #s>1o/S@oUel(;v! e]kv,}q[* #Gkx1fm c}Y\hǺ| +Gk%(YN@s$@n A;a܁n#AuI>bIu7HWS/G?tfMhWlOmr_=pi +'i'tN|e%].z~xgӉs!x:9.*tN={Q%0 XF>TS7"V[:o]s^ŝ?:&?>z쩀! JX9P_-ugdW~,PH SHF]Tg'0.X%K亵Rݿ]a/ؤdw_76\QǗfoL+R,|ko!>y!l] D{Jkh&yMK?,p/p%aRAl>rN(Pɑ2*.Ѿ(+h9\@>Rrh`,>`%uZїOW[_D_J=;|Ft g~AV>/b>B"Փ<)x-{ uWտ~6RWը[A[Aatb:ܐ)rj"xXOc{ӱywQu":̮L"D.oH&n+|ub<钖!2G8`qy{!1Lf$x7#̶_݉A.zt?ύMVupg 3]`˩Cl/ܳcA7 ._<:=A,'ؽIEL*_T ؊VO`:̋h(.z ʷPli@4tq_(0'\ei,zG#ҟYIj80+.5tV+;D /ǤwBtq$8dv,qsvR;)\@zEE\\.\`a@VALXQF*fQ0U$ތpʄUBp.çRxjVjm *tߴbIW<]-/Vds>?"z8fȁ- Uݴ :S+dGg; z0w^SnfN̦܂Hʤș,z7ɦBzXU_SfNx֗y[(׮!e ꉵKmJ띟ZsU|p7Lџ5d`꾛l\zrw`o?||iu_FGV<ʘQ :^w^}3j%O Rhrۡ Pj((\vTp@"o1|^Pl=KJv܀YYѹ޲ZmZ_HЅ\pWSd`}0Q}:,>J;|uڨ,4"KQ:?*|D lϜ85nk5<}qƷ¶]F%fVgm0F&|G RAyia]k5eÌ̤惴D)Z<Ā!ra[^dϾ;= ( kMT}V)k63 ~<(K[ǔ5kUꅟ-wX 7ĬD]CÎ PUk%!d;yg'Qsc#mA~K3سW1ށ&ċ36 RvЀ-ɣNsӽ'GFw綌HfFTc=o^ܼ؝]kROlcn>7(w6yeuJH΍:<eRd;d lO5Vޔ" r=2&l= ƣ+α+oXL)oߺ- ˭"яK fG)׎" Ԋ:+(qOEӅ2rIh˘,habS3 !8y/:WΌ&oć+u}_%@lWD!Q6<4Kl {# >my::̼ăe2`;8b4G3OB t._mwNŽǀ_RG?eND>G @V.O~x݁pCފ9~c4qG}*L,AÑTcqi],lyBU6G'w<~qBy=t(deDd]U[NBC#Q*RV/sl*qZ.Y 94a_o{q-+iy9*q K{zG:qsz0. 0hCEsjQI>cd5H_V4voḰT9#[즄 Z:e"oWVolٴs-Kh[T'lgcц'Kioe^ EQ )P9qUz$uj{}z]OB[_闷,ޗ;n1@T3XPfF4EfqO*zW\5iGTX:ЋPubict>3D)2BInbLh }]~cMzmN xٱK Nz¼)}xs\tsW`he}d@SbKUqb}W1AY׾w|u 9(j amP.^@=X]hHUA%BAʉݝrd*#$c7*S )Q{Ԋ1"2RQWG_ h/jQXk_[`\Ҩ0>qٲ] va1VP(5_3yn,Y`rNڟJ<:5V! Do` ^|wUG([e?xG&Kx AꈢBL"`v- qvx7`8'v]bbq`ˏO @RL㝲\j"> *D&AC~o38oR\\WiZcU6t:m9{pS . qH-j+9T[ zjFr{g+"j Ƕ+M`tbmq:Ng _RR~†p,.`".VL쒓eund;N8 M'7/ꄉ\em%hƱodZW|M{7_΂}^4bL owݚKlUOu1s&0*P{ͅ>nKb8fa:뗶I1tRqOU ܮp?N?Fq tFcԣ$ eo1a$GADodFTF߷'Ze6Da>!ek7Z\P|gY߭J#wQE+gwymA{na)@ѧdg6j*k`ʁwr ,ȸ$Ov3~o/.+)SdW"rJj"uMReKh/6 *⽅=N3$Zq] rZ?Yg`M(M|6FW%T3TB'\ $[tSlL|+hcNFxhHo{2cx6q#" :p< ĀV6jk^>M4(Z9 όNfJk߁ B+VRX0 xƷSQE%s¡fF} *,VM6+E;DW[QZى'`pZv1l W]t[c5Py\ [pj );  زW̸6v#S;SX lՁD%A'XKzm~57)Τ/^?@Ttmlsx&W@Npu>|~ bKKXT{.i+mcق#\ye ,q*[|d>GQlflnF=_? 7t|Wao%e64,`s\dlɶm tŢcoioGY} yJ ׸η_ "%;>d)Z>z0/8&ضYj0H]UCJ/">#2Gvn *rljLJe3;qDzopW@BʎnWʠIRǓarGϱȝJɆZP]) t4G;̠rO:Q$˘TMl>݅M(.=dui KK[Ht@=>x pLq+}0\Y횫>9Cڝa5xq!\@})9X N[G9ps' y1M ɮr刿D hb5a4KIoi3~2!T>꿋7xIlV:N,ϟM麄Z Z9(CN:hKDD.){Zo Qs(~ȃF=m}tg^ R?SYlU'߆' $ΛmPn:ITt;px:5*ma;GAVdl{\)B]jըox=[ho#G;5}pQξZ6V,;`ݏh0DR 9`Xxs]=>5sԵIFVݩ>NYRa?F@~9V+)󫬨;A@(ȏ#wA-Y08X,9,cFr񶅸W[\{TUAԹ0[^_ }6魜zqoAf(2Jt!'C!1BxD+?c׵D8k7?ꕠ)LJǿlObSQM}-.Ww۫iy=2By,'")6.%>f)$ϡ-!̏ r2b r2P].Ŗ iWk+v B Cf mxofijH;jlO Ь C;Q:QJP1&n, b,ƂՀ\yCj1k1הc̐nJ8"-mO<'{Ji`s?/\㘂7vb;r;"HgKSW6k|si?lTرV*WU)vՠ_ƃ!< b=MRSn|bZ )|{{pd&Jyf>B A=RA1t BrŲ!vղ=ݷ)dp\ qgI)Sz\= gJn1p) P&-+i*I7x½^2L4ɚ8}S x`}7Ed0A`+?!A.r,K9ՒV.vX)CN$áxQڛ[w A(#RJMlvco5&׭b Ս{ux%RTՆ`xF@ 婅S oˈ3C,)XW$];S}k'-G.*t񚍆f~f͒QPc˄2 F+-荽C7›S o&Rqe.^Gu]fY 5h`v@^֘ԍXGP: qA?)cNE GQ ׆V aae^rCj۰[yjqB$2Km%}KfRɾmmԥ+fD{ϥۓ eWN&eRQ gQLQ%'M59:O?gbrg}`4L*k;L_q|f߂=jI`v$nlbi_No,>$ȃCK#LZ3%8R ->9]#ެ}x+Cbv&bܑSaD\}=cr,vfo8!tIH׷7"mWj,12;1 %o)7bII{NMUu{wAQIv!FS:')[c+tBͶLweGDdfU-ɒ}t1aؠ#wA[<*;|tTG iT,T=FN#V"+~K'ˌ9\$0yXG>&FXmtT(0us،Wb$T7#wh mF8(~2\u.XtN6͡_D<ڭ?-GDaR,D m K2&&Ӌ[@t 5h*ӊ囔 f(/e 2nw2<&kA9t*~߼ ~7:sP>i uSI`O7^6 |8ȍ!嘂Qkwj',^5c7^9nRvw¡>U͋%&x &XKx?5lMՕ]??* W/~Z-k'Y$Xq ¶PBD^i6|(hT Cbf;4kn+╍hsfLIY-^ < +#3|*;."TW:qPC50ۮ#ϖ}M[e#_g\Q +g~ B,?9t+JcaϗѦ2G,?MG;~y1%65F+G)W2+񐆽V;L+ߕCf6%S\R$N="d?)ϙpN FӏN>Õf4CQ;KF=╙O+M.N/iNYQ=Kf`XY LmQWӿi=B؍a @N2 q+OYhH˯=>%}g@l-P@`<׿U?cVȣe(!.\`꧃pt>FAҖ[u,L P RFUg_=}'{᭭MB`po}|6*`'>Womm}<+ <>dg}o%fC.>ֲ>{|yXQsRψ&[ifyybdۯ>67~>nb]yqwq{=/[K.`_.;(hn?}WWۂwnmz2||諭ەon^_7y>?nȔmW~OmMNrI/ͮ<¸~WGNK3r+m%lB3`΁5՘M#]a]޹'`ei?$^lwqK{"ǽTԵ@OfXKuweP˿C[Y+F}]ʠuTX8;YQ/YR[JO]]Пw4'>-{s l>6|mh^RBu{ٿ +ia!")njoÄfY?tr߾HoggY[~φ#/{~czެ~68V9?~O^||5q\nx Cɉ<-7HrwBr/R.ۜ%; niaV6GAg lx7 B)QbU ^P|Db")l#A?fR5^f8]_V_ymڅi ȓL.1̷[z8rל o\XWfrKO'5| "n;~k""zDU]AgeeoNC>`&}P`2#0G׮#u2" _7_ %4ϴlT.\:oZ t).c\dOQ'bHmf7ф2װHw͒1m3e.W+(>c ;aᭁ5tHG "Xj 0,>m@A6-6-[wP&F\AKB^zyd"9IVGȝؖѴ-Sc@3}=#_Ob!~[Kͪr%TP*o}e`\![}n2MC'3d!W..DeHS©ԒI;cF>6FX%"b5=oe3oz3 )=y a  MW\0H.:ޡ6&o]~Ӻ)4_0Rψ+\ ixy=:HD;íxnD}ETn#(z `@L|R? Z%k d*<]x-MP-vڛ̦? 2m_|dVKJwC4)Ng0N6WɎ$ҙ==>yy<{|bja$鑟w@rn…#/<~I]+?QX%d_|DnRW1HV_lkbs˱Wej@"Yy8UT&.OIHxSaYEډ2j ΕerH/Wųy)XTҡb-c ,:n j}fI (;Ӱe!x[by)):1GJdը䄥)Z9Jr-f@b\qtSg>qw]T QFF jE[5^U9ei:&pr{L̸;5ߖ"80/` A?(@Q}T6?yp!'?*ըڑ Nr>-7$0q%mw;mf?[R+OVp oSI]Gk7 gix1)6V,< +2O.ԽfHɯה,>ZTق/d7]ƳI# ݮh%| } 5wOriiۺ_S"D%8-ޥUZgSnw^mvaBt[nuv12Y?fgaP.xB\2Xee"UUdni`Oaxf=XkJa$6t3rQ29XPһ}cKiݏ]a߾xvk |$,5A7o/-66~7|?fv"#]3z66WTMciRCPzAN*Ԓ1JoB:v' a\jhJol6RYzOrVhhD(I!޷:)#D}|7м:2g_٦v_cm vg)f4gIYRGg~8Yx*C34D4{s]]TgĖEHk$؍p0i SV ăaCmn6#TSnz:!L>8iK O5+\و^h;cYc^/oW=k x EbokϨXs#-jMʗ0ܚH}xJI}p׃I!!KdvR)`ӓ'6VC8}0쪙@ˠEbM,.O7`yCŃE!/;\vB-V!v g }gwr.Ts!#XE^0w,6gJma| 2X<֥JepKqrlW>Skq+\#ϺgO|_7C'}h:9y1⺸ًNL̿/7ܭ2!Yt0pqiCeM %&JGϷrǣ3|wA6O?pe<$ -&̡lK D$V,E0Ѭ {`-pg4ww8;to>c8U:j:4;:'DR=>wI`W_e4]A&okYSGsn9Jت2)+U߄t0>ыnwȯö<0/oBWٱ+VMҹzV߰?Xب(Y|SGk_lUU_ PP+=C[< ?} ٣a$N ^nq>_q9q2{`%<˨` tPq8MɿؠfA#~qRzl#'lv`ѧMwFzۄ__E)IZ[$%4 jS e >V֝~ nT>_u`ıǕa [>;D mN[9jG: ]$Qo{7մHUX~C#E\RcV+wW WfFOG:{kS3{ܔRo\Xq,][LL >\vo{&Bj'LHտ1io( HNPٞmE Ac 0b!IAQ9`x21?B&pVyTz#9%OoQ<ͮşќa-~y?{@#춡,?u( f>%JB#;RNF٘>q͈ᗍ$PuUխL;Z]fQ /WgHI'n2K/ʍZŏJSW0Ic(ʼ%L?i3տڦtqPBjpj҇M¾Rk>} gyMry٢v*K|%!E{\!^~ *efZT~3o|ClkszڟXz^2wY=>{O.}t1ˢ8 vJ% iM].0N<5]gmVcA 9Cdlc!"ݙ=i@̫33En+ŧƁzu:]GFqrWDH7B t\.(ơP3GuڝɚAaubV>2pJw:ܝKwcU`V'\v&o2c719x ZAFiAt+n8M=s-I‚0]rmuQ,2kTȐ&y.ѰحLI7ODq6JO$.fK¢EI˅+YÊ];@6''4HJUq7^oXk{l$_ ҄` 00Cu`8/0V'ȴPtClGdMA~JK=ku01hQԚ aOmw?.ĉW 4 ݤK8"M>Cꖏg*C*n/8h)dZΩ۹.пdf Ch,I(ۛBR219^:_v 41-h~E){8`f "->Ǫe+9Rr=d{35+3`P&/PoEUբLA= C-#LQ:L@7nk8B^AyJT `ȵY4A׸h)6fKрrx>b7p쎞k^~4kq?>xRҀKArl?@D۟@SU}2+gw*)&(|cOjqXOJʖRJIZEi&|Hq5=ff6!̗Q\hwArbΝD੥ϗpR)zڠZ^`};OMP m;ygQ~6$%;X9?T5I^xlg ꒘*z ׉Bd]vi_JSĖ}ry\,Tb4g&c 2k<5| (YM $LtgUl茇dQz8wW_a\&kڃ(!IMv'$ۣa=$9g N[hS{#?ʦW|:MHu,T|7b<q\*Nb(w*ZnUM+DsQ4\f'tHT̢fo^ t2!!u}pԩDqٝVHQQ x,vu냺бGl9IN PE*@kI RG| ܐl))"rX*7ένmw{x!Bm˾5^t:a,camsp=֤,| 6a1"qY͔ƲlʔĮLםv7vs[s3UD&K>X߷c'E}0OPCK mH0_Qkphot1NyTwGԗV8b5v69%6팾6 {1*|-+) )=bXY>j/j1QIsfFFM mKXl $0Ms^~#g"gE .kyF,3I&Ҁf^~'>rB4ml>ؗ^VZd\P ՅB05r< ˴t.zX"`Lo􋞛A u%+=/]$Šo@T,UDV߲4CM7 ~Dux5$fFh*A܅K1Xˏp<[wl_\(,VUa6{[G޷";O>Fdqe3f^xs痯mOfNKP~Ty%I[W%)PRA1=!ه5\Q- vI-DB`F*^.A[WyLYZC@5Z ?$G#!_Ijd㕅ޥs)Qt̋)J>[E BO7R`UpeokݞhHL|i܈+'dyqLP9$k1Yqٰ Ś kP,25X PfjasVv.ab.[Lڬ,ɱce*'}yobk m,\]2j4w0^>P[pZ0F3T\pSQQ "gxg>'C53X_o98PorU îd=w _J .J|Ĵس\Z?i~Ij##X5V9ġD%%ސp̤L2z,ONT*I8X\d*pK zA_l8/ GGr(V [b*KҬ%R]RZ˗80lև|1?ݣ}0}|%1ǟ?/[vImaN&v-tԟ&6&`\LY6r==ɃtsHXX^*KUUe P|\3L]WUn?[O0sG9)f3 Ŋ_ek71n67"J)sESͯbYh10rm[Ҕ]w-b%+p[h,"f7g-`\AB2@M&&$13[2ઙS0_o0nT+Wnrh kGzX tSSef/"92b&2#e닸jM(P6"m`Ksns@5_3vl'^2u++Ac?l9$U ?^:@'(+f2%@w>)EQ^. iF?>VNfB9ZIv&#O%x=pJk͒  X*bdC^ӏ3THzeKϑ/SguJIZ0r1ccV;˜S"|"CݔLqML[[x81qW 5}/vli"ٯXl@\ Kbc"z l.Y̍PRK3<ˁ( cD:05à/~Wע;,#y!,R̕$I="&VLsJ8׬~wg`+\f-Џst=]ʺinr+dmJ"stk;GVDfW٤a{CCۙ4f,m ",:=ҧv>$#ݺ\@BA1{68v{ 0> hf1hKo?9Q"/?1}BsG䵧~~ܞYJ7,gZ_bHC½7.o"Ϝ[pco\t{ϋ|.nB`Q^~Ʈ"WOܸd|ݦ&QcJ˜﯌AkM_0\0]qZ- 4%rk̯We {  Wx1Cp}\6\:v@]dܸ丸݀/ !S󟎣募<*DJ9fWV(uSY?_ق{ub^01SW .OF`<#ZC, ZHM}xbc(ٱ\ N{5GuF&a)Rz 8XO ~n"HJiJS,+lo]Q .abvjTxos*m]*SP|1j>ޕQ# |`  GSNQPr}xw-M8D~dANS4Qތe Z$)uOՓwT4R)AXG[Hɻ#i We!CҀXڣwGӦE|9͘4FҘ?|?c2kk5R9PDbm?g:_S|O ur@qf^.}[c$J'e%Ku7 VѼgY\QLQ {.IF廬., T7I"@[ =ZVu`}kYKH\Kp'< %oW`:2,cѰbF8<Q\ֿ; >0F i[5c+^xS?ݥ[mgE|B!1wo!cm`'[yDž ]Gȋf%YSUCÀ.٣ 2hYۂ gd?_PMuLL X nKmL t.JF&'̶#.2d$CW'a1|{ +>2(ԇaB<^y`Tie%oldP3ȣ& ;=8>Dgf^>`x7}ӳlBS?* OʊFܕn%\&b.bdžg(l NvNlD[-eݐ1`XK17O cuuG)1ěFWjk]da3s̰m_jNF% ]D#\5 }6sRZ!KLxc {r2y%up'Oͦ;vjr%mwczH=!˺y:sR}}[|]1'y |),}PS+께|I[ ;oiQ"2.inMP۟{ja=2$n!">녹:D Y\ 01 h5}2=VLHߓ7r>Pwg<,`]Z~?9 /kvK@QNIl{ oa bt$7ȑ%w(5e~_s . F?jK M@)vS1b$Z:0+K0 z²ګ6'J vZ` a-7O?aD9e)駋hؽ~CKIi aZ 8o KEDH0p|āopţ 6. %dO?ϛK촸0(bյwۛ  E]$'S>㞝3ʫA0G[l\.B׸Zn5NC)g( OAd%-g+em|"%~ೆ6VບN -gݖzM&\rºV҉s˯?ok =3&]{B*YTfڦVjfsKwE^nbͨzJHEM[1~gBfrzɢai kMXdz }߀AXc.8BԸnv?NvtŅCMюnEdYDi]6~1?k[/?G"B010(/b\+5Ni쮎^ )թ ۍ/~ǭ^|c;^Hx(&bp?A0{E ~ ΌtbBPX3jq۳S3tg[BGH]>zj |TB %>nJئF6 Ѱ;a>|cd7z9ScuT6aAt>\ DΎ{ '1:Vuӄ@*o,\OYZM+ =+҅6?`@ i۠jl*JD}c%$e7_.ko|1Bi` ddžU 6\^XQ/c,peXAf :ŝ06Zד>i\BAF=g`5PrMحA2RkOfK=Js{*bͮ/,ͪbs;m)?QQa,|}/9(VA9?`LfsԤPQ w0'*H~l^l^ƨhnf@3W{,M}mP?!7Ʈc:\ r 3rI/_AWDU#ґ@؊I :\%<( Q5G_$%B ١h_[LFvT/XvI OOv ,Bm̲P1$1ɞ@gղ҆EضF.i0^.&~׽_f{A*()NHɤ0 棿D𳵺k蓤^ז"ln[LsчKJ9$ qu;K9+HY}JzYpN!2`rY༿R/=2jΦZ*R ^v[nzJVZ%d 9r իbSoBt:yJ#u ).;. }/"' L5{MTdq w٘gS.n5Z54y٤%isvCr6QYcCoQC.aûZZ]1YT 1#sϦ" Sճi2Fl:# vL()ɫke4AW B'zhNAfL|(=c1…GIX0R(K#r{j虝P9|Qd1nlQ4)L2;GPEh@NctKNo7r9yB_Fz} ,"ԟ']v|y*>F-Z<'GI?R^>.&.7kCܗZ^UEZHY`:VH5lCN3,NrGW0YaM#EKCy)rJ}{tƱ.ĢJc$Í5B?u+kG{|\hY T2YIZ̬ m)*U\o:p ,j4li\hQnNQ66^Pyck=48v?wCWNXs.hBR4M";ͤ)!ٵ@̚YD9ꕫ&H=Aǁ8C2HMEK}>!5ff@Fm`y.Eݦ-8'֣OP%_CDROn*UnGR\YIy-~5V-=?9F[SuUhFR&QOD$YUh++VRF&h}pڒ..^]`Z.)rJζk7`Q%},T66 55?4 ֐Rj:9#-HdY#ZpI/ns d{߶|q8#[2"H;$vlCUlSpQ YLP`= \IAfкa Nދc|plOsuj?%MzA.OJss arˈo~e@WrjANHZüQ=˛ޥ_hYY㖌|VjU8Gl\ 6ȹSIڋfWK{{][qv9z'DrKg6ߙ?ݹ9hwzν\ӗ)?+T)+vZE#B*&\ X!@]]hڶg0 vՈ-%0;ErG2w5v]j `nJ[y^(J8:݌?89詼`Lgk[`pd껚8ZM~Q%!;!W./ޡpVpT8Yi~ $ >x Oۑƪn3< ZΔ^Tv!g^5$kG O ЋvGa!`7% λ3] -neNch + .Jlo":#J`솕_fsw"k~(1R --^>!SՕ2|.szY3e 'Hٟ̐^"$g;kܼA io;vHIA?e.eML],l㯲"ChqF\3rCd0[abɳf%TZ14Ic, (:Yow &^l9.͖Ѓ-aD?H AMl4f]Sҿ"(ڙq.,wt hg-Z!l?[Q:ѳLh,=y /%Cd"&k&IxR_J*#aW/O-!_cd6~_pC`q4 .{;k$P ~WrZ͞!nX u⦫76V)(纒̠d eA?s<%߷>.)di4l;qS~L~)vE1.eS%~]c~JK29}a*gI*S٦Z&Mkf%&t 'Oފ%ߜ%)WyweI mn,J*ŀ##C[)S0o.wcu+t: Ie8UOHz͹H؂'OXs-"BV&Ne19@ ?=\Iн.NՕҥ3Ó`feb,MԤ`:3=PY~Eb#NHU)vί9.Cz?׹#^UXZY!c-"j.H٪Ya 5 0D\1ճȧ)&SI\mVhvV!43ZGu<%${J 9l '<{lBʌa7hP4ΡD'SS]P)$z}Kql#tU ӈyE@e^R*r U$o6Y%3J=/3s35%`2%mتbNd`krlsp +\&Tu뷮pZYImowYvK&M ~mS ؙ͸`n:v*?V 3W Y_(g iN[GAhT`lyyyN"h22,>mĠ^&G-bp>Nr8D2T98g ñI6*%;tJNp?>' WagM863[rv?d0k= r^;Ќ$ 4Rs奐䃬qZ[fڇmkr]gk}9~>n[x5z}ҶVM TXU WmxG22&y*w "@ e}*pKMo@ Luv͖h_VԈ*dwm_5?ԕ>]:wfPDY:?a>OI6e(_UVͤ>z_M,zP(~Qvon4nڻ>CE|"hC&CfC~-A7`ZdV U#UygR1KD)~Z^KA׊IXPCߨOO >[ ɌU:ޠe+#˛4)9Qt4;75MaqK]7j"%);ju41-%u?J}V;;{1dՋ pvWQ8㶚U񪲬7 j?ՇjrcPz?z+bCwphk8FbM _GYP6SNSm˯b:4KNFWX~_mˈs-bMdJ 3ߗί̋/~pm!@eor:`si@)4t}C635 yֱK#\r?fT:Us67ɽ7ZO)`~,!>OF,fڜM_fM^/ @@VDFsbq#c7\ ]`~EAH T@M6@)j`hWb0TRé1>6d<+rֱU0[n[E5# 5A;Ш a{Sx{0N,EPI;)eж{k]֏Ɗ|Ţ?=f$Τ'Zng2 *(Z JL.7mZc,CN1/le'R \{-6FezQjEM2'=)U<3pA )l$K_d*mӣQFS{@fpFdukBs#65O5Xϧ ŋɤDA "҄$P߃Ȁ&|v ;G;}2:9eB=!lw5Ѫ,Byݘ=G5}vٺ9NW$':WLF4c"uv&Y * rC4 s/Qx:YqF=&qs{ EZR%jޮ mn0,HIMlMjpW8 L+2;!Aϣm_Pϓhi,}׭&i4)$ Lip`C5m"p.RПbHG7rZו̥6# k׻%-gyLZTmNǶgeSN-wU,H8Z!Z"}!VV&[Wķ'rT B@4`x }lE\mX?<6;?2H%&f3<fS]i ɂWYӴ)i8mUXq _6p`j[,%vۋIIY5t0IuLW8age%&?.8°N۳,WQ]ϵya() :p|Jz@ gx2Ullf#PQ5y$I~Q#c{Lq*.R<j8@qGnXLe/tr~) $=mPM51U[ގWZuR,^js[Rs*\룑noKXaW8:UQAX-.4, ֠ĶH({";DXn t=^;4KiZ*zZe7f Z8uC3M@3(ex]Љհ =(Dyw;Vܝ<3VRa6]dM8*>u 9$% ( #`ߞ*NgћVKCrUes}yG\kqZ<~'gq7_+已Ġo…vWrJ雘|pg{Gd T\LtU_#_EunT,,6p̥B ކo-r4XxkĊ I]ۖJ Hpۺ6V{\N&2 sFBKY-GC&qR^[*+m"pknʦz&| P6 R -v&;͗ZMcowȭ'ܘ ҿDxfLt`S#N>mkcC2z-&?km+/+;qRRhYLs1ѭ1Ǭ̸J-m+ٓշJ"x jX^Z{j )K%R+U天&Iɂp |yFSJH, +dB>Ua/:杹GN_Iꆹʦ3ΜaPS#jA+ד>͵fI=DFGkְX!"QW&Ε&VVNg0&]s(XLlY -+*o\WX5E 28&V+͎3g ~!A'hfHsb Tn.TfĐeϭBLHt>xyWJP$zD=րPe2h]z)Pui 6SkwYPjMgQ'3 &r^Q^C>3)*\k` z%>SU@K&k&$/w#4{&HݮV@P(O'Ch?*g@E kD5̵j 2;Ml2C |RNƫ Ȭ|u+^W8Zt͒C$ֵ%1ZTh]L(;W7j$ı@[ sa9K8ٔeBI2,e-&Ry)`L}Wooް]4 'p$bцyJHSwƞDc;!&g'5{u4щEE}m\u4 l`'55Y7mI 5c?=YZ6 +1tWHOЌɝ&lCr c5t|gdrDyf̦V_ƴ=u^$_ N鎫8%RɌh`S (~FqWTi%V6Ia@DEbj)=)X #?,Fyn!-73ĭF:Nf,JclDhM%Of>,:z`B]!PMiV6:Rc(`4*[?.&m-]Ms%WF5{8ˏc%Ypn)cy΍B_TbW>Q-ɽc2 T, +~uװi_sf}7uX58oӃݭlrTl0y]c۶`L:?= /!~xFu:'æP c㍈)|2OW+"F&9)r71Rbot6S-d+"=3,%QmW%C1܈Ǟa R8")w.c3?_6iV" Ӑ~+l̘O5bOә5ic!Y415&3+b{t'lޝD2HpA3Z:U'I "+_eC{v7 tW'j&dG*Qڣoc^b MY]d G6>z15B,0-dIHFųN| C*1H|P$ɮX%:|a@ꆔ{RC@'QH.y{‘%<yarQORұpe౉1pyiYSLد]cPq%(t(+=D9U\DԂc*ӯUBq@a%.8L,>xHOiR[ބ$@<1 CgWpBqR `B>7:s!BҝW;W,3D]c/G,b,.P^s)n/3Ά9M[>7#Ei$H X%vZ>sHU"[Xˆqb+͓?% =EOH cK:>rfPЙ?&f# ^!PLBHmf6{Dɛc8ޤ"|v_Eq#_Ciz)ɶ?zz!!+/LxxHLp+EinePBo?F&!{;@/% Aý77- &:>T [i:2 #Ne 0v˵u4~t>=N v[nqxL#2[VinL -ڇ>KPOEJkXdC$*%)B+ݶ,H42Ϭ@Z$t=/saa4'7-m+ Y\miՇ.͆|JyƝlI;"#k? @9.~?ƹ`=TxOwq.TNȐa~LqnX_wdǮ\7MWD0YvqBD]'yX81VN!R;=H]fi1yJ)SZDdzȚE4ճp* r耶ZH׶AlreA'X(.w@~XM=L_H=H蟜h`Oji -yRu G:٭F\98lCC !N;7<ah.T e-0lr7e$c&TM#JdI^NOt:>sM!)Dڵ_hH '6#gpYLTsqp \ә/~B\(,#f|q=<(l\8d8 ELIFk3"rٜIJ%iuw))[fqmgGoqF'֨]]8 }QlMd ϵf57™{`c_9%W5Nhn]qSrء+Y{udr@tq_q8w@Uu,$I.۹/_gDhk2?)܄Aa9N 4(t'fJ->2x6ثqY1_ n5|ui<9P|Nφĩ\ okwu8ߣYI-'|a+Wb&8H&BSNPy 4\,fL=H^SuYzNY6F0_tCS6zZbڣ:_Lʒ,`I}%g@!pQr^L]-&CF_X ى6QYaIW_社901+f?ǀarȀXC|rRKكxl#2w 1P=ɘ}1U$mT}@I}^G$?"U[ѓakuŪ*ŜD*[c"\/q~UTǣ-d6KKQ[Z-ӗXP޵*1m=h9&1z9ו*K;..t2|c"%9*UC$&p?,ᤱ *I }?鬮7鋻s˜oFGŠ͚A2 `X<,Ck%Wc:DMk|w. 7HZe@8&{r;2ڴZgłC{-7/lnݕXbM[qɖ;^=}3-sc4 )m<=Ķe@Y"/rexM㇄4à%-(KX6MoLIF w67MN,'7H<UzUڍ*C;"ҟOoJ%W҅r6+^Qq*"?ŧPU{q9l+<"֛?unAǫ+ȕN}\=: Fu })%FSXňx)& d^!s_adPKOzYѺNTks Q­Eʔ[2:,7vK|RW?D6tP$Li .mfj@!\R4r(,Mv!4AKEdm<w2Hó`T;I",c@;fB?/T.՜XϻTߍ>o AJKYήZ/tvH/jeqW!5?2FL gbQ(v:Y@)ed0pcphl$A0<7հbg%B7U3Z_h@҉YԞU1T27RJ{>A6@Ƌ.>OnaB[w gNo\'`GO=R2Kx?3HMoFv;bD(*AP΢z7er胔%t?xũ响˱yۈ3K&:Bvk];F*ps^WIᥞK[;&Ͼ}Yž({v)ߞEHu8mJⶤo*#ƀ.I<-}瘮ul\lᩗe>;c)Rz:.4Ph(LB(%k( Cy^0In*. tuˆ-K4cfwSKDd;/n93xSnQzn|k@5j _N&ȓ{ҷlCo8[տ2.jq=k$yb62 D$KGͭUSъl`NkFW6wIE ?boKDA9`[*[4RZQh eutzKbK!-Tͼhl|y^3o!-f~׍1V@3rND^ *)b&5)GLOx.փR6EɦG;>2"MQy^h㙴P8bAUV[9[ Յ#-J&\W"+ 'B=boLv¤VEUu5q)}j۴m %p  HjB;}пHPO BWh:fkv}DP˰,lEUu c/]ϰ;F)g׎oQ"ZnSh4rD%6ar!('A 7 rU`ZD ]XdANFISrO$R%?TyUkhέ[Қ1R]S&c\kC!Rr}Op{iC]֣:rC isC-<2U8Y D874|~j75DB;WyKm^J䌨2E0 ),c )r?S o&Bܙ!~dqXΪNhPHTE#PyOS#BAVoA%mzBnp riv̲A5WWʾw LGu }6rr/W3k%ER7LExt{c]AQAYݻv}.!ly@*qT֭͜zRF֭@>*$: 7cRh~ʼnKMT Yu dEj%I3 YChv:D$jBRȈjEHDz@_a"<~;M;=5etƥEL4aIZK[wSx*#9xуɴ걠Ms,(]t  X^6m[l k>|\t\MwjfwA̐mRv*)Ê ZVQ")tVUBd xkƼ5?;PVROBl4#9q< (q!U qS韷w峿i>xkPZɽKϚ@'9m^=bGKٌ̢T?aoaMF mםu~t I|NTvIWWq {0Oc-3%/&Hj$B)A}HWPe!h@(y^|6caDaVu!W_d̲Wa\뺅1^VVZO\o `.77)'.EHXF^״'.f1}%O>F(lKbPPү1ɖ_ U/ e[WH?x'G:xM2j2ޘ͏/UMYM1(! 3{ &_TծKZ1KWX%;M rH?o :bX O::B(ﻖ(b 9.eMu!>i\`E.`kSxlzK<\≖ΪKǦbv/.}{RرݼC3HHKy1ߓXKxlJ97gS?qLZ~MRzM$ǿL%LZh=b병qwrVwv b)rVQx<`e7{ᅄNgrX[C >CiL'l\a⡱߻[5NO,].EffͽDCD(n$ϓF<41HHc?ouo2>N8S; (R-fRxd4INX&B0qNB^JRJt<@p7T֭jKug?4qrthgdwXǶM"GOL!tXR -*?azsl+MS77΋>&D{d>PA(G6liPu9~tct'>‹<:W.^$uO2ln2Gʊdtd70ďu'pu )fE _ڽyQFǨ"Ih'Z 1M9@#Qyr! -z {nP=ĠAz\{o\>Ёoq$vh="lTrspPn@ق}>3+cGJsR஘r#K:# ȆC Q55<&-{eHaӿ魲X;# 0=e; @.._gT Q"Sf3Â3(VKYW6`#f'\l\J;bROgs6\uEP&8..P+$Ń{OR!LIҤU,{]p$QNHUN+M9|f~Qh3R[~eyk1F,!6;?vv=D:;B/zVSgP*ph[S$aGG~ 7_5+57 gTbJ^8~E}3մۼKZGȎ' lcWq[5c/..΁o!p O.5`LjY댰gS%jGPWsf)A}JG7a5[tywЎ퐞)oo!q}Uw 4[w;J?:=bѱ ^WO+̴ 9r`3E_B ䷼hopg7~S !5U:| Jl0*ϷJGۛ RiyKGl 7y/߻$;sH+s_Kw6^`]̎M(FRN*#c1B3e?Kd%ƅϟ}/G_jA1^' ѓ9 t={](f[?/}z!xqYV'7[7 )г=D`GJNYI,pܵjNYu|^ل,c;M vz¾E[EbJ!VP֔yk?~w%|*҂@\E%WdUJ5.Z9cv]AKj0$-G XzCm@%S|(_hT}|c*r"[؛f9[65tOD n }%:ڄ;= =8'Y77h)c-gkB-T-i؇+B= | ɦ"#,a#]KJepjX&cs@*"k'~-2yxR`y/Nmì\:y)nJ@MU&I_iڹΕ3v}ӝU B LY]جnsLx}/v44 բ?(.1/CǷi_ ?YT+ۣL"ؓZR5ʦ0 PiJ_\H:6x ['c-aV)suȌ F- \(Pa?O"02..A$r4&5vY, Mӭ#UNf3( Ү\s-+Y U}J)*I`meu b4-ZO03*=0u 6y5G|{Rv% %YQ~5QJ?V>OWKWi;;);lѺQsҨbi|/8+wm` 37>F=2򩭺S )kC?RU>{nΆ˖䙏焛S6cYlaX4h3yԗc|zi{gSnVknO6SѼN[шr>8+G){-wMem/zЗS,U4mDVQ@Sq J˙q+"s6JN8|QޙB唐kZ1j05PikffK`Y\k8d+$;27ڈ8 Tٛ)ēױ/bJluG6S <p&3#!UCz|.eHj R4&O"&;ķ߿K ,7؞>0B!*GaTo;NGeNC -; ״w %jBi~y Y|[+rS}}5T!7J9т;ţ 7^&ql0/fd { Rӵ^b;ahPaD$+a!qR#S2e6ިAep4yH '~\!U>rLf.η;cySyΠ357a`FГ}q4ׄM@OU! Z禩M_QxXRHrM!s*[郞ƙ@/G7QB#v gSagh{)@ۀ,x 9}UmC!LjvPPKk[0Y!Q# DqD"B'v_|#PӀ&A4EYsVR+fh(s1e(!T43wȺH/Ti. Y0b^(N!ќXrR%NpZ"yA$@&HNq㟺V'2zaJǒJ_ ʘM3Ӂ"j!4Z [%CV\ta0\k8ةtB.wlQ2uqRs?TYW$KQQ%½Is@sBS@l3뽅b K6%-q  x9 e@NUi2eH ,=PV7lvr2O6Xϣje.ٛxa>ЈfB/d JG-KPӸ@s)!Wv9 :q$;h̀&chs#2&Q6Qz硆푊%O{Jp)7 HH=S@l΍? " pcA/`sLquJU]{+LܷI#|l7R|}9Kqgf@cdcl߻s.pMŹ 4CQ!;&}׆*hmt~n(}2U0NEEwJD! W!xtvvWTٓt=j; w$LgNT]_mo4-RkifJ^ԏIS|"`h֑ʡT >}O3lR-Zj3sg屾lEh M+^d1DX) =eC(VQu䵔rtϞ,4]RMx9&Le )1_,昶˘Cq"ȐOdO,?OsF~R <9iqkQ!RܢJZ7cֲe[&G"p o>\ga _q z'!"5dnkup+Cv:,Bx|rľJⶲ(kKN+wD3аQU-1䔶=L9 qi*cxЙ/z(_a۩ƱL#N\!F uH8qÚwpvF d=ZNɮ֯e\ @)Wtrєb{>xQ+PxI~)G Hʿ-zll/7ZEtRcţ qgK}@B/iCP4s jYvH&-{Y[{:6ك mV*+xKs*_-<wuvb!b2ꭾ'>p/P`Z8rv0=:d bѵ̽n3!2KG\+t8ݏF{ى^fZȾ4Y BT4TʀEQ]Gd`{1cmsq2Vx'N vӍ3缲򌋿.'nΦ`SB[Iˡ3&U`,aHލ9\[[I9f+=뼩!vYuS&{p"1!*N.qZt^z <*洐$Xm 4ǔF}f9VK+ibSUerR#\%ojz;ŵϖA29V<_k'L΢֞f_aWZVLVp._)OHɾ ih][dV2'ͺP$U5;&Ji[c k5v=#j_#QRR]U6Vlp)K) +v 0_hN)VZy 4IT4i뺬{ޡn]`Wj <"oy[vw 7l ̌ջcYfM|lOhns,>-@eN$uG7ܼL]7=RB`nU)yA\Z,aƸ{4v{a44sŢCH*$khS\qAaYx[b[ML̟{ =ư2:^"9ڡr YI)K /-v8rZ:!9|+OOfV&{d̆N&g[7}RϢȮ=6cUr0ۃy8n.{ w:6Up anRщү®rz8v4+ȧ=ZFpdY'^ $GU $ 7ظK}H_nCVa.M;9Jdul&OzUEJhbJc_sAFW.>'wDp:dP'EZX Ee'y#چ|#1oJL/_͕gR?tLN'5P Ub GrW1K" @1Z :r8 "m3 JY5" fhL GVTظtMg:z(wt;vY)(BbKY/8Ȣ{-OS8lL:ńF6㡨ֈ}5=%,"+{hCJ1ܣNkYyK[i93RWҬZzHυbk|첟y,4aibTΞqh)~NccDYzG2QGCJx&ON'Y(\ $X%t%j1bxJQf cυRfFBB.5}3TRVD+)[%D88%mS2nIn4 71V])r?EQЧڒTȆ0EH2 YBJm"RT"72ٹG|!qj-+-CTͭk~P_+499\x-#0dfqc*QW92=<9JTW}N -ci}K1Ӗ)*ɷoy=Uiot(գ Ȗ`힙!>[$:3m#*Nl**Ov&/ -_1 wj~s\_"Yˣ]"e0% 0:d^Cq(^>#daYYB2y狑g# 4R%C Ph<#k~# fCBUi޲i7l^jG6[/$#}iZPgKdjE| QyJ֤V#Qٔ{K z(}`ߒ~FM%RhQ" G "Hf\}rv?p 7%}ျmi$W8/X{{Lܘ2dB;-)ɧt'D9.vOcPi=;LzH4fy]ˌZ!*f%%[/&@[sDb5sB"j (qV^_wOcǮrcڇ]N<o c"vdyIՋ*oj1}ȓ:CPf~ݥ>zɡ\W)(YDI6vUnK-9?UA}na~_Ӣؑc : FYǵ[8E=qd6"8۰k5{ʷEtvva\Jj.'d V:~=o.gC"H3Pys#ALyԺQ-hn PRJ ƅpU.q(Otur0'XOiVQni3:v=ckϡӊ),]iBjFSahgS\Ih]% i4zY$*Ěu k |ٕcKO9e(3΃IKZ_͕яӻ{ \,C: jQ''fW )̹&\;c%}& #}P2( ^H2E_&L^b}wtp4.ö3tBGu#,]5f7>Q҂ٰX#D6M8M^rƒfPoމ*[6}5=wѰ`׺^\Kgr' `u;59"꼱S!NzCEIYC7| _iNaRE,4>hnSXniz-\نtsN"ZĶ2Du*yiQmKoH}aتL-r-w dV [(ԣRtb7&3$ VhId ?+ݸ`qb*4^kw 4㣴38FTj3R$nA/7 h&VU re ȒCCeBjv, ,u*R{;݀z%K1|zD@AM9^uSm˳,fuFy8Q[@xr̬ha^&jmOc/=5o[#MhojC"[ұ|w*P0t116.](2o0 ,# ݼi'f_{]_,vI)M˜i0*h?0L]|lFhaSEױ q>! Ud΄ޏ@!6^27;"ʆNoޏ $rܖDw&S*J=nJ;[}X?/Ѷԯ:^$Yt"Lᑅ&,`ࡷ )` dI7Oc䐨AP'4t\!# /,sZ.imǀe:OWQsi>{MW!w:{,{]E"RILm6~ˆp{(3%%"mTeJ4f40ss-s)s%CD)qzKO+yXN8Ϲw!^w]QN\\䨃Iy)-?r6o2؃ /&=IUNϱK$u~&@!7%{TbфMI~fGK K"}kvBӁׯ__E,^7e:"h b& ǧ}oonY\?nAsq|=fUa Z~jR"]#hd•95iղ>&WURTȟl]iRڃr nVZlӓX]f' ~tx}53\Pg9),qĚL957ǞĬ0_l,U\^e5gsiCN_d+MC!rq!.)Z6x^?ήP#;=k="&FYg 3 {|tSK_0Lw'-0@_'lSzr qVkn yN5O&wE]冒$CmDتr"FЁh 9&dt" ۣ*y{JWnnn[2NzTfgHI}63XzÀg+VN{C|C:sM77EBeC 3 "i&ݎJvcS䈳ct.h2sT wy-[I]ωVSJ`BAc v/btϺ~ fb~( ܨEj9Kd g'uu gB瘧%܄Au1ci9A }]T^v:d'vFvv\9Sb*=*U# bj S*֤5CڳMUQbE`J,"n1~a3 R} _@K-'ljy*n1QmB NѰj|+'';;rt8ksvf%ev(mvCB(t/[fgu,6ʯW3:kvzZ ߬MA.T#^wδ2P9]w/cz렰^q-]*dl!re7US$i@*WP'&VQ5!e&gONP܂(tp.J E\{hko*\d]03*.x~Cx ƯWnNܪy>XEJ6V)y7'؁?'omQﶂCnL mʙu* j&X^dr ꖃ'9'.*\$)`&w! c}ĬNqhH?Y?*r&$J!QXJb1+̣;֌KI9_H=JIF*\Í0[BZmeMݮ#TƜߡV ~Bn) N,ܹVV"X-]q|Ju)(_uc@b+u…"%5,"Cbl ޚPC4 /X Yt`4upZ@G蠉#m`$O6RؿC¬CUDP2u"uGiV-U"UM5fnT b& 1Ƒp{߲0 3UUm4 ;7n!}w{t/*2vI`͸Ѱdf -Γq"Wvc%͜܌=%Ԣ eDӼ 4roL+ش н"zmao_\Ҝ\ҫPu}]$=pb ޗԢ~3_^mN2 ufi;/7RcT%,Qm,]B_ߘs%}_a[7aeщ7a]Ⱒ.Eٽaw9Vb JUFp{Pkݑ;n砪8a5t* =nX[[%VX&"pu!cR8Mw/hǕ*@$7U;dyZ@af=bݣ&"IU?vZR)$hNi̒;4zh)Ʉ$|jdiR #B7M|[ϸ%D3}ו(_lg8`N+o;.ԁNQC_tq@iToz+K[2LU -,'!b}m,&ZvEXoHv;RPwM~b.Ts+Q#pUV#j;}zbI]VFtChe1v9,k ޤ!]VB̧D~T,{ɬ,z-b]IGoڦQ_ ̾{W`x-i&(gWHޜжӡX_]0F J4HOn77EHVR eil 5th7#X!r&@ԝ zy2XUF4a_J 5C`w  U>Wq{[slg@2 nxj9*iGhP{/̢3Sp![GuYXö+la? 4BeWC|eloOfŽߵ*-Rw={3~9W.2מ|mZ 3KZJ5ϸqҤMl|vUgxBKTk(zP*''qd? F)'"rGD;~(M%_ "bF* m!EE͂'hƒR.6C#oD(fYQ#3ɸ%9:1=L1"BfXY[˔$gĭt_t1VB{ ]KZyLxY7BZDe ifd~kpT#R.c_jwzhDaiH{\5_Zq}hPWa- jw,] 05a^'Ȗ.a}[F^+klNr-3O5 {JU>_EwwGƅm4t?I0~ pbGT+B.V55ҥM4GzJc3II+MS?nGT j{q}!}1]s.{tU.mVozQ0iD?ytuUZԭiPMG١!l k41cΛ nuq/k}ls乽HI+,֫XwebC{%;4uV'NJ!՚tYmm4ATłq9n8#cdpVQ=IE) ,Wp:qʅ%DoB]VN|U~.H/@_D%g0#)z!}.k eSj)SaT5̀jR,hʩ˹.Rn* +m Ji읛5eeŚjL/Y׺¯[nu;𲃮ڛuACe:ݞ@#bRAzy=h7v&{" 4@_[MAP;m-f?2}$pg?( ChfOo=|V\Lo_PAp/?C_-fw%Ee43c|2e:οe=\z|zN?Lj[w\;==|ؿ}|oO/;[;F.,!ԂSX&J+F*g&rdÛ41p.X4-%N=:|Lao-,V^!w, "T&kY%=9}*K..ӇJOr IXPWUgN=WЖ7#n&Ү@b ~|@|/Lmr=Vփ/_K`aݯ oį1&=3[uY Q0Y`jSր8l:"bi"޲XGԍ5 p>#pHvv^8Gs-rn%ˍ?U'Qe ;t+RS X lڻ%x0bR&D<%,Elke>7Oۛ&`tz]KU c?lB5^*r}j8<玈mdAI`_E:Qdc@Q$%wSU AOh 'eYNh Sa,)F?w>D~]r%4ҌC Џq 6_`smQl+rX''O VP<~SpͿe,5b1lMѿn)|>w%S{wy6gh a2<ٟH7 DZQ֎쥇Ȑ"~N%6ȯQ -hQ -zI, lW~dm\K,_޺ zCѱ: .W]u ˸pX&,oezPΈwޠh&^!b() JAo _O_1|3+|?&X;:7ҤC&7(أU~hE![Z;8i )j2MiUib}%e_։ma_$}"1s?mj3o|fweWh, 6$cKHo /\SXڅ Pw6âY̢V2p3"fr(E,90fݵ <=򩙯S;+tk?Pu8<]/ehw)PJlϲ^CWL+cI lz#k]ۛYHdjh$w&ʇ/5ǺRsL{{$mmU(DGavaN&݉/@ː]D ~.6cۨݛʿ(ၿ2'}~pY*YNgC#s(%rsTrki$}F6T2uՐE#RƑfQ_O zQ=r䜤 1^4bj-95&&E8LJ )oہ>r=G|Oa?hmk#axL*j9G:GvphBa(E k ;qzFi===WCcG]\1A&CuW0C_|~ Ȩ1TOI7^7KBq8J{]JP(\w_zZ4m}}s9"A j偻77N7v&0d rPs^k+PKdrα) z4m[uBVF ʀW[}tZS³2$ne Z'Og2}Ϥsg R;H;{q& ( {Ց(ڤiB̙3 \OyKZs|gh`䫑[RHƹԂ4ս(YD*MH'뇣MQfW lA)zno_jz("h$o /.) ux ѽϦ#w|qxw~(Y$gP&iPQa&#zTDI\`@j+/"JMkIѐBp0zXewi4t.T%MU߇g?-Sk#Tjh< !-9+H^E$LiE4-h^B;3׳SԴ֭OյF&}TF![ǝI甥_^f8|8 759jZ̸[h[F tl 4< hV.'ZH5*^y^9TW趿TWbjxΙ:h-@Xhxffx!yǶadtZ8{u,S.NJJjG22͒{f)CeC{!m%e¡(E_HlC0Tv ūw2& zDЊz_<{Gm#3{U5pfZD\ A1K g9Vx΄5ȎrB20I0KE!#PDm Lj8rE!/up-iX{&7PtJ-* Qyߚ(S/+eV`KvTj9e`mG}2]1,\n1p;J\q \xxςlF \l;Tt< k'ގGamtG1 aH߉,5b42tK~._wplS]T{˧i(pj҂]?pg7 I|:ð;)CǤ@C>;o$_yK6[\҂!c: o:le. 4)Z(,KTn?  Ga1E4IQD ml.~Rfa,yig0n5`슈V] !DN1c)[SV'Z3=V"Ӿ`zW UE~[sԤ'HFEgp}wu;&!ėܯ4<"~* ,L vO< Dx-ˢ3S?|e?0=x! x)\1qL}mg#;'%%B)D ~Q &-tAo} Q$E"~Dӊ&X* D~bZG"[yV"k[uO>_H4n;K;vKf?L9z*iB&Y8) f)3}'<O]p)Y;^.8ܭE%׈ķ椚̨rGe{ABOj-ǖ)J26? 1)[BkӅDFtftLoYrKl_.1@clPA+W KeԕVE_g& `vITeWF4p0Ρ>V`f]ZDI`oAli"v!lvMptޯfz(o[_)2M.ҋl7#Zf AW_/)_UA}Śzn JW%#1 ̞B|~o[  ]c^A7>GbRG h&sP|6[nXM]igm۾XdIa6}&;<35PB-OqE짓J3;metMD<aHe xGeubɂz0nZ'bmHƠ"n\x4ZjИ锥0&nP yٮT6zb*kl(/ج۳)#99[QT@zopk״1>)V 4]P Cz_ٙ\#F܍[WD^lYòZV>.;ȃl)F~/&˃c ۙMwtav]ݹGoR;]z?}՜h`T@qVwoe ,jSi%āo\"xMv `"'Z!fnLXF~DZ '[gB0{AP[iG3t9ZKΎ{7#G1j3-;]ғ G,XgnI5A.6@ImߘQĶ G77t>n 86y>=<3=vUDF0alczu)ɢsn"ܱI## 5w*N4Yu)Oɝ1@qaW{>OʄP ĊJi(5 .=SQho"FpR1ї[1ؗůU+IqMF> ,nhFeWskx5H} ߔkBv>=$v#Tǖ79Q 9ja ǁM˱?R R+:Fs L[Epk-zZT\p#|61:}p [!L6q-`v dBr()NR}QuZzn`l8 Z2s@Gv0Vq ,@선DWuCzSدX-q hAѨszg7S=;DXct4]P"ZD5OCU)r à%y[pI)2j>:d'gs0mf,cPM^C{;mq`'(j2üXL(n*R PFӔ `AS|{2 :F>nlʄaflиGz=d8,o-fm[ RVQ{w4{ If |j5 $]cc F?k*d}rAOWMNs^ԏ9O.J6gm`%ǹ0݈qV]΍|O@@ $VH $&QWcFPh?,r͊'HDŽN2R>,̪kxY}4Q0OJ8 ML_ >?{E"hGe{/4 +@QC YJ;}j~r{ >I8 uKB%;*s@Tf ׏?SÛK k`Q,äUz CL!qK呲%|(}X,| sf:ammaUɰѡ]BIp1'D ]KSQJSaAC7|dhfcWg:?U\yzÙdW10A#V?QTw9J(E8Jq~J`.9c!!? @sk_K3bRUW#Zg Tf-G(vd>9PJlRq m;^ܯa6}ۗ UuǔXEq+.N->D;` {\VeL2Zs|d9dYNHVnhJ&3y=f"t[Ӭ iHAx',(0:ķ;fvno=s[ş?#gI0-]:%E PIJ=uٳѳ_[jhܱ|\ wcا=ۈaJn"h @jS0С2DcDMa;xDmL+(E=)͚rXŹK+Hd߁VcPVDy6,%:X8A -7&&Q#Jthdy5lJ9UKr8̲IJYI&b\2*\  GHIaNc?./q3+BwHT _PjNO !MA5LisajdIsk=[Jք+وFB '2[uSR+jzHMDe31 *:hڪ4bϠBBL@.@NLjnԎcjjQil3*@״*f-Q25Sz}bkz5'4Ubo~$bPňJB|2VHBHצeĭS)#Ld)s0OW<aYOVj Df| HOjxQ!UX'JKyi~j"I0A_n !jc> \ϊQVKRQ:G&D3CƜt17XF )\A:B 1t62!Pci7e?p 6`;7;npBӈ<dM2ycǯ̪XmV#?J~۫&<{Y#x~KtJ:+01?fΧwRsw?&?~ X{H Q/wyKYD_&FD@5OlznA>s9ہMBZ8}~ >ʺֹFt7>NYA ~$J T$X諒ZY)jeP.r{֨jzo T3Mrb븀Tiv+ޱ:FZa+FX%v{[6-Ak b&"ǨtnsUAR1vS$&Ȣd,&͌u%d`Nsʦ. cqx\t!o]dCʝ 뫇MmHj՞.q%6}n~6hkϪ2SW68cFNJԋx;Bv%@ j&>e1ۚ l2(,&*=C w5<74qz ~W`R!$js|}3>izL="c<+݃j?i RsSriP3X&VF恮3>6nǃktxX@s XVxxw6L)sn/?bH7_8wƙ`m:]R)̤?$Wij(N7F:mף}˞E~PhsX䐣Gg %!xJP߈d98'eda`4%rf;Bq7K'4rԓev*ˀ)^B'4;Q2]Gl8bV9 ̐,O ndvqL %{eky$QZ?ME'1";>LVvʄf]~˱9b#!ϻWBnCg7؁e 6:SN=6)} AKm#j^p8hz !'`2VM i%I=.lQ:7KPoeKsNL*[VCK ֱ^L9boɀ}`YQl3ǔa=etj3CP{:U3ioM-㕵\/n[w%bf;ۜtzLǩݨѰ>: g%7=z7W1 m,wrǾY-ۤI#<_8)sF&$*!`qQV,ƾyq\9Ri]aV6 q$eZd 7B5,B'}OVgv-'1(~s?џN!dzS0Q2sK>cӵ>1Al/aI#|D¶{'/xew\i`<m1Mkb#D -EpDQ!*$*Cu{θOJ6AYT: gs`:ۭt1  >9ͣ"n8mO |f;C|C~'|ο?P+:鏿{V,V12S:F:)+"xK0R;Ljv#> ͍OwON6t677^I{ F]0wj&icݠ6F MeƇ˙1Wff~ B~JsD$j5i.Ժ}k,4jZ6.yixiYḾ bvRnGĤ6:i{h"0/^4G{R`5ki"#q7ܥ1t4sRnW3 Fnx(Zs>E"/ BGˈ5McAѨ8i[:wIW0d*ñLm~|_V݇ՓQZ9oH-pv0ܬ4V -ЗCܙY'"hRRU!b݂!%Rn$nI'#jW}pv;r"mAB.2!JT։dzSe[lB?R EHǨjbV`g׀heC.%ydo( cbc:I,0Xi -*shw#ԛ3%]#1HkbmbE zT sEΆS)VP^d!Iּdܮ$ F@8P>'W~dgC\@QOsr(XKf\GEGumn68M] l)oSu+jmYE܁6Jqr;`F~8]fHmLMRs?g k* * }Z`"\ iDҤ x93 5raKdFk0gRx6My0 >-S6Lqgr8b8Vx 鍑#Qq#i,C|zӓJL K~$=N)ha.MC=Lz=| \}|f*)#Ctn; N 2RtqwUĸ3> g="2 d g]pX ˉKe}A :@[-޹{TZ`8;>v<JK P:f3"V)QnmDfЇm\ 7I9aXc!!@:dkbv|{vt9~*|i6wӒ# 4S @Iq'V. b,N@$̿Jx,%x b&]G&x_E[gXjwމ }#Y~CXq+\/"< 5D&msi_>dMRz]\gP%^!l cW__P['\ֈ{mL=~2݀A S`gϨ9ǁ16h7^^$JEοAjMCU$E:}5{2!Y> ֨jZ:c'ǮO]a/MڀzW Q4ᥘWowR+C G>N%X *  ǯhȮ[ ]bҺ;kn$` F{ɷzlE [_!b*GtYٺ58$C)W3@+xCuK:<) I4Ѳ[tTk<40]$4by $x}"ˬ^Nް)TS[A̭VlGxWKLVzϸm2DXRl/bOYކȹ/z w/^*!W?p+Nz X/kLH׬:ִ a'S 9 }fNNZ,YWFG}[rѿ6Svj?8Tu8 ov/ h:[_@lO 3gӬsH?s;{KE3sx2XVtc +:8lGg۰'u꽁=0g=#k+K[k;[|E\`ks`M#AϧkE?x <"hyvɳT;}U)h7JQ94h,:ޢ>j"ƌs7mS2CTƸifG_򈙑 0](jhm2^mܿ,n}ys6Rḷ[p7`:=8oI&ԹRu׶U La]k%6Z]Q.:VHHLvs>v.U[۾avpY;ˇl>,׺|jCGo+#&]5N)᥺\*.;Hж {`5>rՖ[!IYPwMJfn,N2NΖO(x CU|˼4.z\2mibhɺTStEYJU,ʬ!7VTo$0Hhף?n)(,TG+(J%%Y;@ ڜKex8$1ǗT ̍opK&/H\q*/1=#Pkqco%K{*vpwgeO9fU|rq?^iK?֒³΋I\D n60awD)vEh=V Kn9C7\wevͷ K4*7Mq?RDaD=ڮ!Ċ`sUJ-AqMiޢw_.\a%*y< ȡ>bSSU6I疭`{ !X1c2&'0yfoʈq`-J\~Bzd~!QSz!Su+ 7iٻt aT_>9fl1uor+Ԃ$EYO6/RP&^;\:[4,:EL_o}k_TPl$\;Of\myB ֶ 垷:?ZJ{!y^x-ʄ"t\NzO Mf@89rTQnydLe(ɐz'^bܪrÇ@FPw1m-@ǚZzjL/*r+pn,x04b`VzO(NF =/S!IRt1|Qd hR}y%aE;- aejb^=|lH{#c'%͉Cn 8 2qZg),&OLC+4ǿMB7; x{:9c#`ByUX0Ze>Fn)03t^kR?MRJ^:OO[ݭ)c}$ޮڻ,RaH~ AMtT.<,j?*]:],&χ+:}-djI8 oi1m\E՚KXg,(0'$rWj«JW@<P#G_ro ] "%k+ ''X3Fvg/8D~ '~.3+C+Wr+>FK$ UzW[]s8hG/]t4(ឨ<`)LD"fBW_ED. +UW/N3jwsp53z}C( _s1}[tO|9n=ZF&^._Y}~ϯgNTJen5~mvL! #lˈ"u@DUK͏ts:2,"(Auv0nQn5~6\鏖(^҉r;cVWNU Xr*?PBV CѽX=r.30ӡZ ŋ/s1 qӚ,ȦdeTvM!}+߆5i$&t~q~.*N]Y#3tQoM#Bw*ہ Ie c4[1|j\+VQrM5]OPuRmxyfXu/!tF1+QS(\L(+1 -]E Ґl]UԅSpqkNq`ţ:P ;vS&zQ![։'z4X{=~aUFO/YnNh|:_5usH;vQ>؊CyXM?c}[bezR_ÛifpHeӊ[@+h/f6h:U8dJ1/ ( ;3Z(>zt n$P(~X*ȠϮ?8ߢE0Kr$&aC4J~|\lVxh'.FG\vOw:S,*jr)Ҍ͛nܾYEBp=`=z$B=:FvIcnKjMS:B^<_w;mFԹOc/TiH'sf@g)ʧY*Gso(Bĝs^2s/r%IDWZ҄dsvͽw4EUm [ !wtF]kR/,C8h+诨}oQtO7~7S3jeUE,ΔB똤CCsXMZg&n'B][5g2Y(ʫ/4= eq b4~|<.I>eNt;8]Q8&\*hک_H E"1YҺI. ܃'/SެUs @- ++Nh#Ty& X%vO^.7W * l4<4IR17AV@)Y%|/E0^w6=)7RA|qy q}?˽T",ާ!J2{m; ĢwGFlI -..aw.N&r~Uk:Ċ~h({`՚XN?[z֡ eٳDc.;מQ0$]oEGG ;oT3"(k'1 r%̦nyVq"Hg A2Ň9x@ғ$cV#Zˎ4Ÿ;mAXN>JJޘ;fǐ, X> 80nb"$FԥATh5eĜ}VyX|\ ^ 89+suSlbo8ktxȺd +\.3*`iӂRS7`RWNLh粌Yzӷ(,_vO\00ۙ-\tb߱(X*bF`E9$VbJ;Bf `r*!k,~=p-d1az hӯ!:`:Ԣ)6p;BZ4T/M ;-;eL;[Jc\sq:}ǵ` "|ǝ4|q"\0{j7%i:N(p7ʼnyrP!! ؽIhI6N;tTi^L $$\.? DzSBK>Z7_?3;5p.&d AS HpnC uW]# # f 1K֜=GdWEj9tdODV)F0H/Wc8L,\ 5Q8Ɲug_ڕhʝ qD׼͌+\v,f ߢf HCĿO~a83x)0xSk lkj=@Q۱m8G?Cb˦SnӓX%=r#wbwaԊTH!Z⏸"8ipΩTedM9(89J~#ˉNNk+-(cd]r2?!hQTxY ;h^́,i!+q11k7 wbeC'߿>No={6ҙ[0N j׎W&U5Bt۽v!-]smnn j_|ps;7FZpXn!uxvF(~[Ʉ=H`knIf5R@QNi[\5KˍtW.h۱i JbImG s iVGjЫBENLXM?RӭOzlȶЕ#*+ 7K,yAj:A| hΑݝۿxwAYjGh8jǧGR<_tiXL(g 4ML Լ t쭗3;Vwq0+-di߿I~}rMiUZҝ7gM)Seİ/F0Ob}.: x:ArL%e~i@^OgAzD|]20Uwpxٱ4(SIrtG6Zfs$v4zlWz^Cf t3\ {?zL!>s֯fǫ׏ Od2oqG&]aHWذ+4ӿ:\3J3"Q  YR%h??_WVsė\$ =vp ,/fT߃>?F+n`⋾q@\~bDe_%j#R$\C;3Nt%b gG: J"O[v%%(j-r^]]W8?!x*Lr: "#$:5ͫcz(nMϟ͏bP= = m\J8e1 3|pfqw1Ĥί@K7<3Q,)Pa9},::G dn= 8jR%iK}مxս3fԡB9nSSŘ8GZ3'jq#'"ro$e绋)(JX5P&1J|A@wEda95ÝwgR\AxtVC֏J8Q+C:9-+YYNOY틉/x&v Sno͈DE[olf8ʜy H(袿7qFi{ddhpT'Phؑ' w 6?.W\.A慝)"l.F63$9'vNLZQU;;21_[w|b> ×$i~wb5he]vgܵ/ue ͿIM-?TI 7kK%2 R3t))C$016`^ l?`D09yH:ڌ]nj4F3؈c}VC0Q31iB!OJAu֟1ItjR)dr2wE١8]P.E͸OW?O%@-Ћ"äF&]!ʌM?!(WF~ ޹&X<d퟽gz͛1cA6o?n{3تfSeL@csG)2e: arźA]I=V5/!Q`p#~`gGӛ*}}8 vsâ=po%h-`]vKIx PO VyOw_RLߏө}6_Geeeq>hBNauXM6uc* |FЃە77t>7͍`٫D)FF~sa?߾Ǝ.a';BA0z単]}X0;nFtlL㾪w?_#-4ýh8.>_n{P1N@b>$-jh4Ow*$6[#ߨp'(R9xg\2] h8S48"SWCmH"-ǽGG+OOTt:~ܟfTkBä @p6G;F~w$ݳcS1ZtPINpЧq(-`)W3nx;hc9l` Cd2L%AI-VdpK;.DԪ1&Ǩfu7N84<FQb֑.O6sx]@_2'j0: rB_<˜r׻Nۑ7v ܱ T`8!_|+ۃ0\6pɱFq[2 ."@SE^-P#e b?A0#1;A#AXzhb0L;} ɩu'Nx;MKdPlcNG - H!Y U vgO`Pؕxm1m>03*~{|ȇ1跇k b"/;cQ:HcyX S;2 dzҰ,Qn\c Տ~ T{p]$8A9tbHټhԂO&p~&s_mgBakӀ?z_|ܲKS%)@sB"gz\%5TMoAݠ#pJ?;N2,IǦ(c!aDe\iꡊyΝ']vSSX0G _J=A0aوpD6!ף!mQ9MҤgAȟ/ `觀ַGKo`K-[5p/$-4񧬦 WL(%͍!Je$dv|tq}h'>9z7vxOiLֵY'<]ؗHR9UoL* uHT'RU(uI=,r斮y@;Û$ -zs9bO;r(4ng4/UAA|o g]7 c"^G[5ӝ2;ɟMdOw$`Lܰtr䐔Љ)g":!tr9.: <ؕ6.5"BⱢJt*?K X;*>-낣zR̟iZO4eΡχԘMaY’s Bq5j+MVmF|jX[*Rھ+ͻrڼ)͛BV&BRXJh)o @ {6۠A8><4*Avp4k!-`H4{ d 6S0~ԢؘM~|hc=w0ȜU#ڎf=>Ub+P6MJc x0~!^'-o\x9nVeɠ, x*Fb<<ΩbG̙&6d͵ r|}|as|O!GI{u7R-RMP&xd[ fXp|zx)N~qxKk鎊ዳ"d|AgkTrjƥ/` nks2.WzfGA~Sj9dhlK!>BSJQ~G{B7S VHҴHyryqD/N؇O[Jcr;˗c+Doo5\Ρ^vIE& D-'g9H<[>V7JJXBAQR0u_ qW]v^mkuVΊ[(Qx ^'lv 5f5ѵN0X͈R0DeWmµ@?\z;|&];,~A~ :h֛~߾ipaCV]zzګwCd , 1dF}}Sj+̎n>Kx~$_; Xky> T%i^mGS99<ɳ:FaJ#>nڪwslo6sƛP sRb~+RDzƟ;ALa5.uH7]_+m%<ӽGBܫϚxMΒOwz v`Xu*1Eo&hdo0h8ݟ0soq6u8=B $Y"lBX<W[6;Q}dm^B84tTn*t-O,r+ϜLAѽ58o0lZ-n~(ЖI"G]"~` zũ4ܴ2cta)Mۘk>wa se\sN7Qg>oʁP-Z:=fxїXEt8l5k6jN7^9Ji !@gyrKmqE)4A4K08#K-` ׶^z'pH6s |R5jSH.4&ځC־MIBy$%A<8&xvl 0lɶ[H21>w>}ѫ{iI!=x2HZj7=DCxu1oOS9u7,2}·_‘;As1.  ۠Wk#ހaXq^!҅EF]\?1@tUr/泸dzʙl/:I̥5fF]zR'z|OI[ ]2Ȅݜ%yer* XޅFbqW- bpLCZ UBsAqfd_څn Mh3ua#ߖث=E+x#AxP3|ܐ8C셀p?A<ީSG4aqydù%Dz<#%kJ#ySms .b<ٕm:$ ZR"MIC(^l#N :0r*+!01Sc%AYΔ`T{4)kSV=g>G5/P|/ (YQ2fAb3Hm;)_}6b_3rO:bFkUi3A3O8B֐_HWDv9׵hYEv%_*|x+ڠ Pz}?rp髵~{h%y^rWFΜ-jYVXFVk~$tu3R># ڏ(j1 9pS B;Y5zT0gq~Xг| #jԭ*HLQ1)6T>NB f*IQ$svA:AL@}Me@g*_#5<>̮O\q,^̪xy@:8 [n} @<}Y*p.Eob"tʾ@MԬs L"?"t Mtyv̀X|A1&>VJȀ'f Z#T eR.!XXSZZ#eф@$~zkjխOm;-ÇpL^>^:>S u-@"/ '/ܟoP0#b"!{AFMjb.ܮJEa0G=V o<^_r;G՗ s.jzFtC~d "9)A@GQ}xoo"ԼytR3RSk{kI!~m_=A8Q"AQ!H(f@![ {'(d 8Ʌ4ق⚷0;P3(5Lh >ňr~A,hlüMX"&xNPyok7ڀdD1I\Sq펠%c[? qmvP<>T xwt+1\Zi'C<'yzv;Gĉv' t'!0wi3'ۏ ^n'AܦOM]ES 1ŏ}ADJA,W ` FNII{Xm$XBOE i;m¸YNa C-l1 3_@L߷>W}o7ZͿUa{UyQ}[Uyv6nk~o~|wggfj[3s96lm?[E; o4bw؛|6wf|gJ.![Kt,{0)$@D(⢅a\bucF@rBc|n%bRf0 D]^dTdDx:oslf Y Q|d8:CW>k˕AŹO BA.,w@OL7ɳ3$qVDvy!SR$l\&>%GWˤ)$\!7M.MA)hݝod 2=nALΩpu ly皝*Q oeB P݁(;M_y[fKP(.=݈FH ZsoBC~@E󽹥9!u1'KDfG'Ƥ֯/x0A M*3 S/AY? AB2|m2Ob8G&A-0H4?x !"VIxJNq'PBr=YLjzm ?O% X9̪Nq3zٳ PpI1S a);6 N.#vߴ  䤒eT ٳ!l#COb!yZH4XB@[&pQDN,XK@-1p.{]XD`sʟ9T9m8փsyfԥS:?_X曥ť翂[]*|tUc/D[4-v(i2J:s-.X9jBj $8WƮA"­"ߠ*/ݡbȯф Yp\M㯒;XzҾ<"\|Q4s8k_Ƨ;($ .R9N!{QgaXfw/nr~Xh#>@o*͜^D( 0%L;;h^4vY-~A+0 Nv̙w>a'l/ӯ/7WۻtW΅u/ڗ%oe__ο~e8B?y)縤)ml4̧> Cœх׋S/!^$;ʇ3FKl-8MȑV򔐶!o߼ 3g9?24̧(HrrDK2J<҉;pSRΰۅʲ<-+u J\f ütأ!J R͉F4Nz''VxD, [a/8|Q$kQ</1 g1F5%, elۘ]j 2H@V#+O9K.$ + ZhE)F]>zsA2W|TVplĄTR 89d8}ьY0CDnb0G0Th0{ˬmLX=vfL2%wO[r Ȣg?zDsYԐkp9# 4͞/\o\PV f?D{u_5)LUK (DAJ#{4}lW}H7 B(; L,*\Ȍ0J.1>nPghJ2!{lP DoOcNʵeg`4eh2rmoCT˹/ VHr]EUyѽh;)6ڸp3^˽WI$ݘDRWj| 2Ff+ڮO-BhHah˾/$zBf>b:hAP TxBdF=@_+# "^Ó"=b,#.Vj;3&( S?S Gzf~5fb6_\7CHUw!tO ke7\F`E@cWrH y|.e5O#Ds6w0 ;.؋d !Ԗ) lv4oEFc{I#5 'C9<32s>|AR:l]%CD"A)C|$:9$72Ƃ=ʺΩC1fIcšD unxcDc~n#MK6}x0# u_\<F~A}$ǒfn8>rd-}KH&MI v#Apa֔-uٻ_~==xŸh;k T{X;pŋT|S7;wf鎭o*?14/'-_T(Y^z#[hFG^pȼ+}Uj S ^H^ 8o) 2zu4-rP$(Y(8]%5++X9+XEU[-C,eq 'BF.1TGwMaLVJA}k]#=jc%g&G=#-8l׶+LQbY "B햂)Ȓ2pk ?n1v|⊎~H#hrzTj,9ad@hYb=ۅWRQnN3 aihȯ "J:}e0 ga γDPjQZ2N1$hݛ)r"0 R#=pT^(20y.t*$g/,'/70s1b0 R#I`b1f4(%E5ͤ)5d,HeISٔ94:q-j;ISaH(D d IxjS 3fˈ p"vq9DH>1aN"B(#E&@ 4:hx _kF)˰OЪ' ݜr;{,6~dƍ#VӕA셌\ܸ/%-l(d -Q}X%d?*<$-0־1)ͺ2j< kU`]xI#7U}/ִ"R82oqk7-ZhYvW[篩J e@ s_a g (9FMf?^HqJFWXԒo&xi&:d{q`/('iVQFr*G!}-l`FDVp;N^ x93H HW0qeNz:Ѷk s2GKk](J8R w{SG v u[VbP#mHtahz\ߡ c%#X G *=d W˄WV:In~z T ,//57SqǝVG. jbP!vD랝ʡ)\Z@8PQ>٭ B{)i A~`d當~x{v'jzWm|)X|a5 KS3[= &V-Ot..LZ\.ݝTJZe.ͭ{ؾsg$FƜk[־%s-_%L8)#<`_vW+wZ|{ڥj5^c ZӤ&l/W0&PУU} EWG`,yv:Dq"7.o{ q&|pWVn4^{xr:{DaܗC?T8=i*OyEMr+j-:rƋ'Yy^uС>FZQ̹ȩss_GN!k>},\PZePzl U Cp*me(F}ݷ!ATDHX(k c+kAxJs^x0"3@%^Upeݙ\b/h+!Kj{(ㅌwlP5hfpd^%s9H)Zv/71? R/YI^V5 @[zj V9ɝe͊D@m1,ʃ=w)'qXΪv¢hx *#|V{B}-_oZo|} qXI c뛺V/[u9?"_ƙ F%dX9t?%k p;L*j`T@T4ᔗ ςdx$S[ K Mݔf\~S ӑ=ٝ {ן!5;#(GO3_ *N{/SUABL߁|pǖRBKa;{SDAGIg@sT}A!bcKA#\Pe+"$1(jA4]B-ri)w3B xX ǁ=kc7wI)kޏ _. ά(E%[*ZIf #շ;О)ѰLVBqĠ8w^֬R!Z"Zy%VD73ˉ i虵sr4pcls/rY(#oj/xq&ݜSpزKu9fRnlZ,{SUcgHL <91oD"S=Au5hsE\.z}tl?,! .*嵓:WcQBcXO꧝Ke`sթS58lzYLl4~9pSe{5fh6s"VةhțMp"H=\)1GEQ&7_b }R%m D/*IWAYs(v Ǖpt`%&y87 'V[ip;#兎lz,4 'B_J!zߔ,Ə\Zoj :+vH,f13h^6@ӁWp%Ƹ9xxI#zeMZ[3 UF;c K8e١\iS4aB=f2*')Q2.}+yUv9b5"W3@>j6T5Xlȸ/B=x;+fQϐmv~ˣYH݃11OO0)ᇲs~Z :g>}(QV,"Rv>~aP Tkynqon}l뜏N[}2wv(m$7ߢ6qJC&^|hpܐA?l^ʽ wa> M1s ם7Dw"2, βnяz#_ŠkހuIp!avKŗRƟsQl.9@ m%cYZ: %UeA : >K 6=||y /. yIsjq)XޘM+7obGN[H 1iIq v))p$$HB"(bMOrEP<u tHW-!:'0C`֪G-̓.u *FX,jKp^mxR^L8XA-w'mmhU S`.[5,B`s%jSY c?DC2k'0JYo;F% .Hs57'/HҠ &*Fa^~ 83`RS̕ArrBJZq +=um :haxn3=f7@]}ӈ1JgMgPS /lp04S2`b @xg^zDgʯ.Bh!L2v'쒃B w>l|2Qt >]YwXT%TC$0jb0G`ȗ%MtMOr:ZW0YX:LSį))dE(?/- kJ_b``MG4mf)=_e}^}ۈ&q{N{oNo׾MwČk`84Y^-]ȑ,98~<.Bl1D6+spiEx{')|!LDeVo`)젾`b%1F*m+;4(M\ P @ak/ I.'tmZJU%k U`wNiqمqp&V6Q {X{$נw{j{"ڭ -զ[+Ďj 3':5S #FVj#[ 7G !tdbdzw) )bN||<{剃 &d&ˋFsqD/ۆğsNfjVqVTZ1(L|N 4iWW]Dd| l !mHF?M]AKMJwiKɋ=n"]Dϼ|##?(z͢W>i0zo$+,dHCHҕQCRBX< $ ] ?PqzdvgO'N%xGHaŰS?E##%xϧ>o d̉"psEXwl+-Akɦ;YV<Rr9.FQ/GL|tjhtW2|vn3LT˛)"UYuVz+0晤*#1b9ѓt8\+ޣ&LiD͉1ݸ!'b~򢗓$^/[ҩCbat47`c՟WCӡڬ 2Ǥ!f8ss~#ƻOAv_P!jNؤ[tSɩQژ?au\eM'ݦٛ(5n,HIyFos* x-)pٝ&ml1H=$m b+Zuch~8g__C2}3p8+KEaOwe+)|9X3iszeܳI![KCJ& Vyý z4Q]uM $|Q.ȍf,#t0c2KaȻA(.rrЄSqpM]dAYmƕpUgQyvɻNx][? mO[[jm@hF[Z 0eяf!;dyw7A,~,%+/@;G%PoGO`!Ln"g}"Yϵ "lDޢ eiG{ԸGɏ<mZCF#K8Wێ}v+0æ ۾^m:g4yަF$R"XC-#0*֔BXtZ Z R-,M uJ`8[t:v95b,@Q c#] ]FŸl=tڼ?# S^uׁ,>J?,X>, - ~(٥p"="+2dzXU^i %־,} ,<7y]_f .8p0u6.(F;c@<Ew ?t*8l^"3=zxyN~ ;l(<~~.yDɫ,; ݚ4l!Osts挭QKr#~NcMwլ%B98s.H|xhU7i P\Gkab '" Xgm|,&Y,cB(!UҴ1SyUu3o"# sɞ{ҺbJXVu32Z1q/涠CI>c3UgM!̟qs&*+@A`x @P^@c [M0ۛ1,XbZN]%EVrw^TAC!=u]cFD2c2sΈ ִJSg8Ѓ< @ $Dz{R yą\gYM$9Ŕ>UaՒ J&Ͱ]NXIy}Q박 PEPg|Ty@kk\bIWFA]M %I?b;FR n~*k{XlnMFdO0߰`2h\62iP*"ac*K W/?9>M\F :\۲-tJ҄ ,2V he3j0N p *p7|4=Am89zQ]]Ԃd ;J;A٘ę˰E$vt}L/1QjPGc.[g:Opr$"'8^a#SKQ[#M<M s!jd6I}3Jp/J'= H)`I*屋-9QOVT2S>e:)c9KFvF`hSfrzHdLn:;S;ߡWnm:Ee@ebKDjOJVFڹb@xkV~ߴEbٍ=S5$35]dS0'XWK?Zfger\0껴 Gbز1q(Ai 1*?>ń/m3+,:k-vJtAOEvĬL=~D73%pc&Ir2ֱ2ºwFDzH;%q+,|$hC7&b+ERL7?ˮЙP D(BcpV$wK*hѦt>>nNa>D47e<}}PZZߒŠo}R=ڽGs]ZA@bР0ԼT⦊<Pn-h$/ڒAU׽9ES Ƿ5  5j]$Z8hgL-Tu-fB} A6Z v ܋rVLYw6XNEUvV81NY6K}(ۖKHwyCBk*"8@cTrH3G^R"f+Y0o'`b٤Z]y8@uf#PK9dPJ$6IS&d/rHe-?Ɍ9%S  !2BLX[&MּxR֑pXK߯fi9qlmMl$TdX=!#D"R #oDV"3g_yo-,)e AQ8Ehe(ddw@0AO"T fhN`ℜNNH)G0>bwĘBCx h, /G!}Yۙ@lP\g^󤹋#!$:3-3pPl4t=j{EfhX@b|fݚ ϝ:<_'Ї!I{ĩJEc^V4DD UnY&=D#[G~LN neP2B=fvh'J+dSd!"xYN.):R{T"FrP]$Keʩ('vf܇z=$A :rT`TX]baHn.*Tl :0Qb8JC!f%Mřxg3]84!8ʤHexk9nPm9+ ѳwRhp NR(R_!ۃR%-[o\f+>hw6}$<oT/*=X17ᑤQ\x" #pyy"u 48 tQ38z *E9wH61 ֖uzbԅ"- Hflt\Mk*<[AOoUq鰰֠a?0zd$- V3:W4Q2b!*)M\!|Ji|@EUFkX,eT9dq' a1h LFNd='kNBǒmkO2T}Vh$hKP` }AORCHF76=JZƾUG+70R8w Lψ:{L,"[En BN.l eM_M2c}'<z35 LJR"xz/a}t~SYD)gA"!,tp Z ~O+! $NS+iKF$ ۴\B $kGXXg/˗")Ju]O1 L12I?957o4$X>lq>Yb:lG%=5%Ž[sZ[7\Gp&CaSwmDHa\ܢ//F Ѕmlx""bY@$R2*װ_丵Ocs( ievf[Xf8WΉȓ:˜ ؽx0bD vlgR 9>nHIS&(V\CURуǁJnq>83]U^d=Uf*ЏM'w_b# 8^T нOeʘRLu2*0qV8]I=/ ;) a *7#S&M`d24{{ >i(|9򄐷wCP߀@z"Գ}!h+*FCuo*&` 2;x} c&[萏h-X |ߑDPP7 -28| n(ZPm5`s }VԡP ~ NcиssPGec7B!G@m{G(%MIЀA_4e㸌vv1lp\4.ҌŽ쵆tmų9;i`Z (+&m\@y<Tjs+TK'.V V(N$G , qw^2c O(4:T>.%n~n`7xHM]<N5 {0.mlک#̫ΰYq ӕAj14Y`;cPS*@nO[CP$=&J:.ʰ̒2lBV@o~Nv tsTDR 9 л8Uo7!F[z`s9-DIŒS) y~# @'@e|L4dyށ w(G`t:}0p=U5`3H|eᐒ!bh %6b$k INҶUcjQ0!P썒7ae:F3Qˤ >|e qa"2R q_|HaZ'<󶳕!wԤC渖;a1cA'K ՛y~٘mˤb0BLCzr?G2blɑNI ҁ5`П%7$)l̸F _~fM6$UUX?!ejp,v$#4{>CҚ7vdY[!L<5fz5/~Asn! ֗{O]iv=^Aj$f/h^DSQ!:O5̤ؒYMb|K4:qQi ~$m' u&խ/H٬u6;G@f cJ#IOޘ6yng_"k7#uF{vA4n8 Of!i1R{!^Yh?kqbw\ u ؉c؏7݊O.j,PC?Ng5<[tAP3l$-E$ )BdNOŜ!|87X<;]30hAv4`b  ,=))2E]Ifl.|0Ajʪ(m$ Q X%)Q޼&L&T'0JXx0,M7=b\g) ./',y j)Y%S'qۉ}mc|7$qd1z[9Vq rP {pyRDJ'(N#g 3҅#*4dR+!O|y/Э¬'wC IƩ𙽞&f rR6b9&KiӬH߲ځV&M"²:-(1h/=j d4?FYK">y7|xѺ]{~Pft 3$ f_ /sم/n}?]6νC/ξ7^_!w7 D[zެ n|yz_e;_Gl?Jܺ9mڳ[w/w-<nc\Qs1oojѨދT6cY?j-7"r0~滜x W(l<~\V.-F, CEXRlf\>xE P b!ȒU1303 G rHzd7C],7htVH$L)w 7/pdDC?Xפ ɯxNFa w8yXvNtghpT0zqLݯ]4$4ai l;с/foԳM>c+ p Yen:`-DbzxpSMG|o0-1؁ޙƀ͉: @&|뿧^>JfFpE P&VܪD0:Et{]DP;4cwy\-_#>xk$(ޅ&{Y8 !<1gON$G.<Š  u 4\FK95vSFVs?q=΋* yp "I{\%j57'P V&Jvɢ)!Q旨^25ްޞd[v5 r,(bE=WR( ; B[v cb3xtw pbhCzhn8;T{veժGՙ`$0v"tAf2JњH$^f A- .+y`9^|)t^D)I| ԥe$ u!`K)mz{\C,}-S'pЀbYs_o]E 5}G'\DqT-.sE T̿A߮=LxNQpN~0-% G8cK\""xӟ# E*?'VPc2/>QH8 T|iqG$G#{SlI4\^&у  qV*l ?:6wpE=ES\&VN)%?2 QTlr^8|2iMf3\|?Npa>gB~hIj q1q5ӄNԨQ;`MF_  3PMXlL&!QSst5=`>a;Cy5#'wXRTE%z}t^x*|HWCӹ(h+f՛ jN/e@KP8/GP:RGSNH~7N vA1q yr͝Fwi%0U %O͠uRGe+"MǧcPu;4GY) o_5_}cj$i8?>P VϱxrnNF=jHՏ#aA`tŖ^+cl'Ipc[>D-hP.M-8zmX$y$N@f4Ȭ:(up(eAЄ%df;c@9ðDfۡ   wx߬~8;$؈2$@/+#PϝѢ%waXݶl~qX٩T~C,\k/ֽps@LX%^F1#ShhR+c !_w fTum7}T0U<ض7N#2t"DrK_"2qS,H\K7 *M.ұEhnʸ}Y(`Ck4DS"Pڙ'ݼ|Q߻,̅{mK]{tɮ=ٴ?*WޱV㎜˺T[_X͐fqp*oG6SlStyi}|_w\G.dBI֛22cJP|&tyg,A=XXgOlW/6aMʝ4a ɍs~{'ó~GHC񟼱Ovɶ##繳1v~%|#S>3R_U zod9\i!.Ԁp`0MRJ)pQ6[yBMND{8B&ku$e"Y%en(0Ŀ_ }r@ř{ f3tgzsUw뵤={۩ĖuI{_drH7yrG,Ʒ27L W~D0,QGUvXb:Ɛo#:Gw$Dy0wuA3NpJ9J*WryZH ڑjsG 5A\-.j._ucZ՗L!Zm.U< 7X6UWK5\&rEՈՊ5#i&rmR-*pS[hӸb (<;bm?~||<@&YYlŜeq;w^#Zۊ6qdV"gm##KI D>T;QCt2;ݜP Oa)b 5JHr6[\>H&Q)I`$Nk/ :W"%)~%7\H!6+aB3=q+ъA$1o)T+jFkDBчH1Mi8F gn6hLF4OOqr4:VȬܞR]ц2ZtlEt";QޫJ|:%GCFN|EKPLJ -Bū]n*5.#1mJ[wYR`55M{ jWb+S(JUɍJ 7("妣L*q%27 ;Q:B0C3!zpwME[=m"T{_Cɧ{SerkG` )} ֧0mɮO|$Ogײ\Ul~Vl*b*vv)[.ͩmGWI c*5Z)U>#SU3@ŷ*@ڧ 橢q*!zt=qxURD.U0K]U R >LQFSf&1:-JlPA0-MBg LsvV50@D.0rO1@?g_CBm.bc-|ŽbG/]]+]ci_tEsxpgrwY Q^/nWpj)=J2u$Q4TxǃG$b 'TqlW6ґ$8Z&AnaʚU#03 I=8?YBhTu|9|!/MF/lSb1ns-#-\1hT4\"3#KL|=j%bgq\^NNX|]ƙ_"JFn|aPnz}'$ '1ש. ]I]by[E Ģr 6Q6D Fm>W;Swsgcgc e- cn\gߖhr3ajEq}9 ̻eSR&.2=e4d6b4KZ"l]%ant7sZWÀlk!v};I&!aR6>Jt F5>Ր1-~GwΔϙ>g${:}δa?g17 T7mEI,2FR% 1i&fXYM% qdLc"4I"Cl:&1Ψԉ~1X2"G;o;ziyV61kiK1v{oh(njC[: 2q5SDٹ1B&ZnA$w)fE:lڟ Z0Ld5$j؍cCNIF=м44mx4o\C]lh:"gO r+4}!fLxQ -j>/# vv%ڛZݽU)^:ܢs G\~B^,F 0߷5ʕ}EQ,X1*WckK= i ءB 4<*t=x/2@?$1-ʩ&zT1нh( $]I?QL&bl3t[8ͯc>,gy5;G&;]0[}&*0Z~\")~vv;, {G-jk%qvv!\`viw+\!iQcRIGݣp?L+蠼p;rFt#4 >j<+X)4^K2sw킝fYf"'NH gF<%[*YawV܃Za*:W*v-y[~,$UE+#qECH?P b\1uǨQ#Z=o_0zkucm`r3lWXČ~]Q0g&ä+mѡ!}B6iU3ӪLѓwri6U#=k} /F訆S3aZ!Lc勉6R 6MlIgQ)(qJ!W[{p2EtaߒxlOۿ\PhQh!lBuȭj&Š3~k.dK<>g8"ֶaKOpG&B[ VL@,N bqDpO^/aBABt'2Dh 41 cQ1Ha /)\\qSWDz%P_|:k,z1fScQ$S?ҞzzĝZDW ɼ2u`bJ<x3ZMٚ3A!lmW NtVU^z|Uqg?Nfj;kةAZ Go74NN5]G=5ё^Ä[ P  ! F-0bv iMz6@衑.r&3Ԣ%С^`ݭ5 ~mέ>]{e0 n6봜tC GV2/d$k<6a@˼-_51@V !I rBrS}:qpk4a#)[mL|`GV pGG=Ȭ6:uf٫LmTs w )]ɐ HQ~xKJ#]/+ dDV]tlSBk418;1@ .^|] yV̻+B=vv4;9Sz-sbG6orESǵ ?L]z2ܝl1+;fUo@p@fͷ4rv{p cl@GL`N5X!Ѿ7܃-} 4)igMll3Aʴ֕}%RRp&h A7Mu!'W8X.(Oli&s}rBBmpzrU @E+3еHN{aW{fenu!XU I"({C=j&oCķw.;tuXת4hWAbi{2R '"%~rAY;&H6q<"{ @r( ry\,p6/ G JZ%&Ť4}s>SZgfRUmw֍2Nv(%cXuQ]B{!X-Zpk1Qt+ɥEtނ̍}#Y:Z̃s\Zf %dg*}SA>ct^=bǰ5foZ\")0iQԂA q<ѼE>LOt%'/6ցb!)Tpܣ(*T"֤,*&4O=.:ּhenZO yOwge%>T @'!Equ|ɾ(B w: u_+0!GmS3o/D)VR(5L׷NT P[|%/(+qFM{/Eٌu"X+d󅗹Iw;b!&@ o<>N"oj*?Cj}RBֈzn!0S8XXf`:"`tTxܤ?fG]%eѼŢp޽b-%J\@b^y5!e)'0<+%#9vjbz)f|PQ^Xktb{'<9LQAC>I),)mӹH:(M3++ϵ*UͿn=٬rij~|C>y} n *hpysAgx|%~mmݱNMD@|`G$eU`Mdĕ>[UuDU@9̪Qz - Fƾ'ԥ"i[O~?艈(&)I,8+MWD% A dx)ʤ%#`T:`c9!XDZ<"`vs|;'v~ JZsPG*8xmȚx%qzZbyds%[ֶ-p(Pﭖ~>~9P%5Pu_04dJ#f] X;Y,r2)3h@FM*A 7kNgsH3'°)LNrlkxp_a\; E nX#h$-;7hhUf⮎F%q2q'"ՋyՇnٯpovy.MmB,\sX!>i2"Faqbx K#lUh)m$9Ki) fBCMMc0 m`\7SCROm"?o?:pXfҟ`o;vAo6tyM/䋤 $-}̧:Zh7l1CD6:nv6?BZos+X]_ :;wS@ VŎ:Ë́<)q({R]hi_ayZaAD &?w~;fꤡ78v`X#kiq VhO58"p+o({LdnD=Fѩ 2aEes#p$F;kڐ"3&vG7{nתщ&4D+ Si-6'k_9 |O66yD4sB4v`m0<5T*)\h(c,Mo&T`\3M} #lĊ}ё-rL! `aiT8 4TIGHόl) !!lhP?*OeN낒w =J"v!1rf(ˋTIj,;>?G}vZ[!E3 |6(Ko' ܀qReۿͽgO=MqG`A1q{$IN+9 dc?[vhqGճ9`[d0wڇ{Ws8+4,p`px|eλouq`E-~H{ ]. 7|g<ܚJIuq:O8K9x|2b}bf-Ļyp n?'j!<9ZZE}ӈk,k8Wt|tkmUc饊tZ)qQ!)lJxl%;VU8U"TpYO]\**RJ45e햑m=*NҕKM^aG(ߡ]1e#(蠎%lc/  <|R,g%㜃(?AO[8CW Jpo$c=:(3R% /.3̹b^D͍ f ]PEWZYjsbǜ6,,99L4UJuHETVynl)’,d@G8&\&raCes:25RÉ_-RIӜgz-~99&6.fXʖZP;"JMr BrvW!6VקdPG|.ۮu\}۴NEPVnER$rn[X}z$! 60iYQ#*t?vE6I_]GeP:[wdOpV,c2H  Qwͨ ,6oeKkI 8?{u dB 0QfId<;Azdh(%1 bɗaBJDvdɽWP|0u۲(!ZSmʩ53_#+4<)uĿ-›$˻hծyy4Sea_d|,w eEwZ# {cyr&H I R0PA;:5+ Y9޺K2BAf,ʇAc1i燓LG@H'56֔[{ˀo\}Mz y9tB5 ȿ6G™x4w:QAK0* ";=L5w5,,'8{iOW˓!IGO>śiKekY o|cN4`^[JFPޚFPIP3w6hTUBӐJ XfztW>f(?k"䛇jSWtR}Qu> \7dEo Xd`53 [=hQ aihr%-si]hV{| 0 ꦓ5_Z$ֽr>G (T?4nո̧ W^XYh99 "%4iЌ8 pQX;0`~v\c e)gFox6mΌIϿM:Qc֐ 6!x]dB -x17s;nIhK;h =hx۽6Ga ~DgDErѱ1BywF*MiWO") dY_rl}, 0BI[8Ѓ{,-GjMBRUDOaU+:e"6\4'tJɡ~brD~aF!`F)gX>]L2y^Ayb7rq׹q!?#d^=J\Mlu~:qF7eTE{#hL#$I\XY^CykH~@t,r-XL61;Eʢ7{(zD [:aGqr錍+ A埇?'T<'nUpAp;rn%}x*!-釡l9׵mCdzdVlHy~z8a1u6Qs6>ΊqR'@`7VQy.j,NJ/lz>ˀbHFBI'\_y<8늇ϟDϏ7ho.Rg; 9nZ`)"Iq' /DY[MWҵֆO]R黡o4y{L0RfG:^VفI[ ysЃ^2/16~uTsjsnD9ٚ6h|H@]47HW~->NScndI{125]U'8K=٣zjWe ޣSӅ`:?Ij_*7y )='˜M 3:"zsU豇VS^+ 18?`({DE4'`;Ťܞ4D~Aգ5&W4)HcWHm_AEZ GHu"+ͣ6։7xd _P>SxL.9eh_u3ժY5(Į|>)Q`6:8~|ul;]-9MA[xiW*UO;t\Y "m&=g4FFЮQcR)R_i/_VJ)ez|4$ f!P){*v_Cu P _AlV7AO]a(*Yw+:%2^ei^9zV kѵ7uRݐ20 >"'Q$V2!2]?!W S0*ړ@; iZ VvAd_ 2%vttHui+?Gnyd(lr .J\ɾ:Tjq)k' %Л.ɦv壹oO}VAD1W~HWhyT~kU,!y&H& p0G m꾒O*G/ңE&-c;_J>j&#Uȃ?!d/_-Ч・_S U"L%l-N:晣נ%0>,x<*Ca񞑼 ḤʄiquKUI1v#Ҁ0Bdvז9 ti)4py)b^-Y9J2 JB5F(= {2$uWg\k^a(@,-8V{HBJYdhc\X+턠$qim|VqH C6]ab&^B¿,<_A*T"Htc[6e*{T9E`4]2=X&:_Wl_M 6gZueVtkO\o>';=a`R Z;vr&-$!I`êXr%"5jxC*1l}|.Ffj~,'!}ש˥H721HSK?>%. ̖%ݛ|sB(ɰհ!eHJ@T#KֳxMsy9!@sk* ܻ\b߉%Df/cM%Ah)QB ( < h"U2 lɄ {b 0N;!؇JFp'(" Z ˱߀st+*{*D[+.sul$'z8(k:z󨈆OƳK&)38hWr%wfP}5RQ2 =ok7c8HMx9Uq6nbZ2MOQ>8!ʟgGkIO26[s|ש趴ڪz:i@$vQW0'rlT0,TkɁ 2/HB6gJi!CRBI2"gU^s5ih[bK }4TgV0,u4VS"4_JZ+V iuj-fv!ivX]ѳ^a;FU(ĐWa$ E$E>lN"rص<1-Ǹyw2Yne0b)?^G)[l6!d`g5+=kl"7vc"5lueGNoqnj>y2m }c{6s\ZTnb.J.cR j0rzjBHVTԻURU-7!V9b7SOy1eHPPɯ`ǐRyG muf`a 87a62$L|"1,[/ZP/1I`~07ctdt9VB8p)hz4ˆT47ҭ-A<8հj pwzxh ҝML`%iL!:Z ׈b$zJL8ܥ֒i8ԕ-z^ZervuH!! H>S UTShah-+] ƿxsw2%R-qzsߢ on%I\mßN\dM۲هE3/.*\gL]!ۨ;0@1̷6F^틼}lW:z?mpAVDu\ƥvqjnkqjhrv8;xW7RV%'61k[f]EocI~OEbWRg|bj£8}Z&ŔA+_o#Υ(AA_0]o^{1ZdggOASϔMbɿT9 VyoJ9M$=yHWr+e@tH&L3Jwc/Oq o oH+f׃.A NXOh;Qٟ:gJݠܑ &k:ǚ1O1}^2ԳůAhVt뗇j1 `  gO*ӹmb@!o9-/iE};=QN-P$Fֺ Ϳ4iuPSC`_4 Qdqy c%U6쀣Fxd`TYY;ѿǓg'2?c/ Wԭd<o{GgbR#v曜ՀJtRZVjkT쌙j!뻒D!(ժGo3ˊe5yԠmnS[Q+0gՋX1-'R2 M5Mo]l]R+c3Y$bG՜Uz{ygbHޮWEH?ΕѢԘ \F΅ .DFn%?7yѧQuoRѲd=hITz!Ȁ}XS9Oa486>o\CkF[)ef95K^+R?Gsgn+8fq)z}Q,]( ADhGqjDAI0QHb,j;RM gqOΟ̏^ڴ=m < z;mH,,S-=N V$k XöWG 1iu~..,]^/]!:^?{)e4 ![e !]{C"vN{b" Ef]h~i˭ypVT:]qB uų󝮢2fH&V'{\B&8\6n`Sq5:]tM[A^9\1XX6ɻԹb;zv]MwLWaAJTLI:@*Ex>BCKs zzEy=V15>~vA.X\I"&Sjui% PIm}b0're S ްl12%Lj!;cӚA&)f7E#E̝|X @k4Cr>b uT,2g: aIaJ‰ؕr%t! b/m.0^ GmÆ v$rtY=.OVC&OUO%"8=lH/vJiRe`ULNAInEIwhD6xW9/ xfLW˵jF_$d0.!Me"zvL(^ T ݸ%H~E/ 9n10]͒4cnPa&FٸQw͆ñḻ\)%MV-KǚukSK][ .N^6k~"M5¼⺟29%↭Ovp[gz lk:ԱJAb5{a+[37ȯY1 Q*Wc3 Lqȶn1_88*ꭘ=6hڝ]\kDRij>~rנUEǒKyj})AG&Uĵ6CwKT<]T{"4,SQ3Wܫ2j|y0d4IZu|,t]PKvD"o yl\ t|IB۬,U**+eX)tw/ߘfL4QHoyQ9XctUqFdb]`sZ2SJ~eʝ}/S 2Sp9 Y#e4٥J:^3n;^ [{#ٰFxVin2,^hhD?Bo D2j|V/_+Wa@ࠑhTp:zءȔF էpkQob0EKi$M:( @m!Z׳g/611Uv}[USn6tr'lȃpJԥLB`0EN*uPh+gz*1$ҏuϣyQc._#\,| 7;UZ?Y=o咍w Z)G?juF-')bPދ\wh].~iAgFݕz>< A /}Ͻ0C흙%4iHPQZ^/ Co+Gl1cnA#hsm>K~ .z١Ш“&z抶Mmf/gWMhFyꘓp~ vGx _(gu4ٴIY,Q> t-ߟc";YE7ZOl,:PO|?5^=IuWlJ(O|VLQ@=5$ۨJgg.Lyn1[gBR[ u(O&r9ƣ.pq::ݥfgt NG0k>y2fwI6h%PQEA>ZSU@0 Q̓.;Xx8 ϟ)^Y5ʰn1_:.T|*C-g[kcg|z2#x,xP Bb*c^J/gz<_p:h* RLC)qp XA^N'O jom<$ckC,wLJ7"o~Dl ']c\~v<3"P/*8[J))@cgł(Z;GtEk(Vay+KjGSc4+4kMD l: uO]mN\u(giMjfJ$NU(*~N;lJqjk^bҜ֩h$4NB7#csZJԧҒ aY%qCEFrg@_Y`A- 's"!vX1 i&h1i]vrUJkp[|6GfBh'2dKl=j3sx/eKc0:ԹxN.H3:6W(6Y'm`)d a9RhzSmg/z&@wPޣ#.jX#V;mc?Y)YA鴚<hu+,Hl~|ILahx`y <kfKR?} `'灊(B p vKJ׋Afg\~P:`sHJ;`&+uH]bC0C S&YXE PR!]2*#k>]gkƏ =\hW" l&_ mk3AgcALwv-ɬ1On:ú~:ۤ,VQfH+'80~N.WOrws)q$QXL5@_S^|GVxY3p.Z㑣$rh'+m5: v)װkfd| Pҳ&^\ ?GO+鮅.}+{x-ʽǖ7enzTh+8]$siGIlN+K^7ܪ(f<wU7f׊W &~/p]Ȋ^v F1t/ =W ػ&-Bl75- \ :bNmw8.sT7P51wlJ?G֛㲤z* $+@4IEy-E]`UEE`sa,8SGK#QU+k ZtsKV籒Yݽod⮁|9R|:Wt(߹ $8[oE[f^`En2̹#:]BM (d."ge|RމZ)# }<;kҷ?1 k8\nLoϔmdkނz(~֥"k^C"ybg6~A^ˉ *ћP{qg%p^' 3\7,*h\4՝MnUb 9p/Zh(xto6ޕc9vDv*z? -nlo}(k9п;oH|e%$iؽl":FDwe|$3;ax̅XV|H fsL 1]M;k'rdcɅ`$g9Pr"c'ʺ>Ҕ= [Ĩ[{gts3bwq,FhŶ^% v$)N0/ ).f̞݊2-pc b~P@`M(F%{<PfX.+-(zuV2nTW"ԋX[ա#:/2G2>hScVSU?Ó>fVF9p<&*r1ܔz]OJ2nߞHh>aLv"^Caf6'w.mngRs} f.9-ɰP~aW6OgmjRr66n2u 󀡍Xol6&hokqנ#>|1lw$VuPvXUEsKyYue ۜm>amAX)OϠW jv5+ qܛa^UqOHu;!(qĒUA=ly 7Z&%*>$E8 $4C1fe K xIWxke;8[-+hnaHxTALqf>OCtr'vX tFGu0RB:K?Q.`oV~K>@Хٗ6at.52d8.-䇛jlmgtިfZPu nY<)R=QٗF4x6N{̒z>ѡԒP⨛IبJfE/h_{P#N7-yMT0ͣd;lLbU{+T[y}߷NV0Vѹg"KA'7F-KW9cy.zsTzlAU8zݰ=gk@WxМMO)oN9]H͟R#_!\o\A#YI\v4IЈSr8@m*ZNZ]EGV3"i_FjA)R%jbZ=QeRrz;{2h(*#pbTd}P4]p+rW^D PAi+T1Z56=(5*M3hhqv%txԷ=.tz\Yd:ՠ;JJ{ԭ{]XQSvfeKG˦Iۥʩzv;;Sgsgfzn>6DKrgΦh]|(p{j,duZ^!uLKdDCl'(U~féfF1HaI}Kg ,e"j1a^U\\[TZ1Ǽ+eYqϺ{eǿ+,Rf,Vs2E" o5qPdJUQ7Q\Vz( Gq#O'[*TE,vinXwF)jڦj[d3W!<(8fuS(=)UlǖI$on{,MGwMjS6P7%KdfמB?f&jf|WRFj`tk#u,Mf䠥LDz-2Il{LN iDTfDnÙ$<<&>=X#9vG+7qG?؀ûzrU}!MyUeSz͙xV WV&֕צf$%fk,|r_xd}5jw3&?FL>a$Q7Q@}PUic*rI[jY5Qg4`d V &UAIfhwkJºB[qчw-CnG. _-}jx2**г^ 3&M# ~“wu-%yp>L'"f~KzGd tbacLdIGl#zl/  %[dxl-q.ZhT[eQta&3^םb5ԞWr$rGZ $48jY+Um+uR*|ܲm7D"]_G6MH#b)yi 2{CߩbHmuN 멭˦ԅH<{sW젴jO';l~{iYs# -uo4武vd@Ugxj:-N=Zz){RV/_En{GBOoE[m3ʸkyawwD[z { 1U349QE#޽!wVb]{7b]-b*7$W#rފ\0|\r 4PX&n(E=c ?]dȷ'Eـwk1ZLiz'Jg4ڱP p5Be[{N]rPjr^2Լݘy]MƆŷ[ov雛G8RAXVvqtBž\S6S"Nxl5Y~!fh&Ut 2 [l c7.񍥪/oOG~<&^?* 2$驘CEC;h<1J~ Ьjkh#CU3*k+Jfn3:)w*8,tx9( LCk4HK]TfLll#MBbz;~eL -7=O01 8N G FسDzƢXي?[2S˽cYW$TwxPbW+W?o\|sorcR-C(5TÙ~w ߑ~-3;KV:ܹc[l?Q(MiA[f a+VIV䛑 2붥l VhFǚt r7`BwɸH5;}ӽ5B)DA dRuA,mZq4N7wCi:q41|۾(ac [#-E/JNiS:?i/+Jo.M(Y߻)/fͷ60J=0$?o*93ɔ^deu3d⓶rZm\_UQmϓ"# b%lwf,,KI; tŵfǪ$.5W)G!zKD= ^!a^gZؐgjl zD; V(Llz1" fm@trk0c2Cϣ2Fџtp>÷?Х-$!jBaxXRH(e=*SSyUHڋϦ*¥-l1FZٴCb#Wbd|[3wHԁ0iByTf+'P<9UoVG}"}v.j[[(KI`2֥g#|D^iux[Oj6A„A:yJB[oNN8سı[QgwQ*ڀo-nF:R'C$IXPHhLvdpE8hMi*R\@oGEBç?4XD>=lD{iT֤ `~ j?uLyuudGlqFE+hb[04EP^{3Ihw~̩w㣣_>K֞uo|td{W޷^ԚFv~l Nv'׮6׆W]ˏ ٽ}/g'_5+Mڦg}YΏQ Ђ|pcK2=;"Mu)2n^ -c[:ѭ=1ޱ{r^ ֱVs|!/SUKNw6q_+%:䓤?< '<~zA18|el!XOXz|׼@&!iB$ ]-(5ޠH5n`W%}"LΆI--c7R}7c' !}le"]eOv֝G03\ɟNe!ydon }/JS'{u0 `)B]?40I9 %t Gv~@EG0ϑ1@ЎF3faRO-+WRM?G@\.ėBQ-` &3R<&;`s YQ5o} X( XY~gciYqyX]TS2*^)k @~a;Z \ kLRbo,WYFF<ח=~nQXe+RbJx,z||rxĿ*" bc&Bdݗ2a7 uX?>|;+=SgԺ=9=ce\ iCL*t’r剫_|V'\ 56Gt 9\ Shs7d'xv M%ws}ڤ ^a P]KG!Z{8mkcYq]5;gKd*w~.qHj%ӄ'}U;kX'uJ 4+W:"SԼR+42[^ΧGV12Dw'tKakiMpտ`Bjq[j\]<^Aܣ8 C<*sG?gi= 9?O'- iiJ*YxTt3HG]Ec9{{&nUw:l5M}8I\d{"H:ks봖^%[7{&ymM0/&iR[Ƴ.nҎW[n$aJ2JG/!j_PqV[;/Lpw]a \cJNPo:yq[p*n.T_RfUǍ<'IDKa~M>rNCWɍ^-5_Nok{n 'E!86ui:s[Y9FQ+";i(P?j7VXbQ"WW;4r[G"g4z3:klc- *h0T+4SnP *kZצ˖P /_ T\y0 MX$y*gUy+\x6 ̆{r+5ޞ.dܹV>KQbW|hjX9``E\_ʱ~Bİ*Q?d(v1O_s 2dǜvM\0z~T9-"؂Bw-"}vInoVpK~>0CQQzԽE⹟zJ~vU.+۔Yf/ft2sHJ۹JդnR "=Ii9H ia^/n Q޿U٭{udtF}6Ж2+lQ.2^kńV Ca5v֚ F/Pg_Vl[FYwV~2t/F"p=B-ߴo:srP;NЬ;smXMOB>֦O'O(۽?l>xqxm%p 0aP-vHGs_3W?l NKxPz%q]Ҍ5Aߓ3D佟-+(0QVW?}&* z5HuZelsu9Oej:ykV9wQz C/ ڻ-#~Ty$mȵQy)ѵ\";bt]yzv0gd| 䧜Gf*>k4t4ێ( (Uƽ+;a֒V9 OIuV'v'ӷQO7`dd]0_u~'^qIv!Z3k]NxnHr_~?DfCvXr>9@m$–32Ce5vcV+?r3LlVj#Y- S77]&b4*&vM!Ue.1[ˌe^s=U̚'!}VZ>K\/KvjNv_}vql|oMm. U,]){9K}عԿ_ˉh}2\x~0? !+At8>؇v9dʔˇ* +g1h KmLՁܹs?tn4[劦=eHhʕkThn?OۜNjA1,b$q Z ;+IS"{Se{z39/|9;q}oV`s9l)cZ@L(g,j+* 鴧]` ~Jp^ lO^tY~ǿ~'&nnZ\sQל /G j8ta铻#o;J\}P0-Ng?,V)Rk.j4D_+θf`γb9ybbmaPp)̬=5^ٓz*ϩ;;;m_Tr*Ư'uT/+]Uw,N2-=\Rq\Cծu@ebQ8$a!`*XB1+ʐ=M6S|@ܺܘ|39O#^ $?yrχ"\ീC0#b$Ϥs]mqQ?l80ꪅ_8KMmґOӟ;3ү\!9Q(T쮴Nh"lYc7ً$ &FWjck ZB˽  !F $|<9!*qdhZ&Oɕ b@&I '/nl7/. i;]M:bHmA޻&A-iӽ(\lΊ^)r!tT%1|W(a.ď7njr >~ã/ gA[vT}!]U`l;>̿bsˣQvd.`Xd߭yyH\p* Hgϔ M/2Anؽa<ƿq/V }Yu Dq/'M %˄ so8܃Yj*/H76! QhܐQiUg!$gW$4#OarN8bn+G(ϸ$a`2{~qb SPv > dSĕrdH~rKYN+ U+ B*3;?* /@l!$EuOt su$ Y0w^!0sNg%{@5G3e2Z%-/6K/zp-h$J>Ԡ'0;ЎT1M:nm8eo(AtU>o?pE:Ş{eӼS:Rf E{f~ǂM@UgG5G;}* #?LB9Wla%I@ /i=E}a}7ힴ#ֆCf5JP5i*2u&E1vONn'_O%HX/͊aKZuzsҚy]Zȿ9."mFsayU_gR$FG?QP /*m\k_Ʌs|(.쿕(*ɔ׭j\㨚 a^qnc{NA)<~lbxn$ظGחMM_23,{ǩugNI$~4#5]7펪YMtkҔvk_hؔ{ ZL5)(nÞ8/WзjgēU/#g᩻:rfS[~yia5<\ қn9{a6像 |5yt1Dx&]l#n$b$2u|.׬ ug谭Q Ҵ}sw]ɟgȮZ{y4q>Q|?jv/ExFrFJ&bb瑅Mkׅ]vj)*wMeXT*cFYv(j[˗De%fWQ"qph40r=W::vHJEc ,s<+o糟-iR0Eě +!8Ygiz<*d>3.޳θ)pRPg)Eಜt$R6Mc@5rtWo_wh ͍57nF+nm(Ǻ61XpNI* YrYWL6"A;.h?:B ݣt,m*qUA:i_0͏㡑rZ6ecQ=]@q4b4G[C#Γ+LaliP.ұ7u۔Mh+H̳^4`9C:hUFe~E6zr|vqlN<LHm^qTfڏ<;V,U`}Cv@f65]ww_va_?ooWo<۝-uk9qt?hx3ZtA&Y +py.Cۃ;Z;'k$!L"t[|}ђx53Rr:w,_d.jTrYHЄQ3|%9H9TxIC+QXȔAؙH2+K&}'R4U]{ <]e,hvx){$`nz%f$ IFISMx!I ]ov/=@V/] e!0*}.Y0C!,=V)(QJeBfa?K7bX{}6V=v[ؑ@yhǐyDn1N"6Y 4*ZzPT](li\KgNY?0nFAGP%x]r=2{ԕ#T&Ko_$Xް+6G{ iPÔnK[j3$q'LÜjEI)c<oCw\Tlu"·h 8qhe[Yj'QIHW8M*'on-+$Wj$J)xv(69Rb}X} o:kn/S j4-/^Y=-E3D(řBJZPQCM׳tF.-J>"|w_۹)2| zP^`RcOý4@NDƫdDYeF̕,~JAK&& jUy! }I+n=-wS3r3r-/lM[9WRGwR&WXiQ4$^eUl^L,k bS(TVaKQ}?> ȚJpIH˴E}ft\Mo-S=,٠F4k} 8#`Z,qW0]g6}5z@(}ݲwrF{Q~d;U m-FDekz>!KB,86h?#mZZ;,N^N:*644ku`6buD2[BJX\/3f3!OXJ;_vxn?fHV$~ʱ:o[ZF>L=ߵ\1ډO'9ֆgal Mc0kTc:}\?NJ H~y?2rAK$>TpޓƜ1sF 7B}]2?( yA1xR_"wa1+slVI$l'Đ&$fV88KyJ5:[+ 0|f-tG}F6$w輒+%:R q YJI~, @Z ,̞<>O^NquDwܵ nd h$;vX32"PcSlV[˟w:klL4L_;&*2e|[:%N:{M4% qIx{on&/0WLh"NmktE#J?yݝ{e_(wֿt7""_ZV6Yl)Įhɕ. N=;ʠK_&19¾öKqطf^+>+*|>'o5])O0 mU%a6|T_5 :]jaV.b܎ls\Qqư%hb㍷J# sOc~_`0E`|=3Z?>Sfvz$V)-Z|YMS%K]f F.X.5wMM[ec:ORx)E|K53`mm|!ouppIkȧMax/N4eA|v;r4k)$xP_|#$?A[.Drh<'f>/(_);5\7[|jv?NⓋU:b2`|ԡZPav,1=BJH.o܊qWzg{ҥ#/gP=~ׂ^޲b'gxX9aRufXX7rmn;H17'ܬ2z=;4&P؏v$W܊_g”Th1_3sU9kBL>:|;*cMβg%aJΒfWn63`yҁ,MaվֵLXڝx,/i/ߝr_XQ^V@O咐V׮Ժa^ +ߜ,o7UZMp_͡1_ko.rlBl! X@]T*Ad$]kd~N`7;ݳڡ-vC:3HCUL8}d7 .c`[:rδqV=b'ey9R3iTXlZc&ԭ0wO.h;z>&K1)+ ?(cHuyը %8U r`?děd#9Qհ,p3p&UrPR .~LE@ =@p>Dv#cE|9O2N-:#Gi[˔s9R179%Bɝn]<,/>ܞUNyd(_Ǣ ^3|T}=`o*e5pc6e6 lbί=XJjY~'^$PMDٻs)Yhj[Lv-97^֌f N t7;(EI(m Ѩ.~'Ԣ $BՎq|ă-)JB2E%5RΣCmQFgGX*Mߺm/TaoDC"nGudy**QQ aJ 1el2B JDz+dLaf=Ε_"̔vt?ZU&䉈;vر_/@C6ӋQ's(o)ƇxTYjFuTVAL PٕxLi]s\U\ xwK" bhK8nhѫFirj*ormkvԡJ2\Kpuɸ2fعQ3UWpsQ*ufLQ\; 0mr9*ʎkP>>]c9/ȐS+9>40skuD%|pUuGdUi$H)!@&`KͪymCiۄ+qg,)MdλN+rȋt(=/d@ Y\iQ,EGi 3/}`r[b'a&֜ !zoi] @?HA> E!V }2O0tALBɝ +Z\"(f+`Pb#7jӧhI$Ab8! vI"Lqr WpǴZ̲"8|Js9jO6YZ%P~UeTbsHAɁ`fɨ\uS+"J} -򯡿(ѯ^@M!Lui:)cKteRu=Xp#bPn>Pϻ>MQ(iٸط3K \ӺPĩ{Hr̀cբΰFuPbKIU|ۚ}cܷVw*E`Y _2c`+=3_=[u2«6qq##Ko=o¶h'XMi{'@6AFf*?%?aVoYz `ie8\Y7>|L/uBγKv`~0.̙Nf]:GmMv>>suy3pxq@XsE_#)kC !ʒ;cCwvN*#ʫM . g EZrdRñъ=7Wz N_yrE :t5p| hXn#~qz 8#P573^"ΆiH;92Cqa%j]5$w?$} dxZ_qov}MA. :ߣ0-EBæBddI: t>M擓UCs!;nw! A&{SSI$Sl @3pe 8![H YG$+!ZZ0αPV~hr3Zo>mdQϑPT&2V%% 3wqtmUu|o-ju){Ķu9*sh#]sȓRh A$T((kGK,Eb fe3}g2ZB[#lu Bs 2 ؝m'R " _ !޺f+Au:f0\ܖGx l|\dd-f-#FkD*& VՆ[\Jl1 v[)'|꣞UD51wY׸:۾$O & t (MR&ʓNͺ [9QlPUE2yxdam7Np9[/ hdGSV3p-?<6O >wq4M;D6TN)K;,OlҊz͍umsz4e/jF Ap3A` 3 $: Xͅ]Juj5ӢZs8sD_ܦVZ:dT$#XW;mxOL Zzus'z` ;6ުѧ˂E~]34k)CqH>5Ql6SY`-z!'-Z__WxÂn[VaIZX,wY=!r](f< wΣ9|4B 'b16NYq8-gao ]0nEVdG@A&*7U@\!j*W.yI_`_uՈu7pnjIff8V(";ܾ 'MDk\L/ Kt1 %.\_lsjә츲)n1nR3G)+W(9֑PC=d~RNwHa< |-RrE>}}S{]ozBb6yI38#(y gFxN~˶8ԥ%#ҭS>2$O9HhR+'ëXYF4dPnZACeoi4^њ[jT:PGeYbRJI΢%`KfbqκQ 3T),'\ 1L.\A*^M,ƹ-MzMnvȥ액Js/9[;찣Ӛb7۝,8 .T(%ceK/MY,3'wԡXpoxpq!80 0kZg%}joqNgblBW+2JR5ٰ.46X!>w 6ܮ +pe iymyퟥO_.gQGDgΧKyXͳrZ+/=vJ5JZ#R GC `5lNF뮙mjA>Txb(km]O Rjh} N\oo!3elj,@\$拄#$Mb#v8(gV]oPc2ټ*9Y.G;fC==s#Wp|@y&ǽ{lY6N2~5WRx*2}2m%6KgdPS<;FQK:fK1+W|ʕ5DZFBp;+(uksb ɹm[/DǶ6t|aZC,*?](T0\^CvPchQ5vSeLB"p͋Ū*eD8)lMbAӅcH ʟowƔvgLwC>491 nd(ɨ8Aj=:(EDHC;$\D-}4W܍$龟߱wS._o]uQ-j%2ێ"35 /3<%U|PrK+-BZ!nIKB 5[}:ك+) 9BmnMt:9F~3GM[)UBƟ7]#i!gM:wN.cyB]s!z]>/0?k:Е3ԡ[}ZfTd6|Z'az68n$(ŵiJy tڽ|;Xk!䁟mt~X[Am_%2:MҒ#-AiœK35ˍ7 3`u?]Y'>8Xr37J_zPwk$zKpt.d QР;*)_~&NzpL`]/,oRxsJ67Bc>VBBGFdvzgUH'es-9~|dD x8!ׇ9|u~$3ȦQlu᝵'V)9 qOZ- 68VƙON[;DŜ2]#z'c=e5 Rg0wQ(ϊ[:ERٓ尒Y&y/|5*r-mX·~wWMJWRx" nA< zR$/4׷*Irᔋv)k2-W,e 4\흵'LeNؼFYXh@jyD2VD _YQ ёU)0cɥ>K) 1"rgػ:8=&W Ek'TqN^ cK3.N"s`hז):hdw$FKbYݵ 9af|kˬӽS[(OVTHTIr"z¹kFe"cI^|uI^rK㪁uA^ˁ-Zd@jJ_9'XyLo iU6hA=[οS.ٶ;ȷ!=C0'4;UǓܱ~A˴Lr@Q97?ۢls}}T>!(sy/Օ_Lw:XT%LHUB_Rk1'|/Gbf[|%#R|Zxgz,ywV%/eR/(9FzL%/o!ϒW^L&?n!N~bPͮBmyUS?HzMuCg) 8!J82F.z8(ܓN;BrAjW,lm{.䘽q5\{DD6IfԴOtw?\Lk`:֘3&?Z/l43cICE4\|dE/HB{BS5h s)voyQ ]k_sՍKJMzdY8\<H714Z) 7눑^ntc?=ݧW&LxKmZЖ na֌-I!+XL]1ZlrqšDZ Qmm/spt|~u07/0tOkbdu]\._vcǮ,Մ=CV(U0٭B/3f@~\3$9ࢠ{;r6T7/h4x/$ 5=1DuWUڗ UK ά|-+j8ͥlz2 x|τ7Q#`{!LA2:+3mDvG v;|l ()%$e%,R$P΃5_55VVoz C'7`?X#Dul~{MTWHdjFaR&hgQ"KIaƥE KݬeKvJ>;Vo8}+}i!L7?e }:N7|dz,񔊡P#a7=?k㴤l $lO9j\4PH P7l2;yMU+ի1c}ZVAxا`98^=%c(qMonVv2-3hspoW0~|zGaP+Q7V*0C͠\lX1NFs#gu Y5hHy\R9!4Ur!:p!øWbNN&2iF*iLZG]~˷_zYtY^`~,,0 Bj#]:m[m(ѵXBf7%dLULhRXXI Q=\$>ѥC?dXڬ.&{ 6gàB*eTwۢۿPO`8?Q,^oud붏cMfe[~b 3O㒪_Ii-}+f"4v-D)+6DN MCZ񴸋g,Ѫa]tI9yM#}M~dF;XJ=>OPx&(=J2w"[:g%AG2YQl܇n_W gLf.]^%\K6O {xƱvz dm]ɘ) Fo/˛KpܬHp/-` AnEºPr;.sg@ހ3OSK B+񏜍G{c]3n/W!s̈0\֠][)=dS/o)1K@ WzOD}|`wSpWr#EKl>U*̓4 `ݰkw 7E6 fG/;INej;yY.(CGP.p_.qX+\`Y%2=@c-ȉbyf@$DU$~y- !Mb Hrxi)TS Xa}U͈,pܼuD!j:gldN) )>d9}R$:!.=:GYgl܉f*<[Mi~]7aOŖOvdVED ~O+R['Y`u:p6̞n;s{)F)aWN;EU; 5XJJD-kZ)c(Tgv`>ܙTR~+Eо9HoqP!~Ng7e,`:ĖF8iC؞}21l"]DqGM.9mU*ZU"O:!ɧݗD#qS80&2}ؤ" vU(BsRƹdw)KQڍ'#`RJ,֧-N@Fvuҝ' Ƅ&;Dʩ y3?LhIA{ SR1=Jn}8s8}( #Dl+ '-tʟV7\m^\{-I+a6upfJ(\G׫C_@ȜlZq us_-?MN7Jl$=g,_K &>+n}*{L5 $H^5`BNXE@LeYh6Qn 8,Թ06 NNX-.ƷrgmCl v ):`}PJ"34 ?E(H}!1 ז&(x81B۫dxD*Q!{9m,/Պ2 #vvڔҳ]WԠW6̝4;#JBXuHsQyf0@/n\L:otOyTp"Ѫ*WHog,HZ(ʻhw`OdάòY9|r$K "pJ`&Sg<6薷Z #az2\-7E$һLg`0~u*j`7J䯁d3#N󇘶Hj;:9wn4lFoMFLzy8+ۣ!`2zj'Kљ{hT` 5;nN77Bv&5`u4NCfdH)1x &W Ƨ IWckpc8q~:瞎 *~!.z~?99ڵkKF,Ǹ|.%s9ʇ7ֽߏi;3Ls]d&ƛF+ -Lu<en^ma'?E tFCr)PWEÓbޒ6씲4Hp6LJ/VϨplES5u(b1sIT-|#K2.Zw*F&9I}.vqM`aHzεvć޴2\v1u6.dS Vl۴(*8=|/g%!Jkep4, ,,a^5H{ V10vKF DB NWX0a5{A Y4.Ndzxm~zdRs\w> fc[;C-K󑾺 7TןQbʷ僩s HY-D'?g$q}]Ё|d ӣ-3l~sa-'a =V=JL/;e2A:V[8AS"D;mKg^Rcbohu-8 "ٹsH"ћvfQ3}rxN& -"`bhv)ܟ/Ҳ7Dhd.uno4~ l‰qPNō}x7՝{޽HCs1NmgdPSk֭[j5;n݃.<ә`9-tpͫ_{E1-A d!QVdJbpSL:h 2EYrKr88wMq6G^7JN՟pK誈!VGYl]7}F1$,E"WOΉwoPŨXE\Uc$/.Vzpҽ N2=yga mt: m>GIE5C,j-wFD*I4wwɆH2%zhBbEZkAhuObr-eVCXUK\?V ,M1Pv;o 8j|[,T5;oWcrhćTDل/˜‡[s+DŽ`@ Jr+"Ɓl@lb3ZS,209XFq'{P=3GV}MXu;̱,?(-gP{JƟ _ԗט~؏ tWl{R3jQMNHd?:2tΉeen-RkXoćǻ1gOvNY 0~lݼ!4c0{}xz~[ N|yr?|)<؞ʱ~YtV02OJ4Wʦ'Vx%dQإ Ub_]l0ԁݒ7Ɏ΍ά#=;tn\XgCq41Av{6֍,ub6vw-:qqJ]IK-?$wZrۯm2užіhvƱ y΀z2?#' ,<m9,Ym3`PmAMSml}.=g8g+ai@R S-X<}q0 F& ٲr'}uf}T!.鑼^*V gpL̅'qT.g<s =ǝAqʙ]moo wX32BB'RU,1z {Ow%4,HQW$~ hCɤ@zMCjˈ=wōv2HcW(<&QB \#x?\Ru$:27qU'U\_sQBE*ksSM\[0'NFn9'e+s4 xջ;Sv)=݂\ь*0EW6/^Vr/Z9=־ ÔY/ l}D!YZ@r+$~=A4%PZ`dM6*<_6eujqnF';<6DXPD36C%1r7L`(۰uͺ+x1ٍ֠ׯ/ʔK:""B6~Wқ389:G$܃t{Ε N,V 1D A!σ L ݷD5 -R="rb,(0A㺑wD& 9nN861KʓYigML!.b_jFu xutkʭ5= ;r̘ JFj.Tjbҽۇ (a1,3#йºB%>IC^q *t[-xE)Hԡ`8T!?s?0߀wK/=gQyЀ`^Kw`B0ׁ#1ЗF-N52p=j܄؅fp1b9ӨB:9< 8%o*T :>w9&;# %r6S-Wkt\fq%,ǜl`XKK׮/~nL ;V둜TJG~|H+iQP_-dcsQT ,))hbjvfX=+\tWtvkx aMjԃS\q82;Jqᛤ.vtlKs7s%sIxjywG It:L/&SI*\wpIxL:Y]ˈ4cQ8{͋tg&7sG9_p,HV)`oci-8]5Obmsx3MLþ30i/~޸nL9uWW pBi fsǾOOuGP1ʧt=,YFZhʜȀ)T)=qƽ)])->լl$!ܽ3fg{ o=9s.;HL8>3#)1ODbЋ߀5Bf1Wha rQ+IX+ (njH5vө(כ(}#`}N]ߘ}Wy+,n1?ViH#W/UN&x؟'J'_ߺ}_^EEfw<;o _NNg?޽|Iy튟+k{ _2I4ݣ]&5_|İ(`$J"vHM־LȔ,yMy=e)0̀0 ZDTuY)IkJB<pCjSN'^?9TK:aS3D\,lQ~o=Ha:Vg dz"bl_ YEAt[&҉' hYԁ/Ɨ%ps9RS6W٦ҙp޴b853#Rʺ%*:brlc;AEgr`]BDjʶKFkQMDYK0e;'{թ̊THKNÊzf}lg }4" va6V+eT$&-½mk@w|6lp|/+qX|{D*\Ĭ;_ nxiϠ ,8)5Ut$gB!~VJL*Ϊg0땪՘]0f?a@;XE/eB4:mMQNjzU:pCi#c1+d_VEyVgFPQkbj[lKYG_No `DݛQ !v*(i)! $]YJލ+Nsƭ%}4Q| W[l 84ɖ枓CN,Z%QGs"$Ml?VS壁zy] nVxr*:Ox&@|2VxQOGɮΗ%>T7+f@pҸ6ljK43@9 ,S@NSNQy/TV6`#&tTKM+/os_IV64~!^̿?Ϳ> 5rfǤT $i/AQԿ^۸egSjn02 k}nh( %;8nՀiZx>4bP3|wh~oD*"&ƔzJꅘ j'~fv_pgG;ódzj.R^HOcrt7{90ի/ ;USvp20ƚH[yb{DP VqHP$-Ih8HVTR䁊>ԉ,nnnOrZ6䇕SM̾Ꭴ{j$B")[5~dro: .m#˺ngV HS/z3ћp `њI(9CktRsCCTZ6.> 30f+>!)5~G^퇓.lÝ-$ܻkޟa@) zéɅYR:72X6 xFN%霉9=RP'6OF.Wkċ+<'R_U-ɂn}'9sηVJ4}vx(Ĵ~]|ޫN3ۜRMˬ~ժ6Fp֟??QH`{ܱޭAZi4}` ty9`m`)΅RHY}d&|/{l֍Lσg{\ r n C]4q禂*絹DžlvY?Yʕ,ur [Z3F7F4Z=ZzR{ 4 Ӥm* ALJƗ]&];VN`>*` Br@vGrqؤ`uD@x<4S&/ţqT(1~9oL=L]БRNt<\ J;)<<xVXN~2bZOm ^.MZȍpۮӊh.t21t%ҼD:SL u F|xɩq{Ԋog%¦62aD:.6oE>P:Fԑkg8qc.e?cMUM';. gǫxusCiDLNo\ݝ}]v\"L,> }&t^\eI+j_w:ӱ~=c9ޭA5Ҭ{B]KmW8T.tޫuap/EHx2i=c0 Ž%C{ CDt$iuQ$3]C=|AQ7`FlV@ mCp줗9 ++όř(@Ua!ED-!ƶ]'fj NTby%^ mq1fG=HdCFK<>>K.-Ahv!d ?#Β KzW1YtS$Q^)f!!V}lii326e;R=uOːCl cS&oEZ뛁sy޲֪ySCܨ3MZ =ʆ+Ĥ'܈# -/̒`J<zd6f JCCe*"^ǐN9EB._BPٜ˰ذ o~Wwl]"P )+fV?ƒq_*7xSŚ &͍gڌEy 1E,?ȧOuE%:x"Td4PZf l"65bqFv焰`mB8fHⱖ,U(g;f ,KlA .Φrv߮HUێ[ӵ:r?AMG+iT$ެǬnS"J-Ͱ&n-bm;QvoQc:a]b5<[_CS(\9\y@\6WXb'Im>dI8 O^ /_ߝ-z` T@o4,]Q! <3^s>$n>h&ŝezLOs,} 4pn {zY|P'os yslc:!-ۥHN3Ա]+VY#{l tsgIم:G^ֶPys V^<ء]>yr )7{JX< ແ5fmzLo' X?K;km/N##R@ZCK v]v693՟PĔG?cV*'ʏiAńueK#Q9p|;=ؼV_=Bly r©K tx;M֐svl4=c'?ͦp>< t$=3W}ɏӓ5.6rZM)4#5>(i}g\>^dDGv=?窔U>s %8~[$ `ٶBЭBlu5J{{hrp_i\)߸  Yn| 2Lm@@MXB/- R &zqV/w*WK<đkT~Ʃxqmki/7N ݓ,LKêN_nƵ 3'>.eM#@( >y"EQB.#_x(gh?]NU q] $DOsI~=m5<utJCYut1X,}3y%7ѨL8~ H`q5Xr6/ 6AwޓHZCDaD#nX}s:!k Tm8gꆑc(E@L4B> Q٣߾]>~w?Om}<<$_L0M6` E6eɆS`M .9EB 2f?q<~T;V-W.FW^}ȥsM rdv_w~1uίO^2P:1nY P=w/򽾱@W{߿Lt[" 4~W%^mSa\)X1Lcc/Ce!]tU}\ZPޖuR`(kk}]x+?][-zK0^WICK*/\|G~:A ;hnCّZ쩦ƒ\0Y˚YHy2yx`FlπfI]x.vćda׍!mҪ;Hɓha&Rt4E1ҦwkuP,(yP$Mr_NG%yٚkB 3L;歫~faٙTFe8,}WSL6zAdJCѐ/m[bf#NQNo@s[fEM ZqpqDZo&-JU@ % BwYw#"Zڣd?N&$ӧA,Jv&*/$ɉ FP[σ"7Ǟ0e1:1DkӃ y$.#jA z{@?{b_ϭlT9BV|H>/O78'=܈S{_ܫL d\z@$2>Yxq%f[RPsE\|H '@ZF٤5zkPQr͙_2hL69M2b/C}շöWb0F }2'lSegE'+棭M[u;D?"A)v-Jߢn?Ja-*؉v<E.5* ye/.}]46} [Ydu|zeO("(Rqr+Z7Wʇ9os:0#J3/͕XfAM]BV^ Lr8\#fR FFBEҌ KZ Os4p ўcEP#:IY!"#U!DNG{ x2T 0ݾI>PLDp{i7˻k36h~( qq 1;GW{f>қS)PQ[@Y /LO@:E:C Cuz۟Xn\O2PE6)ĸ"**zz|!kWVsxaOЀ'F"j7Kd\mF^D@B#\`>?$Xʩ&T 71#3]شt?E2i,g$i}Z&::;i亯Pc6 jINBh(J4^A"Y!j@`!?Vo"a |׳/_O8@K5r|< ukLuꘇ`W&cVh{(0ɮ"G&W!B(O?m̟E']>CQOu t| 8r'wi}YXj-]庝yJX x.;k;V Q̄շ=*kNz )e@KsKq+Lb{\HH6$0o$yۄO'GXZZX8z<#/@ψvR08u,u]KEj|,KTiBvNTR'S|TU_7Z]_' ,1G' <|[F="Q`{'kR5ĂE?{^;V06F, frgKعYR(ugݸJݗh3np / X"N [O ֥ .tBmЃQ-yMA(DZq%j~v\Ua"_uUŜEN^ f?ctm|< 3Dc VI8Y uJ✇9Ωc~95ҊԤ ʋS'4/btlg td܄Nm|ШԈr 䡒grp.NvvZyLBύ! $8t E 9 q.h?xUѠatP [%eY9SM }pG{%KJ8k3/FN$%&gnMi:en@@kb-8yy<5!ƆЇ+e^͕ݽGΡi9fkGZb2 ?M#H9a'_^kKg~#;tt@B 06p]28=F]6. I|!p|hc\IecVn N*G'lFhw3-`4@<Zyn^Ery% oqYεB M^ ciΞ2<|d]~aG-z^Fu"|#5b;k*KjjI=|}h/ 7rdQ(>g1>uaB˄}2Lj֐*a{Qv4wD,v\Ed?Ց}#r!z3J@%E{:̭oʶx#3;.PPK"w ?zZcoIKȒtxL"EFDT^CnAb%=)uG2%QwŒvjmqSoW>W/҈=#Wg. pyhun0O \)Bfފ"i "03݆I`=%պ)g޸ss>{}?(ӃoT#WD̾LW&( -Y%'ޜ-4HbFuĝ[?:cN nϲŽ+S3'9q6r1sֈn#j\f Xaz.ocۮn.ogz5M4v` )SO5Bony;c:l~7NƩߍSCYDzߍSE)UBbPO5N)XX|3Q 8Rg zC4M7RlZ:74n#1z[6u3 7IHbuԽ`iy_QTOC+rhh wewwWvB'{P Ц{r?{傽'n;$鰂2rk3e5H:m#d+±zHW&d d t^и]/kt &| )X񩦐sVoPD@Ic<W>9V*XJb2 SfC_;\>0kK:6TRK!B*k8&㽕m7¦(]t<׉P֏>#Iӷ}\Un3Ե(АvFDM-Ai ]%ղQ5gĩCz`8sܾ=B__@4_堩,KOg/S3AK'16{VtU-s\? DnoȦdm`kBXq_tu:dx um ]ksQ+Rriᕋ,Qp8/og^kmqLɃrqݤ1 z.5KǾ+0IؔHPeina!3ʐ& ,s3Ckdw^aSm9a7bQ{Qq`V S{բ襒MVFu[ƅUnzU>~o~ԋϏۢMOڤkMQҖ`8,.P&_ghQ=^m1@d$avO0uf>hYsilt}ޒĿ~:_/Exz<=:Q%DWC{\;=9jny8VMrRpu⬝}|̴Xޮ8 qOOfI=FU}I,4j-z)~\8N8Ir1O=G'ga$&>, *tjMHY(jW߃e̟[`n}% gkOZ`-T5m; F…saqJ aSԞ\o*CV*3F uGsY* JHU,IA.k9CAl(-ms.8$Xkh[( HSX;|YuV$ (3"x$!!Eg?mW oB_ʦou_aӱnU*ы^9oVLKjӤ5M=[ +TbAv`r(t.oٻP4> itbi /it^u$.͢exFBUbSVw] l=ZW~{[¼ˋZ+25.sr`vPZ8y֨)TZݱc6bCIRi/>*[*e*-6y^ iCǨf4PS-j͐Hԇ6#;r,T*=͕$j}9 V}\׈Ԇ &b`_ y.SމHk-ݼ0.dsrf30̪M?ʇ]KWK\C둫W>|@BW&sDPgKuWc.EͲfT"ozsQM#NlTӿ#Yf9;*4ze)i(QU $MFmm#n-9lz~s8aW}ŝ h 3!>񛟛nj&.bx*@{ 'rVWz00DGEqnv[D=Uf%{1ߞ`΁>!J? t#{EŋmSupXnm!N04rEٲHZ0Qwݸ68h.tTdP'MΧFxttds͝=$/z_eUJ)}zu(m^󻬾 ^R1o/xzh2l%UVt}i6<~t9fWo)_CVCg/~XlF:B.KfG1i;~>m<-C}v^"XBSVm)?Tyf4Cp\ߠY[tETq# U$ 1tB+:-)6dq4޷2Wth'*v'dQ׎ . `,xҵqV >OIՌp"'Lf8r6tTsÕEJY R)4u3Ǹ]Y \դSbG uHK3gʝ'Sa*N&%㸴ky!,`-޶/ܬ3yrzHc,]V#>' NU=(77_^&pwRKUy%HT@NFV|-SWm'LvH))K\**c8viNgMJ!VGVIž4KBxL)HZ1vʞ"4nʗ%uw88n~_ b˷{+IaU2z k@K^#R o1HZ@NJAeEF sþb;ô2Ot|{ _rOEkcHZT0e^e %= ևǺr TePgkMt?߿'^9,$vtPfn2ܯJo8gT+UsGHeubk4* \v0r Nzzt2C{!#8N:oD6!X\4#g Y矼Wր,[ow)N%II5 U./DٟUvP,MNȉA8# -)q[b%5@"J5~_ OtE 4@x ]6X1; p[nn؂kӝe3]U8@cw|}f6ƒEGw-v&FFi4B$덀Q~ +\ή:{rNgOzm`62O".@o7.1v7&|TNPm. 6z(XS)N q٥枭v ʌ=$ptO(\؄8f^S fTh,ikc4etz3)KMۘ%Q1kJq6Dp}GCDh,VxQݪ|dD*Jxrn, l)Zlۯh5"EC?v|49ebH TCP3*GO' &hxS=vTBH-/'֣۹I䍔U_߂95E ^]gR{~:h7`0X>zMD.AmŲ]QcٹQ: (GEUqf}ӳDJPw>C 謔T"lê͕"Okvc1]2٦C1<1Wnly''&}GeidخNTP~[[2ZIƞHpt&!2%46YyEWȈ0yls ^^;4V:zfAć.%6_-kchs7z|m7hָpl~AwN чrM(N!òF6\Rڊ]cy6=12 5)pBunt_82S"_̒_zLhWw:9?8"nwz߽DZ|v0D/;}=N%1XbTkb#8q %8NBzE_[vׯQ-|y|__<_y?k*`Z$;û=xlGO}x#l uG'jRۄs =U~M# Q{4A)H4fZ׆<3% aw}: uFih^+Txwz?moouO-">c^258 $$8@HAmkr3H.(T8" Vl@PKguJ]ԮkqԮ~iK=(3Sn@; cd%w!|>q%==/iuW˕3ѳ*O{ONG~JAhC7sJ.vFֆoTы 1wReVԌv񱱲GOdޟg֝ />;?mHb1A}MpOD|40Aō?7WoU;gm;Yt\r0G9Y>nLPw^x _)KLO%خLz{=2C6#h'γm!ᖦchM>_NIۄ!EG-}  ,: RvI*ea4=bv_{֑ _A+~Ģ/ӗv%Ld"xdȤFb{<P{z:LE] @(*J m푎D1/#ȟq_Ce;xA) 2W# 2 ҞQ;|.gadV#TbSW9n|{Lq>lM;{lBGd SX$wJQF=7wX5I&_b-2W/00K[zPi("c,igf:>x}{&$Z_al%aOC]4z@xe|₩~p5$&WHۇ7B&b7&nՄvF鬩KZ>;m/fHT`&< 0~Z8f<=6 _8n+&};9XXWH1|>;L'} 96BX VfߊN;8Z`b˶DO+"H% $QTL~9`(EOg|PK m1Րh:M/hF/=GOy>'7iwFtv 7*0g9멼+XR;kT&ӇP w!t=< *2zmFt5% z2 RIsMSۂD2 S U/3M=, ~C#d!D100Zq<ו BLcJsJ'܍g0-PJ,8͗%:dLf{:6LDp$Kohzc9DY0rzi9 ⣘<aǚ Taqx>h4rMw],W4^s\5˳n: BΏA$KʡXbڍ(\}Q-nUޝ9s=% s"ʏ$~=%[?V"AJy /H&C;D٥Y&(,SC-LA9דxyVj|c4S/4>͞(k V\27 e(k A8RsS \w+|%7RSS] *g2GOgO%' 4xs~3tڻ8nwٸ9E,ٙJ3S4Ҿ̏x2Tm &fiֶj @-+Tm+ 쿊4`2C ~lw/~ > HN9me`wde}fu@hӠWKQHM_uI?tkv[Aa 2 }Pax1OX>H&I3= }%jVSe6ͱpU057G>XŶe+pziAp^8aff<-}$5f!Xفs}a 7[ DP[4L*W,t{8|3WnnӰBÔ#adV#t6Մn뻥¥Cz?s*:yM\[y}ܛ"tD.!e!/?R4g{$)G < qX;q2(񍍻3y! iJ6。. a;c/Ёb$G$x16JxǃW˃RAdU's3soai^M<_!!}::21JKXj7*B]s:DYQ"Kﳶ)_m7B Ӟhž*xW<D.C&T7|maQuL_BJn8ۙB(I#ɽI-hY$|qtY_siߔC~&lػ14gUS5V $ҋZNWegc15V86zeQ 6y C˄IM7<3{ lGm/@M/Dn]/d*hj IXjwaɳr񡵭UÒx뱓Jgˢ5l˲΍d/f۔"'ia]\zMҦ Q3A'?(uHd#x k0iKAG)iHUɐ[g_wVVtq+\.:7+vj[5ڋ޷c-]Zb]' vhiާ4ʀJ0(6c>A;P62 V!|Q fNCwukᬹ2G죌mEKԩx{+4x#h|؁:OGֳ%-I!bw&MJŌbmɔBn_[}OQm7ZȽow]PS5fNeF̮6 115lvNyF1}!M<: f9턷j9, @Q ]l!]Sf!u|.XUuBוs4V 3+Ht`}ZszPH|xikhB`KW II.',rY:+0))G%2;_hyozHh8Ҍ(q!(N*axpGksraSr?y&:^[F2l-g0c-Ku4;Jȭn gZݕ*(D~O5p1#T=- yt2s|_ϱd5gnm}!(7-2 dk/݅&0tWvCr!}ϑ~8+۶yǧ![s[5xͣKdcưwio OI/Ț!cI^9 #e"k51ϤܖS̮Po>"[<#'@F Zu w(ìj6zVH7 d~j#tp'$߳vƣۻO%NS)WtxG b bWG> -lx8AzZ4-OV1- (B@7^[M#1E#J6 /@SOEq"m#Ș2zw+UE ׻5Az=vTFMnGtk ݇F֐9{E{hSNg"aɼx0z8dm 'T|.\)6E?ꠦZ2$V^bHHޗ;^E3^0m] 衡L:jȓGwv&eC%=Xj~~;F*xL"#&C;CI(_([m]/( ]܀;NT7 PIҖ팂Aqk"afAn+mmv3e+G!VQ]PO l$^Uw5szdzq/>'SwIDePU 1H88ShH&̀n 3(εE뇭672b e|:݃-=D bۗc/~ >M#d);zz 1R\En6Nc|?*+CH(jEi3cD 4 I zJ7;dGQ4ai>xFjrٗԊ:r37\Wb zSi'yEA 8{ ߭=wR(v"Q?dj/o-$$k& e0dFajk3A4O(%-e}nR4.o=@ΒA"|%yZh4ׂSoZRdN-5qm``@@¿~.ʓ:*kcmfjrYԭ@ҥ 8e⁷?e#F"Itl)LV7ϖ ,yW#6`rXK+cjTUow%M^WT4K)<*&374]BXif˶{rgFX ʰ? tsrn8-c87]S6"xWTZQ_9'C, kvc:%9{JΐVѠO}CKKDŽ-3M7Z.nJZX`5tDŽFrY+geM]tWOnޚ`r8(d\=P*b?!P]"˱MǓ6a\L{Xz1(:fbj+<4tac8Ap+q9Яm6ju:6[]?ׯ;/HGgy@Ї sO](sKXkVShi7Ej@ bz [ 80B)V r wfh 1,tm'qs DrtV)X~#k4OSGuBl1|mڇ(ciXmp-v4]AJvGJf&:dMud~s_`8@#PUc\[DRȵg؉k$Q(E0ޝ~Kւ2dr;ڇ #tEt{ww_A{~,Lf T`rڿlu,0l4A="mŴ0t5'K m= . ZL2)xDz"'f6ns]#3 0q~q!-3tpn7qhvGj| ^A9_tutGE  7^HqX2[o3O}֒!^ra==N]ހվ{pۘB}[.r>A6V=# o2ޛP6lR _*a,*{۫\Y:&$ hA4}€a'HYr32z@.Vgp\j#[`)Eǀ0.:Tܟ;,ȋ]\I-ʃHоc?9sN@( ^L7o.bfLxƢbG-0_+JRN#!@ 9 dqDMٝB' bAbJ{}M OgK ܍KmaS^&My{]p08Bv1U/O&G/[e,y/{]pzKM`eVhrU,Spo1{e:262|# @oB;Vp_FUd`s`}MQ@qF $8@Ct$u=RSDDFP h*EUBc뻴qUX??%(s&1 Pv;szYgn.boc U!c_I yY!w|2utv3ק`lklBj_}\VC>p|{H+<&Zx#`Y 58Hq^sP>P/ZNps)XWW{[ ЛLb%).lE ;gF[^}}5\o w̬x lx\ Cx$vQ5vpWoִRBc;>4[챬Qfuǡe&rmpgc T.î%WRq]\&%2,]Mt9\N(kEB+q\!k '=;a7LD)\_ .[tu̖Jk;gS;y=yxQ3Ôy)2Ey> $A !vƦ10#uیq;Ṇ|ɱOF'B?.ȏfIdpyh5_n[լӖp r"6ښQ9N26)3ґu1B7dl(`cB`yղrʃ$6@T`UZ[ƊJl$N3ER<1}YfFIi^X`c O R}~ rL/z ʆ1P[Ei/r' `/9Uzt!IѢRe [8lF+W^eU #"bԲI3N^1Y&0pVpSrڬ6ʠH\:c^dDorm4:j- $\H=99Tޥdr|/C)$GF,˗2Gt䚗UR{ׄG }Lc԰x:z0ƚD_(]#M!Oar"?i* r9Gg­3ґ襲MQbrvrLqkؾwfdRY x阏I8,l3knb0c>XvJ5/B]z΂ch|;6jO o1]+栓?e<~Gn!N/YaUBv;s0 L@Rn-`f yc$.)C^YL@^!4U(VLNJ^f=rxZ@V|72TV/ K' }fW0?OY?GuB _W(yT mlĐ78VaA<.VB!# *twV_Қ"t'lw ^FURtd}ۈ j8%FnhA &>6i4<9('{Hxo`oώNO&@rd衾o* Γ9 ؝L\_xʌlUZ0`$ mZ8QhqwZ=΀|MRrg..@o S<Ɓ?(}$NB8=Ldx2r>sC,x$)# )Nx a g%-g#wA. dXFb59S tY 2; զH]`Xsb Gc0:#o)[Mtz/:qF"wOiu7.Z]b1G&-`IJC ' Rf'V$WL (ad| -ڲŬ1,ey`8ڮHp>J_)^vb}N+43Lx]V5A.=hAZ[woRҥ27p`(̡FhnӅF\^)v1;61M%xVWB墇}+r$YSZuRCcYh-Z;8ķTŵkK5I&Xuux ]M f7\[T?[ȹ|ʃ gm"BAZ4k@]1&nNT8n# F )ŠK"3-x FX(E5iD>RS:27Y+ޏkf^^/p1 gU˘=8%L:]ܽ]-Fώẍ,j!Ay+ 萛7m~Om-٫{ "aAf5! ~-S0TCYa!< ͤ))3} _nLεj;'{y-dUz ) E>)ԽO"SGgG-NrMrm! 93BRW@fFXkR&b 9XΌ#h.ZpQ. TՅj:>/ I )R _x&,ﯓg6s\ οۯtac,ӥZΥus4qvz@I8WpluK aꥣ!4N Z-010C`̦hk CLѝ9m<`Ц"dcl3/AoZ3mU`o%~w,e VpR$‚|*ٲ޸`As.H[pH:A;3 _ZV׈CFf8yONj+h{ "0ߍxd3M RI-VWq0Q7ؠZK1POw8}VJj|]XdDV7C/T'ӟ1,V|XXf\$nu| rŒyW(!)/a萌VcGcƶѫ={?%1+VZ.XKK CaHs0 brΖVT U &ϛbbh!kۉ;[>\aAekWii_cل"E t,HQ8m؝Q$|DjolcA  ?Xh[Zr& !m*CՌ[/1Kܨvy%8S<]lBR-l!8{i)!1Acχ+?h#MZq" īWVn:mn2%R0.ACn%[ɘ(-lyֽ#I og4*lx{FUJ` 2|*!ZA]“JwXK Z80|(w^Ko9Y MXrpk6W=g M[gKL=xDRsHP^Ćlvd^U0B^[&*cǔX?ѣe7dzlJ[[ɟu+ Qz{ZOFg%sݓ'N|%~դ uqDUhíb">CY%61jjeԃ*0v`OpAzōD*Q8BmZp3&H9kecFū钒`Pyr# /,bMQZ An?gvq DUY^(ZЊАV^ X#5@e S7_ v 0:R:QäJ-"e$ ft-a'#VXQ4Y6MxV8J#p?t-0ϭ谈$/,%ZjK~ݸvy E]NL_(:cI}SOƊ{WhRߜ"ZwpEmԺ h}e"b$E,D-{77AfqJ~Ϡ/HB/d&7kuf`ʌQڨ6#BDJ@ɖRNtɕhWrwg#9!aaLN@( s(${ F-m}T+- ) ;\)ʉqٕP;υ@A ѮJˑmz,`ǟNhl D;:S*Phc0X Qg(-g\ &[x[ C6&qwfPQaA&uwdsw} 6)db W(Kra0Gg#\-`1bs5M!N}rjcBpEH4t|Y ze#1,FAEHP6Ws{F*fIzB =c>Bg9cxwއqLM&uM/sB?/L>KG z`56P;D[P䚳:uN FC%㙸Xg)<'L42ټ7s΍.?(δƕ4V A2N3 ؉y{-ӨCpȐ+Jp$$2cB2c|K|b;dR)/Zjk5)2 bI`m1L˅pIGCT{ L)@4gO? WO%b2wKPa-C%taA5-W||B%|tF(\#lFAf`< q K9\Bz3-zX!ޢ@&P˶^s (;G? >;b: ,vW5p c "X=% EǾsY`]&Z GS4ԌTo%a:0&N@/2_o`ldQݺt!V%5Z8B_ !iĺV\)D4<(B 6U߶/jD1BZbK;u(>QA71-FoFADe>G(낃eU;.=ciS  䢨$t`kyȤ?Y(~?A'MEGBؒ49vPTQp:~aLY(j8)!`DBAlKӎ$_HPbCr/(:#&'c@?7x 2 \4P>HzЂWy=Rյ]%4J 툏GÃ0®pkaUxś]JEUɫ4ca|_w!N<ҾZ\x4eZHrII$^n_˕v0we2.{Akv8ͤՁ(xԥ?e6IY6M-)^c}:QX왭YQ`q 醴.;LmS2SYPR@u7|E _h =]hrm,S6A g}!*z 1? `\kۂz՚yZt:PE./ Cխ6[Jlw9 HE}Vo~_QB9trq ڋfճnY@ɅP0d?9! ==Ӳ;6,J=ei[Urpb&HC(U7p! †Smzv ;.?>r17>e @Qb Oqb}،by %gA)+^pp-S~wW͚^ Pc1YȠ#{$zi-1~ 1;y ijXr9A ^l#v%+I(ިD OCz'zR Znđ鈓O*bF'S'93#eNgBx~Yݫmv?5ئOUeDէZZD_Tj\(a7S+Ĥ{͊.ss"geTaM׉$E gՋJ`O $C/K8kZ ^Q//d_vYװM#Xƅ'А;L6z&4-l1PT; W+8?L2qY |x<\IAiH*#I w:wK ޺Q 6c%ANga> WPK%Q@z?VNlJ;qN/ VB3a25'ׄ&Ȝv0Tko"z rL\%SIdt +(V͊HAsj~V D.\]!)aI$# }gڰO>ǃXq3gdzǑuu=.Iah7YĚ-.ՇgciJƎfB )2f"NF;-s>2NRK Vw1H(hO59gTQ1u%fE:NCq'-ף*hHUҨ[NUj-# a)y֚Щ m>$fw #r4~f HH94[&zV>^CmcHFoUx:}QM3a+¦C:N]'fD>Cq|Iza檏*Oά|QVYPxdeGiz 5~6`7Mx 0ر8[[5;]KOžngyh\$8@c؏!s_*y;5&P+;+WG0]@+/μ a<\bJ r[^z9µf-1` ǗXɖfhw79w+|iwrmGp{2ᅇa{& X >Dx.Cɹ&ۮ!ZԜ=/IOUl rcSL}W؝WاR]JVR,|^.do|?#9DoEZ pG)~q}%vlK.< (lĎXw :I6<ʷ^崼(kygRAc_3CQ4Jur3ikyxY`BL^|.JmĚ%+aW ]7TcY="]F*Wq˿\5{񒖙? ] 2G_X3iVۑW凃 %o9 ;ՙQ!RܒM (Y:D}"&1Zs,lyۀQd5u+Eμ0P`)ܙɤ"L&Dm@]Ec+g8ji-LƎ:c dEiֈ+c 5Wxr{;_L^Ds>;O`˲{M|P +d:&Rw[lj,Gk"`.MVr<jU+V!(,Iˇ'7!P[Goͤ0Q$I(6,M/{#wAo@#^$H`lQKGB,XlS|"Яj j8=HVKB1yįBӁu6bk]1Yq@lA6_!6ٜ Bͺ|]e&]Dj`ib+#wg(  ]38Wz)Z`B/GWB╚|>{ #qOmf&J#ׂ"@?yg<фw_Kj,K%ĤUp2A n 7Ҋ.]h&'βP*idq PA"T l.(uKzu400h^|-ہAtbwZTqRFX,{ f&,'.zW2ܔlׄQb ɫ_zkׄZ<z-=vQ5!'XռM ^;h}cgLn ,TL[G .⶛rɌeAP73ʒCv dž;ڠąg}{/kIŴF2˘ 3`?,ޫ.x@|Q#e)Ġ26mugQ:GhvNQyp=6T܍Yo3}@ SMIe7LM5`>V7V;#hy!Shldx̨Չ#7$UL2;H݄-r{A*Seuc>M2穪]:,UBsW[u'"C;eM XKQ}4 M9-8L\bkPK@UiѵaٚRXd'e:UU /Rgn5p>6 &.GyC^\\L'7o _UCVr ȇ9mqdB.k[$g82?Ň2uG%ڸ|} 0\ĵGa.ѹ9q !e|6ZcU|vԒx)3 3p."~9?D" Tk`:C L]cB9ߟ(]Z=vEx(3l}ɞx(nw9hFKñXIYCeE&B F.h N5(MmTDa\E*d5VYZW,=%\ t>B4֞(luߚ.\!^~}SA-J0/F]ӗHCQ><,0ܹ'sPIbd׭*5 X$5C[laRn^wMH7lj%M29*AIIIuQے/P+~b#[j]xW/@5Ǜ+5 ٻٚz%l2GU= E:S7ppF2#`W8Fhg%-M̰*?NqmӺLƝyiu#ZK 1G#ٸ8Ⴕ4{Qz2$s*TUF%4\0q][c>eu ]c8I[*'9=(>`gl}gSg|k0r9V|ߪ5rxuh8Qc.!J^ XTRec+/45bIwaEo[aI~>l2^;%Wi̛&H̴4FQoaψ|X8:΋rXIqHGUnHAŽ-I'Z„ ;J᫨ZQϛ Q2dйZe<Ko<`c< ś=%s}k.֜&kP} c>w1X,/G+`LR<'wmK!7[̄2=?:E. E+Xogy,7 ɟc4OPjГ wsMK#7=t;k)1iQ2`d;mn++Nf"1PejK5\ GY=\˱0F0'5)NuEp>+o$6 O9a#woLƸ3ֶM+~[/&d6`p7q)2 pѰq]lͫ|{1/B2޼r{8qϮ쒦-}Ѹ?ݟ.4icmܾ6PZͫGW_M<ֹ=-2M}ݼzzTy(M?Za JxkeKqn#&&T/Obɍ#|إ)VgY,XZ}QyD Pyl4yѸUkW@Ў+Y#'i/1{zYc{(lX;KKDNqq%5fRhi\E5r-D.]XfӅy; _uNFX㬲Ś &A8|Y9DӜ@ۙg]YAR&c"~5̓nb;ZOX; \o)' A#N*ATTSH& a^XpUN&A@Q6ceUwُ|iЃjjp<'INU i +ˆ &s?B9/wy5ⴍf1F*$?.p{\)83?U}59N:-jNZFքmw-_i{ŮC__A#zYl^<ܛw;mrC$Aں#BIۖ~{qb ] oOk0y],&'ӽM|gJNM4\$]nfAE @Y񔖔kEşϼ0SX)eod|pN)$ ǒa7ȫ9E %Ka+ wH.Y GwZ͋G#,[*" HUl卂=N_p̩;W%/#sO<ֺUE=ck:ZŇ!]6&b]  :tw6g}Zh؈&bK_wհJ0ђu.eHh LGl[ B{ ߰9{?%i|LH %σ]|CTtARP?ovzygl6n Q׆ ?ta<{?=2=0(ta68\\ܻFKl KoCIp ANH7[wKw(:AB'~<;lNf6@5d@2A=6ӣ7۸lE} -u:\/UX@)\@G7/$,S^rKU' lAm\lZ[$wMr''XrUo{x}+=ҲMdgGXku ?5}$PH2պP*9E  g|Qzvٳā@uKPS uYo\e&@(µ(3YD=q5j꼳4$y}ܻRWߢ:9 ]_ig:?Sn4kMQ(*TE:Uu6~; OіaccxR .>~wQxloŸ>7 3'A(^l.I6tOZarٍi4UF҅$r[X5 ѧ~j'PKWrJPKy.Fangular-1.3.9/angular-touch.js\ksGv_檖LVdMq-&-Ei0Y9=֮7JE]3ݷճ{W{gSwXyR녻~g ܃?rtݤifvw՘SN#wŠʢszٜm7/(+9w_}k+rp"`"i=W|=MRwiS. UU!$^ESckCW6r4UFeCv" +ztSLOծ.p cw4O2TV+0㴬R7( pcfe<uGo9gq,E$9w7t[9e1 R$?9<lŬ*:.‘qB=D^ T{ ]g̈́UH4m&C\vk@ʶKUP=ISI3yfGxQ9zr""6oa@wG൲l*kR><$B AAе8ڭ N?j>y8 Iv Y9Ai}~~ߝ>==Hyvw?|d:(js(bs[:U_"-@04mO:iST\ P Y^c0~@XX_8IisT0+uGlRDkE^unc,>v;9> .G;6@{~հv~L]xBB">7cym;?+W5iwc窴WEࠛG.rjWwngekDi$g;2+R잿 =Q|?҅'BR/hܢVi̭غe#g@;ey{IOi8wgmAjWjKdD@i/;,4RP4ުtIxRkڅA-h9^?u ׮!`I9aR5ps^A6ʠ鯲Dc)c{p$.Ƣ]0TUr˓Y-Ƶ4-hҴP(1-(*<-\&5"?zpF7Z1A 5KQ`RKUnˣ5GzCR!.3D[ %0Ay[ в@h?voܧKOV5aRo,t4mVtyj]l7D T8HҎÌP !b&dbf=`m fHk[f05fCq#4RIqgr0X:KBN@]j2`|7 '6Kwt&D ?#x Үn'"aG +$Op~U^-MpXo[RnCbcIl}RӱO)Ql.i<=~Q#0^[ :Z7L3pcխm{د|0@Y2BS;]RAet_{葧F-MFMIQG NQ۬N1eOeCT%Kbx5}/A[2<:˶9}0w[z,)M6儛[8%9,qv*ky>Vr1b4 sxkzzc֕719F9iĔJO~p"5$z|dv{ [}Y+ ۋRU p;PwHmK7Y0ŒG) 7VTK> vYr/a<̬Gv"[BXa?`L[3/5*E(Oe# ԃ"rY$:H7+FAf7bJj$/,\kU9;EM Y!\`Q8mQUo˹Rsk)RG2:'OH%>72Vϡw8 ._u%'j9&Z+TvX#6/ \n>7 }8> ,WuH5C9;"3*j8l Jof=ϛ9L}՟߸ DRw{|"m%nKp 92:5Yj 8*`# A;A.+QEq(wl޳j-`?S;š1 &;I YG"zsw&b=<9I׭'٨-آUOPaI<*5/AUY6X!#gl;?EX {/=wr{߱ttf٠AAF*<`JBwvz|~4OgYVNΥ{jNm Jb*LX^['XBWGj-Z<V# 9@2pQL0r"ûπ.ŗHDhe[&{ vx!GvkAM'XR"s/#ZoeS9/ʕi߉~77JZv0Gm]P &QJ˛Z`i1a!U+[fV/gG8M8bdieKC:O (X `PXZ|+>$}rl `߱ ,рTw_;q?E֔MmD8͵9v!#XTYAc` x /1~$Ч:CIk e-IFpQ. |J䝃@dwppnݣuTPGDP:аHw*mD71J@z(L~@םm1w0pehGtڇ=kS )`L)m/ԛ!/a򸋨%I1!: !6e o{Z4f{@(@!4MSoa4rHU.9徫YѨJIӰXK-c1 .2JUi#d(j^jZK;Zz[!c=BC;JRBRzc gNۼB5sJ Ϧl3&I =)˯0?*4zTAS*"k#gHhiA-Nvi>FO"n/flLKh5T8o*ۄuj{xp|)lJxpAË,qJ!xLwB!a --Li&3D9"GB"K|τ%]Y]78(rD`HDؗՉ]oٯ1ײ@\7˔ ,"`)Z  _Ip-AZ#,o7@r=pjE8 ]&Hx}@)ν |7ʣJBPLC_w:kUi 71NoűE$=;g2}Z Lg ~|lz{laID&GMΧKۺ;+c3xv/XTj@mܾW|:ࢎMx9(c h~b?5E4,bKLfuAjD| BYa_$<0 nUaÔIm+lMA_`G=n# kE!zr{7c|E.Fk أ#^1f?b1+e[wCmQ hh5T Z"fx 26[k׶`ₚA6F~#3enó}9wp+| \q@)TMGBk טF|V}g1sL7!pB=^,cm-K>|5^.! .Ѓ*+pʨq"JE1(%p)@k6Z@}*|)Z;6(ZמuEIl0!#+FTzhGxm:CGl|i,FtPgXړOiF fQ#ǔp KzJ_F( l[+'Ys*{]e9fLx7g4Nl̲ 3hH>X9.YQ6iB)8]#u%k*:~X}IO!yL 3(`wwś[X]ezcՁ8rD.a =fiEBLZogKALah3՜Z54>Q8Bt@[] ?aj6F7,66ᆄs,o{1rg>kk2(V,rvYNo{X@ tpt|hxXEj87ybŸb* ~?;'tĻJu.HT/fGlS^ rRޔ-Ȉ֞K#x_eJY/˯$s "!bʀO\o~/fwkD kw!o늤4OeH +rJs|lc==S 9su-,&r;FZ3Eb[@PF0h/4ՙȎ~ڟ%!%Xao4qjy減܄֎ CEOpfc.`Kvϫ ,ť>mw{~b>xd߻7gwHIy}5<[K#R:؈d{A Y0XX2~Z %+i}DυD+F.Yގx YUe˫7H>>`.?Vg-P^&0tv);9דK m21whCrmPUGO"0В>b ?-&u@ }TuY}zͫWE v*v<k|Ew+E#'Zr\ ̸ٍAz-hXڀh6䐝$>F}*|Dh>IZSp˷n # @=_Wg:^nD(ķZ[ ]2?=^ĉ}6p-Z0ⱴc8D@t+žU|g_&Rrq a滲f2gt|-ӿ=tEd0v lQ;R\PɯZ-2KW9ݯxI< ޭ'e ߛr \~3sEä0G43'ߧQcqDPKÉ& `YPKy.F"angular-1.3.9/angular-touch.min.jsWi6_UZ{Ӣ:(6E@?PuԺV}NiZ,̛73,'qX/fqX.!D2̳͍hQyΌؓY%W>^Hϼ:3O0q&w gNҼ>SI:4+ĸw4s|cBU: / 6[1 1衘qFLlQFgա3AZMv/3Ӯ6ꑆ\Sk&;2{8ohϽ7~Gl&YyB2@uNl+#;`l!f,|: /y8Y$v:p 'zO[\| Bq `rN- Du(kXoÅ5t*JOjBT9;\EpX_IrڮI,C?e6K//r_Q›$vo{7 |PӍ;*ߣ{HF_9Dq*}jBDȾIeJɐ>yGT `Gr;q5Y݈ b{z=T)*UK Lל $Wo;ˏSqwdAqP6I)zǛX)FsMY* j= yOD211;D_D*a]~QI`F2EAB)#x}y!mU)Dke&h!K txmU@pvBxT[\2Ԏ[JCT1eW˖5_dž hz'zv)UIDUd#nŠf(&D72bvpz˥  䢋^X *./?= )1DJ-|,t*>ٙ uTȃb*tttw|~nzmqf//PKb%;PKy.F&angular-1.3.9/angular-touch.min.js.mapZioH>?ȷhgO&%ђێgheKò「d ]]]wU|M8-vp;$rȖ,gt8̱B۹f;!mg@Q|B`KSN'r9a(X ]tCpvP:@xg?q;yJCT9W2%a{Fؽ[Y%WmBQhX3ҫB:x_BŹS< /ƴ= E83]̙))m2t/ `|)<:85 B{B <82xt9f QsIpq^+Ť̕Y`ƕ8&\n ]@~cіF:aLf-H 3 :2%3" |YcEfrkcG"*E@:#"$ND0rDL4L@lp0e3:8e\*>v3qփ9f`u^bl$_:)whBx%Q>2#}QH -DU"5 3'T-Cr#EGr&1p !O)+DlqUj ޵ (.(.Hsk)?yg2,[AFE@hJ n!{_;=!AB~O^ BAfm"~]q`wF$\q%^8Jr]S'UΔ`dpgA{I =E|r [0!E݄9O."OБWIQXY DCE xJf0 #,DUJLgdrY~bvؕRCV=Ad̒Hst ͒?DxօVR~'hYH5z?9Þ %xdICR[|Q6\S9꽙lgq(%!6yr!I+N\ eʔsXˣ"Q x!n$YHŻ bSMZ*h+v3.x ]xAѡ`o =)r\KCƷ 5H7,0y:o\"@RruvEaQytKWxt% 'MՏY,H,fX19q@حYWapD@r{H溱jYUqP^{UuUb$JoE*<$wU+?2E#D}4eܼ-d8Dc`쯅]xZ|tD;><9Sv,4 ƃa2?Tl! $qu™ G(vһ{?^D:%'vOPs&?(',{u8SroqL[ie#ghmOVl QD\NiVq U~o]#GB^=v15Q0= O!l)vrs<#,?K 9!3xs!y{"CC0^UGqPCnB]w+N,x2Q+Զ{A b^j@;cEoax7HHHo6l$8sXJQ& +s<@ ܉\U 9l9{ֶբ T bF% cD=Fy9I*ONċtG-TW,k[P`'2TYLǐ(gpEEYbxBNdL M[NKڎFEŏ3 >"$ 4[ӎ"Kő.H"G(]wu1Mh5r_<Չ"ֈhmԙcqGՄF-FO6̐M]-|]%tޡm,IBޚt c'iD1Q ݡT݊RŎE?V_jѾo -d0+ޙ62:? Z2&+Ⱗ}B؋rnj냜XLu<).U5"Q<޲5laˏnUֵiD&.NJ( Xџ~`КghV2o;p])b ٞ|ԂkN]*[L8B{S9w_3@r.(wH>F*o>L5d{&JwpLtazKU/5{uu&T-`Sح٤C{+^pp_t'Ft/2r&ZD" R N>b&E ǧ:B]xbX$8W ]P9HK,kdzֱL 0{M7 :e'۱b>zT*c|ߊ4[@B&U9tF6UA!^/;bw$9Fb|h7C]^ǸS#24H͉:*=պdB,!)@5lMQt"S *g[¶6?|ߚrh5k7Bm[Ccg?#9WOں^Tju *Ǝ:b%wR$Mk[hr~;m~f(weQEtx .UT6ԏLYjTp,zRx:KNNu]!>SeWw8,n}ՀbRE޳6o*vBz_ՌE(qkE5{F9 Q4ef5SGt.oݢo:KUS d>ʴ{KȊwֺQ*WF{,m/!\A̢j?S6v -N-l*͡Ѓ~bHL'E @yjVt< Rw:4-iF% !˭ʁGGP!y";ovfLXT$ 7؜JEd! 2EyT/6*ZLfu|B5Jk]#:~"ʫzB:ަ:}C%hN wMڗRlETFC (2Q@e%$3afQ"z|щZ_=$?L6 D9sDɈjcG|ȸ6Z2tE]2 3,G(Xy3eO>)什l@v {,4[j8˲E1]{pQJnFi+&#f.ܨ`DJmSr+jxq|:H@6=`hIp_® S9J:+ rjrdXE2ȝsUU:|qȦY6M ~-)l"siv H` : P @1㫮rj`P9OkVd+`GΏXa@zugIOsDha~MQx{pN!SbYuը`W7ہ?g1y!_PK[,T 'PKy.Fangular-1.3.9/angular.js̽^G.!#A2v&;!c8a~ ̼1Bjm!`oùs%yGUuK;q~XjժUKKQ2'oֽw|.fwYÓ~mt<>_k;ZuNX6=Š;.bY>/g^~\ bvٸxTtǍojx쎊s6iQfãywo :Ÿpǽn18i5Y^}WO cnedG9y/h+׬۷QMf3llu|:m65;WpzGrvI]_uo(9AV qgͳG)~A8Ty_H;2ΠQׄ*TK`d0j!Lppqv8D( 0vM~>Ύw( vF[hq| \.IaR |Ė QUegћ|DA*5;}[pzq'JT„ ۇw14u7rV V"s~`gav S A#5Ca+MYy:@BBGD6 ,Ҋ=WX{EAXZIdrlIɱ@9Aӊ*@'XE稏pNA> xtuβKR*;kGÑq؃|1oYڕkݍG1o\YXTHt x0U< }r3Xn'@Ddù`YXME_׶s&bM)Z?[k:ROy#ݾuW/O`lV6T8tƏ!`dLփ, @ {4odMNZ#[ d o&?_ k'-| g9+"{qfW̶gqԇ^sp]6\]VV ueq·#n8i9 {<̏.Nve4ӡeϕU* ejcw,/&FU*D[Đ6Z6xΠvU,gfƋoGt:@UD :g?d4΅l%Ki{lOQ*:HZf;a?T[xQ;=t/rSE >eĩXCb{Au1dSHTwo ntY;bGi6^r0?)d|)dsG6:[!9;pqQTq؛qA21Ħt*NΑhrI{U5D#@jGӇ;C.g0tU(3|vPOgTWY>2˝g[|֓[;{joSo<{:泍_nzB5۟XL⣀jI#PT4| jE6!# g6#qq* /":4ByO_oi\c57@VeͺRmPf%G (gCNӬ-:, o`P˱=H{z>P)}P>T⭘(Ǖ\:NA R^񖶡Jmx S|l7[{򟃥Ņ6I!A5["z47 aۅRN^WVK^u 9-X·P5ZN  jM9 *ख0%eYbLٸT+6ʈh N " gн Zn^FG > *VN7r%MTV=Z*{ݴM*oj!&8^팇$>hk{Ҝ*+D*@!5VI,7G*U NG{Cڞ2kwKwֲc09 &( 9آ`5)-(lvF>V>wٽ_y,fJU5%_=u0 _% HuqGpACsᏸ/vuXı=ۻ)S2WH'AecF0{^>lX(WAKHgt+پHqV ;:؏ynF(tv Dr;AtGe?l`/+Ao@y:J{ ,Pã`Vo"f{kFΝ9s7 t{ ?^|(n4y-'&^h\:@7kM ]ךt*@e 5Ds@ZDKc-B AZ RA#|h Ma^HU!'EρW7PeDbu+OeN7+[d~yb5߫ر!@D2=DCh$a҇AĽ>M&O .gPԻ-ůx2)94ѫ.Xi|op0_ i_• ZX6 L75ܢg6"B&e dԺj#~B?,lV@*  ;,F(" D}CG#=D%ӴR+"2:3kʃ7 4`E\x*ۃ7(`ª8@8 ]; Ң~aT*KMwt隷6ߑ{xQ1D՟iQ̍4Ų?邘eP'0䁨Lv5"՘UYmxZl^Q!>%Q[ٮ88?wCj5@{rJ[H eOOe}Ni~ȱG,1B@7ĞБiC*Mέ/a [w?ྫྷD7 ߽{ʻgӿH$-ZmUݕտߒS/e%zCnHgko/1.N/z!\IdS Wfk ?TFK~  #fvP?R` e_ HY6g׶6~-JCeGtK^TpF 4T]p@UA8 Do`OAT4c/ )|,`jX}!A"Q[0<"Ƀ:)'E94kЇ}>H[dO{O'S"6hS\(`^UQ,$`I (EU:!i4oSI((bI"H<SIRW5YZˊCeGc*)*AHXb А2WHOS:!VEߵX 47wMG:%N-twWΞ]M> WI ~ROuT-lgR2@ l}JwV^,Up|ǖYŸ[<nxx(+?.bSz 4xTk}0$7v 8EYPڟ*'6kEʂf6%x"4< ߶ANO 5Z?RiH+1bN!g  )&_b(` 灀=8:k]Ŭ}s}WFg`Oڣ0-??9]*TKAs[M+$ЅB2)fGlcLѨGۜv7>@ÕF'.a ! 9賵h2!k GuT)}ףt;}j%%B]ba2}ѤfrC %ĽPfỈ<ŖZٿCv0WaRDTqEu0# d&$DB5@,F7dgVBLjCd !5MՑ"PL[%f},pwPjgȀ9 T lUHԯFF*b X'y"wW x6'f&KU4/Fbf̀ +ӋV]/YQNIl R6N*+j{$p ű q ̃ADႅι% f5H`=Y'@~}*`YVzeq|L%_ _@TScdxRrlCG|[_,Sݛ(f?*-ج4.#P˧׍Du Uؔh5J63=:|vC"%fk yn>+0lRG8tDz1’s/ %7R!~BUj&ƉŦB''%]B1ު4a}H/4`g. >7$OhvPQ3|bx 3/`ogd:E 9%lwR}1#Ÿ[hQn)0rdrf ]?@.JU{$%獋6 h"oKn!=x !D7⫲ Þ{!J)cbmk4'vA".Fn\f>xSg0^a-i3ϵi@{31͟0Hp:G1\RR&z~U ^F`c\-2nJQQ6ъw2*1>.׹KsJ{ )zt,^ĢTFk9JhL;u)j"i _Y&oaqg |ّ? e (?eBm;K¡/#2 4i@R\v9qQ<ҍ}]+|3B\e'ے,J!f|.={ Q豹dZyd[.WVVa]K(C<}%G JQeM!A IL.%}F9I֖i"bt"|/OppQ+qH+d㤜;}_OL8؝a Jʺx[O2h9s]S^~tŅwz@OL4Te^ƺXqe'r>=8MXiZ[54\G[ Y & [3fM879v$,Ⱓ|h&45 l#Fi]w ?Vay1%!hAKH'Ÿ-+xRi!D)VUjꝻob1FQ#.Jc,m4_g[aj# OJNpBR/уyi]C00g><5Vd{qe9󌑜gAaVr9MTOZuÉG:y R?1`>"xJYӎ1Ւz\BDƥf{ڋCD#:>݌!DFi̜~hY}:{HАwVmT&,i`D%(8RXT qW($ 0D1!t!!1s\\~VCobzlYO5}91wzi%=|Mu8y(dyIb'K^U&pњ.ߤ zpR( JtX[ ^EsihY(H!7$eOC Hh]$β"LAKƁtA}Y"nF))^*JOZ2)<(H;I#&*1qX3*yP%|Y1I)aS)FO&*$gQvJ[ ,_V,6o_Lu4ϲfIzHф`9L=jy`1sUzBGr;G+u ]]T%$UҐ n;嶁@_4b>Ix #62)ub;D !q23{,(4 XwaB,17%s8BaOqkF1Qw??NCN<_h :!u1jxtEaHx"PpajIoI PX8t F`XєaI/e?q6uwt qffTr4d`Lf%â**0VA;yWT;tG'R<D$hejT@?51K+2, tt-d< 21\&Y]u>\ d -KӃ"~$8>.l sw򡙡0{ &4qh18`pBtBHdmc\UED Д  Yh'T=5 9bRZX`4޽pMxYOFJ!V %Y$@$#ccHJ4?@da~ C*+Oc~WBMˡZ!{{A)e 8dJ1Ʉq~ӎ!*ڠg eHF@Z< ^|5;CHal“Cpq7d&%$~)+,adɇUelXߊ6>j6.i n``:&g}Uxu|@ZjNt;$Lڿ{P|I(=bv)( ɤ/*X&(@=pէvbPI% 45fVQl9,kKKI̴˜̀PD>V+f.l#z&[*aQMY8[ɗH]'yc$H#b'`{H \BJbfcF|+^zH*csګ jlp+޹Ƌ?U満l$wnk=9668O}t3<$.mtg,)6 qh6fV|,\_;T0>H{,HۋN Bxj9c?IQUSLHF+/,T'9O~ptFYU!_G8%!bp)\-_eqx2%TG|-܄r̀_![3]!M>h+):ƆϵƫPáqHgYپC與nohÊ}ATW<_Jd*Q@U˽1JM$S 4x!>T= 姩8<X k(șOQU({3myg0iLdsjZs $lr:bh]0Y&Мuj,yVz.J5/+?wl>W ROlbFHݛg|@g8zTתi)TH0x2*$v %Ava#j PMH‰8 n')8QMZ45t9`va8RP6~wk~8.@8,A=MA!{&)&\b  *W}^,h'A JjB@hR+5~|$ID})K!j&x qކ Z lcaw7Hh0g9.] ?Jt>ۑ 4̣C4%9@2fX%4 jP3.33m*5f# G=sE{rJEaOs0nka@`ca>y2w]ЫrTSl^b^B791 "$;8lĶ`N -ۃ4w 4t(ݛ(%[ 5l $X[`XK|,\qaY2`MPg%$d_H-@ 23+mb$@hy98G]q@ᬥE:PI+ kc!Wg[4bͼgcnÃz}˕ۋK+-@@(nL3}0"H_%3ZAeuZH'pGH8a[({r/ܹ%FhtKrR7X.gX *fᢊVm~V+;[m X[qSIEe*t#,{’uK2\4#+\N]57,tTdW"]D1(IL|ʆ}C,G ӄA+-?xr!.X4޽CٗhRvE;,=oɺBvr&q^!Fjmj;z"Qkvp.nօk|"Lnꌥ"LDDTIv-nc;VtF ,FjD<,/YHmW,uҦ-Ԫ%R JϺ%pKWg%EM DR''D֡JUQ*݄a괒V4({ r!2+ G\TvF@Sl}D 0S`XtZŠ nyKZ !Iq\jGy럛?+^q ni%_}$H9y ")^@7KR^aE-qM]. d׶4Ry ~>)p7̽M-af?jr49gF7BL2@KH?ʖd-/ӷբ8%k3{]BDNI~';X.|Ōql5ChKUuAM#ow[fLBKPK!t}]hr~k%+i ሲTfRwz]Cֵ5e~-+,_S-)s /g,pä4mK۠9V'8XN! 41{1yp?l@:>:HTB+|< Ϡ(V{hEp>nbp$02j޾]H"'So3T#BXrZ֍ [7|V݉A.{q|2KC{cڞōW95W$\> ʤ@T7kޢ^)c` fA#R9v` 0IOZ!5#T,8}6O-v'\yp%m`֮L[:=wœ\ ̀;;)3>EAyQ腓@?5Ⱔ! IrцQ 22͜l JK&8.GkpGtpgvoItpMbph@RAN\GL\ B"nis1`2X\&JZWB)Ajb!xg&FoIXιuK/4C\B2vL*yVWp08k}Xd ^I4<4}x4#|N3^@Ő֩㢗ƍ*"k{{O@"ڱAC@9bӌc,Tk]oJ=It唰^i&g C(8 0u8<|pNyC Gi[t>ɮR&VL x Fĵg[eVO}۵pba%&(3GW87_kL-3ؒC|גT @*aY9F%00O3npo-N_r,`-mBaT=eîlg[C*D.Wb>Ȕ@o0 ^ᆬwiQ=g $i|Pj\^fGՕNU f+^.숬}"xXF*h6y6Lg/" e9jIi!VǗN6q9Ogלdǻ)gCm;:.\]A <>O-=Y* zI߄fCӕS]|oT#أ#<+Sr,w<`(lQ@m/QK\bDr[8SbSz8Χ D&6? UP'N"Ok?G4|6{ Ϭnfwu=вlJwݽw_q|^ý.¼V`2YLTwbZF ܇x+TѲBZ!&D &ODi@_@Fo@xMW2i} P،MNxCNLmHr~Tr%1P{}kq7I`. ݚ8BC," bH~rkf%4?'n@ '.bۧ[B p\Ŏ,pY^T=2PcΣ/..$ b456V&5Umj @YAzb wI ~6K:`PqV`lğ B`ָ#z^%+JpxQ4{2'`\L*>@-K0YQFXt4C3QRd'ٛ9g,z U̐0E"+q NUހڝ@{&eyiIJtQ`Ro>J(+)d 6'paR*L1Yܮr'E&vF!Z9X '̰(~3 $PK8HAR: 蓱 7-՚Pp)O:AO ĵHM5CeܫBa&$KL6h̬,j!N'knn2݇0^^ (l;8"plGFL٢Oumz}d~g$(T #'*  |zzw{QJGm8T5Hދ ;}w; UymJǠOO0(_%ɦ ]Rˎ0Ej| GIE\:M d\"34$'$Bi8$]q40[7/*U YfNER0s<"[$4Nq$m8(,%&̈́$ w8Kyg\` ҩ)n/W~24Řngeÿ0R`ZDE-2 6.\5]`m`$_cFW@|vg_K)hLy>!$ʧ ]悮l#,ΑjIS@lMM"LZK\m ۆ> m9'^v!O!IaX@)3$Qm\co rܣk"Hk&FdIJ@uZe._XG}*j`=yE,79gs# -0L;WwTAus*stC.1cj T:QMmJX:ŐG"F)gMؐ J! J|Jx֛4W"XPw g#L!qA{&*<9fv'^M!&pWu#j,cURjL9urF s$8A; Cd|`rzcڭh1%\V -5T5%Q zxqrJȸB? ,P$z&#AC(Y RxHS[K%D+\tN/urhM6yi_eM,)=kkG>".cΰCumiz[t(FCDqU!CXf4Fk]YNvzkeONVp f'1Y*̻V,0.L,M@D}aY#<%/ǁ3^%7c~.W+H ׆fHjAjkvmu5їzaWUGL)l,c{ Y 9 ]c5?IAxqsk, `0|Qj++,k]lNnm/GwZRt\-\ bf=oHJ5DAJ7z sQWAؿs`$E`R 6Π=Ml҈ ufȠOF#^pٜ~QN<VP+p6m'`JQJ5X~G8)W]`xΠ;+e+^Ϗ ofZC^ *]x0‘*sR\iH~EʃBb@1fT B9JxBBǢE\a&  M'B;vXZ1ro'i')-݉3ɢr^KZ]c%8!4VZT?>mN N?A*t^tOxl0Dbs]lft 9p+TX mVwr$jzsS>L]+6TTwR3E.p_vG8,)h?!#\:z-2~4%"maLoEC`!7 SXlš‹I(`V#g."eDŽS*t.KM@V3S ɽ}T pПᘡg#4Ex ZLk^O R+PاHbjdEgXZxd ?=3 { JST 5&[ szp  ya-XSIw\=.x!^'/F(F v}ͦ"$b2Jհk FcH*jBuMS6i־5JjE=% +bSۆ{^'"! Y>9jؒz8aWYdbD:.Eg[Uhu X%Yv+'5N Yhکcc*m8` a7V.o"P6-& Z S7\]I_T3qSiGh*;{4х9ɐC塃*H $fp:P$<_:T hJ5$Bp!`.n|LigJƛFCSP:8qXS^אsvtmHӐg} !{z+8lZ $NJpbl&(|T(5qD //C#"<| ƪ+Ef wJsk6BR,e^ dx;@ a%alOjB:|Պbd MJpއDY8u..8`X +( FE^28 mҽ=-@8 tXThޞ鎟7Ⲇ?NNE m97@!)-A'V'{RP^2eZ# PE29]5c"s^Ҡ"3mSVir+iEO[St~eVLv'rsb{cmF'] hKK;"<*s(p^FÕbirqʗlSBb`"^\9P\T$Njg\•hsC@BUUJ>/:VوW( }ƛf1Ǎv{X{ܢ1ELOn 0~ӨZ*EIY 7smI3aKR}Xĭ[0u]6".hZ)ZfP$M),jiՖ9k3o5H|-BG1%Kк;- G\[I _N w:B4"hhح\Ik)47B&_~zuJo?Zlje-Br"Mݗ!cĐ9>fбIDplOW)g׊䡁IjSI)һ(&*n-"nϻ"\L&@Y6&411XhY2sаvjxEL^i8: %Qn\G*6|DA8`0\uvWX1%F'Չt _̤1u`W˟N$)~LH$=]6A35+9<)$y=]İH!Q}M)bVT<e(2J_D::Ճꫴڗ>m- PdO/]z">g0'Mױ] @`pc=Ea"y,~x}#*9>HGƎ? 7 9Q'¿8zxhci$rix;U/3A/F{؁L@:pXm|G(ptvײ=!pq~rÇ8nda)ygcc>%b|UE;P#F:Ȕ8xo&ɐ/˗K iiN`߳cPrT֚9]&^p|1ة5KTɉnn;d XB KoMXV^[FV[LBfӒD<g;RqѶV{?g[8;^Ӎ|,(|HZA1YL>"Dhg8 *\+A/pK.DZ]Ů?CYtC>D<^Z|ie>WVZ |:B^~щ, '\?xH`dž(U򣦜@ܔꋰD*7] yx#s zd9/sz;#3']\&G]\kf$;TX)?XX*8JwKR~,{~M3 mѷ1KUUt'ؒ'za1 (,=m['>Q{(]W㫅kɺ_))c! ,DݟMҮYfP;b(-@dh L&_gV V_fWN.bJ!]s[1FHkfJ{Xx\1Y 4KFZʹtVE㷙3ʇha HڹZIXl$4+OPb1ЇSI%m+x4c"SKS7\-4(g)RXl<kb ^*y))fd&J!56foh_~X4 +9 qG-j1hH7)8aIJ2vL1jYnbBY./ _..}(7f5J_g&ZV3+Fb3,iiYӼ`ʹfNa`C-yk6+4fe)JƸPD T s;„އPf=_o.޹O)Qi&|B(r؄V I {24E6*̲zj-d˓vC+zPd4h%FWo;fZZ0Xfzл{>jiE[:TtFAG%9gƵOw^֟lnmV6ھEO)[39il+[f^TB_GsuU.罧OGk"݃v5 ԣLQ(Y~mf3)Ci zc.Z !*>0ͥ!VHڋaxrD]|~~JZr~J#҅@hDDC,i=[@rV`G\{-RVFa4vvHHYd>ŊUdkI® >@`LMGTp|vP @ Pݧa{⍟-7AhB = o0Ϙ3#Hzo gqD)t&Jn8 3^l%eP=bUǃ0ll))Bt| B - R*,i$J*k 3ednWkDF7<:2U&m`Aa8 _e52c^.0XqhAէ3& -dRr1]gua, #EhG<0)OV s[Wc pH,R=Mo)zwħ$Wg|7=rBzÖC;7 O:20eC`Q߻;܊VKbe^[V?i5;7~x~pBޅ$ Uo@F(a seoE;g8Y'm9ݚ0X84aX0ڼP\m([R(`92ÊOa<դSb\a-yM$DD|60;涡e٘m)KW?Ml\{fkqFX>W?o=)r".BɭBWOן`5/B`[8 brR>B~al=hPҤ&"M8E%$ xrS0NT׊WZrQV:e+n0}CļtH^ .X Y$LuɲΜC0% {ZP1Cl6XS6`[:zL?>FX 1n hˆ9F\w:ƙ# haXpvvw~{?pŗ?~y]Rǿ|j|o wk)MTa!PFcpDE}&GbӛÃŗx".nq64X |mWi!"Za@'4@sjjmDs+hQN],tM .R>x'^EUG^mu}e".;ťXz q-`LGߥ6}ԑAmiL!v _͙72fwi?e>r)^)BE۱gR ]q@ʒ6;Y/1~F$w|.%c5Dˬ(joKx/f ~lw.t;ֳFw548:x,5|frX,=uN?DƤղBdYc ৘jiHfS] 8ŋi:W)w6kt+$j3C"*evJ."IZd%Nf `m 5W@Bo %6hn@bL8ٖu! M4'hq /;m?g aZ7.Y!3xu&C&zq:0E.ְJCNW\ǵ]i n~H JU רtxL۶4Wvyǩޭ\(FR<FYx<[ 1lD;R;[{ cO0r iX98[s,bJCآ9 )CJZe1 )'UdicsnĂ7@%R r`l G'mX9eM.QplƵy 1Rl`=K;|-fju/}}[RYU%~Xr&L`ͼ87' pF>Ux@+#A DiZGoEm]U3ƒOmL14ꥣ+G "UAbgQnY/P.#wq}\5o:~(xXE%__|'c Z^gx<ˢC+5K.L66#yOJ{KK=NuuT 9;Ax[ n~9WL;JIΌX8dž[ D%$r)ّ?Z"+^2~n_Q*T`hՎ85 |(uxeu3-OqǹЪH1D'_ԇ̰rigXb3ق][ID*O[5VaשBJbtn"R%b$@YQCieNHqH)IEVb0X;[(rb%6^j5H)0iW 2 iDEέn5D+wL7-(W V2H_vx'gbǯL{ \Lyڍ1% h.m̧+#EGZLb/uq"sJO:kWlRw" ԑn˼[9y,Ij8 AC]uf!of'EH8iџ\2 H!Q3bcuS\&}~}8RҹU.{@ TN+aX_dx~^hql34JTEm$,ʼntmucډannVQYRY^E;.x_1~?3 !rd ,W]G8qÄwJ*j( dy)cHߦ1?{Q6m*&|MpEqL6QJh_FZzpc)A!V :4P Y3 }ɟY2ۑ O{Ym|!24qcb)m$TΔp>kM"UVH%!"N趼~6mne~~B89/˜I3pO:#GZ!Ү MJ?B_IxA:h5ՔH۷3yoڮBIIWòA&D$K@0(WzPֺwP!_tH0F(3,hThMt .T v <|f:|ZI 6ְI/Nqu`!/MQN]a].||E-Nكڔ Ji$ (Cڽ8eSkuq[2$DbC'c1i$"R&aH-D$i7DW7ȚN7r`)Fݎ,)T;~̀d5(:y\|4 V+ׂ0nTvΦɢOM#B=-MPDw.,D /ctC.-,`vy&D.|Cn,YwDoGU).<8KA&ĭw}>kz"EIr!(y:wCB /k`9vPtEzwc[#]n$f,Xb`U E^\$D7b n<UG;u~]p$gD/S=T.7dRp<:'qve<1xFJJEIYgqH)MͲIG$G/oauP%2봳1Xl[ $d});td * +5HF| mo d'O-{Au!-8"g@kd{R ԣ̻}I^.7̏7q sd-THP =Q_ﰴ0j}`bzքI; S4WP_X(&ժjLkCG-c.#23ɶwEbkХJe["Al- EN~7*-xU<9Ӆ#VG7uWJXQښpqCqF^y">pCb8bAX'Dgɠ: E_f#TdѦE1tI =ߑ:UugZ`h>[^LT~V/\r>(s^}ޏXC"#quV73e C2Îލ#ۺ ?*M`B <6I5+J:SkT,=H񁏆p0_WA"c򒳇-%{V  H CO<6"Λx2fiSCbLƴ"NB;Otۀh]~hC '[ҥm#Nnsq9qz[8TSAF}MWAqG~&5 ofhRċނuP 4@4 )''7/UuN7@Pg!%+++3+3+T;?>U[M[%hf5Xb̨3-VëяMGdIؼ'of%B@6TaDpߐh4LCҕ  r%#ëF rP +vڛn?%msjs!9:Uk(ii `! i`=&p/+~BKJ[" ]V<^-8)7*g4MLdZ|mq%IUZ({᎝9uM'R0kEU^זR@V4 sh; G*̄ah$$-8&rѽ ,Ajȇ#X p욒X_͕oWNy<d28'goJSydHvT@1rǽ ze7.vAxem #OZ&ak8 &o~OS 3!J":;.G-}vҴCs,,*ji6tn=&ڗuO/zPKyR  kCFF4c o ̎?90~xa ܇)rlt)z8>}5b>`"w!ҘpK;p`>Np?y~  V`r_ތdkJ16|o{SNpisJ! O#q_jWJo ivbUQEW Ð}^4;J"iIH{2dXu3c{."\tM'K$d RJGFrbj'h?QQNU)pDGbWWAk۹{U/k(%`5{z99HyxvsAttrN$_R$ 5nѪF\;kض- HLNMɏ!JlDD.)訁 ppm@$%pVbVR9X:}v4H.[\&;g"/lW+4{+0JWLOa K~Q +Z覘:"Ra0iϱ]J\ZKVGFrɺRKJ}z15qw: $҉!:I:Z5(e!zܥX'n>GYL ]Lv/sMs "1R}sۊYݶ9 `(׳, @]eF_` [{K8o\ڝXDxQ]W\>NW(k@li6XjA;}ؔnNzWR%PA~fG8Su]Bk0[{éB`F(7_P d:ڞTbtL1Y,%K7dod7FXNE8 ~BM.sRTJzᖨ|75 >Uby9Wڈd+IMKQH[mx[a0'>e3o VTS۷##;ɺc(YϿTT9o)T>H=^?$Ltn*6IE*F<6#b0KeafBꁙ*::|H~2F FjL5 TH[+MS<^t2KtIYMAH d Ô.A+h6X^<(vAC/uWP9,6]MhLfHOxydٓ0Y]_> ClsIWNlpHCtE 5G@F+Lc,Hh)B AdZS&9 *L6.& ?~ ^| k땞iָC^Eq ,i+k.ƹ+_ڢh7'+_䉂+3l?PÕYRgaPޒc@ 9Ƕ'SKj *v6c ZLVʹpʪEjAyWsLAy^>^`~a7獡q S;;XӖf%慙MxR<МM%L)Anਦ_c{kYR 2p. CkF2 {m X `yi¾wT5~F qĻs|{iS&0bV[+O)DA9qrB-B3DDme@HO 2ot#Ze{`jY#cQ((y|NEA붬Ƈz0?@Q`6* d1&QOՋI!2U]at#m+N_/&bhQ7UмCƕ0uT xsgػֱ- U?TE*Eup79̞<:)WOC2CK6guͭse.PAFbHno:LͤSrz9R|:`;zR6*vQnI*EJ$gZ4=Ql΃Vo_dE"qTR&\;^&plC]IA_ɉ졧@m^G"'PH4Jfe'\+ХEepJfa"ub~9.S] +ɍK8.4Z55{kk}p,[7FcwvGu׮ޕ]gM"at0eu;Zݯv/z]v̲a|tH v[#̟Qf)I1XE圕&4Z[ȝC1Mi9msT: RJylP|5e72KR(k0`[!STMy d#+[(ZѸ0TyxhDEm@iHb J2>9CG+71HbDWcH< /Ϩu @X[ܢ z>&F6iEh<4)eugDž"NY@ZhO( R<;A<c[dqzBUp*x7<6`\ -W\@ 2@em F( (H0``I'f4Fepڒb}4V o¬CY2{7#GNϛ|[vkvtuXD{cztEm{S? ҝӻv0ϯU"[\$Lk? FP`!#~dx|HLǙL Dݺn (-0N!t6*Gۇ"'?J9ZrۃŞ&&䯴dJìxB8|N *6XDU~Ȗa9e'] YK1 .qJgB(vGs% YoI=xXo:|pMY5\tDƶ6j S]rPKIW;PsSS['%MeŢs,g9L.둅Kd2f>G'W#-3Ssn n|\U2H$fd19m;%b/8!ɤ<- s$֖ffG]iB/4WXHѩ *ɖԿA wR/)j\ThY?7]I]NJE^rو6ECXw''S˥BYO"ǻF?[qN6{SF 섒ٖ"yBYE}m|K: ^zҗk T|pk_Z&QH 3}SBƒkl~Pz6e]fʌ׬^`ZU_Eu=D 1 _])G}NhìfZlfvShuo!X8pix*C"W_{$ó'6Tҟ[SW+}7a>z;*;rahObP{X_{>ߎZXXq"B(Q,䉲Kɏk7&}`)NmPÀEIpRS9&"*Ie{=)eI-UBӱ=/O?gtV<5mڹw#vceW AW(2엋k9A-̟Xt8ÑTEqT'HʆY[+Øgi(AjN㪜EM j1>7l55;ƕ:T6 \WT'uj.;0S˻qtEKmg~KunVM$ Utbļ^D>56B8#'m-wRQcTEhض:B ܻO?M:+ RͿ9T""p`[JNQӭ{҆9mxϽ*CA {KpĀCU9+7j6ʹ<^rKxdѦhۥ̶vH@ l'XTPWhnL1: Hl)߃RY`UcSɶgX88=yf$Yf\U/z2(8z0ϫ]$6) rI-Ăs;VO8BmKj@ߌɠ2meJUayd@A0,2.[kfZ,nY0ٌ +]vR͑!avT$@hF#iFf I*h9<+KZs4ێ^M>4X'+]1C#OVۈ96Wl?ڰYnY#&4*-uNنfW hC:YӨeӐJ:,B!1&=8N`VFQLd|wZ+<*NA$,+;:PIgJ iOFQ`{71rdfwfDħd!d ?;/4J5nv 6[TTUe˶ixwb 屽O='<]9>f& csDEh3RւPf|ń&M)m-qAe^L\g`Oę sжUc+8ٓO '.yޓf}^rv[ywFU85(%&{1㺙`iHV,0w&}q}31l5P }”u\<Ωvo71׬lmLp$2%ø%Oöx|]OB;b\ ËN:YFCr_?Xځn2O)L}Ԇ۴!vidc@N+̖#-XK>Uea0ؖ܊% >ɔ'QM])_VMdw@:A1@*#WxgҚz_S%-QfbIZ-NAjL!Ȇjkt.l<\sW[%F) ^Dbq>ŶmX'm TW&=-Ģ1z/^B "~CxI)͓Bw۩#c姚b`N1KĝfuPyR!t@HMI]p4†Éa!hJ> iM;SUwl,$ܣ穁-*m6 ?CcymsɁm.b;)m :ɼ.³ݪǍ\ Lvlu74Rf{彸1?fE2`,Zm s2l{ 罿El _uQ=d@d <:¬U \VCmZ{sws(,{" \)m7ikBr suo>/h)m\ZdjӮ1ECO+fA@e/\6ғ D˼G;~Z<95Oi5AkP7Oϲ%tX@f{=_ )mKRqLoOKDjF¸21&'uuxTm!v'3h]]h]ƻrxĢ &Cv^t TKP8N KFT%5J$.0i{tP[,LEH@~C2[N_MZ9i IK%L8jʓG" |҂) Fi Ɔ1#=8hc%W-sfn.  {j,o/2Ixs6܏_2,ZbLKs'9||</ EXP+"ĕƗCV䂀)tSZyW"gJeQXp*sDWE,ꤡrikm:QWZlp-#<]MYBgAVf޶q#KHHW7U&9GМ:(g\iX9P{zWa(`zH?5dl0SZ<[NZ8ª?DW{hnuu44k5V m0'$#8c:(q8{X$XRi}uyU3b4.JƾKQ!(((4m*)MH@X]Z0~2bjYڐ1և*߄=[y =_ʠiȦ0L TH"(v,>Eؔ./]a@Nhp7?=b-`r"-#T ?*kSem %x?̌^+GEk8(2 z6\P9|`׏cU !#If> PjSeҔ˨;.欗|q'eLV)L$ ti9/_tl` ہ^_3T=nZCqBI|38ؿл  dDQ.!VQHyS2%pY80YBs{̧#Vl q'o_!L=hbjɁ-BQ iփ\*^]*#qίc]yoa8Iw<1+:9,3-&f#{v0;b.v(ճP K3NpKGPEDWi\ %21[6GaIl*̓?\oi*6k6bb]³ CuPY ;΃"?s]DLK+NAUw(O^b[fEiSOc"S֛hZfCAnRP{ 7a{;"{B ʉLp>rsy[ǚ7'4&N+$nXAn`z¶60-ya qJMPdS:0 ,T'zѺɈ6ě\TB3EЫ`Sp^j(N'_  B2\!b 첛&_e?l.%ܿuwb9%+mwFD ;,|NSd޵1(HTUQ-С ;>Dnnlt4vL4|6q(REcB믙*JŜB[G }><;>hL= y68%+h!H]S|z+t}!87'z?29'3+ e\ǣBb_ I#-eO8ivQ R8[dTaLAےlMNCXDC4J`$&KfF;dt!:qUu Rh@{]T.,. 1ԃ4vF 35^T7&~ℱReJr*HKq(" BFNk̞>3͍́2 >jx$wʾW7+Ӕ^\;6Ka! Vs|.OU';?Q? k2w;M(3#HhTs0弉Xޟfl: |w: k&Cnض'o fJ~" k#-ܑ=эΰP̂wjNU]DqvGúl)Y%wԨZ BM&wL˜Bt !]|IsHf %;m ƼnF" |t|iI@^;|,e_ .u"Yl>A11E|Cd٤mi4 ׽og!>;bQ;\uؿVҽayS؜#fo_ab;ju_ebykڲ~ʹ]ha2#j= &#Z9,,1\~ӻ?|{onA迻tgj!Ƀ=}F˜2K ]'Ղwgg8(}E7/2ȏ'UB; 0׀z'aMNB95ybjFx@dȹerSl*}}Kj?pXtgMV $p"k`SO|覎b q1հo9U-,ؑmkK&;*r CP9cvHtfv`[0ն`&R{@q}UYQ JΚHQL>8eE롇:- $T+ݾU @h-,*%L`$w-$┡B}v5Y Wtc4a +x%4V$P^Ɗp'.*#̬.M"(=dוbyYCJᢢ,M)GnJj>Yfsf^'lqc ^aSuEa`~|+^f.%)37GI К}V#fnFd. 9ܣa 榨$NYRE8('OI>uvxtR\[;3aIwvǏ!n5h>;QĒaAoI Sk PX034D2,˷L[!ҜKB#Yh),Lh`R1',aa\m,K|WQ(s77ìr4,MerD>8Zme#3JfTfi%^emӓh%5hub(eɰUPI}lOZ&c_M K94Ohv Ix;ELO q:=8dv Trmr0$dC9 eqWqElG1u1}L@`|G"A,lL3yji_$KX :ZH n["@Zrjy zPܙeaֻ힃^߀?/+b@#ۢ\ !c3E}NCZKZݐQ.&+ !'dϊIlonuVmY&]`;4%&Z,b]FҊthJ}J*(u<™eg{d:[w0;[䆋Иb3ߨ iyH \ uJ]5jR?%hlX_126lSJ?[6<ԧUH\~4_ h 8H1U7enxwek SLk gL3,%ƗS1 DYlGj \{jځ,]m|ϫÄȢBYo7N6*Y\:Ă褂-:Z!ϊ=\G]*qu^/hn3zwK  [\]B_Wo0{yb=)wɮ(# qFvTDޝxoXʭ`h3l7>~;Q촤YcvPWHB t֙{8&J;傐e^3Q8c`+yMS bng1x ּ{^E.0ʡfazKQ>\/$JhLmy墽jHf%3Ve#16HP]&C^G;-$ oUSE4.Y +XqM N=Q5BZ7+&,#v?I:In6Vq+. n)h Vge1Օu*Vþ^%iZbf 3VWhk-c**_FKvAP|h9&2+}O &<6򾝢^ܳЬ=he>BU. OÕb [ǩWQ9_4o*Ƴ়R[)XJ֒K3vv0̲ fC7jPPMS6c:\ge+'q`8MԔ樟]WSnHjW1PbBnQ2=!:'3Ϣ= nn~B' ȟwe |0^[nH;V ғ^'QwV!jW+B+BI2 f$wf L\FotB\n[Z=5R!-_(H4E rIad"xNob튚[qV{3X#5cbu&ax=&HTd9K!ZѠ֒#z{UDžM#aw9AZU08yC]rYJ]wef_K<]X{ܠnGIʢp\ Gt&'0b3E؅WW ֘FXBQT~ ? }NYήr8&RuGNT95N . bI楜NIfj#\?,:XMpsV*ç`2-mvwmkjER(-h6*av5,Ă(xpE~n2Pm-}2Y[?yb|}Y+西.NhLJc췗`b=݂;ݽԿ)Fw>-и%K>fW#:# ~Z>TSrK@ $wWWTu y*cя'-i#]=>fݭ`΄WuSfR!2p5i_])\:Y BC11PSLj̖S::* خe+M{3~#t=65Us<m-]ָ,fר\q{N2^Y>eX-̻vyj=6YWK~>'; "Qw;5rgpg&t3;/Xim n~ci5Q~jcֵ F=pu-X&8B7YVsnuI nê lxTbǻ|OD>GX-,#%Co].21Zŧ6Uf6E zITE% ξo;urZ9!h//gm}levL#wEK!~Bl&z|ۑ GAPצd+G-[uLX>WNH9qxX[#˃Vg"ٱK<6`&<Lp%`W|D2w(~CKO]9?"M:S"m3T[VwSa ë˫Jd VQ> e'O&/fDcz7$?`mso[Um̐JX"Զcp=δ`g[n`f"rG<͊EPA4r5-vۓn/%3q+6'@~1j{m!(y~a)`1NxB;@ErH$G*:ahqQs"ѐ 6])&}Ӭ;.҂, y`иF5[X+Dܰ!VT $L Ǎ$VG=ͨ $zPWfMBـT߈Awt O+#y4 E *LO]3PQz)%xWf٧pk(K-(&f?a tHiʨ]md?7sLÞwO> >(ov܎ILcу(@ f(`)cV7d~ F}`nh/zH*20"Ie6bn*9-_a aQ_B"K[2v+MtMpvoW96/ 'ytEKnadQ]|-}N=B!&}ADRѫ-f:1rR_)6+u P;s殮WjFJ}b9WJL;0JjW֥F*aESlj(j8=ͻݡkXN'5ޓm\VY77$UI9T)Fs6ja YQ3+˽ч"gUvko_l "@A[O#H9i ۩9VT_-ڻi2ʎ:UuSh]btmr^ V~ Tz%.Mx;)(_Gh0%B% حϒKq0\EBgWk̸OTB;j >~]3jJ;ۡ~d;\R}"DElnV7_?ݐ)8x_}}s7-|d`7ﬗ)5lۡu71LEUݝh<Kk0EK%[R^yY,_EdB|\5]tf|c9ISg:0 !tSUD9BD!Y"f%v&ai7s 'ŝ,>Fh람Miq[xRu=2Q*i l91[9EgEB Wn~WKǭ"yܟsmR$'Q)!Psnm":lK{gf*9 Ŧ\ޓLί$3UDkg]]$/: [<8^_0X!t 6\& a.ظ Z9NsS.it=c͎gctrXQ}'.!vl!Q`4_ ~4Ǟ/N|)zٳul0H ['v($HE<_L I ,"&װݜVL`~e"8Uဂ7 FU[Sr&zB+⎄ FerM!l:z2N>&ȬwZEDo(5"0(s؍(Ĉ^;% 73@6mJG2P4<"1P:۪S\%@KxUqY{qE pNdjm>{?~WuF!ӖHx>Q4F:sE} 6Z&TH셐i:!27cϷ;홎>VRp9њ㣊"eg#8pzDs Z6Sr /AR`e'l?=Aia6DH u7S#O6=Bb7qϮ_lcǮA#bZz̴u{jeS}=vA:)tL Հ7W_./=_x1N#bإUz탭 1cCxR*wU;9; GJFQQ/[c4k. Zmje\fL`CjR|V+/b <*ˉ@=%Emg v|n!S/PV2.z"vnc:6{(ggg]dEM/tN3RJ+Z]aˇBԦĐ" =Jծcwy`ޝ(J+AvCtEj Bm")-Ag[#$N!H ;olFA'H. r&F\nh9^sX!fqmx"ruo_IB%Ј%]]av!z>)ڦoE'iTU6}Պ"6HzH'Z -) TfL/!B~}^$H,)TPՆ%]+8.p䠅7+tY7Cemf g7wi#y:s/yߵ*.(@[l>id2o9ӂe<_Xr 7%$sR66(Fy jCp(,7wsRoS׃6t3jJ/d Mu+ ă|xrSgY\iTtWlrkh3 "*>:C}.SiE[>x:^I|X&eCs /VJ'=7>; ln;ܮ<=1IWpS*5u4]-)3 2>~k]:Q"defI"K#1rn‗ή'>PDvuZim-ۀMwg8^ð6pAn+FE-8FAhߝ8R C.1E-w!Y'l1K |5ynD!D_a[ q_ 4 q/䮒1籭MD{J~G+пɡr]+Ъӈy]|彤IrK[b3į*~vM3q NִXao4R9{*gXXbO5!NdKj9GCA_IGǚ m`Np xt8}PВ떖cRK ;(]j)ԪYQ< 6iWY6vyϮ9!_k? EcV.yg8*C< _9|!I{ 't=]A]U5C₤$wh =Djo=GsF?Y&IX@i'%;Lrxj?&KT8 }k'%ԁ=3d8 8|jhNI8Ɂ ifßhzyl#ɕ 둒'zI{^w:$%yY/-\Dǚp<ֹ>Hm@ds=k[cKuq]'NB]0Үg^$يgr.OwϠUE,[oNam!{?6!p@pŬڏTT! zFjScj~r*Ԉ~+[BI`Tv (PRK-ez [TE6Dzb@<8#PCMd{u3L+K.Rr8Lff[DA'ƫ0icY%V6*?49Fg+.{Žnk0e7C:*a3QDI dNml.LCbpy}o6[&S-rk<.j!B 5Q@0Z6^+? 6əHghTA 8s(u98K.Y%K(p QHV=CJismC-dgԸk(Z)߄FΘ 8LPŅj'L. aўYIPg1L\6Z;p]m#݊Z[7;űveUduanA-y]Kܰvw,- kW薿'G.l'{)Gׯ{{/72͞?`T4rpvrR)%֧YD(Rt٭J߈1"OV,@}ƻ%io݀1$.#cS 7.ގU, !."i^YB{7ύ6NQm Ԫmp"J1m= /wEOW?ίa Y+f,dXV3-YY Z~a к05e)XbJ(aN'57OirhW &ͻכݎvߎ.CȰ SZdM $Cp0t%5B8Ҁ.16q-/*k7jB[Qk}TF-J4]9pвRrFuBIf@hMbݫZHvAakT+?93_wOV79|EӁL?;&.wWmikX|Bܣkɨ\ѦXPk9^HQ@VbHVez؝z /ˊc.`-(A&վbdLgOn ͓ɲލ?MVǦH?M֒*6=vIܑ{O-`t,0ܦuĻ1b<6mwfҔZXϬn%4orؼQȪ^F\faՑR PbEd %d3f6DMәZ %J iȁr?Ī tEΪDP ޴[o2i*$$ _'Bx"x!yPlvX֚Fu.O#ɧ,)&<6CEtRr}}/텵bA}^'BedSXnE5#/&86]ȴrPUcmLW+ z W:됈l l46BP[uf~N$xa#6nצF3K3 SF#1i:},wKa=f0Ԍ t闈 U'߇3"\mV,D9~ёp**Utˁ0ri7bWdXMμGznR)fSd(p2'rvPjʗ۵(<|T -⢴1X S*@KoV򀟋ו ,'j71QʾL7h;mӵvJa)rIP9aO#qa&L  mFd &':lK'?-(g?Fh[p<*r -R> E)yEiw3شkvѽbA-t;9}wHOyZL>m8'ځʣ鋋= ߟRϦzM ;&ln־4* H/J ".xnre<DŽY ~mN'y$e:ЬcL>{[zϿI* 06vo?Q5)\詑GYw=u]$)#lOו2 XlSrY/f-[#JcD U R1.W($#j§!['l7yoT ơ/`#. nt{Jjtgh[ΈAo?>Zrcq[jT+ HգcOm]`AFTܬdN_c?Htk3kyh:9ɚyq_G /\׊{}ږ{6~=Oګ/pJ!kZz@3VJl54!9PD\)'e1>Jq$$.Bl~8|Ǡٙᨴd=bϽMNx$4wtI\Ǵr%**A7ңC zaɿYew|+I -wJ+Yǥ? !RMtIᔖyJjgG[R>Y p@t'3EܧSmZQrb HDsBP|6Uc&ЅOFptB˒oqnh)6"HA>% |5D# d$(O[Q4b%P.^mYՈa:B\3v ܫ-pi*ʺsѺ:m(4 Nzm'sv ,@X]6+C Gn*f[;iQՈbq#D;N-]=zWV? i"'m| kt|򓇈{ĥ׺ [p~w/Om-Qz]Et1v[`Jh}M]mc+UxXmfe0X"$B-Rۭb,mm./6 ȃ1zz>LB-">w+?\]E+Ebѷ|FK:z' ]O*m-w,86y 4u/1]wvyiErّJC ys-[ź,ˬ P\gQѰUk^d=e5cҺ٭YK);ԍӑ5JÂċ">ȶ[ mF(˝|ɍpeǒbҘ\;[WEY\ɂtD#t2yS΅݁2- 6AaƝU$bNӣ7wM[吿݉9M.qfi kΞ2ߍs ¯iptx\diѼƷP@˟Mq }ϓe%p-C&RRqcn{!О[=|?(~fr KqO܆%CxH:0|- 1Ķ&cOSmDfj €>qȒ&Zlߧ³=Gn{ˮk3(=XTAq+"OkՊ6a $m:Z,}i`Z_FHϭ#53ݻ-w5E݁U?~H"x'[!2ȓ#v/\[/oaZ`ѫMzbD i:Puc&h~ov4Xl{rFaٯ[sK\Ү v~l3j=  LF*Uv |Y׬irDP,K\mSbZ/50/i=?ƃ~WPQ<$(&U0+UjK ZH)RULrqZbt+acdu:QK.CP꘲3PXmDXĥ"Ͳ-o;lko508 ev}/J\ Q5f^HXJhtRFMѢ}`4Ğ!nHqv$\DzOjj\EmNrhG'i)/n %ֵ0`UGi=b#Ĉc01 )"bM2O|۱X4$WD",tli_txA_-IM,ip@ ᴖl,^++: )k$uDСBth˯ B]*6 ɫONU2>MSa"IR d UcK%"$$ UoFY`tTI#[S^@*7Y`dI#_h*]?/5dx)w hٵMM_QK+ߑoCŀ"Բ>MCz]dP&URYJrl /rGZ}eϠ7*w8,1a ]Z3څk W)~lfX?sSTXoSTIWDm[*>1E%#+5&t δtLR;j9=NbT}$1o4 =Eq"xwc_!0)U+kfuˊE{@]>nôXH-ZfݩJ~X%C:q0 +~xnwS&uKcfexąbnXQJ$.,WKŶIm^]ڶJ%ihj;1keGEܶBK}e =5S,f s0Zw%uGжFQFZP*-d>4uqN3g/ab!Iaԉ:m6q{Ol˓7Ma)i\X籔[%͎hbx4 _o4 ;.cU`pPGpfVjMZ?]~J=RJ^MHҵ:#_9B ].`z3^hpqfMx=> l[k,j@J˫jE jO9|ȞM2uțL4mU{XQtzh-SJJȢ\OkS*T SXXJ{(Bey2˰Ƙ0]=1i޽jhyJ;-DMhufX>vI.UL;ig=!WrgF6'`X^6aee?Jg/J<\f)+'YZ1#*_+lo gĔȾ s`4L(ڒ-enZ8܏Ƣ=V-'gp_lph~1fZ L܂h$TSdI RxVXy,iS:(*os*;˘?'YJuMnrwA̫7~/ia Lڝ!dԀ}ଙW8  \Q ^Ry)~Z-lv\ȫyїG[?kpH ʠJcqK4aws\_#Uws\~PTnD =bVS}Ä?AKA_ngK N^Nty5e,w["K Brԁ",ʫYub_odpB=\Pc8gN)udCI샯u1u3׶bْe H^ݣ%({pe𧍧<~Gw6?dzaa)H4KlS翅S- . l}1Ǯ\&O&<DL6R^\ghQ%kevAK4[Pݝ6TQBetBzlBxLqh%֓d:k6^¥+]aRꠊi)M- LH@.lמ3&KgpSdsbt4/UH ^gHne,m `env)0~76n"iCW OU[*[*=LUZ֟, =ژLdv0Vscw33ǞG4U`QN@q+ˬ5,UX쇙[ n^ MÀ8ĽPEza32Kp/`uͨXO=5 ANSjBcPգ#wi &[Jb3G,@Z^7flJfX9 |߳$uNt[& :q:Og7na)'PD\MZT6д0MUˍ嫎4+Tqev73|l@Lk_yITE&;{>CT/oNM%ı@X2p2>E% $]XxcXNbld&7Q`j-F<(+xxb*=lg"P$A*-^ #B%M0>ەƸ{zP؜Ȳ_kc ꝝ&}s8}ӳ)NY٣GP! G@K;17ϥ3Tt1rX`%'))2p v<"Vq] 9oo4ሸyr)<_q{̊s}90X~^>`%2ĭ%mˇ quUaTIO4G&aRa=y}-ꃓ wd(.d-a,QTPe;P[s#@|OCr)&E0a{Pp/bzUbM[פakU./j+տP ^;ޓ{Sg Xޖ{W0<FS{%m9j^ b'{ZC 6T#9UQ W@y:QfYkͲ:79ylb+'$;n-(ok%3ȝ`z"j3[IUv`8 MȣAIJQ]FER$T QgDP"hMսEQMSzr㴇Y!MjԮ/SzJWJ|w|%CEQcQia5qA=?D};;f g(z_l!uy,LFj6@ Am?*pd.<)r::J-$!\0%2qPTsaV PC_5 WU{טK:yE{v/܄miCMKHQ&׎J׸UGvBy?=Z,27ɽ忴vhu<>=BHfZ%PMǰp}!ґAGm<{1SXճBHZ$BmEzQ,j #p -J]O~ Q`:Ī9@D/=1YxvRnjXlLxmu/fC_( =ϰ Y`b/;iC67>.(v/> &K y:Q>m>ݗ.ݘiNpmPY@!ԚsF "\ wB8+{ND2W@ &L6C9cQa a޽0`ݨgy`A,_#-B} dpF&l9C0qR͜Уd6ȵE@i dF2ȥktPAWfso:]饰@NDBL5n[Zs?!O-/;Awmk';NrGhHqC1&Bh묟(~2`C't]w,^&K]T0ƸqP2G0CޣS{_;jO4?joWǰތ&-nR W5pe3^PEM1X"HN٦me2}͋-éCClQx_hC zߋC> n"JƫJ X:1mml>v \LRZ- ~ݚ]ϥ%doO݀ŮڼmmA߱,=;Z%Á $Udņ1!U>{ s9OTx`Cdܛ=ڸ_4?NwR+ZAܽjh~[[@&mrAt6YQ-Qp2=K\sxª"ο %* /3+ #* m1Yv5HNE&q4&*tAEit?EG 42Fkz_gLE晡 P. YZ4oS4}ĥwX~#BSb SeijZ (/eHQ@#T5邈؉ 1:6i5quܩQe\ś[?պ14PF=VyƦcMѼ6L#qOVM'koiA~uy.| ^|uYvBXrymZ]C妫F&4ai /GB`P3fϭgm%k|-zl 8G fOrNrB*,a_2Rhbyz3nz>st}I (xu>GX2<3k=r#:z0M(oy*ήi jLQ+0cB0/$}¢@zS|BO."K B" 1|ƟwheD.ǚlDqxxFW#REF (`LP!)5pb\ȇwsPJwl-Ϯ>jtb`܃;0Q D-&;G3*~unh$3%').XebDpT>A" G//$+so`&/W _ZMX# e$cUG$~|8|.4E31K1>~LGd8{ $@HYb66 .M QOs':k=R}k3g,&ܴ XY%\i I1 `f&Azqr mLers"ڄ@Q eKEI!ge@Y0w ;W9m h-M@Rod̊ gNNB  3.ȧE*Jv1@%*6BHw|U A*.'NNN:۬ߔe"1F8Jkx 9W!P$R5wH@| îHZ MuOȔrm2&r_b8I ׈| D~u[*^ 0zNg\BڞP'?SR#iLkHf,i 7F{UGJ}h ;%5(I'^b -E{=piG 7ʎxOT5@h}@f0D?nl7*-seC#7qa쮮dLH"b TG IR`q4/GxL676::boUFA`Wur .*BZ+'/pJsۃag"~>\h6-H&l]l ]S7Q']o BhNQ.{v((-KNK넱?G~܄` ۑ4蹚LF{YX1IHa@Ж*#7Z*dS;,)^*3MxX'Я5WWAGA"ijdZg@@m#?p$}WXvKݣP4p0uY d 3#z pBFwb.:g1REpX}-LrXrp‡a:JKZb8S=l'Xj3|Ƅ)yiN ]"qS"Ce hR FTa5#]Ƞ K&,]`=?Eo=J)CGTSVq`UD5mG`94pkL42y6s;!=ڐuE 7BxO4ZG@ GCqz.S`5LF0Z2JQbC2Ω& OE$)Mi8NUӧr̉O!6AJWeJ1S5'Xޮm,M2ҫ! Ȇ@R,$|Mdاq EI+ z?!zvf慞A5xilPTd$"GR-KwƉ>b9vhe}q[[§/ЬO@AԁsI(.2@Bw`oHWcn 6H눼5+.2! ݐk Ez?pzs{)͆JM{ Wf cmeS|25V?~\eLlmX.k!IZlh47k(z-ipA|?sLrb1"ы0*ACȾ^Q'sfܴIJd&)..F pgC94x#dplhqH69Ck a3w")+(^]nN,)`eGf CB.IFTrQԍX] .ۙbԯ5p8,IN+;rIKzncHai-q=@Ow` hqT{Ѯ-X2A2;cr;zW9 8ϐ.|Oy8C8c&lCtBcnT&w-P,vhi!w5"-MÞVY^ۿ#R츒poƎDv\-:,HvMUSV,z 124B@nQ8Հ2CwF} d@<NH|gPupiY>!JTkN2? oe"O9rqͳZ`GZ 0'?©EG8W-'VbԄ E`͜C1MsQՁ/6VicK>'9Z|Fd3yGyu{jq蜎jȈ#̓(c4ʦhX$vHh,q.Y*7(V;`@IН ɳDR$.}>^ xlR:g!d/cRt`AQ(ϯ)*HUҲ弥wX[o1mHwlxpƳ6aZ5&A<m] #>8wS&=' Gx~D PY5s!ģjTvmޜ F oB0{@ewYoz<|" xj+jkCTL ђ cgUXA7ڍ݆k~*նd%!0`L/I˾J٭1 ~[o;3tI!7/ r@ w8iAOpP,iA"nNW$5i.U89wn5ְ]>>a$2)A*z7Ylx~;F¾,6My طǝ;=Wx{Ȃ?oq;݆{ Q$E%Б8\ӻqv!1JuO>0i20/x6c.&W+ )|Ϛ> _L&<!_*='|Hb|>r5d4M0߱Ae<z3ZctA{+J^=$dEf)rz /9rO*X7[81LH*`1  P|rt+P}W¿w2aUj#sI1I= ?|O}ՀA Yd=ľAMy-nK1Ӫ z%(GPZV-2f UWR1M "v@JN( S'54ΝQ3+|r˰ q#eTZ"\w^ ^U(FbGKo8ﳄи ?đd.qrl Bӂ!n߄5'd|ŋ R{ sā:`'<^$xp&kM<>:>AB s_?FUP;&L@w8m2@/&GR,]Z>tdֱxځ~tS0ܤyԋ J7YUWyE_&E4#Hx1rlQ#C@ 6#<`- :4wh0,=4ǔj"{'rH(##AUHꀔ% 12y< GrB}(LDpnrX]ȗq`#^&=u 8;=W%pCcy_ 3݁(f5:"OAo,D`-GG-SZr@8bx1rܓo_두1LlQ[ґE.ɃԴ> 6XGZo~IJ0 ezBR1)Ii7@)jYp7v^uc""O/+  ]=(ʺl?ݺJ+i vն&dXԫMJ3O;Q V7SVTy߯pFL~o_rlb8}D.M'mToZrHm#4*^_Kp|ăvrPOWXZ囙0Y6aqHʎV5U$EC~)jnu3QEt6edRܝqHu2ϸOXOO~6i魒lWbDFӯR3ȗMjs_,_SF#FΦߌU!IqYC1T~:z?/{5[  k/ca\7I8  w]Bcov\_/?*}KmJN,B{Y+{j#] 4UBGB1ufԙ_-F^[-#2@67@4vE ϯ;d.V\/y\:A3Ep$$q0Kޑag֏+6 GFLt+;/("Z 9f+6g1&(Vb=l,kԂidShg;hH8:0aO@+Brz[bmOcy$YYMc,L.LUz Nx*qTJ3r@1>!gll0 -!mLȘ|kz7PL|M+q~PWlm:! wiѻW5uP.d4]lWL:1I`NXlMĀLE<%Cp^YcsJnE#(j6َ+-GrôO PwMYg ]Z'_b]KUQ[3ٹ"7wPa"l/ `\ OirЭ PZg̥^c9 {]İ|Vtl`9#v-mj*8٪4 wM<`C|819GFK"m0W.XVBXN@ #xk 19# 1EE'SϜi4$A΅qF>XnI[_w|D3t! ԐNf  QGKP> z/yBO Yd{"G sPPOE:#^`;xn-.xTN"\ӊ=haҡ+`KOST @ELKt&49MŲb~ :l՗vL3ltaY?spmӢM/}5uKNK/e׋&d:EQ$Vz:c-"CemyZUIU; 3q~R&,ժ٨YsjJ S"o6ڬ'y\O\dk62~&POjpL4z+s{ynYCQ M#A->46U|'~6˯`@ͮ9PX2TcƗP9G-Gޡ,?Ϟ>}1>aoq! Z|5DOWO?Nr{=ykU:{Gt/_|_o`tv~1zCgk0Pkؗ#tt]GmQb~i :[F>HrhlL mMPJShpml?|BpZae:y9\Ww~+5Fhc^v*ރ2s ɳ͍'y(!yO_S_V?]_Uy'mS#l.f@\UcmGuXeEé|$MWSȣ~@KEqi#|zd&% z˗^-zwlx%][xgW/jjɩ^?9i:?}E(Ѣ,W/?Sy}pՄ7_ש w 6׫+F4O9;|!E? |^H, =5< 3d8cWKw`xq& `ӗX4/uCmÉK>}G$v)zqs&beMg KC^ jOBc{8/#CU=kk`u"lցbT f⠸uv`9ɡ6lcQ-qOl&b]@|nvr|ur|Gh{BYژ3 :GwأmпU &ӫ!yKh0$2Px/"@ZNgōkߩ,M!EiM"v2(&M9c'u2I. #}P8w1g*| 3'M*)_TKR.]羧1z"9)HVkh}t@v~{xPL@4OJwЇ$ 5+ eu IhW^{g>{*r( G3|,omD14b&!hp)2aN)''玉!}WTwZ ͚kWnԋP<"9FҘ3ڥ}$k`Z@~N5aTN+6 XbT45N#[b3 c")&rڙ[i0oadTΥF(}V<Ϣo jÏՁ/Wx+v;Cݢi<9QY{[zCTFm~;;vIx$}(0H@~:R|hǑI 6gp<_RXz *8.b9uiћ({ju ^ Fn1BI?HD+LOp$]n!1,9̀!T=p}/SxLs8tkh[N_qrHJmom¹Y0^B`Bjwꇛl64dOȹPG◫@ˊi5J:&n)u]LrZC£/u5X j νGg[z-.?q7k 5'3kFS9u4XMcx%&tJ%pAlr2! N#OGb~3Z!X)R6ݕ2qj>Hm %B' t\ԭfأtl\d]/PcQт}sqOϙfMÞ1)Ҩ1Y mGjb5Sa -Ų CUnt|h0VY}_}U=Af/x ʹ؊C #3Na.{MR-8޶ߠ9Q&std@7D2 #? !Z#k(`^ˢ=!ϡn(}~*ذ^N?=Od&$gz,H;Ywuty+4#saS%1sx1D^m{Je1%"VDE{A G9+:O#@.rh@k,܃N8ॳ9+CoVZYՊ,zNmE! _wA@ 8$!R4RmɜW~5~i-|Awmfi  bzo,^7q :4T d̲@^K .x)'Y-*>IFSG6;}¼1 #ZZHAz]Ai=`Bk5 !Cg_vԏ4-ۊU:|BReV8 "oLzHz[}%3N+4!KzC$](%΄j)b/t=6+BZ=8 s?f=&цO>F2ma|0 \qir~ PP'Rd^p`[/vK14" ID{˄vy)A92b#!&ד븗/ȁP˾~懮p6qB}% cN}m殢 E9}jyr3ǥp lOzDN&BX*={KT a)vpJ\"GgOo'v1RO53Ɔ{Wu.nbfd1Xe)Ӷ**!(r9>{8R ݆ -Wb>f>9M79J1/n҈=L:O.,lVeyI]HtE[iY}^{LNgDM"oL$fՆW|!p Pns8&r/TRl,=1[%e $} VZ™S__7T5y|Ir{;\ACA-ᑐKr;)a4$DOh5Y$㓨y_w2D'~P@sq`㧃;mwx|j?XOc+00]vBNY 1d ڽWv5^ ;+2X E@ФɛYïo}Qq֟nǯ>XQ RsÓjYܗ1{|C:chc+[cBwL~9!^!HI_7i⊓DÙfx+ORoӹET˫Ѧ4M+c{'F'^^[_aPFH`%@#4JԔP'2'Nȶ?9Y^܌G3؎:B`iuT舽[F"62TybfD-(*ۭ>(skSsNi,0m/8e4-x vRzҿy_@'"aqk+Hwu{PGKinhO+e<}"QKnyW[bn?YSA9iuIR|zM+GJ GZ0uWXh%g'~|+YV?nPp7V6?1D`'عCv{Qb^u.e]| Z]"5i̇>#{ +LATnHۚ ?AF0muD8g0/گNVs2ӎ@j8JX{9b?*8;l=ʍXC31">JrB(npzZ&#+ sCt *K% D*#nc9tB!>:Hw87i/ ?,‡׳dc8Eї"jݻp8T\}޴SnLD5By9Z9aRXݥoJ`(~6*fb5qnR,CK7+y9WD>^2ڥ'o8\{̽]rz0yCbYz`Z=&R7ROGXu+gG_x!c?M5KG Iaљ"L?w^Hn?v@ [ {0_ ҹ OP`vX92aZ G+VT *tO_#3Wx;ZQFs{%X3B{־Fğ٨Y~:x0^ Vg%eCN~p?K/b7ڹ,(A.4z/w/irX E`+ ՚d:(NY- _,hx&w✧s8lߣI~,@IRnWL?>HufE JNژ{ GXkII5 =/scOX (EPEC$B \'"og9腘a(@13tON& d0_ 3Ӕ\"-@;t:֏ Q1 Soh:^[Z2n< (alko0X`l] v$KI/mM;@ Y Iv8LMŒbb! R2FŒK$[> (Kp2QeZÃ)33gE vXzOz6ǵ!t҈jxLQ"a Ii@=GzB9mYie0j"I=fГ\隋D: ٭[rlIA UQ.La"͊8):T 492*x* Z!Jo17gV 8ۿ=|) Հ6pSHe{AT4lae׈$-wNLۗ N@ .E881g^j82Hܩ-i_Ť޺>ehA "5=pH.ig7 s $KO~ƖP.aܧO(/pEeL>ԲI$nG9xNe,._^"e 6Í ;pO+77nZc`Ј6O $ΡKƫ4g tefu'XN,a  XT T CQ -nmuv:ܛTxy >9>ׁOpAH*T_49iٯ=Gb,}(ގWcޕϨ;)!m#ŬZj3gG'cص#xV@B,DF0S,ޒYbiJ]XQ(Àv6qAx! &)7ޭO@ICJ,'C L9!r@u5Y5SXpj M'N b|mڣ}+z0LAwEGv?]V7?2K kYn:j-PF*=k.':'J\xyCyQ̦r iD^͍A F&Tt ~!%*6G t+ߟH?8(>7 yF]h96enz ]9Q|!Z ($3LLNP-0m@a 8jUGM.5ɸFjϻ׻/[TljIRKs!5%K^mJf0BՍ=&4]J$j-U_E20Qzpנ.Sk"8V.x.ӭW"^dX0\#$ԥamdFD]֧ (IբfFbzo\"{N'Q "wi_^JCs HJ-zRT+  LVVΕ\L:RRBVf*/"J2ۣ8yKV]D`۶12&KADK|< 4!|sH4m|R 5Dvd533W#@1Pz\̪A]@J4GQ!V \Om)>䭪VwJ@V؉$x%lKB*,jDR!|Шp5``k٨+(U} 8zBi6Jݔb#5#ƜSk21Qχmݝ;R&32KT%&j&z"%2l@NqpIT, qqX@ qXt^Vz‹`67սz%}7YlGüQOe`l7NV8$>(㋯Ggk!SKdQ e2դ?B Jdr- Qk;sҫ,{75Ȳڜ/4وh QVswtg- u0蘃:H?>Gu a[>#bRG MB˷i\e.oYm9Zp:nbڕ֠G {)2x]d&ׁu&b1@Zܞ\[d4$7Ռ$?ЫSEHQqMffk9KUh3pOgTަ'w I_,"UX US|GT8#6]bx(]1螓C8P/?|S트HLgZ\`='0*N[̯90 k4̸s&IZAQ ULJ NȉyH,!Zԍ4 !Ź/ cl>frGr 4A=9.] 1D) (XX:U ~mWd!QlF`o`Z6t1&u"˄m**M[|VXjzn,8 WR@Yp٩ҏ/ӆHAiNݘAyk}l-0`o_Bа dz󓹜o t\Bl6ʼnXvʣ Jǰ$.re HL8يlsVk7OPлNJUb"+Ck6 /''ar/c`40o?XaӠJK]) YESE1րC詘LX$Pq RWJ/36)\9xex&ܻ\5Tپs '_1!H9#lB_eADi"?N]QjVŭ[w=2|Ņq;ea켕G)j3Qg{3yKXRn| ga( #-_~]ŠqRLGe圂=]B2f+$pe*kl-|^A&>Z[eX_c#&>!Hհt_+ "ue+hݶuSfnдwgkZ`UI+rj7D4~tcլ5^{R=k:wG@f4\KXsیq]bȎmtogGN. zG ]r[p(`xGpd d#_3wW.˥lSܻڗRȩD ý9G7Xi29^ǾMBy+YH}RW8xr=5BX5hH5_״IFZ񱃷 F uA!)L: &eQ8hszU,\McT']L_EM+C8oӸIU yfj| X\!w KәpbhD,dt#үekӃӻ,+j?q;R I~VxI\#bTGd-PtV); b(dt7 @ŽhAc^ 6` ]Ŵ?d ɃP}Wb-髉AR+HiN&z6 GΆn^p(ro.~< lӣ +|}~ _ *q$N;#,zF LmǩE|xE_^n]iwFF [I,S 'eK#m-X, h>dYJb5ޘd<₹qoV~h!/m( Gr=bAՑBAɇ$@V5xQLRC4Go=;L.#B)pjqy7HE*Ñ\ l 5sĕ*h8Ted(] xp4UbQqcHnPQH|$)o \_,$j5꺲(/(8>,j)HB3jEE三@K_Rb鍼T6:COh-@L 1BJjT|U3 -q2ƗU(Eu7 Amrp>GJ!@MhjW[ )1ƐțUNa=6X߫x` kh,!QnO7 R70vȦx^?XAr hFֲ?ѻ7^'OX8QT՘lL,TiӐ9=?[d3'ͨ;Ziqf&R +;`6TT+R hf6{${|?F8?bxE]لV ڋ:muof},b2Flef9+u7UEo>]8_`WzȨWAW)ahI)>sqQ L/ۤV,>Fs\xT AW5U<[DzՐYT1.:oҭhQ'QEѢ TGUf؝F wdW-$sMvLFq b5]H'΍ "T|UenP hI\t(mL6&z^PԐ^OY|Tƒ+[mbJKY X Js)kh3H7^ 7-Nk=d ^vYn6C7j<vC/ПB//^W=_p@;f&e0ɠ/q4q(2 u2h%Fph?wY&_r/n;gW Vw-_4da;JݳPF>_9Mn dQ4c:HۊZS4Tv"BH{J5(;^V )^j W](8g^ЉE I_*bsef22U&Rr$_b?P8}\S\@6Z! udQ^cޝ$ &5A[N)]=:_+y~&&yB]YͼΆȥ_i׆raBaX' Hܗ9b Z4Ik_thkOMvP`P*6`Ne9 *qgpѳޑ%)prF/37G"*e0dzf+˺=M;J,=0){e+ZsyMߠ <ӸZV"1W4ˎ~3лPK4ERBpYpw ց zJ7Jx1Od0 Ao5β6c23AƔ2H|F_i؉H<B7擻L{pwl{j#7};KZ$}hHt/!I>vxYܞʼn-B)6'Л$_gw` g2%{r^ѡH:(uÌx+\-@h $%WM(یG((G1.9 A(S|6:UQd K]Ig\4]壪"֡~M:?҉4Dx70.ֈwYP?K1fw^}䊗Q'bk;mGHN^(g)- SXvO~s2å}P|>Qj dºVŋG,.f7"+ehļ0FI6| (Y0D?LKr%Q >/g; d*'|z4N+ֺjXtφT6# )%l[ 'hp<>LwM항==C`*VpV rl]i28& n2IJ5Bd,Y>'j JcJ}T ޲&ի6`ټxJ$ᩏ t"C(t[`bbЃ+f"LjӉN21JZ_[ EgBR%m e 8Cg.(|C"7؂JK#շ8sfR>]v,W!nGYC5z0ڟv'0bW]s~$ dhp«5@/PαDppY1 zEz?d&[ $?AG;5Z-NjjrS圳0OT#nyt땘T .@zXipY5jq`vcbEӽyoVؐ(a\hH݌idI2@#svUѺT!g,t:@) 95lDo~Qg@󆺤ʙ/$^+2Ŋ!K͸nayv]k%5 ȁ*{4@Cf&] AG'X8A>Ujs#dȿQk~.I 6,WD,ꞯĞG3|]w*:_h`YZߌ7Χ'! LA(hqU5L.y gxUz%׀m|s;H)6@:Ac9Xlt4FLujG[׸  1g -=Uf/DM'SBzN%Uy['OPE9o>}>6- 3w!f)gO(E@>{"tvrjTWSz!<{'MTëСɛTJ==Њ|_ Kۨ `Aw@)>/ >/ 9t^kH|eep{Y)4ivC̖T uyuAe$ 2m?ѥIؕHAU%6w~%^پ1HZYk_rf;ַu53}Qu9 S\ȴ[ *ѓS쇸iwSS%Ga eF_CfrWUⴙ(K+oIM%j}+<~3Kp)@ "Nu{AhA- G :P#R_oژMM!j8</P -LUYdCPHRˋ*:*SOThwzcRF:TY\_e5F.+ǭzTRE-KՔ 9H˓fXhfZݡN}&BuvOi(jNJ< bҶCԉLD e %D7 kUt6V^fM.{_ qĩ:f@{Eq:6-3s&Z'la\N蠩%-]q) 3r/[i=޼yBٚƇQ&UZR#`rѓTz[՗& {{ y" E@H?g^e/}1ܡjTi 3vWZg^Dv̍US5#r&>5 zu&n vx5a)ʠqܮl h8J&k_N.Ն=Ѹa#3 4X͂A3e]*eZUirǕsr<ŭ<ܗZ~{vr3|]ߎԒ>Ax@hp t5Z/3x=DHh&I~HW9 YZuAѴ)} 1]N !ʉ~ن[S`}.Vf1|t;TrҨ(7pTē3S njim̑^ 0NBVwT]eJ*xYz,+$Ҿʭk`οCKHKF09C'K .ɷ?G.Hwu.yr3+Gmg߿z[[L$Bg1(5)ԃLg $#O P@zى7O~p1sp슛Jʅ.{ '9+٧I#3Y~'Fݗi(sp[vQg-LDgCָ#"r뇭ml?|Bo_D_etAR֧'rݼsTAZK$3_BVb"9؆ži&DPK qN %q,42&vj[A;.!)+f/no 7 ;j/P7` 6ֶ9є X|XDCB}NOƒs^+|/VIZ"&Ӱ jhKF_j!Đ(I-6vt!w/S< O}p|b*Zf N*qj6-S~(GّXڔw~bEIxTpt4u!,, t ooMmnlF?LksXꭗe:|)X)R>۲jc8HTu vYBJDݜ))ͧߡ ϓ.w/O|]F;vĊ+=VbP-$eܺ$,?ItzO;mO@F9OhǻYӱU5=,VŘc~?JѢָ1GrFs["f@V[[X5և^)Rrvw=ehpEfWA 1>'y +d/'%#d+f͎ڹ]uʖR@ၜ7 n2e,sBtWZٻo3]j/Fh|U:M>*Cـ w4qJr)2Lw}i6{V4ߌDM;I P_7plV&$MJa{Wv51tG:F;\Dm/8VƒTf&\яx;Ws.ړ.Hy=PK $F(_M688:׊bq6p*b ~nBØ$yLYNFc33rܢH;kv40<«vA0FSœSFr3/,7dUO^M{r NX9`)[oXa$)k;#)D{ bz%[LRUe^z}_"Ξ~3 ZӳB'}wX i)N" z=Xb4xoʑX~n_-{f|*Z/G1 V`n V 0bZ(/ߔz:fT(Sj*kskVoA`,D^s)kw5IeK`u.{PoTr+,?n+.T ZT˘F0QXzk-"/2~Vf0R,J QMfmJZ4s(uv.bW>~vHz,+~:opFt"w;MT0}[ܚQ0?[ZQ1V-<=v9FjׯKCC _W2zL}pؙcKB|~g AgZZv1w%M Z V練> 4L7Ѯc%Ws`'e'EbjڠJl?8?/oghXݵPGYxʼF7Sx/ juSVpa(v"<$uGpܻ}Uj}cקûZ/ Kuts vZ/,VVäw]#.P/ ŝb@}%܆w}Ų`@~hNn g\vKo J3 w]PZنb.w`/qL^j;D/[1q.h.& .ݜYwBq 5Md01%}t}X'zrA3j` ޛ W?x2&5P.BWUcV՘BdKY_bQ鹾r ݃ wy{ZVs~fʣ@aOx\O~8 5'}O\Kbi(bdg<1n W}Z{9[\ 0*{hVͫEEA JҕUēpeWϋβOpՓd`?͏x_~乜0ؚvg;0mDd(U蝒1J!@Oŋ~P .9k% 9nNI hQRCIo#qJkY&LW~3_m>RI4F9z!;{{_xylazpV˔*Y4>deV/Ԯ%#YeŴt2h*+ $iNyjEx-NUOTR6cm:>>M[ǯ$pe(vq%1[Qg!"`5 ]*2W͎ [,a kj4"3q7yhvڟ\117`ƞjv5n6Q;|" Ȫ{+J}^W)PH>:sGײ=o5} 6`y!Uijp{ ݴKz Zoqm*WQlO?7h/OiH#oE@:w3",XUׄ@5@Rٌs#Z؂b^[練|:6t4=' YO=^w5\W`M֠ m>G0&ꛭ;Q7]HGځ"BhE@&8棌yvYiQmKWGlT"*t[)`2Y7ѓ:RԬCs2$na? bl)O)hP9©z)O+KY\@A/ڦeWq_;wR$4,ٱd$Y)Bs;a!!5anbJSyK% d7v]ҙgqbk.Ro fΓ^~3.Pt?>u=yڰ>3yY|0X{8np컭 s/a+rƖֲV$ sQ&J*jCe4,u"FbS Ц@n0O:'KW+Y2@c6UP@zd2(F9|b^nRarɑƿmCuD+1뗬UgM לuXߛ9$0nEgd6ʥ[%@H=L&tܩuѓ Mpoi/a)؞. ģ=_ѣ6NSɆ㼖"+3yaa[J9xMSC7)3>:Xܶ1mb Ee!Y$&r4J&.s\.9% 3MͯM@9,O;rb0t%Ac?O ̬m<ɤ.}P ";kg+Yu ﶪf6H?՗} nb2y/|,{HjNvgzrwwKګ-‹`FT@ ,zlpXW5Hlw害tv]ӭ Թ5T S[PץqtO"x֩BZSYb^Ьmv튏)\?y5=kiytx49.tAyuSI|7ƎY4h~g<[OM /+(" wP\t! IGF8N[wڭ3!= ;}b0Z'QknEDjn;߻=hs5e:Ͳw}{̷6UDj Z/:Imǟ^ϱO9zUۣ]} S-ܛlNmNlU3?YzݬB!+"3&CU Ւk搡Kz+FgVM3+/?pf`+mԠorNAhnuu^2V]zˎw~L f1KUWNޟ䌃EY.ږ+ulG^ӀG|ۧ{odGjZү,m*zO EKBs(؃$<ܿG_:d#)hoԣ`3]g!Mu5 @A[RBQ hKP"7cA=ٕAoK'׮ b4&YN0eD{JMϸ카Z2ʺ!xw3e6M ƺHfmK\:"'j\]^<}<^(oL#3bkk! y[m8Qh8¶&b́A[@ g( u1fUp\#OC, tt:NkS;rf AMo/݆_6@ fdg%T*P$pLUH$Y$_3gBOg4f }!*ҊlBD0ʫpwVVZ3_k$|Y:AaDTE >'Va#f<(Ly;6a?):xZm/O \uT[*IjZ N0N_-.wJ!Jkm *rJmRlPj2XpY/;4G5{ 6̐|ngyA9eHOi%9n7z^N|mzTW}Y /ZojhNꇣɮIq f+h!Dl$- PY%r[я&aGH+Lg{;ƹ KCdӎ&5(g9yԪO>fEn 3r\݇)5dGgclt,S{&\Tg R PzpՂLsYJP }D-b?n"/{=%ϐkRe qStC^!lp_%5 ݹGa{prd62m vCj9bu)j*G\Ƒf^9p[=އDX^1p̉Q֮ScxϨdڇK 1 j`Y7{ݏIţkԢt}"n5ٻ/uоNY}ӑPp{=SR bAX\Ș~#Y?l$e Ss2eZnsÙtnCa;?):}/#Wڕ椬9Gq9(EG-@*z5ۃG6>Je 7gU'gqwE25bV(BY }1) mC& . &v-e62Em@g**)\Ns6nn3+qP{ *\/uZ>$M%,TP+_|@O) -Գs=̲ADƝ3j;tHY@zIF[ rKIe.Uʦ?gELޘlA0NN>0̠6nw9~pJcXJ~>+ao|@ʔ pJeZ[21*Q/uN͕6ܰmfwBqyE)tclp=F?NwM x1n%x،$ kt'YB29 }–{.1^i[s3K}=R4+X4~wzf_p&E+gҌ~73=_PI_*{_My+Gm!ڤfh*2IAX[Ӑm"R|QR-J{ #Ԏvk(uR,2QI_89lܮȴ1#MR4iJj?MT -eyy`GBdu^4D&WHTtϲB ;Igkt&2%Ų gS$wi k&-WB_TJ3lIhri|-x]xlq ‡`AzLyB`5@a9ePlȣSx:]h8[ADx+"#U2E[Ef;_̔"*t>%h[~[ }ϏmZfx%GJQ;nAg[L \EL1EӁrZz>J%_!Hik:;E @iar%&G#sO*{@!-O)+ gŜV"Xsu"<1Bv9 !"=eHsxPCH4[䧱,*LqX ϣ *5{7܌d[O"g1جqhztC.dDs ,;IoK4NfedÅ=}NYۋ-7]ͱlozkR8Ir$^Kg=4=&^73Eg (1 r5oOTs0T0!a˫n-| ZƩ9k{{; ~M$'JA;˘$$SJ}Dt#aEHpj*7U-RĿX*J/c&>}]:@R"4? ]kIwM\׺(x3ECzIKIh_/k U8. \NhÑ ~U`Nɶě84{%l i8Se ,L_;d1])8lvY3)  7C:k:ϴ-Er(U>6!PL}$]ۖaB2r5 n,g<̆kcV[ݖދQF)hgJTu'* PXEYN0`֛ty~ğ/Qd\MHa}:h'jX-Jg]G4t- $KlKEMXw@VbJ&mQix!"_$wV|[EVs~maEM5e*]f"ҧ×M'A%$zM{\fCpnlSE*Z1`$;f=)'O 9Z;w*p7K/;'>û0PP?&wU][[`(ZvHk9aR1:ǣecxn2M]Q<`| EpQaUh)mƫs\ս9&u&-`;Qv gqgŭKI2^ =ENApC) [F4,9|EF(p3'RN2+ zzّ=DūWhz^x|Z2jD$یuy<|:)s_-ZMK@6lVr7dV[dd 'Am-XD2҉A>b'$9CmW,'"vpYHj;풠R?%:"X?7:/hd<)錼VA @|`]* % 2UKs+y8Zu:s=;S;]MbӉ߹;¼Qk"SRN1XLnh04xfs(@Ai "|[x"L\j=Bn78zr2f~8,޲*ټulDCRk[9QXpʺ@M8v@g$J0"C,؅a]֝!OU>8u64N^dgze1dWd]tDw0>],"Fʺ_aM",i -(*6K q87S. STa0j&"\8?5C%]刨Y5b2dK<#qeHݚM'Ð$6t"/])R>dX>n:g՗C1Fl4EYm"i΢|633̎6sI#/G=,|K3B:֕K4#0lb,C(>R:W$ǶL=n;S)**0_psFOO U<%l{Vi8Uy֫`X.ғRNKzi}TM<(VUMW6pYW$k=qQm7Y}2lctnЮKs{/M0)&3:K8}8R|`-U 9A?ţN:61a(*gѤdJnq&P暊7.[X)X_NR-ts`8%&A7M48s|YЂ,Px&[[ipZi-ػD$hT6GU`i]д+γɆq| %C?ő|\S弿N0UeO st~KNBl X.)~*fnU@O8aslp$WܲU-XMte׬0_RVs{ 5O rVb=͆͢YSADcU%R2W7j2B4P#ɩ` t\Q*u$4y]N.9:<|QpK~sd|}0„0[*_ x*|psъ^|am͚gp]yywla3qyqZqWKU# qq]#3v T\}C[=~-?K;~X+댻(΄V/&RT۰4֢ޖL@)Ж3^5}+xε.d@{Ki/K}:js~i3oOM3 Ҍ4E>XsŘ?i|,rt4<ՙRu"H gHpiSR;c)uH 9bшãóIСjg_ϒ Lf1koD;,<_ c$QA\dc "I Ư&EAmT Q?-X3ֹ]W~,۷wuZ::8[9z™j s(mnS r=;8 POLOfE߆#gQÂtEi`g氧F )③nbKP!΢1qZU=O=Y nB3飿lv:f11ue.Ƶ^aUt~p :Ni+M#l )8r0ۯ^3cj/#0j)rʢO1J.csu*=ܵaڊ6.&4[ӤtAU0 pFO,l~3jFG6o(Uߣ%L1N7C&8\@;C3[ZǒJ[{Vnoqr %ͥo0yP+dYAUa,p#;K>,6Rʇ]9vyALPlhkt.8MY\7IQoBOSfmuח_~8N~ۼ2(GI93%:dђ5Iʅ A+/箁I &z6jr:.X chG&C>0S+b/IIV 2[w=rg&c  %вKF4(bxMR\$TaӜ6z3&1Q)|4*& (Cz $buD; ηx{k\&O:BEp`nL\3x^$ʓG]#R2KTv^)R>Ea:Р~wR#Z;<9T.\ lXsj69;)Mgt"Q9/$/żu(j A#yAo]5 E+LǢ,Hy>|lh%]zltGI=XڠͷÝ5S(kT )x^ŝBKMaF2CMت[gP-NNa)t >GTi*pȟVIE{ʐ'JPItnTbK^u Z51627xC i_7z`}R h@*bR6P>Ԑoٟ#}d`|S黋;[{ ߛͲ4U.ȡw!i?hʭ4` }0+c=u]@N4&BnхD8`Q2YCVi3o߳$''^8Vv i)=)3-bK1Pg%O*JuӺO pqVĔfHa/RK ѕ6z", opeMB-"է&L cJ>bt-C'#_?QVʋ0팑.Sh$~wʐ efŻq ZUJ?"ٴ0)_5s=rVB@!,kpOFg{N^Iy8_Jtʺ?.~v]x',13lD+* i#^jn棛U ?J;Cy;%Za./I2IYZcʈڨ(43G@T|3J& Er8jLpEz8ޣoT .$䷈$_Э4 aiчHfaE~]IL}mzWI&ёk'Ɔ^P-">#W|q)V:~*!Sٷ!\2מoݷM׭fEӈcB+\7 l}?E8pƪM' qKd(+.\PO(;YKng[<<9L>T&,;dJr8=(Q/CaYђ2\bP&T[`R%P%d7W`'DL!_ewpJ@]rH˜['9>,P=ھr2b&XTL:.ھi:D=ԑe3`\f4}P144$ևzcoqV5K iJk nw].}%ڇ/too?J"LlPm𩱻@V8,,XO)WXI\|8 WbB%?>zsԁW>mJ^%xl@D!QeHP_W~bJ.7so=^{ݽ}UfݥxޥT;Z5޿wY[|Rrw5~wHJ˻ޯ_{wrHz=7k6aa_k+~n.QHj{k>"6 ~j/Mؚzt{9{}Xrf=L0̕)a+c9}+A?7 eClcg-ͬy'7ǟWKS/߮}kp6NiOn=OyaD<(_)ݟ7?=.$#e>Z vg9)O]vBƻmϹQEmƭyqwEǒP#T%TI+uHsj l麮-u6^)QH#r/Z4/ Q\ ׋ );,j~lsѴҎUZdg:Ty[П-bimg]ҭnxȺЬ3RO:R^.ry[yiRWCt[0gt $2k{;`K: =Qz̈%np m/-Xٱ+Ve hb4H|8W~n]>^T` aD.Gqv/BEXVA89Mp .$4>Yu)5џUϒa7+O 52ގ?rs㓀c1vn#zU['Q}eZ2c7\^=Q!9Fy!f45] :<-WVm`o[ KC>]|""<ɮ=,W @)!UOYzCKT 5FGQFp*S,r*~O"-w;%Qhpk4oܠ"A) 8-۽¶xw*>#wp>O5viYN,*).+\4ȭ_7esE9Y} <2v[t|SŤ8$=G|hB#CZ1VXzoR Ra0aN}' *w¡M[ sGR)P!ReM \Dk鮬Hx2{Q(%F0X/oy۳Z[/87j.dZyrB]Xw\}@ٖn[.DcD)Vk</g}A$F?4f`wrG+Vk-;}&ߏ$e!Xt֑xʽla$Eu4|bȴv vcQ"'UTT{GvE|y-B ȟ_e/PS"%KieiWinv Unb*XBzWC[;I>$޽;Eƌ#P O2>Q*$T(<k&QEW`)8Լn$yqȗI; !V Zi yGquT^FBg:nт)wal2,SݶWI{SJ-ö_ý>uN{픵#1UXtVA֦N o5Q_ܝε9?/}Ϣ6HkkƬeS5Kd2JҮ/(;uTP@VMPJ@P$fp4JOmD/ӒA޿b8'_sӏgݻD`_oK4Q_esDbǵ@3+:yYǓ潠\d`ړ~wnA7aᩲ mW~Zƌː?|`!W ͭ״~%j=X_#ւߌL0&)# $0r[x=?~}bН%,j_[E~뢉_ܪy ;7 <<7Rǯs)-/ 0DW&3%LKݓ$vNi>Lz JP/M_OV_ cIG̋-`(d[x> EZbx_aF{MW֞?Q ƳYL~ֿhK jJ7 C_ޑC.N2Ӈ3tn~:rucEQW:[\+A&s)zOBPn$&gY$$1aI njښ6K= =٧U Vu7Q!Jd4? ?VV֣=I `l4W!DL=ZjFW7O;1r`m}ƃO7^<09%b/8`/4ţ{@Hov>o36u~닧I4#?Z[B zhR>L`񫌞4jOtQ}!TDJXl % Ƽɕ{p}Ԑ\zpV.25sLcTr2aU8Y3|_ /cJ`,EQ /{`Ewve5Y=tO:sfϜ&%AZヲE*LqZ3":u0tH'iҎ~V# ų- \so)_aǛXU1;P GDa+̽ş7VhVohVg(!VMzq7!qKO90hݧ Ya±- Bỏ$h!7Tԥ>o!L;N\zGͬFi,;:VCB;m݂(íةI lQkhAK!x dz Ԕ$Fڌ j69Ppe)esY M7QP .WLanjYZXxMdZe5!7e*R(΃BЍzu&IB MB (3q"e'p;Jj,;<$IS~y^.5ũT%ĔɒB__3/mD ,+w>L1dCb']/3t+@w{:+Ivo,v*@]k 3BFٶ50;0o/S@oUe,(v1 ekξ3v Z}qٚ w(@}^`̷FŕvLjr a]&;ys3| Aq?%eLCbD@*x4UVޟ%3:[4kR+:t{l9KMrl^9IcߡsTҝwANwR;N\z ŴĻ!{TqoXQZj_6Ԍူn.Bb1Xev ~t.6`81O Pmrfh;[CF9]m`RwG2H>ہau!Bt]D[-O< jwuCZq|jƬ"Iη v`$TQt5xiY*&eMK?I!Å(p%i `&ufٗOZAa/ ># :>wGhz'q_Uk+ GFBZ z0Pf{퐳熞hO U{=s:<7O ?:|Mmf7w(BWm"xPݙyur<|WRԦ^g%7WBK1gzZ!гUJb:vt"Y* oFd+!Q0691z`K@F7kCz{X\cVf;ob73'nABT$~eș.Տ~ɦBFXU_3٦N؁x֗yX(o!4e ꉹl J;?5.6! (0F߁l`ގOVoz9;7'p>;.ţ+`ę o;6!ĄJU0Fyu+\&}9]Dݦ6_?e9F2~=9o U~m ,a^TqR +'v 2Y½ڛ)Z}ng\ܶAvʡ7pTsMxY.ŪaIB%gn 57pN1,_`_]nN;māu7HrHW1R=]lDUK}ʃ(>-YeA HV0o;W}ݢlCyj܅$\]\#H^KH>f8(\vThA"91`w4zꞨ%I eCn,ج\os6V,JNk):yGu>ɨ;>wm}[I՗f\dJGEh`-xF-e_\epw*񯩞D HUX^*4/--0_|q2 =:7/1E\Va'ާoOG)Jz>x ‚;kTvfmBXJ𝢲EB@U:↸khԱFjRw$&s,zdU8WWӘX247 R>e%^'lJ_6':q2QfOޜ&9C4f#cт2&X*z ߻5 /w ] v2)JF2m[ᲊxM ?RsAhYNE ,ݒm_hup̛2]`\[Fلmddt9y{7ܽhQ]K\k(;vXvjcV<_A{κ]t8]x!'4fy9f`*ŎqlݎSdcLq@=5F|P9vS0>1OZ5nsس+| 8_ɲ$A`TړmW`>qhpd<0N2>)CxwTȒ%& ɕ_셄b>Z]Ʋ3L%o?% ^.wb9gƷt}elG VJn͉I=Uab <9: ĥuy2vMwCl95Txx0ۖ;\aCٗ$K{&"%ǻTil %r:FU"lƥVor} ؋q,YI9O7ܽ񴼜[YG-[O`0y^UApmX{3g@qStHm>Gf3 9/9RPLnN>0Zhu딟T '(4.ڲiZZR[hGWT'lXgF'%KioT(Y*=rtj{gik.QhWzrZ8>"ԃM'+n5iG(U߷uK3^!붊i <(#iNQF#J*vvc2G e{n6Hl2WmqX&͎_ͮX MJrnK}<Z X;lr6ȍ06m||Z\خ OP[wת6쎰am GeH9Z1 ĆTШ=jŇvsrS\tp﫣/P 4/jQXsq!Kp9F˖OpBY"+BhzPVѡo` CM0 ??G{'\vYtxRyn8#$TYTI$HF>-8]dW89kmB9k#lfmN݉mKԠR5ast"Ӡ#[ oTe75bڦ֘[hwzTݶrOxyQ$U7֕X-DvT5"Е`1ab qfc[4ݧ+0:<3F㗔o#Wz!n C J`GYzۀ1Վ kɽarl-d=;hXsO޿ww_u13fV?>:u7 .z\gw?Uư zO(uM<cT7 }ܖp@i:~cSl q]ʹ}#lPh{+p:Γd]1' & bHk65ƅ4AW4gm\ (FGtpᏵXw'%+,c}c%a8E4&R\|\G`32Z?W2č$n0 1)wX ¨.]aʐ*E}&}Ƶit}nwYKxS(գdg"6lh;ew h%Ud '9o/.+)v=A.hkHQ\]@F.)Xhj1-"[99/OZ^H/y{n>`Z癨:Ut*t~XLSWۃ-]Hcm亩\WNy]֝vM<47 K~QH@Ӌ14qν" >p: €W6kb^>K4&S&w瞙H[ͼu<}I MxIǜ|@m_42hƩUTSzPLppX\QCwڬ 8h8 VTN(g8L{yQN{0a=ҕjVX U~X.Ml45Rmlj شۓqmFNvPAX4 |AD%A;X1ڎa/W`iw!5y}X _Rхhsx+w'k O 9и70njyGϥ%[=]Õ7A,Zn8-92ɣ(Argt6h_E+t8´׍ q XjE z!'1w?jd[2ddqrѷF<5{k\gۯG摒{xLz//8Ķyk0Ȳp/))%2_Eu#P7 g*rljRe3$;ɱEz?Qk 1 );KI\GO6vh>zGTF6Ԓ"T\2\`=!L&e7}2pH;1 |`Զ]0ؔ3JVƨ+k"ö016O$.rARJ W-=x檭D.Pv'3Dj ^;PUx."zdlPG@9 sHw*{P+ , +UFԩQؼ0u&I.&w?./}uj'#񳗓oV#|^Q #e5 Oj=@-=9[?AMжڱ>\ Rʏ,6+}`]#0eЖ A:m͔U9loN_(MCۣ]6O1TV;F{S\{.)>m=F?v 5fځޘzD 145兢%I׀lS}80NY!vX{#_eF]{S`?N#OL{ׄHlWvuKqL]TK<}\5AԹ~H^_淪 fN `3ckP\t%'C`P57پ׵F8™;3NTߑ_n(m%\;EUЁcy=2JE,''")B.%>ޟfX\p&imHH+!IE*ZlY}PYi|sf˿b̬$pTo,FLΈA&:/HCJ^r}g ĥ̟gu܏։?{ouw1sdlΒ<_Hd>&*4OŵVI\f[W6qpg܂;j%Mhex99+^Jےa}pqS b߬mD_OuƷԔ_nŽ⼁Ɨ6Y+zif\2ڥkUZՕOl_ l<ƓT )UQ:{fW  7S*8} _F{rLrų!v+ek{ݷ+dV0 /ĝa:e϶ʠLH49:- zrgB߲rdxA)/#4BaC!|&N^+/""g5vEMj#Y)\Y E6oቋPE$S )KՒV.vX)+XP(sMCe~POэ&ӏ6h#<ʖ^ @|)Lf<^{ Dݵ⃱{0u_6PfwhV[uT¢u6><+ >U!#ސQY傐)vPgeDn+qe:3q+ܸqdzNUO[@MEd\PIT ⌅FyD%"Ҙy(k`l.ҒX{"|#>!xm9b9Cj:ܢeH S ng(K 5,Ki|݉0HJ0쳩"UypHcS4dߪ!0 1̶M[hh9#UƓMBUtQpc{VȾ|S^'V7,ڢ*~E%՗zC2 w뛦WѴe8Hd-7ɟI{JcGo=5,dv>ƁfHC,oD#D/\bpWJلJE%9~8ٗ*zVU6GEy3)BuO(S[b+lBA[+~~<<2YUd`CG\:6'']WPqCUqQ_c _onBrTp\"E #9u}0lk$qB(1kTdOT7#h mF$(q2k:fb>JB-oqf/{bnaS#<""$9 bToKІY1ē&׋{@ 5h8 )r P#>/X\]Z[q!@Ǩswcx7i NuЇsfB!O꧃owg0+Z }E=!e|pXG{] Gh:¡O.>UýU;1P2!~j:]*>?+mP~.v4\ikq]4}Pb?aW^k"O~eK2>#W|h޽[CqMb[Ӹ,.Űj0U}v甠V<׾P!VM=}%E${&I:%R|CJ ƻW6bͱw6˜f y-Άs+*uńJЪU'.nfutۙtCr+E_|VvYgp,7Ek 7##9ႴPB)CͽΊ^rAw|%kXV 7~69bӔz#g{2ZO_c8/n.?L!RsoN4}ڑtQB]g줥Nr]לRadNI=e$䕈_)ϙO _.o /}K f 799h -fE&7 \`o:=3)`$C@'n3/iS ikO93 I*sc5wF0 HwG2ڗw皞=Ƈ+-N/mϺ%m$@ .U9oLxՋ'_x, oמ<{?{,j*'7m(Qɒx BRVv"Mss@ahhk60x |mp4/c؀P9BysD{OmXXH oi_%dO #Ug~!4--\̚ʁ>6d×kX~φ׆#{}'yõ_n~ KE=U}o뵽6#j8J6| ''H#)= H0~'ONrxO!q,8WHKK9 'W`Y_J!j_$t7n&=ҋܧMṔC1xde%W7[y{Yf%w#?dbutyl0bq?9dO>Oa5|"ŭn;~kR"zFe]!ʗ27y~1ǀgp2LILѭH+N\cADcW\+&$3M[U.7-~1.|x=S̉{º܀~9(f43\"-?"{ ޚXcSt`"¥`@\e_ bvĘ (hy+Y(pދwoZgGIܕʔXHRœ:g4%x hb X?֒g]rkY6U N <)X1Wؖ`9~Ē-Qfihgdeȥkn0DgIA7TRj$< L1O}VF/B֚w!'[M/1}ΐ3?3<b^Uu09d4p:|V%!? p 2&>Esd奫m5'ˠY+a67ɮxӺ)4ޟ0R\ xD"#f  :"'R7uI700QT$΁BYղMYcS!m"ha|ltj} X̟uaf5Ut2#toidabƷ8L:wOOO_XCbZcpCz;pn2WWáv؉v@ zeS]s"UB 6R7C0y6*555+o\Q )xbvڵ*H-{Txmq5i?sznHF2kN*!%bgݤyz)~[6ePOu[ۥ`qBe/+d*O|)zY%zu/$HdDw%*bGrƯ#lBT­ـ@E'\WC-E$*IY-h/;Ozf35!%S꺱̋Sdz7N7l w=:7u_PX}Iϕ `#[ Owia^@48߂$J2?s?ү겸k(Ϊ|kk=v.Ù `n!s>}fX.EdlzoJuU6M\i[;"WEir ]I%'MV,E]~|Ujʶ?طlKQ!qE^kߨ+Eq絊v3$"X*PW2ꢨ.e\gh/WŋeXTҦa-c|#!̳v:m k#ӆSvGk X]h޲M Zyۄ#%{jTt rtZ9I r̀ń$ئ.|.]T щqJ9ntkt! 5`:%p$$m RG҂E@Wx*Hj=&ӇG&ӕR7ǯ3$8 TS%Z?E+Yg& @.GW-\ۼRWlKj GU Mvj#ikQ|*,P?v /K&xNj̓o!u9RkjG p-D(%x,tHwB} Zb.,_]OfS.IC֙< ڶ_#vBhevvɻ4 ]\eu 5uu-j cRu{(S7tL%ҤOE3T eAr=h$L"V WtU"@Z4S8YfO֚R2W,VL.o36 %z͝׫HVP#Yfo/-VW4~l3յ=E#]3z>6+U!Rs=b#'djPxmJoו6V'F a\jdZh6gBՕ-+쬀QIִ J`{|z1 mplJVI`f 7~dU% =k=SU{gFFFFFFDFFZ}*P6I zJƧީ>G~DU\dʬ1~B(mfl̄"ߧ0߶وCƵ9ʹ.sV,k*c5n2m]`ۑ/bB*_#nfP}qwesAs+Օ®adHy.{J*eS9.l]]2 Ҟ6Z3W,d{AL\ޞn*5v@jᎿ"^R{Q33*WIYe<"=Rolh Ѯvd޽J*J? /=ˤRW|1naviiBe n xS7e*<^]~ 3"PHk8,gJ,Fb3Ǖ>C/\ r)dНw2^sVҠL+ezLtZpxZ%2%lrѮh؝\[z[O8T|ۣ/^M'{#>{U`tLN1_n,Xd@ ;Jsl6ާ70"x;0,+۝#'evn|2-\,Yh$ZLS^˲񶯗@HX`Xasp1lvFs' #٩;MÝ0#H!l2ࡃ_J3[>Cճ;BRK Lb"`V)Ӏv|wfQ[NwMNa,aH8ro8ջ1}olWjֲa[w^7a+kX_%髸 [)oV.Rc?\r7z@|U1XZBRG8_Q!o2ad?skDqBz'E>[χ}Ɨ|\}Lħ~wo! Hg5Y7kUo1O!B^˺3҃ u2`M,g0\R؞(BoCi$[Pu_7gi!巬Սj٫]qlqG{AN`MHBB4|SG@MehD&jm'5-ZhU/V&HbGc.Vt=XF+cGAFU8hO̸xE^۝&zB:Xi`ZX~m抰3)#)/Ӥ_Pv8=-@|b5Xa|i!I!19 |rz8B†MJi 5c{uG)wrKBTvBy i݆4hA0˾=ivH}gWaēV"U(dSFԱ#󎣰SOzӬ$Rt5-L]?Z]0@(.gۑO`V `2 xrWF-TrJWeaQ^yK~:_TnR*|;(/dB!=VR_v9hxı=m^s Q"l`i]IJW]!kEoh;0r*a^o\HHV.{,eLع9~`m`-}sEqp씠K;4uV~->h $H`t[R6cz lc =dlXn N=)䩍jW3cTvղSs <8n/j j۸e@{AVҬَJ?fr,&%`9݇Gɯ2pJͯYhR+\¢Qj1h?&ۮͻthho"ȗ8 fyG#XϚiO'U+z#8isjֻpIJSVw%JhqԠ^&&R?metnsTIV#k`+1鯉@Cnk0 &I= eV/UHR LbuKyL!h>vI=':`4T[}TzE=zohEpw%Iꍗgk+c̏B)k)N! e- 'hk1^a[OkeRIQ|Pd:OJ29٬6XcF qlLwwk=ArESIQyABQ?TF=\gOoFpď͊cї_UI_LpZ7*h"9@!+f =970 9e@W3En+v:OZ{o_$0>i9~7XUf8 ${t]\FQC"G"ytM]Ġİu7at?ܟ'Soov朥x*N]v͔6'o.8^Zkg j%ip_ȭ`y;1D{Zԅ%EW4r uQm7*dHv.аحlp&5Mr?(.,X#~ODy#.ZfT\B4`L;, tprA-Gdj5Ex/7VĚWEs“[nb% x X_ rbvX%<*xaffҼݧ4ЖDݳVǽS8-ZςaOkG?jfDUB7풕D&Y~Ӭau3! +6h[bP:-\EhVmҐ>ڒMK!)/vmS/;zBT,HƌC=X0O"-)29EW>rh{B,0c @̶{50o%բ uvHf;LQu$onյ L}Os]50Xr-XGf2w$z[IMe y4"`ch7~xv+q?>x8r4eۦ聄^j\Sv^G,Y},eW.:ƫH@ځ$ ?V* V^U,,e!&<<5Cl]5}̧4 ܮEzs}/X98JћZl ެΔ iw,&!n-G9S9-ki E>m ;x'H?v_Dr:x9lIZ'ȉeRMBc`;='dHn`NV+p(ԘLNY;2e!*dܤ6J 3b?5~x3p-44yspEd9-3030>!a.֐#ȝa$:.g_pnu6wB_8ުGzs{X;W^QJ,7 $N $$Na5Pol! ~QM[֑&jB~d,zE'ӣ΍ʜQt AMM "S[,ˑ53zTq硯M7e˂4+Ahe5gKJv4YڛktNX#B4[K;)[m#Uƴ*UG2-2֮n jGw?bms CF@Tu#A|Bbh{l92󘙷CcێQpv./a#u, cam*{GH%,'Y0<`ȎL?7vJLՊu`B %*<omftn)Kx#X6Q""͠>'x67 Sh U,@kgńYvNpٶvS"Fbk"l.:9<`cuUwdrnmV!wNHﲭ>ɹ9SnrLyGn>0о1qbإCxN2OR) ڵÜ;\9\bسj,}eʠSW?a')r_E_2Κ ©8 !09.8JS4ytV~Q>鼡0s41-[QMw ǘvTa!Uqi(5`R\VjצI5D}*]KlMz nQÅ'GEa!Ma' ψC|qp8I$Q7qq/i +a.$nJV6C-ތEEf P]^,SZ#\;^OW.ᢇ%4`~ss}N{C]Dy'K(cW*$8t1-/ط{t ?:lCT7/b6@ϛ%YyP.4F PvĔv:Iɍ~BfGC6V=.3K=,[`-AR +c_*5:e(96as W tyYYcTN DuG[]rj4Ǐc/c-8Y-I*<n46 7A dVW M>1Ǹtv~Ʌ}}rW8v&#l.ƿD>n] yB9fGޔŤ>J|Ĵص\Z? i~ܤ 5:+P o%avn~i>XFOApR:922j[8B^P.>8 U× /3҃4kTW@Te:A6 lt0}r4_(D(mOqIt>|1ӿ^` V;:~^^ZiC0,aK,{ve9M9~$lcJT  Wl*kK ԍZnhDyQ ȲGťH4 ]]衄waKC>+`su./).#. >֕(5k $ʐ̧(DzzGv\W7 rWiU"ZۚFYw OOH;i!/5N*@\$s Ӽ:H7!WCBQ}˂m$pOf%j,m嫔ޝsי\8Gc%MU"*?fTzwR^.ptAD;)7EuJЫ3fnֻg7b~BB^;;t>xꟜ[OpsG9)f3򱿋IsnlǸ=rX}Qb7Im+j~˲DQkTݒOj+YkEc1+'9kF$$obN[91%9cNrU.)ΰv'lU\_+ւn 2uf/jeb&2#eqլM(P7"o`$Ssi 匂NV Uɯ^IP#^2u/f+Ac}>sH~X:@OSVdJ~|Rm\Z \Ӱ@X9J3yE?voSZߛh4V/GWs'J~ZD -Cm"_Sgn:$-Ma@2'ԳP7%Sm&֖"NLgUerd2 cHk5 *\nla"z l.Y;̍PRK3<ˁ( cD:05AC_BNa=a3$ad$I7bS¹f8{^)2k~$h;e;MڭXǩl'qu\Sr9|U阑%wU7zCQ[U9em; S;8?<>cSLnLPװԴRf]sne00Hk56 !lt{R-whUJ5rx.u^Kc [xZ=ygHy,?=GOG/|c{`EV'(>d1|Ic&\EPrG·Z/]hLz9Nb̷#.rd$CW'a4c[|뤆!^;rHL]J./qX|s%{Ap1h`}؃ A9LO6Nb/{_[~T"+nO'lWZsl/p=w墰'1?qKvN}|__-sn0i7O guuG)1ěF]/Պ2S 0g14Jۈ˿Ɲ\K ]>E F!@60!8^xB8'Q %IȀ $amDi{;ȸc/a?wa=r$n!">녹:D Y\ 01 h5}2=VLHߕ7bLvE3lXqNFjc_"bu`vzBmp (6¿TZ]~`rknP b ,NGry`\rRsxHW=]#&MѤ@29(nj f]dRKGqfe ODY^X?ݷ`clYM~z` eia߇}x.m(ş~rgROMy _Z lA 7a\doG]al\J> Ÿ7iqaY%J7dR$/XvL{v~f(1tn2-(\q1j"+R )P+<*O>4ȀKZV6EJ2g ɏm "yu5y՝:7[/gzM&\rºV҉QLlKq~=!h,*3iz;UT{9[T^~W&n݌ڝZش3w&cT_?+n޿\]x/oX]1grfi?Ms$Yr~ٙbI<5橽:=)a/!oaOoo"B"cT[y7񡂑VL^Mc^A^}|Úbz̑;9^9+̞scg\!&Ɨ@zkJ63L]/[=-T{tiͶAfYM8Ž?ۺ{6]ۆ+MԚӓ,{ ~\iwq=1?O8A0C;l$jʠqν޷T.76 DvgOy\ paQ'/}4x|qtbmfܬsw;6CX )X|J_m?\b ,B/qsp6ώ5FbG(ߏc/]q>gSx~5Y&v"(nÑkS@D 9yeM"k~aKvesq)kᳲ=:5aW8O7+ 7D j@l޿ni<@C3#3+{?>1֌Z&}ɳ{Bu'*^T.=ycPM[*7%hso0rf~>p'@=~4':Po;;!ZI^_.+o^402mڙXJƖ^ԋx84\^л1A'cfcZ~VZK8z]rY,ho@*V78<25YOmݟ֠C7aJe*m ͛˥r6g ]p{*bN'ߵ_>YUwܫSxK/$,|}+Q15TM;w?$?6 gP/N;)|?AWhj qGm}~"K6Mx$+\|` E)QG{(OC0 ۆZf`4[`Pm3IZ-dޗTftۻ\ADHގ㩁2-őW]gK2^lUtR[UvI0tcuF]hI-iYf:qڟ̞[|٭H( ,Cs; z{+t tͻ3Uss7 ;[oKC> )NToPM\}tYvn 1vzeROוKzxBEc_=/UHWVLR0a(@ Olk5]sHRj,t:d$/mHuјě;{ddLd`Xo)o+el·IGrj4OzBE?3C6[WJEb:X6rH#xp㭽_}z{A*()NHɤ0 ~8j,l4rcARF ZEŇk[䷀X2a]V!Q YYiDz*Wҡ+f 9hUJe!~3X^Ȩ!8jWJdctU*!kɕ g^zSiM?בsւ$lGGH ^L\ 4<"TF$(p`aJEm[]6d<˶Z54{٤%im%Y}+l[yƇMoQC.cwMhu_-ɢW輌9EF> 0O=WRLKE 6ꌘ3ؑ3V]]+ ͸jʖ,p6s}D5wR 6cҍG6oW/\<( Y*1BV\5};<"ˆ x ÷8EErΔ,sUTN=Fv#'ldW"RAI<|eFUy@7 he9)8HAu1p_*"wF/'B=8BbD̸RI:O:MC!_MdGE%Ty#2ĕe#`Jyi1 /daI;kdQXiL NJqֻ-D`ѰC5hVYDM _Z vÌ^Hxedtxp|2(NCەiٸbfJAٜ߈<] JOlk#oF?! b=@}FFkb|.[V*CF'Sº3{j`YͬC3Y s2pD1-}bM>`%$KWj*$9a+C=1JN!6 h`Eko0:"Z?\}<:Ke0:89דsrz$DL5,r u1Pbʡed޾2qK,.v v'!EIaպ|&c^k X2}Ƭ4n'F+XKH;vpV'f=n80p[UL0N6h$V-eEp#ix'13jzws󩸭ȟ Uw6u]i;6}jls@9`{52&$E$q&N N+ά@Ick̯^Z lD?JstsHj6sbLYiin>!5ff@Fm`y.Eݦ[[-8'֣DʧLK")J '_Xg7JYuV6lsERg/K]wf'tk* g% DmF>}Vէ+k$/9T t7!Ѱ}_ :zZm uR2WՆp$Nhjibr.Ysh3׺鑣0t<́HO@C,k ?7$^$j-+ns d{߶|q0%2"H;$vlCUlSpQ.2A0s%ɛA [W=fNficOI^ C=2Iby!V}oqɁuAm<5k)NA_Ouѳmũ5ng6{^es.b7-\@ΕMJ׮(n=p9:9ݵ|%o3pD8oÊ˲]O\dy>m5?sަg6[.>SVpM_zZPGy]BHYn7P-~E]дmr+[xKR wG2:khw)H[*Elu扚^z+A͈0ˁӊjw";uuV0gk-pO8y2[]]Miz-_ԾFIHNE Kw(ܩUc$+#nV_qInemvxU-̳<9bs-gJWUv!gZkH.@@p}ŸvGڃ+;cq ߤ+8pZ@a˜kV1/\6E[ꈂIWbdLW5V |@y\CZ0nTlR AΘs!C&{Κ)GH^Snya ٛټ%BfHnuRRODK|nS'6+PFD8#{T9!2ĭOuYNFZ14Ig, ]yDp򚅦ty!|Pti&^m9;5]&7 /3Y 0U"a*5 rRwMIhgƹH:oL%A0jlEG2%5r[Hl 4ڒ$9Ku~)+E8"RL NZ~y/_>(ز־d}q'ks^Ըx&u ~,_#RXbj q"\#n:U .=xprx+) JPGqNDpZrrLFvL[ȶs*7׍8.(å,_tɣ_1zk%_x0޳KBg4U 1嵝]۵M֛RKLNdQK>'KRʒj3RY"敂UH mLh꿮V[c:$2'K\$l΃'BCV&Ne19@v~z"^ٓ9{U6UW.1G3(ci&z!D-%I,Ι])<4оDy]ubڜ8īgs X9ϛJ@K++dEDͥ 79[5K#L&G OΕ*X](d* *eB3(Ěd~yO)9mZ=3ĔGzo?<_hT<́/)s())틸mP)$z&)x%0#tU ӈyE@e^R*;nHlfJg{r_d*fkJKJڴU׭bNd`krҊ99BnvHTu.sZYIoowXvK&- ~mK ؙ`n:v*PTM8+_BKreLuZޒauQu[S S SvA!dmNye&29ے-F*tڭi|&|ʹ9+ &rۼkUJpH:җ[%ѵ/4&pmB/Gbv?d0k= r^{hFX:⹋RH\r5hsƱx@VϻiZڵb*gk{^{KslZmkBUpekO渁gy$LN@$O6lG%b5HY)Rӛ2%Sr%ڗ5 ][WMOEJ[:wfPDy:Tb=bl%Q?UVͤ>z_M,zP(~(bG9v9>|oxƨ:;K[ka˪ho*rLj*"u8\=TR.0Qd DgଦVzג׵Ԑ7Gb'܍|*.H2g7hيDu(:{_3j"%);j=u4餰s=B~i|"jGwg/Ly.>gV37omyU,ꛅ u_55doR(uosisw{0%XFSQnʬ m()T)ݶWfaCpҽmu[:2\X8ٹ?q>] ɼxҧڰMN,q. (&1oQFyF74":v> ՞NUoGō>*sroMi # ˃9Ku`m^l&l{'aEeD:?{:٪h[,n $FeuzXbŠ\*& )j`hWb`r]]tK [4W&֠{Y`/ϊ\]bX>jo$n&0wW֠B2.tOM;688BE'u.̳ @fMGHGtI@[?;+vF\c~L;;ztk>#ƀ$y'L\PT!Cym6Jl<,2}~MގF֘;SbY )J|-FȲe=QjEM%N.oz¦T.V`Q,} QbT:]WFMM#|ƈn%PGmj0j 3UdR@DiB(xASqhW@|>;A?W>_OraQќղ]^ t!.D;mhUFnHEݼ.Y=.v7={b:~D6:͙Ho{J)4n88?29rN朤6="@ZR%jpooׅP77$VlIj`g&bbꝉMؠEm_POhi,ݮ[OmMh33Z״y&O4tKA##dKJ+Fs{%jiT. 9vܖFԜ ~:hmI [YGp25t $ftn|Vd?=ƒQxcï (\'Bkt"GKЛ[u'VLY6ԁumv09Ldd1 AFBKy-GC8)-`>MѿQ8ǶmQ27~CO[q*զ!S`Xy.amaM^h5 [O1s1+E-2-%8yLX$Lw a[~3&?km+/+;qRR`hNYLs1Ycvr2*9/OU2WūXa @䥵֐Z/m\QNoBq保,+k7g4TnĂ`@߻I&tZQe;{X·`3i+IpW4af'ꦚiyw Ƕ2rUi##v5kX>"QFZR+Dgg+MPGi hK7&4Qx뢲f*ξv]a)_X4;8ѧYzG ?GK7CkxOrw2#4.S*dt8DcoWP[NqE'Iv| QCm8) eQ.SW T|] A:{5df@$B@< ռ"thևr E_Ś& 9p`<؀/Hpd*Z'[q%7NvO=n׌[=AEdq\VyQc L~aѬ@ںZKY\L10iюPՕs눚*r[e v^eL2ͼ1[̀0\U6HtD{x>ly'URdV>~Ѻā^o+S=}uf!ڒ8[ [l+U><=r7:FWvd2:yZ+i ı@[sa9pT)˄W+YΖY.xKY5iVooް]4 'p$<%$)vƮD;!g'5{u464۸Օ1lxOH  fA 37lI 5cߟ]=|VHkÑdʹ%It8xbIX}y?}_~,ɂsO˓vnۿZmj[ͣs*Ӌ֖6"MIEHmv ~ APV3]n=%LcShb^?i3=~LM&:8~o)Ej@!`n/?,SocEd:ƃPﳡ'x<>wmȥbYt]' /GIeu2xaea_GMǣlڨ~xƶm ?< /!Fu:'ÖP/7oDLgȔ^2'Էs礸=dK9\"O4lfXJUX%C1Ȏ=(kqDRlc3?_6iV" Ӑ~+f'5bOә5ic!Y415&3+l6:|51dgLt4QN1DdWbyv+!6~>$cb .}Y]ޛofp> uNs4^kj o64ZQmd\K. իW{3X8kɓ :L+s'wK !Gì ,BpصsX8vLew<]eDia,PhB$ `"[p8L q"HFųN| C*1HP$XaȒcWe0 LjuCʽH! $zļpd{1e^\ԓt <6#&]Z*t 58am˃DX~f&| 8AiŘ$$dq)VP ;قYہ:"G= @9.~?ƹ`=TxOw8AZ* tw'd0MN}^ZTN /ٱ˗v&<'4QHd:9R_dvFpr?H3U#q,=H]fi1yJ)SZDdzȚE4ճp* rL-Cl[ \=pP^,FK; Ltt&YuW/$`Q#8''SjBDrwoa$"#0)74C7 `#v ?$?HYsQb6QK>c@`6?HPqi`)#3h>+&yA*;m'>IZbhkBL!~!=8،e1'vPWQ*-p=|)3_4l<_Xcnbp᠓y1%ʿJ(D+ٜIJ&3K|/SR4. IAqp!lvQlMd ϵf573vP𱯜ȚsQda4wi .)9JP:2LU88c YU$SPGWCNt"X [\ va9N Y4(t'fJ-ޛ2x ax0|Xui<3.2.r%4ۍ);(.ޖuu0ߥYI-'|a+Wb&8H&BS։NaL[N I(v 4\,L G/ٵSu߳@sllo;1HA$%`l&'3lZbڣ:OI$D| kj%g[O!pQr^L]-&CF_X D$ǫϵ社s1Οֱ>r:ϗE=9 )Mr什A(dL5ի@$ d[A,#>r8=u2I>ϋI鏈aVd0th"k]jJ1' XHS|K}{x{xi})p|ٖ ~(2b[1}4}VJ@}}gtrD mT$&p;"Yb+54Pj)ޜ/۝#|=$0\ 䴖e`Z (׌h׶ @\E"*Bw瞋d6hߓIѦk Hm lOq %8k¿Ǧ8;V`Ǎ_}7s@-cn<~y&$fGWBL,CBy +K48?$-ay@Y³izc@J5Z(Qqo…tb9 {0,]{^ Fh*}?"ҟOJR i yl1Bze JC8֩y@V!>ڰT^'S$q8J\T^{#8 .M6曮 1ߗ@hQbt;Xi>UbA2Ih8pr 'K\zko}/+>oE1+F8ݣ*7vn-*xWPP@[:}&OلrL :dJئh6 RU(uL#"vmtB\D nL# ςQ$ԁ^1vffB?/T.<'<)Kgs|fe p#M,1GB%_s. $FJtSh|p/W 8t(|Nb*wk\z 3P4GM&ʌ5։9,f@Ua &lF 4_O%яP-ODDgwSɈKp4<_/|qׯGJ|&_$9̯1bR$=H=K@Q 3M-a8rf!GKo]A[հ׫| :QK OKe ~VU+BQx޳Fص!fC/OD~Z]P?jVoOiteIz_YP,TOdQTfJT٢Iʥ&JBc(sPd=oHgTa*}-v|'#Z2֗&.i[DSVWwR-eGue?2٢mwcUO4J W(oIRB oBWX; H)<{PV*Bpٴ{j_ΣXزy޽fg@uTWm=g C9:ahˠ/+vDȀM&Bc Tqq|&N;R /ʢƪsoʼ>zm춅8 HjB;ݠ>-X ] Fۡc֋a^cEA-YXUw^8CxZ~ i4J9<v|ѪtEC%2u- {ha~Ҩ|!^E%A dϽ4mp@؁?TyUkqM4 OYҚ1R]S&c;ֆ*j}= Mp8L,YD1G/t³:)*Zxdpp A pHiID-nk]t ^--z)36ʴNoemPNaHS1EXfRJ*ĝMJ嬺j *Rh>w55"dhI_҇'dK˴s eFrVidꕯ?s1X c ʟX+)tݹaZ\,={6h8{u>N6f RwrL*E fNV=QW)#~^ J6C5똔3x1_qb%zs uߋncVhݢ`BF!YQZ i HV!X4ֵWb"5oh)Xddjla1|1 GEb[[v;emה!bKkJ!i:Ò ɦNۀ/4TăLK t9"Ep+ +cW3ma QЇK=D&ϋ;@@toA̐m2)Vo*)Ê ZVQ")tVU xcƼ5?`w,1C ӭ:Tw14#9q< (q!U qSGw哿k>xk0 (-ޥgM6m^=bGKٌ̢T?GMm;I# u~ t I|N=T l*wj'%vR%=qeUt\C9&Lf홒J$%z2PJ\ \ d 蟲5JW.wFs8u]Hw՗",quU@׺a W}+W[-; í@IK1VC5 j`Ҿ'A#AWB1(~(q sW dKټH0K*GٖɑoZBTb+>)E1fO+Рژ.4׊o\",1x94|6gCyOhԩR}Gxi"fH(RFQ[''= _< F6'ϊ_i'hᬺtl*Fk; K b=y z~/Rc'xlJ97gS?qLZ~MRzM$ǿL%LZh=b병pkUo*y/$XŶBf܋x2Y;|`9\(‹<:W.^$uO82lm1ʋdtd ,#|/\bm ?jO3R6DEo8\!z38TqHk={=3 Ghn8f򕳧ㆿЀr BTq{.CvpѦL#=P#ESdIg$u00l8[5 m+C tdoNoQy)^&޹n-R:6vvF5~_)BO=mvufXpj ]Ks;e&?bvvΆWz<U\|?a# \YB[`Rd%R^>_ ފ`;;uWoЎYxvHOc7Ӑ8Ū;OXxk=OXytl卑hS0 3s2G.l/ B1YM~KWvazٛRD䭩2lf_]WgdQi|r<nʷף RiKGl 7y/ِFҊRMm(Ȫ %Qvj+2<-|)uM|g}/_+c+Q!b(GOn\ms@x{tPGF?/?qQ]l턩' V#!t:zfC(c"YlB6wڦ,j+EV3VF>ai$1" vLEbJ!^P֔yk?~w%|*҂d_;bo;*hFKBɪ&jR˓]r<2r~%vGaI&G XzCL)| /Ksn0{J6b-NH39[65$">6Kܰ #s-_s4thZt6lTٳic'Yw7h)cI5PDˤ>UKPObJd_]ڮ%Tr2[8,1 9B^ n?ۇR<)a^Z.< w*/XX4Q\JR_3v|9?+3e9d~a *Jn_仍CL9x}/9B4 բ?(6ԴQҗD!G5$T) |Fҗ0*mCڭӦc-9aVS][&,k+pB>O"0<..A$b0$5~Y, K#UNf Ql5]k-BdJP0VUc<(i$$mZ6 7hĄi[1.af ;՜]YÕµ+(Ί)bW"XG-h?]-]ѦUZF+4JWwRwcuF]HZe _)fGՂ'XxlyϜʧf +q& R56'ma q/m."j"?= KQbc(P6/J?=DiD+ֶ0JT)"͠9a&:Q\9X]*ZY;rL-iwra(ԩMDS#lu<吻Ts%ԙYjFnKz䏯IS4>^Lw ^i P_$(-7~/w¶ j۵g78$buv=WBm} ?#C8T+]%<@H:bPUwN.~j1r~ye9e I@œs6M\d|+[_XK@U`&`S0HfOإ-z!^]Z7&RO vK`66_̈7EOH -0T|VR.QjVi7U7+lhvzh^hD9Zɔ]-wMem[p-%OUTѴ;GLY+G!< xߵW_,ZCPF8O;W0k[-p ?2#m-Lw :+1kBV? ɎF ƍ6-8BUl3x:"V&xwi3Cko1btzy@1-o[Fs/e(,!kvd qT&!q(eeF*fGrjٿ~y1f^ls"TfP~xw0FГٝEi[7ْ?SvZHKh|ZDaI!5Ωn9Cu 6Uz?G ΦxѪR{m]` -31ʪ!AA-5mdF(h "pFX# L h3֥(W Pbxcr0QTYW$KQQ%½Is@sBS@B]1N%ZNÒӖou b*@ִX|r$V(>C;9Ջ\b 2Nwu獉0 hDb ! C-KPӸ@s)>G+;ˆH8m7h́&g`s#2&Q6Qz硆풊%폟6K+w}>*b/$({:-&/k 6&O7 /`p;c׽S۵?^8iF2GtRN3 cdcs.pMŹCƩ?'"{ˇB~cwnBxw UYq؜t^k2J\U3SjQѝR$khHfH.m-1`KC[zOP|gњMtDHj{iǕʝzlnM1i [ m:Y9j' (ۣTZ(L9v3XlEVyP٦/D"t! +:ZJ9gI~b&<}r)1?0yzmc.cʼnL#}/{Z xbY_~3VgW*''M"W1v;*B[sE֙1kٲA_]Ifzj7~.׳C/Fz8M}Vu s]2P1Pa8ZIV7e{)ѩZ|ʬ'/ݣp4ltU EftcrJW qi*cxЙ/z(_TL#을BTp5=z4]_R .1)bo-}Y9)OGE B%1 )豹40JE8,NJG dr,pƝA.N؏V eA"%Mo+in!L8Z{*v_ܷ#qnwm7Ӊ;AƧ=oO'~?a hJL%wy 63wA]،d mvKs*_)<wu\Q%D7Cd[}O>} Yco?5=U)>D( -J(E%rHZ @,@U( $\ , iI߂9ϡ!7 9]z$Dww3+|sr'{J[i!T=2#BT4:3vw< W38=n3%F epx'N [0\r{^'qܲg (uLbަĶBDj`38Op++s\uqC?ӿq;I";tJ_mՔE ǴI >'ϲ:;Q#|+Վe`[q&emN]'4> Q׃D|5 DO. ՊVΗtfmp)+) +/hYcq^M +2ߕ/ۂ=omek_`rjmxDFwPhw 7l kfFilج voj9CSvSD=cYi *g";zu/om%vߨt2 u?Zf{ _ERjˈ>@GߎEk}aԓ4 $shEU@iUk%NqA\F;@e%ng -j˰&ˮ&Nۃy'wVdԢ?9ڭ#/#R..^ljh Bd\-p<=;aqA"fg;[7}R_GkKoW9ǿ?$Ž7Wщn>tRK{]EkMC}T0zle8GVRn/hԩ1FWOx2oѵ*ʲOU!y*So kb.]}(tX)znsnҐboJdu(7֓<+`~$?E@ И&%W;;mz_9չ jG߆I=X W&~ߚ(Y|wu[mZn'bf5I\ú^Cϒ, 1ιeW'6>,U50=hlr\^1 OKx0&\a2ֵCEMn(Ҝm۫[-p5KWՙݤµWPxx/k߷L">_ UChsOZ,0~GyKMӡŕzMp:oSJ5]on MWVFb5X.شrXsQKm1%&$:t>ؒ#y``3K'd{Ɯ]*H!;e]t2Kk;XW MDPM1xA{(csKhޕ "$m 3`*3`|=FvV?I=ft:0]|1Sm*5,6nӑ)-;sҗ _gEbնHY[>LHܡZ_9cӓ]A *OO)-q]D}U5M+}cU/ul>[Ϫ= dc^Y[8҉kx@o75(tQA">ɒN`p6+{#&3|YSbS323g ؊Tb@)? 0S#@mG(Cܤ=J\^w߰୫ ҏ,C>-bdQv=a&L{:4|=m!f[#Z;GzA\0] ́0G-3bLHDˇwu}&{Zk6!ŎI$C@'׬N=/jt-Vp"'{E]w&%Q|- (+aօ4ZxI zתf7+e?ejX&y&&[X{)9e~cDYzteN:@̠s!we̢`-=%iPS{-2+"3"Dg!CeK .dkf$:%f;)AnYozE1BlS#A!@mڢ|aN̔(7 䆮A]w*U'أmqjhy_Eu}Wݔ)+hN$'^e0PSE* HdlAw<5ZQW#߷[ἉJn%[ QaL]}{N}fc i:L:B-/D ot(E<ePu9@絆}:3ѻw2+]M?J̚V4x,qȼGF#)^ZQxl!amYDW=/r?1׮= IH́90]`^e]I4s~#mf}@UU4oI8GL2ޒja;h"bSEGH9x=P-2D?88>=Li>~[Ýi(97Nvsp˸ qZܦSVs鲿&D/ov1(4z* j6suSWL?*=NSP4ӤB&W1S:Y<9ǩ^^.$4V4pBbC$>u |Jʩݥ'ݷɲ:Zጴ|0Qݖ6f*{A.V^!Niv{~+@[\bCa)?8ՄaJU1k'NfQ_L^b};?eJ'm:DcFyWٍ)`6,xXk[`i֋%/&jgc/2}oF\Z-72|wāO >s:6 %\F _mI\چ3[_{9%+YR:4.h?6Lc$InvH=bS'iLVje"Mԑ-YyBWmE_GR{ȷlqD]+miMTp AWˮԝb.jVqߖsW͗hGr|D*uQM# !LX(CnCR*h`7ț1QirDԠ A]ԋ;*\!# /l\ v;td\"~_ժow!x1H?޹ zuEr;}|Sr&g ؼ`.; BU{ēfs+caI\KM0>$BoJTbфMI~fGK K"}+vBӁׯ__F,^7e:$h b& ǧ}oonY\?C6" ܫ*Ԥ?DPF"v8!4I2+}=rjӪe}5(kˤpؑ?M9Ҥ()u/ZݬA'Nk^t‡:iNaُ L@eʱ9|%fY:\eedb-9Kbu%[nڇd qMт|]G5$1˼7YvޡY1A7*7ƘQL]B4TofD5Zhbx넍uR~ 17x-z"ϩIrބαWky޴ԽPdaWuYN$:-1W!g"ل]dAw{T%/b[Mqk\ڂTI 2f&Ksv zŪ|g|@⑯Z}H /|N3rHȒl({a\$DBn,t{Zqv,e8sV&X~|嗊.c4c++s:Pa.E]ˤ,_,{r٦ؾȥi2,"7{qZ,ƺ&AIG]@e9id 7aP]9viwZbi*f_!N0A!6W{JOJsHôC-.[x:hHUqu3hakI/Lv#2 |H 6Q.-QufQ&-hN(bWv#-]`(3WJ˺BQ,B/< cse/m"C uY~wFxU֮v?Vww ^*Nh߫mMwJ7or<ߗnov6x|zz.GvlΛ'?vsXPj؁?o~nWX8 4l>BY/׿ݯ޳e]oޢ~/~pYAڃ\a5Wf8G icYer wcz㠰^[viȓAt_ʕ(VQN9\AXEt" <>zCq ¢Kӥ¹( 0s~nȊ*r]wp |PuyB fl5~rpmz-/ UK1S`eM-ŶE0883O.4Kvki d:} S!16eoMZ!}h, a:0v:b- uvtđ6X'Go)_U!za`*Dw|:ںHm 4T{dlb cc)W} e:J$)7~CoTHA/T!4В\ uf+eG/gOua 1s_ˍ-kR[tw3PNv[/7'`,Tתڲ!W(B@(k~+m,=-D.2e"Ng,4n}룘*O掊 ,jtf$\7퉆j5o,(8' qÔ /\dʸSV @C.T8ll[{"yFHrX 4\Su*/AJZCyNi_<\qӣ;0YT\"fÈ5j:/ Sawt稨ryc$c` ͬ4&3i~b0 7a.cfИ(`ܖ`Ԏ{o__(!wo19ۛ]%?s[- Wxjj[tU,(ybxUB-(n\*x*$Bz @VB.:i)*ܰQޏL؏09\dQxMhw.b!_hSڛ.v\gS.L??UYhvz[cK.1J )붲ة ѯ*FO @Ƭ%q&n~} ^]9V'z+Ѓ= pm_c2ɰ}%!% ~f5i# l#XUV.!;,ʥO]ъ( Rr?ZNES>U"UM5fnT bgsFx[ǘ ȏͽoYBhnت¶O d;ά  [H^&{d wNB^$0dSf\hGlf -Γq"Wvc%͜܌ujQ2`E^BWGu97ql ^_{οȰ7s. iFJUX91U\tgGjdUWwJz~ă6}' :3 Ɨk`1YK(Ddom.nԹu/CVě2EDzqXQ~wް ERU/xxH{HsPUaze0:X`Cg:H_"*֖r U'd 7m1)nlp݋$qJ(kYnYXh`밉cx>HRUƏ&@q 2惓rZ 2) fJ2a( ߙbTEˆ8v d,1SnI43u4$@馮Y8Jێ u ,SPWpz#]\P#՛VLxSBr- IȄXEDt1 o~E4Rݎ]_p5 \CHEj9K\$ՈNN, _"׊}Hsޛp ,n#qA4˪XoѓJC{/V4K }9aPdLAB`6=no PU\_}kmnHP濕[ O-0SR%  jP7eYtz.d4.6 kvbsSRhvpWmNPvvvl6Y[;]˂_ik"uw ݓ7Ss"s֮U.`~ޑYRr7{ʍ&mxf[c=8SZ"XDѳxT89=']aHh6J8;"*)l* '3Rq\\m T,xJ!2.,l I{);XtIglya.l5ǥ=rTQI O^iq8MPhd7 1sߛ@ܕ䧫Rtiz~3SHS&, C3ܬ2Њn%$\GC5i&;g:HB> +ƮČ]g;o2^$pǽp˯aSΑ"} $Xcޕ}Y\=ܺ?X,@+W+zNSe KYxhXQ N*G 1PDa%UXu,F&Yo5'\C^H +~Ŀ! uY:Uf8" j~r腬9O(LO L9Qh7Ib)n/BkdoH]v-v>6,-(wnV+1`] ^lIցjo V uw{WIeo:Ś+~na4A-17&Ý $ӿQRiN !9 Mo=|V\Lo_PApWwc vxlwea( D\ cq&!$-29\*,ltۻL*!>!?DA0$aU]U͟9; ^B[cr.\*(e,f_i${K Oov:9d !hoŜm}yF9lJٜQabȧ@A7;"J)v6v['fkΐ'7] WHyiB;d+YoWvgUpoh;=8y*_ nE].o#/ YOB>` D #^@#X|AOr1$a.}._Ru\ Ko94${<>#58?(DZh1G ezEdVO.\_oL.u(=%iv),T|\6 sqGU[m?^RN n\@ JتRN!a'0'H"Hv"m5+bd#pPvv^8G+-/_1—C&&J*BɯŮHM7@"ZbmR4-j|5޳Ily*{o<kk&?ml!w-U)hIT D֨{ON|Ȃl}"މte?lx>ǀ8HJ戀6*$xNʲ6ǝP0DS6YR~}. JhLt lNۼ"W尠/O&_q3F{y'&Q)kYjb|mݣ?n{)|>\ȩ?XmzEVMQLvGZtb z}m"(k}sC`dHY [ }A ?]tNGרJ(j=$6qsKV? JѶb.l%` /Fao]`gAC}cu@\ :h#&pqHdYi7ed]A?f[AѸMlQj!b() JAo _M_1|3+l7&X;:7ҤC&7(أmqЊBH=.vp &S|e2*.nˍ-Kʾ-HDtczfʥF OdWh, 6$c Ho V/\ّPzODqeBf(]Tc;Pb,fQ+G3Q"~RPUb|WUQl2%T:8Zl_l#>_ۦKߦ@)qN|9֍}?l,`cݻ&7(hkE!Bwf? t5mN|Zll&2_sFomDEag \9 UȺeu:j @) ՗[KC\<&3/VC HG^yH=-]DI ˑsB6@ {>׈ٶ(;Z՘tp҇2)5,m,WQJK2= CT.ۮ[۫fJWT899D} D)zV?X Uؔ| +ֻ%0Oɱ>  T0YDzWظ!C &P=* $x, qrƞ:Pտӕ 9i^uic@U+VsEF޼u.cFӀלl\"T7>zQ|m1qSLX8P@>:DoBm˰R HВAp1#V.^NW2vsPx]$~5MlA+=?yx~ *gR:7z*) Ĺ7oQob̀Ҽ< OTG:h 3gΈ*r=:9Agy:$T}wϣa)Pdm\ypld}&e9%E!)*iX0l QCL:6 oȡ[ӧ*lƆ#%6~/ʗW um.]0 ;n)ѯHb9/-eGJ9opAs)Ai3@ SKбhd&p(Nf3v7. p-kO%S߻_TMiV b+էJWXbv|ڒ2v|Tͷ"xk>?U7;y IQ}DI޽2HN{m>KQ+x|,(hMŘ-jc uy7r5/̼%-z} 3\VY-)$; u2l jz h!{U<[Pgʲ^> &#[Kv iq0RV`cHPe9^BL`T"k($Z(F:q%aXh濉jIu.RI\S+,84WfʴŦ]BsNWE\& -ɥ^fْdn|3^W=п/5!àXPau8H(=}A:~agn࡟߂'uŋ.^V7vn.9kçH]"Z RHKr>XJLg%Tzggv: 's8g*\˖=t.GE7ǵ|rvt>>imL`EjQ;A3:̜n}~02~3Slw;)Kb̀9#&q pA9fCkrqD iJy<:Ѭ\OVkTjE_ /bsUW磌٤ sf ,Z P36Y:?{H޳m2i? xGǔK"S:RL^>e,@~h/-DQ]NE#V,3T=Ib_ȗ!3 32tL ;sJ򕟟d5j.-2ÀVBsu |2ȲD&\ @0̰}d?HNLж 0۾KYa% )u`l^ߊRkr0vED߅A]^zYS1-)xj ;NF+wi@0=GP-ĹejR$KUBsyJQXسJ}8~]ݎKyD% b-θ@rJB<¦]!0x$p fIJ(FD@j:^CHC>^H.WLd_jNV䰄4=dv[;%4u;ju܄ց.;#!Q (U{/ؐhZKVOLTHdKoWJdmu{:؇D3ʻcidKViNP7)IQ|4O~("?=xKho'1/pYnݼ,/F%' dF ;j- - D/4xm :djl}Rk9tOQRWgLYZ+.$0#5c"}˒[brvYc/DZ ZZX:G-,¿#bB]&Se]N^#Ի7CW`~UZDI`oAli"v!lvuptޯfzl*o[_)2M.ҋl7#Z AW_/)_UA}Śzn J#1 ̞B|~o[ ]c^A7>GbRG h&wP|6[nXN]igm۾XdIa6]&;<35PB-OqEHC2n:ɦEt"0\2 Bβ:xC`xU=7mu6$McPGwQVP.<|'5~ dhtRfo7(o3F|/\yf!ǎjyXt,Dӏ"!7I--pzgs:UG\Nyk'?},slPzLz^4aJ nR&JȔ$VT2NhFQp1:wH1҄(_ ľ-~i(\1Lk2tM`$.pC<g5B,[&A#l\X&:ܝ (PjYH]'/PUCH8lZjO0_G^7[`*Rc^k q Æs'L`ޢh<ak!{=ƻDI?v싪smcYH֊@Đ:Kafyg'%z#XЛ:|~j[dA zmeF+;31'$fɜ"Vf&y 2}L;m-7?=NHQ!!H< <ۛYi4cKe݃*h %dis5W(/ w-ae>6d[Zݎأǔ`pm1atSgV& S7c{=һ!Ygy8m1k;Z>6mݻ#PH"5>f3IXT%"^ 4h|L$œq 4k& #' *sf ] *m~Rsaԫ4*َk?΁8y $4I"xmIL{hjH# X7OΉJd:|XFoUh\0OJ8 ML!_ >?{E"hG+_iV.$Av{d~r{>I8 uKB%;*s@Tj3VمѩMDhЃa*!&ꐸSեP| ԈZzO>ϾNl{b930a6KVd.$ KJ ۭNkt‡>uLXb4313f*r-pf*6YDD;` {\VeL2ZsϜ"ÿ/Ib*L|tK_1sQT~oݽ`d<}t>3/6'ǯ% 6Fi6bZЮt]}h 7pb']("i'YS8wiE;Њ4>%iE~@3^Ep bvnؤmaIFfȮR/16z'8RNgfK1hzG3RsG;ΒOM@2jT Л}4;&fV.V!.1As<7jPE#ݣnsM D6rx,7p4 >W:Ii>yy[4׽BŽ<2k*. fLgמlj1Ԫʾ$\TYt"܋Ŏ;#Q˒g'}R)./q1kؔs0L!p e-YuM73'+ŸeTAЙ‘nYfÜx~3]_raɱ3+BwHT _}PjNO !MA5LisajdIsk=[Jք+وZB '2[kuSR+jzHMDe31 *:hڪ4bϠBBL@.@N}DA@jO15[P4G AkZMw(eh=ʾpC5u*3;1bD%U>HZ+R@$uRAD$;Sc2E qV^~&O~E9pk~z[ͰVj Df| HOjxQ!UX'JKyi~j"I0A_n !jc> \ϊQVKRQ:G&D3CƜt17XF \A:B 1t64!Pci7e?plVٛv>(ҟ[iHN#6k\zz"@NL#76b;םؖ 8~VMbnjQpE7^H6e ˊ1O7ϩ#w}[_V}uC~sࣝ?~ X{H Q/wyKYD_&FD@5OlzjA>39ہMBZ8}~ >ʺֹFt7>NYA% ~$J B$X諒ZY)jeP.b{֨jzo T3Mrb븀Tiv+ޱ:FZakFX%vcC-Ak b&"ǨtnsUAR1vS$&Ȣd,&͌u%d`Nsʦ. cqx\t!oQdCʝ 뫇LlHjՎ.q%6n~6hkϪ2SW68cFNJԋF *lIA՘MU߱?=b1ۚ lˍ2QSf!Q;u .0)}c[9ۛ(55czX0YWIW]zK( 5ٰ26tU67,q <\P%umƲûkηdBs{C¹4ΜkK钪N1 w\՘Tτ/I&0ďujfOΛl֙IIP\/ngw?KuڨGu=W]?,( z7:!.<Ѻg2!G %!xJP߈d98'edahD’J Ȋn!W㛥cd9I~2_eSc/!l1*3p= biD[֙l3h+GƧ[Rj8SUp匒d(rpD&O" 哘i? gb&T+ReBn`XM]+k!)yA ԥ5T8ka4j0h+6(%(߷9t'&-+CmlX'drЬ(:fF0PϷ q:Ia!*^N-ld*eگnւ m.$S !Ԍ^cvN)8ѽ8@G#atƿG_W{͑شod]i6i9EO1}ʜS vX\4 o^EhUZW CIY @PpFd PIՙx7qK;A Ak_G2q<] =^ "d{q KG 呃r|p yTDڇc p-2߬,[#̣31bl5Ng|`#ìhL$߼,f!Jw_z6;B&gpO-HGi>/M˨ mBc1#^oG ,.4]1lr.Gs./cm |o~?]^1)&dƯ}WĚ.^}69oZt%vu4cp˜d{|Xap E:Ry>Ly^;MwG.-/x;@aԏI"n=S.+2 )t$_3\3FZ#vcxtCB<i4weu]}X=CZ{õOs`}I98TH[B◊eHI>XVu vH%?L!&}b ']aaȉ8?P_ Ȅ`*WP]v['&$؄~ ԑ QA-~c ĬΊCEB#ˆ6W]*K3'dY71Qȗwt"ܓX`$4@ZU$4hG7Gf,RK_%r'G^c֢Ċ|(+ +6SN VuW3Bȓ/툥`_: mN}[c} XQvvRLvMEsVG֚όm]}W٣fC$Y’kXIF #zN|b3X kgexߧxHoQQv9S<*H ~}C+ 3Hz |j1a"/H5@EH_(cB&~kwڤ7 cPDVqf~@#Id? qG͗IgZ9܈;jtʺGT,BnZ۷4OCu5*ֳ:x#a%:0[Z,l%<@B(Ȫkbi3Xm"X͊ EȄe7gB$pq]gؘ8e q"N&W]ciiF>[_6ѿFr1vA Mع|<Ϙq@"qZ% #"GVF,`Y&sy'0nIzXR ]@ٛzp-fyz< wf*)#Ctn; N 2RtqwUĸ3> g="2 d g]pX ˉKe}A :@[ѹ{DZ`1?;>v<JK |4ufB:Dr GS>] As6$唇Ub\Eꐭ-ɢUln9T1^%G@4h%;mN\- X2&Ht,%x b&]G&x_E[gXjwތ }#Y~CXq+\/"< 5D&m3ií<dMRz^\gP%^!l 3W_]P['\ֈ{mL=~26܀A S`gϨ9ǁ16h7^^$JEοAjMCU$Eڳ}5{2!Y> ֨jZ:c'ǮO]a/MڀzW Q4ᥘWowRKC G>N%X *  ǯhȖ[{A '] lWC6-* Pē<2-AڥCA8ҧz2șpOa%97EKU4ʶr6pl竢ɍ+cQnGưƅ!\Ȉ׹>J5L1@P7>Ė C!9[[6s}La^ÄLׯaeWd Mïgd𓛏o߯oOvf{>#qf)%=9{@;/[ԗ{g7L2XZth¥9I #_å3p}C%Ti2ا6 vפ:WN=~u:j=^{X)jAV;KzR ?vN}ԇkٮ4Jz b|r2Lw.]~G`3@Z6\mzik@8Eb;TPKeE v7!u,cGڲC݇J]wWy{vq߂d4߭+(,T'+(J%%Y;@ ڜKex8$1//*J sնث)_ٞk]1n dI_|Q1¬C97J62>m)_޹ZҀZxVcy1wl )acvGbW@aTX8Ûtu7\j|[hm{PɰIr#E!MOv D%V@lRj kJKm\V2J ﳪ̧Y64ɚQGCes2qh0$CxfpZMw.ǗBݡ} Z51RF5 :_T?Vj'ඣm,8ЈEFY6>8HNm?$AkJENJ奄CK̷Om_Ky!N]\ɯ"q 썌6'z,#'fr=k.&ϲtt<1[v4 4PB(1Uae0kSƊ'.%kø0fvBj2ErKܿv4NCJ5㟿&{++ypq<<=!kly;QSm(+{ j_hH y&P5QR̿TtD~k>?.g&=RŤsTk.b_\Ü|T]M9*]:C ~=8FA &w-T"`Oڝ[w#[3+&F y`H̨ Ѯ]˵6/H3`T]bovq\Togtё$pJ{Rd'0 o _{KOTW K_Afj;ͨ+zi 4 ~m>>=Z򕴺jx|eu+=ҞL:Q)!j910 zoW.5?h|ބ~QF}jվpI'?ZpS-c]bsȩZB} QZ- DJ̒bmx㔚Ovk_\[3Mk#Qe6!S֤]E%8v5vlfpE1NN0kIdn('{$ K[ohqXE 6t=AIH]cս ;SDML\sy3xǀgtJCuUR8NMlInX9Ɓ4BTIOQ`GFч oY'⚟}toWO`yJZf3< 9SWa,: X7.Vb67kIs)Cڐv+|ܭ|p$'v7g:d7h#>ʦȟMtRpgb _kP¯)vgP| 4^H^32ȡJQ$U#A] &pEoE0Kr$&aC4Z~|?XkVxh'.F\v:S,*jr)Ҍ'knܸYEBp=`=z$B=:^vIc[jNzi-l@R>?wOxlSKJ!qlC%.:!3*f!{eB5Q wpz58ٿȕ$]iy5 ݓ /l';i6h۬\A`+B茺W^XxV5+RH?Nuz6KR.JmE¤uU`´44 f'Wt,]s Z!- ,]Q$l;**Wucteo4*+n,8 W0[8ܐUs,WT)Q$4͚1C2$BJݬDcnKm]o C7Tf~6Q;>C8h+/}oQt+O7~'S3jUE,΄B똤CCsXMZg&n'B][5g2Y%(ʫύ4n{ʈn- h{xP'`1:vot}\Fpi~!UȋdJK&14pH:{V5Pέ8%PHbP3Si؊ۦΌkJv4}ՎWIkgTNt*n ّ7 Mv=3h,ʅ+&~͖C|m˖p.{l\yjb˃d~A؂ixhd?a1H17AV@ Y|/E?+Izq<&7 \m͗UŠΧ|ڹ>8{;ݔ[{ ɶy q=R^*NNR%bQ ;##6ɤeF 0{Wt{гb`Gvz9sEB*5Ed`bER?~4=jEwAD-=І2YEnwpεgxF$= I@~N{y =IsE!g)G AţU;{!"cE-Csq{$?X9@hވ# {;3NoVϫ71?# #آI)$u@|} x#0|(1g_U^)9cW:jy\9η s02.r:^ 꼊*qڎie)ǩ0tc'{W4sYƬ][?tw/;'qatLW_mR1v(U֍w33HN w !6?dT! 5B"s+YzN?J|O_ɚcd5A_C"putEɷS.'7mvh^ě827u[ wʘXw5)wuDYk~A+;i(sM7Efaj3!i:N(p7ʼnyrP!! ؽIhݤ'؁;D{w, $5WhOQ^@oP:OMx/N  sj>SyCPz4 ,K\Z6į@PwU5߀;؁Й=kcdɝ sDƌ~!]CDd5b s< R /-3 }"W=zyM>|q{7v%fv<;vvBQo3 2÷(+<Ð/_ !^ %ԅ&8Zz)PDv{'c5[ V}4:6=U#?r'zF-Iui;(-*b(v:MXFԚB<~J*`WYNw|4N`][iDT#T Aj؁o.F3|eI{ Y)9>xꀸ~d߱~ ~Ut] Mf-Y!>}tĥ31Nm2N jצW&U2Bt۽v!-]smnn j_||s[;x p/BH2Q ?{$ܒ*%5* k8*4`B2"j9??ܯn]c;ќc (CC'ۓi `=ԠWփcR526& ~;1]5VS[ɑmK}+G|UVޟnXԶuOv[М#;=;2nIՎpԎOFy ѕd io7Cb+_fee %>\(!̓xX]nc`N4ƨ^.8d\/ Ho*%3S5yW 7H#>$Gwtm 8`6bG#'g# 49MbM26T pu.p){z`3yXfY<X?~ v ~C>b7y-IEƆ]ۣ ՁZyPAVUȒ.AsHgzg_# i_ Wg[@edߟS>:5_v_%= B. P(.QV('ڙqj{xfׄ(K8=ԉD6]S9-ݲg ,=./(I DQ#oꚿe)GtO 3Pa|)&\>+0_l'uV+~+˛WQݚ.cP= = m\JKhȏÙM1'&eu~uZᙉfIaOJH 雐dщ&8jp%#t%&@_T(Q(I[S.|ݔ;UUD/kH':+=5%yQkj'z5~ Q|Boߊ82"{s-);]DMEQ o21͎y. ",B& ˩n޸I8ں ‹ԧ~tĉZҟOG,uhge;=m:{o/&_AJؙ2L[7#[mKsO &쑑Q@ MbGƟH.!\ )8 \s|v||z^7s6̼朌93!hIUU|m޽Z7p,J_:kxeݽ)LuI۝s׾֕U234B$6P%lް/Q8D0H*gХFؠk{=U{F-@#h3^軩=҈6H!hBN~#Y?Wė،qBl3'2yglO$ b#0>s!{sJ穏XZ}ƚꮮn! б(Z)6uoD{8.(H}@˕5Xcuo/Z1=D) }P{Z:Կ7 Of(#a0zpk]|:?n-:BQ_O)$awqqѨ;4̃6VVMT$(kp`ڒ$2Lc?^_8) \QEuG-xF}Eݛ *ZԯxgVɏ3|6lMqѠg0y-TP{G6h"J`<zs (=e`VLUҼn˔4L D=Tk$/(13(`hV:!ݓÀ*A8n,MOá-NJa #Cql^;B ۻ}Jie]t$]<32]=nE'`/VwYi&2cZC\ǹ [{yd_UpBN, wh4l _$ȄP#ڠjK6uEC  Z6S1Uj̋MzAE])EWr@XpZ6 nwv@01pTJh)̅O }igЌ;q4qru ٝMՇJax#:HOٟ2(iHeg TȕKg)dcJ3Cw+ԇa?YAJ^LQ+$\{JympԖ%1r { O^x֐Vɔa8Ldɂ:J貗k|eԶOj2%L'd@)kZ)CWcB Zko3FB5 Fzz.]::og/_C-X|TpJWA4r {mPGC^.cdf/~:JYeL\uۊ)Py WfHȓ|GaLM^hEl0De7uH@_G:p"gc m"as8F!6 %-3UKgMXo4p))!T@/锬Zt$0t~UoT4#e1Yyε-ڧe$qs-]yMz]5lJz-5ɂqvN7ۀ ʛ$_fM@<r#Y[̽nHǥMi1MEi o7*\NcrDB+)8BJ JD`yP$#T{e{J8K)Xf4DR(6GJQ8ݍ&򻬑ÒR']!=1'Ek+&ABuіf<,Yg嵫geClFPP, nhT#总4U]QOrf?qQ;9 ܃׌Kr͢KX{IЈ$XI)f&b δ"K_s)瘶 h$)M4Xfjc)bJdakR`p@V!Cn !mz~j JIfg aAupu@xwBݠ E!,:>=*bAWPYڈ* }F_+~ RmJ&AaN5c0#hEEɼ| g=jlO[T؟M-Cݴ蠨< #y`<*kgC a9;u82kcv]YQilP(`.yZ C]Ծ^jh׌l`3#8qL-XDA 5R(x& 20yգViQV֦OwϦHq줌}ueyk Y0c37n7W1懶$"v7nfE)oC.*!$LV$ na%EXPJ (O TӰq$ 䔉tʃ%8QAst'M#_{$Db~*C`~c8L@Arʗc_lhR&:-BMQJK;pV2b"z@s AZy[rǓm!zj˅OTJ/ /osS0g͖2N8H5 'sAfvxUvXUV[̷Nnђ:wlƸ?5>8>u].;<Ú+z{䵈2)ao0^W0^;m ,i0kUG+f#Jy65ADjo߾ݜ_zH,$C@*;ss~jtV K_%cN; cB' gڻ&=ĉ}1uڅ.W*4);-ѐ8:u+/Iצ͇6q7zw4Bu5BC0 g\D3Bj$& L햂l|.x7IS,Ƌ-Nu]_LBl,wdmLʴ# lP%oƈX æܑ@ )f8'vkjPg])/J-`+ *=ZtTNN6P{N@ YCΡLN$]V֓Wy6KXy)tJYOew94 Vɓ\HD&'SHLɖA<Ȟ'Oe5_+x]j ٺfсJ>ӊZ`j*C.l`\Un6Hoq{($Mq([0l[04&&q<.~s[UďBY\["^#!gIVx.g%LNbET$a'Otx?[ h;ev~\Ľ%Y>éPٽ"x#cL du!y]<#G!fJڐ>@dcm<g(Tp-OAnX T {khQ&4_C YK|!XqBG3q bR.iLyGt E@XmL9 (ĥǏTcH{${ f2z Hehk*bhy@rj.HTYh+ zXAy%g܄M3W>y*+"(ZGh&uz1`1B|aZsc~ޫS:,0&ٚ`WH lF Í2P}_yw}An<dmο|28}B#Tfd] Lp_{+W8r6h.#8U|6`a}jmP#l 0+DK8fa7薯\]o>+ɬ/.1R9#qbPNOi1 Jlj%ðx%\sz@V 6㮪\L,WEoSI8֡WGj~k )V| #.=E G_-%^ʦleY XތN:.;dIUu\cf=ELHB%D,H⢸[NH#\()ha$ C(I*ǒ +Ԡ:X-O[\vKg<8g&b13`cp> 6 HiIgJ(A'­Tϱ"zCno)`߱#x"B:<B]p?0~QJ W;BخewKGGj8vb^ @ IZ !>I,5fF]zR'}Hz|OIZ ]2ȄhLM{e+5oC]Y#cSr)S7~x8!URj 8} ү inxm+Ywj5FkuoXٵߍ}6+E=u*q\^d:@cl) 9gQ`q8" I"ABJDU~(匒g؟!m@_yhb Cp#U<[ E~#Ss7YEaMVU{)3FU^ҁ&y(QMJAfg[ A MYDЀ*& l*#ٙFiKB.>s^R-Ju5ʎ]XXw3PDJM IɎ|wT#WN*ZѨ'..~wU[D&řM0#`wY2~WJ ôh qTV̵*} CN'U!2AK[hUvM4t%5D)Yo4jl1AjF0Y~{֔"7=fEU@6ʹ^ĥ/ *6{0_zx/Y7XpԎW" P ~iGZGG]'"bQGU+-?//[nN/7gmVcTXyZ٬ӥ_E`^r=QK'% (n>s.G:7زAMJuz$2Z8aie $AbMS%7fD4'I)]0zɾ-} :O4K-R3>|`@o ufe[< >%j0bZ>}IG_$҂C@!GTvF"IxNIРO&J>̆?I<%%fk࢛J#yӸis !b=$ ZQ"MIC(^l#A :0r*+"4801S^a%AYΔcT4)iSVg>{;5((H[Ab3Hm;+ߴ}6b_>o MtĘ6f$f/b yXτ4!_H7Dv9׵hYE/l>a`v@{c7+,w\q2kG\TpJH>BY@l/Wy_߳G+M{m6mq&΂-sQr,+#Wڄ.%|~+цGmLɂu8Ω^,zzR0gqqXг| NIPz5*HLQ1)6T$(|Ph@TQ HTtb0<&ʀTdv}"Oc"26>$!wNXWlQ;!%DJ8Bc} TC\Bk HO)5At>#SA)$>82{Ey7Khꕇϳc Z~nǘX)ֆ#pL F` v=ˠ\BG0 jH6 )Zn!I54>tZ2:#.ᘨ9 z!uC3^ֵ8D<?߈S0#b".B:9}QY`G=Vx_#;~߫Rŷs07oL ? 9 r=ݓa;5o981CZz?E:Q"AQ!H(f@auyK˅y{[g*ϧ5oL~ @6G0(60A+6F T$`AOGcm1Asڐk|O~{]F=}\K85e7n - IWS`lpI^-6˗cdpk ?$Ozm݌5͈ L\\u7$HrTpDjԝ`e?Ȃ[ 4JZWpn]/B!x+A*EݼA |!T?kؤǼ.#}?#+bL!˹!#S\Ɩpl:lU)%qkO;cZ! @2H8g- lg{ K`pG5 ?+Bw-`,Qbl2) 0yבo Ыhy!"uǽ H5x 3wv%->Ex~+H)Ƴ61g^z:lz./cp.Vowݛ|{Û;tuczVkO~b;|F©Y`g.g; =D;뵳#)[8 O;R0IOmE1ej>U$UvNYo/A-Q.B(Wg ݇zK29LWZx4n(A. =k޽WPb 0A XyֱVhw6$SH]ZӦ5vFuʍKz>OVCHKxrRn' HѢ1JP$46y'|IV.Xeb&?ŹbZTܐMK>[OSU]hO]@kN0Q ˋ,VaVڂSgMp" e=K cd,WI@ܬylc$CR@cV>ʵL;]nc  }@PA~MjfCnh}O -F\>)ʂn}Y : T`!p$pa~ԯ((#DOZ^rR2JPJtņnV񼿳 qSOb!eZni&)j>Xo?MQ$A,<XK@X-qBQpv`-C:$*RU)XQAQl~ΝŅoE[]*bcPIN!pi-}@zN;pt>J:].Xs>zd@\Z `;9 `J 2P2) JM{\ ==HZ> |71&~ <2V ٚG%5* E 7փ*W#ٳ?ԉa/2N|<-ޟ18x, c yᔔU^4&um|?D{eL+Nx:Qc[.Rߪ:^Zm ( p{4\o%~s"I4љ Vd[F"_y,D9~Ụg.+7f$Au,F٨7 m{HQAIjuEÞ"Z)qIB~EDA9\eVaJ*̳<ˇxקy!yGzͻΘJp댓C-x? ,pk"7`1#n*Z{7>e6LMMlck 3&[';[rIȢYD ,j1XeFM' K5.( 3Ɵv̎:گ{'b DvJ~\C]̌ j%[m>6>Oa @ a9, W<1#Rc0K;4ԙ83.pH['2uz1XUrEb`4eh2rlo]Tٗg/ HR}MU{yp6KSw0=S.jxe6FH1UuEمh| 2F3xW(ßXԐeVP Ԫ  ߚ/`VY5s{ۙfEd+(|,E۞XkXƂG}(/^^':-޺Klo*Xa3IpEB7qvft}<.wj[e\*+fb'@z̽OO) zur4,rѩsˢpl.:++X9+DꪭV!F貸BF.1TJp'˜Jכ֚GH6&K@ /T{z]ώ0q']p&-s%Ue118 v8D>qEGc9=j,9ݜ02 4Ӭc=BTRQNN3 aedȯ "J:}e0ga gA5ekͫ'kyĽ1yЌ;}sTy?bF)`pѤSr&|aL8yIOG,y i-&Hji.A ^8LƲ尢HLYLLJX%R qy7:q,j; IsaH(D d8A $Ԧfʖ 1F5l"d p0ϑ~/ 1|t13'A)JKWE͑"@ 4;uhUPA׌YsȗaU/tsbwXjɼ{<+3A$qK_JZ؊QdZ&BTapV6dXRĤ4ʨUgZa Jw:z`Y՗-bC +"%3-+ ΓB9)!r8i0W~`8 EZ^i`"v 5`?8 2сM=8лm)FNWi%% }wԁ5嫇XTH.zMϒ+;4a]ష (Al!v9j*2@0ir}f׭gN&`h0ՖgA}R/wfvz\؁Ĝ'vhDyũ&%B."W!xn٭ B%)i A~`=+m9b]a}Lb缋]g4?Wyz缭. wϭZ}ѹ0^Օ+εr-.[w?}Gg&FƂk[9Җ¯ RNٔ{fnxݣ)`z mh/zvB׽7۹_cto!_Zr҆$v<z,پjv{{'A߹q1Hd1 QaF.o{ q&|pc+;nviٛ$Z QۓvI+InEʹRgSx1V^}kH/fi*E}gV%:28;\kO=/QSK ba >QGqT.Thԭ42)=[ʄurt5 A6#>eCU4vmQrݳႨ|^#iZ{a߈\Pkw\&G4G^ #a<3AYU]ޝ+ŁPA0 訩( orʩ:^xˍPȀҬA3KdG%)^11'$9 orrlkzH~Y%=2M=zЪ7HIzu,kV$ja+Z¥#T:= TFv|)jUS+ՇG^7uTI/[u9 ?!_Y F%dXf:j!Z &AC ÛL *&bP,Vٯ G>w+aW+eSRڌ+ODJA{6ң9Ӳ5%gpHCNkH=kgϙ/{@eMg=)C)!.n1HVdq0¨z-]452!%$ xD< P29`Ur.z>긷M3M "H~Yyd;C)%|pN84p4#S;3TV[}Z&ÙX6*^U}YNjLo =>څM%(B\#Ɩ.\PeϘ~ m:.spuѱ+oLͅ{֙៭Rռ /gVc"-K-ow+pm$gg` ;a4,9z>58j\'01(W k$29A 37DKB+/T"*VoKr2ِY 4;%5f:q|ȔKBAy}g~R|ǯgLhbۍ=H -_K,6C0vC;ghQMTVJe>ƻ(̉|+'9rx7zQW6Wq@S"SEvRg*Q|*JstlIsv,WxUVĆ@s'8%\7`6If3'1 ;5 y AB|%&"kY`7]6Q.$OʹEM98k*(<8=J%Ûq%CgIDI {2{iZrn =rБCŐD+X)dYotEK֩>P0I%l;ꋯ%di5)L,͹y"e>Y= Ket@3zÀ/oYh ˉsōBrŃ9, ŦQɓ&𫉛Qn=GØ}vv'M -6[xSpᦇ.2%SpVkȩրdۅO ݌pZ9F>Ĝ6dW'.=셝?f@9g:`v&-[u@֢*ۊ u+_Q^| { 8, Aڵ!X'1+U4"7d>q!̼w,VkҦq& (H]΋J".;>gbE~"pzWܽ$2~G00'!&%Pgg[kÇ6 ѠCy3%hB-v R(U`>b/f< 0Q9D ` 4g1`{hA;]-l Is[.6◃>dcXu?V) i򔇟 n=d;()Ҽ$7"}Ez`ߏr)rY)ƅ*m$/Z===mut;G Y}}2mJ.~-Mxi˵m΁zR'{8.h]ޅg A`t̜ѿqy$p CI?dap68a[2 d# \a.2a4>pQjphׁ~FVY]& %/QeA: >~FN.]PU@,Eq*7Miy b Q<4o%hb \}z[XS6 JsX3H6!AHH4=O@V},T cjA {zapC`:n11N'm $A7TkYBt͗P<:ʥ<,"/qZOrH4n+>'vrc>9F8\c1,B`s%jiPY B'"V>k'xUJe7Y#gC5S̓$iP3n`[°p?7`PS Q9 n9訐8VCJO]ےG0 >B* R1? KT>UQt}v>[='h3#r| oH@p\fz6fmh=ر* /ˣ5q s t@ߵ~/Τ^+֡ߛ R#ˢϮS)L}7ˬ. S< "F1ۙd`%1Ufr VvhP0:8@FP @al/-8fM<tlJ* 0͂y'4`v3Y,u)l~4Ԣtb,P@ hL(v{ۿ_u Y$1Ŀ!Xm7 \jW[l qy4휼(_u%6wFF~PE4#}d?]c!%/ &+ǥvyb|I>~a|'N%x[HaŰSEk 3%x'>o d̉"p";Z}bbKeÎl.He\Ndy0 ѵAK"ɥs%F<;]G>o@F+j>|FB>L,:jL4UfDU.O 6#b03h{{b +!!e;Hܛشv'E|r5Kw^D .#کJF%wR=4H/ɟ>\{dcӈrŢ|姇|gֲ[o!9KoRO-s Lj#օ3ƌ'{}'$NYtD9컨,\:؆# 8>&a{]8t:E/ "M"M&%`CnT8 vh&a^B*LB9 ȈgzSeb:;!rN8Čg8V+,,_=xdCLGO|ϖ\ӧ?OPȑ 0f01F#S (r3 O}8)Jz8`V)A(OQ-āorEyx מxNP)Y". A Aؤ[rSɩQژ?aue'Mٛ( KϼE39J& Q5%<Ӥ-s}SA sa70@,|F&}m];KH$C:@gfNeI9",顬 q$ڣ$TD)Rj-W/u\yf;VaMz@&RyHflxdVca" Gv8`&T)@w@f[gJ41)v\):rő݂?Ko53U(pٌD}<qf;qGb,E)>pr#J^eymcz w ӄ<H)rT76gl_uhzZ"ԞA>ćVbp- q1K2χdmd2s@RmHY_;C$$˧E˶bD_=H4mjo:7QR!+Vm츠UM%TS+&q %0z:TglF*VkI3Wq!NФQg8Hl;h hLaTÒ?s@Â%ơv*[΋*?l Dvk̼Tܨ(]f,UfH bM/Tҗ:#2:B"y5?IzlKu/r=)\<)~oܭJ M VZf79㤳Q^Ô.) м"P/M` Dzu U(),ΏhX? *CzȵV6t#A!ޤE%N&G;ģݡgȓCr` d-G ط$`FAVmҟ3ӌEX1م#/*+ {NUaWCgH{9Y`]^8Ͱ]NA7{c'YEVvxDrAy\؟Q=L1%/QbIWFA]MJ.ET~I)ʔSEx涟h@3*GSr;W4) DRjw1%فkЗP j]dS0'XWKZfger\0껴 Grز1 (AiI1*?56#|+ ќO歰OZŏ[KtmY2ޱIYǡ=~D7oJfLv)ƝR2ֱºwFsvJ:VxYDIQknM f?Vj* $LnӔ]k3ZQ&/3W\wK*hѦt>>nNa>D42=_\{}PZ^Ϳg߼ݥz{OGސ]ZA@bР0ļTҦ<Pn-h$/ڒAU׽9ES Ƿ5  5N:^X8hǧZ3~d ֵH/l> v sJL&͢1Y6K}(mKF$EԻ!!5n v`1nFNs$əU/)KY,:cj#RTˣ )zj%GlSP:iSDAJ*>*^pOfB Y$NDPfqrdZ2I~5K/cՕc3O lPau>)&#H@|@JR[le/f KJBPAg*Y7!ЭVi !&j * D34CNp'GSG0>bwĘ BCzKh,/ G!`[yÁؠ~5ΰag .cܒ@z6ЙoAbb Y4+nV\ߋD,hg6hs3S%O@~x}8U`Į YX4?}$! &rLr| PԉF?$̼7 (MZ ui'J+<$&JDJԶ8UHe+JKr]4sv2k1+{H] Hv wT`TX]bInON.*Tl :0q- "qB#J39fqhBrZK#UIrexrܠ0}=sVwXP .b;#!Qڅ'BL!<Ͱ JZv߁V;@SX"!n'HRuCcQNl.I/2zG_."fP!sXǺOYDNm]8 tQ38z *E9$}ſMLxE0M!d"b@RXi+x WUi+qeZ:,5h%DDɆEpՌ  E{TPq1 /}JjS# %>4|@EUFkX,eT9dq& a 1"MfN +FN(֜0% =,P?CHЖy8( >Ka!).f%5 6ѣe[ $_#=]"A`#n+Mmف\d DKB> wx$}E%rz(a2bjJN4(&IDojm.a}tRSBςEBX 6"YR:A* ":>Jh{j2r , J[lrHZ[7\GpfCaSwm$Hacܢ//F ЅW$DIJ \Jɨ@^"f|krluS#/GWH+,Ӟ.n`\U.CD8'2OrGJc.cISUn6߸ԥ䱿r/LMPdۇklCQ%HcpU^d=;Uf*0 w`# 8w"`xʔ1dXUalalTq/L;( Tt*7#S&M$`Čz2WP=P؄"==8*\q^$.O8;/7c8O(T辠.?Y#,|CğK,@-( GEpc[pu*zq?Gސl{Ah;d~78K=03YC# 5KLA)O٫κ)f<1n!;A i@Жkt+2K"/ل!w-P5YW,5/WHv!ts-$DR 9-ҳp* yuRe0ٙ,ލVxk"b aH<z=I׆@U|4@1C泗ܐ 1|{d m˫nb 3, d;$#4{>CҪ7vdYc8L=%eH+OٌMׅQ"^PG94~0SZMY3Mޕd3'=dZ\35$0Sf RtvH+ϊb >]Q'`XM[SD~u+ .$eOXc )Yǒys,l8쁿DvRe_8~ Đ$,S>.q0aD`𛵔sJ( ҈0OJs~#2A%)T"fӑ[, vlg ڈӲ;6#1`sb|s1JfFpD PVD2E AmlqW |\ qaxl~e)<1gnN$"XoÊ  u SkS{EIX)HuB:DZ'g:\$iC$CPCY}{ biHlQd=,b,%Zkj~IeS IeG g`ɂ"+V=Ƹq5*xݲ[:Oz.2h1llC\#harh]zhAG7jZ6lֵF(8Un;T#4  0C Q@"5c]HjLp\yT/v6ĂΣH:%:uiS]`D)!dԿo+ΡJC|]xG4A5 3`5'HB2snb%ML (ޗ #MUUR\є)1<ɞ!0ykԟ~VS] Z'ud[""Ёܴ;UGCsJ,`lvnfעz۝"wannsn9-R꩞}ݐx#\;Q>!U?s:E-wچ[FSt&",]ݶ뽋$Z\u$Zp H6%SgONZ!i P>ã)UIЄ%dmhd&}0,ڌt1 u 7+i/|dQdh/.AK Գh.nYX$V-ߢD>;O}be??ytn8ں ˸ܫ15rdMja9DK$0=1Ǭx㎏氊։:dNQDTn26bKPčeiK14WMjbf@uraMO|(?H61TFC;)y{e;\ڻxƽb^޵AWڳMCrm0_^֥L[lJ^tK>!`;s$0!?q!>8L>Fjru`OOBȌݺKgk 0BMZTM`cE!ǃ[{0gϷlW/v.қx!;5мf* -_n̝K{";r5lWm;R12~;kdgǏZ7028U`*3#U y>,[ KNIuoB[*w4˕PJy)N1FQq+o[I0:ti0$vp$dK#LLP-vClfo\F׌9 ͮ "SU}A:ܠAu3NgSdFr` ܩkާehn/\Uc|˟SrQ+n"E [ x6oRA_%Pq%^܄0U agmpU}%!z#k!D@k]Ix_*[_*!vC>H:Gp5bPsۭBjs9_j\ŽuSQÕj(W6[XX3fcjQr%?pEeW7S?Dᑾ(ީk!.m]YPlZܜhm+r߯L!SZ>h\bO`".&2}JPlXR'1L dsB*l?@t2|JZsU%=Z%NhYJaM* Tr>U2OS 4 ѣ1M3L.&LET,uV)7HA 9o(EJ])u?ɌNt@ *?I,})U($EbTJlJD֣k5)bGbGNO; x|Z0,FŠ48#)d:cMBiX.F$Ƀ2D,nbo||%҃hנjElK]LC%H|SEunK!1Ƅ>%Ds]u-,RcTs)VՆ^򟓜~E9Cpcipݶ>آM\rF\E|bq)ƛ\63dFm./eK]r#Yy+--#[pB??$1 .s\,;>M,!..>Oş"Nc3QN#tZ4 a| A_1D_-_-pkE/ѪdJel%-<5P?GWq&y7S$ِabh|e\|>bv'[I&2 WOjax d !3j4 Q:r 'S<&InazѫB_R?a5gF8pN }6pT|CB_9IMF/lSa1ns #-\1hT'4\"3#3KL5\ 1H3_i4!/vK''F,Oc./RkrKf}%j}=_'W^.}%I8'É|qKCWv4Eޖlt(te4\eĥM. Q>>BϿe~̉KrMSm#L-8Т/gB)n99L~rv|&b4KZ"l]%hkԙ[$]|t fN wji2b-|<ĮogI}L%:#hȘ\?rȣMwΔ/7m}iK/%M[FM["/֛(oPbJ\1;CDX%UD֌YNK Jcm-%yP3A].b<0p)&E%!ݠ5ZAX;_OoO>0zG#,!e-~ )VN.g뉑Bg*5GޖU!~sGe'uo=\̹\`)6O;GH ҍ 7 vkIy9+e4`& ^hJyEJn5Bx?G`3PzV3*3G\ɄLփn;MI:nlbyvNp!,!/ſô7 on}q%㋱⋱ U1c\ .rwrq:RCZpMJƱp%,|˵Oo=RLA6\IkX_ p55o~k ,Lx9`Ck^f_Cq&X PZ+C1@|q \OUf=lMROb@\3*uB7c7KFBhmGZlX\O*{~\/i*bo =%S8i)?l`Q7m"~gO > #P[k%9}/";GnV겸b!>ܝZ aj:kGn>yŽ$!YH M8 k)-'@ "~@ڧٙ~{_k88FhQ0fbUՍ6p_Fԣ kW0g&+mg{>!vު`\U'ği6W#=kӰG_׀LQF17oSq^%s*W(ᥐW[w{ۿ2ESwB0OI ,HC6Nzv%ȣcZoBuȭ8j&Ҋ3~j.lKytǙm3>(~kMqѰux2mx=z'G?{oq~U,CHAI3FT$tX=9v (zs ϕ߿W^(3&Vz?LONşBCQ4NVLмoPt:iD}-nvhv; O>/2MBt6?Nl^vw ?d`7AFo,zp|C 0I 3 0HFAz F!4FPhؗG F#"2FJ!+DCdQ;k=[M?V=m(|u8`?+6Yٶx@YwP2Rɠ~/WiXoӸt].snPIךpOJ 'G}6@qn~g hvD׉ȶ6% w+o%Wտ52P Iwv[d=[G"hl#M&egr ''Pv@cSGc-Ob3}}&XN|,x4q^ԫХ%d7qpb{QvCt1`r%ԫ|38V;Ţ+ޘO4#V' 9=t 650K&8p :>8,Ͽ7w*T}[m A8<b#FAڶA}}$a`iզcU୯&O |#Ѕި?YSx)!FtDފ-BU~EO2^}=\V!6J a4[滽p/ķw]fvLu[PwV $=(nf(۔׶Rv8 '%%F`37tAi`3ClP!Q1!T!8ؤ4MXfa|X2s'lShen`)pȹhz܊ՃN1Fdm{]}Ww߫WnA9XgLEr0:v}fu$^x耭+ t6[P13^;lX |uʥ $[ 1Lqx5os6}^oKm$14&a'l1&ip2R({{>ew6<"Ŕݺ3mM=o쉔ƈ^ӴR, kIn՟JQ-L|װf(غg0@8N`KG\[u0ߩUfQ!ڐy"dx).0ȿOfuvI^<704!5`\q^_*Āݝ;\lS)?@8Z'} b`;X`<JȎ@/- 3ٻ8-=3"`vɜפ 磻&TMI>闍?s[iWѐ b]ƥcy4a&:3pI@m~==iBwJgSvS_|x7} [yӋzऽ/Y?ȯݳQ%j糧OVuXdw #bh> N֗ 7\#g&]|x>ӉΆ= bk1+^N}-4޺ 'zA8VWL8,5lOxR}6BOCǮ·߾||ony2XO@6ݙ<.Wem{ AbRNt'Gi_l*O0:fTy.vhtc#{>nF_thuy`9NN4L/ulf/&E&C֫۷n*x`K鹁ʑt~ʬd9PC"{{G~PRZI~3n0AvA//Yo;jPjLKG]۸Scm+}~<9񟓉dQaO'uðm@!;>J 4Ch1u.MmI_6iqjН=9"SL זqgqw1%XXWs<:h2+K_}}5@Bq!tD<+p[y׉՛'qt8eJ vg,55} 6 +SLJ02W`6+h*Ljq|VƌUd T6Se}Ȁbzi#Hۡ67?CŸ.LLQ.I*ʹ~njAg.֗uNlx LOou<=8A5J_F鐌 dgrQhP4fIcJe1z13;p"Upub1uv^z# ̉qq FÄW"\)VҺI8L,/c iF(5]dI|;A^b;r3gi `VhXjtCC(vQD$׋$ULqdt5PdV CK4`]dmhʫ~gN xm'h؜\"%8|iɣ|pSq0vUS\ T/éq!HNWZSa7*س0ҷB Ơ9qCޥt X %Ԕ= 0 Jh?'O105TMh[B[QpgsTۋCJ\.$usr0yԣl%㎗}'] N6]9A"kvoϞKۧl/F3UC/_+C9+>H/,eINWZ~7t۷~}vFQ!bD nZjaAM<?)}S'ݺS5q~~='P< wװLƘ9)8~pp;ݣ'5徭Y6m$atLfF\ĠTF'n£&5ě:dn7_oN=iMrafmջDy,T?%<Z޸"ȯ%/m_ ǵ^aQo-/\0,' :5LXy!q Ml /WËV~iVe_'YF2IvyL;9h\#!SZjOkgNP`O榍CkT3sִ6s%xp e+Dw'Eh)L?E_X m?!));;>Ea$N6J#45m)mR4_c{YN ?g:i6G¥x2w:(ޠcGv+ ɏC2_{l n?~/3Feu26OѓD#mlvqT'D?F224J-ͽ)I\5PPpO\r,(엝7xSżBCݍ8%+>V3/[̇^`@.N:>>gç ¬슫ݱG=,ot#vFqqo#MgYt IR+N a5"g KxmnTb{XzE[~իAOJ6f1;FʣckBY/Uz%Y:]ޑA6s~ÎxE錍+A_ӿ'T:f'ŴK* q@y؝]9$m_d :06 smkېe5V-k5ώٮSV h!ǙssX*D\bx2쪒*o`U/¯3OZQF Jk#+?_ Wh_b|iJ=َB+vSQQkVJ^lhOs6=JFT"Nvm^VKjRu`4z>p>wzѪcY&%fs3v6WnjTifWl:҈dKxFjb]'{T"]y|e~s&KڇQX=)A^]S*30^- LuOKtuXi!oΪMtng%B[z;$/K$pP 5U`'+Q#~XпARF ;zo%oN|/(ߋH[鶈zDKtv6vꮌgv z8`bXccfd}^|ŷ}bQ{.Ò(QkQx8,ҩmz;Wnh𕍕8W4CfYг4g/aD}9z2d$/afJ))4[X%Fj6_IgU@ǂɼp5[;atKPD*lHhc6" )wɊc${LYTE`@Leȷ`ΐ`.O6ξ`s'tenrbx]{gucq&m,Xu>܂9/k 1IKx1DzA >6ڭ۳=/~5gc׊o|gA }muunGqm̟RdHFNZ!m83wRfjJOR>"N/|2.zM˜PK:,$~UJkKG`GG[OHH.8`gG?^ǫq@=o w\ɡɉ]i#R)l-^Xd/XȐvc4yBT2YE6*!ӼUo|҇s᳾'cwFEU^lI!e3㖌 /5 ݷS|gF3RzUG9fnq$<1ත x jh%MG.e(2Q9LARwJocw|wފiXHA?'W K, ֒ y^}6;yrk[ۓF`9 yd( ?)&ݎ]Y""z'wa L6/`"-&R*|btt7'}<M'& j&TQ,ԡo/5°Aν, #BuƟ]|}LJkcZr$$b\ym7o SO;h96VZm=&0[Vh*H7]0&+kcR>i_tׯ PeZ[R f!Paɸ&4?B T _R 6nl+A)6A)OMa(gELW5H+{#',EDIB<a@0}nE7NbH,d12?! S^0*S@{ 9hZ ,k}!2%vttHUµj+#?\QΩ% -J{b_kxe N]^Л]d+7MMG`+-19[E_8 ^Iq@c*Ff`QE:d,4v0E2MX{U[d9;%>g(YΝHhSqRI|~q"ZGo "?uO1`Xs#y7' y YS,}@=>5R.T1c9{ ZF8lP.y,l1 {wG1e^] *y×:yܹstow!TM[=PƖΡ<< ^*B^dv= 4R*Q'3{'4ǿA'ykңF;$C+'BJ5b=&3e&7N$,zfZCsWwC :wS72)0 q%o8ۑXv"S֮]:8UV9k!y>J7sF]L>mOy메b7$PE纛ҙPU^F'Ӕׯ~gU?0t;\l"DR5϶CS}2L*Ic u2v{C2DWH5-9 ^&.Rd:Ε7:_dKo@թUmnd҅WIn\R^YΗh>rMgl;Gi]+~p9~W" SG':ybdXhKB#I/1mD4G~Z$+=)h>;_]+D`4]3;X.&$58V ՐPN gRucVatO\_&}M=p[ض`R Z;vJqڗg Xѐ$NF`nqY9r%"59&!9(2ax,^vfdz7 <~T&=LjąwtlDnN1rFsw.ϛSqApLE@$\@9\[pO Te 2]7+a{eM,ҷ aM|T'eZ Z&)H!1t:bV4rB>.F~R<½A>܈$zb奏K|BͳeI0>VEt+\VXPڭyNkZ4]3rZϵ'VyJjtGy}=羓KP&ƒJ$s!FN)T($L(%ɁT8t>TRwC$I+9v @g ,nM'C}9BƆOžx }ѻѻY4<͕ %/TC{|/(vjP}aUP2Ê =iw0MxT^u}s哕{8&`!1&ӓ{)b9W*'=fY_D,ONLn(y9DcaFJd@8~X@ ҟT Ln-bs`(XP(cS"jlfR?/@x0lAߙ eFB| ;]ӢT3EQK\q0l1mro̖f= 5)TuRM yZo¹PDQq-9Z$(_ *~~ /v-B\1QJ,:[M|&YJFϚE۩ȝݸ} k[EQ)h7.an2O:ȶգtf;.y`01%KFcJ Y,陛 "<RQVE tk G Y\H=<+),q#!?DgAJZ+DJR%[* V I\-R&<<6bs3 ڰnjpbmm^*|"1,%>4_O$hǤ cW#OWw#'i.N#vRrB9 vX*^c3lbc,9f)TW *`P#2:+MWH)C3}FZK l Lkšl絮]*P/NI_V<$4 gb 5 7;`e nnL0vTJjsVoy[֓V5XW`{ʖ=ԥL)7=nlw駭䠩v.ruꯑJ׭H6j\apG# :yj\_%(i$=J^ 2;<n0g;+# nePnsbڀ:-&y}u$mQܰ([7$p%*Ĥ5׼DږY*hmP{ؔY Oe2XڡيYR\իMYT/ﶏc%е@L2)&ZL\iZ8Ni´|^Ё-cZdgWOA3d&䏕GlӊAIN{v-Ԟ:{[lZ5 R'u'Dž3*3 1ܢ?I\#҃tu'=K l'_QQw%RD H5 Mi, /j+|{ ?lK9ݺP,CPlT!p˓24UH%d}Յ{Z1_JӉQa궖'XBv`j(71{FE8. JTYEzc"H7 y'2zo7lNN\;k"&VS32c@? ojotZn]C&ͪA4yZU1]2scMRDXsI}WHQ.J4wLA^.+  oRݺZ~WM5|"E[?uZi-mK*q~ `䨘s{rC`*0Xn,t*(8Ǒ*ZTi"|˹8Q 7 OGTM˸u_вr:Ȝ@Pb4 >M!YemfNcQXjL\z!aW39pk(xhV~ !4̧b uksQX]Բ8|\u^.oԏ!9 jmv1Qs܇AQPo"b(I1Y4_QI NηFimm ֜~˝zڑ&YZ">[Y);N^\PTnwA<ӺWG 1Aq~..]]!:My#zY4 ![y *CE&Z*m2 &$y&]ĝ#K}%Eg]͘,!XYs( *nq"yU6FA}֠4՟dlz٥ Ȍ[Ɠ%|?RWm2t6H`-+^ֳgQqZ$MWAHBs/YHT0Nu;\k뱮(3g;+==^EF` 7j%e>#6n*ӽ&uFPѣ;T@bO92N*CA$ɗ`(Rrh󝫇ڊDN("UAx* gˀ4j C8pk< İ 9{sEBy͂"HGX E b5 I! Q`Ãp6/̬4\>A-Xu~uE"w5i%PC>FyP_Xw8Lj =A.)f0I#Ẽ|8X,@[4CL u=2lE_’SbC+JB2Ag!ž\a GةqgM<2TR"6g-4)l*Z&'AƉ܋uߏ/-Bb3#3]弐!.ofsV+t~b F~:LF.b]JWoBi%BW=.0 '=kYf-\FD阉QVpjXq]/+MVͿ5w֦L3w6Roq7*6;^6Xh~"M%¼򺏘ad?^ n??{ 4qp1{YY:Q4f3|e Q;ˮ"*jlfdlݘDܒú! pʙC.;;.IZj)ˊqpW^ = Cd̩ڑ1Za3KiGwqg@lPc:jdlވ}‰aWqWoYk7)%Im]5skgsB%өEG%)_B# "Z9*v2~r,3A}B=e3s G6'PCG)~.EyᅆE@9k$##d$Jz CR{?}"\1WHb!(xew:L)H2+YDZ(@ƛ^sΘFKҗȋ{s\2h}>n|oV=ExYxZPu? kQGhans{[7[_[ϳY n t7K cZ^) y@O>]\cbI%s}tP'|,5uD,8O!a/9C-z4uL/cslɮv?nqЖuUwGǠfMpxi ǰhggXq>0IUd@Af%l4HXc7WVj-'T?jI+FJ" W"T#b5|wG WX"us 9wLEEMb8 ïٛ|Wvy Ib{ZP ؝ח95 q" QYw^(ƿB^E2{(ffܒdY 8bWSH'g׵oصtrhqDi>1vX m;9cGN3s++Yh#=^{ -B\azWq u7aB+vVuOK%.17s-.W0dn'MHL)7g0%_Al=2zGA΍&ah2&2AZi&m59}wvvG(x1<ƞPK  Z+\Eoz/$n B}CDd_a-M BX|5V&D-cskx[Ce5рv)6I#mFV*B`n0ԗTкWO-u"U!~<AxˎxctFY+fhLe-XVVKJ=%16f9'Ga4BҜ{{i݉bx:ӱ_aVgބۆQF;֣X{a'fF23c1 [heh^ hZh}41SvLҢXkaԲh26(YD')LZj5{kHC!҇WY{Xvo }-K A iJ5 MƖ!{x]BY$FHݔz?A9=^=^0C|4$a˒DC(@qLd/JC_v gm9減N1Jo#y 0])/џ[b bs.o,YgO咍K GϞPz1\yՏ~=Z 28?e%v#\~Lq7*(>=Gq?o,7_>}'tnekEVY|`ooa!br @A#Qu,bh%9^]C'QOi'M Y;~^-7YթcN>ѡ*)bVoը{Rc@D4&S}Zfz*!FE8;4t^fP5vZj@C4 !3u,vyԛYV7ۛtP[G5$JTOd#0DjCDLJ3>No$N8 zj؈eĿsxĴT} u3(\⣽) u 0T#m t@&q,P Bb*c^*/PA=/S97D]rW,\2nm-D?`a~{9q>Ўt=vsXrOmRz<^Ub0bR^dR tf%Ǹc x32P*Utgy<I_SSQ^~ 4lw iLo5TxZnu.E"KDDE̬5 b(/-?BXN.=,~hr["h@3E6zk=[پ59Ԫ7m>;lFסCJm1Lid)h$4NB7@M#m xtœ&vYUYRa=co{VI\Xgln>SB~aAp NAgtD&Dsқ2A aOk$M(۫:T3a {穬0DY&ӮQOG"l+ |V̘lf-b-ž@ktQH\wϫwnY+ѭ/ #;I Ƈo*eeَ_Ljk[$4\v gM˻If yqE֙'֜;@&%`rSEiٞ>=H-M" ˉ|}K|ɖFj2@o1ߍvB'IӠYx kmzZn!BFQjVw [QkPȮ\ڳ)jTH[>@1y&EhQvϻpe$M$}NfmUU=f@L;odXy6ϧkՐؘg$oEU9S /55 Q[LK 7v棳@n}km`*Ƨ !=k9?_mKw5p`[Q=6)t"gEu]a-|ހӅ K#?PX **KRWܫ(fjAC)Z%@-I/@bDIMiuVRI N7 `.$+p2M"¼H--]`*"jSX]pX 8.H/fUR50%@Y-Zˬ3nq@^M) r|:BQ $l9oA[ff؞`Yn2,!nY}.&png2GIZHUz@)_Εwb W7ܿ/.‚KpONZh)b~+7 tI՜H&yuVoJ ,TnQg抖QՈ]+rn3Lt2Y`458wc&eI{b~1ju>⹛Ŏm/|;^,hڄI_+iE!u8W[ ɉ]DV"Hc4Y9L4F'?[M(/zSposAԄP@#^P#{Ão<|goצfﺘI} us̓B#?a)ڤcmeʮ 'H9_a!k2}$ &UҮhD6 mVgjw "?Ii &kYzgZ1vU"jC ӼJ}IkzJuF^ӈ['WԹ\uA?BK,@) 5Dc:۰4EKvob 9MU>2G/ևo [ppv~4;t!i8:ɁR#_)ʨ7nràfgҡ&d * <;orԪm/M{dտ"`sRh49nd?A0[@N Xu>g!J(/q{nmL]3gV.EKr&hM< JE1cYRߔє OI%OG/Q2+&0mFRvT53&Lx|i^弯Ad+&.k L0H'< ۜ%{W=ZfD=Cx4ډ:p3JQ_xp23F#<62$SQEdE3%k"k1IU\BkdrwŌVJ Eyǿ+̜2ݪOtڶAq ז8(ipF6aQ70ݝ5z Gq#/'¢0uM"VmXv;dGle% 0ZZѐBT#/Ji@Z8r9$𹾭cO}KƝyS+֍>Mbg.-:υIaZ#5X25_ؑ&srR.B ZbDwl{TB9+WJ2AY~UQf= RjzX ZS5{# ;~77Ҕ0PEJo:-J:O̺'_e0}|AS F`rDiPwV nMLz+/UvTBUNjc:{IoDiȶ_"hLqp%7m.I>'A9(r-EPv:sO=8;c‰ F"J(H~h)9^׿LTt(gV:rdE pp8&5QٮփkL+sko$@E$vj XG5wZt~`#rAI`9`Ch|Ue>4>"պɐ^\jH9{#u]5ѻ!s&F:1٣_ Om-֔hh"Bc3t8IeI3vGq0L vbڰN1'2c#6CUˊ-ҽv79w/kI-,*-Xy(0%7kN^#ɸ#E Ĭ9U鴌+ER*Wm7D"]F6M#W54ȨC?N1v$Zu@'֓-FRKtuC3ܪ>v5mgSL 0dØdh~ZMɺ·>5-==IV/o"} Վ-꼁Ag28@\E | ⰾދxgE.o\ C.r,PX&a(E=_nO|{2I'Eـ^F-껟 p݉+3O}mYEx \X0ןW `ߎ\Ȕ3ԍ2A4}ߴWwO=8UAxVv t񋄽|&fEsFdR&+ L2ѽ-``x)X 6Y;#^-o(JM,F}*z-+ z*?ءECɒ4 ~ ̼j h#ʪ.o$>%H_f˹@$FYbVUB\%Ie6K"ZLOa54V'8=_ o;J wge Fe1(yV{ǪSZE40ߵxPb77~?7nܨBV71)Yq!;t{93k3%r}r'#8.O|Tt'k kJzk)'_]nHi]ݶro.E f"7Y$?AKlE2Ȥ$;B#k Se22_R :SJՒA3YZhon4hbdŢy╚וrkQ9 yaޭoU$q]KX(E۠hi,'T6/aÁ2G萅Ÿ+1{Kn}j،yse$Qm[4&!igߥE!:9]z}yvYکW_I| ^'w>(=RTg~MCdJW80B8jAi cTs8|N?rdeҽ;q70csI1H7Qj{,#-31U$yirǔ+GWTF)' ӳqSMpդV.l&gTaA*fFdf{čcUzpJv+IgP\.<0``y B r.aQt>~3UiL)ĺbGw޼ehXiVHlzXyj = JA`Y&J૱-U,$F Z=P`1"=*ڀHk;]U)Ŝ~_C(<L<.cYhI30|[CK]o%6TPM{^&#T%8Fvb+_:?K .r^@`Oaàvv#afر.p:7F}k S0`GV*xoBT\V@ōO "~vwubvp=D}e4n.$ J4 9ҨX"v}ڭ(Ӕw Ӣlh̩qg2Ҷgō۷NNOsb.X}j= :VU*`Fb:I][;ߺYn]ٽ/'7+Mڦg}YN{$^lrS lkChAn'|߱&BErׂdJXzFqtuv}-uw񙂗Vu̔E\9+Ot=$e(~xle[c@~p򇑇UO;Gۨ+,έb </hmYsg3`"˱]c>@^kA &*'^mo==E"?/iu? 9: }#$ޡT%Q b:~`Kގ}ec.Xf'Y}D%g"N|^ю0QF$!sd?Q91hll 8:PJ*br’r㉛_|TvCh^ml.x}DڅjljC]>3pek@vEj~ ;зSxdv M%wQc_F6)W!+SW^9sHǽ.~1QgvwRZAǯ^P2MxRR#kԢj@,PF[^bx؍h f^x]4H+'AynX]1D7')^d0)w&_0^55.u<^A;q\ q4:;V CGwvgi= 9sBZ[K}$cnAֽĐC]$y9:eY"utқG{&ݚa~H:L M\\YtwD&?kRWt{:=J8 wuXm?'mI†Y. pdtj4󖭓w]n+.׆f-=8W0o˷/4oŏF&I鹄Zy/Ì~vNաM2;c-5}Hm_*"EKzYdr؊cSJs0l\ՙ~Yg1-!A 7987}xU%`G+압8N0iMl WNtK[2捓ף-?Zƽimʬ<:+N|> ;//ekb:i^Ycjc (Cg'hKQ5_^OVq[R(E 16?cwV_hA!I&<3ΉAA9:Ő֮/dxulY*%ĕ")R X$Ȯ[³lGEhtGz ,w*Kӫq_U+M`ڝ qΪ<.ҹ3/c /"aW_e~ZŃ7(NJٱ ]yf-O;+TMA.r-`0yx}L}%obaJr}}B(-C6+>G=j!+YG? DQ<.}V= V&eDz vi9LeqiGX/[ Qu*2Kte^>?&Ru1a\gzۼCH<[ݹu?-ІUw+`8l}gOʓ[@);Ǧs3Z˛otK.'7 %П:Pr:ppOyHF2ώCe<ڹva-Ê3'Kݸ׉~~ۨq c>ىZKW%.u!jNZX}vq|9b:/S$1a)yIZ[[,\[V?9;YJX`օt]d }׮NRJf>hn /ΈM*":z3b>T^;t4n NL?b}RT*iy:ѨdٰgHeo,k;Ok! \pv0ks!xn2=il(ݿvG`Q$bj0-zYv$c1harz2 (.G ˚x$ V_f X

    z38pǯ~n ghJle9h.hCj jϷȜ{hL8Ee`w=*%Zΐ"*%9,djqVwW_~_} _hK ZKJA;)bB+5mN?$g);<2,L٢^1V0 Q2zRw'7u'bȿ7R^j.r&;_!.EC,r'e0L@vvKuƎ;u owgBƉn>1%`3ۗsٽ ࡋ|vy?~Oj&+K721w% #]/ 19gIlp›m,;&K3L}ab~A]>J>2m|:myZ0[pĝ:UCXUPVG6όKMg*iHD DZ҂F$|'\5+LD#yN`ͲdL+9]^3ԧ- "GHm>=ѲWԭ{z2gb,Ȁ^ ?u1HfnsTޭ0+0 J)}RsXAPz26{`}7햴#as!s#4~:Yj,1vŀ齄ׯ7Œ4 x2g|*)|܇7{yUof'W~DcN-, bBB[BbttKL"VEsβ<,Eʊr1E#\чEqT 2H^šwɦנ$< ?>1FWX)Vv/f4YS dHvV#iFk=&oYL`kҌv i~olƽZNwRp {yV .C߼^"O}t90^.jMy !M}ZVD,yD*\!O3K\On ՝lFzL4^bqՏkIG < I&Iy6\Hs/Y;ǥ34V(iZm~9~{{EW>h0|_UB+77:mÒ{sH5WQCk)DX < {άQ<k&K w$2nـ) <&8<-,1[WEɘ'Gi:W9:vHJ#DcpBC9]rhʒ?(&)* \0t_ ̬%׻V::CS-ᰦĮun*)#2Y:6.>qͭRȪ}m8$׫);5QJ'k|zZjC:<:4$ ڍBv\jʾPH:D =)w,TrVo94o뮑|'Z\6ucq{Jɶ] r!Vĭ?PF>IIba2a_ihG֣Ϟe>o>{v}<3}`}1.{SmcF&* h"1-#$IDfo|ɟ-  >賽Dc"3PHLxQ-'n%/"AgGM8P?Cn]Z%ծT#̋NG!T#3g2#o`HLuoL4bӹzgYG۰ݻ_EL=P+Ӧ8\b#ⱔ5I(!hM|%E nZw/E߭#_& PP؂.Y0D!hZY "w*'캰#Ę!;v[,R^l2(OKVJ e(&e(h3O2D7;:Y3{ߩΆǺb^ wʝ7G͟3<V6{K%kH ;gs]v=5\ .p0pkmDW #p'`ZoRX1w!;. Jf:[4ΏVm)R;ѥBBYlrW>t%GLGߩt7IHƓe;*̣ VI_ݻΚk%Ry@iˋWlKi8SH0t!&#KكYtF)-*>"d|7?QT| {P`Rc/=39@,DUbdY1m#J[? %CY<V^I~J^i= [Eg7k}ˬ4_ƝNg֫g#Ng?N9I!ə{P_!._=<U}!¥opS7Ik%l+i:H&pxh:iY Cs9^~:#pK?a&{VgcaeW_Ⅼ#Kըm`1\8NJL.g K]n{SUa'^r2퍰#^S/죬G{= h$3sHQԋw=<LԲGA2q&c+O0!hӂ'QUዉEP"ݽ go̪8,3^^{>>:RXiQ H3-\ ˂A39x5ԯ-P,aKѠOOsBc.5\jA32mb]rFA54>An[TO'9 t6(ހtu3$/{-8қLיM(;%s[}]h/GaJİ^3$%`/" ]ldLY`uOc /Nqr_`hK 9h)Ɣ[*Npk3!Խ&rGEѾ8o`nӋERU o5wU (jIarxn{3bqc\u=Xn_ ="iK ?aAM$u "Z>Ri0֒8ݥNwԽÆQx3 hѯØ3 VKd6*0fٶpݟ P2 ڮHNv rJ;b~|5LmU$,r¨ZB>iY$E5E6si<*٣X[^_BvPVMbwVL0(+A5ڡ~[8H.jXUIuyfОH)n(RxB1 Ane 27LfԱ{sQP[ko}mG4 VVɩu`6G[bmD2BJX\z80 ~RZxؙI[;þQ#I[Y)bg2PVrŨS]O s( )ҕ Ms0kTc:}\?NJ H^y dj%9,=w~vGyO_s^UEE 7B{]2?+zMZh_&k""* Hw\'DgdpEV@Ǻ_-*nm墨w6klL4L6kLY1_"Nl^ݸTNSd7=rL"°7N׫OZ\NiM5\Gˏ;_޾[Łr7kouq8pmVl#wPf.'Wb7@8(/My25ϡTP j.bOV}L!sb[HD`L٩I KTC:\W VAPOm2k^2zwֻ>K^оAT]Web'gx8aRulfXX7rmD[DۘIonV];MXzh`vw$W܊_g”Th1_3sU95!&k>uzV'-ʗ(|Ӻ,G%akwKΒkoxr_H;GY9S>Q-,&{%UU?O(*%=:1Oq󷏣Eǜ>)պ!SIb^ itшȯJxe VA9U%j6631`yzxzԴ;i0(3 HJeSs[#m^HtXT"S3O$p`Ɖ[kH Y][(j%LYwTIeDx;2w5e T9f{^dqM+ W÷~4ag젌6V#1;f\EqZcI- s-^Q(^vBw͔lF.%GqFf `-B;}_.I v6 lJ)cs3-A]bxDshf,N6Poᄜaqtl)Koa9,T25,:YY TwmVND- &mȖ!TMHNAV )lTj􇹥%tl7JĺTEVp억-Cx}]U.˱|3*TܐEueF#f2O:i4L׺ Kb'C>1 ~'m8u H,9C>EjQafdA?1O8U( o)>n>EY( z]uڴ-!UuԿj[~N␟!GU+hv'\ڵZ7lXݫ6rL쑞{VSr4vs(cp׾796NzYDn| .j| l|˵]2?h'ћY!]_$ *WDĘ>}:{2 .c`[:rnδwS]{Ӳ<4]k6m1{DVՀ p+oM=_å)+ ?(6f5fGt-3[O4 W #{ylƎ9Dp7%ΨNpYga/Ņ8 &2%)S,[PUzD{QՂLږVnFZN!']2]jVkC@] Nc&mB48.a~#/ӡ=n'hfsJ:?G_1(μ]ȱLOL(׭9B4 ("zjgkR}֋Bdxab!!4c] ;VDPnVF G ngOВ*-0UIĊq:.(]KC@iD)dezjY"iSIųe9)"Dp8 r"l)P|K+,Bʨd`TMcE“Q3*VD@Z"O;PA_CQ_jCuR.2#'i0ai"{$?FP3܆}w}P qog-uS5 D%Ǫea} Ė>xۚ}kUs+;"MZ,q1|O؞鯞-ܺ?U hooJϑi㚽hҶh'XMi{ߘ'@6AFf*WJ'noq|+ j}o2z CoǢvfՋ[0iG_[ZFZt=193"B+N'4MOw+7nnҠS= RH-t8l*DVz@_AVЩM烘d19I\5{ y:GCpd7!>?ߐ$L2XW0ft$.KU )BMȚ8Jt&_ q-Nx5k]L%NG=GBRjl$[i]C\~ㅻ^c%4厍~=>}`Q_ lgAc;oEQo}T=9"kV~9X˞rxIp׿(5ްۖd.UXa(1V5:]kOQYDaZr(Eg lReYzͷ[< +aiZECB%bP,&\TN< |UCA+h`Dc2,"TLҮY7,8F5'a/"i7}7]dV:㫃0 xwk&6-[e+N7\p3X*b@Oom?(OB&ho:M{I\SV\=N"}9|Y;BhD>P ,MPg5@䢚gKf^җW]5b 1'oY5ηqɇpoZ&W8uB3~;Ƙ\/݁c"0t;l[LiQEJ-nu$TP٭ԩR,OBB=_ jT.\nQcO_(.t)n4򛞐"MaLk4A&H%$7 }xk>OSc& Q0OU8"6lX2\Vh{Mڮ "A^eɢ4 Uo.9"-4KFKt{B`cexwnmI"j\R;w踑vO.N+X7W΄u FmfjͥE悛$Ift{_fyV6t[٣F.'ߝV@LnB(ɱђSDb XunPw})-нHO rbBzGF 6)mTݗ\s bbdx#?& *RѭY+pT4`蕽 PU<֒9ZsK-JG,+PLJZ1)YWlcL,oY?[Dp3e2p$Zh!&%u zmmik2 =pC.e UmϽ lÎNk!w7ĬAow\)P]S-41f[̜!Rjc!š^j-}RK,~ Ką8iaV|9kƖ _+ID@dVߺDc-v8p1p&d-D66lyퟕO_.gQG/2GҝO< g崊W^)\{j/ܵ/|K g U#X.} sheWl9w~ _{]Ҁڢ&2S^˨_ng%ncN,S!C>9޶U"Kt#Pخ`qTa@inEo3_C>O)R3m %5*GQTJ fT6mPMb:q +~mSڝ1Y"B}7 +TR@F~(w8طk&:,m8a j"ypur>a%h|gG\q7S}vע:O|AuE̪l;J\3/x"~ΕӢ`Tqsd .O7W6[nBܒ.W4k'=ܧj3݇+) 9l, ٜ ud7sȍFg9R?o@GӜC=4iĊ y8ytz= "at}Y9_ө!NM#]S+mOS\i1׎H U{Vջ]%lgbeۇnA# @C4IK]BO.Δ֌.a8uucdE*J80`ۈc9ig: %o ÿ0.wk$zKpt.d QР;*)?p&NzpL`]/-oRxsJ67Bc>VBBGFdvNO/t@(Q[r<=5U7IO\L709|-놑HgMʇϗS;kO SrH3:Z!!=\TZgB>R:eosT jtT$_tjdmaPoq9KeO>JҦg|aF#^ 7QknB5>W~wW>&+yPk ci@ Xt)R/c $KVOpEREږ+B@G2IZeq`S2[@el^[,,P bd lHG<"w+D"ªgұR񥔄3_ j"5f DE'6 lћ% s04vkK4 HO,F{fmƗY'PF@7㑨E%s).;E^i.l@->U'몃ޗ?ZdԄtՑsOӪFm(zOf\mwoCz?aN3h1w'v'c|i/?&d~so?D=P}̃MTȺTW|9{>tJ`7&sޅ. )$P-[Qb9O?>WɊ;z,OvgG}xG_ ײn=R(9+>8?{?+>y9>;}Šba[]$c_Oԫ~Nr$=x KS9lBvN˦Y.!J)tӎxС3FK%[(9fx|h 7QhL2c+5=u6]Dċ vSXÜ\{8)zLsDBMfyfhVXYhR ]l_%ItOh}3 !a!%m/r~kbaxyq8yCIO8 cR7")& BK %r'f+--Zp P477ɷҔl&@$u+ p47{/Ҩ<l.lj9t<7< 7HB?ReTlpHAϬg~tL<5vH@o=38uzk` }OkrL;MgI]fA %eaG`STγOiVvY*ƯK@\*&i124q3 ߠsKuA?tqEo"Y(s)L'?+xY#ňN'n^[FQNY1\`4{NJ>t&iFm3μ#;F7D'60Z ig4UqfvQ 3/?Klw=Y2TWs~w˷[H 9x|{I9Nk.#F^Qɔ,X)I#7`_l>~>;hA F3?ki`UtO1>0NjtbT [}e'p6"QFOp'm.Hkl,l9R=8\416|k"9_}&x#(i+I_xNϴy\TSyZz=m! t%8.z(N9vnUŸe,ՕBTFVǸYGrO3 2IF`%]hӢȔmWpflIR \b꺌Ib3@Դ<7Mnh{s]4yyQE' {2@#ʕOu:.[m>ve&8*d.@9Dn%A9vJ5^Sp͐ 怋*P޼ཐ(d{4U^ZTi_T .Z08t6^_dh $x9K]<jDhl\3븚"Lo{qG v;|lAP~)6zqLoS@Yz:; @6|Q6cdXZ1 ފ`ձq6S K^!I?I!^*YF$݆af & /v-m`*I\rxsr )e_Y}ѧl{GFE_{>=Q1`$gvMq$)YT|J# Mu[<ɠvez26fl;^a1}Zc2ߎk߲imߺ h[B5߷\'pFc>;|nQfTJԍ堢 3,k3(,Vcd;CCEVd @rWnm |^ 4Ur!:p!ыa\+''4#N4t~bs.^5LfqgyEW9 _ P4Mxt)kYl^!Q6k~n#y%c jeBJZGECx4tG`zXUd$?sPv~TQG ns[vJ1 g2Ŵ v. |bql{ TBa5)-vL5_N("oCt{x4OXֹ:Eә4҇gA6y$d; P _Bda:ܽ,ߢ0Hf=KU")0%g~dO/\AT8B'֝?~sϯ6?ÙtyXs.ٜ?=W`P?yV顔mv%c4 j 5,o.vs"ý@>\5 B!hoΑe{BM9'KRMyK7 |JFyޛxg.*X`OoYS]CV1}C\d#>ovd^c?2Tq %… fIU"5֒(g aHҼN@N$Z%OBAlj RД(-׍j6b]L5amkWЌbO ^[Gd_Q+N}X'80T1[K0ežp'bPo7)uїބ=[jvp0ݕY% O->?2 HmeOgDٰs{:v602'KG g{xZ+e`]"*5p 5i+q˚E w-Py7G_YԛAt?M N%pld-g A [mQr&6*Y*'KK qS80&2}ؤ" 8*\9}o q)u@\xئne;L'vc K|aqg<"DŨ=C[t<ˋq>F#/6e;,GDi:5h7}l32H).dUG4'nqZ.adv.ŔZG"rUZM>j,BxQY}[]5Z%UT7,<t~hșz֚%;mK4&>"M@ZȨ=& FzZFI^ ծzOEcvR anf6s|"!W76H*j <ۀK0,%d\*UF&9I^p>Ðkid*6Cc l\> ɦR-iQ$Uq4o+ߣϙxZ^JBT?X |z{ax*zՐ"r+XY2% 1k;]MxrRVcɄ=ר7f}и89Tu# (BM0J:j/x;ٲ$>IQ\1@Y<Owf*:'歼-L_@:ڈ{/LT_=;$4R4#'W޻8<{m]m1j[N-!xzt{>^eߔh^dt"8 "PqExIwږϼև>q[pD[1s.=3ӑDoۙmDlё:qț|.6D'x닀9@ ٥pH .ڢmo%LԹ-o 'NA97cww߹w# m[;1VCMrYS 6%jzw.8ݺ]xfs72%rZ!~Bny(tH%ᆦ""IU5XMVcRLJ(X1>ZtZ-Z VeTjhuqiyAT-cʒ/k |e/-rG|fý5\$Z7!Ձ+Q@f6a0!7ǖN1!Pi6q*؜|/?L7ݱè?DpxȪm=F,Vs,Kі dzQY{ip;%M??`by`//ٞ=89x>'M"44׌돎g'JU̷8'ʚM0E f Ԅ><"jsq(u2Ղ7 .i^I~o҉[,-+ ~٧_gG5:23!QbyF\H|bGBz&~8<' s9yx<;ӯ79ޝbK-X' c`K6"iXHXYgu%b 7j -仪.#77 ]aWD u+vp]RJՑ~UWqai7VF )O5vmɜ@;y[(y;-@Dd(YHWL٥|fT-v2EnkH)G'M⢕8;"P_2?ccK!K| 3=;'],Ղ#XZp^']n8YRw>\9>cNͩ$&i7?/m?\<"ςYw&5RbS˻ڧ{?n!:gE|$9w,,c>L)ڗL$‘e .ʻb.@SD3]h I!>\B6ds.jc^\k~/߈HkzOp,bC $:19*緾*_pMɾfCޅnhݟc E~;|I\g[d_PȦpJzs'Gu∄{.vϹsj'#ƂH9!>y0 rIUGBTl%2#EMиa2 C.c*3 tL$B^5+V9:)$Sk\-"?5.nMu` 7Z[>[.'0dFbOH)&ݻ}POEWvӾ`$:YXWHYd=< {ܫV18Wn`9h v\8:4R3d1ѵqGΠ#w.xE14_!] >32VQ:pX RШF݂Rg_[ wO4*NNz >ՂF0DNnNwIt0Tx~Zo>[\: 1g9ױuC%g7ٗ󣳿^wcQ둜TJG~|D[kiQP_-ֲxXS\ 5S쉵FбV:LJ֯l ڭ{@K6IQ:O9tt@TrI+ŅoNV{صҡ-}2\y5K+'$ c[+K0h޸V N%p-1du^-#Es(ҝu8z| #ZOkHtC+7?Vr` )4Av 2.Zäzzn/tcʩ{ hhLSԜM0;u|r2̨k>H MW>h \ë͚́0:,m4^m뢁|( "P[ۦt]LNekpW̬ Db,{ι$Ữ2E2 Ԧh<wyuB/:3Nװ ŸC^=ucZIB_ZٯV@+3"#_awf~hw7EYy3:v9~kjOn_筰X!e\TZ:$b(E~s{.}m~~w_%/y8z%+~Vtrn&|U>&* k$tt9$~I [. ({ D^瑚}}LȔ,My="hSpaa$RxȟN';)]Qjj K[6Z7þ p9y_,lLUS"RZgr1!H4c+D:B$abm0:Ҽn :G|jFuʝ0T:՛V ffP>zHJYw[\g_N2;"ul7L+H@~h-J({O_sOʬH4H.g'vG# `A^l [_`bo[&@Eb[B*۶D|&'a]=Ň =OA*gOCy*W&H]΂Rs^EIr&tx(oJգ.Ą`''zj5&@kϘDQ|2K67q/D~ށO1:Fٔ8q`z夦WE)7>9G9#)۽B5*;̿ ̕.5L\3Pe07e}7u4ȂuoF(CN1T>ا妸LJ*te-*{789/t*B|3-%/̆&[Zj{N0IYJD叔 )3+6+D0H &TGT*t4bP Ӏ˻^6?7a ~cJn\BSB?)^ xΝ 5m}ef|gLlnKNý{L;Xi+Ul" d% Ɋj]*#W mؗi34OHH.}7?`Ke⮊0G i6_rH/HË`X86Bbͽ{ݱv >9Q<\)s#5-aN~:nTΙXC-ubo.?^ ^\MG>SՒ,֚7}R?3bkūDӧGG +@L; 벗x+:܆:ls"[J5#N*/#V6D1WzUFsKw`䎕-n J\;)e˧Kit.,@"Țt&t736`$?2x?ȵp+p2eM}n*Jo~Xx\XV]NAN\Rǰ cpcy>LJ3ɸGNG|/e|O@`獩' Xk:2\‰NB|U\i;噇'o*)\/#%xO07piк@nͅF۸N+z3ЕH#L1)T|3%8ǧQ+*=/6!{'q|@}QGNxǍs 5UMwPvT{$e'J>!br7ekg%Qߐ<݄ lY}t,qXw+DPj4nǞPh+lj]2FKy*LZ &c^!4*,]ICGhը@䃡 (ꇛ?Nxh#6C!mo vKgQS ODQ ۰rTwstZ "xcۮޓ_C35uMgl*1_w>EfC<c6+.q#M&x/l>mԺēIQP`fP / 'hqquMpǗ._lVfeMfXGDBB:f emv.z0!7lw LMހ(7,0eU' O:qT6Pjad*p7+s#/3,XВ3K)wlL8(I q#`3zCkQ(~ Aek?̓gҧJb6́~]9vO`B6PkY׏wJA0-۟*֬4mn?Gff&($K) .b!G>};,X.Ye*$ r7]e%05[<'mo 60EfO*5czXaM2[p ڒw8ݦ;" 꼇w#rZ>z1Jn} M<Kstkve~ZsZW` N o[7>@$*%`+W> $|ov#IhRz̊r񮿞3i:_>ӝ) Lf[==/34@!,4'Q!rEhlluO;w_jn~"ee i.Frb U첤 ]\ʒ~ٟe4c%=N.\秆tz ~6< Z{̛[m1tWVH?8ܳւipM\w84lc}=Vpst?j\;Lw8*JRj -Rc,}ؽw=TBcSRl] hz jg(yrpuy}Ew83pb8!_{447N g,LKêN_nkylbߵhoAQ-/qQwsoA͏94+):b6~4s96 ΢eЕ&] y @X%qPrZߘlulDJnKVoR,s˯{}ҥbꓼs|X.$:*؇^ѷN<;*͇)"X32^#ۧ.FYpI{՝\x^-0"ATGfz_{Ԙ7>? =i\Zl嚕-xM($?5^Y\;: `War&KőT% )Uwܒc=% }D|[]+ eMeJ`8@2,**#`aqOڼf?4ݥK'>#Ahu/oSR!@G6_ @uBp #O/(E@L4B> Q٣__>aΣ|CS ߓy!!ؔyN/)a+mlj/4 g$\rfTeRG?V[͏"-WFެ}ȥ3M rdv77:oL]xP+fW:\'- ~x˿X ߯2!]WzM}qba?^h mYH\f,/Vw:~HVs0^ e>|o/M6~{Qvm_~|Ap= 3ihiCet_;O~ѹ?翞ȝq^mOHtMG[FRid%M=ՉnB&wt8us6MdHS<[PjI$JfǿE CDΓV.g_G]wrmÿL_,df|lFvhEa}_ee )u+~mQN)e8Is;?mֽINsIOqp&~AذWJǞ hvzjq*Gb2 [4(iVm`)]b -6$G)}Zp0lJ.FD !3\ S5Y*懱h}jnCI ;fXp<亄@Hm0 + :yގ Q g}Qڥa\'j08bAT:RQxP"@v(}sتǓ._ˢ-aymH}&Bg 9d>1EC2(~ks?~L*yˉD]Q4M ӬgK*}֏(*$u`1]%u] IS}9;\tXC}i >8Hˆп"5,YDX6`&%ؤLC?!CcoAYp1gь3IKpt. " wJ.>u߲O@Mߎ˾Sr ^ _(]kW; cDvyvn"⃊kM lוu j:*(9ڃ#>k6P\}yo`+nBo67 )!rvՑ}%ޮ.}aAIRF. #a!%~`2ePBGY!<[mi<,#n (jF]֥%NUE'}|[l"'ѮcG}0G/NJ_B.vFBe7JCfkCtw -m$ӠŻkߜ͡sS^7 .خE/6~L n6Ǜ9뇢TUO2ޮ{j:֛G]k-J{v)'?,{5LֲfRr1ؠQ3Y{!l~]hl~scuH_%Ziv9#'M.m`LůCTh) ~Ih\×~ٱsX3a`VZJ,Pҙ~Ωmզ俅j}9I`׍p}l&CS̓S j@RH7Ou^Ycû_LÑ/Bv-et[:Z S}7q^iߵ=^f%g{}  )՟Fnt%y \u8XYc@~\|?ΐH_+T;fOaKA\(MqOa/z>*=:ׁ$u)'*ǹ9ަh .y:L ^vl}m -ݛ8>{wkm\CGӒɵlޜwH 4H7k\Xf͂6+|jb99byt U`ܒ5AJ}•/ 82<-C.Ob^/`v1+=2ҘbZ}5Vq%eUaYS0,"'!ihb#JWዝFG<\P2?(cjs<ǹll}J?;9yAe~gJ טf^wcc-ZWaٙTFe8,_SL6zAdJCѐ6X&$G`:< M['-"&Ed987%Ȫq(ܒ c뻬ϑt-Q2)i}<}J݄o?C i8K( yr"(Ǣ,`?`H'Gt~igr|CdN8 whź> uZPHGuOkX{+2vNuƵZ~$IĈE߻sK I07Ծwǯ߾i"vD'K,Ϸ/lKjHB(T(3AO6|kRtqDcɱlFW~ɐr\pDX6@b駌 :}pghk>rV]yя(DPJ=ҷh흯֢+3̍QY'n Qlt ɵTWj&ӓgmF~FAˤė^֪m>NyЁW|nł6j3RR/R`1LW H$G02* f\X|f2V=|i,H/.>GLMj%ӟ׬ !"}r:Vœj9%MAd"K_]{xܼ5AC3Fiˮ& Uxa==*ۅv\Aؔ,jz`m,KoV|NjBYvGelgg12>l>gY.Y2 !j`j}rE>tBNX\aAݿ B. hĝxzE dЕ?7QY'jsb#$qYlGPN5EJ¦%ui\.O9#ID0 )`<֙(TF ^>qaD$qPҖq   ~6OWA)G ϵ6'v  [໴L}2,̧ Z2Co$ԭ 2Ӈ7TN7cI^ ZYM$d [\i)Y7!Sfѳ"0Y0IޖŰM+:lG\Q&A3u4o7^{g.QTOInmTt"-7am,=r lJ)sCr^ϻBZqL7BZ+#:ƾnzz(m<|􅮧VLO.s)FH/K+!xy皥Y\+$䕐9Vݯ왬Byq*@|JlSy~BUTǩ ^,ͷ}ޮXc({.3*C~E#˸'UWea9l~gfׅ)9.3 [C<eorDGNs> :HRʅ`( Ma+ u¡[ 5m{rGfv]274p [~&Ƶ&MX%ޒp%ET+ %.PKz RҕeJ$ҋ%Pp)@ޮ|t1_ 8zFvWǓ=a\+ A>o;]R& ̼Ev Dhacf fKMS87d=wÏJijQ)?JW]GKw VnU$W#ZkuJNJ˭Sm17Z0NDgYޕ)ЂLjiJ?ݘt9kDuGְA+~[o5iS},wa\0%|&VS6ygLƩV8qJ|2+1#SHq?8eJHLSUS+);49L8NYCސit.MS_̈́T*[-:H^']Lbl /l"9w6Tb6N6áяΫ?l$mN4KJd/H5zLUc-('5&f@?lQԤ*>g/c[gx`;{- /UuU:+ 9ŭ,5V[GcސH"3nӫ_ gFl4B"&eor\\)p2hGMZ ?ȝ|ts%yzwJvv-7,>yѻiCt\q&$R%9=$M pf )n' )0F c˻c17舾18)JnfV# D5!JßNq򮃝{W/PR"ՎI^/t؟xo&^4"nvKUnJy7 Lf3[X^ۛ- ]oJ;\"(B̅xBҮ;P6~M,,2ǵIE@E0x}\:~{^gpבl`G 4&@G/m YțZY8¸Iv4r\0R:#2[3ykye7Q~{>NPu{,9# ׏OT]ϫcq0uS s`Qa1`Xbmh`cIJto2ɨl≠;ǻq|'ъ=#K%j$ח-_V [X-KSŔ%I/cIrA%| 2NX^Nj_ĊOwosZhB3u0I:F,D?ŵsش%@.y1aA PkC=lQˬ:Vgyrc|*RZЃ FUR= @2q%yI{] }B-B˵ { <^;˓j RiDLk_uc#d+±zHW&d d t^и]kt &| )X񩦐sVoPD@Ic<W>9V*XJb2 SfC_;\Z#`0_FK>e`!E:MZae44Q&]H}<#NOˑ+$AJօ4۠RD-d@|Qݤ]{w5qlq齗U%R( R]|Ii>mFh&8%a,\m\gATbcdɶE7 ڊ|Rȩʆ0@dmLr&]4e\5Lg[>c_hH39}'U?tEU.Ј%(r d>#v}Z68uH,g۷G( 74y Zܣ n=);I 9E,͞<^_* nn77s dS߲k\8X ut 6՛<2 /ve(cDg:KW.Dጿ8|-exaŭҾWs%-zuz$(@jְr.A|x&aS~ BBETB+C(8f ߕqM+ߢN] ˣaQ ,EK%a 7ZQAoBVUZzu]S5R>;nb6Q0Ӓ4iMSo6@Pة/- 3kn_.u{3~^tNy9C5-ᅾ}<" rVU oH(J qm% ֣Uxݻ-\^ZuS]ɳFߐHRגD]ZLJ{VibU8/U,Siͫd _Hbl=F5)j-VLhD>=0c2_ToTv7 eU뫼̱&ARŮkF|g6K1ca|073k#t/]/^¨_\2a%:[|=\x`~,年L%z^OH,'i$h@*O$ҞjD73u'[#,UmEO0׻l .O/;ͯ4˄3|#FN YhVj6ւ_æ sރ/ve@ &Ko^7c(zN, /Y]9{dKŦ?{PnT:;Xmc=-ŝfZ(,2ЍF*/~FǻCM`=t{80pn4noawI>ޠaI-ʖ8/Ǖ!3c H2DhE*th&L=Ase$:ir>7rtĥ#Ӟn'xs6,RJ8vE`8Rb[Yxs]mS\DZ_qDEER0ez, qa Zgy1 ƄLϜb׭P.k윞60h%d_+)gZZElc%/X'Y2Wxk3Iΰ`!'G!|n,ն#20HRaـ7Ŏ:sV3vdx56@J\{ WH8 {jmjU##}AD9ݫpeD+e`f{nZ5Je 6`K\3}<|z ]hE ;;cJ' ˥lkΛaFymY"!1GU-?U˛K/Mމr4/}3iSȁ\*eVR dё 66!Er cwk4tSAt=) ׁ8J_62!t$Ȋ uLd^&·,z=XY8=/`byȷF+#BȏTF| [,XqF2h>J/.nФg'FSx|9ȕ9ilIQfvZB@-? ;jy Bu$erzs@R5&)EiV&ڲ$k^D'7; 4 (c8g{j' ޔ(KL! |Kbbl¤Y`yO, y 1?'19.`2C?z(r_F αDݖ( x~ԊA"١1Yp؅leKsؤ.L]i4ILe!M^-'Cy D,Mt'A=Mzl˶|D~-Z9AEa^n UozXXٖbxO$)l5;Ǚ,n6ʦq<^dS  M7ۉX 1;Nm>Pdۨ$4HK&`*AA, 8co+ȸ-{2CUZj#񺸥Ia["^uK¦U5 eVh { Z7WIYa4vy*kɴ ĸ@v> `[!`N➸D>iDh?09q\Q-v p'镎`QZEô~+U÷XήFmztC\3]9$١f}µ׮/E hbb[G7z VeESVˇwĤ $"+$k}8d8nJvZ2T(#|MtW5zt!3,7JH]1i2 Pct|9UyћgZ!`Cl[^a'ſH?O_j>OEI4>%ѽV[LD{F|Qn.v PtƧg2p0%(`^eIbj0fZ 31HRA'mn|D-LP2<`w^'m↰4v8fZGPt N5 㠨!MZ싴~#Ր:VJ?gIJG84=輕RLPetAxf4PθS&3h{.=GT]ޖb@$5lBwp{[O;dL hk:/lx"1Pdo52Q.Ov7LU♆ M6BX [Vg07C#SDOs6AHH.I`yyFM-<R8V(54KUtɎsffu}@@0si/ Aynio^| ] 4q-_FP>ڲ;lS `^U{H6x4/2)7inWfRO0eAN~91[aJ *aFqB Yqko0dU Xk9K=$^:ѥ)NM\r -QɤgL@*! `)0@GM OX&A@9>j QD864T<44rn7Xn g-2w|%Iհ\2H#$>( USTQfR _ QGk2 1:`g1Sk"GbJF$y mS KG;@&Wm)20 enxE;|kB+H% *UI1]9 ˾]"hʖ3NxTZ>[I*eYLF/HvS"W,,$DqTZ e-MROp8E(!x_fjzLAn!Dbã4G^b!*iǢi'hߠD<0k<>xy^)il!wlI ªl[tZ\X=]8-` y4 k6wy7ہpFj.n.\O , #) FmVzTF e-{0oiB?{[_ר×ؿdee(֦iVS}N2^ -e=?X`gd jB$t#)yM\MBp~Qa- .C)E i T+7a6僒Z R4w' $$;VjC.  O(V%ϲWV$p%6\SpB@Z 4$s&3g~W.kEH%4,RN]mV<\b]1J)IFd EVG2Ty ]=PNK.`XT,t@ʛҟ^TUx%KxJdI}RD` Q*2KH7Ww43/6@)&V"4/) 4pi8K6d!W1Еxu,%qto5D4u:'Y{ ܖB( p>17𞣊!|::N. H .P0'ġ>E9}*s_wdhm"jF=MfnlHG_^FzwLV!NCn|&`5LB˷yvw.%~YC&N` ӧ9Cjbm\:GTgD\P 'Z?EBK:[X\GpMM7HZ0Hth=\9OGֳ4KJSt]ž%)3kKl_pa([$;_b ^cQ^QɣÅIZ8ڬ,hwmz`7rسFpT#GӐN p&aZ24Cn9 piq:eF`璤 e2{˹W ]5XUA!fI@;+w»BFL=b7Y6B7WĢXkkYI^}/^THyU+0%G)2Yp~=ާP(8F$q*JCosYY6 dY~Jt)jE4lYΰո.yij*="8ςCޢ` 7$P;jei9.~ ~M\@~S%{1aKF J0(J]h`8"qi(BN!GRm[P!wi!,= L=I Gy)~=K:Q&(ҝ`r [$s' >;FH'>̭ >Sr˙m6 6!ŪJ1޸ d0v k]d 0e*zz@D7 ~j#%NnMZU0~ll^&^$㞧8 TG5Pypxx_IAzX4l˛Ln $?rR ٿzmX0R4>H^!wӏ]zOʼn} 1⩯KPk8mv=^T*Q7yQ?1Uw!yϊaa|)#8Od uY5~5t 1N|sfKpm)в hbGXPNqWD3QBG0As~RP_0,AeaqFB;;cBE{X?_H;Mnz}v1PDgIwt@"U]fWp77!` 5 åKb*Dȝ?s]ú<''6ZUyp8y O>O(fW 2`նqBcT߱@0 ̆1nJaq$9R2ȌeV5TݵRDTYR@#ͥ'IF K|]. Jx 'O)Dic#ad +*F.̠:,~ /Cd/A!_&f9'fcQ6BaaWaSa#@ȅF6jPhHTH7K%p0<51 ˨Kp-GfhMYO}'p@wř&:1L}Z>xFzٖE:@yA:MsZA=.oI@gQ! o:I7F 5$$Z&d8WjmQeL72D)ARRKGpPlyj;SQdO0[ߓY b]kT 84n7$}vĿe~.R'2@:&Y5[=Jջ3gnƼY):` ⓾˜E$},t'UݒB:߬Z.])G߻RmI[U'6Ze:0p iSJC" Nh|Di-!2>gӱqzTl-US%C{ `ؙ8bmIszU[g.hT.`b5uC)1咜VRR-;F}5rLSvus_6qaS`P @"hڨpSNYU`z`5K=B @rBE݂X-fesPy>&QJÃ/* @715+i2iTǦΠ@p9rgB)7ލ?_a"x%޿9C1 @= [gbNגfY<׮Ҥhnja ҂=c-lBlRiwh r-Y42qs7 0r_ԋ,YSA >%ЯΠ .49_O-sSuBl 8lcaIص Y 8Ѱ Q;`T2Û@U#z: bM:`\b(d8p=nrƶi$=-qsf+FZJƱHY2vbGW֝| /YsԖrRzBc9́V>]v^`¯w[A;e 6`Il|׭=ͣO١f̕rJ.-:GcT-"-a[9%\4inS, ^gLR CGu)3]VK/uLKrfz )MmY QkRaJaCʣ:Ig8;P%Q$<B GSZ25t" _O?ʵ y=$sl ;AZs\3rDS_[KMuȻG;aG\bRDKK ˢz N T u," g}7'Pd[z FjgGf|07*R5 O_ _@sF $8Hx!:bU>>Y#^c(f))Y\d G 5BBRa*5e1Rhs-"ZIc$ Hp+ޒ;~2Kp#p ~{g.m%^y|w=p\CT375~Y T [P(4Tsg@]шč h{b0p`2@jP9L dpU'9c\f^I$kh{!˼;? LXUp^?MN d/@W}^nߝ:dz=S*$. jZDL3 NſSxxRbVbwGУ#=-{$wszqĸa^ƅ!sOb-6oYbK 8#K/ *jA~ȧq0YQKgpiћ.J0| _^Ӌ PKAIbm[}PKy.Fangular-1.3.9/angular.min.jsy_I?BhMէԒ?xUVow'ӇW;dLWUDճlq1-&Z.6}fc_4fZYk?׻,:t1ZheOzt_?1Y'L9f>2,&y{}+}ΧWWoxy)f $t[OŃGqSuf$yucVWɟ꒖g_4d1ѴRoF2q~w6|l~675z8QtzI/4[ȥi7&ׯ~VtQtL~R˶ jzOVj|CKMFw41ow &[4w鮖Za)WultܜOfF3)```X֘␙o34ӫ9RӭoKa"@:FTB˼ټwT\dy+FŢEWahä=Jzծ >mxWwxf2ȶa [P( [aVڏ&LV4ΎmIV|6/^ VK&ƟDUaϗ֫خV(B4ծj(]TUU&CaY,KTpMBڳ|Q )=P܉&W& Z'hC1=~vC<;>&׮Խ[>ڞ_Yw&QI@WWMTm̐kacͧEԛF2 xh_a@?QyWFzըG_PAKopqo֓&LvG%Z޵ @=FWWp697ٜh,_ykCh_ j-{݃GlSܚPh9]·|+0$%E"{T#SMrI.2h٨Pn@l&kprl=cյtE r{dM#ٷhT_]_v3c-ph ᛚvnA3@֠X|<:)fj knR`>YκE҉YÃ}(f 4jF|J' EwVu8.Hee:}<X]6 $ Q6'fZL)H}X5\'ΦEc ƣGM15BRё}MJib6U^8"SrXd*dETmK.+ ]&mm1r']"0OTK=5c0v17l}[5ݿOEJHP;}a(0Sx<ŏVZb|[^0;MwFۥ- woш&\XsߛI?*rЊfw2< gx|Kk!3yLAѾ69[b] m]"[7Ipd>[^"ʊT,-|.WT0o>M-`&QW{_{~ųv>}mU~"W[^0Y~u#ǩpDY )I|XDMMd۾064BQO=g;Bo4[eg8..k@ |vQ;c.wss8/. Ngn@7ÍАG*O_Ͼ>8h>(kb[cԼ_񭪉6+n-TO5jOS 9D`ЎT<:TcpVQGur^€fpo%3( I7FnM:* wOw#bK@KиHyo57RjtuCY}=WGceF7197qBC$]Bk>%,z3{TG?hXj-wlYRz|EE+oَ}|VkcJ rJ_=M!o𢵱R ȓF%ְW5uÂTVcycodupAnRjm?,Dްz`,@Y7W.- X鲘].R2gIWV5i)4Y$n6.e5Mztz4X,B-j梹kyŬ^]%f7.Q~aËvS*[[ ۙ)W$hjZTX t@fd=e|Z'D;AEIZKRΙog4b%$WEakoR1`MX8,݉T2qEyEڬjSVkX 2Un` I'o&gl'0 kei:%*FchY؊՝dnXyYAT%A Zk&M) ǓE-/myImoT^Y8ƾOZ2[#co#bմcBM/:y@@{^ %QjvxeCv))z_o M~ &1ZfLiEXDܨHz]D{us\/:#l~feqPgCHMC:NB$rwJ󿪑2 *g8Nd^]w. Gcb!>F:Vm5TZ<9c WWúW'rdaz'dhK[ }FBX0 n+$k$%E-E(P$J?PBOmy-wTN,1Q >?21;o@ev{ >^i']?<^l97E<$Gi?,US%&[osu.r^̾?影Z73NjcY9#$m(vwdthąs@w4=P+Po1&Ly@_ - ħat a}|&؁WλL"P  iGH& >yEP:x2/ftMs^gt#O(͇!z|\>['} +.ߙ@ NOh`=[1ky]OFbK%^#trewk)c+.)}KJ?rٝOӼ>h1|X_(zQG |*Rt#n }5]zrPUsM H/jwo|/~/>͎},zgf v<܍EzΊS/wgGE WGw~jq1*/dm2k/ .^KΥyA#S^XY^sM㴰ju\%u;Zhd.J@Khޏ|Ĝ'PL̤c]'gĮlS<;BVןt|VrHzgs3O8s׭83J H(=XE2E;QE﫛Ͻ_mzߞS{z$U 0~bW|C6`j-{Ї~W{Hx \;\wg\w9sO=vZ?}Mq-l=Ϻ +385!"}+1GSpPA_{\bvg9m>c 4  v4艖4~Y,_T-+K Ͷt`4oyNߤ.tcmb%u#^FZ+=ĽO¥NK/C~;#0^%JG[%CD.%Ejշ^.59{ef.}?gaH6Ȣ͙U;½FD=xfq^XOCï<$wuu$mp8)7Y5qP;'ǘ6z>'.Asو~n.5̥9+6G•2vg4}>dVAz=cb45ϛ(%ee;ulCPtLf[)e'.0h#}YQO7G(tN =jyklJ_qP.j}ps;pR̃6hj^Z' ĶquϘȦyE>3q|uu4JmlXAyEFϰG8AHFzXihLh&>By8k m:]e p_KGkbC/m 7TlyHK**=p\kL TOq.# +*֊fAZ$+t5̢?sy0FLIgF^y6mYfWg-EbfXs5/DÕXr_w!"JK)K_Rb״ 8@sm,snf_-ִum pW:4Í- $)"P'=iM',u0ԑÃ㯋CϜT ><yydA!McPT4&l "'_a2Tuzwozu.ȳ5/y Xl`%jP`^aһ :Ǎ,wf\Bڹeξɽcanc/Mh<+_ϴ&;(aKUUCoh'TJv׳.NgA i9w%>W{j;V+ d.av8{"wzu{s2_\GkaK2zW ;f"~O~0U}FWzbuE +iҲ\༜Bj{ rٻVFk2%uf+1KoUGշ݃%&N=t5WK'qv}e+Tza(d3 ŊՃ G@-$&1hȞvvNNk#_L`B7YSިn|z1^30߁a)=Fv>Qޥ kX:}b7Ċ/%*pn)Ge;&uAPIn=IFU&&ַ'R_V`N v>{FLG+ %qKb0OXY*ݦ7qA=ܿ :j"8L({\v 6o:~ѽيѝa߯034 $ȭjL`1Fob8/]zn۵g{Vo@dE-k6_tu w+Kx'Ds9DB:h(¬z~Ra]4'Vٶ0,x#m05qOunFQ&6'-z|c攤E57y  Q! ||={CNS!<)|ߛlAWLiQIJciwlCBבqS%U#h-6b7VvƠhAlZ`*Ud&u8HTq6DH\4՟ }EijJqueRbxHK 6H-?r(V)C!b4Vb`(W$2KF`7)m]M)3\W oTq&€Rk4ZzZê*(('~RN'h!߮LxF`or(JӋ|qW(vnrS1 d ձlL!nc;6yDo lF 4=Ha%zUxȝUD).}^"cO;p 3C>HYi]Y[̙_V5]&j2t@2g;)B\@H9|B9FcE$`BI䗣 fC`bGkzB Nx"(9tR3+-߽}ُ)91EcwFGh^>`Z'DgXLN/|a1i2@5Sk'<}I=a+o@eCbqkP y |ȶf(eш_ϟ^H-jIL #L pG0W@_ .Bk P HU|tב%_VS6 U`^xTD\ֿeh1Ŕ)7aH1LC, ۃh7n!o3o@\lC`y@@7e9wɼ&ZV@x'Z`M-'w']'` x_ӜM|1>%bi 8Zaocq2yB@l#"^fki=P6Z>L -J?{2Cmu~ٕ&c޿2oU kPۍX >-3y3Bgfu)}r_vГ4GT`xR7j,mMAMG+IօՒ8 ɂ\]=ZOuVj!Jw@ Qڭ zOsv>dgSHiAa7W:w@a=/#0[F]09aA 9_fï>%OTwPX.x B 7_`sqdbNr5lS_S!7U !!]xVq>="%8\&GVmk+j/q#XW 7=xe[rw,aYٱdf?_5oUj(g}9pj+mѢvkɤFAQCCk # `s_1wq9JZh<8}ɿB DN3ހ-Sٱl᭐fL7j۔$9bY}=s'sVcpWqA|@ݲbd"cDYn1m7Q7QcR4^6%mJ~HDnrD&NMtF9NQn<!WKwqgNЃpYDkSc@LEc)/?d9vڑjz+.g$)..0Rt zF숞$()h$G='/CHŐO.NWWy~~i%_M0&T1nwzwf=uV^).6 Mz3"}U2RN2mA4N @ǩH~2^/: 6`Z hl:Auoqw*nV4xoMɵVZB/ͪ:ҼҵiM3.,.rEOa6r=VC7 ' DC U%ժF[P B0vQ5xU-geu?"-;ATU^vM'gޞ>#P.a_nëfn׳?􈽻옵` rh!]TH+Lr,e( kAgoRb -ueZsTG}8'wFcMCtlLh_[h[mr@ 0¸_e2. i_m_폻ilx??p nh#h=(x|J )$9R9XЉv6||ℋSbqq. ؔg("H%Y߽BJ[lK㠚+16N%vo p3aFdh+8'r(:L)hB4p ـ+3yl9 gJՇ`"V>h3HXkCCx9J)_ q۾eGx6FH%G˂1(} bUr/[9}|g>BԁP@lڍ<5@(Ty]h>;Gżt!G;xV9P i n8vx=Yp.*x]f1`qPК̒d|KΒ7j{жWUyw&vclW Vz nɿcJdA-[嘝ʋ-f%P²`xF?Iz||Ⱦ˔pBaaB< ^9B= s3o| & )\5lF.۷^2{鎫,-.Sj|B&h0.IʕK197P1T0h?m|4[Hn[Ju8,2GbM| O]N&CG9Tj)z00&+ %(w|5V@U 2u,3xgo oN@-FC &g !9n3S}ɴeg| _tQ 9J`erm.c&^gG 6z {ΰKT@ !_xdHו*^p`dG,Ř>E_`R2O<.U>[i4 [ :>DŽJ)^Zxv8RSV]9FB~kl6Q ˥K\)ڒ^zjwܓw`k"ˍC=pNyC|ؗޥ?+YG_nt&JC7P}+I$SUs$!q)T=;}ޒ.HdƆ=Cē,Grs)[Jp #+匿@qRf.gd@d[{|w<ײb-,OVLHyZ&O햧n髉SM At 8ʺɱۑcpMzKq|1r}٪]{O+9J^[թ* (L8WсBl04}n]1AyaIPd`ʼ-G]6HFpkg&;vUA* }꛰j#V,E+OSLs0Kރf639~.K–R y>):5"n&gG6>#ᘆ86(Z4}.-c,H@FсLPTkg؉h&Pd\ϾXhsxȥIGN/@Q)V%/.64`ƍ%S&}(k˫.KRzjPUR-ѼRc?348&>u-@ib)qeA/nX&ٱR6]JQ3dN'(k>jK-g Va,] |3`IbAI9=V(}yoґ{v2l)dAPf6G ̭ knKWmBI"u{aI[Gt1例rD]]mćp4A޼d;C:L'cW[:\YȰ$K)du3hu KmQ'}=#)RS^c1;3 UUMUP(sG"mZέ{VNNgcr"1o|YY|sY.$v?+eC,lng9UB`9{j{*^cKEJ85l_ we 4ȹL< 29G:b cU,k#dA<{pӰ({m)K3OCnU4\5+gzU&㏣%Wq֟ w=) ,S{.9y O>JC[9HBT Bb Ep=kz-4}<}Ƿk?fٌۍ=m졇^ͩ{c~j- ə=,fwjwOz1Z@s f}Z~.i̪MV[@v6ZyxLA?5Ɍfٻv㥾>`fIe9L'?ٙ+JT㔟Y? $ zLX( a_>Xr]L@p6H osGsp99[]^G«Pt;e=8`[`_4O5 V(~k/K9[RV''>e?в}pذc;-Ba=hp\^H5߅<+:ЦLʪm뽝:oB5T!:ܱ<Mg˷ZcR.1)}jQӝ{/'ۚSS.FT&$0<}lM` s*l"/7ߜ6Ndc"TNs-gyV9t{w9.Q0!qW˼wiI핚OD2c*iB cy@Z$ӎ}=㣎$dEwҼ &fv0\ ġ#ZC'R5"Zesziɸ5y-) |D%:jM>* pSa;BBje(>.{!v}9Xn<hOU{JnuqDg+aZK$PݗD,5f7%)z wu)RP&֚VJysF;Z,!3O`( ~s\]오=D1BA?RΡoD+:_w7ٹ&,l.MٍF:LSӾaՁeNG Z#9 ="N}v*מAB,vÈNuOBY62x33]H*ao[ٷl1cم a! أ_Pz=m|kzxd6s YrvFa6mcl3X^ d|$uybMI-h|ky-mEEmɳ/lT:Q0YD߭ QҹA*Zq\8bA=XMU!pH2TmagEz'Z5ݚe zm$b++4M{SU*Љ"~ļpʛ?6#~;ID/E8Sl8( ft1/5Dy2gyն`s^Dc牳OIoВ#'Q±v`#u9{=~\u-ihڛMexS#sNfSw9fp2n|;u]:ao>@,92] daa`Rcldʢ [9B;g$1#YHGVp[LsM63e.xH YGoA9 а1Nmĭ睎!Rۏ `51n ak^}#qf/ҀG];n;}Y .d4&hSrqF2Jy8tB{_VxBn}9H0! lp-{Ɠf\ic!<&h~*xFQ0 ׆'#Dp`S T`V(M[~m3Iq)e1aNKq~ZJ` gSV]s˜u:A. (9|F f,*FpP7 s;Sۗw2\Iճ#t۾voN"],9);o{΅-S9:\IŇ3szsCx*\x dŰ~d `#m~fr\CG59JLkƯqrk 6-# Dc[Bܭ dh\J7wqk+(ze ]]%*h့ԉhƨON$4C?;9FX>9:̨C>qrkv+׷ igS?\ ֔)VEH`}_6Uϊ#Vd,٤>̴!| (%z%>>XMwsz+_)NBUb28k1f#c|m\p\%l$<bsqx2ӆȈ<;>e QAj?DƧD-Ξn $n(%u`zc|cdBK&;ĕzi\[,ah>_wm (o4%4 5,KL.n},1Upl)_L+@PjcV fsQ>GbE5ǝ4nlrqr35/e*26@{V %,ySLj^[ 7.2_t&, 1+6__su8" ^6~zW 6^_XXÿZ;|cG+s`DT,cwY%v|zn|rѪ!f AXپ\8$|dDȀkl&^]{kT;ME8CWAGjGI ](y{FT$#hQqbeTXE,%˥z놔>)Ux {SV6E$vP6J=-V؞)G?f l`ǁvlO-j䩥`#r0}M:TU#<(FZHyT#.d/ ӴΦWud{q,&)h! A2,Mh7!hNKUb.;P#Oc ^#6iloJnw"4q|$q(f]!TڼSm BΉs*Fy= <ܐ<0Dyو{^@X %Z`F}/MN,+*m8PNqp OO)UriJO'R˄y;j[1`)Wbc_ުbVULYQ68ΚVW9;Drۉ Nd U*aȹŠns֠_pUQ8|eikԘ&˧JG'v %lXơtꗌ[yxܨ̑Q3J\'Mt9gJBAfdŏ dGg:LNRɞKj~|jTukF?FNT$͇ = "`)«{D)a@gX"(WFE81!XnV{轲g(Wr`oӃgp'7JI)@HΑp:s.:#*ܤpՇкqb#9\'&CPNp)N糾coZ{?ۻA֑.G8Hk:".Ah}}\Fg.gW? F w8G0~QF;.|: bNv8bgz"=:Nj<Z)oyKɝUJ.^1!+y`Ck>7@Uj 1)̢xKVfQ`[UL*;gҗ(CD]q}gª718+pk4Z8aH`&YBiZ65 +A:h [h=F18\Ktlt͕68a MtH(ӕMaHzvu%"s#KpN1d1RN{'J/_8e_} X[D_/0G)*d]k$wǓhiVvFA;v<9M2 &(K6EK,j~)vsdlh\@GY Gbx]C;޽^Ǝ3 a#bv\Kwcܸ$;oOve-v-qWS)3A|^T:< ho0⚡f$\ UG)W"Q}Y@h0HB3np'd9&>*W7(Oޒ"GV{64Ϻ\]Gb|i^z'8h_gzRK·ģ`1y%p2OKsi~W25q*Gբ<aeuN6B}>)_/1({VOOB&:>i#TK߄ |{ko7}#|sKXS(]o \i4<f%\ 5"A>]ƻ%ex]gӞI=S ˔ qH}"$(yRnG։"ɨѱ){.g)z'{@BT6'gg)^!l-m 0v4kC4oo3dGʦ<~#yAHrW]ރ݆+%&Ճ弞ߞ}xq?|wߧzާ.'?~n?=$N%\<]| dc\^tj\ C2oV8Y 5?.krW&&lS<>}n} gw?z[M۽w_uNX泋3;m0/j?^fc*N:Ӻ~Ik]cjM-QLMTWݪU5Rϳ_>93ۉ|DEo8(afώfӌG:U"UR_곕/߾ `ԷUαn2O!9[A기;an3SCҜs.iWV6\sd.0?cL,Sur: =yef B! CIhjĠxֶKGt8߮W|jf y(۔|C=8G(nsf`Zl+]l"i}kX1V]?h)~g&pY)71Y(xY"r&qcmSo</ν)ղtXEؓƿmn4M =Ac{Uj$ y2MB5A{20WKNwMf BU9$"eՐxP&PYls\t1H0j5.Pj-֩l#/4)vO~ xB V`oF{(|2~47 C_p/?QeXY:2y AU*[Ι54.;3,q k {w1L!O=Fw7cys|oFO Ox_?(CPx}}a >\]# *Zn:Щ|DܶFYȕfE x@(Mr$bNxMTcg )U^`;J ";,dc7 sF[&UUdjK,k`[.ylny*O7V'Qhې#I<]QݻS^׻EhK?]ccqXdK,u!#b*nR/'C@}5 ؔ|@[}V'`4; =Bd|ko(װ?RKQ3o#Q͊3(eRDфsM|ߤy75oao, |_,RL6:Bc+'V(+={j}Rݖ'R(>!2E'_7II"WkzNkR[2\g/zQN" 1_#8`ݔ`#Yq;CytC}tGJ7qr o'4Ωr O/VpB +wCJ߉K{܄8 s%thM=xc9vI)! ׀"5?Ho5݆XNTGNbLA۰ rklxrνd1T\5.]=^<φGZ ^:DQg\u 'Sp؆0;E ` ]هoSXt{ODDvRaP8_6ٗ0a)!/蟜S`&6憧$3g#)@C[%7U Z90[zI:~P?x?VS){@`9(-P@夽μya(ȼXpT6/RozrˡK]oAih?\%9BZKƐr^~2CGƘǰI7+b 5PN!Ľ b fT/Q 򍇭$/N q:iӺKǾ;> KYE̮|{@%&;QsIɑ[4z'ၧDZ2]MG{:itR"yEjus^9gW>Ly v&3< aMxLJX>P1nd9sQVxxMH}>:a"#4`%o!Q&hٹz2!D Ќ'ѸT^EbMfn]w8_A}:~i}ΣF,6#bm.gZYF#b-u_nufn˭uo<0(Zr]r@<]w-@{QH@)İI*ȈdOŋbDSW%<߿vyvy/nsZebN.(`bD=SoV5!w [NXJJţc`|@LZ_WGe{ҤmҘ[-rLhŪz̆aAk& 6#خ44 v1K*M,[G7e]$uԯjD]hR B !gmI!~}P' Tv=xҾUAQ@XD - ` -yWWr/염a$aք=ΰcoe F{mN ݟ'}mO}H6nF͈NDA9W2/0zkfn^Pثp7(}W]_ O)L0 e{AzS^~6!hy*7W//QѷbG)gxD@g0wI]U|`q؆k{m X- 8++.j-e7hzL?(툩"v&뷐'Fظ} aj`$WgH1e5ʍyR볍G(<`cvs<$W;lxѼb= ?)CLpCogި ɝILbL-,ajDž(H;$_hBi0t3s 3M:=D A9MV+s+eP)1bqUפ_~>TDKN 1bb y-KW"CJ $VZRQu6Q@wVe.t'#w:_,KY٦1k C[ֹOz.դQkAXZ!y[ 2| :0"N!bY#O0uMlG#q^'[>qXD^w$XrLG!I^(m C +hrC E7i^wCX+_p&s0F4H-kȪk"N3ӲuMrL3C5$R6% `Ղ`I0Sh"Ӥ),ޡnㄚεF U;ɿĐ%Px9,wZF+{`6tB/vS-j1 PKkt tN9n{>M1HΧrw)Yp#Y5sCQSxAF^)7)-Giȇ7AGa byA Ubf^ ](Ͱ> Ť3@# @mRQvv .ofQ3'.;fJD7? 멟\Bzop9NWmϊikzhk'EP/?jí6# EƊsFF*Q`.o&Fs\c.}o^+EKvt+Oй|_.3PT~wXACZ!:_,E{b p&k[$'=tP,G] acD}&܌TmEh6S GEBw. O KJ]U*{)vwK=a}o(a!؎v>+#gLrH]ʊt1'NښDX5BU*ASPU/L>n,ʫ{C #duQqjQˍcZfsF$SFqޫ/ZE"u6|-VZP̣ Ikx͛7\|y\^wsh6 a+&0Vd0eg:]AXYLt JI9+W.Dn(!|T؃Gk$fxT`ZveSȍ 4WA̜?F+a} a<:r_ntcq;CWx#>v;'֏+SNhSaY\R du2S!"F&1`A23z#$VdAztF? Zu>2)Ӆ "XR#,Pi%éfj 4iPTc ܨ5>'jaC/٘5Gг8tݶ=ij-KwYMji74jsW@uq1+HϿ1<ċ+5m硿 Aī-iY})pXpW(ױm0jxP*H]G'kDZBeu n`'b/`fbA#8U,мDXZ"^yc A9 '㵻cqMړ6S}Evq$Oq'0p 3n΁'pq&ޓ.܏Gr^,eG\ 6fӶYUՃ*{xO3%2ڪ laJcRf1DyPOWK9 &dϿWv:lJLvׇR"zI S-ʡxʭ4 9ϝ'Q7vz浃j"ə)`evt@cԼJ,0A5yŚ {FG 홾TH* w{,/Ǿr{fzVaNǠi XQ5$esP]=&Vm.nCcv SFUi?:ĘK\ dniTWVm tT62W:-bqza$߯qyA@S@/c)&&B AzŞI8{I[aAM(2c5ed+U`c+#PHnP ұNW=6!DR5^="2 beE99eL鉆8>|Z) )+րPydCiѽhN2wZ CXmhpL A\ˋ(XTY5+ÓBLg5l/%d4dOh5eT=? +Y8b0x`۲И،Eߏ{[PHvTqYK60=A,)&I^pP/G.!ٷ@ >K\4_eC>#n =dphֈ2K:49wS:q8qt\mQ89}MXq|9ݗFna;_a7h,FTX!sged&9EeAPFWj dB1O+Їƶ [PbCY` pK Dq-G^gasJ&9 6gxJf[hpȖ9{VNz j|#ʗ&"y͑~$3!$gVi6r @E>c´<| xc h7o̕A1{%{s)l/l;k 8^& {br<%&$[`;rV8NZ$,LcaAy`n :c/N}tK9axSen=*|43ۣa1a9X ung3xRSQBq4_dy0O>\Џh;qHAu0sBY+O5JՎvC^%qWܹa;7Ewc@֞=(|ݝ;coJyGceyVsw$dQ+XŊ%NJ7]jyb^{u┉ Ym=#w8if%jMQ3sLT*27Qܛ/y7[#/bfLfl5lPzÜa)!eBHabu@. c90^'a[L- ;̝f<u1 F BcT-퓀t(>̨ JUDB/~śLؠp=)Єhr8\D#yoJH!5Gm?co~>-̳ʫU/ !bd9?-qN P_vD+X<YZńvPWcaW\*m뙙Px%<^I*+30L"ar}bZ晒%b2~f1)-Q!+ ˖O;1$9vEu\wIlN<O)oxJD3R^\g~>!)\d+8ru^67~"sqxr_ ¤s} I*%gUClidViD.6! }f! ;{ta--Ӧ"ˈp\s.us`ų1x损L\\R-od$\>߁ N6,uw C RhW&'p™ c`7&XBJz&#}|6vIٞSD ƳK~k6͟8wMІTZ}h*w=S 4S~(0lW+Qo$UVKUCc[\\Ֆ38ؓTY*\g,tvKgMtI zˢYbإ옜~:D#H͢NZiCLr5$FTl*X񸪤oONMQZ=#?CxҞW3zqO?!8G_qe3ҕjŲA,@HUQLqTSBTr#{4;"C[7Ju+"R$! VТNCkA8,#I 22! Ur3\3nU6\NsgnN ?0{{"+ZN0s|i#*;#1!j4ۓ95M롸+_T7/KTkkK$\/ǧ×۶Mh qJ T:O,Rk\J" )o3n&g=.F6_H`lr)lJ-.۴i㬁{Vĝ(zff 84osm!^n"QN7-eda&?Yv6K'ES)JZ^thrK%*Vy\r,Coq?.wv&J}z-./k40i$MŃwLw\=֓(a,ɀ432ǰu2HQؗ?f`@]ٮ^+Gj#/[iT6~vqOPz83iɫK,'71ȵ}|!vEAz1L !כ/pƒ:O-(e~f@fx&=5e!'Q93"y2&)-Tm-v*WdžtJYwƲcOE`.7fOƂ*^0w%m FΰsFD }칛/$hh\Pq\MWPq}Яܹp>cg=}IM}'+TM%jT?B0{B"r4?B Jm&64qEA1.~{a⭷ZCƝ -=U˛׮>˄G["[!OAa\͝]i?+Jj }v땇>9{ic/>`5EHޡCl ?(B &S2t?U05x8R[)'ކ8tɅ~=f'A0 E̦{aiSLŴC͸sLp|7]і͗Q0{ԂozPpL4_)t_/6p:m|m.189mln|8~x鍾L$2a+v@ty{/Hcɱ bAVfOcqLj[[l8;_ c iٯ/D&{(1%VK/d*Nogy^WkN`e ;"byWױn_fϢUa zE_#`;f=;;9qO% >UczpctD%BauW$bjqP+}e2_{m_`fʾwz%:Qi4Zg^b-G^BVY"v ]WOj'] X6= Bm#ףPU D\\ݪǺ^MNٍu?,[X-ջԳZq{w_'?[ֳ~ɉvqqұzt q. fOT1+bO Jv m];۫䳦k3NB~od( D,c-ه;!<<.>OE!Y`Jt)5d|I)@p{+h[vɱb06 <#7Q 1P^& QD?n_^A F/+o +ۙyxU`1v+!Esϕ q6IDƵērE#Lk$KˮwtYXEٷؐKRiplDN0^w!<ˍJAF~7$.Sg`5]pe]Nts2] ,B$J 4pVw!IgVng{U*S1'e[z6[Fs!m9J"XXul\4teg 6Mg" 'rYhu֗Vٴ+1c x1氂tjKh@.)xa\Wvk9IL?\^kPU_ ۱\1"'=s4mgITb%[fׄԣNA&"M#aU "c*p: UKA+RT$DmшM.[ujOA?5 "uZD?>$Rh V钹جb A[6l1r䣤zp DÜ(a VwSiOLJv* >zJz 3 [aGQǖ%ĸ › ".ԀI C>I\:9%ּdQbUϸ)&g6]g ǩOyUm+Hzyt%)PYhz CESc523«tUM xtŐ~}JꇝU *}$殶X ehr}'a!W\՟qi6 VwcǶ)Ƭ=9S#dg|_% )gNTiZI^8Η 1=ʋpS*O.0r@D֭'[,V!OomVG:P‰%' #t&ǬI۲"/>c ؄g#/&D9aQ5Q _i* ,sLܓ$&Gφ+G#?]q?|?X[L+y] Ȏlm!Aɇj1X~ O ^>:dTF׺23WDq=/ 4qca'AbQZ2>P0"n7%qzu4@"g)0 i0KK˲ ͌}sQO܃<P wtGIdl ]'J$[Yk_:xͮM7F{oH~XNس;*l Xh~2]YQz6uậP8`˸'ZԐU$@ Fu_D1g;,Q'davD\L1+#[+YZcW4ue5Jc+]BسF N7AUkHG㇩_.)F{OFشBXs?NJ$b{4^@%VŢ'{Sd^*IŤW HB?ўRncEile牸efX }.4^UO!{' zv16n1ԞKDYa.S[KSlL "61ceR+q;RL$:u̦!N|ah_!Ba0IX!u&t]sُ211Y0z'_r$+5H0̾,u9x QTR&1e3bc2bpɥ)Qڻ/f~4A5F~F|FͿaj4b/74x 9Q/^:Ai=*)K讑q9(kV ˖X {H~{.d__=W`-D ɣa沤V`pTc:S,=yCM`O.4]ӌB /"y#)r]p ;"v+ Qp>B(jwY.UycZ}Wbt)aq!8,-dࠎYo؜{gb88@/_ 䯿R]^{/DKSb,SNAKȆ>,Av̛HjI].NUnxi7[Ko ?LzI)Fm9}h>h@Z "tjY:\ xCA:8IC g)݋ŝ?.vvvM͹:w>;+ل{J]JLmY]쐀72|v=㭎_y;"s"R~uÈdʗs1vhY*vg֊913SK^'/=›._cXc|~/zǧ.,Q9" 41' >\jjpʓI a cQh^z>QpJ?5$5Vzm7]t>G![cgizui_8,q(Ē:c M~ UH0Jp9CZHz|$o& 3l}K\—λ ^ވ1co`Ha8)zGE~RO(v/~tU,/m':o$?2\K1{i N"+t! xxY[Ok&s ;`8" glSY}VFHOK?wUș/.B'}qBmq /WϏxY8zI.uc7yr>0qgaY%x |M@g Pj!"t]R/H/ 3[WM2 <ѐV+U)D#F'L-փr?ER0Ήd:{OR2waiXZMH|9r( d^rK;6alS3HlU:[QQ0HGI+Pq JY0J, ]\NIϬ]/,Cr:$vpSCvlG( cKUug.E1d8N< )]Ǥx.OnxdP`湶"5\NRAo7nSAJbATf\Ȕ81>O78IeDPOLwr< )A$=:R<*;O;{9(d`:LqfnFTƴU!\O!3_IyTo> _y YhHD6Hx1+FU>S^=蚎P]k}Rxc#fއ/*:Hf*H*Ⱦ_\ĦEC2ҍvRmP8܈qB'Fۓu /'qOO@VILڤdVvPb$є?˟.+=uB`xee{[My<=q;ÚKX3,cp',c2+/]6-bǟ1I+A8}@Iw۷??=CGĆEzQ_[bJ#V^Ma]Xj%oo|¥$ph?t>OGk Yfk"t`j2E7iܭ?=h3Z,C?ۚbxrjܴVr,`J[ 975.F,]LjM1hBcx22cٰD871wBോ`bӻlƧ!sn,qhL!z<;Un ~根PzN;:|dk*ns fV!wcAB$vdV5ė]^=.$zP!;,GϘ[}do@knǪņ;lV)x8B߫17,oʌ6;f u#ӟks.j;hu*vzA G'k*[+i"&'J5 zoޟ z0):vZGK3fV|;!_bCe2 c]WA\y F,ljB4cfĈ!pOU})Բљ 4{b[F^SĹu;(odQI|mKnxїyEG̴dćNoLA]"s7K68t(ˡyJRfj7vk__v>kuD`iOv@"yy_uh [Ј<#,g/=3@dž0DӟѹF]_js0&[lA.i3ɋPxߜA3`\A< ZSNi C-kN\)^P7Ԍ6f,2'?fm+A,2J^#G>rqεcYB9FZ;.1dQ,Wrv<|qűٯmGP3uX w8q*TЅ\q1~GV%+wP4.ޠUtOrFm_sQ]_ع@|&%^ceW!.Z\ݝhT'Jz(zbدUL ;\ oeRGP?~ Eի⡫W$7"QvBLƠՐy$nX$w (^{|>6.n.x+pWO63[Y1]bP.4P zy{|=7p˨,T{KX;_Fe&Ri#sx}| Ͷ#*O>ϷEZm:dA{yN+#9FORV@{eGU - rk~ґa|nR_ZۮB!4caE\`yy*%k3SQCߘ?#?VpR b鲼X(nZ1Em #pw+zݢ-ͦgps\}yE )V,ͷ.LO,8ēS[>eL1nX3c3RZMa9-:"'qVz=WsyfT:XX  @$zTW!@^c^UxϺ/|", ɞ<ىI!}: '#vVå VW̪7tG!푡-ʮIJjٿDz_-MX忡xVz[*u}'k콯ˮ}kiK[{8r$9²s~4}Ba,nGtc ʅ 4;X T v9W|@lr(+. GM(hXQIggb1XzXE 1S{pz|L5ςUz@Oj"f1{H%I G'HX~@чb%$0>fEݓk-W:~ 'r']:<59U jB" j_O0[nd8,u{T$X Ek8IAf6&2P+fD V"u&ȼax(Va?1ǜ2.ge`)a+d"@XSEW- &vskp ,JoM6*?UT'\Av`pxV@4[ov{ū(v bgUQ*(O^uTG<-ƏU@pk6#AC%'Gp_h+ zeBm IpQ3NG 9=X![^ʌvϡ'^V 7pe%xl8t$a&%\]v[۾En 'ٚ(jBXh~" bĿOx0ʚL61W*5]n2N`cf1\C30G]! $PUǧ58@`P=+K}R{ȸzsGʄ'WȩtG (ݬ | ֊.>:l\'Hf [-T0J50l০~}O33U΄)HN@I̩))d7?#a1W^qejf@h(|mwv*PEnP-7W4Rh|O ?bqSnql\5& [>C/, xx"l,o <;2Cʍ4Sa莏 =aiRH)UX>׎Dx0J̷GgPf* M$TXy7TJgpTNQ2I(MyGJ+@! zP R6_hO[}jH8  f9a 4yYHv%xET* ]KUOf, XVqr \<1Op/m2R2B=H{PB^K,s;/OhDZn2pH8+>mtt <{'~dP*H‡ {aTUQ=Tt(UWY_oR3&\O3Q"%I~=܇4̿GzqӺ tǕב$P?fI)(o{X׺6f }.M7c~J ȩFRJN3)]O\&j ]&{2بJgfp| b]rRh`loCvY^G,ח(ءȟY(K[d7.6~)b,U]&= _|6 TY\^7kބ(t2v;ġFN8%] *z`td;S3l*C8[/|"5-_ 7\M&ȄEy!"in#h1,W!mUt`į 3&=R[vЦqyz$qc'0/RC!NU2{ ]0%CԔ1w@p2tHTYU7/^i6tޖf)&$Oi׈^k8Y-I#Hd{B~39O JB],Q>4<2ϷlS4(bs\U{XAv;z1`EijWϾ/^|mse*WX뭣t*". _|./ʚzo聹+h򎄧_w4sٝB }m2+Q~6kFЉ;۷Gy6fx~/Ld2|MSЄ~\~!~oE3>+BGmPyŅQ,/2 đ+D@L=zXK O5q:mbћad%S_#'ayG?4C)L6:ppyE}[?"PC(<5Fo!QGaO!n S%SvH =߳'sJ2HD vxfgw~ 028sj|o^IABk0RL]-b܀Z'.]OGVZ/$y E Zy`>5Ŋ!Ye l3`Ɵk^|7%JkEl!wp/e9h@EDa}l5DUwF8%q 0%d ,gMԞfi{!k$3|glz)П -t 6ߴDS+@\e@*u_ёay~m+}nkˏݰDK$d'{M%(SH"X#z"-ykQu~uA=eV#Bt.CS~@MjnE=ʣWk yӐ$6Qy{]Cw7|Zbpג.މAgcS` ,>U)ŶRZUc^t qȘWcвcRgLجoYѤۄ+m{q{ڝASYW|\ܯ_/'DE||١/vp3>oWOZ*lE f*.[.[;lV&T'Ww!1{𵼔QvDw6\fo7+Fk 6W "Zq\Vv ~SЮ{u1)/sd@}jܝˆ*>Y:٧~t1hF{OzIJx-i6yӎ zWF#>:bQ]֍!qR@vNG>zKvsck9v勭]22)s/N?Vw%9{cѴ/7@GfY~yY5>t#XJ1ܸ5 fzeZ0((2'2ɯNO?MKYh7]S̤̎ vqtv9]-GK9X#5$rDӳ_Ub5COYî˱UfTs emG~iھ.X4Β饼/Ǘ;Wqk|K6x5%䗬MC~']Yrק,~){.J`Q(a,C>"aQ=aCJp(ú2SsɅD!c`Fek@eҍ?IjHe18sK_Ǚn>P zi 9Ĉns8YcĞA+VsR}W8]rz܈McW(h- R. ہ #"Y!-,2Tͩ9juku;pCd ps;Pz^l3PnA+Z|yzuũy* Wk" X)K' 9_tAˀRa w"3ʳg`^K=["9[%cz*=s1_tٳ^oɄJ:K gLjT @ەǏ"?P粋@uQa1=%A/X,gN^5 OngҝxZG뻈HWS( 0 $R@QbS)Ga(qx2$c;s̨vF9%dg>aL45VL< zb,󰈂 Ao[°NY /2m~;6n9 @y^GfYD-ЋI Pp*T&nVr} bd8׬ܛ+,>h4DK)B+X`?ޚ(+P9ިgzBaR <:"#.T}$ǎp{q(=4pb.7p[dCmkV|Tz$r`/NFQt|te-g4x8E+ |ve:5ǃ$KQn9Gk.SBM.{"Q/-%d|ܶü \g2d{^OB j)CfgL ;g$Gq_>{ $ITF]r.I1"cR5Nf]c%cN/ SY'2:z~2x{%)P6) o+)hT<1T-Ys3?4&Nd]uKvqq`M48HZ,ܧ~Btr6x(7h`87Q_)K z$cϘE[a)[ ƻa6bx_[I 1 hKOJ *A0a)n dn +=KOAu$~.Jτ3Q{*^d9V;*ɶq8D4% xcp,&G{ 1Mm3֑ZoG%=wƬn%Tsx&b@g:)|shyKhR>1P0wo-֘VT_Y"ϫ3$\.pѪ$ov!ّdm{)3aMhYeZ\ 8~dLYϝ6A܇cQ`76wPr('LA+V-H `Sj F9jl%kf嵬Zq{4Fl-&/.(aÎ(>xuKi=Oi 1KbG;X,Rwx@U!WU[[W/Q+v>vQ(xHCTP01rh8tbUuSz2@Ɔg( !dfB,VCt;_a!2=_w\EI9b:y>oRcN G' 5[F_J#4-N'6kgńF"|O|`?؃8x/ȿ8,HLU={C8w\dW$ؘJ 8lRЃrŅO,;fH0v2^݊zj%t%)*&N9|s-rik?S"Dbg׿5GxK%GS`?Iסۘ_6j1& fWcӲ yV>& n[plؾb_%yv{NRb aoD fjMޮ>1<mjUiߑ`38r T fEU;fd1ict܁#".GNQqvPL< q;)/Q" jd5D'EQZ#UbX %c(p~cm !mEjAW n0a`Q OaòxͶT;Nm:JNcoE^&YnD^X.%X!;6GqRn=mk k ! \|!>_ws#Pv΢o2;!v^b/+F a5^I\sGm/9q`8-Z؀Yub $t!`e~|Vj@x:Q gqXGU'p=q2Ot1A{3]&[VwBF;bv(I3>3vbҲ(#FQJ u!@nZ%,ݨbi nl~Ţߵ>1*ˊE0xE޳I*b<%L*Ii=pt~`;no"MBr  _9_4_!h$-m^rիTSU&6[4 Om\GxFRP!t_Rɭ;5ˍؘb5kZPXwAO|C/ʷYT^\\ 8D}'DvV!xFKHoY]ׅ'ܺ<>x(zhJmrÉvSUFSdz?{ lWxKl2re"x3[Gq!aq 1Q}{بKk?Yi %g̘6ZP9Wq̖R"V5sQӕPPΉW:j(@6,0J|zw]"R+]c4 "CzDD:`7`fͻQ'd8:B1$^~p(tg[QW*5{ح9WCsx2,n)0g¡n|\6EPxr]ۚKHTW&i'l u5orV|e'IZg, ShoE%ru C@nh&vʱ&,͆p6a#/t@U װw&WehO J 6mnU;[&-''BZYzy[wM&SY?V| )"itAK *a Qt7´k~#cd$~;{HY)lr4z8V9ZM:ݣ:+X2-~wD#sBb)IoΑ`BKUF2R Zm@ن*SLRU9"ietJ%ymGCQc]C@#=K?-w2oR,)PS7eHH Z"jK[Y* Kt8ߡi߈&$_LK7uKZ@AV7N(D h|Tl5"$cL*ԍLPJY+j}fÍQfBr8 xVL-+ʀ=ϔiύFnFla7.,6UGYBguDSg pnNbQ5,qY1+2%R.#a.N$bMqD HKKܲROH |eENhI7o H'ͻ"-`M|;4QQ4JIf!7/ieZ^w7u8WJ\9G+DY*yI!?i굹l8?mK {u s~aђon,ˏ֧)\@$&Z"cke="n/Ks7%|ck(ae_r)$㠍_?;x `G_á a:+ N/Q|Əokr My" 8_ldo1G@1gN46'~i{L<~#P&e&7}6_*#dI힊9(N7D=`qx^lISk~:E~CܑZQ zRX܅8#qD?۫-#Ixq>z&)?UTq}.קu5>AxzBAk{kOev-(5MO`a ldmM$ewvB>̩給zl  bNXDFڣyzy:]v[2n-8{--(A{a.X0Sk'6-[ ?_=x݃-6'sŃ֨IdDK> .\ʃ[ZѶ,x]](WTb@_?UR3;6 v̘>95Q_RmAuB'Z :0vFsfz3G.y{V>ۉ |lGn-Xx[?>O[-z%@U=CŁ}:>rG'4"=dxX=հ=b 6X| L]ǎ>tϷBjI)cSg ʺ.lap@ 8|KlTw1RTinȒ\{#]=s?sp$b? K"㦙 ҬDe'Bů>{50!d$to,?9Ć16@ @^YUUhWCB}_tI=b"+  "ޯ m$NLE_03f=pGF^\=A %J@AGJVgoU4xLfDt ƞ}w 즩2X>@llD7SX |O}&1(^36>B x >sNB!LmlvpBl5Ԫ1R 1@oBsΔ-lޙC0lcosb쐯1IT+ HU-(17IqHuiOI^G{^IkYeWhJ!3=9;[Xl& ɱ? ,IyYʞ2Z5G6SfYpՅ=ӕysˆQV!9<4 &DR(x:t ]7OH{x⩐3`pN6n"أLNQ '޺uW0 Pe34@81nj5@2<d NL(Ƅ(+`E/Ne&^n d0ɖuL{J]к<j,@pmuz(c]NDٕ~L2ZMl~s5l^8$9 lA?w%^˛ÃPͧei76ؖ eLe4kOt{V(DU@ +'e3R,hܽS= #.Q^Sr^P5Ň&*&PJZ5BפlZ!!ɼWÌ4[;`[֊hKuZ "-S^{c~.6m}#  8E1gpy.XfҟL_$Q`wrrX&I2 @&zMe5ӰA&5rd{G҄/ *@3X*뻳y'%˦ɆLef)_`Cb wM|j1αYK݇nA9x#x]򇥉\ӈZnpÕ'Lzt<BAmud)sw/-~`es/ qQ)L-KH@Enu$z?hgCtCT-́3jF-uܽN< >`kJo/ F<+5didV7~?{ wAl>[FBwF)q'p>, VxG7ÛW r?WVKclT+K Q&ڽOIWxګU@Ga{{؝@Aݺ5ܳ) .1DzyiVZN, %N7Yinvv_1ƅ.RRv1=rrz\L`0:`!;ye=9E:X4Vlϭm%*yL`42M;N?PK根-PKy.F angular-1.3.9/angular.min.js.mapZ͖=8S@{A(B|!D/nZs22 [m{[Ӌ?W'}yzӫ6ϟW'wԮ]fnUTUS鷧FsY=i毝v9Rs)vK :muϩnhӠtLr[nsjv!좦L"=F.X{ݷᣔ;j_˛ [~['%mK?T/p/Amp3!P} K &gƃ}DDvx@~٘WqWq˙ʌZ c6-!πi?ȍRը2.R?m0o~|W[m~CZO9. 5"R]"]仏 +8lDF\E"c wX)G lg8`'hz]e0 OS9%蛾u'uFNJKܴ5FoA;5PM| m뀻e:m"|f 2mKq0;jRj1T|'` 6$M~N!^i:Y/Z`Ie+#A!e *b5_W4~s & %J[K4`O:slXojPwO.!?z_Qa; )ƸDj wKPg 8Sˀ[LiaT*#|Vh8׫}hf Y42lB,֬Y7 yHXfz{KY!GͰbznd1xdj~յ[[JΓ' ]z^֛S3U!~CC %47:_ꋺ_z|1a1W2>#M6c>$z$0K7蹾)O3bRM{{eR}"7v"K''KFKM@8҉V7x90 cQ&kkZך MQ“#ڟgZI, Zt0qGћBTߘ^:bI:w2CgPlM=Fl"B`u}ߕ[V`Fא+2{e^L9H#E0qAf_&_N]nt)V}j'(\| x۔{N.x0`QmPWxZLC dv[9}KoBXOBec3l:dz Xytr@6{$x2;< >NEO$y+ rHa'7sM_’Ǟ22?ի~kvE@?`NVHg:m0ccV: F.k#iw ռٷMU0uA3*% 48[;H7lAd` |&D3X,xS Y52X)cAu/Mu꤮i恶<~[VP([U2t3lw6L]Hu}u9KU^^qp4T+8C\9`\{R)7zOjOɚ=0r`uq0S0k0Wп5G)w$FT"1&hwτsƔS^ʞI tbKxz}>.tSH&~¯6֟S? '%ܨNS׉z Y[>5.9|O{6?m" ns^:9x}T|h[B*p"txgܰ"j;)px;AlL]rk5x4og/ZG7EkzQ(v:b>b!W2?VG CNM2FqbZSHV3*guV7;IfNP"?`rFtlH7 V7ڄr&}Tg{4SҎ1'q^ŠË@2YtkSTFum~-T5$oWxx놆ne}TV.$=gWs4898_RF5F-dmyp)4uVmhU4t Wbevᤎ&1F? 4$3o/KƪBVЈS2xFmÀN-nВ9y&j[リrym;Rןg!S9ʨ,`nzBs}+T;kDҕ,)SINy=%los-W<L{Gh!h×7wYyo , Fyt7(GBSpzTn.tzz2 ^R!h|R@Wbj}1%Jb9#[>B[X`WHsJ7+Y֋Y, Fi;IW־fe<ݪè:sQB*5*nK-v;N kH 5GCo'Okt;3h0gA4jt%#]/X]Xw2-I%ѥ C#Jchvo!R(H>^1xb?'`wn槤4z$dIY=SgPGZ0yذ# k=^/zM Q6SKq^FҴyX"gFe58t9xfr8'=ouGj]PΕ=&t2$ߍ f{OBOri᩾(K ǩ _=T(;D 5H.jB;֜C&/c`-B:‘Hl+{c3 J)+~630q,@~qWSTtff|h^XbvmI2 1$m6AKmq%Rw6= b5 #'^e߃ Us͸[V&=E!Ea/ -gXv`Iaj!աEՕiyƺ&WZ] ;ɉ;</N Qqa¨h;[_u>N㮎C (=1b^7b#8mij J{=ݘ wګ۹l󿀠  62J\GK:y%i4[S(;Y[#;zd[_AcF^XW5~F]y]b.JaYI;yS/5'cFKN ,Nm52Ȏ;Huua ڂ}ccǒn_wztXꃱ([P/;ONǯNkX(GψάTOnĵO.S\tz=h LIJf2mGV bp4d"Te_&trɓ~Z§dU?GS]c@9k@8+EQf;7*dG )K[iVzw>H cPnC쪭W5+Za 0puW?,T 2m-gC4.lIE3i)e sз 8Kao0X364禕E`VT-Ut_+mlWTah|hT0+aƚ=y_k{~s8ޣO>.XYp.gċCn.ʚ8 IZ;>tOv_RAע2us iJqi} .>S;UrQ'吅6كj{bLq 5l)*54Ath䱌h+`hx&?@0u YVK?[%A1btmrn?} ͪ=ܽ8GL؁u盒Lkxo` !z'ndUDnnVhM:jyʮN`s2Ex+SF]sx"'$4WEzc$E3J]T(/M|0ĨO K݂$(k}e,C1}-YFD1esĽD>o9v{*+֠Y.͠eQ ͘-ԝ?QufVpĺ4[N'uRB|_V^x]#fcQ7a0yOt-Kbr2Xk+]:JPAB{Qn\{{2I\eq?4!3x̉.t>W=:XL8+VeFLZg+[*Dk_:ayX*BB@jjwGk6C:\&z3}X06$Cg:6{O(K'GܲEADG²1~WRF94Y$7o&9}h܀̠%A&570/މz$`^E+;>!Me0t ia_T@B(~OIR E8ٞLG/ϴ7/u-)0[eߜ[qη=kLY|}wu6ѩuPimkJj_xȐL8y5|By^W4"XiXJ}f# P[&FgG]~2ruorIA tB_#ᛆHܼCzU]OE~t ;nR!#8X9r٣c.j9 0+(`bͺğhҢnz3J@;+Ln-."P;N7rd0 q?0ɟ"a9b݊z#a`9Q{koz[?3(KhnSzF&]yogqxn\V6]32"%,vt@FN8str o$B/5xYtл }7 v2 g%믁HFy-34~vbq= ,IAd{,8ݪba5-BQK|} =~uc$Qhkl@9}ԩɛ4}k:#^,v28@>F򌬜C]Sg>ZWA^x/zst?Dz lo8j  RCf"#;Uҍg3W% lS@}ӓF5@ˮ>v9>݄M+HwO]V5‹zᵎVTQVf5o'yo1;){zQ.1o,eM6&<]m\Y!AFY;G7۵L2Bzn%DiBGnmXӄ{ nZl^իgE2Ϛs`^R+%J=`5=弚ݭCKv"[)X7,ۑ gfl|PC#hQg$o,bN[}:>Ԋ}ۃƀ!&5ˍ"%oS!CA299^w!襾> -߻fk*FZ)`i+MC{g%N>q;?T'W?E$B+3 dza-BzF4TeS]_nfT9RJ;ZoeOxf@SN^'dQlJ7m0` U [ s  tyUh+CKx>$Pζrv0:NrMkyZ/$O[gpR*%T.:"# >fxk-C ΅WS mdfp!޺ӀV\^Ǝi>6*؁mĞ"0)pzfCm~ Ӗ,v SIH?o[o',H>i8"eeI~SܿuEw|޷P2S)Z좗RHrl(&Ԯ,y dyS |"`Z)eɅ;i-TnWeԃחJ:>旗Pdf^yt+(Lj9mGICZ]X$llu[ʹ/yeOgN_wx+L^f*C}t޺ᝊZ2[TX ' B}ͩE;g pQEj @_^]k[kͫVõZf[b%яD> $K,lRw|Ebwp)MEjieG}>aNe[LxvKeiȮOmCzb?UőJJڏԎZ,}>Xu{, M[Ŕv[ՑJZ&}Sn/ϗ-ܩ*c>uv+g]Nm؍ZzwV.yF&|pEgaI*ɥU3i-.*kq{m^a@GoG]6%l.m{\2kמ$Uy?s<ΛE5hʺ0j uI:$w;Er,H">qyj{t+[n4H%pg}\cA@5 q*!?(ޟGA[|X{2Bi?~v8}ko4ѮMnλ>[')GsS{{FyYʕxfLh`b龹V'; ȲՅ(X [%t5R [U5;w1+X;V>[7M|4k\ Hd,vrXN軳`u{c H# =ƁCk8p^ lP\e<,)QXs'_LǓtU!j9gX\.ӌMndLa}2ƭ7T7z6i ~|bd%<(͖uUƛ}u+FC}o)j/rSqd Y!}3gc#v.0U$H2˵/7"s\MX,Ii<֣7] aaG?+oN\ HH[_$"S!j:]Rneץl;wVxܼ8> 0}y.T-;wS%jWqEEENdIX>8dX5w8aezk0 t:vۣJ &ehAR2t\Sr?l|}4ΪMe\e ]:s0?zsME3A؉qhq$^+Pz)RJ{75-fdT4`Nd]\^5'mww<{Y_wv},I h<\t]1z/}jAکKWVb4tv!=-UѬ,)IRßSùDK!mG+Zl\}P{|f =}ָӭxɉUiL힪#1_! ͝Φgu)3U"wbt}Öʣ?Nz!Sv1M(&Hu8Cdϛ]06ITگ`΅b\ 790x43QMFXMe7IpQ&ZdnX5C;'d" CȆPs\,F pw&C,RoK-5]凜nBVk3YQQӕl:0hx/D(c%Ph99AwrRFMe~qTS 6jt˞Õ _l\!@b`?E'9-HseLj}%!\O+cT+ۨ b-mG\OCGq3k*926fuGY|Ik/3;B_5",.2\Q?EVoLM ȟψjNrW16L= 1w]/.$@lF,d Gj0HGVӐ&''K֒?ߑ|47]C$d~񎵞 Eʌ懭Xxtj Xp6l17>˙if'.yT;,3ĨQ]h@-i~ g|g1=AInwa-b}\eD $ .x`֞W1dJZ ]06 \q@`}෿9 +4Aj팛{nޕ$:f̒.TՖtgM׫4\F]JfB^"-o[Vɟd tS@6B0"~f/=rD;]N$ӱjU{o~ov1\c4;/J‹6+ܽIl˩joz]ÆU%tȽv+1g3oZ;77 : iۥ7بRR٫} _eTj֌n/O8|c:l9!1ǂ5_ɯg:t7Ķf`Y:-LeWmunnt[FoOГw6n~Z7k9ZO΁_iڛ⟆ENȭ^,hd1j"pė(W$n=Du>$닱f91>Q0a`{͕+k?%]dpu_e% r ɡ20|v,c_p%}}6d&]Q,8/(sј!08`p\UIаs.1/j~gCQjJѵd! `o/|NV#+:h]Rz''`]lJ Nbp(pq dPAG&sl|Fޢ-+|s^>hg `}/szOZ=NGMjϾ4eo=S_x}ߜc%$ZIXU\Ru̙OԓpI$?P8}U~r5$L]~SO?u \YZW9r2fbn^ (`ҕ6{8ͧqҷgt?é=BhdS"g`^ An-]smD̽g9cj >YVk1~E䞻\ XCPRIf.ՍX3ץgw亹fR o7nF l;+^H7e ڧܡJy{HgQHBH*oTɹ}c:>4Z(I^֌\2?ާ`R%!LFČj-y0&QfdOghu8(KRu\fn13YΚ?ZFc&pjNpÛ:#١YwO"[Eif:gm ]m ;{o fGXl&ǭבb7j\@_yn3|ccb4u÷o&UQcau{k:Q,:|l kR3Κ`pdgb>)dY!kBxBKAfvYKs9}McC\"1K AhoN:Ew,{!y0"*S,t ~aaiöUt[C{"|gÑ"z&\D\n3,_*V dp䓬}gV!;SN.!* 7,/cwRa5k%?^I0с8{<N μ:cg# i E=bkC4L:^~ ̃9l[@6ijYtj#ϋ^Th)߉q-+OuճךK)83C~/#@f:wS/tqϭKI&403-ď>BwjٷD(T Ec|ÿ> e+ I.qh>9Yzs2`B ޯ)g i1fQ7앂H茣6Ĵ5(]:D8HXkxmG`QN*?C]ԘKnV訳goA=y!x7 2w8#áON5Mt>g (vBS5S8të>؈Ygـqo 'ƶr}L&'͸5Gka$x\WD+~.ԼIMR 卿kW;z-Vqbx_!n耷t{BǗ,%eQW8&LC0mW;RXW;<ѻ񍵓qo|Xp B Y7vGs9Ne+; 1$QPcFt8H 8 s~Іoo 졜o[ KVk~mwBdqY1o۵NfGZ,ڭ`!]3} rS_òLg nO?^[v+=;]mu5V4 3 BL,`xEcA-r;XpX:+ж*z6qrr>inw6Z:({o)n3\u+X)YL{}_5|pē[5@d|J{=\ʹw.䓓ch6z?^;sI} tEhMb؟| kro۟?ܗJm|J[*ՅS>"5tP=? ȿN2 ȉ['p3|x=tg&hwU_рN,$Ss2οoҔq-.G3cwr<>% BHr@+,asc<Ai0RgeŞqXs^m!3')^,Rge%y*TڷD`erюӑUUv\h/}-Uߦ0xvG| TBrSSFc6iS&.3{ۥaojs@7raOHΧ[[: "68eS?ǿb?4~ 98h˳r0 ~'aI`N>RD]*SefK,(;.cԪy۫0,HХ0:9ᇥ|r_'y;R#Lr|=(|!RTx߄닼[<}GpQ/rl5х,;܌jݬSWl#Svo {'@NH/N#Y]<˳%vpG=ZrNjl_RlBqVѓ$>UOihmb~ p 藍ĮktWeasck=@74 Lw\E!|=՚{R/Ug j-Ft3nS6Fvt l"LaPz Lz>Mbbk}gإ<6\#@8 X;ڀD~іp3Oݧa`QAO۟ʼnUۆq`{[3ሟSjPW ݯֳFuHʠkZY>dzc dV@2Ḡ'{Kf 1U&EB7z& Q5Y=z/ړnyӺ[F  1\LuC+ m{ƪKYubsQA5h'9dQl5X#Ӽr,t ҾK 1K81讴ႝlB?#+vޥ̿7З|3ޝq5YRn^g>AQص?3/u:־alC54CXnGϬu9MyC?iۮ߻X?o2Dya+?$ߎ%K4dj j{Oj2]H2>Јwms?cY­G;*q넠z Du"1} )Ztø.jjD>x$&:r{r K=ř_WbED;7Ňڻ~wݗ׾xXZ ,3#+9TqHpV>~Ol(!EGEUsHGƦ }b0(ʬl1S+`>.z>Ń Gd(}ڻd pL}}+<0J`܊o*h} DYgvm|=!AjKj6rXfȶimE?_k`~kM:` VCKthC#֞eyGys);Z[,Uu64$qRi0rg.L٤tIUSʖD"f͙߭~!;w+ޚM(9<(5%/]&[}-s8ِy|wA <[_48#3z5`%TNR 3'{_]V7 ݩj1fx}vR$kH?Sawa8mL:bOǶ.IX6Qa bݝu<4~vNBdsG8SU϶9[߉gJљ#Sdym! lRO֧9~װ Mv,9—Vs7T[+.¤%;djTiε'B\9cν.9XjDQFeOIyycڒm6hNg)s_x- 'XR 8xEnjL&(ʜW((rTqO$G0fT=އS<55eqhRsyve@۴$Iiw\TGs5sIf&V}s&6J{dXVֺdfOFT⳾֑J qJi2 \q\3+:Z(hRU6#hȧo_պF+̡]«֥+ G}T:aUmP?>hV`^Ҹ}I vW oau],ҵ"pYۗo|t$ԟ_IC~+E0Kl7=$!ԯ yS׳|ӡ9q~t\x"ruԃX))?y")g?/a:'n"߇qo.. Pr&<CuuV?+ƌ{ ^ j_WlݏB8~߃ IL1h^6I/xz0 8o%_kogUw9tGgvBLfR:M/5{ՍgCD[BA{~iӟ:'U-҆aܺBm>kSczUU|pܲ yjB$Vu|Ê,Ba+TJ ٛ_zf bXtZygaȹ yWcօ!/q CƪdAs&'M;֠v)N؊eZF}In4ic JU -)?F@Z~(\kɆuȁB;8뻾;Lg׶xW$ǣj0jbhlHϠ h&^_ֆo\1az~Oץ 0ArqD4ΊשgK啍Q^=CPf 2f((}pJ{Thi0ViZԭ~Y(TBH!1f~vA  qأ>\gIzBG-ee=K8EMPwxdy hBP9xRyǹ:S֑ǩ6kX* 3E,%cp1PN2;(WoLYUX5-_ >I'pCٕO'+[#LŪ Nh.h=\e<3qL Ngfk8SHk6əz}`n?q~[Tc,'?;p)ba 0tagiy*KN7hb 1Do淊1mB{x;;򤤄ַʷ8r3w$"k^>5ƳSe=PVC 5f9n %J\kQ /uo *.rEJi9# ǥ͛Uc@3y7R\HQ)յ>J]otμ|( ΥwN)41(0a=.Qq..-> ؁hQUfh)KW}6y:a:oL15%*RZe+KfkӦ›kCWwD,LwiA*XdYPl5=zVtjˢd-dNx,y*RL/`L_v0^;uubuk<ɔA%*5YDcDy]hEtv+M}R6QlUqwyhs{!,D<&#;0[2o5e9q4. lqtR;p,.콳>[z}V3fXj@f2OVxv錗6Ϻ)N>b>bbأܤm:|[vq$be#xaa7%wA<MiNiL&ܕh\WWlk`wtمyxo.CItpF:B5B7t8np} cj[UuWBhh5g [0n7.zQ`G*0N|'*8tqTh8ohlpz>@A˾.q_;-ևj6x="tWk>5]a.`oBoYMe\]|[qT}#д#AlVfΫf;3˞W}{q 8XlUMn~t:O_~J!$=Llf?LV'yQ/+%R );@ '`O͔L 9 >IlF윱&tL-WR9v.ٌ3*nj Ǥeםx)AN&OFc Yx﬿" rЈ$, `a_+oz^%>KvK&S|;"2ZvF~{V=e.웴f3=SԣĮ"v8kb W;Є=Ӳ/V/9 ZCߧ;AD&S{1S5 idϰhxӱ %С3 l}'-4|9A;WTq+ڝaT 9}"t?c{]WZf>RD(psw8cun;DB W[ V wbYdJR)=|@?? -Ϡe*W8 cM=я[Z^H7>@:̅wSn KXUN-\XBѵx_TN]/DC9n u1`.MCP͖|}۠=lG,r8H%*TՐ~4WٸuAko?V*~4\v){tӽT5|us J BΛ#7a٭d ~ʗ8W&62mN겯6=5VQ >P;\K\dSwbƂɊb?s`CyFic 5ΪxyOf2Ʊj3 yeJNՆ,rKzlJ@.z?fɟVaB7+1߿@MrS‚s|YT'$reՐUV 5'ڛ geo8cFn!(LKr+0 ~R0g8ݳT[{<YH?B'KLIulq0IP۵G3Y>t{OD[+Ope"qWND&V[հe΃IAUCR[A6?3fr;Wg?|VFmo00[dګ%zsh1N+ksQB[uu\M,ΰnMdgs/ }?y#9v@Z_c0e$kSl-؆ Z+:b@l~v*~InB Fsڞ-j~ +d?E3Sghlն!chuWVWOyn' OݹX _clʱJnޏ5Hi΃Y|Kk } T[<$LkVRTܽ6&\eͺկ hY^ŚLND6mis 2FP u}mi^fq?^gcuo]̌2|rJ]@p'؃@gJo=7쌺wklG~Nv\x=sH[Aw[GvqC(:7_@. qDzo7̴./cA|KUKpdzMuszIZ)cE;yL~ GKDPwxȁFΑ/7Ǟ]<ϵ.U *.yA|Eb) }T*/ >1uY᧧nnk!C3V^L$Qk.=Q^$="Y7!Š}z ]|dZe A)?K"@S!@. Zi_QV<-JL-w=ԀC֩k4 ˈM(n\ܝ*]~Sg*hm$v-%8t\EXIoR¯?`7aK7Ӫ9MvjA*3}j,axFy:!XQ%Y#q hǵ=Wf"q*&L2kB 蜫,KOqWؔfP{V}tF1u _{;TF@h[eesSȎ ~\'_R9Z#v*rZAWo ù[mA7gvE1W.W3qnL_ݤO'5I3e^,jsGѾN}FF !(؜z )s֬5Q/Ԥ5Y7"B -/l_Gm)Wǣ2 -DBtuGwwI;sC}O]6uϾ̘%|u8tx3Zn"YyE9.?'XH~Ks+CLJ1Qms$|a(2fyefԿ7z5-\y;'(26([4GCީemM6IJqlt-}ĝG`4a5lsqk'1TvZ_ŌxWt٤>΅'`],M'R Nu2kq;˃ ;UR ' NO]?Ã_!AFO8%UMdw}_6CO?``Gcl /MpY]yKxRI`)R2#7Uq٣òU]9<4Gұ'R4h++ܫXgVb$!l2 EA컂 4Z+}tTfp;[Jb,L%% 䠂`t Y@T`$E8yiʽ_BOZPUf lsPP}JV9D;p0 }"lZAe 7C2Xh vaG<q6=846j\sP]GJBЍs~zDV7Xe?v_fu퓺Q~2{y$ओ0x(1=P]ۄ |D2OɊؖC$moa/8J GiyԜuR{r+^n#Φ{ࡎk]f vwO7S3 m˧Ln\٦xJy㝘v DjQ@a.d:2!&Wyb|99!xw2{6`s\ĀSg˓bnMѷ=؂1 j~U>yiv): >F{P8'P/r?(<BOt`qcԤoW2'P<($ % JwQF Ί*j߄HQh|F '"[5D/Θ=)MrJO:iFb_7΋8>ȤB.30BTm>͸vr^[l{aH܀Zyq2eŧR;A/X@~Z(K֡؛ULCkgd(WM)[VGPl|t@ PrK;'e? [_ |w@lLK݅*3DV|~0?"c'@MWπ4{c @P@%#nLbe[`htIHD4v̋)=vf#<_iq4g*5;3Qd_ $QЭ?-zd&4D=e;NdS ;Y|XX4mPKLXr04k9H},mʣ7ibefJYr!&ۺ1\QFwV`D=sIF$ vwr+fG`2;*8 ;Li2Þ٣.ݹ=V(ӭPjxWM3&*/j|NU-SXn:BtV[9F& ˺vFUQF/ɥaMs24we}}d5cfHeNzlDu$lkwG:D=>^)Y]<Eoz[hgSGO#`-~ϴ~ <_67)m3jO x~&Ϙ1OJHd[' Jz]Dr)zW?\xwתO\Òd\(˒\DCAѴk9]̟rEyi{E#)cu ci̺GQk t|k&&jJMo`y6!;T4WA\ 24#E{Y Թd=Zwˌv[qc \ f> źbHvm]{JN(ZXw!2VI:hӮ-;aE5cEKB2kŞ}rkq̡Qi kC'9I`+&jQ3i,H|)ڀMa5>oT=Y'^TER<(e2QC Uɞ:KZVV@ީe͙O \36鵹jn ̶m\^7$ݛɡ]S.vUQ1|Q!X-XV" kPn,Yu\?] c6, 4t;gJ 1˥SW^c=!JC]&y7Nj]J)qB]߼*.b}4r+'[$d,J)E罫MI8'#N 8Mjq:b3?J+^ 8qLy4N:}۱H]m?&)c;pPڷ- qrYFN_,CSԋ- .7Y,Y d@*xtmOe5,g{T M-ctIel~17hʭ>>'Tض-̓'uAjthUw}FE:1D7L7!]?0 5 \thf7%*%/`pq :o^tXh`t}n"o}vᅒPv)<_-IN2y&X뀯VTZ;u^K,W) o P۾ӡ\(&O޿oхjA4~]ݎWÒ@ PE'N=䓋Μ:S.z:KB!K[,uJSJ=זO=w+<-dımlh:/8{QEYY<(:ܮf ?w_>*ru Yr@̙{fR[LO9٠ 2Hn#>A zwWD!咇y@/6TnM K =_o?#Z\^FXH9w(_`V~ӵG9Wݒ;A$fm޶/vm[z{/VP YӋ;%0.<ُV\ߚ_l 궯z>eOvSzfڷ8K:ބغx|<.20 WD9d M=Y{oғ&kZzf 9*^f]}> [㱕؄NA8LC2xQYTVqHwNHU8hZA`ΪǶJeN4pH'C`eP_k`ykq/ St/{zݳ{`.l0X,o`y)lx.ap8 6uUQϧ5+\yD=i((1)#*U57/u;e<^et Ҡl{n7҉v79(>`#6Y`kn "s #Z9[ Օ:x2S}cj^Yp&Q"'djyYU'<>>Gi\;/a[6pߠmhNMEӃ cts^.!z!6 ߥm""Z޹aw)BD:V `1Иr1轖C̩M^#cڑE IQw/}ʄydN2` u9J[ZW6UG*kRD.=ޭ+7ЙWCx<6K3&?a&{d'! EږuKZ_)wP*d?mY< fk:[وW޿h -NʘQ MftEmfRo"[B>p@RSaBGi8L6NOW Ga{4-w=xN19z`]*Ϧ93Cd\ywPqᣑHAxܴ)LK6Wnr̪ۈbFi)ϹF1(XhNr.뛳bh{FaoI4~)~N߼yO/5dž-EYӒ6k!znwe{Uc;=!͉۞V#JiA$ <)dVR6lmTQTL^R>[b1i$k` [ml 3s;<-aY?Z#tKfɔ=Yvn/K6v'zo_ՠX{O&] :D{0qp4d,$ .!~`]w"40CkpNztt=(ht} N{?f")jgsBǷ5nqT6T.sw|1>|>DD=#|:K_oJ6&/GɊg*<s9jJs8o0[@ZDf-8M/.B\2sμĕW='j wP/yybph;:i .PDada_J@!Of?﬙VSbw lxRV\ÛZ I-`9l.p= /DE֚b%oD6yP[Y%%rC\}"(U3W^"RfȈRQ1j݂K r@K`Ua+- izv1ONg_Y&%̋=#4;B; <)Sm+jXFϋzx̧,w-ؚ;fqM=?NVm%գ09pOuInmWL1Dhah'/C|. lp~ct⮦$Wb'A+Uˋ魧bXNl{9MGȲ޴x/F2v pW\;#0w?bN^'ϦVB}d/ ,zf-wmD~MgtTԉXb,@hb64ks/D.EYRĕmr&i- e:t;3Aúz֥\Ԕ~q%BEiaXI 㕺:!<סS8AoA?WBH6c@*~`*DH)ӼvF8EQvrc)?ftM9|rе)d~,Vֽ\G ̱)ߜ%)m~Ur!L-LUC~؉e{wE=4/=AK"AZ;ug$ɳJ~ԩ/)3NN _-q@e[SXlDd_h&~ btof5%!-U h^x_r/A\&6XV0%"^W mgƄǬr=҃ݹ V%5_g[9> Ь^:5)qu!G[nE*!q^־udhD/q? n!;Sf⁍VފlUY˛UQ+IONh>-u-p,ytgOcxZLB -:<_NبMӧ23u'^}pЕ+r-TٴJiGjemnSB%< -6Km XCDW<`vh6Za;8[}Oys vG XP /[hY4_,[.YCM.3 xNWoRReuVqͣM0HuufI+2ؿfF[h18ly#H6%M4:c+W{B0yl<57lh Dbi>RՂ{D|{j2_\['ËG"U-! I "TAlcöP E]Ed6i(->@٩0׺A]%!aL.X6}NrgqN4z-2$u\'Bw hA6.  RiRmk\ϧaOUH]!cZbL]+'ǤiJ>c钌43W/XӇNw@TY-;}3HwYIj=9 bkd-zD&&DSK]`_&oO_ޘ#A3鋶`WTi@eU#-1:YvRd& ƄT;*cB@j^ښ X߮)-G--*m)KPFP|EuV眙w&AϝeO_AJy[DOcJpmu5͂MY=+XY=ch aI$I6mYB`t<>U"J pl$4k&.UjJ6C b6<<=Zt{:>AeөARly=Y \N)_~/hS6V&RίXwwqVA&'8tUi -׷!9yJn4hZ;1/3QwA¿ ZQ =6k!7Cd2"ǖ<;:sֲWRZ*qqDzE-tF( HЇKS/.8]XI|7()9K0˲Q><4yBm>ew"1w_;4]NԪ^ч:Pw7L&pՅ%`=EB-c3ufS3y(^Il$@㫓P,șYH}zTfqxٰ&6,68-5:ǯF.z]O7nôS\n݌i*껻s o,M"rTyxLDŽzUjA2֦2D*3v !d@;106/8$1["/ EZП"ﭞsܴ8&N+]4g&,͢Ȇi.MIxwTpZjJqza$. Uy}G'H: M+P"0 R{䣕зnuw%n`7%\.AD2"Wr_Kdo`1iGg;F45B4Lte:*Ofn.pphjz,€![yf\NkyfvBZ]wu_?hi30gY;_?5&*OckT ltVC)L0LH$1#Bu\3gǚjϰrn֎1(x'%ec|q[6) ҶI6Z9p~8,Ct0j"*j_\mgYM5rov^XCʻ<͘Aopn+p;D,Um]LXx5!}a[i1/oiTc[p6֔|MP'LڏkVB/HsշR ?T^?EtNyP-p}ܛbCv B&- obtϽ*52s$q71#YS&O|x+5TaUM3ZP%qY pyP豛zv=Zc @揉zE%+s2h h/ȼ+QB$- Ec^Xz߯M{aۜ7 u26+b݉xU- 6bDDh^_WS^.ջꤕj&m!XOp}a׷⟃rSciX!ƤlZ)h 0XTE,hjE- 7[(\Լ6:,f"<Zp)Q[m.LMҦ'7e|gP]i=/b~>w>EVqt[?CcV&׌ߋ `vvlTl{.n`,fIn X|G+kqyuX.s]/k7i3Pf ҿF'(`"rʐ (pϺSS eD V3/Ѡ7۲\l @M"FaM vKknPy%:"D\fä֙2ڜ!s;9c=HЀT1UfAD ۈ=R3L>$3I ɘ`mǁr}=N>egnۇsxt@g:GEuOrM; >&[GGaNʔG%ۈcڪ?(=|AeO%Lsr闺TD]K '8)&&yoLUeި&eј`?3 u=ZDWwhH7he;g?ز9f"b 1}N-8T[G6 [7uϭ h7/W=7G V_@)+ۃR`ς?Q7 !€Y5B?ڎQ_!+vjI Yb C2 OǏ@,x1K !ؓr3v!yK9rKdNȕC9P' Y5D )_i/+zU1fNvy@KGBZbE4r j}g5nAc`wd[f y"g]W\L 8 8DiMrd_{unG0]}al }KQQ,y?(6M qZObҵ},կ do}8"ԜIUYxyچ ߷_yAL_ZŃ_1=_d[I7kiMH'Qg39/-&NQKhOH ;=ڟ& P*oe]v{& O~iN47%z_3zd Ę $(ۍ I;&47:%NnQ KGu.4l GBΧ;T Dʜ# P+~Fk6V ߅fR,$"Wt$th)۱!bLG LgsG{KKk1ŠvP0@vjY8<]EOۆI'쎆jɣg-(l'x&ù>Y=\XYj\;<(U-ـ5;mD^>剎mT+ 7gBj|Ę#ؖ`Ɏ0J6S; F<='e ;U6/\Aޑj(1aJK/MZda_w2ay&ˍؠ; 4[,nS|0-d6RcKda2:nw 7--B2Awy"CC1Kd<~\KuHe"-yS+zSOmC.٥R fIXE.O`AyT \:2[/YJMĭ|@1VzM834|q^/[Ƞ]`hH no1y.%w<S7& Kּkѥ+HxJ+~ZTY8N\?L 'q"*º@jiz(]_(N3Kv|{6ې쮁3ۻD|SY2wT,8TI7GZ;<DZ{yG('*{F ~()[>CGS\hsTp&bO^˝C?Eߴnf7tgNqJüoeZ,! ^;;"HV:`xGe? 曫)\EM(n{ lLgܚ7.jq,':'Ǧl>sXm^҄;"**Eu #Lh տ-kk~T^nw\6q֜ĻlHS)3S֊ƫp@9v/`aOy9N,"'5!,pvJFs@N.fl7ƿYL`7_vWX43ruMy/#UOk-U.-!^oiwLj7 oȽ^~&Pч-u^N1LL7Ȁܦ;ݽҝ}++fu{fфkKԵͻ[5Β罵nDrNm u1|m4y*lu/Ok;͛oȳԑZQ"rGӼ z3^uWX'魠UƌSc艸7WzÒSng$qa nh{Y[=/}A՟TOK_k_g[=EUu>7) te1S?+]N,+տr, u(`Wm:vÛ3^O$wrSՖϽ~ U_%) _{Fjs ciׁbX5'*F ?9 Cxm. &8G-f'fA,O9^8Y$ ~W (z}`}u]3,'OKqF\! \HڍIHV^U·X/x[_[+KѥVQn 庭3$3M,?y/% ~I-otPPiz0.݊4MU"L6TGY!dv]j͘g wjbەa悖NZ,vI֟,sҧ8' 傊'Ǹd4' Ӻ wq}K* sGtZn2cu acdU9X#d(]8za}DOQɋO1BGnF$jmz e3D)C|-l[p?̊T*.~ x~}3g\Not7wyP]d/"l ӕ&+;\ Тfbp81{٦7QqL<^Ggw#S?%ݜ g'مӸ}y>&=$A)+=bi QJݖ@"V t]?c~F 鑭DW]w丅je2Ike V fNPx~Ʉr{D[^){BY<Ӆ/&$rb^_{p]H,24a8n 2$@.HOPAñ9-yt(+#i<z/>ǁhz̈>vMQ ;k B}@N!-28.>Í'*fr15bur˙8;`/-,4dNeAsބKܛښl6_|ٯt:Z:Rr &a{~p]ie*{~ÂE*U3= $RQ|Lk޴$tr`5$K uthp?H$CRv$]UH,1ᕮe VF؅TT|U{*;OvwG(0Fl珑mjQHl6e_H89w62r2 --ϕRTУŁw9K~Vl@vOAr3ˏ`)HWI+&F/Z%OPiW 2 "P=ߙnDvBcEGvIύԾ=s޿`+2"e }Qf[|Yӷ5BCא ם/eSW޽{{z!k&7ẗ́;.vƱ p\wmIdLхM1/sޚ8o^sXT5aEK)P[{ϛbQY{_opUʉQ%Vq :_'mF3ˌlXbs?e!]{$G4\ZC]x '_We=Y$b<,w0cfޱ9c$lf+&IB?}Ol)Eɜ ")*t_`zp-2ue嬯[}h*7c@$OIaZD\M]vV;i11kdΚzw|\0YCwbd8tfZN=g>=F Y41XE Z*1e v6DkD6 nA6g)qY ϡ Mߢ EAY}xbրbIH\H"kP87RTΛl }rCݮns.,%.\W Ջ3* MuR\tCB 8 @Rӝd]=U{@e϶՚vڀXY,?w}iՅW=hݹ6g|pwuR}m1WֵO/iZW~ꜙի+/+D{U;S{= -m5:[>MM*HjDz 11d͋}obeڬrwǪb,~ ¢1 Xt;9.d"o7LU &E5+{/U+21{͘"-Ͽ\lskVeV]h8ԯW+,e |ڔ|^ y޷!;w|Y>x)R*jah܁_Q8k/jmX)&{k C, :[_r i4μt߫=kk`PtHmk }]XG;cd͸q螗"}4`8uM M]7H @_NlHIgŸ UBtT $of8Oa~e3Ocj9 &h?yĎVgË N8wxuSi7ys.~oOipUiWi7; s9?LlkKLۄm%P9x_fJF ^'nY df-؟3S~f*{ZL,λ/\‚l5Ŭi*V3)y9,#o}J>Z8g=,{],'(D(R_v3X.&Q$w @wF]u? w[5Á6q_n 49flcf\ 43&j뿖 %1"+C7w{~ӿ _\쐮 Vc>eXt*uSJ(`NJzց {fYz:kzȘZHLK 0bb,ۋ3okw?~ +r K[6'Fلiŧ/F]y?3:cۍ}x*itW zl̕bG E8MaŔo8O A:ДLmȻH3ۇgJ,NwKdGj$# a~u&h0[W~D^#b%h-vB昊FYaaKA= Mk! رp6U'4{)rqNQ@-56n4|1q읕bu)4TO obl-T-!yLbabBP!X] w ꭪γ2 ܛݫ {앫P9)9 NPuQP11Ժ!;), M13pLk+J-8ajeIږue,ų}ucrh9[Cyw>=pL*Bǫ &HlgTbGQ!^Uj%Ccd̻R :!EJmU|8:~ >P ݽvb ]:`ۋ iH%g@>4E{ ALчU ,_7gUY:#z]k l-XUF˶s*z]`W.a["4dC <ٺͯMxVVzpLd7$Ix0y@MiM-S˥.i֤xA9n'>$}#+}̖}7oh_bقccһQxKu ߰oꝎDЍQ\eMڮKnӹGeRi [0ֳkryq?]%io=4&x3[Lʇ^b=O/Z\s™r,)/>(vg\ YeAUm~ZCd\$FLfK3G6 ;Kr,ƻJVaJK+OqSȑϛx)}HC<ԠZh&N.pjDi'ΆLԻgekD/&s!˵%΍uk oEj_d$$P_ \3&A\%V׻{Q㤝LdtRgŴ"!!zÂT/fBCsY-_@X*fג2Nv_,η_׶8x>#Zp0_QG|ؚGmviA1>5|oFglUѰw_KƷU:|&1>OosOV"Q wIv0̈́z͹]uXVY5 Ct5(F%BPCXO1WmeIM2]#c>|)rASM' b066E[ՋvIJ2}׆06Ă:q6>xxm-u mNDŎlK?/ t881v2FSwDu@EF@[16^+HO8gQ +2Vm>n/^uTOtWyR㙱%|M< d?Pu5 sLn?GLn"S֝)҆"J(= 'JZ3"ZՖxtNU %kEqMG.9Zd6v(o4KٳK,ɹw|^9aI/.4fTqqpDf LbY.i>iN)*)ֻߣS]x!L@AitKF1tZ]9|)lo^5@^М]F[3eGW ܞ|d⺸lTeǞ z:$*l<nq9v0y.Bh.ǫ%>tnVbW`%##5{&adz;BkQ$*q'ѱr(uewiBA.ߞO6:傍:I bDx$ ^{v^up;M1ǥD') zi;x?B܎)TҔٞ_]GA#)uY7u4':[z߉[M<̐eF;Q by[Y'Es. j Ny/XOthbbG[׋WYCE1^96bUY, lXU *k,hp@unHtڎ/_uK~JbPoR; ֆxfǟ.sWM5)l/6'v4PS@sdeyq<~ E1on[JGT8SSHEL[ mNmy yqT2Ң0|\MPˡBOES NH@]fN1^2{4ۛ^پ;|PMN|n~~0s17 w!70xMu4ɨ'[4Y*? \7S@3ʡiV 2?!h"2ym"ED}/!* !>6wWY jnڹؐ WߢkMtl;J8͓Nu̗+^;F->d)T]f)Ր@ %3ў@ϸ <62Y3v :GCuyygMi ܜ#TeAV\U/倵<8E@H\`l 8|;Fn[TvRo:"#Z'>"MP-׍1}|5)j$_bLy *$W缡@@'"O4ұȷr >9 :t/=ZWNv9܎ckp/ڥ0Ғ Si e߅s-f5jS؍2*h `רRcY'5񁮳#وmf Bt* ̦Y;7lٚ ;I$H%ؓ NoGJ{nRRe)W]_)Rǀe2m ?1Y&VmuntԧhiiඹKܩ(TWdp)nI0|u ZyF+aF6j>hJ¿ͨmO9PZO UcJf2gO3,=WbKR66HhLNvSYeN+,tlMͣ" 5^8G Cm$X-sǚ`q^KҤ!cSY,ST-D:j>*5 1ZE9qHx*鍘MRdHuR&I(0yWӱD7tz<;eNCA28gML>3`#2 9'7owϔ͕ŗogB۫<2X@ Omn񅢃Uu2SoNJ"{*&X[{%#"!jr'ݣKYC *~0%䢕oY.'?TcyychsQ^ &evJ&&o5oUg$ͮ`#M >j 觼h&PEt Y9 zcic" ž1O 6M[LwZiНd\|Qd1ġhPh;ْ^a+P椴reh\Z5te@ F #bvn˂Zc렎^ɮ]ͣZ B먏V-D&;5Y"u5kJԷaZ V2fJPNA-OŒG/ܠ)ڴM<|SDйά4ϵ\r!f֭p '“ݱu,;x"B)O|JohCY?a =]v Vy2͞&ˡ@8H(.i]fehB%Sֺ)oli]X`FNfCS^xa,S!QA84a)4ʅ! Y\Bb1x&ߨµ(,5.O\p@BdbH51Qc6B#-Š`ʨ%2dclBbʴNr7Y¢ǥsӒ+3SH`P௚f)qj3 ] M!is:s 4YDD9E Ț_:&U.t%B&d |EcP? g@6E&/0qreI xY#dzu'IѶX4ya-Hui7QokW{z<;`M7ֆ#/5141@Zm^ṗvwV2ݎ\Aлk݄-& oC8>eXjF˩ٰ6Oe2ҿ\CϴLLTywl.;\F Lhpyڼ:"䒤9 20iג)flGƺuA}=A:%8K#SL.( )OJ  *#6=73&AMqG6޳ ?сJyh.ct -A.zzVYE嘤$ghw6@2 " Z역LNnW6.)ͥƭgߖ~1k&#+ޥe|3AMgB14iC &xQnT ex( 钊1&v*PV7^FbĞZG~_bM$ݲK?}@HS^, /mqX]#A犍=u0u^͎ 4W}QL@wC8t+0gS ‘6u; y7VCfdn2eɾ40wॿdm~WHFւӏKx]tV96V Gu5%{p^>㙗y=U`7Vλm9 BF@}Tv jzDL^ qSpvZսR^&EY1ʮǂrT'I^iC2~ss%\IwF,M9{HFe`SȅuRXϓ%&̲W|Z;):V?ÖPݵԦnw/cϺ3!%$., 2tDG] f{gw52~Uv\xjԉ|ppǃ΢14){~jRF{8w;Ҫ3oc8YO,|5+Ѹ+q1W?of#H uWbG¶~yrDpi14bӻp*' yM0`^MY/ HFJ sl?w 窪A-@!Bw-@8=Yh~v]'30dY"<\^v19l^Vn&9Yqq.ˬ"vZ"ih NE[UjW/E͍!YlnaRwKA湴XH5AmlT_f`ER \klߌ_ LP Y>^mMX9a M&] h·ޞ|S 3ڋ+!4t]7S%z&@;?Y< C;(9cU>xX]և uS_lZI6!bg!ڲt*F΁ܷ k,>%cXFAyЍRKM_RQ 'wVoޠx+Ņ+}쫾 ۤ7"iߔufs&=/=n W[W$!oQLN9櫦썹BKjőʦ$MVnՁk̚QS[A\(墽% ag'Җ%"͢y#s71^ hIӡs2{e9!qD+ĕkR5t FƾX`ݺ#LF(qc6[¢ȾœF{h^p*y<1Z9S^q6 @dJse&5L1 hkBZxxWDȩv'9ybI<hnP>np6cQFy2j0MK6sܽ$!DXRq [i1θ&'}m!O04f*uɂCDb0Uܳ7շϤY @/lN81B#liگJMY+k !Թ~VLYv^q=Rsqvp<]$y#>OjsO s]}Q> <+BgňӃ{dBDsfTl4v)m/f -fkէuS{Ms rU7, g{h WJ$[#4W- Fj!p3X Ldr8/SmwcO@[Q-)q=e<ٷ|b}ifw_zwǽnK DZkx)aBMء/0  MH VYjZ'0[?n‹9UBm}#BYZl\z[E7Dk∈9W{ZQr*L [+s9l!k3[vA7ۜR+ߺ$l]2?ꪺ[oȞUv/j%wX ~`CjCv2 #ľp&!4:C#?[۳=fբ3ҫ;bZG9]+.0_`xG.spQP{H='1IEwvV!\zlYc[^4ܦf8,+™RugE&}BE>O)E<X%oV{g(xG5[ϝ}IĄ-; RV/j-'[r}C1,/bjڻJ9wsҷr ĠdP9}v@*+ \V +vEMA޺b)LMi捴6Zh$~h_#* Ӓۃ[:7c/QwC@X$muY$X70cF$ nԃ7 š>EB -yo;dwߊ;W2A׹R:q„{7YNOb;mR88[O)҄2D$ĉf}?D ~h%q-9p5V!HH$U i [˦p&P5~OFL<'J*u2zK^43tX)w=!$onxtd?Ɋ3l쭍cQrҕp=?,+5Sp%jHXII?ڕ[4GE \x Ӷά_ɍ8V>ANe_h13xNRkӹ?,H=3/)l%^c'1fuBԵd,ԧEWC3@*qs|}It"ͣz@So'JpSf؊ 63? $t=XʮsowA!jUK{~{ҳ~g-[Z"Ա3[{r Y.l$7w:[-r䙫֪8Z[s'ElinRj T? '˘x.kECU5F; S\׳6m)=,;^dW_m0-vK:@kvʶ+Ēbe,ed-m;G`Pp9vSpB2>xx-)"~Gs>E|kN) :*;"6 Wv5V d/)C{+! q5RC}nixi"#>f6Z)e,.D6%9,<3b29n nDٯf[ˆ~ο^i  [ ΛWTsץؤFϛ)D_bk׶/h1a#bJ85;q`ŨS4:˩tV1QoO;iؓA֬ J 634<ϿKK;Y.l=ٳQ-4w0=#`>vo A Bz`R]AZ91- tN& 8q~&jӿO.Ϟz<;'6 ME[z j_YGMr9~W앋5f5yGL?pTHB&`t'2pI:gC%8\uETsGrL ޅ[G:Bk$*>ðs?6wGKN ?h>ul?_EG$ͰGh!f^X.>V4,8⥞.CEcNÀJq߇Gѡgc悴7@.C J,?@$yOEyenƏN^2"mٲIē 6,#{Cv:Vyz24K'(QHbiAһ0S5Q{hKWL+4wB f=CɨLB?xMA/k3/G 7d@5A[_[лwW?=*,"X `jrJ=Z۔"y*SD||L~̲@b'XӤBCr`D3GJU[k"d7O)z5iUD nD2 z YtE;ڮNBFq`!Q]̻w=UUZ ^H+ϸ$Ukc{gTTa0I뉊k`W&K,NnkwQj+=h1}ԔaxX߬6qf{g8dAPs RVoYڨ3gGY7ڱ\ TiJZBwVnѲ[[{yyRqag^xгڻv}"VgܛO1z2IZEl![aǔwgr1F[:Y~#)HQz5&mE$G b-Qf2gu`9Ĭso ' O!>?KUG+J|Dg렳bW|Hn +Ǟ(ɅT[R]Kĥ`RB6/1ky@>CqJl8Hez-33j貞7->hv\QV6҅laXiqs92VHÕ>:X fUsȩf+- ~2j~7zb8Q׺[AsY©gYp\h)ۥDś*cRJWۛQ^x*z < L8+ksXH}%h0rZ>%E 36D:5+WsL+W,.>5 }Gfk匴}yv<%*g 1ͿNC=եo3LZ61p M$ _ y\؂E9%(J%ōV'ޔmHv꿟y&z2P5}qzh:I/dj uM{jb`5膭n?lWѠ^a(~01F{*W {QfFlP4v0[)JSc^BLIdR-ԹH?hSߜ[hh )Q0-mH*uS>(qHDو<=/78% ݔۍ}/Ob#,9 x̞٘db;GfcXАNJlG 4('^"6`\#ܚj[aErſG]hy'Ҝeugg_Yϛ)L_{9⨒@S8F(?F) @]X5VǣQ"vxuDkIheV<)*؋jt3):>jשxg~!=j]էʭ3+wZ$wAvɪ(,rQ{]:( 9;ߙ6_Q~LyR7Pp qlNܼW,+fۛy[3at[^.f&ls*s]-[;OT7>K(vUN Y+}'9|rHOٿ:L]q{1a1 (-y1ۡcbxܴs-mVMj :i`fF2&c4@ۯ6`mƼ뽦@z:x6.f Nk~V) j 2{bemJiHc/popcIrӋIe,1У6"_kZ:ݯ=vs{bBgڕm]ɫ1lw罚JZ 2 t^6N698b#d6itI#wpsj`K;` \6|Bq̽1-fZ*ta.Vw.@~W/fP:.(͞Pip# Ks]83@G<2+6-=D6OYb/;Js9Sqo@ OOT{BXcuYZv3}(Ap-*u-ٖfLY5Y{{eihi$q?TMԮtE} $06l%_ة$Mq)Ј,xܫ-=r  wPUU]鮇B0$AZUbL18˄1,Ź܅ݜ=$G\UXRs{$Y:"aizI4hI0!93҂\ O5@ҷwQbF1"UT;:!yK GV(5u}̼ Z(md*}!/@Tert g14ֽ4!;ϓ GE Lt1)!=z} B#,va; <s۩5bSe~n +a qio524;j%rX9sn6*Nƀ3Kc6y/̓{{ꢾ NÒ.qa G$X5{zlf<bvd=gwA1`-$`gA!xoՔֻGz0mX#llv1xЈnF=jM56HoNV2GF#~0b{3~q r%z=JR)/nyAn,?~qϋl$I#80 my"/Q# .~ݫ%wFU.Ƽ$&G:d=NLB >5- 79.c*b,jǦsCbolŵէR+_IG'P8&tiwJdG#hUӐzX٢TLT+g)<+p(3Vl"yO!E@)r[hZ5!UPthxP}ݑR&y7žH4p$OA3٦QκPoo-Ic6ed^iba>X,Zse.P[#"I:흚-tk&oJw8{yXkQkgͫǹpiܜ+հoԓE¤ ^}[%% r1sp"`3_*9Ǚ'ϼa KF E[ԁr9ީ\b==k+H]7yQEਛ@Ie9#? ^AYD # uFX<576[> s5".iJ]M{ݬVV"྘q8s'LPQ;ɾblo &QDZ#9$,w8{<o~id5JS-ۡiY yTƶmDA2ZR]z EڊC7o [R?j__P^_61JV,L,@n*d ,!f4^ZG"LӔ' /t9Z?F =iaiL +ry>C DGDdeOBV+e )~Ai)5 P (02q6m)"i. ڌV) C?AMɋ#kl0&u8hR2rpiK)v]_^s#(NL>*,!= aѵbga1tr\8p51^WH߻H#OaGPdSIvq7ժ?bMDMo "pWEB Eꃛh^[A+$1]Fԫo=`êfqgj3.1+5Cq)*Ssk|ZY $b{3Q^RUe4]n8_j8CmPԿ3S%VW7/kqr^h@dj_8:#/]k3W1s6Cyvѿ_qw\sg]휅h<@3OƎ5d CbTQ2WB2Fk_K+$Ș`BfW ;nE r6wh$ /VG~N6T RL¤+N34Kd荮BS{SYkYk'se]xݿQ!`f 'Q:1# `퐏~E3iDtl,|^Z& v mw91eFTߝ!xcYOw|W>v=HLȬ%YԲRճ]A'&gwOs.բ[yga3r|kƂnm}V5r}|tump p2|ֈ!*9|ןj"GD|*%yz 8_DR=0Į˷fwU.ۍ {/ݲ㲾W]l1SDbU[CVz'NnaN]y2P%ܟ.">Ωx<"]À[,p-Mwꅌ=W)LN|x҅ԢIfz8QSGRjOp\ VcUfкu)PGE_ KoK8զun@|xLx^8_.SIm}hM.ѭ=e,"2=W,m6kܖr7|mp&/W9HeÁD|2ybsPh;:x R1:#A㮞P#j):S-m]M-#R:*`iu[=j{2KS}{ֆ8cE?Of%ڍbo_WӦ{ ̩'dMkS1%o ?G58?=cki[EXD3HV@(Wͮ eS+$/ִKu2͖XQ&D/> 6HVdxl(B.? rT MnG$_)t0T{w>'/gxn特` 9"K|\4F{ !,$0`*׏WęTgpt?磙yޚ*_/g:[A-ՏWiYֻNMg[" :nHFJSY|>#;=:[&1cRt[؂c!֣[ZN?ZwL[2xI5~eH|93 1Jvo4G UTYnBJ7[p7q,߃G .“HE)οDOZ٬|#.#o}6Z-عFbk.bH}~oy4zcew6f{*_#tQ̚Ա1f)-%)mfOY{r('%r[uA;{xo3n6-%# ƎA-2 z(sFS8ՖSݓ)!%̋4foÍBn{ToSذg>.)T-h/{gSSL z=jI) ~+k[6ko{!~vg (_mP<Y6 sV-]5Äи{~m@ [! p33",c'-^_noɿbs)_b m˶)LfWw^/ηKj."MH֬;4a"$\4?irAysJXgo zЋ::" 딍2³qijcكnꜛEs`X`6wO;K=%Q-o}\ p9ɪ8)Q=݇OtF,OGO>aK9OqͭR*MbSEbaֶ'݆.%b:|j`Eenɖ.lԴq` JxzT eGtjk'Ђ(jܔWzuzvN4[z@H|u jQW3UHq`~j)n^*;-7$mǐ[&!¾>!6 N θ }Sb&1sF2:lS=+H+Ol X4CCwZ_1L\{d)__^ B=g]#ZτDM8^^bUhAE/LOŌUt aL;><-bp׾/*hQXf؞gr7VĈZ>§>0Kgƒ2T󫡦D5?+3"F *fimxG"R5MLɼ7JJՆ ˝Ļ[1ʖl*;74:ee(IGkh57PHN>M8Df+`TIh`a.e1睐N/Zc۫v);=EۺNH**w @!ݘ:0%40J]_wZ%0TUȭİ,%b`D% Qý;56ry1zH*̟Kǯ#6.wCbHl{]xPB@ >]1-1u]9tVsr􍚀E-?1xeD)T Mۮ@) h%Up#7~  N|=S4Hic}ag %PQ̯Cq>\cI&ɯVF,ee2=CLM"QBb uP_ , oc1\ZOzϓǑlXsƋH,[DF 'j(B=koM.i'V,Ե,$,6Km}c<#+N'',f -@k;EI>Gq1XǶ@?XͱwWU롔qML(">;wUمʳj+Iޥ;'QKHid9=<#3l'GiB4U=,X;D[H.Ya'VrmriI776V NdϝB0OUG;QџW^o~] .eZ=d\iZ#FȔߚ +e^W&<> _g}uS*BYKKܺJ$)A.l%fxp`6XXLfG^} C)xFAk=BF^w^Ub,ʚt-*%>xճ2f{;9ykR|x$d/JY|#EX?1mJl8=H9iޙ(ilz{Ʌb B\6mHP X@pم@@t"O7 6j?A 힘vAc5%Xdjl*xՎ25mՎ9[=77E3}?*Ħev{VmlWo raBt~%$JjӬvY `7h[lKosNASN~gkܛVE8Y;܄ކꮃ-; 0(s%XDHŎ?v;'.F2覴Xڕ2KWߚ 3r{Szv3.ᏽ:ϓlnJ6Jwzҵ:RHU"k'N,-H pa DY}%? s7$?[ w/b6447ݴ/kIc-A 7"&8 F7]'1? ^ `o.0cѷ!)v:ø3~AI -P[Fb\`y$W?;hl= Y @zXzCv}z+_PX] L@9ł!^H}Fx{{̤^CH OiXqɼ…x5TU |~hzw ?pa@0MΛO{INbs $1=ef&-s({B>͌X}j h#T,>+F+U8Z +Y~v~ht$s煞v9E NZr0 93͝t(mVijcBa!CFd^}r 7rFIa18aMK:&q0Xߥ%.a(: 4jݨ1)zF3*_}7_D413 ӈQ?iܒ}a3)H@s~:rE=d$De'5٨z/n8(_W溭M/2&^ECqcB}W=6}.Jg'0Y~I*7t&0rr#0S6q{1%y > 鯞+5.:/H# n$6U YM n%İpkmٜ\֏C~>Ms,Ư#̆hݬ8zݒfѮ UGc/IcoR3riiy+U⋽=fa9n-}.vl~b<*+~&DRj@VF!b p ^p)GU`hGhѮp_o*hGG H6!(6ˈDU .Os&hE/.+%C0*/&@νz/ћPZ"6WX{/a;@9]ٴa8齨ƭiD@8%ڬQx7[~dJGD`Fq41[{\KY3!Y#M--ŬǙ/TXlc\3<48%7qA[Vqf}*F9]vqIh}jLF[DL0tV%-~ 匳` \xYgn>K=Ulf\. l8Xjsa'1tVeX) ܾ.xSWe >2| P^95;Ň U vrk! demX'ʞLTeb%Bh- (hZdzm@S)UƮ3nlS.nKUCox_y fwJfTa?4I3bfѴ /Z2x3oah{sMafJt,S7[ޞːtvػb/s` .9 v!A9.h?xbjLx-y|)'R6o>סv3E"u͋J!~)!0|:3nq1豟1jo5Z[q&9,̵̛v$&zPLRԈ_7Ztp#p 8hSsi"Փ&}3`ه=ֲ¬>oϽP-Šjϒ2d[Z*ǓVbVc&[(Q\ p/3Lofmu!k,E{%ܕ ʜY ELoz%;yr$6 c_t{DX$ @^|sZ ڽZ]x?$`棙t<:ITEՂ|y5k 6cSP@M?սҪ^ɍl a.4ok2i '}m<|NYlRDa|_1]?+ZlesQelhSrw_hзw VW"Y+9|u tta' #=ެsЎ`ϓv%\.<ϋPLrI8mi:#Me#jЪW Cf&frQ,DK㛱H X*r6%B>OijR ]ͭ/5wL~m?닏}rkUi^}hو4Ǹc ޘ~۳62}"<k_DNjVS-9gАš(Nw& rMڛY "9ФSkO9PW×P7=7z#*:؝/B~(ݳfcGN4f8^oҁ7phG-}sPWz.'^5ͳݧKxbG\K47MD7l%ʼ7?hC49AG0.-W#g`1 u^+FdVcF-շjm^G=s4b`K`7kťuܬ_K~أ~Dĺ[q\X9l9{՟NMiHyM&)nƼ6ED,ÃL se`R+V[!,Ĥ6s?O"HPV mŚo)9u_\ZYw||wXGK03ꠍ[(Iڠ3=sRҙVy89*BpInn1&#f-^P(.Nmhfu-;Lf]NfUI]Yc۟LH]0 \}d=hMHZ#9 M]e[o*x HD< {M}jK`!QUI ;O -(lLŽ((1 Cok ;CMpmQrDZtzZ۾-P B2#t4\d|$i܄ڻ)0)5WEp@L2vqEY3fلM161 zA{XAXHH<,kdn A21 ϓ=c uZĶsԯf9eìwbAq'=o"[h!!IC$*ӟxeo?],f>y=En |whފ:kd>')Z'~xѪ_!m):fts&"31⃥#5#g0 ȩWQו૴h& Ղ)`%~0x?S7zZN7 *3geL6H'J K ެf|OeP҉% #)*w=yLn80!S Yp;7SB;h 09E8T0Yx%,9w{9w~Q# cnn-ƑU9bޏaa2musfP!`k$0sz/ݵMb¿j쭩u΋#϶&47}jlقz?M33^iꂬu0jƗy+Ҩ:;amyό}&Hx'BmX&"2ʑγE`csۘ[3)\ZmOF]0Q/vf|KG\lkXz]fvzNWW?Ըw6TAs"H&oyzkyHPsqԸpO!W-}L"F$lmmYhsY[0GZʜ#0f= 4jWeo'K t#8v(ND(لM\_U vOA4IgDhUꬣƐ}٬= -[M1Ea3Tgxi~"&OCu-#/A9x0/(Z AgJ$Zvg&Cޯݘ;ߝ@Eytߝq ~rXXB>OϹ)f쫄;iBmizPSsnN?#GW^I#tk^ z),t?X_zQeG󷃑b},dP6T/~i Cp~?{k58"?<6ػRe-Tky6>RRguYMb]겾s{I7QjD[ۺуJW5BͮV.u_?eRc^6QjLg'J{sxHM]&V&ήL.-DTep=W 4 /#`vyVf\K`= mA.>Zi ѡ]Qo_\0{gF_BFZ6 ^.5oX|#̀l ]Q,3~u$.B;lX{s33nj[^9+T$%R4yS`1 4*{n&#Ζs*0_B&45؟{ 9 I mBW\wXhٹ52/B+s'[?vHT'׃)J[V]t?.]޶ 9=g m@o//Xcj>bů;m|)Ъi3jK;n{?1r40cx̃NJӸ&k;ÁB$vEFwܧsI(myh~?rM튧g2NRUJ`dɠa P'rR5#YL>4 xMihr:x (m8|^(,ByiSx]bxCijGse^\s!<ҏgPΜҕ c-V%qX*YjN kSJf_2 #s2I?Πt*'R,ۑWuFaUHȜd[Ћm\zT67V ./?@҂J%P(_I YdV6#i8s ncV˜̹sV>xLw}Lv%s_Շ7"БCHXHfy]u:tKb y`ChO{ 070:?<"=j*\xg=hv"G +]#!`c5( fc >Ub t0 vxg'ڐT[~@8;{cZ1gpv}7 >YUBV櫝WA<G}+%a„`Nuh] uqqc9OhBυA,_=Cy=A|Еf<CGgpfUVܑ,Nw.cu*Ѭ+Yf~/8 O~qk՜i_S_6I|_ҴgeSm-ZÓ$qˋ3pPm%!zKj},Pe@/6r?X}1 ;[dO-m]IwܪB}ePJGЍd1:4OPbKB=mm(Å$Uc":Aسtno|H&VWsj-ؠH1wHTa\'8R)b]O}^L9+TjCltX# M2+iPlpi 6g~yob #1 /[&Oa^^i!)}x834rTKPc[2]rmMh#f $Gj ]ViSBmYenE:ض1\bFy^eFk[5 lA3Ԭ{^k%ג[P[ZXPr$m'%bu{ ГN~#!ȓS%޸ݕ`bcDO"n^ ACjFb]h2Sef1}/՝GBWK:8咜ds#3},] o/ة~s{ ;SB~fpm||/mvAͽmfXKf['4kwy*jyg5  K)cL= mN&bcw)v̐K23eyiЃH`A! ݦR -6 փ[?]x /EUY⹺>B#ʧ@έYWL(8!E_IRʓ[DW 5eCr&]@Q\88:ڦES [)ce߭jvcPQ-߽CfH`e,xŞ Շג x_&pJ@[~hz&0(8VEU;>]Mn؝&X mMaa=z6,p,5#pDGzg3ZuHݼGZ>Vn'A%[G؟;N /}7z2wn rsRONa^QOA0mYBu+@g>rnHTO0]64ӌ\zsbfFfva5 nOѬ-M7&yْe?A6k#G2r Zm|,;Re~rB)=I_P-a5K'^YqTo-ڹC4 ̜6 ??]u+Ln@M#Tĕ3cѰ<A{@T|FӴbζ"d۾9[0C$0˝gTk'{3MZ.PMh};p K(Ibc2Ilq0&F#kK\}$'d;@:]?Ծ$ޜ`qPh8L4) ouB n<Э2jgV䉧/jM%&}PƉ0ř$L|$ru lZUUUqAP̸jMgx$*L֗6 klΖ(;W+ 5TV|9o`+~~Dn߶fqΕDyB}Eqsk M J:KX&W"2LZuM,wN!?{}f7i7?(:s1"kWǫx94dB2i06.ֈd <0Rsn'Νukl]ѳu \dϋ)Wp7/ei4UQyvٍi@.@(@3-0 1PWo@ygSѪ?UJK\ Mka6̊ss!LdtkLBGH+DJ:^ُkZ~?D [!Eu}j.cG"gQ\!){m s<|,2O/O32cH16R#[}߇O֤$63nqcN߀{%cg3[¥>: ־ίIX_=}SpL L=&W𭴮ZۥcE9C:&~j+)M _x:/CDHm!-NQY'PD; X9M;G>jT>q_jd߄AY,Z D殖 4mڻ3ymw}41]Ė:|TΠy9DY@978[wc#!Cu6. @?Y4K=x缡JJL;kˢtBZDS)rH=\1V]ڔ:UstSbV"yu^gy"$%e!U%Ҥk#xXn ͟%vZL7ůu_\m&O&LI $ =|[_J7G/* (&gB`BBFT`춻DCU1gddӇ2d7>xHPu?bK,G#;0jy B7m1Vӛz;5eTg0^Hls4S3/0GabZ,n7&3HN9V# #N+Raoo:KRR5,qȑ`ezm0Ne?W%Ad͂F ɤԮ;MJszw@jZfjUF%$yw{|HT+vXq,ux 1vtK[䌋 hb.1L7gBYf' :ՎCba&\C+xYmmME I?:{Đ*;L>)]9s:o+UkIy{ 쉂sK$sgeC@7LGlx"7LBNq6ޝ re%1(e|@* #o6M L/9՞Yu?--I0i=OFJ>-;, [<`Y 1 Ziqpݰ-̃@aoo(?#{A6A cмFg n- qYxJ H?df÷!bÅ.<X)/8!VB~##Gʇ=ԿIwb1jh*ߞKEVlؽBK4ۭ0Qzyxx'KS;jPƒ UltR(Js,f GyV1ݚi^mi78p2#}iZ<h6yX~I:|bK{Оx@հ.nq``ÈٌMea;6WwH|1g .!S~F + D|0`8+xBW:ĭ~Voz87iJFjz! :-}7aE`?DBԙ'IDÉ/owL;؂ \DC EZ ,I`a1.]W8SW.qr|:^YR2FGW?B` uj:yn+oVaET C!ҰZObVx *}j`y /Ѫ?<0 ۷ ̀s.me==c2%<*̗<6zQr0q~f-Hlj"CPز ,& '*ݞD,!PiV/2.] 8L&lZMۀѪ8Ա*nXݚߠ:7tWi ¶֤&TsɆ.bZ Rɘa`/FRL)=wbXXVDLBG--rBGpx8%71e”I"n-p@G1yM!iF[Z+nBtQ1-UGDBOWI%|oZ'tidT/$7q)VMHX\mlŻңg`y#iVݞ9N*J\ q'*I(V(Id~f[7sI^v];W0l/7~ͤ=D9)xrT":P8F)HKn1>4 6)rm/1n}ON}Z6mz@V1& Pұۘ7Jd[vPCjqқbK/ _dxv@_~.T0Xq&"^`zi&=?M:#m8Z:=!l'tE#Е+r0bp4\[U|×O~qxlrLFZ FX~\P5  ìE:Bk d8yr&bpؒV;"G(4x筀8ߙIZLLiDXIzv08bЛ#< F _Z;S`^E W~1w%f(eґi(fy sgC ~z BqݲҬh(¿ѫ)EҌB|H;dߐd5&>A+Lŵiq}imv_I԰6}6pқڔ.+0l24½ §Tò-FT *w0ȏv ieeA6 x]0tc1! mNy,ņM4@#<W2c}sfeɷ( O׹-ؤb4ÇLȁd۝]bOWU0.FGP; 1q164jG΍(gN1=sR1)E\Q܄mu K *0 [Q"̤lj Օ87Q>f~u4M w%7q7CNj0"S\ [ξWAz"%d "toS$\,B3D~`"ɹ槑o>u &ZRml͡eLiyٵez\? I^Z[8~ Mg D",}1e8Cv Bto(cf XCȪlghxĠ]r/ 8 wXwQ47!{XgA~h YJi-@Z!ŅW9LvǸ_㴂Xft⸘t( d־NXΗ %LR1bnk2"n5+%J̃r%+f!JOk׀-c%}Kq'm2:řƍ>7}Se#h\枙{ \%W7/}@Lc` $~MDžMԷZ^iC=Y]v熌FїY?m-J|w^(DpPz8\d'yZ teI.Jsz<~~~a?&k.O =@p>kF@W2M}?#1R:g  0? MĖ3c%3M4hk$LgX@;mǮs9VM(.XY\G<(v8BBLxy(k:Jv/sU:犄5?5_Pj^475Hn[×3|lQfIZ+{!^/rWm4K.[hqblYrw0}^3,7㰞٫vV|S˭<>KRG+|mDfl\螈70Z#RVGdΗIJӧ3lSxÕ8H񖚿a|'k9c53BvuO)ĸm1ʿ-9ڜ-^-.sK=G(anMρh*Þrnd1_)@ ĞpRQ~)*cg"V%Пb7($^Dȓ_y:cph#ȭ} k /7Ĥ X ,zMIa Dz Bk%&(xmpM*=fz\ =9c^):k$..Jآ ,~{ ڒb]o(F_:Tt,vW0$-mJlo;&>c9ϸϜ0s/Z;vvSfWΆvR,^V_H&VcPݝ|]mpOwt5"d*02h۴ɳ-[Ոf<Zc!:ă@Ʀ#L"!U'km9 _pƧ,#2@bciDiV=|}$E0oy2P!ځÜrN?u Cz-kW)!կlf8?%mY#4Y~*X/4daz[-}ɂz:¥;QJv*^A\D_>ĸB#phn/K}]H?SmeD-31OPRlTHɶ3.;*-2pYa+{ f2m02]n1^HC;"nqfylĜb)Lqz:~ ަbs.W#V:‹bY^ڝ|@8LAhDL։1b.sh~1$*/c瞶mC?q98 ߨq @>k=j(h in%茭4`tNja+"%nY$`<&T3)7՛QFF0" v.lOZMG=))-9=/*$W<@cv իyenqn+{UFQ;Vow;|o2穟Y?+gؼ?6Y騎8vᮉD4lK-5:dО:h& 3/aF^" j. <sA -s0Ւ`ۮfmn:bBrM?ɱ;POs;P',\.9Q5|tްߍ=b ǨKs4“٦f Үf?PXQ?\'m>` L'Dme|Zi{!xZQM|q\E:1aqڐumyߌ % AUp5qCwȞO# {|>TͶQÀR''3U](bdq]<II]xzf̭b]&(ql[ WzoSuhQe~`$A֭39"PAK}(m0mWDg6ˀ%JyYJ ?80hE#<)~- q^7Z߳O+Hu>1U_`x:-. uzXd!I~/4e`OZ SZ_PjFAcpL qr<]4;v1pKZ^R'VcYtpŴ^z͑[a3T.KlheKیb! cIi}]0 tς\s1RbSb3wLC`1'[.EXOWހ{잭AQPB`t:f^֝IM㮈O!"75RnFq$̋}|1&mJфlma7b"΁ &fxټ9ȀZ"F]DpG$}*&}{Jp;l"L:{U7W h_7L;t/t74o}9g|nd=zlU ͔]ɶu@FM,-*"]%w]enNC#:O $)i1id<7^oŃ/Ts[Sёxmx8Q(@Ԝ,-U:ф-b,͖ qaYbij`_ C7.KkJf 65Eoٰ7=O+A"~PaДA݂}`\.-W5mM'.RWq34j=NT_m7t.U>1һ: ]pcO<ic6=sދ.ӽEWN[ny^_OܫGp̲ќv-NM8<,k c0 {)5|6=&` By'0oN_㡆8.FؼcՓq,yESn""ut/ 89S fؾ= xw=yŒ2x~sPC$W2P`d`7pu>*}DUAω`د~tYQLVe7[l~Nf%A$mŵTA B"ARy;T^APBsUT6|GKm*[dOaHqR϶%>m%pJe>5mEj7#W }N-,=qsh}b2{;rQ̽nnI Pnrb)Ўo[gJO]yq_8LBLEٖ&7ipLsGZ+dmv$^jĬptikmm\Xb9vT;yS337U.Z |~&3Xv/ j~c97C{ #D+Z(l[/4Y  .k{2D gx="TJ-nSV+|6pF05OWbnv#}/[(|n.[;d(N87~0̈́1Pu S1r"2Qc4:f\&\ N"!厐]獶,o>ee q'625xfIvܘ ,$%EϭcC i[-9 -*l= -^MAÃE:kQvo4k%Or)6&~[܃w(E VѺsOwm^`qD/}|%lSp\n}r%g_ hNo$=dgYsM5|kQAj '8ױ)JGޮjt5to)̿cU= !PB3a_,ה縰r @Tͩh7<̃#)fCn58ݰvK@X[3UnۥKJ[ ("TY>KOwF#BbVZ]7nEKk<͊=ﯗ,,b9k+oUsX iz-s:T`ȹjU)qW?6h&"öA)LQ2?"8XAOsbski7)F)@lz۶ o O?&Mʚqof-"c(A .F!}WpaD=N6ENW2i5)-fye}iBΪѶǪF6ǜ$+>.)\+.U[ kGa88EVX j-hv=k3ZJ%zM 5T_ Z JVچ6`%;JPW::Φ%|  QhE_PvZB6ʛp6js\-%Ի%Z3vlGz8~S6"Sn5-3r౤*m_uZ|EdxQ:UnsjbyZK|8s%Yu猥O‚yx5EcTvQ5<v{3}qUƱ'17}zX2w,r(1êҦ^K,YRS6[[n%L{]{A_gf_r+e( mSAs Hg~ab -&=wM*? k$R n.R7J>:mQ V(_b{Cz=WCGC.pjw:*)aKWʒ#x9$h+$!cp Ct`!MLzg6S3(羨+k#.[њonѥIWTSQjn.R=T^ ^\)jw P k?v/-(Dxa|ݾ/.\]cM~;:6OΧ Dxm.Vf臃2b :Q\_Becd*G ùڛK>o@2C0Y:zJ~ \f$f ػPjV[ctq>Z*#x8QΙ$z@6Ύ^[;kPY۠YkRZq*b3DȀJI&N8Ѡ.QezG`=q$E2ViNMYz(Io_GTꦣΩ!FQyܱ7dk.tmSԠ Lo )fyգaCP&GW1qzcnqafфgB$?9MθCL-LÈ%RKJ D,j2ZcDcB`Á 8H`qDj5bYC+,烌V W0*D'BlGj,uYMJ,xCbaڱ/,g8dFPvYJ ~!9 qH3 Xٚ2<ٰ- 9 yY f\/0~>0jSvu瀗ʅ[̧*T$fl)M"Ptd=vPe|9elD$+a ܎D&4%E"X8!{θGJ⮫Z!)m##R,̠{ne\M|^TUk ͦAm0\G#Lu fE@FY1bg JasjW- 7jH?\6;Kl ,5-m4e`!o%5_ƨiFʣĊHhMlayVLs:9 g7֗~kOy'\+u5 GEk KPn57f*5AW0uFvpM5Oa b7C|cfݶZ=~lJ6'4@ ^ /Xɽ!N 8#]*œxBBy")-:;ڳw 0&CSVid9Dm݀<;"ZLyru6f_\%u9 ǴЖ:#D8&ZEyny4ް\`Еދ,Zeѓ2Th-NQg'_~{Xr| 5u؈?3xVK6 ;%bK\C?SG7]fBu>bҲ+ԯF3{WLjL Ә\ ϝRo7mkD|r3;q[ ".Y)92ðL&) X|Ϙy+q$g "uNq׼1{)CTWM.t1trq &\`.&#ESڢq7R:=71i]$d,7?ST(9i6X.IX3~*zy8yB˂ _, VLuLȕd_+=[S;g%hbŐ#"՛ud&?BfRF_IS,`B٘'&z졗9-M<-W--7aӕ=Ԙ )8m.YK+=or*2eJz(4QRZ7Q!?l7'Sz[pu[ޟŤXAO)Ocr\QGͥ>y*k:q\,ZcX(DzE鼨bzұ[;&㇮ktc5^n%w>_-uЃpzW?1F?8Q'a0W3ԐRϖ.oG:k!rǹBc}7+5qҢYr,5xȕ᭹ïe<)ү+b.晭5MO.Q&u݄ڼ`At~yKU kIcnhyŸ&1\|4TL4֙x_T9_zA EUd u Hrұ=@1#̅}֪e**?Jo$sjL5 ./j!8q k>*δƶKMv`ATAxgn ݄ _;3緡+y:y:-J0UE'{V&EX8=-J S$`L)d79ץeӶ?࣮6rhah.<I+ Fy FVt  `]a6hV.γ$;x, Bp) >=Z司utS]'p2mqZֵG%>ݹ{=>̾@bp5'SvJGX (pәeMB^- \E>269qv)$/_s"4IGk!'j:Sj푻 /<]lҮ%GHSs“Zd I$b Vӛ{Co58E[L52M.XbL8xa_DžQ8fEܦ,"fIe8 -PQ,A !-h\őq{QZF< p034Z0݁aSsgO214jZ%A/bGW J[u痞@l= " 鞛dcnƽ @dt\PˋjL {3eGtR e쮥j}]1CpV"Vj*_a$9Jv!bB'Efy}r"h7Jz('0ctk*TT;m?EBY=]F',@]OQx v;xW*\$nkdHݸfȌN癵I EaZs 9&,ϬU7hw+Īց<;"9`s\EĊ컵!x쏫ȼHg0]ZՏ#@yb2jC1s*$.'C` em}%EKq@:^|~ ֵ (h*K\+> }_Agt_U;sa;nxfoD0o͎Q#nNKf?5B_sp:ؙ ;H;8]?H @hؒ9u4g7j5$2lY=1w؏XƏUn$Z?ȋl!5~f dA{Pn:淅淐d89qeI{_\MFupE] {R7;[O[_S DmR@,j ܗ: }>\mUFo'3äW;Uk$+U_2FeN_EgX+=pKJs /p!D8k:Ipz;ç|3!JC1A+\`ᅙG9@aޤb!:IIǔ%+^U!)UŻ.ҩ,/+S|P?!%ѮX;fdXOy:x)7q#F܊rMG٪ݾ+5\0^@ Mt? M$Q`<#HVиOAq3 МXe"ZͻY6~L{ii 7dM!-GkL8B+2;xPW<6k +Qs?:)f3TVSFy~M?A!w<O6 <6L׀gĥZ@` "-tAJx]\PsL#] ذUzr%ĢG>Jq"MI" ThV}oyY*N &CTӁ DiNb|מ6t ?n\Խ*0b/aDy3n/m#p-n4Vy% jv@#]G;agpj˭|zWi yB2|G kS˛­`*`%yh*.X'o|] <09ӆ7߁ҫCqG5$zwAC r]쵮s"d\2,f,I^cgw.GԆe*y*]x^uG*S'.J3ٝfNi24ܔ"vߢS,E~!!֐pqCZ"{x8/bYSZv/prn%I8P3M^o8P~dS};omgCERS+b1@Љ!WMbx2;<7vMj؂O.5=24ߘњnJ^z5aڛYǍBqɢ4%-}?5x)>)`F-Zóz/%1x^q*rh}r\[`c? .y<:~+V=KuhƢĎa8 -H T熽#|'VR^k8,9NF%BJ߽-*`e8(ً)czjhKT |qxN/1.8KV4U3v~ȴbX1{Xm{` % ~+`/Fϵ;pt 3Qƕ+ܗT^|Ë-/3D@-<-YNS|d~[m7rX1 %vN^~ͭ8PK)$} tCNm#^$F{Qz3*+}s|7Z =ĵ ʞW4 @x|_XȮHlI^*VYA6y,mCG i5MN7P=wF+yGOZZ||rvgWT3ESso+ /I+1iY9gER@VǥQiȖB_uaQGoL{EC;:TD`QXŞ`>A(Mݴ3"[+8.Zv̭:fю?8,N/"~dQhmOe4<&XiM051 :7X1ILu݆Gt֓reAb}/T7  ?k__Xvjs 2~Pk6jTɢwM~Hl0lc?=>?Ngo5-cM/㮶?0/rNtZX\1"P1)uɮCaDllˇy~p3R}P#muªNi̊{lU1'QJU{S|sz8lPR{=o/u*:WQ8I4v9hv<DM.~cK}˄s eu*s)Xӝ5\#Z(jEң?%4PW`m)f][Bfoӛ!*4"82ys ~".n)÷u݇΂od=)hu&#ߜw W0BE z $ k=PՃTgF m/ uu(bXZ"NYMl+"#NVOD92h I=5{G_ o볩$`0mM߯cAX3WUQ$x]j(|KWO E,GZ3H4жĥ&{wo9 6C;7z [<^\ylaҶkqM;?޸l+DFkhnΫ5/4b{'ۨ>)m͌u@$M`Ϭ!:S)n}4AAYO%E7,CE5c Jh]aЩ.gYf: ['#C'ND t:Q:1+!o)NJD~pv cK0D@2hv~E7=? \}o l܁ ,e8hv;+>Q |rfV+x3g8umu5$xZmY'KVg\XCZ`78ؼGTԗ杺̤+CC7Ku"Ef,+6@8'`(v=:>,7uԢU۩?H{d3КC(~(!g UDHlpo̜fO:B i#V3̳͟xC"JvhӞ73e0> }+6x;mh&4˜&"Ԉ6PdRha Dz#`tdAǢǛ$f-<֎,=:k< N9/!@oE4MOlHߖ~g '5(U`ۂn (M.вAy>0N.?bjMĎ.B&'_I џf Yt67TͶehqk?)d\V1PCeg4&;dUdfև//߯= _@S<:V-i8xDO*u,jCgvFrm9 6.+u|oC:Vfjs1<u@ڵBw)&b$[1͚$!8C$q[Lx!o+0i؋$QOCw6{iERw= k[YЁ> nŶ CK;8vB=c>)f`sik5(nK(Hv 5->}Ptͫ HƘu.c)sqS|(Q?5۸Ȋ)95.l֚P!AzM@έ2ow;T(Gd#X I7R>aVĄ"Y+ e_ nv, :ՎJJ+^<m2$tS2PA#fD I~d8W%>Vi.YQ`]ͼ6v iiGYkN5UY.4|NX#KEØEFi-!<_/ͮlr]z9jFiMwI+[C;é ReKw97ΘXv5P1ȋ0Ap O?9ќVly FZqJUX꩝_&=@2O_OaX| #v4+SC`2o0D%?;S?q%Y~4 #(#GGZ̓oq#xKoDd`#a^Xe4rxn <Ƣo̓7X9IzЇ/Dxh}W5c a4؉: 4@r~& -5 {A⑔Mߪj`v#w:q#̊_2qRE>uu4c2\DkbZVCcoӝ0wo,ՙ@YYSvܩ_1;8f XzOcEb7ES|XQ Yg&mf:V(1gxnXuh|;zJ\ڬq%uU{إ#vqviq?6 SXH:E{1S{qH3͞EkøԾzȓWw1Qv* SK\M>p1pC߁%4оtCjd#W* Gdz^mM)c> CbTRiq` h/yi}Md< %9X9d!i4ȨdW`bןxTfE` 7SbɎßƊ;Zk +]z>Ggc'[1*NpDI>=B` 4y@Ofּ|HD:z "y:qOHߞfd)ٖhjw8t<&>דWDUFˌ"}~Oq\Lu $T۫5F&@ S(+aEgtTtmɼb~NJ4Y4% ׈bc^p%Da/'8QcS0A-:snGpL 3bA<a%UJ՛\679?hs2ms )z ,DUQ;/\ߏԞ[S0$Z\ ;}ӺEmC{Rp=U,:UKъy>,oRXj2zΏ ո9Fx'RVX/0\h!ztؑ@em.;.[Gd{Za c JaBؔe"AWx< U޷}x4JxBsX\5,-kJSBh#yRf|/+)7D^{pBQjM>[P;j!fn@z"OIyASQr؅[ PxVkN |*?o!>HM5`e㥸^6;| }v=|/I$LErˌFܗ00d R#梱nCV8+vc+Ncnm#yƽ9"I?_L{%IX[Y]~',nq/GG:@KP`hy@ycr#޽OwMO׷[J8v$`Fz9kus)PR2G НA) t*1Ҿ]dLzD<EfD:z>O/is[nuYӪz.P !kWYڂF=>Ec̑ӥs+N`kឣCG Ďe`rˍ!Vre!0_oX^R1t9Dj{N4x>ʛMw>jsl^FN(Pb̂}X::]E0o:ViuhmqwWzW"\]ZR*)oG=<ۿzjϹJT ̸OL7TnMGp"Z*m[/*}r>Q({iSZy0I`sBеwE0]{^F1׌鞧C*}q#C*74~gl #;Cc9&VMJRlBxVw(̸Q?PBB t+3UܣkS|g~ )LNӥDȍ5Z)*h F}s.mTϺz Ctz2 I5Tf~ZÜX~{J1r>~$.s-!0iM:RN!1tg"Rcjan-eɶn+i<+aDxkp~"d`f!#0M98115%mv7f܀+vI쨠i.Bn.h±TsM+ߔKɆYլaJẑˬXi안$1fg9l앞pqyoG|{W3`Tө[ĈUIֶ🔫$~~W/7zqkf(eKcBwo~ٜ<2Ws-_nqih.Rv/fvI hR"^Aw lo,3x jC]jG%&~dE`s൘D=hGMkXwsp ݔo1;,x˥`SP/x G.f=vf8MjnW@'acЍ&cBm#Q@ ڒ̎ q&T*ȵ7Nzp Yqc?;1!<\b؍QѾ'h.kT_`4ʊ{D2tuW."x!ɮR.>ړ~#5>iZ_E槟d^@ƀ'1U=銝l7Ba)P_ EuMBج7$" =J#֗7rsd9!SMڵ`ɇGT}_o .3Q  798`q3j)d)[cQI}>H$9z^Nά!B}ndYwk.)bitx6-.ˠIWO_KimI݆R/7 kqٚ#D*UIuMy`GYp3ja7NNm%?0 e-a{({m)_s-|[,Ы~'D9pk'ÅoE#$EUbҩaWX;a:f >vMXǤ`[v`9ʣXwXpYZQf]m,ݺ}o56}Wuj1,kXCYFBR^ͷ>g"Ȉ3f3ӎ Z-;;C0B'in#}ckdH!_=f>>\QhHVa {#Otz{梄Ǝ}pt:vњ:)87CJۨA[>v{lfO daW Izm#q _e&yAؗ(u˱n=mgfkyqrh FN>gyXxySb\E,h<+~ BhfNTVvlu:? XH \3"mUHfvncسsgi&]P3n[,m}ɋ_]%|ƣ7|i9<VWZح+׵&4MZp7Q1 v31*`-}+c{fKEFvi^KWp×j{eq@M.*dm ״,pq=q)}7@/hhtTa5waz n:̙dV >` )d*CL(2Ckqu*/gr0.\6D_n<OgJ+sb]opnŴ}<8 '7-PV = ar,u:` ϨQ ?P5G^%X. 30TzzvyNTefV_Zt"IY-zN'l0t k"[Lp͈<|`77屘c&h[PX=ڹ7 zEC IR]NvSOl=6OgZ46D]ū _E| /;dœ0i צSN˪eؕBWyj(6#Xj$m^`Î3V?*%bds,:\ 1 "kE>3\=C+gh \m6@//57(ܹl*pnM_>hv42Jg 9F*8{Q )$H?dmf8U87BIe%("Z|_K٨ؖi.OS¾ÞTFiUWVXaGTnQeP(r}x.*G{*lmzDÈ2-|xJ#{ H^N&n뤒*anb #m2T8F Jd3ۉ C7<_!GU/ 8_Kl4]t9 z.7Mbl U0HKo {kǩV lv.mdE:IpqvbE#@ɶ%3c阷FLKϧ[aެ;@^b´˙^m!laW꣦pe- 4ЮvNNlgvԺ4T7DliA)9)[&?% YG1sABdcT˪ֿZ}b,f.>Ʊ傇o=AP ! "X'{DZ,yLd9>"J4HD^g˚լSN5Bb>',Agˤ(Uk;/Ŷ( _"mf7X<:8BaA<}e(L˾xkܯ}py :c`5p6}rpfiov `g8NȄS50<.^լT8!]S^j} k/t腍ZȡD$['Pn3TwIcPYk-8bVk>Z>K?4^:P0 pPk=a,I $!̺Ő7Ʃ wAD#K'=Si CWhED;oѲM60Kq>Gmp^ZtGӸ9#` XZ$> &.؃]*ؕQp&Yl+k<,^>Lۿ^-~oDom`0@_3}D୔\65eZkOT ;C^xtu. &M7lQP.k_M m/-6mDPl 9A=4c[EUB# esYt1{( B럹Z>ұȈ.G5Ե\g;dm8{Ur逧'7Ӡ.B|"-)a>g1KI75 "k m M}ēƯq2T=|/)No/Ǽ%q*Ҕ+AmliX/)WCrE-J7)R !eʄ$0h MD4NDAdAP%4͇!.9>t͔jkVPzfZEY~kttJl}~jm۝V! 9ͅ e&+B5GRhC"(e]цt('KOϗ}iҜΑxY lԅ/eT>jn8.tV}i dy?7SO>"t2 fp| ziY߽Qd jo5?#T~/l2ܱ5\NGeHj%b,ROK(13ȣ<{wԸyhKL[lάt XZv|$D7({zt"֪n\[̇;_iƅ\cy6 ~6}ԔhX CBIaŷ|(}*ē(k=%9ƴ'o1ӡ+@mYՂ弞&t{bs%샗Hig@ 8oř@(-ejAܮJPBfHdFzzn*vh2B|P~0sEȰ=^K< Hf$JvgZM&ǵ[pAmk߇9 _=5k8h=&X^P_3^d7EZ:ܐ_ eՖ5:㯵B=tbu_x״ #spz ?k a- B1({0 WZV8=ڔܦ\{+Ԩ#=_Gɓ-FfS{wXu֌OqS ؈#z6r]"vgAzq *`QL(6QkJ:r{̮U92 6 ٰ~."W~>5Dp#LBz)fm1o욛 ;G/Et I淍QDf? H:fWQI1Jخ~Q>,!{r8ZneOm.[CG{'(&A0ųeaB|$79WKNx uqX}/sj=H̕<^Mg[1ǮUs UΊVɥ ?8TW@"m$:tdg>^O|P"ULl yf뮩cx~!hkxXXdE`oe ,$}šOt-*Nh+(Mu Z\/Ί8ڮi-L՚M6͌ f:DWg'}D[T\?K?cq5>'}/<4b~OO:džmD}x_8Nr[<Fj)eԛ9XV2tN 2MoW/IA ^ \95+gztܼec|/BPHWۍEdnmal39C/<0gs>O948T}YX5ы/ía 1h(RvikR-6oI60UF2d[)I5X6)f+M}[܃N?o|c{aK7ֈOVXQ:!LeK NVRpq=9V^h=+gKlct3aBl)9Gf}x[vkOZ]\o[[:9فXQfw|յHoIiCqneN_Tn17H!"(5 s]+,6|-*2r cP:Jz .;g^D92s114{{ɋҥ㌋5 J@qE ~KB^Hu۟l36) (ak=59˽fO$ A뗃VrSv:Az@xNOJ"ᩐYeYvQ 9%[6h9w{őꯚ̀:0{zZo갭3K"y0fB֗ZͿ9>x(Bh&ʬ7m<@Әoj!ʢ]Z:cF5 FTKH0o) ,uvU 4*dWDOn> O$4*-blXg|ՍE=pM=<㆟(~keA3k*mV+-KJm,~kAFmwKoxp+?lŜ u 65?i]%+7mP<%RueNR -sQ|%X˼ mTFWF +d"mIT˄ڇki I$:{VU[Tg)" (Pje>&|ʆ {pNV}9l`4;|Ud5n%y:irІ\Lu~\|}U[I/OemOB9y'NzjFiRyȱ2?lzF#KmY d1z)LЌ2-_`j.L7qY\;똰bY.ǐ %M=8,r_ƢKm^iՊ.8&`q毼+tøK f"+o+EhH~krv\.|,xX ͭp%x"~y>G ލWP#$k ;zq/Y{!t(4D[N2XkB.7A[jS$cW7PڍEt_QUKnA&kFhFpF$"Ee1l6:4Ѩ~ijկ3YՔx}uP2o>;*䒶wnq[Z к(,el5`,Q#^FSG<5rZ)N&&+K,-Ң^bHȺꟃ"=5yD=;CwL#y!24_lYj x/usAtk䪠M!Il9&a¸Ĺ s-,slѰ`\ެNP?FTPfS2yv_U +\nJr+"Tc࢘#kQkkH gZ \`46Z1S2u3el#ѥYEp܊{Rtqճ%hg3E)Gd;v'5ˢZz!׼zTg&k{BT=ި&N~uIUe 9WvLL)&%.Bb !gmv`1~yr!ftu7)yV1("`_0Efu%LTP' IvZA,*q ^_݅W mE4uq84ל˖ecZkA69kH 3 aMg/ \ѳѰ@a}5Goq ivb/Uzim?B?j1B|#.vwCLsA)kULI\lM}4垯>M?/Q lʼn]Wm*[xcHotU()Ho.9fN񰒡 4>}KbS oI=G;6**!ˊ0.cT‹_vw!n,g@X"&8ķj'3mx(0D,V@zWj%4b$JM0v_AZhZ;lVR GQZR!2Y#^ޏ@I/=ټ %X[#ꑏG06#XwGіgr=^KЦd`ccVgw7bwBWѬpW+fuy5n_`D5>ܳ`뷑B֌IH3ۂv&?<ǡ*:gyŒE[e p{ZϼT'Yi|[(n3jhRۏanVvӕ> m3h9I,x5 5@"gi?+9m[,+=btUk^gww H^/qPRg.-]cpnX/YJ֑<O<{.ij(ŸKGǵi>PN U;^؋`F$!8 뽞}rI\4#J7~kW&"43(u (AU ) K)fx4X_x!d]O%Wc FӢQˤ7yoK7Cofn g@IQNI}eOFʡW6"s-Įhx}+vrgM$"Pyտ__b>Rc{b!CO{p:`d. 0Ll´D2V`z+&cnHh€}/u)d+RR;,(Wm j1\$OOz(b|+x͇qk GVq͹C,.7W Ё5mt5HК8Vk?f =T]e OpT7kc#.?lFEfm#VvlVEnmvUnFf<۬ 7kSkOq;O>T'oڛu[|׾PԷM-; "4QLZ`e!B"7SL(6H7?G'9z3b3&J'ӹѥeP2 Q慸q<%I.:; "?aIMZJ^tHnj~- ֑-2η}آ4,*"!Z!T h/YyVGǔ=ȄVζG2ZfTc懘?0ݷ K]k D 54"Wuߙ&k؇Ph(vvܢk q=/6kк"uB8v*3̩BB/^Ȅf酔Tj=A9|]'(ԍHr)k#xa:DAjȓhX<дG~? V^ԝ(r+[ e8?*Y-a}#nt&~k'#$7 AhZl(.a=y5/6T=mmZrHr0^kΊ0| s :ڱTmMXUӬ~޷S@nu`JKdȂzt<#KXK07bI^ @FTkZOl=ao7xwktpYF>z:ޯ@9$'HctP>H[K/SVwXK 2CSBQ6"/Mz }n'!#6 0G;&ja)l< ǨYgDԠ+'hQڋQ^'^B 07,2@I 0a_DmlUDQu`wL@(T]+n!VۏJˍƞLNcX;f.;y*:7b0l3Ub؁XC$X> WQeh[R2:CP#<6O8ۋ= Ec6BŔPaseNs (X#Pz!`x9ZMRJ;SЙfx:O]m`q4䑹F1@4^nBtgqrhG֏ !s<2# z4EZ5Gd,"~?r,vNXb, X4d, @ 2Zf^\x,lEEc1b,5Ƃnk}xq[ONE@OԻ'ԣ98 l7rKQ/Ƶ1s"//ب%Ϟ&17ᔺF<F}>"ح^4pIylX؜Wv-+ a6NZشES9 8w.AGn[ d)~1)'~" |YV!.Uei& !Ay}a@ I"I@AcͫήrO˿!Y9K*Z dDLcpVz$d](=rHd r<`N̸Īo!̤^&'ܔ+Z{>|9 ~Բv^X^^ D߼Ғ&-(2+n)()SoRF+卋6$54F5TBma|gr#Rq\E@: Ʊ8T uqb$NGԃUJoC)F-y(A#),lZ_Xa_H0Iܨ_,}b_ݗqճIM2RUВ:Xbxմg:;&CA#p<;S't] "0<Ӹ$&PZ/zcY";dqL~mCDp AR k=6LI|ȉcs)hgR~d0\#aTYwu{WPDLZlY1; 6/ \O"R"&\ LghoRxLeHjکi$wQ8!_2 L[)r<̦eǁ<r|dvPs/)|v^|D%nOó}u5-?1^2^1)(0d~sJvNkQkZveF%6-&%qZi<_a4k%T|am!JλT,Gx,{.S)A2 '5d"V\+v=s#6 P8v'w!8i$N:0C3纑oK1tD^ l? ãh`mgeVsW M1:CM,90x(Ec?5lw;(!hbU5)܆j>F/k,Zh% ]EaX[e&qZ:8 )> k?lWSέYsyQ(,r~taKQ gq8mpփ;8QrkiG1}sv&OQ a{=Eەj nVu>BKԵ **f EG3 fkO'6"\lc# :̱֌MTo =]vG#|=cl.yyM0[UB 9V{ޭK,>z%sgZIfQ_oaL_FtچA5bɡM)Vl|;J4ljZ,v\;DzxޘNsЏp7˱v"DĶVDڱD+1=a iz~X|ʇ≄+zZ`LG$)0 jk _8*L(Tj^*H GJm{L`ms:U -K~BQ[Em$b.T.xqxrɣLu-*jӇ_p DRXg(ԆpF6ba>`ғ5c_ճ@ִ{BS ;hf\0tߣ`|ZZhԂQ9iEIӷQ#"kmXyWꇲ^Lv$ 054l@bݖ9ס1ׯh;NϜvڂ+C"cZh0dM'ԀgiLXeqS1LmPBt /!ZP_[Xy+ئދhYcO:=|A'Qvy9ᒶx$k:T_k챵tqÞ)^9Ҹ2++j=Z؏2/=ԓնwJk!8߮JQٷlc~U/_t~6,ra6vEY:Tx- + d3!.(MЕcgK)lp"40IV撌y{!rҗ" ,L;m-9DaWOb+ <_JO'o,e:^-zP{t[YY0cX8*K"CصI+ O+N}AK`*ui Y Ǥe-%'-a@QqJ,Qv5) C96@G՗=?; qח6d]ɚ_QsN^xLft?[/k|~'Ͼ /FI5/3*Itsm!%:7 #n_^]Sz2L/g7TiF)G,6C9ڸ0NtBECs bfqp kP3tn-Š@)0퇡X,BszzWzyF`@PbxG>XO.<R@Z+<5?}5egVh^Xh9u]Q kvN7,-劇E  E00l\i55,\y&TyHbGV6JTT'{$w&kM2"ώzs@vnQLUɣ>2}oeꕌR$)ʊ [ٙ"5D T(v,6MM_h!q#mL3 jFiSMw*xW,HxFn} :_2IA@MP5ǽedxNl ~o > w Wc}*Sje5&"+x\nTv-}^fBNAwM ޗ#Obh==mmɑH|C,*HƷkF#aML-DvRhf-p-k$*V'`շ",L }?VqsrPU֢21xߜBX [UgYYpޛpR:sMe6go>G ٪(7ەпH2.F`yP\W18 ⴮tgQ/.ΟCEB-| a6$~7֤#'$iS 5'0Ɲ9c9iTxTb=j9wC_,1+(!KƴP(( ^Ny$Nh>/X*aI+bn-(-0k"d}֗t svWn-z HZl`2{D枅b&~k4 rX7i+rVj6ɲdԆ sw\$]]KGA+l5^R.'Z![e݅D{}??Rg0JZ7$C$!l;A ntxaB};Ҭ^`AG7?K; qIk IzSQO?^*I39N<\gT!*[H&uYLa]s9eoo^§4afyݺAůaХtű[#\2>fomW'Img||0w6`NB|JD|(Zt-fO,#5ǹuOeVS:L89u q+/WՃ]t>KcEKtήp÷jH>˅V䮺! ܬ#n,b H(:v,7"OJ۠>ߋŮW}2&(b9;)Pa}re !0]f'.gZ+gYH/TaHms糅?f6dӽKRZYǯjъ4@U1B ^ ;Ju1|ni7⹌OqPWGU&u nBg4<|^vn<^ϗղ8*q*u@Uf#EgS zUgMes-/Þ+[ǖRS_ 9)p>gS׀;%+=:2z5C]rT<;+q'R>\~$]0⎃uO%qCL2>h^C6t;#BZ"<)N[` t6In:LA~Wӻ7[]G( Fy#0 /8{K:3v5s/g}6H&6Ztd BPe'.EA 88Oa~Lh>)0i_;>}eJa:> {ova>n=T mV0mz 닧1(hqo͵{-?y~= x邧 s-[ӌv>T9Z= D$EU=:ʔZMPNr|O U/ы۸Q'-s/4~˻W<{i)jO.bhpL!K h'!Pd3Gg"h-] 5ZkR1`Yl(.\~$~>U19-8e /NjyNZWo/Fgh3 @?_Oe)2TDN mƴy儑f`Os9)4!δ؈*P J[{HR*NDA/ߋW7Ϝ/ǻafr>_g )p~²8dޥh0eR`Zd淍]5@SD`/[܄杹Wn>~%F\j`QDo2zU% hL{Q- u>+s vz ke@TaEc+@n #Sdp'=jsuZ3IB"pЦejaqnȍN@XTSkz<:Qi/7jMOvo6vZ#  sǡ~,-$S"CK>1ˁc+5 kGܵzKw4J>+E k~<Ϩfy38#'U}+Q"% $0lß'_o=ki9KUw.mIy4MocKڔ݆l'#]v[Љ:6šv"#sí\z0ڦb,acs-7#a͂1be[MJuF=7|J-F|^X2)QpZE!ɁLaQMd.X?耖Ճ6=g,2]7˕c >V8&Xf=pݲD#@t{8>DoB㴬rRDdIffAjJ,~ ISo0^xi(G _f$>p8:TU˂\mл)=sɕ m||^T z-8Ty1:#{!*7I-dz äRT,VsjFJBow ybN9SbR5O˾(1 sj5Ќ2.^cl%hB$+LAOL{>H[Ռ%7DRݿJ:x5xX$/TLJ|ʝW$v qY!*x#٦lHi|-`.s./&8Kox^U?Kd$<ܶO-@ F=ZVI )))8FMJߋb2 ^`tЂXK_F(Zox(3T/4\R'rXi> O??5rIvG_q{:T`}>OTo;0?o ԝ OU<>oOʔ4ڷL /;Nړ#'߽tO@eo&nD=#Y-wƢ>Omh`8|IA黏5(?SRY2a~xݍtX^L;`4M^<12|8|超 >thy!*.d:jwOnh5'O}!jq=QmЃ;Ro+tD4Mw2ډv&vܬBQA$D:NfzpN?9ړi+}|3G@| XܶǙfQp]?Lu5|U)ؤօPIBu ,}vf+9bT=!o?==wd8}zhwL>1Oc2{Apu}5wdR4EOm 1lEa8M)L(0'B|DqtZvŋbDf=4T0izl+ef*eMgXn/SgZw'Rex _ό(pO507]Sœ|8=s ~:Te-" To;M&xn3Bδ& ͨ_6S SsLT`$-&`r*B~s׳^kuX,uCFR!I֢jj,$ɸTZ+)>ˏEi<䧧?}>pb#$.~z7qģ"tez[Nasʋ< u*j@g$@']6?>֛l T+14(ᱤoW$C>DalQ{gbI2|J#M?><vǔIw*-EQ}$1a.br8_OAr^XP4(#&` "4/B=r>Q i9|tVfCˆ ×Ƣm{Jm > KdaVu]@G9r'$H+=kr޿~;,'3)rtXu|m z]ɾs}R O5a'vlbq]>vCP|R"d,~(߅|i˄h½W`~)G,M+Wn:݃j[hӸ Nn~cx$ʨa+Mpuk5y`KBۤMHX2ݻ}E.\WilйkO3/d!vaOqZb,t|Jo0>ҫD/O qQ}5aŏucOX>E ͬO^9tB7"AT"}z՛UH bAO˯BzX~Ւ)8赾y<< Gm0y_A7RԮr\LJٸn'VK[{.޼JŻţ~3o6lϊq1Q2=Y.|jzZJ>ۃbW%A e=w-FH:.pӐVT/ICB\/Fq,_~~SRd+tTŹS' o]XUߞP* zޑ1q_Hk􊆄"QGzK2`]Vvt M\TŅ*ZjJ]-/e^ ]ͳj|J!껾ݓ>D׼ө}ȇZbM[keW}Z:>(8S}#û},o%F-?ؔ{wY5f/Q oj}Aנ󸬾%beg*,󃟕[3/UK@Qv~_-7%X2]Nq.owG{7ǬTAv Ǫ'Kew|Qd~BRï_1/d/NNqjEh ?I"RQ;-.R4 Mc.GŃ0Ke?g'_U9B_]0?5U tS?^٘OTkr/203)xy}| yH$R[m6<$UgaL#,BM;\7zߝ~-c`$֡(O팳ɧ12;i%#h1~7-ji1M ԕ;(i晫QZ*n '?$RP3%[֛As2tThG1k&VڪF ^LU}J$,9~!bնo^ωZȻػ0섶:g>}XM.QME V~ < PJ8$^~(<.ݛ>@b?с 6B ueJOkCIL~*zUi׽Y3j>*;1T6O#]t-ɿ#d^D"R:.(VK3nmeMLWUxp!:|>›'NU;BZ6]#Aw (֧JXj^qLֲPq,QEp#J#Q]sD-ǿ0VD'>V?Fq`L`GG?U@XVe%AQ jzܲ2|Ͽ@*4c;!U>tK(*vu*w N܂k+; ok޻ƓrJE.֦2i va"هʊV} RL/Ep,֋ׁ`)Dim{%.(G3)"\<fREXwmdeV?-2G`iUj883#Dˎ1rߣ -@h(rnWbD&kGE \Bh()<4Zp%Ƶciw&г5)*; փ h^ԞjuN2'4AE3p=" ߇!H;TE(ttW뇪iԃ}ɾNm1k MWɟziDa (fz-s=Vx ڗ1d*K)"j>Mg?ܭ>-Qs`V[`]L8+;h6Hõ{Lz*Xʤ@O`v؇ lƅef$!v_):Lb}) SCŪtLqbDzh*Q*|Z_.wPi1X/r#pP.` t黷@l y#2I0kҞXfs>^ee 29z*n8P^i 7BvNle(;rtry|89S'~>8嗳' Kcz<|cdhwf~UWF+WODJrT$LzqccF6c]?lnw͟mQdV3"L=_A/ p i0}~Ǐ,n ^!k8^v40Zca P8gNU h.@KPF1CԛVW:Zn,ksOb6']z4r1]kmPr$Ȋ֔W/KYg!GJh D5Fڲ6#ŊYoM<dѼVM/l0@y\8|+G& Lou@Q[vy?]xE,c¾MJT!Livi)UnǨhPQ(.R |k{COsޮAN]BoqS1/S0/v)ڂi[.;-S|Hו.#. 9bP_Ox!jAu>0JtOQQ ju-%sˀnB[G%"wIjZLvgrY<PSz ;f^@*q dB/ÎowLc.%$ae DZ'_QÈB w ͌E+ºjJqsLOfmCh CHSZLqa ;kΌcM5n-veF4eMK|K^XZ7;<C#毈mDX[ǝ}uO4b/B~V<2"JjynPxQV`1͋׫GI^K]$عͣ:ߤݴE 17&`~&jJ5WrvTUIV+nF0]n#23,42xsI)I opI ..j`'y-mS[d^i^-A_5]5<8cQG0ˋZc͛ݖ?JE |(~ zoAQGJ7%MyYZe[iQ Mܲ+yvaksyL 3#LgW1|8<=غTxy~u BǗgc2+N '& 9%J!)w>フwJ#~!hrl)'Ɵ/'%Q^zVy_w4w ATpF|i0ĸ8&M0"A@d` Vr:x Yi+Ý؃ϓ/}?=EXⱖ=  ugY(fB7Om:d@@5 RCv $_r|5G7(NϹ4OXpguU8[e;kߢK9*+\P^jB0Cd щdHj,p:0(*?s2#K>ENuRPby ;G3LҖj,_E;'SOҗU?Ra:֐1oXC4QVƼ׉ )kn;1>$@ut1u/e&.̳θ-,UNm>D'1pA|l!isKvo /-=Z/@e9 &oeW?Ɍ^ )wpXć=As ? An ƍum.f;>:n|SsgU.8m("Vq/1v%G;qyutQR.z-qmժK5,.P-!EP)v:l.6p`r3ICa.h&G =OH:fT}'q᳀&p.}\ J.hǸ8kch~3^)ϊ˩lHP$}=1|,!umxbe>9w"_gN%ލD&RƌnJBDB!j s?4TOXAKT4t$<}ίp!6G?6*yM*vUDyO%u]T׎cb #қ4d6_xH>\dBcb[cEBе{Fo֥eH!@[X MHƭX̥MNvCTy䙕6,1/6Q^Q)GHoՂ3PtzHTFj0,%8o믋4xҡ9lf*#^YOoE7 E 2_;?ي\7Jxg25d+3xHpSjw%Ò(uG;`c'rE%E:6.ԣ0Xq0ro:4N24PJ'DQ`8oY)032(6 Hc1&y2$FN) K3BUPA_zQ6iIWT^y\k돯K?0Y@B%|dzE5"ZD.]Pƻ:}J^ַgq6=I3D"d,r(4N눻7qjfXY$^y9U 5n4LƱOsga iCöfdQl~xyI7B:O|-}-TT&qfƃ̿ߖ$U#q c\\\: "ݔK:;؜<+N׼ 3\$ȕ yEwޑAE`q,S;TX"=z.=}BQ{UzRHwl#~4򥥥ݽh4zS[[ך{ CgQf^.}a_4cʅ(*5PWz\c)cO&̫f!wxR#;8rFk,{V/w2%hs / tF#׫sclœLY74]}PYR$[˕Htf)@$m%!yx>~1?̓0 > kLv@2Ka{< .6J=T=[o&VRMr;(=:Ag܂83JM Jl+|!TwmXWeaA,~4KnY ]pãZG:P2ֈVjrS*yA'e^#QFe=;j5*VqMTU%Wz=^ 8v`fgAC_X 9]Z""Aao M)q}a@T%6xǐS'#*:kCq=ʲ\w !MZ=J KLvϵDaxkgbw5)Juu,-~:1;Jڲɡ7~MS ։cJ}0PD4YmY0k8ftwr[ofS/qsrQW㾑\5VUtٔHEs t؇}^>A#ducs/_O?} pV&9.37\MK$t1j3u񻚱zb3 N"ePV+YAd[}ԆoLA Ez[r.Ѣq&~fIOD/l~Wy;]3ɆvAB:`nH0l%j%):B`ZUc$Y sP T#.A.B0`KmYL]Yy{3'' V|]G(rmTfRYX_fBz{~|bAzIw#dSa@/VL..OƼ+ˎw5zF9zz!hP7vxnjO !F7TIXF* X|暒fAv1/N\n;`#s-ʞxuu^ُNQ aXq`3@aGPIYOO1Mj~ըQǗ|mI,a - [+m$ = )PmRUB!{1cI{hML% 4TέMyJ_Yu_Ya^Cqۂ2Eq>2Da|@~u oڤk5}c+Y$O5ob jlIMWz2br{yh{\^J!\7zR*Ƌ"#J#& j/!C i"1kL˸B7l/WJ#b/_~Tـ ~~sw SNnnٹӔA-/2mؠ-[>f0S}UBYK0^ 7kp89AmvO3T԰CdXgqbIVdX/tEj%T!W|%3J_ޟEYM5}IE:CJIS{zUslF) yz=x{ R*+/G]&FҰ"ýQڢS㵌M͖`Bݦ3f殽Wi®S `J|GHݎe7yY@>ѣ 3-8أ"\t T6Sp-QzQdBt8%"(!"%77+RAurH9Ŕ25ʉ3S4tEL (7rrpu3 m)grr` \LY|Al3R:v1Lr M::]a q|KpJR77Ht7o-Z^!GU#ӠK3 hZpLѡscXŽYt&hFU؆5D'4=4_HLøLmFA.&M4I\+ʮWYl^vKWx&v8Hlgqq` b\pl'v*DoЭ&Djt3lSlSA3;@vo?p' j#ܔ9ݳUߑms ;Fɒ]/Dٜ]bΥ"D' "@)t I8ʗO~Sct^<_$ɪo߮|N6wQ1Ͳ ]¨KBs$=5>7JY峬8|W$oKjlj__+3,Ȃ8ْ1+$:@ 8 J71d~!D<Ȃ-lDfaa)F A衤Qj{ Y0It?]:I}|m !Z$ n=V>[-&Ns:z)y0 ҹ5J+ CcM_"ljNrmz*"ZSHtpk6zƹ_h|CUG ` %C)YXaBM~i ͟sH%ƒXt J:V1OZCR{(t~>5WQ߼pT,`+ue"uPkfy&:L^V.~ioO~牥uc|n'sDcՃz:vgY=8M]alv7[pFY>N8^c:ac}Lcħ\ˬ~rmLk}r?nXk+1;Z 0CVS^ZiTlKɥa cRp6铊o,:150 0AJ8(^&CKFt|"(|q: |odQ/adY0ʹz 㾖Y{f}Kg{Jh QN+/isjmQLǜۺmY6^]#( = FNv/4ilsp8Ax$6irrHJom>PjB(9xi"R&OLpD}l N8.eА#0G{ $CŽьB9A|%'}a9fpIfmp GR2Agj aɛTL&!7{G Q5K 7ş>1sj(靝1C X"iXn\xB"Rvl)|KoEVvBUh"lۈ_S5cQ:WۆGo6 Xx 6!Kzx$ݟ"W)"b [[QX'5OfdCm~g& @E=Cg 5T^V2 mZN{`x`bx(>Q5"ޛSع (g*/itECNM(Ԃ@ލ dhQcɉ^x2QݖW1vk|G<h/P FS;V@D8syj{R(.좛v$Ki0YFcdp~Eb8.'hVޫ87`A: o5c=eHH0H 3IFKW~P{&hRسiP[J?Ø9Ps>&i!%-j%=~;>691 I˜6mjfM3 fqo}miN$l&V@6 T>-.Q IV!, 5 PZ I*BaJAl6Yv>7kus  @>pbb.)R ]ĸm$H ,3CU,AhWo WHց]J>x{՝hM"x!A,\Ŋ= Xi϶م?޸`zuCB;} 2j1"mGkkX.+ːL2,2.B?,S9pA7HCa:H+>fn<~RVUxӼ{GL;юXR0H HYj)k_!m-hV/P %1/^W& u"Q9FקB^J 0[ۥx@ \LYf}U,˔: Iax*""^0aUz cل zjC"a}whIе>ibmH ` sbWlü%WdlEoͷOڛxǣeլj-j!8 oSc'mCq_yqi%cv k;v5 ]i *}mrv3.G_sQB QQ_x}[![-EV%%XcZ`kWGlE+2^61H [U̮~u1`$.'DfP\c"UH_,Ut'[QliʡJKEv\OƜmm]z,&MD'u ٺK\TPعW5U-r%Yxq#jTZ V A =Ei: 'ϟo &}.W/Qxo:Z\ƄʩMz=:UgYr/)8^ŒW\bE,F2RX?bK7K'!g7vzoxOr`յsl+֞ʽ\Xg]e'$YA+PZE9FNklR'fZ}h츟r0]iͽkVuX0Nu $Q@awJt5gkt *5DJ*QdӑLZtԾ5]I Olgq)v]Jj)ժlWD&-WTR]tr5sn 5NܸD3EߔKXns?_8SlBσь+'(8;_Ls"H(sVWc'rMQՊn^[ijxʬD(Iitp(H֨4yu: 5ψQN!HSH-Xˇ?[6`!^ `%U X/ HeY;ӛdžT׌!Ch[W}Jş_`8 ~Xبi(ΘeqZ a{,^vx*! 3fc^lBFTuU[N~lj0)M̪ >LѨE!:mbzj1~YUjՋPފ{^մ_t>7ET3:(p\jrϴB |>y r5}gv!yIG֧WK| !r M :ZHiЃXQ0;IUGqo)ia2)o3~;zstGHdh9⾭j8Jxdq#J4p6ٰ$ɍt䤠1~lWn"ܢYRZ-;?t"]v*ܴ _$N@<~x;:Ǫd= gfD RJ*td+A4Tu(Y*ik9:#(* ֺ#[ Z Q0A.%G7_A?Iz(y١ݮ':p#d3`!0fĬ9ZUG@F("=TQ6ǫ _l 5gJWۉ6CٙQb} fb- AF-u.qF<)n _=+q3` rY&\-9qBrS0%hqӠbqe*y9oE9$WNs̓M pe]ۗCZXM r||lGk\fSJ]q3m$O T)KQÛON'T| N<2]t4*G4G88 E orHq5w \.ۯ薈Km]C"6ZvkܣT vTaȗ"5ḙfǡo۱G[ט2ګL|TG}yz1^wwH՜9(_ief]:?rű\gkCl7Z4'tm rI9xC6BoƣlY%LyWe9ʨ|2ˬ%=Crqg0co_+s8FGpY{KUϷP^a|ˌ jY;'I:SA؉8zc%1(X";ȹ(*y5\jPzB>XqG (>F̛m{vN 8qjwEyt෷praY U` ?/E\h~3m{V%ɗcQCI.Ȧހb ,uz"dKpZXz8;8Э`h"!@7ydU fN''Zޟ8m|KuIëvrLƅNB{Oi}Y;Trnb~̻lԱGq(yjYQ {/ %v*# Wye$m%0{7LHp{ Ŧ+- `Rr#' ~m<6:X6&|{1~DT-)k4 $ft25,[F8ڱXr{HbO4׈G,궡8ni>śioy{9̓<=iI鱵猅3y; #3ۏIm]-?#B 禕-!# b2{eyC_wxDgC~M+ lCe.-nd|gK8ВAb˭4g L*2|jזy~#tf qTdmG۳v `[v {ĭX=YpS8w,; yx3i[8/̢,7riD0l g`z)udӧ g9)ł7Vt;E0CM~OͦYouإqk?DǦW5H[bD;S,r[EKqȤ^ Հ߶ T 5! \Y($S4IX4biF I}\Jl0 83In숲l$q%@\8whSݳX'Zߊ}ϵąׄys23@gHΖC#&{5Cl}+=l:9bc|"կOU&H1)n򧿆Vi|&gu`@5{V;'0{?!Di|d b( ]~)zESDskԭ)Lءs^uLM\h~3yoɫ\$BmZ| >IXFY?:rPKHj'PKy.FIangular-1.3.9/docs/components/bootstrap-3.1.1/css/bootstrap-theme.min.css[n8+4m KÎAN1f-ERP[2$9I߇O0b"M*>u<GY6uSwQynfN7IsZkUƋ(ɯws7 &uZ{qQc + )jR7mz61Me:݁@M_?h)|3p6v~!k~Yw"/6b?4~} Py=??xWmR)+/{?-d՜xӐJx>A4?𧴆.o20O)t(=R-6;eNmS 6E3}=Xϲ.QOsSD>OH[yAo*r\4r?9˲ 'g8DFN?eӔ;|Kz_ZzSjaUe)uk-+2ҿ|V[J%_[d`[cЬ L>PJXCZޫ !t#Qgd%pSb`Oc,2H ɡOrfFj\OyvJ0RDd|<3'@ qPhIĂoCUͼ;|ED< lAKWd'BVQcj~X[age0[ℒGfЅ<;V5q?esX5'r#̃xA C6BkU`O͡V݁){]+صCy8HONiR"+y!Ơ|~g~hr\@Llf3ce1?t9,\S!pզLpedq#\9. \-́.%yc.s^aiYTr$v b ̙ fm^7䝥k a0sdӾ0g[Djb(qe<}UH6Y_*1'^,S-b7Y̏ӾGjdtϟm,WkWxO?b53F' H DM<"ivJ˛v1f lp?NIݐ6g-p i FF9ѦD"@Cb 懙6A{%kDJ^vb 1 k0C=n<"d VscӾOKh%n`Azْ4Fk_ _u8OPKo+3PKy.F?angular-1.3.9/docs/components/bootstrap-3.1.1/css/bootstrap.cssi#9 =w&uLJRѨޣw|x@uKrԥk$EU[}${DdQn44}7ͷϧ=4.Ǔzu>;x~>׏s3LFU;onwn?/X }w8;}nϾ۶'@?/?a߽yݷkvݬ I_4pKu 9X,:o7/ofߝGv|~hN4:ui>ݧߞNfrqFS73ճmCs7i|ӽӞ gѝr8o~GOGv߬>OovoNݜ˜P׸XZ,D>-oC cw@Ştֻz׍l|v3v?B;fCa?yoN?~iVzv?s@vY; [<4ӡ=v3> CV{ H|6;p^7ݏnvfy>5 xpod T>w`5*mEً¡6=4nAywqAKҜQ\st \i:;,0' 5 IH.i~Sx*_[-8}x$ey8f̖LJUqL8|"G OhC:ﰱWϓ>X|vlfOv|vۃZλ{M@|'P;0t~f8UU1E|:~9UۭO7HRF|S>O@|xVm%&Q-x k߂?KЏREUák`t< kx_@pϥ[Or Tc?F(~ Dv bCK(0]^ˎ s؂'X}d;QuTxwOYw|#/5jt:w#%$-ܟ)@mRsR8N *>A VY ʺ\ws$z0#&mVRfGp{v9BJPyƗ zf|K>i17Sdx쉸 :7En~?M-BR›JQ fg-,*n,xM{8xx^%$?oźmGe-<vtxn'GLj /@ ÎW}=k_# 8``ic] 6QWмm~۴ky[l1H_YTTۿ͏<@mB#0< Kͨߐd#'.ׇ_C4ĭ;c*\I5uD}4!4Mzm?>GC9/񰂨dE + =㨵FBe1DVGc$`VaòURXhv5hs La! sxS$63$j5 *WЌ1Յ ^$U-˨bHzp0 qܤJ QAe!Y1#kytp3cPaqVgq~}KGAt鞺}_v>ISqfrŝ^7oaC1 ?KfrgÁֽq4 zmg@tNRD=69h`F_C'nxxI`)&W]<7[+vn2W' EpwȨ Rw->OOM7h"?O@}C0ERɈtb4r\.ϼkCsATf$.:O~y.? 5 ۨ*A#guaHT6VBرkL???W7Īҩk bĵ3P4YLӥ{rOF\J+o@0ջK?^4h9yHG\岞DGS_(I<rjOtʰ=z`Y1J >{>HP!PҶkh5) FڊRf[9g@⟝t~bIs i~0ny6iYG6A̔c_\zr}uYKc0/<颹e6: ŮԐ:J60:+A| iǮ p߸wvs'4Xru7a,dÙQ *SEQ?[AӉ=]b3Zaɰ4Rts} b6!ↄor2z-h{飰4( 5NTVi`Mg?BF~I`nX;O?h oVu%mmBꢵjyxq#t G4-A 5KOx8E4-Pڬ2C:cD!)b4~46\2v56/{*!m34ü(ɼ1Q3;6x?I}` 5VVJ>/_w 0%sF'O͈4'2ze6Ӂ7#}g =-Jpk2-F@9<%Z4!LKH$%9h;e3'}܂*$Cȯ"0Q IR=joJFfީ۷.-D# =K88$?w}ÿ=?k&Q1(y>j =^_|X#DXt Ѵ a+$r3.9VYÅEGXahp , 刖,4'sKD7 /'BC1qn  B 9-P ӭItD`w>\I2vLT C4:͛VMH#TQ{$v1m@ p\c/9GP#L$xOf!Q EĦoD(6숞0$&ʠ Y: M#<Ƞ'$HE"Xѧhi yt;VVV###^{X}X}X}{a```<>>>콇GGG>{U>(l}Fx}Fx96og#i\3:U:InjFیIkr  -L+;&_ͭ³B, j- tZODU1DYu1dY"gD%@8 ,o Y,mdi3`YfDeˢ@r?4¨%#+(DEHIkAP"RduKZ!%X/% aPO5%,)` J4GJ%"@VKR"#قRI\I2i8ƟbzD2J:spZ95j _W WbCU}=#9(U0x]u\UPЪzС.Wi JEPHZP 4J N2%\xMǤjYPlRN-,j5rAJ9Ġ\F!<͔rYj6.݌pKfQ8x05G Q8x05G хqlsn7W2~ᕥ0p|?DE X5:6PkM@&4P3ju@U4VsQlUd%eH Iք͘J@MT@.^j'xU)(| `5U xR|F),_E3>bzD2 cR *pZ95v+1xVJ> ^W*CuUw:YHhUPvUPrh4|NR)T5SAj *W^1)Z)Su ˥Z'wxM*`PRN51(QHϫCE3\V+***Ų:Q 㢵 %GQ8x85GQ8x85GᳩRS"alV'%-Hձ@ @BhF9ځ@-@U.D,j +i3@r%^əքL@MT@.^j'xU)(| `5U xR|F),_E3>bzD2 ;d!*pZ95v+1xVJ> ^W*CuUw:YHhUPvUPrh4|NR)T5SAj *W^1)Z)Su ˥Z'wxM*`PRN51(QHϫCE3\V+***Ų:8JUȅ U8ұp)cNZ5^ؤ[;t8¿G _Lϗ K-H|hh'r%i==6t:oӘ_I) a-;x nՉ +t$1~a9$+A$Hb'ݑh%Bj|sGZX5eHSCw)to!LB@Cu0A]!LPWd1mQʼ N rBU/$ 7قA LX}_,oU pg{#;q ^j+O{UKz@D$g0@oI3rئO>@J6PIvNVft0#>/"pd#x^EH.C*ď 1u2h*T*{kR\%\KU*XSӀ[*1>so=}p8s::ܿp.wPѼ_(PA=ܜ Bb3Qgc>I{FBt&S{~nx_4&@ Hެ^$ YIМW͞9U^#h*8j0^DG$ڲ0m &ϕ"F|9 _DG 4Dz`VDkm̉KwIpzmnqsthcj['$<(ܜeGl`VnʀcF@^wѬ‘9"31>0wS^La ˻mUD}㖌8wd_ai?A\5C}mmWQ+8)h舴%Ka!U N]v%Cs $30';%Zv/#v3iv[{H]/9r/֔W(łhYjڭfvr3{E#2D]%nM5H[KuYy;*cF}Nk+>;i94ZJYKX7^ N3Yz1V;$Wor_=\aҦ.{tYR]RaMVyM6`N&``(`Ȏ:%˝K]_GxCC?yQ!_0DM(vf瀫t0MoZ$!GP8) #L|ߒzFijnH32 N6~|^B\Dj~ΦH>]&4Z%bX<͆vٍyA׿Pl[OwU\p4>@IA[J %em0XWɓ^#AK3i|? sB cH(sYEQ!ьi^(aΝwTmP̃]JEλ؋xtO{v3~Tg5^v yrd8 AGϣGz*D-iշ1rX0>."J7u$Zt^wrMrĽ3,$Yv43#ޘЌt[A{U$_,vGس)}K ,O^F "1^I(=Ll7h͍Ets'冟fBi7U}+ݦ7,7m n- 0^dNH)CY%qHYog F?,wzl=fv  \ z I_+TIcկU fY(H D}5dאS~Cr5+q{*8RH#g[N3G,.ޗF]Q/91nMB]kyxX1h ZMۛ$=H5gV5@Ky*L'aAo UPUSReD!#OSCAk $v*s_+ Z*vxm3L=n6o3Ye2H>z>7%jy]F%LSNY!껀1b:вn۫+={ ,_ֶF-f-[@C&;U%mNגJH| yz#!אB?աpfxm3+q{*gOβ eӦf=_,:(-nE腕o*p~v澝y/1_j\d+NpΰѫGCdj%%Dh!-q,(Oe⸸G`oU(%ګe"Ysk,ry."^ ]Yy黀ұb:@|J /IUj[#c^_*b1,<5 {>olHL9-l _VkDU;zjB B@Axi{suAN$k=OpDh%kVcDRnS\8P-N0AdR^@Q@4]B*5dj &~36Rsⲗ؍Ό:?:?ub$Jʴ&NB`Y|ǔ肼w.5Cdha&/Pv}~/T԰`(зl<N5/ m}lм8^ ](q6=ppbbg- D@\@`%a}h>u/ r\ Z+JD).yP"Yg$,|O[},(Tⴅ!wuY'%J)'ӧQ xl?\G R֧fh.Bм} 6BLSq_h18bO'~?-Jo.&1|m@KEn/"`\`xVJ .RO6Nr˘ 8Kx._v,G;Z ajS.Dm<\ N&(4k8!TQ%.&z2=W1?[-HdL% ٩\$32t"qזx,O%|lOeM2C"5$T䴺i"]IP4+#)HAX>2ڣ87;tm闉~\&Gs2f?/e"-+e"t<찂TrWrPa:eQ&ХKT"y)t(I~QDpcU"sWޫD}ō_%Gp*:@U굮mwlacTXO0(26 qʪDĪbI2we}Mq6okKS #9Y~(MJԀGX=eS"ч}Js[zʤ*1?vpcj_]ˆ.Q `E_D+f}-lXBuOKU"D#H5tO|uq( giSS'*!N[8FhRRt~,SI:.Wp`brpYc:IUZ婹I:w G.ʼnI: 6o8[&]W)\M1-T$QcwըKp=9$с%R٣:ҤXUIө21kݪZV₥-\,B[CI:6OՔm/Emwezg00PZ rD%Ϋ :{))SUi+0>*[4Q*TNc2%j@%IԸ Z'ZPڼt-([if:77ѓ~V֫t։3tܞ~*N>M.͐%|sX,ZG:܁qdP:綀پ2B3o,lcW&,𔸖9rpx:(HөG)>*,J /M҉4>C, g:㢵xvNiqJ+2:qAzIk BLyj}N뵧b¿NltN̞D[4{fTvl+WfXYu$Jk UI:;T)'ܮ3~,r-;e6$Fj˳D&:bP}=>HN0(3#Ș)}Lҩ9)Uo}:C'kMK$/MzTk}mq,OgO2uOMw,.Lҩ:\gTH7*- Z,IƉ_wIpi%Dr vHcLѯz$rX,=$C02 Xl:qeףIQIT$*0>Ӡւ&MШϭOLҙ6.XO'>CŬk>6Ò֋}1ͮ^$,R},cJ 2n%3%/\+q!~ JěNn/Qt>5@Rk+@AʧCm*0rh(lfOo&g ]?CKF/\} d4X  g',xJq&(LC]t t'MF-mx9lzr<\E%ggMEfJMyL]4zf\rVfR< V82t;!=W}RjAGѠDsi鞞wxQ_4 G,ReN}NK*R bt+*F_6;]-{QgN ) 7kj7ˀ';-Cv٥|}'EZ b3ϡ%L¡seڟ?MJ5v^9IXq^<'/r%q/cH_1_oq3R$.`6ƚ_Vh:"='V\?)"+hE} [NxoBrb(y^נq=A='g㤟p{4`82VҋYxD+.5oߢOh\\O8QASk]SH^m%=] eTcXnByst'"(Gf9q# Kv3xGM!W5UB Z]}A<tϷ'5)j7Ă3اG=/nvb:'x$4[A9Km E,MH<+@7kq<~qB=D =\ !͹xhN,e@c|m,@`GoAf#!#b=vDq.`ܼ܎iF$٠R @68+~zeBcWۆ)|6oA=M3Fa D9LS).ޫ\p-QgQu6[KVaEr:B; 5.)A= 4pyڬN)2~MM(KUx 58P>t&؂vQ(FP (N~7 nQa? ny%n9FR\rL=¦.71h5Bڵ+%w]G$sM 2*t>F$BH20B1i ;(#ɑGS%0Q!VӊHo):S;ј <m4TEBFb"$  Epx`OQS4HMNzC{T]Cy$T߆E?% 4,/H9jZ^ o 7?J3E!+Pٓd4 DN)a4* )DQ0Q55g]-|6'_J+=C%R^e2lAk*]fKV *(6.VGǺR5Ӌ4t鬹UU`>I L++BjV@&$_=mJr!.E ~o=y%9k&62#S-DfMS!1H~Uxkzn-|+wj.SN:MXz4:2,/&ІqQ<>1wXʶ*5#B5sU"| I+\Z.=WMj24oYlb9] #`%Q0stdC\:aQXE|[~R:N hO(\S7ЉD\Cb\U~HQS֊Ȕ>2jaj'c(4)b3:˞2OKt?vڸzWHE9hpj1;gˀ`>fmC=} 5lI~ 2K#1>ȗ'E<"-PsSSǚ0<]y XJE!b׫8nMd [kk8cHa$ ڣ!8~i mWNDu(2\׷m?OkI:隋iN;(H>x|4c#s`Xipz}'GYQl9p5a H5v⣶PRqZz ے4Ap4W IB(*%Kx77kFƶoSf[M9½<(InGTکwq[pxwna)+0mr b>nU1( LxyĆkhCb\lP{(H##nTPsLEc$=F蝁%~i0"ǠOh"LBgZjs ߆Rm\u'ܘlx=ZuSj$BY*`)βYy,#e8)W܎`\ϡ"X0FޑT@B_Lۛ8Ŋh EIƺUC,Yr=ADR֤WNj]6)Ү4>*0,wvmL%x<2RsmhE=*}_ěb 쇏]F_3dP'6d f!u9HDǿv{0o8;)?*!;UW!w kJ84ˡ BT=KԩkeedHbD!A#HTE[`f #F0Kx})Lmp>ν~NU&wc%,5벏,YfjPؘ'NK!&T^Kex'C?[Oe 2"5ȝ#X! M9`JbXѲM/7fP 'bZ3\ALZ*Qc'7B_%H}y܏~HKb+\\Ė(w/ m8fbHj]a V\ĵ5j_ftԼ ;%yp䚖kCavN bQr(:bYOD= ZJ29iny?H臌ucǑI1 -s{_@eŒj7AuIHqk̚ϲzA:2RA_Ɍ>X+1>F_ҊR= ޢeHşin6x74Yn˵Hm$K$dr'AE04ww'ʪA c~7"F,W"7#! ʗ839b(q:C YٽQ ќM&h2${Ӄ LhW.52Ռj±$hP`%&\lr qf:+p#B3.9lХaȊbQgO j8l7c Wjxzj X叮OV˻tN{~ cΟCkR N!2J/dJ󝎔\{Q RZE={8BۖHt<3x//n'{zF[qz>Y:~\]/pRY I"2RXT9],<% R Y"oUqtҴlTsq}yg`LC1g1ڡ`@.֠o`s$W`ꉫs9hč~6A6ؗ9-h-C_Z:^SGVdapgcxޓiҠn+X9 S c htb)qCnהqzb5_ǫ Yd 濈30Q5pr _::՛uoOFWՎŰAcET.lW_+ 3[Qt.zg=$l`ÿP>FٵkNxwqř]>OŒV=75˙Z.n7f<=5gQ`;X zY@紁z7mGMM!H~֣ay&s7J62lvhb㵤붛yR/I'd5,]xGp13S[2=a@Bz5E҅Hՠr+-KUؗe1.3.N]ӕX2?OrydekMw?iZCX'0M rm"J$ Yrr{qY[w%dK'rb!eۛnqf(R}u=ဟmߵ7Y|yqR2sQK-n6(2n2;D$` &9w+Ut!a;Ҿle⻫ܘHJhp^?uv۝/u |x _uKZIe*64HH!#Z;SZ jKe*@*zc唗RI ʊC^^"rC}(r-[$XU2G{*jCq$mXvGKDmHE2N\8Cw4taXA '8.y zȁQ]2}aQӞ_Z&pCEy^LMC(X{; ;šV0 (#1Ucd3WC04>AR"S2 #7yg& F%Ԑo#lCB6`$ *^%Q'%2ӆi* =9  Il Y=NCxYsH}\AR ybh&E3ؖgg ),Bƒ>*l%tpҦ):'ez1,~wZ%n¹J_)ք6&%* 8M[ cj`e=dPRZ4%u"lzgWH[uK !U *@Dbw o-$Y&C{0͙wBuRZxu4 < ޱ _=2KЉu9ج4eIeeAׇw ,鯬,"_Ufu8Ctx3J]Lc0YA<_Ws9nWKLBOe`(Iva |6|e'(>rhxli +|hK: 0k"6N4/RFf)ZKۆբ)Ҁ hx.KC #eiS.3spY2.c'>lz򩣲 XZ/,QY ֋Q T@ CRR3PY ֽ"*k MSM<~n'fm.g.KCgv5>dpY|Ȕ{1VVKxT3 𤙨-y*Q RP"U ٙAe)()֧ETԀsK颞ŹTITõ?8Y0*UKf%)<;+Lx=ʠ.eY2k%we>NGK%e]hzn6~? ?bY4dL_gͦyzZ XF-Hy->WXU^j IKŗR?8+f~hR=BqߟKUjVhVGS׋j(%_ 0oTs`SBu,TSQEi+y`;1JrTs::Ȑ^Ic9_*UjZa2W"6<5?vpJp >OvyE)i6]w?XU: yَ RIt@ٿ>AS0IA7] [iL}l xsPFX/jM|D۾MXX $[(] <"Oa8#D Sӗ +iUO/ R4'\=]jmRqSA ͞`Μ<QCX;'Ss?Jo,1@lv3PO0,}r\4z 2$V %,n7 4O9oF8F3 eʟ(1頱e`.5|n7{Ehϛ er?zonXý0>:v> vΟ7Җ*TAqrx. vs(P'T{v7 ~Eř 5 S^WkF2389c6#Naj*r)pK0!uE:" XS %B^|9"2*HLuQd+>&n*nFԉe*s) k<%8&s% ' N&t9MבDŽ;!.Q|g/%[]Zn!9}&4yk*BS׋?[ '\y K(3!U&~d"? gg &KlsVY p+0. U""II?"G0`jfk ƌs#yōv1ꔔPq:c PZȢk%a4r}* ^-j%VGkxXe-/cD_8˵ѭh yx]NF6ΐ.L,.@/ Wئ;Rg z_&oHI,#͙Hd;O#-{Z̝ GAXOܯ( UXH YX|ƽJFmi`/j\vw5 Ey#4 W=˸aU ~.$,\Tpն/5 ?Ӧ2ȧu,d(}ӆ}R0#vz`6o 4nho2|O_t0ee*eHaZxedh>]K -`#VЄ!}/^!^c׵%qQLr/]CCTM#o~sy Tsf u9ҰN+IpPܦ|\^c&OrբυwM˪C$?;Ӎl2 }#LAISD%)5]#&<~L"GI$>ԐSO'pik~j"\ &-gܺ0cdgkq!3ci909ŒLee blp^CC+0ǽ01*H#7M[4_{\9e˷sLƘ\1~Ơ^)a3@!̖_2bƙ\3~Π)aΙ E,pT\~l#0 7 M1qArv:T2DTIWK9^<q*)ΔUzlhI+Ie#ݬ૫/(]9LH* M;&R~;H}:λ?1? ni0Nm{hPK T^PKy.FCangular-1.3.9/docs/components/bootstrap-3.1.1/css/bootstrap.css.map w[GWxurfY{$kN'DZ)d9o&%;YqwP(BPUp ;ϖg~/g{yҚ?XŠeRIN3ϝ0tUtǀˤڗǽzMna-{sŧofNfx't-hakiq-_{hG0[{s4Aٿ..GEWY$]:Ψ#Uo65 ~) $`Vn<\3i?{hnk0ʵ;Y朷zz3t$_{y[ne~+4Ez/Icyعjϙzs>p?ryVf.+~gΚۗR>\j1ͼ*_l˛˛zc)6T* E~utXC$p@|gN}'%h;פd4A/kOa=PBȰ^.ξ2ڋ1jg݄a<'u#rBT#;|VcHzo2gLmiK__l [e(zm_HSJQgKJn' (7SXFU:1xU9 ww_2J֜ j!Nw9TʷOj7S?ϔsɆV6Q)2 򭛲0 I{'2JnAII僔\ԒOQE۞RխZ [I_XhUj3 8]i nRFpR+Z3ءM<@Mת|ܠ ؗv!\uۀ&>K-J_GifZfCڵNmx;:ʱ睷cBNz흷C:MZ5+3Ok:eS+Sʂ&*ǿ1SmZ4 lNV9/6CwcKeuƷH6[\T]^5{_iXzHaozWY}얷$}٤qn{&sӈz+0{$"[J>9̵̩|fo&OƑ7 AL+BQ3^&#ru~ׯة!s2%jeCX +/ɑ)r/]U+I{ɧ^1;2odծy%_ےv(_o!_M:gWp Ea{]6$mW._E>Υ~_I7'CU]i}OZߕ]i}O[UH^wK;i}GZ#H1VG[ߡuUIF9K*(TǾ6 /KFގȯ% \.kMI{)iD 'uRNnxa&qix{znV$h D]}RqSZT6]7ܗP{|h*R6%(,eH UL bR`u-jhZhP'Y tE7{'/)۹Sٶ}}KeqXԲeѪ9=)[^yƌSj~޼h >gMoC/_~((;iC`?,*]ɲ)*IJfB: ƁG6DүuUGʫ(m)0k:/ 4gˑ}XѨM&joׯ\c-0H\'x)+K:_<62෕emᷓemp!oKA 3UhB8b Y.<0/pߣHV~|oK7Kީ>MB} [Q!#C Lg ɿ6pk$ opk?@ n^,6/I%K9I7'n nDMplBj^&ω?e1g' M 8d(WNLXtg*~3?'&^MLW61grω?`Dωi0TS910Gd!5/,b}?@kJS{-M $l ܶ֯Xֲi\FVZ.%F]lݘj,/PbAiKq 9-oi 3qKd'!䂕aJk7ړFi\gAA5#4?W>d/W&O arqE TTLIԸiJO6>\]}- & gJcu\$1Vό*x'` b06I/J\TnwPwW W7c IDO e4]YpO>Vw*bz4ZU$ ?nv OW>eO!vtPvdin1vZjTd z꠳\Z;G%LL5IL: k7z {M q3,9'i Sz ~[)]6N8e('s͔nMɬ;9g2S4|1EFCxp է 6XSmJ[kr4%krSS8EۈLikJ%>Ec8Nik N)YSښ5)5S~[֔E}2֔~MɚݙB|l@+:)s<С™x]w2ED+ .\D}%1Qt9ݙ%:9D!è Sx# }'?(?(Bz@"Ay^xAJXdDRĸD bxj}m%hB"R2:I\zPɣ@]yv E~VuxI\'QAGRi'C#P|  |qoi!4ȸykN ;m3B+kJzwad%[bv@ !>S{GnfFAu$IOar-l DΏ}R3#F a.mip Ee~0\ax2i:Ƥ}MNO@DMEwŨ:'֦[z #u,?0*?/o<VIܶ3_A f_||q;wʯDdߚQ$} JkfÖ;&os+Ux9t|yVD^Srn$XR'b[ξCY/)nw /|pNJA'PL_w8mC\]G!j%;A/3XoOhAz$/ 9.^qNE`8"9u9>W,pIp;c{-ytҘA: D/[䲰[떖[>\U 쫈vb·ˢ ]"F#:HV 2#`Gd|CoכEӇeK1M#7A9C4L߆I\єZJQkEC!M>'\7+TD4MU90x<LrNےAVn6V$E}r)=K$5\._TN'$SeIK-׎gW yNy:G~ӟw~ۃ!^%6}NLQI5nKR˓ō\bh&0ޝ5'EU632 KHR\L-=uIB}{s@MO|ƾuёG9O*T^v\th/Wty\iڹVc~I,Ť$faZ ;e rnl~rH~#Ƀ-7ɡ7[2snn5F˜~/79tIWiyPF@=)Gׄ Bc#⣄+0IZЕV]Fij-$1 ] t+4Еl&tbCE&p\.52lL8!K/`Nxy!& ?o D}iT8fǯDLi~U='eIZrPVL܉FRRML]rYlNwY,r[OU5q&EX-{ߵ ̯`9 12ۏzZ pLɭy5NnmlV%1Pw4F koxu{yT{#@0(" IۢۋTH-nD2"75aE2 @l0TU!Y}/LqHeJ/k!]IXdʾcJ~ViaOߓlO>;{ Vy:hLW۴s.R Y>jlůuDV_X# ,͈f6zSXbɭ6\ 1pM| c6Ғif{yR[(͛UUs.U߈=Zu 81Z_j>^2&>`os &u%o> )abJ&דXT*soRpߍU,UޓOړ;zT+bϋ*0J7$/WWxZt>+|2'a^^Jjrn8IQ-}$rҊ; ݤ 'KR TiY'@Y $k+cad ~uKn5YTa1G,NrCz^{N{.=;〭7{j x+Z YwYaycqwj5wd5Q2/Ejq0Th*G6tJ暬(QT(ř1sTaj j'V>b-"~|l6a몶+6[0 vn:y;(H]izd"Fo"T0 {evCAJsGKQ;;϶GlR6-Ps|Z5u3/I+,tܖmpXV̙ZP;,Ljn-[8d+0\g^nYlTr&_g3,%u97D=XҭI7;,Bai(_Wn?N.wg ?j~<ՃDB?Y< Jz0Ƙh(܏X˜5̴!J┈*&WELV"DzUU"UU"U|H{u2䋱]ł0>,,64PҳFܦVr5Y*I:$!teKA%=X6t$Bۍu"3`B~F%&T%=J=VRJS%1isJ.ᆙ+Ie?)f4>c1P1ulbu\Vi~%4- EXλ }~NH$:bOO+2ׯ(NHl>!Oih_Cc]m=i~`*ֶ}!,QW)_M%o`&+ NROy9u/݄ؔ$LW7?z^^ʘ佣 O dg24M"+6͟:4{z<ۆ%yOA_*8h4V2DG( S$)ذBe/DZGk\"բ;Y׊y)Vf.{xKE"ZR.d$ªH)* _iaK@ٚ*%Iln) nNh8^ icbJ'CRnTNIT  $A2ƚDqHG[b r/OMU1Zz-#RljstS4rQWO_*'3 gV6ʙx]vSSP=XKIƞ6P" wlBeX4Δ3 NGqQzNwA{M%E3^0k\[Ap#{zZ}Wb&e7U'i| 7wՋ;a=2\)p»\Py'[2?gQ**I& e.RqS&f8I[5;QFu#+򞢶+1Kj@[bZDBvEĜ)>Z&IoE' 7j7D}᯲)i `{k԰st˴T"5Sf.W_èsxp^6(8~43yƗtx7'ꃹ10+V-E93?ǜӊQEXw!此,b|gRl HYDM"6=+Pe-U[w犭"ؚ[_Kj igZ4\.tJg&D,fN4n@2m?,;OZ}*Ry*V9(ߩBUt4&?Q틳>Hfjh2}Xn$քlqLV.}syV'YV*OvYȉ6kw#c[!KTiE _'!8Tb_g!&vAoV8uV*}`mBLRڔ<ٟZ9͂\>9~[ \al˯if363fl7L7UHIՌ&W`Xh7W>dcE=##a_յ|PQ򥿢sxt=~mUcCE=ʗ:\4-# 瘝p~фxbo}dn8`bT‪TPRUU.j+SV7iӉISEb3{4Uԫ| ,앯H[@w٢FY&M0_kz4U+/kWISE^:n&zLp#Eyɼ 32[Vx2P2? )x9Miz<:%`b)D Sఞ}*6S3Eŵ>鮅ـ@W]X_0"&Q)&Q0 ҺB*, aF6tb= ._ KwcBJz 2bE0Jxv!Ƨ;/8|,zIG:/t4_AȔz7?wc._pwYHI|AFl(N2'DΌFsʋi%JQCPsb/Űc4hZux8%.x%%' Mi'&%M.H٧%}pd ޸+"IM.^}؊ d;b±w`bK,;%83Y|F7L&JvYލ҄r=IN%•3 xNuC4|k&4E~T˧ e :` IB 'CU?` f2}}Pnb(u~x^ 8lWtXyyPY܎e.)3Τ*/hdާmp+1~,eM_ dH4O":D8Ż&u6`߅Mudh-]GwmK '.Bcw,?ܷoZU8m6 gWAlXDqoW;h?~$CQiH'htT|T!8ݴf[Ȟ58=2&j8Q+HZRH&U6 $=ziИwS Y/HV1U\nois˅f5}BXE&󈛮o[*³<Zaz7ޒuaqXIH8VaRu,$YZ#0+'H(+5$& $%8[T/ =NJ5DӲA֝~* iұd> ,ⷷJ]:r"H+&k%-ۈm.PX4 kIfSBk☳"I]|xzB>ٗh%2ܢcZkJ%NQeo.n<߶[8wDЊ!Vz:_>>G<#£XQOM],ێO9ox( #Pʨb)h(CL7(ĶDhKfl*E?4QNT[9x<鞗=gzDˆ 8=! B%!m (A~ ? bKp Ǽb/ˮ'==~BsBU`k\RU5}܉sc]رȸHщAY1SPc1-"5Iufl38QZ͞fIZ 4xf;kFh A1pB tRM>3x& u)=aôS|g}aw,hO%!-ӚUѮB605̾onˋW[o|K[<<#nsWs𑼕aoYw/ӤEI:jC>|OpvqSJ>HRHJg>Zoi{~ґ#^SAXAX~+'\Tgn/7fWTlY)5ˆKɀYip[Zz~- oݳ~#JBBҧM_6O(^:EzrZop\~=@@&|PY-Ψ i~>4Ps-G{ErEo9z${I#4fkTt|tN A~\$gthM8//H9wh~CshhhFy6 {S+$Zұz`΅U'AtSuR,\HfOgU]hyS)ґ?=2 ][9ϝ)y:C^xпF4pcܔQ";wzn3bXj:md _ VT8HA=QÃ\z}A2`vױ+7B?ڝfQi8GAJdȰ`i"FVh:GXFRSn)Oꃎ_KKKa|Rם(ҫ\o]~?#t6tTĪJj>9<-5@"ǝngtSnzh]>Km LԻcg?† [63Q]fni:ߑ˦Ҋq zΨrG9RV3GxtR[5gχnAW0]82)@z<%mUԘLlNy6|&#I` ;ӥl:ϒkޛ{uζ31 Ѝ37A8~<9IdbdR4ѿag(vv>Mm'*!ZjHg'X+жTp4X]uLȷ%YQ`|oK3ڝ::%ڄZlLЦq*Wal1uDYdw/+hNm 6Ȼ]c>hfRK˭$oF,.5(ޠUԅٻ+񥪥r98"&}bj+"Hot|9. _I R+lQޣف`xlīdi0Xh`Ȩ`?t맭YQ=r eNTߔT/?X/?sy2IB_ }HĜ~qѪkh `j/auApEgp|Ț/ & Ɇ s,NDŽ}Qo6E 5AW=Ӊ\׭ l32hg-AWWY*8I%< 궵gUkm af!c1P|徜J*5(0 =uT2/Fq kRe8ޮU@ĵ`^ss9aCs%~d'C%kBb>QAj *:zp$u\`ʬ}Q~NkO:nSYǯT7$N a(v}1KYӉZQҝ\XbOS /kO"ݺpbǬDPԶ2e pFatמiv^Isʮn#o~_kaz4àUCSÏCĤZM,1cA;Af~F^Ԧ$accADxJK,Ne# >I78RhI:K| EQ2J d5k_4S&lm!{sӵcbͰ=r苩"*~UQ^i[骕U_tvxYKK15K;5d‚lOZŽaԝ5'TNRˈ`W}vkM S7Gjo;f\!RvL찑,Fmz(56z&dE;3gVr\h<[9̭ż+X2nk[Ol6ϟK_>/[N!%Db)|0;lכkS&h5*]2>4S~ ѧ̓5(*. [A),WP`SPQk%dE#ӓ2T"WG=>~!:YJupO'/?d=;͚(D|Il-Zl6Ѽ.z kAva=Ie E~ VI3c&[.0U fO:1^3>F:<%ڨuD>Yuaxh$uc74rlvno7)~^<skF-^= TYiuHlq߮XE Nt/P 1vy @Q'QsI j+ihTt9X%0W0?td6,aw4W6N&I#챥2?G L GƊh4gR5+@wrc wM*6. Mysn] 6Oמ{,oҺca]>B Q' l&1}]+Na \l2~% |'^#5?A24sY./t"DZSt 3_% \uМ%@:Ȭ8]7ZCY߽eA.ђ5 ¤S Zb1t 7uŴ{nLInyvL`ns%%Vr$lҜKQbx3yF-bBq~EkV| `6|쌣E+qbBC Al f#+Yww`¾@һ 4/iyEgbgFv;5JZ"TTzCT24%錶j)jhV['̠)gM7>pbT-Pl8#bfґm&~'rH8' ĚEn^rāJ{ 4olG66(M-f9]ދh(櫡1Ug@ P=%ix#W!j.QIT(T(qVx T4 /1- l{TҞgq$Qȡ$XF'cK*s(\$:-cϋVV?rTFjAGX*EYҞQDb%Ri9N{>4,Psث D"dWyK[י+SA AbT5:T=3{AUEu/(EWoԌrWGM.hhmANѝ*Y2 kȑ&HBT X6x#yp]ckЇ Oc熃پ4P ceo; 6+kB` G\gl`%brZjH ي_.kZ8u-`:L5)"Q?E+;8fZ6fjE*r!S@|Ńr/]c1$D[nz_aݨⰰŁ;LiDnˤQEw!~!upݑa#\tRD\7qioUy`gȍ,>^G,v%LkIlĕԭ:ȑ3tEDMV'Ơ vטXsaX?ET V,Դa8Fmʨ6ޱe#\-_b}ROD݋A ^ ~i >qxRr@g''Ud*܂Acϣdn[ԯ؊CS7x/45QЎcفX!76(6.Eωy}j܈:2^rK :TͰwo @`I^x[TIIp ?"غ|7hIf?}q->/K2Y?rqYYz$C&|f1Msr=@dr b1(3 p=֧KwSkbYL:u> ?SynL9, UA gs){:ڢtc:ZW˥nx㉥ќNJ@kb8?BY)A ='|YKvp [ȱTbAxؙe!Ү&/mN:4[,uc932G gvUvxd* 5j-mL`K뜥M绹%3>j[W5b]w4/~@z(+e~aa~ANբ:K{-;[2)O]1k ȕ\r eQTQ&Dt}Nh:_& n&3m7ʮfX-}.A9{ʩFBwcr *x33iƄrJy!s Ie x*ژwо5 \Dlˑ暠Y?`P%AȻA*gp.RNe(k\tq;;Lm8{>\>OWu .! 0'5VV].俽}Q_{عia}Y>-ܩ)W܉\$=q^71SeHGr:z?lqHnpY!,܈rrćjn8)L \Y5B=f!4C.xU}!_k3P[>ZheR %څ TH w0 X>NUWHv=ތ E\L-VZ[}nZz?hL#:;M,̍|rq!GWZ|=z]iqi¥RtK?!A$Ff-20Tgֽx^N{ ;έ- [OFs3e ?ʥ: qvǙ5qQ%U۷"?'@> )347Hf~ML;KM^ø}3b/"5s6wjxОOvPs]vSm8Uwj;0 87Ύ8&LXo47/$^0W>?\>~D YI#W\y؂)n+[]Y뵋,i{/5($_D Ot2]s/~uEL4ve|i;0"{qʬ]>{i.mp}=P7V;D+i'~5od'.5/:X~D,̘,}vc"$']1]Hي`e3B#08s~y v?餏ng=3(H%h2v>Ehfֈ2lW|[<YG_#ADҧꊖq6X' D}#ډ[LS.ę-t߳0ZQGY{ ϥ~ix_/N7lJ9W7H'{ sRlVɖMJ ^Eɭ̡m$ J,g:r@M$X =)hZ2##W2zgJ<"@ksx\5`g{$P]\c:mskrsl80/\CϵU?XyH2F:AcRAK;JˁN`߳Q3SZoɔĮQwK|WmͰzb]q;,o|D?% w$ΔS6 [|'xno]~:sy8,Ua.syIJ'9 N ;[,&NFGhx8܊;׹p)΄҉oD6 ק~bшZ9bxLͯ&?%#NLC^w&pNchWTm[2&f)s'aUw5U~0@[t`啨Jr85бb 1m.~nꙄwByBAxo~P-B *nΰ_#JmZ1!6$[5bWZ+N$JUvi#?Yɝ|9 5ΩOn78<7͑1ha\ܮ5wr2HF& 18L]ᴶe3"*HEU4gzw{ݑ6'Kr܏7(fqnM,X-ycp]&XwCn -KLY15z9Wlx&1o7mR?J ̕X5=ǟ|x'/]YRZ@WS]*!? R3wGiy^hŀv+ N6 m4>}$xM;>3 />ewW c`U&diRC1̊uSlVc'nG}@xE?`!0X!=qhJ}^3r1cQ @a@{ˑ`4ttB_K7.{Pa[yT%Օ1WtT #w@KЃ 3FNG ; 2S)%d[_%+)3|=k0s7qU+Y;wCX;dmyـ]Z'e^/kwߓys}ގ|%opM"UC{^g*qYOza=X;b󕬝7vWvkNs(;V@~˚G=rmq^,\%7y %{-N xJ8}N8S(c,tQ&Uqil²PұM[Ά) Kz]*jkEǖW~Gʯeb(׹ćk/~ RBs)(\ Sܛ.<'S W#S85ؠtBՀ}.Ϝ ҽUbP.5̺;$:uZ̲M ?Țւ!a4禜!dl lS%u++y;_k\GE;rƝ)X[ϩ!ξ~:ZƋ_ڿ^_пMG*Q0'~t82nUwʐh9Uuk`r襪aʳVm߆˅XIF`1Z<;b K4ìhrP۴ 1&S#=y V_~]g;Q6 q{Zs[‹wou{r3Ӌ][38%B5ɘ7yTH퓜 c" 9db~{C*g_َc`k\%&]n!k@-χIx\#zp D`%fxِ[ruC"px2^"=*cEwɀnfׇPdEfzCcF8m(/^?P$ #\>u1kwg]")69ē(/HZ7X\oY|u賽Gxv!%o0K0sbdҖ>n˖w4`$ϐkWs W$f~9eіd-b=f7~Jm8̀BC]1z9SZb7:B ܍DE#DZ-\car)*=ZMDWR$L1hHz޸-nq 6s€iIb_ZNcgݘCHU\ZE$I{h&Md3EWxqmЀ=&1rQX;#=o:&K]$ԚAf>n`/8ܻ\:ms1s2,B\![ҼAܐ.l'IJ`o(+mKbtT̹4DEo/{F  Ș.N @;R^xe*3*!< 0>ʿ%QҼaY wE2+>yob.EySw@5fޜJ' ~SVzR5>%̧1*ċ2WZ7**ϫ6CMaK9}Th87#INjZ1j7yۑx]aH{3B \,7Vfc_&?Eض_p$)vw"ϠP5~-ۚ(So9$ K4·Qy/M0rQ`C4dso/wL^`Z[49 u[XCI/\oV%mJfG4|;F)J@*d_(7+FWhf@$#b~,ya~\Zej 5y{bԾ*,#]\m5[o9i+|{Z([;[3=ke:4i%oRS5pqC^&q%ɞXi?Yi '??79-bO͇rA+єi.ͧ+B`Oꪦ-嬵)Է=Xv#[,bdpa,=0xWNUTlQ.%L:gua]apBmrd< k;BJFnLs(eNBhTFt#sQ"(7b3<=%N]^dnqfåzcC.凤>bOy#s<:O#%K[J5֏0! pϦhA+9?Re[bhy5'ŹL*`1Am>-m\KB߷F37f}zklQYf4x=>ɥ]5j}ώ2aGSMJSUф nʾ%LӀOvN+Ngk_~P9+QmNRf*Cy"yfѢ0miu7D~A<%|sȏ t[3֍9obD}L6̊TRywc]mh`2,Au@~:lKQĀ֣Nrζi~/H§),D,ݵT̻V]f7fv[Te`S tn!:Ke4i(8]fLIcx'BImݖ*WnM HѮ0.v"aMytHgK Ѯ@_tp=7ǔ!G c.E-MMKPK&FGP/qRJv=ΩFP7s%ɬ]xzx9R$J_\BԮE͜^] )2]5 bŢ] H2f{%8*D=mOy81~6~w\Z饝Rގi c Wg_ eQ%1"Gr(>!9>fe%.?} chE5m=3e,:yZ ]+೏_\ȕm"*%H ӐU\oKMojgc$d]_Ci`2@c 9W'2p~3Z6C^r6 1FaÄ`|Wofhr5H~Y 3C :Mt}Ym^JXy-V tՁk5 BIJȿ6lv:zkɴ |P,ށ Z>͐Lbݷ]6VOy̪ &[vI0vD_|yn$Cb)[.x3Lm+%ǀwIښoPN-%_tڼ=O)>8HsL: _$j\ y Sp2 -II | moill!CΊa ;ς BxNZdՎze5a'3> GHp|#81Lw ڛ;ŭRmEG<0p?*:up{|f?[(ٓ7' pݷhb^O.6+Mde)|#S/>Mn#a7G0>{+Zzguxi`bl HCc &E;D=b|C8=$#!̭1hx!^ #wX.^)0dnmH(³&7Gtr}2]G]OǿhoFMqa:"w7&e b"Ҍ.x~q (e=қAky 6oc̲¯+^[ WpO#%.oHt! 8Ygvm1r0)=fC), c25[_v9&~a=i= sFosCj`zL'F:-X'~eMiDۼ'676x~4|CgSMM}E=A_6 pO4"/zpc]p<CFjbHO 3solln^s}{ry Oco+?x=K_s[7"t7q{_zEڽD-@,:qk!Ƈ6kyhܭH U+rX><$EJd$CNЬD8GLP|hY4{_COI}p};g<7Q-A&X4q=G /AǬ-1 Xxd8í<򦿨F[UBԧbup8" v=:e2g Cmnϵ]P2#B)k‡CVq9r۽-&,P/z ɿ9ٳc8L])O#2;g@@p_ðſyyvoky=Y3.ΰ(G6=B Ȇ' P_eGZ8AvTM ",޽ۙ`>QS;]1}ZQpI=i%1 Y2&I:*ғ&ы>3܊C<ًW"Z-AbnE*[2Gf㿥gaTZ_'s_;>V;v,DA_.]jFS~Rl= ]Ͼ0 b]bقѲ(bۣ]g޺Ga<\Az~PbXHv!AbTÞ1| j~7s;o{BU'XJtN],6r6!\~ftp"@s44W#PJu[Ai'x}OF[b*=wg*v}4团iC &aݠf3ӅB*ke.:ߗ+8Zy?ZPEoL;xi[7VFD`rI8~`ϰjڔ(Fx:Ne"*87:އy_QHZq &cd /VIU75'E.')aLT lŰJ-3]yC:5HJ/&ٓ/e ʬ;(cJ?F>L(=hC *f1Jŋymy ސxRDs`9ܽjPxyw@_B&Èe3T{!!hun vA;*-'8+uB4}j8-)/;vpeC9[on&4(m['v֛ip=NO:•zm3Js`99Vǔ_δGJ3"!2~Fq".EZ‚܉?L %#̬M<8j YE3U֡?Wiop_Fv`7fq<?]u6Dhob+&,j>$H7t4!(:Y]%XF^5S}e78U'49sO)7el:7RTU yMgMZ\~yܻ٭\BbGFf* t֐C)n t-Fx4:wܾg5i}BI=ܻ0}2 Ԩ3_F̴_kB Srliuuj^Eq[3 Y)zm4_zTȅࠎz IJYa`=66-GՁ)T2܆EfQh)rS p4Ӌi@W`a,1~or C^(S&GRgxC |5XZ<^zQoO*MָIǯ <:fU e$CU(cNMy%L\h3/H~;Z_ tet=O*x SCyJSE}Y:( 3H{4 ˧m%´KFdbkM_Ԡ{*3 e #]F+Rۅn9,n#3j˜ ޾$.(#X8H@did id%cS ^3dsPi? -F/?y킡e zV*<xr{ڟnnNWvzVmA/ ,Qↆ'-ZF>ZrJŒ,@ GUD6/^l5M!x!gN{o.Fin"?c}Jk9 erZɋ+G&#Q}yD>T~P3gXYܗ*h3gN*b]VԘOD0 !}hKyJCE&#.y!yrzZu>>@g[w5չ Cڽj Iz;.[n8Ûv8SctnZkX\<1Zh>e_~#/]N`䊰a4MKB3j$ƾ/ȅ3l^ d,d>o1Ivb@)a n'oK!PB&(v$[BEdaI=sJ%ܔ-A%Q~s^B+5^HLxh<ǁ&jDFgT1fj"LryyWI5 )D﹬ 4x$5M?m5NڡŸb-q8t@tݺPBf"%N?95dPTTn2eOmWL ٧r֝|컯y9g_=g?<}m3S\"gCҮe?=˷WI7I6;=8{6MCnZ48y̎*QE;^X7Bh&D Ѯ%9z.6ʌ,i LץEi 30jOג EQ_t/ʙݠN9យxd8j ]rTM !f.˩f$};%)dQe\S]e'V_di&?)Pz昗u}qzzrO;S@ԃ%ʪv[ lk}na|`edEx&3/&-Ds^4 J~C7Ҡh2E5{<8נiĘ?ۇ6 ղӳ>mQf Qw͍ ~ :c }_~"{z+ [Vר0C  S!e$&!ŋGNUD[5\;ȚJ}bqTO?D6oW>sU=>ߨK{Du0`0*RLq^@D0ث@1ycߎc)=!+f% JNADgoZ}VGkWCMhp9*(po/VG])"i|ܮˌHn>xw6?.fifIT2bza]GI{F1MhPRE@hS0 */2"Xb7E brQeD22a?+uјR=[ɽ>P;۝RǍ41ȌNVFfFq#_¾:94 k{6uႶGh_ܝ^N0{ʼn'x`Yޘ)Hlu  Sm;/ $\уyo'20~vL_B*ћ=sQXUhdϣ3wܷW+lDwh]VLInbUeLbxEb5]WJum&ݞIB]DNV8+*oG 5/o{Fʅ^6ѳQ܀KjZ>< `a/IVWza9Sc+0r?Π|xnJN8vxᲖϨq3-ޘģG8㻷4K)|&9C8 Cs~I,5?6{c f{<uߕJ,[N7}ŗpFxp/ 81r9 œ!;`ux:#+g ^ *jxu~~~t>XbuTn^FZ X_䧩̃z Gȷ>ʄN ^]P譫(iH0oITsT"WE/D<=d\xJQ.'Jء 6Xṋ[On}*Prsw~ucvZ .E~~2[x-P [q[0aĨjr SeB^WgEC'rpqiA'WbQ ' rσ@Q=|unSMv4I3FeQsr#QL[wmb97 5W#*藏r,;ǚp._ zX3QUU,W4fnnR,ki# ~dPc¥ ^/aEH ;"D[1/9%1$H9I(gaT.!im MPzKqdkߑo(85fOm>jʼ>YPnXZjWٯ\yMo.EZo!q,|Mv[~Smֲ¤ۈRNd5>מ#{c *~J |*.')C` c<׸Q=` /@o@ic;zz ;]FFA[.tB,J L33`p [q" b&u U?VVoQXLh |M] d5z=/MklW\b`gnr"fiY\6c 7+ &OҪEsX8xʲhr/`ad@"H{9#\#dAI8Vзi8Q=Y7'ʂpT5ؾ9쥾-;k[GtZ%XΟ ԅZkvycПZ!̋)FN6>?ZӉ|t(O҆8o6,,Ы!iں:Z^x N <m h#X$EZ\U,% : ﯋zlSt7`qA=Χk ExpƠ^Ņkٹ H;.thWY>C(>{g'GVX[{ RhN]X{UO}nժ]d܎vkܬF8 X8%MΨ)D0!ȋ]Ni9Ip/iw߹}3,؅#_0!ېy㵺ɏdYCѼ'#"g[ *Yڭao@rZ o.λkaxz䩖FDnb%LǵP~6qX_ uS`GOdwn3_֗F8-y+$q%Ħ pcpB\2 U;(1zZ_#$sRo&CˣtEM8$gaDxum[ pG#7{y ~3b $‡364Iri_nlW xncѡː,Isn2d{T2E`_M~>_>Šѿ0rx<8vbRx]7ghC1X`psAxY\H]mt0|lڲA6s皰symlc|^2y9Ȱwdk&3lUAH[-<4qpepv,T\Pi!KV"z/+G.EZP 1Hd@pԦ9f}}/R"ÆR: U8,SdD+ Zc!IL̈́qC6(.Zִ{+87'.f?0ֳ?1bǩM[ N +rnE9ͣ :6팸n?Z<֜'"SD1ɉu5?ZϓM\3ƾrҌF6C](b`|\Q+\ /n6Vq˯VFgJf Z*rMM? 7_|V9a W&@ؐQu0mJ'x!S-'. 8Cʫk,5317a`" a˭O=tK|_u^TWE0^A.<+vd>>J 7{A|ʄb)ݰ%Є9oyv0 t fJ8 %~#@MۓC8lX46Hl(P|EPl n>B ]7I[kY3 3mI3F_PLCsgɌ€vM[T(99F)l\ g:њrJ$| M- LB,CN`zfS5lh'vp@Jq 6;b:vyO>dceZ;wRjh|.2,@7⪶ (O`|cC|Br= OxDVk(`EF5FN M0s?+ Ä$v yfmx8O(4]fۙ1G:˙g:̉TukaFGD&{x|GϽ 5a;*Ru+zߥCPBnx+n >GTMW ?K|dSP=NnH켲k”$,+7:k0:(7icr&M wVҹ{竎Ӷ!p~&ܑo'ʙ"Q BTa|`hi>{LA-o&50ASox(/bXGRNKٹ8 ;a+0'eڠU!bpb%SbHWM|"d6lG`!PKtWٓSN[ >=E_p SxD~%[A^Ut^3ĥ!+HLrPh ,S vȌ:B$t;!w1R([D,w1.e]z~`|d (H\~"p Z yB.reL UV?)"fw]y])rrCY5`*C\_y9'(>ȅp#v]o1autbgpۛwK㫰KZ*ysҁ ̓CD߄]Y܂[ڟG\)'Qiڕbgm$|D fd-G'H_lS`td]B%8|5;'ty"D*K`!7m9(7[/{\X`s^6f&V: K-EwWN kV P߃Y~BbyUxŚ.F֡#6 .r'4 _'9H ;v[n`KDy)8USze1 l䋲uF w 1q!2niPq-J\r+t ;˪C 0٘)I@܀)˗L-YEB/X Y ?GD9u%\*kKF/Y39 尩VK>8<8P`,6}Ro, ,'=%IĮ:ІF.CߩqB4 lRJ-Ͼ7FшW"=lБm]ƱvĀؕ"2P6BbmBڠRO/L!6eՕ#émA%MMp5EVW ɨ8 B zh}7{reJj{X ߩW֮+|/y3}zmA q, sOZ/@4-DL,O%(`Fv >N"(/ ڔFF˖B;A $B-qyPijԏ_P^,}8tpg[[a/~FQ{$ǒ,{H"a9I$B!{`yZy*XR60J! Gfk R =ܚ9""pr9oi`gL!3ܭ`v!.v h`D] ^/fDHvRtNgvp; %Ixkx1 `7f(KW4"3K>g-"'1z;rcFxDqamL.9>:H o caAoVT\;gpot4p`n|?>"Ũg@9:k8ni̹BaX;L8%)L)X .ˍbqz=8Iʱu7pr?m-%gGxkHg.NJWl쀡ٱ|qa6}HB;a#iz$k[zaP|Tlsw$fHG1Ny9Z[R=H!^8.COS Zig*],YQq!qX*:z\ R{-<xE$4GZf6mrH M ^w'} k"{[)=$m a_XjtK('+lq7,)G@RBڡ@G|XBF\3ל姍%kI pG6'VTAzw-dHx8騹}E!]6ɅTOez]d#Bln"n9>O?B?U(oɗnO;\H}!ɘ*ԡFNlSXÅ\y!TA,DUs1n|T k)jc7OxUxJgŅ7ٍ,GZEGwM-`-*n29𨩿ԔE [0QR]b߫g@sӭqQNr+ޣAb9'!Y֌˘Mm++Fq0F[A JctitT WH~jj`~V01ܞi8Ͳ`D+>gk-|ڑ^xBH}̿:k :U,u@0_t{7bq&ӃgǨ^`,u}x.muo:W3, ER!ސ;]vҐӃu<T q0m]bwٿo_C-@$7 -=<9A/PڑKva/ yUO W(L.} A LrWƦ=A~ ɔonZ**/ݨ@ɽ+/[W/aZјÎT|]P JvtBApfܤ|5WbK5ef>HxuiZ8_sSc0'~M)'T D;BJs)ˏס|: 6 Ue["i2pdlIe7a|PwhOc 0P7JƳz >Tq c߸!8"[GpgAxԒyʴKEC3QYeʵ?>baч?|)̶Y_l#NKNp\~Ң3 v0I>hT^ x$cǡIڎoG"dǮ oæm l,'Vp mцʩT$/闏BBX $j?WQ/Lm gwCV ;NQKxO/c9 I L J'r7IL`OkA' -l 4Do'VWikbV;_ggQҖBT)4 {e`*Vxcuƒz''Cl0udӸy7ij[sR~xyFeWq_ AL58e4|=Fyq3{׾|`C8DW0&ѕfwaFB g) 8B 2VO|f:n۳DX{8)^`(X},W$OE$Xʊ&gĽ$GVy{*(Uhœ 8h$J)OdW$14GZG<`JAJ!rA\ƺl+ 6Y*ZF9\:ƵZY2NEG%oeFtAH޳!']A.mn:H:t+G$&xTLL@d'#zEO`=/(2vs6MKx]q[S!JPSńaNUrlTt5R1W\񱺰8:LG*=UUU΂j+^\}fjP**h6Sci1WýFĎɨmb"CmxݤL2{8nιK~_=HyllGBNhdv%]"UhR0wH9^E0۴[^K<Ҵ_TOj9QwCb]{҆$L({1Cyhnjxhubԑ<9!fqbT֮ QV*ef]-~jPw0q΅] fmΐ4\TTHK{)n_N BکtT'g*0n).Vvk]87)wWnVD$\ЭH(D_Bj7=q^}zk R^{¤D(#<"N>jH*Z!gp}e需Yn1љϣ4"RLe{qvB"Sɚ/}uSN 6ڂe7>۲u_'ef?;K4qz|P ٻ̿X^ wifYT'eÛwݻm{%gRe#:Y^fa\ƿzHFԍ m^a;⦵tuCRŝ{k_#9| g޼4}!S~]DeªFqy7,{:huvZŜ̓,Μɲ/p $uFy߈;>KSٽt>/)kJҧ@IV'lBr,֏Ad?2K!I>܎hx-<{?tsg_ϰʐFȔ,<4!nZP[rT>y4C$bN|p{XCfjG3r&aX1Ȝ{#xIbA-(_ W߄%-`? l骅N/ ̘ WFg8\|*UG">tl+#,|#W5#h<(:7d5ҭQ]%ypK֯D_l`]= .ճ%Qyy6ffuqvskHiۛ{p&t;#}ZA&0zpaɷ?z)V[0nvk;%gYjA  )!?Q \BcVk7у hkcEueb~y$Z#FȼeHD~&uғ&''G$s-@] lHu9DCNr63gv3 ;'-= g( ?5v_1KgPͣ!Is J &lq t!-%SNrvjSӀ]>8F4 3xvKpCr 9J2)@wBdP)'N:WZ=92QYJVhMr^p[[; HG9N(TLrxLr6zr6I@]V!I@]ftgP .-I@]~&u9{N$i&u9; l..g# ag{4QuuНfS9YhS/L^uQeV&lrs$F]mDoP'̀ړZ"Mr6#HK~I@]>=;Lfm .g-OQuEgHGq- &וG п=9.C"fHKuR'^C&12LpeH2 bWI hze! t ]QVC"Mr) ʲpM@]Ά/:9.gkֆ&u9[|tM@]^;*^F]Z{[ZP#}lzqqEMr\CHm>I@]>y=9`yL[MI@]uȥ9q ?u9ۉ"&u9n\:.go/Q^p]^mҦa P.lnlnu9[F]35 b 渣Py~'u9RfړzCd )2r &uz.I@GpZGOM K$F' ^kКԝHI@釡$`)g7 b{Pu.g#_Ю@o=h?Cr6fM ]v@Rlnb`f|M_ƨR-@-̢rv(jP+@V2[ƺ-jPOPf3 o[58˜;]>_z3Q_f#?l$I@]>C@) HMr6-v)@]VlTˆv٧KÍūAnrƆAZCrnVSkr균&1rښn!2&12ß)@c1oǮJI@]l>yP!!N2d(o'u2&urHhM3$$6jB3 +jWprкwOYIe-{ ]FH0gzhMu9p [&Lv:塑lOx_&u9ݨ].gѐl ɡu9kkkX2oSpc=KWQ1ZOrj#'uevQ"~l$.g|i6=#Mrs I@]FuYal &v|nhag /2W!zf$.g J6I@]>G}- h!f}nbĨٯ~.g#1x$F]^&Ioѹ]6@HV-)k|38rb krzp-@]99}>E!MҨg(jv^l_%ZŲO2O29Nۓ )@Ȑ'e @o|H4pSI. \v77.6ࢩ9rDN"Sx!wwwu-n,@';[n6GVhD~A l\񫸐ױ#M:@U&K/t={>DMލj~? ˭hY8y3:ea450W6W5h1jF?cz9~j'+Zum7e&[yr\F9:8*E2 |Ulb6&bVvC ΐ |g {w'[9sq?7Rd~Ō5U6W,C:[6 Ip0u쳨VA~*!FQLll#ϳ?|[wHdV%:$uYFiգSfGRzDXT)쓹[2/,1^*0H0n0bySYIb.{ȱq媼 ! dVHxH<մ*S27u[fl% DvkSeBdNsUO1 䊺UaWjy.Ċ~sbC<FJ1pi6HO!e*HUPBsd$b-Fg>ofn7wn0XL Hsnէf,jd3 Z>,J: R<#dU;cC C1A#nWH3 $sO+~$m u1Dz K̡׬PHy1DjF7&veflFZ*[Hh$!ϬF,`(dVV& P[;}=Hx159!w`>E-Ƙ6|bj#}*+3uhԴLfLffsbԟK,,E`_|#-^, `5xCugK$.pU '_fAdEhcD*C)dLy̰NY[-nӉ+ȣ̪OM{Q#yoR+EaQ۶?;&Fo ,g1#[qv<(瑔#=o}ՋH ;^0. < <6ga,"Ɓb֔5i*Iي$٠O$>i+9CYCZN$T g+4,a9(UTݹlfU 1bp -yL%{@şvrsm8e NF|xA?W7wc^3;KUh+ tE;1Ė6i Qf(9)뉙4t/0oegjuw=$)(;b=ZٿF bHaPl]<~|}Az{MMv UE)ඒ܂ءtX.]dlAl>I Sop|5=:Eb2%:fYA kg8pE0\7‚eTNdp0ɾKޫSb0B ד<7V;{BqkDI7O]籥0,k\rg؛X}S2>gD+S&oI @` !,Û'nx(~cM~ڞɻoq4( N|NFHnXLpЭIy'/M&}ǘNUl,KZ%a% {yK;OrRs:aPXQ 80dt_C9,ጝ]f")ٗȱa&;t ykL֭JY}XT7w8`[BguHp$H]j7wLTCϷpy,,Uy8R(tyU kM/UcB_ ,3S.zNPAt7}<+e^1zQ9aA)"'t]ԙۧ 3`x }BbO׏n6J|uo{ W7]/=!M2uEBZR%ΛŻkTGR(B8;Sk \E )vÍ{)k#W8կ.\P2-\.I% >A"GpqUA=ZNiR2z26ht(ƔJpm\$4',VBt['6塹iJܐ^aih89B|2"i.J;´GȦZdD|RD72>-hH@6&4YQєyp.!K)5S3!pb[Or}.t^d}D 6?R#Xli<.bN1P ΰ(S}o HeچP7NGrl,4J -l(jN`eitP SXg8|%%4C-uIn?@c_AӴ4BC+X?G7˳/amD؁?( -8k`iҦ8unv`1. 4˿c> ,\sD;xT8ҀqM,Opsuшt ߿?xYI.Ff Z\Z|(ma:'ed8H$iB8 Ű1G ${}^ \n^5LR`ؿ-WR DmidU(`jx`J:*ݻuX.'%v3dE(WgQ6 rWdM(yУm$nֈxr{9w,0}ppojd`x˅rd[Cر7@]a B&M"f&sZj=1h(Ұ8+i )n!YOk+)ђg_ޏ3P *;1spMB(")_.(n%Gjwq3^Q >eȀitG_PRӟLG|Fژ$^М|Ke%6=#|ݰH7`R8^k ]1c^\\A{[W<izbhlY {6o] \i[z,lRJԂ]{7dÉ}==PiDk),j>)g2('QrKݢN`rBd}):x45jƵWzzh-\cY4ͷR M~on)V !&;$TE)jRC@8b2!svM˗7wWoPO iq#S0S/ {Ugzpw2ԗ)!wPKFgʻ`}_jmsGjd1X\N!@m vA`koWf[t 7&孖gxvkhAvFmd;cنPXWYk}LQhC{30ɞ $cxg/ io2 .3-hX`1l3t{as]14Bꈪ%\8صy|? nbdTno}}"Cz̏蹙5_ykfKEM yq8Sr\aS'%ق-?Фaű@ة@a L&YL_HףlF%V\|8CbeקC  "1o-uj\f)/Ʃte[wi)ӞAO#e ZY9;8 Ġm}ȋlll03␖)2X1b=CoFbXEfilܹ{L exfR.=((X=?FNJ޴cNl;u޼?-܏+Aĸ#/i"\Ifp >BʚBSLoORyX nܫ e03t]tڱ <  .֢[̨3_!O>TGmu`^_;$d9fɒLɧEzpW6 ъҤȻ6QxitU.TZǓL "g? [0=y *uҠ5bm ׻VgX?f|I 5"&$Br1(g}y @:,4l- e iDtH|)+7xAZz`pF-՗FJG%ߐ L, P,`C%RxMHk"05$se4dL'Aus,6EҮ=[w\O$R (kG-!7,gt[}7.)2\ZE,$Sg:.FT*+?-։/Fd5C_Y6r@ ;ZX(O3v!n?f."fbIIiNi9ddHP_d.c[٪y C9>$N-$xGfY5)x 0L!IHuvdH^˖mgOѵb"7ɣm$nz1z&_i ;'C"X~ F@ڇN&3[D}אw 1NVCռa[bt-rЈF@w+@ &W/Va,U~-f\w E3$L|хh5_fmϮ=w@/H–g9Fz br..viF嫍Uk] PէG]/h*oX(U >FECV cι]lvE r' (AuAm}@/#ԏ =?9GVۢ`G NIX!P%Lp0B񁥛 LWԈ8l^>qݰsص*DPf5Z(8YaA*׾E#`t,RoqKL!~яf߾{9ua Nj$A"7 =^> !`^FO9֝RF]jlRR<&]^=ܮO c@,ƻ;҅[ ݖ]`<3e 6bqQ@aKb>P^!ViRK/n-UǰfKXvx:8e8V_x!nHöJ3r|(ew[>R *qrejASeHtJ!TMN+C6`/x<{jbeCQkdRݒt7pBH*Z3{ w\ q'7Tkh/Iqlg1w:+h[56Se=G8 ). )aC-d8+鼽0 { g"N(_O/eD+''>Fn(dz2p(fahu-i6& 22j\wd|ɰ.7#M3p[ ԡh-G <.֌Zp25bo䌏62H* exYֳ!Np5>W}4}فLJJ~+| ߔϘa#'?ECHO)aҨPݫ(ecT(0(1-F)$ eGXL7h"s(R<_ 60ZKi #L%M2sNKy1dX͸4.drcѢhzi LPjۊea4 ItУ1?<7]w;C]\GrB"W!OJT Hp$89Suøk,۫2|Nn`$hY4K6-_wVGzn?=g(mTVTFVoa#euhݲ7,{B gqkYF.O  6\^/6S^.& SRs %p9bIuJ3'f+=䡾`1=#҅: Ԯea{eWE#]“I !rWyd9lf{gp3cXP+jQ6gLЎ7WMpA؛t>^_ޤԗ| ו]s7|ˌ)Zi. ϦmTʌtɄxPi&PBһ", IVuO);B<Xx6m^ȕ\og6jvek#Ru %W!s埉}?)>G|p dOq0x,ӲUooٽtˎs.*O'+2+ԔC!n#s$%|\JY$"CT>1|)@E=3(qUܞcK*q=~>\`|3#hY~hc{őG~oj4IiH~eͿRZ¼FNVm̬)tJ,&V{ӘK*)#Iٟy#wg.\>|˕:kz6]o˺,u}a7KNI݇?-Ȳ2bz o^=eJBd|0ϫfǑr)PcP+@$QeyIeV $LHK&c`~Jeg_opiCr"]L_0AJ\$vѪP67E"m ݁ZYsrfwHkAE(':V(x{@-]UW"0kj{:n_9pC +iqS#Mmuƈ}V/vWٗ8Np<|9R EW{Ιr ">B3R@9̳Qm1 ta HM[H/;]Dd|[8zs=zZ{ y;Œ޸W|sʾԪYGUo>\!gH8aT:DSG#J<֛AWP/7ßkto u ݵ]~߈@!̈2_?/3#_ U+,ahӾ}̞+, rb$@&Ė*HNGϮ|:it,$ݖQ>&-xg!3 ƺJJyAvӇp,vՋ=LchjFͫ|e Rwe?%ϔTw5NA|xP$NGeƭ TP_OGXV~VW/T%~5E@S-?VDHzbQ})i5ԚG?c c07NJŵ˪~=pK༚!h㯔8~!Yͷ? Vb-jo8`'AP?6 knlm~s+W ȹ3 p!f?͓6{&V9ASsE&fXAHF`{}Y\b ľGft׎=o?^_]4NpGܿ7F! ޗ-"ܗ|=`-'!;O"5gYј6NѶ5èD)a-gzSFm&Y^oK(霁ZiT%THg2 -O9٭|?-D\vHW$VJA(DW2ƍ~A-Po0 ӑzjm;C(=6 C '"V٨e5lp>|܅p.lFӓ_Nqx=GB`ۈ'0jZ7ÕKG+BZ )/(} vkfD [ u&m&ʡmj ʔ}S2#$%.ZEjq "&L~̙u&5ab367BQf劯Or 75}O\ IňW=.]8am}H ,j y~[aJ,r}jvmNYe0o3'q87d e~x*I050 4V`T` o!m;;qߋjYU(BZWG r[%K-1:>;e6K-G? @zqp92w,ݖ*J)ZmN $Wr2;gmLWk(rULEm }1VFksU*nGBW]O@ !Ћޮu/!Kjne,ύudvlVlRݹP$]ɤ߸?{ݮs4$QooJBgl~߃"jAы/UjAZ _U˓ȩu@3j!_'po{ =@g >lJ,kxŗ=nQcUG,/˱N@Y)Z'^'=4'oj8/34ŷ,3 ؋ۑimYExU0r'rЀ[յѩv)<#ݠ~ <(f0?J0AD@)Bn@~sȫLANZ\Y?&؎3m#X[N[72ȅlLӽezp-U3Zp}~K Ayk)_!XAä@ *xS!|Rp}}޽_lwR׳/lнJ`7>ysOkH+Dqi6Hu6E<8AMLYZ A8|ێq0I*g1F<0˵W׌.½?hd*kCiDixפ3^\(ڰk XʜJ6.t &]+3⿁GB-M_H,Rt%q׋t$ e)NUFX(#D!e4BrQ?/T*;UP})y3NH?h.*_Kt.9@kܢxo%+!9b9l+*uA} A^!ǀߝOSQѢG#aPQ7^_"\Q Ϥ֮p9lx&S#JYz,9eywGFDH>ͽ5ܣb}yB/H./X GG,m2IyK!ҀՏzNTSxZ񟱇3߮ Gyׇ Tw vBEbjE7]JvtnCAwKC=c h$Gy"XGuGп%ѬTL 7[Ey8!PFO2WűQ$ xNMrѮ8.- 3OfgksDb{iY!F!1hr3|H*qr h &n" VgWh}6vDRPY?P ߎS=ٔd(R+ȏ~v,ߢo;Ux윆k1LCe/K)G"t^{ขwGp8ww(?N0%}>dQHɁx&K/!~#h7NjkF#Yxʵ7;9D _ـ:v\z)ψ[L uy[Prg+UNb] Q,QhY$w1yX&%s!P+ iXSݻ`w@Porwa" -)m)ae7aVOmmmu 0m&gAom*mT3]ѲZ*|M %3"|Ѐ. ?7m6-nD=J =4顜@ۗx&mBa3Fd#[a0"UL?h6]_.$OltP( iB"ك~IkN{IvJ3nďzzqi9z1_:Z5 ٌbBeFkgqv6ah:vD'u5]iǑtoPEe8'#Zw5%R@*GGpu:K(UbNA)AjZLfʴy7eB0%RB(zU!mP FI}k rnn% "fDf7)!~( lZwb%ҋm?/+fEAGmp<ҝ$J9adK 4c8;<6:h7q('ΣKAA(g/_Ҟ8>+F,o Ԡqߑ5xJ&:c]F3D-0 xlhKi5f1]jc wGa!fB't$q[ÅYAO<\G0\_NΐmJ>zx^MV Ԧ#zrxxPt]~GԬPACPV Qǯ,TGV[JbeWD3R oagSڶ~åwDlx龎Hp #mmtrGH />T83#GVuV Ix׏?t>Va_χ?>u~\[^߁i}>vOyz^N[֟FzBi~<~tM8g?n&kmYO'$/@]tC/z{/Nn-jI|\8}''Q t0oƿ'*[E5=oو?L;qEwt;Q,:}|$L'ӔJZׇz/sgp3jz8E֠Pt_(־oz:_{P_g в} O٦3_0_,p\h"B~>9?q/L0A Hi>: )?:@5( MY>ZisSr?:uֻ"7-wjr r@n |U%x8t*?=mgK"9ֻ09;@?ƙ/O*|r]o`]aB)tM|TԔESxo֋i`C0-H{vdS?ֻ \%9ciϨÂtSN5Xq/zuhW^'y[/UpU;]z{l )4lPgs^*:h!p^S CpT?i+DrVu>wYU&&oq}8OI;mn*ko69?ARDL`(0ИV I|0:dy_`S͔Ǻmi8(~9Wj?V``{/\aG(1F{q"Yuttp-P)2=whv=t&vwq]_ NXo Tz9LAFEÌqy%}'i$X, ?8Sa엱ͱ3U^b XG}hM2BmCg$08md`0lm[Tkr\WG\nGv| { Il ҦщoWKlRh+P2WD.Q2- A5MO xϫNB{-+AKRqpfr .hŘaq&[@ օO=#0v0yg'`09]ۆʙ҄fJ)Ϙ(4@QUd1Ӕ{Rڑ2|`N&bBy%&GF<& YwpF2:"aO;^5tw/nT̀w@'%ßw ]<ӛf} r=CըWv!w'TE'X qƽ^d*b#t-Bc?Fc?&q;͕@+oӮkR ]_'}JJpsG' (:1kxA4A_HtJٮ^N'wuU4hbGR{/#B&#t@ BCAxo4DƢoSHۿR5c[J8d,}A؅S$6Ȉ@Xź3|f}x<N۴[QH]rzyo0G M[GR L+ %R9򋭗"؂e\sǑm XE+8PxJII,1+4C P?o&Å~.x4Krn-Dƃ: oob8o2|2]jH/嫻h4Я.v4G/c'bDoα SPf HPE~= Xo]X06Z.Bh9_C>{SgcB(2 |92#GMyaw΢N1S VD #ZR1xڴ5){rFi"@_Ǐ;1E0۬Oӎ G|@LP'puV"L)avkIӡ+ L"{d^,@%?`{tV6-ĵW)~%DՑY$vࢽzqi}[ )AH%Cf,?tCyiӢ¢:W b`C$ۺ7dU`jik,>yx!D$c_xEDujG:L7֛֙I*BF,PS UTs0DA4X`5IE j9SHpj_{} (eQl{xlį#2a7B:=GF_CT Ǒ)s,9#Y$gvJ6% #nBa!r&wtEzДqFCˌqqDž?׻;l@O5[_u#\ꦦ0)Z07K˻`9ʘbUzxZeu_A:$[Ԯ`41Mg2T)C{14cC6G'SNC !I)+  ld>gX :~4kӿ;H^*Pd5 ~KÜ3E=RxTiŽm!=! Sr,_ۅ?֖& * *eee{{ʢ{:6VqHg_NǭbIܛVݛBݛB$M+M!M!eɸS\2@&֕&5E-7ݛݛݛMˋMMbʨܛ"lF5;<44a")<%! \ro{"d |jn `(KƿŦSC/oOſAn2?ee~ګ տԿqi賢ڲĿAYٿAeٿAeߠߠߠ2oPVoPYoPWoJt:t*Hߴ"oZQo Qo 7(7P%Noߨ8\Mѿ9Sؿiyѿ)@ѿ)@ߴ oZ^o Pi}ߠT-fd\3  jv47,7pɿyKCD7J"7ܮo&۾`rIP>,|&Xl:8(T?SǥϊkjeeeʲAYAeA]*5өs jӑ ӊSSiE)D)DഢB98P⬃s5E N!bEESSiy)@i}3 Yvy <%! \rp.98J"7JCF.f٭[-=нͦiz|##dp KTl"܅IEz~|܇~;.mDX s0ćB{[,rwʏr} q7lC/1ӱe -;-KӱY b=g'} WB [92:f+mN}]2@[*glCw }wNZ溧̐puL]7]5_pzO"974gp⦻󊷓~_,>}T2U B/qPi8n$s̕6EmjpX+D p?'EOrG|p;EFxgU~\C<^*s!,4TQڈ/|,d$/.`qvW]W9U᪌0r*4{ŞRe^*J@N@^R+!@׈e0%?FBD5N|nTc!1c?qVlRSFekTpi*xa51â0KJpJpI,3?+ m7Pߑ!f^0Ӯp="JWYv}.=x>\#hnXh?^t?Wj.ˤ2q Ս3C-C%䕺ȍ7=h֓-NwWV>DYh[!]djz x3!o7S Ctfo1{Xr1.ԗ{T>]])g d1.`Wzr*H.ap%ET·k;7]?(.6#2-w}ͮB֐ L,Cb!4BsjRq<$v-&r"g5D: fVn4=wRXoT32g2]\DKTknwrzLq^ ǧG{ތ$6}?TN/k|l6^ L̽~oߌۃ!lpc^7p"' i?i U &pEp0n~[=x/pS8\p TboEIt,;CD.I1 .gmoa-Est¦ 82($ERu;EqIHh-߮=vϢ˝\{8*A굃N@gVbNZj)[]/CG%5DqFOh_~D^W!EP"H l\8@oǨ&M533)vm~+K3ڌ$Qf m0o$xTe0z/R9/A- ܟ Qmqͣ׷vMA6y,1Y_ԓ/][<@Hvş32em)SK4{Yiu>'KpC#&?Є1 {! (c*-kMc'Հo2ͬ?} <)Y @(Nxel b M:62T\EF\Q=WĪSsUEzr"{9okBғU=-Tyd*o#'<26U=]Br$Q=+xSœIQ: b]#u:IA-b}Yljw&.pWOo& M RP2HLeipS>^ E ֬!Ke.i2i*e/?ih3NSX9[E7YE^H#pb^ |U/ddsp zeD&J*Yr:H-h>C4Y@-I-e<] :mbz[ R,ss)ܞAI J$hl}eQTy%%Ψn3( ɃdI@Y)Ag JzzA[0-/JX& 91^2 <8 1$#?*M5e!ܕX|5yq/Ϊ4K m[Vpz%Sz$q\szޱSmOjJt$?eϐ|IUO /~bJ a‚?&5r@%XbgWDW>:^ ;X̚N wO T4b3PؑG; ʶn1(i+RE<3T;X||z"2 )܆W`f  ׮_$? =J̥M/3(#x2H\ N '} Z[|ByeA4tJ (,jn۱Yh^#q1V -2R"G)S5BlttSF7(AnNsh P;B)Q0iB P3(uF;\oᑱүaTi%^ɊcK yx2 (/ 2AtN/6Eۣ0ݐ/ѡ d-hCqB< @Qj/; X}ĈDJ,Hy0`PXo@@c Z9Ų&wa1xNi0wN%m_q=E;赲4}y]`ӯʃ WZ,381'it8E4++K`CQ߈<\JA>NZn~iwҪ.}I ͡'xv]NDA71ʥ\Q}F.|@R֢?mC@ f{u# E"-.6tL,2-fҵc]t'pG?ͬavi]mZ`P9R k̇-Vʖ 4Yv3-xT3VMIPMu8Վax}OwuۦGHZ P%?{gR%x_rXaof x<}w:ΧO}сuV v6ձ[^ze:] xk=(>'\q_|6_O 8}||K6Kfa߫[; 9◾mኹ v@*<}#~NxRGx>OyzgXՠ6¯}, P`1"lpi7zހ.f@ozw((|.G*{Qۧz r5_eApx8q̂MN=qDzЙdn0XfB^mf`t_~/xrkYt!}{z W,do! eB" ^*iO&gCYH" j2f OZ8 "y`{P^,H](C.j](DGHwz݅B$W BB8 7tO\.@ [X!oՠPhR{%n*{!ZqB_ Df{!#YܒG)ػ"Rl`Gs& zpM.#hؒr B@;%$$?GCd(n:Qz!D~gwcI(BZ;\7YVQLJ\~MPr'QQavE9$sZ: ~n%?<C ٩uV奋~5  戲  tڝQ8g.|?~P@ :pkw0D?)I(3 mCG< fSx(ِ~Tl- zk8[lCnd-ۣ(?WPȐ+fiQv QzbWDSr\zz ש.'J$b˷ i=W \w׀lߟxk; q•Ts)d=﹏j}gzPԘERRkc9/d~U\TOJv\>K缇Fu k@jK+7k؃1L|F%tr43dX F{X J@\_A Jx 6OhDq<+gŽBF;Kq%&Iܰc)C(BT􈊕>'l#PJ"l<QTeHL.aΨ[ 7/pV=13:S0 lW te5(OUJ[) $'QOe> T.2 %aL$@&늯51ׅD}wDN`Sּx_cuJ{|JCjޯ%jFߌDi8qE F0-c'[z,Wf)Pp0dH,bdd#52AgjT`󭄃Vr^8͒6iB7*S+IH39~IOjW0 k2sÔX$,OkAZ+0?h(XIR69W 3Z1T$2_e,g Oy8ʄhH%p:NNku|vE-@1E<ɒFT'7q:5٬+u!#Tut5s"R9)m%7co%Uڙuwq ѧ3ܢ,P,n H ZJO !qա+}ЍJ ~}4*?6)*kig  LE#}  -Ic2Ya}T- Z㞸}2$Gbϕu,YiCT1 *zWN}$1 Ʋ<7FD*/P H,oBi'D\\b֓hkl:J]3r% Ջaxk8?UUP*QoLZ:D hRlEZX3;xfwɏV_eHQ@l@Z0s\M[[v&f[q@0<+ 2RZAE3YN0 Nʏ|U'e^8=M]]0/I0QE˱&d3_5XfMi֧484>mTi3gabfSM ^n/زJN^Ue`8Bv#Ă:קlS̀4g.u*xv\MWs^xv=GiRY@]4`oB ֳ Z jI {a.6? YەROEJƂҌK QXl ؂Ӵ4QS페P3^[ k:zQw5oB=ѱ/RIj="cK%<`KɖP0(0Bۂ S%9V+Rݳ[5).s$jCf1U:'(Pgx/1j,Zwu/b E8&F&V$LeY.3g!q@2̹m/h7=u<ˠCt7qȬP XLǴ|IE. ! V/;׎nJ^( 0VPeqL~ Op&zс,4"Eӛ.dd@5ǿjPOuZ4.urO7x0ó)8s 클 +V*쭡YJ:":%(CDT0^tC:\ OxyeYd#)g$WD8${@:} X(U.e[ Xȸ+:vːoz;<o Tw>{M ,LfM.m J iY mL%#aH`Y.M β' K)N`ڐjbkpyPR=zU/p=|L\$AI˟@z*@T:B5Ne]/؇kȮnW_ujkԱ~n0;Opqn*;U]r|\o5<&(!紦#D}b0pH w}jz r {صS I$@Ezkx"qtܡk?^LA7uHs!0GZs@{zt)ׂ-Q!r*h%cY@`j͐>XdYre|қj>ix\Q6S V{VwpjQ|뾹t ۷}[W{YFcL 1՟`rR>**z˭C<שN9X,Ej1'd/0n:]=Bo*KE3)]XhT+_hnX{|u OQPֆl.Cp9[]-޶Ͽ!RgNWŢ޹2@_d>=Jsƛvg; =#{5ݡ)'̴ԆDuܤ&92Sq{mkSI ?̻AZְ.Z!6|uOƋMOf` }۬Q&{/|YA3ÇLO3?^JQDBRT;)Sj^Z.1`r8wd+C%+~UrM4Z"ŒC./?*h٥ jC3,ŗ$0~_D [n᱋~zߕrw*fxY|09yṅPQ6W&Z3oJ S]LWf܆% mg$='9" 1TG'""fDoYe J*rIS-8,9M7)9QJFzRF@~R_Fò?v񛱼k8^r=^n" G%͔K8l" Bwh"c826IbO'ǹ&t _⋅mO]sHv v"jH^?`n?lruW"0P03lBshONAX#/sxk{y茮֒j *6|[sinj}kFOeOW7$qUk Wq~J沊Zkpb;mF)ioU|{8a{;f,yi/@ũբϽ޾N|{+^Qkh{ k-o}k9b&E~A#7fp=lϬKxQ(309,?04 Xt:WӤ}m +ݫi x!n9y?Ҁ2wMp=Iy$j{@-J^]Qa{rkq^+,R j1R L3rH+^4|+Bf">,ʻʇ=1KľK!R0 .>AJ6}%sd3!F٘1Oj/݁.Ͻ6c~%}+B&bծ0HG%Qm#WԷrHq~7p̫۟'Ý8-6[m݋d,zچ}6mj?A0 laa=\ J.6ҋ Ev:𞋲 9v~lI(^OjiU-@m iC5_LzϴVRӠ":d?Ds-,ȧ. R{8=+;ѠZQg#L~;y8j7|v69>C.ǵtF/S~ޝ7B)Xtj̝>::;F"G ulMڎgOצ:8c oO?_2ap\9tpsH+# #6hUD/%?&@k,*@NUGqܗB3ڬ!6Űd7Y73RkxfX7&q^ K N`-M%6T1Dy`o{3mo{7TOY 3/B>&*1-dDVjz޸WLhH3Nl=rv$9{義vAg54c4p-QPN0}[;8g>$86 NL}, -d!7N-vvR`0aBxUW P`Al^H+i)0C#( T˴Cw = jzKd>j}/wIv~ u:0z^]~pUxP1 j[7B#@mTSIX*0[F8Œd8 <z \fhFۊI"=h *TTYs#чʎxUh%. ߼O/\?T 2ęgT$ Z 8Waa9W')6"oA;jrN_5˱9bT>5K>6> =/+Clh.MOwW=*›Mjf&$Z֓J zDkp^BO`2- WE/oEH}=Z/єS0dB"lk-x},{2oi5?D?| |i ~nDpqw'#3 11K؂PvGZjK5vC0Qz'HJ@Q#&7i۹K."XL2,dzNBaL/t},m`$jQ Ռ-n'ҾH\uvQI:"\Q*Gh(و 8bﶡ#iͩ L;jW HPVGx0Nv&^_'ys}r0K#iI_@؋s^/ɂ*`Ngێc_hHKYt #Qp.1i ܔUw$DmѵIsD1NvIa ShE ǽQ؈;CWLA+/'@|kdQ3 Lt|1ȀﭭK1{څJ?@+<[rAS[#ձ5ʱbO[x/pTuq/]w\%\wo%wV[ .Pq(o&߄@ `W1_Wߞ!T.2-zE/"$gmܨmJvŃL\Ef쫫||9gg?4MΡI!YM]>s H @s+⻾!8M/rZdUwJa4[VV_woo*zXϫ3')9#f~cq˓87撊aAl!HIftÓ>ʼn{[D#fj0v @w#;1tG:Fh+:Ck:0Siz$H6a]W1CDH$>KH:#G*#N ,o%!Zy& ɷ"Ճ .y[ %3yاZDC.<<`8g} +*XW$CdF~V|`UtW (k++!\I Yn  S)pH9-%uV(`  8̖0~GC Ӱ=WA *xڵ}jϠ6206TۦW."\n ƭΦ ]u`A!¾bNAIgt 蔠tzwb'|uI&HMjsq5ufe͗c`vȋ.|x`^[o3AQO[ W[yZ_@wק5\l|9|Vt9i^X.=uhq'X%9Юx\6=}\ןq-5y!kߧs( ʵyL7Xo?ܷtT9@mc"Zyar974z0L`#rW0U\W*rx[Dܫ~#Dӭn[q][c[wէFSbulmpz? FhZSѕ/h4rIH>63@+iEڝpwP,b*}dߤ{ s0%nٽCb%MeECٳJu3[O'֣}WIsKg!Ї+Jr feqZQF,(5M_o[g߄T)"gSL 4xP1Q=\"u!FG7D+g}oa@w&O}2A)V /L3"$/C;AF8[&q]%6E!2I&EI.>f aol&\4E4Vۉ./PpŶcl\m\Dĩn[$vg s.C:?veDJT *(_Bg!#4.c] '[S48R6Ѥ4:DX+Aԕk/8$1?J!shX%W2>M gJh#߁ nF!(xPF& u~5h!L{TvyW׹HtC+?os"=v\s"ڭesPJGz-AUH=8SFPrKÉ*?Eh;ک",*zkS" gI ~ծ@mU/O̞Xsֈ<>wX0yQsҨpMʮ<B)\^sFǥF,jnizhHwC]x%;T:,U11I%,8I(Q[ucbFENYD7TQ|'P;:؏9_/[3*˥52?2-lcB $K´/%LRBS}0CtpAP&Z.}VOwyQJGA,؏[RפAxa %U5Iyp[Z7J@W;6<ͧ;٩f@@ Mue nu~%4(s".M,:kt>5X8=d*0L&zxB]6)iF,Y)d NXXHc\TND4mw9 KIbT `o t_֑sS 05bwxJ4ȓQ  0H%ValͥRP'cr|qXkIH06 bV?Wh4)Z5ebEOiczyu7~;B{ (P:;}9?_0(PN c{B$`+xdT!B  Ubd"fkǵNZ n (Q/&>%cRLiŦ&x5͐d8=Gs;rĩ+5ܔsBBpDVڃn .VdŲ0CVRp)\VaK>Vϟ6IߘFR} ZH|O<$Csf?iڣãz ORL5Xƶq$j~Gqֺ:5"U"4ςW|K9= əUCRAG6)+ڧ܎aM=,a,&>߷we~OW)$O3b6sk' ~(Dp\ع6u k(fgk ?di[wNG:@70<̂ (+RCӡi<tQߨ g)Y^p+ r$-`w]):`;ɚՖqBsi&tR; m \+n5$pV6x~/{}1"EwW'nK[KUzC/ O"E;nhj~ (u7i x#knHq_nianTҴTu4IC~FR2}j4É uYĭyZ [s`1v*!8&!x}p T+0T~0CoGBO/.Fb`w6+qc[.{j/$ksȍ>mSK롓B1 pH E|D WmPd![$`+sL'05`!]@7NIXm+,MZ/Vфj^`=_*5_h^*ny贿/y\AK 8ôCFM}*(<;Rkĝ6=Sѐwx\*Ѩ%\Ύ/Q [6F\̟bFQIRrOHrWxTB[w'J[N=_d$S `kօ+OF%$rFTTy?S*0h55LEAW4jQֽ6(MWVW\*4G]XayBtϩi@VC: OIII!hHFV&^kǴ r4BBsM3+b,qhd8EDNvf"%`?R؆ѧˈ- 9"8_1Z\騇@`6q'!>7Ë8e=MfrGcV=ܥ('sֶI;^(m!W+V;QB6>i4y(Vw„Y!ŨL bjDGp;B.As*r|nl'i6$G"|hbE kLm9P[H:G |uM("u2G@Q9Gmy8nM(Rrv;!_9| 3f(KYiowefۯn*;=Wu&]A=x\;U=$XLvz&{C׎xi? iqDdPrPD.l1=c4]ԎrԈjPv4CE$:IAb5'I/$ۏ sfv22Iwۑda'UXIr)d*\h~{  R>OXI9wgA 7'~2iP;(js':~m*ll27ҷGNV~зE^rlVt1aJ>WީWQ)ڟ%^*8yDhyH?՟|/S|D+Ic R!vlD΋5CǍ$rLl>XoһEly4gl7r(Hz'ƘCІUZPCsBGLL24)鲕|u$`KZhyD)S{ΕRzE>PvQ<jw6lQz'_oXqpD0:@g i#ׅi[0/8'3!瞚qTnE葈Xeb_ F1fLl>Y_^*=0:}&N"ngG,݀|wX8qKغ颢; fE5B4#-*aQ24:(_%p⊽>ol?4W ᘨºގVfmڜ_jӡZ`˙yyCE>z@k_}i}ccuL?1~*JKt{]kRB nxk^&R8ϫG5SFWߕYԙ q>ש\N@jmeHN˹ޫ4Phh}6LvR,8ia՜Q=LyquK h^$>MY:Q}n%HȆ\ՈM2>)iφUSnƪQshRQ ԄAxVF-% ]gn9\ [KGT;,a7Knǐd.ݶc9ۍYOJVK9v*a^x.<؋}!N.dZl<]MXab,Fƀ:VgͰ@Y+6 I 8J.N<@R=ۢUlF<(^0bB1뿀|NNX4s`9у*e2 fX4 WAzᆮ=G:ѷc/Ǟ-iC)Xrx 20|o;c@R=}8Kif4O!;X墌/ϋ8LRWcg-GȄz{=RxP+:\4_=2ի8t#y ݯ/bV<<<ou$_VV. H^TXH*:ƙ mMp\{qpHJg;QVGRcڥ>b?ٌqhWjPuM#[Uej"V7}( bG E~B icfViͿ,>EJPaU)73 71!3Ǔ{ >U׾IҨ[{=gN][QoʟuֹvvyehsLѷ\.Gl 1%z@hx X-(n%}k 3=B"1kv#gw`=BS[5Ec"0ƪ9OOYIH5BE@V'4yQ<6t G@1tyĄ]Nb`%"߈q`5F;,(b5aG#Wk ǃœRV"9E1{<F$ģ Io{X(!?9H/ERJr)Nt0|#Vlnl@]tDTo⪪bM˸H+*{ ibwlxyeE0FCQ#p6H\ &iZ•K rY݈< ww $kD~+Z:<aUBF+ju` X =şts`Pk+L5=q/*a"-8ĪՍOďE`E՟6ϧw˫tmڠ7w uW/jqQ&E|̧{rjOJ[0/=M2 5WU[8Jdi,8!q1 ˙ oXBQc,W.opJ7<6#'&ڂt'TAX[f9OpVl.ZƤFA)jff֨~UdfuQ)×KHYIJ+\,5q# oxl@16Uˬ}r#30N?[Xz:BiATDs}JIߕgo?:Aܑ=ac]23o.^`%9 P%vGtS &ʍ%G0- F^4Q鑑Oi]N=E՚6c%yDNc?(ٴic:]I| u)#-18!%tLJ}Q+{ο1mT`k=O~5BNt;&u5C6A!$lf){+@\4:{" "@&1q26Į'5Պbv1,{!g ݴQDZۧ (F}9tp̴NQz$bj_u^d!qI%R4YiYb?^,&lVA56M dC0(&Kkڿ6BHa JbmUyUqBw*!PO}>@Bk{ P>7g-Vꯆdnsk| 2g,Wmtf]_wGKzN*t7X7t3g[NҊyjwͨa0PSr#,#Yk2ho}5 z3Eɱ . `A D}bY߇c8}p@&9#(fyB3IM(̄{Mٓr7PmZwY;ES|S%/܇1dz1-| ȢP>Ń+ڃeĂ(5+2^9z\a+s>IΈ ;XOrՖrur fϚE#7{H$L PqTB.F^ ۄ( "B njo &(TƓǠŶCŐo;T.e xcSzۚ~<`&[KPb$"DD*&T1Jտ|X+= *s){EQ{lvFfwqůٔclZQym}6ۂips.cf- PXoBL,5Om[{޵<*M1ȍTX|T oGf=}gOCZle,Gox|>>-rh1żP *1]4'Y.X^a\Qj:%WfV3(/#yWЮL;9I#r<0>2tDubkTE[GlIr_q[J<ZbtH.B>W@!n/55WCJXmňuS`kH%\[7$)WB]-0g$ǜ9p+a(`Ks=U  l!eq{QLNuC?38gЊc1µv߃5,W\{C< B]d",Y*,\ [;yɚWڽ + $a+i,D@?V^$_)~^)N8蛠(g $;욷uћz7Aws.,3(( U aY^}5f(aMz9њa(~V" OGģudQ NLK |5U瞖<0g Ht rMxX:Y7`nKYD92ҤC(ms$Vx7]LI;M5ip,*QX^D:5$H|*F ƶ wNəG ]00E&3SogP$u6|I$ \ e m|+C1l@ ŘLu8~u Ek#q)[%1Ӄi'i*i6T5=1Ok̊;pk\\.|"zA.ݾ5F5/]w,PZp_wa˯A*#N/*a΂JQnb2)ɲEAnbӛ;TEXYtq~ebkwYg\?JlIQ?:\O2FVWAc m4%5[T)bck,]v#ɿocTd`kEAK U֩wK`f\Ot1WJW/w5lC<4R䳚8_PuA_(RiV"-Lm\BEST \O]T -HszHtyr#G?staR\QP i/d^FZ)0`X8T8+/ёuMf]b3+L&Fc] K-XEBwayOO:y}`-Fy?Lw.de VC|tbzo-|b>4 OtaaCp D3XP}šhN~޳ 8( pP~Fc+UĦ%o> *0et3nUk핞O6G٢1%g#ă#aG-KgOɾ5j5 tҀط҄ʟMuF'.Óom9$w.[*eEPs<3G1H6H^3am*f&7IG5M^FRlkFHwlmSpkJT{".G#v2xFC~ /i*.#-R@%A.Ee6Ov NUs5F>ivnTu65,A}ˆW5ý$r2ߌm#&:X@iR8ݤkޖϢ[T6Jǭ87oRd`L`ZcETzI]ob:E i42Y0*LQCD#̳c$n:S 2Gov˂9\t,8-즕ĻUNopm"sט^E7(bhHΨjlp9/Oۜyvn}fk5Jw.˭:L6Oq:x0xK ֻmױ';tdWc "SiWsњbLc3U'y wNzݖT$f N؝R;Ջ38[WՀz,r$<39aenb'Uą^`z&oKjG]x0X0⼼~{Vp&8(fM-bѩ1.] ZAZlLFt"2ͽh,qZN#8"7j螏ZNo~bToCo3l8)W|'iiBǠeOb@=f"^ cmUe -|kw]ȔpvǵhE$x44Qmyj q4N"jWNyY?*a< qz3VGm#+^ IҾJ;^5K7ƪS*?~Jx,ַ0QpC-I]$6`{"ԿjF5L~A[ccUdKx(&bnjD_}Y&%"^z̜PL[{  ֥~$_!mcةNS`&wF5BN,b;HwXD^Rl%rWM܈3fG3ƿ[i5u8\ˆӻ>1WJ2U;4v,ƃpQ\iAE4|7a8GT$gU|Fs8J q(&H;xBF 6C_X\>, ,x? Ex&ؘvk􏜤osjm[8Iڡe3w䢕JUn:eIq3qve+U#m c"a7ADwg!)2V9^ _:HK}jF R_SSSƁ!XCYʃKmVѨsͼ%eFl30[\2ixA Z&ۄVzĨ@w@ "\4Kfw$ J tVa;s trUً\-9`Q"`0ŰmkΦyPSh; F\*[yrՌXOn!xHV @6?YQ.GSI^?6x<D+qz+ـV gp4\o*>HWRQc 9HxIOSYy ]<-%\oivWNUE?c=/ <*Qs~ϼzl-n&еO' \Cե5.*ױOɯ,*>۩vꮉЯ)kO@IfKa>Mex&s_aGקUǔM׾hR%zv@s:(uF-o,D`20qŚE|]s -_{-<ե1ltLR{)?vJ~}tY\R$ɇ*Z.pz8sy)6ҠXc !< 恰/wcQ6~hd 8sdG:0w1=> ˈ c.S/k%"nfs\.9$wwۦf)C(9((e*=$W]Ȁm"l@Wi*-ͷZm5]䳞v׉1H"n⥃>Cѯ=b3B鮚 mp3P_z3 9'ι +W:~EI?֢./3{23-J`,M>2?p`/!I.v Mr+ttOڼQE8 u3RbÍgqlۈ\Vpu㕙7O6 w4{<-Z:w> x~yHv''1ŧ n8!w K#K]qGGK9x;C1cE۶tdttØ2Pp/w;{TfQ"N`W1:day$W4>CnIt zɧ,0!e ip`9H! v;@}jb&:]2|0d1=:T`F#RŀF*~6@`(גLVg`@ċcڑA7'Pg)yOLN"DVtA-]7Q ~,N֍'dx3sA h^,-0h{ihK:Qa'9,gopy:i;o$;= i"OH-Xf:6$~.9%FE> L=$_ca%>v0- ԷHL߄սD!bS (nf5]K]Yϟ|uZD<ժJ5zڛ*Syk/oݍ6D*ouߡ:e%3 Z lAZKX$Ec kQ|"+3؛oWu=l?gwKMx>tكR50PE9Q[/ ͰGp EùbRIE} mUq5T_B"zOÄVP}z:B+ФDgғ]YQxsyK> Ohi.F'(%<>?@AКsް F9t23b2XHNd.!/̿>mTwBE&x6ozv^Ac]nƑcl'12%ŷK:; x;6S#IJ)F?u z>t}i4C81IvX2p Ùmo4> %[s*{"݅&:hNQ]?w=MP\tئ\3J̊8Lx`w=YhߌVy2Ka%rY2nQrrUP:g͔gs?6HG`͹d89B cIn EWk1s`K*}?tꟛٚ7QJ-&[TwzD޵ 7+i S+{\=靻p&|oV&/ʉ'*ĸgu~BMBOy@Gߧ`n J s5Bܛ87Ji@v}u\&r<\XX2׮o' 7Xv/.Y@~uaK5m= ={h|/#^H1d)&II]u20.PUVYzsF;&np*Z8PN`D @?#x"pLB^{Z-ED]v(М` 1 Cm+KJ] 5]Mi h0jxyۛHy:TAuac)ysoܘaSG)$ ux" mTqvN@[Uj43Y n1i {N/Tj5fc絋X̽99@06| = R < vlb28o Q@F;D:l,ecd-Bl mXLL=#+Y$}n£{)pBS 4Jw.dDP#|%Jp+TUY46?qj,sJT`Jb L(7 qyK&M~ ]g7WE8Erty.GxB5Cfr!h{b#zpZِzNd,gMY})$O;- yq}fq7ֵ HS1R&~ZO(]4fFNHPg6y1ÕK*R[A1APȔS$, A'bCp P4>Y!Ov^\s(rЊۨn p) pi5UYZDtY:1Qq7/Rk @"B?Аox4 s(J(qoc^EcѢ4,ГmXh(b imE e&5C1yvI Z&yeQ`ovYIH޸XB{Π 0\#A4$8ЃΨ ZhN}hة%P}@ ?5d19.PŠjcoWHW G!N4K)f>-tnY4*cN aևD' &_0M& ^ژb-9?enב޷ 򂇥E,d!E|KOP :Yj٭O{ Cfm!X w2\~h&;ꍝgPҲxz_9uDy"H ey|ʠ'[qr|#Rr_kR=y8X]8w=Q-^f6,JEC0 G/Iт04Āc9]"9ÄP*R#LɻXz438/߹zeF$1_IVF2QX).TcfgWUv!! 6B"&Şgt9 hdEpj-ہʁ+~^FsR%a4/}0 Q'`EnɸٕtձW}9 _2PS0Ԟ!%RpB q <$ "ъm|BpZ*dğ_~/` %7y+M"fflnYl SyaU乒+NPZ@_ہ;DTYG:ID"i +9IL{Ћ>AD4EEq WJeE|96pX"HMI'$|K'FqB?Yf"%0q?F=O*æ:Cx*hXԠ~UČ>PKqOoOPKy.FTangular-1.3.9/docs/components/bootstrap-3.1.1/fonts/glyphicons-halflings-regular.svg]#Iv+6 5䧽, - _J3U_yOɪ.fUwO϶,dFdĉ'wD/o?Ow?|?o_׿w?ZyN__/77w?o?~wx~zKŷV䡷46 _}s͂>l`~g˥P=ot~8.7??w÷wx|?1h>{ݻ}?to8~f7߶_7㊟o~tXʞ 7Oڧųw-|vX.tXfM հ|Z7Vuc<燭PNM aUVj|/4zZ5A~Z}73oVLU=>lOR:-wOoguiUww7 .y3sٴ>LŰoz{Y|>߇q5.ir]%i,X,a7zW~L\lvǛz1mZsƯݬ r5\47en玲,qqB7\G.vG/aϑY`|f-Dns:Exvy㞥 *kGI٬B4P2n_ h: fDŽo _6rذ,fkȄ(L4lDpB=ltPF cǕW{`x؅ bA*؋Uik ?r`0kB D` ';Ҕnɼɧx|lF:Z.\ŏii0_2]ǁC޽xq5煼Qnaw"bn&a8A-JlfA\^,S{givXD$BeSJF"0r㰔QmVG4f2!vCZpD=ճm)au2VdAJv֔r(e"vp_n@ XxZ4@՞uQM8G]jlaLHBV 1m 1WKoUBPrxV+[E+[ë-4|{HcU?kgĆH]1H޻ᎴkIP9GXV2?X(w%(pPUUxVSDbH@P&aIA3Lb᛻0 qAqy J B>Do%qwuM pY/Bȥ莿0~I_UVV\+B>W$_ $ot^Į_5,Rv}0s4 E?\"SLdVQaQ{HB&ԻF"P%ePK\;16Rnd23ͯbrşK`d33CA]ƊӤ^P&QP=%&cx P0-A~oKix"-邵}L)0Blm2_E 7ZUyȟ ŢLUI Ci|'`u ⼐'O,ᓖc4? ZZ Bѡsd?ţs=?±ÃxcX|r@?8 Q'vu?ǃQ&^ʹ7Nͯzehb7;)m܎7[,Oz8x\ܡj{7#a lyݼ8׸qc.+0(&!E8xpOw%!Qz*siA \,\Eƛgۯ3x_/=UP !٩Be`pC"^]֐] )U\?fĜq\&b@E3:nX=("6Sw$a5swcwS̗فfa퇿+#(N@ڻ >MŁ"i"K %|h@ta|𧋈=U\f61~e2-1X-zp&aX7%<" #WŰje<.~n԰3|y]B%+eYg Vwo**򺺕2L':>"9͔~b aN6fM0QOA7UWf f*HQ{DA)e| ] ;̅O,"$c{ػi܃kެ.?1|Bk?jU*DꑪU[Y$P,: UrMaݯHh߁DU~]jͯ+i'paUhY"F4f)Tli!'MKFT6:6A(#Cq%4i iw>7ȿmVn 9?%o~*&- Q.EIr3d*џ"rYW^Vkԗ(Y4Vu]CPϞ. U;^7}rn=S׼0< PS\c,cwL&1 xMDnwð>UCz4g2chj}|ALa1USIK+X֬# pi`2X hsM5s5F! sW\,Ak>S3k6Qdэ Nhm{n#ź@ )_:jp?NԔEs$U9z{O#IÃ~͏e %(ci1W.?(KqU t6YoEKAb+[ *vܭwbt  IxqH*I/KiKVGA0ȔϘJh?bUbC94t (#6%TF5 U0IXy܏ۡєQ HTت Lcx߽ʎۧmŀFފlnĝ2rzEP%{a:qqFUv-E ~kLl)=F h-4X'27γj0 x=2.W;{&U{K1gGjP2?4QkSS  uй> FC pG(Ix݈qȣͳ)LjmQKsM9Эlԯ7)&o4+ ԜuW/(ݩiEwcj^3u W)$# K]_;<ͣ$p@x L`!S2uR32 \B`G {vMi5-c Qto'p77Gq{TJ r] |Fxͬ@K q_@U>YPp7gO 5W= p 4 m=UQXvۉ"Kt9Cn |3_,JIINJY Ffb hߨm+4bz 5:<@@M3 /D6؇ݸJ3HBipˢ1DTٸOY;K :{pMhFww-~_>K۵{Ui{uԩˊ3`Iq]E*3Y9+}% YKb=ٔtȦv4Mu=MIi:b3ΜU׷c4.K[ !??Ef 3A#FLĐM튻MP~j< x+B4ceV[wUcApmK5CRL@S-҃KB=_V=z̟C@Ş }{},~բ^.dfxJ$2;ERGeD {L`7KOҭ̑/ I$3_8bSvZ|T/:)f!7aԸ4tYe$2c pP^1EK2AsE"%PQdr(Glé $cψջP@~//#} J(yK|nH9a6#J D1bi5WW(-ox&hPrΨxzgbs, cR;UP!n=kJ{Ӭ)َ}CYWh]h '^ E|"4H`v"^K$6T:Yc`ƴ_R*|A .\A3ӽ(޵ZUdZOG_hӚQ{_ZGdgq `a0ɞ`+qMwIcHCvzg+V Äq]|p#,8kHWk$bZf\ԑ,K3#pP#UUnS!Z.u%o5/.Lv8IulxJ8e*,WF XXE3HR{x+{'#NMNZxjureW&HgMr Tb_ۤf|0㲰.A 8r6 lP˓wvܖM3]F 6!VDC_@g;wSܸly1*@4G>3u= ZYgUɳ4HRr7{@n }Tk]?4ٜ=9A@6Y<[)Vs}W#L׼ Z79H)#d q(;8A,]pXqt3Ljҿ-.Em&5PO<.5ZeCͳs0¯, P5>s ðxІ;aϾOwoK㲅]W`pFw&a;\ϽBi?Dl#r|)WPBJ ǝOlc#NpY+ G'ŊV98t[;=wn.݈u~HkEHcugwr1QOrG @@;:TڱIϺiotiy\S\ytӣ*3)ڏ*SGI?2Oq$[hal;N JxǼL TakW5'i\lٳ[[UU#UCb)aU1!oX?*B0 YpL}[w FNU}hII43;UU 6|y?_ jL9n%7=x5͊+ǶW"5dԠ!+Jf/.t{=n4$kntݎlZVfڪզUZ!ިFeh&F _vFQKn>Fu0d !J}6kg(k˄9K-A*M+{F\o1 땢D=eexfyD 555iDaZC&E\ N#;`"i8)$"A ShdWI<:OeA\n͐ڵ5bjS3" ʛXSQX58+Q%cc'13uM v:M3t,iEtwHSNle,y;,T !Ѱ13I1䍏9_R݌bZM~y6QS%ðu `\m}Ǚ]F:XVB Ty0m~_`!xxlP Йw?2?-IP(T G' :傸f}St2VpdIt2H %*%H4Eሬ2, ALrj7{0~r!fkhR>2YESSecWߙJV^Wbd%/ӭJ^. UiVG+ i' +^l$Y ܥ*+L{@CɁh A+᫮̨)c *ylgsou!V+bㄽ :5%HC(*cMY& ʞhr"ٌp@)鏬g ^jBAjG/=2&\zU)>Y#/J]O=5u .CVz@#OӡX Tt=;uE3{[d$vD%^D(D"FO= Jy 7f.S#bI񷫌fZ@®z8 R_#_d9W`90HO\ot -ss t@Բ k4ݎHUUV@)Oj2ŀ"S| Y X{K7ȺD)h$uK3E7b'{jPY:ɕ.HP1r]e Vg:$7hL3ukVX'CFͳu} З+BG vgB[.Rg~z[{ۄ@<jM'%tT〯7nztLg <=+҆5w3ȩdЬI(L"g#36DXX8n7N,ds(Rx S$Vi06lJ0CfRZ[X'D8[ 1mEKw2I; ,T n%w{ x֨2.$<VjH 3RXӆa )Y)K]"QEYH:r72bwN@/R%!Ds6Uvpf0 ↑4Q H@Ag̱:$5.L>\D+Bms)+8!?^h:d05162@X䌄pg@"Pk}7,ue C"6xԬL=a2 8ݩK7}H!BVCǭ-KL%)s'&-p6)MiԲں٥ȇ5D=3*q7 m Eh:|90d=˂P N;lylVT)[R#sF1:xu5ugS[(66nWBθ  s@(Q(Ech4aF2!ᄚs@m;/(1QK;sFNG.4~iBIg7yt )|H r?aȰg`c>?jݣR ,UYGӘK'$: ‡|8fCtx=|*j3NɵW ^# <.^Q`K+č-3Q|F\|TSE'խ7\LElv`P45j'pȌ|fE+[ԇ|JYsPw\3Ͽ?R$h ^ĉP{Whp9se6aV&䲪V1*MDնٕ ˼陝h hŨШ}h"(eC&)A En8IEu ģq[oQѶ &+s-S3VrfnҴX hUNNmӟM#qEp;SPR ;*be{7jB8[5n҂r,a8ZAkxU~ D!G"&ߤ<k|xKSgIe "݆VPDY4")L-ܐĒC0HN"F5] t>&;>R.Cͼ Ŧ4QI~^#cg0 JK'L0NF]HYڤ=@s59@K=aN|?}efo~Lc@u4/Q8}{>+C N$ \EhN^yUdv( >5 w $jkM-ƥ$ H@hnu-'G6Pm,sr.^Pv>(k :Qč''3£Tcq}h SL>2}m/-ˍqi˭`ډuuA-C}3;Oi"tƽ]f# a[YLFT}G; 2 evI1ol7H(WK.J -^DBZATDgRu˟96%%j)R Z׈$t 7殜r+éZ[SPFR9iM* (ztמf|w?Dcp5B_)f%: EPh‘\(qf4IUREsmtЪⱠPCS?wE9{#tA3l)Nl{;fgB|Xa<XJ ;CexkLri}6̧l nNE\^c2IH"ė 碘 e"dHhR30^<+|^j["YT{B Ǒo6n/^&Z}GYڣUDqW\:2u=:up74-$ a{4׆DAEw< /^qP14[g@a PۭV@5(2@mUgu=CYuuѵspKx$8"0h* \;>g{Uڠ807 İąL7|#v$F%gQ7Җe,* ıULa-;4mtY=i ,02lcqlٓ$$e<;~d&;k4GFXdDWwXxl(9]LGZ~lJbBYn?HF 2i1( Z^s*cu\2c@fobz6GθBxs)Ne(`JkbȊx TF=l x%d9HjXYdl!t"b 1!_~ *O AkK{HX\?Ca T*p55&w׌8?*zg}܂?X E'%g"qt*QIE tI+r–l0m0qo,t1 1ffb20g 0Jq[ݡ\TϽ9HsFxPx fO*8<0:E wM} XHT3Fl$Z s![ƥ% I\]l0ײ1RqtfT@0 t0A3؝s,Iv bak$9G.~U uꠓnU>NWuCcs# 150{8V1Gg#d~H,;魆gdo!vpJ$4B}h {h-TեmKI=m 1n#/ؙ@u?{b-M9*EYfp(2J3YsexYg>`:HޗYygwzgwyO4f4Pfg 2\EYb(\N]"^Mڋ.N"R Ӕ(u3vJOr](u R)A'"7zb[կr@G!LQfzhh<hLKz6k2ipnql$"XVbxuHoÝ7eqz$V xۚp9ٮ{&A퇄UnZ2IAlmѴ]vz jy7;6mN*"aj.e|_o6 ;+џ ww65Rl$՝r[I#=+7SQUNoc0~E$*8k'^oEGtzOHJ@Bvrd WMK*?9Q96@P6x1UAK48%#++Bz .:WN&|X w+rFr=8ցp º#k3m׀I5ϳ6p,]=,O'HV7 pꐹ6lYn%烜a۳b=^ )x##/^4f˞׍dIM:,n x+ch.2-I惍KY+YN#e?GO-%~aĕFB8 *Y<%jro(~̭ţPC8^K"6O~@YokzuQz>il*Kb 24 <+-5:MXKq0bMj53:1^J`!yCg2γ P˳Kzå"P3gjn*C5Jdi>j#NZ311:EFѽc9k]y90 )0nuH ՗aZ^ٖ-0im,B =ɰ2ь:"&*bR'Ax"Z+cPQe^zaΎǔRT_T\.DM A7A!葀AjumFPV4ksB6yCj@.eـ&URe˂u mNrs"U_2^uP#(# ]9$z^@Ńi2HE5"Ѐ]o!T^9͵AەpB0}{lN/Cbmg~CX=6k" N4NQOYgi`8Vճf .U!q5fnT0}D+z[pĻи^ۛ,\>Bm7!˪AL,k Ӑh59sEP?ߢ4Jn=|;W纪<ܦ3s/s׈~ve9)D#TT4M;ElF6,ڐCN^Yyz 9Nu 3 *'2%1mt4~WQS sSZ@Ư,_$PNnF42a>w~xV`SL244CZ1NNHC":NI(͟ c"1b?IAAIpP1L"N4d! ',._StiC0xvP1ŦW*Y]ӶPj?KJ"/TX,N|qMB!˔yVk-3ϰɳZ |筣+6}S>#ń63Ll^n=1)QstKU^.1K`4>+Puoؿv >\Y)$&ҡ*̵ko JSAaUۉ9|Q4wfԵFuj%m׮򺬗uuMAbJL3́Nl &ل$Ij{!v +1{hmH_[4i=s2A,x]/EX=ϛ=g.`?le&{nןن b)Uo&&4Iwpz /[?q~ތA0?L/ "\__qCA^K{|%Yr?ñ3OU!+ZNoKw㠕Z؊+yK*߈= {7αKGW 2[Q[bB'febƞn&Xږvj>whu>a͇=݇?{/~2<4ph9~Czhavs8v^x[:Ev/8d!^z5kXM:9c== n?E^ >znt]tetIt^@/,4Ɵ|Ob =BЦ EC-T!1Z5XǏݴ.v@ev^WضhМĺx*]\SՁuF_'7  ׽.WMC-u{hWmZ wuYui!kWeU[[&1UJ.HT9Pm߸}C6nS&/xwmji=k(Ppt]m>wCb{l{. +\mՁfb mumh.s%b+7OĆlvthAb{"}j uީ=/AІwRĆK֏ }׆NlȶnQcˇ}gm608}#/wx5Z۾b(qZK +BLu`>jzRbMQoĐ7n̶&\$0,BƄEjfӿO/J"6M&:\cӋ甸)&6Hc P byUȨU9UGwP5eUoYd*tvz|H)%,i%X| /&#G&Їe':B.ts )[dulLufTAU̪*g6;YlE6킭U⭫aqv6K߬7]&3ׅEP\lO5ux;Ѭjʨ9\Vkj :ŀ. xeS2j٬Yɪe՝X֐WOmWXu\o7 C1-qK[DeŞbN4;XPzOts #}g؍ƻoV.^8MOmt#LO3v|KC53  k;<}'uJlX| *g41 kIV"' R@BӄT)33Z?$ū9.ųݩD%\W.߻'hk{Z\[~3?pq6V[d<+cر =,gIfRخzr֦!~[K|c♺ H?8;]f,I7+۝aK[3\sݍͿ=8pVU`_gUVX[ZUKY0zPEJ#V6f0W3ө'*5!R~}BAL+˳B*GI*)*{)8fZv:?pZesW 6E}}{[m}Nb\(Y|_J~#}ZbH2Z5o_,P:H[NϬ,~%KOrG񚝿̎?~旿tӐ{0`3Ug&ٮ{+ܟ+mUխ=_%V*V:ȀƝP".jUVdԆj-YՑQS9YV;TOYm˪ڑSe3KdsDvqN1Ue}*%@eWjNխhaP]|I&|q68]'/A Fa Rc[G/o&AÌ0S rږd:15c5=Z Dk.Sioz^H`@R5c·p8omqhEaq;3?}ppppjNm`0Rwhb_f_vgXVݞuvu41 Dj`9!hqlؾ]wW6)Gsa3fC+kH)=>ׇ%S]Nob'hP 95\Vb}Ԝ4p=mЯ+C8!ɪɲ)4RIL[Q-4-(!Ԥzh!O8#> @5S}!A@"H=dnT(>FEpU(GfUkVϑfUɺs[G>V}tHOaUԬZì#j֋":uE!$? G;6.YE(E 9ќk_A'(24Od u{h~=ݩtO Ml18'.zwtȮ^}Շd  4&=Ϛϗӎծ+\2#XA.izLPѪYS=U>HZ=:aE'0˚¥M6q<c/12HI7@P+ɻf.;SBt=1aTڒNa3n6[B36MTU--o~˔jjˤӧt.&'$-o)S{ٸ”m31cTS%>`f\u改iK8e2= VJ\ߞ2ZL9]q?晴NL)aNu |кo` Ǐ˪L w 8iQ;XәbK7u  Wg2ny_{VF i"ʹl Nh [YVe]tQu{HτP$@(,NCA#VE&}ҫ3ߴfY|ax,vvL7cڄ"T1{綃[MTLVW'wO\'>ux/q[.A"%(zؑr̈`f+$ϘM\'SX`vǾpCFҝg{N2Vdiiq>6lpwYZ 6-¨y4?i\Ƽ'QWAN%3KSBرnuƞE)23ʼnZj1XbHJ=f3={ {ؚ>П'՟N lOL~Д쮎 =Es7Xb 'SV ťI{G?c~Sס'F@Bk?tt@JV[([2HMtXEmTU +G`s1)"`= g :<sm.0WϢ!!հ||.0Q>JYU dG 0`$i5_%{C\7WHw|AZc-S1M@ /Eld$%.%v7\٪ן^(wEQ}: ȳ†(4Q%6. _SO/aՊSq3{w>A'gI9'=\Gӏ؅c 4+ 3]18 oT9N֣u;@B|NWY*-[0h 7\ze!=MNC9JZPNq0. i  a"|}$m:>`SYcğ~ S{; Utza@03ďQkNk+GA;4&-5_gjF#" 9l+ +Ju}l׽_|Rpz T%hTә|gI:G 7EƂ00 mXȓ@.`;'XB},"bقnOW]Rhn]w^s07kzgUδtv9&IDqw5puppPusjqL[VЦz,i̓PYζFNG4T%n':7ʨb"@'AP](t;7oKNCc)`m~~~ػ_~wm>P+`+qb3 0!`R_Tw7)Vҟljߒ6r-*AZa8_OacXҰFF9W\2k}=w>;z/~}[>O d:[J~>`q-a A |?{TlpKrk-w2{ѮcJ4;ol}{mf:* sT|0 "ackax9$3j3tb@)&ۗб&qU y\dh!W2lUdj=ZUm@q@.ᦻnɃ\c{ZYK-O̪žsI:X`r-Ă<\ZC(OvjB)SfL0+[r=q $R ]d@o\-Ad2\Ë!zAwr- q0Geix/}#(YI KB [-Rwp#Ѝq hBax6!=#X6UN\O6OQV@8VP.44-NMPʪ& Fn8%؂Zg 2 iC O -(} hg=OG++G$r,#[ǪKgyʼ6MYH¬# !Lqyz``4  ~ Cov7t=UH$Lo/2@~iCAtsՏ`v?y4~?H*TgWwLlA2G)Yiȯ⮢L;Ej5I*$=U4c"40{YO0EE[d ݠĕ³ ނ̞=V ,wLR#@ǠB%"{18v(f/s9{dÅृ7I6{)E\Zkp'2l2AV>;)\|P%26Q~ czo)ggG>1%:{4K%[}x.7/#> ,$v<rsFm*"{-fרGK7e-D1 jM֚FuIko^!AW.4w6/#)FFtQvX]G9AA~h oZ4ew.ԼbjùRaWi׮:t)Mֺ9= 55X.?Gz8= /)E'Iw&23О6C l.K܌BvYs,v OkrC7b6뷜_Y]lq٦b5޶?ѾP-W1og~e|F>xsB>k aQ(ƈeaGŭ*8Px8-df壔(10ql- v.#PDw1zI#iHO16QE[1~uݷCnҗz9|z{Zg5IC*eS??;dHi[殺wIiê3n+ܸd!t׽c@?ᦅpכDNFS^4yf9 \m}4l3 5&ӭy}Y)>&aMNn.\a,LQ4iq띤GvpD j&:":5#&^1\M_ k@ hm9![ bѧx4֞|(,h2%v+0IEn vg=xCo.e'zB:p:`}=[(d-΢? ?/^+W,su|wh.N6yy#Cq l5@vr=! dtǟ0zW0όu#U~:-uqH׹f̟*Ty92b>ORi [|!z Յq)}VBX˄'uݥS[GȎnG7=I{SpAʌ `Ũ[_y7W߫x[cA}~non;2zdqΎ6 |&[L{ͅqCL1%b 0tx|<ܚ#5P:&A6M!6vNqcЉiqcNΏ"egv}̰7dej"L"V;4vC:|GR&CM㏓yC3%:ѵZ U^*Zjggl!SK0pϮ_ }ud-in5lbϢOg j̿T6=aca5B0̀e5Ri"(L#/|h9alɇ:cfBZ6}d5 <ݖ#tC#7!SjpO̾#.\z][ovy찻E<}7ŗϻg˵WSs=X&+.=\ش`Gwݘ$_ Z0+@fxDԀwi9!Q *Zb%Wq lS8-䦩g+_\&t$ޱɝy"rF"AKYkf=Zу=e. f]6֯W~Bx82["Q/(b=񲡣阬h8uѲCf LV'WFF45tϒ L nPaz}crx+?"pD$LǏIh2-H1AU!H4QG,5Q1@p +9Z͒x&kz8kˈ/ v*^AbF " ڢ=am` 1." \Y|#k"_b5HB"q5Ga3Tě5Vޔ w)J>X2vF>7N~e. D`zjRP Ser4 :>x{N*Ӑ>:YOܚ¯}i7-.&+|`fGˋÔ2xt@FSΒgt3nNA zvdL%Us&'A(DaBp,8w­p{!dN>AcTKN4А*C<~C3M^H5A P,h|Ē\{F|>+xw.?0zpv:?<]ncqI.8GEA@)6jBv/%Fƪ1x6:'TfQIu"M} `Y5 ZejF4I7#PDLZB;^ݹvЖ38?qaB8MP,*mBHCyx,ɭg߹ܮ;mE|4K9ut 9zmp e̵HY,h֏EhwcP4ugtaTBY`EnE3DWD@}7M^KA=)S҇jr_Gv[̢I.'֐ɝWPU=}N.r[7_[L=Aɡ茔does=9yrp4fdd"'XX#b yIm<$D ܛ'r BwZwbGEyB)j2D_'ڹT De["i70>>|^!L(,'ܧ2ij涇ғC1^\@98ڛ8Sw~ԻeG?y~]3wEW_t+ K.9|7_[*rN邽^{U'_*-? ]:dXXW%n7B;!Zh^G1S@\S~ӎ?ީ?~ʆk;'Nhs]`|?1j8БX;7)"v-q5UtG/N~qJᚧ>(o&7 ?~Omb|Si@ ? 3H 0bV RVM 1{ۃF:^)߹͑1ӑҥU~%.bMhK>hO¿rIijK2Ͻ?~u[WF/ٟ/k̈oQ mx!>x6ک~;Y6}3*TH6:]Ȯ!!w.h ݸ[Wt{K_M}65~,Cm$S t6=]ƵXNyT"+@$XJ# EM{䬒dH@Nh #fXaHd`L^B*W]%~ց P1B7Vn&Iޕ#(yow @Qa݅3.- ,{X[I ďk$@Z G( |'W0IlpH(^I >"ٰ >TvU)3^5̿ЖY%gZ)MCY:A!Z7@`1_tɨ` {~W-[~mJ)7~.j[xѕƳVgٔ6?b8c~Ϻ=~yۦM_kEg>w{S3ϽuUo3krWb/a28+I mb9m:b!^}BIP#E?4a@D\b: p"Ki]a͝:sQLѠ$6pj0.[iU\-:e+cO755dqudL=`Oψ ^_!fYzm#&k[\J紺PGw,Y"wP]%P |P͗ B*߀VSkmnq^R*pDs6bBbaJ#,(TOwތy LQk--W/[o|!ˬ3Wp+ֵw|xj_K_;.8MkW[j-v&8gJkSi؂䜩5 Qk:4MA PERDi—f*YU{k=?7Bծ;\&R}׺k{-oIz/,Ia!^1Bcw8<5Ɏ=`G:PDk α8%V<2`H"|/..NMpfBnkJ3 Кu[GUm%yώ[{/~Iw f֯~^w*Y= y_=&g0 szBi4B4R(늺ɕ ww'3{k0>( LG3!RpiU/?{B"/ucGB $B><>tc%0ˈqF4Q,e(<`cwv!(2~X Ja ՟b ;ӟq#tN^&%Rnع7h(f ]Ԩ4Iq(DCLj$ZligWb( ̈'nF4KOۅ" ྶT eb(< AW5mjpDrA&FdұiѧM~q/izZ1dRl`=4d F*WUW5miE͉:RcC=ӥ~4J&|At6_)-Ҫ;Ԑژ] WP O6Y᳑nwMJXKoT0 [:*ZЧE2豯wV`뿓Vp-?ZQEd DFs$SfSݜQz9^!b\"y3Ik1`8B(f+r憅u~'foX5{-k.ydM:[˞pN;y);'~[r? %Aϛ,#61 CJ@~X~-^j~unC POK?P޿#ǾCڷ~?ېLk49E4\1hk:H>s`XOLY ? 68^-(ID,@)B)&eaVю{i3ٺN{(^^zb+Oi#ɧl*zJI'Tr͍Lz3Gar΄P yIxHAH)e:VtHGU)lɮlѪ0_x:i?mIsu ˫cuܱW]B<^r0 +9,TOw\$) ` },J|y:x&8j >MТpRNxsGG}|aIO\\}oGUYT=6yMXf6a"#5,(ASAlR'?³ԩ$U Ά-~K>j} `A鯿 ui_FYj;Y'\dVm2KV ՀH'9H0#;mrT4A35+0Ypfd "8uCGq&W| ؇(yy oXڀїedz ;*bdƄ򓥋R\.> W_ww"WլjHuN;-~ e-@5_2` Kر4BQЂMX1$YI$DrDPɛ ^ s/ś?9N,0wZgn``zU/lZt'" Q嚫f:Nl]zOvF]p7GQq0HČXe)o&\}IxBvWI6G(YҦ*$7&NIrzvjYnGpFݩիhKS᧸Qt }oCIGچ "|Ku>|U_qVzĵ_=kn~=P}Os_UH%l5&PWu 'jg }L'SPi$>?=>kZ{Cպ$fd2 )Y㍺Sm E wc޷N \@ IcT2*.Ud"ٰM:SFF yJ돖@"ߘmAvzRX`p4P-idsTxAwiPMPF)-A uW\Xq(e@)X S2¤(7=:c25# qØB/@)KpDNq[~hG#y^3U8w)f,!@+ȴX-vj|UJRb؃IM ^y>(,~Q؎g s([AqtgMfMfXB[2. q8RQi#ee&gYFD?,NQ]!}0}rƈ:PEp*$k}-iQAAήj6VkOcnxm`5##jpS%(eюX,\W, hlƎ ;g~EbQ_4-};e\AڱߋU܊`na-L ;{+w +Ҥ!Y }jLp֡62Ҳ9nD䲴*A49- V_o8\ Ijf7 +3e)t¶'ugm%-s~_.4{A ٘gl j9ذeh5E\lMg4v {ZZWˬUxB2}" 5g&{Yy輍g`ΎO51!{Cq= )q rJQM*h T,>6qP̫O(Od7UOx0`?I9{n{1vּ+֫Λ6V\տo-WO?_|n{g\:o|2zλ􌎺5ϸ+smXחo?NV 3^q B=LPh,9cgV\oG8?x`pyv3p"?cs? |{pJsSL>߲oWr%828q+^1[#p[8ezHG"Dj8Sgu+9jhۂ%Mk'RP6,r ^%*ȧ!Q(3m @^!F h W6)Ӿ~Ux(ח@yg⋧g[BȦׄNg#ttk9ixmp~eK !ٚ4(˵Nǽ\P{A"G:02~#ŌN*&BD0U+7V &(r 'R3ãrlt;ya}kԄ1"&"B8ԋd0zfA+w4\$lE{ď:zUE|TqAVGU8j}^O 2p#o*m F}UZ< JN5lqDkPzQ xQ8݉}@`> |$F@`\IK$FbFA0ȧ*o`ђ&-B0HAH_́7XFݧ3'H8廸[!:y^@{ݼ0>vNؽ^{cڋg<^jJ->· k*5 IFY 8¶S c fV{zx(#N[QBJ7%zw8XZPn(NdG>|s½oAyd#}74 PW}Wx껑>0C'tK\}nq7SqCf+Xc8f[ @@c9كAu#%;*=6 p`f[~2{u OѫN֎*Ln"cAi "2;5e^ncU@,p}][=O䐟g<PQO29zA A=pgx={D| ײ=e)[$SVt+*<-#Lj/U~֯хr/ݥ|M\v.2i2z7(̫y@>=ʙ `-(A ;kD`cyGgz '&3tΛu'$8. ?ŅTuUJj±>y>7`z GZy HYC] >څrG<Ύ`}!׈S&Pd rUpa) G@/A"bR:AطB Q{)B.~eٹJ=CVaN$sDaA} OCj%0m($؁^D(v04!Y-h6[Ј=5}4|48!::R7'pQՠr9l3;Nh2#Lp7h$EQ C$XDe \0 BGP:E")SOR9PZ͑`& v5*HyO;BICD3o&YqJ mG$ݨkQ ;R(H^DΚE#S)]ߒrNLK.X)8oaGW܁"**"[ 3>^?@QKdjc5VSKRQ> 6q=I%/pbr] ]fmAE@fb~*jàA􃸲b*w^0<+w|vGȏȏ'PzD!>A@~)|<,ѯ(w}ݞ-;mܢ]v{z=.quKVlN ?V a%WP/P*jQnDH#t;ek56DVTԧO|0*G Z9N#"='Q'2y(ÝFh? SSJ`t(>O9*$(b1- ҉m4օvJASݤ}T IT3oW3້$g44CB؏ č >AKh<8 0 b&T-!~h)͔tHӠ0h~8 AW y49Ut!_IH0x&7C1eIB";j<6 DCzD(BusH=EY@i-#r R4NP*gإǪzAt*CUP0'n| U^NwTE L-ED_utt$VkGWd],,_vKUxOӌE=t=j1m0VkV^*2f_,Ep!q`bo5#$1"vo9/j4Qؿη)3 lqdoo\\>Wȵuu}PA5O|EՃ{_K؝MOܝTԝt}Cv \3tCԧlMy؟RSS/O;|#>r{ZrZCQv7;z2"3Ύ)g'U2Oe^0+-˛5?kK֩f}<6e좱^zvjW~kx=<6ύ +'8kIL:69mWsrsȹ(;lyD4NziZ۴O,(SxjQS΢ӋS[_޿#x!6φCC'I'hF6tRqF-ŗK J:KR:3^*K-[v={Y?d<_gb}zהDAy N7Z oB!̵7u7zY%D= 1 V|H=MCɮTGB~JwluܰaCъ]k[u-koŨv•A l:q2bĬZz0s9C7W'161;Uk{9"V 58ߋZh͇obKQ +Pfv-^ۖ~ԾJYOax>Um[XxfZ&z)QK^Xߊӄ7`a wUwS7X]-V;g!Z܀}bXm~k:tvX@<SQ[qQ- L^G?00/21?A:ʼn\Pfv6?_ݏr#CO,![h@@rp@@x-L M.X~be#)0!Z8h$ /."!ǝ߿`!2R!brk5|}>pc5,<.rAgK`OO ,12+}m dF~cPKZ$^zG(cKM"E sRUn|Yӭo85\Ps#@@$Go!G~2BN<*x@>i[eoɐsz YB66S} 颅8TzH;͂j^IirFᳱy?ޡ6!j[tj]o{4v@и/cKL؃;<bN뿝Bt[6=Jٙ(Ƒ,3'7tGF" vhuNTXjs|=/BۥmCܱE~w<%|6~mO:E6y 7n.P:h .<ۛA ˦vv,Ǻwo'bxcpfd(Z<ʰȴ0N)#VwZ~k4J}]Nb" a{<]?1Y| BJ5JyFRpn}InOTʄ|1OiV.;/T4M+^BB{HNZSdY_"Y(֫]jP4IL&zP}N Pul8voHRŀƜ LEa2Il=d /D6D :M癴3̥@z7|6s\v^vA1LkX؋N!Qh'壜ΐe>О@/(3p룠4t#$b=ߧC=92AC)Tcdju=Z'mBI@zn)Tysxx|Mm}BU7*^Fͮ!.>pL(x< L b +Szk8m't PW@cxKL ̓'#fv]d C;iۧesoKь|$1jtFHuG) )~2-֑߀l2֊?P TOJ؞ޗ8n,4IáT4ARCm[}"~{W'U:_OyϫB|mfu;G5HRʶT}.liƤ'1hrC6]PZoDOעϿrwzXtQ_%s7WB\J^"ZClmڏg 笢hGh~P [eL=clI/4WdNrJmsqߧ)c{&PJ2 ya5tD(T骕di֪EtRrIՕcgU aHE)ѿ:t)Ү:npCꥤWXxEE<]`Vwj8Uu> 1S2;|V޸}bݠǕFc۽(f&MRV@L"$$`;GwvHq Uu${!VˣԙlR ŷc(l8&6kM3RtgrF%ŵ. ,.kIJL"r9{djj|KU0G+Sv ^H]OZP\Qg\Y1vU"Z>%+L~~zU ڍڙ6<;!x^>=YrwcvrTM ,(ό6. Ab49B< -`y剆MVz#l[4Cܝ^r55IE380XQ(A-BW9ރkVބA@9nJ1VR:~W@A8Z&; 4IyLjg '*г m$TEQ-"Ӗ#N5N*¾beDqGBwAvmDX A2&4p-FuBD8t5ѫBmDuByF7F07I+u:\L&, mWu|AmAHk^ZR'1-'~" Sԍ{X )=ͿW]LEMUSr/7̀D\J(3A55u*IO g7xS>*̗5Xt=K}zyՎmj~_ryu޿XT*;JKRfl+vp ʪGdy9ȵ E$4dgդIkkFzH~cXׂa~Л929NSz t%%z[Rmb4 í+>IyQTΞӃ3h$M)$ѧGoM'nC]D Q`Z3u\xצLՎQ* QCgܥ&rIS Iblp}l_iohWR%34l}XΩyD}?F(j[YjܦE/iWCMNMϑ=Ё>K㬥[6=P9n9'F u,^(Jz_u]9z`x[j  䜿K/XQW*AύV.p&am-.7u,~Kje Y1`bԻ1,l uHWfM9;3ήȋ[&ϔ*pĥ9E^[pI +m߈pҍEE31, A֠ÅF;g$yFLBUynhWM 쓱>< ͔lEE:@;]/J冫`)9DikGs*P ڃXqq΋۔f[7zӯ[q?F1>5>HL,J^a1-$fy lzU1kk _"ET\}$hߞ\?cN3*`D ޚQ̲]L7L|J90-8H-sB-G,fjBA0fݷM uٸ[4/QX~BA/ʁ1g_oeC7 Ii .C}%9|):@2T "Q86Ψ5YA31&z=;BWiI _Iy '!EAN=$1҂K){ïI}Y7B#?R>VcB'M:\ݶR:+cꃝ2@9nF?T[sߧg`k cc cԠA0a#ꆢeP&t:M@ BB;816;1ߦ14ՒMKZ⒪2B/"97 )?>u(W.Qr%^7IMӱI?c.Rk HRFƁ$w0,Hb$V.MG<8<߼O QP _.PbEP JT@Ј\aTMp\̳%,Op:%s7-9) ⫓KIi,艆ʶLVZU׃Lq|b. :sN7WwE:6O Z3TB'mj1zWaDkπ'϶j?s8='8&=*<;I4Q=+8a:m6+kzT_˪ C+Ԑ%+uQH Aνϡ~b\B2cd4]\jMmP;C{t٪ p59Alڼ_7?ߪS6m>r>° iQB;b;050!l׮{vP;Z=@-.%[:wfVY/s7 '*P(( >y[HV1&cPKILJAtZYVRPUdKz.eE$H >l9.m4S;8(jciaDG9'`6emEfui}Udp "Qdva!PwIy @u6{̚)ͭqu&Uu]x OMUce]B2gݭfJf(rM e>hI(~aSS#cAK-겴o2D )Ct@[%oR.Ю",K6a9G^ Ţ(Żj/zǶ?qs>U-eIK?>6Gh [x)9:[ey^sj22Lǂ|)dUh&qos9[phUjb#5c}a5V6}$cy꩕@G u?Fsm8mJsd(o >2n"|ϖG^r{+nuUzf  %]ކ=Etȿ|H^g1hFOeGeo{.fDz@b:߹9ʾpR~U$Qfd#.G§/]ؑk*OS>|֨5w&ftW`gSx;*d'ǴkJ^`\cIx<2'1TWak^0YM I%u`(+4B a0xa  #G|gW?vY uxC)XDnѩlxHZA:o !|DD3a\l#r1/AQ (iar xp]8hp'Ytx3q23!?uu3ð&`lDZ4#=H&^㾵l$6IZM6*'=KiV;9ɩk|]6qڱ}V_{*9!ya/SqHGbXϠ#\BtR,q aޗ3p+j\rWXÞ5g+߇u=;('4\n=߳O1ھߞ&xNgC9;31\Kn^F+ZNS+H"IsDFa~q]+(bsѸ5: NVZ0 |9 OrσYPb͔ǺՃ'V4&&e7JQ,#X3bu}->:uTs2so5ibC&'HqN;`,$+$n6vmk CRz5降!j<#B|VChW"ZW%l36cm\hlݙlHY U.iFb3Be4&Q;x8>eXTbR9 `3َ GC ksm&3r1EHn~M'(嗰|n+v>1RFLv;+aWɛJQޥ-HCa䙄uϣn0/H4vݿN @/쐵LƣX#JǛأ@etXZ |`=эigI)X2Ѝ&=>vL43S^A0lE{uZX=7fk]H2[g@tfGi ʷ838 MtUf ۼNwUE( k>8z>1~v;L!O*cwg߿1{]1{xMD O- ̕uxH `x vP^p~ȏ.{r:T!ʊkz~}%RO4eL=C|93ݮ2*ĆuWCc ~t[W8:8_P|oT2Ǜj+*2O uYgv4{dK^;/&zWW DD(3)0 8־P)cg)TEOzN\nͰW~e#< =Z7{֩٪G`G /Ul?~H9q|@Dg*V.9h41=W:r=PYgȰ%/x7a|{jWDֽR7" ,bOX4esݮ>Q^\i6*;_7\Z*|kN2tIc`ȊndW'F>]_1 5| +^;Q7q<#qlKyHfF mҚ'B'ca|f:Nx 2bvZM0׵7\J$RekJl>޿# 0I!R rq~)x}ZOKdǾz3|4DQoq bnj-sIYŠŊnv& #ŗw"Ä?Um޸Rw0^p .Wp #9rao:) K.Ǿ6'IӜu3Gw\v&mcH[.tVKf\'_ 3VlA m4ZZzoiظ߈fv؊JڪRhb]8 a|k)R,'&H?b.n>49}~b;H{+Wq}l XM}6+6z;Ptୂabxi?}LUFeGF>;U~5+"[5t˝jv1>Y|As* CiH\;QҼJ&# ble'7>7Lc60 ȺFbU(z4.TF4mdh VK 3לj=w Pou>d S!i+Ml!y%Gr/2YN0ɝ5U 6C0~0ǧɸ^?fJDïC?V{ 8t+2Js"!O=c[S'\ r4>d5O4|gxlt H5x3 pJI[*Q߀h)^'\^&sxsV0!qIhϯd}0^Xx2Piߧ?|ɺV9@Os0ٹ1K`lX-Zp]Ψr]X;;-~ uKXo,N$_Od@_eqYm&a\l>MffQ:UxDJaf|O(.&y1aJ8:uTVu&Lfo6P{&PR y^B6a4 `$Xk;{8=d~`mt"0Thxk}ǴlY|~nXvkuZi>NgٱVyfP8RQ4U}q>̓fƘ '0| ٞbHO4حH"m 8YxoHwn郣8[jg:,dU=%{AcPi !@eA :T.rݎ?S&_szM"䡠/t՞>r; TOqjEˈ'4"0l1h;"V6:7#{?R}Z1F2SorboJ hvpػ:<ТLd<$rKq4:wWGA[)fYVtsĭj9n;$S9q\g{!.'52nLmߤE jؓôs?寅JQP@]oq#v&q>y^kKy9jȫcq t3 ]0eB{a@TB˿|\Vt 5hF-X+)06RauG1؈d-h&ߛj 7BDOVf i|\Ck ^ N3Bϯ^%>/-) ʼn7 }&KL_3LǯXz(l6m'Z)U.=c聵TQ]GEh" CZs0ZM;w-j #>8J,0BօK\8P16%L sr̡,-x8c25]LgD =B+c_ص-l $t(x"C)_{)> ]@IMoZ!m(FHtL wjjSyj Bei8ji(J>X՟ f ;_7 I䱵. o=!lM߹˵ i۫o*` VkNea>3Dd2 zӈ!H13_hkO_j&TJ_M(c}+r0W?8Z}AqdLR2]S{ ; "w$U qh4>K_YC -Pr|^ Ȝ)sZ2̌4?ixl~ʽ.e##!(+42âkvUz-[UNbۂuDOHko!$s< |$u]챊D~L0 gAVT+ly +O,/D:' TYÖ߇OadT'hb|Q?^`f.! I|ujhS&|þ{Yl$Az' э! xfXY9Z`V6N]?Q?¨1e~;оǜx^=C@Aw*ޠ>_?ot/P ȭiP[lFH KIA*n2/`=TU䄭ydD<C+=<0w~v]W=PnHګ3 UB(Z螹z WKx'xb xLdav;Y|c9%4D"!Jf 9)”t«J3{Nv~uR{(L[)_x@bWή2iƒh -RE|vaQ G :)bYb?9Q[mT+g1kJ{*@k opb/ +;[—t~ ;T.StQcEл':[iΉ!ϲj1ڲ1u[jyYw]EUpOI „Ũ) h,_ *g7t1˸.bZ Tv]mj+ت\ڕ^SoG6TĉI ֵ[!yømz?|^"%niy=pv3Rbؿ:*C#ՠ!2ڛ RY0 EEJ#5݄&TQXN p`\ #/B)\apI#(B ;.}dGC)iL @er[?`1y}}ܟS?kkegb"9@+[*H~2֔ajΊU4?^<@0ԔآsGѭnQ51$zĆP0_JTO񄓍>+ş:jPm@65G]`/<NEjɉCBB %K@G3u9'{9ۛא]i| \UTb]wKkqna08E wA[8sKeo%/Z{'@VU8H@*-'?,;EvIqǬ/!UOM!9 =9qʉ\ѧ҃ɯs]odu׳7]b0tA+ϸ'(Nό-R6UuO) Ȇo 7cKtYގ2PtX}olզErsê`w Pi#U=M}e?3$/P;Yߙ07P2ZjxJUkt"#%$Z8Syo ɜL[IBc8tڎ\aqE*|6}S._1rLnrp(-+ajEj>=LPeĴ'EU(ԕ).N)?mW|UY}8yePuUVS1e$wNwFqS:Y.Wh`Ǥ/k[t^"G mi4ly!lZK{`b=)m,AA:9!DJ[Ǒ`ctb& oE66#+ZBuʱ(k31sH+/-+U"(ha'eB@k\ r:b jDn\ tδ*pLW^+X%@~=V0Nn6!YH!V 05{w@pg-5휮hupr~)i47y#~de]IC)"aviS2tW\𢽴уVX;%LQDs r\_$o@̩wfe1|f5cYca':#܎kw=`0Jǻnxb!;~L@=oK?ba2񄵥FHZXmgqԜW5m%6ćFsvG%LcӧQ\|{L{n癕\J+7 9XB(}k?oВ5KnyLG%*D%;RC2.KSk&V.HWJ&TFE+_han?oXLL*S~GvX2A c:xFߐ-[MڿTC1]{W ?ћgPLhۡ%%sq`h?`.0kj4S_+7%aǂg^d}u]XfŽ3^B7cQgs 4[){؟Ə6ۅ0jAw=.=H2apN2+% 8Fj#Uuǝ5{tnbm&YQY2Z畂{\L5[jN}!LMng'SK|.n7J8x<vy;%vEl/YZ[KZb{ptqdq𢡄"u=ù]%rE'iNjvǮu\WUuK|4I;j"NYS~M]im}ހ8uKd@dQ]7z[+7CXP89C} 2X[gtA `D6ޑ'K~nHOݟi4m=g~E.SblXi`iQ[ޅs=Tx@gWCS篤߻­Ea* ;E.OWwAzQ=շ? 6m&{,A;2.$v%(ɏ쌾P|>p,"R>jc pǢRҝ >jH&j)d'[ uITXsx_E_O 0h&= w5-x ,eu$סx'ٍ-'n ܽ3O|g+&4ʥ۟Zp' ;D{/-g1밝nFVbU~\K8 iD@',$H1Z|~㳳*T+mx3t K"(Yc޻~[M3~W0{" UŹib vfSgmhϒh";ok7'CI~R⫮=J`>tG>S6CVH"'=5)XzQ Ṍ-"BC;$Gne0ӁFxR&%U>mu:e'#X1EހRhW5}Bzq}, Pt ?Ud?P1/0@B2mMŖ!DdX96x{IO`|ImG$Pu@XdNUU&$pbHBB 5L6cRֈ0;OߙRňG+836؜9 z <=,3^u 'nw<$j~,fnZj4E-3ZT5m!g(XQ{j\0(ړYWfgRVI>ش\VpԢ?Br(pe7/t}6Ў m8d&ꙹ>oesa GG8^7&g~1^ %[dt{n,҇пu Jw!8ld/yS_ mcTIƉ#2$ėȽZ}>QxXqPy0Pϧ65JKu0VH}:[@,E~ͯ $:Zg&)Iz-sCIVlUW &H`vi/>Lji0s|U;TBvY"GGRqk+IZ7Z`"KZ:L8acf^1rD$\DL@FŸcXT+gbN?{qx`\8:HV!lN-#$>ЇO0cccά^܏I%t  z`U4j T![,TpuzD\8 |ik ]Gon%.;k^*:s lro49>m6s9 chfjTE)y%лxӇa!3$3gOc`O8W1"Ȋ>P_ch(CsD3@sFE'g2SkwH[j.`-r*e*=+N5& ʂT R2Q߲kEkWIWsۏƧ78]R79YPÝ"#=#3HITRx,rSJlCqL߰dWDDlll& &`EP 6M^Srtr?q}ڞ߻|͍KP ) }o5¿Y'˓gVcB_$/LAn/},FvD)C*V `\Y1H&M$DI\%3?="wJ2_}OD疚{U4UnVr5~ Z;.ʭ(sU6coܯK 3!r|m^DKƗ"a[!cFCauuVLEN~i_Ȣ>Zh1o)\%Ѵ݆ң]x..O?:AK"҃IUaڣ$hGe j A"c-SUFb2 ިq)6pzht?N Kp;+!f{^ll ab~má=^Tp!@Bb7ƍ߇ `a[W@ϯ֢멗yWf_N=CKךk^qZz\@2z2@KJJJJ\JTJ3 bKD( cd?*ΜMLMB88v-8v48u۟vv ~۲λ@gٶٮَ4r9:%ԭ`[`׮`Gk-ckmmb _rIru~Iy~OuKuZxIZxdzIhzuIu q/q{jގp* 8qթ%}J<ž1V1#>8Z&B[y}G OLh&-Msʭ{`,s༵x`e[4~˺gMuW,c&+'&N孚k^"-*& C& K'd݋&-K-[&;J!T["]rTr>mzPTZ;xHz)o1:L~ܘWOSUkOoEfգ+ 4^!`dV#=}0?zuppPK\΅Z[PK y.F1angular-1.3.9/docs/components/bootstrap-3.1.1/js/PKy.F=angular-1.3.9/docs/components/bootstrap-3.1.1/js/bootstrap.js}wǕ+Z2wZdS,ڇ]͑EIofa2 J ͜=ҙzܺg7b /'哢XL^UKW'lt2};_,_=~dMXTxXыzXU_Ug:蜣֋%[).G˽Cx/NuZVAm/7ɛb\)fɬ So^t8bVuYϪο|ː_y'ǹMV`yG@:H>}A /<٣xH- 1 r=\~OOO_>?{~8{d;޼ySNo3aO0Gxf$ FAq5.oΪ:Ums8!cahrp n>AO,0^/zoѻ#w1zDqć) |y=}bh%X)[(%Q9_UpQ<Z",Z+3F~n` ~WKIhb opp>ߍX[n#pAՃLl@UKhfmZv9WrN'E'/d \̖U ȹ.ß8[D ($ۘ0lcիjrV`<gm;EX41ۢ[ ]kj\,A~붲 @x{=@}RQ o_A?}qmѷ_6Yةx(KWSί=8x(yxѳ$+x7i-$J\7vցw`r8̫*dr:,&wm>L8e[xը.>J&,d% o'"G(vp3ѓfmBеU`X/_|~?/)z@nSӛAMꦃv7Yo[*Ϫr@ -^M\=̟y'`_b u:h SХ6k㕲 jy9 XUY ڶ Iguec'XPv Ux@XR9UE<Xo^][^oo6tSgD8I{Jd=S]!_x0ޟL=7ًj0؇TRjjEW /06;jWÝϷhz* st ko ds}qQr<[v}iiʧ1z/MȔ9-^O_~ OLI5O05$E>:H& K(߀QRnxvxv{xkz6w`Z:[T͂\.FjO6DMlo~8;x7l _e*|svrV7x2)$y_vl/NPã ^+/^ӷ.6?4WYҎz5-x'J"劃C.\}x5M@^EQz<]bqxo8Gn*8Dq}=,Ѻ.   ^`+׾hV?t1Fs}l=Mb1)Ħ'S6F` ?z!&o;w ~['Rr+4|e.Ŝx/b}miyB'=>̣?iƩ*9A)n\L^ 7+bs3=5ɨG<4 1jj2pkK2'-iNO=nwwѰzxS ) |1ќ n' #)2[Tj{!Bz%!k#K)=($uFĀT^ W'(~Ā ;r'*aum}π^Ո>\WWDO!7@}N,иfђY8c]/LT5qᶆ5TA-UtB{٪ rjZWRLA@\`l[1_P>2* |).b)/K-llC{4z8M'm21nlbF?=ӣZЮd2ezOYfۀNtU1З9wcScdijIpt h]^O5p6{9R~U]!}Rl229!G.V6#IhjID;c&mAS"{B[?sy.\` bPaΔ2Ԋcj Ӑi惛?6lW @Ѕ3~iDX}Q-GU5>U_XkVcUէK+,*[ Mɯd] SJ䅌XyQ% vc3QHHOlzG^łv=h jqƅ' 4K'% ΠR$\2'AΜ;nMaԈk1k8BE9;:ʠ6쿁5y5&̾6=z]ggpL*ޑ\Wl[&tR>N!p2 ۸{~ [ŋÓӣeS##2Tw3333I75W6!itr|>ZT.FeC-}Ӡ:zblJ +m$y)/WT[6.1pvjxi"ٵ3%uv~~2 k&\PA'ȡoPJ@m}x .BJPNe2Z j9D Ci& wBJ0=o 1+T9ճ@x{\ FValE hVeɗf&(럈e13p}O߻&cH,|Z޲==t0)Fm#) f0+L1*J\]{5a><>R&P\>lQ(Es1j PIFUR!|s9 :A~lgH q`!Fr`Cx_bl4t7p `XhbR \V.$vDI b7C 3#U*J[YN̖(AtZ+ӄdu5Cw){TU[f5Z]"S QʲS4wdTP^U])ܡ:u):'HUPla^I:S1|visawҾh13ۋ9F)Acf@U݄xN]{̌yd@idx"q7@mUYFVYЬ󠋥q-ײ-0+eZrH׮J{,%A*rA3[ 72.9M"ؒLEB[DFFD\TLXNʟ;х!} }l cD>>ÚD!)u}DVtmTlg|Ŧـ4J'Ʈ?eje;>3lR0t|0x_jJ55eGx݇fﰨBy~pHLT)Ϯx+ *-񣾬RnMDL1Jr1d \7x9,#;>ǃח. b|Sп~J) /_Q~NJ/k_IA4Hb}m]o[XS;2I֥[+X3|wUWm.0ƛtW=Q)Z|ĂTF}X+'Vs%X*vM@-@JvGrϛU3Z em|燻g SR #GgqDzYM6¶(xyL}N ";Kg)9ԟؘ+C99'^nѳbL% |ߊy&ɩ:C>ލO-2m" 'D䍁;BD''/8;.N_>;YdG<;UʿWbyPiIkW#^rvȑ`}&-{t$v [˃J40ҥǕbYl5w8*>$Plrg}QQ~GjerkJ(?8GEzCG\߻A3L;ÆpʔjYxVEeeNB3T`c\tiT<04u2g2 b:h]*h:jfGBr/'\!y]6f7F<;wwz^lRo-d㪐4$DZq"#c]XzF9Wp0 FbV.^@94m EA*$ɝp=&wbD G14\N[vowS[I{ u':a.`yYML;U8&%Z*f*=S]ѸG4ȁKQH X! /=B 7H>3WW +EA}Q   19;cpa l:nAQXsNs=)U?$P-ԱoPDS TjCj`%UUݑ;\h2.c wtYNvtH$l8%2]xQUVGaZ]9qF(;eJV!/֚'iK d;rINju޹(]Oo9-qCdN="u0o.:Ѯ͊EԡN)N$HqGVg-=>xu\Xī3WV1g_j9toHp+;z~ &Qd qm*lOT(ݝy^` @; U;u}!Pr$`aQ$M S}#dkw٦$hZtB)vyd4 PE.^sRfP"(~`sˆpDtx R/1R, (lh&[l9iJ^y\P^Xs/De@mc,j2 %{zWY J F϶lu1t֑S\tU\UܓU/-/u0og8lTw-mZ:;>~quUp϶&㌲ m$,J6j,7._r~= 1 ΖdNMxհ.6 Q_ wiGn@2=@}2:Sk bC2-4~pwoU=u6jH30 K#F^Eko VFgjfO21߁4#n RZ(x/0Li*ʹKsS%ꎎ(l­ٰNre9> [䓃5-}ܑe~NS b}hzIV;؟F3l1`g2RHs)ۮF1! GFo; r$ZAc38 OY$ ;;O8@LCqYTc t bh5 F͝P|FɇE*zA"x*YϓQb2SHü]1pf-9ϛг>JS{R@CXuHeQ2dLZ/B|I۵Rp^>&YgP rsö Tp8k +|S{N7)`C鴲 Ift4u9uJC]jq 7n3 Sd 'YE]  *9Tޟ_^mx~B=- 6~;CEhda0|,H2k (\>RIF_[@-s׹^nj҃dk.='MVG)9JAp^ˢ@|z-r20{Bc8EE+!J*J~h`E>8,?{%WYnDN!gQͳz5bZ| pAw![?O)Ri Rn8ḳO;'zLcd?_g!(N() +|H|SSLFᯌvb~eWxQٿ˿?o"N_s"G&j3^_p{3U×glҘ/#[3UB6[&ܱrLCՓD]AUX.c:chW;$Î[P?r]bnL#HvZ9/Q7(E$zjun>m@6xЋOkRk}_0Dݵ6 NtQx FrnU0r#Keaͅ:c\w=62-l<쎲w4(DnD1,BDb ¯ W _B,f ~Uސ.^\A;W]d^Y/ Bȶ >ؔ5yhjAi*dp?ζ|DTƣ*6%B3!DT̆1"#W)!L9=.JA*r ӊO1aޣ d._2&:apc6tk gX]A2YgwM7imC!7 `nF||/Nѕ2Vj6&ꄀ^t  &X1ڹoNX$*9eVIcFiE )DneHk~7VnAyHޚBH!i^l`7/ |0-K,A JA_ BW!"('8ޒE y3yscl^ω[Vd0.:]12 x{|ySSI[a`U_MIW%1zP-]4 IR9QݥRiF67#^;e{oF* 3~%rZƠ#Φ 憕װ: )fGM sA 4]BXA4+5'«5l)N L^*ig޾իeGV[& r h](R5ا%~S1'ך~:/B>B< ɣCj1&qeA_(_\Nl1g~SØeE^NOڈq'|ϗ]CP7y%Oռը䌈G( Gh *YQ~DKyE1qf(wFI>#,k nXy$|m:>UMLZ~OO\Dij,jTԍExSI(5\"Ϫ.qbn@@ X=S Pf*$X؂f݅񆆇YݻXJx7_Xf2m0Vc,8׼<>;/y*rW_)CK}% ꆼ 1^'*Sbc!;{]#Ж(qH͋usS |g!XHc/"H6)+þk1q F#CR#1 cFLB dqХ?3IdSו0,oEZ.팕"/|w!G6%L뼮|U>$s? |sy@=aW x" @ $m$y" f`Ki P,jfA#D'S)zUJi259fqv`JA|YiB@*]I &ʝn-6 v>ORKy˛ /m7h݉ESA[qCB@X .vſٹBOs`Kwj\ (w5Nn6kjӀ&6k6r5|3'z|vsg#tt87=}=>uz~J%(`-=-XPjaEZio픚['=HOo2hxS-A| ,dXGFBHOK/sv ,Ad X 6Js-pL@O"itYDVzEDY!_>_1DZuo H1_P >xo -tR.~D/XeJoYG =emĂq> ڰ 1bcc+I+0|8$'ZL(!m"ѦySʧ¼Vestc_8; :sxn7[uF75zeBg(% R᷃iU*X!1_QE0 ฻\aOS3PlXcj%>3Jo"g/"rKߔ]\+ & nM{.LHl"`Mk ÂL% '-39 @53͹E74ڪB۩ ms|84uLb. =罬ra֫-q3#|ԝ%WDTjVÝw>>x ˵cAŏ"wL2bs~:q,5NWmnKO`oz<$VlLG/3Q1 d-P FP',)UH'Hh5Wk2~ auOfF͋djRӂjO@ \Hg&2&4yOQJfs<WWzOAz|Qze웢ӣ3'sMkn(]&PSWbl.&}9 1jJ,]=M\#33YN6^]='ɝ] ͙3?%O [6k0A| 2!$mcԢP##2elHD;!qU휉I?t\'xJ3O &iI1TLX4h%-9DO Z ]|`ma?5ϝb^3x\".rNy fG0EzNF|XphGuUkL"@|h5 l9]!!Ɣ,$f Im|OV9 .+: h[˘zרH/iQR 2z%sӹ!sV2+rLPՐ. rs92N A.e/V+KPB{NC֫

    ǐJ=ڛz> _p!ʤ?PK~7PKy.FAangular-1.3.9/docs/components/bootstrap-3.1.1/js/bootstrap.min.js]koVBfTS`rM3.ziYP$%ёEUflo罝 EIb$"y<~~/{_7nޛgyv/vt^-+~Ѭmb|{MvUdT軺V۪ݮjWZw)w{;ݞ.Nfzzow߾x/gZիLݻuzq[m vM󶷪^n6ͦ ==\l~7V%ͪm:.ip&q7j*U/=7dNwT&_mkjzmy*a,?jif.fX}ѫWxgݻeuY\ 6vC!f]b(ƶ@O1>:OnQo/>7ȚUG7ue~lzJ];={\@+0r|^m5U}S5~N)!Ag]c}%0]㧗eˇeq/.z~.X$xbl+֛f1;_jC[e6f T7͛ 3c]Yہx|~W}mf j\Whj̋}ޟ?߷W?I2 jp1=>b7,]t-|@3ȷ/vLQ ̀NA/-Z+/*OcUԇN];WHςJ;E? F.7os vRGUyqh T~Y-]!6H[؟rzr qcelًf Ůٌêug0 ƥ,QuMGo "-wO* B#7O'LN6@g)dHY %Xi1/Wx.Ağ.+JhcWf>_k 5|]_L(yp7Ud*ntrl@ uOH<'^x-ƻ@T!!FLr}-Kbo!۝GcR,>, cH K&"L~{*D&-A,I3z+0ۖp*ݦLR 4h[&U&}aYƏ )'椡HMEx$ q@icY%d+aM'.rP' :'@JL,&0SO%uCcl[<]z914&C̲('P1.k\^C.jP瀞xu\pgCDUVtO놆h* \!2H\V9X7.Y+U yY BҷFlyAƤ/?}^N,  [6/A̹hF|δc Twn`h0لڣLLQQ FmP{ӰAe~BS'x|[KT `fj ľ%x=eD8ɲQ&IY7Xf@5B(r0L,S7EvU(.\.0ԯ}N"t ؐ P"(_;.ϮxXpM54םF1Y:SMg@Go=mq _g&e֕;b¶4Ț 䗺-BsaϾ0[ A> t~]75y~ߨPԸqŴvxΪ6 ڦl4CeVû&'bZrd#Ͽt_gĐGz10$V=yYvDRa vZ om/G1)F3ӪeI;lT𣸑Ť0O95JFK;+:3ܷ- +a%NJZ̟WiOl~.{at/![+݃'llei Ak%%|s`S ~U?u10튜fVl$e%Fl 'OOr'lƉkN o`ډG+W?$.xԺb.x":"1Cb|H1< TAXG<<<8'yKdJ>$VEnѼ wp&Z3:#O)pLo*f[Y5C6 x}PҊ<){e?h<LHq!dƴ <>.  Z,@}WC)̓MO=؉u6tp^b$]X,ܿ;6v`TA% c B-.褋ۛANHd}W7Eɶؠ$ )O3ggS"G A bC \CNvFrlM/NDk)3F=Mzp5y>heբcC篓Ww};#EX};CcDryoә(\FiD$(!雐m֢VeL;ձ| xlBqXf6GZŁ='d::N(j>>H/r|4„nJiu)JxFsvuC^_k5y]1kq<-sYӓ)ŨU<=DQ&5 Ib%-eX [˩QH|g/xh%;p9. A㖷"LhF "2Qn5@ sS VHӮY*Q8navYCefL 8s||Ẇ:v4A;)N%2\2$@%IIfN5=`Y1Yb9/yMTpF0g jNY;AC9#z&BHIHjVXl!v,ޖُn]SVi?hY@Z٧_^A'f9خFf !GQ E7Ac>F%` -;MMhM$MxfHIB ]tTx]#H>?@v苦;oa<)rǚO |^-C'?.J8şvRO^]ł*X!tb(޲Ta FomԌ^N>om!ưGoI Y[>F/# jC1#Y$# Ag _Zs89ItfQU-XQ{9tw@wP`Y[07c}@y<tC(!yk!B(3 ʻo#+:zO`J xACMB( 6 2赊RR=T#SqFj[jV\# Mhi3ɦip58rӔrX@C܆ N,8/Iu7e\ȸA$y8 !&J}|gÇ[*ŒM|So{ %K-+6TvGJE$l[y"=}hHZ ymB*Oek+Q+k"wDXNAڶēU!‰irgop|ո lڔ(G]|35| J8v M{&)rpC_Dg 7U/'A#ulU{Pؐ!fd&(/*ߨfi# m4n7it Hmkyޣ`'C;Nja cJWYy\6 'xC<()$bl(:4{ąNh`1W׀&:΅Pf]F )xF,¹pɴiĞ~OA嶒xj{=P3^kb0"U0P9ӚX^A+ls9.;bv ;Ss]f1DFF .< 55y1[Rxy@I9gxX-qgj3+(ۮHTd))px!Pa>.gW Xx<fda0P!9/4X1\ 69 /؍ XW?Gݻ D#3GWFNFhMZP3H'i{P|w0u ={$ Y+T!ը|I)Yګ+AZj&C'OrA7[pXF#&BPߑER z7oްp$z :Ij.ooɉh %؟ט}{\LU m @UAp&vv2ё.qGS,ڒw=>`qC$:9yW7F_ p84Cw&3G}l RE6/2$՞%-@l~rR)Fz{^O+'m_NH%"%rDozWwV 3Yt9̈́Br@_KѶJ 88=dTJ5w`m8"Ryﵷ s\f̽zPN(oOk]!?QJp9R`y ]R€t4MkK\*m:|%o7TYl+2 Jo5'_J;aƸ |GMƶį]coHW4ӂL͚'~3‡V8ӄ Y[E󆌧5m__hx3lbĕW';+_'zLkTBKcQg|Y,2*]uz"POtȡmfM(]cxr&I>, įGl]#39&C TEOKB>HC(i[\,:!NS):o.?? Rf}~鹦gnHs' $WUG[ߞ2 ?ȳ$9.ֶbXdF#\M7@75 ҭQXZv'GJ[#&"z:jQ`ќ*ri֞8 'p ͌ )mz!w24XK,Z)1gn旭}0[4 Z7Gs Y i6z -9XvNmDqm8p<5<Vy 5Ӌ҇N4$B!g_,kп/69GH,eQ"-@"/`aBj:Oŋ@Xq*@4TU/ӌGzŰ8MXoXƉV/a1h~* M:AŜhIH~A/&C2jQ/>`HO蛠y+"plNV36)_QAbt=R\nfƂDR[SۑdP,kV-|{ֵ7 Έ~٘adpW"/qn\/aq\/0NwB5D0E uB)cRKCyϛ]2\Ly= . E!DED?O?pMb*"Lt'KGh @ vGl x/E!jqEDK(DB}.| T.j,oezI1|ݸEhM%#g^T@EC"x¿pa]B.Ze,#!XcA=n(}}"Ѧ~"6>MhPBnO+-1v F7ǽ>6E݊p8ghw0ȢO5vVMH&._]p{ ;VuE-l*JRJwwwW% |1 prW. }Sy\\p%ItʸAiKOk|'uQ!bߠe&)}4h !Zgȼ &_wdVO=AHWӽԄ?>WnVqi[na@ 5.>3R) )H7pi.qwغaGO ַiZ-pjϯq "vlo3WF^2CL( !ī)i8ؐ5;6Ch(mglczwY-RLչwm5NJBʪRH!G*\cA ik| &p a+kJ5|C.r=S٧;Vd5b]^!Is,Q|d΀ 郣 }P,ZwT.qVQNNQ˸ 0"A!u)Q.&}Nt|d]  ה xĈA 0ӹ zp绽ܸ1_kNP5BօPGm`OYtJ9]>\ve'hyS+[0W: 7v$gR&%NM\'(cTpw |,Q;lc.S-'+dOki "V^>bވB#?יٿw qRI0<[X`~1UoWTOq{9sjQM'-Ǫ)mf%a!!?4Uɠ|pa0Nr`iF,B}T_X}4kmKNQuHO?2 lh688痯GyKK|q&X SاI10HiވpLR>Fv$qtQk¨lϳ++s1D3FEo+Zh<h$=o稇Q[C7 GTx~h*fowew,'U1H  &내(7B3xz*Hi$ 1H9V$%|3"A|Ts)F{/MИ ]ɢfGcE#`4`'#dѦ kXΤ{oSؤ=ѦYoKAC,:q3a_+K&'z 2_.}&WP'nl$Dk'"A||,s#~Oӎ#YlPr*&_b>NNj[βE$b7Fۮ}܍(m9ն p .tJ?ٲ.S\Kˇ; T{˖ QC(RqOGk^{ĕگuXx PK #qPK y.F9angular-1.3.9/docs/components/google-code-prettify-1.0.1/PKy.FEangular-1.3.9/docs/components/google-code-prettify-1.0.1/CHANGES.htmlYksHί2U[e[CS!@ld&Y`vjj-r{n?$lv%eE<ܫ-#Fs K8;W_<jru%:,W'.\F^|΍n_gz/:Q9W3lqY:o4ŚMf.҉$3֥LKݞ밹ίoqe|(0JATz;K9>dSm9fLZf/5 un'"㵛kCr͸*UWҥ7GpW\eժ_V ft!^-*4ɶdAYlb clҽOf(bKDвtsĪJX&tD.(ۇg+ʈ$~%˒ypOEee4F8*Q09GȓJ; |8\&q#)" AZ [@JL#on!^IzL^&~u)t}8dEe/H*%!hY7VŞo,8r3VHGX!|zɥ!!7+p<|ɎA8[[Q[K(&9fP 1]I?]%l]Uڤa:^F!ҞLϴeVeG7zL `,BMlw/cۤfA"UbcO,۞:`|Kk>1RRyKl^' d 91VD%Cƛ54$?yn1ψ6֗h2j:_vgPu-25ޘ"V. _V (PQoo$Hք42x ͂$%Iݪ>E_5T0>8/F>$ډP\`Äy%X!~"CG΍/e c.6IeXWh8i!OxP`vK4cj5eY;+5aԥ̩R*Q6`SZZ15B# x n{P/e<6Ԋ 1GN[F˜oپcuu/m84lp*Ɣ^1 B5GQ IH(,ہEoֳN2Q4ܬKQNE^%/:0!}b7NE`ځ ɼka?9:'r5޻g_YGᓴ5knee]PggȌE(Hy,C;i2( KnuP%Hޕ|p,EWΘ2#ōo~^|HCe7! W'p5$q %[ ߛҁ9FjЀxgFAjpc FcB&fn1bD1Dk@]2t?TU&l@B3ؐ CO7췣iF-mq8еv*VT1fpgIZrF烕(Ѝ^ʅkjQAfOUTN&SKpc=z_9>O&hs**Hu:?h&b,o zoϼIJ. @R1G[ d!1Pn+`ciAP,h AV7L l/ۑ =>:N !HIM&n˖m1wj2_+(1Q^rX' ;yJx/SDBq@=x]Ϛ]#T#CB9 }> H<06|zQ  vkHGC(2l6+?'ew[e\O M97R`2-#VXN{$qiH Tg7unC I1U5xRh il}ᐁ}gp.'5ebO}8V ZYbYN7ԸԍM7J; q#TSFT;uC|e<|?^rJtt]r7l萰{95=XD-0(.MO$(}ֺׂfND'p4o iҫSi?aw#@PK K iPKy.F@angular-1.3.9/docs/components/google-code-prettify-1.0.1/COPYINGZMsWT*?M',2%(k ̈V~}k40HۇC֤fuw˭3瘟k{w>T]k^O_N?l;Xh^|O/^c߼Q3x}~n.oޘۛ7ܼ3sw+~=w_>jj޸uV= SrԢ3MlkzX;cەYv*e֝7CpwaIa5Ϯj1{cYH2G3wt0 wfk~4*<-ƵS:ز=jMo7P /VC|9O)O跶78t-^l7bPmlmECKE{g, OP+pC{c=(=5vhWxm5Mת$}~-^ﺀSWsSTʙ:"흟 |QbOLߙE$𦱭8aUOL~|D_΅ ̾b6 H@öQҺZ#;Qq9$hCc ޅ$"By s pfq.ʚ@Y'j,o/ж Tz7U h"d?J9N[3WS)AnWV`c?[U0JAW(Bv:ugz9AYDZ@_WqXu>FXA-֩@zaiQ<̓oj6D P>1e+ӉrjqjCDoTjgb6nUY?J?u(%S3x,MfS<ت:?ɂPI@&?܀=q6j-L8Gr/dhGn_PLu < }`Q\^؀Á,E #=x$&ka8R%!X=zJԻ"Y HBჃ(4e50v9?}úoMZxc8WµMYLeؑ),#] xb#aEyyMa$b*eGO}J(":@'HE:U :V,&Ʉл&<&@o#%|0L#8f܊]hMNl/)%ĠKjW&)aW-n(τ>ZdG*gBi?lg7@kZeҟ~¯4]S:<9l!& 9.Q{@H\6kޢ"_I<DnjCl {'JTv蒣 tiAx!۹d0ZAڣqNs|oO=ں|*nI :D4m 4$ ;Fn /"QwEoslg;+涒 d[efpRAfb\9v(`0rcHb"}]좭E@K"Ka9[ 5w57W R8i< 8bh LYҩv9nv-@jsaRmY }|H=)aT}`}ğ*tMx<\` Zz>#ɬV Z:*)*GԿf6NS{ϖ@MTn@" #!y>6̭}sqXvS[S}M|$uUB7MGS)|EaV1A3uAe!tp+q,.ʱTȪZ%ׅ:—)wQW 25wfh*G7qD(r% P:{,H9 ŒG=|@*c} : CjQ^w5f"QrS"Z: 6^7+؂9'<7Gkqtk3\gōD]wFi=S6t@8=4񄸜L,{9HTg27i{*w:_&f3+샗XMB 0FG/L3d_00 g >‹Ho޻Z7S”)S!GlO^0p Q;HN*nj"7Hbhm;}hN? vc(GAaW Bn)QV)n|53FSC K`b$ OZ1kx7]E.r*fK>`n0=WD{ë롍@ "UHy  aK3$et&>PJVb85K.Yw y슢IY#p"r8;#dәJč8x DCFT{lk \!)cw|$xD~-XB(!{QeOo &!an<'hbF˱D/h*V//8IN,h[VIB'Oo7ĸuc_PO>K2{Q@9-10{d.QASG1څSrm@LHg"AʂQSJyFzM݃4etWLum-y7N #׍<(>)\}(POƫBa)/rwk{y3(z@86+upXCV:%Oo2JdS-VFL^y7c~ ^^_y{;M[(0XtG;5$V& -iI WrHpO~Վw?J~7¹?),6AlbqjvEZ$뙎Bc.лˮ6sk _m z?(a*@#{P _I+d@ 2^y=03<ۘGjwѴ\J3̂b7D/mM ;: k[ke 裹=ȶyP`FD CI<&SmAvxAҔ0X@ȭ/k4Ivǯ/ŻWhUۍ}w6c4-yMlJAFh|LkF[i;8,4,-lE[O_nѩ\7+~~ 'H ˒-ʵVLqMf)Nu+(BXdIV> ?d&ʗr׶TʦbbmC'+Rn0>ʪFZ0xkZ(8EǗ~{cӝj񏲺C=eU6]bmt;DCe9G &`LBG$yޭWq8V(e*%K?g뼡;(S;\SƧQ +,̥aw fAtNS dSJJ6qz>ى<;D* ^osSKA/6oz#}og"9 _LJe#Յ;e'38-CAYT\QęA!"-D~b#\B.0_ N-Z.lT)R2/>ݛ|CLo$zr b^P!P!m pCG&ey%#pc{CrXZZsWiKcD@p`q|Y۲L ֩ q#Єi1'@\|O7^zF@V'>~X7/?;k1*D%i#R ou[" CGdnSQI=}$O*ϑ|%x꽹3ĞVc&$#eH^U*L 0|Kg䁚%X0~{)<tIQW_72NPt.~׎}8C524o"t!f_mq5nh|OaQ qڅM2&ԑ Uw7sUrryvV󐽭W_qRm}c5)1zatfOũǹ `Zx7>BQV2Jd7$7Ň_!gV%E'nnwS d\$lSr h%f$}qAP0?hퟱG3~mCNjXމhǕںz-jÒa8:V~4j e~RI`Þ6±5]\"ęs8ЇY`ٴNP]BѴ3-~തPHAM8(~ J$4l0T #bn# p v >"Q:]|/hHmh e!aEgMcє~qu;ıCLM%Z[:vHI;$8GIѳY}`.XM?"L Dk" DkQkyFun]y^;uZ}y.?VTOKRpxW]]ujUavO5!=I @o),/Kء:ө8} S-i%I!AJ,Jn}]n_*.FdLh 2bwdӻ *zK ;fnv/e임 DLs \kR}`?}S?SFmuDTIeLj=KjAjhA|%#Ghz AB e^\a56FcŲ|.v8 {?]XѰ+ J-_"AN%/o|o5yu5v62Vj?o8Zp3v πduيzL[U[{1d9}j6cmB_FIl=B?7fXK|[PK[1* PKy.FDangular-1.3.9/docs/components/google-code-prettify-1.0.1/README.htmlZmSί8Ufұ̀;Hi@Sgm-U+]@ovcKڳY;zx27-h뛳Cqi0.Ż3꽠Z6w)U?GeU{q|ssӻz_|o_nai/uilldi|u+tOu+G#jj\>uݏ"/(udQFFf~9}b]Ym(k $V\.%د`«{z&џ4U$/=%% e[ʶo^v76zuM2/*p{ cCP^,J_G٠K

    .Anߙ4ϼɂIL7P^N&1%,/j< ^]%&$5[U?B@>Cz x}a5؞o>.wY&ޓ;︪qf\>B h at 95f6{ɾVM+אY8׭AG\u K""%549jhT{Uݒ5EғW^W*Ma=ڮnQR) [%UПU3,Ʊֱ&PJ!g ӳzMY!X8^qeCH$eg_l]y4ҀuiĸxBP=e!$Q87o(NLۗԠwXBoB , YoI nƼք/]p63MVɌȥ.J׹.Sqҡ zl֡_:S>yKIiBF͘p'}|\ bzC QBByßEi, \QmLgd\ѝ*:\:1#-I%3M8]жNǪ)xzKt mu(ɇ*a=ȗΈ nr{z ?*}?^5+?yϊ|)Ea#g 0U3R5s#V[T_5k|7fvؽMY: dj;jb+u7\q0x$OIܳkXt|{s*7p:Ot b¢.}HPTyܛ;}H^ GA2>/^ $n^mRLjE96smX,tM]2L[8(i_OWZ`p_n@He(p xgݰw?P.-yaow;0~2t[F!~)Ȳd97?"+[ raNyh#=Yh; ;22$PEU_!Ƶ"r !C%RnoٱJ\V^/*@N(FMe7q1949RMҼI -p.z u%bz匦u ?DB@U>g; wǹ п{``3/( -a 1&Vm>=T-qZ&N/9>A=EAeHa/qE "#So2]3Kg> ,'l#΀'{[\"u9-|V7 8cw 8ݩiaaFWRø?UD 1or]zY ,?jAhsJ]ṁ5L)mDJ+Sg֝XW/+"D(ιk6t6d>6辗:k3rBlGEᩦ Mpg>pzaÿP{9ȓ]:y=h4i~GdzlsJ߮zC6nkxlo{[[$ܥ0I9EwÔ'PK8李 %PKy.FBangular-1.3.9/docs/components/google-code-prettify-1.0.1/README.mdTMo0 =G@ 8Ra.- ZtaUi[,GIZ`zLTiWe/ĥ{hzڀ2RJK ޷YV賜]t:,4&~PKdklPK y.F=angular-1.3.9/docs/components/google-code-prettify-1.0.1/src/PKy.FKangular-1.3.9/docs/components/google-code-prettify-1.0.1/src/lang-apollo.jsVms8_7CNnxblbb_J߮@3w7 KVg}5 tɢS$)\˥̻'P&AdB[JdGis8%nD*6i K$-%rxb 5t#Qi!$ӑ>nXm }9Q@Ei+*4k֞\L ݮQnxh[ 1QK#Bzb{DÆ!XH,Vy Z]'*`*߹Sl++z@Ѽ rMz5}? Qyꢯ۝Υ TwQtzߦF%"S>q5gMߨ}4*ޫv\Ag5wG~:28J;:9d@xblڭ ~i\a8U51?,:KJrwK:NJZ̶%c T^>;=,ppS"cbMLNh*^/>tE;ӳ7z^{I6[QnX<8w.SSntL_Z,6G&VW1 mbZU Qjmk)V&nN?PKe : PKy.FHangular-1.3.9/docs/components/google-code-prettify-1.0.1/src/lang-clj.jsuV]s6|j:#˕8o͇qM9#)͸܁IHC Zf-&A;(:::#zDj'U=}rrBoYeF:9R^}Y/NЩגHhfNMO!/4Ss6Q6$m<R|HdIiJ&ϔЉৱH躱anr yIfo@_kgQnE@|l*x\t9:O/@3YPVt[ȁ*-Kbe%a[ҫ>9[a%CMVIk! MF6}6i4{{qFp<]LjBWףji8w>IPȇrN9%wD-U+I+s/FDKQ0eH(/|Qtp5청{%w"W`:Av069]ae:23,>hN"мW. BHKGzs yB@C‚Z^>%pe'*shrypSbˡT^DXvKjdR D"AN yn,M-gbY>x-xAK f?1}#[mV8vdHSvĒH4>rklZJC&FvK6)ΰkc1JV%0TO6 Ó'Ol ” "1:):)! ݐXxEt{j^Z[|i:E|hl\vN[i{@8%8VmQ }ϼ1~W"PCw[eVC00wmS,ۺF+Spy)m'y<,E.koc =JgBŰQZmD1lm5na5/~,Sp@j/lwvD|'D8pל0 Lt|~X/!>ϧH@Wkp4ńCc[O}RS08t۬Myn+Zd4~ĝógNj*籋>Ɲcbgn/) DLc3E-wן&[h rYe* WVK]e䕕(ʯVޖai`j#kxmP8PIN~{#j Ch#Wi Fa{ɳwUZn+< f %[k׭x1- r1KZ*}yV'.o #;Zfā-N2,W팿 ˦G:XJ 0[ϭŷ/y62U =vĝ讻OPK}E PKy.FHangular-1.3.9/docs/components/google-code-prettify-1.0.1/src/lang-css.jsXksH_JOul'aƱl*HX閌a{[&UT*u>9!PY.t"4"-@ΗOi<K,X.@|wy鴠2ϳמZ=fE.]/F=x]>1¨_ ml-d9\0 ^d6+ij=+GI+}w&p.48b$oxx}_?gmW( Qদts7R`bf*s dQȅ^LX[*!X2K[0E:88:gT[tՊ.ܪrn^K4ys>`E@Py7WA .#ޏ?\ 1^DdE)Ld, rh%a_MZgF'9{ m{~upYW^z #X2#1RK;DY{ 8,x+XIl1*HM;^&}B )L2sLɌqE,uxndsyRvZ`Y!.x-d[I !Am HwiJt\(SɯEJ)&sq@!!VL%#X!J9!F0|3+I^AaU&Us"MJa􅸦®Y\XJ1ȁL$ `dJ"4eYdYi]|hA`\եzP9n (AK, g쏗&-v?5 _tE֔W6JU,H1o-fC9Z$(:##T[C\b}T 䄊h ăXE̤HⱝD"oy ((SX@tPoYWѵX)Sh %y6+V Zʩ`R 8S-Is { e4fgFB z:`gfҰ`zLA X4EX,׫J{eׁ^i'; G7nML`~F!k~ AlqY8LQcYdO"HؤHr1cC_Q1Bb@RlvaB@<°w/TL(I3e^<`JIkg|u-@yJ:c!(~\8S#>OYl/F$ 7C1Ъ MCx\%ܞRͰ|\(ɧR29Hgԫ>'k7{X'e?.`sK؀H5LR4PN<1e[Z$t@׍Shc2Ҕj+(S$V.A(L- KM<C,$됊9%#&1VHh$v]/_I nLxT]'~r)3vCsT$`(Yn;7s$ "Ȫ)I}-`2C:Fl1nG<7^Dщ,8io 9vtwNǾWXS33ZFp͙VPAwxIsQ=Dg6uwV7pQ8y!h' iL7clYS*SEP\6 }t&jtGt:bXoM#D]4Bg;N9(LQ+QUt'6iP=h ToMg&PͰ^Z@l{OsY)!F#l;Tf<:Z@bh摙#=qDQ/wQW*4&! :d@\+AxVM~y9Q 65d$Xʠ@GUK!I 2h<`[{τzs9^5e"7~ϧ"Y_lNkn[?~Zqb1;̼ N,fe(4͙9,V3b#ԍNpyu;tWlR*ـw 9  T #d/[(MZ[SWmbemx߫xI cO5RV&98.9Í]?Kb_pq5&j_ߙ|L;~…δk#rOR IxIUH5!kH,)iaQ%ӌ-PbDR 5bJK6ie0o.@jw q~{579^M}w4&1 Gp2&-H&ޥF0F1?$ 8oUJC`!bqK%Lj rŔMBDG1<$RxfZetmF4FNP%_K4 S"uǮ h:s VyȑknA/xEVGiNdkϚ+n,hy磋 +ML%O."dI9.B&xLID'wD&DWU*O%܎~uFh㥇k^HߐL/ w+T=<ې\)29'+y3<[#Ec" ^ٳqVMȷ#5DGޟ; 6}w#3Ǐ8X՟AyqFf?j~0PK~Ar PKy.FGangular-1.3.9/docs/components/google-code-prettify-1.0.1/src/lang-go.jsVao6_q(v]+Ǯp-u;]QXNCKDD"5b ?~$9q/3[ґw=% ̔;ـN??IsI3{a?PN&TDZi)bt#SFxA p;S$r(G[sC,KOJSl2WBǒj. #]6;2Å$|y_ úǢA<66 ^@sYo,*H@ &cIV" J#rfka%CMVm*B @ԟ.irq/߮tίgK\zv9g߳IPqCiTLL9+e*Fi:D*)5jTDr,!P^s3U2B\!P:(*EQd/{jn{GףKVW\HjMT9<ߐ`U ak$V$Xի\*NgJM .ru,A!^'@DBq8~{aLrD7tqsf8\4D ߜDȐrf* MFcM0:%K2Oe2jIU! ӵ6I:W[;n1JF0y+E]S DP+ 5tcCHwW BL([v,H!aXBɔ:| "O-j*)B 8t܅sY'*M pS,K²(JW-\f<6b 1(y2\3x߯L#c4d-tfy7"72I[شŏ^.MoQQOoB=.^hOS>>~V*E2<CD$0>f4/fpuWjo?h~O? 08dN:8|0X<'b%4*q=Z%׹0VS$E.,n1A:88Sl ^ }YqZ#D\9zb"LI0vf0抒hOdr@)Z.  h| (+% !(F̲ $>oɌ9mEa@"a]/N`!k55bl@@y pZ;3LUJfJI6b`B),';4֠'&/r'sΖIr\4q$O980\_*mZPSnfJ%ӆ0UIs˂aY3LƳ^^2#)e(0_t>0 2mNe\阡,0^UZ%TX|k(; E$:MOhGys >Q7Ziu9_oz4}) 3ٮ[\F-AW&nan&]jSf0t[ I19̶RI0EL6BoT u{ֺЃ..JUT? c $SEXg1gh>b0CDx6pHz*{ư,+7^O#=ch[:o5_zVa[*hz)Ypn6dbm_4wޘ~4̥3& +.g9T"\xpp}u'XWVǽmS|M‰,|U=.m; PTR ^.w,mEt:i[D_z~uyy1#c޾YF:*GboyדxoHC0:;;GAU5R[+inWnt:)2 hmoӟ^(hhq0-O'8:~NIx`K:Y4>ulU,R)_򮫢__+WZT0z%D3[gZ%o2e5MKTg߱4P+p¼l !k]k=*VVZkm\' ƃR Zm ~lqB2/nF'8saqң(KM!YV4n%c 5' t,nC픴CiS1d%mRCOt!iAؓID Za eH $JPVMOЗ&Frd{Jק$\8=v;ajcO|ro2ί@I ő2TNUK`LjBP3q!bIqz/#ʤMTe0bHZ% W-=XVz-k-GWr 3#'P vkͤC8Z,>"RΩ~wA .K'GF W!X2vs";ɞ)"_UUHgɞ!Bs>Fj3a ߆Orq FѰNMGSKz- Ay;I!8JVlAJ}-Npڰ9R89gAˉI{0òr+('s:h%4i2O;AYnoߍ.sOкOe?BEirWߊ)SYVHlRhZ.q8`xƻ={o㴼۾st{[ށw:q5RL' n#X(6H ' ʈA蚵'jx^ue+^ 'H_l.W]ԹNj]Jւ0uaB%,ʔHХQ WXSgq, `vU#cdy[f14 H_PBajWQPA7ջЪwOj:/fɣ.Bu烀y[w\ޡ6׽..X}S3\}:w'}VڔgwU\[5_xq~//_E1$z&Dq2RQ R&h+m'Y #w.9o8.6g\ SxQ9 Dp*PF$E^j%MBbg+5_2.q\";(*-|E#k;Gzcn{7ޞl49',]) gk!Khtr) +|Z/_JKjjV#ж~I#N#7Qof!_zc;vH z}މnZ-ᤴnDa":]IT̼s⑬E$+nuP0eʕz NNNVDk-KzT!́ ~ߵX Yu[>޶Ż3P8ܦwHbao$G#pc4-V9v#ey`A&N[:E*ϬJ--\J,|Ͼ_{˗[E^/|ɼ"zKlNN> ' ؘܘprbIzVdwaRoX(OLDLIT%@=Y,ah!0o𵟆>v{ƴ&MlE^NEma* 4IT:SP)vI1"} Nu ]±gq÷<:irǛzݝ_Rٱޘȋ~Neܘ.0O[X?7A3 6#u`;arWE|;d zWr- 3kWګ v\`C r,[9&͉l4>`M|ŧq< q<]<6vYoraxrihL88 "y`p;0yުӷլr1Qz7CV`+<=¹ӈ~P >xMl!Aub@{؉·< 7HǑ"$ÐR&Th5A!-n&+Q}hM}EN0!Bule 8 2hp4lz8|ȥO!|F6EZi y"BkdL&BQ ȗBi#[T"T :6 [X~]Rz|VG(X4,yr"8Zf`-k#xbN̓*EpJ6=7Ȯ f:j= P+S+a޹.fT& e$ Zbƅ( nI"AIcRR@a#lGe=gRԌgGWG\9X D "y] Dgدs_<(XW9 ojA7'r5SyM:q,WMtisUe8WW.ΦWS E`!&M s +OKO]H$w4݈LܔI#s \7nPKϡQ PKy.FFangular-1.3.9/docs/components/google-code-prettify-1.0.1/src/lang-n.jsVms7_9؜'ml-S{' CCJ:wguRl$q>잒|krY?|^Ҭ}K Jz.-+zH15;카Nuh5[ ؚŖiY$t(*LnR{Y:T~Uiaf^฀@ef{ ߀fYy?N,B5vd?.蟝FG@H]L:ǬP϶L@fd2{*9𥰒ΕV Ng\= ZZި?:$%/_.Eo8 9Xo<;d!Cr&`* WI}2U 5,RV#KVpN2P _=zK$%kSJ-)UCDH@ Z3`3ki0X$٤P{ʀ( >pESbc²-; 0 3dHOW!̈́sa.fr) R oAn^ PZd6D|:,@1R]P z\Xd%yɰ.<,hlJES@j.C.X;ܪ[[e 1'E'Rb"nO ֔$m f Dí[A3\(WR`/߳8KT#[&7 BT\D j`O̤7U4ٗY3T+(LSU _ o H]$EyU2GO$ڊ(_jJGIQE ʠ6W\=gք] ߌhzȒ'yasq4pލ< u Vx!#]X96)$F2ĻŜEbNdT !:[\@mb|w E?py8|; (ь[,W?wk!-ފwk[bcb6ytZI?E?S6/ہ''1ѴCI;IUlO?m蝴$|H{M'͓t/.({a7ADčXmGF׌9Eqʏw&dbfdaE+aѭSF4:̠|BOUBUQVT/jI}֨98(]ERNNzG*4ߩ^s}?ju Uc+AXϤ}rxۡ -I3zѺQ#Tf L42>*U|B +;qc!7̲-\ʭ1`V0Bt8?T&Nv{بn?< qSԍdՍN-5.xDUlGX?|ŗ_}ͷ߁1?wzp6fTuxɻN[w>HՐQ0":4l.KPK@) PKy.FJangular-1.3.9/docs/components/google-code-prettify-1.0.1/src/lang-proto.jsmT]o6}Hdg9[7t㤫)lwEeM]D(Gea,x)Zð$s9rz`%fL -sJ&O۴š$mV;BU9yL0(UבHH2)LӺO2ܦXS*K<ŕM3*ܓ jǛ}H,N즍${︳yu*O*ͦ7F.f\OC+ÎfhzDTWuåJHTFV$#'iǛޠ0hQ_ɞk+} ƧմmX+M2ԱaU\ydAV;-XP ׹b6=B9Ŝn ݄g S7Nj .b6a'fY,i[ca|_WrRrvxP)!p͟au.LӠ 4uZ7a_3PKbJ PKy.FJangular-1.3.9/docs/components/google-code-prettify-1.0.1/src/lang-scala.jsVmsF_qne&~iU$LnJ>-w'cK{౧3eN}v!i|R&/;/:m.#FI>r|ɀ,lNdQ+F܌XJIiB^;(JQ~mLlҜtCT\2,8eiE&!#kVҊABnJLQS6$]*J|VJe^۴@N҉Hg? ǽPIIsgB3 X#& t)d*5ׂ+,D s.\=JZ A HMHF~wq؟h'ޘ\?_?h8!&&l^nLw# ͻX%Ay1zIbj{X(H% GG1TjHj:ejwum[AHeI--n_uɳu`?k}bO3J W:zzja=(̥^F{јP1|reRtDlt\XLZ''&Ѫ3L5CzDKF#lWHHV{BWT[o8?{6ORL`,2&\3Gs&:N砡m1tM#^^F.^6ik[ )S~0{b-34fwt$&q5UcǷAKPdݳ~:KשzIޙBv]`7ֽi }Onh߁O{;M=ɴ7PKl#1 PKy.FHangular-1.3.9/docs/components/google-code-prettify-1.0.1/src/lang-sql.jsmWksH_Em:;5IvfYj@k!==@\ Ac!=犇Iv(nsn4fEU.~zi%yBev4I.L2cJ2}##-v/gUn;BI526PVI,e[excbTs1XlY1$ƊPoes$(/hV?vp M$kV-EFFVwÀtӝ>s=fitYb!8urQqK0qz7r=Gs,Kl~YFf( Hq QT]ob8Bk6/X}ؒR'*ANZl Єbw0qeAJ2iy\.$SE=:UXX?l V2a؏S $iX•I3okիv,J i;\"44L AfNOd?|̒ΪXyb}&r2Z@tIgͳAvh2i9;Dӄy_/׍7?䅘P0t[}yˍw'X ֋mlA!8(_.֥?/".jCo\!>MLBPiWi¸F-FY #ygL6->mI1I&+Œ2[~֍o`_gO9dַ2E&g˸q@l?G0~YNFzc Im2ɤhT}U?uGo6Y6ק3?Ӯ*u`@z(Vja_ݦl![p"8 QKQAtI;,N/À vgdTmO?m~DSh43ؑ;8r=dF7M6~yTph5b?uխn܅Cu{x0;6~T&EwrZN ۥn;bn*mrm[:8x ,Lwðu( [a;wªq=8Z>憞Y ;kyg~E]Oaӄ+0k-QC;@mpPG@FónᚩL7$L*3 빍pD{}o+чy00@ō vT,w#Zq種=]nytCU=:2QB_'k}6Lkyj?!\Zsժ;8l mqw\e::^+n+kq79nr p[|;nA%cժTT͇"l" nTBzjȱLa+u7+jY>9iU B vp>tlVE*qգ"hjs&T砺wAg"(nhBˤBD~tC0sx#طa`#G.2 Y _H~^coUy#FCDz`4 DJ_BD9tnDMDHpX%.Ua }n`Wn#B̍?tYT# $i\~{=.Es|\p!JT%:b)õq!FqQ%?|FNXiy`g O}@_u73֧?PKŒ*O PKy.FHangular-1.3.9/docs/components/google-code-prettify-1.0.1/src/lang-tex.jsUms6ίءMy ƹ|h;׻K\B'i&9[Ir;߻2vjyVv]|21cpnuCC!bT`/g}T;Re6^m[Y@6 B#n ߀dX%ܠ&Cqٷ9'vl@ wEvqL$ 0'dq;1n_7f|?*aX}~oM`Ǫ"@dΗ"䂖Kn#1fߑO 5 %yfjJ@>W,:~ !`ٺle4edYht߷wu%Qd ɐB^XJsYlhh&=E?TX\ Wono]}oHlZo67yͲOy!"S7=w 27ER{ʟ6$%َD ./Ԭ G"Lu58=;yp7+nܴ{ {o _p:/@H/8 aSzxcoVAlƘ?ڟ+22NBwxm?s!X|JwHBf&څURT]b 4wTxZ2W2íEba ?" ŵSIMg*3C[k]{ Zpp!pveО Kʉ{UA6;DoP:BREtTIЉ B la2!Rph']<8:jԡ^;J4Jc.鰀$pP@=A㞾~qȸWO6Uӆ DQ7\ Ė6BArotO!>#:5N0OnQfngE6C]x9 = @Oa|JGa`*ֲp3k6\JXnM+^F0%v2ክ-snc_ľ26A7muUUu,:Bt|$?_enj* OT},]grutnPVB}*l'힝M=&1D3NNdUb(v>mzE9D&^xr2 FfϋE:,6ӥRmx&n' q~m6K6U`>KXQobO!޻wyL95:fW>s<ڵYfM\eXʋ(XTLp&cJjB?wwh~{y g6qǓ᧏)F*'(@2H\I^)BC X'^: J'hjZ)|I* VeA ڑoFzt&ץN !Ne^ vswxȌ;nOhgG~DOYZhjF&Ŧ"%@o&NrƔdA"%W=PSl)X&%!Ѣ9҈AP4 <,L-{@mM<)mIDꃪ9_Gh1"H0 Ɗ6d*e+G@I!9cZP Z~+Aj^l-.5G)ZO #Q_m|=*6m&.c~͈#6"J&ho1i:|F k sEY*|5u(Ug}d.\,{ʬeq>n~&ɷO3S_Q.|R0뇣k*tB𚮧/͡`D). GA?|8kU-" S襇?8}~ԟC~(݁yԈ+nYAFVp7%a@z RW_@[H#4zN=¸}3\̞xmx'^48fmH8nO5 gb/8IҦx\7ON~wzĆEnȬ؎b|kR?=?s 7'^`;:, tgH6m|*b5Tz٢C&xBuX64 >"j,S*U~xe4 =3!6}PoZn>-ޤ ﶚ}&wN#PM!S+Ƃ;phs{}'Y˷ɏEw~2|U$6O%~ (G޴E]%>~< }C'Vq.;&U%6GE2OeJn_Y̓J;VcQ_w3z&YgL'q&?yi_tЬ3 @lY:y~积~J~|~~H~|ӗϟN{|o_<%rI)C^~MmH>OGՙ̸iR5jUOfkZ_9kl4_@kxveIɳ.M_y$x#dL%YR>Bi (ޠG?/?z4,I]Wq(e(+_OhɦKjyM*z C r,1ڟ`jMf1j:o+qnr( +Z -˺e۬&3Od)|ݷ>{yayW|8E6_(_O?zsa:٦G?ztë{0C\#8y5d_È^Gr>c`U*:W=Y T+.7YX1+Lթ69 D=ȰؒZ'Ø]W%zH>XpG388C?_a0FyvgYr,͏7uQ=^}ÊU/,kyo6( r>o!ht1ÀzMҶn#~vHowe}]ycu94EvzF@/SK=UUyu_al؃^Uw} |,lźY׶0,~C>Cu,YV}lssŞpɬҺIE>5?&,~Jb8l_fmǿ:y9[cIэ7=$0h2F,h)߬{xy}rzPfPX7K.~٠gͷum9`߶C*_!=z_Ғ֠c/1Lp7!PHgk$gG|벆*`K@aI/^ +ahu]2?z߮BuIT8~e~粐bbR 96DmtTnW. 9{6 d=tZv/>eUFhh^ SLЦZ)Zzk)*>+`ۤ ot~Kzk,Քi^q[;15|mM#(RLld<88 Zɚ2n5jumS(Ov͉. u &p}]T̏ffE즂u5s,|o[wPr&Ar` '( B6EM{܆%) ktfRؙ!K/89G2`YƔyjUTPw7LmeSNp]ޙ8솃-iaT8rsa )[4l@s˹*5\6{&8%S9ɛ} ON:']˯#r?eiWCm͂9R8-.&GnvmAɱVNNBDn_m7z򰻛f498_nfXx~I9(+M ;r@+Ի`HH3V(e]ft NY팉Ġ?D7& #`˦Ƹ=չ _xZYQ~;lCy\+'ћ>ft;|78;V2e_3ZywJlGf0U݅ ZF#1p`1MK6c;ivZ5{ܸnd\Ƶe&s+S8B$d<bO"zvC@N2%ȓL;eJPi#<4nC$v&+tGIp4F uDR:B5>2,WnY~ܠ Pp  wuL&RxҀ&4Y}t06Px6l;q p>|8 5tm̨Xon%Cn)Kg)*I9ц Ԗ l8&`3f4*bB#o\EE/f Blh ތ[ -T+̥u ѭhDL%t_HؗI>TɌ,![7S @o]p7 ]D 0I[H${_ \3K-LV#x ?ǎ\GeqpraO8_FGk=M=nz6yj9`ԃ:ЁnuTmS q?mhE?Rwh:?.$qzJȤElkn_r݈dcK hDUČBZxZļ],B)=.i pG6`z4  ]"6)e &isFcZh{}W @@[SԎ@Xs\%b_ ,UE%\JejH%a:L/x-0!7Ɛ$R m Z4[ej**G3G"YK9[tW̸yPvQǵ!aakdt]-~\#dB{sV3AaN$me \ؔ0WI` P`1"X2X4Bx~?ڠ "٘bXc{5ZQŕh#C3N<%Hb@" NqaE]WoJz83lj oҙ.>y3P Z8;`2PmV<=~\@ l!I=+ j4 G<2cͻ.nU- e%3aw;q#"-_ \Y0Np^'!Qve.#@bʹ(O#m.ͅ;F=O',5Ѱ9aJ~21XZpqhݸ$ ˮz? X "QJ4v7ABmM*IO烙FL%"%̕->1!Bjqg)Άv3g9NMcgߦnRjM88^ĀpjC𸟽^k@_F2fUsתr葒La@8N0j./̋;;&yrhWX%^(myIR{̞]vr(umL2{/l3OJ"Âr=a'vtk|~[pXVB%/$%"vȸ5qsWx%v"5̡ba/&*"T2EU$lD [#xZ`\>0iO BE"vyǧn| A{~[>` !Xм.܎|~2.vTb)&#c,#JbCIٜk6+Jtw?:7XCaC%VD+ @ -%>`>"3Z{曹c[͝|VYn?pH9ňxgH jjqR %ܡs6*9dy*_R,]WrȬh9U7/ߘ1ƪvm7RHpL'ҤBgPLaVReZxD*=mOp5 # ]|0xODi4z,b#I?nthLi=nT2e)>5YEg0 bDL@>qT>!s񞄍}bPy19DwZZ& KPP r432zS 伋zL#,k64~Ʉܜ 4 c6-ihMM(NyK-Lʔ91݇[+.m54SpN/uhwiAء%UY-ZJIIXA {a1WFyT"'/G"CE- pr 4@{})i>F_ BB#aڃPGP a3 )(H oa,1~G>&sy磜 dl< }mLCǧJܼ&z,p˰_#ܵkak@.XGVqel tcWzPK?yɐGPKy.FIangular-1.3.9/docs/components/google-code-prettify-1.0.1/src/prettify.cssuTn0+-%u]ACPVfLc.q鴾9pn +GMߞ:8(ʑ X=drs ~iɰO0' i{tu '(ՠ @ku+^$Q`zHN!Ʌ @ٕ7o7e?TZÒV-ݡ+2 x˸nyJ%^8-))#Y/"jأ3:>GdeAJn;jm/)Tv_9/H Mخ.vP\2㑥g#K`U^uJ{,ZRʹFs(]s }Ƽ|(.i ASqQnت͖\CπHN֥g䯏͂J >Qb6^{ o8SZr:᢮32(F<3)Š83_%#$w I3xRd (/\Bڎ5 {*0AF^ m3xUW˥UNr|HǴ,)-KVlgQ `7+0V} T ʋ[ -y9IY748qdPK;2<"PKy.FHangular-1.3.9/docs/components/google-code-prettify-1.0.1/src/prettify.jsŝC[_qJ4M& }<]!@TSwf= s"ٙf3 oF݋IV^?zࢗgM?;ٴG2϶6M#K>wڣKq3fW?dq8;N'YW^ouwri($k18(ޢ&$ d2|l^__ {;/wV:l}㳛5v \{l0Zwu'E#'׭Q.T;d=N*D zZa{}u{_v~zQˣݝAݣW/C|rH#4"g1y1`9{|aVuk=|o{]56\3LnEMj{rr[n  Gvz7@^kD`b<0XVv9ϟ.0_UJf7'im`g5@KFeXcO.[ݢ߁`:jkY5n{5jH r0um&*}۽iGdnٟ[Zlfr97[FvOG/|fۇ^vuyz 1N q6l0?g7iߊo]<5ӳ@|kd>vKnyu2jdA>׼1ëV7i6/j6o^ٯdPEjjwbov-U~OAh}SAV~qHŻnKwƗNlr3̟.MPޟ.eQRsؚ\6'fQ)M/&,:PNn1@} 9FB&<}S"i೏60Ѥu1$5cFN[o{"if{6iƃ.AThx7j`(:Оӱig] FnV/{=w^<Oh|6fڨ?帘rLàmI' P&|vMZ6m8@'2YꇺZ&/ f5p=h.҉dsT͒FNGH-m<w~ᇙ!{-Ej5!nL+2$ӥḓzGi> V2LcFk%_]A{5T'4Qmr5KlD";kȊ0T\0#'эt<VZ%}*m"Oœ)Y>L2|X6zۿOJea&crC\3TVu'K|]Z6cyoy5t-Di [!?_Uohڊ0Ŝ:[4N؜Ztkc/+|7d?gc6N\c<( &zk"f nK.Ykf Tk޵FtzէO,*D}ͪY,e/>a't1~Nr:gb3'F>v L2e|_ 6Pb4Q 3ZLlqA!dt r,Ӏ1Z0nlx}ZC v0)uǘd0}&s C& /ꇽW{_;Cyt6[o2mi 9РyÉ`KmW@,XjM'FekPht6 `L5嘖 l yoTz1 Xӌ 蟏Icܽ\"8n@ibM!Nۍi_` ƻJ^xeeK4 C|B( ϯf~XI spՌ ƃU8B};_5Zﻃ`Kc8հUkC!КlDrߺ궽ht;[[;i7oSWӉְ co^o81ʦ%އ s}Q7 '9H+LR}vc:F4uGi3+$_id)5*~솶īZm{77z ء ȧ0@7[,jl=96(aځcc4s٣ß|R$k.ָq&d eC tŎq45 jѺahy=UQ9.N C#?D YlD- “yt4d#h>bI@#lpK3CuύJL&ԝ1BK ShLM03G)nhqL$P|w1~IY i5PFD]n-ǔFd|E:hlp0lH7qy93ej%ړP]7nR>>?J;u=s"7ucPF16nM7PSFMn_&ʤDj2ڴՙ^ 5w1k4ྂ3PB`YΣal2 8BUG|b> Rpc.PoCChԺ $~ݗ BZuYƝ,X ߸tpbACl(j0RD&I6)VDgOoPh-6Vy8ҭ>H,D^Epn'oIW܌eH`4f8UW_oi|]{p;[K;-7}fy|5~[7#7~eAy[f b,ߞu'>ݬ#fH.t.5J bl,< +g"&cVDh6}\P, K fv_HkԩB`>xם2CkJ<@J@YXA( ~ TF@T|b-[m Z]Iؽݣ=5jlYijN0xo+\}i{H18/{AmsQ~ 㡝S L\,[5t6|g{oMlt:Ž}ymkiMBmohn^:B r5њp7L mekȻ!J|x:lMpCMPO >Ewm֚ ZvW/m{45"=Js )L/_mznh% ֖@`o@#VkmE:bOmSnLWZ%k!Ϛx>~_>jf,^e%7#&1fML-G[á2ʯXit1o0ޖ+ۆ6O\ ([q7 7{Gq3nJQp6< [&YdZiǭgV6-n}tj%z֞_בbL?8_>9?6˹'p3pZ0^a¦%6 93Q] NG7l{M|Eʹtقi{IAVi-׶-OD&M0jL`Z_qOtetm?p*k)N 7=$ZW_=>յ+ fZ+z%,KQMQpfT}Τ y?xI@x:7ez5Q$~64 D(  ƙ^wCvp_^(`ƖN(+E6PܬW cC _KVo^[[k.ALWi\o8 i}[Zhm8l4Qt 3(?Wf]I}ldi1/%>PkWg}z\w{Q]< ﱛi AGoKfPNwN]K@9>Bzybr-o6 tV(~ܵ5ckeeU\6v4c&bǭ6kX6-+*j1<9?Zz~ˏ(yzymdr SfNȫMW03()5٨ ~K"9kg'ٟw67ů>onG[@PT8ٷ0A`K HUI Ck.Է&G ~icV! e%,(Dv4CE"+9qz__k.6z KgyjD056Y)b2)۰ON=t5fk6o }7ӧBMCPv?*PxAb?U =)>qo1JWctQC^Ą.QoH_gus!6{VuQ HLQv 0󮃁3J ũSy۬`t 5`u&LڠUa|OhSkXIkiEx 枯ԝew9T%YT)z^82j= ZCD]Jl{s&[qBPiplSl"+T>V?ISm3-S+V8xD`kZ)#yC|&'NUJER-0X;;#hmU}/%3,>H2mZY]f1ggI ]GsL_[{_Wd/gF#= |7_w*<.Afoæ,~K t|zi#;}?౾7{GY ֿ>= dQd$l3i81W3>mV?;^?xSZA,a9X3jm U[Ѡ\5㢣p}c%%=rEBS7O}suE{5% Xr%&" @ukU(ULk/ҮkSBgTJ#Djra.hPNkwK.N'p:@_W {bH X܏c=b0]lJ fZ kD~>NA+u앚_`C1{~M7}ֽ*P|F鄎RUH¢mk 7 AuW5lci8Ɋ\NB"#AR2*Uꚴ_VLTADD럢g5)~yhR< {RuQCX3 ڱo73Sr']V |B(GTzHRI3)3ձP %MDQ B'yn6L`]`#)<T2`_; 4݆K:ˊKg3 A}=X/jzJ~"XiՖB1JqTXWEm82'VKѩ/ʐi3DGkӬggϼ+ͳg]sN> FJA #Ք/C웳,DF NiKBÂWOطʷ&KcpQ:_zaQ n>`ibW De.*)#e4bi cP0Quճ w* 9$!x(#;v:֜j&&v ڠ't:UKD:=(bAfA4f5yfk%<;,e!s,2`A;`Ycl*DQ Lt%T*ل$>$PrƵ0C9u.}0-Mq82P^ ,.Kh\#F5^(Jb{J?x@6Ƙ o'J$CШu(K2TM,T(xٟd|2:H;[n0 DأAWn9ǖsʽ2.8_14#ZY3{&Y[[b %h>)AX'/a~b~isfa_+_95֓o51!iBEAYrXO&o"AH1ڦ v6F,=)NiT΢#x'/T lc}h]Y|^ve jJ dJ X/%@~y!Q˘t`M*3r104og'It[,K^6ol)L^AB kqnqG܊|U0E3[]4^[gK+&X)آ̭NlE>>~4^8;e£a~b.i`AeBU::8C|+K?IǑ ?J6ZYDA /XIF;/'b< B? Gux}pGK7Ə(/F'6JTm p+`D(񛦬fh%PXY w6S0l`yE-bIș]H DXOi VެعHDdh{2Uz^l4Ul}󐅆N [28› ڨ"4Ŷ㗑DhT!WZS.x*V ^6by :(!F:Pb0:4c5q̈ȫJEvAOZ#/dZeӒ˴YIı@B`zfISpMꚘs3safmC[F=׉/K#~rZS #ܧ u.W TTF!~>@V$Fd/S89C'VqF({l/z|܏ Wq/dK/Xu$*38m9xs ?*x#-BLlA )J%HdB? NMu͈x<+(#OWtxiVo<93?ms\:͍|V_[\8H4mr4VW`POj7e{m4&B$e**Mqy?sȪ$&Y-%(#kl8^W$lĸЈr"{HԆβ9V<)K_WMsgv>ͣV.mp3jpc߮l&ReY{9^PWj 2N+5Gb#PL}JJ,`o4ՅD."\b4js1H1&U)BKf8V38+gV? 87 G*èATd%gŦyB3Ea 8b*`/4O!}v7a@צb QuEPq[%[)AqNgpt_Ob߇FTw(jBX!眹pB7J9̀!lYdm-^Fa+Z@[1YK,bu.XcOCKD'e]8VhӅTJ V‚ }:r8I}UK<-HYA}2`D'!.tzKIcMp*busCnRh'"a^V="&R$&t)v;ԫV\j;#ѷ՚17&޵4MUþ~Snj3/sΜ1꺿o&73K-jWqlC,Ae[sZy2X||\X=',~ǑZ!ݏV]ѱ厩߰Jcb}_{ƍnk6>tPPiYcȑح憛c.)ZR%`#:tU_ڊ*7nQͦ'-V%'e^h2}Rp=/η ?*w%<,.gC+]>۬ ~дri||ľHRK7WdX9|[ʶZ3#+C|DmadA)3"{@:VW rR|-$p  @Ut@wt-טmZ5&/бBI4waekBPJ(-bЈ |6-BHm w'#t E9&J[eWtSU\`VT&&E^0ÈE[:i1p F17_Yp| ;~UL HA?(5HŠ`̒;2'j)gK;\QGC^9y@)ɡ0=)LmJUEU擑Kv^>NX+ ۄQ9ƯVMub?V!M9}A\T0mūzX"; qd}2󴠫s{5%&g=ɼ1g04 1"gRd|gJkAw].ajn< #BvfA`@UCT[B{kr7g+rlj j8է:҂1HUD"Rr$羷,Ն`O$ߔN^jL'SE+Be( o)B13G4Efjlv=6IgEYY8l/D|8Ge5Fs pl/gG8d]]sp#O16ݓ_>+| m7؉,KWe+w/Ʈ%\3<4jKҜil DċoM$n|ڪ9q/ $F$J=R\S׎>1U#~ S;|vLaCoFj0\ryӱ؈ֈ@qiaCA^Dfzf=  |$ E"jHPtgۤ_Y  >ꙺ~wG~a6FٽNrm\'Ŝ~&hN*:.|:qJ0FZ:>pj"&NPPY\( rc]e|5g :^^l0ZOB\Qyc挼jׂT ;qyP[(Y41td0jZ jO./?79lBiRJnsn瞄+ɢ{ߤX2Un<% 7Yܢ-B$t)JA1x.-8*2n07woO<:>^=] ;1N.y~y;ޞ2Ȟ\?\~6T =5kAf(~ 4҄a(gG%NjD~쇛Ó]j'Ws]WJ<Y[=[%Xo8Ҍݖv`,V ,D.n.{s@Q {]96ʚqCqKB08WF¡*hq˦t9nBi-O0b$1!! T9+M_yJJMaF٘* CI17 @QX 1+Q&;U ːA(JGdT̴t]L) єOj3&'J+mJvW}ѿx_0YN8"+R{jVOSLW&R{PNKrkU ΂r)-7LtQhDJc&TZpPvOɧ Ek剤q#F7Ej:+ϻ;8Ca!+|}2^)usP%P`i!w2{i.`_GW}U,}E.E\+ed<# &2Tm\KbU%1ȩP ^۴:I7q~dE nI9Ƿ78`bil^V0¨ed>B_ F 80)Gϵabu$`qf-r!zxϿxv}hˉ=Ҭϳ ,هq*?BP+5˲L;?:vo<F\F"~^ODž&W}pfypEҪ.[U6CZٖa7.^xnMhFA] riŠŅɜXɨw[Ny9We`3#<˺U}]1bٮD/"n4bD7PULXeymTCnp8lԨ(neZF,h cA%ccSW#}B+ V+: ۇxz7d3BX.02¦V@x>ݐ<ÝQȢiup +&]CLRiB,kZ:C?f/-*MLeO/eyF ㈿/g3 kp-@|~)Gf7,ٱ]ù#7$ߧ+WpnOWLNJ oftDbӁQb-gPuCy[}t={Kq!u|gF%`jqr>Vnc>EqS~ LmN;cGfnAV4oЯ"Gk4J H*3hBթsڴ|$9Gm6V,,&m o(a'>eXy6J7_Fs݌r凕|vرTfw0g]i 'GKSO*0nfss%gdxW/D?Pd\mݷܾcgnSYf n~#6E Cht2 {U~켃jV,&V/&VW{j:f Rwt}aYL lzW(:#GlzL{:~ Ǯ. sj;$q 9HOdKjH?9.a&(7&zr{S>?)߉\d6~)J_͇UI7F8䨀sP'zZ ֞"b50u%'ؕΜE$igQV:<2d MgN4o95֬TI9ƱLϠaUg@~;3hݨ~)^Zhsl|J /SNQb+Gz]+1?2jФsq*QGVq͂fb4j'c.@n97dύY8p.+yr屄_8Mӵ'D}F10fNm*A_,]>+G/[`CDˡ*j-[Xe꯴cakQ \s0L5,mB#U!J$/i]50Y˻A"&-jmw 2"TD@J3ZZFd]4qm0:bXUߖ o[j ^;rTر_C<*qtY3H$SRFO~%:dBIL " + ժY9H>)BB62K1eM+|('娍X1IXPi $g? J{}kFl(|5ETw}jRe(@Gi'JZ>wL/$"IΒ8&? sAFB?"sY58@Y-8Tʱj:Q' >t8#Ƈy-li/EC%9 +8jE'bA h%M -gh#,ʥETr0U ۥgvgmz\$[/w:7,YT%_٫Eg^\zeNN*뎩qH0nA/Z"{-1k]0)EjNoin\w `j"0sDC*pz.JS?usg9U<__aA^>ٹ\7Z⌦ Uv9m:AMQZq {w\#pl~6F3jE'EdG |; >jx ϷyZ9AS)9oNH2Mb{U#jn?j]0(CΟ^v¥>r89׵\Sz{DHkH54 >WsJOTOCF8O^WUU6^`nJvMw&̔:ug#W-^8.IS=;qwOK᝘xNV\J& #,,Ycxj3cDe1 ?T' H24)5KU`Db,OY}W j:MyMP)k$yp^P)M]瞒0guͯTw,%RO(ڕ#&-ieEϻ*SՓ b S› 15Ҵ8b{MJDߓJTcD]] \r!6qm kܘj ,Q!Wb B*Ċ^*^1uV$~$J } jхY'bW̅,X|,;0ͥ}/EíFDTsi1D~A .Vre&Bkg8=ϴmD~4#I2^d\)sX ?ąehHcδ̦u;Z2g@K;25)msH<Ԉx<=La٭хG`XHN F6 ĒYl$P镋ntݐ 71|HG&UGP$e3@[芑._L?FzB}Ri_f#Əhpvic[ŶNϻy/ M+c{F.Ki #)]mdab WdF ~/LrKpPĒϰ[(| Q5t2Bv},f^G} ӈ]AHPT%Z"UDwGڝMf$s)h, SFnЗB 8s\"nZ0SN5 dv4Ҟ^IօUюZZV/R$%U]*N #:FzZ&z#jqp}_1ڕCq=]aY f]I4$lMq뗙}s)@+9pFI0{@4Yu4X'K-* ذỀD;5*D3O壽8Fv\ bmNܢ.aᅄ&仝ʟ ?~J+|g{o`hKSE?yeaAVWC˫' */?Y˅ݨTD0iEg IR!S{uotasAsẂJW~Qyqq[y6G轿 rEB٭R.zGXM3H NzI=Z^nP![^>~cZ l1kO(h[ 4!ԇ.c<@{OހMiiq ,G/'WGOW}|{!5ſ, JH?`OcI0=Ftc`7#ȞtecXKOf<8fD%šp;c!a2Ba*M\\Os糌rhٸѧ 8MF@8OuΛM/NdX%PN_nr"9]DwAl|iף^"]RXMW9Dzʥ흺6Oi`GhH/aS1CgPd>#glqGi>PlᇝXHH A!F Q>Mz@j _r g~!\1$d볿H3awS8 s69eN\_,noC~Z7`B |SgIWZB[Ρ_h/`p<~-1>U$~>܅+ c2+[5jQypvbME{ ^SzW^4.db9X@G܋Ǘ‡+CU8Ρ> #Nvy*nUNHj"o-ZME4c7 , sT;4YȆz O.8sS][x|"ac{ryЙrcbcxn4Dvh_2"4BC 12+]jܟ׿l]T /Zzo])&#`JC\Ptg7+cOp!#ZTT\1h?ϥt}zj۫O0Flf u\EhO_ŋlwKvI龝F=6[l8U~դ;Zl9սR('!&~!n`YzxQ7`vz=g GoŻ)՞wMbɿ_J]p>: Hآy lvTCƦد۟^5Du*vWtt*f'79!0f;Mr\ɯG$`ftXJALx:%wU4+0&UkxH]|rl8BlOcMo濓E΂yg8,v8 n^ pu#abA<;o쿯e+m/ƿ3 [q=r?4/O~{=<}NUY72"Qa3{nR֬޷ F)C!;g 8TXY)jAtO:݄n fܷP鎣uN39nm4w۩whXBZ͜heDݷِx:I< /[%€"fLtHhX}MWLJT DKU#m8\':z2_Cs/U[_55-VFu*jZ ZrVh#y8Z$qIFsC͞XzR09k]P BZ` $h/ D۶QZDg9-KIUaTXXC 퇋-#W[TIzQ zMmihʒIx8/ cқap`֢){s0ɽrݎO6ϴ(a7;j~kTՒhZAb9189èbǂ7[нk*įTJ{Cg1c}pFB2J"@)0y$ӨlkXسA>醓7O1kb6ز q6 GkدlӦ#H GDfMK^09LFv6>g^o„t)vPi?&(ͬ$BGҬYwֺC;YfgʟDA?.<}`(PKǽnAPKy.FJangular-1.3.9/docs/components/google-code-prettify-1.0.1/styles/desert.cssTn0?,[j8! (r%HAKڴ Гj'~p.?Ȃ) fK\y7TU!9i]1b_۱:|kUQS#*e̥ߖ2c2GZ.s@f^A(gMma!=mFWWhΜPki3m ~=EL֟_-pޅsphJ.ݨ0;/:QiF$G&*cCc} bʓf8~eѢJ/r~HorR- 7؆KF"nsU& QG\ۂ DcJ:P[)6NJ Pl6Istk~I'_fZ\H\ 8"ZFr;MnH/\ PK oPKy.FJangular-1.3.9/docs/components/google-code-prettify-1.0.1/styles/index.htmlVmo6_q IFb)ه_Im,n"Z-.4)/mHbKwy'M/+~{j,^fܿɲ7hXK ℓ||msbiɗŸLJn,֭%YbnؒW+O̴){SPZ,Yu XQ 3o܈ʍ3LFpPY-] G-7.gv6/Jt2( J,uӅ \/:{|ogOq!v!\6U}DQ Pl h _ꔀ~fˊ/2,TF\SdwoNHNnQ%r.i4UVj&ŕ} B( J.WCBPsȱdq=B"fά LI"H!Ft 6= ?y?sb 6pX3!k#CDÜ yʥ .$\UiF/opIz!$m'!}!l%CBI̢h-%װh=[Oقf0#h>MRs#9l>vZ^"ifALk ՘F2s- jKb7quvɸ7@ZkL*R Ղ(@:DuMJ!qm+w=RھxvE@/klf3˰q[ȷ,\: x13k1e*/ ^-Xz^ӾbYUqUm5j&R~rᨳ9O[)[yMX%Hd u3\0v"0:XdQW[LLIkh0n]XC`1i9mKH7Yxۘ# zVxiZa0gk`4ƛ t?_XGfM ?= mk;V*}׭|mhEn'4y豗,HTyq%?PK0 PKy.FTangular-1.3.9/docs/components/google-code-prettify-1.0.1/styles/sons-of-obsidian.cssSn0 ?ab%ir`8BeѰA0>ڜ1хH>t+n.Ѯa²ހq;;$Cbk2B4qѕ8Ps "-0vA(B[hKE4$<_^N(v 4- NOQytrN'G/O=lqO_ x,\" QC3%JXlfMdž`;94ȪC"CmBC&> WB4]Pld'\ݍCv.8RuB()C$K ìڊ0G@#}$L5 Z":dU +eɔH1scBcD$,O SX,lzpǎ")3jj86nA`rеf4n'GnR$`f\}C-CvI)ʁg0dvJ=()""kw }5QwgK6[捠|Ǟ[(:tVw}5PK;f<PKy.FLangular-1.3.9/docs/components/google-code-prettify-1.0.1/styles/sunburst.cssTn0 =7_A`إMu]z(0lwɒcͲdXr\ȿR,)b,Z{)-.vPBYv`l'/x"pr1[\oQimjc@;N3TE\gMxC[:Oof @Nr!]͹rp.ZhO7j٣ ޵ff.R]4G OL+H^reH7ڮ hʲG R؀Gs]?>x<5HqhS+Bt#p9OBl4GOm)烿5 v#*5 &vr9)Đp34Gt'=vnO|l:@H'/Zvu$삒պQ, vvoDyՄ$^Ii!ġ/A*q\i<$N"&Ft2!1ʘȼAfג3/&xu8I5U/-wՒ*=/!^.coA'2^:&5q'?}n&U55pI0PKs9PK y.F+angular-1.3.9/docs/components/jquery-2.1.1/PKy.F4angular-1.3.9/docs/components/jquery-2.1.1/jquery.js̽}[E*vgX$dB !lˎܒM&~P,;OϹO7{׮UyZ~Z뿟fo9}76ߍwgC~k1P'MM{uœhly|n~<_6n4xz6x 'hM'tf#8: /xM'ϛh2Us)OgK8<mk7?[|/֯\M4~sx4h{ Ymree|7'AssWӗ?;Ӽlt_Ȱz皯䰀w% glܖ1J۽74ᏣY,p8h~og٨st_[#5 |g~iCOxr0QwA Gv9hi/ ^2LWm79}9ck'Wͣl:7 XklY++4ltz6$ k+ft n]>εl ߢpdt01oFW&UфHԚ{uU0<}kO !mGf9Zz6xys:4qt[x gh;! u?4Sfӳ×IS#Ur8M۷oϷND/p6_|ŝx0=_l2g<?ċ+:boix{o9n`w+ 4x56gό s_s`C\ Ng3Xdal d^59۳;}zeP@B47``=\==d臆~p){,9y#te%hnsċ <קAt/ً"7ͯgS[x2> əzj>M^'{O 4y*ff萞 /uDH/g@&I\{L[>Sd6~?Dx6>n{#l=2gww;g=~.at%?d 7<Οt|<-_?j3}tP;õX]?G~&Fm $uWl8F'G>`;hO88?:~:A8h@oD4`*;&MkAE6X샕kmf+-B"t8;uN雲WVr7^W!Oi1`fK,2z$qaЉY~h xh(bs,zr!;wX:s JN5frvF=zp{(G4lzlebj޷>47iZ}~/r3\ 4Nc ŕ\ \t%f">& }Gh^m,->$@kjTaoGL>zp|ܒhv8r\L(/l{T]W7DsHgW ͂`.5ީx??s@ћ51 & } ZSR V&|t7:ӹ$OIoJwQp~.!Q$6B&Lp{/meEo0sÓevINd'۾^ժ | =K4r4quj6F4դ:Ljq*NahGor-W[v0kr2 ԩ_h?sxEfʯ<>ncFjvv..4HŽf0h6*w4ٯfu~}}kt(YLx %$Z IN`7QL|8:}9ݗmAdka֦1<37Ti~M׮JdX#,"c4֭1N/n4ٞē7's4!?IfؾRyu$z?`& @;SjcYJA31;E'؇fE"91hl:7[&0V%:~]әT1H|AT,ԗa`ey0.Wci[zKٖ߹Sg|t -8pph3jgRwdDߥM$֠2mtzb |;>J=Ow$\֌''!/Z&o~i\E k }^گhVY0Hܛ ʌm=:)o Pб& )^PKve쌤Uس^-Q嵹zYdÄT;w0!L\ؿbC mrؘ;#=ʧk[ LUs$$JÝ7>$%4꼄a̬ViGֈ!;и^X^=i]>}9qDiڬ>U5 ޏOҭ'ooMx!X` Cx<7 hʂx6BxY~v4!^^ai4tv匕V"ؓsu;)3~ccw@kRJl ]hQ!<_kOp 0A¢EQXIE_p@RL{Ë^* a|x[nNRrwg `5 6l WV'7 FĂ!'C^6$k}r`0ia Q;<2&v#9s;K_PxU§wee<4CYވl3*"ot…` Bn N#=Y QyK8&DjHZBSFW9w A.xLS`+]A%g(@H $71v/ڽf"Q=NEy4YT_ HNFmߏf1KB>^V),X1QpGpZ/S8Y=̞댫&plM_e8>uZagsc3ϻ%a%g]+:!( V^41S#N◼G!.[ ;ϒ_d3͉QrҢ9Ԑ|7QHxeecn9PM5W~3?=Af~mC[D7SPkqO ,&>? } `l(Jo3su^CaSP1. <8b=Bگ*X*Pks]xm5yeDj~-k C B7&c3lr!JuHDa& a½ţ|D/@w$-r 2z!T+nsDzUو!s%χKsc0 -^hTiUacT OoiNoHDpBj _bqAS (=fH,T X"N}ް j!\x2&#B,0^J>6C2}=a} -7ͻc6H>?M_#.52v;C3M٘ (q:SiqElJ tVұp7&p 4#i&g$ƒ8*|1YD< _cHNB!Ё"a5ϑ  c7k%$ 0u >S<oqUGS@ yYҝٶh9^w$BOb ^6y 6oF1-XpMg k8%\&<4)2M(Q-r-V1NZw(l7K4 e2}iYXB /*N2/Yzx.w ,<]p{{McٿۭCXA3q`dK VX ywv([ {9Jm!X_p%-~!?AL$>M(_a&M&O^<aaxs561]έ/9rrd|r7?<ǮxNMr~2AB'3uwᙲk &q|NƱʗrڇO&6=;<|[y *Cc'*z͜=,XPU:vDLG̕A=lv6 a߃iL,NWƀE/$/XaOTj34$A2GmỠGs,ADqO,:r;!9Ryޢ[OFo⓷b,22FzN4Jac çsD;ח2uF1cdï^=9?㐿K@GʧWVZ[7wvNwvf;;LD_Y@9G$Rosxyόv|z=ݔ2BCPƕ:B2̘}l*mhvo/Y1n:Cɭ Xr0[4Qc#.P%%XEU᫏`)"y~d<4topm.~I%?S7<7jYk?wwuvu7ZuLbξ?{{Ƿ-j)L'O^^[NoNOovzo ՆiowmgGDםaWs?eD& &LJLTi@!xņFr966MIٗ_}>š_Rl?ٷ<- g?vv+N~h8sR<$7tj Y?FLe ߂mqh=Pm<`ӻ&?X6ݺpђQ(vY^.%}rj膨ؔeז`~:{⏍;]\ہ˗2Bk'Q_Qo/Vj ɢ7_o^ YصDL*dJ,c;>~)$hzVwԞS;#uM/³)fg?0@cr2,i/l|kkGȦψ ^Yq@^?e@֮֝9; ; \i?Nsyz[hx&Fq_ld_$Ѧ/ycfsD[XYFntʳMqzEe{U&wCw5ӽ>cYb䂷W, agC"&e&Ai|ݱj[м(NWhv8ِL]E1']~R;o(px\3Ѵu '^eYRF{;gI:bG&DZ )jd꓇v¯ef*o .j8?n g9C5 -+AIWT+Ì.ew `jѱN2w.-e l04 Ѱ$`h v*zVv=,:߼y><|J& ^8[o)6 "Zݝ$" &ٶ ,y_@܁9"K66j%&ũyU]bh' u SVb|)_C(ei% WƜ_<#kЩ[MuN)ұ`St SYO`͆f\yzqa4Z4Y6N"qJS(2*(/-PDQ+αI) 1Ho{ajM/Ͳ|}){; EOf pZz)}R>G"݅VeGy,]ƯXލ8cSέ GZma xW|[ UEa',+g`+9|UM\@gNo0IH@Jf9EG9D./Q%=2~ͪ> yk}S<)(]ɩ,3KT˝\}%C?I4<%4oV暒j4EHg)Ft>µ#5gfoKo__Hs3vĥ(d$Ŷ$1h[e9<mzy#BlB}%Bx-mM8uܦY{TO (Gnp~D"^jQ 嬌}}nىjm)ZV 70Irm[`r|pq}KfFDK2 2ZRNM&PvE8mbe  鱻zRp3'H%FvHLT)\ESx!.*:dn(؞^Ps3t Sx̑۸'AE}mIP<{/l'c~4nbJU~Ѕbz eL*>dNXCR3$Kz> 3QPM&X$FR)ds;ֲ X% lr;̛ge 蝸 wnd.Ɋ61,V*w76wЫ6+~g^q?̷` @ßK[~^S3ȎH- b UFv9WSy;{ASS'+矶LjB>#L՝DwI`dj:bf6{YD])(C'zT=BId~6knxy;V'O] $8ab3 m.ZYi ,w!GSؿLL;l`V[tU'.%ZuTǛeAK?6P{u2")`%su- U>;olg=ZcN)#娙_D.oפdog\ChjXysg>m,3@q,_ϬM<3Px6A"O .D/&8O3krY:ҩT;7O|W<ޢ!<2YVCteoO 6 5m̬'9la,_E*UPjRI,i qT+haIC|,r,WR)Xq^X^ ;mmhSG3e-S$ffvL;0ق8Rܨ4"6W8oĞ<|/ \tJiJ(@4|Ƞ%YP2u0.Wz4#݅ 9hZ-ߥ-=5w\KA1GD> A]28jt ~`9QpRGԔE8Y.`ebVUaxzUe {eACPsBsל)hDl%Yl1|kupA\nC-3L#@y<\]%E0sa"\Ӂv2X/C*%AkG^7whi#tY9ϒ $9^7U^wB5ͯїu5픐=ְi'/pOڠ'! jN7TΆTsOX<_E&^?@3Ub~Kn,l[SЎ9%KK&,&LVx ""Δ3G]˿`y @C\v@ ˔̣6s`Ubƒp!N 3;5O- awǣi #u2%ցzr<~,˔@cԽsխ4uDǺ#aVՓ1;36KCƵq#-#Kih͋N߳'nftm ύҽO0zNYVȫ!}FAEkim68x/lc khh~&St|lv7zma/*g&QJ:<*LÃQςyd8k5Sx}4Y;s%t>|p~2R2Pv˽vܟ*;+؄4nG9Я;=v0U!hPCZhОi;-`^-K֔!½MRCyך= NRHR3%u ii) XуnՐ5=/U x=\ژ"[` 4(,Rr2 &s$s1E^۲("n%usRz}nHUIGb&(ap !WHOw ׵D)sj*UkLc_k}[B4 p-("PZRHxz6$<^k˄b0 hg6G7܎mè {_|@߀1{qjQeAz͵ cbm#.gnl+*3ލM%2, ]M>OZ1|ʎ!}5ʶP\^x',1(AC!QAы)ZMxN;'vNf``7_ΥW2mwI`:# =(B| <#Pd:ci)/M}J:tLBlGLܻz vs r Kt9TSOcOᲾM?kvlLU֙=f7BL |Agu<2M37w@f+ٴVkTmezo IV)t/cn< +[)8:Gm^ARJm[^/as.]-#sfu'*P}tOw(K Wl2*>kڞŧQ_J%^uu_7]N.rX=*8b\$^>aqD?'3;7ך-<MJ4>2UцK6VHB-C2YMŌc2# ?cF)t΍lK 2- :u1]hu)b0)z!\ݽ춢)⬲*`xkTN" XzZ :}l&;VKF*[0Ɂ20<#$_ uƅ3ڔ{tgduLka=\;0\X_My+4#MPC\qVK HA?xR%xfYV( ʴ)E`5Xkqєe0VT >jqP熲Z%<#MLv.@s><\hh== c.~-DJRp0i>E1%|kGva#"ZP) 6z0ⲉk(1p -|˞M +o B.>J.rF*ͮV6*b)wumw~NԼT`6NH6/TqYK1,3m$d@e;ogU2&=~xO{rux`CY)ý3)oM ,M.ޜĎ +2jAcwmN⋘1Zj7IVݚdЕш' :%C6]At+B LB<nFB-[]Wu4WOAscB[Pք_,8j*5#N?>w?s^k|x[~yF@q{."z5 Zvz SLCZsP򲓘w?x'VR Xs~ ;BaFGSU4Gm TN|G0MedY`2`e<^L^.qDIy!Dc1MҖK5j$t[Ue>)FHJH? K=kiyq+`AR`$fq{ULPE 2aI8rn%3¸4CCxuT9 W aO|yPQiiS JM\g5"Jk?qꮟE&=d: Αh8w~93`|VڸM;(8Lur?=wiF::忙%UL)ޢJ /.L>I,mn$7"!qf}_U)- h芲bFdžPҁ=?&}X%ⳞhMT1f!me4|S ܓEvk6J2 -f> T)][u9[̠2YC^;gm\~ @@|3 ZXhvosZ>fk ='),^Jnll|f5 ųU3)(=Q1_meq,5[3f)#Ϫ8T.sC6*Y﬊f.Yv4Diok)zLZ gB'ʷg$Wk*j>C~n"sm NhJyYx{~;-Qqy=,.i߈k6OtFqqxYz iA9xb΂C`3 > nP4K1HF=frp? K $At69bڌFErSl=2;$H͌hׄZn{_ .V &jo,GmGoecx Bq{u Z'V_u}}ڼ(jpד d/ ~7>K_4ƀS3COM_l=h~aK~m6k ڝKu;5I_'~7;qfU>Vh(iv* Xn&uc@:wh~ ļO6P1g}.~{-\o<%ds# \z/,s@g p9_D$XQWu,c$^wq&Hvwe>$t}*5.X]qY1й|O&{էQסOy[aJ]J`[")kcK*Oo`i:ƈʊQZȴXiy8ߢX^4.plgTF;[Gg* jm .sRU]1/\S=8hc28RZr֊-,C[a՚ #.`I5OizfQq$!lѶ:-4W>u2\2R|l_hGV.ԔeFGP86{~oNKS 7(WXbf]GI䤤pZ(efNjAU u:+ɮY_]J ;/x4K9Z|XzH͹}1$pK?[3}I"77ݟ#麙ۙUr*f<6mҨJp/wؙvtZ~^# d✎,=DYl,P;iGyQ.%ba^Js.^I\-MRl[C!lCЖe`:3mʌڶr^gk $Sl6-wN0k 7#0ڵkC-trAЌMFyrdTCr+"akr;eN9~ $A؀P+:n -NFy"_v6X^zL -{(K lWf9~B[p3!ۮɹ ,h:=x.2t @$9EWN[q Ds7G HE jc5['Jpp)` pCY)T= Zr Vp! 3eXW78ZlzUk嫫AJ– *f߼"~[sE[cZ״`S=^ьcM`ӥF4=%j-5ETn( 4Ttl09sTe)(a6 `(iv|ج }c,.Uou0̧Vb!2Q+ͮ<',y: e"14g_.H` T 4/ޗ.?]I ,`d~o/_bkN_tܒ(P1p`T+%xOmj붫mw nxC=m.Xb_]֦é/kJEeF{ BXtb0v> [}H>ׯwN BJZ=~̩]瑝yKZCadNw lGBftz=Kd)ex.|0-xT!Y<8+"iE:f]ׯ\b3]9їc ;zkw=MT 0E:8y_gTVi+8X!,X#P[ W}-TQ+6&Rdxg[ o/K#2e(%4T_ a?-kO)yZ6h8͠(q*L O5}ܐ<ł>Y9b(H8 U^@tӒN+%YxrgaP1=8 ANQCeLz-|sݤk^kplIwg 0'=t=~-&?1wb;sZ<5 PU(qR[ E.EfcROu%%,U`3{GPnz\i6 f֎=@܈d(uoh Qm`S6|ބkn>LLh^%rG]p;3@X@q = >9zPx&w`WIZK*x|E)n ^L#3/rQ'6'N[ՙ>hw$AY}'͸%CdwtH6ذS2nLgd:Nӷ!:A~Фy4,%oZ:'njFyTfiʕ9$P!@ihY:%mͤoC$vѹZG.Ʈ&Κn]:kzȾ20DZ.ct35w>t6aK.e}G8suipey,&{ҍ]<|et`9Ǯ3.\'e bW'-E0x`yRGpE08zu ٍdž<2w2,2bir $A-PǦGS4qYI|ip i_N؅]v񾚇[Y/HPkT[?{ӢW״ǤIsQ9El)7NeA>Q g/z`X~;a/\!lBϲ|!L| hF,ɤyuEE0cDD0hicJELOŠ4, ,^BN'VuVbR]hIR6_5{fWT.Hg7V黱Н,񎯱_fW$fo6=O7kNylD"oLP4ygyw&T  id")ő}GW7fv1n:f7o ttz9⎔ƙy3W}\hF5ZZY wW4>$ )FN1Zk#1$K:VP~251!v-Md].0#Rfe! =joeBqO90K>kK y\s%ZZYY֑jt4:TALͧ_ JWd_bᢌ5JEqqZ {S cܪfrȭ} ̍ CT{kV&_Q+ulܥKZ+܉[ "wPKgvf4I)?ozlJrmm(`?k?kKaZcҟB8X\"3 &ނ$[Һh+I%:'a,͐1*/mr!)(S/+ߥCwG6_rX'ER H;r(Q 'o|xHaCŸ\X򠾲xviyzi19W;{J&4=+.J)̲wډX;h }`b01)>td{y&M}8l*Z}f-!ڝF ~=" Y+8dV!/{ލZ/4-a{hkFˍyhUYn`mkൗlO[z\]Nԕ,9Ĩ89%&}/\G73,f]UH*hs%R͊7]8S1f^Gp!ڢW21g\i4]M" Kg 3)yD+s>i4KE1^ު01Mo9~j y{M)5̑P mV'd v3 )<9U SE(P5I0'0JTqڔSe ƮK@`qQaqz QY Cϫ!@v$wf@AR.8N_8N'UC>Ì=ےѕb4V8KjtHxt,S >1 0B d0qxo s2u}}.(Ao-疟$w,GS2Ks6k$ti疫\.^hV w~eũR[%VLʀR4 gMg%)HX.ض[ysT9jH0k A6lv*D{3qD"f!#91Su  >1[|aFg)A,G5_WZMCܖ@eLZ--Rﭶ#$cwK9Tt&IqmRSf  x"3 i9.,97&!˂O)NH Dn@I6K MHx jQ>e%?gXAw|G}*=C7΢BYB ?e\ JMIK8p2͜"KXɂ n;V_zap5ϘmA" .'A] 7L;@HY<ߊ.lms 7iq L i5zյkke+`{ːӲDN hƞ%4Uェ vP51Ă- )"W_aW-XX$G/HpeYNU^ m1g$Z%1k$d'[ DeZadQr5oz+[Vt5<˖Ϳ+?SYd2#?!]t<)󐙎K,ɁFhm(O'N\ҚWK+ztޮ}: )LYk|֖RZ{donqȯƨ&ROrе0#=B/!]p0c`'xQ[MόR1dRc`''8[C$~ns5QcedJa' rɚdSeȲYuOŸO\ J@9"MB}PB+3Yh`h&ΞLνҟBI!r/ݡ s,+$% ]-퐉0$F6q`<8Ph౫eᚺ RXu&K OI:}R0t^.Ejm%Q#Q!'Or,Zr~$x*)CҎn1i+KIǩMCV]raGv Ş#Ũ]%Z) [ubc8:PR}SyR!{@\8 )5VswjPMhj]'S(W@wN8;ګa4D|T8-kRbĦv~'^܊Ww#?Эg(,yk-̽yia7_0] ?GU"앵qXrݔ/]rtD evas9R6U&*+vTwQp O$WjSd:*}D>Lccڵj)`,&HQS[%.݆?yڥzSm8b4n9.G/ĈE'O JBoË"Jlfԟ*.<[6:x'A "̇!-㺭TTGH)ѫ᛹r036vAX;) բݴeJP?0#fs޴=2`r"2RY(^.fR-Dw)/38l%Fu8[Z4v'礮<ߢm 36^Lf@b. 0uZM/E>~BqK*휨/5A#ݼGWkj8sѪV(.@9mM=@HBmpC5UGj<OcmfaU~lNA<`Ml@{sv4nj3snGR=l|`3ub1g&F[?z=kDߠF1&hfaeIۨ9mixVbK"}BM J^jeMWYO{}ٖ$UK氃&Dx!(Iu 12'gWeap{˴* msN elaeX Z_jȎȹ}gҖK:b39`e*KQ#9Jxާ'Q"=fw*!CNm Խ$$1[Vxwپ@v{11fqL/[vKw3Ny2OQNqd48%z5zl0puC7=\omV4USM$W/WMujzuEL|:*KtwxdBKSt4?vhaMIss5Jzf[VҖ*U:a:ݳת!>L>ʋWAv 9Lr7+( nj`}Y}`rq]~I[N*j_1GEШإ|J㑣; 9wvCݻf;׋eč_%Śr$O] rwƅPe¶ʁs ZPl_ %pzrci>L-&0gp>"ǵ%gY&)54,K9Z# J 5܁RqIJc! }|yM8=^d ⹮ "EDj{W&C $F=,ahTTLN9dOVXTOj I'Jui7ok!puk_״dqWV; =ƞ5Vˤgyl839BG3d˟u3ܕaf₡}-3M /1g 66:B?+={cy'8wf|>(Rȩz( 7E$mydvp/DoB)sL1Xx'i6>|yv:z j)<ڟ?pcХZ&1~,BomZ Phݴ#~Apvd))+[ڌ8뀚]9gɘR]e[D߱`#r9ߕ'ge4á`*9S2jdv:ʂMS[wJemWRkiy)5k@*DL,BYѝO;nmo +l}[1l<42w!W)cTn ' B.4Y* G|}g}u%&[Tp{}wO>5@ܯF'"EZhW}]tRxYUۄ\'B'I#6ju>t_Ps'u"Īu$g_Aa3NuRg޸j=HllբYmX?y?*lK |_7@lMˎ["6jʄ@W5?l)#Qw`j(QS}$RAX 2a|9sasaXvE{$>G)yk %-mj@!'h)ä)"wޭNT,,+W~3!pw]a9f cYoMr;>|{_J:Kv]&0~km-PRg z8 BTKN_%*S(kuh܌x(4j>A]l;?tʂ߅sM5uyhRmnrQV^M1UPMɃ{}`*3Et_#KАbq!`iD'v|4DO@x?dKA˲ ի1c!Z1-O^lߋ<-c0W>N6!ERTJ_z_MaڭL͹PJR1jeG+ Sg:Ԉfi[!o~QjIS6u쿿!gB\T݈mюI:rDYyAli_>NXVW}D5y.֚5wN_>Wŵvnm-€ɬsJ<@66n}y@Ʈ{w~{(;;v׫?ۏ l7,ej|"AE_,T';T7)߫])[r4Fwr0{7pVŘEuX9)Ƹ(38*v+YbH?b~t)MVhvR*(^6bӪmV+L_Þ2Uԅ'o`,yn?t{zbGr/ٮm}s],h<v1Jiw0$dVlYfecْb}܈2ݷhy~r{ʔSUve!jP]zybEioE7u#=u@Z]dK-U_' QgJ'C|B<0Tc:۷,`S4ڲ_&SF5 >E"ϜdpGvtPWr.GmԘ -p.Al)+W=7Z6@zZU9q)CXOqt$Y92 e'fv(ڍHX6^XZ&ir(1w[TQw :Kw+:7`4=E-&ЕZx@"Do.t@}3LI^\ L].8ǣ|ܡ?0VYZDM?3݈ 3Զ+{|RKw.v3] Lj0-P?Y{F ,Suj0# d&n1d6eaKQ*-5mUZU۽R@#8bfUmvkU`]/'1$}WqEqqg$3NGld1.Crbi JRRI$9z,JjH& *}+:D8e$ CY @uszmL U@W?ߐ%ytƠksE350'&p=9KTrq1xNtUvWd7=Eƙ_ٺ~naIy8BsUEKөOtO-Nkܽ{{UDZ79kY-؎c!qr0q I[S2w?=~V4Fwuuurt޿*Hʑr;qSz $84 ~FX+i\o9 /M@L7yg'0H"C{669kD} E-#=SMd1<tX+|yq9 6=\QW{PΏ  Й3p DQd{Y Yyi5WLv(A;Ǥ$Ǎ -ɭ,D'M[1}]()ha Qx$cl0z"zc19?_n}`u*YYUb@FO߹s;{z ^5"3dGv%fp|>ZS|b<S DKF=> d⃍vFLXbΣ;7}HRa_8nnWܵdNnjmJ{ 1ɏ&gVe Yux[ ppk8vRM=|{x-wET~He1ZâtdZ"@Ma/T(iJUXOoJ_H;c¤F[|G8x2Hgf:@K}gous0i?U0v5H8IvxC>fQߺXP~pK }L`pQ@# ^/mbB"׎hpZ#KESv#޲N]#.p=[FB:aQl[x]L'Y/9ó@; -L~Fd,~/]W&>Gv@? UDqbF6faW͖JnW(wzKZ0]ISㆄOڨ~PFe }W "q0L]z~3)}ިP/c{M7iIFWdI&Ú>yL ܍x_gg!QEέ.qg&qcsU#Q7:L3I uf9I[Z1ޖ3`R˶RI Lʤh~Gx-TߞR~IGdba~!qjk𣨍 ݹRs u4.Ou!nl;X],C:*|Z=:.-EW JZdJɍ.ǃ3%a2bW᫺yQfdkpӰ Qp[zSFM4r1TS_dq;5 vܷ=B-k{R5;ͨ}A@ ÎxVhEe 6R$c/J & =񴢅;\62)Sps:˭⪵;:"`]VrpgZV, E_E/ҍIuv@#5ȓS"{=c>")N ˉX`s'k-5]T8d28SEbkdݟ~nt[vOAR9Kݐa|eWƏ=-PviIDjTA3Lt0ιU"2B,\x *>!X0ߖ072KѓFiRI+k~]8HYM:cOpzE{>߈uX _> ~_ZhO*۟J@5u. N7jLjGc9m6ΰuS֙~qWFu yR}RLB&2C8#*N IM.d=t4BAR((U^QJxf!n-Q{-̭'Xb2^i]6SRG*UJS=ߪFg,Kflmycv?2o?bKfi~_:-74y{M͂_R0X цdMVj5$czYD #ʗ)/$8Hm1H$=w7Eg*cΩA\am'&PX kk prvB*o!AB7CnRlknI ih'e} &.WYToUߦcZs[dbV@UJ_f۵lV1<՝%Np=`M28Îk.L5-e^JqawFtxi4U3ӈz3Kk4+:^FsJDP/  c͎-b󵉎JgϦﱯ:h 6zJ'h`$v33.uY 4óӢqW`N[o"}a{yvmwVPE:4/Ņ#BtY}D&D[6 KY2i;Ћ_Or&eM]տ10 ֨]vӽIP= :*"h iT,?p>FY\ _Q*LĽ )mfz3Ӟ ezu4QBsGoRhEzZ0F^ro%qW}&vUqv*ct ~(,eP(,p XxxCTf`DMu>aO G%Gfc ZxQP)=UvV֋}&v;NۃI^ ŇLJ(N n`ܡh%12]Emb"'Q^݉<2ż`5`EdvQJ}~x^Jr 9MO/^wYC앋ӝXS|>SV26XGܙ8إ,GGHQrh*cMVBi}t{$rU7١ G4$"moU&m&1HWEޑ,1+8$8Kza[1o]OڥtZE#S8!"=V2"r߿#yVCKFޥS>8gw% Y&I h ({0Ms#mXcQxcF/S2V< .k .| %C` Q tҤ?t_Y$$b@;Ⱦ[cڸEוL[]oČG畡8 /X%aP!.ɏhg XMD?CggBowF %\lQh[BSK 8{-1)Y6߂{7sI*zobL h`.j3ƀr={dU[n-} g @G0t9dd9[a<3ba/@AM& 4j9oc:"qneڞI\)t0KU7>t< 2믭{?߾s«wqfZ^UuU$C5[zuqϜ>`]ÒcZꁫ)#b}@e:ޱBXސo9b35y?Fa/dA߇<` C"9 ^<+bkrEoz:pC'Ҡo:*%Iͤ Xr GtdQ> ]mR:9忂DVh7!P|3-wN:zT6;Bt,m]8I[F|KN2Kzi]f!DLz|80ڇH'M~/iQraMҜ鲆RC&4lc5Sf1X;vn!o_9/݃o)Wix uW *W?ừ;7y#f~v T"x*I\K?nyKV;  l$|*FbJ:2@ι|m"Vۊ\QR3˞.pJE7_w%4n1`‰q|oIܤIu~+zv?yIK )ZM#4$[-14QsG#JdKoU,k7ѹR2ӧ\Z uK_Q/WEbe`̿s+zbЂ>zN85vcQcNlOƾU!BwI6 19 ' ++[]Z$djh؂V'ĀOS[ԏӝ_۱tW-8f}XˬR˸r7s6R|c 4kl (Rt&tY.顽dSڱL]ݤU]N8n:2Me*оƳ@㤐\#XJJ\9a\dj|o110TAF>waZ)"٬iJW:503HXzmϼ*=le ryNi g)q5` rCG}$&AjYx i>w&C@F2f^`;q2q3 .8K5p=qֲZvVL-W $jYiO6hvK,hNz ΥR^tDqq.0V5}<,.ヾKyrMꂷ1ZQ⪀YZ$w24O|29@8H`X~  D|є U(íՙX"k>B%fc8a!F^Z7Cm ږMEڧגydq gBVL%WhRۧ?H=YՀwK'%sHΕTXbyoѰ"Ypŋ 0:<20, Sx>BG?y7i:(̫T֓+''QR4gR@\&P۲.4uv{> o{xFjm|kID6 3Dsj:DVDl1vR%6b$i W[H|̽r=;#Ѳ!\̲çC5?qdʾaHIrK&a,\E}n&_m,WdW#"4#˝#ю,oXI73߰w !J=5gAqv-jv$MUv; 3ItgzB4%(%iah6bڹ5y BW<ʠq=6;θjLyv3pʶI:s +PVOp|3߄Tʍqt͸(4%`*Qr͖;E0w9+E K[} H*^RHh")M_Nnw9L-ӡ4OUǿ6JVcv ^tqLMmq1 RutrYNWfvAwJ؝\g4=RMeB !cAi nNg#\$A!U{$(3\VZ3Sbl{br?*=`TȊq|" &,}c5#Q vK+(yn*:v2W 1i]M4C8w=f͘Ibй (7%6VXL.F^Q<Io10:Q5½{?D?]nBHj9AXo9e< WD A SGF!A5iD B(gۢ:LYs5Ȓhl)=bf;hsb2bU(Hb2gId6  لͤuy{FfKg/cM?\π$Qѫm`WR0WYb<{tSOaen"H"=t02 &bS _[!V,nIohr-w> 5 "gqN]cWRōV +d0g)|nPntv8X94h 52RÕP.a`Ք冊>}.r[mMrs')T ~driP[xzaֳձz<̒ #رhE݃-ܓy:gicYJ*lF+\jbwށ+W)"xOLE)8\"X@E+匡<ϱ ɠpD=P(\&O=t"u6FRĐ`<%zB\B0%]Ri$vFҷOb:I\*$`[<,~\9~͒z5Wv<6;1ݙPL&1hy{Y9)ѮLII] IE K $`EiB59&N\{xm i$e? /*a\:FsQ 氾}_qkOiO>?_mlolO"vw>K:#% U|}x߾ľ?Ϳ:F>2KNFp0ҚצJ0qWhGkOː0}_j>#!$L>gb%5-K)gģ#-=ǯ$0{j_q;<>rzL/so"Gփ76^hKt=H#er0G˖Ni7ME\0'& @6eŻC=.01A:!jWXk*$^!i籶m|o%(.&i>sY+ۥ¿NՈɍG*\:OU$c gSBgGmQJ#DH|D^rF}OI46Ktgo~EV8HU6?E`P$w\ˆ̐Q %q|WR@$ "jIIj'u.|txV++9YX2%Gb矖fLg5 G $0I*S^eda P<i&|{g>3ו꣆x?\5 >M#MۉeEj?kȤǃ%S2A!ޓqqVp-omRN <86vSXbg}#)4#KEjLys†7a&yKsxH52ESYDeRv,}Z =j0ˉ@j!{s#Gi> fua rٮFy׵ǥu5o" )g/S|oqdɳ$"wuRjYHh' O\4:&Z8"AiB!Ώ8kb@Lñ6eSDmZNksSH~[: Iu"+H4;ǠQx*YB,u_ rx FG[}L &s>7I%-78srF <{0HT : ]}~=kC6_y %M#k.`8kU  8iGc@vgE$'ȩуbIƙ&T_dEqĻ"M7nkcn}2{D(U3*dt 2Q \|T ڞ52\:/4qPYX k&E]%B茖SC흁_~,%Ջ)\0!-tu-Qbwv, qIG D֥&|taߢImqF!͜kRL!q+ׁ[:Mf0˻^Y|@*7F>f!wr=x5u;) KOZ R [M$DՅ\-d:%)%᭳ek.&hOrǒB{Nξa*AFq_Bkl\Ze3h>n y'T;U۩gKjI"+AG~>fx~ikCpBAj)6Qoh>?X`@y1@⪱?i秉>#󫾡i@H2N2¼uV{J?n5Ao7HkjhЇUҦ@g6Y{50Lk:JJ K_+{EiőlZ#g?e,dܢZF zk$$gqa:ՑF:dMMC=%E4*)R5N>$}DCR+C "" YTb!G86@,PQTD(ČmFJS[R=Q!RPi:A]"1m .[I 5֝ݒXn5*E+${M2=d ؖPa1|y'P cA%d+$j9M.*twL}X Ȏc[IGƋ*C<$&@#&@ n{-.v[TXNWVAAdD*m$)ıuB#ir)U#n']⵷/ifAT%=Ŋ˒x[!p7(,)ӅG| $[8=\*y+5&0$0򵚷@g_c[l(޲n)4Gp8 1.jNڽo/j/ 氲Ś)a4@~7փrj2}IYƷuA^BT|-Ŏ5M6yiE'7-V !" Ho7u)hECΏIzEdmJH7dh9c`gSNSK`_ԍr\Q&I`oxrkΪ1('* ^ki]J"b$gRIQ[DcrW j({7 C8T,E>O[\, cH΃7Z`~ް|T!74d/:Jn?c"%;op|GtI7s!ճZECBЗo `e {MXiJ=!/չ .$k!$]س>l^DG)B3x9Ap{L\C!w? KAj-6ݬ+ [9KO7Kbܼs'-'P^ryU6ǪgxVbH"(sW! X D&۷-)U r umX\̠Cc_o?EhM]Vs)B+V.^-hv%==lHL4 3Of䚼֘$HWet9(;b`RR:CH:}Tkڅrj)Kʸ|-[waV*i;&BBQ1P?}C8:@k$DV2Y61|6[2hBLaha` Zqۊic 9Sbj۷+ؕIM?#}hPU (˫Xq6Fªw˒" c[ !VD|Im9bY4=UMSCt6 òMWO%$T e2 R8Q\Bz/_"_DH^0ԦS#/# w.c^ !ɲ$C`6fjoj'7mja"u! 28[`3sH2 O>yw?xd-QSj_ do{92XJKB7V|t?qi^0e=Ä9Q\u '%`]doY /P-=Yk9"ui.VɚsEބ<i!=(H>Ux!:)!OKW)B,9~jʱndw=j[2MI{(޿ 42ut-?=ףMTicیsg^u149^}:?i Y!ZUVRP'd~N,rzmg6)rx\< OvO Tw֖BΫ5ZbGi4/­wOvJU|Ijks8Y;0]砎2}Q#='@%WsM{iqwS%`A8*A[MgIxWOQR4i%ML9ODs2.<_+EJf]n:8IFQ#!']F`buZ~.҆ۘoǯ6` S\@_]'gV΄ի-XdwiEVbW*=3'2x6;W~&Iv-"oU,Ɔa72K,!zBbk+:ѣx=_a^H N_,[b_<abLB^Q.I4<~(zK_g.)ˆ |?-һZ2ߤڀ>M%^1AʤDGz%w%gP`%y* $ssl/&> c$6D@/+3Gr._y IF]>~ ;Fm2kQF͠x|0L![(ʑ7/{$ `EØ oZ"ȭ SZj9#6txҡ[]x ̗@ޑA]ܭm/Ee:L4N ) bǫΞ#C<Zѳ)H(}ωr;A5lL0[9k9V:`Vs X\kU&f2Pԁ#%?+PH,MŌc;Zӎ+/v}p*mQJ߽Nsf: q/ORM- ~.waÎ` :؇-Վ]pIGYI\gs빸(N '5(-.zHN$r.]RZXU)Nҳ>2{)9-'\.2Hm4$1jEe3%cXQBfS`ȱ%H}xZE Wbi#;՛ij:ǺPRy (^z:1j;!#ɪAJ`P9NP7V\-}0s㐩~6^Ufݜ;JAm})hP U+[è ?)˜f ,bC!FY@{Ph{Or!0F_6wrHgW AO y 긛\8g9z]yU ;F+(2 #n')`7p3wfZln 1m|&= hTqh(͏,G<Fwg6xk82;2ɴ|qo[~tmRE 2IruK7S6'ε#6F_Q^fI.PjqMP\=<"M`_ߺ HqBjg7pVIf[CF䚣f/l05&&ךyFj!Tx6lΧa;HwpZh=&N ;Hy-.:l+ՠN=H5;]~l @i(PjEf7}w|K=S(=T~]~ֳ˜>{}K.\&}o~ 7/ozuݧ;qR oqnmx2ѹeZ4t*qk+(uL)L#IaY`ÂahYC <ư,tmuo=n8E.:@b U o¼`7,V锈]5ЎpH f0̦; K<''hcq@ٯ7%XsۚMXdukP"8^埂{[[bѾ\灿8;+Bh j򥬷J+':*b@xIߢ*ۏr'1P|#Ķl4jƠa:%RBT4L\!c=Wtd< ]{'^XC٣%uA"7b=0<4Pc2FQeUӰ`"k>ݠsxӯ;%^_fkOm(*$JY+Sj$8Auݎ#= }8;Ķ2uF8/T 9D#&aRSSe;G+|MbF~?UL%5ADEՐl#SWܗnJ~(bs['2beN,ZGwuL[ le||TV49P._%#MhC;]*мsKhvj|5⇄0@=3IY!-`_[ aZ${Z@")ظQ/m?_\lXmqy积ݯ~z~zpxKuKjEnlgh37nbhf ǡO_|K~ XKmW n{޵1_:Ȑ_ǟ_~՟x~zGl?V*܇%w8ǧ'%:@xx;&Z֍gѡ/1>qwB0ʤ 6^tywT^vH0_(2QQ#p=}LJGټɝ K|yo? (nHj@rj&WOcyT!D^QoH۽:* %5cpn|iN-wv k>CZAt q# 8 k]KIGqGd&JU *)#F2Ci[jACyl֥6NmHں 'm9}{58msG I>p'#ygfvMiN3g|Nv:\`@\.Urq# ~U4CV7MOvG .UVI7TҒ9]&fZLy:NKQ̖(GFG+ gOFNc._MLqJ]&E֧8LI;ة?6 mx\"t@u~&(E3n\Z'Zٚ\x.dI4OleʗL܇9t?,R¨n(׫KרZ5z nvz.4WNM`Z)ZR l96C՚t;)1rXWA@Xz ][.m)m/a ureq&N`VNN*e:sBy86\Fg;DD alT靠g|^+ƺRՠA la?ޯ:s\H%DSYƭT1~r9cr5Eo|n8][II ػ=J;(24KKBΣ@ XM>.T,G]f+QhlYdS"6K M%9vbxPVj0wA--VPh! ۴6M}{d>0xo9$lrwJC0?RgaTY ¤7`zHԃ&4t-^ uuZf$ Kzz#L*VG=Oho T|ࠛ$i!PZϦĀ%)62 735G((b3M3TEk@V!By'a $bzA/P&h|DkԑePvNa?+ӏ#ळP % ڔOYK*ZtCCn6gҏXv^Q(>Jh V.Ԅ؅O-8egl6v7]Ѝgd .?%޴aҶ:u]5M+B 8!RH4<#\Gozc9Sb?΋/ I,13t ºԨ FW(r}#Ù,ث<~bGP1ǯXMვ*fEOf֍뾰`s`|]Nz*r%(!q'X&h v=(Q1Շ_9! Nn`:O*&̓=j+nXŧ _"\" 0G|tؐSߍڽ?qٝ_P7O1:K@EW$ɳb^;Ap#wb>a1BFxj4{ڈiTJk6:R¸w/^'fpnU;\X Io">qCPB\쎷5cYs0Jxcw?.mdvݟ98!mi:ʼyGgfDWs<[c4 fH D^ձQtFd+DS֓4g϶&®@}Kn^ӷ*lWlqi ZΐJ&zq#(7tTC _RAGJ~H)3ͽyxN(7X1I tZnߴx6UƋp%HrQў (/~Yj' xLCZݰ ˳gL !>"yǏ),Lݓ jIVۖp*f<\2̳PpqvrluqFڴp8`ߏFҦ9 %Z GOH*Ct0Q%zr X?H R/[BE'#1 P_X%@ oZ_4}ѰadE \9q=(1zVNVQhz#-/_wm]o4̠̩7dӂE/{wy _ڨL\|_1ɱ 75dg8@Vqa!0Y|sMMHC`x'KMjK)z)<%f'}LF %̹`h^0gK3r#f"ÖcY?%kFמT-''rk/E*^f6t1 a Ȑ]ON)pr\ !c@Ǭ)y=ɪ@ IǾ1xs 4 BS(ebGoruݯ"b?`W:{1^OѨw*L!<<*V0D{FU&X7Sy24tnWIGQB@3֫`Oi{tխ`,s$#.@a#lhtV:VcU >YKE%9(tȣ b!:^VdZP%bRwwmP.["~)ؘپSaIAcڎ8Ij֞ug@NF%^=MC,Ɲ xps-&׼+ˇSZ쫧qDV;~|֭Tc498bJ<ƿpdzϕAt[YtbWCRݶsGl/,. E\5h֑;xEwSS$)΍ caä8zTCN܏ ld5G0J)D_kc4Z^D{˙_7ږL zd,Y\,W\>鑉nJ P{W}$ , 9NdBKV rj&^AL`v.ƥ ;r@ޓJ/(!P >h2 Ό#W&Mn9w o,K8?luȺ(rY2Jt|lKY}6j 7,#(;ZiݖO}*|@x\%HxN2 wɲG &U&DFVH4i7xc(z;?˥ʵ%mwٱL2O%I}^ ؂ʹ?WSʨEI3>!mSb+ Uc ?7Y`-CTj/ؕHm{BvЅc;7[$tiT' J+{_]l3i~;>"Ë{z*9eĬi\Df&9cr!jJgBcUF#G$ ˨Q]fpfBÚݔOTكy̅Q/$uɏ d?ґwxR$tU|Ǟ**/E{~w&#9lEZ:YPi4<'4 T+sOv\Zp\7P27c$>LJ*ϴac*`hS2Ez#5-y rޡŝ=Aף5ίWŴ)9__ϙ own"B/ =ϴ+WGbFyS L[  lc^ؼ;Ę_:!*Cd*)n: 2O4P0vqNqר8 E1NTmf>Xɬ$E2Ṱ2߼nOX٧EOA2eaz ܃ϒ3)v} %+Y$4p#ZqE_egEXaj_Dv,+R N[ < ˞RGPк `3lo lNjAdIn-{ɡxSI/F,j^hŮ:-.p@DBBY8޴ mh\Y.=B'r ʲԎW|G2S $z}d>jVasA1w6>Hg!X R^v`4rdq׾wHIF֦AݽZY!su gNݷ<,y?D'ײSx5mµ#N糮4T-P,r Ŋ[׽!onIhm9u3kJo[n / 6)=jThrݷdY^Jȵtiy!nv.pӫf>EZy6mhOT}xT.4v>\ $Ե$X2閜Uw0sɒPč"i%`3xo>+9- 1<-5q 3ʾѠw>ڴbSϱŒU>}yq>1sQ_ (lLfϙXɖΝ+hAMv&9U4ҕ aYPIO @HK4X08A]g͢aGI^P3z{ou8L(NH|T<9ї@.B.j`(ޜ`\\=\AZYݭݏH뎸!0&4#tɓTwE " KM|;l2;:LHkS`WAyVC!L+ƭd :$2+']_^մO¹JڭEC.$"HE[x}Hez3+?G6S4` /Vk.,J}ņx4#!,_P-3^O` 営Tѵ2Ҹk4WS/ncy"׈}Y=x`YNC 9&^rs ~/_-=#jWbͧ8U,9zՇi_yh$p?rՁ|+/{PGJJ02栏ql DECZq!3-q{!#ŵa8ʒۧ[1E>`q=ݲ_x>}Mpb:W -k-" ubR` C_DbKWJT{O'_}`R;DGݪ4DҧR@Kfp"t(uե|@@*{UKOuy$o"mdKb hXjH?DGrн5_zy~gV `{B]JZkn 3 &%b,}`ڤz>J?зnKuԺ]_i QD.Ǔ/t% (rC33mV&2/wHp F]5t\i?cQev))ӕoG-Mޢ-9y)9W[8{~ %b.>o 4ju [wd*Ņ RQ,q,k5rYY|bVj4S+(%TPْOor%f{}I"QtDQ |&򚦰GF6/Ok?jE(Tok M6`e HHOPB|6f|ʿ ]U,`3UR1R!5rL(_Ւ5[V `#Ф2Ex OIb!V4nveN@I H(+~9FN~XpM?,kHmٿws0i~!Eؙ{+\"JfGot X'wv(`Wv'ka!O'FX.O2tfs mo8-4PǕۣo:*Fի̦0>g#}$}{^\n (֝T[#βc|k΍t%(}PC.ۮ _q`aX$zlKL+wj8hӕ'O•u Sʡ$Ӈ'l"2%]ys\<[RMuTA*,=D"joxJDf S'>n=6^"SxښQCkhj&yNJhoC y_Ze2Gv]!!eh1t JDIrdD3 ,B q~䙁;(g3E,>QEDs(оd T&3ArtmEl |BOa#ɥ9l܁FrNvO,!@(P u!|@Z|!4bJo 5O`B,Ps:0d]lShaM0`OT . _)&氖hv7+@}*W/`5 X 2$03ޑSۯ(fF7s#d$B[A`D *>m=klh+xz 1loj.k`0CmqI\R3@g*0"Yi<ËS4Nr|OՠWVm m>ݣ ɵe* =g4;"~hB[T(0E}P{[/֖nWSUvy妿uŕ+ђLnPnOr~Ļ|t>[/@eibi+]>l x#7p{ Zɳ9QvP36Ul("K17L[-=.(kUTVBs+@k=$fLC Z;W^]7r0 Ҙ٘I8|WM@ѹX9D dCgS@`Qτ:" w39ՃWn+,\9 ,@#V+d6V>?BRz\NvfNRd[RamR/klNr!چUdwꈒVZ^lagKCY Ϭjԗ]122X1~/AЗU99*KKI}ӇS b[Ozwȴvf?;xZ.ec!yh$(^MQESŏlKIx'ҕ ]B3Kյlbi#c. <2[/93Tm@0F,yL@C ^lnCxCX Lײv+͟X#euNtxfX|v Ga~=mTJ8O7cB6GIP%v'OIIs!3 O|A7̟H68gLEa[=M +1DE 5˦CxὫ/EpAP2t)&in:)>"mAQyj:Qa q:3Z-˞LѫVǟ '?Lʥ0c`E~}vxdE+{;݈͊2]i1|*"|/ fu\xSY8v"w_oYܑ-s I-1g/00`E;y}k;M RHiP>"m E;EA&ؔZ /AYEKr!pMRFA6b^g=2FZh8`W ޿ J/)|}me̘R(nVEg$i#b&޹Y9<xS^fXoYaQRv U.}:}=+=OK b[JYU``qbIr:JNqTA0Cic\r mUH`p qćWUIHcɂ)͊Yճ)!5'zb XlZ633X/Ԏ@H̳MG-\Y"&'>!{mH})'_(IYp5{yu%|V2"054[R Z<=][!b$h&#9xEb. %895P?>@( sNFӌybB q9$nTK90f560g ޒ8B##=w2 g2\+V> GEV|uȵd{ ʀ^P8^k BGPuF8Dj!F]WdΨ]d Jb/i \Ԛ?A_x<ۭR8僽4!h"F Hʖ{p̻`*< n'@q*%*\c3m!0-T CtO'3Mi*Plh,)SBDK)a[Jqx :a'_mńY5#YxƘQr<hCىgS=`FH0L`iGI>I]6ySTpkn͎e!q߼Br@Ԓ$c]\Ք&%UB5Nk(N.rg6Cs ɨI pM$ZVgjPBWKrRu-htG"ץԓl%DҏG8v`>ጬ~a2`p (?!RpTI)$R`!dtwl꠫}#urF%[/{yf{6 6Ŷ(sKu%QLqކG5l6'9T,iH)0EII 8|#,.$?;NC-ڝ _Dqv6F]WiE7GKqBy'Ouuh h~ Cݟ=,Nyױ G\x3A3hr 4J9lx5a2ko BYpUQ/; IXh ͛K{qw9KvOtkloq6:/1T[>?nzV]$xj U$Glv[*l=:ompғcm59UeEGAWu~/L=IdU#pr0[ xP83)eǏ$˺Р-A{#oB3 ۉÃ1̱(υ_m@%clݟ}WUw-LLy|zKuWu/F!>"b-I8IaCL* ICP vzHHQ/?[#](@x m1AV61<{@!DP=?4{l"ȌٗQ7{GMX*Tf4e7 r5E -H*?A 0,ˑF>C{|o3:(A۬zرoY,vP|F3@Y-H #@X2Wsd^5v7?iT[(LLHӲ(SoDcYz~`'7^%ƛ(zZ#DIpTC}hF<;Cuܦ\9+n).FS.SbUB//dAܴ[KOd.\,k4 =#qTzKC;t4,:NNf7 EB 8>P _E\)I UT_&kgсA>pK˷`n< 6|F~AE!Fv4侤6W~ި򬕔K)mf]\Ğ$^"\{wgYfSzpR,> y:Ukf~ORp^0ex#];J>odдqF@\>J,K[syQMZk(TCr atba7e 2OJCu aL_{g}# # cd.(:=v٫F^'پ'#\8eudw8+0P{X bX_4bӃ8}Im ~[~BK .sy)c<&SZ+܋NrT1>{(BTǧ(%5 (%YPr+|96T-?=9Q7LAg5yFg֢qƗ/ '׫ɍVe}\tkq{D_%,8^/w Bo"Ww"cVB1`eo1ǔsTQ=K uA}"D !AW#Լ)EiYm|#,y ' ]ݲ& ښғ®—Y[NU~]?ؿb r x,"PG;)=0ղg"ap5i0.[9G6..*,[ W#Or:Gd0GP*Uk=$` WN',+PxvPR ,YLƅPRXIhwvB \5f` |էlvtCbUB)Kɸ 95KdE;1:P.)l#DTsMJ&l nEP=9]]= f Sl%i.Xn~Qr=:)r讣MĩSWS(B Å`V< fk'pǗ6e\1/jk !HD [Q>Fz}MuiJ P5! AecPru[X}*wB}'|ds"҆¬z?D9ݣt@JI^:Z# 3O M,6a? ne\cXdV\A)!(o}5YNi%VPz BӪIRҞi OSAʌ3K^0y_'hq0Z\CjF{鏲#05 #c3ZV*%ջyIPvMmq.;z[~r,R]\V-凴+ ~/"Q-|F'(ָ]Srzo;, kHNm.+ǂYRQ¿8#MQluE6tZn?ݠ5,u pnkHKsy}B/ w idDp]L 9K+= n`tJ}]g}!8(;'{r|gٺvU.mmhrJi_/]({%d/hh*W))hekw>`J*nAd۵(j0 J:}݉^X &o;[HIftr6qH\Щ3B}{@ddbgyXׁ8#0j67gZ9'y^4 3pMv7/7e#keB̉ܭkNAt76d@FOp,ÿLR/C#^m˜W%1N+e%k=Tyf. 6KG@n=?BrpkϽHPfL0VKx[x1H/۞ϸnV"AsPSKw &"tpXӟ12KiU\7'AkI>A0sd'C6h1օڮ+~t&;'B*[^L{ |sn#m8ՙ첼&vVnd>{km`B+!|மɮ\h"{sx'rq5fʈv#OX2NopgL(֧Iǵ}2({Oԯ\n,I ț{g[^l@J Dۆ<}7.LؗjQFssB2oMlkΙA+^_t =y07~֢2FiHN+RTr[ U+58e|ٸȍaϦ܏\Ճ_6"3{>9Ul; #%CU9ɑao(6nav4+wn u< 8'3{B;t& M;N 7LRXB7\KqTgjX'wP5=&!K-pa"2]L-M而v,6I/()6hA+1Թ? r߬w+bb.K%tJ֌l'Evgd`[}׮>G껮 Q[ c~0xYՍ' fA9D Oǒ[ٹ6!0qBE.6Ԡoh=ð;}1y܄\{<YkXi:j[ca)wPr]r '9 /9vΨSz>*V/m'oZ /&Ø (ܙA%i JM:$؆g@ hQ/֤p!&z88&KNpNR+Κp `&n%A@[*u *}M^*qwS(mzә@T|_/-$*ZcqZtiLm^:2>B*g [nM$S &"F&bEj*fR?}ԙ~g$9@Y<χ'Rl4C JcvA5>VR%0 qS\"vuN1mQ :3Վ7o`TuBS)W{ݸgU,jt>Ux›6שF5r iK|L0SFcWڄEc{DIq.dpKkSLGh$lW ZaƇ$2/ #9oJj 0j]P߼n8 dP/1|0*KJޖ/4Qil@TFL00fԆHSjX۩S$_"IL`&(z)o{K)/#XD8!KuՎXA<Ŝ he>%eM"-JMl!G F7㪧>tnV}A#SU(hTQ"bΔ&Ů-Sqx()lǺ\'h2؝O0,nT6tEm"qb䁩Q1bo/YGÆ<țpfϱ h@)rU{?6Ubf2CU"G+; 6q2}l050`׆ x#@It5Gx UƴPZ^^6c6\?Th_:I);:&fB1f.0@ORXN )@wTeYؤ9΍ThK2޵ɼJëIZ[x uH&9(L6~/ h:Mf6 7lYp[,C!' p=+w-}L6W=Tl t-wwK>5 (!Lh7M16:6~[qBjw#SpDpe~{;]|YÑAnFޛX4??^bܤ ~GW|[N9l].ƶGX2綣 :d1ڽ# -ϯ?ˡT'湻3O k>fp?F(\5nf2iXlbZʲ#GS %%15*A>Q3{`_-6_xڋݬ/sZ= A(S$cuu= VN[ mmrë".u{v~0Qzf~^WkV#iiU55׍{eh:⛅"Ĝ!U2tʖ(].^v$$_E?24y;$"$ T3Wx.$=8cq,-P6/Uaܗ3 ױu<窧 2u9Ӽu~ 9{;]k[c3 xFqYOOPBA]UHRH6dnj7^[ޠ&磻[$R9_PbkM}M*Ȱ= 6HBY圻6\EGoA[7 q#uD6k<+4Xz\w)"8UZ=)r(Ndn+/nn}zɗ>o|_ khR0u:plv+E znٴCO9V ,WMwT ;i *D`p#kg-XUʉׅ J'ZDL;:Q!\Z,Ҷn{Zގ N໧O9-a֩4 ^ᰁO/M%N<ʝ0e[kw*I"$R V)ji. "=F %fV1\@D9ן1h\pN|}'%Ly@rYO|ԜLJ7 D9(B%^ZԛU \ޏ  Mq;RVAx(-}z9vrλ&&cBpgL,&qi X6^`4~Bz\Ϛ^XcL#0b#&=G}߬tD.G|gɻȥ!}zGáɶZeIs3ؑpr)4 2#UpS,9 rQK6lQJ?Da8"fo(}gC*b?jtar7V9tiX&>qx^FnP)*ǩwn%=$oQ)5\GR4;򅹱U9#Ջ1!|^ѠA@}q  iRB'Bߨ=ff+E$tZE~Sko-%&{Wt.с`DuoQwó_h K劣DC,nhJNƦqt' 5;a4uK3i]k X蜸<61ZpKm]'a0m<;$+tQ[.oJt'.,E :btBGB32OC>9J "y.O [Օ䎖m< Ay,wBQJؼ6`72)$-#qB.tBoťxɭTZ3Ensت˗\׈Bfm%ѠX-[D4Ii[VC*iS)œDurci̟b dE.i#MoPcl B9qoĠG;dmJio8x7&~h_#Zw+wi" ^ _X'*x8˟R֟[/غWߎQ~`Gy'u|ÿbhybYmhJX1i痝Uq Fp뤢S! N&!2mj9QKJ ~e%Ĺ?+`5;&HbH|`Rlv6+xvE0Z\^rFړ?o69ZDZ?e =.K_M#ȡ f/4]/lǠw3\/ͨWa9gŹ>mLx'_t3u,{JQL=ߟ9s+3Z>B#(ggxӀX$uQXc.VXGVv)5w ZK gӽc.1@()D"0'nvW\[92W5T,KCʱE.+ywDp!Bq|_ŝ@1?1 I>0ASi=(ln"k5!J\V*݈S]Dg6yw5Q Rbm^N$EK)óˠQ\٦uGXdz]W8JZnfxBtӫٞ_-o}ھ wN!닸^=CT>.Q?p|wz P$9-;@ԠqD-KԭX[N ҮZex~|m s=>+Fc8؉βL໖uloNxIeUA1O~xe_dQKԠwdL67&e$"u0*tr_gXϵ٪sE 4- BEG]*^:u'Ixh<(apyignK˫ؚwWLoa]$-ĠpQ#H N4 FESIQM֛}G ]<irNũw&w ̎WyLcCY` 4lp$fY'ȫ)铉لXW?{G ˒C4 zWaNG[½#x ..z%[,* _?p3>UX? }ˤ1$1ׯx1PTcσys/jo|}M_nJ,(K G'T V]|{zռCj4mW]Ubhӎnjw>Sbm wqƄQq&ulA[FۆN!tCyK^'nґ)g=jqi(hT,0hc%x'mDjZXSOK妩P1 S龹nҺn1V=0+'GVYEx5P ƝK`,w=hmRy*f_c2煓aOG\ʊHQ·r[yD }R"؍8_9z`Bj958]wŘ{0`q(?hsALHeS5Nl%9<y0UsN%픷`kC.Z!6KKfppg 0׫É2)/fٌg4]W{'ⱸ{1g.ƌ+ij2tu;5eZƆr PO?iK6l1_.q/9rs:+>j<+B'ݡĐH Œttx䜈r>OLzB3@wh=i%KUg')4*Ðٝ~64Lm-,.<}Me]Y9Kc擳ܬp-O1K,D^ \Du|'^C WQ_"oDTYB*MS'W BpWIcrܠSTF LJƜKH(Ķ8 >ɡN?>?m}7/ 3޹y4R ~}"i+/-cZ3VM >t (>{^1Ims Ǟ #E>=M'y\ sk y?CDu -Ȍ#I=03 bKV NI?e>]Pj~{gpc1f?k3~qppoJKCcP8PFť3$uDd29[S L>FZj-)+ 1kח"jfX<,oPUX?8X-fg,71J-DuqX4I1br{dH8颅@Jy68rBvBBz5 3K񭜣ܰ=s#&Fzg<}zfbe. zbm;47p(hyI,DXH ׻{Ͼ%bbG&/iz9D"5$N=`qFʽG|\%.}G@%/rxUcn7ۗCr~gzG](F四7}sTj֣d+xF oJoxN`̜\ʩsk*%o23H.{6{}#Iho8{|e<|F,v$iaq_έO|㧧sa~Q]ɧz?,ro]lj}7W6_^b/^XvmՁTdC,w0,g*mw㣗ߵُ{/^5^wmԱ dq࿭ܽ"qY{h{GQjvD{/sd`F94v_;xQ5/DŽ۔gX>wo$Ǡ.Ni4n&^߸E/NOEh+h[9VLbΌ#I}s-LTic ;4w]p AhpQG/GRcN =.TMHgŮ^{TЉ#ן3"Wk;u2Еxu N}sۅ!$+d|+@~jXSѪι;Nr-2'c lql1l1qn+ ՞A?$s޲I̿i܋cR@5GA,PSU0X.e'7vp/x6f@pZLb~dOs“ vI;HT ,8-%jNj8Rq`qڐf#HiBq;@E9@@DwnPcǠrŇW( yǜF(GcuJO !tBcQs'3E=kĚHnG\arCՐDpH:w_s-FfJ\zJk3X>ثBxUXs8 M.%- V {6ُ9>|KP`bt%T9bk8f6a|Mvx98k6 \K%@'WI|Kw?*D}u$y)L:E#b6j$cQ}r.r-mQKF 2-FaSL [6;h^Co}w)xx7X[{o9i[5Z! P`&n MC-:1B3;M1WWI^I|KeΟ|̧mgT> nKK=a :o*PI*#Z4Fu*@r+G_ IJGg3|d77]P?c'R}'k(X-dC.9'.:i-f0Y 6/,gYغ+ {p_~>-[VK"+NRW+e !=1jKŮ6.2H@_ ⎅ ǻطkQwX5 He.(أKs":Np4?~Ϲ=-,?$DwZј(f Gg`c:Ptc_Մd5W!\4<14x[|Oݶ.Y]r䥞+~"[t @X<8}"W4FMm?Ǫ G(lŏ [3YPs%iE3,F/&6$x &XMBO/5J gT'HEL}ljq&ըܝ BOG>8` \Da6['T23׶ 5Ԇ6bTyoG6Ol-n{h+.aZ`ʹajjla~dWGeB[+DlF&9:n%;ё2~/A$mH`iVc3hUvp/bjQ*rb:5'u6*=;()^Z3?oo>MԂ):"װ 0Zlaǂ4t8|'K3FwFK]O=%MBSyld畀V¥1&,k=E=cUpʐ_KTau}}jQ|! ]hDmS-&3cPR/11P絩鈐Lc:7qb[FtPR֑ШIRFǧQ6N_1nة^pOY@,*^{snJ_ϗcܱvك.rln^IDanq,D>@]]DrN0YZj}m^$Z$5% mzpͅq)@MRx#|^^RwKMci>?7]Bѓڐ]. 8i;v֫W^l1cd9AsݹG=s0u]Ise,D WwB}rCzpv0`YgP=]Pzw5\\o;;ް )ЇS4ܣBK-\;a':|po('ƚS@MeG1CďPǞ(%\s=e^"^/}g y}!5G bPp?`._š vKk7mMGq(Sk>pimj(qy8 =KMQvrG ZP%5AJ @FV/>Y&"#6o~,}Ɏ:[hNhUj!_>>eAb7TO>:w4>r MJᢹ,[X{?TmY`@}Qj=M!. 5n浸Xj i/E}j9k>[>  .dRGRO 5"S'R)¯ɟ}&nC\O֞,$e !!k^wl=霤ayG<Ȋm{Y1?ۂFĵMi ʧc.Ƽ7@r#-,*(dԖp!R)av@^C%Y"*] ^yj[:vq6:j3k#!*H?Lt!Cy $:>8l{OsRm6OMA߱qڗ 6v U>Vu.$QG X ,غ K\޴ٗ /$# !kjr݃qw$`6ffawȄI8(!__;`ms};eYRc좔tk׬12i&'![=mZfs+AIQP9Fos&jLZEOqw9c`*2jCm }-?KuPY)Q< nk~-JUtZf'>{"?~A]`,v24cy0!h!%3,@B k8 <<]jvCb\alp|ӆίr=1ZX܂*@CSLT - TseT.w!\#3kP %+!8طr\<{On53v oɟdOP9<4mQZw!x [luԘ\￧.W&2Pu642gHlVBFΊ$Z Ǭ N& DҙB7@5SP-wVy"I_6g̐Jmپ-㺐^Kw=Kqtj[7na8ݟ"c%4Q1Xs-%_%k&O,9dPMy9{>z KU7Il7&QRSoehG×C¯N*폮 (o3 1sddqDl 3YWV[m֏.Q<e(rf@G% D˨pZu<9~-hqim=йXBp`[f[ɩ),'w^sU,s:s v$fwID;ti*Z o&0"I 4/7xTK ^ ?'>U<&?CΕF9ҘRؚ *R"y@QYWHbEDVLi ^?ЄYWs1!3LGX]WQu%ZE{A뷶k~Ϝ\~=XFp̲ Lwߛɐ l0{Q\w/N+4ABM"$/ -jY.:|LӶ]1/" uO;jK/(;M+Xx&#[Y~Lο3J5=h}c܁s 32%['k1夡r gu֓ZJŴ7֣pLt3sy]lBT3~J:APOʟvn_f^'Vna){/U'.6b:p`Wz-K-:J@fv,he9$c|AifOTNO]tC&Q!U&|\lP)qOKb܋"%KNacH L_elc헒#w؝)㯨)b*ie WwnMRfފ-$ݚmQ}pv:S(t)!sبL&Jdni#[&ݑB.BVn#;YP6~m(QK:x[6<}_Yl)Ȟ@i1CKm{*3G @W.FwFF]Q,4gOmuECN@gb i^o8RڃCʡٍ Ӥ!NLZs+\!6@0sb%J"kWzSpB)yp֠Nكj|K*r!SMS/lgaR1518,؋lXk&0qBR75>P/ɂnwPq9{Q <)0j%1Nj&Fd 4zIXP7SBߺqǪ_OW_8É߽۱#.Q36*Cy1@o]ʙdPHIɆ;BPQo&(Pճv(;ejZ(>kzPY}&λ>x-}dŅ_3:>j|(AŪZWo w㜁CZ kn~w}#|AuhoU׏ENImE#؟'>t~'7Wa_#0iDʉtryK|"kWeplW[X,`يO3# ޺?<&PCgnQƧڹЗF3< Z썝>>a7bKg2&)qS[ǭ: sM;[z-4L@v9)(HpU;8m@뷡 ]N,"Y팂j2kaP݁&FÇw^dMg"]Kp,聎ėRĉ 8caf{K^%1:h]CJΪA){ A%:*}['E^뼿ˍ1$my3üE䙁gzt_h!"Y ցghr&z쪫'̕Y8L)*7weضY&`,&z:nO׳_ncnHÐveCj:'LG>N #IC2Ӱ"=^|cj0^/ځNG])^8Q=FEpm5Jf_,& jRN+V 9[4fBE)JО&;x WG]/>)h(j!Hgc#dy(ssaAn}[U\Il J$As4* \"rWxeG ^yYMcXlފnnl[5BK"ר_(3+ᱸ wƲs:wIHJ۠U06lQno?E7f?ۼjPߎb픞Zvg=.*p>h;*n^wd?ʒQ , /M Mq^X.lxy?MY4za+QKÅ8Fby; ss߈h&>#!0eH4(xINǠ>{ӊ9xآĥ煺>'"/Li|xO8(w'>1Hփ&:})$Hk}+1uЧxnv<:әrHҩl<@Gk? o,L^D ,Lއ4}]Ëo,#V-`+@R?jׯsjUc"+׍gxXtWڴ[%և.&Jܽ9}!hsD7H{QID?=;FON"HoHdb_\R.5~dgwx/c-jJVq[]}*2 ۠EwǍ tұOT#^5c;ڊ6Wɉ8Z4 'ȸ+FZgEg*\bQ0zt lji}Q:,r[=T 3 u GIem`)mɰط3 .~,߶@7%I럷AdLL6гcTmžC#;>CPE]]i#+0D>,ԍT#k-cKq Kk $uj6j:p̱!NɃljJO . w#@%ÙׯrAu<žsE챓-rpaƽ.7 E*$ P[l}Ԥ;8 fjR`ۀaӫvzIƥ:Yd q{4X@]ʡh-hnW5^s+sR ?Ǎ&ft+U nJƚ)7B|:H0nL`4:0<Sbyy vd&,ơȂkq9:yJ~YS˼'-N!P?`Fۉ0Ѭ ~ٴXr!]7%JI$E?>=9yǗ2yucbz'@v:&62!=g9"yl)䯣4eDGp㹁O";OP4:ivܽ;'4|.-2H\}G/5g{į͋V[>u@ u= ]E^<Φ6IAMv(j|ժ EXV\ҥ p` :<#v[XkɅv=0=]G8>XQmݠ~>s /'*Վg,,zJ,&0#ǽdR=5n~q;=GGI WYkxСVφpI(EH \u^B~./$Kț+G0(`v>QOjW+z)Ĉ:i,%:jaJȓLQ/0>-Tgb K{UٓYmsǭ 29*J9Vm7jf~K^I<Q1!Zu$*$V4 Vp D0#S|hO,Ecr:/7VBmT| {DVpw[\}5 ecĒ7XN9?vҍ@3ql 'Չ3VfNEa%0eU˘ ,L n*٨#YɿpIhԒXN#2xH)3Cu+DdfP2B }E:ȝ qzhT<tq8ҧc&IAo8OfO>mUJ} 'si$x%t}d ptHf?꼳777n~Oo~曛\Nf+EC6c(X v'Ab$n28X4mK,o"6B݄uDBtz$WX:(>q3JY@.3@+Xp{rbUåU M>_"Y4{ok?[lKlvM},!Cb_"⨭h+!{ ĭ>) ӒESTAn\]źTfZ))2JPpsX?v N&lbgN[Mb/4`W=c"h|Lq+wۢvj otеx,lrrڼǂޢ/5>~5– \ :dQ$zjDQ߃s@;[\S6 Y)_ѰL +8V8P@8|!(N]e,ʦc|jIS';` ^*ۧh̤ VcJ(:K3][xl**JQ?C_,yYE>>b=Gz93{TuDj699yuy16j;%%ݲ_*rTDL.AS-O|J2`ڞ}vňS9^i%ngAB(H3.8L@*1v_Y^TݜZs1?r΅j!2t1nf-:PSv@Oذ켸tA$m p46e?ٺhU⁨QA5HWs0,|ODU6KB,S/&f 6 QJ0fF&>4[B aw׉]DY ٍ uX5lХQqwz^>\\a[Nk,琱6)X*ópܟ?ZUe7xi'Jf;4Eަv.Q| jU~Tೈ~||,PqXh`$Ԡk48GՈׇ3m1\-:d?%$ucBcC±@ٖ=‚  -j t@lzS=O_==J7{Zcxem+ _̔wH$'$gxR9;/y/iiN'M e5-B{N?@اjM=ZN^&쇾OkP41I9_@\@DN6 F&ecwkfփ$F^F"+IKuZ2[BVuֆBtUxWv7c~0vg8u{BW H K bxyv[#1RtqRɀbw6ۣ\:X7 )(,޸(l0@r8!d  k>>VϢ^]c5#6$4*D|LB[Z]a p=fR+F,OԲ'YcmJns jmJ~ZhWLl:cLJx?5?X{OCFgڬiJ'Ǿ ֺGD%Be ~bV"ww%|7| *PREo,w(HvZtd6>$3x5  Ո$[U#1]:Ts!DN/|5r Ǵtd6ACwdgzSlR]g١HT嘊 6+~BONnh$,ζf/<@'O&\HRMg~f[[S!mjF9T͘Τ?K+ڡl6Xă$db\xb&Lf̉?k]gE+.h.Go,p"ٟWa>;Gu),2 &/* Њs#ˆ#871)i=tij@U]֍ &=PƣMXM'K4x)3*m'B?^nIIAoMʞuԍ*FJ} 6tY;lIR+KSU Ą𢋪/3t⌨UkQ lq_Y.n#dQ+=l +=$K3Y wӟF KM?O>3v@ w*$>@ )9F`NY@F#DL%NΚ/رQjasO;묃V|:0z frᷣC2bg]u|0lHucW/y<nt oJCQp3Z4.4ff0Ac2< .$I)sjH=6x3K+ˡecD?fB}1ޘMwZGQ@E'~XĪϲ& yy1:EOl].q#'|ɄH}|9*&p]C\þU)MU3 N}CJt%*mXy`>4KwOn܃+g 368S rpp0>^ȽH} Y[al} /^gHl@t[,\KE11 θ+*·;ׯ^n^}4-e: q:`)%R67}:s_aqm6Xd3Х˄%.}@C)PŜ<}NtI(Ӝ; (m(Lh6U@u Oy<٘Gv۽ Ʋr*s'!wigS0PDcD,"*TW~A^`K$xy<|mgfKy=I ]3UrS+D2+p,0:2ԦX51. Kh8(GtPS gK}(fRt&(vQ \_ߺ%x-:ssC0c(B@k{X(o?)c|_C$q|5{R¤_'MASK=8)Qdb}fΈuI_S\FQk`\I::&W:;b2w^8ub{0eo Aٵc*I4Mɫ /k9o>` 'Dxj"ܺE $?d'+92i${޷8e !G)Aa+`[2㣧x xD;ūXΠbLH4xxu<~ۺӳ0/͹*‘l;-v6TOQg/d m;A}ޫU{L VPXR?9v]:r|'}DX }Zqǧg;VwW%ilVeoF PX OG`1{/ ]T :r- = ?'|N%U%@6`]L"60|HC[õK]6o!ob$y s7kҭ?q-PV}_r7bw~ī8hEZ Q._z7Bi7=^C뉚T'k,+Rf/W) 8'2q$F@SF< YPKOjrg\7PKy.F8angular-1.3.9/docs/components/jquery-2.1.1/jquery.min.js̽i[W| P{ ]cw ;KCi0BI;V ts^L5=/x1-$@kbr ^-ͦcW|<!߰A]4}݋b*F__nĒˬ Q+*[ oh!8~4305ūM.~*ΧGPn |4N jƭ8)оyvѡ%ZajXbZ‘>wx/i"ӟ*и. $9HP ˝I8/61ﵮ^;H^˺'J+M&JmIBnY2g"ǸQZQi1ShM>;{luv8; ;웼Vo5!fκ /oدeDvSj7kgg7Mǿ>47>Z6䬶oi1pY^ϛn7;7XNg].7և L]gdG_lF/\|2{N|8s7ۧPX\?u^jk:d[*YH{#1h/I/1OS|泿T<I ͛o@?|˯^m Y7 7[Z֊l5qPK2^χ0$x2 ؽ>ި 7fF} .DmLWlyjʬ(ΠT}յY*֣zfTN:; ݵdZo_#`Ve?cz ZCwݻ^ƣ'쟼7>,vnϖ3'ٯ?a_R, ʺI}мq;EK/_ >^#D*O?si% 뾌NxTևGO?}Ύ~7X珟b;Y->~%_@MײUlxىzBHU~kKUr/jn{BdAE`> =^FO$Jww!R$B+2k +gsc7{I^w8/55Xh֓1Cb#༻R&E1_⿹w/,08b4*L|>ؓ՘5{]_ ox' s`6!e7=IgG$QO/Y{٘ԇͯ@no#' ϶Fq>7CN?h#>⛬^-eؽbMP,ecj/E~Cг=4I@=/=Jl<XV_mll*yEzȣZ;\Dak?/kuv[s*MOi'__j]Y^l^{{_Zjv÷ɬmhQ7D'W͡9^{gC::""~+$|KLMfDoxR/m6gGF%BK6+E3ybNo!2f`FkwpUotԄw;y+CCʦuĞK{f5ëWnj$q\t3]`P$ {kĮ$ ɭYg``qĪ<-}=s+tKTq`ο_|%z˿X= az'9jdA0b҇`CbG{'(w5Y =@-\{r4{")|! ,rc-aWWyhX: V9vFԳ=kվ|+<6'X~/aE~_wSqE Ǥ < /t~p C\xq?;lޞpآίa"$P<<5vEuT9Ь'3BמAwlGݏN=i$ܮeCrVoSQ7# y,\tt$HD% l[\>uB ~E3ءSK8T,Im & pbOkw]NbQ6( zDX)JѬ{g[gO)aD iPniN ŖڵjcB,Cah,h:Z6 /qO'̇hHLG92ZAYh6gvoĦ}WR7W!>Oց#|ZPRMoP.fג|8qx~ӟN.KE{nBcSѓv/|؉coʭnMN0aY V[[ (ZCSU4@Ŏ'嶶.UT>7  xDɦ&FIqdIJ{ i)/3F <˅/VڀhY̮mQVk<ΚyV?;|oEy_X.\Z%j^odEH\rwr|cb`KgGf5w{+P-:t4?,iӊYy 3V2HV=#^=ÖyX t&#UvtE¥v~u2a9&y [B]xM #zׅ}QH2.p8?8Ⱦ6!-mh|'c;Bךֆ|7[shpW5?b7,1:JD '|ϼC`l[>#ZU<}b+.pYCjgβoVo[-'+ x 8KؠK=IӿN>y %$ tbqH'Ve alfƦ' ay?dG`)boo4V+a7sCH:y@ `M>̔7" p0Fzsx۪AA-8eQY@KY6(B_z;FA BôMYVe쉻A C3!i'LE}M6$R'd8)ᡉIMi-03YCwlz(l[1!,܁%̫Ib/iz6A0|MH]RHv0~W_\+^%Jr;^n8@47i iCi W[Ҿl Z dd>D/FLJwϱ1SCYW汜tӛ' 8O:Sd?WVbE?v]?e?9[DӰ6J8T9an&fAeqMPG0]Djh(lNk8c;Pyb6Ib+롗ӗ7o-n.-iS:д'流UEտZWn&n% !Sׅe-cЋu0CKFē0O:>?>鴺O;34@]cY W}LIH.rG{ tC[el-&b.iA?ՖK*z_ nU_OGLF;AqlzOQ=͘|bLvchY ø7A UZgm-GqBcΪMg|q} G(,[^u mТ~Cmzl]ARԀ"g!_g5~R…|1!$l'(P} [f}ђ [SL_ֈnG3%` "чyken."h?𠆇AyFEL+IR{M1=Z"ur_j>-I :K1VJPc>Qp6rTWUb(|hw'D2ŝ ĀUx-`Oۗa[45i`3WR#%D4O{Og 6Ny{ԺJz +o0y~WDKBz#[,+7{{oaXO;8㥠i)cp#pmM2ybu{{N5}d~9q11dc m}j솮?zCһFh;. "ΘkHi H7+WE/{dХ H&Wds7TǑ{FHj׀Ð _xSq tK$TLeI_49JJ0O@enro1#D`?vwF,MdFHy`5ogcŹg>QxWu^kR^ :6H, Cs)_Ă'[NFQqB=2R\C%QB6nF ƿQ>!;Y79Y qbNHM?a-%zŴ6All*EBdR#f*_T `ّ"0 AXbLqZlh(戚SKEw! %._Zp;)r;ñd/ Sb_Ь-{&K,:-w?$5+R0aK-IM1 #Qpm·"Ih rtqj_MC23B)[z9&)YٟKiaZvc4F.rh@rd5.m=^y.MIPiO2Z0wb=AQ_ͦMڜ2hKnq㱥jwO1/FеH}{m{2O1'Xb6NY0U{ѥ'>Vgm0hH9 .nf𬷽dhBaqeVQ`2W!o^ר^i{3_ t=F>^''h-{f ->tz; 뼻Ij,r˔˞'y!3ibDTH !EuBnW[!!0yP'/HfYAibӷ-`{A 'lz)l/fD[d!,47 &:h$6.Md4[ײӠb^Kw?!K@WD1? %"}Ah[Q'7D zg#)!1p8.Q-Mk68{@]liar_=B /QؐRu[ƕ b`/6sq(hh;sqhjTktjjV, ꖍ0hwҘ[#+Dصd79QMH yٽcIbf vW3ZzLSI6aJf8`Jk$`ĝ^ŝp#B§Y&T\v1')hLcFo2!渋#*k::U@ЖD&FWQ' CCx !шAêdО]+tO[Oy{2?$&\ʙ"*q-Ga4Ǧ]a^96d&+uIlW$Vo}6hV56J79/21Hdi<6aùt)4tE{ƕ+5E}%{ u@1foo{_Ttt\[eXa(k^Y>b~aGcthJ FE𑑏h.O MXI. /A+@"``;PیId @Gr%pr,/yE{4_E uȪ$6&ɷb>ȗF s_4H8L\~r:IǤv6\j&N`9>Mo}P1SޤR#]"kF0pðKq E\G{>F kR ަmFޞ@79( BSw6.c%FXB{#<^~4VARWS<+kD\ W0kFpA 6o'+ ׇ$'] 'JW 3z ͸n_tiJ|L#TbR@ U}HBntlSHA|AUƋﴯk[ZWf]+h݂AK?_\>\ 1DPZNu.c W,Pswtf(KV:Ar}01^W-Oᚷ7t]H*UE=ޒxDnzP bȤN^3%.hޗ٫0jVq1Wɀ `][.4`JZR&8SM&ujf{bdy3ij0oj2jaʵibƉ qK^[{A\ܻG8*V{)hA  Tn"_EjH?߂G~Ը+#aYs.= 'uĄ C(y3 OZxvt7<>lY0<~4a^"W&"Uؼ{iU%*Z WʏМ-2;Q2sYMB+U\'bd.qp`,[I'ΰL*fB_{)BTZ5~d Y^@aZлr̞5B0)IpvUc%Tn%}8{Xtx`kͳGn_AH5 <JO r{9:mʏ]qb{_8 SC]](EDob@#K@8(\|—"ԟQ(iiOrㆨgPp+s%)rl>3 Q`QbQupj;\oKR}JL8;tձ)ܹ^7P%O^6LcUC6:졘0>)[qByef3!S; S :Yo.oRUnw)}ټ{ ՚JpE(E;S CpK- p^6!S(QC:EY쁰Si~ՐvWk/|s{hݐQ0)#I$pj_xsr\(#NWg#QN'4EO>K|:B ⹟;r\+ l5&h<"ޭ#Il_}&wȇ[sIh6F s* f"7܃`OOb0;yvD(\mT |G$f$abY%gXb}Q <) :Y(qP /BIɁMI4'2 rl4zC.wWzJFIdlh F %"諶q(L>< m>`Uݒ2H;CĎ|!0 ]:T/HV1vKl"JTR,l1⠟LF:YOU;}cPѿ0y"쏖D#zW_68rC|={OPkާ:?_J  |fb42E^QQib>tAE^%27ן[Ln ԼIo9eIN iߋ},$~LylfLSrBwTiYn'kV[A΀9IF7EMkQ_ A%(D1,"Jez?<+j+mUw*[B^v)t g4T&(^C/uZwf"vN'T8caēvFHⷞ&A O`S9go\ape *)ķD)A%akä3r["6!ڀl?{+-!eJSQ #e,b),1I&Jm+c-_)ȆLBᩢNFv\w!n Ů:j#zR]~wM9'6K՗Q 4;PyzJQx3 m %Gihlw"#SUsˠthOY::0Ya˛{uQ6:9}p7=lo[]@e | W]#0n>}r$OBT_8 cw^ڙfYm؝L;Jl}m2@ap\.7 u:J-jے!ӛT!5ߍ8ePgaaga5R62Q9>#mHC4NNJvʖB* P%à¬38 dh,T_"?ۤ7\DMZқ&,g5A}c)P$j|6rT/DOkYQ98] hwz<FP*;P#z4-0,aB&Q֓[VB`4vr?fǿt;| won S֥*[\KaiWp9S9>6 Y2?T2-,a | *+mCHKA(K,qLmtI=6㾮@/lfAy^cBeA|rn*ġVc~U!":>= hN{LfAGEpѓ┈F'JhJ Y,ۋ)!VfΕ<'E,1FOKwu9ug/l;ˈ5uG ꚎòZUT1@ Wfx)drW@b]>"o,0 T}G_eeGj"6.,SJ>ny.W)x5ֵPS29o$yoطΉn}y۟͟S'/v [W(U*?:F\jP65HHW'X,IuUqJg`CYIq<p?oI[OSRHgo#޼ilZ z*Wy,=:2;ڀ/YXI^.}*m^'%.VLf2X4ueiRazPխ`eY&!%AxI9)_}"jdK) >si< 0CPBc8pjeuj@M BWw\%q5y~h-́X"︉[_sa۷9)4J&0Ͱ(G| "(tOש(F>XG>fܒmܷso-jH }"KZcH+ [/H4]^dL.3Rft["'mKl5`t_j{x;Ÿ4;^r>?wP7Ͳެ"(CUG5 2 LP=f!̔EKrvFL92v%clJ8M-Pr0$Kn acTԤv論K$=Rm~ GbkܒOܰ4 3`;&vm.N_DA%}2[mz[ }W 9a3:&ԂDo< ſ̺N*0]~O<ٮ_"^|Yz\*+KB (JWFAdp0Hu *+!~bvibh?HҵbqY EwdDž`S1«>~>${b)5j 5  ڔ6bQ[ޱd-yɡL)'E-+. 5Zh-=d@:':'k;t~ʖdع7]S?Ҟ)Sc9l>w ;]6`;ep8D%3`G2V캱0'o_sBΎ<4Jk<*&Fh)7Uӻ;{Γߎ^wBIwtPvϟ$/TQuwHS&AXB8 6/3GJ8k`(R]D/@5`RIv!r3jð֓gZj -SĆs $B 1d$;9FÎ8c2;c^bUr?¿RBFfTZ([' awpJ0`UkItqy~aVV~~QJUB'Kvp:[H-VhnDFU=~3ny ;@P33CV!Hr;(!q[7 w09@:|pI!O1=eYH5**aӁEDcqx2Y3HFYXE(VEz%+(]tEU 8mwÌS(M둤_>V WBuɢfSQJ7>.&&{'Wa]}Ub sqo0%gpgv /HjW^_B3ˠ$MoOs'.CpG2>3Y|÷cE.0**&"Kc~2qx  Uof* |ȢoT}'$ç#-2+!\J Zlܹtt8E +13-PЎsR1o!c_s 6X.$_cm,D;:\ȇPL(h*yQmD7>w_R N Q&y"ING…]1n+(Z*0`>kW|k?ZVX R.`f"(x C }Єx ْG@ O5GN.@(% bhI UQ2J("}6 VZIFǎOk&Dd)!5 #& /@+J2X78<x1 8\ή@1(ʚdo[BO޸ a=P@ȟK9hDŮB%dFoEz&@JGZ6 P As{i 5<4M˵ <1*[in)S )"kd2O,ٶrQa>Z3IIܤYSaʅK!쁦PoETj]yQt$Ӫ]T|2'x ˭n$;t!VE2BTpQd}EmUw)@uV֌; ʗM: ~+#R[&>lN~+pnNj$1nYP>7^7| (3Ƙ̠xlֺߊ;=g+uʽ;bG1CA^b(ގI5vgELJ;8xkA#qH(Ky_ccsrDvxz ;`#H̚ zNZdž*veě2w\ 񗬕40nllgKNӝi??Wygp <<00O 8es#cD='`Aؿя`rץ2t*sgr㈣-MVzfR? Ҹh|5Q8mzDUB Uc?!ұFv )&w':WU&|N8y=5}B:NnG>r%Eg ϯ K]P'#V'6fGŘ`mjT4WhlP/:t;+Y.ӊ]r&gyVؼUġj;]о9M,&G цZI3sF9'dLg5{c2Ѝq1#}w~TMߩ],H'gKdU7ε.7s}`om'"^zG\ìJǪX wz6 * e4"+YwBbwk=n 4ω]ޏ@7gR.o=WzVD믇,fFMЂ@ڦȽ)p1TSlq^MQ*pym զ_i-nMY½Q_jWPᣲ r=抔ݟ*]{NZl>$J];抸=pC& ٝ l hVĄI*K'BLϰRmG[yJp u\YV.ڢֲzGqBYFƭ%Oư+cZնg@Q ,v.tjvM͢=R;GF2i +AYE{GfL'k G1E$-T==YFK=זlppuP+{ӺC6Dpˊ ;omF8Xaul~ e8g:SXN*Gˡ%T4 N/kcwT[F)a */)<UK>ЉwOstp3;>8>)Z9Cbb\'=%':c B!CW%+U-FR#O w]|V)"*rtBC@ۼw!frcx x-{Wij~&,~b< HFs)KʐbL|DB҅++k?.T!$E @T :NHŽ p{RF )*U>ѝh Z񦪟DSj% /Rqf' jk\z[`OnBnUBpI4*H9a3m6"EГy#@޶ۏ`˟2ӟJyRVx0iԗ4wnTZrl!nU_Lj+ι4u b;w'ԿXe%Hf$!O~A+GJ K|!W6dH)܈H3v$d|h!mNrxwT Q+.cZ#~]YVŖE聋8q~zq=JiaߝYVPq"w:+Z؜xDM} [[sI1 : ңc !ێ5 U)9顙װ#'3pj 'O.Fb==%Lj34 dG4T;LO6dWǁso Zb_GS@,5@8lU0bTQu i_]sFʀ8@NsX\윳v!R9* )'bv/)m\ +2CTyMq[ׄi_(*\>6;`G&Kw(m{u@e0'Jy]Juk7ʮ ֝?pKqn_W0d>7ӛ_-Gv38.7!{yKl ;g[O"=CrZqV`~uw6|0@%{lö q^H840p#ĺ_,VSF\^ d:pJz߶;5H 1K&O:%"8,G`P!`nGDvsHb1@d.e] RJ_L JZijA1iIFmx:bz:KcT}3rӠI[$(1 GcEK}-+E'JSH+  V0z9xݒmpNzbѠ֥%tYP{$1.X;33UEn2R1(&OCĉrvQoQ\9;s; ? ˏ;@$zGmk${GEp: 81BYļ$&+F)Q8D1=CvkxA M2C=cf?A N6^"Uau9ʖ5~/cjSRCSӃcr}|ϕ2+UcB\]υ"w ;Pd>WP+_: eiw6))ɺ<\UH'Ƞ~׬mbC:ч*U.)j B%iU>,+GJ$GsƐ $aF*md/ 6|Ma;ttcTL%Qwǣ11U:Qd/FH0PRH DyՅ,j~X{()l{ fBZE5W'E:7sBL±,e͚(ό׌s Ӎ0i4fzA.%  ݒy9[tH٦xt:a,u>>] Lw//:G ~3vUiU%ωgqNHQҊQ,fSƉkok7OO*a)$#11bЌѮҁ۵2Dżx ѓL#&!`-/1 r~?,rRX׶Ӊj)Ġ%tcF;Wq+!X  ꇔD { =HH% sKFf s#6sØ>(v]Kv5H@ę/INaTc? 7]N&.*37Pƈe@4 *fCU!D].&[*\1R{6-.8x盯0K#3XJn"*!|hƓ^ #R~XK14[gr!?)'GGZo{uJsyŗs!=a"ZV 礼si4:P"oy%i0}Rd#gyAYxeV7pd%q%YՑ^9*lKߦ V0Js@ꃖ H '͚AHW>:tx2ϟ6jԤ})_V c݃.]U m;Y>Jw(^Ws;euE,ܨŶuH.{-Od6vIcC2#._KL'S6 Ȏxj?䋣S`w4ًܹ qtYa aCMysH4+A wUHUs9= nc s3("A~8tʋ_ZRP؉~MXq-/ݷ) ڭ]S" (]HX _8l2S?9( P Z@etQ/ 603% XM)";yu.KMw@ ;GZˑ0a"(*҄82a܊:҈w|9Cz|4JMѵ-{m*COAz]'S(d߅S)щ o~0jy ܐqT3y&]d[Gs(/R]Kq8­h隋s!7 \#3 Sk;{=vUcp"R2=#֦~F1+űEg71<$5-\"u溟3y7Q1 [5D]w4p]*9b_ƖuiQmVX[~ٸxa+}VAt5fڷjb%]IDkP PKkVn7) i]u[yܠ_9!,TpOܼ] 5*yֽ^%u(Mvg5>Tyiq^aӇ;|3at> 2<weZ~t2|7 Bw!oT0Z^ŷV 7,QGBoe^B iUu.2`/8w7AHqwT@Aԥҫ#?XcƓ} N(}˾1`Z$y-BljlZZͺ3q;+KDSA 15lG*&vfw4-)Ϭ"6Z'8~8Ӥ<)ɸ"2; Aԭq]MI8=^~b!B7>|–tqi-=Ǭn6CiQA~nO4EQ+`=sLdwB7·\@r)d8*Ys_dy+] n8U,<᫐ĵO/-=oGЃ,qC;(h(=851E¯`n g@ AĀD?eE9.J 4#vı:Z? @}tC\*QWeĒءfS\P":Q91P^YUhVېH 9+ PxA캽b#/m#Ox$em4o۽#~^Ur Jǧ݋V *< ` $gMޞ물)YA.E 9*[#5+ }ͷ*%ؼB5I~ڐ_L] ۖX>QH '?OvXq5t4a7bԼCRGFjP]4Aԁ}!Z]ݢNr>Lf% nD鑬 AA'"YP0;~h$R񶵹q!޺d)jZL;1Etx_=K!o(̀i_@=2bdbID0sALX^v!!.^4F9ﲥuċ3ȨdOXnʠ%#Cqwwı/ .D+q?ViK߲ˈ'hDx #TJJ\aw 86cXaxX9" in씀Y9!36| 6{۔AIi1cu$ad7Eٞg?p$qItX^.DӵuhGL8 ciDn!&f#&jaHvtߟOwo~>cfQLxfИSY.JN\m*4F"DO-TrH]kډ]!乊22eJhZ" :@%JI,H74^e&h 5@(An|&]@GM@x[{Ъ^E+/SAQ^DY{}H+*+*/ל.®[c.MGZ )W,do PO)?,e̲$bДuLiUNwh.dW7TNTA7'I4/Tpnl=ғ$"U,Sy-IyҦ8Z}0i IyL3(St 59Q^Qwɬrvyիs_nXnٱ+i쑷l~ju]`E2L1_1IG|$\QH\$~쭘nXɩb޹i{w擕qr%k^.<uidy^!eU'JL"=HD=. D_ct#9̮60eO`3X`η L5lUْՒd˟([Q TǕ@"׺(Ơ *A32<[/oI ,WPoZf8Pwl5(WSq%{RG=K>TUYvS߹V~#']bI{GluC8T& 'H5uH%UP]-¨o1 qn9CG@0s?-Q'̚npil wsMUPޯfH+]H*y`-#rulihR򉄆Ѭ#4_FlцDyي#al%,i1R:/ hXe@_‸(E@S ~<Ö$|CMp7Du5'B2_r,_eDN$rhA҆ǯFAѲ8o5|]ON^e.R !<[9'ݵd]!Yq$DKltAvcڎ.*<)|b^q!/>%ʙϤvF됽.G&Bv*St;k_(^{oa.NjEڳ-GEZ݈ 7Ͻ쟽 -vVhZep%yI*` ~Ifb#F6ŃPB9xц cWT,޳wK(bTq= 2ʪ Uem`|D]lǒ)f@P E_tx/3Z'*zrRa韽τnasXBN ٍy9nmY_Kw1d& _[jar9KR⫛WG4[Yb S\͹}m8P{ÂV 瘢Bl  kmx9yJ n_1 0, 4lnk/c"/f3J, Y$B:Q! > +qQ?qKnHp1lF?( E^_}xB5'#u':pAZd*f#rb:Jw>!O7<\/@jKK#}1%3;%=`ྂSDc8pZNLJ섲>dž HQD:jOc+@ں깼s޻\BC+k@ LNm?0+_wyʂgطCd^!x_'GPHґp:HBwb7=h39=wNlABQvA;څ=UNE(ZO+ aB{$Y"ZT3~O[Q@ h>5bw%Q1]GJ#@2`_>RE3)D&Ի(Bl!$α 7dAגԗȔŪDg]nV8_q-{#w'\ˉV6x*,̧\*I" 8ȹskZ4VLc/42nn%f{:.8ZՐId.: IEMN Wc$fA=RBj-ԍmƅrE]"dŰfړ'#lIruNpC#X9 ߍM09  l=5Л2uGKBpg$NO0X*;|j!.]ogT{%|ٝK'" -~ed SBzcovGgq'5Z KIx;MZwCt]]_bJшv%a^وlgw׽JzZ%` 'vjKGUtޯ8zHfYǖ:1l2#'%qxJ^(BV mXF+ ~٤_Nj;U>Oh a.!<]Ϥ*W>>Й4n7lXBTm+M;ީV^px%+Pi2#BϺ=~ uii ^~DX0(z,oM}F]LVBT]u=Jn2þ4 ]N{mx)}%U:P8 La[ E:>`>fU}5O'&Ԕ'cYՊ~6g#OU[{Ưy'ل[pIȝUq4cgƕdE>L,9HtŚN @"ys RSS.S۷rٗEyf;doℯI w1,(5]ܒOk7kjJ?>Z}8SƓHV\Qư@N{ >Z2}p!nQg,g2kK$~KL~fx )N6fXmEP+J]eI0uo?L)*RFWwU]3YGpYq, "h춤F~&8WKfpp ɺ5Q:"3JΈ)OMugd:[% hpyI(- JhZq_U1@!OCi;e.$B@jZUkJ^2vd[u BIAƇ`2 )c}_tȦuw@m3* ]M[gP(+yZWiiY_?0Xܿݽ0^ᬏaB7j~foE0K[re'EKw(a6t1-T-Ii(Z[Ov;)N VGw{RWoA[G\a0XJ vj6l3}[6S-M|KC(xx!@J3];ĪOt:}~.N8o]fYvXŪyY `k=CW;ٓb 7DCգ!( Jl )6v^.zTwd>;hwTnXVu^!}ma{0b¥>DvCH '^~86-hRNPhiQRytweCoBr:oЬuU)t9q0sHD7SeȄQO>F @2OiK/࢏[a/yuxK.)LCyla\jb7U坎/TSs';bkNQ¤^bK`2nx )iL0p|dg7hMBZOﰯK7M\GXG'*@ֆb/ H X4OB5oAP @K8 tgʾA9%?SdEyBl](T-^ʉ\suKD.2д(o^d>GJٺyq۠~ _v%#eǷ_ %J(UyS޶{/bܫ36לq бV)|Nuh#?p4]ˮڨ$Oj#@kTu =`{$tA7! _g72>P&Eέ6X|"`Eq۾2aX.x崛e٦PlߢZCt ",],㌄c&Jʠz}+Rj%ϧCǀIyBR\-HcO`_:]wA_:Η-uw"}pc8'ȥ",i_BژUITKRƼ ,L@qS_%ko=x'A/ b nq_Uv!@6 ,+b)z]49?"bd5=E,2Cm/ "Qs }O Q±g}&pεu1 B`WmKB[²܍HHX+13tQULߩlm¢EpZf]=XwBZp9H[@8t !F&v8ʏ=~L.IfZ~ԳmCu- \m*8.oNq\n*'Ԡ1}PA:/'!6ꈓILAw*=AIuqU=U +Kpq A:7c1DZfrJԇ/'=9KHfj&ڰ- 7vC$<6 FkyUν!g.% WhEC~V `l>ؓ>\ @7? g B?Y\z7ԑDvx5v•OE7:*BC!t$`/v`CilE?Ne8KL烝4D-}&cROi<88Om`HzMH`E!XuAd@ E쨼T(#M `qM"@r"rű㱁-ʤKFzP̫5,Rg}F.(_cq{/M'sO½&=t_0XG1D'*|&9`-X}?$v;reH+vw`dP+%KrkƬUJ6Okzێ$w_tVmoCzB~zhfP=Xe sR1]HN2LB66|c"fѐ:O@4%2i蛵q+KS2[-1X,qܪѱ~ؿͅA@KsҷjX(QE̊Z9S"ybj\t;&yd2f3 bٱgb&A1 G`~HXDlIa}uz-nyV@MЯKrD55oT5tx)p *9C93pceh๡~ԜݬePq/8' /:.n~4:'waT:$Zh@kmӡRNw="~~Ydw1d@QO5֪jlx(l^)?ތso,HV8R3?u N'Pn7[R]4+^`R`0->߀-߸Svzhӟ̼5xjWVbr.w5Ȩ8/!x''7u]naqK``YڮO?&;- awͰ+Og~J+Ydl*ebl\6gxSRn@j~ӑ 7Nk GWF"cUȷGs{U EnkњQ@<5 5!q(rI+-N3O;C LY&dLu>}Y0?]#(N?f 3IicV#9($P~TWXe QC%9>dR6- ijm\YNqve8M@2tMV!N)esF-T1ٝC3F@DΤJTf8X*Ga"%A*7vACOV卄J[+8ѭǂu\e ;9&Y;*HB9RgRV&ƁH@`y@]WFnGUfI(O6(,gH92#aёl?yaWhG(?xd3tx8M3JkxmPg$MU!wثR;vιŻnɵDuHj-p$giJ9~k ÚQ: _ݏǮwT][[X!>FӠTe 'շѶ#՝y,J-'dnG%w @>#skIav$RoQy< Ug0M) B}2jl,`VuXGFqg%}(J0Fh4Fi-2wFHua0Ӊ̥n"#CՕQGeB b3VL)vi,Q)#`|ޓ1$&;4ej0u3VoHm&ǃ;v9iU^S>YufǗw=0f<3jo\Ubv@uiـXy=Ϫ_ {\",C~#t6$$|fv)Y]6)!ǐӀ7aSJ⿜A_ǧ&$i7T7絡lv h,Ws/7hߢrE&nnUacҟǞ]wl\ ;#LU2֛[lA=i#sV P$W?/5J6gspxղ,k[M*ў") JkRpy=2@ Тꢞ $8O 3I:[&MK*7U>@smMpΚfո`-Hd2;'FYgSBD 3'd?Dބ5N {Uq N.us3Q szy}(LO0ͨӈ ՗+M5zTE@ 0U;bpUn& TLԠKI;uiux%Y i;i O| QJ0h>ZQTj- c֊ (vSӳv ~SF_`͡BԏgZǜ]Tl?)(3o褑^zڴ**C\WqWG#l֤/ɪaփnMYӼBC:nf.R :*38RT&d;e%z;T W>Uѧ53.%Nu1yD)Il9n/E 2wΞz~BV40mA '1gT,MoXA Z.6]ӧ9\Τtn# p֣B<&1m i&U`݌,z _jtkj>.jRGZ;u-YaҔCCH+ tp =m3wbL%J)6Tز̶WcgŹS<'nv\ l*p)Nf,I zR:U_toD JfV}O=c_y W=Ĩlriܞ" Ns|]QW 9{R]D~rڌ~\P'Ћi>C}s(".:trUS1o@/&g1lκָB١,i~q +tS K|_?:oh{3 Ddst4+5agG?OeK:;BUŮa+h3nx28)&B Y}^%zr좙? Xİ5[/gFpޜO^u'wT-a ^/(}w4߾.,贞?^] 5#|XN߸R![#pG=*.hfOUܫ7~e~sACڣnw_j:Q6OH|chmTt^4< 6ax62cR"W|y(G ѫk[Ix HK~ ТSF)ԃYfC#pXP<'S8ⴚӓVO_/5Aex-1BHRhj,"FҭK]jLZ*d:_u>N τV1XWѺҵ)79ni!2&U#hV\-whA/\W MTll B;jyրycD 9Bt]dx[4bof`V5G1s\J,lHahI,KXՄkPJQBM6">l=D&?5h;^ @BG r!F ,&W97'\Yq*2ޙy~p$b2!Ĉ`"9 >0H!7rf_Q7>ZHeUpXKiP lT2): UR 4ߦ7ip@Nm !i\nɿF?(Rb%p ?" -GcT)W``rO76IBLQ sgf֖ \,bQPgmiQ: \(ZC/fDr("z#)2䮂%0Jp)\]BgH|1I}Lƞ l<%u-J`mfHد1\G Zr2Gzwy1ǂy u7Ⱥ::Fō*3~1koFؚF =W \~008xl<+.rTJNP#٫kHշҵl gOL"MBs[ 7$5wBP(/v}A. 97j z1d7ɸX-fj8-?^&adԉp\Zbu hOQ r4nyVA rYRX~06‘)W!WB|7)k6|I15A*)yU\:j&X}V @N^iЫ齂]L+9Y2S j 02{a ybOޚk+ZļI1$7BrH8LR31v݈tBɲ2.e)Bؙ]1AOz$O*ET072i6 9K2oְϦH ^bCup ܋,&Sr)B[Ɇ"Cc(^(ͻȃ/K q> Z"QsoX{Zi%'?7(uqa$ y A耠dWPDtk82A:r:W LX(%iYyLPb@JVfG$ 1`w.:S{E)j`;?L= 2B6&/*FP'A4WKvͬwgWץDB,ʩu$+99U/_i{8-g/A#/ +Hߋxi }$v?x/,/{eܼ>!2+ 'J7s1:T-dEK+Hz4tuNx> )q!P/ >hј y0h(FIH L :L yggFX8);%{K~>V(P0ٲk?b&"{A0ɼS]r:9ons@pXdHSM1lCr=*R0gQvpp:ǴUf%66ox}]`YX )5Ĝ)z #]ǑUOOUԠNN>Q)7mUg⒂{6=hìNɨy9aa t-5F=Lt^u<.v[W"j-FQ>.>٣ɷHx!UoP#uoJ`iDu~@(U k֢aiP޿ & ϋɛ\R1s (TNe"R1{_]ul{%TPv#)S?NCUK梡fZ5M8)oB j)VsYK'[ofѝ=j㺥(ûu]=ēOP_46Gn,K9Yc9}"/L6 ۝_q["9AL~W7TN'l4S=bZ$iT0x;OE7VxalH0E{G(Jɏ/m+xFe]M(nQ[WhoB_38Ir]l1ˑ+ҞݻݻHo\!>(Iv̀rk{EK ؝jt]JɅH̦~h³ĥdew:J2YeGN$Hn; z_Wgg >񭗒512w<΢'5S8b3?f)긢I4clB<'@VCqbRMpIAn ߲\mڙ*ܸ7+_Nc8 <3L~sATzVpl0V*otV5:B ń]OK=9]``Փ,Befh6Yz5?O%-7mL0[7qT !(rRP[N>:1<9[VTA@֪0-SjW9K&u߆ikvF'3A"ͦ;LHѾcyG|Z#=2c0ww$`)/*~c#X ѥ$ErLvq  ˛_tCÏQBІLSƸJ7=q`-+&@ۚHʊl,p8m\:f[c!QN0>õ+h8OdG-g^J~^ Q3WK٧xU׊c _EH郶b>O\l)<71Bw(?VIz>!4;8U+G6a#eI <cD:ZU |A$j0^X0CLM::&Ijѫ mr7Q N:XhH0` wdAȇ{NxX5n#ضyȳ9I%D88YLS\;m2~hAJG8pb4$O2wpU쿥U7@^@ U=q×bȕd>Ga!< Y H}贸ı>ԅl_DI=ĥMs 6 3媶rJZ]oHNGPhc.3hI{i_.E^#V- mXz~KH -oX .d| |KW iB м\M&vW2'H >.ůn}Pޯ*g}ܼ‹cXn1]68kRs+!e*y]cUs\ԉ%0 n*QE&$>,2)lzW :?`]&%10( ~=xB k8of1`0?DDȓ XSj=3x]MŒ=Gu qdp >sƠOaʹ}#f3szV:Eq<- EGLn|X\ioEA/93?*0Ds P  KnS@_%#IXTt۵MMz޾>׵er-QLI恦%!4HIAL({W"Gq6HB4X7,f{= D|!B  \456c>ڜWdpTLW|KqH3^W# T|so+gLxs~ '@+#uϪN~I7H3N%!f2`-K-uTNH3(žGbkxfi< +$S;y?&'>@5eW$-f%l2ʬohcFj\ۼG}i#l.nu+C 4 wh%y9\sCs9if o!^( ܹ(drZp V;[jl}l\lzxy MxNΤOlaި܊baQR:T^p g]bz'pbڴ]g.?B3}ǘ!^0[4L,ڌYYcv9Po(Yۤ\_fb%V[%*roo>ԯy{ ^`ҹ%wDP.^;C${rfĵęKB {]2A~vs3-tA\6ߎWOvfv_`[U13[s1g_.fΣj!M.NBl;I. OEq"~)?k8θk#UngV\ /b[`*2^M qnVOro|C`ᓗz2xJ+$ BNR>+͐:h!6W0 N\Ne 7 ly>ʏ?_Ģcth\N bA h,`/Bf?U;.wi\&2ʿ{7 @ ¼ԫxwݿvY|o]^*/[ջN[E~6XvA|.I2pojQP-Gk8{mލoѭ >H} ;\AkO_8 蜣'e N_GuT?JE$`.;|`D#, 9c7wI3py9Yro|G.9Ӷ/_vu63R5;!hD SřqYs B,4ۖu&!i(\ގ]JPkԒM$)sՓ+CdC& ҕO~V ⿳9srOV%͸2ND߈nA;L^o=僜4NV1:I7뤖DjH+5/z]P0ۊ ^'MA+۾jx_W# d"_bѢQRպmq@H6ScK z^?}+ӟ(sd\vgdZFfSZtڅrMe z$e\F 'Y<BoRU#;3܎5"۹ 1op+2abZ<aaܑMvViTKG<[U#9m3U|>movC$k]ԓ3hFbOgBm;Qp6qxG^~V)pmMɽ(Y|է%U4ȗx5Q{vgNIkhe 9U:ؾqɱ8!|h3G^";aQM%UaR2<ظC5Ӄm9:޹E݅#}}գxD)yG4dԑZP䰈qo/aC)‡uyXsaӶh~5N0,*"G`tGнyL&5xG

    FrP3$r8M+J,ս~&rq\ea1Wqȱ`'ڲ. t*V8n;Rz++R)ɖ2crcrL$ꗕ*kao6ܑ)rF:'9b7G*{|+p{bܟ̏{Ik/7&Ԥ(;bJ]>WJBAQj\5uO@4ͧDWI8;T#dTrAD %GSuUVs6܃uqX8(Нzmg PNG*\zյٜ)/3bwbVWB`Fyu@ߝ*zii'i5ZQT".#D$u)Mh8Z$;eŘC{^<2GQ3Fg)VmI_pY6X::WS82'1/.J;g4TXШ+0C< +_ I\,\9*G?zc7vX.r AdNazkut)5Ř=j%mc _P;㘠,A(/F:wAW[{E(Tg[x5yZӦ07Ib>x)B$< 1"=0(qAɎ(WlSqi y X`͈-$"t0+maf I]4=I|>Kp\6tDsenϓI+G')3ÃqTC8IO{Xw8d{X{ŚW:-~ dU e0/|A 4 Yzܔ`4PFBbDa]sgLAEĆA æC ./[wEC)TdDOޱBLhThr_)x2b)ݚ/9JpDkN)jV8րӒW :OL.1=3l0%xB*4!4愁 2a8:~218dݖ}u'7rq=Ī&=15{|Tr:bST<~aV?*b-f+}2[fbV BN I<d%2$𞨁 ODS. Z cĊlt1504qww}ZΟUHZ񈘫tux=u:#g}HEgu8LBP(WUs;~p?rlWH(ɌN߷O^1hSLqc!)TS@@" t5TϿM-6lP0JBgې**אiAHiMA*zRɪfr>C+ZOVG {tқ ;;T=U*62#{Ov%<..G=OS`B U>TQovSq\uIQM'ݧ2aMtIƶccUFF0V#7J0A##]Q -#FIEX \9b&4IWn`Cb4- _NJJuz[3'@FB\ nZ7r kQ0NQ}}Dy bQ+L',qB 5SDYwVC*O."Nޚ /Ͷ $enzm xDpn5EWk3@Oߠr.}VʺAʎA=Of@(eoЖ.n"52]ccO簑c8[u':w"nc'rCf!ƸcFȡV95( !ktNګz!NH _+-ej {Ӡ@³;jy28)RRBcdO4˅W\"y]_1dD"u8 H_u$ahJ_geJ8j2Z1soO)kGypVc˻Ѧ0}'QR!vء Q>Pه;^6]6Q|?X^I N_%d}f׀`ŏш" +m/^Or{~d,) g=2XfI1J !Wϊ|qD}ZrVeGKa&Nz۽Nx\@`k`ذ)[r$ lCz gXwi0@C0>dsJwӝw}몑J6R Hqf+ˮ"\) 씺(a#'rq նxW׾3b.~8dXPIN.j󻢼AN |F>>! ֯0ʷBHr~z9bZIkR:Η,iYޯ̜?,&1Jy`` ma)%*mI5~ 0Waƀ]RiyuO!#(p|A48$B {-/ ^@IW(1X*ZtSC`.yɨchx1:pU4 l%*tSCр(+%)ѭǶ@.!OolU1$Y qYes9{`_=2/E REf!a 銵A)p9{&6[1uѦpxкkIn1,pxPxj5Pt[,OQ ̶$gOs'&qH׌Lb)`ԇKQ4l ,ExKWW<NjTeO^TiHjz^s-k6nox㯬YcrVq+<7~HvFNwez$D*+itk' }[C{ۆtNAiG2UtKȶjC#\ʷ(G%7r1k Q~E9"_/ld}R ^4shsw)AC b<036tzkAw))Gb,{[l2E)G@,+F[ˀxYr@0OR9p_7_wTo//7gA.͕2r{MGk+6'XӚ+Եt\Nsfy*ݐj.PǙw"x@;\Tx4CjK<83YdL$3qFFD4>EY܄d Ӳ~{Kr,#'qEhP UߍrZ)uiiA/kZ u`Bү i6|i,_א7ʗv,LJ>-1mh=c6-\cc1TP.($B,P62e?YyQjUy}ͧ] ge_2"n֟~LףkP+ iӠU(C#](}/|1WqS[{=ku ]ڧ*N;xrzxc(83qr/w(펩^Y k{_OÐʏ 2`_cs<bԜu:6G<z# hE_4]jQU8Z:f04vrY@ܼ*(.eoKe/)׀=E1.j8@߲FG*OD W&UZ, o$-Ӎr , {r}¶!^i9'{~E|.>@V=wkݍ7Tޭ߲i2JʭϔO9h 5^C9n~uv}sEq*&%+k2>f*gV2 9)9前"f[Qv[Ŕ~}ٔ65`Jv~m iД.vidfIPwiܥiE0+УRa;fC6\?4OمeݺFa7Z\ 0fy*z!ɻ"4!Wc)<ZwN)+H}L;1~bܸ^A(!*Q?-ת O%xji%a<]O͗*3㉲ZBc%hA VrP9B$%&2#ӣ#)e/â5kvNp¿Y|qq%,:'pEz#xNRZS$U.o~~lzr2ZG/uij- uD9b( t"Na.Ç) @h [.b R8שL<y״fʊY>(="8\9U='.$Τ+thaqV*+eWi[ӫOON}bWkZ*D 5hP5Pth0NL]ԍ^lvRINz*Jpѧ_m*z}Zj++͇Fxa} JW>J;oVwE[^2E F*5,4aJL0J0)jŒl&@DP~e# IVݹzP^AI^m/uSo,α%ff,` }̴V#h& A[7!x `EQdXTק_7\IpqMSۨJT iQ<#n%Me,iNƗ?Wo] [tͅT\J]|vy_ОgPBdtk4 zz~WT 5_8?+@4N( 9@䢪K8,@w: .E{B^kSk=K}ZmF'{do6=晄O#/̱yR yal{3wL yp#-%#Iwµ k^"͛;L?_MhA D8VY2* =@U# iS-lA^QpWӎ$Ǘ%HO&; 6F@TO#Cl>(Y|G-̓'S'ڼQE]pw.gdTN1aˣ]Q`Æñmv2cH}. 'ʊ`}DW]]V^n o9 ً[رj6Ǩ^+faR c@Dž 7=m?̨fܭa}oz6};'CۺGߌ87R45d0/FZd1 ᯒMVwo?AEVJ~DwSK 3;x̠Iabpi {4l~,d0؄R.ApuYǼ]S3ԉxj pUPj*Y?)ː3Vfe3*ڕʸ,D"ҁ5`jQPM-jѢH٥vD2G+M\ DvGx%4Olؼt)=q=1艨}:%^o)i_t0(ɮ2AF'׬KkYe#ŗAP/T? lap4_&xYZFIw-W^oi䂋+=E}, . lFSKg:YngoI5Pz>/ļрJmP:#XiXPG.%LrXgeNm0DrQS}OeRV0驇3Šq@ ąl-%:E'cQ@y%e_!r  \D4" r""RD"""WdQA-H-RZ,IN%_r̙^{zֳ0=AܙU9R똼t@MeZuo[vPXlkb(Kx S*r!Pqḻ==heZQwS<6,A|°D`BN.r½-W-%kXpEmdkr ]O'߆sT/_,iZ </*|n8rc|S66U g~Uxme a7VbCAvnMRҤtA=a72I,ފtBtFC3DȞ4^S H&kp0i4l4wX08yv<BD.l !%=r 2nNwF1޵bٚ_z%PxmCL;6W,Ն7y d "bեEXFA$L(PBdNK9Gv@\N_."0ίɤS/\^[uDg7Ԟ .߹ʔSڛoo{xډ #uj<ՏUuυK8Y=uPߣxDȩ(x>>>E N@$2M̩g}K4721! G 9*+)PI" !Kk0!AۘjZqZt9 ;gB[?6}Fb?#f43f4paЁ3& p?hzX@1c䯹ЧXnyb :$M9&l37;>KFyh5=o'-lw최nuvQf^o+Bqݡ,C}0g LIsWÝ[X㰅3Q}|l1Wd+ pl/*Hr Vч}Ou Hʪ@!m\0r3֨]6}l#w_*~AX,ϮpGB:)a'^,2 ,ˆ@?'j=v(֥i'9x&]:0)G0s-Sf{QO; פxLP*W`ʄxGrçֱPWML6X:4>d΢h0^+(=\4C˅.xĂYJJ$-a]:?WG'=1!501gi9Ox aHEc 0yLE1y(LGI, /UBD`V [d>2|/<̠z8 "x~\09fiBlwIxD%XF$uH0S` |=pLvdl wȎpZ|1fQUIۣXnn7{ !{>AQOSڀ[gS=+٬n ռW5إ>3; _):ڊ%w 9ʂ C2ԵH:heVjֈ uN;1ԎwWM2CfH_ 8It V_:&۴ R$޼,%$N S* n|G\!vj 7Y/8ԡcQ:(&+p Pfme&ؑ4H8)x&% hx-FP x .S^`@8U;+S۾ҶQFpXԞy+x;V :L>@2?_D1c@U zq͂$]>rb'`Esi_җ)P) {TוB+Ku׊J-zG/I l?$M|0bQ>[sp|;afMt4DcaGkQw~Sا%lXCT0P~vSʞX, Io+t5XQC hJSfRE|y2<ޟ0-4O>4)gXqAUCb*% -@K@x=~EIz Oza6n:;Z˓@#;Ɠh >Dv|h %\H؋A a0K@*#F #CU-"1/m KsٵwĒKW8ag_(a%9Ul!6<4 }`&Tu,\9.W?'ha2iK57MʺEMW]Fz^ug'e+P(%-D%GY~fa(g!#]=dewoV[2Kx>^;NK`ߢ@܃d^k`XQXxoP~ ? 75ؼ)ζ.2_uY mnvT֘,:]˲=|"/N73YŎƆ"|eŖ~Zvy5M:&z\iEڒ"8Cyi7ocr*Nj] X~;eC5bQLPLbsm^OaT+wh;ҬKuj,Vba܋5 cmcvZLYޗ%l`coH0WMX6FALtaK`)Bh+  kFѡmorkʃ6W2%6qTp*XG/FFBzf5Θb26 ,L1}ZslE'kef?5폵/!:-O:Dv7!b8%ja20WbGk!Zbԗ6ҏCd3 ~%<ZtfjH/ O0:,3Cں}=yͷ̖G17z#ϸhWP. ~{tjA7S"@ qA?s +pCzi5NMSS\$6 1ڒL g(NZ1s@X+OKU:y颕mLV@TC:2yDGJ VvJd07ňǹTc;0D'q Gogǽ㶣i -2ER?S9yw9fnnIa|juM ?c#5N/ȽM}}祲0B{8yGNڑDa` I8ѱ;zPSWKm Vξ0%#>KFwh|`S uIK98l鑎'831/7<1 {%:J(d1e#{)[IȆ+ 3gG!W"B@,D3DcnrYMV_ CJ#,ho;sD;˪\ϠvA2M菧eQ4-J2M%]t$Hֻ"zhmn5THHK."/lvA.4|1ɐt) .Ui'ҙ/:b5 ED)R+N!&AV{LI-yriLUk+ *ubڢYV oF==6ȖXE$xe)I‰08;5a^! 5xɋdmpeHd!!{~*Q)dr8 Q kN*;C(jd}/^N[4=z /-/>U3'>ݍ S &O|_0*` 2]Rp=29 >T'yGяǰ &nŗ$=H=_b@'h$M! 2 z'8cyyVlLՖ~rJcfcw.];\kKJo=%jy^ ,+uI`/.mOO&`5b[@> cg9XxF9v&cFQv}tRZ6 VKvQkH].%cwn&`^qHnJ79|Y{qWq᭣X-qnfgYd+YVɔ/jQ)~o%| f`9&Uz]uzD![gH 9i^vfJ3v =x 1)<:[bXu:EV^Y |hمR(*`rjJ=pMs-m)NXzݲXV.[.30p#*%r%p`ԍvĮ xV0ɥ6^p˝@c*b9FIjHr@j l!6Zl59BHj(B;{L/Fj#]pA\"\ppu$ѣ 61s+n'`ލ38޿?N{Gx|+sox-җR[E~ZScb.2Dzq`Yho w®Vq0׃V\Ǎ<@яa'&׺d, /Zj&%.&|GDaa)2w`*}~/$=t\D;i~@k2lvXF3l=Ftva8gNժy}ӪKbjuFxQ/^F]^EIm=//_vפmqԤtt~ia|i:?iϗfRO/!A-A>k|ߓOB= ^Ї>z]=XM~JBXe(VNe:=n۱ey~"fk"Ƒ|T-yf7᫥!=|j x`[M^=g`8mOٲmɘ}/M+bCN=6⫷>vN:V]v%XK\VZ5P,dRt,&5M ZCb4dM) ?> O yrqhɮLjy /QZWA[G3#_<uИlOcpM@V y҆{$@Y>BraQR@m] }l $tM޸u׽W `SFr&퍳ޱ`4 oNwI_?erB_Y+r5b 1?YfdE_?s|>oh/] m|%/?楇/~2|`K2~I3KٽGs=zt^PI=~yW]xM{tJ8\~$~>vT|>~4o?8MN7$<0nT۸x=[~g~q><6JZ ԯH9#xFGD>x=;˰KI7i!u↯"vgfv|CJEXlxl`%݄/OvQDn_ד8]g<^$"$GMôC!7@ Џn\n]}Zq% T/CNW9()? >QWBneE{Y5ޖ_uQer5M~DpΘӍ1t)X#-(H5#| G`l K{z܏1e_~'Q+2yv$wxCC遐ӈq#E|{G!2agy4~tEmòm8#T.GH#߻hwǦ 6֑ ߉ĽR ,.C;9|fۃY@d"M K(pd&>I=$[6n&1țڸ3r%rwk*ʶiL e^HRs/$-~/$@Áٶ׀ zvoZ?b[`oמ`Ӵ Lasu>T EBXqB؍DbĊ G="܍ŅwPVG-=*Ќ?aE.V$ra[2*y9]Vii_57ߘ]6~7Fb2d:m# gAn3./L  cCDj-@-L6A"LDHM mwSe-'g|e-c ydoS2feƮ)*3K/ch;x 7,HG#-GG9MakbGgtHR|r6ʹTs&(G\t)7M L|Zy3JI:&y/8) ~|A@G>kf1&u4/XW[ͲQ?I8lNCY{wUObv]wϥ̼7C7L}mKh9jݕKգ$4J"vY^N|->4lqqQv6viItn IaZI88ʡ 6o6lhojTP%M~'M-J*\߂I :rTwHxVoaqh`)P?| j"yȶUgW 2P޳KzQ?UU"Ͻ&sA/~{ffJAR :NOXK=MlJ_l"iX}YXdh22gJz$ëoOaecV5j:%8)Z@Tf,ZIL 8/R IMKl!lԪl ^tZ`#&D˦6˗4c>}=n莫~2~5 c7Z&էa%?/{g+4_AOs% Ɵ!%F L"QD+3|3*`GŽ"`Gb~a+BI( MsE!HaN\+jw n}rqHbm_Dk斄I՘;%0lU22F+L 743VE< =89uȨb`R6[-&]q%#…W<fm4o|c݄IQ̩sVJ"NЅvz,]& 4X~|xv|y8_,"4oxV8/v-쫋 I ןVGX$?[:Mk;`i0|`OU\>0Pm~nop|eA?"W֫t$tqV oL0O !|d!|a:~-t#LC5/jokֲhw/93s7 ޟܜ5zq_6 4_nhBo .($x>G:&yB~-Ry?}>\#L򅭈MS>|ع|1SA?29;Fx?)~~1VCc㛸ڠ/Ia*?NMT 8qȗhCm3^܏*ao|?ɔF+?~>oki>?>XO!|a?qmWy OG|瓰G|rNH+>Jr"b4&7J``{?Sc~ί ?Iq}?q?lR~}-43act4OXy=q5:G1:_YOi ~88\:-x,pq\Z~J/rQh/Ǵ˓_ Oׇ<G\)Οcp8Ic>7/c)Ο~P>%\v X)1zG4&~?,3x50/,!.~>a ï/Οr~}Q-Ο$U<^~>ho jFHDTZL@YRy/׹6??UixJ8 5H`}n~ܿS?`](}{wL~wLwh=qj[h劧}Iʢ_0QH-,0.8*CʖQ+ߺUۊ^E `dMHQT;u1q-ZTqmȲRh[M=ZSp-k)t-׵ E Q=tlU{JF٠}~#}jWBxRb>4em희yW6B\37ݗ!|5р*phOz2ĦmsWXki@$3הInhkrV~aOJs1wgdPIg?[9m PB%dϲiJJ.ETpHegH7IuB9+;mBfE+#!(/}?Y7(,yyN؇CWJU:o?~F>  VPkYDyTfsO%zVƮ°F}Z?* XF {La1k蚧~b4 16ld1Wx-X-k(#B#v˱(K..#;9qW"۱E Ќ@7͕랙p?fG'W\"6>b9T=ţOwv~7JYr|YImOX?Cd#T-)TCWQ |Ic(%)vYҼJf`:4\dok~mJRVucп>u 0Y1Ѯe#Ѳ-}Ao ;ު&ReN$FlJ9REr{3~>G}Z>VT $ \ljJzvs$tJnԇ`?^\P'a~ooxfd|XXef:hصֳkqo6YA**$oHT{*h}Gd6{9b3&8x{#7-p xAUtdeL9h~Dm[>>?]￾x娃x0N(q)Kk gkE 2nL`/ȁ @] F>aYfL69ܾp ^ȅD*~=e=c&LHxꤌu?VLe3&hC^M Q} J[TDoL1нS,8ƨ8^qv F@D9lHHEm̰i`ҤfG,OX;֝RVCѫOcƵ]ӊsrO&C/6Ouu=CF"#a"6\H+啧vuYM\E*7,۔"^śGӵQX@k ^{9p eT]qE r'g:|xD c㳩 *N/e T68Eeiw95W>1'M;kRVүoays32%nו5co .nߴjqfqja 9ܚWȂnu䅈 -ml1W8jEӠP,H76VBB(u (L(;E8 }GJu (5N4;̭`Eg؄h5O;y씾ҁrӗ)Z=jևʴЭ6D8/FjCW0b1T2Q{]5oYCkKgL 'ƝK1^xXo GK%"d G8:FC0d>bngmG1\>tv}S/?h>”!7hsQډas%K\9e5@Bj,2Kl#.:#.(a"PO!ۨ6@8NPE4ZdTDS @N۫)ٓ DJɒCwV*hU3!m!mÇzB{`.ȥh?L+Onf.mz{Mi(:q5Z3<J| * 4 U]"T#f;2N}f:!DR`b  bZ 3PK,dw%u<YMJFb@|ߗƗY әT G/}X;3QrM>3xπɃM|Bo8(`1T;6?(va+eهhdZ2gYK ;?yK;{_Usyw`̊ S+&&hgqW椃NV6K>!AkŬ%ûMH[_p?؛%{ތ$D-+h{Ep2tp6>Gw$ ^ 7bS`,\%sf-la.Ѻ֙]ŠJْOǎwN7}б3PQ}:vߡƷej;649q!0}j,̧Q X@ x xĻTV'La~P\*JC;ɒLD~rk;< ItCJ.JDe(lQh0rE NeF|rB fZ CMԛ[GNԔT]'?vA/?:pLNM7 U)|YVg'߬MVUd{V|2ݙCmJ0,qI4TM0\GrzS1c<0(Obe#Ms4x (Oea()D ڎ 0 nnunh$V{Ox-?ǿz[|Of^~jelK~ߟ>T;zǍxSqR<{ӫDai60҅8 ;psaqh#zYG¾,D  :)ґUM tW3bފF~%Fzuxoi_ qDWVV;AeAg9A/$|oB Vtڝ`B /d~nnCcD(KJ_՛?_1[uA ;f40Y.513>v>偶Ҳ h !xjJD1TE(ֺZQ}B|\a,;jKE69{|} yKKBon__vY}%y}H>`;srCt))>s$k犰;=? M0 h:t^`b" {|0P ;'Ɂ9yv7PW{p$%OiuٝϚQ7|@}粑&`qC,qѼFź.=8Q:`7Ú.cd5nT>%20VL>)b #w!pqn_aqؔ^3ՀA96Q4JhM|*zJ', T"z*i/lEpW9fo4z*>%Q$t< *07d%F;"2+݉9(dgɮg{`zOn]\n<8ה+r9RGΔfJbfET3J7-Bd0 炍 `'TSBJZ%\!A>]X[j6ʦY|І3]˷_eӏmx+>[*{Ӻ6UnYѣ?_ gXb吅i@\P A/m7s?_/៯cC+ Sk9jyyY+I/ NaJm4oS5iyR9H׫Ĝy)=*#UxtmL Dda7"kɣffxbrǨԳ%M'1p30aVh;^)r6eO6`yOMUTyQ$~ .ԙϣ=ª1 !w /I Mj3OD|Cy&R^I[yw,TNGΗdkZ)>C簧g^s4B nT4Dīnq5-fiLh9w.ŵїR4rOcK Py +:r԰Dv8X%. wTvvSw/eρErk4fɣJe"F~ N+BŴwZ{: Í%3vL$"*7 *;OalK-wNf 9粹:\JJk%O [ %}q-);Hi,˾Rs\Bg.1Ǣ8/UTDN|4)Y-; jRV|+krƒ/l?doW454o3Gd{*7v6O2em*A%5\$(sq"O$}@}szYQZ z!(%c "W̨FN7/ ~C~G w{_}ZW^Vs+oЍX6I \%)6Cn~ 5p_F0|otOB*Dh]J`~lc wl0d\9$0!`ܯrc{b3⎚O +~hE[$Jܬ59i95{ CCejk>ƉoCM2&{1T7Vmli{[C_bqX-׾٥Ԭ'5jaقbv vw*wȍ؜vǟc]9V=KU!7tUޡktVt4KLhQu̇QzXʔqkZ}K8 Otq-0|E)uG)@L%HZ谷}@FW"Q襤|zc,i(-ꉧ| 'Ȏi0=9.s ƌ "7ty lRU(zk:5ILUʅE7n}匋q= qي\t7}5{qZPj:ìkglf.qc9FLƟavzyijLGʼCn$B o}b>er}|~,jl$[_1zI^f:` kTzP<QBjJ'*]tL+cT)[u-F)gޛ+{0Vx;z&TߘY| /V e;-.[' [ʯ#[_˳W XѯfڭIQ>`mY"w@Chdث%r-b;K vEV^ C7޴2M {?OxpŖj+DOJo*~ZEjqlFw @3b`6\nͷt_Mw{ ?qwy-H2*eD:&xnƶ|fۍO.A۽-2r 7q4x^P]?oɓItǮb"Yrrh5" ʏwcgFgSL.͘S=x%? tb%J\.$oz͛G;ylw}Wm5m̮?~n>u}NiU;q}}$>Pj]rݔg^fes*+4Nn\vӦ sڼyQC//b6[*/rVIިY_enMWv~VÿC6Ԫ5=}LL1ƢȦFX ~U(2ܪlWjvoNC}ysK{}_;&lo1|ʳ]]WUjqTmYwLhX%74oI& lTD-I9-T4*\&]f`Kىqʸ֓'[NÿCXf>YaW8~K}Ǒuw0ү3IM٤ǕNiӏt+qj[DYn_:>A%<9J6>% w\矡KA9~~WWjoϓkV*XJp賮KB1k WID܀ dAblL3Z0q+R_!e'tь,"O 3=!ՊE( UP-V k"ʞÊ슛RK]Su`25Y.OXUr+|tI)g%Yl{|E=l0=z=r_G%L- H') 2&%`ҊX{(Wȉl\ < @Quz8ב*ꗢb[|σVty 1o6:ʒ|ecf3b^ytJT3dF՚}8vqPWcu{u5nP-16۸^Di=k!:dccqq ,nE*#b:$D%a@1IĜ2UkKoX{sGm YI>+g6)0걞ї^/& .s݋dl#N=l|A 9I_ySw,/|Gì7e2wvL={ҵN=&71ϥ%1B.b@u` _ZPxE$L#dp Y!q=y% j*=uR\ֲTv[n+M⒫_IN8In=ɿ|`A+FHd Xգ5P<^;Y vd=[@\rBrd0$`5 n|AM]Gl+lL+R\ޯ_svC#iw.?0LXShn`C ^469w%R8ة >! :꺷  ڲh谜X35nsokX[t_V~E%-ޯBt+ptDnJ"qA|W퐙-#3FDϽ_.|o#Ci\Pw 1 gXO1]ZB ⍐IwRSm7Ƅ\ܒѐ_|JC6j/"N~!{/"Iiz@(I#CG'jjsEô%q/x3tKX9 bk|FJw2|2E\TBԫ !n1l xr) ɜmf6ֵNt gv\{ڍl8Dإ.uF)cH]JO>;#| 8a$p`7s?8eh? UYKo 퓗*`? ўzob^%[*vqu֨qWVZ~M0n?H@cHɋY?IxXE痲O=?)dAnju .'-H!M0S S='vNz#ve 3Y9y2ߥ`  ȔQr|[_ۧwtLa}GI-}_zn΅zWO}󁎧!9IBP!쓍[̶ySɂ@=\" 2xvoi<|y}4S)pj2 A_  RMUYYu-cmmnXwmxr`\~UWTUXUi6?z(Au "9h)œ`8pq% Ǟ|eSU3;z ȩY>i7}>C J}zQ΍H[~E]G< gv2r,9EAx԰#y G:o h2UE(60QTŹ_y5mu7*9*!D%fLBsS.?|G[wnTvQKFNxKb־Dm?g(_=sȸ 8Y t<`%i% ]*409}k7 9JZk-X5nմΕHkŤ1'xZpp?)knK([A8x7kPd1yuvI,~xi SWI轚yR1X[:S4 ;-5Iz=-S^gw6߀?p83s o65&u7W9-m1J m= 5X6m[]xwJn)S~cՒ4\rSR% |6]*QgK %zbialrU׳U>sP-b;ecO3)#NՌ#"(=em8;u#i ^zV*e*!朗Diq=g:grPlWS{A>!HNsv1Rmq4_Vux=?QzQ*m#Y*$'sC-J9}t@mۧy˝dimr  }e EO}A}кI?c^S_"D?Pr|}#dB}P?BM3epga<>G|^33>Cש=v~g3d?xpXʄ;iq]%}eş{KW E.ٴ:eqAg[=?1 =-{'LMUYBВ4Mb [ڴM4i""* " VdjiӀDłATQda_0L}i_g9Y{sZM9יִy޳cߛ_jȹSB%m3'ѐ<.XX_3}q*{9!,\ t#iYz?L_|?7}(qQ(VY@ p6Z8}a}%kGevs`~x~ rSj~RQW{Gd>FX O7 í>[D;O x|x%+>A~) xL߅_b]+B̟C@v2!(7P Y#Xb.N<2x_$,W]\`䀪#K!Nt쇐/r D&S$zV^/82#~/bЈ%PލTσV 끦]?hsQbJU7wPO>.# an,c= UuVO-KJV7÷|ϱ[oap8lg@x4 1\V<\ ʋET#K%>ܢh8r;@ LAc!^BF옮C$1,ȘJ LX`ɅqE=ʁc?'%_x" 1^%l'Yp=x84C>0iB ˋK{A aQŊSЏs#nšy,؏R|(EO1c1?' $fE]BP$)-*_Pr#ժ(cT}Ե1i 1-1b=E8E\m\K\W>}'z~:rO (:xM|^|U_ξ{ݷ9_h{Ssχfrl5%CS~1L16fxU#&882jfWo3J3*ԲcFkF}~̸1;c3fq;8)1+1/0ѓX:tK$IJOJHdNZ5))t03鋤W4n| &\ЕɃG%_HܕR)SFhR&dI9r.bM<;+4HNEӨiӜ\\tiVh'iyEڳ +.h*nnN u]nnN׬M] }~~N߬?Ee7$\C°ذʰðpX`0.62n006vFS9|eAeeEcdɲY -KeelM=mWZ(Pډ~Hv+]/q KҫWKߒޘ:)jIuǚ]ٻnYypsSlou lԲ}=[4 9s{suVڧ1ɭ[z[mZl=z\뭷ۄmR&MoVm[ֶms[}[Kδ}vfP &Akpf0?X n 6`w{L)i7hݾHsۯ a1d JC9/E^ao{Wݽ>Ot߮=휷s::r:tvu4w8N;7?wt`{%Uwꃷ~{ІIuwn9|ydՑБǽ_ţG =w+t}>u\tvYytKt:8>>xqǏ#OH;D'c>Y''[NM8U~jcN|:Oc>ħg?Ι3\fKAy R?,`Y@*hx:/܋pxNnA C{Pn4Gp{ wE~$ }m ܋YR! 4;}0MAS+ <+p'T6\{ mfóesP cFGP\*DNLka]Ak6l›_(ыp-g\UP=jAE]&jBmt!F&S$ 33fRxCY9jΡ{\O9N=O{eZ {s$^)$Z w_CAxt4OШq'׊]( @<C=faut E c89fF_עu8<#|ی-t< 0OAOx*Vm؎ƙ,x>a:=g}{,H<>89 O ?t {^0\Ņ؉p1..xZ c7a^[Uq~g\vKx)^'Sx%~<>M~~@ߠ?p:{=~_e؀7M%WV ^h*6pމqu27n܌-xnmq;x~ww~x~A[|36|?D11 I| Ɵ33|_95>{=/%G| __/ ? ÷m|w0AB(Q%DhCbđ>/G"O& 2 !{}d(F2$Qd4Cƒq$$dI&)d"-ёT'b$&84N&d2L%J2؉<﫛F$y,"()$NRDI qRRFʉTLjT/*8jRCd1YBjR,'+Ix/J4YE!6 ]rGߒC09B'GC9F>&89A>!')r|JΐY9|I"#<|K#GrD.._*FL_H+IFn'&a(RJ*P4R5}h_ڏE4MAt0BP: 𦩑~:cX:&$:N4N:DO HML-4I:NSiLjv,:N3 љt͡i.!Υ|.gtڏE#>w5>J >uCꢥS7@Q^UqG/jZCt1]Bkv@7fToۈW{t]NW')>MWgj$st=}@_FD7ӗ JUFNZOh#}67`6Mx= m!>6]Uh24$jqʩS*YyUN E~b*WS9%Y*K=rLfY\EVBDlQ9%@Hbr\Tٹ. vIK$([SyPS&*+^LlVO"WÏ0)q nqKܒi%nuӸniӉ"vz؊zF/Eԏ/ry=NoXvj\G$yz1B H`?LW?W#̔{%{UE2fq}Y>*x˜@\ICn/X#J:%2GU-9=)z Pbc"X7UPE.o EYJ.]-r1rXvz}5.T۫quoJ=zUրMV=ŰJsW꩹LuF+EATK5W2M+b51 .5R2hN.l r(y)e4c&o`i\,M+Kt4."Et:YN%ʒSeɩT2F*c _2^zC/cee l^FY+\(05r I$bu1ɒMd,$K6ɒͲdlY0f,ce a12Eư"cXd a1,&)7 4S*\d#"XZMK`i5,&Dj"h5q@oV+cY1(YF[ E/oPi7znygPzt3vi\7s0^5qdhh~qp|Sr=L\0q=L\0q=\3S]o2s?qqqq͎H!.±#i ǎ cr=`:X`s}=gp3?۞}?gp 3839~&grL39~&|?grLmmmmm7#[6k`ظ6k`عvk`9k`s|;Ƿs|;Ƿs|;wp|wp|wp|wp|wp|wp|wp|wp|oHxNoHoHoHo཮A#4A#4A#4__".Tܮ:0_X"P_X"1_H٧K˓2x'e<@E{*h/P^@E{r}ڥK<Ǘ2x/e<_x9s|)KK<Ǘ2x/e<_x9s|)Rڥ*7P/e<_x9mR~R/.;Pns|)߁R|K<_wR]kwhR.RV.e;]v%t^Di,*ZT*P*b(U\WV4RƔ~W ËqҘNaC'=78JM'UÉ$U[ w GE@&4\aiKTlEDbtإ:k67(8=51bƊ}0>nZv;X1JŹ%i4_}S=Mg$M b+cXqlZ(rKn],`%2%۫|W!!N_+35L$/;"eZ̽<7Pu?v~ͯw?Pŏ|ƿ_%K\|sџ|s3?yOL1ů߽}ӟao|Wg=jsÏ|ضmwOg{zێ_m= ^t |=k+vW~ߜ~wq]Skx^@ ?ëoxD]_}u~VW]sT>vKuiΟSwYMf /fSMj7S}CkM5v}=L޺ݍ[um_ռ/ϦqsVo7Mꉟ{g]uw6gCu4{v2j[WYhꩺ8%urVM58VҌb!wgUbp]5fY;S4rs?A1Ւb݁bc\:# lOPjC-RP Lgh#8(%L1eX޹͛^Ď5E3J0׳f~>?7cc_&]upBܻfgv˷BۖX "TٳܛU[ݵӾ [=:\"$~f_`xkgB^a_WȼG7#tϫFI\풆鉆A|.4h|yku;SVv?;zH=D?cSb}5Lٍ=`At3Y?{Y5sݝaĐ^4,sohۡk%WySQ__M{9ԛ/ͦJo8ܖ:PLVgFCǰѱ=5wC.|4pDXprŠl;Ć?]#[>n_  ?2q2y'83cƿȂƿ!Vògwţy5ϯ\|-Rf 4[߂dzU,K},LĢQ4(Bo;WކXyibscERu۪0,#9Jvd. 76-S]誀RI<; 0_ܔ Gp]om42_bqCb,6aSgS\BpЛ$%GbU'_=ogL a1\j?P5W3!7n@yͧW?A<)Y<5[%zI-y`L=MkU?jǕ5/\$t&c 6Zѝuk°UQW٣b@&"zGupM0 (uXL΁WGc  eSA}+7\`;"d^P ߴ`(>koa2K F? `htp~z/j:Tðv'f옫|/o^3aCГ R1Զb/UlS&B?k7+ p{TEױp,)3u×y=<b;?6l_ݻi&<@eNvgPSDp |s4'YrD*|҂dTQ=;hؠWiaOvU_V,LDtZ1*>0Oc P;4#L.+l&k2v[bR*Ȣ֪Jh p*T.G&HS"Bً}%=L\rA@!ZYu7vz B_d{ɺvdX֐'.;t YF t+6!"z5[VB&gEbS^~u2b>Ltk| q;p=&wr]t~'+\dR>bɫj>E"VfndRx=fXi(_#1Mq'`AvƐ"@3u|}=lẁ#q3B*l Y7mǂwa'M&A@]B+J<Ïaak!#F-p?_1gR+Wh`=mcKM,+4Xְn1*Dr5㰯]yDz"@x$ d8Xzҹ_k{ "Be-.c~U b·`Jgb> !tsWMX>rc] LU{($Y@OP1ۆtTQ"^gGRxmF$' `-UOT:"ǫI.ahhCt~"y)'|H`}g&l ۰p{|`Cn"F9ۖX ;MFcgx rBGF!qb\#3xx7nMk&Gȵgp EɡQÓ1֋F` _;aAg9.|UrN+Z@*NV h,S'A;rvԽ0v-+r&Yux5% %An:S8M^ \E}2ȂuSQC;W*K--X&)QZ|=g.'b ՟:$O$.wjC\n#exg/߹?V[;AĪ 3s9OAX\1`!<^y(B 딨2m7? SB"*n ;Vί+t@,xFh!NH=Mˆo`m&x `mN'4tV|p,XrYmWݳ<)!qW0_1;Y% $W{F<ȴȁSO*<74xAP>vf3tRG̠r| Eo0_"؜6GW ]Y(?5xtNXl2 ZdIݛ":ƨĨ'蟌Ưwom_ "hṲ}=7AZњh ѱҔ~bŢ1XDV fC}6Sè*?16D^ڒLI <D4! p %Sp^V4<݃?͜{n0@j0- | 0x*H8mΣXU:(~ZByD~tmFxa#*2L]Zv L'JʱCm&evqB G=h(rJݲM3i7-b,"q@6JIz uQΣ`Ţg[0<(" &t8l"D_ ?htE2܏lTQ4zm[;utz 5rdFHF "̃waP"xI$ico^6:Y׸:SEdF|h R$6 q ӖK ILJEe'`QBr[$7y(.xy"9 Y@GX T !B:BB-ix-"QsE;3" }p:4$\`ƱfԨ*"  }~mҺ*܏DܩF90=0UEy^+j[bRФed79TNݨ7as1wOS$>kBV l+{fU`%\5zDHAIXVM^ /}:ň>z`Gpo狑>פm %*v{[]Mzp,1u#kPyg2o.asnÅu=={<"B QA 0|v3 1m{"T\Ճ2䎡SF؀B$= 2fG .,e-7@"9 2n4Үxy%uW"WDG RwѢ\ ٯB[=L 0׼Փ&f@$02xHЕߎ̂/vLT#އ"ƆFqM%-:eͼ[G.q*9"WJ!\Yb>&qqAz0_05mY1Dq\ʕk> UX3\dq}?"Yg%&Lȕ5cSxO,ap»<m»=Lt9d 5HCrTj\)FF:p;a[h%%ğfYgdE\b}ĩnW^jC bHXB% 7̎GčBBXń 8L!fi?:$6ule;3mc/?^rFdeE ]KV>*7;ϵaD&"gp)vo?1[kBtJ2gYDl,:F>%^Aa&vR܌RxN?0  /sZFOKN#Fu<ĻKOr]L2ߕuLYè%z)(wSbhK~Bf$c}!Id\ƏO0# 8S$Ԫm{ڈAutzͩAq?~wC:% &~j/=(^y8ppmp.-8W^7I#A#p ${*5MeVVo7d[Rx(kڑAf ?"q!Ga t)y^DahaTDvy9^J; t4n#^eHr')C[- G"Q2`}b- R_y-3O5C[s(xEfB"Jɓ4/}>KBd qF.) Ņ( t_K=MG4bQlQ! ,[.ӄ8EC[g-St!ڇ`]lkH2J:iV.7 8lk"PWz1VKZ&r3ˮoiT=Sq rT]nC[ZǣbͦDv^Bcv8:`& (RPCI THnHv 9d+A[y̦&J@=xEбK z'_8G,d?>W >c"/N&dJBp\z䡅[#92]cOd?SXʾ=$^O 'G>{rcշ=Р=CM*z؄\aUd&ޜN8.SL4U@/GIh)̚6e5ԅаJ\*'xkXcq?Asc~5%ۼ5Z%ۏfjΞuֵ@ \4gfCOȡ"!=RXQsbw&m*B~#銢dɌ!x9AEt:Bxyw[ɵ3p#ڜsh}o4pbLեՉ s> Ԃk1n2(nU5HIw8t$*I! JֱkL&6|+nwa҅0b隗^@& CmIOEG׶bu(J1"\ f4MiWXzǠX+M7" Qa8*!Np)OGZ@aj7-,hGppJoC"G>aѳ^Cɑq :XiB%LqX X~ʆY"f(a}P![4Tn;Q:J3^'dZ4ah. (q "-R~;mRWwl-!!tGYlWS(sGa:'jmu) ,a 0WAͳ@hu].BN |rq;*[E6y,#Z(:I%0a<1'xJ+ҧ".Hѷ1ϟ3e%C Yݲ%cҽ͒Hx[,3rDǘn=F6/)\ |bZti*$duȖs[WB)>YFfxY6}m1& +ll3l8M?0;TX1GQB6N+y25b =۔F.$4"Hj6Tb1>CBS>(Aı| > kށtopN:L\QU Gwt1Pь]E/%Qbb{XCP)!@_~ iSnp*ڒmd!Y a ʽ͕ wQ  eeR<L#v tn+rN.E);3M1[VuDqQL>c|)f7.:O@x[l ++ٻ2s KjN3QxXAW9egqs$.SArF х iEp!{$)w kNV_LV1L9>#e~Ŭǹq2"N ~sX~"НBM+|"ڠ$<ɫyOR^emOMF7<)/oF)8rٍqڗAZ1QL"hGO#a-JEs^(ה߬o >ͽ^Pus~0f&{V/% Ҳ| wfG:8HVA JP T1ZxT<ܩ<0!ao*pWSL6П9x>*)P]^ } M^z91.VA 'kjbG`k#MEs磦Z ᢸЉCy乨O#<8AJՌ Zs[JQpRXadmXh6 ѰM>˱9K/͐KvM>f +Et:Fq'J/>#Hǂ!yrN^IcjJBOʭ~+t.4COhP.-LQV"z2R(yRD Tr(.%ΣSBmNN;?3_ s+uJ"1~`x$!/R/0KfRLzSE &y^N0a/ݤk,nւX)@-މn(`ށ-^0%SH'/] D6_\k(zee KBy,<HЖ)[ )oWiao9 a蠇*(zxK[;oݭ6Q[nDgn$@o#F xT뻷xi81I [c  U(5reQt}G* 8.~a@`RgC XK~Ul$So9T.$oG/?./:\xeܼIt&u{Bg5I'hpyNa; >&FÍCbU/\qȒ/}73BN!"i3Q(ıN '֊-oE̓ C0`ǃEPszȔzsS,QHH^zZYAԌ!J8[xl?_ ,׌E~$PbߋYSLK-n`<_{IF݀IHn 7ss< #筕jJpȫpChp:Is[(ZΦ#>xv&Gln.i CX AKph$ŽT88naؕ͘ddXz6ߔcsIei&*;񬢦q) 4y?ܤA 5~$2<|!Ov|_=I ~cm=dϸ6L3}NXs$%4j)ExD($gEVyQ'Lf8]`~n#uϸr ࣺ= >GIQd_,pG7hF\2lM2G$0 5 )Bk`$N'Dxx<.LK߭=phlOhB&Lgn 0rG-AgO>k3Y\/u[^,7 c0( DZQKi@KmKiז&8QGW_,'BX)N99\ݭdW¦4&bМkE&`9`ռ~WDڵtQLm7P`$Ds9"zҋ%uMD8z1T>Гԁ'JcH6FeF03J©~! {I)uJM-)g ,K(,%@I/o%ҕh tR?IN6] O ˤ zwSMFh[iB,ȉ=rL*zы%p* ŝ* &^9#w谫otg=%:-<\d6#֯%|X;<2=lb t.8zjVX1`uͼ@G60gp`|zS!hZIirk2@]U; FPYdIIM#nrϷ@t0M<ȱy92OeZZP~TE=+j_< PMAobbDr'3cHR2_Rc;};1 o)RoKnK42 ӭ$I1krrQTDj10{ p aPcm4eJKY |PH^wK1{|Z^ISmiDKD y[QOf&ϼ9`Ȫ$%{gc*먭ţ뀝e3̋b' e/ 1]ozI֟}%.i9C1B"ƚ{+h3Y3jIZeƾ>A_)t+iu {n{)Ha VVز5Y RiV7 ,G3y,ǗO_0 }G_?: (3I(yLQ  |iioW5;bJ3Rjޔr Y^02xq}Q4TfnB~ƽB}n/s:GSz}(ZMq(YMcӑh" wWD+f>jx OsFS`{I]0^2g{`nOf T>W¤<9uHzVvB7e <\&ry:&|C [!gti>^p6{hx N|2_r+җmb0xVA1.|(ق/! }&cݡ˕ejN<쑰W˄{0є$@;/s}Rh!oFڏjd3h%\&]+NKkhnJ;$t$G܊,pݴr>RqoVLy\4{JKWrS{Z+Z+ۃC׵p>fw93R4Ψt|$ *^=wxu+,hgL m[/e]sa]?-Tنtecq5_"Vr}f+zKV517Vt=8$a5ۥx.#Xړ9߅J#s`i,)bOR|jGbjHyv#sy~Zԫ%L3B6?&s=5Bo7~RqD]@k+éa̼kk0@'<^3jc-m1[ L^dyӉCr\a}6X'F+W( G03l SfzI#ŔL96 K;+XH/ rqz 5RGoy;EwEJY ZAOK[l'Y&0Ɍ8sS834qo|rÞ =ПhODHr?P/Tx( ZRXPkR`y}y`辆=4U7(JYK4&cuN:}lfg*6'g$o=td,/!nY7#/opKwҸ- v9G){ouۯTz9XbEQw =AVBi H{G([pBj9ՀKt`Ko{d)\m)a1βu~MMSĜ϶DV>di]k>::N3$ .*}i䮉#D;!cI}=#9UmN$+8(Ϣue<,{DAARSm*^OG·eM&F)CsV>-s!SU9Q&H4C|bR4^ #ʹixrvYKx156h>`ڐj r <]ybﶱ//iѱ]zxb2SeǍM_$YW8qJbgL. Tq֜@! +?G/y$,)x%Zx*6P91< -)uXeN _"3p(M8\xNR'.@uڄb !<п_%X-Q7c,;ca;0[z}-Y$w'Oh M~g6 Phg 6㱲)ENP@[U{gk'=ރk+ #:=y H$/ڇŒ}(:MKܥxw=ɪƿ"xSYFcnr3A:Z!єi8Z|,#'ߐ@!h%j.ƾQk. ;IZ@nM P"0gR- xX‹s!*%%$/#NJ' &a -9bED5rx_=YS' ղm?9p4s0a5 [4 ?bݐH %%YqHpĶIVAJ(Fߠ$i.ȶ[ G1Q4-&9p-YE 螳HQ3,"cAm%>eH .yFe9Db1uGC3G( !WL9b\ȴ"(n7d{GiaQjt cːmXP\cc ?^P-1'ҿ7sW۹Ğ G YW/ڎߙt}enrŗ%T;^q)ٮ=?%fQ΃iVCͱ4~fJ$ ҦK'SϓXMh fn~S:KVt8"5m#g_9oqI4H%Mxt)99Ќ1E:~ Xfܤ Э}Pa3~*MjƇW3y(&w`!!lE?/h!k~=7kH'n&/Bl{72,e=p[m >cYHUwobzS>fzq '۷*wnN34pM^kꯉhf1b{͛e@\Ut'>i%@L*l Krxx)328'%ټ=/I(:]B:DeI = wH>q,>%`(e@Гy>(|:xڗy``]ϱJ0<yzp WpEGU>{r';O(SbMB94noRMZ@%k]FL<`OJxM}PV|&0_M&09嫧q^4pz"n@羑8cU-pȔ([K]5wT0$ 6@9RʼJ6tr!= /'RT JP@kkZCҞ]kS^u#p"qj r Ǫ]` ^fsF_8 ^j[^S pC^t!T{P`xS $]QugBY&$ł2M,&:3&OXQ-, ܮ}/N`XX}f#G RɽŖt͎h:T/xѡzrr,1Gܛk?{5JsD6BNY]fއwnCtf݃<1Nf PԥَuB$EMk0)q0w6" !aħ5:(qE1wmOESqEKuY"M3gG.kt'079{?5uZSǘma_1r4i3b&|+?Ojl=E@5L2OZrhNiVy>X'{=&F G MpΌȨ D2 ).ksϖI l9*X = 0厣H Lm¨DU`I"[")0 ,,fy <8n,$flXdzd7EY@^e % K.+I OX t(mCQDSGC#=D8MS[.GnxUo[?)5=IqXJΣod>|5+ 7.|BD +6iqKQeNMLg mcHz*-\=)څ;9G7f7qܡvaqjBNFih1*M_ ĘKdhl^&+~巳ĵ# ZyGM^Etd#8жyƖQh,R[ L٤g{G ]BDONN_ chxni]*-!ٛ[WUAmR[i'+ҁ81Uy Cb1X׃ e߱M;i=>Gۥ9 Ew-v|d 4>K皏[ўp\>C1yycu j.Vr_s91u}#O>L*y2a&6_#zTg#jV~c9Ո0XD:a@?2Ӂ^5¿ 'ʳp4zqoTX_aꃦET1/,-̢ 9 C%jK+kIP`p 6L$|j Qj'{҆z=a-uFXɝY_K tԨ@鞱3Zvf&ab9ve {l=K^TV P#'?yIg:-I`#@׍ |U>ͱ̀ڈFrർ0NpG떀ғ_2 a@T4 aɇ*7f 'sGɆhC[J ji +# .V5w'屗bNymǼmY`SؑR`S[lM IY6&2aM)lzX%.mI!$K-v旤s(#hwznPfi J3 !<3EX:v_J9lH*Yr%4:ngӭ%߷$`y4㖚~VõݳN|n 5AqRɟM&1XI0|1%D,v$ ؈%b5WGrs I=UfϘu a5?.0z)>ɋbFʚhgnYZAXHxC0(L3=6;];ҊM0qJ|XNBط;.mM{iWpNvK:Q(gSga%F&mm5Ι[H=U*a[|cUDـ1}6xL‡ 4r h 96jؤy|W$|Ɉܑ-`qa$|t|]u1K_Y%ddՌ,fQ2- ʪ@wHFh'/~""=v S$9F~g?!vA%cS "ssn~ES.[Coy.ۚ&fG83AW݉<'Tlyp{g:Ǝ.OY=vwzȨrT ܇މCPAҒf![ISh'dny< Ewҝ},| ~xb w={2ɪ|K]*|@Gw1SkqT_AQo|9N_o 6+ qLM_H~KWu"37y(TOq*A 9U5Nkt''\J,\TaS(8CġJx|*ij`.]l8@ 1A`8y|x{_F#-66?s9MjϒT;Xpjн_ntK^c1qApyR.bq]Z'B&Vt-_4y~-FX2J*-ciDE >-҅2҃tg"7bik֣։BtS :{#3)Fzhc^Fg'04Pq51$<ϱ,o>$DBR+i6+@*CFBfTAX@CtMT9[t` 9vC%!'%C'";z ,3faR#izam5 <[ߴRJcIuFd@TFN-}K;NjT6;g< U%U#ȅ@pYEBtCj5a |$+qeDH4q}k[\Yp/:jk`_R7נz*֣1y }SlfC vn=%ޘ^Ba^] 6hh;8E e7R0_ \V)| @_.QIۤts dӈw zh-kxu=rE>.4g^Rg/J|<ЫƘb{^}uकx޾ E/K/  jb! b$)XVY?˄j%2$H8g~8aO=%Sƒ/Zr깫aȣfsss \nN#fPei!~;SKkPD zl7nZFĝ8K&VM z:46$&Ds^%O2b5A6|7圈5N1汄gG?|a>f!>ڡwS}}$T=dmDk:5, SBVst0ͥ> M: n{{䦭SAGe KoMջή=ΚR^ { lnɌc:O%˫ {yL`#_k:3ΪCaJu}_ 6ĮKiщy4jLfyb%ςrB3=]'<eQ$bV[ ^7d AºYo w O( jaYEn`K]h83"AMťJN}Qk|8}LkL@ lb!%bX-,&\܁P`Xx.)S#_*-Vkۙ,qçe@gsM |63pYmlkzq[`x@T]VXVB@VyFuȬ$3xO\P[/B! 3>|~ 9-d iYfս䓐-1?Eۛݾ1gu-]Jnq̄(R8X銚EaaUʅavkgquIb?yeSZ,ux5kh((؞S0\^-%l˗`I0P"av2b [Y g-gx4E+b@`ۦ-1#-vMàR Iξ@RXJvC~]5 5 c.Ha^c,I~Wֵ9)uL b/nGm)ʓ./Fyaj{T]Tq-^g`WZYz効- #f͈3(1O5 oSd@<>m&}XΒA6K lxWrGOV34,T I,Wie9wJ ,\3Ҽbdq7}z_d |THYi Xgp·Oҩ1MuW!A&bzhOq ۨWHĝ-y|h8$Iɧtim53(1Pn7I;zwᩢAKПxCBlh9,t1蛆t=Yi%FnP]G'j2!pwB! l;NRqxnb7/9hoHp%v&8J֙mvb.?˳y,&[pF+dbM4;u!EHDJ4Ƥ&Ё#.gMg}ϗ,X<յYKx͕݄wlK;+z =w7֋i~rbQp:%|_lMq/zaN;~8܆L|TCbm `ǭ _,LͰ?Zi=;!NS )0+ u÷Jo2|(ǿJBԳ#5}x̯_-2:BCXUjeoD vCݩ}zAK 0\<̌_?yX's.*mM8CJLL>Jh|WfN>K|JΎ@>ڐ FyM7:s.掗.Շ3Wb8gήHص]Ө݁ZEDGHS #Qr#(`s-H 6$~C5E@ ͔$c,3N7t?1B$&O5<`I-)6,$hyȳO<b&! [@AVGZۅIF⼱q (Qfċav 0 `h)1-!և4.,! Ә?c /DZ#wwIfO0mDi4Mgq\P5MfI&dxSY›C87a3B/|v[ U<"[\KC$A grp =ʝkH4 `t)5.qԭIv?*qPVҔG%Ok}lpz'y $ [pPCHȎo޹=',8]NafuN ܦAѫJC9 +28"Dt;pF59kooi,mY#J~|U>J;RKzbh !X?&b.I%:H#3Qze{Zk604x_TO/U4ۗeBtT&$~1-c*UN qfD8L mm_P:+*caD[V sMK]qiY_ZT7ҋꦥK?.vCĆfAvbY+gA-Kㇳ kY`QOSH$E3L]L&r0|n 8H# QjJDe7qtȑha"L[D59h-jE2渱9Ox6vk"BQvuCRR() C9aCXr:-\H,?yk4RkV CA_; DTlknyKN!t)q=/{eKL1[!_aŖċUaV՛_M_Ue`dzdwZ`,F@縉t})~&tnaɢnV"{Y+šoam ܓD#4ìd Bcd@ILz8] 'E]NiCmK rhҪFVK c"ՍHo)yP: U_CvFh(=Ub Q>-& %PNI~X`Õ|䍽|;pxmUz#):=-bZу [5;~L/ڎ*Zr)yna@%m#yB+oEoMx-ggG@Orp,rF@jl3d|\#} 5ᠨSxiDPlv?-]+)$'t>~w3l:s^ 0H|#?HOsnX>BאUafL5T>Ch;;lcEGƚbRlUq_}[nCH\J*::@Ay$dYl hO>%Zb-1)Ģ9: #(P PK&~djPD\puBm:ɦ7`!ƘR2u6lAhp?x&, K*O*{Т:5XH@O1q:i>̓cTK̨&/K)aC=*U*Hg>Oߢz Pl(& ~#J'6æc%ٜOIg` GqD,ޡB`)SH4*FHDA]|F3D][Lq:.l]vH /| p],-{$}@Zb˽:AEb3 :. O< Kio[u yv‹xt6C~x™++sBgu/⡟Gثr0|hy*fJZ׮"uA(YP 0O-:#Ĥda؀s@Ttx`)stHY%tATa`Z/qmU+\hVc^,=D.x룺؛˛RZPXf|f ģSa|1gbTCH? }u$QC>klX+tO>?u}(YOvf"0>Da(KG$ty:xE3rK*i:0ULu^nË YhuC7wXzq Ċ3F9A=`@Z-( %>q$4$GZ7}׽}.}mRIB43b1雑r<eb{T;86o|E.gJ'Bfm5 bfb v.~ Bݐw)ߘ&fy ߞAF]Lޚu4lx#lΙO'`3qD'O!B;)GCp8ڙ9b Mא BEÝ(ZTg`p:5]vP Ex\C27/IIE( 'Xd ЧF|]柪N+ l44k 0\ulf9TXI*O]7Dh0Ώ % OH Jdcw~%ُ-3[;pf>S"[@g$`{gPAK=[˯XbZI$CP3!* ï!{Rjhsɪ^LFy+B|$臜Ek.†Rp4_LޞZ<:Y0t9(^C /VkN3VzU 6>?\ydLvy6~5 )!6&Qr`eւb*yƺw.qA@@'C \k@|%0N OmM~PmXvY]cirF ;$" qD!rw`I#2m|>PQow2A!  :VaDw9I U+Bv\ 48\ @)1^ykIC G<ęqwLlx/޻6,ѹҰoU#!/sڀplrOoEuIteG#E2bE$Xm%ͻ]›teoM6 |i 3(xjE\&ûkdžiMJ8}?A|$C}{on6ǛtmbRvĄv,*HxKr S<$2 Ј;TQ=Z]KU! 決5sv<<$&\| 4]o* o^/'p)@ \FA Y0B*މb-3#&M%8ǍWZ=Pu.3ls MI A :rQzdJu -`,Qr7jIf]JV5A 1$:zkz$IDxe1 6@: د^-01P9A -0SQ{%(z _ f2"oٸ&E'%(@ݔs̯dV^h{*N{5^!IJ_nc ע![~:y#bq/}2Cׄ-},:9:;Jfm@aX}xؖo 6,`Lb%`[)A l00zJS|aԲi3Tn" O֝TEvs ݝXd\Ɯ屵sLBJ)/eB!%S&w!s*j`39$2vQc'eLuC"QuB_s""8y%s=/ ,.)we,%;9~9iYM=)V-)ʩ5 pE+^fa;رKÃN{ؠia[W8^pW3懏I>j^}m#`tN5c: E+KԛLW{DN5 L|zu1˘*iuZGJ: O wVgI ,:{Jbi|f3Uo7޼x2вOnZ$0oŽ0?nbu'>(}d J5ؙ( Ewop9j3I6Q.,~?uk mO)Lu4z  )9}0SSAH׍8op;//{fi?w  uţ4Wz^u9tkÈ]%[*Q# Z^1*79CZuY]A .sЀӆew}%NBkz}<]3dȃXB ۘ500VxUI 5lPjiN<[ZjO.ezJNqAT y3Oght+ojY:φ6]6)^RRCtT*㶶F߬u&f`Q3H* Β%@mEc9[M0>?}bu )Md=1!D19YL:i>,֓:sLz,bԤY2NTU\ .{& |>bꃶ'[V[4ܐ_08)yWwEJ\]&,`!_g-)9<8%(|[UCMHfTDQthݥ~R7`KThג`.c>*Cc5@\~ 0^Ҥk:buOFJ%y qAݬ:a\M~L`9!Բp(6֌4ֿz9VsF{`]f)*@J]5=jpyTdL#Krc{lBoqtR 5$~jS,KhX\B(dHÜ oF%=rH+,,5 )5! 4TM&źxH)BhƋ+R\O3jDjs1_38M%EU#|plU?'\L1Kg6GF#.)L`7 8YF5jν,bԴJ:*qy/脺{eAPѱK ;MsZCS<2u 99 d$vI?zf2=F^ۓ#Dsj0"\yahX [\#g`Ot$*c`X#Lp7rIlTAh+Jhߤqܰ " , W1B#$@I< B*ޖRMͤ$4C 9+J16hMcaY~fֈ'Ր9kxk^dTWd1*Mir]F%&VlЯMgnZ0%fǐ/W/.D“ۏbPt@A7P""?&p eOY#hÎ0 n03a dkX(/rSb9B\kZ4˩WWt${(WnY  qPq\U,Ńfce?Fe0?yXCfjB{&Z<\9o0,SL\n)dMƭQa\% Jb:sX8%pPC `}MiSrSʸMN`N7 < 4 IȋÁqՈPXXn?>Yb8b #VX *V&CY=_Y& v25F.?gO@˭O~goliCy׭ Y%A6~,?:+|GƸM\οo8 S5DBGr@-ݫفh3e$pPzQ4%҉؁zDfq YF|-;~䙎t}9PqHzL1?<SG{UB[Ƀ:&O ab8E6 1lE$6M#Y s+Q" 5(R }EF%7̹s*0 S}1BJӮl|AH$fnhFi9c)8L:!1T1ztk+6EN2q}7]* lIf˚ T_#pe& 29u./{mr w.ތ_( ,a&aJ\t=/O69&2`LIþ>)'Oxgfd$c[UǰeǻE0:J)϶sYYy>kZD3@h7I$yΤ)\ZqFD{̌lEib +xhYL h>"S6q!uͷ_!M;h0q"A6uTp"fڻNOO"k馾|55ytTGOV 8x5xB4B#0ĕzj>')䭂M\p؟2%[2ms& ZC${촻`dY\Pe*!87R_-  JiRlz@ -xR8]}`jNhok2W֒XFX+Cg5S b %> YFcbMC"o,1*(ՁxSv$p7j~0tt"ґ`;+/FB:@2R&&y&wN4{&7aʧ1FMmִRXf̈M? HL㵧dJO} [$G,CC}RԘ#>p!$* gw[AX8rzG\n;URӎu Fa8p SQ+"Ejl 7ć:ㆫCn B$ęQb(1/0 LJ?h$\MM4ITj&P`A48VТm`B ԇXrQJL":E5U̳"_UR)_y!x,J솵V_(FuX4$=lC;fz(' ˙b-gw't|%e!ʇcQR{p"f`N36 A旙5`ۛH9RQF3ػC/ܧH,rbI%`w3uCS"@>Й#bd4xN'MAߒ?ɣ5we$v3c'B`bl4$}DZ3(1|AZ[0dwo:‡ VY֚\}-!Sp#4= $LHMC,T^^Tw+$<@DjGlfu.S&2 aulݱʌxs%8-VDSL:ywg' ^1#XV$a3N#Vl8v`@-9&|R]S5a_=+ܸD>X~4u^ey'O{(,:ǰ,$AaȩмguMVEd`;R f=ٸ 9~48Qfą9};:DzB*o8Kӄk0a#jE,gH{V̮v H4N|C¡b4\ta @kzSU߫^gYP!N(l T#%LT,t_>JÚJǗFV1N}AA:aP1Z2 Đ nr(DA*D6"KkHaX%Ī'x|skC <ɞk{͉<8i⟈mM1.7%c˳t$&y؃:w7=]OeYAT a ߘѶ*?I3 o(M _f5 U 3r@ #<ƀF;שy %93nx3yoYrƑ-fT!IFImϛȺdNƖ/8 )[91o~æ3 H36~br` ~oMfê$c\KӘ{3gH6=0 \QM"HL DNd8U؂]kyK#!2!hVhdx3 2huISidouI3QKRr;?yȱl;Uޙ9KeM nЫyZzp.n YBODjRt[L%ĘgBCUphI88GbDt\`|.m~/H TiU/XD> <"ȇvzg𮱿Qli*f}7Nto>?! bX mڬ Y(lž . >%*#Tp=6/R`ߘd4v ;w8GgMޜH<F:ae״泼ڹu-ZFд3f@=w5s<- #k< l: U-$tc1tD犚 l)P4E\J!SLJ2`*l]dpn4[ O(Lu#qG0ǰ{Խ#a"!8ɨ Ό5c QV1ekqCS"\`}[X|<0nU(?U8oƿ<Q)ek.+dAf HJkXW{0 l DZ[-I*! P ##T(rYe59yO,j}QbyA]?GA[{ZlASr*)h]h86r౤LJDU0^q)Ly#zܮ^ !7vp4Lp0ANy %a7SiUc9: MpP^';&$a%HHT HBEY xŏm53`!"/%f4:P?> {7T7my[V1킯KsxRFF䂎V~Q=<=S[l̀L7i;H6ӟ=:N;$9IǤC(E 2NW[p!e4{Ii(.i\a.v择Jt!7P{&N$X6KwDG6k\So/MVc6f7JT^ q <1o( Gw`]hA,2ٙU"y?cQz1>&F\S\ f̾@U6Lg"&X{VYA0{EA% OPhA3OBN-16=[}-fJOO<9P$%UHIa5]ul.Y^Fkb7&'BX,c^9l},4Kv*c\Ǎq1y bdVEM# A$[/Y8_Ls&T8c&K8rbt%n};\;%>|z;7D"|f;b6!>_~}f'-$QiJBtlhYoݣ0Iƈ61-ϯ2 bd=ʬ rSP(Q'&ڧK>>NORU1J ԢR+EíUoK5+|>wNx=`LmĢ#8MHmQ"hd"Ȫ Ya#;-)'s!sH|_?`Mm_WX= +g7ȃKz\/˝:*;Q<8̆p8=hy$ZCb2 rk 1ڔfh>t(SVD*D;wdr@"=G%u^Ъk=Ďm8TWQށ8<$d"vË cЂMEW!H Ȇ!IM!m3L"6KlC U;=Q4{XhNIF= ?'mGhb"ks3̶]__&HgXZ9k_~[}~J3UFѹvQKV= %JqXS'Ă*xlej6[Hg62>l+H2E*'i503 e%o1K3RFrЊ4iY* \wAQй?bos]_;X,'pHIY=crqyƂEԌBD{ȱ;WgUJέ[)=p(y) v.;/a`QȎnϏp[oƭDР\T)tKLm{_JT>Φvp y׭_Mrd=~wr֘0m),-B TBߞI7{ :r0l60/{I/1y0V_]=1tJeX}}<8+%B|W3ct&PKGKN,@Q>fsG( {SM7Acp4Ԥ( ),&Ct vèA`1`" '@ǝ?HVCKEthρ[ +&~tNc0y b 60|Z% V0AW0bʓq$@z/| #f<aLܗ_e)#_DVr ԕ,*pM2˧毌W JXp+H:vXGoƏ~d[aOڶ)f)HvW#'3/Z H5-PmNKvc\%df+K =2M%T0 KP_ll&_.Bzn _}qvXPCQÄ]ݔX6Eϗyuo9rĚOϭ}:c^s @P1%xMvWnЦ"Kj!)j<]";ma XNUɓb≢szA"S0\cy5_}iuPzŚƊXWPcm% &.`G %WG̽wexc*#3֣T[̀1~;09HhڕC"S& Un\ݵ35Lo^OfX< b˅}mi~Ede=DO0ՙq!E|cP}#3E'bo Xmyyx6pM,w:WNA[h,Yvr_E=Hb@^eȌu9شsJ*YD E (Q!3+ dgn^"F~Uw`˚1\[lۀ%rL?AjQ7:Pm:!i KVُGeASf֡CmA|>wAH"‹}-O? uA Q,uKÉy J l`ۮL Re [z^)ȣp:~ ",OM_)E@Zct CA( ?K5WR~XBvY10q2tGOY^=D?B -[L4Lirc c|+8}֑b=RLR4wkôjJGT)({@D ѯYiU.lDdkF; `{ Nz I, {p@9 ?[ߌ`ʙd^ԵsZ70y$NS(zYO*A "# u>ϼ30tMӖ}+\ 5FP3-6WhDNÚpz`n~%9-ݟnհBG;`.lLur!籧.?cov,hJM ڍ"`XQ1 'eEh*nMSSq\~ڊ>3A'8p-19Ξ2AcrK0!ïO 5u}ŠfyWn'LCw,)):k?jC:h,qTwML y#x!jkSʚU{ r&PGxb4n2SF 3 ,#G;nJ=2&2I/嶌WE{7V{.{hlBx:|7O^>&/{<~/#Dqq`G*W"̵! Y˚3(mB6j=G 8[$Nf$IE˿-D3-"jLvS܎Y'&E?4V]KW.ˑxjxX'+胒/x5gqYK:cXp+-uU@>IRTitpH{xfFv\63u ^!j-A)# RX`ֈ1 5nBq\TBYk1eBmE>`qA8kt bH"\HF"ʙn dUcnY.'TІ\6`bD2${aL2 *yXKψD쾀n7d5&wFOQfb` BdXMjGpX4e hjل __.V^̸&>/.5LgxM8*,'rDA7noylXSi՞3>HoBJƛRB=vH( -*a+&EcVФr9TsTe\eV{6h&Օг:Zaìkfj=|_n;%^/tkP*vLP,6I>"n +?cd Oi 9,+]r(|(}K4%&c5CsgX~RӾ]!؀e)9~\M`@ ܖ&kվv, `4'e{ã<&|F_skRLgc<̧ .n,m9֏w :zi]F hr:|=̣%Y%C0HI}-zʰ)\@,KtYܖྂ EH h{8(CL5 f J7%,, sW0C 4*-+ej])rEI&Y׼ofO`,Qɣv0p " 9HӉv[ӕdA0,3 JO G͏gZ>` \ZK+@Ow"l*.,XsDbxD6-~3jy^ u|0ĵZt|۹Z*hxX!rFֲ#Vs/XssĬ}$pDK JZt5lXlFL hT+Uxlq:zpv*̥f"g;ۀplIkPb, r8P~'M3QNZ -"&1`sú\KR)5V^ܴ,*8@n݁yHX O(şk&"{4_/(ظL7=V2 BE.UO 4_'֓i~dc/> 2gJZ5-a&Gi„d\, 1yѺ ^p=Iyr%|=,q7C?v9~%Ƶ"*#Ӏ3"!mSj 31HV,ɖCF-\]z1ZV'WXh8JYT2 !LZT_B=Dըʌq Ďg䠑(|y?9~XqO}Aw[`d0Y=X]Q*ZfTȏ@/[N`DQHj}0ȃ"|O.+1~r?ԡuOi.Ђ&ROҽNdZ"l),#tcِͲrŁ..$N+.w@ŋ:[7D;¸eMŤ O)V|jvvf0 ɹuti Fp[nȊ|Q!I} ssR#d(,ƂR#Zs2c+zb7,i.?\$L) AH?Czߢ~j@Xb& 1X't+f"@*~"rFAZxo8F3!O ߐ7O9S)q)b2M"_xV ;C0+|4F0@{/>/'<@8-܉qVfS$5| IZITC]$2Xj]0.zޒ/i!|#I" N9'1^I;fnzΊT V4&"[4po;Nh= 3nCBHJG}`ϗ+^ /X^4 o 0ZOPweZ!1h'7(I1 9&w*BN /"lȚ,\OS>$$ˁm&A=.Zfd(L*_x#m($ٮ Y"% *V%̏6 ,'B{n)7O^0|3ɼ*Mf1~[oEFLcf-N `1%2 c8GP[v&C l%!V63ۛcH4Ωm(a@**dAMdC{W{͙E3@*xKA7DH%}H+r_ :`^%k(UH,0 :].&)h!HP>0"WSrEe6 dvu׼WK*=M5 Qм$* s”HׯO hmpȮY|2@GI|I)=f n%IlvG4?~|CDМVk;3D| Kw[-֑f\ ]:9w8)P.UU/=8w$ۥu.;ZZE̸ilȒIActM&Ø`(TA?ra8:l@w!i>bѧDZ|&-xMgxB,R O7ݠ]nt49eGW˵sZ1)[hI{ 0cP梲VCKF>[>|=T_=F8n)1PWyw U}0ߪvh87do ߬ )U,9h%*N=W찔¿v=qWY\'ga|HlBzY_LY٭# -;8+ak|YN fȮrwک+6:Q/& |8 RB-T Ex r|&Q\# #0ń+B ,LT%^+&לe;yխZ{%%c ƪ+ij3"$5Q;c]q 0*!V/+psGSzB ),'%B^Z6%Kn=J#gؼ ɶ+'xȍ:̢Vj':E[cl5Rr_$p;づڡO.]3 HBnB+B0˃Z;B@!$,>aIf0Wφ[(b=eq1>CS+$R)u">ije6 z8j t$+nðyUpYᝄv!G<4pN!, r^Z %<܏VJAMM4Ȗ!\MT C%Dim 9F@-Oa o,^R>~:)E1;<5OCF'@گ%UgG>d2{5Xvxd'g.b=Q3@zt+DtQ_R5c8/Zg/&9S"%= Z_ߖu39/6j&V [ dIұp²YRcV5eW3!e|L|I8ofQgbKٓo}͋_9/fj6)^Ʋ+|Hq=PfMC5](@a?%_Fc=ŵ"R&W8`R5d WR )#I+ϭcw80; 4YT2+6Ts]zr.͵Ϳ!!kB*ӲsB=IXrlz2SWi:q]`>+IWLg ` E2+V5 t` SrY#.g3dؼ T[_/ڬN!3̙z6A[Os vO<gcu}Izj'zm'"!M@lu۪eD$Hˋ 9Ln;ga.;HM M1 H y_nގk3g`;ݿ7/_R}w)؍fN^mԾ0_1jO(/;˳o}c8ᠻw Ia‹]vFq5 jqXkNAұa$?qluHfZҔ=85bidIt@/t:1’4J߯a͢O0):ޑbxކYq*F)םŶتͱhoۚFJNvY]$o j/8T/xYC^f0V^ĺe->ƇY\T`}]K㧭lʁyzcU\|"h kژ闧[hw)달%O_W-%MjI>~r`1)ICVI Mkx#{{IPrh_D>Yyt8Qia2%pg,٨Pld̃j;ŋ6`G\P2)J+sZ{\R+>e_dp~  Cȡ]C /gvM$1X*DX!MoivfbI8B*8LfRm?$ZIp*/D,9Ќ)_ Aa19.<Xh)LZ KKTIGK",ކ3Zf̒?bNħH> S]|:  mv,R[F9a|O?qI@jN'&uz.HU(zS9Am'}9uKzpš$qV78g_1^9}~X-ϐPaQt?IN0w8Ų̳.qO_EjU ezJ/әBztώAkN]rj4'CF''`i$t@͜`Jjw(Aj8N"ő%-X(hM,-kGcuynSvܧvMǃ'8;3ov%l4*iiN5x̼>yxMO&AbCJcio6r=%FwF!f8,^12ӃEm.@XtQ95-8N04vhgvR˥3NR 5{QdH]-œy851 ~n䟞[!$ʫ &צdN/ElJ̏x)fGISҹY$<0-;N2$c顷:':rS{s2R<2IkdI᫐0?Y,70'(Y'rI BF@4%J-mm̏m :q٤>$n׈/{Y%g~>ّB1}ȑ3?,08e_ȅfMH"[!dzv+Jhls%h9d٨+fc-VT?=$8p>f7OG?E>| A?w3fSb)}u!I\#:՗G@ΘQ\J!ᡚO\/{gDRjX 67zZ愣6;Lm9{~l?5ݓ7IAm ӾHzcJ#tleGXE8RV]E$mQTΉi:vQIc\db:, KpkNqn~9y0u.}NXaU;q Oۛ N,=r_09g'Gn۠r+d0s1/x>j œ!7L[eMY€!X: T&\)ґ5 5Gts6_%rbBQ0x0[8su6tj->MF 5+`Kns q2 _ t],CvBHb'd@E{о˂EYET,;.U4t[J0eLN"`^AcнLOZZ_z^yT %KuHh!gapW)JtyHe^=ͳ824n35F XG!%`Gs7j3Ѧ͕|ȢolcyIcW"P6zCxI M! SX]xz<&` V gJ%w[L~y_3 XLq%M3ZjOp=v,ʼ6>B`+nO#"GViΞJfp aGr8nygQ/ܕˢNmDen<$0 rbQ?~nuzjGU(7+rA)6i lc58j>"YQ7T  $4sO<pk:6oDJu كA|~^tkגǦqSx0qEĒEW֍PmY7{1}z h'Ia@ĻG3ʃ(\@-%0ixNM4F(&av04,ŒmlIzeoPin%J&D N@4hE>.B^7<5uBu 45MrąegRCbdžH˟<Fy}#/k3M0jGɑ &aшw+_0oQ}D#iw?|r`3 lAv3$B2jƋo?? $ K37̄dMyVހ``"L x L1S^]! #X^{X7>'->_ŌWX#VEMbpcd`,Ol`&P]0,FU~芍162g=ߙmFݱv)fb?G-Z!DT&DA@8 ߫CM , zT8ޙKb]JBJAfb=wL3F #7pi5 D8%L"O{$tܴ1jt<12oO]7xFT+%By>!$B6mH1] rgh v"b42jάCGi9˜<訇bz?<ˋ!EPH< <N jA hs(CP2#֜}qQ@$RpYC,ADӬ&㮁Ylq|];ń#^hDjR+v1}'X4ir6 uQ_ C#Ts1 \E%Q>wf@.ʊv"'ԁ~q- ]c7˧UFӱԜ٩}&+)ee sCh -! bRߊRjc9%֐2:n8kpn6ιZ>l3îYNV[%@+,X&h-ׄ WšvfYf[ӄfXC g.EKNt"$=fKY,y pQ}rh ug ~K]?>(T˩w"ӾJ+3ϥ7^4}{7F;۽ U&=gUnc(mti|aŇpwNYN pM! kbBI' `<5:{'R9vS͙x5nRΕ3Mk5!þX5ؤptd47MEH}J8E #𣔎vQ;Y{k-|iT2rPA?K'#a0:<[/!E[K/40-* : Q˯Ċj&Pɺ\6an;Ok!DD]dJX NUB@ueo;})-ҘOX 5(z%3 lϧ︇ГjA!q01Cj*֖_pC޲ȻTb<9!9k""{T#bTr_x \q]JL {w؆Wp 6 =R"/]>n/9{.(O`Ҽ#N/lZ 12BБ=<b#9ǂUqq \'"!=O񵅃vv,O\bw=w C)f'q?ull ۢkإ*LJy s&<#cdmLln[r2~vFu!6+s-_v:fS(' jd|Dԟ,VZ #6cL*gQ%1\jo $iqs$9NikN;cւ$Q0N/ \JN#< &V-wyFCRD1HZO(z/<$CR.>k?_C1U>b@mE6wAQ9ޱ( x)hROP'D;؆{E(ѷO(܌74LCfov9uڞ^U@O*BoA![(E{EڲO8>0-rA0ZP~#f|~  GS^ ݠhxnu.f7C[ZZVBOSpܬ\H@0O+pP e˽ڢϤ19&,;mTPkAyN )N@Md;$ްiwBCx_TieHJx_-A9`3Jldo8yLѨ$p)w!N0l};sPL7UQtm'R%~[=nY aOzGƌQ !LH#`|f zgUq,y*?i7yeWhA2l*vGٮC_oã g Vu0G= k4SO3h鄜7_P5kGлtal [Q/puRJR9@!aj03>ZՔ OowY~Qc~%l8c鸌pX.Q*vO*BLĚAG+;Њ, )iԆ`3T~AςV"ʿdgIĐԇm00 #jidT% s3C(;{$ip &dpLS`)jֳAZ֖fa >ʝO0i|/ɻ/x𡉃NR#c5$+NXϥc9ffh5fo@Ɂiq.wNRX1:mrlV,-R%($ɞ* .3GUw"\rt9pɅdEBׇq 2v{jJ-[Ygd0 >P/QB}x:t LήA ŇmQ9Ah#JY@ ewdt<͞jųttX\evrцS7MXw"Ϙn u4} *YN&|tP=; 5%0ȝ9|E뫢V'W#X<~lg羲wiUx L[Fj"%m ),<$Mg?AAJ{-.'*q9_4%F]RB,2#l7,@-  8;S3XyLւ7ؘ~4҇=[V9\gL s_û66p.@v,%R9FzlݲQg\@̎qK_Ơ-&f~9Q/}K<[aȮ_޾ΝFKK<͹vb=MJ;GtivC鞭t+Jz[>Ks侒/]\yɯY$h?97h'|J<Ln޽gK_d14NpVϥ~z|&P+W#Vv幒v`FrB'%:PjbNsPoQfҕ6l=)h@uh.b×4y ٗ 4d5|Va 9uRDZ03J4VCN@^kԗN8AT' n{7vSS4N`>T?0-Fmto}.\2--s&X"X1Stbl5(ಢP&frn.يsp}4m*R1o-H "p3p#-龖ߥ^ղlcBx̕-d(+y{`C*C}dY{W%hGNzpNE*Fe> g(p.7s(8C;gOG53aUU$Oeb =pZ-&bBO0L} C:ucFʺ@Q-tkh lL`玼KMWZ>Sh+\zur3:yUߢN%o3֗O>4Mo[f[ݿ\j-ci}oQl{CZehM վ׌WD> 0XKW8)i r]_Sk Ύv42H {l;c߾v"Ơ|qg1Ɓ[,#y(}?sʑrRڕizVi`HYFha00;P}yɨ.9T'z2AG7ZIW,y<\uZz:WkWZַm]>Qqo̱ÁL,zEQQtpةZ_K _D".O,tg/t=I5g ~Kz+l#*w FBR2ɀ gh[hoS^7}Kn.X ::?r+Q/QH4ıv? K 0Mamڼa^bW44 e$$+'L<N. ;&MgT ˉe`t}Qp|t;Wʹ?^zA{ !Q;t ;|KB)f]y d!ʞ<,ݡ2K_u,x-, ,FYd1E$`am4,s )l#Yx, w<02`sJ@!#+R3,bQ,[NcV?z.?eFլo K")fv1E fO呵O~{dg둘<}Yؘ@$wXfS˜t{fM5t`cŊtqϏ99Z+W^ֵ{ 1p6lgDuPqASm bN!QgP[/{Fes;ZeN>g>Zfa `oߕ6]3\7:IB0㚅+婼r @SoNJL#ImGUqQOٯL;$2`_1,\hg껃ƅ%#`a G`\0qF;0Wp/<nKb*̾֟\^Q6ٝn6y 1qsh\WiزSx RRMF4^f\RAQ9ozVJTO'ځ=Tm[*Q;շÃ[VND/r=V~s ߍo:Y+aQ{9<> h)սPF`{dDPtZ.3b)^pxKqy Veў݃h\ bg*np\O]Jɱo&V :PԞ\aQ-LWT?TVi4`eISxO<]m᫵[87JpEeg]S-~r-3!|\?#*P9Zn8/&9]* XYE647ANZ='L]o sxݠoR s{%ó8)?:8# O(SރlK/aζtt ׺|xztOoa'bVK C$\(ebөI2Jn鍁SMN#&R ]gp׏jpheOT]y#+>&3RO)YL3Dy&QԌ@F௝klyjh'>M|y~<%i{\*pqٓ3bʶrķw74:>+/ݡ=D~x2yy-Ot{zחBqMdnlY9}M1.#uʴdnH s6N9|#3;xo9jN/&J;'nPOi? +=Ɲ}@h  ( ޳ȣ-xF5?>ĆeCІjrV3gv"#Zⓑg1l;j WtoK֩ݶ%jQ[YqG >~e+ʆsiwѯEgE#ٚwFVFĿ8*m{KI^g׵1A & Usy\|+D:#}b|[>y*Q<`m wuh'<'v`,pRqZK qc:HLY m, m+v;h~/{c\HwDػ{>+'ÀՒڲL,+Vˬvw|;{l2E@pX!7 1zbl.=h>YpCҰpsHʁ\H$XI]ɇH8>!?(Bj٘0 ,{Aim 0dW?]&1إL2щ8y9ʎ6[й0sӆYB7ҸRfݞ;3g \?Ox?B/zl uRzt9`!n9)Oy|wm,v&ݫLi3[H010i.:cuCwaFrtΩe 8mCX`\5:Vp9_aiT8 g&Nld=T RMc}v 0/a@`ޏ&o6Yv_H^_@3hN 4^ɧcWP*Lv\ڤÞDb.ÙN/OnIO%8zjWfXj[.X<9PiZrt SA#Bz<9z FxhDbLj ?*֟]cytbu>hQq`Q-F4rZx9גC؟=IԤmeAnm8 Lv>>6;_UU pO*@ .`@;d.Q8ɉȠ/K=` ]*{Jov֌WI9eq)ywC4I??!%zSAU[.Bzl< W$ӵ_bxm߻]_UbɸW SrZfst .5̈́r+,tz~bLﺴM~K'ڠO44~5m-s;9}3@"O%qq`w=s譧4.4@-0{]߰-a-6׵?o OgS&&%4LMa*ga- r:s>QoVQHO7qAGn3p88jN2~b^y܌ қa'̌=p`CԺ?1]̏B_᎖+>\47 oxuu>_h3[MYSmc֨)f\o c :B '1W'A$lWi9Uylc)'/Vo>Y):HLo2?#s:#mKI.U ǦjqY؝lܚJ-(wcÜ@j-_C$ŏl$ܢ1(K1\682.sq9=CւOeҍ{a SzW8 -FOOb(yw?ÿ=R)zTPߴ8~w7Ls~hrbk#f`faf'U9{Z+ܗxP̰`%& ŭ8jQ1n`);UI3|BI1ĂDOLbe'd[-m=KϬ'-qf \1F'- i"@(s"HWR|&2)"2nq6hgu3V)b?EcgƄb B,EIy ła;32‡J+oܮ@C@/GD8 QR ,sB@Fefu]<Oќ̂)KI%E>>A|_ցl+9_p֕nDDuB]HS{lZ Gn A1D F7BCλmaoE7Pd8}Rkel 4[ y"7BT`.d8;?q<)jEh\tⰂArqڗ\uA@&cCn)PQ2M[0 9, KxjL-HtZUH/=f~ @;0vs5XLgy>st3z@p:^pQ)FMfY1`@tle!T0**)Qe縓"ה ~Z[ S̰ zm1 (>Pݭak[l %rKwWdY6}=x l8}W) #@M/+QKWlDޓ)D(LFhe&8fa7R0u+ӄlWktoY+~pʍ- >l ^]v]8Jx}9SIMhLq3VzP5nݛ{%˃1-nOsbuu3R'bsbŕy s4*C|]Ms岭#sY{#J -M qw<^Bء0>}|)zONer}zWn߿"Z/xs\VzWt4DQooOX̱4\|h^P;7oIO}57x~D,bnrٗx<>lkEKO8~2*:/!&TV0<q,?8(*P'ЦW|Groz>s]"Gu}uD =7vi1Mвnb"y˔+k qZR2~uR'㘔[Lt|x_ϻ2mve!Ks+ դaH$5+26 .aolt5*y6_F5ҋEa^4@M*U-%#R,dF9S)|F_ 9gDeu~2a$wI|D@8v2|"mwI[<3]BuÏJa6YX<^p[&8rwzp?^\{u/X)WrP-^Ck_;Y.~b'W#;,F񁰨O u7[\UWsˆIh/Reaq. %nxA] M8||t=啧^L<ܲ 6!@o{^ 6 !C$rArg}MD6^QQjTI tĕۚZ4qw.f6ˎ?Xy<`~]M|AadP7oѴ4QG)Nn:DRA___￝*L0~ν|l|*KJm/1&LIORO'b\WUy;d7zѓ"j,"@p9Z h= ?[p_':ARnGwێ`*iBɁEgmlL ?/i#Yv h@)a2ّ:zSĝSzP %Y6(KhҐe͸)_c;`ʽhw$bv-[^eQTJ.aox5]0eyUQGANW]=ENL<:ls$'xe0wc"֒𕝽hMІIf]“:S۷'~ ~X+}XRO|"A+Y&(4KX*]0N+Ŷ/{V4 B7ܷmf6PGU˗`A ;^}GMb]v*#3XyFeӑz '8+m;, {uR|V JιE>`?D#?Rz^Ȝ(9]( ^ 9&\ *1co9T}!ЍS6JHEU"wZݤ˓oo5ZkēKkq6l~pxΌ:V%CȲZA39dʓbaR0Dݲ r4 =޼U~?9tqK[鏥eEyl|FQM[^* 4B4A?ɉ+XyV.Rx e􌱾}^ M*#ϣiUZp WLPwX̩zT\x sK':`ySN ?Sy C S/.3ccxs-AHcOfdT9x*16جr }s ڕF$Ӓ-Plȝ<@9@DJ?SŪ:ק2m/}Ѽr'#D^,f{*h7Ys]ɥVJ7Xğ׺0B:ω5o~g_-K 5(M ŀsw*E-sF߸wkWh?{tOxzPKJQ#mPKy.Fiangular-1.3.9/docs/components/open-sans-fontface-1.0.4/fonts/ExtraBoldItalic/OpenSans-ExtraBoldItalic.ttf̽yxU?|oUN;,$M–a_aDADdsEDTDDDDpuGGtG#B*Ny>~{=ܳ71 X??yc d\u`Qc޶\c|p}cQcK|'Yf,}K\uV =y1O_?wJğKsb)]%^깷x0̘}#uܯ$݆KΛhUvZspɬ?z^4㪥YƏ,xƢ9xtɊI;1lr.]>gi?-vl˒29G]W'.RIt-8*elXY*׳m]L1jxu3jЛcEfbffSЂvh~wǾ+f> Zl: +f,\ɦXѵű-1V׈'ﳈs+~7/Is#AI#̸Jև d#x6Ultsnk,s4uO_O<r1|@~J>(?-nbCIva_n  Fy|YI"o;;l+b7[ح6 g߳f~HZ,~~F_| ϙ+KsNgvyW~\'?!}蓌\~X~+G߁#痖ѳ'̗V=e^%~Xޔ'_#(|Vϊ5pٙ,uQ9\^oW8\^z@\Mt)1>\IJR,[IR`ҿjY`2d,-n?DEC!?G&e2EjoʿRT% %NH?\e$?ǕMl])BΈ@B 9 "^ՁGMAo0% %R97)ד;=wN;_"5vcLӯRӛ_1&60G1&ܔͲd!{7?J1Ęݘ&0bL czVֻ['llowTrA׶|r-'Z>kk-|eљO =<}&Lי3Ogn<>xz!s#-fqj⩆SyߩSI'VXW*kJ?D<&0@3g95[kg DdIBn{:aF. <X̺0M1xT)X9n[źjփdXopV~?cK֡lFGacY=>;5l̦uls#̶mv/a{أl/{=Ξ`O{=2i=Ú!v=^`ϳKr_fsؕrv{-e il5//a7lT^Ʈ`k<-d>vm`by'/`:d׳Mr\%krO{IyJ^-cW˽Zy mg5ƭofw1;N {dO |"O875<<«xp)|#۸\ x_{ /D>Om"y]F7CWOTY&U5zOm&roIjʋSbU*6a@hbXL jbU)CkNd71Z2 p:pDqcD fo!۸0>tK* ^ 4 TĆАP`됭4i<.ZM&f̟q&Uo&u3mV+(Y-׏;#uiC2C1 QEyC RdE*Za.؎=U؋Eq'ܤ] Gs8窵TeǛfUªL<$+ìkYtA-AiMӡ_Sw8ZJ xc7MsU[ilc)J.zfv<ۣ9(=kYUHyJ-Aq _0kN__ˆ.j4;$U9uab)YI ܘqI3̀C] J0i$r M)iH$jΛO$%wfV&R>jFɤ+;f=w L?*Mi P:ٸyKKq)ׂ~J33Ɍ?'4f{P\dM )?6]KKZ5G>@(oU*TJ,JOzCˏT^OZKD\Ol޼l2y)>|>[ޭ{>?25TD4t.RP-旫R-tNGԞBթT?ޔ' GyΰpSZ:>\w6VMSTQtPG|WcR 034'2HI4y&Z\Xks\-/Uǵ„s9fkXcs*+rQҊ2G9-*Whfn>@y4[>$?-ƴ4ɟR\qUYExc^4KoDʫdׇO/Ջgvڐ7*/yl7O1+ PTP֛ox^%|zO=؇_{_>ҹix]ΌoHb1vؖUElQHxmb0v u fI!g0&oX*@e!,K\A&}@u/ҷYzi;ȇJx~%x{U|.Lj] ;=;zn>qd˫Tl1h&IΗqV;J4ENt<Ƨџ?Kz+z\v^P`\D`r")m*7 2Uʣ6;ݶYnS;(?N>]߭7KCK}?ʧ@¹W F!˘&`H/r%dW13b]]jn_3?"^%Yj4INfڱ_#u[xwm}z3Z&1 cmVrW]?rE׎zPzfo:R@,`5䁼AܗX o;iXAQ ƪ)|xmh;I~N¦$hM) Eʱ-$Z1HSϋ__= /Z\?/뾸O?5_:U?E>q]OT0 FCj"\M(U㚌9bOitBUMGMR2SM%\L%%) F-4S7R[YeNwK y`fב*U|=h օ ؾ1MlS!GSr>۹ؤŨ9-J%|)xV-PlIC^nl2HҬēru?KNW=|yǿ|tb{Y\:{ʉ5qubkX%[Eh\^& -,8ygCXܐK~ mksZE n-9i5E `˘I ^o|s A"%Y ޺rw<:f}c?4>v}g_>2.{/?Wִ7 [:lၞvX#Qd{MdHݚ [bhpGBJjsiV-sZ]ז9AGQb ?X6#1& ؍ܐdMrvàWTUV{D;rW{{aYV-R3`kvS+`ތaċs˄EhtZltdcmXG2rDj2_BX!Hu,-źV7cx+sD.; uz58rtTcs?/_#d$KieCx0шsTc-\%,W3\h>PJ!>T 玚v il9ݾDv`H1Ī|܍5n;:}['N}7T?nʻM|qaZ]w~r!0ö&L-.K -<$@iIUAg/ b|7NƢ>T: += g?wA"NJM$jn]j݅@j AxxTQ_zG#YLvi]&0%gH\nm*(5.i !k [e|Ϋ2]ϧ |ѐ^ǭǀ^~yswXAW͛T[1j*MYYV6J|e' Kpz?2MPR5ʵtpt0|'2PZqG-n9ՠ\w7}bUnQ9 !w{bb)KQ7^x~_ ^4eܪv#F}~Dߵ23i;}3{4_Y=i4I& FRq\@T3%9D01 jdLCĸ?D6 H\x%cf8jZ\(g.fب5KoncܙEhlWZkN>wZA tVYI U}"?>;@50U7e rTV.ns-][,%B21$q͕?T&oIpul Dj}U|0yTGwV֕ķŸo--);R5 AȄ=C)ћb)' KϊT+c<HUr-rsǾbqIʆL+QkɄYM&޸`pE+iK ;H]bcZcN!ArW6gR5!Ӹ)W6TvmMUKE;@kci K9ex/GYczF%y6KUC7V$Z<8R J*?T[-V{zj|.1 GtaG0JD y\EJ"* Y4Ot c5le/_ugf k}y n^>IHGW _з;ymSÝg4gƏoSyyWly>!f%X`,2vDd2LD1X1Gx}T/wAnb%2R¾I\(j@wEVY?5}ACIk}xv.]h8^x{&S6k2YM4j:65KK $|s|@6 {7Z(WF7f $,HD +}P)a^WOaCMV)>&S@cLob|V8+.V\ aT~S[# wjzi>t I?r€_:?@K=SГ!T$TL"&Zy)D|PёR+R#X9|׹wûWX30Ui?@t?xj/q~.}uڶΦW:ɿky6hL Nt5ن &5&HZJIqb^@-~Iv5N?b\r b5EltŷNr[/O|R~~:}zӡRCH+9<7~;MyQ6cHj20!˜HM *ڡKޡ#w89Z"DBaAۛo;U33TKeaGLCِ5L=:%Y,fSM,K]}7}j^AǦf1=Ƽ53d΂Ŗq)R^AfՉsbűö Ц8@~̗?-6a!A}Яdy5 J$s|%(TvxGeɿE ~ػ,..ǧ% چ B K5%0{ n#NDx jufZJlVr%i,( 3 (`+1WYaC'?[3 ',Ǣh+W4 6 U!I,dKN-U=z~oXi>!k\49|dB!u m#D#(:ޣ6r#%tBȑBd 䘹BVq'O_3yCg>3Uz6?j"xa9Z9G 0]K`ܩnQq$Ia.yexdhbm~_O./_?u >m'fNpœ*,HI|0̟ʊ{xξ N$6mp8$[~x1`1Ʊ#N? Q;8N#^%&$ %P` xGlro, ]_tǿ6dt@ ӡw˥钯[} F=$I-y9t'r0]n &NQ S6g&԰l?m:͘s"h"XV혫$ 3>Kbڀei|*և[ܺnr>02N%,+"vLLTa.̓G/N|c&=ע#%{Ἧe;wg>ү#>Ħ<n\b W2j\X5 \I|ZLG[>-ެ;VȲ נq.U ⱀEv B ČJb4_Q~$ޝ7Z*C޾T%ָQ(ˆT,q$2Hcd yIaJQ=_[:)Yk}:w}\č, zL"Vb )AФ d1TSФ L4_kBaT0XB|HO3T }J GtD뷲|QFdmT& F8A,8bMXj 1m;iqmT<+~_1KN^1dOcKB6x \B 0$b @ QA`PMO$F?M=_ @_·kF\dprc Lfiߩ^[%oCk,7mux 4“[R>?0ۛfar htDP=r۳~;fّi$V eؑ?=AK {TA"l}@I"=%qCHۂ OnCW~kv~̮G+;ul+_6n;֎{-^wT ُ1oF|[ ![pc敪1sZ>h>mx̙NMZ{@g1K#Avڂ#cd!|cYA7kמCػ-c=PЩlj*̾O_׳8Qj/[ǣ}G~uڭ_-`w. XFF~&%w.a2,\qp Ǔ4^}o>Z[I~hT/O<^Q7X"%D/\{iI( lA@!y+I_$B*(,P FPP~ [}c,立/ m#Q43eH<ˢ ~Br8_Us9E$)X8wCB! AjïvAMmr5MvoHk!F&)EkΚL6{Jq Q)t`d! P _Jnv-7T# !&q 3 8~XS9t]bVmPQ 8xO򆗦=T ]%'?4H?qg3^S>ºwFe-"QSX`j-Λ:cnZ%v. $xB+ >)\8ti=)8-%B4~hB ݍ¢JG͠xh ;kOOMgyn5("<ѽ;"[3p'~F0 0L^ѫ9<,EXLԴ[K]_G-wK\;ȇ_ߘ#.̛KC Z\rE8tT?.Oڦ|sϋ{T 嬩[&M82C"CFpc͙ ;4!B0M5Tp'N=qO S!#IChcgB'sf.y@3-xTG;ϯ kk+B9vJ[)Ykwa׺ O3m^ipXؓp\܉C%+,`)IM4vd @d! EwD%M"C X0x Ü5 &Zee;Ls?n"{tcs`X^1(adZ B2ƒHu?\l(QZ`%muBh.1&AZЯȲK)AƭҽN4-! 9,^+^y/RE33T Zg/L^|zYQy FPEܰ`| $.w]_It?P"hy9yX ` XcS +# ms}-W}nY|s~0FGOFZ\mL,noC׌#b%KpcA!)oP1⛈5bRrvXFtHP"xegDS 4 %D_ "D-!FL^Y`E(Id|)Z>LL~FMd.k{WZnoɎSցPs6& X,z~ fϟc3/>S{i9%3[>5`X"{π{bH}91D-h3':56sg n;L;:|$7;ZuvS=#gh״1dw"Ff<)$7f%idED,lJ,)D!8ᙇ/p/ӘU|NS/~cOy_!ؼ\ɥ HSP"Rņ%'v@0+~tOH*d\ō/yql']yHZB3A6@ ŐT HPp<"Oj 7:Kb~v- VGQK׆*Rty;N~+}gyWߑˏΉX/t aQ/Qjdm8!-ܧH0$gKx\27M\ևT-WեV6qpC<C缶T.CBcw!VЈp&eR<'X04 ֐K܀``n#C4c{X,zq !em008a{ %f G)M.^C+'HZI6x\4 &IVsQ>V+DR2 +gʮ͛?#2f)ONPg8ҭR8RUZ8Ū/F:Y'쟉Xmu5+dwV5YI2jq-y.L HC L:1SxU#" $X-\*dߪx}З?7Ȭ)O_Q4Я(0L(B*V W`VxB lA,2 X@BݔD&r96P9=gdhkю]xZir=czuy&.$Z ʇªIn~NF'4=ۑKfXg |Cs ~v~!Ιcwh ,J֬nf `0rJgDf!aCGV8هF8(I+NIv t j#5+S S!82m?j/TځL#5-#EƂChCSE0A u*f+b3cH1P<Y%]>[*\ -'$ګ"yD_2ƞ{PO#k[p= 'w w^^?#=Z|}HA(R BZ@cJq}@$1<1,d!quCḮ%a),YO-3뇧22>n/"s`[I+4vbs"!s?_W. i7vΨ? ݸ y-p)DFJljy4p/%MHʫE5MG (%k*y٤47 Ot#nDqc {V19RY6'ٖN_B,_wvН# zxb8 w0 H.=\zXbȽ(5wFU~,PC,mJٗ{QOS Jo1e.+oA0qBQJVFo 8?Hͯefv2єP'C)d޴pjA: "-/PqfsRr'S@'̜?N1>Cf._<ΞoHfꟆO gm:U4hό[+ 7`eoͺ[1ށX9er UJL 7ԄrGR( ERBg[<هA1k7kvӼ׽اfLOZ5_IԄ^3*ÈlLq)q(bxBU(FaXX*֡$J @/J1ݞg>%3ߕ`Ő'+5`-J+Dx LT(HF!~-zE ]>w^}7yw=]=k.;޽S/=a֫goy }Sܥ޽|H^kVay_ &}*0NDl44 P:EAgy 'Rp4hRMԅfhbv?|F8";/vmvάVi{kk6{M~y򹫾S-g\5kň+z_v1lɡ +QdrׄxV%z/D>VJzT?j~?[Ǡ@PxL"$U3 Dn BR X=F@[\|7]i&awn\c*si|]P%&\E$[.6xUIZ;2/R[^ ejlK(q6XJYϸaj;C6aܩa;0s?qG^XW|G݂&_Q}Qee5{!$ZX?IJ/y >rFZ8J1>;H"&:*JfX5p{jDΊDVbNU%>wY3̜u`Ƭ3UmԈʪʤOΙ732|xb4bU(|pe[@LBUL?JD SVp/7%o-Gx&LY#'L+'r[ Ԏ$ЛP<ۊY ȽY:4B*m񃾇OqpO("Ch?6%ǠSHnQg %C\'F" ~eq$lK?} ׄfWp5;5i?;&7WrLfVc|jt kwmɖY#ѡMȑ4^:<H#V0t%6'bv'R h>bb"b'c=6s4OcMc*h~6ͅT'Bd2 ؐAO?o_~Ak3~Gʐ`?t:W\l̬O_wUP58P J;Q]/Dql9PowzkL6EŭZ"2 H߯B.!ȞZw۰Rݳb[)l˂ڣpkb:&( >(〾K.U6`̄ > Gq"0AwwU8BIh4NKJio:|gobώ+]:n3.׷^֡o<5"فݯ5Zb<*IPOhXa c-cSh`k2lpRV L\aNey!?QڻT:w@#g}/Eu =:$o5`i"p`$D9{\ ذ}5v>ڡpV<C;x|fGIWTE[e~PQk0佌 %$.eF/~ }~j~Q,P򘏕lTTK#WLAJUK)dKF/Ðm؈`N %FințytfDce(P!ʇF6Q⥂ dES1uՂw_4e+ gi{ܶ479xŚu|DYZ&>Y k(iZu@߷֎:ҡx|h0XW=>$ +P,B& 5"ԶaR- G(G!!mHxmve " >e|/+4fT ϗ * {#TT#(K.ޥjŠݎ]m]P]]jLdv6SΫ5ժ[%:mgBږ,!K\HRV3Du<?4 LȪV f *X0 /9p[aΟ*#w]siVtٽpjz6rR[|znK¡ȍ3Viy8+XdؔU; .{)`/fI>e$ώVӯ0l>~px;wL1 ) ARtCx(XU"Zܡs-u;-GqmbRi)8L"N' k{jNr(?kQH% XRjKf04- *Ƣ#kOl}p"ٱ$  -0NM<)W!Ow ~EMo(}iOKYC6.28oֽS7{-b$tpQ+^!N=#[Ub?Kxv}ޡ}5b{;Gcf!-jN0 k( EXDyQ>F\AdVv\^_"= !zKKUS]޼iGk뗐2*Te]mU?^zIꥲR9ߑuG5qdb EtK3!Mim$g@S1ڕ3mf^Ov[9)t({D)Az=ͅv(R(ΒRȢ; r &$aIKIGe!)Qkt܃d]NS>o7YvQ7o?[~m'oG;`c-|\)OC?\>| h_0եno[x/D^~e #ПO bϷxOV=O{E "tqlRc>rl 1'L;98OP/bgbJ`_irg+հ-4dd΅}\KMK$$*$j]$kOGT]?bMJГ~*)oϔ׵>"QoĴ.gC;/.[ۯ<zO_w68A'$4᤬x'g>uwF _xgG, ۞߀^Li:?/u FI%au63'q(ϸ 6]{Iؼ_z 7~S@F7LQۋIcZ &OA=9%HCW5 (nrDw POEFd{w5?`)TRoD;I̥ؾ"dO& j7. }Xp8 Nq#0$IQ[b2 ʈC(十/yT}jRS7!kr d}{+|Q؄}On9! r[݂Ƿh?\AV,ĞZNm|?An>O"+@;r>\Ex~U rR1xc5~ؖ1@qH4/=b ]XD/l.U'x[[~pb+ ( H@ uп˔Şߓ h'o#$g,bc)}񍑄bm"N)/XsoRݠX!M),Q6cT YczO oio Ͽdz6"N|#|c$,n{>XѾ;{'N'W 6j"ڨS(n#ʉGZ X*IT rf~Ӥ#zR27m++Q0xZ_bEFze f6V0r"QR:aT;ggsoZ'A7j2`H+nv@GG)WGq⇕j |" 6 g3|I@0EDn۴2.7_A_7i԰Ij9|NO-l5݆/ jm9{4ޓrN 7׿!? { {?: sp$GD4Ҳpm>`AiH75-ҠW5PB[`N**X#l&׼8v l&3N@iEp$H➨,lˍD\jn[|Z*Waiӧ_ӯXye2L$^HoR!*!"RK kXEwf2 ˲ *˺@.s{g2 27a[{sGe{`qmDQ;jʜ;FSOF(y>+Tjt|yѢNoRJjBHX 8 ـbF5QKTI?wϙԽrC:TOբȱYk|.Ҍ#.!Dxo^P˰v]✛rgǎ}+Vy]׌蓒\/8 ^6ZڥP!jށ{lߥJb6nL#'~on=1|>H#-y?$W.͐îS~sM=NB?.] |̛g>| s6_Gױn8z8ߏ=/ |?|zCsV F@Vr|:Si)*VڟP4&vR " '84@;H~&kZSl8u+] |P:ƆÕ˒He@SD%HO=Cay6rрq&DMxCTT Pt2x(cDu23P`BB;߭5PϡL~4=$|B&?E:x?"5RS[rVh7Zk\fԒ^zs׾oN+nk6D74R9ʷ1Ӽv/hλqpIh=]4/z|/|?Z~>?)5pX5&T6$^[D y!-`wHo|}"@{V?Ļȟz/9td/0~¬@|h|E~y?sq]]ėlq\x\{?Gr#s&p=_yv!p~a?"4q ZP:Tz@YہvT֖?\"IeUȍ[p*K(Aq(@ȄQ–Ϫʪ(Ceҟ;\ӤL\XS?|q"ɢ _u!кðk CϵEćS!U eb=1p4M$*m&=qC.zjӛBa@!@AE@ EZOpTix@H+j6nߚ;{h8ZdOgyıBv?y{( U_|f*_˘|+v@,U%Iݧ(T ϝEv~cmjח<~CÀ䇆#̧P slPy&S\*"'!r$:ED4R0ԣYBVuu7t'^1ec51G>6W)̙<#I3g.X~79s#Hk&m"WAZ1ԋWm7gUOb­wIb]XףI@EdSx$GaV47vݱoשT]ADj` xvd*?lŸc\"mb#0"x p栙8OjPʌ c -i1$<U. >.qSxc?7i/!/_/\Yj.lr 6@UgۊŎ/@Fl]ᵐx5"QBS|*ĹЗ&i6R$?Ic,]f[ی`N$RCkƓ]Δ?@`NR]Vy:8wʹ DpPߟڡ'x9e_6\<3fu-Oܰ(낻6M%w_+276,*I*.Fv@q!cBy먇?0+]tS]Rq'Zש=0_Zʒ(~p3ғM^fKL ͜Y4VImWRzʋp5  ] >MXYM4-YewanvIy:Hn+vUA| 47[YT.aSeA쑏}|#8njSFT`+ '˟C,K!S|dĂ[pgly;p=\ q݃\q&9Fz5CmK#2 \w%i<>;L%b-k+heXTףer]S~^Oo4SZpߟxlB|~Oë;d@ج@L&_=D,,>X?8wB8bY ȽkFjfzu5kE2Ɖ'5!dǯxU׫n ;ԟО"P7ƁK3Aɘ\6.C/z~:a™) Sh8 H1Y>xn({Lm"YmB=mBF"{cCP'xk-+-Qn8zŞ_p:PK߶"U^ӦFpKxM,mBC!+XkjQQiU*^,8&5>ow(ow޽"cc]c,7U伡^A 8El(8 |1rp|E* B"Ǔ[()" R%Orߔ/ԺݒBz&<Þ2e3Ђn(#>g3Gir_vYTQFCj9Egx?}X<#%7J?O$龜ubD] }5k#BtcZX~ҥ[.q///$=DYsÝg/{ݢ,y+TXt{M3-vqK (piD=/-3zq֢8,c邾Uؔb;FkHiv*ݸJ  $He=-4-%W:e✂!YmVpِ<ҚgM4'yX,S6nw}Gεӈ%JrV.$@i.8P[Gc+tWcX`gtGi$CU'<ʪ A1A$vE"DkL-e@% pP: RW׈5| s' Y8C. @< dL-Ōe ]0P5CȾw^kyC5? {1Eq^ڊsNevjp&~e).m.!_c{HKt+w#I}]>| $Rdx^xKƿwόG>~K}Nx>G}f!8 h0p$߂-BOQWdIqЅu{gaZ{6HX-rRо{4;⤦jL9&ЩAm&1BCe He%i[#@J C%(?9 %4SPxJ%ZĬ"Ek,5dhB [g3H&%_u_N^ځ:GQm5tzſ5?`ŒTÓ*rozQ&a}xԴ q̇N>* R,F4?1Œkss6ڋ KGV?QG_xa:v g(AZ3XLrGIf ҩ:J %P꣦R(*#ҕZ}ARf*mRb#U{hy]` F!^4wF{e>A#` I NhI0[C !QVK ݆BC˖gD#bQcȆ2S~W1rkϸ.i9P C$b#I)ueE9@*꺋o>'?_<wMސkG$5~` 㼀ӟ}OJώsY#ljS(73usLFRV:h Į'QE#!oZ-E&gm;u ~0fu ZWpiVbcyV  ɘ ^S GL&}̏i5d2  4ʲb36PWߞ|FwW[uQt/s҂ixt)-sŊ1xœ;^,V(8ʏaӋ'<'ǖ?g6urdF}^ -؅7h #S@rA-ڹ2`ҩˣIF CmDC"X]b[QD|AXԴ>~g.y]N}}3Q}$ng{9yyٙJqaQijr|MFO}*) βW"*iڌ!.xSkӑ!>BFʼ&ӈŎn(MA)Ԃ^d W=u㋾W>;NSUد%Ca"r^O4߄Ĝ. /b4Tazw$, T rN2#ۡ=kӯ@ }T~v`Zqnb eg@ ϻODm,2c^C<.SQ. DBi.dT S) *[i<.my avVw8³/w+;I17fqr&Q$8+g/D}8~=Mydgpif;N*ỳHH(7&IE~03!M Q8GU"Clw z| gfiT˒j|H;fMw^ѬgGM8WBrjw yӥ{p6F/iB{%{etBΐp' I.Bt4.6 uL>WۨU[4=/%DUW6otHC>|X_jVdT-~5ӢkD\KxLDr evOjBR'yzՙbS7_;~_[_7SgKñ 5+4D 5FyDDPUʉX ?2oDC%+Dl|` lMRq-^>Zdf') n褥!MwjXp؁u5Gjl]8f2qKM^.6LohY[ϞRW5%}F<֪JSD&hCS^G(+,avtt0b1Z~8a𷈳HJbc>ĭb^9?<뫊Z]K7[{ʧ>;9􁱽O&^ԍz|K(]}@Jʻ«Y0쿹+M']brsе0S;ԥv1=eT3ͣg1f|+O5wMH8 _'JTcfy`E>!y&FZ n^*V?*OX9U;ceIqeKܗ3]I|IMZA oj4,_ ƙDH1Yt䖈˔1(g;3戴Өp;#D/x1é)04~Ǜ` #)UF:aR~ sNi.. MLh ZBVW~mI?[شOAΠDX+&{@y?nc?(}Krl{wqD]?u^2zyWF̝* 3?m"_2b~DyZuFR~cɯV?z.'ij%uJ0DžᰈW@׽x Z=Jp RZc$9V˝ȅ R7k6m% kB1 i&X&V~ b̀k˱J _Hy˕uʵPE'  (ERlN ܐD!1FW0=DE>zb#A P *Z4xceg*$ A"wƏG0ٌpIܽ⚤+5{dɧos@l}ŖʲU_{HUNM+/Ly ~J&l9y+g%>YB.93(ET9Y΋ה~C*UD_B1all5x#~`smI<ixq 2$ w%hyE¸a-f bBC銙L9m"4y(< z/ҕw0yXސBJ%!7 iQA=&}rB) Bﰇן$0s󧧙>~u5rظGEX??vk5=ʹȉ(k_:ص`f6,1t;#n|e[*)Tg?9hb)7mȭ?_Q'K*wR+"e5$SxcH T,$x Lf;)Pj!vSHǹS`!JDkSȢR, O8|0Yj wbB.# /pyv8-P8.SdKNEߑqmޚ۳v]OV}_H9wn*;Mp܎5b>sb=S}D)&=dd-M>qt$K 7vtvlfuLvۙҟuD ᆺs5Ny\]7~ﶾ5(f8IUjE(o.YMsȁM1. ﯬEFQzXKO]a^%#IH|^Cj-09$H_)p`%m KLDt"H]dT6գ7?+aTTt\'o[!c& `%k>ɩC_)?WvZ(LY{\E=x&'1{#蠾*L<(̙ゑ,*E#@ J 40Zpj)WAjnwp$<l΁^qۨ }`_ЯċNGE/P ٝ~Muh Z:0;c=%0 uvP o.V5'$uD 0momqij R+ҀȀDF [iv<4h^Ln7EWi>0ӌGѫkԠfǤj|O(!_O\+i¼tSRQBũ/})6.5/A'J}gw*p _ѩ͹+NR:sl"iim!H-fk@v7WDXHI׷E[zI@n (T'7ۑ)09̴Y 9\Cc>| VѨ[veoOkDJ.vȹpěVW U9B^{xf 5m62,퉃 "$8A3E-F"j !ւnG ++]u/^$W}H8+OtXrtPDcץЎD(Zk{C<$V+_N)#|[R*h_h:G:J?cq&fƛE~r|aX•A 6{H#zڠML~ݝL9 o!dH:<Ihp;ѶOwEcWzJ( ``V(ҌS V.uY kxس.tJ:z\ޢ{ÀºDd>tjJxjxxCT$,QiAQd(F߷T)ZPQ/xUйvE{.O[f[x` ñ>W0pjBt P4# }?Ŕqu&xLL6uım>tlmaɦMυ|vxv3i-=%ydv(P!0a Lj;]2k J -^ aPuB&SAX=*&~O`ފǤe.Y:3DzV|nYZ@HK >) 02;ڿc܄me? ˴;I"%v <ƒew` @9ى7/-98 >O'fs<+5iudI3VwȾJ%#f# <*ё{0rd8l .Pc3k􎎳7L&] }T wagU|Nm* x"Ï]< r+e-؍:ڍ ~{矟RVOnDžFr;l~?f8=E9 )H<jcPYhTG^bۿgW6Av$sЫWD\P~g'/Q,K32#çu̓- ;ʲ~]r@m*LJ΄Mr5Vm)a>V[9愚a r01Bi&lm>CϬ?ΙM!m6pAȇ@H'F*/EWbW"KV9N6 n+?p_??Pn 9)C7:.:u@ޔ(/}_xE8~|32h̜n^M /QXdXP @%QnvEŐ?DدduA>Lᎅi"BJxmL DuDD!pPAȱFeܳLBq m=f;ʈpAէzXܝP?\7ؠ  "ak/3 MAKCG꽢7cmʪcZD' ZKZӝo)G?fa^׊w=?Ջ~[֊ m ƈJʷ{-x>mw&n nE,㜯8*IN)~Vd t"]4Z*0h1 PZ̓?QEWG5艢HTOr3 x%>CtB6Ф‘o-BI~]ysG+u7[?aܔi“F_󢋰wҦoکE-5XhtLK )CnSV̡f0 Bc?%l0HpN;dxMf5A+idqvNJ#b #@*H:  腕mF"cla_eHRUӿeƚS?_ #΀Dx7g92OH`b \ Q1Q_s!gʤq w>b0V5ac3@n=i`ehœ5U9~bilK<|YvxQK伴!6~\|#\1^sRy~3"}3v3n2BB3+MJr1$yYmZ(" .KP~&3IS¥ړXX Bp.jX+Qh)O$GH"kk\f̵ʿ\҈UW-\R9p+=nvMq]>ryHjM"ӌ[w ϞI}IsGP:g&<`i,Gtbd]:mAUX:V?0i̜M-|8땏[^{akiiC)(q z%ŹJsO ڰh^7@![3C ɁL ]c/-ˏq,!+)>}3.qp) "e~8y&rj"hTT-SS5M[rM^?x$rkjL,m2Cl#R<*#@NS^P U}yg{эďX 뙘21N2o) ?uTTvP4.H\^23>eVnǎ:Beځo(߹{w.#;5DDe"-D0x:H+r)'QZ;kGBv ;* Qw:稒զoޘX!'!tNmyӐ2+K߬l\2f}|GDq[GTmv5k:ā.KfN~@fO9e攝riɽӆA'2npޯGah ~#{E\zVnvrlo6ηM Gqpx$rtd:_Hlx 㢺4thrFΖm)I8 Y?TnC+a|P kD KOV)1tb df/ioM^٨ ۺubcy_XVQRܳ$:/Zwb"o<2 #{9*xIb@`uCr>f[F7zj ~|zu߽鲁xY@.@_Ž\WiGX#BL1vU!j\h|(r, ,季,KC8]jʭ'NjʊTCdrLػܘ,ee'?;xX wdQ~ޛpcǔDɍG=I1WG=\ LIQxtjR%.OR+%E][WX`F(z5'ME kgX߃S ֫|Q$s2[*9l &8ֱ/o^~0I/>\М!Fĺ3N#\11[xmC8N:lj8Y `r> *9DOϣAqv{!"vp>wĐ=hOT\{:k¯B}Xm!Y(S5(*4L %I,t=בK 1♳D&nrH0Z+v3*>{Ie,w SHB-x@ich00qi]vCp%w"_av)|l2g((rϗCFɱ/R0w׽3Sm×z|g`Q"M5E$E OxC5)X3h #. ' =(J[Y%HRMOE '2&\bDm`?ax(=z+UN0seyK%<_YՂ%3'&m 8_, 2 rH^(~7%M9iD?ЅXGM39azkvqÆLأ/NAoL Y8t?~`Imd$$JnUUD@#=6`gv;& j2)fWk` 3nb)g{l =PE`/Hw*v~#v}$q{0(@g ?-6dʠ _5x$FRCbZhPJT܆ G֓?c8Q&ŎhACO4p^+]f /KD|T-!3X8B}h7^uȹ(xmKfF^}A45Pa@ 6~>z$97riH"b^)Oa^_R抙ʡWE$N;T:L2zl&r0rath}5RثHʽJӫW G'||]9N>C5W)Oׂ_&8Xb' i ,{~ߏMt.92ظ/bE#{mL : \mXJ@IG {FHqv}/y+94Bf%?QQK R&rhIYE^0;IX"Yٰ(̹V ~Ҕ;ƣ<8+{r]\hW(;wT(+VkîEYp(p Y,p$@'/Z@hk@thDXz KdAX/j=?2zTƳGG,3%qQϫgGrk>-A9VekyxY\_@ih^h^eW.^@5L At(lE-9u qϋL=35HXLTQ !cq9NuH%i83eW[R.vJ]bԑv^z¸DžjdʫKҫ_Ob1O2,($'`b]Q^~Z ^>NGRW[d!Vc$s9?l~Q5)mvKX,WfXJ\JӈQQQ\(jͦ#Oc"堿&Ϋ5*#5W5!C_xb5Eo,y*VjAj @ * :Ku T%=m&Hdx껏LP=Om q߰Zr&|Lh" /)M䎃"MĴz z &]eRREHOr*d-m[S^P,SnBiY_%[9[Qۑǂ"h(d*F9_- ?]4{ ]J5-:yWy]넴YW0/kCIKMK;&%VVˈSP[׃1zhf.ᱱ*( y!f(\|,t({%ain^PȪ3ɳzۯ}r us7hO ?5M(V]U](x>"/.K_E>W# (zl4]O#iPKnɌܮZ>H>`ȫVѸA-E˽5ݺU̮ S]awAy݌SSVO"eWn hỵoOVoٴQ%ֈeGRͯPN&=|覛w~]?c\g\_ NJZ̟nOY2 FYUb{Csl7ix<3œ¨1`_̩zsJ8xNa1AssIwx1dŲԚij#SiK0YԺgG还婆 J{ͪi2hsAAV٭懗~? z|ǵVmWiC1bb/[w̻naFNzibcsG=/jưw0ߤd_6EM R_B4K-]Z(Y]-wiZwG- T|䎭F=M,͓"_fvaYehA6gY^-a򮲿Ƚ=MUX σdCnJ/ R&2No7WkJJT'n}4c˵*2Ӵ@ 6ZEjqIOeLxlPX ZT򸐾5U [*sHJv˰h͚]S?/pV3_\q{ Ή+v}y9$I˨f??[_߫,ޮ\Qo]}ywqѤp*/h' &BFHkSءpJP 4B֣Au7>+OGy^5-u3z;ob֭ga/ WNWO<4/.&ukl qde+o}~_|_w\/W_ ?<(w| T T8t<\tW۫e9^]ڊ~Jg"^D`oyҕ%OmNg71xzg("%A1;[yӡP-.R׿0fe9\\06j!%BvAl|yGh&j戛lIpS/Ko]s(RW2]'EY`!mw'Mޯw'`ͥJJ}BN)$ Н GѪ^꫐;kZR_V[.Y!M,uy& sl7H^[dLgj<YG)-$1R{zwUg$\4?(Ϡw,&b p=ڇC,KFY\p!߱Օi\?ijB]YZa:}~[CUO'n3.|T'N_;V#N)Vǧ%(OKHpBZFׅE&'OW.ZB?:UV6DJBfiUqC3BA #bWz"$Ect9mI%aIBAw0=1`O'J88r.epxsKh<6oTр.tW8(ՅSLhW0p+`>t]pn@s~¯Ab_v}Dqwf=bFpluHg+vZ1׊k#vCmyq!ni#CMnxDǟw[ 3ywcXߛf^t@QlD dĕ[+JFEQKA*۴ҙ~tYgRM-}.ϋA1oh49hRۦ)2D5/E*ibK ӺS[]$GtCSb fza x1lr"P3q#[KNQ#XT)@cedI{_~'TDf$ѫ?wC0&6n<㑡N%ڨT[:m4f%) a`uLLxU8Ew;p);XѵqzÞ'nap%^ںGcX/g=itьT1i$ȂH -Sq1yCc#+pa.3psdz/d3dNtcp)WhG1i[{%W&_),WskuC4!͂*ؕ;qԖea{zuK6m>$Lcg2 Qfi`-+kQX G5399ҡU0^.Ҡ_l-XV[TwU2l'U}~Cis@E im*[IJ<@i/{}s\2I&3dr/ @."bF$""RD"""Q)"ҙɈ-Q-ZEKZZ6X*K[~˙3g^{^YBۉ7VBbE7C.%PtN& @E+62v iGMܳ? F+I 9L ꎷ\ a9#k-=Q^p$xHv]ϱRAjX~K_,fCvqC?A?O5P{t2\[U,7^_"XK(ٹ5IK)f":dh$Q${+OJH :ҁ[Gi"{>8ChzMGF̢ rp>Cx܉R&+/k`h^5@VF8H^PsT-twʄy51?3 |&T{ TlA R!?Th#G6nVO^uifO1( \5I*-bSTb3|?8؍c0hs źdSy̓aJ:yn:J\4~cuГ^ ^X = hڂ9E]7هi DY)9o&^]4&|@;76 Gx>*)`B$!ޣ]h T &$h\9B{@M+N!agwL}+=ݦhTcČ`Fь#n0 :pDanMo (f5"-QLtbT{!)'ބJ"70r!BK3!`jVR8dKXqwUf1I~ncㆨ4GO&77{v8NO)'b}m8in[d\"t]#'TZ!Ye Q2=hlJt}'T&Q9/8}CDݯ &mN8]9]p~7s)f/ ݎ#ّNu8,* z{Kٍ~#yo'(i*?Bp}L} 1g7]m~^:*c¶gtp[ EG[!)GYdUAM8,/JZ-ѽΕi'<ډ]I k_SR5I;]nJKdVB*DQv֛WEiaPP!-]o;P0.Qm!]24=:t,JbZ;PY=dŕN!`ʬ;i2U H"E}*BW6N'wl2v4픑1;V&_uyӺoУ Om X@g3)bB^xr/I\+61XC8un"D߫w ,}J^no4uЊ/y]ĵR@2GѺK@xI"jO |qNCOp'̜əf~'F6x3Z8bݴ_%lFT')ߏ,(1hU~lO(KC[`x] ֆEԐj&Ҕ;TG_Elm"gd#L MMD$EEAd@Jt>i r !&zo_Q{^`vjkVfw?Ȋ$+n/ܠY{Wٔ7vJKM@rkNm_*Kf Gh=3)d Ew~ u9pҳ=%f!  $U=[#)B+p*A$ڸ"8Q+h0R-"bdؽ ?sxE(<+ŻHQȧzD p#Cu$ @[7nvÂ䜷wo]{#R7N陳JbDINq} q'Lkn|1֬iJQտô|czE@p?)0ø(iVMhJ_+\nE1 h_"b LK*Ѱ}EV`֝TdvWh~wADF9a%#9VĴTi!ɨl&Iji'"R\qV%\T/0 `Q> ҐDq>wvHiEDۓS hrztY q4B)'k ?BDe,YLȞmJ|~Vᮥ DQȕ$9 *Ѹ]VW=yz}?Ic5[Q/+E*3(У piYdm`MLaS`|m$ 3.>;B[[x;)9 !Z]$ mL2$ *A }aAKUEt&cΨzHD>9ƨ QS xPewzKhjR9wzAպʂʄz>=س(+y╂B*ۦxQOuu%,Vt<-^}YJ}p" NMspWH$bCy8w ^x"kt8\:AHJTy /%eTA*Y9XKbόKDby O }Is 2pB {($ h |Gh2(ԥ/\Ov̡|NFƂUIޑ$z1-𶂉j%9IOr(Ri 4IS X^jᾕRkDRد o׎3ڒ[aaOZ^ǰWwˊ|z]Ţi+ b ddӳ!dؖO,Y,}v(I䘿c]Mk5Ւ]Ԛ$Rt'pqGK؝|%WM$w_^i䕹y:}xVnKan64͞{~I4bbecm]_ؐj[b'ThU?82q˥.9q@s3xiw<ݖC@3nyaeоKMpf߁p Ċ y eo$„ a Fs-ҍ3n|c}tmT]qfҳḳ}5ǭsySVLZaגa*i\MjBuaIE~SW&M~H-3R~@;E3ɑA=-SЕ| ԏ`*ERؿՑ@ԸߩǪbǫY›6G@W`!w-d7_F95žg$o?3$!Y,7&]H31A;DX!ib?S.'x~uxmzӔ <[O<V]O}v?.E2?,kTΨC?>s3*:R=jCE-3}J c4{MgziGQX@I;xpl-1,Ctl勢h+,swlxBq"mle@: !3ΰG{͒F&ȋ+ oCs}lHr_F;:jN H?V4Wk͓7bvREtSN_58tS,qm/2 ad'0+:Qup15~W~rvXEPm\~tWkV;Q"s DPD`n%(`d;VI8g ܑpѰL!bExcݷf;d!ZuLL>hv,1!S%5"2a $/ v%0I08NgKLmDїH3+{L >e=FrKwd$\{8*%%iͨBs؅AI]mބ6N: jИO)> M< ?r{L`P`lPJ iQaCڛ% zyi C&q[5zj1U˖$} LJl\j :7u#/ or'r'G eb$QEi.%/d[Ą0b,m!AZ($AΚ̩$VV0m.SFTб8.P|[W]aw869(}2(RWh8)kga 'NzByBw dP׈Bz/:I'}yH{#?M ?>/Fj#]pA\"\ppu&ѣ 61s+n'`ލ38 ޿?N{[xbso|5җR[E~ZScVb.2Dzq`Yho w®Vq0׃VҒ\Ǎ<@яa'&<׺d, /Zj&%.&|GDaa)2w`*}~/$=t\D;i~@k2lvXF3l=FtvQ8g.ժy]ӪKbnuFxQ/^B]^EIm=//s/u;k68j:O{:̴(x4W4KsW0߃ ~5k{'֏~g ?q=Ϯ~XM~JBXe(VNe:=n۱ey~"fk"Ƒ|T-yf7᫥!=|j x`[M^䢽c`8mOl͘ {,K+bGNo67?˛vN:^]v%XK\VZ5P,dRt,&5M ZCb4dM) ?> O yrqhɮLjy /QZW!Ʈ7ಣ_-{\\0 @c=i5Y̛R5Je sɅE".JeEw6)|ZM7y&e]nZ6MӚ˵gh>3S{3X*|9]ښ ~x ~e,˝׈1f%~%7Χ~ϗ梽t6yF Ε| ˈ-1%1/%g}yC '?zz^u㽗7~\q*]C+jpyL߉<1y'I|6U:<ߐkO-Ǽ1ol.(jkTP## q / ,&AGH׷r zء n({7am~9Q4NYt?]Ovx=(5Bn.1@?Һe2s}w i9 >P2PDZN 9_{$\cD՛>y Veװ{[!C LЖ14mXt0c+/h3n r=B=1{fxlacH j-EP_2_Kzg& <=I.RBᰴQ?G6apQZAlӋM_a[n^m#MX=-W"}h&= lD/b\V}$^1BB"j 4|mozg5YCfq6C4֮8 b',ʬ:enn&"8@pD&V4]p8n..lŸ*8rlQAf/+u")V ۪Qa`ȝ퐶ZNumi14Us!i9}q[&?9uy|1>eIH(b&Rklm$` Bq%d"Bj:Toø*[o9$>0/kA{ l#CwlQRK!IE ;v#g8IsiHl#>i.lTlHY1I@ravyuL+3`եLY7 ,C6vOSYR{@n e9@r=h9ʈ&iǗ#^;??Dz6wCWVΥPm.0QFi<؀ҠN6xhbfʛ9WgMy7s|yLg#(<\3!0yݗRmMz_.`sz޽<unmп|Rۼ-={.eUf m_6v^p?_&AF+P\&ħT!&_#pv`:ͮ l7[B,#䄜Y"6Oytӕ W1|h7R#wNoPYő|yde *oDtX> 6.P@Y`4M|V.8_,lZƟ\2sräǯ}x_9sΰ\"bo[^=?Dn l.u9= NBܙ.gY q'pd18j! n{%*Hh2 Ə7YU H. Mc}mmŬ֒7{ fW.yV'uY#4-Me7maWJ7QlJޝ`v4# `f!xxoY1JAEÙ(7@eD->wGDTv0&ʧ}X<jԜ|}7?8'Sޭ2ijԡ[ӆʚ-dhu;1Odg%w|t>7`FTP%g l ]&w2Ɯ$zkƕƳՎ^׶rk {pZZ꩔Qs9rk6ظ˱JG%z) V1t"tƇYX1я'M5t:S/"Ηgh@i95TozȃG;Rǐ,x ϑI+JFk>$z1c`l &x~^Wq՝/38CYuO[9ȋO<Կe3\Ktt,X0Ji5A/+|P5}t`G1 Þŏ΁ju0}yLvc˹h^?j\g55-T7\_n϶%8m1 TGqt)t{4#Z0O.b"Ei>I 2BPX$.gvF @ybl Z0@}pջ0Mmʤ#xp儩)dӤң0nxНP\a\1@2ȰI#$]2Ԑo 8Kݫ-~bqYB n$aߌu8)iR.w;qob_GEVRI"DOЩBCzhf;DsPLS=PbGJ(Ѐ,(6y}Rwʞ>鼄.a|Ʃ`u>|r %'()`qÉzLBG"x;+Ttk(vn|pI-Әem7|֨m.ZШ-CѴhG~E4yzuڟygY9_1`tp:.ǽ1v4%/2%P͔d'9lLܩ =~﨓Kho~|(?~icG7up_ac<r[iX1cGS-;4F.ܔ1.NvXLw{L#ZtP8|R!ƑДZ:OVrkY$ uS EKR(&z-K.Wc|}E2mȽ;'Ε&`eg42~*D6{iM炶_H؋ u {2GZE"~ZMedΔ IW1ߞJj˭,ktJqR& RpY =0q^8Û(BکUUV90Q*ࣵLLOIGrM*8VsɗXmh/.i^E=u^ sWd%Wj5hL5@m_y-xYG~^i6iJȋɡ?/BFK:$kC)ʝwVo z3J␤%̿0Pm~n oH|eA?"W6t4tCqR oL0O1|d1|a:-tLC5/jokֱhw93s ޟܜM5q6 4_nHBo.(8x>>G:&yB~-Ry?}>\#򅭈P>|ع|1SA?29;Fx?)~~05VC㛹ڠ/Ia:?NMT 8qȗhgfC3Q܏*ao|?ɴF+?~>o[i>?>XO1|a9?qW;xOG|瓰G|rNH+ >Nr"b4&7J`Ҳ`?WSc~ί ?Eq}?q?lJ~}-4agt4OX y=q5ڎ?ŏ/ 'q $~?SI?Cu|N.t|O*Ih/?}I|5# ak& ,*yT̟K VJ<@l*$ }7pd?) P?݃kMо=;?;z;8J5-zr~$e/( Q ^W oekAoۦmC~т7$_Sl4RU2Nk] :A\ >UmXVJq udP \;h,i^%3xC_.Ʒ4k.D^^C:Y,ٸ_k}Ƴhٖ辠BoUn2|'#6fs"a9u=ęsId٣L>`-/eb|@.D%=J;9D:% V7 JIc.P \^sή6>R32_>zq XzRٽj{7ܬ C$ S#2=yEGb=đ8e< *`:2[&XhAQm[~~?]カdk娃x0N)sq)Kk gkE 2nL`/ȁ @] F>aYfL69ܾp ^ȅD*~=m=&NXxꤌ>KVL&e ω&hC^M Q} J[TDoL1нS,8ƨ8^qv F@D9lHHEm̰ipҔeG,OX;֝RVt@ѫ?2Lh774QL^lBar z >:DF Z=sDmjqV.7˫N1Y%KX/Q-BzUJoRY M)EV`1'7k,'^@xr(o˨%)%ݻa'<Nt K 2@hA^K{^2gS5PU4R_LMmpl$0 k||cov|ֽ,d@Y‚! Gfdf+eKݮ+kT w7ZܱyY`vsb5ܕju䅈 -ml1W8jEӠP,H76VBB(u (L(;E8 }GJu (5N4;ܴYLZlRDB@GHsN*.jt>3bTU")01܅dWHf1y%\ 2~;_:,GEE#[K KR,L*#nӗG>(9&jD\g&TQD>yJh!7QYl?HTxZ;0{Gֲ~]ôo2 sz%]׭Dͽۯ'JfE©MكC+s!n'k+ %G0b֒`& / ͒=AoFJxxH="F~H:`k8;݁P/ k)G0 .ʒeZX wnu}Rtcǩ'l?t 3TTkyڮͺ*C{N`(`+nL_4z Pw(G.1=8 EjT"2FһЎ8lfb$фot.`y2Haݐj4x >) [l󂫪i\†~C;ƶӆ4e5dWk]GkSCUJ@apG 77<~x>^ս_c awPtD8 K\8U&fk 91\AT :0cl:9I%38s\vsfՍT_ltIg Ko4o|~QnKO+hu )N*5vffj2k7bȆO]+& K1M8Kӏ 08JKlJ \~j@ԠOd(%4u>`=z*=]"K@Xl7=*?: \t2mH}_sd3 }h0z=n]\n<8ה+r=VGΔfKbfET3J7-Bd0 炍 `'TSBJZ%\!A>]X[j6ʦ9|3ʷO\e3o|+?[*{z6Wny#?] gXbEi@\ ВP!A/m7s?_/埯C+ 9jyyY+I/ NaJm4oS5iyR9H׫Ĝy)=*#UxtmL Dda7"kɣffxbrĨԳ%M'1p30iN륛l)j؟6eO6dyMSTy1$~,{ϡª{0 !w /I Mj3OD|Cy&R^I[yO,TNGϗdckZ)>M@簧g^s4B nT4Dīn15-hLsd9w.ŵїR4rOcK Py +:r԰Dv8X%. wTvS7,cςu==ho͑Ǩdڍ@09GyGi_vFOHf혠IEp1 T2to`TvZٛ,]أr%ʿ/vCZ.%z%ҵLio'- ܾ8Xnǖ$ɴN e_)\X9.!3cQ*P* n'X{pꔬ_Mx5)O :?~i%C7Jyط2= {_[7l[m~W7V^sMmi.o_v|GAFߢ1Pߜ^p瀖`B&wsC)943*&˂&0p@~vÝſ;trW^՜t#4MmRvWIdʄ-ys{*ė ]P )Z0_!ۘA3+{/"y; vH5X\%̪f#~zkZQyRyg܈i|Y֭NާYk5kprC>mKgEASʄUg^|%'(L^߷GG=|B q _|GyJ~l{ P#1Sc :-dx**Hyx|uFT;),9*p pfzi2_xY#yeuܯ}¼16 ]v['¡T-qu8'35NgMrE3(/Q5}ǩፂeIr^+hE (]yEU{OaW;φN}lV4|r z}"{<L(8P5f%{E6 84lcc7nP9kĻ!C/OӿE(#6t _-Ca~q ~cft\R|Nc5Jmր T*a-Eچ= 2ƼyA8iU@CoFf̛u=GAnl` k kK-;\fơPc`IؙÚ_*p)L8 h8g}y{KwrEnH︞θolg/~ʬ_ i~290ڹi';t4HC iؿm^F<,20[ ɼP|[}zkO\$_#?0KdVh/bL8^򸗛űO-AЃhXr K`=],-SJip:W]} ; &lE !̅e^掝{>?7nNEE%m.㋆{yYEN)wǖWlVvq+pty~%{>:)Y0*(~}cKΒC02]g(7Lx>/`&:N|<ڊ2QZU@#f'̿*77$.޵| YIOt𣝷yϩ/.񭆝^XΝJDhkflg@2{#0i}GC'a%P6y{#xXv;-XցEVߘg>eLEpcuuy];WەRڕw|yG6_y~{v6yˇ֦ˮS7ffvVvG[=rճz7nՎ jL`S-,<.6֥n(_ , *;g[P_Rn׎~I;ZG6yxyLwk6ecnS[V1|:6w ͣG6jFKRBK88Mc_ZeBɓ ÿCXf>YaW8~KǑuwү3)Mٔ'Ǖ.iӏv+qj[dn_:>I#% w\sCA9~~WWi/ϓkV*XJp賮KB1k PID܀ dAb3l\3Z0y˯P_aetь,"O 3=!ՊE( UP-V k"ʞ#܊GSK&]Su`25Y.OXUr+|tI)g%Yl {|Y=l4{{|ǿIP'.ݕZ>R)*|z6cʘI+b\!'?r%$E\G_Fmݺ20~OT[ѽ.(ļ+Kݗ>:U{ziQVkKhq:t( ׯ աjfݞ /[lqz {Bt Y@UFt'IJÀjQc9e @_kGZ-& ?xW4omSxa{W/^$M%x \#Gz"B*Ps,>Y^tΆ9"nx}nL={ҽ^=.01ϥ%1B.b@u` _ZPxE$L#dp Y!q=y% j*=uR\޲Lv[n+M⒫F^IN: In;ſbpA+FHd Xգ5P<^;Y vd=[@\rBrd0$`5 n|AMkFm:*l\+S^>`@svCiw-?0LZ[xnpC ^,69w򥉎R8ة ~! :꺷  h谜h+5aCڳnk[t_V~E%-ޯBt+ptFnJ"qA|w픙-zÍFE_ݯɈM:~X鑡4.i;ZGH3@.qTFHLniT~T$&PM6>,6唎_{("Zsc \C&|iphUt5^'L$-%8k^XTk|J;j Ka]nAuњLh^*b}$Fb7HB^!@k d OݔrM|(% FN)߾iKF,1!>'4d{a4li&˼H{H, Hud(|wcz%_1pee>te#X;O >".D*!U7B8<>HTN؉6UvgZ'F`]=F6Sm"fx R:1 Q^no%'N{Ie>I XTX0@ F8LGL932҃uvMrc,7ɋo}V_8~UjO7k_-Β-;kT+NJexL -p?& 7F$H1%ME$OHrעJcZ>l@S\$SN!-fۼdA.RwI@Qu<74{B)t} T85PwHG?څM|)D&W*RPԻ57,z;捿w>nC.+\,״|{[~z(!u"9eh)œ`8pq% Ǟ뺛|eSU3;z ȩY>i7}> C J}zQ΍H[~E]G< gv2r,9EAx԰#y G:o h2UE(60QTy@y5mu7*9*!D%fMBs8ܧx[[ntv1sKFϰ|KbҾDm?e(_3{؄ 8Y t<`%i% ]*409}k7 9JZk-X5n6טD_rZj*&z; (AjHm$ k~Rܭ0ǫ%i6N秤6[<ŞB{7ϤϤS? ]33-q)1Bz t }+.q\m#P?o^lֻ?x7g"1i|\bl3,7g|~3w>hS?gCvŸDZjØ$zAt1/Ԏ͸:}#MC6x^+W1Ҙ,?}}|U}I&}Ihym+i T(Xi&5m *" "bikEK, *D|YDe]EyXaYe߹37>v?~&瞙{ιܹvEZ+B|@቏ h%G1\"-8P4{ [^+Y;*sĘX[RDIEmfb\A)~Gg}$5,L l=~"YLnځE1Yvc`bq?s !E3 !V|81I? d wDBgd`̶:An=j8}3\vsKvUe"B6fض}(LS+hW)@kz'b ȌO 6DŠQ 5րV ]?hsQy_;n/PO>.# X>;('@?{BUa[(4AԽ%L~tO}SU vgO@P-%jU;_p*`4H5"H ύo[ígrR c}hӘɨ2z "Tj2\LgxZN1.߫!i O(^Ո@_ڬ%OxL>1ҟ*6⑵ul~hPT6W($1~L`<t U@p|~|,6+X@\t a/*PALrb)U'>% bB#ཅALhQ]ݶKcHM)8~)n ,bln1c(bb!B嶼?t\A,_Ę#Ol Qπ\˳ 7!F1d4UiC0>bQ 5h~`~sԽ B3,CC ?шﶋ}V6NL?qg1;ǑcRr܋+3%pX%P +`fGع_(k>L[s*J[|f/,IvƄr9;"kpSpq2BXRK,aq<ǡ#UŜK(B=)$rvU\G|,WDvLW~!w&1,(b5~:,ٰ 1ʟU /<X xt Y2_;Ib8: LJ2-  \ڳ۰E9Z8x?8G<VU,̓{Êh<)~,FGF_6Lӕt;=I b\UZ/* !@rUk11Jh֘ }~u[">5z>}n{_n0x4 1^_)׻sto 78uWѽ9{>}C_S f_GFԌ~mbFiFZ4,豣?11{;zl-cw7xbzbvb~bq'>qyijM4>ɜ:iSRKR0iRWҗIyՏ[>nݸq;'?7FM87҄(Y<8yT&9=9;P3瓯&ߚ(L̙xd&^x]445͚6>i9%u-Ҫm6[==M ֍itl]Xt;u)Kl}X;go Ðg(2Tv.UeƵƭNlj33163]2/[EmleX-ٖ|Kc,4XvZ:-SGnIݞJ=z,SLSK/ml>-#-'mnZYZMڒUiӚң7w?XI&:54M=3X}Ϊu9u>6]?} 3t3Zsgh橙ͼ8gyfΏ//_yvCAaIƂ-s6g-s&m?/ay]wc^wPاp`¢Bo׏kՏ^(Z\t1œ;8뜗ל%sK\)-,-)*..]VlRPVEceBe;nuﭪZ^]U7_yR=Os;ɻϗF_Om+ \\Y BŒ9 .,[x>ydqɑOwhy++ZVW_[/~a gVz5_Ck>U/_n{u56~eu.nxЦ7)߳>dNngvgnΆΝ:+n{{Oޑ}_~g/G=tPwpփ?ݡ釖 `?wx3}>Ǻ##.ҕ]vvuv:uBׯ]7*>}t#cR-=OW}qOTtȉ'>鳘j>;ϮvT٩3ΟzLw÷G<2xƗ0(g%!}1ܡ2A h9/Sx>m;/+3Y]%MҠn^>8f'wknɍÛe 9wBP ZxlJXކErL%-̆py@N\/AsC s̀u.(%NȎa#0EJgl) QBHC,%Ʉ!&7II *ì8 ^9 os?mt{<&|0{p1v\˰ ؍؃p ~_עh=^'?rtCG?oJx{</W: ^7U o ^Нu܀Fs_&}`ށwq+ޅp;jA܁Cx7ރ]^߇߇oPc|Q| >=w'g_/Wk;|ow{|?g|_ĿK`?+* 7_7Mw| 8LJDI"Q$ĐX&qKH2ē@2 &C=^rJ$ #dy&cXH82L d"-ё'b$&8TFɃdL2H&,b#v |uST2䐇t2䒙$"d6) s\2G|()"b$%)'IyxH5!O?%u$@,"ɓd y< R/%ϒe9 +dy&kȋ%L֑Wzl$Md3B^#[뤁l#47H yl'o7d'y] !!N.K#d?-9@Cr|H>"#EcSr 'g&_/Wk;r|CΒow{rH~"mvB."ɟgrJ\#Co&;EAnnbJ( U(Mch,U8ڇ]?@t D!z/p3MQ:ci"Mx:&ӉTCT詁4NdA3fQS}f)t*s.M :΃ww#t>ڋCG裨>O5E>F!u2崂VR7BS^5 G/ZZGt]HmEz½6Wt1}.Oѧ3t)}.t\x/t }Dҗ: ]O7ЍUn[kt+}6m6fmoՌxsmJw6Nj{;KT[pjUi N-jgU9%*d] \S$L_z\hlV_.cK{1Ye:gi[S*[D eNe.h]"˵c\rQej$*%.>ԣHlEO9!Y@L\T?TꫮvJʪ+z1=uc+{ʊ_Q ?”:%E-qsKH%M:%JL%ة=rcziQ? 8eR!Ys sz9<"Q ӥ^^U^0]ujJ{+[qgHD72pg.כ$y`^',VHbg.%@]׋%1u"Q&cM:[jҀԤUnlɪHno2~f).ЛSMh c*U^S %[$PݘrQy+j3*}~'WnCt8*.R9]"QqVJe_OY=յQNɩU)hgm0YtiM s DD8bI9+U|;K|bC ֖(F7fҸXoa7:$j:ѨRkz&az&azfާ}e~0s?9999>'B,\cG)A$z\ up,\ m.Ln{&gr39~&=>39~&?gr|+s'[9[9[9[9[9[9gq,Y?gq,K8~Y?8888"YoGp l\5q l\;5s \;5s;=`-`vovov ߠ   ߠ  ߠ  ߠ  {]F7h$|F7h$|F7h8k9kE|]]kOusaP"sġP$s"c腑Ok2('e<OxE{* T7P^@E{JKK<Ǘ2x/e<_x9s|)R/[k2(Ǘ2x/e<_x9s|)RKKTlo_x9s|۸||_w]w~)߁R|K<Ǘxns|/ ]$):l]v9KHYT UU@,**F5PQ.Pѫ@E@Ei,)wW281e.?ÆO8=fW2f<|^v9N̽eѮR8=:4(6qA K&;W-J*DZFAw$NtZ8q:WY4\t+**upML*ƖDZ7V$B%JtXe*6 ""PYV:RgpH5PxS)bHEwcžSz0>nJv/wb,r(-IEg|”ı)0 X7VX bgE~.qKhl]~슆 s;}ng8p0숔k1*gzɮُ]bz&_1#j/KXYH5R_(WqqYQfgݹ&'+ /V-v}ɾZRqQbDBAU E Qɶ׺v10YA N- PV0uݚ1rTDkl]ي}8"_BBQswcvn0nPyByPX:ohH7. )!:JQ&0a20*`8#z3J`E'`ߏxx԰WL77 @\,2Ǫ<j|>lM,PK92˗ .PKy.Fjangular-1.3.9/docs/components/open-sans-fontface-1.0.4/fonts/ExtraBoldItalic/OpenSans-ExtraBoldItalic.woff\{spfO&`c۶m۶mml۶mnl~{Ou3S5=g(^߷U6Hqce7W}t *&/xX1%o=Hxl뺜=7 l 0o[NQD:ǁ`Q8of6\wx&MfN߾P6 3koNs`bM =Ҿuo#2qv:#u>GxYoN H66}Am lLB}.&mo~DŽIM}ӄo ݩf0n?$?9^fojoKgH1зo<~hml=`~}k:2V (UݬڮJ<a,AE`zDS$uRodzYȥO#Jv)K<2l"kolHclU[n[׈U olBRBR[vGImiTDZR7;W覭3QFUŲ_ i/KOv%(WNG2Ί‹+x~VV 1`ckm=+=}8V8"[՞7ԞOٙ{譟RНT{[u[ Fo3Re t65Fz%E#$ 1&B[s~°O铤3Fmb4TVIJ3h;A8b#^J2)8ݘKa"(ғ#V'6&|6f@ #'*$h]hL0YPG;G;Z<";$Qdy`oxRfeeV [VŋT6L͓`k UUИQQrC6Jmx&=]8 *g"Y.Y$_rn'Bq_JeRMUUHRGt :4Ou.F#XRTaYa{>Q3͏f H d@m`w @o/Pd=?H@ !htj 8o@ (.+tj lƒp4ǁ\qEkjB(>YS(A˅%pq5:M3KWYt;f]#ecpSaU>M:7G ͫߙ:+俄ĆۊtTق_cmG/ Vb2Ϸ%6㣗hG@)?aOJ@LG0PGDUfL>DcuYmN%*lDd4QokFUGe1lj^<@pQPq~ʀQ_6BPLøk'm p`jD "uɔ5_Un:HJ>T" &(Lw r]u-etJϾC ,?t-է皸Փ7pC$LW3%[Z5~ {OR\&OҸ?p"HP$3^CI.kC83@[}DkApm-_JOL= k?:g|Oom+:vZG9%g(k#991~L KA^I2A`X)=څ$֐=s@no$[%]g? bȡXe\l(ċUJAeʊ>_1Lչ8"~mQK?? I G]{t@Y&O{̝Қi[Z,SקAW$ +N1,ϸ u֯cn?.e{3>4ԁ$bPs1rݜLi̭#s lGo !%WFuGc{K\ 9ێ簱;àUX|bDq[ ^-{gvp5-+ᩐX O:/>yu@DVD#&'E/;g +AY 1kaW܁S"IV|)1VVKØw֐|!=7VڼY_Zr*:R*H!f2wgyk/f>x=yQ_p9NPZVQ]"_>a*7Wm+Sr_pCqV nPș5i2[/ߦFT ߓl.7+= u1UR 3Pm|snؠp-vml ^U=G;j;*9<&d:zHHnl¥"oQiieHr(XA*A~"_T@1:#>Rlgd`E\qq$NqmWN6fɰKA~k/$M.T`p +9Wq(Ш9,3k}HŰ`dD?E&pɇ:4-rW ZZK^^¤ֽ6܈Β-TArcf&P4|5[g;E.0/W~Hg" (T4wF [z)_",2Ӎ]^JAc{nyĖ于2rBS#ζ[ 5xƯk}Λvn­rKJrb^wkWUhpUt#~o!`mABAS ЕSe`8 T/gw7D~1&h+86I(ji$>D >Ns_a++'Ϳ| ^i<ʽIzo%Vhtb)^B٪Փ>_jy8++ IXK+eA9H<.%/22(N9IyhYS"4?2OfW%~o3~=c>W?xe?N%4<_nVFڱ-gLw9 (P)21H#H FUM,۬CM8P5Pt8Dp"` DD?xi=j62M9DUQ`_^gD1 s34T RA&z;ꂙ聮weй1 ]3 Oou@/ ރB(Tkd\f0bk=L9@Vw2M1}b-Uz(2`P=4DPEsM~#w-~R<xޖ8_^q{.Ld1 OfEfn}S褙hT^;H7 ,) 'L" d2m_y֨~=TSSj-[TCKK,3TV(( ϩ hCҰ:/*FE*\_PZl^{D e"yz aټSrj:fE"`B㶢ޔ kY H5*.`Dbs,6PғVW &v`qB=C:+RaO$m$sbʚ@d@h 4exSݍ28K(T`/GR O]/0Jq6ڦ*)C@g _ERA0мx`0mv"g 4J¦<))gpu=}䴿nx ?}F\VSSg8iG.E!,1O A'`EJ8Vzry6ج.yoQԎKWZƭCG""c: ?)i/RwTlC1z]o<zLNeX9* O{WdLH#' ;Q}EKQ‘3׉W x>ׅk |"SG}X="eSw-PYzxQP٣ܱ#swPjX41= r:5qQӽDAiзś!m{m˺$p;K3m` \ ͝RhBBX"l ¼ JTb*Ȱ[:A[qP +!N*cO_t״CJ4iL=ljSdp4%VGuwӫ<?]ҴFTK}"(R̕hʔ_3Xq9NWz-V0_kzq~tr9.Hؤa1=~BH0ˣ m4wobHcTqL-)xj*(pi4A=)N'+q8B '̘'6zqٯ>wN ;GBvSXGsg ngKhmWsg}S4.Җ,*Ĩ_ RX >O`HL _/<|=S44BąTbi/}2r°?F cy3:ќgzjdX:Ϋ5-bMqTI%fV9'Y 7t#t-sEB5^|&NsحnV_I|HV?e]5c{;A|"}x̲Uΐ} SjρmQK?!n|MalQhmɇ)ds8 Z la;PunH7U85?*K0` [{b\ӟ"zt`!I/(tt6e;'dD5DU:8^ S9hO,t5A]uh'~NX&dRqCz:Y3,F`V,'WgYc*f57Ή!"X]Qķp |Ü1@Vw^(z}U8->Z?b,2#vTBES8-@^AYl=6ϑ=M+AQYo&X0c\W}nb^~ʱ *13lCONGĭfMz#le9 tyWll U;1w*" o {ͦ+' >3L JT|֭x<Z)u UYa~c3Is@c1<}s*ྟ^nF#||%VަҨ"\hP:?]:'e9pPG5)_;,>d4nks[i- 7k7Jp=Z||96,noOfG].UGm3J9 ec2Z#+İ`9M]_Ōb؇:WT MsM^XB}A y2/94cdf$~D\jS^66>9#hN.an 2eaƫ.AyܟAާH̒Nrh7Wmh4V&X )+Q n$Q%Ivpj+!wt[/պ#Ǿ\}vrr;Q>Lc4Yw2d'Mu$3 CUG@eRh"&-L#8BLhysK(vRjGtɈ9,N_ņьqzfs|5X- kk%4P7_X˕GD.<*#l85^}WeY&_@#Ng3IR6[\m}{4w5%U.̆Zt2KTTJ6 d= [tQw0"),x]Bn(P=Q™D#&syjۯk3&kKYWQv'.)&yWx|6/[9}քu:d}S$nh (߲$iRW:R)E7{Y|Q|Xэ5鰢/e+?—Z^WK D~=OљfpQrS ,ݤA܂ deI ܊MW-PB*^{yhNVrY'.-(cՒPG|.{|ظj/򆬵n_6^i;Qbk֬ WU\1DӸdR[뷛&}sTl)_%n|ĞZcw@ծ#`؆!TaĶHUIºM,aMzҲ5_c0")I0vouI/b;ŗ2mLG_{J.C ~;!Ub|RCl Eњh(d-E/.<[b8lKTcf3 !a~&qS_6Lܣd_ P84L|B {\76^,-?GF]^ۥ2`G/ș ,=Z( {i,4R 9u`YvkࡰI,)@^m6OUbQ7Mr t7$!^s,W. Cx8mzhi7Hx,W23lmruWwԻ/c=v9ԫ jD"z1ۀY. "v<TaIzJ ^aar="O$Ā/i.#*{.x9K4* DcVC㖹ꃀm- OpDž(zP(F^/i#bB.Q;y(2dk!%2y4FpmO>kgUa7nAO[X:78ԓ")(L1;cyAo q)3cXL7]@YmP,e`to*%P?c;69<ߘr+$Y29MiC9|\K0BҖϻCSxآVh{wD)vVcL[ dA8~RAarCv˾3hh)l,sﮭGƢJ6;&oy=ur+z.S!2w^r[$2wd~̀ʞzG~>hȳ!$pꆍEu4wI*3}5 ^<"Mg)OSTzyYAi j1Ԁ$#P1oGVB,`m@FVGTfOY M誏Q8V(qU4r),egdbOV]|zеWI=^o[2ɵޜg)0Մ&m~cCsfPO6 T \C@wT@Of&j}!t0դ4a PAn=~-)5_ \}˼^ZG#ce%GFr%T̛J1W'&@>#\5%˩Qn$9$ǯ '޹GYrre^M8!ْ[xLk77<5sre'=^#OiMG,2hFK~DOd0&oz#Wm#ꂰX ] $J-j}ٮ?S$ZW,aAH1OWf[҆YzEtc͐Wؔnh5vqW=QyT%<ߚ*p.ҥ^bS xA 7 @gn6k˜_R0|Qqvadw :>r Yٞ %y{Bхw/Uy+<eq6RWEݸASCM:k/c4n2(WY@0c~/ o 2K3ًVoKr| ?;Bfΐ` ;41Vp<oDN$S_ёjBՠSTalf4eԪ~V94ny9Us3|Nl2|^ ՈAb8vdSHԋsUo`N0tK$5B%+#jc @KX'7іhYLۮ>{Us4Xy(e.|B+ 4ƨ~) MJ")S^@b%Hxq]G]F~19Oj6GVW|m&4>3+3˖Jh1?G S@PDh6-yc6DI{R>GFVXaNטކ5 I(Q&oW*<ّ_'Od/"> XjK˓mI8E|Yk Ux2p&]܁{0ҏ/t"Cu1+|cmxr3FFXa1;;~pZ|SIzG=}4}1 :KC Ae+M.{:eOXl !ATơdAq9 `RŅ5<_zZЉ^f"u^|Y$sE"'TdZ }7e鍮XM9v>J|ͿyE[ .v5K։y L[^d96)a]MĔ^`H {)VcY\C9uskk[0+s<'NGN C=fnHA4^ n$^dk6~'~"aoT'a\>7eS޶;mj% By5GCϔ%Mn QjTF1v0iHYNtRKa[dĶ)wi8Iu%\ 4ٗhw2!9@_53qj*O}x&N?.cy~*B䤮 ~|@Bsc ε'f'9ԙd3{.yhp~lހj $\XA5F`'1%甇 9\cgjQ^Lң2>7Kڿkғ +sgx-a38܉{ h0Suf'*:B:'>bNqٔ5I\_hut&t)$!^MS/{MUƗXrckv6gGvk3^61r)k u<9}Ghhn&Wث–NFIp#.mO.ޛ ܚ4znPt4Y:óNBDvHc&M9U&BX )墛3u%^HG1qnl[̏d V0Όjf\޽Eg=59>vC8kHLyh=iI" gDc>(էa=j[/6L*\{RE2SiYLF*c[08niE1JS[ uf҇){êR` /2;ߓHQqC;]c$%oX-$W H寵tMp_PO|p"uK&gfTsE3 5*|jMck}џwAq;(TK3hC\r >5Ȅ{+ HqQ@Ur!3>&K:` +uƔhȂ. {>_,F.Ɵ -Z ?K`xyHdaMq@J2#L j1Ohi>elxRCz*yG"*mX8Q3F(^@`u[NƔ]Q_>}lgҽ,܏Mٺ~@0WpZgKkqE^q/0nh?uE(FL}#[UhX>#֮hF8֬Í֢&<\iEw~M D̘Ű]i*Xw Uوɳ U8eoS)p!^WkvriK[ssB )ahuW;خ՚te]*1Z@N2ah8 eFPVÁ0F/訅J.Gz$uو&᭝D9dp2n'fO .Nq_PmP`1XAEfg=0^[9Lmxm9i˼:UAsXkCeH BN - H{}'R +Nxy|IY{:^=k:եAOs|g-j H 8!;ƚgc -r2iuK㙭(*4eU$: Y2u5"9K[?f{h_ZkkHl`}zPbG:Ӑk.jq1B35yVl HUI}4~ в5-Db,a2In#% H] z-?Et /-ɂl[v2K)'lYo\U /&X=8΀P %-ώjWz' D j҄Qcb8s.1& 5+wK#  vո PWj[]%, -,O4%#HŐƸZe1;8\\9[dݽ,e>\<<ď>g22ޟ׹f|Jp?L$Ԟ<2 곅ilCGnRQobR5xH4vKN䭷׊z8$oix@QMK*[8 .|\=4ц%kcRȃiJ&"zUB7Cr H F g0%{YWCȥaX ߟP` -DN2~m,*7JCU-Z}J+Ag@ F!cyA ki @3Q0eMʆ Be{lotH.KkI>?+^N_/}sӞE]] VG֏,_QP Vكd4Ic9G+Ti$h_j4( ya R~/RD {4VR\:aDvDoH*uGyl:65,h!yz_ m*~oޖ͛m^"z|||NLx/k30+ۼ}k9%OޒY'5=/wkGSѯy&/$\?8wNkCI+fVww؅Us,=4Ա6B7l;Z*ruĦI#.i:BI&Ӷx{Y\4ۦe$TxƼ{MS-Cy 39JF= bߏ-Ԫͷ=9Jw0XĊA jğ&3/KZ0Z#?xM^y!ܿ~Mݸc|ao)nG6PTCwp9]*sr-;&O_m;Rsn4x: 4Hr9aJhe Oط^~lf::I\_ȒK~&-rw~%oI9W;{ x.锞<ޢZQm*䫫 ~E3P$_$l`5|? -Ou1#_t3 %ÊUR/Pcҝ6 vnirω|fnv2&П5wƼhu|i|VCG͎MNlVxL}4:Y.4t 1K}e>zJZ4v6ecUMfڭ{b%MVτt/~Bʀ}>$z޶|M4(;Gŗ|?jWO]+ 8Fc5Xߊ=#<&7fχ+]UYdh|oջP7:5IXoRss4fo5.C)[I|.Ik_.Jځni˒֎߰'iLKNQi˒紏 AFg+hBvSrKTd>Ȣ7D=,Y($eyYI~*cjYA_wʼc`o=C/H~z6s'3x2{&ŞRտؾhOk_l$Jk_A>ڏr.<1DJȬWHN?&'$Gj}~N^SH r{~JnNOO_x餚aoQ2lk!,J(x}I\ w0eǴSwL ܿ3's6L)mb3|[В0wjˉa/K#YC[o;znxn%addt:yE" 'rD`]DG|S,iOn1sx5dX L{,C/e| /ckVMmκ/?::/~nw^VWB XݵME%QM3taaō.k:FXJ_R>?PW2P`rW߬Ʋ.*BN_ag3d ;um 'I\ŊGâBn,+n3&Y՞B-7._65% <8^2c)#keeN\v>ޭ[ɔV~󽗓w˟ڭ 퓴RI?վ??G UF]wZ ]S^JodAdnj}C3x]R ؛177̸r3vGnһ/CŸ-NJKRSJ`k]Gl ߎ$һ?چȨdnbp|ջfeU4`ҭtac.[{shl4ߥڿLk_>2d4\Log퓾J?hϯ3g G*cEb' tAvl2]J?4o.^pϒN=lȨk iH|O~&\;jdɬX/^ uW{ҩYZ0 -Xx\[:bKG,q3BmgPEQgt`H)drb50#XK`t2weۤfՑP,XХxKfEwL1@w}u7SL-8`&,b1Ewnziʾ9wg/ i?it]T7ߕj|gNW~y㉝T%qDL?d|O$5<"`NaD`ٛ#㹔;ƸS|iakΧykvԞw}Za>I!<ّ?罠ajWzj<}R|}??{^԰ڇjn/ꇁ@w8=Xy :+oy݂V\Q,C*$Qy(^dcn qXޑVdEFtЁC7t*fŁɐСXK#floHv:=Zp^ XW^0!ڷ'r]ty]*Lw*6jl7vYZJVK=Ok170_/y˺Kծ!`D{i_>MmhCnixgSy2/Y"W`b/tFV^-iul!䮉{Ef:yҏo{aE +fAV)mUM-FI3ϙ"њ^Qˉ4*AFbɔ(a1y|DpLC&n:rj}eY 4S&bJFa%?PAĽdk誉cX۽w=F I?҄^XNF&3Gq 'W^!n` Reۛ L-_[0[ͦw=I>C"-=d䞍?3V8ķ^⾗F!dq|%d}ndK5|&/L'4(AA{@O!d{ujANd2ektb@C(K$m!bzB)ӥ9hyuNNzl?aG ^AtIyP|GyIQGe +bʧo*ܯeElF͏\oW@E3šG\XW)pFwV(dqioq*M_:K+]Wԗ%g47v81k;b%W|R y n/ <{pժ=}t /Jeݿ])#KU_YK2LU{ɲ[?`2qC{'>Hӓׇ[Xx3Cx,B`'cnAK^6>|1X}r_]L{{R!c6lӮFB8}4t1>vv}|Oϴ1b|Y7jۢ|iʦPMMQ'ZZ!+UE, ;o,g~havi(M_Zal?^C҅5'_Do]$Ha COz@rx*We4OUAq5V/x\ V{Ad'pi='#= gϪPX`^OlgYce[OK YgfUg䑃ۚǟ?C?j{>w6|?xurxGCYfp !?p$sxe'Igw11?A''|OLjuS~fX-y.eD@~ļd.wpr'j;}thgդM!'ucəZ֎yurO~o'S>ȍKR'c^1V3/m&cKzV^*κض˝gZ(k&ЉQ$P"Ύjc]wr6I1 a㖵 -M^ՆyǪWȱ#^o4ijV3/*f?4C{DLg7ê1մdɓ؄/^UմrVjZV2Z iEb=7e|$ Ts^KhZ0}{=6q+`˻_z='jrl ?O>@>'"w _9>Lv34ba:T>RhA<^wDɀȼ8 2Rv!Y80Wz:)_mt6g/VLٜ~]OGV3װ#_x[3f.lru܎U"@udY-՘a1}V=-nN*dgi]#^6bݢ#臟,/ve_Z]VBA:OkD @HP7Vp!ہ.671ݙ1 9M@vU(*^)eK937K\pzZv[S_>뿖7{SG˗/4_ :7߰[p: -ɚG7HpIC<-9$l;81A UtvN fڧwyX [a7{2kF {r* 9W--8uA9u$ٽ蛋:w v][VuM ;]QBwT%E Ìc'".]hwMj0noa**e'PUw_JeNx @ՉSϞ*T뛪v*@ EOj ٺdbwb!/ZU"Z\P([)2jxhŭ+XRQ U5qb*MʼnXiҢHe8[`-(3 r83 _ 4?QO+R߯ӱ9&Z^` l)9Gl4[ f蟲Rݠ6?@w?33?+a?W]]4/U+#W㞲T ?wꃂ#$2#LNj6<OJ|K:bzJz|ƙGA/[@H_v \& !V_[w.Z21_rsb/8}f] z>F[_{KĻyLyZd,V;~ء];kll\ofl{90_3\CƢ\DGy1ͦ& 3w*;ϽЁ>uG}`w35cK*po;{{YI Ua" &""㊌"vwZtF]\GFEQ ūsNy闛MTթS x?H+I.K3 _D}O/*^cڡj*rN6'"&,$AҙwzYC7vDF-r67BEu"{IvԆ*bL-ZMJ,6{и;/ÕQ2f"f="!O"o6Jժ9Ӟ>}d}QU15cs4:r(yB'ATq dQ}ʮ'ה?TMJ])v#0},H +Xl۶en|Yet5lwmgg SuR95a [r ~dAFL)?3]urM#bHIK=W+B6 `VfbJcSIwr*R)7J|He퓖uf{/;g%yE+JA<]u\LjJ?z0C9ÎX,dbjFZ6iLqݒ0q;% {J ghZ{V2~O8[vreLLwܟ"ZTǤ4mnO( b NuA9u"|Y$hIlI&Rz UK<_4~$ 0/$ C !\.`Ot r5{V6Ms:'2:4r\,-L:sn^LZtפPyNxVbjh*ry]ߥnw7]~-)M[+9cˌϳX=@u ^D˷h/#˷y`(שCYϾssa031(6D-$f2+iD2^NI6P6") .gvcr*ƽvF6U [c4z>˰nrqQOR Ƈ*MŊUBT?y f1+IDb+/>*gxs˻i'j!ϵUZE;r }-!SkcUHʀRȒЃoHuvtvSLWHA8ʚ-=UFeDo^dCXT.CӢ1VPo9F I`;D}JJ4hj$ A:у9Ѽ.>ù1MClg+ѳ [,P'|U0%7Ha DӹnI~L3u1(sگlUjƬSrjڠqxu+IUj0I*>qX6/͈8,=d$&dܭ j:4=N !8L"KI[Y}etsٗ Y=n쵛Ŕv;H*iÞЗ͟|9~x| B| S#X ?g~^2[܀-L5HlΘ~0UHطI"eҚ:S0Ֆ̩dgMh\_W]928TNHRNk&C . p?K dLBIJU*X nٙsmiF ǏP`wV6ЍBw^h"YI;W Mu/[Y\y\0\~ㅇW"ynAZuΈ ~#n1*rt 2m@vpE&?LH*錜:9ǫC) dR65 C<cZ6|k1M~]aU1571Ͱ 'Ɇ ekU뇴U\ʭ7U|Š])D]jQy3rGa +(4NBcf+Y>vۇ9]5u yXאi>Y8|uTuY^NΨi^?mzӦa-iX-6?s#KB܀Mv'd-Of) 1er,>( 5@} Hc⮢ Y]7h8 x32 ιzخ>'NTkY.kconSѭo 2 rhiqIOp>$Vu*`FԃS>V3Fj)In.Z Sϣy!KW"zAS)&$xJ+M.Y7jLIW<RaAI|?D;NU,%/+7y!/a#KɅf![PA:LEu>o=+?w ٫j\(2#ZpPSZi3"w rRJKUBI2vUI|UT)H$=B-5sȾȗh>_u?nлOm'nI;[CgsAU~$wqr i157? :\p)AfzSsV׽d&Sru{gD_]=^zv%ǃ.ř1̓:ypdb.ìdOH!ISw) oH˓bptܹ =Ptۢ3/]x b.oVӤ5I̗yG.)0ٓv]{v Vt4tۍg6M=fc]K{*7KGffl:6u,Gc ن؝K<>u ƁC5`rlB_rMyIVC϶ZuHҺɤL/No͘#)𻭒ʚT7 J#`G6KtG80ź^g,)~YY5CߵJIS^DYew?&qjAԜy3l (l9Kӕ;nN 13^(FxFw2Q34K/ \1Y@M9=xpqp*<)"UṺڶ>B7LguՀ)YGL':3n|7RHG3ɇ^9Vr }XֆCȍ"ܟպ 9@:d"`z"uQBv a&n4SiK]AnY%oېLP IJ+,a\k~?܍ôEj 1o俦0hC@\tA^B(@8lO tELb%\>#ӗ(3+7={B]ހnЎ&؞W؃ЕKrRƆ`H] iT6W55$ #"nv-p ߗkiM͜ ʼnm} ҎCkOwYK 3i*\3orȑ)bLi/eyj8m] |BsEL@"H #Xy]\cK.>EAۈQj|9~_Q7@MaJ-˗tzTU[kߦv.Veq掓͞?a'Ϟ`6lُBI%<\v.ζ=~mړj8'F Y^IbiͿzQ-[l#l_&ӱ氉[_щ#wU1Gg?o|->{;? ,:SгGzyyXbFO=O٤f^ l15;#H?PhWQ \v:%]3HH|`uKkU5ޫ\j:KrrΆߺ=TSN>CE5t7EP΍!SYYߵV(r>da37[ԇ`E\ur&mw-vıDqqlg8fu`rDkd"Z.:D&rǿfnecXZp1o; =Kr>@_.]YE:u]]vg9xI+BѣNyX ̽@p|k !yEpSoEi#& V#N$u=(Y٧!cFPڻ0ɮ?p .Q7|eCz7iHU]xy+!S]8xZյkeh_ p٘SH|Z>CZ"BPn(̑,2E#9.Tâj ID}lP6m:v!r*{@ʧ~(JIR]c@䁤bGRimvgR,Z5zx*QZ+n EdmW*)OTbK.RF͝MaSY8ğ;8;@K#8d/Ȑ cHZa>'4m?(nn㽽Ǐۘ@瑷O!C'^ķaGXk7B(W#NMq Qe&e `)vEh vvă=G\֖p2!2D+ߐߑt 3>L=G2kx~~yqđV]ܔ?:WҼV f[ڌp5&lWiD'RSq1BoǭGw)r0UN4?)Vf@28#c'J~~0ߙ"*1WblԮF vbEQ_%30sGm#iM;igM#kIkuZ2wSHޙH^R %s+Agam ym#CŴ=ppX:>?,,zV[̿j86ޔ-6 TV-pC3"Ÿ42ԇ le%Mx6W㴞#P R沷iy<`;_|aam`m7F# h;D#!60B'Mc|+\׬%p kOVk=tp Q2lc͌8Yރ| {G}>gPөfDdTlߣ2 3Xr~ƱՎ"% c"-WP06<ݬDGF=q0 $?[8yf8 ;I,ɚXv\im rL*u=:M3&~E63X"J]k| Ǘ^rt}UzmL1̖#c_GuöE;y܀bGL|+D"1,I/uWۑPmhaÏg6`D"x@&@nG<8KaNֶ861afeFGyqDrMGN}(wG)>nvup(jv pN6`o{yY?0jEj}I/Iieb2N0iyF:C}^ Ԃ`˞7dzb;u;LVQ!`3H9MR*b-M.vw"qufhZ˃j!(0[(H,}xzjLۆO?z[j=t+mNeo\72H|lO@Zʦ'A즫Yz0M+bE݉|ctƨ3#Z)Ib'Hl[m@׽!{˶[=Fu9.ƒn,8ٵ tk tH .ogz] 4<&T|̾ ..,l.DcRa&'ZrϽ&J!on$K#նOj k?w-]?Νҵ O>)<(/iњ v]F$Dsņh.sv,1PZ8$ےbOYIv9u`&hjP+T>O|7H"i҇?NT=2K?> E9%ʮ]sI}b[qv!CtF;f.97_2=_8"[C;űZآ`!GleRv^7wNFUdk9*UW_ v ĝޛ-EvP؃5gH&fa;7U1"`LOvZС׼,n5u?aa2zkۦwjHw:-=OݙF't0yS31{g Lٜ3_`gz/0D}3m/8J@^ wu7mZڴJ/#J_3o{3}5mI˪~(&;oqc.a%{^*h u|DC$MӪpI%DiVv݈=s7Hò hFd+9a#s\id͕dy6/Pz반 7~LJ` XrrKAe5+0l-_[ D20"Z|ǘ^'V`&+o_3PR֑eusXj Eo|^gޒk>=#;?LU՘u;Q(ѓ+ŔNePrG;}F`fd3wa7ԖWtܷo5 ;4ۮA^r#,ta2 FY7mAhYk5j!8$Ghho;;@Ϣ5#p(Z'K*!f w>Yz|<{r҉6<:˚,ܣK"n:|>*e眥.|!vbcoBیh wZ3.J9õLi4IQWoNx=)p 7L.' bMxS 5DI6.OJ#S]6,5"bKQsZķZ▯*:/S,6l\/ѮoHM\nͯ 7oŠvg~~͉XF@EZD>;@fƙnc3=^94TYJJU X0In J-nZ:Ǻ.RoKz#3l;0؅]8i$M9`۬$uW;̲sM635v5f>^d? \l7>1dB*.sV㼅: !a6YP+[ An1/$(ۧSyXNl.c% 8 \sBJo'B2qD.`;SO!º=˼ e]/B1J6v͓Ү"kX] ;d޵tuvοNRsU̮uC͖-YmΙ>gN>wІ~ ;h "߭VVgSJPtIGʣIbLZT4_6i/4} eۭS 9Y_ux>I>ye2;4MPsHu r]5RءƠi\ vf)9;`ۨ!%<"J%jFԋ}~׉È_uA$u}-I[W/WUy}7f<% tZ*"E s*kR(%a+s[PڞAi,GFvIqT(3 3Ů: odvBaHs@(S $PKzfJOӯ,.+[WW_LX .g ?~ ,XZkL)ErlGj=X.,Q/dK@bnAEU=WO 蓊!x]SR,Z.Wٱ.UZy_T"IR#Z\mb9ڋH(hmï͢$E?tS/}5ݜEƎ9r>Na}9w٫Pk<1?>ؽ3)('E=Ca#;b e)dMA V|Q}bz³2. UsSh7ɤJ٧"l|g ; 60{qÂ,Rg]iIV3Y3*9ڳʑQv :lN(R͙U)&]J\ =5WGB@#գ']i&Z91KW-fOs˽H21ᆪ+ѿ|ܒ EUKvhH%[2XrUmLZv\S cDG`?/Dٿ[x糁5pU^xA| ),ok棰X~7amwryב,?vaK^$R|*r駅ŧds?kkD4dͯ k+sc8o8XAޅ @dfJ\*Ple(x$`-XLTUr٘(Vǂ3 2)e,|3rQR VюS, b%-IѸ}I?=u҈H F5_^z.D1tjlP )/qxk_ +rM/$t+HuQ"ԼU^Iܱ+[j%@{~z5mRtCT5|5tXdt;=tfeXMbɱƩaAHĞ QQ4,@B &m~W 7ڃnH۪ؾ7 {{LH˞ޛ'O%-|a(L;(PoqL^mEVCX|<$ H! vlAj"Pd+:OJně(@ 1 B _֍j emNL{&%B86YJnJ#zzB5$nHxB|s?ȄsßC7b{mfq<4u+ 덀>;13&kyNKF"s!&5" HM) DjPTlN:Q"t#K R[ އi K<ʢVըsm\1c dŅ֛֮,FF仁:oH{d4]?PshߓZ" C,G\Dۊ:n$ijhb džA'9Vؙ3ud1(r(w FVS"rp@Kn FMjL!5x48G Àց#փ8% P]VQ#& "W"I~]NeOЃI,v1a7C,N9s;3;r3Fdf ;T|d:ct1K&=LSXm<$DnD<yvնUF2=psVi'ѝMvp; bje)8%=& a}FBd%1]J0dsp3ʉze'뤒Yv$W$WSSN}o65.0y% ռ/(bo$x-ĞwdxF2ZlJ(L_p4tكt,:NP'1*ds50e'C5" ?MǮ/Sca*w.:G`'u8ՁT'"E18)Tulc,\i^R ,iQ3;9: ɀ^RtoJQRGѻP2txi.?+-m4:Cԣh!h. ٰo,}s#Syj̄mA 3auA:#ٍ&k &`tR{PZӀZ_~99`fϚ`*,)csiYE3I)X[HnʼnΩ=(YOqaj}ٗ"N+neٽ[5m~רIvi٥ /.^9y}W4n~+Њ+u{ꚜY aTJ8m%+;vسXx/ɸгvuVaPD'v;;4k\Tcm-֎2M#x$j:njK5x%x-G`SN7&\6NpVl\YByErJFD*8P4̝>Y?GD*?mM!nިq%7Ȗ=WC>}4ňMV-nhQޔ8{vDe\6U*idh)*3;ے3*o_!E:`x~5j3r:3jU[I6WJhڭWVK-h5E0'4>џxxdֿ鬎T0!_&87v27v7lTPA 6MڲOV't$1oRU5:ռdžYffzcK=Pݧמ-+B!4j9_kLNS2ԇm0I9?[.6}˺k_jX\X(4 5zPv"" ̥$2ԇC {Vx@g˙\Gf5–XlPOxшR}iLm@NrisۯiZ5Y d zWdп.OF]m]e )%䍊YyYH{Ea@zX\6H(Hs.1哵AϾNd!N᭑1ryJҲǽp1{ ɼzڜqشud.Rt0~ʴ_I?_۫. W[?ixQ͇ t@a*gA}}9gUْ̗%*d􁅢Vci6IAx,wBym5G cG6 wxV+*Wc==>©zR `! 8Յ\@>}G)qX39.b 8RE/q٩O/@pL_}x_Ɣc\1D5zϷʭ)i p5YVi| |\ί{OSqpg'7h=oҳ+jY41+a۸?<=(1O A#)G }j/}*/K3Y?{ajmG{m5b'7 O)W‰f(U&ZfY@׏-jj.4~Y/ǧşlJo,}R%KY$Mlxi \tӮ?f[6jⰥEE?Z79ٷ\߫e1c*,=/8zVeO}T2`pUֹV~ՎmFX{uC m{\~J䌄i|}EPwD?Uu$l埪BO@SP {&06+_Rgiַ6MuRߎyBb)U:!p?0[TKˡcFv堷9/-0C3zw^kR棅\_Ռ IF^y *i<쒕ˡ6U*,cK>R,1ޔh[p*WWق;&CmY3(\@ǂ@F˜=kUP[j*9u`9t{M.H%$9csᵏ v&u{F.oO4Y#-3fQ]-U5%KgyujKϖIjnqiVzB^p4o:uLXrT-|IpA<҈Q3\ҤӴ `'Uy-V\ lS! Ќ>@HSN@6uNN*oOe'ϙO;|!71ճsHf}JD?[T\ꇈ#_^J5Jl3NW\.@8hYU3MH~֧r+.; ց/]QT]ul3C!i!.t`Ջ;[9{?} BFǐ3*4Kg[N?;`i?RZ݁6ȁn;{`xWpN1帡pD{1jڝlHnTX20J|ǧObs=_0F29@Wl _ByXHY DB\h7:#peP6-J %cx^13". ftBE2H&bMu^Z\J2p8VϿ D;FWy9T2qĽ/qi =! .Ò舩-D:q^w_2:~}Y>_&YHƍ%\sj44.}Q蛨;<6XG/2.Cg ttuP%;rM]rM\9YzxByle탹ҠM}7V*h/d W7H]r0SwXgR70X}4:ZHه/2ѕ2sqٳ1| *1eD40QpȪF@wh/[LaU3[x6@0-6آfiDft̡#$s̚,(=Iﻵ)ۧ?@uEKaQ3MVn=K@Ϩ+1QLA,"Rծ{lpqȊh*)78Yp*y4xHvsPjM[zLp]!4 4 #ui& sAĹ8kxX &m ^L`pֶW0a)Bֈ`Mn8 -@|cXb%:$Wa(AދҏKE?iӃ,=uXZΝP|IcV 3[_܄_?m|PvПH7KZI{+ /WxCd?D'pVbIԽg6JH,Ѣ;e2W<:YPǮ= CB{\ZPg;-/$ PM\"]QW:Ml@sߍkWozhU+ڀHuzN?i,{Ek̴QVz"(XZ)Tl\N>ҭt0594lvB˿.`0WG2/qFYy,GfNLq Rͣ蛏?M*jU>т\tVvR+#6NZQpoG촵jNEu ~]S+ףvBP+DZ0vр3A Bbؖ\va5Dxbi( NR/" /BP9˳پR+n8^yV'LJ%;'Ykʺ~kG6yS r>]vMB;K }.`} m5ܲ,(t X"s:įqL`L5 G:?)vBKYi$9nR# `t(CrّۖɅ2 Iz{Mth@|BŲN$w!+WL¢nXz:SIu~mRbKX#0cba؂o zq,Yc8⣬F֋S{?OhR ͽ ^"h/<+9wJcTNe@?';Vq=&N%'b pOD"h 3K{-yP M˭d;- A2!@mM~95XX6m@+ٺ&KVgWLHt3IR1x'@A؋A7!QBƮZrR lfք(}1/ԯ=IЉ0cDę*F-ckwiè*D60րLWːr=U)Wwk U {ZCR%Ǝ6kƁLz#2 ;dfdH*(Xa dB\Uzy\iW8D:<+W@)3Bp2QU_VTi3qqoǼ@ CNhs=)TGb&&,!'eCI@r ΑۯWΗ2L/lD[>pd9P9 PaA"&iЏjI  ٺi*7۩f7RNZML{pO~S¨ _/b&o_C/POi3te%X 2)Cٺ: O75kU: B|s"{?ԃrA4kHzE3#N+&{qA7P{k~8_*IC EWh"8'j=a}!3 !`QԊGz=ŌN3U@ISrK^J \HO.Z7'IZIjVv^}pE{%]Wͻpi:,W_RcJ͔n "HPF #,,RoEg3%>-,8vpa^'ֽdܖq s>j[vtyI5ZuXP/lj!?d6S,A*Ha I)PXƇ$YRքP+dcTaMJ$5MR~PQ~䦰8jgSJ@\IQLKZR:US1dENf/p.NZOb=rlLtK[fYTaZm72zv~jԟ1 ^{>핃'K'1TKd XG3INX`4SF5OFVB[-PcQ+8f\vS!䲄S 7 {7*.Ke&eSͶd We*8L_w~ޙ]o0Em").C.{@i=DFl>ZڲuxY<$Tﺼf_N"UyXq>rXTY =MjRZNF4~b$/hPT[z]n$N-b$/$ )v֔jDC4cлP^ +-[oúv#dz@R PI pӓ7 t]:bVm,tK%M9kweUo"vQOwGTD"$Es7j1요xPJvAʏ+Bj  HHv'zL<_hBg2XPIt-Ryӵ9qyQ˶9HoQ↦x7`rv]JM'82zs Y?&s1T:^#Qt)P׈* v41Kڙ'R$*,i7\mJ-ճ}mqT[Zfr-/{ˇR#F .k)rd5FMnFV TV; ncJFѤd0 ;rOs@HB012܊Z2/_k[I% N9xJM)9,p((#l:)e@9sDlq6b =ze;+[֯*VLZvA\]!#W )sƜJnWjv%xYRЎ -KcPgA 'u.u`Jpz]RB^c*K$+\;3`m@ 49eҝ4Fw%pIsAꚃae!?DZ`+~:W\*}*?Gvn\:zqf2qI|At:,7O tf_K}H}rqݦd!LÍX  GQbqHfە!k˲7Z1BK,Rfq'A T@+q}&莇Loi U͜= l:-)Mw$ R猳ћq&IPv)rTڎXIƥ6/u@I%ёph$)&,^ *_wPūj.8WgFCN| ֩8`Qi^ZvtԻ@'u ]ͬ&훜ާ]&r]J7I39k㴇kh(O|AER툿Soaw)Q}E%RhՇ #nYR94NjM;B*kD.+AXTn$*5 oǖ~P; ~+kv/D3%~ "'>Gs~y,62:TtQtH}3lZʆqIqXs3hph,Ɇb:4ٙCNg򱀩AZy'4`p8rmz %vݴhΣ_=!xŏbPH3z@[E ثy쯞~"p~a_;%~qx]_^teQI#NG:*~Yn}~{=-v>szuڑqH2d*1k()Z4 5BlX<نHg ,X-QD:p>UIBW@\ŰjɨcD|o⣺܃۾X`uǽ`4qqF`XAe pƂ`=T:ig 4{_PCf-ƒb;[]tlN*W}9Һ׺(} .`;Fcr^qtto2 ]=c>53Xګ4KA&>[X=ĜZ=wFTGVlP"nJ.f'07)S1Db7RffT̾}Քh̑:,ʯ?q[9):A$9< j >t'Z{z6rJ2NL-|`ON +0Y#FzG+VO?*&aMuCcQ|I.tc7},Z)rY1=Ǹdc}LH=vq[^Ppw'"/oc (0 &F]kqO()mmaMcKT9y Th ''O>@]Yu@ǽgi_@BZX$ԁ(/p:K!MTӰC?y_Q#/jt l{I='}5 S|%廦~_{oXK//r_Dц;ͯR*=gĶ._OT8tL9$*J@o"zz·4T6a ML,#+/"h#j ՈY6٢&fEɢR$(9yT%Pr8J&u.^^:{]1 Wiso"[H92~"_y륺y2TE ou \z)IT!p *yӡx?|H#ysW5]5IiF}~#y* R$\;-Gwv!~_(X(9$3VO`Trt { :%lشX=Z f>~ʬE/maM؂ /a0NN=MFk; 1.'2+FvWWn5Oe]9cWR H-c+C˙Ju/JYNbѳ*"y)⮗|f(F&V=dN@pt pCBM؜ [)@- 3O[Slr ej?i H~v[K )gŘ՛Fܷ2*uYkە ґѴcX)k248UiaGCjṽʸyR"̏ b7BۜteםGǪYy<AĜxF=dgeKd1ASαWzG)Qrgl)睾ɎY8fkLuB{a} a;q'O7saE"/?3t-|Q]+a}d*j ?"!%Gbؑs OaP7zY2-ҥwP>Z593`^zG]+Ή;x鿆 &;e#R&H2`fYx2lx2P>IyOQf(3Sԭרuxx+B(d#?e?e2-B&ҨL2M:L^nҘX&MaFekp Cc.r`Ip8Fy? yowt)Í\^߿Gx1cE=TQ;*#~K 9FnHPuXE)!,K^*m Yx示ɮ 麌_}q竒gw!)$1vbvU\ZNBxΓ-tİwq֎O7;G6O全n${N^'I/^uT":^UK}MVb4.r7u8xib^u۞&^Y'̲a'%Ob$LFNi؁:/@ih#d\R+>˄4}w9֊nu%U;Ρe7%,<{)JWYPNL-d뮫Nmx=Wa m#SᣕV^[(I{,μX%Z'hB1f2 %jyyٛ.hje7.^OW]3*5oM:h`+eyL?>C4b}?=>(SV_8Eu'{v ;ʈ ;b;)V|^HCbDY ^l?X(E&AǾJ٪ dd)Iʙ_حèb6r6GEN{99d&i1gہ*."R!PG a;vcquS;XSߗ-l -vBd |o\IK]70Y>^N@`V#m:HաM}tlt`muL f42B!WiWN\E0޹jUԩqۈ~j^Ka7Ek8M^آڢ ڣJb(P=<ߡk[c6Zlu ILN,{M/SK Sm6ՆvC +Jh?Ui=Vߞ: JtqtS{8q -2SBC*b|["]L^O}_EoW|]sNtݚ2O|c$;K?ct}s?ȏE߱c(WX$]7 ?HcH⻓"?H7+IU( -pm awpG+=+]ߊͳ+D!z&HojeUR~w$iO|Q߅$z-?T3$ivl*Pϊ{:?(իq&I|?=o4cKIDObtzoO+ԒO[>ҾS?GXn?_ŵ`烶H>Si?{1}|2hJqkƩeXI4_ԾAL!}/kOijSb"J٪_{>#%zZsHQ:f#Q|Gz?}D~>w*K1}|2݃y)}462}7o?b~#kO?LzN?G`5äqQVSi?k_$L~!K!F4mdN?RaoS0>H#[ ~>BbWoyjk&anM#> VG3\N\U# t>\GO*v^Ŋݻݻq tޤr9tDzN!fDDt,FrҪm|LNY`r R'< \afdnnag{ol#(#~I'-p'%~W{;u}rc˴_د:4ŝҧUjwIX\dҞ*~5T3EdѨ?ѨWK QxU[Â*1YeaPmWM.mvN]쮙$XK^ +<ηa<>Y묎ǟPp.#!|vU5V-#|׼+FĽ6F)IRVC!˅teٝL ɸ_~GƓ1w9ƷL^ʷ*W? hBKC o5pMM4&z.g2N)H<*W3Jzv'!)T3HU)yB\i޼}w>MҳN/lIM//߷6o#oELVn(;!*Ss1r`px2gv UPL,K2r%i'OQ% _MG\Ϳ:b\$ hhQƥB'tvt[ SGJQ:k0(3+&F[hhtQ\t-cRg,'ĕ)Y>|%~jӒ mS4߼s/#'lM4g=NK\1'}m*[_*,%m@X;%ڭ' O $[_qK˪( {)'CSؙo뜳''WI ]ѫhL\@ %^o3 hFKcpazCE&@ IfXNf $%&Y<,l/(ls`G!&/^!L?tP0?Ც%ɚӶ*?'~?u՜`)c8aj x] %l7Fl 4@z(0ctj_jWV/ XP"| Ƙm-[)]yDX8B(%GҾxkh ='K:y*6<tTᒓ CR4CAQ5.*4Z:W+2>Wݩvݷ5,f)I셬etEh}g5}e߻+3?h!597ОW 6܇V;aq7X2a0?G}Z)fםf !`1fHw;#.Xu.ğD``@Sӷj)m:.fKFr2~KlnU&z] :(S]BOWJ!C@W~ gUƙfl 5z+ @ FF%aGE*h"N)Xü',k%nXfWңK{?;'Ӆۮ{1xjmsPC<״QNkAyl8wPYs|n* g1q"5 [3R`+fz>85d5KvK{ً  p# #eoYpm̻2R\&iϕ~?N}qBC^1x4]`G 6fWê!C[9J߻꒢gfsC ^Fժ>@N/x!jk,٦Φ > Kۄ˘衶鍨-@^;ׇ^&Ú@`siR᠕a)[Ԍ.$F!)@( )"'μr;; Dv䣷QLjIGa<x v.+K@`p?i̵*q\E%1K6bYO-=Ow;tZ%;un4r<ntU?pQY*]}}NOވ򿒥ZKjv"d/^G X*ԣ|܌Bl#*|s^TAq<"agpYKް7%[SsU@x=YT?%yﻟohA~+tNyӍ s.,<8=bQ'[NV?JnZ9][`#<īi"ֆ χze~%pWGoåCztPξ7כ|cܺ,L nX,4r:SPGPshM/19#5B"pi) #VֱzGOqZW̞6̟xu֍/Lӵx*Uqm}>F0?^Q5xYKm3 玝w?,z'>r_k\vS7EӸE. ڿufcqi5hŔR5=ƚjvffƺ9J`𜏚Le\2SN,56W .d3eϧ=1?vh+7,`PRRv>~ |"՚PC L/>qo Wxj<.䠺#^*EUgo`H1x@1 "& Sb#ՍL!6zafrЅo|cG;olWOZĖ9Ƿ>׵_mG>{o/=+G]n&Y9|k~Z ¾nKo'QYF/P U,kq„Bv;7~/wџ5 1i]TpSPEr]$p2TD#aBzTFpFUz+% a &H~". tDvsvS_mX!s⑞Nu4?9bPm$b3?|?{|Ԝ <*%`_@|!`X ^ȓҝ|HPm)!-O"{\JO CRZhBa!K5m bzT/Nn{}v}k wiT=95 \ғJX=]2^<#ė_Z|c>ߪtJ,"Rr{գ4'8vo1*hwM;굔 SwpIekR9JI{}{=|#UN{ϐ>x,k>}s>?п_-eȜ&oB&|i:|g7TŽ.۰&a˳ZI{+ky>G3S2Z8z&[~9\ۣ ru\7EK_Ԃ<׏e$4OSc-$t/p,h8ؠ+ SM` X 7+̗>Rj3Ԇ3Tj)šKtDYlXX0 ;{x W$(Ôƙ_~%K{LR9w@w!k:ou…=k\H:.lVϿf;@51\4[w^FNC ʜtϚ\sMM[pßdk&f{.+(y$| GMSYڀ3I*Xuc{~p=Tٯ8忴u\V[)T`sφ Q[̀uŋ{u1l\uWWggWge5*X?}coP]y̶V޴QJʇ}nn-uv搳v+/C(#_Ix?m7Ј_.[GLә+'^14uNnNnu~ƫ~U>z1-#ZF D& Ujojj׶>eL}V#^Csb/ zҶGwo|oGw> Lh?y/4w; 6Y.a=T]'mT)‹+קCl~B/I/v+ WF>z064SOb@lC\mBhS{FS_Njρ)14a<+8BZTՕvq$F4Irc$2GЯՔgȸ<gMYqaڬ_&'TuTS@FA)T+܆P-RI4-91,4Ru(-1龉."upZxZ:CXTelrX.uHN;Έ_ز기U>|#gqʽE|LA>YT@etä)铀l$hVNc#-`4jj|VӐJ6*`n3qdnS+ se3E4.+iMۡ?C\{U6Wx{pڷKu,tr&phY Uzp@HSSU 58 fYOq9>,зפQi4J>u /:~f K'68 %`hlHc5W TI9w‹<7Vi,S[  M[Ļc}¾mVNhut䮊 X:,Q P7,_(~XW~ "2 -̡+VRWHT[)ɤo(vxu['1ZOQ3)%~|Ț-)S bkoHk[p50L$AyRv# ]R WkթY~|6)J?a%ӸLmX ?ž5?Vma`~=/U@<<_AZTWr {Yd޻jɘA)ۈjN[ Ϭݻcz+pHXso`:©X8v1J jmP8`0z,Cl"<8(fo1;©u7r--LDL¢'޿{]׵U߼aك;Vy~tvw7>+TUʉmMo_Ϯ/ *Tsll\'C<m lԞL4>A4m#XXO7d46?:KVX zTxN ȄK XKH&j-|ԼEc̦:=؄ăbL NiOC:gT?2˸sI) tL:fR2`/ru cЊ H G+8X\$^ySmebq蹓{,3n4Z|7?/@}]ky Qs(`PT@*b2 A_e.Bn*M٥LKWKr4(4"(ƢF/ZZo@vKC=`c$S5wj@hg?o"h,3ےի.x_$= ~}?k%loüEAtP U~3!ۃ19bCKOCEp\fJZ+8TE:H6ydÈazxn|v.H?uhzUQɸSmM67|r؟saCߗ̍^ty?!8a 0܆5lHק]?8 x]KBr]~VP3?xc`d```LU(;+<f[uFk?g&([ xc`d`ǹ6102 z/xڭWmHUI~93s.qH!H["""EnH?"D$B !FHↈ[!"Y$$us1k?Vyx̝3_sS#"GAtH@ q2TdK5А+N19)"w1Ti~|~..ǀrMcnhuvwƼRI_QBG)SBn= %;; (ᝧT; JUVoh!}ogVvVyW.U0WȺzI@Lgջ\c6:,ȼǚKb,y<)@[QܝԢ 9W5 wWFDo-<}ۦ\YOE[9bNhoEKb9>O""7Sn- ]7{`U4C.d_f^X[ͦ3;Y?"V7ѿk 4[lamOXGug`ڗrßc ö^-*Џ?q_@X,naVU Ŏ\i}>9u§h#%m/#fm?|KYƜ9{|܂iN纨!&EH/Z?_odl-5 ΩH |ǙTQ'gR[D;/>9Z#WV7S9Oyn |N8xR/C[89FIIW=scH5e|_K?|^uRmP,6>T .ujq!u}]b`]ѳkkY̒ ec8C>~kds9 je7/!iN{V]qDUr~kଆKd=w?PchhϾS 3GO~5<ӈׇ? N{EqO::P6΂<7Ky*lck|I^]9-lM8~+wOe-Y+:%%5.c9ț`9jxa7PLۡW/FLu=ɍyShY )gnICVR2R , s UQ3yTR!rجE&9[ѮngЎuyKw[aG<ng~_?'q"j5W7! =bxk1Bܳ;n@^pjY?xwƴrQe85Ƽ--:\rP5;OI|/_]ߓ86=ٚ ; ^fcS |[prF@ a%ܱ*FWQ[D+vނ=csnIYr : %'å~s/XC=Zxݰv˟ao %|dٹ# 軎V<)?-+v }jsgu|sV PϧD^or鬳[sS;:2pޭú0=ؘ&zL ]:¿x'p WT"5]/(b~'XоTwpUR-d XrO\F~M@UW'>oǜQLP3#}B=#?1uxuOZpRږZ uRx*>=PRDfCYeRecUΚ1,suocxrAj3!1Mc1Ƙc1Op88:SR{ I xߌ{E{o'H }Y%4Ia0zM&)f31jc#wޯ{(hg$@wӃI0d %C3)n>gBd WDtS<`xRYL5J/v$LAo-R/`6"f |x+W ]Cx3uq6 s s8kYȉdh٨/$1/Vp?"V *i4cA7 A8Pp+SVSچ ԝL})@ , 7ץ(J(xzQl4*aqVYdS@]0B9(tH^*[:;5Y:L̜͜M~+M`Zwṯ>ˊaw0~~q7]b18@Z"$ͧ ܼ6¾}_-hHE_/b8KDk+R y~ G|a{؀rPOQrWFDPGW*S*7Ө3]?{]|#noޞ;QVa,Ȩ(.}K|ِϓQ&C{`p([=ރGr  T]ұ0 ?dO{+66D9AMI(z.Rl)(!+V>uWOtWyGh5z&4%W,-:wBo"pgSF9tRP94gZCOM24P뽦'g#g^,6q^Gbe~VMQ&,ة/F 5.2>:l_y-ݐTQ)SԤk"KR(P;PDyz1 Bkٲ.@pwooonU3{,~ɺONϾo364=axGiLZ88m\ko,)(;-&wƛSn}ﻐqad} T&)LC]m,ƙj0`qLԉ¥md sM}71@k1J6z $CZjBɣC NW9d+v0&*7S7:8^2+g{l{PEὫ iRMQ1QTVlYDf&񷗪$]ߢlN`{ Ma+"g0μAx%czD#QGJc]ǙҠ'4|jn/Tfm#ncnp4zvϖ]CVO5a[nGd+ה.ԇsO$*nJnz a o*/{o܅m1m0-{" H-79'Ќb0!{r 4e-8p5 *ODH &tSyuujaY]xo\r`h` [xRGX%[ du#4w[NP֋VMۮg!q;=E3uIRbGвE.PcrIHC]&-I!֋$ E|)y@kڞ)U@ܞ)EZpe\ڨL{ S,oB<* P vWїh nTQh8NV1hmWs Wѹj&TQjX ^L{K5zwWDCD(&dw:Q.sh]wBr$ |'ވy[aL(5,sC8^!(?'C$_S\=ȩV;&V.0׼nUՆ!^`a:/a/X0Pðd0 pXK0 T5TfQYy3][{Y9Y}{"f7'Cm%5]x]7)5a]7*=`0ww]@ww=5?N?]끄Y㋜uX̴uq:g6ϟ1' (bB,ꢦ^߉!T(F^+6ڜ6HulS7![D 6VhK)ЦKyBj}a]~Tj`'XJ&F`LĿo-r+L4O^Kr`h߽K8MsWdڲOjYOBzD[]u ^" P 1 QCd4˴ +]j iĮ$#ӺҳJNRMK:ʵjGsz>kpa4ߔKj#c.,%m"||xz[ V3, zOFdVcT+3ӉƕДmqVAUO zM>_V3d(5t u,ڮfQm֯67<\̾`眺Ci$`s -E?K;k$g9%o:;k9o:hQ= v!hӏf%*=0:r=sGzP_G7yTLya#WTIDC*d|g>Ւ;"YS|Уc.m/r-x[y^c1Uh!AI%θxYߟ3Z'f 2k7Foy7=/,ǣ.Φ|g;gyg+ {/48H#06 U!/:F8S\AU N~ADWU0eh.wG\b7辝^xRZPDV@){[ Տ ~vM C`clz!ƈ@ov\QVZ/t zErdWJ8`!lidճlYm`0 6 R[419E[(qV/ 끑@&{:Ia5I}#FwDD3ZXdU=s[;¢ `zlLI=~_~=cr7P8 &uW8YifW DtNP1u vZW'xyه!%؎{_mXq=iO .fmW,a?R` lD[^]eBs,|Ǥ=F^>+-+ͱB n cvRq'.4BC.=XS5$[ڈ{ |ݭ5(쥮{&ݠ`6BDҵX|>',,|i>'SfJJ;"ҍB"ЎFV1v%ģYw ώkAI/VMH':X N]f 0^SX Ne]k),@iL/9Y~;)Bc_N>z z쐬Y 8S8Yt+n|Ej3gg.By5C*%%ױ/VʂEzMSoځ3qB g࢓5yjLhzjZGl^saT-N۝Y|}W{_G!cW] #奸ebpuЭ] *LLNo}Y b{eF?Feo7w1;ZA _jg4VE5+%bނ 3ɗjosD)~d$7Yc䕋Y>՛&;1kdLxgZ&XJ2ϒ#ŞŎî9yRz@ d?xtkW/Q`}-䏞 rH׿˧I?^QI~53^%&Od/wPv1pi*\b Ӓ[CL8rG _KqO88o-Gso1J@8Sh0;%<&90|F&#ِ2PKi(PK y.FDangular-1.3.9/docs/components/open-sans-fontface-1.0.4/fonts/Italic/PKy.FWangular-1.3.9/docs/components/open-sans-fontface-1.0.4/fonts/Italic/OpenSans-Italic.eot̽yxU?|oU[ӝ& @$%Dv!b,(""""Vu"}aeQqљGTϹ_at^ylS;:_f6C[C,Ė6M$6 },6_ Xg n4:7 ? ?LhMз_LÇ:%Z|Ŝ7 ~{Ws,x熴-k.[]cqȌ3>Θߟ>shw2sg9+g,UƟ[Q=}ʴ+댿K6'sKV|̻E|7csODY/T0f6wʊߥz?=ySN]*oiwX/ WqCbomYl9E1j>ߴ4)K1ZZ;~v6]hdÆYnƑQ_)&ff<-hv k}άSXyK精6x>]_@S,a/ԙ1Ė,YĵG _+:?ܣ$Fhgql(vϱag3"ӑsCg̽]NfO'Ml0]dW[rFw=^yI,'wʻx峭lgd߰og|?OIG'5|USJw;ny*Jg7Od.˲MX?/(<˜XƘʏ1&ܛ238111BuLK0G1'5q1ڌiØ\jyEmyeO薡-%-^}Eg z~^ygm揚n>_e//}|)RR֥K.9/_~/.|Qʼn/F}1_n_\vq1+/rqs._hpuJ^c)~H6#2maߺ4+b☃Ń _tPLg kDzAsg:XMGШBάXV[ʺ2֍ug=XOP^z>/Z: nnbC͠@Qoa# .dΎfl Ʊl$6c l#v}{b{=dq{`*X;)v=βF v̒)˓26[e9l@^f y\BdÎ3l-Dy-y%V|,dP},ާ:|ٟc1= mQY<77 T/`$՜Wsh=IUQoQ/8&Qg%ՊbLGUɧU3&*S5&5PMyjecč1c{!'wUmkeݵ_뼾+ 9gٮEߡ#E7plņ^6}`}sx3|G1f#qw/ǺіoLWMݐ `xڱD:[Nڳ ѻ4kc}lBeRq *؝8vSNF15LMqc )eZqv#T\lg:!\Zn1:+E%ͥYRFOA$'C\ʥ.,.ŭq㋖~蹫z){2.#{=B+neԼU;>z7U{˓ր#k.7w߮{?7s;d,ϵCn՘BU2Kϕ\=Wf.r~ʕjm?O67~(V֚SߘٖlERU_^d/ʱA}B}mG?Y-*> !4Ө ev[^3̀*i6F(l=6`R+{U[[}V#-?i HhSX V*(KC>eښY>e|lLLZ gh<,?YJ,.d'(t*; <7d)2S--(|.&u1vLF% L;>w7+[Qb/2ԛ1LS 7qN l17j8{I4;PZdt >J0K26؉'m -lX?xY']a-??%?w} օb.bt2$<)$XИM; ^٩J gʗ59Τ@D x12d)(aNk:] V K7=hLX@3禪n󰆱KR ZbNLj$6ji_29<ƅJyl.Knq OXb3y1#^ΰg#; [jV4uIY?󞦿cݏb;clӇsilD=11 i0:g9' )&KAX '@#@Q ƝKAْ@BQ‰P-27?%SWu]w;=;?i݆m'?'<{fE$֯ 1%"l#̰&Tbl&@2טҨYE%f)M \9UpT:UPfls@(#>!0m'9XtE?I1Xb/X{)i @tp3]4<^ۥoH':9kH4⹩2֐,ͥ4{mLK7P5_|@R(pPo\vŹ18.+mK,qzzH~7Ҍ>/\שjפ?Վr/Kh8fg\Rt}|W]zg,p2X9ې" D36ֻ%0#X Nm i]Iq$@x]D;]]^Ye݅XTK! AF f19T΅!)(I+3N;Og}ݟ~;Oqd傉;o;ƒt@NP+ \$@P3T9 9 Sc[kP5]; U1$3yZ-#2[؀!$/j?&2'^ylщM 6^V>rɋcw}4 ÇXiٵj=ǶcgX,,vF 3mE 9g$8ĵ"N+F, aZ%k(/*P8*|95r-Y/УS8X~;r˦98PSxM_{ֲ?O~Ꮋf/h~$L ;5)>>bD]ˆRgvZAZ"$L2l+ zˌx/+ φUn88|[o&?ȏm`}V QelW""Ӊۢ"jmdMSbb` + Ҿ*n(N%O ;:".`RhZyjy?u+?y3w8^Rjl{|n=PEgZ.1/fImP\⢱jRjvcc@öZf*~w}|BbZPl aaw֭6,Q5r`bZox5 9`[v ]LBEG~wŸw=>nZ Cb[gjP+5.6YUZ^%Y1]MνɃ4gȈ%F k2f}"LFSѠ]VSSq9w5M,X}ji邷6gv%`J|RnA_A[srʴ23+: BjHq'xG}qڱ`"%8Y43N[>c;fq/r\:~{}ߍ5}Ck/߽3>\]+9{m{UL<8MߜzY4Z CO,DN 6_LXTl(=v2]i0E ˂rCE`z@]U/{͋  X|>aofc18T k&%d#(r1:TE Ն¯A( d#TґPD1YmPD CR`g淫Iө}wla]$PJó/Q:Uހqvhu4(PK *y:'x 5]ŷ+ї ˧8@!2İΙammZ% ! !74oBQU'MRجXtHJD&@,(ʒ3@&d;սof?gO? s?:"9y?ew]|Ϲ沛x wb -9Bo& +Ae̖B]-rq \J¥$9\@ǀdwg4pq18}&:;urpҺ  +wlkQǷ5Ϲty4<<:/ 6YP^|jkD{> XMOdNN0 &%V<;^~ł 5g#򼇚^9@Z H`Vh2t]2X\dtKA` q)d7dںd:?1K߷[t엾zL&!ߖ*jxWĜa,てW1.bЧN"15X? !q ?l11fd`k W:{y-xf'`Pk&޼'g5Ga&DZT21s\ l%2ĝ*k r1Y +z)'˗ ^puO=^-^8 #﹚ @AmOD@ T] g $ 0\6 ړQX'yA Ù9j{un 1cE)9cÕAo xE d(uѬ^pS8쨰@Gwۤܮ?Tssh%ԕ!J=6PiͿ|kr2j{(`hoJtw 3OƤ3up%[m 651ddࡒRL S2sNϝԻ7Lz|~R.eƧ]E-r`/ ǐn !a$ƆN'rZO~4gZ,%< :-]r6+i#OR0S>ln过>q|go+ܡ p@WąQo?0j;vFk G%PTOW/rŴFBE 1`1lZ42_+V_盷?j:ٟ__ΟRkp 8a.j Q8Lj݀_k`uJ.T@+3 ]7%3M~>X2&Iocm90MtxX(a -烠%KG=t]f+ $)Jvׄo ZEHN/ۿ;sڃG_zoþ#3 &Oo^)Mn>(5{x\ QrO턅P!=XD\m,] XhvYlͮ:[|""9Ԁ[Hv)[zt'ޭOZd"&ܗ梜CC/ڶw)~8I{wϣYgYe#yF{[n;乯s o^^rsߞV_g c, 17DkFVnBVnDkAKD8!"K QL@8CS޽\4e❇AWjisRsHF I&%DlHZ<ŔMS ᠠQIg'qa: .E{ɄQC.ɷs8c/&{TkoY!ϻ~~[>s~=vgA3bP0DjNWWV>y^wǮ:35W DxaLi8AJHs3L*h~G 5nfZX7ÊX˰`f8&Ub^8O 0ĩ3/Dj,V+@U@y,[I,/7gƗ,< Wg6_?[Xwb6p#2l3 7>/ z#i0,4~yliҳʎm2x><D0[J [5d`oj8CbPdȗ0X`ɱ89\ᙗ/_*[w =D&KΪנq%wcTi$Q=$Zg6C:nڊ@-H!g$pڱUsld\S17&̭4d^2znVg[.êX,uP$K1G)DtxT%Aˡ&E^@:w|Y²$h"2rodrnNks2j;bTM&k :`9!egﻏ#R>7 &Qlp 00:6 UJ% ͓y=7c}<~LV#Bʏp,V4AK DXJIƃʼnĀ-C1pK=Z3An7"* Rafrd_v>Omkx۔ Uޞ:z袅g:dG.v1hch F}.'!JE]"|f.XBf묜]u+.xv,c7C[Bskm. xptng8d!1:,xh%T4XX'!Z/@ ; ΀Y6(?O{4M(UvW#͉93?5O9_SKK?0% 8g6>:%?\DUhJ50 IX' 4U#ZKcj~`QSA!cmND v=_k{:q|+ yo84_^u;uڑ3?|aqElL!Op"Io 4"ZMƾV=0GBARAK\Vڛuft:)>՗)t<De3&&Rħ($8QU?CB~ϱ6}9WN=+[^eֹ=W}X8oC (,Kʡ2 Wt(\H K3Y= hKppi.,Ԃ)g7,1 rE ZrY 430x2E!+!T w`+lɧ Ss$U`h A`$Cc&Dᔩepan-&,K$<4P@<7BsIWpr"K"|z !|q_)Mܻғ_uw;yÖ1t_axy[_{{R/YvH:;ZP22>%K֎~hXi.-8`|!b%V;3irg9扵fz˫_R]|X%O!d YvQ#ZdC~P/z㱪Bے|oӣBzcb(6M:`lLu+c`)LDfp3t ːSBHi:  h J R@1u1p68c^q OCLXW2Còe|eszs^+%7KMꈹQokh4./Cfo?6omg {^@jEJrӤBG:4@͏"82 O/).+ $@H#".,qU:ԀSjWLOfDI*?@h Z };,׭9Df.voc\d E/*Z] Yёܜhb^Z9q]~o920]xny]KjV{Wy͓oZ=6z+>{H'=Ӡc22 \#\Q(!Fn2 K@J~0[=.B2DLss@xR[]<EB@A'dlQ71nrN6bPA0U7 .޾א=@%{%]um;* mPضa%-۶VĈEmU;~_?]^}dBs]|>s@0m_9ʔBg$G bƪ.6*X&Aln&4Tf!6CTR%@H >]gKF@,4tᡂUZ#PP^x`ӏhoW_mPtK6mlNX]Q̏tFҵE{u:DCbDcα5 !@;#I2EgL}NҒTމ۲NI{xWWέV/OwՕs^yiY?sq#YJZD+T1>A} N?R"ZxIܢ.E40i8WP.^v;0|ҭ{V|pI*BCft8He YUDg^ḃ8fNR6Y)C$9R U{0%Ĥ⳷5A:Rm"jKN!H4Y nauiND)&%,lDxz:*n]JdM˨Yﮕ4˫͇Gw#eû|YXg! g 1weL +^'a141c+P2B6llĕB6TxS a<wV+kڑoN Os̓m[ɕj"d7~ 61 ڼ !yWH2vڗz5L_9-RG&r$& afAqm[F3?꺬%dpE@> x dftw; ,*K^gMQ"ˑ/ L^sw㖩i1H<X5O#'N {/qoxn*eֲN>雷mja Hl4\ #5HQs" G%7d87 xlV Z@A?Je~ׯ27#9pޯ(T#;.=tDb ,-eArQ%){-V#\Y2PdS9 s46Woɨ)EkCӶ\3𦱝JJMNM]g^OٺI̛M) 9@Lrn\!VHaؽr=W-~-7v*7++R2`b; n }lK)O>ٓJyHXqI7 `)D'DpyJLAрQ4 Ň0bhf8N=.?$5YUI%ʂr 3 gʟX'tH(BІ05 D%9- w͔p#Xyd03bG`Հ?&OK=A$?:{yUyܽ Տvɻ{4Y^F±[ˠfGmf ooz GE=rU^d%^o23;h`hJ!oZ!i06ٴ6hFD`:@W:R w"ŗ%hJ$Pƶ 8=A|iJ#j B(4K}͔ħ{R-å[ ~OSF/L'UC9SـȢ! Lʎ+JC4#uhwZV.P'\uى>nőRNo"F`J]A~d̼> BϵR|Okg.Z4}׎][tyUھ}{nYcGJZ;vmBN^Ùۨag^4> $!E%Zfhʠ ݵ^1Q# ]GZyd2%\ \g& ]d%î#0nU`p(BT2dn9nH.x'K2dlPc8% &TQ6gO/hw˒pBr=~6|۵/ X )C `gn̓W*[ 9RWT Xy ʄruNhl ]a{n QKGNN%8uB.xk4:P]'Qܣ}u@0Q)`8oZ5GB> F Bw}dglZw.޵l!wLj/kG.ޕ?N# znk]~u6bʑ{R?"M㺥F·L>'b,?U4B  pl:Nx6$}:Z0{nZx3] 7q7y6E<t͋jJFusc}X(v)^\I-%Q4j,kPU<89喺5 +LWI fw`ZAڻNZ,QЭf`ՄvȾw+FԎ"M4%l~O|5>yW?ʬO' Os_^kY#ku爵'5Q~돿.SO7O+O⑼UihcW5KY;P AN|P ,[QZәo;C!kzr2b;E3"*o q# VYjc!Oڼ;^rw.z09|Kc8Flӡ>Xu(+WPD3V/r*d7MkORo@P[@7g5;Ů+ty) {fw&x%c VVLMbL("ƁZߢnqvʬP62CF-;-ڲen W_Eml4X 2r-k@J`H HXD-2,D(s 0B;:s tm SɣV܀dLq˻սfܚY7'Kg9mc/8`헣̏SCz GC=rJ3!é&EĠhI-|~'1,[6è:= $9wiSk#:rE&N_K>w =uFZX;G ѳK׌~wIJC" blHH̙^Ds;0YT3jbBpHޮ_Mǩ=%#d6lB)H].a J+C.h^\e޿H9P::Jiqug~AbL )Vr W1a\oO?,T69 '*0¹GSf,tIDj2Ma~eͅVEx˚h U B@r4s^9C yC%~ E;+V5Df/`z j(rH`z> q/#?C#?:su( u#I7CX'JOZpe꠾+*ΆdIBmTB4Q(-Tr2ӬT܂[:qB`=qbh{;CG}y^AʜUlxϷA߰P{q(aE\;&ZwM'  灥AHҜ&TDKA<̆(4oٙ E+L]caGe@iFn ($AQcS&v:JBn eh0&)D|tީKhnX8ĥg,U265/~umiۏ?77_S\y3~9-0iF3>w0ѫzYrѸ[st߿ ;WJgxtЁ@AԜ#HAE~cR ett.C'Š!ju P+OaC? "f#%qCœ9yc_} SXBŶ:<]f2vP%Pa[[s#iܦ}Z;JZnmf)>Չ'Ys"EZ{#|1b/#{!nMP&*K9@ 81Rb:z5G-EĚq>uqnceXjt2@,ר'`Op9 4&9Ӛ[,3'xHojjK9URP(4Q{^cަ}vI6{9s[soG˽۴/kv>X[9[*@)ۧ\?D#QVHt9>dp1#&0XӸTF"IJI.]X7qzI0`@}XS(?#(wO1J< Qd7O=[d7S=JFnhG3C!ȃ,2`Ϫ}RG?6s߾jNkn<6{ka,,g1 Kmg !BZ({0TS^ y2WH[iV@ ^'ģ rH԰Nk7- ƌ$ }d LB2I(u["K X$+v?dg wR-P)ÎAEj%]q6N}xE;QwA8v2@׍ۊdЀؽ_TВ#O]N>(l/D.hۃ)/th3"L[ȺU x}Rh~Վu;צxlvF<"HwBb/E8%í%_ˉN aAQ4-$ǒ$#q@G KR?-P#~Nz, I?FtU8U# JĆbF? frNs8ff}4lh_ۿGMs8wlvsvh; 'E7`/Z_nO"#@wOBTH\eƅbU՗yړ岌00P">˰Ad95w"/AZj= '#.zOZ֓h Td*¬CIiT8$] 2,'ݵ&YJNhDAK%s}RQvjKkrc\}~NNCRtÇ<>sQucVm:>疏y:MzZz)8rS~iE7왹)yc=\CAcVqs^s^պnwmڗ_kZ;I9Iq 3̇}[;c/XÿQZ_ ;nґAZ''ֻXuul#}XW9 D,xxeӍH0l=>舿gF#,H1bAa!zz)aBbь_49"G"tDR[rRў+,U\?)\יX6D*aYQM$0$skj{_'G'ئ6Srծ\5m6gTVS)Ga+`nv=I.57Ū<(xiF+ՐֈBmZ|+юH +C t$H0;lN_oO_6hG_/j>_>f ߂6>ai^4yGsovxjJS6?/MtH%"JTN'/Ve[Ap8aG@`6Ao &NjP]; 8d88\F(p\G"|RZ$r$-KzI"E'`O7G:Nݭ&w% g|b&icGO]{+FK_]~x@zlGQ<O]xlz?m+? Px>JCD{>l#'Ͽ <3sx7dP#S,;o /kl>1W">_̗|3żݩ^}mf״X?/2~C,"=F W:PYo"ڊU4ܚb-8 C{y8PG]&jt<_:2`ߊ靍!/;aZz!gYY |!:?C?AҋGlF-9??Z[I} Dľf>lmُvԢ}юBx~%!?>6Bd>cƶC2%RRmz2MZ;YGPlg-fJTQN4 l{h(F,׍9ơ#T@D{ޝr_>ϵ#=Js4yT\8'!FhMDb%WS#g>2{NKLd{$$!ЋХ&" Bdg&1!_.kyLp3ss==9)yyP2%vNh䣅tQщlj[$b&-xPwe:)D"!F Dk~ԭ&?Vӽq,G]rQ%ܿr_%6j7yrKr_F}!tS}WIכ~Ic2E^0EB1ږUxN.|OjD<*TXh din"z;د$Ǭ zSJ{Jsp>{q H9Mkz\Nc'堮"JCuvW%i\%k>eڙϫz(aCVMab/ <.}Zrր2ZTlJ+4྘ݵ6y0fH1mҍRN0b "l|(0K͒e5ި;T}O;T'<}EK2Y %`#?l8[2_kܖ롋saMe?o&χy/nM^.xάY1CdFU̩#5%8Z73,(}s"ܚQ5ї@GO"3  Ԍ&Ri au6ݸ3aG'S>f0-2LUNS^xQώP1uKmLD} `*f[]s !Mp>XSx%ʭ;EfIE `T Rl_`[z!η#@ DpWT#+lNÂRo:PB!ALH2@K@cS;CED= #Nlo#ҫv5h~d^禨s[۴;\{=:!bYwhoYՑ.=_=Z^Q׏GM6nQmjԽ1!f2QYJ H/vH28qE7?"_f`#0Hq@OEoGC,\qh0B?<: SlT=-AAsgzϿ*oz|>|N|~xcCydFkŸ]&ʽ ˞.FxA@: G &Vy[#%:Q@"IwBƃéC)t>S' .`-}(\I"~:SrY-u[u]T뺖J էR+R~x8:\Br&GVt's5DR0٤*ڵ$譊յcpox2J~Y$p]X>dDC (tcƤG#Eش ")<J%A[F9 J93ϟ*j.` PȐՔ'+IPIĄH!rz TX:y-V9gyp|w#~B9ǸN<>6^yԌTbqӧx&Oe?Dv.;NdxP̒nK)O#$^ #j=w"d^Z_qv.YB@r+F!a.t3d,i:^}͉+R?kz\0O/>jk-ϗ`xɴC x ``[d.hx ˗$0MW gx 3@cY](yu{qcp8 FեVhm¡ɸP87F*/S_m}g+'N?5HnU[3p8+R+uل}sWirQ.Tg rs-̺tizS"0^\4dt qDx07DKM5z4OziޯɡDz#mFNbr)TNG(CD IL3=Cȝ]J1&c)ꈣym H0MEN; :,/X:CE1Dϸ[=zgO 2 NXp’[ -QXؽ_=b(@rZ;dI[wLy WO' t.Pcoj E+]}h@h -OA(OXۡ++X{@%z?$X=Y@7_@hBϘSkN˗.-/_6kqn>y'|?f7i‰̛\PRR9{=1`0֟}-Q'@b b?λc,_|.$ɷB|.'!mqEy׷{8E{88B΅|='UIP-?s^O *ayNb3~FE MWV9Ym~,5r`uefbsuk_Ƹvӊ'TeM~O\M72\y ̀"ߙ ,wG`2A-m!VE-9L٥q7ug'XdTh]zV3QII2\cIx3)d[b0Q)S"2eEJSBKs3R>xYgU]wdcW΂rh`,C}0CU%7;8`U MU#>DN0,︓B]6HRpuτ)Kv.?}2Rh7.샴r |AïЅyHLFo\؈wM@6T< 1/d|8u<@Å_J9zqh1xZ"8b03GKKWE_ÂW<1b=h0`+*0GfZ 3O=t\X۫4/3K"џ@`5!_W_~a"ptJ=M8=QAab"[*ӝЍGuw8w.d f:55U-/Ź̦ Zcf WG 뵆eAThc=*"[f`4ؘtIbH1?%r=jʹ!j`r[a;=1 ]H8}YJx*ʇ)J=-xv!D(4䥵uԀ<)%0^FX qXE(g)Hb&Ԡ8lDx" c-S..8_rQSM%t$Ȕ5XGR^פQn 'BK٭㦍edI1~eN1Iܜx_s/|}ѭuߛ+>۔"Ukϩ]mG w-Mo9SW'ja$QӀۆ8I(ҀP`W㩺%-/}Y/$Ɉ`d,)qȟI[V n t^HZMmg&eAG/d-#&TvnDˈSr6jn58Ⱋ@ko)N㮼uH [q*|/BEc!շP_Z cTJ8󹖄 fѽ{Ӧ4gXumK\#W#d0n>n6R"9IDnj}ȓ Ku~C=%RgÂ;5~%Dd FdӴ=>jLj; vN}~I;r[[t:M{W$%#\!1Qk+Ee%)X5me JTAڀR~dkkK Gޖ7 {'PF]£@oCog&ق&zlAIqjXhG y0ʝikG1@ 4YӨ'顐j2 :"?Mҥ``"XISκ)%#7-yky߰}!'2~ˆ'.-{[.xo>e3U۾jH߼,`Gx3nє$ RWlf(1XeMNޜ@1"60[r&xhbQMmV (! "naQ/{]f톣wފu}ӎ/hx$gcU.OӶ==Ԅ'aţq&l2hu|\}甑nyj!0?Lw"VvMt >?f6qCT)?K@@dNZE8pIʎx/`Yc*wN6=gpeUoDYXGԋYK>av Ve Ax bIFԂGnh vsT$%):ʐG5#Op }\S6sL$F MeaD+ bYf4#u~iG!A$G8*XD^d[BSvGɑRX`MKUʏ [G||/ ny+۰&”9"Q[C}oEE+ɟ (n6WvtZ_r!Iꢿxms``(.CCغa˃';x. [<8N3C*\s03q#W\'Քtth4W."Ә00e920~fcJ|]VtCm!o Q?M>vP"8U!wgZ6.hp$3A+(֘EPN't|<(wN15,m:G UMvwc4zٔct%H]X0=$bR,-4~bgoG||Ƿww{qRoZ3>t{Wxӄ㳇 \eMk&,jL7U}»knYP6+:ܾ`=fbṍ` ^3[,1B><7{ $Ăʣh $d/GHQ %{\&wGcL !8f4}O{vp\牥rd`g l+K4L 8BH&z{hpAPXw4%% 5kr8{g;T|GC~sl5ωAMԍuKF޺gms|4t MK?R*W6+M Jv{,RrZumQ Bf1o$*!XW^<O<1a;f </??FAXg.hǿ@mr"6dk^;. igDuݗ&DZ;3 GY6,ڹ`\ʔkU%]iVW)9Fw~:"%m`\UdnK@H+V>??-P3oMhX^|+FԮq}hN'&j{AToaw>/bHu` be&N8*4saFN=U1 TL%B-kjasYWҴ&#Mgtθ|gb AB0}A"]~>qZl8-9{EϦjjh' Xd󹣉R{mW `'60C hY;C3#|¶4`Km6u=&9tk*AUk#!H4I/~ KE6{F/>U&v.hOsl[[nmK\3bYܢ+_;-wݻG,lY²mT oj-24*<ӹ8) 9Dukl.Ĥ> <cX"|MnCKz43uF Rt(d `^ IH)E1tsZb T=Bں); Bٰ}9n桙1w-rj7_RM=]EWD⊪[Ob#\bitQ-2۞'Eٛ&1QPwק guK[oԄxi]C 2 KOYTe?NJ = +A\4‚ yWz46.M{hjNGqɾ%XO֯,8#Ú?U8lkZSPWt9k; XCDŽ7CCB:bb  `"=9ڭmlwZ&6y~s'5ײ>!>ŜLL^y\DQjE GcV"T"K+W%"=xbBg(^4M:au+f_g9{.:d[2b0gڣG7բ3gmj5눑k^F!/ǜz??1 iĺUIS6D!BĊ | @k~ܑbXt4a56K)tõc23{;K=~8)Qih+DJExKYtοuFYnճ TqW]9T߲C,\1)-[ԇ?dLP?UDs `$0/Y |pTB>x pZ1JK6I&8XLZ Hf#|=T'ټ=&7lx$P7pݔf;{L5V_fo0[®gfk"Ƕ3ЧPXRɑW+Ԯ1~b޴S,XaVeNVugZ7F'.G>4%5#my]y9w1aVlVty0̋/ DPh"Ae@p%<5^Ӷ!2:asK~ B '#2X -$`ZBBi8f0o^?(a&#)boՍzIغkއ#ā;JƖA֘Ky!4u }4@6|_ B T׿It?h1;H|4رH{ Dbd#<5f3L=  ƏV &̌amŴeEmLr (AxFOIF^t4nUʌa u7SϪcKd?XMubv EvbB@ôuK] FG(+ +*"hJ #޼/1^#0x&xrmdii,y'1e\V5Mbu@|Q۪v i\?NP{OѴaHeP/ً tn'~׍ ^Y\zI'5I$^:x铖2zoA.b/lk ;x,8D[h$}u%A2,e  3 aQ0h80a`0[I4{U"B`2R@Un{FLVMY~LT>|桖JN92@i)-m[2n| >]|,D 6Lo4w5dF+Pbw SͰqXp d!EUgt7%"|)u4X ӧYZɤ BdϩϽ38tbwΜzhKn5릚3˗,]O39j֭<'ƣc}|` yiB#rS.i0 هe+ř&57e%8yc\p1 ,ujcVAh-GhCW) Kiz%I\xI^AՖ (;-O:tS4K_ [ܙɏ {zJސP2a!إ~bldnSd*;eQԉ(J>Q_}׏j X{}~w+Tf 'z 8u0V't:s)52X]XAˆ% `4`*s#?'"V,`r3K Ã^.装 ny\=[u%vnu׏dM :޲(G/Jq?_~w9R]c J|nsx_ܺA"cϰ\oNR ~FJRD/}X}Ekͷi"&&kO4w >F=v:zqlu[)h{Eʀc!j<sO;gaP rݓ:&Mz }}%~%WJp֪_+Y5=@"tohV}.&0({EOߏ)1 =s Whčϕ\ ;5I@}AGV~Vߺ_ k*i#ܡ;Y76xٻy;#[2ҍۀ il.+٦,@cn-p}D86]\E]6&]^@6T|G~> ȫS܊V6_8}[-6>awGOxxFo2%-X E^Fƒf⸪B7L0\iAOXQToAc]@kktb˗yc3՟`nqi?\'~5zԘ1_%N|$ٮ>c&>zF}mߗ/yݪ%˦-$=X;0ෲxcRbބD&j1/2M`8\T6jz D*J& C09it="bVftϫ_̙47ޯlYQq}bgeѵv{{gS_17*T'34NT^+%P1]J :y("t;~6 "0G*EO; ^B!nؾfZC+= ݵwc3zԨ\18䦜Akۧ{c{;lAz_`jK[ UdpLt6aT!Vj" f04`uĦSLvbUPlp;UޱXT$֕+/;SW;"}yʦ&e݆yӲy+gf{77i4ITzE5t5U/o~#yn&7ϲ0Ѭ |9xy~%n (ܨ jwh/mDbfE|}>5틚PhTU.r_w۾zj!P 4bP:" `2BIQ:~8}O rnFXGx4{(X+t;>A@3JEv. !,5ntww]֞ʺy[G.XS23Bynts! #ue>^Aڸ$5}yHaK<ڂ|yy>-@!CωL|B&ЉPv02`QrqXZR~Sqa!uWNZKqP}vi-㕚cTkJ1sי%%Z\Ja *Q}Ŷ%,GH;vdʘ\z+NuAC‘·yG5)'}U3IqvzW30@|B|vC0 OxOMD{Ǝ=o4[OM4K^oZKzG{[)'wƥ W7oQ8 " C%sa9%bP"4/1ց o1 s2,t6:_cx&N抎2pkhO''[tLe?$b);3>Tuij"\쬕ĩD'M/櫗Q_;E/۞ җ5wuuM(=xF&8qQ+'- @&m'8od?d?_c=tZ2+dǴjJ"`}+B>hE(,LФ5P=cq5WI"C*01GrCz4 5\%9E,ق4l󣶶>n?8hU[-<.üexҰa fY+| 'Dkq4vW3B/FB!Sղ4I?is 8ix䳶yI@iJ(vY XT^CA s<o<˃4VrEIԞe]ԯmE+է ndz ^k: }cGTyN.\z#qHI땎xV'`3Ҋz9l;kRz6, >*UH;60IYtvOE0QIKO߯b>LdeR=ҽw'zbБTS F?9~ݡA#OWs9ʁ!SK,xZ2d|vaw}x򉳕W-{$?u ˯P輝ItYtTTh0{WY"^nYPF L̦% h}\f0ecagaaΤ㸻 ct-؄,sPA~&@yt"ÍY8:gݾOuTM1%g/, 4lݕ4 &lef*ns7z.#h@y:p(?+n锕>i)V-!Hݠ6d?؀ А3=3|[g5c^,6hsQE,l^[WΫ&@¢A[m ቦٰF'-q$8 'dKF&Ia kJS*Wd4V59fg0Yktǒ#9g>^ l5Ngdű^C" k0DŽ5(iz= d>pP".2YvǸ1X$8/ cp b#@?FDDTowp(CLML&+Tj-/;?^=^3b3sRdLLh-I춛s02Ek 7B-%%l$)OR&.TsLkgQ_' B, #FQT'@5!9X;{<53f޳qƼYQ8)-ճ_7鎅SG:蘆yl}t(M)S"ء(ASBP!KQ v.$j)[4*AG" E[~,9#g߼p IjRx{x][m pt{U}[ꩃ Xݮ~o|0 4]V my3OXS,t9a =%Qkb3o 5z 6|9Ps&h(/~A|zOjVo!ŽTnجR^QO#hmvH!X=0)y IqH(x"q0JNU#(7eX5ҝBO \D'd:9  5Z&W40iIꑱ)9Z{Ss0ژ=Ծb&v&5Qh+"e2;ۯ(wT|EGN\r>ݓ~td^)qU?';`qK2ZL:ū0kb$ ԵŚoo"Bƌ֔}AG5)kƒhT2\23]7v'1`& c[:zqlD>Ψ䔶qNPvIv<l6[b∴ǝfOfxHi&[Fn"YIfu\'2D͚НX6}ݺӮֹsU)NʑW2ʧG;7czWSҳ5ϓ wouazw {v|O$LBIewӓA|BتoKD|B>׼FAfG&PP|WvLb@3(Q ւ#$bWz!x-&GJ 3(1=9sLZ)\S/pˢK^kxVXFo8^'?]1JQ:@4 /T32Ed sPC݇rO".zh DNs|nH<A2XiW ȟ4li&jPw T;ENȋOcFǃ8JAxzb{'ceZ3mk}L/lТ3g^N%]>m N8^Oi}#!Fe]_P6wQYO16r2oRŎ(5#7-n!KJwZUs 73 O NW*6+'8I^W*ˋӞpC-_Ey>Rx8NbtFkOSccVdMfL^_H@MČOsHJR/޴j3uEw1sك\>1}Uƨ>fPJfESFq2.=}ugqGԽCZ D/юN=RVׅ;Cs VX[/2קht Ƞ%,[Gl lxDx%Dw%V} 폟;h3}Ih=utlmROVCW>]rshۣ)Z6/ih4J "@i]IweDdDt/>,#D3Ǒˆ-eDvph Z">j75}>Ov0ݿduM}[xn-t&nsw^\Ɇq_|pŠ&ʈ 4Ѓ?=&`]a v $QC8i$^kS} Piz'!`eJ7@% #7Y(uW-5 B°c袆ET㌟kumc\[ye<񕈎1%qjߤm9q&cO EVfh qx8TVҨ [lnWKo<E:ߍ@Ƒ>^zS~$.9Y?e#` ;8C.VI[|LGo 7V1:d0K'hh H&DBP~Z4M1 ZUA/=M}X0QM3 gP5 hNnUA{ B3@H 0,m{Xf(,zV$/V&؟5-fW_SՅ bv"\(C<ʝ%l׎nZ+ 1v@x^݊(/wdH{밾^|o?ZגD:|Fx v:B ߮q:G*쭓O -oxQre2@t!蟲Tc݂iŸ zJ78a݉{.EZl]. 1FGxbg4'󄩣0W,'% klCQa PXo99z`7 )#%N7SgF %i͘q,iHO t j*#(]soIRN[Vb ?վvgMo)|WXԈn2o6lP]曷Pę[z(O0&=iëSƃq̜ Hh󍳠ug0zQGaؔ!&lrljJG>%4y6PN˅ˊX@ ̄55(!^H!TwH]r"FOq 7D9sZQ6cz0yjyȖo:}zN>]4>UdiYO$yI f ӸbAtFS0Pk<(TM~%͇j OקcFGzь;xhef AQ0tRFD-'g d7{*rXA5[aozX2jfEwVWuG6N Awe$aLKց&I؍# VS 8JQRYav'+Hz@ f)90P%k"8b*O.uC':E>q!,9}cgʴ&хg9i}(yXGT_ =5d^{P;{zBCX˻"|35Tw@:7w{LD ʑ ݮӡ39(cup}ZG(]w,[+1_`T^e``y:91N+fV9Go >z*kp]#.#.y[[P=ng3͌9{Wm ]UǷSǐƍ\1/(wVԣhܯk:l 0 WsHWwPC>&@ OquÐ7!QARLä{TbN^XVm~}>m&4OI(tF yotb{)vol#kdawg z)=A~ w/${[YZӄKN/ʈMsܤ+FOxe]=N'>thʊ" oPuiiU%4syרoOtOk9`ŹZtl! #pSv1Æ{g="d~!4N#' 8IWb*8u3QD\kO2|id,!"Jډ^H8PܦD"Ok}CEk9,M%l xNi7￑Y Ä d[-?you+*:rҔ(V>%v>'_8yJ='O?^CBw\\I‘n\+g&9ѿM`è$y6hۋT3i!E  hH;Y; K8qYRһ ,sb-%VuXg.[s-O;cgWwyw țIx)}$e%^64`Ծ7O6#+]NϐgY1탖MjY|SGIӡ'ʍ̵@ %]7wc\׍7b%s nyO;6֚rQ+ׁ!Ѣ 69 &~%9u Y|2y°x:g:\d`s%U"zkT&͚׭D9~w*u(9J7b˥;vSJrfӦ4}'=%e#r:>{/Z Lu{iHqrG+ o~f UXoHÑN%=vXjqMH @70c%Xyyg_EٸuuWﭻS–<8``[ Im^N֡[~[ժᅯܭSlq Ȉ .L\ꝚS_w̥w{YA8rBZNboODQ^}¾A b+f];C81sƫ6d{oIMu7 v9REJe})P}:vtof*@>{Ui.w) Gw^dk]\if>Rܫ7e.]{Ӛsd/C sIU`7] Mtb͓B2qvob:&gär7t$7`e%6#hoRQ"tOaa*$*<ȚAIZA_[sZyϭ<<[+NK_nׁa&6|fqeqŶΈ}Fxu_%udA;LNonцI1hfHoXotO(ڐuj=EW w䙿/ G+)t'Dd:G7P*U)TJ0TA ˉ3{ۼAtǜ6y=Г-yzP$`JAw:wҀhC=f6oy=uM⡯§mǰʙ\ͺsƲ˦>rǺhۦd5X=yO>(Kf͘;&βlyqٓffwL=+ƸӢ7vZ~͊":s~vwvxyB|Wqb;F'bRw.^{P?V|r=tNѮֆ];CGo  ﻶkCGݛGY]}gKf&L}!! I!bؗDveFĈD"RĘHg&RZKXk 93 kd杛7={=9ϑ×AÇBxI?œ'xpYb2#P|<`_ag cB_ġ=FC_uƯ:-Xu K6Xmrȶ-qBԸc ŤQ&FQI. >xv q a+{ܰYoG!)DILX^Ҍz.5\K9 >ח5g>]@?`{2.NYb/x@puWt~CXp8uۯb ! utt[ȻEo_6{܆G#>x=S!~*]arg_dEqj|"FH>l[٦f-+&]WT^w^/kDoԡcd Xr!sqRDN{jBW=`Hz y",Q(5*=2=Gb℮Vk#]?X697Oz+OXfY5yR_NvN2μq<}ݿ{ bkQIQ0ٛ\ږ$/uJ[`a9-/cbUV! *T8%֧VU.KFkSJ=ީv j:t`4f{ESοz/ sfM*,-nu 3xw1rm&u_lv<zs1,eG3-9u.βjz;בG!SQ^o\*v &@LG9X@-S~J,P+!of%O :Vp Q=}(O/  x, 9h} $%D qnUdO(Bw9yXϬt ]MSw5piLk5TuiS{DՁGr+wBr }|l?84!Ovوf3w\ .~!?iE <B$SJfR*uvΗN31B"wЕOX<)VTg3y"8K-HZ~y)qb7L^)/` s0#-"vL *Z "38LR,s:wV(pY o|C&EwTj;vҠ\+t*TKJzvfB[Iޔ˽+V2kQ3 2LO7ܵҕ%N yr|f;LYyMEXa< 9Id;D3'w,Hhn nS.Cӿ͢ٳW ~>l:&~Kٝ䥣'yu̵1eov R/y:~|=6[6 VV:=p.`Mt${l pWELJ6~M`ж 0WXAKHl% 0̱oؖߔ+ӵ]/Z]7nx8ڎslY^Sc0oM3՛N+%PkŠ!"f LF% ѕsb,nM`%VF8_2ww$0We-J@+ ʭV܆цԀ xZJ\{ȶk>vpO.{2xbJzp "C!PT"IE.6:#0ݡuq ` w@ G߽OLDv8ȰǴD(ECx}o懗XN;`'pC￉CZh2VڠKl[d+iX#.}U@mϹ5(,~ 2g4UU;AcтlWA [5[.UdMXxitybHvhuuu͸ſL]zaC>J}H?(,hP0pcKtR4mALҾ6qn#ھ&Z$8CW2H"8UĹ\D lJ=1KzoDOzټ)2 WNK<#¼Nn!S=?Jge*h>F'zO.[p<:ְhŲMwI gHs7,ޚ0cFI,2Yי3Pv'{*BfI (ï,Oji7t O\ڟE[) Tzc$ׄҎ`2O}̜It"L 0p|(DIڰEK i,OEATj3XvdzԵ?5hrAľo9tc#='%J"}qwLNN(ƒ ;0r8t& DZ0,w{"Qy7+H2Tp`9$΅Z]d_hkQߓ7e)-v G6.SP=a6nR ۫>#\k!E,"AУJ']I,h) F{E9Ͽ˨7OĩB <*/ٶ^UDj _Qh*BR^%q#P=A5=yH2IOG.a0  V3VL8 #"VbZ8 a f<vP4h_2@L(?C,zr׆8Fed =Xe{0W̷AfF:1f];_ B5:&y5B:S զA%#u*ĸG) yy(Q5 HXёPWG~z8',p::krlfE>E tv4OplYG#P\H}w'Ȭفq%V ,zCib;YWkFXTqբz?ҧ򖨝Y|45Q!+Cy=\WtC_EH0%. _0hA 'ӶgyC(Hiב R 6? RKNf5dB+XifbB}g d4,Pp<΀3K$ J{Pl 1k(ig /cŤ_Y3|qKŠKZZH{M[K )&[2WXGIap8  $~(0ϊ +C!^PYcq}NAEm(zB<5 _zUBD&He:9TDqN)O؜ߜ#ÿ׋ɇ0j8xA{X}ݿk+ȥ*Z6J,<|{ؽS /pIJp5w6Cx}G8>yB8͒y1 E MVقu x*@%)5Gw8/~0nڻתםZ#^ TyPX"8CT/FR_~HAV%hD zl8ezxUlk !%<ľue?hӒA ;@Ţ NhW>`\;Q}e$} (bfV;]7jƄ$TQѢCTM;L2lkLp4MpJe"dPun;@<{$V!Џ^XG%k$q|pIgoJ&O`X!-z'^BZ N!ER,>0ZjHH&ҫa?v&Q1HrǸ|&;vyt1 D} 7oc[CED)LڟiO,edJ1_S\0Ac]! 0I+@!mT-'S! , 2čF@thNO:$ E!EN.D%xᵓىDe=xJ`\'g"6 ԍ1VJ̋D0 Ig\qג,1XV N|Y7^3e}߻h|q}5O[4|ZIyjy?sep/chp*8Q~A j}+ K Di:`vC{fSxpF/qA8X9ePYD5gTz)s=o 7gq^Rp} Ϫ$pVoNlI]]6Qs' ;{vtr')ĘYdPA׵ŗPIS{.솹ݍ2^AQ PWz(ƷDħg3&>ɥ6C-% ( 2h9 )3m?wO! 2L|fºuyE}r)G~1y Q'KkX{6ܽ]gڨWE&|%xP>* NpL5qZ.&8')Z6i%; +Mzi' ߄c!gE}c8W&0C XwS9_oӢQzq?0xOc@?*rYEXшY^(qNo(M: [%J}?a?jP8WОbo~3T/ߧP6ENOQ衾* Nw]dA:zk'4H'$ C寢Շא]E$fuVc\S"w\ $c>weaY(5ÅyR@_r%b遃js%R-e~%PA\56Su W\$Pu}yzZG8[vJa"'Eaײۛ3Hgx|ɊڵkGjwtIύk.wV4RȒSjvmr*=Fչ/޵Tu`x|(TK0Qh 7 ~( H??k#K ~TC^Oew$y7OLPtLa I5Q+&$ j"L;Bt+@Wx?mr앿E{A,&|m<ÙũY TYVY#;p^TeD8&-y"&VqUdkԴ S6cO.ڮSg1r+[мU) taa3M`]tEFms0ѰAMy@9/SQ}dl{i9j2Rq5vL)D,jZrkC({գ!A(I6i!ypI,@g9rmA:^T[kid_SO;+ájr\խLPbc\X; b:Fx{{=-󿥖k; ҏJqȾ|yax]߾y^TDwMD5~UU6C xO*sVNZ*=P\uQfEtl l@:X((]"9<")[bZ!U^} ̖(tCAx'CQ{t)CJ3J]ʵ1P.8SʶmWydм};;c0sǠ5-Aqxlcq,ğocg!bʡ,~ܱD5v8|8"aiy'/"q 9zI }ᔏ$4 5*%C>bwl=ImAR r?6ٕxeV&y?s'\M߻wCwul0ʏfnx]jd ^ЫD,|C0t*d;Z٢̈́`}6H0Ǭ^D]S=vRȓ7,(.s6O歿*o:([o̊ 6sj`}1_]=Qe>cƠ-vJ/ zP'JH8d~{ #"й 0!DK*f<}%o `@Pء>LxrfH^5ކC-tB ^M"Z$[I80:BFDF:Or/E-YиTd*lXӿ6/ϏU[paL6vbvT²H^pt'~犙oi+}z 7ĸ/Ɖf5i'u\ۈ do @Ft8 `q4@a iza@+0"c[WTJaؼU7Lݵ3 5,qb** 75qrc=WdQr6jC [ER"E￵ܔ6;ѸJZ̷O6i>Ym=T;f'|y`XغK9A r2"nGQO>ֆ2#e B."Hx%Ċ[&Nwq̡(VVDbF ,"Dm9.o %B4$ނp)uߘ%0U!.K"EYא?,ks,G۶w>.[]# zW݂״ SK7pqQowf}LVՓ("}*ӵ/HTe\Nz%A9 7EwIe(G.dU²ҹ`QI'䒸0׈L,?E@Q[ @jH+F4TP&A *$-" 0 %! yKH!ijv Nc]5!I t QM*DX A_z9P9Ӝ77 鬖vT-`Ӄ o~l.KtM& |&yÚ-կ<(]˝Z p?j91q'xԾL5e?JZq1'8h*ޝLTջHѯ(\T8PBOr00_C=cGN>LPixHrĺ@J])@ sQYu6zrϽN}sj·pqD D?7<.t)N3PLgg'kduxeVw-1~%~H;+`}i %<ƩHd(ɥĎX:#s6sA% *A(BT$LR7r3xsj1Zޯ?uxy_By5`P ?M>OvZY# 0D3z@}@L+9=Qsi+=`ӁE7u @Y`$捡O\T\sBJ3 Ї׵-Y7Zz^{I;]O"\ `^^(FyCF!(!E CBX Wb,R4WED#v(y.GEwT`p"K>kS&SxRG}w?/ U5 s%.`GՠT.p H'RqHo Sԡ6&(L]cvqhA3&A#{j'A]oZ{*[v,BXD~ JY\)dkH@w7 8[:| |50ί]38^;V@6)+yS~8na=:^U(*t#6RIY?>IPWb[YKE1"Exv?kj8 >Sam-nX/W=1^Q,&*E;.s"3[Q2( .@2Y_=nV˖0K6i,#e_䬾Xsi&ℏWMt!DL@Oe0IѳRsEꤪaMC'e 8frr UZm̼Y<~ro:윩.6A[\ laQVڸhܥMW9[V>g(yQGu$82\ԾhS^'WGf W%\OgY?OZp t%K*9(C k0! \2't:/ C+9%m7 XJzdf3OE6Y5,2V2RJ#5䬠{ ķtIl ,,Wc[nԌM7l޶sEm7G=(gSQ#GgZU>gOkFz1+4ЕdюZHUH7BȖO/2/0KCEapxݔkDYI*%Oqr8pF^bSo\tk7떦W4L{b=ڽ9;ťGV/D?VRH㋹ke>'9ʗ<\4 k(cћ`{/neH{l=ty<3k C>ioz+ʬf9?G߳>ʿX.~QЗ/ X.׹eitHuXb6~^ٞA!I^PhŐ$eu}ׄ*qb|9Mϣ c~ldܩcC 3ʍr@L=N`SSFB^Bɶ50.Th~0;<> w:LՎ;[:2 h3BO&FZ=#=_>Þ) @V@D-nK(Eo良E.{%b#z坠2Hrqi"E4q$G07>%O2 2 GHR aȟ7*ksS[m "(.<,"ELƊUA8ZS"{A2rzRlL^2gmUϺҘhVKA.{-s.B \) #mTK.gϋO6B S'N aܬwQ2G3:ZmSN9tO o˶]II ׉^;^Kn|zӌ9wADŽm])ϋEƓnE!RJ LJzZ$bO"B(k/49*d\VTM=Nu@OҀ q2b.K Bfy)1(;-ѐ -݅C>UR'+'1D8όcgIGƍ6f;&*1aL2'83q3C6l&l5vިyJhROdArqGDAXo&W# `tΣX(__D&,kh2 n)L ؓ=ćJ)P2~ )g|o~Ʊ(Ý)Ωs}7ٷWFљE^nuf 'maHq0)NcŠTRN-%*{ SDJt"u!@ bwj+y0({:gdXe׳uG~L5n|l[,wmjI~AM!Ƒ̇uA@0tå'w<vl@W';=`&+;)T|OL!IsAܤ08"f?GB⊢= s,Y`ƅiZ"wE~晋ҧ4)xۼI9X)eY$lݵjCи=֝//…+8BkPt0~67T9K?M6b@P包'3D?G_h=JQH)_!NXP+Т8q70g:3w%=̓&^0:mv۟v.ͽ~,Y7xu/ iM^׼q-T]«~dqSKt-Yݶه6i3$EaoqU@$P‡092XB j&E?GMDVceJ_0X_%ÕȬ 3ƦYP`D2l+ ^)뛾] 5=1gTQ8LzQg%91s]n%K) ɐ8?e)HλXPaD V{NL*!;1f#j.wQ0S!T5nLaD[k}4&jB|rnDFgBȨС ˦x$x`W&w Ĭ4v<D5{wRu)V0 `8UV7&S"} qCnסm.*dEXB:=6bO^p7[.6)q5KP=,i(~Cqw^XZʠ@mYi_LB/;'v+"zf7-plSk FBU$,Xe[K3m¦~7_'2iRgѽK9]W6$/?5֔xb+<e "=;D5r]nD]c zȪǪ2 0c% ukFJ N)q񖫿V2u՝ *et;HÔqOm-Q5*|;ZcQB}scaqpM5c'*{t&wGO$Of '(&q+O"@'oi}̡s[+ou{ގWE{36`M^୦?m5hN!|kPzpgybD:,Z}Urˡ' +.XH~BGHGYGSp\G <ڕ5=%(bO ",2ic Ls\IސC^}9*těW36L?l{x_MLeܹ5%w߽{42"8%ֱ :"IPJXAϐG0&ef[= xb8` y2mVRa"kO><GxVd|b+KT_D.(t5)n* kMvnwkLb!<%&AnrRAxĞ<6o:o`r}Ǽ½Ć>I ^FN]N<K3:qM)3Bq 7ȟ2,EKcpyCXVR`>P(;Yfn?$U%>J{|H+?WhOErNnlLN7n댋H0BL5q,).3x$4vas~셦Ts]=Coho~kG{-8xoVXd[H͖bh9 LBrq~bcǡkt;|ۍ2vLm7 ~ѩwŐ?~UHGFX*炡LF;wr*k{7:p/>_Ԏ3~S~2&_p?7 7eлO iHHMᬏ Q"<CCG{I~[HY<yړ텼E1" 5@p}n~S{[c\.rb}s6iP*)R] @-Kx% խT$}?Sڵ6KqW>s'5TIw2št߉2*xJ)g2g` RpL |&9%܈!^AaRP-Y˧muw]{f'gc}, ߇K4}P$Jh\ay'c'^^[ἶS>3s VwOd;-3bآ'{+Yܳ&1_mлq.Щ2g\VYWsYiw_Dϡ*a9#~'t1!5j XM=$ qu{򃂊/j{C^sWd6C,eSzrg }Y4%䶠٣cA*P2@(fmRp=uA~[=ykŽY$\R 'ER2f4)^ʡkUA,ƨ\fFU,nF1$K;K4|/]<ݒ/f4߁ua8FH $s((0G7vFFPLJC4Ga~bh{ӷWݮioy~aݸWe(bO6+V |N>"penCK\9FeX=Bm"5;Esɨ؍O 73pW/PZ$kYbE6,Y}Wɦ0x^Eh_b3( ZX$|uv3dI:cPiN t m`F}IJtM@@n$g w"#<ۿѨVLǀVf:Gx?2* )K 3*7:7 3oɽ,ܝ6הEuq]݀.+Wfiw-vz9S<ᑺnZ9eeH{-2QTRyi|ԱD/30bX&EiP wNԎ-S8X 2bewS=yO4H6VSc.*cŮ\/UifQ΅ZIqNtbAV&6W:W)WA}}l-|e7B /sW̛|ݵϭ[v~1fi^2lh!νwjӋg[]wwà9Ľ]dw:W 跮.,(8 Hñ$qѺ~$Rb $$t3cuaDsqjE;i' ͘U4yq<>4c@I6uτG꛵7W{A5]wMimnB}$+9ginX#jH Z{\pLQTJOuǀpMq&L%V[fr7>`'a;`WHx![KP1VI<-@մq{#ƍ>rsb!Cݶ~Q%iW}}D s쒜[3`όЮf6!*-mZ"B uV `Llaq%KQCJur d%_Q _Wi9d-´C;rt”}Z BPS!m k2N`.qlY- e4B缦LtԆ SiE{ t^q|8&X3)nlJ8֤D\L4zkUЉIIJ7lx(ԏX.ݘY}X(M4H*$J#s546|$XW{Ll?rg꓊lqg>e0TGڳm(Zt|ZYַ HWxOϰr)敉%oբ+ArU)m SXM?KHC %5@XT|JhBDy 10Ʉ{InJ YRN)?/mn!v%d4xڼidQJOXH/1RE nR2 5BU,TKUeLf+D7;~~j͚8cNkIqw9Sf'!3jT@c2arV70[k2C-aS1Eψ =QK3grL%03St l PB=n7I8Ao`(&Or h<̟VĦI Ċ(b. H(eUoحION9~ÐQZa9Qc+Rߔ|UߜԏJDbA#^?zmm;kTN^`j6v&bn[62oW9qBFϵuOF;F(ږʊ=F۰*FIyx')2H%'Y-fQQDMn zLDnQ NgAHT ASul$C"PArd>ip)ef5ݯKvK*ύ ݵЮׯv|Ȫ7f,Ӟ{16;sW??>1o~nܚ7Q.J -Y@R'y$f :ZKr,NRa6SUkFXA[ oXz3`O1fI&6jEPmOy yfD& L0c&Lw^>>1ja=?[4W(+. b01X8c*苠Xf,P63#w2S.)PaF 7 9ͅ˄b/ߥ99=<w*xû>89_3S0;@3%>3dFmXԸM'6P;-kAQe<,ΘH6&s1 {hP+ oo|YL|yv%!О*N3ufm~}',XyBP#P߾w֯W3<%?cWyXUFgLcqHG2 8:3##DC_ MD΅t[,kQK2-ֈoKrBNn0;2)`U?F7Y\d?#7[a >ôqEaJҵ~SOf;llL8 vA,5=y#=&6ޙ&gY>b |/mFɇFU#onIϞU\W}YԷQ_,Usk2V=k}`\gچCi70G4'NU3Md_M֬`N vڙ&GjcIZ4m3bG,+6dƸjUZ@ہcԷצd6F̙ߪކ\םc6@W6Rεxu^`e'`m)&:<"LJ5J]mx% Kɮ-/$`8]SUvNzIGUTL+}ϊ8jEL,K_=/ѫ5tڻ OןSǔ>5ըg6h=޶2=鼈)|J@5 W{(˟ʍa+qJ \_x _P߂0mAh-~{sml!W)y$O^SБx;cl$1 >g^ mW|&ϙl$mA P&aZ DI5<*ʝHaZ($֟k86I>\sm־c[Mb9bqn]Ķ9ߵ_xqʍ50Z4Sg8x,>H͡T2Po=i=vJph:TLGN,p-r"Z}eK̥ԝ#b:4oV7ܶΔ_kN`iiO3YgMH\+3-q\KK7ܛ4Q3džo:BaS/ b‡ LpWԻۍUMƋ 冝;]ticNgHͥҐ @biYA]aOn`nP°,lQEY_`"ǂK`S=Gy47U]i3(L>Cf(]!?KPaT?99p'"ǥ2 @NAd/tϓ)7e/x]oNb%eb7BPimd\,uHj6 -d~枟s1쩛6jeGLSS1mʲj[超ϮϳiSoc ou\ptDqZ3GlsiX8dG:Q>@殎p*fO6ݱt0qʌqES?r-jʯ~}M7be̍Vнbڦu#i%=ĊRT< #==u^z&]2?#=9?sYi4!#"%'RGO4D^q܊:QU ڪs5Jq_6qxp)Y}A[{Z3,¯&d^ La"&\ri~ qtmv'~sa=6Q-6hJgBJ<n;0DV/+(2Ձ,UjS UjտSivաF@Đ135Eơ_$-0V|8w+t-oW\>ʮ,؄<(+oQ<o:[sfA>|-+3ݵW``Qظ8 4-VgBw_Wbi^ÿwaY\.̛Nt_!><񋸢v-I/^u-) {/R8j/?kڳ砱jiy`p/@kq)SWqk+SfsG4Ŭ]|^Cv+Ҹǜ qd랐#bB{2\ܣؿAk|N~]CT) E{I:퇷1W`zrf:B7Sxp .=ȥ4V  傫;ss -翧MSz^7b8ŗUֱRGfU;?Qm?= Ynח+o?`Y+=Cە 6՚B1I9O'\i9f{Tiã*k9ݝN ,@d$  Y1Yّ]PDdAD!ET@PqAz0 }C;<_Usԩ `z?F %gbB OsCQSghuhp}:[OojR, o Vq,|o5)@Oѭ 뗆7{g~BXCF-|lP*+9s,ƇYbr[<o5q,C V1 8h`̨6fx=`3,@P-nX<2dXuy`~W4|q7Z.^Y ǓSf4[PEC-Xtm'8[vvX[Cukf- XSS1_TΠؘ 1>o3 .o,|w>8 potЭ!+N'[Hkۄ5|E5'Q%6hs"!497H-Jp"I3;xEӰOZhŋW-^ԳKnS/J+B3fgYNNN3(lԻ/{[H̅w)m@ͥ_쓥|Sc_*j.?ۛ_ؾ;~w}V^rz%N$(hAHߴ._*pɤ*Nmɶx‰TVW=ve0ێcyzb:bvEni8ok%Oum<"Β1񅣎S*{:/LEJIPsl>Ub6"v zX6Atf8&/ p->bE㧉5:2~îŷ'c=-z|Y!_1@'?CS4~ }c_0v=2$x_#NQ*h; &|V:1ǟbD͐aOLuR"i[^3}vǴرp&opYm#8Z9ˇA]IwվoBb΀R -GEo~l@ۉH?H|ShF;ihvtEO{h3.1S2ͯvڔSc2zk)}*W;~5X4a4\Ɇ{ *u˓x@{ĤzBb c&1HLbi7L:MZ^ 0DF`sN_g|0w2hK}=:Dm2G6M;|0yyL?sgO/.]q]_m)8eax8 PTvh4jU So(8p_'Z#.+ sZ'>W{ 4%3+hOWt)]]Y'D*g 6 c.Bay7!u@@T-trcg5'$So9ֻ1F'vk Ώ(U⺤:$OI;m8 /Y|h;Bb)1Sbw(L cl&ܦuc\3r`M2pe/X1<7msVa-tp1؊W,,͓`kKšIt36@e&q͍ܔ-w[!6%ĺ|qΤO%~PQLaVvSf ;tw1]Ӆ !I'FC$LKb vvC?0D7C\ۺsox|ݼ]SgVJw3m/7:~FeS[4a󱟌WtDQW0< Gooy6ƊN8tDx1N q(5/L45_;MI@u1%o5;knӾVOݸsk_V==}{n;zC 6,yǯϳDf٪M)JW\;přqg;ݶ 0!,v-X,@j0J wФ{T,XPcuu)p/*t^sXZ3asBy7zF{%}vn6K ejLTkҊj;bvX&. .oWln)Il(7,>gxkeC`.8\@]P5mn߈}I=vy2s؎^]<)mN<5xݢ-bXm:_<_CS%pk(h{|<&Ydn5؂fwMi{ٵTOXkY#hL( ga[8͗x=P,B{m ]a q"/,^qEWä́I|o^L,U;[E:VQQ@(++>?-鯾M+lk[=d̓0H^ı/NMj.Xf%.?LJ7\=;s ^wܒw^<^kg9\ymWD=yky:VjsCOB@~'oYMq?p]YS;wjؿ"BuV]䢜]?<}mUں^l'yM%|r^1& ɟ !dRDRYda vPi&fKuLSf+3vֱqs"'\: pr~XP>4&LZ [ I&?M2 3.%, w 앑ϐLAa ٪}s [IQrI"R؆1fe6K;KPzHߑ $v;wKDQRVditDop7 i}ߑXqdE}4:/iVpL@^2а ee xhKB^8I |dqcBE;6d$RmO?!1ؒIOƢubtC^a{ZY I(dtFR:r :xhC_%L{ds"hd_`,QZH r*d3Ѣ\E^ѨHkB^?so! 4$ubI^G]z%ˇ{!{BO!*EȬ^Et^c?F* ޷ƽx3!>mkc7d&xxqz;^DeAw!t\0upTm;|_TE;|wbݳWT#>Oj 3Hjg$>΃gQ1t귈Wt@s[n/;v̇[';v&rr7icWB6G#Xɂ̯8nbۤ.ءn *pgwԾя6 ryeB\Eh.!F^3NG#Jw}H8j!Xcz͙:; '!ZNkWٿ:U?|/'SEf{iH4{З5[=pw=Am]./^1G88n?[8J2F&&eORA/!i5}x=[eRSZ nɰ$l32ZL_Ls:u.7?o[<\<=x0eOsAϛu+k]O"|'~XN/se@z.]vz 딮uݺu[ۻۣǵQ=A u}OQ}Gݾ?s\E0r偁 2nA :(mPӠS>tcЏ9!C6r<䣐B\0rko{2yH!r7>9OC )^X}Xsa}S=b2w33o31כ?[6YvXY--Yˬ+;֓sk֛;ֶpp 7 "<##EX#""2#r#"E36pɈsˣGeG͈4jCQ)Myٺvmm>}kmk.:11bb5:4c贡%C #v ְw]ŰKb=bbĚcccSc3bŖΉ1|w?0i1wXg\`\8k\\\Z\f\n\Yܼqvn/#3Gވ_5!6^-q@bD1YkHJ2'$mNeϲo_eKr\=KĦdT,JY5egޔk)_r'~jnS[Ro>*kԆQ[GLKK6ht'Gm #lKN<۸֤LE=~؄ &ޘĻ,330$sMUUaYײnfhd&7M>5RKcM2vJ }-eٳeސ5{g충ƩSM3N!9E9&1}Լ>w(Z¸EE,Phg36=a.q)YSگto齲}e*U<3nݙmnuU>ջk2jnΪu{vќ9-˼ ,j n/ZظsQޢE ^bś|kɞ.;|ϬX1vҕ_Z:ngOYzik7o XiЦ O?c-.[Ja<9[\6m= K_S{ ^cvŖ]cwӂ>//mziǞ='_zy_iܗϫMjqi3j+kծڴJ^6}u.nJ]Q]uݓuWXw꾭]׺eG_}`yv}Thpp |J}淣߮mJnߔ4iVҦ Mۛ6ljirM?7?b|\wێ?|4УG>:謣+n=聣MGO荣?Z<[[X[ZZ2[r[Z浬lܲpɖs-Znii;vXy,؂c[{ةc?:n=q|o9Qtb뉽'vr}'?{;M zo)S N8}>X:33'||3w>bG? >;lُw9?|ο .O_֥K\Z}K.]zһ.\q;_6^y9uW+^W]p+>Klg'jնk \q穟}ł/=כ3o k?D ~Q81$ ].kQ |+p–RlK?&WH7H ]I;Bjy$Ap97 2x"axs0 `g q_ "Wi++qˇ/9UX!Jpt2roqo?7wwgJ-֨|91C~TrRtq BS&Rȟmy?Iu x`H&~N.JI=ڋculڗI@B:4}rZ "-b,MJX:b 54&$j4 FLt v :?ttVJZɷsQ:>F\l:N9X;|Z@ i-3!#VЙ$*V:Φs\:Χ p">IХt]N>#+ r|]O+a>Eеt]O7Ѝt}n[3Y>G-@w?ҝE/=eBWi-}EzNi=HFlqEߦMmGi =FqI}Kߣi>~HЏYzE1~J/ ^0nNo/W8Ek ~Go'ަ_]wzާVmRg 30#31ܘ;`İ#ḃ2?։,ua+놹' bX0l a˜Yl,{;eX,vuc#HX"KbvRX*MF16cl<2D&,(cS,MeXeYgb6=JX)+c嬂dU6fs\6g B-fO%l)[Ɩl%[VcmbOl {=˶6<^`;N"v2^aث~vY;F;doY;šQŽ;a)v>`3#vcv}>aK2>cW59]g7 +g5}˾c7vn;/o.;_Y+1'r9WpWݹ=yGŽ~yyWލw=xO]yo|Yx>ẋP­|<y&ij\p?Ƨ7ɻqH $YE^ʧp`8Oy<B^ċ1w/᥼ >WuW>s02l'ϓdyl$ϐg||_̟KR/+JO5|-_ |#ğ omyw.'+|.^u|??_XE?F?4ՔfI4`4\HIcL9+L95V7_^X^)GӋ+הqW^3}z~YtkLyINN.%]W]-_쒍|Z*qOy{[[H^^Z1Q.Y~%57R)qTuqI^X%Q2'2'kE7J\Q6*pO{~xw19k%*vJTAjϗiϏmGYq|Ve9UՕE^V Mdei/WIqE5e95%95ۇ5*5Ʒl0x*OxPtUn0fhTDUZ-tV5ZNF%eabF\n(1TdZ<\b% 5K%Zj؜bS^YTnT«'+p`P. C$dCy4ڑՀ5lY\&jYKUn"fU -f5鋴>{p5B}QOj8}Q:Z?IIJDZ,zj=5ULlYu>zV=errrr^:FcH GY:FcD:F\"t=:Fs????aӹt^l:/6=eMO٦lSScD:FcD:Fc1:Fc1:FMӍH=5ۃԜXU)IJXbvbYN,ٙٙY{DD:ubѱb>iDgұuDhG92Q2,7TDJ׵~qD]5jl&I>l#Z-۔h-*ZC,h-q%nč7ZFKdg@BbdZ1YOκ2pʘ!F#yzAqzA(ʛ;-v_nW/|}g/~wfo~/m/?zW_곫w>C7拿﮾z\/YU}j ~yzϸ/^ؿǫ[ߋ^曯߼/_vo_o?ůݟ7Wjg__}ϕvz]Z7fzo7b⯾ׯw򻗯~۳ӿ[.*tKϿПz; |ꗟ^/o/_luͷ_}ۋ?Zզ͋Ww{zn>[{.޽zy{V,\f] ^S/y_go\#3ˋWM7֫5oUTۺVzS_]TcU?lumz+8`Uݪԟwx]-ntwۋz] Tfz5𛋁UuvmFFYs͚7Mk+xj?2d?9cnøOݴLSHTjӐ }v y">&b@0UXrSi(%nT_ԥى=5Ț{e%ٰ0j*m[Ca3jku⺈U`5©tjc: lJIF(7ԫvY95&7U֠[g:z2pl-OU:;n:|1w.=חYlUS7}j6=UiպZ5.WͺVmֆaMݷ6\uuN:@ 93`y)ЊA2z㖂CbPH}-Ǖ`!HE(u7Ͷq;R%@H0av$ !^ 2`c٫ܷޢHؾܙAɮ` *M5ʡmUJ*USQ3,h%!P`$*{~m QW5֪t{mGs-?K :6.1ECNa:'(jI_}t?&V#ЌLz7P vJ R0  o1BXލM|YTI/|b]:1YAuS łi=( >uUtuٝEv{U10dT`#[v5 5\F=m-=V랇A;^xɣf,ڷ6U>;`B^x,HOUUQ?mV\in]4.`[D:)?c"[ }t%_0W$yr~q25ۍLT7%_aӓ53ΐ¨P9+(FWMH{W\tMg*ɢ7 M<%d\r%N=ʇ(಴XR5c5[j9fQZرyt=I0P"F(yx{!1_:b3.H\E uwV̡=Uc󅶕7C2`ayzhRE`dKov3yͶPu`.ڔBĴ\APհAݕ\έ_BL`ɺ*&Q'>PLWHZ+pКyI8=>q\ ˡ#^e nG]$:t }|KR7X&+TY!̛1qjgv &؋ i^ >$z+Wu_E[e^`v5Pa()ƫ4hI6̈́`$* Qeni)cT8)_L+dRdn3QW0H̺C|_؎ںթ8D0K1{pϋaF Wy DmMYaW,{Ea'CڳU4z=D2aYd<|ƀ1bB-r6LsŲ0%֛kFP azd[TRK{ T|4.>a8r9 5cG@_nѢѲ$5ĵB2xWcyJgxpƑFiBz9g6$ @J@5 ~YB 4x#t^ ;9(F[3RV^)brm ?;#D#`:1ybP} v䟝ԣ;9Zc'c07U|)4dS0J ߑJw(TȤq!Uj,IG=M=8kI@=j`83˪`B[/& iܢ@ } = ${x[y*Q‹& ze8{aVsRʸZ Kظl hJT? LNabwb x(B-)pOt.C<T>rշux4ػzp'czSUIЁ_! SXc}jqMN3nmX63o1`JEN+F}x4QLͺ+5.%.avtĈ2bpmH*ŚQͲ-S2b`l6th~26'kJ:M1-u% T\rnvͺ9 [qe#[ I@Aӏkb"n{5<{,ĝ-(7 s*I~uJ?܊B?.XJ$9I^lcd[ edF_m+?@6o(8'l%'joλ,|{`Ĕ?WDAyՁ1RBr?D#$w+Gc$Oϻ|Eȑ^nޖfAJ\8%}'mѬ\cWcI0\e 6mhNnjp(:dAs#4æhaA.i'#N9 g>y0Lfc~IƂ]ʆ唂lm!"8L˘&ě65 ,E*E5 XB>p\Zi!9@:k+`ՂJ `u7lJV\38]axG(N8 qSt]&Rw5YLƤb\I}PR`#x!KOraetScӳ4K?5)beG)H\.4wYgWr2"'dRj#GV5cWpv(? 7| .4/g 73/>+wB"1r!ce*%ј`9yqݍ{--ߞtN^'7'm ak [Is@ݫqG%PPBjQm7fE ,_%nNU %d;b\,,ִPL# ?de_"EmMX7&ec;z}`j )ߚ"Κʹ&CG-_!LYp:@6k8ȿ r88* (a( 6tIՄ3K7ѴgTqReSF#rbl^>U(Ӵt]aLp3 7+0g-Ì?T2cz ,36I~ΰ2<E;lO},yJA oJfw [O`Id8@1\L%!t%.hbcɮN>3$,G,lϧi#l iI0f!2# ^DP ~.il7ČEFS` ũmu 7x#6MR(ط<^0KN҃GKWiO{7%9|("0[b#x 8q-#R*P|ϲ70 ˸ itnDh/xd۟! F9%4DG! {{X[pcvӊ@s +$UWr=b딄q.0We>FcG 2S aX*ffQļ8&=|\"͔͡]݉kfVWII V+]T-Rށ?> 1X%$ЬH"U^(W-\HԼH0u1mʻ;ʊ܊p(yH19x]u`2a+ʇɖaO: % q~tiڮ}Z[ Yhߦڝhv55MY@.P݋e=pc9H#1"e i6ƧոCkdЭ6#Y#T B`ʍ*#V<$PB0oXE~OuLNK1 MP ;k9Iz)A&{*V;J/adŭڷ_.|axٓBGvjFbBxd~"a9'1\Cf)Ξ9B~Ȍ 8 wmLW2$ 47*%ʛMtۜvD2(QBdvwr`&I&o, '; j€.Q)XN7S{˚I,T̸8m2(#S'ҿ?yLetP8<m\0d2RgR ]ϓlG6"ϜjcN^Ľ<;?$XJ!Hy=e:-B !{:Q 9v432@~HAb;kMbb /SNvE0w)%'-Y1eW!JlaPJ * \@Sݳx]@8Jך[[$r(n4b{C$a pjˉ{P<`*. Ȕ FB(>m0nga.,}axL&M,.蠅Pc$ՀmYűbyH9II& yr)jsb:xC`hù ?20ܪbDW5UL2lQi<}O;u/R$"bbU\D!b|}Ժz)C f,Y\N)a.ɍX.4dtCЗ|/_V-Cr$w0z=5!m7ha;jKΔ?@ed ,vMU˭ d|th | "J,z S9?MAh7v)1y:T(*x rX [S P(/&j̷.6 x*D q%[ۆ@L`v-";tt $zI "$WXQ1BHvI3ӪTX&yUm%(.I<UMv#IiP"5 )7)AdM%#)Z@K A v%v$@JZf͆D?J$ #c㷟7'Ƃ+=W㕳oNM!v"LGd2z̪VP*(vY\8tC8ɚ{d?1$ #=1~]y8Jh^p\ˍdRb8|Jpc59Ѓc(&#Aq ,慻[p7 8(6,'vAV%Q%[­ïc#fOEJC:-~'+_Ċ>. Q*!RwF Ccui ӽYoQD4?7ZOT`'Je v/Y6(fkYٔi]|hGԭ:E(1̙@D$R:0)I$IPU<v_)c.GI"Q!bD+C ! cT`/zbzx|,X,22Y2RD=#bT{s:_ҮT VJs$J?, V0uT 3c/7=B.1ۮPɡTzR.LVppțBwְN06Wk%B. /dx~bްڃtD2W9xԎ4HE ~氳 iE\[#'cf2whۓ5;D"Dh4uaOX[*|Hmy@(f[Q/! `?bpv7od%VzJiڔ"8 :( "ttnIr8&PU1Qx4;F}Be#١gX)v2ILQ$D~XG0ЂCB Yqp-Z[F[:BHb:IM@Gn'a0- ^T*k6&&SĠ=́4itetdCBU( тʙ|aOcMU(<2RQ%$fތT27w_^ H.Ha#_r̶XZ]^ ᘊ#$ 7.(hۥn\E:/`ÖX8)7UW}|Ug传ԉ5dY9 @ G7oDAy k[JT[AR1Qt-,f3nSZKT.OkYDV$`@se\ Se?$0˱˾g5 ja-ߓ{2 #6 il*,=cV N"Y̡oAE-iC*$~Ȗ,7X4IzGUJy .sIb&Ӄ% XVF^BId_hMu) o-,[,DbiV"@ 9E\ 8j_TF2fsQ/ T/, #F醞LTź(;d6(^.L lA~ɿz%)o0]F>PcJ%dqXϒ OYcgZ͝006#[8:U@,zA<K(Fz}(-12Dg9 UBQ*c~c֝z%I61jYkٵ2O&N0B(|6|qeDzYD1"O 1,3HN]ͨ,V@"Tz'#'ͻ)Gi_81!?GMHZZW FR@K7~p_&;]gX03h!Ϛ#P|ikyc8 fXDG?fo!2|ݘ {SeM7⻢De>n`}J+0]5WDu>v$#UE}aCK|"ɍ.ʇM7:r{vՊ?Aܢ&UY bƏֻKJi={6AQ9eg,E}(+r XsP{Q29=V0F] IRxB:ˍ-rsgd|qLJTz!T6L&@qk [7=UDD|䎜QB5~eK@* t@;Q\6W"$p[pXpD Es` &%Oo1v[r;-JfVUXf\hzbFK&P/7󁲕zrsGdasjRӻ1Š1 {|~1h,axd^%lp~F ib.n/g 56X#=(,=\CϳMW>4R-Oiεwi9A<䔃/VE<]E A˙,B, KOl?a_; 6 K |[ROc_tdYskP`%<q"gI❬ZuK)`d [$#7 .Z wWb&Ǿ"]M2%g) `]U)7bW4 D"ڃA<' (} (>[Q(3jr)V^KڙDkL!. qp8׊M+ht # !J ! 58[v` 30i7o1ԇ/+ݰAAj(N&-< ;ݲ~ bة)jtNY"E'z ßv*m1y,6̄]5MvɄ$rWp{*hf@7dS!08: /.$"ާ+8S2 tŦq)p^0P˲/Sgy; jF.MX-B;9ߡqpc[xI߉SC`n᤹sG񳻔XPBV{x׮}8p`M*=I1TaO,m;]ㇼab[S`l:vx.+"/ʙU@i-/́C8 }%W :cq0ď`ͽ]X{~@ 6n09FR}6ǞWԷx5$4W ̸CVѹvL׀BSdZؤ"M M"qq1ԟx2\#D1h^#1yZ n=;[!ފ jlAe* 8(-bM(2Pg.aehc3 bCoxOi\3i1UHj̲$[`_ R"f$Ds86wRXaCb1e\^І'F0vxg%-Y9ؾYuSɰ\L rfoYd_%J٤edW&]ir' ՠ$_6c_C)*)S̞W.FN_dL \ ǫ^o GN1AHXl /ק4Ml3dI/d™QasJ%/L5DŽN{6A2Z8USs(MYtCx}!ۉd~ZZ:D+a}e8(hY(IzI :0G%%ķ`!jHϢN8er(S%>7~FET<6~zǵcзAnl!k) "CZܴwQt_Vw}OƚA4wMX⡌aݶȝwȫ9Tr<'#.Vʙ0;q JRo\i(Ao&&!z4R:Bd AD-bɏܠO:83|pz_́>b' \3{0Ujɝ'cudcqCڦwg I4?a~xh= ʤ^P(.H,R'yr%#HP}*]Bg 60NhU;'N;lL4lRyphFj4HU- 5q ZCf^ z!yƉgwt/8p9\F ,BbVOE@kfJcl9͌tiq:afQ&3 ,֔"d/2㥞$Y-/0[l;h=E v? O$?nf.5r-m&#tD2+_ocRgBZ rlmri9,셍|6Q Y& gDcz?/5:n"oU Szx^啡jVroG hq>T<. AsF ON݇rA1/ܶCbOOcfG:~5})h1,0 iD it&e1;CNI+y4m;SL,x޵XtC—tr|o75_*Km`ZM LzsHeqWo^'?-Y49 ̲NQ!2qIc]gOpZW tߒP<o՛E{( t8!<~G(ˍ 7bT&B:;# "[ 3"nn|'HaC;9ЯЖ2(n$ChO>YVlqK}ryHPaѧ=  Nue lAte<v,IL_Ic;IzY"H<& a!>=viP.`iRh[T5zj>ѲCU;tKTAp]fag>pY.h)}C)IÇ!iBgn~r LŮ<ۦSh^Ѿ8lz]lrA2Yvp8FI*=ۜJ(lo%W{40Iղ +(  ׍ >X1Q9XFmzbFlJv,\ʑ} G+-gO;yoJi3գ1PnDy=dKezĥGCJT<=Ho\j =qRu}|cȐ Jg_Mt^^=YlMHO%lLS hOi;?7:Q(0/}wƚOe!? 1lP*F]֜QLC}0I{ X.֚9I9j($sΫ#,gs0=7S3) 5ؗX]Ty1: {$BCkzrG`<-_H96tּȜ8qR*W\%kA{Y)'utŹn@V> .ٵ W6IՊNpegHhDGԛD4<,ϢMܩ^.3֬kuOgfpun{mDOzs" ;s)/w\˝e 5$m`F\4!iz5[dKhIFs]/+Ip," /Gi!-'daJݞ9,7-ER0P^L[,1 p9Dȏ?e(@ 6_!R1s Xjq8ۺ߱i9 3<ٞ_6C2,(eqSq#,?X:,po7Xq#L]TkXiGWdt}qVa-aNm$RQ^5lNP7Tp=\[Τ<(cՑ5N~Q J>&#Oras-;ܒ65֧U:}TcυWhgx#;~p>L;z"_g޼?ީ@{@nЁj cTMlc}A%b@"u͙?^Lf J.ޛsqs*69hR `qjn4Ia0l8i΃cAd8ni)v^U2c'b_h@ I Ni`S`#n}sGyx( γ-5#-U@g?oASHy7spM{P)sS#wwW{V7~J 7^ItOUMis0nW: ~EnmZ fMT|ֻMf<̪ui5kF37(IM{::iC>n=æmT[iN o;yR֦h(mWm}Z'Ӯ8Y}AS}jmCi6  %٤` aIőlH9i5InX]I!xC{| r-RJ뜻^Ҙ tf* ֖ދBh? ΑDZ8TvC2܍2tCF>r'=@85z$`<^Q'R .YOI"uqSv6KF o>C='h$D9I+bZaT(4 fI(jCa=|i-fd!61qyV!?aB -cUM^G<,В8&DxʹO68Zxeed"fݳQ2.dMS+ai.]`{JS,nx?"&YN3[g;Qv* $g]V15p/,=UlIb,OĊHK4:Qy ~ LQfaܪn49c@0/3Di)ͩ%>gVX[`rZl xBZ—"@m(͗ VN}q-n?AwHqmvġʡ 7+WQTZք(ߌ T`@Pee2!㽫WGXDM?U`bϾYjv{TWqXrxY^q+n =.\8˽+P i[&'BHnL $FJ-^(ZU. 0НCp ]vN*ftݔJv'\D7rZfZ_QE6Y=}fDgc68 ) jJ"nsiqp[xQ9g@'&"lf)8ABuM~{:HL}fmzXĩtnAhoRDmKHKL&C9k+2kೞΚ78'ِĊLvJE?e6M+檳;; ]5dB\)gޤbSMQݸQH 9N٢EBT>ҙn9{;@؂DAEe4'7 ZLcc38-7ۙCUS'rM[bl@o؟ԥOllE//y uuZEν:5hG[jz2LV65C*FѦ2˰AMl =`w&vVN{PpYZkK!hKL'wvq91{SsR<9%W|Tzl䓔}ُǧ!乭.'3jɥ;~Z*T'W) j+ĠYj$ cʐR߂3sy!Fi"ig+9Ƥha$MfFCLUP^'c"KSNSӞN$նWjDLh:k,`"F+F8qIXm>#C#`l;Ko ^ >-amVR'khh=#)gQBKЉD'L0`&?[,ٙwbv=tm1,"~OGWmv5u@gXiOP[Jc_r9Zk xXSrdR e=C˴?3㙯okPVE;C~ m{iufuyߠMKd P$EG{=iȖ6D`pO-]찖s{sI?~X7wAiw[>Zϐ؊X3 */)LFq1zEwJtǴ->pK^Bб$/Lc2c;rөd<.9Q`o{ʅƞa$ nً%۞fCkIsOH]oX!lmgÇD8>P "kNB6bzqXܽ.|Ԇ҇޾&9vvHu!ě؏0(ȋt\cXaU~s2$uƻPG)ki( ݺPkdR\d:4g#`]{K,a/-`߃&duԤcG~ǩ v``=w:S9| h_Sx6o6'f=f*Q`QCVW˓I/g,z {S6[9OYUcyd 闱*(QZa{[MeȀiVے@DQhM/>%2qT1+'6ejyﴈ2y*sIQQ%dteP@#9tLpzjǷ&bMRqZ;GlM[|'=< qZ_wCA-~P;&j#kK֪bg$PEF.iU*ӓ+&>hG 2pf3˩ʀ&(1&HP$9nfEɳ%&M,hQقyhEEw+Pk <ໝ4׼6E`ybKSFN/⋾br-Qu{νJp/@[QIXVpqс:bX{ dA^%ȟ"+R˲yG=7tS3a`^=pA<0G4z,3lnC$dN 4ZM4\!#f%Y$Yi[#=y.Y w,Y܊K, #Aȧj !P\5PF27"ǒY3&mnFiB?LqG y}pI[nTWy^vJ9f8ttO6`ʡ4 #,΍N#D}>`q^4D)3t!bŭj)dR&q釹vn;Nl.AK7DxJ ϓsZZy4Z"6ydM?ފxfr@٨ b I q+x K$)IA&"?E?I;bsDditƋC*Ⱌ-]ScE,rD2 to1=WGᢸ<-qq1@jٛh7˗Xk <<%wd!j`liX2;C\42vXbuE1G= s܀½/g fM.}dvUtJbsp)È#u@ $嫄97&ف)1e Bw*A\hUk-*UjW%mQz|62;KFOlNi ~(0: ̈-͖D4/l!NT1qħhdѦk f*d!ZU3ui@8?0殄?aV#Meړؿ=dH4dlP N9ؾh_$=MPr#@Qn>'SB S]Z-@l3!mgͬTVfZRy5k+3C%+3D{;O Q.gpnj;t3@7Öq#4!z&]T,)~gU Ŀ>f 2ºM5Lt6f›WRVd(]I4p00 aHPUmY^ !/zb l~ "9&u3`M, ڌ E>6줨6N;a}]s9 ONk Ik/Olұxcߤx`L]),K։sx0x7/8rpVYmp=}+fuMi0~da;*Wإzզ3.Xx%lRH1z, h: q=Uh$ia\=u[1Y;XaGy[KR ^FaЖ^ֈY V0&ّr`ybqCC sB[_^?7B'ɿx5$l]ӮyIآebR=z&*PրB۸`e-MRK8Ve?pNǜD,=ּaEmc!,9%L=ܘ_~t , цr W2PayYtIлHe侜6eHQCE`&3}LL6HvVNCm L"36ک2l pX["/a;M|!ՌkJ)^j#LDГkYS,A#H`D2 W92nXc; ZXSp; +qY9&sKd Io1o ΋b1}HzOJ H4"K']F7')XKi"@:e̝dJ]SMTxrofO{Jof>(9+f'Vʷ1LЩ`pwxp)d iT '*.WjһEڒq.o&9k(y mI|dhU+6Fjsy'3B^ sqBū)V+bxT%-HZ] Hs+4 pBƍ,0HG"?pp+@L=䁭yt2i\E]f>@к3[toa4”B,v=Ij?zÁ,Bؔpg!i19]^^YB؛%  <)V%/iundB,fЉ[KLA~+RKq;FmԦ-G(xPQjhW*)ݻLmu qF3WRnCZ8X#{υ)~Hg^;~]J!Ј%=V~B&!#:XGDu/[DžP˙;LvCPFBzNruRnWS'y,; ӇKc_m,P a)[r&.$fb0K5iq(P>'6CU@կf8X#fԯ r (4cyF_hi2}HI @'=vuFjC,#Ԯ_'e0{*{ 98v%3]>"hI0?acП<ΜUzFfަe3G.)p<es,P ֍D>4[YO}$7 FI8G!N8ز5\ީaE^ş`KYiS/8뮥نGp:͚h v8@[K WථYDCs qaK0_ǀK*ȿKe%X'>%XG'"bH'`7>x{iNXh4Gƒ1 f>`q1=.F t'pQsL:wpoT-gޓK,Q$_( eH~>:䣚x|$p,#*^t:‹BtuwVk@DY/xi˔D QSid?rjO-F-wy9@AU4g:[%`\u4 1Y|Ǐq8mz +yj$sb/)fE5ۖ*)!h1&QHWyIVapgC1FX,EJRЃaޏHEdyDP\\$$&SCRɄd5bJ6=2^4M{9ƥe@L_/V?z3GQ={i99 m3 y.7swwVa&A W1j1g+ 7[ 0lRT>r Z .>Gnxg*{TInjs7nꏼC М@Z3;+WxvOZkX;[;7Mol nmȑ* ,ИC OYXꡘfC?ڎ'XLoc1b`RfT/jyJOLWijm[0ZF mwIl*LZ蠎$X$]{Ga*\t۲}H=Ccpuh2i`89# c|z 4 o6&wpܳz gww^n @dt=*&N8Q}OzsW8F?n7jVl|:oS]df2HMN~C%9@thG' X[oUY[?M 9%SڤMWf'_lJB@x{Owlܢ Zbuχ4,};?RvvʱIwcu5DvX&z17@-nXfs SIcuke*Mǡ*nᬌ):It>%̫5)A"cX|QF<\ g2b5lYOh<ވJ&#4$sCo @ C(CE$&`'L{"4톰EVO1f6A0 Т?.skz} :`R t}M 'W;y%=˦畟jnVwKĊb@sJǷg(LC:Eӊ!B$repUf!~FLiIhė6Ur;,zˏ.ȒSbP/j<-&F@*ڌzԎEj)Ա44<Х@VBn4Pyh=ŇB_;#tP}zmq:`܏ ݋c)v\q.z$ ʏdU!Y9Eʐ"PVP24(B†>#xUtD75&O3*: s5;nܡTLC9{ZT$D@: .P?T]f.}N(%$P5r lL&}1QT6Ij/MPe~)#f6V^*v9fCف$Fvb曎q>, ʎUŬ#Q5621z7/P&ذ=_5I,7ѾWnO( vn^NdО# R$NI=~ԴqVGך ̇ բv2j,\I>F!DKe!]\@GӋˬ~[~d|jn!"Rd_6O@ w0-7p0A tdHǫm +}9u4 8'Px+p+ݚ3R ’30 ,位ȳ +ðՐ2_qRM87H>x7[JӥАaQ8mhD-KEt XЂlWϘEIvIL9mEJdլ1?Eʄܗl2j>M=i 1ځ0:uOoUyCޏf>c[š4:dD`X]K#l4fC)>tɼ!tl# G <$*L拹cvXLns_)Ғg&St鸁೶hu EpaKv-l Q,? =#Ĺ?`p =64'Z{BT*Ya5 :K`;bQ^ȭ (h|{( y)q:}_;elo7ؚ2A~+KUq;eZs Wp\M#],љXBֿv?O^Z=gz#XGN~^>37= ,6)aPEX=w]>۱lmĠ@4`=0A*REɒnQvkF'}~x{#t+SkQ+>(}8&R= 'sM @g`+s.sk]Hg60uId]lHHP_yUP׾x;HNAK"#E`k5sf.?:;^bˇT\FmG|S)D!p`/!=[?52k Aɣ Φ-zxjMR-s9ڠ0JY`1POڏH61 }QHQ:GLnz7YĪ[Pt~ّ BtTXyǒq{S7KqLh{4tZ>󁐣'VxLq BcJV.Z\Ъ-tE Aw'쀆5.>\(/heC}뀜"mkNiE6RqLЅqkFĩ xx]ghg NVukcZ+<}t( *.@Kt^:w{TӈMpŠQn]u FM_.ެJ-2mC,SO""`j RF8:1_Ÿ:ជזrbc %=H[+GJe.rғ"w3Bl5J tsqy2O`%z,?*W=U6y*P]mo7xK/v|sxL7[z! ׯWp)J|: 9)sUc\]Td$q-ڞ"מ:jMiaXGf`?x#{.cL4u=VS+񰁫s0M};ёVK-EѮ8(T;924)ū #L@DiջHN;״htQE69H)NެDFD/_;,q~Q6uN嶱t=l 'iZmʍaGqnAbB[q/LqWWO*M4~{?3ԀQ3:1RQmk2C^AxǘL[:޻Bsש!hCZnq3O_pxpՍ;HNVWd| vp.ݳ.~..hw+.qh}w'VK(X|LlrNҹo?w`t_ӿqtu reb=~5]^>p6xY 6%w4i3U}34e'MVyMe߹SR9@E?G!ge%wJiBy% {n9yF ͢]%JϳlMgU]GYyYMPiU0 26 ݥxrπ$Pް@ YRx֨bp o18m(jhBYmytJ:'X]/aCg8mwd{:ݘ;^<K j]eyNWi /uu5pP}3{llBȦTv|ȿÿw'Epn"*giCcDyX)L*]f6%L¬[OAH30}a Hd.-t*`R}B9,{7]:UsIrϛj>g_=ID,߻2k;>.50y}52U蚗0fhGWB-ө҈oBǫ]z?e WI1یׇEuӘzS6WѶ?,Vj7Qisa4gMkK*=Kr'"Jg\1E!/O:}d;3K6/p1iKo`VC{ Tgb&h~S_; Z߾n@\߮ϵ} ohFASeljAxFa$B̄drF'PK9CdfQ36YOѪO Ν#@ +Jr P7ͻe'Rm;:ՏR~f G-ړO\K:3PC_wIJMLP& S"|645'Z-otb_u jty۠D ^tN.ʯq*Ep=f94l=Loݶ'yr[{`rB2 S Rt6nÿa>^A_J4LWy'-'bX-c {jקG*kIoM@?ڼٯN.]dvw}c*^3ydGB/<Ãygw5wOuWݕ\=yy6!Z Jf]Y|4++M 9NѰQC}-C=H)X9XO5Ж,nS:z6ԠI)O?7&)ܾҀqB9Sc1DZ Mi JTZѻ!>^99u-UCE|y2~49Uy9|.#4^ I2xEh溘y~˻^ЏRͷƳL.ͩeI~S=qO| >޼]>ׂm׃$أ5;@])s}lWtacoS[`lO&fl3)v{QfLD3}}_/~{qԤ8[MZ7jU(q.ngD \6e&9*<̖NoL;'ed=ot 6]&7=;O]٘ $}%}ݣj'M]7|8q #jE @`-XUқF)"= 9br \.?24קz8{bK!gtO߂ξ0zQyjZϙ.%ʋi>/qXƬk2/5o!Cs5˻S;P;##دie>}jg I8O_x ܦտ#n7? e7HOo}\hN NcJNu)uTLk8Z}ʤ3T mI93d\yisza- &PnHo2~GIZgkh4o S9D)?i}"AePǞʰmv Vx L` L`j\**`w6[?݆ʩ{H3T%:i [9Y }Vߔ .SEVvpiABVyy7ӂ:%=8XW, FOqDs9> _O3e 5$H}2.yzLD_?0LR;1T=dV*wgÈWRFs]y\JsK0!&L%Z›zRc~kQg62BNXI9Nkz'2z) Z}:G9 ?D]:jq' 6yei2yڻ b5]ʳݷ]eS?8'Y\Q^ּ8L]_M@99g@utvc-l0FGӇpE{~]H 5>c:mpǥnBr #2ilqzK\.D6jL1q1i |wll5Oyhv4i`خ1eҀF֎95?jo/AgaNgdf&BRkxUfN.ݙr<\r}*zok3dLACqW|/\?Ll*qZ NM{b5 HͶfBɛh괦N t?5 }|r3S(miTc>徍ܠWE[nc89];UQ=1_a5dI \>ӉCֳ9a+ǻz[,0wP(y5"5!BLU^&&LVe[))vجVڂd95՜zt7&>.Ј?,۰ܼ6ZN͎Oˆ `=rvj'۫xB;W@Eg&JnLJ]޳= N'NUϹz&Qӓ2(%&$YM%oJQ26?/u{S^4YsIlJ]DٚRuAwq}EŚ9n 1j0YBj>iqGfReU{=6EL59xb2ԋtq;+9g-@/Xժ9Npy*NI<**jG3ڔ6On'@1jѺJTrgjF8|tN;أWʅ*=Uj$[#::xWf5"ipHMpcZEwUL\}vxXHRalxai^ق|SydC*t=ƈmfLj QʃlV/r_ŕq2I>Ӗ^3؀=Pupx|,{_y!K@ "i `w?WoC7| s5r判E@Htj g ߎ4z0l+XEHƘiKxC!2iز̟:'Q$K &ytޛ1t@wx&d*@0'B-JNE̻?E%.2L*KЃ[0O; Q;WN :VIsafp}Oȣ MNrbgN#YA 谒9Ӳ{<[RL('x!-lݚ.q<>GhpCAVs(- ƍy "jhsޑ}20,71\r f֘qXbLQ?Y4X7%2;7FFC6!3llYu~veyvaL ' rngNfru'Fˉ6zlf"rX܋"r4G.<`bϡxѮ[0Lmckl IVq0Aɺs{C8{n R[$ <.IpPFɊp̀A.lT!i{-$f_|kk"܏ڞGnO:D၆=֔W~d4Ѱ E.6${p|CmDle5t( ۜYg{Nk]*ix9avCnp.БJ@_Z[/#\N|3 ple@2*)Yw`i=ez@9Y2e6'F/#aR(.6u*^q? aHxaewkLsi>ع_ D"8t~!?ܨ\{[GwbqZ=9^E5G029nF&[~X7`yo8Ux}C۰dʝR9zhqLV/w$4Wyݤ6IؘuA0i70 )8fxlk5P۩X0@B-%((1$v/bΓq \p#+sNxJ޴( хMi¤`/P{q ;Qˑ¸s工ۘg:/أ %{)-SN5K݌,h6if¡Y$B6'>mppٴQ{;/氄ɱjݼE󌘤QUG\sNgtE 2ڑw֓;1h2^S/4arٜω`-YcLAQ3-I-z=l5K2]n$0hLiO39t5_P/RR$\ۛ/(21?5q@9$Na6:m%\M:&XHR%}Bi_q#3wpʮX$|T).۽^X|=lxtaK_IVkcF>9:jϴ|Rbmļl* Q:%ZiUýǸYI΃n9+^NPR䫈L^2(Nj9Ngo% [5S O+y#0[{T\bK.rX;|qKT)*ȬSXR*#ĴȢT'<\pIf]s9QC+{55O}vU&{ny"oCsC@ . R Nr+Kʚ|f+/C%~Ö;kӚߥE}pږ=8e1h">V~{K-&XNdt<GXK)KG,j->d/Ya-y_bO ȏi!52HL=8)@{Vs;⛟a'ٻWM6Dtz/r)+_{`Q[Ei)K|`LrWyٲb;rJ_.0bʟJʋ1_x/r 3A04,^ۿܚi{CD^un,SJYv, .>JRtJSE]N{tr ;GO-y QvUbGpJl{%ٮoҁ|FQ-[7 Dat_ 4V{g[NN$;㦥8нZg8o.|6x懦'ՄwAmSG>Ҁ?Y ?H KuVBݜ2"g;MF¸:މje{XQDiF+4_u`@Ec@ٙOG s% G,/.GF'dCoU V尧 ;#g_-,$pS%}}[fȠx¬C q,M[VshtMc}< x@R Qt*}?D%=ZvūɅ+[W'MXG0i2o HdVj`چ\S֥PkDOJRŃ"2ߘ O޷Jzyɓeڡ{z[7Z_tJr6%]W&قC[ywyP,9K~BTiIIr^PiفTE9s"QI\`u."`I: F SOzf(HDOθ?*ʬ53?!ɖ9qXhD];=BR ?odVܧ}m,e{bBu)D{L3rbHnIBͻA)A<7&2JwZcL1)Wb/+fftQ|8•+Y:e2G6|3E$q[=D 2)DiV5޴dC8ګS#0y"'aA^Wo'*ט9OΦI%}LUMuC߬O".װ:Ѧ H4tΊ#SV%0 ʊߧj1aqxv.uM^n =u}5N`*U?:QI>帘<댰]mJI9vH!ypT5;,spk^A MD)"?{>XZj2 |`8K=ΞDEt |PSCf02CLAg7[.sS Y%gwJL[8j=7U}e5 [W*ECS!BbߚIB0}izͤVKyڻN]olfZ޶`[|6OH:d0Nơ - Y:fqP n1OZ"̱x51{+!3MIO5Ss.T_>{ݟvi9A-SW\\=2i^\:[@ ۻn G|V:oH۝wKzJo6h>) VvTEI=}hQܥ*{\).,{3:v = Q\MGK^ 2E-3pjĥ墮?!,U.fqfam˯-{bʺ>4V1ի2ğ9h (7ɠka4}>> Oim#)/#Vy o@`wHm!|-S]Ba057~ڛTFM&V7EPya -2[4wK'ܟtrˣeHyE p2 P>KYKUn&HcvmI bEN\mSջ H-z6ȃn=͍#}ewI}aY3{CEYc%_34D u/V'cb勜ƒOT=HO"O8 ^?!҅!B[i&=@ (ہ޼nX;jVjzṘbm-wx/6}C6g *idXRkT0,RF$4A  >H >͌DdݹDX6LV{taۧccc%[dѸh8NDȧ3#o[=|{[ ҽd,!^chz>MlFᨔZ8tH5wQ]#<@_ݭ.n*妈,K7VUgAW7/DdJ[qVz{Mnۚv<<4?_smuJ]kjXWV>ۼ1,ZTyT?֋[F﬿| '4{)BG;l LBV# 'Rd\z=k&A梥]o洵쓷Iq>g +EvL`83>n㘒u` | C㎶3y/GAnAF̱mױjBg|LO( b֙(y^#Yyk'k84Q М#pc MhNw8s#S=sd^(pSgu@_<&nEY01Є,yZMlZFܗV-IL&Q_>FeER&LirF>ںu ':Q@:U#ڊ6X 'M]l&&mj.w2e;2 OU6"m$GJUU0{3hQ} $IC9J#Ofr$èr N[ul {f/<+I=;-w1|tӊp%IÅYw{󯻕#ti5ӉDbu%0Ƹ#Ё :wyy9k|k[r:obw;Y#4=_|<,_2LY+lMɜrx7F,x4PZt~Ls[Ri r8y=DQfߜ)),0[)GRN\J/ǠH푡fY 0+cɫ]qɑ^Bfۄ{yySX^6a ܿg?FN?a߹٬\Hz ^(^m?8m]x5 6c787<(p;~ 3E0o^Dg@"+2P0TdZ]P ֚-JQ *f@ME #6eyiNU>H Vkܸ`7Ϻ?WL x%r7rC 㓅7`0I~}&)՚Rl]0Cq6zksmT8М\Y0+imzCXO] #&(!rą}_q蝯DjT!̖7T<!go{b !HSCGVzmR=4Lk􊭞;ob1 `]xMk1j` 1L!F]Lפ /6J5WkaO=6o3؞-QzkgGN廳sŬ9)q7)rp?-\7- r_{QO=瓥jɷ|<Y\_A1aU=:ͅ^cۼw?bj "VǹΜu!I "\O qQȞOY wEu5 98seb FƲ+I#Mob;ν~tUR %}kʼn+d/1e T}Blcg j.H)2B̑M7UAGueOf 0le҇D ݚhn ?U'҈9z>(Un5no֒*߰T;O&%[>ϣϡJkKuk6|mY(132[6Ffw˶ ?~Z0`bynX&C x_HQ^C o,꜔ql0LN(r1(1C{W@n;=|]v 6IkϤ|hy7P$krsxnCӍ#|(W}Ju/gQ$""\@=>[/0T}zMJL*DC+R n)s|Nknǥ)&/.+ρ$z&|e$ d\{(FfĂ8o5x(F,^黔bO}wYO0MB-]#FPI$Q;~A0SP2fD6E^w .RiQB;hj5ө<{Y6 qRp 6unU +;yH|[eww5Ges-]L5.8/!vYqu'Wꚲr?Œ [Zvl{VWgo\#/ NY7blvGH<\l/n@e/n+Mz;imNRp^4x9j(t|ס76N>v%ܔ)n9# BB=a3)+5<^Nsc7JݠDS҄q/Q2DQn#Ǭh"҃M\٤nY$2畺٘?!<<6Ѓ2Q1nZQ dV}8?M[ (=a.oO9])"_'pp}UxAH邫sywa[}Q:PwE&S"-[4D/z)TrB"kMQ[e2NVUTq_7WG";nDeXRHByiQtPy@rg CB_M ) 6G$`kiG竿nkLo؎^P<,Xb^z&pӛL%;ye 'H/x{k.T*ۉⰼmu&Q()SKԼùľ<)i%s[_x]կ=/m\X11@L-9 x!4} W(Bn G2sЩ_BpV9Ji=+*UEy Uz#bLJ W &]ljx֧c&fKJ/tϫ;*aPP`Qm6&8"f#b&o[枻t%UyYOZm/GzBs^Q^e186ɏtS}~:n6g @صáJP> hCN8]oGM CLkYL;.EG-Z#9xmFRli Na5(NmbVcC5Z0>%G%dd=gG1JUt)+c"C Q~Ć iWv Q/xaASļ*)rRq'p|‡p.^R[~kWxFGJ7CvAv(ݹڠdk5c9etDF:'Q/me=70:}/9fhp#pUƿtVd'9~\w4+``\ ג/+E -"Cz~v9-;!d|"!Af|𰇕86$ni9,!9hk )J8 [ IMl ]mҞs<5㭚 (6J94@O.::"|dsc£6#ɟe=uuotޥHfǜcQl%nEKRGɽ\?y uk7D%F,S 1<3 xn cѬTXßnQ1KUSs}J!bNOhɃ3@.c T|4>G4q<~5( 0v=5Y[MI5wW_7GTn!To8wAv@A6c]sј:p_Vәbv!,R\XyQwQ: S,,|k'v㕑軪CVE̡-5{D>nj˺1?uAs9?ODKW&6\@ϕySdxwS{bю/1 WY38̚2JJm@ fbnN1?""@R=DuutVRX&XIZ_?^,^~b `Pd-S}w Vsn#o2?^7Eq~,^̑vhAP"gy=iRŹDpVHL1:P՞:D5z4EUo,V)iQe8Xw9-~I"ꊌ^C4o);x8nMPqUv,Զsh=֡=mzFd>dO'iqo΅S?ІXۮ<4>9z:9Ę26{=<=F53vj[8Oh4-o䤪Hxhf*2@fz; #>nMퟻaॵ1 #-7M %w{B0y}˛Iy-e`1+O6sX6Cz1rzOUOj3sHsbY [\ʎ?w`7uT2~kk'j^g(C#҅9ĥ a Ou.X4vAf4RiS/g- Yscn;{3h=O<≯ +55אoC4|×b) i8c/&.ft3, K>Cc&8bLJw 3v Ɛ: V6owCcO$=i[}Qt;8"3>M 6s}g:* 6E jvLAP (^ qAdܼgom4ܵ,٘e\d4xa0N\n ޼(Ӊ>v> 7"T>>k8&ox X>"<4Q"r71tH~-v뜔U9tG?mJj@qCN&1z"}vXkr!qc+7v j"De R`;3Xo`g2o`oGnqN}IL I* Oq*KBaԉX˱vd\VPU躖<.xJ\lPfM🻸8Դ%^Qx sV(aeIU2غp\Nx?k|U6@Bi\|Oqcb<\gH'yHgHX5!q҈n4FvV5w]`"'F}zfq@4=oĬ;0.ޮx(';V [{<x zD֓ +~?y&OdR!dfԦ Z` tX.'mwtM3KihAf&B5.!ܫS{^Z`G<ɤ?ܒYEFO.<\8 !PucP ;OQ6"Sg0WaK/O9˦d" 6#3e$:&: CWev_"9 a!1r.zyen$R0<{3kqX?n!lB _5/푙Ó:(1}{F`y"POJRx mum&V/Va*az.QMgL~ʒ|.%F|b+3H^4ւAI] pQ 4Ӡ=i&O) w#=NuiW M3)<r<;j8UأSï/GOZ~6Xtu&]giA )Ku[w`X(K;4>?VQDOݙxbKhG5dgx%入 P DP ;@kW[*h;-ULρc '*K'lx&V~,l|a8V)9b$ku}tA1\-Ъ`3' ـ@ұz-C/[ ⠣BPDCЁLĪ![xit%Af{Zѩ0 wyKM4;}>0<[#}fmHѨXHm}Š ǁbG;ZY?\m1=Af`d(K*]]41iWvlS C]88eP .3g–= k!U P>J$ZO"7 : Ҭ=hډIX׀sZM\$u~Rrx 񫎶꽉%K# F4u:Na+PcNlo؆(%/mN(.FL U?{BV:P) s}`g7buWs)n۪'3)9?z҄Td!]*_o_*oR;قUMfގKl'.k83j^\J{E=_Y,OdI%eǩiwARP;q>N4i%^AqXjs8^5|K;dIvY+j"[SQXdt Lg޳ЬJ%-7Ioq\rRǢ^aY \2Bpغڲc%U L'h<@y_.B٭#nx9Yo)o([KQ{/g=tॢ).E1{Q'S4>2]ЙrrgzS.0fj˦/\#.,-n`Syԣ'jpG?LR&-}JPtlY?ӫsݝSv1\ISEI X88x"<-5(>-.HS\n?Vv2%v:˺Sn S?ȷ'^R&?>%챯A]=ro);z0"L%+x3Z,O1 CCzA!i 4'*-we>k8~VU凿1P?qԫs!D7b2RNVxxr0 Pǀ--h]abyY^QP837Ʈky1%۰UL9J#ghgFQ>~轠#[("8O?l3.d~c<|R_ہݷc,1+1ه 5 v1QϚO@,y,[AꗔPUnb;V`Z+÷xw1IUlīYXz1rNP3.NSRnʗIm`ʀ'M!xvM |q {WmHpώVs"b'x!C:'g x>ﮝu-Bc?f^b%H>%AR_MڵO23a8I]㍌`~{Xi\/cILxE:f̞YWސUJ*C1L){GP}(*N`C w>ת8=*vy'y[2Wsŀ,k*K ۦ<)F

    jf=r}b 6&.4skD"e<?H;d3r 2oh)] ,6-pI (tznQt/b9e=͵4Q 9[h36{?ELȻĉ&Mb< Qϓ4aWҔ';R8$}v*k(`[۠V2mO~at~W _п}r!s4d7,QN?gcuC:%O|j:^6phriqW8B')W\K6cGvvd~:2Yߧ┯0 BWQ>r+}pTp\NٰL!d AbvfDŽs.G5 v#S7UawԌS2-'$Rw:" o.v73 æ]rW25QCFirTEa~"AN¦KA>6M5ܸQBV>:$"UI+Lgz*T{WAw^%զ*U7P.җYVj 0Nns%lx2Y اaϕ'^ţ׭t+_vՉ)JmcZd]*{>Wǣ[Vw  NuU@Ϫ1ys1d5QC,n!tT3LlX+SB7p#Fm~)$;_N}M/]<Z٫vio~ It|e <:r ۞[X5"U{8](&5@pwF0p\14{}UʱeR~@UcH6m28֦XJ@ԍӘ.tוM)]Zy0>'wzf떽rbu4(;@mڪ:S҈j%Ohلm~ʐnZ] h8RY;()):+^[Lm1@x1Q66jgH)BD9š{7[#~uCRvCqkìcVeNYʩԝ ՜"7SKJS&G澪dүy%|[IYڢR錪'Gu({`urAth{AYxf'JM}re ?F6mn'H9+69KPZLw'i>W1Ow#wϲFM/5ŭ<@z0"%ep<ܻn9U:U#~rx^]ݳ 9nߦ>4voҼSYE/Dk*}yu@,irchcJ1LW1= džniXP̩|@Mڰ839pgS#.&c ꐌ۔_P6F|L0^'/q<_6"m0z+*=RM"DEKYJ3;$s(cgD{ _0f^tzWV# E9k`{?jkg1c$<+bbH 5 d?eoMy}9py!OJ_SK&)ݙLfUh=}U,Km;p iqڈd"4+1_9p*P+W&4t 6V)MZO!4^GL u'hid,r,YsYoE B_ Z T*Ḛ̌U8W% 'ԮV(!RX(Fﮗ?={.$ﱦfI ڢU.2#nF#kª!9~NA 7nJ{/{M%BaWzDyV+c}h*.ݧL5i;61Ԁ-936έ 4O>TTJ+䓽`g.Cg:M5ᚕAo\˽,w/ڡ^ߢH*>{ wh,CH n)a7ޛvk?_cڐdD)jh@m@LRy6lm"ewMxtBa2^N3{ C7O-KqW -ݦ1f 62q[#ʇPY^WQ}kL Hhz' 9՚[[yhWڛZmS/S H>q;Jb@i{8>M֦SWҷ<}=\/p _s'ě`Sz+.W nnS0D{tfb W/?qj@̛1 f^?sf AZ{f&ƨ_:*T^NQ,0n]B=c&N'.xDN7V)& HUeA5+jjQGĞgS4}T WNAR]HWqJŮTϔ7]-B9Zf.f zS&].nGᎾڳkD pφv`je3W)i; 35)_oGBZvotD )R4rbL|õĽnlR^Z85DQSs/sN$q?tIE*:BN" <}A8C3g;:٨QBsNNDw"zyRY_I4$NӹP~=iۧ{ wtty6Nbқvv ]tlO~Oޓ2@SC@VQǻ$ߵU`n$MN!ͼu)Buy ejOv4?Yb\*uY.u lܓCCӲ;?\t{6bƄ{JDžI`gkbn|8MtD͒۫вJZۘ >.Ge W]z2 n74'^iHLxݬKG<#C)@Lݽ-KVѳ$ Jdb{vW7,6zl q=qIMK ^`vp|>uFWq(ǡ9#Y+ YmmzRߔΈd+B0tVi)_bc"߀ ~̣jo^ nOn8h3}5O4|?]@ѧ@1>[>EG5͔SmWo3lJBJwα R)of^壟"9^)H "Щ9v̷Dyg `X܈ 6jH͈ ̷?;_ nnӕKzkqWrf^@B]Ln}:gòg<ɰÎA~2JEu= & ;M=^&&iÜ")%nM=H,uwApCQY~p \Qܚ7Kowk{~33Ǿc7LŠU>wrFL?o^FY冗>=i i[k(}-av |JML+$G?\< k]ccFXWxQ%j!9&q!BM}x=] _ aZZd7&;";_{ܸ1vy6ގ(6NbAyb>zzѨrԑ U#&_j_VI;6ZQQ^i%|y]3!.\֘ "d0QЪy'@b;>Co88iT{3+ʽ}įS6`e3?9Joyt'>kcOzB{aov*r>kWI̛D#5Uƴ4R ec:@j6t-W$jP@$+,`bGa'?\(dnjM1A!BF9h+ I,OņυݺIIc`AAE*yIX%t4E-C,J);FGfn' Əp5mRPܜ@nŚO'4a뮫U9Tqxt)G >>Lg2Ę|_ 5=0,TT.\1J.f Lo\LrN2:ztFU4ob.Dl Gt|'ϰ燫rri欹Anֹ&7}2zm@Ÿ{ ۩Kq~0jUȈEMg0:9<8D{vm<+f.cM7,ֹq;CȠ!Qf|9d*1Oxfߖ7 swO@WQ ߔ i.U'9zR?bd("2(Li-ƒ#Ȅ6FV)Ix%=ױ 5;I>/B_|Q\~&voTܚp~ȍ :p"uԘc5Dciո[j"g%۽tdz!`5=[om̪I_nv\-?0!-EϠ gJώ2V5؉JU;Nu@_hP/*Re $?1no/// P0/GmmF3yUnrӌLF~|_\wS27Tό1x wlvx걘PmctB1;m2>vii˩Ks`7{!|Q>sRI j.)36 ^xN NWOu6JQ=Xu$4ZWR3KHYxGֵ$*"s|gԀ- ;`*T|"`qܭz7AN*$1tz:Ԁ qJm\w6ĥ$?T:$>Ҋ 0e<5V( Ltf,ajnK^ bP)r/b.g0ُ?>\H݉inA u{ힺ% z@vUԀҳFKӲAʯN]ʟa$*|{D婎SFOӵ~kl.)3O6o^L{cc+ Pl}+b W[jqqY=Xo(bX2FIu;q&93je0o,W0~܀{,ȷlL zZ0D"2 A&[ιv}uZG6e /<\za'`^%0f:t=L8ؐ0bP(д̾%#8etC t)t04x-4OP&^V[bJ&/ ނ +!8rڽ\] /x2NlM>S?NW#_\q|u |Q+sD-IqMqxOζ/y9Χ\JSt Q|qy{OƽΆGV)iSq&(@ q >ACNOz)1Nj8(m3M-}N>$%"W*o帯KF0ؽYANj(8(xukJ"ˈj)aӕv|E)Ѡ&.>yk@Ɍ}h>΂-_}yvOc g0DWY9kùbgѴgmNq(O2l6ϱt%Kh wtm7ChW:_JorPyPtd7s+WI>_ήnέ}AmL Sv>ʼn >,3b>v٣vGd;& 6+=k `[PnA+1w-uЬIN]-5S#i~̉,=O:%~܈ _=a'~tݷ^zGr(.~2]2.܎tyKB*P,sv ,F"Oi0D.9iiNJhGYG2K."-EYS?|vE@3o<ڊ $XS@׷"ԠE G1qxx{pC;0XcDݤp&^WTq 3}at6̅j*~AM@P6UAE'GdކROzIʚTbͳ\\rC-h/Smz5sI"MyQU@kVwX9[)8i ݧ9pg\mp.'XR'P AH̪e0C|&Rw홇Vԭ \• cpS{fR~;!]!ײb!n(^ ߩtO)b08006ǫ 7M'lT#4Dy_/Xt3 FY"-jluLx6FIN'2Y߭s^"/J2/1 fH"ាoC'SOAߍeV$Q$AQj x+{򤮄W 'Hr6Zt~CyO9D_9xobHEDu1ѬwK* z;A?e> Y# Dl d!kS^UC4"M2+nv,.RUq,F15sRbYM D+ J5xF }@RH&NO9dp3֎8fq^5vqso?yC<맻_ofG܍ffg& w hfZ c<< g6v. H[\u8llB渾+u7QvΦ?n6 >sXq=#ebk͢r#v\Ot3+q8X?F"xMr5lju=V)DƊvGUA3t+YBQ+ыfif<̓Ȉ;zޡǐ{GnxH sDemV %ofi{(Bg1$a$"#a(uyY#Pqs@ͧM7pMۧ)*Qy㙢b#G9xk̛lfʑ>'1J14 Cn k4ɦWiNk5MQV:v41lWخd/3g">=IT#鸜ofFAӂ5.ֵ`ϧ13Pd%3+MkDG\nMmŐtuI-,5cff;ZA#&6J"z6+.A)pBOH rEbev)"]:o֍7F;5:̒&E *iEwzM}D9z{  y0٦bb9^r0ӚXzcgF E O<.5.x[1[)8q=6~4EZ:D|G ^uU*waRV%N1X&ydr<(gEX)]#&{Z(Wrcx=cw-Fp~LO#-- LvwA[ڶ-7r I! 6v=)ڭ{d[?3SLIVw sݬn=b«_YG1{ E.a}$,Opfֻzޣ|xJ׎-h]\zʽFc Sh,۳9Pro3=eL(ZK'k`=ˊ1b5gupkM>{%h3a{eJ /[C`.v3(i7k@®3طxT8Sz87¯onV> : YWrXNpRkw)XbEhALMO !<'+=ߖX* R_Le7&h@_ XhD>w5@z={j)e3`\ ہvڮ\+nk-)LE("hr?bXČӷ-lH>k5lt!ASTŕ*XR9Hꮿ]$]$/3!wDɢMCvV+qd|Zyn1P/+pf],MgID\Nҫw(Lt`L!1I 5?dЀcZY*M;Hf 6DcjR< C yU6yjB4!QX^ EGKl,-DùiS=LN߮{P~n<֕}gK˝TQ55RAQ6T-vS2^f7,cQ;؜qvbl#V3^UŧlCȿ%B?]눭bx|Hy5yװu%kѪ*f賀!J͕^21((ifr}]~C rQsp$r/TaPdP`hq( ʂ4` =~ÊK"nŲr udY0B;(#{JƠ[h9] w:栴- gX>DkFrDTezz(vafot4izdj x` ?Dh^l_iI ԉ:$_4Va(TRoVfI}0_g.[!mJM_{sReΛ*q8Ќ@%o'l a0=B! _%G:%+Be덺~[ խ04BFr\܎Uuݡ U(+("6Նw7NM-8sS %380 OPXr R&P*\%p`B7~D49n~= 0.$ =I`1/A d@VʜdQ(D@&V/V+(dp. qI L^^dҚ;SϋR3 Ю~ݢ˦ȴ_9`}hV##ԎiH/&)6Z̐\p[%H}N tp _oCqPNK'%ȋ7G5؊$^GtÕAt\^2̸lDЯ;d E^w-"l8<:*Qh׈- L<䉺꘰Y|>4Ϗ_q EЍIk˧QM̭J8ZuxYBqB:5r.GdW`LFZ,vXT1i0-bD,>pFے dɔ~ \'oֶM*a>k}c~Ӕ͂x01KFS VsDANa_p ؟X nZ)vHW+مl 1_3BzCڬB?h~ƹ 4*C;yCoUH >mV?Lg`fBk*(;)` 2==+ƌ1bJT:_ z/̠t26odK ٴ(f,!f:ƪL1LC08CȻz B2 EWE2')n[f|) б[iZ+DY:ZWw8Z8]Ud9y##b-e|CټarLa [cdBtGbο;rziMh!ip%Xj"BtQ!MG: sq!8xDJik .to! 0g4E5Vm77j?a AaHtA`^s =6!$ :*i_QAܔ na:G@1ZǟE=h}XbYd~cYJ,/pye*ɨ) p'7>Dre,wt_fYK c6=UA@nYeOG_B }CPZe<m:d/ۦ&Bp10[opzfBX6M{v!y;f % >5{ |O`l?Lx@1VZR8r{ GV5$~ӧKӓVKZKUM=?p|[c3dP}=>P"{yMYiAvP:.b$3oVY N .$C0q#RФ!3P| APU$aZ$s/$צ h[⿊/$9Rt 7BP@7ѩ1 vD :(8Qq#Zk{4.xQ̚90˗/3 +jҟ!5{Ą]>|Jx!}طwKc8I|o*^7/nB:4Χ|s u]D#/ٔ=Fc m}+- q/{bXø8t(XoE^x 6X,{ !avWzbDԔaRBV  0Iks J\M,۸O*z񣱳-X82㲐U?+]\g<@ (ܛ0XuJ6rNIX Mo!`Z1й'XO (?F! ,/GQw*^)ZxUXh\qbl:rDկqX-*V&Ŋ_sZ}'wk wd"a7>-M0By8H4-&F! bt~ɖ/9Dy6'=kZm! *tb6[a4ԄKZ}4 DK}h>@]BX<3Nܵœq3zMTZ8ɆOq5VXYςV YA2V'o]j:0Gn]Z'm2$K5/=2E kWf2LhGh7oWgَLjq+@r Sc ̊+{N)y ^_ UNf)@1Ղ{ߟ1L\l &QSm4'Q??9V*9+@{|20@ɺ5T(6wh<@N Vi 9'IڊD`Eqo)p?43 zךd:@2OY"HjxE_;?:QAnM2HP)R8QTK(뾋#Mr{GH "-)|۞CǣtdD 救p*GĮu0r7+"^'#y%6 e▒ao扯PS Y>zE< SfQ&,=Z3/M;w:,ЂC(]Tw豷/&^&`i HxYS-% b$-,)h_{ z-'0Rf4amd|f.1Vhˮ0$hO! 3LC"c@VdN%(J0pٙu ;qt6YXYf7@}\NP$S.D/ 9vY:^>FXRsE VD;IaF@AmtdW y"#hGPn8^ YuCNR['=EN@Tpl_wc1Oxg_˵:'} /$PAYfmAó2 / ?1,@T+/gˣD+)bE %Vp* ZaUg1c6_;Eo~5@IEkz&EC [ ]7!!0}:?IȋjCC$c{25VK9WL[$Yu>Fp\NUrgyX5􀥚: qYznHUZZ ޣ1\dk?!@hҶ]z!)~r^KT:tdr\d.Lf ͓ 5c CP#8EMWheW.(X7LQA2es1Sl'gm1_WP{l+bXbC&ɸ\d|Vܙc=ԁlp 9Z*3`XŚ0e_I ) J;f!V@pRzt  O\έaU[s'f{,l ; * t8&\'Ui]gl]B(-՛<ݪh=dRz#!bnu#1-^'t;f0̆#9Urm|=tNN-|a VM0m㰄3COy¸WRԤ@I$׎OR<`*/-aD9#N A5k9xs8S" H[| rN“[m9v, @Qd(YƿBvנOjOfyuQ)ڂPQ K뒓]蓄AnUi9+lTG֕%afmi$uLTٰÚAE8(Ydr7iSTns"4vmR|7[3yYmP[1;/Ǝ-`H zqdȦ͆VCt-Ǿ;IjI0=Sභ>[&3:r.ut1J|`I{D*$+R}iV(ȤɢHnMSDd*tO6*-' ū26Bm>~1|[{fѩ0̸4}|ЀQ ,x,!e9BA\w2M$6s4ڏd%X5"'u/>Kp3ѕD3:Q(2HXsW9堹F}VQBteO6fəN-9eZl-N[Tg#WSeVU]kH:;_TU@0ڊaQ t845B2 .SpEA Ybg1&m> `=JMfHc96-9>4ńB^[?ar_{NA__PKdQ/PKy.FWangular-1.3.9/docs/components/open-sans-fontface-1.0.4/fonts/Italic/OpenSans-Italic.ttf̽yxU?|oU[ӝ& @$%Dv!b,(""""Vu"}aeQqљGTϹ_rvս{s8c̍yog5m@~2q0|حs_ zv˘iحEۃ'O;e;7m[3uCf,97qlS/@8[gY9c}WnE)Ӯdj3F{w2aCa7ȨM[33 ނEj>g)|μsY_@c"?.Oʏ≌>I@O.?"?o ]櫋z2Op,_JśGP> b b4+0Al\aRKpD_,[fo a3|͠bf٤H9`qh:xklԽnLh:_,pdUSJw;ny*Jg7Od.˲MX?/(<˜XƘʏ1&ܛ238111BuLK0G1'5q1ڌiØ\jyEmyeO薡-%-^}Eg z~^ygm揚n>_e//}|)RR֥K.9/_~/.|Qʼn/F}1_n_\vq1+/rqs._hpuJ^c)3KD#ihڌ {&r=yxݥ_X=,T`z f2? `'Y; =Ӂ@o:FN3+b!օcucYԳ`7ެ`[v3(0P[v+mY%Ʋql<;MfS0{mf;>v={=Ξ`Oc8{=N0id;͞agsy|#[Ħl܇`vy[fٽl<- L\!ϒC\6aGMeyoyXɠFYl)7;Ouٟc1= mQY<77 T/`$՜Wsh=IUQoQ/8&Qg%ՊbLGUɧU3&*S5&5PMyjecă1c>S~Us2ƒMM|_VQk#~UJ` 4}?]tM Ƥnw#;3GbӉ~`)iU+_}oJpSP|.jzb~Yb:7TM~4c-26 7ݚPMРঠӠM)4i&im&^#OuWo:z#u #oQ能Sqހ|ň0AqRSibxcBVD}A^Ke%,'ybn ss#W*P8[SfylC_~|>h'|J ΙTjQ) +T[V UOH#cje2<-NKi 3ZXX5PS~GS.95թ5pSg5:ݚb^u8Ck1׿#xG0Oa|HpԬ0^GWe2yS#k+bSMI D[C,#g]Ԡ+]25ƭ:ig𐧀w)CD%'W|Gw^|ί7hen_uλ=Rñz9vcRƘ%W1dnbG[1]5þwCf*tilm ;i*DҬ JJe;+`w"T;RڕN͏B\:b\8{@25uiŅ.wؙߎ R] pAhHpiԮ-4fI)=]q**_Jƣӏ/Zb}꥔ʐۻ3 ixkQV7~s%?;۾~ެVi.&B.O>>l[ܝn[kSwy.3ڟp4"N"a+7d K 3=yKpySOVJM&JN"XurYs|XuĤd\2-rb|4JJskS8$ /) -`[7){}`w3ow-ӕEvr'UGA ?Wc Uxo,W{M^rrJS_n*Wq??$4[YkN~cR'g[=KW#V}y+?˷ ]JgܪF@jLxLj*Bmya6* TٰNltM#H\ZWm6o[pg]~k12i18PޡFf!DlReo!; E1[ׄVIA!;ENnWKcDN&R'M&NH 599i |M0c\\ǺL?W8їJ0<^ *|̖ JNmlY?/:|W{;?v?ܹM6l;q9%m?65-"~e4,aa50zc0ƔFb/x-Tm4+HiBW6gͩ:+V4Y 2$gBY, -n8Ş8bg%񂵗a B=A8ޯ@Ão#>>ǫ|E]tñd M#Jk(c I\Jcזy UTˈh-ɪ en`Zxmr6z$Ww+{u~Mz0S)>ܡkv%I·q%%|'S )BL4#{lc] 3rьF0\`ZjYkؕGץMeuᅚU]L5TRxPd`C\ib qKZu?5(Ze_3ءP[O2s'ءU">)% xR@"!__xk-s__}^qq ش`>p~h#,^>vGC<)O^0|ū^v]qi;Jzl1v61iUay|b@P`0ц]3{F c N\+ qi B@Xf1ob5·1YC.'ٲoRa=:kW߻c!wlS<4`-۾hlG2+4^@#F_{%(ufWNܐ$ad[m3\f\{1_YWH~6 -rz5A~qՃ&KBFn_XoM,>0xdþ GNDW_l%kROX)mNUvGqz/U|W!u#BDko-ح &p][7ӼVis+fi/U4v咼Bhmk \!.&fa96=D,?l!evrw'$ v'ik݊`#r^Us,/%O;XSې8} fNeWo!4,TttwW[X}UN+0=)9yݍ} [#bCZQZx//Їd3125 V ߭*8ȩJ0;p,G<,WpɗwMY Jny9hޟ}#;޾cMLИ=A;Vd @Xl &,vP NLs&bx2H(m,CvvJ&<ϧ]|moM[Nz'7?3yM7R27÷{YsLa-L^ 2 B$y!bs̈́EM#na):hV\1 S,HJ 7T6+QeQ_ۼ??пaG;C?&~f631LI`f"PM6"GCUPm*"M6Bu+ Ev E2D, F+}o~JOonT0z@}׍_vߵYM4_V9}k.p7-xqЀ{b! (fȰPl!db $\JN5 t X{^I(.lzq|Og#sYa߷hoS\'+'prI~|[MwH~,ã`vaO$Ӏ:=4ODgJo b^kŻc^,hΰB^z ߊ;"{z@Q %ۀfl.+C%KFμ FYK~CKca};5+L~髯tm"ab m&qaPHvȒi1hzX"}8,B],8^) m1MQc#hVH!H`{gxn뮾qOf]s8:yaB1@U #3Wͅ*@ȦY"#-Mܩ*7Ű"'1r":|W4e?߁ᅃ : d^ݽQId`:Np᎟pLN e=%X2)8chجv`Yx8,^$ϝ=6\WpI6;kRqQ_<x0Î $ay$/qMkI57Z/N]c ˷&+Xֈ(YHAx'0#~dL:S~XW'a[56lXcqCF*)0%O=?gθaIq̤'_+o|U/'zv8Xp 0 FmlXa@qt/,dLGS}%R1CKn`ڠB%gҞ>?$U?a ӿ8}QV^{?yw+|Χo|NR nqA\-mc!a&pTA4@pb(q[Li(TDæeH#/E?a}ySϟY%)fg ƛ s>} 8E Y8BEI .8-+~ݟ\r9#?д@NO%oYDF?f#o4H+`+Ib>V A}p> `~^t cL_e0K$lwMvUY 3篮=x6;2bRӱWݠ!,NX UPcqAB!m쪳'"L Tn%x'@Oݪ.K&k9}a.=>¬m{rSԻ~<5xΙ[f?wl޻.cK:`ON%7Y9ma%2p=͂ؽsCfdV,dF &0Dā!H9`*3j8O0eES&ytL`xv`;9'5d=,ؠdB\BĆcQL4 Ud|v8]4HLu=N!P|K9?bαwJK?gX3W闛3`w4>S-u Cʃ6Ks0AFcJc1DOHi< (:{lW9VW'yqĕ3Z!tZ?oM0Dp 'Q38qFv=;M Ҁ VK`mpv1o&GtF12"! .9<ٱLnӇٸ|ݩcz ~ue'_=[?K{w |>SPs开iNG<0˨4,/ A d^-/?ǟ;O@ϔ҉wPf&m8uS^7 [f搁~lB\J*kil#M40Cjj8+NVbdm]e( l7B{sXo|y! yuf%){u'j7"F9Ln`{!|p2M7K Ll^Ǧ\&=ب+!=oA) 5İu-PKk38+E| yI_?ke/оCdd pq I_r7FONCKx|fc>[`NԒ0h$ZrF{Q5fILU9sI\aJ!K|OE^q)n5}2؏RE2sBDǟLeZB$pnR sL˗PQ), H&Q=>_9}׏.Z,{Iy)^> bHCˤ) зSH؍a 4{u&"tL@f2&`xMb͒:an* (ܝ>*dprl{ gM}:%;OpWWHv#@ÂYB(Lj HLSu"j1qK ,q2ı#O h+S G#܄Q?^mw =ڜhNo.3sS |/n9q5կ1c^rsX`SelOX@ >PDXtuJ|Ks Q%>b4[E<͑x>%0Diz\@Y>ǷbaЙ'|L _]?[̔ g0,hMc."dk(M.PjA/D$Te5Yg6AёS}M!HL%*˟1!7ї"tWDU M9UƹDlHq^pais4dD+x`%!=GOHO6_=tw;+c>)k^9 "LnY{!X^aaK q8 3ԲC\#,)b&,L_w0Kpi"1,f&$-"⺰P "*~ްĀhȩ5he5P 5S[FR%܁%5'6LΑTm%Ѓݓ)SV,RHJ@%1:^ D}_ ,ߊ8v#Cg53Cwh|4}s^KO>E9tםޙs+c[֫rХ7?kIkn}gI_d-!Hos%51#w1A C~ړJchu 92w@s;! .U{5j ? _'QPG8"it˱ЂhAip ,i`fZ;b cH:hWr+_!Vbȱh1n/w]cXngo%= OkŇ\}D2MApe5?H68EAݮ7 !-Q6=J,7X`1vK,Ckϣ\X߾2iƖ$]׽R: Yg)b D2`Ԝ4BtA3GpcIѦO[)"dw F^yT@}@5ƊP9 ek޳[MjІ~%ҨШ>9]@]Q> Dn7M nZ0(DdZD/$S';1-`8Y'kP$ 0 ̈́x%C^14,\[[Qoy<0{1RޱyZ,ܤeF&*_&QXI(KIRA2>^o^So|`|'PT!-:M*d~cMP!b@#SB @4R(¢WC 8լDdfQ@DA湠ҷ"zݚChbˊ=eHPdŐUh͉O_*:婵73o.i+ӕWߵfwI| |XS_aO(':`в}7y7&ux?4wl7'Cd|kV$)Ea24L"#P!SBL >{QSt+&bD5 VDj2^RBʆAWgٚRNѿ[֥tLִZACZ|xtǮ=R:˗)|0Q| 0#xyXƤ::Lu2 pÉ:Asc8%)iC\*l#yLQ7/Lql{g屻ت;w\>O:O0uQ EP3\0!5\vw-(DRcBxy/]"V_w!G{dZN9OWY?ȓ'D9G Ҟ!X~)Z2Xʮ_Y})=*ݟ\)yʣj;_o)L.}Rç|"2jgj?ژQP=-A*1lB-#AP."H]#?蝖K> AqWdv"O$[lqAᣨ!ӛHgtW&h%#3ot,s-#_~#pڙM_;~mcV-]^U;oߞfVQ=cG֎][xn/p6ciWODpsc3lQ %Y"2(Hw-*WLH#HVL ;Y `Hrp`ɰ8[lP9L٠[No[8R{"'%9 楌r9!b#"NI! UAT#MYo?Zǿ~뿧xt]}$\:.\6|۵/ X )C `gn̓W*[ 9RWT Xy ʄruNhl ]a{ QKGNN%8uB.xk4:P]'Qܣ}zu@0Q)`8oZ5GB> F Bw}dglZw.޵l!wLj/kG.ޕ?N# znk]~u6bʑ{R?"M㺥F·L>'b,?U4B  pl:Nx6$}:Z0{nZx3] 7q7y6E<t͋jJFusc}X(v)^\I-%Q4j,kPU<89喺5 +LWI fw`ZAڻNZ,QЭf`ՄvȾw+FԎ"M4%l~O|5>yW?ʬO' Os_^kY#ku爵'5Q~~돿.SO/O+O⑼UihcW5KY;P AN|P ,[QZәo;C!kzr2b;E3"*o q# VYjc!Oڼ;^rw.z09|Kc8Flӡ>Xu(+WPD3V/wa9 t2֛䵧Uv7 ͭv |ΚēbC'PF&b[ޗ/}hmvp+fE}5w ]kd pr%WJDb|8 =AP(=?Ш%"z">qN I'"dTkv@Piˋ2L""5Ówzȓ/\2EG _4~"X.mjmDGnT;^^IS>cb܇nH kx=zP`R}Xv^ĜA̙ i9khn:JzF ^ Q.us 9I83:t̆M(% Rwb͋ )*CǂR@'8Z)"-Nt=HZր!JN!j8&16me#gaT%F8(ör ӌ. 4CM 3̯ 0uYmܜ;jAHAv.!+YY=y}!!oWSOAxRhX`Ū&lPoT E 6^o2ا<ΒqȑƟ!u\S\:hǤ!yXTM2 uPǕ gV $6*w!(K* |iV*nAydgI-E8!081=Zߡ< zjeҪe6|K۠ok'4QŠ$vLN 6K9LK$?חx ;Q@i.q߲3$Vة$Uy@#^r 9v ҌP"H|vƦ Mu"@(`MRȽS-ܰpHK7Xd.}m=k^~nӶytemRRO6N>r`vގw8Q_UEL}~އo(oL)q#L g[6sZaҌg7s`W%|9~w JQAa၂9)%GH*2rǂ+v#)A*]NAC$2c)"W‡l DF}Ki'=)Iާm UsuxM&eqeIJp¶շ,vGpiM2vھR}OnmϳdGQGZE1Fb>^GnCSݚLL7Tv3rf]!́qcj# 5=.tXkxI[5wt}5)bݠ.:0"ZmX9`F}P=xQ X4əb$МY?A];GT=gTTw^ʹ دGA-`bM,6XocMi'#"ޓo_;_ݦ}Y˽-ERG`bOQ>!rȴ@H!0Idƥ6*I&Mjt|NKIF:|M$ʾg,j>*"Gh?li;Z`>OIH{[+HuQ "gSc>i"RȀ=eHXڴ~~M;] @+,q[l(x k}c)zdSNx2/L8_!a/oArY&x!RZ:P$31#$0 $'$unI,5'b8\c0#$)TI@m^<8;"Q/>yb<> J&wٔ9TDIo޽vz]7n+Ac~-RAKʎ?]~v:Taoeψ<3n]#V)eHUuU;\vZ=.{/c#^"Zݚ 2cD"d v &v|-'2 F:%7GѤh*vKh8ƉcQ$ &.!JC:9Y,&S^Z߿jÇ_wөsHT_HT]3d4ԪW*ދ=Siĕ@ڊB5ɪBGIEJI( Vj 1nnкF_ǐ́^  V85ОtvN0+\5'f۫LMHqJLqϱIPy@@(zYu9B$hJ.U&d5pֳƑ>ˇoeӼIsB~zBhC{ zW.0O1`В˻ףxԀ~]{ɮTs/"8)rk^_Ѱ}F;6Omߏmk| 2d`BZ@,(މ8i(lLp">jj XO5P^S'Qȓ d*;O2pV(wdkM&T\K4,V+GՖ#z\f]ꥇy}&t|pI-wTu,>S&q%!"sӰ=c?o3sS_g/߳z"rX#yDogv}oDwEge-Z_G0m%~=blpy0%(B%`I4~'lxLkX[RRMpX&4_I c7|kAzSo{?W*=l~;ϻȌu ͗I{ߛ{κnKG1k+ۛ;^}5w-|ѲM5 Z>.7NF놊s:\߾ ԿG[Jxxg֞.m?Ў}[ˮvWE}#Bz\@ "r?0b]j=t9Uʞ=*c1lW+;3\$0!i_H"=E~D"aEDpYZ"xf6Tj4P aaz|ό4FXf 'c61Ă&C06RS^#BLh'ĤhshEƁEP&1)ǥDY=WY +(R3lT²V_IDaH<Qa,OVNjMW'm]vkFe+[SmD)Ϩ RV܀{ ]j> )o>U yPjӌV9 !j)m?h)_HZGWhϣ1ӑ>V:*E8!:2dI"]m_f#^q J#OE2ϩ$N w1^ʆX8pȁ<2l2 0 !ߤ**LP"'$1v pб5(pXoqP&E$RHq$-KzI"E'`O7G:Nݭ&w% g|b&icGO]{+FK_]~x@zlGQ<O]xlz?m+7 Px?JCD{>l#' <3sx7dP#S,;o /kl>1W"_̗|3żݩ^}mf״X?/2~C,"=F W:PYo"ڊU4ܚb-8 C{y8PG]ЁiALY$ Bԝ"荌FHw#lN͂Rg:PB!ALHs?ǦTw6z (F7YυپGݩG=m+<= sS[ʴ!;{3:!|/Xv~h:oHYՑ.=_3Z>QϏEMֳlBᑯͭrT@1!f2QZR H/vX"8s_C؛ȟ: R|&@S0 tku{ЧA4h}فզ}__r{fy_?x}{\qJ ^yO ^Af [DO~޽Cg!SaCfne[Sa {jq6{elbosz?O\}3ՔO>̍j^զڗzHq n^ \cMQ J~[8"`< 袁~y٣о6LܱUm 7Gxc.~:ncs7dNJ>sݴWoJϹxY{3./~Ĭ##@M*x_~~;0={*ghⲇ^)>gM9 ϙ+~0LA APWn*$i29$:1ӣlZ[TR@ Wxo-#τNO]^Z{ͿO|Iu.伆h(2D5ea*L"|d!8}Ȭ^e09=l>iY>3hP(?k(֦>ԕ{:;J;n kSTHdW鍼DF1ˁZ`wܚLis$:DѧȅuqixX$Cb r郩ʭhkX.7&p!iYS~ŧb`._9'^skkiUϗ`{X:ayh|bcǴa]ȧ`bz˶e4&\76-tYu5 rs&`2 0yV7j>m>ܣ31&N8V|Aeuko.pƠZ+p3. j)̩?6׾'M?KnԶӕzp8҄+ـscWbQ,Tg s ̺uj"`S"^\dt Dx0߭8)L7Ԩ ?e5~9GOe4o3RvK!v"G Rh@XO`J՛Blb<'U*q7!85EKQEkS.Ero*.Du*ܙP9SJg9;ur],K]Jg>({ָJʁיm2{3ǴR2;Q4:{;lꇿP*=6#}sW.]QQ, C4k, !1F?2UUOQs JZ%sy72~_!>%p֛WrjaX4qnpAQVP7i]'- ڣGA^/M\0)4lug6(rpq,CEo2D(|Gm^U&EM٘ݺM[ǩ oڹ ay,AzZ"/Q˯C+=: G_Te p9@{p@aa>'"$PIOkOڿ4mA\e'Z ;mp^(9EU5='&b;}r CJ$Dv,ALXjUlh.žB-jwlgc~|A}?IcW64 _]fA,rͪC唐gAE+-T5s =ԣ1a nmno8.2Bk/UH_]9{یs_'36mvX,(gXKXX8@o?KŹqUT>1ZEX1,-pKE>n؃ ՎAJ/`빃ᩒvCe??tC7Oy={c>( l VS-5 }j՝ n=  LKggq8;-Chߑ-k<97?!?] H*y7~{WDDJa"WS=LR_ "RGoZϤ=wMcbLA'L}d4Ǻ&DWaK9!Q" 8tMj>~K{A{c=)vgK[#z9 =AZ.Ri !5gJ QyF~D$5O w`# M v5[Rs„9,"H9f#!S X M-У Izդ(8)%5t tԄΥyqJF- [vvŌN(W ٸzsG9M+T_R.[T?yb:zvW+9~V|F\VSo@|qN7H+4%^R &`% d낚?D!Gd% uK:R =u`Px}!.ĺvٚ$ƾ |0N|[=i^ܮbZ\]~mb/s5y+1$qrJZcZA&Q!?;{yy1>|]|_ Ԓ W!g8m/< ZE:JZ E62T)<3pP-.ooCDٕHpP( Z]tzD`+}Ȣ3G %'d9Bo?]r1Dߵ7ĤW'qW`˅s}ڥgE,:9sK=!Z[/-C^ {lO*BK hlmylZ0yLK""n)Ȩ/8F!5GWsZ AhWG8Ho*3a6oE zN*tpzÿӯHİ{֞gGlt{Ꮂߢ'yc'Wmm bG_zJcAY >g$d6D0v$l3*#{ӧgFAiI,RV~upӡh&Q)r֠ԤxuEjnykˉ'(ہXd-c7k Jb.˩b^Z9'o&O'Vw1@,4Yө7CiQHuA:it3 0@*Ą[^yýgy¤״5Kv?g߾Yleݓfm߾罿zڼ3[jHǣXT|Y4Z%E!W ǹ&,ɉ̉DSo@4aK&4:f/8Q΀*p iu#o:t߶s)?PKՊ&yx߼)[wj°xs!6 2!mn|#Foj~j?L#f ׁ"Nz3`?p;d[@!ZUr R\@i~(o=Yٞ,iTՎCzf dݢm(ؼ:f‚҅`9EFkCCX`QjC ҁ$ CZSv}п!:xI#ߐgaD0IJIPb`-ƣB7(CO,K> a"ƙ?JSآ]b;RMԢBkzRq\_}=W?cǭ~a`[=UVIjߚRv`w;,,_+2_i 6hiG()@h|qi›.rצkDu8wE"*=6 5`}W:Β`9zba݆ Y3-@x{n3xet["(% 3'R2B%枠>I=.`x11nj&It\k1pu8)GJFp*ԕ'^XҶUcW ]Wٖ扝['fXWEqKaʆ+$mڊ8aM:0Zj2>VT(&~JRZ/%Dpb#jw6u>T#oKHxz͢&V=3C%e'y,n]8f9iٗ}Ԧ;gmq|;bU܇o?o,Ƭ"b˦O@0%J ;hةFH!:{hpAېX!O4)% >Ur?wg;WU|G}>v<li+kFq uyZӐ]+>7I.9G:|U"lt#9g0 r{BrZu Bd1n$*:E?!XW^ǼOde3U??]D0g]nbo'@eѲ#֖tK:;n4gD}mv"ii,IVtX8&uRU sΝe7+8;3m`\Uti`J!S |'E=-P1o hX+ZԮr}hVʕ'&j{A Pmaw|WĠˏÑ=.A~YC`90TEB-zb:2Xݙ[5I׃xM؊9Ф. 4H(B]TtNA!HP!H;NCwMyS"8g*Ǝb7tXb"X* ȔN뙱O߸iɋ+iՋŋ/~+׫Mϒ'5^P>~dVp+ a? h'aC ؉ P"J`!>t&-HW.R[ ,&M3qw]*Ifv];KiHd";d }dBĒl#ыϔ]C u4Z?vzʃ^Uc+nƝf[mb5&n{IqTAeeNE pԙn.L.[SڥPHLQ[6 ECD<,Zxq&ՅGhuuL˔AN?D'y U]<\y: :ó Nv7Uڲsσl޾axlcӺD u <%ÆOmz伺 CG:Sꦫ/>ulRCu*QR (cM8zʜ/j.!>*oPuJO ɈP ub^7L]AFP5ZG6!Vo1^ᮝa3\[24Dh>ZͧX"HhDžȅtYK!-niq\( p2ɴ*ΰQh"hAH?|DU6 0pDF39ϬKl'1lLX;&.*!,{NGV(LѿN3~Ri3uwZ-SVgAzg JKLߕ4XL#"84I9 KU#c{:a^:Lda"TzT6NMzjl8u."rẇ>v~JUʆhE^Qdtɺ%XOԭvsynIf`Oͮ2ov$VTVQTO5 1fsp XCDŽ5 CC@Bڣc  à"7q+-)yQkY͌kfNLJN!E&hp^7?lm[{]j7[$<~I`J^'w"U(Tefċ_'.=fbkջޙ;{قޥVq6m{}M9:qddzYռk ;u6Q}|'%c9!? ؗ9OV ]LkHF1`nF/ H2YmZ9+=MG -)2񖨼ξk7NeVRưƣgJ0Sߔm^OW=9AdLX1 "n9Y+Wzvؿ`ڒM0Gң'M T%I[v?+&1(ٽ[{Oh{PфT؄gXU%c!;[}H? 3=ya&/Y0^;਄|)F뭑-b;јt $k~&^{ $j0)B &ԘSxG^?@XDְ &6@9{TS;Q|X*~j fiۂ@Jb9U<CJ몚U0_'75Yo!-Yj{2yDY3Σ'nʻh""~T%]U.̜л`NxшP++< <(2 ~,54m?etB460`Oe~x[Xೄ p`(| DP2LYG#%ēѵ*=gUw.c$1-BhNs.hl2s72u%cv$hcĀ~DGxj g&;!%'6{2 h -LMlҊn:ژ@ynQBF{NMF\tneAkoYUGhqa32dC!Fh덎p@RVUD!ЂoFi;Q7#^h7cAW|a0Fp;Smw9((McJh >Hi~c.6K[m>ely8A=蜂2|1ZtTI 0BBmEF1!tk.DoElQ(9odCa)|˺U9T˅k{=AC~-귆RNN$O 35g6G>ѴIeP,(ًXp"cC?+]DluüeW]R|f ul?\kk\)Ǜ) /As&Ð1KadkgabV7b}xXV ȿ.~A9 mMQ[@QuFuSWQQG՜}zLZ(I!y{>s~C'}̙6_r]#~ppEKvrC鍊׬QY7$Db^A؇Ј\BKj)b$ 8@aqfYKqN}MgYȡ(&3iXo3]@\ "kB [k\ !e&_#Cjp,8t>~tA_ڣG 1rN]h8yiD.N;^g}Um0aȳq$0\iX jkZX߯e0ĺPW9h|Č7ǩ>ܡЙCHa% }-ZSY' ]yzXA 8,Mh j *2i l/٭~y=_?=>P{39g+4~W1^~w9\]eS& >79|8/. {f1}MgX77L)O?åQ%av ̍O >o(`< K\K *lhWxܚ-XRlJ:,V\F5vpm1[)hE€ caj鼖cO;H=Qkf͌av+gG,Ԑ!CS+. TFz|?gɲmm M[[POIqo^704j1A[i)lhިoXmlWByRFZqԴ́,آtohcCZ>aҌNzhVtXQSBL5װ9B"n<"0'avSҾIڹ,-[50پ+_( y]wͽnm w5qOX{;贊1 aǏ@w7XٜV.nMQTݪup'+ ?lL< m00x/GoE)wK޾eH-+ ybtċԽ0Eyka-iRE/6:uPl7Y0 Qn w?q>X0\amtk1ڸk??b5>d. VT-wrhoaΆD9Bl >,4 c=`Ntt^#D` E9P:b.ff8Mj,~"5oNT*}W,QXXm"QD?f+Kps NHq%*Aҗx٩+#G[ jǟf$+(D }0TY)QC$;/z0ZJWE&"4-Dae l*opdRR|mtu N2W^b_chz+&a[?]}tw+(p$Z;s;3+ Zo.SZ913>yz6%]oRG $9k!F:hE mMx@\M~is9Z ֙!ayC6F ! 1@  T]("YRjPD۫|Z;gE^ܧ>L6ZϤ)V CV!(@2`<0UeQ1:x0d7?bs3t5r4j#LF3 \[ BGd;rl1\d ^'n(.@7٠.JUTⶁbhtEbxjW35_w/Z[ԩQO=GK~^bђ)IN$.̆l2x 71Ƶ L0BaFq.J *=Rh%p%Wa)z25L,NqF+gX{F;_Qꗳ&L=jE=VWp\Cv}5r,'8gYT31QVX/-Dمa3Xo:yR hA9$[s9NwlV+K(e#uЊ`gJj`g|XDŚ6NΤY7gJN}}г*ּ1 |1)I{wBz7N}ʜ{^ͽ,L+>Gm~::_[[_NB2=@$i"(CD">+.Q8#@V O75BWG:ZɓEljF) kxхctE~S\쀟1bjޙgHyT=bfd h i!fQ/-E$Wsr͚d鱅ӎL:1záʇ=CK>^QQY֎>C͔Sny{Uo:Cºy{i[o_c١~u:锢]-55"?$AK{ X0Be8fEJ#&[21VZ,B0 9*.D d; E9/'a ޲3V#zpw\w洛[q͛OwUz y 7J^SO#di"`ހT)4 ~}<G$FgP{CgiK+*I-1._FYu| ؚ?i~GIo6B eKM4sÐ6 #ds0~Φ{ZXh6F ƭZ J$Q*t#D 9IfyBv1#{}Y͹uyF(ύL|Nm߿r;0Ѻ2V rT|4Hps\eATq^A&c8µ%pÉLC@5i.ibu!0P?y> t|CNP4tn(g/ߩv7m~!{8Q%xMSFǒϛV2~jA/bvQDbJ`ɓqiԍ|bHfP4 mxx>(zP@7& s2,t6_k~&NI2wih 'Ձ[TLBeW<$)33&?T˵ͪn$\ ĩD'M'Q_;f/[ ї^T[W{&DZF&1"WNZ M&Np|(R"zܵeWBHRYnȕDA7u&4xb} Р.lL?'ФS=cs5gYI"CJ$iDE=jJ2/yf qxdumia3|:$`nmYiIȞ+Z:Ky\ʥ!C,A̰VNh1L}i!a6j X }%4 |tOIKMǛ0?p 3\ Վ4+CP k+v[ CSqPJb^tb$Oi%&7&;v9tg|Nկէ oBextlœ.M8ЍHA녎xR'0ҊjhlۛkrlX5|m660IY4|$n KNɢҥ k?g&?mw`ٞg~D|p٪+߽?u_:ԵҐA E]M|G2x)0"My@gec TvSPحhcgmxnBFq-.13+[D߷ AaZ䡹1=~53,F k zCG2l,^gb,w_y]nB*MߢXw&sX4qt>ǫ[97{MV{R A~,ϐD ͱ@4̴K[tIRX{Hpbz)x"IgE,vtjE PvA)brYАT `'>aU_gun\6cI HR-uɉʛ1챌33\[-9΄>)W/ޱ~7';99WJ_=~30|fVtH"ըD-}]z[ }'GB@]QI[_,&eZa+KkMܷ M$X(.Ve 8PҔJK&zԆ0|mMW-:hbG{JIm- Hn} jMKf}%6H{<: dd:@–J^>FtJ`ZkQs?iO3>AM1/>AMcp|XOOz.PGr^)FLԂ/]('^2K{jaeUɼ1z]1`CKƵ؝#S#6QVXܷD=1NJt}bz]Su$|f6kv4{c"H'c<7gPrGx s=qz[COJ(҄uW!)lnz HXU@h\[MWoJH, Ya@{#loC rljךI JA[0TQd P=&^ L |pYK)ԤCݲ``Z-:ͱe>0 U-,[Wƈ,EWy%^  M; |Q46䌢L0(؄e=$̩P(ջ`!MMDI `xI>hżfTl݇s2v\.@Yi) Y}7xȔӲBk UX15xpe$ !QK=0P;6H"@`&E԰@@}c?-/[zu8K+5?"کc#37Ag:_fAvGpX)V]@LhFăMw 'hT8S1DQANLJkGC Mϐ aT8\6Kyd;x焢{.|-y8tWGML䱵~{ݻrOH/uXy3KSrU; |OB!\c!z2Ο% VX[M5UJe$ƍw" & ܑ:xaF;t3N w@kuB#wh0`TI1$z*o8[6iQx NChP8bBvɠº5"#DcBg ÚBאX x׸w Y]|uQH{bK`Qe;?b!rBlm%tTBD<#;BLj@=t y( &s4F,Hn+uAx&7tx&5ua63Ux<.Z .@(:s&κ#MtVMKU,`&{M]·?|pV="Fry_ 7lc:;Dd̋!>%J1<-v*=H- xG <]i8J||ѕlړPzϹ9i _3 &4:]hh3SX=աw1c/j' 7+FLsvӦ/ypKgS<㏷Xg/OUۙ_4< >;|li;/v,Tøl.8áŎH[iDsNjA՟^TUGD(Zs}H!sI_h)J>ȁ4WYHY3%E E,:;^Ua8q TQCKqO:Ӆћ̮ڸwuJz8o?L~8vܬ :9; Qzn8ju?b yQ#idHbQ@f]?0U9yl佳Ǫ;KphR-OYH:bС!RM$z#F :wIĘA dIt8D)m-ED-?)A*E(W(#iz9LDaqt&M7݉-b",BV1vbAUE ` /YςD4hSJx͗jfUmzdRu~خިeHGGE~M} 2 ˋ샠90`‹ ;"@4_a}Wܷ'q/ݴnAg#>Cf;x:Bs߮tTVP3U['\>e̱ꅣ"4e·yB(?e*Ǿӊq 8 np(CMRlS.1VGxbg #w SGc y-My<@H1 71Fr/@ ,cdSF 4 #voPBΌTKnY`Jz$)n T )U!Q` 5[:v}W͎&R88(N֬(YNuo޴]-gLmn;q͘vYn80lU TzvT F/(L2 +Rr%ѠOI1] '̐Ex Q+22Ƃd DK}S}w\woٚw(7jĹ 3kzJӧt Ӧ"z̞ֈwoFێTPݑ i 7w{LB ݦۮ#9(cuޮ0\w#;gΝَ40Ta`j{ kjrѰ<k'V N fbr+uHp#uWg==0zjuT~۷`e3jڬC|+%(uۨ|{cԎcN,I7=Z5Y :7f Hԥ2~nȦ 0ˊVWugEٙqirȉ/>sѻwa-ݰHyqbTBѭ|zMzzu{L_27`tܒ1v5bۓEm[En6fp5AzzrT!:l) Mw;JZ(h/)J8£a`TiDqC~ӏ_[Nd44*UOωuOR<+7z8ҾН=W n77a)q$3@ roDrD3*I` g"FOtyH_g1JR+OLR0?gh~mfl4 Fت,{KXsW]~xS!CߙdnG 7~g;Y&FJ5Yf9e 0tFӎ+5<8*tO"AUn_ O.&LlPI՟J9P+:ChV^r=Cuu,yY 5]nfS ec"9]JS5}/_Cy^ϐ]EAR .%ٻS/~T]7(Gd~Veym;}`)-.Myf`ˆG=:>٢֛d]W|D` #:[Ztmluq:4㙰Vt$ @d1bnПyn+s9\BhI*(ίR;$ӹ[a[`ѴkGLN_tkބjí 9AySМ:MCq\@lH|q=O=<i5|Uw:{u;Ð++٫"pO:IQqSI={#0Ct<վ6h}M:w"nLݗP< A"):i XopRZ[ߐX*N H5' $PY3H>I*±ksNP‡>斌۹_WGgtDݲpbyIe|m3*5qlIQ_-}ݟzFQِد3d,ƿy۶%frlŻF1ZY--6`ZA<%5@B N}iu]6bd1w7`,s%oUv8Z fߵ+L$?70M:v Y9dyD"3\P+/Z%/1q\d\19#T|c31g AKRwj@LK7:劑m []ݺ9qAn!K࣬̚d2ɾ/$!$Bİ/1 "aGM@cHMD!,"Ei83 nHѶBk-b *0d}nߜ?_`}}E[sRw?EWlO)K_ (atyC۽nջC !d!𻎮|PymL4oŊoۡ}{3E]`\e G,@qg0Y_{Pv\R$?_H>>!R*Ԭ{Ť+ث56x:㌛;AkB.|;9@iSMC 3I7!¬B!TU!8ˆ'u>RصSs3UTƳƹw.5K͜g^/Zٚ.]n%3;?䠮Dy"CO هf #v=o>K= sr{د[hWO>7,53%jvzV jZ k po!qpywl0"o{ZLt\Ja vfaQ^fAK"Krb+έ|vr̴ >$cRO"o4WiZn#=iI |SYwWCG >E< Tdnp<_^$gRqyabg;-fB̶$ptf*O!g.\;;b$.Ϙ6y˂{.Ο c16Nop+kn@<Ӭ9Sǘ24ӧ>vLj:tP4a{SοF/IsgO)'6zgx?bfO=xe-5eG3-ᕹwCoe]v #0/[d&T=8M)rW[XL(Vj)Y0fe0ss*ACIZK*ɞPR䝩s z.O;~btXqԵei֊#zR>ݕ;)vpO:9Z:M\0asbS7fLW]xo;lD?޿™;!aȂ LWrWş楴"Fet!S%Yx3)I%LL6tvpJz+9Dd.YLΒZ#!_kگ /9NK ,yV3"\qGllˤ[ka\DcF0XB21GH~SJe0 Cβŗ. p~r/wHS3|y;]{ʵ;viP ŕ:%%=;3vډ$o^+ٵ &'VywF yAFL`LH>3,MEXa )sv83 E;gNX"s,ܦ8]{/_EU&gV'O~t|M?,;KGOq_ݳ֚uvA.0Jgt-Kl.([ZYtet(78P_0<%_y3pok1Ꟍ_ҴDb'/5(A`Oab{ƶ\QszѪbwqãƹ 4hvvZ/y,htZ(Z+!$6#mg2.cuh(6 Ia*3nQ*XTPn66ejWC]k}ÆS|j%u ߓ5Sk_ "_-8oa.\"mC:3XyKʣMš]y`pMm߳З2q?Y _3&/ eGt>BWXȔ`*o!L=Bt+ ~LwB4IGK"*"" x~ n)%[P~FIv"ifc *ܲ8rS\_TenիWl_U=hHmx4xvb c;G+vM9 ~$8@Sj"X9ρJQ)nIe:!y$-PJT=`V+A/1v vD0#\l *(7/:9JEx(ZBcʒoj6zlͮkFVh.v䔪ʛ/C ^|OCv̞0a{nQtog ۸!l[9s@fG"d$]Fl9+fJv$)P C 4"3'{mhcTV@ ރU,W{y|+dfԭ#hz0h8w:.T1ɳxQ_jV]Ď֩hF*HRDK :׈2(0b2#aEG;^@]6P`3c. p~GɉVNC*P5YSҐJ? &do@s?"%#ܝ" ;.bd-֠C&V-j}fʕ@Y-S/}*oj?B棱qYʫ`*(B@,A'@p$(AO j U8?ë@AHLL4w/mȤeZr2![]BH[6+ W`| [fqY$YPcv/e|U!\CM W ?[*VLyp^]%a-CZ.iwhV>(StMe|%8Bq.IP`Vz)CV`n5+ f^jQ yhkAbMuR7rT -$(mS8 >=99#cÿ׋4n8xA{H}ÿ;u~RN?Tbz-%l>Y] =\^)v^M8vYbY8ԻV_W'JpKogT{}Iq$yK;လbGn{_槃y2l:d=EAk):Rh ,X]]:,`KHO;,I.4M$$.sFҎN Gu]G2Pr ҳ@xvg-j>ݽg迃D6:EYVdod)ϡ/ DJtBlȌ>pN0s/5HFN"9?F@xLK! k;H/ %RאIu)NhW>`\;S}e$} (b 'Ͱ+"vnՌ I "8E2ZvezC=>4Q(Ax>R=tI}}єޫ jL!~R>5B84mYkƧ$#3L( &H88xS2yGl !n![0Eo!kv_P'Vha鯿!1w}scH*沉_7YL9;p88I!ƜrE' -$J;t&`w Pb4%4F1g~K|jz6c\h:D!)Z"ihY-CX B,!27k2ް$'jӋnZXu3T:ԥ㯟!|GoH.5c^cpvQkW?ڳ+j^ENBK(82Wu?h9d[XX*k(apj6`lnoN=V|G~m&6Na\l`K~NFwŕde?(qgdybE#fyqD;4]9ʱ W \Gƹrπdyԟ)z>8h.tzFG7}U9q:' [=pA:)d%T@*M>,re-:&9%5K( ittl + B.tJ J*%Z"֑^80mDJp⃺D¯_5Hk&f*.y뙄̨]Ne,h*rJv-OѨ~#|ǗY6oLvGh&nPkE-/=fWۦ #r cQ{]KuPv*[C)o6x^,B wо-WxCY@mg^{/0QYyq>ݑ ,fo8G@JӛDDYKVݜ9G[pS5b/>y7_LPtLa I5Q+&$ j"L;Bt+@#x?mrE{A,&|m<ÙũY TYFv༂iʈpLZpEVq}L>j)6cO/ڮXchުtTttѰp&K:̢N9h͠<׀@{>j26ͽm5^;WB-N9o5!=LJ $M4rʐQv-xjfOixZe`\K'+.,H.9Xm H ſ V$GX5%~GwT6P8sʫÀْ ?>P678.dPݦq k3Vqc ԘKE"Δmŕ(b)}1c, 4o3Bu\1h?pM uP7a\>%>#Yدrh?" w5}>HXZ@eƉ g\|Bq.$1H;|jx#>~(`lJI-FO[hG[ФC|܏N|/<,juwZ1wznSx-Ԏ l1fB> ^Q$DY`qcV/)TWo)xR{i/j_7|ޭ7fX檍*1T`jޣyGELWOT)؅1hKw;en=(NH8d~{ #"й 0!DK*f<}%o `@Pء~LxrfH^kx C[( @ E,I1p(`#u@-<ɽdA >NS#ÓaN^ӼҢl !G$V40b1" 6v#3$Wȯk`X6]# m2(qq }:@qEo)#:[]H\9-Ow'{okj_7>sp>Į`XغK9AƞZs2"nGPOֆ^2#e B."Hyx%Ċ[&Nwq̡0VVDbF ,"Dm9.o =)ʕiI$}R1#Ka z%6B]EjRא7"Eah'Zz}nv0] _1Tw>`I_䙬'QE]4x]gh_nԹ'&;JTsn e 뒦* Q\Ȫ'JE&ΓK\#2\@U4F(o1~ZhN@j(#(R @ś)L W.$*ʗ]ϲ"[XCo$\׻Ѿheo&'_4hAuO؄aםQu+:zf=295  j^#]W H/#6Ll5Y(gL֋-/3DѺCxhKPȵ EߛyΗEwL3Õԯ>}shz.G \tO# Q<'H-IJC֦j/ 5GZGt]G{tQbakgE&=Ü>V>oOR"Ƥ݂XWlHR/%sz8Wz10nz0%@(IC+RS}p9 *jX$@:0B ?t~gITy%tϽaj^gB1;2 A (` BH#g(%ACI4t=*ȼd +%|.3|Ya^|O)x/QG.gu{ήv#^@:/CzOT 1Ga CyT56 R UO=:e'|2Vز+e0"#aeWJM ]C 8)A9xN q~UN*1=Lq _#e?u 8fۣ)u\#!|.qtohN{[{V{Vu]z´Uj8<tM5cCSH_8 zED߾Q ZOD^ W>a7J }=Vv*mۚw+ nW' {?AHn̑c>k38DHy$ex$B_9lwg-.RRƨṚv(\N巵 b@b _ml| 8zEݳ8vd+,G] lGuˠ47( 6fR"dHKdq|XYk_|>d7Z-#GۤR_ bե.V>^_^7SOH0i>~PB&Ed~Hy ZBp'U lB:)6ox@7אkВhcb{||a,f T}pdk S.mj-mtB>C)͋:Fxp} q@{ z^o3|_pI?3OຟMg=c__wƇkw$(Y4HD^[!o撙?Dy4A6~A|f;dɬ *Fp*bSSZ^]2JzWAU3.ϭeljCm~75oO:m9޻:d+.~T_wh.QeOӤY;C>T CY1&K{`N7RR%#5`!<`D/&*EXH(*u8֐ӡ'ɳ-;x,>^U_1Zg{ĺ137pW[yێF=PqoœMgў>jU鰗 czc@Wil+uDUnHI|봯L}b_dxZj<Ҹw o싣j j'x)pPe^7QVJr 9SE9z4)7xܵ_hMKSelz&Qs=FӞy^ ȝ+"~}⟫)52x+_Qj5kM=x*=Wuu:MH@{Oᵆx?7eV3|ɟYvhr(B~?ϋA_\g24yLa}:Q,)t1~?l$nih%eu}W +?UŊs*wa-G[8#LSdžwAg倘0{ {Wmk,Ta\<ш`"v&x|&u>wd!-f :a 0YYl\o .l]X,:*7Fn;Aaޑ$2DދhHwV7>%O2 2 GHR aȟ76\Vj,LDQ\z50f7xXD‹:p'Ӌ%qG 2t%% &ZjKi^3yܵKf >W:Hck^ rkx HJM=ln8h\Rt&1Ay@ڮlFH1ݹQr\/eB_ x /I^L&ҳ2GDxEBz.YYJ.wF.~"eѴA9=I!S.zB@Fqh=q~>BKg}|]fCLTlfPcKE3$WCЍS3+ʾHex L0M۬PT]cG!k^"ַY;{DƮ%oQ]_OȳU>5gM@)PǷ++ᴖq0D)l0HO:!d]W?vf}:.tҞ:j">'yyW p E!_xQ8>XVA%ʠjqzdNts^BU6 UoAiTHh.0 - =Wh/ٓvCO_y:nՊ;'M*1i\T2'783p3C6l&l5vިyJhbOdArqGDAXk&W# `tΣX(_u@D&,kh2 n)L ؓ=ćJ)P2~ )g|o{؁su ޑNZ~wyM<{â"fgsnտI[m¸ +R.rppqX"SKʞ})%Drp:x1;;p̼x{@Ck=3Pd,޲Y:OL3nZ|l[,w}jyAM!Ƒ̇uA@0tå'w<vl@W';=`&+;)T|OL!IsAܤ08"f?G[+:9$&E{>A Y 129E(S ͳW7m$|XxOZ?p_hWRuSΕB[[Ea J5(Jbe?&ti1 CXrғr"KQ/C(@M䊯ROVN?hQ 8ś bՙNAa !` `cd$ jLxrs{㸥fm ̋B=rslerSm5o9zˆ~ju|"e\R]KBbap/ GF Ido%v[p< !"A+ b94ǂI6dD՘@vY"u Wɢp%$2+Lp嵱i59!Q-D̹3:[gG43A%-߮Q3C(eZ"=רŒڜ.XXOdHY$,0=j d&P JCHUHDtR;(w*x7&Bҁ05>ZKv>\ 9Y"t3IdTrJPZce`eSh<h<+b֏u ;&Q Կa]ʐLz;X;Fa?NU*%$#1ɔHC~=&|u(jt2BXz!nnTK1̧/ 㩛fGN6)q5KQ=,k(~Sq^XZʠ@mYi_LB/;'pD> nZـ2p!p*dj߱݅HXʀ5$7gnEMUj@?NdЎϣj/Uqs9V65֔xb+<e "=;D5r]nD]c zȪǪ2 0c% ukFJ N)q񖫿V2u՝ *et;HÔqOm-Q5.x1(RMe9|5Ͱ$0=:;UȊ''g8 @JCוszރ'OܴdPσ9㕏:=oG߫=WGejapbOYf m5OdN!|{Hzpgy|T:,}UWŗCcOd`#1:G:::JwX0Pn9..A{xHVaIH++%T`sJ,:T|+U'߼޴`?qC ~w19s?v{޽~p+8N$#~X:7D$OB1Gcm?C=2I(cc#,aIx]^"}5 UtBfA~q@aYˮOJhZmgT6+D0&2|]i=BZ-R,iPa|QJVװn讃6JSa7I&2 w v^Cg)0 rc B $tuaS {UV'6KZ4}`%!$L}q|' n_0t\f[pY\Ge]2X%RG5k`pdڛ$\7+Wi*q!uGX<1=fyy+j;w3C;ø3."8 1ıh۪q]gHi@{< M@{\o 7fX~kG{ZCHwgoho|ځ~%C}xxܨ=8qkuoQƎ6 >v`1!w@Ogh{9x!_ !W@{oL.jJX'Gܬ`)PkMV|ϸ|C m<B@%Ox>Cl?Xl_o'+e 3S{9px/n,_|\_[;(,c14t7!g[=ɓړAd? 7X{ȕl,{ _aRYrݜH@=?Of}<}?-`{?miմ,>%֐77OhOHN<~{4~>})s#L}%.S%uȬU~Wm?Wy-"d<<zَ#&k͍ڇ臩Uo^ i>Л>_ #/P'Ɠ|}/IfcuXdiWgYC;McyFO~R I|Sd{'ݟ|~ܟ)OVtܟ#&yey!1)?Ca]|neƢ l_es{#{=˟c\jd{? 4#~diƢ~gٞoj{+%N/5xN&mJ8KAu:"`iXQAE 82ũ]a w3wzRCt@?-sX@g!(ǮC]>U]R DjWVgrPŒ(ikaAijZ1vsÆ߽+;>+q;c e>\(G4 QFv0pLt;;* 絝ڷh)kH|"ly>ӯ1gqW|B7ƹ@JqY9g]ݱڗ3=@6|X:ȒĄԨ݃`5HJ&c *v覭 yA^{CO!*͝5U§wK6WINaE1C4h'%X" u S\{(m "b8 ^|`o-""5֠GHR] `0FUC62gDv/7aY_ }I}i5 97Jd︐$EAԆ?E42*b`b7P9 s$ Sal=*}sù,W bX:}b[{0}@'ک4m X&Qf4_X|Q`Akz9=o^9eMEm2}z ^//sץZ21VH ZpT.f /0&(u3<#%+Okt'o[ύ%T򼙝=nX.TEx[dz\u2kV97 LO*@Y.= roi`k( eU ɻg I/[Ecj-tzP^7<(XpJMޔcꇄyANX[!WY-w.ɀYnwc_y{qs4o:?kw7por:Ɔ)gë[Pen؉~Kn\uyg3Jw \@iܫkO.+Z=3_Ȉb6H6Q*BGE kAQׂƊ_!k&xLҩBH{uZPh3ꋐNR4;Do2r#I@>OKya^Y{M;خ]ճDߴ4ER?0ĝT &KB\6]7\Sl%V'-"Oiχ.tj:&w5'q<1{Fivz5((řvtj>K]ߔ6cB-\f˔8᪚غdX&]e1xZnP0y&.DKS~6C2; O`U,"T$ߟ¾?U h@Z" NfHIYK8ZKp[|܅.]!{.;ҸDIG5k=ѨLǀVf:Gx?2* )K 3*7:7 3opM42c 5jRVUpK2zj: S)RH7ՓD4`Ck5)=fAXB2.\JErQvo\kt#= -4}ҩ:M2ck#,Q?4ZxqVr}vݲucTN{e ˠU趛 o?EoI/=`#ww CzNL̙"6(;{E^5dZ^@upgA1a@$Y׏#H!]NB7i1. i-|_:Q+0&6퉰8hQ!:iUƯ(Em ϫ 9d-´C;rt}ZBP"1Q;[Lg>.3eT5n7LC و:IU`k3[4B缦LtԆ RiE{ tע i0^MX#BgR& 10~+ 2Iʯi DΊЉIIJ7lx(ԏX.ݘYeX(M4H*$J#s5&|$Xzw=6pP΁'%)Dm}ʔꩌ /MYg?۞-]Q3TWַ2HW7~^˥W&bUa$R Ê铧ěvΗL#Jk3^k7M4(,;7c'`c @ݔp7dmWH9;Sۍ iQ[,Ey=V ^b4ͥddQjZg诖X ʘ*Q͖>o}M=WLũ5kzmƙs ^Ozm[NM̤SͣF<:v|ANغiKkrC-aSE Uψ=QH3grL%03St l PB=n7I8Ao`(&Or h<̟VĦI IJ(b. H(fvk֤'aؘwќ )o[voωonj[%l"1C8jzmmO;kTN^`j6v&bn[6o79qBFϵHFF(ږJ E  e#Azrp&I=nj^yO.m-5~76vתC__wĞuUoX3Ҟ}16'sWf֟>?_C W[|bزUƃIdc2.O' FvWČWk'_RzS)ZcֲՓΪ_5u7/5g +\zwz5c+ X:j|cݞ0Uez4gt^ 3181B?dD\NŲ%$cڂkzmO'\;20[jp'P&J'(v%GVv>1ڽ'>ôqEaJ-~SOf;llL8 v@,5;uý6Yf]:lܒ 5}/mFFUSL\=#(kIff/]H.dPzִl:Pϴ *%n.U%}VG4'NU3Md_M֬`N vڙ&Gnwǒhfd"Y.VlȊqը5⁶ǨoWd6F͝ߪކ\׃k6@W6Rεxu^`e'`m)&:<"LJ%J]mJ]g/$`8]SUvFzIGUTL+}8jYL,KC_?/鱫3|{ ןS?9ٻըg6hVt^ĔZF>%M qFؽsOS|F߈W/#h/}o(ocsZ~~,|?rzߊ60ӫД$O^SБx;cl$1 >g^ mW|&ϙl$mA P&akAyƕ:3(´Q.'c'I4!?pl}X& ϷL>홟&<8zޓ3Ēݻm9Ysh_Ⲻ 0Z2Sg8x,>H͡T2P=i=i=J L8|4RVH#KPTܖ CNRӲ%Q1oky7A[?kOgo4'4OKY'yv3`fr&p$.~zƕ8%iiv%[ *M{ cC7+ ka8#LU.vcť@Bmam.]؀S5`s4vXnVkhPn؀//+Vw3(_ LXp lj( r.ZeiwܧsHlc+g)*G#1DQF).ty2Epo+ a)YlUf>@V*m-IW&^EҰWO=c-]rt5tQg,Eo[̺2giڛN9;&L1wLqGG_?st6Z 38b2wuD_U1ۜx鎥 vw\LNVf+{mj1dlעʴ}5KMIN//|H^sǐ.H^\\&rTOp9>܈ޡ&˝O3Ft!'%-k^>Ζ# ~qIN50׼ıқ erc חL4tӊJfmrĤ%e7 -|WM٫V:?%;)yPc 3Y[g҅- 2ғb1Fc)81R/Ry"|4JLeޝYg)AI-iG16qxp)]}A{{Z3,_Mɼ`(!JEL%\C?Z -`ÏOv)5>(Czl0R,j2S7ߒ _gO.#+&NI2+zI.]afo>KVw7F֥̾ڋ^mY5/Vq9 vɌT96G=!Gu@-4@eGq`ɏЃ ǨR>BU(O3/; ot;o/ PcԿ4b-?;6t.߅;`*2]}{K33iFl$l0 PE-P2ap+/4UnRH/c}WAW'mkV$(3gE]_8eIWOW*ڈTk Ĉ&m/>Ăr0tB"T!(lr#+_fx̊[AÎ?jի,YdSsjE/ :\n0%9!.]tZTq \,JWQsʼn-OԻeT׋,=q%E CvRK^5mo{N_ēNۧ>+c;Y!uD{C׷ekʨ8Kj戏yi|䄴T;ڲ&f T>"o8{6QiqӰ}Q2v*ugބS,vt&uw{MP.m6A_fjL4肽Qݧr9`[Δv3k{_NN_)S< jtѧJl/ՆZ?!~QOa8qLgc#=.]YJ=~أ#';Z|{(;=~ ߢg%t3=MG=0뷈9lgY3-*O>BTv3Zx1`°IL0P)O 87VH-4:wXߠtfY޻cwe88 # j_7E'a! g@bT1Ih ǧL8  6lDt$T;GeZ:ݧ3~QY?Z2vou,k|G6w<񃌻Z3rj>ծ:M Wr`.,AKG}k$~!фvy$&&!Q-/f0<}z_0u2QQ6ئ\S F jixfݬ(OY;ŭ{ k\t\-NyP6 {:|*R^wNg]H}\%3K`V>MTj0l4Ak̠!l4 ۾sl0cLnΦjhN+!|&[LYr⺇QML5v5Tn9D_uNE''$>T>7rcye<a &j5}Ú d:Ξ}Y.FqHA? ė]U|wM\r/!+;33Ş:hˆ63ۻW&/aeM|Ec +=TkM~X-G.Ro_P(]1~0ЁΓ\b[lC& rpzҨ^!`w*E|ֻ;on1x]"-&\pPQ1(UMTP`+*&lT䇞 ڷh;%iCd7\hٚݦw:CH*(U~S]VPDl =4ZKKjt+Qco Wt:swtqXl2"!S};FGX|]qшt/L~WfXk:9{Y^F{rzFdO2x{^R@κB'U9 @I)w21o_'DBW.7uSs.:,O|Oo0dLblTQ됸qwXd& dk^xbinX,8[,ӡ( ֎q>˫s +jǸޯ9fAKķg=f/\1 &xX4S{ݔY(]taCȬ≙)yB Pf _?S;tG!m^8z~~UѮiM;1o}8~F}ߓ[ò4a p8Wt߉ P{/Q+s+>?-^̻hw|&L/L$X7 #+ ;$wT:fa)twO/.9MN~7Wf긄>%-gg%% A' 3dzcC[ĩ̇|w(:Ħ`uN'UL]Bz̋<)ٙW]d}VИҚGMmE729} Tax~s1sA\ q  1k$jpn- }8 h eӧV9Mݴs>k_V3#c{^zC 7,yGͷDf٪M-JW]hřg;ݾ0!7,vmX6,@jJ_פgTlXPcuu)p/*tYsZ3a sFqxcHI̎WH \1<̙=/=}=0˴ i :n%lhQ?7P?GM]+0#g15 ]cWn%I?(,gx{eC`.ܻ6j*ƈ}1$qKA{]޲̜7%]owL=|esO/<^xK'V\{Z˼hs*о$`VE//#!wrb"X-f[,})/> it#k$=> u,l+%tsP:XZAWuql_a\!Wa\Cy3a߯AW/:& AUnxyS;@΍UnT:Kv q+o>ݦӕoկVV:.zx CL~9''_]w,\3se}2u{!V!$b(/e*>O{(H_.mP&]\Lkl%}{^IaACqkΛWkB2'_yG5obO6GgtWgn/dPM4?ikM7GByNڦU< \ymJ{O׫*WΒ«#Ƅ&!!RI13L *-,vvLrזП;bcF:v#nRL@=ˀ[wn:\zѱ~OgӤBXOd!Ia&e$k?2e

    舐SUO B^ը߅x4Db?HGkBPƪu+d:(@K膪Bgބ Z1ߥB߅ SW=) oo*}tm-7˱^ȅ!BUYO?MS"FT3z&);Y0uT 9 -&!mbنmB CZbt!)2;L5A8dYXU<|}U?7!3^LǵvRV\3T ^vdGi39mQbSEaw\&_u6@v~Q#.$d ;xm'g%O( xGYmHKxo8M1G#PgDڻ Gdks:±،hRO6q=&߂9u-O _>VH"Uqm4SC({"m`^2ذ ee `%!/$P>Fg2¸űqԿZg!ߢG2YIҬ, ~g:1!OZY I(dtFR:r :xhC_%L޻s"h&d_`< '2.TȊ<fUIG'Q.t,##U~=lߜ-C:{iH%xZU?D,JPYR!BT苐Yg}2νo6~IUo{I,hkM}&L!jnL0d) vfω62*C'Aଧio =Xv._zwRľghGT}8Q"3H0C!q F>yTß:8~L4,,߲d">ű7qHN{>1 $ ׍_qıIqBA{ TUp{-[n}a1l(1 ˴՝L0y=s9}L4' ޓ{;};+}d&Wq cXeL=erN-pJh"3⽴_w=|Rwmw0ɤ Y.}~x/}ᘫLpV\7Пg% 2R'ةU_m eAiP)m7X _RM\\p tru7 .9yȩ! 1!wBXܐ!Bv i 9aȧ! -Z5t5C= 2pXհ ^'_z7!%콰O¾ )Y1{{י-̟X,,;,,M֕֝:aI95Mmk{[_xPxh?߉`#qYy#VFlQq8dĹQQrfF͎Z!j{ިQ_Fuצؼl=ml;llMmھݲEGscwL!1Q1{O9|sGFԏxs;#.|#~%cͱcKcf֑G<ȏF;q,3. n`5...=.+./:hљGg]ytGm>zGGoV:ךޚ՚Z:ue֝u[Okzvk1c~ǂc9z؛NqK<~[O=䶓N;ɟN}n~'xwȻ[OZxoNz}~ә g9y3_!p?lg~tϯ>| .4_8u{|r'/_KO_uқ޹tҍK7/ݾtW_B\ʠ+Wv_i?=yuՕW_K6ڎk>Ks~}7\}}m\o"y#YCdb@)irq]BS\ᯂLU`\9^6IBqnv@8G/8'E8Tyw#6qXI'#]JN I O_^ |$G\|XuƮ V;f9|{kɽ; wW!-mG=TˉD2<㈯ 1E*o"UVy(@$ɒ7,R_E 99k/p@'Q @Ązwz;3 }/`jkd:^A#sRg 0ue%$(؍G2GF璀J"v.=Dơ2pbDq'8[a}֨2 Xq%[d%?BV`n F-T|ڈuط j֑A&s?y&P3 J=9O>(1@. aSO%$O{%)C-]Y2!٨\<V ɛO<ϤPWM z@hm!ڄ3x7[-(mȳ81qfK2>eW5]g7!Kg}þe7w{'be_wvc6kgN8sp7rw܍sމ{܋w܇܏w;=xOދ}x N 0`>CxʇP­gSdIWuZ>s12l'ϑ;2H&ϐ|/b?ΟK2+*?|_7|o[?˷v<;#_n"_¹/}lx s ?ě0T[^b6Ǜ%MhUpI#%1ŗΨ(7jWU0S|EQEyc\'(Q[VXZ0}}[b~EM5n3t1iF.6k$ 85&,v @%nvikK6 4jk)=>#En)znE#eFEYYƬGQ{g݋Լ*?ƴcJLi2'%2'iZNJK>s:wouJܦ6_J+ʋ + $VmI6 ^dru)ޮFr T>4XW{LPjVK  Db1ZLEU D2NUhwφ=ۼҊ9CMEyEuj5_ZYz]s+j J Jr=%(5^#R<ƗO Lp".%wXKI(51Ie 8p )0&2ZejYv tFEf%|BqabIQY.̭5I.xFq O˨.89,opr{tȁ ЊC|kGH E"3Қ\LK \\Q$3e#eYEr-%nč7ZFKhlKHL+Fb;Y1YNӟY#,_w]wPM#,5}GXkaMaM-daMpDNMqUkڎD״a =9BE5-Us*+PUAtAUUUKTMT-UP5WV’ڪ|8ѝj 0hDžNj1<3{U"cV5XVR.10/w-;;ܭ]Tj:EadX ^2uz ےҒ\ceA5J>&,{mUc*Qn%crD:WkG tqFA7).2Њj#B.Dc*R)R\.+)JDDHB۝ =Cޘcܭwa%%(lb"*QoCR'.vZ0j ^(מb94].2jݡ΂3lsKKCI 'bL'( 18P_~| v`>ZD)j !qi+ @A^>ռN [=Saέcpq1S)tZaWOr]vR:V} L~{'wT?~tL߃EmAUIBwPUO?ml!sϧdMT$ko$ <&Ø@frOZ@ʸL RP}uتcB/53cQbVQ,w.OMfqO{h]V !&sƆY I"w ]mssS|=-w\'khc%cǃH,*cy*>Hca_^z\P㐆 11*dRCNCFSn9T9fWpv4ykWγ[(4(~NlsP~prlm; `%??gRbeդr9N8(lݢw3OsnU{Ӳ^CEes`DAsP@l_qb5 GTCfwQaQ;WPgi>&CaAmq}fmKXo7"ʋ!`.5r]wiNIq. |oK$HE6-Y9R8y%n[ 5V*_2G#_?AT{cKK:˚nG#SH[?$^k2h.Zpʨ T,WVTεbʝ:GGKIfGj-!(H &ҿ_;&)V $eNLv+1)Pb߂eҮ֤nWN,b/.j.`ṥ5^m۹ F5;iqPfMIdS {w?m0y|ѝ򌍂{BR H z&Iq4ޓIFa[f{H.PB,G}KoΡi 'ج` fOA~o~Ur<>s@d6E2d3-VDk4U a$vH0P u<jeYz ]"SF'6p/9@W#M.U4X`6NX`Ȇ6MPǸӮ6THSFc\R1L` &狈kT|u taΘ#gWmTW*i' ёs^9M3aE.Icr)2g8&e*P 2S.eLŀɫ"&:90gL(IqlvS47׋I Ecx+"ƻ\YyYW!(\NEq*{+h3I* ֎)>4TLˀjJ ob!J:RnpLl~bhx& BJSvI()tϖYp*q-]η|êkϮ\|x|˛p+g;o`fi{i6u_ }QW*'Z2<2b`&u" R5`iEۥgUDZRsp@osZe~XpN/4^Ӟ6m`V@8n`"SPM@ D#lN1 ?5|)"Y.!lM0j :q>TM cBG`WMH?^#q(Y?z7t `̧-SjkϖՖJv﹗+2Xd֧M|Z; 2<̬7(n [G+J:[!]`[r!HM 򹇰,%g{#3L2Iх%IEpù$S#Œs[F9B SCBoվpumO6KaY}惫ٺ\3睷NwMHħ%l}ynڰ~y4Vt!du e`-ŬATolrsDS;{4b󁗗55ҷ΀H`3<#*5Vv?]?~i }HR᫁(;"ĵgH{fzO]f?23uk9x;G' oe$`0rvfYW9:mC>yfDVU[l~4F,ϬքeeVt9\p&@ɔ~ P-)yh~d@RlT%f2XӨx ;؝cyκf"obzXlj۶n+ )k &,w?xmIufȳax 'ɂGOU_ ύ@^h.O%AA˟(z?,zr d5-% .=11]GN;໥d WqS{dlTed޼T~,^X\e^8Ba6QjH{D[}[l߰Mx,7 8h\̏t̓hx%Uủn_5uWےUb HA.ui1hrX.$KU$c\~-;eYIv*G>:EZcNZ p@D pnu)}b3D6Sfs27}nI^>ɷAh1+b-,=#;AxP*2B^.'GCq@- aƕ?Ը*ER{g A2˛feYʾy?/c irD<ʣÊ_R R}3uBgLT iK *=5\#ȸX S ,P0 3dx+hP4;- NZ-WܢW5AJtɗyY%zunT l7Uxu~ooi}_/ϧ|7s7F=4:ͭXx8ZIS*yi\t:b[lzA1a~ASRaE-Q O% ]"^Jl^s.^_@Rd/a:K0OKd]#f=Sa/7(F? {>^d );! /xQFqR 38sK[ .CQ13XҩMִ 5g}y8@$8 dAػ)>pl!A)҇4ؿJ-rsȰˠά$Ą'hSYi^EէP-xmqʇjr^n/?yn)g}c# KgW:1v7<;@|\dnQ C?Yz_}1/x X1hAX:g;~t?rln&^i^!Z]X8q+H}hyܰPݹ؀ؔ((^C-{Kɲ>FM, S?-*F;JH= n`E*89ĉ,;'^4+Zd$;Ż5yuÞ+A?7~zߦ`Zzּs.bڹ͑Y%7xQF!Ň i[i8*="i]u,߬cV~ vp_A@$.9QNJC[`P!* <<)±UZ=v4]jRYb)ɷye}Adyܕ]yRV"X>iɣ+q@"omlNk!nxpg'䢾F/o%86JMNk ˙ h^>0^=6vtIq֚󰳶:n!b}W%Gs)1A~0мO'?.aiz2~J󹓩wpkhC1B %=_WeB256 dsaF߀ g*-s?#a#g뜏68|'AxE6AO |^g]WJUe~i2heXS~"\x\#Wh*k=>hA4I9?=`sw-/Oldy̽iqE)9L:-L)NzH) WQ1шMYꀷۛk(0=~ҶxWJloג46Myȏn{o2N-/?{8~ P)veHὟ@tA'b:+AjNk.}m$DnZFϚ3ڵ_┯6\\zpr9_1b+ac*ur@/{x_7t}TwPrE$C@?A#in8zHMsNҧ1I\v-3K@N:hfbG88_Kay^fj޳&p};m.Q"7=K5GZh<ͱzܵ/WӴ5WO=Xh&3!rZIMdI@qR`(!,NT7[Lb! KS8r]Hz"P~1Ҭ]W+Ș{ ⥀/4} R:LR*.e"꟪CڙyGE{/ֺ}U̿nۤywU'&rOY^{+֞@_O9W`ω@EWm7Hi+CnoxHk7П#gꟹ3WsZsfU tCacZhd"AVM>oPs#/MUa|FKong}~>ϓf.V!/\Ty&܁09݄5H }t_ p᥿cTٲ3}_A}.iͱgnouCY}UoqR)@3P9ri'!o!?-{r,8}^kPQ:WS4fVۖ1-CWJ&#ՁHC+{4\k(TkeqjJdp~Q XE3P^Y~ ?vӬMO(|&pif/ NTO M`7Έj($IaK?6;,$IӃ6)n!@RN o|tP4x{sAo~zx-:sXH$ݐf 1*&c3˅&` Z\ՑC3 v>Es5+uٽqR32bv5<7VefA(%@$ ;z c#?,y;ro7fe7@?'4wh:FI )Y79/5~~ll)pزPsװhxeg݊6[ߎkc0vP{-Z Bj1< yS3ȵ EF$ESYb1L^rȦ,+VkL!cB5<)zicKLlM^_ v̚jT\21|^Kq$Ӛ%_2)@ 4>\1*VxRlrͱrԱ.;K2 Xc3g47p ymN4XH0r1HTYW"'>='2ݎv'-U;󚳸ޞ6`%wux?Btg.̼]tk\KYOԯ+uXϧЏm4t}۟:,_`1N߇WX{Ø|[[CaO_pY$P*r* nN8'#L *B7Lܥ 1<_XyV(Ǜ|=WSjִ02]&7<.yR?רI=΢uz;#x {HYU qo)5 dKMEZ jLi2rZTtP8iK0 [pԜ=k&``VF{xkl{km~&l/۵ޏG*,?x]p8H&kTOg~\`ډJ͏_}K< ]g,NבtM+?+(1AalZȾ-A=r4oΙOnPgt'LGAkzL8 T^,زu٘3]>%-M[fKkd[[z"&3m"ekN>JֲZwOBJ=}T͑}i8o.>4s Pv732ۗA.@9m?ʘgȠN*)R/#82Pb`}iZ-3 %"ů)C&Ӂm\vZjsyi8-Cv}G HCA=>\ޫ2߀~@<_; eO% __%qF7 MZ>Vβ;ίy m {&mw 0'>}|o(;[4äܞ%)nE9ow>w:L&'ÖH@W5GmrzOh6){m(nd~*__1'A8{<+ҪĨsgï jHTs/Η0`YO!$97(qx(|qL'6892j(؀V] |lq jA=_텚E j>qUͼ)ϑ+͛9gX;EN{ & /'Qnh/ǵ4DJH OM|6P1ΩR1D493OhޜUoveex|C)HR%J4~:X]2bHH&%YCQ{w\>3n$K()FCSwSQ,|9~ G G#']pGQ"{O:Ў,wl=kd1 V\rQrLPPLj@~8$ E K\~0~DZT>&}\ 뒠BY5)'ϲʬ*U[^=k=(/zSl,^#>r[w~FZ(vZ,_'aH -)A0/_W7.J(!U 8f`"éDyqXj %st$͠_"S`OS{oŵTRr_tZ # z@IIDzI;G{ws*9-V݇E:[pTaź |݅a9@83umo\uYeUpnj|5a+(t'#:*7H}jP ^n`,:ÿ @sTA !E޷.OՄ;eRU1W٥_ ьlVF~z G:i(N 5#N Ϊtțq(Un+,+(*,ó[,X[9ZE~*l#׮1 !nb B>L꒵@,s،do-ۂ/kR#E£',4G&9h L6p>xT+'eȰz0O&z]XbWzDc̱9bLQ`d`]˭p>D=oWAl(F@1Cqy+ԖLJۼgy{XEŃa;w{1y w/ؽ|ų_e̿EGH৆zBI1ŕ=O|H 0u G X ,ZhiYE+&zkv ϕк2-h[>Z~uqVSjZw6;G sH#[hC#VGAQcAɈs끕&ļeAB|AJLAz e4[_Y־)MM<j#Rng |;z< wN'sAHW}),X=bz)yIr2Fc,7Eln:5vfLdR_CL&:JmBi?7cV=wBOf[{BN@Ν0]~+[d⣩hYq>8ò]Sx?欔ncrYǑd10ڬ9U)qS"$\cG#VYV3M_YP"N.r@~u4'!N]ޙO%K8wYSjqԓkiZ Vǥ.cUlPB~4Ѧ8̈42Qud)`;nҤHY%ql${Y:t çX4,m&mp3OѨ1OOfoT_Zyߌv&TZ&y`UQ2ЛRIF_qk:{H!?G䡋[]z%g"]UA-&%a_|8M[uf/B@U єD'Ќb2jEybcd] ]u`|װ(++MVoCL_z)9ܢ[k">mp`:nk%M,qY џBkoG ze+(Q?tA펯7X\N[T 0 ƩWD?2fM+V yN!>tFY-) A \md5k&ˏTCu;:.-TS̀gͲ5;8AY0>42q1X.Ji{УˁFmSGS(qSmMG+C4z=S%+G{X05b/Ms7p8?,6}JP4 7>2p4Uh05|U:0nbOC`.~ S,%fri/S^ LO\kG_7уnkI߿;v3駺]DyAV+n*?JG};aep sϷ/g7SkH䊏'8E"(S1R5ɜjEo[R4sپ2tMDE@wŠD9Pʏ$"Ҁ#9Ôc3ģSmt2߉1tr_}a/{řAXz/n4JV_Vj-ߐH퉥x5GJTk1%CɅb8N$U,H8d*л5!8ɲ-i;r+yn6;>bA@j]=;\*qیs:)Wgz_ d7/nXzV3C-Nivi/ffu@F=A GONOL5_WW#9A1Ci2XktX8GbP$eB"F | ;rǨc+a3;1 *Fg Հ%iE6 [mm6JzTdAɴp<{-?F&w3kf.VbSTti9aazht‹,oÙNIV ИkpF86KbU•m(%gL08@7pU 9+7>gi`~m,fTZ= }vX 021l|MۓA0 ?ݮfr-4Q鮷yS+,e6w}h3]̳]lsx$S AfV.Ӡy0nC׻)k.̵BD+Ƥk&/J|u_?18"%jmZ$IȲwrL[;Qyvf+P6жc@ө\PDV21꿜3^SljQv&Tr]$e-{竚!ho[V} otQw>oK͒s\>9 ^{bonw5##'&†`֋B LSnoY70̥(B :Ƴ5:+& -VL)?¡{/L2k=x.OK6:,'*1;6ܦڏWj=5SO[P|bq +-!+-BƊMcfDI Mـ\joعUO5Ҭ{"3ѭV;RuS7dƛ1h0%dq:J9HSFrhXF1g53ʌvV,DC|4#Gk;eRޜ`>o%dVzHJtN2 >GVM7R&$q&RѼ+{9D`LL(0F#[O( p;ʨ`ci tK.W w1ǛiK7Xl|Goޟ!rEL.+ܔYǼ{}^vyq#83&{*qEzoݪn/יo2 T̵<7i-ZDKlaA u K_bC'dOnry{Ӏ.ޚCu?K>YQFA2_R 4Ekjb$Ĕ=d|I0'No.CѺw/>_QjbPcƼAPȒZB+0cka?M)1ƞdkM'ͧw!n*E %fBA>iqMG$%$Cd^rUWh !aO3F?BO aјvrT\\ߘ Sbfain ڨ6m+$j4Cu;zET1 QnNZβ5O0q$m%o0`Y/C5ԤbYґu5<>-vxx؅g_9ЅF~0>]S_zn\@ϣsK*)D(w{I'in#]H1u囤T ED.S-蚥a$_qR>4'm/C9hn-'׽/}~co./i=۹H&ȁ zaJ~r:%M9c/@ OE͂gyr"nO&EMNX0F ŕhӒr?E$m$ؽ6f/ؼw 0 Gyq2,1VV.kwMʮiqC&nog| ːD{v2hj(NOf$ yT' |mu@M溹 aw"ڍ$.0sf!nʗ4D8ij[iURLi4ܕve5|Y]X~ omu`Ru0;RhmgfRFK@[v:Bl$Kw{Ueƻ{T )mANs)jk W+Ú OjKhOswo竧'ڻv%nu 2ֱBxd]+vƚ8b 3oSoguK?`xIxMt /ft8F&# n$$q]+rlNW88^`PM{J&̊]CאlЋb4y%\UWam?Hj/NONjK<{քpGH/q%gZ&7#d2K=IT_V[fgBPO jlo5EZ: 51I[ĝw LNCgF!: ~icfϓ`&1a8 RZ7*+A㿁$TK/c'Zï 1qcYInN7I;i-`p74!,|x'o3k6NN {)QIbQ 9Zx:ujGWGNA-jW ؼiZjC|WOm^ÿ<{ Ns q'곹܋ZYb`Arya.@Βh9TXc_$1-ʵrkY,sbhWItEd3bar:Fkbe&{dQMX  ER){$HMQ[sK')y`5) G@Lbl{i0 X 3*$:|z|y[2dAs+wQwbɮKҌ CrM{'ɔߑ9q5~g ƛGןw[ K@3os꟫/?esy`3Aj#4u`|.nI+J;h'ch?_6ޘoԾgv2V]}>_~D}@@+a;F(]S YYu[1)KD+F<N1+`vŒ4CE.GPWPVϟGudQu6~kCA #> =}p"a[ՋMg.<>,xLww|;oX˶67{uw~dKeGv o83)ưu{᫶w9g,#4?[=ڂv|eO ?+NX0ΎZa_Jݻ߲E87пI-pwr, u0N7sM">7Ӣ\ӇNj" 5hlwEL6 X.Q#VR%FXF;ԤڮE/=;P++gO ϙt~㼃Qкf>u5)= ;TU]c+ zX?~z?UWm'cIt]YjX. {笮"{u~˱4xcM'l-1?4Irp?q8 z5NyD1aw-N̟gٰl'WO W'Gwu1DrW蜛lbQs'VUiAqR3VhvpxURa!)& 51XD+pd؝D# IVoz rXz3. C/ ̝GZNV;}z))we{fٓ&L;qz޹z>k|UIu1 9.Q?OǬ'$O$SHiPE}WGj|?l'.*>q\qb<$aqu(RG0Կ<X:_‹{%O乤iqٚ//Ӌϯmy>YJ_١5BhQkO6iUCݜxp7fGNoJvdb^9$%v.$XbQ`з $kTJ`-+KJ=z,k`(ᰶWxPֻ7jLp〝da;^Iۡ {F=^l]d%8^<+gU^h h{=D 0}C'2_ E]ڪ[/[y _'L@ex7)Mӂ@X$`buu"HЙUv$^lQ&iopsF4)$hljg# 4204hYx5Iy[\ei-agiuHF`nL. 5ed蜫jڗH72-C}rsmo>ݽkbúLcf;o+ڷG^os1CȢX&IȢ~C?*xQyOhOJmcjD$C{6#Y{ab˨`ϟͥ~@ΊWm7u3n<[LŤZ;Zq6=ka|1@> M۱ΣAePͯLi@rO"c4-}#/b2Jj_}QTm supOiQ#ͣyTOdM|ΉXUz:DpPpJ:z5N !D=6Z֦%ia|G~%b쾇c5^LXOP^ ~־3:b x#Sbm]H.p'I [&xOX|QUmsX#ilh[jRڸIcVXgA- fp܎ʚQeOxWlZhMKZp>gEA"YzbmFLdXr4ng?/ e/X,o~U\sTn@h&`uI~DS=g m/|n(O`Ǵ?/O6@+z~.b'􈋽\Jc`,)i"ӹ[i)>TRҚq|b$av6)jiq#pصL +fE6djV{vR~qxa^U6?LvW9P1Y/AlH?lZE}^)WIBln]pPNf'*.5+K98Aۃ]ZBP'M%-Ї9]9fb܈ te1J +&V hPGN:o*o/)޶DnQ~#ri?pqʼn8ܧ'`or/?q}4qI鸆_'Owrovg;x1#IgSk ?_, sWӚ2@iN?}$懫aϿ"d__ߙ?/QbX-UL©L3sx&P}fIY5Y2ȼlfssXr ZNWGׂ{Ivu,΍$4˒5, _6pUR<-A<׺zn?qZZ.zQ9ҙW]q 3\6*ɌjML k(>cL1h*y.%}QX 3 0: yi5\#Кd$M޴D;c<5Ӳ1 +|);PPP_ {+yUg^$&]?RtǍ>\k߾"/^^_5TY[]{tnJKX݇9͇, #^&"b5VW&%.G)N.| MZ[[a@`f6]]❡E;Ҍ0 +!@65IKv0wLgXYg;$?fpa%%56\V [:I4Qǵ&NڳHֿibqmSWMm7}7SKt \nYSa?{_0 _ )zxєRj vԧk½V.[ߦI]*pbw%^l{KeK.{GbuoUߺ}{lNg%$$@N .Md_D1"i58:Eo\Y9u{ 3}~|\nSU0(SRk/VZ\w_0|סR3OV)YwUV=&>^ޟ䊒=򚋼#ɍJu+)ώOX 9%`NCso"O:*H1SeXl 3ѲP5isZgbc8>=H?s-=|/`oBԹCF4}EӼdz'3py]E[4~,ȹoI=PU&jۭܓ5IJI_biθG{&w\ЗwKBF.P;⏘|*qJK!N} N}#i5w4z-;XޓOǰo#&Ҵ-K|LNeуլi[ Jju3a`D/BV"a߽ԇ5|U>>5}#VO=^ր O8 W?" -+/D>a9T+rZo,,ɥc__iHW. (Vs=~ϟDk#=n:PtOc 1LTA+C)T3hB!"넽M<Zvcsn''}G- ң}S wW([x kMJtPJCv&;"LNh!nj=<||FznLM: WTvJsYR)ye] ~K3{PlE5Z=e(o?D_uڇpk: h&B}_Vw2!Ypc9{yκWf ׏oܥ T_wHݜ#Ν=VRTτ K|y.X_ {v(}E1D.p/ n8CaHH\J b-(C΂tZHq3:T* 1a)QwQuC<9ycqA$*0SO  "xoqY@jYւoDη[dE^\N2g?Lb{?(}FuATP@:db 3x_1KW7Z#F *UTM!zF4}K!_wwuNFN JBTzIJK}^5$`P r)H&'TԊXcҋ"8Ex,`쌂KS|g;!늺x{|[g{i%HB{Snl]0}֏~SΔ͵kφ? =}CΝ\E 7{j/tw{OWnl =Gݸݤ n\Q7u&[̌xՆ5 ``ؖ)M"BRW"{g{8w7&{ű[ 0 jo rh!En" H@M6%)\jc ?u[b_xJD9쩾qnqc[ᗚ@0ʧ F+m|,jh/_q1G"~ȣ:(7A #$8u[c`gI?n"O]SYg>m?cT[oz _iLcWR=x4(d aR iM7;:gK d EK_yr ʾNքB|I[o.m~VyD {$9*gts澊0h`;6$['\ږ@b7ZtD^\͈@ qH ݕGHkwIVjZM~ jB<ԤM1FCzFe\/إ\kSLVrbOUґ0$8,a6 M8:X|M9g/ 9le뻏'Fkb%9Guzzx:2@3B&J%TKQ~8?⍖4gP(]kM+}CF0TZfirLJGfq*Mϟi%SI?_9v'?%έoBv-dKcup6%q0J1aΪ^~O˲|{[sl>&>+F[b?~~(*ˠgA_ê.rAM4Uq&=|۰\J|SWj.j)xenvmuk:nc`eְ*S;%:0!{g̩y3GLxn6ؑx';?#[@k<6gf:ArM|1MP-VϘhf5sIԉlWHQ!5ƚ .]:?Zfs0n57y+9b;Ɨ]=*7k< v@]J܏a8RY7&OF[I'sj^}C6tE[Lu^owճGgLh؜+6n _e|w$屧w=M{9t E`l/p{#[~~p h YU#(UȆ&YJ*ה/Ek C= ]tNss;12q6 pJ}HO3`-WU(s @"i.`̀HBfL}Z;qYQn8&]&%w}3>eԊ!<ҺćK>r5p]k"k=5{n'zysz@N-)\0[jJbbִIZz8:1QZ.8ml@{8T0M' \: L03b7`z(ojܲzcCV-oX6i"]{gO|ӣ9EO&+S 1s !; =pڨC X%}`?TP0"ՁZ !Ac6VY= ؔ#WHO_z@ {,(nY`q갎51kTߘPNLeP., 8mlW-tlBϴ5,rN 8]RDͧ`y| Fӎm)}_Y*?*ERXYõKci-ٰLyTW 2=j{eE:>yr@uO@=Wtئk N/xKI^RqHTEj>t ]W  ;,jp&&P)O1e=C騱Xyr5%ktVmY){-ٱ52M+l#6_wZv,7OkժHZ*i&lF)ʫn!HuEY"[&d0v6 }Ҧ.1 Ľ;Oȇ g+ZGG^|}[m觴niQ/ށ\(S8]ǿ=};mڰ>=m&+Ĥ@,O"5p5dI` vKPjAИR iG3~'!OXQ~fGZQШὧ?|T}k뫆i}}W {Iene%~3t횸` 4vKc1*Vc6b9flXpM1#{pBiX#(=3Dҗd\Oy՟o?x*PЙ,&7 9í_}^bPlN2_N&m'Ru ';;q0̤"M7Zi\N3+m)м.GxƧ-Z2횿Ϩ҅X'G~+w5I XWe"k"=͹n̘ y3yҳW<43~}oiIvGU :8kJ5ylxCğɂF6m j{UqtYhJGpYljyOd\@AlΤXs~SaCԄ ;;YJtÙhW㟺i9ϭ]a٫u*yū3I&{^'}֯[Oj>xEGjl~7IyIX(p Ȑ! ǜX}hÿآ搫9E2\.ޠGGTuKebrTdܕϮD5#䌙L2"L'l#/!F/oi\<;gBLɺOU&}T"F-r>8M>AaᒹHÇ4Tz/cB7>ܞ %4-룁2)@cAhM>| أKNo4 ZVw갪By"<ǘV#1.i5[<Д$ŷ4f·'wQ@0D;ɡk y Ӂ*è JC[: -Om%_M+%nfz̮Tw G^13܊֔?Ԛ K]T+ <%ѝK(}ʸ ^pZtaոc+uauenS+՟ oG{Hz2u]y#&a~N}yd[%NMY3 n7$O1D .#fx$/ﱱu%کM?.H,U$S"du^Q2] X9v!6mF5.) IlE8a8!ľ|ز0q۷ķ]uY:lH8Yn+/2+LxVԓ( "9cU< ˴؜ZДe~eJV!m{>Q|;?=5^|d񡻧$~'99}f]?vTw화~|IWC\>a^Ѣ8@C"6Irj$-а$J}kƓg]!K@Kv\Wd`ollJ'kt<{*ْ䉳(wbqP_B.! ,z ȶ=;>8AUK(K>g:˵Qy)^r0SI\b\A@ Xlcyd&=l cS $K~f^h1}o<=(+ocͦ&gYysSҢ4~oɀ`4Y$Mɷt`d,T#r|+S1~ ~-~uL^fUۛM_\HpdԯJBeZJJl*ƭ#31sթM*)^76A@\j),@QInǬȡ35iuh3C_.AEVlNm\,Jgbڌ%B$F9N?+ZO>TO(`:nꯡrr)Ti}lR4!f:q+_ ]cE 5~GO xm>Ԡ[@HY(tf%]Vb?,,?vԫrpf:-gJI*Br/TXHbKVF212:8ˬpߟr5Lc{˓#ᤘ0-l[l&s:/э4{uzpNQ==T\!|KhlБ5TjSPKkzhTV:"zoD'#7 u *(7^Zl@8Q90mMh4D2}%NfPp&!S9|o듳\Ws;ŧH^B^ #7vS=>b^%o` R]fj9\d(gWiP`"RDDږęXp&A7I ҫH >J* k7@&m>_t!<4,nypgA} _]r1RYдWWjoDXy1li2+Mv#lF1H:nJu3R ޱ( Wޠ̉0HQOR |ėw¥E^ssneMS/|n΋ U43Z>< 8FDB5T7Z #Mpjm=O,tbU͏L#`M::6?QI?)LFL AfzpAvG ʏ] N]ςkQ}_T2r50ΤA +5h a额Mk5tGS5Hm |"2ux"k|;a7i :ob|/kړ}xIk|Mv##vM:X#j4]bȤUhFMs!.e`ZnSۦX4vy6wK}(T>vn4 I*NP$2W tT֬R8O<dV tc[fJ#jˆ;ٻu'[τ>9cTr,EǦ>:?rxB0Mq|HZ9#迴;u sqE@3B~ހg7{zPs_[B:tsX#"j=zHMܶk,%g$a*o}[;f15HqU_AYyvz5Xb56DzxUǴƩF-ËϞ۽WfE<a|soa&?TiB @+@oix2 rLqU3oY(67ٕ+F׼TOqlFmilF[!ĒV^ D7h`|PvTdiw2\#:8["#~ǶO2R %Q#:z~7$\7VY _S QcJkc"Q^je+$+|b>AB`enx_\Cᙁ?GMD;(Yo h޾Ն޾YOa\ɟ qL>4Fc)}2ͪ(">m QC~B.~0z>òfaVhC4/Mq' Q=Cr~UGS00s@("5i3* iif&?31 WYRW ^%@8z# +ްJb77QE/R,"[Wom8vy~{zzօ~xpWwI6To\#~"K>\0HpXO, C2,@m2=ӟ rs\@,8#פ7_ZrrJB\SCUE;h9=&2]ԉs6HDJK2KJA)ȜTURQeK59>Ei(ΐWk/w:՘C }'9 $9{V;d#N w9=--iղ 'ΉQ a8=\*գ8"HEYu7Qy$%Jq:Ĺ, GYfgI59n%#D^5}s01>aZ{jw#Iի?.f/*5y]wZWUsKo\M_*]ZAS@1A24+#sA(vSCHgw”-Y݌66>=DJٲbb%l߻S+{?)YUN:PWW_NB{6ƴ6dXey71}9Um7Wo21]c4IZv|De}d%RLJ|sX̌* #(*v2bV Pl<.d ti^1ߑ?1aVO:粻G'*ړ?;7N^r-)BqQX=,zq+>x$[,d{,ĸIg?$ sys{|FmUP 5\27Q5X@cpn\Q6%xeRr"Jluo}Ľ}#?yㅜ; {ܵ5}/vAvRm7ߝʻRy۸,iЎ*A,.o3 qyK,.՗̑#7/R DN{h9" 8 )eurMH>S₅ӭI:)ys  ٬p-pְM >sJ9!uYT1'B&* L]``ժX!DLnl e'q]i,F&=jsѣ jMkeO7up,;eW*v|+ZnsQ{(b%ĸp_2ۅQ%zJ1%ʟ)65umb hd 1PNAӤBVtټLh!vVMIjWȓxM|&?W2$LHhbNH@oɄXDƈn r$I/=sO6MYZ<<ũKIs rJ/o3_ϩd5-b|lxP 2>FH2:nt!灊^wy!,T߾Luo@cŪv( f!lG~'HuM@hI1]=e%%3zPň'7˱)fx407pMEje~qw=b^:7 d~먼HgBm,rj@ zQrF(*? @+[G0pH3;3\҅$W!>Ia3)W0Uo0Zq{u2TRdEA)&aV Z|= %995c¡=T?7.?Y|w4e63M)*?D{`{b385h4%c;N⣃ 1hBaJ bkƤg \cJӞ1e!#g- &wZvsq`fHЙ [l}kv?fKC.jY\!gt~_?H~3O ^;qaҲ9.|W_ pN ]"0JJ0#!BglDsTLCq;nvtcgΊݔ19ɕ):?nF*tbsQesa-(1@ ]ӥ8P/f$ǏS9"fT%D)s^FRjʮ=:EsQOhq_~p_cNV(i e9uɏ@  $Of%3\ Xl uE+7Kb-Z\PH$sUI ɅSdvDܰri@e e1d.g$R1 ~6w叭HcĴmk9ȅұ#2>7.W`} ƽɺi>̈vT )@-T*k"564!fxPPAܕEEͱ_2՞PDɬzEa9jlRꭉJ'ZNoX_ŠS*^asiEy7;8~βy/ܞls}^"#Anس 6=[~J*3IEN[eEMHDEQlCƐdrr!sN<塵g. # 6llcGΙ0~?,t=? M״TD JǼ5FaAPM%Ʊ@zeRzXDβ~ΦWܢE{}vUW^ʑ-}[˖N0coYGYM4`m XckGNLmB %!j%9qa[N\Dq2om>fй&?~+bS=[~+=۰fĹ|˦pPf9,rcu F=(>z1bpYl]QebOp\-&CWY0@2.[3Bxt,7٤&7V觛=6-z0 )е%6γ.Mϒ=:8r퐱*ӳz_f.X{|J1{_FP#:WSCM=C/4xOԞI/e* jMF۞.mR\CjF;14S?=RioKuxͅk^j1#͓+ ݵaj߆`37$&h?ܤRXd:@2@T:Z(7t]a<93wSR^PFa,2!nzbϟk_ K=4xD{8z"ZLZ:t^;oWĪKXn!OZ^E^G7ЎW.gImȷ߿%I+/JC_ߑS ޟ5?wD; 3sPZXCi6rcu0z7ȩ#X.r5QP͘>j6}kרi5ox'hG,,!;۳#HvϕQN8I;8| M$QBF e}l jw&YXei͜x2-$g +s\AAlh}=YUCAz7c<=qj z Fv:KJXmL]>8Vwh1BKN_x~΄h;L\)fG]Y ]-{1 c\,ޅqZw~ Qcp QlA|[pEqnKD!e0`UTbZ-P(\` R(ʼ2!`C]L rA: >M%'RMKF dyN5'HCXzcy.X+#cH2xv>h{#Dzq.h@s"jΔuəࠫ^gK _U#P9T$bפz:ԘK{TAR}b+Gr1O5$-@?L^Йŏ<<.N~݃G RՇP5MB]HGx2?R'4 ;Y|_Y|KzLk$th"ԤRj< ҏɠUPP6jT2AآF=ڜm 8c @a*@.$!2HƤƾz,;+A=c.5 7$cT*d𶥓Nw#=c.~$?6k޻=~0f7I["gau_@>hs,NKb&T>TJӚ!N0 ^Yw5\ŕZx;H$+.0ڴj9sAzߦ@Ğ|<y:凌[D%dx #5r$T̤aPfU eHa[ό3M)k\SѡBf횮1kL:MJɔ)jȨɓ3fdC—y˝òxE2Kq@8Ha lTR6Du ]`liA!gQXĐuKQ۬=[d`4dd{BFd/ ;ԙra*,&Ru6 YvÏfv_Ae ȗ@x*# J\y⢍2G,z,~5qjV@^&nMbԈqJFݨ7Xmi(hţw'+Xş;̵3adIV *N\[/'+ߧQl>ԟb$nY̊PvfPhc'(tR*dxХNGXYD(2!脐;Tgt;5 slEOw47fi+_+$4L:oY8]Cgą?G_@R&F SM%مmv4& rfV𶑤gW٦{⻳Ω|`HϚ}sg% ŏ {./6vj^%lMyQ;ڷg[Ok c7E\Wq~ka(ɹ4fG+#S9F|\Bg:\Sd\N߫(D*m14^vcj1 y!&A!/x8(kD!P4.{&.4z(.@iӯALR:v\\ǚzn ҇qI }'˺`쥝˺t3> Ft1CKC 1<'l fvE\DUjX?!Ni @7>|;h(^]X*ޚ%0@xdVD́hۜӒ>ԥxנ>8-x63-K߻M2#x׼q̳FM(oY^C^|+zA-wrP~>s-QݡlR܉z~%GHa.s%:[O&W.!_Y*[JBS!]Owǟnt멇)Ї.To->5tIq}baV`B-C]cF椏][ט\Ԕ)d@g6ԀJ J=kUZw57I5\qMp&@_y#Anɇ{>}zcNxb;F[Zzo-7wϽI'ULD$Y ;f'*9GD-d'7ǩ\|#ar\ojᦑߩ0OWZ|Xi? ;7``z! A Ji *N #}7}{7톷Swo( tGxGg5KlC)P2{%"$gxC66tJٳ^# o#{ǻ)0i4ý}^S`"| @g 2'@,*ǃp^xy3jgʶw6w{%V_\s5z hsGZp;H޵}m,tC~qȍON46?/H DzOOLVgRquګ>ZД3,a_ҵ -b I\8K~f,<nT-4؟I.?9W 8a QTkȥ*ܯ.JE~{R1^J/TđXqz6J~:,26+8 :o q&ԡ_=q_ƿw1SR٨82kyk׾( ?-dte'.1Z< f(B$EJ푮Pn_ȤlQCWmATaԶlB;tvC7iܲ $jER5!me8oĽ utsxTB$3k!K\O.ˣ4:9hf7oU$QA֒_7VZ i"IeCyTLT.Gfa߿!?iCk55]L?i|7b^1Ĉ4PhTYhXu-!Rcc,$JCܤ7$"\eMDoL'`0. hVj0NQ,9NibR}\V\sŘWo\)Oޘ>ͿmmOE3"ep.Z%z병D2e`C=.XՊ$Tac}B71X^zÈЕ-!AmPȈ/+aR G(_ȇo[B 暈ߛFzē+Wmm~CG >zny8`_(-!>DBtqlk-_}"_gTcCI" Eֵ$\H0Io8X~{̾$36 Id!#" "bDD6Q1g&ԅRhZT-X{̄`0s=y9y׊ŭ- hb\$*9%Q WIi:-oMUbbA5'@HlI䍳çU\Fųk\Ӈ21/;6{vעCZjrul<)PP=L*x= y:HjD Q@yb}WEu>ZW^"۟RH~qd0A! [B!3) $` MFP!Fdxݴ 4H ZId,NrwW_yaФ eu~`xi|f1dcx\{lkswB\Cx'?Kȥ6)ROē CBB-X(^R@[x4cl-+p=_ci)-!^m0 ,I Iag,Wd^m;'x/72_RDAߺ;b%"~^yx`+Dp  GzpZg bK?)2\,m37) QB Ga*0s;:b|b{{5Hl}cM'umb9-K- ؍#V#DS\ ƨF4@P._3zPc ~u@Kfa 2ٖa/Z܂}zGeLuJkl NH]Af=vE|/ IAj×q)#A&HdT}7[aQ`r4Tg`!†WNޜX^:c?U0rJm4#GS\HDC@W*ѫjɩjAk?֞ DUG[Wr%(ZTm Oj2al2|!(3T+A#VL$h\%/1msHW^yTʜ@O(JEEƊ.mV+d *`0݊||$_!I-}\pCv7+~d ݻoķ欮4ML+jP{hܢ'9G!BdDIrk1BqDȈ1_, NZ;IO.,h m U=P8X oZK+~uNJ-O{4d=V(M:"~r`%?Z pM{K)ɛs09ˆnע›H%p䲝 ' ''>\Wl 8E8q' 'kE^4T+J JN}bDOnEEM׈:F %# -n}(׋rfyy AZiMfZ /TɥQ40 "bz{>ۋsPk=eÒ}ڙb L JBQ:Q6JG+΀Ws&FOPZCo*$ fE - +G@I%y>A8drmTHGw^%ktG%r/2:qt\p`$:ã7ܨxyCʀ&bKe~S ė&vpuYk1>BA'Q>@}K}fdq(*$H‘ 1|xܒ rLaA^E!+8kjzB[T$@="~Qbȝ9Ezl"6!`%"\IޢO[*B,:e _ŸϽ2R}*c^P..d0tEp'+ܬً%敀p#n4mTWGIk F+<PMP41%X ,HYX(Z'nd@^ mASr.EgI"BQKy-'> w^ꅕSNX~)W{k^jB-PW$=`1#*\\PrKFb5 qb'uR3Iў>&饁Tk &Cvk3ctx(u݌\N},Vg Id2Nq[hoVrĶs,9Xo Jw.mnoiŃBl霣b_9_{jyxs\><:gY4v5?T=!rյ2@Ѱu.*hj9v]Je'XXn)9fBA+95{hs"͊OE[Йhc>Xr"Z‚=ڤ;/GL՛ m}1NC kĶuTwCb[oz/zʔL["ʔ|L'~e/&W=/?&`f i>hg96OUZ>xS/w>Y΅{+Pu__ 6x `(Ec%n~^Rw⧔[)VҘ$Bd&5Sbx $%ϓ} .|-F-GʄoR)ذZ]?[| [I)X:I`%%Bz=FVm(E-v|;ӻt~ZA \fC/gY3bP굆tlXP!OXٻ!n/b=ZW~E&ɲ=XJU7i37Vchpe)?m;g%I9C\Pjǀަbzy 7P]?*`` Q}#YX(5&AQ[Q %Gc ^$ZvW,6C'gíUM,h? %#l3 hN 2-E4 &IBojlWg61Y&egNE9h yK827/ijhBt(-Uq3c6+}M%ive!hZ{Q%uaf#H iy82j4Kznix WïX j=z Rz<>5#V+-h>c-^GO3lAcR%G/8#'. z(߸]!QN'@u)c! vrh6;ZzH'5iX"$WaLsd9GΉy^ϻʲA'F\[n-q?[hF!q$٧jT}|_hpI|_"z܅o'4RP yf[59k0b=?x~i'܌t^H w1U-pなl!cB⵿VI}Ljxe"}G< , .q_ƒW(03H?~ Cϕ+Սꂝy^Ct%dʻV$^UB=J FTFk5ْrR"XH4>s%ZjW{fbpʚqpz*ɝݞY.I`@x!egl|RֆeXCx%&O:QSO\Ґ7j\-$g=yeяpIH \'] d%1hW5_cXH@jЯhvGi\{˒Qx|[݋󯼴u&:<{hyJ7#H̎5wc=ޚDf$ dJTD43F/8`Jk*lIS[S='cZHeXE68&Ee:  f"YF˖ +!@Zw)AqvT/{rN!"wIܭ׶u~W6Vn#=N_lbfVI9O%OךGN$"Jl1hmzGZ0$h*f3=,A5֔T?%o"&^E@*эmqr~ +Xt(_d`<'//:ڢ&ڤYz 29;ϥ,f>FM:᱃/<@2 Y@;# 9ѩh{^DeUѓ'Ƌ_o  r K) >K  1?\Ga51D>G=bm ynv@0p4Y5W7)>'^1=3Tmh yݰxӴPlH;(ZNZu-i$EˊVTр%JK;%k˚8\AdbUZ5n ti .hÊ~fIa tӼZI=szfawY&5?K؊Nt[V܎'**Sl9}Y U3WƒjfDT37J5sjW*s l4wiNutb8 pVKiaRRitHIV8Y3躐 ^HH$M.)2o\7qؚ?Ail};eϯ+aT[&z7E]B!޻aTH<Ik藍H-F'Gco(:#*#'}(v k薇br_XcG(Z, 6>TpDf,l˙g>g>]F`j)qY%ţQRwSuJ@&W,#]L&L>|Ns!ocQ>r !1@>JV$#Fr)fߪ aShNpx/Dɏ>&]r2% V[>Z)&yUOtȢ̖Ʉ"^DHEm{Nz3{'meO_6|wz/X}}~~$]ﱆpx0IcǿxH:R@`.uQM;d49(/`pSB7vpy¥yM:hNo׋Ma/*[VRYaf@G쑌Yr&&pZhp m9A>NiKi6{$?n03FeW# }ӋWŞ"Bo i,gkcNGd%Ddd $o&G(%'&Z`f8d7F0MZ,O.W5yC[}#?^-W_Qh=;ɧig7O4Ye?%K*1DnZ@%ca?ZɯhZ[Q\7I)ﮏ #54(N |uwL D|❎.c`[S8h#FPⷫ%بkjSG]󯈯GaR} kX'::֧/__E~ef=U[0X%b q㭒OՖ]g nT'}k7[s&>+~K\!7:aCֿH0R2ˮV|YGPκH^B" A \ W´._7!UD{D}8,c'kƗp+;ƩN)"Aψ`HYJfQh٭H'~/nXGӨ,DŽCGXbGn`)^Ѷ}ĵ—$OK'$6Jֈ4ANRc2Xj ,N2Q؄H:mV42>_YƢ'NKÉ-G-3Ī#ؠ֧wچGUDnḶ-{VLzb 6| D+}:Cna('Ac6Lۯg hUg=jgKH_Wp ^ә)If/^^Ev; J—# Rfy(dhY vdݻx= Z-cu>͔t^_/Zpe#>'6>?+${2ߊH=P?~2]I/sb P4&)qPkmN2EHp F0tGOz4xHHkA@5bϦ뀭B"/OVNrk]un}x [ .;&tx[/,#cK t}LҕdlI_AWصTWd9J#|hOz:i HitoFN/'sۂۏ'1L%s/>-X.T't*bEZ1+W1Es\ I4:| ϹY6F*o=4>gE֋Xݦ?,͇'>XӁ=5KRDPE (!#Ѻr7{[_oMc}y[R {-Z\'/JnܙÛzm^f}sWأ:|wa!K8J2G)՞ i>jF4Zd)i8I(6GN|~i1O'\DڤwZ[|J"HHpyLDړFzAQ9G_"ViM8a'6brs7ܲg#e`yRZ^@i)-!yu ȝI iX z`_phjHdoAOCP/>|@-)%htJ|sYKMi"^ǭ45D b03 ZZ_PcX⠞d& l1| !ǁ;&j (:5@)lq(.r$gW9, l:X#'Ą# VO gm/kѴ}kQ']ā׽kbgsfrt"W6%IWQ\?E.rꓞf!)_  rST>v}bݽ)#6,: -OPArHNbI$~om(ԃWXi6H[tzB"R]\bJ1Y\I.f.^\'i݊pcSgW-tl$zb޴/HrZ~~g":S>$5h4/-b]Tv$ŠŴ/4DZç ^\1 PK_$S\5y6#%e `x9Y B=/!K=LĻwgxMg> {óh~ֳ؉|6bP!-CGY=~%:W"b /YQAPPzY~)~(KوYǏqFc!a0JJ(_x2+ī,tf%V25SœQOZ ȻgQъ߱ U5߰3;}(Ll"gd dRW =RWIPWi#Yo\b|b&&x/t? ^>@ h՛xД:ނғ 5H)<:Mf;Q5~OG9ow Yɧh?]p95k[1HC/Lb&8(]VZbBi K?ҎPVPy Y_MK2$ "YNl%I_VkxLy5p4'A20x< ƬNNQSHyEXWGyShkI?;owLٚtǘKRnc{)'<Ϟl4wh{?$z}coQ٣[5._{2%b_H5e%i8," {8Kj/i/xM֦lS`|2$WTp42AG䕲đM qRa<[P_ t)e)@_tQ_tv'?P3W5rܬɓgvm uwH:u8, 纨<-}vOb ~gS6e>v<|&υ?r^42۱E!t+K).;A^yJSj(v8Z(V<`5mbdZ)b-(䒀 UQEK$FN*umg׌ց~ {?f־_? UatwL+ Xw`[9}̂;-(+}rI^ U<8z9^Țd-""^+b!`u0vlHtc@} Ğa}QMf[7epLY掍#| U= we?ESH,Uu#t;x&e &d  4N̎Z OLr:;eb{I9%IatVGbR|pqѓl "wl`^+k8't<0cay# `}[Ҳҽ7}iφkq{|W2.OTPDnek- b94 d!(v ˙O*4K ]+lr@PHR2ҕ`R_DN#g@W4\uH "$l27 pK€YuwhYin@xTyb}ѽ԰im6-gȉԗ~Y "-}XϷFGF9-w޺Y>3 64u A1T1d2']WNgd-A. L nO43ạ'ʬD;U\%\x8$v5ً ]8(C{6x)!+%s:[Zb#IP(S*HRwQwIB1_.CHI#%[ww2w2ۍOÈ&)4%?.)/h&&ɞ ٖe Ml$J}]9fLTƣýbԿɤA+% qq2SN14"|OB8>¿$bASZOP %&c$1>D3.s_^o4;W(nMay{mlRWF2~)3x/Jf=TP rN} aB  uf#ٮS : 49FOVr(J7s^~O^<Ǔ?ĶkxjfnHu?*0Qᛯh<~γ$ZO<!kXMEQ%;S  e]WEQ5>S hI0rQ=~R4A-qv*MQ]MqG<_ڜ`w-RTއ绛'!#Ao7Q,)PtKpN ?$?t5㆚&hIߺ1SՀ)PziiIt)e&2z]x!% JUֳ#k;K*{{-WL(:m+LڂPb'O2Ts.kj&~.5Ȥ扟'!ڤ;C-U`B50)YpV #o:a{iO获~hRVUo|V>d@7ݵ n~MrHc*`Co E:~AH+!<͕fHr ,%$Q񳕡N /q!]Kn$4 X!xvk#IYEr"s-VA"%)yx|vrA+Hwpw!آ@}糎vZ-.7FMF'LI!dYdx BVieGfɍ}= ͒.Njdk$OxpHQ 麏~FuX5XגXUt0bn!"N*~=|>Ci?͋'6z9+<qoLޘN)yEE6(8i%b^HVUfQGGoҾ6i}m?D@vDߪ(wzC,*ܿr>ȉ m$69ߑWt}~ڧV.y5h"1D%'ѯrڨ牴ij=^jz~}mOi"yA;T[; OْmqD˥ϗP}X?'J}KsU#*]d<*4n&ISH|/Mr4Xѓ$~U"4DrƻNi":NB>Lc4~[i]XuHQ"GF%_;?@o4~[#!WDCe=I"7JUɍ(NryiKK;o?iE(~>f<ȇLM}y$Gɭz"}FߋbVE~ u J)/Oi?qF]Pr}&l",6 ?U0șeKE x3 u1>YrMI:]n 1J76I2cSq3PƆZh_G{l _g5lbhYebx&\wHCϪWLm(3 g%G܇Cyz-r4|lQMqq{*~B{ ;ϔJ8X٘'⣟;W|CY;-~K_)4YKwʝ*[陗ue}3bp+=L2>9J"&I#Ɉz_"(WYNUy{R"1 d}S$MݤfEzPƨ L"H1K h\[Ozq~ ~|TFP^-G5F/A" v?t&4$]ufYk~[a ގAHKt[CxY>@r-ki |Z>.C!T_ 8kSV BXTK#qx -K1Qr|$,~ߌ'[^~u]9w~xaٌ c_xok:TXfL nrmϜZp/tS}̶WAYuJ:)W.Z#  d,dcx3Q6nc+Ǯ֎׸HB.5ge8~}A>)Nn%+{e7.B|=t+ZY$O٬xWWoM:$oP:-fޙƩ E*-JNBtP&A kTƿ4[t߷S-~ђ9,p__n~UY<̞=gi\9~l{Q8%nI>s~؁ՀeWyCQQу^O-EԞ j, K rM-q-M5ФB)^9&`Ձ:)*?U=XlFN/«J=щ>_Wwqc;0_j 0Beoh@=.y&߷jovɫ o#s[#IJ,bꨥI3 G:#VXMǪzImWɬ 'JY |/u#"rZZ'{S\41⋹$ "8(Ps4)53T!L[S3l)$"JPmw;aqo9+M'_]ٯ|G/9w΂;ZpU?^nTx;s"Z; յON^ NNJDI?1 K "IH!UE\ϼ@"JJd.TKd0Ǩ2#CiWmsGՋX3f`2iQgX 1mؑ+<;ek_>Ī1h؝46Uy9Wrh*& Ypk!2U)uȥ,%Wgi4/KMz pl(� 8L@yUp\)![ =/M4>{1ΑUc#nyv,W| ;@c>ʑ|=s )O)<SPmkd-*j֩ERl,f{$'V`3?XX !#|R@ԛ!Pv >8?GEVnRZ_tx 蹦spt $!W9u*5~Q;בdtE*ЧW45^ `iP%x YAr [[azI_TF8?MC{f$@NU cǽ'R}.0]EI [ܐ4q8{ֻ!a⤚}5j~ŗU-X59;a}+i,;֛@iVU#?aX/ LжeHb!Ȱ6S\J#*CP@7r1@W<D;MZp؉BP iĤ-r@r+"( h.@2 2L;ƛ,4gKWѺ}"Rc):n]!a>;=ϻ=2yR8tп+@R}zYa>Z-V:uʄ*D Q( ! `!2;"L*YILB&tL瀻Y% qD"3A \w55ф͂O^9g$ΚXfDuks\yn 6oL* )#w)eiU17d׶y{WV Z f r )ձ2"uT5 $6#(h╕2a}K\Yx6]ViEC؞@޹zSM73_lSl.ث mQ$Q`i *P*ުvdlӠAt{D>|>cy)=n\m!;XSAdO 9Av$Ed-2$,@J#s&ص3UIXcK-^fIE% WZDVt]eSUN 6ihQ#]Ў?oK7~ג߁޴F7B3#U~dSM@]R1D90@>Ҳe )gCO1|5H>F.WN䷫3\fJ]`O7nk=2n=B3k惴"$X* @ʬ㊤XUXxyDjW{&~N'^9ّNM2Ԡإ`FlMJ +Hj?2}^kޗzG?zj=&/:вgj,wOy/7sS;nʤW%:8fBvсms-jkAV3ZdmɆmv3?d#d4hT,԰HxQX,⿾[d]V~>  Mإ RIdЕ M7x`ۿ ӬkA x Pi=?Go 8XG;È[^n\x*{B-!)1)k63^C( rJC:oﬥkjOJɋ`JYxAXĤ으G}qfIx]p"ʠ+%c{n1<w닦nxL)E%36*>dշѫ7vF+K$(yf75>/5 .lߛO΋LX|$J3E4AP] ::>ˤS98/ .!fQlYëWߋnD(o6_ {96iWaWo0-@ϡ^~& FwÐQ$_k"P PՋHg8bzb-W.G˨'؋_C+zud1P=\ԿU'\"PDԯېq 7~,xaoԼ}ޝ߷/ga}dh>=q&|=CW 0/:M;xꤙͭ~ o~q`R6dF46Qo 0Lfz 'A+_OS%0N&(ߠ}ckt$_j J_jO_'27OZ_*xzoKSZ[5SB;aaraKFt14h|Љ>OhǕWi]_K.gE꧓_4PԴb+/*3Wx2FƊt&1~ g`&2BfY0ЇqT㞥TM]@gQ3obL콸LUfdb,"(>+V58b&u^l)>o֛3n(p/8ZLoշLPқ la*xqk_^ hbt&jAoj+aYTZj ͘DP3](/ L4 ǕG;羹$Qb[QͺrV)iڱg/n]EFyX( ngpٚ^Mu[u>lY[k xEY.6[PеWyFWf2K'*~y cV;wnޞ;Cfh-6xvܺe-T?'\?V p7y]32*%]~|vf zJ|io5ɣ]|d&[Nxr0߄Jxe׷ݡtFs \chg {ێ3tȀas1mc١[|{ ZPWԿpԪqkwlӖoX9E!!ԢnF$Q$fV B ]Yxִ0M; . !:ވ6tj;61oN4)4<Ps+ix,/m*ׇEw(B~N 'Zj?}r}0.JǴ/POXSgE=r}S#}|vM ,| o r;OD<_E3^ƛ(N`Xv͐H(kP'-NԝP MDuO,XhW*޽W8P=nxr9X 뿖I"x0VGpE%~aU96K;JN^5>4Sw.+˷Iߝ2.qo1^v y=Sy;{qm'σUID &"o`߶vΛ{;.ߤ yKroϷVO xM Ŀ4 Cxg]{CY׳m}UlF>9Iu9ܾf]fOuP\6wY4@-8]d`{@,, vqŝ֭~U}y95OU953DIHLhI 3R}*2!X->+Z:)\iQ\wZ-`Q(>!*dfZwNiaE87H!AG*O6s5?mbe"nAxWgdQ+MRIOVt@;,LBnolV[;=0}kAT[塐4-?~'fL=}~zVM2UXR/䛕RB_ۃK@HZsYЯ)<ɛzǝ,g=g7rT< nVBoڪRge1|+^yum(m]PG!"m"ԩɕ{7HiX^>b5f(:rQ=X3sX.8a>#$4J z]B{CQ=GjSwwԭLFU .ar]->o|/+9vN6۹2rk?g҉n3Tf=K%\IEk=ׯ'G毇N ̪( I[ cIveiE9lߊzëeT5Rxo=.mG V=!FSwEFтG W@Ȣp!]8P-,D$?#tΝ%qK,|7 Fԇ_2|Y^Gw(_¥0Qs(@&7`_.a8b7 c4M7yx㿺NqfGqD@1xHۘt1:.EPsXeUe˚6huuCy6Zv PtNDPCJs fN4yc# ħE=*#U=h`Gs[AT9K!6A--tM'b[R; Vs⍞pI&ԕ*KI@PM-mf3"%C=AR{;RZ,+յ{e]I3U 'lp\4cn#l&)MҸ}Ⱥq4Hmxdkufd?R_\L WE`kN/*T])GqbHY 6 P ĕaʽ)$05 Wkhn,8V/H'RYcWjVri6 2"UA17*ڇ $ )x^\]4Sۜ3[B$9t8( yMe:[J]Tl-M@z |Χ{6Qj9yt6fym`]~Mڴ Zz7$XNié|ča.ӽ2b [EVl?{IB3]-1v3ޜv`Aឪ ;W܋vW!;XCkjvg{mwh6&O#'R ٬ћi?#:o{?v)_= f"uK3;!:8z:U)c萭] HNK֨/ <-84n%ʖ<2M[4I`wIy$X/==wN{=5fH0HlzqAiBPi(x)xk-(߮ę0G1('!i72%+ LIڊ8[Ͱzʜ툖/ؒ?E/BdNvQr˝ʳ+pc3!DZ;s҂F<wD#DI\#uU 6o~5VoEt[ĺFƷfߔE[6Yz9<)n.}y-;HY>GD8>Ն*WjeOij/Pxk&Fs*=f,_}tcF[#3&07S=#r:A< ' Ծ%bm|{ OJ2m CN 1aj^t~_k0{&ɬ)j/TXW { -d1i9]%7 'GlxYÁL~)->//*o4=Ru&X0 :C7/w)Q1 2jL8ٻpqI"#--2amʙLSǖF8} n|zqcN5 qQV)˛7Zءphou%M-|0 J~XcUS!_թquyFy!|Gr"a[+3us<4U(YգYgDfuL|JŊ7/$?g v+F[lG$/j \grjVg ʔR,7dg]$Scdd0.&Ξ>kh)d߽<;?ZVN{MtD ۡAe:Nc),ۄ#g<~KI,@"[bN25XaVǨTdi[KfeU`P#lQ'L" R3%2=3p;3weJylfV_gڹ^pM\sgnwɒ3xt`]MV VSo8}s-}{O?$+痉;;}N9RV:xg슀mz5UF)Q'U\fw|Fvsk+fVnIèARɷ/+ۆ.+[ BCXgo+kRI{鯊4klJA%λz$umC>\ugso n}e7QD aI>JqU(\ڽLћURѩ}) *xPlѝwS x\h5fwc 3Ô1^o¹nY"k(o"\Do9ζniioY#Ho#̷o9^^6~A0G #@7:zLtE q)zB-ȋBڞ=`/O67fro%߸5*G3>R pRΞd!zCxO5G@%8N8%0>=h>.[&Xlvkqk?$HXXkkPESÅHgjSPI t$6Czd o={;WhȱnT8o$%8H{9{ބxԇs*,B ʼ 6A>| WZV]Q,;3$/*ϛr +850եTZJlUr[تD#²h\ͪ8@\!ŋ;>ZoF!!TݡTU{;ookv:upl^oJZ]g >Sݲi(*s:Stti;f,Q;zi Xe\b U'%%PoC5o.yryp`E -H4'8pfbo0JooX*JV&_E= Vo2 IQB钽>3,lW{*Mǽ_wsr˵%:izJ{sj9*u;BoӦ2jKX$V mk"sfS0&Mьb IF17zJj ⴪oZfZTm+Y҅Kxtvѻ*א}Ȧ`=31}{nؔO񪬙ٹj&c+jDk< Wvժ0^Ѭ,UɅ&m>+ƹ>[yO>Kda :c mIicS8&HE^<&TlvOKc\+[.*7뎬5+A#Q#92Slհƾ6Ni#mjY0&mꟄY0~CRx-9Q5C"jI8Mo` і"\7heo#a8>pD@d|H!no3=hB"_54.],ڷ0) Iǜo`sv;$U1>SlǑE0 ,l+bJ>Êo)W'"n !q__tB G3{*a 40f ?)__4oCv&B "Pc #U`W)ķ³`ӾaPkB\ x8ihָ$Yhv!*2K7g6/o8rgx.M *cRu}P19g*⾋JNޚpԶ]3rmÄuJS E/"Y;WHJ v(?'#_ gZm&͆ZM` ^ Ko4Ι?߻roj~xֺ)ޏelA%*쉎za5ƨ;i*VRBs11zYiAkP2Jv\>VA; .H8 PH~} YZ6㗛^O F  I]Lju]جR(v> Fcm rk:/.SIJ?}<.c|r=M_k򓝄(&1w 2v[(z FC-˼0Oχn.4xچyybk /qr cuVSU`ϼ!j%c֟pӄY?X"8f,;~։OXJÌM?fܥN1>0w{5iE}N \.Bx^]3x5P3z2p# y2`&y_> ?'nbvg_n{w= yJW^-Mfal={m`cw{O *|[}ws;}vs}|۹s]YΎ;;찳go9[vg?k,4GH30l:+EŰX*κq>2p,e&̴eױ\Л<Ш|0펬X'V[ĮgŬ n`%Y)zY/vhͬNk?,} ( Vna*١ c5V6FC`l%[Vl{mgOl͞bOgسl/2ձY=;C({Ď= n1Y-bO@D*b y&=*OcsYl( dyLΦJaX6C{3l:Cjl{{W,r+{AN.F+ l|\*fr SfFrԃl{me?J~+͇j>-y (Aj2@xX6`j%f4MH P`TNeujTsK;rw<}sT]2TDZZ^Sv ƒRNKAP?3TSn{0qc0gj3&O52xSTa,,TdmrԨv;!>UJ~*+^3~]\1,eTa|ڌ9RxHt;b9v|Ւ;{_o\1'Ѿ5_[󫬢Z-EONxRČ5snq}d|X,߷ -^i>I U Dcnf8+!8xձR^ڳ'yf[SQ=S=Ҋ c{MUƷ3ňv*Z-:,gʐ: jB˸.p՚ӚsAUjr- gv37.-2o5xƸPj4ӸBЊqj1xl jq|w.-Ey/h1x-Rq1Ӭӥڊ;t,(zU^QQ0Wi[!̪>&ṒCI8>͂h\;t'pXQt0A%@C-,IɁ@ hh;[br$gԬ< )Y &Eܒit˄[([ nq8|ZKr^PY-ԢDVY{ꍧV^VsG}c#ڎtBMvIwn,^E%Yq勉G먋!^C'Aŷ0fJdVqRO]Zg:˥IE:Vi& !cv$SԴ|5%)MA0M!থ|5;š^P{\L:?_:ex.-{VAA iKC$;{.$VҀ֬X8QĬY jKu񀳽TةsQa`iL^nO|3nS]җvڣw-?iΝ KݹĬЮzQx^ͦ'v=wTh_s,js{퐙$w fN4.dQLe&d^\&x<ʅ9gieQ shN@KCKe.sZ;\f.hxwڝ(9!CbZV>0-:|JiG<`4bN?u'>Pڟiv@-~ྵoYښ'Ǝ]S!~?-~bt"ۿzȋ|^ :w?x?:?~>>dmML'Sw`Q4"Y UH0^$dCdC 1̓V/`RvN69-C,=pp&$uIMauGIQN{`H2KQlX)E/tۮ Fpɦ~7<I6?|,0{0t {킮)0( X!bH՘H0,W.Z)1QB!c"@hc܀(-҇FVIc|!J_W쇰c+v; &GA3Bǖ}XbmlW.klX5 [:δW.&։!7r-ds*#3 W ᕛ$J m\?mϨߞ{o"mV7?tX'H5{%]b˱.?h@"ZCRa8 A3]X 9 B#Bх} nw_U88Ló`WV c@@0Xbb>Lpj6?3Zh V @Cl!ŷ$qi3LOәsCBs,4$,}{iUCtx%6OAf`4'C̭i$2'zANS0@(HRl-&&Y&bNjLTc$[D :$ y)(3{みH?srRub/P_yw~(+>իSqm;%ւ09_in!?DS$ ]^lO[>S[[ؾ=vċ^gub-a=]oIĂxP|zfG[!6 g .^cxi$( 6 `()7%I{KǣcNxH1f[8=8A4VQ&ϊxLϪ|,-vh $^fX{Jg}7[J?xOt$ykx?Wz{L.M?~C'-.B+{I$!' pb8 ΐ`'ኁ*˞%~U~~tGv^Br}G }w~M@$)pgt} (\uDQ05'LsINbm);5 O?'U5Zޅqz /DA'{@3e"B5Bu Sʩr=%n6fH/ edhH/d mm~$Jϴ5-PM҃iG(J{S[`;^$D6?b'mHl0jd *QN[ov[QN(g2NK [v{W?=oJ)w륏aGW[z]$"pT~݀#,  tܼ{=@v4}, t Hp WM4PZ}t*$]ľB%On&8DLvxair& I,"[0ߝRݡgwN[wJU- /hqfLJ20B ("50 <%L=5¥2'angO v b)I+VΠd!\h)~ ѐՁ?:OmfD5Y3d2^P9KGMoZ1@ ΂908fƬ 8f4;5 @VH0fLyu!!1 s؉ ۭvKLo4 6m ozE7 otee : mos^G@OfDnV@~Y |>~>oga.7[}"% z>Mê9ƹy &j+ ;CgL%?y'i]fhX0(0#dtx 9ZO/ZX_lUJʃ3.xM6w_g/(~/Mj=V9{3ʩ= y05 Z4",6C,(j%*Fa^ c;HA\ٺ[*w<xۅ&HwK>ӈM$QrFb,~81;_9%šht0h7OBϩ܄s1nsTpZs0 [DLT4$]A|,o샻wg <3ƧV^i`]ʪlYvˤ]\7iq+ğӰ)%L0@LdhsMM&CM٪mJ=ї:s-a|'>TOWqfԳoWČ1!g&&Qf~xJ8kͅEIWJY$g̡E|HVjY-긖IM>~䕥 =hO8(ڣwy+LqMˡѽ?Gs4U&z=R.}u8'Z^*ZuWDwnQ M>8eAln->aO4F{dds$&]fn)mw{ )b'"6. #);r2#q`*gq^%li}im<'Uފ1CH >;vz?QB4leA]B$2)BEIQ_{̅aޕm^.IGCKsBC7Cbj1a%҄2P)J_͠!6!3.:ttҳ8|'Mƪ} KCHy& Ǝ7=,^ m4؆)t?$X/V # L.<P0, L*B0bVL.!)/u}̮{Ndؿ`GpsuWygʪ#Mk݄ohSы:B_t>l:X- lFDCЖF)uEQC}pk~2Ϡ.Xʩل"Boan_OXEt{/yG:G(Xo;WR;\?_hXB7_LJZPfyG1m!9ug0v8KL)XqmP_!cB}Q,2c0%:\S4y  <:DC**:9./mCkKYimY.VXGJE%$k#NǍ+hCEfD9s^7.,ÕM9`d) nd;If_.-[c׵RvּKmЈcQhɳ@o喠Gwwo>1skޛbg|Usze~-_pgmk,_Zz%n,сL]b+(GB: 5oLai!KIukYԮ qεPtb>3*b';]4a\ƭpDc~\ ASL^L=)H4b,2 tOӻǎ5M]>ӥO4n ggBA+:-^<$ rZ syKZ(#`-;lAIɬAQm9i*7إˋ͘ܣ|[1R*fFg{F X|,47M)fL3 G*NakH-͞ZChSàx&O3e 3yX045{~<,|<g7b5hNcA ^ԘqV5J_`Q&p3dE;q' )pUAJg%LKd%a +0%v㼯RX7'woxv}-Nw7~ 7' gr$*b+PEq6yM6XB$HtθPTSx\P`b{<-\(^.b*8=x؁LF:7< @6b qr&B t my&V_J0{K|qg h̍x(d  '8! 4(0K )R1f2*+6[IkY?͏_kgO<}H},{̹[U/?W*Qzy"{.:1XH o)i 3&Zb(f6`%l lEl`b MB^waӋͮZy'=3{$w!߾c}ucצs+;$pi0cmd_7|Hięs$k I7#9V,7>NJʽsĥitHbn6т.w 54%€g\a^3"k+l^`-jR0Yk yDw7=quHP{,t_a^u єZ lR!bCJE"}q.75'\ar@怏[p ɺwe%nsה/j>0[4黄,7ZvfmPh)Ҭ'[oC!r5dg7,Øeس}ĵ{=R;C߇_)#GH"E!<P"_S)p]Z4ET4ɭ׍7kŽ(>؎%o׿]ᗝNrtIۗ\}+X,2oۗ"W k{7TS2F\vTʬ # I"R](w4yaIŽ.zR[RD=+)SJVH`D3 tdCiB1  LN%KIkn3lWRXkLS&k,M?6a|m ~A7K$aAxplub@`[4ZpuPM [%Z)=RVwAPkӰָ dZciBr`+XZXR)r I죵Bn1cݶ鋿~ !{޶cܵw8Tus\9?!G3I*/hV#څyq74^+4^T6=LO!41;.ࣄ@|$JT^O/7R kТʺ(‹0k؛l֨b@StQbT -X].GzTk郓G*b?rU+.|s3. ߺ xXBw3:H+ؗyAN Q=f #iBBbXcI@C,!]I(`xEN2xcM ɦ mٌ>lͺ|>wܶ\ť {UܹOa4ٞ">ѡl)1D(L:<Dn 2(5 Ab"m#օrh)E d$XrH}-ztmMڮk&>uz-L]U+_:b1{ݔ-f#aMM6[y6(@/QFx ߛw8c+*@8h04,@h㱧a(Z@$3E1)ցO6HQs!qy ы'D k w)s.rsp?2Rnpd~wCjA+-8K,U"HY=A,Çs)}_ 퀼YakE(OvBtPӉCh ѡ]È˾>]زڴ/I59"(B;)׸\;-P\DeX,xlxc[v-XWWs'r}`]8RUuӻ?VT>㖱GG}Wu[(-LֿMrKWO?i6=to;[yY})A`z>1'"hYW ;_Lj"dca1E!%(gQ ^+-oTUU 6hgBv[XE3lCho` Y@J!:"C+B{Vl!jV:6]jAM#ς>RYHijV*ƽGM;tJwy~Y~*|~d?yc S^|GD|Kk?5aM?ipK{s&zV&gHLogJ@7 6ْ– qā%Zj%/rmP3CMsj v !L{Dq&؉wl:=c/{%U.5wIyKMD^Oe /5KCvCΓ :!i;ܿλY2Ej*;y{yz[};Qwb&㔿ȑ00S6,pP'<>jj2N1҄0p"AI8LA„sMVgM&3¢p.s$0V.᎑#NqCߗyoԯx̯:Bo R sSf]QrseB)sḨt`ad5NqPu !Wa3 >&h [3&CG#6>m{… 0RġZeퟤ|?g}C .d@Fi0""~"dDbHkIE'DX~0dgǮy9ꀉ -EG/k |HDܜU=+6#!Nm׃ 'CE""PI#rtDg>q}GqqE[z;gK8(Iżr#Z+'A+ Tl'+FJpؑS8rӺU1U{% mwr`~q18hԏLE{+;‰hddew '2v5<(ǮLr}'FCE'n0^ГXbFJ=!#%a67DkGPCmlּ޸)wv=Qo˗.5En{y\pL؃zSs)KAE,AGkv?(;DZAҙ!(M_Ot͓~[|>1/liALLqй@݈~Z4K#7+Jϯ+oP ;KY.-Z HD5eN@dnR  8y8UM \QzSZŠ15}Z{Ǵ왛gJig:fL\TpOrHO9ij Ӎok/@F5Q E{JdTRZ{#l j4iGEtT)uϯ8q*!Η|J* hM )Ѐ١>at'␞".E<"U'2d%j"*a@t/?JH:yz4t\ 繝VR.=E.0md)rixB y_Xt'-]bYBpW1q2R nGVNHDC 3 C2reMhE*Hw1MrbV/a%q!c)jv$ )HG9GM|cZ/SǫV:-ʙxwIJXkN,~GNA%BĢE]go>&vL]>p_ׇXkc6h}1ƙn`b1 b8?T42 AqmvF`"ވh;ɎQHpG i(׋́}(GlDT`*6YVy:VxD%Qm3LIiew+vc(E?ߥv(d\|#0E*Rpwd!ͦE_n[csS̋?C>|cф^o>m%ӟyO𭫐hCǯNy5m[mO =y4q Kq |v3)cn_Av^Kv1Δˢsb |Ӈqo-稽uY{s;VwFo3㜧Cj-HT^;/ THu2ՙ#r4MLkٶ$ ,e'I9&"\O&82h~I)=yƟzI/{/|%c7v++?O A6q̑S?kSopD+-V9 +.>Pj_5yE_o%wdd|_c)s&wW1_tdc|JZ^ΓF b ꭆD_-HVAC\E Br \ۉJ_ ?SIWpAED"88X" pMrLapnnf$0]# oYFtWK)M'N[t񇰽Çy"dbS?1Voj`]_H%]fT':=8^f3C;@ ]K8״Yz 0))3vzQxQ:3`mAfQ4U, W%PR(Pٴ\jm)&S+~,pBW8 E" W9 <5eQί![t^ƛPƒ2OpQT.)&0W+"3 [(qJzL@iJ~F^>H=~yۄ -1c -ML[/EIJ!3qԓEW2U0MZE.d jшC1-da!\3eXӜRZXW:p?i%N~zC14M؃ߪ?D8Ҹ탄(px=YQgQQ'3jj8k?&pޓgq \A{ooW-d'>y:-jGhCB^FN1lbL')bn{t$i6&"esg^'ֈC蜅uߕ`LPJ-hqWs`'Z3XK UA||X~EދX#(ک/HAa/Wв|#[8ք߮`Ųsd|Y0{Oc {X/O"Zo:q?x#YiRfq3<\ M 7{'hp3V`aE$|. ,GPL**)(rIKHQHhE 8qKjp^h8ZJ%熼'|4Zʩ2ʊ !QLDԆBRz2Buid B끱a2i\93:PGi]EЛn {-|/g>NC  -N$%ʮ1>dM5#BYA:}_ƙp)Q߁^[HڤxH{`5J!'*ʞ JѢjO2#\Qʑ7I! F#r;; [Z_WAIjTGWs7|PN;+[$ ARI+{ 6DIԼTT. DY&NFA# MaFnVȬ^cnxx/G0a妤**~SFp_-._H,莙W^W^I^2O>0pi/p?5~o¯jY8g(NxqAuP.5IEj]d ÍI$>4TB# u)L kB<f(D; p5;2f0ScPlliRai}>`Q'6]_(+_ {>BM?R~p蚰[\+Ъ!b!L%@u|jGvMaXPJqh\$)\1'*Pn4tBdz)6daVۻJujgiY=:;.ypU>JnOpe\OM>`eXKgzx8y,4}VGTU'۵arZT׫ߵȎ_#/}2p\$Z!.ZmH? ܂oH<uDuB;/5W+<>tEb>6O| YYq|N?lpeQ4_¡shGi|K[z~Cv4ƷZDgq  C&mX8+Ƨ|/ZAE8JQHucAN'9&Q>a(.ahEQ' T)Po(OKY Yi/kN(iqO< !$ -Ic)41:52_"ꄬxdl:T͹kPB'Gr(#ǶaC$MJ?NfUzOWg}C!Æ 0W-M_o_а<`OZ~ +O1>j8gFx{R 5RǽzO%2~"d"Ϧ-hes}ɇ.D$09EQFK!GO%D* g0ΝDi{CuBۙđkX(kl69)Y W& 0tƽ 8e^.b+AM{jvCZoA$|}WB'8l{+sq]A@q- o/7Or->m8Wχ .{cw3A b|ɓTfWTâL# Ep8[sҌ7% Y*c! 'ΐ)qELSDqMi2+FaA|jN!gQߗ TOzdWa7Ef)җ>Rbfo|HzUm;/7l}M!T-$4 0,aqDA\6xޟyBzЅ(s'h6ʇq&G iDeY)&D 2hRmԩ_j ~k^A 2H&0#Tcғ^bSN֊ pƃ&~wkLG [BJQj|E,s<=at5+lJw끝WpuQǞ%g5ygmQ*DLo(V)(&Ǩ( ;%BujIݺ@Mw_N)}~.)4;R/W~?͘[Т8sFҎOȽ-ҭC% I EPxJN{%7VӁڞ3ۣJAbvC z%Bk_D^s m+;ol9Wl҈hI/#OhaK P}dT@c~C aΣl;s~ ~ŶhI TFx^-+oZbQag#.\4vQE/7Cr*1+M%pmtNįTer?~L &{z߳73pvbĂ`TAox :U >_(.Zb5шvHEh&'%hEjmߦGor iq|n䔖[z9; EL>oBQ/FԻŠ(• 0Z4 \_)XN&ʐIlRG|7% J2%*3 1K4( E=\ {;hű۔e2(a=23I&L !@ !ATD6""BPQE PEdqfȲkAȼs;Iw?v1ɛasiyNm{W 2 '>'֒Vɉi:Q@\$e&r}#mvR'NR[QU@|zdgh2Ou3| r]#]4W+VzYG}7ZgYٻW:Q~w{:>w=Av)z[c&]O zFlAX`Z/=!*_Ρj.چzr_;oj=!%\ 4A?b&EQhAfF۳`E%ALcPSH قFk+1kc9?+F<?rx qXQJGm6^bRI 8 tuŃڂ‚PQ@wdmx۵ "H%zhu*5 uAHJTN;)7 (k(UWݡ\u[l#ֳW*nj#Jiכ_d駷}qMoh : 9~qA.3$F-r,6aJ@a3Z }ov* 秸CX"r s,;ӊG:'p(Gsbp dYf)B >A!MSZBJ]BqH \gR 2WvTbK]|jUKUvw3qvh?T5\a̠Ԙ=-|b *f~f\DԘ2ͫ\Q Tx=G~.yyB?׉h39x!h2 E6wXz=pw!bnQk92-Zk!\p+g[t;K~`]b@F7KG# (%ՠZV>)ȉ\20+.Ot 3>;w_=6m{#L7u+ lKTc.ztut#f\quӿ4{k{w_ Λ8;̋)|޴hZQG!)0Y.D6 w D k[pZJ\}CE?B94YMU%x) '،%.)A]XwX, ԝؼD(]Z"#kj!)1z>RÝ/j@mHܑίcB['%~l z6䧦Dꔟ9t C.Gvir8奂60ʏ%fW^ۓW67|N8kgԛyꩭ;10xpڼrV~c;TI)zrecq@7HY[#3pAN"khj-qTgʏNF@a<:p_LDy(HW2$-}Ibq%b.[?+jyG#v&5zZz bG1fsYQƩqIaq ~˦Sxuss9jWA^;WaiVhu FLlRȄ4(YWsɔ>Sw*'7_tU򈨄ԟ[ n:ν:3ƅ8@>03bd.4H 4Ck1D*)酙0:0RVY+Td8X/۾M^G/S˓ rr[/s,Gˋ_~A!v|bIiig*}e"S7/WŘ}Č "4/77Tkcx0>{sH *&9G#QZlIlh߂@+?zg-n4$TVsk _`^ʈ Oϐ^C񸧴ist]Br lkgxyÝ{RER"#EEjsy5-qAx`.y?n;͗}ǹPߧ!5JF@FS(8?8>p 9 23`T+ xTqS7)9CǠ[BDC. }FQ<]`s"S׆~7vqcM;'/6rQ|?clP׿ԛ3[*\ַQ.N\cBјdy ݾndl|0gT'# #ٳǮ촬3 - w)eW)Y9ڷܦN5*sN Zvz~8"]~]rtk&fE#b&uDm :3 Lj2^PLy%vC Fz0[2M,up'd ""I"W>A:Nٚu5x擯}c{Gkjb/|xgr~{>C[s,RdzF snqNY(!ֲ ؑO;VTGd Ah\q./5/4<2`TL&W`YMGuV7{cv>}]3{u۲~M?g>o}m/Y[o}Wo64/&^:RN=jg܁:`b"rs;ؤ>weÇ%^:Ny.k){X`북=w-Ԓ#zpaY}%U;оڮ`[QNsH)WAn$275V3!߆''_vMCmhL -M@(pA7b{=ldR2rYo>]jNhsImTV˗nbKtrysG,[k`3Oy9z^;Cߌs%2?|NV,΅9V›?f NsyC ¹Ee.3/Re_l\RMyPeljOkRvy|Ya:~5w[Y&oq'^V<.(献a U4_ ^8sY;HjI2󌡵yM[«j5l|_?!.Bf,ȿĆ2'`+Ȉh"靝q2 lɢ*Y k.RAQU-*4;&TMASB2}'?}g+gPKH"auYn@_֮^}pp[ܦDpaZ|EGc=hkF,))/6{ ckUCc Ɯ{tp܌.ƞKFP3G[ B'̿W ݴܟi`8y'|x%"o~>#]"_j40F!W׍Dy!1]D{O^g;2fi>z젉#1 ?0oo1ԛ8& 9,1B gMssx[}'9N)r﯊\rc68pSq9Lj:*Ãcڹ1 =JtHx+-$\Gksyy:.6PyĆvGJ~vȒou玩PUKD&sK:< I]uY4 5E6vwBfE+M^2>z x,e s-^{t1ɀPTZN&&#G{[1ڰj(j@zì1T*c&TJxꌦ"SǤ*p”.sꮺEF=_D'[g"cT $`1@W4pa0 z@ @ ?הoJ[Tl[U޿Jtt-9/ԣw[qZ+oc%;{6we!VTh{AIt-SNăap`r\ QLC |@Q :]^GOlgm A9N]pc3CPtKhɂ4yWC ^89 ;2O-):#0W-Ck/8o\? m͏f1[ܢ<9oi~6D^uѿ~=ˡ|%Ҁcࠑpz0/Mn5[$2+'C V0֯kr,v0Fq4Ł ̥SNtZVv,A׺=_;c=jUh6V[4q/*iδk|K+1fin۸Db9#ŘѫAgV-+7E%‡CIFZE{̱;5C(NQ!  ׃ЭDrApqkK7K&%a8L4JFk21WlEh Z)@HT^UڧY:@$DVSI`*{ܞWAĈ4ى^~Q+U|n?p3/Ϲ)OUiWT9? ^j{7ƭG8vHف%-m_5l=Fh,bB'< N BYG J|*eXx\3m?tb=݆<rfG;}؉˾$wžc9wN[.SF° Xhxl#>#udęu i<³FcH b4#F߈K-.0טZ\xbcK41͙W"礠VClDEfcapG"4(l!'ʕCW 9!.voYT]n|w7/ɸOً0]nnh0vk߼mtdbG)[+˾mce 9:vaRSםE޳NTv&o p牯b?>,,~OrĪsg 7|3Μe2.ZBpH-W 3H:w{+aMk?}A|w24z.1E$'Urc E;r9=(` %dL} $cPuV" ECGfc5_j~6Lڿk{^5N"`=' 0ZN~K=wx{qs0I|/2]Rdʊy9;@}7;rNu)jŽ7rǩ2׵\/}_ەXvT:sٯl˴9C}%̕If'loOԵۯxH㜾reRN}ϘbmvB1d~[e.bmSc?}#cYz'vu?f;" x)^.?+=bl*l7ύ$oڨƪyv)v=7q.N{~aӧyĝ`l1 |KwDeNgaH.Xh0Aؙ HH `+k 2^_3w!Kߋ#3k‡~ˎ#~odx 6MMu@<ju{1Yk$^s8 mٰq2;0k$CҞnxԑ X.VyBP#ڧ:[{=4iUz׈gXC;5+IuSVt^?g_+o7_+2?17mՂ.z8`g `F_N# 7!8M|۩Z[YkX_y\^ >h0ѧ-@@Nxg# G»rxsCwK" ւ.nH6Alݎ #5)|ZEZN-%jʅ֫m5/K5W_ +<]nVWOU>ֺ?!^Ftۤ- z˅;MBe'.ip0-qi_@-'o xu?E:JĔ4 1"-K% Ob$^nD4xlxvi< -6kyl̴WPI3>@x$Ĕ2OH`M*x7+$#LfY'o9d7O:, ͬx] 4R[j1o42~hלnw}7rOyh^ߙ?*FgFfcl s>DECAcEe ?c,q3y ߒYZNA[*Ϋ^2!k/Y*ge[ᶀ-lJhK^ AOWQ^JJUgʹ e*g.45-{ {9f{(lnG4 lw4!+:< ǝtErN<r:P3V*4!U-{_3 o66wwy l5-}nj1S{!#L۵S @N34Ssl^uu5a-2s#98H^r3C(l̉$CtbΉsh%k4+T,f*(t16xc3#;M!*|%o?R2 EmR1+QlJ/FvuuhLzz.#Pt1։Hhh^f6l?>F]hX{eݎ/x`bKJ8߮z\:n5s W̭&>U1s_ZYY{:f]p`q0XHf(dAFH›EkRHI{ǹϿ{]P`̫^E穉_b{*K~BP,fgx$f9BOԩwnF!s݋!d q+p2X( \ 2K%DG/Yea0;#PG**%^rհZrqvĜ\voOgǂ(ze7vt,84'BeJ2ė6CA7hNTigd\`H@ԞGJ1ho9߼EcA>+9\MڦR9 ,`zhȄpptHͨa&s h>]Me,9-@ ?!OTOAatc*2ՔFۛfpEp3m[m 9KI(d;%:J ~ Deɉ`noiIydhۚaet &0mۈ$b9Mc0?'xUvt{ehf<↶w_IaF(FҠ6sTTG?q[mq8qPfmQfIR.>AuCI&b8 :C%itEi/ME! M@$ ԼdC QI'5 ˿W߯HX Vϸ8z'1B)pʽ °xqce8voŪ5.Y5\Ͽ@{7X[u}LO:dZWKS-|nX20E4#xxIwĢE(ګm瘕_rIlC {Rh䋦7oG7aM$V岊 e.\P;)d\HJHe> ;˓6Oc/ 'Kb^ppAͼ4_Po(B1%|D2^Ա͠l ܂g퐞C-) V.$Y!gF2' p! xDYƢp10֣wcuݯ-96 _n~bm V $lC.1! 5)fWDJ۩fKjǦL('K3aef:C^%F@AҠ!oO Tx(jj=Q&=z9qyG&|wۻO̟zwR^2nUWn3_T:a|]6u>j$3؃3nXi ԰}$@B7=\ T4.%]f5K;ycGᆋ:͟ 3 ϾG?R ~z7yΗ/4Q#g ?w4sy^) ] %OWQqRc V>>jAI5K^V5rRbI׈D@Br# 9]-'m6!'6e84~'uWt9 ) @8k2e3t/\ ii+K&NYVʄ K"U0(&:SYrZKE ᑧ́Moa7]|CfN䁛0>Dyů:y\1h|dy VgclpsqǸG0h?8hB~aq{[`@,;X͖},{j^W^R1Ke |=+_KI2c%muwKY!W"V+kuՏ۶P[ʷ8۔ୂIt2p;yx1Kr*j*sxu9C?[rW}rz1 G'-?-[Ϫ Fnm0qгPV#~~ns5)t5GxY3RqL5oEtݱ#ndߺt+ d xys54_T6>%g?ǫOmkYcу~Ñ;>8Q Q١cgCg2QE81tmT뢱 .Jڿ9?{إ۷nݪCnc휵)4*'&- A>_j(Ju]2QXZcAVU}so(0[ |K]3N#jB.eά2CEzsɸQ`=gNrj"ND>&mOd!H,MnƏ` VKGh/"՛Yu6'a"9F! |bz|Ujg#;W7?7?9>){JhW.8gI{˼5Tu|ܨS}!!Ӭ{Ωe._)KT?ڞ8+?ŃV/5ػzFwʟ3thߛ40GvќAZ}}f먾m8vO઀V.2ivy`@ϲ`wNٳѧe~*0wFɹЖXA Jŷ& 6| 5Ĵr6<.1{39{]u~u}Cxe}6-s']\kOf68tmVOk/鎟mSsQ^J{5zF#7E} $W>rZ|U$( j 1;>ڲ?ąN-י3⯞oDνnSӪeNb}d>gޣWWHc+ѓfdv,!eR!E<܂].hK9޶*,Vp+kE"PUUUR@UC:@.З+0m 9!D0рai!niB BB!BTC[r]n] >TVt)*.ʻvӂ#Y6nqOG%KڻPf҆Af- +EfJ 3؝Oq@dP=r F;8G{{ZgUi䬆ib~Y)n^de_9wx! _7uʕW s; z 5s}FY"0ƕ.-hd+-mK~9|"Ӭ36urq1HtDĘ۫U4wzFn.#j-|L~M ) t%SEvyמtqMϹ s5T՛+k߳#cӹ`{;ak1h( }(4*Q;9f8k6.q>\ J :{ ]p`ً%^\eoYe7&u'SUʖX- d?e-cN(qXBUtŸ'E[v@bw m8)%:#LFe t)B1RۀV go*ռ% H!ּ|E]UMʦ(a>~Q}q+EB"b솤A: 0Diម<#u8 -&R#}!Rx "~%^{]CϚPU#~)gBqΰPBٝQ;D}g.U^SU5V;4 Wn>^ כo17Ewe;x~s5޷-!(%҉DHkIem_}b-ORCK *R)GΣ5Xt9g]ŭZ2Zr_QRء]AE)/{Г! LqjL2٤؆T`~f0W/` ] HUN]?}Ŏ_y@EE#P9xؤrk!<;=ux f ,K`9(SQ~ +GRizu.:9l˝6%&fHWwԗCFU ,tA{qЩqLL#6ðSYb(y[ ,yu΁ 3Zo8Oqԑ#F&:Uۣ;[ 1YLUs5^ZǶT[,hyHa% Cʁ- Lٌ@%,r9L塢\qQ6~Euĝ}}:{μRh.l;J" gCƢ# `^ܿ<=˃b.(+Ɩ'⧩b\F$'w۫57E,ApuytmW<:ϫd^IQ҈:'){yVk~u _XlazqZ?Vৡ:'E 'jHKEY?c8#U~BgzsԤ]w7a ]ҥcN$]4vt]/_v 9ě'/ySFE|u,-F5X ʀ@g[r3c-7t- Gf}E`7_:~a dz˙r5Ux\d~GQENB[WqB,2*?U"8"ZTյOzᎳ7Wmu*yfl 3E/Vsq!~5Y/5n~g~ɭ/ru9 /;w9l4_ŶNęAC.  ̨-mOZvx[$E akE 48=!'fkH=Z7 @N'sV5UmYnr &D pEG2Ō;E^4@R-{D* Z^@8ꫧď޳k`=ao c'_#Ȋ Σ}g T"Y`]Rv TEfֺ0iUv1͙uϨ@E Q.lȭKoP9l'#"i%C $щB U|teм3:(12T{VZZ!z!se>X+@r*C$&`4P#-k,.[]֛#U(,]ھ}׀: '."Lb"8 nfh)&$@G`Ng=ڂO8@ Wr!I XG +Òt* YJvHH.LBy1PlmQG nUUqT0}JUk^}^G`w>F9Wn 5SV<[t$CfZ) )xV' 1EKg0S^1:8 7쮄8xp_n1qv@]ᫀCHHߗVizv@ƀP^տs5 >}5׽w~Z_G5?]e.9 ȅt}z; ( C]lLɡTp1^ܢښ3ٜGU:okވ]0 {o1rDzU 6DzUK c6ow21g.Bͫ!Z; ->Z<,<ַҸAn98~wj{^xz*{ݕ5Pmɠl+_e^!f_lW9ɹY8}IfCQF+~H/dcea`Q0,. RԴ1]l E_OyjFhM:2{ϱ1[TeiYy6G^j@uaAZHyh: 9\Ч 9㴢돌ZtBy4,U1Bj6FY fD+YG %r;',0Bea\750j2+ꍭ\X&T'EY>ɱ%2]ʺb"a}GyIw3ל Aq~H2G  /").)%: gBc {[&qG R#FaȘ^؝ +VvxqK&uu3_Nr2~6gmt.YK4=NzG^ L >EҏJ_ B,QSA|8NZs;תMQc/7 ט78~yY K17ީ=VVN+DB 8,=vZ2 61zo0jeHOvouc<#hE&Fb%]A褹BqҊ7c@ckMk _6\,0_朄'7?G<>F,(V=$Ū}up `ܙCr/T3fvc@{*Q\]};Ww{=>eY%mqo10;H|!V0g*Ph>?14cohZT_&1^^fcKB15-Z oF:a!80 We$/,?3`U)g$æ :B뤃1ĩ;u?.`uv*_O_tB=~ͥ=b~|¶ʭvmzn1c]FmO3SxM-Ck ӖY4u`O4tllc Ų0᪥i;8s^|Ǖm[N愋Ϯ ?*,>QdG$+|أRdEB 5lQV"?8TA,&R&Q=6خ6'&TA%S]=ͮ4gG x b1y] [X5xeM0@ٔSjl$ ֩}BҠ ds*ƞ5*TҬ׼ߟyhEj=nna~x񓛗k˲Ʀ'r:SN;h_VϪ 6kR-W 8#FMpQzv֓ 1VVي"p(Z6ot+ؙRdj@&rf3m-(= o+:5[GhD#}gubk-!W*}6}x.|ӹ6כM>U϶mz8zgU 9w`T\OO{! 6t9纍}*޸(a?uEN6ٰ]=SX Xy#w_;o:(%v\4Qh1 g Ē>r$De-y+/h5Yci\Ҳ{;fdq1a5-Bk V- }\1:MZAF3C-V˧w1Rczx`F< ak U[$E1P1X|o\8ج>SjT b(3N Q{K> g5W2; % f9ra%S씭B$hN bavlMmeLcGY&9رTn9Fe|\0 ᅫOWb4a7}DXm|ӁK0sƞ ݮӛ(v5AX$?5ns:LvHR'̻nzXή{&69xBن© xAt_, rМ1moi%9TKX<ָYeaFU3 n$BoG fmP.Lf(B( 4'KeF";^XC" 0%\ <%URHjT}=5]QexPoT\ SX qtK­)q6s@jѻ 0!)UD,RҤ}u=PSK&r*UeɸFT]ptɊU/ M 8G"t!-f:mcTaY&9ēFS7?ǒXt;DAN\9Sk+`/jFyP&Ƴ!ׇwFޥG"V:"OϪNɷIpAѧ3j[ s@te$uYJ$SbpΦV-E S %&_$uHeDz<;Sj\F9"ih;; ڤ!KE,O4>7&15qiEy:֡O~FEi@T^"HW>S!]tta1SW3Ӱ_p)sg,b0 2h%͸ce6a@P(QHџI֯ۙoSò][_ w) QÐ)^5s!5TUsp+y#WvLj+H\,3R6v^T!&wI1&(QLkt"Zڡi[/> Zv1Gaxh6c |+ೝ'CT,nrK\@A'Oo3=>^ۣ֑We.u<}N3C *Ia=Q!? 32R +$/.lh\8 K+rDEGqKc5x_O<9˜!>&='mw5wgoA'儔ƕKAJ;# yfX:gRq[8Xq͂igz[l#8vG{I67=)}nדS^o$@.c Dx_A>7_>_цm|<B2y#8ࢫOQnZ0#V1׼x@O9w5!5WᚏHEn8P#zw2? Duhv|q?WDFJs9ݟU3dr0lfۥk8Mu;mi 釺h/qXE:D 3/ g$(5ጘI'm0v0E\2ZA3vU2˾S1>Nz쮇^LV>\~h~s{({B0q!5CȄq 6+ n$R^ۥx^yKz%vm R׿Wz =ܓtoD)̅x?0BAXKĪ8uySH֡;i/L]'P#]2OEqx' cཏVUcdž{e39)C2YߕN&i8e4K4pB |=8m/r^fNkirF^Fߋl~|]N2ןQf5/㕾sXzs'~Ѩ]Sahu]"O6B^e?Ca ^6t*9!:mE!<30yaty7$XK뽡 55U7HN _׹E5e# F JJ@Oe4gHT?)ZJmS' dJډtnBW k!c{ R<{.-~I3RG{_ 1comU 5µ!e4ln@_TPɳFVܶfv:yBd*@)s.&wG:AHo* ""*EPػQcn1D1cSML1brzsfs8~y=kf͚jKzҷԤqB(3*[0k؅/NTLAxGTKBw՝E%/3הB;&evi? CV@5Uu9,bllEx_EM*j'Bb.@I؏@_lp"3"`сYoB4N /'V7!d,8f:BMUa }녔sC.+;:/`a:'W-:3QdhZgI(!$Fj@lx7 ͚tikz8l|`xpۡ寯j˂gGoXӻ/wF]y_s3Mwt a/ oاÆZ{3L@ߢMsiT+7l ݈3ܥGUkW3:"n\vQۖǏx$ME*&"LFY*wc6K~o-7O>#ư?kfzNƁcE^P `kL B/_ź fƭh Cyc|ғa!nDw4Lg z7w $]w -QWShFOb[㫹E(l>d߾Y T)z~y< a: _|#dN7~P3Y{*פ!#M_,4~Ohhs;5PHÈS@flq@?c=i:B5um "qh*ᢀ0TZ|O̹.{mOwna}i`k浗_~gEffzts[o}ӏ=~NϽi\3i<^\e6?f̠A͖j=BD34Q4-vx?U 3ϭC2} {Zk0ag畻8NQxvXw5ܸj}@hcW΍`j7'oX5#h,ILYc'Q/Z"NV ͅb#h=}E2W7j, h;"Uѿ"pڽX⿨.~Nx"vOnVW߾+bj}~.r߅77aخ Ơ]WF?bZDInu057Het@abkO!I FXFT%EOH͜NX υ贮}fPu us;EƩ뽢3цsTb? s?IlG;&X`Ba|ah `xQe@>/BE4T//k𦿭x奡ȯT/ei['ͯ yb<8qz=O`ǤZaie~^ĥHNH8/ZwϞ0YWC ޛMM,D/%_1ty>q{kt/\@*, ")Xo -neU \rQmwwAKB§74ʏBg\^QcMνζR+|Aԕ#0L%))T3Mn PpK^6BRi@a36)}3O#3i}av˾,_:/Ǫebk,Cl/^@7_,@=e] .V\P(4_R?|qKq[[(;:8NU8|Er?錨X"XܻbڢY~ / 8$q xm-Z X N !]"w|e~^դ o>75R; >̯}Dz'/ u߄FaZcJmJkšZIBRխ;͕&9624V8ʹ?|v/SV7? f)Y*E~t)gBDŲnoW(_O(_Ȣ[LhX z˻7,/7̿[˟*n6,*K{_hɿ*%^s~/jo0A47jwzZ/7 };пdOMϱ:Ao)o?l/O^.I_7|~1|,Uɟ"%e |RO !|JDu>lZg ?!Zf+%Q`ޔe* RJ';LDxPWcMꗬΟ(o5֪|1F4vtjg97u_ށ/T#o3H&M0Gf%EQSUyTA~g\ L.'E]͔6TL. "?B流!AvS<`)8ۈi|?o%; O!/.8f<(V\a ޾E}2ϩ%ZOsYKYp ʂ+*8 ա,(7x{39._Gp0w>!K5EK7˃Vezܱ  ɻ W``9٧ [;>t4G6IDG .BE,8;tuAdWlKg\lD'̰H~>V8r_> X`ݦ"ld4:RD®AvakBm! +u_a=Y1'p<Ԃchd5 Ö]i0#`ΝY37sph9#-m1b3M{(bf~93$d7v`4NZ1X,vG ͟mf/1@SHDX)9ᥚ`9@fFF&1ej^<1o959c@#TKOD0nU~S$6ɥ%$suR#bln=!jēAI 1tgt}/d|R2FV$B$`EBG(#9y[7mܳk݅/C?bظaOK`KNyh.!ߥxre3ʈG̉T,,bcgrwʕdon-:㮭)v'|JRӋdŽ-8#Bpn4ӫ)-I>{RH!r$E$"|(򔃣 RMI$</S>Qk!&>{+(uuFD7wkmN%̟T=1vڲx~_Cў%y}< F[e\m!:L3Ieב_fv伊T+A-;%8T!6tCb}z{)<⡣ŵsOX5~BbKüV|aE3PZ~\IQ@.LF $>̴UrR hѯoa$|| y#|ԩ ®'2E.;4w[ٽZ`w0k(C7s Gjfpܺ|裧L~E_|I9={BSыB§&\R>=h +獘4q䠜ۀ|(n Cǎr)] 6-F;Ps ^@h Ҳ{f)VöA2?B Z XjWO2cb6 \q )M9^ \g$jZQ^ mb<9ѽZ"A5Dt" p~Ḏ'x$f+9t.'*Xhj{獶קocIfKnS>;8%]s;(JUػ `Ǩ6; y')Ki~~Iֵ: g85z VX~ .I`,{LKYhq0]# GPH{FFEB-[MZj/0 E1` ?T{/TO/*⩞G13Շx.Fk|(N"f9]D(XHy\~pTBW89$ˣ!+'<5;Vgئ z'HzBj yضᆔ}a*>J yW[t w6MvYRdׯIM+}(U!|K' %b1BVG Mh1B e,v(SҶI8a5 W/g󥇂~)}ߐGdӰ'u&Y.zm$Kʼn|(Cr`я #$Lm0k͠ i6^f/(Lt(67CX^D7iLpct,V/t{ :o{6Vp-FtI,ɸiI [6N(ʉ3ӜzR>RگR]8y<{V=Nnʊ0jv H (17٫;, mK"W=1^u.nkҎ Vytlx__8a#CV#$ ]VG{Opœ:3nڴ6/Y0$D){lUKV/ lkO;q۞}gYj͢%V<^+5RQh]_h!d7Qc=?m5yG`z2 hY`>aņ`${)[]c_C;oLb55gEQ3kҚUSdq˷+{kFLY؝n:g&%m&zbׇgנ + O;M'U;xӛez" [X5Q|)]x-ݐT,i `1`7pR'grr@jH.Ȉ R}`;nĘyb°01UR5>N%m گ8(!7>ij+₼@gҹ\m Z9~ܔ /]p*Mk\/?1[ 7|[!Ĵ"$l"fC@>K' ު'(Fh}!тdKA% foؔDa OޠͮguFH15oDGphauA`e%tdfVT6hIM=!/-{Peh7r׾XuMq~  QxeÿgE="Թ!S+C/t1:zՃN)c8& HeIoޢqkuEw_[ iFS=c߇h;r&<E k{Ű~u4Nb sBF4@ gMq2v"P\*FՓ+Մq즭08SR~ɷپ?iMl>Sg㧊WfU=~=:w~=3mSwxa+7nh#u u&vvy|B(2x0 vwiw&-:1_y|/'+#D@"1 gF̜mX G&nhc!Hw+_#ʦ:CEؒ + OCV2Rs6ӱ@1/L򌴼WWx;v'BƏ B`-Wb #u CBK;k?; w^JKNyp(K]o=Q"TB78|T=_ 󠞾I JY3OA~՚ ߚփ!9q'ꊿ販ۆݚey[&o]~xQ5IkGMk&䔕OP?hhhu s,ղ`~a]m+Y=vƍC96\[pR!CXEIk٪舳 K53, 7A񦕮Wj\ 0Y%lAwJD8̚0ӑ?A"YKw$p1gOB ]BLM^<6ݵKliDL[L1՗]*&U,K=bY%f/V=mI~e&W`Ұy{UK\J XЮ?` D1p㊎:<`}Ь~bܠȆ vby{Mgȥl>v㋍ck,=!LY*K8/Ac s.yZCaW0JG')ik^Dž,15E%&y\^d"[Mێ^~}Qi $% #J¬$}.Ƅ H4C⽼˭ޏzmy(}%O)˴1njc>>e>r|pcKqBX+m`@ۜ$%u;/7 ͘-=^ݧ[T@B("em84.V(ǖ1w.&yUt<% {H(X@e…(6WŠ }JsB(8wp:`Aup" q@LE>6=EÛ#hK`|2dErqPBt[1.--DPE5O9'%rK,vKK =d٪uT?Zbzj|z [6nplaJmɟ H%esŹ*l'6O46g$6g>ӧo4 KSL 0H]!fxyGʾ2d[ S.0mmBfN[d!;(KC)؄lp!D,V.ƬMo q[e/oXހ!Ŝ2/s?(bN^֨}M?3Kbn2#/ϑD W"^xv};8^U">212FqLMx`JihB_ϫ?TjͶgu4lz_{1QՆ.8f!Vq720Ϊ^!I}h``1hOC:B`˩gN%O#YܡC"3]?|vƈ)i||=}uqsG ,a_BЌCٹ؜lwt&7mN:G \2 Α- Q`'m=rggOvy q;1tJ1t[b.L1=)tIN3,ÇvgY&]Y,><ֵrf;GII}Ϧx/6uZޏ5YO6xkJ&i,TWے?GJoy@mW?Kϊ;.t*dToE"o݂^ 4 ؿ;8 7siQ c&#\rgUUv0}*ztn+yO3#8`3ZTQ"Xi`<:Uq X'a6j9hUP:s1lc(y3;=)$G~U4b*>{'+W6'IѝGتΉ{tNAGH]HW/ƃ'"i=-[Sgi;q"t Y\&=+R!;>(>הf ! Zэ6-(4Z/,LMCL>*W:kA7Ȫge? h#iNn>dEʊ)SV#,͝\qYa1e!*Xw?R @3,b ꩁł 5л- ? %;eK ֦:hSo& dB('` ?8Sen2}FC1"nş0tљk{pZI:d`xokK6Cg{??8'Ar7 +@hp^GB4nS4"gd=}ьf{$XA7Q:@]]^4m\pЁޣ1*xİ='HB%}4mjUD3d;Df"ZZG$2LwG QK.M=zmn](h?9>S);'#?STBҀARUOc^`c T47%~HLjhDgkNl?RIj= yŠxJsGZ0b ߏ{8fO\n7dha-2lF =4> hvڑ^o/!x"f(C 0NWP2!14$ m}o9}_hqvt,YhNetrX?{+b"}D a4ȔhrI)X+>V8-|hK p) 6tlG :B'nŁ)vlj4mc.Js*NEVf@[+ 7(oT/^qH3Ѐ{μ{5p|UpUfxW=4x `؁9&ćcg__Nh_MWC!LsSMO_}zڑeY,\nhrg;;t(o1]< r._.|KbC->HTT@`u{V?{Jѣ`E*ɜ[Hf!u"b/ YTՒ濯onwrBuwqf[ߔ<\G<\v^Dl%g{f;9?O[vGv A]ړf_pķ(:"\eiJ'Nh7Da!-xM'}fw#I+$$v"Me4QU/6z]w+: Ե7*Ψro\Qwk\9tFerw8";SLs.y̏;z1~1P8 {O{ɉ&U9VӉ6qط+t΃-[&Gݏ:)kОl~dzζ(I)i_;3ݐZ]lu<]d6< #aRR&*vz;iyz] qÕ+\qW5͗'%;uПY ݵ qtf(tI~{ j|4)AhcH i%:vlNRF9v ~ztZ~GGZK{+RrF:.k΃4O,odo|V'3xihRo]{?X; #8\qRm;&I(s\'e*=S;ix,f)D5. b&)ot|! e+ExK_i@}]\| }/tgps?P_X_W==S_X_/gqP|>G_Fz׿]R//3zF_X_)S]T(/CI6%]_R/܉g"p!}2ӲI$b4NV<뵴@K݆Q?U$fM7.4BQZ:GKqIcoSY1nK8FoS4D?kנۤ`θ){w D=:ЌO|{DsbV`D>AsziB?;̋'f1ZQ6ewoh/DEc~;SV~j{1tJMu1`6aBJ۰.Piw-.8q"~!"?}WPí2#Ia*yɦSZ,喔nIi<Gy1w2%=p*w.4+E .:B4(&K#! SJ~ KU_@kܿCP#|+AUQmN1gBx;ۈ"6(EΨ-c,>RWVڄaH.bQ'}q ÏRMMx|fKGA>m݅>/DkѦuP?YGgI Bx=pCn,i߂$XƚSqS0O :QE)} ܳޙ7;ѢaY}xRmƯ95)=Rs{BEЬ? v' .hsG7L4A9zS6x]-?4_O7 A9ˌ33>G3|f?+ÿ}geOѷk1~"}ZӼ]q`N}M]ata5:+pIh?lM&im+R*{z< \,..}aNL^7әg!AʐwIMmSXͰlgfNB+Htװs6i~BT\.4b:.bW,\o=kٸBI"jB~Z$V$o7E]OUR.d1(5Wuv\ re?5|#ꂭ\q푣qR=3] u6X]u45It=Cюz-y[l~{I:_uܓ7r|FT Q)k/>Z)% R6m>a; :ݴ`?CCv78rԩ 8W:w]d`f\o}&֧Om}>e}T]{ x.b_%A:,o |.b}m{gW^{ȴڐ!B4|/_q[߯ߝP}kOhиЯCoߧqۿo7مy 6+l~ت k ;fpbxo.; O^^~"L_ {17bIƈC'"D,]#OF5,jߣh}#GgDgEGWD/^5@)fA̚1bŴżv'1["vSئsc?2Fq}Y/'MI887qIC'$@ig \??y1 9_OrH*N(i]IǓ$^'I_q9gHАMCrz!>}hCV [2>c|u/w?o7M6!c„ &\~={fB枉.K'Vf9dUg=}ҰI'&}?VvNv9gٓ/L~7.gBL;5)wQsZ:z{S?S5ui]ӛޜ:|Mς } ?,WTfOK(ZY_:l酙3[>)z֡ٮf}_OUNj\enܷwdއռ:krkjj{.}N_7pi_wϬo\T,t_xrم-vѫ/]|`%4.riKZ߯XbV:]y~_Ī[cVoZ隸5[sdMk\syͧk_skmsk/pkoc.g]\\w75x67 hؐސِ0a~ê5\lwZ`b6.Nx07)aSfo=4[\nyuu[zkۄmӶmݶbۦm{5mkvnmnrۍmlWlﵽöٞlko~`m_O_eˎ^;1lǘ9;wݱd;h⎷w|hoitomߘИ8qZcYcmƭO4i|ƫ)t}g;ؙ3g;ܺc;v흟v/;wr廫l׺]wu~ۻn;}w_c'nO={ڛw{=}>h~g~`?GW=Ïs8ç{ceol4i_ӱntƑCG~9GM?y4謣:}Gm;zţzX±iV{'ǾYxrϟOyz+qX {£/. z'@;{j\=bImF!s~HWx@AxVCpY> R9,!y*I%&x.]"JUiFHa]$v Bi(WJ}5T^9*x+/t Hc,BrEN_[r}QNͥY})g9aԂ2*& v_<dzQIu(K^j;5yzLt_CS-: NڢOtޚ[PG7eȽЏހiuJAR0$b!S Eᢟy~tD[w$ibVO2*UJCFHiHca>^ =NBɠ)؃NvtSg@Ǽq1PZ.麴TQztdjķR+ K~n/S,m<^K8+} '/=^E&},}(}^?V-fKs!'ih{!xK%QiLZg evgΰW6JS3O =y r*o1|?2?˜> Ă;vCYp!ݑ U( 6Zx , d`aCo0DKf),NFQl4Ʋql{e,Mbl2ˑJҷwl eS4c3X>+`CXf2VNnX*YF:jYl![%l)[Ɩ𮻊fkOZ3tMR"}A {=d&=Ķjog;X#vlۋs1`v=X{uc v=Nl;ɞfͬS=Ng;˞g?y^b/K+U^gM{e{}v}>d?' }Ʈks}žf߰ow{~d?M3n6awY;`& w`6s+\phTs{w.]w8;uyޓ{^ܛܗq@׼/x(#x$<8]d $>pSx*O|#e4q|<|"x6s˧i|:3x>/ey+yj^ky//  |=|3o[6|'w=|/a~?Gao#(?ƟOf[)Ɵ s<_/W5~/7-6/2?O)_0ſow{?M3o6wy;&)K2,ˊAme;^ve'Yv&M.{^r/[{˾/}@9H!r?9T/p9B-Fx9ANʃrBΐGʣy$?*#Q*OO'fEnOm3iYC]eyD-MU(-X-M4 SPT]Ui(PS%Wͬ,m(PSꢺ9% 싺Rj J*k,Ԣ/VT)5iK4i*إY+Ҵj>M-D$#*b?n[EUsui`}Y׽QXP~dmyEq\$ZKʵT[RnVr5#GYʵuV}꒒ʊ"}HX竰zЏQT!e ZT~}8O*+UW̭[V"UΔK*gk?^m|HǗU,SQPWXeTP! CՃ>SCLT.t;dYPkRE]ZK]:I:K'iZ5ImUHt+g$69Y?&i]_jh_ou?~a׽>Wm"ZhnVWQU9F7RW%Nݑvéj1[4PP"R55e}U׽D+:X="kiF'F%oR4=vfuQh+;ss,]PXFG{ZU[XRQUOYtUU5%%55nxܲqk[PYU[RQR^6mjGb)O}dnj&c9K'`)%A %deN!@s`),.c:S1# rfYnb9rVAA<\N5܁1Y`~+4ܡĪ6sS7*^J!fRct%,e~Z$*L7[4BmRe_PnR#WUk1:ȵhWB5tU`*\砕x[V$izSAQH]˻X]Nj`yh@3Ofc)7RZHKiQҢ,52eg(K=,%GYJm)9Rrh .-0-0-0\D[`D[`X`X`X`X`X`t%#Ҏ  8K,_Y|g"RxK]-u%RrxK-%'XJN7###############1^J3Bja52 +2 +2 +2 +2 +2ܞs{"#u &<6"#-=iLgDdbZ8s_cZg ^Bĩ+TL\/KӞ4^;j5Bxs#^GVxZ=zk#AG6$ W 4<$h4  n7AM&. IJ`l34fNCVDZ:$juHڮ]bkm}Zۇk{?Y}_;;$k5d ~?YO'k5d ~?EOڟOhS4) IhS4) ~?UOjS5T ~?<b̿h5Hj UAVTiZ Ҵi5Hj MA'MA44i4 ~?MOk5t ~?]Ok5t ~?]PFc#T*~l ?6BPjnl ?6BPFc#4H ~?RLST-G,z5,zN6lw4F#V:SGb9~,fX]fpev]_ŏ /[~j)j/?ۗ彖 yKq;m꣥z<^[D뫙`] va#ݬf ^lWXjn닪#\x.j3:Ma3UMk t>u&?dhUG׭ڮƋz/~Ռ6MU]2k/lxnrכ7zSg͚i̶usuFgM^}ui˦fS^m׫/}s9lJ>=4q,KlkaU1 OTPwnA@V-na]VluYnWL^.՝܂TŦBtm_;WMW!^| U4f5Wh[X̾WDvm~w#ѰCo}nYnXh]nߎo~@wǮ[gtcWmljFUKd=Yo{ʼt^۪VX1R~-U *d;,|L}'u_u@m׻հEf\e!Geu ̭1T$- t3Qgn^ZRٹl@0jÒS=f y/P"p+W '#p>Pc#שUT ^O1\O]kt!ݪ}u]-i`we۱ntɶZUݰ,b곺/Z5];{8i_g m e?eh̎NCi{:n m6z`B.e(fص8e!%̈`A&íY2z9z|JzrWe wW9?Ⱥqú摱KUYuH=,N$.#ь{()O쨝L@zkACɫuXqNEȸY;cLNp 1)X2!`"lNo|a=I)U횗hIJ۾K׎kV1#@VF:ԝqԽ z6/-D@Zn Sآ2/{m珐r3^ ql?UcţV(WȊ#.Nw7զhm >[`WĬwt@lv:ԬLUKiQ%}i N0gG BwU͠e_Fs C_3VZE1~W+Ћ}J5]vF&>C$+U?\;5X`3Xf.mw耚+Tۍ}R7h-|يW ąz#aAvӖ/!B˚)Տ!*w wP^9h Lf=lgMm )DbX#b$վBI㝺|Jf:r]퍹`{8NV%]/Sӏڻ}{:}zIi}9>:{j3de0jVcor4AUɧFUZ Ռ07U>tήvk(WX MdV2AOڨ4,FN jzzZ\\}бX_brRFUVd4  ׽̜[yoG p^akٓ%9e؋`j^62pgZ7; [+_0bȢppLطfjwP9HVīPb{HI31b~Ee-t #+Mv$gg$ѫ-ҴjBH NҮCtbC3[2[;#A`[@ YSe]*W,&JbGjδ12*"JIj`р8@a/J> V˷P ܉kO `݊Ie)`Ye낙%AQ!&Wm#*aG9RcpܿA#|E,;h-YNJ6dB!P/ CH5j3QmPD 8͎1 { bɭ oq|gGX##RdW[}jO.Z}[H g]VHa࿚up3ـ*t`Fnkt!vB _ ٩-E 膗aN r㮍"tTyT|'ɥfȶEF|mQ/4ϓ( ؤ}SGp\ ˵&Q?-T:kT둮(NOۯf6mA42z@B^pN!`LR]_6; )m(4y[? d *1-ځE٠p~XYIHVQ8=_m'oœtguQr5Zf]~7Xn}XjA>{:xQp>ĒE՛/XC }=uذ7}=\'ӳWǯZ+8Jl^_/ ;)ғ#OΠ@\-$7 8 xVhz!s2{f;݌S,C^Shk9hT y\0 "N;aoL_LP-"|.#=wȏP- ߶iڥ⸰̎8EVD85m@Vd# Icg ljyYL*}u^QPoUD 6E^-ЬS ;@( "H>7 )ptA I#B3_]b/?)W2\JD&q'ڠh^d&^/k;Zl`4PF&؍Xb,%b{ 2z$y.ӪM#x hQS{sAa`73\_>&:cL uxInA'4KTqf^=\CZj+f$C(T Qk߬xEj׽D.Xdm n :a:ROt10\?Nw+3_+:q(bl lt\aŘXZ;XfZmnA5X5<:Є҇C\B:PIWu QI#\|uJYd ]uPu|,Ѫk|~:u%d3Rk2 E{  Ga\a谛]|Y bY0'X_fTCY6G=zdpI-|;nxz$.8 `M{~AhάԞ2h1fMX2~S/ t˘ EE$[5#Đmg~G0ыvyWXpq!(t@"Wvzq) ^XR%K_ҩ~݃[n?LsJ"~%y hBRp;'*ߟn?증}!4M5Z"b ?Zq_#\I-=M%bcձ >|{z$@C0=|&"|^p-9W%HIDPe(LT<Ī4cv f)]ԮQuutg a_g QX)PCBHWJj9W@hWG E6>-p`dCD>_&\y>pPZ^P>װsũ=j؞-dQPtt\PfoA$Td"KվܡGwGot Hh1()̬-Cic 6š]OmZ`o&q<G{X{)fRpKq>K~k!΄ngˉnNbQ}i.޸ 7d1ʕnA|kEiHp#&Om,!pM27q Vā1񹢢$5YnveS9cq/|;C+Tml*^놖WH=S g2[WBez̉'Q*denv39P1:8HTK\UI~K/\CAhx])adF؈QމSd$0Ni^hj':BVWˎJ@+p}ЙaSY0~gZ|*^̇T]wx2Xr' E44-aqS,(#zMc[%/f9y^Od, }ADgBȡ 0}8J>Y$ǔRJNjܙ΢$8eDHE"-Zo_v9;@aʉ >/~Ucl(pZ`YX̘b:89JXX ;==5]D_3ӛh o Y q[@De7q/ L~Ox | éwztKYbAQ܋¹R_ ԩ=lI@W*?:Ɣ042"tE@[`}!˜]uhl$hЀiH'8=G|౟WqP 1z>+c55IVsФe~QwUDDxV+daWzDL=j9p7rZa~ cFTH#/Yf6q_[xPLZe UL&pVE#SFpHw* HcGIn}8:2 B]SXGkO1$jĺ gaλ=A|IBoj!]FX*.t 2D攄;7ЙV+SF&Vyb@$^L"emV$m|(׹)qˈ F]2bw`R@MM,!:R16m_/ǿWd/boi”rGm2cSvI6MKMF$/z)<<,;`"זXK#q>M?$n-(̔y=j.Ãs]0M(bˑQFZ<&n{oha:ф ߐc!;J*LX(c{F6@j-bl4ՖC sR#G] _>@ZP$BF/cKLoEYAnī%6t"ډt[Kw$yio jA$vYm?8Ul6(JK3d' vFKD0N%S쎦cOd9Q12.(n3}+=`oc'03 ZC4 d̦ni t gYJ E}" >f9Pu^̈́д kznM%2БNh:+ A`qK:H^2ٻ-;[NHuŰelKJ}ql[R>=8 E KL1iB&B-d)S>zɡp$JQh+.zRWnyE@2b >ȅnaA"lDbD}JEc䊜.n1' E w%lUBЄq"{{{<񯚂I'Q5`?=ь &vH#^E!b1Qrrܖ X'NDXLVg*nuvh%clO._U$v)*LWA®M*343eI*JK )֖&Ã:rv#x#o=<*mKpF |3Iud-e"\`-NZ̆M!ЊtEleƿGH,NV MgN&SP \Pϯ,:&#( p~JulaSb@\ї.ù#7\~?Pnކf,56d?D4$#2*mRKqM P#IxC"E@.FVD~L [n(!$Ww848\v.HeBhTGtP#qZ Ra31?&}f󘔊C<@pV)1p43Ȓ:0#(@-@1H/:o&<ٲ^xQ+$*X$\׀-v L }bqS:a`uR ?T zگ66qOypUAj>0Y3}VPmV1c[Yb]"S4J?w97ZcXs5hSQx.+ ɒ_#}őB 2Pp;UګmBo%9q+]W6Vl Ƭ}srm)Sdf[gQ%dj (\;A3>ݙ΢t_MKWEʨlOm &Lo`/F&p<.c>MXƠI$hHe!!ZJ1).E vgM oh7-̤[RT<ԭiUgX55f-V52 s~Bm(RoCU* :g{\NT30b/yAkݪ.O㉣@a 0¼'KR8C TO׽~b}Xz*?-w}ԬaTY7]='%,|(_xѧ"L0e>WX RcS Ld;U:>Y$Z0 zr-/lޢvk*OȁwZ\=]/B-"UbP!C'LFl[L9R6P>l@] ;@n$V.TMshF])T;`&HE2pcvyS E)H'D`_r%VL AN1ɂMPQ(Da&A)6!"GBk$F(uYE:3?\ć,qS!" tֆɊuS7\2:KEЅ  KxÞJq6i_lQ?E C$7~:G#E]Vg*k%̈NʔHT=%p&-F6Gl(1"C"4ݴGΡZMN‹R#?M‡_lt]! ,#-qvEqn=vU[Xd77Vl9p$ W1 ~\9~6.hW(ͥMy0DiŪ?ɩoVJr6Px\]Ҽ!YNK빹N40k `(b )UxD5</7PXbK!}]73EZ5y ҡSe.:pErnDº(L UPXs WMԴocDR&fJ~WCٻ rg߁5avc  1=NJ^bd沨9wY~="p c*YP;9r/#A@HV S 3oDp^"xIY^aAۈ}YeAjN /}yb@̫"J<:|!Bޙ?.Vcau`Xx&h= $3 DWd [B; Q2Hi.ߐ*q|k QJ+Xb[ع%VJIV3 q z~p>$<R|ab_40Jh>&(~fQ~3͌CC>˨g~0ߢ,;}5Q })+&O(?bp'G8^$:FQQE 2r1L̎TqLQ5O( 7 ∟M>G AA`%ffN ϝ?zz+כYn=kcSy33u懱vrb!I"ZoƔk(G/M%FY,_<>{33uJ(ɬm"cl ;1bȔ`:JMbY:GeyUw1Ȁb:Ob(c,_-e2zInuDyQ #|$O=i_g@ҞQs?E>} >&2\*.jEA #=) 'nc|Il|>jUba  ou sn%Bz‹d =*d4Hы9~qqFk|B 8x7Y|'=KUCs0 QYRm xn-Pvasj Y=-,fT@>Q*۹1thy6ciVҊzXclتֳц+K/SAGoX:`{Ծse:Xs%Q噖'^`́ (HX|R ̀HQ?@% o+OFO4EC+w$ {&>:jN6+]$5@$%-VyTjNapXn yKjL$Kb,tp`=r QKb[,9`h5'0f&vg Hd+d$P  NE$bpܟg` F?>b9O|z "X V$V?(fK1& [v`Of<+`:]x=MV!,A3=-^٩x7+&f;tRF{yz+<CM%xYSaɎ*&`A 攣8X+< |&’OZŻ9 RX^ feXܒ*u?yNZ>ZF4N$ Y~Yˇ[˚ Z>nZ,.>(P>`oa|Z޻9BFHFF}z s 6%sY[uˊTkhH,Q3ujx9N0$]*(@3qƘ 9rНG4B)HƷt*hy`l΂W64J~4kOGull?ӐB>=wC$yJwyYU ׹/eyx\}!O.8h-XLJY?!y~8w3Ϗwиg߫3'GN0y-~痈UגlRsr;ultP]/],Jac.,gŔ~¥1$g11%%fSR6!F eU Ks5rmʝGאΒ"g^<""k&%_87ݖ%F_\8T-Naw%;o:7堨O]w~,9@nek`ļwi%;]!YWfxc̑cz!_?S<>*Xh쁋bFzO EПIaT9`=~@TOZ{?_VpU1헅1nE0?u݉'Ls@eHwtUhCwtSM@AQc(yUS_ o(USg͹4DZ [Os\M͡-zuWԯKi/KC)`e}\ki(䂊v>cPtQbzu,Ɖ'?' dsNtxHJuI9OjĢ˳0 ƁԿy9uy1Ky/\<5Rtl"qk} @!g7!~~y?? Y* #wQ Ig/ᨾzoʲ(fH6uEeπRDT(d5P8r<49jE睿[ w6NZ#U ١2M@prlE;{)u>y,}bg%p@}uPVEiE15U9q#\ '8[N `xUJ):!&ȅbc;3Nl9{ }fO"8szD=%d?UGs@g؏nnF*q~:<@xqWnDyzs2_W_8/DlHA Ulua*y8&DZ׎'&5oH} q^ΤT 쏷砡znHKJi{h+ņ{N1IO@n] #c`pR!v\N4m}ɱH4S5.^X׭xst:ir8c=};ݙrK=GY$,XV9NVk8q-J#m3mp y0Ca,2WiPo9 OĮ9W޽v<`/)΅v3S#v;9ޤEۻ#t`Zŝjo)gx佚cpgЫ9TB%SψWsah΀G/&c-;x 5C40S|G90wP/r {!@N= ^yjGG.i{:n|_/d9E)SOjsWs0A{?DŽ1y ̷/M JjƂ2Ah>i@(A#BږK!,"dwZtG3>NC(ItWc5Fbs<LQe59 S 3ZU3 rZȼ0LH.k@ :TiwVS7>e6e]"RHV*iy6-Jq`YhuA f\ϢCι,~[iC@xkB0jHVjr5 ziSX\>S OwR OuX5Z_X yHVlyF>cqAnƢBꑐz0Fp+w'#ZWϽrIzNeb:fXw` 9%8'jPTW8жТ\lv.S-/^ ,bI!yRvh-d.$B`-IƆ 򆹟|*s#Vy}_,kwR9ӻ!skSr??1M؆w; l|i 1ŒCҖ9ЌdAlq ߶STvL2o^@ 'cbiRHx:G8,'8{y2?&~࠘[eu8ۊa/W'):8uEmMG6jQ>*8GV2ZZfuiVu= OE?۶JdM0ν|%Jb.l qH|h JGpK [?`y|.cr֝׍2W)3x`İ{,/C8en23JHMf W lֻdI߫@ŠT=V$ P |eqcS%Hj$~JJ0$!C8 vdwֳ gɏ#==Ef&ȝ7fft5(=A^Q33676$LA'|l_~0z5oL BjxhHpӥCql`ͪ`R[_ڙj - *jYN^7D끛*aa(mubo{LaCapQ y$^{үҾ*Gk`(QDZtzW,O!ڙˏ~П{NL~'7yۙnxF/O}js \‹;q~yBldلQ 3Kc'̜XҜxo3[wpЁR߁q󏒟&^;I~V&T#~tOD`fzKظ7P3_֨ n6!1IYkmIǽߺ8pXZ*eVo<73KDFRF=êK$T%RA5oX;)xo 6h_V9(e}wo "e'2}Cc;qzh7S%_rrN4v>1bcxIvk!(}c ~h7TBUd-Rȵo4fg}0CC.=H.td~!ߘ)R-0aYTHb:VW٤$\~4~srչݡj;._h&M>[/X] Qx/PiQp1aE7Pߔ&98ID`oHNǺ7?eωW5M?a>Lz27YszLˆo3A7FޑT5}%c?1XQQrq;Y0*LjԛЂn=eHӤ;Sz^\ˊ9ղu!vܤ'.Y1`6B'!Jf2a˻XqU%Ȓ-FJ4*IhY(¤\D[wy&"IY36Wqz\@)QNŭ<%w@5̛Ty3EK+.a֤L^0|[呻49z ':IVh.9-#%Q6fS}vD,I!犩 b^C c~p'O*%ᜟ(N?q 4z*Qa!Hq7J9$| [SSenU!ӱBY{e])^)b9Ņ18 GT,8 SHqR0lAP (U%*')H~ Cb)qZp݀g/סJE7c35;˦r/98j_QQPȨQ*GpI[Q5eTPTYs@] M 5=ka046թα"(Z6:;5l2s0<fwt~٪U)sت0F - ɼ͖kŐm$ސz #;kva7C_v`l;Vx,x؏K6%!i&| c0!9s ܚ"N $\ԈJ>HEE`r,( VC)4RlJ!3G/G~M+1.>Ov8噸 p.>.]*%h: tܲ0E'V??u=o/@ŊxeadvuW3;xy|sPT/DZSUhm)K\4qDI68qۊGU2j<ȋ icAG;j1M غN3?fO# H}gy.~PG8Lr-^.l(0W G?g;>WO5N**u M aTЇIzwqg!6 3 cĐ LzèWOijEmL{Eh)uݞq9 >T<#;UPq :T,x f~-!֞EG>ry}D_C1/!zRAnHM((> iD^2wl|"v9;1qe'7 t̩Ir/VI1M8(Ay(@#vt @$>;#" yV0\l&CsX#M?lect }sIBjl:QLX_z]Bhsxa=*tV+Dc |-dx-LR)2TZS1{O FGrz6Y"fнWt3vpWsœ9p2wkJTlM` [Fn8)TCUJQ B2@T5 ִQc/8mdԤˆzeqoK4 Wxi߲GkLqFs]dQb:||̵JظNS14iRQɠ.YL[KF-PSY]@dyg{tϋ]m:5J*j3P7-zIw ؒȽ,LxJjXg|=qeOq iT Pt%UI$wVWCSL&9tkTeVF9)el ktQUggB̦ z8(G&\"-wl&sH35ܨBLj}ǫ\j6= V>2H$m BaHd!XJkS\kTBY@ ~ըl z⶿@׹ q# 8X7 Ol3m-.bI9(8 t*)t ćmN!;f=q5vm3Kx4/"LPvz3bKPTΩ&N jsrXi dQ%/T=yiI #Hcqɪrp4fdTZ܆^⊉Kiϣ9qa(+Q,uNyh)E3fAD,xsbwku)[@y+ʐ>PYr/ydGf Xù"'R nf}j^ɣ}i`?dϿzBtf U_lz5bh>N%{X|S @~xh36ogL]cm1rq]Xڍ͋o"XĶaؚhz-8 uEPӀ\)ձ3?ec#7p.a_ ` ;Ԟ'~;v4l峽IqK(6ȌF쇕q>Ea~mYR<,XDh1DTC,mIUnX@?=Y|7o$oLC(m8 _/ZI"(ASSji 0Ǐ }?q)-Qr|1Z翅f`x|@<3&A"ZJV nIq4Aa@"8*/@Wϖf=CT/FR~`8[:XুzqAA }+ΗkSu3 ָml$ˀ;-~cM.nzTptCGD@\G~*߹(d1VuɺDO (qe]fy@ M+88&8d.H ƨ'BJe :B-'/}T'2! >pMǿ|q7sfϻPx82N3hQBF#6'Wqu9btxEwl?hUu2Zg|g5SoIi6s+6{$n P [Ob$h<̘3^D6\䲤x!t_FOT6a k ?|fμ}?Ss۟N{8gud)zlBHr2?-_{='W `Va#:jVҚHN|2TYDxD6%]`d=Um)GB(O{DJΨZ L/ZP8f$rO#0A9B i DWksآ>O;%⫉DygK2 }m0k䈜J(f~P8UY2TLtjt&E᣷7D}$!pgGpbEceAnO},ws|}(F$^8g[և 6K0tv:aHӆsA)=UC@ngslJDF,5Xlۢ?D>Mx&,:TA-/+D^BQPpcf% "+l~%Z 64(_2jP?F`"^=ݸEZΖ :*EhMip j8 "ð) Rw5'[#!x8lzύz{ QeGg#.7',Ws9/EH2BȂu#R7Y5#)U]G~y'B{ĹPHUN5z,4DeWf1jI ] PDX&Dž%,4F*ѸC29:kyPܤ#b3 x707x4I@ s&q= >Imȏ"RB%s |5вr-PX zπdL}_b;A%wtSgw3{m͢ -^49B QvVɶ!9[lb["(HOHMQ`l6'^P@F >!m1eIb|55jK) s/!7 )jFMX mT ;NHUiQ-Xv:Wf۪pq PzԌ@}^TJBRCJQ2%5%EDKյ_y.JbRo@5CLi74"[_4MڒKNc(+v*D'*_Q q[*һ|P%Ҙq7P4!WYA'1ÂMl?G:@92i*=p~@R_AE!MK v[+r+'kCuL~!=Gi!rt6Z2sE\|d˄ȴf e⢗Dc z<:#z0P*ΥSlm/jGx*r T$- _Q>gFnjp3r%".X[=B=+(P_ ƀuNtpDBPk،ץP1ytm-mPJZƧ a+AQ]b 6%*nt斄,Q]ĽS-Y `CbPk`H⬄v:H>ka#!84".)6Iep#V(`<@|dϤg̒6jr8;$hrl-dxG)NJ6˻p.ۑn?\6;k,㸲ØvhhY /a .ۘE<叐 .cv'B>SW/ O,mcjP sd@id: J/&"nQ E8QQ(͸efHѡ:Eeqf|]!5ldb.vŃFJ*G;e 2V]h8`|!SWCCށLOhPWT'Z`AD[׉0LThb6 *. Tj`͙Nlc_h4Isٹy ,ud!!5JPUm"m[zg,n ;ġRk ]2n?xzɢ0Iv UY6\n, @oK c5~7_Rmt.U$̲K^{;Rբx3 9P`hIJ @pM H P,!ѲQٕdKw2L4ՠ'ܔ+Msw96T{W=8:ԇ}3qX3,dʙhQVWŶi59Yz`γ)|͊'R0'׈=qN@# ݚM]# ׭f0 4q>~,Ex7uQ8&V<< B $|/O*wxتn.ƥ`13h2l-DIxE.%cRĩGZ6"~0 R9),_{sڅB̽YǞL6ZCcd:X;rYJkJi*Is;n!6À(L%e0 ͵2! C ޷xc߅ʶwpKlx65Pp+zq8RRzБ,[ [†u9pw8_=@l׽ &|[V%-֛*4V{.X\>I2CPbSJB/d)&}u_VnN,s:1@zO` @b2_T E@h Vr,r<'z 4 M`X0أ$䤲_mb)@o8Be-ݡFx,_g~Z*2ducA b;rn:3e5A -c\?1e@1bΪ~RH0\ 5бn HZ,Ff]E-Ri/Gyp-|r>])waRLܫ3v \ B*kaRL<EEt2 <k˓QQ)˻Hv򦲊!1XtOъt$]46t} /,仼g(u#irjH^x2=' EeeQ%@͜+Fj35ؔ}a<04j&ǖϫ/h1Ez@t*hibL S0LY̵n&bpOoI!@TZ= b0k[b>BҺ ,:J.9M m(|4~̐gG}_W!+2L!>ӧzuN POݼ>ccc?uqmP`8{jv+w9s퉳 DrP0iB*QeJْߥ93LpzK^`Z {->e<*dC^l+$}OEHt:cV) #&Ɏ`ưCҔM p\IP*?0ϤZDB2_[%Bfc8OX%QPhR(V]@r`ޜ7Z`L4piL< S3ML9\e¦)U L K-`` !WdNt'ڠ\#̫GW)N^NW!k:L"+PQGsτG$-YLGy~Lz"Q $ th]dEY#1OJT#oY9ʹj"E!-0Ϭ?4aH ހ]\tSG4NZ wW MW@e{TpiPmg:mx%صlB:&T8 '5 9|PZMI21x7 wO04'WUc@-zIMpɱE& 4'Ζ\}X9sHԜn@5>zܙ:Zc?bQ}1_2bf~>`NϡE܎s5Ö&hEM fJJém`@sVsM*3'fҘBQϱ9bPHr@8 [l f<)G ͌y:?Gޛ%C3j'8(,#Opu29@DڧfFw{p'Tbr v6B&E{IpP،cCqAJh-- SayT"y!< _ E6pp,%$׸@r72a\rϼB%hV$$X ۽xt-7˖lx6TP2? $N )#A%׿Nopf+ ؔ[\Ͳ3+^>w@o챍gMwȺt}w݌$T߁.™[]]AJ-vLC0bk|װs۠՗w=Г'QʢPfwPO%L7H>ҸQ*|`)Z7a;Zi"# }s_ТEy [1O'YYo[KfAk VzǏX@'_ m.I3[&TAXx831 s57hnY,D좐~6*ۨwh5Wp9vހo'bsK( }oyqM+S kqcPB T=S?t6|dٟ3B>9 HdmI#5ET^ӴdAYC z$GJԃa (;([{Ӑ=@cn(ͅ:G<] h//W)DLʺ!2S+ '::O^c$kk]+5~~ZׅL%e6{6o*P!ؙ`1(`}[tttô83 Fg&#R(axd!1R0#bP(d./ݴrs\Ni(uzҎ]A|?tmzǽ!k߰'$v37EᓺA-k,O@wn% n~]нoWnBIeIVv=0ߥ&FGg!mH#N(>!yoizkP_"mbce ^zFO;(;%RPh23aJ~f<8 8d5@ol"mmA 5'Z# qm? O=i4lZk^H\6 {Dy +EHtf9WɘͿ׃,}kfvϥ[ƉAUzD4N ' nc0˾VJ'ڊneN@E|R54|.Y{FWv5h[\xBa;q9l]a3g-6 mto`TU.Т/VPÌYnBTwD#^?܉jZdq!a2rڒ?㑣+ݸԻcvT~njmz][D=FՒFhcACQ("%~Jb"z($'@qeam9܍YF)> B>_#]&@N1}ˮE7Fa n 0<'c`4K#YR>XC4l;*7F$H=-e.!GE KZI5QB#%!فӍ8?0FaSҰMS&Uv r\fBϕ%kO25kokG *44ݚkߑΓ)&p iS-^Zo_mnyQ/4(CE|kL@[j&-!B(IlUYn~J2,7՜u "!dTKm6evkmFkVFM(a=%d/VZOjO M",L Aaa*n[n ®zmb E]*f 8_b\YF崲xd`7i93[pNGu#pnxJI??_V>8]gh[wpH1=l5Pv9X"\dq> &>[/h >cEJ0BIihllw5yPܲxuQ+@q{J\\zVӉᲕס=0kQ{(k>э=+`iNܖ>LhI__GͅeJ0t %7nψ"2¦eu(۽9<o +a[Ԯ=Hqy[h|o?t8wIFxH!`VYAv:'dȽGb~xSx(qݽ47*D,(S BQ?# D- \p-vo{P_ .-cchWNKS7X 7<P64#-B)OOclśFŸb lapa&nEizW`Q陉b/įBbir,._bA֚z'bpLQq3Bk0m7l^po2inEbt$ȵ_8^l~;AùaƧ8)%YM*qB!ŽusE:3pV b.^0XJ8l@YXLɠSCoE(K/TZ@Puf􌭷sbnyvI_*㡆԰nŏMM?vsl<cFtnooTQP긜Zԁפ@IVu}}F)~Yҙw$FLkuHNǡl_k֏lI|~h>mOZ\)RDɴ0 ǝ`3h';E)q/FX>f gc;#OM*Q:tSZbnm<`*Z> ů5<@ l*qҐ'!WnGhxމaY[ 7KБ['#u}?4%ZT:UU⻜ƷpfR7c23~udgR,Fi J.,lJ1՝G *[:QT~s1+)hTvJ;#(;iG5'eg\6sdV4-օU~橹2l'T'v6G~'eR@L9fFw%ܖ:ZǛՎH]UXSCn.L<|yXP6: hTc1޾n7}7xk .D oEr1ֺinS@z8YtN:_M+8i]NEj́pLOxp܅BP<2//xAPSWͼ*RA!oU:^05L}j# 9Xݺ8CNIUOpsea+8̡ީcXyeO1 ʃK eȌDE * TLY /DNOsNv9Tu,;dbyBre@)'x|iӼi7`z7oHN;ONĸ93OLLP B>(1m :oO-R1olAωĮ ! I7Fn_`VQI5^~O&6Ylh2ZMI\89HqQBAñiJQ `l4$cFwtBaGa2&,- Gr sдXS4?@m7n@:|s`D цfL7(U68,gTE; *L>R4։diX[O1%}YQBM`y,xuNay3=& CkTР194Ml9Jy\Yލy^14iRi'Db8B;L3=1OMaKx*KB>4!ӵFvsp>P7^!75RW;g5bu!$Q!*k!VLCb3kKcyieL֩Tr KXQAm-ѝ C;o?ceq%7_,E+g q[eŕM2.1m+*V Ml3`6C1RraP!ߤBL!R!L:*b  D؟X_jJHrLS%c`B?)v%:77HyAuHeՏĂ&~V"4ѫѸ79P& /07m)&A`8 U#.81:>>R&WZ&دOMfanݱ$C+\ rʌqWS1ˊjv0mRXVUp&4"\I{CdM @l}T+ خH}G Xk`oh-~ܢ  ԃ;ݠ`90H Q)Ѻ3oG2'Wb blPx Yg'O`GKC!pY%}u ŮCPA$dSB$:(?$,<(Ree<&LX߫.1y&%7azDWWVw)z{x'ts7A%4GYP)Bd:xĖquV9#Մ0 j#'1UWɘԬLU&iҏIe0Q$8Ar#J%cM%8<\a,WdSER\̊Vk @lx_AO%jDi+sm6\ $Ya5۝t(zx \rr/Bhބ/! itc)~Hg`9Kֲ/P<[DpՠDK'KH^nd B5̓]F0?38Ӻ`M1XWj{]) zI"(fAe(oNy&LG68%fB!=['AMOKuh`Z\Zm,ܼ Dv=TE>vH;ULZ;HLğS0u7V./+>@"Ӎt4DuUuoWQ͆Yd%v|b:l7Tt5;A"4! _\`hc֤NF jb*`F+OcXwU,-KYo,OM7JO?d W'Af.:*_\?\'(Zeƙ=oDHh'5!DMq1ߵNyۂkxw\OqҬ_zR`/C. t`)M{ e?l(ߛ&Rsw/ly v j`r4-z"4,D$<ɭa\V[l0#R¸2wv`JZ 7WR5S)\oy,JùLPGvƗlu](' НWGS'aRUPD<܅0PkGCU^P v^#*c:ik?j .UA Z [a`y"-NcfE|9M1C<@9$F1jH`,t%K'FCZ^PJR!¨NL{ p.nƶnu T_(9o lҶR^O%x4E@P/qm8iċbQv'  eUFS5(b(  K}ߩvBZO8&M 5`Yo$(4^AGlm=$In;lzRXOLA$:?Ѵ T%s+H<3 V!Q3wvEFc5{lFHL5!-lIN~PJTaSSb䮛_JO|?]}[-ဪ1ru?yQ}owFpd68(~7!rȜD!s뮔\L׀[GmT%Srn/ISPQvdҌvNw*GȂ& hA(48bzWٮ -06UUm;ڇ횟lS B.Kv3_MHyVIx̦1Hj$e}1:d' b*#)y+j*NmqXb2-V;iR231q(L3_!g8X9I&M 7/vEZj#ajcAQ擕5ezt':#@b̧Qˍ2ME۪3X&i#uťo7{|2A@6#$)3G׹,+ʫ2ՕP)AN-js$bӓAV9*dDfZi`P qYrWCn.G m̮fn9,AaRV3䨂q0e ^$`Ś2XBW,(Kk}l?vn,D&I( tAW{[ܬSkA-D-@8u)g,o" =}QJUM8ZDrPUnLm*5X%,BL=H:xhna`Iv'E5Kg+m}2j٢=ô۵vyWr/_QJ`IC`7Y͊Q@@=2Pw:q"ǃl3(c!%1n"Y7=qCVyX:=8^=1Vh>z> O"枠3Z3+R6x3R#/e-([j"o;U,i't 7c](͕Y]i]?xԾEYNGjBoܨдu%OCIN'-sb 7Ƚi$G qN03Q>@jhG)ǍؑǓR:r@XIEw l ߔB#?z ;%L+r |hJx0brln0x4rnRX]@9U(ee  g^ޤ{% _381N1-$u i599AL"%sh@=1B `e)6Ƭd:ZފqCtUq[+QlM,:-2 I (.ךHI_/i>Р o1'$``„cPyD̤|uo$`/ $f_~Mع8eAoJowup6`v r:Fv}mAE6y'aQ^ߘ"W[ KCLwM=28sI{.WnpK"^GiƟ ѫ1Y =9aЉiLIyE8=>ѤPҌ*`p 5i8/p y_.&Tqc5p~=ovx3@u'gH"$* D/Bɓq'Dc *:0DNVa@wDORt+qNԢg~ٱeX.|TqcxcȆ"z6`S$*hp| ?nG~ B:{ KPNso=qX=~L_xK}=ϏqNiiN $>*:"x|^ED98JGoH KLp#Z/߀?ӁeB^H|Wؙ?(, Y9B9\$dϣt2h}Fˁw דA2%s\:SB. ôp2ZsE!|x64~eVA2♘O 2AJBp;2`4<=$CUn~q^2pkDi^~,*rO2Qj][3 ?ĔfKjJ%c5;w6jnIe6kH贈&Ƥ!olG"* gEL+a(NOdE$&&?VJō`ns)7T!{Ez$!/zS s AN7TiY|"aM[q{63Uo -F\ݼٴ #ʷ.V%X4Dqѝ@Zepy?svn mǴ#~\tϭJczUcN4w/ԭy&DJϭ98ښB_ɃaT#["V|Ҹ6 X,XA#ϯ ?/ϯ JW|?oqx^\ my!FZ_2uGb#I*ԑT `jhAF&NER`1qAǩ^c7S[2 ^J9xȲuO=H7DSWF8THF::dBnPf>p&q8A"jx/=vm]#s;8Z{.gX1|@Q BPG $1|oGN?,u !t8[='qHcxpmU-0#lÆ~G)чZZU[dUYe6Ցɏd[CmW8kE|`BgՠdP WLYoSͅ]B trv[MŦ Zjji{XGCg(ښL',`"c= |.i88Y%}+{Yݗ2OAQKUIsҝ/D;ۼ1H< BOz791Fnw#V5JrN-wtl _t-B}&^jD{ui'O߇ m2sj…&eٯ zx&Ux2N>XBPUbbǜ&TXa4%b(7Y ?H<VQCC6B=[g렒Hdu'%u0)iFݖXbG4va{@d$'QvXgh w5JZbDᱎpQ{Y"dR;?{e(5\C>_&U Ԓ$g0a4y@R2lԻFvc* '#.EppiLv(+V_Z u%Jpr U 208Kx4B*h2~-S9*& w;DڳgeYWq,!BM8BM( ˠӬN 5f(]p"/N9g'*o$`|P=#" rg-V }P# [C_B@$7 /!b@`8b+›#ˢy;'Ħ]8yD<zao9*?ڟhT`9qaMֲ)X}sJ3B񱉬ic@z!@-K!sG\`[hK(!-[ڎGXva-һ%R1 3I ?GIAF7*YiI)(fxE Ʉ{ƚ y؅3 L!r0`礏RZ53Z}Co" y qIɿU$jFvb),-\o˯_[ZaGz& ch+(E$籕-|B7@ $VX cVAgׁo׃'VDr939VxĊvsTI[d #s-A!_W![$@s-.Ym"j'q.GOοԷ*L N}ܒlt0C11$66rBP1)|%!1ڒn- y?D 4SxrZ\Q#y kicn7@#cIP4)r4\OIy+a7;ɝ);sgiHkx֊z3 &w3,9"^` Ǚ%D˚%EWijv!8ńԟtA_ [N1-N9dv#gƅU! $)J[E?e5}sެjA^R[zk;s]0va 8::vNkGz!F]?5(O=n9ιE.d0k8#PP"-۳ #l@oPǿ~*o ~hsߐky_d/Y>%o7):6Ck.0E7BNx(䠟/µ۔[.!XSkYU8Zy#}," Ц{%6 KV,VN^'euao r{& D G>g١qzkηqRdhՇgeptu2?tueǹQ41]ӓbHݽE?vx}ZuKKrpJƐ5-W#^{(78O9-"IA`/[jȁEqum2&v*W/^[O$~͎+P.۬J־4Lojeq'6M $tw 2B#l8WǃsyNMmA[=,*EΪ{1FqclnэSnEzzc`,{>۷O=m .KS < r`cG0oQ=DƘ1l{yqȓ{k~{yޚgI_HIӜ(.|j{o-̽(Gn+bEEA Էxډ:p hMuMCfӷ<zVS§O%QDW@;y-żl{ϣa:B/4s=,&xѮn)}NG0i-h)C&&lB Dr( ĥEbm^hO"#:YܤwN{݋|&ٍv7nyۄ2V/UGxJ*(]\of 8teVjPUXY0[ZT :W{m^!"lilqA3^I7h9' 焲xqi$N7{-'}YuvMSjXhKY:OG ] _,!QH7Q Ѷ50h4;U*<5AԨϠ31+/YH#ª:&%L@h$NuI©6hz-VWߧt:qڪ"֚=:dJ]?=/!֗'U E@jin4X*usP6\G汜!%F%%" p)l]@` DqCI5}fIsu#ڨemTiRZ~wc8<#u# )H)mb .*IC"`YR+]-R@Se[xI$TcNq%K%xNf`7=t{!+Zu/za+OsD9qh8*l8B.~i1 F*YrvrKeq.KxYC5mJ``aF,#CbQzZ[hF}%reab7GtՏxųv={ZL8Dr! :_ \ӓSm{N\ Sn@|U919-K"h5|T!;3,ϛt>& 7LX)V-f4L0-R-Gocpbq~Q>]/n: >0 ,DW7(ro=ogoz⣹'kۧMsCO|,E=M B Ic>3hhMgMN EmZ/h|(l$쒪Rz(=?l (DOMpvn ebyrYס9wł0pc-3vyeX*,7L/@j<]F&yźX/,"qY]y\@̈؅B{0 =wr^+`F/, Vzg1@{%'d_x7&;-5wiGJ^tW8```ɱzI'fN#|Eb/:>H[Rn:ZH݂7s գjbG"h&'Cl;Tnt]g0Th)2E3L{EAc`wC` I{g cTXMC,:WOnp =mSm_6,S洟ٍ :SkuxNY,Qr1 5ѫ 7PpmhXӶjߘelk &2o ݵn[ŐZ50494M#yok!mXICK~JB"6_}\ad{]kiMQq ѾH?ng &)% ߄=I9ڳW-C=2JX{EfQLFHhPgo3gc"\ރ'h׃;<]1z?½8VOb};ߣgX4)%pNa„ղbu-ڞ逛鑪Vvqcc})~<ט6ϭ} f!I<"Z;g2)G;Oa}ŧhWY7JSq9 jl_ @<+BE wPY*DLF0鼪mZ惿^ m ڸw`bKM[s+󞣎Go3Y AeT!]*0D\lrcXLdb7/c b6Yxhޏkvpl_Doΰ+$Ln{6(7c1IBzI^`5teP #DAUn$ iROJ($7i2 '>㶁㈭9am^^jQ4h_h EϦפ&7Iq>1:tV0:큰 ٘4,]Hv#D͎!ܘ VLZ 4\ă /\b/ A򌡩I$o=JGeӊns^?$+J2> A hg mϴ^'/k|JN'f9B$HNyY 7̳D"Y F1x!0"`0) Zd&+؊6n3>RoM-cG2ZF,cǯU|/^7U.XlMJcnH&9=LhX)D~.ow;bzl1e5 IĂl.ZwE ̋gl8vFN|̙G2n+Ji-Zp/^\2ը$ zͻzk;0h OЗ$d $ou /_SJ&ž}S#nz/^L+XǐYJzcX!_+f^v#!7HQ#O!xݯ iFFp,ɥlzomK^i@ г"b&A,~?ڰ0ر].dSE_;XId[0:Y Ep6k<+:XPiNֆNmfKRZPjڃTS.F7hw~i(N| HDbX4:m4,w7,`$8S@)ڍʺuy1y$ER%Ql muhⱟ!t?xIITfɭסl_Y|T#*(v6R / 4!&/ znryHKd$'\Sxh*ҡ`Ց|g98Mɔ@ ꅟ h*d +7"F>aw @t{6k!lTM>}ݳoM[%j^ީ~kR,ޔiΣ1/7tfmHC[2~= ɩsS/^g`SJZO/'6nJ̖?3x~>ʇ4y#pEa\Sw{igPg'y~}<ޘG Ck̷09GJ~m8+=?y6Q_c@N OǑlB4.^"wTW0C/xU?w1wumh_64>F/{kN{MEy8z "'h5b>\4O6&Y8}0Ow8;\I:ZXbze `# RF>=ٱyӎn vmF.s chkZս+IAgiv\2:o|I"3[owcN/Hq[iz6GBJ,>E:(z}JX8I|i\_!Hn+;z-rq,$򓎦 L=S$; =ҭoo83YGJ7](9.u ){%@+AtFs}@gͿ>g+C1LU7ei,ʎFC`) {ͤꭜqAesAl}N~${GL~kK ~#mv^];_=1grio?2=ƇAv ==g}zoma6~y=j6^p:\q#4] \n&w[[}?.=!†XIqąLR1vj>xV MxvS7c~Wĩ吪I(6g?ٸN</m>Uz|I;tY6C7on&'i2D9|kQh{wb5߃qR,q~*0e4 Q8O9| 'XqaZ4I]飮o⹄َwրR솧`##|amN!ۏ 3?f')Z:qaSjWaxS!{@b)9xE|ļe}1!j~nk/O6̲uh@S1{tQiA?4|a3jq0񎈕u--(1&΋.\;l}W?oO#dzG7w">;ƜT+7(4y8723W.oSry^Ywא<ţn5WD+ ?AP^CR/WCn/WCreq$yg]CE__w7#6hWkkekw';OqqzM;D\wg2,8kMPlD`l<}5. Baܓ-eM1Mn{No1>L+!>*G XyHn-J= -E)x8O24TB ^dF{#t09/H}w3hlߪp%U1P;mw+mv6]%m3R^ 6;v>+UTe.s&;h@q Y}l|X19zv8j=%g?8~lF|a>HqIz\T#ޚV$Q^8 $ӠΆE“raT, 4@I>be6 m(`NκX,x+d9<Q@(yr?a W!؅99Q]d1#Ƒ^d6$|O~IU@ П1jEb[oJ5SHZe%xb F&{ػDHMsD%%6R{nյoLɵEᖺ-B5gG 0` n9,n Ld3^ymҽ5fu S/|%\}) VAtKd֨p'vb?grMCW hY ά-}ȜRaej9EoEcQ@Q&Q8`C|j:1#-DrYQX"8fB;1 Ϻa]b LC1e>pͿH!?`J0*ryX,0 EnKZ@L:aix=sncU#; tW[1%ՔK6exfHG͌=Ԁ6QC2(¸a+[%kFH9KlN$rT~.B=̂ Ms:p)*vZs{xw]FŰ.=ή(da;:ϜEt`Q/+C75B[\K`$!,CF+ Ȋ(%t&D<"\kڀ@:ǧ_ b5GVA* XT`^4 ^nU,FRFS6Q+<{q˝?y~/U靂m$ wR`ەn;Fb%CK.o S # ㍂Q|w&}5 0v?2ًP.|͸"PA, ξ@@p^O5X8P q<=Jس0c^_RV87\/1GuL˽o pz0|H z&63+\^'L ɒo=1増ĽSFaADG,At*T?=|HܔL%ZK]jKD +l!D&v hi*eŕ 7Y ZY|$7ֻ@p5DoY Q4 ~$<lv]1&z==.Ê_bmM!hoeJp\ ҉'EbI ϴ`A\{l+aytIk"$ FuS}7y/R&MJNiLiLP>;v5>à؊<`,ُՃ,mwmZ#y?[ 8qi@: U¢A Gqh0 V.cuTHf۲㬘xb-9ܛj߀vdqDe2ý+8rY +[7݇`{6ȇmtH1؈/1[ qLPr)BaE27 AKV$D_(9at8{"ceefUIW+ư~}k:.>",P'R"4ڃ 7,xs4p"䖀5^ ؒ_Lat2_s$X^.2B#Y5-~ $5 S1/y͖X&uE8a[5qc 4&+ZQ2$QJdxW)& =%VO#zUw&[?[JB1eU>5bl:;U1:/ʙXڔ0 Iܑ3Ը?9͚%c#C|cnKs#Z-$`x=\Dx S?xmԑ(P ۛVNrdÒ %A[.঄gjaUQž@ 1ʁJ& JKeXDDމu3NQ;)kX{IO2qى )Z,AhpwVy$Q,ܰz we 2eYHZ6vW#k Q\k>"2.cY>l)Kd+'ۻ8# [9pHw]8. ]dy{hl2QXzzzCjE14Z0WD&+}&)x.L[C.()'jT5  4-pPAe/6mo)JXQ 8ryTbJzҌa&*'#y;E@tYϬM\}i8mnϞym}C%/@]8B v?/ۊ8`XQiMv#ܘyEQ[6D3ӈ[~/VAio[-|A 7&PAXdlc~(,?c(/HN;օA"JH;$1',yTza3{z 9笇Q|rz \aC3AKt){I y~\/o>]h'P}„a@{_MdY!үGU0Ȼuސpˢ Y$0z/q{,4BoXf};{םVp \x,4)jic?JΓ2߷!r+F29.հu>H,z,8q8{(~1?ۧ"84GY5{#>BC:V}\6S%D:lS@2J{1sԛ(6}Wŋ@q?ːJS\4V ʀrj/ *ŵ%iT4^bt,)/cBIrYd>Xw Xx~@zՂh,\@[ $;p x1;ܒaё,dɅ~Mv7l^/ʯ<tXEBVv~'sÑ]fKgۻ yMvˊ2l|GUT+e,Oj"Srw09A8Ҹ'e/S6؟p 0!#J Lh܎dJ9&Ա^c.-(1),\+W1gDN0y}תhdʱ+_22-f:z!Ţ/ +-wKa1c)vm:vFD~YYi&KU=Pr[#c"XayM3*Qq{xWw(R+ny"Qk:aa#ڶTj CejhU~pcH]ꅱzb.xȐi0ǼPI"+8Q5ÚiH_V,#i[0z5sMrW_8h>)92~&HuA]_VOO.CQ>U\2!b0xXvn[R\tei20 Q%MyBsmݚ;2D΀!}akӀ }K%1`ǐ))f:^K`!q1E:˞eS4#euAс(EӁz ЌNKRZspV V7C"A +4uW{x΁ʺq⑹)+u6Yb~fh ~ׂौeGF *Ⱦ/CicAUC7UapU !TO6[A׶ Ϥ"{'tK, W~&x0c`V6|)ABC~d3RPj9ǷOumX VcLۏu{bxF(92#IzLM͈w}ղi4*R-[\=Y)ڽ,'ˈGŏ➏G ze56@3NAg[y_g/2j_dzӆ)唜m{(rw mۢV?^_Z~tE E;=T+4C$}jKDgW-i! *]z{4"-@FiMǚ̖|}fT:VʬLCfC3}A@g2C2j`hDљe. Ե6K>:Zh|Ul +%XYlQߖ}o /g+pڷK=/}EƺWg&$aqf.&ow+ ~?/?_>wPKO gO^Ƥ58u$q:y]u<w[0o`[ɘ'T3kغ'L;wڝE=wik{r|~IƎi4ƧΓ}=>ϙ[3OcN9n3/%/c.|#1g>!d>c ̚9w^#_XڬYs&۟_NwwZ3;^w̻;1oDed|ZTƧ7Y(GML8h)4ЛcGfbff(hA]KWݱO~,69V`D(/VV<<{>?w__ڿ/ݔIKgNo>*C0gf32R3r2dɘ첢766g;09钔 :W̉5~I=̉)nw1<iN0'1gӭ9ZiÜ7Ҩ6>ٸqXcicd!~}TG዆3 7|I_k8+_t>||;Ǟ>9w\9܁s\s纜 vg+rlϳƞu|'0:OY"i)%45q-f3yoqKWR_;f1,T]}NS@Ә$X&Mƙiˮc97QyYub8zVĺV ٝ'b7c6u(- al(0VɆ*v+FfcXg%[Vl{mgOl͞bOgسl/2ղY;C({Ď=6M`"Ŧʣ6Ee\yȶV#/緲|>W񡌁2Ԩ -'c VT16l+*k2OjU螠s*;rO\:rrU]ʛsUZ22]-*%%~ HWM9jō1]\N{GHV2ESIS/UmwC7WT6r̈́5ctq}rz5Sh7fLv!Q8TKΈJ@S/Go^{l`M@<.J=>zZ2>;1Iŧӓ R_mhxnŶ OWk5kci&z8i-.W- 2J諞vXĚU~k,p qۮ=yNxC1s@5f虌7 ȗUpo3o8)FS % x0L,h `<^UuY՜/'$]IZ)ɩū^Z[qZ{\.|hݜ%^J}E|+A| c&Gi'ԦFzQ\dZEPhjI x y/|zeE%O?U5|j:?wAz1N"gWgnlp&5E*כfX;C^jTi-{AMwj)<'82V؜o\Z6&h݁sdn fE<2gnE^ʃRA΅A_\u+f/PО{qλNwoJ^qk>s9w.\{,Yw#3y}E?=~ֽ]O{.~+礼њ\T?!3I6ٍ̊h\أ,l͈QNJ y ux9geQsj.@KSKe6.Z;\/hxw9\Zh!!53fӳ-/rEES`~h] :d=ܻpY~95L+~\?za~zjH?~簉>HZ9u胣G͟`q\:͠a2U%O5h4109&RLTY~: j{A1tcg?wQ#?8O_7,ƘD$!ƴ6s%Z<{ӣ[7>w.{<1$i\oBgBMKL f>_eI|>ul}6}ͼk.)agKA[.|oEn qF\&vk?J \DtfA7.̖C\ .u_+2Kˤƻ>:z fBșQ9س0JelA?n:9ƌlyAoDbee;!_·,hZ0BKDhI b.`; )HH@ Hq4 D? {4(XMz7A}t c 5' Ҧd"X3S;OXȐZ^7?z_zitgw>E>`,o`]{.;B$;[܊݊SӚ dd M1 Ml'TMouՎXOia[l | xCtCyjbj>/\f8WK3!_Ecx*/RmZs%VwdtKp_o6_nVz3/U}SɷU|׊}v7—Q#&ʦ[%< u$0* SmuZ%t).͉si) !g M)_GSViG4YT:ܚ?W(.>Ep";c 9 (.@V-ݸ,>bJzƨF|O88ҙ>aۘ.Tƛ|#I渺O`曎a5$Z+dQ6)d_Yl!XzHXYrUc⥍6ՆE:Q- A_Y0[r׏jX%-z'7* }-_w'>>8,'.ۅ:=)bR>CH5$\-ט1jq}iymt CnZUGvW;+I@.>~ڞǿ=E:ް=w[x}ba;<-=6>g/[u@ U: S \ASD'lA.x=Xp]:%g9`Z E{+w3> &Ø 8×o)o*;~8}35myn4G+mz̓U=}3VL:1:0]5/U*TA2bk:8e5) V7`TqmӲDfHmG e q(UCLkhրf|Μdc D&gO3Gί~|[Ç]yqϮ7l\,_Y0c;g;vhO}ЛIzO֥Sݷ(XxJ4Bdn HH"9w2֝aGF ( `k1 5(/A wAMVS&%b8)ɳIg@ @duC*s NG߷gs MG峟rCo_IxŘ_@]ߝXJ. V&NbXZì |y.0/಼@F{  ^ ?k:06@H",ǁ#4 8cA' i)=cIpN#F Xдy]ٸo\W\(-֧ꏍ{?S8X!aDm ( :YYcWBi+k}O~?n/:c!kt;٬Bas!/N9~‰osV:i_ᙏ?xQ??i`߽J$B,(2^!rPuf+ Gf8Nyp`! tf4T2Kz#17KR1RlcJQ2;m/eqωay n)iqX@ب|)N4 .- `Nz桷?xn3 40Z!/XۅZwLW @KKq@O @pB ΐ`ኁ*˞~U~~tGv^7yUAaВΦ, a(C7 ps%chmN05'LsIvbm);5 O?'UUZޅqz/ؠ=V 2! MS cCg5԰rj(Ni 7KfH/j˨u- LIioZ|3.)8BO 7I6L=8a,콩X(A}xH#ző6$L.lV@c2u[aDKŴE[ฃLUP{˜gXcg'u@)/n}>hJ}~P-1 u7Kj. )7^vOW$ b5 3è]$]j䊉롔6,V_'j.bx'Ãټoa\`XhS5B6׋F2AVmyt\`F&_Y@83CwDW˭ƼjmC&!k4B29)4Sb֝REÖ:Yװș1E( sD,NlT(0T K{4eNļ== @ '36zĞ S [Z]!MhqkQ S /0 ,1s.͒щkg=X%y_:j}ݗӞ >3,S.ujfű4;٥Ij#Ø&C0PpƜjf۸ۭKLo3-lBV,lӹF17p3Az;|^>[y ?k%=y'i]fNhX((0#$txZ<O/ZӈM$QrF&b,B8'1+O>%`?t0(/%@Bߥ=rs?sU7pZs0 [D TT$]A|,owg <]sS+L4vS,eҐ.]g8Q{ Ofhi`&\ M w&a249̦&&mlv%EϚSØK{xù0 P, bA 0B$rNR4p!\ڠBbt3ر;58y*/ߜ֗_<`ӁK$+Yy>WAz:U7lt>ە01cLDșIIFl(xcZscQD scC5?R|cդaV3IǏaE{?oi5Iu;Uh°7[Y*DGOB+SEK>J a4 |a߃ (!|' DK6/^VLXgBnf^l(OJf?Yq8]A*wNޑS9M, f`\t[O+_nuv?:ͽEZXoV٩vs!b`S4(2 •&!HFG$m8 Q}t+|}G$m_лA6ZgXI4 T 4N4TU`E.zћ}3X~i;R.ƆB釱m+ab=b5y@`2|~<{>f*~EA6RIEF̊ !$%\]ѩ64|~ӏ/b+@ra5R`!_12:*?MӜdĜ@hOb>1ţ~E k:*E&þDXfn^/x}>G(?P?K@}> L\ >5 !9[xE.?pqZHӱGmJ~h Ǣ$Ѿs`@{| opts Ī6)eD^9"L@ģЬpHPd8Ą$P$CWpBvMG02,x!5d$b^"Jc/R] ŝ2S(D[eD,@bnvԝ=3Zolw9ֱ^鏫&s+ʏ֐o]jfMF-<|>#bD;!{*q,;'GlXgg!GqNp ?`Aj+f΋TrX=^r 7 #=nPb̾۾OlkPNv|٫/7z~VKxL.߾K-ޭPʱbbbYl@qbPH*)03 l 5 12Bnݲu_xpg.JuP{](X(xu^牆Ttrj]1>.22X[4u*1+ IF>:~I7 sX-$(P+|$nć]X+g1 sܕSwi0][vaǮkGO9NGzOڵ۠Ǵ>g'|-!!u+|bփɾӇd?=|7ZثN߷[J;׮Yv-Ϗ"JܐY!+V'*hOPtd)! *>3:H4 k.!ޘjBϟ@':8d)>ϩ^A\k+ E҉]_̰H gt6hz]R[C{,fMSh6X"Qeug>&}nK?)/i=W:$tZ|xI<a [HPF,6[vZ%YڲyToqK.vcBrj_nDK] bA6`ܼvZ41Ț!d3,1 YYLR"P2{? 3y")N dÂ)ٜwpa; ՠyj.:!,xQY8(EHQ0bp!H~L'UY* n2-뫕=^W(aD (JW3y_vN(T}]OP6[9) [o<toO&IbU h#&wx=${0 ,l1-2H~š(^y" ZP\E'TpzX0unx Am,"!6(L2,!rMz7^ҹ`Yp / xA, '@*`yOqB2i60K y(R1f2*#6[e|kY?͏_kgO<}H},{9[U/?-WW+Ə=ϼw={C,$хI~ݴn,щ3LNkCĂc6Rk6 6\xr1 &X!ɻ°fwyټ鋓jyGC{xG~o_r1ފۿ1kӹ~|4B6X; duqu2گBR HvˍOiWߵ!X>+C+ٺ2dM.>](=0zdi_﷡!r5dg7,Øeس }ĵ{=R;ox'^# m k Su@Nk |I3NJqshMVnRaד[ obSrc]z;G\v=:a'l_rs`DȾm_Ҋ_%]]Sٽ16ҥ3PfeiGELRDB+ KvT~ț,t-ݒb :9XI,]"TRB$h03 JҦett*^2OZs{e ׿,UCP@4e~|Vc5[lP;Y4' Ե@Gfk݂ZnRa /֚FXzCXSP%KkcXŊJy5]@bu;L_S^@ ^ĩ[Js[{4SXbfE8']'wCBȣA1@O^$.Cs&ug;MsSuwޣ@=jFr.%c:)*9ܭ};IׁlGDPp iwogGO4Z8(Bvx8 (ΛR" .tX'JaTB" >JX '9H@UHB|#(!!16-ZB!|Na,4E7%F`ނpG>8y,fi+'[uI·<'/ˈ}?gu TIhz x73}tSg0}A)4I!9+&x1y14ؕDZ֍WY"*7 ل8/^ lZͰݖθp蹭֬[ͷzm}U\*mWEϝټƐi)vXsJ" !qYÃ8@ CRd Q_+b:2C&#InBsNӰ,YC$zXZ#)l]Щ00RO K%׈RWKVUfc['*W5^Zc+VMٲi9d㚿uW h#82"3҆M9]1 e R5a'LA͋ 6xi؅4J懢ch) cQ4}q R)\H\>C"I>Z] d0O2d9qp|)XvL?;!p*s $,ž#Ԡ^^zywP{!E֊P8݅ѩ @e# [:6\˰dY"MBeܛtL(}sOn]5pࢻ?p#uP-,yd-㺏.wka0dm_Q28#ix7u)Y]uVmHzvNIgMӫPAD3`"g ?FȰ&Í3, )A92]if޾MEE@\`/{vB*-`5_Q>3(6D> A $-oS(r;B4Q!WiĆ1Ҫq=ou"mmcf4ϊXLn%DZfb|OxP煞O>BGN˪q7ϩ;'[η_wz=/kNCr_{$S5ѳR9]ezg<-V"$ P4/:A8PΖxxK'-$aRS\p(xk=jKc0SD>`#7knv0NDD45K;=װ|+|YU&W["6~"}ʫGu6~D\Lgr"<^XXNoew ź^,)|uYߒW5] :8(1R=v;D"͡cHddE0p,"*@fʏSڟۈS\`k`v]lgj'L m čt tWsDTVlHT?>?g֭^?y-I%3|!G yEޤaN=7 i[+ϗ΂6t}I/KJ7)1q̼a#zR8k+I0e!7W$z2GQ|ZK/M\c %Yr6C!#oBr)EB^_Ym\$ )Y02os޻.\pSF kAO.PnÆx-G-X:5.w뱆+}U|g@S8@ _w}Һol1sPҒ"ZBO aX {- 1 ㄕ(CUv" 5֢7[4Ah¢zػzRfa gEx?P7D)򻍀:0dbdhTĢQ*iDA쏿9(n~k>[o9&/p~'zA'A1iW|Dq傗2dBa7*dE#Q(yB); _NjҲ#ܳjq$}NZ=~B #mGѿ"#؎x@aL6[pjG){WR`x*zw;o[ğ z=!k2Q2Y(l9@t=qF 5޶v_h{>}2z` ˺|Rc.}+^Y go}!yǤ=75G_/i8]42tf2 HE$i86>yYo1G;}/ ~|9 :y*lNr\kt.P7lF>7GE9kJ3rJd2DNQrV[KG! QBm EYgT̃0j"N`~w/Nyu6WܔZ6hlUn1$k{ژuC/tu2/SNZ[#tc㛼 vv9HiўH;;DQ+ UJF+@,J%ʂZSB 24`vq:( 8KOHyi h;$3$P {$C 'sP IZ'OoxD*i8.MlY繃VR.=E.0md)5SdZ\@`MRxagđ5d%$5 WLMQDS/}u-]Srk}y=iKׯ}lةtÚ3Kf37n{6+ujӧ Yآw)e5K/~Vs:  UO-Mo1[l5Φݢݼ<·vQo;8 eM R-BV©9.?.kq3ߩʤ䑆rl؇Mi*+)*)x:AiseE!:aՍCT6 Buk;v]&zlZr\tj"M a<Ij'~2S"Z w_BI`, \W_>?7̼x>bGl?M^2W^(غ 9鏆@>j)!m+T"!'>"n_bߗ~b).;}nf7>e H>\in}7ƙrY7~;RoP1TE7>hn*߈qP;|4@+~`?Ґ?S )NB<:TwNB 6i8ۖx  B)]Kg[ooRJN?tbv g;#=}yKj_|e u/_rgwǼ݊niӾB{\9s[#Ĉsu DNJKOԵpv^no.[_ ɝilU4e!zV䁃.:!@v U$7W@ xMLKҿǍD/ԅ)Eʤ+y " M {a`,J8`&9:ꎰp8|73V ^%z{a}j7i/3rR)W׎z>F@ؤ WoBªgwYoo.NTҰPшG ç}q*-\)2Gc)v? !_4/q%@~x.` G!,#J>WqFfB($od"&:=֩F+pt Lgѯ Lub2}/ǮovFvcSV0rҼ Ilu2m&T> xXX3j? xnOhS* {Ǒ/R\(!¥c\-9O$dMi#\hlAYP_`d$:FGeZuB P2Ԍ@Z0%V3|ϙ| &$4Wu*\Nf3C;7@ ]C8״Yz 0()3vzJQxQ:amAfQ4 Uj-qW%SR(Pٴ\g󏪷m)&S~,pBW8 E" W8 <5cQί![+t^ƛPƒROpQ4X/'R.Lx| JYVd exBCՄǦuC1!ͼŖ^/kve{Խy|^O@xwZ z&گ@&+?oB81K3聄1Ljn/"^zlEnC\-!2g!1_naNEśrn ;Das L큭K8u %=jPڣ~o~QRy~`m76!sKyXECFvKS)ӖKQElLGu0$DL%V"柸قZP E$YXpa.$J:g7V;NFZIA7J{&Ao"i܌AB~r8ay":-jGhCB^FN1lbL+)bn{t$i6&"esk^+ֈC蜅uߕ`LPJ-hqWs`'Z3XK4UA||X~EދX#(ک/HAa/Wв<#[8ք߮`Ųsd|Y0{Oc"{X/O"Zo:q?x#YiRfq3<\jgbO8pZi>"`5D C3p`CA$-!E&"!7PXX-)+O_'Pv`xl('T-FdZ)KU?wj>p*XDr權Id'ƠG]#7c|d[ܱ`PM7<#iؐߨY)«ʠߔ6{AW'-&c`עFaUF-?{ 3(GpeߛCzZƩ\P]+Դ {MRjsa"D>瑆JA~bARڣ.IaMȕ2 kCWɸ#,M,_9<5: K'Ko-MjxXZ0(ǓM{tܮas=]Np+?8uM-.ZҔrh }o`:#0sv̯ˍN!8CvOViy( 7 v޳iPR0JHD:TكLtP\Q~]*%ŻӯΧzN_a2ERY4,2}VGT{U'۵arZT_-W-kﯿG^e"蹲Iе]еݑ~!# 6px&E& v^jt-F$y|j|Dm"16sU^1Uy#ˢiCю<16]io0N1$BAڇMl^pxWO^( &,&v9aN/{s MgdS}Q\L?c,ַO5T #bW$?-g%4g꒒}E8u"(=J( <$'mڒ$ۆs׈˰~Hj'⑱)P5ѲCM \ aHۆ L6 L8U" ÿGi?_-Mh2B<_vO61EE#1>næ o_ïO<y>GMWI5WI=<抐- <ⶠ!!b6QX`&bDY)W fT mC+J3ͅU"P'(/6# f)v3#װQ !l6.uQLla,醍{_p8]ľs> Ul ߂>I*0/@Op6N W :])A\%;-GIa[_oԟ_['|0 p%7A]FfYA bI*3j+Qn~*\CaQ|w IU89iƗЊfs,^JPog~۔8"e)YFTQx >5ΐ(ˆ J{N=lB"3T{)1]6u$"eն>!xڐf_@vpDJ*EEFXH`Hd .;wT /5ݿƽio rjCAI~zX|$ qJ 1GBQ /1թ 'kEHV8!e5QK-!W[Dab(}EOYSv]~`g\]?@3gIFM+ux[-Q$5SU%* 1*JNePZ+_d(8|dcרxsKl` (?@fW-chQʼn9#i/HˡRXvDXD`"L%a'BĽ+[ @uρcЂ^?*D3s[*[64"ZRe/)Z*2Tߦ߀nJoamtM*ǯTer?~L jzW==YO8wt;1bAV7CZMmuBm< fhc;$ɢl\"r\RZ4g\ŽֲEǧX۷)ћ`$=oyduA%pROw?& g {ŵŋƎ]Dtֿ % l[-6Q;oXc/qo #S_0jOE<{w~jO z¿.A;3`slK`K7ެ=샰Ck3=!o7#DvXk(F!x~*[_vk5UjQH<7E>Q K=lF&%4#{ ]2$$ʆ229ֶuqf#]Ѝ;'Lѥ3 V  Ŵ)8aW8)A-=gٽf:z]4~r^l*u? o/|n/Ni&8r`w11[(} ~߄d ^wi6• 0[j_{>"cHQM$!Sؤ(n zK4e$KTf,yAc8 h2bQ^3z2wH9iOc)_QҾksʠnb n哙K3Z;dޒ67\@{"y\Bql'JT i&Si$NWt֧ wB0q0* NIO$TB2)zPوCQT@@DE(bCEDřI bCĂbW\+k<羓pcf={Oysg>yuE>6?rh|}OSr:-f+'cv{lαzlLJ3?H$ UZPΰR"6gI36vIǝX4"/1~Dyg8Ϲp^8kmFc"ƵN8Q}D4tW6$XRB]3Wȉ"(OG-j"JmLaYݡ n8G֪ Osubo_:V6Bd= M@dZ_2T)8`|㚅}Qo [>G on1D>sgmvRۧARWU@|zdgh2OL3| r]N ],6WWx(h* 㳪o>} k3;mrŃ955{;?u{ Rwe'?WKy^}6'Dsa2ᇀWL<ıh7 =̈r{vB3iIjzi"!qQz㒑xϊǂx$|sRqMҔ!-BL1)=6NyxP L[PUXʐZ?NOv^<Q.=`UG1i@iGUce e[|Kw%ywR.76~eͱ/m1o }}Oѹ7s62u6r3"6M3]~f+IZ[t[ZTm8 /`gF%ly cؓR6ufuWAS3;DB_QC38c 'c%@{J,+Bܴ\RG%\vef2 '%A_r~Zbʏ_8 #\FkJm W+Iw "% :rI5Ȝ^[9g?mskUnUƢC{q17c+_V!>sݦqCS@˗tC5sQZc7qGe/*&*9JߦsUy~As&Yw;z]N^s"W B:a lV@.JP}8Tؖ2Βj!P%эq3?--AiAk58O vq9r㇖)έgӬOOQ6=:ߐR`ێ|+7gLtoWΙ~Ӗ=~}-Of2^~'EֽöݷtN GR4aU Z>O/8 &C6rBK\FL\U5Fv{!o;c?\a1{*u(ubCg֟6Mȳ#`5DZ;.yRy܂7Tns6{%or g+)t1ѡZ8>QRTRl_oL_0 O|tlꎱTफ-YӭEFͺef~n}φ5u&,w >S16}P+6C`S`4t &\ЉlT#Td[p[Ko~k_Q~<(?S{9lV& jBJ$`|mK1{Q9ÜnO 7j|\N+Oɰ4+4:tbAK&m6)AfqdBLP{~}SGu*.=*&i-mprٸ(fFlLՅfsfh <8ҁA"0`F P*k%vhV*wl׽OʔܼV;<>j1EGѽ> {9zX' =%mE($ɵ,SirM4VNbAE<v`҉: e,&\]rެMkՏ6wkE]z~kfY5{ާԆ[/\~٢jP9j(0&VtoZ,8?`\􄱗q8,*$c՜ 9<YlnA/xIQ7.$q<'^UzF@2wҶYEϟW-p/95܋B+f3t' 5AGJ#5wFN*uo@H)nXf<8htSqsK>;& S ΃]^Ԍ&OE-} ?;tߏ[?nxDŽ}1c~f '>fO_}먮MkJ2Z:ngtl̲g!UƝN;Kl/@?*-]A= aATDSك5 gU1g}{w0c:>`ʅz+ ͻj7A IF5]ve~2 `t2Fl%@8u6M hu枫Tan9?My>kY`Cyw}߿zU}M07tlàjKb+GsZ'aԋP=q<𵤙'"R#_9n}hgE RGozy*~hjO9o<7[@'`[K_?ϓ $=PJ()J.Pgʯk><1Ή{̹+|k %}RltnD?fV‰8PIR%`. πQQMcMeb"*vT5h <El,lO͉LXs_Q77UO^Z%G)׽8ucRUkכ1/^c3}UFQ$,׿^zq5q&~<s׍-9?18 ;AnCH+;-k}>VTu΁ܢtmE52s. ~Z8"ݍcOvowGf%ㆧtLm3,,dXKJ )`w`t ;+ Y HE8E&C#E/"T-t4jFG_ 1?5(2">Ѯڃ|NY>Hd悻9{j[Jr:`G>pZQ9f-Ops4tlg7+1o2?X+UwJ7hTB|Qq`t$ap. [X&dl 'Y MVy@\q-u2۞>w(i#9CUY c\~kJca\Ca#'XUL !L>C4B]˃iCpiB!s[\Fjbiu#y3ʸ ll+)aC, :7zbmhj ?53vWBNΩ~͢3k]Hf2W~Y{}~ho~2t.Yݫ7?j||/z'yW,^{U?/qj{m!A5Xbcu;;\zhbTmސg@O4Xf#Erf)(y2AmP&^YH1v4V,|Dzk#kwcrv*{V0_77R1v?Ca|L%.Z=rQ!^:Ju,aX,0-\'}UҤ@Hi_% Ly W2XOc2`3&PjA2@7[hz4Q[cܔ;XHfto 泌%Y *o`hq6|F1g_ݱAclzJ0*,d={>t֘R]6?0:] @^^dJl " 8T6=)ȿ*I!*h ńՀd&!%㔮 :w4Pgf@x .H.x4uƾ~ 3)w}? :E'?#<kK}U'l_wB~ P"= !+ѤM .n3^nMD~3W]]@#wgYL߉mW<bb?e|Ϭd28Ye&46ʔV2jƛLXOV)rV j؇יEHg{ѡI8Oy^Eߵ8FbEq$!uIxgšexu'I5k_V@;@ |W?C9ь ?uq.{2d؈'ASX)\ɨOrfPvxxC_TjJ|1$Vp !V-RT%C@J$յޛ=x~&\̀9~1_M@q{'^$~sV0*EЯI/l]I,НY5$HBM3":cc 5u{ƞHOcqGH wJ3_ aÙ'`nHL(̌$;; c7 n*,Äx)pQU-*4;&T͹ASC4 F^w\%_U=߂3ki?CܵfۯYIi槯| DjSl#bڱ> LvF\yDxTFqlaGTujom>~Ĥb`Nѡmu{\sQ<G)Z*5vA*xq.k@Zue|4s$8G=;~رuQx/Z6Kb$`Chh>KpBcν:;aV7cwc 6UB'̿G֚5=ޟi'`8y&b_۴%"o~>#Y)S/ ac5 aFYry!1]d{O 82fY=fɣ1Mo<8oWl58& 9,1B!{Msst[aOrJ 8ܧNʹ&zQl p3!K.8LjxHGܯ#]utܽ综qjU@\goyΒob>ɫ+)GI)L}Sh$`_4% Z 2Cj@lڑ Kլqdb2~{ K֧#Z! `F?zTś+%2WuESCRBaAsQET=Тj/OtJ1jHp`!a4 c  \؇$LgvPdB5?'%-7xqm*-ZS޽:sQiG6VznG5Euyc$е+"3:OFkjw" ; %V0$Re\>\h40` gvvx^pbN Ho0vz 8p .0~l]`(Up YN|ȻN]ԥd7agj %K5j-JM^iw w'.~GN:oӕn}peƮNV%M977]q[:0:`l4N˩~DDz fuB,Ğj⤫;GS،<<[>DuURdzSyu޻q.WE~5oѼgugcR͸q_| ϶r{#ԍ`(P ac "942lJC{%SEl.P/ɇx"C~D=Xŝ̐2S[끠-tЬuiUFW9;j0F[2=~SmNS/|*vb¹"҅{k8qO1>4È}*:jSoORo3KU3yl g21W5lh RN2p$rJO*u H1mxO 6O$qBildOq{_#&*d'{'˪Tɍ׎-O.^YF|F_nęu i<³FcH 4+FߨKf,-4z֚ Z{cK4ܘls Q9c1X)/ঢv?;"ã5.[rЕ'}DkK<EUƥw2mO?01{1Fcӱ֛Ḅ_zyeWX}ZͷM4µ30PN91Bju'cQ=mϏO)9yz'N<~j}zN3EWng2q-!N8d~jҖUN]_$Hx[ xJ}व־ Ux>w;7z1E$'Uc: E;r9=^Q4;bKdL}w H šog[5v`:6fm0P ܿfʁ{6L{5?8L dvݟSAϿ#>h%.t2> CrJC@ lHEBk[|__S0ﶉj .i9s.9,t[v,{;alhlo``֪˗߉`Z#K&@&qb H.F/uH{t:,>!녍eI{:+F= YeL쩟6A?4[ۣ_|yb#wh7T_ _#HBb"tF,pNuf>-Dܣ,x 5}|^7w}o7שB> {1ޖR1 D'U|4ѱC`У ] MF}ZF ̃&zlt% OkpF 7 LO$pnGvX>-PrZN-jŻ7fM7^}z7箹=SbVOWOxV|khd8Uֳj-I]؈ .r(n_~/xug@B)h|kfyh9li Rv8.?ni H X۔!?rL( ͟ly)e%/y)q>er^vEg\~R{0L;[.+{VvFa=vsq;̚;/%\C9]5`uSn>z&$|EU8ӛOhnitPsR.#++<\&]ljlQo:*AevX~ɑ#vn1CGkgi.~hӯ2a- r#98h^rXSC(lʉ$}ͅtlΉshk4+y緫 !Y>TBQ bKw}p=\X^6pi6z}g:{Q:- +2?}n3ؑjS.Wc.27+͉eUUe^F m6kuH܂'7 #J_?2[!" {L+*8 uVq/wѮVE&;nlz9sL"1Fr8{xN=<p23O^#[_zE_>AxIx||!Q zVD(J<5N}l橼Fe}cNS{vc(0«:{wooKM`e2͹P r Y(1e%2#ȵR /g3XO@=d$myMN5>U͙b$6{ժoꫳĪr11㱿#ɳ]mjݮ+i0r ed +X,,/;OdٌfXK@jbiwC^ZƓ`j#L8lۿFW >04pȯ"YMkf w[.t9ּwtm5g) ZXr@G㮒8C@Ny91Q`9aYr[ZSپ5Z(&'z vjBɬ@;L6rtg}tc0?'T^vrsUxfo>qaōPre^gwb"?pnKD:kA4Kr^g]1Dj/co7TJW;TRDɨe~Bs?0\w)pL_z3b1&Z? /ĶOW 1p|)yW/֪.ڷv߫WqeFOf"UUg_/cAn)Þduȶ%@KiHM> ,ߑ<>]uy$|39:rH{α{.9*p@0=VaKn>zy6;i\jo9x=~a1 ƛ5uY8uqkfM,{M r.5s̥1]/^l>F~ިazu bSf@' { :A%i.V"jv ^ONf[zp%YZГRKOG5\oi=wڄP.'(C:QPDmHYq, ,`… ֶtR'>0U{ @@}9'eV<=ۧ,_e=3cQ x*Z}zk]8~x3W2nIH ts#:5:@b---7J0R.h!eAU@ȜKN]wz JwxʜY|.5N.ZIϫ\8eq+Ֆ]}E u 35oV Q-V]]5TØHvA }QQfҜפOrp`y74&SCi>lr̲+\+^_vI40 Z*]${&;잌|ʖWx%EҩvP~ԉ}oΊ+ZhU(ERWLK sK3kP1ֱQj6n2neZϙqy#󵲶)pc;(|H0RmQLּ2$I48HDqbFmV! a(@Nh47Q?)D-f`8JS̗AeՏ?|ՏEulIuş&U#/9*]Z n3/G0s9]ݢ.2_07Tf8`6Fm>Y>kZ|ūEcǶwrzXB@\m5}PdҐh8P\TPNf|: Vpb1I!x $CMSGTċ<`iWRN^b#6XӇ|:mi`s{_ue\Y~Tze20w;͙U++;\H(\ s5p&ofG̻uWּw@"}輱ay7^ic6[)N!_"d:gj;}a}C>{pڕӆV=Vr5?;C6_:;dHv<Ҫy?=SR0`+D3ͩ^<]=y{Di`yp@eoW;cd_XhJHb@/Cܡ\sm?:iUT%:R )!DŞ*`'oډUzsۣT=N"g5O`'JIxh+s}#G[|KÆ.tCW92o);M35R׮tld#Anh_S07+i4͟Cݺ\gBݠqjOu #ݓW4ۨ:@>&Ɓ|ۖ?{RR{o8_&\ tKi{;o t%+r6~X.X^4c>x []^XZUb]?gvٛg.q>\ J):{ ]pB%y/)[R`r?rK ߲@dsBy#^椓G$.e Myww?mROV;.C?FP 9rLB!vow߬RULuzaċTbyqF έ73ۛsjml:\gc~'Kt2r=a;6;ZRkߐn˂,k Rv#,9']E%mڴ6۴q)PYZԩCae{ѓ!p!ƍ՘dOI a!( >`//_v1U; we;~v%Nz+cu|vWnm>Dd0X%sU‡˻ut>]O#fLS-,vU ]$kgERm liVaG}ޥu .uۺ .{3wͅ 7x'OZo8Oq7FǡM t(5wt>Z5b#γj=yutn #xVʃg!RΐTp+S 6<8Mg3&(HTb50m_T9u9w'_O3Rmpd6~*a +d ~**.J0Cx BV` u+zU;<"4_MMOŸ Ëϫs&wu5'E<!puy=ytB}w<>Ϫ`\NU҈9' {}Vk~u }-_XhYA=zsY?W'8'g /fX‹̈~Pᬄ 111SVvL5tAΝz?~w,弩ucUvJ~ ͱ/_ff>?e s: ۨc!oi m QuBW؝e l8Ԧ{y0w?\P:Ud0 +ZWz`2`a[!PSǝAL6wS낺,$|~+4#? oS,#biť_\h78}@=FPVgǷ9gXوaN=Xl՛WC\L/>v7n{N?XttqM˱nW.uZ/vtm$ώp9}mh8g iU.!r^[غ\L@ӓxrmԣy3 Dt2ge @]$ۖA+P2LRG4y)Y8]YtE T"[I4k,`]S/|Zhk6bN;~%ȯk<wpIqW4;K~T%Ui~@[afɅ Mi TL?8F!.? ?!!8P I+U@ Mn teЂ峥:(9:4;ZZ!z!瑦s>XK@h*C$f`4P%#- k*._[6Uѣ(,[ڿ旀: zGׯ&,b8 .fh &$@GbNg ւH8@kOTo##Ox(Hk5[bZ !YCR@01(VW[‬f)!!M2@sG# ̺V%HR)S{UxѪO,={#u랩X=?hH[_d<![bm4GlNY&}, Ly`oo`+ T੷xB6S3A|!A%}VOBB2-4H׳2._n7xf,ѝ/p0 yƪ͝:ڬum>p@.SCU\1`T@if[,fJZ,,g 6ޜ{o^[ks^6@3_-v_6G 5Zñ>iCY\A<³icXY싺uFF1Ԏ}КuFMdu+cs+bӶ$l>)B E{<ӰÅ!gVCȨ&5gX*|Emi}T"3++˖̄WAl0$pПzX`4`jԗkLG:hc9_Wp}#K'9آDƢ=aVYW _W|Yd4Lyh04 )U_Fy盳Tpn #?,U=6A}&@$EJ]jqIq$Lh,o%=%p ]>px#Faȸ$r;;'PtѣJM UX3nqfhUcXu 6l4m)\QsIzT }} =#<@"]xDO ^hl=l ;+Qj\sbx㗚_1F1(Zg^X_g t/#U(7:.X ͺ:{97a5n:*(ѳɱHEx~S^8Ag$t/%KSp[88mFO0![;71=Dg22Jy&8x7X)Ih{9D X<[V!OlB-|zrT4nj t:"c:-ꗇbzL+EaXch101PjoL &3|9C#q?'{a&H^X@u=fRhoH ,MEtI?)Sw~`q͸ys/+g. _ɍ0?e>gva{QNU P6Bxas?FSz17q^SЅa2˃N󉆮͜ b=X!\4_8iv'pܶK.8ܙ_Ԝt鵑Y囍ւ?}Gl$y4{T:[ &%jK}*iD+$JNvd'7ɳNw| C-y5_Wۄb^9%F`]w+1*W) Jq(rSF{JzVLP5 ^C%]< +{Lkُ_~tb]T `B\J1=ice'ͺy[ o,^5_S4 qg9M5ގb3Y\:`D.fXbZU {,t4slcӳ4RK㨱=ܘiSC54)Q>hk Ԡy ,2[o66ts>dn4 ?hX}nza.splPYnavZNY*!D^D?H "fGִfQ[d')rkjmeL施)2/8>'$lG.:>\:R{ w" jmo[/6Qw€Mv{.h?tN_XRۅׄ"v[rarۡu>h0z@nQ]}(dߝ[;T]m7q3~ LJx!t_, zВ1moi%y84KXָXeeFS;n$BoGLfmP.t~!S1 #MM/, h-X磻`$RZiiP+)5׺-3iSXɍdO>6M5!I r'aNB`e. rZ=Gs2FTQHM]sBMe,_>q⭷ɩT7 MPuIf-?|$+V,24G24`҅Q_24Lr:'n~Xt;dA=My*a/lӑ=F7yQ!Ƴ !ׇw&GVᎢ>QǝYt#!МlȑWUThW]./[@Y¸!"~A!RNb(:l#͸Exbu (uϴ+6vG?T rUaK>+fr/o̶O\A ny&Cآr_g>:oq= ˻sh{'TZC8B4a[+tÇFg/j1'}ȘR_@Ʃ^:Piȅ I90t܁קIKVt@-t99'Z( TW0cMlx/qJ5G5hXk9&dm=1!?DhD#~͑g7Z: ~ b63dUo<ㆣͭi@SFH^GrҒg7~3ǻ:W's K!Ӧ:L[C2j.YY ~)Eh^OX h48-{V;^'53#_~*i6sR‰²?{EyfOV1~Uȉpc5_;TMĊ1mg<<&]?R8.P;;TO dw WKq] h*DxhXDOTȏL cxCdaS7 Á-  u rx%{7\.u]bl`ȡX9tis۝'{ws(0Ǥ͋fLq-$҄ 8h@);~'2` ό+YLI7 Xy!=X4+T^o\!R hU` YV4`Ph ]O'xQ{\syG',t29`\cs$vbS]t[C;`>ևt\emŒhuIx̦LVЌ{\;ۧoUܜoySgCS4oV |7wb eM!tk0nڦ}!:]k'v)^.M]^uB^/2ޘ{|&m3%p?gF77xɐ*o*- ^whH[1d谓%~Jю<i5о2">>w1?3zȁ/C`ΐ,wegd4b2NM¥L8h9NZcqO9RE54 b8f[Z̷'Ex{0-+|[FFy{>mmW/F)siii*{ٳf֬ib.@I؏@_lp"3"`сYoB4N /'V7!d,8j:L՚Ea }s}+;:/`a:'W:3QdZgIEX@QMyBػV:$4guT>(!$Fj@lx7 ͚tikz8l|pۡBfGճoX/5G^~0_s3Mwpt b/ oاZ{3L@ߢ]wiT+7l ݈3ܥGUkWX_|wKZqhuM¨mK O&!&#,z73seX0|s'}LيK5w^3s;{S.k,>W?д/\xALZxiAPxXw,s5Q;H @>ooZ{R<,č莖A.KP?jj |ݨLb5`^_pE-GW7T{j;]XO7`x'`M'q/Xw̉|=>~äy4xb郅O mb `?st*5X^B{[܌Gx' ZGUHJ>@=V%\6P`p œ5å/_ٿɝ.h(k9l޼˯sl݌9Wlj=<{W.[H0lV hm.K?6gmm4TY}0Z%✡vouՆIn-K4Zr?]\01!ocuƸ;޻yΦ=Ú,>hN$R9eӆ9fLfa*@m8xfqZTM8(`n.GxA.@ mgUP+`i@KqQv6IGjzc}:e{w< Z_}=YtOxx܄aƶ#*v`_qGiU&=#ZQ|hޢ#9M"vm=\'34vaqSI"V9EO=n:`:3iS?θĽ:MlƙN}mepMW+G(`fKRR0#fFM]3"1AC)l 6ޥj43=1g,h]@vo3tpH7\ӫqӋ~8+1XQsDݱw9Eiu'3#8_0\A"pI@4.[,PB@XoE8\ 쫉!(0}nja}oLe\ve}_e?ӷw~`8 C$m)5bǺFׄ58̥9[wj+Mr8/md,i pyE +#'"EHj3(䧜 )č׈eihP3O4 -?asU<1_ĎyxR)>ʹ?^.I_3 |~1 |f,Sɟ*%e# |RO !|HDu>lʯZg ?@!Zf+%I ԻKEUԻ3E~rC^6_LE4 5VyE7J-G[?nkW~1ܭNK;er䭦qɤ\ < Fv"~O֢DJp4*{J 4!c*KYd}%s?չY2چ%E~ȏeHxT)KmGsR -§,,[ePJՍF/ 8?bRgE=I؎V]L+@0})rdP͌TON#E$kV#!"N:캠x+3L6V fXT@Qg+gNSLЄU,EuiWfUqF 2qDHbw )iu"aWB 0ut/7ݚ8b14ZȄa.4`0Nޙ[8vE[ur趈ey{=H9أyGD(!Inq:M?]bF0V?;KgAݑv@AT &#{JNx&C#F<ůO3 _[0ab1aDEl]?l?^cp1"1eHoN'v kpb SO:n܍,OmIiAXpfғj0կ?nU'ɸMviM$\I[[OZzCJ2j@,m]Bõ@U. XdlAF_+5HtvvܴfWQ^Ky䰂/7ݴiNzRAOݾ^4.V_(~zsɀ6Hvk\_}s}0-(#cS>st%-aGa/100<%{8u!"^&X`i0W00v&9so9`SQ îr&'oQɔ {lV9$1|:Ew u[aǨ&8Ȓ;KO@vH@h@{rbj>A"b$h l`'ɢ޹-hQ,tǖM{7MY>mZ) go||ӹgOSK>o՝E]$Z#P%=$w$ab Dvrtf0mźVx%<4ېRb"w'z!x̑-D]i&l:26َWj%r'%G*F|npHL/4n_~/0G?tnZ)S[?`ƍOjmk5^pR7A+z59Ivs6Rȅ(1̇vTJ]~nj?a#-@/!ooqrߓ:5R TC(e'Fw5־`"?c+'Rk8=F %fBHmì[O}I9v4,zuWLV4}ڸ^#;j6jahĔe]~'jXƏy qȘ1^.+;6ަ5x"ZhjXaڋZ$ZW\U`"RZ~O}vnhulN$S)ŀ%!]thՔc.~0:.~L[+N+hJrc5xט䝍S*K2VWML+ݺA˃%h`(NDU]o:בLv%EDk4WbQML8r*l+m*`=PtqNq=ݻ@곔{ñng!$e)/ߺ6ga ':C"kPoEW"IytVY;XiC R;䛾2}9h,~T\Ńp1B\ 0Cq1"BQ*PCGclբgֳ}R2ʡmY:i9)>`d6ol;R[ ɳǶ7TAPn $EȻڻ[$V7ݏmn߶M͂%x"~M@V/hZ^A a\=1<6!AcyҴ9R@hBrF@DŽ>HcqCM S+(|Wz)/9ODGN<"vǎ9~W>1qr74n)G? a_*N|3NF }<9<$a2lC _kMM{G43 xAað/ $&IF`PC dDy Oy޳ Lj5TNb)FXHUNK n@ $/ey\Qa~n߆[&(%SϿN7mx`oM?.Yʲ6:ON束ʻ̺۰sj?tWu/,壤}*EZЅs{Z]h^~c^hɲWbo2_a|gZ'!E!ُf9 TށG,*NX{`.󦹘VwS@T7B=TR= 5튓5R14]ɯ&܈@g7m1FՍ NͶ}ɫ/gk6?~dG~qY,ףү?32|Ω h_b06XPnB_mKhȇ(XN.!'@ #1 0 )Dms'yiAR@ݢ۫ |:O4T0*]/bCpf*نp )d?F0two0R;l3TĈ-) 4dݟ-#*[8ݝc2^ _ߔ))OOx#=p1%w`/T/ݽ $`_vigmgvm6cȵ -Տ9U 4@m8+`!^*z(#ΰȾnޖ`ZtrsX? cQt$_D 3 l"($vG lF̝8{j⊥*DgVo27$=-^bKN&b"\ּzW]$ti~K..8kК j7*~L3ڧoz@چvK`@6WthfuTD6W[5c>[F,aL۝_l]bY 1oe4VK 0_y Ss!Ft{4b ׽yȖ8U::I5MO[{:8.dT.*1mr{Ŕ=`ZϿv_te|Jc$+Qf%+t 0&|@/#^f/z?}Zc.O_>~Cp00D?}^o/vZMn mZꢉ,ƴ؆[Ѭ:[`[G#I`13Flq22p>톲l?]$6I A~\Ǔœ=/1 1aov [x~n5hi>>.h|}yPA1񞢎[F\>]}W2ܘL.3q*.,+R=xr=\Ԫ6D̏i}")`<{z631#`u2ؒԒO> ',Mr1-"yV`b ?)xn=ЃLô  9Enh/"0Wbi8^qXi`_4,ŭ˖k\qY#&sZ\L0/Ϟӿ#2R13f4̌z,ȏl{,rB7<[%+_Y#~mnߺ^{3V|dꄨ41-eaA#ށfY x߰#|ܙ3RFdf򱎜I"Fŧ90"zXTƽC2G :f4gasF|R{m;I1N;+:)>sf+8G0/$g.D=y;GLqK0bp;v9v,]g1l[pW%ؤ"/saIKBun~I=d|J{ mҕn]+gx(:"oG9c L#RG{=#U3ZJZr8 C=9` vYI"&d}>ĀuQ.˛t70P%MAlBE N+\Z)$*$w5IȬ2\Ur=L#dͪ)DxD+/J޴ӌH4C UrB ^\:EABv%}@ȶ__ HҭtBԣOb1#$=+F:7A[Chk;Ꝧ I2{TG :IVHXXOD]MmY_>b&l羙H}LDP"3Bvc}Ӵi}|! &zIМ0IFMcӌq SG!gT`I tCC9E~ϔM,H%t~^Q;Tl~H_P(:9EIY'„zREX? pnq |٭?϶[O(|.!uEXAۿ}uS`bضbǐSX;Jݯʔۀ % 4 fb#W'1=I `L\Ē5#V F!p !1l ל=oX,vY]f{1 ~}M;䷕:R%X MbpE hh_UҋB;CνHje*K(BCCB$Z|jlc]sqc,gR8 ԫsS=qv,zʓ[ZN~43O>uSM 'L>{~ >.u3U DZ .67V(hZpi-82ִR鿁. ?ё8t+ JouxV%9l+{3Vv(2:I@!P}z2>CQ˷ޫ׋ W5,aG NYYyt׾~yC;9ݚjJkB[O=v&$?\nttI΄=7/ڧ) PY ؟"z'-q{.-ByxAåZE=>wI|JÂjqP hC^#Sn/ gxOi7ztWH<]#SRk0iBA,WND%!Zrҷ=~-2}Nyn.#ެz뛲J1gW.ӕ mL'gVr f|c߮Hn|!;(٠Pz7A%TGkUաLM)}ũtU"=[5 /nr;i%dNL4 FZzRp$dQ; 6FU+ٿ}uO||8vYG'yc)cVvyX/fݏ2O d$CCvYzOvI~;9r*Gނc:&{wM85yп%_z+oj}󲭯M^ۀfEU9[_Q#%SӾDw $g.550)A*5륹vlKkx8lG¥d\*o4bKS?#Z\㚋+W͸Vᚍkjʏk4ݛ/9_J2tw? a3qk+pݾo^E5 ~))SQvdo)((k?ڱI:AuF:#v(zӋWS;RDj/[•)v^3/= !Ot+-")Fgl~89-6!R-:f4Z+(h6^T*Acz) U"ݽ-ϖ6w-RoBE[^Na)Fn~4F@\BwM/+w_B_K:)@֗ r #ťE*}~0_/eTo 茞kJm&4> z!P=)3ߦDà+KB<;C7T<^FzJ6IQ~ *]4^gjP? ̿ޟ"h?O@Kgkc4.ilm1+}۔;91ڸG:嵨V霹-˘3nH޹;EsKzR^y W= BGHCz7ul ֍ tr"1n~ Cz.}&Ky\IV]y4qQ̓g'!R(g4_b.OyX4GEQbƜv9KAqߠfR=.c씲s& &:.üx\j eSQn6~kB! X4vw\;k%꧶L鶴4OTwh#N䡔h+xGB'¡>+w5ZG0 (ӌ?¿nt m>  RnJ6IH@4)c>pys.Kc ~N]2"|`ZpJل74}\_{MhZ i7yT [u%_Huz9)eΰ-A-HtF}mSgb&sLp|Yjp z3w~B no+7I^7osE@C_)=/Hu$V4Si@^9 O)hNy\6d#hz>>MJb$A׀JtC}gI3QfW"%ò0Μ`q}hT Dt(RL1[<-!? ˂ܗDD{4NDK5 AZ(h~4 *͹ސvx O)@un`\|B>L/F,3 ўμ~ܟM7V,s?ݟo`A"kky Oj&: ]K9lhkt(qW ~|,|+.,W4J9tAy& tH\\C)o3Bk)[vZ`CقC @-bo4W7bI爭Hl$.]ŴuV]*>8\yO߸{Zrp_~%E<;Ռn=HzKtnl<ȊcqQkE7ȓP!? qm[YJM|G@w8vZouճC@,Eх A;;R|1o^UJ8X'| \ZK^rO"g%CiS2XV)zꠧo6 m"mlٜT(;dwþLN%.8pS^N˝>v\|Cwqqhv}<<{yʳnǻ;t&t=rz,߳z{:Ow7|9u?whOno͐s7{l llݯwb{O]޻)A.Ajj :t!à/yuMB6ii 9r!>49x}^^+}=tjhyh]ЍCC۷v>5'oX|XJa7nsӯo~)W~7= >/|eC{ 3?tWJk""FGDȋ(8q:Ո"D\=Rť8r]dS㑧#_ Z`ΨCQ'D}%Z1RCL11b2cc b*cǬ?hL{;?vuGcc_};oc툫[1nw\s\Kٸ q}w=>[x̄$&K8i]RSI^Mzo4f3pn ,2ƠAe%;$$I^6y[cɧ_M~//; 38xM>51$xH!%C* i͡C_O~?P0a֦SNr֦=uOwH16pƭჇo0"cDֈ3G92w#1`T7G]Gvc" 9&{̖1|?Ƙ[cGs9.{qǽ;q~܍qƙ9~/=`@=+1k ekwg1qx3wNnNsΕo'9M3i줜I'k;>w]{}&ϙܖ男0Ry?M)R3)Lr)O͞6S/M|Zi-L%oNO~`lA{gE~E-q*yRɧCK^), (_vmT|=,YκVٷX姳VQz2|s=<^Q`yuNu=׽X]4o輥74d54+/8̂ L ^XE-ڿA$eɡ%?-\znYʲ/_ny+Vԭ8]y|U6tum>mo߯&w5|5VYmoxko=7hhjo8qeC{/4Z9׭A? ^ܘy~M7С.6}-mu֩[˷m]u[l=~?)\g[춡FoVm۶lۿm/n{{'ۮmce{}n}%l_}lq?_w4475kJlJk4iyӖMǛN7^ӕkMv8辣vdQrwlٱ;^Ov|;mvoYs;O<7wyەkݮ .dw=){F3o=G{Os7h_~S<z G?hͣ+G>}hS=tǎ5{6o\޼hs{o7_i|ÿH#d:dyGVy#9{‘\9~4ԣˏw_~'?Qęc~ʏޓޗF/"m>>>BKi=|VH* h.((=74%bLZ*-Vu3̆2;fߎRdg+S3O =y r*o1e~? eNox f!`a gYnKA4wb-Dl!7l("॰T'Kl8d#H6 vXcXM[86=&6Jw[;6)l*鬀"VJ X,c3X9 7fUA{V+fu̓I|-db-erx]V'WltE*})]`kg l#bH`;.9(;ec=ϺGQ;ƞdq6|`OIΞaس4{aϳ{A^d/}*{g &{aﲋ=>>`v}>cWU9}ɾb_oط;=]c?ؿu?~e7owovn;u2 w`6s+\phTs{w.]w8;uyޓ{^ܛp_yyGkއg2cX>,>g鼀"^Kx)^fr^gYUsy u |>_E|1_—e|9_WU|5_F X?7-|+Ʒ&n~0?7a~OcI~?Oy om$oSY~?Y~_/+U?_M{}~??'2Ưs|ɿ_o;=_?u?7owo~o;wr+K2,ˊAme;^ve'Yv&M.{^r/[}e?_r,}P&r)G+r(' 9Y,9UNq..g#(y ?"ɏa|T~VOr*'v"2rXiJhi&.,2~XQMR}H êgTW2}jqEMq]v%uťUuvŖ[}Zq!֗I5t`H-_ەZn Z5JTX*]uo7R ˭ٳ :̰z־^,*QG?T_!%ZKF-PQ7Bs#yL]캇sJZͺaFMiiUeaUIE~taq}]R$UZ=G2W*G?VJ~'UVU* TT)/ӫfȥU3 Wk6Z$fϮ,s~guQe֡A֡FM&_Պ~Bk pzgԉDɦ..viڥVk^$5U3tqu뭟 WSI]5olu^uH,krQW^]S'WHaTWB˭aXxe(,rajDQô4EMcl **7Zc;p^)(pĝ99WW*,Vsoc"=+*n,ZǒҚڊZd7rNy-+,(tHS[6u#0AWfWЌ>Ll7nv 5ҺBB  W2q ݨ9s 1Zg1|l=ϭ 9Z7bB9ޠB_^!_[@ke0?ZPjT@E_ܹ׫?/u{u31ʺBV?ch%T6ϯ0TkʫԘ(H:I+A{qjBg}sT{GQ<؉ŭ^T+fڴ()JMld¨]\.rk].rR5ʋKK2[śY~3Êe)-RZhKiіGK3R^і-%G[Jc)9Rr111.b,0b,0b-0b-0b-0b-0b-0kkiGFFV/-_[|`U. $X`)9RrK -%'Zڛhhhhhhhhddddddd8Ki ]aW5ʍ4iiiiiinOT=Q:gQQXI46^ݳ[`[h"*)V9U{}ڳ/^]b*6>U]Ƨkj( 5FYe˨$ ~9ꑠ#AGV Z=z$hHꑨ#QS{lD 5D n7QM&jp3sV$ie%id$ f|!ICV$IZ:$im.ô>Lk0 04=L?L?L?L?L?L?L>EbS4) ~?EOhS4) ~?EOjOjS5T ~_{ŦjS5T ~?UOi4i4 ~?Mf_i5Hj MAVtZ ҵk5Hj ] ]@t ~?]Ogh34 ~?Cgh34 ~?CPE"Uq*H~\ ?.RTEY7.RTE"Uq( ~?J%GC*~J#O|}L[}}Hl'| ;uT+Ox#ϢHE{"E*Th/R^H#>*]H5dz_x#|uYx*]HE##|uY?M_ȧ_xtu#گwuVuWʋ@m@ w@7t(}s>7` sWV殿KĴ+30`~C?w2CG承$5^w(dL7g]oFS\@6r7HE9oc`;쯬UVf$)B 7@>}VFq2csø L{܃<~ hc`+_O&'igHR8LSw0[BٿnkF;`04$&c p_&@ l__=5%YK4Et^[ր:t{z!j$tx*|bwPe>p-JDĨBRd:nw{w z1</BƁm z. ab"*-Qۯ R'huyCy< riPk \ezB\ϔ;-- 'O霈10`1 B\CpYIb'JI9m})(LJx%a矐jskusTss +>C)j{笽̽Ⱳ̀?Qfp22E{uLscc|6zǤYYۖ 谹Q;RF)"IWBCh ,ABw-~IuUFq=FK1}37I(XLS$b30; b Df  Y= clgdd[icbt4>&tDFny)ɝ7%*Y٨$DHѕ=wATꝤ''2!#[ &ep#}uNj&e|&d2J}.eފqIU5U)Qi/S#~t\L- ;77U8>g9/#K.ҽUsQ'8;dIuYlF[Gt..~{)&F7*woW~D3O6M]+T 7:7ٴ9q╲4J,93_^02(P61z% 'zɚ-.-8XDg3j ;8<::2vֳEkC[T.!Z9л~3}N7}rڂv뤮Uƕ1nn֛9-VvP"ge?+S,\hr0slSxI}4cٍ&҈,Îp-h2ʭeq ,QBʃTyiLyymy6A FhLK*9~`oulq:D<'#e"O~d0&03&)?#fYGW':PQ=9G9[[,9͝Rrk\EPCv3:~SL[!UP|f'JyWF\0JHm/-u][VA0FbjE`AƯr=~I[!\9 @[>ɷ$9%(drZțH`~+D\k iWAD.F\BkQڽP Dfʅp|~ila@`Tx\yq#ĮMI7Eᚨ/CZ ;˟v>C9iqay\̋6f]&h7ng˧@!!/v+jk-[Cݷ@ ߺV㉶q5aL/dLN*!&%U' *"**" "`”& a~Һ! e{\NcG#g\OM8ª.N#uQE(7Kr D+qCt5Эcq}:@%wf.RASfOiHj!YgYBV:3♵"Ywc2]T)6^?PA1.i, b_bՑ춧H QS4{u7H8`z!ыsQ|hMo T^y`WM4X!9 REm9snDCWQty4pegc_怖c2u/^I*a% cW>$ z9Ƿ$aT_oS,S` ̰C"/6;.mg7\ܫn"D]"&3WЮ>MSKY)$B_VEOZ$M̚4$$C,vq'o:)neΥN~Ud9#3h^9AF  8hAĬ$JI&"i|{$Ud>ci'os&}EP-ӘMrDѯ4%m 9|Jb,ع(ՊB۴;D V\{xXVSǟWQCpH1 _8+5,a^868$~u,ЗJNaU:X!>4N|9PuWgH&58= Yl#Voa b Ƃh1HXm<5 &-˸ Wh-S  M/,dɕA;@ɢNrs O!X}?Ͷwm=\ȃ_fker ە^o-Ħ`mVyN$|S Jaͺ$JVb^|@ ܜ j0<)-+v\t?Ԃ9Xg~DXņQz1z Qiuk]·skФLisȬ6vȗ8&rHs0vʱN޾z.\Noc쪐GO9hq[_dHa0| ʛ:}<_)Vԫ9\t=*? 6kE %ȎkqQL0ŠCRDj],G?"57:헄#7{r'wQg+upYH%!Z6SdMx#Pw-Hi>_PF7dP#;p-ZިVudAGUuk"=x_|֙G`B?4r%AĺtKEw8Sy>&]}M}~Md~j'zGs\I%}Kz;$2,0b=ޥ }x}\{be{aRNkV*!kY3o'"idwXH9"ίGnPKQ@njAºdOpbALRu),-pVp^N=SoR*{A5CSzQTZwS1c1e-_e 'TmW'y^5=HZsVVg6O]8mf9sM_2益?3LգE$P>7g%O)qiү>%J^P JX xa7nb. -=~ڂ*y[ANݵ2/[b@ ..xeuʪy0F5ɜnm5<@vOuQ%DJr Mڃq)Ǯ}set-bԜ, Q_)~a^a/q߰FP`Q]?ofA7-$%ARvyI\:" sKIyb> p>k )/MFêLn*geRc y_r "vf Zd1X)v-s\6%\*^D#?2w.NdFÎmZNQ{2_X.m8͵2<[݆g*2L|3#fsqPvȌ kWYVG:KR,-XuDs\˕wX$_fJ6BK\Uf-YX. u԰HX20PIBwx[yfʆq1>okw`"=hhlߠ߫'RLR\x-d8H/l^mP^=^P%>4bK<kQ%z(:ETgz~QƯ|R'/5A kDGZ]O8GnReci+*NÊ{#ek6"wGB5"t a7MANE vE}|fZ6n[/U훎T۠2)rptO~2wBKsS]lgxE٬wToe}ˢ<dwaD[B"mJ9m!2¦zx=GWe./)wOL'%>ԁߢvqNRʵG<qߪ.O?MJ!آp;<+~Ć^Eb|qZ=vouǗO PKr59f)Cfyꄊ,?;Ac|>h=zìy$uSvs0yzRDoQ.\:]aiFT5ͥT볂&e fFiٙ ڢsNBTKx SH p xTRPVD%NKû_c+4q_?zQv='q]ì2vGt&nEǠ*X$eAN!A¢D0?20h(ΈݰʱT?auQإຶb .0-0AȂ/*J:-kwGW~6e8^7N{\/.3eEhDo?5Zo-ڸ.݉F8>;qaXP6Ʋ3cq\3zfa߮C."{ZNφD,8Jd|.Tvfަ+Q#=$ W,P}&ya>c#gj њg1ŪYC~-䀻߷e!:[:Ch?JHl ܗbTFZ@J 6+e\ӬQj[iglDx%T 4_BK'،N!wя`"d2{\_wxay4vsmf@%5G NÒRAT20INq0?1Fڑ/߸K ύG gXZш2ݿod$IŘQ1; gytjWEJu Oױܩ(A 880Hvw&`MTJr5*/dl[6xڰ@k=0gO+&a J*@p×R %EB-PV44ۢ=[9x5:SH h9M9ߢZޢr?tsYYfoV2?R%+M@Ce)p4..$d%8eq`eQfQFeIŻFKUQL.i:P>S(Vs^'?C뾞4'[C\% 㢙,H8;J2!!ؔNQ5/,ut  OP*Z5/! c/B6SJ Ӆ+#`rjۄL-p K;LS6#$CƌaKfYfv quj}`I8waKdz&ћ01KkbX/9. &ۅ cP,tqO5=t +j{6bM.8XwIvq")Zqiܞ~ʻs !`0{@]O!m ^ -s*/==BFf XVyIT!lsa=TGd€9T -A͊z;RE2gJ7˓@UENau Eݞ Y WHG.H^XWBgWկZGČ_^5^.^_d֒IJJ A(?%`JgFd8)g}v!F+kχULSڔBzqf9D;6mnZDhfS(P11<3;Uĺ9Ukg-:_*my>IR[leɔZ-OLRU%3' "[h&xlD>g[F}ˠ_?_BvNt1MW)3T'WQbN+7)ݖu1տujPZE"q}2F(a~kqdN[RAvI;7X:MAL 27÷E2fڵEV)FJ6!x£s>5 .z/׫=hMldxR4(eQl7. v2{ OI{T_o/v(K&:Xt;ӌ@Z_Ax9`,ڵzeMJi &P'o܉qmʂ*c`*MЬ "Y-Qe L@Il'%CH78]2S a3 3ZԖU|֜ Zj3ڹ7kSN> kY xZd:G WڧH1:vIʽ9A$twDEA&[ /E{]X!"6Y'>5o{<=7?u;Kқ\%/v/(.n_Z}\.t>FtE,^eg%a?gYVĕ=[UF,ooTRPt ,˛8}`no&ݹ#&^<$G vYstëB$fs*2PҩTǸ Yke{>{\KZrEZUK3m~"Tg vLYׄAr}y=DJwG*&(_BcƟָxp n˸9!`M"^hsB:Ͱ ze G$^4٣э`pr ɷ!Ͷh&\n$f% )eaף{Y ʋ 1AXD 8!Exf)adzdYF:/7~nTlM#9İ#@Y\&#OSkJo>)P¤lS,3T6oBK"TZc_Iz|_g(.&ȇ0K$"N #ԟC$q6cU(96 b@o^f^j/?{>QD>z۵͘4qT[aFf2l^93,.Pn[68 H2Voh}ϖTF)V-.2 ESOߗ[o_J+^x?79_7yqBr易}W߈}қ= dR0_{fAj+7 OIjPӪ"_+KtBv>|^Aܔ \-tQ=uA=(kB*Z@x1O{9wiheCSt|c =O%2#ڲlp/U:؁{ STO=HNwuL9~BZwKxX|iJK,[?ݖ'cg)Fw0~19+M=Ur$~/nbܛ6N"J{(Z:MIC­os5?T-YBmV:~U=cGLtn+t^ X嬊1<K!_/S!1e9!:>_MI8#'[ ?Trx|po爣ajy25"&%2 /i YOap|U ,O\pD3d@8C-C,B, U, n!~yƲ]rĺQiŐ!W:5.Ja,*<^+=n["$3}j4|V۵_kTnQЧ! ŞPm-$__(]PKƊO>'I_nݖJj♮ j_6*Pƈ=L&%g,05nGT OMbxMtp/6vB2 v|I/MҖѹι[{qMTr:j vl3ifXe Dp7 YH;qU w$KxE-)^/ !qjλ,J' )&uV_]Z= Q<.vE*tްlֲ1LbUnیme}X7KL/Jx=a\ݮ둂-ˬ7( sDD&_J1nF?RR~.Jj(Y٦`+Sj1K{ˊS]dn@F)d&XQ{PJG#('5}Pt XdPsOxM%AM}"wD @0r\_f|}jgvbsbv}9s-Rw|-l5e)FF}G }!.t([ gઔ4:QKGUpSiHDu=RM6@M%xݿw$2*ߝ?*VkNLw``~~\sCy󾭸%Ei}g?88ew}L# M*+*XQXT#w{]Sl\"ωDS&? _P]!~\3 nAuPW^d;բgvCӝNSV z #G ~ _lr[͸F|}6z9/ |7ql0{G7,^ GOK(Tth؂! pc/ `2ZtQpU*dt~%nFZ ;v\I7`&5 %#]v[f%2sc zSVwJݻ EOy,!\yj;So#ik?vA ꍛfrAT4&)bΔn_5m*Ip/5 隋ez|MZSI׍䎙i eyOwq=PCrvӲ=gͤ1e`JvR R}-0 9i9 [-?%d)>mהɪhج0%Bl#3h7,d|Ñu jbaZ%]z&Pk+ns\UczVTbcf/r<G~ ]l]].tȦH,](-2<VJ(Ab፯u^yqU&+ؠK1 GQ vٝκuV׆F_8#$i/l_\zy`>u rט=뱖_COdIqS" IDW"ҲY28k{Qi \_א8=!) 06Ui3:Y 5 i/R>Ioo2*ͨL`#~LǐIKDSCi8^ɲѼȸ+ Rɮq'KM-Ki(:n 4Xe_mhXL=nР}Z[Į!2Y"'?@O.#xϖs ND_HyEj -W֡8[ī[?ANFbNm|Xyk@6+{fWU&^NJ"|Ŷ+kxq{QԎ .F2w9h֥WB˜7~ӈ#RJ\/*1bެc>yD ~@olx:XpOՔhא;*J/a\o.a(]2 <f ]W?Ko̎KyI Ŧث ٖ2eDj\CDp^$ok:Z5ޥ'# Ks7)cY-Uڊ3E_r=N:3]Oe[UTF$9z@m! WEWyoRQ^42c=+K,T56`{`!6x18 y1DFdm@ Q f՝J`^΂oBW:,OjubHޱ,"} S߄9N?ߜOC.^V}b,Kަ^_hk_XY_%o-pf_˾kk~_6_z7>/W&#8`E`ۄc</,` ?M01Q7U,&QkAV)%hdֆ1F)a9XJ|0xڔk39ћB;CBڮq:-ЭqS#&!klG¨ gljl u|F5e u/moN)V\`NC-䠬ᎧӼx}QNwF`7sxvT+X -t1LmjJ\_Oa GarTđFýIp0tAUPÃOVaA<חXdtV'? >kstX6ʒ<x'Cԗ7ψ0pbk6FpBμcl*N#P>Y .ַGVWs\."W{U~~Y@?)3iLk&Mh(+I-pQOTzFSS[] _%]ȭ<ԿxmRڑ< ]!XFT;҉bQ:43 0θ@(]pVx-65"2ݱz$#:4ZfLQ% P¡ ǩ9X.gpsF (ϵZɧ]+FG~=;/a{e?}H2YV -ceuJ:82ph͖/|e-yBN4ce6{<^-NXJG2h<í(z[c֎(] ^Gȡ8N/Z=ZZ ']ysA M֖x?*K{@Ҫ;Q15@qd&$GCK<`#t;+rT}mmZ|Հ3qI#)mzvS+IXӋN%0,I<$/˂+)qqyO_7.^zYbWzkRj|jqa›{YQ5|RY*=w5kۼY@\M||W4zŲW±[:]k0ŭQF6PV܎g`gtI~~D/}>LVy\ qw'5>=H۫οs;o;n +)ϣ) ,6 X_vP;\ZG8=8Qn9_8m(ag־>a\~kĕCHA:E{4by᫣Wei=LsY=?95+pT i|;b-!cheJXOð@&-g]`/-U(E]%)ה$F^J$ѝmdм#zAW4ɟg *L\d8ce}|Ϣp aQ1fߘ_}TLFPG/l?OjAj8]N??6>i[GQzKY 鲚5iBLrFe({6>87k|~6 \.nT=%x,+pM-3ęX qM2W*v3n* :(BE+{1k$)w1DuBt[[՞kېNK)ݿkŨax ^z<,zӼ%Т- BݫL'tc!ƜIXLDG9|6oRI+]\vh?UAIf?'~MMטbNX(=:EzF4']BkJ`B> +Kv\1[].L'4r;nwݽ-uY*`V]ݿ a善 n 'ݨ 8Ei\Fs!ծ@+7A;r=LJtQ/h) h/chU;9}aurJ>| qyY|$Xuɔrj."%ϋq9e 'ۭ 'T{Ak_>Y%UZn}( >0\\ uhDf +E4.P1z*T<+܍=ímˠ'@=*2]%ŽXD/PhBâ|yoD} v49iв~C+6bJ.=]=r`_!}VVt_L9Fؓ*q#2DMGG27&ELv5:smŨ @=V+HV*RUW°yGBTp4G.JAC0y)1~CLp(\Oxu4}3XZJNr z:@I(^(1.&kgؐa`LoD6IˇK$ʞ($a1B%5{ h$+ ԼwYyh٦UwqQNEF~Py~e]ďf/ w+Nth>nUi.Iۉ͉[/m1Y0初.zqAAX;2ǔfoLv]=w=?W}ɟA}!:?zxBKvN(͋iۂsMuӛsIZzp(-7QZdbELN,G7v" !QOϒyiew~Օw.$^ܥ{woü<)7\C y,h ?G͋]W 3t#Y12.dss|n 9뜦>#70ve ,V9#w'<#񲉱V='󮌋 ]u=|8YE-'bO*5sf8ɨкPIJ}> I-Mvq8YT F8h0bKa 1,7C:N >צ5O޾s5:]b&iQ$u}a_l7 մKMvAt~b6CnR3͛/&kt%t:Y'EĊ!ϋ9zygԟ}큱ov>C 1 [\@?(q3 Dzo$=A󴡾L?>HImq|s ٧?<eZw|~™ OUH`: ߷כj룋 t={kZT/9.brck3־6՜i'\O}-6o(b"MO5+*oe-b -3+{x>Ϩۣ {aO8y(J ζg#MN#͊4~÷4}po5?#' w8}ȫĞ s=4ďK(^h<òSu{t\D2h- ?>"x4z1>=AYK4_̗ϵQ=ٴ>hDr’\CX9"._7aR:)!cyl~9~s ݶy=mAϐ(u}=y`_2HsdLc:dB5m_U=V֮wP3/s&<2ʋX kq wƪ4zi;ʖEQ4ɤ 1N 1K,`jDl,t.]&#S 0Cɟ>9K3l;ewYwe*ؼ=OLYsEyM+a@C$nĿw#{|3\֘,Du 9SY Vj["zcް&3 Dٴ̈xL@<| MPlɔ8UҪ$zd3gO)H!,Jڞ&wZ&S;fE m߹{}G ~;\o=omv2Woyy<K(Pg8Ph8q̢ě=]%)~TC)ڌ.e} :cIB.RƊ umX72 nlIgU~"xw+=VYeaXAU%Hm XZXͨ9j|@+軭79AcEb=@51*lj(=%gGøiTx[Aja= DAn:Kml$ҙ3-*"V i4ϥU:5/oX?s,mҜ,M-](6 l"VnED,-EM""""" """.("WQE 4w朤WiNN3lg1C|d8H<9Z/ۥSށ I]KRj̺6K:U;_}ۙ%EEqC&-$iʕ"nqS63pr ͇ ;g%5d@ryO`Cty6]GgZz c}')%!ehMtɂX^%#ЛdnAD.F)Ы1llcї"^-4X" 9ƘLÏ.uܼn@(y!znrUsۆ7MQ>k{t."kEck#w=rEP~ø/ѓg\-#`z0-„^KKȨaf1J{1p hFQZ0Flj*} cJ^"3tOi8AlQ 6r`mRL}@RI2plFX6;L5&h ߆_;zɑO S6=Άg/鿙{Yy=79k 6-K glq!˞V';pA݂2hLY+bcXF]XԑNv%j+{^V6|IԲWvdC(30=󆽺}<̓5skytv`Hm`q9 Vx'Y9"Ivҭ3_i _eB51~࿿y=?=X F§802Bmoq#OlE3ۥGԝUW)jvF._032qrƞ~אh'N4 VDiq^,Ui[ :c. g깱m/>]G%oO,9; =tZ}fJDOP`r)/joV$ŤT$gQ/B^f'e(݃)esDRՠrYC\@S=W2j|}DÐ!?wۏ]rZx˞I-ߺܣͤ~K3=2v $z8j3g\^DVcΗ M6bNp%g 0}X1e< '2?=s:uCFMwUu혟ףmu.u\w hTuXB%dK6RRɼnx+hW*Pz JPx/?yiI^tV`@ ƺOޮk_nmo=Y\_<9%Mӷ7]/Ri>8z8i"[ P`u,:F (`۹om7?tɩ$ 'da#>#ݟ+|"seoRճy>~f/7vзrэWϨu퍷TлMo Ll{߱tAbz6Jp%Isv46Ex}}^ˏI1qzBy\CZݿٺ=\L! LK;إ,%A4>Y~/(>3X $Td{0F`t :*7y=t'XA2ۻ 6YjׂNeu#(cєϞb5xĨ"FLW?u ?wXzlzޙP/?f|5+:ꋨ[Wûm/wF)w)O?ƼDr+IVc1ߥBOmVV>ryrklZ.{8>L!Pew(7Ȳn藙qp㒑H#9ORF+~G_#\mvN"`'i &ˡ$0:! `%A/:a/VzJvbq Y A`+X`Ck*%8ؿ:KJrG7Kdg [7ǔf52\g*[]ٲgr&wیB iusnsI$s hƣ_]{UǏ-%MυEHm b=l-@ +\(,J 6QL;Jei| UiؒM=v=|iO6O/KL'z!H+3[֍}ً HKϬ{fkkuF7颾v4{M%6ǼC.kKZ9=`n?0g` ^|GX+`-*Y1^蔙$' cN$ӷZ12cFзc4\2:@ }ϨΕx1QqH(gl}RƞJ _cmi-T.t S 4z KDi ylĝi2+w;N7#K,Mo4Mٛȃ3EbpCTdoRړweʒmi`W=L/yӧZ= /]KoIP@y32wGL5ҩK% grI 4(ԮzY lRU8Rq<)T |ZK)6S3R] :fj7v84m̕D~/R`(SWIўv~H[Lk#G^~͏G?KϮ Fx sacw0bO[-S PeeB*,e|{TiD |ن>!_"l1igvUug>?bꤷj 1Hӛi }+оJOq.$p&T Ȏe1sHhsR$#yyؼVy5 yCnPh1n}Gɚrl.GFx 8D4n!?xQrcMgKͬL|_8ayJ'?#(ǟԇ5k8_Y:BA;"?ڳH2xª@fΉr#ƓE*ms4c20W_T8vЄQlT itgL+ru.at}Դ5ڶ['e\{`Ipa4'8֢q/dz=LA`LӍeFl@|y @ ! $m}{ z:&k/P8kscO"0qeB˝KO |,'}2{37͙Lf-O\N*pg.7[ukgMlSSvDI72Q\FFFJt/DA#=H5l/ڻ<ڨ8GsSRJ􌇠 4Kʬ* 4ĠwYY6fl$=c8\{^yyƛ l)[^^kfgG^tͯJIb{u_vS iPkpeRHQSf~%Ur3'}`~ oH! vR Zv=h01|a o/|S]sayj]Q@?̛Bz%[%Т>S쁗ѵ0"^> J.tJugݳ(5iwұ5Ou0Ews׃pV֝ͣO%/>U,J!ixZHZQxꐋdO"aa۟q'k>;0iD* |*xTܧuR-9&E?3] y0sܶt޽\ k￝q.ۺ!+s=+K7]7}W.xjn lC%>֧+̭Sl p4,PdXE^xە\ceۚ-0|w{ $Gֳw~iKe5Gy2r#5ldd>;YHٍ|qN\|5hay9@M :ۭ5Ⱦ#  YuSݟ,HC`ݔ]V@*P}(]!C\n_@%"UwM,ﹳ=Lޟ! hoZ[ =Zuw&۸`E{q.;pK|{|{ 7~r.9>sLN,D]z~Wz>oꊆw\! @Ήj"~'C}_,tT֪h[kX1iEylѯzUu^am`]^s\=+Is,d&8^&" &#2D®;U,eK 2V2L[xH#q^+qxxd&g!.9C?rAA:H|K!~/*Wc^.jWN+}]Q7/S;eO58|7n}ƗWmvqyb+E@nP9M!|l;Phq]~iO<%%ӕw0Bt}rVRcו}߳negl :<ힿ}}XEG= {q}qNj׬0 <6y^ MkQ: =oYj[׷l!dޡtLEf.i}ZZg8c8ۈ&rbzRY! )`Ld2JBg[;^vz2 u ] Ξ}͸H ‘9 cӅk36džM9 6y8ud`V#k 8)%p0dMBOӵ"H)kayXS {oJyin㿎Y9{;2_>?ѷ2lgmSu-Q_׵G}]Y|n_B/- x^hwyzZGC> 忉GO8 ?YLN;O}Z+!0Jf-CV٢P0HnBj<7=1>mWN99J!jMdg$-n|@ʧ"oJqtGs2x{7CgHEe(ïy -CDqO"؄Ī`kgxG`8wu@\=GYo#̿8FǏV[eX8ƜZUݙ =vޓ L`d>/ +.x<%-+ᰓIcEW>EƔ\hOhՏ/Y=%Eg^~ =ԇ=44=)NFt]=j2EW$M &9ӳBt mXaV'Xlqb=i$#jfH% o0x`s W*>Ռ<wdTVe::LZ062aѧ:>v'9.׈~G3ӊ4C­}x *õf׊_RZ"u Kc}f sI2[tNj w)ٸ`$Iw[wq6mX"::S SVq/MC½})V'l)"cυ.d0#5R(ťjgtud)F^ڳL_z]OЇ _7Ѫu<֗ʹau!]MYDl`/Lw3y!kasyą.UB}@#(Hs! Gfm*~RHQ]c}H0ЕL -"WDJ%Ch91gl 4SRDpVa|bDJ- {4(^yD}|jU!شm燹B3dhTyPY~繕7?$c'B7DIMd;G}tb >Ŵ.1lڭxpxX8lfp$cx(JP Rn&rw2h 9?kuבM?<`O NYW W`8-o6಺o\Ï,1a![@6' }pH$z.9?o ɵ#pHfsiμlCB2%;a}SMex@EMhҞ=4$;ϿwcU3 &8AaOp5voSk> eR̦LdTg [l٨&FmVC |{ɕ!~Cgј,slp[I⒉^Os8nҊ{Oșrcu֊5dk 255cwC%id)iiT nN7\s "ʰp;w$w`Pm6KF\9n4ȍњL'r ˛%7BY\<7.)`:r\NhΗrK4?M(Dcli Y0s;_R%pݍ&%WH"orճ -tI3sf ^?qax] *:һB2-fӪ' J5e($^M7Aʋ-"UӉFEه<%^Lm._wПi6YYvcF7Q^vt;@C{ŋX ;5)%;sIy$C֩Nj>38*dpeY%єM^s7WOILZ@Mz'[鱇V=eʅtfЈg._+HVb7O2Vfnzp׳u{:OL Pb,m>^j%{)w|I%ەBxSRA\Lv&|_ZFaq=x"g-UCȤ?]eJ{"y+T62rPod&Q;/RN37 {pwfK>a3\qcazj/12si8_ݱ'{ܓ']S+}ϿCx%LGw:bW%LtU.g6z^K! ysdohh泵4gj5wZcvjpB(c,e1:fB|D">˙=*;m4,*36'$Yt*fǣetS%1cǹxD|\T{0efsaf# atJ] ʉ(\Q=0@@IqkOoݣD=kA仈|{?~WPMDWD/ӈacp&9hJv@]pfB#ҥczڱݾ{ٳF;]yW0P&Dv"&@d5f[_ 7ا )wi s#.)7VXFYn=gCc_eqSesrcx] _iX>d,͢%΂S-)@ ,kS +- Fy()P,U˽|ҍ8t |͏?Gゆ'zۥ>&W_3j`~ {V2C:N!wn\D2-I{F]:Y2Uc)6t~V48_p l2V`%t`BIsr%&Mx!C Ow@vA vՇl$yl`{51AcQ  .v_ y>"^^H*[^ }s_]~_[+_bREA;.:#cȐt@G?G Og$dXztMb3f.ivyq.N*3wu_ۯٴ[aЧ)&_8mχk.ǰ ]~=祣-w_0Ľuy޷VӇ K=4}tWO]'3M澖bL$]F, ;L1S?ZJB%<8={E *ٹۍVȫ-LԖ ghRgKxإa?\΍Ͽuvi uK>vTխ(ԧ0Sa2;rk;[U~c`ln Nŕ`x|)svau'ugkQެP!l_|){2TW9CW"Ŕ<҉N o蕯~}͟ą'5:kfyFy:W4Či3>Oל׳ww@|2cnę)]KKН'%|). KfwH:_f{{t)/JXX֕U+KBL*A*;1]8$#b:5ov\;19)DF prغNz0%bJTĔ(yEΦ=1îah; Tu7wԅP1']>3#θ2Qg @QqdVSs@eLe_V>CF/w/>_8%z.qXr])U]ikVgW]xw)vcWgVϝ%_9$ا߼jiH@"f"^\S۷'Zk9{QM"JXUI7YJT1]j?)QMJX5A15ro22>%&”O%(E~.  r5 %灔.zïf~n=U&Tه=ފ{Q\kx[|KfTe?}ִAJ Q<'Jgb/{A!0;깟O(I)-o@6ӜP{JD;)BzH^͆:Linga1* f+V`mW9$FwUҝ >!n*}y|D\? fT"< t!,FzJN;@ wXX )W$$-LR8R}!R#q}d~ꒉa/:y}).U7~D% LI17Iܕ&wL<)p,$%Et=h!t=r!mb ilI #ՆLr9c:ءZP fdHRLp _imPA!5{GJKsJ^A* %?C@a^i@Q.o LoH^Y*ֱ@:Fq@} R %+GWxȝ*;]dUILP4$zݰ`zAVb&[u=rS x &Wܲαf(H2"SO=oVP1ѽ)ž铭֡JecrX)}ni/ؙ9H)(x!Fᐽ%Y쐘0j`nfϕ?[>*>6o[!'n֌&d ..rɎZԟ)rZ*f^Zbxv];ZEaxPY8 SIP%0 &lF=`8kUae\_"doה34v%}JB7鎇U7=ٞy-7~heZY( `Val sJ|UAȪ]UY삶OP5,X c7uptYh(Pgh{T^jR&8ZJv;uWH~W;Qtβudhш7qK\T~lG͋={coY:Eޙ߯TSIŧV^>qMb\.b~W;+ʎY6ߠ"_Cf!Kz*Sf 浀O( Uu4k/5EOЋ}qQC @l[̨ 99dʌ Zn(M&MF:@ws0Ʋ$g dyK[SG9&M69~~xk`Vss)cj'ѯreURӥ\KŃdf? Jz\.Hs&ׄ q ?B= BfN4+CYA%1Jw[: ֈ^!^WBa%?jlMUe5ZH9 d]DGӧocHk/:D6.yH |S@%CṼxG4 }N0<v&bGa3:^*f܂@ +uiw/ћ50 ՙ #ʴ_?z˜sG7i65jҍ/G)z(Ht׽ʷ9d3Z8D!r(_Hff3<1궔VLM/_fRLg9a5e9g⳷˙JV=)BvA wDrD:,8l aILlxJ^QoZH3tpq262Z}1sdN`'^4h%{:*4_HFvb7XnkK`jki6'R4Gb{J% 'Veb';9'p\bvut(F=b9ff^=@ z_siHo-xI7^Սt&Nb&^+l3|u׵h5'EgS]O0t`?N~a;.;L05,a9f%aS{"]qD~.6kъwު1sR!~}|ߏb.cvf9bxED $T"Qb#GbsE;azq,Ĩփ[8nԵpbG)XgY_?2Z19ܮ+{u˦%8hћ |_/]kŴUzu`9msqBEз/ނK;yS `%Ck,GT"[ 垷FՍmk"".4x[^BX+ONЏSL`v6S7*fU*Rhl2-v<&zG{i&f {k#]}t!"#}npAؚfB,(5HfMXC/FV6;\\‰~ǢIӮRu%0Wq $\ W D\:jLt+tqJ\\ok~ .rzzWi*@Z,;Oea;v"EImdzfIX!>$!7D>&oE8 g8uT=1_H6D 2"@98W5m<> Ӂ\{ʻ|'p/o/H8͖6Y`0nnf{P+l'?lC򌸘~68) j?8Y;{H0Xרa pQ IDp8>=AHfCMCΑ:'ukb\2d }a&ӛraz:nMjIDj?ߎDAӝ:BMOmBI}%$n8BoAdf/UG͌NU0I 'O z<d+u8 F!O(?׾B?|Ƣv~H=}ݕZ[8k|Џ_/'.,&*1|f"o# M|Di\ƶua':x;B$ٰWxOv4 Ygͮqsn(Dtץ3m1ZxF~>#ߤF~G ȉn1d/Iz)1#ʰwn6Vx0D@waO{\0N ر͎}RuL4CQ0PC]g'Ōuds'MȒaќ$XEe>r'ΩNl ?GO[/J:I&1_:/!Ǎ[c/}v3IdYjmRd}uK/$v9ܨ1E#lw "/uG>*IJ!O(9ȅVVgaXE(YBV2Ӓn%@nZۄ26Ŕ LbUrvz719Qd μT4yD n[r-Ks-&KաWq7ϨYrECfGl$}H\~mgmGÊ97lqeπ`'CE|QAzdEsP,1sps09X%`Wb +9 =7>f{GU$@-7h6q/$D\٣tOMa:O za6>2pΔNBd\yםr0Q&U>3 $@ɁNhZU3IHuvva܂ 1WSSAb(ؒ:  (!WZT&@NtQ.KūݿU<&IbPsp+!׈y+Xvr[8a? [TR*$KF W)*d9Fp3ZԐbbD6?;S 0?23K>c7#eP02,I u$\IbLh6/aK[Qƃ6&bO=M07' cQyL2f $n 7_^2aŘ\1kܳ>6q[c|lF,۞Zr0ȕ`䶃 ̂^Oc@AZt-m@`0mu.@uClSGPD~h$M'rM<'nhx!pFPu5uAnxg?ȷ>JgcMr^(z1QcI\Jи'=/L/}h)"4Z|}͗1LGT<|;rR0-r !#dȾYQ"}Am dB_%h\h fYDB6f->%]%t*1hͭk<  }t{ÃdqC/iUρ ##q/'{5KgIҋ|<d FGn@ &l0B$"%I۪K?X++FDXLO6)\#o={7 AтsRr JZ9.J'Ҹ2 8R`̂lvafj%L >}ϛޫW^`9pž6q?pTIFH>h@Fx_߫/M2c߭/M~2[w;$kpM1\5NO2~=k 1,a j;}L6jb` zzh0f$W;< A3FDkIv嫂Tmr+[r3D{[@V/wS>QrEt]I ҇su15N^h`yيɣ;b/:{~I8}Zzj =uŞ> yЉb! v_I1vWK~nRih~?r G+q}q9؞p; 4x-9zmFr&2`a{ϗ\F_*-[G=G dÕ7r`ܮqڑ&pr ܏nx+b߭NNpwid #'gs~σb>9p:Z#߿ߏs(w<9✖k8IvGnQc)GwKc\k|evb[/ %u-qgebXe aMǞQ>O+G2)Ʀ5uu[36+vb?hzer7rYY=]#B}BlI2?#MlmW`FJ18ٙ#+(NT!RB#PfGˍ(;GGRQZDac319bL﬑T MB0[I!GD81 ͮNY x7;VIAEX@o Ԃ13Wj8S[ϐ tL>)~lxey!m(ߴL9}ڲә-:#D!iebT.}T6*5E{BZ Pa3E0 !`Gad W Gho5]Du6'ފGʔ% &0HnBPmS6< fD~v}t bo^[ߊ!x5|X.dKյͬ=ʦ25oU,_7̾'XlϧTrK]pөʔ>~" 7NB:y]'W%Ц_;v$-{ק5T)1c3-!N,φ}9s0#veEG +y쩥#r(>qΓD!;%)֚@1>ͯ|fSg/rj~+ݿ iA>9S{>dػ-kYy}=/bslZ&jT9XK櫂MԎ^;=GL$ 5gٳeɄOmfk1Q?[_;}^9u7\BOmM[>lTE+o|OI=nZRs%^Y3Ƀ2c-{9[<*Z8H6ԓ|xa351!|d]POs2հdoE ֮F=uocϿ|Aptk/iRc)ȊDPyհm={YT-4X VU# dj@SJ$)>Nԣ Â/QDjȔUgvQt; nX?{|Q,=NFn;_L77t=d[jGX9]u!ՂԦr'\=r(TnyUR]18vmviQ#0!ӂ 5.!5[s[DWh WOdwL^%;+wx6W"l|'|d{w^ϱSG_zj|5W]t#c8a q0r3Ne:y'-ef+j",f4 L5 ZXJ7M\Yv1ws5WMY_J%gN2^8ۥ3#`kjU>xdtm3'pVZZ]qi;!WωD#7ϝRRͳ.˚M擑<ƥ4`o?@ypԊ1LI2mGs.Q9M6~sW2cEmzf|67>g<[R36P]22O]yϏ!|7NWj|PpH-rOFK+6.V?JMfE͟v??[Kl'/7mr'e!\_k\h k5TEމrC\G1Ww_u>7D?:~c)cw;ϏC}$л>EAvNw7] ʷa:4v}''q} ޿ } |x]|=D7is>hKLsqZ<jV?wM~朓G4'># mh&RT RB)PJZyZB)˂ ,Vd6V+z}q].,r]WuEhOfNT{s/$9sff;uAc-R@FקϯTy~>?/{~0? ??rr߲>[9o4^3";Cs1%7?-ioD׿y'yIUH_}X}\(<~1ADGHaxGoRGH}N( Jc>yJsiH8JOJ_t~&TlTI秈gi(?]J~tH=J')R 5էY{IsG~Fo ƛ*|pdϣ?Fi_t>oY﷑D/G'R՟H`H;C9#Y?`]o<\q\)Q:R@?';ېVpUࡹJK?-^kŵ}s'7|.閗z].{:Y'p M〖A<ٺ@{0DNLN[21f5a%U-߬@RGBJ[ 1h[vN|Z?y!;})F#O݆~볙L.Y:fbʸA UG-7ʰH[\ mK[ԥ4; I ׂ L3_ׯjd!ƧLX8:4kSPkTr6L}3Mn*v`C,wWg+s59.q3ID A~_x/oFӐA~#]#*gX3Ns3.MZo%oBW+-7 {Y̪ȵ} H|2Ҍ$)+DO7"5t_!yl^p+oJڐhCRr;31iҌR9UjuCd}HsI4Iyro5jҴ!DTfNw`/M[|"tq0aP 9ʴ^K4Q LGw"O> ŊZC!}KKa>!Q)zvd:p /,)]/a-Id-Ei<@uuV֜]X]Sywt_=k灇wxTr Z,dW"^}nN]/|OO/č;?Rw1?MUfZHDjJ&*! M8D ϏY]cey,'$nySLNBSNV\,/4^l-;~}:EMt&6L0 x `&q3ht8hD$JI6/LlR49=CŌ=V-7~I>gWz߾xsJH_$дSH"!h%z4DB#:8"jZꇤP U1l6DG|Vpp_ys%ěkT~nbϹi?Ez}|Lp,rC<OZ 5 NdKԥ'%*v!EE.^AAF/_PO10߾4f- w,]—/ͦ>}\Su5Ļ aOixZU!JA84` ț@È1 Jp3%HgT@ &Voc7`g[! u9?hռ勪6{M 6߸ [ϯ[x|B+D"*jsn#\-!@NyN"[+w_>\ߡnu{O,ZĎ1g^ey 4|zsxYś7(ʼkJ͍Κ9itEY׏H1`T3x7Bh XْHqÉe0 b8;M&@4U 6:"(  Ԃ\<1dZg{GL})&c-ϝ`U#s"J j٢m &!տZ"> bWN r.3L8J =Q@FbRhY%S\ϛb|ܻ)u3Y Ddc!fցj&ֵXpSUxF{=jyWv y=K i"=ݫdv `o&:@:jhQ -H"۰PAPz@L#1eٙ!ZY1,( ,Nᑴ8'F,zڊN{w*gY[JXzP^xD;\ȰA6~H33݉Yv⤘fN`( N1`DЬj7Sm fX05]m=bi6 @a V0)ȥ'zhxX`^NvXHLiLcf0_j{ 0dԕr+ "˷:O9(g2LI4q#r~/J)8u3 g$ژʊ[\e;D4X  M3E&x}cyT{VrSRK f0IgBew9yfKFH!|zHxX+x>ѶpK?#-pTUwRWAJ;ՊF7BI~qRѶ#OBU8P_̭c~<,wݘw}dc$ʪ Xo-vs?BȆk2EQ/)\Zd*3BG{$,kk,T4K˿6\% RscĂ`kfr6|Dž[{ Hl<&dr9N oz=9^vRT|%{A{#ё7NZݪ*َpLV]Hn_ xL]> LxVlC] HObu~3qSF hn6$|@ݒ$JXUҖB:7Lڄ;^ Ξ )!> PQΰbZ$ KP}wvɚX a`Lɓwss;pc0Dv&=$f4K\m iK$FIE \ w y8X$|A8n6 iVXw0>Tn[%o#io:;dK?C dL)rd!s!vyM;t[-NcBQ6U#~Y *8w}e#)Gs*:f=?ՙ4qa:>:V5T^4=ek| OAT^Yz5vUcX gy|I0`&`{V5Z C`G>W6N"&(g28#t[<y&D"Q@Eܒdy.' 왪5fK[.0N|E)£#_7Z9K] Y]A_]K[CZ&;,aN6|i4 t$5E"R98xx_N~{#k @P:nD1l2 QTTsFϜFc凩 Jup<n9CsS }큗{p̳U !!y_ߍj5{zd@ :akꏈ*@lSYu\jı%q\7%T%O7/ň]M/B3C&b2A*|E'Ǩ#*d ":yk]B-- $ i"hyg?IZt𸗘Q3#Xi(HOn|@ЯltF{Q[@jRy9\n" ؄H$]ߟ`¦g[R#+DpS s5m/q9yj1 VUyx#SGK( 7 m-vXp\L}3:G(1'.͍;'/: U8E"g[L0ѻK(x{+"ӴWjZ5tq5-Tp=R<zXӋA\T}7e40UädQ4 -kN0Z?E[1aʦZV azHVlqy̍5;iGt1V-үUGǤ#`fEO^0hƜ$FBJRŔ1"MJTL=4߉VRRVb2y :4Z开( KǙLvQ)r:W`뭼~w1ŲDCV(lnU5ٚ,p8烗Gͻt+w+2JKt|QvYPk9Xj&Pʦy^P9[)Dih0zEJɦ[}F?Uh1ƻ')?aUr+M6~OĤ k'Q(z`]LCV"rq' aJ1׬4'AȩKxFO %/rGKv5jf±CvӛeàLM$5LRvYŲz8"K嵏1-!LhF1rx/l3^e ~U#"h25ĩ> ǽ7/H)ZW!E"kZ!g V:iwbsCe=eHn~.ŽDK >mBTG2V+ymCcTz/+q΢͠+C[/j>UjߧTGi#!9pm>3',qjWV?Jjvq]Aҝ킩Dy$lTDDe(2Eb؃4}fh#(Fj[^k+"^4\HsU>nzt*4F'6V^{9&חIE$ m[Ջ!^>ei͌!.xqyElK1&0h-T@'A[:Kj(hy1Z =2Oe!|ى۠$6˷3rE8͈ /Yʮ͖:m[U<Ūy\JdZ0ȯ"ά}L}'IFIvPo)jf5:Wdlp0a"iPl5#ʰH;7:Ԣ@."v) "-эح!(,1n&xGHZGOH|yUQ99*hvB NG ?<0^W}_S?U\6\gi4fZZQ->8=Cr:Bp&Ǎ"D!( S>JMBEcM,ՖC pjXn 9_לMYoE3h-@^K»/Z~ok'śafǀĭ4dnw +S}CWO6NS\\Gp61=MA>eok͋|w|9II3ʔџb]xi`wƒ l’5vHWht&qXi9KC!d# -!?x!&:)5q pä{m @,o.p%FO߬2 Waf+AK؋},C@|ꇚq OkzLH}/% '>b/1,aj0d*ea>{f3/}o>)C"Rvl IKRug)Cr6ӎ8^>EwӼǪ1w@=|y&nZ9b% 1e4JKy N vF}Ciym9_]pHIqhȄv,PiLuHIʗ9HpH~߆¶܈>)_!Ô"1![/~jZCy|x._1)ۅpWTyB󃁯2䮁 ޢgH}{ 6d D")zFԈ퇳NsoDr{T?s yIop#or 0OaJwC뵱R!~Ь1p!oZY1\8 }?jpQIGqYf<1l_xTM+mmGDm;?!-+]ΨWJ>~Dj3#Du=wC\O%˔־1cX*FwByA'>+YI Po-;.4z lMy;g ٵ[?NZFkHvGxlaK 'MQn)p _#P'_+Aɋ:2Ψ=P9"[ٿ*؍즸=[^GJ|{aݷk3g}{ ᆰemm 떺~\oD@ +JnW|MdQFJ';OդK8S5zra~`4~parZY7z *GCA8\L󨱫)KE>Ax OQL,IzU9xWܦyfxf8^_iO?܋zKPd)j"îMЕNh\1l*;+۾ 5PdzxC ڽ4o;Ύ{7+X?td%UUgf Q+6C6D3tBuqwz3z끃W' gO̕ie>ab_$to8{]h+)8i½$]a\rSdL[pg P2Kat TFu(l)$S?5`dhm[g.'ۏğ D: 4靿 XE]A7(|U/#879ǖTX ŤCPac[ŎHJJnWG/r1TZEů,bE)^q>zY&}!K<ҿ'Bp`\,):* ]8(l<8" $k%DXeT[l7T,c9 *;*~*8,19+tB*j:OMɑ #Rkm疯kd C[?y};xҀ$x'~I9ttbZY[,UMa"fJ~ʿgz>ǃ?4s+؏oo+g6C(uf#naO-`ՅeȨ:ӶW|/s9z:^u'Www!Z>ŀ@ʵQߍbgkB-UB&|D*c-fnx (Ro &h԰ cHmH 4hPR0Ʈ̀S\T>W̛F_!UH%"H(æA$c~rF+/}.F l;0J5[,G𑰏tŭL#{ӻ"230e v=?+\sws`/"VO"B?ou$A!0a(cϚ9X>GbH!99PbI|pHS + Iiۭ?ޯHY*e5PI7Pt;?%m2-`{`Gѐ!:Se{#%1߻mo~m-6v}< ECJFyl/vn|rxE4@=VL{*YF4{517z2^fg}^? #VUdc5҂sK=7;J ;v/zv-<];X凥<ҫ0~p_k/d_ſHзE`Y1MuH5Mu(v9Mug]MuMHMx(z,m!(QbH{IA2bI&m&p-E(YI,x] 6,D"SaSWaVynb>@!3t*F8'|KAe2fC7=̪4`,x'F kG~vp I\y9)r&mָK FF+yX9a!֘R!Xx",vb%,t Ǹ㰊8Pȃ?MH '݋hݩoHn?Bl=}t"v;u8Fc 2Ո3EPT0EXw!n>w{!b?. KmFQϋXpwƞonR<m|tA|CmF}BNu@BF6}}4tqbq3E5w} &D] : ]q5wxTġc{. =Y[AH jO} .H e v Wv~V[a}"V׾ y+q :&S+%?P(yJul4}que=z%Ut$<|%t{C{|G >!cw/сhj ӋbR96P"rlb|v\g>B"Rb󖭼z1|r1j!|ttrjmz mD)R|x s%ts9%:Gʨ n689ҷ6Z񞕂J B4Jte`Kӭ*48u%bm-ZQ_D2ps_"vݿJ}%ȏ]C̍#UΝZͭ=C̍ej-#ȯݻCopM#n~*mzmn?νAeQXxE8gzE>JpN| N8}򷊸O}rN} PO(^N_O_rN_#_;w ;w;=ib+A57aAh>m^Ai<~t\{&rz`1/vhxf/(+yrw vx'y FR;c+ ް^ [VÂ=쳇]t?(,H].ݯAJ[p!;-È;4 =L@xkSC(U]6p/<Cxï7=$p7~,$C7&~<$7*~$c7.~47~lC76~|V7:~\7~BF87~FC7~FZ7~F+7~7?طoѫ'$GVWaczX6^jIU[3i+v6rq(7e>ď0V߯" KCq[ haXe:a`KÙ5ÑB8&_^L&!uv!Jp`X]X'U!KHƬb"gxL>.^[u|6 (ӡ[)]U찀H1iczf=V/=6?x~W\ u6ّr n4撸ۭf'z҃2흲=&uHy@%[ǒts`'c9DoBc&Em*vw2^2q=Wڬ]TfhM0[|f5:tGj}m%/XoR-EDq^ӎró$D-\ԲyJb[~<^;A$n̶$ غ;J=+Gpb{CmkZ=x/0"6w٘FMduT{LS4"ʄܑ<\G=ݠ[,1< ?^JcwijIQıZ۞FGϽVN\ ?{V2' Vppj4%\9on5Sz̋dËL3x.~^ v}D~h޽iS*|vۂhL8_ߤ|pWW ;a<;0[=4@ka1|i*r6,NUTR<u&4J[&\X+ԏ&[$6GKŠku|(ƅcňaec0~Fbi`J\3!UyOQDjw79 ) ']d͸VӲo62RRl1*qqXx5^6lӺ*׍n %rN|.62E<7L-Q5bcc$Ɓc-'P&%Pe!gVXS$ߚyV8q] [Dnƍ ՜ڒ;ن+_zA_`y+^#9o5/94 L_ѲTL+aFˊ:Tߋ0~<\qØ}L~O]WgC+ፈF8gqK0uOIDj$ 8 Zwo e4E8ZgERnw0[ޕ,?yI@V`A;S!P7WWE]_RQuU: j61'XX4cNMbH0&yys4zO73OgGgVV7J!?7?:mjP|dK`(->#8 Y?Ђm~#]اqz~ۼ(T-:[/dxd^IC!QLRj;OhV *ն~,-w9*2Y}f}āyXϣ^^߆{i-FD? Bb#!;vq4c7 l_aZG+RS`ȗ!V _Zp"];O'J0xKՙgfov. ٤O#焝*WACbF38@{Z\3_(q(+N=wIus,;mg]6&E;qYO}9)gA7gKϷ͏bN8q/F.8*$r_0}"fWXs?q},;rŤkG cF_#{mcGfbffS0q!/$-{tg @@c+бre˺teq,ep-,܊$Aj."Z)&Tڃa(6M[<-mO'9pwI~J~Z>.?#nb+v}'oʷyI,oyOKޏg@Fnv'ξe߱Y#+,?!-H?H?^̋5g$|D~T>*?&?.?!xqwraa~'N7-gO X5)˼8X:ޔ'~Vby|30Wϑr ~=Z^Hy9m8qL3EƧ-1d?$Xkgc\6ZwJAkJ_ |v!XI1BgYL*Z?U=o22tN\$sYmr+^>l6ysxNߜM9?^`^ % ^!$*6x$X) PA845O3y2rM˛֗슢77!s,99sb-sڈ9?5ɹ=Ă` ĜJ9-ǜ՜&n3j1'95577_h~Ym~ ͣ{4gZ}>UWb_ƾ9ycĎ啿ltɅ yBr.^_p]H`g_k_zCu{~UWӿUW}5_|ˬ˕[ی=}?$x5L`\4%>\ũ_Xf% ^Pܯ4\0YfX>xb!hȊo:G@we,º2v+g=Y/v5 ٗcװlaCAkYG v5b,>;UMbp4mf[6c؃vaG٣1{cO38Sjٳ`'s4{^Q d<2_հyb'/`%R/+\y@^V=NuPcyy|#[ mbp=2W)b73 eoa۸0?ܖ)<y8X9̐'VnǂۇmOrHq6x nZx~L4<8<}޴+z;a۷؆W[`EՙT~']@gqac*30pL|p@ߘ(QP3YYbxQt !mR[ ;e{]XW4%!eXj-QyMq4K3"Mv4h6^ĺtC;tF˕VŶN\>G+[=osm^ױ+vfStʋTK7kC٠pGƩI/J:ջЉ᪕2,ޢZYtējmVjR8jG8H=UxNV9tOmN\$VrRsrO{ˠ%πt/?4ʋV[y檭|[xU} /6Wn^߬_wUW4Z_?cdy2 +۳~=SsKԬ\%_nH)U JT_DsR Kj;4٬EZAsi'N.Nӱ]賷q7mz5ۥ:MR${N9x &juMv>:sO_MYA3g$ᗿ.Q8Ht{(_Ξ5%;%~Hr :K24%$2w-yUGumvoԽ[|CE]x_>&2W޼kG-<15PbGpJ}޶~9i{)(0jV1ۮ-GDib{LߛArAKMֆ;:.憨U!inK%+`;8 a3`OiKK#6SKigvvi`{ &&ih \tv{Ύajj YR13|n =0ftkrfIv^;ٗ)yf˩~z]K\3~j*]Y9fu#qtV-Ǐ*6US.<Xrwr랅 v?NJ;/i=zjTL;C;B\Ģ |jDYAwtifrȥu)122ـ]g ]vE݁ isθD QVXNn}xYl PPQƝr^èsd!&{Nްqco8i{+CG}҉k/V}g]?n{h눷O.vʽ^MzgLY]>'ϐ>qUE@|;qiCBF~~Z:aGe!<w.09?peb/w @;_տf1j4?g:fU>Lxe[ x>:?[_֏`yc eTS)T,VNlh%WRFLiԖDlܖd$f+J@{ r݇Y|xtߥ/֗; <7VZ++̦U6j$=&>v=ܬj7ٲܰSE9_vxʟ_7+f a ֐VYrW%r^(>i'\ -TTՍHb֤@s*>\\̣}b+qЅ=ʈwWo[q:.]N>׮NgJgA;"-`%k$J@Ip J>VY Sןnu~yk/s^Sl\7l~~\F(ަcaG h!FB[\gO*HP+bJyf?gb;In=ZN.>=mAh$0"phqB6[98짞:QEvcZױs[MӺ_Ȟ^~[60;=e3:W@Y=Ϣ6k$*aA0a(P5fiS +TyiV{O0Xߗ/&76+|Y%_W?: V)h쓛 ,5ե4ymɀ7Kk*63;nP/^M.vzTLs1ZT{1i9|;lc/R+ս<6/_p{n_Ĥͷ_wI'ϔW#ɩ3Ν8x^;rb{}3į _fO&) si&.a;YrVL UO[t$$ ?u|]i֩uR:H%c5Pj=":@w{ɩY)y)g=Ϛ'!ۡC7li%gI 8yu_G^z|on_^|O}6jpgFz~sf:Eiäu#[u'AgW-c,xM!a)@+ADҰ4j=>ӈSՠ;jM1 4 t1=&7LB{7?\:#q&kS+ o/tۖ5_i%OVIUtO/c? 5jV[>5;~DyŧzJd;V#U.ExUjM)I֢:%ph~,(VMJtܧ2;HFA $6 ao-dDss7՜6GĠq E5݅J~l؏Ƌ4OoqL,hys _ ߨ/ϧ=ȟ-^ M jĆYBv94wfWWcYcxWĻl;&} Ӏl *ΡH~8JvRXe^}'_s 9EВKg,Uz77!P=.8}uw\7}?=ظ}Kc<0yV(j>N4V5EY3[O: Y_ EF9wgr(I EWM~@Qfj/lIq3\ LoXxf/{ 87w~0ך3t@IC}7"gC=yIBs]`6ԥt¥<Γ76უ77 +VC*si.jg+uQ~qWZz!T\w' JnC^ ?m]ҹ#k/*&/O}{M',%[G3OUu@^h! |T, M_.I3 92H'yIWHW ?c9w.1wǑO⧿X__5FvyBFbOLV <*#I|@)pܟ$@*/@ړHǵ J FJyBafWC?k~zwM'O >zϻ;›e͍ Qk&"0"4I"fi, n[H(6!BNA;CTs4"-NL}<5s4iӌZg5 A7bGdҥzKU1ZYmEz;Y鏽ft 1u \3eX4cla0RЎմ n(bZ3Ŵ}ӡ҉%iLhd˧0KU@TK o[L%lY,Zʓ[op}+}L~C1_<ȽsWh|u@'/g:VMj"Vrq}3l:/#~LJi{yG]y{Td߿L\|aV6NVH4pI€s`-EI1< Zف 1c["it4ɀX"mman{&A|bKbWIU}6sGa&dJ PS 檹D 4K| ]* kL6Ē0-;6a!cxc.A8BۼqTƋE Jp'P=gRzW6 3Ҍ[n#lwZ mV8B6{żKٝЬg,l@܋?,rl y?hȟ;N\C qM|˧MӿoӋi}[J,V`p< ͚Ҡ9xVN >S}^E ^&@Pi Jtة5;g|f[- Fˏ(''cM@F{y&eOM۰f=8jdxt<4 ˧(=BdY?x=4!7N^X0dt4x;*8^c7YWG0'`E0F\0{H0&'kG]o~U{/`-@|;]@a>Roз}2<ԑ֓*֓ '4֡gq?uJ'A'"#pㄮy ldNV7l5B|f' ;R=[{Tl~DcnLJ^>O;5-!!N:y:ZVexX 䩒`P-ܙJ Nl2Bre [Pe\ P([G?qސ#^Y 3Or#gfloe 򉲅{G553ES?GϾumgIǚ(0Ă|kBb!4p MpdypMt#iBE!p3>>Tb6*NTGH"-}@cTIvBJHhɄ8"-2.H4&D1c>yIX|qԃA0X/3Z2&R P'a`Ly3>>կߛ^OCk%Mk&ޠ}M%zp=5ڑ(8eUYZ Ve~OxnN.q Q[< (6'qěG'vzEM ^UDOZU P/@1]Fsh}cjVM )).Z-.NTR!i2fHY(^z=~xyDbX.^U(y8k]cFٹ5sp{Ȯ7s}J/NߧDv][2+hͫ5q. ETx:F #*̷H}/}ijFINvI7źҥ*y[)fg!#ۛqL/B)BϱQĥr՘j(qMD ӊbw)ALlrT+b̅ܵir;)$|!9, FD1WbrM5" G}HU:ǔ{C970YiZy)o -oAF_#w\#S l-V 32\0VieiWoO{S|O?m\ >K;!%US8x< ).qOf;@7\Ǣ&\\U=Hõڤb\L&;rmdr4@kbmeXT'E?=J/Fl<ѬK#&!y݁lo;4}lpsiCs e 9 r/G`'EP'Yr\h \Z,C; $J }Q ɐuؑű S akv9$7tbZbh3R7@,"k%B^4+VbU͘n/X=ksx#o}v>,go]9=uv~ӄk &#W>ȯ )X\g4sْgJ3fOlX}pmuؽa!yp( cD$>B4T९\E0Y`cm`iJY0{G7Ϛx{5 Y5dguZQU}yɌi>N rIT{}e.BFʆfVƒCIPC|?a4T.Mx a&c8oiVY)i`q&a`/0<93GZ3j[l)Y@|WKhvUf'O_ޟXso_ܣ韬9CD k$O޲4biP[;ȳ^gGT$ a ziYp% P؈<ٻ~K!];6yCOd0lW|dz|k}N=}zA9`E):̹}V6FD6 td[*CPKZƷhϝ&k!0jͦ$lAJ:ep?Cls&$(S7V3C:\M,M.{}%2DRY#Lf@aC?|'~d),3맦Ю[׹mRv pz@nE5GR>*crOEdI?(J݊b,;8XMK+=k,v7@IpʥŘߥ᮸޵Dk$b.[JY  [Նu@k9tCʵW=l)Žv}qJ/&ɠ#VOc閏HDbL1\I$ ,x9}Id_A\n묨;fZ>}xYsyʊy-5eOգ\|j=kIυN*:t(s<9Νf_?n#9d&Y6~/n#&e )Mqe/VK}22؈_ D5GrjZo˄?"~|r\3I61Q[ xLNwy]7C`!tjޥBȖN+^$(^f\D. Z|Rͣ>YuִfOv>}֛Y_3xIlT7_EG!?`zMq#"ױPnbPhoвRK)}⚍F5ÀlM<(yq7jN\3e/dޠ|!)@ uSiB3x} 6$gd1@jaNWRɓq Tp/J?wVעoH6WlZJk8* MF=^OJ ZRGKG-!ϷCZ9NG8;DwxRIgAjB9cTuev:ɇO;:X xyOT}M?I3Ri}gOX#U!5"v]da$b&&b&]4. FH>j5~*BqzCDQtp(RYU  "G.tY 1~jI`7ak|n0q\A!Wߩ( *q|6-"/Y*9C5gaY\'+Ix 7@ͭ-O z"dx{d׬`rޟ>~p^V~Mo_iɱQ7_u8_.KxTSt$%`I6(ahi$|Q`""vJ 3,Z& ꡽}tq9KRO@aBɋ0Tb䛏4_ߖ9*}?0Q{dd3%k44v8\S)wY.xH01ȭɗokϮػkO^>?Qy>#QޒyaZ8e ׅ E8nzU +̠0NmSHfEJx]-BA/\[fC\y WPu`(= ;2v*C 3fE(r~xvL ʥ\sf[¬ fM&=o{.X?\V?Ì~d¸prAko9^}faܜu5[~:_d~b⩀džn(O)ȴd$ ] #%wp5lzlk|wS/vNIst]_k'KK) D(t R)x1jAȥ=!o2~50bb9l"@ð0.b ھ7wЌ}xc᭷/#oțnte:uUņ?ή7o\Y!^7OJ'L}1sRH"b"8fVU9lU#U; CĪ CadLn%V$|o_He["߻yrzYlImYf.^'7kf6ͼfGsmn:S:0IXL H1Eaå7WμbP#O!dx= : M9M$UCR=S%) m3kA{|7ztⲝW盎cTAuz;«RjLÂ0zBp&pf]gR Q'Ò ׁUpޚ P<:EtnւaUes|ŵY4]YpӜH?BMwwo'q1H$`xJm)o׈uyS\FLMK%C@2:ὸ)pI)\x`n}9^֧M9#=~|w7V'jV2|tjWЍs)tRIؒيQ],`!#H@%,(k箩Q0gm^;|Њ 8GZuVmڑfW>lQG 95lDY(G#>5D7N1`ypbPKMN!|$4B}aG-$C^CA2"(v1Ͻ\3ԥESũUQũ4Js2/S\Qx q^D\G w?tsc#^sؗFe"ȗ_SG \%^If/ʏ2uu1),s1,]J{l+',,z..sjutN`'W[S,g\y$b;,,G-q=QӁc-0#,DN/@y&Q.ypzGn~ۭL޶dJןotÍ5vY8wFn׬:p܅سǔk{Mm }o-#e_]b$J(sDJFrߛ|[~ïNxq^|2P{BIO/\n];9s_xKLJ?YqsIy6_nw~ةhQeAQw䨍kʲ ,JoGzP) -bP;Dj O .XHIy@C9#Dچ8T$n)Fu0ތ/R7 !R7 + &{2#c>ֲqipmCSik+V.%5|",1Vf9YsDj;\~%>} k S gkCCmD'IB>|OܔM u FayK5Zz~'=ZhƵ-7v7aE:"Eu*vP< u*u BwPZ..H/ Qu>*-г_RDj[fCv\&.uwF *w'(wcoM/y?||ɔgIǧf\\bKn]WqKP_*䔉O '}Jy܅̡ DKz}ӧ^5n/:zPGV:Ё JdQtŃd&S6OeA|,\;F 47[}˱'Wu&}RzO?}-O>yoXaAB5 SB!3aJdP1j+*&N1c& $D)ۊnKF54LoN3[1P(gniZʚkh>ϛ!Zנ_4A|}-!eBcVesDN#7[L!mҵnaasܪ\s]#T*/F ](KgP_Θ9䣌GN |1dRD>B I]j&smIDERI"Ox7>P9ggr!CZR~+i10MFjp#C@3oDS5)n MUµnOr5 H"_EcfM l-H5{B})<-2jݷk7_%}7)'MA?QUyk2L$jQ~VMT[D-.&@ GG4 RNYWf>`9 E({HDy zř vEr)n!Pt(Y+ %YPݻQ:s:~ϢQwܳ83/Ҷ[.AKIs|VQrI=IxK I"UEgY`Gm>ۤgedbTC+_)HSg\85Ɣu[aoK*]0 %PDqMkQEG5mFjbQWT3B:98v?mwͺiQas{9xJxɫKo_e[֜r'M9JbKI˼o|xtIKxx_WOzJL'\hs 킹luwt-z[ s!FR~ s+>5a*B2<"}o\('' N=HClΆіoAPŒ^ѴVQ%|ԟK={ !S~ǻt.b:|ϲu qwEًfbʝ{rCIX D6}7d{uz|'g:qe}jVJ6521.umsxK tghMgGQRx_5vxn*SPF/ ~A5ƈ8=IF/W+ %>ո(QPD%*I7BУہ +wdҦ!/<Џ^!GenTZ&_"}~o{ %^.%~I sП0(E*TL bǑ65locOF'ϙ'ƥdNS657$ƥ[v-_539D7 >sO\/w".T1Ƀ 649\5`?^TA#=?ɌI46/0tS\5xAZ1Q^h`OŃhBA)@ 4&䥣4(]ћRg'P3kSgǽp+Sy >h4״yK5fx3f^túA΅ÊMin4V/{FFyñׯYخx׭#9wPqCO.\q >DuKpm p@.zv)3q6Ҭ$?b9kEv~05rzvhG5Ѻ _-9U1u}ɃW>W䝁k&V;փե!ޥ]ۨWU/~H2%߅pBTx?J.9j!R=w5_o|& 5@ɴ.M kYheVAE5DQ#܀|n)AS者Q"XWG6%R>QQnv&ЅB뎻CnðjvlS_Zz7=` gL^R.W~+.?ŵG:?\1wj~6>yƱ~O鿻j!_Gj/# yGd>_gی׼:u}u|;94G|]Iw x/ƥی@q/2YtUOXlxqo&q"gh{vbRVyYgIOՙP|B’K'1SN#?PKROJ7o ]"+tF $u6@>QUPQAA*<:Fq+5Jp^%2%`9km`}y mH{6ftN% hE.lOq'83dFlJN|t>[xt\SO[ Y֌_ af51|_-vz?nIRRøK(YC^p]lqhy86ٶB?SS><^$vI㶰nj]\tVȓ K 94r6gFyo>݁T]4Ϸ ^' Mhrūgp 4) AGJOR/n 16$>ʨ$UHs"A&>mOJ^7%%#] ]auY3 3v ne,zwVvǾ+ߨ鱗LG{~ J'2A ?rDa?| ƍ+ޝH[x%/ zô_%AuT{>SW|2B } ^Gޱ3ߨzB'~`?}zXq'Og_)嶹zyxދ&&wz>-4MIրd9猈wHo^ ez64DTD10DqO HB%/yȶ&7#r-DF#TM#pmJJaxR2[(3"nŋ=jjuQVzSIGwq%xmjj~N p=>H@ JdJ+LQh(SY55K­9og/]=﫫{;{QM<&+fUWTWuP;s}-5!]J.ҕ/^ݕP9@Uf[3g C--! MVbO4L@ υTItlt 8ag+C8_S3 T'!0RQ U3i­42nPWEMHÌ|[10#ik+mK{ilVmF(ܟ@GUemp{kH*S@$ !DfD@DEDq 8j۶bۨ{>*>VխnZ(;>|H3Bk@1ƫX'5yw/YGX3qUk^^?~/yyͧ:ڣb [6iuTϋ&: ~tHJ\%"pJNx >f.QИ vA·QH}{5&ӛ8?$}L -赣Pe=}g(QV搞/Z31pj ^*8}_^cӒkQ|`]0`D8Xzuǒ` ʁQ'!+V2lmuƞکur/RA0 Z&Fb91&6VI\8Ocp,t߽Tnash^ 9Ǿd`#?tPYN:M)14Ƚ̃|'s)+JmM?0 ^߼ XF+Z|9x=lχbPCAqu^媕f0NMF]%xeJǣ(}6b)d@M2Glc&Px5=19"DG?m{Ir(dviI|FZ3_3iTe<(GL TZ£ېVpnv~oI=="*QzD^;Հ6aW\*LY T JO] B(4RjP V!Q1llf qpd ]9`Tj((Se46y<4_ ҟD#&$v+/Du| ;@r˹DϋI#x?8>ɹ= /cg׏}r讜~ ˹&uI>1E|=f$OOj'hX)^_sz\NKD9O ZwϷ8'v> }5a]9ss,C9lVԟ@y;?ȟc|d23zSS[pq=cs#?$؋%fr!9FOS" D I{d ܴ(A)PV.CڑەG(55F^:5Yԓ64$IV[eo)n J+DaT(LG۸a lAPC؉FG:E5C0ffϔGKD??e~ӂT#qZ_ջߨYus:*G_;>P1$yձa3'˜t%y<;9BLxH^?p6t}G9a׳)"sKyϷqͭsY^?oד(?p)t}y}C^#>㕅3s{ϟ'a^7-(Q˟R mAĨNXN"vIb>w"}a9/l~t=?`kJCׯ }>e}U ,G"ugG`"M o>G %pD nlgdn \@KR$[,2 +>)2@wKIIc ehZkSn㯓u@1ql ÃÅ`}*84HfP~*dC$J Qa6^=]ƆX6/_~!~6y g^0y:‹L72I&QT,nXlRP>2tNnhV}F?dkv dԍI!].?S?9-R 8~[D {GgfQGF'i}/ GكΥ̢[bQGT0@|35eP/&.Cm zn Ω1]6َok-:(1w5CW'O&6pcOH:+6̃-a"4dbJRЃ)-<B_Eq„iўgۤgX ccZh< 3r$ A_*+l5Yd=0ِS.<_*9 Ȥ&԰'0D8l);B1a 1NNs+qZG7r2,Jyvבߡʹ;My.9z(~=y; FXWT22޺/^JŚU x/2b2l"\1:@T4C=A&PtG0#.1M&EGN1h!blP*-ytq+1.F\rZGntCCI0Uyhr*`7</>&3w{w/ 1Kו=mBzEW7Os*M.CC#|@ -/c9WyHxmXH0Μ{y^c._S7=]b[8JߟGALV%jQp^> ?gVs s|nXO"E"_; =ROaJiԗ=8$$TbM$%fT3y† K[ng5J wOd^niݷV{߃:V+D!-5fz҅T)gt8^=Ӯ7ӪʏAbCqS)"zV|g6*NF"9䥿?o0Y˚'Vjtl񤢪SVt(/؂88)IZ4߀k̟͝=-l$>+Q" %[|GQG?Z~@A^EGOit߉a0~lvA/A&|^ [* D5am*Q Ǐ1oęڿoY=cgO3ubhl5i:VԊPK~2 ϭTa%;-Q 3I=`ڪ b_%?TJӶvUUc3 +Ծb`?QL7~`4z"b{\`Ah1Ĭ $􋥯#F8Tr_ ԕB%U)gLqN. *Co~pnVUnnn-j 38 91cm]1h 9 (dJ)Qi- iZqʒ) G)U"TµJϣF4 ȁŌ53r+[p`K˥,3kEֽ8b<a^(x4;vH,c4[IWpRȒ)p$siu |Y٭47:qGrr ~oO]u0jeXd%0J$FXPW){j\cU4js#rd.TQ4 "#tjK-ٍJ3L; fE- n~6l396D6b޲871 9ޖ'&hmo*{{3v{ȧe;SʫfCq)]'o;o#^{A?o^8Ns#m[z#pfG|6zs ' B*^TI1miӀZz 49c `5b&g0PA$3ὂ1~|}+s)a]R(7F{ޗ5$ 6R) 2"c0&造'Xi;xBx3a-{&lWF9 z PE5ڃQE5&'8M1YIv;Cls -(U(N0v9GQifcI};pic3ZMu V )qdmw D&`~z!C^Kb(}8tL ^x:dK=1)CQҞ%P݊NA#\8Z! :8S䮇E_'Kt}Kn*є܌.&Bi`%b DG:J.,fӨ8ܴHX;)۾LDb"BXlypRSEOvڰ)UCONy&OrkFS big{O~i(RU΀}Sfkp!K<s9pN@2 Ek@zت؜iDŽxED}.01!ɱg*K m'v,6p5̞?jT3Ex+JD __^]7Nĭ'/ڠ?TlO ?~vR;ykάrEpy0OWmP eyl$ W"9osulK+`lIQlM|>R|^#6ؕLS F'R98d X@~hrSrcBH;$,5D-4yB/Y$k hXt"ݏXh6s#W޽54Wݰ.pso<]ځuC ,Jkp 2\P!E_-hu;y%,2d\"g+S5f`v ty\O[X2S:"\غ< w$ )iyr&SYXC-Qd*=ddJQB%Lt!#\!?:|4myl >Vy棵 k׏IΈsoywkm8qwv,E9еk#;`Z^<'V]~y={ 똅)ٲ9`:Lw~ZS8qV?{׋UbyChj_n=Z9z䲊;V &#^%Hj8(ءwhﶳ b[ `qdecQ639dP@ ږP(-*7 "/5i\>dDUGa\waRD/i #D9\J,ðl020գF/fL&~Vf5D$xs?@ :g3]/F'* &FuvZm?c s]~#+0k~J@-(Wlvˆ2N z n&:/]{e(d#fs-=y(UFrZf`Hl-uqֺV{#*@)U]@@0;AZaq*yu5D&k]B BUr`ʦ4~ښZ5`K#\Vu CTCqm^I4,S~%` "nՊ[8 N2 t eJϻ_;d¥::(d[ ,^/&=];yMj{xrі &wZNߣ{A8lf}I^ {dA=>X(GH-M&MZ-m:UoT`Ļ7xĮG5v:r՚ދU]%QBF=F\1d:?; t` W:P_7Jڡ6})ЦA)RaBfhk4uH8)N;t~)[xMNKEmYxSjO|cہ&fzs*A1^L0,9]mᠷ87xRMHTrg|pS#;IZp㨁ǔ~6Ⱥ^=&guri^{Ph{˔I6_wXrd(KK`)#WMOM﹔Vwl8c.x2( & 9 f:q [+`m MPWJ,D` ڨLTR찗@Dz)gZ}}u~9%샍bſMc o]; r9=\D,7%,X_hG_BHw 7IJۅ^sn6g<݌y \no40 ք(m <:LZ(wb ?ܸ/0zԴw4ax#~<ۍ'p Q=V0T< ܓ5[haso7Q$wZ}xd{w>SZGǭDo<{|8q$'GӀ"v,阫?}'xM>%).V.tm0!qUm@4 _hh$K1W+LQ"+DQZ>RJ~@]45D%Txf @ 98%q c=,.y%[[~Ӻ=k8F }؄E6v}oblXGos.1D{m|ɨۿ+ui5Ԍ?˱Rn%^5ܤCC5 5hOR,VIr݆MxC1DcgGFA2K+3J|6ӊ4`c'*@^EseV]a:d@C|]ѭؗ[]1SEH 0a;@-gfV 5b |]Kl@ "8JEDrxrzcY9|8QJp֡fJG430GǕu\RT0iڏv'.>}ƻ̒[s渜bgͮƧ\mȼw3U On=#ն_\r)w<'9#&^CwX=kϛЏXl,`/ć;o%]csXB3PAgaDM,x6@ ).ƫY -+[w"@+ĤS+uK}ؔԌi;_x4y/XgUk{&l >Ǣw^1ں"kOʵXOrƚ@(t !0ᑏ!9Ǟm%/ּ|+H?3J%O48=#WHh)6x !C-TgB`ɒ' Zm^g>AuC8@-4H%\ckV (&fwrKDVk39 É $2}n<߾ ,T6cOJcg _w b"vw&;SOtxr&0_mMo Bj⹷bey$±|D+kVw&6ǒ k$s{~nQR"C6b:j.R]:gDF혶*R p]b?R&;o*D3ݓ>&j# /|9A輺kjK1 WO!=z1f&Q'V"P.} am=,>rTTE(^+{vLJ%L[gdD"8IXQdkicLί킙ghC)׬;V"yd=F:vv \{I`@hBpPm=MGt}Q)&K3-*/xy8 h.5cݻKpᑏ.`4G@{$jm41Ѩg@+ 0  V{)%2Ę 6b(mM\\HN-=64a3O#ÊAb)<:nL6ȡþibN%E`ݴk/U UyRjhOaOWoz@P0^ծ L[m'{h DQiW o;sFaAaP̢=m xժ{Qo%\ i'~;*p9Po<52',VeiƺNɎRLY+fIzR%ѝ:Tzr2~ߵG5z۲ʞO}7SLlUy1;V0YbJkܟuZD$J8ϏKJS^Kl Vb!msky(+=C{/h4Q|o͹Z(spרPiP[cATły$rf3F^u*ۢn2:=zVy y_P7 pceXYQ \Zi6 fbh`&[a|Xa(~<c>Q==Y-`&Y& CcݪsUwÄW xyatk_U=yit45tW}[mGQiB[g[[0R60Ve]2.YIQJ naooJJZI<: FXEB=8m@/j Hq3104:6B3í 35,EXc@==䄷 h>Hgi E±UH="m#BX(eeQ[r0焪tRt6ٲW5I|ҵf t ^XD,5.Ͷ_l/W pu?P_*NЉ~s'4fj c攖0^se<=fL5{m~3q#d,&W2B)̯g@7nU֑$fzTzA$iZy046`OGd e%H"x+(A&ЫkJ$!Zz*Y p$+=P#un<9bq% U ςtЃ6 b%6hT<#=2Jws;V^EA("Z_9P;&RT7Z%b'7$>g{FSm "ŒBƉRx0}@&s{f1mnn7rk~0ɕwmEg(1G齢hcq ms#`q."NC?s SEC Xb65ܕra{,(S5ؑ,DkchsޮlUμҟ< sڱQ>XWMno[m!fAމ">KPVNqgA^s\AKal;Bцnl2jsIވPx6n< Yhr`"*A :ȥk7PԈw(AG!"*D3"#܇Nn]a~| 33Rp %k"$U?__D{^ų+?c\X~v(ga&nM΍2; "tJ8x,)@1|ahBܫ7 h { 7K){=M|lE+6!`6;&j8`q1Bds" C=X8+9xUU ^ 'Ӕ2 -9J3}i28ҵ/l{d95o94aM3G y,L5:"H[~yӱܽ{-y"3p\*Ra^uBc @˅& ߍPL`FH7ZpKAh1a% ; cd|(<)qb)O䃦7)-=mmzk֬gOjܴ|iFmם=˦z) /j+j;CII‚7aS*ImIt?(>ls&eiDYl|"T,hFT Ce=3K&t]Iys;WΜo_7oj7)nx}5ݜ<5g;k3jgNՃՎHElUg{?]av>h绵4K9yȧw|*R%%a&p;y(yMn=*r2aSyZ˴cs{SV?ѫuqMm+Gq __pКkW2Dkymƀ:grצwkn"{X4ߢo߂8[B\ I$;{`(SC\t,n"5D;𓺙JՖ^q m`W_Sr`v>mL"}ā`,^ c BK: n7M0r`h=ElAZ}/7z?ykm2>b~yy)y3iyigd e ߘ;+䠫ɸ4¾C7FJ#+^[^W9.Y׆촳ɧ&w5?Co1B]~fN%$v4Z)M8 / ۤ L֛Ȏj 7E00TK|_J*MŜ N{^twt2}`!^U$9~p̍30~ܧ~p~f'G"&4sw@H$&[P6iG]`"wy o'!Fv4@A8s 6eRԥRtv2g/gN'cdz F@w} kq8SF4Է ck؆o1h߯,_؛[J| xUL,QH v1HB) 9x߽L lmɛ Xb$V7AORFT$ds6O(4ءѰ 0 D tIVXaYP#\7mҎ'|~m洺}O|m2<͹k}} R>h̚ ـ:8v>fВ9sXj$EPCC7r1j*TxCY3@6a"7\4 }g / lD#olªQ8& iN:}J\8Ŏ1Ab %&6R޴۽GgoX~bۖG"̋ieKbGCbwjigyt 0>iش}'E 08ԉڹfc373lV8(Y/'1l ukIzaxMxn K+ڠ+1l,dlwbY J&fK>!Br( @Wf33˜꒢Ω=0Mnӆt-=G&tOhWe?DײIӶxB|7v_ϭI~rG o:G\/8Hrd@g JIߝd 3Hox}^Z1,Бx 7HNȼ1R@[aAɬtlm'؁~[wYvl߁;*#mP>]y3@Òr0C#"mI2zXNbJY+EzĂ6}xU~۱%_ڦvQ?l}S;.V6f\1Krڈ^ʼ+}i[m>yh(p'ssQ9W1kLEtA;/TdYRP6a,\ʘ&R; /H/( nMz/"nۯ{MO>vV܁o#[_^# GhrfuG;SL}kg'E?I+gy+k6\V4 |S:\;a].+5AΟP/XM55ĕ!$"-5ch&cK& WlE qr{Zuq~$ U5:AL?!uPBm'̼~6-HL2f);[-EO խX2u~.s( _ey.'Gc7@L^Qrq+~*#Oks 0STf(4<ۆ*B7i2I#j(F5ՇzrxhB2HNy!ad_uH+rBz#4\L~kHHAbFmBoralvhM]h8 ni7a_bޣb oQφHt2b@xۣ/ ]9T#=a8Na]럍7.8xn+OH@Vch@ =hxrA5#Kp S"N!9}N|6@TLW(]IVYۖY\Fۗ%6!Cu82vPI(m*0apNO|盷ᦣ/Q{ݡK{l6e۟?5`ṳQhuwL3 E2MW!,)P4QCZY\]Gl\ 翳@B%>H u鞟YN @?ogEHMXفYǛApRC)h/LQ~ x̔Nu3jɅ(#E``*ވ ,QU3nH"NlW]{7VȢMjymM@߾.NiX~q ʂl;QXy:}n0Ȃ( /t& 'XP3JFvd1AhUSDX&'UE1#n QAM/fv1v' R(彑B@[TOth\.! 5vF{j.-qvv؀:*ŀRpt2lX39f K^ vpld . s)-"v f? b1`WV/Al_Qؿ6h/%F3ͣIG_dTDC$=kxpG G#i:/dgAlar?q$-IE/+͇5>![6aIiDY= b%{Py Դ.L }eRHuhgw_B#kʕl՗_j1iej` ]|I2)<ػۢ5xT% yr 9YH "(^1rAC&)[ش5l:mf\xb`o"h/#`<\g3-yӻI](D~|znxTz}ZP5^{-bj:N ~9'蒏(xQ~4|jm9 ig]d/ Ґ#qTiS<`5;v|q'q]>^.Ibqp BÁ6 ``p{K(-mivwb!¥( Rp``8؎='HW"9t1r`M m+xj37QQ㐖# VOP« @ Z.8FٽG"Hb"bĠBĊVT%,RG}"V 2~{; YƖ~R6J[HrQ#q 4$aqNظyȍS& n-'@&OF .c0#XIJN@P.1 m~0;D&~zqG|lrň89Ws dFY (ZU$\iyvu-;⽄DnhJ& 6,7>/AzzSeys/]&]KA=t/qRp Il0w B<#°IB(vvDFȒqRN,"]InS5RiLվv?Xۚ1-#M5u{u 'V}"Am܏a8~tsJ{f3Vh ^@} S1Z^]XxZ`V(%\uZ,mG3^T`\3bVQC GҪ#3Tݭ;?Xy|q* 1'Ex GDzH\koaq/]Iaw6_&1Ki!$ŝbr3~=HwD}]JXd Fk0 !0`=2Yyn^,a4Iڣm&y/~ k2kz կ'+-7.kxW?{}kg56r)vҽrC{ښy1C-G$i$x׼;g.jtά":;zi|@dv|=EIbEBSQRS:/8so~-1 }oWS5CIt֕NYt Gs_3C>Z0PԬynWt:ԯ6= 5q'j1zRTXWB-ƽÎIc7LunS~ˋEt&/p48єJ:?w!S*K%?> 84r'a 3F|_"i eWzQ+h֋ Y. h?LKSj]AEEph~Z+9?"^{G͍|:j mDd-t]`I=";QF' 5(ɜg)[N7R|{>j`v)Ol91M9.;?@?ƃUcA`bKH:qBVQm6Ek]ϣd܀sKZ7z0"<&O0:ƈݯ; -‡4 EMjo)"xSapf<[0T DtJozGp8`X!-) &6:dґuJL{MJ!2CPZ>:zK&xJ ?cuz{|-4Wl_yjӳ|~抈ܓ[ıGGUxr+"<9u]rE;5-u?߫":kg~ ږױ Wx~}bbɘ#VԵ4*ƭ2 uD,S A^Q /?1:'gRvʬE"n\-hZTyhC"ܙ);Cݧxh!>x^~%6-dKB_OIٔ?$S'䘳nYsb_To'r l!ʫ]Dyr]ĹH@1Dq@ԧQGD9#YޞE^Xթ,nݽ'ka/+t96j%]e]Sw8즆kFb7D Dixr=~BX=_6__]|&ތWF_~agkݯ״&e*8v7x4vݗGqk^W􏝫k] J|yى5؜>oőn7F>*Ԑ<$2dDd!L!I@ADDE&eQi*Vj~jkipߵ9JnW*UvN^{^] >ro( ltzN~5#e(vhnl mVMQ>p=7}w^^%kU͞"vm)nD1->~ذn~|8sL;Nϓc:yqѾ{n՟ة19v+*_=m]3-c*3mG?9d %)nkF<|+@?L끃qB?D_nbG(Vޫb {k0{9~рyb ^\d&9N(Zkmo lZmAL#c2_sρuw5Hx(IKͤOFզ _`{4C8$Kd ``!y#ٴbh^*[SR.46bd{N݈&q:1ȇh!&ԴWk2Xd]Av8S?[mxBouKg򺺏gx{Dљd>ԡ:ITͬ$nG, ߨ#NMN>Dh֙@3vƞ_kf͚O ]3f)Ͼ&֟!0xYhZwr<+O(r/5=Sy"Ȑ'Ef7"@ڽ^e,Oi}xy!JQu7lW(0b{6BZ,mn=QSm+)0Q"+ɠ!1zv.{dIqzO[;tYlɳ|ݹ('Zk5Bl|oYd=}TsIQ UGvLzh#Fu! h]>4 k )f_x3 BE:yg=CfcYjp/ϿKS `[l@?կY`'ɏu) A'bU9 +[qcfX&Xgt:u G%g :)m-]q=X,5`lBMMB(h1X50PDWn?2h̩֣+ )"o@zc)R49. Ek5( Q>!E1֑fZN ȫ8',J)OOX7? r0T):%У8|= 6Vҁ80PYJWI(|%|sf…R]jځ' &#ӱ|Jvu~ι:`oz_#X@H+ Sa +!L# 4E zxPI }KpOI;8. V¤@;8OanlIJt|W:8?Sqb:Px%`nɡ7vrF+^dj*|=AD1#)(ʝHe\-(E[+Ӳk8%R2}-hkn 4EQP?S|Ta=wgԁ b`l~}M-[3}]?k!/O}vzRwAs4?7ECJ^夛U=.a3+qzH`U4J(%fb ( J n pO_0# <3c]ira.H'a5V Xqk#Ɨ:%)pT왼9ȓ~tdaZb2R9l[-z`(%sM))Lw' ў})TE]3Tj魫KoI/Jǜ.An+tWoY"EidnM<8U9͒0z^I?ҧtG\ =Pj˾@߱×O0\uySX$?T, <2`9deI5uIvuS>-FVu{s>vx-yt֠KUO~=t_o+ҿqSϽ]fɌ!˷%QjzP,@?OfCa .>#I! N nGl0#1L<{mibwiө8L`2ǡk_$!?8OtfT?y9+[W{N k&JaitK%U9ON_T!~eп gfY0I}=7 ;oglF=Q08t m'J`x#` }kv{Pdz5.WWe4)4(APq{;~ ! 03wogΨAnBq#dٽ4%н\r*QD">"] =4t)7R$w)J~ץ\S$siHR_p/k\ 1IAlh[A EDx'ޓM@oZF=蕮u$u^OԥGyxLt*]Ǯ4{QsS&ˬSgu/&b}O)Tuo^&<[`7)ĉ_Ҧ@=4۫sRAA鋠UrɚpH8 AQilJ:0$'Hz9漊:Tw _,»iρ-a ZwB: h|hDgz*c::⛇ԏY\g5O.CkMu)[v `5%x$_P^aեM9RyP^'7h` 4thԐ'wv]F).IW-t"Lm":J:fi]ԫz>PfUA8o[S1^弁S*)eQUmc ø>h;aIE?tK WY^+PaXHnX.V?\%mJwhx@( Qkm1Q.t]#ugug``]ՃKb` [>c08)تf9`+Q+bEoU+ZXj/Nn~ؐdXܴc!G;^%gFB+~ Tn+*հͪB/P<n#D>y칾tt_"e] ZIAuL].q镢q j򂑹|&fXh$K{"&#V)K#đmQ 2q ۾QsE#&94NLt~QBY! 0 X970EX[0E-jqRlҊӰ:mX&pG챷ܥ(Mm-Q̍dI#P`PO -"_C;|0[m|` gA#Dor0iѡVf M xDmuµ/ُC ;sr5 79&@Cҡ,< :\ ep+bd+!H"oaEA΄@7ԶA`7죃lREi\i4j1x[(}`ȃI΀t׏A>8ꊽ1XEԴLf}0'*B!y&{Ia`eZGT`]5.Kb&qVIK-&) g3\@v#J(A.aTO$j7D-"ũss|oTP>{!˦B?!%-eV@MF 59"C"+lv蝤󣠅=]0zQ\f;7=²_Xfyхf]ҫF/V`K[5ꭣO36/⺧{@ <8 w~(e '8d/pyi~*]NBi)sh~ 0Hѐ5!z|?6ޟץחk˵(%E|vG+Ul7:ϝyfO7.ZeT%̞V; }lr~Fv|\Ӽ55\tAzx}^!Ŏz]uݧ-g=mڧangF Hv7f;4"dq_7g {ì4a۴Muΐj0&6•6AH*h#!!Gv!.[V_T]ˮ (sެ ,3jq4:`b HG*ae,MRY4jDd2`hJ#"(ßm\" CC*!28ƒp`\u7] `P@`nY<aDn\wYZ9DOjRZ]b O5ӧ<*=n@1\LJp 1w 1b C8tmiL}QQm8S8ُ7X-@xQFH͎-A&uxK?5fBuUUHNn/33rbh>u;P $ȫ(Ov@W }\랇<,QV8)BBɠ_=sXN|q;?oSKGTqCK`2|cKp5hg8#9'rᱸسT *{=)ݤhC]m"խjF/"?D&^hC4g)Pxr "H~mHhSST[ UX7=p聱?RoB}\S!byўMNmcoqb3>$y搜iT|s&jV~/|uEq0Dt~%? ?lrkfײv{Grasc}[RwĔtdLJm`k@$B SfMux-ί?:q,T;^}[VMX֨mS/zmSue7.[I_o`RdaWB>үx. BnyKBL:BI/"0 o5PM~[J@xE r34 <}CL|,t?au)YZʴͰxRI`c0@&k/1ZiSwEkK?_ ՜JP<ɗҌ`yJBL|}/YF!*G1Djܾ kRBTO jq\nL?ųy0:Wh1,dJUOkd! ڨ&HDL9զB ?: f,ҋdt̑JU"ժ M{ъU)'6,eHaxPܷx&&S$z'EhEVT^Id,5Ɛ\ԫppyp}ɥDăXx_Y,&4PV\mp&`PCOޛ+5wma@Y?Vp:J}.ZiUY>S ZG8Z88 O|4HBxXA48xtZʑd\$h`4v$KSYf~שᵲi^l'*޽8jz? kWYvC:ԡco>Uwh42ۍJK0d%wWԞᄓ+:ҝ1I#\@_X,Dxw)wQNPCV31JJ6Tļ sr{.pp\i 22Y)ʬ͜=X< w+99OnykiǨ1SU!cSZݐҞǁcف]|mR5jnȪOCJ{|)8\瞿ػLL אѧX>I#}*TJOu(# LlGY8ԓu'όP0rT0*BZ0fa9w슨P(I\zj RR]-i+o_^Y埿mY1Ύsm3!g3I4**&"K-埙eNP؎t?=; kLpğdȿc;JSR:䟞Ac{#a=6L{^kJ^kj4ʆhOIE#AsPs];F5'7h] Z?*e19'ڨ< D VP5_bz |TE  tu8 V,y`r,a()ʱV $37F yj\rڰfa@{Q+\ x Ưq g Y3d{(.*xlSUo9PW _ ` gR1|'w7S7a㴞I1jDXǬ/-N y7iϠ^Y5F.yQn-D Xf,HA wI eE􌡓&\9zٞţƽN{//s< v_^ӜLIaYub%|V1WY€a⍚qpjh,IiXVL{{ |og VD9/3BZ?0v]vv;APE123V7Eܡ3unl,0HSRhf}U?y wFD] :?eF|,uU y ]j#X-E"΅Ҷ`X5?%/AT1H]L(rSH\PO÷RR`y-rf}IyE`ګvN֞1?vB6lP&MURJE:e!|Gqx`L2 1j -b"| , GK=S9~W~#L~K~s¯u_x Ok#JW;8d a/ }dO>MGq8ڸ _[y?8`*kٶwոqwAvaߑQ8|={o=Lo8==Vʵ;tZ_)ޙ?Y{s)RzQ&˞[cm1DHZM>=8N) + 7贌fP4g |aI `vOGNNQ5 H,j!!(6(H;TQOVQa\I yQF˵97-Mh[G5T-#pT7PV>cS2&䒕sҞlPᎀI%1 #d-LJѭ}M߰"'~c'NsQ+WWLĒ mlZ I0Nc'JNwNHؐ@ È}a ".R0.[A2 F TN>r% a,.Q_rjڎԔ+wL/y:ͶDqү14Od k~M};Z?CRMgHx,e.iSs A`lZgRQD학?&|fCp6ʹ4Ny, w4&~ڧ+߷*5#:IRr%Gty]%PiZG38>Dr'-)106fh~SmkMS_h39Ml@/.?K+ @^ Hc>G83N"Ms,wڼao~{擇LJ gcK x嘐Nkh +y TY]Kc̼[F~ ~ eH?>/VWUf?J `%cÕ4H& TQҎ=%q.)f $/q#$?S-Cf:(Ǔoz7je˃)oˡϾ㻇j_hfgmsڽfLS;>Ct86SQcljB,$.\(2ՊgFx ""G\$KG.sk^%~nڧnpCo>sw7{m(39Cάo]ZQ|ueX tDu(u #6FۛkZR{~rs 'ҫ=6p=>{vvsAU?O/GK<ޢxjoS&y|ny hOtZOBRn q #cgyϣ= \̳0QűZbAh|峺I0I)a"A ,}')1a871a#!@!M&mK+*3 K|*½̌ DI-gWЀ$U4Q&}9r#.k6YcV} XJg![,! d*h+f4I'ejF oK$tph"C}c1-Ozfބ(} )DMRBec,;09% 7 F&KBo 3VWD"Qnc팪R% -zU.NKhJқ|N^)$J|MZ= ÈZcYBK,`, ᬕ`tQ;K 'L{PLI0:1; qnqY|ѫ e0q͆=7cm6L__o|F?7QꆳCAx:k`'#or$3Nw)  # q$R$B,7B=DA`*H "aetN=m:kt]8-GO_"s=3zo86أ)U?^EsWxS]Zg~>D!jH;>0`~W s? nA5ӠBX[}Hvd9Yn-u驽/̾wʧbߪ;.p3jL?qϜxl7?び L`)>0".%rqqr80;S);F#hݑDp5?8΁`{N)W - ' t:ǀkmW|<)! X9b՗o uO),\Cw2[jN~ÔȗXb5a+RYZCᑾ cS64`̪M f]>O~AY?5W.쏷)'Ĕ?N8w!uC"GX_ѷlۧdy UEeԊq?_/2N* 5( =;&rvdJ@iq ]H`ޡuqO@Wk= ?qO6\aX/QX,D+ЗF+V0%Q\n@XKxb^puB"aEJ6P(OU٩P}u V&_?k~[ǬU~Coh՟,:tޭTnгmE~~L_-ii+eż){4/P6M0ί\c#_˶ YI>$ŁT.А 81JdT v1錔@q ɜ 6i`riSL;Bj6Ԉ$3avߎa嗕+J껫oxGlgW6٦,Xz7-pBpӁ=lq׌_O)v⏻.b#(J#_++2~>{z:) k)6di.B8 u@ꈺ$XLfdS>NWDž۩w$wW*cp1ưk#Xx"l[TLlK)E#`6z1bؽɈZR!څp5bikySx9" ư՛&5> v·a5$"iœU$V!_iT5k"3V'*::8񡘧tD$[q!&="a$s  "&-<r:h (<0䰸> $n@1vp@'X!1> Bi1ihX-|$w5}`kd:"N lcbR:$o3s_`[<x(=|d1tهB 3R%?&΃cꯅnԷI_7\-߱k{|zv_ߜ`.Nw$ʀ1!1;0=7F98<5F"x>]tABeM`Erp=6rǬnZvyxlϥgOD}V<ީ~[v~AyϹJ?'F| K~#iɹB[]AZ9,f?rHƙ, {b8\.4XcIi`[:H4>&8"gdO3DyU5t 3I{v4b 0!6X9Ӗ-I$dI ˀ:1'h50aR$v@L;LoYb!i7J4:|Ȇ]8&:Q?}= +8h${G\V9SJcc_ULPByo8'ECGdwE*13[HAV $ #P >Vߞe0)Ȩf:qT[>x3/>rumyj{-j>YeO޷z[5mcjq 8<*6Kcc[ %R$ ѱY%&eN1U> +0l@2 $G$LQ Ӄِ$..Lvv HLB͞x#c@gֵ3'a:b@ :>Ehߍ+7b4a8H|nG%Tzb!p#97o}'C.9'9~JN_iߩMt0/(vX>-:ߟ12.3قFo?0:ಽdZ[ G~_Ԍp'0C>_x>фOo-|1EoVf?%ƃ~߮|vZ^v?_i"-h2DЃ\{qqRza'_\jY'8+R{!x^G`2?|;'k2 ׷|OX7pU><|' {qk+I]X2Zn]קUh-8O,'[x0^Gln/׶Zo?1~ :sJ =lͺ(^EGOަ='xdf{{CV9a!2c[A/ ĦHA6F"飵=My9gh~%׏^_1Պu }*rRb}'[g0IlyA~C,m,!RR><۷hlOCItC)gyq!C,O>B>Ŗ/j!0eY h nq}l9\>-[kܞ1.G?kl,۳eɖ~SbNoj6T\\gwIO'-QV+:?U3ju)و~4)'PFկD OqfWXmm)?sbgx^OJ$ث ښeh\ڴrc}zC Є!lR;!@jȍ ('NYAv D=we+8_{Vͽ:R'-Tϸk"nh)ovb,I!-V:R:ܨt]A!"k-U? 'gzo;weVv{D\C%|"!Cduazsb)?bN0%ByR -9bh[&ԋؙ,wiw٦9Buj#gRWB78q_tO-byy4StwϋEܼDEr~K(8 c #P 0tҁp~1e7>2!5ӯ\:]ԠS\PTC9\_cg1;Y"ݒ9/MJ-=]ZzPv"jϵ_P\oԛ׷Lؠ` O?k47U#7Yۋu:A6#G^*٫U1B~jz]+ HwgB;Q@!}鯫}H@I*9="X>X?) M-}?w@-Ug]NP@FbT2 *)sXPomFY,,}l^xІaA;m;h͛qI_Uԡ3{+,*;:𺣸gH:Jr Ds"\ρMMwexq+Quj,Q70whR뱾w4o8bc1GHU(dcÛ"\(I̞k-,w28[|gU"ON+^t_T 9[cQ@1RXSƈKSo> `" ϝϢbMNeW1 m!khIׯf$D{B )Z kXE! 3n;;YlFĎ[ ̼{ 2 ]2, ¢H,Gnqа,d)nt},xCD|CrglP\XZP\ed(^*xrbT sGhOBe/F]syYX=j%{裍< rWO<67lQQYs(?V2o'vZhSաZ˚֮V/Qߴ\xo"σƼ+/b0i D t:A\'#S BNJ+b4ov>c{,' DSK6r M}˂KK64e :vn% V򢡗ڥx\[qS8aG\:-%N,:KvɠnGSH 'z'\! 82&H4H*;59PmQy`jTՒ= ؖm˞53a%u՜!/fu0FuȘg:} ޹_tz R5ZO r'+ 5zE׊8.P%gj/RBhDwc k &vٕ1+q%[cT_Q MvTc86'8v;l]n55mij,//-~ ٷ~8{\RQTn(.OIIA;C~r] 鍆ﭔO ,2p1ѥˁ ɖ`&"WPfr59>ufZ&0`@ H  .Fi&vN<6fglE0S(zd orM tpT&Y}x#lwCNv. p0l?NP'#KD9<)tsvN57<  z}ف8V CHugj>ڹFS!8N>Ҳ;s }8u$%}pӆ[ "ezě۲{ U[t -`?~+ C1tTJrrTe#ǁP7ڬ| ;&)rB[XA IR!x,O~Bz|@yHI4l5DQ}7qLJ{dDcP`JMJxDت?~V5eq*jErA1hz2vRr2j2:9PXe!D~ (?;mG6 քnN4=EE y=(5u…lzPeǢ~!*Qt,gW1!f}!Wa&i YKsG5jDJwmuКU/^:|E?+%wγקL{f%-yzѡ[GgkT) Z@bx0YH0}bLy5Â.>KB).BH$ҨCB|aMr8Cio7!G6ݰz{ HEop**6,g=2z k_߾~W RG勳j5˾W}Ќ aC'P>H;CP $Vj6d1o Ɨo}42 T @Jw`MwcY>?R%N"/z3D?BoSg b`G$}0{TX@k {kpkk_ uԩ,2kIf01>^H%qb0R@ƪKsE&joۆb_ӇyV~{1vL[yk^Pki^P]|-7ک MatPZd=y[?|bO"+fhY # [,a$Թj:ΨD5;!=}d}s؂b*[.uֽ vxGb}Y|WE0%0U "zA &z 'L7QC3VNnVBvm'N~\qnG,>͢ث(_ÜKJYY:aNfXswWz)C8 acG ƖM" /h+6( `[ <6ҪK)="q*",[`g#'EgE^RVݳ޲\]~W5d9S"58R2Q1_hbF_O"5F¥b YbRd2(HE1FolF,OdW˳=]L}Om~UO~\:|Ǘǔwߣ^U6dm_Um,u- }.}6Lb翷%Z_!/{}F"?ߓ  |_;biU+;hau4-<,$Muk@mtEI&OQLHxl(x<"3rݰlRqR :Aߨr'X?TK-تyh[:'gl;3CnҔ IEN?>qfpޥ#}9+I ^+`)q%{KwwTaFZҰkft=sE^[[!gF8|PZdx`R}od #Eٞ8wqiqO8jCjxv̀IO-Y8EgBU Nx@gJ"]#"(TTF'4m&xvK&ye]z6qpM ̓kwY5 l5#,iO֪֢}&~J+%%Ԧ#LepMSYRkZOi1--Z_w5`_OrPTֳ Gf7e`GySBR;~vvXy60Ԛ:fR-^on贕ٖ>r˸MXb#l7`jg^;tAKv]`׎\60kMkfߴtfp,Z8ɳ_'+nKť#.;E)B ?%e2ݑgp@Q11r(TKQz4[E0;pjd){-D4,t<0/ XZ"Y \pݒsYx%3{,u>2/_ojfT,<~bJ͜ν{42=3QKgB#4NdM"ˍЗ]K0U_o١GX.zg[>kRQR%gcU;yFg,Ŗt`|yFh`2~͟h1M{f?`fѽ^}p/M m2oASV&oVg"B#.F#GY^:5xFpނa*5b|wާG,u'[ZOZvul<*XŲ-}ν@pYO![rp) |JLt- ^Х$#GU og u0`8DÈ]t(c`!hpVx!컦j.J)-&.`(5liOt7$M)ߔ&MGwC뎫S^4;+!ҞD""1*HQk,c1c! H$j4ŵ&fSͺ٬s q>9s朩g ѾW)x2\bu:쪻cS.,HBY󆹭B>ړzOw|WiPH`2Fl2,)^!! UkޞՐ1 :#Fdi#h[DZK׫zT䪏\G8cZ(YiZCD5yìO~!ږCvxx^+o˧c[ACEOٽ= -BԆ 2Yk1>N'񸛊oD۰nFSbJuȴNUӦ[ MJV'ܮ' xyOu" eUOuptђs@e֊񩝫<7jz= Rӹ?icl$&`f659y`ȪUIU~ou(': Ytk6_ڮGG8bvjڈZ?j_4.[@7Uipuf ޅ#og[íh1 oiM-))kZe%k,]fw|3hQ)#ͽ3q{N}F}w蘶8JƢTm(⃔Ѷk[_صm[N>[E撒(KldxsVO{dVϠ]}Wy[\:u ͗fR״6a aNņӣv"$CiWjtY[Q71R*?+Rۛ1,Ɯ:杩#qIIjJkϫ;$4|TD¬QX%kvٛ܇%% O9/Qƻ-|z10QT6BqE2qG3-0QS2 1Fi_[ gv{<~?>5S0)[L-LTlcZqNr_ZqĮ?d>W:B -(|y!YgZz٥*9ϧ5_7 n\C.Bj 1],:uXf?K.^NZsU~]BQ'P,p 7WJUX+RT{bG1SE'JՏ A$-h3mBcJ>&`~ȿ;%Gh#dŧX3\ڬ"0^yܟ;i}/G@.+hsj[ʇ_i刚Mpeڜ6ЀO1|07Z>p{zX(2]m瓨Ȍ0^k1Z{D;P8 q6߮10Ň_qUqp[E9koGXʀ`q ǺtPtPKDׯ.Ewf`s~Ԛ#um~5 ]Ǡ`󐈾;1M m%+O؆KyyH~7=cTKCJ:o)_1rd_5ya" h7ڡ]08{k {^3,Eݖ6Ev\1ly.Yԍ"Ua1,D!:ZŮ[j'4cob %oj**>WmDt*ީgy뭉Ry)xM1ŎuE'=`wW\v`TwF^ؾUu>*ffK3|0h a;={_֍ '+AfaXz _2 - ǵ#ĕ {eb.\/K\g,ut?SDŽ Rs { [ӳCa =t_:q ;=4k9. f P1ck,1)mŒI]7./ڿ$x1C[|נrkw잂GgpbJ1RV>;VW$aN, И), Gi %~e"DZue;)ut|Q&Xe8n|PF"™ /ͪbCLR݅F(9ŶDƔU~SIJ㋚,Y֜%zs]A$a DqJ^ aׇ.:X 4PH-6kxX_ڀ?ݹߜEyى{ǖ]\|jXÚVĢ@cskt 7&X|UA$6b%ܫ*`,GvO9*NOwͣ3PK$UaI& N0A1)B4## p%y8+[9jg2(_CŲ\eιXz$J߃ 讧b:5o޺l;Ҹ Gٺj+*fӝӑ!Vuii:znFЮBB41=(jOzalpc nh{l 5E=a[CmZ` lȯ?NgJ~D7 d}DƶP2*>9Bӆ5zx^{^eolѶ: w ^uėfӚήO }5~.ޗWN5צ+NdC s±<>^BZ: 1P1/oXf GEVy S7}EuH|ҤwT }$J ow%}pg5濜J&'{-'i='>Egᯫз;߹i甏Y:E63[8ʌ.􉿶NYk%H)Vn!c7y:*qԶ$ݱ፿ z௟>[> ܞyx_?mm;yOMA]De}2NG|JFmy<&qomt`8-ǖ;w#m.feW:C|.puw' 'b]s궐Cz?')n6e!5Tl9&<=>[N.u 9RWBRym$9;|usI .ۼJ DD:,b痺H$(ґٸWė&tW~6 RB+:'^֐^m 2ʔD.ANuH។B YJ^ij.1]݋O8u03윏xlׄ4]үi[aBFI_$ eIPB|EVVQTOMȌ( Q&W;+'S.t/y[Z-HzrI=>W rte8܅4RW̅mhq# }-u>#!~!rte6nM0KR|@!< X:_E]JFP2x e  n2b|=Zv4Y ؙ1aqBtI}E΃@l[ |J< 9MI~m.πhse86$ >)4d8p%./ă'8'+!eȮ W]= zϣP2Ez0~c8!yd&2ox~d2ڹ(cx!ƠѶdh\;&ѧob p}1߅6S%:ۏ~Fw\Šs cqe8J STOu _?XwXTzp`g0AU5Phn}2,.I֢}cY$q~;Wo?`^Z;>rtB?g KY]/]nĿл u1'Ǻgvųʳkd9w. m3i; M~~'?LT|nr{_ݡ.pov)1uXWBu-ngtA111/xC^Cz]ݾ>a},볧﴾br_ZU?ʀd P:`ɀ { 4 40uഁ 6{PA}YlЭAw3xA!qSB B LsL+LMLL5L.̩iB<*fEK%ݒmeYdYkcXc#i,kuuuuzzAXC؅ka߅ ko3|ppG)sWo ~ &b mٶYEc5wf{ܾ̾Ӿ^e?a?y06.\o"ltTQ)QQQ?E/3ztUџEߊ}>C 6tДCߋIIɎ(fm11cN\C̽adװaEK:lڰc{Ş7%#S|xK|L%K¸e $LNܟcf#αqሁ##F1eDy#V:bψ#G %&'-JjH0d]WrvraFf,gQ{GU:>Ԩn!% 1:i1lØ.jdz/xqN_>N &|V$iO2Lz^zyIANZ=iM:Q}sON|hrwt<9ɋS"M975duSN8[Sq2eM$3=Lָ-7O1{E770wY3 3Em9sVQWЩgA+f.)UaԒN% ̪3{ҠҁJזn.],|`yX?W3̟<ʂ ~|%>K.,}z֥eSaˇ/OY~aEի %Y&u͝֎[nwo赡7.ɦM7m>%uk֤[lKִгaϞaڱ^sڵ!/8^B/h{R^_^o+ѯ4{Ly-fMgthoW>xs!>q8pWxxr$Ȭ#=#UiUUVUm]uxթU7~W C^զտ԰}GGՒZGojU{mO8Nnл0XGW?}dɱ'';Y~r 'w䉓gO~v;'|ԅԅ K\WX7nUujݨSw^WSߥ>>~x}J}z}vEkﯯ?W66Lnk(oXհaoCeS n4p4z56j45F7&56Nk,l׸qsƃu4~sc)SzSSN-:TթΜs:tӻO_u֟ot2&O>IX32,qC\ on+2_ 3HV0n֡>$z<| $|ΒbђOq- 9X•x&BI ͥSyH "ऎ 2_Bd0 9_ܓ̅HkU+ 7f)rVq .yi92j2 "Q*cYQbya%J*x5&ȩ9(mYpa=`9dŀn 0~n7[|/g^A:;bϺ3wŞSw`o8j}!`;6*iEz ݑCI FX$|#8I yF݌%ëx'u OIX[L}{&eHSd&z"i?Ni o酨ِD!%9<|Vq2,Eh;ԍSIq <$}()~ԟP/+vhghwD'N>/ (v@:D`GL-8GS/FQ4a0g5Nci p'h2IG]j:xJ'4:_I~q'  ST}ϤYt:\:|Z@gBZDɻ΢i)~ZN+Gt!]OKR.+J\G " r"Wɗt5,uinЍtLЭtN;st'}̓/ѽeBWNtN7h%}D#Vzҷ1,?N@ߡ=zfPfbff0x܊0;dCXfCY ƆXYKd6b_5h6eqlds<>f% }>gٟv]c v}S`Wk }Ǿg?Gv~fgw?=O /v=`&63''r9q=7p#w܃{r/ކ-܏ގx ;μ ʻ<=y0f߽yޗ~?A|0&nx <۸G!S't> k e#oSIRK" @֐7rO{$τϫ,>gg<3y!/ży)x9s\>a<ylŘ5l'ϒ?|!_%|)_Ɨ|%_şO|ofov,;|/=%W~*6q ^gT~18d5I8V %4eN/-)6fU3'ǐclɌ✙LzO/^Q[3szK#>k59Pڬ’}yIqIYҜ2%[8+/S ggz%*wdry? 5(_xjdB=PWpr3#2т%]8S DQfeB[3cltKχ(|>.D?>FQ&Oͬ0J*ؼ|klYEA[++U @A P^U,Ns8?N⏓$8?N⏓$8?N⏓$8?^⏗e%x?^⏗%x_%x?^⏗%x?AO$?AO$?0IA AR )H$H %DIA QR()Hx%%D?QO%D!;$~CwH!;$~CwHIcLb6nRT&InRT&luM*p?ܤ7M*poY7+͉*}}sUya sU0Q*}k>3'(S5qOxĕ*T P7R^@JyJzU7'(įj<K#.įj<+6'(įj<K#.įj<KƛUTPW5q_x%?A_w<';U}Wq_w%~UU}G\WqY~UWqY~U͉a*J+ڎĮj;*vGbRP)U@T**R pPP*R*IR@GnҜlnL69FVaҲlQ002L̋sMOXLPlKA`CW_iS. ĊE5\e٢4A379eX`+vJdN<<29WJX,o(lEӠR-+jTJHTcCmtɊAu-k8"&Ω*")WdemIMV׋D;Y[QCHڈEe ,bn"&>"W#f[X>40GYkIԳUطUT`qg]SXId)WMU8V[x-JS)yZB"cڊB2iu^q1@/-u%dA6!єx7YE9%K "|)1TJq,()(W2ijZ=fhR&֮EOjp:FUMtja@z*I!lR*À J܂!:2=GXQF dD&#k>Eǻf!Gdق%gd'}7@ed*kw??yo^ݛoշ?obsxdʪz lo?go~/m yO8>3T7g]97nwaۯv1nY36U[qTMm[~vUK6U{oI6uzhwCgUgu9qk;zN:kw6W3{?#<_YG2Gx0IjFSMTb\nymjʋ /Y+=9T;. ܾۙ{TUގ'M]M"2_ $@>R"s7 5P46DYlXiuY{Pc]d],g6.V@ @H=R9BkyE #jھi~* zE%K\>] >rje5 +-Th;>q)tn>lSą:ߡj];7L#o1kHY{֬[Im_ݮ;b,-7fئo@ 1]a2:il ^:n+0 {6DKh:|/@aLuYU-{W:|Qрe+p:ig}3cWP^PlBY]"Ya+,bI1"U[A[-av >k4vsY\?BoPYAPmˌVx(#_sD,) X`Y.z"E+|V jٰ*gGf"pAw,=$W8=GX$(ئ*4Y097PG` yW[,Ut+<AbӷVWmh*̈́gHoDzuȣZ|JC`׭W9;.7<bOvLEh3i2 jT<7#p -\IQf ^49TX- ?wGB;)#>Y rE0[m加TƣBsԌHґ kI#-tjtܝԷ'1Ky⭙b B6"]y0CG5DR 3jM1ygR̎ Kai!9CܫVj B?pXDlh'3yRBfv W9}Cu<ח^FS(/vj5d*}\81q%uZHE Q"@Ll!!Nj7^y {؏I*E7LF{'א0:huOߟAp a(("Ksu ),]zلvqJBaܖyf<-:/g}[ÝX!!Kzb9֜2({49䳎mT㴴zHk;pk={ؾ3 \1ߺe\ 3$(C|!#5ReMUoN) aYP%ެg÷l#Sւ;Wal|FI,Ҳ]p>KaW70n\q\i'tV (Хu\D'YqGQ9TqzNk{91YzL΅St L8j7N8&kXۡnx `Twx AY'RD%x䃶Z@#Zp([0cj/)3ZbBL㐎P5[u3P7L4 ]qY /t`zkPX~}1YavFfcb}RMW;4v*0C }S&L1([P,jteZxfU+pp1}8w-0T?hT#c| Q*𮍆Rź2VB *s1tFx;sdVezdAfrܐ aAQlQCnh/'Z;O3in:_m_;:D 8vXƧV(:$}/F 35WOq{w[OQ?{&i0kb郞k @Sr2l(DA4iPa(ʢ# #p.bVdhE EߔH([_ qri A3%3F9#_l ?tAgGx' 5;<|6纭P O68qF۸-*'=,^7.@2zB:OL#%y0?3WTxᗟz" Ilx^ɝ|%ņpX <]#]"P;C5s&ZLdTN4DuXd>BbrbYQyh@@N'Ǒ!2\YoԷop.9.!0ryRaLQ!Dj:ze=Wb %6(sȣY̛hHD|\<9475hۑYngP"wK0a,0U1|6h-0L"dVx4J<_d &.y@nN *( {eLCbtȦ]_ L(! $vZB8 8o6)̈!/!/# Tf"0p2@iĚ ܦ9BsqN5۴2o _ ,1~- yCe=!~|LPkTFzf%PVW[04!aA4$WA(DH'7;;$H"OO&7dM0ZדkEq}D,t q#yF?]cD 8N/G/R=V7#VVJy1"wk|D&P4uޑTTQ5zC:ױxH6ȦMcrո y)CpjeSIȋ߭%~1Tx,_{Q9DyE>C1W9B_EDZz\dA`xDiJ2CodIpȎBv< _w70F~]*?{v넿(^T8+Pxš|K0W!RQMBzr[ 9ߡPC;2@ kD\)I~bR,/ ^9UW 3<:S]5#|T.A!R 6*?L_XN!tD`cIҧ ҭ$V'5x'G&NS\b3Ŝ:Xb&i@-bt5q F )}ax#Vm2q9ֈu41QΧE1zHhv2EyLÀPOdƛR w$ϖI`8@:W#0cVCQ/aZ]JSIkKe:E"DBk.y  ZuQ;:śfJ)dEʐ]ܦ$TvJ &SVX9"4\<]:chP9p"{9\=afxԢ#{FnbLnȚW[Rp"I$|y`IG&+:{.M Y@:Xmؗ#OpRc{ ,^yvZEBXWpYk~2KP"]l9}]eZF)e5\Z;;k2,1f/憈DzO= 6Ӈ&DNN8s1n>@+?Cd0t4CW=\`ہmڊ}W^i_1wk T)OSs#=hAD35gdWI H:#2:ԥx+%xb`CJJÈi6*Uh+21Ʌ )IIj"*&@*jɊ nu2JI`䝵:!hܟJEz'>jAC, C@`;M&Ko>Y]$IH[ hFPՓ7F7 -ojcJP$.+/%lAnt8p6$XAX qjKPw'#qFwˌ-1'DC_VV44VGI{2v܇YZtJ I  btWGTb.{Q6/4%VbЪ?o<3^'Y^tyYY8<5HH-[\7M-xb5l].{)u2p5KV(NsѸ"$g7WMaͩ @y]^"+TwL t?8xnJOk U,mD(倜qCTf HG'yBא =o0 Oy*F.2=P) #@xZ106cYu}|!YJL~HP~xC&2T93.|B!'ap2THnHX,.CyAD ̹bc#rx% 3IAP=E!$_aAsj®2ZM|f']WȰ'a\@oRHimI@a.z=,?=F{,zKe\Pn=W G~ƻR:'γ\|+K $Ё,pp w~Potfaӷɘ}Gأe-CWp^3- |\\1`F~YDx ao KJWXF R+[09W PFp͐8:bnNX(J0֖&^(^ݔj҅R)]j4؅]dMwJk& mrfp c= l+6A(>^<+NCݒ!y:gdaRìwGs5 4g   fJEH`1(-~`1=#DL 6ACEԒJ6 b<,6l xēӜ/CW <;o }h;Mg b1#|mB$EN 9G*_ZLgg OwG3/\+gCVAH{ŶٚAW cXlbn6 )ͣn##QS~ˑL "Ң8 c]4X$MR!|.fhwmfIWa8Bv8yd NlX0a\)S A!t%=K$4hLa2B>͠FpűۛiW;׊95"/! 0\3BHMe#1q;$>}5U'}ZDK[C7#u5. E%N˻%xjV FI<8kI3`]BŹ <t]%^CdmTZ k@ߌ 삳~\^EN:a9QLK?'2Х /Bt=*P ?[N)stƍ&2IK} 1 9lgs '(%I&T99IcH1N:PȋK9Bte^ÇvdZzp B 9U~s?~*ś.dM o ʖIgP˵)X,wHAaW%_!Ŀxn1i;$--e9B"ԱkB>_CbƿKh,]7k ?: vC{UcFQ,,4V9\c'!Xκ!(0i{f*T?+]xPBΫȾRxVzU߿zb=\]ż!b$W5o08:2`ɥF othIhaƨU۪w4<2;>T963bjOLȒXA1N,qj1dPurEUf .*Mu}w+*}Ug7uNmԯz\@GˬNg2^VY3,@1ǀ.ILOʡp1ZmC1:PO/%PV? X ^,bT @+,%ޏV|$-77GpteT*K-dW AS^⿌!X+'zl P *YxSrN!]% aŷI)`ӋHFY0d;@;$L7J]`9f2`T XtsuXF*-ABPC p#}(96a+#>gs 'W!*`+sfT,ͱŰZpz0 CiZShqNr4/.o1yQ7jcsin%C\C$Y4.ICɵ\H!M3@' Z>Db0J딠j{o-3gqYBG%\&U]E4Ⱥ f$(cTд E4֚kx`B#g:)Q9~BZA@\ao* c}6[lW˨A#Jq:p̽ڥ! 3F i,lؑ)RbLM1̨lREmdA0L%Fl2\Й+8MV-?]2 E\K doŃY O$UXi\W^`>R&fseI 㻁BUe{Z#ªY4hS^ U VKv+ƀR)&8nJ8P]GaF􌑚g9WɏZ /T77K Cԣ `PL^DJԤ%-"6s=!αGy @q GoĢI3gAQZ"~Uu9F`ffaͪG6Nioʼn%y.ArIRA%w!qR8r휙@ h2( y'+h3!YJo9&`I^csRXGaa^G)(ODqeSmA61YXڊi!l{s@ZFL](b~޶ij& iޏ4*„.%B_4|0-I5׹1WHF SP/tb<cC#կu`X[">WnG.`ԍ!%4Jlɑ;vfQJϠz;Jqp ԑD1KOZKSy1oYhA454$_(Ypnpa_R#H`Q ~nzVW89:)qջRmUsJ|292.1-FQ\qrp1Hf!5af'c xWSeޅx(r@AbU>yNڨIr6hgsK0}FeY&ӂalgPThB0YSol8^ωԙtu/7ʺ; ]QȔ`i}!#IēɠҬ-~(Iן_K0Mb%#E$`-v$ Đ=@{Y43i-4Aŗ:5I%RfP $-gby Q :sa24PUy!5'L :ǡgKy,T]]K2rf\m2*F8ž $'L%U V@jn=@kD)B@q*=wCX82e~Ɩbs ^*y*:D'I6{Snp17jg1A.qwú}iݓ{NDaR1CT`[F.BX5lN\ #aBǫ!ysX? ) b%YDH;$%WH̟1cq3\'3N-rKE #Vɹ#\QkX95Jg.|OːNqFr˒]w|k \ }FtNG3F˕n^ɝN^ { 󾸥aKYtNUߑunG5a.DJzL#b5Y,,n\7qebuza0ZCp%C57z^$M8ARJ\ ^AҾ"l%j5peu,0}ټ2O 5M۽xK.ʏ '( (R \ >ꯚ XQӓ j0ẍ́{Lh~:1djd$e F1nGP;Sl›jvz1p/f)~F)^ clLa=ylpu/g>U}R[R./֗&ه XPJ|]8 JBת_wNіѻh'sh=js^F h>M`,|[ `O}`бaZ*OQ)Τu;pwI0Yƈ[>rl>)AnOݪz |CX.~g8tЛp>h>Jzs^!>05֧E6"ž~x^1=˄:][=>v\-|^Vx0 μ-'͇Y0Tj8F,07){8BƽֹXs ({SUCͦ!3C䀒*M݂t4StiJO<1܅&[}qP%>SJ'+L%%Hv'E5ɒgQݸ] XdH~B[#Χ(Y {H% p vzyݪ}VE__5-:u-ˎ Oiڪp_Vz h sU!; (1R!g2d41s8>k/ts69>\PCn BFލZfn\Z}ؿ}ٱ~no)eg':4d)"-5ȭ` uM0J%Mc!=HLUK no9ט&B =ƈ&%U(}^Oܳkqq$mfL|zn2o b] mHACoc #,@&lAB5u׊W6i0d: "dG[Ӏ v0h*\9LG J wz% K>U-/{1Jk-?S(A,!d}SsAYOUf g 7ޑT,;e'Y^SM[@07˘ ܑQZLkbD56cDzxLbfcaGN,O6},taQP2UFUDe =+IKwiٛJO fugO.I{$NY+lپX:6,f=TV`Z`$]9cϦ&'M u kߟH.4cǭ:ӹ.a H򵜹JŸ)c'K:Eb!PK%A\CqWPϭa:igb8Y7)ʥi/6n3+ٙ\O޴Q;cR)A u>~ޛXt]!-6<@޳ -\p[ ޼ˍW fu>V߲"uܼikg"r &QbMy>If?oY/N/ssTO&"2Yƞ%/s/{m9:Pw[+}xE-1%VR,?H\>RO8x鰬;%H4гzen@2W%?qnʄtw?=Jo;0Fw!:<52bO+*W]-nMO=y7^'3HޞLєtzƞ!9rݚXl]D2P'?M;jYwDitq[]曵d%޶lg9hvh誋>{Ӛy&@K QÍ"SUJ^})8-t2O(Єм˞}X"9Tu)L)մRYZ8.uH1Q܇vK$I E k&0G1*+̘l}!(D@]D~N 2;Q|~?%3Ѯn`s$&9}#dn3JC!BW/r[㖊p 0n Ttudf0`Cȃ?};O9w%NBhXF;E1 DXP9Um1?n lOw6l4|w1y$X U_0ici2&䖵q+)Fv?jO0mR~٤QaEͬ t>V6hiYOC {_*1?dg:E'P?4jthT^Xif`D@+'XDcqs'QXl{F2vI "$vI Ï;QsAw d PX?B׸. F\n4*ԙxhZF>v A3O}5cJNzTFǪG]iWk/P?/z2]26"%X6 , 3ٓ. ّ?Pe4*] xwpJVĒt0(04b~7W_yHa#'ŝN/5%h zgE6j;.шw+HG{Aq^Uz U(uK;)*x laN- 8לJk7-x)C"nný/ YTJ6{Bܑkmw-huU >6PuM:L%P-p Z <~l)8e}"״Z@/{ލH*!O5aKMkp /߃JISō?&X-!^W 0}Ǜ%Z 2_8]-&5T}bé/yN_O0nZR,-z*NF4BĕDj7A)W턐jrc rˏ]oT SB*{Z7(pmR:FQ@= &vy6a]O BfBY㩪.n3jHv w't;R>E?9U;!M0nsw=ꕶ [ ,A0RϮSWMO[~;rT-$Eb9h 0eN1o0Fi\> IJ#\rR,6ΰ RKP$Oc /V@Lx69ek w mǼ `O؂DZlJMAb[ N΃. B@< Y $JSQs@$i2 zxrځ|[6QeHM|y28|ĶDnfDW$%M̤ek@p z[mLCV퇘$oHb]-kq XڬFC["mf$_8rL+&Uzn`%Iɠb+ c6-6A+~spɊrf8ԁ dF^5oB3on=C@UM7~%s%g\͘Qn{a膤ŃOiKuJ-woMmv;V"y1t"xىM1d"uW%Qz%֟ºE-P{L=?^w87;xd[<tExo@Q#RLn1gTFi^CiLu3JCiQEO 5 γ2MI1P¦=skFPGX6軍[[_rbt;w3ƉuNV%G]ɾtA=5`5$Fx"kYӡ:"`1Up~bJDYu#MZ j̥!*ځX}(.qaT,;qe3]F\čM5Qr{ȅS 7_L|<5˜׸v! QfE_-ncX|k E 0K# ;.wG\.}K6&8ohS|Jj{@w۬|\KqkTf;{&6 3O8~ύj}0V% 3siϱ]8C??)֙{COn\4څgyv0&2Uʤ@D֩*23LR1L¿wPCi4Y1W{q{&*bi4 G;jje;h?C#l`[E3 ǧ!4ФY'=lxPEe9RSsdRkLCӖjL4?Z ;Xi8\ ?@ . +o(Pfk4:`Eh} ;$L(^mB/d'7YZQ;=5ٖ"u KFn_>4fbԡM5NxC [{0baԪa<-[~!Z^6(YC<&z[[u[oZ{eKM\H[EKh_>'o<ޒ[MVրd aB -s Bv."( `iv%zSߎ^ 1㳷Kw}U   =%c 66r Pwy԰T1|3r..q~Gu w ~8EDG2춵"!f5d-.Pyᗹ_Kp-ԛD]Y[Gϑ5 l9 moV/ͺX t/B•#7,3g' u@(Gu()rC 6[ZX7%\z}q|(1A 7!`ahu;#R1kX )ՄQ{[ dŊ@_eW@(7j#x14%chiί;L*͹.x1%4!B<2-t2}5O[5+Mb/b-.>('ޮ$g0 C|>yx;\GjŽ&!"?Jʚ9%>Eċyvrx8Fܶ +`,E.8\`}J63uV YxnlN5v7 ݶ.IWpj}h$A2uܝhІERv%P,*=\Zn"p'cKCؿA,08'Wr]ٟLJ_ me0eg>b'J  IV2 8 V+^Dnxn۳`t.n'+A|lcD[ܯE`E<gա-ZNotvDJDjJJc+t탰8uLp J9i (DWpvr ^ ™`!P||aC#) i]S-Qk)ڄ10[\ρɨ_kv"nqkn_4N?8k=gDϪD,V]ԩN&6Hi1z s/9,e|Di/Y윑UbE떺øɈ ]c2My0gJP}T93_7\H#C'G<\hu;JI;o8c5A_FvyvCc۩:!pĚ3ڳAOqbD&^tQlb88Zْ7qO؂83@9>eO=; 1 GTmC]xMJRj0qrNVx:7ʠ/Ż!#ĖLº,4%gn/O6.plW 26B` ƀihO'$tPh8kocg|q(V"[(/BLh(hq' nAǬ1$!bI 8o.CX?U߬l>4֦#xQ>ϙ}ty)%nPF|h^-RCtB:ijuayLuKl /)q.٦d<:@&!ady6WZ̻Öpvc8׶ Xk0X<[Q1>ѷ4@Ÿ'MOAc9Fmqi >߲hyt&bnzVT9,K.pWXj8p !o,ѧy}%䖢ݫń=ф-0]?Qg`WX,(Af4]A:% 殑P8V2KC}Gαɓ2-ENEytnq(x^}Z3 {DBml3A$BAMOoZVMMu@yy9miH1V2H۷g(} z Xy mr= %'ME}iŘ B|S`#-c4+ưX=LĐL;Jvz-΄ځ֣lA("jYUzM\sIyꭱ9凌\^bO@niiO"Hjv/'x9|t57:׃Ĵf*p2A=nA% VEJ|F__PvҋM%Z׸} !(@ VGT㰪a80vꮖDjJ>Spt㥷K|{isǖɢ $2VF46˄h/C@݃\n!*HKqۜ#;-'2jB%U@€`e&C<`^ݹo ]&N5]TR󣛬\}K&] S6Pw[E~a׿R[FWD^*)tcVF/4M _=K MaS* $~X u~)QP>}.z%%3X4[ KDxNأMTۊw@COK)z'qHgl%akX`=} f& X=׉`NMn5pYR{ vK3IW^Faッr2肋.Z]:.r*- ?9&MHq:z}Z 1&*M2t# Fzq$Cm)mqfFD8T*tj^-*c@m,ݼEG68˦Xi8t!4C<‘e\5߮l6[ _NgV̫Pa7Qw7@8F{l H7 lޚ]8dҳUaYZ-@|ngJRk{g /wْ8j1#EXA7Ju|nt;5=߻׈u/D%j*O]Չ̵t3MH1g2qa\{d'?1Tqudk#]=JY%WKAlx-l!ǺH[,•|DWA򕺣vNOàC:vXʏ 2|>܋COz}\ 2/[<}.ĜHȒ"<(Ð*X.} صҝW5jT:NJf!D" 8,pC?#96ts+KhMGfo$xѩ#ڤU߹d?3$N3O}3 4n栱Tc $$E|IuWJ Y]H%cvGx: WXp=Bpg wK'2ɻO E4mD e碌7$˪L=*[.9[o3!] HmLA>_TB/mJgdߧf,)Q;w/'($Dq=?#Usa'Q W4QnqO,_P"߾ sDY1?r\*AۑH  F'TzlCHqo-/ԕ%}vA{𖉫vN=K 9K3yw@DMCDgeC^h58viXA񟾌,OAj~jmXM׵7Tظd&1D̤%M ( *@@* <B0cVk1 !RJW<.NI&( Qa#8H44ulr6XWOnZ4\ӃZ<*pEZ !VL ` 놹;Psp*1 ϙ#|k_B47oGcy1esP,K}(HïDm )~(p*0^ԩEH)Y5 asӄ 1Ɯ+nY#\dDЫ$"&)oՓwC- !.|*BxtqLǝ,YB0D= h44zP"cj AG-:Tw :4uxSQM=_LC0~ H ݓLA0ċdzWߝ/Ϛ-KhTkw#eivXES#L0Æw[>'){)^ ׵(O61?̦ P,qSg/7~6jXp^i9]'p z- ʛwgR\^ע@N9n2S^I<귋zL@W 8 /} 8A/h3nxRZ> w*|r1!8ڸ&1^)ھw?8(N9:D4Qණ:7>xKbQ'A@%@Ep-5eRCK[ux֞)E25 JۀК҃ ]wنz PF)Dێݠ ~%A8p! )uAw4VQ!W!#$2$%7(<0ylXj %f f>,}ޒ,01A5v5s8kyXzjDo̧u^2z[ 41TNDJ9H3ƺD%-W>?.m4BeL`,7x*f_e^ hr ":f<§wU$,Mb|SRm%;bWF72.Ҧ>rиdǿ-b\:c-ghxAE UC|{/, d EI{=q ;ĊhHUDLh~SlSÍv) R1@dBv4N=T ͸l 9' 6:5Ÿ%m柎7qe.B}vKm{p6!S~ݠ@{LPLc~ 1 9ve$a%ed6 ?*n J78H@1&{UٌK,2^3X)dc"̙\)g0?4  ËAB|lo3.c*sDYY2GV>[gefӡ­NV"Dl^"hf4QBDa z?o0 ;S6E=llJ(f?Z;+ik-!MSh knbP#}^4 &<6֌"'@7saޓ*7[ҦP R[lIՓnԸ q^J1 V>qFZ_͘U'bIh2nfE:=Li/i?ɸ*eR~|vC[l.*B$`%ңW5٪XMJ٬nߝ8 znq/Qe,Yȑ-sCȂMPLҡ#iTlDZEŢ,RI b8/%ы62$H{d~OuQ㎛#f3jlոJi0PN wumZ8+!xnPd#@'=o5f<6-4 mx5z{<:fC23 !9dUԷc^{DG6'=-\_S gY=~֞nur311I:d=i6Lﵧ+m;tzb^[=dA?Kf7DJa&AoyÎ.{=0dB"Kʶ&,!5ol^YQ@;r"jE2X3]D iVb+dLE0 b$[%8Z N 7+a Ƞ<RC"s8!*In`pLpXC Wv[neN=Uh5̆U>`;1SXEmr %8w@-[tݡkૌm" N8jJHB/lơkIGU;OKͶ6k`3}z{mB˷-UZXxgK,mI@!ٳ(:é'KPeD$( ۙzjeL;Ic5\yK@T1X{+@p Dy8%=(-E h01nm+Ca.R`8-{ 0J$&HИɥo\ZX0H XՄ!KZd؏(ތekj|8`{68pW'HFi=L `b<)f*n[_*$ IHC^r&'MW 4EQGpLx #f}YiS  qi^b.c^.TYY-E- _kYt^xOγ$0n$Y=MaEJ6>Ao-mmτtܭ@PMhF=] X Uc}G =}j-2ZV# eKz⒘`4< ?"J"2 ۨP@saV5cx1:MR޵>O!$L~Z`3C'r6ɧdZ؞ql=s!OET;Ȋe"@4/` H  O@~t7foS _)hZBkA@LS9(4>Gj4 ԡQEJ:Z6uš!!IStnO;^^1sIh"gn͝/0x6xi>43Jrkخ$_禍9^-u2L.Hh1{SM+/q `}jmRQ )ʆ3p)p4!{P )tӅ.*DL'N~,[~C |M$ Py>"Z`!=%3 5I9D#謗p4PRR(Ǿ5@eĢ+ճ >\gE% t9b–8H0B5J颶* ˡ蒤)dT^Fqݧn'z?GCՅ@7>in j }C~rvȪrRQ4H]Q"AtB˜kRZ )eQ#KpxK󻚪mĿgygATg$B@kCB7H]@ukw t1Ypn =yh]K5&: pJG΢6+lѕ D h]t1m}dY^83-<N;C/h *M4K? X+3 iAHfu;oW@e @W3&>3Hh颵7饍<2 m~ ɉbp!HkPuy]LJH'JZ&ïFuEAS klǽi9h7HwVz7rNM ؏LhKX0FK a QZ-#,%r2y슕>Po["bmtx oX=u0H3ǥjD?Jf\#X2u;(u ]NH1h@Y_?7lŖv80{(qC Z&M0jM*A)5et`!(ɵJ"VH]5ŶKO&Ѭ)jUEb@y %MSb,6 K*5,m<&gɓEuvn kiy(SZ)$[l1EN `p h9a."è/ L˂11S 7cS 0B,!lZ fa=Dާq$m>cB$=X3/ ``,ޣ뎬(ٖdʖ`MvwUVfd|S.yUJO{ssGyccˇGbb*?n² 3$3-~;#a3%?` sPt ._l/v=M=y@mH)L3ߙ {ls&sBWvҲq}FsmKYU>/%unZ.2+7=KLΕEPS`q<9yC\ʥ韴~=k&뼥/^Y$O[D>hXrΣ1Sw)N/w'q]pE,(MTe:S5>+^k_JPBMU?eai˒})@oo!E9KqԽhBm˘v=J;aΟp|):猤༘HҤ먷'E9ET ^Cÿh]mɥkhJb9QVR)m_z)bSTy[=6"R槇mӲ7F1U"r_BrLx҄в&,=#3V"06MǸ0i;j+m7 L59֫־# :b"(kEG}GxN2 ,fnBXqpsI̩INJ&' [h =w˔-4 dJ߃ΫiSAG0leΖ~0ZY,ׯYy{rBx:c.p/~c֜f:=Xxfv@ ,,쑸(:m-OX}CL9} ax3Sf+O;oero{Y4YDZG߾tVz{( ܠ je'ClSuiRiKu ccr@Mu㚻{p[Yf-7h#bňR Eγ@ILS-rr!jpSt֩pà]߻ L2&S0j6 4wf" ʼn*~sePUv+q: K/@(97ػeԸ8Ts&V,kvPgF{!#Ʋ/,\Owp siq2l_H%mu/7LɿH֛ȻB2u2Qxojl(>uLsP ϱ|HO JJCyeDM<1Bc9a:͸*y1\1h)UЪF #:Hfp"L=ZGna+3lGȬ;~A|i8VZa>iiá~P!и4 <Z=Dsǽl"H%o&[*/7d])"j&g_vRGnl gJe>΂ÜրJax+0F[rQ2V`s<91ۥy0glIL1 X)k?jk=,񱌛 }0KÍuÁx̴o&iL/ϸA:ūBǡwqqSw>VF*zM8E&f)Rx;Lgԋ EC],dCbemPOH@d+[t& 1xpcIdK]]Go^cuW&-\2PvwDT(NMmEojkhjB^Z=$viB2w Y~DCYT&:}R3 ܧk tT$s2>F0/Oxt;뭂fw_˕v2))c}m(KCeM@T/=/s=_be11oR$f+KE`/"~;iF"l/H-a`AJ3I>8E#AIc)GoP<#1R1o)A1e^4h7<?;1 9Fuc %g(O+̇j,O37tPϱ!f87q&||9I-}E/k}~5eOv*ogQ޹\$IBa[9?Jv2̀[:ڃ iL>b`!)Tj)Oۖ9r~;V `9g8$ܡ˸Pa(p ?74ppJuM(|BȾj*tTq1'UВs>1 OIi>]買TONg86T^Yx ΐ sӄX$C$m֯d'&}B':ځ/o-e'ѯ҂:p"˙I︟W< c&[klfi\ G豏{B]cbMi;ɘMj~3~L$ e:&Lxl|lEymYxSXGD!ⰞEKd NǛZgxmzv nm ?Gܒ8U o^^C']8d։߇7{-sMT6뢽SeZ7]3*>sO>e%֊%[7 @AGvlfz+!Jizş4Zju؀K^lrT$k9/+B>E_TkCC3Y%Xgg9 u[PJJM^%bޏ*Q8QF~Wl3J;e ~-6\"Bv(PCKQ?mVIuС6Fs9Oʇ1 t\4>2kk:0[Qi-'؅T.CtR'| B:=αCy pq:#C-Lr8*q14a}vZb &dzC%jE!~ 1We=JBس0\'#˄2y~(䟼G.P*pDb_yx6HY㱢?{YN_?ڷ"?n}U}@z_n]CUbFb#F5KgI-F}F5M(ϹWEf|cWxc20m'є2h\cx7@pLLH%&,\4ZV@QE 5?0[o_2yD.Z׫L< QiI \{Ek߸ͺix>GT?h:h}}o`wm%lp^E$CvRǠ}P_h<̝G0j ΃t6͊4tH/1ϋu֥>(::J7L%I@eNIhU,&׋ dQjS?}%0zE}l.[iHNz:2Z>|z(ݟc^_6[\\p$Mbc 6 uhUӍh縥_?CxtyaS>[@DC~ b}yΞeC>+u4D,'1i0{EYi}uVrf?͙ujE EslFsQ2)!] 9cS|IVdMФ"{3 ݷtzi\rV!>M<6J=|fIC m]e*mrG>yy6x&:0O3wfjqg\~va׷Fz9Ѓ\/P{ց'>PhlKF0džlObDV˱RS><]؃qwVp`D6b2ΧL}ξ.j-فkSku]M &^4/,BK]mj']ғ<cVa /]t~̕}?M2nT:lylAu,];kls.g$C@-:Qt )]gZ&ϵ(5y(t~!IWSqF^i_pI):EQ*djh}㧦ۓOTEѫ?AzԌܪN/oȅۡgU>G}cɜsG 4VyMe[I3 NNcԍ3hx>0`vj4q0djpi?*.Jtk!mFqJpn#*ofr:1v  o]d`o5y]cxcW2|0DfyN306c,xK=)z&,'*c*Dt*cfnCSUfp"9\^7sɣz֙3'sFjѤdb{1@c")Cf_7&Nឍ|kخ0+5˜VnC`tR=-|J9粳val5=7Dqx<>CdF1Bc嚇52dzuft4ULNa#A:wW-d2~|c?p`Ѓ ٥f̏%\ͯfD)7ܦ lTMBX:(PTak Qȷ{*2bLriN^?͞jQ: KKeg֨RoF?]6ؕR9]5fBټzP]N1~i0 { wΒ*}; _LE,Xovb嗔[-j+4=iT/$+ U%dξ9kk^J}{gdSSͫ<뀌8 ^ KR[@4tc; d<4FI @1j_VN1ӹ؉ndJ4t]0٣\A(d!DΩ .q'mHGHv9ZaSҙ 6[B{ܢS Y8G1U6ջC|'l=aw>V`N֔;h{:X#_U9A=s&lPpkA."k 8XB@P{hօy6svf.U6e vx:qƳO~e vܜ_5K-5[ORv؁wwOA N p3-{qV OM'm5sC>$e/N-nb6) =5*AkHћ r<6tXUb,˱[iK6bD; 3Ge7E:l*J%|Bśƒp1d>Uteb|cI--{ѴN+0w/vd+S1o7@ +2=V@ُij`4c!`¼ 4`yB~hcN6LA05Yb\ 뱲m YMH2+㞓EWIS[[e\lY>>6^b펢TEdFq5^Ƿ3"OyÒ Fw>p/D/M􋬥{B|alr OQY;-& 4q+&m9 P >pWyyŽgHTk'ewd֡"(1/)4ݸamG+]3EOj5Q"|nb9G'⊧"us}$۳8p0< 7rPNBKbHDL +iαO*fW"'_GOE(M_Oط';G9TmDWvw*4@Q$`OL'j[9s5/5Kr膮`jQ8-l77_IOa&Z |l$Kpyµcc70K2w3Kd>Qg 8%?#dz0)Љ:cl-n\b'+QKir E]py \t EeCX)<R8X6kfe5MO8=/iWt(->Lձ9?fY mftz t9P@MҘ *P'V⬭- o顩2Y,V >/2sKIDلT^vm|rNMʭLla5~ sKEAҕ=T!~?&|ݱ6!ʧ9(pJ\uB횔ۤ).O෥ e{@#ul׸#"i*ɵkX Jؖx&2c1/r`dS5,J-Ɔy *c䡄mRECs*q>4,Q>9|򗯧'>oqf{BlCE*/z̋ :iz+I Nޒ<ʩ}e(~sR1cZ!+PM$%clqQˌ#(*a}&)?zw:UzzDڛBni%ϔʊ%b`}3_Jvd`yßӲHP6d[L0s̏_Ś. |j4)A1K.X|d,hy*]~sa#6֨S{ץ o ^e΃ S ) lwvF,5!kXXhb26}Wpqeh',YP\edȪBib4%Dȉp"=rf8GBlm*GbQ&MeOڜ!\J ruФ|QqR.ln 'kR4Y77{+Ma"9_"7ɫ{P_`4SAd%[sy opiOF÷/9j &A ?YFb39=g'#}܉u\+p+z]rCߖ(3o%Կ=5?SysvB%S<ն{Ho_y?3*Tœv {tXL~_][dO/: 9s\-MVcMb+,ؿʛ!^ٛ s_0c偞 Nya <&ܰczL>& f0H~MBTL =Qs6$3 R^U3Rֹ^{@>P*Ng"!q!Ӓ FJ߽rn k"MK0 gꁑh.)nAp[.2w| `JgUǓ^z; ۬KQh⎸8^lc#eug"@ ?#,Z{5|x N;<R\.p4:I_2A,-a8~˳_V|PO-9p;t(!^KAegAVN"_Y0^!A" s`v8JW}K\{ʀ2G!n4,g1l/j{iyM., q7v%2C &h<]/ K!-1'hQΛkDJ|}p[uM~LUgM̫ol+iSܞ1Rtx,<\nƍ1xz)؋2qs8t-f7K0֗Iӭ1X]:a)[jD퐔NךD= 0KaBEO K56z@z(x#jVOydIŗ/ͱmAeON7)jKkuԨ?Ȱ&'(rº~~fER$ \bsN6+>\X/zUJm209|l{DqLMH]o.9y2e7"uGkߦhz51_ԕb/[&H͵S!Hʐ ( L۶-X>(B8#OV*Cf{ k7#"V2>HHpRq 7^>O~#ґ_6̸yYe;lDRi23`ҶꢞP!ËKy#} BP`4ixUsy %Ah퉩c ktNOμ0_uLL{xo7Ʌ媭ӜdXaOC (ZtCgS.iȟ3}^:'d4epV(DdC ^KG:el9=BQ)-ъ}"M 3]0yb\ZYl:]&2!ǟnJeؿ4N[ܻ{e@ExakJX` "ɀ4SbU]0YvƇ7H5O(a2i ylJZ @u+hnPU?JhZ:ykŝrX KhshtM!m %2Ik<D ](0Ke]<-_ZGw%6Yć]v$6)mFb.ҕl >q䚗*x/e=%}4#%֗H}<:[ C \uQC|fsXqT>W sy~> ?fjx<OuD j.]+=/A]>ȯMlÖ?{ۀ̭@%? 2ESR3S8kL/OX9,Wګ8zsA_R!&YE, %ZzAT7>wytujMa9]2nI-K!=2gŅїpfht>ǙY?m$cK"ijzÇ=9F^9Voi*,g69bMT]k^xj_8Z!/^/e}pߚ]=nMv\Stktl⧁x= zV=3ÈG&?0OqSy3&)ISq˝u]14 ^eCd4 3lLɀ*M'!HjuHc%߼:*?m`3zĝ`0~F0{|ZԺ9I\dE>so#*HEF3(ä U% %Tl]+S-\s,BYoz!C *"Q7hJ P#Xt0yJ|Y.z۰_EY]Q^QiϏ=u ?6?Y㪼z_$m݄jB,A6? ON͈CŒ#Mkt [0{$XL| nwc|RŘ")%ntY/`(Qa(vVj6|/v'[*ʯ27dYuk0ilV}xR1r[449#;Lmׂ&l/CH ?u|LYa%^&nwJt X&W~~z<-$ǩ=0>Ք?N66elSwY*?NxP O}';\I)ϵot0. ls40`Q8f߈ I(ըa쁓<϶ߜkH@k79M$MkYdԅ> G > /< 'qa)嬸rbWQ$S<f7#`o௎d$v;apc"TP*"fp D63m6YAXc8 WI8'ԺvuaߔP(]U.#_i䒪3hdj9rpt]yzB /üZumC)+U)5"Iϼ,v^ 0eeAH/ab8e RlCl)h y+1m; K, , Ky0Qt,?W&Me-S:I#,fcD17Q#Y[& ՙGlôC\ML'Jk5%q3k;g=mfr.%tQ M0ݗܥl`̒%?Vd!(0KkSg{*ЩkEE p*o`҆/5`,̭*bT6I!MSd5*O}kŜ;=2i#MJGI!];X ɧg z/FHu )2 Yo6B`lO?,V:m\l r Tv%+K˰3ӗ5m,'ۥ^jN3(It`#;SM2i8^d܀ş넯)lS#6a*10jY3fn~ v;krGfb]{ TSBXZWB@Ex/f}`mJҐd^xgRYg+:3z1u%CvO+a;fǕ7ٿ\yu)-!= pY>[$_po$c@7`yLx| na#Dr4Tm` гzĩ }NӷNJnc9L'{0ʍMTХwn{S j[-,sƝθs0"wPiPux$2XNk8TDx]y?)X7Lyքφ`1{3\y]ED ;tiah93;}XS:+QҊ1rR<"4ijD ŃucS9s6dQ,C3-QU2 Lo'j?Fr!7$reGLHxہ'l>WBLl J4/+|W#Rx=r>T<9CByL s5 ,J~WW_:Q7:㉗r+wB8u鷎VrG{ bIg!Hˏ;. Ӯg[IiB,fo{U?+DI61>>~x3}}y]yP9QMQ,rO?G@j5*{ѷ`}N9e7^ *5(u'-pN{wc{.Vm纅4+wWM_bq-d0HZ(8"ׯhZXN~v*)rB*9yã![mقlSL)ޘBC˒f** B4ݑVf%{o;.--QsOU搌Tn=a6s4^Q }uƴ6f?aS~"=zA14F,j[%wlh`/KwEƛMuGXmL-cSHiN9-:b#P =¸žT4jUq{7]*h:|ЉO5:~cZ212'V~ AY.f9]c_$n3)"߱`uPv`k1hˎ?wax,KaEީXz?RbIń‘'6mLmYpT;f>v0fR[[|[R~j]=@> %-dNp>M.LT~I{:2 b3D83/W.l[cG(侠x3?ox:ŤޖT=龎 vτm\MVzcڑsIB^},9s7l=ǑJ$H-5}"]QZ "iٲ>-wbeC\J΄%~Z% S2Z_KG&ƫn6+rQ27 LUHp!ΰnz><a5{"1U$îtĥ_v@^z(nSuabzgP8&jiS0ԏ&Pv _P.398mC!o6tE;UKd8ٌwZu!12,y͡u=tozt?ZZ(xcL4YK>ܘ&fۑ[uB8ߌ;I~\v&W7[*`%723 =<'ruML9mhՊp38|Pjd^!H!A9%Hӵ%?w7pjY>Hs8O׭€F2Q؜Q.u~نI1)AF"3}c5rg{M=k'~wYuVfz*5JA7䇅J#:nR|KiS⚢rw'atd5.t g;&JIP}RAy#_aUUc̍"X^$X.e8Vu5 w3RDCc>N-1~.ڜ|&T7Z(aky-$gO/b6tie0od!%itvƿpޜ+N7'r^6z]GN㤾26Awa9&u @tfh^yTwHajT1H;M%f3Uqxh!b YTdWOuPd˅d"6L[3HyS< "Xqvyg3'֛+rm'4] 0YtiƜ3C7%yfRL_QdKCM'.~e& O}X a;͠җ#Dt|1*d,3RdjN]P~cM-xqNk}0MvhL(cf 8u| AG6,l ZX)-;`ޫO^T4M:r UBեP2^Y#H'd)qA@@c 62* CI2̇qC l{5̶#wcKPFQ{N/C3+p4EܓhroWK7jDbE8il=ovh45_4c/RL HeU4LmaH^Y#/;pw ,n2q '#j+B#H>aHQ\1`%fC՟6)c/qpOOrPv_Aaa a1~lx5ͦ@ AU"BnĦ_E9aueC U=~e#LEX'h,3 AK3.]VezQ0&ٷ#яSLZ2<th`M%M#Fu|[Ӭ,PϬ%:te ݜ[/$ld 2?ڧжh B9u&kNyj`COr"+z+#sZےGZ6S$(΃41ȹ `3wy3c ao! \'(%)cݥ봃vL8/w勱g-s4_m TટE39b נ#2%q]KӜr [ 'x3<_^!τdj0^̛̳d+ꈙ\}~SߜA?%1kn ^yrs~pC&X#%&FZoaſ2\K=}H}P@V@iJԄ7i84y) e aTq#:eWG.,.PϑM-Rpŷq`-ɻxD[!YZ c&3hn(!9Q _|Nw}=+]O4|6x$,M5dliVD8 Ⱦ{t)^m8! ^]"&=T 2`Eyǭbgɯ"fYvۃoR<+2=)^yhD3P-21S-^-en+&>_yWn4zDfJ[J{"yX.*:{#,ˁ_j KRk*YWĥ&$KPBDx$K+@fiDvlR/-e\hTndzBvxdn!Q*{ d3,xcfbNh\<֮Le_0e5:ʵt\1sw^N^}zj%q/;<Ѐ &Fj2fгk9s3V$HFp<_3L:ipssS]pG^ŞZ4 2P_{T||E+IL8hxUDuEOYRW\mkJۙzh2,(/{iqs{@ tMHuΘ`p >J@1FIM2 KkS摎~qޡ[KM&Һ"ai`T[7YfDh)Rss/Jf?Vqz>ZϹr/C?rzWZpjW{yw pnC{y"1PFq QJcε8T;VMe4Ԧ*>Ȗ_:^_{<ճ;VnmVzj D2ȥ9_r{,=~(Tk^|s?!W 9cn/tNC mlREңiXݽlkE0_4ӗ6Q>lOA71Z=)؈XJU'9tFjg36Ȍ".5R%a`͚iM_܏"46thM,M&7>HY|~4!P7o, Փy ]jHM>FMotm'Y4.x t5\Q{btVo=|%4ɾיt荪F+?5#جڬ^ aD)m}W0p# ?kPmp`zӴ Ap/p>(o ^"wYP5,s ha2s1PCMr'O܇C':e>|W}5PRީ B`a-]J}d 8.5藈pܬŚoؽݑ/%#A/ 樇Etsdڔ!IZ2Zɶn秈$ *S9⚩MM7LDK 퐾-ƪd[\:)?T dԄEѿRLy4Q|S&2_ ^"[$ lF׼UzW{k!?ׅz⡼VQ,hvU ^a xy~NjN9o"^3XrIW Ǐ^y!` ױ:{*Yzr7{QޟӭCX>_bNDR#!KG^CBb#fNQ{dL.3ɥQ1&TNIiCT8g: Ax*zX9 {?iݸ ۊx*]0j<@ڍ_2MPW3o cC_'r2_d]ٿ7{ћ>U\D)&:f 'EΝߜ}lU)C4b՗8.64La5DlU awJB'Pg!z/l>4XlljDFu&a%k0A+bgt0S0X^mlvcÝQVb3^s+FdNwi0 q1P$H@L8m,ŗ1 е}a3fps>,9/jǚG$%4f%sdleF sA8&;e=Bgi/vc`Utb[Ā~흜]O<G~˱177~9P{IyN`:yy'Y #f8ESbn;3:\]*y e*dQHѮ??^zZ~ȁrWQp[.obnK4]k/x˻nP40fҦ79:Vhv*~sjXXŴլ bO?,SSKbFlmqBgGUU>K?u̓8,Y>+;т [R`gbZ-1.%Ya0^Edʫ+"[3C ;Wn==z3emC>:idу"qpݝrì ,z j޽ܥߜeOvTЊg5`p}.A ᤆ-~:=uB?")W`8̊\Et,r_ͽD}^S0<30T'd3GU8W6!_SU@?QMlSoX %`\;A$X-ߢX (Z.ٳEmMތZu.pxTpk?6S,z5;y4HMIԖZRBs[|L}u()?i' R4H#O$3N2f\}]Ӝ(йZiJ5PX8@Q>*dbBa>"TZE})RLzàw<}_Oy/gh/iM3>^Γ?nJa~.K07 r-@/"._E2"@駋+6x?i oZ) ޻O PzJr%h dys?nִŖ$\Bct}[˗gknۈ޸54%POZ @xq>!( ӛU ^>! 9wenei1\ (dg3w3.g.݋oL FԜi ^ضuPiSXg0DуQԇT?]ǭ+ZԑB.l,|6Oԍ~.RyHjpܲ3rczKu`+.Nɠ+Itb7mͦ{KUtɄZi6D3sKaĘAbPWC} V"E% B<_. DW}Jޡr^CwN̐c8}+nƃ&Z#ZW{j=8|Q@LvQj(6ET ķXˇg~?ٯ"m.*&Uz36Q-tvg S̫D`#H AEӽe.:'U|<߄?ޖ >,*^bEAtX8q8jq|DZSQQ;;4+}X;(k'ç>O*O+MyrLEEkЃ;+@·(tԧzq^d"(xZ7W\p%H?^*l7i3ES/9] 61h/i0U+&^Å܃Gq jdJ9楙[ [`gT).S4c2#1 S#adDE2mΰ׼}É{̏~~uuM\9viϓM2NMk|*m |)z;Icu7hϒC@ 3|{x\ Q%)s{/E>s瘐m^Un%j-*-%՟܃QǃQ2Cu yM~)QɈN$~MQD3;\DCC2[KIs9fmBC|Ϊ?:smډ.VjB} w5q`*Z#SyJs_07ݍ_6);Poe0px؂8"GuNbؾdg]TY>1# #) I޷--pzrzlFR3%.7w[FޓL~j?;L3FTp{NNQWo:%hYbKFce 68]Xx%‡oI 4-2ޖ&SXwdCdL_$VV듘N!PVE3SYk yOO͛";yC$3EN}r^4A+ sj> ˝936դv<i=$̶߳^1\ȷn:ӓS'.*&_Valq ֥ƥ9cKf0"l?I/lGOg9ø^7] ;[)(b%)O %$W3?} pj&5vzR( hf>) t >]gRə6Lv<<(Zל5"6dJv~GmHvmHpb*r+t5L|;<Ⱥ ˨Nd28l_+0;SD4-cMS6۔zr*mk]LDl,sr+ 6 mW,lBIj*ahHGLs~z;2ytԜ/uZnrs`C$3̤,Q9K/{ʗϏkWmF4ċ')kPB kRMh.T'-#]%Pa!e1PRt՞x6nLUEf!`q}'凫S\4d`S_.,|M>0iƿ+W2<(0l,>c̗Dm_.Uzf?U-`2^S]'v(q6|˗}s3~ftݎ}*\?U^v$ !E/q;ͥ$!]#|k7hn+Ѳ'0N|z)Q-\KJ/(&/IOZ?[%03SVh-΀V=7=rFM9 ,7V'rù.o`i Ѻ;x}ᶽ7 v&.ʹt㊅mh\wӕ($qaE~%УB5 M$i-|D~W`I3:;pL'#I$67 3 j^O#'ӘRD2Csnܾ#ioZ+L91b#b`|3qIZ_&<}'&p:[e>9-` A,L*ys~N:Q2JV`tB5B#x$H59mσ$̘BvP= 6w>FB.BP+b|*kxH LX<įwyP*4a짏8 qəhNo[|%B4NYFgW&` u K4I{7n>i^nլ"nsSfg}Μ]By*~Sl>KmsUi5Ԑi""0cZrL60~gTz_{˫=C SS b_ӫ{#S@`ZqOocC0hyNoW}-x9N Ͽ0#{G vs9*ӿcN{'/sB=afe5WF@x"?אD{,*C`NJ"{N%i߻!?3T ͟{{>>r'bɒ SRHԨ3nuIYUs(\ )Gňm e}twUR/]>xN~[ʒP3 oKle&~lbRfpdvMWp]oj۔maHLѯm9l<6o eivI8(Y ߎ#A-FՅCX(! {&K/ovWDu+2>=Wvcnpd:l;;穙m ,2+SX-;E)meҳN6"Jx*' u<δ?9#̳C>›*RR@W SɊ La=9s"ĭjuƣ*.I֋b"0uk܋m~%:?4wI+;VPLJi+v`v;b|U&^e#?V+pȬCtEg}Ffj:J['-3|̩ϋ'QS[?Qnbp_jzFJOTZICFT”S"wRmlKe>B:i#"{Qא&ˁ 1}"[Ln@2+!듇ڃEОWThZT̷n珗p]>3KF;ϕgz?>t%1&Kl،_48|_6b ˻gRx'Ԛu T_g߯:wD={¾W9xdW_ {&Mw᯳μ:i ?v̿lo{&wZ6powt1O4w<PNC~$fZw$ .rm3?iZJmd?T@K+_ K:V/4iO0WR No.^y=ۓΧs$tu<[;9un*e}X_9RǝjOTnvz#K"cpU`:Ö6O}p:6%cu-PC ti0GE8e3ݬ[Qj<– INKs3eHRI;zN;١+E),#^ńlj Q8t?v:(mZ X|gNiӖZq&(R$E5-s=HMkm'lkΊ 64K:E[ȕ;z$:.㍶ g~}>@|>;]}ֱWO5d۟E>oNpsOz"y'vq}4x4rxGAwmVd=ygr2`j]XOqV!N=~",1N'18zMZD@64i~sf5$tL 38$7 YEdºoh-d=cYDU7N٘'G<}njtJiCTŔ/=){y*JCiOH% 5+ʹ̈qqQDv޲}CrMD/.ӭGOn}>`CNhXxkEW6({!x@ 9UYiؤatͬ7Oc ۪K&$JY`ڵu@wKswNOD^j=gu3<'KW'sWODfes( miL]QDMD Yv?Q) \bѸo퀿/ؘ 12qD2+ױ34Sc'{gxdxz;37jm]'B|g|dH__ /GogqcKu̳ӝvP*5MQؚTaP~n/0t-0=()pc9|X怿^*в j7-D P@3%MC b2Fe S3mCyFD&NfcB,b{ (Ձ;쀺H* ѡq  GtXN TE`K+E\.Hm9I)uf}f8sz nVaLz}MnVahڏXެ{} H^o߬~w> Y?-ӱ{ܝ<MFmfPcv #@xߐeԃv2t,d>1gQr;;FԆB) bB*1>oiH~"`cCjJ2ˋt;ʐᡜ e> 2J˿R‡ba|>A:5A>;]vkgxg_oo/~r]G(7ۺJWv8Y}CECW&F6vtqVJk\T&4}sxrN|[_0}ƒ`W{ zXl]fZv[w]QIyהg~o '-/c8N͊S [6PA/-g}"}~/Gf10aǼ ]]Nkl͛h\S[C3G'p;LPT&uu>#̲~x !{Ok*䘵`86%/H űٰu$ٱ+#Y沬 l%PE.@3E4ǭX))!VW0eoH:zP1aT2;ѫPU߫zW1i2ʓ0 ش M2dʒ'cK5+BH}&]S@ĬugR:Q;\djwXS=g7Pe8` 폱1=9\tMYcw]icN?ݫˈP%}oP#ݗqw_+Vm޽]_/IS]ZWǀ#ǧ ܮTл!х9Aޓ 4GQ N^&iO?q[nD/V}EM.2+W(GODRyXMkb %M۴.>T|Qͧun*RK?VEoCc5O=TYnV_xc/ *U\`͓H 뵆p|^ZޓȪ$C%4GqhPT~ǃ=)y1hil{d[܏qzazxN:߼/].ha%\zb]fb4хZHʪBd]؊"!m_/ .Qr.<;4o^x%5p; ր1?zhJh[{Lf)!GU'F^[QOFEzDChni+H{n5jn3eg]tlbGvTa|θ[?R.Vad+Ů|m\J@P5BljqZA0@q3{#{4 '4)`Bi%H؂..Л߹" q8v{wOԺA?3Pl2B.E&3ʪu{b[rZďK45X O[`.@Πb9`GX:Z%H#OepN ԆԜq^VpTJ{W4BvE1F{*:7)B(;WZr} @]=d(OE}bHJ*x Bflr $Hf<)B27EpjP~ ŻClU4|BG 6"H\ǥ rh As`d:7O˒*Z|>`Mm\V6$Ζ4 C >b◖zwaTxZμHPXة*0[o2qR\reMYK&Sj6[=@vˈ¬-0ЂED~4$8$.HQB h)LEl,Gxה=б)e#;4je"6 S p=`Ea'ؙx#c{ Y{izhN&I=@I쟘O5#-8vZ(Sw0:8}|#~-d!ܹ{;ݎsdm5$:32Х!,gجAy{&uHR =z"4:W^^Crۖ՟p ӐR+`&Ez, hDSaioɑ+-~էRT7.b%[hqp?wh$*!Y;JbT/!K"D6Q%ٓc&uaO;6,jt`=%'atX&f29Yު \Ykt<*oS[ B!{0[ct}m;I'g0Kipev,rJ71C0 v4"W?* R s(/dl@-ڣY/s_GyQ+v9ÝAWx4q{i$v e+oPe;h|hERuq7G@dvF3 %7GQx; *&;5E$Y6zx#c$d2(6-H?F`wksd/*t{{~4h55}"_Ibք;h3_ }id nG>O*fԤ =\0*&]V=b1bvXjHs ABC[# ˨#%-`lY-d``/Ĭ'Wz}3w&Fݯ& B:AY/e֠p"4ba_z@Q_!y*O.Ua/@@c+(}1R(kdyFM@yJ}{kxCX~ç=kJxx,w*X Wnc\͎h}[i' Y~KON:E[D(#]cVU*3{-6,2MIi.w#7cl(+{5B-pL'HS'#s{.aVyihAa2E e^\(0S jhLw%VM,\r <,8ump`yE=JVCNĘqH"Jr9tد 92>@h1fe|`4 2,{q*2e$|X؊q7gB0OqHP"){b n.D!ʑY>crdmD\->2dg r]*y SDoQi` HqDž=@B=m )sF|acI!`txs+7|="AK[4\T_=GCQȝ* MaMaAcLaxȥHMm˄\[Zikm\FEV|*7>aٵx60---bd..EТ;UWڸ__}r%ca5/C _prBظGB3G9x;U_T?ѥ1A?HsƮA(pP0 6W`k M񃙡F /)bgUK Sa̮Tu n?qUN?Vj1xw%i?+)ͫ>- Lٙ\<':'W30Զk`QyaVXdnvh[Fݐr~yEv9\iMh {k#=P ]9Mty?ۆs!scqs ,GLǍSNV$7JI}ns`uSwX܆z1Yc0Xs5~qǰV}:G*`cqB՘X`bJpѮlw ;[1X-.PL486tB0O`>s}R3ˈ9YlS>w5Ĺb] gMцR֎tY <Ƃj@7]N` H]ܾzI^ V i*pq(T{ ~r= wB|XYP|4ADU4gf F0 3\uqষB2BoJC#%E'"68(lҢRAW,ccEËx/ӑ(-NqZ.\n=,ztcwosLbLjJS5f%_my7(FUjO` э0`Ŋ`$l>j-u#&zQ b{i-k |@h$any*grP#zA!ؗf 휁SmM`'Уyj50[aBbB$:{Vosݞ N.07K9I(,Ӂo-Mדs.hAxzQt _I_@/b]8v!Fm |su-%zn7$ GGTeuA+P' |(qLbe\F&בsֹĹ{,lض,i 1.zX<\dB8S^Nߕaf%f6M| kWd,Ցm}_F vK@Wʒ|Wұrڏ ɦ#r̪b) %~q b69ژZo\8RA\ *ԄQV dyagcbh(RdDւ%4`wdPX1!qtφ< M@`O9`&R9*ȖUk;|PމycraMYr}qߗ먳YN=0C˜%$e]M2$Ac3CVl7DZMM(;R)¼g&00u-},kyylԥXYnsH`PpT$=/HKQ+V܍{w^"1<,Yݡk*\${iu.pO}#pf_Yu^/<&BF-Ya 銸C pB8 '?0`V g4>Bo('bLV=F&bhӗnN%“Kb(B|]|ձ"'\a`2a ?D(@ ESSfF$/[V+#a`mb$B:CjʋN8}siEZ w!$g=_2l*YpPTi65F{'ޔqQڦkQxDlBo)?%/Ӳ`n82w"B1 9\V`5H2& ] v8=)>zLJ6E)?7 (vf^eAު^F4d9ǧuTC"zEcF3CAuS`U#MevEaOKfp8pE3'+X"9q,&n)Z_'G>N Ԏ[,eL凬@6(%J@=?]}pg-ʚAXL(KIACa?&`ҤF H?=ScBdiwKh(H>2zj<-ԸDŽIB7Gr000O)At "ވ =.^t=v*N1-ca GjQ}ϛCH 4ID. r'"xL5v5GefW~;.X Р[w6Lb8Is0}8HGt6wjf5 ՀdE '/Qܐ[PPxյrA (sČ@vDP}rODJAz)N-Ƭ$pJAv ]D}#jݐG-30e] ^Y S$ű<ݸC1V.%!C$\~x}U > >J'{HN%yu/$"Ach\0j5OF/ "G#) hj ZZT?kS iuJ 4J*N0Ki $Frނh"=%?18,!V,H Ҷ/[2 E෩ (hAtX>EIQ4sIƝ*FSe$YBȐw1fd0Pqa f2ζ'Er+*h5*DxIVɜ#ʖ?6;P:hJRPtO)p!fi(e?@U 3^h Qf7) @0߇}#|E_q@E}TMXT(uEċ$sb( )ZHccZ 8d= D6"$QTdIӄ`'$ )}Z+;e& >26U?%$;q "$qm2q &mf' Q^_VǕ@á>V)=Vk1!sX{R|\iPZא9 "J tVJY0cK;d@>{ `Y639c6ll@3ێz#u')0iz,8Ц 0CI*7K [dGV @*s.C/ HrxhvC<-- lH( &c5\oPKWx-a%AlinEAKdK [!U>Yc wc*IˍE8:IrAtLJ5?'͍{O@uDu@3[3@iGHk>`vO=XجZs!` @v"̙G͠+\YE)4ЙOj5XX 2d} yjSE@"|'<@ 1Tl._VVc!=3!e_h) z*T1vQ[j/" ZA¾ڗ8Fv%#?`{ .78v9tv1-JA™4+w! ۱zb-OdBq@XѴ#*,i $0Gۯ,riB4 h}ɑdDm0V&ٜa6Sp`=ƒ[9GkӇ4yldsC)C檸$AurGrC_!ZY ̊;%LA6r]JHsm>#H n1S8 GK$S>W SahD8G"OG3ux'vI+r\%x#mIn E [3 O.脫j5&Rige/fq!}iP{^"]^rI .&@6, ,'`92[b]t:~AvX"y LyZ)ɥH9y& (*Ǥy*RY>,8Cʅdh,ś-ZP\~+&+g0c ޶,!KΊ T64L>[u:%TKG"ф {AVp^+MV@F SJ)3)#튟ǒFUE8aREݸ2tH I—)ބuʑ1]o pƄ;"˞o2f:U릿74e~hBQdk7]IN@돪(kHsaw ;R @H7"aɁH;mcv'|Zxt .x kDTKDP KȃTd!7;Մ$ N=)gGO$yB?_?_/PK! 'PKy.Faangular-1.3.9/docs/components/open-sans-fontface-1.0.4/fonts/LightItalic/OpenSans-LightItalic.ttf̽yxU7|NUtzMgOw$@ 4$d}"Ka% "D@dEEEDDTDDD **:n㈣:>Lq'8BR~>R]}1 4ɗ&bwh_0߇{pp1w/ۅ1 u3|˜mԘ_=p}1c/m3j- k=f-iAR]ٺ3ot1]zf2 g~=sZWI`qd6yA|o7{[&|1fL;9 cnY\^aN[05{-]pk^晋`N\/oZE]猡 1 'N軬⨈o/Xb|e U\a--|u5"ڏu=nQOiosnz_|hgyb:V.6till!l]U.cg8Oû\$?%?-P7aKBȷkuzy|Q$o[mvNyW[އgX'bw;=5\oBi5˻|μYZsKɇ#Q (ȸNj{ˏȏ`;pwi = RܴN\ř RtG5(y9#e8Un01fflĬdͲI$Lg_?zݘxFٜRetAo8c2YSJ|a=6p[tT:-!>.\e$w+L,'kc/A0+ v F=o . >|*d yCɡ`('* Mɑr9I9!9SsfWvE[ZA s,99sbss)?*91eKu{Ả]@09esZ9=9=9MfNbN sjjiiJh=-[F;Z}>EWcmϛ?ks3ǿyM ӅO.__ȹu!Bן}}گ]Я^_:ꯦ}5ʯnjW*+GK˔[ی=}fIj 63#ilsW/c4ޟ.zAqLpld!Pbc#+ UĺEX7[ʮaeɮe=:֏g@luFYGF1l,>;U MddpT6 6l;أ;̎ $;ƞbOgq2ղgY;Ni{$_nfl&#gGb6Oհ"/gKv[!ϒȳ6Qvc3By'/ob yֳ^~D.{}rO|3;{#*y-y%nx87RUx|*f<8Mh`Y VC\tRwڱRV3Ae>)1fBO*tVy৪*u>r`xB*wTWԾ:J'i(w&LHTSA:f0ag8j-x{pˤI*c,vbo됵,+:K^󃪜;4Ta*+6s۴ \ MH&6 ٹ]!)GG`j)T 67Xnzw&}oMΧBh(6.67%u ^VRmXppmi4Zi>.M o͝v%So',bf۰6,6W|jY_޷_?> ,t8oUz]yt+b+fbY)Rj۔~uifz]r._'Z[>"?fax~:%,uFiH$jRVu'[ j%wFf@DcZ_ %]ΤK++.plKH%kI jKKX㛵XǠlBPv x N+tj4VG3Z['ɮڄd;ND->:=q~"~gǟN&S3.IܴԌ̬MВg@:d ]m+􏭼tS`sfiXËzƪMyWGu7{W/h٪.ajvsڡ8$δYj^h\J^t)Rm絜ڬ@t69.-ĩӥui*4mP,XfTg _jDoẽD_M]IN@GS47髩6>ٿ~F3:E5 nO[0سD? סI>Fvn^ؠq [ƙdDXzY6Oj@nY<-w+#%/_Β@I<\ZȽɽyny;ӆ,\XQ;=pςӊ?Ȩ>V=kε;Ĕ|u1/+>#{ٚkGMwI?HAƑ3 v6Ml^6b^'O`tZ ZR'<ϰh"6Yu17DD 1tsC]/QIiD`=tc.-N.-q٥EpO7X .2-:;qIg ]𹵼n `0)e`w/9R\9f~z)]_=y~j[(^Q9zu#uh\$.V!#7S.>rewqw4]w,[Ư˂&ȖLwv~ESfHf%Awtifru)1R2]g]vE݁4isθD *)E'޼4bN r}w׿0Gw}PÆ\4빓6ll -yo߷dšm|o_֏V3J:qy>bϸm޹c߄}'Άӊ.cH"dg>՘!i !#~?[?-ˣCxOGvy2Go|w|R?bN-i~t3♉E|^NLyݤΛނ_z|ݼA^?|J -UTLifR4-nOjwUj\K"|ސϷ\OX.ݬ_{+gfZ_2wDKXiN3WĎBq`G 8xJ#d:m5`Ȓϼ wlP,;_H_'=8>y9ٯ_ҏ+SiṬ=hC4DSH(b y)vAL) 4tlsG25oGƧ-퀄\-Nhf?'Sg?>ܿ׮y\:yOu˷~Z>0GouYJs7>p50x,j#,FlIX\cX:PBų4_ 5j|@ KMjX]\_Xe(h:6hѶ$|uT#B_KN:Fq~qTg&%:59Y$8/B2HH xi2'/S˛ߓ*/TKʍMJ}_ZɗUMDU %fC&}M}u) u^[j"%̌kCW ޤ8Uw=nL՞fmLZN56r{7K0r*{_ܸi¾OYoBd^շopީM_l==T@Keai&Tn6`)R\`)4hi.4Z( z+nTzݚ =]&%z+J,eVʹ .OH1p#1TW t|gzz*6/_H-_yݷ/~boسKaN|>.4 Tˀ:VuU) Ա\Wk(z\ZFb|f=䌤 3ܞgٓސ l\%gI M?yu7ڣ/=ev-|a̲;֬zCV?cwm;3b˖3[v9ؐ/J&nkKl)[Uy0&kC4? ''a"~^KS\ZL!jL.S5$4p:lĢK'G0 pIJ8/?z NbO_k[iOVIUҡ?>tO6-Y~nX׬a lOEivGN]ԚuJlXP 28#W5(1ʬH"<)R:6c5"Aܳ)H Ts!.TC2^ӌ|kܬ+gA ۝m/tx&}~hQR$ z%4) 4f =;*onZ)oLΏVWcYcxWl;&LZۚ!(AYG#$7K_GD/X_c:X0BpBC:aٰ]ZKuHL|hR2_ԌzGH3/ZR0oZǮ% 5ۭ*0=QGȮ0neZ^\IyhļCŊ'fw mi@6aBP$?Cť~Pr;)WpR/ؾ"Ox%ӗ(%V-sU=~W'^S菟}{Йwof&j[xVڳ~߰7}Qя?M=C@s~h: v1MQVe$G*EVD4BhGW\хFgnB\U&(`ltK&[BL3LaC6Y ԙg[N_ Yy`MYgA%A6\2 u)4{-p)n th3A }F P\rEuE ateܕEi)$ej*>jU |*ܐBNfa[Wt˺+}R?pPT=U\x dя)׭N¼@<#U!|Y~pS*;sg;8ؤ(x?12+2{bbOlUIrO:/WcL'P|淧Ҟ@:|WJ8?R 04L__۽k:AՋ|E,lNl6@L$0^3d1yLE1KfuPJGBd !-r T`滖K#u~Ӊ)Oi1E Té@}Wg5 A7bGbҥzKU5ZYmEz|xV76/ >^Lvv40 []r ڱђY`SLkecJ*4~_*d?q?l$fjji՘m <%uS>\yR+sχ7)mٿ絟RX_o*UCy8M^4Xq!ԀAn)1fv&;H©"}Z7M-XxI0N~MVK0[M4'&и\++W'훈jsK?o߮ٺty0fuKF4^_-P1Q96}L~C1ч_<M~#ȽsWh|u@'/g:VMj"Vrq}3l:/%~LJi{YG]y9{$߿L\|V6FVH4pI€s`EI1< Zف 1c["it4ɀX"mman{F|"KÚ;jzJ׼ј<s7!Se:1WE*?OȥYb$RY=P>Yc! u=/lٱ 3{=p98<J?捡2^ --Z@P8q?Uߵ<'#Ixb8vr3abN8o"*tYl' _ڸ3 q)ĽQxJ<,vwYÙ/~|axt bClKF^>mpCo^L$>ؒ8dp\pnh֤΁S8p\qbT]8|l}R7$J(TcWAZCxv gۢ0`HI)89]` DNO߮hn_4? /3)~nڊ5K)U `Q;qyhO!Q7z$ܳ@GG;i zhBnƼ»ay&"=u?rZz7?K"n\?Ѣwnago-Jq%dž̥JH̹*Xa}{ĬGos {;E] 6$Qք'i6;\1ݣ[n~ܺ/7]ҟtgtGę 0 ͺ:? 1qC19Ƚ]8~ l[O!nyqY?G( 6O`c:ԁ9B?qzzD:L .Y nPp;kD,!ӁÍ'[P>_ ՎE}ᾦ?ۢ?јݬ]Ci%G/ gЧȚC'm2d.(-D\ϟ8gӆ=937޿o|t?_jMMpmiSQVl5XXo5cMP1X'7o?W{rצIK!w-䛧x 9aK0"+=i Q!\j8CGҹY +W>)WB+`d<5rg5b1h|B0sM.u c\1ae1V&eW??ŇU0TS2^2Q@<É;;iqTrgX852TbJE&B2,ݑk#%E\k+z0>V?UARU@!P~1`fe>H>d[SܡccOKZ"O,#`Iؐ{Y= ˥5o7;뎧v{d9d^R-*gԄHE\mV|jY41Ю'p9h س`sX\*)7F1h'CaG^6,Ou\6wمgLp#ӉiY~YH]$$HpyҬ{[g;ǾIxS ڎafX|Y>޺r{vZ~Qk &#Z~P2>ȯR+y#Q'$ D" Xx0s8x&.&O5'(=@1 .K8^ tV%E@\O!8Ln$ 0w )-8,BqEG"+?lx9|͓|=)ŷϚ5ksՁַk}=<ת? d~H @ >2\fŶf(B) dެ4/cޢu#-咨N3 \ ͎Ru v %h/]&Æ-L:Fqf#Sʠ: RVS-Lx_a cOy4s*mg|f^E/ R0 ~WCUql?}xnB! ?çY?i/q)_+co)&>X?{NR~Bmzwr3ZzQi.Pei Z‘O.TBa#Vbl*tf垛/wo;~U]%۟#^uγ/u*yS~ƷsgIc0gcdXAl`A6boɈk A,jߢ=wP!56:Rtr+t4ϙONh[4頮254H yHeX2 ݋*'ep=C'vϮB;Ww)׹nTvw~dPDb+e'tE\ xf2,f!jtM&qLcǫ[@ ,O%k Zkk nd e\iB3x} 6$gd1@jeN920K7ҥ ')fOl257=9'L Z;"-Eߐ|m?$pT8zE7B.x KͩlbsSq8pIF> ,pAݚ3,p{,Qt N櫔-N r[0Q{Dd3k44v8\MS)w.x㪜01Jɭɗoik.߳u5||d'/՟sGё(_BoII_aWe ׅ E8fzUq+̠7Nkl0n{]|Z{D?e4R E1T@GXcCf y7K|'Q@+dZ"HѮ8Q;XYyhKEÔ1I}z6ޝ ++b di)@71%A]B1E/2F-H1~Vqٔr9B#T 03Q,' \sߗEؘ:졁d~쳏 ,ewq՞.WXtnǾ=)0GÙ}+7C&Iֲ;鄩`N)QYLgѬ0R 5^jDj bdXd l`a0 ­Ċ##cyK{8ON+-Yɷ ;s[ g\="c(: gF k aK ؊QقXᢅq# E@T`Pi,a#? 7N\М3̏akJAs C+g|ȟcvS&^(oB@XNS;'BձЄTT _'4Bۄ fϜf1GF{f5]i=6a+gCM14:=rU)6aA=.`8t8~Q3 )aI*8 oVL(HG :7k^w0INsLw̿iYXizMJO4{O'כ#)öS<˭!WǗߢ+"ɥw1Aȇ#~ Q@/" 1Hf2Ai#ſ'B4'fÌ<3.m$^/ S Dh ~n=^=: vI75v̀^3PsYYb`5k H*5WI+lCc4K<~ZΆ/=+)#w N"^j&Sy]r6=96R0H%LBF j;jp@Ekv&xnPu:x.Gql#(S!3jSLΤvFz4bjZ2,qRԱ7-HǨLJ wa߶>eBaYn0<(qL_ s]\#/[7r+׏oZQ<3w[U^TyPSUÌKCtIzʜ*b v 7c(MT5#b? [%LFQET-&㼖uwq*zEVFuI$:m<3[1#3/kmG`Ө6kB]#Żp)^JDP B  rG!>Rjߚ;R*m|/G߶k͹tzT\1kjaM73rfrAl4[ȽQʐY&/Ra)Z?3(r9U9.4zCfv^g6d^E.]k%Swѣ%C23zaSZL/Fh^a»:D[ Qf֡.ơpVWL#J :cݗ?y(2*KIs4/NRLAJJȪ>4"dtH@Li :>¥r!qUblI5 Tﳗ6;d(W)P!KJ:&U҂SgVPTFM@k`\ը(~]U޲wžMk<~r;*OIQUɯ*گ>ro}oio R$`o5*4[ꇒQFfJ\" vGV A8&9EI)E# Vlq5'N#:@a -"Ɂ.dQ\wp>7]%Wmz:{(ϣ.+&7~S^89rlZ=S b{G>l*j oÁ#a"rn( qx-W9)SsܵS;0nMq˗LM–hܮV7 @,@b.aAY;gM͜ ֍׆+naÜ/to~Tޗ^7wIk{Qkk}CKyؠ#[Fr4hI꣟?/!_Cԏz F'$‡@\C* 'vB0??$# ]2.o6> .l>_9/}i\*΍xi%1I9uD) E^|՚nR܈;!UWW0F KG"¢q*+,^Ejy 0"2:E]SDv=ɕ֔BpWNn=: ;p?QKd\xTX%GW"xa L_<(f=4lCV?d&=۲ݶI[O˭S[K6Tt׊sv)3u^o=K&_sbnos+6}ewnҐݳ6n;S@~t1jbjg]P)#-hd-'Wɹne]v%sJyiڣo}đhBf{[3S[vX_<1ڞxC=BGÅ- X̊PB.5H)@içdsDc(`' Bo`"FY -I>b$J(sDFr|[~CNxq^x2P{BI//nƤ3s^xKLJ?YqsIy6Xnc:xT OuCr4e@#H(pbĆVqEc'iky@C9#Dچ8T$nIFu0ތR7 !R7 +&{I1{vKs!ԵS*ۜR6eb}[{\fٻ]cܗD*;L$>}4kS gkCCmx'IB>|OܔM u Fays5Zz~=zh7vay:"Eu*tP< u*u BwP\..H/ Qu.*-г_R@j[fCv\&.uwF *)oM/y][>%ۼ\@ ^jBPRIݥ%fߴiW{`$4iIDf+t !rAf] ;YɄpY'׎5HD8͍Vzɕ>9tIkoX^9rOrO:'Tm@kPkH `:-TڊI=hL hD< QJĶ"FM(:LE 2ʙ[֬xji9s5# C/7.E"_r 1HiD\<&"S2;lx}gta5A4K5o9bD朗ҹrRt zF;k7j{TeSuhԌX2imko ! P>E~ :1@X;&=E\DAhjz_4F>P>GN {ln)B}QT$Dm.5ιXR¶ ""؎ AGKsH꽣q!4&#Y5S8 !7)Hs$ *Z'@9EȚj q/E`"g3_ʆvg}d'=>Hi452jwدJXoRN"ƛ(DZI>'&T[B].LA@^WIO4 RV}oWf> 9 E%({HDe4zř vEr)n!Pt(Y+ %YPݻ嗢Q:dz:~w޻05/֬[,AKIs|VQrI=IxK Iͱ"UEgY`Gm>ۤgedbTC+c_)HRgo\*?5Ɣt[no[*U0%9_DqMkQEE5mFjbQf,trp6 A/7u-wϼyasz1hJxKn_ל|1'\%D1WEq˥^ 5>B샾E}pvSקwwzJkL'\(9s٪fuL:yl3̅I5ךΉ(/ԸN s \f.zp\t9m A9BF[|`AaKzEF[mGQ6A'L C{4=KWm;7+LdZ6VxZX|Oh;VK-ۑA~$Yb,NAsy0.#zD$\4` Wc^xCC{$z@n2Pߑ)k>LpB?oxwZG7;,'6PbRBOR[dyJbj #!QQf q6{9sY(x~KR|\fq>]bomIA'* ˝ 1o;dȃ ML#W ؏UH뉑"^M.$%҉MKYD1D\g2ё1'wFri! ](! h_%A?qWjQ:~O(*E' Ǧ{d.+tpQJԎ Ǟ~fL<8UgTCGgA(ٸ~^G k%{_uP\L=55]fF IREe- ߌҝE;X/'hZv)T{KюA%1,#)ٖI0F/xIp8S~1/D8Z[=KNqݝKg?_y^'mw M 9ׄހ7+v./4m^|L>nuɊכߩ~onD^O50x ~o{Rq#9s)1~A@K[ {]GGZX=9~rn K555HW &쉾X0M((eґrƄtŽ>z]s+_ |??p/z!\ϓ{~-тTψ,0/2j0IQcGc CdRbd3E; -i:R n%AHLMDP4R3Ԉ;jd Ph H ~ /&Tx5G_{Te2Zn=0y:];o}}}Fq޸nP;njMb$"l/Ed#7`JP7Z!qŽ7U ?%{GxB~ ?AV׵7oڻyO\];9-w͘w׎V^rϰgvߑ[~U0Q ZO e) X6;^:W%ssqjb9w^i2nxk疓JWD%fi{H'q6hJ*'j'FO2eeq纟y|TTq'(,ts8DpT #ȏ$P(8~H$zu!щ 'V!f=%ftaQC)xH '>vؿߌ>h3.xq#K<x~ͳ5䃞y.tE,B)o oOaob~*K}YS~XG^W@K}7\QчqWZ+7yw#ܿF#og@7 z QqDO!mc[_q@_kg a2z{Dz~V u(Fqxz?~?J)Dt?71~h*ki?('xNܶ1*>Vխl}w&]o]xiVO8oWZHGNUb rjNHٮDwc XNm n|; Է_m6C'~z v{gд Ŷq5lғ|^kc=NMS!ݫi!ZPykk zZr- F,H`{L/B5XV90$d*RӶK;ٶXEP3rrv xO .O1f x.=UP=qzu%5$zX>:*tY{ϧ=!WAۂ9 XüÐ?Xt-%p,t߽CTnash^ 9Ǿd@?x@YV:M1l)4Ƚ̅|'s)+ mFM?0 ^߼ XF+Z|)x=lχRPCAq^f0 vNMF]%xeJǣ(}6b)d@M2Glc&Px5=19"DG?m{Ir(dviI|FZ3_3iTe<(GL [Z£ېּxnqzoI=="G*QzD^;Հ6aW\*LY T JO'B(4RjT V!Q1llf qpd ]9hTj((Se46y<4_ ҟD>#O>V_.j=3wp:sç9F~q41!|s{$^^?eד"З*]9/tdsy} Lx|Kp5bA'S 9@㢸>pNBX&'d܉N4i'H |߱dQ6l6g2d> SГ2-LӼH2J%oY y 6ߐ4IvX;q7ST.xMָcj6x+_fJ\=a-uM\VN$ɲ%(K`x쒍 jOtvxIBݟeӡmxYr uI>1K zH ^|=բOBm!t}d; ? 2>8Oo1,6pLO}u/׆}uY->K#``` S!|#רWW)OMÞr 7,M367bChZBk*GbMh1\<%@X8-M"ƒ:Z%,lEӑy$ruqu wwooئ3R) >2PQϢ% LZ(Hܒ-+xK1tKPZ XͷBie8? Lpd8"N6:,: F1+6{6X$y1a? ˜t#y;9B\ ]~Lޏs®gR^?R|>ު#:q3#G0lns\ȁl8Qh&ȆI{7A632 hrj.% -MvݳĤ17I`hZض)7I:8KBd>F]_$@P( ifo! dž0oĞ* cC,Ylc??yLL݆3/O<$E$t(*d7,6jFMfm(F}UQ'ij7F4>#Kq2hY`m2FH]z M}MƐPMm]zpu?/zz"ss#>?~c#ABORfQK(# _*ZI  l2(gfIOi!׶[\dh^?F甘.gr~jg,ǷcfekTʚr+e{' t\1'GjDKQAKj2_G%)KC8iAhϳlmRiwsKrz1-0Y9^  /HL6ĚŌ,lH) riml'dkdR3Qjؓl"[|o?0wy''LJq9V8 9&L=^=EFwtsbugMW+؛}V!]62+co&C>ޣ7>muw+/3g_k giOfjQ~IZ}{p}ρ?U8G9}=bA' " `a/WvsuW'jF ˞C}Y]sY*1F3*cZ-? 4[0?T_1OAL;۠zP>PDJT[Uwɚ6JN;vŒ}˻UڣiYkjfOP[GM"ހՆ*"TŒs+UXNK0LR"*WEҴ[4ppê𥳐QTW:zuxF3z'"TC B9*MBX:bOEy)@])^[r$\甑}ҡ1$!fUvoyݳ+̟]>1S\$vkAcdșm@ p(VH0}JkffHӊSVL8C8הNS%Q} ]v՟F6"ȁKy7NO~J[&!m&tzݍzczUUuҞp15\ӽ_P.?+fwa2&}nm|nV.]|ᥥ}]uA^0`l!cU2srd.TQ4 "#tjK-ٍJ3L; fE- ;i|F=v-UٰJMPq4^=damTudg cQBUǂ{0W#y /yG6q1pB4'8ctpBɝ?OڛoL|^}?] >bsOl7?|'>n9{6bɫwq]X̦Iqi7QwR*}3 E4'@X*,å9+a*ME_J'N Z_EMgbig_vq(RW΀}Sfkp!K<s9pN@2 Ek@zȪ؜iDŽxED}.01!ɱe*K m'v,6p5̞_]]ȳ}YI14s설;/d3ZZqRGGI U]AjX9:q3Xu8K\o>ͯpN{/bmnFPӶZH X!ҡ+2} qRe*AhEljg}\sziU ۠NOUVw,FP%ѭ{/ܽa5mQc ~ n; fu(fGV6:fk3S@e p mY {(xp#X^A9ݭ@s`U H; ŰRPU!0¨LՆvj|8볯; 2Yeo9 s_P縻(Ԃ>rEɖm' D`lhy'[I6bV0B#Rn$UjFd(Rm?ayِ>DLN Y~% Hֲ {t?XTAuȫ12^ Z<S6Lժ1^*ڥsUe॒lJڥ`+cqVܪapr9/)WzNuؼ>%,Ͱthy5Eq&K!ڍ†z/gzHW7&@! :igۇhjސ> k>Mmn]iml6$-E3h)hm,xMdﯽyi/}꣊ڣ#kpElP39Δ" f&2H[[nYU7s7K]L';Q4*aPͥ"$?J er  LxhE߼7ɣsLugZ6=85pZ\S8d==^pDg1syun(bԨiL7x*+U޶S#ACl\sLx3@%l՚ s*Ě@nUl`sy͸c='p, '>"H60v_2-(l^,Q;FTǿnߛ`Q%Fx1t釃,NRJ5"1SKPNʝ!bJM&GfhyÍU۴kz>MKcʹ>G[3&\@2~p ǒ#C ]z\K1Uq(B(hzmBt~ϥcQ tbDao4Yi4яcZl#1h7Rb /PFeb:9SҬ+Ɂj>"enSx:$~Wqd"aA-eB;GKO $-W.tz+v p>f-fHrx7لo&D!Pokt $ϤdВGFS}ѣ`Ǽi Ë, P>^e n<[\0N gbǁ^x޼[{T|쿬qȆ${'޷}i:w]>a=(:pY a7cEZH-U'ByofFoF ~9(> 5sZ>Nl%1j}cQ,،r,! MF(ܛn`5SoH)KxgY6w+܊%u ֌^XQ=2jbq% Uwb^Զu;%˷e[Wo?DZRn!^5ܬCC5 5hOR,VIr݆xC1DcoGFOA2K+3J|e6ӊ4`c',@EseV]a:d@C|ѽؗ[]1SEH 0a;@-gfV 5b |Jl@ "8JED2x2zcY|8QJp֡fJG430GumpIQk>[7ӋWmߙrVe#ݟf9njrm!s̤Ě7>/疍|Lva=k&pTxq{s%tʯ`zXjtB?bO>Dt )rގRaBO It|9!s4٠?2.GֻgWiYٺZ'\[zǦfTL["{oĺʭXo5sQay+XєkKl v3k Z[zϧ3R% P`eTT> 2ڡ!-]n-—-6\M7՛ 2|?:*zw| #jd))Smr5BLi{[O=YwպuKw5SqcWLj.0B]kO‚>tq1fs`,zśroI>O{Jʕ3B@caMyg癇2ҥL t/d(._f`cLqL )E`;nrX-z?`JjEL8 T;،f̠Jze-4u/[ 7eSC JUMݴdG4^L'?%3(w-xɥthU7Ώ>`ŀتERl Vk6LZv׬`lpU'^l16S:o1{(m!9N%W2F$DSZ65c E 6pVܖpf/6X}p51UgvJrν;w_ԾW@{{k\{Ͼ+,p-%j#T)r oC|玴/t =(@#<=Ҽ*h˼>&kv2,D -(ʙl,OXfQ`0a: O˱ʒW(J3[̨e44ZSQ|2=/|E6]_B~KFY-7e$iu8]0aE8S ,v7x1z2 nEc7١TnW//h[Em=7>o:W2%>0O G}/ּ|+H?3J%O48=#WHh)6x !C-TgB`ɒ' Zm^g3>QuC8@-4J%\ckV (&fwrKDVk39 É $2 lk<5߾ ,POFcg _w b"vw&;SOtxr&0_mMo Bj⹷bϥ-y$±|D+kVw&ⱞϒ k$s{~nQR"C2b:j.R]:gDF혶*R iN]6\1juK;TIAGvW|?tYA輺4h; jK1 WO!=z1f&Q'V"P.} am=,>rTTE(^+{vLJ%L[CgdD"8QDQd6hkcLί턙ghC)׬?;VByd=&:vv \{H`@hBpPm=MGt}Q)&K3-*/x8 h.`ݷKpяc4G@{$m1Ѩ@+ 0  V{)%2Ę 6b(m$M\\HN-c=׷a3O#ÊAb)<:nL6ȡީb%E@G<%b1'«ݯ(/j-[E f?V=M9QBɠ0(fўs_˿趈kEFя\-W9@8kRMzG4ﭱ Hɀ{b{EAU fp?m0h K=</b2c(`.4sE_taYtV0>0IG?1Uܞ,ӌ0,1.չJ`B+<<@+l_.Ûbb _gt`4ZFDG |M:=Yhx.x7 wKXx5ssn5b'DiKeEm֐H{}ԡ2NPa~;$V_! >sϒ C}1O6Wg;1 }OS$;H)12}?b|N$BuS2A螊u)6BXF0<1C2go t]3s67:*S޺pgC4f:nj+𾭶cRZ4D?)HoS$](@j%707`%Ɖe%$O#ii" Ns65$8KV]W֙"1yrԷy y *ΊgAlв2Ψ- 9sBU:){*)9S_}Y_tۇnޣf(nVS;^:s^,XD,5.Ͷ_l/W pu?P_*NЉ~s'4fj c攖0^swe<=fL5{m~3qd,&W2B)̯g@7nU֑$fzDzA$iZy0T6`Od e%H"x+(A&ЫkJ$!Zz*Y p$+=P#un<9bq% U ς tЃ6 b%6hT<#=2Jws;V^EA("Z_9P;&RT7Z%bF'F7$>g{FSm "ŒBƉRx0}@&s{f1mnn7rk~0ɕwmEg(1^Q8i킶9NJ8^d~x? 9"@NۡS,1DJJذ=Q@ _LHG5Q9`W(XOpկvoMVn7M} ^B04!՛b4= ܛ$ݽf{"MYm4P5Vss0A?9ߞp,ts * ^ 'Ӕ2 -9J3~q285/n}t=Ԥn=x铞jo Y/jtty~W}gGq׮q`Jz 1->zzכ`TX|76f@1!=kr)&=ۉ7nڳ=Z7w?5ubSi jj^wcO.vlc'Pk`^w2'& `L$!%D1Ι%利^{FdYct:@KgPQ.V z{g_}ui&_wo_V1c޽}ݲyOezTZ2xp^yYmh]1\"OC^p^+:CVu>;zYQ"!MF3óO[HiaDžT&,ABrƐ1vl2dI NzCi-5\,'O<ߖo3=B'bF@K;okէ[ Ojkv/|SY90|dwݡv&n=,LڜKH&m p .,nrv%=k;JcST4 lH8Ѿ\"m!cՅQ%hZB-THKڈ(%' ۵ܗSؙBWBR[+tԙ;+(ݷA-!:@ub&m;5\ I(qtgfC;ƽSnP7V_Y>`ӳ/+17n;\5X؅TOֱZMq;qFKv?ipaU@S߭y8\YC>Sh-_5/ -5AlC=PCXmp/Qd×à(֪ ]5mzd]L[9{P;GEu Ϭ}oϛvC͂Ck guFײ?|u$M?#qH"!i6\q 2 z&-@ E/LXT7hqT6'(Y0D.jpH&M\#욅S=㶺e|Đc9g|qr6S6 g67|ch8$XJ@  )VԾxrn!{]ǎ?OgM^f,g N(0=[o";)mhRQ/vb)׈jK4fs8nu]eKUC\|M[_17Nq Mu [#n|q#QXxlECۤQw݂`ޖ4Pznh<b(k)PT!JQfJS&fٺ)l{&:edO.WXm%5Ck8 )jp5=io5ײ 9ok0h߯,_؛[J| xUL,QH v1HB)vb/mb]/߼Q~JTwޣ~ \M|CQ 1q<Ez ^HGI䭤|m(3 MsB8B82})r{$B7Hn\I1i"H.l3$Pdi0`Ca!`6ԓ2⍱"4²GTo8;=~7\?5SW'8ix9k~c \6hę:8v!fВsXj$EPCC7r)j*TxCY3@6a"7\4 }g / lD#ol3ªjet@]t´G'>%.bG W1g )Iv;bȁ\1&-cPQ[!ctg|U1n|XcĞoWܡ cSquG>Zr8ҷ Ë:^> (p @T&Hx0أJ "3I,ube^S57aRctW9?_,т<&.ȇUc Rzg{ `3!d,x48O1Ba0?'Fkɾ}}I] [ ̪솺/g|6cjy?J/29na"SE ܰ,f/?+Hz eW60v==fP7f#F3e3/]98K(ZxE `뱞!== =Mz1։c"l8kONk=6[KK'sp^:uDlL-MSFNqMN[eA_I*wU S'#w M)#OFcvSǪ7S(VM.D  @O8Tږ$^;,+pJ$ҟǢz7_%ЗD\,_$^NpM3DѨ ҩ/[.?Q [bB 6{zNAԞ u N5*n1t nn՟4?x9C蚤X]ڗtj;OĪ*o21q3u zsa2{v;(ꘘ <ݲΒ̅]i}xRΙ 1z?2A%=KJ~r/ Xojֲg>/D^S;,y(wKA3t("Җ.繈u$4J:"X'@,(nQE{թm,ieK%>sa]njK:xymNQ#Xwn.{h3ݲ4bnx?& 1u b.xz煊QU;K*&KDjgi]][| 략Ҧ͸wۈ{W-dKKbbAJuתݏ%g֔L? 8  ~fz&_+dYDxy搧fõaM3lɷc*fEh EyCmBQtk:WbC۹Ƹ8dUCpl-?$Pl\zId|ʾFS${vB8JdoTnNC1IT?)(@iV)>)@& ]'\a{v}}Ɲ[ov/5zus!|y/~y~ܛԓãE TDAr" #xҨCN^)g:G\t[@B 3jۈz{c{GnG.Go~qM"0e,`xJ|6DkRxqơ@!7v Cr]lhFutw[xfEJN8*C#J@A# Y\JMt2ɹpDLbˆFJd*ܶ(˾}d&vgS&P*}b'4n!R)|֧dAńŽ ֊a۝67|e02pt;io&o'u}~2vx23VVpĚ1S]D o0zy@B2E185ʌ%Ħ ~$TRǚi25*q4P&q[ԄUq\:+~-D' 04"TW0LT7\2R &ꍨ`UH=s$\U}Mjd?zοSQk,\#.ٯn`7I kُ\YYm' +4[/ Y!T |FXN1l06B<y 8*vjkJ>FґuM3*h"R)%P0.`a#A7R^wSm`=$DиVtNjQ qw$NP1vS09BP_P NƗ KSf4Ǭw.T %a7;B.s[GT 8,;|*e#ȑ+ hfc4y4苌hg.~(X'Qמ,52 [9DZ%m'dK&L^1)M(˰R!@_d*+A76{eϻL,nBh$c"TwY Zm0F5uQmXQ ==c8[&9%ҟ{w[t[f"/;/= fDpq pHˇ!l8% m1h.fSqhf@M+`YLk.^Ky E[)_*:n=.̿LK2~@Π"Xd |p\BiIo[O# .EA8W`{ v?Eڸɱ3?; nRxhUXAMDS eqϸ D'ZI|l^Nhr7=G &j V -U.a:S|Om@n>P6UB7! ˌp=Dn4Nvk92x0Tp@e]JRp|prOn!23 p%<`+FyڛQ&7_+Aw&ʥ`WA3ѱ(KH$&jMdbɂz3~<#Ǯ;Xec7'x؈s-3a(- $b'mGd$^,8{*eĂ*ҕa!6;U#ʟrk+}S3"\kWY`B^6*Ga|ZxC9qrTR<] a*F˫8;NJMiDqb{AW4c)GU(xH?A9q][$ -@`~oÛ!K։(|flB^>`h$O2YӬh~GכJlÂsX+fNmf˪Qӎ;J7v_=m{7-$W9hf q 94Zf,r!^Ƥ 3 aIjSjNb`RHc=uY͋V_wAMjtu'Z2=FHIr.ڳ&؛Lt2y,I$} ڴ`c3w'%ݹF9{OújM!PwJp'b䑰/B8 TX}4/.7btkhR3Si^YVr?GcԪKH|lI|,,C;`F8?h}j)m&( [tSSM:ڱR_<J{`x0njA1 K%<LhwUqIDBcW uC* ^!U@1hW}KjWDOQy ،()%@U|y;]TFϿ j+`f;էOV"UIiQRY*I%;1 S1"tHɕ=Lsf,#MZA^,h8xD X$sFq/Xn݄JM/}`٥}|,ܓ[ԉ)=ݥiF>7hԱ(_;s;m׶?gekƠb-Po@Ģ)55cRq&e'* Z1݂Lugo6$rɝ39}+ gO я̖@$fv^enN)X|ٻJ"n_5y_bA MU1 E [ٯxJ{i~Ƶ_v,/'Q_Eˊ 4\/(4X;rd>+۫W˽:ō{^7vIU+NacQUֵ=žqqg׎njvvq`M$M'J_(+[a/d(o[Yt<'>{|?:qMkR۽܏a'G[>xGʺuݧ_zEعќPЩ̗wYS)˳lݑRse°v5^ߨq{ƕ}}] 7FDBlWc6d_2 w@4[XE0bTmRn6u*ߚ{Q;sjVįSCn}^ah-Q)6늬ݩ7foBg#U૟)H\W;1}}d WJeV`"2ڕu4\צ:XmQ^^ Z׭dJK-v/JEΤǰm@HS5dl`5j3<@UJF^AaiV:'9R3V9 o>oővd9|#+vWw0:W/TڡyͣrG7O_IO{ɻxnȂaMϩ!J*52#!@ ! 2"FdSdeQIDTFDĪJ@ġK۶mmlBr޵9JCkk]Qmvr_6`ɿ8tS&J_9K@Vf[̷F\2E}`ݦ[h>2n  r0|9I4|9yL>dTmL5F^G:!OtA&ml _G@:b,y!~Kl xu[JʾEp~D3lo?ɠ1:>4.RX' 5UpMup K= 'VGg OHz]'D \^앱O gx;D鹨Wd>ԣzITͬ$nG, ߨ#NON>Dh֙@3uƞSPkg͞w \;vu/%6c#0Eh3yOr<(ZGO( /5=W"gEfׯEzeSǀ}bDyھ9FpB,F*DٮQP-a2l,JX4{43"|WR`bDWACfb|C`f5"#v.t>Vo9ӥ8'Fk Bl|gYl= }\sIQ UGvLzh#Fu$! h>4 k )fz BE:yg=C_fcYjp/KS `[l@?կY`'ɏu) A'bU9 +[qcgZ&Zgv6m-F'g :ÚJu6P,MSqY0HHŌv&ihk4V S? UP7v/_d4. ]?0g.D= MC)ir5Y (G،XR먂,W{nwt.''HWBkqY >Þ] {)Hp * %y$B  9JBӨ.5}lSXJ>eL|]dL _\}}UIU}苫z/͕ ],[~ \ S񩨔HsgrxOH}Kh<4P~з4 חqari9p|74x-nwSiZwpw Tt^ ?OS{Tr>i>ђƇ_53E3&,^9xDݧ>fk5ir^|mAԮi_\| eV ] {1;i.4~B.E%6'қ Qmuҩ;7ѕ;f|"z)YJҡaQ@_p,s Tr ۔M)D[r(<]x3{%Jo7Ypڻ _/P!A H r'RWD P֊ŴZNnԼ][MU~3hp{szM]9>:ACUNKyׯ\WO)e뱹coo:iSͷi޵]86yܱ-/MU|WğsI*M8c=dZ$S0T%E31SSgn#c7@t'/{%trDnE9vm0@VzEFW,e5G{ K_RDXsI8*fLI? [h:b0-1)R筈=1;^ԋ؆?-{X*TG0tjmkk蚯JW~tWo[#UednM<8U9͒0z~1I?ҧtG\ =Pj˾D<{slO|sZ1DT/Etjh{Lѯ6tv2p!Ֆ8&cior*TR4MHLTH!%PM(Lh4x٪D6feGpFhtQ2vn*B(IL[̄r5XnoqCoGh<'L_Kx>Ɖ@z61H[4pV c ñ\{M*mT: VEpvWs@l-w X5JUV:p(rn q@ECظXzY)'J|+6mVҊKI*lVr8\Z "1e" x7dnwz}?\*/nn]f-W<حRQL-]BȈ8&N,bxO);Q\DePTjCѫzq]0,;"@HX߱×O0\uySX$?T, |2`9deI5uIvuS>-FUww-1nD_{XvWLrx*=V^~E2>ijmՆ؞Nћb!Qc"ɚy->-l$085hw к&0uLwۧIpjeLb0ɴIxdX>ժ㮚YӺ_zT+`]9 ػ`s'i>Qla<#Ϳ\E/>~NKc,P},IإX>C"L&U/g%痋Jլ᷸ztIk:1^t,Ah*X.Ӗ<|[6>ߺoCCխc D:8Xeu≤'CD;Tc}P-}@4Hx-& ?C b(Xv'ztmvGltk>y/ѻAWvY:J|;ZEl}5b1HWKƃ@ i (0To *FqiH%УY@.Zab`Kbn8@s3w #ts<芗^F'Msl@Rxl"XBژ9.6A\3,b5K<ٺy6Ӳ}awN7~*hsܩ="' Ͳ`!{*ovbٌz a:'q"@jrH=&6kѰ}1Iapm ű!VT:V[ꭅfIً If ȌM;qc蕊x:ZrP/ WM+I&X KѬ*Is6RO$铷 8͞+HG)]9=u\;D"^^%*?Wn$మ+ g"lU# {`zHЃ N3{+EPk[R-V -1XZq6X]G2vY #؀=ԟ~5,q*qbɾT>p^bEK|T<6L!3D>MYƴ1mQ7&ƶ|<OH N%qȂagC#DŽtThY:^RzGW \a5Z NzU,y3I 8(Sљ|&65=Yখ}tM42 0&-q>bo8eqy0A.B#GG]8f8uLfD^JC1"PQ`">hڽ%b:)68ٝD^TQأNd:`nN"J5^0TwTG_1e (%տ&CdHG X2 ,LD t\;ς]! l; a=|/)iC*64Z*b(ۖ8!tKIR3244lN/AH2"_H톞֮Uw$wW&u>H tPJQԄ)>ׇ>wDXs(  82j+E0:*D 2/d-R,J28x}>T5GBC8BT x]~Sw]K,3jq4:`b H͚G*ae,MRY4jDd2`hJ"(ßm\b CC*!28ƒp`\u7] `P@`nY<aWDn\׷uoY[;DOzXJSZ ]9b+O5ӧ<*=n@1\LJp 1 1b C8tmmB}QQm8S8O4Z-@xQFH͎-A&mxK}?{Ěꈑ>Y׋]׋c^gfX+|/Ev.'@8/IWQց =xX0ϣ0ϭpRA-: {4N?{QfUWKu-Wku3GqJrNP&cqg% (@UQwJ,M1֗Ū[/^L~pMІ-i.)8R䐋CrEđېѦG ":P= o~{cބ0,L6C=˛&2nɛg6|Hr!9өQZMԬ-Hc_`'oshs҉ Ɩ|l.jf0z&_˦滹Ά Ta/-tJ eQJ S ;EB :2)  e6L%]hK6eA*c8ܚI|wYnU5/^.a5Z[Ob؍w}?RLܺ| &M~9K擅] He4c - Ew$2$C %AL ",.Hkd@5ez+U⹺L2׃L'1XkaԪlxdaj}(vtK% xg8(k]z]/d~n/Ts*]tVB$_J3) 3)SAd^BqBT\(ƮIa QQ >u7js1g{ȃй@Yg k/OUC}*\#&56A"`96Jy]0`^ Kc$NDVη^Va~ИVN9q,.[E{=]4Ç`37є';) @+ʦ:hJMH%c1d$^%vXȃ%K.`'f& Hb1v4j39z\y> GW+H;);"):( c@4%G"ntMht:L+hYp2;QyMO>V=ʶq-{@AO_{BM=X; _^+bnc.&GtTHFD:h8Iӆ\-Yfn"țOΖyryn1Cgmr ȥ8Ա'FGXpAcl*֭qjLѢoS[t yFHDDsbS6REx1eoJ5zĈ]Q58p7NX3`Ef+j\ۮJ\a~];CXe:̻w~7f {ꤘ_X?E@)q kj4Br߇g?7.2f4X" RA3x 0t^TDxe 3f$-lxG}p}.弾ǵL@8ԃRG2KhSty @-Wc} [\ t YmDhOw袅*zV5q>J!Ϩ^p䊣tGd*׈DcM{pUM,;UJrFOc`ɺI0e6`yJ^+5q̌%Q#~{Ppܔ-%^K/v`t I6V/+] ~J )èIVr7xEN8(LQB#=c<84…i%BH|@]p_Jp5l a93jA%L` ;^^0( oΕ& P.#CZNQeuf]!]_Y[~J;MX-;wmNOxM$Rضه7 NX ;--\mwn@qf(aÀMcF)HG~U>hVe$F/4a UBӆv*Wދ[*!`/Fᐂ:Pr0Wo8%;/?&-Yב[Hg􇚊{VIgg!9D3VjKf9!d&?|jz=KD@PH qz9QL1QH }<%Om5ӗȶbQx2jc"O;t$hOnyؓI_,҉3u F*}!TTi!irn<@6x< q@4N N};56d͐9c?pئp㱭NuVaX@\1|IZG$h1\^xʶ;3k9ӞݥN }Ld#:}M{&ǾV c^R9K߬ze 8(lG3#afRF<䊃bMֲ#]ZC52sO&܉ &4403Mx{.> 5\]3(6'?q%rl#_o²J=c$ȳś4?02X$(;,,/r^fL {` *v 4b'dBg(0n:`CfܜX`2اц[o{"߲6)i]gRR 0xve,R$/\*/,/ US^:SD@eȋ,/<50HJ.ZP uAo?r'%l vߺi,gv'_W]j7Tac߆czď9_ aeB^e*[TS&n]G0qW H($֦.Rx+Ǻ=ߡpD{_3wG77'\%@?{sѩz}< vӺL!l! ?-g(_;Wk:@7,]~{UCy޵7zn7>n;#7|=~ M'Nώrmėuwtw~o}_7l{z]}᤾Ym[2Һ֨xOn"y JD :-##F-h*, X|#ݡE @iST 5(496$ !YH(3 .b"ja&GTABg,u rmNM7cS?ݦoFm-?U 8l(kĂ_ޥRuJ3|riO6*qpGW2^IfxeHY t?g+&BbI65q$Yv\'g;'zT`lLW DaD>分R Fa)Cmx kW Ee*'YV0Q`u==}gj5 ڞ<]tm[8iŞ_ҧh{~VK:!Am3$#qf8fZFkW<;y?sUvRZ$)9Tx:<(4N#+J&"r &3.!\Ѩ't! c {_ϼ2촗q,`.ŗe7?}o;oƿ׮F7^cMSJ wCvGdї38>Dr-)106eh~SmkMS_h39Ml@/.?K+ @^ Hc>UD83N"M*rŠ,޲q/oǖ[q5wG֖SG^맇K1!PB'Vr~Pu <h/,H K9}_1׭t̺*XcS$JK+!.hבL%z JB)iI\R*H ^:GGF;DI~ZF͕@tPgiU&o;rYޱjڱoυx.aL8$OgF!< 8 xHp5xfʘW+u,bxV4hoOʠJktrL.p_}׮}m~ZO-[sn_-JQ1J;vdKSw[7֩u4.F9uX tDM>(u*#6EۛkXQ{~rs 'ҫs{`[m*:{Fm|G"O?CB;U>_<-gyCQO1/j~+=18=Ƀoi? y JC\Y“R_ ~6^س>/ ?/,Uyib0 03fҿ{^&_J#2WROHRmnX5<1Zc-cBG+l4B &tCO% xQ}E[7$3F^cic_)>F6DJq>x. Cp`#zh,a X,$blinVeeeHet&xt6Qg|) $.!wI9 %D!jH;>0`AW s? nA5ӠBX[}HsSYs6g{^sw /Q7wZwÌsjL=̴/|j冁K?び L`)>6".%rqqr80;S);F#hݑDp5?8΁`{N)W- ' t6ǀkmW)! X9j՗P` uO)-\Cw23[jN~ÔȗX b5a+RYZC~ cS7`i e]=~!E?=͛7T-w'Է?NpС kq"GX cؾ_?Ii:Rʨ~4y_"dTk^q;{vJ*Ȕ@T?;7NC Hj!$.z欟$l $c__YvV(/V` J:.'0݁fļDŽ PlP0P/ϡ=vJyW]S>'?4]~uت}ۨܠgʂ3o|) ^:NkVBKxOSb=i_X+m`_F2m)|0I]J\1?6p4b蕰ɨjH@9)58a>9.gm-svlIZg+(Ppܵۏښ/ɮ0ɝwmM]?n ToP;_w"x;|Œ7LX2j Jwk0gmCƦT I[$P+¢R $OicvLb\xp>ξ+vO.b#(*#_++2~xv<:) k)6di.B8 u#uD]G,&3Up)\'ݫBT{8rcG/ռ_uaJ ٛiS89V9B:v; :WʒLY"1y)ON*S;IaBq&rImvI8?1R~#I `M*撶BVȖskW=Tԗi/[h) ӫfOjSP`". P@yl`أ8N,n>UĤB1J4΁Hؚd!{+r00.>U7tuQ$9̐da#QĻB]g>Mş6ާ09]7tэ(F9.1($k7&ƇA(3' WϞlΠ/lLVy@ĉ`mJLJ'$mf l R@q`b>f@n}\8P(pFߋ-h-c[|u[f┯jG.T-C}???ߝ`?Nw@$ʀ)!1;0=7F98<5F"x>] &t~0c~`"M}HsvU->R'h%sMˉL-.A - c3xh9$L=1Oj. HHGF WW$40N-kquQxǁAm`HDDqI]32kOy"XX+DO2oوZsgzڙ=;1ӘId{I E{iGŜiK$A2ʤeifmfʰC);vb c &, C@P%GvcdîHlZp( ڱ{nv=ܓ.ߊo*T&*|7HBtB򣡣~;"F-"u YVAOhn(tordT3xy ѹW랸>w`K?} {/n9Ee_;ݣ_ͼgogڒsZI 8<*6Kcc[ %R$ ѱYɥ&eN U> +0l@2 $G$LQ Ӄِ$..Lv hLB͞)C$Db/* g?Լ'qC~.P5oRM'Ftijx) SID`.[I0= mr1];k{qD v7t@GwzN{⍌8^ZzR@鰋\}w*V1㐣 =XWPRzÙ8 ܘ߱be*{"SXsX<;0ߧ^]Y6u¼h{aL|VẔ *k׶Y> ¶l눃p+l+n#!='?#;#?hO i|x>1Olh-1UoVf?%ƃ~߮|vYv?vkwG[~UDh?3TF[4NQ1Ͳ^q7, y*#yʔf ]:k!l?)/>/~euD{7~26py<wߘ-{Y.(oh.l#7>;"ڿ!le llOd}ChA'e~`vaO$Ne8og57nt<xN\+I]oX1Zn]קU-O8O,Xx0^Gbn ׶Yo?1~ :sJ =lݺ8^GwDOѮ='Έydf{{G69a.2c[I/ĦJAvE"飭=My9h<;dlOCIt;C+gy!,O>B>%f!0eY d nq}l9\-[kܞ1.G?kb,۳e)~WbNoj6T\\gwYO'-UV+:?UsjWu)و~4)'P&կD Oqf78m9m?sbgxҁ^OJ,٫ Zdh\ڴ cO}zBCЄ&lJ;)@jȍ ('NYAv D=wUѶk@NݽR'-Tϸk"nh)~hvr,M_!-.R:R:ܨtBEhq׺+ X:m+%NAw6;˚Ɲf(Cʼ;|[KпLDC*P2R~$aK/VkBMhXH!PM1+,sՋrG.nq4B:,Zr͊4SwtwOKDDћE ~k(8 c #P 0tҁp~1e7>2!5ӯ\:]ԨS\PLG9\_SwB1'Ybݒ9?Mv %Av BԽ yVZYTvuZuGqϐu(D%F DVN4Zn+aip6^#bܫ`Q;Ɔ7UE KQ=מ[U~qf=oDn<^+^|W_U9;Q@1RyXSƈKSo> `" ͦbMNeW1 m!khIׯf$D{B )Z kXE! 3~ޢ{kG˾]lG ;Ԇκq`71vWd XfzE/XLǏܒ& `-a)XR !,Yl܉+<ب|F9x1>*`j$l#Gs e[8d>i&Y;tUsӬQߪ;g3{U!Rg<@P^@b}F`ZW'y"dX@,_ EC͜(n,`ۚym8~0〲v%4<`k+J"Z"yL珷Gخp 탶Ըܴ=JL]r]e%b͕e5Oܣ%g{|! @?XM3e])-mr"hgps𺼫Y!L|1T7-wX8U9{#LG0wyB}8j^|'W`1?cQk)m _vKZ;%i)bM6F_2W$io0DAnC`f=) rp 6Fk4+U HIW ,%6^Աɨp&r BߑQQVA{g(SnqOڔd7ot-K^7/[tfJ>-}Ǐq>mBS1&-Cg7ՒhȩJМ.:]*(( RݐlAf"z a&G1yQS5 hb Ā;XduaED0L3sy,|A0`,ƆBQ=_&Ql|o l&S!*8dz{etݍ9ٹ4 `6c5"ڹFW!8Nغ'sԖG}4✯ĞWu"%}HWFX""uzۺg3U; -`?~+Q C1tTJrrTe#ǁP7٬| ;&)rB[XA IR!x,O~BTy@yHI4|5$Qs\Z{fDP`U^=}Qq#~z_TVD"9c-(Cdfederu&rֱ8uG KXQ-, vNm66: h1z`W03e{PjZ v z"ˎEBdUX #4zcB.B3L&tY%ݴ{bȔA3>a 7OXl)Oxx#Z_Ag KoNºCK[o|ݷ?>sǶS/*ӨVSdaaB?d% 7+" a(Řj]}R\I@I&Q Ƈ,XÚpޤoB2ma%ߤ+ZUTmYV,\t/*e6c諯ƏI+7my 5{k_Ňⱙ&/d}'`NT-|$XT Y#v(@I&)kJb(Hid2@>hMwcY>?R%N*/z3D8JoRgb`G$}0{TX@k {ktkmk_ uԩ,2kYf01>^H%qb0R@ƪKsE&hFeNׇ߮{6~3n[NWu|{0kOoYXSri7atHZl=y9[?|aO"+fhU # [,c$Թj:ΨDG4;!=}d}K9¢*[.wޣvxDb}Y|W E0%0U "z*@ &z&N?2VMivBv]ѐ+&Mat檢oֳ_1`1U m}.{6\b%Zߤﵡ6Z9}Y~'T|w`Ӫ+W vz# +!) h4Y<,$Muk@mtEI&OQyWp&$oipߧ_ }+I^+`)q%{Kx >a=P&Fxm[o*2AiUृY @LJ-\e{~Cե :lYeu1z'>tѸWt9\n`8 )t1 RUPiЈS/5,%GvU[ڤ!- 9>f),Ռ8g4bR>%nv@[>VW-lRBv:P@S"0I.s5mOKMm=>W?Ƕ*h L}=% \5P`f?Ck[ah u5tY YHU0XN]u7s*eIU*!x0UG{ڲؠ*"L&H6EEHa-mwJ兝[7ڵԩUdh))W~FƏ7'`%<Ffw_亥--eS?roo@!uC<вԖAA8,4CɠpzzCd7B.k+=:FJyUsjˡq{2ŘR>;#WǼ3u#.9)>)iycH(j5[z}XRrdC*:Ze ߂jϧLa#K*{/y_4.wn8 >E+C@CauoKp{mۃ^ᜠo>0(leDg_,3-=T\~joZv`Ήt7QA̡E\.:I݉%I/}KL -9Bi2K(Q(8r+C%*|s L)j<聣˘GrI6!NS|ݾ~P|F|vj?tȿ;%Gh#dŧX3\ڬ"0yܟ"\\VD* 5նʕX53:Ls_74%mɡ}?h2GlhaLw]O:!3:]8k)Ғ#@0{Hdb~qTAPMqFxAJͱ,u ;[U`һ/FK[d[k@@>;>M m%+O؆KyyH~7=cTKL:o)_1rd_5ya" hWڡ]8{i {Ȟ3G-E]6F.y.r<{S^st,JXsǰuH"kb׭Ov5zXֱP7 1Vd5u3ƶ`Ak SEtأD;VW$aN< И9),[i %~e&eDZue.Q#jIx/[@˽<%ES2>-hY:znҏ&ЮBB41=(jOzalpc nh{l 5E=a[K":$Qt>\i;Xm{ޒMey%酷;ܒ[vólw_N&^=fՃiKCӾ4qo3O\UߜӍ8 ,JK" ęPBLSeFIge_[㬵n+G dAE t]G|֗R3E#!uRU szu2Mh}Эs~@QnQ+;PQ'ʯ[HЩBL.-C98 ]q@z+CQ,tDȩ'U!B_T<^w>~2Zңx(4@ ԫ:_wn.LAolBwcC EQ[(]9転sR o 喯!L) TGIyz dQȱ%e9J<2q%=LQn73ygtƒX>@v7u:::Lȡ[H2I Ķ d%9,Sdmhu Dل̈Kqntr9B7.]ԯ#?sx_YIh [+.8dlF|-Ϡ] Sdn +wۑ,X}񵳟>ĕQ4⟀c)BG+ :` rVsE7qqNy?sίųxOwYPV )y ##L P|3pP+M/x01$ιS6C9B( d>8P'^i:)'E#Ϡ< jOE 觲Dmm¹3џvИ>9 3-$>gW;7w %ElRցB@h2q΍}$<tO#Uƣ$u_ M vZ{nս6:3'B?{Q~EOs {|ۧ$ d9ԿR(7d/P૨H}3Z@F/ġ|\BF OGKЮ"+;_0&9t*,\:.< ]AW=_[EߣPb|-eC*z ­gW?-! $f:.?QN=&:Yb.HI.(&.L\͹LBx=H"@Y`.ĂH^|P3\+p.}Y8Kgn1UήabvZ}FblOHqmGB~Vw%)d<xg?(tu4/ư;ѷD?>tZ\tNBt~Na, 'TIc*xd } *@,? 4"t~!; s5h_X 嫝}:t;珘E38yOB/%{\V{j~ԥvbAK@_o i?]t>=}N7=-՞^v{}&6wwzk;%>OMmm+{?` ( PinCt=AÃqGNg;w| vX2cp_v(g`!=/j`齗gZ}~kﻫ~ivR{?LK1 w@ـ3940z`ԁi/ Ad:A7tonC:BDžN -m*06-7m047՚3}hhN2 s+͛-)tKԲвjXGZӬYb|*nAQk{ưsaW¾>G!qS g/3|xmD-6ܖbKeJm mklGms+mwl-<{}}}}~~&2:@d]d}KFގltT稾QaQãRң~^>zGg?}+L%}vwhCS}/&%&=&;4fa̚m1{bbŜ9s-ǘ0az3 4,uشaÏ=7.nJG|iYOƟM q K'J쑘/Ļ-7GccGGč;bʈsGeG?3~K*LHZԘaҧɺdɇY0mulQG]cJc;g\K&ϻ4ۂ_.X4|sK^eΥl锥-뼬ﲰe×,; 7T٫АCqF8{Cm809}ko;pUzZua՛wU>V}|&g&&fO/ֻvuQۺ[o-x錄MWwޫ;pb'NTXzb'>qęq։{z}קO/[~Sugߪנkiз!axCJCzCvCi†5 557mmFƀƁƄƱ+W6nkXxdk?6m"M^MM=LMMIMMӚ 6lԴ@S]S}٦KM6nj>v2d~rɅ'>y铷NJ8wjש G>{}3ng||&\ }}8ú?p=x'^.\ .T]8 gn>ٷ}__4_tp10ϿҖK/tRs\ҝ˝/}yJ̕WV]9{5jՃWv;îϾ/=屯L_mjWǿ:yco\?߸OkӰO| q0E-Wt›)W&Ì2̱Kuʰ(9" ij>gH1m|h'cD<餄osTR,8c5H OX%ݭ.W䗏P1L -`gb*ds!R:7r*4YUuB cDZcN%yx4L%eB_JXxXE ^'H%r*"x$z[f0j8]\XOA 'B0jNY1$,<߰[  Ǚv Yw.sM0gX{aWlcP>-H#a;޻s(!pDo<' Cd# |Bbr`Γ 06 |Z +Y9瓙^؃:IRR̅# `#/ˋRX߂ּCݨ;ǰBqهœ:Gi8>iH;0,J`rv=pB'x}h_ڏbW`JM>vԂsda8Oi$>NEP #&4xx|">&ӑtMEcq:tMi:4ow͠O?NLE?{ͥ3hͧt&-EKKh)E[N ZIg\:Χ Bx_LХt]NWЕ>JL`Out=}n&n[6,N;o/]Ex/ӽJpuzA%zմ#E`1}9ZOh#y6ѓ=MߧgC=K?'<@?"D/+*F/W~CGz_7zޡw?/=/zJB F1tL1w<ᳰ fme~8dڱ dA#:.+ƂYwփ1;233 V+`3Y!+bŬY Vf9l.l![%l)[Ɩl%{b=ֱmdfmeسl;{`ϳv2^aثl?{` VdaVjX-;[({c`wqG;YkdM$;N}β9 ;.Ogs. ʮKff߰ow{d?[g7va`w?/=/vʚaœp\܍sɽx܇r?x;ޞw<|O|$Sc|48Nx$VÆ'yMN'Iy"I#YMSi>O#<>tsx.x>"䅼^g2 ^g9|.y7*ق1kd#F%// ?W| _˟z 7M|3·mY?wN_K|}Um|$XϨomceqk0Aq Ki-ʜ^VRlT!6,gv!Sؒ%93*􌟞_6(0ga쒊s+׳akT+Bf&2,'08;!%szeEP^)+l1 *T.0Z}X}tW[E UgW䛏KTdGd1J< $qѧ!2KK3EYٙJ6Cgll>W?(fV%|l^>5UW P)/R^@߀Jy*T (U5ޜj<įj<K#.įj<K#ۜj<įj<K#.įj<K#.oNT5Po@_x%~U$$U俪KnNTP_w%~UU}G\Wq_weU}G\_weU}7':̆IS*Įj;툫a I@T WR*Z H5/U@%_@J,&UK3*r1Wq2TgaҎYmfUbz,VsE,&P_,11/vϙ;;<Wc1"@IMz. V=Km]a~Y4SI]6,te% fF!$fk$Ei,fLor+V펕Ȝyy^yXS垹]arXPJaQي6KAZW0*ґ6X&+ Ƀ3 +<QJ&mxdW;>,w\9T%5Y]/admGD #h#)@k\m:+obJl ^e= ,%QVaV29BY27?StMa& ;\a4-VXmUO9($Z=y+k9Q-6]MUœ _WB iMIw .-,2)+\Rn sDMH%e Ts}E0E@N@q~NV"1C 7v-|Z/VcT5> 6mlz &8 һWLU0TLN npb5Pa9Z 2b@Ę%#zD 6qW_q恛)'">ILH=1|}VEԧXz#֢Et؟RDw\{ QAZ]\IoPKjPFCPKy.Fbangular-1.3.9/docs/components/open-sans-fontface-1.0.4/fonts/LightItalic/OpenSans-LightItalic.woff\zsp''vmolvm۶mnlv6m|띪3siW9QQr X`?U&8A^GTLXD~@SfUSw󃞟A"c[bucho~NO??A mbgjh~3Fh/5wH~4LM~8 X0m~|AY;p?XZV?:@HUZG@mggivN C&s0u`Ue0n?k(/vggbKp@ JI3.:2 (<́ u( CTFk( ҈:`dA>֕͏>*2R0-DDHE~Y]>\ `è^!R>a}\m .w ee(aAD[ :V%O\'t`UyQxEhk ]T{\&fKYukSf AtNDOF `X7~|;@lVuiI5^^3WA^}7*]vY{̦#[譣^b^^ )u#n>lXgMOU,,U|p"gԃsWYSlcj^Sl{kxCZ=FOɳOs2:Rw-<b91"UE$nžSro`0AWEZ&Sv1-$*t[ PhQ_XO/{b!?7=SCCo:n==޼_Sy@!1}ӰQcf'zzY uE(i@{?Oȫ^|IP9o8W1P ({4gQwlLDl5eÌ qm2pX8O_|=qfv"V,J +b,/('[k[<~,^U`zDS8uRwdzEȹ%9n]v-ZR6$l![B˲fw75kD'6X!)p[㌵dj&4~q"_R7Յg覍aFU4~EaqD'pngE]ō*V?w+tܘAk}嵶ΈWr?jf-Zρ̻ǂOj`̓l={tͰL'UV2GB{o׌hAMKΦƷHh1<ƨSX)=t#^z ~*@)x6aGlKiF{rx9 WhA$H #!`<=HI y!ZgcG,QNr[C9t#X^;|,z#L3#Jc4YdbڪxylڪEY;J.wR%GYQ(˅%0sq58N3IWw;dGLqg|(>5.$ v= biJdc~R)[ǩ 8b7 A1zq *Î@m_LH.uɁr"FlnmVhw(& ћn#L{_EbemEo}i:lٲ4ԡW4@?_co햊v !D߅>*!($pdAtDXX/D Ƙg1/GviN=ﻮsʔm=ZܮHF6dw&ehz&"i8Qp)A" Hcv&Aȃw}$Nwݪ?gXTzRj1sy$4qdȨSz"vч`u [(\^D~+:Dhص)&D+ֈA&*mԛENfPeM謍 o[Rbo2 &KxLd{W$D|gW1jePi*:?`ߎxL䨏t!# ,㥶,a)ZR|"M$Uk([%!/!KZ +2:?$m] [\Wr}-E,Hncwj5 {g8,ˤHdIs/7Y:'SV㔝<13=|_~GGvBCd{S 0|%/_F22B^t>r..iMLZ6eiRޱ,;٭))êF˳_hgδk/@;VjrS sB$̓]9_64qLkȊ47buVܥFZDkB 6 }-6ܒ`IL8M&HLUWޮMx3S_7 n7-Ws(αȞ3"W̶ L:SˏKnЀӊ$GQ[WaGh n hFAJtMӎasY5Itk)WDU|Ho^Mz"^>-ѭ 9GS_K:ܿZץz|rҺ]#fd=$]xg; gmç} 0 Ϣ !x]&?RE|3KNV6\\p[DMwqW+͋R{g%QFS8ot.B] jUn(n^*$! Ԓ 4.JDA:x Ǘ+ldYu+E, X6cZĸaO% 2\JD̽ɣ{תs,9kD~1ξatZ8d֟fyc}y`PR~̰3/(ʇF+fCLyh:۾1yE{v ߩ=M[mxjlj!@΀2AҐE"#PƑDUۉ->Ɠ%#JHWK}P\ ]]et[z/YpY[BD|=)Pvp bq+#fEXuY]qejۦQFfe> oebOYn ¥L^k6VӳȖL/޷jV"soRh/#pG%TSZt M`GARXutk(iTvkgBir:lǶ-ʖ?] 2_,E$P*ǧ^q;ggGǞ-ܕ8|m,%f1~$:4 uegSUOb.gNS@jKs5PCk:K7?B<(igAS'*Lё#gǢ7UPd -`k{ џvaszXĻnIQ$E}>\Y(CvPdKvwt|Rr| pl]y zѪz* ںZX x\_8 IR`Q ufL˂{ OP~̣1qGƣ/ai\~lUMS~c ړTP&PLP$|?t9d=$ rZ2OG>s{8j,MUc.hͼ]52T[؃_j1kf` nmo ŘZ5#Y{ u#SRڗ00 9u}I0F2N' xnS䯯'\g_cy;ޟ}-z-i?Ʒ`tvXJdf:©lFQu2р$gFВ M*Ch#8rcyHr΢:kU$Ҩ(f SMA©p=@ކH65TXE- =ٯG2[y}$.M4nI$}k=W,򶿏uw|0=ۮ/\Wٙ\U0%ʛ N‚({nN)q?7O69 \sm[.O?SW`%EC-L97wLW<PH䟂(@19ԩBPϪ&N3v 4!) xwx2+`ajhV ߏ*?wgi7=we&ԺC?=s689-7,kBzjr}?'Wk vs'f]h{۪eQ ! ׀a!> ּd%t9h0҂*ӵ}ՅXfQgE;Ž4~7N'd ,k݇~HhϺ-~ '`pǵn2c!n핏DkOug9}݅u_!gT.l2.M#qb:A:ъ?ls{Y`uIh;_*_JpTPe|Uл_'|z;_.hTi^Dջ\ʛNFQ}_F=F{nl.?Eu9 d`{nNkBr|GߠWuN@PtKv݌@E\JOGj5Х+#3 zξGa": t[<)2?>U%JΔ]iHmXҰѠq:3dbP4J3 ͽ&&IM>w"Jt}:7{1 5+7 MoHwظ|ؙs lnz'gv#"BaǮQ;mn@ l!j֊O>ݫgQ?RwQKSv}vYDvX/"u1[e;< %Þʎ2 wSFP EEEB@@#EqCj8:!-4NInKз ," 2%^xkgh ŴP'c_qi*R#0gJ= NZcLcOB -h#$ ^n $5 w6jؔ5y;:-P+C.c,Y|hygx$ߜ ijEfY_jz f47K AAqe /-1 >u>{j=Y ̬-Q:)e򡠡^Ww6_3h%'}0҄f\d eZ$Y$;…:]]":i3O0Cw/TQ(FKCHIr^KYrUU(uium 6M-ة!Ԅ%bLtRqnI)S w>J%.I\hD<>VfK]VƄ=W7;; zuBe铯$tRBgDC\=G@,U"Ҷ}TW4NIhѝ9}kv}k;8yV!~¶6rPez  º(ԧ4 ? @Da21ŲQ ?BhaԠ¦(8;;*?G/CkGc|~2< ݽ}>@\lw<6<}%`H 8g,8lV\(dj@dT-e?4`Ug `>8@{e^Br^v[OLk?ti7Rŏ(ӹ 5F[ kc/1;1_lL?̉gwK@q[.mV^@FEi{ gXN΁[s2O=/If$";nvI] K_"Z2 iRCTyR} *~uWgPҔ6 +rf9W,%R9C:xKt Lpғ?S`,LWu(}j_mtpm/K}vME7b_}4CTgM٪\?Cys*e?zG 6N -.)/aX r~((qAjǁx6rڐk{G8V>p2|=ͣeyuLZԺ>ص%׍"Dk' +艫8 P!-yذ&:dkWb| 2alU-`z}6 U@%!%MS_z}X/)<'quyJ&b1+&wR+k99Cu]5d/b#É(S.]Fdw v-,'k[M Ske}B8JI3,9PcHSQ2/ ~ͳ4sDOqSʷ}"ݼզR kJ`#`{;M V- eS.WWH[0Q-:ȩ Y\\MZ0F4"݃<~ `jDR*p S7 j"c?oGt;yTfMu]qiILSIFL.mWbSN‱-W"N-SD]<0jsq΀M}249Əj[d2>ꅞX %഍Lwù&jD0S7扰ALܯ{3=Pе@l 3bq,tS5CnJŧ %Wυ}xL>YLl?74QnZ|攥I:rm]s:$v-I+\ޜ4Gn>Y %(gOjzЀxIȊo~3Eċ2&3'x ڊl hv$o[~x7ZenN֍F{j#&^KA^_޹oe!}ôiəhY49|QCA3#K6͹| j0/`He/RO,p;R6GY&`_CxBf3JYy&T D 7 dz W8"3R5U-/fd4.+CWevu~,b"r䫜^>~WYHޜ}ל nZNKiG[;-W fG_Lm9m|(P"5?CM aWGGcb\mF/A\"`m.A7u=V<, Z9dcaѧ{Va5M_~]#*M-Sj #"X3 Ig[FOH Gl._~_%i.֋1X,Y,DΐO =s{&ޔBKdz!ֵ6nZ:zDIadjT˷JK&Z8YE3;#mcR_Aͬ1pHG1Kgeܕ‚p,*grx!NW9噋4⒇ <,x-p0 Zp'5.X$iLuBA%,>KY I-O@$DISFNT>^MP+z|φ[ }uX@{S2zv{$QW|[]C$-MR"ϊ%”F)$`BV/|)HʁԔc!=cDV_ 8†N99y%n4aWB%H~ mG%KFp'~fm-캪doKujD HY-&{fMECHٚVן%' 8?! m)/f4@.Hì]>Ὼ3Զ9t6iLq8ƇPD1ZI[3|]$~Ѭ-PΧTaVK42 eݞ,S3^5~"v9ŸՊ RĸBg,GjTeHLc^^A atk@Y;Q,2fFx 26KUjt{4WHA5t-'e:XUX~Hͯ}jT6t7S]r&g.Ɨݲ |Fޅ"'8 <W̖.~>۟ER6w1/f~vRbyxfy t:{w@U z۹і*&n8˟sL,K.{C,i>AWI_$%Xot*}s~ӘrˈABKt*}5@]B8GbWĉgG9aĄnQ7ٿ]_.P % ULp}oa=DNw1O*Fj#a9,b o#Y#Kza3ډ_gOܞf%rܑq2hW)Z%%lIt)WPNu 1d7{C(6pn* 5&&@8ʓg̱3ϹADc,>ʯw,9'[ELyO=C*S(DHf+`}g8Ubв25| qyva; %3 )j -ZCBvznN7z@ٲ?pX.goѵ$+w_kʆk ȒNd:nBnL* ts[p'MkQ=V>|2{آ,LX?\cx=EXggn Im)"!qbK`~L}6Z v+=qQv.dEˇҩg'(վΗ A|\ љi;Gh[LYD'@(X~TxjrgT8i3guEhҽ$9mC prRd}钵y 6+(| |޲gyO9Y:L<+*eQ׬`P/w@N8(Ӏkd'$2*M#3KCZ-Ifiwa@$B\/+#DkG{t. D'6wD@қUQ} wi* Ϗ~9GWymI+|$,s3sI/|=%,oPkg³*˷]iSp=e SVě{DDYo)Kj+BsHepV }D{HQ3"pqduRh[ OgP]ٰSXxr6%ᗣa͵'wK"+B[8U>Öf(3ࣀbg);Oj,ZP>ѯ򺷴.ԟwK ![qy!ZY .bYkcœ1oA9_LLuT4iqa6L59Y32ǴVWgI23+v%`+W{m6G%Q{"QoycT^}eV`dnPG}UowӖ`St%j!URq Z1Ȑ㽛D s" \l؏l 2צEQ5V][Ny_'md^v1,Gvp G)8+:,CqԨꋭe[\84?3Y#ʁ4#m{fQ_᳛X%@mD>[y[,徱-&^Ni=Xx)lfY(M8@IӐ(ϱu:Fq$oVPyb;G t[W+ /+'3G`ZtKL{@_ }|qJQxA; :|al-Aq7iȓ%.n? 9WZ^&*(7I(†Zdst JK~uro>Wyw=~ |z.Ѷ.ʄ:JT9PA!J n~@OP Td d+}h|B!zg1Ơ#I>)b2%)d:Qニ68AYJ@KA@\ڄp4:l8V. #b4$hL,&,YU)GF2CMNe_хٕAOsSw/!4/ 6RKsACF {w7-$>/Ka;rܙAwkYAvQ%. <ߑ{9*aO`Wxݔ\b+`$,[y,J @&t3nԏT/-'l vCSt5m4XmDmQ}TX)ں ʟ+Y!Av;LE]}kYsn{U;Bn.DIQzY]6 nd=>uEt *r36 ,^}Scs:՜&OtqNT -saVT1ah &f)a=='r_եckMM${*')+4N7Z^#5dA)iO -a T L~̡,[m$Bi`:t:#q%,Uu3I٪<4qcg8\sYM bg^5YEjtCHsvnKykfh O=Ο~^@ 2y$+n4IҞRB{7X[/=?^~>0+f =ikADU*8y5K))h秇CjTcK ;0겭b \Z^rÉ,b6ʍ:]݅?5J#s8Wfx$ @ >wksޥTja΅6bM9Q骲F:)er򁴉 Ÿ$a]l~b/Yd/{/8㸋r:FCG9] GQ65!ߥ/oOE_W-J"Bo~-i\uVX˫QJQYY"!N@:0MT&'mHVBZj% E>f஡_FYZgr qyӳx&,qkzu*u,w\]ԃe}>MWS곰7ڹ; b! &vXjAWHT#ڤ]p'jdVFe)=33Q~!AQy)Pyg1- /OO5v[)QAzmnY}Y3L5RwGϵJ Gq$ilf[6T\)oQ4JUt=0Vs_ Շ'cV*gTV)mZ{L*b07-lD6tSj\G/QWα{欵ܔ>1epLYnT"bB(S4~ެnƿ>ԴH)Qw`Z} Qΐ1\VgxG٢m̽ +(VzC`"bn˱kدwU&;6ur3S\Wxqro.'r:*xBc,N$))1J dÐ>#`FK=!zHoZ6+Qt Us3%J@cQ*BAJl/6KxU{]ˋ,tYjpgL}ZN*?zs%"plZuvK/5y0}chgԑ{c2z ^4'D(?xu./L3!E{%ZpLk 4v N(/@Ɋ~ w\(u^KXNv4pO(}Zx+_(iupZ/*/kՏ)𗨽1:# TeK^ r%Fg◅|ZUQ]|JIWYnVtH0@.A%j`NFWmqux `Ĕib.h17nG<>;u|ՆCRZӒwNҒě-~3RVAK‰.n_M=l_ JtX,OVmŜU|Z-Fwi8Mb܃1{%t46HMJUy,2`;ݭgNnalON {W˯E}L{jCDQ[B1$qp%RbeAIMώ,{kӛ-Kf'Ρ_U!Ű|D0`(0AHpb2Y?ofڏ鉖L}fs{' 401YJFRi!A_MSc[]o KN{Q֐^+@[Ww?e\NuBTzP;}9$um'p" +zwayR٠lu#q*6&O3M${U[f!*2&myTI+qyCQpKFR@ߔzO hu:JlL:"/^$LlT$Vj (QhFAIzC,m;bg_>>Qg;= +Tz3_qMTLŊCj:܏%!![wLyoW{^Fs΂YuˏOwۭ&|;IqL? B[Orُ<_:vD|uJhI-Jݠ;F;ϑ]p[9w>㖾90K5>_;M3/笷 OCGr\8Brk':6XVm-M֖{NZܴi)`%|؛6R^b/B}yN:B*!3o6}^ݽW/|޸?*ߵ[U5:nN7ԔT aЈ<. q%d $7rb?:؄5z||Wߪwǟ3+'9Ni]ۡrs7V9,Xc )6Sl-m,tOqB&VixIW%,tp7^X6}0J=~ "!,,D,GyZnO{ .ڙ,Gjqq8Q Y8ocBUxcm'csړZ4ܦU8)>9bЃG5]5~h5_ZcgggCZ<,"Фbt͇菱Xm>gߝ̴ Ckp  x'utIP>kQX~(k=4DWOD Vv°T;o;H 3NP`^=Nlic15.CYR镟$OQ$WUeҩ7G x)v!J`NXgH`J7uCv& a~gK?h` 9}}ljmgKJ\EtRytS1t 3%0"lRN |&;Z/Uo~61tuy"}~Aj9 ?K}+^35R r\f9M؊YsmW@Rچ,Gz ]Rι'˯ \nh M.1f#￰}.a$|F1s'߫74=dդed!I}誔#6ݣ6QU×a"PZѺ3h>,vvx뎓I9xAb'hIXAf<6ٻKMk83St _MuԢ2{gU*K=+KKu1Jsރ7~3t.T{:}|E0bw >{:͟k<0>Džtf $n[Ll\>2K khK4GOFf}bʹyjc.::y58"z}aD,xTFˬKf{,>D2f!yUg}\ll))@du)Rh]̙CI%[ (yBmռı|0:q_ .}̍Ӕ>Qτ>hQ;q?"e1}06]BZ~6kky8*qCz4zh-,?ӻSsg;_Hϟg&?G85Xo/l!WYHeti=ߤw%^h?؟*Q7V:a^X23_%Z"`7Dy\h[#ƍ,Pjӱn( #4V|m+C s#"^n nYivGl7^g&60Ӆ3#|/G|O8._!V2 Zu&殱?aY56Kt܁=}=ϩ m!RARK|_BQ($Xzj% |</1!vW <5AlM**xKH)[a:QB5@ LUNZ`^pM`ghɢY |LE}RK̈9FIY.W@ScQc㑮]"*4E+7vN; :~ԻROM^6kٽ}DGǧUr+qP NjOi` ~lI_cP״hFy_%|BiSX/@DhvcD{~o (ڲ\KX xaN`VQVp`Gq؍_ke++vw*~ub?t:` oFQk~I1z_h {yj6޼z|aK˨\Koϗ:(sGC$ EeEZէAlz;:L ͱ4Ktxi cN<RMmDEke %L( z_GCQOK ԧ BYzhg*ofgM{jogO;͔]f;[0SHWĪG#l #X7inܸ)18?tSG8!zK,huϥ7V4raS2GAK~쿶*Kj$?Mrk#\gݥY/alKaF#+kڎgFLF/XTNU=yVΚ_ҳclCa;:Nڝ;viS"4=wPΙM˛뵙8 =N#S*UNe _nY4xI)ǯLo;wo @=TYX! 8#XGLX_\}# ;i SF4$Sli2Y=Eb X{$;Jn2zM6N #b55#VVZKO㹰m&#ϯ˝ӓgv^gU=}joZP_‚s~JVNq,zpX=9L!tҦ'WJ]Xhp'/vZq^MΤ[ ;IpRF鲰0ڭ{YCi$1An%Ԝ1ەYG7y-z%%8q?;z1;w#;Ѓ+t`#!c'n/xV3lxu )czs_c_|[Um>=u(ext>͡˵}_oOP36$>u|mjk : :h 75lkǵ6?}8§B{~>מ=o+4x2ɭ}jF;[^vîYKKgacc;xLB$ 4M(}98k9+g sJ#qΩ$e2W~01ޮӏ 9Q?Jπɳ$5cVC+GԘ\EG?0 }Tݠɣ :N{bM~ZC[,!O8@|w<dVt>KӧSN֝?D3b5t?>OA[M\k&^w8ڒ/.rR6]BfKZ:20ߖPN֥!9i|NS6/+a}u+^xgNuiZ@3GSnbb 1?!{7DvC< /9-i+Uonߍ#'pӸՍjl к 3K46|d9&M1lTUJ}c91_NG-[8}{ aܮ~_?_8/p.cb&ݣ ȴR刑Eݺ5)W|رD`CП.%4vxOՏ=\3Ӕ٥a4{?yT1G/ i-Dyٓl%XPv06vlkd8_6.bc"9+졕H09K0q21)㤸h~8Pn;ϰ}?ٚyk߱`!2GwNNq!9偍Y 4?,p0U[IJ˜&ۄu:%b"FgB”k_gǷ^ Yz =xEauxHY{IKW:6 <~I|gj]"x]܂ƉgR|@ڍo<#PPOƋm)jϜo'n'_XH8weUZ4#N7#a㣨Ҷ:UeO:H$4! YBC !AP`QDDuuqàƕTuwVGr_"b> .w||gz}Ts!`|#qD2aE$?3F#Ss#%|sG[i|$H[ҐZ^( pO9䦒%G I10 }l,ϓ1+?5C+-ge-Euzm=d{YvsϪb=1|V%;l蒍?W1 ii1@tPg{]BzQ0r jЉ*։jz'*ԉщ\P[3}nzW .;XfVS])*8;FXm)9̅N2-A Nx&Tj9_W1p{尲O~^`駊} t2C gxAu >@!5ڨM9e^ ي1 ]7 O0˰̲}\[*rی$wVaI,ǣH?}V Bh6@aaB14=Wd;Kly+& /ݣuKjwUD_^A~ }4dN96i9nkL~ Mh^տoIEEIq[fXw-u}UˑG$'S]mB]z?syxePd?FXP4"c5:x@_6!Za( IV)\DVQϢ=|> l[°O۟peXA4eE#&2|%&~:DR5F%=-,)w]ὂzwb}w}zd{KĮ:T'X'IUV#F5ޙ)?JC~p -qo(@`G I%ɩ!.ұ3Dpշ{@?4$7Pt8p阍)y^nfR'['*νE^zeY*}m} rh)k.?tY|mèeEM/?ua6ʶܻ^>]7/plCgUA?)(?}Q-#{9ί;~,ln&c~gT`XvRg݁6a,Dv乓)߁)Ǫq {pc^{tTyY~M(zWY=Q/`"rT¨yr/#=g*sШȶإv=,,룹 Jb1TrޗmxguQ/xX|-ʘL |q|wn[b!2 R;#=-SR'(}P@{R{pj5!1!44A!T1t42 vIތ%,bvM-)m{Oyio<_/AgygQM_^lM{}pFi/ Xtx|f*KGZ9DZxr[Ruɤ]C^LLͦ&HfT$B 4 %QvM]\I٣}%Oxي,x{ 95%I 'emNX$$vM6gb*jb,r;\,RE[}ԑKTO3&M-"}khܠܨh$I_0Х zGJ@'tdB;TyI{n nPRitmؽNRQ7@O[KNڱ$gm"*;y9nE#-~=VW2q~K@w>HC\؀G<Զ~ىfg~<ɇ^Rl3G*MrQ,r}Ru\71 wKMWjG=C?$OZ՚ΏžvOf2CjѮn fY j.GU ^%Y?T&*u āoX0ڙxpj#7mBsK~A%Y[?mҞ i*KF@!^>gx ǒ\PDIT-ԕ&[6eBe.Li :kJP: о&J0 ,h  Hp qQg-kB.w{MޮdL!h (ԒPD\=V_:oIGuO=r/S+|pHp7ES\аT!T2e5}N/H>=3hDo[>5dm/| RE"Լ #["өu ޫ[*^M`fgV8qewv.hΪ$<4ٞWLD Mbxu{FC!vs ,LW@NV:l?L{iԡwQh"np 22ע6.d *Z)m83o_:FY%o7OG`9Z5+2(@}]H>"C&!~c{ 7QKԜ^v$ 6eK=uc%ë6M;2f\Q0WC?Ƕa;s|28b.9NRdْd[Ϩ]vT6- fI' ʮGPm܁,3]3r{N[hV{& SU?o_{~rk:xy6@p65aɧ$+AGyP#pw3v?˨7I<˥/6#>I2N1{I?eCyd;MB[0r"Y6;;-g-z3njfUC̀DsY\7k!`ܠʮP"䃗LƊ‘pߝ8+ZgԾG.wG]! wӒ{ϝ]vf̘iOL?Yc*_~ eeǀe+5|5*26| 7y,VN9oDGXUJ{jyN.R\p. lp 9q2vCPΤIԮ?ƒŗ5}}|{6K70raܹёaBcal7.b&i)fǦ$R-Ɛ{]2zZG5[)a9¯E{B~E9 N-&g|8;\gQ jυQ3o:S/ 7go!~hGKO{" bY!n0p6ΈgMyb+;!ަ !d`:`ru[U>(Brс'JƋą 8.Zjrv@nhtP($FW+Mre7Ygvxkr4VN 4V1j1{3|/og}+~t 1}}1Q! O\(W\L 3%R>vbe€Y ;sW)^.GHbV,V> z;`l_IP$l6Dޙkveζ`:Y`' XX ۮXЏUTQ9uֽ7~|mVl!q¤cO9<*X%eQ3զ/\zFw|iZ<<~^~(aКLd'h K[Ď,TjZ (:Ej0 }ҕX+_:3z_G ݀9XLψtBW@c`ђW-#U?,\}'vt9;j*AM0 (--*b$Z1揼E>zl䧦*W`Jߡ3n?1>9\`IJ@H˱d5m]Vywt*E/݁*0j%ZD^A}Xa=UjH|(#eI!ANLҚIy4zE* abU$vkt|AҐy?[{CoJ}֌Τ^vtt}.KK_j/;tn\enފP(6P쨥&$\FcMror}7(3H,ր_.1>?WAD8~Dd~+krY!h(80؅p.J뀕 o{CHOL9}J,V+U4){M,Mt  e%$ r@ym%d%WE`]XAD8*c\\{0v'[\<|yXO=a/EKv?Ϝ0&_gi8MC?)顋w_*L054"AEA}1{|hОv 2fL# o0xߑEa؅GlBM2ц4ʫGI?]΋9*Tq 愌ࣥCL/INjFUM}dya-3/\;bzӥvUMl`l+R`!(ݎD JLok1!cH5%5g#χDÂhHЙW.]<(MJJMեݩd̰:(DÍ͍) WH}ТN(n D:euy_:A__'mJSS CXO-fR'ֶ0auKLBPJoUE¦*U5JPG|-QIAխ>lvhH,Mҧ/,j7PW5Pi6;Pxo,+-lQ9aJX^{ N%L E4 ¿X:ሿ:"[TNyBKeI-'v3rdX+}{/M^S'?*u GNƟ$iv%_B0RkYn_@ xzC|VROī䨦N6=ՔNŪI~?G. B8}jl|h~;8w cě:#Λ؛;n yXfԑ!TM>8uԥ7C$ =; {~ N iWԭ27qF׀Zdۄw[a +m*ս&{MA!|H-+u jW6S"H*/ls a?j'oa[F(Hڼ=RƾFG#t3ED!Y ?z^ nXv+&c,Afzv'fie,ݕYF%gȚ~[췅Vm݋<]҇O\~==qt-?j:gvmNW''+5DOa>~s VZl3wj+c2:Z6J{(  ]O8TƎ~ _ 2ȡ4@pXbA1/vbV $I콇GZx Deދ_ao0 ͋/|s :' 5sk+L],3ñ5Û ;MotRdfK'&a#ulF Ck?_Y`0W C4d>朮-dRȫIC{sbQ.}kXxSKI4vlLVҌ#N!enHg/z83:/}֧^EIߖľsqmcLr4/rEoVzJꉝ¦ lm%y.1+IVDWHJ[I^kO㔑Hڣ[$~y.jf<Ů@5=2W+3+FSOPҾW)75d%k;•YJwE HhJx8qXU!Jt59qW>ф]g^ܰ hB?Hzײa95T/yչ:.?x{!@@v(Wr;O5C81E2t$w<50dk ePYɳg3gk!`ʒL;?%^WW|?IO( DZ8<.@c"K/g@=j#8OzÕxG襸X>R#1 팛.`!ˏb.3I7B8IщY+L%}h@v=Yb8=v4K1/HKyʚ^gFE IJ/)q_|ҍʃFݚ<œ\>ͱ:1e(P6v?ҢQ'ٍċAeg|v&)#]4b!X2mܐF`h3|RBf+=֝9W\@]2B ߝPpR@4B̂$.?%q qGNnψaEl1IK^9^\d9'u6'JxAAD<J,O@8A 7ԡK.GPs"uPjԮlbo?|FqN]02?KĆlY_4㰿N'~ |$;%5ʨ$oд>⣾+])58z(ȅ5(̔HDXw"cB84\zyKDB)|c_Ђ3J[ٕ(l;3 Q*]_DLSFf+.T *%OAg @18#ju~"UĊԵR(*h#4$׈a%u1HM̉d-dM0 4|bv2vJj^-J s{(1{>Y7 f/hU'MZf7->婂G {A`XC Pۿ һW{پ}˼>QS 3W:IPX4rNMZ|bzz (Gt'asH4ƈ`*@ 3QbN h@^[ wO?廎5qwJ.4kCeݒRy낺7|yO;\?}8?o;2XJyT,TB\hRyL<rfLLa#c%NN៥%`#a37}CMV[Θkנݷn^dRar=cto76)u_J#1˽"HPH\VXZ,-Ş%OSH]3OU)>8tr> `Cђ^=?n9㝈+ڼsQA4R!bsUi]IwHZ!#T9(Y'!vQE]Tk1cIg6_ _җxV+X+8cde62YE>N𕂽,aG/([n?P׋:Q(J+B$zB(pEvxt%RȰ:ԀVuʙ א^H0?[wMyc)Zq}{`g߶oeO)=ao/ٶGſj R/})%o|ξE/2z""V<|m\b[ൔʱ=.7QJb{^y!b :ؾȥ*"h sRc{`ĔNZöO,Ya甚CƬnoh~αv>vi7-9>`/k&% 1;ƷEk~S.ur==cb;Ƿˍ?&?h)Vg3ز XClv ^+8^!MzyˆhK,!('LVSubD@-Jbq=8 ͩiC^؂7}ANV);㮆lV3hx;'|o_Gǹ;m8;6jلuz {ZQKzdܱoRw4m<t>4g)0asGdm/1#%ev !{4:|-+j+b9%vE1 N " 6! dZ.'D\דNNg5Ǭ$n/}Ps^<=1қԵ )А0qcJvh LV&uN=ؾ[;hZp)PJkuq.Lm M)i&_O/aȥ wF-3&wBYuwe21+2/iPLQF=LA)ZީFβTdu ?L]VޓLޓ G!w\N0PuotZb /gY!n; sIhVeZԧN^͹֡P'z_*ȕ!9YW'wVH"BmOWӾxHJAbO &)CH>$% }v,/76kku@Lj-^Pzr%Ĥ T<'bТ9`+ %72E2lGT]jwIB;sV*KdT7e8t=8f0vXJx'TYdB<3uVA'aC95#)5&ˣ%@ B?fQ iU xJʂ@PnBGv8v};$큠* V1߱FYUpb1NSزr nPx d6W K=6|5;^vfd֤ x˶'>^Hv//cϼʄ@d]>bBx(؍6[X _ Η4K< Kkwy[~,RDW8R,ZG:9 L,z'#X3sdO,2i.*떦M7\憯GyϘ C߻cJn29na`Xe#7/ɮ#?Z$@o$cYL cw|"ƣB"%W5)5+[3Bc]a^zya T{L19 <7-]{/&/*Q;_qdѩd⹳2wrکň#_ jpEtZYIY\z^Ckd=U"=o hL5JJj5޾9l~)ҰpX]Dpxg`÷RӠ)|p%-Uiu'4D)uq Qc f)=\vZr qzP?63'rFKFCW?ܸT1;&Otjo#6źgU_΃ zr眦MV5F`LLڟC(Jr-u`肎Ȱ()=?Ib LO"*J)U)|,D`VrJA0|(^7.(Z+ᙨR35)4JgL}Ǘ-8ۆow#lVt.Y.Dv,DsLW~>87k*BW3*@r 05iPCzY=Aa܅@,#iאY AP$@jK<%N4-?͋dcyժ5=nMvCЋ#O399kqc[™˿q5>l;D )йf ZVr WNJ }[rəL]% UxkoaG.ludzpY[6j!1If?&X0&j\fQ5)$!L!ې:Sf7왊v}8e{V\<^/Y+ϜX4us#ܚ%sFwe/^GKb#G^o2_%r0$K\?`Τtt!< b!a%*F\55\4cW8C;!MFE*슲aFiಊ)}%1FsQxj-δkgݐG,0\wfUJu^㵝& &JKoԠ@ۺ&^u1Yg6uć圤Ñuh|>0.t)T=hw[bn+wǩؖ Xd$}R4h%DxS z fxQrhdXj-~V*^ԖFU^CTj/ Bu*`3'L{`K DLX1dbj%(dO3ؗ-3j|>ڔ!mTOX~ Ƈ 4Hu4o&=] |f[Cx攠óc+s|1LLPd$b.nϡ/x`2bR DH#Z1RD+xEv n$䀋qu%J\Lj2=ʏ5}3j;s\W;.Ijw)=7Z+ⴊH`I9] F`מQgw;x(8ьu0,틓~n11I݋M G;Mϳ3k-(_}=hvW^ڐr쀵ҿgH7{2}ΓX].U(5Jmqϰe-D1D6? #Am$Qw|*J\'?K:௓QABKx jBGJGԩ i̐هm}23BՒ#4B[BF8/m ƺm_I?~0Z#7}w'DfXFңBǥXWi :*r0TA#m`kL HphG?-6~(Ia<ē**hMk4ŴZC`CG B@*mȓ yv&wso Kl߶[>FYobH>p{k\_6Q؞l"yy+tqc-EpخkmPQ0BO`nÌLLzJ8>1\0]BcsH'PmE;?ogR2+ 0YC: UsBVj|=Nm3W E #MPС7R)Ρ&Yh]ڔ+NEDž N/7@Dd,p ONzbhl* deXdBj>CKeG݊JbADjJh7|Lڢ?.rq:-aT (@rZL`eeqe P; ?zd:'1&qV dz")}8W$[2b'W] 9LR6[ 0P ř-$(Nn{ ]nv,iϧ0 zuyЅd7iSMVWbM<ğVAf@H*-^{?n<*i)e~rS6#euS5nnao\03 2_Xfm}96vl_a>" "6\K|U]6X&0V0:VN+%S[tV_XBf ،ftt9r8J# (:] u`lPFLlki GjiW0 ZCvf`ɒEClEoy7u݃fNmFK**;KGPf6>֌pM5U6 ![ǘ.w6Պ9Xt\.ڼkcnZ #lRw/骕&&Dgŕ:jLhq&(2+TIn:${ZTB2'ksi*A6iqDU5OtJM:;{y#%McEzߵŗen$+RB}LؘP(9vIz!$8񹝃wr)Ib+2Ax2a<QLӥ؅ ] G {^5 *MfQl j5р Lejfe=;@Y-(jղ~-O?C? Uo?e,\fjo#FTǝ^aF0ۘBn0k %}! 8 I%OH25m~tCmo [{k4bOΡ6 ̂^EC 'dX_@wb";J WrbZR6+ t0 E%xa):Uw˞yiV/֤#k³= (L1gO,bέGߟst-fȦ&˘f#CkxBtg\um/ @Bpg{r왅n~X/-Tv&8P쏽aA ξ? %fHJJLɉ>ļҊf?򹢣?bmXQ/SImk3nΨ/>ӛq45L^hܤOXz-D  Mp/J]_. 7ѹ?$@ui=0cdL3JZ(h)' .HZLJMp!ث.F[:<,&>rLaI6~蟔{N^˷u$rSL1XJi _Xl4ֺWZE6rC(Nxd o9SS1,1a/ V.J)[/>@sS&ϒq D~R`b1g )! UII@cPbS&ݚ+3GBJ6h?v[23R^dϊFU3"~6(>:a\ SQl&ɡ1Ֆ\O'*삧/?Z$8D3 : [2-EM^wʖ+}w.:mfK [ܩdͷLAUZ8]^*D"xiEC dx O?b(j;a}::e^9}>IJR&+}^}`/Xj>[įK,%{\/1W'—. 0}9}J \!}=~~^p_S7 )@ 2xywF$R۰=7Qu`8f+$hTu̶tkW(E uǤܶ7QRrJ_pgw/]n\7*iבFtS\|+v'*G^4 %e'}. M.֪.twzFIϡGx_o>m03Ar'ڤoCe/S,0 ŞolVQXe5X,ct 4b[L ab?pm-)^Eepk{Μg+7yMc &ƿX"l6{ڂರDʰߛ\]vVLY2x~oVv.Uf?7l5q˓<ZJfܤi>G6[[.,=UzKbj4K RCiEEϫOrwZR--F^ O%Kup)a* #\B[hpLC;|!+Ϲ+1]}];a.cwME7׫&?D:;H\CQ7Gk>'aC]$>g١;/&Lӗf;v$CDLēN wk'7 \/c Lى덿WmNJ5^A`{;:O`kb P@j2փ6$l(OPԁA?r6tɲ{CS>wc҉}X_Y7ҡΕxOǿh"kW s@QJWITBq|[ڟ-xQ{ufNCv=-e}_|;ͯ-|D<^>y0|=cg{ʞܜJM~r{rQҗ(u(=O[+}R9`ڸ|*ʖK^C B=|j;cecB  ѬqF86dԘ-F'MT#IL"OJuX_@C$r(~Lǫv8qh>8bM y`_suB*cb 3&DFJRkZBHar|c~v?#gTv[&v 5XA33ş>)l˟a%9&\3ZH6gf"g; Q9=npXu_۰i a###]bhU(v׵zuX=| #ÀJ_( LXXÀMW0KM&7 vNap_LǷB9%/3n,On ? #DG3`OLgy>́P`"N|8LpXHO,o.aoB/=2_E*|🛎Ϧ[^O8_pE5ę!B:"bM P2b|{|y|ypyp|y-$GY^pu8C_V?<դusQ#|g;vUTV's)'~:Q;{~nOP;y<(.Mm-P04^\\6)nݺ2TDuQdRlE3[`IaK@Ǥ`|AUik  lu:S-ₙ0T  @ݒ D-Q^*2}{nRr;^\VrssPq 9~Xj ;x>J@^3'eA/&.ldy:xFkȺFo5~]^5vK+ąFknkpMzcl5qU݇6]{.gG <~?/$ϨR#[q+5zErNxxDiBb]÷#3 %+1 /Q:#E&~hV 89kС .լѝQН [-aJ@&#{XN NTx9"W$advfKqCJoȠ Ɛ2nn+Ѣ^x*';A+w}4ݝ{\ 1Tinur+WT<Vj/L?_y~W]`Rn;7xV!Vc_(f0ٹx!S;(&(\#* TQu{ ;!&NF)5ZN}t,`lF0Dt֮P {C /YhɏaZ<%L0 vJ>H<fCzug(BѩHQO2e=ENujuf=-ǜOGv07T*8Hj#TfQ;B(hўQa1Qr/e -VU5nmFX-wE$k˪P@EY6«X*YfVZORMq5 Wԧ&PhQaљL+WEKRrҹ;Hk{'LK$ YPɼUh(wߥ2/l -%K-NbCHP˯ j5]Eh5fEYJYeF1IYGܛGUç9[:Igt6$$-FD#`XdST7DDN@eu\FuÌ^_ W!9}ӧC\wwMtSoU[O= wL:ɗ^8p56vyNr-ډ Y4{ ʢR~Jڍ?C.*8!K~~ 4wh@.펠-g 」c$YHhx} ԅq/c_aٱccXe'a=Ǖ8TDNjVg*3bO(4Hۿ1:ѬN$*1'5ShpY ]NJ&~.~%٬`Uwڕ+ig.ٸ@ }@u}1S-##֝S?b&&Ր3d6 V}˽&Զ6U[eS3Bz%#C ;lJv ׽\^yA#k/z5N_cA$V )^ʻ@]IaB9={)=>sFu^ nZ&~8})kF˫oGmb֯ ƙi;ݝa|0>4//Z q$hSO 6pd kV^ӋM.iQ"?cT@z̗~<5^Ǐ}^)wǗ$m嘶~Լ]5QDoHԦ(Xd[20 a"Soanc'0F :(y.K4QrpMaX\IǙzJCfNSm?O`z Nr &i9#Y#D1"M@hKC;K9:XBǰYQXh*v5BM@#o6'dO0+}.ɾ>nc7麵+ag&vѪغ~<;>3GQ0mPOmjJGp/MfԾԩG #X!#k1ZIWgѤF.3&yXe+PYYX/륎@2uG.iH cq:N=ec\Vsut%L?:z:jII+HC>ݝhG3 v dd+ؐ7̂n70apkj-皪k?u囄3]'6:{cԠ2ӳ絤U,==.ymզ/^pY߁WNZ:TYzhR혫K@S:Қw|yɵ/=Be)  )u-s\%wCRs@:2\g4s z~]ჽ(xP%b^H:+.!Ъh}̐_MxYNjBjj8\U-w5ۼRtꯡ ORxo0€:g}׬zn;+z7>W LaY/IY`[eܦ;R`h'W?fk{4DgI z= u:f~wnܸXt95NkFּ8- tn=~|h@P2)A7{w hoK?<&f+-ȨR#Rgg0yaN9͆+n~y1&RpX8' :%{:=xLpfsB?v̢,j,YOc*Kz(L#hN->Xl7aϤd` z@gI_)D< bq1ۿixYޱLyɮځ½)k&psqo@ƀkv4Ø6r(*JMjۉ-܁6lc8Ѭ O c:k 38=ZseDH4/dBωjZd4=踽M/)aܶ{^@xa,g3UB ( {NF]lj!a-tߑWv|.uh%::V:@$KjY3ϪYO@%$=_ _ !nP[7i%_;0bȃ3RP 5hlp2dk;·v }F<;a0fXiHY5x}]0+Uޤ=h94m.lTfەITQfy:i 7EܗE;X$3Pd#Wʑײ6I Ob"l+GGuTu TX4}e 7g"iā'+;spyOzaWoS 'ƾ| ·&t5`5~}@d_ӊ5+.g<5F \e)T<.[pُfcB(zڵr+[u=vdϴ@:zZ>ܕpzfq'K%uY?֣Vɘ~^:T&ŽL5ᑮp܋L^7'$DeѾ 9<2L27 QJ` X?Ɨvy߿ xeunThg>UR}*zMmm) HRt]4{e+ci *xߝRknԪ>ϙ]K uXŒrd۪([NLWnODvmL0{m[ct:RTRiaI.qy8jG4+sp0di_}$?8HifK6Jٞjcjpz]\@JK|'CKEp1%~"KB0]O*B4u3us2^ߠQ5pаJfڰ![Hm8^Y_~˦>>!7Tܱ/cg ߍBS&ڢs[쟼hMŸ,qȁ-5*ܙK?]Td59,m^ Á3}V[%RS7B 4 zmףƹsS6|aݱ{&ݹaN>_4hu:^!Ř%#]m1'S hϷ_)][!snvX=b&T 'hW-M>蒎 S=8,D00llN-yeWĦlH5x's>N+ciԝxBtAS,kC I=ݪ(TBnym 5s¥Ʊ\v!!'8^?ࢅkn9GZ=Q?&q*ʇCx t{zތzz"xy*wz so_<7M:In9헜Z#9P8ߣU!w\:#1}]W/요△'߿FWv3^6}񤴃ŚW>AW7sVTJ`` jWk e]_ͲsF?fwm13f]5=(#8Tdp+p-!Ѹ]͡SC AV t*EJTo!M|)=}nOCzou.ҥ̆,{%݈=wsz1iwœ͜Û62契 &ih2ݷzXھZ, D ?wNSRemoۈ:Dtp~:~2|B2{^$bK467q-{4Y~ eG92Mt>è&B闓o8 % wX>kSrƴ?֐iUkH.%=k5@G0 aR^h3x|XSR=+']FnWxZ⠲ɿCwz ά{5r% jȺ/&&'cb''4y &oqR[|N ] ^ac|mXEWh;9 /,OK(DkD?m/G{'c )S.WI\<=yFhʟoД_ ר u<ŞϏ{Y}_U{gĭ/a}Eb*ע07aL]D?%$I0_f)#fHCwLF*^5I~^Cw+fJKxWxynCX=}юyݥ b[\H>#,E-!#Hl,HF#O Ig n`J=m4 @]F^C[ҘGY PL7IObIIÀ9 Tu1koӺ!AZc6? p,V?5-S n<Ъɉ &Sz]8s&m,wHH&xELh*ELŜUU;ģF+n>̘x4YUxAYBCQPS͹ʓ+V]FNh*7]S'ԩ(%[뢅_!^M[,Nƒ*!I;o3Ωs KlţQ3*)QyB03Ah&>IBJ^'`Snڎ$#.,Q~_]A]Kmbc6rKgfZ qK\Dm`*vJ9jdFGid#bP B0Z%eW[vgh!5hDX*6"I말r\K/I#va J?4^Ш.cuqlSW 2Ґ.Ip<'f'\j cb$V@嫪9ؿgre1śh熢 Q<Xj &%DYpM*WVÖ95c6dU rF>JhY#ThIY2 s޾iw`5ݵbʝWLk~[{fڼggM~[yYzes;.t5"6s=dXO"NJMpDž~P 3, ccJ 1fbVH L1U`Ҥ]Lf'@Կ 5bh ]83^ UC(G*Ԕal!s7g[ ڜSιl-K?vܷmZzBf$3dŻFӸq7$l9Brk߿XwIR[gyTQ1=^S+ίz`'g}qNf?YW M DVٓE g_/rڥӮ_$}7G 79xX7z@nе{]Auus׬ţGsuLp%I;{|41_QcAeѕa0'C ذWi4m#1l,7[;ϬpI&fV98kxVpPV3-V3'|)>Wc.]uWo阾e`͔O=p̥}v>z…pޭ@#0CW{К+'_=e"d6:+FvV6Gn+͖7έG*G@4jMM(rwR%?cTxkJ_suE8+bKGNy Vx[0-ᠤpg~ 3O=gKt7/[x x:r di(eA?::a$vݠ&r9٨} j^ b12/3Go&n_fVvOĊb\LglWhq nO˜Ŏ\Azduݼ/4+u)Ce vkb ׋kf:c (}fpfKY2/Z0N Wj4ӠԜ‹q sBh-Df3d$JYֱ$3`WzlՄ[GAwVZw̹!%KWF;\ GFOyaYk+㭸hZ&VFcd8Y4-܅G z=Ů{"Di' oY\L8Q{YBk?P.U yu;;, *}ͥ3ȕ2VZ=j F j}Emg֟Pԥ5m {[I9=wSۂ5\G54}z>,^ů\)IpwJ"شUV}Lygb5Ɲ-LMZamq1(*fI# N $+q#?^2`waEGN{HH? }LJhjIGҚwJUϤ7<7䵁w=&n(.2g<i'.LpZT{,15cR$9r3IBջo}Rgs9{13Ö0۩:iKDԳ3yv:jΓ**3uyYgsʴ6Mӥ$AA>%Mr@4yO֞,|ڡ 'k[;U3g:Ҿ 1?rh61-c٦<6@X#voۃIJʢi+oS5ln8TkӰk-Kneo;e}aSwϏzmHV!wχzgѾe֦h/5D}qfhǔYU"H yGXܸUoL;Ѳ9{(>>zÓW~/;[O~D&5fGㅳe=kӟ֝y}g n=@) qrq?bcS66F,:6GMrZؐ-nct Tɦ 4P2,vҩ/NG xkҐ5%7ddh2[)~Qs VQ`U3@[%=A2mE҄aWHnmqhdq^6]xJc`j޶=*K&@oELZf$~|2 )6gz&xH"Ճ})p$mic^U7P`v?T$lgJZLGy}K \k;΋ 4]'x+ p V^ק>x,-%'q&prxmd_7unG-?.r?\_魤9J,qWE^-?C|[-]SsZ3:h(_Hؚ>$unNF#$?{{wՔg?T^-W[ jʯ!My? j"_Zkx-[8N|i<\֢o`WS1Pw7h򓹉jP0Sd_ cw_ FYsjݚٍX#_OHG'ʿQ$zU#_ߜ'c쏣Hnj?Yw֟ۋQ`81n96,Gz 1rJY$[u`1 W"Bf0 }n0 <3jC  >O`Y;nRou5_߭-߯)#_~hOoW>~aNݘ_-kR~Oq/q{{aW/?\іOmIqڃ_-?"Q?<~ޫzYCx=JƏ~r<6bR'. ,~7%pUOM)?dOZ^33u[^gEmy6hʯҔ's&ʣ=G1{q}GО#GRB?H @2~qV*n b婝7 㼀S]j!׫g~dΪ}&f켳P!e[7֒|o~<'pA猭8X Mv&a估]7B~97wFWwzW|Y zpۨu~:zIrӌ\.KZB OU+#zZˇ+Z"|@K\t^򽸤{{hd¿pW?zX|opr>qJ']\똽ҏ, ]F+X"~\H3){]֢lPw6f!wg9GRz ..CH0mƨw7m$yٲoBaqbX(iR{ a&%)#S/"$?4#}",%[~:r;b`8 0V}P77{C[7n~:FV;,: C9'>"ҽxP w~'*2:h~BehR*_$actؑ@?4Գ ֝`ju ,"QDK\$V;bVLJvY*[N>ϕt/Q˻`T@a>\5&Z8:ѤL4QӇ1#}NzLu7~BqDh<x̝@j+|{܃q%9&sB ey qh!TtWTI\_ѵLYs1ЎkluL}b_ɿ8ESIMY@}ͣFFa,š[ X;u1'$]'PZ%jL8|*l(TD!89i΢ew׎琚Z7 4kSҗe˷6Ӷ/翠mpse^_ˤJ[r- ҩ3Nt:l9Wd_ eev&oQm%"qA#m'w:WJdؚBƫonحS.0U5#$?Dr1j'qҾ);]=GN7 blV"Йf^>7a{ϥi7I~1~htj7hp8RB+ICa呩a%͓,#m++~$`a @+ GV,a2͔$]h'PM7/~̕3VTyb Wv@u!W]V0u*O]hm\yQ(/=3!S#k{XiE-%0[S~='YBo"2:{LA^c]u(D-F,$Fꟼ]խ 6~_/p 3"+]pـͰWHe'$1"ƯͼS*ߙUNq!G qpG,"jG|H*:Y>'^vs4tPA]㝇uYoJѥ[o}K>vZ"9j~Y̕>Jz"wtuǩ,e 8S/C[蚯OVti[7n}Q@c:^}[tx,@2ØSDhh!]D (ӓ^gr+.ZPrt"eݞA.jHLrȔ.5/>zjǥ { Wrvǔ|͔g4Qs*am!|}6._qo[ˏ<߄ݸV %e$w!Yk*fJn087¨ۡ|:D !e5)r4.?`g)G .9" .CѸj[:ڥn}sN{pݶMܿueuy5_|$=2o/c90{x16sz5lN 4@"-9HNSo=V0ʼnǭlme:s@[C߅Ăί:xh4I8d`Nњpd1AKJ&6 } &_ ~a1tţJ)Ny)q݇|59HSwH{>t{V>+6MTsG_+t u՟~о?Λo89c bۮ{{u'<˂tOՌ&h(hjWI.rxd)tZ)S_Δdar\8zSC( !-_ܫOY9 1mp'O"!a:g"4"t\ v.͘}N^"`bxټJ' Rr&(e*ܕv?Z {:q>#sް˟k" HPLo&$}#]_NbEN% ?uœ zJ~ wLbȏN : '~嬨dZ @I h4 *=L|*ʻ0Uǐ4mOZW QsGV\4l:&N؇H4jD mcbPWvX=}Z~c0Q%^ѳX*~Z9ag!ؾvGs%c pH{)t .a/yuq}67عxhq$ӎ'x~$@;Bp C}F@8O"t%>Ry]-ǀh`ilP2+ 1U?ڮ"bE uA4Ӱ RKp6T蛈IoyE!Z^z_NKCI{Ng"ӅN4SCyE%cĚAڿ ["j-/8%)P_vK!)3A3~t؞mU ,j޽O9xp#Xv?{Ӵz晄_.Ogg^Ylg!7/K82~*^ ,d7F\)WjQHo8]Ag)t[B=y- 6r[ȇ\'#-v 礮s& a˘NB%VQonmi, ͑_&vlWؘ9p h,i(-!4VgjCss~3n{{˪fD8[Om͜fLg-a6g,oksIVԇOVZi)af9ci|< ͎hHK8:NÌp4vmV8:zH2ÍW9c--MHBmrƖ57ߺ x}Uv;Tle%{敥#;!SJW@OXrM#lZ f7.dBAW5U:Ѭ#v:7\Z+2D|_0FG(> (/AEA_ZZs]*i鼘+{< .Bߌ-ZtBz."'vl^w׭ۼn3_bڈ&┾#3ЧijI, qI$Λڷ&鏤O&7a qHߓͤϢ|pϮ{x/mK.?zUe#mD )=37'7Ni:*KI^V'41e 3} .LW$DrYx4 :pN:RȤe5u5t/>1F fxH~p]c||+*F,=4<扛k7U\>x5'tҊc[|:L|&&{--tDv X|Ow2C~ʠ!߾~#WX-С TØXLaGz]Z:>quSw >[)yz|Tׯ,bץ`3$nxz}"./kNzӛk5q} ]I~݉{ur!ŏOt?rN:Gƍ4n*|9s@F::!AI"%IjW>z6v-1 O ^&.qtFtt[ޛn_<^v ꗇpvR#|xۄO79T oUMwc6Q]Jo&~+xo@ތɝ⍽ePQ6=Ne ;Cpw';`p uڪ{?]T>}ΧP {4-4]:L9P$ Z O[40N%ǝ юdD0%L-lDf!5kgoE.ӣ.e&]q TUmy=ܨξ۫88`Lx)Kf 롬%{BY%CfU/K_į|ufd vKRfߠQ\|)qN] Eł'J [8;\^!n9aKpnWuQD=:6? K{[>ITq@$ѬŞdiѦsD*LqR%ztyݶ>J2 p:J˟]sxk7y' oެ>(-e,;Qa<9L҉)\ Vo;> ]$)y=a)r r"iMP:(O+26 ;k$>F{Rb{ÜgT[{>׽v5@1p,<<O@H 8xv=7)eV) FBOqɖDv\(]J=Vo$ȡg̒8țEg7@eAI.!q6 tIh ;s ~L`~ ^\giمF_1LVJ~j@*bbQ:g߬DÒP)ok D/2UgRթQ7d=-ˈbZ;|aEt㱼QF^YJΟœ l -kHb5tC5 $j"h+N7D Y_1N ɩ/h8n|,Na<" w; L>~ҳ" '2AJ \s.E`q"a^pwGOx6/>gTYׅʘ;@LOnpJ=s'D.حv?$0y:Q{w@e3}iX]e9QhT#/q̲7)~q;XՖu'br8W8Zk)Z3S~TcBEc[Ss3i-b1>:+!Wr2֥e.-m#0a&pQ5r3C*Bxf|fgT" X~_)_u3eJwd2¢LȢ2\젤y -MpN|?sk{/=w4wp̽aq=qZl}H'(R35L4{DbСg5H?LL uHTl>zPd/y[tO.v/uQ!pϚzUD=?ű_Smɲѿz㾺͒|Ed3|P~-6S1vNvU1b~|~E}b?*Gr91RI[~:4 ''cÛ)TsHr%) 1}8hZS;Ѹ6?6V;hPwKPqq#T0,rm ipK /Ń9Ř=޽#gEcN~jBo=i%vE.*~yf-nWz?kF~Ċ˗VЫe;<0r亍z(A(Mm~[ svp֥kC87Q\SN'e!vDDD /ey*-~ +ZA2+{S(6k+ϘmhG /DOgrݦ?γܤg9Úץ༊+]0̸.b́A~|ɹ>.W#:l 2{l>Y/_b72-PDN?؍-|>#vh#GoWak]^-©!:t)%oS|ԿppE~o5̓4Np16IV5댞[3ޅpBи9WW}~k/8/O)}*P~:sXG ?n, -u{u[߽SozL5ԶP,qSg9;?q<.q/A lF'ӼoI&& +,|3~HuSsc[o16_%1_=m[k& LOKˣN΀k2<,L0& |(v"?2dnR(WyP]7{54k(q$shsr &yUW9]VorCdUΞρ6%%1oxga=]%5Oqk0Ѡ=:FwXvVDӝNKϬT-gVd"M7 HG7hPmV5QU7Z1V>/yFV!F$4lv!l4'”}TFT }ysL]>XS[9iN4Ie+*.)b(y>#:D\QS<{~eBI3k@A0"Ljsb|RHLS /2N <{?MmVٛug1asr[s2%axLTf_jb&zD^Ԯ|T|kا!yR+[U"a )o;S1L2266|6maν9p|8>x8mᑀ={{{*70D/`9BcI=OlS+\ o ֫D<{~#r!d-jZa_1T侢 7_nQ.b#Dk3V ,* 6 ZBl!_$.bČU1n1C6[q&&7QcB6$1j͈c@Q=HXOp}h3GTY40d9(Fn{(GOtlaP nWH * 5Q={Їc>0&L&8!P A8`( m1m1~ۿ'WtpSşz&F?=0 @\or,B8 Xe齃l bW`vZ?~1Wfs+Cf9O !{" A ԥ-D`'ۉ~ܾIJmb9b`xf\[~Q#lj G )7+# h' i.V 4l)&lli!lٽ$j):&:i>6م,5}P}mӢ}?/Q(er2r-r #?t*LU\v2 ;Ϧگ);U@}rJI|UR |7Z)3_$_P r 7p_Lc;ъFd  $gb`T\v ^ w ]!wPɮ;+:&Χq';قGvB9C W9#3W閗9bPOL(z;hvxkM X';,yI}l͵ũﻂ2 H}&$MtIciyAe" )4R{0>^.zbtyG5,{1&>C oB2Rrq;ly&+{>FCD>hF#|/|F.n|7.ҁP{YfYT_ii9mvZ<p fDޥH$U)dUq1RQf[شH5ԤpRŴʦ?Mn1R )pT3G?2%edmSqt>95.`͒) ˆ@m R`/K a{Z$m۝fVѹ RRhY/uơֆ?x&e 2yl9XΖby/ׂo3Y ci.#!`DbJͲyQsr3k1k^aIЩw`hv_n9Ĵ+wi6J.v!Cϙt&|_Qf#oq,I̜qP]}տ{.82 MAQŖihWe bcQ݋n(˻h.Sb#vYҳjg|^ۉCԄQo\q҄Q$ޫ֤Hna3L&nQTnPKQ1N^-xɦk mh&Vy]O[yME;h%ZhWMIR wZb-]. vgMqxb]`@#z>֫nHUѬõ_{2^*ho Bq,B669rF}<y8:!W]\d(>\nQQ9m:{*aZ@mz8 @vtjQ娿s٬VƷ&b{pE?= [DYjHsDg)~'(HVLIGGv(M\-^Zy1`1`dfJ1ecNB܃N,2jQ!ii sq˪ȕSіyNHLP7TQT0W)cJ*.mҺ)&"chd`QF;"[sZf6WBDD9s HdY< ƒTR\9C-9oZ\w^&47Y\>i~Irh[Q+XY[DlL.ar"txu U1Vgn,ҁ ,QGfjfCᠨ.fmSl&Y*' (2O⚾q/Ԡug7ZaDck;w}kHքwm!E# ;ǂB1.~2[=(aJNӶzQ9Cj2=I9C]L>aI4q;FG@ ЦU[)e)h+@g~*=/>'vvGi3avuװ rs"U%v&hsWnZi?<տC|S LAVaj3N#(~?=*oA@|Aۤ[͙k:E1sT,]N,e^f1e'21o7U:!]P.W~ ɻ3iS;8&տ4eeʌux iI9p$s5݃Ϋk^D_T.X 0ϖG3_5ӗ.=.$4E }U@P!򕀀*bA\`dX^*I7~KIn8z%Q˸Mjv蘧g;FGPҔ^{d2{O0s=O {Kx^5`P^Σ1'>5Soggz~'Lڼg37zT[ލNX7?Ga(}ϼg>N|x`s?3{pCSuJ/0pLv]QɩSf̌ެSN?Qz?l3+kajkxĂ7 TR@MYNӾRX9'Aԏ|^7~neҝ{X+fX33͌U=bqȲub=] ّXG T7ʝb9O³L/_/Y׳2®ikȏ GEbyT^&/W+UjyQ$?!oFNֱq}ϮO^0?"MHHA]sҘXW/?#Wjyy>Qǁ:.yVLOżgg)eܹ0nX"T#ԗ]|E3a bv As! l|{< xCO+Wez?5]IΤua{'cw P2NiTaiL[!\I3RNu#{mg|#obtFBY,8ه\@H>[wiK~Oqy<,OsggggYA{= owdaȈ˰g$eed1>󝿳:!$vFvѧ?ѧ7ѧ'اЧu>t+XZGvOc=)S)iLi-}''[>}bS}CCõW} [6PԐnUשkՅj:RZR2ERЋC_ղz~{kk׼Ү_s]^fzW/]=jꡫCjW__5^weaW*}+]d] L<mMi]  kҳ}7EcB<ǁ @[i*`:0/v5c3-XK~ <*;0?k Y;Vڳ#+쌝uʺxi//;Y2v7D Vela#_ue80-g+jmcO}l/Ϫ3Y{U";`50eG1v`e/P9A$wc=PUeY<`; y< y#p>1p&m܍B5}Zـ930ar sSexr觴,P0_ŐSQ:L-D Jr mȹ8V(]P*]|"Tz>M_io}CP-.9~SoPW*Va@}||U}VFSOh8J2ر 6o:]9H諎\ br|c)|̭a]x]ycVxʃsϪ1软k2.3e`E|خA(JSUPyK+Fɐ:qMAQ26,Or:C]˸1bSZ= ֺ6~זyO}Br?N}v5\+nx0FshV0.+qh>t9KMr<Ȓ-і@Lr]ZlI*)ahfWbKĻ_F/=Ծsg*WڥWg7 T8cV0.G1q/YF<Р3`\ɧp-=|}D5=Z?xF2Kw`<2JLA#4EྖxclNdKImNHn.G5->#9*qt>SuA)*QgZ x*u9PQ xyRtӫ?`>+Q5RёS#W!5Dn5QѸqYkb]1f6Wu-i'%N*թILrUiVBJjZz[)]h T/?W砿b|xy~rnR/w+sWy]s"^תozp:?ސْ;*2t4Sd@]4/hrR y|WxTE7+((8ꂱURX@][lVb]q5/l[T\wŻYٶ4 tmt AxyQa۬%.{w]tw~4wxߋޙǏqpŒ#K:Dw;bE>yK-_귤= &MlJ.tlL #vTtx 8u80jSm @p c 0Xn @npe Zjkr|b3wI 7 oܩas KdGT=c3`m|3_`2 7[?g7oܰsk\wΗs6/n޸O۾oyyYYyy_t뗾~2~k|嵺_>ܳ/<3F5|X>Ы`"T/_l]0I)≫1zt)k & ր.G1m@T_CWbmJfm$ _qٔDLgaXwRV+TRZhscx_2r_7*(e^qv9_4-~|Z7eDCoȰ)|';dˁg7/NώU>~+V }cAE= .,nu,+@ȘXӾd *v/KƽoxbM;|n:Zr5SkmD$) ڌ٦?nJF_Twӎ'7^|wo_ZC: Iz/gc4v Is^%Tv+?WIWꖑ':]ӵн=8z!t  ߰(sN32<%"Y9>3Q-LQ fkvym>Dc5ߩ[-]!ZGg7 x@+e&am+e-E|A2vN#H\ҘB`{t_:K0dhϩz];~q6Z{?! P_8/b ]c-lҒwt-w֣G;zv M]$h;%oU2mu Za_G΂fq1usŠ cB ػfX+&/ zeH&rزj[/#|Q]F1]=~yT/Eߣ :9q%:Oѝ@ "He1j* dֶ'5{MV?gZ펃 Oݺ`1s4FquA˞B3@ B H(f[!&.Xwg"c)Sۭ{}*޹?wWOI?K4ke|\iHM2&`& Dr0h2g&@*E"5"Y7=2-]+gT^>oo]v=54S|sW|;`+'vXFVˢR,4"S畘)N &M,YfZ*&3h=FF)q$. A~tm`̑(/>,yLmZ - /ʿY_;*wb RAIaMtV]]Ü5p$cwhg7-%>`MݢN@uk^T?{<o [™Y 2X7Ø Es9/ci++}zHt!t4soYaw+.^Z,ܮq5U˜@WP&(+%ST]PO3ZNR|,f /S7H,@q[ip_in/&$!n z7,l+]o _+vB xiw9bb&_\SS]i]7 2LyD}_/8 U}k53Ac^DȂ6.#CǤK8O%z pL%aL4AimU`Qz>QDJ2͒҂>t"LIrz,M6O6Sm3rv FTZwoe[/Y٭vyYٰp:>ƚO}G.ekګ˓uj9a$VqotC.bB&X0h"pD.,1 k5`+1v :&Vc.1nчmQ3 gC8|79RZC3T7_~(4qf ?;:W{W t寸iz*$0!g>sRp1qy.7-8M%lht2WFnY `kK(go*._.HXgbͫ?QX!kX3tgRA kVԟ I9xp&zkzvOOй.b_0pD&ʧ-Ҷ1f`Ƕu5#dsΦ07G[?RO\ɷ\  ((i+gmVc%7\K@kr'3! uJڴd)XG]͒bɩ)"KEs_h+%fd6xmɎri 0>Xs m'Xx*5@KIvG߱e08}\\wkHW[/<̭^RU YZE*/zg-V Ph/Zqp"<M8ZON Fzr$t~o?Gw~N͓*CHPȑ#pBxMO$Xغxl`^hq J5"E'))B*@A ifJt`=: ,Dgs|^M8 79 ۰ߩz]=5G 9)#N,~.1DVn\Ӗ{rY!JR?:d-THsvnh+"f66+F! ?`着:׷]V_VH_\7ޥ֩WԷ7 AW`~M Ϯ`][,zd=2cJVwzt6R"Ef=;O|:G]Yކ_?.S_P6x)A }'H[_L;FVzXũ3d~  Q*аAd|z]g|idhTdbKX{Mkf]|I/hDό3a궆dBºK}(a#^p&HDH@ CZPg6j 쾠ΜHohNG:k|I}(ېH64@>pGyŷ|Gp/OضA}8Zut+>-7g>PIf_>]_gm$T@L7W/'(VBC@XvTRuu lf4*k\7>ϓ"& }4ZTiŨizaNi@C|/e;YXԘdWTD>?;>飞0=*G%60ɭ= H4֎B%<ܟUؖV8ܹSrI2~Ɋ~O8"gbҾ>y+v-8U`7 -}aĤ0?=)vʌQwK osHTuGW }^[W$$7Cd쐠&mHB% sب3ЁYMӖ% Gf9ۯs :NK6ٰN̕_U4A,KUMg\Y5ˀ"- 3E5aKFa茙T@hw>WZ6ߪk[x_v)%DJQIĀ S+]4M_1`w^Tz@2Eo X 5Hչzt7XտgԧԳu Ϊ_NMFvK?_Q96ӌVamklMR{(ArXcO|{lTj;$N 8= ZnԚgf\y*2`ィ/no^PZ?+wь.{;-?㱃c% b 3plO/B=tРo 51YLIuj}֭\ѧc/'},`Q%`*/ZY`a" FIAxۯv_LG_|?ԫ܃GcOE2-A0+᫈al>ǻIe3w x@};VFHh3/ r^abs787=C31xʂtO'*+6jSszń9|85v >WJ>lV2NnG% o#0c> BdC7]B89̀\mBn6^G7EW[FJ2䎣/s>ں䥐/]ݗ`a6hBA`MDB%䅙4j37o'|aiSzxe[*- !W|iІ2|˿ئQR~TBO;֫o;zn芹oI6N~~̱%󕺋źe(ۂA`I,D ͱfWLϝ|Gq0)Ec?7CW9A7TƨZ)Mpd8Z7# RCEvG?dG5r'{cWdgO/.Pv||R*w Tu;uT31苮jǼeW+k<9!LT(t2DED5z"bl-x(3-$h`g_ r᧛sb__?YIxwYc?:}8SPRxl4(_;M6ǝ;Ҁ8 (v,2.UVYl2,mؚ2otj3AKNbxFC(Vҁ ~Hk?KJFl@;/'~Y^ޜ%GŐh,蠕Pަ J(_Wx;" hwۭPx? wBX rsR3p`icP|Y9j]V z-/^Yc[BfAQ;@%8q0Bo8|!I\ڹjr`g+!OrpigU3i5pig buܨ.ELXvP.K4RR[R\F֝I)ͷ U|-p&?wls \.c 6?rj \/#跰-Gg,c9nJs*5 u9wf򶷦=2|̟36&9 ;o;@kI i2*g#~b؈qT&x;l<"5=6ێMk ŏHIg:L3L+\PHizdKiהS~zonJuaUO$^Tt'\p6Mp"RЁ{m&nn!.7r*7ucUhdx@y6gDn0qS )7 exۇx A i>ctha0!Yj$a|񗪦~򉪩svnR6q|FbM~A Eb!m#Y Dcit"NQ_I1׿qO7}=3L7_ԏWq酏>7~//I&@$@5U8"(te4qAUWP1v]Z4]&kͯM`JM.mR=o]1;ٳIun^WԮQCR۷yKzR=Q!nw _oQy`)d@Œa'te#ĈH1Z4%ROnqhj*ϕ%Uѱ3[w>'TX޺zO|8Ǚ߼Gۧr6bE.اMV$FBk\&=.(۔fXMY0O{wK_~1;>"&A6CIEV2 ,REtↆY S":aJ m VG.t EN \$F"B kn-Ud,Pq^[7p5Sl_Y˻#S^?ǎ rOLo^: :Oӽ1T _Ao#]`BMw 4/ T .E䂤2I4Hc@76HR~"]L)=<}WQȁ'T_*OuQhXX 06zUh;UCx*`i)1@aY_n@Da9H9ƈ8U+3~ J]nt$-- ` @" #e<";,YQzfս)؁6SL!Zt$CVQAn t+Up%%$$tU[ t+T\H[#xcDZc4 @We7߱æ$I6՚5%%|>b Ǥ8E^418M <}CSL|9M:+soq55O;{ X_BiVhYͶH8&-p{C 1XX- y}"K^|ex =U 'w|ɭCuo bI;#]qQ,<6dOq7 ,ԙK8L -zuEݟS X^7`I m No4Ym5 dP+v!"B~D EMxiú+zhºޏ7MBl)Y)]JLz< ݰK[JӢ#q o1Pȋ8 l'Ga& ;Gdwl\9cG_йw^{{C%? ⒈F@<Biu%B ,$'YIn(_"&3  /=f" *Eɐ!/2oʒN5_O?vݤMK=-};/{k_ o6=‘ugdGiHC8 rBma,d,BGĶH^ 6L;#@|2Fc%) %bJ@N ޸X %o'KwW+'B1~;^^\Ÿ;@A(Є{*'l2J#ph{ERqq7K 8 VkRslJaQbuSLęjuB &bY4bm&Θ] {[S00NXyﲾ}X9aqG,۷x̙O>s},j%^_qzM߻kϞbL.{cGZm2V>z#0b/YSڱX 82- p(Qh*|7N!POQܠKcp.ԫ \&| gx! .awYcL<|ZX^6FŐ\RdېքPG%:*d(hoUFU:0c3ڎb3Q;on >6q0wj%5T2 b 籁Hd-]KIw:p6X됻}cӣ ,?sǷ -gWnz'2[պ}ç5def)N^ܡK[l{9Q6e2T0zl%oƁ ] 85-c)ڶc(\H)2 [^9XNYbB1pԣ1N]/M[[Ų!ɚH $O*|̀2uf&"VMxtI6IxxCW.~(]_SZY>ԏ_8[(oOC;m3GyO)Mӿ=NY1 < ͯVֳ`ݜiyp!h|d%)"Fb@^E7Cn Z$ gf=1nbW%aĚ{̟zf/&L2貗G4WX>zq:ЫY8$|PE6sc2C^9bzϒb^uO/4Xtn^F6n-œ4s-֮#.$wґEnH ȗR{stV𝷣\sۚo̷EAmF{+{5PRĻ?SA+`1]NsLvu.@*"ʍ%M"l\_;8CRKK槩bP~w`y˰ jʅMre@޹sBBytIEƓ/*!q˃ 54og͹olYSf]+lwv oU4y{b14':AO 1h ȨE(htUOFZoWy'PN;Ny"l;lxgD0jqtd!b31ri VC sF59t1O {w47t6E*UOWH(“C/"PgGVO=ŦQpn bK: 9Ƞ(,fk-Tm#r c=v)2E~$ôCj5?{Wg:dmRR]erLglNQ>ڣGW-IL#gZ;Ha YHL` W&l?Lnٙ: {koRڂ33K}QpJCdj9?7_j/ZgGꟐ3<սĺBޟ' o1D¢i& ZSmOOϫ?Y3QCGW:G.32DHp6$@\A7K.*%JZ ("|' _@,8[ȩMѝquV4%F-M|l^ٖ1xg|xb`:e4l`^̿=Q^veY>긮K/=9ūjҌukx\Z>-]9l5)ϋtM3#嬒7)7D0xba!1 *uXc("RbĭHAt~yJdĐfd"Y1tfB(1?HqL脔&uC5ݘ)edIg#w 61)T.w|" DQ1[gη+ 7ӼiT) -J+H[Օj5OI+(LߢͿZMb"7AC6olmgەkSI9ͧ~%WU~`dAUK|(u79 :xu;ow{Q eU\`G$#9-*"[@Ap2+h :p>XɝB}EL8`H8$x.qM" 6 rXݔx):[c5Sz X;^Uyл3e\^;ȿDjƸvW!G}@a݁5bڅת[g+Z-hRNkSɶrLnhh6Oy!s kdBdo&2.-bsR,N g8"?řh)9"x"Gȕc%{# kW ̝kSѱf$@HIޕ|!jcYŇBg@ё%6givj&YiA͙Zc3 -Pl= GؓLϯ3اn;'\v3_T=;oa+O>S>V?g:k[#GϜT)b+9=0"s1|fܾ|ۖE;s_IiاY=|FF@M̯ļ"%xӝWQ8k|ߑ!(V.P0tCQmK#Wt,ܾKgˌ1a^0E,Q"1lGd;>")k;;ŜYG @8N! a6v,5z!"vL->rB~}UzM_?mS\Yw-eCJ䈵ۗϞvr^noR.Tkҫ l}%QDjL$̮FgМ.L '6@Lxn#*L hLḜZp}8nX{-؈(SS ?xy1:ӎj.`Om~s螌;;Ǖ 玝cs20`P$l9>$lcyr!'ks&Afdchn?p}ަ?X[H+NCo%eh:г&F6 b>xZpnݦ>|Bk? $4rj߈sn`Bf`fA}?`V_dp^TcDd7@W##1h/ ZpS3ne{D\8Ep9 ~ӔdM1.::b):D,Hy܆'TtM-N"Щ%d><"^dR"ĩdkNJڅڹILgcȼ%7EK7Ažmjς6C4y6C52:hS?FZɿiM| /h >BjW:3pi(å ,=A ZGЎ֟Y*-gu"oDr/Qƫ6E}1^'WHԧR}o/H7#?ދDPN9"XvƉtoa;9 "/G$:vy3q#[DhF]6Z h} ;@@"O^B( Fơ>4-xmQC4U]o퍳t.]IȟL*?E?a6ء8yJt ΄N:45JFfa s   i$APBOB$n{9wVj)(]Zx) )Vw <&ߣulx I(_AЀwR?OC7E}RاZ! ($V?Ta{(o'V?T++7=|اrVW,B#ѹ~K Ϥɹ'0ӷ&vhY2 }#W+ {a[WP;ҹH yDxˆ=ٌt >錁d%`{cp<@~yns$x9-܏Վ;x=HkӀO)2<!NOz1zdj8؎QW[*?rPgwx'i0B'nUf#|H}ym>t۵C,P8hl\t,(ΡR3fk˩aS@+p,-tDN(șg-"(%` pHIPQ8le0<erN2ϑs PgO"?nQ!q<@cy1EM?%k?*^{/ysݻoO_݄I X ՘1T8jD!Cʖ H98k"`u6wғ8I'G[k6 )iM8j`+կQyP΄uxD'ЗHZ7u['}I?ؾCپC4l÷8lj8"HH3HHh=)\!QnZh 4~W@b\s#PI BUvU ItpBA;&-PNC=7./(m]& -);tQ3&P_RשCN]m=/sO@s|"JSb21t/*H%Q wl 6&&BcӭLݜ <;?)Oq͵VqSfŧ8^T!U 陴kbtm:E^qwK#gM=C+MT/-tneC۞ݷg69GnosOzu:\给sp:K*ڿ_+WHtI9 g Ltf3@TrfV> y]("rioͷOVkΎS&\oqR=vyp}q?/WWBrj߈Oo۶?x־S;vKlvp1^Q.ڧܮ BS}1h|^ԇ\ïIig툃Mȷ7klLܬRCc(Fv}M1`fUjG"j-^BGֵ޵W$-f>6561EIDh@ԑv>B5"C~s>s4oZ seEa3H\2G&p٤Āa33 DxD)%7L(Qr=L/\6ލ0_x |ǍGw'NyP47)Mz=7 ⴱd8_mGI8c~yǃx%Cpd,Bp<1"bChV,/{dC ǔ$OE 'Lqk.wx&=yQ}3M]ޅK>.HxIr㡦_'SO)j ͤ$fFRFԤߍ-.'O,˿QS>%uQp)㗟oB%bM ي"`NΫ@ t _=aD. pm5@C||DsqAl:'t,A #PECN>6.}^D^xq/Ss cdVɧҥ?3+ryy/WlwS1?5ԅ ] I6xisH)d{cL?l܌wC>?w|MSK Ŝ03cJ&AH.k+:d ?DM<$@ R( ^9Z25xZT8x``GYDⶇ6 uĝF?}KMD71xD>tcz lh)bbq _ o%"f8b2ע5qn4?GHb r>Gv*E<@n*f`%g弱LSUO&9СM"Jct8Fܶ"{iPMonx޽~#K7OuG [̚ᄱ+&ݤ׉_LL҄_Oe!b1监٘J ]L3)8=Hx3^?o$6!T3T>+B(څ%Jb@i"O:?d?wm{t9,eE=o66v6f@YI#O& .XESaPDvJ RQGG/-| G ZTysc^3 $tl].Xv2l1tQJx΋W͠JnҚ_}9-!NT41^ʣOT7 z:ѿ&wH+FZ]k9gĉWMHbnUY;7'td4CsK".KCCp1l|P=k3('gvơ1CQ@̶p)鑲(O$Z$*t`zGk@WKwbgryZi^߿"u@(dY`sZpI#@]b:ho.vѽ^t@۩ڽӍmˋ$0]&݀r t:\QVVQ^ HaQUM])Rȓ!!$vlZ悢ҰݮۋLǒ54f FzF7J7+Z$ g Qt&D@G yP͆5d?,F U^JWLDBܢ{6d^k*c{ӫҤeg'$;@Ls89ՎQ*~_Sz=7ܣko| JC'pSDWܻ;[?E,%3n n(>#&Z,9Q4:d"Uw KU= ܛ{wsO q ߍLv/&?s{JFAzX`,#y zWƠ fXno:!|J !F[ BPTJT=?fѯsO_fڃ5kԜOfM@#;W~'nPn3 VuTb3pD'"~ Ah8ȸmu(LX=g!?fj<jAZA܂s$9KWMIs4\8\)<h|Fj.v̅k$QrN&)P N#~Cv%w Hd`=)4xwk 0?l[( /rXQ]G9>NOR$_4r5zS*?hx@fc;t.hf X5fU"R }U5 .jzWmonm>9nl#mqNR'ܦK>T +#hᇯym5OZm{r9`!>V^BӖ'IJaSt\`^+g`\<ϰR )#weĝ!1|q5$P=l|8CfL +_AR |oH͑q׌<Ė7=IE٧νK~Vbk+W9]EYk|r룫]X jX.\#QM"ȏ}IEP7*0 "I4p졿wFWX͜Z9{v?9GOIdߥ֞n2ƬXq !bP 3Xy 0p\6XThǏX2f%,w~һ_:Ե׍>yU[]ޫb'ƻ ~w[Ե5=MaO[Ͽ5Zc>8OYt2(HM8G9*6Î;x&i;\؀4R]!B ;5{*+/}z' ]8TZVlh=0~=3 *V=6z$r/ M7zᦴm.{}W=r3CN7ЉFQ0PnȖ@4 3$@ }heC(q37 оz:8sOt]]~3۲H?s@V7ٺyj$Oq+J "h%[n&12|%v 6 nٜGC$kQOQE\RiT1x&n]y<˝fѐ6߿r gfZ֍ma͛a9UΔʙbn ,*Ww lj&U0RD8KY =Ѷm51!WJchӅ)ua^9@ι@wg菾 GBλJ* 5cM(,v+S7xqQІh,ֵ:YN!uJ.Uԩw,Sm3 +K8<:$q4oofBg5&tN;t,;0Y|vsFSLD偋 DĎeCh^14:K5x0TS P^xE\Ym:E% ( F2J#?JjMrx=c,iD{WO;By"! aB=1/PLzoxkK;uZD A AlS"(Z7;L^OqZV@$l*+}.oMO^A)U2m__l8eiJ>;!SG\wcm ]YHAzph`G`n'N&*nW$ӈ4p_(8'动h's;(9 m<{zښO=ZGg*_;N>U֔E {$8]+DD:$$>Ȃ@rlLE#ZQ9T0>!cz%kO["]55H?3t a_g[P̶GU VoZD)NF^G_gq!8[! 1D&%bުMZD2f\HW,.X6,Q7x]7I1 x6o^VBQ]ۭ]Cw\\pj~ 쩎$ gp5zՓj.C_C .xpdNӖF ^6}f'o>xlG;ꢢ= Ǘ-~<jf!kՀ4*" +[誹EOmAхyYʋ {U߫u?yI>d>o$my|^e`?pqN͒GsburbnT^3:rs+v#WCqF^$ sLXUٱb5$=Bٴ<t_P;GgjWX%6MW-Yt 9:n޸ٮwK(W V;'4N::rN0Y󸊂'Uo9i+Z*gGqKϤ4VI1rU`?&|]yXzn\ffs< pn1MPA`Ph UXj@>)H.f*4?k$@;/|mN0-T3;9r%#*u!&eSLR#?kk5Ua!RoI( {0 jw o{_G2k>{kCK^}r쌲 XÁY}8C|pZp>_}]Dd8K:RCwp*x.K SK݈nD/]Xr:^S9U#R*Ǭ n?}]/vL}kJ/3Ҍ/uuYkS3&CyH-āq&ӱT'O0r{9kfDD*{ 6ET\VY-1TL=wcn7`ƿ\sMru%</m_k<-rw~%x.[Hnݬ_-Z22k PMnȥDyqA G-1r0AĪ55=WS[4ީ swR GNR_CQV0vUcZm5u&µZBSkV5ẅ́ϋ ΥYCq7:r $B$?B j}EЯV_S ?| :ߍ9t@J6FɑG{*pq^/K0`fFeutK\EK~jvf4vuGM;Ǎ?@YW.[xn`(V,~658]Z_ze|C[GGKl=4hY"NԈ>=y⶗ߓ@"V=p*hJϋq?Ǔr7@{!v[APQl7nf6#8rF,!%:t Ѡ >E7Z;d#aᘨ"W˚6M=@v(Zt"8kW6*D4XwZh|!us@xtgv\|!13J0aUvGd H#uqL4C@ ooTsBocS*".L)r rBpmv+ }z?' &vߊ>Sb [ʰh#ZgОc8rNw 8vcdĺyMIA93b|VkK%USegeNzNY&~'Ds~ P?H|fo`!NƣREKaEA ‰54m8IM,$3<ĸĐ (-A"iw 6stA癊 T X ֞U!{+VfԹ+cɺ7yuYĶ= [Sr:}0^a+[(D>JjݏbO[K4Q' .zQ2c";O݄nk?a4h YaF7M>4Igr<[Q,e0R)8.w²g[-95_^ 3p@08.ls;?{UܑXyr h=kqO'vv@oG\wrFr9[DS?KVgl.^P0fs#w/U8 † ^$&7TxQ,?o o;6hbc_^#k1},y~?'_^2m?KNWo'n| M^dCDFR#F6ԡwz!`"Bmx~ro.'p^́fNA5A Q)x(?M1$#}Uhy!7U7խ\$*2ZT}OC8'4A~95zբULEb`KBE.u}_G)V,ȁ{WUd yӚ6o~ϯayP*]Z - B Ḵ?qĄZ< +r?=L-zwZ~/OE *,'nwm-N9h+ ;vaîߊ&M޸3sgK6D+( TQ3 ӝaDD.$rl! 9GB**jF!ǀ do/@S` AIZtmT#1 rEg^ Вvn[1?Qf7fN/yfG!T]g->,ySܢ鑓Z?IB RfbRt4MA! JSĈ%%@@30Cn(Z~(٥ypDԸe%ynWU ql~ 6zx,pXSXES $xn}Wc4-=!QCƘvN*e>g@?PCॢhR6qKe(R74ar|=eGq?䗣UrmvTX08%`"˫] &AO1(Wk: 86%H JFrD8T/ƦB׌( !I;'y^;Vd+j\)YT`c #,sQYgN'Bı?U엊J_o.9I5}g26kMrmlCz OkR <9;U(mrSH r_R^<[nK"\[Ab$MVIN+[uPg6im,1P>L@H0fԞKmos|/BW~|gUc^)5]\nCFKUl8Tq-ileM|_-FӪH㞥'O.oC04sM4=kTpz;qj'Uu\*,T9 ]G2]n.0*pbN XSgkbseOe6D(,?_ɦ@Mu36R%b6lS~I@;?37^N j3(*TWV&YD ڎt?HӔ057ux4oT {F:'LڱfVYfs1HWXdyƊn(+~d_uhoBZ9k/Q0Y9̷,۳#: <sf_N oK(z Z(Wf7!HrFU-Ml[m%H@HtJt史9Ds1 r>0ȼ!䢉32hȭ1Eź-D!=2zO!PcWH< ~(֋;a(R,dP ^`ZV+"M# >%,I{W7_5tyFtxXJ`E鈂^Sx=q;+}7XCif( =y@ +{5&ryW7L3q{"͘! c<$ޫyuӎ'5o|C*H Q7b`cRCC]$N TJhТhC$T>Ҫz28bMںSOsAވ}:LfTh+NxP0KiX`|ݎ~HTStUoGťBQKu c{Tġ*A"<ܼfhZ"G0x'^P=Rs7ztUsB_(L);SۛstYnNWahSCp>C,vF)Nqb!TtK}:Ɵll%4:>ƏVCV]W~؂$}>څ靆jhǜE" ܭC*o&np-S9}n܃ޟhtg‹sXoNΌA.ٛ!ñ޷7BHJUB|BLMf C)5/庼ٜ !~D] CE Y6 d RT  .4g'r $fHJ[n;g"rf' &F)7 6 {ww '݁[^GIwY$w3"i.&>dWJk1#O=&bV4Ha!qFD,Y*/_[pJxNn9}@!K܈ g/YP%<ňM֢ȻĐ}5[Br2t@N@79Tj9Oet3c#;ۧZ{1Q"aD# 3OqVځ@5EP^YAy/] ! pv71ie gah 3 . 5=)~0!IB^eh^~ҭecI-.~X9ݨc9\2V$Ų;dwi#ht/.k7п՚HB|C~}7޷rKE=L1]w%!3FDi/Kwb+(\ޭjɩ.1ƞɹyaOxOw#|AU|2vXn"Y\ M,Vi\g*p҆cC|RF CQq y:0|{`}sdT|{cC*+E-Ҟ7 W]TBZ.$Qbc=PD/ebk("Rv,8q{O#;wsZ:%]zϧ^x#}*'jxyW#Snizr+M! J+# \3Cdԋ3Rn<|mXyp܍ iW,^晼Ho}JPC4wR,#Q\'pEH>ט-fMYn])={4{2*q &Py>-%b5b\Q ?XrxRFmAcM΅aGvh:4|Ci M`"Ò>JY# a`U,7+EQ2z(K@"RJN(K/KQTg&w{\mg),g\Q9RJra_}sE!~}#P6-w}%eڝKR$vrH~ g>=W<":"fE" rFȑG1W!q'+&6~%y .Di VX`N]dTB*͹,%+OMOtGDp)40vD"ƭ ԴF_oZѱ{Ȼ_~א+*CZ֥trCɦʒ.a3"5cۼl3dVY~^L}AJ)(n65]l0\ WOpF14M((v/u.%-6팯*ck}P|o^sFWk1  iP4٪gXuo~vt*m5u  +;ƻvėo?R#-1"]Q)+@ڱkf!cd>\3mc _!36NS]Ѯpy/21..A Lq$5fa$.Ev{tW 9}vY/|1{>xfU@gkOtճP;:1k0GgO+r̔{!2}9iQ֌ gޯJ@Iͤ{>ĩ_./eA!kc-~6vZPV M$r6jf)4a,ysaaQx<&!v2Ú?Ky+rOX\9D!؁d,:1miY DsP9(_2ٗĮg #%- R{.'pyj*#\(hOq2?qxJiZD1MA #aE2C$"g:`/7F$QR.Ą!0l!$!0vN ?@mSIB(cM U!N|!F`O~'? Ja̰ט*"AxFt$ihT#L+*+EASYQDi!oL9f-#G{f禙  A '@k=:ϗ<~sz̲C'>QИodl-ipYc4[O֞"?˸#hTl0"Hhxl\wj]Nc`2ߒWP߮LVZΗGcbyiq',LDg]epO5.30UE]@KAxpv͵﮺5oҜGi$\?iD;d)EC{덺q 9bN㣘>C^GC yw>.OYI~)|g0r W,ϸtEod`20OGhmXs~~J`3Y.f&!C[υg)^_Z?[R՞U@ "Co\1:e$vvw le'îo(u'Dأ#>5pa\@bP2EU[IJFne;?Hg-:ގz{"1?=j|+Td^a pWKb F_\K~)?k8y sރ͓.j%_ט[ }s̝V q^3B ~BY5e"6IcxUcLݮ]n%ⵉcE-͖ɸצj׮My*Q#۔N]  lU>݉`o%rW1 +L R8/ҋ}ݱq"חD#7xl f4]HCitL0(H Ġ/8'[mZaK"hXcDI>("*;=ACʼnRPgq):=ZfWw挊_"V:N3{뻙uxm^c1m?0ב32M{k}^ҷu%K9#XlֱqTrg;K33I*4"^wa^ioxώҁ09PW8Lz7F̀:#\ ÚS:=ԅ#2B<% pˏ:Ж?n;@1n9dS؎ ;2a.|^T^:c%T{4 ɅH2"N#S .mMN63p&l Zm΀*0*UCi3H[k͑D|qB=MT,VCPյ 8b %f6{šIӠn[:w1Oߗد/_ez"T`Vl$dVqࣚ4ԃuDEDAXPf8AFJ׈D/NÿČ2p;KH.ώ"wFK$.u~5c‚~Mu PS;>m- kG X}!c:]V߾iH>9Ailp/= ṸBJBV ZB†"`*ړ[S;BDuۼ&pvWX?^j^=d&A : cG((ߏ0>0To-7 ER{( _wá@ڌ#ʣ gcTM0bZR[ήHxV9"$ <482L1&1Gj_/qQLDZ ΀Ӥ>ʇ11UClj*/Kb! '{rUry |B£5B2D!6$Y7j.°sy &@Է1|&*q]sIvx@R͇֕XꁛU|gh>~4ӡx5rѼPyav|i^lhv^m Y8WN{‡; D$1IuYONѼ41OQ. ޚ* tnrB a%"p)mobR54QfHg*j ,[I귌6j)e,)؋+D[f/+־c\4XMQl(j@GpoQʸ )7[:n , Á39P.tLXtV><`L εcLi1Wi9tW =Υz^"Ѩ t!S#C8N>VJ!=`[M5;x%*_c nt7im2!̇eTdPAhC\0lbWgR_؜'Nhkx t~rv͇M@f`do&ތ8xsК c9oΘT14bT)T®SHf/Rm3׳q+q6Wyq۲8ڪʦP;P,%V9=K/,1Z5q4 hƜ>\;Ds].+[X%}>A=UO?NKJK͍AW|||:_}+P|~ SgMY7" t]*#T+-jj_nv9(-&%dı~"SƨlR$u1SQXKL$GCj<) 4hph\22&X[6H?D `[2e5Gvo'O>b5  Tɢhh@෱5Nؠ5H+Bdyu Izk<#ٲ6SU{c&w4b0H[e YnnaXԛWAɋuH.?ei!Z&prEsa>l PuC;F(nStpl0 &on(rml&me :AԱt&G*,] Hn{Wza+##G\fݦiW=\;0ďIvGgN^Bv2ϠC. LCAr4vP@ڙO)(܆K~D+LS;a(l+ẆR>z~ɤƇ|tlǥ_?98EnwiQ"{0ת*iG8B@)R)7UaTVrj涥=S+"=CX/cwq炟hbR\0$#B 0$%:0QQHĮ!޲cIH7Ii4($wDDwZiZiX ڍQɏjAFOvi~uri|:@&H&ՠ'۱[^g#0Hfsd8SPkA_]d#lYᠥZ}%Zp|FLOcAF?b{n0Q ,>aKA k/dcD* c2BM|#;SŴX,y֤5^zֱ! a7N9%?cW@ɘ2hTACw"-F[gXr؈cY 1+ܶ`3|@y3(VKIÀPIm@Jaqu:f 4T 55[}9tՄ<:AX%#Ĉ8 Sk"نVx] 3/f%d5^(;vR2'zzjOyj[G 4hEgJx8BhAhg&Bϫq(_M&JЩi=@(̍ wec#7"0##t$/()]K7թ,G0q9JK.&'\mvw h8;fdaAㄡVKtpz$6G]v׉7'ߌ~pqр.@^O.?S6$ b(MR^Qg/ZxΗ Ӹr.ˑsL"%R6//h{ˀ&^MAY#V E`IiԢr2ؓ([5ʒ~aa&>5~%serC=}ۧw~y[]&L |I>p7|#G! |^, C˗˚JH2** BQPBB>@gP0(/(WAW.2 _$ Kd,YΕ29b՗?$RIj}ug%ʼn @m~(3YX_ڃKkGQJo |39ÇxqO wF\ԣd&_[r' a 0)pW -q5'2X Q,eN1l=HrrEϩ99М,R}IsJ ñ zjj MoѺ gf&.+㲏sp$BJQabԤ:tPWh QEh\Tf~NnՏ@w8q8^ @(s`DxH ^ҡC.AФ+tP{[ف6JdPWVAMhCrYPA1A 'A a$Pqݹ8]Oj#q캙yqL-r/x>'9J)O@=) ʖ(9r YB=zk]|v8v"HS/2/ɿA Ltǁ8ޫ.K_56w"As%!-ԃ4NisSS-%0N*lg0LYF-4LT536 F~iM[+Dr`-#|gF!rAZ+tńn'xM/S ZK #4 LNcMr?P34*oP]¾b ښACc^`|Bjhhsci[W~}_Ľ XU? L2 " fFH qPLȼLYy32lyv5?Y{zz׻wDuN:Q"V1(V_ 9U'S,NvE~.e{IZ#G*xƞ1? (OGጆ55{reB:8ǁ6;+yL-)\x i?BQ{`YqRUFP: [97U﯆32s8`]#co_s ~s|91g,=n^B;KJA_3z= NK.D;` +j-jS5v@=mHzՋ|8f򛺶Ƽ_/a{m\j=RΫ~3O8FуMhV{ZWR17Q=-処Z~QUG::MD~Aۉ>v7<ɶbhvD$tVvw"_- "BX,y]z-l =<U8M~_ݸ;F5s~,BڲKZO^IsVϏ:O?WA tv'DQgL߱O"n:s)|-I49 <[=^zf祳Oͻk8?,5יow7-4sC5W7 >Z.Kߎ>(?ȑ{嘺}(FNtO}.KŴGF9"~J D~WC1Yjڅ%gu.h 9"V4a놿TzՆ-Y(I{5mu֩)PN:!hL~#Df+-bG^1$WƆ܉&¢D~[~ȟs Lnl󕫼KBŬM.o-gi>W_ ~\ % 4.8|QXD'ɫL|Ip IHP"%k G^y5x!+yD[RAӫj 4p`fH*Y[KFx;[O ƒys;te{C콟߱n~7koCw6[r 7vIW.x?8XRmo@vBs&묯O/RS5,|kԬ'nTlAHɢlX3#=yKE8?l[@ S=WdB(X4 @Dr[P|$>?=4c`=_f_{/RcZ!],PO+ڗxt&&bR'D:JzաSnYxzØ\˧?7W@mѩ"]dnxٶlC%۳jqٛg8⠉P$h{.8oGOwT+ShAלqLvlj n,t_[LHP&uM_U9J-y!Kʟla~ů^qJ]{4.p=*om<#1|AEX_wXtp Nj?cu-^yv@mо>^M[CJ+ޑ{8nk0zw(쨍Wדu&bhT V'E+2Cb"F K(*8tQ>!"B5vλk#;)|ĜLANWx*Ah`󫺑ϔhWK.إF8T.CpΒ_:te@U׆ZywjE_=qmyw]c\CxB>g`sZa[L]JBeIs .5QpyE ȼZ@gD XX{R _Oy|w!>"-:/q$,ݖP:B/Eԙ&`ku Y,31oδ:z҇ afc1ac(HWY&3T+vc"]>8C(,ֳ7IsDXUMW6{`rPOjTz2A (6DNn<]2r҆66y4G˺4ݼG1g{)h{Pm} 9¶ҼL{fERUgtx@,gtЍxISVVgMLnbhF8&-:hIxcҬTmCТRhUw~eȡ ߿s171]c"~ɍwaVSMyGx7jnRk`!GRbvTHk ;cbiSQ4Ԧas+:t3HopBp+5~)y/C Qz]R"ՎTځ.X`n,qk~42ۧ93SP DD*bgbEN/}{95҆Dătn a|A.N&$w+f@ݎu#}UhDJQ ({xS;3~E/lx+^K۸uwglm7۴qއ>Dļ%~'gI\Sv^;Kl|N8KVٓQ3>tC8MapuSaq|U,Kot0}8=Bfm+_0d/K)2Vk@/O{kB?OpӚx9j5/x9T> %{;C&O5ﻧ3Z5WtUfOYҨ/_-DRK~Wyj]w*_ѯ=1Z~rZGo$>5.S''AL˖BT8'onxrҳ orR?|w oO?߮O( O{~Ze_]'o7XIK#`C'58#P ,xw!o/'*>E貓xY/D_j\w'R*y Bf?;Z\t_hl{j Rf NZO%#);S"?]ߩ`īQ=7 էGe%|KУ5G5.K~§GOG~GxH?Ew.W*[_P^ ~ټ-!ͅO=OĨ<~1x/-奔)RO=SGpuR+WG;!OukD?u~V˧S?=?5n<j DͿK7+?5.E ? O;?=C{=K0KI1#'Kݓ?Yj,?OO?P?-$i_W4It$AZЁh|n<_[GES<ߐq [͟9U> ~gO%^3M'u? |szO*Y jIҮ>l-eTs]Jx^$wn1@?BAs3BQzTQ_ λjsn壽jhoqZIot7{hK DVH +b{(b$`M#(X  Ed+ ~ŮGD=]͒'2  "?Bc#a6c:/Gx7j6 2D|-#< P*YG~z“|&_; =W4>L "Yĸ@0)e~ߨ%X(Zy 8=7xu =J[DGkiw߭\+u~"ʏE@ܳˁI ߹=yQ}9)>a6RCB3qTE'< qtPBcAn qDhbyq zqcf2!yo=AQ4YB=ÚU5+"As A~I7{'9kz\YI*.H.Iw0_1k!ͧ֬ab(mF2s"fb2"DH9gBa:mb?6yӼ|VX'|3W[kCB̍l錉嚟 08x!oȼ ?9׼hvOE;Fm "]W=x&Co7@tbvQuUc%]+1goA]|An3gu[pz\vSo=>IEU_5.fq7L)-}\U* _)p 5FHpKҦ!DF]W{RĕȽ=$%.4$A.GGI\`eЦs>MÐPqv͕ju:5|zώg֌>eN9d{LJ}W'v<)}tҔy6W۟pv+?x˦&]¡;鎽]n\}g_x|=[%7Xg >^ ɒj|BC a;]' 45%yELÆX\D`zZ]2QV{T+,FeڰXKɄGk(q6MM51it' ٺ"Ma8Ǐ ߌM$R3ϗk7wmlh |-$Y2ͦ-كECU]+Kں-بhtƮ%ԼAl޽{\5ujNԩY7{Co:p1{ ðIjoS0KLT#Xfl[1yeiX~_P ׎DKΪ.O4*W_tTl7ְ~Lrv `rzSru<2&H}ꢖ,Qt!czT/ 1LKB15I91pt/^4ȢGhT2Hiuӧ\f!qb̌a^6ldE3`y'|M&&<0?W" &: BUs` ?pѓ!%eio6(kei"gۉɃ{B>7|gmtSԸƾooܸU1!g||NJ]!C/rGM1vcL}XЃGHT$ IbCtIg<Ǽo#K+EcG"mSOMKDmC 'cWFP!qf7CT' =D) pnq%h%?^N[=v+q[6܏00!.㟜hZ31{^d 8lQg_9R䰼/JcPZ3tݺ릻M<b52\&tYCvA;Y+dT'zC'bHb6oyv֣@C.!x@!FxI,D+dU 0MD('hUQpXƷ8Z4 XЎU)ОKD=<A,l\f>9B͛&91=Pv{A˘1,1xYI1|(Z]CGCͽ8{ĹI}`?ĭiXSl1łȱfc{2i/ DD+vh+b]oZaF8ux:zBNWcq//g '=yT5n<}cs7ն67*37!b?>f<+O޸7Ks! #4xI^gi @oDFIpP2Ror9աGS7k-ƇgvS eŁ[e[߉ h1j4C>6\;_&qfܵ~&-Mƕ tuSO{^…6ooeș.57\ɠ_Am6!ߋ4+hw خ[V0ثcO)<`k !m:kDHfXx疓f j-NP= 0C GUꋟH,4[\RXzhvlY$(m1ETEaZ~ d Ÿ޶~?]dnI`#o+oqZ^R9t3k˜'EJ& ؊aJ'$k1?Q䠸"E;8s$n#Փr0DaɖLY^Dt8>"KH bhI~wC"݂wAMxeY%Fk9*(#űXP='3~ÛJO?.Ai2w,OݾTo\xΨ S4#0t@x0v`-B{{*П\ X=aA% +=\C:z݁^fV#6[{kOdŁB]egϖ`Ʉ\&0բ]3;PCW +Z}uq kwIsqP/q9o#^b (^O̭CjB!Z%#ʅ6.p#tRc#8Pg掆j;45fxQyW窟yv3^X]:7l2=hV,Eۘ73:MBGb_Ar'.zi♏mミ}uF"'mS^hL{ }1I*AߗrhlosT -Xg"h+1G)6nr g"eE7Z)w l)j !*8ƥ*">sO;sBö='Ϛpӧ5s|<`yE>=l <?7mss,+oS;01`L4vR(!5`++ЏAmd:*%91g6?z>J/VR\]X†qœs=;E+{>+6m-gG-PF^,_ȝu%`liqsNpWz e)c5|&}o:V_7Jc *lD1o=rg){^X7߈~A8i["YU~tKˤUZvNm1@{_6(jJeGDC}Guu84!9yimc,!%qla-l!9"ϊqa-ح k1iu$2b9F;fϛ`=օ5|spt]U!GOdI=q ` i#* PܰN|O#b{=N-!ύhќm{ȖQ9&iN-W[D]b!m,_Mz.x|jjU5ϋlY0CC-3A)ؿOa96npKS@B|8Q./z 蕒J_ *ْ8<Ç>6[lbq13ŏd<\SJa9&ck%EnrI d)Y3ʦSk$qPtH첲͗𷌅v5K.ſ`{gN_ӗKC -n 00lg♳hjԯJ/F[{c+{:C#?lsF{g 2F` ej*N$3X-!bΝ]ep'mrE>xoH b)BHvB Cfkb;WHV`iEyO$L5N/̚Yclr׀ma@i<0FIJp'C[d{nBrWD0e+T=Ky*Zy q֍TSTg^Cvy#ED[\K(?X ~ q[a7Z\qxϡ'MC4(]ݛPmHh؋xp܊yhS:: U rp[ =IZQt#7 ذ2^ }}&^i^5)?3:JOncwn4y+- 8m\4z׍(@Q\<_  -!wA&$זZ(|8XTA%<(Z7tTDG5'Z>29$nf#XFa1,*lT߂{P6y9"?4ΙbT|yQXгru389:.ﭏJvd7>ArT ~ z[ND|t v-^E *k8Mc:L;'2'49pEDdAvחlZQm|{wѧ=3@* SoB{3Dw-h! ' "$ŭS=U|iCѽ@[CLч.܁ԥr'\ Q M̈́xK,!GVP;!<7H㋌r5=< U@?P?b/_r<68bLGJy#e?CHXf\l{RR]HHe9Bx$-̩nş4 3QP !:[{b_λ[X9|[M5!k۴{q:6G{LJ,+^t=A HT,h` Z g4E Ai:9pL 6$! 0Q'{trI#|@3yHj{mz')N4zDƪ,1񀾭~ybɨ_.x9ؕpGv7T>eXwi{>Wg ,&P+/杯T &0NȰ+=іxOvG lYw#osS?TzW(};Ki@}]6>-׽%YzgoQm' i B|xiE茞/_ gH?R4%ES)zh꿦ujh񊠛?ys Dۇt>xF*f#A~ߊo /RGB[X5:ѴjUP'7z`^߈5cPD[wAY!0_ _77Q!i8)I]859,-6~X$UXW"ࢿes֠_J0vlh&~7-J,'y$pQ_A:OF>G4]C9h HYK[hsejۍkx16iƘ'O>Kz{)H1[+5={~7|f4ۥ4)Ғ.i5m( <:# }{:gĘ"{LKje\cMXSzoAD{4N||_j_h,q{%G({C1b)fce`xWr2zb8C?8 xihҁ Ɩ0OҞβ~ܟޏ[?S0f]Xs"}Ds{Zϩh-_c-, (tұX7цJqY#MAkpf_P/y("k7i!|UЧaNL{|:ȁ8P&efys0!k`\"qAR a0&:й4׈}~4Y-:q&<cY*HysH 1udO'=CWG 5R_;E6]txca`CzR duH]ސ!o\ 4䇐=>hàA5:>}5[N5x>:*4;tzy+C =z&Ы?âFeM+[&l{{a•ppQ#3MLpSi)NDaDu""D4G8AW#nE*N^""GDn2FEF JʌUUxԆQQǣF}U[JSWtFE1cņ6U-[W?Hܱ3qxM >p{Ȉ!CLR?00aS G'O(Ễ_:*CF }`hYCۇzzա? 1kX1rm}؞N{ /_G؎poDFI OMRFRSI9wJcʑT)ur4}ZFZHۑ#Ϗ1*cԄQG-{ߍetGz~zy;S/|Ќ2226eg|q=Ce?0F?&c̄1+5ukcǖ73y3{8‡f ڞggl쟳?`{4j1)WΨ̜391>2Տ7{BG]^}牳'Λ'~7񗉷&eOjӓޛޓOO9;5eiʴQO~8>|^ ͸:Q; R 2 >-a}S<1+}lcVJKueee7_Ȭ^QYXFWՀ%Ugk5ϙ0g\ywv4?a~y.` n,LXf'bm_bŇ Z[rso۲eǖw/yŨ+hZqt+.h?}ĕ'V_oVXy{~U/:Uijj^Z=bu W^zX+ MU5[Smm:u._lۆ>٘q7ٔ)oSVo۴wSӦtqӧ~&fmYn.3|uϛߢ⾥ߖ-lIےe-s,߲i-[Zrq-?o}+ckFl5}kּ[l]nޭGz~G[zc:}Kw1ufU-[WW_Hݱ3u]m|[mmضpmϷul؞={pڑz;ZׯjoAi(ohc׼]w;^D'Bh3bω''?iޛx{{))y~_uw} nWuP9tQG88`҃s.?74nGCן xٳM8t sz7%55uQBڝ _i$r!l+%__*wL3 p \URgs3ϕ'.LOrޗ?+QZ/*fc!l_ofQ9TS yh/ +iZWE[_f㷑|M . x}O _-l%;}8/WkWhex=!#ya $_hYM(vac9*>vlpb'+)qGIåR"dɠTo$"MEԤI)42.= \%&K?IMX= 9u0"PSUf@d&_Mwi,DߒgH[@yogNke=/V#CߤÚ=If*@]D 59ߟyBh/^Fl%XcB|k;Hw%3M8"┳ԉq\cpO'1^f>W%X?X? b σ AV( cmcfbA ıx`"0 e#X"Kb,46bY:"e l3ؐY?Y{MHwQԝ&T8ϙrY?l& Y+p0JcZ*X%^~dUW6e[!=Ζl[)}"}VIIK_H_IW/jIak:m`&ma[Yƶd lΐ0$˞bl?{`Y#{bϱ&<;sS |Vً({ ^aث8{`vI;N7;αm.w{)]fGc b}~>c/U%};a߲# ns~c7ٿfwX̬K<$s8q#3܁܉;sxO=x/{>܋܇r?ޏ&| `x87ɣx4'8x(y |(#x"O<4>AcXY|yO|̧|syygB^ċc|6/᥼ ^ɫx5s\> B/KR8_Ɨ|%_WZzofou|wz7]|7O)?g~7g!o~7x;/+u~OM~s</]C¯Ogs -?53o_?7~o?m~w;eIf2eYu^6FFd{A!;N"nrO]{ɞro%eWr(r # # # # # # /QVQvDYaDYaXkc"EZZkK.֒c%ZKk-9ZrqVqVqVqVqVqVqVqVVVVVVVV؈UzUM:wXp ,S)ne ni)\]-cdŠWQ15* J(1TݿFhiuQWdwu_=iV+vLVj4Yjҥ)^kIzj#VGVXZ=bzi8u*NC8 ~7Nip4qܸ4ˬE!ZYlK?Y"^mƬiu!^CVxZ۵KTD ~DDz'j5D ~?QOpNQI$ ~?IO'i4I$ ~?IO'k'k5d ~?Y5d ~?YOhS4) ~?EO(/Z Rh5Hj EAVTZ Rj5HjIja UT ~?UOj4i4 ~?MOi4i4 ~?MO৩U*p~t ?:\WGUڬWGU*p Io4&ߔݔ)GDls#=\ͺTu#SG<5xdzh/R^HE{ |#E*ڋTh/R7#_x#|uYx xdzuRTk:W;5xdz_xZgxdz~uRLGU/:ю_5hdz]xVE ((A*ZT`hR1r F*E*TT`hUD:Jlgͪ,^,PS_PC;~țPQ1q* aiRb'U`^oS0owȭ-nj*nz^V4evQe GI% %L1mpmwcZE)BLA&o `.ȷ'hVau}u!xb}̢9{*TA"BE+,QbZ5݂g DQ8N'&ZBY6,*%CV* Yrr4,H^ /tU*{g5LdIײ3fãzt# 08um`$唎hIE`l{DSJ%WqJ&]ݜ2R1>Oy*<2(JSQwf&7/:P;9'e9 |Fu!M@W_rh^@NdpEB䦋U-ς5sa⤄ydgt:oM\0Ȼ6)[{Aliӝalq=i;8=0[ &`w(0‰?%[ Y^Pd$@X|ivC|Ú 0wvguW}zø}ɮyeh9\R~ڛ l /\U|u=lܴY7+FZ0lsf56 >PKyTT`yxتG{v*˂V^~ ʯ{[EBw?l]o ]Ϳ#+ n؅o,k&6T38,rgksZi+ g,Y3ҝ$&^U兹%nBZ. !kdxxj`)P9p_jmƬ/< !Bˆ;Y㎯zh6pmՇԘ#fZ" /"$o?5cg(I6!~`q_#bms5"bd{+dޙ]# |4iLr<){Eff(u[v+%K-֭of3QlƵ[=HQU`#6H*|Y5}:N</.8fD~L^^HHzݤbK{KOq~;I!_f#\v| (_ 5 w\.C 7{4{ry{ٝ)HY0";x$[A$|;FhǭkL`完F'ڱGc[ Z,ji1+2#F Tء?v@m k Vp$̰۷H܍. 6l%  =@X+>OJu==z1[%w |VsbA"T7mU U[S\p7G/ô+T=}GWl놃bCfmPЄl H,BW$nifWX11.`,>?zL΢zC̩+&_P0▥ժ`sU]FmpW4l1ȿnr׌v=o^:#-ԛ Ka! X/{lPpXNƫ+ vX&0rqV#1k Y E|G"vet;=g~kA;k,Ktxop޶Ů+cQtZByוufUo}q+д[=U;`+]NL-M z{]V 6{] 8?zׅb<prB$`X7̦{]n ),ٵ6 x{72t`Y< F$zrW:P0@ʊ ϻ,K^Ԥ9(ʨ>4؊8Lē!:&7 wLw'vu@ԛu`o.]sjz}5Pa;v7\!nڝCg)sF|(D0VLPF >,"XPewu0#/Mڠ`c}ƲwPghhqRBrU6DY7d>씗c8 y 3KgXV-}-g 6}|GaFiT1T1ctX1uc?Zʭx `XV{ ])XdF6{Uic`F_YVg0l`(Tc>!8b c6ґR;s_Hap=t%b`N,nWYYt+KFTTx5W#& )SoB]W8f|"m+oоj[cYr<})K(qϊ"CP6ԢFKFg]0j˨:qPP p@2bp݀JYRt% cF1.D!7>n`d(B  8j9  .EG1yV9(ŔuYCƟmd㤀ةU*>Q<::`_aymEUhٟ^m`}ި$] -=:ĕ)1U"~u=yJO"\VV3ۖLBm1-7 l`$T[ 8&Wou]cr˥lp' ᄷՁ+G:/BZ<ڿZ86`n9""|DR$ɢ+kBI2~]pW3pRK11VlXS4/gxuc _P]zC4e<>n[@3\,7l:i9@qĘl !n+̟b7Ln|#t~LiE.~}˖gQNqW+wPC Nq"OD'WZBth$l|?I`LaW ͡HwAp BDS:m=QH(ф\B9l<^𑷓k2yfSDWԲFU=Bc#X  ?^Gj3tČY {WZ K$XI&A1Bh~,2*ZX1j(ʚ5"W0/oE\fE>!ʿfՀSbX!; )v0DirQP݃b=h}F=4GKpHOf3)0#@^krnR}\1m.A 5dMbR:؇G fIp͉;rZ_,Nh|"1N=@!CY\d~B,=3KPzh Z:!G=!6WT 9@SY"rϳ?2ѕngL'Xb[Jt?3KEPsYrEa~oU7Kn6ckj5 :X^X6BQ03Xj;LVN 32QV Ȑn\dk] 1u` A;LJzK>:aw{LFblm55\INEuPl^4ǽ2w`*LLBy3&{1ƟC\WgO^ 2SiY稁"tIEg'C FU* ( ɜO'RMPM ȦoĂK$ YD#4O6,sP({&MI B23oG`jl8Ռ@V˟_Jq,MW_P{'A9J( MYv7:rWpv6H7Xc%Hg\Q=1G4 :$Fk0GӰd 'TʀJl:&>!!Si#2@)ORp7T{" ` $13)DAInxP+ݵҌO'f2PS^h#(Ep',\cFT [&̀Ew6_0ŨX>l8X/3(fk]fa__ ] ⠧F. =#HxcFan3[qb05}}Ou*3݈$iǽQ߬u~b1v{ X|nX\/E=5kakn+ F%BfZEZbV r2YWZ!:dV}H !eJEBĬjMϰQ,uan%5GXހ6NscO;OґB{+xRW OY^u#:,]<-)JGA`B jQIHMȂD.?4Vͮa2oNn>-_~1rPeaׁX쳲eI(}Oͥ 9"نNgs4jn&KPR S 9 LAɄu*"*J$jC+Q4x Jʓ4C&ј.W2avF~d0VXR@TzD3 #qɋ08 XR!q V*Pd`´~\tM4CeGr;qFӤPX㠱E4pxqʹ-3b#/!%-W݁ng9q}Dt$/y UBNe /j x7fwdFCNfxqQ}zcw+&1k݂:Oh`T1M/apW9Tf m;DV;FPI P^ oMNS@P.YIw&z-khjl2dE 6U=X{nS{am^,iwXCyryI0b AYYY"p<՜|\s79J?98wDT.Ɓ3clMH1P3!hK)58)~ҧJ>UvosZr4: Gxwa,8ypq$=I@{'B`Iv(SuvUQB-؄sa|v]|!N`J-{ ɌQ_=p(_#rbiI9 ]#!{AYcn`.XԂ.,G9')\\b ,YȊ'PŞ^kj!=!l&k (K8@1`SXZ,堐P(ű|RRW~k'4ٹ[TxCwĹ*b bfvDx];s?Av ҄Vu#'5ߠz$òQfg X1~N#;-Vs]T 7rO_8I+|Nհ\܏ zPɃ"\ݲt@#ezVP? Hch&<[h`A)-cMT֞"Etz1A5*$y ml7MʮLAh'qѮ=ܦoE;xE2m iC_` 6VK6ux%B2AJ4x؋b&<\R DG1fo/@,+2+(iDh%̴ VsrD*"(ӒF6ŊYNKWxeS$_ڏ 􇫦NOHb6 gEEoe`f-9-5(wSYfU& h(ǙuچjC9`$`jEbcg`,V ]|g[p%tρP|CvD%Imx*=)k;dązL!մPQ6KBX1BMzAC (Tb8EwQ/J(윩c kK2Sd@\"^qӑPSv?Xj.s &&۲s{EY ȎED0CTW%7 a84ֽQv>$n-n7:!~!#KnwF}+q0M,7vHZO 2y@NEx!`H33W -"4&\n5-U>Y5][ 6 NR AEn hh;˟x5ҞQL4!BiX+^D ёK af.Ҍq=a4TmZAMU?=c$b[ KDe3XJCYA#*;H&!AXZՒ@,q7TഀH6 " .ʕߣgݒ=0#h96ӒWJՖs#rB6TޟR1JZ@ <@ [MrA\`~RJL̀I@VIMM)`:WJR~dHӨU%NL)SV"M*405de.Ҳ|/yp1@jG{"Ax^HXNRtRp4J"0)$0̦kI v3%$47PYb9|CZ85fɈ+S`r;!ȗgD bkFPvwb!%\I~yLɄZq%ߝMCQt,t0"'>QwV*-.&Oe B^ȦFIrL댯[JS7b}/ uɁi62P+ oL~cZ.޲~peKg07(`ߪO$'ac5 :Z!d)FKT&tjk.|J׏b%V^12Ʋ]F`{)w&TOLG!!L !Efx'w߭I8a'98Y7ezY/6pJyԴ% 6* e,H8͇S/P(RCqVɤpn =\KqZoh8˲fzJn>j؂d8r-cߚ=2HW|T.\1T^ 槞d٪Ja0]g@1?_4,r[W"C&v(dDZZvXѧȖH*sw@/<}U`D-ʮEos$ԋLH fH&PglSq۴+K ,{Ȣo;5PȄдl[& @lE `˗a+.ȧhXv&◗*xcLhYKΉ2ტriWc6ɹ}BaDpO+EG60hqNعƐB2.>WJA1Կ&+;o`KQOaJMQO2DrkB'bjg\R Ww0=MyɗġâA1cκC4t!f$׎3}q#?ŸPmO]$kLܖ墢L!PO]LK2!크v( uz*B(KoF8gƪ*ٲ:nD>^O>7qI[FHa087rR{쒙xSx6A||SHMablt8f1BhyRԁsbNp~>$ܤrƦjAl<^NJ@@ g._"_=kU"7cfMRY09+vl>ӣ3ut8QD KG&N A@|Z$5}1'OiS",8N #+B(,/`X sCe3iI[n:DR⢭ci |4W!BRD^r7I#1=7K|+*~&Nޚm*ӯh"Sx?#Z$BYOd'L>vRH|vҺqH3 F'/[UK2G Z$&<3eX&Q !cb`"d w"{d y}1%HQWbT0 KIU 0䡊ie[)_ax_ӄhqap?h +M[a\08eMI^S:a_Wh3h.w̜0 N)~%֧mr`B)8tS @/k_ I O4g07-O*Uxs! L`$(fK?,'K1&enmkMNbO& !6qV!n*X -8"e M"P]v I Vctan'*c;ͅ%mcH%d* @wBK;LuɒKm_<B\lU\-n՞%jHXowt9ИJ\y5N2kJ&Xa"|\K 5VQmd@{L-XX>Hn[ĊW|EV ҈;%<]W'Tqw=eX @!'-(1pNiݸ>nlXя%r}0Tmj:8j P)|0!{ Lŏ/Z#ܪцoFUZdxȡd;@N@t7eOSHcֵ,o3@f_;2[ "uʕ0\;K0hMM5tF+00p7 *J+ɤ)W7ɭ'Y5_l\R&L{~"I_ X^.p D㔻Oh@r^v=m|R$쨧i{i`]17bXzٙI&~6$dעie\Z ̓/5ݹY@\9OP}fӞ(,PLㄕ7y{GfM!Fəvm{C髖i<Ҟє44W~<97<+ ujauJ E-q'D{0ipnq]5^-჏5_-[R}ّKi~IWKคe#Z+jZ+R>ztX:0UlA!?^"g$j[?2 )H ݬ>j8ha~Gho{ְm[IB),x%ɷ[Es節zk~L-rKRu)$STC,$ze #aגgQ![ b^Ei3Άtj3E^hO>|dR~jB!ZJ89)$YD7b7[@඗$'v ּ@I$$k:.1Uֳ͋^-jcVZ=32nG_-͞7熨,X9}@Pm.wVH|,5@N@L2܆K|%hM8qIH}hIwT-BAe W%F :'؄[9\G<sMi x&̍Bϣ(&:SjTi1WUtǧSV"cp&iTco3/ NS6CĦi[v0Z 1y)PR& >,y4 S+,ʟS X.Ol03,"pMAERԂ23밒0V˰C\ tAE"x-juHtRqYy.?-m{ilM{ Οa,dɞ̌N-zHߤF#M#2*arͿGoepa\]U˳01M7I-bSMzj(V-餔t*)68"YI=cҽa}>i2يXzD:zH7p >5YXyjiO@BU4y ?ulHIiUE!?1`)prpЮR#W9Kp4gҝ %=Phl@oh ALEAaIX ˃1Io+|$^9MF;bI!TZkRH8R+HTW< #P6s<7m +zy"A9!K5ݻGEp76SY?Q{oa%f@e]scMB=S&-?nt38PuJO0 }b1;iƇq ŏGvrbq$ H gԞ>ҽ +5H@Z8/:!5(4Q͓I*_]s7Z `cnf+A SLP^N_h`|L= Ǐ=VInH} gI޸Fi.s -MQO^#䘠?56=b'{r?S` O'p埵Yf;NJbJo[$D(1)?tcQC?L9,)ǂwɻyX@|ZbӬ t %T[8dB{jGDчǖ6?! K0FlzC(O?&lq=.)s`g@%Mbn~|M~ oj}D8ַjhG{"<{բYhc\S+Y(n^]i\"v9 %[/qmOov=4) ~9':gvYU+=u}5  JQP8||ѣrGHws҉1%˥Y3%DDKO 1n7mcX΄bIrQB=vێg^Sai3*yS7 4[xr]<Ws|`$W^ 1}P+E'R;1prXEj; sWizYԸ+c<my F2ued"A ؜ݜ Rt(>a퇰 0h(AozzhJvO`L؄܍Hy pխIus;w7;=KBPq] vyFܩ2%S/1j'L"a{ '|ƞ.V/{NCYYLo[..L<#&OM1q߭]67 ,>lPY |*cD,У˻>gtYQխٵuդFib@b;&1] hh)^ڻĤ&hſq9f{=n']x錱S4iZfp?1_hc `av MʴjDl5w7zC[y3W=-n>㐁?S\F5k\fnMytLb<,;!Y8 Gw}ѱ$pvFxo|N5.U,lً mNz~\lYyaNs~L*/7liDXH&ƹn`Qm?\ӻ5zx7,ż xm-kFH!xy/;H]Kn#exDȜYagjX`GBn2demP5=fY1eMR;>#:jB%kr_Y8ʝL[h*%ŏ/j^PxIpS݃<YHGޒGs#Y1O!UOh Go'tfk'#څ9Cua 8!Q&kR(i;aU 7gPVgNEk&EJ9c <춠"ctFA Lv7/vĻd hnUcrfϴ U|H|m{oMSj;`L5fo~f?lFkoyjf?jV"/y6t{ۅoc4ZS.l՞~u.-i4= ԗdߗ^%9i@6~;V joK*1[ {/Τ36ev 7Ad 4"Iʡ4Nsߤg!`,VlPx: W]&3(/S L/t!ϲ!ʹwH`6zb&0>a~s8[NioKW9)-Y6| 9iyFCK{|C~^G8@}ۅG%#;gn0/mKϪuE>miSuY2Qf(*{h䃛Ͱ`VcRWGS=H+ v!3|=(J%sVK3)^>;;ܙٖ(]jO2j4e&Xy6ۺ-ñmdBxk:9Ik+FCKu8A0Qɴ-Tu`AX~nhܚjZ 2s $'9}R)X:ɌxI@XSC-RL^H4 ZsWω<2&1٩:<|jbz^2y\Zk9PQߊM.0#`MmΧR;Is n?ၜțӫv/ky>(!wЬg_nN3pG,,[ q{^MNo #O#LwCmK[ Z{E$(0aX́e9W9#F;/ARv'eY@*lDNʹl?[w |uwsvqq=䔡 q@R,\#3$lHkRX0^[tģ{d92geΒw'`֟" }]?; 8<<'@O_D>Or2[ σ41iT{vUh,q2 I.^eJOÊTD4/+kKPrQ*h_Ђ)$ӟCiiG}FDUԈobWmi"kXOǐlrt"Gh6^}Ƨzi8 (~TjO HP&Q4McR`7DM]bKmcAik<5Sn=G4 y4YA餦  `xDДj#݉k}IX}~!$2K*AIb+*h4f5x9;\|졼/r!46NVfrd`*V[$F]}5k{cw|.$6s1PK'Ŝ"oX^Oa0,1O;vMN[>#Ai>Megˠç@^waBoLJ[!Ic7%&I!j)ϼH[$j>Ր[p:yM>ϫGEn6Π ƧO#e|x AN)Cc/"*6Cn|=<}~v|k4 _6118q Tԗ/?- 4{ܱ&l@ _lִWҡɇ D=M|Q';eW}M"wQ~уnE_Z FQ-jIDuJG4^΀XP\]<:p'ٝ"E5?NrhSB S0fr_wJXRk^K 6Ty< 'QCNB{NJj0G"{!W|:LW/B VbhO4yT[r'A h8Jv3*-+Pj~I"4W hEx^;DǡPWp]C~\>)}~f+IO"Q/nu _?.!8G>h)DCM+'遈,3[Qw/.qʼn1j `Z6$kK ț._IRďAE'̮d*8Z#@2i^\(Ĉ#>)HMU_KZchfS.PRS;._?.o;c-j]=biZw%ӫv%vQCM혱IKC$D '@9Q4.~Kys $'´6LXV%iX+ɾҳ˅.]A.ۺZnsnz^r&[JB2eLNG  05|Ep7+z",i;<<%4ia.<@KNWJZ+o5!GU 8NcD7!O\)}VS4cƼL/fӀI eFs'L ;9Y`M߇%N,B@sVH%d JN{JL~Otשsy]ZߐBSwfM)v'޲K`BBl:K4T$R;1 ,TC\ m|eb-BJl\e"3X c7I/ݴsd]_UsEg2#~6PuKomXOvxXJ6vXBs:~HK5ۃC=3^ K g?4`gTFKT1Щ ~nS\n1g@ R⥥VXNˍ;x:IYxQF\(S41J@fswjfb^Hphw`Ff;!TC<ඦ EḷML;_u*Dde tb›^=)L t|9Bܼ8#AY@NtٷxKȐ}*@s6;J8FaEV^eEWǫ&΋®M;FpM#h'HNu)RLHa}9]!(-`e5["lI 4P1ՉXCʦ"ds(NjGM8Lj_.EB6%ɿO49Wt^e~נ(^Og/aԖ@W2Î3VwB D.-=`·)\fA'*+<4W@԰ug0lG`1Wv:aD&^΀ PAňTV!x ̇79+bv@3pK쯸I uE1QGAm(&JĄ"fC]%-sLoF.I 18k m(l+$t[ ף1<k1:SM:m>FP4~q43'W]}1pW"I过]Ģx_-ҹ4*ۂ;4v#dx@cGPU LCR^d؁JQUF=^JzQn#v^p-3Sta[l[?yh,*gZIL@IL쓘`Ӽ4ǩ7I˰ -|%Z(\..pD95-cxƎ*-oxގf)f*^]Se}Ps_IceoHt& )W-N `|1!Kл>6)>JӾO(|*=Auն9߆D{ x dٻ=Ac fLdꕩXs?Dﺆľ+]H38c5"$'6K=:AN^\dQ,kpJ}Jʎw \#C [ k18In rq ؖk$;=0PM~Dwv}쥭l\r&;ȉZyr8Kpdې@q;ЕSaj ES9C֊oTWK 8ȚHU+{A/_?I+<.O{bDg k\8G8@.r6RWs>hgQ\f;g/:u"0Ez—.x;m`e<㇮s x:Ղ{ [:!`xt[\WG?` /gF&xW= **q^-4Ek182٭ Ppf5yGfSR0hRWoŷ|մ5{ZmC0'jc$;\֭ 65ZD A%sSY6P^,@@' NOqܵkv†[/X'xΝr"`eخ3{+ęa?Fr 8Q4ɻʥNXF4|ahtrm]iIOܽ覶c>Wn0wIR_ [\Qŏ ܾ[(ݼ;] /-Eb;ŰTyIH|c>pނؒ!mrS𗑆"ng"I'y%gZa ]ozKfK@j͙f!A3rhi3ޡ4Pc v\xI!1tTê4Yr>Sڠ4۴{eg62Aw!, Pv$ jWcnYoR]BF#F.8DqV Sd;z'0qh 8g]bL%g'+Ffm?fu:K !)*+NGrZ!o| 0gwvmTh n\z  ئQ`Sr6ҾY${{P%Q$rTa^V >b{\c02iMN>m[r{=Lŧ2ix0H(Rh-ycLALَ#+j-N{F8aM}g{5%鰲7'i 3pR 8  Bf;v\k:<P0964eH=6ݪ 20-e&u'A@kn#=^AMh$c>Gr&>;_[OПr s Aּ /HU؝M .}C}:(m;3w.@QnDV{dƶ1u6YZ}3$u@/5̈́ f`b79PX"=r\Ed! a;4-!嘬+N\3-'q3a+s)$>#{0A@ba5|*w=K'QOXG^{v ˦:.;C ?{ޗyt5nJ'r0A߇yQ$ZkK{F_@h375kkaLf !}RrB 3p0PN;X!S` S?/OK'~A 'eF+bNNx+A8yi0xՈ$48=zpC.BԒEwpub@t#E#@3:`&+NI@ͿjNDБr).1xу$:G4%k=Rj֪ 1 %Z6Oћv(:̎b<@ws'bL,).A/j9)N~sEgi/dm9V)qmv6# ]z&w7C͠5{CiP3!6p;\@Ȑ/j4LU̜åKS/O= ,JemVe2ܗ1!Nv",F&Ď0Kٶ3B_.-o;2Oڵ^,NLb$!^G6ĀH!u`HؙZW0fK_nJKT==J %MKFԳ*^s$ݢن!t_¡Z'E6;М6Ip/Mu xp9 bj)+xOz?J+]9 GYdߐJ|-Is@ s}f'@eVؒ$ { 4B> 9dF~YkmY(LX7Vd&h ̄gxwDp*\-"w3.#҃$(3'+oUNLFb}Y/и+"< Ln\Cӷ3E2mO]"}¯X$F!@PEI1C dLy.oD@p4-DSe1ㆂȆw@>&RJm]+6ԅq1\y;~yupwv'*~)-eUq\3"T߅1& \FŰ+N'0NƮOH;pS!b?@/g %X1y #u3l EBx spxLKT9na'L F'Dъ-& $ XTўK]*Ihc7B4,Ls9Y\b@xIH?SLdѸsU:\;R qPb Y\ bqיB7SnRkҺډP 6Y_8J -tJ;f\"];e}&\H+AEToHIZ4)ōkWsƙ#_X::4_GH^Ɲq40`09(6[ u9)GI~| vAtN-@ _!$aqNsZC ! Kf(`A;٨Zr{JYLM# X*B$+V~L& bUzX"oJks x'$hJoBS?DBX\1ym ]冹IHM&8{Q7 1N, Nd_ćO:W::X[з2Q.;q?q `gNqd BC;]q -[ ~Pyc;~0_/Y ( \2{[&/ o`*Rq߫?Գ{FMOB YIF@Q9TmR4d})*EQdD xtxdPbZ P I ">vT`ʘ朌~}3u94/0>d@!7C`4I+D $Ea1d!('  K ZKjPUGNn~Af(9&IfR,5 Zq /r&x 92B%*oF cFik&ddT[ A—8w,BlxCXw؂*p1t 3cxaK;T +]F^_2x<%BKD>\tD )%qBZTN 4~Sj" P5`L6vh!i)Yz#\`R"r+9:M}ϐ#ࣕG^L+VI &GmćKZf >bCݴUmMq_1Z,ƾq?%o#/e ,@}2?s\DGc`@G <KW jj y`HQ?y:emmw6l*5j3ĒՌy $~.[N{l䏷׿^4gXٙċ'6av bܽZwPCŶ5ڠ^0k:/LXTH7`a@DGkpIҬu_(~Sc\ITצѹ u@S:E!:\Tt!!vxBUHqm$ba$u|*šje./ܗ"8<|34\cG[< VŬt D;b:}_ƺ,z?~`rf6+ᝠ"XzhSP^Cҏkȓ8:Uj,P:>;s"ovLP:ĻDrhI EfkZ#&  Wd//~>_Mu祿S5 Y2ƯS䢳w7:nθ9 XUc">R ЛBYH[P5D-"H F #WyNUZ)Yչhvt"' }F5x8^B "DyEH,G(z^@2eL hDD.JMJw,I ~7qs&Rd/ݱ;1Z \ȷpN97 lDfu=cܫ*XÀڪ\wrzNI$sDw~^rҹA|B.a8[PϊDe`JĤ͂BAze Յu} =l#=kn㣷K ܵn:{W*z J-q9[._5}j^vON30 [mDEGg<'ᙚ!89\Z(䌱UѵI~H#ћDqm9`p[s68ѠM%}SF`_Z# -68cj,U ^̑K+PXWElk>FWT G; \X]{]3Y9]ضx|w"xu-fIe?"z8&/-,f?a,Ekvu˧{C * Ȋ$c:~@EkG7/wb5 e"PQRd܋`Jd-[373ƍḪ>,;>F>-L!X>BI}x*Bq {Ou$oqLKyZ3f}dh+܄ biI_y񣸂63)ȵ-lru@tF6bވH䫈1qwPW 'wMBL c[Rΐ #h$`M¸ X ̿5IPBIt;Rj(#q7mWf\K x+%ҩδ#TJg\'~)3.ӷh7x*nYn[`9W{ЩFF8f~fૢhYfZ$o$ʠRb=th,acG\ea {$koKM0[. 5#m3n!#SG>,Q:Yፂq(7T5N"޹3܃^#b$_=nyy7Pd .AдWe'e2w M(N&6tHSh?< gļ:dGDG5cEaIÇ?BtrȐPH)P' >%;,6u#|0v On2^)v[nZlX$ XBB AmDrM[p_tǫHP&oP/>a˹| (52Lhx˒ &Sy]saO Q N|d+{crsOv^aT`Q_B?<^#fg$yc U2PdTZEG@bNqMmnNŽ94'!i|itR>ΙkYF=jv$0gΖ&X+c2Ӕt[$ܰ %lavp;M(OٸT~"wcϜ:4j{BkN" ^о [dih|4zig> G4"ȑ%}5wDJQ֚!}N!&Y8GeT  <pذPf~dy~(ɩ?`uEpo3\'n)J әo{yᜇ|%=vvlXg`=|)疋'9lG1л#S+AZG9(vgks2w8)7?@fl` I8Dvow0FRզ{L٘r54D= O"]{cL"E2q?Г覸zCc60atLb9 $4]'CͻY)$^Fˢl|n omz u"`@O-~mm5vvn: # ij [LeX^wn/Vʸ>i^0xq.ezDž <k z~q"72XTD#|;Dp!M!'x~$<UCQ+86kOcZAtva eP  'wNLkpa:l7`o>bw.Ѹ|ra *%!B݃ua¾#gS|]hH+ב[uaBu.ȸJ_-ԋ S.51Bu\cBsCc3y;a($"n/rkٳ5p$t))<(_'@<u)9yݳz@Z{^.,~ź4UPHRV!Cϫw V@ z[ǩ6QNFNx<;1 T\vTȝt9UHʡ@ߣ&+K d. Ew+F"YIy94L^2۫>G U,/벛> Ko0z8Qq,~ЉLԾ|xM-ZS+;0@'`{]s1p!_TEgG!JܝfF +a@vW\rPα4 : -&i6O4 bA#=6q+Z΢Q !mD32Xg#f50M5H H"'}uoBP{|ڗlyk@SV[ԄH_i2u'*rMb^pUb=/F3yC+{FVG|$H'Jc-ս"^8f39<OU%юFډob3a|R'ƍ%g:Ab{p..]ұ!2lְ{8^`Q!;c/Z 2$F>H<( ~$1b c*.nhMkѦT![ۦE!V]YlRs2 V@5ؕWSKK!pF`787_#eQL" … ;i1f`(b.8 TOo\cدҝYjXcn, L vY I5Ha͌/Ñ`4Ҏ_Rəq!34|<8TA .yEgBkhQ{qKo?;\=౛3P7BG$(ip'O{aX`b_A!`"C)XhMԛspՄ=, Gb=,}wc3 |c:&/Ĕ{b2z b,F* kB x/ `2o9S|٭'zho;DHB4)l^"} 8*Qݼ|5iK ?2s-$ /Ffa>6|B1đ~Q07Dm.ۯC!wg·0#!Ic_Gc~lJCXD_*aJwFUm?6~~ծ%g{w4QBZ)I` XHk4FI6Vԑ- VЂL0=YEQM$-Hb^kx:X(= qa FK2EhqL*%͊M:!Q#I"nq;kpͳAdꥋ!uCAF.{lgDžP31BЀs#S g$ DTz-.B7$TTŚQTvf9iJ o5W,KU'l|ean%tB)P @Ta`9c,:E6(Q~,1GoFBkHFT+1E|έc WD3Vg~7{cgeG@$ ^#H4=cHeOxj8d*uB0L#q ⮎|=49p(e# s]c 1>2EenUN sFEk{#y"p7r[1r;n%0+u=@Y;٧[] f,/o$=j!Ϡ7rsu? 7[[q*a&20Rڶ7x9gl5Be vL;6+VBA$N'|`"{Q Me YRk )L~a{&>!Gcq'k ~yVNCt)4U٘MRTmN G ^3隹O& ko%֯ff(Y`V NKHP8rB϶+fgM]M~QX.aqoHFTU./8UV'0Ce䠱O;O5\Nb HURl 0,eY o{H##c'I1=QtSaS=7ܠe67i +f;y O״eyzє/dƶS>DSYgjӢ#S9I%4%:nn91[ 5;_yKCs4d6)* AHe(#:4ax64 |$|57,vxJhZQΔ<2I 0-/pHB2*DRf2>̅ NV`4iH&${1zZ&_>#[~چ!Q[=GUx,0y"qp2&$!FjĆּ& =YM~ OcqUnT Iv`n ExUv@u Cq#a?@PNݮ+_X;B  B SQ@2„zOg*29k)CsIURg1: X<.F6cRaoǮL'Nǝbs4_D(;v\vg9T*iJכ2Z8> ab"DH/iKk Thiv6QlB r]=2 [J]Uo}D2Ȱݚ@ 2£DSjj᫡ U++md tǁ\B(kԴNErAIUƥ PQ0^6C6SqXoupNcK閧0__ԧjhXk5*ljG0"њ.6 ~|T B*ܮyv-r*Hf0v1;Cx- 讌 2x#F-1\]Ol j9^M_kz=&U]ӑ9;w+3k&Jΐk=MLTPeRLPV>TnV3?iénJ N`";!G_Vķt nNX<tO#ԯI\NK[<7 'yx)_|>$Be3J3Ja,HȡH?tR`ڊ &ҩ S+>`5O>f1fU&8du/L V̽މŁWND* Z9pλB?1/J\mpLb.xMY#/blNn[fO[)'CB /Q!Q;c$a>y:|٠_jnވch0N[[qaOVXpvD8V8 aү[b-^ǰ<8s@ Y\P7߇as(ٹ*ob|.3H8 ~ @b&CEb.uN;=X{R9[pHEXp7\XaS\s WT|;s2h/)bc\8N(x ,-( 4 ; (8ﰋYnk>A {uq MƮC[b<ͧ9vAUr^V"DweiU_\Ia yҞzAW(-TFVldydbI'!يȴ" N&Xeů5^Aeen`ҭ|JrY 71ͺ͔+@L>Fōa s/,p3#ijcsC _E(O2$>w#'~r{; : sBV&{%pS 3|j&=!iKJ8N=crc)_ NJkx]iS})z½ ݰW59r7 /@8RI,>$9%P"-{"-|lOg^v&eAo{IWmrX8 |j^Hɀ<h,<\D&#+\l^Lj3 :Τ!Pϝ,!hEAoţs  }@Nfσ#C P(}pRC>s0nR*b#|FG&Fb|ň?BIO 5T/O쎫șU(=&QDS'ύyrbbPaYN{'E[&EdS /E kx#E"cYjtNbKD7( ⵨/yy~幒łOJ{t聝[]%}k&Ԟ Oczm]&6&;$!Tƪ#= hCP6wHKʌU+dL*H^(5ّVw5mP  Ka}?5 ulfUA8b$v2T CiMV&~SwQ9$Z)x?keׅP h>i8U|"L"]J3P1Ų|I0~\C>H=6ڃw>]bIIJ*ZE%Pt} V>>(k:|qj<.LGJR>lR1,= !GxL6IHUN")ծNt.gҺ# f<f-HO;Xؒq@tj#mL:,{.jFbvq0m py8C6s[Ch E#_C 2DԔ4Ȝf-=jO6롇0#0Nsmk^]o` $a4lyX]#}8mb_r<`7{r]K/wfrc=0w&vY8],d1Ɗ7p#lwd `Q:O-C0qE N4_xop1'pIY{X )9m0z\𶿌]ZNt$/N2 ĴEnI^] , &P-jWA\TAqdEV ^Gј!k/VGIoҢSk!UfcĿT䢫kYK=ȥ@oFFV K'gyx I6*\YOz~n xُH6MDr{Л?D6g# 6pN%*BvKR%b^U>+~6,pla )ף9v#ng6(w@q_PZ}8Aac[:G;s?31nl#"d_)ۢ!`cKXjHҡMiru=bďcʳZ5NKM(T"D݊⍈@L;v©36z֟DJ`]0. )YJРEіIJPwY+Ь6+@e S{7oKTk3=,m,H×K->! *9L#'NdEU ҆/BܳTmg#||Go(9ˀ[6OX+=ĺxprf%*?aatfD%v@X֏?8jpGm @1Y&lUՁX9ht/I>ɻ]3*SIe=sz~vxKYnyC5PLy7zHH͇$yXeY`}_3]"G\oy7B>|Kw >ԓe¼h<}4@*40V4ac!PESv1J,*VnLSﲈ_D?y <ʿlԜ)i~LGV[\3"?pجm.YN,h[UK G8 kKTTJ>$DD6D ADZ>3Vah&z EaR6w0YC's+{-ъ^dh9\gUQLz; ojhpj;iw`2(#/Dmjmc39Iq#!:,y[tЧdіmاS!EKyÖ0e\`L*ǯcl51k;[Kcv?7zGG4 H  ~V4-$ 3@!1E7VXT /íANDžT↌U>^g}[gs _vգA\@^ V.$j8h/kf;;|bWk%g'qKb0jU(_H)txCBh[CX zZbIE8|lTP=c7[%xy\&` RCN9udf!a{J`J\>3 \ e4pvPc.vؽM]5vπv==jiuOp!B P`& @xMW|- [WGҮ*kpئ~e@w%;%[TH2 ɓZh 8,Sd9V-}3QϋJ[쐙iS| ^:!ieK_2v'kpnYe O{z_X?rßZ3dohm =mmzSG&U[x`n*gI8XrG:bu6nM.q !>mRw"I@o \Ո+MgW4 2&*WSd"~S \)rMuv ::<sM:]D GԘnx4C;Ad1ܙTR좐?쪊&f4p/0\|T"dQ G-L6DCB6R'.4Q}N!K[J@ߍI'R#$RYNiB X? FZ1YcR `` GS■S # >MfԮSkXN'ČҙW)ch3 ghRO z= 3 Oנ eq@ضTs*}^NSF'iG1/FA 6B"]P=*Lj<3녈K.a;囤iAot:kU<.Ds 5ۊxy< 2Xt Q(βzdC+5>z $j NRϠ*ØH&_+U1mcǜ;ZH,rOl8P-%%ّ[|g^\b@W@J%Z7BiPsI~ݤ0Bl^spC`*T) N>>\uaް`a/DvQjĥR^TDT*/[M>M[eEfr-23Ո8/en FZ4TAŎ<Bqn{;C-Wog9ru)quWUÅr01E!y8Arc]{f6" yւE xpE-o[xWLȍw 'sMtYRv=*2.mPG G)ܭU|RGBĜӂˋ?xlϡ!Wd!k|¸ЮcUs{bRv 5Jw7;v,ڊOvB0/~WXa1L͑g" V_!f{̜36N#RU(*n4Qθ83gD7/ "}Sh YKC?%CWcÁz7lӄA{?=>]_QrudAxmxFɊ8˳ia!: Ʃ1_$] >]Yi@"Iһ`$IG1sD}8vǠ;-8cgM=3b 6бn[1H>b=3kdÈ /"݃&<~;o|mc=7m /bϤh\$#s }O(*Jp"p wcY1;|++*O杂įhJiX>U^f#,)ǽ5` :TKO(XHFrX,̮rq?iRb߁Tr_#S9*yMO Jƙ&7E2a):  QP~.Ćv (H_iYgCohV84N*+I;>,gmjmz=S0xӏNlw`KꐧUiN.ɿJ*M)R#EZR߁H V aVlSN hm㭜P][޽7 3wv EoiHRMSǐ g,Sַ!7 EM,qgB%Jl: W0{ #D"d%Թ<멞#5?n_%7-;@#ߓTAMG)h-PAIR lz.Q c0.{C.OO CnRߌM !7ܮޙFuXMd7h†8!01cFDRO'}RU[/D[hPZNAcМ8@z4G{&'a"-|ehlnaB7ߕ0,We&9wlhr9d I_RGp0d\!zUkVQUú .VuvV (/lf,cQLZ3'$d+9`6^hybqDGҶݰ|:'̍8 .WxR!paՔvpp; ΛPYGe*JxMĔ eCq#bP zl Idi\#5(լR_K'B)󆘷]gp)JKk,D?,Mn8T^8 BSQ0b$kQB=ĴS"^.{~DϠRm|هkK\$#6Nt}CPL `bcp&9X{h!AfVEHr}3Јf+0XrO ڀp V\ӁDA?<݉FwͬI.Q7"Jl_PhRH+ܸ)9|Ohۋb/ 1D %7͛Pf`!Vˊt.> ~9R,gCѓ(a4 G-\o\Ϻt?M |h7= (M4.P 2+HPb}ȠrJt-.E2j\i,?7laXCbPIjA1v#'{D p{ϩk0%7 vjPR2v4ܩ)7"cSUҖB;zzku{GMak=D$Z-b [ 1"I.R`=CaP`]#'\o݋+@ٻ\}w{nQ,DR^thx~=Z#ӟ'[46bxL1c߱tpxD\TqkX3l*6$D)lX/(ϽZ@Uָ+61_ cc.(zPS=HK#;!TailO^$`DM; Ȱpdja~&s!S彄Sed6"a]=p\i;=H#tKxXWfDI'$c?;#*s$jB%AYNAػ.+wM<-L MīGZ+ެ!n29KeOsoYt=)4bq:A|k~Gp p{y3=Dr7^d\f?>o[L/p{lp^P{ )6 `( .޹rQUb7 %=o@^ 4B|҇Hg(Gf/@)8WFӺ-ͱFu?§/yAr,Iܸv&?ƄyI30?nmڸ68TDvG I;Vs$ ]-hD@=pS X0;n]uo-A!^n6hْd tD}2g@4Ʌ[R;hxpKỲ$K3ALBe$qI?$ 9jRݔXYѦ#Tِw_/1wO s >:`A|E UydAy P_oŐ*%}%NU5"$bZ-w't5E`JTV}.\}6ñmЭ8OSyYS[31wo%lBq4#::\Bvpl$/ tV`P;8x>-R>z-5 葴`т߈c0S=}ktFJy"r:`gI7A g[h 0ؾn"lA[Eds l1\>#:MFxgkZ*^/y^\(0։)poH$RPb ]kö|6!V'e-\`El }raloF 6B-!Skd cŪd|JP#QNhuME7jL]Ҽ&VM07mHN (UMdjIm8k[≰F^9g@ J)w`HBl?HI"4jR7Зq&lɠ-%Ko>$5F9*B1P c$>S 3@|&\fFiϬv}bC"‚Y7CWCk?<~Kd}q 4"?8m|B}4V<٭]櫽Wpw#(EAhvIгg. |P LlkLUb ?rheSx&W;7|CAlap \!j(jhM{:SؘILZQo~֔-ȇ>4O Pe VzP6 gqƀ =y;,$X?N#UGb!j#RLڐ8Rǥ^`jjd%@dܼ!kFb"P`aK*&; PyqI G 'qIZd76oor4/v6?YP%]8R򋋗>p/3t@Z#~?;:xG{q5kC@^ND$`Ff3T_QQn3y<@F C [&(zsE?դTv]å):zl/ ]S1u hl_u:a;z9љzcC_s rڎ4N .{ԟ+p9fwZ}B۵9v:+U`eqQ}n^ kpAB~|pc~>[:K9dPy?}?bq{ ebO-*7gi_7Vrv#)eTqlh,Lbn!԰|S4IB,zԫ]eӪu%$K8] =|„CT$|2nG㦦1I>!'PK5+yų^5|#i0:vA*kqM\3(+-Q3c,".'?4q tVMy8)͚#dl}ڤܗbt]ƨ $Ј ~[-Vi@SUuuTGa5,[$0C'>b0 JO*KL- -7Qaqes"|%e;8\?UCHJ-+OPN{bIB4񒔫]t^"H⨋L3+W^f3=ML&I0WO'_ y2!P(dDt5.#j+%=uAרf P&Z1RԠd|cOXq'g6ÕQ Aad[( +Q.LX<c򌳊xt3+! AKgzն澀u.8DKbkNiĥ ݀ 2uBbc R'(l9@s6Znez h< Fp31Z>,痣 Œ,1ZDMy &%?Xi2 &`\OLX"6+*Br'* k&TF4UxGS9 !Geq[ʥxLiUlƪI"}|=Xu!` 4۱3$GKP k/2KکFxZ==D=ɐS7IGv]V-zeS οțX\3cq-Cgyo%LIsF) o_#_0 S@ܙw@[M"niB o9'G҈4Dt: QMj]7?Nϓ>T9 x89Da fUMs|DKJ妨 w(H [c-6 >[Ed&[D3X (_y\&Dd3)Pja!6Lk(,-H@ؒH $ K7+MͿwڅ,*$B%Ѷ&ѡn!De2͠)sZڦ`1رrn&^wHw;$ݘ)UApJdJؼ: (0>$QWd5<[=xeWT?+Z|>GTcd1#PrڒY]gj%nL{!CޅZNbBT8%?Բ-;ܛM JBB(:sBr09U2ؤup۹ʚRjQL+Ad-f\u6mz$*ہ5a̴F|%-'mi5CB&,LFH՜⧠#ߗ.Uh6#pZ+||2:'>v&%?e+4)V 샐}f[;z$&ғ.ߒ ΍y QYF7ȻH˸cUD@.Ϲӆ=ƥ_VCbrOϣ.bG@x!|odfW;J?(SAS#"TB-=Dj/7/ rYcv,1ґkIZ yrRg sM=ßѵFmA5yƲQLZ5cKPA?3+2ݑ0~E#ROj5$6Wa8Rٙvݤ׉Hk6GiTy۶x'BՀ(lQJ4<.Bjvg9˒0̛uN3<5*s 1,}ؐrHºz )F ; 8 i RAYʀBdUE/Luϙپ-S0GZ. %RryA:k1P @ ڒqz!!SP$Sb왅ND._y~T 3 KSMRG&#f 2v ٖK(m @e\ZV&QcBZ"%h6kő1`r-"+51k[bG,@t+r+@$%/Y1ji<%V[FSs k?/$}I%=Џ㬪ؙP];U5bqy(Px/NZ,˜.<:22tng|T@;0p eݴf(%Xq4v*-f皭p k@BkZ,݌fx'G%HNyJr lHzZ98F('.. iR {\!s[bAaa\M!7.mNOO]%>t|@9_9s?{,|}%b0_[)Ac\$nK픡)!{$|5T yE g[G e܂Y#dyDaDIL9@F7 a.?+wpǐ:H.%ɬ^3vOYںj,`3uPL)hQn 8,X>lFa ,Gӣe nh18@ %a5 H+a5R'eY..P0<|Uڣdݫ{ZnKǾ-!P8ꔇAa }J!'烅 0|碁*XfNHkreT#v#@ E[@଎1*X !aY`hxi{gq]h-jd,,Y]^) H%Aa?JزUYkVat֡7S tJMKx*F|,X;^*Fػ찀lb~!oevDw  2Txti |EhtasiOmno[QOt&C?/~moO[8(,MGDd)RbRK7rt_8Ge2R%KTc \_CzPh7 H>_R`K." `&Ud,+l~Ӹګ(]TS _,Fy|ozt9H` p7_<^6(;6׬w$c|=;AqZX-Hn1 ۫%@zrQ/ǽtڽazrn): >Jn{'<0FP,es' ŅtsI惠 z;x$YDXc}īxl:3+'`,;<$*Yϋ$x !$ "_>CEiRւ\@5 =p ‰9; 3-uE&;Ƞ'ni,<,EBBtd0O3PA! Su\2qlM"PJFrb\b% 袍}GF%&x%Qg\) _QwҞ⫚6NQ5yM-WBCk"[@1u$r259cxiȅJRG> OB|ʸ4 eJ&7 VUҘ&+E w9JSXdYfq6 \GSΚHvT-tUQ,NGj2D T|}P U=a*,Զ["~|~?_dtCzMe}֏Fl`T!lQv@ =lSׁئMSt?}`Z\w$*N-plm.NBDa£VKrT5S$_ϫUɶMYB"s"g m(~d_VK5[yQEٛwspT ^ m^ H<q﷐Voq };Vf#F;eGAa^g.} S (M7$gWuMAͳI{dѤRFqr5?iV8ZS- ܮ߆_f?׷*׼O\ۉbiJ+:iXEC%] (oNWrJr?Ξa ^s\ԋf7swt^!C{O3gh2PTՖ5]֧X&iIR?z;«iA >T?Ler?9o+H]!K?ysʛgDZd%p>˓bb[-lK'|&=mMm{uNZj]'C%?!%B%_'.eOD z~; n6/-$"Bi (hQ]E5i^{şxK%?4s2E3Ӳ[F)>uiX}zzEH!*2ҚϘ-f.63| e tjZ6 K-K5oJ_2殔Ԟ2-bS5CG̵sgO=f@j`54GaTE6)+mϥ]i Yzژ;-024V5ʡ13xFƅpq%3%`+J>29(4a4P$m GfdbkF y֜ Vf؜V$ύ0HAaw숤>n[:)qB=5AJ8{wp|go^cq\e GےZ% $#@޸[r$/&yg(fQO=2Ҙ[toۙs_Lhhj(FF$\0sxSyѬ3z1Qj=o};wwvKߤsSySgW?3o ܗs7r|毅6?A?_O }ǻhrCg@}[Y~Wg }>Iqف"?lnH 1~ESV߈NgI8x.^p!(48&fOY '':أaG)5~ Dp##24]aD66~QMOuhSd+f:K/ .|FɩOg@ ,p+ 縙Ar0rVAY|bg9to6hFW_d.O2-spbiʕoP$,I h=L\hor.X.^P(t:?@ /gޅ3 9w.e^?OIrޅ mI0/g2ޅ3 9!qd-9fu7$q0&Ge!y|KxKd);P0p}Dth Eڴh+!h5v5D^r3i{ Uhʱ[I3,Hff[#' +Izawz;#6S5.Ђ# ͭ<̼Vh|~VfeJf.̓]LA}T/ջg{D}20o=z;wd؃H_M:kNnm`B.zdyKL=#+H)WE> X;\HTWS0nEmlVm5bJt|Z|oArqai|"9W5$*aua;wnGioU/6ґ>M"KbA[9Dn&Ŕn)CN|b / 9x 3-C h43\><6 ^ t4Ӟ+_}bșVHR]Xa8U^nIҁ ђFD%Ivq 'edĔp΃C ۈV"f58oLZ̜'odGpVD `#{|54?ה=Ҏ9ئml17>ue9hnUuv^mσn(3`> _VOȵ =I9k|=<_۰u]"B=RϤf/v af.4YB53Zhπ`?AW/2݃N``;Bb7IT{dIXq-~=y3QkC8S=Boՠ,Io۠XP'Y6]1`.' Y/x $lJ &%՟j|*$5,0 1Π\ܜb$֋]H4@e -%Ȅs~l'XnyK}J\ b"3o|r_~g,c[_|Ka\x#2;:W W?]xX#FѦS1w3^]4uDKWH}$7/u%&KR;z-:,1G^.]_`G{i= $3W@J"AgtJ}6MhpZyKa"lV*Ӊ"KW7ۮA02Cg ;\j3ğ xmn,ݺCj.>mMIoݝUĵ0Oqe:~dT/GT\!t.@FtYV߅ȆSؗ>P, =@dFzI)):sT:wTU։Cء;~FjG[<.4l*{ *6=[F(¦ye(W|vs pQ+e7~[4*RlGݭ?}vدxX;_xX.r1_xXeW Z?І;yXK4nWb=2vsK$Ź؜߭R`J'5ixGTNQ~Cʥ"o[/99I3M3\7 JV)rXR4.){);n(@NED)繛#ΩJ"Ck\dNȆ⨣O#KKkau7,7:@5)_ٻnBipNq9kJ4?m#\^+.#"07b3LZh~nrӯ:j ~C{ع>ȁvdhM-5ըT]&D\ 2XYQ[$N Qa w WicN|~ ,:vݮV e{ʕW{p>h8g+XA0c0ޑ̱ʜrrP4Ht0kںY<렉 y5 a p #qx0"Ԫ; a:+qsc10mcX:5@HY7JքpwDs񼼹k{ 3ivoQu(ZH=mva~5cy3jEfpC ޽`->4 qһU.u B{YD*[:|Op5nJْFIƍ4PHQRA>-\[:RS5ru9dʯc7pqMnDKjDHnZG~ L0" C6vMW{ya dZW{,CdEȏ?~zAKg+ t>g-(m.i'PVQei_<6\ԓl- .6 Xk)!.k0 l=t.<_Vn !0oh&s;+٤xpdP(&c!j>@vp|$'>.?c!%[\BA ,m k*jRM?z7_XU;:g`h`g[ws|C  c0.X*=x휞81N ~\oSUKa{#DlSǴ"=;zvՑ F[E'"8?pֳ 8U%dɪOj8GTk/M{h4~0TKs+Krh@8a/}$%4i"ԃdOLgvKL/\.|͝7;z$dG;+ yF CJ"aަȀzK;ek:r#]P7u $fmy P .XS-ê3:گ a58E 51r`& % z씱-s* [i`gxY[}Ṵy|iLe5`]XۼIY9 EzQ7KimlcD`0=F-mH U hJ4@g[)*q<}gɅZלy__k'wQ-%WțYv]'nqWZכ:8FnϡKI~4D7S{?:(8Ÿxݹ<sNvx~Tm+Cv{)9t|敺X,ΧHAH4uOOjJ:*Pt:Bۑ(eG&fG/p[*Bu66J_!wlNR%=<a~\R-Lbm@Y'l={+;1: `!'{qI)ylc9bj 45\@?")SqT gJ;N>Tb}ڎhX:0q{xg]-mD{_3j̜ kN,'/˱]&LqZ7? vcEi=a/%JeBvNX7w/ J`Bq t "5hY\{Y3'G u:ܗEO/ 2l(*7ĽXimeNu]JTQo&䧄&_ U6ZG"N&o~?>.%n=v0AcUisT8T uq=ػv[&y]V|4~sֽ.Ws۷@92?6ho ְTΗMk{|co;_ on̕S֑P: 9\X;A')9b#gRاFs:5hrR'tEÜ:$XiO"h֐9[X*;,:4.=ݼ;&٧LK<2v 9c]JmKVƸ,oւ͏؅=GMNGVgiځU\ IXw-NM-l)M8Vr!x5ŽMvߐSc7b>jάMʜsoqZt6=-5+@xA~$4ȹ~ 0G`0~OCByŠH%'QږN \,E-Qc۲ txeE*B12J aN+_@>6$Po0SOL X DC%OÜ \c*EycZO ʱH0βyI`kXe·cg;A9c}m¬*zL$_~6Wk "QcZrmbg ِ&'] yHl0$)Hɕ- B,8yҙf˷ajr c󷻇E(v&;8n|>ɱq=u[LFW<N>S>v!ϬC v_nUMyK!%m߷]8XylGEusB*l1.ղ0 7Že  9Vo=r@)̴j΄H)ۯ8M2,93H -_lHEIUrzM?֤QYZ9s?4+Η/$b+ِ݇Ld'\-V$f5LN9e4 A496ϋrv {IxҊ_ j-Q{eOhoJjm ߻>1Y:jjLd2b(UW(*kP@tY3Zh*hRL+D'ZEzw*1\6+pB,Ng+$!Ġ8sYiIܔN+œ乃/AHO}K*D$kjՊ4(+zdMf+'_qỵL$} K7,O4J0JץO>}x;tlb[b< 0%SvAX5EDOj>_?舲 {xַʞA_GiW{ }LYEpw|7BF᫾N 0 o 'Zs26oD򌼩w <'OnERmwoFgvZ*Xur/ (ap^Z) (hU1 @Dp=LհqNZFȀdDe3o? sZU~1?U>Lv.>$nm?BI) Cmo _åWZgLioٹ + + xw`K+&ƤL8dE> 4F6|23`V w;YgGGҏMei>"_UC7ڸvw0m䲔i…$sgq/,;2U.fbٍ2>>i ݹ? pG@tt)ͮ(:v첆cZ3x^̀)?`ĆoOK~Zdnx^KtEΜ gF~]Μ( Q{"8 E+FYh$' ʊ Ko $d◇ rr/A ASEG|X=h(#}f*[Oۙˮe]{P]j1J6>]~ԡxp:]/jId$qȓɵy _Jc 8׉i||R|YNb`%O`ʧ求=:<4rG\ P/xWcN_PN0M r7/ӓCS]^Kւp5CӼ]˔sI.GhmWu[lYMC߾yZBqZ]q}S7f1ݢ4)G0=.MDd!ևm7L@E|*PLD (9C[r+LuuJ;ɋ Z~>02nyh_b"IXsAЋYןexAC;.el8k4&黪B@aʶބ&u! 쓉5 ˉϬh0B,]wByJf"vt rX-s,=yTc=Kd{'sJN"^:OhDQY ¼B(k>S9&D&h/d+E^IO/ծGoRa;--̆  .=Vx_3ʘZeT20ODnj BCͩݕcaK߳ٮ$\zgk֪Zf2n>,q橬b.@\i.mWEwčʢ#98\H2n#37Dd&[>ErX ~fWY@Q4+wL{/4]nՎnLLCz c#ea[Aif%BRVPWaZܜog&3m8'B*iv$,ė0֨PoIh*tSZj5=c&scn`!<,Ic(E@&;4:ӝ(Cf#g=|!OV['Lӵ=pK07Ixv Y㚫|wHQ, 7 P iQL RXd>FAJ9MڮͲ.w8^ml* (鵃y۳nD`Ӵq4VCTyzX&Uo(H|QGBZGjNN~T YĬ2F4hF}.xLl}JWybA6ۙ&6Dm$c-eR؆XQl9Y>7Yk0۠x CI ^qTgU=J{ 婏#`3t鱙2 }XR@d`NoU3 Rs/S8߄qhríL~ X, u>5Zqr]&o3]CwCsYEiQpڵE٪2|EL^Wsz_-v 6zUɊv=9Phb'hEʹΒji5cgS3匓Yi0c:#e:'HY=ѳmdC/;}vFAS߹sXu͎%3VI~'$պ=Pi yi ~ AbƏoߏ^~z?yPK:S](PKy.FYangular-1.3.9/docs/components/open-sans-fontface-1.0.4/fonts/Regular/OpenSans-Regular.ttf̽w|T?SS&S3ɐH $C9H& " HfĈgDcC, XN9*dvY{&D{=k֬ʳ}g 1;^tӽ{y\ڭ'{z7 3~=+VWh̉G4jSL=:fLOқ1ӯL{1s|fLEݸxh %}~K0n(>/ L4_tXxcM3jNGcƱF=$$f]z ƾ-S^ ?*/ɋ%Ry\^!Wɫ5Fym;Y.[ֳ'O~d?_y×4YZ *u zϙ+KcNbQ^y\)?'}DFP{=X9Z3q_7_bAh9p|AcxR2ZSQ_~τ5A),5Fz~q+ƷɳW^4pu']ߡcAӵ|?$)`:II<;O؅>dHWqZ3.A?DC+fݥ0TF F+G^/%K meY6q+3|^LHiӖ~'y2/O7ѧЧ'Чѧu>t+XZvOc=)S)iLim}/'[>}bS]}}}[S_TnUשkՅj:BZT;*eRKC_{kk׼Ү_s]^fzWW/]=jꡫjW^_5^{eԕWʯ{+d] L6\~6xl%[6mieY%{=Ǟg/*v^bf5;ƎvRMgc86Qf{T|?*)l!?fSi6G/O']${/cqaygy]h-e["X wtv^roy<[Nrw8[ÖlU[cIbO_xMCx9|8ƍaƱYl.3s%f`$hi sQ`;0+=*Gi޿\={|CNyPQ`S;Z&PxoJLN E3o"NL({NC[(\WeCQꭰƭ塛6^U=0J5Cs=zcr Ogh KOƣ=<=Vu[Y)l@ 51>ziw,IdU|6(7r}<}&{>|˷YkoC+-`ЍQ# V-i=ַʨxO>OլԹ3s TyzY57uNƅ:c; (t9=3FI"z] J1/xiA2R'<46 2T׊IN@g r7FC-WLy ;Yk59Z0*o26iW(]Z?rݷhw[5F eh4j$ rG蓙MT)'`,yXkmm $xlflv%U~qkAied9om;v*i~?bEΝzt?yKҡʕg[f(1N|@%kqxZVǛN=7?Q~g@Hf^\]I~?h0oͩl)M3V; M5zHGz|d0G#6J?6h4ETw2̘]k vO.J]@4Jc/Qwx̕u|M7JZJ2:rejW<ڜhM:*>7.ku+լ&^Juܢ 6#DI:iT.wJ2 jYHIMKoy?SM}!*e^W<=z/[VM~髳V/}mAy5 .(nu,+@ȘXӾd *v/KƽOlxrM;|n:ZJKkmD$) ڌզ?nJF_Twӎ6^|o{_Z: Iz/gc4v Ns^%Tv+?:WIW;:]5ӽ=8z!t  ߰(sN32<%"Y9>3Q-LQ fkvym>c5ߩ]-]eJGGw> Ȅ <}26CGD2ؖI"L ;&{$.it^0=Vm:T/Ji j2h~d 2=mDÆA/P1zM.G6~[iIۻ:Tt֭];jㄦ.]4ϝ2t:dt-teA3m踘Zbˁ1!D\gL[ j=2$Gۿl_ys-җQ>]}Tݨ.UWVټgy{IQMAԸdwm ]u5gk]l|ɚ&WOuy΍:♮EcdB$Ӵ@6GlQ'){\mn ' v5%n%Vm /5E6owϝSҏ'ZپߴW?~m!8k>f,I+L>ڢkk̙ JQHMEw3Hy[ $Sg-ftuV)/:Q@Z:6[JFf Ę݁+:oFֈ/Ol|MT6ş JJx׺^&fxt$KQ]PjXY%]5tPyS0*rA$ɀ1 uL BRdH6%E!h..9gB%oUse]o߮;K$&:XZaN8d;R4ͳ[7v 3E9XS(S,ckْW@$A–8(%FV*ȣo 0f;Hi\NXq\,]͜1;nV/_K߼}MU10Sc fr1}͓TL:CD:7Vl V=s٦nʝm^7s6,\ϺSyu{xٚyzۯ>nØ?U`ݐ :%&"|`Ad3чf"KDƚ` c Fll 8IU-KGadv[x @م!-eP ͗MٵS|dk_b}lNܴ]v]s}|ij>18OZX<[6i4`:aX#w7ȇ,qialʵ%j7_/Xbs,ųM{ELD(\Mr3 H5 +Oj 0H.\}E6{'sΑݲQ-j%æ* db8_>VmJ jo-]NmVz[[v972txv0dNj| gx' mjy8`ĥMRWz>zWu:E*|sMR;[.V/a{@y'ƫM/_QϪ/-"pz_hm a88x|\h&F F'{e`'YyQ9:R#X7ӟѕS #gУdvr$$^I;h'&-@:W,ZdBg 8HIJ 02PBD$ƭ]$ؠ,=vEp@ ٜ:_WM?wA`6w]W@ѿBsNyZ9uCЉ'Fbʍ+{bڲ'4,Hib1I8'g'6Ȍ68:b jmo/jmkkyoIlceuU^vl=jzE}xs b$_}9O&ٵŢGv#3l%{'G0,`#U/2] o#3sߟxo#2Euhw(3ZݥA,&//!2WSu2_ǫxo'_@ s]C=j" (a [΄SBf{6N[N$ח6I$Ηon3:-۸g:1W~1Wq4`,Q#2WXset.̷x+9:L-IsĢ3fR:9;Nk~nὥ;MG)B<~5>4E-~ǰ\ؐdNBw[EٶO 4J}"c #a]->GN"Slf8g(pjEQKnbpZp 鄪7zoG |[+}QǏj]E3к;{}g>wԽNl94< soD,IS$% `{z!}\b"LڮWӷnqE.?mHqD̗`Q`2"V2heii $ $mU;UY2ɇ}c{nWZu<;dZ -ƒ`VW|6?wB]hҖs4{ػG>XmB"Ds(6h6MxŠα߸tMrƬJ) j(ҩ}?T9O>?AV۝6\+E Kʲlw8.L p$t ;£ 6zrw ;Zy֨s]y|+*Mܓ;$ϭ[ޗB|r[wQP t_ۂy۰ /4 ]f$ĿU۝ɇvNW.u$^ E<W"̒}ruA* ^iogqq/;&B)][:#?F3B#< 1@+ɡ5@6uiKu۶/91Tw5miO\p nq5FS!6_ /J{B+2' 7C `^ tF'*5M3z׉B7j9dc2w9|9%otua@Dϗu>iІ2|ÿܦQRnTBO;֩o;{n芹oI6N~n%󕺋źe(ۂA`I,D ͱfWLϝ|Wv0)Ea?7AW9A7Tƨ)Mpd8lD1F$̹˳t +ИM4TI%.oD (A[-@8 !1J! <1@!4Ui$\ee{#A4f~~:`}/oG-[vUm18e W/?g2{ gAD?Q GX(al7-ŋ +u<7ý6>U6L++Ƽ1cX0JONF&ӁJb* 7s'4g^x f43 z "r8)>0\fxXryy7upOUm|J8?lzg؏ϿkD4;: ʗ6Nq'4`)]" @AL"h2Z 4tE*ӤEsxQpտ| b))RŏF髉d7sw=Aa1#v :h%,6@k94ו8#ގ-Dv+:,܅L#Ca1Xpd.5dVȮ#qZ[)ݧ})ҷ4}J䷱e:uwwX9mߎPIA0N#L43_]mG<30661Jȓ\X4 @Z y4\XX7KQ=]%g~ĖѴeGRJmy_$kI];[kGBBE4WvdCo)g"-l 46K:uo 翗ũ^ ~B-kΝi[M+tF]{xF>GmZ-RG22Qij1Ll܂ǔJM}!^|'`C ic*FX ZX<&bp$xH|VI y3qQ,^-#k{0v;qTHXe9*"vD|MwodS 3sʩzrꜝt=v|W?]Y$rh']YtdNt]1>ght+iଚ ՁB[gLq`b0mNK߽VYiosp7:xP;+M~F~#?& GZ?,"`?±?4@:f8뛾~}}R&՛'_\~?K̗$k RoD M\Ɉ̚*LDJ2*+(K.-.j5 &Aw%FJQY6uԮUx`: 믞WԮR}KzR=A!nw _oSy`)d@Œa'te#ĈH6Z4%ROnqhj*ϕ%ѱ3[*w>/TX޲jv8'߾ Gۧr6bE.اV$Bk\&=.(ۘfXMY0|W[wK_|1;>"&A6AIEV2 ,REtↆY S":aJ m VG.t EN \$ F"B kn)Udv.p^_p5Sl_Qn쩞˻+COL^mGӖuCɠ\ wL^IC^7.t0IE@*qArA"rA$te$Y1`QA) ?GaGw.&]蔞DHA}mĀ oOuQhXX'06zk;UCx*`i11@aY_n@Da9H9ƈ83+3yInt$-- ` @" #e<";[Lѳ#_ k![j/m )BHlVJ/-R3JHDIkҏt+ECSK{5t+Vҩ!n?őeGGh@NA巀 ncMIl0 Ы%?jJJN>|f#ˁ)g),I'qbhb:px>'܇*L35oqtW% Yg5"}q󘴤ݹ-fc]Lb]^4,{e W)U]7P?Pߕ%:ՆjW<Yg3\o%tՆF7a] <:豢z>ڳϰV ['d$w*2$tۦ.9~ ro)=Nr):@#"/.,D^(} k7߱c~BǞz,qWK~:%2dyJkm #,K@X@I+OP p DLng8 %0 )6h_ %zfDj U!C^ eߔ%kYtAһY^\;@A(Є{*'l2J#ph{-ERvq7K 8 VkRslJaQbuSLęjuB &bY4bm&Θ] {[S00 _y޽ _9~Ჱˇ/ݻx̙O>sz-j%_#fgM߻kϞbL.{cGXm2V>z#0b/YSڱX 82- p(Qh*|7N!POԑܠKocp4.ԩ \F| gx! .awYcL<|ZXN6N^Ő\Rd[քPG%:*d(ho EFU:0c3ڎb3[Q;oj >Vq0wj%5T2 b 籁Hd-]KI6`VX{z}s3 G/;sǷ -Wnz렒'3[Ѳmۜæ3xef)N^ܮS[ٽl=%d` ynď%x<]$ "zG62[038+/(,.,Okݲe}XKvߌEp"kZ8R 5[P YksmS,d>ri%ĄtcZGc_fb#leCkSa5eّHb)xU2eM(sMD( 5>]{MYu/R/(/q痯>6C,_dV㺿tI|MjGg^T?yoDy?g8#Δ@e4M6|:eIƐƂ`*4YusBS-rt |cKiQ̦98(H%C`o6,T DxZuDܼ)#$h/; 9ӗ.^k2S?Ѡ^f\}٨1`K@f4YBF̍>xyYY>KI[{==ֆ[bѹ zٸs̵?X"ܭRKGBJ#CBW"/_JϽ[wމs5 ErpnKb0f5E3H-@- @H=2L-M8St9M3mJsDەfXޖh(7KEH?ӹAw_?pvCG KCBlˁ܅兿aՔ 5Bˀs…p:x abZNH$vG5B"D"!eAZ|{crŋ XY1mM^RfɀM.8ڳ(j+ Kp^L8]YKA 5T?nkACf uiQN-8#{ :3ԛ_n;DJ1NrzvI}[܏J3I{* h\H.,Ξn5f\l [6>? pݔ}y7l W‰ya\l3K^<NLV'up^Ngf}%YSCGyK|r9S*>g3{IygP>&j]<)t}s28k.CD #3 _kѰ qD7AXWD܉sG` qcC45tyBʡXd!Ŝ"rwU ʂD~_EZg2ݛo\ ̡]+t'*f촬VGUv 6x[3 W\.gw*Ǒ-FyvpBQyfUFH9 /"U"8D €PE`Bnk WYDJ)1Ώ9OҌPT$+.L%'sI:. RCפ!{H2e,0l.Yb!&EO<*{{lN弬fr7 J:~־(fkߨ|v}s*G4V9/SiGjcv*ԏ|n趁3'fPұ|=RGDq|?Nnjc1|$mCy#W?ɈG>EVEd h1N@fSMANRk5SH{8q/e @I$SScu k{>w8zϣej\Uqǟ5/FgQIuڲO|ݓqwGrܱ34bbVyj-m !Q.$omD}cqC!8Ȍl 7 |v'wvi| @֝zVf#AOW"n`ѭ;ԇwNyYOh㹢}^ĂQNqNt;?PG>}P_. 3GhDQ?l; ՈH|Koy"*mLd@h4-NDn/\p>4%YAS7NX /3+R!5 ,.rSr$tj(8yڠ3H(Yq*v*w_SZرE73oMR]ЦgA=+䳠M!o`MކhMf̽ή'ٰVFZ~9 5ZC}OPڙ h?L!g(0i_6X}G |XFυ(_$i_ܪHt_:3it (>ZBypBj'^/`dwK1F"{F(FG{={A#9sOT_Y)#2Cv)hT;<؈=|w vca" ǰb%Ɔ<Ϫ_Ϩ[뺫TN ԴN4u6BJ,#>S ˓jwj0kx"{/W/zA^GcE}#n]p'@9sDyt.R,~7CC%q8-|0bD6#)H>A:c Y ^Ř:,_c*ެD?NN u?4^#Sʆ o}58A$bZNcTy(4G6Q*7IZLЉ[|U{iȺo#=RA-!墾>l#a^NA C<5,+ sԅ⌙D Drj@m K %0 rq0JxI$…2Rbs[ mLDs\왆ȏ[T}vC'X9}xtQ+NchwF'opΛ{OKb>᠛9iA`мrºBT"J?T-(1|zHr$)gPd.t&Nz# 7tC5{{ͦ; @ (㺵;;sÙP.|bI_-0lQ|X?n/i`tΝt>Scg8G )rbI'1#8M -r"P Hk~D : A ®!4BH8hǤitEr a%T-e.Jw356uȐ'e hNOsYiYW&<ƘҠ_ytI3 NMXܤPv :wUS@ỹ9gU42Ri"*N@RvʌNj**98 =vRS-@_ #RǴr kP4n~ڞzPgH έzhs?lf9G< 0qS}^5\~@+~j %7";ڮoG8kj|H7E?LWG_)낐Trx4!WkRY;`7+iê{p`q~ u8oڑCH}J}Cumhw-EKYiuqwE{ͩILrc{2z4uxeM=uNKj6)z9>J7tTuTȃ"l8cF/N-tWR (Rz$kP?9<ڵ̵z/ -V>\]9,OqQ_"OgB_Ff'G?8Q}!'CFINh0hhПl 'Fk8Ҩ>aZ'S9S Iz(Os}%BPߍX.=-)}}o yzV?m/UEO>NJEl9R.O G=Q;Z}[D}]ovՇ}_UM?nտ>(l1KȤ0bI]2a$on^BLz1[QULyC4lQQc!\[x <5Аl:p\a 8c5 vC$GQP/MK;G8_K/k3ٽU/G?t铏? bܻdd^iޮF T hO2u{C%~ڜ+s Yc骶[7џO#ϝ>!{a#Ck1$ }o WdG,RYC3 d>WLw.4 ;Q")cDBD"qяpRwpӀA'M`6C !!iBn|<-)Zp?e~X\EW[@':Le"5kIE Q@es4XϑJ.0XY1o$!%t5s01ܪ}Ia~gwx{uZ7}Kܤ)Z-O'KKKڷnssk=fMU tB\H!'0@!"$2PS~%\0@S:Pqg>PӢh6#FK^{`\ORtJ,G3%QhgEI+DS>]!`4Ȟhz˛w/k,\ⲏƝ;s dsǍ{dqs'/i.CTˊxs,|8y= su::zƜӦ ~68=&a"dЧJ1}Bfd'vIfx !h:r$CQY ՚WÆl.oe܎tjut]#0*Ĺ:5:BIiwzέs'ʧyW@6*cpV!X4"NfnYPkHӡZ84Gxwesʗ^XK,kQVYsߩiBH# B"" (HSD"F)" cęI(FD#YDEe]t]Ds;I@sdn9SK>#߀h5ۨϰ HRB%QVfu7깢}uD-n:^yD><u:'쨻 /rkJkכmYٕX~4Fi &>'pBAk@Tqΐ(2N,}IF`.Y-p}Gn4.߽.5 cWMI1aQǯ P0|Bc 7 & 7#1 2:٭6g<ٓq{:5{g~$6!T3T>+B(څ%Jb@i"O:?d?w1m{t9,eE=6&6f@YI#O& .XESaPDvJ RQGG/-|ƍG ZTyK1yC^\a:6gqV~VOJLb,; :YɂGިKxfjŀ+fR@%7_fiͯ͜Ґ|'a*O/PQ'q}_Z; |^\#宵3{„&N 1Pw̛Vb: !% ^ޥ!z\f6>5ř]Xnlt3L rpC!PKph(` f[8HYIj'-:0=`# [F 5%m}ؙ\|x'z%AE>%CY#Xܫ\.PWEiN6x[n]tov*r{vt"@g0kA7`\;+?WU#F3tXf(nTUSdkK x[9*5 򽖹KcaN7M<"`etaRUO&DӀlwüspdw#oIܞ>*{Pc %럀xޕ19ٿ>.o:ls7_d8R:cHlg/ODZ195V`/ @BcUp)Nh2ϧ?c 3 |s{+%`rI6ӈmz] ݂x j7g<G_eq2 Zd`:{kgg8拸Vqzyħ`WQӓĤ>:cAl*\ޔڢ4؎}< dVaM@DȽlTlpe_h;A0b"EՠAE#jmUƅkd[pc{܁I;?U-:0=1c珿 ;;? 柱Iȏ+*lhlo,_cswwg_;bĵ ^?"OI 1r7tBC.!Kh$ X 2l~P# k L?gVJ!e$C p32$/5$g<^m"uìa+2Z ֣o> 9?xћG<^ߝزq'(ԹwJlm#RQ(kOn}t k5X k؅ C5y$ P/W3FezA:=*מ㶙s^+w'%?:_}I7S=WPƘ0+7!]T d+OvtaQ=K&  1Qߞe-^O]{)~gJ_ee*viny`]~E]]ӳߴg{y{+o]K5E)BԄs}b3AlJn-Fs H#E(٠HkQnR[QߧGyҀ܅CEeņ6r|o3㻍y rjy`cë/>O"w܂ynJ_6qKG)X}s,734#p[h-A C ۑl D@>CdK@f@ PXf=g :qW㻪??D~H5ϫ ?-_q3dq㚭tf ʢr|%|@pY-mP#EH:_ b,mV=OYRn-~z46]<[慝 $ $ _?~d*lBQ<ф2!@bJ2ym6ba]ġX^E*zwqebmFBZaaIG$^/M[uMaE%97}$ }S4Qy%t,!cW <fͨ=?a=U}T?(^עnD"faR (lS.} Tio"EP\9YZr^]Ae ?.3 {?2ܵ 6iklHTCv Eff> YlDL&| Pg FR\8$4yE}n񦋆3um{w=n_6=! >O1ځbm~؂q@Y!H{!MVuJ%] WF ~ɫpI3n4B5 3p3sMe (eJ ,-vYg=8$=uȞn껺MA+ )(U m$AmPtdB  EgOR\dn`# sOoP[;]̓?= RkG)"5u]ָ sӚb0y/݀c9[gvĒYp\nMi(b$Wk?! %dL+Q$spkUFe߁Hއ Cp!5 #l 7VW]*`Mݜ^(eӷ߉x)~K'=AX @P!<4:FUS]ph&Qbes'8NSF檾(qj0|\coP/܎r;Іmx"C{ g-Q3/Z1zMgflhuo7q`F}nny<~/Wd,Td<᝗&Y\pi0z&{C (ѺI{V4:ן5˧ nF ^nDpMs#ޯPԿlpv+Ez9|on]:Xy-6]윖Yy[#ɳ{چnClid?0Ϣ C<=Fy4CuL`Q7z<Lz._zKſIoƮHJ' p~4arJIHwf]1{ʘ[76z>=*wH;jBx.~qaz1ۓM;EPjIUtDq;0V ޱ;bi깊5P B#謿߼cx?bYn> { WiXe(P+EW\;Ўl>xf~9l=&02Oޢb_2?zVg9VZ/=vht_=m7g9tQ#f-:9ٙ |QA)PN U*MH8#fNO0]$9WDok=:ckwvkݺg:{ȧнdDh6hGR9O_1={[1$= F@GxNDaFf b޽ˮթM|J#B c/0rCE;<,++T|hM+VLl2b.qajMƞ%+(5-+Y[ba,%2Ovq e¼& T v0APaj-ur,Q'ym7({F߾e{t[O~sg to߶jϞ{{%L H^_sEԋrO='\\pj~ 쩎$ gp5zՓj.C_C .xpdNӖF ^6}f'o>xlG;ꢢ= Ǘ-~<jf!kՀ4*" +[誹EOmAхyYʋ {U߫u?yI>dɔ>oDmy|I^e`?pqN͒GsburbnR^3:rs+v#WCqF^$ sLXUٱb5$=Bٴ<t_P;GgjWX%6UW-Yt 9:n޸ٮwK(W V;'4N::rN0Y󸊂'Uo9i+Z*gGqKϤ4VI1rU`?&|]yzn\ffs< pn1MPA`Ph UXj@>)H.f*4?k$@;/|mN0-T3;9r%#*u!&eSLR#?kk5Ua!RoI( {0 jw o{_G2k>{kCK^}r쌲 XÁ['zIgqMB*7lK35nP {V˗ ЋDtLܑm(,PYh 1|r[OȡS[O3|B"wm `g.vԾxY).xUWY>Wi%|.Ƒ9 )iMe  :^}FDkG:rTVr@:q0]3"l O;CPtN7d8HJG.`]:tcSnZ%ڳuxpXaS7K5}qWP_ P)-g4g I u ]7F)P,v>!m-pFRȾ."2%xF?Rz[z )TnDA7"Η.,9eK誑Y)?7ޟ>n OqV>5~i:I,Z<׸ZpXKXh'T=Cց`KM3"=f"\N*f.+O,–*&ዞo7O]iQhci_&:o65k w~EP< -$|n֯st|fCm5 @&wP\fRH#Ĉ9ubYyYmOk}ܝT{a64z‘Cאt6pU(̤]XV[MIpԯW;fE{Q! N KB?mWGh݀{> G{F :B % #=k8/%e{MP}3# ::%."%~5M;{WV:LiK>|?pFcCz$XO܊Ƨ`lR, ])EaVKA3U;Pk,y+-]<70 Pn?x.C a2>!-㣍E%TZ,udgHQP'jD~𝼈n6D/Q,3M~ " G:%P/% +ؠ@q> M MфF(c<"۾  vHSbiKH,( ϭhW.2%pA#a.F L9&91ŚyjѦ,ri2~W86 >I`;oE Pc-hmneX3jyOnhO1 _|;z csol6u]P$1_atΩ2|x}xs,?eV?iy(C|$>70[K GQ㏢0CҢ P6&{pb\bH[̠nô|Ts: LEa*Q,]uBkOuDyO\s?d݈[FvKbExhw-ku)9BN>-y"%UG'[(ߌ[XS (1nBx7Zڵ0^@40Vh39l-(2iyu;aYv/ |E8vR6g8!3)|_0V#6U@yCbhtoLF#:qmrWgIFqAnc^b.z?W6=dTRHQ.!1^m@D3L滶)d(:0VX:43""DZof-`!b\mr#)BkBsd^ 2 yݾ:OIDQ!N|D$KF9,ԧ18{ЅXgbsÓHxRX4登rWpCN T{ :#W"pqSH}/"(WiYl5`Msh˾\Á^r0w,4Fu^q`Zk~%qܓ*Fx4PCV?Qm1||8/̲z]KՇ!΂! Ͱ4^KEzconVlwK|q?ۿs-eϿ/UgKKM~)jͶč/ދvHè_jf:TN<lBD S}@On3m`ܥ΋93qIX0hf4h]=7G)F;ߔdo >O3=D\fU IygTvD6cCӑFC7(<cCZ}S b@ZA0Zl _hХn k5Ŋ9aأqv* ,;?疼4j8L߆<}1RXD@EևE2b]r[ =r"YG"0ID @L*N!8(AQi hfwMEZr<_8/Rh/-ۻ !\"oFOQk ¿(w ͣj,F'd> |s?N~@۸g uTM  xlEJBf{0Ll=yB7rJN͎;oQDUmVIK!pAv]t(qVI L!Ӹcc(Hi.PГQHe`9GO#9z5oP# fzy=.`-^NɃgt&(J\I8dd_fzx&a_>FLXPp9!ʭr- ‡ &2\LāryK"$)J|-B<ۦ D X׈}Z؛@ @e!$I'u~@p$k\tߊ,`B͕+%p`e 0+]w)AA8ݡRQwe3_^2f/c]׸IN_vmsS.iMabRr#<`v| %ޡMncC}A.cKۋ'o mI5w+H,ɪw18ir"z*`lq4=f U%ʇ5ƌsmEH׏J3=uQ\`+⣦+ub(дb(w||C4ؿ̫ He(U\ e0T|Q 欸-]|\tQ8Z⠋BA0r9J0 vӜj9V$arGv4|4q5Y 8?3Ml[{i<6s'Ƒ桛(|sjaϯCe.`g=`"?  #e6:m﫹h7uZu0iܳɥMyFPt)ƼzͲ9ߢu\ #\p' 8^ DK8@HFn@L颖2tA#V p*l-5Tl Y ن(tQlJ^ TDȯ^[7_>cH!%P"k+&?tS  >q#`6MueelLMyHcފ41Mٚi Syc!h_AFհ798osRȾ>sՋ,pb[!";;O4{|1rqzv9| /_ a!"2:93 2D/ ).l'>O:N#2e@kS2iTdaݏ@oJ fo>(:>xpI#)U I I25$-$ tԼ fs'Aw%.&%d,-HQP5dӜ! .ɐѳOx#)}o)6ni;ʡ/3KIl&&[6)0֞tJoyg+oN&ݡg|hUök0l8zZ_),?9Č%.݋S$iyf> )' k|j,HI@{IL-(,g? E;PpiuImN3 .L2R/C+Rn ,+.`K lqFie߶")w!+xm/Omo=EsG-{qal^i4DG cgD!O[v/~e"}+ 1"b}hW/oxsyb%l{'# =)=:|ړtU byǻQdq66Xms!hK ;Ju.w 7 wv5FF%d+ԛuuQfu lH{"3\uQ i`Da$CGJĢm5wKM`hn7>_GM{Q[0)ޥG|jW0r=0jSUwW!7v$陋#a"_5)H#{w6Ӷ]Qٜk6ν,BZy`Zxba̓tM Rxdn0!gp32=P;}s?jeS{U$3%79tzv=oA:Ɲ&.7BzD9=Ӭ=DF?#çWݸF|IeI;k4 5D~(U2%uR|όP sOwbޜI3 )wn>WO~v4{n:kA{'b"(PrX"&R %'k4\6dg)6sM790t֊ ,8,89ms>>V̂z3^% sG" D-/D4u IufqufzOz6Aʢ Шz~?.D,Z7'Z Hg!:R+eSS^yWRNǿX"3G9ݴiy80{D(Qsysqq鰩ґok@H}bnSPoW۞L@<(@AƐHjEEF%Ҝ8aa[ԔDwDt BcG$bܚ@Mi ޱ2ڪa]J'>tl ,)J:#R3;ͫȖ:#Ofu٧}MmSSۥQz:L} rt lMS1؄boo_:P2aC +2Hq0atE À)_-J5Zގ[_7oG[+_J;okJ|ٍ[-5 ?, +vN_l~ 1F0#va8Q)i98m`?z9{;xzwHh^.rjG"YcfNRjJ;pMw_o7oL|W??zϬrS^9(b5zv* z}g;g-y]n2c/D3>'a=UE>ťRqr\B{R'Sj׊I5/Nd :>F_$S:DR/r&ratI"e(BL Bc RʹR: lAVƔc2rjvn d rtlfkaѣ}?|鐊X7,+9twu M{ؒwٝ?1F5o)ɓDK3w_Eryr眝ZΌmb|=De/zFܴ K=hZi5ZO#;vH#'&EqE46--y%dmaI|in{D:/.9767ϲ KxUv=Tbl=SUGk\;&yt̜ΝOqN5 OCR?7ި٪1#!8>i<[@Hqww3(!؝Gg~-I #סp^LK,qJWO)q t69W7*;SPHboKI^;\z5EcUz,Uy\U d{2t-~;[NogxG) Q ]v">v_'|bN=:+YSZw  A.STXE^aHdVF1t&ނX\_~w+³}P:|}lXqPCww8|W{7 |pT"pT? s B7;c-A%A敛|e+Љieߺǘb(S FͰ 1w=<]i:}[o cg6Ď|o _UƬm,}O^첄KBq)(}AcW_4".mZԹ\2D= `UTUo CnU^jPgzݼ P/MA`DCaX 3Bt2 $eenF; [`֑wOo2̿X]=̵7Mni 8|͛` `S`NO35Bq8ʪGu*b}ۂ? M+`iZA剂 5(:٧ D'9愘'k*O $3́wmr!ȡTDŽm c@{lMdq | dV'a3"*;g|v%6NoxbkiS 4Qm~${X "K&zAVB:f-qR`gGZk&5bbxmzTumBF7Ǫ<<tufû4ۗ{w;?9:@œ%kGˆzWr;=X'I#"U#< =,`QQ V# e*ND7>59KDo61{8ұKdzRn'8IllݟwuS|]6ιmOn[ HڑCo_qkN&omR3O4lP?+KwBx.jBP-!NP;Qc36/n \`A~7WWEٵstmpp#w=#')1 [@MBԫ 2ph:P6c(Y-0El XV{|fik0^8x  0q_õI{ x鑲5BKy2A}qGiC|:|`}34amiADiDq ;kȉ\\^_8uhЬ=Q,% g}Ǝ#(0bEùh/>d.-@ J\W$俅),@\i7^&ЩTu%h5c%z&`U<t(f w\4/x`^>/4_6f(W Ævaa>Qc-w!}bR]t{;%2A4/ vyST HAFݶH5BX\~㫘d szҪ虊2K:lR-c'ZqJ"K c=QV-cY8ˊܿe*. jӿr$  5[2nB'qM=ϿџSQ <džF%-M/@ :Ёř:3"e o6 IE@8_ebzo 7¿pu ,D .+O5?*psóEjZ?inZ^Oi+`\JR=/NhTZ vX:Ɓ̑!?e' LuFRU%8ƽ#U.D>* ,lzS%)40X7\Mm)bEh,hh–6>%ߍPG#"W=꭫g-;ek r |?G <)):@-J⦚rJ@6@[Cه2tC2Z !d.`n@3Q/l'5l~Z_cqq9U;C& 30N7`oQ j9hԄ7gLԌa*kl Ztk*aW)jt3_ٸFm[{[VUmUeSn,X(th%`IW-TGܚ'/W 5,8fC4iky~PcNZ N9.k-ǒ֎>*Vǧj F۠+>>>Wq{>y?ҩ3 P}cŮDr5ETɯ 7;Qnci2X?)Wcjli:GEXHVh5xczCS 484.?^P"S-k2#;7Y'1h *BdQ\ R}'lA!2ۂ:$ZlYȩ =1HGTS;1PЭz2Z,770,mͫ`K:$Qp²-8"IYef6Aqb#G)_E@d86p7]66]2u[ X:wHy$7}h΋ w`l&ߑo"2f90ϜD 6e4@uʴt} pi^0 ߁=6DUE O`sqȚ_E~)h4 iW<',G-{gk{8 hiN2"~֠|(|?.֚O?=#jX*4x(G=ߨt* >RbpM.Pƍ-G0mH+8-f4#fnP_6ZQ#$7֤˗@8bg=c>[ށp28d#ƩTdg`yJjcj(  BVTӼQGڏ֋;?rwϑ+;_=q|Wn6jM1iIA1[<21 qDӿ\ypDr z.rŷMGQPjXF2pP# ZH/$lt<srz̡+rE{ҁTb,:`'VxK\u~TwzZ.X0mHV YXAvgn:욍+kfZl{|Stճ(U{Wza+##G\fݦW=\;0ďIvGgN^Bv2ϠC. LCAr4vP@ڙO)(܆K~D+LS;a(l+ẆR>z~ɤƇ|tlǥ_?98YnwiQ"{0ת*iG8B@)R)7UaTVrj涥=S+">CX/cwq炟hbR\0$#B 0$%:0QQHĮ!޲cIH7Ii4($wDDwZiZiX ڍQɏjAFOvi~uri|:@&H&ՠ'۱[^g#0Hfsd8SPkA_]d#lYᠥZ}%Zp|FLOcAF?b{n0Q ,>aKA k/dcD* c2BM|#;SX,y֤5^zֱ! a7N9%?cW@ɘ2hTACw"-F[gr؈cY 1+ܶ`3|@y3(VKIÀPIm@Jaqu:f 4T 55[}9tՄ<:AX%#Ĉ8 Sk"نVxd] 3/f%d5^(;vR2'zzjOyJ[G 4hEgJx8BhAhg&Bϫq(_M&JЩi=@(M wecoD`FFq9Q,_4PS^6G]v׉7'ߌS~pqр.@^O.?S6$b(MR^g/ZxΗ Ӹr.ˑsL"%R6//h{ˀ&^MAY#V E`IiԢr2ؓ([-ʒ~aa&<5'K`Z҇z\OqAI~!ַ^Om:;M$7< |n$HGoBD6 7=dYއt/55d`UT:P$ؗ |(%4, y@m~(3YX_ڃKkGQJo |39ÇxqG w&\ԣd&_[r' a 0)pW -q5'2X Q,eN1l=HrrEϩ99М,R}IsJ ñ zjj MSoѺgf&.+㲏sp$BJQabԤ:tPWh QEh\Tf~NnՏ@w8q8^ @(s`DxH ^ҡC.AФ+tP{[ف6JdPWVAMhCrYPA1A 'A a$PqM_'Pܑ8fN<8&nN<Δvs eKJ\ڇ,\d=Jε.e>;S;X@$ g@rlzsa/Кu;ymUˠ๒qqa'`4NQ9ǩdƩƉF'`63,vx߃MEA#괦"QOcU3V ]9ݠZonb x7j<&͌jzD%iq&NSر&?JRX(At?dEG"KAo5V4߹LMx w D+K龯`c`fSp*{EA";S<~}eo xET[S%ͽ̓mwc>GܛUU{< ( " fFH qPLȼLYy32lyv5?Y{zz׻wGጆ55{reB:8\ǁ6;yL-)\x ^.i?BQ{`YqRUFP9 [7U﯆32s8`]㘱y?aM혉3rwh/%K %XTzjWjmHvmשJLP; Ϟ6tT=ECH>EhXM3M][ci/46Z۞])zUm?ۀ[s'#A_Mz&ORI?=-{Z{ZОCSM-g(_ĪU&X "?DjlX^d[E1El;'dtV] [@l;`UC;c|R,̼ͮ ='b6xv {*OZn#ך9N`lvmY %WwG'/ֹ7lG'+y:kuvͨ'{ wm`sQ9r$bQ/c{j}fOͻk8?,5יow7-4sC5W7 >Z.Kߎ>(?ȑ{嘺}(FNtO}.KŴGF9"~J D~WC1Yjڅ%gu.h >9"V4a놿TzՆ-Y(I{ 5eu֩)PN:!hB~#Df+-bG^1$WƆ܉&¢D~[~ȟs Lnl󕫼KBŬM.o-gi>W_ ~\ % 4.8|QXD'ɫL|Yp IHP"%k G^y5x#+yB[RAûj 4p`fH*Y[KFx;[O ƒys;te{C콟߱n~7koC]{w6[r 7vIW.x?8XRmo@vBs&묯OORS5,{|kܬ'nTlAHɢlX3#=yKE8?l[@ S=7dB(v=ykO5n/5_WZj7΅œ;3lT}`C@?՚OX< @Dr_P|$>?=4c`=_f_{ORcY!],PO#ڇxt&&bRDJzաSnYxzØ\˧?7W@mѩ"]dnxնlC%۳jqٛg y_ 2pA*H "L\p9%^4VlfH\pLv lj n,t_[LHP&uMU%J-y!Kʟla~ů^qN]{4.p=*om<#1|AEX_wǞcG,:^j8MLkW'\1ob;6h_Cs[oxHK[CJ+ޑ{8nc0PQ'#B/ШXO,zWV,;ge4oE 7QVU^qgͣ|B2-OEakȝwWGwyS9^1?cT>)Wu# )Ѯ`BCKq&Q'\:@a$%ѿt4ˀ ~Q Ԋ¹6z7P]!4N͇vR#| ¶P5MӍB]jj:ty)480+-*` +M@xٿ:{74B_/}EZt_ IHY-t^3M 8``!XQgbSiiu&M{'|b.P; .iG`uQiXy)2c>16,ESOrImy^Xr-~Ugtx@,gtЍxISVVMBnbhF8&-:hIxcҬTmCТRhUw~eȡ ߿s171]c"~ɍwaVSMyGx7jnRk`!GRnbvTHk ;cbiSQ4Ԧas+:t3HopBp+5~)y/C Qz]R"ՎTځ.X`n,qk~42ۧ93SP DD*bWbEN/}{;7цDă tn a'|A.N&$+f@ݎu#}UhDJQ ({xS;3~E/lx+^K۸uWlm7۴qއ>Dļ%~'gI\sv^;Kl|8KVٓQ3>tC8MapuSaq|U,Kot0}8=Bfm+_0d/K)2Vk@/O{kB?OpӚx9j5/x9T> %{;C&O5ﻧ3Z5WtUfOYҨ/_-DRK~Wyj]w*_ѯ=1Z~rZGo$>5.S''AL˖BT8'onxrֳ orR?|w oO?߮O( O{~Ze_]'o7XIK#`C'58#P ,xw!o/'*>U貓xY/D_j\w'R*y Bf?;Z\u_hl{j Rf NZO%#);S"?]ߩ`īQ=7 էGe%|KУ5G5.K~§GOG~GxH?Ew.W*[_P^ ~ټ-!ͅO=OĨ<~1x/-奔)RO=SGpuR+WG;!OukD?u~V˧S?=?5n<j DͿK7+?5.E ? O;?j=|%wyCVZKɟWj|ȏ'ʧƟ|j}$h:ݠ|-g@y4>@7^/-q _")op{m8Fxe@ zR*r_P3UŧtÒ_W/:?͟jOQ>9[~'O[O5$iiW~OQ62PS?C^Z UWh/t~;՘q!۠j~(^=/?Yno]UG{JS^|[}^-7N%}"Qyy$~`i|Hr1=kt1Hp&lH "ؕ?bW#ΞQ箊fɓEE}w˱01#5„"v(pW䬎#t ^a=K>`{Gª?B>H'1P6{y-L |Yx"o7syd h1G-V/>t|Fy(S ^iGzEB}>7h~+n@Z~|w/'Gc?r|90i>;2o/vQ! 4FjHh&Κ<'A#Ah %t8+8GwCO`[$ZeEˋ[+<>f*ZDE%%Y_*;8P ]{WQǞϢxL2UνvFpI9]^ هl>ͷf Fh3ڐ!37#`%Z'Gʁ= inއD/{vQ w^- = y. ]᩷ՏIp"Z=@W]3:qkmsJdKo$j|;D :܂{MQE[%iwv"nݯ+df=(J@ϓA ף}GI\aeЦs>MÐPqq͍ju:5|zώg֌>eN9d{LJ}W'v<)}tҔy6W۟pv+?x˦&]¡;鎽]n\}g_x|=[%7Xg >^ ɒj|BC a;]' 45%yELӆX\D{`zZ]2QV{T+,FeڰXKɄGk(q6MM56it' ٺ"Ma8Ǐ ߌM$R3ϗk7wmlh |- Y2ͦ-nكECU]+Kں-بhtƮ%ԼAl޽{\5ujNԩY7{Co:p1{ ðIjoS0KLT#Xfl[1yeiX~_P ׎DK..O4*W_tT#sbz;kXxVmz:u `rzS<2&Hͽꢖ,Qt!czTO 1LKB)-I918:R|nUd#4Z4 AnX ]Ԑ 1JKfg c0p6dksScz^_qb f ߼p>&AA+CusnhDfPqj*醹G0I萒t_6(kei"gۉɃ{@>7|gmtSԸ>ooܸU1!g||NJ]!C/rGM1vcL}XЃGHT$ IbCtIg<Ǽo#K+EcG"mSMKDmC 'c7FP!f7CTg =D) piq%h%?^[=v+q[6܏00!.㟜hZ31{ޣ[z[IP!I^={ܤ>oE4H)bAEX@So' "`GC1.YK_ZaF8ux:z@NWcq//g '=yT5n<}cs7ն67*37!b?>f<+O޸7Ks! #4xI^i DoDFIpP2R/r9աGSwk-ƇvS eŁ\Ze[߉ h1j4C>6\;_&qfܵ~&-Mƕ tuSO{^…6ooeș.57\ɠ7_A>m6!ߛ4+hw خ[ V0ثcO)<`k !m:{hDDfXx疓f j-P=0C?Xh*xLHL%PbQ--G´ Ÿ޶~?]dnI`#o+oqZ^R9t3k˜'EJ& ؊aJ'$k1?Q䠸"E;/nq&&CHF'`+O’-pE$龮.D;#1%a 3v .#lt}n+˲(4z]YTAO[("2xvϘTxrq L[cV?~zsF=77gФxDL|(/ݽkZG V JꙨ p(y8^i.xettC`ףփ+BOdNbv{Zl]E=uMz~r WOw5NQ\|w?['rdVvBY]%O*hI =A'x@=ŝ渿ݶ{,vxB0*0V" Hjf(WڠAIEp8DCa溛;~xԘ⥇G]ix~Lxaw}^ܰ|yOtZѲ'mcX4 m}o8wg>N~ BaԝCt\s q Xs,)Nd;=o;>g&^ycBOƏ|F |[%%o_~ z n#Q/)(ԍm Vq9a!Бy: N[&l{/"橛J>I 74U/Ex=N u5Њ,zeg+1aׄ>TQ2*#{G/x(_^YŠ6+;ܩe/ \ٛ-?Xɰi~}mPjq22`B|0x`+lfHˍ sCE}(K;43CG<~bU7yVgä$PyI)ؕ\6a$SieS?(qV[_O`_lʎ~}z%֗I F% ܠG P'8e"0 B-tE('#ܭvq P^[1vr-s^|Xke5PbJr6CckI{2̍Cu077MGsQݦ86 %b_*7Gxis(> eCͧwwswʣ Hp 2+t5&zHXF󣨙^myx}z<~E;_~l{eҨ~ԟ>~  o3IvDSB#cz?ќ2܈i͙ض7Olc"R %EԵ*ҶhT9WqnVunXȖ; _d82=4Qظc4$7siߜb߀=SR鋁X%['`yf^,:b9'{B[),db̻`MȭY. ,0kFqT@tv$q]VV׷.]vڥq>s6œ<\R:hhhtSĴЀaC>c.0ES~=Ub~A7JOVN}۶ٳ7OyDo.+L$w.q$1%GgDwUgsXrڌ0_—N>$ZcL;ih(rg fE8SCC$6eqFnۀOj©r|#|$kL?(qW=6mdZQɣRyԑ񈮰5cRӇE$La3|a#FCsT6qȄ *,QpO!#VN,A;jBh誔<2:%DÇ9?|8_i 㟇9)`n쑮MP]әKğzϲͪ?SFZ9ŝ?O_{6( /'l}xb1!g7{=X6g5)S˿Tq&V%mqY,ݠ?u*􍆛?i|ϔ+ {sFJUVMbGJ7{^SO4&عBjFR[H;/{"}fRŬvj5}aք<5ck tn;Z H Y,|7LRdPl$<Z Cv” =c}58lXy/\9X'USn"DZ?4ˋhq,5$2 \BY&aX[l+-qirhrm_㽆4aѠwuoB9S!c/r+OD$b2V/T`Hl'0$a>jrDa Ý4`îCx zy<פ|P ;=eh9ߍ^ј6歴3tq+y_7܎yGr~)hN,ÆőMH-P2Pqd+ѱ4Jy2P@o計.jN9|Fe.ksx$4s<ƷЏ?Au86Nv^LR QC{Z}|AZbDFt6!&CEv:<8:yX'<{@1ݱY\(&SaUs=hD=磞oOٛ o6ex20)@-8w|qX%͟iQc,۱|L᜹/F')=*X'8K dw_}v2HΓcA9~(<3]haFx # (z ~'W̄og@iˌmVJ ,D#2ʠEO%ޓ ={ok]["?.u/HoOZ;~h]6u8?|gxxwv% e(R9ZZ "m }TXU|k(lr[!]ηIOjHx7q\ W\X㞞R*I &i]tNg/-}(ZtNe<(CpwN=9%H:sz#!b咖bĂtwǔS(HydT`lE;K'H%G2^Pf] iX'9~ܪDfC=(3}# _B;/K>_EIC)M-eB=SrT{K2$?іRnTAfcf~p)Nwt/D?P_hA|uoIa~~^%[yx#ɥB*@}a/Cچ:@+@}":gBRj7m'?MF~J~!%z&)hG"|܂7!?"}s1߷sDiܳ`ߟ$f}G 8~ņ AZ:]KӸ_SY1nKnP)w1hS?k)ߌzNa,,VDAYŸs"EK{Iy|(ǙZ`~2M ijp~MTI:A|t<ԛƭkŝ;/N HkbbTqmB4IʤqMo1]&M`.<wP7nV7; Ub5+ŜyH\ 0ahE <}(5ʟ!?͗eN<+0QEc;*e|E/q bj7՝ƀR>Fy^[Roj7LIKNyE~|ۯЂ[ HC(fɘ$3~䪿448'8 `3tJ psDžqڌ~u}=>n᝶Na/Xc nV|`7ƻo}'0|V%-uN4Zz%!C 7b͘)y0y]PVHEW7 oMuHy :qGtus:NMmK`,%IU3֕H8$o/A5׽-/q}m&E 0tKup+!uE< qG}gP?ڳRRrvZ:iMں1,ϒĞ$G E?JMh(=vi.MDDD+ wu(wʡq}ϿNH,|CC޿Y71?ƞm4ӒZ`Y4?@#DԲh}j[=1ߗZh/fwF% s^I/Q?J+hq!iXʄc+#ޕ^#A??1^2t`+̓=~3;v֜H_F$as?Z زvo˺'>3 t,)Mq(1tAf$q.|o%wv,.Y(KH]Z_Ui+^) 8.i.]]z.r}í_ѿGux$x}LW?^5׉^}ޓ_gw}'u_[vw|J>M;rzFgFdL(X&nJ=G l|=O kug5 z#bЧA? hp`@`WW/ ^\?Hꁏ0a!BD I ) Y:.doHSѐ7B.|CȍAՃaPàtvt}Э`ރ *zԭh%9;:#hw̢bCc*ĭw$Xܙym|B|y?@G=dĐ!CyO)aw# '|]/ CC#>04ihЬC===,`ؘa96 >lp=a#lGx7"t#$'N&)#)frf $+1H:9h>-#~G1j¨Q5zF2#=?<?O)W>UFhiY23˸q󡌇j1f˜ucn:9w쀱c<=pgem3wqymvJvSٿ0~?5ǘ3gTNfΙGޛwBG]^}牳'Λ'~7񗉷&eOjӓޛ^OO9;5eiʴQO~8>|^ ͸:Q; R 2 >-a}S<1+}lcVJKueee7_Ȭ^QYXFwՀ%Ugk5x̙0g\ywv4?a~y.` n,LXf'bm_bŇ Z[rsoeǖw/yŨ+hZqt+.h?}ĕ'V_oVXy{~U/:UijjޫZ=bu W^zX+ MU5[S}m:u._l>٘q7ٔ)oSVo۴wSӦtqӧ~&fmYn.3|uϛߢⱥߖ-lIےe-s,߲i-[Zrq-?o}+긵[#ۚ5gkҭ Zu#[Ol=lvεo1ufU-[WW_Hݱ3u]m|^o6l[_mێo`:l؞}ww8HQcտ\wР474r5oλ<'ZsO-|Jy5O{}MwiۧO?moc9_w8?8ՁnT:>8`3NS, "ij\ hs.f@\xo}pE@ĄkvgnWe7Jɸ+])<ӌŻB8iYs% `9>SܾAJzYXdEk-rśYFTTB틧BW%X?X? b σ AV( cmcfbA ıx`"0 e#X"Kb,46bY:"e l3ؐY?Y{MHwQԝ&T8ϙrY?l& Y+p0JcZ*X%^~dUW6e[!=Ζl[)}"}VIIK_H_IW/jIak:m`&ma[Yƶd lΐ0$˞bl?{`Y#{bϱ&<;sS |Vً({ ^aث8{`vI;N7;αm.w{)]fGc b}~>c/U%};a߲# ns~c7ٿfwX̬K<$s8q#3܁;r']+w'xo܇r?ޏ&| `x87ɣx4'8x(y |(#x"O<4>AcXY|yO|̧|syygB^ċc|6/᥼ ^ɫx5s\> B/KR8_Ɨ|%_WZzofou|wz7]|7O)?g~7g!o~7x;/+u~OM~s</]C¯Ogs -?53o_?7~o?m~w;eIf2eYu^6FFd{AvdgEvdw!{=e/[}eWr(r # # # # # # /QVQvDYaDYaXkc"EZZkK.֒c%ZKk-9ZrqVqVqVqVqVqVqVqVVVVVVVV؈UzUM:wXp ,S)ne ni)\]-cdŠWQ15* J(1TݿFhiuQWdwu_=iV+vLVj4Yjҥ)^kIzj#VGVXZ=bzi8u*NC8 ~7Nip4qܸ4ˬE!ZYlK?Y"^mƬiu!^CVxZ۵KTD ~DDz'j5D ~?QOpNQI$ ~?IO'i4I$ ~?IO'k'k5d ~?Y5d ~?YOhS4) ~?EO(/Z Rh5Hj EAVTZ Rj5HjIja UT ~?UOj4i4 ~?MOi4i4 ~?MO৩U*p~t ?:\WGUڬWGU*p Io4&ߔݔ)GDls#=\ͺTu#SG<5xdzh/R^HE{ |#E*ڋTh/R7#_x#|uYx xdzuRTk:W;5xdz_xZgxdz~uRLGU/:ю_5hdz]xVE ((A*ZT`hR1r F*E*TT`hUD:Jlgͪ,^,PS_PC;~țPQ1q* aiRb'U`^oS0owȭ-nj*nz^V4evQe GI% %L1mpmwcZE)BLA&o `.ȷ'hVau}u!xb}̢9{*TA"BE+,QbZ5݂gidNHSҚٳuCsgWێފٍnFwpaeS3 viC-U~;zQ?:tq6; Q P~1&a!&ni` (э Dqe||Y㲪c  MeE`oF)ab`i{.R(rL|qeru VQ$(5!$Q ɀ^fwP^JkRMaDDn[c>}[G^`݃hAv^!=-N~|%%!,@!EȭWZAc[ ;*͟ {!*vW@j|g宐'bE$)|0c -~ :؇6>+(Ex fX/1g)KQ~kQ]&c!#.a(aQcIt>Z!rVֲRu̺yp§T3~{#*e+jxgu]ӏ3RM}"YQw$; .2?1`w/ \Ս{u'lHtDFu0O_Lj}7 ,+s8f9?44=225104l 2᧓kK& 70?RזG4j;F^G:bVSVYg* lWq^RTUacYA!auB<}wv0YotWDV ;4udD;n&6y]˙ݎd\a4WcD*/㴐_ %h׸ҺB, v$NcrHM0yB{hrIб_jf1c,\Ÿ*vJ!GL1Ruܝ([Kg?!* C@"lS?zۉNV2=ws= +cnqsS%ɉySI/ݲ63OV.hW<̙keK^f]fjؾ}@+ msm!f_e~}79{㷁ϟ]SwP0Ճ.v7k6Q ޺?eyҺ_Cb0#_A gYl'?YS'tHR fֻIYUEK2Fi 6a _H1(4ے;ʀ83F ) MHM[ύkY:T\! ;\&&+Ǒ&mpkk}.5|OljF ;'5-=msYi!4?yX򺨉YlՁۚ$y9),ʌm[Dlpua\\s!X 0 dB-v%( VqDTʓ<|[l׽MvoD'P+TPVf 1|~G&QF@ @`p|p@, (o. (fj ~@ PHa6iu~ 80eUЫ@Q*a'}vH}=n(Y9GsH )X_T<&NzTF2gӎR{t+t/UaهH p AgWtӁ4 pN:śk ?(-K͘;ۃ9__C2uNqaHq+P1ن7Ĭ2o.'JŢwDFAsAcM95r6|R_^>tP $u#B6z`Q ^8.bL$! OJKKN7Eإ|m.Z~4 ϋ 臎g (ER"-u2QC^G;T>,'sOu/I[+%Ve`%giv>S\)e3Hi ւsZj< ;Mx5ZyrELFQq0 rz0*(+oB EjZ!iZF B8tgANȀ}_,^yzJ3Y9GϠwPpvUj:v. Pc N$K6qLs٧೦0sW+cnǓ-J[0د$8ަ1 jqȴ^䶤m&l ׍Ea"gBnTҶ({ R"fǑRMő@e9Pe5Nqű4 ;Ma}u]+{H\>*=<~BIӣ7d7>'R)+:u~ŰݢYYa@"hn =[luݸ%;slzʤB 2:O_\ooaf,xp.%s֮w{<\ d{u\MqMq &;;^ٮhLNyR` .b$㈻ؘSXqCěVyȩsR'w۰eVN$e#kb N !_pl.h[[zw V&VֱUkz@۳͝Tx ~ Ku4*gUO_QL VQH"o祧ܑSC>~' z]P I]&ף:0z'AI1aB"wT m=%t-5ID}$'߽{Xyy>usMFFqc_1 V9Q75m `|Nܣ5rv̙T^i&G; 5}jg| ՆcR)W Kᯨ jjMk&u@R)c1a9HiPlF}85v0#[L| ilf'-~!ӆ O { "cv1b椯$MS *+˦6R/؎=ErMO-(u^s@)Q.B/k0e+ F >WswAU'i q?LǜAms9w4$Dݳ J)a3cAƥ35`ZFotTHݮ Nށzb3V*Y0GNJ9'zRCE{&bku=vR+GLUYkCHj6PFE9(Tқ,q^P*9Lc nA O(:pu$Sj7b*SO~Kj (5q*iYXxK)B] K^o.sw:<4 p3oog S5;߬ цLB[E_TGu J eѻͪA3U5Gre߫ث{5Rۣk,וځTEҩ!qa v3!'p[NfҊlޯ&~ܸ]d'ҧ r r6e8Xᐽ¶$ق+s=gP Alr J:-/H2E )8'@ HQBy]xSkax=FjNYih7={0n1{<}SKMNj$fo>ZsxC>hž}?uhu= %SWE71 @?f8F4_G(}.@N >˺BxiG($ޟ =~x|7~vK,m*xSnC2f?-k/4;}ͯ4)}1[)OWWvz?s}JnKIu8:$~Q5M t4cp`'P <7R*{e1Ҫ F57!kAI;%05p3,7` #6+4[ Pf^*f$lmw*BTаHF|-H<.{#e3% ~@WւK["wYOk!Oܙg8e<*-!,5gt5/#};X%?Y..,ۓ,⥰T|$q GcL)ւKƒv(E2lȳYͶY&MTA(/p !~/?Q^mi4#t#A>,N3iG DKF"8xRPi\FaWL@Pl XNaO!{nEG9 izq5 YB ;s)sG3c*򖚙եwDֶ/Kw*/5YG|sBɏyKk:tz"sx }Z$8*onQ繤CW1sNѷKjˆ[d׃̩,D7MP3~ZNmMe=5pPP*Hs>2//T*DAIHo"#O?ח ;{dIՎ{E%K=U~F Š9M t'Sx F|j=_o,$#՜u\@}47ne&{GsQǶQIȁC#+) 0ֹ^S}G=~vXc|ҡݞ<z>kT|hRGt* b~錾jYÞMXZ`^_(W4 K p;C&HwL)f؊# cUwI1 ̂B| ̰P\BT] P_-!f7+*]oY9wIdT|#uc_EWbt61}qm+ }]$sf܈fun0H]\0p>z.}H\t_G_R 3^bYXW{Gfu+WUJ?oy-:vys4RءS) }:tN"*_)r;Aĝ돵LHZ(Y]`$HhϦOp*bj|JƝqtmz=9v7|JSd;xP''t)M3簮@B^Id+*\[ѫʊ $熤{m  7po/놢̩N!=&yc A tDS9IPMx5w``tWQdUh5VT_d ("Mp)c:ɦL+V䩘ݝraO Jiڢ)Ȯ9V~hs}L)\ ;qbeX(ov!=>J$l9S ZoH9b$J; mkPKE,aw_IђwmJ&W*$2(MϨ|2:w< ';XyCmk7u ;#ZOGUaź# 3;Cql?7|ڳIiIuw,MH$^jt4uD?Nؾ!7\jY%w:/v-Iw,l0=g$ d mg^E9&H׈xo= a^,FѴ b%ĥ9Eg l=|`w  ]dm_w.ɼ<1g|NNQ?(P(IckN{1~_ϤDFM&QytHӅj7HQ+6Fׄ(ۜкHBYHe=So5zRR"ރ <=i^vwⅹ jEA"׋EhÉ\vYwoze`%90,8mRoMW"[jaJKf" s]6/$-Gblp U|xm)"u3c=1>ĕ;@DIy^u'9t[jcEWr象MT7e|y?@tDSC"bGe(ˉgZghϛ8,Dr{q5Jf[̃.C!Y >h#25ǽeΰ|>ܥ%N.$N`Xo8Eof)yz?7M].(>Z>Z|(T|L@ohO?uқX%l\fIy?mmh6ko޲:rC&*^ ,IG{5a|Q9"Ug-IQ `Q,4"M˹cxLkAC@2Lbt*h*3c 6$ 0 iWego&$^ĐUMJrYȗ:{Lw̫mշ!qfk\X۩c8 R'RlMgrJHJY4װXny73଒$Xl d=6@2QX}qu%i܋i|(5T)fGq.eYF^YuR$ѪQtwx{wӣ*C@9DaO*A|Iaf0Anތ| dRŁeJX+#K1Miͫ' ZFvӹ/|f. tt|F'"J nf.*u'j Bgrrz.WG~b&?t5\0~hEO v&L[zuE7\ :ʋԓ h{*V^#!MO>65{uGoBV(8tZyA/AK/рsadx|N ǂ}M,á?(vgLV++e7?{O%(Od;=~\/ş_ztd$9w+8(-lCE`IOPe!g9!ɭ2P(ؗ,g\"yx khYQz1~DB{^~Ty?..eÁp]. hiP])Ѷ?)juv|ŌĵtoQU:Nj[B'#ϳ0fG]&4֬p0>|*aEcbpilɛ#`'qA<}[Ʌ=jzbB[ذo .]UۇB'rfQt 2tcNֆ'BǛ ֍BinԤ}37Ϙ04㴒wguh2t*Sa }y\?(B 5} a~J':"-?ҜC5⦤FXMyI7bfkOL'᳕ -EQ1~t7WTȳ1RR7AR@Gv:XKi-,-Ĵ'yK$@wnйG0oD;4_K \q130I ;xd!@|0I}}H[&g9;;G2㜆yHg䤻f|kHن}>Ej֞`:x+)߉xզ U$(f+h^p6,0xec\8ȎatAU5۷VTseZ}57))_36Y30f~~9kDΎ_IG7z ܧmxHo% *TGƃI+f`_'`ye t>b7_Nՠuj01  OUpݻS҅?YGB?'DpaYٷ+E;z_6x/DXO p2_Z2 i Y\͓OVDêm_cd)DpTDUtpH% (I .,UK#0(`wc7aFWb[xYUԞpyS` _ Y˯;-wB*D$]GqF 7 ' vޯ'60!0ixKLtw|%Û}}o|ZD1j%jOFtl]\# kD݃ qo\sp <ݾD>8h?#c wEӈv{װ+$s]mv Qf$4['NWPy.WկH;h? if"!+*K4kF{[OX}GGΠ(~BYLN_ދmH/FuϟLN.x䖔Oe$yf*ȋ}2w[ bEi L qT{JLDVfɜ=:0yf_)n^$xx ,@ jsȃU;O^Kl7YrkɘѭuYq#hfD͑4(-&yIm (t\s )D9k2D[3__ԋFǺȹ[[Zt&rymE^,{aymf M鐿&;xnl`b$иb[m˦AkG13Ŋ+jPؓYf|2Pd؂#xaI+,VFzduv'r-3#跚iz EOpkgcTXן'꠬EY)?"Lyns~[ $c8!ߣЁa 3O1pp^#w'G;Q%))qkcmcC jViޒK ,XX}gTYKS'M㓤vK۶b~| (֟m/OUC94% P܆0孎Uǵ7;T0wIb U V]]Qds"Y5M' я} F%Z\_^\ \ZTmmUK :ΚxO K&hã3:nB~#h&TD3Hj$Oz@jOp?r@[xM} ~+{Q Vf܄(imF uH;39K/=Jex0X[aD b(?$:N̉+!:z 8Ͽh>ȸig QB>f1 ɀuITaI90:V- ũH>#&ٟGoĎɡg0_yb/Xh]Go;O2`k$(2^Z7"Y§ET!ֱ6ZwHm< u@%KGj:\ӣ'9*Q[ʀ9_y.]_BtP&rXS7t "Fkl:ps u"ۙnSTȽ*2;;̗S4,oT|j9,R 2SЗx&U4ҙKd@65_j|}A4;M̓+7$=ɽ8]U]|"| alqɏ(@uW!3晰ٜUJ {lhsb+ TͲŝ%DvGYVm͵oN<3`PNֻœO0K`)4 Ez8`s"Ʃ}T4mkJwYa0SCQ~UOcUX}.>e0C!Z)}17 76+0}E OQŨOba _j̩D$N]'AB >%`A1=@xzƐ-'?. 4aq =:Zz3qKN&*Z;)$z%uDA޶x2,_\*F/`=)4,B@ /a~TUeq-wt/| o7/e} *qP%M4Eی?S]I=c+5q}ҙ 3sEJuhc6ɗ|edzW_^n1@}gQf#)e* hSC_vy WESz%>TZ\e=uϡA* 4G(ljǵ'['ۧsV:x'3Ϊgό㛻[Wz LZz i Q2$Sn{?lhmSCZq=WU_uԲįLW uxq~bHo.d D5vOC0XWzu=PmpgtA¬Y = ؃/;2חh;ZeiL:#Ә#UFM8]qrPVmZ= tE`ڦ5VX.bpfb [=bdhbB_M>{%5"864@3 $_p6 ,)#(fr cسr)EIs8e8;w3 Fk"{-[Q*9~^z l!zlPK| {Q,۱Q"^mU,7!3g,l]_D zC,1o#Ⲅe@] rQ$6zM~$L&B_)m\YLJ$C+D,*GCQ"egށj' mit'\ 64i'rl~7WT/lkřtg%2fxB. QE֟Gx@ǘ"I;gKh`Ί@[48ܬOݢiF9py @b5jKS"&tm 4\|>-؀3#pٞ@\wx?:-3!4RO2/84떽x"1KIrYw2)Ije)/V]D3sO~EAPW;n0Kay #E}sypGZw󦮡sjvճHSx0g$`% OSI^̿c+k lD<3Zn/tK浫$Sq媲r1?_y_?Pj1-d++Y(yִJC4J%R}ۯo(*t N d>n {b3tUG2^`+T jiV}j#׽T!ʻd~&Z/iib/HDk1r it5t݄\ko*MSţ32o (7w`fٔ97_F=5D5rQ'iw\E@S6'\G45 N*( FZH5pi{+s@ֶcYuV%} ayqnKEOZ 5A,4 qⰚ+dAdG$ߤRR<@I3|;Wsotχi-{aƲj# p 񫳲óL6U6l0Y޻3 K!ah펦Nx31&LfktLNYbm]ram/?xĿG/BE鬰Z _B5eioJN8)5sL:!;6D~UJ^cs2-L([X~ ܿxbWݙ¤R3Dl9|.٠)< _o;EywtvO~|{_4+5LXԧ~~~h! u/}'ir f*As\Eݯv3s歋6 31%|ql/hLݻl߸~m'5Τvk64n bdKa);*L,E}!jfвZō+Tʐ"zS 0_ϗp 轂Oˑ:{ZEzRnM# _P7B[GO8X+[}I1S t $'~C$ZvICÅENv~mF:>{ՋUzAsCqAw4u9Pڿ@?4_@~Rԃ8 Ȳ\x8KY +S,ņ.اc1Z=Xd:4A5+@Shns97ƜP75x4͒Q00S$fWcOyCלڍۺ$~S\λ&7%Rl3Kc|xKң+p$ߝ?L!^ݱf@p~&_D.:z$.'pSWMp9JӼڿ/wW$!\K^KzY kn Hmf>=Zp?οH:>zhYk&KZ8њ>.pjKmt;4H6^ZaZbSљXF H"Nz,v =?52\~0o%#i錷߮oVYKW\V\>E4h4^d?ʮ0F?06ZDˁ&.33_FtM*x`EfR'\F&+㖀bPXĢBi:'AɽU^'7j0 ~G~N<@R{ܡ>MBCTfUkʧSws9UkoxQʻh_xN_nڝ- ʡ}~_͙O?S $=%|i]#njW[ܣ;`s0pzQ|~<= 4Y0߆g ڟƯº'п5n)=[Y[UԒ.l{jfx]Ť!Qb0<=!/W7.{MCjVl+8U]c,/1v=Q Hkt֬F1Jӵ2 lF,I }xtkSO oTͧ&BV9[Hs7| .X2P?+|x;ͧ$ N!5uK7[ȉyXWON'A&[*÷1(o@R8j^zP>u۟-t;i|Su f @ /#U}Ok̨i?$|0 lhhKf3ńRGa9jd[,ĩ3BT !AV}c:}# ͭG4wW"P/no>)SxsWtFI684"զh3ImҙMVi)7ZI0L"l4䌀@*+Oh`΃3(,IF +̓t0\Y7ad#!?d}Wd"Y:nL6qfz2^_ސ-S߆rFXqXrn/䃒Pc݇k-2'g1[],>5{٧19hkʌx \"gΫAR%'똩n*.瑇%DΞv/' r~1sO&oߵ+A4\ω F>M7!:6S@ z}c:«Ƈ+hZgOhl>ן\Z3<;hȂx;iuSThw {r&u1cʇ0>

    Y+]3TXx:* 9:+1=ʰz`[rpFb_(Sy. ?xR,|g/лa<״^a)H:0ABW&VX>3t# 7P#Blx):8TቹhU|G\$3.)|\HD#ޜXʾUn0)nJ`'M]eTEC,E&FR;*.%s"BP2p-}ٱ&?gx$841&~c[e!^j3g}3ش54q poQɓȚeX4WsXCܵb5KT`4Y0iC:ŗF %'?Ѱ#ac$>aPP: μgsHmA0 &ّ==OW84P!xOu2Bo\ o3݌gKJJ=D$e3L|v~erN d?ܟz%sB e5r[L)_g2gP59H+>^+F`4e9YXW Ptts=ja,""k>)`2Y=9SAbԧWހp *eM?~/PQ>4qtF!F *8I/P@Y /㻵Okpwj;lnhp*Aʄ,^/yXSvjLC|tw٥yRumP,Ə?MҾXWf8Vj)szڮ-װ޼Dځ(Hݎ;GY96K8iHLeҡm07%l R-l 7*99Mqs$!"A?nE.o*[N#. 5bZOu^$֕R3aXMGĊ1e_V+ >><EЋހ dW: vXh|_Ux \f&܃fç`& nש4CQrgտCIL0K 1ElvGKӈ[h] yۓ D%錍O8y5IpF4^ؘs@&1[:HBY嗣ş8޳M6a Н~Ia禿btz̺"HKZ3J`qG7KD_ƈ؊=ܔ>Jv}0{Y |?[HCk'0$\;g4n?'OyP jvaǦ )6A^PT>Inc.&bx4t&1JLS3:,oe#70{O hf_NxT.NXyr:xgq ^H Vb-fKY;~d?A1@Y-)*3 FecT,0#g>BS"ǪbЛyYĈGQV ߮V.VYsCS N<Ӄ CDDJpmlGjcHj0mrj#>`0ϭ֗)U퓩|+9&Fg`=@DZ VMzPRa+Kp<+dqK0iwSiLe 7ꦬ 6iq_EJJhBMZ}Cd x]LVnF!yd]QhzxI0% =쀧 @ + jPYnw{3LS1b1#@- ⟎ W4L&o593x;_: {\ƃ]9@~7/ (.DѿXCA5h;U bsm H+PV UҜ yjSUPy=:=_zoТdhF@y6#^C O4!/;ֳ/fa:tcX4 {n VYvДI^T`[.aC~ʡ0!LeHrRۅfuه0}e*;mVb#5Pj35}o# SR2Ŧiek~;w)EnQ(A]P@.!XcajKvР;2`P>_Ob+Hs$A>C19BpAg݇/O/EK3C 2*f1$tsBWWAX=@`>P‚~6(-Xd.)" B龥_ejG QS`K`L:ƚH)i4;҃XhZµ=W1A ? &̟,i+Mʐ& %|CI .ORB_L6ɿt4Ji։$tCdIUҎE"?QLY&RxMˋŶtIǨ`d1>6t'&7Mnj .Zs XSTRsȰGGLNEYt:OXSG'Jt2ٻw3,iE 3$]_Uuޞ-XrKND;9ΐ J^,[|c~ fW%hCl2vCJղ}$8/6c%%WB9\6ߎyv}S{/C6jKsėaFH HeU$ *dKWmK,_jai q\q@&tuI}ѽq(^XB<:,=Y$qa]: >I1]ɘ|jgtbk:Ljlk|/@Zh/azjݸ}dw n-i_~8փr %]5B$ ʂ)̎!r"xۈ! $DV^>2H"g,|i.?\:IGr?#P∖aj4DL|>A/vVg\u@,o Wڍ؆O^{3zBBЏw[~ 2KwU.8l[ Yjwx lyJ-{OTQe]/\8 Pw> +4iAP)xBBݰ%jl4PE,|ү#z+`5}a7אLASRoGDP'1ܥ;5"10:b[&Bu>  /#gtB =K(_W9,5})ed <*wim]_ڛ!C$@tzrUwc$[QhΙN[3 G_@bjx`pf Yd})Z>~򢤘݊#b`δnMxmhM2g|V3@i2WH2J_C@sxcMg68yX Q!p~x(CXٺ,"qtSF:cEnilj%x8BAXfJ$q Vqnq53>4A y㗒:F`rnh[@iHEf~ta<8!'!LҾ|=á);yZ#}t,%rG?J<u _,{S3bq#AӁp~M~Wґ=)ƒM;ALзkwFTBr;4 Q&v^^uپU`>&PpG3ӺZCBpA.5Lq;j=y59siw ӳ<֞n,c=މ5` ET\Z-'i!!c;VՎtbE*֒(U"%Ea:'m-OMKĴe:Pw-|v|y0XcdX,܉]w,Fj?A\')( R+Юl+r$85X,HU3k1$E̒.ʎ Vb5;kp0J`2uH̍¾>Zж6 %W5WeXcQ=z}B'aF. <\ x=*d!C;P@uk^ϢN8#xyos3-&*zj GQk/<6DN$%O5I:҄s\ F-WjC,dG8>j%mfw1Bn$1Ueijٲ5UNR d4θdkhG%-[v2ORcÒsi0x=:s, W=Ɍ6\c"ALH :4$6(A ;$4<%`Y9rՄYn0/6F#VY K1 Z"}x\tTa"RM|{ | wՍiG]H Ss'jB) Uc?@'a\|lAX{s@AU̺'2f{ӲĹ@>!j̄a:vI3tgIfb[%1' rd۠T5_̜T$ *;djKE3F<:J`g<`pPzA~\;B *X5L+ 6%}a4+1aAH#TDj zJz`XnN%NUݝM$*JhD c0|rQ!ˁ2[cz#)b7Q&.Nw$+5K ߕͭIv|OWUpo9X!yz踡k+G5o#튢|HoHmz-c b1jA/|*i,ZZab\W6Y؅[QDU{ vaX;<{A^Ct]39`te %8 ܔiFAyl\:ؖKiE.*J⥦|iWt]/:,oB2*')DKNY,%A7\䏗qPL3XŻ.9 "N+(C5Yq$|{F6 8Szb9[DΫÉP} fov]/zyW er XEc])6PR&i)`_䕿+uqq_n7[Z!ъEd+lAFF )эn B{vbu̕dhCȳgO=ă_15WZs[PdHҒP@rLeLd1 So9\$_?0G UG-CCS5ZR`0sք?Ml>SÈ*1Ifz$WVG\HZx+BS]K;Ìu3禍[; 4  Cslsײaz>b}b#8\ \Jsx!ԥ "=,De0Bbryh:sA,Op )>qypgy@&%i >V!mFFhv`86E ./8=?Ars\Cs/D8B]em`==.3o:3}Z S{# *`Z*^s5%#MehNuJpNYFǣI[fĎÖ `1PzhSUGCBbnk.Yw^,@@\N"]M(;X#F;X`sXx+݀'ܘ$걬 l [ +п$c멕>?]C97J˿C,}qc2Uɒ݋[*~$X7=$]; O!GC ꈂՃRVTa@}ķ!Hp X/MW- ¹wIıK xஎS`|DbZl >o.uEՖ 0zt\`@| q5$qҘ0fs5wvC`(L+$ΛFMwZ~CbJ@ <+V0Cu!Y*4V@5]΄mL*7*!ĝ3'M7I# BgeB6#h[a:YMRI04l,*%E4 zL@mA|zI0J g{k&b {bXvt)vړ,=}^-`&eRzkDw@|qP&EtF¿:H\Ebu1w8v6N&{3hPӞ5-_w&l'okP.\,8Aʡ9UJK: oeKDH~-ޫ s| =*_'@c:nh򀧘$aNh*_P<0rM׹N{?3ҟkf𛂸~O M2 Ox%@ @vf9 ?;OD6b9V0:yl$9+%% ;l>@|,қa]tMKɢ7D8_V@:/%n'˛w"}C^KzomW.DQ>2kƅy Tםj@lltK9ZF(; +@R:I ,Jl!E:s$)I?|R1=9Ă` ZŪ,]=` sMvCm@>a]xBQs.]HE`ed<'c*Ȧs;||gbfwdF6zc 3QRD#T媢4# M>< rKMJJM,n.eh-V N-+:-Adx5A\N{s;hVD tqߑe}P&D+,%Aݓµ/e՛h4Yf'̲XCt'Re40v.=ڌr8BIq[ 9pCi^**g Gbg9ҿ ib"iʃJWI>^aE4Ӈ7Ęyڍ骶fsST_dw$'xGa5\>H ꍩyeIXjˤp O#<} SrN)p6yMӀݬQ V-;LT;aTȤړShO4`HŰ,)ɓe;0.p'@K>渹DͥGp?P*PtW7#O?s6f}0u}57taݑpTcSĬe&u0l'DFG9}KsΈ, 8ì~}v`]\s(/ Y?hHbġ]$pfD.'9vlIXTY;-kTgur6,aU͡Zi$PHĚ$ОEbVhPAK%~S1wxn8aS JhC=S6gK5kToҲaZyV ΒgmY,N [3T(a$ A@|i+8ŚJ77Q_iN (P(y) X w~_[w݊ #c ;X_ gH:<'6^06+5VBe{#n+PGhX@Њ 0iPUQVm g~ŇuC17nʜa!ҟ,RZ DUkE+gG. x%W#=u el!oT>TZӳK>w$p.bFc4TE P_%2!z4bDTzqw~4`6c)KtR)&GhZ*1K,7Mޮem &ZO*z'ʊ3FE|1o^Wy$žσMW>(ỷGٯQMU"Y0fj;@Ÿ8籴 UTώD;x>j}P-~< (ȹ^ߊa7}xrQ3QӜ̢=$Kr0Z68.#S4?'ЮФsq0o:sB޺;Nn~6wTGE 'z[]!`y,$'-Ȗex'[%d*vlCv[WOImcLGnI֓01^i;%U@Pq 㔆40Lj ':F"Qt+悸#hȒcڶQ!"dBCதwF/pȐ/Yd$y=>>"ӀVxZᄂ 7Kl4(YtƼqc} @b҆c;oң:i86fd҇y|1ԄCR݋Nc+;OŏݫչS͎^1 &s$8 З>ҕ̷CŶd_z7cLwyF%ї>Ote'J?_3ɷ_ KPׁ`e_XM8¤Kv5oe98B^ G, 'ik67-TE#-i2S0>e4s1bcI,c4xw-\Ə0ŖwMAjGbR0rNZ{ tqCJmf/p0eõ@Ů 9$8|Mɶ` =EVDdao|BC7P{%v Pd4C/3 S =N.XmFtlo>˞=#~飞Ul+a!|}|Fv%1/} 7[+jӟ%D7E7,>m&s*sjACT~`~>\_``i ;~?ry#{RhF,V=ohsG% 7o $`b 4g%D7&B8O Iڅxs؆tJ}wXL{ͬiyxX?^= HsAV\+N:ʬs+g i#;h @d'Aruɓpe̚^D<8KHHC^BpC}՟G$niz'VV^zsu_'q #̇c\ E94o?lJ.ZA?ӝ7 /n$LVTjqNDuڅ|BO ͚yh)t}PՒ M_qтBiޞk;RNp!ysA\z״HSBr7)t'8z3t[Z ޙT|"=(ڔ&RJ_!ڈ7هAy48NvEҍ #6,>m6,xՕYCFE}ӟ(P_@oU9"W|=ƞ{Sk蝌A3YOq69Od?_'4<6DYdY>Tf?3Ћ|KqYCl5orns-N Xыd=.ī=z}o2ۜkY<# fwy:x^`N5./Hz^cYnJcU 'L,[Zq<=M@?4~VL'#?o+.e#7>^iA3ſzx (A"C?= ȟwx8{2-H^ 㿯4%#?=z;2c[㯱X6u?GNnH7BBZW;[,t4S퐔2Xp#f 1~0&U~_*X;K3l ߞ3v~#js #z N]q.V- ~ :Gzog11`i_ss|os޾g~QG8}f8?;P .7^~/c:;NjK ~ p׻(̽l֭1iQT$MF͜n~_[Gr[G |]l$-~[vZvx,] ;~ ;"MwCjn\=s DLG nQo޶qHʒ(j97[ E@r~;0-S;OY߭lG2㌯cŜ,u< o3uGQ[ьy=͘UX2L,W觏\Ǻ'G>)<@+|4f-Ujq#$qNS49+&EvvK!g̡P_Ȳ޳?K3r E{_#l?$9Fy$W'I.dL"Jͪ? Ꞓ͊:ߞ$:p3dT斦!u|5`)%~sG\ު`]S 4Pu5 ( !o}I;cC%pc*<*xX(X sRyxg| ˝stv; bmGsA i}3HViSà }qKy"_37x|{3agt='G~%nv!ԟU}c* ^@CK|}UJ3̅ƪ/Zΐ ƺV(ExٺAKSqA bz|Yҗ[ Ïx7d^8c sDm\҃[uDIsJS_,Pj58*T֡E( eSa$^YSt\!hb\FWV^|%Goeg:+ml(^8@ԝĔtdG0t13ǟ-cuUBjpɮ8k5a82\ya?s̠GƚNnI„ìYoƍybb4wKnjI[NcygV1~!ˍ87<7Y3snW~7jӨaGO hlMw@6G$j?C&>D7{Y0wi2aයHb W 5wf'r9/f hy-ݵlOib<ψ_cҐl|otLց? +a$]#r H{8ZF3F]e5% +`.7ʄ~SQ}?ѮYج3nX-I$AhKj9&dl0Uv><ؓDi{(yK_ỊXA#ztŤ 䜦WǼ7 "<ɧ^vӧ90ԗ/g}1/n})yٗhE2o+ohDz|E&p?[}dFQq%:tEwjݔyAȓ P.;*j! P>'`,͘] ZBC)$?"a LjI.*I{=eH&wk{U%c'z=8R˼|>qՏՐ'f{/䓀C)h;1k6i1Xydr lOY{4~[Nn^[ j6?Ң ?Y\wr̄]!BIP|ô>_.ۆDJ?v^zF?yN j(dO5NJ u{\.ߏdm7 (2 .~m'*d@Ϳ,L J B5Jv9*e@)ǒ>,, ym+2L3H?`X|1<;ӿܹ8>2 d!̀BgpZ3nG,VlvL ZAJTm`ջIw0̱}I0ӛd1+P㟆9XW73:H*⥕Y-U}b{FK TDp{c$Edy.) 쮨jqdkCZbah=fyg=Wm2r}5n{qI *2x;FjʘA]*'ߛ׋bYB6%Db +. %䁗8V>A()$4Xf-"9ÓfW߀ˊ=$~P~2Xt)tqÄm: bhOU'5!ÖS8Ƴڿ$+QFHʧRJ_+j7뗩&BFdUt'ԭry>9q6+ҭؕ;B{E<>lTEOJ9}lFE̍mf;9I̓)ٕzN_&]+}%f ٯhj[J.*휕t/v{]V?]~${rT$3"2+峔4* yr|&,cnZMش/A (U 'ypk`Z \L d%+,r(`R&@Ȳ,U(􄁄*E\QpAzԀSTj\ԮNVmφJ_H/~Q|G,p 2@PbOCx7s_8BV~}C ) 3nSN.}5 ߾B}X8D~i2L9֓eU\G0\咹pDW).д}kҚB_II  l+ƼĹeO_fMZu5mfp<'ѫ??zT5m ƃ~l¿8=߮ I~ljHeW_Y#v4K^HAmx~PzMVbz`Pr]"hR7zWY! YyYb=Cғ{R,ʜ'T#2N[n`[ ~τ _=Q+ f!nT@*ӊ㳜.r&9'[=N[j4ZV)60Hˆx,姻KKOUIGy7ԶvAY b;-4k~<XIQb5Ӵ/]UڌߑСz?fD?3Qٿ_߶/qエ=[wE 4:18ϪiqcF/doVF3A#b0ںJ4RwwK%|rIM5ZM!~,r6H^Ip #K f/W/p3 Le'#AI[E2{`,gBC_kmF[pm#\X:,-7kfİ9¦RH1α7OФ0&iT(WgV1Ln0;Gغ(3ґMo/_Y}Oyh_f. lt?3;̋!yMj¶k4ATwr.EjC" d\ۙPbnT˭PUr0 [n`͹]CF.P.9B_UbL/~Dzp)BlfO-ߣez^` Qh , WwwkUe,\M|8sۜ<>n ْEf2j3Fx$:2'ɨTۀoq/0z!mmpIx':T Hytd굇#@) LI(+ BFӭ:iH3Fn=RlCnY>rԈ44%hCr$oU Cۮ(Zvk_ؗ7T>ZnJ6ĺ\ u=me>0)QG9)ɧB>WjLB[@mёM;1]N>mQAΌd (g"טWC,#l-Օ lҰ\lMih[cm@zg5tC$h;h{In id밊U⥋2"kc,+FYs pP$ >NYaJ]`kOdcV53MNVPj{EPhev 8Vd$r6Uy > NG&}: 逸]"ָܸ۾MRxM{~vs17*o`Dϛkc+)lf c}2Ub2%mKNK d9Bh!uB/sϳ/ٰzXQĮ1ۥ]n5ٗsVbld˞+X,DJ6IYxn=@[(y)FL-ey)9T㚥daE>'Ee0MNJxz.1S{ڲ)n֝X};RC8a*d߼ԛDd]Uؤ3V0W[LG n&AѺg252SK.6We:$/gg&g7 Vb_9-6x1Ȇ (+򴘩f~f2s-&z,Cnu^ھe< k8,ߢO={/~?_PK׃` PKy.F[angular-1.3.9/docs/components/open-sans-fontface-1.0.4/fonts/Semibold/OpenSans-Semibold.ttf̽w`T79gZ2I'dH"ɐĀ DD1RDElL" "Rl/"*bC\ $'o3)}}Kff>{*1~(׫Wɭw\`3[5wϘE=hm^mC;pbLZ9mG`|?jOL^ϳsg"ߏ~1U|Tg?Ϙ ϓ0zt;܄W'y+cJ=ƧuSoSfo?cч&O;h2Z2ʷ{/ܕYחy5if<޼Jk6}̻?:{Ɵ{?;bZxBz}|[M4>S 賬">Y*GϞʬVW'_6|`ҭMoOF}mͱ# 313`=BK&bFNΙzYi~tY:klYmsxeS3fϦo#ϳ!EϠ94]$Z5O$fb ֆN{_LJ___ ^ ^ ^3^ǴD.mˋrD^*/+*yA(o֊el=]a?_د*%O*-JY^9scgi͉,B&w˕ .yF/zrYYg}  [\3CO1.s%IIO>DVc'4v|Ї \@y~ggz~qR.3m1͌W42#-f٪H~|wt;1_]aKkROwJi^|hLO.)x2co/\:)I*IoI' o2e&jP}CN婝SV_K2|m}A_{-;}}}|;|M~?3m#Ӥ4sZL+-1-5-+(mT]|n(z]]8> s.ŋ99 sb sZ9˧1' |_χ9er} s9mǜveNl2qbN sTwN^nX݀$Q}F_OGwmz/j?BվXc_-W.y)p)RKKK1_g_U_j_r}e/;~.8b\v1bE,l^~cOi_?D2&8pfŸ_|oYFH(b Y7N_i `3c~k!3qfZ, 5dT6krX. v,緀 Y{ց:Bzvf]XW֍ug=XOެ/[!YBf6V†@cl8+cH;(6YƖlcOlvb{?؋l/SƪKc~v^el&bw=Y6MdsDy{m'Ytyr`߱@MlZOm9T;wUsVimp?UnZ|֪Ԫ_qipkUnuwO2ԯvZUZѯ{K/$~I?O USVkp*jDYkJK龇FHRҚ. MV.0jk[HyT9O*}U6t]+GI~SaΑ!|[UKֈRw艾R߸1/GVz5:ҷ2 PYq=>z.߉Ox6O] 2`nCs-Uw6mI~/] VYM3Omp/ D'jUw+,br"[q7#Ӫu]u8'uV`nIxn|~Bƪ w%bDo+ ~&= Mt)ֻMVbbJVxojVj,Uqh&U-Og9Aߙw}jIk][|g,xb{c\Ֆ]-`\uЪ=b^%+FjNeK.lS.?inX:w[{hޅ}oԻmL5fzS^WV,+V$, C`EfVY$KJa!KkӾ_$G-9 xV6hxT {/cX0MH *ˮ'5 jzJr&4U*ّڌMh6"2)YU]L[Vi,gY&O!z[[VUbͪXjmYաEbYvcY~'tr͊8U(5Q%%ZYUijʖ`śXGUDl$xUQ^;9O顟'Noŋ˜I$׏B}R{6vC'*9%YOHK ry݁lT_郪 ;FTӃB |[%O;2WUi/e6n FA{WeAMޔj&6Y*HV=jzP x1Q6ptlvV;.~ʳB9v:EP&|RSZK0Z㲖M-p.'NSYr&oyqZN:y<Ιن/ zc,θTa2ܞ8g4y22 ~|`?{#E~:/y7]17 aq6yeZ.bqB~h.jk_Ҭx%&Y. RAD:X3HO&O͍OZ |JNW*y US/Ԛ'Bj g(vY3-$|0a~rI'6tnw~}-Yҭ89X~wٲ{ӏUЭ[E'~o v;4޺]vxL9BږoUv  ۥyA'5Pm|- r 3y 'vfF==Y/k-~߮F~m՜'+x8>jŏ{)1סأ֘kBCJPym{ qڶ6/3_GcWƾ6 ʔ)_|jB'WH1lb١K`jj)YJܐUwc6vڠyаMj g# G+-֯xk3?aMw~I~~w>ΧHLhx1 5D>8^[R4A0Ȩ|zeDQGLG:´(W6**ډ6m`Jr-vc`nŸ*8iLb1a9?,{z^kw%:iv7흤wN͎^a$tR9q, \&#KhhB$`ujD/LH͉ڧ;]ՖH)CLh~CchQZ\vL I/GJLW"ٻf^ٓ-y+,@_i\|=F~𫧿(9uw}  9dʄpVK6wqYp[Q]|}j_bUHuCV`'6P)60b M?tMHu:T;5g}V6DZ.jtd=himv9&q "R0r`t[9+.yY~' [,eV%`{{=sqs^0*iyys ;xPx$<A<H<K^Q>Pg87JPO_xgz|AG%y@K <:5L~8d Q_ ژzPj,4t"6(ᎄLQЁ*#q` :0%y ?[,F:oZ rGswnuƢT6 Lg]n0,?G,}`rZPaa`ޝ/й AUHSvT }Am&g:#5h fк qcuag9XXZ{|[ :h[@h]AN>%!&TQS}@2Qm8m89ɜjBQV dѯ$8d!]͡\^89k306NzA!5)9cRӾkn㷽R}{e_vEXϟyڅ_>/c~읋X'&迪Oh<)^ώ潧vsy/3C:2OٹxQ=L}M1FPh2jIc8 ԏ[j< e ~mx"" םVE$3ރo'Jڛܴ`=S91~D ;Zh] nviB:prUCX:dF1j)VTn<ުvDir`+1Hz6oãܷe͏o}o6|d)>b#Rvox9؝3'z8p 4K6]X@fHJy gYS׎(Br]ro0-g8nveDxT.4G+xxܔ=OD$,Oԍu j;,=/IY }of/OKK~[WוUR_/'kӲ3u{9, ,4PM@#eZs*){,`"~џmR;`.i) {U]];Pΐ jM.Jx4h:qR!FvXZ_ΜmiE_PO WK0O'h԰5N~ M39nnj櫸C_Sjz3wz]i PLS$oPZdqJd8ĭ 1q'2oX3h6$WbyLyVyv|}߽Q&#g`{ءr b S=͵k_fOxlwV8C ºR EX˙B2 2`J#M^I^rqe1~5u!o X(3W!ΝOʔЫ!Y" o\|cwK0bqĜp] XA7ž k>^pSe_=lǫ̘BEz5G[SD_WA='aWyhy? ^^q.l>" Vt:m諰DƑ04t!<?I/W :wHR[j ^9X4J3 Tƛ9Nz#P=wIO,=!!;w:J1 񗰝s |a"煚BO ~^v.jk;'+oA 6c[(Mq`%aEq'ؐTsa{!a!uvgars<O=8#GQ?5$H< g=kqDBFIqJ6 ŒxڀT_ӷ'8ҾZ:F?*Ϫ+Ac.?#3[ d"ϫYq`9|rNdc_nb:(>'j37ǎo෹3S=?B̸׾`B;]AW(xh C@frc$.WbȄ^HHv MX0L WMsbz#B15CFdM$O/3M |#Oe:W^[>dkQw~qeuжE_--};wﵚ;L;72;q[>wţfdUbu#sȏou'ӛd6NWd`ݰɹe ]אyN7ѩȴ8:Nyi%0 f,ɓ1RON}vdux`źvdk[l}ֿIN?Z!eқ :x|%MEK6 L< V7&L3HJa!@)p:ޏ/[oމ㭺^8ʀ>.h(% fR,H*BoRȅP݆ט+ySL.1bɔS4<߸`xtA0sOfڝWɩ~}K߷L켞|W?[GVO*=8-Y2YZ$aDE`Z$o.v DXBrnvjт]"Ê >&Z8S,ɻ+fyaPu~KL\#Ě~yѳHzEo͗XdTXL737n2qnHjR̄PEܐ[dN<"8`?dתfjuIa{x{: 8~"?3W[ǎ- ՌA*e;{Z0:h(tY K7_OkAB*-I-$zdZ!Vr}D!e3 Z'pN,d`z؍BZ'|w%ZdLb^d~6d RG̞vT^VwXG?Oȡ CwͻkҸ0W%yt2oFY wnuyۋ:).9gq)spO1l{АNF9ix?HNzdy?^B5 ppm)!c'gypV`i{&peM 9yP>6[|~Z$H y|:sq-[cY­~D^Y + rc6[zvԳg.=0ܣG[zR|c/Y\gځь Δ@ =76A< rc)G^3,"oLKt M2h&Iߺv)H٭&XgWO+D.+`ȂI5TbcҢiɔӔVEYyn^2;?_џ\l(^=Q_~.'}*mtJMi*0{:.Ō@Հag:☭Ԛ!c3]s}|%axhQ=M.Iu"l]NQVɊ-V[`6猰*Tۼx7͑K?bѕQZ8toOw-Z[G F-F4P9š kZ; ιËд)&snz@0ZGVy՟&Ӡb>]45իbwXc6FQ\AD@i&yMJ ?Hyn=׿ٴT"FW}1ṋ2~Me! H. o'RIlvtȬ%)k.dYUFK62m ǁwcbnb+T&ا~zN}8;:.Xz1wj6RbXңSJ;/vTCǚJ&kvB+10RȆ5yH\& $i"d9\qdY!> Ӱ4+epXUGFH=wbQ㯜*5U~wrK7ݿO4ϹtVc/ocyI;|d`j"6#U_d:(_P!V&{Ϭ mr׼;;xض\?Y"Vض%M!% |Id#8H&$[< G&h=L* Lqm%`@ 2\Ct +ʧ9P;]QYe-o%/J9ˬ"b*i܁|59"$rEXSdT F RY if:ds(fxiV]yoyi7"ڡiH7mS0H"i>8|82MF誂8 'pb{uLWknWtX N< cY(X\BWS2RR2ێE|/BRDcwE7->5X*2" EvF 1{IG/EcJ0ǀxR@P*JHU 9 "KcZ+֘uWk{ڧmk@yϫRڃ9ܼ俱WRyZ$r3DXu%T_5:j\]YEʓR􅼢R)} m/9ddٛMNnsj`*$S:s.V[ot=sрy=vlY6II΃7ʍg nA(X$T"!e&{ wԚ[ <*E$B68,$I-M<"JvV܉dfZ(7(DrX @JNC\ :| w ; B͋g+Ν9]~[73VV Lq_z|7O9=LZI) yT_Fy5KejbwTZs 9MX:5w("(5^pU0'{ FQE)'xI)Cp 8WK(RjbJy赡|W[>lުޖyo6SC=JM8zȫLa3¾FF$=7kQQBy!ĐJ<-LóS ʱ= @H%aC.u=賺 O]2x_WH.)I PFlhݔ&64Z'*ҒA*/C#aU!r#]U[pvxbOetW\UL2[ *YQX,dY2 25̯7k֘+:w^K Q'QѴgQPd EGѧh>yϠ%E1x "d5@tλWoyEkb G<~[%y/5VVl@/jޡ+c9! f*0S_!C@M@{KvV12-hJt7Z+uځX7sRگDĦ-kL$ 0S/qwb Eu  6dT~W[PHsk!dͺZpw1Ǧ>U|.mr= n Vdg1AY=xCZmS{<9E>h>{~t- !$ɛMW G G)^ jr4jDr>uC)p@jB2Md*O6svmxץ[mwӼN @C[".o\<.J±dvmhٜ)}J"\.@[PIGI[79Y>AYH*WӉE!J7GK 67 5hqoпcNێ/x7ś?~J=>}}C]'vumA/{s~r7P+w>_S>ͬ<…zwO.-.R.Ŭ\;D$2l~)*oxbH~W% J).#mņ s,N![Vk"oL96ՠt: at< /^ϧ[!ւݳ̗CYiJY>ri9Ouʡt0 p0r SlGM858E䛚_ %`7uqmё}<INCEfb6hYȠ!<׬͞;cSBI "ܺȨb*C^Hi6ʽ 9RjV=( Jn^J/}||߾ˋʕˏYa U>wlIDgXG վD,#qk[nHٰWTd ȵ%5񶒲Ps @0KF{ @IV\Y_%?,N9a)[H7 x#?H1+^[ѩ_*.]μruۀy, ^_a7u8* Ñ̄^H!Q`A\7FшU V5H2u5fD Q%4vA@}{w*yŠ2T}O;}FxD δ~EjD.Ro鄪wLn) Mקk6IlV!:V9[z|u%/"zڐ+ c$^;j?fuۀOWw8iSN1Ԯ( S[x"y/| ܍5r>(Q<-6 092N\ϙ|y7_K&4#ͺ?"{4嬂G+c˸&\+Q }y~BCIX y/ X2_W:$Y?U2y H 4%'P e/䘨dr3`B&-VuJ "#bE eJl J  l)EzlT/rf5c~#V}|ѫΜd/-abïyVk#n Z|xW7@sO׎Zդg"{L)!1> \V*}H3Ln* # {3*lФ( .i^P"z?Sʥٺgio_tU?ůݿzL#j$ qg$ $UTN R!)qđX!_e'hh-`@%DA(ghM|J\s"&({%"M'%,v(BW5Tse)2]3n ؆=rkօw{H{eٴE˔GOVn4س}rj0K;~nO׷sXڷ}%+,<ψ|b{z ^kKkn~~WMۯԷinZ·CЙs;\馒6khAIƿ3Yy9QD\5ǡ!fعLHyŧ\\'n@ZVl@Z9CQ"I5rƧRǥ%*G*'Ai&dF[DeYF`v4"B]T7.E"ߣ?Xo{ϗ_9{sG]+Ww'*9+x=+ޙo_-AH 2u'XIԣom_hVsf~X;h^lM L N_/Otgu ~R>'*,1F8'*qr" /Iަo SX.({+͐^ӥwQ}{Koh( UBϧ5y@F7B$؟?^6ͼ$/]1D\dE 11\j9"/2HV#R1nx@&B#?ҺҺ(dv~I HLMum@DM0N 5͸N"Gt>.پ8:څ@;^f!l_C/?1>HXD:|L=7b2z d:8qu"#.2UWP#@nQĶ( !ʡ +:ޘj96!m|p^u+%ovf-\r8/|LMWn=1_pbc HqwElu{JLOr͛-7C&ox?,,Wn/E yWkx[ }^ճ~e8$eR1K@1>a&C BS χ;-sKi_Ԙ^8d8k~- #;3626(FNW\;eU$kf/Nb{#X "y3l-8r @jG*ٻ.n @S0uè7Ie _IRRzTQ$5c)bPNEft%jK#/FDVpΒ:IDhdET$@P@Q/$>o/+BD*RA9NnR; F.(iv8Cz]"o>!MDzAJEn:>^qNC_NqNCWEO8FaYJsjfؿQK f^?ۢ55ho'U؜W,,A+C&w4z9q,YX 1--N`aJ x i 74ɑYƌ謕@LsnC+=E{%Q+v2z |}r%nI" glD &GYݔE?PW d8TPCk$G%M']ENKt=~zN&3ExH݆3.=lكy wᫌuN1=8i?$/߉fy&iKJ@-tk&N@t푸"#|24 KjHY&)A%_{ $PaKtG'I5;K#&I?>SI~57jitz$Jō"܍Jq!1d]?+#s)=,-ڇ%ָ􊐳BO 6(~]T+p!պ8lIfSVTB,m'\8 aX0aꆨO+y WχeQ%/ҿ]DzE׊ k*_XN3؅zǎG۫^;t}= ^~E"0E K6f{g?c}ށjN3uX"c S!8$)!㋻|1bnKK xXbK 0Oc{9|^s lԌƷ{w;F;0NAxr [5\hfE{ t`X O/_yaNK![FQx &w8,usW% WށvȎo'D1DPر]1Ͽߍχ\ev CCӕ è~ួ{;&}ٸt٦=㪪җאָرW_9rx |{#l%vT+(6"|]HQ -#). 9tǝט7nŸ[p؀%:iyn+VUĮ}j~rͬ(5aΎL niRWLD*@)'`f}|:HJ7l]4Lnp@;y/fVӚy5ƭvltaQ|LC ""13BScν\u_z]pVƆN2԰>o+X1԰֑wx`{(x6\*T/i ˅Ϩ{텥}o^?ĞrMdB8:3Bd.g-A]og}i#g|-zuG-y1gV`=+y>\ԇx`Nh3-֮ſn$: 3~khkx* NJC7i({ɠ,y/EHW8_;ֱG7?:YiB _ykrvtR\o{jjț +:2R 㠓#obd@]‘:o(^ΎAOE*0\ň͛}̺i*Q릱3S>sF"hK/qyfڔ$J]kH"Iin a&2CPcT~ D|kH~ۮ& { op=3y k[/ PEHJP۔wKQJP&1 unצhzf?><@ߞg?8ѵ}{e^<=?y Y;3@ CyBdX*hS6a= 7|}˟ zI,]בK[.l{㳂1uP,}ߣCnZse5{ޑhr@Oe@vN=g^rITϷ-A&ID1NDA BBGa$sf #>'X$.)H4QƒmUs{Ʀs(w+_c컱!:, *2b 4^1̤-_]o0.UF p]%"o=Oӣ/^NS7ڡC.;t/ҵ]YY.6cV=Qkfp;吜~uGH8\cBy@ʀ -{~[%5!+SUq@XŤE+9O4 5rC}/۴V_pl<cZ5cA/NyVlkz8UIZ.{8󩦇CvU1GR.v~&hgI܄8|iF D;0|rT].9g'DBc`Ҋ5lxYaIH -z6^겔'D殺r{Zu 7Z D ء ߵ1/+a&H$i( o!3y _+s?Y٘ ! mAgT qX;Sdt=YecyQ{ڙ;->(zv|6=Jf;mZdZ0x"[/{NQstqBp,cP8' ]a-iKk{`c-b`U\o~&Ogz{# (KaSDJaA}$0#Cvx*C$)z\w?H>8X]p̌b e߶E8dufT?/ WMk͵ /^zU~ȑ-ڎw,{[݂+s/{+pCψH$(*LŃj< K#s L'h 1_2̇)CV&۰7QߣiMs{sqT2Tx |?=և`آ]Uޯy8& XRY!g(eU#:V$'_Cl|Ă`KtaeTLvo%M AFmb4dfEܱx]X,&=_|]EA_ة5F=z̷|B\][YU?^Q8~1 Bg|z/e[>Z=GW{?G3cg|xSZ"S^2RDR#ptpCꠤCs*Hu&|98)H+i-$A0Fhr3|bPK.I؁[RkN/2<9 RRo|S3׫l_7pdX}~iP A>+aSG…%lUo.F;,$Φ>Fɳ3 o0vԾ!7+4KU8;& іmYIGM ,xA/_<ϛ Lqő K?X:isw w{dÜ B`K"Y>cEDfE{g .<4a< ײ٠K^ިUuבs>4X1k-Q{c6I k ,g_ٳQdYQFd 7)|W;(P ΠO>۷puGe֠"E_tW_}btZ_ֹU_~?Zٮvy2nV 1!c8eU槮$mzi]|gs!k̕ɘxxc(7H`dg:Ecp&VZS"3M/~]w\_}¿2yH#lM#- fO#نbV"V P]jɧn1No*-Jٽ/uwsw" 2aԩY | 1KIURP8K@yxgjP$ mjZvEh=V- eb)M肤wd?)i{̒?stͮ U+yrS9vhD0ć64xpHbӫD˙8UNg8ǠuW :A l/UOq!6sTnJxݵ&nܨ[0Bx&*n%(ŃRHzNcved42'ՒHRBKuTb (`Q/ܬg|͝hg?l՚7.mGgo{d}X3w{6D~5/=0Ջ{s =CW%E=(3K uhXD䂍eB 瀒&K/6o^Hv:]*o<6`WT#;dUy\d#I*eS\"qx+;i^\>hS`d_TT3/85㸫q"'Q2(e&[޹ ]X *W/c?PVhlp* vDYs=$.M#>.B~N_<}^zd zcJsI.~DpӦ-[Uo4;!bt*ѫapB HzMpUQV2SAI%i2+$([㩻^XP|<2xn#D-Dnwט)S{C4)Jh l&GYLZKE`)J#pwC,.Y*^)%;7wqvy"6!5x\rm?p [\i1ZX[nz_M|;1^MubA[r ).yppR`: :o*~-])aU7 {16Oy~8!ye%{1NKN]Qx#hd( H*Pl07eRIé ߠd~9F5+^}c W->6MT{X_WS8F?b%((hTa#> 414(H?hH(V㔛K} xs2`&[O8N7%N%g4feƖGUvf^a5n^&˩?kv.իYk<uп] l>bfJ'~2d[CPN5czK ueb}hh]{,h!-IQ$כ5(ݫJGÆLI*ذCiIE74"QE~:A Z8dЂdKP,r¹#u$(Y2)ɵ!_rrBd[o\ۮ!À7Mì_|6ꃪI?軜z*5W8wJy&r2؇b.Bb(x )#o7jϗk⡅K' ji'jݟpzJ@S!-(Rk[;ީ쎱v}~󇭇EؓO M报"ѧϡ=ޭ[E#i0Uc0׿12`s]X cbUd5\mDz:ۼhaz±4C[PX%6Dž`ӦwҲv7Z1}}sC1JfTBH)1&-%Ur5\j/ioR_!b*e떹9YKwf (Zq 墯}7<>1}ۜ<_:?Չ}ە,3 7ji=tm`meNPz6^Q$5I;◥ʺO;|PF7=fvS>"E*."2Pbf*5P ~nR۷2mpY0azG?U}\8/1]/ NQ#,Q<1 ;.VY62p&D+Zd-!Rˬ70j;c'/ge >DaG)5qBazK;i{x±-i) YD-,p|&CF8'dq\'_9CComܐo{_ں5p˗ mŊZ IFYB>׊ Mh)SV`g2P7&2¯VZ"vhO`e%c26hu! S_38P0N3$.M5e0Vn zsw}ub;~KJ?ugڨnhk9Q3K6@b=rih'^t9, 3E8u*@k80g2oXG J;Y!)4)e!tKt?rls20$U{;q݆vx:(~XS^ 'wK9q\>a}NBD 6fOF_zsbî 8Y+G0ԆzD\Ⱶ(|4ݠ1Fʰdf+,_8J{ ,ocVGQ1'kT ֶ%VhSׁ?;pr>cL˹@`Fbba\I\Vp4"&!ۍ\U0 6M_Q- s* &c4!E }a(I&df>( .87pHV|fΘ|Wv8b7yXmU9kNFPRzHh2OZgx`oJLq6bbgoS_`mEG6&<g*>gs>Cy֪ 2_FIzA,>$qh -%+$,3lBOHj-Z>'zv˾K ɳ}C!'4&Gmo&]iu}IpU%:L07LF\`Ղ  73#7(UjoZf#YO=X1ȭFۨ0p1G`5l VE @8Jy+ǎ&32`mDpa%@ySCHIQqŚBJWȰiᓞ@[ &hqDs)‹ Kj9e=2ƙD=zŊt,d#${p#F{Sޖech4Ȑ_"@rQk8q4pB;hmµ Bg/ffP2OT6HҰH3:^a ؉G DcH31&_L8L8yk he(Xƚ-,>73#qwU0ɾȟLjYǎz_yh[K?|ȷ{}ִ{7~{ΜȺ ,יz O6K[|Ă7B W3z: Jd@ZxDpsvRvSɷ,K;o+9.:<|8)1Hn]hj)ra2xH$ԯ{14 dL5 CpRk+rcoܡ&OzET3^j<(jtY 3fAOX *l<>k뉻-B CpY*F'O߯0Jyu-B_r] Իkvك7Et_|#)} !S# $fa^tc{Q8I*5^:ޛSp7c`#f]?)Ƌ]0+Pv tC?UTS_rVB BY$@k"%|št٤ E َyW޸u.!$Ue,$QbYqєyY7W>p=>b pם|m-NCf(y\O\Y,B l1u$%RTԘ{9oL^^hWgíadV.5ݫ?"2́- Hǫ9qf'jwCڛO0 ޽ : ͔w/Χ򅩖.zpi: fQQ5ZcCve/m{- K0!aᗙ67 T: h *=Ziv←cdڏQ``Eݕ$Qi>rWCֿbي~ܼگ?=px('RT6 pIra8>/r|K1ZjPUgvÂX-k9CQF+!Lpz% HURl|;zHF]G-꒷ lTl34čf ,2/% -eq{nbH1Fpy핛nBV5N+%vnf\˧_!t:Í)A |"2]tu% ͌z00E}4U%){%;'F%H"-Hg4iAlb)Aym8B,m,y{lغ%MYT份s'뿞/59ߵ[#ыשӱ ,yf@R˓D;-f^ 7 ڙ3ڕ!{VӾ .cfPmU9[6c Վگa:)M/gsz&>{}2vO[Zs #G9 #;8Ð}24PUq B;7q<y2S2c?X6F 4gּҝn]ύC%gr7l P0<=V%q<J=mF-qf #Z7ɦo oԟ ˛]vKUm1Xr6ED^@tssp0LbF}k!Z F.ɹVc#~VDB+ x?6! wZ H\aS:< *xZqH 124kYocl׈? *SvĨ=gJlyP1gxc3Qn.G1#z ?J d;plD(?*ŧK6BQ7z'=nzl]Ȭ`aƤ4㧚 L⹱ex =: ar%C76o{!F]l”m1˩rฎ6C"T4&av_WW]^ _п71]EmՍ'bOѣQɘ>ʼU3xkeZfAΑ!kY[1{LmiFULqRJT`HqF/ e_a'Oy{eɓ#Z%g߾8ۦWg̶Mο?VWax!eL?9~I1qL{+:n] ڻխ0p|Xy#VN]9&LnI,;ȦWǼĨocDz Я.ah}N莓qzt]ջ-[9;q j݃1n^7c՝Us|o\61>^橉7^u9vcO<v NuT1 j_9ZZqUc 5b8# viKW3bIv'p07vP,KaO%0J ~&J;?pSi'HrOlh/ zS1 /..rJw`T]N/?+Rz8`e;:aEWukytmZ пb1q'FJJ9k|b;;Ak8ٳ |\X2N^H}?p/ǞM><oͯuG˯0,!H 0'|eD> )'vdfxHVbio0Pb[b\<[$d"^sA7#-Z7OgΚpiĭ}Zl֮N\G=h#:-P*Rw2lV%Q?x% q'Yyf/R4Yb *"q %@*EL Ar+fԡ%Iђ]-HO 7vjz8?[.m[W"Q1mǦh%3"a48aq SO5'BHod;ޔ55S'J㞹@Pj'*q Ȓy#}OۄBCFt褗ޙ+ G n^y~ķzA6N:mJ(e 9}wTڶ nP^ZհODXAFm|=nm/stcS=znUsA7mb\ktv LTsTPr.D!˹D*h)@_js]I$6^ê z"S?y\گ3#wFra3Y+E'4۰e%dO[4%b2&{p{a/$PMIt*hWb$R jtP Ɔr8FWHPX\AB%%>xۓ['iO&tQV(Ld.ݱn= \i5sbdu p95)8g&笸7ŜӤQUwβ3 ʣI.r0)pɮ?gi4+*̺,XЫN_BG&}8\B~艗O.w:{Kp^Ɲ ,FhS2D J^PMFW.i',GdE!;",qX"._q<> VYyP{>X0"zhJ&*q)Y CӠI NvCDC0SL67mN:^fTN l"] dԹ+'dZ]PY4mcR([U YX jYi Qh^oEvZ@աn dgٍ; F=:FjL}g9qMyYDhs#ő7?Dws'ioXf96LR8O8K# GL}"'GV5$s ^Zi qǧ3˙v5&;,1i4c̾ >(噼i1h񃱢[ő& ֲd}YHĞgw PȨXUlHσƒBǝoWd Sf Nz X#SM*V"H݌<亂pnFp&*~%]{s@tf1 !:0hA @RyԺ2q R@[?lD8M8;ɭ#φt' [30i. ‘q3Q:=;IԺV--FWcL1KuXr3nF&luF&:+-u6qVX68uD*G @@$U5Moշ^%^{g!(tiRA9 Sq`/Ow{-X(UN/|}712sݺ 0OǮ&EHKiD2_kp$ +.9%Yqe |m{CH:z] "4JAT1d+qRS2@%˦8PE-hartT2ϯk*A*6>Cv9EJQO7}?˃+{?{аNMZ-zc]ߥ9kn㎶O۷YyƢ'Bm?e#nʔkNnM"Jvĭ{|(՚͝b-$̟Y@wao 7NER|@ :uܘܘbrocoU*KFD1뉍)Ƹ1!ZTLBRNaYW>DW7nӉ_h|]?FshxU Tc7إ5;}l/vc_ c[+Ut\#?=ݦ,;7$l$܅Av]ss݃J~0u"͢-G%Ћ/d c7>6ߥ,[#DlnlF&wB` xOߌczK~ .&qpć!D#_k* 𸱌$[lWQnU<$v;|}~عQ׏< "+T119vɵBN`vd6 QϊE~>ṳjQ`h/*ȼ/~ޅ=N݄_֩_2'B}NZR f Q $x.2. ڭl3du=mYXܣJ?o]_=viwR0LFh͉Fo s#n 9 nokMb@>̱^-7U.Gj(cr9ѐ$G(#yQiYs@xȩژY.Ɯތ"N*VG5Vp:"!MN*BDfD b^NxO7ԗ@nQW*jUL[x3o5gJ@13]fr!E4-o$0ɆM<DLހyi zIYK%枇;e ܳU+˘;;͝|{{6npI$iLj(g͗3>r9DV~zHNa{Ϟ2zݮ=jݪeݑm[ܭ$3rs[f_=ξ,aNÜ60t5oSUc 7;#AUL+:y` 5}IkG]E Ho `vrrxu|~-S02zU xr+TUӭk-nm%A{,MlI7üEΊ +ZOM2l?V[$I{[_)5Uh٦D6hY\֦m;/ HIIfG \Xc,1)9G6ƙ#?zJ;V]}?itDڞ {ˋ& S^`qKqnK7&bx~N[n5*:wKݰ/'Ikz^3 Oխ'M79ꩻ5jo++k9SgT|de.38nn˛5)c#xѺ%/e6,-WsJr\Iv9>Cu#W-}F-.T8%$[f%"RaaEYQ1du)^@eA)قxtƫJ:luۣWAH BZ76Q`[HCRK*pV4+(05xWE%xY?Vj^cV+VJ)IbCABњKVFT RohTv2uUF'xZH@ u&[TlR:& ooߣ/MY,`)GiOHS >xBPs`m݇=g)E_;]E2{__>_Yf4z;Zgetlթsttm>oOJu-qw`kܛ$EO#OI}E_wI;ڙԠIAߎ7ΐx<TClߔR԰ IJE,F2oo Hᱧ"OZ}]K73Wِ 3יM:Ǹʸѕ JD5ŞYN%P6曣7qR?n]}3bhe~=_pÄQgcÇ2wb]k.-ܮ)hS+ c#DE!*C Zn`%v1-QNP]89!Ig*, $0(5RM <^𩭃.=t3:/j7޴m geKD!ɰEMce1s㍔:q>IU[pkXtt#\W#1ft+N"`1IoQlMOF \+H]L:%Vw6~Ǜl;=ء*6N(2zG?]#3*+M+eWL]l&kkh1O1A, g-MLf@ipYEF(B2-h%Xެ^qX oЪ&!y 7@J";[aph$W}7 1=}[MΦD^q8>4b2Od;*\n'^FOȟb-1U".M"6"c7_I`PTH TBx9S,{% kHˑn!ck~c+|z[r#T.;2Y=ȓ "v: *F2F#wl#oKkg +gm ͜x6rz6;>A=;VVn(vn;Dhd*P(9LWBZI_sD&xH<7xx>GT^aS^N3 o{d 1:amm-{է+q:ogmoIv[a?*vW>I~ns=|`KQ7Z>q[cK7kߦ'?nh <-{P f*0M-h;I:+b6ȬPo>֕T&W .sl/v< ͒p7Cհ!7{ocno*YGP aGl@bZxJ@+ N;6'ЬN}Hb;76Tt=53mdGۖ?cn)x*#j1"o/k.V]L?͂} |~.>ƟinP_o[bXkiY0o#'ߗj;OPL$LX=45W$ɐ 8j(#P C%+rienQ! h_|lJp%3n c@]bEѤ}*v0JAYݪ:MB,[_VY8Celȁ=|m(3X*iR>WSqi}jun.}K56eِ.ҵgFLxQă2,ލp6|Re& jd}%]13oc a\sI̢b VdDXXF*>ڇϽ66=\+ermT`ڽ!./jm}|9T]gO A9D+(nŏtX=Ⱦp,$#-uK.^Y6o%*j!L @pR4f-cC&%%kUb-c͘;bK=qЋ?r'\펑Ou3sz<1\4CV HLA"&JͰ!a0J,8ofKo20q6ep:X8Sob/l*Pfa~,"ΐw=w}qH's?݌ fZӫ/PEγ}). hy7Tej=]d;5`7~!+Hjjkиe$U`~Uez{56PR5~l!WiCze(cGg#;V$nQQďdc0dH+:YaN(0yO(#]_zsQ?6q6sw{Im"Luu!爼Zq [q>CuŁ*z}M"ZK*ucXU96_@l$z+b wyf1x]LNv|BI"da*2--'1Z'XWGPPRgx{Zv6iqCE204Lz|2,nIa'uͻ3+g;Lm!aX_) J#e0Ygh?ܠcF&':Pޢ o y 3iJA\R,J!fI/Bth"W.PjgDփ:J 9"5(u&V1[c jIa \ uH'Q\i"ArG554k[PcYކ$=DF$<M)Q).vrK*zsU f" D,-O.waЇ5.q6-pK{>Ͽ: k9v) [.7̆qn4OR[]"U,(aaBrM"k%cn5 sA\ !DԳ%;yE/ |-YzZ WlSE;j!g4p_X! 7c\Xe\\֊PDxK 1|a,"usS湛a\)ƥ 0 Y7 js'6BnJr;Q\h#[t:F2fS 0e#!pgu9MO9;'nm{f??K%sA5H!ǹRB~% a q[GeDME˖a/k9/=]I{;~R}{ϚXu%ubٗB%obaJu if*uXz?xi$[PK}{ԯaF^39xՀˈ 5ɒgh@oüǯ:=u㩾̑[c@0 g Pkʄ/%ZDMߕ[$ow !=l}{=N YEqȌ 3A!Ky e),b ŒmP n` fb* գh\1YPRyV)ZB5^|M~M  l$ .Kv`vJBfE9({cX6ou̸[fs3B3 NGܾxνxc+6F|ADIL@I'< #$RyPX!,zkԞ1sq킶9Jm{78ۈ>kJ8(=q$׸r!j]ꏊНgYGY@]4 cy.b>X#!ct$èT'*Jf75+F`&>盥4夭 )h\f FK6̩e\oi?E}m謸ׯwHeK3^yQ>Pu'҃S,ų\(-`prJVf4[ X A +/^@\YiA3} i=~MaKfmQX "9P f̙9D(M CUw]zq@!Ŭ^)B5"t}lм$׏KDX = ?XN>WEJM d++/u "q RS71n@b.3%XB-fJ/\0appvXxd-O$G{i{wOCN;G,aLJ| z}vH>BI,"6x^=7L쟐fhػF08~e Jv1X>TP!RY;å#jwn(yDo )4pqL8N,.¼_!B-..Ph+QFοbȜkg=˦#>0qwS9/ 'T3/Rdø6;R {NŒ!Dv*#` X܌17fAIJLFxpI;r5W}1nq!ϒ_rtgr0I>X6Ew5/'$b+FS #b0˲v,zpFL`{6`"0\l݈dTt4fSҀBF`nJñgwU*MS>-`|uiT2ZgXn1V,8tb;'q]Z,gsY.9哲5kZI`cO( 7/Q _lg? 򨖐skj r[Hޘ'S/wɄbL rBNJt_OX!soW}.VmAgcùBpOMށ4_᧋:')x~X)"=qJBsp$C&E;ߖ-}30o [NҷO9?_qxK ˓9b08&ZY"kPA,!5_X@*ӲDMЄ.thVp)OKqC՗;2l_]{d%,3r @idiiVcޕUomyG"gGCM 7h>=t4`S{B@BǡG-M<If~zp4I2=n.""x#=WfȪ~<$ Q˃pPWlj@JރikbgYq9~eQp'Kf|JcJ4X @$_hVWbC0Kjeňs;ɮDE|[sYX,Y󛈀f-w}"μ5H"S/xs ˑlu&8Ձ:(SLԺ4Ӥ)JYhB (D!u# 7@r#BlG᤮AУVktm #X_ps;b” |g Kű/\1Sv`ݱ@mxkBԙw._4/S\@vY hp(H'GL'vȇ:zI0C3_;)#Df;(kJ`ñ 5@BW0 h*e8 Dɩ"L٬'᭩ɒW-V([l]}Åg鼻Z zU%[f1et)@cx0%'5/5h {j^4wB j0-BI F~0ȁL+Q͆x{6irt"#SCg{✻Q]uMFhfE_/g`O/SO~{t{^I^^txڨ"m$dp#})wV{bSĂYrIU@^I _`VЉk܅jdJr 6ca+GQƗ?Ҳ?f)xǿfY hޛo(3&̟GN;dj 7t ou d *m%W sR':lk?4#˜)je˕֨V Γwg6QJ95QmLjD-,JET4Ñ duIVvylgMz O$sɥc~⼥H bܧx~2`1`ݙ6`%XldAO*rR$gSk>~ofU "h$ߺ>n1W-.^'Soq/IiOўBʰ>$ ZupX֍nnP&ʹ4rJZ0Yp@ SciI1A$gx`1?qEo_~òBk]kŗ?GBDIӻe1ZoF"CpKnrgq~I{?^X4R%$T=d׊AwMCr_۟0'<} `ޣhH3^~}#/ ۟}'JkfxWVchAӪY;x9nJǡ$$e['M<|5iM- ^m*D?=2'dYB.|wdqEl1Cd.oTosʟ \ ,_|W :;IF&ޏnlNQאk$ލbhQIv`:S2k~e^1,WmV߼wtoʵ_k?pV~|D[zf˯3AG 9^.2UCI3 5Ÿ7Ӄa)[}u=z?T\Qwuo4ߥ;!['lhW߃']8Y)KB<(j'ߗ(*/QæE◚XL3~ru:ϱ?쏔=^F#,xw–A,=wT'1C~_&Q-VwVDjx+E⣚-G5Nk~GOx>U#J|wL( bE{ _dDy*ٟFK5?&O?Iw^1O#rQǫ*oƛPCVj~*e{/QT,M̏Swh1~:ApS{_$O-cr;;i-#Ǐc|>4~MI}G}Q?ϰ`kr!^dU?ՎI#^!?,w=Z1Lݟ0ictZjn#'K:V7ƣyJd' (|ߌz{K|RGxó-NpA3[?!AGfkd);}DZ>SxN쐟)1PfH(۠d䜴 r+o0b??!?9>~>f*k?eSh$1ˊ~$x B%x]swGyVN)<'졠 :Kzȥ%u"LR2wBӈ3 gPv%w.ߒ`v`;ށϰKyklm`hU7\0"Xj58ڠE=#;a`9>`Xn+r|:Af: Get)J`nyb7GbӅj!7rO$y/I7x`$)Zo%.wD.EoVBAt0/HU-Kv9Z.X3=9k'}b"׳HE- n4j}Dm W?v5b^ĩ, ͞ :7>^ ]iREFj5OpdCJyCsrD_ 6bࠑ9J] =g θ*i !5 7zcr.w#bV;˄[hmL0!'*(?"$=A00|5OPΏSo9OIɌ`fW60H]44sɚ(ʵ/鈹`N'>ۋ]âbzChvϼ a O.@J9w[m}3(k]΀*%T]䑃w:o'oN o/Wj6o5w_o]ʕ_޶f۴O@9+|:8ymS^󨀕qSp8B:ܳaR*rw]xZ˲ZxZqeq*+a=y>Wy-ڌgb!ԉ H' 6bV#5V ''33'_?$m6n߶i&PHc\i碅 mL60"fF%$M0lM$"uڏF HHJL1]rŐUY"2[аxr :p;o'p2,O D`,foY: `i4 ǵ5x_>":Ջ\;g,cJSF/ -s|VC։OE4;a0Q"M :UV"[g")NAb/ Z26gOR&Xd&M!u<1 @FӉPh`C!_ؼu`=5lްAsM?5=ԾJ=eMYT=eA7JLL7/'GR\ K@bF9Xk' e+Gk<2 tI 49y*MhGQ:k0I]3>(P%$dbMa aHjHbQ KXQ&t=N!uzPMA3@hlv &f7A3b9d_t-[8xOdgE%w,.?tlSΔdKJR_4ƥ+b8+;7bȈEf!f}|| 7M"ePt>Y]JDtEby:7<޶ y:%L478,n"Qe pTKѣA&@1\;'l ^aQ!>ml_)ts9K(#4|Ih{\b! .OFN]:R{^_nq yO.;w qUo{dA݆%.7g^Vh!aǹ},dݪ` jR!k&Pmg_mAg,V7MʁO8OuN#pNBHd GI"1p F=t\t0""̜.8\nyRhb_SyB9Y([tv3/ /r~% [+냖uٹ]t4Q&r+Akd0n'Z?3OIY$6C:8A8l421uADH3t3 t\R 3., xAifX%h I+6WI0zz/̿ԎE_-<ֹ݅u74sHp_j-xۗbO~cgXXz]0ꕼu);-ӗ Ei-4*iv`"=z1cHƤ7qK:j$c1E (.:tUPǛE XՃ<͛Aj% Udm` (F81 F pIkkc1}+5ߟ7wӠw9rxg];w7H7Q.}Y.$8i9c8Kg!i 0F:NKӉ‡) vbbu]y Sl\x=Kr!ѻ(^T86ct*tӈ l^ض!$&w*\՝_n@L 9k)ْ{qs{y!WN+_oڿղ~Y4 gy8UY,qH_dfvoTU&ئ'TFG[w(-J1Y䜜;$llE( LJ뒗 ' uƪ#-s)4!Smٕ4|ioqϤ*t}Ko9G]"S tNxx;Z |6 <7 Ghs`o(m11ĸ&Zק_oz6$/7^|]|/"WS`ؤ{<=w}#'*CSzmZ0.|kC}:1?4k?SNwN3b8T `#OEV[r@[0m%N +MgCexͥ{'/xAl\ˆB@M1HʡwrcT@$i=)Z Fqr,ʙ?*', Ē#l U.46EDQ[|=Q@vzӾbtִ휁UalX+̊s"Db'&`w5X~_ZZװu#t#g4X7 !y`y&,~׭>ooi{d98cz;f\e)b%@Shv͆50 Op)8+"餬aN06; G9^Jf`{w`,>}F65е[l;M:׵Cv #!P@3{mJݢm#YI lM[bdtDYd1YQ˖QNtwLIɑ^gkaeeI1'7Zx%KV-Y Npip|}h=>07.l]வQ>E%:=rN`ph5J,a w^lc+OXxݖͻvm>{, "7sd\4Ҩ܉!A!w_QTk,Oj?u^6uU{=uUJrvQc5F(0$bdDe,v&@UXpbusV$ArP9Rh9\gt~q9?>e+O?6~99br~}Yc~!Y3r{ħ,.Ů~`m|\Q сi|MBzhLk鉟b lB`oC#F1ޞ bؑ#kzbzY^ktEr-̴-uGvx?mo7CGAxȵry}+鞩KO6ݿU m{|k"xh |t%5Yk̳&҅ε֑UkOQ^߆3"OnmG{Y$?oPZ)pr1`'M$9zL?*J8\U(X`aᐤ*$ Ұ5 ޏ Q#FN,ug a9O>g'|6bnn4$at"%;ɵcq0~,HKkM#({woRbsrTuRuGdy@.0G=ʣT^(/2}?jK3<RyKb!X-SغDNP숑.Xk`߃Qܣt܇>7<4*]h?ZE#V7hQŌ:0. x` ibHefhKQzzyVK/H IK]1sWw?w7.~awy{$.w+͑b岆Wi2Lw7؃xN4.̞3FXبW7ŊmK_fH͎gnƝ=۠<$'jz΁{kO?(lQg E pXm_S'K&$iY VIQ3m:8*6 2UH퍚(-Ku[̶4ܶm'xC|Z~B 쭒]vܵ Î Td ء`y=TLtkS ϡ>R:t?½{GG{cGOg?PRegioѦA Ʀwhl<$ \or  CtO(Y06;zK qZamI(\j[:i;5O ٯ_ [Ll6&G7TP<(rH{iqɠ6$Hm'͈O*R{3̬xFixvR4tst0 1~t`{WR'_d nr״X\lXGZ~:7\_|%,[D$!N]^{cՕ{R`Gav箚Ҳ)|Zf}8tk6B -)K骮]cIAs &bBo(q]' "^vZCĞė>;&dܓ?.mX8}>0"iP~^z]Y}F{018+E@3Mt LCG4hl0$N$낳M1T f,å`vp3`gvu5{%,WĶ2a0dЉX=C"kc'bB?j>DH^ c&ӈu 6)d$UL"οb~}4>O Z`X#w|%RrA-#n~hc9Is)XJؙMX.Al4BTM#~Cm7xH1Υ,S6[229*?Kg)5 ]gai4ť"*0UA> Tw>ǯϾmF_|-۴Eʁ'xw% 뭢-k<ͣe/F{ Yрᶽ7ߏ׶d*(巕lGp|tWw(5;gbgJ6MF^ALZ'bв[Hxm͜6 OS~y!5ngÀ'--҇7L_SY74w;oh)w9hj}e S.vKxAp_[vR^k;{yCAGn7Mom֒ <Ho"m{佪ͮsnѼY^6lo{Yqi;emDar'39WV)}17j'p TI'S<5ǰ5́eѼz9-l^`U ]w~5$ն uL(ڜo:=([{(` m_~Dv^]S-4&kk! YINsxwч"0G=/ǐj0#i Ø_e(̏`g0`K~#Fʴ :aڎz|kB+e"M~@׬ skp5PɄ.堯tI8~L|<2o}ʃE{>:c%7naXqf]K1f~MYUi&=qZ/X=E Lf^ՀW.0χ@PeW0u-ѓì?6]Q,4~)/@1r KL[= PF`r\sWclc.'ZhMRl$ǘ1L,Jp`>A)'KOK O Wh)m|9g(CmNW?s q0~N0h.+\_'tMQ[j1-p _R؃N.|8k2I`}}ט*fS~p8frކ1)p# 5 uuX 09N4usj_NGwş5C7wOˇAku/?ޏ{)O}y7a0ߵT$ BExG=` :1 eMMfal=w3+ߩg 5:H te(9yY(].߳\\jvi/}/;w=\ӶS3zaݫc2Vq:5M3 4 ꣴހZv̟0XSte&CP{\tvzoΎ4m(jD`{^Q'wѽ9[TbԀQQލ,ꇨQ-=L=9þ}3軸u}m{}?E?Ͼ[.B=o}dԿ[ Y^pf_ yo,1tKF̮+35.4x߲֙g?؁k~39 948|p~s rr,!yCF ir|ș!|/oW޵?NCs 5tCt ;94cx}~t|CS~Ns#\FL?&M;ɖC䒆}JsJO)rl` {4i3鋧7WU?㣙3kgޞ5gYg{5ns՜ksʪZ_.spۼy~>l'Y?/Xf,t[eᰅ|8kE͋=/X|rXG,_:viҏZ/_̣N~yߊM+jW_Ѱs+ίl+n,XټwW~7W*\upUz竮:W\V55kX3z5kiXs|͹5[;a큵;>h l '{lc7n֦ܳMG7oos7Wl^yͻ7|t+omxՄU3fV⚵5k9VF'5WjnXo^[n)2n-s,ؖ[o9-nj˵-l[v5~k[NZuǶm=q뉭oodw[olͰm[ےelmm-޶vm{vl>նk.;m_n/>gݎ;wqlǝ^Ejv:vީ XWP7Y/xWv䉠'{ѧ?{]w޺}}۵yszӋO>`8v @ȭk7?WQ7o?{.φ?^vϳ瞽y0`K:XiXW将/%,W1q7U͒6=++qeLA, RqWxW hD#9VЏ.}?oӗ~QY(I#+|YK8 BZ!K Al훑l&ъYe~kBO" q_QXx@/02:1vC;@ qvŸC+X1,ȗAO%v5A EڕABHFaт9^^J;I >ӏgX:lo| x(Y>dc!cGg4|t&8XM`\}QhʶJYYǞ 0smA:= l5;;FW߀{-XLb.N"#jr)γ &qh}AVjh`]]~`?hD xpGD>O%Or>?ħ鼂+ >bWO|6;*>y5_"/|_eoGs}d߰Kkޫ1oy wlv8O."K?^OxIxpF|n捼 ~_G'2?_'):{g`o] C~?3~//+5˿ ̯k~o~Vnm .PNAI@[8GI8 g"\pSx oY.) E!"Tta"\Dn"RtQ=Eq"^$D$1'ޅzޢ+bH"Sdl1P 9b0 yb&|1BP'bx@cX'Ƌ XLdQ"JQ&T& Q)fb-*1WEX "xCT,ţbX)VbX+։bxLlfQ#b.vZSԉ.-{Sb'ϊ9qH(>Oħ3qI|../ė+}#߉GqE$~W5.~7?MOqKK&~?⎸+ZD6)\bPISQ8)Ί⪸)x)JgG*~*AJ*]0%\P)Jw%JD+=%VSt0QIR%UISz)>J__+Jd+AJ2XU(yPe2\WF((.TSQ b&e2e/3ʃβeu=co( R̎+IdD)U(eJ2[yHLW*`f:CbJSZձiVϰl+^V( EbeTY,WUV(+UjeVYW6()MfF٢lU)ەJSSWv)O(')#)3J, 8S)+#JbV&YyA9h(M,5͈-M4cI*+jjH8dnX&)%!sRIUKw~o9rNI%s'n YQad9llg۾/f![-D&0~)[A*O/V8ÃCNeųtec<|CLk=\`j*:Lmwҡ!0eVIIŴ yœ1ci y*Da}8Vtx0 SP\QuH!OU֫^UD߬)*龎}Tx6Ujp{ u}ua2m][ʊ)*gU+*+gwXtjZL֘-_Kd0|e}etAjbW\Z^ҁ vSf-Ad=Nœ:UV>T}ڌbykW\Q9dZIyc倎|mʞ> |8|z9x}2^2EZԥu2Jc1jF㕂zeQE!3fcN8X êĨrY/W *#˧L/V Z+r%WrG*g-پqǒ=0*8ΣJ|&"~ uF?dڜbVn~P9KT!٥ij*rceVYa6u&N/eի@&B3`G*?5Q+SG`/?٬8}j 87 bcwIqx]wId۝(/).zl-Z7k]qrqJg+-VZRbm팷okgx[l%'JN`E[ :'HՑh#VGD[:h#֏D[:mJ}l"E[RlmI%֖[)Sl%JNj+9T[:RmuHՑj#VG4[i:luHՑf#VGZ:7lf f\׸Xk]qֺbuZ늋kO\?q>dqqT41YYmup".-Qm5UdֿTY/Yݡ*19S]j86g˸4k#EkG֎)Z;RvhHڑ#UkG{bT RSzSzSzSzSzSzSzSZWv IJ궎u,Ҵ0; iZҴ6imHڐ!MvvIL՟=]{Vt Zӵӵӵӵӵӵӵ34ghkg LLLZZZZZZ하՟՟՟՟՟՟՟՟՟՟՟՟՟՟e_di-Z KkAւlZ dk-Z ['[kjz۸k}XТ(GWڹ ( Pt%N/=#9ͬ,4o˗{79g~樟93GQ?ө9g~樟9gNSOM?S> ə'3{On g;_SO5.=:Z@hm/Z@ҧOǃK>.}:\t.}:\t<@ҧOǃKH֟~逸߁ʟ~>.}\;wpO+\i2}oIWt;vpgwt вڪ-+hmWm\*ڪ-Ki몸^wx1)vtt~Yz+{<74渘O;<̖RԄO4a]K&|ꓢHs\%c,~Yli_Q{EJvS\oE>n7 jb]ΑTEˊ3F ߮ѾpS,ak>]N&ãɢ5 Nj8w9ö*lY/p]4~vY 1莙e|_Iqi]RDF\F弉MV\v,4?;uqHšq<߈_ӇY6l=cs(6[WlH׃t<;V 'jx݅Wowv|k^Ύf$65lG"ع-KC?/bmL `:F:zW4b:u7ձW?^?jC;j\=o/WIsCz:t"mW"-HHHsdgmd_d EA>#)s^;ql9}nPKY PKy.F\angular-1.3.9/docs/components/open-sans-fontface-1.0.4/fonts/Semibold/OpenSans-Semibold.woffT{st&'۶ll۶m;۶6~c;s{3uꙪ>SgvW[[vOܷA7t;b\ݷN "m77l\$Uoqm ʌ,2 hlk#}$o/ͅb3fߜw"61:|m<;9*`! bEdajhl4}'ku#7͝| u6ߣ t[|s|04/Ҳ5~/ۏ?Nښ~sc'(]! t@ qp2}+]K`<žJYrc`p `=?CHXUFg/%XYjd-M)QZ"hPՔB<ʶjȯBuC.J?U)8Jkg2j0yد o緓Exo{m`cDy9Z8Gʯ֘WFΕeG'Zu]8&>pu'_4+Bq|:"wa~72煿kGRf tOYNF?ę ~\@pKc'KKb L^J GV-tJf55ʽ}m gLgg31K1>h#joQY\Xn^-P,NlWWC@D-=s֠k28/+s:7($S]|~G&1#Y?Jqm> t9]m66`8Ja$dM1N6lW"{ 'f ߙ    iO:3,,}}}@~Bc@5 y=WhD0]E51ћ/2|TAΒlԒdh>{ hMLw* .MShY FR ё[lܶ\r.3Oy9 }]Ȧjff|CJn˅E~Rl5;BƦsOnP9}Rf1M[Yq-mir~@)uM`X_MQখth1#%m^ah;{Yta+9x WQS=QZ}84^Iamsne'{'mmY]\Y2T61~%,$|͙+穌-:\ŸD`7m \88>5qoѷ5Gm D]R.!Z=п}3_K7띛Q;"ES;5on;k1x/sV9MPwKqOXݟE xk'TpYf91_H5{~=8T}y&k\n~~~Bn؀i/3lfĖݯ2UU@ڧ/^i2P#Z&? Zw(9 Ujx2(Ӧsӻ`IӨ%3-dP0X)=XB4yއ%՞/~q?jE 7B5߀+lTW+:oYyV/ rnz?_fx6)WFZZZ:jĜ{M!%@`ɺvPF#f,/~Wp.,(L&[%P@*3pYDlHf؎,K"ꔸ\92P\wA#ŝCe0] 2 {rYSWw{\u_aax3uXu[t>KBUן':+uP-C+[i!;{ۗ{D'͛,C񯠮ق.0G?U?ŒG:1-p.UbzɅhCkƘ>%&-ݽ3 EhWnņ$?[L/=bt9,]dx`αXMl/.izR6ά^y)- 7nE!2E:פ gz+-w3me %B,|3ȫJU49oZGv( _H}0=4fD,H0}~OT(Z W֏R)0|y%U c:-S#WQ*cLO{]W`' (&CL8@ђ~2AG :.'1*v9'm}= ~rXVҋuuW¸-~fBI1 =3ȒsZM̉= R"<8--ʑmfC^?e/ &1CUܳ~;(31uQpt|bfTnvB4e:Y"&G52*7^ylۏ@q2 7VQs:7p彈{K:XWDU9 =׸sĀ)Ve"kh_th֨/.` H0N.R1}2$o<~;J}۶'4jwĂ\ļo$6Bj8(0yj>"R.NtICCUӺbJo/cyhhQE&T _><mF>sdvP4EaSnvƠ@_-~l l <./鏗ϒ&kBV͖:9\"{pZtPnV0 1\&?SNMྎ̩i㞜}F3Ι 9$LEޜR?;^5LqƵV`ǜ؆՜(,?E)XD"l<N؏":I+ Q/WcՇQ (6ⵉ-F@ 䋟|~9zUeCgrjONh]$y= ~T;=0j26HL{ ^e10 -9C}WAৢֵ$>m. *D9 $qKE!XwY#˟1K,HLW_5gEX ,4G):k ~8gMr}[x )~ g_q 2~ux<δh$@' R矏,-EWi*cy~L-PaLJ2b*Pdt?O/G7o鈨4)5ru0If_!sk _dO&]x5-(h^|Y !G8 _oV7oKGaz> Y-K@q7Gۋ}H1yU& r.tG٫H vƊ"'+!67J' q,4ЩQ*l.йTEU3 80kP2;=[=W}!#e-ĭq/[wЅ;xD@_EFtJ'tL*0GtHee,>C$/t9uj#aS!wgRz$䯬']U>ۛ'pVNB6*H6y2'BKph@440ߔЧ浽_yb'Ra6),'4xnKĨp(h@^_@&Ӣ_U&{B 5[1'؜@P~A?$$O/,g޽113ay>Goq>q.@ў &RNٸ3WePq.LZ6{#<,2#,XSdt<^?^1ci4lt6=H$H(jAA52X8<0).ߩ@^G25 .s%wXljO/T.xmf%8=["ϲ?p@O؊*\#F%̒?6U!ueD L-+q"v}pHkf&khGY#z@7f%#ZgvVbAWtF2_g(#nGsN{σ(%h.j67pQ"C51X>< XkAGYb}6_h˪(VVr&esR]P+д%'AR-CJ^ xF-g+A ̩iOh( Lv4'Ո$qLj̛[SѺh`oo5$+i:&^,UP{ -Eʔ(x wN\-t! K5/ZB2UuP uiPlyPh+>TV32 |( )?ː/ޖGGgzeçXlgw`ԙƧiMMHRGtG"eM.' TD= fS6 ]{-8+QmMT/īDJ*ZƎCϺ1犸HBWToh}lvuǕ=ٿ8J)'׼s*J}6ǒڃ,K" C dZޣ\tT`cU0\Yf͙ТpId"3zUZ}[nWw DCoG !F0Qٴʶ#fDa~I2e%fWA}bGji[} 2C'x!\nK?*Nnhٿo &J.BVYOu$r= Z*!p|~ fd썰KF'8^wswXmW!ZЦ x)1 ى.獮p%4mV6GxkM$>)`{HAR?U1Vy^;mȽ!UVT`_2sbt`̳n + lcCIGdC/y\{unEICiNjCR8WD<P?E> /Z6;%4TazDExs3SMVS8d;oy6]Bv!svD6?{Q\J1lukmrv>cVxXh OXQ "_oV?:𹇧籐\r $Cֱ^TDƟS2L=ץ|>q  ]*in(Z_RN=zz9zjU;vvB5 䍌-ci$~LZ. ~嗍T}nL*<j|w>'{62 v&[^r"Jdf4~+@;}9__2<$؛eY/bDv"|W/] |/Ҵ&d#Fsqqi@$TQA!z VBO^1LGO$"U]R9;#gR):Q\}OQzE~| dcr4ÉȠeBHFp\"q%(tVGA9"nyo+jtyB,(ǶOïa.G htA=jƕh!FOgA_^Lm6M1O nt;m1P_iNP1o%IPlQ hfnAڢ @='扐iZ}H*B/'0$9 G ^X)hjk*Ӝ!4Pmꀷp>p,%&k'$7zߧ 󠒊rL)0VՔd?NÛu:ᩏ*_H w?%p]5YI e^#du\>8.װ=3k"0vspm?e5mTP0+Q֮eQ-Saֶ2|YГN"ʁ`U4%%/f g i8JM82aUGREi_=yxW<sX LowU > F9I3LMu 8k*^Ʃ|^3@t oP[n؛+<1 21󃂻(8'Tނde60br&cI&~!^cFAP{qFg׻@?y9~ʣWTɌ^"qY>Yvlڏфy˫C,y7sRZ6B˽ )˞RPea0~/jK)n6|MOyDf`'RN؍\D[%5> EVa4ഃECs7/Ay#xa*PwbOϖD>TwӣZuY0so-'o{k_* aNXexy#}NXVFdWߦĚЭI9eק9 u(83A f3)Hv).--#zUG4qi]0PItAfaWKvy6-z]0f3 Pu pɻӋhr&PfO/esP85:U}{g n_&G^we%]"?$TBQvF}]Zf҆)!9g;iPż,`8WZ-.]`ӱӫ>:xU $Jʼn|puNz)d!#UV>s'p'%7z;Ov̛3>w'Pgo$5cu:u!LYQk0:c"[uxG0tN,W钿i*V%${J: *H.fFJLlD'k }.ګ[I3nf[\i[O x2l{u&֣!X`Q*1[<;^e$bnU\$3nn%8w`0O%קZJBfq_/c >Eɼ[^GhpwܯWWý+츟|egm] 9gޟWڦ^f9OZXrqk10`ZEzܰ!eI̎]Ř~""d;2.µ2O3_a|T+Lަ>{2i1/8<}Fw&&B,Wz琢`hF svdKD 3lEhNvaC֭!sH^CމUH3N}BV<ܐ3C&=_^GwNI/V>MGA#2}=Ȍ^Z~a[{S<$5nU|Idp(뗹b;}:Aj38 l_8x)` bAӋkE7z6^1 Cn¨*T~w7$r` auSm|4+oSҵQf[mHӃ 5?9sS-@.1lD+4?y1J #r9:γTQTH#FCPW̋i-GT)^7cwMX͏]F Q\3_\st./GO|ad+n'91Q1FrClRw31m (N>@"6Ya!Ѥ>㗃9h#M).@ i(AOr>S^~r[]6HI~;Z畺.wW6ZQ4K^ăr^!?sNl|yG?慊ݤ8Ҷ+{ rŃС9S6 2rG93-eOڭN5?& /BՎg <{tM\ h[*9H"VS!Ǵ#HY/PdeeSʸ,pKa %Բǣz&e.}v˶<C>6WF=$}'P /xiARϑ:oXp>HBq9%fe"۹F]U砺ڑK5m 3st~ ll˜OOƵscq?4xݬu=:]//%UK{s=tvセ~t8{ |iF#c/}INM[g-[fм6yϴ_ɷwwgJB]z˻Θ85ĕd@;"j %Z:$:-u k5(wKVߢ&0~[Q"e~!H 4e)q:OeumHSѫ .Sm!EJ xF-}fdr#%JG~R)# \o h9RY <ל.| 5_f:*Ep~8ύ){wqFi"7W \eL%^Ɵ,/!=vNH]j뽿$f;Iڰ3*BMKPwD3+ʍiP%Lnf˛cgͰ}b߫Tp:&Be)ʂ.$o7 Œ)bt_h;|tBXYv,y8`rD2=0B4WʠKq+@Kd:\DzBRyQ,/hsHb_%`5'e4FgovS|' M`L2:q&s:=ߏ3np .bh#zHaChhѴ'e!Z?|+09Lvb$-(&"J'8; 8 _Wte%2Rhd.0Z j=vWi q+K>{ ìϗ@* >gXi ,Y˞|qgC5_oݛGI::ުf5:b6ِv:HA buFx,SvBղYIJҍOy&>5 {s# FB\LdArw^Ig$itIL>5eI7 yf:Z<tHUyؕ}p^6r:y}=YWmP~o`W@ 1}0QrnZZSd5x6 j1:'0*_{yq8El,Ix{M83=*[>Q+`W؁?2&)Q4k254mz+||;/!fFk/N"!j8.ʎ|cYYʟ4# .N}l9g.j,t=fApCL]R05# ls3Ptݘpp|њ9:9j[Zl&*8g[Q vR=KVw~ȡCm4bI๒YfJ)ve9I>N)R+r[9oh*a/j Gƃ\r&@uksy縋'' G+TRL63fϣ}1ۛZ;|o$ʒ ]L\c ƸhZ|su]`}lq]7^-/ +Le w%C`ok=VsgKgQFdkdx/v XVh~C:g9FPnuSDgE/ pFg~)tp|Y 6uuJ?D%2,)Nyav_>[%qY)VEqs*1anc,T<Χe#ÜvZ;a r"]^@V5l޼rӮNF8 vFcVHF}@ihsZO&D j"A&,&i)eF:lǚ>/uM m}UUVG/pu;Ĺb*s:|4b lMw7qI9󁘜^&% 1ɻ<6t݅',9,5jՂe%#IEUN5FM,1.ߎ|!f>xo>ogsy;Wh}iݠoaGc=40pL-/'FI~H%\x@f$~iь4h΅N$o ",Ol^/zo[f5H-W,X:_u8׫`SUG~scctl uɘ=6za cj$o*;KXQG[u:bk%Lb.Y;ӚTtl}i4w7џ2uhrc|ŨWFn[qxu:?_?6_wLrB l i͎K܊O?'9)O_U@MH2vLL(̗1| lx,0'r<˯9+80cfRJ&RLr?ބ0hi?pw+Ҷ[tɿm#kE7z[x!pu7pS˜joOq? %ű/j}`}XZ~_ǜXZK~#ͧC="ڿGicBabG#uhџw^;믖chaɢG_-pfhVkL>6sG&0WN8mV=N%L8zukY'P Wt!;AaF"pYXvX.cX, hM~{.2'}O/ ȑh27氘`z&بxQ~JH~_hO6zo(SV .Jw])>3|(V &s6h.WhX_@X& zqbiZ-.u|>]D^uaNih[˱n /d-gZ2>ڲa\4]\k`$~$vJ-Alau^0UޢB) YyBY,)Cs9F]G5XQ?>WF^ G'c4.u4eE'AZ{ fܪc.NLO񅥤E6syZJd?Krڴ͍\ pjj,tƲG4^+$~Khœ,ZuY Z-u+6t ?mM-"/4ߡ9L8j~3Yf =2[ڨڙFmucn=SȋLv^dҳo9#g)_cHaT֙nͤrk8ۛ|-_)оT8q2{-wҤ$LĺR\4[yU)%geH OmBαCF6ܥkUnB~8Cq}/E3:.#zr,#).Z[,>֒J&{%C˖r!ո6:}L!)N:@X.G\&ClZ?_;jTj[J(e}P|}4*g|ٯO􏹔/3wC?8F_'t|eﰵoi$ҧsN.˱tk PH Y#o4leZ(;> b=5&љQQ!]6[(+æ\q';R$OG+&3=#{YOۇuSԽK?:NɣnI ~\;j)tcD%S+=h(+],n\gC$-ίhDfNЂX7+g bqЄϗ+Ɋ9D|ɓ98:DZ:~N.ںcG>Cf#V۟W,i|dB 3.F Əݯs \ݿ[ڻgG\_Lo5> _Wl_2QU5}Z^Z!4>/vN3Ɵ1>Q;ChhN?]?x%?m2:Zǿ+㋬_OSz3ts:Fv7kKCha)34Jĸj-f Wj!=]5]^0?5cQ%q-?a2ARGYylQV1Kf^!GMr©i.bY*ptzq `g|%L'鄓SPzKbic:)*cyi}q4x]wkܾp`R[(|/ιbV7k4Z]7(Z/?G-Oy??X4 .+ӑ[85?3%`XZ>xj8WNQt&x:>͕jQ?V%vw?x_;F:Dt諸4/s+WGџ2j6ˡV'cv`XmIfhmI ѐô 9LF,J@\YЍ52,ІĒ/Zh4m8iлoh%QU7IsLL f7%6T]i=h:},r#qz-7Q.cF:0fΒy1+}+V9fkEo.߉ًSwҲ-hٿG$fcER[\ޫ u3ċ\RUIdw6 ÍkpS0d5ddq42!~%(O0hпs?X?j\nn])eowVN: {nk9u j n!@C8`׵yƝ͛N܀9RK4t9kڸg?GH52Rho_ܘtD{-~G%QlL=W)OyY+# 4 4),/O1ry7PY%em7M>~77܈>:R~3g Q -hqF3rXg{j Tr`aDNNAJHxi+ 0,۷ ʥtQDOFG+qɰ h] xzI]ˋmK""{gO3UeޕM=׬ Mzzm=͙]Pq'Sԕ|9a]ee@i)]>;er/ ]KOt3PWkf1 )@|)H|}m.Kzb›-'j吳jJc2p;o ]Va6DQz->h?3\v=z޺ϯ4O|bѤդ[ޯ R ]4ugwĽvԨCÒgz1~)Gn3Y_)x?*cr=wvP9ؤB6kiXMjmCMw2\tt l Ntthչtnh|0nܺpK\[- af6i+6Jb*a}G!={0,H-8 zS.=`{)oJϛ'U :`|xQAp , ǔ"(@C3DbEz|`epcپ}f2|萜'Wx 3}2>o KTeRUBxG6#(Uͮל??ӳ~w'w+lk_|\d7߯}OdeQˢjхWRܽ'nByCFO.~xbۏwvGXۥI{7L/ym]"i-'/(Z[󡴬fd5y\N+U+y5U0ut([^"Wгs7.hZv^P8ae,ݻ_ ܏м意  NeIZeե E#7k{K;=bRg_?$FLe*b4xY9Fs\#L4҉44hD%ו'3j_uUNfux'1'M;Ʌ G 6q.Y;pt3MWgbξLbm<K/g6Rv?/NRܸL]clÓɰI'rY=yH 5>Տ?}yT=p5~%Ճ|XJ8qھbLھkqə,_Mʎ_u,JzFAF2etY2BΑͲT&ln@J,S(g MS!Α]V+e5YBW.og/[ ~Ն0F7ơİEF5@]T?0G.uH>G35u^Sϙlm舘e5*3ỵcz~.cfhxW*bk ;u{9T;B&E"څW׾pY}wR_k ½Fsսss Yzvu€ь5P!B.p@TMt4`= P *(Q !JMd ٢}{SLڦ̳& x ka[:R]ݭ1h9<+PrOاl.^d0)[.=bdYZl|6Q/IoObZwuCo%}jjgɥȀAxDE} A* Š&cj  ɲF!=1 'AMNR*D?ƊBw³s2+^{׶-)}yyw߷b3Nu5$jjl-{lԐ6yh-59:l9fH 6 7`)SP5Ԓ׫%RDX*@ 8 GP|/LUƺBuLj4Wiƍ 7 !Uv`+4% KS2żiD<@[PIZ<9,lA8(4r}lŷ]I5;/W=s"]i쐧|L5K7ǮWi&6d=n=\^ 9_=PH\$5A}k zf.? DgM1>TU} d~'"ఊOKR: v8Cq$"sǭmhGEnO-cn=sKOOncbҒ"BҭUKh+҃;v< `A*1cOFx םl&D$Fc#Kن;6W ^-u2$_򂷢B8A 5!C Q˹bHT(!-aI.- 4~ s:x1iOJ,f;! iTXfRs0D5a!M=ݵ 䓻Q/):ԡJOiO*/NX5kuE‘rbN^8nKׇWg+<ҳꒂDq]#4ۙn-?ǔ\6zd@&ApSp|bo-22Mq>~L<[<)ebw6ݨom#BBkgun 'Q#b=o\pUVY#)Ds{lP.{;c~kLYɆAflV9Zl UVD"L(0r S%O;`wׄO[SIH.|mCSz4{Q̯^&qa{=WNF7{;{ݡYfvtS_amt, M: ^4}8dJ@lZAcmf}Nmf#e_LǒEee2|O5)M Pc4TY67dsPQK8VyAhhz׭[bBƽtC;z_|5+6f3[euuM@zٰЪ0pT^Z9Yyfʠy%b7JASX WOhEw$}xjI2VJw"z%.,cšCo ] oy6Y|27FV$?fv;r*.K'0CX:CQ'BX@ /Z;u,J/K;0~C0T''YE3:GBk 0S&c%`v]3{_YR, jw:žDL\ivX>|knd߾7בd֩o /=9f뽚¥pc6n 쾿ꃏltvJN~1[gü~zPIm  h$1(oM|,Qjj^!ێU}ЇL^px? )`S 6غP;ViR $|#߃hCA>z*}~vs{o;䮔*fɏ\jf5jA:K%,`@6'کCYnzW!!nPݤV#\ҰB=?3j!,#}|JQE~-#(=q;|PKӹ H[pӴyg45ypeI,U^szPP?O(~ !":oߧONqE aڟ*r{JjI+:l["πY[ƨ Qѣdϯ0kHcuusܷj+trxONM J͌ΏkpK5bdeK烹[.ɓOP\?{7E>/3yënW]pxŤ"a۠ #; 7wq3{F*N* iR`,`=x!#l]=622muox13vChaldžF N-ck8}h *V1>l0Q6 %XK3p@FZb'iLW/_Jpo;'͘r_* Eg6 //h٠,z;{ŻkwneЖ$?C 1-2Fm|îԡYE<-,zIhBW*r" -.q!Ǹ?H2.oT=rJ-kjS9:ޔ_N}?\kgf/Rrv=\vodH)\U!0-"ނYNG&H$q@{<#%*D'mIWBH.7=LD,gw{ V ]Jdi+3$`1.+N&+3ww Q>]L k]IШ,=h) Ќ` Ą&n<:$^lG2晹`yC)Ls4$ y"}y?ze8k)5ӍCƇ H|Z{(zbdBL\k xxeB!fCf"?;4&Vd7` tWmkm~V5iB;W-o,ZAB f*ΊSa8q6OBM7-~}Zi?g/hiȽb2<[h79ewSZCg(Rr7ҟtm1c)I콲.y0~]nإ)X./$$.D2}-KV`*O 6P1r,7h!wh!{O(=roQ݋#Wo}bo_ӣ{z-W4ƏPruƕjʆNU5 }"h2{yZS2'w>a}"V xh~|ѐAsL69NWGtJ<ƈEc1V&3 !$}kORyA!Zvb\蔘_5Of}uxkgUA!A8b%/Yɘ i ʊ̉V\IB(LbK2Jy]HΒ';d+-붚/~:8g6=kEslf]hjLFe8k`G7E O>+b[< ݗ;i?oN_~VJ pP(DÐo!`0cAj+TUvTIJқIJ ./xmyK=āl[Z'|0¶_C 1Kϭu~ (ZP[d˕D峢jKDZϯ_o5Fmz{[zJγvWG)3z+XZ592}} ?)mX_ FJgje ӁkѶB5!*U[⳪%W-b Qdz1^Hș g IZ_^.UngTT@cz <~[ ݰm̼LhYl{BSݖ@NBOV25Uc^PnOG`iny j9Slf5 pRr569pLE{g}Ww?2z(-KP3)Wdav#j:ܣcqԇ?VƱ`䝐muM[w6MbSWrPrvGƙǝw%l9ŮDk%sSQʎ(|節{Ts惘1`X76D|c[=m7ƕߟΘ6iH;ѧw[ tB=)ȇnw(4u2X,g!`7*,7ZKӃSgL`ַ[ߧ[*UK=>qbOI5[Il:=2 }K5sUv6av1Hjot"}e ×i^_!j[\ [RgJקe[5kye6i&">1'NMa_q& ,٨fK Du$1?~^H~:GyjT5Hˀ|Nø2"2Gp}_OɌ[$DzYNSNlHFņ9@IX{JK8y3v|cB<{^̘55ahi`zo-%zݐ"p~ 5]fq B0 vIv= qN? Q3س,m&DeeYI2; =jE"GR+P* [G#ZFK_U|ee_Q|u冄-*b^*ۋpcn~=7̼[} [>s/`Ӷ@{<թ}Tn4ej%ʚ?B5uv3F1l(UwV@r$_流WzB9GzS|e󙩓7r{Fm=-7E<4!?Y Vj7aJ=m<^6lrr<^y5!;i頏K(b^6ũcxi(&;DSKDz ^&mKg> =r~1<krRN]xpR!CHX!̯w{9'eGKMTls恉4n#Q=𜡡ܞ"\)(sFz$#3$է+_k7ܜ8M3so.ΰ&n^-E,[cyXKO;8Eb//F]>gk(4VR#9iSdk h' 3nnS ҆Ii0K]a2#\rz7=,v9? =JY_?}HcykӅ\&6WJf/uSEͤرf;A&øfs>3/nen.}k~o*T)x9j4M婍4D2 #FZkraCZ,A񨚰[k@f$O_oYc:{λț^m!'ͣiw>dqQէ ;B2[Ŏr9@bU v.9JeO JhMы G$ڦ?9V;]Fu͛~xRFΞIמ#}?K*F-Hבij #6顶)CN 6jbMMF#I/@gzf ~3K+v"D,vlC_0H mIтD¶oc`ؒR`(?`j0T{В3Ձ{@un^@˄#%Kςt<7<4F|yt ٶ84L2Ki3~TaM™G+ etΆzlS֙-"GoʀF̠vQ8:СWa$TEzXKw\'^R9T)o,d}D=wyٟ būR b?")04n82{M xe]Ğ4',/~WgT-ҭ1jJJ-lZܦc~me !iՅ IRqޫQ0Zt49sۃ @ڋL2nTS\´0`tl:IWwyC,F?;gNא|'I_.}-Hl]t/=6llw yV/a}m:}sFC3&OZ3twans:9ւ‚Aُ>zRxtG>r:IS{w bkGJ|JSR}##$6Q!ی͎xZ9[o6qpܰ>̌8nJ}?N 7EHp:7j=c7ժ>l?9ur23[ߌ֞OMAV7T;cp숵>J%22%-בx~Ԝs̡buch0bg*qS@f4u6^1+"mOoQ $4^GL%RZzM޳[ܩ 5޳;EG/K7+޾B gۍ{djH #-ɡA߸=bi-S tsѦI'&b:Z='{6ij.ĨL\'c 6FX2!`k aJ>/`Nx6pNi #'-`8|Dtx-d*DJIsґndsO>h˧~H9WiWwt.j\& :}K--_Hz/'(~c-=5Lu(o(%3t} Z ;)4 H?%f1afꙛȌ@a9Jt5bo-%e|k_^u'cm^W=!tlnj^OzznE]ᶫ@[77| =R_>[UsWwTUe+dJ:i"KEA6ԲTj^Բz"lպz$&iztb=rgvgm4fg:jA+x@2)خkOOn! x &;Ed1-uJ)$/. 01Yz}L|&: '-Ǥ5-&ثn\ujl'3@ʚM(ژH3JٞUhjZe Z=~%[JmZr*l[Ңl\H;)mfZxڞir* j&+eNN)yA8#SE6Edt_LLd|<}_=Ăɾ=g?= +ٯ4DO- ӈEܹ6-vy]:S[v}LfJK1&I 60r*8Lwe"׌_ Y>3)X%)]'oc9=sy. wn?=zMP9X^NcV03 c:a2"2 8 Ciğz:t/޻<ټ~#Q>dA&1?yF}cRFORؘG]3PphY+NeWcT{MOF6MDܝ&ӫŬ)k5SאSVӕkطH+w?RQmlF*&ht U@i"PIaz7;jXTG-NM[ҘQ;dl T5e6_@*3pM-A|h=\n$wvl-[u nQ٪*-L4UI{iLQw4h.RhRk$;[Tj툾[ѕB<'KnOL_KF h2n~87'YTOi;pX {;y[`F/8K\i!h[zkqRRYG_llӽiA&H=g,,j+,5@jŸ~"񦹵m{{H%(h~y\MM#$1) Xo^X]Jg5/j>Nw_bC0 ^ۺxU#AJ jUمA4D?o0; NfOd hSX]?MM 魘P=+I>b80R:"0V;e1Jc/Z{ZyMm{ս{C^07]]wy]l{|de1 (``|Z6dV{{0v~:]G͸<+UWo2\=iپWSQUzHx]6At L)/|g9ͨyA]+6n[|r h'4nܨ,3u5`aW-EB+as -hI>`a#օC̶2`Հ4o7M,)PкMl  k#1gF$NVaǾyU\y4%l;JR OE% {l8L=vr:"iI9q{ڰdzgR:3s/X:jsL,Ɵ m|P{Κf+nV͞w7puٖ;G~o\tvn ˕ |HS35Dy+56:*QI$Q"2"forJ\ 7ZV w3쁸R(@U)Agxfy%H)vj)fX^I}JV}ﰮc8b?g!))WZJRع 2F7!5tƯB87`R ql %. x Q8B6"WCW&8*ȊkQ! %:ŀM 6_`"kRɧҔ4X f;uQaw0j+ GmFU*_BjڐdY׫?bU /_R *|C2ԔH{TbnCbɬTvPȄbN?;y_ 19d)y^Kvz^ads}q7zxIlHl7Vd;\^uPM%,nuI``NR ,G ȝV{_Ma0&j#mQE'mS.'\UmUz( __7|shR{mTCXFכk7nzl0N#' $ 0yAu4\grleIULkIT$o}`C>"PZd/7nP#'V(w}X *;L`2(8,$'$ WlZg2K|st1So/v mYipqFw}?aZaZ: 5?\4{6 isDR~?%4m^֦Vpr4hՈKh \RTF-l'|b֐՗O-E qmqh)˓BLUo¾elЈ鬷2D^PhOE,`uM -JR}y ~w;-Dck՞;lxS {yW,aH0Yi-]3k:,K䞽dAh=5TV'wx7㑢b=R[+捀eL:f'-Ldd@'; ) Ud P,jnc6p*N0b1 7 gh@Ul>6]kHG~E .?md }%_2hT5 - /[E/ A=N}j_/)\=e56@ #Ii Jc3签ؖl_U>Z)C,mn4 m r#"֓-lqhqenM\aH^oGʺSB9.¦?χF'fQP%R7а߬F@Opo'P_itp{@}fcx,6D5A= ^(]WG,˳JBdmBWRNN12[1q bRmEGl}sKI5FEMr\tv$>7\.)9\40sѠ0;(uTn^z͌<|tIen9ZvcKnO|sUՇFQMusBP M\Xy;\ D% sKlaF𖃙`:b:{ڸVr{*^K^*ZmxΝɣ)-%^' 3ά?wH ]6?uMc-_Bf}rΟbPڪ;z_fٰP^S -j\v;xM<2ijEkHP f=r %fxV2qmZT-#fQ>"ѫV3ӆWu]ŝ;3gƬ{aZ\Y? qn c?b6v,2գ+{ ވx̞lkY,̞lA{y5)t, &躊&Y#g`6j_cc.S葊bwOQwN>}WnaبQ>L"ސh[GW5FɈsOJE:N]}]Q72a33L`njkJ0˜eѽ9Ƃ}Wi)^cSiLC>CF>DO%S;1mڇ$^m1ntB ȱ,c#TkmG*x8#`r `_B煃ng7޼ϪB~1i>J\g6۰WZI- 5r H L^$q"Md=8He~ Z4⹓VБdRj3;E ބ %'bs-c+N3n2?I@ԓirs&kddp6? L&&  3=* d r `}, ,7vZGr<I'ۮ9Tb|~EwЗhGmߨf EPҔNg_(r7i/Ґ2vC+Po= wa+: ((nBv7@' dN ]#D BBv#)~Eb(̚2qxWyޭ?M/Is3/mvglFFdѓY BIIIK 2 $%-22+I9/4EJS));F0eC=OOO!>xQ]O@ZO\8}Mǜ"Ԙ;c1CG$!7"[LO#G|qpJMt/bՓ &ro7b 7k-2b n޾Lk-=8ƿ[t>I4Qn<4G)#!m gFh?!M'ۙr 0]dƠ-Fw-"Uit6蝁X-Ӂ)4'ǘ8uKqO&fϳ+C+_U.DYϬpM6]Cҟ>C-uBSByKN`':N+Y)|ȯHB@`Okc0/'1T'%H8)yN67k̓_/7f>C+-L]"=N/ O|ܗB'!1)8 >1cM!pnȩ,r1PIP($f{uI _zu]C얹_pL 8K\ :0 ,XFjh1}@\^@Z00_*Qcʆf:IyU:M.;ؽ,.=VFzd9qӺ'Uf=4LVrj}VOw]=*˫e[#DF%))VI`b9AJCx{߱/vP^J|0W!PfI!iݎT"s!Ǝ>5;@ /h#`AAl[Q/D=Zy^#t<9F5yO 2vbVk?ϷXY jU3_ysDR(sbL"@p0fRTҘ$l@#6ܗqX< u0q:g/.;ߟgⶆ]ݺ{ӉT5Squ}P|/as֊ЀP!! ccM>P*;">D)Ȧ/q| kU0T@(5w{̜L%R KtFJ&^" lrԩd*E2ETkLUE|aPaY<8;5L59OT+.߸` xrSFWk(qY5s\VүWw;0BuW~~wXLGҋ?.{ =S vgȻ{Gy 2,C70|A8/Y~Qg1~~RVFGLs1~E~JQ0b`2.%б&`:&PS{>yRq`(2rR Q՘UcԨ0SU5?yU2h'7Q$;K0:)Nx/!|i{f 9&mihMx^5O`g{nx@nNAZ Z87;mF/e)+8iy= 5t)ɼ_0hErOhl$yPxȵ>8Ax)aNb=0n93Y=rlmUM0' 8Fx9L ^ݳ) BU,Z<9$2KBq1q/Iz[>g;dっb˝>x 𴄎h{ø:d~lV#LwGy rIfO: B┃2L"AQBĉ=.fթ?~˿33oGj^W{z>wW̐MsV[u iB,G (7x8LBڕf  <|q0)}l}dOLW3{BT8Y//*u\^ҧUwNo;{F=Aƞq=ܜJ7 i'ZOQ時L,>O JX:{6[glj }"P|ALשּׁr䯿O-eSm} P:z<^` <@ī P4x2s Uf 4B9Sf:Is)W hv\?6n~ZoG_ƲW,>q:sUjt= CU;:tC)Ɣ@vى(RJ52䜬9ͬJM$6Ax):#e-U͆TT 蜔ps8|{eޝGv qahp\a eBe5QxptR@'f`H擈o~vFqw;tP x(=HĴHLYlۆJ qp5!*"kl-F>ۊ)ӈoxduj݀_q_U}ϝ*IDHTQ!!Ĉ aDP1 @#""m***cPiڶi@cFۇܼмz_}=þ}߮?QjŎG>1YM4d:֟tVl3]BXV: %fhW7w|k)Eq+vnF݄69^e篑C} t}I橖hS4`ݑV{88,1n)VNTu 44[dv0Ef`QcEڱx~2?]{?(MkʓKd1Q+וK?1<0?ZlDCOw-?-?I `w@e'#+~] +TkSNAzV<[wo )@[dJ]p EKIR]4,^FǸ MCW_/@bR5}ƌ)uQ2{FM?*9 _B5Wvk^HD172[6lMmcƮ(IMmWd#X uﵝ={:]=0ѓǏL7ogڗPe3QlFLCStkg&~.a0I~ ۢA֛ vh A솞&ݧ}KN{~z{KߑY[' IV~yQ{9CVwn״5T~(HkgK$[\x6Ђ`U';a Q0; dŽqt̾{mjc,Bۨ9YUǑՍvVGQxVK;_u,{w뿮uryn>W(~`~6=W.ot)Wi#lWBS[CK~Vmbć蟗4zaK-6/I oCC[@6 _gowsp a]|ϨjmHQu8[FwI苠ICSBJb}lY=iE=|"r]߅JgP6D9/4b.sfIhGS[RK~x&]^Y= Cb+O廃!zW-X~l$lOꟅݻ!?z#?|w ~GZ?<ȏy*byc#z p|{qBZnQ-_cfB!`@tJP>%8|_\ OքϬ=|?9D>G:uIE[TDz?FUjhq\zAWߩdjub;L]3I,%>k2nAeE_|Dз0#! \0LL9.mC/ՏAZJ? wqj3lnJG~꫶gqj/irum֋~)eyrVc^~97kl?7|C0;x zlW;Rzā#JT4(o,q(TUOBp̧zeA3!!àx~ke%&|6$=O:ȩ>/~)E^ xe!<g1=qgkAu֕WӠoL7~@9j.~j?Ѱ$am%8[VMfL? v/4٦/ƥ!ȀIJ"9"v寧" s16Bm)hR)O 7c$iM mlI)^_b*m휑lIp َl[m1Mj=‘??(֞.|o7+C5T*{I*SXы҉zid8\O? e $ʴ=EπtQ?ԌA ~hZrVfβ/j\?_yr+6Cߋ_zb|&Yhpv-5%\w=U!k]Y*Wl||IGyG mɈ ['};;vHqQt>:n9wxpPӵdӵ`ӯ)W > p|ihІtڐDU _tvnWU$s[Ǖ2Rv )R2 VdHׅЖyI<@-N HƏ9}!p pKE겴x} ;xPpS1>92W 䋵ÃdȓW?տoZn3]>iJ9qW/nڸ~ ^WLNY.LЇ0J㵄Q57ep*Cx >KƋr{HɌ]eO":eTuxZ].uH q*\Eꕖd"S1ί'BDH3ЗR8pcU a>| P:(z#¦cQwX9ޥ3`hc eDo}+$qEzFУ_^6 b<u#X0bd-nG#˓.ufԻK|YݝėuZ L1StvK>.N.Ov cdb)%ϐ2>/ٙ 1Br4V&QDKxE7&+kk#W 薿bt|ٳ.wq5;`Kw :[i[N&⤌hI5>\',֠>Z09 2`YK1bH7x>,['G_}={QQs7y}5C+ec#izoX+g^5|L%;/<@9 OÏ1ׅY{8?N"I)߇deq9|G"a.`:{J[C!bӉ,=ovDqN:}??vC7}NEYߓ>NtQAB ƒ(Xb@EqVT{yٲO\@ňʊ)S)Կ=gqݰ{4޳ld׬XлwH{JY?0-6WOׂR-W橼:Ve cX`Kl,AC!:Ida-+ȗ_v?ȸ\#nL^Af4L2K/I8+8*t?VjST^,ڊFu P<a,G )nd_vXf5;G%kgPGuctfQ-tǶmcӱݱm?mm~{9?jϪ5cן5j9e]le:$&'1c 鴠 ]`T024\&%tĹ$ˤPnJi=Tg {!4pڅ?&$7)ިLorE8/ToANks3VLAkXcՑ/!7x\TY8uq S3Ke-M\89H{"E2pv((5Z?~EA%+* ZːX(l0[΂  9NvTٲx+[C}Iд5*j}һwۍ6WWz =:p0WZ#ąU:N!BɓVQ3Gw??v:DZ8[A5V  q2;fpwy?I'># uwLBFZ;9dj䡾_[)ETROSep2N-о+w6HΜ:b^NkmPGU ?/Ezĵ٫C2aS0)4;0JE}6%:g>•p'iɌ"|V<[&Yn$vWDBފ9`_HTuF 6.=WtaE'#xV*AU)m8:  =L|A0t%t%ᇻhfQ5%Gݮ$^뀽/7uΈO,m75ue-z=0B3\?Ug,%N߶WGӠ ͇S|ccx_R.?[}j94;>i /Za;n#We]B,$Yh4bO458aMg~k]$-fK|%ʫ~{\tм-zGAG]w5m[Y7M'GRNj읞 MK0,AhV=g/ێa kBˮӖc6^=@9؄uwft)}ߺ`4I%tut.$lLenk$.fqŜa3==hN.!<{w@8I}XVK2j=?z4㖊ZgU`I\S6 9+90#(i . m ܯZ:fϨx>Ƞ4$oϺ^J'][pF&U>B:&{r‰m_8B/+c0n52wnㄜ̟]p)xz]G["G uAB{^m/1g!̻յ .E6O=-<('j6=ECC @YsQtAdq$[ UmAϴߗ_'cY["?'Kw<e`ؗЎ(>򁹝~S&>5Uo_%L'1MD!$~q$I{G4b?`ȳ~prC={d+ECw#tO5LIŢx/ nͣяf\8hl% ֚Hy/p#Em$D;3jN)۱߽Jy~;\5)\<)|us{yDɯ]mS@9- 4wɺ7=2_c$:@@4U2l{Cuߓ @m#P@Rfj$BV[^3[Mҏ lohH,Z:k8(keFRRr2 S}"}|EC?rxrEeMLApKdX2('A괉zQݪ$'b&܍UA݌7e@!nB"?Cd#BWY?)wmBou_px71emCk_]ãBN@햡O5bÛ6<t{48c}V{6@E2^HqB2Y6"o4ǫ6Nh;r=Pyj)q-% y b)~}JhI@)RO/!8"d/j><Ŀ{3Jƽ=piύ@|ƨ3Dc*u:](z0UB_&ʇ.^^T*e_Y#P7ai Ssi?;EL; ;QhҖb 2n*kb3cX Aj$*1hI0K,tT+c>NW$]DeKI?oV9@`IQwe֘ؠV=ml]em <&9llu}W϶ FY!< s[z2GCvN'F;+$vIe ޺&Ae4Ajog,7\ x7l^PqwQQ<ۯ˗RUXFbqQ,|QfQڧ2g9,U8uC5ou'4p#euA}?/ZB:9A*aAɧ8 ײ =i{ʍ\ ?FPg[ 9;CaH!B)9)~sjY,$\_"w>`١B7aJYapw~pdu1B웗o:Ff_R#1fH39zt-`$n !G53[mWv6WKWe.A}Kg'R?> G|NM'溎fz^E܏:dPv B\6peeh{U u+V #{󇱷0\٥̫_a{#uY))&c*CRNTN;_i8AOӻ% O0iVF?=?pϨAf@uylR{}ֽM_&_!I𦱌`|Q2o뜁QF7ciD<|~yEsqg [P=-pGjv^< nۍΑ:JP+_B(p&9?f|hӊME=]kIqTk6>s̺ulH|_tL]^Xtz~Ar#m]Ċ^SfEMEo'zy[#Ok,=U~Ty̡kѾ\1,C9yOPԷ]CTP,*Fş$B">CqP{ aSCh3fD*ɁBHDowXFYpI4!xze|y~i72VKhֵުj^ BtdMɧ5xnԄ׺ cl"ng"ܹϠ#uc\hj>ȧՈD_23t]yIÎ߀*kuX"РgR"Tg7CIBKd])f /SJ]9v˅C j0gsV Uy\Y0k()vtr+Ϲtm{-[Cg>Z+lttYÂ+3c!3xE֧SaQnH"WW,r}]x-ǝdƼOlP,HHREfr>X!쓧e>Leɳ/qmxG8;ohPL$7Ucbd:~4iڊ5 kN?gkO8_F¯*tslfBQZA&+rw2ZG)It7 :Hb֞ 9($dZM\L`ĞϘFWcq8k`Z܈ ]o-T\ H& &P8Oz8Kh}$o3/z2q571XdaX0DaXXH0dB KmUtz. d^%[ ).$jƇRMV-/#bs =2(< BZ{]u-"GI@׮\ϜH$Ġ(Sa!n!kJQcRŐNc0J̋.ާs"4ҠxkJכ<'cZ00p&=!v ,fwGVnEcUcQHҺG]0}OPPhZ >ꥪXīϩAԻoҙr tLIj}oԇ0Rw>zyfB + 2#GB]Mc_(S!1Qĝ8!,PH硺6vOPtAVcc:&#u$V60r}7[q ŏ&!R?UEWϿ\ E*]ɓO-u'0AR-[!s!}?w,3m;Baʩޑ޾^4H0x1#0 @}NJ*@,oL*զ;=_Z2_-udd#?~QK IÊQHh"M0 qAFQ^J Oȷ%Irsձ~>}&"&Nr>glV)7N`{jqo}&0O :iۥD 1:&&tB$v9֣!ڝ7ZfMEwk+\l6T`6$:FB{ =1Sip2"'s-s=/@ټu'*icrݱebs.t~Ds!c~*8ᩔŜRyvW|(@9Z q3N6CHe]SDXrӚn);?Щ10{تl/JԵn4'T"W*`7.0R-:h"k?˸"W-5v-r @񼔔+Ay!r)}г.C(wst>@,쥺7J^nY4gX Ǎf^pwv ?ot1K!xoBϸﮈB5;~W7 V9m9TCa;t[3taąF> yB|sV9 1u@\+fӹ/I@Nў=k?sWQOSW<B\ݚ0I\b]ZsF#B@VMi;}m&9Id OJy|ĂL,1Ud0@v^|gak@V[uA^`X%nVdzoAбF+ ث01$>W |M6ә0Sx-ރ Yϵu_;߾ZH|z_B U] rDJsj {=(\N{ 2^*j>cA][ Oָ*|%}gtgL1!k;T>3q<JoN;yx?~slu@aVdbVT7~9<fpxû716r C5W R$ϒr9sj;|y+++G~RR^3#g ap8 I'B%L:(:UV>RN1.Êۍ$x +J-9~-(Cxs\;# l ]/rpp99e|' ߨ gh\C\6t{a{e 8`s"ryM A|S5x*;cێJu./=^ 7ϵܤA`P` aIE~S٠E8dQcIޣyd+$śA*G͋Dzvn%  왠asBoK&(C,AD9ky!=Y[JFW$]NWZQL/^ .0`b/))ɷq<| l 4$:ve矝Py2w _Ec}cF ''*C<^?fc c /Udŏ ct0\4pQjxru%l։M8tj Wm]>=ᛒf2`nIw.AIvRAmM\Kq@2Se8eܤSɤKfN{_?zz uz!`¿ H~2meS4N/j)dE 6Ь]JsbxXzܣ}$̚-`Õt>13uX<}D^-) ZP7ah/b+SjiV%ͩET[xVzBU.XZZ[445R%PM!V,q4i_8Y1BteFInNM|M̢<i^;} _Wʁ"Qs7B^o``շO&q"͔gϯE z2e1V%ҏcu~Desk1$jCwfəj_l)*Wn &,7+{="j++RwP?6uqw,>7>̟pI??߂{g HaD!E~4 7E` {#Ъ*{+𪐬{3갪z눪{CPm2{Kpm{SXP" 7'9z!/ *O nl% 0DpD(we>eL CeoL;,aDwt\(ܐ,Æ8aۄѽ/`[q: ?`@}sOd̽®)z(;4IiQC Xe pB| /H韡.#mzs@nIv#[j++Zjb3Zjbzkv^[wZa"3w[!"wԢzeױZ.FZEd'×nf9BprMvYY !9^tpD^G E#m6y2 sgUv2B1 qĽ zm"[_ Ak_svBt$vDAû])[N`%7'|Wq ʉEnpb5z1KMB=Df0#~3e@'` {3E0:nG0Va;C0fz3`vϵ7Ƶ70׵7֐70;Аµ;0;\ϐ;ggpgȞg?T4TYT<C3$,U J7Ujj=lƟod9kc+=k5F5R%VVZ%B{5Bb,AD9 hrZ@˞\t`OtbKx(l_A/zm#7 oS@풥Ҟ1kbo*sOqNoCpcupn};{oEYn $nىos{orKo-yso59sn={ożYSoMy4nռ9n]znlzmcfڄaDEVЉW l6t iwj(.`|#VɮXӯaeJ&n@<ÝB̺X% ]t 5GWZ{}mOq> K~(ܾ^:GpG|_"4 8:3iy,j<x,Tێu y}@ƂFN ^-=;{\ 8,duwG9(J7îQ.bBD^tL"¼SoTZxT6秿VD⟰Wg6qܕ9;5bGYqd_0uhi<ݘNY ^%W[(ɫ`iPڴv\ӎ'j{:l]GR"R=m.Z΢JydPErzUpg_&g$DA¦Xj^޽p3>>z)z;ҙYeenL;w)~aН O uv_( $˫ͫO5ͪE}v9-/$[R:/愛JHkLkDN `YV~uR[dm I n+3gҜ-R3 t'y2C=CnPK)PK y.FLangular-1.3.9/docs/components/open-sans-fontface-1.0.4/fonts/SemiboldItalic/PKy.Fgangular-1.3.9/docs/components/open-sans-fontface-1.0.4/fonts/SemiboldItalic/OpenSans-SemiboldItalic.eot̽y|U|oUN-N !&E&k*EDDdQPTTDDDDn(. 2:2Έ :qyRs;D}TWߪT{%8O3?)b$)W#}KsqcOsӇ9mjb\6M8|lOb46a3D\LMlwOmX+Ƶ?x&="~Dž|={7%Z3{uS}<}>xhޛKv:}  =uSF|_',\೿|1ϸ{)"3?iʸs`,~>Sf.X\?}q-fqT4a"|,/c3L7V&XL5n\_;c&7kR᚞~9$mlv+a<9s1iM+k7NF|N轕>ObǗTjNYQߌߴLL39nlfWXC?v};x~XA81# 313)hAMKb9m8V1sv,Ԙ*t?n6fmdKllzx>8 1.zheupOIR0|i;Vz`1{F?'G?E?kF?/F?~^6>GtL>%yUٗW[1L[^.#WɫyN^/o7[Glk`؃!.YO~fKˤ_qYބsҘәM)w{"7IƝ\~F~3GGz'ίϣg_4_Opx.s, <77|%ޟ'ab xv&eC6@^$>  pCo<#Uwi)i1>d &ЅFXoa~k7vuTci 2ćO82iY&Sf6{.v7_7g RT&ޕNHgd.r$0?O+Ml9{U~x_/ۗ}7:n--=7ϟɕr͹I޹cs' bi}*>>}b}}z@~V}bl]}O>χ>J|}Z>=>>٤OEt\Û jó [7ohא??oԗ1hJw֟{~_O =?}.\9ǹs֯.}Wg:U+_ WW7/}9˪/oݾ2˄{ ;廍9y?D2&8Ib;ذI[kcXcΒ Y7Vi`amk  fZX!MdT166ȃ-+-cY9u`Y'Hά ʺ[XwZne}Y?Hl ¦? ΪVFQl4l, V5lv-1=v]l7{=^`/l{3i,;WQ*{M d"i-l1{ vM簵l<͗H,OYPbv23[ɳ)PxݡVG'2B,,w`;f\-+y܍-;]>v?[6Qi{ю0{=Ş`?!|$LJ*>Gj>1H&Cb!VN2}=kO ;<:mlZ>*sߪ4J\8BeΩѶl*wJ-RyK EAU=#ErZO2ʯvQ*-WUg3N}UߏUSasqa<2qTujnxoQ*c,-fKc+/.RZK}'SJ Z?i8Gd6w /oH 'XzzMoze}ś:N3|׃ >h?ܖ2;}yWu GTǀ|pHq40 N~7t430nئ#_u ֯!UN U3jq2̺.ݺ[9H7E}Uƣnn|AU!Ȃ[&t qLJꛠM=[h]p("9};O\Q_Gp/gĒqn\tDDPUFdMㅬu;o}s%kLVNUwx\58"+̮r!mdPsB̜.-!iӥ&nSֶ]$%cgp?Z}Lߊp~y];  Xz݌w~}iYt\%,$;M0+Jb#k-x-`VRm2xP'zL-9< `9 f`0=!k|#X Ò3371Ǜ[1)ΡK&\2qӑ4+KAGZ /T-%dZ&;xP?A4h~\n~%ڎtZui鎰nqeq4 ǥYqRq'&'68:CG+o33bɌ=' g̡vCiH'93+;]ҵtL.ڄA_',;d "8)BY,'Z U*nO{RdLXBY5Vt&| +Y GDM7y)A>#xF v!} E$_fU文Lgrv-4fwIPLv'#;7m4.aN9Ӕl*+W0y˵QN+4{ݭxivyВv=^+pSi$j8m+NsM^.`Z*Vfqhҡ[)\q\MugyyV H¹T~@h8|4gS1m]\H0y˞` /k7W˚\8=h9u_RcaPYU4fzxs[Vuvxy d RB;Vׂ,09]ef`'3d ؉Tp'ŋFR@T\-v`xOh%+ۇݮ,(Y;<)vexl\sOT}yxǡf>?)˜?Jq\eZN1[N';׭xo~d+z!ʁ5lrj֨[kw5{7I؛rxUEp Fw"څHoÞAE AЊ6P5NUHuW@).­[E0N0Y?*ǞK/+,Z$)B!"N|~AnQ5=#2AO jt^5@m!lqZr9O(VmU$glJI(F,G6j-Q]wBI;4—k"Ң_"h~cч899l9xJnh]Q|[uפA:H~zƕӄQh).N EQ¨T#:J̐ޯ[1'tJ/ѯ]$ dHQrz39XQwBrkA3ڱz-Hd)O*׉S jF!)\XR4j7||RM9n 7ɿ_Xw[? _s],kLӚl3M׽L:j+;TVf$SV&|o#Y AU'.)]yW%Dˊk WwZhZr> G,Vͧ57z͠Iz'./W!sDå&݁2^!RP8s O[\e'T\?ij~B"w?ҞC'tc#g9~UfjP(`׳W[`؀hI8O*21R~cӷ95YԒ3RS0 !qKenx̖lM3䘧TUyw}0#US?wze)ݴ+,02ۺjok%uU܁I 1LG ']Cq ֠",>Nh,(xb5fŘ:SM22,,HEɓ'Co;-mx(sFTJeTC9qǥ'bXny 5&)]< CRl0R VDHbW-! SZpwɤc0)*GIK.+}޼:.(GWϯ[-tPg~^E`li,%L4:80: H tAb-5?zvx(D*XLͥZUSТn!r4 )!ʔ4m3Wٍ1ҞU= lƮ&G@Jj?`tG\*%Jjvjr2 f$̦Jtec1Fai u2 2IC/ĀDl@ZNG@j"DuxғVަ_>}0)Gcڙ*EKyrO/%6,M,Vڊа**ńE%s{W{H?8͗W{ξ͋y1=u $qk9cdjTojvDR fvh9֣VTrLTH# {3rޘ H, vc Z*xYΰ;oN|{Jz5cyCo뷹{Z{U.~okݳ,OsbCO^S^@HkK#k*`|-QGҌ/- M=\!HPdhEB=4(wh3h]jlsfղpVvEgړxNZ~J#MiѺTu)$ D-)׺vز:IAC(dMV1 ٜr)%eXͤ<\r'sqE?-6>4i>1Ԋf0fS4>2-iCwU/䆂[{BtlK\UϷTyoiQb'FH2Ƀ#bShV`+&CBjSA:;a*p_vq1^z$HuAV9^ho5#\aY5 ~nK׿]ϊKq"9bݧyB!2\*kTi>(K#t:g4Gd F #8ۄiQivBn݆hB6iHA=U_q"iO`m,&0#{)0gƛpc{ߘc㞰 1]NNu9ilaݗq1Wnyfc~#5Rf6MSfC^q %@+sOi-|PY-OkeZ%z D*5)zOw=n_ǰဌ kJvCC%؆Vlƫ&Gl_4l#pӎ:pބ!K7 ƽ{./K9<N? _y9^m/}jughG/4fRj!xF0\6p͡%AJ078[xc^js` $ (y\| Vݏ;a|8{1c5K8~Ytͳ#ZZMHu:C@^Ly^#ЂVmehcxC p6Azf@_[_5={$< i8pR 23a#f"Bs<ԚY0/b99MѠ/G^w»0IzsmH+8[D ,PwC,45ÁAw! 87-. >)8m})'zOnag/ M aTn&.r)u3gݗy ʾW3nj^9wfz͘^;P\Sa, I4EOb!41?Q*AxmQ;B c9 Z$P_=z5r| tdZn#'M|",#:86lr7hh/[EbB̄PP,!$8 ,!=@Vw[E2cSzɋź݉~kHZKlj > B*)/ #CH[ }Ҫ=J]; h b x1Z7%SABl;f0v+հMJ\!^4&XOde|YóQUMņA,$2[2;y) @ `֘R Lz: ̇Qۥah v@80 M.B $!u/JTs+2,Bke 82he~) os;W,OJS<׀[gt!i D)Yyq_J>R t4D6F"R4^@>-֏?R/#f,b)b:m,ע4M/R< IY˕@}ljT90UZ -qEL@.;0#7 HR^)D3b$qδ,`!fO^ƨwND8yeA9Y 01~<[Ed7t[A';tk5{jo|m'j61bgR?eƓh(SjE@aI}LʹtZyE$0 C& Jp4*ä  K[=sCC76uypС{⶝=y?8aO3M'va~S/ _`"Da %%p"ҀYU*C ढ़ lvy焭N\;_zC,n; +gA[["d !+PƺMS2'Z!Qd!?2@GWÊ˛MNpF,f{iAl/qLR gVe ĦFineT578n",h.uh4"="qAˬ% `^8-j9SppvNA3g@E0:r+m_ţyrA[[LaPغ%@_@t?&apJK4t/ٰk~91p _Syxs:w\>wOy.YutU>mѠo{=7x㜵yL#eo޺k7']eW~@? :R%dO:,r8Etجbj&8Sp$z`Xs`N34'J(H'eHD+O 0',it xc(5FÀ?R:Z0yôRu-4iu9 6VnF}Ȼ\++:}_?_Qꧺ a7t:GRlu$ ֈEaM4Fl9ހitruD-0OixvfcM/^PܿWi]K{*7>]AmIWuWcY2QAGc e=zFo&Φ)K*$ D#2/(p+)A@Ś =meuROґ-R:2NNt4h2R4͜ Y05k>S$y%AP(-&K万GקڐrM%3_-tafEA`J=SzcPc0&;ATdr|H|ȉjČZs8Sf b~K/JN9A$H59DBJKHt4+HN dc$*ԍbJ\LDNYŻ"d\fxsk򎿭pwI)S&lwTTk6bW4iN%ab6ĥcsگ.MW#Go?.{oj,\˖K6Qpz@̇6|C*bc2`ₐ 9-y0. dA 95RdAfTHX-e|ԫvT,Gt_S6~`|dS&#(*H4/C*h !E$!5FFo3$9R䀃B!i Y@H[ -!;7츴cq#o>/|W_vά>uNn]7f:Jz#xȥ6tK'b$aP)%4Y:`"끄-I⿡8|Vv~`:{3^;y胠.9j2G@I@zWgG) y>K /ANp ,ɥ:ѵ&85s݀S" Llom{}Fv<ŏ^+>Y=GO[6:DۭCQϲC&t}Ur7+Dn{h vpvHZIdf=B^&#]l&Q/Hq6q"gBMgjuM_5hDuq]Rʣ_[-L, vXQX"=_CosB.n&85 &b|ĎI; GG4@qn$ZןVr7 I* 1(ɚiG_6Ӊ !5]E&S x|*S'uNcԄW, N MY:/eƶɵzd c:&11G~U7 ++4;͓9 yevK//ZW^ʃ-a{idJq`-0s ;rdwyC(dyEBGBjV, MQqhJ T\"A8K&Jqn^\. ʍ;$# jмX?MC$PӉ=/3iKCB6VKnnEjMX P$P*R)V'b^y8Nt1dRMHi)H,ga)b--VHȴdi<O9BA(UH92kT6%noSԂ촊_г?7H6e9Y#S'x@5*l-H;ɃM"nۿ:׎cvoA{836'F=cI|R4w8!9$SM``l v@J ܁FCa߸>ZKLVX; )K3F#~@x7d !o S3X2i 9@4C'@l, q+CCE+~l7[O5Dzqv.U;?YtRkۻ)v%.9 }o0I CS~!0uy ;5!$ObŃ7IBL%y ˗i]<|yNf,5{GZ-yE͊ 3}٢:,[o?5F)$[Oj$0dX57f'N)F"&' )=}E.BDY6Z0+P/EJ y$ y#P|@n$XB"D % 6ѺMgrßDU~ |qrO%(g~ҳx 2[q39&{(#VoExHi(;\Z~ Tke¨ʰn  qYj6 "ՆhZsf[T!Ɇ,B]]Zv :Þt_>1Ysd#LwNo'?LZY<&6@(3q#8@vĂǞ_{)ph[53wi3'+n0WG֫O뎛]usgXxKIMcGmԷ)U.4٬G-%$)^E^Zdď+%i%3+7GD - ~ٹuy+ؙibǾŭV?D]InSZ"6)*`Q|?h.^vdwFbHa5NEK&6Su0A bܵT:l[\j)W_k,IdYy Ɲ|q>woݼً/񼝻/|t^=o٥{[,}wOz^}s< ~ۖǞ?L!KrӻoBu9A1G2 _RY4!6+¤b(o7$ j#ouBbN2< !w;DC(BC}f1J ,)%c;;L4O|;TVQvec1MT\9Ě$,I/w[,I5>+nH-RzDԗO㡹3ξֆ\IeOb%M)MP.[TI54=aϨ3H^B owGg.4PsVzԼ$[*x=u=DE$CG ۴yB<̩Ħ0"(IZ~c6'!-\!m#~||CG.gw5Cһs9fg>i;Yi]DAs M-̞ݻź9*wC/Q&"(L)(EZ">5 }&LZ%f# lōC8ڵkU=6)}Pkn7\OU[zNڳrT@͘cBh 2a^ƕ_;DfB}ѴVr~;ݙ (+'7;*i|(-$Cűb2*'s@_Қ/U"@PNE ʡ7J9 |ʅar!",sESkؑ6sn o=rx|_\zj;piŷ3{OQJ墏zјSDDyE#]d95lo^LiϠ~02P[>"`˧9XE6G.BAqRcVr-daV N gf1fw?wYSWw4^=ub%sW/LW\㻭,:b1rElnX Ui I22ņ]ڮ¯[icn8nJgmKN|ͨ Sh$ s%_Z,ao])Tf0c(@0!)L8 K%% @W:@A2Y4/C$,ݦQWݭ7&¡ۭOYlF>CW͙p[Fl~]xSJ'OUl'8,.+j:eiAvMY|q‰Ah-C__1+.藿5O % Z[r~LHuG]Wr'B9~"љcb1!2%R8Cvwa!'~ZP IG۬c]v=Х>yaܞiC:L8{CޱQ-%Rą 0T26_z3+9DvjMNiX2$EQ~%Exm >x'8'/S>=|Ilt$+tDXU+ 4F%آ7d=*'M>]Ј*"kQ2BWvU=;{l}sM~{s6{;s7ֿ߽lFg edg|xrs|%FJ~G_[z9,Wpla\g d2ob }ُ(aYFҕj<хPaM5,Zzc *ZaPTH+;ҀB,kd̮`I w r^ bN/-GGMy;mւwˀ[Ou:ߩRs潃غ|mЕhh&w#khsKC=mפ}!{}Սv>U7=՗7ϷTځ jlo"k#2fR,;OFCwdp$k xݑ@5A@)ZԠƄX8'!L4E)v&xtBpDylq@ED;5˅m<80}`+yzԽG qQ4AZi-b^ƞ/h~kO@+mQS_ſVѾ-vE&Ds9Yi]Z(xE]^ۤ}aón! cŜϙЇ) }TwwH"x4 Sĭ-镘A@ynT0Db6|$R(؎)'\R8D:"*jkW$9!юz 4?RnQG aaܢhA~E7*sV<+^0gHsKHsj1Ab-!:(L(r6=K 9ؾ&܏=Ѥ֚xڧMiލOgoc^8s@]88uܲyR]<ؖ'y)}}w)GR^1A+Հ2f@2p͏RʚȂ)7F~P4Di*=f$J+b?T;lF̚&JBɍ$D9UdlԨFHP\~4``a"T,I@Q0kJV=VCo,[&Uzr`/]z vXNdyd{K~DZTW^o:aUL‰9kֿo_69];`v9ә*ڏWx~GlXK$ &B&#E$>Qr)Rcyͣ8 XXf^"o3鱘(1(n܈'C pP>sn3ƪo/ZL;óƃ8z }ѺxC`2OڠY7)`D5Et*B0QyE!RyСQY(.=' q_SmIqZDu"/Whe)R36PIC %E@$BS5z JA6ؿ l% tSۮS/~^ةrFo98-,Q[M_L>U_X½ûZ6]O غg=ncQm^C|)Mܾ&_c#]M/t3F{b|ķh@ybZzsWgKy6m A- ~Bڂ :Dvxx2)f8Ux-9h/l P|q?FtM|8j]yXnFLk S!5+S| +(K[Cob+e-̶W{i9rW{~fꁷ|?~ ]OXҢޕ/9jW~s;}܂ǢcWuwI%B cO+ABL! eZ<_uW4slVJJA@ gU/Js&Ws1go_8!4~1sE7&: 3^A{,O l4DPe7rI1bN 01U$I2,#c(Raö o:?CGӶqC'D*li'nwݩ.<Qa{^RԴq/qfKuY#^/W$3ЎX^-d.>NKMu߈G|{Mo3i*^3eWnj26 51{^.? Q{e_4Qq&=FQBF>(eHD$:JJB [HHIz&n \ŒzzH Jfx#WL(LMtD[F*TǵWYPڰr@;a^#v_ TQ.-V_JJC~>0|cGzdzng{A]a{Jo﵏$<pΐ?9G=x֓*As#uBDG6A!y|B@1jP, {yTGҞ:AYl 7=es~CFbh̦c&[4U,W mtn{tNf(PCٙ+ZJ2h …EM"_ oǸTmyx!{F:2/Z9FK?4}NIK{_9u:G/?+0:a փOdžM26J~Bk_ q&/θxCrwźET7! ю^5ڱ0YH^ϯbce$6FM#1s[ݍ_A]@9wSɟŠz7hS Lg*+G 'P~\D1<2'v1&4ԉĘZQ;;(ȹE{/B9vEK㯜X..N(%vc!D=\5T,d#pǟkGčxpp4m~w$m R'Ւ&TjppB<1yx =fH_>`|8A +# _x\>,S?-ʟQf6&M+~fnPʼn-Lk߉kTZb.aL|ؠ~$[I\1glyLdAEM=р1Xkz8qjU(Gz'~AI;`Vh8.[n`Q6'0'/3Ŕ>Er&K\`>[sO;-9@Z?z~a2Ĝ: \C:K>Atbzohe'ٗ 44hha.]iQc6 PIB9٠2ⰝHP*XRZ nl'խ-76}]}=ƈz7t||C|u:rb|9bARG~>{؁rh{#loÁZ 렼81?WARQ㣈sKT5yH٠_׹h(5j|IĈ8Bl䨆ӫD;(nSrv}q5?=o{mo]?I%pSK;nV|OϱDX|`z<_B>O>X<t p F p~ CW8`5gcN1*n {;@ x5jh+6jA 0ztUvC _}lu@RAY(smG+Oؐ`9s)Ep<}+Hd`jS@ 3oR>mj;әIУUc9'$zDj;0$<@wׅ6d\BCHivG6C;|]4ʖzw,N)6a+I.DS5T7ϯ<AJpr_ gm1s_$Ű 3M_nP\S>I?ذULCYg߮Nko~?<:qM~ jq>2)!&>roQYϟ?T^bq}V!.GO h_?}R3 sƯkZ\Oq5ߏXyMw\GuÎ0v|1Q|O`أ'6l=P媾uW#B#B+^c$, ]6 &U*GKd ʆG gV`+<0J=xǪaD7.5#o{ka_w =D{yN4qF&QZLO $!58HQINTL'&wkPW6ܚ鉄(z$P'>"gg'77 @DRs1<)=T4UQ{+)7tNE [-й]Cr/W+Q?y(0OZKָώw=f%l8jR,L4↞\ܑ׻@b'pVl0x/W< Ȉ*\Ɏpkt @C8r{&@ 3x'-]Ah: gRܢ{031}GF] jz-l0G[WѫOűŏnW쵽 yyKOv&ۭ'$Ou0Z3*f/,}"J5Dpc F%@QnNo+ R #krE>L HpkuM+?tяchu|0PSc,e,(ܱΰۚɛ)}xԀ&e$YdwWq!{kf*=OX0pjGȍ6EE7,*l֪U6K3DTfO^>x} u2\ܽk|@NҖښ4j+ sⲦ~ЭQc{rҴEUPhi-љL9dUg ;;Bдb8DĴ&nE"4G a-h}ER8@nMݐcaC]+oL;E6mr[."Ԍkmg7{ָ-KJ7e=cٗZL>a2}8W(m1fם|?cx~xm{mc>ĸ1" 1n}_q}̇uz+_)5F DUTQMbTskQ^Ԝd굲b*g;Qӊ|^=4>%~4qS6‘["| MZD$A{*;wvgdbvØ_XנwEx/H |*>׃:<U*a:\ E5[E%78sCIІ!8(WΐC?45сhooѥ!AgXuSzk#E `a6 `Ik!lDgAzC$nt"v{aݴ'~p|G,@In`yGiQ54nc fHa${Ƒ<7OjbFQn&'-1dZArmET\.1r Dz _iU(DžV?0ѿI?bb. gn?.%&q{I9=;Mw>,OaTjVj1ZQAbD;,~P#'F0r.(@)oѿÂFev~[^U]5]n?m'_:<5@Y_C (;qyS3EnVڨ;X|(u6qu%ָWŵLǯk3~(]{̗(qu]3:iZO' 2Ta'OeR`F1^?=)\"RGOIOjtGD?shE}a[E٥Zg:yqk5r%E17 ~nr6KE3"XLlNWJ~kYuO\JmMvڢ]PE=]O}y5IL^eS14)0C-E3' DFYR /7}?ok "K^+!x|8MD!Ij|,V?,.hSY ԭMVt? ;5m-Lw']ubV9EM}68ھ4'_:r)itj58Ëkh6rxk,)l~ 55l~݆9P'^>/6B"}^X8W~g3?c3MT!&N3ψ砼:3=?.䍙yfj5D"ÞV/t[,`=-Ax8 {kk; !iAgb`Ub%R K0MUL#5-WBXm% {\A7\EUU_?^VO\l^w-?g+"XTQWc"ONkR}Sxual%8 ˚ ͻ0gR}\pkۮ;z U|@5h Lj0LNf-´ڝh/~^üOU3-Tsnj]'B l`WTA=79υ=Yyu Dz6dg9~]eѣor|5P%7{rZ{`R9 \J#nh2AWS@>N#D!RF@1dS&B'@3WHkn5ː`qd?#E9bd\ &gq1f3*̇gC$d_kz&VgtXޫ+aG.՝=B6\YC,T{ψj̘IY"-S':ɓ h3m+x #qjxk+*tp X͠@?l+ȯL XHcdCWn{. | GJԐ)b_F/M08`FhYnHvJg2wY=U^mт|#.j\e3nUU9.VhgsטUO?i9s3N=G40pxG*1$ޅ}ė@,i͈XH s8CBEhDn5nloRbZְlׅR^Ktch:p}÷b;^|F]#ɧ~\{q =97{u$0y-p?/"q^4_R^[@ן׵>.ʿɨW9sMaG|W9? q9%1 hדd: 㛱-N7+ƸM&*!*[CP'=A!WCQP& ŵk$sĄ5QF3rpU~"FNmS K"aWS|D;[PyC}'@)bЛ*h(li["hdFjy4MU,l(zE4> ME{ 9'KA-dnDiR H$Zo6jMv3A Љ2(>-}uӜE3~cgϜqsJ?fHt;ͪK+O,MrWݻvE߱ 7@n r ̫6F熑x^ *3q ،࿦<[RsаI#Se]1v^.{tVwxCk53u;W}TxSON%WULf`@M f5p]o2΅NN1iP2AQY4,~-'\- P+lfPNVfz1G[=1#ڮ;phX|}8~ܼ>ml^lk6;6߶]=3?fHּ<`-A 2A1brEGbjI&000t \}4GغLRH|Gڍ3 Dۖ-UO 0";/MaEb&OPS{szTĈsZ4.iD;#G `dm `Q! -a]9:7Y>7a/rFHc{.2-` ީd#*M\$"J!I/:X^?BkB' 2Z2UQ! .9 W ͕bqH1G^~ZS7U uUlX)FfVpY0|̬8 s:z w%E D99r"!U_"wo t](D $,/ 'G{zzۨ<3۪NW%uJIt7'<}O lxAӟhZ9!$)$g5^^(.5H1kJ,8~Wal%4&%Pmq: g:k=D .K̎.|Hab2ڶS݇{&jrhvfRZ鐱b╸ꇦ#nê^|nߧoP'<vvUu}T1v}~C: 'Q`(W;C>svd053 |`Q -b 8ߏ@wzE]s;X6a˃ǵa-z3{xVsY3¶9%?WX#gJ?FM@Ϣ6bP ~$B2AWM,QT?tlEߝuwm*ib݋kgNDk&{^3~MӒyus YC~M_A3>B1>!&;9og.Ihy?SV3KSvS6ҪtߟL|'p $8li|q]8 *Sv:ØhkaE7$,i>,woY=]g(%uwCѺukXGWa4~i{yʀ&!q`)($mym.SSl}O>,zAMVc&Rz1 9: op%FOWЎY>ԎMBUs))ja=SdEs+k,v[-1ɇ=6DMŸ́qX+6U^\?u85nׇ^1u7:,nYPԥQ{sG{>Q}oѿXw#sS &*FAui֮726kO\D>4uC>SWdLQ]穹]'& h"|Vb!0R짻Chi%ejIhnNLNVty$.-Z*6;2[fbMvU){JuVM3~3K3"g,NǒS i]$! MyNXOMv:/ ]5~H(#z!PфWIC(v((jZ;ݰݐ`A]ys8zϮQ{wRNWwtDqZ6KwLWmrM]p@c-4//rڴA]Ԭcq$^ڊvA50k]OJC M>[7dftt! A^cEA\c1+ `3!TgcȋasʌM8L#'Jţy}F$qSӴ~oK6iO*.[}窗Dxxuѫ9{>]yeǞǞC ;tSG/&?:Q/Z/X;#󈔧yD:  [?֬Ē3;:|%F-Εo GoZ/TM,Tih%/˙k.dFvFXx8 @Ŵ.M`/Z#B_1F*nLqe1nщ^D8!X [hU 50\Ærǭ羬sش*sA7Ջ^(8H]eP3+q{yhi=Z#ʅTouεʮ4gҸu–P>i>s>_XH!}ԨW>ujKS`tyM"DiO'H KJ oiX٥@8UP*rBx3@ Ŵ=J}ns‘wmڽtla?ITg18J4.mUXDD>)H(IM AM [^):1QɈRĔ/ļa'bwoX5Z[CV]e{~SRIi_HR׫;MIs#-Է(uf\H}L0/F:lUd3`P84\T7C-2*GIfr93_2yᥟ7V`VQ6ޓ 1u5x i+LFR]= RdEO1W&P;N_wp7~\[8v5 MP渐HREOZQ w8`uϔ VUlѶMNCL|rqΐ~EP:_,{n_85G9q.{]7muu޺˗ :h9;1%8@1\F+ amh HA͒VS<鳡m!;ݣH˞C} ,v5J8P~7EPD t8* h~]j脴!ʼnF^c ~!MV$`B{h7?3gѰda*}{{h} pf@]I RU~5шnAÃBA焦 G !xM44%^j.v.;" ʺZN“jvMI Y1a {\Ф_KJszN=Nc9X)ܦ3P'U#/'A7膟@P]@U#r(e^n`~BM}I'"_|SQPrL6 S<ΩO*b럽oW-[pP?X>i3 6:\g K"i*Ja pF0,)Fn#N!;lL$rZVא , *h maca5 _3ݼ]tf2m2v+l*p\)%^F5avKΔ_󗣈wnR!|]II{i?k#xm9g7g~..E.{s3f32T,XeD8ި*~(SDIGVp%өhCFu2J獞%:Q59p|#tc' J- Iٶ8GzFzWw/z}o"`?]~. xXSwO],qKcC@Q$@b] _{azגv~t+4« ;Һc<9I쒔H(+-]P sЂ~n 3DPݜvcu7觬z̿.`X^voCoפ= ^{7{3A33L/CP^kDp!7:6!ѹԐ8 H(Fk.\8`Dɡstr<"zqϼ5窫nX#,dϼ7&1bWNMxa:K $Z ܲJBd JQN:.3%g$斫|HЉZcWb XXߋqX\T/UwJWm1?[:_DqKGН(֏T %j}?b}nG@m̳]AwI^ b3q<4Y&pte#>=ٲϱ4f:h5W0Jy-oXB(gNA+[]th3Ҍ`9B/xp:hB$3.*Gi7wԣ4b[,Cnga^ˇS g5X  neʸ M(m4m+$J$/x:* W˃j@A=15;:e : j>,DeYWcʴߤ> `v2yr?=wl2}C_֪i3-]8aD?@"p>F#Ĥ4__@ןϥo\)xƏ$-'[>8M_i)tpв!$[ nKn"cG~GM?N‰]`849hEܾnz5&c7V_A,KGQ <+*ax ! B@#N-M2<ӋoI8Xwbw( ځBZ#ďbMCz.PI(,zbչ"~޴y6^Y[q8<{47E|Bⵠ @''CTǡz =|zZ"VY9Eg'D⃠ Ylf}=fk^$c03}{ٗ2 ќb3= ,OwĠQqTQeZ#^b)#o@˄(?Q},Skʍ;O|-|"sٛ!CTC߿Rkgsxʐ$B`Kט2NJSMs8ֆW5RQ=&^+A˅)݌"4ٹ9}!ȉ4"{ 4QeJla 㖊ݿ}>|3g{׌4:`y>3 !ֻz闭M-|c=#G-->G> -b\ %&4u4: `[d\ q1tI!:`JC#~#OWI[/hFjY{h?=[+9 ㎗+^/C޿Ÿ>pGwlU"f)HiGM?LFTHN>M{8 e)COIbg`7r]A 99iRjoxʷ+Ђ;ھUQnXQ)V9;Skֿ|U3qy9'x2O<km8iiТߊ΁n&A8P`Y*l= QQ gE!$iV !RkT +4>^^D׍`ėc!b~o%l'XXSE9T(R#ԛJA'51=ՃnײWj[j"CW>h@~.(m{_SRlqJPpFE:J9ʞEQ]GЭse~ӱ?AT}E"RF, TdH3z3gǪaC'va{\ϴψzʛQE_yF Ee~v}_g~FJԿb$)ڟڃ.Nj'`GB6kIUjJL`L==cAB;t5.6zCvHnme~OW$&țLV!z՚+iDǽL7hW22+6 O͈*dc&~aI/VL%y/j n U34wMr::*dOuW婃]UX5q&Xq|ǣѨޥ !ɐ ա ,%ʕgCD-p"" |gܽECVZǼiyh9\NG $Lg2Z$*4?g.0 ǭS T ¡9%C)Ly Aд,= g~qgz{Wa+&)ouh{Y[;t{rbrgeecb=dluagrOODnRӴ,Mfz.S{O#=0,,;qPǮ>WxClh#>ˢ쇋9Ҹ$}N9mɞY޲(x WC Sӫ L;BSKB F|6(&(24>Ee=FLV+Qb2ҝQʃO+YrcNK^gmrl`ێ,~<*Z99dž{ݵ)_[qא0w3,r im®%PUn d^,O}N9:,ԩ`NdX-̯l^;ݜ)^P(j?XmkeLsgMD$s<3Ԃ|uD{>l-j1F9 ز|X7yטMfK6ʯrRuog&&v|v=_{<*4mQC)ܼעAe@:!鑨»FVPWeVsѼǮ@S2>ɇ!"ӛ䒚!jM}~cFA"#;I^]z wȰ=M.YJdinM\~Gqܳ+zOFt·߼zGn+v MYvR)BȘ50kI?ZQnjSlJ@d#oRZu̠ADw*1.xr#(q:Dn=BP15qFQL(EQiMa&?~7 HŲ'*?6Z%_It~s!@{n\6{ƅrYhKVSL‘3'v] { ]? 28b `p< !ʣ#GyF(Er +Ls3:v>(f\@q1J2cpE53$,䘖\xK8*l C+&KfV"vExTQM> bZ_Z7 [ ֠W7J 0E,!N536~zB,gs-=pXU|0i go/??Dhob{c׿:#=CaX-8@{hFfDOoD*و`NiA# *({qCZ/b F Ʃq E]R#L3^}"#4Xl_q!m-|q K zj5ĄIaX(?Z+JA[VzrԟUK]f{6[IGӒ@ޮnl`.XN84):G2HdG(砫A4i$B4E86\ ! 0 "P@8 k]ǚ/O:'ۉtɻMMsԱ Z;Ns ˋ#SV{3){҃)~z\YpoV*wA pgF"„FD(~AFf?wPXɫHAٱ9!U]?@lί6~W?^w UAkTN`ؒg7\JiB!!hbtF <³թ!x\]%N\9ElRWVL?}MKV!)zgi(2w{o >Rgy4_|@^z %Q3iӫ dDNF"]zEnLRFoawu7ոcIbJX#j!Qfq 7Ao\8%Ͻ8 c^V pR1$۟D9Lמ[]*Z=PNuY$ݼ tS@"F i-8+Qtf)mXkxR8vFO)8LP0nѠ 8!F)(iv^ ( XaE0~E'VYj2c楤 SB{rʐz9 <trMKBoЏփqX/Y Aˎ\xZ.mDY)Ԉ-o&"t]3on?@O UXD[tnSmZ7j2'BAUdeW #Lp":lH'(1( i:Z6eUssCAW~>yu`8kTisH$xǺD^fb+MU#Y,$ 3 > d^F4Fa`DUB <]:q&'%æ J%کmoCU|TZ- .[?H-fUԍQZb:Ar}5Z lPGO4lc"faèϪ" y? QTB*E$БMy",ҡw,H*tI@A+D7{"MBF eB@ȅNYDFOw.ϳe na';&ƬrC.u}SԝLj8~qzQƊp9N3%*-2 PhRǝ`l T$PmQ[V:NEmCu(Jc  0 PEhHPn:xQ`÷ijZEBTE'R/amy#B 3IT^J6M?DP.t9`W:~<|oڗˌIEvێ&=~ }NX>͡&HX' |G})(u)][x{Is}#xe*ĸ wvZv] z4׫NPdvFƶm7x[ 1E ^bY$ ަA,Aȵ ZJv uF%B:๛SklPXC(l. 2~wbS)Nl<^Z[s)놞LEĈ(Δ La7$ "5v|kÞodLY917OΒX2c꘽ 1=^iAF5z~niёSI-z͞dLK7c桘p+AY7ޥV%iB*2dK EK'.&Rt"fWE#WgQ]H$d"5jnUqxICǯ >tU^( d+_X7%I7~V?ت3jS B^{ዦi~ۙQu' <  +5erYϢNG~J}Ǐޣƛc֊D7N|O)Jsa_V8hi,'P|= g*D DR ao_+N;6>e:Uݦɀ sE+"&ͳSڎO4-/ktڗ6ʮ~5N FYk r zƚQ;ޒ*-Fuʭ,ն+!V_YҢ}PvUk^J^ i}$<6Q֭:$#\]#nzy/\)w.FWWJφ?ס'vʲvpҫ> 5p*!;1ԲmdCLf^~k6]-[:ʤ,^X?!~oٛagk&W:P oy%(PGĽgCQ)<+VW1-ȁ+P ]"#x)qE"kْ &{-={#ݯkY8P'5mŚ@Co,_n:QϣVIlI/,2?PWm%[4 ԯ6v_;KW^_@zIbk_M&;Uʃ~mʳHf7^,Ub,.)~W?.6/\#*~ pq˒45~ uoGeΪYRJQ[ qSWЂ̖ -K6Lrif_aK/NZ"@beַ1W1lkS/"*̃zu2gΩ+>[?ҋ/0kwԪlU ;eab+~S;e(Q|'̷-_!IT(SZ[(SH|rF̅}溰5 u.Ce۶Lv_'ԵeK`“wɒqIkH=]4i8]>P$ AXs1Yfl~M]kq|O\g6FwHUdb~A񄈿 -S#]֊,_Q]$T;bjh%i_ W~ŻEqץj5X2 .ʵye7}_ě릹&\"S&!!<2BOd}QCM'sw.b㑃V$gf] 7A@ HuGˤ/>"ku%{w=鬄$B@ !"ۄEP3ADDdMETD;- **(QYrsv|vͭSN`̬u4z>pO:aҘէnܺ_OyYC#:[1F ŖϏOd4>/Rwi}}j܍n㼍Ukn46m"D}>E ,48<!" ZmspB.!u%\ cZ{'| ug LQ^kUQNDei4 +tb=<>s|5 2$!#H~,-: b4@(!`-1I$h^aPޫEшj`Nu ٴGT>}r@ *{m{-'HUeWqw,KXLc[})הrEI&FBb I<)=Q^/굎D-BgkJytTv-Ubn^Ww:w*McGhSݰTl䅂Rb5 HILg{Y .yo<ܕZR2ڰRSJGThSuµ h1/xXH6zBbXLd.O \.Ɖ3u,._Ss]Xո<~ 6l̗`3[OZdQ@Xfc%_Y iae fX[T2[}M K~h:0uVM[pFPf&OU\quN|Ե7NUTTPb7:zsor]QQV6l9v#&R\qj=wƪu wZԢJ.Cm6lY9%*%ZMv\MN\\E8F5Rw_tY#p7)ZӸ9p,P82_07*҉5+VCGM!Ɔ )[nw!$2-x 1U :"/Ye6W/ 3߂ ?^o<=XߏxlS+z\=`*fsO-fO5Vt>VB;3#qxL6coV?+OQ,n8az`˔C02y< 06ēۯkȟ*FM T3K ,Ts)`yL$g$aDf +x/FM {H!%3 R~O͛|NKbgOݘ ~IJu-8yID_ n{AޅIł^m)5|6,&ׅ/<M^8q.nk/,% i* h"ivʄFn[Ai$`wBD|j J fo %0~MacCUE>y;NPyDV}orDlqx_Sg1_o~K'NUܐ&"Z?.{]ى2m|>mO]4{Ęk&p'Onl>G(O'>6y8z  [%[bUI )A"L%C3nCPbKI Hv.^FJixFzriFTc  wUcAa;̊2;yQ 3}VW0m%]w(s {W6 Z9Yw\&د{eޠ'ӷ0%;%@]gQ!S# 4&_"H;,De9[#i9)8P"\Nq"I91?mLR9{T&{ˮ1Z! y쥥O>kvk^1$ݪ<21(^p7cK,6LH/`3G&kePtKWpu,!Am/ud^ .=UkPiA$5߀8 xؔvQb9NY_䜥P/ӏ0n7=B+ !BF[&c>}bD\tv<',}R8I%aNsՆeKA* psKbr7Ǜs\b"="65Ϗ-PztfF)UalW [Ogǔ\'FBc_ujcho4v~`~nbGQv8[=RTD*Bǜ'ı>8 ǡPtԻlרcEpBUݜd5y).Q/F͕a%.z`TLa#ſ~q8 F5~2}  g&f6c0a4kaz֞OČӦGG `0ذhb!{f} ca(LvU>%I$/E!i~$KRA>ʦo“O!g @Hj!I酠,(ݞRW5Ul;cC͸4N߽VkOzD{]K"Q|RpjS8?z/ߺH<׈3 - e1"Kb$^ @L藎sF٨ǐIrJhNzt݋kƄShA6t Z/ G6@% ցmBbL`5 _ȏb{눜"Z"?7JHWBmE [QH ȫ.8o$r#C KuL.n _RL*p\bb4)mb?dQ{50s#/2NbTډdAH99knZO̎~oW $ n֋%5a^{U@ؕZ09A%Eؚ0IW~d2h7"٪Pl" A"5էŗ0~s"{:PrPѬiV SC@eIb];;2׬TDs?')R/rM&Zbc- E0.#cfIxjoXռ],dK"jD+gMf#d5;RLw3F6Rӯ nšg,"7fRzKruX?[JP צcO:*nӱz .oe6Rfˎi>K/W2t|Qٞx\" >(juiX\eΡo"kqREEZm(eD)ӜN*76Mtm)e Y*6!+$Ԁ_x ڥ4RHf“,|(g)`J\Á cnh+\%kO~cP@EχN5ln蛚˳e*t4f1`RU=R& f\Y1 @ړMVL?WiYE. 2?!% $K FR)#YjU}pq7YO>1@/R^ƹ ҫ?acySqu ~xzd@ܿF`D X~)œJ$Ӆ/ѫA¡0_8x/cķ' H7OdHRث*c)W۴Hƹ]j۶ߦCu 6Y_M0*Pq=\"Y,B"--p|_G}$]0i#Ʌ+>zк-zpi1qy,Dh)06 "uaFGC݊qPt^%%ƑV"iT w$ga`-JlI8Ӎ(-噵L(.s0xH[;2tLeMj8SjoVmR̒L^mr\" BՒ-@F]-\qNa$E;3C#ej G_ܭEl(-02ҌNI$$$JG24keqSOt$ض ~LE7ړ2l6ueyC :rC2 fw12>=38DV,-R_$䙗*BR:-Ikjo>%.)yL(=e1u^s辕W o3⅄;Zvjy:/*}c% iO$wńX]h}1)?XT  ԑe; aF;@2"uS?`2MdQ^Ѵh"#4R[IOgXGL`>r䧁˶3J,0OA[`s tyJYM0ʘ%(Bx ЗK׹3۝Lx)eSnQ2lBlgW΂(2x6 ,#Tw %єR]YXڲ)=A瞔 zˤ=EU r=TˠFA[@wӝ^{\]ΒYimK~V(}6 '\5q#9*f@ӼS?޽_O,nZx(ۍutײ ȓ)g\rx[Q\<3ABqPY/_q=@:̤:8 _U#e5\Ó>cjF9D.(G,516+"hB[f39< S "0ψ (@?xQ"~ipc_f^{#ڒcD!rAW`9HU #1je@2OT˭ )DLGE|<!'Him3%z}KUY;;qk.`[2r!(eiy3Dh~?0̝p̝PZ^B. ԃ|f(ܫay!a9"EDxrc w5 `T'xX[tg6 Ywyb9<@~;;@we""! F+p6掰|xҟ瞣\-B$ZIeq&<1r>rYaCs"0sd|H1 $zr\z'WXx4d{$\=Ҭ[6p:qmB  'Z)8pѫ-[.% Zp:.댿 (un_!0"KjUF~9M7֢E=ڗ6KuI,S{eY:@ 0NpUwǕ$: ӾZT,t(]oLȐ _,Zm |0$/gcC(, Ov4.Ğpk_ޕ*P#*'eaeTc腞bߦ)b#3ꄾ1p6t S]iMAT ,xg)%QJ,S@b/AGPh$_l-٣hdϧ~^]u's#Y20VVSF|"P;Q1z,xIҋ Lp /]08'^5ae(nÈe}>_o䝲]#.KZRiZvy}i`U}%18 lbg&Yf·([&4! 3FHf!)+GȏMA~z*j#`MJY*q=,dbQ1~d K ïCRq Scx Q~8~Wj-4j?/ѐtg YD/E@:Rux:TL1(ff2kI>); }i5|zQQC3^|g-mz7l ow~wnKC>=ʈ^5e|NϓNE:t<V-Kܹe6ԨT#*7s SpbWIiǦr̈́śNv\2n3Ox/*:6f6A~ބ0mpwQߤw K5o8sмZԼw wWTHxeٯMjԋ"VG(u/Nv%P4 W ʱ\T.mh*{Af\<t$@)!ɘ/?t2΄]q!cr“Y~a-q71BʸoVQA[?vσZQc '[~7xw+"ťm /JZ\b:SbN!>d'$t`EP9*?-= IK]'^QL1'+cEۉ7":^"ĒzC 0NHdq*o^?>y pox'c=q/j~l7i"8ɐ NH bhȟc- 1l#$䰥- ad% GCEC̩(J qN8=^ɂ! F"~-QBosHƶu>sj 53fq_p pa%*2L‰6I& 6I4&|/`H4PV`uwp -D9lvD8/-((< $@v' Ņ=zT6*-1}0v.|mP\DAV?7g\E/ָpiְ_q 'eӳ LCEIvs,X |DȋHtqg5pXKf$(Czn[f9ryiE\(I _sWʒ_hh+&8?c∝AM4 YQpZ#P%=7hDf x L&F X ]AP0ۡpyUB#p> 8;x۸ϹG#gmz?a[(X4Z4-KEs).*R0y:U!P(|5?XL~ϗNͷC~]K7?V~cMCQK& X'7Im', N W5RF9f'`ag͙&KspA%(|XWhQ35 /5TSY@ n{Tk'=w#A0N6C?ȯgYXWzHxzG~tfhIJ|d&Uh_LV,?zEY> eo~Vc}mq=@s(1}cvCЫTj{NO| b b* Nof?y;?~|ԥTqy9n\ &.* 5JN5H0f" ~c${SHx\5V\";zFkG>}t7|#4׹0XUk LJ]'gm ͔9 L}(ۇ v|pC{}@z ՛hoC "pr.嚠3G~Wwr=0>D%KHE:n2x%_F< n"h\OL Hէc(ɤl>̅(i8"c{kqV;7}f\ǹv}5( [r(QiM.q[&Xm R8H%$* /Fiƹ36xd %C)]F37ZΨk(^}yyt3%a9f>H5E\TԔXz'n$=lחRs,p{柧dp 1r$ڪ^O笖Y=%v{y?/O䧰.]0y7<-9ijTpNiă]!vK QwX;RB dc(e.gA7d3b ˼uPG$yˏe+F_IVs8J2)L0AfehX\CT: *D#=AL$6i I%ʵc̄[(J.[W!\ž[L e}-VFWW<=T*@PFahx֠WTt!=~nkp<`(.nǼ0[o<[8O|mm8VZuϵGޘp VJ1rFxO2MN] *v ڦrT5!i΍P&RA9F☀JubၛMLgBa=vFP 3_T >ua##;E`Sl$w|6&\QKd8c,k?ق/Nw5n`MQ Q(qRCܶ2"rG-Z9aԮ(fcO7K${Ha!_  I^(zQ%A|Vq_t&#-9<iOo;>}Ӭq{^,yuoyDGk'3X'Te(ѯ4 2o +B9uкr`w2/z)ɟY^*3%A87Mi7`7fɉjz!^)}3*k[ǂ' Ρ\8c/y"?sz ~8T ;yHuc~B_k9vVlQHQ''ߕ7O{ מ+/9q~dK ;7R.m XQ !6!ۄRb*,^ k@z%=KMYHY1w"TP+0Q鮶X`zPd(%kˡ redn&˓$@8/M0k@b '[wP|AyNl}xwYʇft)< 1yXq9Fcv,&)FP2I)@ S&^K _C +)liG& OœJ9LPC;jJkYyrr6}j1ؗ}Zkظ[gօ[boaa޾MuH] ^r% 'ԝ .iiDau,R8aD(f2~!~a"ܝALLyQ`F J5W#]PXiUgHX!EP\(:k& F S`t,F=$J^ 뾝}Hh4T~y]ᢩNek2j..zSn&MR+&M˔ON^CbAxaz /1x"AKxssy2CEF%$T='fYNj3tR0EH0hu|qLG1%v^p FxĢaeRm_&зÑ]G ,Vw kuVqxhㆍ+ =c4q5_Xs.ycZqzukW=399|cV!ꋉMg֏JH0XtHV:R&]7)e5>z<8F'_a|ӱ3b뛢}'waλOʽ ZF$Qt C:2SlBN$L"NKFصΝ561`5"#g>۠O$c(Σ4yd1H9?UlD^uհ#)z=w`fwtSi)8]5uMm?S ]6>}ӯ=ޝ)h,|陕GU&+ltu '^qAT:%D-rȠ'Æl3fp։jxyv va!qD,&]`jtDdꊼ7_,f}"ɂ5ƠػOϋqϽlZ{K{Woq R4G"_{b_P,S,xľGTp)K˞ B\ݴL ;|vXb.QD[ ^14IS@z/(/Q_zfWZ^>)3e'b7yl V@^6xz2atm\|iwsdTY:OU{<Qع %._3v3N_4 [PС ,;N^Ozwmڷb]DͺA^nlU}D4&p첎unU A:}iGiO76={Y-9^GB;^_$? ㆈoDw]sk\k޺&~޲v^[ey2Zox[گni_~mP Z{'#'}?ߪ}EλK!PE.ECP%HYFj"kU{R{<. ,{%،»NsW ^/z3~]\g ?5㈮C+jSoo[ұ#)NoQޡj /BIZlqdbsq gp̓m^ +O* Z>0cOۤد@"5`قBLPic W[S.DmXtWMn2}2JM>I5u6W^d  lzquk^vZmY-Fy|ׯ^!ҟ[p+ REː\@b- =}af™r Wov1!Z;{x5PU\j@Q0! !Di8pN5FG/^[{@n *=$4#E61{.ˎh|_CXmU9sߑ`ǬEj#KvR0fʵ2o琕ᓸ>=UdƊ#kp!{f}5 S*"@w b43> kc!1m C{_1.[Qօo?HX1=**Ƶ/D4L] UZ=$>F/D>q|/ߙo_,@||Xz<֩@h09303!=~ƖT|thenkf?aę{d\m]:-/+_&,y8vܺyS?5rsaUc 6vjVB3%""ƑR"Vƌ &(Q<<9 n dk94*W KǔYyFK3!?c~C}wTw;ho ;aL mF3Q\@Lȿ j6^XlD gqºN?bT~sqNX܉2d3Y eQT t3Sq5Tv?C(nv !oEpFaL k $%Tzj.NTR$1P,Eet\tAE)+ThOdC!ژgŋ#gݮ=iOv~rl1E:pwy@MjkW~tfGFɛ.~t׀w`P. :C#̛ѽs4B<)%'wQX%\p"$ f1Fyڙ~E 74EB BJ )-T$$4^yK-$ RR H?藧pTٓNykD@"IGd~'4 F(ʲ#L XWИBPQPٖm@d8Nƫ'g>^ů1OL_쏪Ë*2΄~qjG?PQcblLkRx Goӌ-ߥ'ޔau _t=_xshLcڊ $;g2i=֦'hw]WE5LjhVu"&J2S 2E+G+TvNSz߾hpӢCpw;ũG/Z'tRT*ڶy]Y;jsJTHySSIWxq[3YX<ѹ`iޘb,_4k#*' 85+D2͝q!"x_6Ao([+8ԛIJ0q1Mi>767Lz@.D6'%:Es yӫ̵NNQm'݅U5nBeWzvjW=ĉuQm'zf6㋉78q}_JaUדQ,ЌY$RLV|%؊|%aATRۗ=t)3HFy sI"V]񕭄zrUKF'V}F+Vv0;Ez4Ɨa$\2^krT8 ,/!8r8O˓`#yIk`8'ilQ4[g!*'?Gsh{Ugѥv;9KN48_UDy7/4lܨ~44 Ytq ^Uʄ ԓ8f ӃYB{'v:8H=}SM r8_1Iu8!.6z-50eA]q)*@|gq-lWB"eN>o~DP|i:`9`вUR3O)QUܹzZwۺeu,Uܢ1Wݴy%k0îmZo.OiBMn V &*sZ!L?簜h+=eB/}o p 62f-䉈Bgch8 +we~ߪ\rXA: BGҁ!P_A_$X } GaPY]0^?߹๕%Գ߉[EfzMYmS=<"ta!,p<)$ߏEe54Ԝ'Y==+vnH^&ӾD)l1r]Z^VneVRx#ꙧNyll棴>yT^+OGc"f6SNf>曌lۊZ_;@Pñׅe`ËE- ;}pG 's$44!Յqf>§jbQm6mXfs#[ӴBmfYiHfl, e&KulJLA2U$sȁ VN<͛5UO<߼̲lgD, XܯPS0`de yD!rNS=Sq#[iEx'gj Sy<Ìk9Ij8,<f[ WMî<}Wcw#t΃{}wC\7puWU] YEZ ؏IH T&N(qB1 ՛X'œi -<S9b4,Jb[ڗ49N7<3QTY]<_ƶs=v^b#쮓d+HanYF_挥1JiAEm^AHb83xq( xqOzgC},R@Ea9c2 pؔb;1im ZΞ&S(=F58p/ǿ]<)IW0 ' )קO\Uu+&{{E;NZs!ËUܰϴUh_v{jJnzR.Nt5ޜ׫9 |,_RpcV"K0 WW0CleqpDĹY (sæ}&:wQ$_nqq ЫYX3q3d^D(úzADž:ms>irk}P&_'kO5^34y&ִCA-B(ZD[szK i}Aj҇O]0b`]o氻mORۻ(GlL2F, Ws3(DQLcT %+eEr5Zy$j*@-Rlj K+kvAmӫ1c,ޔGi9We&duOHԎ O+-3/MĢP4E1=T̢,ӵ%?%ϬH>YXcܾ6}@eab{BYc*trH|R²;ut_پq"fL3XjՌ9Y| MmZ3`{] ɦT'J_C۶*hu/mcݵ[NonOjR|WJ"Dxlw+1m%vO+vUʒЗ l9ش<*a/#Rkƥʾd#~ju'; ש5˪~vY^ʡiPYvI"=JQJ]`MB]<=]-1k+{n抲C(] _*濱ĄOb>a5)%^n̷*#$1e@tg0c ʭचW(焲il۱|ƢݖPu%ġ'K{DIB\A_6k(u+ %ȑRmPYꋒyccG>]#-b.6omWU=DE F6[TB3D4#AM.joeMcfHfievO׷̚ 9~~ff5gg\ mB[C`l`0*>ha1E$?=P:XB4WRW"ZDQ)5Q"jE)aKoP3]h]+/}a|zx򕏈[ zf-hh8Czm5JBUso2r 0@j^lL]c_;hhwWxc8:b5%T;"92 +z`;aKzLag:xZU&2"%AH|#tGфD2)d{-']l#-[l-hi@MⲑařimgF>کoӶK 3NK/Db>Bưvl/a-=+ھ;}3\ln)-g$&&esh];g= x@_/-uk-͖wOOGwʲ,5?á$ T# ޟC혭FEos\ўI洖CSwgKN~X|cMw;aBrbr77O7N9)U6qtxDmҌU۝;c'č- )&ʾTaZ}v:%X4}0̸nrpɾ ,!;Rba{jgb5UFr!!C8mD\,kڄ77c#|_7?kp_$ltJ#)wGOܩ,iI? Pa\vA-G~Ƀq%E7qug[foҴQo#hWGcjʮ^ zTZC2K1C c]j{fAF)>sK|v1D>4#.$?klGĢMbDZ7G0SػtO?]頤W#e#ڤ&Hiq`94@طsI l@&޻{-2v6Mt10G`ncrs{ݟ$W20wm/v1/Hg}Xb}0lAd{^$BL1;pH2؛Q?gZx̣_&7p{vI 6vN^頒eR+b`t&\_-11LlxFC>@iKu8vnTsv-ܖ'sq%F.iʔYob.[ق5ah|u_0l[g 0w9#V be60&;|7Q86!?i=Ovs?(ϵ 8›KڂЯc]aK-_ ļ`5y}7[aK߱s̊G]ffk^gxэ+뒱Ӏ5!K2# eIoC^L4eF4s]"Do1#h@}RSo-,%uë45E]FDXm=Aȵ&6^kN>aOܘV3GM8,w@]~ T˕!Oy%/RLE0q< 8K\^ "-xLJҠ^C‚*F=?x;wrߊ%szumԍy^cڴA[F2}L9wi(>&0'V)΄E(eށ F3v٭ΙOT^@TԬ"0wh=C41WdQgD fiOD,n`tRDf͉W*fbBF̏I+^s>!+ij'e;ĖOsϓIr+?Q-J~08$hڡ_wĪm'V/`$U`\Y}zr,& qTC _ R5XAAڌA>٣`qݯ5m3oL_sч=;k}Ök͕Դۖsm1˾=? Ÿ7#X1"Z-Ycf ty0[!vP lz-cF-y9d&d[nɄV0\(l +{uS0l `8HXz;1񍐝FHן[zȖWZF=6l3&e멒;w?bU=oy-EϠg~ab], }P,F7a'3P1[38)7aHːjTϑnv,B冠 BƿVT6]3=go1kഔ7#- +W_4 4Y;Y.'/w7[U4􉽺{n76m}ڄy ͠n $.;d,_GVZ~FNa)\ypN:QRʿ$9zox6࿇ Z{ϳ/eJ~+ް&oGV+d֏L*!{W4ȰoGߒ<߬y4=Ow3/!߼X$/.#/d>PB^EzAA |mXEKL".denxC"/^mEyF^D^@Eyew)ʺH(J9'cv^o:/sf'KxW*X*a"%44) R)VA2 =)t^ /iY tW}EyBߥAe*'-e< :wt yҌr:K{Vk;IQE9e%Ql\{du6&h;Y3~7lk\ iY_َkM]C0"n&S1StVZWo{Q22cBV2!7xWTi K|"I1H?H4>@%r^.q_G]0-$YHƊ|?D]dDlBrn.UҴxW<6?^LMH ]fy&8͏z6" Yxo甔m[ L!C+?6|ƒ+Kei;T7*yEYn]Ad~2gƿU4SkAi-!,.ԍ$ʸbm;مbԻ$u`H[ܨOqƉ5&HXA_Z0TZ9HӤ̾zBDž>ySsh7xC/1-OvzGzDÿўa(Ct)68C4_L/"#C} YY@a'f =Ѿ~m!l3g zLX> b26 =-a } CpUZk ɨZ/xn[r~9FZr,G0eYRe^oޛd dc'UZ6#y8 _DIXGLWV,k=%d9KL6;mh?p3h` {3%WH6-.]kѐU?|zfyDl[iA6EZ@!?9l ">5k۴ctb.1_-|}> -ۯgR]_OеCf:qQO@f@c6wj xszu/*ꂚnueiuͧۺs{LOgϢ^>zz'O}_wE} 7ߺ-W~W6 &lpqBӄ&yR}&t~I'ݜԜRpvA+SOvO1yϔ))+4 SN-zAw=vdi75_>qzsӛ222r22dϸqmQ3g4OwO;_ܬY.ߓ|{> ^?j Z6^xscś~~t͗my>>[mmm׶ӓOܾuWOE<vS?irtiӳǪ347MΖ]|[=γ~K/=.w g/\sqţx>;݌ž~s?{iEotRӥ?]MMÛ\M)MM7]l|TV~s._>w+>85ǟ d'?|5jռeW^}꭫-}bא5k>ӀA눋hZ w9.ݍ@nFͱyrkzW+ 3mRn3I~VB"q`\Yg52r?S &/\.Z1砻lSJOO0UW&E|p2r |Ehh.)l>-aBA~|F-d'ON~ ?$o7<dېYrCΣr| }@%P*ot&!< +Y >".ؽ N3Lz7^:faCsiͧΥ"ZLK1>y|E8 t!..A$! 50>BW5t-]G t#Da18JOi>CwgnG>Gq t?}@zDi i UZOz OГ}h^W8*~F?O:~Eow/+ޤEo?п?Og maQg31/e>̗v̟gXG:@֙.+ƺ'z>/ǂY6 d`6lBYFpfe6"YfNu;fl cc8X"s$fY2{hX l bilKgYf,vd,e9,< X!cERVrV*Y~-fKR-g =f#l5[ֲul=6MQmaVƞdSl{dϰ]Yaϱyvb/jVjaV^fG+({ճcg;Niv`o-vγ "{c؇kb }®Ogw}̮/Wk }nM_o;~ff+kaN8sq7s ܏=luy»n;{^7~<@>Cxʇ<衇s+j<'rOn>' |"wT>Ow$Ƨt>g%|9B^!g=L^Ǚ)UEI٤Yg9<< x!KE`x:^+ydl#ϑ8y-ɷLV/U'T Jʫ*ۗ<0ITP2rqtϴ6M.TeXZBnei|jf"ǔV&Lʲ9Y*Z2 3M)S JMwg*O)(䉸TxtTx~YFsۤ KWP~ 4lъhG#Zp*>NqwSʩTrp*|u*\u*\u*\uuVk Qq(lo>y"Fa{e-c{C!FxQ<Ĩ#^=^ǫǫ+xx%xwW ?^+x;9~OP ?A'(~OP ?A'*Dҟ~OT ?Q᫶#Q'*D~w)|w)|w)|w)|wyQ.ŁKqRI$A Iq8HR$)$A@ʁ$~ORI ߭ ߭ ߭ ߭ ߭ ߭ ߭ ߭:~UǏ*ћV?ҪGZuHi#:~u#:~UǏV?ҪGZMM$-IT޷%nt7/t7/w%5~k<2222Rޠ2222_]mIƃ*|]Wïu_5~k< _xmIƃ*|]Wïu_5~k< _x$]Ae~*|]Wï]J.R)$]AUu}_~; _wUu}__wUu}%mz_tڎ ]vnDZ*S* *S*T *K5TJT * *SaյW_U>l_U[N;ndW+I,"aD 'Uc^㛻pwxZ)aEhŰAbXovkEY t% XhIU奒([jFQ6{.$["lVTb27# {Ha!Suѝ`P-KDP-2$2vԥT&* pv:#'x9A9!ȡ,ǖ`}H;L0zmiyҐ'5ӓ'9OʣQu=nlYa?ܷZw͎jM2竺f`WfnTz"\JLM$<˻lI#X}B5#JmBٝ5)^ޝw\m^CW=DHze3j6߬_ֻNnl4$61WJhW꽤ûjw6UxЦo};;40QM#y˾-k3[ֱOr)FǷUtl})7aseF61zmVo7{ ؽ}%2e4"Š˦V6tٟcVlSh|>3.g'ew0(Ёip QjP]ui#r &稙dڭZȩ4ZD_s(im2537 v[u֞[-ˇu\T4ٕiCjhvw~֡sI{lsɚUMݔgrl{Yo7ZȚ 3,ݶn1~o|Wwoړo0DY{Uoo3/PC&6}լ!rCsGjÌ~yˎI) TC^ EH fرZ)XÎڈ_Ml ^WzvEq\R `ktK^Uq ."OÐZ۱۬S=v~}֐ 2ANudďF$8*q*qUndܚ:!\2m}4VUl\uR LYzS6tx~ łn>Uی\\˺w\`&dXD)P;WYFP%sK)7TlZQKv3)+ܳz?;_ߌENj@Ap0Q0+qP_!%`JƫnDW~!X"TDNk>Χew[ 1(ԊIz<|Ɉ oCd-b )mfʲ4{mw UB^єӐsk!iY +rnKids4WF45jԹe!%{,^]SD[٭2/@p9AL]b2MtPk:cm;00כgɸ;Ԫ2 LFs$He?r\>M`tIvU'2ۏ6L|d$Ib: ?vyUґ,){ݯ10yq0Y\~f)՚i]12Y(:(ߡi@3.BY0u_˚*5T S&X Eu1'X#kJ%/,0.eYK+Ȱ1Ӫqp|9T)? fõil^׆}iHҊ}bl3&ʲ{5w=6@M0 n.!̾w*K^)OٝfOUjpAJVYĊaNcѥ^VߏMK|5, Mo\p#@]tc  ?SeYo,@^A=a5Q(Bz[D|ka~!2ahـi6u+ J &0EBY-?vlB H]Y:jtBܝ8c ǔmL2f l$`("g8@~ZbYpy#f7k`gE1BxKOOW?!(LmTn#CVi7 o&c*=E$7Ta4U IA`} n[!D1Á@钪kaJVp B)V yW -ToN󴲁VtTZVTLΑm`%z=A! bPaC2? ; Hu΀y>K󷧓\$;b}R n(9v4CićGڙ^>!TBq?+ݡ ?4vyoOg #Nbʙ zW_خ`3w[Gٳ/w}-0ID0+26EHXȮ;e ?olZ ^'7k$)-K(r'/kMvko _8Dz_gYwFhtQnNH*}EՃ*,HrњH[Z˺$< */Ht&RŞםUt 2ibFg)?yΦ}R @{X}W NSKºx1Pxj<=(8Si+ʏ[BϞ,"a +΋AA7IMƵտhU檠`3&"!lk8*wR02_1(($T) 5L)(JՒɍIH ZX%7%K'ϚjהPdjF=HdCb,2A\?!VCk{w5O.ʃձ Xi7NGASe쀿ȷG&9)KJ.N/ai|FәBT 2ӅmR)7uъ2 >IgeٳRSr}84p/U|ua"h*F¿IC">AIdLɇ &IJjx 6T DI:FJR䌅$PvBPP]%OM`#lL.e]܊PPW3 uxl"9q@XI"O)2{"-cTƕge ^zOV}X@$ZыFɁD7@+ O>U3q5Sq 9]Zg-ߜ,1E\e֦ bE3)qK< 4OTA~O ,VX1 r(!LV+a'RfB x>d4.&jͼy8Oz9Ix(nØ$3~/@5ڱpdT#Ȑ?RP~bb>Y[HdѼy$A^|6EIP!)Tк*UEBN'w n"(V= UH Ht'[D Bft I6)<]1"2LW(b~o xj j̚94#cOL,& ȭFV{0BnS=7m-嗎pG 0|K:Hbؗ1cE:#ZغO\ZjԓQ 4ЋZlxϾԾIAd>1'E>n>lȋԢEل.ʱc$"s.tH"c8 * 'aJHa fZJx٠:./2Hoеz e24c綨U'\ `  (zX$ha*#ſk,Y$i`Cid67' 0!dcF pMb.U\kn(@$OAld2 "GLo -]$8j#XLsYPuړuBui%xTh%vKRi/޹ fuRSt{%ˬ KA+W [ؗj $w@xLqf}]RQV*:-كlN 6!G=IX6^AS @ pFYsv%xj,ï)Ιo0md#8N [:Q̳)6BHA`8TZT>$RG]ڧf JX Lea\R9ѱ 7‡.`jQSX-@uF2QsqT~ dgdfs1˭aO\g!8ox߬@/&qtc݄VA gS?t1Q}(MB:i#d$afR Ls'/u T9 I,a43QɌοɠ? L(==(yRASHJla6-J8A5sÐ1D@_,Š99ALQ\_\Efn E0SG@+hJ ȷFrG`u5hibޠ:|pOmNLj"VOIWw |hcÅfÄqA@TmGpo($j^ku?8~ѐ:fڱZ'r06^#EAaŲSMV|Ҕh p)fhY0$VQ̂5`h-1s&U9xb$/A0 .JO8MDd\#C>goyp>6}# .1NHqK4 D \%c$6VY#мc}pbuAu0חaB2,1PY1pQi®|tH'ʒ/CuVqY b%^XCO2'1eP&oO9ۧ&E G^EFҧqЯZoP; mBQ#4^Z?D6\ubH,ċdI' C3 6wyѾ=]4f4u{X|@Yt$NTnQİmh.LA2"Y(;4b!~;{dW$4i B&7vv,BBl'$'Cb2TgW4)+Xz,(E" A" "'j"AJ|Yj na XzEؖ"kňkX/u껁l}k68*]555q줔D$"H'@G&$>[rٓ=*N FXq,kR5PXb/J*Zf{'pV3PVurT]W188؄+wavvq5q37h[YC _%Gd8G!Ta0PE3klhaI/?)xʩ2(܍f<)%RjӃҵ↮%n8,Vò'qWPMWP#gʋB Yg8A9"S7 k~෕5,N-LI LO4{Xu >CyQ{.5O1Ł:{:aGNˡfj:nD!ĄrS^_yٮߐ 'ZRb-8t$j1-քZ= VPQXV] t_Ғv?| K6w5g,D[+@@Mr1aPMCW=bi5K)Ie3 b _>]Iܣnf荠C4نʈ\D׎N(tJy: (l^q5864NҁflȠ#` "*̔yh2QvE1x(?gR\% S,ԎX:ij.Qwx-gRG 4UB7GS.EI!gT*nYqb˓{Уu=l[ԡ%mhYDKi7KwK ]!#}= ']k>0=HqҞ UrXd9Ф({O#l?alh̘wpJ3td.mW9`qk99iŇ"aTΘ6#Sys?WVҥa#ynw#gi>_ko5(gC1(13P%d- ]p &(<~q zG-cWH^F3uکvOR m_,c᳙b⼛xf/fpg3uͣ aiІ ;x4`i(XFA7`8XA{'VOk/fg>̩Ch# lj"K)q[Lf?5ۤi_p{w8!-A\)Vp#yYNOε~DR)pKIiH6XV{_8(>7Dr.%s`Ȳ n. xJzu}$/(8R8$"? ['<^N?f*f}N2c 1V9fvS&ympw$9ZDfh0S/)3<<9yȞg^LTx|7ȖJ*U*t ^Aח C,zU%5ֈmNBg+/ x;i3z5<ʃh3ѭœEPFsq1J_ͣ*C=7iGQhFz^qr.>I3mHN gʴ(@>? }K7Ӓl]c.Upϟ@g \;$M1tx 38T7E.+=C;'rdhTnNKE52,u:/[PHHԞFR5:ZIiQs2zŶLÑXqstXmOfˆYaZiAu,$agɳxTq*mC/˳s,K=!63h?jz:>%=1-|-C,jS{GCJ{yi{G/xb7P׮gm r}YlǃҢV+ rzi{K@CFg/ipNk>v߁t8>a:D\< DRNpԠqC\\zwnvd^dnb8 /D!V9J:)y,/po#s4ýLNJ_9!. x?QC UyFfh$/:Zpg7}0 ذZ>e4͚^3HnJGJpIr98 #vd)=٧]|]iD5#?m_G~=@O/S^nRsD1I*,8ƒn-' Ot C5Pw<)UŒգtvLXwDv[ξ=i wAmLxi;8=13X㓙\X6M;_VK{OZ|}" C:u0P?ƃ݌c剁'%Es]wxbpcJxc<'SfJl%L,/i2 rJsoK?Rk%‘QQ#B_{t9Z'k?I"(B<*{uvE&գO3)Hd/ְnRS}q}M]7ڞFՑv h%ŗ<;wڶGEЫ+Ƥ(Xr]s-X)R_fɀˌF-yuíѧr<pt5ǗP$&[:nO: x qO92%/gj5{?דrY?ՅYȜ/x Mج(u9CϱS}fQ0vtr9Š7.߻]FҔ`CcQՖ%& UNRCt0P^:Tכ.MՒjÈ0$Єk`b("TÁ=DK96j*{$}X0-fq@j}$!SboBt#*N $Mcb!69*(nݬ2; \|AD@P0퓴efN|VM{)=b͛G#(!$n8qfzʣ}PmkSZlYy!)㘛iJlxHV|r0G)jJMkxi*ZS D5!,[:d[>+sM7mSH1(4E䱭h;zML( ބ<_aJ9y|Ocי_,wiq/|C#:p1Ն TMpef_LR[_ *p'*-3FkiOWe|3ụ GqQK]iSI-=]]C9^S\+g:E7nSQ N'*2_N`%PM0\Oʣɴ6CzF -r!;ghz2vS("& Új5p5 L <4n 5w<+2ы%LW)G-pꁐ no~gR" 9OB+j$ !(K D^0{NF !3[9yVNY:]P7LSA]>z]j*?#j~j/_zTՈf^kf@/tgbh%UOīPo*zDw&|X"BT$t($Tv`r dę:o֞FN֋52XQĥ5:; fT(fRX2JG&ќ叿sa)U3P!b('9n}iiq.B<f;<:;z|{_[=ǬoR8qIwEQɈmTfŀJw\* PVO |dמ;11q?k{071p<9gؗfڝ-}(ڻ7C9dW:Lj畧؟bHt2M>I`:P ImO0Ņ$_4 f`̈.¼bkDQ*l㟁@ty-Ȅcuz̓Ldi$ <U>? F#BJ/ق 㪴l*!閑YbQޑ(I#(#m/+)opLkzM $mw7 iV*DI6}qzXldHt_'KAM$~s0ym:DD+9\f^0H"6dG.Fѱ{$c`A5P`Oi!>]:L8$r)]'2d<ɪpz4YHѓU?!/UсzzPO ?S!<@};H0AUc:f&:LXl65ܽ|YI<əG3H癩64K!Yj W<^=dcMg |ŠN*,˛:g%&ëܛiӟdkf (a"hqE7Dlv`i@Qbtj[@`Ty6CK〫5ЈJKC:!5mW|}oE~idøK c4-ԑxދɭIHΜ ;p;sau9W6#bQ՚0'ij#]ͩ:2p>)ՑwxrmO ղ<۾~P klj O63ȾBa ?]PnұBq [A,'VbyY7z)R< Lޣ>S )k`V8X=LF]?IW5b" z9e3wOכIFP݆=LgI`ʡ6_(kVuI@Q[?T.ɔ`qJD&^r3g/b ;t|LR.3]z ]V3?3t8In&W#'QIui(̜(8YDLduӏzo_lx3W~.ʘ3!KY;+9Xtf=d){.Yx_xr'3eh[mE2}/RH?gWg]s`J5l 4c0$'oL.5I$;9GoͲnݦaZ/ahкfl{$֍F bɡ35/3»{.Hg;NjxT8^{NLŦ%xPm!4BB%+f H3sQ}`jXP;hƁ"P|hy,RߦC&-3ZdG'3`V1i9g04̲3  sW 眄}# $Ž,@nNJ1}\SR1ĆQT9<FK **v%H@2_9`l|`J )H76{9@KJtɩ|3䉼0h͚i6zN=ph`$g8͐'|7,igh1뤧 F>=kн>^:ȬctɍO"dFSN<Όg,=4],=6|N{nЧ}bbljAn9>1=[';t m W{]i+68C8&PmB}ii|]z&~+$jʱ"'0hv„X 5zg}us ztQ9`"#H )⳴ ΀;i""`8q-tT\'G1m~]>Vby9=pE]:{ .-LgʱlNʋImq~s,o= y#F]l3Z!>k[e-E2F$GNmld QTb&"\UpXc]Z/!zr];_t_< Ȼ="6ް2RxE84MhR)i`xzeOZᴘ'Az=_7Z<_65tXpzWP7 tCj E7ߌxow͠M3[ gÚCvJl]ׄr!(jo*7*ĻhT=;Jq t*qWQ'E9o;F̢Kb&hb&Ie1h:6O\@FׇKpoeM ^℞!?*^ ['sQ 4X@>^n\Gs  \bSaZn;&rL_FzT෴Xfj-2N @ b LJW'hXn9C#QŜI-l-exV{&EAKg1ngu46{Ѱj3Ƈ'A6U |]0&/fryt;1(x21?V4䵭TY̘ jN la:Oֹ2{\m8:JbH>mdlECagi֠mS0c؟Z>eGdrN'e?f@ƽkx=㙄dIR7Ub$5'^{t^KcO^KO PDfR^Š^%"j0 M9Lqڜ!@>cÄ3 &ǿ(vh#UACQEY-()&<@j >DNE,JOGΐ/Pi$2z[ ";1Gm}YS‰Ik˳D}\2E'^D/fcZ3 Eo2-m2-O<̱/}Q>F O&v7_4+vj}/Qs,le2vij˫nI17[`"Gd'yE) H3Nn_ЯA-uy4]/Z"fQ?̠/}:+Y4H+zR!*)Gd=7t0jHߴetlho'0BSE++ %3?4|Kw~ f Cil &g_AV/Hh<K 1z%TNnje$kIgS[bڤ@i5[Syv1~PO@[/(XgINv.1隦vX-hs7u\`Um %Ƒ(^{JI(ėTap tZpπ!ݒTd@P`O4LQ+ 15 J8Hafp? SmPۥF]]wNAt] hc&P)e=R!(Ъd^Hz .kX0dt!QaT՜Nּ!\ݴ0 'l-j>Y&?|;Z2 *=RT/l[ht]_Z_ZN%W;rHHDM{xƈa}O=[CDOZ6q)54 郮Ao}qVQ9EzތIAvpݘ5Ŗ!䀱]}K_${!c=2۟PN@ t[!Q&0ѥ"insZVV>.Oi46ʧj|?KUkMtZSohxڀѮG2RtmzL4NuKHk%da^fiYS3Lcz7FdJ$t^"fڤO_3̀=4nP~,(qD$^hY^Thv->[,{?anUǡB wS])sd aw.}A&/R2Y ֍-RRH] R}Vxˈߘhy >hE5#MЇvȖa#TR^8WP-4Vlކ?͞bqa#c/)eE,KNq)D*+xajVёi:BX, ӂ8 cnM>* 2& @N)d,cUgRR@,sYA=L/_֏$?ϬLϊ#f,4 (C0 ){Y\#2N t=W1m,imL\4 VyZA_&-s9P#05!fπͨCz$GئO 91 BqJġjP3|ʥE#y7]Zeƞk0r| hn~ɺgt4MyGb8Wl47[dVDNCxʔGpK>ze1ǃ%m;RPVH!%(м-Q(bd"2:9ez< qަ&L'DlC]* 5&y$XmH @+FZ :O+\׀Sm9ocu'ځ# gkF/23|Ng3$VCkx 1hb*@"vyL |M;^$CL~L@/jQ*[ڴL|a@N:n۬%(W[%A/ݍ++4W.Sخy.;\)MQ\͠LjNg:|$g{˜*nL0ud689{8G eoZ9d5. eO]7`>ϘTzP1eus|8z*~CĦ$A08m3)y8d0, 1%؁ 0״dU!.Bj"K~3S oGLM~pҽMiִ 5F =ϛ$L#Qyך9nE}V\y= zhy`E_F( <#i4 >@v$EÅ-Ng,c4CSj%v ˒.O9n4brmڒEaʊIBWB<tcX]i8a_Gcy[b&[;BW΢N"sJ"?TF0==a')@ Daݔ! X0"Rr׊u38ʐ|N uEfSC E@EY6$ltN+ivfTHg=Gte_fgx@G ۝RyRbo]ږ['bʫ"a'K)ݝV#fFDz^H=5FOvzⰽ,㤯xR<àit XGk-|Mb?x+_h&F3Q%EW ul`7w,'5|śscH-f2sD4$oZ'X:a!K2 _gGhz eec|W\=w_4v`%=ވΝD`n%JdN泄R`7 wj=C#% 8Vn@řv<\#8kT%ض`3]|~hm5eh i&%g%oN"R+ IEtЉI3RC+a樫x,N:k4=h͏$X;sPdm̀`ΤO{6Sg@ohlRZKZN3sc @*﨩b7Vv&UU0?.B /;> TSlH">ʭ~97nfT|Bl1H Es}p:{J*ajqB 86aEwf㔇}ʊLǀǁϠ$l3QcFTV*_Ρ"RD"/W(FxYZCR%;Q׊`hN V V Œ%PJ0WɄ  mC`Y<ɒm69 aHx~n ՙ{`C 1RXoE׬gC8gP-w Gϓ- ,<6/M(_jF=OEO:rYv Ա:vg0SlH3 |+? AtQ]M4NI4=V$!NZco-'Bc|L8PHBy 5g)%D $3f ҩCo ܶV'4f< ɒ!Ք)5`cks;~޳Ks7 b*ܦ4u0y$xOSԟS4PiED?-T!x{N[ 5=&:>޲3Ɉ"a)BTy˵aV3n8I≓#A i{v䭱0EI~t59㜹Ǚ.1(pxKp!/q87l-g^D M&PI>R?g X<"?=+HQb!KW(ǝIr\ $ JriS ck:Z$M7P'H wfMb|rABp,9ˇ'HQHLht,i(B8l1*C`Γn8 E!/dI)07j yEcܒ#FHxCv$n>HdH Z;l7φl()zdcg:!2Nahpƒeo]r9V I 7ahDC׫=#+ 7` #ٮb#UxLZؘe9Q REp|יC~ds$35^FM^ߞ  9͚OJ"}lEp rވHԃf)P3s} >,h)µI3ch,k͈`ݪrTɽ6+ =pmV#)EL*VfmDb ebp#A4Т(g'-&=vy ̖W#JZ:{f1ޠ aݝE,c1ЉGԷe1u[NUFP;|{[6OU9|~oܥZ'iJ/ 0GZuo6q<@ǡThrw,WɀU6Bq"?4Pdâ1F5)QH1fdd}='U#ݧķ>9S ۮZޢ?•.Pt6gύc] XFb"MN%OR&gGw T,; zcHIN ᢙecms:/ gˣgl`:ޔec7i7-n%@3?oSyc,N1>K}dEayb;%S?\l1/: u+@~(:X,< F/#rO4E+)Ckਖ7[ԅj9D̥OAur L1d[ϑ 9C y|&o^[쳏e3*X7\}jKE8T{y36E vyQT #؏mb:cb6j mF>h܊6`_W)kZZYҒ"}t^{$I$ Q,'$YwU0[Jg$NɚwRkm Aߍȴrk6#(mjk'"@kM4*~^-ƞ:" ZC.=x Rp 1w."7#x%q~߻X|U!xFlLi!C\q1{z+Ba} @V; 'rnֵa!WI $'OLTd7@ mD{_"אv6Q E-wT* bX0(^ j._rT gBp:#2 ohQI1ԥH}BԸD,= Ir"n91mlSd͹PAKd a !BD-zDiZg찑v.MOqY!dRTPj=q{Mۈ5c*PlVC؄ > 81dĐI6R 'IR%Id^RiJ  9zSHM]o%5KWK>Y1aJ@~i gH1fe@8 h|J7lqkf(#dJݤFГ`G47z]m`GIn;b1,1UK-#>-M5[t߹w >p t )|pCm/"i~ko@r?,b(F bf)B_%WahEKf\ brň$gNfK($8 i,=NrRZaih F$oPʓzLyO?02k~:k}lv̑D;4Ðё%nq`1J!FIb=[h/×U[Z@E0݋`R=JHSv0+Lr6*(]DE& gl'HiZ{1N/sf&D![DyWL!4BxǏT<`\pƋ'1Qu|z--PP5턯rIGTƅWz\gRޖlڴcNy!aj]-a mnKD*%C21?lBa P1X7+ wx6xrxQAX g'U4 AGtHW!QH0Η0~aA 0ޟ:YW; XA>1OUۤB\xJHP6[f1mce=;<gp48ÄKg_-0 0u_j-pe &7,+ w4uJg\^G$C=}W.rΥ&O@uq!>$@ݏr{m ~b.NKENpzxNLe2/d:JpWFJH{olfN2b4M@2KoI,:>nu7+ ۳O_$kCGAG@1sc(-ڒ%_XdU5טc\e%7;2@!!:칿~ȑj8P ,Ԋ^+`Vmxd2dS6ZFNZ)LGd8qzŃ!NX6=!Uj*+xӸTJ 26~ulĩlSl<8tyn =~uUӂ3qJ,:u@ eHFUbV/:TNW#s@9us~@G] h269LLI="?ܗ # NC \HмI.ٶHf~Y{i f٣nMP7vEwH& `y79pV Om7U f~ ( AqO/Vi{rXtdKiv0qKC)*-5X/t"_L =KgmZg{,yo8 s(o G>w.SKWիcC!.3^]q0bC9ǜehx`˥C?6BM:\94 7I?]2ھ>%wp2S|ԵkGUr[qa!‘M &{Gc4'q~0j0\SMǟwe+7V# 2H-QZrV&Ñrj9`xORyḆxYȧ#a2tSv)vx ivfkiԢu7.Y&_h}QH(jveK)?$q 5Q)h}|epY1K@ tw RBy l}i`5A7OL1=Mzdi&("`FSP&dtc;7UaeEf<Gf2z#v8SiHaτq2kn1O(TXoROwAa 9[h˼7ǂYqLRh#Rws<.-ʜ[Clq02i:9mon?`.p4&pXHF04x;V*>]}" ǚB@bG XQe^+Lz<'svp.1}, F!c &V=AKv4D ć̑| o 3a'(j$Ϡ)^^hӋIJ.柣@Y,U;@ZO6ޗU13KMֱǤ4 ,? ,sA諚*q] vQ<>s>seOv( {Wr Ot<~Gm Qgai:aWNoWnBL'(ĻmZ}oyAg Ϗf9wC{\s۝v|X yǷR:Iڏ AC壔X(I'Sqy]GTME9 X1Qq\6 E3w.b.V]WM5 ѪfMw݅NX?@xϔkŀPz㜕Fc,!Ԙ/.=<4M4*$PsD?2"%\ ]n^{H9WDJ] {,<ƶSNטj&HO}؉k7iԣM= tM}}AjE2tքfkęƛQV:]CY{MA P WsWcfʉ8;*N[zTpp:t瀻Fi}=ej6,Ґ!7-ajJmW<{U_UwW\47gMUnBHciIo TU;CE¼uP.;j-lv y5vʍO7 +Vq]%YخIu,GnOTtMoQ$}WɻCys[y1t uW?(^l_t+;TCgW pC 9 ͤ/^*w_ݣg/Z$" i^>ο Ltt›>pmrKy~ŸUbdP}kv̷޸mDgWݟPaUlѬ+Z_cԘ)~aB4r.6|,ih/*UT;ݟc??~v0m>GV:i<C5 ΗS\!gm εD›DvxiUo5*\ O1VW r|ҙ31xL*?ݾ]3X[ҽgwFLuclHWPJeSPkC毹!z>ئd:,"Sz~! o+.TrR+&Fmu0ُ::ʼ1}ׅ+QrDUKp‹ঞߨ}j.Smt\v|{A2x6cbD66{B[N TMM\ߚtU;ЪBW/RnIA0T kh+lj!\u˾w'X_bUm>>_'ۛCgܡ o2+'5H1<ܯSEF4 V;]4LHnpMCWB>LsBo|Ձ340dR&f;s/'L:W֯cC8wX2D 8 Vr WiJo 5D?2We9QB6V~b?L"fz,:LB/RaA@/?yӶ탰?T!ժwl-4\ǐ>D<6'PKP(\p]_*_q6!|\xeSav$2nlEWeP)nSŬY@E?k)ܰozVLV[|v%s˚'<&2~Hp峙)S'?D r~KP RwtG u%yA^ڄ>a!u/Mڕ]d׳2paOX Wֻ}Tr8mLZ.J\jdNUŔ "k!fQ^3mX ,`NA//~ pmll{+>xxΗ]AL'W`˓?aSQ=>arg1MEBq 1^(q^h Dʱǻ} +>tπ[D(~x]{&.zW[(:]NW3 Kj>C)uƔcl|Q'7+_Vګkp5+1aMtVD5qJPn94{T[^t;2LL!&{G^# &Ի0 ]HS+wJAlFvҿBM$I5!>7E~33[shʱccif.'?>9D5.W_5)'[Ώ5{j4PQyǞrS+[d3 ucy+ a6ՋDK׎4ul^ЗjUT011[9R(Z4N3D0r :i\8=ȭ v;7#.ßt9;?1$^e zJhy9L6Zkjg-ԆPẸ'@{w&ħ(7fM9rݼU^GL}hYMxExڞ1nMO6;*x!dneɆv\mvMzgQ䫣/u4m簏kNur`j0z%uQ&qGۄhD2wPA%.k5礑y=JI{"S{~x \mA,=x HY]u}H,ܞ3\Q=ɷB8 ۘ2d0ܜ{!8%EU{yU vX fY=T5țk%F1#NDOY  /QVΟz 2 lC1O8VouT>62Pd|8i)ҕ4yd쪒O;\zy{i.OdM|LzF}Yה֥6e>:h$h S5 OY6ƭeF~NIQ"+ "4r"^),}% ̝ k=-+,(TU;bFӓJV|OQI>Gþpz2 0i^SACWqqef_Ķ6 U5z0\%CVK2g[pQeɢZ9d֑;PS#pCQ=nGr5-Qy/ +T _{@|f[kX]e^\sS_<ܙz!X7FGOS?}Ʋ F@CA ఇ'i}첸ΕUZ&nvMlDŽ.B44hOt4šƾWS1bjmAR+wp]ҝbxL"q4=q١X(~d?IwGܬAu!kpv 6rl?fI=$Ȇs$}p=zjCP8GEZlKjq~QB\Ai(Zm, bqN/] ݾ=x!rnAGqy)?&w̄VCiCi:"gnWz3\9GBBgl9NJ[[Űc&"a*g$Yۄ["+$,ޚaߝLпe㘰ztfl&)qz{F v}>F e#fg R!F@AHB<@XB%Xsr&Ȇ-XOq,qcc{4L6sJP 690[=(ɝa@EBE2X2ӎۯ I,c}%|q:p F&g9N~Bpă)#Vg-)PW{[AG1 /؊y>Ύ]cZ.(ZW5L&r6Y1מ<}CMU607Y8^ X% B+T9 |H|Ŷ֦-2G]ՕLCfl7.p(5a*`I{{ϥp\¹͌+p]qB>>ɥzZkOQpAO!G#IcDZ|c`oc/jtzؖy~,{3ajKS-'+BI-G-7C2i5QnPNvL%GȪfCAwȂHRL7(3Wftm67D/\W(y R r}ڙMWΩktHƼOꎉ_tFՙt$YpX ̼s\ޓI6gE 4$e8Yj g+Q>UN)js1Q0 W+jR H:?h&=}Fjm_~fa8EH8𩤤E^`k߃Ēv 0(BiRlJSxjVrIGl2n2GK&4Mv#x2Ze^UI +:nxj ?l)| zrs;ᶧ>Н5sm53/ۂAa$$>X3*jGXʇ/V]9xCX|wꈉ٤ܺ*}YR٭[_%aCBU2b >(fy{JqJ/eYƠE|pߧ5Ut@"-Ǚ'񻬽ZהYc U̦nWgu.@+U\oI1Aςli!9V|)nkwOc kCudV۳Si-҄+fS{ͦ7YL'ے)tBajY/\cnjTz0xPR`I;µ8s#9!e'p=;8aŏr7l4 (h3qPgg%4g~\eS5>B[ 7'+~ϐ~?,{ i8c\s#WUWQw^g73JB(7GR$|dV29 P{h~Û1a0E$P.W{vGjaZ=v*Q ʖ~0VE^F+H#5@*z`}TtW9u O{Y'ߡ⳺w3 PHjy0e +Ny:\z{'DXt0IAȒO[7ԗ|GEqf#/[R+7(;sK6$*nT(NTN讂OӁ5'% pw%,cMOٍznm*2J ^xXyNzR~Z}]ㅃw9WEV- Z%wي-2~HPtxV;H</VdXtzRrn&;g-r4_#8>.[Z/d=|z؀B[qEGn{0l#(2 Ϡadmľegs5tp=TfW"Y F98=~.P@,m3+D~(wRҹRxr t§1yt4'Dj$ R=`(PX6 ā7~1|h"\G̔"64x+;R/[4)DkE-eƬz+ȭ3bpHi\n$1qAբ_ş`Uvxȷec+#YYҕxOh^,PIRW^s0K)mVM^NVZ pZnuy#&!3ʁuMB~a6f }slR O`g}|սnf1wz/)&O4c;Y,kEch-&|"̏5'>∁\__F?`Iq# Ƒ{Cd KK ޯ9.md! 9ds`D%HT[Z `w$!Q'r5CdKu@^jLYxxw%l~’Ygюs!:8.=-HP&Ż-O6c/gҔkR͵紽G*a_ogʼn0ҬUT2!Y1T +fǴ.\\J_w1} %AGųm+FD;\2@)@)4O!- Y ޽Rs͐}\5gh Ck7Xw,˥[_lf9Gfam\_8CE.SN#W.|P؎(Q皅3BmYȷM4}U|FKhjs|𘓱>] ?L'b<xfw8;3ca?չ~! 6\H*Џ8z43v+Y8E3EsSxnOvzbƷ!86s~sDJIQ.vsF(FziI\fzs:Y_bxDuetCFO޲qmx6yөmER>έ[97 }:ߧ%NT‰\Z{%WJja_u+ }B]SOM(g`z-Sek񉁴:'C" Cc(̎|wwFfCM̿S+<g^:|C D7${t2OK Sx0'Ѳ/,Q5rvX0R@|YNaOQ?=xv+K'>R/ rt ;0cqs $U`e/ƭkv\>;Gċ{|fumJxK6]3 \8%Qf,9+/0aWq"6]=hN $H9g$8쓞륮& Y̋g:MkNND ΅'޼kj L(Iv O: 2q+z𰶨EaRX2o|pK] t]^V9&{ Mʖ3-E2 )BTsBY{M»n@b oE( =Ha1a}Jݺly6Ñ0BAmt e )v_qa}h%rM! tעN\*J`jZowOm l5a gN(5Gb~v=En4HnP5ͷk0lkm}vl8ga.bV(1&2dρz-UtZ]ބ3q012;5\X4+Ah{]}TT$J <(׺yX(lY˰+3I^ͥ%ϔJ#nBz8uNQ 0AW wtIyS2BcoZ><b<>in&3#xwBΗ%Abqw2 )Ӣǜ :de;*`]v0e1}m2eLQr! XvhɫLbr87W>{k狞E_؀4Y?jtK/WQtr6^bCZAyp`RdAR6PrVW-1'5`V%o2[%Y䵎%sB1"qGAc4xW͛Kj.r3p?eud 9=s٤3SteTrjXQɸT 2k-8w3b=hqc^'^<o=a.gV;NJqV r`Vx0_e7ƿ:\S75z}{?q<֏q 3_ިc3`p ~lO.,=G|jqGQs@9PPf@G$r6ǩ|K۟w\n G/O?~d^v]鑋%6S;.@!PiD3D}%޽&Lѥ9{ew}6(W*| iP6?g@ d2H"ns{A[Ė-f^~ ?ژ6h Mʫe3)MSe t=_QACSqLO5%u} W3:c {LօiXL2rAabk*Kv%B62˞!ڴuOeqeOw +Kem""&Sm`0bhٚrX_45_a x = lפBq /[=xgЩ ݝb9d4#+c?tNX`' zBZ&8lA vh!duN̖J 4rX: {x 6M4b.4Q!13! 7㕞gGrrDKi?!Mk *OE< 0^6@P9*v3Y$;#SϷE ǫ?nݶ,) [gV5ʊfsqO| ̋yDw|pEX^Iz]l\ pU&RAn3E(I A*4U3|+~܊ǷΙ'6/ k)b[ `sGM9#S,rZ $G6FD!)Nԭ02?T1gmLjJR-i"s#vj۰TXU/6 U.mƲM}1<{U5 ^S1C{6~fQ~j*i&SMpR\ K{ZLj+ۼ_{ o?ʗ\hQ1CWVĉ LE*[8|Si7/$¶Ȣ5#w%o`4V[fnV-$d0CsEDgfћw79WY _ =Fť#ѸUlU=3;Mʾc*9W˧}6!AX2;jrZtA毞`)6|Se(8[܊eNhFJڢ50G؇kg̤6N(im[2w Q#jXUqŝ}VN5'͐ ?]cr]E|ۗVjSn3gׇ֝@ ѵKq dZ_CϬȉuvæY c*l-uG,';OCVq8y`8vСs_|ObmRx>Fq?-_JNN%J\U׼,%}xi mw7g*䅭M0uOɵX}^L8@Ow(F(,C,) kQp1k^&F(.+"wz7ZsWPOruiN=BVW#C+ʙ+z) EJzmOyaxR#8U ˱6+J,m[p^Ih~G R7e&v d1Ufu|v6|{㾪}>Ϝrc3Hlj ziQYaTN֢25O_Px:)4RB@V -fZزf|^vt6Ǥ :7W6#O$='m`WlB`օfwBn|b'^duǑiBHRof}mgɁ: eIVV݀E G%M+a՜8]DU>yTTM> uEqpatA\I (\b*ou&{uaYY"OBSe2+y/ZWz~⌚ M*(~T&ݸS٬px'OifՅgQ&@`i4CVyDWSILbFw%_yEjmK5O[1J!l<,g|OȠ HDA{V50 c%;Y&t~nZԒuHw3:Ru6seQy?w J;r;he^ ޫ R"8ly(L/%'qL65|팅Ѫ+"Zo#jw]7~~qrb:W7\kcG3L讍F\9hkڗwp}Ik/&3k70|sKQ7.SF8%)gu>,X\LK!<5aR pS/{DY¹[3{.꠶ H{y%߃4Xr4b3{ O6`,u >O\~F$&JQxj;qZtc|mû7 I#-Λ_i/غ'ԛy<>noF$Xi=Vo ^Yz p l[s7"Tb6hkjv!Ϝk=D,\?ݏqD\H S8YlNF#ҝSatswJ6 ytLheC  ~}J/ EHGn6(0itz8WG+Y7|̬k%klWN,: k>dkW!) 9\Q e 9ݟа}#R|=j#cC&|$FfKz=ؒ<)hQkS}m}sķ[YxB)Kbޙ4[ʑQ _9ypgڇ_tҹgJ ޚȖN4%~'hCAٛO(>׻?_ uM+] dePiFg5Sɤ=(b\4n/ |pQ: UXݙ p>[ct^ z4F^j|RPf G9v1hvxAc G[TѮMKcɇ;a{>%8U`%9ELH!uF46=}yJ\: #ȕ2yE$Us>mn]Yo qiv0VKgr|_ʋ6ͦ*cS1hFi.xsj89Xx}}婊% WJ9d*K3601J.ca>ayڃ&˴N% ue'f]-c=ߝ}fU5@.-|$ b%~Ϡ \&Jy)<;oa3ESY(3Jd(=Grp9UJt v֜f|X gWnj^_A^.5j 7%iqypkx 3{G5[qZ`PdX(ET<5jK7s`&9mݼ1jn[ 3.4u8R˥?cKZ!И6sb;:^.wVv`{4 _qFjCL\a)f5ulPޙA-Ia!+8?w&ip(@x"I7 ؔ xq.\P%FCĘWǴqsx:T0$NUݾ?8 =>rF5ф.ӶvŲͳ`a$bIfH 5m;LN4aj]yfȼ uדMAZۋQx"^bxj'< {C#ceT18cu . yod &R&qnБC6RsvoE9:1 9OnsG!3E?_Q:{IJWDz֮ƽ ȷ!YA>'j_"4EA0$ۅWO$-sϚ:.H |AQ(34k=s 0l]3Zf<@W$UݎF3!L cǏ_++c#ݍ h ep/-0Lܪsf\WUWq{R}VJN]i̺D#GZJetEzx bsz(,dd8Lo)h [j&^˫!:յ_D=LYwBT u )u_\a]l*)Վ"fr+73by?_Lܭ|#TD#a 68~+41drd'/A:#.]2un򸥟[bm>!6j>X=&$@n{e_5k,tkZRRaBJcW$$ E%!T|ltvꓢ%652@ޯׇ'ɝ@hNkp^`#ZC#b5hD6F.|9!ϩ| %e< ܝA8ɩi j?IM*<4}v #U+[9,ÿAgjˌ <ޠǯ Rb`8Q]@mW_ck2L)*cXD)tQ]@5ZPKjkT m4tF֟hy夐 x6=6fqe;KF "T f6 yK\ ,6WտRW LMMUU*I28Zב(Iہ;bїqUQpr_>=rhR` Ye!mYR!qW;W`Yٚ Tȕl(3;S]ٳ9vcCS^6DU^"CҘĠՐG0(b]#ģژ@ɴDGVdbsuQX<:|[$Xb:IelI)'ioI:oPyl$ۆWsL}kKcy@ւ_Dཆ)=vxXm()_d|K[Ҽ'R2+ePqM1:. %S=^VV59 ۼ)mmՎNOxa$!F@?dBnΤ &x;HAtGp6C+])l\'|)qMVN}RlEWZOhHw "  _nx5 gC*Ƕ*J^{w*tTe>~Skx1QulNMUF~n[rږ%_4zKװFP'Yr\Yie_yY~}}pй.QVb͢R &V^SKȑ{(o*VsE.=\蝉cE g$M(H"Ex-U^x)N5|SEA9d"ꄇR-L\)a6SK)zbȻ Ffqb^2,\dbm/C$_d*!)hf6@ VLnz”Nδ1t^dىp$pNMEUȈ!m[ʮ+c1SD!S`3H$֒!D3F*&ְ[l]lj>0?F~ =d}ٮ^Aq~X> i/J%GUM0c-ģf\" ڋE7{^U+njoT|I:(2IYysBlGOZ:ءGCSjٍKq:xL,!3$\5E;~U( )=p\Iu[&_,IOMН x+VAk@ȈHS%neFܨ.!y= d+MH&'M5[2d LfF{qpƝ%Ic 4:y0߷ :VUI!UHPXUv6VZ NT9ӵP8X H||AdƗZSתXI}m%Nhil${Yx/ajdPf=6ՙk%š*;Ryruۗvi䀎< 4D_ [wX6V繗٩wi}\}WEh*UU͡&@Zv=%yf hͱBPO;翬"eɶ</':lLa"x7!׆skG|`S l1e72zx_az;P>ʨ/k#o7i(ɣL/K2K8S7MVrG/6JssXk3*l.I#LvƘqyfq.L]TZ|SʹQvstUi Tx/q&5SZQ gR 9tO11=Z?u;¿+YƛzQ|Ө {8`--Y[&`KVN=`nxaSt73߃JWI]nệve[,{RfFKeܜ3q@Qݣ=WNz-kh^]dYDLXij|QⲈ:8E+)w[ PeZ^pd< ta3 ᱂+&8Y1-hqKnS!bɩ_T _XԆ\iy!,L/lqb~b· K!$c:/Zr xM+fV?ֵc12i_H qx gIէ}))~޷=us֒ulq{ڭ>H$:~yT8k Ae\KPѦ;յ*HQw0}>< nWɚ ٪f/H[Sc䱅K=y[[GpdjrGv `8pYN+0"epYfYw_FNgtKH(|e=$S4ػ/ʢ1kOAWhX#K4A*#CtnSnۋQ$vD.|i(&{9@{xٺ$I"HSS'zlwl7p4BL(z֩<])GV4#;|xˠmzG)AHEO|} ?j}= M9]HrEֈì0))ia|]L~<6{EECa{{ + 9TibVpH9կ]*-w(~}}*> ;C.GbNjn_ WIkmɊ N/8V!`ќ}{LjBQXB UW8Ҙ7 EIX΀6J+ U}gt8nMwLHx>zsTS,NA#ѹ5S;09!$-q(3D=89L<"'d^ u*=zhYj } )g>M̒Par!S}lQ7&U{??W쓑S_:_yTx=Ҵ4 &x ~"hJH` s.l'j3a~s3#Ŷ[jjfPyݮmւ[Cx#d[N{咫P~zQxHɣA/!q/ܦoĿd4+u=Pj&g)oyiOW[wg}&h1M"ǧN$z$ z*?V} >FBRD1p~; 5P*ﳓok}\(Y/ +5L cQIM<{+~Պ biZ0T=j3$]G~TRUsy.p3VP Qg Qr s&6j%1-?v  vLGbR .a{6 #](t=aO&X ɘfXF0+ԆGXL3NŻTot9r5nC VOpDlItfs-?W';oï$.g#lܐr#x} 43m׎T<=sSVMl^HmQm-3sͧ!.7;dpVM3'wZtr\ru|oꐗ+rVs67_G_)O=Y|h;XUa&s0Pk{2*>E's: g4<)-&Bm'Od:i)?WUԚ*k:[q`:>+%.fߩXMi+y.J]mxwy{ &v ʹ/JuuuSXW=TnDb4.Nƙdfj6!4s6ҤY4F v6gah@W2`X- e{1AoҎz?2}+_l6alVO^M ~S)|gěEXhַ.iLZ+mݣx7)lpl|mvi D~D \G/m?iH!< E2%z#;:x]>@7̏H4N'|ՏOD;sWE!e~Q6/me! h}PKCRI}B{}A0O+%.h:nn'48Q]Sӻy+`vہUꝣo25|96zF|a=i^?^}|ax|<dCoJYưxjJ_f \Ǖt Zf+^'׎Wn?acV-eZw?(Q?0x[Qnt_Eίqp7m^'7 ߥz ]HlyTx5]Rڱ0?XY]SbDOIx-/>:MRv-是KͨENƧ|ީj|+XC:pҘ&V0N2r8Ϊ*A3vQ/v+UgwH6)}kvw5Wa)фVOE#i}EAF`:)B2U>9K PϘ\7KdskcU8CLo8;w4óQU=ƄYGI/Sot|w DLO)z RaznДݙwn'ƻdx!T}|^^NQw8XKun[f [{gG:.;73ksYO:Lyy M9`돪Y/6ÿQ \pnkՊ2}< ]/!hc˜{u \bSC;{aM273=zeޫYV F)N]ʋ[A"xފh'gt"\܋ly-*t4`elG0qo "iPaQ}g.Svi܁N  ꈲ5cӌAYd{ZٚAm8( -H6ь-= :33Š )u{f\td|Mc_6j}2hNr{HUci朮C:in4&SVeKlSE?8 f;kFP..ݗּ̛1!"]Sxp&R0a\{4f?=2i^ y:fF27ʻi]ڣjO=FZ\:')\wsZ /gЍ|,C9qÖIػ9j /{[r,f ?.ϻ{TyBBhA7~>B$1nmzQc`0cyQ_rTL*Y3m?`%dRxe0KAWvkɝ7!rxj nѹդN}-K~7eD믟G²39Y%Ktp3cniqgɘp@ vzt_ofh%mM WU):1 yf1A P2?eX1 !SH;NƗ[7KUy!,mus&KSTƨX[K=IOL9j,)W痿 ̹3 aIJQmnΖ2']8Ϸqہ=P5*(3ΙwgR-JGWH5u%<2Y%cP6do"(0yb^rw3wGl=`M@϶Mih|>.&H26 ѸcL;aWp8tކ:8P͸Ep5jTKF+z^ '='/Wƺ{*~ W)ސ#imh45Gڿ>fa}i$S=^|gINƃ۔zv]6T4X>嵢;spÒ3@w?tDHfg~2R `|>n>xR݉;p,*b{gi`vnj԰nܶ/- R[^9btyW|)8XJ9AP뙒$H9:SU`oxP/SctN7; y'8X37y[Gt*w<8GƇsrG !DȮ=bKDL´>O}rc<^\wm~̹6zFP͒^!Ԙ'j3[XT\ `~>X"4jٺ0ƈ4cQHvc XF*Vl誜fZ4~|Lj?*w,lOJ\=0qFY`kc:œX TXX`m%ÝtXTZL5({jrb6kGT9+!y)uԲzה:f[+\q?OY W c$y?`5 \<͹}l+% nP:,Ӓ%2jr೷V))&=G/:2JN;Y7X՗C!}[ˁh_ &m&4n3^<5\5ugZF({ (;u~ kJ s#<\ߋGBՂ+Th]n"2zá}x[_ۀ?a 8kk=:뗣酿tfEװ?+c%?X $+S;NG{VIroi/pI{rTL^9fx,uGirN{{ 5NL|G1`sA?^ɧa*rg*#N1֔J&R8t*\ XÆ߭u_>g?Nz>TuS/  }{FRbqZᴽmަƃu#ԸiM5cCvJm7Ì e3=iJqq]g/`L؆bZ9]67h(~X#,x3{J?)+_&FZrNGHAwSpx>aٶMc'xFzs0uI1za?\ϫ@--RY-SU栦$h "^Ł(Rf"Q#ndWE\<%Ä -g$FL_KxN$ 0=_>)x;nڊ,],:7^c?pAcMʝ$a D$@ O89Fk5 X Uɂ>RzrUI!vڞz0c|UJr2ᝆ`E"ru|bsƹfC XFbA19PX_χ6OxqŔM(% .j-'2M <*cg1@a4_.Egg;x=#>e?> r% ۷(l}_D\x)RMQ*98LzXO@hW: *̠s)=>N>l0^A _u_Ftۼw(rrVFku^@P)DƁ_ 2vPp"R૜a0&o>xp hkpE> zQ[eVS7]uӷ+ٓ<}<+ãkvٲ+_!~K\e@pmZp1*bFR|)2/Z(#Q siFpdCvTx2C WX<Ln2  v_{wHnu$ KF CbO4zxZbU h>BC#y((2oLs Oev4 xfu +s&hIX sJ×_ptuHjϒC}hp0X.PpX@Uj鿦/DbNR(WfsSCxf 2V"!BרCAmK6ؐf4X+=ȵךJi*{קzOȬs y4Yk5,|1E)6Y>g_;4ǦDm3;yG!DP6_Cs,DX RĹ&+UT~[Rq*jƀo)_e!H8:C:@)h" vI a>p50"tlxDbzZXsaڎ<HNjZ`T0sKg`!w! 1Y5M t2j w FƗ\nj@\` >psa$>ɡ/ zp绸ږ":U|?dLra-L[-o i|L$8ĩ̼~xZ6g$Q^Sa)K3_e*\8,мSkA+tÚVp[RgfC`NH)jK{&Ax):6ۤGlt Iג~~SQ_&HEZyA Ziҟ$d?('`el9*QmkU wiid ŐBV|"@FcqYfg)W&&8c 6PL>l6;NA 5 2oY>Nբ@{A&!OgJ.!d兡PhJ̈́3[S}>=7fk}pޡ9~;d1+;>)Xc<6ǥo!bT߾rJ<ya#yLH+OSis8ۛ9MJӠӎ=0I! ublI`h  }UNmJr.,yIqLIqtZ>|*;GZ&-fNnLi| b?t@y~" , Jk71z 9a,د%He%:2I4VѹY~]ߔVJ]:b?H9=cb{.Z yTj_^r`.(' Jȯ^WHֵ7JX)JȺsu * fjݑrTtId`߻ dT8͌7:@κty]{'IcÒRґIK&=cG$$#>dGm cU۰%[ĈiےA[<`r&'I!v><F2wdDjz-0Ch/k}.,?I +BeV*>wKP_s 1,H%KqY4=0h᝘|%/uI|eRd@F~pYL]e{sm_b.@țkz?"!_f"hBN?!HY#|+}& Kr糦J5 LoT]s꧎la#3jWF29t3|2OGEaXg{B<ٮK[s9Ȳ5Ioc~_ewmAs!s{Iv~C.L<{WOLɳ? '[7᝝C!.,,|FȊ%~ȁSȁ q%_ K鿸]>جnЏ9iwN?$,17s0ET}RBr))_CFzdSS`= 'xe9 P9Hyca:oC" XQ0-T)[҅?Fק 28 f` StPɕְƖհRͪz[yCGV"d@ r+gǪ[cGf?V3iӳ$ur t V:R;֙#aƘXK8c'ϴRڰLݖmΌ!ES'""̘k&C xTW0`B (]Q@jcآ+OɅiׂ 빪y,ޙ,=y֑2RY@6hig)quPR(% X Ł,'=,y0:F0Z%ҥN Ixu3DL/-,5n&pépj5 q+SqF[š%Āo ǜ«'p77M#R_3 8pY;#uTI]{O|0 è#8L`KB"H_vuo繒pK^TcJ%16*׃DL4; p+]pwߢ֌m?WZ`d4 \]ĥxRrfq|`بk Qo`{|8HXt0$Hicĥq +M}].韪ƒO. *1sgt?4l iMd\nF>z8ɻ(KrgtT(-~:uԥ#t3;3o3ιf(?(S>@ /hf&۝B3= #ځ$?-iDx<ϯ'.ӓ ,𾮊;K|Qvh&ck3jfڵJUKP33U\Uu_+˅@r}z#17rҴf&.aЃh$)%nض0 %W{ zGunA I*V_`jfUAMmdf\}\][hxkvMsTs5ƈ[|f?{f:k0aB?Ht0_ClBE>OT@ϜbAǶO.J1f")~4$j1[L9Fm%XRd~z'*f $bl8iyuvbw,lZYLQoz524LXߣ` Xlz"g<<PB|yT"u.^W<nQ~R66/^ݵn1݈D-NƲ/.J,TAP ]3VMus4?D- afHZb4J]ShJ)=(=% c[TYG\, :Rrz\k!%y,)ɣ&ԑ+UQ9O TW"dsϸ'ް#oET,-K T"5SFG %.Y)fN#{cY"YצHxPl Yn62W`A^XK~= xHb] DF 2ZNrJbJM\U$;]CsA.(L,39XsMcû6)[yQ5|fDl*Wp:Io¶TϨ:b !ʰ43UɽefƳD@nc{9y"Ut[aC FBp^,_{L8Cuxz3Phod&je}U]87UWD _Ogvli nE~Hja;s|X˰!Lpyw4>G#yf*,Wi}tO 6!0귆eY4ɍyDm蔨w+?3aGtJgHQOL*59d?ӥ!|ã o7q"9ikPeVPGaa @W.WHMȭZ'V/t 4lk0<;h`p u y?V1,2V*ee%T(]=b5+JMY 6GEӊAqzru38U8%k䉾c$} M|k)9Xz{r+CK'\I nt;z  VB0l#iX@0>5iZ+1,SwAT0'hS-674_4F%h8!͋>+|wC`Qui$ dTǴ5Ra`\ԅ6YMだ˂ɀ zר_.b Dˋ* a}HSaCM1Iw&i_ qr~N܊2XՎ ׷wbN! w$ʎrlRxFX)?MGVF|(ssj)& C";vH̨& %&24degw%G*qx4(uf[}qGabܹX9dVu[x`i&THt^ CMM"n1Mu=ur$Jx:kdZ4uCgn 4Qd>u[-L(e0< ATCwAQpO,\|EtR HqwwDw =I%ū>fR6Duܷ[D]Rd=dʀ$Fu-J7ڦ,=7k|k20T^&cz \ad23/O':O\p,aQn0r0AC$Pɾ D%s1tV k->ç\Exq '*砳WHL*U-?{tr)/8fde}hCyr[E3(tL8ώ e:VYʛ",pG<|&"+`w㒤gV~%dbf,`l;) !Kj3)0㚯\SwENU7e1.y=ⳅZ9L61%C&ZZ|l'!? uQDߔd!iHaKl`K[ G䂡QW3((")8 (XB$%yz28U3Hq_xL 9bpDx $/J|~\: 8C?&G_JH\oab=Ȭ}&|ֆ)AAD,0fmpʎ*ъ ̀ 6,³iX[\n;-Ab͓_1 Jƥqŝ˺R2L1A$IcQc!!h oL4$lOgTFUu= #ĂP'v (j )2D !7PAU$4/d HରF6%X@]d>-RI3.3DzbrCLH~.iAx!c8˦90z2iʀ]1z>.Tvw;[.7E/9̔LS'aW%6R,O5K3MWJk3矧ObR+O-2argTHQ-BުɘTI5baxL{C;Ҁ@+ dk>ԭoCbX&K ¨ mɶa#G!{Ń',EԏaCrIG*vDV6Y1j!̖A\c cS.V&Jz&gVn@ Wx*7H35E}h)?VD;T WS"`9DBd`\OЁ) |00S⺆0,"KqGdzvF'"(@Ʃǀ6Hu߿'L&:wv/eF #F$ Ph: g}\GeN%65oT()%m֒"r 0?N;&p q!6M<>cԗenj=jtaL:H0v+k Ɩ;;LԨFuMS'}=撗0Mq4.@?~n%<QfcC2r0!1tpuBBnrǐPH> ίїjA5^1NH<$4{i*K= ^rI@dru1|j?:6pBi98Q |ED1J0bX04/X E|vAS*A v\Htp;G2,Y Ԏw1l0Q=L-ve׃eqME|bl]8Α19Ad1T#k kƠ2s 3VH9s*c[XD6ItOLoIǒ{+]#cWSag.ݜ]Y2@JפI`Rb+. 78ZXKTjnv;fx'$Z]φ2 F&Xɸp+zp8kD~o0N"V֞K$ŦV;-(W?F(:4$ԅbJ6ߥgñB$ֵ`U60ac2?DMEGȔ_tR nlP@1u&w0BԴph^x:s`LI5U\@ ̉X[?ӥ%ftO=jZ-MCfpx@6WhE!'uU0dMr%NOglyI]C|PF%UW* {B# )J^ 8֨!o{蹜kt,< ` 7襬Sd*՜0pAINM6 Rb5읚h+\[N9ZvJ^5@xN*oP4 1b%ZRK m:pCtZ12"m Va(훂R`}wMJ5qc_ cɠ.1 0:{T0N}sF#ÊҦTGBOKpR6,:l %KVD xyXD*+[ƺbb?XA>&  H5U`ɥU+$hMۦqv` v"B-4%r91hJ+Kbe? VbG͊_=*jRPAuql`2 mX-1!^ՔW't$)P XPj|lrv˦`/5̞=J}gQGc)) [Ŗ ^](B)GvZ9X)eOJŲRe$Ah$a) PE~6U!tҏ@w!wĎP,N{-L>* g)QإCs=PM2d x^* sF|IҶu `_Hgq7J쪇A\zG-aJc+w "5qjXh4L'm`>#e$B(/AV;[@[e,׋lyb67q`ws_o[AϛWPKBz1΅PKy.Fgangular-1.3.9/docs/components/open-sans-fontface-1.0.4/fonts/SemiboldItalic/OpenSans-SemiboldItalic.ttf̽y|U?|oUN-N !&E&k*.X jGqd<H[!:>yzCuJս{9߳41 9n?o^{?g2w_|hf|*ڭg}c҆Kv9}  =}S&|_wOXg2c֟qSf%Eg,#~ҔqXn|Z\:Y3~I&^[Y;?zhY ޗ1s&;OY&d/]1f5pmv~?p} 651s4U 7Q\?{}2?OqŎ/$.8*6ɲ9nlfWXC?v};x~XA81# 313)hAMKb9m8V1sY;1UΡsX5l۰88قtND}qb\CqIJ衍`k*XO֟ ccuF?'G?G?kE?/E?~^1>GtL~%U/W<W[1\[^!#Wɫ5Zy^ o[Glk`ك!=.Y-OZ~fK˥_qYތsҘәM%{}"7IƝ\~F~3G Gz'ίϣg_4_Opx.s, <77|%ޟ'ab xv&e%C6@^,>ʋ8؇ކ#WyF2vSc|4R,[IRdҿ0H4?ku-| n|?MהAC !LZot-W-y!IǤ9'˲''3;gw^}5/ޗ}}A;}s}K}+|}M~?cr\snR+7=7;0wIyɮ)zCCX>}_FTѧwѧOOOOLYͲ+މ>1Чb_O Чgѧק>9iC744oxAmxa[ 2GM }>FW._Qy7o}曞ߴ<ϧO>8t?g}}a__w毃_[ոF|Um_W_%}pno`ur|14?, k3g95%A 9n߯,He֌A&`ʹ`7Bț"Ȩb֚a%,ڲR2֞Y֑u̺ug= K{XV֗dz!l(pVFj6b!uogc8g [c7c;سl"S C0{crWv&i-l {e3"6]ֱL6_+cSbyWN>WA24 vokw3>ňad_>S?۠vȦS*k2ME#T蜪 :mGrw"]M(,R/RR}jU~ˈ"UiI:qzDaDF ԞF #FyTsK-}FPci5M]-]N_yqҷ^6S>Wl`ՆI}?"c6F/sd8xI|Kb8 -}ŪpT+st_oxt_"ms\`oC@.AUj܉k. .Lߟ;dA߆Fᶤߙ[gU>j'!gC`CGꏃipq6 %a-rb`E Q+aօw֍zGy(z0*0tt A2[8>T5mR)RE+C y ڰ:{9+(&s8窵Xeg"%*L0"oZ/d~gSS#-_k:TW9U'oV;2Jsո∬0RUxƒB 53sr%NP޺MYvd9?rhy1}+z'v4`-aJXHwEaV FZZx൭dtO{/*GrHlh02<;^,҃`Ȃ 80bI, K̬fޠLojF3oIĤK#;.pgK%DҬ,Msh)PDkAѠq]NS\h;iQt;R]LGyR,Pf:,hţz|D_Mx]a{f"㍛<ΠzFok<#{Fo"/*WsCh3O9;hJH3Ȼ$(xۓȏ60iJ6fNg[S}ͼZ|K(\ͽVmzfE>ݵ~#s_kV uakճFݺ{^3{),lK\UG[lt']؁_?&{6!TjJhUXux9*kHe+-ZW_8 s cRq}EsL9r:$♿:t/_տ"4LYe΁Ee&Wγ-񼀿ًtߚ?xx(.' QzP2A.-$u-Z S.ǡ Ū*DS) rwQ% RKN1~g/ڈ8—"z4ڮ_ÀA{!"),f"fN1f*'se/Yoү\V~&_ui;qk`( `o_No x@V"ըOaP }*`S%?fH[n׭:w?Wnlo(OiCpI; Bvb! 9鵠 Xv N$g2M'ĩ p5e鐔@dEWKP{#oq&g+%Oz/m/9D`RCU5JAM6ؙԦk_]V5aT#3ԊkU+h ,I تjw_lWUe)8yہԏЫ;cɀU-j-Mrȋ#Je3=yf$=ȓFkqΐ9M"R@ e)Bٹ'-f{n4 ~R"<ಞC'ts;f=~U؜McMA4˂]Vfz\mvF `b%v;XsжwKߘvs2rui9gum#F27l hUi0_e:7q7jB#| 2j 9 c,O29˥ՀS#L0C,6xc G-R5_ >6j᮱aܶOr}imr, :e:|/\I)M6pqdƗ`(٩$]HP0*ЕiĈ)׭SLS70`r/'QȷrE{Yj9I4:q%ZՍoSHOZ{~ ¤kg>;d(>.qECW\om{VqNlig(ZZimbidbM#/%jHE1= MHr-@zF[P;hَjV geWt=7;]$8ҔKJZA@Ԓrk-#9)>tOJQ_dQkY W,XRL ,|/w͞X|̓egsۡ&e}W/}<ډ RRvC<=-WU#G_rGѨ?%6o=QcAG!Z$nle<zJP3+d'qhljTvT|uKSxG'Gǣ5]p1وH8:r?`|Vu6}4|ƽX=1S#X*,'Y(7 b| AZj`3Z h&(:Q%n]Vʠ8<ait2HMq@,V6T0ӜA1,vhL/0D!7Bc_z|b//~% N4oc_4ڻ{[Gg~v亻OykY  ?@5'CsØfMގ*nsCB0G',Ii ۓ`g>@ڇ{fӱ[WI~׿u4_9L>s?=k@bĞ}5K)[mN ;k_9Of16 -xk$<8-&?eVhBj2$ƱYK8֡l㥧kO9ViX]~Vl\TKw০ >uX[ 9Ğ $WE_קJD̴X@Ӂ=Ax='kxo4L@&xL;Jv6D`!MCz,兗[띩ʓuu՟k4Ygmtm[aG2S`7xcY11:=a9c*5@8R56s º/8-b/xW# 1]{ %mX)0! #2JVb!F,[ܡ* JXEUk{܈aw%x^n (['Xڏ 38XUs_դڱj4}h j,`YXKrW/x͊KSU-NB ;-ց_@plcseYë*(6/?= (UrrS>yϯS,dEmsGDB " ]w~ޔ0E+J8" OhWMhBG$_t 9Cƽ{--/WH9<^?_y^m/{Ӿktg hG/2fRj!xF0\6p͡%AJ078[xc^js` $ (y\| Vݏ;a~4{1 .6:yk9[fGw Z;<'F uiF8$$`22cR3lR__6QlRjHD(uH`3@ʡW +3E3aaxB jJ p̄{ ]PkVd}0S p NqR'O\E6%Z'_A0Ja%mAM,]զg̺/'_}9n32{Հ{ޝ9 u508̂xNSt`D)BLjUa[j Ԡqʸ9 ҙE? U/?pO_* [HJ&:z1O{!2"ѡCQa&w!v LI"B؜  du\$:F;:R t6D6F"R4^@>-֏?R/#f,b)b:m,ע4MR{zoz}'jv0bgR?eƓh(SjE@aI}LʹtZyE$0 C& Jp4*ä ʋKۆ=kcC75uypС{]=y?<ԉaOcg<-Oԯ ȧ1?^D$ D̉p} YALKJFGE Ћ!*TK;m/^ N̝PϽ7C>NK_YwvIW΁ķE/BV`u)h+dODBnGZ\C d(7(X$҂^☤(֩-b'8/vQ7@M?fykbj nKQw]~j3㆏pwO|;e*|:vsڑhhO;@ϫt/ bAeCA(`! p]"B,#\ڱ ft:'k^m9y`9r"e%@V628BHA KŐjZYqX-/<[{IW9 R%ڻT: Puhak_ yܰV(1ȝʮ\`Z!b :KBѯ${}ixui4P] V7a4:`[ θŠVsA0/5l)B8ހ X8;MbP3"@ KjaIL< -b&`TCK0 nl FQzI/ M: {0ZE8%%:nwĵ8ȩɼ|m9;P?ֿ?ŧsxps^ݺ^vLֶhPIŷyڼK~ՑηlѵI鲫Wn{I['yBG 9":_tlV@hHWa8=?T90'brY% 2OgtMh4:p1{S#a@{\Kl]L- D#2/(p+)A@Ś =me]QOґ-R:2NNt4h2R4͜ Y05k>S$y%AP(-&K万?G7ޘr3_-tqsW+Nuq7vYH+WN9AEkO˜Ria"!'3RhaL-%-( k8¯ "E\縟c ) /DJH""  "9)r"p7ɦ$P79(r1a:eVKqI_4{Ū;zeL SQSiQX|F\$91鞆Bhfv>f3^8- {j~T>nxoE=: W1yް1kV!i%!bMHIhjzrFw?VDd*"ND"AĉHkalC\7)6}D8aedvJ(J~}営[_3$}p`IGcs~ տ]W 9Rx*070 ;&c8K(qGJi,nj_~>Z2I \7 $L'kL'(lw5N2*򁲫 L}:sR]Z'\p$:(4e꼬ڮ^01 buXQTp'`l6O(0ߕ-C~ ZHî j<@"0sZ37$>aAval PxɈ3򊄎\լX0"ДD@q$K y9%TSCC+ͨ]}g%i~wwzN>lMЧ'sa~ypNC\J7( _#Pj=RxrLvKS[ 6 Kb1H:'b4<FwkI.uyzl{~1|(eT_x{q'. C_ (ZgI>қymCm!|f^ ]DwIpG>'ՠy2DI%g#7١{ _Ig,ڭlS ^ԚHTRxތC86YJy)Nq@OI@3Z)m+:OP*w&,2UHLFS0y$:sؓւ%S:dVo[ֱᮞw/(گ@Yd߾:twYpA˝}j,>rS]WnC1߀c8LkCz?W{͍ _L)G3h3zɣDbALYs"FM=qQaE9=tTsT̄Kl2 !4adSi~"& #TEȓ$E<WA|ISNJ!>ZP}6 W,} sn8I1κin|YwZfNOu?ptDOϭuHBy*rPq$d-T=AR%EbZĿ@lVqXJ;rㅸo "E#8@J7C&ڄr6Y"ւxbu8ݞQLK ƣqs)tXuA+t3.FnS)[;ٯ;oL-N9~[=}dS52u"7 TQcQ1# </{w8f`FHa4W;ݏcoxlԃ1`'IsgPB#J8VpPnd 8 ;^hX1 죵de3H1itaZ +T\aFצ+&O9aҕ:XKXSGޑ++:u^p儙wܾ|/^~ٷy]G}ty~ *) kj+6LA$%x͍G S~IAJ>#`wfpA;1P#?Qփs KeC9yﻇz~ʙ_\'~BBVL(j'JgT$fcgф'tp~ ׿Q*_ੂZgsڳGY0j9°2r#Bv%" AH@l EhDļV|3UH! Ppשfֺ>ΰ'ݗOLܥA'7ӝۼu;)"`qE3 /":LNPa",?Eg+8޽bma]xɿ~xf['L1ѷ*Ӻ&v\Y=:R~Q;:]*t^lVǎ#gp/jQH2֒Еa#T䍅?krܺ|E4c]+O̟Vx$T)EIWdH(HЈ4QU;;#Ў^0 'Ӣ :dZ1K b`*HJei.5+į5C¿K P^$MGN{|wPu|ŗxޮg^9ކ{Or-.{/YwOC^^s< vֲǞ?wL)Kr{oBu9A1G2 _RY4!6+¤b(o7$ j#ouBbN2< !w;DC(BC}f9J.)%c;;L4OrϹ;TVQvߒc81MT\yĚ$,I/w[,IƵ+mH-REzDܗH㡹3ֆ\IeOb%M)MP.[TI54aϨ3H^B owGw.4PsVzԼ$[*x=C{fQ=H43i 2!&xS+hMui`aDhP k ;>lmNBZȹB_|NEl.1މȍl G9rj*v㫽ҞAKbad8| EO%rl\#ݥ˭ Z nȝz=bQc]fM_޾ Ҽ{U{׉]V_(]qr;눑V5uغ!c1r&T B)$Dvi2?`` >nm^gi3A.j *k@8/9 Ra:@4r$ Ox(|ih} R„k98„0(,9N$]Nɘf`QtFOG^&w,Sl>9|f5.)_g>gm}vo u%pM)-<VX㰸$2^<+5d}Xp 'rlB] `_zlanՠFMWXˍ w;d;7oۦ(;ߛ޻ߝM/߷eo66JP>k=e\.s'<Ӷ?W|x3}'(12>0M8W;)<1r}9ٲ3aHoֿ?Ȏ^fC׏:[ uy3N~\/ȅ8l6JR fPaM5,Zzc *ZaPTH+;ҀB,kd̮`I w r^ bN/-GGMy'mւw[Op :K]e[ `^/*kO^:tBWQ2ߕ- |P}E7V~;T_>Rk60ȊxȘE|KP@< ݑBP).vGLp5;DjRf2b)(w3qbؙH! qcE/Q5R.ƯH? UP)'SFiYz{B=EM}1!ZW"1͍Lgvix~Kvy]E 6O·4T4sj24Zsb4Q9 ޱ# 4TORjWb=pQA_GJHc; pHpp݋t_D;F'@"TH Fɂ5q=ߨ\YHxU+9!hb ѫBzvΉІG3ͣ,1a"p?dvZk9Xk5iy7?yl+/恺q-q(u9oWe{;yP-OR2Pe cV>e ?d3SK5 ,SniDҺ)T {PHW~v1،5?0L$Ir0,بQRQi0E%D{Yr `)=WCo._6UzrM_޻ڹZ=]~DZ\W^oQUL‰9kֿo_69];Pv9ә*ڏWx~GElXK$ &B&#E$>Qr)Rcyͣ8 XXf^"o3鱘(1(n܈'C pP>n3ƪ,^L?!{YGG=!s~`.` 6(DVjn (xMi~JEc' ATBQsx&thgsTK+lCܗT[RzaFtr3ER(BI$@8!+D$R oa[D]Զnn]屏‹:Uݻ&}EU91C?n_ȶKç*냝k_wx@!&taU[W2ǭt6myא="A A/v>IsHWKv6~|ow{h7oFS ToJ rI?Ϧ /BWhV5ڃZ[A璈}6"J  d^|*ȅX|-&}f̚G/Wv~}nW=8E>$;v||.ڀ W9{^t؛sa. EGWHGo]JEضbsw]3ϙwbS?ޢ+v9I@ !:^`KL׿ ̜Է*7H2EwSEIH=,oXÇ֕GLnĴѐ9X"08=Tx/&8|[>l[VlˑW[aQO5rc%_XEc+7XzZ?ݠ~+S,~osGǮ,6#>JWAAO+A"L! eZ<_(`Xtf`>)CD%j~i:)PWFo$ʠ(  (ޑbd@b:-#7=wC}3!7/+f:xiS^3eWnj_rD sXAƘ=x~/jt2Wh8Mg me`nvQh(R%*PB<O$Za4\vQOAI od )~0h ;܈Q@V~Ŏ .gZ~5bw~,`AN"aͥmT[M=.=xTGVFoyOL2j֡|^ uڬgxZ'u?9glⰠ5~+x0VĻB7ÔƹAk?W 51-ōWq"EyxŘ˞ilZ ^I, W mҟ^ 67!Z1䟊+nCq?׸8~Z0o/KcH% /o7mք aA%eesk'_=?sX }QH6~J Pޡv.>{!]aJѾ/߾kPI@yi44!r8z@=9hV*ɠ%4| SͶ]kC)U߯s,u^Frd~xhSjjGu_~V`t#nЏ d$6J~Bk_(q&/θxCrwĺET7! {Ў^5ڱ0[H^ϯbce$6FM#1s{퍔_A]H9wSOȟŠz7hS LgꣅNu(e?.~vDE~dDbL+ rn]ݴ^(?ǎ_4~rqvJUPF(K !Zߥ咬zf%ɸ 8~6YWK7ro[Ji{2e&o*7Q^{@jyge?0 H.%~gȃ`ށrxc˛AWC ~Cְ7E?5>93̻owl0Nf"~YԘT3QXoяi. =0Bx G/|*Q00'P;4f/%YX k{m-k$,BBB$;%,"  ,"("ݝ j`ryso' }~~>4kӷN:<^;j4e檯f!֟{h@up*\8P:]nj|Ǽ$lu(PĒl0@ N8zJ`VKsR&" 8.%!;Gy&=NK+Я'|9qdNdd+~:D5ۘ\7uC'0}'eP}k h*gS٩ߏ=\˟6`?7{ǔcϟT.e0aaד~lA'u"sѲ1~⮓y67DHb9phĩ1voT { um\%퀕Zi l PDQ؀SPxɍj,q}v/R;Zr7ox#æ9u% t|nrTLO/%hiJ*] Ң 6vmV?l05@yH7rA+ea;Tx@ݰOݫ[iy[nln5.M{Co '8 Hus"ʃ|5WGMAypcUkpF3iARQ㣈sKT5yH٠_׹h(5j|IĈ8Bl䨆ӫD;(nSrv}q5Ư6S4+;m?A˔=w|E?SY: tg<:G7în\ǎt?|]-|?gI|1o3ig"O=oZFO%7+ Væ}~#].7A'S}|E|p|>q}v={!~'?fy, KIL:g`o8HAC?u+N}J01ay?W{j[A5y5SWSN*ADow >wk:T] )],s 9ŶGu'lHzS0㜹HĀӢ?8BKHl$`DOY05o)h k7)GzoLޤfѪHs\J="H RmBvpC2`Lw$Ѵ#E.eK;CK_p$dtE) ohz\%qIf 8U@B/~u3ԶpF ʹ/xsbX&/7\SL_a)$l*ktoruox?Dl&?~58?TiO|b (},*k1_ݾ\#'|QL4Ǿn)uu5-g.笠GsekO Muj#PEQql.3斣/5M4@0 ތ߈fqLxi.d"/y0:mƔ(: };d*±wWN:},Ikk^w#"i9hl(ve/Ec Fu86*9cLIoa G4٣C 40nxr-yE%n{< /͖m?CΛW_yILWYjyوHu$˨$'|Xag*5+bnd¢ otLgn`] Oh@ffqn3Lɓᛇ D"*@@*vוo`:m"t\߆翭ܖ~\ᮋ!畨]Xmϧ-׍[kfxw֒K65c)& Y qCOD.h Ot] @`rSts+6R n^_|jh\#TJP뎨 O p'Oʷf)_x5@"f&F[$q]8鵺bG14@IDUͩ1p2aNHMgXm͂甊ʈA lp<\j@ sc2rb ˽53Þ',l5#eG6kժYn%"r'Wmb:M.^ֵ`{~qq> []iKrmI9qYSsAs֌(VEUi"td *O(Ps4ȴLS3`Sh Kzs"vgbZtF"@݁ކZ04پ"DLB enȱٰ^P{OxoL;E6mr{,]D6\%g?nqy-[嗔\ue-jjz1$|/| ep`_Q]c0_;~|qcDub׿V>qSk$>L ľִp9/Fke UΨ3v<=H2*zi}J.h1;1l#D578HU2v>1KhmAB# ^lib >T|#uny.꟫ TuFc kΓ!E%78sCIІ!8(WΐC?45сhooѥ!AgXuSzk#E `a6 `Ik!lDgAzC$nt"v{aݴ'~p|G,@In`yGiQ54nc fHa${Ƒ<7OjbFQn&'=cȴ ]Lc%J;DA!$Ҫ8Q 0ϓ!~.ZạL/~"ĺ/=p]8 )- ]J5ݱMb|szvj4}.=Y6Ԭbĵ>Ɖ"wXHsFNO;Xa]P&R~<{Ϸ8F= >j`~ׁVO̿>u^xz k66пP>wE3gnQVrQ7;vP|lBK q?~k_f\P^믙/Q& fu^ӞПN?ڂӡz/6B"}^xlf"gfBL *g !Ay#tg{]3=B/uHFw 0}SkE=^BU7LYzZ߃p⟑גߓw`!B &N#D!RF@1dS&B'@3WHkn5ː`qd?#E9bd\ &gq1f3*̇gC$d_kz&VgtXޫ+aG.՝=B6\YC,T{ψj̘IY"-S':ɓ h3m+x #qjxk+*tp X͠@?l+ȯL XHcdCWn{. | GJԐ)b_F/M08`FhYnHvJg2wY=U^mႵ|#.j\e3nUU9.VhgsטUO?e9s3N=G40pxG*1$ޅ}ė@,i͈XH s8CBEhDn5nloRbZְlׅR^Ktch:p}÷b;^|F]#ɧ~B{q =97{u$0y-p?/"q^4_J^[@ן׵>.ʿɨW9sMaG|W9? q9%1 hדd: 㛱-N7+ƸM&*!*[CP'=A!WCQP& Ek$sĄ5QF3rp~"FNmS K"aWS|D;[PyC}'@)bЛ*h(li["hdFjy4MU,l(zE4> ME{ 9'KA-dnDiR H$Zo6jMv3A Љ2(>-}uӜ3~gϜqsJ?fHt;ͪK+N,MrWݻvy߱m܄W;l? #qT`gMS{yaFRb얽tO]&jYfRwﯴT\=Vcl ]]KB4ځ›jd&+^ C10 M0 ~cӠd8*##/hX ZNtZV͠ Iwcl+ |{cF]w6ֿ͙wqygo;,}$.ؼfWamzw.Q`gV9ӷ-]4y;/\=bK?Ug"L:=W׭*oֲܾTSMCP KAƅ>πg5 8g#I.&GdmBcA^܊l!O)⫑=V<𛉊e"VČ},#5iشKB8^խ仳ia1YgqVAt` K^ʉrr D2C^XE 2 Q4 0B9HX^Ar+~q}OQyfU/*K^A<oNxׁ1@)?Ѵ sB>I3SrIuk@#ƬbR(8V5^ 8ИC 44⦟Xf4$8n/G0;s M [hN&vɡٙIiCcWZrf=dOskteuȇָ rm!X0<3I3iƆgaOJMBVBe@ENWbz1$#uUO\BIʡϊM`{4+!rc Qo-sʗ-> 8s}xHzL叱 pw>TypE aprӏN=8gN[~;7 vPj "S[Qxןϋ[;Gc5$jqxڧG(½ hY_,`ďDVRQF1誉%ʓTĻ?M%x_l@4߼{Q__ z$}OkƯ=iZ2z.`2kO ??}fXh '$_гw'g=-L%i?ϵy@gr.vFZPs✻zD'@-V` -B1/>! AeOymr!膄VQ`7` ~:}=1 n5`8Zt x*LӚf/-}{o|>Od8#N,B=5ev-ͥ#oujǁC1)j̄_ vSq4!G W 1B0ˇ1b⵩>XH0j.%E6g hnB}-n e7&Ǧ)0#0kŦՋWn~Pybk#UE-S=})EўOTajcu=#]Yud={B`6cnJa7x$V(.FbYufsI'nHvp6Jt1>:J!<5@S0ڄ5B;UDvCJ;dFtwM: ]"L- ͉;ޙ.ֽ%E˜^fGf 0R.*oOVժ=;v/zFt{[{|>l =X@xc |P|?M❢k$۽I: TNTvQ5Z?&:~ eT/*1ϔEQGS4x&4M BL"^sQ`1Pi wQ)Yn{(K4* X6h26󗙿|'2"mY1 \Xk.؇V6~GEEu;Ƨz,W 9jzNPcf9SnC=kT2_*P}1NBӘ9ng<!+fqO'X]VoR 6T@J9!ZVÑA!C~tR d*("-&S ;11V=_өmAC,}F+RgUeQs$sl{wu3lHf)DO,~:3Vr(uYh"O'&I@_FOjr]nJщJF"|)% ?|{*j,7-3{U"LbOGz^hJ֞ѷhE 7 nUG" e׀}u0Љxd$k /ơ(P墚7jlU8J2蕓ɟ"  /׿R#"1\f7SHF_`2jR m( +zո24qJZο;zΏ±3Adhڅ0DžD@/*x-o3L {,LXrRfmw2`]s|+"H=fs0.Z©9ᨶOuAm[}o뮫֝XmOA O)a6_Y,xmC{~U@ l 41O En qFP]J[Ff{]5T)$E\+WqLHD"WF' )N/0S iB :8=CcA9Ǎ7~ W[[ue}C8)50]4쒄di#2pJU뀷 1tkm<̈́4HigC>E s$9RE+;0 &PJS"psw&X;6xzi:FTlګ Y3CؖeŶ C!Qeh1]7.73rNbLM(jAFuD$*4" :'4d8RFh)"t(PcvsIIxUrTSGwhJbh`2Ԍ +0&^RsuJ6:IDy!=q 2A7: zpYDh-ð"up*l N:I ׆ఠp2@x3djneםwqN~ͧV[}{zh邃i~|N i=)B^MpA~#!5]K~Y<ۃrM Pt=pңrlSB1u sE!ZE덆jbVu8CR%nLzmKY|k9tǗ9u[kV#ܻ聡Cgmiǚ6m4\S@4 )jܸ!ٷUeW^Q͕<4v2/ 秉+!H~ W$F. n `pSa.B~ExqHTwv6k/|cG%RXgN8@.!,"1 JN2 Bgr4"0HCXPzRc2^1/8 UaHSU]7IEZ]꺬壺\}Ϙi΀P`aN4&T xr [0L&ZuL7  (?7zDTmm4ю*4& ^d="\ݽXwO`oCs h\ 3a]Lܩv?v-~/U ~oyG.Fv|\K)jЭ*JJL$KRB y8XvxtA-A %3$?WAus~f۽Cgy䬛tF?ecu9Ê|| 5&h*ػٛ7 d}6Z# ѱ>ΥiGB1Z(vi #/N{!Ջ{8W]uJa!{#4*Oad&T9#`՝áU|c hT4mo\r|#@^q>,5+F bܪC\d)o}u76y}tjD/ ש\bаg'y5 -=ޠg}WZb$#WPPpu 87/9>#y5\mݍCN#o`^T/"zIC½#7VtnC")"@>\:ODt~`5/9 P[t6ut=ncz K::e2,ɖ}u4AOQkyB>= v ZXCyf," 7yED{&'& UApIwU9J?UU۲7?e)Uu=s kw '\>lZ8rl(otc/SƅghBiio]!Q#ȸ~юQZTrAH).Y(V[@ei$*J+ P&1lt˔#!葿?gӖSRV'N5ovhcF$ 3=Nh:HOLMti\zZE̜qQj8NBAq哌1囶B-B%d z CD~cߏ7pB8r; <'ms1(R3C_-Mۓ(ϭIJw?*"jԭ?O,"7O|r۶~O45r^ 6o \NJ#mDJ9*F Beg4so"W#?)Lw2L$!TPMF#/c5-P<6!vstWUxm͢Gޝ|8 .G/sh"MRR^d+ö`#bhڛ# t"'uW9 5!B(hЩQgzQC^t@M?)< '+BnC%A;PTkD1RV=iX"@*Ice0VO:7{]ϛ6o+kK7N"[vAX:*"*J`LkċT,e `ة';OT},Tzbw{=_)u_ܨE|Cwv=UPڙ2d*l8ɱ/'5&k&iA" ഓTS1iThϹIJa7sPra a7*MvlN_H0=r"^w p2@&vA1[Xḥiazmߤ٩5c(-X֧m{H^ekS C|Ȣ}w?4oˮϑB} >Aåy "I02E0MNC}4Fp)BG\L"cR XHS1UkҖ Q脚}?jϵyk ~6 vOb\lGwlU"f)HiGM?LFTHN>M{8 e)COIbg`7r]A 99iRjox+Ђ;ھUQnX^)V9;Skֿ|U3qy9'x2O<km8iiТߊ΁n&A8P`Y*l= QQ gE!$iV !RkT +4>^^D׍`ėc!b~o%l'XXSE9T(R#ԛJA'51=ՃnײWj[j"CW>h@~.(7Gѻ4: L$|/7!⦰Ԕ9޺ŲǞN[ps+ZfsF5vD*qs8)H Vń8@@:Ck_Ixp r. #bK4WMfOStO.ƽ9E~- .1 mO)B&2,π$85Țfn+G郛r]XJX·>3KyaǾ +Ӽʹ-YO): 9fޔX* E{x-ꞔ]RNqAOU J7l(t5}lC94rt(U pMMRiĖ֏~?}SrWNPb9y7G_QKAB!C4XJ~+)Ά =D[DDϸ{#tyJH* (UZi~(=@]`[Q Cs­K+Rb@>%-iYz~y><ζtWb;UWLR/^zpv|J.(8ǜ{u3٠ ܤiYX@Y\FzaY0*Yv㠎]}ڷ"G|EYusqI&irM=eQBT<@2/6W?^ vFE'4hlpQMPei<*|p{, CpdV e;ᣢdV vH1H1 ϷQA,z"++Z99dž'zݵ)_[qא0w3,r im®%PUn d^,O}N9:,ԩ`NdX-̯l^;ݜ)^P(je?XmkeLsgMD$s<3Ԃ|uD{>l-j1F9 ز|X7yטMfK6ʯrRuog&&v|v=_{<*4mQC)ܼעAe@:!鑨»FVPWeVsѼǮ@S2>ɇ!"ӛ䒚!jM}~cFA"#;I^]z wȰᒭ",%&.̸ 'D#W:o^#7G~UZ,=svSC!dLnG5ˀWcƩH6%DiTT2Ađ7@)af ;k<9₍aY@"LOE!@Bj 8|lB&G"쨴0Mt?כzbvw Ư$:qX?򇹐p=WRk7 U=BJͬCpK)uY&șo; \.um=i)yLcw8v冎umё↳m{"L|vn71=_?ґ!p&uU cHĩ6"T<` * %]'הf05bec5w\WP.8ʝ`+ B `6.={TYLh€Pt@1dxtA  n`.HT|TX7B s@F s0Qd.?F`>c +&!~kƝ(ꚺr(QMY _̉Cz Ed℁}fBhBǘ_xCQ q u:rQ'o7Wq;r] k0J'Xm<]1"_Cz]:aG D$a?R Tab$ ,KKA` f#PR '|wN}KH]u>}~4bP3i;_#ՏHaZ!$ ~R'PH&`%@1-Z8 ,c|ujE'/WWANۆԕ⏱|vs_Ӓ!H^Yޛ0Y^:Ma&y.=WD^:BIlkQфH^*~Ab1?%[';u]M5XZHfzM!Ndso:NCg`4iGm =Fa;g-QVz Vv4S]Vy1a7o&Hх-Hd6n|+NJ]Yh E[:Z/^4]*ta Sl4h1NF(3#JwݫWB+2C3s"Q.L'2pkbZԘy))ȔО2^-j<}|`>t\7B9`C$C_Bez#6޼KAgô} 15"h sIn44q׌9Bt7T|~wVĪx博̆ PeYrUN0҉J FCDnaְ :gYՅf\4{0곪 CFjU6JrA" t yS^A8ptE * ]x8F MHg0DQBraFxtn'QƽyO&#evH!BGPeLٶB2EJP7n!TP]0r:l?SiLHWpz2Oe#6"/- -eLFwԗ2[7]ѵlOG+;iN^ڑرyN^.3bO/{e)%|ϭ292{:GWeҲk˽<o1`ʓCͳ{dVgL('v{|(3Qޡ$o]Ui/Z:xp7B81*RV:B"!aVsS,īN(?~Uۗ6|Ba]%[Š)I"TVQ{g _4'Oh,E;aAYpY,-33ϒx]E6p2E> O5<~5ޔ.NV=$zq{voMyeG *{|wnHߍSWΈg;ш{-Fִiĭ+ #'8z@\F2f4aj̞)HG8殇;t-(ޮz <׍zb:9nyc L^` Dru+weX aXJ`ӃHCOhfkO>GY4O^izJ;'XVοN}2$^! p5I tX ȐXQsG ͇:A[Mcq 4UI&L&*orLG^:j7&G$ItyOJt9V6ZPG VF_B?ef(]aϴkQ]dwtiӺgܺM[.W?9|cJŒ %m[fMU׺c&"﷕owJ"_.>'MLUsr ag;}Ƥ1ԶMA&2Įc7B6 rexx6]]N"u8+I{¼g_vޡϷ-9eܬV6MDO+^o5iv |ia~I^3վPv{0qJf6ZK(Lh(3֌2(9ЗTYoA5SnUg9}]ʒ탲X_RI%9\nN'YU uCې/S}02M}mpmg6FW6=IH W+֖^Ei?pP ؉em54'b7[ l҉.wT&Ee: { ?[+0XթMg8@Ǵwx -9Dz8O&=cHq/̀_hA-K_d)jڮO[CUߝ7ő~|fz)'9nXĠ9{Y"U"Wد1X_OgՈt(^Ko4ܫn)u؃~]*B= i+,z e$B^wӉzFdw4LXdK |9Яf9_Rpo[/٢ILHUm~^R"jKb_j5ay֯W n3WWD5EffyЯ{eqI%q~W1+7ԯf[4ԯ&l;x8*vVvʜVRү^Jg'bXeLhY:a"5dSwH0 ˠe]zVowҲ W&%C-a[3zWg׫s9[wN_1 ߂<0\|q݄Y+v8VeS@RHi- ^&VC^)}5G)SD史~[ 8am MRBBB7^6b.3ׅI w1,*ðT޶U4eU=Y -^2KKZC뢱U'H )1"ab0co<_EE: |4BdDR / Ҍ'Deh2VdEa%LBHOh#>VPzō'][n]VC! b_Rk\W/xsEn;lb%@0h>5` #k!-D84y_9w"(;9yauHfpTwL[׏koNJ"R~Do7RJa1GO't" o k ;k]4U<#,/1N;nԚw{(mnU;tVB ! mB "  ""Ȧ"*"ݝYDDDSQqAԨ,)[ ;3?+շ=sysI݃?҄9!g i V@[k0x|8/Z?ykd ICF$?:X=4Zt@Ġi:;QB iҩ[bH\yB1=#Y X'&CiA=iHUEqNJ70ӺNi;#OwHq\vn:BѦZ"c&-0|(a T̔,D,*+N+2geka%irYdQ~K{0](TբG5p`3 'SxgB69NbP^^2 R`wUEd2F*UK|R{:oulj_J5e>cwҧЭ~A{ bOxe Žzc'Q +3YRo^]#/-]K-z YPi,q <ycej9j2-Uv|k:~|\ǀA}^=N-:8t0x9fcVel]Zݮ_2dtxUc$Yc,q%J5w¬5lѡ#0+{"X*Z3->tYxslPi^pxB0@"SX@S%+c(/\f#|qEoa~=-%mQ[h{>QB ){k&>bTc.jEcf.T33GPyo =f t2m FLQ-SΣ cJZ?.{]ى2m|>mO]4{Ęk&p'Onl>G(O'>6y8|  [%[bUI )A"L%C3nCPbKI Hv.Zb%4< d=A4V# fm;E1uذY efE~E̼(}ՙ>ol6c꒮WN9^XbqT+ .ʽ2oГy[3ґJ/xQzL\"ŲۭԴzBg "\Nq"I91?mLrXL?-Ƭj3.䱗>z*QkKyuĐ^w'Ǡ${z{‘K/`LƎ/?d=!;/[2yA Vl-^ձM ?ZSã#Xpy%X3PO$h&"Fh ";^Ǧ40XC?@ |vʲ$,'y~q| $T8O2o7CE#>a0"NrF.)ӧp6L[ JPY[3>?Q '9x~la4GґGy#TFI_Ql=ώ)/\PS Oƾ 7#Ơ79pЈ(Biz{@ح=&&p$g]6Q]]EhS8gtd?Tz@1uUH?\͉~IQ'B2e2MoDQOo\O|\꒬w* fI%R4!8t' yT0P%<4m3)4I͜Y ׳x'f6=:M=i'Ɔ%G /6HCmT SFe ͂T/I'.J0 oNx=C 9E] U6yԀ|/O 9[D.P 1N2?HM/e@^G!>b%jM}q_;ƞ'J"_9cS|Q%@FehX(Y&bBt3$(D^F=L2SE@wґy/- />ʃlm(!d ^*R#̷lP%J *Ř kAe_9ElD.~n̕"W9#`Wۊ~A2$W >]L9qH0H6Gni!&$%pNw] G࿤Tm!ĶŒiR~ɢkROa.s#/2NWډdAH99knZO̎~oW $ n֋%5akU@ؕZ09A%Eؚ0IW~d2h7"٪Pl" AGМKU{1 JY(9hT4*T…!GY$E꿮\kN"9zʟo=:|Ioj>.>ŀJUQ@H,x"reŀ)jO6[=3A^ g&? $q(DvΗX.1dK *CDঐtz0F-Vd=QuHi^&z.<㇍NK5+-B]#75}s B{؂}z?+H8bpPON(I8&  ubP/X8-‰6-JXEJU6m+0Dq}Wڶ)5]g#y`AiYkҀ+BA+wN[<1(CDD#mh u"a_lWhV*Ab#"/pe+i"fqv|#BHP-,`[`YhςϚY$aoYbij|A 0~6ޚ~d.7.:Ӱ9F$oe9(uS#7B& ;/&I,I&I&<=2{4BHKpNbC@y'*0fTBy=~3dn۹8Px$?t;;MmW;c ?&.5%AF%}=~痑y\!#0|+JFo%H@4kRM@w,Dg m }[/J& јv0t)ީbW $S,ki˛uXFp@Xqm:_]^g0`>Մ0;Fzl2@ lG:|t:9<]g$]0i|Fb WhAglуK?#%m>}Aֻ.LHh([яW2ΫdP?l@Cb" 5 "tl%B-g%< %ewikQÝ>gjZ Y1h,^h2ZjQJsz-}; NڙT9/1ʆ9O^3B878?;p3 k7[%9_;vxlrq9cr̀Ț IH!NrJ:5|H$\d/ž$t4I }*EkW"9/ixD|}XuIItxLL&24L,:ɘIL$@Ҕ/JmA]fe~ 74].ſs?\M S~VK=j.“ u\RLD9_bYaiф+$]BꩀD.zH533S=YHT<ўt,7"6Ylzue&C{cf8JPrc9aD k?̪a/aòϮk@͓f9d.*܇ 钽/s! =h<2-:G |8 [NP[o[!ad I|ImIIԙeh:"˴b R9vIƓmw86)n'eeJl9Htve@rgcd|j{g(qYZ2I3/ (fU+tZNyρx}J\R/QPQ{=7]wcx}+g w6uf_TnKc_4I,4 w=v( + d$5E(qcݧPdT dݣ]i@Fh:$ ,.wBӏU}OOӗm!gЕ21Xa(%/`td5)*cp`[F %@_~C, ^J lw25=Oi[H ͞]=~R; q (`~Rݝr*DLFSJvefañeSz=)BIsGk؁ɷ|Ac5xe-;0x1[艢tE/ V=$*fޣs<3_@ tZ&DrBVr ͕o}%IسږvQdRm/N<9kKG>;9s#U26g=y{翞Y#C0xQ%)\eAv*6'h R08Bx 0g':⠲ _"v=@:m̤:8GXjDɹ'w#G}Ԋ[x50Z}\P2PYjblVD*l+ Tgps`Ay A=8'@4EDa+@P+Xp_ Et:ҿ.r NGr%.Lw1 C5 m(}5FbʀeJx[#RL%(Z%6~hC1'BN=U%f=Kr(l:Tdɷvz*E&,v D1v+W%84`Vr08ap9@4 ME+zBn )uέ12[i]/.^.  d]JŃ Pa3GƠJ uKWgN49r<\dc%DX Sf(#Pdvm +Tl=\}䊆UW )Wߊvr(<8a?v[uaz#~ߠ+[DץefL#B@g΁%h`aA)/l"ZJᢍZ<9興%+T&Dx4eE@KɄv0O mWw?3Oon 6! DAuv/U¬7f^ǵ*/d 1ދ%օMްtd dفj-“cTӫr C$0,hiIĔNe0>!b8xm l5n;2}:U45I6!Ww׾)hlQ B33РBVL*r;ޔU"\uA!_LnzdZTKHV j XbGaZ`6kVVm dy=z&1Ip"jF#ސ ,f#36+'$QYNG [n [^>p\/_u36uY=ftYM;!peD2SI"W:PR %2OSJՈX`jFƂCʛ9)ر_\wcy9]e`fM';. 7iL'#hayT7/y`R\84_#5+#^rkSbiH!&JGr݋]  (<Br, ˁd%wʵZ##oF&m3gJzH2&=x]3!cdA[t"f/د9E &FH*J#>Pgy_+j0x ddϰ:nE3ܖmsP>%bCTYKL} bwZϩ~6dDC@h*@@g%@d=iZ1#|2+E/ZNI4~!$OqtE&+k'Ta|w k{kG04L<<O{Qc[)Hq8Olw dDLCSF3na&!;-M\m`#+7)=B,bNEQjCuB0<ƑJL4pE8 A5@hoH5usm9z mG6.0-7ѝ f\UUC/nyG7_?hm/CLPc /9PIex$`Nt?IB0mI'6Y{N[Zi뭻Pm!P[͊=C`&c?H\ (c#D۝,[plQQܷvؔhAw"عŷCCq=wX5|q]fcqzYXzm3M&0e&&md!ω׃'tb!H#/"pEQ`-q%EFte#nV/;G~,baKir3'ةyI;D5:iAŏ@҃-|@_AĊI`P "-WhnБyPGI$ȳ'Qh ŧfgN~=j1>p쵯T?lc OU ZFG֢i|\*Ku`V+pGB ìQbc}vnmZj6O(;hب::\87e`:Oj8aX F921;I 8w?_KgZ GfR1 d[H3{}Yg5_?6M}>7s=n:TJ־dɗ)f` pIho=C,L@]lO5fʕ IjpQTc& 7Ƴo'W`;&zY0\IZfNbtP{N\$|^S=JGÝ'8п5J/~ꪜEemu;*C~NT>*kO 9f vwCN{:⎁aEbAA槛8_3=X'wM0F2^n.9#"6!ʝt 6Bz Zf[}|Xq^g[؆lLÜО}`{9ק* PYn6Q>+'R ~ۘ_} r=0>D%KHE:n2x%_F< n"hi_OL Hէ+ɤl>̅(i8:"cܬH%{)W=ٺeoƝM|xΌ3Z 穎y=5G]9lT'Cx pb ?zوړ?.x6W&0Qd^.rv1 ^9( 扴g J\ e0ԭ6z8!9pY qXrkIc7]w#?7>=nJ{B~$#m9w׍gw-[n&C 73Ѝzc~^O5H?K?2G~j/8Z:/^7<kIbE{ 'ߛHRF:ԠH3 Ctq3ŃNHlx"ቆg.♡r aYu߂s3Zl;lb|>~_+{w6Bwo̸}#ZsPx Qfǣ\ⶼϽMNq:Jt-IDU^">Ksglpo;KR%g.3o)ᾤ|O7}IP{/d=)V~!te /f_?O}ɜr-ﹽHUuiBY-sֽKGH%@7~,_<ϿO䧰.]0~nLY)O纐l 돂c!4X]uܮvl_y8pܦ}C~sJ#no7ɴtXR`Zs*ܑJ suC)sѕe> %[XB<"^~L; RJ?iVNJc@͊pc(e(UcpG /A4OQc% +dҴLxkwH1Ed󂊲'V@{j*[25@8bf\"Y12HV Q3+%d<@yAIxf+=s9 |eHSp>(`aIpaQA(]P1%OI5-IGU u+&f&|BQr؊}2%[˸D]Fؗ&n}2J&i9R26H[3&]% s[玠Eqq3tp8եj/zhlñ*ת{E<Ԅ[75>R 0{:AoUvZ(oW#V6 GxX Itn2ٖJ`1P2lb8c 34Zh+ |).bܜJ{#7K1!粷BX }Y#~k|w38itu koB嶕;li$,i;vE1{dfY"CRM j``'HrFQkD ]^A~o ӞƮ" X-?miM{yա͝WbPs)myS<.<0]ΠKD|,`/}d>%A87Mi5`7f-5YC.)}3*ki Kǂ' Ρ\8c/y"?sz ~8T ;yHuc~B_k9vVlQHQ''ߕ7O{ מ+/9q~dK ;7R.m Q !6!ۄRb*,^ k@z%=mKMYHY1w"TP|OXtW[LlU= e(F2McεP}d Y2b7 I lzniW}U#$w=٧?<ćO<{zfTbkbu/XowTcﻻ|;o#2`>ydDSy Dy9Xbܮĝ;DD"Vlma$ͅ |\eֆ.!lX)l,ap*ѐzoh.US:1C2Q ~UC 6߻q4kU)uN(|oݡ|s~Jpi*HJ#F [AڑI*AaF*f3pl3g& >+A14%Bhɥ("7@˵r.>yho'}os7G/ _p^Wh)HyO<エtJF[ AO f:3/4"AˆCˉ^YLtՒ餁y?xo]X'XEƓkA,ڱwO{7ٚ:hM;D2XXNk!}kR`%"3=&,x ;-z3i#w$]ΣaX'̵ b~h^P_(}32Xş̂|Rf" OK?l2XmH7d  'GO9 4H B(' ,/(u`S)$&DG'jJsKK\fHbg0=;9 и2nA5B..lޫD܇:ao|=oP<݆;Yhߞ+b8t66 6{a`}TW:U o]=nlP{OZsO1GŅ?xH~@ ߈|v~Aq^gYs־z@.{.Q{mEA{hkJgn j=~1iio%}\ږB#~Mp R'Fr!'cΒ~|oo;pPG,e?~6pGuY4=cA탟1>r[y|1B/[nN`)//&yOyvId{Wl?V9/~.1LͶT-gp[xB{c_|}ݗ^_|}_t?G~uK{KG~MK{KG~MK{}l6G~=ɓړA=ss#}>\I?OrJksœ8_c9~6c>,A߬1.[zyO`}1,)kYap|?Cy߸ ɭA'LdՖ>l:a?~MPd5Apk'ۯ'pQ{ɇA{E}~aYJ4Y{}%Y!/ƶc~Co=f1|-Ki#/7XC|>H?,Kuy}~~L yLCqV X}Z$ۏLa< l?Voofy3B%,O$qqV(r]ھQ?A{'_t}']?=SҞ#FJزY_>S!xS>X- _7~>K| (<.ȟPO=˟ۣ_|}_d֠} ۏե]%o~$7 b)y:G[fLPuG TU5T*IɒbqX>|6k hZP*3mo-Dw۬R{]GWo,|X ^|699JUPRD>=T Q oj˞lΫ>a(ҵfZ%=p-żVw ҵbV (;=wPmgM0zusVJ&˧W;4 Quqҍן߼'g^SWD tC `5bϢI,NP "b!; sŽ M,;^n2e |AP7yNe\$XFݒ`lf7! m"f<U=r@'$ )\T.j)/dȨ2I6fwN!Mq ~' # iT.t*\Tr8\D8 $?'~}j8e~n 'K ʀܓD"&"wN{o&&oc?)gU!Dz a?q4]aܗ~4s;i"1dFQ7vC0&$*3?LHu!:)CS+D}Si4*x[Z e0H/݃8 "c/Z^kM" @&r\3UwU<0[TNoN"]eDQUWէ Aҋ:WQ:sK{T,xQPӝ o)$M?aAէebOLi]`wNw~GtZQ[x{}ӷZ`]wE4O^pz{TexyM"՚e#7[[8䤆;?mhO׭]yאָ&7|VQrί7)s{&Uzm|ۈ4`e:Nsh"r(gΘr blƧkjnt;CQjO}㴸&a k]1cbVmL2p:jBWu5VxE+o3TwP>?@ckD^r=G3 4zp gˁٍntsk@L[yPBUqE zX.*tU9 k^[{@n *=$4#E61z.ˎh|_CXmU9sߑ`ǬEj#KvRgʵ2o琕ᓸ>=Udƌ#kp!{f}5 S*"@w b43> k}.1m C{_1.[Qօo?HX1=**Ƶ/D4L] UZ=$>F/Dq|/_o_,@||z<֩@h09303!=~ƖT|thenkf?aę{d\m]:-/+_&,y8vܺyS?5rsaSU6vj>F&DKED#DGjMQP?xxnsF&riV U$@z)%+ux0CtMօZ8Q0B|ymt !LďADΐtzvM͡  %̑-d(JWCaxJȷt's47]:>s֣GYB.W ᑙ3v(]Kj&dNd\q.T.zwOj[փueU[bRfb$idJ] hcGBlHD&Gu}N~ljN ļNoJowb(?Vv~5ݮu*-RS6I{>](B72WS׋B0NwBXGo3 +b99wbc"cA~@sQ2|gN3ƆPOilCÍvsqNo-1HJKǩtl*NTR$1P,Det\tA"Ky ^ *4DSh1P(688rړv {z^dm*GO\ wT_ޤ]vGjvdNyGw x& Zˠ3. `>B˼yK8G#j#R_b sye+Qb w1Y+Hbhl,`c)G^dyJyCS?>YN(D'pB5LBB[j! VZXDE_PqdO:$ }ӓDBҀ0u(ˎ05 cU\Cc CEAe[\;Ux*<1}q?/ʫ\s;~ICG9||25kK-7t%þM3^ &.pzS1~c|e͡>Xi+"']R;Xo* YLw^eԨ2EYQ։T.(Lk+V\e%S:M}^eL]9 /hEJQ/hu}?Ċn --)DaΚ&u_48!C"Cf2|付$~'m0&7%@vy.Svоlsn/%|`o qKu6C㓰{J `ꈼL^:BRQpCWEJ} %G6XzӲ>~V;xPnwS/wE#z7]ƎWOC;ݒ_yKocI_A@UF8i` Yu&i5Y-@2xs-`FZޔHVA񈐔h0N􉕼`mua#9)INjĘKOȳ^-,dwpfjc8؄.BPq*ׯҳoW[ ïʒXrq Ze"2?p *^@sCp2'߅ GD),2Q!qOآki޷x DϢCTN£61dlKƩw<0b-sliP僱?1o^h.ٸQu94s]3hh5dz A'+}#9q>4A;-b;2UYw % upz O bq#c8'$5pB]fZO7UEr0bb)0" QPO/N@p zn8S+x,.'eY֮ u4/ ?ؚǚNK}N5 槍G˫&S]+W{.~m!V꟧}b@4Gs#>YpOf57·4[|}m3yyH6'ҕ11Fa&D*D=O= trDI\2Pe.VpGБt`}r/Ʉ haVgm仺xe'4>!w ycQYM==5ggIֿ}GO̫큝ag6ɴ/,v!# t 1\WnU[mYƅr,;z橱S"##(m%WܕÑǘa)uY|5Ӆr~&#۶"(puam{?"hQKdNsQ8*uM`uik:٧O|T}~M9\~g4vCVҪc|,m:KCwɒd݅M686ڛR0lLjt.r`gճG'OGo7/,;Y', -%+Tt$=pbx{^ D\ľSsWTlȖ{k$A). ٨ZbW w0ZeNZ--%/lBk-~vӰ+;n_|}՘݈>ƪ>vݐ! xUUuWCVFVµs!`R>4IJ:PLi&0 z0'Ee+g +!.7$;4?z@m*+;pc˖3?wBst1G/;wK~B>T&Ƹlܱ,bvҎhAjNii+ 2<8؆֖%D8MNӳ4xvTc.v@=|v7vDH;= AX۱ё˜TR Yt4B:>prgt4QptXrPbsƤe`)b;1im Z&](&=F58/.X`$t+V~'}ȪeVzN'9uԐE*nXgG/S=5%7=gWercWoNώȳJ_Ripԯ)R1*%A ǫ\+\ 88"\Z~,caSƾbaq;(|8,h8ęs2O0o^+.DqN|ϧn#gl6y -ǜ&Slm~~M9t? I5-`P0턀 DmG}F47V?Q֜R?A[tkO=(] #:ؚ]V` ۖ0.)<]0Jqʏ+fĂ ?pE1g;roMŔ;NIE\QjRV4-Qìu!{<gA t.ŢoJXnF;qc8J"ј%?*4=$6!DvlHl\|BVv^iy:h öa.JgMGe-,~f@ |YEiƘ* S9C⣿]ߩ[|` u]G4cJןP3f́{OMolK%Ԛ*XH6Z8Q:t:h޶ W D[5{or~{w{R{bRWi':}f;<] /+{ZR܆W`HV {וZ4NU%P@O8aPN]V۵K=2NWHӆKq;7fVkjY[Mw_pw tw7grF?mjVi6)&D cFgO)pcm4TA&Ȱ(+p?À)LPn''McNߎ7uR+,%e>= x__J'b_TO炍vYC{Xo8-F2hSR_lXw{݂4v2nnPhys@_ytd4lKШ;.S_ß]5u6`Z+L4 __^ѭ"ݹ (uWھ,#k M7(@w HpCDBPv0@#۸%bh1&1nDq&fFsL7~xn{T ;=ndNfdCC !R~sG7BWQW-^Ky<Т/h/$߾M›%29i o/egY}IO1N`]i:~nܼ,Wh$jZӖh?8uWʸ}L#scޞ8k5*6&:B궤ɣ'E.M2 [XMЍ}rKYÖQ?JC1QufK `gB9&0d1w Ӟ}\Տ}۝VK1c~؀热p'.|-3 >q^ _2~g#W ᰦE%|y(“JvwGpL,it?^ OFør-vXٖ ;K1z7kqug [foҴXoCK7 j_0Ĕ]{U3Qn Y)0@sh-.D`Lsk/H5sl^7|kRԷ_ʙw%рtΆEXߏ-ڄf 35per/Hzo|a0+ ƭ[giθ`FY+Ҳ7%YM,*}t{D o]2hmz(~%87 OS=.;԰ O\6bsZH0 @woja*.5W^(c6J_4@OOC]8ie<]ae<_S:^#l}`Dso`x 0;xZ3ԙU-xv swїWEK7OMzq9᧼=}qٶ n8 Nbk6lo`!@`%>x֑GQ#OBπ%CF-ongJIH6г op =[ah|loƿu=mCݫcjKaC8[n0xSByeswrQxwkԸyh pqCm!Я6C{y/| y[ټ"G]oX-0w\: Qq1-W-0|o%@ҰqqGwn,O9Ҿ3fTyߢ>@FĎԫZPCM+eja00 :-Y:㙝cW >rۃzyӆW':ha 2O!'Ti!y 6어{\D5jH뽡>i-Gluk*u(O{"QN0q. S|8$|8kTm(v )v2d,? (s^TWB\w7?q̻a }.ġk! aǓ1jd0, .by1-x]0ON63ސ>JG3t5oL%I3ԍu>Iё"Vn\FB \ KUstse'" 68 0ߠ3VZQl:yn7ې3YIcyuA9V퉰]y`֨(Y؂@+6!Ǹm94ci0f>m_ ʟA??'˘v~Boq~`r1#=F^ٷXnldv0,>| ,`& >>u|-P]Ӏh6p1Oz08xIۂ}O-IysO|v`? bq[%߁=W VIq;G!c kx4Bqd[U@S,8$&G=PO,@!}$` d!x aCa04t$ QO}_hle<~-LfO#]vfjdV{y3`tY#>ch|7wUlH0^wv%fRՌ◿(%aO2o/{ j@U}i) z8}# n]Ӹ3? <ȹg6L5pɿp\X]A-YV:;QOE`@}wnB>0l30` ,1dK06zbr؈o{ _}Gr>6[}.m<|! 2Yܱ)Q)d˱" Kuԟ?xf<3Qf %ai9q>){1[!ƆY+uǦ)8z1\\H_` @o0YCߺ0 aJn#'H5T򚇞82cm;ޝ])k\ͳz}5?YɉIbnnƂ.ଏRw쫯ʹ_NnZX?eic{u)칅ސl%\vg{wx^nLsWfu ;bAom Ђ?xO>\%WoA= ]@'_Z®4*?dX6NEU %e){Q{/ap=? h0\6W*{:vrFt2KjtTJ_#)T j>Wpe[Ȭ R 1zN{ۤuQ݆I$3j̎dw\) d#( F24ŃH]_`)6C~L< `KBI먦It_ Zy!ɲw|SB~=={|a7azZAn]43ٳ0Z yʃۤƢVawU/AµP5_\y典x>U3Xt-/dyyy&=۹ܙ쟺- O/9?Y/VƶByx`y)K;~B9P^F!Yyyaa3+SK2(3+{L޿bpuKy6' {W$iF)d}KvRST1dz SuI\o@wt(+7,;9wB1HI=T=< iir:r5:VI;QVY9e?27=WA}fpb8JIu5T3O:u60KAઔ擩|x![dTAFFS R^W B T'%_mWep^KVO2]TC6fPGAr A]aҧ;ߠijcu c.ԱC/ʢQK(Uûsw5!Nثϻ{Ct0X1UJ^CE]ڍj X=u &qB g ϸLy{W:XM ,8edQ~ rwO G Udj?E=5: 2hAC}4j`Y_w8UKp3y09 F be\g * 5c@joQ9=]k>>7խvWC{#whZr`;D%6^mٴ@r9h:, 68j [5U_qp4oY9cy;QԣJmJf puPU8EZEE# VP4 3A~ H= qO7 =>}@]ˏ'wY|;ߣ\X=_PG3z:NJɺ6`qIl |1q} t7PsPm,@N`wT;}}BfmSg`.yX_pJ#Na!pµ -pa~*<VB9~톴di *;˾#T^߼O +D/H{lM5_7o'_.e >"O>;W5Zj6U~/v1ـt_\*3zE>,Ow ?{]xh6O^$d삾bic(j|;^R@ضʑi6iUX P^@QޔR$m**OU5VM+mKKzݮ=\rw˽x'mŝܣsZ瓝wYHh:m!Uw%u[U{Kÿǎڞk{N>Ի>ﻯ5_DVA' 3D=dϐo4aB%j}9bGTX?^#sFY5zd7//ϯ[~vWGOoO<h8p%NGeźSu=tttuVT]nnE#=һ{up}#hPШA_@ AC!ɐa(2,2dli6ccqqqxxxx 6? r<|!BB^Q )9%KCW>6SgSo0S)gJ2  K V "lhKGuG7xL˜< G‡cg/#|_xC^{kcE^C"t1# "DTDl/!xwǍwF<y2jqtTtBtJtNtI[wGߏ~d1Ǜ V Keuudh޴'LșP|=̪))zv6>{ٳIiןysWjҚNOv+bfMuruvCzTzuư[řg>Z.ξ}7:+oɻw+nGymRsrw}~o΅E Emlmm׋7 .\uѶ?L]c%KdGK\xYyYeÖYV @+r_VUW]}iMܚkίO[opwà moeӮo)+!y5Ջ[ommw UQUqU[}ow;KLؕ[w{ǩQOok;Iڗ3y׫T߯yc>_3&&&&} ?`<0@́R(;9P{W9;zo{jG.m^Z_rΆ! {O;7|A#?p/54ji]Gk9z襣w>8֢mjio1[&䵔,oY۲eOKmKs˙+-wZ|L:qnj?|,Xſ_uȱc0_h6*D @X&s͆;96߽wKEgGqޝ|8`'#|G8K!^GaeR_}zK;4X[16ILfXc@PnXA!5@Yqy57X AXI7'o)E ܁h J._0;A>~ Xul!0;j'ar8̭Gqh9V $@.M{S!h:JB3rLؑ,J8it6JN@+Q8{Z֠7|&V"T_`'B_a ډ#)vg@)H :>Cr]B{P*^ yW @ %rȩy? a>ނh9$77;;`9@=q71{v^}p_X,%A?xha#Hq4b6Ž60<N -#8?8Ghllp qx"sÓd8q*gOIx8?Sgtap689y\ qjb<owN.|/ċb/r~:D_[F'p z_ƫjzoěf ~oůmuމĻ[x7#ރ{;p5Ч|Z\! #C܈p3> C>S4?g,> " _—簙 [5|7[6 o]|/>+ ?Əc3'l&P"DK\+q#Lҕxnċt'=HOҋxޤKd! 2 !C0Kd$#$"DG$JLph2$#I$"L,J& &x I d2, O#d:I"3H2IRȳ$"O)9KΑH>#e9\!WI+F&"W%ȷ;=HB_!o<& ?_ȯ=L?Дt:A2  ha[&]ȌytN4\[QtEgdd/plwFg33\3ڜQdb2Ef @ ͉Ey5[qj,l-rٜMhg-:A5WqOȴ̺vŴb2KR(B]sCÂhAܒyE ..sg=atVwHmFvm>{DUf+v../>ȂttI/ed移[KA:B$~7LB&!7 \5 \5 \5 \Yg0Wv3/S2'x< a0CH#E#~H{H{i|G H)#~?J>J1JG (%~Q?JG (%~"?ZG h-h{~?ZG |7 |7 |7 |7 |SMFYp`fYp`XEp`XcX,","-"-"********d`Bz:?X'd`u2~NnN:?X'd` | |=[dzԪ2p\;],}z@E|ƃ_~^<@yz (O/P^_YY |Y/e5_x |Y/e5\z@ƃ_~/k<ƃ_~/k"k<ԩ(+:p#r8%,HdURed/Ȅ<- ɍ"Pp`8*䗤K+)ed)/qCA. e!xMvi egHdv~n^Y{YRyN{)H uP-@y婴Zj+kf@;*5k7>b `N71r(%9X/bαPcxa=`} K 39琨[w,?ݶ ?ݍ}:p[nZLܑݭ]6P0.O6bASF:sdI'~|Sy)v ;3 JM~:$>Z oTqQyfQv ,6*U eOK$849NT }^0N@Q>@ˤӥø5*BƮYGjp;VuhbvrrgY~k=fN 3ժRc~ZI"UjKf=`W^.aku Ϲ93kPKW,`?PKy.Fhangular-1.3.9/docs/components/open-sans-fontface-1.0.4/fonts/SemiboldItalic/OpenSans-SemiboldItalic.woff\zct&۶m۶ldc۶mƶM;立\Sש3=5]n Da@O~sqqU?>Hpu?ul@$T~&%VBEMA/!۶ glc[C'ԸƮ.?~ Xt$|5Rǟ)BC- |:D-L M@U?:dj !ݟ:Hᷠ-l]@?jymt~8 ;Ћ~ 7> gwwi8 D88ؒ_AdMl3OK''K׍ L vA )tX G?K<u]e9k%T>{D֠HzTGajdTY$*]YSr`_+ʖ!r H VBbbHaϝI,.4'_ FI}@20`DqQUwΕSeG' ]X&>0 'Toq0)|8;*=+ ٪ i-Su9596+~RIs_4hg<'=ܷN JĄ/,T]>5H=N+(AOa/]qyh N;Ĵn1J3Z `jD_wrZ@0񱁡G_v6elHL l,w7ީiAB1x*fP􂮢M7Ⱦ e Mg*V6*IQART = &6馤)i v}A }F9H?,.׋_=On'@_zb,2Vr|9rR|-yum}E%x|w!ϛ/f+љ%-͕O٥0W:kC,F;eKw[m8ں^\QJ"6^lQ>cPyo/3;j*UqG8{8ao7wc wn#zvDvjin+s1x/kV5UPwKqOHttbC;C:i /vQT2ir?$=mה@{vaZrZepa } HZӀ@`ps!S`8zۀ9`0 Ht!@1 bNym!-8UBu8?쒄5c\:F:}JA*ErAq0 aIl<<3,2n'{vAfEb O$t,G>fG؂"yW~A{ߓA)f9̉Y,o >uCPU7FU'SulZY2-s+āێ{Hm`͞ EPިbϜz[f$0?0T&s _.9b$e]= ~sYl.de RQhcTyIY^&+˞pQКRb;Z;V˧k'ort#X>HnRVu%^ wF4@74HgYT9J9ȴ,Ojѯ#0Q93P1)"LEp5\)n RnRHrH ot oE<07szO* ;zHbBPCWR i{K( Uܢ2A*+yft=¨ iA9屩߁ ^Ķ r'h55AlԲ,|,7TCӘlk}k3AKi ' )"A+)> 0_":eDsj YΕ}/Yf<ʴmF*^yGv~uJ4"DwgD/.jeWBBcAj_n1TD4B.]ےfPتn}!r)QNs00[@[Yy&?o[Mndj\Ox,#ЀLc03Oz'h9=Z6[|yZG z}KH! 0)cUñy /X${N/TVu Ya.sux:w۽6o.m9bEi6'XHB*]S'$ȥu,X ӶWc}7P'uU1}`^W9bEplA`=vǏзKfNǙG&whn;c":eԸpp|2 տv %hd8B?TڥHQvhuu@ 2qw9濎0WNŜ{J/qv"h% ɑ ;l rt&ᖶBL IV&] UU),b%ORĮ _mܮ4OjݬkOqjMX*'ܶp=l!l>8Ͽ.OeRdap,U&5@EvB0՝vkG_w;$䗋 ګUgZ sEDPr QV2bs\OJ#>nteVk;?U:Jl匉rpe<& ,70j_O]Ws眠6-E `l8!븠XIFKlFElR'] sanJ<*kJs::bVP8nҼҤ-DÈ | &PPPQ`x{C'*qcKEAحf%+hFe@S$QQ*ڱlNJu3oDs3j5uT6͜%g5uIa.Y$zM~b6&3ҩ^NLOu nYc#GGS}OCR5p Iu+LwU$rsj Ϸ)1Wwf_Z1}GApkf/xK%MoÏvjh_dN6,l-)X A ,>i-"ZxpĹ/kH>H"uNN(Ո^}зT3D\%ܲꃼ7,CX%ҫq]w:וzYURx):ADQLt#/Wͳ[l pN\B89 W`HcfEKfRReSY^^ydEjpVKlmeJG>EUN-j#$*Q5t$E5c|tPeæRf Iil( aHUb/GprI:|H_ SYwgE'8|jNUsCU~_V/;8KVҎߏi63-HL8@~%ƮE_F~Fi5ߕԠۮ3-'ho@~g\K@jUyW0MEBÌTd^[~V$>ۯ\r5-~pms̀`@ɭ@}yO=͏-U\ݗ{9!mS ub׮]zmX 02Ӯٛ]4^.zfti,@y4q1̅/)# XXDD 1t67}* Vg;y@tN87FOwk]BlƲy0'=|[4.>cseq{rvp90FbԷpfyHJc<\=ƍ5ΥgOVl5rgΌ@L!\j@^ς_j[1~oڔ}̵RaiJZP;evt [&J}SP1VS vίsp{֖#Kd^Jia.VBόM$(_Ci|@BPC!G<A>wsXź_ѣLzkA 힟<9 t WewS"*iɕ^RW;O*8~jWW,z^4B1nq)T=8PA9JQR@+uDS躬,ep[ϺE)Xψ0#9 ! 0{u`6 D8O#")_WKS`[I~l"|m.3uߺVBlR8RupJzh! "ca3ۤF,66$1PT0YE/'>}ʹf[632[jee?.4_8jy%Zg{_p?3(z֭W[?BZbgS{z.ZsAIt g}wpӓb*c-rnq Z LKu [/;gz~us>vw8Y &L>ݻ=t`CkT|j»Ea1-e;DS5{y$;+\H2j녀2wqxUWw(;c=03)_?Ṋ׃riQnSTU.yjw$ƣ3=[cYRƜ6i;}bS]9 T׾nw J9*f-"(x^bngNجP?藛'q})lnS $}8:g:ukWh٢'b/X fӽԲk֛%t Mti2Ik$BP)$NigfS>kZ}jJ M4'u=}dy]B4n73Y0aS:7jmէ5Hk ?k|읹=;Sʒ)*h7q $\Kueo2rPUJHk ;0 ^wy$s8 MrgGpjsZI#ML$Rf:R /giãZhN( rEfEptbwI±3>?=!@559!? "j$.FG~sW,apX  X0+Jg dNBtP.=ԫ+ =WMvk|p$cV`Oyk4;\PAjA/{T_ӵ_g[$`g8DD~k;Dj T UV0PD#V|!_!flB^r .j׈ oE-Ә)gR-Nh&O? Qʾf0gA vnxlQD0( ]ǀny#qe缛{cGvv6Kms!24*>3޴F- Jm3cx"쒵{dw-q8a#'B?5Fpr<34~Hy 9ZH(v\/exNgx_ /kŸrSLPb_;Cb_ŗWtwDSwܰa8 %.H$=zFͤvܐ[U|/vt[4\Qօa=PqH\t LB9Œ9j!]Nw/o>6gB=$]zERXM4>] ;Vzf 4 }lK{ thN|AʟaO;sFV>Gs.+ ,^'O `ح Oqmd2g Ihϕ M>h;iAiH-)']atDLo[w*kv&N;`>bxjq8^kp-_sӎF.F1̞<8e bCc7k-0lHθCyROIaX62YS=yS6׿F\^Z( ~H s 92XCV% PRdr1B8Y>38iG9~E_0 v:W"K?{Ku'U&m9oșSgiQ9FC$ G7,u u*r$CcA聛xz0X8 2v?wbmX YS͝Y`R^gK|V&K!c" }`(q|~rJJxm5Zzu*mWa8ޯjOI8 ײxV98>dFG!Z9N"l&2yQ}(9E?w̝`.˩Lc|\UE O;-z|~zΦ)̵qdtE`brP3SM aUiDP夦~'ƹ ~H"g "AC#bXI pfxIb:Х~ׁb&&|KCI4$_TcgT4 `6iH2{bl;&2=M>Qdp7;PK$N`AG\ٖ k)jW/ 4/ڂɒ5Zn;PO0nWU67% !M |iG"[)Қ=͖Yb3j#q:,\Vb?U1CyyY6YVSg ZЍfַ`#,%r{r/~DCِf՟ʌVmZaz0'7}1;dyOW6bBԂ, OOK7PgoUmQ|X(zuHXd{6~`1E8ɦ_jl6 FLyn<_!rigkPa߻uakš"Hы- ~4e>YgY r%bLҜd7 iPGU3=ocUxA>|! %T>(nhO|VfYnᨠ4|bd%72"qvs^;yӟB0zX˄Axnaɻ2S5%(,+ L$x "4 > jׁ_F4/sBסH>iO.]Pr)8f7Ugn6/\rYf`@a~2;cfbgPoCmǺ<\)y C"Gug^oIB=FL'jlEy)7ofT#*ɦh:HMb:%ܖK, SbpДb>OxyØSfMrTma6}M ? eȁ,mޱF2e3GU=$ۙD!7L\v^_|N,|ۯWs8͝|o>^:mju;ʝzZCB{,[{^8o28jjֱvv7 ~Cmw):4ܤɽ{T5&V?xmoL!BR +W,Ţ?>~2Iqwcb wek+tszŤQlG/p=>@!DХjQ^vqQ$B 4N/ۓ&ʈu_w7yOX|at]..o`SMk O5`foɔFVĚ.AWAɞar\Iu^b' m~ U`nvA Y)Hl?foKg! &3ﺙ6fk퉢ܥ̐ * ))p:ZsXdIGfttӿ*0GwЫx-X*"-KrL'#˖ʾ0J2m (|pbt`\2tX/g/ &BQq'.RhAV"W) R!]V1*)7ySt2h` bp8yR Ƣ8R֦q~yl!K%p+rKSя ˢXT 8K~Cd9nAts7#de^=0a_<#|}0H ZO$t88?[W)c0"$y,0=cFɜaYF5!h F4[k\.&\DŽ\{ɃM2AJ {3i KS诙J6u)d #!xrnZy9z~g,>gÇ3a_`A `r3,f, )c0G}NN3pe-]Hhe71wg 6d{0YY\ eJ'a<隘ա;8q-i0c|ƱmqabZE}>,K`^U=3sdo.vsst{IcWWl ] "$7}#,WJ]"eu+L5iysUMm9*lqGcɰbAp(ڙyB:)ZBy}5˞Mi\.y>ft{OspFs}\BYrqs˰8D^.V6xW;zHȟ<~]1.+!$B,tҘZE'&`r%oc oJCA_6)S Zq 9$YeO'`d P0/D(/tZYPKoRa<=6KnznŲ)Gw|*DzֵBDY,p )8;erɛ"&wشKULn:gHEUfO>lÔͶ޳I+0?QNUYП`\ V;K3=je lM5o.l8@U/-2PS&b(if6L,Jr57Ko@i "jpd*/־|"5˦Ev9j׏ hz?JÅ >mJHڮ}c}om =EoՅ22U[xkקykbʎKar3@Ilp_eG;Q M. jLu-I)dpKġ[%2}g.fM.M0:K@ܑš}  ʌI]4[ܿX&8:KuG+i}XؖF5<גI3sEw 0Wx0_̕BPsݼQE"'468O`LY2Xdv fWw19p$4BUW0/?͸ /<,#*RCDPr &<7=cQCHtST1!fS &VlZ"Dʛ BUG׬X]vn0󟬷|(8hW ︄95Ou)Y[9Km0a$V>|SLqyҎg &=i"}iuGQ{e 9EߺI`@A:7+n(ƙ\௳mo|LMvGnx9fqUSA5,pr_E R &z07Vk {Ytn9/pl))/߳C58E\M27{'%ܘeLDTy2-wG9U&] m%o8ý)HޣN@[LWZI&3$-@D&{:YN T|4B!\%P L0k$>(d9BrۼwPm;~"@Z޼(ڷ&Rj|tpto>J8 1F}Bd<+|Hkv s\a] هLRk[|W۳tz7!J9I_nn y_u:H/T.iN{C6 i%3"Nx07K@S9ݐ,zgb0.>n֥wa8Rű$9 H q)5=B { Ŷ@qTBGV笎2q}| LM}ZVNނV 憝%3î;nԫ/5ԁv_nzN(6Œ}OnFAh=3BĔO-U^B8>q1IWAd z] .緬\.dU\#9 Gk £sPB3o#/7o'ZJs^SY Z0`5$ rO'p|CKVNG ,9,?Id^#V9!h|0kdM?pDVƶ"HL ѐ4@i+mZĪ`i8X$l^lG_j [8'Q(_ Q̇!+Ulipvo5 F%Zt:mK_M^ƝjřԞVpID) j\U6J ]+Co>xdİ90bK3E{0ן`B@Rl%7-HaU^ErĸZiOK0:ZڸD1N%devcJ:CB{ riuY>lz$ r|+Z޻^paG(_|d cWW7@zYd(~1dhqm> sƼn};Uޙ6qA7U-\78Qo y=Z "La?2͏7l`%)J^MV/_25{b :5 2/=s5~i.ܩFTy;]7)1j:k%9<$Snfq0lfĞ*K,N 4u2 7ɥd"j}/5^yJlFs8"m_sq{-&_#<&4=ETG5ed(_l8ߋAHI,n~e$utPU_@n#l5x7@Z=茑sBy0:Ed80}*<}0f&yucDk0'١vdq}qԣ9`Ёo=o_Իa]su=nٰkMt?P)}FN0 L= A\Li㻓+ZR?aC'*ϙAjM&mHoΜ0n*`d-1=Q ŪOiiaͯ;8F^ |Jy Y`L/w{D%emG>Lq=Crx(Z<ŌohMĪ։BfWCZ]NG?8SN rN+U 2%qV`VſV1,8Gxeb R qqU[鈖x|>F t2h?3y1Cvx+Y zpA&wӘAfAR\qe7aNE&/@Y>Wt)l*Kq+a[KLRo-qᚯz> +شխLX8zاAugM:SV pU`+]ep/i218_bv Ofk~FZ;ƤYÉ8N݊RRG'{*+0o R5i5?х__ԏh3Ξ'ϘI*^/^.hZZ mݘ,媔;t'11ҙ'YwLvu{Z2r ;qo'9V|NY^sr=rV`І=$r-ģڽsرo>-^5s@{/61Ig56&}[Wtߨ^#']Xգts~ョwm^~;'y1\%IcG<ɹ(]_RZ$;"Jg q_̡y;! r"ȓ<_ɿyE%Aw4Ԧ7VuA7|l}}"S_sӉGՓK5\Ww7nZ]'ϨܶUmZ4sw3\>/\]HlbiVܥ&/:ni#$a4 ǜ46MOtM[Zs.30agYz j A$$uxa nd ij)s;j2k@: Y<7^(:dٍig.npˆ4 jޣ~8vicTۨA~yeڕ?1Ԇuś'_6g{3&1wi ;wC+a~V*gq 8Kx {>#$g0ϙ?u䌔-c~Lҙhf3]z8eLNʮR$SKQ{%-:qg^{_aa<=%톯'ҲC6TvM6,u3SK)iChzH+6LɹBɻLRՐ%V+"[m+"La-#KV/m'NdK=4M7?:h\;c`Y&o*\BBAHB\qTp99r:NGF6Z 5] ^rifs,YN IZGVX Ry^]xjDbr`ľzzsz:'W0]+=s yҴ|ci+.lv)che:->0|u狿Χ#O?014=`hM~G'&# le|81 z= nO/!_ֳbm~Qߘg7jjn}Y> J^,ۨh{>½p>QEbԁ`Y1dNaoLJK|qibe;Pta26Ä%؍O+Űpe+b"⸛LΌ~p\颒h2[) w|ּg^*Q+ i>b ~_+1,t ޗ럱>KqRɮ.~- ZMW?jP_n$i=NTP<G z\ރ ̢ϝf.ua̢_CUܹ$pڃ+ ExYsY^skV)9ЊI):d?&$i`{gƭbn^&}EitRas,M-ak eHGwgU: aqZ8̇}cZnσ8&FbϯnN3~W'Ϳ>TKSGsWK6HkFpƫ%/f1_( pվ)o&jX܋5oӤO1BJLh59 M.F$DpPjdz S<쾓aH߁4M{~7e9Q$z-Bq-AbAк8,WgdEЬ]/t$ަbMR+=Tz+ SޢKo5y-/%hδok8ܰ/63u-ބllxM0ZמMzH<eМ ~یMj}2E /fIk;E"mp޿[[4n)Z۰߄W8h``ɋĨd}bȖ.`є򀁅vLϞC#õ9?cPS'|׼gQu`=b^Xowȉ7$z[/x`VsJsRb}nl ͽT%UgM[LlaM9Uf?[njF y˟\\#x"ɱz,l! CM0Og F+3|.q6>ϟ|3H_04ldO:`BȓK*U27E-]YmBPksBzd},5?(?&,z{00xoTB3J;(>S?4K21kc֨44Ր.;#SkA++u+k3t||ˎMT^v)b&Y3[%As_ 3uYюˋ]ܜၷDg[k1[> _VU^doỉ:DRF?Mv1 3 yVTp^QFQ_Hq˺ ?+bؗ7˅6b0X 0dAPBafVqhl Q46mE˽MEk92Z.Z>ZHw͔Z_Q?h0L*jQ {=z)ƸcX S UJgl;#&ٿՑw'?+t};&6l>֨Wl߭u>؍BbMOucj-&1;@_:-G|ʵ fL6k;B,}>@GNe; KK8 #RZ%d@wB8O;VpsP,vjǝZl ),i]5v*1%i|~u$5ȎLH37kS>sb?#)o $)P;M`a1%hiq|go|&VϞ_n]+ctC$i~e"bq+{Nw-/sƶ<锘c5[gs|:~k,?Zo%rk1Ӛ rxZMiƌVUw[$Z6BHem*߽{~ލcW+rIMޔs9$Izo>C1m^( GZ kx}+bn% ~4`ftjeF IL nXZٶR3.9ֲ5{eڑENcoE}GS ?{? 9^w} qvï2͎^\jϴxMZ7 ] jA XYG S|<QeL+h<ꪝi rnn<VvFw2￴= &a~'Ac~̭1(e [NtO/?vLV-Lresoҁ獻 ݈Z*ԏ/,]=`R]M^|UYxhqyyg@a_i t=9MTd7ޑ?ڹ'ҫ@t]uC[4}" a+P5{qF|}pIЂ;-=] hˀfgt UGv7w:jͱo Z^W\1{]xz dӋpMVRXOqxv "?S XZCG8Vvnl8f,pB42vSpE!ЄT^g5 Sj qZ$j'_^!|]Q_f!qԻt:_3F_(-//TQ̓aGeAc~3dLdR! tR"DDDD"Ei*RDPD.""N@DDEĆ\"*p9ZI{0s29kS`%4JOc16Ko)o힉siSءCaAYѲοV<1a fm[-+f]ʔXB_gIruH9­a0~~t߆n{UH1%q1JI1bޗj1/.|>ΝX1p#nF"E*?agQzy9o/g̨Vt+R4>z\"F8!ܜ\ Q'ь 2U@}PXk;Ϥ_4^ѱcs0_t.W9=24hzh*?;x>ERqQ1o63s1WP'Me nl">핻`+zhBt+S~+8ëH%ّ`6((+e;|~J=GLitii\5q0Lysz+:oHۨa.Զ\ 8 pBj: ~|TטdT*׵CJ .tHڄ/I'SA?hTy7.(04/*SFN@ )R B!]S1]Wn?- XPbP &DTjo3Pf>\ߓR I.$\@+r~q~A:+OO( !Qï{yKG"$Kh|!Dq$RđnXj`-fo6 O_b3P]kB G@-!Y`$IEd%둴P<^g3pUt2( zI  /;TxQP![, > uUv! k!Je3?7Oyϴ y;rЩsM$4[/-soY ?<&Q9cx Ӹ(^#§#Oѹ07iIaJ/芐> nDÉm׻HIYC(n /@Ae ]hJ2bPLр腼ܼRo%&7f7{s;msYse.τ)Hg9Edqt뇷l#EArMIv}{4-^f}[BCTN^nԱnT%uS%Zn$1V[pq24"kZlؠ A4r@t:'N|t?_s#K~Ӛ>~jl۹'}ʦFq#G0% "QK}t|걛jg!6;t$CmKksHd|*u-no8ZU4qPCjQ^8ܐgڿj02srA9o/nVi&rt/ã#&lfUhsa" @@gtB` -a#AF-$j`:ѽ;raA:&G\gNzŰVEX' kWHC%)k)QSI#,!\8{olЌu9szYneUgܵIW_~znNi>qv-X6'[?ag6/h౥i%rPAw&[p:lu%#SbW y.8Ǹz,1ojOyϵ3T'ѵKZB;B+T/!$açrO=sauT7K͚djIvyo~Q}u6-Zvݴ1yvرYoLу\"AP() 49Zoxk^ncsm$cjީVqfPUEC)B\tou$Km'S iGG |8:pUv7ii='Ο{B Sl5YNFn_3$FbL<;\8z *M%ESVSmq&o)D?3,/ q4Zc;=4Ӿ pZjhϑE]Ÿ` 'Un*%B֟.]{//`_F鱒W\&.Ie~WFSb CCgCv` :ωGK4=Ru|I_ѭ]^#>7YY>l=&CDȟ1ݞקnOȗ#'YF¾a؟k$:n-4 u]z }6_rԱ| sjϸ[_Aw?G6n_%N,~r39rҝCcuL2!u 'M>X-w2 7v^0)rA-`<[;',0dd$.fKcn qU?n.\o4/f6d}ܐ5z}5kWr \0b϶MԴxjwO,m/1 B elA'k$1(,= !&+.Qca_^E4sЦW-^5lwo?|rH ?1quBNN錟i1Dicmʕ#Ǹ[A P$ xZMtXj/K/|huc>n𝗇v~ CzZx3aTeu$k$xqd &F $Tx) M0IEv.hF 2}4~BC v{x2jp|ijՃ|]֛v-jw47'9y)NlXeĜdOWcO䋋%g]/=ȞjYYuFx1mK}x~3qHQ^J"Z歚 ._|ĚO6¹3g'>Lg(xeCz6hNY-L䒸Ln?t./7p1aRvR&eG~>dx?A KZ'[Bqe"A; j28F\+3: \JM Lj++ L9Kp;Y% ޸{բGߕ5~ />{v'3_5}O'?Lzl~|xKnr>O|.1-71Ș{ߣfcPMm..1T8?oqoG\u>)OX 1hh-~Q JE\SR;H1vQ@,C uh)%~j0?!?w{g=dRߦm~~ߪiy" IVdw_|bz.EϒlϣzOez_ UPF6-)n_btM/%, l HxsByxpPuN=S=cQR Jꥤ^v:c\B,݉񦄡JvtsaTK2O~q)Q\]Lx7;մXߗyǨm,rڰA^$$0#$O;k"up4``݅BLhz2cwIw!Z$BcdT#+i+Eh 1Ȣ`qFі`s8tX/zdS~?ybnQɝoJ6pm)ߧCW_2$#.vxlĥ/W7._8=ㆽ #?yA̲EfI?,X#qmfwsw_ "_2b >ZR7pjp_ZKi TA}%\LDppWKx+QA@!3Xp|)K+#0]rh6W M\~4Qdn f䉍!KɢRZn0fİt埵"uhaaEo}wRjRO\~}sT*7VsIwV}4Sʅ/qю5:·gߢpO@>٦<@ۧ@!\ HIS'1o.߽o0= Xmp\m+țm̰KE>( Jl<'?8\Mq}s3;c'tՉ3|.٨Ϊk&Ik6έط&m}ڃkL"{䀸-Ą;#-?9n O-[Jz!~qycqvOPq 0<6cq[L6"jT ^!dM[ybCZi @\-4)PK"$(dF30dG[*bd+zd­F ^)V@;EjU}x\ܪ߉AhvԝAZFGh]hWp:`_sqVuꄋp$:HPYI߯zOb9x2(E BKF5 ,Lx.g%^@89_g 8.wjKHM%Oq#WϨ[~恟gl04ZO.'ʦoP:$btO%tcc2K*Tthm*; ~x-/ZḊ'\ !}8w%O 0;b gF J)&؆$V`GE 4f+qܴЫ::x:lo%.aAX3GIHuf՞ԤlK]>SˤI+ `y&gpw?ψ605~~@ؿw7uq,ڇgY szGL0)톈銥inb [bJhf :;gOEP opcHnsE;Ʋ㇜c:rԢouk>V5z-;,ٲe<Il@mDLz3!^ @W)Nž=eZڨ{]JDZAH#F=I$Z@/tYJJ^5DY~~a$e*k˪)w+%Q;_#XA +G5wߚTq)4^-N"+ѽx͊P%G?} 8#UY>9,Xпh4N8J<FGp I{Ý#틞X x?sz3/m:g˵CO>=iԦ(S1 !֘3ޠy tIzePx &+}F̀Fl}T\Sd\ך/b'QIEG%DFTqv܈^k*nǜvcK6V]VD? ωSjBHkF.7rrSwrr/H5 DB9R^Zn<"D-IMv4HM9@c \HP-/SG Y@G<{=8|̓XD#'MN[ jpE-2j[oe0$4Dz8@}!!'L FuWtmKBKB?$A8ZD#>Q#B$Rv1jCHx佳[;uPw7͋)@HY\@3Q0uT*S!Q+ ihdZD#Ft# 8WSH|xCԧ3 OÅtoѨ8 6d(XAke?GN'[+:m⍚Q*5J3oϦ%WOk4Y &+x ^dEi>69bw-|#wjoo{ۤ/y_ xSlPPyA?7MؗGk5.c,xUZ(ຫr@Ud*!,asRJa}s[H 컟zd݉-S_ҿTW=u{M`ܺ?zж2~BKғ+ڌ.LIHcCHr#%-n85q064erd@ͬkM#wx{frpЁo=۰ze jS{e o~Lvm2.p\FrQGH DvMlhQ,ԸlKpL*5=ocK49.y)] =&&RșTyK_Rbr%o}tn䠇MK!RZ(#pj8~^7W'N`]ܷ\N6`;;[x 'ӟ/u3S=RecW5/J5bM/۰8)/ʛk[Bq }p+B*M "Ҳ@V",rRdSjIeѨ36 y<3(ZW(m#;xI)ά8OFJVQ;W~}֠2T u`pIn+w>۵j[uϗ?cXv3މCW6R=CT=yW6۹q#[#NWYY`,jDͭ̈2JhxMg" ]o0M 4PWb Ō[.ǐd7q.fojJ6a1$EV isCTdpoSLP5ࢇRid&+kc&lE!ab723ܾ?ѾJ[7X<\lSm2'ǹ *oWI~1Ab]>AgUq8_)kPG/,'%l=ᅈԀik\uiar6|D4һIC2te~ tD(Q3!m=6h)~U_{t9vj2;L+ڼ{~۷X.5ݦ6i MNTQ9!xN"yTπ*zH+D)#"ked &[P0KŘwABdD 5敄(ͣO_|I{vGo7 kΞ<}͚>LX:M痆Gϛ{C}x…׏c׶~gHtܼ@d(# &/ʠ fʛnDL$Xk(#跤2 $LLSJc<0`gXH5ʃZ^n&#̂Ugk- 7+Uk%#r^9j⛼cs{O,]iG\M̢fV5[k!շ̽|auݺ"2' MIaԿ],E@3l) Y.j|6H^U4.-̲3QFuR2Hϖ^cK k }4J8.@qiR˥BjVf.UrwS\đӷ}`XuxŚb~%>zۦ@c7*20Sdp?3˟!*et7WuZᄱ&[dMàN Ď p2V0-!e2$ 6UMMxLHkmPy-(E$iR@g;}Ͷ _Ѹn!=G$u/܄urerUA,K\agV\蘨J }rFIAm;*N'˹xlF 32$3H-.D|"SDk/j5pȂ̑ĝ{b/B ̷ Y&iD,`no=-d-yqNwYtqrK8\6mn9LCۿCA9g |C  $ҷB{E](_4n!/e5Ļ=8|~I~L(U1fiz8bΠJ! g 8PG/He?"?U!}6AOh\.WryעI-üVoXK ざ0 f)ʗFTJ8R o)gsk;2S0WJmը0ej5`EWU>RsqZb9Lt4wI:b2Z\w佫j^zt#^.Jp܎A= dlGNQݯ.?h.w}-ݴK;H[b*cNCepX 8FN"T\l"P*3s# ; v $!&IC t&4`3 ',!!N E*z*pXFDud:.>#`,PqjɮR&p>I16GRn3?oNqq-]vY9&i+Rc덑q7=/Q2~9.YO|bҐ\;/)wX齻wڄrm9p̈V}ן?\%r1em7ґC#~tI8CCQq*T'D~x [Ϭw{_Y);<X0Urn;qa"*XBZމ>cz(!0Qiuv9IF_9( P@ A*Q#"1^fjQd G (Hn˓o>W)i)_yA* /כNքkOo Kquܗd8:q;8pJ#+`jl2c9lRֻE,>3X)\p5.s~b&}LzX7, /W=x=)7Wy/UW&[E-^[`YrA߾AAmogL#ة$< bgR;PFn΍QFh/T0M\#i,0Ϥx2hv~Hy)S*f9Wm hR.N*3瘓T;r|ʓ' #ŲSiR~MTwcz%*=J&Cٹ .Е rrhfu~Cb(&|Vs!un$fp2wޡhDɦ)zވ?H"v*k*F*(9$ BbZ8w@gJ$!TB9T@(3?SWv*2}vR򷒚U&S?`%K\kqq66Atŋl̟M}frĹQ84f &{*x#*^]w(nmpUp;0>ɦKZWHrZ9D3$zX֐ФaÜ,DZ%ڀ$~{ U8g1<,JKmk7:O8Ǘu(^HnD+_ďɡ/Af]“d}ޥT9uK; 2=(t++\*VZgDZ_\TQݬFJτiQ~C/Ӣ.KZTyYҲdIcTRأKTѥp4Wt^*oN׭vr0hwh}q;9K{+KzCXImq)E%+3Onܭ| T`V"y:SZ-pۂ$L۔da)zIivw033 m*s/ddNlif ۢ+Ϡُ63۝wvkiVi회GZwC0@BxGLeM"v#Cve#/aߋV>W:-bԓPٙ}\8{ԝ>99jv=uK_3oE#Wys\kkۣ{rKrYq(6{iHX}RÏLS#,5q=ʽUwNȆ#`w6ive1ȆWwJg3px )w_-hS+{; P=|ѡKT;Tbiѡ"0Hz_dy=\"OA 2s G!I!Q^ VS4}gu O5d䒲I cRs۰d׋`%6%*~I~kew{/׎m=,\󃭇8D*+h+~qq%]۶$Ex'gnV!Ix< 30Sس SyvC٥4G҇g$ҧY$`T'Ϟy"Ϟy٩5ңf0Xw:}~ҹWt)W<}kgsvh98ndTԲu^ SeE׹%w|({xhFsE\WnRϣ}Vo`d[a}wUڹhCboMgM^} ./XKښj]YݪNA1HzܦbCwYTc?qw*0#Qd ^ӱ<_ufJy硎ʩV S ұ QWDqIiyNJN`u֫5΃[MgU79JťM3a^R@7T`etuN_s&JΞB H̶j{i V/no#YX)jT{X*TїҝX=|iS3jGthf;qT_J">/5=Y_OgEdz{Zz7[-ks`ՏHgYr\?2 ~y|6_slЕ ;2jW/~xCvT~ٶ_vrKQ~u:w}~u թW_:@ү}Pʨ~Qnկ"Kk恷P ,‚"_ePiY կp қ1E~R*,*m¥mb^S(UkHt۩e_kȖIuɈ-3P-˂eƺZF@qGe}YG\P1[X{"P/}o[vLW=.wO\|imo[Zu:rZ93W[BV%^-ߖ/~)SHO~{>mYyY3ZfLʔYAIJoѪWQs}F[N~ SKշAszܪdS*d%hh׍J|LJfo2(oX:gKJMʃɄwҜ&L)^|ȤtAG|2t)Cg ]s&d0#͍-hMLEs/ ^q&uqdT-+}{xSZȾFC|tp@Z /3\Ug֝ ͸K䑦geljG>{׶d1hR +LqU^g?NRrSC$y眝$$x~n= 4{)%i&qfz9ԛ 8+׊enua!38`Lu^*9M~=RevxO)4nQݴ4< {'(j*)u&,| !QQ*yJun˃+S8~Z帇*||4]5,'σIn+(;NoĶ[(2w_5N9_¬^7k>[Hif.fl崰Zm7;NALdq)B\Fc$)g&6-sya[I~`녌OR=XoPڧ5S .I,7N||st ;unKrJQFq Kֻ؍\/ :^n0"{H:؍ /o@F"v ]wzoW Az}1K?1[߇ݸc Le> UCX ֥v>F}c'⌴|;g%2FNS PvϫmowrН?8jZzC.q=OI Z4 vR_]3qWVr UGk?&&ުU"l眚3!ˡ'-jX$+ӏ[QIaou23>cF]7wL.Snd@Q͏|q3zyR'֩ ؑaGYJ?@WڋK鋸SsM]y ` _{묾5֬Vl]VfJƶ~{kȴi{Χ1]X2ҕq*~Ͳm{kVTzoڿ8IyB=S.,M#z B]Xr &a&ҽ1 +YCqjLCa\e߄ctqoj&MHrhV 5p)V>077AH@TleMQ^}PCmJ}j`aB ş߮BaK' 8Odx4GF #+?_nr/KY_C-s4qсqsSF.?#?ej4jv:[teP@ް@69|a-٨XY (&r@HV":t9߉u@:7a8hw5k;Z&yI3Oʞ=MN۸+g?Ԯ}Ji*"̑[v۫|O'e2gw':v]0mpSBݮ׻lJFP%@'c7YعO!W!݆pJW?ë.񧧨40dEN3 S0*Z2LםY|[l$}e߽֯WN |u*u{. O00P(PD*:RR1^*cu>42#tvtj*\SзF57zXF=^9܈ywI{Ml^iqBzn3ZZ_xӓ'=?1t8_ ]/n[_7GOx p9սURAf gZuh%Vh PM2\}WEr?ŀDc@ei5|gꝡ3:P9!GU=|pҞOk'cL;'oIX̖V^i ` UL4kbY$koBg͇>KNG`9OL 7;H(\sJx;;4(Rg"{<v³d[G2xԃf#&yP9*zWCO:@@hh'cHluM@_xh pf6Њ0H`A^BnI::>?S|H/>cAzj<'Qey $303p+4KOt+9"X'gmKу2 &WܗGQ}w1g2{2\I!3!ܷ9bADKD"""",!*YDdY_uYe]U **+G:_=U=}LOM駪z]]$tylۅ5clMץrH?XП.15!N!9{=b)CuK 'ሓ UT&)jr=l KItJZ+L u;\ז {d7MJ6Yr.9ŢR$S:&c$2"ha7 gj#r\"_(f$ʸ!fdGX"HCŀ 7`ĎG꿇 +kO#ſĒTh:%p)>m/!&p,aGjR4kbMF-Pœq8-UOW+!'gh9%P'X 0| ٌ\ X XWA B +%J(ER֤*{R 4f,D &Fq6ů-aN/m+( -&RZ<GiFВ؛՟f&9KI:_댟7ZVO:+wijO}0{(Ϭqmn^be.KFUbMnA).A4@*. 'eJܤ ߒLWϖR-7ٔbQc6٢6 nV,xAM"[U-%HgRYoiꈜM Рffoy694ITԷG[wuMR[v@1 ۔(Lein-KG&&Y͑l*neLTDQ)~זB߃{̔"˶kRū$}637j0n ڐil ~kaߑA%aEu_qJצȾw4^&rVq5')n^v(VdS*81s{EMbW,V%@{$狵&0DDR~ j}v\3KyiZzW=5:mγ6}`.'sڈ\AiCoނRTD~㼞pX8N"gKLrQZ8p-L'̒Z8UX 'Oga}bWN>v Eaߎ<~=Mǣ% פH8Ep Fi2 '!M  ,>/PtWXNbt+Cj>&p1\NE{#xMDE0*<?^cZUƢXd'cت .t㹆?<{[,\ K|=kJZEE)#5!P&4 ]RP"(sue^WFdd,TX/͚ (|C1bJ6bpZdA0^y`@#e~=<-IAHyL|ش)7Y#)Շ&mWD2@E(^ߐZ"qxBB_uɺ?T/&9#:@Kb1 cchƨf{@]D#iNi5]dɜ? WD*M둚(c̢`yl ,s8`>&Jh QzLSsH>#1\cC]ZѽKd"~԰eC7 --24k8g3qLovgaɄH!ѝ4O&U//# - 7'ɥU @2 3HʾiK_m&Ŝ <݉Ed*!Ǹ4^LݒL%iG=!S¢c"~ʰ .neZM4cˮm_P{wZV{8 Oji#n=xaP/g `+جm RfkUt"^n:KdYւ"p:[vTMvX#9>l*|l iL ZL}ꍈIz]'dh2?2<`B73VUxxWuѿm <"_&FN{P{GMSiDm>]5b09R'OdJAF2/k6 C7tPĝTJk7K͑ NbבJcp%fm  5sgim%iܷa%\Hj39ۂ8 n?q*,OUVU y١썄FF܊&k;eESB]{y;=pٻ-(znIz৕>ޥU=Jt 1LTSJxA;l'FNI>],NP uc P ߀FRQiމ}Am27zlhd40/mR"`T1*e.*_|t~` aӗBϱ ɿ[`!pR0KJmbYذ[OT9X Ke=IMXDi`4D؛W?Lw7X4Ova7'G{tBU,WVbOBQ@WF|IHE3RuW&5gd2-d]+*h'wИ:k4;r2}^6͹ [fM}t,?fٴ"4Kܖɵ5Ev~>.f )],~ Kui |Ltt<3!04Uq0O )9Ȥ`"UCaWա a%k5Ii:9㇟aCWwNt51Cd J CXiQ2'y+SrfAθ| qAԊQܺ 70WP^xDž(t<[4}4q( 1In6pvH&!pJ j1rO$V)I#o91"è a\Ri_p2?gXYN] mgT|uu+/&K92ĐY9ZZxQ>bEDj"p*QTD 3UR*G4KQ ԑz3AϱllzSǦS6)L|DO'簖}fogD?s%KQکl%Yĩ-B kjߢ1`5 2M;@J )It̨$;? 'e$0_۱ u)NQ:1$,-LMR#d.Y/ sU{6\#ĉ_adg Ĺ?|{eG MSjA(1G0|@?SLXjIWLP%CK='$((B\A!ͮI6tX?^bٓʐ% @pqe~'{nΗQnuG]:[o:{?/sduKk9=b>4 Cʱ5@Ce0 7A/8WlvwmaWmM[JwM='FMr5䮑pUbdw5IҜeP\!pPʰQ0?! (m-.|6 dIpoc= {^{tnGװko`ϛPtε2c_݃S9TZH8 NTsAx.,jHXM?x 7d銥ҏO=ʢJ{߯k/>OvIe^UJr#>fH5R dW c@ Nnhůg]reޥ cRr >¤h[ZʳrֲDf#Y 귬(z/;Е-m{Y~>$Җ2QFFs=8 n-2S&Ic dM7&1ɚ N^ 2Ŀ̀FT<2}e731W Lw3$-͓!hgYPdV4-Ch=W\ P;DŽ\vܵa2HD-, - mvn\RV7dRha 3{9f_j (=ĺ T+qXiFUp T~dT3'miPB`SP \󰱘 NEn0$ů-W1h"pr`2KjY!l/#*Ǯ ԿHҬo3nfvϬhץC/X&isyύT[ #%U8D6:/ju+"-S]R;$i^KT*M+QB0 lE Dمt% BLAYGW ~W^&>ՠwCgn6O?kL:&ko[36_Hr 緰ohjȠ4xǶ,Jl3<j-N.0>*ʰ&!WNrIHe(/KܛȮW[%(iqX=I5;>nFͨ 匯yAMg-67tze>T Yؙ]1pY^|?Ns˘͒RFR Dq[^f2V<ɢ%w^͆zKT%)] LJ&g[*$RL5zn 4aAD֞ AnVrrOڞ"KGTK1*/;q4̰>iºn+zaouqۿ :_SL9ԉU`׆BIj5ըQ-fL#%rڼt"n'>IŘXFfV6]2Y%khc _eC!,~ll4-FIXj~5T^3蛚^ g%c'%r=PcEX^Jr*WRBd;ru#M7@MAd z(xTX^,,8gbc{32DqKSZEr'WT}>'6K"/$Ե<$w+!\FS;ךf- |(-Kj.!C>NGBg[g'hH/_n- .%,OEC6^:79`;&[R6{R]Tt˥|GGQI"UlZ~ŏo=Ç޾ajW/4OV,izfGtBÑ9lx%?6E,0k! Jc!&j1$w*|*XH?WWi}f"q確S޻h}khȦ9,?-x*Uˠb^ez A2@釈=7` ]};$z<>A*"Y+V%|CcW=n4ku6"f2>I/RITi&U"/Af*];t}9x(^)J.~` @?$asik~4< qsZ" Y!)3 i{ "ORR8,Y ɗAHVr0#(p乀<:t}#J7N^;{ hɯ-l:'Z/GPKs aH ;n%27dHxR[gn @Y ,=VJMdwP]UbRH;4,*C v|X+͉Pl=g>+Ӕ,+OO57MQ q"#Ԣ' E:.PDR $H)tT>g:;{񛂺~*>khk?v$4_R(9N 0BI)P1%ITEݕOUib4RāֲOR~]FCj) +NWel)uHon\Ph*zTIj"NDC/z ?>CIP>֑[jV~'y͙~ehx#м`P=ԝ!oKs")FPǬoQ՝]#j0ɂ|VIk/>w]uc,(J1'.J߀TIe'uo~4EzOsIu̼|W^-u76~0o fuK||56w8"~6ȿ?ͺSx͗XS?K9`005OOT#G&Deiȩ?Qaڈ0#@^x@_wDj>i(~߂i.%̝PlS]UQ7Kp6p5QoTzMѰ#Qxﮜɠi|\U}u!?.} *ȹړ߿Yy&󄣄7& J%T0 E"up6( 0p$E᰽$Sz3I@B"ADڇ%g~Wt2g@sQ'prĶq·`\t-8Cůwf[0lL.=1s |My=?MUnLfj˳7e<yi5 '6F ߯R߿|`F8;KH)r\6Zl6 2AjȎ"Z\)Bwck J(-%_վl mCIy?X̩_3|kx v&o~b2Py~"f|06@dQ3r,>Sf)Rp9MٕMP-Fi居$ ɯbp9+fw1[8|z-޽ۘ9ogeL{(ܿyG|e{g:>*L=yd3b31FG*ɨ:Gԏ2c]Lڿ#Mo_KX~:HlF k5l [yġPҺMcuTR TXd% |͠#;.Z9oTu1Mq;}X]vgOl ~.^+geAnJZ 4hf"3cQHڢu^oM1ÛVCL]/Y)~;Ĉ_sbeU|Ni>2=BkȚ Kd~RTg=y6Ggyt'd} HK>DϪ ǭ+/iy?zvp~J7_%K~2ѥk}d"?JOtyMۓQOy=3y #J,hS&HRN"D0`)CA iT\Ghod Xe*'Cr9e [iFm2g,8S#얲8i' =7 <uVލʉ5/^3BEcM bS}k](xWks UgPLD,7,Dm=Tet$k3ΒTY]C& ːb툎Q1!Db9E("X}3Ǯ>m;֤ `"7 E7}@w%HԒd/ޖD ^’B0J}R&%a+Tt5 @¦+ǙuPڕBVK|ފT  U!z$/0x-=IdNV؈3Xz D]P ➳_5v3wKvi~|>I} ^FŽ`ī׌}je^bE#`HFYO1srE9a,Xj rȃWKL8,mKU0C2_?䰨4y(lw({ _zO^7 }qY.5TCs=SpxM~'@)gaƎOmF" !@m;l]!R K@ֈe %hP6Q2CJl>W1Zq>%i,+Ie(ͷXc)L&୼R5בO#I 矪[^3;OwNz W.fe:-XYp-tgP+Eu,j[5ф9Ha!Dp@i,l NPd)Y8 @-4r do!PB^X\~nEP0{#[Dyk"d`LT*xЪ'{8xN"7= U8ryx*f#ER dAʋ m%+ji$ ,%+oe ޔ#ff< |;'-鄖#AnR'Tkye?{[Iٚ/?Wc{w*^?#n޲rgGfۆϥ-<ZPHUD+VFПْ(h7@fb໥P#*M+`JH9VF9`1l9v jF q3xdˌ8хWf ;ǒ maUؠ[.4hnԚ\KIJ7V*5wR(gGnlrpw˲؎3$(O\V,>;|qz#XVN!cfoLvC&KOEiOD%+dk%g}l[Q=!ۉm><é[ēC,w/2Sw|i-8FQshDK) 1!(G 9܃arJiٴB4L}X9 2ɍ6GTELܔJˑNO3 {TK8dUJeg#% [F[o ߗ&ܻzӅŧb{S&_?4~Wq^t~|^;rxD2 Ec8[2{{`%7qw!$fU1{bIM)dwip g >ͣ7@NRZvC췟V֌K0÷vq%?^r￶}]q9uu5>wdȨy G6 F $.nMw'Gp[``"Tam:5!jf']O/Z1[XX,J= e|%=H9gJp˧X=K$b$bTu`#֌t:ץݧ=ȡĀw,w#Xv/qWL&'L}Loig:;Pˈ?u B'}.쮛gEqŖ*Wwf,^<,,f c{/,E%pvZLإ)2^g%L0la!I}Nu|4pQّS+k]q|#.`io~:u xx:_<࣋}P|TWHb67)^ 6Ba:PN󇝭M4pE vEB9U.&ojLp 5ǂ13^z.Η#o:.}7d  o#tnm 59-'|e_)#v7I㗡o._$nS^kŻHtRӣxn1Ɵ2-tXO`%aϰVHMܞ[oS?]~]=:>~SگO*7XkVow*YD |:;yw_D~FTgSF!K5U?jI`~J]i^LjOIQW>N0ZO4:whh 7.['߬]!OV?YHPңqW~/SoSg) \Ug~JzwFїDIחh.'~]ЋcwJ{ ~(.~|4N H_TgcՉ|ҟ!,֓r{a yC^uDu4ש#/ '?7Dz~֓D | !B ~P+4^ҺoUƿ~hnoߋvV۟۫n^jy|Oj?9h ofk>ؕ*W__J>\崘"@i{<} b"Sr{ȧSD>}<2mKwڤnVn3I~sHվ~8s"ўȳ/g9#G#B>SD}[ȇ`3L߼)˟!,g2=P~ CuJ1|'U~JL*撒O3e&73 JqǠv 1^Ԍ |tE`󤌐50:B]*Esb[->n" \btAis~oo`mj8b66ul{2YRr9Lĵ<EB HOT{k(j}srV ?p7UȰD0ˏSHғ{ ^Ľ\V; CPPzz6(j 7ULGƵi'5ϹCҧ_ר7J4峟B[esiQyL:J|ʔNT}S ރ=Ϲy% CYRP$%jXEAS$epf7$zʿ\X"d&$%ᒿ`7! $3zN?UY}-!h03C%`"} ך&4ƍv~jos v"B:nUVⵎk'-O%fLOyH/ԗƻO[f(l%j6(X9E)$2 ;U}-H߮ ?̒}-@*B g06fhSU) 5XvZ ې,Shz 4$T[]شܮSuair|viҾ#7i+*X~s񍛛JWsc<7qm jϋ6nX謯'-(q큯-$ Y1ٱx;y䨾ѕV\Ȧ.!楢Ũ`3O3 )0fq!wc84M:57vc],b1YfxIDra]q*>P%u`]4UVhh&W&UeųG;obt#=ި}jm?WQΪOEį6o^enSבX>f^>G*F=]xz ]< = ݐF7 >bfC% g,Lnwab9ӗ+T%$C%MhAO{eɷU zTvx禙mv*/m߅sn-SFЫ`̀V?83P٧c] ԣ3oY^NN8Wf&-ATWv?6pDLF"߃Wcm]<~q5I7֕3U۾xzc-%$yE*P34Mn%wVLٟmXD̈́}3ग़1̩ ؚ 㥬x%MTBveo>͊MGKES1d: !Fy\:F wx{^|,NȕyMc\0P"gaU]:j7(P+.(,,yB$R ^#i X|$YTۉ_zJ=@)[TCàB/幡 B4IA4Ŝ;fN~oCaߡLBm'xDd'xO/ݰ擣5{'Lڶa& iR~waFAt/S8[q1RPuZ2zS$HPRIX6Rr$HF4F5Ɗ< Y:R&鋯H fGbJB1)=$N)`%VRu^LțF'D1Sy@Ʉ52G_gIc=.*8$xx}@`1BXJ%a:dt4J|Kgvu'>J* w>;UGv}vqk6e a 'TXgl>ϟ"ch.<,9͠\~nyJ=F לA\ 7HV.v)VF,z1H%`{P9+CDdm*g+ޥ)IK׌@7và'}ZZ +Dwt~ӨGP˳u&l.?%Ț ~*2C6t'i)V%38݀[/¦&;Xy1֣tV'[ vH"9*Q.( nTpyujÆvlG7hba/NyC[-~W[J'2gߺjUeQ~ZVd. Þ><8L>gEԒ 3S ֝T-#m$83W' /"pɆ X^X(t "BZ >K3dR|!BKa AbtA$1k D*km5*Y][V7cϿʝkwAYfͣ@NJF;pZY<*>c8_I|kZ7dRJ&|rI2*Oam0/t^@lfiZ(kI>)ɨL.CAxH.4nNJ. '1U7@ !+=Zg4 b (D>'qĢX2>"T3*Ou=G%xAzZ|be)?1{.1 ښ&>fW;̍3xbKnYT|iap?r4 ,b  fjSOTir3gjjXT.e3ܤ&$5[@y -֘/Tn[PXRZlz).$V-^ $^r$>Ėg]̙A9f x 4(J2(|/6 ZfA*,@! ^~v/iYoſ{ʚS^mhY*ls,P+NF_7mcım(5!;ji<@'%!8}h,j )Ҵi[զ0pnY yc+f#>LLf-Hz{`ޚ||i/\H1!Erπ*N@e.`w.UqХlzSmKGu]aڏa?xbk~u6xqsߺ[L΀eiM% .qI|*r -1F0Z`/,SlEr9.d!Ttخ]o=`wcq[釳F}oy`M|9~~T@1Z.sQ.l(|9Ѓ?17F iif)eAI^gZ{y7Ja]C:sĜqy߹Ӈ+7^^cx-(lJ,x VTR?kBʪ2IyFR[FVQq Zbgde%Ξ2_SKC~i72JbAn)P@Tigxߺ`}h޳ *i_nSF .suU k|?œ^lo7yG2s]]r>3@1#7#Zl+!/.mЁO/W)@?/:xp*jlvOPMN}N=Y`d %* ^7Pr,mM7ֹAqdUVpZvoS?n[<ۨ-=(BLĶ/;zBth$:(v5r!x[SfL,E S /`~0tj_}'1,Ѯb*DCx4:! #JI dO >A"8+HpyjLapGtX}q-p$r9lǧ.߻"75WVN@gO ۙcvv&`9.&ЯvWN;yxA;_~ Sπy`uc2BOeQt|{`Qɩ㠣dgӊvJ/ݵ;_|Y񮕣wnXb w$6ڏs,5ooWhxյśQ- ,l{L/U,멪u|.h4{Z{1S\ׯܑx57L*XE`k9XvBN rD="]:6+=/.b{M$I&b+uOIϕӾǭ=}v!Ww c{WWiH;#ojbB]QHHj|9ܩ2*өsbs濱豱DT(wAc|[w?$-gL `2#xf:3,`1Ke+k?j6^>϶vwܗ y1awfvq OF3{H0nCjzpn㏚? zk B-Xc.PLr\܅^j?&+tOCml ux&i@L\SȥLں,PWsnwx)4G:FU'ՁXr琩8!it ̑X"q x?xQdcq| 4c>ȣٴ <`l9sx2z=P&=/X}bNt/"烽׹2<W-L~=jIATh` Wnp9 g[:򿸵CW 2*dp>!T{l.[|TO6A<_!=~qb_2i.2!g;[Vҩ픑,m "bwFxhv ~?a JGQiڴqʧ^yWwMшӦ]Fzkhyoܻ'quu5hxߨqM['5l#]]; 9CV9c26x> q-ػzN>iM(Xǫvnǵjqu-W%=n7ꦾ=o׫_v2Z͵a¤蠎{ۿ?У|C7voGB!@׍HY$MZdKj<\CDq]c9wܜ)siv}1픶:Nwz"L|)ZOrzDu}v{'Qu8CP%|rϐ+-r<4F jwÚb)K^lQJ^̓O rJ$|]$mĽ ~#}^bL*}SrM*>K!&8r< )fɜ=OqCۖvқ*q~iS_.\HϨXt-%ǹXuL;xXH0#RQÄʠVuZy zvv` 'Bt6f#6Z O5-iĿwLrʐMݩkY{-ݜSWb-g//JtJM#&\YdO89y a bk͚ y(mm d6me}eP6 n. MwN ww;,w`_n9uwx杙~V"&MȚhZ y{CS\$0Jy/;*zFkswш%5Љ+e!Fp=][BWdԋlkܼLPg pt%p! "/}ȉ(;\wlj! l#,Dh=>8il<醥>^,]eE 1c)CIiN7pU-78!fF\l|ݍnm{oDͶ,R6oب晜C6].WXT9m:R sMHMKWeH .`d1}1ԚRxsuom/zdNpH_}AuEEU2\n ALToJiyĎxGsF m񺯞}2QQ< MDR_-BʃPE7Gz0$~ <22^}~|ɢtk]jnY+r::O#'Q yR}?޿$(=NaR ?^Q`,HZOW0[<#[_Ϛ?8t`XZPtIlly-ߐ"8n PM2R7Կ$ JRt@e=op۟x{帯.#+o\w:;slʯJr?sTO698a6 ؎/`"#DT#*E3B !x}1HP;Jm xh.!3nuB| ,r]7aUoa!ll  (KD>gXP`Npdinvyzb^_u!| $}HH0VDpmkWyr >T}mETȊ"'$UfԠPƖW؊^DT4,z;ѪO] sӇJ4ni#և먩M hDM(l7{4nR& :zIգUQn?w7 i`wڧ iPf6n]q;apRr;%BC1OٚǛ |I7 B4w( BPv]'UDHjnR&ٟ^Ƨ)g;:9?NpЊ[[Z*b1f63JfkPh\1N:#|? Ƶe(ץHLr˙Jg3b ǒQRUsqmTOT<'zwhȄD~ c[`@ խ^ V'B<)R s绋$86_D*)+ZەJ[p" %W,ߏ.Qnʾ6F$d"|H-D]dySw@Drm ~vI SY@ U9#{(0V 3X{+Kv9,3Ai˗rk^'B{Ĉ\lAaTtzR.N o ]pI RߠٝQfKGI^wç!p~c!$#vzsgEsW|ֆmzswBOń3c`mL B׷30XR@Ṃ*zm |SӾj{ӗYL6 IݯlZ<7{b߮,fk+F}Mݔ;cV]0:!O>vQE`<̀K !R| ?L s:hsXM&jFbJDbQ>xm©w/mQnh7[&U ,+B߁=K<鲫˗ȝ@})L])[w .S"؏ ([&W3Wa0t "Y>@n@? vFE NTH˭zblrn =:}q|H㯧BӌN<}E;[Lн^';w~![%W$*. 0^̭/'i k">>KcmV zGOZcR8 k E)&X$MX뺃ߋg ߳Goz{=TTx(-ƮGX,OQφ+'eGܵT?s,\y-1ް+mr)/3ܹ ӗ,}Eb'x:b7?\znah+3;Mf?t]'pV/:C'{o,a۝NkSlc|GQʓ?f: XXqu{wҍユZbYNdW*xgyOun2wo[nAn{n:oGEģphO;Y;NxíTy֟Y.?(=^:A~j'*wSBΰS)o&19mZ#-  r(qv4Z5yo/pf__ h2B\ZJ}G?܌bE~9 Nnktn9FLKv;~ɟ2JiETf"zmşmD\6Lcw?4xb꘨SNG? C8s1;N,q$k( $+[NǍjݷ(LxFz 1E;i3n+ }(̑iQraHHLRva](j]PW 㺍<`z/K^ly}3ɯŅi'K\&d bk^ke=WA'G|ž1 ŕW]{Tё*&bþ|ID۱v#vHv"L] jEplyn,…޼9ЂG,wʚ(Bc"'B'"{GA?{߮ - k2H׺ź+:3& >/sQ.>Aiiyj*XVg͔+$e3N|A+In)jNyO@ۭsiO0k]  륞2)EEEޠ[ڵO1u+Ou=3ӮIuͰ [fZ\[hդ}a02pp{~{H%;O4CFAf*f7,5$$DQ%Z^֢$ QM+)T Nrb/k!e ^kކVSw]g7/z(z`!llgmtA U #G/79'ڍ?*?ErKdx<q/@$U  g;hQE`uykϒYU}FJ @G/lFwyyѽ{Lm~afxs\sy\ ~čY_va5i8acMJlt/mf9=@ΰ OnRG\?PrmANhaajYڡZʚU V[ 8ۊ-_ixF+Qlefb,(O*>[?""<)`CH5c,1eM. )XZ(0a9<+bQ)V++f͑:6ogV8ٶJNK:53zzq+}/qV9"lPt9}DӬ}O{eJ=ǒ^,vlo`B/6WmWSvs}㏴}~SR\o\540thp)IP"7h'iIkľL?72{@)h?ұ,dYHbJ$3BPxz̓4f^id|-iى9~ |S,52. A.P->q7ZF\]AGjj¬^y Ul\=.>5d/T|6A| $,-؄_%ߎ3~s~bL4bP5$y f2@TR*١+|g+$}$8K&Zc/e(e*Q,O`$ip+]i;a˅MTƀaLuKo==UȼvBZt}JqPVIĥ4*M)z/gJ29='d0ZYhtע-wo^򖪬ˆ 0E_M-q=Vgw+!]?VOpXw52oV?Zddw*Wш~RPe,yy IlI&eCD@@A@xFz/;-dDe$ ")sqXқZ|_ZųGx &{p _dw Kpz SIh<3EkXLG(C"ARq<$ߣ`0̀ʑb VD&u,9hż2 VY;Ci]g 2qrP>}xPla~@[},137]qt|p\xyW`Rusi6-.oOvun'uzlm_8mz's݅>(AmdLCXʡ}s @|5O9RYMrDjrjQ;jn;j!;D-.PXqʲ1tqF298qA\F<%\؅3L"u/v{"F*ר!͸ׂ1!Pf, UA@:׫Aӷ1 .GXGt=\.SGˏTaD0AatH K3-V>0@1L1 Z0s#b``#Y|qO#8AP68bb"_W r4? fdGs=9GW=䅾G{=l( 㧕JW9V06;Zhla# `ovJYɘXyEPuiFa,0ѕ8g1m|^vqTY@ۢ~/HEl~}cvbehm``oE)8FC<(Р)#ݶ0QJ];ZUo+pe )+ :쁑Q=@ 5'ޔ~zC @{SӃ haCD/L`#ڃ7M;w휲Q9 zM5 SaQ 2@ Ab!3g "3v8l}sv϶4T[Lp-b8o$#E a?/2w~ B4">P @؆ W !sΟP[̳eO5">H?i@X9 iwjK^h2/FKoy XpwwlPb~f|[aG!a>. XcF $S!ST"N6^뜞c}wUl^ůG_hLaHN삒,=nɤz80?uK紜$v{QKoPxLı;$z@J -F5zfs/#K9RB#=#oe 6ۂ6:q#6ʕ[dCh ?Hn"N>EVȭ &wK4ʧL}`h6Q8?Xoc;n-ܦw4oe&~0^rI=Ύ`Bzh,5JşIZj {dvdZ)0B$HgQSVgE1dJAff>][06i=nxը`z"ܷt[ yJeԯdK)J~%%MP7PQ7W.cI*)حк*Ueណ׊71#K?,-ȚIgʝP1Q4XE*o푆_Yґj+”dX?N5|eabQx實?'Pɦ/T:VEN^ OS@A\#?*˜|GScqG鿁ЕO6;Ȩ#Sll0pԿK"ȅ壤 m#t&EӬR_?r?L[=b] ָ|x,a#LziGA-pb39Ġw(}ȥzCOZ-0ՍE/?3ڬWd/y6o#8.Oi'}f՗۵oR;KHT VXHs?/ps0kq (IQ):plfHګmԀPBIP2@|;MmT옭 }OY ۮb؂Q-2o?f,3p }ywr #ŤÁ%ZbB/s7CȄ9 hp޾5!n5Gio93ƙp@CghKRjApBU[PcP%.a)X~vB8M8mJ ]`oVJy+H 'ɹLgF%<!=!pjcM1!W @YPKoPKy.FEangular-1.3.9/docs/components/open-sans-fontface-1.0.4/open-sans.lessQk0+D&,ua0PJatcN"bN\lem(te;7Iw)# ݓd_E,M֔eL XSq;1DLy1hJn'>F{@ȉc1&a]&WgeɡȮ{G$iڛ5y8d4eo᤺OKUHw+,?p򥺒_5OM /}R=|3xAٕW*z77U^ɏ^R6>Dwݎ?$ck~t% Vs(&4QI!'C,)siqN.Ҙr=2GH21kJq epm"^F vqa8Ӄ p$Tu<[DP@mq@g{pPჁslz¬f|s`bhkU }ϸb'yRlC8,> cs̶h>iŤ,Pp6􀚝~ AnQ"rsmIC"^+ ta u`ۚ/a$zZzŘ:x ߃/[<+Fd(h/6dvȯ,i9|JOlecˆ 0XҺTXPKY ~PKy.FEangular-1.3.9/docs/components/open-sans-fontface-1.0.4/open-sans.scssj0Z3p0ùh) 0>˩GYJ}eَYtwCCOnnbGY/hgv$9FW_O)ΒCNAE6<z[c6Eu/1:e8y8..h8uLpZݨ&2NS΋k _Kz-E 6~D< 3xEޚWeޞs{||./~~O4Оio ]gCt1'@?[qi#gP V}付9ͨVb,5P4VBS}蠠Ƞ@9EGH@ޒUf JĎ "x8݇ .Rhpbhm9DQo?>LaTϴ{k?K3ʧc:dkB]U-)NPsDg\=cTP19l233Gy'J"#~W[NiV(bW^9 *}`t w# ^7L4CQlY C&5p'i+Ko4L%ZP h~h$JP{qzoOZʧ9 ^-覐-K@ri-vG.,U='B}Z15ǨVG\優C+oyxjO%ڝB#4(bȧI&A|b|_B?r:g^/eeomsߥu e;123ƱlY$0:!`Gܠܼ:Ӱ0S't Ѯ~6x+m}fiK0ޛGl4]ED]pdIk?FM'a>unn}+̜C,KO>֍&"@|V簊wz\PKeф PKy.Fangular-1.3.9/docs/css/docs.cssZYoH~=5:,f`"["SG"cv'B]]]WGRT*] Ѫ*դz_`թzshŹj` 6+9%5 nJ AuA)>B<@X<yP\#<)}e{R5|Aqa7[yƱC?:56EZuXv;|:c0ɪ~^dqЗ =.kPto7ߪs!ke>iC%mWeE5_&: /??_WEB=7Y6#qTT}[giP+WnvY/;xT͐sUÿ[وdM9 LhKdhkᬅ,V$()YIXc Wg-U*dI]Ie%mޞ-q2׾y֐BO#]qcZ:bPo!ӣǞȩqF"_l^)RkcJ}60j\ސA>QI]j~1~x6b,:m__Ā2G3CA z5@qfoAY֎ Xmʧ"hha[ެ7-4xz1̳ഉ'l;bIJ;,k+X}Р' 'VC7I[}1$״ئ- |s~ыÕK3As+EP_I 80` c*՝ZsՃ-b!2?FCO䗲F3'>Ԟ鄧quK_?iƟ# q+Q=yn)"i^?gת?zVr,ij)֣ڤ[[~6w⌋ (ߧ/(8VɲlSXٽVT5sssCǔ6+VU 8JltC2Em/͐j $hعO?12JTep\Wޜ{,vnOBj$Hq U" )\kCKmpkI_*䯧Q37 ̭:vYKvnkKcBFмKNc= #kPr o<[tF}Hg@TfǬ5Ev<*fs8@Tˤ޺+͆}ibsKҗTir ]q*Q ͌# ľD=(hނy#!2 [.'`ͺ h97GV`{bh,07C;6oi+H*-yw?W}cئ|Ґ4dM"хL><qxʬ٩QͶ$94i6C2v6Yo.!$&7ұ{Lď5n cem26 Q^< 냢N6psA@rAn,rgFy3=b"XH :쓘1~d< W'.̡̠g5?s%)56jNz{_=珡1`Bd+4ܿ{yca\:V!ML`)PkkY$yuaTˇrpn?},@NSG>lMќrBSYZ'V$Ε)ҫ\.rmHۈom~@r2{$=nI^B9>rxm)249:J3Q+0XU4'$"g]NO 4]z@^hSܞ:)?/Uqי5!5wkr+V ~W =<+Vzj졩?Q9ˡTEOw+="NL0N&?Y)Qr`=hAD Ot'Uv{"oqņĿZvd<le X6{AtP O>NwR?ŭ*jr (It` ޢ[Zrk\Aá#;3uޱ.sFӘP'ឨI=#F9a<(uXd \kN0G s5:hd ؄Y)P{t҆1^,*_\@6!q*}BP^\R ,c ;<>)t!g95,XTwP׺64c$>s/n.\:u )ssϧ(g^4A J.P&E?wvOz6\Y++2oǡfL%('54 b[.oD66 QFN_U?& o +ƻZĹg8̂^fBNMRh?̽wGĜ,ch GA'NR1(5pz(;' !ȨKk7!it'חHMg6xuZn6x0uu$&:W+^nɦI;jWBc] e&o|B !~8]&+W?^Y:/7q?m|vXHݧn8xBC6~PKu -PKy.F)angular-1.3.9/docs/css/prettify-theme.cssTMo0 Wpȡ@8NdI6`=u]G,4+K[Μه&@>3G}*f ?ט#GAXH/J ^HltZ޲se4 W"j; $K%p/;>x؜8$hkl VUI5lM '!B%t6$|&'FryaJP1lR":Phc4㸪§]!oHL!|f!x29E(#+Eu_D?v6"ȣ 4=_3Cl7sU+43=44wM͈ۗ*yOu.Jƻh6,\P2i]ETKd]DQ̧Z@zow{rG *i|5>!Dz_or <.C R#K䭕U[̨72zHX@Ʊ4D&};3/ u,ly40+.@G4ؙkgn83u33g浾9ԂZU+S=#gCְ4雼 _PK;qAPKy.F#angular-1.3.9/docs/css/prettify.cssTr0)[&vuCנ"KIޕ0Dp aoel wB8<èPjpe?$k-;d6\sDQ޽*U%$[z%#,T+@6Z`7Z-Ŗ Y~|z80y95ػ=c=OC\ a+Niյ'e؄Q#cd_ ΣY;`g]\-^m\jٙR sxfݪGJVz5z?PKifPKy.F=angular-1.3.9/docs/examples/example-$filter/index-jquery.html}Qj!SLW4ܽ[VW;)YB޽ 8~?ΧFCkBhCj3 Cf$ fyA?rsW%(ZLv`ɦgBȲLS hMŸFln8,lPɮ;2?)8uNɖX}DBNg--cmwM {]Qp>CntA=.+?Ź<zPKa|PKy.FAangular-1.3.9/docs/examples/example-$filter/index-production.htmleQ1n  (rsv]t€`/tDIj"Wt fZR7 /=6 !&^C3@, ` k>K(2IQy)IE.,uE&uʯLXsN"[XKO]j\$>JQvKkS 4Rx^}(򎢷_g܏LƁ=F~XUQʢ(uOPK%PKy.F6angular-1.3.9/docs/examples/example-$filter/index.htmlen! { ucXf<sDQ޽*U%$[?~z%#,T+@6Z`m֛@bˆ^Lh^v̈́0n||X@Eo̰4OeZC>6a}4AV%86g-zx=&$",ZPԲ3+-pUݏ]fh~/PKdPKy.F9angular-1.3.9/docs/examples/example-$filter/manifest.jsonRPPKMURPJH-IUI)I-RI٩@h KI-(O)M.(J'ee+rPK哋T^PKy.F5angular-1.3.9/docs/examples/example-$filter/script.jsm 0 W=[\[Z@ kʙ(CQ"Rȥ6YTpSoZTW֐Z+ fۏEc˘u]Y nrJ @F'%[4G_|'A1ŧ+pb#ğ Fv"K'ʱ[1V-x]27.h<z٫6`OOg)"8 2 8;@=8+c>xe}?y2[ S. 1$PKIYPKy.FDangular-1.3.9/docs/examples/example-$route-service/index-jquery.htmlTaO0_YHm&p2˘ ~չ%)NKЍ҂&U};%][$kd>A$2h ޠ"*0]Foo>%|'\$WдIB0;E&_I [akDFӔM*gY$E7ҜHʿT"d8X߻;3ޱ5l 2y:Jlg.,Uʯl̟)-bϞX:?3:%d[BoSZW)SSJX.;8+]DQU~[\ԛZ9Dkr`Jk]UOA[D9YV#lPWAAdO~vCh>.tM@aьM[?~Õ`~ 9~ 83&CR[##h  4F̼AB41f|/;h!ga 7 ?PK]PKy.FHangular-1.3.9/docs/examples/example-$route-service/index-production.htmlT]o }ϯ`RMECaOje7v}`l͒e/=\#ޕF]*F"DrBY-z sv!B)$4άYyu#1)W7F (<NڦYSa [VS)qLq,'[)Kgx^lh!xROKm}Xzz5$F_>B+1Tآ*NX:od O u99d\Ϝ{iti6L _RcJx>FFvHZ#0!SM#FjPݭ_YCj7Йn?歵/cue탸 [ ZqPlޞ~1ZňpS@/_!T4 E\8Qފp+쒹uA08^a:c%{z7>?KQfP-cA s:я4ZܻQibl~PK0EoPK y.F6angular-1.3.9/docs/examples/example-NgModelController/PKy.FFangular-1.3.9/docs/examples/example-NgModelController/index-debug.html}Rr  I)&%E&({JbL|}v29Y{|&iAɻP< 0I.6m!GR#__N=FAp~v J|w S`i[UgS>ĈpndLQ `LpI5kأ7<4VTu\}BQO6M0lPuJubJ=ύ엘2yz1iO-=E4Ms@7kN=%4q");pXGce1|*v v>oZG7FtjNgNPK,wnXPKy.FGangular-1.3.9/docs/examples/example-NgModelController/index-jquery.htmlR=O0 kSĐvA bmmx( _lN!QUuDZgchAMCbTpiHZ@N LJ<|8Pܝn:'` Ӆf(E+e N|P+ R 2I:mL$*m\ s930 nK' 8V1JsPUQ%Yް#a;75<=1ʳ>$z2utz)B%bQ#Ex]<_O,gU%!-S~[2q9 f4;7.f('l!4ȫ3fXQKPKY)qPKy.FKangular-1.3.9/docs/examples/example-NgModelController/index-production.htmlR=o0 W(BVKd͖ A:uՇC9><T0M|$ߓŵu1a#c/!KAY&Z/>vtN-Ms x%7,1v3J6zO1!5rJ~#1H!R5Ϝ PK68sWPKy.FCangular-1.3.9/docs/examples/example-NgModelController/manifest.json=10{^a? -u#1:EE{ ʝog->} a^O#aB 7kИJ}L$QqoxZ69\hS@> r~PK ?pPKy.FCangular-1.3.9/docs/examples/example-NgModelController/protractor.jsj1>,tw@=`1P'{آs "y}}:lNIȲfJL8;11VI_,^qG2 uܥwג]ۣp*JSd1O BZB)S)K-,"{%TjCgze2s?᭙|va;j~mЬM:Whc8: -t!lPKjPK y.F=angular-1.3.9/docs/examples/example-checkbox-input-directive/PKy.FMangular-1.3.9/docs/examples/example-checkbox-input-directive/index-debug.htmlRj0+jTɗC(%Y$nerHjqnFy4TZe>ɛ#@^#Z \why~76n2ٖ׭D5Bmi{Fa %"J't`$I[:yHNӐzM7Zr*mȱ'PK {hFp䁋c`wGjِ}ϡS.oVÝ~?PKk3PKy.FNangular-1.3.9/docs/examples/example-checkbox-input-directive/index-jquery.htmlS=o0+D@)R$c:4)Ph+H{u HǻGu:]MqdhY4j1(;G 'GUAyύ{Σ ^T9 fԾ^KVhX^r=ʧ5i%(k.D前k`NgIY wdpY^|+B(;c/)GvgٲCE ! W|Z$auENQ~CIv/~.⨜0 h$Xbx)͒̚bF  J3Bo8AME 1p}}1 e%B Xb{e~p؅kL?FhFKq%(߹RfcFo:ai8Jv^5Qnv1-ZЛZXəĿHTN])KWҫOi"=ݼоRbwb4ףųc(YCp#޾[Xkcmwf)B!'p/$ɽ Gn{,1H{qPƈc@IGZ`+GӀs+d6}`[ghNr-ڲ%x,*gj/9ifSFӴ̯PKơPKy.FGangular-1.3.9/docs/examples/example-checkbox-input-directive/index.htmlRn0[R@jSU\*8>`:v8CHwwvg&K/J-AXZ? Z1-E,qyXLn$B OXXmZiY #a S5Z#ɲzԺDHG {r_ozihHF.lXjm8?x<ܾHT=kkhs߰۟PKV~PKy.FJangular-1.3.9/docs/examples/example-checkbox-input-directive/manifest.jsonK н ]*B U~jHw7w$FL,h%7MULB' )9lNA9 cRs5s0w PK&bsPKy.FJangular-1.3.9/docs/examples/example-checkbox-input-directive/protractor.js10_q[ĐJ8r@cKaA7ݓ/e)W5U-kF2aI*x,n\e~OrKJ):A+DR!cT~㉵%) (N?qܞZ/@7+M,,&NR>>UPK _PK y.F9angular-1.3.9/docs/examples/example-date-input-directive/PKy.FIangular-1.3.9/docs/examples/example-date-input-directive/index-debug.htmlTQo0~ﯸZJuv/0 &0<=;8ζ*s4!HqᄏKX[_b0N!!,FV^@U/o+ _ywOn *^4rՃR ѣЖj<$tc.֒H S^lm̆$(dR~G( V9`ws++jlcI[F3͚Y̡O)=)`#by Xo6ٽu5Q+N ')h!NG*A ͫbK 4=U@%۩k|(S -JZ*/z{K$PW H/xc@<ĀS?: yh)N@# Z-fuQ&q7jhקdG*x`==W295/}ZǮy1{v_KV#0t8_%:K)"Qv<>$~֝?J_PKu5PKy.FJangular-1.3.9/docs/examples/example-date-input-directive/index-jquery.htmlTn0 +!@ u/ aЃj;YremKIq$C10`"#)gCiJjV PB 5d5:R]~gtNr Ϣn+.C^s\VKW="Ю4QC-s$)Q6!|̓vܷ8F )a= K;.&g>/>筞(qG=fmdp2> IJ5J?޻Gmim>ȳ#_iNh+v⣟S*tQr(@g@|973X,oN6GmjPw8!IRA%:#m$@CyB$V`x:bC+0 eAk$FKMA$ cm_ ]/% baiJRkQ1VϽ4IGa5U߮`+x= +q3l8b2_h5$Ɩ"C_J2?_#7 ?PK{\٪2PKy.FCangular-1.3.9/docs/examples/example-date-input-directive/index.htmlTn0 +!@ v/ aЃj7YdmKJIdC10`͇UajXƔN0 -F RN}p7B.?<ɦ52i)tV۶By7 lW JojXɋFl"uoZd F|nJnNFOǀ Lr6xg{|NiQWV򮷨ILa @ MAՏ@& gXLߥ 2 Xh0RoIÖ@v@j.7Q6| cj yA\<dyZɳ8>137Ni#XTvZ#+tFi/ :S&f's1 ";ŀ׿z< OA+-TFvv[ǝ<6n'dחm!_Y'pVqK:~Ǵ x=O|(OR#0Y>1>`N71Dp;uxAg'}?gPKܐ;PKy.FFangular-1.3.9/docs/examples/example-date-input-directive/manifest.jsonK н ] *k!1rfܓRlDXఱ2jJT1]'w ؄$R8twA9cRss5g9lPK$_m_oPKy.FFangular-1.3.9/docs/examples/example-date-input-directive/protractor.jsO0RAh9l"V'V{Yqpikmb{6~w"Qތ7F -E'jcW"Z^B5GZgyQgMFFC.fI׿|kinPPEr =h#m$ vȁkxnk췮%Kr }aMԆ˲\ZDž\S*O<&x=-`mEY栛d]z8Z!veubφS2u)Py+K%~ԮcrtoޛFwik΋dkdf.!=gc8 ,(d\Cնu'D`GU ~Cv}gp{J<هQY6cCwXE -T=D.֚e|~Dp犻>)[ܑ( I-wY+xj4S ~H~FGL%2+Gʧ,_AO#S_x|?2/Uڥըݟ9Njx¿sswPK(PK y.FBangular-1.3.9/docs/examples/example-datetimelocal-input-directive/PKy.FRangular-1.3.9/docs/examples/example-datetimelocal-input-directive/index-debug.htmlTo0~_q&@L%`C'7*9%}ɇTn"\A7PB 5  :J]\Na^4BQR8tuTBZ㲶XeLnUWٺu٪`IEdz%lce+>G 4̗FApѶw"j1W8=:׫ yH*5JޑӇ5:*"׽|G6ɭP=Bgl Y6 mmH8d_ۀ Yс |:Ϊ"`QC(/(bzd[-j !pEOJ{IPK.<PKy.FSangular-1.3.9/docs/examples/example-datetimelocal-input-directive/index-jquery.htmlTKo0 W0B$@GaEfҭ!; =6۸%Wi()I6`QH9VaiY 2*gS@֠P. i% E[7(u)$U[^K["Ѭ8xau[ )sE1R7Vl>(Y|60n,5fZms|EktK|BQ5ZJ4'B;ޝݭAWIQ8h& #xt #MGxN٥6 (`Κ +)= Dck/[]upQAR8S̷\ù8! ubLOD3_!TJQR MV3^Uy̻AS͒$~-dYĽYW®k伓 $W9CŜw -bM6g_W`K+qWD nіJ]pnm$J-0K MaBcqh%7qU[YΫ%^b >u3x' "*(2fp䇖9"OR8xe|lWu-y+-nn"!׳5 b2g8Z3Ÿ%F$'?Z ɛ ӬQG5޻8v?u뿂FfpjI)|O3X;Of ^lvKOγ e`_]Hf޾74Ͻ޽߲_zYL^!yCT~b|H%H $-] 9s_88rAkUݟxpD|}s)0PKHj:PK y.F:angular-1.3.9/docs/examples/example-email-input-directive/PKy.FJangular-1.3.9/docs/examples/example-email-input-directive/index-debug.htmlMk@ "Z(CiO%4UC]Y9nB}ygF\ a2>@+Zz ^C%~|?9.ho5BV9鼳؄NIDED o*QeQ+_D-t%&,1u.W}OcI2wpƵu ~o P4Ffs(^VCzh(g)i_| PAfo7T٠|pހU+awJEƺ?fC "0G壮D&&c蕅Fa γbػ?'G'[R]Ċ,OxTk/!s).GzB-.5d=*7s4K=ӯ^eNw5/i> ,I߀2?PK6g4PKy.FKangular-1.3.9/docs/examples/example-email-input-directive/index-jquery.htmlMk0pLleSX҃jO}m;H&Gζ~3 VL(ikʮ^BnD_߿˯N gPQZ0qBUR~cښq^Z=XƏU_9?0FTI8%|LJ̙7qk RYg3=NnR,^-͊;eQ_Bac[; &Cuf"+F@sj(4^]qfuA6 ;4fzsMI>$U D+kAȋ GQ,D͍w$4rZ%ǑYg#/*s?3oNzؙIEn`q|8R1'V ;Ou>?/NNN5o sG]'V]H\9"*HT# PK?wPKy.FOangular-1.3.9/docs/examples/example-email-input-directive/index-production.htmlQk0).&fʦP=iAA@ Q7SvVh,PT̓*a߈ cW/)^)nBӱ$ P߄Ax#'_zTPKWdPKy.FDangular-1.3.9/docs/examples/example-email-input-directive/index.htmlTMo0 W0B'l_U6 q==6xЇ']#$kZHGR\ a2.}Z z VC%n'GY^#iQ;ۏ!o;MP)T(QQ+_Q2te%]'1#I;5c/p{!^q6x5u6S8b`#mFK%9N LLEd-!v]pnsAe XefwE ;=\$eHn5iν cעD&㟑㍣蕅Fa 3bغE+̷+N?hy2GΟ.] lMB=7yfjy99R3Wx.zgG՛!u9r9 ?'xAF PƟ,DPKe92PKy.FGangular-1.3.9/docs/examples/example-email-input-directive/manifest.jsonK н ] *k!1rfܓRlDXఱ-Mt֞*: aNUDJ.5.('sp Qjql mz^PKD_pPKy.FGangular-1.3.9/docs/examples/example-email-input-directive/protractor.jsj0 y v`Fa0ˮ{'Q:-gdQv0OmI#&S7g'UOŘ:jn~:.yXKn)s>46$Z !I(D \ %|:E~o]FK`Zy|d}<%݈IqZU P ;kKõ0 78 Z4;/ֺg-xfVPK:*`PK y.F<angular-1.3.9/docs/examples/example-error-$rootScope-inprog/PKy.FBangular-1.3.9/docs/examples/example-error-$rootScope-inprog/app.jsMP "RW7DqZTd%bN;s(]Ek3=M+dg# LNp.r'  #^Fz*&:촬gM7J<,&2>PaàzsmeBRNX*}Q:,waGPKXȭPKy.FLangular-1.3.9/docs/examples/example-error-$rootScope-inprog/index-debug.htmleAn E9kuW]]Guɤ%:6#UB?>%ye+aL+\\-R Lى+ůϓz]8P?)*%\R2-V\W51˖-Kb}dtGO>.@͜U iQ{)xI+.p:aD+w֢O56xEtUmGO-ei>?PKM~PKy.FMangular-1.3.9/docs/examples/example-error-$rootScope-inprog/index-jquery.html}Qn )|t zh.iC+55J_Qd[=4PiSR^g-VM-v/LwXPK+|PKy.FIangular-1.3.9/docs/examples/example-error-$rootScope-inprog/manifest.json1 0 @Sh=pbV& Fwc dX]EHl+De\цBt^CSjuk)r1 *yPKY^kPK y.F,angular-1.3.9/docs/examples/example-example/PK y.F0angular-1.3.9/docs/examples/example-example.csp/PKy.F@angular-1.3.9/docs/examples/example-example.csp/index-debug.html}n w?ejfC>%FQ޽Q(,|S0x8;20~9XAOcL΀Np @mAS:O[R4+u%1d#ȇA𙹒Y1MxJj'EC0J:ƑJؠ'{=)8io &w-Zg%i<>qf՛3x9j_]&,!{>לuri V֪Ն8cR!nc 顈~PKogl*XPKy.FAangular-1.3.9/docs/examples/example-example.csp/index-jquery.html}R1n!*)T)8ȑRKΊeYƲ% 3+u> PKy.FEangular-1.3.9/docs/examples/example-example.csp/index-production.html}n w?ej.*:tk+(Qw/?NT)Js{x“ 1ҎK[}1J2D|+ZP~}7@Zj%7 W}lmTA{$1r.wFFȔJ}ԟ/y8hse5#+!;#QqxyxPK\T JPKy.F:angular-1.3.9/docs/examples/example-example.csp/index.html}n w?ejfC>%FQ޽Q(! "Nu,i9x79sГ3fS-:Po=GgТ~]򑢉ȧ+^$dF> 83s%E"3Z|)Ν Xt*]GN+_Cv<i_{33U^ | _s5_LzęFN!W$-aQ2aǗK+&v/X՗?(p\mhQ lHdLLDoPKL(VPKy.F=angular-1.3.9/docs/examples/example-example.csp/manifest.json5] =sz=ndn DwozLD%`7T_j LC|îJs;<6[}!}`(aPKkk_wPKy.F=angular-1.3.9/docs/examples/example-example.csp/protractor.jsU]o0}ﯸIHQ iTB@<"7M ];Nv^/A: K`UONj6,҄דprrh0 􉸔`7˺ 2 Ƀys'ݹ.&  !ɦC; t iYYl!(1fʔqqd uuN+S^q K5B;t}MP -~R2 ߦ_cޘ1n{{%d<-uޣ&Ƃ)~NULmJO9Cym# 'zW diS௅)vdjl*+0%6+T`ڀCLO|p#$h@Q0DɅt\'}79؇z{IAX(3׋ұ3ż!6P% /޽y~8JG$6k? < DW[*ٖleU!JVR[<X$'[Wlt{ дugkb5 ZԞx!p)2I)Sʜ8Bbӎƍy4tG{!~bo7T'Λ_EsitvDo!p*u>$.I7O.n,9odI$Ϩ}k6^]Rlؠ=0[#lg4i5}i:hz.2<PK^귓hYPKy.F9angular-1.3.9/docs/examples/example-example.csp/script.jsun0 \wPKDPKy.F<angular-1.3.9/docs/examples/example-example/index-debug.htmleJ1 1^Eڹ<t0;iK'#n3]]A(C%IOϙK;- EY?vz!^^x@.9@-ajX-hue kqASn}Q#-HNfW?Cz9ŋ|p1o %L'F)\plx)'LLeFjU "fE/PKڶӄPKy.F=angular-1.3.9/docs/examples/example-example/index-jquery.html}QN +F'c<tvCaj1P{Ą`潙7 ozoh #Ͷkd c%9#i0 IG~9AYg=cJQyYU2q )VeCGIT ma:)l{]!쪼_ubuYo4MSw{yJ\XC+Fx&V^j?k/qCi0l=P\;"{(P~PKt1TPKy.FAangular-1.3.9/docs/examples/example-example/index-production.htmleQN0 +LmP ZNȦV*/%. 4.%8wCt97XGгB@8$zR)#I C\-`+E ^ݪRu2 '-jVk70ZTNsܚS曥Ū4g~=tswsfnou3N[cQV#;Y Sos6S< 6ϓ%@cdGΌRµS/83.7UՃ?PKslPKy.F9angular-1.3.9/docs/examples/example-example/manifest.jsonRPPKMURPJH-IՅJ: ɴ̜bl4f楤V委&deU%2 JcjPK6 O^PKy.F5angular-1.3.9/docs/examples/example-example/script.jsU } *_@vA 6)V`ݧ:v O# #!N{hS!ɉ,g孧Y0xrzή\gМ֖5)v*yvA Nv- m䜰?J\^f|qU/PK(`b#PK y.F-angular-1.3.9/docs/examples/example-example1/PKy.F=angular-1.3.9/docs/examples/example-example1/index-debug.htmlVMo6WLKN@QxA6=h{h{J6Hʉ7Rrݠ[ |7獩CVݜJMN؀9([ꭰ}OtN^z7/BUߔGgj+;URGu{%lKnEt 5;VoBY+AoruU7bTC.Ԗe(QX[V^PH~FNVRcR~ gr6zµxLl(KH2nf5N~%\c;[-;^BBɍ^B+Fp:OKFG{-rίb!IvN-g+y;2]'*a;ҙ"%c Zf6lV¹*yZal E!DX)lDO!POUfnE6 q,\7- y΅a B!|K r _% pM/N-'g',桂q^a;qvY5զ+CTy-Nd1ONӬnc#-qf)a}_kVfy+ktǘfN,: T$>ܴ hE|6:>T UUkeگ>Ls:$'gaTP7oYӻ /X*O$EmQxWOYJ -ִl3Arų6;VE"iTpZ'*7+5UF. fZzn/EhBLdl,hΉ4 },AIǀG/<ǥ0s w:LFQcdhF5Iu¯yTAgoѺW$n*{)>e|m3r/X?߈PK4 )VPKy.F>angular-1.3.9/docs/examples/example-example1/index-jquery.htmlVMo6WL@QxA6=h{h{J6oCRrMmf֕;[țI ڔ 7AǡrcѕɟHᄓxs̛V"-?C1eleDL_V+TΣK~l/g@ANrNŗ9)bM۶Lwep Y*G0VTujc3~eF٫$zRAi s??PKXPKy.FBangular-1.3.9/docs/examples/example-example1/index-production.htmlVMo6WLXxA6=h{h{J6cHʉ7!)yC/8|7#ܡEغFN զLP%ހ :ՖLӆN+oZƷ.身Ъ62u`MU&9lF"oenm.ΩNrl v> kŞmr[cP8F"'/5:~3hotۘzTNL:KT$JU@zvmF'\Nl7? YuYәKgү MHZe-_=7a.mVt 8:{ ,zptQüΈCcLC0.%}C85=IN Fy_| zɢ'BY|c#^}.IxvFp _R=$= HOYJЍohfdArjU'"4z3 1+ĘLu.jH|Z6Y3)Ƀ 13_b"(q xÁnXʁ 1=1GdFeT'(Lu_c:I~/Ǡm=S, OĿPK^YETPKy.F:angular-1.3.9/docs/examples/example-example1/manifest.jsonRPPKMURPJH-IՅ҆J: ٴ̜bt4f楤V委&de(bjPKG^CNPK y.F.angular-1.3.9/docs/examples/example-example10/PKy.F>angular-1.3.9/docs/examples/example-example10/index-debug.htmlePn +6ܱ[K?"0Q*! +6&hZ#•;Q'pf;JIߕ~i%[8` ?eЈEUYFd}?SRlC19 0sǘzi)/&p:d@Mm+/WJJW)J< Gj1y =1RjTg7IIM8;pfDJE-auenzj*9v<0U8_B@Q+ß^3 =:@ᩈ"s?PK7' PKy.F@angular-1.3.9/docs/examples/example-example100/index-jquery.htmlAo ~7.I4lv 6Lh2Jk#$ { Ck'-`me_E3*P/ƫJak6aKnmzxcR001KSy݊q$u M;vڂ% qP֐ y%#TQdo{61#JBBj% ͔_RM8k\^]/|6gi:ẘ"w[¹ڌ7\u9岐0^~PqLuM8'aW-3}:]@DPK<@LPKy.FDangular-1.3.9/docs/examples/example-example100/index-production.html=o w+'KaK,ڥ6!22DJj*%mrpǽp}{+`P'4+$4xP%M{t7Gn~PKVG9PKy.F9angular-1.3.9/docs/examples/example-example100/index.htmlMk S/Le/LMJ4!а^m"KU(z a5i- -JG=l<~_J)``W dhʱ+.`OG#l|{mʔ՞{\,eEsYSyB 9]-Uy×AjヌľS:o^?3@lRҦ @I6n :(VO(R15D&X Dej=)eȮ">1hw^,?PKsuhPK y.F/angular-1.3.9/docs/examples/example-example101/PKy.F?angular-1.3.9/docs/examples/example-example101/index-debug.htmln y KNUa pKSAVY}06iIlߖfٱՁE?)F;(!3boK!rC,j7tʓ0]^ Zalq.RM<-~bMEX f6P~b{t+Lp}p_ZUP#PK mUPKy.F@angular-1.3.9/docs/examples/example-example101/index-jquery.htmlKN0 =ɦ4@;8Q^AB R$'/y78OpLF hcȲp+i(!#Hco/)#MISkTnj3Ej OXӈ|3Y)m9EKQK[,5=g%EiHa;rcc}dG֯+ECD=S7mRd.VsL><^PEPKȧFPKy.FDangular-1.3.9/docs/examples/example-example101/index-production.html=n0 FwIVv[z:2K.{:v"E}x|J@pI, cX} -%u9R?}^$ +`8><~XTI`UfYuLڌޏ0(o3a9l(9<ލծ"ӊU 7p#:[@x Y- B0E`ۤ\ʃVKL>E1~PKT PKy.F9angular-1.3.9/docs/examples/example-example101/index.htmlAn E>ŔWDꢊ00uFF^(ef ̢=\E?<FuQF^_SыlI?KpyDqR#Ѫ\-~&hR-|[1 !fdqzS[QohWwkZ<+o*׈?PK[SPKy.F<angular-1.3.9/docs/examples/example-example101/manifest.jsonRPPKMURPJH-IՅ҆J: ̜bh KI-(O)M.(JKKbjPK>UePKy.F<angular-1.3.9/docs/examples/example-example101/protractor.js1 0ὧxdIu utɋF⋘wX<9Qt-gy_rH47\s(8!*8%zS"?ll^j]\Ymn ^kbAQҶ%s/C7?PKitPK y.F/angular-1.3.9/docs/examples/example-example102/PKy.F?angular-1.3.9/docs/examples/example-example102/index-debug.htmlTMo0ﯘZvW2Hn =U%=E{`a5K69DBxyxc`rgpOf.SQ USȎiݠɛ.5۟R!tQ:,rHS3uMVJCSg1 ]s:|lH"]lŌEN ;DJńU4+9pc{/L*4C+2]Jp;K :`@ +W~75KCCq,#Es4j1e^frM͎D_On|87N p<]{r`[L\@ qE,!5YWm'Aםb ܍7}߳H3s3&:<ߠg:୔鏪 7YoS5υ/EfCGeOPKZPKy.F@angular-1.3.9/docs/examples/example-example102/index-jquery.htmlTAo0WYH I.5\4mT@PS-bء)6~tų\S ,/΁a:E7&nԜe_ `n1JG9IĆ֥4EaJIn"$a#|jPF"6d0$F|mkH6Dv8R)eU{ZDXɢl1cx. 7@HеՋ',pR13}lե npߡhH! ^5Ɵg|lob9aQ{J4H1pd^;L YMB#o(_N©}ZnBM !h43M%6Mb| *j6u9ڿw$RDx)̲73gyp)etj9M[Tsa3Ƌ#骹+"SqLPK S.\PKy.FDangular-1.3.9/docs/examples/example-example102/index-production.htmlT +R6Mm,ΥjOU{ٞV9uAWrCYo{؋7 yW<)'S ~@*f('hf2[y0H+%,:V,pYpupe@7y0gRQuja[UYU&:x5ٜ*G>#ث'GYFmp+11/CyhucഔtsIw=A];/,&&͎DXZ/nv?;WN <]{0rת5g| 66qmCj Tqul]w}Orw""8FWMtAG_鸪RFߪf,3f%^Ո61AarrPK fIPKy.F9angular-1.3.9/docs/examples/example-example102/index.htmlT]O0}߯6&ے܇_b|2{`P6PﶴÉ`BsQ&S(t Dl#D4ɩN %EIuW 7 4[+NaENOf$t؊2-Pi tYr&$t0V H贐Al'R,gz%}{諰#Yh=n BsZ۲qJEM\T3)Fng uKQZ/)>_c9aQI31Ho9 l8]}Cw Rɟَh+MWkST;Sވ-@P{"RJM2Mn*~dK} 7 =3{8:||~J7gzK}(txq$4S5yh?*OPKPm}PKy.F<angular-1.3.9/docs/examples/example-example102/manifest.jsonRPPKMURPJH-IՅ҆FJ: ̜bh KI-(O)M.(JKKbjPKًUePKy.F<angular-1.3.9/docs/examples/example-example102/protractor.jsUMs@ +tqHtzhgzI/uzXvb]-~k88zzO (e.;(O\SF0$C"4TB./&6Em,U*/XYW}%S2h r/t5 Mc͏~DR؝vYZa!a8iHc#x$ "8* PD <"} 22vapC~uF#]p]bښmc|#O?`[~uT8]h-w)tt^A( gU`XH3ʂmA*b#RMF$ k*RVxD.O)*Z/5{?K2&NbUO6 A|J]^xj%g@C)`'bL97[ϭ.RmNV> [ Y. ,Im!pN_y`vȤ?d V01r(#*#!.51`b(]_ZW[ٝ t\(u t?fKsn,qVylʢ,סow]='LJ9j όΓDӑ\y]ypy6 -ntѹd}eHQDy_gsȭZΛ tR17W=4&~R򼹘:|vs0*K-D79VaH@YMnQ^:Ϥ^Ū\8!{]_Ms Z=+^L[ݺiGhG#\BF0OII8|*aEh#8A"R0[4ҏzBs 劍LJRrO}# Ȩi:UGy*]+MNB/3ms qu[KiU(m;'t}9JD )´ ܞ80WS `dgPK[dPKy.F@angular-1.3.9/docs/examples/example-example103/index-jquery.htmlTmo0_q&HJ%n>TZ5iۧ*\p-fjI֨ۢH6w~{yO"R@,@:`B22#?CpU o_?ڗGNu&?y^flfgww6l9HJEsQRWSsyXֆ~ɀ$&i9]SP[ke  n`څ "dblN~9An'*VE 5:Zo(nW鴐cc@RogR! LXXE"LW k>ԛ;kN0a>q=\]^R݋v6:;y~_\v(v}fy}؜R8ecՖ9,'(q/ϤNŨBTa%^ [ݾi|И({9$JY=l` ,Ya<.aIhEȥ~N٩'4'֐nY%XxV Q\q4;|Z;M{t}dggBsЋom;Bu֒DJf/Cʃ(qXPh(tnm}o)4"8մ FkrPKh9}PKy.FDangular-1.3.9/docs/examples/example-example103/index-production.htmlT]o0}ϯpI$R,mR7VMTe5jﻗ$[ms&DžHrEY3nRKn۝?80^YVHNl?[]OPi`7moM. 0cW=4F<ԃ8gSLۘeǘբ'1[)~ }zus\BXDpˆ@@x?vï6B%䐽]]_8L;}ѠO#I56񥈞:0Eí*!}dhp["2mqȋomv Ή5 6L`pҍe&LioҚi:vՑ_p6[sLBߤ`|4y ᯫ([yV> T[ڲβd 'ytI$."-%$&'PI!Ex.(&`߾~tp7Lj2~xyIpAڕ9m FQE:- T: 97^*GB0Am-֮(ˀ:ݶKo+"drF; 7"ˤ;EΛ**JFE&-z&P[TsCD.]((B|>w =b-ӳtCE>IԽa->>N5zȶ/PKE.bPKy.F<angular-1.3.9/docs/examples/example-example103/manifest.jsonRPPKMURPJH-IՅ҆J: ̜bh KI-(O)M.(QrPK%JFPPK y.F/angular-1.3.9/docs/examples/example-example104/PKy.F?angular-1.3.9/docs/examples/example-example104/index-debug.htmlSMK@WlLAp7A&&mwgv7mAу!0xeVʾXm[E Ӫ$STEbEVח󘰍Ր=~vbދK7H}%D7,M!yœ7Z}H};j5g,ܱ0Hޛ.fK#y?CaBdV(4Е.AbGu& %Y7Ňɵ#:&yZ_0[l"UcBs컧7\'Y 5#>!)V6CW*7 # J@yY1V.Gp@otyvb~<^w YwYPK-v{<PKy.F@angular-1.3.9/docs/examples/example-example104/index-jquery.htmlSJ0WdsۺA0)QcL+jep?=%Xǂk]0$yy݂E"hFM` 4÷ھ3`ܐHr.eH7E`ׇ HZw5YhZrdJTK Ջ8i VX٥IjZ kۀ)} =չP{f/[x]+9>2s T~&jGQƓC=1( ,^UH羪|{J\EPB '5 ghgw|lJ~|~"pʾ_({uRQBfo_PKUPKy.FDangular-1.3.9/docs/examples/example-example104/index-production.htmlSj0W($jhJCz-ڳ$$mIvˌyoFlp}:zdSM90vT-0&gL BĤ۟5$ v?aYðf>~n|páOY)Ըͱ'Cvtn4^Ƕws Q^vֶGIQيS⚿' HQ'[7^q ߎPuAew6g SiqDo FwA Y]d: l SfC2YDR\[+KQ Xxjinj'w^MLkZQ?9,eR+WabE#?s˰ϔ->ٺֲʹe5x{j~<>KYz'p 䝢ڕNX?PKclPKy.F9angular-1.3.9/docs/examples/example-example104/index.htmlSK0~_eV}VӴp%6PR׋]v=ڵ:2L+SISTO-8ŊZ/O 1!Tm% D{uy-P ]̐ )Xm1 ޽ A xRꨐFsu!/HFLZKM\*Pyi;" 2J!q֚_Tc<2YMi"Ud? Ӆj*8 6fWs66$8w7 Zlk';]+aU@>?.CrZ.zuO?B~"bpܖJ6>ma l6IFH )ZFFn?…Kj.P6}U?KwO7PK:PK y.F/angular-1.3.9/docs/examples/example-example105/PKy.F>angular-1.3.9/docs/examples/example-example105/http-hello.htmlHQP())PPK, PKy.F?angular-1.3.9/docs/examples/example-example105/index-debug.htmlTj0}߯PͦB!%] l\d{j{4ICl7}1H9sF|o7IV+9N jƘ*(Nb<p@ 8 `g4<~]Ph_hߔ|̣V~"C.:ϟ`(LXֶe+s%ݤ0nk 6֠Z/`/ @Ctɣ mS0`TίQcoXSʘj%GA3zY~1 _ְ-O[I[=4JA)2R: kgp9YW]TDB ݑ G; &Y4?JITPNtwoubӁQ(W{4DI,\+=#?Tlk!!n1!}{ *kbN]T!8kWEXH)5w\]1PK(PKy.F@angular-1.3.9/docs/examples/example-example105/index-jquery.htmlTmk0_ tP[iaPхvo <;S$M:f}:Id f z{NR15-W40%9mlc Puv**`4ˆt2[ iDvE]]< H.Y~|yUSFA^Iot<Q!R4k-Lu7knۍFLA4T0;7Wē/@QKp|'OgL."~#ͺ߉utUW_* U1w>{DHCQ6&29q?K%V=$#C/%Xz-܉iD!鞾_͡XܸX8mk_R So˛חGZ[p8o$NI5C?tH1umt{ =AE`%աO!- AetÝB_%ai" Ax&;PKWPKy.FDangular-1.3.9/docs/examples/example-example105/index-production.htmlT]o }ϯ`Hk:1IQe{v_݇y"&ÀWqIt/ {sYcD@ЫzR@mEAS\B'C]Mt/3ɺG{ds-z`=nL340`9- crX۫kbv) 47j 2RLBOhGlbhk^Us0*Tmu9vw eHQʥn]͔5H5[g18c ۅ`En\Ʉu9pͻ+)yn(Ք3暴227wx`8w sY$KyKktk\;| c p/;*=GlJz0Ut4)4:W=PSwutE.BM2{|2u<b<XVTtc~vyl ԋCx=GsQx$|GDz#[Vc /{зh,!6ݕ{)Alw6K}Uq"]t/PKIE{PKy.F<angular-1.3.9/docs/examples/example-example105/manifest.jsonU 0wt"r=AStp I䨄A{kԫ]Pٰua]͐!,&DZ%e18SֆbY>PK|dÊAT;f?<+ G@*$s%!z9c/ʴ+nwrL: $q7\il,' m-ܠ5Z$lL _BRۄP M8UhYGncv?i>*ÒK/Z PKOb.PKy.F8angular-1.3.9/docs/examples/example-example105/script.jsSj0+ ?K Mm%WRH]E"zx懠B%l yK϶+ 90*d5|+H5Jv I3F>GwBv @.pӲ h̀3-<{}`*"CLAkI;Dn.YJRI,hjnƯDB>.3@k:ZT5Y)9‹f&|peR/8Qq)9Zk쿬 Y8a*gܩHNFC/M;6 猐mlS^PK塟_UPK y.F/angular-1.3.9/docs/examples/example-example106/PKy.F?angular-1.3.9/docs/examples/example-example106/index-debug.html}MK0cEӂדxH6&%IM tޙy&v"L (ے&rQ%GϡuK|ȯB<  !O^_etV$MI_<*nwG*FgI3FgV1ns> %iFM=(70 J(a׵7bTDž-#qAmu1S'kR]g(p,V8ϭڨ,4 Ԣ__A ]8tn΢MQ)7]#[bN۶~_hdx= խSؾ7cr/0xgd^y?;ǕK`YgpwzQ xˇv<{* nSxxL2:SBC-ZV/}3CY|]; uFh-Ej!7@8%6"gC&;LVz_Vv4 {M2"L:`R5"ߊnPKP tPKy.FDangular-1.3.9/docs/examples/example-example106/index-production.html}k0 ),ʠ =>8_0ONwl$˒WRF!anbH7v +(vZ s~<|in)N 497M^MC޵bM8 Q )B  ʠ]}D5I\V;OlۊZ*7Xޫ:6L){eY>j983# $`]]Nǂr9g=ϓ[S'*A+W \eg{SWBT?sѩ3XWwhg>I;A =vJ1ie BY-"#qV4<[aw؟t (]f SqV0!,Ue+]V7PKPe=^ PKy.F9angular-1.3.9/docs/examples/example-example106/index.html}MK0cEӂ$&F$$bvBa273dqӆ à&BBC0^gtA3E]y1dP}gUJٳsJfMTgok+1XsTAjQM,K5ҭ6OY[v :gbA}eLOa+E~X2ۄQ˅J<8\|b44F9!yVh[ (%\߈\ck 7 @NJ5B7BOуFj.u&3B3!66~ۆ(\na%'>ގB?yw;S3lqOIڊdPKzqMmPKy.F<angular-1.3.9/docs/examples/example-example106/manifest.jsonRPPKMURPJH-IՅ҆fJ: ̜bh KI-(O)M.(JKKbjPK]UUePKy.F<angular-1.3.9/docs/examples/example-example106/protractor.jsMA 0bo@7[dlЖ2̰)Aj\ҾIs^8pg 0ע%s[ͳdhVHoY(hu+H*WB3.wkPhR7]p/PKYmPK y.F/angular-1.3.9/docs/examples/example-example107/PKy.F?angular-1.3.9/docs/examples/example-example107/index-debug.htmlERM0WL}IK8=6BaXȒنޑe {}zkOrg7*`ѝ\ z3:bbusY [la[%֟TRzf/`zT]V`1b TRǬ*'7Ui}_ m.bwCణz |n6*; v{/pn"A #*pA;Pao8M9xw(Y" 3u=G`=bP^Wßr.j́Ʒm].>͏zR4Ay1, yk;gr(ƒ|/o1d˒k!A 5'e1*w=̱l RsVK>R5}:bT/n"AYM{TTMOWAIG.Ve`A} $78;HAѪGm8 %fcB`3QT*6DN!"@ҟCAd9sIsKҖw$  5O䃸5l~񰁇v ]SJBҒ;Xfq<0}CblଃVu:kM;л`VFAzh,dFRqznPKև&EPKy.FDangular-1.3.9/docs/examples/example-example107/index-production.htmlESn0 +8_abVlvaˀ4N+%CbA}ܠ'I{4]^y 踷IvMAHB=10DX5$ذ́2GƻR8IQ30Ġp/%L,s:Z Xݗʇۻ+XȖT%I]3)FڜR8#nÞwHR7eT@SxrW\6L蠁Bi8=R 6UjuNn:W28{0nOAyMVefc4G-QD%6A0PZ0J=gVJHos+rz  QTqO˧V~?\`xߢ:DyJXEśn2m~C81 &DZNAu"m3Ft{,-22sdF!u%;"@'PK %T2PKy.F9angular-1.3.9/docs/examples/example-example107/index.htmlERM0WL}IK8=66BaXȒ&نޑe {}z@qoYuAHBAu"q]\~{`Ö?KޖSUNARGT 1XͳŰ[=Ţ 4R׬*'/UqPm.boHaO^ҙMT8wMr7_`2E MTLW؏QIr*r(L/>QLE@f{"Š&xX+NpGYXw h 46R^fnb&c< tPȄ rY) dS4N77 lzz;mQؽ˼iAP _\E5Zd@l!!NK1 E‚p1ѴbGlG]HgC}آnԲEFfd*eGd˴= PKijPKy.F<angular-1.3.9/docs/examples/example-example107/manifest.jsonRPPKMURPJH-IՅ҆J: ̜bh KI-(O)M.(QrPK"FPPK y.F/angular-1.3.9/docs/examples/example-example108/PKy.F?angular-1.3.9/docs/examples/example-example108/index-debug.htmlVMo6WL`%=,هn `v`$ $;CrbQlq><2)7;S볔Pz |}Vhd;4UviojJ螗9>4qs~:SEc@lq>-`&΄Y84PoiVAQTϢ8Pgy[bsE3Y%UvѾ 0<יl~}pn6mB֑3`2-*a`}'=쮪Jkc)e%_^\X]Vg@ټsgndRaPΧ P-޽/"I/ n` Mj'Xg+:IY|.Nw=򤌶qj?dÑ sp񛋐yxPPLVMAG_&!s'\.RoӼaEDA5) o{Ւs!׬Z^j;P-28zZնIUkpeqw,~/WG,73Q+ۓc6?ay&Yj: jC6#@#.>1"Kj>!5akQt#p5CI.-EUq *-ǟyo'eMMd0d#d4 Kte]_*,:}(^Nx:(?3 J¦ׇp-K/`u p`?eP}Ku7eË`N6N0(ϐ2k%O.ӧ>4*&z4LzS1|E G*xWJ ?y <̩Ξ˖?:]GÉ2f|&-!yDg]S؂P%G1A:F mj>pzc\DWg4V6c6?aya:T0A0C!Ipd SA+.976"dҮ4qj3>O$vFU_ "ܾ" fSU4` u]?I^ 2l\6`Hlӏ2r-/La7&&'?I-}>SӚ{O=#\-eElZM ]p L&lGqW7XC)pLfS*TR-NMsq1lTE|xnuG+%sA.*!WE~{s+pR:Ve*˩Ji BU`"/Sz2BvCkԊ9?b ~Cfz|Me)EwcPKː# PKy.FDangular-1.3.9/docs/examples/example-example108/index-production.htmlWMo6WLc%x{هn @AEQ0m3H{gHIX`(#T[[WP1YF\Fru2(Ln%_XT_yq~9o* %̛9BƂ22ҍRFPUd~2E5ZD<?3>TfΚf i~aUoeIk\$>2gSժN.ڷSϜ3`0{gӵ5>+Wu}e R/O.hu `j>8fK!<,%ce_5r`>Bnh@O07|-$/2)hn[-P"2#'eKO:3j}9|=EG.ee2<(pK'#Cu:(15id+_1BʈZY'P5Gq>uF =$(ē뉎^gL=m8vˡl԰PvNY0|# ׻o\1BsԎkVXwUe2 mS3VB,5(,2E!arʼn\O!'B as!r?ϐ*!<2ٷvg9=bv&3AcJs.>:.a*maZׅl98:l0B63`27oӍT53>+vWu}5//.N.iu3Sl9lvG!<,XÔ #6)V bދf;d@z҅2!(3SM,J3Е@b{{Rp>K]Q}<1fڇZ#YpBO\L]+̓zO D2;r <̩΁!`#DO rŚ"kJWp0(vӧNX}8y5DGa߳'Þ6;HO6 >/H9ls@4!,a+ oFzS7曨y PÆF=dڌ'6P2oEEq5(p/KhLcnn\tHA"@:7f@zy$l.DB%&)$[GG_&hA%/4S}&;y59fav@s+l"%BR-ID (v8š[0h]Kq(6vmUkpdq{JLBW'$73a+ۓc6?ayaYx,!A0G7C-(RAG\znc$tҮ4M G] u&{Whdj=8ěHRVр5Bx- !(i\Ý6h$ }lӏ2-/Lcb6'$Ԗ~ˡӾ5zssI񂳊]p l&\4m]Բ*rō֐TF9bF'E4nAםW%\PJUx}8:gO% *r"/ z*Qq}O0d(rdXJw1!)Gd/u,BXw^]4 xUffSGR%k[^W<[:dV/Mɺv,^ A2cgm>Kd~v*th@IԀ34 [ti e=B. ۙȻme'L)g-g/YYihdS1^,ZHvs;;Y=f[Aeܛ_Q1.ׄa'E`l bhkƹuwm _^ud_PQḻ<ehrl_)kf\kMfϮW4NuaΣb3x41HMlNG%a5,\ g~}@mDN:eFסX|LU~jsz/K֐0  Cp']Q)PKAV]PKy.FDangular-1.3.9/docs/examples/example-example109/index-production.htmlN0 ވ+YiM!ۓ42jMzϮ[?(hngddbBn]`۽Ch9ī˿M4z䵪 hC}+2[#dO󲧜$9I]?rl&iU-]J:~lLp43z9柬=#3O6A0#» (&rx#0`HK) eL)W.|W(( 4k\}B-*K8˵eߢJjn?<"O0FGآ9={:f5ڍce5rFO:&$^_2d9Xڣj)D )q.5VG>뤨ƚ_+7~8[b֏jǃ,;Z=ۭ=zLG |@M#@'nP#䒰y9"So(TPK[UNgEPKy.F<angular-1.3.9/docs/examples/example-example109/manifest.jsonRPPKMURPJH-IՅ҆J: ̜bh KI-(O)M.(J'ee+rPK{mSaPKy.F8angular-1.3.9/docs/examples/example-example109/script.js= 0} B O"xAzi mVC黛Xif]ޤeҡw9Z)L&j~Ht% Wv}lguc[e[7*KTƨ-/ƁC9`:լX&?"OPKgbPK y.F.angular-1.3.9/docs/examples/example-example11/PKy.F>angular-1.3.9/docs/examples/example-example11/index-debug.htmlePn +ܱ[K|AV,!}Hf`gU/.Y3•bY-p ث)I(_p21 ؙ| ^EM]Ȗ٪->bǩnS*f5uɣ_u4AM=$úH+P}'NkPcYӲx&gNuA8 XtW7Xܵ1mXP4(avڄDthݚ{PKhnPKy.FCangular-1.3.9/docs/examples/example-example11/index-production.htmlePn +(w@Q/{\+KK@V/n['=2]VEV@7H';~mS,Np"a;bqYLat1KunhY' I+*KE&sQ\6 ib̹3NRm;i)AVS?PIX߱?<{cK bRRKp:T|v_PK}68PKy.F8angular-1.3.9/docs/examples/example-example11/index.htmlePn! WUn=^(k%Td5/<lyNqL.¬mLBv/U~48på4f!O]<[58byjA[UO2⚷j|Q9@9p­3}L%F$~_Jڵ6. IHv ݭ_;PKhSPKy.F;angular-1.3.9/docs/examples/example-example11/manifest.jsonRPPKMURPJH-IՅ҆J: ̜b|4f楤V委&deU%2 Jaɥ%E@CbjPK2s_xPKy.F>angular-1.3.9/docs/examples/example-example11/my-customer.htmlKMRN.-.M- *8H%BjkPK~&5PKy.F7angular-1.3.9/docs/examples/example-example11/script.jsM;O0ΑJT"L0!>%?B8Mz{lUx-6X2AvFo.$[<)7 B_SpmL{bm?.4έy,`ԙ%bxA=*fm-S5!0e2-Zv5U+Ve`q#c+(Wno9mL:hө[PKnFfPK y.F/angular-1.3.9/docs/examples/example-example110/PKy.F?angular-1.3.9/docs/examples/example-example110/index-debug.html}Sj0|؊BZِ-)O|,ݩȲ$nȿwdZbl,vvGkƌ:m$)hzT}T1ankp/j,jy_]} A6I{6/hCu+)7)ONWl JlJ8\F6QُfTC({Lj}s[ATa 2T*gcƇ&]RFsCkBddO;w #q$~>`p&/f;`t.." >pMEZ'>?'ѷkQuSJ%=bX8FZSFkNԊ{t%LF h'`[,̋gQ!9x^ }Z))Pm/|&c|*V ܾW~x}֪37KaC%<AGM 6n n gcL❷%ݧmcPlVM8~}S_E @,*2A;=t۟? tY.21CpAY\'XH.F6V7%s'*`hhOW ;Q~n0IX+q69Iр5MHlyVJG!Ot,%ziN#3X;lS!oUI9{gA_$_PKv*PKy.FDangular-1.3.9/docs/examples/example-example110/index-production.htmlSQk0~ϯA7aK KBRx}(nS64tNߝ7 i4n"[H abk}8I'Cݗ@eUC6E>}wx6(7c>Jjo0\jދQ[Uv?N(hd靚nj@l  my aV)svs2[b H0ZVɿB>܋Mɦ~>Oh{.wH[LHYRw$63{·Q[,vdQ oWXVz/YE((xWGn19D_6z0c[=)nh OȓgVł|r,ʓlaaqlܧ9%zuOԪXjfxQ eHqgi4me&~PK PKy.F9angular-1.3.9/docs/examples/example-example110/index.html}Sj0|؊BZِ-)$O|lݩȲtIܐN/X<}\RPv s#6?/mv~Cp`YUBՅCH}!C}#MhU]hGvTI{|[I ZLwǫJ3ҏ>9 l :0stoYo*1&18ۓe&RFsMkBdmU׵w #0I}V\> `?t*." P$\Q9x|IaTktPܾX>'}GLTQA{Hkj]\h񀮸9ш5 oKA2@HD') 5_%xy])CǾkq RW@e P 6&xn:*5g1pfz"O&'X{C{.d`T/J"/a}PKp}PKy.F8angular-1.3.9/docs/examples/example-example110/script.js]RKo0 + -:a;mBS&]_Rc4{.mNq]rJ7( Ӫ#xnЮ* xǵk)h֗|ebXVV3δb!@л# uFN@h0uݬ ˄=׬'yd?6UDwnD+ = E^wѢCe S=.96DckJ%/!b>Dv]郂a=NbPxx=Бa |+Mot|LLQO(iWaӦr_d?PK^[IRQPKy.F=angular-1.3.9/docs/examples/example-example110/test_data.jsonm10w~q ąŸ#U/҄ FbNn/_} *CXփ.ޛacz,"X?i,3k [wjvցRى-\KI]ܪD>$g3fS@.6 Ea04HUT&/PK 0PK y.F/angular-1.3.9/docs/examples/example-example111/PKy.F?angular-1.3.9/docs/examples/example-example111/index-debug.htmleRj0 +TSH MBoځ1aZͱ->;N aθ*̹A8ZduD.KFP9Zɡ8E1u[0mNygWUqߕ4H -thuH;%M=uq +~Yy0r$Wǡ4FZN`ހ%|V )4Z : P 4{~v0/.a(-෗Ԉ%0Qw[ WO*?']]$l+bԻ[ƍP^M2o\J6w<xv(Hw( fdcrF떦m+n\pPK>E5ePKy.F@angular-1.3.9/docs/examples/example-example111/index-jquery.htmleRMK0ﯘ BwaRO&?D {VӤSu&MeY(4ޛyyi$wU>>*V0`Q3^# " x_+PE ߢnB xY_OԑfJ[5%I>ihԦ'Y ?GrZT;U9i0_Mҥ,WSQ6eplN F5J]DV]uZRe"W0BT-P)gcU9NЃHtr")̴8 F}H-n/oɮ`'v+t} FKQ 6vcw J~ 6٘&c#OڽMヿOwPKB}PKy.FDangular-1.3.9/docs/examples/example-example111/index-production.htmleRj0+bKa)aOKK%Şuʒ6e鿯d1ϼyztNwe>+,s5/b MdLVkb=k0ef6ss SkFZܠG ʴ GEq_ L?/92j3b~szK- ml2nI@\ kx3!kFbWA5egE5)xPK"~ʆPKy.F9angular-1.3.9/docs/examples/example-example111/index.htmleRMk0 WctaѱԛcY[F8A@Iqp#( FAPG;ҺcrpXiȷgZVJ@"dI5DZ#_ѰZVY\V:-N,|_,x/VA'9݃n4Ubߐ|N eF(%Ek=Of*xT\jfы -j!RfV|on I7sqw+B(iw9yw EqdɅj d`"h$R* P,CPKDsNPK y.F/angular-1.3.9/docs/examples/example-example112/PKy.F?angular-1.3.9/docs/examples/example-example112/index-debug.htmlTn@}W SQM%v3"E<@6q޵v7^Kkʮg\Y/*YM2-rg."5 #Eà\1їӁi v!$ERr]GR5"J?y͙Jou43qYC'4M43O"_jNXo&TUZs Ţ^)HK)!쇭9ԥ쐶7kQFoZ4]`?)4f 7fZ.=.W;ʘne­NCLnt0+ThaPLHCGG0HJSq'osM4 2J -G+Og4~4y54:cL!^4NEA).7(yOVsi߰%)Fn%ݽ\mQTتP0h Es{WZw 'B/{oS&:,_*3pK]"aavzgg{y떜=ɏSSN 9,ua;TKǾ$J #G+n#j`ךn.c v"/ o予^]F=^ 6A rb7CEjyDT(*ꬴ: @f 'AʼU8>f֢J0n2܌r{6{:Ӱ9cgGS=;'r'?MmgramJ[cI4;;QEߕ yXoz.jqFb;W_(3JI?_PKBuQPKy.FDangular-1.3.9/docs/examples/example-example112/index-production.htmlUn0 }WpPXm-- auʒ!)k˿\ڬyD2ERv֕[vsA\5e*hqXte";s:pI~xm'2u4::EVxmeDL!on$Nؼm1)fQU ͭe,?V&ӂEP,W‰ݗ~PM1T+)ݲ#.'ģt7=j.1 3ZJ4Gi~e A/m;B~[% hй%8|pp/n|]vM֞s1uhAMN}Z.}ahл=J;:SV68zt6MNf_7Ί?jК?|bQ1 =) rEDY& TZ2y:iwGs+. 1(  9mza*ܶ}BU`5&Pa xKYtMz-fBՙ0qbf7#||daK*6nv$=59ErѺ"b6&'9N=xa+?>f<ڊwZwuU/a5d1\ ?5Jq _4,|UPKJePKy.F9angular-1.3.9/docs/examples/example-example112/index.htmlT[o0~8DhĒC&bψ r֛cGKW.KzʪFsw/Uu J`r^%(g@LeA`ڠ/7W;:˭v! ,eY Ԛw$ϋPΥ`:oL2)9 _%EPNU9XU~k46f)4Ŧ-2=yJԧi acN/M:l)k˕< 3CHuhfFk`Š"L_m kQQD w&Wz^cZƅUy¬T`PUG0󩇗o <d0=w!=Xq{{6)Mp*yluIcjUJb{0U"V{4;-Ai[ܦ\QPߊ`VK]3ʆVZ} f>`ܻʲ89v{1ܭ0?^dnT{tAp^8fCxXcfG!vw\nȹ8Dǔ>Wsiv1GSTvF+b3Aprzb{h(}IPKԀk PKy.F<angular-1.3.9/docs/examples/example-example112/manifest.jsonRPPKMURPJH-IՅ҆FJ: ̜bh KI-(O)M.(JKKbjPK%UePKy.F<angular-1.3.9/docs/examples/example-example112/protractor.jsT0W]Mh%p$N\8ɴ1u`Սgh] DHQb?i"4.{`u!ASћ "\ "[$7}k)HՆЋŢh[kFÑ}ZC;"䑈)%m+W+ew(5VKmZuhc/GZ(Hp58:%l5U!o.1*)^L\ ߢ2A~sOg6?&5E`auP뫆Zv[072\Zh <lPyغ=$쬭4=g;zMr8<6)x?)HyS&c&L]c65Y)l{qR-3[CӚX, M$nЉ1g4PK.ŔPK y.F/angular-1.3.9/docs/examples/example-example113/PKy.F?angular-1.3.9/docs/examples/example-example113/index-debug.htmlUmo0_qXhi0MBhK" '>8ɭ58Nd; 眗i3RrYVv]",m.I> ZD s ȳxh9K ڈ}z₩}ڰJ>`3ѱaR- $LEi4by)r%3,Ƥ;kp%{0h!¤֠>/ˈu6,~mb.jʋ8v!|M»PyZ( )QO6R}nҢDz4rJVj[m 67J%Z^XkK YDVbb_+^C0BEeX] 3xo]Ψlt}ٵT;,Qc`l 2Nd(E[+]{N$.VZ$ͭß q^Gl'`po!+'+chS> ָF$$< &b^2;Fz VOZh5_ Հfm{Q܍_N!PeTlG ,bP Nq$RfvucpV"V\5 mQ@Xj=mKq}a, z!pq"mžJͺfHtvt鮡v+!V}xu<r:cȉ# ˜ ~*S=JGY%hA4)/ьZCSn;)y;_PKo8PKy.F@angular-1.3.9/docs/examples/example-example113/index-jquery.htmlVn@}WL-T jmK-acO]5ά/qED93gά21U49'}gb9(,'aAdJO&3,/8،9y?KTU4XNTV*ȼA^3N[aл %_rgi&2Mu \NJ"r:L{h6%˴8u!|wM½>~"QsTS ~Tc_DHCFySdRLC{/EZdE.M1rɥ:Z/W…A\ Ue}Lō>]N,KT. ݓa)lե*9#QQzJvhPhJ%j|cZe#`+`po!VV4}#gzMzXc Et8@ёJ6GXK/4lNٓ1gBRˊj@޶=wT8 JnhR,y&R<]fV`ĒH k-׍iidL0+ j*iTPssҖh'zaN¹ j]> {+*wU 0.ޮv%B5 5x6DN,CVFxJne}Q'@=j9&M Fγ/;o?PK?+PKy.FDangular-1.3.9/docs/examples/example-example113/index-production.htmlVo0~_qDhiŚ0UBӖD 'lnrk=;nmfb%D2ڪ@X\$Ƚ@0=3 ˒@e.6hcէ1ӂV`@6i>:M 2\(lp&ռ`t{aCPj!k[(܄U)3Q0 ys/[ 8&pϻ } 7\eŔEu"pO }|8w! ¿lčZ z췇}XjkiȽoKYaܬO_pFF@ q 0{JE^dkÛ}dJj:kQյ%OX(<vEl3ȐdYՕ.='QS]nJhhK-kgڣe#hscoxӭo!+'Mco@ 42& 5x@1Zh溢Y6ݐY5s=%\#eE5foz헪0+ʌJh}8<9F{nVbđH ; gU9_}pILSf4mGGqؐ#lfD,aa5YInBei5fu!+܃`8jt5LӦ]MGmt^I;j~&L:(@i化8h,6%0V*sBqs~}?_$Xh(KtwViLVRR_^C ]YK4 s aC%/ϟ],ͤȾ 68*=ARprue*Ήq4l%{4tQ5I3{A*n[4 Л?ܬe吋MWƄ핱S)P[k B!ItyPAl^d`׀bgYi3[3zyz. ZTu\ԕɆ!PT|G E"pz q2yMX6=ڶ'%GC3%*))Ԝ|4cON)+mMv1c:9Ɍ@BgY&<3Wt#)n~dj!+PKPKy.F@angular-1.3.9/docs/examples/example-example114/index-jquery.htmlQj +^qSz(Es)[ IvZ3es[(y͌oC aɶvbXN @NH̠㌤;Ixh$GO"pr{lg~^0RjUY889ZcCG(T7u?Z)lk}_!I/V9 kJ;NK%E1J|A1׿\vo]ȻL1S((э-ÙS2'5+Ej_zշ[isb[/PKg lPKy.FDangular-1.3.9/docs/examples/example-example114/index-production.htmlQN +Fb^&(%-iPēy̼wWx f\mJ7 ) -ǾF j1i㍞24huzk(G'7;jy&6T4!E%crv~ZZ=ǬSmV%}lO?v5]9jT Loj[USvk8p!kWp+%`(95CG h93ߝzs*7; GdPKbPKy.F9angular-1.3.9/docs/examples/example-example114/index.html}Qj!19^B':2cVqz ˲s ,%]UVw+%YX0xED:ΒHkI,j0ΛEI>K U:$o7v8> 5EMc3%-IS2w\~6ﲖqpr4"xQqf:%I9cIO;TNRABGi%]teC&3lX#4}UPoPKnJ,PKy.F<angular-1.3.9/docs/examples/example-example114/manifest.jsonRPPKMURPJH-IՅ҆&J: ̜bh KI-(O)M.(J'ee+rPKCSaPKy.F8angular-1.3.9/docs/examples/example-example114/script.jsH+K.HK/I,TRPP/-NU(.)L.QJ槔j;d&gV$䤪(DBK3c5j553R`fZPK5f]gPK y.F/angular-1.3.9/docs/examples/example-example115/PKy.F?angular-1.3.9/docs/examples/example-example115/index-debug.html}RN!WL9i`61QO~ˎX2kۿk4!yo@:mS*KT]SI$xR=Ȑ`jէs/xA&NyQO&IK^lմ@k¿d'eJU~7_NÕy;1q{V9SL?\~*hg"KmI6aǛ[ּDXۡE ~Z?C/9_PK<'{4[PKy.F@angular-1.3.9/docs/examples/example-example115/index-jquery.htmlRJ0+fsR0-iAPO\l:f7Mj3uoҬ dޛ7yX5N< tԛ:1ZP6u z$ G3P M맣SO,cqER^z Xa)΢%_$ ˼aͨx' O<`Ad:EL,</ˇru>q6JmrQwS2W|D#P!H| v61_;&icMvX0jH`z_i+ٍqH]v; x{Ǫ>g6h0}vS>}oPKTPKy.F9angular-1.3.9/docs/examples/example-example115/index.html}RN!WL9i.lb7PKw4\PKy.F@angular-1.3.9/docs/examples/example-example116/index-jquery.htmlRAN0[@"qp"!h$n;.P )ޙ8|ZICiMc-LW34,h Hd/FTח>Cilbp!LT.߽O8μL@"Q9?ʚE>ig eEUTMe-җ`~b:';oNRĻdLAmg0].6pNZAbyl9\[582ac M6[D˶'i71ĉ%b8E'QoLFڶdhY*l @HT'T|A VG{Y~S׌8  Jƹc:^B~qax,Vsk[MaqNnT߫gL[&l]svs׺lc?(tPE ϓeM4FzP #N6G0:(g -=AZ^juCQ]$j됴Jf^QD&h/ـޜYN3`zl eʾ<~PKդUPKy.F9angular-1.3.9/docs/examples/example-example116/index.html}RAn NTR-Uj}2&}jHvagj#4)ZPM $ c@[@ 6'9xPangular-1.3.9/docs/examples/example-example12/index-debug.htmleKn 9eOP3`PA@5/Q[i$$[VO.Y:2+ŰL̶jo`21"aji~>}Z`61`=>}UrejmŢ ZYWU@:)9 KrVarּ.YNP3w``,6m)@~?$Rddo&V %@7ل)B u+, ~PKҳtPKy.F?angular-1.3.9/docs/examples/example-example12/index-jquery.html}Qn +(w@ΩM :``.̰+_l4& wnd pSm4"=&sTz`^ 8}r@='Z Rtd WLzL)XD_IN~>*TtݙLk{Ѯ$ܘNI:rjQ#\{3g`gC0G +AR0zȤM]Ѡ} lP6pKZK~PKHPKy.FCangular-1.3.9/docs/examples/example-example12/index-production.htmleQI  w2s|:r8?`2Soեn*[Dr-NhXik i D8,@R"Ŏu^\HG<^U1 uohY% II9,pfMUp{[sɼZ-%6?.Nw]?aAnP\ވ(i=J>a~U amn /)XI6\Dډ%*`وQu¼ځMb_ PKPKy.F8angular-1.3.9/docs/examples/example-example12/index.htmleKn! s =U06=Ar VBKDۗGVd &C{FP"{Y1 sѥ")v:~Vorq;|=)&7TS\&(b6uYWe#wʋӮLvx:gڊ͝&< r7uҤH%yE ;7J)`~0ŢMB&0LvGJ[[x}8PKNPKy.F;angular-1.3.9/docs/examples/example-example12/manifest.jsonRPPKMURPJH-IՅ҆FJ: ̜b|4f楤V委&deU%2 Jaɥ%E KPeSRR!@;bjPKjPKy.F7angular-1.3.9/docs/examples/example-example12/script.jsM=o w JKXtNU FQ^l'w>;{E&x.O2a rB(E7KIE:n#Wбϯ <`-Fm?!0͹f1c$TNFv^:<0xR)~^8PRDJ,S+)w9-(+DDot{ƍ]$QlX:aݬtqb gDvlfjxbPK gPK y.F.angular-1.3.9/docs/examples/example-example13/PKy.F>angular-1.3.9/docs/examples/example-example13/index-debug.htmlePAN!+;C0]`,tf10gf1f*誮C( B9- V+a\X&!Lr_6 +??3׹@,ok ~I8CȖۚXI4Vγpjr1zHn!iz19pmUV+a<+Cv/aI ʗ?>$P~oT2 u8tx[PKVPKy.F?angular-1.3.9/docs/examples/example-example13/index-jquery.html}QN!W w 0HWf -1Ą^m5; #ưL 6 {Lh; xz |X0`X8}mPw4S5W}A֪3\JEXrM <5h5dη;[g 5i5v֟yY:[t w+8gX\NXsP %m sJ+ЪxPK|PKy.FCangular-1.3.9/docs/examples/example-example13/index-production.htmlePn! WP\r`ҦP%@ڰ%Fٿ/,m'=f-w [ Nyh+2@p';~mE|r@O<YѬm Rtvl&$% sl:&QEN奈?oν |)toE. [4 3S)R`?l[ccut#7V&:e.'w>$q\9G65ۑqKPKKyTPKy.F;angular-1.3.9/docs/examples/example-example13/manifest.jsonRPPKMURPJH-IՅ҆J: ̜b|4f楤V委&deU%2 Jaɥ%E@CbjPK2(_xPKy.F>angular-1.3.9/docs/examples/example-example13/my-customer.htmlKMRN.-.M- *8H%BjkPK~&5PKy.F7angular-1.3.9/docs/examples/example-example13/script.jsM?k0w !ҡCHf(t*tcNP+۱-޻qD.EOZkD]sTHx&qa>:LL{$)}C6iZ7,TLɜiV_@u N*f*m-aUzq 2vXvM*Eo(kB.7r%̋Ff ׌kdskV^\%wPK/z,xPK y.F.angular-1.3.9/docs/examples/example-example14/PKy.F>angular-1.3.9/docs/examples/example-example14/index-debug.htmlQMk!ﯰ])Ѓ4K)-C8_o޼Q-[v,yLk:Tb=P4?| թPax5!y`A>ql@jj[82Z^CWo|PA.CTN&XmlIIsZ2٘!\6n>UK=&h  ih*B{"N%Q^> PKܟѡPKy.F?angular-1.3.9/docs/examples/example-example14/index-jquery.htmlQMO W w 5<^&^X:v 5;,1Y0{o>WڲE`j3a8^`cL{(٣I^-)Q`4>:`A{7BڴjHtmZba9فKXUk~w)QF;WT }u&n LӪͬ8m,8pS~9m+ JB ɠ_ 7a\CI~zTD]=Θ!PKPKy.FCangular-1.3.9/docs/examples/example-example14/index-production.htmlQN +=.fA1cƘ@MPF3p_y7[rX瞂j:B> ˼ E`0-cxx`!lKeIG2IQT g *5'(Vāw͝|Itn[ StR4ri#~f*GIoF-w2BBg 6הA,nrk!t(b/PK;APKy.F8angular-1.3.9/docs/examples/example-example14/index.htmlQMk!ﯰ])䐃4K)46M1@{*UOsuN5iP0o9D`i`LٓU~'TBumB}(!ZCre(gop ._OJvmcGadi^Y\YsZ|ڔCKgwi@b=&踰 {.5@T"iOt$lK}PK;PKy.F;angular-1.3.9/docs/examples/example-example14/manifest.jsonRPPKMURPJH-IՅ҆&J: ̜b|4f楤V委&deU%2 Jaɥ%E@CbjPK*_xPKy.F>angular-1.3.9/docs/examples/example-example14/my-customer.htmlKMRN.-.M- *8H%BjkPK~&5PKy.F7angular-1.3.9/docs/examples/example-example14/script.jsRMK0WAH kY:jrH*') HNO*̅uվW[֠XGe]$o R.^zC C6 [YEQrLEŊ%" lؠb +ڞ[P;q3]T)Msbwqsܠ˜-~p㔸!#ag#&ZsnIQe}w)ߕ~PKwl PK y.F.angular-1.3.9/docs/examples/example-example15/PKy.F>angular-1.3.9/docs/examples/example-example15/index-debug.htmleQj +{#]l~L/ɥj,B@̨diV ~T+̛h 040av5X4x90=0#W mQ ehbeb(7op.|RK&Od.iY\Y:dy+w2<;K }]ԦHwI؅ \JGk)o#}_'[ Juϲn_PKPKy.F?angular-1.3.9/docs/examples/example-example15/index-jquery.html}j y H .L6@miuNWa m؉:U s:,#ySH3s)Yq%ӷ M\p'_+Mɦ,LWlr2#{YA1@,"nd%H}u:nASl=7cyS~46!{6^`AI&̚ =$f'.wGc|PKy.FBangular-1.3.9/docs/examples/example-example15/my-customer-iso.htmlKMRN.-.M-K *8cH'BkkPKQ*=PKy.F7angular-1.3.9/docs/examples/example-example15/script.jsUQ=k0+n(ȆĤ-tP^N/@}Ԅh'{ޝKuPd3iQK} G:r CMԘj_y2๦ߔCAEM68]&N)2OJ2 p+ @|ɦq=W_{x5]B280<=i+L{7h֥2anFrrum{ !aEbQ+n<ӌ1)OE)C^nangular-1.3.9/docs/examples/example-example16/index-debug.htmlePn! WYK%j nx U !"UB3 /63•_&bYo sե")qoo9=[lCF>VMqY5yM.G޺2)RIcQWIع*\JEv*іu'PKFbPKy.F?angular-1.3.9/docs/examples/example-example16/index-jquery.html}Qj! WXLK޷`tEL}uJa hKzXҖ](yP 79D, @ًHӫx G÷  z$vs)ٙU34]%b%[Qc1$.4Ne>+ej:Mݕw6נdqX< uOXrwbC7 G5;Ru۲kZ7PK?uPKy.FCangular-1.3.9/docs/examples/example-example16/index-production.htmleQn +w@Ueݻp K# SMvz~~~6eB]hȭx7qfEM-a`B7Aʦ(yygZb3>:C1=bݻ}; љ1y#[շ  r'd7p?R,32鳴FخPKq#PK y.F.angular-1.3.9/docs/examples/example-example17/PKy.F>angular-1.3.9/docs/examples/example-example17/index-debug.htmleQn +\$Un`, /jR%{ DM{BXɻy H TfGRW doW\J%S8`7>>qmSVlEgJ֒O9Ǐf1u1䯺4 Xܢ!,\$Y]\dzͨޱ'7$:9̒~CrVW†QshI 6Xb1PTKI*߹ o̯XSҠnxPKb)fPKy.F?angular-1.3.9/docs/examples/example-example17/index-jquery.html}QN1 WܳBٽBִ"V4*!ErǶzX-!ȻS58 ~^@y$ sAM>3Yr8~kl7y<754&k+&DPD|L) T&؏G.bVC]+g$}u:n;Nթ>A8J$xN`=mFC^*@9:yׄʆRUD ꔇn͙'ĵMȊ y RCu]u?PK PKy.FCangular-1.3.9/docs/examples/example-example17/index-production.htmleQn +1zhTa_  x /YvfYOSдF+9;vX灡gj;Ji`7/|!ȐP.Z*SM&x):HlQE{\(-]Ͻ3e6JѦmn?M I0gbXy|6&a}ǶdU4OI>Br^A&kA^1KJ &Kʃ[n ̯X+DPSW~PKo|/PKy.F8angular-1.3.9/docs/examples/example-example17/index.htmleQN!WIcˮ~ȴ;^`Ą:TUw5Ȼ%Y3JIvoU1_Y R{7yϟ&dGſA!i-.bg1NySQbȎ')F\╛k+֋ xv-܋uMJb ! =t1o!- "zV FjfD;5X(z_|PKDPKy.F;angular-1.3.9/docs/examples/example-example17/manifest.jsonRPPKMURPJH-IՅ҆J: ̜b|4f楤V委&deU%2 JcjPK~Q`PKy.F7angular-1.3.9/docs/examples/example-example17/script.jsUO0sd#!'iJ{XҞ,3ؑ=$*{yc?FH;˥ 1 ZvsI  r;~cl!k& ,yg z^Tg5m],Jq(oA{?.a82Lŧ֜ {&M|c$M\x[ZX7$h !mxn ѥICII"Ft&DW/[96&FiD*.I]xOlR5^ϕ* 嬫Sangular-1.3.9/docs/examples/example-example18/index-debug.htmleMn >ńu1. M =M8P*!;4maōгʌ\Y4?|I%首8`S;eh`tՖu '=ƫSl!&1j'EX^O\8d>'vkڄ^+4nȲqc xQBX hF_~jc'/\)E睿PKê#wPKy.F?angular-1.3.9/docs/examples/example-example18/index-jquery.html}Qn +6{_~+ V/=D ;34m L,SгjYńԳz.!rE5kŸIQ^,)ꞵGvmw)*BW|_g ղ,)I5_LDMu9bcyF0 'f)=?u'8y)PKO?PKy.FCangular-1.3.9/docs/examples/example-example18/index-production.htmle;n0 w\[d 02a $rJV_@'R)L7O0'F3ǡ1DJ={?ύkfWZܸʤ\Sf 'As\MMЫIgyZ5%}ߝQ["n_F8vjS@^c~Q2ƣt65*1vT4gi&(3dS|ݢc'8d|v^xJPK֐ PKy.F8angular-1.3.9/docs/examples/example-example18/index.htmleMn 9u,i{(X -gh4w/ U[`=!D TXf*#U4xZ K!](xG*#xVWiAyOS*+m9u)lS CZNe:5{ħ\>8PKUPK y.F.angular-1.3.9/docs/examples/example-example19/PKy.F>angular-1.3.9/docs/examples/example-example19/index-debug.htmleMj0 9:oxlR{ =OҳFC{BX;50O k V #i0iboWT@+9T/_'-Y֖DP8<m_L:H s;&V?YNYbVf~6@9:ybsjgu\|@hAh=< /\ivoPKHquPKy.F?angular-1.3.9/docs/examples/example-example19/index-jquery.html}QN0 +9FR `ZmH\D'TpX )xf2a05C#K3t<@Z$zV1!ʟr=h!˷ p=vbܤi /uV䣽 ޡ$*?] E~W"jT]w⫑, gyNKڬin﷎`\ P{Gg߼BE? f)? 8y)PKPKy.FCangular-1.3.9/docs/examples/example-example19/index-production.htmleQIn0 ε} `dV \JV= E ؍N@zF84PB3Hg立yT4^xMժ}LY+;뚢2( 3nrn҄^N:VsEcD3vqqJF8q;}Q)R/1~,Wg!JgSpZSB8$H3AѐM n7&+_PKCqPKy.F8angular-1.3.9/docs/examples/example-example19/index.htmleMj0 9&l pmR{ =OҳDM{BXɻy-Sa k TfGRW dk,9O_'0v56%&_]9'o^,xn+vti]aUJ/sVhjwogu s%;}4VčVփ\.Ay^M^Oțo7PKssPKy.F;angular-1.3.9/docs/examples/example-example19/manifest.jsonRPPKMURPJH-IՅ҆J: ̜b|4f楤V委&deU%2 Ja)9e@#bjPK?-]vPKy.F<angular-1.3.9/docs/examples/example-example19/my-dialog.htmlI,SHI,.UJI-*QRK-)J+N)MI*PK-zOY)(PKy.F7angular-1.3.9/docs/examples/example-example19/script.jsM=n {bH`lJIVdZq^[j'Y.)=:B^S3d8zaï0gB6G_^zΞC\dXO }jJj+$)9E rjǘm0PJ3;ՊwSnq[ jW4ӎ mrU߶_qY`]-7~r/*wPKC7>PK y.F-angular-1.3.9/docs/examples/example-example2/PKy.F=angular-1.3.9/docs/examples/example-example2/index-debug.htmlVmkF_1`IJIBPXf+vWNܜ{gw%K{!=3ϼ(eJ{ld]D(#'@V^ Zi{ғr+5@HSޤn:_;p^Լ`tYDY Mt/?iξrq 2oUuYmHkKwܰݗC#CcU/e+h i;K%[';+㥒-1xҮ v{u -/H\AëJ`4-H%佔3VZ~@v!s BM lTg:@U[U."'3Q+~pfPQ #0{2k#gnd $\ !. :=F0/ʋJ)PSzaۺ 7M?$3/Ȫ8h9@>ۊr2 =(Q()Яy @,h(URzFɱ|xUiX3"ze]'iV^!>ekgch vL\e[.+|YNs\~^ͼPzCJ̔ŹG Y2(^ugї_Ÿ

    NJkĮCǧmռt{*huitf(菟hwH)Oxl).P3w6q4?| ( |NGΉ= ?ΟStLk)#G9sۯk, tߒ vt2:=3[pA 4֚ *͌%ftE1s>|Y4 g4l -6 3KjYRgts#%WY?zv}d%,@jp&\fnh__>enew䋷f M_}p{i[_PKD;PKy.F>angular-1.3.9/docs/examples/example-example2/index-jquery.htmlVmkF_1`ɱJIBPjW]9qs}NR`K3<)U}:+&7U2qd@٢ePo6hȿs: {fm'rEE29sfּ`t]%E1Z(|Q̋y|)>䪜3-P`iLsąyVJ5{u]5Y%7ܰ&(!sJ`Uo~\xqBF%tKc6tP?;UZ JO%._DXIn?"l k;ԖLL\B˛F`<4%Hrjwߎ|"'*y`<[Wu8;֪E1UO9V_[{vK^luBRl 492l̘*y 9/iv 9$ލ`+Moj&6I4cXN @uF阄uGmP( N臈<\S/hpcH%Ǵ˙㙶8}Øɽ,HpӇ){I(F%|]8~jԓ'"* q?,ä́i8leKp9:aBmxB.L:xOṈ%*}N+4bjY@xq~*h>ƆkCŏ m0ռv~F*htip)\/hHZ(;m!鹃[\^<|: :wC3UU|m#_Ğ:̯]85R-1G)s;ڷGQkd,tHfk ..4΅wJN^#Z=AY.^cA[Yd(/ gWE3IAǎ]p Zs*YuS's_haU0RȮPbh#\a0~Tg_e/^hrvBxna3wjPK  PKy.FBangular-1.3.9/docs/examples/example-example2/index-production.htmlVk6~_1g(ǞI -ZhgJdH&IϛK!GofofC*W'ɦPF΀:(Z -mǏG:˭v! O"r%<8ӵwTw(#{&TmkSN`eq|Z.G]y@9)Ӝ}>)JVd+#\Ӎes [ J`kMojfh2Ȫ&dbaBOAl0 eFg;,1pC$~ƔSS>Rxɠ |G8$ |Ѩ}5g#£Fk9Fc5ܼ_44S:!NQ/n5S2pm [ܰ^3[m)L kٞDPVyf0,g׽EEF!vo qLIݔ+-.@Z)?``C f(1%kg,f3}u1M!N~>W}dE>r_ѿPK;Lm(% PKy.F7angular-1.3.9/docs/examples/example-example2/index.htmlVmkF_1`IJIBPf+vWNܜ{g_si/XgyfF)UC>+&U2qd@٢eP6hȿs: am'rϫr/h{-qh浛4RAKs8@0CA|G""kd>ᡣ`f {$C5 sway,P[9 >\~a{ؓό8uK[-iHo8N3 DNᄒ%>Z#x/}R:Mnd=qzi%@"(;0XVޢYżgSn dXH"dMr=B ^#'zDv}Xq2. Pq8lbboi__>oٗ۲@4AyHoaKbն PK PKy.F:angular-1.3.9/docs/examples/example-example2/manifest.jsonRPPKMURPJH-IՅFJ: ٴ̜bt4f楤V委&de(bjPK\8e CNPK y.F.angular-1.3.9/docs/examples/example-example20/PKy.F>angular-1.3.9/docs/examples/example-example20/index-debug.htmleQn +\N4´$u@dZU߇CUM ~6rcΧa̓INc=2} ' bܱϏ.|!5ֈ_<,UXRJK:9Ccm+)b{LJ&5հ<s?p5+C} ;b:&>ƎmoqL'nra h z}ޭ1eM<.wk:vDaɐG>8r6ĭKٹ(ho~PKIPKy.F?angular-1.3.9/docs/examples/example-example20/index-jquery.html}Qn +6Z&M5(lR .V/+Hv'('<"q0mų#l$Pmd/|ؐ}Jx_1vHOL*zlH]Fgm]HY-o3$?(o823tjQ1 I{ Y[[W';c7d e¸.{0[cxJMT_)Br8r}kt6&ϐr?PKen;PKy.FCangular-1.3.9/docs/examples/example-example20/index-production.htmleQN0+>cKN*zpQ֛lI8yovP^S@5}+n:R(TpYEL;"l?  -zGWw$RaLı S+bmbeqS.j9MC-<4uyAn"Mkn6/wUIr`f{J *Ro7C+U Qi|*L&~JX(P;g',^.z8vR~T_PK%$PKy.F8angular-1.3.9/docs/examples/example-example20/index.htmleQMO!ﯘrD@tQ>6@]fi7̼D]a*ލ$a`=2c =zR)cێ?VˏC-|I T gfMIʏhy`uļql0ͺߤ145npcN`S1pb +{sl'_ʄ@0|SP mD\ԍꊀf \PK#|7YPKy.F;angular-1.3.9/docs/examples/example-example20/manifest.jsonRPPKMURPJH-IՅFJ: ̜b|4f楤V委&deU%2 Ja)99ũ@bjPK(6%c|PKy.FBangular-1.3.9/docs/examples/example-example20/my-dialog-close.htmlI,SHI,.UJI-*QRPIT(JMI$*)&d&g*44J2sSm@U%'甦 PKZmPKy.F7angular-1.3.9/docs/examples/example-example20/script.jsuRN1-".2 !P! coK>;wxQ;˅=&#|7,mnV; r 샶j%A{CN:3=g۹l;PG"ճmY#{qZtI+|¸#! 0TóV -aOX3y /q&C wժ)x e,J{Ik;|1&o|v͑L I 9@}]\Z4. #\OCD퉈.ˈٝboX(kh.]1PK$1EPK y.F.angular-1.3.9/docs/examples/example-example21/PKy.F>angular-1.3.9/docs/examples/example-example21/index-debug.htmlePA +wJzlˆjhK&.Ń Lvf}0ː6O0ɵgE%a)5q3,gr^8yG _<~Z#GCx1 kU/^EUK~݅yVl%zvY &b/̠N*3PK,'PKy.F?angular-1.3.9/docs/examples/example-example21/index-jquery.html}P >v@tt\V8 kJJ'!=<|hu`ǰLhB7f` I'L[4pM@H0Fy7wfhb-U(NB)5@%F5u/b6˞?O!}ʷk0l.)Me\Nm%au/)n>PKHXgjPKy.FCangular-1.3.9/docs/examples/example-example21/index-production.htmlePn!+67.t9`#"agwY񦢬{-4e^W\t^ބj>9 `O4娞mnEf*,g9nb&F4&[qg›ü~bgv}3o YSPLi&*5N%a^7lR;;~PKj^OWPKy.F8angular-1.3.9/docs/examples/example-example21/index.htmlePA +wJ޼eSkޥx01! ;wfپ:A^(#r'+W8!BvoT'P:a!:9fR1k:cKIMﭒW4`t/7߂ *t A >Z!M)@! Ȇ.D' ٜd smt޽xʍvcZ'(+f1{γr2iF2LӔ7 ƞ`;`v}F@&\%i5D[angular-1.3.9/docs/examples/example-example22/index-debug.htmlmRN +FE7{0rxl;nQ(hbP֤Qf7o޼ zץ# Y|Qe8\@ @XL Ae!dP>|) B Xro6u xRKbOCײɨ|D&/e]?Z ^gedܩ},\'ګaز'4-(:l6 hA8YqN$Bɉ?sWKG+_t4hqL4eڂ"iS#85( yeZp Lvn{85Nps> ߚE_<{I_/PK?3PKy.F?angular-1.3.9/docs/examples/example-example22/index-jquery.html}RN!+Ff` 7xإ‚&nRF&0ü{oWSi}]îa8@ٵ a1IP S^6-A`{)7`Uu#I2IEEOjX]s 8 Zzy.}d6HHhd d] guî7rgźDTy9 &Ƹyvz'Ђq9D@R΂]?YAG@2[.v )1*u'2!+{44Un;84ps: .,9KzM|~f_PK\iUvPKy.FCangular-1.3.9/docs/examples/example-example22/index-production.htmlmRN0+_QbZz܊8o%uK#jI+Ui㙑]d:xm2@Fa "}_UARISG5A4e%.dR >mY2( 0qwׄ^Z:3V3AcE>յ.V m$u <v @ql_ ˦5nEԤ{ʣ%4앴vVִ]ce9|P>:]`6Up?B_0tAw7c}O}!ɐM*]T^Z|pe&vnÜ 6QxQY=/PK?\cPKy.F8angular-1.3.9/docs/examples/example-example22/index.htmlmRMK0WJ] xۊl:n"IݤY͛74{1V.z7` G"ۻJ×0^#5j/fhdpS 'Ah=yE茲G$ [F;jSF\w {W;U۔ku",2{ZŎ[z[ h@8vJ Ef zX/ SPPAUd훢T^ ݥV' zPp K7لGܜόloͬȯ0Z.?PKt?=1PKy.F;angular-1.3.9/docs/examples/example-example22/manifest.jsonRPPKMURPJH-IՅFFJ: ̜b|4f楤V委&deU%2 Ja%I(by1\PK6zcPKy.F:angular-1.3.9/docs/examples/example-example22/my-pane.htmlI,SHI,.U*IL-HKURK-/U*NIM.IM %'甦q5PK)j<>PKy.F:angular-1.3.9/docs/examples/example-example22/my-tabs.htmlU0 D~ %75`aqTw I~ٍBaAȄ-'\L_xnPaH~P0pTrFnWWp$ )1ޜooK\MضUV}wk­]}$-WgL92Rp܅/PKmPKy.F7angular-1.3.9/docs/examples/example-example22/script.jsSAN0{@J*sJHwpd-p`[*gԭK%@{dz3IvӹoNI3 si*ɱ$ڮv *$_S¬jʷDd-cڽGp`d0Hx [dEFj[)W㌿s[u=xPuLٹM~o+ R9UU99vXcO=:%CYwf!M7 H#9֞^*;0Mw"IC6ϲ5RBFpwiBؐHE8U|-B΋$|6gDlUYu?Eq%_!;gU&TߓiQS2*r<}d!W#+'45v"PKWPK y.F.angular-1.3.9/docs/examples/example-example23/PKy.F>angular-1.3.9/docs/examples/example-example23/index-debug.html-OA [HK}AKbWka]fg~2NGle :RTF6|Ƥ@*DLz|HS(5{@FR:pVYYa bЂ-VRʓh8fx @T+Ws'=rV9 PKOjPKy.F?angular-1.3.9/docs/examples/example-example23/index-jquery.htmlePK #[uNRLlL ݙ&pˣU8㯚gf5b6`o&&̚OG>5=;o3kW8+Yi /xR !i GމVk"JVo_?t(YQi_ AG vχV,: PKF7PKy.FCangular-1.3.9/docs/examples/example-example23/index-production.html5Pˎ!W\7Q/`n2 & {GuUM}$b<ðjNwp'Ɣ\1ı۠h>'GL0H9.7Sm 馮-&TYFs.WGl&^ 4S7y+y亮An ƶn/  4KЉ~>[| PKY^$PKy.F8angular-1.3.9/docs/examples/example-example23/index.html- {q^<n6&.]mOaXt^);+; Ɠ:0j:Id ^ʾ,򜭑׏r`ZG?#oH*H:!CZxrmUdn안Dްz:|. ~*A )(_ӱVMWAqPKyPKy.F;angular-1.3.9/docs/examples/example-example23/manifest.jsonRPPKMURPJH-IՅFJ: ̜b|4f楤V委&deU%%E%EzYJ@ \PK? TdPKy.F;angular-1.3.9/docs/examples/example-example23/protractor.js-A @ }EnIP cvB̪Jm喫ƪd~ lL6բMŜw_ I"ӊNGpPKYo~PK y.F.angular-1.3.9/docs/examples/example-example24/PKy.F>angular-1.3.9/docs/examples/example-example24/index-debug.htmleRj1+V)="R/HPzЮVHZc7;#9XyoU2KB89ƃ_uff?{SvNaZ|A$ʆie>U(yb#5ؼ[QC-axFnX@< 6%Z2xٝ;bȴĚ0kq0[ FRxZRU<;x4gUkwz @`aVߟz7%`6 (xd6jflشpKt| hv';0Ro> ,g%{'a6ܠ8J\s[2܌e1WaU5%vwGa_%j3ĻLqk)^&O-.VRXy%MBRg|!>3iСZ~r{NqgmXlC%{Y(e W08>RvThź؟aㄧ+a~p([ BȺ(i b!~ <>2f@J?$f[(qʚVd(I΅#⺾PKPKy.FCangular-1.3.9/docs/examples/example-example24/index-production.htmleRɎ!+*$n9_H銍eg4,T,Lk$8 U 8-ȋz@8 5SA0GL?v|Gstкn.0-\lr2ZH'0ܛ03%ZSOe,%Wfx]S l\Tcȣ_bmuɞk %-n__9s7ڿr~[CKysȭP%-vlK)7}gͣ8Mz}'݂\fHŜD)CIha.+c~B8&M43Uݵ*B72??se=p%FLK%f:Ԉjm_PK$p\PKy.F8angular-1.3.9/docs/examples/example-example24/index.htmleRj1+U)="/hPzwVHnȿwFr0B޼7zkMHp9ѧ'0)@? ~aOkaFu,!2Z5 ,F_9wUk~#7FwLHO;3/rk K쾧pȸ$*KXޮz;mY)C;3y0vUnV%5g4r'4g倀b^ϞK*~|!Mxn^c_VтrBpVnwS$[r//2S$q~7j}D?]0:_FK/PKzPKy.F;angular-1.3.9/docs/examples/example-example24/manifest.jsonRPPKMURPJH-IՅF&J: ̜b|4f楤V委&deU%2 Ja@u%E%E A \PKH5]uPKy.F;angular-1.3.9/docs/examples/example-example24/protractor.js}JC1E~].K]Axc ƤLEw p5pJN(Jio|wɭBY4םI-"3 pUڞB!~!vL~eQ`?;ٚYyϓr'76lICjic胝 z71rw=F\ +/cљӯPKgź'PKy.F7angular-1.3.9/docs/examples/example-example24/script.js]K 0=,"AqY\.B:j!M¤M[__.=hI93wUu] -qkFA OF*E!lvjSa?䝮!_2^CλhN̿]|PKePK y.F.angular-1.3.9/docs/examples/example-example25/PKy.F>angular-1.3.9/docs/examples/example-example25/index-debug.htmlmQMK1 ϯf H;Qo^TG&U ^<`Zyqc]ڨ3bev3d '5SՈw 'ʌuh$) ?d'b|͠?$"Y7`;wlT֫L֥#ˆ`^.Qb/PKg PKy.F;angular-1.3.9/docs/examples/example-example25/manifest.jsonRPPKMURPJH-IՅFJ: ̜b|4f楤V委&deU%2 Ja@u%E%E A \PKQ]uPKy.F;angular-1.3.9/docs/examples/example-example25/protractor.jsMj0 y ыmm ;GIT;cgzH?_jM2*RbN1 1M5ul/THo#t#J4]^7%0c`y**1)|(Ś4=MB>s~Ӭk|2>m5̇ln@;O:W{5?ּs,angular-1.3.9/docs/examples/example-example26/index-debug.htmlmN0 } qCBȍиqHSk&QNLeN>*)z¨Eɀf22,H~в!c" A|ixj랺yQR%٤L^ixYo \ä20v?ҹx#N\ Po&߲M➿ɨԡe*Weo2:$ <'R ɚy6YK_'_ fxzd~PK[PKy.F?angular-1.3.9/docs/examples/example-example26/index-jquery.html}RN0+BK7Y)m wvCEHV6ޝ m`d)0hyJd [F-y~oNGro _=M{c8(HT7Ơ[4vwmEf,MQhsFхyI}U gXV4lb 嫄{Jzjzr^]fk.3 Dfs^vmMSI=@<}q1O4}WAEAu|PK-a-&-PKy.FCangular-1.3.9/docs/examples/example-example26/index-production.htmlmRMO W 񠇖Jbz?җ.M.U o7"-]h*Hq=4NU GbǝzdP>YFPVZokL? JZ/y'ZLp+}#̔1dIjV܍4wkLR7nj▇:7.?4@EI H;jnmD֖'0:8o(nLURXW,Qaz`BI< j0,FhFN$<~i1~Y~:YPŗ& RͿ'PK0,PKy.F8angular-1.3.9/docs/examples/example-example26/index.htmlmN0 } qCBȍиqRk˖&QMLeN>*)lhDـv3,Haس!S"hH> A Tvw+& &0ճu#C7j&&WTT+7븸v 즕ާe'ԃ>f@93BV{Tn}ق=Sټu){D!` Tn Q OMΞs PKu PKy.F;angular-1.3.9/docs/examples/example-example26/manifest.jsonRPPKMURPJH-IՅFfJ: ̜b|4f楤V委&deU%2 JcjPK\Q`PKy.F7angular-1.3.9/docs/examples/example-example26/script.jseRAn09TA܋PUU@RgcGC@(IUsI2ٙD*Nfn_,Lq* e FGGʒt&חTXz+ 1f;U,୥ ź%߁$J ǻktbC.⁐HGD4.ҽ5IX J 6#;4mA\h?nD!Bm+w}#yPQAM&!Ў9M+`!fo\fb_Nڎ$(4(Q6Ɔ-WqW+.+ J)4/CD, X3ǭvo lڸjWPKocPK y.F.angular-1.3.9/docs/examples/example-example27/PKy.F>angular-1.3.9/docs/examples/example-example27/index-debug.htmlej0 y \. lut"uqJώ($Oo)'#`ڊgFؾ!hIPm^cCv%S"h X<:ۧg;0TlAc YXyiш: Ӑ%]&w8+ylO qwz7gJ2(!ڸ;-"=f-rVI&4& 6i?-Brk+^9օAS|Y,/ݑd;PKZPKy.F?angular-1.3.9/docs/examples/example-example27/index-jquery.html}RMk1ﯘC6E ؛46_Ff[AL2a]dz*D5aFF8}=#g8U2(!uґxgƞ ֓z2>]OZ mCjхyɺ*Ίgv tW);x_FЩCJgcpZch|J~5Dć{GsY>=nP@c@f&E+38f3+ Ϝ#u!ɿ`sU`y 9 PKu(4;PKy.FCangular-1.3.9/docs/examples/example-example27/index-production.htmleRn +(=بQ-QzK{I?!% Q(^0Ie)}ǓZù3CL]YғeT-L;FPN_k(S]kE7LB0k;|~RMI/; 8~?PK<(PKy.F8angular-1.3.9/docs/examples/example-example27/index.htmlej0 y . lut:"ugqJώ($OoINœGEkJdF2$(aز{)u4ح~,^}Oς$U.U>T˚F G ^iļ7L\ ^䊭O@C-o#ho4\uz_A(g Hq( 5Z}LeƇ{#9kr1IݰrϋI~փ\vY8а<{5,>%mxt았fQDUIMkō%U)YyYppz9 M'cPKŵPKy.F7angular-1.3.9/docs/examples/example-example27/script.js=Mo0 6ډvت&,x5($m|';o^ۏia%)n &kʖr)iVtèuMQrAR MNW &A#t4ʍE/\I|K5{, K]H?kRaaxɯe{ P@_?(,XZdZT)3nf+2Iut. Yx~P榨oRt+oPKTPK y.F.angular-1.3.9/docs/examples/example-example28/PKy.F>angular-1.3.9/docs/examples/example-example28/index-debug.htmlRj0 )4COe82ZaT[K=X(} #jqu89A;,B54b OŞmFаf5n2 ^dZ^˞u'/} xdF:8j;\DiƐb.gF[  77B `g PKA6yrrwm Cqe\ʝʼn.H&VYYJr*ĒCv{Y>kQ'<_z~^7PKE[&'PKy.F?angular-1.3.9/docs/examples/example-example28/index-jquery.htmlRj1 WMr ŻJ=~U ^۵%G%`-Ha*Ύ`'72hv#rp9QDP{b^*S!QSiK\,EE&NyAE^usL R%_RTZ|!5Iڏʼd]ugn̮E:u$ljMGMՃaHu-TJ+)< Mn&su6GqfTD3$["rDMmqDL 쮑euUٿDZ?PK.2jPKy.FCangular-1.3.9/docs/examples/example-example28/index-production.htmlRn +<mTTMnk S> m7ill,T<.od `n;F7rv"}~EFP: A 4g%>-ZpPI;+A j`vȣgGd VGe(wR4m+Clolb-E-5|6p*{%S[kP 2ztE,'̷T+WCS-s3ϐͬ^jr&i"fEn >dm0Pm! Xcu%/_*TNY#ȴ&Ka=Nrnv8ZK>8q竷N]ȃwo>GpէL7XɻOn+=+qL~x!fI,qZ^oeq ,pN.3%sBHOsc2PKӓSPK y.F.angular-1.3.9/docs/examples/example-example29/PKy.F>angular-1.3.9/docs/examples/example-example29/index-debug.htmlmN }x 41ƽ2v1nY݅RFMHfaĕaOm*Xzб|J7t{G$^wmғ@,6G5P^]z J\6v1vm6x*n>F^%]?L3V!H6/x|g,aX搙;Z=?&5ZH IFx䶍資No|^ť \N8Z$xzHϏqPK}ʛ PKy.F?angular-1.3.9/docs/examples/example-example29/index-jquery.html}QO )N^MK']1M~FϮ ewF5?i<–zS"0ʶeiUSGR* H˛ `pP7%`s\ޖ$x&HA AKVU<z,ZxjQ-EX-xOGtV^0BYl\3mKd{ם! wgMOv3d*C#%w ڀHm@&$[Ogx"O9;w3rg{ Z 0,<͓PKLP#PKy.FCangular-1.3.9/docs/examples/example-example29/index-production.htmlmQN0+(KH|,+ǶMը߱!ഏ]xUNV<bKsdVP! W Oj4> @%>nT嬰\g #A ʘc;^Fa1%QaMs׬.u3h#m9+fQ?' 8+u}-t^F}C(g18c <=~W1ׁmOIhAnCƚNg(~s5dk #,C%#,q>PKS+ PKy.F8angular-1.3.9/docs/examples/example-example29/index.htmlmJ0}1WitI "Mmn$H˖uݤIddU;ži+б|o+at{G$^mғ@ GeAKVN$cu c'YRɨX횏liqYQ?L;Z _VxB1Cf:(zc0J4? ](ch$""i70&ᑒ]F=/=6p:}..Xf0vj "CҤx~t(PK  PKy.F;angular-1.3.9/docs/examples/example-example29/manifest.jsonRPPKMURPJH-IՅFJ: ̜b|4f楤V委&deU%2 JcjPKIQ`PKy.F7angular-1.3.9/docs/examples/example-example29/script.jsmRj0G(H&Avl] J>;Yg)!4m9)Zޝ{$Y'WFԮIVS :.).rIJhxF`lDڅ y,GH :pWc" )!T>y@Y\X P0 ?oy{*'FV;dQE'M(M9@]e/YwCF45EsA3Ѭ *a=S^1b[$u? cO'b4 c}WPK)&PK y.F-angular-1.3.9/docs/examples/example-example3/PKy.F;angular-1.3.9/docs/examples/example-example3/animations.css}A Eb.E74cbQ)%wT{I^CFr^sYt9-WY9 Kʏ̈*N!ԥTowW̍:q6$+huk?zV9FixPK{jPKy.F=angular-1.3.9/docs/examples/example-example3/index-debug.html}RN Wi5^.4wNlT/ƃ& q3M亃(dY9@5t1!)Fń$3 KUMCۊ/h7\p_Dangular-1.3.9/docs/examples/example-example3/index-jquery.htmlRN0 +LI\H*q;pOSɖ&%`{NT\~~/7}4t,0(v G$ ꔑ{{^ c|8x'L,]8MWL7jr1darf+1[DbP)Fx6TMMrANF1!8N1`,NlvMġefʐnlWt#Daz Ӽ:..\p]cWNk@y ӉV_.Yh}ԴGu\ vZx< !/9s9zǐon]] 0uulawCWHUkPm|%PKXhPKy.FBangular-1.3.9/docs/examples/example-example3/index-production.htmlR=s! Wz73܌ {ƽeu gt޿vmB{ғ9e ?d7( @ KT+{l@N/a?K]Rlɽ̻Al:{rS+%o@Jz"(zB=tjHj1 /zKJ]Ja *LW˥{'ȒiU8{݆(XgLēdY >:%dA$Ed+uPrG.)jڶfV|q*GnUUM*\+eOUangular-1.3.9/docs/examples/example-example30/index-debug.htmlmQN0 +Lm)84RwfLCL7u4{ )x0ej > Iv2H}o dy0G nK:cI.hO0N“YLYD.9I] ^güujۗ{$v2mÃٻ_9KAy}-g'Z {p `}@$m{i)nC2 W*9Y:sūvïWeOD^/5i =PK>LPKy.F?angular-1.3.9/docs/examples/example-example30/index-jquery.html}RN0 +Lm\ДTB$p> KSE) )g$FNW4`hX<@YW$=`o&CZX=e4Bv/~eBNy#(ʰ5h/%*bN]*^&T!-<Ĺ2^&|mLKAZMoK#5{~ h@Km`G4 Fq{TKj9ìE?vkJ<[L.pnvrhy  '/ClF}EM2$EYSN΀:U)njnEF]bբZjWm8&Qij ֫!(6YkCwU;w1k6<] B+umS.v%5E㨺Y3HE>эNu)Vi77)=LjWp8;u]%? ' g㳳|l PKHX5'PKy.F8angular-1.3.9/docs/examples/example-example30/index.htmlmQMO0 W"qASR &q C;I3!&EzNb{–*t`X~@ [$ VIU})A vO{iAKTU.{-'IծYB%.+J;W-vګ PIά!!JeREo F^6]Θ+4  FzG}Rfڛ-^=lf 8~Ŏǿ. x"6}1-8oPK^[PKy.F;angular-1.3.9/docs/examples/example-example30/manifest.jsonRPPKMURPJH-IՅJ: ̜b|4f楤V委&deU%2 JcjPKQ`PKy.F7angular-1.3.9/docs/examples/example-example30/script.jsuQ1n0y'$'? (E)]Q  dld9+ZΌWv6탩} @ a"U!56b?&yӆп8Wɝ[hqY r~ ;[{RڎHHۍ4#LVe=匿Ӕ3X%3*1K8K^uȧqcLOo|nzHI17gDŽ[:06sMA,eU,hۺ_PK#PK y.F.angular-1.3.9/docs/examples/example-example31/PKy.F>angular-1.3.9/docs/examples/example-example31/index-debug.htmlTMo0 Wp€8lceh%_nqzPl&U'K$ 4 0,"E| ! -8- ʾ-AB 1AݓFP]5W=no20R Ω1w`uoLs($h, pxsr/og+t[O\4%^[9=ڼ9g PKPKy.F?angular-1.3.9/docs/examples/example-example31/index-jquery.htmlTM0WLJ$T]'j[8U{0:vj;hc{Byx0G:4jW1T6Pu{tGa,)>:' r8nhHɈg i*V6Bl)b]Ӣ[V2s/⽏RxAr1 j'1;P-%i+" JZ)9EN x>9FEYѢ)1(k1{{2ތvQhnFw3z ɕzGQ$^u%*jdAhd+2s'v],e"ƒ*zQ&!/KD:bV3/)Fh{a*MopmSgYjl">QrAFZKqbg\Oj\2$⺸H_wV'Uri5*i_ki'- E!yhV?T|NOb^0YUJLO+g"q%{t{/ )+#0i1!Asj腫M#@[r?jx4 ,w/]諒oR*Xj\ E2IޔuAC& ~7ĉ8Ur ؙ[%~\i[9oĎ]*'0WfupM+l5#l\5!1k2c4泎<*Q.i24gf0qwv\&2{(><>o fԞaN9Nهlj<[75X/d/M_Ns4OQ|D/PK%PKy.F8angular-1.3.9/docs/examples/example-example31/index.htmlTM0W RS$B\kn8=vJ;ۤVBTUz{f< }5!&AfLj0 j8 yS>c ȠD4 )뻷ː' m1嬸k4'=2 S ]B7v<5|ZKf{ ge$R=WrAxu4M8/\@,Fxh; kMzq7zo4,]N/蟅;>J{C%(X j\ %H޽(Bl3`M24(9bĉ8#z1cgnyene!F=+|TN^Mɉ>" 50h\5!UW8ű髪&yDangular-1.3.9/docs/examples/example-example32/index-debug.htmlTn0+l@%!n#  89mH#F.v .gg9#o#'% VLjF 7 v:+*[`J{JB2Ͳa!k:l"% ms¶gEH?,H)TvL")צ9f+1'>M0[_ƥI[A=WmýseIx'?C>xQ4RU,8isy Z+(rm, aeR7>ñi62RBvEMctЫ 6H-Ig`ёPh|$މ%]wzgFg|D(  ZdR:@#*PШe,D1sQ}z{\m A')gvusZ^c뱮ŧF'Ƒz(XtXPr6==G)q Kn5zVC=B=C(I#1"#}}HQ\GsbTSPh?⏷89^,eAW Y'^PKU33;PKy.F?angular-1.3.9/docs/examples/example-example32/index-jquery.htmlTO0~_q&DDBmc{xpSQ!!m ~Kg% TLjF 7 nuWl~t+Y?W2ʆqv{ݖEĜ9aރby^O7ZjG0o"ŝ܃vM{"SMxWnJjr 5JI[}\J x&_])Dn$1lr&-ѭ !LPP(%| ζfQ=DFtUfCP?TkdpQtBg(`ٗq** NjV#MJe HD頠WA\# {O;[1:I]ͼB-4&6L°t>qГ8 :=qAXhm7YWIr,$1KPۤ>u 7Z yn-:8<秫Ӌ3 ?_@{=|)cщqx;Jt`bjXڹ|1?r9%z;3˱P<.;P31%ЄԘ cGfV9bM^~1X*NO Y'=PKS|?[>PKy.F8angular-1.3.9/docs/examples/example-example32/index.htmlTM0+n%@*$Ҫzǩڃq ةE+{gleUmyMmE8vը47ےIhA Ď;/C~\@PAjVKLY?~P)G މeY~Xe2Ϫ"OiTvxۖlc]ӗNlj&8t%_I[=תA gIx#?CL*YQRe8SN֐W?2X3IkW08_{x62:pH颡WAlZI.]DBB+q_2'2@;k&[7*nkI vI,4jWQmxR*GAٓP@e4 ;1Zsqu35:I[H%<o?zPCFTc@'X^8>1p\^О~Ǐw89],ENW Y'^~PKf8 PKy.F;angular-1.3.9/docs/examples/example-example32/manifest.jsonRPPKMURPJH-IՅFJ: ̜b|4f楤V委&de(bjPKƎRDOPK y.F.angular-1.3.9/docs/examples/example-example33/PKy.F>angular-1.3.9/docs/examples/example-example33/index-debug.htmlUM0WZ{XI{AȉPA\bƳiX(]i<;mSR$"<7+iZ4"l(fd@! h:5zxfè *m!q:^e0~l[Jc K:d B]*#@wǚ=;L3gh5[ښMIŀAs5k+h6;z)<SOMZ^f>:w`$$hLXzf 7.l{ ĩLP7ݢLB_OhhܣR<`W1xID.E/Y:' d7 MY%,L/NLjϲfbhA@*XN)MyZG+doy;#kk*VN{Yye0›rqc ^x*Xo+N!yi>^T Iw}S_(޹:񣦛}&2gaBKpzlLl&ʡfĽ~u/d;͇i0# |BT2*xEqNLPKM#PKy.F?angular-1.3.9/docs/examples/example-example33/index-jquery.htmlUMo0 WB6^A60 ٰ0Plq+K>菟(9Sgـ 0`"ߣH_4vazY-8@ Ֆ #Zz-EWww<IϢ$BV<-/gYPM78.Yu?h"dozUHas{)y9!^ ^$|-6P{mQct:rFKdǽ)yR((cBaPKamjk3:cFȮI>xd]pn^7(K-1{ d`w1("_rdngb_Z;簁 Ny/(yh>ͪ;&yG:i%.^t\$LΚ/8bl(듄4$O`1*oY9ҘϨ4'hDYڇ STW_A~ $̤~\/<t#GcD;?kt;~tm$S}(,& T6p]wN94dW?`Wol04 ~tEbK&\/<.R_f'moPK'dfPKy.FCangular-1.3.9/docs/examples/example-example33/index-production.htmlUMk0ﯘ҃mJ.؆RK)MīD\}ȏFzmZh`i4hf\ aծjzojF]z݆[ao?W<x[> ̫bz_^5"t^]W;ƭ(uVVUoޘ^!+;3$[UTP޻myY^ uyX[W-‡* F< > 3veB>agF) ?MٓBA3 Nq9Wm{$_󻴪yڒ1 d`GET^rb6gfT(SsoBAz3bT-Ww_ɫ 3+y-Ǫf{>^\q HRwLhO򸑽O}c|znMdگq9k.r]uD94f1N 7 F|Ms0p J&^E]x7侮+M_PK`nSPKy.F8angular-1.3.9/docs/examples/example-example33/index.htmlUM0WZ{XI{AȉPA\b&Y(]i<;mSR$"<7δiDA5+N/PB5CȀkV|@/ u܏^zz/Q!yUL[^e輢Z9zpYYVG%l9H]~sUvKG#zC+^e|c'}!Ʊf̸;l(f){R(h1`Fa*\Z cN( St~V\1xGLf- 8|@i*#=.'nk~dF AzcIqº ٍBSg Өl?tm<HK))Pwh/ъNE:S5^V_Ab7ׯl0< atCOwbJ&^oc} @/Cy[3FmtI]it k%t>򛶽PK!PK y.F.angular-1.3.9/docs/examples/example-example34/PKy.F>angular-1.3.9/docs/examples/example-example34/index-debug.htmlN0 } Nmp@S #H[uJ(uѦiN܌m RU;߿ηt ;m](`@' 5"hw&NHZ|lO bz0c%`K||*;l^ +_8)ZT_<[$j%3 saBlX5;K<q{|7|1zG[QKZ䧏#[x7#L .@-$XlZ- c{+>ݤ [ês\YU#$wDqBĚ! NY(4ʱd[zqy=PKi}S8MPKy.F?angular-1.3.9/docs/examples/example-example34/index-jquery.htmlRN0+_zJTٹ 8K7YT~a;UǛ";3;XܴIGKFׅZN2ںfB$|\H}X?v(̜x OC#YU5xgѦ'Jy[-|ՂOo,Z|O3k`Ry/Y3&]av?8ds񒚐o.2 Ɲ?,!13E-1T6c;%;[pmW!,̀b:do3˵krD@;.g&8s x -/NLq|PKh?OPKy.FCangular-1.3.9/docs/examples/example-example34/index-production.html=o +K&UEjfI_\%tm>] `%C(kfbVTL%ܼWR/l0ഫ.qR軡;'ܛF2JƹګC{TAvqSQqssm5OjGi!3wGp}BRvuct65oZr`R&GKV>ոڅ! \HdCXޓ4$ Щk qgXQ|w@꿏KDk"6 v:Lpgoi=ptsiPKsW}PKy.F8angular-1.3.9/docs/examples/example-example34/index.htmlN0 } Nmp@S #ZRm@\ڱɊCGLj'gJqkz4}[(dۛ4!i}s?7h$hj՗xdA2\Kc$RE味5qo>&*Ye%ðrdv?jb"OZ`!5vvN+8 ڥ_72/%]eGl4|Jr?rS2-? [渼/PK-6KPKy.F;angular-1.3.9/docs/examples/example-example34/manifest.jsonRPPKMURPJH-IՅ&J: ̜b|4f楤V委&deU%2 JcjPK|Q`PKy.F7angular-1.3.9/docs/examples/example-example34/script.js=M bJo]BA0*),m ɾEC6[qP*[fG-:m+ӓ^d,J#~Z{_e0`Af]5WG_PKLɢ(PK y.F.angular-1.3.9/docs/examples/example-example35/PKy.F>angular-1.3.9/docs/examples/example-example35/index-debug.htmleQJ0+ƹeAѣ'4 i* B ޼yȻε Nq4u!9ѶWH@ 9RОt(*x-8DCY@9+x(;j^LL-Mm|) JFkZLنeU )aٸ/ 7ۖvw7|3u6g ;|+e #x#LF:Gdud&ot>N 9VQ&E\If%,7uE)O =8PK`\jWPKy.F?angular-1.3.9/docs/examples/example-example35/index-jquery.html}Rn +1MHUT&x*Q/bݙa!`1"첳]#)~zF}HY4bV?~i![^Ek Q,xIC0&XۊLp1xy—]̇v?NJ|PDteahFYnB:Fz܄}VC|NZL["Br43vdrq@ϯXCf$BVi+ az3M*;&cŽH{>3)_ 0_PKX*PKy.FCangular-1.3.9/docs/examples/example-example35/index-production.htmleQMO0 WӤiJzAp? M͖)_JRi'n%v0]Na_A;3*@8, ^EϏvSQLؿ\W60N_u٬rҒqBYTN7׸5CUdU:dԭ9Cf ,/ÐFŠxkU8kZ|:$_#v΄q*@0"saD+ٔ1ubm,nr~ ދ!ՓVo'&" |^.LpW2LqPK_yE1PKy.F8angular-1.3.9/docs/examples/example-example35/index.htmleQMO0 W $4% 8rf+ʗm߉n !EȻɚhwPH@zh+i)i:N~O@m05P->(LaLW4:ZQPKyyPK y.F.angular-1.3.9/docs/examples/example-example36/PKy.F>angular-1.3.9/docs/examples/example-example36/index-debug.htmln0 y Va;XN0`ٗ{ ۬U IΒ}RfX0 J$-uMm<CmQծ:zFAo#h?q`sáz3Ge~b?UCRlêUU3u'p}~vk>G^!T `75:́W"aK&2n^"0JelГN_S2i&;%&=q ;2 e}>sˋj< fX: < yO^^Eh)VLRJ=30Qω*Zp\B ;aXʼn`]TeJ=3zica+l/dt>ѻ8H:znńȢ][( J@DbBR Ivܽ3$H0yof>tlR<վzz& MCT+A2bh <+/Ib̘ Ro7}eFn yE,3v }:;:+_p]+UnhBc%n6qS1V3~kkZp5{~Oa5A۬?~㔀~r; nhV"sy>ؓ~J8}Ć&K>8QG:ï܂ y! AŢDŽ`"@Ҵ] Y+|^dgSB7;J!"JzR3VHs,&NoK刾5^W=6wR(!6V,J)߃>8u?oOgl1šm֟N.m0f (Fi>4J(Si?%&}4v)zs,ņ6KUw܄N,kArCdQm;cDF`hE0R M5ysǔaG=Dl$V9ZMX!adF x@9l:K2q:!5V.aD&;G ufPJY|W--IEz' ;xbzּNPK#ƩPKy.F8angular-1.3.9/docs/examples/example-example36/index.htmln0 y Va;XN0`ٗ{ ۬U IΒ}VfX0 J$-uӍm:MCr(^jW]Pv!b[H&YMVqY?}Ve '6)A m%,K%gtQԪaKlUvU3v'}cpk73W@kuhc,'mM.t+w { ywۏ_2~0J5H/ءDL/E{IbMzhJl8}ĎBYenBI{3 9HbcdQcF0FJykU0R jBx-映}\$Vi$XW%U`%߇41]hK2q:]j$o'\E}7`DG`! >hcucQJ,?ɫ"i]$ {̗"K22¥ jxme@㾢KZe(˜.wCIU1(b`jCjޒfg*mSzاP|a"=<q.J{0Cj@j*xBh8q̶f+\It/7hl4|[nƓœ Klֆdұq.xdrq} zν]rCM xA*+?%zgc@}+|9ʔ ٥# Eѝ{Ԃ $pt@=+\tH;bF4%{ ? ݭqS>XV08n'v}sIY͸`ObL*AbT&JsNʭie71],89ZwnсTۚ˟PKN'IPK y.F.angular-1.3.9/docs/examples/example-example37/PKy.F>angular-1.3.9/docs/examples/example-example37/index-debug.htmleRMo WhWaMɭMt?&nG]TC*Md{idM(7 HIA?1_s=NAFN5ί=X}qp :%tJ]IKsn^&3HhZfenZxd3ULY9≓V_p!T0Q [26o9v*;0+1o!h˿PKaFJQhG, C*)Jfn04l烽Gz72WɇlX :blX#=>Saf n֜q qPt_/~|vs8Q Z)"Il6u6x0b+)%|NOPK7=[[PKy.FCangular-1.3.9/docs/examples/example-example37/index-production.htmleRMO!W+Acؽx?`[1w&FOo޼y3n0K԰/ΎE,e`34@9]=޷/kb.Z t?5?| ^ήuS2@N~%j&)IkvYVSG坸׻pƋCf]-8d`dP|pq`!l>.XB:qӝ`9V0ENdJ`e|<ר'J,^ہK2k捳ZUsL刞t>U,nuJ!tM.N`z7 sS\GK]=j#۸JBFKPKbwPKy.F8angular-1.3.9/docs/examples/example-example37/index.htmleRMo WhWaMɭMt?&nG]TC*Md{idMH `;u oŤ`T:㯹 I'[ pzk|~B28='aXۊz٨Zگz)*Hbnv Wܱ[?/Q%y" 8e Fر!FN5ί=XF}qp :%tJmIKsm^%3ʼnt. ff'r'Vۿ C𡭢~*9 veMr&!Twm5xaDW bȟB~)_PKhCEPKy.F;angular-1.3.9/docs/examples/example-example37/manifest.jsonRPPKMURPJH-IՅJ: ̜b|4f楤V委&deU%2 JcjPKճQ`PKy.F7angular-1.3.9/docs/examples/example-example37/script.jsuQO0)5h 44 vum;;!ex?UK/N~jsM!8oed-3XmD0M*c QQPVl͕ϗ 3!-iMUfvcǢRQ(^q}MqU|Fg>efǓn߽b撘}ku'<tmRB.A+M @U/{oJoU4ts0ZmCt H P{rQeo7.XC}TK0E6bIP3$GA~ET Fco;ø)Z6[Z<8MrTn6}[iogCPGٰW PKcPK y.F.angular-1.3.9/docs/examples/example-example38/PKy.F>angular-1.3.9/docs/examples/example-example38/index-debug.htmleQAN09Fp4ԉ-{ZU;HdKkyfvcu傥cDJތ8r5 ؝IIz8ԓfs0C5r/n];lNɅȒȲM}$jZeɛ̢QrC~?NZ)VmpGĨ6_`H8dZZPPz-.u-}o@%y *ɝ8Utg% PU*ӑ)Q<ȖYS!C =MekKa]m/MY>s$v$K_ PKc0)PKy.F?angular-1.3.9/docs/examples/example-example38/index-jquery.html}N0 } mظL%-mBU-&Vrߟۭ1N#SkBVu;ɰc bR*DL+IHMXO9ޯWa|$\ԡ bВU[ֻjQ-Y-+P[Ϟȫ|Ylە{ɶ.#-M u MƢd)2:V98dOGHVJj)p>"xB4Ђע6xJ\GY&㏑O8]x2Í]p}gJlo -`Dx^APKxA-PKy.FCangular-1.3.9/docs/examples/example-example38/index-production.htmleRMO0 Wpn2A ?41]|)IѦi`~v®ٚaՀno,@nEL9y{}n/@`9 B xŮm^M2k] $RP*vЍޏEЩ1jh5wvnsv.ѥ,wS4.#!pLH2Q: '9NH*zKyJN{PH-2Z*Ӆx>3Za)6Ӕ6xT2c\|r{^aB'ZMn,`TѺj PKC(IPKy.F8angular-1.3.9/docs/examples/example-example38/index.htmleQMO!ыQ؋?ʎ-k4KM!fq1]a[;Q X7g4vaQ*e,<PL8ES77 *:X '-0ilUgfhڹ0ozd!7d@_ЗdZ[YU0L`ؗIPpD)ń Yx: ^(4}:2y#zN9;t\mR`+|xUWO2A~PK.vJ'PKy.F;angular-1.3.9/docs/examples/example-example38/manifest.jsonRPPKMURPJH-IՅJ: ̜b|4f楤V委&deU%2 JcjPK5Q`PKy.F7angular-1.3.9/docs/examples/example-example38/script.js}j0<QcL;u ݲuK,-^Iv^AH .%t|lXztYYDkU 䬱l;VS!v\[1~J{y&kɜgr`r y9ξԖ w} w4&~vw9r$ؙK9[le;:+ mKN[EQ-mNudL .A.i:4 ܮ[Q3.ɝך-dm!!Bl v6~*9OPK~H&0PK y.F.angular-1.3.9/docs/examples/example-example39/PKy.F>angular-1.3.9/docs/examples/example-example39/index-debug.htmleP 0+\zJs<(f i*7AXegfwXQCfps.3A'aRIoҎOtyOi,O@SG?SpޒX8m-HQT-#)9KxW?MؚqjP3Dj7T#H7I8uZ":XאEF?PK${ ÷._PK!iPKy.F8angular-1.3.9/docs/examples/example-example39/index.htmleP 0+\zjs<(cJ4CDfٙ"\VM" )F/ 7t{+<DRdtg $X ͞F qxaPFoTpz +> X'plZ3HXztE\L+5rQ@{E`'hb/54j)/Y0׿PK0o7PK y.F-angular-1.3.9/docs/examples/example-example4/PKy.F=angular-1.3.9/docs/examples/example-example4/index-debug.html}R1n  U&E ER$:ٙY&Z|R0A CɂlHF{%z X^:jUqp)6Y@BH/# 5]#ANΈUc˫bVrw-mKUtjx_ (mFjxC\i7ܯD D!;?Mx|pmNS mbWLt/ǣ}p8V%bgPKPKy.F>angular-1.3.9/docs/examples/example-example4/index-jquery.htmlRn +h;%^LCIzhGsJg|m*hLL_3y!8`Aى5>qVfu>4O8;mJEpk:, 2nU',Ey]KZvcxvM ,E=ԓ3~0wRNc;3&yW@H}p4!/&rl]o>w\CҦ0a; >bM04#ޟfbݲ#= 9JG$Md1'}PK46YPKy.FBangular-1.3.9/docs/examples/example-example4/index-production.htmlRN0 !Mm`!= `wS.ME׿'i@LLNlgwl* 3`ف*L"R_/>S4<<`YͰ>>~V$gƀ-lT4?Yn79!W2<=T˅ ܚ x'H%I8(l8@\ ϝWRMe١[n*mLL,g`H`e|Z1AhwIw l.METq[;}M3 6ػ܋' ~czah@hO7/2M<=Gva,rCph*Zb9_Cnľ|;+d;v!ugL^oPPq\_PKRPK y.F.angular-1.3.9/docs/examples/example-example40/PKy.F>angular-1.3.9/docs/examples/example-example40/index-debug.htmleP! Wt.K[j88ii) ‹y%荟3™8tDDmC'$ l˂d{/?gF8nvAJCz<]VMȖWLgD߫x%,bЪI%ViNXfوGkax]7'*sX82_eHc |P-TZq=/PKd<PKy.F?angular-1.3.9/docs/examples/example-example40/index-jquery.html}Pn +1MCK~A+Jq¦߻Hݝ}1:Z?tx�@;^,Ɉ7u.L׳]G'o('̫Vɚs"(K$[j'o즼Թ:++Iڔ8vmqY=f#>7SF9Lp)V PK{mvPKy.FCangular-1.3.9/docs/examples/example-example40/index-production.htmlePN!Wh╅˄W5 O]U]jqp- f&HPeu`+=4V&}rpt>Ӕ>jc|w6U(Ÿ́sʍCla* oGk~fm`k!m?i#8F}`Li&[2iQC93hˮW0`vkmw^~PK.klPKy.F8angular-1.3.9/docs/examples/example-example40/index.htmleP 0 +b[=x" ^kfJEtKKQng|[ M rMVj@2`&MHZz<c!zTWK%U6L6H0%Ex՛ .4IJټQ?M\)Y= Q;+Q;w];J82g }B$zxx(28 PK <:PKy.F;angular-1.3.9/docs/examples/example-example40/manifest.jsonRPPKMURPJH-IՅ&J: ̜b|4f楤V委&deU%2 Ja@u%E%E A \PK]uPKy.F;angular-1.3.9/docs/examples/example-example40/protractor.js A 0}O1v H/Н xu|H:q%c^@StAJ֬ 6#ݫ,Tӷ#b b<9IH!®؍[Mϯ:ev'B7-9PKttPKy.F7angular-1.3.9/docs/examples/example-example40/script.jsuSj0+PBsOȥ -NTd)R$q iW3kS{e fp )X:T٦BUkeg{Ujd%/ S9D c/b5'ڲ2V߸p30y,I}Oangular-1.3.9/docs/examples/example-example41/index-debug.htmleQMK0W\Vm<$śD?- w5vlRQ$)*Ayfg24(okK,ZĶpSVYVE]";?ͽ AФ|fr_Ua@u}*/8i!o " O`]B[O>&7qYT{XT9;XqRb7PK2?*PKy.F8angular-1.3.9/docs/examples/example-example41/index.htmleQ=K1W4n,Dm;-,sa7/Yn>余y37W Z3v1͂4vp (ZdLg5_N'Т5Iw%!-W#`>9koFiJ厳f72AIVyQVE~I Orv]X] pBZ*X?tM&fqE0Z}]wqYX|v'Y`PK PKy.F;angular-1.3.9/docs/examples/example-example41/manifest.jsonRPPKMURPJH-IՅ&J: ̜b|4f楤V委&deU%2 JcjPK((Q`PKy.F7angular-1.3.9/docs/examples/example-example41/script.jse < gHBRҹC (i(yjm\:} {# 3-\ D0yǶE|}pI+\Z՚r*Sjŗ_ OBZۘІ(yem"=t]Vkfez;;PK97"PK y.F.angular-1.3.9/docs/examples/example-example42/PKy.F>angular-1.3.9/docs/examples/example-example42/index-debug.htmleRn +6m/U x6Qbܴj,K ̂،^S@5C#J#ݾgX9@9 %IƄgo)u68< v7^ ,%F"z`RbѬ4!fEX23/ҭ)IE2zu`d (x, SXW ܾ!Q22%JN];iqWENȫN1-th$b@I-K\.zKM; 2f. UggIW}PKZXePKy.F8angular-1.3.9/docs/examples/example-example42/index.htmleRN0 +i/ǁ#|@H@^Jl4eAlUI<8ѫ<)[340zYdL{|PYgQ`Zjx}%x<TJ "m&̠HYcP4f'(#Sюhow9zc0!xDcangular-1.3.9/docs/examples/example-example43/index-debug.htmlS=O0+TH->,LtA0!6#RQUwvPۡD|{݋O4YBkǃXՎƄ.AR^CE_[c X]ϾDYMJsTnϛRfXpRĶ^郬t+5gExY β`x&nQUVVa*Vw:TtA{%JqzN \j"l6)K ![@ 1^cff.=խVֻrSV9!:g #(_x[F5f.&EG-a֌p6 9^,^xPKY[0PKy.F?angular-1.3.9/docs/examples/example-example43/index-jquery.htmlSAO W 1&dڋ'w1z2ōIүͲGi=M{?+Rd '< ʨ4( !T \ _+crߢ" QqMjo9HL^W@j/3 _Yef\tEZXE{c#L5,̗h]%0-ꛌ}zV1gt@6)fEہ0 ȉt{u>o pW&ڒ;=eώlFόRŴw0aHXc(j~^rz,]GC4UƄ!'%>aFp6B,0vwPKK)opsPKy.FCangular-1.3.9/docs/examples/example-example43/index-production.htmlSN0B*H$V)C,LtA0!1cGKժl7J.wg~U9 F%Ԧ#좠(QBx@UPlx*Q7F8k: YR5 Bo+n^1|(63z2W-|ҟZ|ҒE%N `Y2DӠppLVzn1t~Xl5D#f;̜Ǎ^5J`hK>Fyl,7Z~Zn[Z#5r̽93]U8ќT#^L7Y/G)APKsZz`PKy.F8angular-1.3.9/docs/examples/example-example43/index.htmlS=O0+TH,>/LtA0!1#RQUwvPۡD|{݋O`i֊ǃX5ՎƄ(IR^CM_[c X-_&%9*5g"6*HTMGV5,҈9D悳,}&nQʮEVV_ܘU* xku4 =TbN \Q~ppG6|tíAwZWG^/13S|.Q5=խV䜊 g)+@ edCt(Fiے69d6;tA7)2=jO% f\Qؘg"3?PK_GY.PKy.F;angular-1.3.9/docs/examples/example-example43/manifest.jsonRPPKMURPJH-IՅ&J: ̜b|4f楤V委&deU%2 JcjPK Q`PKy.F7angular-1.3.9/docs/examples/example-example43/script.jsMOK 0{Y`'!EIm)޽Ǽyv$h zx-,O~Q8;JM[ՓV Sk_bt=Zrh,6*",iϕIi 1\܄̖BÜy>:`xPK'ݽPK y.F.angular-1.3.9/docs/examples/example-example44/PKy.F>angular-1.3.9/docs/examples/example-example44/index-debug.htmleRMO0 W\I=i/IHlYb4w|L )=2QNԛnƓ#ehY P HQ euu1A vOߢ,^uUp?xS2K  [VMyhPxS _taRo`wj{-7ZƩ`ѭjYI8K`, ZB < Q(LmO( UtE$oݺyHRWmuh!s@,w 5 #YeRm_wxfn1D; i)AXq|ZfKGФm&PKTZQT5PKy.F?angular-1.3.9/docs/examples/example-example44/index-jquery.html}MK0+\V6zL{Ճzq7kdo>=Ba>3L#h[M9v1,$ c/ϷeO`%Goj}Nf21E'Aumyh)4g]6.^3$dd_]?k!xYai' {p`m}{CǢν,VRp`zUHfPI 8mw y۶ܗh'U駌`$,vF7aPh1%y(9NX|w*xdz`+ɘ8僈҂LIq)xRzG^YzZ$9P_3 0Yj%&ֻ$ayz`uu'kg LF:@€*uXR8:n3t#?PKyR3PKy.F;angular-1.3.9/docs/examples/example-example44/manifest.jsonRPPKMURPJH-IՅ&&J: ̜b|4f楤V委&deU%2 Ja@u%E%E A \PK9 ]uPKy.F;angular-1.3.9/docs/examples/example-example44/protractor.jsM;0Db% =Kx!MŔFDq}= P~нe'd=BDB&E'j\!W=,M)gXG_PKֽ yPKy.F7angular-1.3.9/docs/examples/example-example44/script.jsu?o wST ,1̀v0DIdE9LHJ!YT1tͣ1E4h@ZA:3FyJ-HwV%E=̨tB) r)\{)U`DzR BFg,Wm@Q.?y^?)^Qv'{x /aDf \v] PKS|PK y.F.angular-1.3.9/docs/examples/example-example45/PKy.F>angular-1.3.9/docs/examples/example-example45/index-debug.htmlTM0WLE!-ZZ(]PJ[^[I%# i{g,P Rfӛ=GmMhuZ@K.2Je Z$T {}<&B*/ Te}Ve<WxW,y|POG#<#ނYg Vn;z晒5Y+ؘ| Qg+Z0YꦖAA QQd>hLA,HrA^wZ+؄9Fԯ]Q;(lZhM.J/ +؊X!X3T7կ9H[ 8 h)Mw~,МFΩrv;xS."Z3nQ/LX蚃zٙSf7qt6 f=2nWBcM#s g S"k?0L@Fi݄ }LL$QKqy-=չۣ?^\yszh_|q=}hrPKW%VPKy.F?angular-1.3.9/docs/examples/example-example45/index-jquery.htmlTM0W R[i+DBp.\dڦ8ve8N?RU;g>(N_{Y6BH.7oN$Nxu2gYW5wh a{tE I3v&Ntr1)8<'hNnitkd >f.p6P#G:0Ho`Ү^g$ql-k.OEUoO(BE7ǮV>#/ txPK恥)PKy.FCangular-1.3.9/docs/examples/example-example45/index-production.htmlTMo0 Wp€8@mU60 n;.C8dɐ.A>ʲ|.L>٫T~ XV (MALX+Er.E]Ecka/B- m(lGb-Wp&g+|Lbx{*Y*(tNo#B]l&?'hFQ尋?qF_DytxDQ\|$Q5rSD:;Q~>QTtήtp#^WTF!@|#/dxz}q1 ca"S80үmVh\Z -GeaW9VuSٳ:gmL]z:'<_i~Ÿ\:PKv۷32PKy.F8angular-1.3.9/docs/examples/example-example45/index.htmlTM0WLE!-ZZ(]P[^[I%# i{G|JX{z3W*P\o "4 2`-N<>`^z%ꅷl\߽g4B<8[$i|PW#%$+a4Vفd Rn7Jj-Ș=1ċOBk ;as8d+Z.Q،9F'Wa7̨J[豰&%}nlzFd V%)Ww=!.L6 Bݧ#>@<9FC."Z<f^(^|$5L+.ΜK4'On!SvKY>.pzJ1`DtJao p[}angular-1.3.9/docs/examples/example-example46/index-debug.htmlePj0 +T_ǗRJ6tYR 4#qіs"8dQnB1TxPix%y Ԙ;h9.cPNN-i4ڶ*7  TI>8aj+:Ґ,o5KįOgI*&`au-h?ХI zOk(g좼*)βfsB\ a/K+w)zk1a&Wh@ Zv PjPWkC~PK$jPKy.FCangular-1.3.9/docs/examples/example-example46/index-production.htmlePj0 +T_ؔ'PPlu [vY,4f$o5c+A7D9R p28`L*Yg`ZCGw5ujoQ )0 lv1Ċ$vK7V;$2r֦m8k3^B*%iA.\W PZ幬n}PK?"PKy.F8angular-1.3.9/docs/examples/example-example46/index.htmlePj0 +T_ėRJ,~ḥ˒P̠iԍx7v8 DmڱP 9b^h߳BY}r=Pc/),lj h1 G~:̃_pZŨd͝\5E{0a~L|lJ&sOpqb0q*WɚZqPK[PKy.F;angular-1.3.9/docs/examples/example-example46/manifest.jsonRPPKMURPJH-IՅ&fJ: ̜b|4f楤V委&deU%2 JcjPK")Q`PKy.F7angular-1.3.9/docs/examples/example-example46/script.jsH+K.HK/I,TRPP/-NU(.)L.QJ槔j;(Dj%!9ඨ'B,l BI@5W&kg\g PKylD~PK y.F.angular-1.3.9/docs/examples/example-example47/PKy.F>angular-1.3.9/docs/examples/example-example47/index-debug.htmlŔˎ0}m#hTl0Dºt5[Te֡!vSBOkTg`2^>˩6!K k*NSY+%+g!': Ό4ìa*x> j $Gn.Z[H06ƑӝA>٫-nҠ1yFRPO4% b=S`MےjQ8!⎚|ORf+DnU7@^r|PK^?;&PKy.F?angular-1.3.9/docs/examples/example-example47/index-jquery.htmlŔj0)&J&ܛ4yY]+%U71ޑ8n-BI֜T'IA =p[a2mBp_g1渎-"e*3*AJIQ buV%뼳h)s(.⎝rv~{#gg6MUrUSL BAKzFɚvRp`Ω7b!|),Q#XO@70WM#l JGjr:-EH’[h裶ro² ,L q{@1SijŢ*QͥY˕&EWPi{JwN%,f!Iq[*jрJXѳoz&P\zʥ=01'1$,OD8olAh *1H7{Vuv`]ܞz9Oum wI悅Uɟsv:j cItܰP"[Ve@˩PK+^RiPKy.FCangular-1.3.9/docs/examples/example-example47/index-production.htmlTn0SLsjMUTpiyǞxql˞Ю}wc7>^! tͪXvM(fPHT'cBjk~2dqQ"ө~PB5cye_AJ.سoOz z`Vs̏ei 9$ g7 ::A$[/}Lrg/*Mխg#[ |df.GdNX:9fƲ$Z#88!$ϓiv+e뉹37PKcYVPKy.F8angular-1.3.9/docs/examples/example-example47/index.htmlŔˎ0}m#hTl0lC ;-CySlx2LDKY=CKWEUgJb7gM-4:Fe}?p &峜jQN$ȹt?5jWRR zB 8!Y Vdəڱ-iI(Zc"$yrP"[MVe~+GPKh$9$PKy.F;angular-1.3.9/docs/examples/example-example47/manifest.jsonRPPKMURPJH-IՅ&J: ̜b|4f楤V委&deU%2 J%9zJ@ݱ\PKA[qPKy.F7angular-1.3.9/docs/examples/example-example47/script.jsOk@C *9CaduFֱ|Q(oַ~p_S&)D:}3 Tm&A:GIyL,/GSp6үKI<;g K&(f *U :™lt$E/Z_Vnÿ",3e"&om:;GRΧdPKjKW PKy.F7angular-1.3.9/docs/examples/example-example47/style.css}0angular-1.3.9/docs/examples/example-example48/index-debug.htmleN0 >/ 0YnH*x``-6Uۓ?BBd}gY:gx[l[kAH®D`X#[j8-*Ycy,`qSƄ a bɘLW HUIM#ˉW%ǤW+%ˬ eg38jvݍ0vpn%x`ٌC˭^>|0JdEaccЭ~Y@VevUG!Et,yeV5f:!,EeT$}r&. LU)Y֥v&-=7ȹuMesCF^R$K3)D`Z鑘i+_Ij&%`Zu@0 J2vPKF /3$PKy.FCangular-1.3.9/docs/examples/example-example48/index-production.htmleRN0 W\C!8졭ћ6i]%^Q'f챓g#`u&p8YamIߞmǂXq=pZATjwjX]Љ|g&H$u:N4rxoZ5T̃#\l O99:ozד}-qaMmg U8zr~nt U"%aɷ39j`Zu/ °q1 mJF_jҤJ|ɟ !!Ec䳬`̼S%CЂ(iB`fX~Og\VGNɆY9ҧ/HnKZ0Yy2Ѯ )-Aݞa~ʰ *Z)/wJI>LU f6az`l#("<M[iB!pxaKw%Ipp3mUubĺPKχPKy.F;angular-1.3.9/docs/examples/example-example48/manifest.jsonRPPKMURPJH-IՅ&J: ̜b|4f楤V委&deU%2 J%9zJ@ݱ\PKb[qPKy.F7angular-1.3.9/docs/examples/example-example48/script.jsUMn >,"%UOe$FL*OMV0ct\[X y_K,8E9N返Gk?r p:I): 9Gd{E%ʆd^E4I> j쬩!;o͇c#M@=ex-1m3^#p(H28rv)IX?v IJZ GXxRV79UM_PK WPKy.F7angular-1.3.9/docs/examples/example-example48/style.css ~B@:-3ikE3S>b[L.4~.H1iQ,1Cͥ",&LHoPK]gPK y.F.angular-1.3.9/docs/examples/example-example49/PKy.F>angular-1.3.9/docs/examples/example-example49/index-debug.htmlRJ0+ƜuA=l:mfd˲nA(Ly{VgUa? takVYE[gt^eI1X~l F BN\E][$:`> {; p 4-#WNS%OO3ҕXF fOYзd:^<7M ?'MkHkuA 3' h`qp8A~_"_~LOxp?b!{> 7,%} ,9mM?7PK_KLPKy.F?angular-1.3.9/docs/examples/example-example49/index-jquery.htmlRJ0}W\6ln DG'!k4I&cnt  =ܓT~#SkFP^eUhuy{},nB?4 WzPbbChBFz ņ KjZ8xq\NX{pV0R4|tѨiZ1/glZ@hH8Nq7:10WVWi=uEk싰F Maj Bqiu5ВFHCHھV%L@%Ŗnw9\ =paH |_|1j<C81KyytBN~9RWƤPKQ3HaPKy.FCangular-1.3.9/docs/examples/example-example49/index-production.htmlRN0'XTBLu.[ǎlqξݳ˫Zߩͬ #IL 63CA:􌼿=P/^!OqyT%MCkfB8GE:F<Ɔ8rNX{pV0B)hi^BnQ%}۝bQ/Β&q' 4ySnMuZƾ kz`L2_ wZX-xa0*TjTRi7f,X쑇@jg"[fϑـ74H3 ,(OV-rћpI?V?4:PKËk|PKy.F8angular-1.3.9/docs/examples/example-example49/index.htmlRJ0W9) .(4 "уz1nIIF쿛4]<I3yoqvBGY/TH -K($N$}yA F̧rgHmyl 3Xx4{A$H<ҜE@x~O#}k[}Dp3lr0IyQ~w즔 sIygcs_ AVؔI=K|,%z-yyr^Amix65<(G^ϋXI9a!.GX,ɞn)&;ͼdKY\ u6M7PKJIJPKy.F;angular-1.3.9/docs/examples/example-example49/manifest.jsonRPPKMURPJH-IՅ&J: ̜b|4f楤V委&deU%2 J%9zJ@ݱ\PKK8[qPKy.F7angular-1.3.9/docs/examples/example-example49/script.jseS=k0+^! KBC E \رO޽2jg`ePkZPřpKzgT|b[b-[L;8 =%07dlZAJ4!㻡 TE"n{zl)YAM'N['E"Hw!4 \%F&`Ls~rѽh?êCz2<^'N>//gxlt^vXBt_0$*m DݙR˜fH8S6<ըt:KC7NT}1Zh~cwVޙ8,O54çR^]KیW\?PK_JsPKy.F7angular-1.3.9/docs/examples/example-example49/style.cssmj0 {B zq` "eRJ}NK~};<DC;Kp6eg1(%Qj+ N|u',^:jwʋ6zҎ-S$I5 ajG!ί2̒-l.7=$>bެO%ٷC7jટןR_PK_angular-1.3.9/docs/examples/example-example5/index-jquery.html}P +V@41@{޼tS5"`bE̾fYf@p͓SE)]`&1Qnt;s#߲VOu)M%o!CJi~v+EnZ']i7tOWL]-<,G!b8V)xa{س0t PKtZ`PKy.FBangular-1.3.9/docs/examples/example-example5/index-production.htmlePn!+6"+ 8]aNXpؒ%W;ݙ*zKջe=`fjA1]gCV}r(#~єjc| 7ԩEf*,g9nxe&F4&[~qg›ü̙m,mtßXA0Sh0@O wC{jZ=wZPKeMPKy.F7angular-1.3.9/docs/examples/example-example5/index.htmlePA +wdr޼@0w)LLHf؝P4ezݩ 1L=sՂC;`fLٕo~>5Rpp/l vUMZbLτc#3diNɖVOA83pjIs:H:驲UPK6ղPKy.F:angular-1.3.9/docs/examples/example-example5/manifest.jsonRPPKMURPJH-IՅҦJ: ٴ̜bt4f楤V委&deU%2 JcjPK*P_PKy.F6angular-1.3.9/docs/examples/example-example5/script.jsT0+ QtI6R% Mt$-#gW/ a#3\Twʤab Z4C٩lT}?J k|FSt@j@4ZHf0}n9^sVXqy5CV[5 xrAa  :IT\ȷ>lg_SVH28bi0D荸ѵqW+js߽AΎnMO3 )(D6 xR="uF&T  iOWN7UO(}O0,ZgOe9V8k `ͫ/W&wlDԫG9KIxPՖ^ØQ ufh~뭁M_nq?Y}W_̵ˏPK&H',PK y.F.angular-1.3.9/docs/examples/example-example50/PKy.F>angular-1.3.9/docs/examples/example-example50/index-debug.htmlMk0+:m z "Jh .[],$9}g$Rr(dw}Ob|vANP@1k0 s'~>5_hBX}܌8Ug OHysؚDt<͈Yu"k,j'mȐDtlP*)|o g=(Y{U2nF ͌{sB-f9.a-nfVRt?p68/nd;G GGV|gb֜_5NPrgRLW/ JVc_5ҡpKC?yP|IP;1@WC ֏EP@Gu P e .’*ﴵOX콆g޺+I-q)K,JIt~PKOJtmPKy.F?angular-1.3.9/docs/examples/example-example50/index-jquery.htmlQ0Syڃk HZCA|U߳6iy$Օ;N m&?3z5Sֈ0ō;/p^p4ԂEuXFQ/!to_w?ΘV%g weu؛$t:ψE;D"Yvgl,DKzLXbKZoEO g$tF>Ӱ]1h3֟1M&sq˺?> +0q{ۻ}מ05[ 7Fq {3P[4GhrB=θfR.~>8St?`,Xav$"[oeWxX5g)kX-{ňw-ܔ]8%)Bw B8F\3g0n,2 @J ]tZ W`݃ZwCjRS^}\">KduWG'k PK emPKy.F8angular-1.3.9/docs/examples/example-example50/index.htmlMk0+:m kR(E6@]+Oʲi;3r!%A}gчy7. asv6zQq8̌Ղl.X{#B5) a?7IX|<ÔW;Wa *`^U|\gOJv:>'n2{hh8֩9. t)Y7Zãb[bK{uǺ1]*+e#W\`NK}Æ 2؎Z(PsE[3Ӎfdo=:mWNRoہ -]2>i*Y98@ևO@Gud߻=%%\"š*oxX콅'޺kI=q-KL$fJ􄴼PK7]kPKy.F;angular-1.3.9/docs/examples/example-example50/manifest.jsonRPPKMURPJH-IՅҦJ: ̜b|4f楤V委&deU%2 J%9zJ@ݱ\PK>;[qPKy.F7angular-1.3.9/docs/examples/example-example50/script.jsUъ EP@²-7,}aJ%.yR|VY.%95`qF4] gJ+~ț7=kZSΆg:Va~V#]>y nzPkd K =vYHfԬ>Bk*9p&+ `d-.8 }jF6Y ks.V({R*[gxCiXjPKtPKy.F7angular-1.3.9/docs/examples/example-example50/style.css+PRPM,J̳R04(P0P0.PK)^PK y.F.angular-1.3.9/docs/examples/example-example51/PKy.F>angular-1.3.9/docs/examples/example-example51/index-debug.htmluTMo0 WpF;@bcjnۡ; =(6먓%CHv>l||"MeJwhvQEPBE:bjtʝ"uep)W~.4:? ^ ˠ4AֽES*i{ZuR JgaJnpi)]$'II\:SeQ=jjU̐(v$YIg{Fz&]iZ\*lPlwdՓp. β|)|(H I0O؝*1$|X|̒$VCAC ZtJg<쭥ӂ?t)߹$A?x( ]n9%:˥xB0ZhCZnMEбr.8'Vh1혊oiOEN&iGG%evyaXRaRhEth?Q`_c82Gb7ݶEXZLJ~zY%6hrN@CW%?ߓN:n0ӟ,B$a&j+[$ fuEe|ɟdQ3P+aϢsR4[˹h*a^0 צfqt:_3xuEtf#Sx%bG-gH 6G,笖_kaGԿGgzGkզ5uz9|@~,\b>Q8DCBݱ )MckԐcyȋ2/*IW(0=JbE+/1 XjZ錇׽tZ= ͂+ϝo'MsñZon?3jKz%Usc w $Hct`>IBKic*U6'F8DMҎWF6:n?w;oM)F)Y":(m0 O/1]ozk ҏa *:n%7T+v>fwOjl䆷DTən{DZPU 'MP>ذ ,}0VVFF(&wPKH>PKy.FCangular-1.3.9/docs/examples/example-example51/index-production.htmluTMo0 WpF;@b`غv4جL IN$薋#QTi-6b5uY Zi~.oO˭ kZ ժJ˕̳MÚRւee۱VZnR5ޖ 1;]ӛ6\;,ds\YFUmQҖ $mH$>qO$WV{^+dJ>aC5x9@ˌv4'VZW -¥Q:('I(.75*&\jd I\@)U @ Jf6G^=3[n!I8E8` u]iZt$(UhNN ^3xQn\oOaD/%9E[/1rPKZit[ =7nЏ??w M%&-b9Dk?>3@rEu*3{ $Hdlơ>NBr jT_4kd jt5&lk}hg |@4E{񕿆-cσ?A( S_B(x}u}cGRsVyn;ڂ"z+).κXZO(%Votbϓ'íF;uhead 7yWPKq+PKy.F8angular-1.3.9/docs/examples/example-example51/index.htmluTMo0 WpF;@bcjnݡ= =6먓%CHv>l||O$]eJoQEPBE:bjtʭ"H~r8n^D*5`x[,P]ie렳eiD+aF6y˜Q< RSAkѶET G Wħ ~߯ץF'5;Y]+dF?ʺaC%-xVt5y?R"[A'Jׁ#g<ɉ}k[QDot=%u;mꪈ8i/N<`:3"H<7PKfPKy.F;angular-1.3.9/docs/examples/example-example51/manifest.jsonRPPKMURPJH-IՅҦJ: ̜b|4f楤V委&deU%%E%EzYJ@ \PKi1TdPKy.F;angular-1.3.9/docs/examples/example-example51/protractor.js 0w! HA'8iiRKi] KjmCXGxFWN*w=v40vp$T>r9+YEM`a#̴*-vB<Z*Y&~sf!sl>rՍAqt4՟?RTPKGش/PK y.F.angular-1.3.9/docs/examples/example-example52/PKy.F>angular-1.3.9/docs/examples/example-example52/index-debug.htmlj @t{P߶/>K ƌ 2AP{K6 4,#qMM2(n(.Y@:9Ay^p|b/ZA*y\XCJE=N_x?N!񒘑d+:}OQhM?Y4E_\ f˜H>bЭ8@@,F@A0g׏ zpJ[.w+2 ;):Ri[6KRڬiZS].kGĸuK_%W43WoӢiOKwVྵfz!6AxW|ooPKhFPKy.F?angular-1.3.9/docs/examples/example-example52/index-jquery.htmln }Sn&Sm]wl@U[1}ĥ&#9dUᮭ5%$ >R$5 , tDm'EovJ oZ%!g4K{%8*}M:aAgEY#L-p,I,#;uƓ ;u83!8!S^AS޶n{SJEWD9XNH*+?ZZ'5P JT\qۑ8t0\x%+v#1\0xAQU-φӶ#8iUApV!'`%{9Ie(`F> AKFzhq@F,%&3xHGήxe\qdLx'nHul׷DIjiNQt, VϱyIs U.Y>͎:W9\(V=*0NZHEPK^&EPKy.F;angular-1.3.9/docs/examples/example-example52/manifest.jsonRPPKMURPJH-IՅҦFJ: ̜b|4f楤V委&deU%%E%EzYJ@ \PKcRTdPKy.F;angular-1.3.9/docs/examples/example-example52/protractor.jsUn07 (4Y:9Ec.tPC- EGJUG@kwϒ⨩SsG̕`!(PCeq$>Ba霤 ~^5.E)., lטS ZU .DVrl̗G'ȌD/|IgR=*`.Qo"0' ty%t> nhr%Ux-MP^ُC;4@2AY dk#5%вF-Zʚ.֢EB\mЦ\2N+nig&#h8t<.߭٘~; Da0(::{Y˂%Fgf<2 };)1;Ը=xDp5S9v#hսJ8DD<7s Q +vM}#-w%POrR%PKKRPK y.F.angular-1.3.9/docs/examples/example-example53/PKy.F>angular-1.3.9/docs/examples/example-example53/index-debug.htmlMMj0 9E)bgѡ=A{'+0s,2xO/.[bX&bXv #")۾-hM8xG{†Lv Aݭb,F5#}lbHI'&)FiC\6{@?@n:ju.f1Cל.ک I0'ⶪM@D}r)PK+[PKy.F?angular-1.3.9/docs/examples/example-example53/index-jquery.htmleKn 9˞iUH `e2ëHB#d` LдE39;v:Cj;Ji`?K8~ݔ? 6)0]NK$IE1\ =eܟq/R4lX)VuIS0i}@<[|>N*A{Д$kM+Qwd5Y4w. /\PK>WPKy.FCangular-1.3.9/docs/examples/example-example53/index-production.htmlMP[j0 )TǦ,8hiO8׎`k4# /:rkqvx/AOBwXUe"?kbq:ao1wULuu ͛U2@Nj"Mt a(TwrY [^^kꌧ[&3g}Z Ն\}"Ɖ?Q7p%Էԅ{vM4 C]7i^JONmsUZPK| PKy.F8angular-1.3.9/docs/examples/example-example53/index.htmlMPIj0mB ɇ hile!a9 4%^l2t;Nx70N R$۾-ȑB3x|{|HxjɖiWe ..YIQEdY,Y❹B@f<~p16̎Ӎu_HCےtP}$i*>>OCx?PK0YPKy.F;angular-1.3.9/docs/examples/example-example53/manifest.jsonRPPKMURPJH-IՅҦJ: ̜b|4f楤V委&deU%%E%EzYJ@ \PKQk^TdPKy.F;angular-1.3.9/docs/examples/example-example53/protractor.js 0 EL[ u,8&&qV)P^R45& lpk4^L,angular-1.3.9/docs/examples/example-example54/index-debug.htmlmPKN0 &6JAcvHl2J1̃j-pmHjJEm|=/hjb#`{}z=cQ24Zue8-IG0ebVCIc J0&}MZ!^Wt(qD mAPsaU4nLTfH7?t-k+PKjZPKy.F?angular-1.3.9/docs/examples/example-example54/index-jquery.htmlmQN0 +Li$^ijmE4H3#`jV =3딱(ƟNUh8`{ŴIѐ*/9^1ї,t\KfwU Znеg'EGaQ}8h̚ uI1\Y0U\01 ZX/~] '@-oPKpnPKy.FCangular-1.3.9/docs/examples/example-example54/index-production.htmlmPKN0 &&Bn\8@XmJ~J\w{+;x2DMׄwc'[<0 PI^T.H/u_d+Bxv<)Gi1Hq+kܢM% V9١Jp1NETSSy-?ͽ |-lTkx'i^N\!̽Ji`xO"- mHAKd`b;k\ yUs=6eQ9N"~hafj#?PKN zPKy.F8angular-1.3.9/docs/examples/example-example54/index.htmlmPN! Sghb Ŭ/>_kv^֛ I+&÷Ls${Y!Evd `v]*Ϗۂ{ZOW'F7ӣS'TS\f(\1^x]UqbEgMR(rK<^w28/ ]~c+vnH +Sif[w~?E 'XMC PKXPKy.F;angular-1.3.9/docs/examples/example-example54/manifest.jsonRPPKMURPJH-IՅҦ&J: ̜b|4f楤V委&deU%%E%EzYJ@ \PK U5TdPKy.F;angular-1.3.9/docs/examples/example-example54/protractor.jsA D]م ic6&7o<,.`q0Љ7iAGqafRu 3^;oInKJuw9{]{ Nc(+~,8Fn L;5Wv[PKMPK y.F.angular-1.3.9/docs/examples/example-example55/PKy.F>angular-1.3.9/docs/examples/example-example55/index-debug.htmlMPj0 +T_zr|Z(plSoi0F$l4Hsn$8&00*C = fyŢ(Kq8'ۏrm#j (:xs:_+hBNF&SR q#^*^ 1V6Uy;#-{ m:fQ'Gojeg$<PKkAfPKy.F?angular-1.3.9/docs/examples/example-example55/index-jquery.htmleQj0+$ȆRȽY^b'zUZ.-#>$zdM[I0]QUVbR'L 8ω4&l0#~W) 3k*M:!uZ䣽 ޡK(Tk(C6ɽF;6լ(+ W!4lm@}9ڇNJV 7,&ω`ɦ]')#Ws}/bPb<%k5FC:^x(n$V޳1n=|5eeY?^]X^=%Gd=>PK|r[dPKy.F;angular-1.3.9/docs/examples/example-example55/manifest.jsonRPPKMURPJH-IՅҦJ: ̜b|4f楤V委&deU%%E%EzYJ@ \PKqlTdPKy.F;angular-1.3.9/docs/examples/example-example55/protractor.jsA 0ὧx H/P\m2iRh oJ}ޒĮjDf[F\ !2cDnKeRbu2a,*rxV_t]$qj|*IcL3 /9K~~ PK 7PK y.F.angular-1.3.9/docs/examples/example-example56/PKy.F>angular-1.3.9/docs/examples/example-example56/index-debug.htmlMPAn ^ VUTXYZia+dg<3KnB[7иyP{1"i>yjF~yt쫒(Ӫ->b&Oރ)O"fԒ :8L]†@ * Ǽp:-,tےàEkRK-koR&!'WN ұ~tkbSp=~PKT;PKy.F?angular-1.3.9/docs/examples/example-example56/index-jquery.htmleQYj0 )4OZJS=$SoܾvA{zi05}#$:VƾIULH}Ϲ l0-`>>&x̘K HQKupa6U(YKƹeZc\dˤk٥&T =yYF|K4WRl~BF(P76sdxaѠimza?BLdoFAۓ,l͈ugS=~Q׆<]][PKYGJPKy.F8angular-1.3.9/docs/examples/example-example56/index.htmlMPn +N r@xݿ/[i%$=Adv ~&nZ`@ HnJE}|i6 GՄF~Yi  jZLI^)SpqbVXY݊Zz&g- o;_GK\Φey!@\RdKGɥ8ܪVqO]e:51)PKbpPKy.F;angular-1.3.9/docs/examples/example-example56/manifest.jsonRPPKMURPJH-IՅҦfJ: ̜b|4f楤V委&deU%%E%EzYJ@ \PKWZTdPKy.F;angular-1.3.9/docs/examples/example-example56/protractor.jsA 0Eb\e t 4LI&`nR=Ty[\ppy0`c@ = cʵҺs$GCG-OtgђgsȴߺPKM.PK y.F.angular-1.3.9/docs/examples/example-example57/PKy.F>angular-1.3.9/docs/examples/example-example57/index-debug.html5N E=ee41ϸW?IB!;քd&̹̽g0t F*:Z[6F|}gӠpmAt8YSHmT|ɈW-obvtZ0zLnu6g#HGBDگUF1crHs( (xgZK[ǒ~ջwH%Mo*zPK(zqPKy.F?angular-1.3.9/docs/examples/example-example57/index-jquery.htmleQN +Fh@ae@zڄd潙ygkBjC'[b8 X5IU7Du*TW=WG{Ə/? UI.U((!ZN?R N&v&}:ߠNݏ]a>sb 7$[3H7Bےb[qW!ZV%,h_|g; @PRBt^)wgf㕔l)OPKPKy.FCangular-1.3.9/docs/examples/example-example57/index-production.html5N c<1^}ƄA-UK壈t#TQ8j(ГJd?(87ChϬKS0.6,j5՛u@NZ2լn at͝qg ju*͙?vO~]9^sZOx12*F /x%WvkɎ6V>tX"i9vb]k$C[Ew);WU)Ok&ޫJfJ[#PKG@, PKy.F8angular-1.3.9/docs/examples/example-example57/index.html5Mn 9>aUMUA6Tݷ= ք?Ln_;I%$[==ԓMs2҂;7-0 @c@lŔM4hyG?ECB u..7ebqhMOWS@QSrbGx[p7oX^AP}8`sH)sJ5IQ-%tZeѿH()pi7DzMɴ\PKoPKy.F;angular-1.3.9/docs/examples/example-example57/manifest.jsonRPPKMURPJH-IՅҦJ: ̜b|4f楤V委&deU%%E%EzYJ@ \PKsnTdPKy.F;angular-1.3.9/docs/examples/example-example57/protractor.jsA 0E"L@zt @4SwWн /UM?[-b{#P6'F'8L~|Vؙ/.+k%*O]akBPK~PK y.F.angular-1.3.9/docs/examples/example-example58/PKy.F>angular-1.3.9/docs/examples/example-example58/index-debug.htmlTn0g€l\ICdPSβTI*a{$N@xサGR֕rPMP1@QC'cmzMZ'y]/R8KuZjh,&da2m`g#A ,+,eBpu,g='B*JP9y2 oĘ<$}F'JX2` |mjRWµZ^"&Jd%q}g|&%.GO%t$Ux| Vh)̓[bYVGUJ1}5,;i HK|{j vt3&]K<WKʶ^g)$]V0_JTуR{az8 rUOBu>GC6Cd A̛r`1g±,!oU?8aPlc`R5Bh6c7z;]>YH3W&OWZt`8Im?%8hKtz|Iæ[ߘ/PK(|OJPKy.F?angular-1.3.9/docs/examples/example-example58/index-jquery.htmlTQk0~ϯ6P:F4ĭ,ԔI20H:ݧ$ZWn֮$HVC|E]Nj-EW7ӆkYDH,ݍcfȳI4kqW Y_?-eeEX|@$_v*T 'Cާ9|vٽxz`[:l]Ř>܈O<&]E'RX% 6K] h;֊h+a{NK]V)U*؝6Qw{3G {I RvA-%yrMl?^>+JwHӻ^U^jʂy > ϢjEc ֛QT|vf͔D$e4rE {y-=jw=G<A\(w w1>؄Pp:ݕ|If/2ȍPK,0aSPKy.FCangular-1.3.9/docs/examples/example-example58/index-production.htmlTn +fQ$5nUERۇVɱ*=U9 8Un(aޛa{Ua%tW1,P @٣Ьu+*?}+/D?(0xvִce wrlSk;c:b7Bɥ+HԨ]3ϧ5kHlQ ΅Pyb|"sTأsz ޡL1m{-y .u;ʥp'ln͆+ӈ`-_ibAQ-eY.MTb~>8I}f͂M[yvElߟ!+;u`" xxC{bY7Y-]6OB;(,|g.]gͨ 2 rN{dj,1'e:S~ bg*vF Bv<_ldRD瑏bSFIj{hZc#ƭf#?|fF"\}=բ=>Nݎ?LKm{(.;W5Sm l/¡#ͦoo,_ PKMkgPKy.F8angular-1.3.9/docs/examples/example-example58/index.htmlTn0g€l\ICdPS.6TI*{$N@xサGR5ߩzR늡f!'e^@֡دiKz]r4eYJk=8T"}$9(ay'5w.%ȅuZ'_܋Gb2*P992 _J1mw#?D,-\=v+Nwln͖+/ML1(j\y,ʴ;뜔*vglw8~g,3“3]=o(v]uf1=nMt" xxC{Lz@P?9i݋ nOՃB;tBѕ/EWyX[3v 1 '~JIeTp5X `ѵƠQ¹2R~Y@3.W6N_Zt`bgOR#- r<{"MACg$enExcaPKzHPKy.F;angular-1.3.9/docs/examples/example-example58/manifest.jsonRPPKMURPJH-IՅҦJ: ̜b|4f楤V委&deU%%E%EzYJ@ \PK-0+TdPKy.F;angular-1.3.9/docs/examples/example-example58/protractor.jsőAj!EsZT^ *$ mu֎ØaL$0$,?Ho!; 8@S= LKD {@z]yK~b}J=\koȧϙ]S6giƞGX*9<φcĢͺZ 5njRώV_{8\Fe]+SSޡ!.z%I {6n?K+OPKc_PK y.F.angular-1.3.9/docs/examples/example-example59/PKy.F>angular-1.3.9/docs/examples/example-example59/index-debug.htmleQMK0WA.$"+Ń!MJ4]nA(L:73J;aie@% #F^_TOGz/o*M[d`j)mTƠ&Ix22ԟ#ky!$Bo9}uGub .?7 P+gcp`XGsYLk+ۮu?*?"]γmD~@,>2H ic]e=1.-KKh(^%7D:oC8PKÔ9PKy.F?angular-1.3.9/docs/examples/example-example59/index-jquery.htmleRj0 }Whfjet60:Z؞㌖2(dIGGGUcU;Mtq2Y QeSg Am1\|L6h;9P[qwk@UBƚz[JQs֠ }JrVNYͫT6vd$Q@SόWi̺ jMsПF:8u4N> P*kZSux 5HA@i&t&羂]gYxk[#Z0<4OUTER.Ɏ_PK`SRPKy.FCangular-1.3.9/docs/examples/example-example59/index-production.htmleK0WAAD.Ldi{viT6\mO܏}q:.tLҴCȁ)aP19[x 4FS6y uP>eǺj+u8{y[k[ҩ>m7VU#Ԡ6W{){V >'OLI V)̰jwW"vU" j~JOg%}m`ƹg ߣtύ Hwkl.ב&Ewecz Gʸ!=n#8QJXiY/oᤡ[^E]/PKvY?PKy.F8angular-1.3.9/docs/examples/example-example59/index.htmleQJ1WL]pwOd/RCH6 ٬nfS[AL2潗PG N;2JT] #F^TOn}75`էxs I>ha `M$'#C3h|muV֩#]-l:Ig73SeZ^ۦJMl  pN{1]'G2g*)r@Pu0\TW_t;em# {)JȈcp `IҐ_-eErL4KPK #7 PKy.F;angular-1.3.9/docs/examples/example-example59/manifest.jsonRPPKMURPJH-IՅҦJ: ̜b|4f楤V委&deU%%E%EzYJ@ \PKVTdPKy.F;angular-1.3.9/docs/examples/example-example59/protractor.js 0De(^Wsm0ݔt-ۂTu潙 & уk]mث \vGpضtnEjɴSDJ벘i;r_в^1ShHsr$\f {bGuO9NWPKNԟ PK y.F-angular-1.3.9/docs/examples/example-example6/PKy.F3angular-1.3.9/docs/examples/example-example6/app.jsA Eb&Đn\Ҹ CPhӘ3x1Xԥ;d9hфKPUpG8t:$F=sЎ;ka o JYSk8hR|H̾W7VgY W|I/X 7Un%W@,/HhI+1Ŭ/_nz>9Ln@/PK#xbiPKy.F=angular-1.3.9/docs/examples/example-example6/index-debug.htmlmN }YNzhげl6z-+-Rcه|1b6hB3?Ali } 85Z#*#+1`R{'L-{?&S !ԀeW}m.;*rM:ڐ`eMsgbs kZ++KXyx3ٲ)XlC+ic9-{!bw)'9%?eή-;: ^r*/mA{7 N' 3.C#ЫHןPKeE&PKy.F>angular-1.3.9/docs/examples/example-example6/index-jquery.html}N0 } /'88 i%4+Ԭi QM{(#n i)؊XN# i4]%HHmZF }W51eXz.$ vr,}aR-}T˚E"/Y6S"/I}od_4T%xWl\?֙lYZM/½r6g =:'}JΤejF5V ^?4ңugӜrm[#4,@:-y"?PKLPKy.FBangular-1.3.9/docs/examples/example-example6/index-production.htmlmN0 } /'8фvH+ \MIc+Ъi3b$-Lǿ?;,V-8>)Du5ӎeC˶)ĨKtܤ|JDnr$/c{PѠ|SYK"jƹ;%P)g[([g/Dl.w i~5 ysNW_ y | #›Hࡼ?/IV?PK.PKy.F:angular-1.3.9/docs/examples/example-example6/manifest.jsonRPPKMURPJH-IՅfJ: ٴ̜bt4f楤V委&deU% *cjPK M\PK y.F.angular-1.3.9/docs/examples/example-example60/PKy.F>angular-1.3.9/docs/examples/example-example60/index-debug.htmlRN0 +D[NCښ(M4E;ڭ H=?ʔ`vQy)z+jF Ur']^ח&C^a~U xJx}TXt[@֖ZW Ɲ.lYγBMl4 S@oi`EgfSu h| UPHK3J[Ɠ9E-ptkcfQ`O[:/ GT-qf㝜fc1F><2$}{-\> έCң+LƷTB(FUN#Ā)ejoe#3b^}$ImA괧Ur5\u-f2iΧ $B {d#؂YʹL,JS =j-4TܚѠtH10:s됎Ci͸LIV AZhbT\|^CO4޹,oh,'xؗC;qMއL4:L}+,m{T:h[t51hSݪPKಬMrPKy.FCangular-1.3.9/docs/examples/example-example60/index-production.htmlN0}Z)AH+N/]q&Cqؖ;3MJYaOcM~oVm- Nn aм0wyEu*d-u,B 898/Cmd㝒S7MM4!CM-;o-`Rl$K򢺬3%Vrrc(6_(9omKB-6Ƶ3R'TZ\_Z"Wr9zk1.goiڻ)`0m5 Pܢm5xX-a?e\3"> E$#خBD+,3Й80fHAM,8PK_'^|PKy.F8angular-1.3.9/docs/examples/example-example60/index.htmlRN0 +D[NC֘(M4E;m H=?3e+oe)f#F Lx^BC/Cvkɦ`^@3hB-W׵ ԧ`9=y 3a҇>pVG㌶a 3W PKai#WuPKy.F;angular-1.3.9/docs/examples/example-example60/manifest.jsonRPPKMURPJH-IՅfJ: ̜b|4f楤V委&deU%%E%EzYJ@ \PK*xJ/PzDWsnLE|wjKS`o/hwOnAo ;"kC_7D6QmǀքzEo]2fuAnx_/:Fpd;:n'Kఇ[cC^qmL'Z=#Ho1j_%d2u.&=_e1km ^ W2DPK2PK y.F.angular-1.3.9/docs/examples/example-example61/PKy.F>angular-1.3.9/docs/examples/example-example61/index-debug.html}n w?e(KT2$[N.Uݧ/,"!Won&`W)L4: h\5{z 0|9`AM;`MJ6tVl YVŷ`r]dCK^Ѣ6≡tJ6j\$LJ>c d:C]"%Țo*F#/J5WYB{PK;,PKy.F?angular-1.3.9/docs/examples/example-example61/index-jquery.htmlQN!W w x~ ]68~2񲉉 I]U & Ԃ_&@GE!RmibNTh_cBsC@c>qJ1]3r#E9}r[Cϕ.R ٵC7ox]fUG7- o8I<$xd:gE.]tg$f'L$(՟~)3Ђ\ n)>}!u?PK#{PKy.FCangular-1.3.9/docs/examples/example-example61/index-production.htmlQn )Rt.".x 蜯k4R؝ݝ:&ջq0 lzTUbrl:3'gAȎOr7Um uvlSE%+9l*-Ɯ kCݜKaHmK#g]mIViV~q`n^QLI}n>u0yH~=_^aŚ4PK,PKy.F8angular-1.3.9/docs/examples/example-example61/index.html}N! ;C0ك`Cǧ./&~m}WG[APˤY |6~tB.6$#ޏ/{E\m*A^txj(:#YW~F[Ģ+nufsƈ hjԧoҖb)dqΆYpkƈՈĤ.ɑ}sXx!5_PKn+PKy.F;angular-1.3.9/docs/examples/example-example61/manifest.jsonRPPKMURPJH-IՅfJ: ̜b|4f楤V委&deU%2 Ja@u%E%E A \PK2]uPKy.F;angular-1.3.9/docs/examples/example-example61/protractor.js;0{NKHI?^GxQ@QLT-`<صSHȌ o2) NGwʁt܇Si9vo;0&NZ+/RxZf}PK0PKy.F7angular-1.3.9/docs/examples/example-example61/script.js=PN0 +̂T!-R6qVyangular-1.3.9/docs/examples/example-example62/index-debug.htmlS0+sj!,$CmO{*=4v#BR fa. cY3o޼7VѦwJIgFP>i) LJ'%G՗#([ďۢWeN hhccDslӘJIn+)6t>A VfS9 ʜrX2ϡ걙`{u&FO1@;hQf tC2CZ3K>ScxxdNJϪu?mҧYչgFnC ̄>:څ]/2k k!}1vy 2*"^k;ce4>Y}ȒBm.Ysvd>`Wv#c$]y/(oE)eّrPK(֢PKy.F?angular-1.3.9/docs/examples/example-example62/index-jquery.html0yN-6B)6н҃"OcodI+)wFrҰB ,7\謊CE4Fe.K06Bv`~+y]<>OuOrz⤱T!uVֈX."Q=ʎ41TZ.Wj^\W9-&>hNsE]e+&0B:׈l2F<=nC%l60@K/.M&#֕#qv@[{\gDnČ|$EzrH>[:D}RTUWbr6^vG\2~%]喳%(H%'{"i,gi!q kLcrI >뛿w[GS[E'-$bj X+Po4PKPKy.F8angular-1.3.9/docs/examples/example-example62/index.htmlS0+sj!iJ a=y{#BBLwFrҰB 7o7oɤiVBr(Hw )i0‡ϛ|iHO'=zK*o%~6uId;#+iT{ &:ZJʣ OQXUuyաW=rrSsժ~fp^aalQᏘptd)Qd B.)))p7OԞ5J 'sO'> xlύ-33&B!z?]1(/OX9^px3 /V.{Cx Y?W(63[ ]V$"|^睿ku.ۙmz~o7 )0Bڕg(rZZO PKBePKy.F;angular-1.3.9/docs/examples/example-example62/manifest.jsonRPPKMURPJH-IՅfFJ: ̜b|4f楤V委&deU%K*sRa@u%E%EzYJ@bjPK _uPKy.F;angular-1.3.9/docs/examples/example-example62/protractor.jsN0Eّ%bۊpiձ-{R!A$}=sܓ<jѐZ*Kӧ$PF砑 - @%2()|$ ;T](^|5 4ƒ &I|Yoп=.?u0QsVz"PRGI-gǠ{|u" |{$l1PQWM6(B˰f1vf*ꇓ^ǂ.ocPu]Tx;1[=mw[ ipqPK$$3PKy.F7angular-1.3.9/docs/examples/example-example62/style.css5Q EW6 ՔN*DALvn(]j#Y 7ZYGʓy[Ʊ+7'c=pe PKSfPK y.F.angular-1.3.9/docs/examples/example-example63/PKy.F>angular-1.3.9/docs/examples/example-example63/index-debug.html}Rn +(=%9TzH=?mq pׄT=!!xlP7bh (&]W?j^ P33ALHZ{s,90XvnuTmf"oZ&6&%)"&D"ӒJmjU'm Ѳiڲ 6 TmC ?XNҽa~!-PH}Jl'e_>}[ N,a5->_@Jv~!$ROK~!fI$eJn7`I*fm_h =8%!b鲗~{)^-iRf}OPKCmFzPKy.F8angular-1.3.9/docs/examples/example-example63/index.html}Rn +(=%9TzH=?mq7tET zCB2ؠn5ɻQ%%Y.By$f|9>Yr8<^GXwnU_!l89ᛖVYn?($R_NS$Id캾.v8H{g+ls`=`ZkjLb2*6oC\H؉# хOHgYKB|(V2!QTR9B#dUv ṾّCcnۏPKjm~$!PKy.F;angular-1.3.9/docs/examples/example-example63/manifest.jsonRPPKMURPJH-IՅfJ: ̜b|4f楤V委&deU%K*sRa@u%E%EzYJ@bjPKI_uPKy.F;angular-1.3.9/docs/examples/example-example63/protractor.jsQ 0 @w5/!,e]+kV6O y/AU|^bFHÑ-E$j7|2 r䉓[ 8[xg6IdnF8e1 l<ӺA }mbqT%)q_%PK:oPKy.F7angular-1.3.9/docs/examples/example-example63/style.css 0D=*KV0$&M+w+=03(xeɫ]JO $bY,{{Ky]:_^ub }h|ƒJuPPefwq0PK(xPK y.F.angular-1.3.9/docs/examples/example-example64/PKy.F>angular-1.3.9/docs/examples/example-example64/index-debug.htmlEQN +F.\\{ēz2vlQJ Pu.S֘4}{ü.a̓5fh]&ĄYחqWꥐmv?)8XO₷72(YdqCWmF̀,1Km SmȐbYgbYJVɟQP_„YvDXoK,o&L?ΣL\ &#߫YE h.FL!9^3^ޜN'jr>P&oΖuș$)ᶵ_PK0aPKy.F?angular-1.3.9/docs/examples/example-example64/index-jquery.htmleQN0 &KB -$&`B 5m4 I]9ݿ7Nn/zץ#i2۪% ZFTh'L QIח~C&o8`9o{anE$ ƀ4l4=u&YC@*.h NE(Ui6er+ mi\!d{Y6լZQF~~;pdeP@['cՄQՏn%O*̄w*!~/4УZ-,KB6U 3*F^:k9JPH"S,F GdpYPK?g9PKy.FCangular-1.3.9/docs/examples/example-example64/index-production.htmlEQN0,$q0!s$.m.jV,~{~:O`ȣݬZz% & )#cS. lix1XhgC^g]+nYaDʓF$ =i uJd:d |IG2wxhz{KLjgNZM[$of}ѸfW<[]W\r[MCPb-ƙ GJzz81>`&oȬaY@xq0 %QBRN'\aEpJb2$/㓞*9[yǶ.`Ш190!-?epangular-1.3.9/docs/examples/example-example65/index-debug.htmlUQN +FrrҘ{1z0񤞌[Rٺ)kIG߼7먳~~0(1~BCFu#f^11IpPcOC+Y]n΢MQn^yQoE6!wFjhDYn{JX5`oգmuՓ #JHދhf!h T*#w]'Y#mf 8xs?a g$47PK_TCPKy.FCangular-1.3.9/docs/examples/example-example65/index-production.htmlUQN0XH  1\#qqlvQCǗB,~gs*M`HY }+ &UЌԀ!RjcuEa7вxs]ອJF.լ3~1Mj@xQkE]\O,*h  )qw7^Zq(s򲾪oOzԶdF.n'Kf l_X:Ä:H}/` (1LeS~,2Y-sAN1} XkERM6 ps?NANYvJǣq/PKtjF PKy.F8angular-1.3.9/docs/examples/example-example65/index.htmlUQMO WbIc"b`I=l;(Xu]ƒ{|ȳ~4ٶ`CLj@ݷ0iF"&^IۻE˩R"!5ƀŴXl=XC$*. NelVf2b)UIQ_ ^l0䢜0W0_a! ج![@z3qX9U31ԝ1s+_2K x ]7!ru9yaMipj#\PK.$PKy.F;angular-1.3.9/docs/examples/example-example65/manifest.jsonRPPKMURPJH-IՅfJ: ̜b|4f楤V委&deU%K*sRa@u%E%EzYJ@bjPK'b_uPKy.F;angular-1.3.9/docs/examples/example-example65/protractor.js;0D{NqN8c/5!N }fy3AP-c*у]E,M,A7bKa'!1jx1H`4fBۉ 0T]69KLf 9!T_zrIg+nvnXV[wPKs%PKy.F7angular-1.3.9/docs/examples/example-example65/style.cssOIQRPH/R(JMK-KCO)MJPKG!\&/PK y.F.angular-1.3.9/docs/examples/example-example66/PKy.F>angular-1.3.9/docs/examples/example-example66/index-debug.html]n y ϗZv+FhJNzqMЧћFN#OXL4jD`{Z"'xcE(M޿PKp`NPKy.F?angular-1.3.9/docs/examples/example-example66/index-jquery.htmlen!S.Xl&PkYM7w/MMHg:/a̳rAБzϘQńY+})S(j͆?OΚ0]咎SȐYY;t9u?5ZѡOVuq,T HL_0A2ATƁT^}V#ZWppVi;ڪ5 wmJqcPKǿ3PKy.FCangular-1.3.9/docs/examples/example-example66/index-production.html]n y KO&u=@n.X  (ЩUw4:ddd0w3E 㭇p-_!NBR(\>3L}K1jH[ jXS浨 .X }X;angular-1.3.9/docs/examples/example-example67/index-debug.html-Pj )^tKZ}c1wagò;$3mat-l\(*v!Ypg _y&Sn) H{}9cժ 2T[q'Gy)bҪKa/)C+wFz}gQI=oyj2n!|tI6ֵMkkn7t?PK:GPKy.F?angular-1.3.9/docs/examples/example-example67/index-jquery.htmlePn +<a&mv>Ԧ%U{ n 7vpŢs)[T{ 'gtvKt8ؖ{|}զM$MWt٤9"d{Aτ%o=f$ϙR4Y؁.3;)> k{VKѸ\3a Z|p3_kjW_$mjߚrԾ^krA%PKmPKy.FCangular-1.3.9/docs/examples/example-example67/index-production.html5Pn +\+CJmTo{#`-%ўv?-A-jk+*Z.F "S(k<h*]FнSXv&xκ u6d"BNJ&t aZF a̚9j2m+=3nLu| :1 *kԏ *A@p 4ޔ6LɓWI;wrk<Eө-;PKL0wPKy.F8angular-1.3.9/docs/examples/example-example67/index.html-N0 } +jPH%4qIllyXVϗp*$ y0 ف?R_EG\ax/;"/!3⭚&ݟܢ+S 4T5ݱu Fw+.r[8n+Z׍,ϪXki$_0!C;ntIX PK#upEPKy.F;angular-1.3.9/docs/examples/example-example67/manifest.jsonRPPKMURPJH-IՅfJ: ̜b|4f楤V委&deU%%E%EzYJ@ \PK8TdPKy.F;angular-1.3.9/docs/examples/example-example67/protractor.js10 Sx#AskA#!NSv7__2KpAÁspkʖ@dNI! A":ƑnZ }3+ڣͣOԍ?PK0iA|PK y.F.angular-1.3.9/docs/examples/example-example68/PKy.F>angular-1.3.9/docs/examples/example-example68/index-debug.html-PAj!\['pQqȲj@lu瓫p[0L5`9F0aζX5|'Ik h~Ǘ8,vW\a/Ni#2}(9Zڒ`J0jNq6gG5F9]:b 7}+~ nH4§csL6;^z$A'vPK`KPKy.F?angular-1.3.9/docs/examples/example-example68/index-jquery.htmlePn +.:d0noSl\a+Fe)hIE^!fd#ºךb̯d&Q5EGLt1H6+{<ᬦxۭ7{(PK\tcIPKy.F;angular-1.3.9/docs/examples/example-example68/manifest.jsonRPPKMURPJH-IՅfJ: ̜b|4f楤V委&de(bjPK/DOPK y.F.angular-1.3.9/docs/examples/example-example69/PKy.F>angular-1.3.9/docs/examples/example-example69/index-debug.html-PJ1W9)^D%M~@:)zZwWTR]T V]7PpE>Nۼ Q,ʷ_EB nuld鲬 YW6_ V;٤X8-3Kl{Ӆф/0I'h=0^'tظc@wkX. (>jk q?PKHJPKy.F?angular-1.3.9/docs/examples/example-example69/index-jquery.htmlePN0+@1(s;|TDU[%Kޝ}ȻɛchwP + HY90+_N<?mÂ[į㧟&Ec+d2h{AxChpF)vu }]tamu=kޕk:Ō_] a`0nPsꩪ?hit'jZ6㱫78kpAGPKP6PKy.FCangular-1.3.9/docs/examples/example-example69/index-production.html5PN0+@(6* $J%;~iֳwWNٚiH T2 bN2&̂|}/,m0#`?|yCˮ.sCM*!E%crgzA'm3zNڍ[bLoj["gݭg=tYB`d2"od9#ZM<*wͦ ؓ)_3i\~MaO/RL Y_ܠYtrr-Ŕ}I1CY᰷b'C+n'*n(x \tpalD[0 ioc@wXe4kQ PK HPKy.F;angular-1.3.9/docs/examples/example-example69/manifest.jsonRPPKMURPJH-IՅfJ: ̜b|4f楤V委&de(bjPK%DOPK y.F-angular-1.3.9/docs/examples/example-example7/PKy.F3angular-1.3.9/docs/examples/example-example7/app.jsm !>%mE-9 C̻c"{9G35WwF8 !z%"fhIKSHG|۽c$Doka.PH:V^j>@ݨH!ڡxcbCJ"Q9欵2z_ZʃLvPK- 6PKy.F=angular-1.3.9/docs/examples/example-example7/index-debug.htmluj0 y ՗nİvpl/[k9P2c`N;W0vVN(Rw1JPƖ_TOh["ԀWc_N.)*R5!̪eMK}+X'xAr--e%xVN0D,xgʴ|QI)Z[F7A0_"h[H$zd۫Xg݁>QlI͌[‡sL%kם>](EPKoNPKy.F>angular-1.3.9/docs/examples/example-example7/index-jquery.html}An E>avad.*j/OcR pU+ˀUEZ iyόz+ q]1-̱`(^車>BD-}ۿԏ)QE R(zs?sV$PW.eK%+zlrhNvY.|LRZ8w`Sge^~ḺNdKSr~rn[5[r\7EGۃnB#)FkVc)sj}On8+:2FU.Cgn?y'*9Kg.=6Ka1OPKII($PKy.FBangular-1.3.9/docs/examples/example-example7/index-production.htmlun y ʥ!AD=F@FU}1JNR 4]1+|R)&P]Ew: "-ؽ՛>Vw'դ&z9\jـlgY$ ([ʘ8SV`R#fWQoAG0\.\7|'W@S,PKV PKy.F:angular-1.3.9/docs/examples/example-example7/manifest.jsonRPPKMURPJH-IՅJ: ٴ̜bt4f楤V委&deU% *cjPK"M\PK y.F.angular-1.3.9/docs/examples/example-example70/PKy.F>angular-1.3.9/docs/examples/example-example70/index-debug.html-Pj! SZR[ 8avǑ1Be߽Q '~wOׄp-Af; Ɂ?##)ߘgV h?~ݖ'9T-Ce ވqTp /YXAFO|H=TXm/ ~/@"*ƕ7̜+7d#ohv(vhwpW#wT{PKuVFPKy.F?angular-1.3.9/docs/examples/example-example70/index-jquery.htmlePj0+:Yq/-EP%qjB+)`V;;p&o:CjaŬtLomX8` _w[0nRJ UL\Bb(owr]_in,EdBUǻs#;rb}}ٻ$,D_\ab^Bh9k/g"Zɡɡ'jMU҂R4XPKePKy.FCangular-1.3.9/docs/examples/example-example70/index-production.html5Pn +ZUD=4VW/EhO˟- \5k#*:R4pI=bs<I'U`Fލ0/Y%g}膪j!Aܕ M^jPa9*o=ՎnLu| :眒w>G̅P>z}#v|aд_Nh>&^ʺn: m {kJ嚬PK 4vPKy.F8angular-1.3.9/docs/examples/example-example70/index.html-PJD1 +bWqH۝{NoC_i+#9D>lkB8W4384fc5`&|.oQP8忿n(6BVuds&~p-ŔŤQ1nWŤplA[F-TP03NaS 6G>҆a\P6S~#PKuDPKy.F;angular-1.3.9/docs/examples/example-example70/manifest.jsonRPPKMURPJH-IՅJ: ̜b|4f楤V委&de(bjPK1DOPK y.F.angular-1.3.9/docs/examples/example-example71/PKy.F>angular-1.3.9/docs/examples/example-example71/index-debug.html-PJ1+ʜI9)]? .{,dQa,BUo[ɗe{("*):EŬl:&̒~}:ۯ@`b|b e|4Y2qR4NC霨|PZHS2bt%撳wi}I1Jj|q$ |m'Ù+gCwE^nmTwg~PKg/OPKy.F?angular-1.3.9/docs/examples/example-example71/index-jquery.htmleQN0+@1@:&U`;@U۽Uf{o˻ɛ| sjwP +HYuL|篔D^۟aEW|{xU+d2h{AxChpucbV;*;:Tm ܁k{췜+A뷄bo.0RnPcꩲ?hitA%AyM}*is5.YҢ~?PK PKy.FCangular-1.3.9/docs/examples/example-example71/index-production.html5PN0 +LN Ԇ+w4Ty)IaWw򀓝xbv8.aKFO++'hIP,S &r!b?y$4NogaF[՗-LYF;뺢2(  baun(tbT9"쑎pFadbPżcg[.`^xI =)9[@㎈'6Va$+ -T PCܧ^zVF9K>+PKZPKy.F8angular-1.3.9/docs/examples/example-example71/index.html-PKK1 WĞHۛwNmF]!E ]F)&ZIr -Pl:$ɿ>ߧzPj8?2 lAFy^FU<{sJ,,eDǸ^ &#q'-} o̒ ?7 ;dX?` 4;W^pSRPKP}AMPKy.F;angular-1.3.9/docs/examples/example-example71/manifest.jsonRPPKMURPJH-IՅJ: ̜b|4f楤V委&de(bjPKw(DOPK y.F.angular-1.3.9/docs/examples/example-example72/PKy.F>angular-1.3.9/docs/examples/example-example72/index-debug.html-N0 E 6 d7HjGh4NHuc;w7t C ڭc@@X$ f1!I1|INӯ@{4˸W{aA%@lxep>t~S:}1nu%L]5 FɌώ@BGxfbw{AS?h  К2wWCczmVSer&PK1lȌOPKy.F?angular-1.3.9/docs/examples/example-example72/index-jquery.htmlen y Ӧ6i(Tc@EU}zd0ypv;Y ,CNJ4vb`N:&̊}}7S yO۰ pv7&E$+\2qR4c ޡI4n(Ej{EǻR#~A6aٻ~MHm`TeP3 dn%Tz3-A{BUHzM}*˥^^hӢ~?PKv"PKy.FCangular-1.3.9/docs/examples/example-example72/index-production.html5PN0+@(6s;|G~vDpxU5[3 AБJ[*c,x,:0j1D?*k8E7TmRQ )*A<Š :QmѧJȸ%v/V;%2qjj>p/Q H}s e( :> tqS:y@3Ieowy[m,嬬PKOIZPKy.F8angular-1.3.9/docs/examples/example-example72/index.html-PKK1 WĞH t;amuYۇHHwk4tIyh '1@* <\$ȒCu>9 pL}ˀT0kbM%yU-wm WbfXL,#84$;Q m^a=HyC`kOLF_Ip0@׀.RPWszN5K}ҿPKwQ4MPKy.F;angular-1.3.9/docs/examples/example-example72/manifest.jsonRPPKMURPJH-IՅFJ: ̜b|4f楤V委&de(bjPK%DOPK y.F.angular-1.3.9/docs/examples/example-example73/PKy.F>angular-1.3.9/docs/examples/example-example73/index-debug.html-PJ1+ʜA$7tC60n!T߬^s@س5`EG[* ]ńYЯ ٠|U6 pT?>?M+.el4YRԂ3|JTr6(-)gc nT%wi}IhP}A{xqC8b{@7Iw5wK5pzmK=PKz'Ғ4?iF͢W|}ӊaUfNWxQ'A ,?wmQs?鏑5Z|E쫖ᦺ8k6*_Sr[#j?(rM # T,vG1TV4yvBՀ*rߦ>vs5.ʳKPKsPKy.FCangular-1.3.9/docs/examples/example-example73/index-production.html5PN0+@(1UTHg8K;~i3;edرR@ pS3T8]l]W_neR2ڦ+( bP*6q«8Hg*F"͡v-a8`HFF[ U;F[x6 vӞ4n~#'6V@ʄ*b? h0>hz@5Oyos9VP9K>+PK rPKy.F8angular-1.3.9/docs/examples/example-example73/index.html-PKK1 WĞŃ"mo t;aK_uYۇHH7k4tNyh G1@* <\$|^ȒC}r$`dJ62ZN0 WbfXL,#8 8$;Q m^СFM7 ;dX?E]u+\.}^۩fOZPKUMPKy.F;angular-1.3.9/docs/examples/example-example73/manifest.jsonRPPKMURPJH-IՅJ: ̜b|4f楤V委&de(bjPKHDOPK y.F.angular-1.3.9/docs/examples/example-example74/PKy.F>angular-1.3.9/docs/examples/example-example74/index-debug.html-PJ1 WĮTAPN~@fFwJsrNoV9 9( UNbVwfA>KA>Al0pT???q625ZRԂ3 l@HcL 3|FU Kٻִ$h_\##i':+gG}E'LwUuSҋ뵍z$֯PK+!MPKy.F?angular-1.3.9/docs/examples/example-example74/index-jquery.htmleQN0+@1AHT $jRbUwvo,zwfay7x0&;fc9zi1i0^"&ž>HS6zj__ge"d^4(ֶ6x.EQ)hRTZ|@":k6Ry!(Vد)y֯?bƯ.jc0vPbꩰ?YRp;"A U}S(op>r),PKy PKy.FCangular-1.3.9/docs/examples/example-example74/index-production.html5PN0+@(1HT $J%);~ŻNGXcJ- ZR0I\E8菙DRI~ku_}}}p.r6u]FOR8h^A:S1ikHpFaddPżcg/`^xI =)9[@ƝvCp e@Y?\1T՟V4gVP-y_mcW%opv+TNJPK^yH}PKy.F8angular-1.3.9/docs/examples/example-example74/index.html-PJ1W9)2A$7Lɋ$,v!M='z& 8a`mzUX5MUpۯ!̀B 6U(H,|<ܝ΋a.L >h͢&Gqq)I6"ZchC>P2PA¨KL>tG0=g}',w:vK^r JB'vPKGR^KPKy.F;angular-1.3.9/docs/examples/example-example74/manifest.jsonRPPKMURPJH-IՅ&J: ̜b|4f楤V委&de(bjPK\bDOPK y.F.angular-1.3.9/docs/examples/example-example75/PKy.F>angular-1.3.9/docs/examples/example-example75/index-debug.html-PJ0}Wy4 $}/X? hv[wg!p¹pchYȾNaQBC`'$ɩӧ~cJqf ~__t6Zӌ$%Uu Ni{U5"%icy;QZj#R {Sa DN%sOe;v;ۤ/`PKO*PKy.F?angular-1.3.9/docs/examples/example-example75/index-jquery.htmlePN )F&Fc7}}]V 4l6!~cF-!AބfXUϏwB<U۟YGƯ~V̛]I.U(j&cbP(F1^Tؤdɷ }&ߨ[dG}yp&%.69l\C 킣~ +ɡ睻\(PKX8mPKy.FCangular-1.3.9/docs/examples/example-example75/index-production.html5Pn +\+QU5  x`%V/403;i lR$I#PM R"^b\ј´bkjN&IK¹Zԍ!U4v[sμZJKʎgK&[ ՚ LUǵ4)\$:p M6mwNjwژz1PKbZPKy.F8angular-1.3.9/docs/examples/example-example75/index.html-Pۊ0}Wy]"I 4 픵L8\8'1ndDVaRB H͍US: (b{|>G],l$01diV5.+ƦO5ؤBRe Z*B3 U~_S"x-G/^~s1PKBs(PKy.F;angular-1.3.9/docs/examples/example-example75/manifest.jsonRPPKMURPJH-IՅJ: ̜b|4f楤V委&de(bjPKpEDOPK y.F.angular-1.3.9/docs/examples/example-example76/PKy.F>angular-1.3.9/docs/examples/example-example76/index-debug.htmlQN0ECn48*18S?DAdiٙ][\sGGin K^UbBЍzY${=<z,\n0^JmkO.dMˉy[HRH/Èv7pC a `Ј@GhΟ| ̽ E"a@ \ KYƙv5SL/82U%9J7 e.+R*d9#[-KXO/y/PKhK PKy.F?angular-1.3.9/docs/examples/example-example76/index-jquery.htmlRN0ņS@`a-&6űMbC*.,H|\f QH[вT  ڝ' {}0z,Tn{q(S%Ԏ0dMiE&^,MjVf?1%x BG3uY ^#6nkd^g-`A>!N23. %))0S `Rk D_Dp֏dJ]!# e)IJm οIJPK0(4PPKy.FCangular-1.3.9/docs/examples/example-example76/index-production.htmlRN0+JLUµ|RǶbUwh.֞n#b~R]R$ȇ`zg%zHxv/'>YPS}OF3ZԱJNzph Oh̨[aQ%{Gc|tt<4뽙nt*W7z-)m_#H 7'Q/v]>paڸ"v0S YR˸̵dl|̺Vga;~m.lislJS!#u-NW%W _hdt|PKS<=PKy.F8angular-1.3.9/docs/examples/example-example76/index.htmlQN0ECn48*18lS?DAdiٙ][\- 4YUTj7H%u*1!iF=/HG YTOG=P[}wIWafix91rzn&㚷),EJ2h}jde[0nF%?BzMd7H+h5f dܰeKgN^3d ESf?G|H^>"|Mя)BF3^ nљPKi8 PKy.F;angular-1.3.9/docs/examples/example-example76/manifest.jsonRPPKMURPJH-IՅfJ: ̜b|4f楤V委&de(bjPK"iDOPK y.F.angular-1.3.9/docs/examples/example-example77/PKy.F>angular-1.3.9/docs/examples/example-example77/index-debug.html-Pn +6\+LzJUo@ʡZ߻JH>-!iC+@q2qdm.HF\/uSs ?Nr:iՌjAΈWqljZRVm-q6%#J{2b[H`|yΙ#g{j@PKF,PKy.F?angular-1.3.9/docs/examples/example-example77/index-jquery.htmlePKn S&U޵'h@(!@Kܽd i}1#`Neu kQ1y+ SƢ'#bO!p~z8eôKѕ/dcb(蘰ї,89Ynkɏ }s:=k EGe:FǭT0gL|>*o 4L ]k#o7ʫAFPK5^oPKy.FCangular-1.3.9/docs/examples/example-example77/index-production.html5PKn SQ*.=ArG.?bE{y3m*ឭ^ AБ []ƄY{<Yg!m0#`xC.z:dHQ ˜\./eЉ*oƌ%VBmF5?5ޭzx~neڅ-W1%A\ÁT^;]m(ޢf/x>zyuPkPK,c\PKy.F8angular-1.3.9/docs/examples/example-example77/index.html-P] |)V^M>i N@QRxwbB2d~2UaD;oT&ܴ f5"w2{dr{1zJV 6Hբd}\9{хEdjSuĨEBpO\bœ4T^WN8~Xw{?+E| PK#*PKy.F;angular-1.3.9/docs/examples/example-example77/manifest.jsonRPPKMURPJH-IՅJ: ̜b|4f楤V委&de(bjPKp5DOPK y.F.angular-1.3.9/docs/examples/example-example78/PKy.F>angular-1.3.9/docs/examples/example-example78/index-debug.htmleSn0+Jqp?&-۬ZE{=H~3δ"aP͎S%f(f ^8f*b>& w1XPUğE̫T[v['mښe(<*7^~4s! |rt[Ӎ 8}d([3J˳i0[c1.On4:O.3@ڗJu> zTd%دZI,_S7}^TwR?YC'v<3sٷͷ:eǨʥcz53^m/-WkO@v/c]0HMaCS_.Ws(ң8PKTTgPKy.F?angular-1.3.9/docs/examples/example-example78/index-jquery.htmleSMo0ﯘZ`J/åJ@S]DY``] ixx_:ӆEà'J藚f@5;>`y 5{Px 6b Lb?n##RfQokkVUZ3XQ_{yS,ճWlfF Q&R?tG/f~|dX:HMYVt$nU SJwq$jnkfZ;e$~FV.׌RfXX5/皤V] ބcy/"밡O'2+r>=TdPK&[PKy.FCangular-1.3.9/docs/examples/example-example78/index-production.htmleS +U=4b_=U{ 60 UV4f͛a:W'nv ha5 E >X߿~TOU NK@SدyۍmTpSsC땋|[E\ڳ©@[;X5j/}_aAz ,($q^+\MxT\yK :$ZCp 3@fZK_ chx{=f |Zu~zģ"^Rk[sfaɽy jY޺R7}uMrJ^O8,qx'V6Ƴ\VzA"-Uʸ1.lM0dL%vc~ɚnEcJ9la 4qPCKv8PKUHPKy.F8angular-1.3.9/docs/examples/example-example78/index.htmleSN WĤmbԓP @f)mդi·EB Jfh 1h:<=?=nb>& /[LoxJb| ]S(%%\K]|xV2umx7~~ k+懷^Y<9Yqv/ P4FgBg3 Qavc1.n4:O@JUޟ:TdXL'^yY ߩ3C'}[D舳j`}||㬗!q=M;Y\oUܦ۸LBHmTR!=Qٛպ+'yb O8 :b8xN:EzTPKo)PKy.F;angular-1.3.9/docs/examples/example-example78/manifest.jsonRPPKMURPJH-IՅJ: ̜b|4f楤V委&deU%%E%EzYJ@ \PKDL TdPKy.F;angular-1.3.9/docs/examples/example-example78/protractor.jsP 0}C}qP_MLKi.")-tprH@GW)S+ˆDo- z¾E#drK؂vDgYnQ UrnX&)#s ɳĠktNЁnz騌R> qangular-1.3.9/docs/examples/example-example79/index-debug.html-Pn +\.{"ܶ_~ n Q5ZׄfrJ1I2uY1٥ %YG<H1FIWLR0uJ.V;f+FCjn:ꢣ[}Cux:f+vPxvN!;FPK}nAPKy.F?angular-1.3.9/docs/examples/example-example79/index-jquery.htmlePKn! )\6Y1(kO2nB/TE{͐]$s4uM4fpP kyǪu.XϔD}r{f^`^L MWLBFqL) .~߂T$Em+P}q:߱[A uJ=lHKmiU~yAP,}C+-vMwb[ w+\.ݻ^i֝n+PKKPKy.FCangular-1.3.9/docs/examples/example-example79/index-production.html5Pn +\r2i _~KXQ` 'T"¥8; ς' @;,EEXJS,Nt"m)U, 6E,&$"XN0%wǁBn?c4X]QK)LtII.7٪]ɚ--dO ! uYWDI'f,3/yo\%!M*, H_|8pg{Sbz +{%QynOQB<ҞX\QUiN:ڐ!E-YySy#P9ˬkHVϷ5dF}f5η5S)ԧFɞs~}hW`pȶ͝RzC[,Y]I.;7ʛ(_<vyvcPK Ƭ4PKy.F>angular-1.3.9/docs/examples/example-example8/index-jquery.htmlRN0 +iq!eqfIH`koǶl5I)U N]-_H+tM!L[S44'dS{@D>`CLT*jl;$8{.K܉l6angular-1.3.9/docs/examples/example-example80/index-debug.html-PKn S6YaZ.=AsS 05r&bF{BI^U12ȀU\*vG≨z\N:$Nj[U!$md*lg17["Őeew+))6JZiԮ_57dqѽ ~M@"x5axangular-1.3.9/docs/examples/example-example81/index-debug.html-PAn ˞mU&T$AH]P ǐG3y {&XxMNpMv08`Vb`V~}~kӛ_\s"P@cRx}UnlXlm՗jVN S3zF2涇;lœ%\d.-҃TzZ˩B.N9=-GkLPKFeY6PKy.F?angular-1.3.9/docs/examples/example-example81/index-jquery.htmlePAn ˞JO rk_>wÊGjڿVB=`9ZBj 1'V$v1 i!Ε985y3Q\7̻jX]"(j> >*K0OJv<߼O͓)Qq!\II i%S5򆼡.w/MX\1O; n#߫sǥPKOvyPKy.FCangular-1.3.9/docs/examples/example-example81/index-production.html5n y ƥ] r`{GjUa;~lXh葐yP-0aocjCfVIqzȑr-yd#Þq:)Gr1(_׾]"V\J],1.!"L&YMȳx-6ĭY>j%yu2BJw.KP5Q\d?KɃ5zY4Ga?ydWV㬿PK+sQfPKy.F8angular-1.3.9/docs/examples/example-example81/index.html-PAn -l[T0FE{TBefV3Z7ǏL bIIv[Wb`F~}^Kӛ#ُ;9L@crjXYJ 8#Y"e^CZ [[BQEo6aF !;29N!Vy?kcsDG=s:XɊ<׫%v uPK, 4PKy.F;angular-1.3.9/docs/examples/example-example81/manifest.jsonRPPKMURPJH-IՅJ: ̜b|4f楤V委&de(bjPK{gDOPK y.F.angular-1.3.9/docs/examples/example-example82/PKy.F<angular-1.3.9/docs/examples/example-example82/animations.cssP +8jR5DֺnK&<;̌OHic̾:(fBU^XY]5`-FUlGQ G0l:O|GW3GMkƙ,j,㴮ݠ_nVn8D/Cv9%Ѽ3FVdOPKOS+PKy.F>angular-1.3.9/docs/examples/example-example82/index-debug.html}RAn . "UUn@ t t/i/*!x@Ҏ6Evܩ!pNϋu\,-/`qL0նT(/G#fTpZR鲍5s1ұ{W WX U*]&#HwXj ʉh7N)+llES-neJ^ 6k\PKk/OcPKy.FCangular-1.3.9/docs/examples/example-example82/index-production.htmlMn >Ŕn[MԐ'sv7y ar"+X$7guJ6qnNY-i"Atnq nm9Oyh+ :f9vonaW*ILw<6R~Z/PO8Ԙac;Pdڒ}oPKƿ6d7PKy.F;angular-1.3.9/docs/examples/example-example82/manifest.jsonRPPKMURPJH-IՅFJ: ̜b|4f楤V委&deU%2sAzJ@\PK£TePK y.F.angular-1.3.9/docs/examples/example-example83/PKy.F<angular-1.3.9/docs/examples/example-example83/animations.cssn y T":%FX'i7!vI;a?s9X4ó"wA`_c;* QԪ9ȹCʚ6hȴUl;/)pVae VҵAرtaAM SPn5ƆkD/|ŎzG>*zHC?lx̌|/Ep"jOY68V]>Cg qU5Y~ya&zPK2])PKy.F>angular-1.3.9/docs/examples/example-example83/index-debug.html}RN0 +LNphsP /Ro I߉n"ű稛1:-nh_?`qhԌL:&^9d!jq@Nqq :NӄH]/?I2[6\#hM/N֓N=BzV\%LjC)S&x9OWE&thsY,& K,{;g}@`=QU)PG,nwywJ@G^lAMxd׹vQJ7b):;Y2c-g,m y9.VU_U?PK0ۗlPKy.F?angular-1.3.9/docs/examples/example-example83/index-jquery.htmlSN0߯zUE٠/`ة=A\!3v.,*E{q̷)9:3-a<1l|F%x0 7\8S׋]րSφdtCJN AK>һRd *t XfDR AjJPTk\Z1Rѭe/KF: \oCw;6>M']A6.n{w)RN!`yw5dId%YB%VG SjZi@xaE=? [J[/9o9@:^'= ݲ9j ~OxV>b8+d% AY9 \hQ__PKUPKy.FCangular-1.3.9/docs/examples/example-example83/index-production.htmlS WC*K~A Lu g5{1d=؏gg0"̼x0p%x0 7۔X% o7]ǧnMqnhG><Ü<(b%{4w<#iqP7.!'7(KBOYQts~N[ M u;KguP>8& o3] "AHXKf27˨$:]1@54 X`T'[z[-o g|gƕw_PooFװLwN:G6(Op>`ʍ!ݸߒ̽j ~6Z\/?@ׯ PK}*PKy.F8angular-1.3.9/docs/examples/example-example83/index.html}Rn +(K!8R^^-j1r2"ܐ*b,o%YQe?PKajPKy.F;angular-1.3.9/docs/examples/example-example83/manifest.jsonUI 0 E91݄\%d!xR!Pzʥ)d%uh,KwxB%Լ7PK.h)XbPKy.F7angular-1.3.9/docs/examples/example-example83/script.jsmM 0bDvYqQJO!.BLm HL ޽wQ;y3ߛW@Eʱ NB:bAKJ jpjI2( 6wT{I4LXj-%cf N`QKǼ7oEy /퍎^angular-1.3.9/docs/examples/example-example84/index-debug.htmlmQK0 S"p^DAQ=xWuD&DA,&tdrJ@+y¨@+tMX߽SordysLⴠ#+Qe`/^eBgd}~;+aKE;u`qͮ`l PEY~-ofAw=28MɳqF{aMPn)Y6k=5-5S捻9˨%c`C%.-]V";4l z_7ed7fWU!к,cf5;dzi=g"{H8 iKoB@7K9W2,y弰PK0ayPKy.F?angular-1.3.9/docs/examples/example-example84/index-jquery.htmlmQk0 Sh;X:P8'/c#.N'i˲_t`۝ r@'؁owr@?15oE2bE E(Unτ,I9;΋:1A UU~CbSOmu(ZY紵5 }*\Es͝s?gpFgҦ?tJ|?YBpDw)xk1싍ŁM~D2ON'>{0| 8 E}qf/F/Hͼꔽyn.2q%#EQ?0.ᧄ6V?ge'dfC/'hb&ˋ՜`/2:\!q*X# y:]uPe͟O]3PK~3hPKy.FCangular-1.3.9/docs/examples/example-example84/index-production.htmlmn0 y N(- !@d_ (v |Pl5U K$) Hm'QHw]z `)ȡdlĠIR]NF5rFA j(}p%K4m(7vA1t5\^:;w6Jz Ǎ>EP{W%FEH|#/N{.5VveqBplw X6g bU.v+4G.LY`WF5Tޑm{s;`3 f0Ƞ84m TR[Ҍt˚1po{uE;MF!,ͨHML}*?':#cZׄʳh0M7y<7E 4ey> 9b}\.8 PK`uPKy.F8angular-1.3.9/docs/examples/example-example84/index.htmlmRMk0 WhfCN.c۩:Z:vFgӇjZ?;c9\ducR1:ec޹RJ;T4'Nipj<\e)>t ~kAlpA3)ڪhYszQ E8B͞ #{H0L qK=!B7q$sڮdoYi+i]PK[wPKy.F;angular-1.3.9/docs/examples/example-example84/manifest.jsonRPPKMURPJH-IՅ&J: ̜b|4f楤V委&deU%%E%EzYJ@ \PKj7>TdPKy.F;angular-1.3.9/docs/examples/example-example84/protractor.js}10 НSxK"AXp6!M X IE\;iQfO,E`{L0HLGtK <>srj(dybTc,!JM댉R pL#V f+U gA?_PKѥnPK y.F.angular-1.3.9/docs/examples/example-example85/PKy.F>angular-1.3.9/docs/examples/example-example85/index-debug.htmlSMo0 WpB',oEf簡v٩=m،V n ,'3V` K#]k\MaO,xQZ {R%nk4ܼ79`y}7ڲHi'Ez`Al"E+;E&k^'6Y *ճJxchCKK/EIxoeGVR=fwvVnUzU"K8h۸4Ve$ve c}9[i5GmΕ*m?44|N: Ca kg;c/ 㲋Pl.e"@@,n`F?Б7=;#)=?ISN^٠#Z7mQy ˆoUz7fb{Y:/+yv2YL jg_0CylZ^,H=8#G #~1ՑE:JP.ʝD&O#L%N85FS SyDGsyQqďڨ*q!n i3W<7PK= PKy.F?angular-1.3.9/docs/examples/example-example85/index-jquery.htmlTk0~_q'tAdv6Z˞ڧE8Jeɓar27gP)rf1KɊq^GڶMEJ?+~5>γUY9^ ѹ0ϲL*5;"RaǪ4>^x6ýhYjXpuhY4qXW{AY;ȕ1(V)4H•k[49U2]Fxi)51fiA5Yͳ /mtFFdYEh "qx{&}8R|2{\?'W)42(|~B>7^N8+&Mr2DV#iuVLPA RGߢWAʃH#ZM᎞,G N(4F]1Ri:S  W(C6*҈g\xPK91NPKy.FCangular-1.3.9/docs/examples/example-example85/index-production.htmlTn0 +8tW aC S{:YG,4,'3.D)>>G|:zmzQ4dD 6@Q@a ;ZfQldYA>9zDW{mQZcFT&X3֧IHf9w2&':O3=|X1>M&85e6}9׶'>feWDHG*.H^3>x8#C>r=mTȃCU52>K?Zg\=:+JN&Amu Z͡5 ߒp7tz(M[ 2"( {tB%nk#is] rt˧,R/bxWWB"=\rd|bS)l,0Лyb%1NISG&,y"CȖM;laG,$[$=fwvVn8*%iAj[cP02ņ>ũ-4rk#6JP44|N: Ca kkZ[fЗ)e=u7:]& ~E)QC,n`F߇#{dwG.Sz~ yphkԼm: o~jLN=:+&J2LV5jև J͡5 {I- /O4#'#~1Ց&PKLH.ʝuD&p˟"GJ&i(p,kL 92rE?jW$C6*҈g\xoPK PKy.F;angular-1.3.9/docs/examples/example-example85/manifest.jsonRPPKMURPJH-IՅJ: ̜b|4f楤V委&de(bjPKDOPK y.F.angular-1.3.9/docs/examples/example-example86/PKy.F>angular-1.3.9/docs/examples/example-example86/index-debug.htmlmPj0 +4_c(C^z>@EqKKϮ{IH=o6NyqF`-Od/ gDi˟ږ}Y9;6+-1(֩W~*yB݀"*m3ieE(u4T@ (^6vcH /7:Xr0{KC{|HlAz%PKK)"PKy.F?angular-1.3.9/docs/examples/example-example86/index-jquery.htmlmPn! .׊ECU,TꥧX6*(^{O&EcqVX嗉H R2ѯ7(k(EϘ6;rHeX '=abKv8pT iɏ U~*=L"x#`6 S1N0) ϰ^oe"jlp$4y,~?PK-ePKy.FCangular-1.3.9/docs/examples/example-example86/index-production.htmlmPn! W\+JUT{K^zj? hÊT{!zx<3[>%8VA22X iTu\L߷yT[g`r'Um 7v ][TBjdY,1.PE:;lNZp'6Izn>H9 SJ#Bk=}ɽGx$vxm4ޗ7OPK2RPKy.F8angular-1.3.9/docs/examples/example-example86/index.htmlmJ1 }ثtdLo ^<dat,= )K>w65x#'Yrd`=RٹUZ5/[><HEkq^YNV~{*SpqڥA=adO7E9rXǼ?xexLQ-.ZZ۷-ZMPKqtQ PKy.F;angular-1.3.9/docs/examples/example-example86/manifest.jsonRPPKMURPJH-IՅfJ: ̜b|4f楤V委&deU%%E%EzYJ@ \PKQTdPKy.F;angular-1.3.9/docs/examples/example-example86/protractor.jseͱ0 НfGV#3#K6"8HqQIFvݻyNKfv7$12ຈӐ 7>)q;jk7DhL;yU*Q1 4+r&YUNVL]c/PKPK y.F.angular-1.3.9/docs/examples/example-example87/PKy.F>angular-1.3.9/docs/examples/example-example87/index-debug.htmlTM0WZHKWYj=8$Iv;!E2x=ϼ78)tn_*$$W hC"$[a9njaSq J}|J A'_o?X6$tMYYM n$7eIRBL,ujJY%eGNЁrF:ߛϧVh)z=qwu+Fjvfp({P SkA 6[_~;~e1'riv* %E#NUNo]1-RUrT$5p"6Gg&(Y@%:~|:.h9?>)ӟCHL .4Ԫȼ0_Ȳ ]G$aKT{y9yȀ${ÉD='iIru HUe^E8K"\]zRNxgRh%9jwt)迫 YQ|\7LR" տcbngwB_[b;#9dmfx2Q5Ld3( 娤Kك =t"cYǒaIN,K\Rrn D0& =[mjbװ . b>Le?$Q5!EYz8 r~KEi{հct&DL [ " D~;e!ܞߡf~H'4R5eɠ&lۑ$aD$Hs?qίii}\ސGZ xGh/PK l\-PKy.FCangular-1.3.9/docs/examples/example-example87/index-production.htmlUAo0W|EHVKI;aSqwFiE~i* -x{bKTsظJ'9 ZWMpO;]9u\pI>cU-9D>F˦tB Z0pyAw3*j j+D℉#Qv -IH`k݇7BVxz?WcF)zYrKw lۑ$aLpiP ȸm4H&/r;w͎#- #AZ/PKGfxBPKy.F;angular-1.3.9/docs/examples/example-example87/manifest.jsonRPPKMURPJH-IՅJ: ̜b|4f楤V委&deU%%E%EzYJ@ \PKR֋TdPKy.F;angular-1.3.9/docs/examples/example-example87/protractor.jsTMS0+t:pc<Q/.%|M[`)3l3K챁X*r(&R\ĆIA|x 3l 9PrN ֚x"yhП8:=03z reJOzVm9/<=kțלZn5ÍBNY,ɵ H)K:Er;;a!d=yv7QWˑ8U1S/L7G{]H ~sиkCK79vY#j`n?mP=H'j**VˠqQ ;nXp\($<ŇAb9'lh]MYJ?PKT6oPK y.F.angular-1.3.9/docs/examples/example-example88/PKy.F<angular-1.3.9/docs/examples/example-example88/animations.css}]n0 9E ڗi X`mpnw/ e[angular-1.3.9/docs/examples/example-example88/index-debug.htmlT]k0}ϯ{)LZҰB]fj #_W_^FD@S4ETк-dWwPYjYF8wN% ;E"LxzIr+晈dV30MH/:4ЫBY -Hצ@6M&tNC ܛ[+I2fƚ#gGP2r6|{#$ORZi*'Ah7NJbv Ov$G%y=;/V|:XKQjbn>l6Ŋt  'uq,+6E{œ*ynX@Od Wm 8QnGL b!ppq:za(t,*?wټ<Nۛ]0Oe@m]ر6s/X[d?>* YǣC~ykti&pkZ]q9ΞL6|N^XB8PK(yCPKy.F?angular-1.3.9/docs/examples/example-example88/index-jquery.htmlTMO0ﯘFPⰴURTjVH0$Cbp`;h|V"9q0j=K uE0AXgiM!:Yku^+Z<`(hqoZ] ȰGI} ,B-kh'r"N|!,1gV6ͳHԍѤKX#nxs _30 koCǃ z+d:K):eMEKKRK.ﵕ \0FcMwS`I(Av52|{#$ORZi*'^h7;_1@;ѝ';~!|匮y9/'V>jG)z+1=gXq:H] *'lst 8 ֕ihlGh* g_".FaNQ|lZTBDm ^{naQj}z}M b!:z`tܚU~hAby+لcD0,]i˳+vׂsK rb`/d yrLµiu!֞L6\y w^Bs PKYPKy.FCangular-1.3.9/docs/examples/example-example88/index-production.htmlTMo0 WpƀVX,@ScZYr%濏G@v/G>Om*_$ (eBXLҚбUJޒf^mO a`Yʀta] -JɗP_28[/3 7f !۽{0MVLya kw;PKDb-PKy.F8angular-1.3.9/docs/examples/example-example88/index.htmlT]k0}ϯ3{)mچ@Z/'Y\@L7 ) '|AMM0f:gi`-HG)3kȔrfV`Eӳ#An1]v;ڃ'`~s~үq.(?rI+AlKS^>rv(%hY?A{듛{v7TAv0n"2& ]!x-%h,HZà4wJn"7 s̆ c8+ N^:B5?Sʌ/w7:!]oo",#-(ͣ˻-;ZE;S8p<8}pT˟v k1sܟ=+J9yqkPKVAPKy.F;angular-1.3.9/docs/examples/example-example88/manifest.json5K 0 D=EZ.^E\ҏ4RZCH0hZ^| ? 4%χ>'ޥHL>bk8濕q-j.fcIPK=`azPKy.F;angular-1.3.9/docs/examples/example-example88/protractor.jsj0<ő2a.ml%žXYv$9)}BzO :X9M d"$#tr"G@!d[Sc9N@Sn`<ڊ~&m(p2/$҄gHbǜE#tﵲj;2#a佦w\BQлl~t\ C nd$at8*~{epmXfX6G߹B[?7GXں΋^.zi7K ]7T=<]q]&wPK}\SPK y.F.angular-1.3.9/docs/examples/example-example89/PKy.F<angular-1.3.9/docs/examples/example-example89/animations.css0 E~#h ~M062`@B0|z{מ=(zxd=)K\[)Tt%=5˽:4}RB4FcCL*u WoJ, ]gos_+ˆTjvܑp-y5Pհ({tn#&YޛUiV+b!5iKQ%/sj PKUPKy.F<angular-1.3.9/docs/examples/example-example89/glyphicons.csss-/*Q(-|H^j^I~R~~IqIQb~r1i PKK`K5@PKy.F>angular-1.3.9/docs/examples/example-example89/index-debug.htmln } ;UIiڴ=/Y&iUiҤN6wzPi&ni'}06P1IPFS>ޟ6dI!p뺽۩Hg̈ Ua1AL a OICIy2ٛbj!AUêJ,_.|rrrZ,.%_|a_*ʳº 2c)YuwP[ C;ASk׎"Go|3qGePNƸrtأOB=K@2e1u%H_F'3mS({xSA0,`bN󲲿X7,/fftAPKImGPKy.F?angular-1.3.9/docs/examples/example-example89/index-jquery.htmln )c\RT5j> Ӆ,ή߾vHJ8?|LnN0Rw*A ։~ywtNVCowwƼblg L?;%b(*AF7R V ob/U~' jCQ٦ % OEbPXp3l.*_3Pnv2_*Fva7_ njW3CsnRe9`%Ι~lY稇F':d7$_v8_[E&/PKHPKy.FCangular-1.3.9/docs/examples/example-example89/index-production.htmlώ y)w+;Ҫj=} SC?o_;zJ|:&S;z0 t= 9c_׍bӗ!p-x[69.`f5ɭXCT fteu ba@+x+ڹe^bj@gy'2٪}[ΎYTS'sxwކ\z5 ̷[_D~֙~z0qҬfgg<>CoCZn2.c1*Qm u8vm=x}&9z vHkf^-& f[ċY5߀`Ip5`\F6o1Dý; %ʮ~vzz]P7}?PK'PKy.F8angular-1.3.9/docs/examples/example-example89/index.htmln } ;UIiڴ=A4iR'Eg;ݫ:8[|Y]p3gnƪ>F`@ױ' fձ,ȡ&`&l̐ձWJoCUbvYR(תs]'{.cX?TxE=:q qKʠ:#5.xAhMo?nɔW= $Oų$*^Sg geڟ⼅WH0F8 0PnL66D=/ x#)XuBOnF4~Q_PKh$OkEPKy.F;angular-1.3.9/docs/examples/example-example89/manifest.jsonRPPKMURPJH-IՅJ: ̜b|4f楤V委&deU%s* 22ay (@#JKrPKqnPKy.F;angular-1.3.9/docs/examples/example-example89/protractor.jsA 0E=쒀(nD<M&&$jnR<ܞ 4taahp@i7r%fJ ggN0Tݸ9^<6v >%Ŏ_angular-1.3.9/docs/examples/example-example9/index-jquery.htmlj y eOFh[Z8lj;P( a}3~N!/ȘQ1%G(5 YaT1A=`yam񑝾fDISdiS$AҶowrU})N*[_V"٨x Z qGBǔӛ\OQ1Ʌ9z F#Nr%cIKv[!b7<_9Oe`%_PKn5ZPKy.FBangular-1.3.9/docs/examples/example-example9/index-production.htmlN! eO3xY Al:̰+ٷhLtO-ߦJyOɒ;^ 1fA@PcGb,S/:W 6?>D2k8kpկIF2IQ `fgt[=%V4 CbͰ|VYi^*'N= hINgjc*^]>|xµ \Qs`q7Dִp5=&D 4.d/qVP΂ՅUPKbGPKy.F7angular-1.3.9/docs/examples/example-example9/index.htmlN! ˞f9z6hv0 fac4& I~?GA9y-E 59A|Pd5uC2 k-ɣk$ضx9/&:׿ vVBA-FlV7PKcPKy.F6angular-1.3.9/docs/examples/example-example9/script.js=OK 0R\Rѽi,4)PA =7s4"(k(7E1D/S",Jii%%~LҒtq8+gㅭ>`˴y@RKȖ_NcļVqWNi]& ^'v"ؓt6t8fMm~dYrgn:MPK}GPK y.F.angular-1.3.9/docs/examples/example-example90/PKy.F<angular-1.3.9/docs/examples/example-example90/animations.css E{_ckPbi)4S&&BtA <_uP ) mGC(ʴ@TPU>f=k9ރQ8*رc;s /OMl۶0r8a(/۟PK^PKy.F<angular-1.3.9/docs/examples/example-example90/glyphicons.csss-/*Q(-|H^j^I~R~~IqIQb~r1i PKK`K5@PKy.F>angular-1.3.9/docs/examples/example-example90/index-debug.htmlQO ST>e>Ax۷3YRPA9 Իݦ&NamԻ @c#}?|MwOG_-N]-G8`FlX`|T Ft iv bb@t KxLJ ^CT VUbrᓓcbq) RQM-g!4wKAΪ=0hePHZSPgvy>~[*+r2Օ}Yr/+A<8x2SF>ҟ켃WH080ӘB6.kщ{2+K&/fjtAPKr}SnGPKy.F?angular-1.3.9/docs/examples/example-example90/index-jquery.htmln )c\RT%j> Ӆ,ή߾vHJ8?|LnN0Rw*A ։ȿ9T[.'_25i '0Ld J]X4UT2X/Jk Ee*&6 >}C-bEp-|S|@IȻ|]4_OFڅeJ ^:vK~8NF\7۔Au: k2u3bYP}m7_ oW3CsnRe9`%Ι~lY稇F':۰$+[ˮ }u5h$EzPKpf&PKy.FCangular-1.3.9/docs/examples/example-example90/index-production.htmlˎ EDLFvKQ(N*n^2x{4RV=˩[Q5!Ni`m@HPFy=(8<~Jf||izQЋ- g03d!w*g3:0 āAW2X/I1d5T j`BȓvSClՊ g,))O ݩ2bSkp ̷?q"?bL?FBLi`aڬf7g<>BoCZn2c2JQmubEmT//dT]r2=CɍsMyW$-2,~|I|' %X\ X2緑uGtކg%x+a#IntAݬPK`tlPKy.F8angular-1.3.9/docs/examples/example-example90/index.htmlQO )N)>.1F`pPR[%&&3ir;hotLnjɀa1 6P %(#clQ8⋽mBΆ=?;sS4V!5*%<9L13 eangular-1.3.9/docs/examples/example-example91/index-debug.htmlRAn0 N`F6I`h z1M/*! ȧn6z`N)$f)ff!*qz^Bvѓ*T]z)2ZlxBmb,q@HDmGF,x]$͋աJD)2巣"ܭ^t~}W Ύom:YefschΊO4]yjsülg MUDva7N)Z"%M^&)JʐPKPc/BPKy.F?angular-1.3.9/docs/examples/example-example91/index-jquery.htmlRAn O6$}  em+=$R$K Kt<. .b=H .$EtB$|N>?j#73B_*cz{"]oIc T:FJ;D *49q,v£O$-iUi7xgȗnTR3X6g$yѨpW= +DډSKX[?Um3,%ʌY|vhg\Ѧ'IiS˜ٖn?!j>mϳܖMV[PΪfnY>o)[rP߆UpLd+C_PKriIPKy.FCangular-1.3.9/docs/examples/example-example91/index-production.htmlRAn O6zI#@`uH0 XW`;%RN xfs '䈃i 1dPu! } Oj4|^ r|pݨP;ҝ猶gr #h@b$Ydu"\"GG1yw7 rƌn#K~F#)M^ozж>%N;y⛷+齠_mvDt_iƤ2EC3.mI>bZ,⻛Zpp^@o}صҍz(0F)bReN;{^5ȃ%ùs;н%d 6ƽI`I14Y(d uqmLJ~$++qIh ^{ZbGK:oPKgPKy.F7angular-1.3.9/docs/examples/example-example91/style.css+.HSRPH/RHILζPKkPK y.F.angular-1.3.9/docs/examples/example-example92/PKy.F<angular-1.3.9/docs/examples/example-example92/animations.cssMn >V J%3G!`k~di xzfVO+R7;R ϊOH `MԪu@ʚ<76yi{ogW91Nգ3t<%?_A_8Z;^D֊uh&S[LĜΔo!aID W]3hGbGxO3-1.[<PKgA4PKy.F>angular-1.3.9/docs/examples/example-example92/index-debug.htmlSN0 +Lm%N %Ȧ6&U}iNHUx):#Mx `CReU|BF`o]i2=4doF0z &$igCB`l0 Dm_V#(g`MӖ' md* 0IKbߺ v<-ԸS!1[k T'b`pms,6EL9%Wd˚_`(CFD*#C:*Y=[CQ9JH}#Sa!= "+&dK|f<=PĕaI֐<ޓ6_OPKuPPKy.F?angular-1.3.9/docs/examples/example-example92/index-jquery.htmlSMO0 ϯFpZwR4Ct0BwX~yAhNބD  ɤ'9A<7/f^A5"tՀU~ =TtI^UH5ܔ|I!ϋr" 6SϚLzքGɔ7N|u Z2]-%#:HsuRq a)Z[syu*2<~o^Ggx*L;࡫CTu}AXhHۼ fP:xJZLm{Wf0)@=$3!Aso̩˧|zjj%k&U9.Ċj}&ۑM@͋7IM}\&2~)by jSŭ!~'FU~sfIZڏ]&OUgŻj ܶӔ69hRlKujVQ`l?,hPQ[?_J!rO74PJV%L=#Wb_.p@ЕE*#c>!l*EK[CQ8BY}+Sa&=X&k<=EW[dKzz<nP?DžaN<ݒ\/PK~ⷡsNPKy.F;angular-1.3.9/docs/examples/example-example92/manifest.jsonRPPKMURPJH-IՅҖFJ: ̜b|4f楤V委&deU%2 Jay ezpQ"R\PK)jPKy.F;angular-1.3.9/docs/examples/example-example92/protractor.jsj0w?m>AЬ[ ]:%[Ƞg[TLtvRJ=4 P<Rom橁 (0M MG`+C@ ˷p W.39:vf]Re, 3:2/>"^ӑQ)È&.VS^]YW=6"uld47vOuz*X&!4VA<Z&PK6PKy.F7angular-1.3.9/docs/examples/example-example92/script.jsM 0}M@AħBdC黛X<|;;U!ס/N'> cP2L+cWrȓ%3<ڏ̞[^B+*.M s8!)8.lm>kHdC+C LЪy*yY}s+T3 >IZ/PK[ PK y.F.angular-1.3.9/docs/examples/example-example93/PKy.F>angular-1.3.9/docs/examples/example-example93/index-debug.html}Sߋ0 ~_[vI{$ cOӸ'zٜ8u죥M+O?O_i[S[Sr>n_+Prԏ =o?7 `%] <@rYP0iŏ\{eE'aUbtD}!SPq.!V^bVkAχ eT7k<WWHa9upY1x~ ^(%ϖPp#[Q¸X=R#'u?,DeFk Q(%&%;:X w$y*b'{y\w r:72rvYcЭۧ .25QJ:lK?Vr z뜅ChCP-u,析QQm|h/S5CXQψt}<4hh^y]D y岸?Trn1cW& ,2vb PKPKy.F?angular-1.3.9/docs/examples/example-example93/index-jquery.html}TK0WLEA ]ۤm e STӬ$,'Β"7oMc?OS(C͢ES$C__d'o~/^!d閍.=EB,9iރby^W7wEr|9 cuY$!m B% :朕EܘzB;Bc)9fgpoz\Pț֢ z,&1"c,F~ߍ()ϊ'ap ˦} +1AegTF gj.IS;ad(CVX}<ENeA=uDT]t9IhoRh|E o)]34qIʇX[Bc3>~ m2Zк]uQ&΄5"<kZV 6*vFZVmCE_"=AOXRG:eڛ]h$ld1lJPK2PKy.FCangular-1.3.9/docs/examples/example-example93/index-production.html}TMo0 Wp5X-KlcЃbs2YR$H俏8E#!ZӄExe<@ U,*P1h/dPX?EoBnt~ϭ3itY$4-ok(VygLPXycQW(p[_{py/5.-eȗ@wʂ7jhq}<' ov x+Ra/B#Y~zfy9 p'n'gEgoalފ}bp"| lc\nwv(F:|$Mkwv  8d88ʂ'{Z76t9N*Rn4U{?vzI:$> 7㰇=y܇ wFhcO_FI9kZVeTٛ2"Jmk|^Y ?P\cH@LW踖io2qSz4o%/PK PKy.F8angular-1.3.9/docs/examples/example-example93/index.html}Sߋ0 ~_[vM{$ cOӸ7z;u죥M+O?O*^iWSZS- >(/Z TZ-=RydM0XU5`û"O/ء}}],G)Q>kEU )kQ䩔b ~+&j H5;׸NGKAχeL7<S+ZR8\A?!z }M6 ݄lqpg% 5 QB7OЇR7;BLagTg+* oIS;aE׵3:|"dE_D<]N [ v6xg xtU1!إ[f5u>IX= :-|JpA10"BwpMo؟5*, - eFb3Ji:敗ETP|S-Ta2ݠy,ܔH#aE֎lPKA]PKy.F;angular-1.3.9/docs/examples/example-example93/manifest.jsonRPPKMURPJH-IՅҖJ: ̜b|4f楤V委&deU%%E%EzYJ@ \PKvTdPKy.F;angular-1.3.9/docs/examples/example-example93/protractor.js}0D~& {0z൴+4)B  5ny38;UӮ7hd;A@J z2rʚ`q6 y|HřvZЛNgű8K6+fIh~qubxCM<)QZoYTD.DFA{;&A,|"PK~^PK y.F.angular-1.3.9/docs/examples/example-example94/PKy.F>angular-1.3.9/docs/examples/example-example94/index-debug.htmlEQn )<.=%\v$eN;v@KX A3o?;6)̞a)*J.Ѕ0?eEѾp)a~qSI-`ko x+)VB.ުc-YUot0ksкR!nj2U'HPA Vi*vۜ 3 4"ܡmŧVmYp,R*mF;d{D?fu.0Q˼R7PK9PKy.F?angular-1.3.9/docs/examples/example-example94/index-jquery.htmleQn! )(K&JpKN&$PW%o_s\!1c\x8S5`^s>qCǘ S&@?wT@s&X˓8P.JNt73X^ұi)BI6xvM%lQg >SfdG}%waq/LΚ9V (@Sμ\b}]тxM,K =\MvT=inRAonTFM"xG2H >GmMW~m]u[PKY3PKy.FCangular-1.3.9/docs/examples/example-example94/index-production.htmlEQn %AU;RS\ U=LN|?w' ^.~T 0 vS fsSqKzkrAmp]]BVz18yaդw"u|/bₘ llT%l1+ SSx3}႒FYɋz B@Ge;Μn֜ pH~=v{™_Q[%`Jju:l:.ZhGW eݷOPKr$h%PKy.F8angular-1.3.9/docs/examples/example-example94/index.htmlEQn )<.=%\v$eN;vkY AęڷN䀿?fOׂp)U\ c`&$d>7(RqqSI=`oap'X>\ auF(kWޕbUpSA">!r bJSIL1L o:ݶ3N\|l_ke¡${H4+)?f f>`xx!n9웻}ZmD-J^PKmR>PKy.F;angular-1.3.9/docs/examples/example-example94/manifest.jsonRPPKMURPJH-IՅҖ&J: ̜b|4f楤V委&deU%%E%EzYJ@ \PKdTdPKy.F;angular-1.3.9/docs/examples/example-example94/protractor.jsmA 0EbE&t ɴ:MBE-+w/yCh0Ƚ$ Jdb`ap'D&9gNgC;ZѳJ Є۹0)'b`jE`4b{֐{/PK2fPK y.F.angular-1.3.9/docs/examples/example-example95/PKy.F>angular-1.3.9/docs/examples/example-example95/index-debug.htmlUM0WL͂X݅B(,PȖ6vW$&Hv>Hz(4,of޼;Ko%Tn (ll":\CYqc[F?I>{|jdyǷ dx~Yt L̖nXS.4wr! Vhf]FV*Y!|`4ڍ޶ZtJN h| nJI3?O#wԭsה4̠Ga6}÷r/hm+.p+yvazS+PݙTJ <<2„.\=el}XXQs&WIet%j(S G1UZ^Erz,ᱪR >"WCee@Զӻrw(2LGJawgmgi@\k/, d,h9m:8A߱Кgi Gt[9{+۲"Ge }pk!\TnlhU[w;t:(lƞ錑S&qsp8WA .̭Vv.Z@%邙?owv`X$P#p~Ґ'"t-JPK~ZPKy.F?angular-1.3.9/docs/examples/example-example95/index-jquery.htmlUk0~_q3'PKa%_m0aȖU,O}w{l}wݏwBnJV7xYFBrtʊ+2KW;%;mdxKN=mnΖnXS.4V7q6 &}:Kg!}Qβ`=_3 )ne!Vhf]FV*Y!edj)9/SMK8f<+ŷԭǮ)]IBDJ KX[[9 gx<LJKkU;0`THqISM^*_O<+zqv@aB 2h}XOXQs&Iet%j(S=K1U؝^Erz,ᱪR >"WCe䣏C󀲩m('u#f(2C !&9,, dD4Rh tXhͳ#-=.WJa409̹K-oJ-RHP)/)J#h^܅6Bժ0kww*I f~Eh>.pc@I>a^t2LGkPKuWCPKy.FCangular-1.3.9/docs/examples/example-example95/index-production.htmlUM0WL͂Xݖ6Q|Yc/mB-m];#9_d{(4[ӛ7ofNoƯU9bŻ<]Brsn珯=~J_6|m d|ˆOZouNJs#:j(+WJrӺWrO?un%%+""+xVinqc打J~38"k8XNeujq`鍫w!qܙ 4k9^b^SU@VMJg,oBR)zB9y>e ]$AQA~9ai3ѾPmNΓ+SczlPrNXi$V .BA3` vǪJ5s2\0Ajrgp)7m'&I\F!ؘGIdwxG.5 +bE/]t2H17[,Ys#),CU9yV!-I:K1^8w[dy7o:jvIC|KJVDS7RXe:]HTcphD$w\M7(%$y[Ko]m:O}k$La@B"e,.FJO \ n%i=E1]7 d8AޤT&d'2'1T=RFEˇP Ksjs2u\c{LtNrl"K%Vw'FxNFKơ)Pm<\:\m4)(PQR|;Y׻f2쑃 qŠ klAdˉm#a'4]+9Z]4F3{xm<SCZEiw@z& %O0@ヮeZ?PK4DGXPKy.F;angular-1.3.9/docs/examples/example-example95/manifest.jsonRPPKMURPJH-IՅҖJ: ̜b|4f楤V委&deU%%E%EzYJ@ \PKJTdPKy.F;angular-1.3.9/docs/examples/example-example95/protractor.jsj1 >bZ?@CݺRdΜg${K@B:NE[angular-1.3.9/docs/examples/example-example96/index-debug.html}QN }Wז7x1ptk(J]eMLL 3sw.rMz5 u%ک@X4سOoc+PQ~5ygFf*Hټ[M޽Ɣ҆ܲ{C]aaBGdu}Pݷ[>`c(9zY-ufR?- ,IJԛݤ.?]nԂWc9m@7PKR.IPKy.F?angular-1.3.9/docs/examples/example-example96/index-jquery.html}QN +Fz0j/X?n7R{R&@7c]$cT m8htjbmhOPѼ})yN|Ϗ`(٘nvyL4BrqJ1`(l vb]ifF&[_@E|ݔWWd8\ MI3e60~U=f6/՘V^@UۏalMUw=KLP<[F S+IduP:PKPKy.FCangular-1.3.9/docs/examples/example-example96/index-production.html}Qj!Wu^BŬ/}|̆@mwUSMT58gDZBa+hqp O=H1(<` [q.i#?6>V1?:angular-1.3.9/docs/examples/example-example97/index-debug.htmlT]o0}ϯ0R_dʉT4N5'8Ԩs]֮DQssms7Ri!yB8 xJXNV؄~N +łW$$8,DY@ F6&OhNq=4e2dXV=7MB}|%$woEK}y%˺ԃҔp8 ǣW4|cx5v[> u߾9?;9+x9'0/;%wD'h;l/mNVpS¤n:^ՅP m]N,,,oD) b X2["u"ߋ!a(aD#Dj_^*+G5JC$k8_<4BI~9roaLgėX17ukBxkLro?PKD PKy.FCangular-1.3.9/docs/examples/example-example97/index-production.htmlT[o0~ϯ0R_dʉT4@c< ăx;3*tkW\sM_pˆ2 (~dj\Bh#EŌ. ݽ`NjFrEQ]ZѤ\X[8bMIlϴIaB^Hj%3sx$ǵP܆MhXhOs].EiҰ+J@3FpUZ+j>]JHSi`0ao}q< 3-r|~!~? -y\^OANKVD)Vpp2Թ=t'2c΂+g& մ^4pWͱH[n[]g2PTy RI ;7Lax3D(Dor/f"=J]V_^Ch{F[+xAnxc xj@aFh^ J.MDgqo_WˤpϡaQ!׋pgD$,9/ *&vS?fl(!h' ^HPKFw PKy.F8angular-1.3.9/docs/examples/example-example97/index.htmlTn0}W /K ҖʉT4@c< ăx7 35*w(cs|}^MaV* 6Dq}R)^f!6_oޅSCJDvu }3a8@BWZҙ"Q${MTKw4cTXޔw!o۔J#RKHHˎRZFMG' $I³x:y";ڂVN>EHw0o\+k4$՜0:sW'P{;d6ź_s PKiBPK y.F.angular-1.3.9/docs/examples/example-example98/PKy.F>angular-1.3.9/docs/examples/example-example98/index-debug.html}Rn0+V@wڜR*c#cW{mLMB33oQٴuFP@Vڠa_dd_+?X 0!\%vM 븮[I4|N 4 -^#&4 fh u6#joglTiFocx~;v+iu4nǔoM;ZtJnj%ö k28=;H.}y2_)hY1ek ʈMx EFɁoĊYa`?+tP|2 uy؜`svΰC7QXvD(M]ը!Z=P ,Q *wnZxlxqr[{ԩA> PK'ωPKy.F?angular-1.3.9/docs/examples/example-example98/index-jquery.html}Sn0+D@%ԡtmNA45Np+ /)2 ə޼Hu @Sbbe'`f @ǃj4/5Hjg惈 z|^S>%J^vJ@ iRp K!x B؞;%sQ $@n-^XKl*/()ig]͜k&å rR:YVZU|?V 3[ۗ9 W['v;DVp)3mw1}zZݧ.h/6. z[ 6 edjJ5|V/lPνB8*VtGerTq2{ƞNpB7BzN'"aJz euca8ۦo/ԔO@ KPK5PKy.F8angular-1.3.9/docs/examples/example-example98/index.html}RN0+ DvAqra qpik%rlDUuH%6)yLLݺEX9% HAMP_1ۡ! PpIߙj%Bvy^_2Ax uY^(,dPBi`"FLQ4k˜mE5_)ў9K#x~um6nvܴ Fgf@:LTprzv^\\ۗM+m[lc[[ hhId*ӠHr#5йjpt+tk574 eD\I?vFks9rBBlxCbj0%F_XXp4-Ó. PK{PKy.F;angular-1.3.9/docs/examples/example-example98/manifest.jsonRPPKMURPJH-IՅҖJ: ̜b|4f楤V委&deU%%E%EzYJ@ \PK)TdPKy.F;angular-1.3.9/docs/examples/example-example98/protractor.jsj0 { vۭcێ,%ӆw_rh;v0w,!Uw ;%j &P$ ^fusXaUJbaR",+v>9Qˤ<Wo,E4thQXS Wİ#1ԤNOX@)Ltְ*`Hl.j' ֈ@CSГΕQyT*D^<·E>B^b%CIy&ʣgz-I1ѫ(ȓYvL䘆ki02@|PKG5B%PK y.F.angular-1.3.9/docs/examples/example-example99/PKy.F>angular-1.3.9/docs/examples/example-example99/index-debug.htmlmRKO0 W D[㱑 NhJPTi:1wc!Urj{ ;)tn5»d6b.LTK /r߹iЦStGu*Xa%fO^!hYT-Y 2r&7И< 8 2'#x3l-2uVhhgtJ@3x[NH εFKf?)6VVh5 t=7\B Wnvߗw=M7 qtHihH[44$0c+6kJ km*nP%+E:l.o sNݎQY~f`aVlg|%z]7PKC}uPKy.F?angular-1.3.9/docs/examples/example-example99/index-jquery.htmlmRN0+FHi%By8Xb&bq*8W)3sΙ31Sm ›e1b>jG"@^#VPq۠ˣ秇TpI,?ym$BNEeY$ 㠱eiF_k*dt:\&*X`1kX 7&T[/>>֞U+qOuB*iZJx`N)A:ZU:8d&ngz~ӗwrUbtHt$2H22I-.኷Jۚ;'Ԛ DH]'w;Z\VFbk]}h!z>PKȎPKy.FCangular-1.3.9/docs/examples/example-example99/index-production.htmlmRn0 +8c`׵ےTek=mf\$Hr˿fXwD=GkM^,SU12YLh1hbMu*wϢ LbMai&Hy X8ixTYYxf1Bag\Η$jP|yŮ|g೚- ^&|g]!2=;tRtゞ'd+\㊦LQ 2bc7"L@PPէv*W,\Vٛ;M&!!"*iyw.n;ŠERwVhm5ohSS^cT{>H 의 v"#^NX=i{󊣅臖ycPK PKy.F8angular-1.3.9/docs/examples/example-example99/index.htmlmRO08 ["}^t>OfRgBr>(ew5FW< (oH j نu⿿SS74tE#q6#k1͞4bFeEd˩*&OIڬEy$vVZ;eH:E[Q0Q ,(\jlTL $FtLdX"Lˌ)=R MlїLs0HrtLi)̐ρ0Q"+#Odƞ-PHUQ( '5iY~o̙׫B~f`_amg|rę=kc PKt1sPKy.F;angular-1.3.9/docs/examples/example-example99/manifest.jsonRPPKMURPJH-IՅҖJ: ̜b|4f楤V委&deU%%E%EzYJ@ \PK1%TdPKy.F;angular-1.3.9/docs/examples/example-example99/protractor.jsn0|޼H4[ ^RKƎ`%jY j<; Q>X ojB]PӊJ6a aG%#Y1hTSeٖݓPLgׅà8m^Y:;&cRҋ|;VLC-njT=džZr- )y&2yO6t%=j]suPKItPK y.F5angular-1.3.9/docs/examples/example-guide-concepts-1/PKy.FEangular-1.3.9/docs/examples/example-guide-concepts-1/index-debug.htmlQJ0)6'Y^D>@ H,uݤA '3J9VpL;V3'hI}@-ȣ'K!dp|7=`s {DbNyffWQ 9NF-R*cebS+l>{}muIV.&~ۂN=9-qͫ-=0m}NPg‰˄-'7/Nԛ(-޿eP ƃKly|._k C@+˥:@ޣQrkc|PK:720(PKy.FJangular-1.3.9/docs/examples/example-guide-concepts-1/index-production.htmlN } FG(tP@m}wdMa2DL|^6s!d{9 XOtT9ЧH77*ig9M) bP0&Ԏ΍ױUnZs>m62"۴zo'mC$gVxY{7,JH%hϴ͓r1ji׾gi~NPv(E;RЬ eyos *"۹$ͪl nt9j\ƫPVPK-7PKy.F?angular-1.3.9/docs/examples/example-guide-concepts-1/index.htmlJ0}1GI֤Q(C7&1I˺nA &dˌk@8VI2tP} f QńYS{W%M?~9Xi1#;!v'x,tIG2%:^OXٸ-^ZFH^6ќM qUOYV̡v'o4u^ ۺa\X2D$s<`dPX$ad>^My롴L6"|Vv|  z^/e 4: PK_PKy.FBangular-1.3.9/docs/examples/example-guide-concepts-1/manifest.jsonRPPKMURPJH-IM/LIMKN-()5TJI-*r̼ ݂<%\,W-PK נQVPK y.F5angular-1.3.9/docs/examples/example-guide-concepts-2/PKy.FEangular-1.3.9/docs/examples/example-guide-concepts-2/index-debug.htmlSn WL9%MO J)GZ Qmx4%,x7 ?M^hNr^y4䌤@?z|@,jq16;Rp\xꤣ )^mW?XI -ڸ'o4^}@eޝr9iR<'pFЋs;c/U x&+ݢ[ AnGfz񹴜UFH8U\;ǎ5ewXb,N#20b@ţ9V36ȓ:ˋjE W#q9,,V8ᴔ.%MպgA:w4.DlI[R/FrXHPťnS.o1X U Xi4JMx0β)n2ͦ߉vZ (~ fLԽ S~6״OI'͓AhW3-zF9Ч|i|p㢒vV:D U>A cˣ|j'&*77z-FcWڶz+ZXG^vWbp exԏ`Fz߱0Ҕ3CǾUK d3[^ Wĺ_(:fy$us9rv#CZ|XtD_)779!4R%4+sc@";Ύ*餞 TW$%iNfb^~b8鴅Ӧt.7l=*}ăp7NÒIRFر!z V&zqr+ J\xymPK-}PKy.F?angular-1.3.9/docs/examples/example-guide-concepts-2/index.htmlSn WL9%MO J)GZ Qmx4%,x{3 ?M^hNr^y4䌤@?z|@,jq16;REvɜ]%M HQmqŪƵ?dWa[qOh;Ur <'pFЋ3YvH[ߪu T ]ӎÆn< nQ#{ƅ 7nG8R/>оhiq1c|ҚYsѢK%iN$} ]F xqHNINEvQ+J8{Rl,Vp:mi)+]Kuφ }i\8*^%F3֋K1ܪ\o2Or PK~KPKy.F@angular-1.3.9/docs/examples/example-guide-concepts-2/invoice1.jseRMO1+F. hd 5`fиN!;o^߼y-@e4zKa8wZU {mҗ3FrR/ghMYJ[h͔ k_ sRHatہ{k d/ iK](9ggT3~dٻԼ+JOVg0M {}6xǼZ@zPx FEnhf7%#Lw}7aQیvJ/.kU?|kPK1z,RPKy.FBangular-1.3.9/docs/examples/example-guide-concepts-2/manifest.jsonM @ὧYPˮ-Dg.{C9`U.Z{!B1$&~Ң%yU+3/l}ށ4LPK&.Q[iPK y.F6angular-1.3.9/docs/examples/example-guide-concepts-21/PKy.FAangular-1.3.9/docs/examples/example-guide-concepts-21/finance2.jsmOK0sK*"-=AJ!MdEݝ647/t asjXRy4?(e]Nr{LzkKcS4?WoZ-۽?Լ}&ca^Uz[ᖖrXMw_|KT}y\) ] Pw"aXE:?`mlbea).կ7Jq"5jlYcoePKu}PKy.FFangular-1.3.9/docs/examples/example-guide-concepts-21/index-debug.htmlSn0W >$Z9@Rn۵'glgKi)#͛5f;d^*w:7PM@H _?6Ȑw5ֿ渘 @zL8.G. )^mW?X$UHi8WG͟PNvՠBi1pFЋs;lc/>U2f/LW/rºi\Xzy(`6oKOhd xSU۱>QojU/pТlKiv$} ]F hHNyNQv#.׎8\{RdԿu+NpZL~jݳc̻i"J#z w&zq)j)gd'|-uPKrltPKy.FGangular-1.3.9/docs/examples/example-guide-concepts-21/index-jquery.htmlSn0W >$e78ΰu^{R-wq@**EJb{~X9 h/[NTC#}bBjŷO 2dC"T:NfJ{1Pv4aeSd|u+G1xRS ծKM- ^20 {W7NU=x󯪬#0"h0 +Eo-V|.%P l߭5{:)1{ƅ 7n{FZ~9r'fO8 7SkF=EgJ;L1.N#raĀLsDjAeS%KGn<){I2 N[8Ԕ5UռgAK`US?%mUJɕ!FHPյ(Y_fPKB&PKy.FKangular-1.3.9/docs/examples/example-guide-concepts-21/index-production.htmlSn0W >Ĵ\ $n p!خT;c;[JANN3o{3oFlie9rwb$A1u"d(goLQ*)6Wn\T ^~1 'AusydPz[Fp}ޜYY/xE+^Vgi2ѝ1qb`Fz߱s13C>Vsd-8[^ Oϋ׺_u. rv#g}Z_tDW)7WyhP,mKEiV$kzQ8;*JF4$Z9@Rn۵'glgKi)#͛5f;d^*w:7PM@H _?6Ȑw5ֿ渘 @z' ].L:@Ev֋UkodWao);ʸo vJ<;6*^Ea#{@%5q0{ٍg|Y =HB[6ދ'O2{ZD_LĩX(7y@hQS6Bq%4;>.#T|?4qN F rѐ (5~ec B ,v[)3v-{b[2)mm&6`r͕峍d#ŝYx:A1!Kp ,7{Kͻ 5(l1p)](oNr~VbK媫9PK/+"PKy.FCangular-1.3.9/docs/examples/example-guide-concepts-21/manifest.json5A EB\gˮ-DQ"|Y !p]+eh<}#opfK]P7 iI%O?b89Ee`~FL^_V4Mp|͏ά%2g9e:r89#R*'mC]PE@ 봄{CftnF&m5C~ts2E8r+QeDnoqUw S8Ɛ Mb?DpS07# ֑E\n hY&6ћ2dq`3a(5Ẅ́r]s.W'M HQm1bUl$1ȮB kqh;qGe?9iB1pFЋ3;섢c/V2f/8׋rºi\Xzy(`6 '/2{ZD_LĩX>Q֚A7J;,1ّw1 9s"f0:my:gՊ#q9,,c+NpZʝ.%ڸ'o4^nb稬#0"h0O "p[qSz^@%X%ؾ[1['6)1[ƅ ϰn{FZqi9@Dچ;SkzÝNj5eob\fG2e`ĀϘ8NԚA񨟟eS*J | FsG<){J2 ߺ-pjL~j޲:wODlI[R+zrXHPťnߌRY.rM_PKkPKy.FJangular-1.3.9/docs/examples/example-guide-concepts-3/index-production.htmlSn WL9%V{VؗU+J`2dq`3a(5WH庤 )^mW?f^l\#AvV^Wƫ=*+ɮV(ywlT8S>(zk1k>lJk&aύ p(A{ƅ #Fl '/2{ZD_LĩX>Q֚B7J;,1ّw19s"f0:my:gՊ#q9,,c+NpZʝ.%!Pj^~+Dm5X;첷R8<ghCjm̓QM[Ou- 'FV'%CxńD,=.$kN`Q2[MlAa! =pdԧtRr/M, K s@?K9GYi~sƯt[-W]-WPKSӰPKy.FBangular-1.3.9/docs/examples/example-guide-concepts-3/manifest.json5A EB\v]%ZN5FݽIhB G!2!yPkEFJVjA]#6- zϿZ 6sPKzc|PK y.F4angular-1.3.9/docs/examples/example-input-directive/PKy.FDangular-1.3.9/docs/examples/example-input-directive/index-debug.htmlTMo0 W0B7loإXe_40Vr )YIX)>GRJv XVN3&#(|[a (c|~tJYm' *nT7ظj(mq%CS'ܗ,XYgr#"&/s_RjeRh7h֗|[ސ 0VQ=b,zU7Vhv/HY:_id<ƙ)OΝ`>g̊ecqc#[Bq 5`\W]D=1ڸ~N4&3w #'#"\: r."]rQR.3K+-rB g5` –ZzO-]y--v;fjjs?GYh>]ŗ!*ġg,N\o8cq7Yrodt,߉~.7a\ cۂ{J'}PKE5 PKy.FEangular-1.3.9/docs/examples/example-input-directive/index-jquery.htmlUM0+ )${N.UTP힪=doʱCAޱ%PVEH{qB,ͦc4-'>XQ2S@,f&#g4ۺh; Wq#UXi_z649ٺTMg@2#I⿔m'F>%,ŰI^5i\1jmkNhUgYm@quq|^١VV=g88nI)QsuoLc|vFcxCk (Zg`/э*J iլy/R`dƙm}_:`G%# ,:0kKlz7BB@4ΗRR4Ci'&3rZ.w5wgZo43QeFnb  =^σP&r, ;p KQW4Gn5inަ܏ Tv>]C8EC[G,N\8@lT[.PK>NLPKy.FIangular-1.3.9/docs/examples/example-input-directive/index-production.htmlUn0 +@R`WR/zvЃj Y$9KGIV6RKItڭ{ jB $SmI"YSMhz$w ᄓb]/9d*\k'f Xߗ$9G0s|>;<</Rr3`_w&rvaks\>*hG%l"@4J(/0knIfn l{ö(-Xzm{B%9"u>kӁORn}`xcr8rd `( eI-q =`üLA,1ڄ0R @FN?G)jE>YXst}N2+JrպEI4J#I NϽր0. , ;q|-jX+ZţUi6~tEѮqП%9c Z|"ޅؗ X!(yLX7s I:ICs&yahOPK9S9PKy.F>angular-1.3.9/docs/examples/example-input-directive/index.htmlTMo0 W0B$loإXe_40Vr )NX)>GRnHXZeNPB)A"Z:JV==>DwGٗ%!VQEEeeI8! ks[5Z,ĝ6+lYƓpQԄ'1tIO3a0bSr1?><?87Yyy4M#qie"X wNZ~yaj+g|{6E&mB);#t[%IY}7ib3>ﹼEΐp3zu ⿰a+O|s0m;Zx6 ea4*h>w]ŗ!*ġg,N\o8cq7Y`d/߉8IQFMah. cۂzB'}PK/O3PKy.FAangular-1.3.9/docs/examples/example-input-directive/manifest.jsonK н ] *k!1rfܓRlDXఱԔJgcZ%HqRr2KjjrئPK \jPKy.FAangular-1.3.9/docs/examples/example-input-directive/protractor.js͕ݎ0)@\!dbKBݺMH-\V33qGoj4,ClL't^V՛]*jQ:Rijs %=_Xzl&f=}2Sڶh&ΓK&-:jVĢ[T d)liVa7YTU5,ɈPEsqWa MpnyG#i|EHXv)+ zi l0F.˖*N_'/eDRo p߅q| !Ĉ۪?1IB E;?3~oH ]Fla_ :),PKBPKy.FAangular-1.3.9/docs/examples/example-location-hashbang-mode/app.jseS=o0+.RMO]lAѢY:(dHC%mZ:̑/^Ww5)qr?xgrSh13I9svjO[g?OMXO|X8,r=d*Wޥ?PKSKPKy.FIangular-1.3.9/docs/examples/example-location-hashbang-mode/fakeBrowser.jsmAO shRT'-C6]-4H(㤸 Chj8hzǻ#7U%GƎ37RXǢ78vpPMlx Jl1Cx0t{2M',oR %"S.pMj4RCY ó=aNh{XV;\.p.ObMgU*Kڒn-1[noPK{} PKy.FKangular-1.3.9/docs/examples/example-location-hashbang-mode/index-debug.htmlTn SCzVfSavM>|DYy+oG^s@6Ū, GNj cr LOFtlQ?,aukȳwi[pip$Yz}/G*b;q%ETo:`p1%&c";cB<3 L]p-!f~,ڻ㔋W;(4"%}%G_Sδ2v>D+({\8 &PHߒM>uX% >^ iuӺ'"VIBh^0D4'VSL5q84ԺSQM?9[!c^EP)@))ޙKOs #%y-w\Sk[ڮR)CԇPK;"hPKy.FLangular-1.3.9/docs/examples/example-location-hashbang-mode/index-jquery.htmlTMo ﯠ`TU%0Ƴk'lVNtWJzfx308٘f62̀w-0&gL!bW:4%fo5 1NCmFcOl1fD$Q'x hSդ^ˢ}\IQJ DB^ u4x#wxixscF*pd;})8c0t"퟽wPBJ4?˛42-+.9̧Ϭ#=챟s"7[H&]LDJ]@R$H|AD/мaVrjף%ulXxJ)ƀ;7!C^K#z(vSi ]?RbJQSD-;5W'[8K#KlYlv\k`d|R%\]BO(ooPK˖|ؿPKy.FPangular-1.3.9/docs/examples/example-location-hashbang-mode/index-production.htmln lTUWJ՞zl` 6[ Hv#;j#' 31;dz洘aSl@PÎnL"uZH:aYð5IHf8l:QdAQA\8¹ ױn)6a c/e.ڶȇNTZ9wTVD]7:ttϯQc^Φk]IףݔH89}''h68jzT[aiT+؆@=E Ah6A9T pMӔ z*SNI6

    zY_\H3x4`bA% -j nَXRig rX PUwP!pp2P'(pT  raaJhmu4rm*+|ZR6zca}uRǻؚۥ%r]T\RPD^@ǖ}t[?ǻT]J:~-=/$nx*&[QFϏÚO5Eqwh;Ϯ HnَaA*ez\A/֮Ȫj/6{ ˟%"g;d8Ϧd}:VԔ E`֚m2˕%Ԯ1mGݞwC̲l[r][:)&sPk<6 -n99kR3ȑ&hjhy?-LT~oR<ҞώθLkpNxArzNCXXbB[jUz$߶F܂sm5wkl k+zthtxdx@?fl+=z UKm0a j הϣ ;^S$RPI SY\J˒lH}Mbu*d{=j L)l\n 7&lvLYߍŠ}^ohw:5A)PmthJz:(L!7UiA8$ <`ӕe^8&:`f㥟tmo)^1@4| ᛌ4hPҕ 8drOt݊j]yVa8RUZfd?{1ߞoFL&SU^`'ġ hX-ad|d`PjPZJ~0ͯ}ϐ%f<0t@@9!`2!xRywI7L> 5a8H&S9*VĈ wI|ݹt* dV%D @%ߝj)5O3.H>WHӅ 4ؓv'}kП3b۵Ѻ|h͏-` etteo@J٦mNC4՟3FVgDJQmOrHE^CԖ)~9WpE0jYNx.:2-ae +߮*]`LI*NZ[T&8z;8^oaa[ʬßip Z*m {klp4]u^LGO6R'ٷq4H88c 6;jM1WL/ZVYP Ǵ.B]T^`oo`ݪ&1Q0$,Ftip(k'W6kP},~0E5zaTtR7Ġ,zwnեpTa7&O(/9qAhnx7tgso˝%SI;q:!ql? t }&˝!x`%Id`mvWpݑ(R$BS*"W,^Y!43?91`FEjB@ HMc{Cj`7X'G?+jpA^5uu`USG6mB3s5r6b)Q2Hn(dx5H$iP^ٛF/ kv;uȂC_l# I#pǷ-* "$l('>ld&۰u.Oc4XpK`ɰWx2|a|@~)G֫ha1T :߻j kP%(i in2n[( *He'#v pjþ+A#yMe8|H"EnYdz/$b*Ɩ#Õ(@ g `QEהȸB)|9-DU]t?K4=b[4M~K#+㼁G٪Ž !,fج=ڞv'bR"A!ќlO0Skv }`E"2M$˹阬aJ{"y:lmT[Үa}0bzhmߴr /k[c2y)R^ "\|f?GmCK d >.Q< b?M1sGxJHTi}8+Y0- #uìL[&k3k?AxYI)@I%q=Rw[{ȑXx jMi h A h/IN&|Yq5~vyu OuLEp8 35&3>{Z~kl`i[;[03LltGPI51 `'r1&iՊ ;#fW ] nTy_ѓؠDA:Y_&Y"C*`rg;)4e4E*NJZ: C;k3ƥ2ecD>S<C2m_ѭ=5.Nk7klaRJlB+~Цt_֩ ۀO01q3ͱa}ɹ8_w(3Mn\_rNԏJN$A;ɔS;;GrQB2XAV\v2*FÕ@0_!>UEO.f\v\>sw9zê_7`aqvCLkhQPI%јD?nhzzm B8kN& r!}pJ9L<&trۗt, ¢=`[ZVvŧ)B 椿-Qsݛ/㱅xn\wj*roAy3D@ٓV N{]/yOH U7=6ek  X) (|2'1oRΕB>LՉtVeQ4˥sMˆn*Mn/ԙ>.>Wm@;I$6uhvUh݇1|X-q8ޖ-{ Kirfc/U1TMϋy-,&v$@bTupi0rsozBX/f~ r,I^& a8l6 apH}Rkx:8%&{/ A~m %ŪҞT* E=xV`ɿmh}˛ISVB$ǷXuAptk 3$@ 5:-BhNf:+z]]S_srY|1;i`;kP\n,R bw?@D|2Kw&|9 z;FdRiz nyGoWA@)X\!K U睬Fsuyav^(]ڇ~*#Y/36Tp:=o  77kSgN|F&-wۿzc񻭫(+^-V+mڠ;brh~;'IyZ>mHY)ki~n:3Py^:}8.*UHRҩ}&( =Jz+n}gFk zڈ*0?Z5iy/or:z5Ҵ|%7bm=FK u8B y8+mگ5rJ/94no l}{g*#h|Q>9n<5AMDoE*:ދ3y/5j Vnx;kn} UĨRf2I\{ǿN^-dU=ɣ#chS\^,4jYY% l;GUs}?ed8?avHi܎CULHi>B?g]ԹfuLOIm V9/j[E3VtF/r6UHV05T`uvJ yI͠㱣6ղiۖn>vҕ_2p?zAXK̐j2( PE~^"EH5+QACYÃv.vs ˥ˣSf>+v*r+ɔǝ70$dIk+_$ [jzcFPKhNR2kfj K IuI8|#9f˜.(d\nEvZU1k.[{ WByaϦ %,H&T?J:+eMzKGU)~P.LӘok 9YRs(?W#9#q{55X8A9;alvpfZ-MVd桒ƜY˶zr17q*$SW)"axz줛qP+1v#I,vy%@zޡU5Ӡ|Is2l 0٘K9q2~픵2p-"#o9z%$Vaj.ꗡݬnH=+%%J昝g`xx1mwg 7 ýK.t\hLp55H/dk~gXȪ3))]Qf@~p Ms6OL;Q`@8*Wq`S'{}$y)[ r &QtGNv]>˔BtǯU)=Je^zqGiwrO*"z"}E7\*揃Oys#0ʖ*sx<̍-$f^c#vvm8{Myi 4Onߊ3٠5% tpNQ؟[QPTg7PZtỹJJgl|/b9FʁFex{!q5%\,e)Vws[Tg߅^|HXSڑ T_=F)(=t'[M@Qf<-0@+l'\Ӄ'ޏ,nʱD,|k.{'Wvn9ËլW')Xt}dԔr(J|o c W/+- ^吀@ː YQǹ}ty>3a+Ft'|g|)*f/w?*0~Xˢuwln h격:5ȚqP}1rqʔ[`F*gZt\gjU/"ԲxZ:g勈7WU?6=Ur\7Њ'84<LO5ǭ͍exXLxq쟺nbx\pS!A9󍼽$!ǎ<9:(Ś7Do)$pJb*3\mrTO72AKrOhڪz'X(lߒ8Py k{*i XF$*cצirH)zš_q* zV};HUՀh}phtM=OpNԱCak-Pwz &5BN]V | g3_4D,<-5Lmr&QlФdtHZ5!^l>K#tyH])i+{x_mߟ؟_E:v%fқsm% x0OJA3q ,|L'-ɔK!Rl r48 4w(OeD4w=TE~]%wgb/UOuпt~[6'\v j.n2ߥ\̺ 3KPv -H#鞣HE;=F6fI މ!q®y8\.̐uhxeog[9ٯwv]vT9pڞH:$`R=ƸLs%o'a^hɍיi&G.?V>(*I`k503 uCzQi.}-+///?>(ZLqE |j)YN k-Ξ 8prp AzNmgsJNdv ʂfVzPcrEA25S rC#"Ѻ#Wwl7&,V#*^#ݳ {זt bpXbYXEDysu.U{z <99E fQoz6|`lQ@G Ye~RrQDŽBnv.4ǑfM~U@žR_sMc: .E}e%-vaь!c*hn9(?(ĉ"h&wS-qXh_&7k󚲘.ȿU'ß5gyQbOO܍}2LUB #dWk*&r2>-QKBJn޲x}Cxg7Mx2꽊YN=uUHe%Pvf縳9i!]AU.|Y>3p]B%ܦwn~\* f_UDIPb[÷}P%cs p[>RӧXw-xd^0+c iL`&aӷЖ>zV ,xƈTLx3h|S?(Im-Re(qSƠ}hjuGZ:2&3Hn..7P\_ɫ;ks6K}YN٢Y,uuϤH^`b/wz %PgTrH `'}CFEBކVIwY\j|h La[=E24Eyi :k]})L)yDI=. R"tPl/0p|,];V"1_cNK-zt>@"ccA~o9}9$xd>!ڝ"-dd#Ʋ&I4s/R ב* , P$!?e,amZŁsr1Pßoe%֣_ú'z-A ]:_ bEcbƞ1ԡtb֍j`*j V(>E T% S V1ѮbX#hurnׄep| \s'^Qy&6!`L2Hs(sv1Zus܈pЖPr6%o-ttml-9 q_&f)ׇU峭K---nNȎ\knsށPS pM-{jm*j(L7@[!f- 9y{ӏRjz3 L6ȕZ&.?rss?(L=goZ?~spx)vU0=J I:t'|: %dT8˼?=Nٿ2Wⶌse#;!?oS #"~ !OuѶPKn PKy.F1angular-1.3.9/docs/img/guide/concepts-runtime.png\{P\& ݝ]Bpw݂޼[;USs9}ƆVP+aoN 0a Yfj۫:W  jWpeYehkS1Ykp}CPN07gNd:]rAQCP!da چ*lR@Jg}}",x<<|jOVL9~-GVFEIߗiJ1oǫfpjfWfӉ >BJaD$^\y%-=JO8ȗ%1Kg=r_^*]F+>.%.듣4wk q;;sY||[E|#]**e54?1tPE!5Pkfx/W~\ҷ&Y#yqX!K}o jy|~Q'__Ye8CFQ_ Ӵviu:RZd.u-o]҇.r?j-G ]'73#d%2\lJHAG*IaJ`^!I^jxDSoG0JŲY |/W<ufff1:E*BBB4 ~Vğ!RQ|QJV+###đH59Z[qX(Ie05b AD nRr6+wCI<)][]Ao'''oM旛(!P+ϻ_\CY- _. k Ux26Y9/|=1#hqZ $/Uic;/_NU=~hwAs :c(DkSudjŽ4Vđ;2v4"aD'%.~C,v3_8Ѥ$${5X jM'zťdDPE޲Vݛ 22v&ݬK\b4yZ&:$ 6]-WL^OPP FֆShpb&x/J-?+5< {{n YnCSSќNqqif-;_a\l[ 0^k>Z[L<-M˃+.iu_O_`gy oИ '38Z_@?&Zgv'!|ML{ZbN84?yo>jѡY3D w%ozT׆u?zgK9튧M&(̊SbgQT1{%+kΖ//m ѽrb++*bGӘƒhݮtA7~A 1'd$P`8?rSB<^g<4<|wӫ1(ѝf:I`u ?|w5XN[Rz!*lZI\c'/wS|\go?LeqytB!"X(㞄m2 hv|Btt=dp%VmHU-=-0!!X(ΟGa>k.e2ܮ-Y:D(((i5׷J]>FC@Ldr'Ѩ"5a8Lzsr)rV3ddTK GlV6CܸewuoЎA*$y>M:KTʗ?S= }}4-yuݔB[ vjs0(3"Ko'\*69u_: $:%%faRbH } QcZksyrqXLEjv !=ȴCFX<^QUKz`ζ\{|lR\*((  nW[*~q;! A0@& }jRTTp9Ml"jvqn>YgU7"& ׊ZzVG^r9(cLKX!UFe38dftO駃}d1>T/"'Ud>lk\9VhL ng÷o,{. c& sمFZoج'~lX-> L<˖5IϏ@X=`b^,$V[򽡨Nt:MBI4`~}EP% =׃qoD7۶O x-Ppb̺օx~5F &p9EBMM]Xa)دPxGGV 5>_a}NAsZ} }o_-Vxatr&ةw ^_@v|rIv)~g,ڡbb6DXz jHa#4?kHzv[E6@;@706V&~yw笨ȞBphu~I synmT8f%ӿ0#$4R o;;3A[+E.%-P&H*lLLM RZ- 0dJh:%Mpjj(Iۉ׳HMt-J,+r'$Ȧig!W&5[_ߪ,sFMU%EGGTmaM@XtC5zt:SWr%2&ucHkEQ.I1@ eGA`8&3̓ [Ջԕs|Ny#xj~*b"vG\H{RH߾} k0Ziм >|.g5]AJt^3IqR]Ĉ'||| ZT&0RRR ɗ`ؑvM&CcShft-ct7ÛX[mBjkol G~׉QAI`9\"$\XL-J*4- %L(<HKIW>*">/BsSR0䳘Sj(N[jL* WV߯rq9J h?4#7PdzbwW$&tXw?2>`NNIc,ɟs vqrӱpy4d7@kd>}&)S]?Xrtt7}irwAuMNўZ% e-PT{:H`'~)kx @r{\X&qSuXE(%*JNUy/jSݜ\WWc60pJB꬏@f٥\Էρ('$Ol@FH~1 3-2AQYktOntUY:YÃ80òt*ˠچEbJo-xzfuS$=v((M1JeE=3+ ok0MWnod J!+%3^ߴWhb~Fw{i8wpߎd$G S!!AxxcHI7FE8TT'ƦeZ)ĦNvh@DQ;VvB4KtqtN2~ t:\2 9_1PLj^)W%ϝ yІx-NQ&\ӿzuEQ~uze6 9hQ:/N>ffd :+ j6n3WHMOMf~WYAJJޡ {P2⡪Xp=!zWydqҨԂ~iPI?dw:_ݣ<y} kh=/ 2;uh-|os!QR. B+p:j/}M62L&V˸>6G<RD=5enM"J`M+$)p۹ n+̦͟&LL '߳pUMT<;_, 5щ&)bv^0_6_w}a-Hq!(>.7ϧ]nfUgbՃ9 at"5 AQ|ߦjKKc kZ ~>V!uĽo-xeFx|'jƞ[X6>Z(/~!q G@R*pgoO&*]5P(-boe%}GcLTc$m]:Ǽ].lx'S;& ^x1sFB2d:hYJu -^JP^VVc>煥P,FZA=ۑ׋*͇#-#"* ;2*"9D߫ѷga4,$G/rUSv$"OކҌG,f%UV w<& Cvޝ kSFY]_ui|0DHCj7ۛa4{zV" \%%0i8qڼ_d o#+- htaQϯ-|?\]J56:$8c>eVN""kmq qyJTLJNXqٜ.ٽ%EWM7i 9-``-XoH621 &Gpz ^'ynLgsKxtXs>̩vMq{:E,Ld"SuãP8Cogg X49"lޚ`4{w%#^D}}UG劊swrUM}~)Ps:AGL;4%%Oeny31.,5 ZRI q@\)+8ahDzRCԲ+rzk3/xF,kumJ1L=Z9u?yIIĞ:G`9C<7CZC"IDBJu7f:644YwOKj=KoJ [`p~ F8񜈷w[)Zd~9TlPtck˅bZ#|a=ES).'$£#oL_%[B׋OiL銧7 4UB(h,/6r݌>%Hm!Q:zT;w ̦2Tnatz`KZ^wd#&󼍅6~tXX]S8ܰE5"Lj~]!< Z#SRPg ", LJ1Լp1̾yӆ7|*-e%.6sz?q~@jDa Zkf}b $_li>+=# mf6nšQPT2cD,.;.8r+ºU=Ln[)-'ǔ @ԗqpj9JFmN:x΍ZFIMI'ߗ߉%m_~qee*בw_OI5$l<s%rX;f#b;~3n A|Zm@Ox=_R1P~ǽɍrBc5NA"4I۰Vܰ FHLK3r3#33O>ݰhh$ !pQ?xՒдNd:Tpbt6;> BiҰbUԆnt^Z~.u{% D-fsAKOapÝ*i\{ځ!Η+벡rk 2O{@C]kLZeseQ->3:^O5kko l܂(W2*IM-tH8&}/S@%m6V~pVi"xϣkc~A%!!Få q3҃&jÀn, DJ5 _8;Mm-9"cZHn5*9RQť~[ΨR >xD9D tr8S ]kCh4R]ϕ/4IR%ww :heH Nnd=Z~E2d B$|Gy+ARcPjM?nсk* M/ %C\2ԥV*—?bVD 5qZ<`i,_(UƧls)UEh/%+jaG`JOӐ>tC0A|*bJASX @7Q/s Inucsa׋(2F74V*UwPvS#z}Ov;ԟYއ9Xcȗ< ^ԒT4bcF5Ig pF30[l :uR#/վJt!be??&-fj,-".BCw1㔠3D Yi7[YkߖEx"eFiym% ?^Sl7} C/ՔMA1F{ě|A.8-8nW|(X}<3RTb"/?nooY#f0nJ0o1F 3˳!yG!<44wF3E}(4&w4ޢV$w[7_&ff{nwb>,Liy=>£\NE?>A*:)r|4;9&z<w?^)ckkaaQ{ZF^rlfT@0rjuVgyX 2!c æZHFL[4 ND{#dAX,/o3ݫAEN̟OƐmT9׋KoAc>oAiTT"ǠV ,@,cw彾W쀵?.joԋ\1B p&{(~K<{zer-"O\uZoGQe5ddeϏsH"v o(w% B!Q{ hʪH LLLay%#P6Wm!2Yqe-}HGl1ӟ9Gip0Yspj)%3_},/6yxx0qQ>gggsP!$^a|Do:ݗB;D,2pGoMS9aI:F92g#OCn-؁B"b׼d0f cvݘXG5ljkI8\WT8DnE:>ljx2g#@…FxrEu-KkwT{ȠBsUL}3𻹅[[O^n֩F@Ct%|xligJmtE=B%MpJl%V>gdegFBG~o !ԿR"VJSJ}+uY?=_>|sPeP_ҒvBd9HBz7-޾rD7\ޔ ']H6 K,77|}MŠs7};P>YJ<*@5 $O9>R#:H;Cgă1hvG~k#fLҨ W36^}w{A0yV2lzN,Th:e޺X2muZmMdFˍ(e /Ɍt&Yi`'u>'sb/`%ݟ:}j۳ )`llDOXP!72F n \K}P)d56PL@|Չɳ+h_3?(B#zI}1{pk@`qMbbt-|)}ŇLn1`Nre Ns@Uad|ՒPDh򃉹;|Nۂ}ОK;>>~_^yoW.\n@ɤArm?NP^`$,5\\6{11}%V4~\@Reli|nO;{ B*6mz@6`7Nnή8]顦_nEAZ35ʲ 3TĚ)' \) ぐ4뭖hdk6L&G(nBIC )ĭ= h#s:tߵ(:GX9l%:?4*u٩ JNY 9)u׼oxs%ZNk>L^~@X}Ew|}k4!&6|v6εD䲚{ÜE9o] Db6:_ޣ?/O5mmު}ӳQBrAŝHC}'^eX:~a>g,ffZ lB  /zm QFUhKB"q 9~O+r?S{J?QG:0\S%|T!z>qgS8.AW`yy'W`X?(rn vƼo\fw  >Tޞ2ދvr1'g\@;KNM= LY Zqii [8qYty&D)MmmES+޷.rE+]J'Z>ޠ@ͷ=ș4z&>XGhut 5=ժAKwy,bw;+]v},.&)5gj܍ v s:,3=3 ҁ͖QFj:#^Ac~6KZ:D0!Kl:Uga+ MGL~p9>2ݐT^&ϗsNWU<6&-ƚlxd3:~TL@t bǻngMۗi565uhcs8~E2nPB5d*)z ƞX,5+c:IT묟pyΖI|}Өݞ&pSFc)nIU@!?g0VJ%eGwX, +b,q+ !w]:NUr EIe&{ihP ~XZn-A0d͘?2#wVpXhA°'! X|+U,a׃%$!RI5Xkỻ;FJس~NHzi+׬kվ *?8ZE$O~:m]BB ۾i/5V߾Iɭ Y dD9*BپD>.* r]N< f~k* UzJ{b.q|~UeM7T:ܚ $<,wi+(mRWt z  RҴry'ҍ`<+Hb0#Q$sSeSW],Fʠ&4m)͏ p ێC/WF>hSwS{UՌ =D>M<&RʲzϚF=EM?,3M9h g`bц+ބ7қ_`k(70q#EOx<}" h3OP6R-<$0cDMHHMX 7 sdduf.^p1 V3>3]:"+Qn_4"Jn}B#78N598i`p/rw6_7,5;&b:)w7䖺ZeMaƧL%(n*NGr`+5r"$څG3ɾp{𼚫ք˓UE.^N_ %ա>uI% "TN("{z4n ?~fQrأ˅'br1n)?>>>m>s˅`9Ko t;X2< Kc@}&S]?Qok?`4-#$)D:9<f@d*+9 20 8b'X G  2aPnF-G@t\?3"뛝]A D;|% O))U@&̶ !daCKE9V1Ea,a71W4↷  *Y>NtRsm618E#=raI?:< t)h;dݢ:O+u#OgFJkキ7&L\|\?|5-\*Ϳ>mEWC׶7yփoQY˄D % BejV[B*Z&?`X?y]-5*e/T f;wT]+c.7XlR00H6pNgYM1Rj?gg.1ޯ\Bs%W[N n,45(Ng{:]bwmaz~]|9r3JjzF19( ź8GUWSh0>A;w^0H[F| 7]zab %p --joZT\777*ksg68{ Qsj(6ޑ M:bS3.ȳ/7 {L9 2YDcc/}m9{4 aː'5fK΁Q`M&*\QK \D2 d3l/*0K:`רHEфPZvy.f&eQd,2_wʇٰƯLt<ݳCCaPq=H\gznYvN}f &/5lB]bZ)1L}>33V"IT&\cx2b3nP_V5 mtIYyyܑ 7~Of>z"?ZeqH6O+銮6'\卥ves?9!anC 3!krTMѝ-03 y>Zhu_Xpʫ#>f)fdp ݘvML-:HaT1)2|LZ =#<>>:/wպQRuB쎯Nզld5| gvdF\%oFE B8`^~e `v++%i,|z3q%%!@j /eTv#:GEe<҅ȓ^,t^:J"3"Uk£Ҕ)_h0bbHjru$qY_=T/+\]LvH-nْ Mto(3]bA=4 2``;*SS߱[[9&;{n"nD Z-uC:=R\\*zdV+1'NΤ|j0|"Iťo^8egXX"VPld (I2BIS] mmyًu%S4.oJy$IMv;XW.%Vjγ+̲F7ؖW5? H{S,^[ .+֘SSU U~U|2e>`, lف£H!JuS"ofO^Fbmq: s%h" /K=ٖ[Zvj>࣮4_F5nKn Om@J,:_?L+i='Bb) '&:椅"KS]#_ܺ)!`+hܓ(D׃N r !HR( .mdzD>sʰ)AZ(kْ ^"vzҍ8;yXz ~6L4Ž 2 kIB9q}UlLr:22اzs~~58RYIG?{n V3RJL2jkӏ̧9j3ֳ!8cݻ8vu~!H 񅜝_HEJk@l;?Qkttft]UHBȥF0Onay=h^}Mes/Qv#ړʈW[R$w|V˔hNI!Rlfń_{T_t(>*+3 >֙ +@{:޿E~Y!cs@wR?e=;y$BHh<4qXiI4KyhlpP`u'OB9xuv*Ijh?mۥHnhBp %r"ޔx+OOӓ`nU )?Y($QX]}11 ,M4v,)ghnƥkC̀XJ+Pu9,HKK/ ,HV#+)12 3x`hD!d&!6&ⴷIשjf䦫Ԁ -@30 %Ų:fSz3FzqsŮ5[gJg;O<'I,d&SE8%{۞t )>UKg4OכJ!$XN ekbO3$Jg/ϝܳ!mF9_J_ Flܴ XA(d3 ii+pӤuKO1PS)c|$Z ET~Kz8fw;QNd؟`Dh3m$8TV'f Y@j=q`OMO:5B*"g^Dapjsr(p=*, ^ a09 B6sLgv})&3LJxDSjb 3,i1:Y|bq>,`| ׯ3Q;k(m0%|+ɵy*nҩt#4HttHwwHIKtww*)!m3sϳkj(6VɕmNo1{'"dntB#wg Rh\ǸBYjopFnt^7=<<䲤+*(nUzYs|А\3ժ2zlR_RJ&" pX79 L2jsXwww $T[%qJ|!-Cyqk碢ޞ܍``q!;>..\|B=w褎 YhLP>.o g6 F70bqnc찵Gl=3ĎruXDlj/ߩBr " lfP7˓J{E~& 'y \ä ))Ivu3lId Jb~`{r: ߈x~S]Ph9i.Itِ k>͑Q~ќ*l6: #7t!F|-;Ä\Ž}ɞ+b+jhk03Ga1C4>"T_M>O[g=/&A@p_[DqqTܟꊹð'5t%%o2.@r#ˢVzafR89:U+)!ܙ+o6":G۞k $3{34ݑoEI]_Q*wPr#dFCXrķ8=mZ>|&j>K?C78Ǽ{왪쬻eթW^`α풓hLߘ!FUQM-nw$+ <,!gZy*!On&2/ 99) =fq@e'W vޅSGf?o?\v7Dgؖ5]6 }lFMLD'%xR59ucj+7Qd'E-(qϬFB:OnDHSCDPXb8=oOQQ#H]@˛RB ZX fMD_ybf!ȜvWK='9ӕYXsA|Diа۪3ߺW߿Qu[S7:N9#qb-zbZ@UgH(‹ NürH!I2mn# BhwdH1!䥉IljQH·⑎/Ճ}Jj \[\e\xE~|{Ppt:)IG X<ׄ$߅aepyW, 犎Pq{#;l v'֝pԆ߷p{ !M섟?Xm,G]?K.U+i9jd)T]*'թkaow $q;&**ӓZG?Œ$^U.F(L%t"~!3WIΎ;k<,6g:3Թrqώq׳XXw V ht( r w#%p|LtȎPSnF$$$O;n ycho <+<%$ 32Fx9,7Wu@9醟}hH26BN"?.|lXPDdՌs2[oM|zC̒pDLef+T9~%=iTmq1~B`(kzk=UA( Ew m辩@qs)[.s |LN kw]ݲ />ԱR Hsr۔.z:O:,,l\bmoiwt_K)>dKof9'M55eY=;!AO㞎[>* %?z|zǙ!&~GK"ڿnWWŇ;hc5&;;X֜ST?}ĀW[>ws8\ДmLn&I)Sm: S`eUի:wHNKۀ~\+1<e$$ xzLɒ7зӺlls!)3Bs$A_(+ @MI#""̣TB4nQV?OCcIz ʮ `dgƥ/-cP]CC8}6SjuT-X';+Rh>uiOgC<4ku3O6SAL,.[۞?gNer kkk{@\)#X 2&Kb@SOhX˶N]kiIsε)B~.PBdWs>9amlq\&=<&p9m4ooo)9UX瓸 }f1y♌,ؕSj~Ud3?fg *GajL]d__KĖsh_E|uB|g tUC\pt9ykIApoƜw D2[ZZz`d.v0 ZNCh D1|+v2mm?MQ!)b~+a=G63/*N":tt]wkcY',նPT2+Ź GWͯn=#"IZqZ_88Q抇23S顿xF*RԿ-:yƎQYmB7m)[ɲsǴ.Jˏv7ޛHu%`T}wص֯E{~2-k-OmQ0 (5* iZߨZEcBLZ BMFwf&Ҫct1h&2xh}&vxBg3QFidDg4V}l{ C>‘${:6;݁ˆ',#JOu@'[̜E9@mv=ar]-bDu-1./q@zYحf[;6zC(AHル 1 F 0u+Ȏ,ՕM#2>8BjCX,'WB~ WFFkZpRLe¶g - a ͉_OKJo3A ~ 1Q/WH+8Iq XVx0o,4*hƧB0G;X#|̿4ǿ1%t/*KMxywH]Td`io;s9UC,hrX}(+%5/3])+,J$N;G6<[;C/Sf T;{xT%_.բԱ[rШŠbS+k+FڗYQY;y6[RW,WV9R] ,81IaA 3 7/4Fԡv-^'Z@]]w]E۳],v?xBlbOb3OJxݭJJ qB^s =4ET`oܞGL#c%ttRf-y*/"?!vMP͵y_ʬˉklc WGr g uO٦BT7"D+e+aXt^Xe3Pp;;4k/SFWzGGR1[[<x!;䖖C*ᅹdÄzZp&n6VVrjwUTD)CD,6<&[xn@bb|z-wѭsPH sBOMq;]pu>rY?=ɳ9*)pZpK^FtIXo:umukTrp QU~IpŜx~ltv!D /]ۜ@8Bk4o~A!؋^= fRbNv\TTl= DM,Ÿ>}*Y"˵pl}MkG4$5rJ 6Cٌbu%o Z>1g#Cl1foՎpn>2`>2@wvU {+ZՁ)1 MB3=bnll>ܿ`gobaIresC8[/`A.{h":(o{w"4ݛ8W|='KmPvm^:ݶgu0">&-b|kN7Yajlj7ˮ$̺- ێp} HNwV\qAd[~3ߡ[UdK޴ I<6pA=}.25.^׎cEN!C 2%YT*Tz9Fw)QHϮmհ P2CfY=rd$ؠ`Xx=ˉLM] *Vr>U& 7UJTUaĢw?OVQ30@`$#M|tnTT,au H\&fE ;EIPĢ^Φhf{Te@0W0ae_Y ng1RҴ7&F0&y_@4ٿ{8nq ~SQPDӣ̎"PdA` 54 I)Ɉ>Q|חzVP`#=SYz5]AS3d8~lbM9xsMAE+2چ%){R /NSp}*6 5l7ApGƀ,,D^~T.7*2r6e5=̻ݻ_.ଏˆ7~Ct7\2e!SIJk8s bI=qڣ Xeʔg,Wzc^GD>5%k5g*oSs,;o%! :\|HS~WD6zG0(bqqEj9}&ȻYd}i1r:oUm'}Hpb2]z;fq0+~G{TzSXn'*vs$q+ݭwllUI}9Wisz Th-~/֊qf0z_'χ$xLLԃ@z^jO*N! UR p(5, ]44%[ &@($ܱ+5 Tێbޣv _Aׯ} &i(*,NG*=D=<_$Wʀvx >z~\>/4B>>ImNGd7 9m{))/ <\jaZjlDZF'-XXERq$>hAqqDd:G4` ̨Z+n;Vu| JjC_Pe`)ft@zm?~m^PPdE$+uDĊ?Zfߠ_-)5oQJ֓S[&*yk@a/#ۼ"jLl,VMWUs33:ɟȬEj) I 3BFj Lׄ]<\NP S-n /XQJ~D(PN[P^^hBCv<@>ݻZѵzJli@1'{gjoNڃZ[< <CYg 1{tVǸqN/pڒgp%00PRHe[.uV >=CFHD[Lќ^ w*1a\\f).Z*2Vf43mKwpZ2H9>>Z%:\op]4./9Ʉá(,.I *3݀hk蠤ƣX]odfX F',p!.t} b³$׌勻%0A/!ۣ_=ԥS>{g&tx̬pٟ{$}V.?ĺo֏3ss;/ _dO8rrsZ?H L,ߞB'X"UUH`jP 1 `FZcN`_^ȇa]@].`0.;8_]lm Mmixk"q 9j85kqk*#NƗ%qCE@AXV"h^kkxkѕhFeP%<լ婶,쯹: ތ[h+#AׂP; 2?t [(ul@Eވތڵع{.ڻU3I==S#UtѯQY(haȠđ"C.Zd E~b(Geq0r%gcf,kƩ;(M,ݪ+2NzEvBO 7>cdXDp97[F88Kջ&UAݛ9ix# jre6bs `ՠ}se-\\2@v%`7 dJ>,lR|r=k"?Z5TFkE-c[@lՁ} hEI u6`YZ k~҂̸iS#SN|Waa;&Y,,] ^Yӯy-c_ըCi*2]1_,@KB@@Ta66n}~'jK#_[G)E1:VWdԭ]GMR?}I IK c8ͫ,)alZ@pW̴^]DL^6u4OCm*(FlnԄhi}$dJ4:e >W=\88%ǵ8WDRJJHț)Ium,v J/o5sBFSzX]͛9®=Uh<H@`HLj"L% X}\D`X-OK9ގNMJ"]ё˽,em-_2}GA!N қg-_6qqqV8֜Z? !흙P{v+:Щz0HJwO;PG4̝^3PP@KpY%OoJGT)}Ae$5{J6f?2 $ˣ ̪79k_#~շliY )Pe7fJ%JZ{pksc}K5M;!Pbƥ`=١Kzzl2?vB?@I5gCA?f'nCusGTLŝk&W)xJ_*2?FWQ5:A@[JgD7h`lS:Rs47: 8ȳ:BBXD Y+)Qpա6Xpܛ߭p?S'b, B^cc-Q]V<-r/I-# l(. #VaMJ6rNs_Vr#8Zmh+#`u> ^6 [5`cr*b]9fnԞxa}s Sr ĵ_r|kl* i/[WvMxi$rp16a2dgzC(=?y&P=s0S#L59pMPlC&:w+Ebҝ\[[/<%zGeᩩ8',젃0@[Wyz{%]IaI*P^| Ӑ{vڰu6?0Q/`å&Niط$;7E(>b VߧzS#q yhO).4o|Y7o!RLAt4Z#gX/= =G))lDL%6YHyMnM#iԲ+a+oFr>nA) m[< ׺b)$*lKwAcͮjYFJ`I'&򪵗^eXQZOSF8a 9=L-2lX3>ȧtVGf.}ջMp)u<)Uw/~~Iz즪JVIxF R$L'ͣ\&CI;~"^J ߨ;BNQW-M;\:xzkڍ g{H\H_7& 38jIGG"Ú=À1F8J*bEU Jx'2s.3x=-$Wpp߶}FY%%78>a|!`zȮe~|oTr |Oo p --ph Q{W Ԧ\fQ"q4_,3{ m91rQ!˖(Noۈe(I>~t;E96!!좭ձ jK4,D4Re[]m+3}U磯--mwkH[vZ=MVn@;>/TuwGs KlHT)0r۞mNqxy'ou}y̲^l^5_d+FSnPQ67o';3SE6Y bsAr>> 1:@cIQf" cay} A&@1L?Cf8 39_[d<փݪ˜3G9ANz1J"&6s'J\0ϮBB'EZ{0fZ*Fn:TAAyd3 fu/ cyhB~#{kk]%{퇅MrEM_RRPPQPPV@T pWV@2S[V4o"4+mVBx@/T9ٽ94QЮ9 nM:l,DS>sSDXSQE$%PR3@7 h1. O n ckiUŬm ñ sTW/>|5 Nbp /jWwU?[( 50S=Y'"@[zJ5bh̀N[;.A.YVK$IgbBQO?`EyV (߽))u2=!?ǬUֺ Ik$(+m$рk~[0uO?.b<5E-BE;\r8-0? HmCo&WTMm0iv>'E->NфÄq s+@mg̓A¤M'`?A-  gFR(r0ϢPMkݯRDx_1k5s"6ޅ<UNY\sAʙʳ2Te8"b {[KF7?Lp*z\-?\]]>{u@4 ,s3ilvYMA=j}=:L::+OL> `h~XGx@֥z{)ڻ:؈a ߂."y腵0)J3-#2/ոm}W#{|iY;&:.?2kDžjrc@)?$ߜ^ywI@N[瀀wG 5y#CC4>W OyqG,՞//x*nL6 &?ȈA,Lֲt†ⓨѓ֠|ݔ6DLlY`Z\kuF*W碂'%amLhX1K +J'P,+q@ry!qK >O<%OgWJjcó씞!'S8,\ur"Nk7?E#U5= bP˿?zb\Hz30RtRMj)w24Q{ne4vt1&XʷjOOQ kQW-4aj퓓ʍC@+#kyb:^l^S! @JDO``³& =&'E;! |pJ3 DԊ?TyZr޺rɑ9Nfmrʺ#Y愃=p@Z)Kk,iye%lrd 6r*D@qŽA bcѥ@NX_jഃB)6GRV͚W]~CA[*G W= 8?G,H GD~mvJ؞ACB=7u2͔$CHWWԆx=a(Ĺu4v~jMYEDHMP>$ `ty(ƽ!(pS6|ⰰߤ~vqz|Fܿ&-- |XIJn)#i ('v|g=w@8ZD K2JO~m%mRf 'Ы]l#֯ e={g?8YPw xc>|y^v+?㷆F#,&u%6Sr-&mLX?ӬOp#y^ %X1 omylr]HrBO9fNnuA.yyoih׋ujix‚k>ݻAl1[auB_9@_1c3jhWy3,9.N?nȒqgM KdKbotm-͜A [Y>gOoy956#XhI(}/L$ƴ!G 5;.wu0M7n񢪮NajR}yo\NNNIY9fV>ilxl.\F6+}*4D i-,0sٗ)L'&BY`[=o 6$t#b(e aCnUXh(ϫ~b:$U9^_,䆸H|ZW,᦯zD@_ ,{zXg o10={тIVD.2257Wz@"жGf50g [Cy X:id7}ǚ|}UĽbR5u_zxq|7gĺK?wzp{~l.v[ 6,<2 l >T=Ij8GfEoX~18OO'F~xy<[["_`2*f -YNMF=i^P1[k^2,ĺ vvgP^͏D&µݚ"'3ό4؁F4v:k~(G 4q-z .($f>Le~'9 sH]?$&^"6u!PW$)H.\ ӏO}_/^0`QS6&F-&UƧ/U4s|,hCl;\`C}.o(>㊏3p0ܗOZ̥ \I;|)Ei#5PBBq kD ~ًƦ,mWSLhedc#APm/yeRxDK%daR5`IGJp @%RtR^z߱JIJsā"~JلSsb,Ll+5e7x8(P\ ]xY^|jfY;@3?CAٹpvJ[wy;."L9$oFfd$8/)it}~PG%f r0)J$-dJPn.\.F^Jݾos 'ik2`Eل`csC¨˗Eo֥য়R6f{2K2D d@H亸Mtq5=SU =|zT^4dFg #ƅL |TQ֦%$yf3L|)djS ߇փ.9^ >`]w+/ޒEI/Jt Vȵ>>kr(eAQߗ;(;:j/~3_ǾB{GW_3ON:~s40{Çk׶t742N{AH */UU/G%I]_9W.ZIG 4?_*(lLW\Kvd.!pJ{Ak)Ț^C1AnT9oDρCP$[F)" hDξ0+,0ՅShqr\?>bww7Qb ?rb')f./ ;YYa/ 9}^'#&yTnC} & h*Os tuy999uZ9PD}6ɀ 59J~~Z2{ .Q!i0: !/]-q 'HlQGZ?T2} uQ*"snF:YfgKDcXo( @5,pQ0v.nLL~g9S,N7)*~)e‡Y?q>xp:(BY_泜"*q￙?pvzcd1mY>>Vhwi>"N[Xk\vO9Q3{ÍX:HY-%JUZݥ[鶔R"QP6>&®6XsUKaGz$>RkJCDmmwaZtN< ~/;d ˲Nߺpiq[3RON^tzۤQzMZIsb24MoYw|p&({DxEEn) (%&O:O]IgxKO!)^0׵-rW=F~ۉ_(`)C̤6ɒ f:7 )Tgr 0mV$#L_Z] cp=aЂeڶK11RbҢ.n}2FJp&/D+R}Q7HSqr}c' OSDxlJ9At${*͘F?mŎ[2n?ﻄ*~z0zVRk/ 1Ҋn>҈|)WnPrSJ+] ٚP?t*оxo^9e1oGdL9 -,0c+?*r(a#x^` *X(pUChE;C;p5L[ LX]b虇@ aXQ=otf(K ~츲kn*pGζډ"n%[C^I'E̘idXNtQ:^vJʔTvuHMQ/ n@(kusbM@ kMep9Ï),!Hs圭j,je}E<!( DCC/Q>}x έlߞ",B,CQ"xK>Љ@ !TBpg<%EeAGMYKf?PKFTPKy.F@angular-1.3.9/docs/img/guide/concepts-scope-watch-strategies.pnguT\M=؂{k.]t' q $@]<}37UuSu^UdQP)5ZD;q[II9IIrW'+[{K zfoб6޶ؔgDopT * O)xZ0l(4f'X*}R QvȇܧiK[O7T>u!\:8{/{.AX@  l NJ 4y&Zb2ԡB6G+I@#@JP%x:KaEΫ\멶(dlLIY%%lʊjQYL^ɏ5H^ClӐKl\ML\e(pRGhr9qO@VWk~,wz\YыۍZk3vƄ+aފcguh1lj$i CMܟJ?t6m;~/ jeGe.W._ն'j6V*'ŌS{=hnl;mNC!ZErEE R##hcXk0~L0mMp`!' _+<v86`~&9'ak0/Oeզ2-a qEQR}-•:0)Ⱦ = b2A'p:A7X$0Wq->0 NC T`.Bm>a扗}+L"CWJ,vcYkwf$Ï79?ȹA/R@3A$ٮe)o D|܊|Fc )ظ+Il SFXJ]eT:F7q.`\>µPݨ3-)3y_))Z!ҐF"~PB֕@WH*ܘJ b>j%:e)͙zmRɧkqv{突Yi)@b\.`9鴼D04pܽԭKvjƩ )$& }ƛ Zβ-=#n;Cߠ ڨRCb3T#,j=666SmkJxHhL-St+̡Ly;wb)+4z\ ݭimyw޽+OFNDHIM6_gZUoĖz0aE]ɟ[YHBpyIuRK,^ :ժ"ٕC&%Y+2 7DԄg}|>3a&|Jȧ,Y6nB4ѐS+Myׁ?ng_J91;Zějs2C@7S";uP_>iOt󗭆[Es'S '3KoWKwSro{G7oaʿ=?7Rn'LV\ՒR\J@MJO Sڸ; zyyxq8Zqrp0?`vqt7fvt{$Gɑy^S3'waJuZϝ5@+,lis"B{>Wqrwz򂫭`wՉp;s.eW['fwnxo듛EPX25@ '% 7Dxk:Sxse̛8C1Ot@\iq_U)_Mr66mqOğ[]0#B 431堭pi{%h ci X2D#b)F.tU@^7qKZ!؈ۧa0;HC (]1'vFaShb_P2: ݂B(H6Ia)@Ȇ 2b&Ba@c-#*6J~V8(Oi϶G:'x a~]':*9Ljb+Wt_`(!Cp$$pƺ"!\aogD p+VH ]GF(Ap:[\܆\SՒ;'] B 0D u()Ț)utQSBpg ¹2@0VKղpv}{-ahO961ad[6cgѓf z 2]-SX+٧rひTk4o31&,v:kA9K 0㒐[^BZQ>@?xWo^x͟_xgb@P~%p@R Ɓ2e+; 8!KWL~;4Aػ7Btmy'rQ a;AN c0e4s>g0mH&msӏ7~vO>)~&# h:pu`:h^~V`` -UFw$G1G3蒆V٫ɫ =y'^-N @q=1+Z!Qh.pER#%u'e 0OG* h>'ϐGhZXK[Jp"sL9C~vӂ"4juY8^!!75JTr1W3'>`PfA= 8"<۝59bv(nVMd`! %o|̃Cǃv*MU(5B'{:?Aa.--5-|NHKȪ^}]q@4YEƼ {%Cz?oF[矝rƒwi U,cvϡ rB5~VkfovEe(x OC+ǺAj-~3yuW 1N9- {|u <|^^D1R(-4k*ڂ'Ǚ;+H?6&i9:8y@O$?e-D vCff ֹpmoU\ P/,\VZғk΄75mly)nDq$!@;?4} ;Ի^cjH^Ѩ쇚tޑ0!Ok\8/j%"$u|̛WMQ 3SW1b*G,,f)Čtt"f`\'_h2ˮH;F˹߁z#_0BB"C$!.+N>hz$;9|S[ژ 3?H!M^2$<S{XOnObgEF]OGWr (׫l6>ݖ0lHNwuRb0 xn]BKKI''{yzTñ PWr3(kצ'>X TG1'0̺TEe$!1 @p{h w7(GIH:X%"m-[f}zX 2L~A r& _pü`&0qrDmp38`둜w-̾dYǶ/Fq1\ j/ky |u6\+f 5-4"[|Ŗ:}(l)AS1~89R=atٌLȷ;} w&EvFսYD P0%2vHATGĿ!-lE}}H&qɍT@F<9T}xPZB+tk}4Z> 85b{(jUI \ ~ dpgplvK mw` &^g#Pѽ U߮AtޕZIT!pE G'⌞ ,==:dgwnZ`r)sS- b?gG,-3ohLiHXE%%vV93/ Z&1g`[ƪAMTYfԸFDCl&XU4@ #!9x *F w Zk9ٻ0Q vJTA$LVԒ9~ A'5SC[cR|tI,#CQ $JK W-BzHt5cYu=TÏy'&C3rb bԠb,%׸#JdׯAu Xw ##Yy&e&<Kn 3 ӠMƮ \oU .oj-YrQE`%xiC&LhHM~u~Y\{ZքXQ QϊF{=X$63y#0;,E ^~ 3嚝!- H`@Yεu<^ x% B$@ i( m1x*_20CU Bր`Z gT#Jbws C* ?Y茁!"e hpbh,{O1et4!-EW 8DQddH &t{;FZiN7JAWl̶ĸ.EfpO\-5 A  xv HR("#HAU8¢1K_Z@_q=3vM^<ĔHBҌ>.;C 6:7)e+/d H'˽K)95A"Q?KB]a"0@,)Zc gZ6[L ]]D!wi ?5P-mc-yۅh{4) +=)jba"ȰLxPq./0sxIiKt01޻a5FO?.:*Ua/ZmkjUꓖ~*+F1jwJTgoFx`+ɐB1y!_l[rZ!&4u%A?H #k'VMm1{Y&HKPW~Z5a] u|(_Tׅ]S{4/RBя. @m2}<ʞ5nnDd%_cj;YԺWvo1h ɪn ]!=xPb^~y>SDl*嶐;'|eYOpQ^HJ,yаe]  3쓰"@ < &p7 ֲ)C$3I\_r@oG"Pq03a!Y^7;cg@"2uiGiZ95:'$CT1b 8oeΘ"H^R%EwԀ7Һ_JkDIT||o-Opl3lZlD_'ڼ؈D3 aMuJDC!$ln`ZXQMn)sZ1; 1$'>lo,FtJAL`?lhdd 3zLan'yo `,>%1)[8Ďm/\2~n% ET gC8+*d|jD pDžII絊ƽuqqD$ZCg"o%0KcH^1I5\d~/rcfUlA0fC۔K뚜|l⪒"5 7=)8c>|*;R*Yb I =I+`GAtF^5i$'߽]ae:X)1+G (NOJ3ъlBXnP 5*o;&Z@w3k.a pE{Q:`q yOF #Dx X)/rБL,)Ǿ>~Yaqzzx]tt8e`0@ RL@V}ei:5{wPi2/d dw1m;a,K6 r;U]OfW++95>G7&z.Ǡ#D %}ew..Rs2BVCg`co,YAas,1۬ObWnѯ*wbe%.0CN:s\1~2ڜ!dF؛ݙ Hpw-V*i")g#M A Hav: DK£#2V]YWL&ORځ9d MaT2h(EqS [@64GED*trh)ÓE ˒.NBP+uq$9xZ_xK\@]@=M;W9t]tYenҥ&w# bC7RfqxVRެ]pt>!Y`mĭWvMZ +tHG93Ll |$:C!1A@eV+aCBp"XC>ITЯ d4~cz<ʳ:'}U}[28kC -͋Y!7bւDhw Y[G~b ЛeZOzeS ss98 !BRW zݳ1}!9Hy"WI,޹4=8cc=aFw '0[e_\,sH}{Mhu섏{\*ȳC_]u]Xa2y7t.`mM\`.hGRtkEqQEt! ;i-4A9[yߗ (쥨S1dUx%#*+9$QЃM~@=6۰FOZ\64'P|Z9omp.ۘ{^\^AH 538 6;k(ɡ!s]?-ԱIaCa96Z/h?Keh+l\'FZؐ*.tg_mШ⠬C#qG=q'TZG,]MdNSDOO5VRplaW#ѝOO`̿ӊ+z%/R z豿?mqSfra C+K+j(򉈫11OW35ќaQsOOU>_qٱ:c.7h_7{IԙfV0]a[vx4t IJo^M%Pf}?0*p?<7{^Dv ۢu>Hj8n) 'nc_ւ U-pi'u8C= ]&HI=vr HhG&;DӅ¡&fbxiXϥzn5.19gv-LcTof!vbvl>?"c+z?7oWח͊}+JHZ-5%H2am$_=%4{O?\?[}X}-b +(XҽĜ+ĉ}BQSbʋjOW\,\$djqQyUV@Vq9V]Ex9(r}]zי/O$CjQ~ܠ㷟MZ폁ʞvebmPBgrkԋ : ;N,_O֣ۙ46_uW~yv+-Eox{<^8[,M.xtLLX)LZ՗B>:'8Dzۖ> h)%do7iV`BfXv0vK#ZaڰY}ҊjƖщ`﯀<ٮנ4`}MLĶc=ZOxbخV]e>5!㱧oŨav;xZ i׭;U U17۬lb੸lj_~!**kI~2:gxDL?mnp6r_6z~O,OsՍgMp3[9'QgR6YKy;"Ǿx*NA@BT/4ͷUx,D>8[CRv?A}Qq7Odw>&zrENfq)QZ2\h\ZwTI( ̐Fĸb=ObS &&ri?9۹Rۙo:/_ 0U.F{tYO E'qaȘus^o;kEFQZ?D5I(b"V`9/!\ ,鼎jL)dMK6p;_e%UZPSS/R!༱V.UlkME{ 4,"N 7$"o~rB|ug 6Xg?:'^`uqVvJ역PLR:vo2NudW]HXOy9a9qM*q-$jrz[m]i<>Wt6K[̆ tw' cݿ,8F}yAru6 f1VΘ["rƍ`XȖ&>-,5cId8LʆF (=ȝ(1n`!|D~ hfrWQj~R@!kFoBl՛uV8=<jV78F>PAd1%qݗx*WhRԩ.ohQ|Dz]xoXL@2]D"F'EշS_Ϥ1{ 7kM}:dԃ1^Fm$"x ZfqsB= +/h7[#*'aYd)c{~ށ%"NsQ3"F'M79.lu-_lNU|X^UHQduX{si#6V(/pQ+1BuνL(G}_O/ނicUn.|Qʾd>0ʒ!|\E+wA/*<3M2xU~ey)1}JNG 5Pc2D*Gp}.. fU}y{+>zP@}z  wOHar9䉭Lw:0ċLYPU,jj< q0gF'WDK8[?A|j5~ fND?∐rNfv Ӕ ͦj1W|Ok)9ԃ,kFǵrDU@Z-ٯRq=HJV#3Rk-~rXKkҜtV$BDإ%MdqOIH!7"w[U7"/D8 Mj0g,yOoQɘ6(VEٮ$:IgA!1:bd´VaQlNc?/>|"u bdЎa AjURs5cFC'?oɚس7gy*=&϶{kc{~Z(?R'x70u'hGy:x|LXC^8Ũ}.D5<]cP}BcV2/ CrZUP 2GC#fDh 8~?;}$n6Z{aFEkM.x 8,n:a&'[a𣎲_eIE\p2QMcZp_URvP, ]+ph{]/H3(jCD%iN唾LuŒZءoo1.nSi\3ֺTZ'I'5~æ&n֫ Ȳ=I >:ZH<"huT49Û}/~7{Ǯ[}O7"?״>YeTA@1薍q%"vv5rhlX*oy⴯hǜ֑E0w%r_e;~vL}]σ7 tq.$.-^M؝Ж/tR{c+{Q7ֿg XEgpr$>01uc8XK2_ℱ!MU* ǽ3 Uuj?Y:+Hj%dV)8LĬ7e.]P Ӑ͚W 2 V L=2lEveOUd2n࡬KuGa[F< ;^s&BSbvSVMO2\zs/&d9t^}%﨡[^Tq|*:3#zr\q?VO] [' %r_q.f%tdH|9bo>;\]kߧVf|lJKg˘2ht]p$egEeJfi,ʞa.$= >!~^n|wʁA_sZyG1j^tӫگ5GYu޸Մ&߼&E'>^/4P  9_jPfRM [9a-xF#EC𼠀m,\ 'r2u{ -ui2<ڃ_wbJYKm!zza7"+,\ W.O>F|8fV1a}~i걞A0ì['{f.R c} lv(`g--"VuL%n8jG\l;*TkWz> Nӷ?V=9wsP6P/C:XU,ڈu]Jq+Pܽ ;P8-;+Z =t;:?fY~MWOZZV]E6M&Dw~h>IB2Q- .BR9Ytv3i ɓ4}6*Š c'Ujbԩx_@##r, [)N* dpAj ľO*cDZLIꊿ\'q9-w\VSu|g9TWt IQ"aΖ:wwu~ 왍.v6v;`A#aXFu-]UpyX:]k*ӏ%>;ٶ?[NhbXNc;z1ֵŅ0ɘdqFQtK|U~+y{xH9,?]_$i|~N#㓦o#y#Zjhlbj,l4HD5¨;@a#+e˟R}sHCK⊗CLyƙD~JdR_VLעbW (AY,TjvxVh⍊?^$.A_SO;46[jԠgp[_ST#'7hǮFfX}*؃riTXI<ҤQv@ zkg; X`T[ϝQ}{7Njs^eT|,`Rk*$13`2v'ƋkM|8~:~DJq1. W-Saj+ZRg;<o\Z</~c>\!u'% .z]Mv*rT]~+9 rt9XmA epsC[nc7$'$j%P)r% qY% Hɞk֘p JM~jxWuk S 8F̝!h>>_`1@Ʌ^t1Lk2lfLsipN#:,iWĤ2տZ >elV 2Pβæ&U=:F85zluX))U0Jn܁#Ě h6Uϻl3.84ܒT .3ORZ021BxDwm;}(BGhgY^C(o!,cN>_^M-9\& 5􄅛U;&EnGl0>ԩU cq8԰uͨh !UOމˣR8$lg.m@^ R֤@ͽ,g4 i*|W,_MfpGrgqqF>T~;fyl1cǥDǻcSjZVtU&/o w7rz' $LԏVNqրZ#D[wd݈]2Jk2wݶ'K0M eB ,}P1 z&qxڊ*H9:=1A_G̪Gd<78#Y62*ِ)dXK:N,Gӽe[?(*9| M8.xځ5wvy Lܴk~I!23HٗB0uu]]ug[b0ױ$IJg6剒61,[prZv]yXLU}YgNM E,;:%mlϕSB{S\e 1/;a&ĦΣ>q՝HSn\ap'WSVi(x-M®[|Kyl֖~|mxS[ g78Y8wK(&K>5q:n>W~bS7G,ݽA!\ztҊ`rqԖ4or _iYg{)LY> 91829NJU\$ʓS:{T ;+ֺaoS z#rȕABf}p61ou'd;:RXj;0~ ߔA,aO"T:f>md{VSxX)wgokU/H־vݺo64s}&~3;O]*dkɖ[apk(9~x_7xSp/[Hr#>3ǣbv79{P[}/ݱG߮R/&7]Lx0{iRYM$WǹFsؖ#ñ砖 bRrHԄ<C8ݻ )?b^ƳNbJ%CuvDbgb&_U4_zw*j[v/%7*6G1Yr[Yr+ Fh|XJP /p$A=eE.]bkaGy4R RHuJ0àe0v&&lb6zx/=6Jp? `}rت E8ȵ2-ǎs+./BHm/?/u.a!PT?ZQE`\4lL$ \NW jf}ft1LQshy[B!ҟmwzu8r" XZ MQ? z?TWƠ%!#~wA}ͮoTl+Eғo0'qj8T,u+q$CpýlAa8I̩v}L6#x&-1Ě ovpFuv3E`Iv80BX^!\sVI;oT.W`k=R (lL̴nKUyY<2d,*jB.X`#Q 9d:tV3re# |dQ4}̝<`v׳P{r_Jw-DwU7Kґv Wu)B_ީ3z <L`9꼞%=STs H.{^7µ;S~kG0BM+bRG_t)e :eTSM,- UY ]p`YNdgvA{z[H(=||fc~^u{rNpkn$I^nmgqL|MkJ⅕Q5cyˀb6jo+E`:B۔.˵cyj;@`,@|yҾ]1sǜm#&G}_,wf22J̌¶uxFW{hצ5Dc3qj ڇku6ə?VaPzW1'ϬA0!Śqiq;e5wWTô&W{"7 3ɾJͨ(G [}3҄ Ez5㙼,GSgkPyrw}WK x,hGV'),:z/wS!`e8* 1Vƫa;?0))LMa[}^ (x6tŐ8=7( [>YB[l`!R`wCLlԄCĈȞ}ܾlDN3 >!$aP̖f;?-KU:UIЃe/L|/Ю) {-a>bb?g7vtиIŧlH(B3!} 풫6~sxg9a.JX5op{O}r]}0F%`.6nɒ. SpFAOir3V!,N楒I}~An)'2)@kιNڐM,VW2os1%^7K*P# jKw4>p܂s,:7'DnKZQ~CzD2Yfpԥ3U7AkBS#"-4n_B˭]~;vFv;-F7sPHG/˵n[:{`hё:9CLwqL ]h?SnO(O5Vx8t4Wn S:c{Ĥtiu|_hJn^>myc֙JֽEi,^KE;$\*-N yMNx؏\iP!Ed~Ϡ*eV2hMB@+Ib *&r;,R%1f|DZEXw4=k9B#eC~Mr0Vh- d"b +gt1ґi|S_؏6_i.@%&,AIXBvGvO?:Ƥ)GmSjDT׼{QSG~k~1{7CBEb3T7/aqpu GvxMm MWF՜VMΞ^d".再%(WEAB!eJ|lɾ?E!FmG!F !/>9ޛvߝt6d#3,*L|nQѴJ+Y:t=lfR%@t×ڋqxGD5\uWsmPQx 躉~d I7(`5Rb|fM,V ^!)pqXl\T\4I-, eT CiZ-7`=c{(6hr|w,h_61͌~\t_U4TWX %:QCg/>qQ]vp:ieO׷ov/oW8@ Rڐ<"u=?]f"ig efG笋 YUekw,G2S! yrI-WFVdkP/",V Mx_*nbRwX 8;eM6#Y4KR`a'5Ic$UY9 څ܃<|1+ 1ˆhicxź&u([_5o-6IsX5F{eR!e2;_qM<}$nXn\V4n)A*[S27PkS}-ת XdNm&(qZp ?V޳: gpv u 6ړj`'GI߂$^U:$|<o)4A.B[oJD\Ɩި΢_uĀ Z&`Ej)(ZvZ, +tM"9kڲjTWi1̇(=H?(8^ˠk#_F4?K(n\hP gTպњ?whifwkrDGl-59R_~E7(LoZXL^{e`f`UKyѤg[?ѻ*-ݼU#F?D9("xonؚdlW@V 9 `pihרow)Ɲ?tEk98g%eצݱ$'BZϖKBB3>Ġqj29>vuP YU#K :͖#yٔWMYb;UhV#.i<R5V٤k!ϻfQy.rg8ѧ^Lژ<i85lM6fba&eKH;y"w.[}6 NJ;ƥ))wBTpBS̸0YّlW_A0gXؓw^$j1$ؼ&>7/3;ST0%RG{0czѢ8ʡS4 e iA~-(a 4rHM乭I3{Q$˼a"94?j?%reG)s )иrfbQeg۸y QbE2R`JxBZ/&П3EIU›,L?9/i ) zSͤU $1Մ"O!Q$Yo3>I0mЏEvrݎX^X$I| j;WؔeMs&6povlx%z;B8']5láq/78vJ`7-l:[&s{z޷l?C>X4HTG*LCC-Zua0[jÂaY1 WxCArJKa-Qq'IpJKKF{)?ql|eP<4FEwVB2kk-Z%υ|$~!>_5~ -L0z5Vg~(HlT!Zm PwJ&CjaL\{_ aq+=\s t"iiTV dWsfĿXU ?(F~vUp5oIShEnZNId&}i?:)7[JaQ7.*Q9iGZ陰a`Wڹ }Ѫ<]QWIt餇QjD@>>Q GwzBkO 5ݱ4vݡCiSu+.Selh nbҰĤ/4bUg;x8gXlCpEǡdMwi);+\f8I[u|L9;_s3hO4SEHuƗ ^Z]]5Q_Ӯ<:ΦW>gqPSDzj? UT [+_-+0mʲH}eEⓘOwn)L%'oRאf [CqD+&g'8,_Pk&[doK㖺i"߸=_XLec̸h oڙ_ uRDiW˭P U,W!qTS-Oޝfz)nq߿ް3*~yS@GvݥD="d1p]#߾w,?8!Ngνo%LEySycCU!M6Ѱ>BۨqqdTTbڥϤkU!~c?p.Y7(,"P~\ͮF",ѝuΨVNQ*%Vr)\z5ا8o~τWZisY#vX^|?\;AAJ ]nu`NĜP&"(klDF8 :Hg7㆙ǙDzNmoix̴o00'-6gL{q̫bN7Z<["^^'9uǍ^uoP~읢 i \+6ϥA@~)+y%aXf'_*Q!(cԔ_ʓ2K|uJd^wLmrXi!uI E)|qv4>{i:*bA\?c9}OZϙM65k@ߪ7ᗻ_\a`VwaHqS\9+ Vd"BzT X[|[=0d3U-[@"M9`yEq2g}r6St}X}`5Kh䛘.k's M : 0|RUKHҡJq)(?7?eL\;Gj ?N2S\ZI g%LՒ+| CiW14`6=Qa=3tt#]uz9Kv懜J,'jV" J34GGƦ2r١x\3#QB:Y*;Pw]O;2P苰lY!,S2JRk\æo؊lpVE}{ڼрQZAKIe[:.. le}'t^SНX`K@8jYNZ)t3 Ҵi[jn,HLLWs|p2z%MnH{惌ErcOY˅@ۓZt2cRqꈅp!`w]8/Ϙj 1,C]'JH::*+*I6mK`mÐoz&Ur{a]X:v?X|}yK:}4YӉ߯N߱!G ܗbj k˚s czr\ ˙gqOYh~oie9 ! Jw.CCElRF%yg !+U\JRXOlvxj+NbixR$9|0Rͅ0X[\w,/#t, @.Xa!4Z26S'Y5cJً)r0ZY~X&)1ɦ3eaa^YI:&9o/V7i 2yy03Gw, p[LVo^dH\hQ$, kEڟ! >3rWP!`@ %d ּ7.$PxagYf)\RytUR}j陪o@!DS"~ue3%vA^ zNѮvj !&i|AIT<`B ߅mWr\DxJ&#oLؙ*!'=FX+OKTU]!Uz# ?xx&"5`o(VnC/{DR@,gI a7H.Dv`~7i 0>A'E_/"uВQ~×ϯ9X>t.Ќ?rs&59PIVdgnu?!iRiꕰQaJ{A#O2 Qƥ(!{xA"?YN|}%P$)bʝk6mbQTD)(}EVTDL[&Oefo:N aY-[Vgh\e8R^&)󡥡LY>?Hɪfxa8!0j7 "˪n|7+*ȉU.,+6òW6 58.t?W~ݰi.*=Z'adzw1IffZ"znJ"rfom YQ{%G hqP#Qu5qŶU?G6)'kNkשZNeтޏxe`dWMkݒ;2:gĢIޝ1WȢ#^>MgDtqrATCuj?[=Wgiϼ>*zshSO; aVE+æ(Г㚙x¿k*i}E_<]Sl8@e Qy5zIYI=rE#6KQo_ڏЖ:C})h\ ܪHm~b :Pi8r7S yj$>_H'b} @8guH$OcLO4;~~J1gr\pG5OtI*nHb}G+Ni  ڮ^ 6!| 67Y/{a?|tyh'm|3ˍھ922|;ôS5\yWGb;N;^{8K/'Cgˆd1]{֪7}CwխvOPE8#i p*of -jֻStN&/Mpl# GNVrMx͌hQRY?&ٞ`#<83p Vt< K O";b^yi1]  *ߗR{,Yns1Gu rٹH c݃ 5=ݧ{e(TНX=pY =l1"S}wu<-|.ѣJSwSlRhh6>jR3xP%H넂 bd2f;*?+Zpn5Ԗ]|'1v<=ÈqRg=opw.a*JRd+չ"33Ls-g5s&DQب|ùJdp> "W0y_59p#0\@Lrj<X}X8.TlM!u˔-;8xu̲_ߟM۴S,JDm{F*M0js)7l jbc9|v݀>)Bt!Fx ޷,I:sMv}aNa*'~L^^e#{AF)sp}{Ecي΃V0T}njTtnrVTwYc[okWqq o4;~$O#88᱓-YJ^["l9 u:*;W1Ye=**vsFFZ(Wb | BxtVή|}fnľ~;`o,M{G;{i̥lu{PXLUE`}pӪٞB4F_] "u"%/⠐HҚ/ͺy6T*u Al&-3uUpL.zc a=T%oY-%%'ڝ߾ 9L-l$Ʀgp-6p>n%?1@*険Ky4'K`B./ v^iu 3A#F>~vc螇Z?noˇ#]#DOG .Ӏ#߈Nb7MJkk^z7:WXqMM\k:}eӫfsz|O!W!%`'tQ!bZEcDPE׺Vqrʶ@c܁ؗgݲmbA˟1KE`[l_ Ng{xx:ap\E+I(*D^7D.w5H[_N_xdhح76, -.JK@۸5[;.n /*3-5w[>D`r"c:4+ `RvG#KB蹃Z?%jl޵(%Q"[YaqΫ^awR8–5 ֣Nku&Fy>dIbP).6"qX7#P*J[}[TrМolX! G~cBbbދ#nsJùri!ZSպ tf%(ɡ˵{ [1/>:]/:M6~k9^HikK\*L-4$PBḣ%l]ڱx\%DUI-7-1.pqyP:,87GY@99ʀj˸-Neͨ}Vymh[ Ԛ}^K|ijBu2ĸr<@,1 Ng)GpD>`9uժw NB/wg!NXe&FtiJLw/#|~`EKK!WO=љg?de_6҂ipNKPR#Ax}1 ^+ڬa1حV=:g>6ilxw~^cW@?\'&Oݶ \<~ fU\Y.ˊ= r|D{pRGD{{ d@Sw6o^~$گ9H!5!ܐ|TÆͬ!ƇGrU{Q2XLq)f;N- m a)nzyvGޛSs3kk5:u,Qux]K5=C#O&t $̬ 4]}v1&F)~i]E f2_ 3{l7LdR^d8ȟPj9n`僳TKHOj 8J=\KF{ ]Q޲-6M CCpwwp]?z9Ƙ҅%w={(wLXZ'dW||KF ggA[%F*%CLcq"k6:l& /D4>~b6K˧ao̸v#Y@4/7LJQVBu=;cv͍pvu\b k9~㏪,AN#$Bku"HW}֒>< /^\b(icmj9PŔ5זxŗ#dɒ\Jp珋eɳUm_'2qM.Lr˿4 x>v_ժM[0hJ \z5,wWWWIiߢݳm^Na*ݟ:\r-6=]RF*Ρ)!R}2jGWv^d{+}X@zyGW+#2s\ XdiYW{8V/SD!e36Bo d{ЊE1ew0, Kr)~(˸U͕%ub{Ih "?ۛ tЏhXkYpX9mSM_>dd<3t7aԒ7#H\_6h(oyv[HTHy8ppn6%ܳFԠε1U˓"DKG:I.x߱OZ6\4WhRUM|ɲYG46\f9V4#Z wE""Geôޅ('Ȗk/iZ5#ȴ/?~x980⊛"Ko׺u+" 5 ?;Ϋ:1$} `clHA*N,L"xJ$C.1:=ow?3h8w`ѸR<"TC~7 4oKKK 셠-tl9ٵN´Z+we[aOGҴ.> jCkqt.Pɍ7MuIelTMnCQ3/ƲX險gʇVvƧJJYSx$(v[.<^pgMWWuʝT˸yQb G]SwE/GrW &3gfhZ3Cר84Vf=%=5rW_9|n -*B˒N}VEO٧]dxZ~ߟz>R* F G;<2 i*V1D_M ,-%|ǜZbXԚ>N ͸fYxV(+2Gp}ɲnx%ZT0s[ШLt|6DIVb6KõYuPJo33;7ȣXZVT~4 5+aUv#(mMͰx$E |fmh4E_уҽ 785A] rIb4+}H;˲jRjCg(_Cra}e(GrcU"55;2Ym4s)EyU"Ta9Y'ٗZ5}7Wn?"H0~.QB$y3$$8S1hu"O2w ޥecmE?8* F~Ңp%6*)vfCnݶ7D/sY(svGtM 1S)T[? BE<@.x]_";Qҋ-Wux:zm_t󷁋*4qt*UEbflۮ* P Ff/K Q/3M oM ,JRz|PO#|5xzi62a_T-%r4(Oli}'Q2[pG 麗GufdKz!@cZ`5aUm ݻaP'ղޫM#09נeq7v AΗMyh h3yWMV/VQJI%,1*Ϸgt-B|cB700,}/\Lahq'qSJL7=0WZ0Yc>ÈkY&HNe%IWA\aƒ%*d'\E^L4Xu*r>ѣF:Z@t'%ix<gy_DAER(-&]CM5]Q_ݴMrc@a}|`$#ӥ-G^/8a=9jה_bJ D?$i۩3z[Fz. tB^bg _q{?nm!05ƁY7q#YA<>-z{â۟|˅9r+`NJF1(iD@vJ<I9,MOX7huhFmwp؂cԩ!ߛMz$?i862 ,'6jT:5w]'WpZxܢ?|ԗ>k0w߼L㙷A*Jb{7qaj~B)?o X4;_k0*#>̠m)sS[)㿇Zt[Vg, oG̅YdlLImD+Wڏ6^ CV )h sKǁ}>rx?J>-,56MtzNm44PZ_䕮H{">we. {mE ^h1f™q<i]Z99*z]6;ќt9KGHdV\FmچHstĖqS WTsHV=*KNRuԿx .IkvU<˭MJ +qEYl:+KQ|NK X+\?ԧEڱ{.mGk-V}nW2[MXřf] zR̬51 [=RֿoI"Ս(#u" g 0]u_{P"Y8#%EՔiMNVy9v\3,/RWBMD>V y8 bivMU+x=n~w/K+S$mmZ H,Dž % g T=vN6L,\xM[ʩѤ5PovePZ;ߍHSDt£{DuK/?yx2Ҙ<,WT33 қl _7m:_ ɝ Q0Tꅕ(kftPWX8RMdz@Ou& m#|2z17/G$Ue~!an=aEfeVe1 9 HBY{9e)M; R%n3]空#13R_>I%nvu^VXqWזK@:3>+2l0t& ^|(Jw gUfbdhkUmca< 붿t1:-ՔGEsGw9 a"\&m(CW2i]_g/EsW%w FseV[[hFHOC]7("*=!cn;3`j? Ti>MOi_pI0h~rLi;.{wf'Q%n%相.x[uh󝪍* C <*3jrYJ=."rGL>"$bL RVZZ뇿5ي)Q߷H\{Y#HɌ0udLnLڥ\F,ټ[_p,*KW ە`Jk;Dm3tƿI,a"]8l?D8ηD]/7t12mu`AI^kX/%11ȣR?FA׿!R6RH;lYS/IIzs83*:Kfkw,@utJ333(Rkb.:t Ďh,]^$$%SupaSBG3|2 m fD1jؔF:2EֵJmu{r{]vݱȤeF @!SےJd0, c9ۤYHc(|~ l sZ"\W-tD@K|%Zv |=_eD]ǂV&G!x t=mt-;3u4X43c~.hy<$F% (|jZ-9xu}I:g20X))3J9C\6*c4h8謦vU 9h(E]ID-@/v~ Qo(%#Өh4lmM:b}ۤpڠtNA3K͜W_ZiT΅pK7թuv)ݩ(wyu.yh9ˬq gvm""ɝWQLZkz9L"B* E2 ;uʝ9'sNvu4Mcc*ZF4+R\nDTYEg7QBݡ7WLXLK㹞ocŦ|W*MZF#@So:1/%-NᡊY]5[E5y*HGxz^ꄯ&`jP)y0No%.邉""tǏ"k'yeKbݼr=ǭ (9I]AHPƍeqr\,1w!8{ZXd>.l *` qit RaX,\+c'jZ-8ўmEPP7& 7t}>}-6SfLk0I%kS4b\:6.PKK&yQlJ QsF{S!c9 a }}/r Z_%X=|A*TLǘo^kxEkUVK|"Q^:ֻwt_zYo u<ϠnYXN+9!2(*2;>0 n*:L`j.:rG;cl2O-U^B%#.@ϮnӤ}[Tko7[d9) `UA@# QN7-Q`36^tT^[8Ojw2Ib1mRϟλ|`ZXv˛5zlCim'G*il [^utO9 ~ߟB=V޴XMĠ%] 5/ gfPљA3L] F{2)[aY.yUXSߕ?EUbGTi6u[yBwhrhbwc2*v߮FHݐ,?GO%6MLf8}?FgM:~4i|\Rd:JMZ`qt\kTD^@D(s:4XK2 ~D1XHcl22qb|^h+ ;8y2՚Cmb{r/>&)ms̕6Llky  \ȸ2,CKc/~\.d%iB3얄Nn{ B~@qO "Om }`k-36VC{ UTSj6|#?L6un~fy?uv9զ Z%Lo퇿AsEnY V-,2v2,C B/ԾWb0>]렊PwvP v7mL eҭPE-fiHP5WCM>yO)7(W{a21ŢS hRuaϵ F",rnrGE\T )[&CΨHyR4| ۢlc/ !l)pE8}$]1EC6'XYÉ 8߱G<(]D Q$G_$թ*zUgcB@knN"رIT~*Pm4wʹkJiF_450cƁ5XpUR~5<TDd70U@QʈC/}9"8aQ/p ]Ě FQ]Y?Iw\GU_s ٧OeNȗVrWEeenl)ZK7(&oV4N:ILxqJ~ۛ$ds$❚O57UG297!%$ېIg5)cqN&B6d"-(*B%MUB+7:̀8 žZL@yTL% P2 (de.M&38=lRC5 1@UvMQ%Yvr)+JV-E%Rk]nf}zQiZ. bl(̥zp%j#NqC\{qT^NH.Yx 1fu~#+<_qr,hqwˤ #!<.R-ITXKݱZ:8c=Qb#ˠhd?VZ9#sw@G/Z3iH[DaL !ȁV~8=||Mô\ U.~Z2qZ&<~Ad>r ţ\qW BHoOgK|j#M7nsOpPmjkkK_ &s9YK #I}4Y&Ƥ-K.Jot}=s*J5/,?b;|6*<٬P9I%'Li}㷟&hqNd{@t :9qhgS%$z@gqQ] FliBG֫t_jPv Mm4Og)JAYe ESqڼ;t&N*#ZNLsI㴡= oEz<ۍ LVgzWP"5bMjۇ[TbLR3RT2pB,\zyX(?qοWZv)~rq\=?rmB2/:߃ǰIgC3Wţ7A9 7,{JtW2_۬ڮ놱ts-Trl ,cW;W 㸧ґs ~6YqH۩slBWfq:R`~Q:m+V\=b~ <7'/ exD;FAA|]e͹uE1 ?&[BJ%=hN :̜#.gn(nvZ72rLRew(Ձ lIqrT<ʎHJ[b@Щ'"<ź{gv" >EnRC_kŨm)vse*0S1a˞T7 Z9{un%|?OGsS{eU:!r^SﰑH5[L(2r Yy7oYzJzt8ONv,7e{,`2ܝJxHJċre'1/_tJzc~Vѱϣz%F{_}.wKZSvu\v0*IjsJ/ݣL$(f\,B`5?9@s!twO#Ey (!CPp_ hl[i$`QeLcp[ԴF͵9׏PX82ef炁 Q 4ܺWf|EL;X':ť;x||mţ/x9A,V ;8f`X所H{v~AN?lwSrVjw!q\3 (>DsӓJ=аxCŸQ,:[ܟ Xi,r/8VXΥ%F5`4k@ZĢO&CA7, -h4Ξk6s )v .yNCq xVKtg|A׉cYuX+ELZMoU*faы_Yߗrg5-v+2nGK6&&0c5zMGftцzM>E[ 'A[m騐iteŚkeWN x3eS8㲾yN=.5&~$eFI|27S|UK'x{}^ث1/33Tna%-P'6}EbQ8;OX2F{!|:+3K<8{Pi>T+j_T+{RRWX'\fi+NCl&?[NK>aA}s l^wQn>J,c;*8kP,\N\L&e pśl"|Ţjy1 WNֈդ|%;mMd۵)/{Tb9ɢ0l0]Pb]'#ʃCXe ]VٓƖ1ts( ^3B2>}rJ7,qQ}i=SWjY0e;E\)Z#䵤'kf5#> +L _ڿzP1!_cZA@| Wddqד"!fnQ!?/\dFnZ@뷃 77=K\ -:ctU($t%聹tSDkR|CjqpyjؠZm7sN9@MsQ U|ԁIRSF2FAcT*YAƧloZ|xA՛PkBe鹝\Ms<"$Am!E|gk|GƆ__i{2q\qoQ&͗A1qJuƅ~DUȠI\h!=HX:{:0mwN<ԏLQ >I s氱J!}nmm`*u$ZFhi>g>2Rzl8la9Gooh-LFP]kQnRW-?sTQ X6T+bzؠ ;3$т7$dAcKk^+kpHP&9xz{rKab<~M@pS׍2W5 MJxlTbNuUvCdVBƙn9Dx#$5_;BSGdid"آֲSw{w,aAew&_C%5l u!wZLC!p+=nB?wJ)$"ȭ҇ZUޙDK{^ ǒF^&c{}ɩ:L0 POߢ|ݗ <|2U6vdA=s8y"tow >ZxK"Ӧ,ώ?c5քñ(;)nw]fs Ӏ @jvdVhOM_#G{8g ~Ui׺:. ^M*ꃻ󪘍P, m͹O`>ټ~aW" 7, GXpD6-Rq/GZ5 ?J$^*ιZfb=UV)IBЄ^h8E,:r Ɣu~p$fz$8P*!ʶOOff~3΃LH4#ʌ{9}ޒoפh4Ѕa2hcێE5̥5^jТD4ʟ %п&6~f`˼*qZ9`?ņ5g`JS]ipsA7d>dI`l%9]󉂫w!k/ 2,*b],3@-Tp%+HP;xG_s\Ǎ`Aʏ2m!5n)akTpYnfycm0o\e8w#7H :>?Lcz/UOa+Sʊ1h7e[Ӭ<8?_)O}3υʰqXSxbex"/S W_EZ2va^!nFg;#z<yZw,{B|jE?Vy6󨙁 VEgHo[1mE q†̿àoQ}1<88tYu`Gsop驠20Et5dkeGzKMPxph`{O9f" T_UM75B\RoR)_GJfL@ɩ̨Xb$Tr視.(8Kf6DN^ϝ,EjnrKB~\29c0^`q){,]( Q5),$m B?I2 vWM1Il`*J| cU"-KBcS\J3 |c*]+Y 9Jzc 5G̠et2Fp؋Ig)GPu8(BRO`Qg:>bMZqQQl=; d0z{hh[1R٤5*mз? %ct$3K(A/ߧ/e rh*ŘqS ~-;P rײ),+ ˩&|$x?kW|fD߅$`ſ Y$v=b;a ˕W}]~UN0{T#D. 41fDe 0OpHIo !%7<)v[n =ygz{`G5CʹTz3,i by}T;/˙i:Ws2_4)kf?|5׹S=y*z}3k+5s/ݨ':]]&־XGfx+$<[0-~X:s]-3LO(ڪֽ\R}F(|t [/yQ1ޥkf|,cxùGtU?Oe3ATZ衍ȡeK Ĩ;Pv\޷/ܙo[3/;SM}_F̙6 ny]碙V܁ 1^>5qS;Q%~J>hρKdhhYGh/i@C|%>VgVQ?Ec/ZxvSY",~tMqExqޗ]sU4g` /(.,r3t?=z)_!s?3b/Px졺*遇̬=b C%挹`{pɄ ӗ&􈸮> xpęՒRwgڬ\C[}ja)AIKVq\zH63( oQ;o$&&GX S?[m1f(\%ta@LlG.{e!p`X& L!R)!ܗAe4Ƕ;Fm21Sb^6;+ꊢBK(`@D9#UU.#J~^J3QЇk #Hro.F~s1kxZzV͒^| ޜ #m1UFy_/rV$Qnyeǩ2XY.9dGcPΔi \ _Kar1a0*@?zn7TP[RH/)FlAvG6OT4U| I1|^eBĥ.Yxߓ+,a. Xmd5&0`Cv;G9v7ҢE[+~9NխZ HG MQDU8-uonס]iɩUUd-(? {u fZ~Wx ".ZM]QGȧ uG&|y rJUg*~j#i*I#) @J *}:&/q,Z G#d222%LwPE\OU3Z\ΩGScj~41 GN>yzNyo8r=MT/S!_@hkkCXLCm.$۬:.80y[o{sYyz@8)/'66:\J,6/,Mmķ;: S8ka=t'],v9jJw.R%l>1gg %2=wt vQ fBKs21σ !}*mr\^kHﮧir'V 6%ng{bvVtߔF3iϚ\&3*QJ)Bσ~o ED2Up֨-<6$LUY>nm\F~-ӗ,&p*:,Q2͌|*{R4EW|z\Dz^ #J0?5zm8zK0 !f@b|x_fr >~LkjY$O{}|͹΋?b,j0*w tXơ0lJ񸋇ʘ1ޤݙ("o\BsB )'Y7J7:0 YR  m0 aOԦ;92ӅD BZ7dbilBz M(ת!^ ïq\UyDҞWshю,lLItYPO>w--pZR'kaY5Z P KL{L r:O- Vz0<(H\oȧk8*2@<9<5z%S"9-N&=h 5?]S\|͔' !PePC LbۢcaY :zwD~4r;~fZf}Sj\֣igO7Z}7=|. 8ǡ~;PôJ IJl3N"lfxmu be]ONCoU[$i܄^ܫ&fDȺ^\+/7B!$S ?P%Cл/0( "حm놡"7u[J jt,,Hg;'=¬ysB> 4d B,ѐ߽SՑO9]$EX`RC3󡆡a5C~X!ʹ!f錄Xc:8g`2\pҸyZ>;%z ʦ]8&Hi4,~qE4RZUz:CMdufA:O b]i@+z%Q &ҴH^#rPޒCA3KiL5+VSȪV-?")VzE 6la.r|*k:Fr:DrӀw9dIf=ckfu$Um|KJF\XQtݰ5Ś\Ec䘩aW1* ˉ%!q2l8!Kbd%^}X,8u2YfA?=9/Z39s?EjC Gcׇe`f$ed @HWo'F"Q?.4׍;5cCPE-ƒWJʉ x(0c¼.C瀥'. Q1\O:_Ȃo?Ӌ9,}V,4@2%'˟쿚* &qZ[yqc47ģf=>9:7/pbf Elaqʑ~5q|?-Sw:`|q?vG`ȵ-EXZvڮ yoG4G2ly>k0Ѧ*q}u64Z)Zo94$d~ƄG;f[Jَ8PAD'S8Sa&Td`ww=b╀=sF}?ٿ_'k^>/} :g%QbZnXnr"wl.GCKÊJy(17K(ۆ kd!2QJ-vͤ82,R[-*7(jLc"%'ÐDV$PQE:.^q'(.킧-b*5;;k[e&-#o[SxW$ON,kB\(4֡buYu!U40n;W֔[cX$Em:wko|W݀9Éa߸RE,껇81VU8!^ X1 "cF'ZfoNGCzkWwLf|pvNŚBҝJ|.%/ozDd?ܖ0\ow Dx{n XēcĔВ0{u 6Ƃhw۹kuڒO[F/ڭ^x NJ!2^nFL.'3)/.w(%3G<+Z{"i}J)ox\-htDd\mtz'x!)/bmq[lطC`BsDDZ;φ3t:6*ֹ\,Ώ<~Uz$'BtH8*RW7&~2IuOs@Oiy8d M}uaJkyQ8ç/9|NmD*%$jZXXiq I RD26UK ;ctl荊8VJIw-ۈe%32 U)=, ao9/&"{RX.w\:+F6cKEfO+~ oNH'{#I*n]d6}מχV+n(AWY=rr4'sۭ6uc[R ?4 /5owwb,#zHp[\:m/x61/Xɡg}Af7ir|.ӓc>V!y11^m^wN=&Oo3ߜ>,oqbu_ޖ09kߛ>אɐ!YaAӪK7ZI0Bt&\U/m(nfc-KuMq>I,L]e=w^gPf0O#"9ð)/z (|EPOyJf0yi1IJ |'*xL;?1kO +hX=kGZ$hX$+bs$Xz>T`Tɪ8)LT)lηO]mXW{G0,|Fzd/҇tƲ g}?EvSm :HIa mUD?k# U{QAu`uI*D\FI pb~psuxKK*(b$J`jV-l Yqj_;|! q_JJb$iR@~ܗ=iFb *{J:͠$?A ES0Fʂ;c| .)phD*-w 68];P(65M~iT)Ed ;(i7UPݞJ`B\ =|TA)2UV&[ކS4DN r]lx{Bb3k*4(}v;N[jtğV wT/DgHx#+&aXfA *zbg?Kv '69y )@3&ͥ^NLl9F6B7v՚͆|Ԫ7vD9w7.fեvƊmpH9HdVwIc.{ϤwKG߅f2 KNC 19ㆧAZxf)O:*۠3 ?T pҺE/% FG3>}q5T#u5=mI'T{;Dti%͗.mƯ tAPe9)}佫mʱ>auvrL .` ry%҆U+LFփ-^c)$rRb\=tl|k[Ys$ϭ;(,:31sK" cͱ y|f**< *43#Z"E5&JT')XdGCY"!f)̹Jk aGe؎LV"ӂ-ԅ#sHI\XLVk%Jk H;(̨.rt*-7:M''.SwcY0rq~<5fqzGSy5iL:nqJ$g6,!4~u΃[m.^WF*Sd ^Πi,{^]KI*3hX.|x߄$y<S˴4Y83kJ;z Z% ,D=C^/dw` /9DgP`gAMiKb+;z/x!}EAMgvv]5_zZܰ|r~Ws_ wyc $fU}%j jd)آ1W:n+u1ϩ& \L{L>+խ*@X MA~_yjxzDHJWƄ˗gQ) \ wU#zid[XJrۨ#`D1@E桵vuxG]lᘥ }񗫛G4Qw{ex R`1#)1ų-5u:'N%HH8GS4n7=[r/2nOk'(@?Pzs 0"ͺKG ߍC z2ͿW[Jih t\pA)sD$=@a2z LMFc*94\V ;jX/ vE[K\TGno5JmRV랕q4(#h)*#a0#;bf98 hileK9P`'~o.ܒ0;J M0$-s $l~sp o6ωimN\tE"DYm >x'T:(_C ne ՠooo 8(,La ;X_`]c(9=HjwOi9x4s8)ݐ&%̽nv\;)0<_=Ы˧t[GQe Hލ[v[Rx4| 57nG9v&'chW.u;`L7p=2ھ=oWr\7*_c0+ 3b :is+})+J/,3L#{q[oV,MJDƌ+%*RJNe I0$H>NPml%v(r{i&}HtHe?#[Uner_(MKqX6sFt+R=&Q!3* #%ُ0uPvQ@AUHڬ*g7ݵkASfn[&Kt`o+ÿZe߽bss%ܤTKTiD{.BX7ĨKK4 z?7a=̕o Y'3W[ƻ 6l505Tm-N@3U,9uuTfo~ҸٝReDFk60;S_ Qy ֎^kIq0pnZ;X{0sAW:cD+Ev½f/SXq6Wƒї+yKJGJ1io ِ@\3(bn˫,sx| P#;>Q=y>;Ajhd:Tp9{-=Pf~Xw39\~al7(ܝ0.--KbP$~@MQď=Z }rzؤw'W8ꎫu"PU$,^ unT" ^V@OmdUOSCTU.[:N\neKӷ.t;J#{-ظT7熁g)JF5Ds7|IN h |`RҰvm[6t.o;b}@>O1@( ynye<(v:?k=|!*^"%< .Fzӄ.Z(-=7>Qi-O5 ҧ ~wg;XZ[l o 4at43㕌7?S&*'o7 o_\p(% 6ȢԇMFMo_UV N4Է}$7kGHə ArR e8 IʬxoׅOV-B^zxHx.R*ϑ' V/Ԧv<.PI鮨d dMl`~[ÜZk6 )\<쓿~xvNjoy(p#{P SBިͣ3RQ9"gi> w "J?m ,o5Ũ\*'-hZ(N oY(摶myJmި\#%TZz,u-)Wש n:r^a+7 O+^OuxӋeQ^4ѭe}gbgGz~uzqȀf[ clEDe)0ˀhvU N (#:O쏋x]\CfAE~N7Y cB.o (xY\ _rO4n+n\ q.0 \.tI?L LEs#zjۿM:$ICAotnjXp*t4Ar{Q}8\x9W\BQ)PUz&m"<瓽Ű. ˸N8ŴlP7XmN4^ѐ"e)> گOv*$"'ڱpwPUm*%*\7[@߼`y*>Mf&KͿ1@3xK*2QtXWgun!7ӛǎv/ DPM@,}sYfFJv놥4m^)(,LX%$ͪ f Ql׵o:"u{'D=CI跧1#КIhRCXӮr=*d5XS4DrR#b͏(V^Vk@NZɍ8&c2(G55\j"{H8u+rl&1Aj1!wԟBE2 XXr"?uanEF%CckbHkja{a8ͧ45tH3HJRT6SS9>h^s% ft~Rq°$|8Jv3C:$3E)3x08 O gwkik*N Znb ТG!sՕDy7AG 5.|ķ . 0bu)Ck '>Ot@)̒/3G`?ߡV$ AaVLL͆R4G6M HWBQwͺٕId_ATD]!H\LT`_bS }؏LkJ&]=#Ht\+qxhen" DqyuT_ߣ4.a0n'-d͎3jKokj tUa6]X?? !3od*ǚʲg`{aͦU-cJ477]+_KtFkcU-<` .`^ok0֋-e, 5M/'G 0PLUv Nj1ٳ'y5.^ x)8pnz멐M~}4W3+zT6 srTZ.hX=l"UQg;"ͫ$Ty {1_(nPѧS j<[ )8xj\鿤Dy@TJ maDNE/5v[5ǃJlC+6,+履:.Vrݖqe_YA _ӿX>A9::B5QDIrǁǎ&:RYH 䭳7JQ] QDCs ӟp_lbٰVf( ;ѧv[x%I7i$Lkq>.-"L#_.d_/zx ,Wb:u'AX%^z Ғ/c耆k ›M\zrНhi#JQU"O ER޻Knkvi]=Hasan"lWC !tE1&ֺP &J`'k+Q9ӭXU"y!filof'oPW)!wea+ I`w8y22_$"0;c4\: &G2%5uQ{GG<;.r&?{㫿'h=Εi-xn9zOK("~Gsc*5DQTUh%uyG#a5Ym1.R/0-N03閇w+ qXe[MDG8]2@ Êu690ZT)q:2z&4:?\(] &sƒ8;8٬wOL#*C f$EzƁBp'8RZ;D]FG&=zi'*4Ν*PSk&ghDe-pXDU)j7qu}Zsܘ|f@ xkI{"Fs® G\⿍GF& Å4'gW:]VOȒ:>@p[01E1Ƨ[ZvFЋdh1V:ު^(+nPofsX= JjjZ\"*r3R7JO0awjxE "\8 ea͕+P뉶C]#Uwouh(^+q-`Ք6:|]he#k툐}'V!V)AY gmq @\0Ldx/[-]p\NMgdS^q5MN@}ҙYʞoaLHWKljj|C6pӂܣMebp?l"PD}3XKN_*2Ƨ`aIII9@ޏn4߉[SlBJcfdE^P2NxcʹvJYPKnmFdz( Q9gmLiΑNwfXX/tN@{M&ySɳ^ȮVUk[Ą}] @O{uKty(n򒛼FI!t V5$"eTa(qXMdQ-0S4 gAGQ>.*wu/vO=, Ԉͫ^"ےo˙XrE_22x4ΕR6oAʮH;&Zb+VM І5l4x4D7g+W+:j1]@ CqP9<`hiEl*:箺) T,'AUlQԇ5Uvjv-×^is3K[&;rGoōzf@|u#covM(,Wi@+ &jCh?/fbJe: >Lt$ $-rNss#a(}u T[BNR5U%Y`Q;IW4΄ .$4Vl$Nw,ؔ.g:`cV:*|?'j[,Ueehr݋;ٱ?coMYms;z5ij*L0!NU*T9V ْj73w[.*,$#Wh06e4ϙ83XSVnxنgD 6d8'N5I75WHcCUUR.Vi lO\V?9-\<䥉ީSͺXIG8*Ȗy5 j5EJTa`T]X{r?"_(2Q[Uc0Y:;$IOjƲUjfhW}6FmԳoyK^T^Y3s"=\ N)PF>/Lo2o>$QmHE8 x,mcFU`P^ (pn@,T%P= ="JfZ1?K(v K𧅀᭫YYPS ٙk\!vYf}^JJBEb6bcyIx3ã6^8Xh5))ijfSܩjR$*ZæqDINΦpu(ju51ͥƘHNp=(s } -w6lD[#kBPQ'J X2 ?ύ }o(>œ˪iՓhQʔKhyësj"RQ-dM"[U#B̵g-Ƙvz Ɣ6jVRp yK%;^[~K Ac?o8st|bQoYI鹪hXi'դkǙ ޑȌf:~=SW+Ww\l`DO)2v*"G _c-ȁ)^ҋpLYcYsX3߾9]h'S[OEiಙe|ћJ_>^ɼRND ASb9 oOǟRO*f"d PeWpS ?2No{F4OR4s4uIDk?1n^E`hlxSv:s(@9-icXw2 `p>6<9nj}6kc,dg w%s$m$m)ĖH3Cv 5^cij@sbp%'IyVLg(TJYFôH\\LJ YJrolcX 30((V*m6|9XzI{R=_B`@V!q^Vu]h>cdʎ8W>('&DvL^@يXj9Fr٨LFp,SU1Zh4hH [EOB5\Sٿ㢢9\Qr4}\M5d̿?LHzAn,ȟvEE~3=}m<[@&ܓh|"D/=e 7һ|ujaA_Y~t0{q ГaG{^v=&{J=!lJwD'-.%-3Um&);¼t?>)Ya'¥/[3:,[q< +Ŀ1Ֆi_8lؘ/jA ŪO+U:ZjwT;գakKv ͿԐW5FOYEIKm䌯5[SƳ$\ڟNpQFfAa >$yZ4fۣ@PAÙW.7TdצWirqS]I/jhnCTW8 T:b5vg-ʣɌբ~ r 9(I*TZkhhIμ9!9|N#rMhiaXeO>LRkk!NAp«b/ pjYX`Xпu_ NMJ΁=Ldp\ڍȈ0^|i7\q/mO^O0Wۏٯj{Zִ?vhD;F;x [HHh'{!*&v7[WLfTo4h@D.\3KJBxB 9].ߟVt%|cS,NȘ+EatFiwJFVŖҢ..g DR:fj@)edCct#++RFo?7#H]5/1?1!ySBLgT{Wlu#T8KȘ2yvs毨޲eB8񶘧Tn閮859|{[w!Os~C_L &zv{܉^3) lcN N w"ovn P?NzFRjZdlug GM\RQ'*%6b3@j ``^nu[L'% cű/DПz1!_\m.&UPl#vOhn)͞nZW 0O5<@ο)O@@X@H7츄 ʨM{Vo6Fmizi ~@lf[NR*"`4au'21j6O`uk :l+PDiBvGf i (yիy%29oKLd1]fbiAV,y>VdTN܆mdI@qQ )l-2gًo?ւŁ6hq褫Fx|sz= A[?ւHٸ3HF=XGMa 7\ +Oi2ijZqjp4 l$bZsa~t6X/°IG  V!LxT3XYO}IxF=a%̃(jNˮЅYy^[Z%||18Զ󭁪{hy߉ekr`^atu귇\E(k2NW3+@UZWw YYMq'-Wplzzztt~2EDVB(S BAD(FN}|D\ k[WVv i%Pa]FHPon!E_ORbTLPyG6l0B(9ea- -pe??(_;hf%(pjhfY/ FiCNQZ;%99':% a܅h4JO 'd 65пEB (I6pWwO$\^(e&Gз\yhgW g:7SutQ VxUzH *'-}~Jܯ>J qp &<=<@ TRvN\hGF m| O XKQ>25:?zqZ|h@`]6s56][[-uCCxpxf3umSg/y O/7k~vf@秨ryG]03$%%j>|7<(ƇU\!13" yo7H!q5FE2f򚬖S6y˞26,5軃 7 a,sz.|\8OGރĬg mh|2~)&ґLbs/_l_i:/%PK5nE&TcWU̾O hrA@{k:}?C,w w@_L}}ֶ l E=)F."0ÄoFG戋m5o lj@XU&EW[бq9>P7H|Ł[W8C|iuƦ$ą|h>i^B^rlwR|0ԴP": Vϙy11 bˑ tnԉb"I.1I/0+%x8>.A66pWh{gQMϠ^B3_,I%-u `y1|[\RbS#&!Tܜ7Z*,&}# LMP<.GBmA //`5+v_ PkbƋem4iBͦ3;ʚWWvlFTbDv|t0A 'E*`6wi2p >qOE 3J:fo؋ҢӴ0ToI!?ILkݩهxtR@ݍh`møW'Vb&,c0[I>?z zQ59.83!VޘGmncnJ_c1S} n1#A݆#HiF`J@Kǰ_)}:iZ}K˹82nj e6׃LSMF*`zZ=@]?zi*!ÍxZjѳw<6j;B*Q Q*NeH{@n:^YiD,x!p/xY!tCBLs?+@ad<,@lėRZk5+vȋ}e.5ɑdYpARG"Vz!>b~}y7$49) h]ɶK oѪvÄ mhaf E`%(#ys( :K+_3[vPOBNXzpXWlv4v|OXWK%t!}=ෟα,B'¢Ш )͹<O PyY*]/+j֤ .h2,z-T#W;-..Rm Hp_ |%ƄB{7Y_SR\#=*<[\?/}lsT&(b5`W ["lxUmrWA: 9Zpr΁opɞ!-\{>_kxa],UbMOg9ҊCX/pJ=d@ @.#mSy"&5}3Q: S oZ!y )r/,L'Ly>Qˁ @wUu*`wiHh((cU[hO ys}^C[0.G #}hL΍\3mX+ ĄL_~{g?[Bែ(ԇ{KNWEb2ey-æiqZ3OPA?'{>oG 6s?+}*!e"?/FF9TS?P]M3))!"]@<'1o&pi*+7 po0?x͟u [ $XTluNv9[|P9S柧$ޤIRy ֕&3U+$T!Rs9ױG"S&b.ڨ(3Q\61:r!Pk-f~Gm77PSUl`FLefÅԸ =EɈnm/}8hT5z0or6s{U=6}ja8sf_ Ғ!kx"4?E+؎ZWŅFB!yUNZZ5u/؇+$,Rl+SN:]ʛmSs1^+s|>9G09^ "=ƋlZzNL @b*(G; [~73Eؕ 80;dʗQ$.#FOxX&{YZFmuP^yAO]e_bc<p٨]>MPds{5wiGCj fpn@Fw7L ̃0/}1i DJ$iZKsػ|9݆ 8]#Q:_Z>d1$FbJ`Jfu?58ptxtRV|Kk$C3Ֆ A8<g»:$!K3:%W7A)_g*8gW$`m} ^@g+ռyj_d~8TٰUGe-9vO!`G+WIMU/b o/ka PsB'&(#KkYY2e?b(b&  J9JSY`2Ri,]3S ꏬB].cS;Nmj@T{"͎OwIȘR.'ZQdfҵ}1\(E5X=%dMD;xQ8q[=˝ϱt W&KH 4xʑ>-a(=xMx7k;iGD9Dy"{`nDތ8 !n:OfB;TT&aYwcԉGszrip|9А,lZk(БWQTVn<5kjWghe8TkdJIaZrs\wOVҎF3+TÇscqF!,]ZsҽXMlMufKFh)"B#mNe:Xan> ]ͮ&u\Ŋ.ܗR@1DԓQBXx/ٵKo8r?Kh!ܲ;Rh_;`a4sr9q Qp$vq눗qA|N8䈟#LKr1ᾶWK0$ֳ0.,4IF6 *n,+5ٞ7^$hΐΏM敖8!>ԂmSF.q?dˡ17m91O84lv”0$4h ȥ' wks*Rg{iIrϛ%Yfv狯iBoϫ!BGf)+<6vre)8{i5f6&["\j(^pV"xv“ $ ejsCwb=T8S)Ư#ow_ϻH EƚAc"YuaM?U*.A?I˞mu G(:<)q+ƄEvƖV Fo=A/vǒ_=>(&_V<%ro*۹qN`?ǩ,~duڟ[OHhTupa5gİe&d,cʖ=:4PO)SWXo߶ ЭNqfY8Dc:Rwxc] !hڼ7+AYobIDG1O=` $7{m@ [MRqt(H4zNXVUt8Z*Yh lۑO$DƲ h1k%s27SLK./ 68\k"ӷ(}I8X1AEq=?2A2P덇=dWѩ~m=?)9!CNV.p(û΢fm2=YJa̧czfLi ֬(x6L{{ҤuyB`lͲE'C\3*zĦ_~N2m^6OB-a ) V3 簡۞,HnNaFCݶKke=Qbt˫(˾u4Q+bݥj:5Uj5 g*lUS4>++ȧ'2.l!rEIRs |4,9q%kFȱp iCz8ӝ낋Tpk1A?$Q 2Sz(\=q=t\'Ӝ%דd)IOI 06=QnKk0:mX^Ւ.J{T$~m#41}H@FHArº'ʛB-JcІ|> Jnc0ݩǫ:<r[X_mM {OOvVf|ECGe 2ʘb"呒6#'ް7?O~ ? ?wCmWPǷ/%盞VMκ[p:Ӟ}!Ծ'~lp2{V>B.2 ̭]d$4V =G?$mTTS8whҬ)FT .@Ouq}N[^)='i 0&O2aaQRR Sf>ώTrLA'j #Dg5:6YC\F uBCkR֛MBq5Dwyѩ^@I3ӴVWI 0A;;ҜNjbl'_8QԞLNes+02h?$!1j1Y,Iwj(ʲ<_ee1l!hZMl a@G`~iMao9p2Yi`t D1RߡǕ9;~K f<2X9^M*M/NjrhB=l|PXEz=6i=.! ;$\O,:G/P7 QYM2z1 /6heXbD㜦)Jw,/60r1Zor43 rC^`{$R:28/@DgoHY#e,AEؠI(" .P"DGT?bK62F d̙Q0on]+ ꨢF/Ww _U|2)Yy`k\\TRgv qdWK!JI*::1`ivB;;2QE_9|'bw6VD,xQ7:|4|wJH_!zYvUL>`rD@R v$*?k+]] W8, ȵ!hݘU̱4}ݵ(hLݠ&)46/=w**-cI4:_BM?&fDl9NQ<kLi>O%1>n]9sr_3h6}P|^dk,qi\y!\Qڡ%mqdx ᡅr}w<\|k540?Qٕ\y^*|BH}AĞN,O)z#/V͛1xQܽ‚>VVnp83s|D+mz#A~/ɸܮi##eSm*ZYv@Onru.&SX$*DO'+g]X)8U~ z^iVO^G чD8@fFlKBu1(XU_Yuea5 +dX\\DDn̐-1VuXb !>[ dq.;w3ṿQ۹%@`D[fE]%w܅dddB6bĂS4IU661kM" !PA2e B7Wp`0X8 ƇlAA6MvGU* X t 8 1:H/TQ'\tT^Į+`C<8qDɱhuC`rm|\0"ּ"vQ G0W(Գ8! 5NAʒj0/4l$!x!FUV̝A HAB-Th#\ GYĥ0 pnwbc & km3(J) X$B"x că"/XFZd I%E1ᅬSiЎ&`R^DeY&7 WwhhhUDpo;_RGӺ؉R ` Új[\bTTyV=NK{)]@! ;550_%XJި4q횜3@[9y3.oZ㞶uqH"&?=csqs/Fz;g,.wGo*S>`Sr;1f(RPkPB=n> -pQY׶E EFbYxycs+ǟxnW Z /wv++ph/Kv&OҔ>J9ɣ\frBڲ;qR{vuFELgQM'X= ݳCoRL +:Z]U^)sϤs%HTA?B_'t,YU_/rgWV3+5 xH$v~;ѫcns6,ķ#"H"A0OO?!l[Y ʉ;qE!O0IgfBDm }/P&}2GwB"mvTH#[o_Ba"7K2\_) ?{mv +@;kLxb!Ch)u=HWN,n~yЛׂ5tpH%-t*yN~l"7V׽{P5׵ƜT!;EA($!*Isb`اWZ٨޿/fCe~ǩ*Kh߿Ʒ 7`~_ͱfFfM̆Z%YD>9?jH# ,jǜv0SH/UFK W6zӎb.q5 /H?sEP'ʞz>+c2FU!ek@ PCӓ>2^i/l;U>O=!6qVD/8K}Nlo?wwP8.#ġY4cFi'gom'ϡL;&~;~O{Zżۑ|Ąc+}Ę}.yh#KK+)6GF]DbH-=Z.{w*BQ۴ 3Jn8b(nr@zQ h7VkN&)x9Z}=|׿5ӕqSm_hؤh*-Z\S^l笠tA!Džop?䐽V٩boݔ<8nCnAj!Kwٚh81Ͼi>J*ꝎV٠H76*s@x!/9ga`| pcۡo}w4lLBc*[/0|$k22KHl0(vgædkxioL'oR_o'@ /XbFK٘3nnv,@t:p/j~Q3Uwz+6~LNjCDU)YXQ|~87r$ZOv^/եI^tI'$rRV_K2g)䤫$[Q5\3B|j!vf|VmINWr祀㴜]fbApfhQ^m,4oKF8DDP6et<4NG\HAx|k9 @) iy~6ifk=Ɠ}g ͙2]/EwFBPp{fǵcW~3Z-vɋpUݿrx5 k#w唝AT J&'I!8)+9?ހ^mR+9{zDmZ^<ъג(HU(X̏+?BWOMX27V^:RfO avW`!L>I-[ KHa88~,SjgGN"I! mQ)Acwz5ai"mrJ0e...[٘+z3HHX׹-=TTp0G_j$r  bL'#?{5j{LtrĎȊ>D∹v^?kZA=*-xm޺y8 M,x9u'(i6"<{Q+cb^eMdbZFyE9u%*ٍ7OZBYv#2O¾HIz-}"K}ءKY˩1ÕWtX) 1NxPaDōRW"}SC!#EV{-h:eHp)i2ꑜX;Ȝ~3􉀨D/8xwedw (UuH LO6:Rl gaģp~$XӺAWmnhTCY;K0[D`j3]=v=*]ylj/v1$hp @YX iaiڒΟf }<H'"W]PL^O$ˆ F)!,28p&I$IsW$ȹ9WMRYkf'iї"SPKHXjƦ;Y tnGu"BY0!#:z;LKY> z=͕G 1G2o>]6&(+ueϸ ^}<SGqN va7T"Xca n)v׳m[Vi*A_.vJZeo:.."L~Tyܪ+ri՝[8hX9unvG/#%bx[ -:!h*ĉz]zU27Gё]hդ]֕!H/%gWjJ;5Ue6Ř) b0NLଞ $0FnbIAۧ\A͕\Taجu=]:qA1k5}Xƃ wIwO4 Bj(\R$v2#?P>nveIiL؋= RSh0U~Pq R:7)O)m '~ S*D@® 9q1y oh>gqqdZZAijVWm$uGz]UII9@@\D{&q)ˡ@]"e:ݗ|Y~;">~*+ /4Ux6ݮmҫzUp&X`m}p̴^zKUa%EU*Ϳk+ <%R<:b=odrx‘*iK %.i~ z͕60`tڷMAb,I1?z f\%CxNFyؘ_&.6OMY6qmG#G֛$Rb|]e=G /A  "Č.O`mFd(h&FR/#+ d2+: K ]11"snhEu+G- Z yK.lћw[3]R#9ݣy3Eڬζ" -oKHir -*ۢMR. 0rC $Z i3˵۝$U:aTĩe`64ׄ|22x1Ut 9z* 2ҬSPK$͚UGZPKy.F/angular-1.3.9/docs/img/guide/concepts-scope.png<\uXT_EiEQ@;DK::xq~7gk1a*J2hDhppprjpp#^٣ Du : y3NNRL3p#Coetϥh\3B,b * ZK>M?Pib>|bѺN,}Tj :ʠdwP252q9඼@cy\|Sa9&:܁8q"m9R-ȲM1f\nQ:JCS*ɂ/;p˲X9xXNQ,V$Xd;;;3R@8XP~|@ȟ,hj/ д,*y\YiaCf-.//$ cTIwS,rSRRc`@(钒 WN[Ņ,dL# hQF^Mq,ڿ02{~f/u2rii0ziL}s?R1w }G^X]},-}yvuJ=(nd/"_NEL :KvBCDʽ3Oa[Y+F> $`^~LJ,ZN$E1-Wv{)CpB %Ӻ MJ %5ANT6bMG5 FuZJ>y-.٧|u(\IN>jy{%xJ Dg$Ɏ[5j+vK<=,?)[2Siy }qH0?<+51O뗣sD>3 > +>%ơ5ZߔSPToz]~;jTG^;3d%#D$ T7> 8~;~Ҥd> C~efDyf70h::z`" lzunƣǷI_~#c Wik2}1΍R]F`zx2O3 eR1 ?JKgX=Xk*>Y=AY`MG(nhJ9MڰȵƷ>|^o/X}کM/Щc.V(u#1U>θ_*x Ngå tk e7M -8JVj}SDJpH]ݩH|yd4 d5GC }8Q2L'=[xTl]|3٥`k@ lH9ZPG@KO3 ɸQjmN͖e}*iR5pKOÓWKJվY)լ2(Ԗm)1$FhÒ))RXR^ma^^֝rb~PD ?YH'?roqQ,q_~\gWUQ n/m&A/yɻUGVy:߳/(ӄs}YVKi#DъsBQfgZSUBe'6:bl\'N޴=Sw$#$QM0!I`!IO$ ob7: +AńyK;٪X*MiHg|QXA5Ti89@"Ɗ X 4qNJqQ2:bq-*YTr57) nrRB%3oq4ur'2Dz44Py+hj9>#b[PkIS,{%>]'c'y :!A^mx9SޚY_ðsӌ3;81:*?q(zoBǭ} ˽莣Bѐ>i}3Y@ '|0n L8 న|K$҆>4.H=\3њ C.ɺ }bᅥc䙨c;]3 \+ ,$G"$i߷T^Dy6wZ"i:vN4߃ yR"piRR }}6&R*QnZkD++j.{s6(^q}Erhw-XіGԝ0Q jj6ddHuu!!!^m#|hO" &[¸mѫ ?49Ί\ᅘ_QxA¡i(߅gGC:h3oz4x(mrя}pR!,?s_9"}7e>}'>hq1'm1߸}u5O0OZJz/8"xF Ia1͎i!Zw7~{r+I@#wkZGsn:b/gj6I̎*%tݺQ3 _POWmqz\` 8V5P< 8sm y'1f&bGGK|9ƓsG dt ? ᒬ:hET |ڹ0eMWhtbδC#,I].rrlH-m {](00y6yIߑlKьT 2,gA{F[>zRfy >Y}_e50FA@,ybbfݾɭϔܷo:.dVFV;jjIO Zt^Tso$M e{M"-Ԇ/hûYQ*wޱT Põzk}^-:΂D nW΍S&"2 fAi6U4IqYI(PT<ޜ:Y I1ޑё,3*EtuoNs%^?Za5lo׸]G权𬛓AQ#>/dRZӱx΢;gj]YStf ?ȣ g>Ru@o"7x"oײSbn9V)>k&:X!mGUyIg# t!k):;dg1'}2}ƤQQBzX9 q‚hy]-3_mRwҜqPQ9Uz`fi6ᠾ\|ؐ~Wi(DEoG:L5yghlm62Ŗ:4dA/yǐc[!;y„~ÎغHÓ<ח ZWז)i#5MhÜA ά*@ '3TOTYIa|{A'qqɢ2{vUqH79FUv}+Vvb}]xxQº] Q"7pmooQ|Ѥ絠uy}z{4on5 Xz ~nL;=mw*Z'a F{$\MiI1 /qDd8ٳ\hs~О4_spJ';d)uWD7X+ٸf/[RY ʓQQ+|gP;u۽N. 5Erȋ=1 Ȳ{6 ڱ:~٬[:;ɽ/N5'câ^ķ8l5/=Q$SCf_tnVI6q7 n6UA9,J]i]UO=q.z<gGL(R &Vg P# Gs 0LڗW0<%yIv7G]gϾ|^<³\T{9mİM|wYz}CLjdM:E9edTr}eAe_  o_Rx9<x0]7 v̆" Sd7nw&O3)h[>8_?3ZpzWB88x'!<} Z/|+7tJa,viEjDyh占KZ{VH,FFc*I{6'C6@˻h9)7 wzKd }˦Hr{$A:NפBE?qxO"F.+v=3W7_v d 'LQgV ` Jν}ؓMsߢڏNhH37^:˲S-wEGO8ѣ\*2QjXzYd0x6` jAz NŇKNb'$~[1t+`Y=ӧ~W1;*r"aTE ԬIaͥ?eKgi~0>a2Z$oR_7Ü|8:ZcXHff!@ $j.5c J}cmTfNbU*/nbyV?%pfRyD鵵(K4"f0SO\ݚd.usN –VY(FHu\;>De\ 5 IϓLQ'Kb l*$b | 6g*{]T.8ˉ19 u)Wba^ =,hC+{o-SHR6bn^oVW_:zh.I?:'磹naQQ +0䶥sۧC/{Yx KI_ŭ-e 'eegC "W_ҏKn(*2+ZZ 'MWG<SG+ee8EK'ryeAگŜ 9RcL L3zYs5!ӪRE.lzFkYͻ;<3ȗ;pDo8 "0:9sSYc$\ CvAOօ}F<\QYyU^.mmmg^_STİ^~-#J"g4Kb+yd[ 1Ye+ci2Ux[*BMa$y!rq{S NocO R(xEp@PlyHfD-5PߙtBSSo00I?4TH:W`S9@7T~d50EpAzJUhp@DjRVB[w4۟̿ny;}xrZ3ar* \ZZ\|z 2KE\!羄4{ n`Дjdeh0C& >0>ңNr(; 0d0J{xiS{%:EOad66!>&&tQd`lOld1Əjo'V=<6PlgDc3_U6bCsR޿g|oU`(Ý*5nj%@dav G2ǵ='vZ} 31G\ي}99,g0jhq?ϗ {+xeMv_]4d |д-jCDW/"!¦Wԃ8MT7HQ:Z{ WQ y"r(f?uU GbBc%6.3x - V-{z"SfA٦R}eٷi)FY롃?+PfqIRHR(8Aj #x?GkªO433 Â5>W$0kC$֍ۙ[ A$/Tz ݅T_0)2UW>"%2 arK~c=v_omt;Lrwac~F~6T6?un~t.Zw0`! c-+/yLJZ,5˥* ZBaV]^f鄙!iTA={{&U?{{"&SE|6\G}BUadٳ·"f_i?53\ƌ0J:\<Xѵ(OmƤ2;^cogdTip}D4 a' Ih.=иcB\,c{B=kc'u@q.wюg Ec _J B `h8v!-M d}Xܡ]|`xL= ~Rpc. ^UE!v[_ݛұn&-n;]wjAM(.>|?p uނ_YGr Y1!cz {b)m> t;ә)Ca@%k*GGmUtF3kULSgs7 {.׉܆j 4 \b|f^NU ..38Pӓ-@ztxEXW7C8e{'Ysƅ#MxP+ g˹q2̦IUL!GGj Ws&o5K&,ӝO5FoArr#>K.IMK~Ty< `X3lEqf|v!b]9(i}7MvEu4QZeЀkݤ/dùc)mgpYOLLzv=)~8v;H?(oۘQ[ l͇z mYB=>M`Ҏ ?t\}~`k;Tyzǐz:M,qHydE[AyN;|jċH̠'h3 =&&I#4Vb_eFY; VFÖ+}w Sܟ)|f]g-ԹʯG:PPVW\Dtiڊdl>W𣫶< mJp̰Sy[iom<%%aϠUk԰$J dz2o>gï߀7!臻VáܕOrWY1ul8:-VxE7yҎh@ܴDʣRӍUA2٧KAΡ;PVM$AAe w2IO=ڥv+/Z{8B/J~gs-bǂd/Y޳avh ./vlg?w2U~ qurfse~YjXf"涣mx8j~soi+4Ϳ[0$VpVU.4k (ŷQ$H˜!| gw{g iqVK(3ѤILz!CF,*w}Zub4 $J*M4+&TEMn,aV16*u\kT.1TBvjY;9Dcd\ \mڋpӽ^3.E=;﷦v gѨ)$ԃdV[jVd˵w͑b%+$ƜѼC(01@5}P5.76M]5j6ڦy|;PƖOܮb}7e{D ÜC &WMe)iw ň腣0'C\cw-^wŝu-WP9;{DZ뿳xx خ}$DF@Na`؆3Yy*|IAi'o et2@Bռi XUj6.!ڠ2P.PNWEdE q)e$#5H(Vtj{'2wsqHg y|> Rz#%?ncwin]x/g](5+_P0=a*c`+̕#*§+OM24Q!ьD ل~6 s8glIwUOR_8<| <2-3ukl+ )W0a1e;DHyI_! xVCB5iAJ#m@νȼ+ehJ̈́maktatn0&Lh۰Y]͔8ލԘH '!S> e9/]tj< ,aSX* G- Hv\;=]Y%%N&aݭy `kzُ,6{oqYg7oZi@v5ϣ,jmJ?O_iF8jDYF j~pjht34턠"pv϶fPo=h\0Po~nbV\pa/MhfN8gnhgq^ӟKg?7n=y:(R:.Gݿ(gg\d v>WOW͑\bx@RKuL@"aWj: W`[_kSCf(V9Fn0L1^bq$I\u6dHoٍ usYp5,0 .hy L"Kzf除K9crZ{,$%a6t^gf@&eÌNS.7fW Pށʱ;RGRĆ0s(& ߗe^DsQ_ɖFeqptѠyne-E}w|"˦7݇z+>J|HϗE>d 2VKv30TGsur.qKűFNH/W#7׎j^z9kCGzϮ*Rȋqj<YeM8[Vʐr ^שrpi?椭5^|anYt lѦ%n jV<sѫ'Vu'CE!)2tm!l!QSE4-QQGtGdgYg흔\>lcB{:nx9[/AKIWa|OЁ]a4]WBўP-)j"?#'t}3Tfȑua'ϾtC2duNΣ޿#2M3WFF&{Ԏo%5{?NLƚI }5qv9T n簺jIay;Owly"r&,_ [^^*kMƲشC4p K zs'z-p:۴SVs|anewo1dbml0.tj\\qw%oSH) JsJ߭+9ߞAu07IOs-N?dq&oxGNVLL^ɞ+!je(yhyDj+/q e 1qhWŻʈ?E rENny!~MBȑ"p6WgB]j-1)8`Rcb+FmjT!#vZۅِ\6 {@p^<Ít^8t~Sefgz 7+\hn>`}APtI ePSb\(+' '\K`Tr;r<$Q$]u\8 d>ʪIQ"Eɕ])7{_~&HɶbzkxN䙳^86bHύ&CS3WKĨz:fD6ep/|Gdg6BfwMAꌔH$SyQl\nOE(|ƃ 4[62 ݌t*i)!S;5IsW;B*GJz|ě>T|Pb6#3W'YEe;K>?z^gqZ]/[IZY  W2z~7^;֗ݴ,c lϔ_jTq7+Z1 ( XꬿJ28+'W%|.?ֈ$ &[4y>6\/nrh>iiW7*Kxc5Ќ:J D<MP#vg?.)9~7#AiQ3t&dnH"Űa*.0OO?d:7J1 #FʰʌqϏuYrCC NWʵn,}!_̟|5ҁQIJƹfE;DJGE0i}8,LLoqyB'/:ԫQ'&}ME6+WDŽvVߠye[Y^Qg_T;D^!zl|ĥ{/9UE۞(GΑ7![ 7'z3dwu(0T*lBDTrZ)cj䔓XFSnZqe;Fb>^mΎtlii NtJi{ X_=w|z0g5pL+ptQCĀ=S'^9Kz;{)Oq],7o@[^RBB>h8wAiYenh:Sf?^ CC?~Q1G;|$ȆEI*</~j7P&6|  tOOĻb$6 ?@.}$ gpPqiy*K)_}LڬTB?Zm䢶>a(*0ϵdEF][/Po?'qqE (-#1Uŵ܈\%7PpܙriI,<]ܹ,m =7cM?Oe=FrP#3—MeC+cIs'3˾ N^OlJ#"Z;_?yȫ}]4IB,tQ)YMf*_R,jnYt f/<.7 0CX2.i3ep2Q+HhEO*f(B癒M)QT'`'s%pr:΍1ΝJQ!1FU2$a;d1"KM@pP 춣XTe=NKӅx:$b[͘윕 S}dT){7\6cm#v:w=ř}y;a[VVl4'kZ^9Cbgg]&oBM JDO0c~xH@ #޶蜁meie7vՈa Hi7 _Lx>=yuqcưxML׶3xH{(܄ٷ.~9Sn~G2n*C{x@j.f7 Je >2jJ9OhD=!$YUX"'Gov8ݝ_5zeakw*tmIw匆>Q6=:@lo_uESBO#OyS߱79SxuYƚcFkdr0]XcoͽKR^`,US /⾅Mˢ÷a1q^k?Y?Ftnd|0> 4mx2C31X4bn7J*׳lfy }oL:؞bC Y90h4$n `XEZ_Z#adAX3%gR'(BU[bo8qktvvC}[^U!.gj0),S#'cQIqrkYl`$Fǭ5 i)o[n )i4LMj|b MeX+dFW!Z{69ʇJ਺VVmnŽfP]?8 {.L'5%ڎR{1Oµ o?Vo@y!l{xX^#MY{EI.IEGKV_ LeGp)\Iന޶>[P%?BJZyvRA]I+|э#rsɸMIտBy&~7>bvQbr{nNx&Gf\Lc8gθ ᜽2 =j@qOxTܙ[àkglV Jxc6-XcfSe* =T,<3*>S.L *!fÂp+f]{S+xk3W>DpeW{RŦI<^WtUTۡo5C#dvw'YUF_Ei'߼G)4 >YNlj: ed^kB/FHv18@lUVry[r=96wiHYWd]I 4鿇/C]/Pgj^mpy|@e !)n}lHqVEoբR#X9S8{,`r-1OV 9 e)Q ߤS'ij x=^pvnax )N^pIbIR{|S٭m#q'AE Б޸.U^ Yedm(E5_[iF28j$岿\[ h$8nbe㊟Ce[hP-h`h>\L,xH0􄈹ZZ>Gڒ88u j=-6[Lqr|scRұe` qQ)q?AR!Vd봆N5]FFz,aT hg>)'*o.&R' 1D4~XX2(~+7?dfS?-sځ?$=D/UiNmɭ y#Mfɯ`ޝu{fEXy\ø'D#yö7'Ido1%f%DmaF>a*F~Qѥ]*bU/1NGX`{"b k@F441xaoD=c8SW~ QW%&A9uwGC1[ "7Do`~k4Px uD.}s# 0$YK#$3sl{;%S.#;++dnf3 '5?QRw:|-G17aۍo ;:GG#tz9bABdg兗\׎-Jt࡟ivF p~҉иqیj4&n>^5O}T1[z1]WQ[`դsC±WQu % j&s a^RE~jZAEM, /-ݟX AFFFm$9(:u3-DFep{8jJ/ 5Xϔ" >o}'O(xs9_ fd#kXa~,O*'hf-&qHyܑJgmvd~Y{ c;Q" R$(u`Mf-,ނr)6(m|ۂLqՖKbb_m!ɖڱfX-JL#I3e*ڑf'E72 ͌%//bl/{]n]Zqm&KɓxNht4ONre_SNJг^sξ]j& Hm_¾4LS,w"""jN@Is\ޖ4.AZ{L[y"0xyˋay. iZL+ɛk: R1?śYh7w2c3ًB(S~*VevٗnuT>(ͳ`HlaaHLqdO/#r"Tug%''#J*yzޝmujY]"'l+pCP^F''g+0Sx#l=$Y¦KS{Nv}/ z֡ޙã')'CU<ٹ눣?t_Z\ OmϺ=6Ks ;y4=\ 3D2]!M#Ws7?H}CIًPfjm #揯e75n>+g(ॣڨV֬jZ$ff怋h q_Q֤`ZyUUQcc `w&M%U{ICBĮonb:wMbN}^Θ;'okKbc_5Ȱ  ̆=B+w33@];YD9&a>C iLKqǶ9u:ɿ3AqVO{12e&d+zkp8u4olrQPZҦ7d'& 2y*- 0B2 98 OۅZȒWε=s&@=s4$@ Iqii- ()De rmxݱ4@@:P{voW㵄nv ?U$ݳ1SB ߲;9L^S:4a:6bbu: ,O] QN 4Z 8\-ltm#;IjffvyZq®)_ux}pYQiKmŒ꺡9bIܙKCdnpǔadLN*_c փWi 㐝y e+{8S._U@꒒3{" 2G;/aPNfX*ռxU=R&;.DݘɆWWS>Ӣ2/Sz gH{pw>Daj7ey\t0&~+sut=dbzR\)W z]((,FͶ_6BĺʿT"4:9Y/4w~v6N".k kJ)Ud5E7D)eGK!@#hgǕ&_YgG"D'9 kS4*۔ǡעWp8\o!j[mVJ X1r1u;;4qm#Ǜ |6~T:\IZf 5duD5Hvr([0/ں1(d+ 0 m]RWDra$HI ^C'{.v^{tl-R)NO7KÐxRw:ĸm Qw:;gK).ϔVWqrKlmO,EKz*`)--gԀi6V9x_a %}pYy@$j Q&>^sB;"e ZDgN΄7 " 4L0iӄ9.y.PԽx,q*Q9|H2ȣdpP>bt;=̰jH*^eG.8}/`G#fO/U,An5 Ƿk..qaPͧQ,.vlZ!(8!N<7BF@3β4 5gI,MZ BN%>r( ;rYM Zb!VGK",Ki;@юn3JSyDN'8kۥd\:2驢} ef`}˷=`h,-eYDa[".?· Ybߊ*X~72sQ)e}53 YC~ZB--8KDj{xv~-1 Jwp%B*O뙐/7.{4Jy*g(iLp>p<2<O|x#NW/x-PCB*UwvWqjEL| r]~pFB.0%r% J";z"^N+Z-C,0Q1]ɠ;5"?f7wro, 0ꇫOˋL|LHUPY~fLkjZHFPyh)eD^h*t`q¬4B`&PXbvQSn콠Yz4&7H#GC}trfaWt:b^ޙU8Sq|$YGNɄǛl`8=%F,W. i6)~b$<$YZ7qRrߚ7:?F6[\_ܦ br oLUȹZ ;#1 +|{\LE$̉bʾa$gԀٗr^mvGw1Ig} lG\s1ֿԽ,4'i!AAX(HI8R)Q /l=a?vmR?P#njx]xxqt?0І&.)=6dM 6R1|5-PIeK>`;CILl͂prN[g|g%wP[ݢ9hm^%G((k fIn'c92q *0ͮb~<fazM׫'Kgcry8P,k$;(>)Dl@D1P:.j5g6XDoZy&ЪS!{m#Wrв?)w?_ΐ ( O]9dh<Hd0xOOjDJp ~7y ށyo*4Z?kTmFm "7N*NDT!>nXbqd"h"Ի5<v,CNWhVJZZöI!i|Ok؉%طZq-qC@DԥuhYXWiggV[:T]H)t}MʏWW:n MŊWJ ;={3皐a"WE%wZnD}lUGmj ڒ-$|$60)ǻ*^gq/;R*D|f5pn<,տ(TXfM7 wXqEGhExjiLJr?MH;Mo ȼ&>+4)Z=q,Đ8ZoF{g ]iLy]@q[!$Q9V70#m \6~|^U 0)v+Ae|3'M4( Ds9QzR~GAq]ﹲY罣דkK 37w8#pх獦<^g݂/>c2Ij 8CY\>?!7~-nFkR~9F7gq4hF30>wy¸߲#vKZBy-ĨF ݈Zp|epwOǿ)V%pL6zUndO(U.apfCÉB$]Dg"8;"09h:}ԵCY2b=}=A~PFLYr 3.%  KIf 1%n~v[}V <B[D_ W]G*h[` qJm-4g|GT uLj08S,KRsRgl8^줓c9%o`V| ZmeUu *xp E~LHбĠsb+,Qsmԉfk,6$tw5.Їt~X zNW8-SڱW5FL$  u#"LRα+,R]j|. IUݠ%ètTTݑsieY L!{ne vuRC~Xb @[xˏo*f0IgG@:[FFuZ \0?~p5̤uԦJĈZYG}ntiCpwZzLLG%{`Gf[=vBK5 f㻠Ѡ`Jx$ҡ?Oj9Cjf@uv[$6d/lJf0 nQĩٕvF%/b}ǢmͳF(u*NDž KHie28{LϗJ_{OA.${+7 8g=ɽtAцLgxo"^dY}sJ\nJ_եվAROw+mbY n2R6I 1q%xPmeGdoi'ha g)+Wgh\\דZ{Az+7r&qaAƙ\h, ?ِ Ш(5Jz .m021ÑLt8 5C@C^|%p4,4GJ*m_ƹ AQw1|C64!,}_gc-P嚪&E@Wz=JrJ}8&i⶯'}c꾯[d,٤hn̘c>V#| hkmགྷ\v˘|+eƼ$TfnzBc Xlu*'8?W2*4 v_c#* ir|^U7r:jOK=$Dg.;wb嵼v͕diH>Bl?]Y04Ң:%@g#ycTҩh rMm|zP-6_Df1*M쀻PW/Iu&¤V32 O{:zs")4uڝ3N:r}fV;!$dNY\Ň[33DS/bW0f;ۇAAsfKESٽQk$)}%qw 8Fݵ?Pjڰ: $BkB3 \bwssDzɧ?R:W)J/&ny<(!vrjYY;sJ@ȧeb>\DKc!3BL_eu_q|nQc EU%/ #j8Ob.Zd+-QTbGhjY\e=_P~Zˬ :t-QŕHked12w/Mʅ׮P2ȝZ5ɮن̯CaMD@قaĜyYI[/ǸcM.Z~+畖fQaDNTjuw'ʔ1#NVP{E]\gDʹ"Q@gSF]…cD}a]< ;לP>Q3 N\F{56|1Nx^ɢJs- .l<(dYuܜtkŻ]BG1)埑Pbؙ!*qk*;*XQMmb8ÿ*SO0rt㙈\B;Xrت呛Z5Gм\olf2ӰCh{4N؈*zUZ u:(2{Avo-<-ȼ8 \Cgf`槲4V"2%,d7H3ӣ0_:`.Nh3 ^Ҭj2kb]AgX}28YB(Ӗfp՝"A% (v-. 3iKrj< zO=7 *f܂kzQ6IMoo*k.g&焈p69G>PhBj%9 P=x>X(%+d?".R D#ӖSW*$m_B$#z26RL%pUIPQ@6 {XLKo<.Ĵ.qZ|@t^kzio$RG/2a~1>x8!URMx,`xbW|O>wrDKtQBW]f N~qlM]y ei_6>;x~T92"I<6vX28 Hq>G_խ/P疭XཫNbw!9tyy_Clc) bej4Nqe 0Yy>,qRo*&//tFn7݇ _F6<̦4nzmQny[.a^zBX!,@ |&i a4Z&HFGJuSՂq'sQ?c\ڑK*6NeZΚҊMzI5uY!%jGWZ%iDWǩkJ3I91aS{tibiF[/{c;4@0%wL&ZLeDVF2W0\DH k@ĨȢq 3_6ny]$_a@}QKfCڋ~)O 4l9#JϯcdcC#osSRxD2A?uyWWny؆Bkm0~>^2^_o4}OЇ9gbb*> a+H%f.rHX۔n_D #Ip$; m9@ab%B3ƲzQcZ}bc4iw0Mn.=cj:] !M1 bT\}k[IHTk, 2dai9U/*Dyכۚ;n 4yf'GuEM2fut;to(,tŠ(֊R2]Sn8cfD|۞Z}u2&mvZ[SI?ieI7֔Lk+J ؊ǹ};oYuw?CbDQSQvѣj*MN씭o'o+D!6AVe(Ttl:bT icCl3wM yhܵf ю!'Cؐ/Ě9;>GcDϲgOs (z=!͙ϵP;-G3:+WcnI$IƑkl0:=^0غ:Г~u, :,jʼn'Ž(Wo2sk TRܺjS K";q/$"*ՖӾz$Ll#,[{grLX[Jw]p<ľu3.S0V}6nLiY{WLߗ_#KT.1h}/ooK !aykN[КN_xbn65S~:77ΧT(\%:b]bm< 6?ue.v')*b) &:-(dwɗ]MYNMV3`Q+ $͆VB[O>5ݟ3Ƥje]̿#ηX P}@=/x ih.X4l"guqY>Z,i=%ԥk`R)NW4Hhrf q}^Wb/CSSOBV43B!߽'I\˼afQ c[hOϏ9=?uC_bxAUnoiI$ _nМEXs QobV×nGF"4eeo"c{R 諰7T#kP(L*$rDN`'bXH_m9.?asT!"Agyt!5䢫.|ZAZH)ń%:ryۛp } *[m:-fq8#u7lƈz7rwɭ` 2t[ *MAAx=(o@*">x Pd[uB&'s5Vu,Z+-aQ"(fg;^~clBFV6 TI댗]`uWBԔSaCB ]*L|+aFS gK[O<;) !a -:FC?[Ps=4v^%&۽iq;4F ;;]@v&T1ȲYq,Tc#ř+9![k M,*?V  xg+D!{5 TaJkLNFK [\+ɪnf *vO#]ȬBF%|za(eX1L z"a_SrמKIᠠvIsle|h -<$)7ErmX94@mb疻{XB֨ʁ1%;t,eH`W=p˨m :RKL~E'܉JryQ%K3[%E,QH'҃tׯg-%*i)e~ "ߎkUYiIfN&ABc>:f;x]U\Z1 M_>X4~Lr8S>v1%+6J%ɸ9_k T?ZSe_#2LE8o hC\]# %d@4ҡ||@ ^ qv'. U2kidqsc"cZ+I -{8ݑ5ǜ1rz1 k7!_ .H٦1P :#S҆ A͐3-ԁ M Ow^+6ܔZ@ x]xxc~IoFsS)^x\cF16hOSȎMn!4g ?,yM1]루y}>^4dSh P *xpޗeQG|"|IF5 AACl/_xuvXLP|eNAKY(bP]hQq-:sGظ }9̐Ydvy-hh2 }3# 8wj-`Ğ9Z4Nە![qu_'qP+:*[. Loבo^a ^wF}#zSb9_?!IXgpAЮ: q;԰sX!26LSoPް#AT+'=UO$zUYuK )o}6z6)n>Ԭa{E#fˡ؉GO!IR'x y){uyF`5~q.k'I|C׿/=D oB6 !Iix=AM$72Y4>5_pf8Ly~+;wccn&ߘ,*\^yŬȽ8QMa>`??#]h^j俪x\ YcmqՄve ,U`zݐLqpi2ۖR],(JId6;Ùriã:{b=©*y(K+`lpTUSq74$ \<M\<3bwvҥA-z $OD4xo @N'"MvJxwEю{M\[eUa|oW"^ \=(ՍĿZS &DJK7HI yhW1 A06T! ,*v>{nj]a;ȋm?7fN`Ÿ8r :/?_ w-ʕA.7eNr׊yx P%[Z}5r7px'/WY~SI?#o:eH8 ׅo\`x/ϗc=\t; yo2է *%rdY(v,퓇\ѷwMq۷ V}JzA/AlбҐx^!#ƲEfWTD0GיXtSwjh(q},ZnO-< !]/}s{I0*ᨗ)+6ZVAᜅkIf.V='pZ6P¯-,y{B^K_Wu?āIb7Pc=m em<^IX 7<a>@§+@}E@E|Äbd"=[^H#hv.T__w5X^m 0O%5  зo-.)JC4Rx=ۄ\i>?Ac̩5 |Www=J_Qr~)XE^v2b`X?6#ƇPw\`}I+32ruF- М7 d#(M:;sRݍ]q4+x wU@5v>e~\]Gs-QP 5%CyRVUƗ?AhXwKfoi_&S;̲)~ʆ}9Mˠ\*b4Mq^K~c7OAYs7AǐP *= Q]qyTdc~8/h+`<>m"'\x8z~oof@%T?9MM~(!GtP ̇,Wc4/7Ӭឺb) };.XM7Y*=Z"UW Lm>s8!+" rNWS [7";yi4)ʱ"}+: FhOJƑf8 GSmF¹ ̰Y?6gS͡@~\/[y@B;\NT#6_a3*XڥpʸC`kE "3sǷrC,dUQ-JqóF5"q^S圷ygn T?wVj^Q?ޙѵX5|'2zVTx9KSܞM9zC>YD G2 7iX֓r, Zl؀ARFT B P{=ebbͣhQwhlZ4w~ӜW2t:?&a:N'oYzm<DAnDR@50>oPF^h!FP#}_UP"S);(;agHs9zjeIuBHFKCni̶6"sZ+iz!5*p H* >MwQkDZ7']buEBJ׵hMW}:k5MQ3rHV~睺6Sϰ!2#;!-#5yQζ4&w + WQlxbg=_e}*5Cj{"2$" xq[Vvl( :\Ցنy`ݙ^K _Hz&eN'5vh%M lt1 ߰0)BqOËwŽGJ*C n{$6x,?lt2a-N(Lbj6f?w̻Ze-,n.ztCc-xp,$JQP-Y8E|Vm@uWzb%hh[%m+QY[WkD Dr8'/9Ьmiv1b*iph_eٿdJ43Ĩh"j@+ZX$ɯ ;n&+Y##+RGAq5`La-΋vt6ZυӺE8#"Q6@%5дR.m 3{w$TE}#Y)ѿ٦ɧT c²܀ v?[O"zۓ~-tJ ;c>Ӻ7 2g8L  ISS&"0˛Ͻ|*ぞ]vv2J{]r 4GeI'2mRŜnܝ*f,0C,)*2bL3G'(L*&м711Y/M<^$'(awv࢓ibR&9 S~ g}F?iϰ]IIA IM%hi x76ux*A*,$`mD2utT R j|xrMᶹ"ojnxIەgyWf?v0JɡbZ 8N;N)ZfFヂ=Mh!O_.\Jȷ9mvf=o7 m0%76 wHv.owީګ H8]Yiw{hyas-S !Yɣ{vQJYe, E3Mbwl3j7 uB2Pš9'[bPB lZ3A֌@ dh7b$-!@,Ŵ*l@:UJFȔ. (i5lNjl!8 Jwu3]X7Ã_2Jg[^g>#bگJj$r:&=U8\sHብ]FޟI{؍ F X[UJrwqEZVPxrrXn]^tUʄið%lcj-MǏ@+<&ٲI){|-Qjު)*mD/Ѯ;u!lU$6W^ Zuc!hޞ@_T4g78k3ʙHcb`N5cyȗܲx,Jz?GVP#YiJn{%AnSGa&-;CNzʣ_ZVV)S׮#UՀWy.-VIf:Imx" ߾L+]ϸaJW#Z -e@X6{V 8?UA 6+Fl#v)$cmp8c.<=:N盧Cи+:NN+ܻ2]0lpܮ '@Iy<[vzXXE+&YLIKQ Iϱҡ*,1kLOC@*)ztUiЕOҝ tL!gQ*S@|Q'Ȱ21pQ.Mӷhk !)XnH jÔ$=*߅ Tc6d?a.4!e#D8u0A T!)틪g"F - nШm"^YZ{xgy3Myt9^ʴQwj~WGNЫq)V!rzK^"J@I my4ѺglPkE  dj>I(\ɥ7*)}y6Z&Nv ]a>nHL_$LAQjfS-;u:в9WNO2B`j+yMoPZʰ"тiw܆-@Mps>"sY;tY=$ս`htkh1:qE`8:j]bƍj9JIի+r;[{BB#8"( KF0R*|{ W;zzF"b.O6%jnhj;QG,?y3O%cA~^;R;AmL(߁I?Vmڬ8Y*wÆ)֔X&L qGYp,^`1$ٴ!y$ƒhR~`ז4sH88 + c3x \I{}MbBbʾk6rM垖<4/ 3Q( w۵5"o-\鵓z]_nB i({b؎Zy;Hp^ |]g4`j߬NѤdP1T]I7?i3G{x$,>` Y˥yD ]l&"ހV765z`r]!ovS~غ:mG? 3 ^#X 3(K6.K]?~cr?B*)+#Z;+5ESzMJ3+Bs(%4Sow<=1YViZbᴎ}4-8N;?E|aT Φ^& 2/o_+z6zSgY^%\S^1 o!QgןRղ}x6Y`1Y`>nan^`d6"HOhW‹))~g ͑ w @+Ze>yRƯ,'$¼̳ODȹ幺h` Z 8S.4_J6 10 );$E1ZݷD7:0B1 f$-?DY yA-&~r~z/Lm{|hʌ͟;4}kW\̏x*fgI*~B*h'T<^B3l}&5͖@Sҹ 8ӚTbZmF9lKh܎|&L /1v^3'#zaXfO'cmC`2xJ8tȚh<:Q`Qa-MDz:~BO#>W4 >l\JE1VQWJWxV 3 -& /PK>zTDJoCĸ7$FTsσYDalfq[ 2HykQsSg3 gLqfGwqck$<I"|^Oj%q9+}gKܱe`SfNՕGt5[3_cʕs \PN"9DaJ =8tn妉sɐyCbx`@X+VgCפ h )w2֢B&E~y4*&V,?zx_o i*5^vK}_waD&S*!u ]%!W;~0 "񅩐 lik Eْ*jjKe:;SFz$*{}\&JݨXULn&eslP\/U^F[:ibO4n'n"}-m.D*l B y={B*Nv!+ݵ,98=<8 9kW{p-+P0H$H1Cܑ8 ng®DzAAS>,ӣ]/fwMztPݡN;=R<*7Zld$xi7?cNM`VT^'8`-w1~C1'>~"&Xϥ2Cq''BQ^158hz5 p;+^aޟS6ksNBesQnĹbfE Uu]M 9A2ezRr"=o8sDu/_L >Ӱ59np (0S-rbG*Du\dYx,,pZJ2)E0%b2@$1&p~"߽zF#3sA6(XfXT+$IyA Ptval<9R_6W-gm'pPKMr::x)f{HG8XЦCnBSH?egeC҄bF$0r#&75d)V=@ô:QZ31p80TJ{dGtO.A+AÇ\lEk徑yr(&FM.ڌSilB%/) }y$O::>.inN}>rqHAAN 6DWTg&ρfo;[ '@lĵ * ./]  y;)2UO3S) b>SgG"Ğ)"1~p9 dK.)v|qoEwZ/#8ؔՁSd\ < xo?ԗk>|c{xaaK?)@v:`{7D4\r䮘wKF׸źi= B6Z0ыƶGsʏ׌79c-LEa G|Wg3ZkeeT¤fD PUh0ޟ%H\u8{V{Q"b;'dYb|XϦf$ [Gئza|䷌TLr\qM<ݲ My<@E-oqWFW+[K%_*WQSx5*H YSPPXY: pUp_y,m>-5jt]vyB&Rߪ0Z̢YJMY) '6/Jx͙r1.ժ yg<4ZupYy,3-$*H#^}|jQ1o/6_Ĕ )9=Iu Icp,_:'У1~E@֠{ϙp5Ĭ@ 0=Uƪ<+< (a9\8Y j*͍7|7J .OǎfMD٢/<ܞrMf7DP}7loiNtגhd~=cqT8WȌ=t[mLId@+:ccgڣ/Ҍ#'G;|t@~O"ӈ} &zlb@}Up0mސWOuz0̋ /;DY!5ܝln(`=TR/ccZc̥-zZZ02BLj@k{0}3wz^J󿞶$ Ov$sQa9qs({{{I)$5 ~ ࣡_4 (dԭhpD2}=HQ[xy;K5p-H4EQ t1)[18VFHzC7f|v!TpvFOJ[99툗'g]ĉ_B-cqU8uN#ɡ+C(MYt=Mx6 ϬtA+O?aEQ@4t&.f_ fd䝩ቐ mhݹ1Q%uޥ >mezٞgjlUtZLHpF )WK͏u>?LYXFv?r{&)Dj*I?"氝?jQ"}Ugjm^YzWΌ.J՛7{lW¸֍pQlewKsnF 9,2H]2]1dByR*h!d|q>e%uԔ$|;veP:%ѳˋBLnu-6V|*#T.!@ʝ"nUX^u42uB8N;j$J՘#F9=6z )GSK[L$.&;Z^.aDŽ 6FT l)l 2*.5 sQv':Gk2'~*T!?%#+ @aZIP…^0$T Uϥe\‰SjA=AW+B=/f]۲n USmOuG*-b rrJ[ ыlJpyF\^9P/Hq%אF9NA#O`P6O#SlWZp!X7yWz`Zݻۋ>Z,Oʴ, l5X8E"HHr\PWQ1eN'ֿMLD|g$E@>܏fK3UBw}"0˭+${'z1ȣ#\G骋[f+j=>ĄʑsO^vL,}U=BuZ$=7; ur^K2<H<̫PteeTX^JԲ=weaWw]HY"bLtϥ@/uGU ~J!5"Q Ӫ6vvbѹ5Wύf%jn#op,{E5 مƁʚ&);;X=vqBqxuV@CƷԿ$۷xd}Dj@ &tkV -Nn$|N d\t伈hl^@F{_r.&&tr?8)#JA f<tzVɻ zsd0ʜbk`X6`r2Iml{?/ mJ:-Zi eNbCr'ÿ z> \<4 kli+m-3m\,GўgB|`<q~O@;e7ϻ\, Kʈ3(&CK@EZ#D~`Brxl {wEELl4BEWs^2ߌerȾpl'%lnaz)n@ɤɨ?snpϿ>zLg6lgu],=R|(WxHJ1b VF `3mIn/ {ɔ~oQ{zR:uDi;:2AEECvs84K=ʓ jkܹc!zc.`2 Z9Ƨovvl_/n~Y9V0FĆ(^{_p!#y .wß&|~Rꈺ'u+&sω\]=&PB$Xd<[\\4,\qqp@ ϴ/}}O  k#qr 0xﰐi-U/vl灰{ؠGWwMJYDGC܆B7AŬ!/э ߉N9鰱&+uY A8m8nnqm1MQbﵙA'l ^YI|OzGkJ~ uB缼]IE@# Н,X]~|us~zx+؜ShdU4z* H܅߹=C|ޕO5=di7prP^3a^} S4ȕg}7?z۬?+mkWJj7}'$G,)N (eF.T:'a2S.I|0Zx`7pzOly#Hl,m@2tAk HۆGa4d}ԩ-f4ӝ[ԼCۭGFSKTo>FTw@j?dvgSW۪(TvY*t&(.OOc:SqC e'­n u[ gf(MEvzѓ6GyY"Cv֭PDƠ@|i4/Cʸh62:] VԄL䃡$lrv6d"- o BDTXh]`;O*[H,l' XMZfY|~$n@/x+H[JG*j\w9T=Z8Z#͈B%opW?P(^ TDb6O:d@E l1Yvq>;s?Wlzh<=uwDKGfu/r9;Jˇi:inl¯rK16kQ|Oq H&پ́ hDA+,! [-N:FK8q,6p@L^4&?w9[P8=P=ZCe`Z_L;IKGGo~yS\z Ƭ[4D=H!D$SU8bկ%'IkO_LZN),\\Tq3#]jY?Kx{)C6v!E+hNp+ľgq (\wgOKmoF?1q*c .Val ضĴ 8v/ݜ T WESh(VӇu ˒Ek@mpX %W mS}00H Fx Oms]ioy[O >wL['$>CJ-/ELCʛ5^{)ol_ w 0[:Wi)c [O JReg`zGg~3[Ml#jvEyo})Issae]'Û5r^q+=o|/ySSgɫڹIeX >>;1^VX.Q1Ow7.(g=mD ARΘl)P2Ts΁tp;oo{֢D:1,rJh~\."!x }re pP%MWZ),^_KZYf.n[]E`v v@ ֳDܡ^LT<͇>ZM@uu]Oo)*ZZN|X-mm8vG3KUvH%@5Yre,#`G{"߅`"INU7=GjMtL-Ђg%kIp 2 Z38n~BHx[n.Tќ*^v<:1@3qoso,V6=UvZ *a"8X/ X.N_K~KLB&D30fES<,{XN r%{+&Ւ^m [ ʞN5rjO@U9 ,8w4RLcnl)4;MN+uy{A91 c)``B3a?|ą mSQlcr\ANǑ>~.d$g=جxgDѤUaǓ&QF9ybTrD(asF1a#y%WxeD"~N?($'Vop~Cc=q'97hDni:֪f'.1R;;HG2w9Ut O+$i ]Z HP;,5v1.'9^|h*Džjc[#`zϒ-4\>s󫡭ʱfeDi͇M=u:%ìu9AMgM+E35]FG\K+%( H" 8WA8`^Gf[c<5o1zT&dv`{CEʯȄ8>@ЭOl M :> Y^$q{E$[7`f20Zcbz\qs'fo簕 [5Z6뛣hOĔ]Y6jK v^ECr WB]Eb"^;K+ j6AptEȶև2h!EzXM_nJ%C1(8ҥ F|Y)[또ǡydi`Vu:Rt'b!C~Y @$ywД=Q9 In,}!| < Yt?ј*)y( pXTyJx$k/~xƭ@Kdg2рPyM8$2 ͷµSR]Qn( [,<\@B^<`h3ӧ ǿ7~!cM#=5Ta6 OԚn;P|%Y_ _eoSM?ɯ Z$PiV]vq/ `YE aݙTs+3k`r2B5aV3lԢjkIj=ͮ6P PQCC5$fl۩ZUܲ >řESH H;o\uWb$YmXKmj /G3\)+WKˊ۫6! f PG=bC gބBö$DV\/UQ4{E3x%UJ56y oH3Sc2%j,U,X3@8Ц%+I&g.S! ֻ4[:v/ʨ[w[$a`Cc4CΉV&`AbIQF߷Lc+T.6x <,bwJ"i I|ݶ8ˉ*oAFTYX9wW|-~QYFvRTÍ.4 nh?]w>]iE;?Son,|'Ul:P{yZ~D{2J:_Wqd D W0cYfKS0nŷ] ä(oRŋ !HR^jϥ֗·"$TGvnV_aP%X<;TJZ>D16XYЬJ*QE$d M*6α֯%3jϕ  *dkfe_Xm2Y'.lS @DcRD=Loǎ.#ƚ: O!Nmׯy@@ZPEd")^X>$ɋ_'v.iQN:46"L1[nBtmg F| 7esD2.21f@>k3$*ux_B Wág~ `Lؠ .v,E10!?pUHVp/:4FVXEĎӲf3nH%V~Fx'. I\W2G*CHF]o0gdե'8~=YUcPw %e_/{$)C2-<ɒ7j|?DK@:?v mS=OӦ`4U¢\zF]mc`d_jI:FS˜>?1>PqbbÇIS<d](79n,L==a:tg?YǘlDqeoZUHmBRN6=>f7;?~w#Nˁ/uu^K;Fj߯KiG5*Q%i|}~?xe@Z7s`R_sF荇mRṊChFJ(@; Y4:1V5۝60,z)j|9&Y)b;f7\^9G'a+"lnQDb%Ɩ}bw#,P9;f){aX@T9rJ(xN玸22&y݂}NXRG\gmp(s|`(q\>eЕ/Ɇ,=Lגltu|ݏ|K1-@;h.*3! &÷ aܧK!Of#9d1TEњ7k+Jas}|fnH3~##=aMA”ܠa}g&&%xrx@;[{;6!o:2=p&YA d7ƧGh bU6o=ekXv?h=ݧmHЛbcsD8%cKS-x]w n7Uxޞ{gS](荒=0vz&4c^X JG27w9;II.v3Kcc 0 6-G2.|SܰR u?} (/839<=J醣񀃯R[m͗Wg]f!8IӇR/Ls$23˭Aײ7dzeDI͡&^S9vy@Y%BZб;Ӓ\܄'܈ȗwė yK]ŜnO>!v5 #(LQO&F;>ip_HZ&>"nF8S_睊]}C/.]!Xz4gz .`s֜8qAúOʪȐg?AD߹:Vg8/4s<*$B~S5q$]ϾI- NbUH@)EI'$NlqeS.]i2`ezMMv?м#I"=&t.uJ`8nkўbDʒ:,c1sۧ_7eG<ף^ z$0MpA,n1t*;|4 C1gKs/jA2 *)0Hh!G+bjQ{ה|~"<àUfxD,6r[` 8&x՗zB/]/1VׇZh#`o仕i{\U^^o$qpn͔u{UDfLc -^'k=Tg cFt+^-0[,\Zf G7tIsIm@GLهkr9Yr/S a|\biy}'t #a:]sYK73; x A 'Ђ^Yo5ogWB9H(JX <.6>,1Zd pVw<)P}-nDqq$G"qlo7ltXgN;'i{s My]f#SKM{X۔q+8`SkWRN\tgyeJ{Xb_ͲsXnJs۽،;,$1I,BWiZªgK3bt\鯈a}3S턦?wIG'AUxv^Oge͑>6q2Oαgi0L9KpP}FWswF5+ט$V$%V /oseNB߃͈yrbl]l y)=LLe EDX f;1vAݻ/.0z ,WenaŗZ*!U@(ӺtCcƿf4$N= ~/7}^g?&M|޹6<dV>1*O6Aiz #ۙqˆ̕ձ[ƶ%˕`v p_&Gjy@Ӂ3"blOL7);T*/ ԉpŌNlMJpo4ZS]-eH Ȁ87tζ(v-quTYSc +);`m ꇧv-9kj^@/A5%5 F,",tr}vAlkxaI2m| ,|aaW?s׶LR ɑ|YQ (W0nSWPgg\1tLЧ8й/"COHV#:}&wn8d OZ%V< v݊HnÓDrz/$clRDn$%k:3?5!iׇ/.&Q^ ;&$`=5;}@hqvh }a2fPgS3Vtɿd =E.+dSϼ|L# /Yq=ezz0`]8Z4˓Y-i:jmFpܧiB5<|AAhXq *Q5eHPjLѬ#)Qhٕ9tr 6P\0\6Y`Dbj⦅7eƜ^o-[R8cG /3x,c{6⎞IuuT)|lO &׏n[Kdj B]ȽDN|Zy$Nowel!G{z,W>79$?P蛕?PѢ^'2Kȓr+-ͷR ~cʴ&Tkl<[rХ c˺CԎe5YaEWGn}}]>L`tT^M}[z_d i 88rCpL !؃l*yTW˦KB+Q+-'w4u:>s Zr3K.ؠ?(qd%-)Y2AWq&xWtэWzQ.)rnYIy//քȺ}^{" H,fQ` ˰J;0x۩q{C^a:lY-ֳG#ej$WɖT%3iQx\&Jz|o#0,YK1% ĖNػ<"6#!//\ʈ'8ҹ}h20 iӦ0s STlrGJ@(G=ly^6 %q{ܕ&ۆ`:6y4^]Nugup/VHA擘0&.(X|Bt DLc>hҰaa/w"3J\}YREEu\py H]p՗Z zlIs=/:j~-H9Q34ML X@Bh?a=!H|wIV̨\݌#rM#RI! ÔT]A"1 lCCWQՠO HG|܀ގX!=|)X9fǹ >8OT'났(>tuW"V s5Vƛh)@ˈwCWg?T@ֵBAa xC' mQ+!y }2Ãc5lCUh~E=R[^5*Ew+z"c3jx#=e]0"#8FE 6%9t+zRT` 4WB`ޤw)_FȘ.)4qL>-<0 OMd&N"dh+5֜" OpF`nݻޚ9f̴V8|(}vs$+9qVrqf|pEUޘzҔ1渍s[|Zm/PԙmfrpozpEŖS za9é}N)ZkslL,:Z~ax{+$ v\{z:]g-)Û@hDs?Ӹf Ӑ˛ b+)tEp9+H{rޗ?;|^k˹11dI/lL3<>rq?v>ӌgdI ~r7YBvhQaҫñd1xV7x̖ fxEV:FXG\娑Qnatee kqSP{ѥwY汿K ]UА񬫍͎VX}"1Q -ZXP LF=q9Xe|NNK>MMvŝg ˵qTSr|͆Pc}_ ͐KS0p) G4%[ \鬉َ{̆yli 7e&T֪{J>ВɩlUv. VgUjJ-蘞qKqN׻[&5s6k=4]{دָW@-/sdig}I`(*eS$U@.=Q1<[#4 荛aX܃Hɂ/zsmU('MQ m_9KB]v=7eS`>Ada/PlMM?ؘ ,(<-*^ oAZ֎@hyE{e w 4RHjj XZᄊk_r>_Ye8U7#S,sNe4]p:K%]?q;ū/hGs@Я^Ѡ1bnmGX+(xoR.qؔȂ&/ 4;n(bÅt*vV"O-ŬbM-뙿'*N?dOgqmHr)'w-?h%yrt7*9-B@r$o)E~}??&#~Իj҂PFL.>&Ms ߇3A9 JTBaVU"":n)@}µv_8X2t~7(rW͋:_iv &ݍgN߫Zѳf)Dغ/č?Vp(6.)ZFEU ,$g@+5>~o=":(gsq S2I1}S報 JUZ ȏAzjy[kvy6dA>gMomWv0lnH1ӉQ 0@fҖzoxdW5&&0E G|r( iq%At맛]羯['lSvޕF*q+)᫮&4K퓡P%}i# UlC'+Bz#Q/76I (ڀ8NA?#<7VY=La)Cz[{{VJsipK?68\)Q~c WxثnGsm.AІP(!:&KAרհAM՗X C-霩y5 9~3]'񴟬$iקNz}X GA?~Z]9N UfD !,sD``{1Svi7A2kU& `c+W7̧ӨGlyB]3]IP&逜ʛw#MEI\Nw6q2 Ìz/[1U[DN[ѿ"W Msk9a;Q7W0)pEyR]PBZ0h 2B`s:QsM%:X=UrĊmVɦ#}-?m*2z[/x45 m>jӑ0o~f~Wp׈Kɫ\wʀזtM300P6 -BH42YP!\U^rK+ʑL :g\_zaLpZ7'Y'GCecuM %:SY |ݥ8 q܁Ih\@cysa" kNʟXSɷ30m褹[ , O3{oHTbUI2uN[Q{1$sR:QCX/A3wKJEz8N;%I%1k S>ǡGV~ji7Ϻe.'7&7AvhTfdu_ k^tA뻹;|a0r3Z||0UwPQ65x ^Sˡ9'T );O5v̅Ώ3Fr+mqD[H8Q:NYɺ2@z:_ûcDŽ8%` wsDÄx.l8[]q ۰i(;֠q!ɕa$P9O{brxչ,BSIcgb,qc42K,v:g͒?2e"pekhQH] |XK`'Vd^N$-^Q][sQl_ ](z.??+\fLPk `N[5 N6/}k]ЌOyдУthDA&ï9J*{B1,NU`/S*QsL._bx Q"C؜dXfV{nT|d ^۲.=a5`ifdž?懬e'J:6$xrA1 $Ej䵔Y$dN_.kqigty^X_U_ R"%! =4 J7=4 twHw7/|a8cŽ׾䇸JOJxҟFӉ{03 ׺DERI;a`%oD`{*lJ+XYVH}:Ժ@b>*ШoN3ƣOc.4 K'q*M4|a]Dg-A31dj'n(!nmxR ls=?n[FR>&ϻoTvmj MImC,뉂WѶ \WI`בQ\G2 jX'd|cQ]TB-(d!~, br<@u!HK<Rh0D.˥ НxHH!$S3\d]ȞJ4}1>cb*|t_lXCH(VGp2)fJOA)~GbLXYqJtgQTAʚod\Uߊe,_9ka>f.7^32 7}XdzpiY6Vh(L6\*M71GKI|kuˈ)|y9L-}E:.^>+* nFJϫlҗRg%ʬ5f^7,Nd:\۱.:Mr'Ŋ-hlx Ѐo}4}n~h{B[BXomзJZoKJ5oWxxFv/ eS W}ɓndevky{g6}VDm>?Wd Hslo,޶ͻ79_KKtT-D塎nȼ5 JAMƵu@L 9GP0i/kQ绌'3<ۢg(|$dM;\gd z~I@.c9h2x?ŏuN>E~U[J-yqwi (mX>AY(K;]CC]s++%uLCS>dTd3 P/v:FsTƲcB`o#\iCnU[{A}NeFޢz<ԕU5o_1 }֒em_Ob )H\Es .kzFL U*W[شGad^z[\¸QF;R:(J|*da(L )&GD԰%Mf5^{~fA+,lDKeiEA!Sxt2J8 Sz>颴W'>{䦆q3Dѿ6(PК6׀2W9{]U3U,kWʈѳqCӎ4 _<闚z u,T%^YKd>hg6'ZT>3#^vq.~.Mx9QQ&('z??>Є.lH(lI{L/ԙvcqr3[wh\#odop<Q^]vU7ӣ{fOtn5Xn{!+uvk@66+wӌ*JK(NP]?̸_n:`~Ū_t0ƣ_Y F NmMx %̉[;8 Ջ|:?.I M5-Z1ck,ͼݰwцF .uEt/ wyxy9NN8N=}LVm?.In.<:jw_ٛ.? q+ifz~3M.!{aNk̰0^q{cm!gzJdB}?liYB5h_l VM!j|>CFx&+({6E؈^:F"[Fj.S7Kɂ;".>}uvW? '|cjyo/lA6LЧn"elҕpXL\^2?DYA#܍a=Nֆ -943%&]`ĻK_cfj=#,Y`,y w}IlސI.ɐkQAj9ݷN6p,jw4T밳ղYv9 *yɹ({ϽXЋʱ6azဋG.)nr] F^A='?5T͚?4nF3_b<>8/j/8_<zLzjL:$3؛HH{P2n膠kmq;Z1EPO`B@k-"A3h멁^J/3{@\ k1s#3V~?S@j%33c}11%0yL8)׹zn M6r쎡J4 ǏC2dwTnzM)z њ@L1k׹_c8*GbSň`+Aj2e;\4B"$poveu4r&]Hͫ/$fsqpЛu4Ok0d "Z1N,X /YYTvHNP6<{"VL,4E񾇬zϒyBQfH]Pȏd3NI4^ǪTY6pKFT07VgiQyrdg;]nׂ['\Md 2ᙹEZrqz-7?H%R J{>n 7PdѬnseccOc&One?J jʒ6MBzEPH$<3+ rC)Efar,Lb\'ղ&4J )a5ҙ}뫄 Z1isMfV/:uf3cVvzg؆U!FO3j*5 K?kjk~b-#If5̰Z(gT_,Y9n1-̖J=T7Yr`ֻY-W}`L:=/'7X%.\z.5͂=dqHxOD\2a|d"_P&{b^ ;"׎r ]+?AV[ S pVA ?'ж?6<>\o;@SW?`?hHjVE)yCuT#)9;#b(qlQӫV@cAd w7 xn`|ZNN5;XLf&eQ}ػWQJ,Ύz᪗x@A!%ݔ7~(UowT(֦r9'gr'q>{sDo'LgHYo*|M/I1JM| qU!} DԗvZ14Eͼiܕ̠e-IKP~,.,ɔŢ G{_H䛟c~BWm`vNi4e(:; %SLM 9~]>E3LhRvwc8@mp ^G{]LBe$(^bX C5tE7M-VFt{bχqУErΙ?NQpmԡ6r Z r6Kw-֏\'X/лJQ5@2B}Db=Roy?U V\Z..{ļLwSi_5˗!?+gf4yJ>01@`.$[Oqs?"4|Y9NBSUKs!l  MHK|PR^f#Ki"hۙJyӭ6>9ސ*~lyq0ң6׻ gg9X*mҽ 1Bvq][Io,ۤ2&vIάwwJf!lׯ1 Aln_8vU(FN[mϟ.=șL/ERK({ۜրF&Q;j?K+s_뒓s Q'ETo&d @w{ NA҇맗CQOGHJ3|kL%< h0kU>iqcnO: D=q|d zޡ *R-[W˩2 %>!#tJ4}az 9[G͊]&t=m$]B=\'jbU9 4" S1Hbuv-Y0 T,z.t9y 'S(Ĉ8g)N$ @;/Л#LSJ ^\ >D2n?jFh7b v?Ӛt[n5 w 0LV/My˹,2;E|fgqBGgC`!+2 ?MdOXՠpDgg둘f}XE]NB+@AkAӎ<$6&OdA#?eu'0/AA1:u9ћ x5|,/z&\uKo8 2~4 5VKHlb_ ϥ;:#Nm~{ ˳9TA-t Ӹ(Rdx%̨N F 1L |/o\`Tt3! *l|I s$[ӳ7$M ϷFgi xM g١KK@.?ȱq1wA7*v}iq1edb;pV!DzEZX?=L[8Rh[VׯگYT(J򲠘x6mC~;Rb3m_-H| #XGoYZ"E#8ɹj|J$[pQ(o։5e*֕UqiiI ?/FZ::c#cH7'r"E&'%??6yhYer42ka c Ԍ8ߙRVQ}@W&B_FvA n]qȿ1aNYB׸^Ity?vb2+kBkk!H )5-JBBEETȤ3L;\͖Iϲ iWcdPy'PcuI5HG#⭐٧V!oҠ&`;[@@˫ !1T*Z0 %~@t|2Sh~kR"sG/CKmtoAF }( vE6Eí4aS^OKՍs?foMP{U, 85l4x'P\I ,Mx#y6]5sUB'k/RpcO AĴ G@Ȕ֕F e-T6;XT H4޷aVcGܟZP$Ƞ )Te#S3~L|}r:P3O,PvVͮAdHYJ/:*cJd\C1U6Ků"%,x6=˱60ZR^býz&2Lqy)m8fl~:4I;k;e'Ѹix"]iwn&ʞ&"{N^ {gij!EwiTm$GIEo~f-4 lԣj< 8OrРLnP CrL, h,v>KLZ 5\SRHEepRxMUo`CKD`iet: &o2NsثMuP]vȹr"T@&dp pdo߹Z:L=gIYwC:`*auZkd.'VQ&%o4iɄ0ʺݩc妣nR+U~:zeM- OP闛@`G 曕%k,-ƌ}Ȇ{檸՗72E#VR^ՖzfaPm[5 x(&rf)#]Eju/F_ߛ/F9._@k˘f,_[>K 8Lk- U ?:v J>u3ѡQꊝFJ(hD.?kqs`HpG_axEdYãJ !{9"FYQY:3=2Y=Ji[&gwߔ bHjK:#U"dxhXX$$$^GۧR^b"U 5?cR95db}l=;77U9-? K^S\upa!18lAܼ@\!`E᮷Zh/f}oeK '5e#{S%-C/EUR]46v|eb FoLr1K@9{fw!~/Oa#p3>w"e|=Ȁ[>9$k/o=ls*CײFsO!4'KhlÄ-Q<[lnB'ymx $]Jycb#T7'M),Tm!glgc;ꬥdn ȿځcǩ(oheZ0/P~Fڮ_1WmW?0!zl 2M( A+Mj#U*;0D%'p洹~O5`:Oj) DU,Pn>.S v{7ߟ%^Kij`Ő媧XF,"miru%psnAe$TygBp+s@2ÆgFv}gW)ZްK+a+' 0̫Kh0 gG\L;%f:.NT|M7`51X$3UoIðR8_i ;萤2Ulq|!l@frFyso*|/^l߿ɉ}Qn[,ku]XMM<@[3*B٬A.@W12KcQq}UIi8PTEigYKIM!-atto.ژ!D f|C}KQwku`SzV>ٗ ~cJר\y )8,'cu]\D#!h+4 URok}``agJ?%ynK Y)蜝mMT Q{KuNY'\X`-B,aB^JLeNE "-R,a=G,2,Ɵ. Pڛ)ᠶSgVb^E.{[[C%1+J?qٚo5t4m~1l 2 z_Nػ=QX8_~3 &Mܩ3aLfXǀ TɽUa3%i*)Yȑ]~DŽUt@Kٮ9:=#̖yȭl09x MOo2zݚs|d{2%ݚY4c@xJ?tR3g?( uaA-'rLh3Y>m5R3iAuȶ6[ҨYU4;(zKBݳDZ"RvT߭kdzninޣg\r͹N4˜ gh8FH6F=K#r.]Q1#/hS[渰ÿw8ҵ4B gzİАau'IS9 )e;>m]t15%2]ЍY0]+u*I3t賤@Uxe' ϲĊ0fJSiT[WD+\J$E i\/.Ls=`i&țs(yWV3&{BvG|Np.DcX1cùM vW))]1m{,9S#"xdq1MgB9ݙ^}|2U[rseC^J4  X,O90~C?$ TT,g*9cmxCWpE}5Co* +}@̧$b?y<ˏ߇쮪UA>a-CfB|N{3P԰@gf5]Ew8_#VH &:.#?h :F I=|Vej*V76BܲAy/ךUB?Wu3SD;g-bLϸ7-&Lue3BlqP w\~> n_G11T[8F'%Oh.j qu[2.'jw9>ThfxIFQڻ@_ S:oŎǷMB~ϖNa` >}ɀ<\^⡻*)*b7y2A`$yzU͑i!ktrU3&=^__ ,yS^DX>~db(GBJtq)5 ͻ%pݣ0uT< ܄l F.U\Mt)h)ݳ<c##QS]\wSt748wpS"l'5''؉cD$QسD}%<+A I`MF-c6h^)Iyqgg.-6 w(0pxRJ*Ucbn[Ya!jky_H]by'hJFm\FM`2!!aMXatP3 2-L ExUUWtMuSZ4U}}55e*.<<BV VV츸8~muY_ajF\@G) أGBccã;h] ʉFB_HW>'')[P]J[1KN"51?'߾zf}ymB}^)3ZwwW۽ɧhAFfwB6zdXTjtmteW ]zAj|IL.լ>H4ԦLhAeQA7]lMZȒx_z=sEatǀqF)[y[[j?=g%XhٶɖLL5k7f4:SƆ. 1$;Dv Bnh|K]R$V$[ݑ ZM.c, aa8$x]ƽ1]+A IWf6b }׮%ci8~-ʾw'Zyu*3GBO5Kxy[wT۵SrkzLwcQVPP`͈~z˄'zog}@P = rA7/kڍKH.(ݩ$l=KS:8r>7=8S}'@xڙxSKMDOi^:EZ6goO&ŌBfiEEIUđ94$RUcImmdFYhnH`MTU)uzbeepD>IP2afqZhɂS"D\AVoxC&K*yrʉ |:6[,"K'Osʢff(މROwT}+%Eup(W]LީL*Mz3gƳU޽D¾bۢGiCzü#w5)J&r?cH9&_:esW=Ks$[())ϜY'/1/)&geM?5l'UO/0X\Ek! _Yqu@'ft gsLjB$h!WJ%u5IC5ҿ|g{f olQo%ۗ(撼ؑ&ga1~A]Uk"nS'E|,ϳVeh'^awn#V,dwLh1%&j5SXtm2ttMМFIʠ\n[:SDη|=OsmO mRb?ѭQT-وԆ;}ia< gddڊD/KVZXPbn4\Q@zN\N;2n}(-a%/FdZ&BIӎ7Hx뮷-)c}Վ\G{iZ0$dUWC.';(.ν ^TJiqX.SžɽÌ@j?׋]k ;RH(gkԊ ;Dw+|0Vhܟ$54B;/874~vQA2o&*̝vzn(tUka|@ Y#ڿϡ_K&Q-ޏcz @Dbb7$ǦSO[Y=lw/t!\\T]p^t\^L93@RL Ꚛ163fk'˺j q' g_vѯqd!GM{{۽bTҰa2~l v^xs_L;.k,cƊوNa_U= +xs3VtQ5K=>J{E9y-yAIܢ**'Y{'e:͈lN?b&v[Շ9P4v0 mM J'!IS'"9u0^k@r}6ɕ81]ݗd{ڝwgYT P|өbPv{bwd9ׂ(;/FyZzl?K\7̾FOl (=͎&>'OO:C^\l,* ~orۨu= tDT[ihH$-' =̓:+Xui '_NYZL^~ fuz|4OܞjÓE%dԂ#ƾr2G'9jkz[N6qUN횦L]~3dQ~Y\zIZeP#a/]*aa)p{hI9%:MϹPQQd 1Utg$OhKPXYknhaSS o߀u V$Īes35}:*#^6>CC}|oThmZIJ,'տOK͸I̴?.ʆ!,UPM~Xl "2Nkb=)\rsv40o7u/๷ K){XZڟ.ۼ#G`<`;"&,(~V5`Uw8?KY6+:(UonXh#,؝$xW\VF!f JIO/; >GO{񱱊/޴]ۭv ).z@jw5b%5URjJcGi"ϰu_$IHKӛ)oSS2 5kS׭~XlhV~5)>zFAgZҒIDYlrc RRo|V_͸\V7^- =LaP UV]VSiPѓnIBQȵF h S!++ k{afZ%2Go7cp,ﲈ'^0119Ng@?nv];#9ڪ\fkRZZqŠ;1Xq8oU\̤ZdߪA]8_g^y<:azlec;,0ZԧHnVJ~?4נPQR>tdyoMLi!bEӳ>:ḅ##_uGP։Iy:[4\ng<]/&ú@*o.k="볓E. HbWDqq L ϗc *+s5[LdC%#ӜBXa4U;;jn.=Kn$ ۘ9|Ofnf :Yss4loVV,5 + ۾.%w\7z,UȖBЍ(&fGOCIut|Tq}݉*Gh~Qj|^dNNR *:EAaK54YOKKt3,9gSE Xzؼ٤ EŸu~~~RY*&G~U [Qc 4݌?O O>Ex(k |S<vxDD M#BƐ>qٝ\ wҳ[7oj1D~lvhKL@)))3N,q =dҲ~Cbɳ("*g5ҿs_#ܷÃ7o-GEy&2')@>z{x3%zL=~_VML'VcJb *]GXMo_1xw%ܔxtznΠ\OWR^w$y|?p୓糃ED%s6mJvh6Cb1<>ƿJ.4w:jfYϛ2,5R(y6gٯ 5^z蘥vJE"\)m Q$H)"Sm6,7oP3 a~DE.irPP13GIb}%pdd^TWV<2j; )3/MŋۣcZ|!9[;mҡozMU:lI&FU`+yJ_׾ajQ& )@ u^T]A4}zEގťYm% C}h`qȭ1kSbv=%T,nnlc) y!U}T=K֊>V lQӍ{yLWC:::w}ߞn3Yif]I&'سҧ8?] |JK{ex#ӽ:zc(+f] VU|tY;QLC&^`Nq9A>0’"Z,:Aii_KηMM %E aަg2Ѽu6\H wCB3u@] GՁd<,?m\a> ԮqUóHܭעqh>qD``bG6lނEPzoAFTTa , +! 8Tۿj瘩=8_/u:j*݌$wCMSDvpQ31qWW*F"e  k+áȑٛOXX}q1"ݎ4iS8 { T _tC%.68ΛLW0%9E]V+5QGTFlQm^^Np9ڮK[ccci45jysqshj` 3\%$!AׯϢ+?r)kr=X{fwEW`~geɬ\ލ'DtrƧel~w= vjJPv65!,ocS0(npn9== 02z/>4tZU+H Dǒ 7.>)Fs '7͗Д=œ{IAp'~$bD}hkR @`NjmRg,# G2Xj+,DbRKWg_>7ʕlVW)^SJ&ȑD iטN#N~Vz^]ᒩYcoRƷv#!lM&M  >p2l؎$(k.,(`zP9D_|)ŋ(bJg 8 ?v=.V>xƈCkz +A^zfFVr<1 {!r9-oĝv:533W> /2/SYiKj6?b7nx{2g>[-gK~BpL*BXYKlm7P@^cysT' َ9/*d7t4)1v_:))((Kv̸1\S&F R&A'=3p{{TTӮ1߿ױ_LMM}I ĵh CA> HpL|^0 |@GGOȠKpXiڃV.2ۢ]c!Β (} s 4O.666NS'U9ʱf.;|Nf @2/?^ 061;93!$D1Оǹn$_}FԴ#o>]CP1ޣO`$)%d2EA-4) pZ@MmsvRPӦN2C2wq:£o:sg4sm&՗nZF[TZ'(,N竌Qش&2s3%$54x?vyE .ccr|~> ͤàk:u6BImmp\/.^YGSJjk@{ڣgBBBzwtc{̣Q s=,DĴL0z ݼy58xGf-OC<і?:a`{Vf000kb@…trr hkGFY>5EVixqa!E@" ??ɿF34:8(meUt # #=.hT7oh?YypzbHz:pbRV}[U iޞ 9)jj:1Lx'l;Y_5'* cr߄X;>13c[ Y`tGڲ;A!##cTpH ZkG5,bP666ͫš~iP咲} c*lDؙ/Kjz[-Yzo(~BS*3Ȉ uEggM\'~>ʛS3twA eFV<$BlO ::Pׇ?O>3CCCENݫ.x8o%ń u S.\o$i""ĜVd_.9D OvYZG@Jċh$٬|:&lQ~D{_lZi"X ;T=X|KE>򛀐]@C!䎣[oAl 4l-{qc#<5Q<@zOYQQyq\x*[ͥg2y?[^=ziJ]RTח~u_ :;_8{Fw#+f1Gӵ7'ؐDqu1eNV^b&Z_&ѫGE~N3>/.K/C 8 wrrX@ Pk3 ČQQ~A@AA v:KXdD* ]t+_"w!!r?|0xPqyS\%&@: y%x~~~N9f.j,NJUP a6Tc-uWe3Ѥ_HAxnЂ -"M Z/]P[кW,,MO+՝}YӈJ^ ޅG]]ܮRÌMl4 ?2r"*yqfFXXCׁ3-X)#y6~Z}^ha{O(%?0B6>> Q.+Zm~"A2vSz bhʫk\@FBBBwT f@{AntXig?;Sxw>VM{o/:L-IsW kϴz)h ^dF8Aue:!DCk8'h 3̰ҩ͎ٙOZB"B\Ύ U($Գ"a*6to_ؘ6K Fn}~ei3W?RAǏMY0 { (8M44 6WZqqDx{vTtGpdiťqY [޻Lv#Ayg5.ܺ5UEV M{o]Nu:gf $iL-^mnom!/rqU]]<jQ_@+0`u 0x:u ! 3)jn##¯@B!2'pJ! }%Mͧ+`Vi4Tpi/1 %ȤĞZA0<,S[ӎa0"}O-bLC7_"j`BBH4v"lT ;;PQAaRt-7 vXnmfxz YɪYT^WP^yV̹W;)[ 6 4gϞTTI+! /t f*&{aPYPiC.]7`_ݘnx S iRa6g򯁃79D7$>v- %e@ֿ>!؄ӑ(8>K;46g$F1>O6!mE* K@$aƒ|{NJJ*6]NH6¨'r?)o yl!pewWY&#CW4`D/=1@T N$g 0vNQGf}3V,l컄@EVD/!$k[A0qkV.4[7\=c?27~'Fxj=xM4ӧO]6>ӆn-1]oWLL_ \iJIumHGjŞSQQi ֍_џSS:P2s|2W'mS&gN hHp~T$p`d ;sejkoY1ޱtxwC 2c8265>NmS(*Νj@tG@ɼN@ǰAr@NYrӱ [[B7]KjAޏKdv$ة^olnRŠzP+ @1u`dz甸z_U"_ni4MB4"mGj/`@MQ /[ f^nÁL'fHQ Gd ZўV c e5 qn8pHjZM 4ה y\ Y3$SN6:˕Ɔ\(;{˒ǞCiuytkg'd޿g:VLr13!gx:%EEP`A}hPʆԳK`9K~IPVr:BJ%h8$n@, Fvl{V+!$c6Yr0Q I2>=Dddd$5<<]j!S=|e5?DGGC7AQ̿Ժ_s 4ӊL"n}(?*<?b澊?6wtSQd%r 4ă7 AER\pXy+Ap B:hzw68D>Ĉ|.?"ar[h,C-;{hK0SMw٘PXh9 jT#. 3nk(R=I˔ 'm^[< TUGoZ)1t6 h~<䓫PigM nʂEvoX*Fݼ(`Wt9'&NO^N\%xL!UuޝZ\~#c3莻c0{$ձPSg OX F´^IF0G]t^4!7~mn,7.=q3kQv#RUR {vӸthheFzd& @@td1 ^$󃁴<:vȝ3 6vLmy7Ј@.v^y6>oZ_XJ!NO/93m}R'?I_+L/ޕ7/ҕD0+%;lKpnÓGKNĊ-,-臭@U=F.{ uH o}39#ck\吝^C}2J!w55DXT6B bB<~'5Jw}+iK-/^#~P%,ýp`QR=]서4: eĝC5k^\x5XYJ`9?^*u羓3`"YERF|џHz!!rv ʀ 夻mNI0kJ8/QQ?_v[}KJ1V,YVbR}5b ґQܤu&X?ה@yzq)dog~?uWʘ NhtX  ƚ M!(dMem^&HF񛔂n̩/m>'d\\l +* WW-PCo_x޽{ZK>9-CcLdkyy;%`0]@.A''b Nx?)̤uT&z}/LEMI9\.zЇ/yK\M'5e' z)1`VA,PE^o0!\rd1`RߍA~K\ ߳D>ee,Hŋtp*0<߀@"`zV\;;[EDU::c)w5QwY¶lbJ&r$Ot7JWWRh>ȁ{v/`Ul2P>|#nĿGG[ٕ:IJn+)*: yq"F: V4#~-;ӓ T#ejg@mA2WdwJ[}@7ZgoG -O_\kh7l諘৤>q&t@t\T]hp8>ˎ:92hR}%HUS0Vϵ8okLhIDDDvTuLS&\Kye.kʪBQe,sbA'c}Bc;;ߺXs/eJ߾oZlj;C> &T`b֡ݢ~Qn`Xt(߿WC9+"VNVɓÊ)7Yoߧ0\vH&&;ʡBF,Љ4f_zy *@ѓTo2ǁ~Ǐ)1Ͻu̪SLsss0be :Wέrzf0]MY c 7o⨻+W`9}) hp\\$l<̆=`E3 åF 6J,hɊ㕽P+|QKpBa_R\JYUK(Lat.ΪYd$$n]ߥ%hGaVVO֧9J+o9p]zE*ו_7[Ec@Zg/LAW? D?A4dpe18RIxUku8֏݋xkϏ \2A9t2\}n$ȳ=ԱqrR% 5mKeTm[Io@?.~qd\ /;,R}; nP*̾yz{'"ezBmLa%ߋGI ŚE)!x 8^#SST0}3s|4.;;ܞ5*0,! 5(TN+PIH-?eJzCztH'K04;- Dw@ 1zC Ks}y4Uoޒᘊ?bQ\)3 ߣ(&*$):R%) !'bB/` U ځ8/vB̸ˆLm!ځ!Kȉ. G؆7߾}k_uh.E؀Ȕ v@AiNK4vx¤fMBU{/;,d5[t S~xOv~Y9&waQG;ryŵt,Ͽ0ҽf{YV-}Q@GH"'S(sz䴾Wmy\[!S533li#Z T2FEܵ>7G1S>4d+8tGGDDD0é-eM$k,q)"J(V ) EL&Ü ~$:mBmSsFV6 iu IAlN(ɚ!C ,@'$ "yYXJd:e!ssu5Y"Λv,M#>ȍnu˚,{@N5d=qK `2Bw%55)--&T腩iiȝ%[P;޿9OJN^Oburv~SH,^ N9twx7ToG*)<,qVR61+NʵoO44<ܱ HlA*0\66@/WoLH" ƞ= QŽU)aBhUgh=^ p$;$ P8.#}?_8Cێ݇.Ҙ3 KPu5cs''KVh3 $!/}]-$(HwL#Nnj!/$+ywF tspVrsst&'+(ؖ1P[]0%/ӿ/(HDUBAE9A @0!QzT)--)BgwJaaaHzjMH;>ލU"Vm!Lu#M$|WEd؟I*ѫ_d*oOՆaX)FYT{SW: Aj7ot' }Diًꑕ>"xiF'VC<`Z~t~0iGXh®EmhJQlr+ԧlXUgWFy61GҩiY6aU }-F:r.[[>khD#7?W W''LdՓ(']Rzy~:HYTtQwu@ &J.1^3 + lt[|k3rٵn y] b]m޽FkXI{cJIRRV31+*< Qak\a"ntt驩lVV!Eův ?:Wڬͯ0,(^yѳN_&OPl6fZzs^6. #.gGw2CC93E C%ݕ3w}<(>zΝS{_Ӎ~/ -\ƀ2G7.:h"}GzK''.}EUD9;wweu6C}>2>\·C_Ss0 &15~|6Bf9A~o>jꇾ@ӱ //څE571=;5d jUp2/py#;ׅ ǀg}1kc䪯ls#S~`P2Gt9˾o.?jp]O\vr?DGMw<^F=@'gf|]/wԑvC'Q{pMݜ[/fj &tF淥Nra1-d7W8-V/ͫiÆ ۤ/_T`v툣ŧ}36kv^)%MպInvʠ/B_Qv*1aU45E$䴺so//a[O3gڼhfe{ԝ rV4.>egtl#K ̻0>6ћki0gsNSlcdmo_ߕݥY;衮q~wMh_`U0\qSrt`~;r ;fb\Xv'L?:T.<_LPDc.ܜrB>Y(y}fb}w.hɐ~][ rx pyWt8 o i͎}hY,l 2whRHXU raWEH0 ڇ$Ξ;'NƉ`bqi鵐CB/ 1.o޾ ˋvN&zzS oxm͑= ԇẼзk ?FyOlO>Y(& _ZHk׮E#BnR QnIk kGm5J7o2LYIAHaO)%-=h0睸J P5hiogE` 221 vnm*u$#s d M,Om!3@? !ICɓ\@R^XK5AM YY-LYD*A?@%'2$e^=,<;N6T}R*!h Q+yx! Ma^{ްaC%FUS 6{${#ϱeKT bVTS̔^ b"K(jj\֏!f:qt0~9b14/QQज़[듮q˗ILȗ?%WPQ  0>A $fg!fd{G. *0#Tފm+NA3`L~GD|HrI(MMDF^9]DY< e$bХ%<x|)rvtdk[^IXN;ovϺҗPAף㣨G(%v#lhCt|?c/**:acC .$Rsv H- $I);ee7oh^o!%y^'m>CB2/7.-e}?f\l728T]_ 7 C05Gaf*u[.Z{sC`wEtEk?8;4S;Y)䍠(AQp/#q)=8Pl룷P-íJ~|=Q_IIbΞ0wt:A#U@F+)Ё3Q=(]z9U!3q3*MLv1&[ua,Sx)a BR7V0aHDcQݰ 7.I V8IJ/ x9m;P񉈘ލ:}Z]Q0r@YX&Ν;{Y}WCɎH;cO4ѸN;18s X=)w36>8B|Qq?k(8f-uK} ?_ Q@(<)&&;`yy[W))) JFcno7 @ .n6 (3*$pҳT"5u*--m2>'+?{DȈQq$nQ+/H%a(&zʙBK3%4Wu~GfцD`? iiDP,a wcecc^"r?cKS]V>W)z`VLϏXL汞=} "DÀJ ,hzzDCm2T4 vG!q ΟM*%Ï1!R/~k?\߹W0/dnҹ): qy( tC Ä0O4Q.;+'xuW]a75 D>be$Q0uȰKH$48 c#l7b~.{ L))wI}*]&ɮ`A%$,P{ 0? ?5:ȫlWg-N՜"Jc>~IK{+CǭyT#3|gC82W~;5M EoԠS}/q[DX}OPjqPT37-ClY{աC[ŭ"n=pxI8 l{'Nnn/- 6BуT3c[K,| 4.{UzLCU 3Z3>N;`Z9莗aE+ذkݏf;5BIjfU'lG;%.\_q_\\ϭ7_n|_}ūcuk|9"lj*+OqNoNVgrH?ɴ 㒵W={hGOLk^'e9e0}Gqb)Xknꢩ9,7.z7srsά$ާJͯqpښOC@ݱ?oB+ŋ߲\ )rYy_(VAMFJ(Q5Jj|`(=shG9_p_P-CHHӒho m&Ć%|?&q߰|(5Y4R9+4bF(ߵn-]=NKy!cPƑ1=qZ'#ތ}nc/hoH칢 e6e.l7ڸ~Z |{(.XVE컱%Fs2:~OLPvP;\ȸ/` ,Y#OZ[OONTlp/Y*Jsd/'lwBSnkSܮYR?-G_3Qs'{?+s4$}\øU\XRPEҖP>7˙=2F5;Z?jkW.x=)(ixŽEu$QNhh3q`k7GOPR?3ANڏ7c-zE0;|"omsCKidqg_uh]>v5UWNӎ(w6jlˌ<`}d6ͅ76LNN13U}/HP O$[0~e$oʬ؆U#k7֡q }ogl§O )гVwlyiq=Ӏ@ʆU~2ttRu>|񑟌k{TEe͚8A0533g$PmQ|HnJ+NnIAYSͺ\$;lV}"z')t5Gޒ3GBӡvn(i R|K..sOTDB.?+18DظWe `' %dn$gĊ DwH8Y77|R0dQT;o𦶝&)aeuPfQhU7c̺V{C"#aFhBZex N~]Hvn. tk0oڴ ¢Ν}SU [Ї1D̶`rq t=x,)Yn$\Kѱv+{(ױnbϺBa@)0w*UƏn:!k^)(eK܊ ʱc  0?^FNJY \X |kg(H6b2C 7c: 0U}.ȟezc"J&Cp5`c_J$E.XK$K=bZ޲wt.w61X]>'RXVo||'|SBvITLɒ'c2[6q"yԓSB5 8b'%c'q@샼m2DWç(gJ:ġɚL>$?5@r`Zp۷,,4Ձ] Ob .}3M Z(9lq,bVH;O@pUWFK { XAtC `dE5\1&;ڙ-0S-|ֵS¯w 3ٶs'ԍ N ~k0#۱xDW ZAZ* ԁ]xR^ Ϩ}#BX -[STƺ<`ԏ_CK<*M&bod(|)"4Kאw^T7~YJ8fkO+I7 +VQ ^(c"al{ŀXph_3-H`X܊ &qw7;;2WrOSnP>"]5DcCQkRƱ13>A '4Y%gh%)+kوD4Fn@*FY((PlP;, E1@ƂG`i'2/=h(K ( F:hRKjjj:\O992"㵴?./=ro)#eCS雂 Y /R,}bH %EW<1;(h׮ÀOCק`qla7,yq׷U޲e ؿ?Q9*пi\J\6q V~gll<95.XnVB- >d( LtƲ"(IP4_-oĦzOcM l`RΦdf2xyX{K*+AMN!#{ɳP]`|;23B ͊}۔ ^ c7NNn*8 I0?BL fW ")F0=x 7m"Z:*C힄 imMMbP$q;zsg_̍bwEթ6alqPv2" !hn$%:YFӏt =)J EHտ)bRy:ɚfgcehi:#cO^;yJ.W*2=u8xFGܸmAY;A߸{w?p#fIֆ Du9'667ppwe`)D[Ld@@&W|W#P-n!rf֧W;VďOveW+++=Zɯh!fr!Tb`AK3ׁP|~ Vs+3w H5DF27;p-:"|C!*}}TP7%(fF:=Xܩ_mCzkƗN_!n>x}}2;m55y3%XX{ VH:YA`\4ŋC>bY.V7g BQm5ek8N|6*7 W!JKj"2s6L7@b6W†R)Tt) ߌxdG"C(P97Q=gtf[H>f?}6`/㺧I Gu\1:VެޱYb=)-LiS.;eI\aW;?'1(>G>{1 :_DO <~Q ~46"TImځYpIOUSR3Ek_NfUvҷo&-]],s-2cL-ә#zsȓ2]4r 4[L<;1|r xQ3tsx1Ƅnʋw^$-IaՐe1z**1d~G;4$Ւ-P^iKƋMd +RvGԋߣ]$u$jJ˜떠 [0 ;;;% Z.!L 9fFtMOWMΊ]\7ҟD|C$  a!~OLwj}+I& s%<;܀ J6[~$j{—: e!C `K9jtCD0|}@X)ߌcE! @y E_*2*EaM{N j0x8hs!nԭ:%ďWij6>GmZuW./ k6a8l%*9lAy\q~vnUw'gE=j'R̐DSuAϟ'>HN)4X̚P+QbnۀE SJG ~v˦^UAkD;MIn!:"7 8ʊ]Zsoܜ9?6Qgz*u,'-&2kJU+ELwIZ".jw6#f{dV->_0eKݪ ;rڗQgebZ[& ~6::(ncv9=v,|w)xÁsBiY[_9:dA1 tP`҃ ]h~)Z35 xEYp؛B̅uD.<#*.^{bJVf6}ܩMGKQ.MԗΌK\O&H؂&ALwWK4YY6;E Ӽ%Ldqf[xBuIfg,/j5ln !:va@5BWN[}rZrSl@AQN1@- Ǥ<kZLVˮuV01MPg}ʯFKAk0<<ph伽FCi1r'[mjJڢ{sseXǘЖ>k஡GNڒY,E>3;A]f8fpEte*p߫]E#m@##B/`oBPH MY4' =#9Ӭ?Fl p*u \l`bBW ,Z1GDpþUtHE_R(3_Qh7{[1lYyy;]>A |<<,0 JпqCɓ@w8891Bl^Eb+*!&#8|?"r;t8:baޠR2`&PxVOWR"# d$kpQW4vCY+Ƿb,wXb&vqQr)ٯzj(HfwWcZpb#Ob)Ӫ5Q(D_w j ;^Z)4Opޑ]"g"":~5>P((`s#YGʗH}\~wXE=0z@y E#seg!Ia`D'NQJYb;Fsu9\C E IX{#HL$׽|QBaNסLG[O5dENLo oP9!.h<; `% ,.+:.bFK1 `fku`t^m AG:uaOJz .H7!+lZ\5b3A2DMPYt2,EI԰mb dKl@ȑ-Baʗܜa+B;=0~Z1q Aw&}dۮ]Ah&޻J=;̞ҢըuLL|Lri!( nN.u>[W#B#@~/7v5"Qq!J,b&Į{dH5~khq"ͷdX$ Hq@Q]:O!1 ̫g @P^ 1Ryy=Pϵ/,vrG`$s%(qHxWf003>8ҧh-mdaЗpf'973Sd" 5J3GP 1ޞGS ~9FC߾9O27 >kqH4ؔco;^8c#ixjkaZpFۥm5 ص COŬI{.MiTzPE9Ԭߡ\_s(KʆU>-c'OKgV_2t,&?(^kDR}' -2G;Fq.] 'QD 9 eSCbmJm󦾌yYHr;ck0KB延m ;s4ͅCikCBCzzԹp{9;9h& ,<ˇ?w>RHrI3oA$%c[\z~@|ab;HHO̡ʾjtd2'*:y& 7qUn{ЄʮЌss)dFkZ о}W~8[pKhױWB׎zŋ#ҳisШ:ӥUJG#%Rx(9~o2s%'hx-ygHnk5SiEoOJ0) sKІ0`}zՕK9A-Tںp|͙#މOd<ۢL5ڱLz'f.or3k5vd~dk˸]') c?ZU i`Oo&l>D|z_UʐJ(Z*'TX9rO: ;f.z޶v5-f*gUĕ%q?>ojݨ?}{bZϜ;Y#ٓNIaUcɴw_U.֜v>ܳىG\|FgF~ɷ:]TQF굢'{|o6ؿ`lŝFK>?1u~x@/kJqv ɗcǿDW+4Vkqn\\j_ҴtߌxºӭhllocJl͗vum\z29$cbju} wa##=Ew7A=p'iBHW*B_Ϋ 69GJ}CQ?p^Pޭ' 0{RGw#݉k:xs'e. Xvz;5jQiFSdV{w"ߍ5ώeLOOo^6xHƮ=rt,8gϩg!`1$"s ȿu˪utuwjt_>0S*Oukb,NhHİf#;h*:evg4^/M1*UpY0_WCG7u\6g99ϳOh! >B@_Lރg`,m `^0 @@@;&LN;!GhӐF?D+bF ^ʧ)JcI. Y"mh"7]#|C'Mo6K0_@gq3.FMH@@`)#̫˛FhފN]=g@8yReG1y[eYWÅ3|YDUgU3,ԠLG4_տ W8/%A*oHL# &iJ~FؤId7Ui6EbTgǯwQ *L@S k\3ѵ3:%'&&Q阘MA(**f_u)l i#}I|Ir'"+>-MrQ`fj'xfZ ss!EE&C# n55KJdVVV>ә55L$kGDDDWw 6| w/Ă ʼϠUP[{V[g$A& ihjrWelbǾ- u .T8*ٿk½#$#zH)i- 44$#lHHhxbkE2n]¢Ϊ]_? (P1G=ܜp.֝Qg0bjJKJJ>K#wf@Ĉbq&>/9~H-P|ծp,#ێԥ֧OV9uss{IK5%CjЅ6xtqQMGL-$TR242y4O>ֿiW3|eXZZWOodggGİf1NL @W1͛pWG vg2+4]/`D@D$hŃj1Y 248HMCG?Y@>Fk3e,zhZS"A} IY`ittTI J,% Q))5d i xGC r::}yh%=*fjJaooz9&5`,="2*ommO[UU1J|4fſryiU"n4wNNKKx7BZB>?WVnt|:JLsD//+'Vq%1QяP)EH9"aBBTr`a66o=Zџ:FFKT{*ȚbeDq6 b sj69Ҿxd }tfX^^VkqMhq{~x݀ ›~l6zm!% imobgL,`t8Dz2 45+~po޼6Hc/6xH;PkdNOo`{kjbcbbR7tE-Vp |JIq`Y5#-41SMNopQd|)UwMã QT4Pm2Jc}8K3Z'x=*By-08[[ו\>"m7 *ASZ7, a}sS;_B9 Gt+!xVQJ5drDnT HL̐$t8xNjk๴28OORQQq\Kx$]llm OTA@E AgzzsplM9sR2[K%Nd;fKK e!K vY/ϗs_:bD}?jm77[?[\3AetfPR__`:w".y. E)h*QP]ґ'@;2TR$.UkbfvG wx*;ttnD3ス-H}i*sQVV6]iIY] .sDKO6T X:۽BN\\OHh8ˇ#޷,\w_̾'ETQyHGGG[.\v1!`=*^9EB_IrEclg#@µ=|=U5R =Wo06w* ֒ȼ^co:MzڽNe\{b_h^^Q8<1a`#]SUe J$$ BnFIYdi00(### Gq_??h`9^'6WS~]\667Aa2vOr|r4xxx,֛& sFH()(>WVT=ԁZ LP5OyDX 0{>`+p?eX!ۣ4jkIS1>߻=*¨=XJ*0=b*^ɐ S+0)|AB4±<]m5S5[k)26*%CXon2E.]EyLfGJN1`ڋ.q!74p[xi}9{8i(2;<ǚ"¿;=@8(k͔&aq48r$a=ias:X&<ju3e6\`د@XO"8, B]Ezq!]DL6t\~K&뭼eئwg~}v:V`$b}kYGlcP vMt5*(9'4 Q35>}N O~q6tjCnqd^<l4G eT=x!=m4+|%*?[ݛE_ $W"<Y(($}vԶǼ6O9pKfkոT]"[%\[rb PYM942ɂc|Szht0=7BV5TwE'zI'l&CC˃C{ǩTң8Ss2i"|OP0dDI4[nfS蕺]#acΆ_' &]S$/~UTjI%%%1j3J #9S]@T(@G.I,5A:W]6Ovht JfwcQ% eVɱc=Z n{?vf)6T*ǯpqhlچ;}gK¢TWF L DP~@0,on)Vub QHf`IpYFŶs 6ൺ.s ds]<өfQ"viLg\V} ơ1fmM5ڧx5NVNW_mS٫ܷ4b'ol1i|?s?f}9;(fg]wӴKWya\=H tcO@#|w~@:DmFX'׏0wF{J 'jݛIDƲ;0S)652]|DGRˏdTiL1_.r:@;{_֐EeRܫ-c{Ƥ &v6f.>8QiA/kaFEINǃ0ύiM&5f M6Z=9Xc'ONl.vY.O%hؒBB||=#1v_ZwTj]0k"LKlSNnc93.2 rA_ *@]%wnwaCit 5O Y `F1DH~smnn/oN!!)w<0`:.hw؏[NԫB#ѧZަaE%'ngG֗<=9=UEɫsr.b=H5FGEE]Yh陛SylϲIV̴H2#3VU6]S_]/aU1ZUxǓnv.UPEe=\aD[|":ΰn:mC_@:Kl$jP{J,; >sk_ /jj9!K-e:s_Y^~؞9Mu_b0jyi fϔLH Ohw6pM. 㕝4{yGdjff,E~aEK]k,pzdayq6c2Og7O"}jl1E\%=jK*ʕGϜ_;ܨ4 Q=#RX9I_4{uS[ f?@44q Ac6@@utZ͈JI6 vv9(L[%⚕yb5kȘ4m_^ucϘ$v$܋An,h7ĂtĶo]!*goi騈IeUkΓU!VF%QLo!7;/׆ID hBy?kd|7τ8ζ-^ageQQڼfbPTќH|M:&?ML$H7v?+ ^OZȸtFL0Ly_=A~xi_4-// C?Fp$x2$'rutP'K|eh?Ӓ,vdw_˴tcassӒ*DmQҸwx@e@ f^]J38iS) :dܯ_@飯|g.&̖Fa ZO}]NCt}fƐ䃍lD_p|; 2srv2&&¸RMQ6Uc)5:ȟZ,mǨ^OBv nEIbKRbJgP u ]yaoCCu-OfO>iyĺ=.@V{5\գZ~v O- TH* 1lAeinHo/Sэ Q'ib ʐTHxF&&M/QnK$&,v۬ Yb*ْYxK9!x `ԋeSpӸ]ޗ (AJ={<=ɗoLB<'"|kRۢf`Ml&5L0&*t32* l鱮O nzT~DB[Ku7{&/Q˷ẕrbm8}i KxT*wvAG!)_0MY. MLh_̵>Gd, ^<*4!o!g2yV'XqyLZ$-YM5W6myl&id[NfW!y^Vo۷o'ً:-@{ܐthŜѧt_:s5=b/syԳ>eFzגmgm`o|*9%{ &ƺ+2\SmoqYMB? |xfa:zoL4+@0P0zOCǔ*qD"N\{aN``31:`j>l}x !nթ,x+K$׹2#*"ݖO3xD\պ (hzp*`KLk:дu,MU>RC{X.6H 11]Kߑau~޽\ې^/~Qw2oMEC[GYlⰩh#t7.E=Ti@ⱓ[{r^jzTHmM}S9WbUg<4e"c#nBٮr5=4 ꞲBR%u6/rJOx[w){)Zb;e;vN$éM¢d). {L~ QÇwQwV^=oک N֧`?Q%7z)VHJtuz}Р6dbb:bX(KrM?~K'a rw6\u3v,Q]J,wLJ@5ڛw+~|Vy>!ALuH@9q| .U=icG(b{<}>҃>>wp{FMsF[gx-1]g }_/2!X:Dpaiwܭ˥d tz~CI( %NNP{LU*w5eHд9$gA*]Խ~qhSCoзP-ĺa|$ sHj|ToMğuހ3L嫫N!97r?W~̓xzjƋc !g/K&f30I0sx VSduiDž΅ɩȬ}zI\"BFuT }V 7/Mgd?קQ'*&je1fY>5Nv / hA$&FEF N6RJ(Ԙ :f?l{*ɼs$4 R,qe}KH~p)$5椖"KD\s5(Olqŧ9$<6BN"K ʹ _""*{d?_]]{W|T`xc# n\ZRoKգ;EL峔8ݒ7=\T)T<5Pk7%3[<H B S.y,R !΋,!. πKRmݒ!|JʔoW}e"l555&kh'DvhJ4q(^84jASr-vIH۩ ؆_z^5A@zHidFTTxg#ŵĉF9V~?hQD33J,_l.oTen*pyP&[*J:BC0/˥si8UO!A ()5U{ =pgo)Лz->z\ub \sR`>ve\AUYԮd 7T|p\ywakz>[:v`6[[+6Bv^Ꮺ̌(:6P;>ڝZI ;G+hItbXLLm[LN6k.T̫PנÇQy6\ ~ V<ŷ!~9+L' G 'zzҾ!GJ砍J{,H LP̛tD=\Dm tLBiݟrTiފFATwC3G( Mކeq*z{{_^ڇ jDE&piBՃ\q6ʪm[|M6r<@ 8uy8׏2̪v3.2Q}\7(#긷#ǻsqtusyAu Ji[5:V ؟ER#qQ^ւg]T2]_mjtB٫AzUEiJ"?ZεLN՛ Ts0-?[L 4_ }[J\sbLPyu= |'*&&!QR 3e jPJ=d}x| 'H 'SO.ڢn9 agXCL0wͭ!^rm0MY֠4!K^FfZcr}&57BaB7p/=ӥ{3ޙ5qȓ>l,=BeŁvM3cZUL粷ףFU;W^D#~sxx.Q]>ht#1tԚ 7Dt$pnƘ})͹)_ՙ110n 8:` ȝb:C0QJoV]䂘AQbtX\`h67 v+-B yRu6RX\yb2[=Cb:=_JL3qpڍJ_b U`dR,Ğ62atgxU<ۙ:mb3h\zlwn'mo EgMݯRs,$/Sps L~$o58ٙml&8@Zs**a:8hjIu`r+c0ӣ;V{!(Tim5S~ CcDVv-[,u5,+l~qصKTn7%̬e:&LT4һ7|XBa:FH(. xd*D}рWkwHB'hF%NbCC\1P+ zth1KGiun\RKk4Nu 9rOnVg2KOK/$ gwsWhO-Ct*E\HbxYx0 BSjh@@ȈT,(υO "9^؆CM4^z? D9$P.w@{Ve4AEkzMpnD|cQ-PR>K&u.K%RU! c A\ +8l2hjy@p2 -f QĚ}A2˴߭/ )  Ó ϜvRvP ޽ {' BP RcmJR# r466s?׹yہV uffs5fљC'Οni[LG"%6藍;vvf^*5P *) o!>sN IqB]%]v yiZ󑔩G:UчΛ)oVJ u2YkKK@%H@!ܫ:Xq)?d@@jX_'$(t)A*Ǥ%Ymj]4&ELE`xTVeWAPDjKNz}[* wO@IB_ vh'3e+v_͊dAA*deD$$rnj{?ƙI| y~Y/ ->J[EWU$2h@٤YL..r9)N"SgVIIxj<?88`(Xљ Zi"QbN"?3?wQ0 .bS'23?GWTZKЋ1azD$*&2P7N?cR:ݨ[<>rq4mS"pd6d_;=>$rbjDD͋"QѹOPFE6]-{]7 jl *KWq%k+09}\b43\ >M?݀Uf:3A<75afi{H@1ٿcH;j!PCStkFd7haN^T]I"Z.fU ҏRB6QcbugG .7Ɵ|*R{KP=8jh?MćHbSa+㿳,(]KyEF__x3TGGȾarRJ+[Ѕ|{\鸽RHvA;3I{{ JhۗF5F֞V m=)ddH 'POκp_3H\ 儔Er1 `7kx뤗TA<}5O CCG ̑ev^ŷ GfqK3;rrpJê.TU[Y!-r&~~fv~^0:9TX]#3rr9!?_7BHުꮀ{-=j.tZo k^tINhM!d38Q/dDk!2%1Yۙ_g~ G㾡DI@4`zo3-~__Bp(&{!c. 䃭V =)JE.^s@#"޾_7GP!.j-1_QGujVxd\ P*O,X]d t;]wwwwwu;LMk{zN"*_1+/xr{ 0h̀V|&(d.c8f~R\"+Gz?X@ ܭ}!tgydJh* 86z9s4]X9o?_||hTU&V/nڼ9bYI^lG@-#XX8ɧuuk45 CL{`T~pt|J٥L<ʼCNeFmٲꮚfl])}^IIxd$]IE8b2WQFsz(ad-1FW&̝S_BOGA ]9ԫ~IA˲r{ki?HUR9"bVY_a PBIJh;XcvtXz{L*Oe.|*_ zwG g2Y4`hfvx{uƎr7_(LY "y^}"ըiTقO` "P*# $;.4bWPY" x⼄|G9%WBG=oG)RCʱY|r\og霉jc|tXY]%pɑJ?U`=f74w+CBYddݹ,E8j5U1x@"dcŶ.DOWMPٵ}HMG'(l؊V"&.j1̍u$;Dn`7p3Jr,lqq[hZ2( #> !{{WAmn)I+b:PoyiN~cDlM)5?D8iz{WJǀ$OEt1/sAG 0`5ry͞0nĩͭTv7ĉ;ӠJ v;V\SwP/i{ d@YE[Fݓ粫ONy_ g`] DBa"O 2@REK*{y\bܹZ&*(%*~X{X6 0ȲP:$"tknIR'xHC#(ӫ'$`_*RwuŏgAO6Ux; ECx^|=ܥOR TGyS z}{Xp޷ ̤o3( βtGeQ~k$iO!"Z(4cfL.Aj? rfazz>'SIŖ|YJ>6$OFpAD8^ qÓܒo2QE]=yd`.]8ҼԺ\t<5:o]陎MGg =.}g:ػ:&)"|;Tcd3 :+&:Dϰ7 K+Phí3a:o'1vg1&pUI+-ď@8_n`xz 48Rq }k~[hb|P;X5he׬M#:p0;;s/zŽ$$ܣyկԚqfWoogR\XYI6i``WS< V hW]]f I^*֜#ǘx48_ /*c A c}u &8ZϷ3up7R*3}t eL-0эHgOe&ۥi)̒S  wv>p9䓪RbU~LLǢ>teXFl9~hB/ I5kk.2ih'y_?Ax8o?~!RprfYc3Rss%(.G>:P` 2~%k H1\4,i2"3:!ϰ "|, ^2iЄ|DG1ЁP/ >8P#uI{N*5Մ[KkԎ?2")IAu'HBE@SMG%s9 QX%N򖼾}*@o\%:sj*o]`3)t^We57D@z S?>g`b,+0_ cGMf' ׾kuSA0l9nhKax? #nMpcZ`j WUun tUU`|`QR?vKȂUphB4 Ealfg#UriJx^o~0?Ɇ^s:x0uoȷaNv?Nd-b 6l^@WĽk1aK#f  67*i KE uMkLb*Kb]S1Ll{l?`6v<B)AkFKI0k* Õqoё0s[Vy}>l8 d.Q`k1Ed%Z(ʨe?X 뢒K"*-av <,.L#1oOjit?}TߺI}P]O,yJJCi˧tSX_ CG̊[CV}]D1)j"E09Q#ung]ݷxs;_YLc٫YCK>[eM*܅Գ]=y%MP+cnD8g];miYqK4W?pCn >EϏ$.SvK@j BcLB % <›.u8I')'BM4afsX!zzI5F[DZ5|8̇[h ]|(02#vdTMALQ)oڲBݳ-/e{14YQPg SDAW*AeNlk17sA Zju`t^=w2@ͥfF?w@FvV)Ld| % EkwiY߅;4 XY8'G= m$ViZ6ke|?Q}[D&Q1L NNdIщYy&'_ /~L=l,B4WLȷ=Hj3+1[?;s|Q8d 9XFdq9q+%򙪷:'e; L ={|Ӱ;_}:K_xFƟu85$\ P>e4+{Pa4ϝ)ܤD4lAȋ{m6tL}[x0x^թl٤獡@jG\@:(Xb}ߊw:,?F۟쏄S\nvjum۪e?%DM\F &Zsc"ǖP$p2 Z]/^S-CFfh$̊Y%2~{[A jRqZ&}1K'vvP*{O~qIɿϦ`pmBo_JRlqAXP<>z>+V3:ۿeUD7>~_lQl+:K$2 ra ,̡("|bO΂5M>MsֆoO5t w;K VV4jdf^O{A{<\=33H>Ћ'7;i^]6fABJN7Jؠ*13M45l1wsdOV+v\R61}+Ko*_nzK%`\[&Ojmē/'ocg7`Z:0~}rv.;޵EmwWAe ^Y`-|X%V,Ae 228 eǮ%庯j!`5_ҭcr~>>3'<0)ʔ/# ,XHod_lY~>8u:Ђttң;S|tt 19Z7o/9ǯ1/ف>0m||X Q cSm6iɿg@@Ey}JO#B`  `ts{d;'Yk%ٮ{%\6@뛈fc:#v;j#IFnRШN+Ј#Bزy\  wu|y> Z<>2QBƸ$/Jlf H!1㬥=SA&Fxx߳&ͮgr Ljib̿E8)LVkg%G&1 33+ ^ĆZS&|[s;7.eG8if~j& w*ᅁh|3 C/ptӗO%ia-iDŒྕr`ɏ7IƲߗx6l7!<%k`ߚ6ɨ)8;cp%A9Oҍ!k < F ;LVR1tG(^0j\'n]=wL;X6 yLVtƫ2R k2~X~i ,|;z8&g̘r,O ՗IKf:8^v"-w s*4)!W!Eg#l3jS%!nS,%,H ȋ*:>㣰8y.zx<-j cya?'o٦eIlH%t6]j0/7#ZV=rUӼ|y#TO#d "8TC]FIz\trC/k8xg^'Kxgx#KS K@&sGeP,1 "{s7IڱO\\2-)d8~ n}r惉.pD꜊ZLYRih TL`Y} `i43_ū@;dl$Fc2Z2 i%چM ^q6vq|pbb2வʤ?mܦ'&ҭBOU%Ⱥ kvf{J*p񚟬d I%}ng]e`hQ7rf_ Mi7GkWCTKm<˩fX!B5x:]H +HT{0=@TRY&ƪL?}bQxk'`'ÙtDQc1n{s5f#bQ go _xoqa}f0O(4{/񈜒=ᓴgL<`]0xN!TD2yZii+Y-}`8BNPxdIXg!백6,pS\&+")'Q;HOi._2X_FMlgyeŇM$-⻡虂 q#}ԁ93묮K uP)H8_bOvbBQO\Gi t i'ueyt5򾡌JK Gt0x]mpeD46;+LG1x q25/h11vkw//]02o0Wc"5ɆUr_?1 $@=P>+2r]Kԏ+@'k=k/5 98Tتk>#D"׆o̴G 2Z 9^{[aT;L/v&קrҼ>^Dɉ5kpSP-\<΄7NvqPl^t. " 33s/+RZ1#eŝQn8/_"b`AB鰝;<QxYb㚮SOMabFaT1(_gBH3e.&m=~4B}e}$U*_F$uHzO$-vae!!ߦ+k0)J QE?;UCrON2 0FKj8?6qwލU uOT4/>7PD<$9ۂ-WߌWI!zu~]}L|cɪ`?OM[nߙWzͣRF>&%ǃA}X&ioC4ܦ1'RiAF&Roo5ۢ@,yM4)\v9W+Kj 50f1}ـ<[v*{}$n3]6ݟTo.1kN4pZH!T܍VLJ.+TPȈK|927K]_E@7kݬ瘝 L𻺺&qE<[Y[CB )MK|2'7l7lB9Qj2KM>DaͅzyQiQ>$([zӭ$|^LHe}9{2ẫu u($k)u/%UUPRfd(*nvvL#lMĔP B8Z8}hdt#AHHZ$g1oBsLtAP>pU$߳t/%RU4cʣgolϩ K-`Υ Fܖ-=2}3~^sXW¥i"`8OZu亀 \_K"5&Ocܽ&,S ix YMGryȦ;3vLPlan/MoW ",C]jqU*hJ)6!GgΫh]WMSG~ugÏ_լ13!!\8)pr SEj -[ĺm,NwJHj\0Q̗3Zs+tvJ_1s v^?>q:23+!uV ?g^ ,Z_NnT^و^/ۨ7v}T NY75$R[šHWE_hHI-տqecHCV˪+mNvgR֛ɦD{UM %!(p oBOIF1~:ĞX#k+Ln2țLw૧\J܆q&7A9q^MMQ(@00D#I~B(uNPW|RvFWli? k]_KC7\E)y&bZ}[>p SqE7z ALdɚ/C9;\yKAٞv 5V! vuHGy YiB;]w:St)*BUF }?ƏTwf1rY_&!B33`?RYJyr`~%"ɦQ6ϤNhSG7 ;LP K>HZ4q/.9dsq]vE >&h-?|kDYaSfۢ|Rvo@H)7̶#@]1C;5d~mhe7@l w8X݊dϴpM]j2>> 8U{) t SMvKJ_,ed(T:z}AQi k4`8|jO={UV*es(E։_)8Wʮ qA/'2w= vQ+K` vj7CژQkZ5Lt~J] [d?5eU ·zα@0x5a% c}fy2ND>g}wȤ x3 M1a%U!ٹzZG:MʐbۻL#l~fn@?bwY:ҥaWR'\@]꙱d}o[>v[8,su'򀾿'5u0*MD7{"4Lqˇ D`)ɊD;g0OܨNk!5 \<kuV ±gOnacC#E"A8M2/~ᦪ]SXZfcsxQJthVOѝ2 8yZ ̇ߜxXeɶ?t;åH-Q-gnK;f!vۖFMo*-SAssIBBVgKrZ!5g,x^7΋E_"6/gue hW5Q'=>VRmI畁{d.q?0F4Ye`lfnl:~.2$k H9-S9c*>ގI\ skIˆsRVf x?(5#"*v*KW^@^7dTYjpa`Mû[4Jӱw> u2p*DxPM~ϑ8795a$jT0U6狙/(r0ԬGдo\v*Wvr)+{Ä6,ٟ#.-Q5xnh!X7 r =e)uC!+/P-@1ق >]yG( թqX|aHYN:*_Շ(DP|^O"&peVoj',dJ6t>IR48k`"hB$8|7UNc$})C=&  b8z6@화b1)^TPSFV8rPG9 e\q P'tt[9 ҢB`FA hac+/`?M!ŵ7oUq"M Ԁ<]J;BTι`g3:o))ͻe өHɧY%º6فxEKwml% D\ t$*0ΚW}u=#-۪ B|y4#T/z/KT,KduO6x> *jF&KLO֘~ x !I=Y?w%$|cUhrQ;{5? Som\D #lf4 ;w\sY#]+19{} =\_sj՛/7T1B2=?ȋA8X>{ `|<$5DEћ!Js+c UhOygvXu?3iR;1[q6F Yd)SEd+Xx[䱝fo!&f0|+E21pXvb2'&c+ǎHēPŚh[u l^('cJN"TkYGG'Ԯ7F5|s~0inZN~wbG֠+Jȡf ]&*)3<8ڥs)Ao;_>keX>U^ẅlEX„IdmW9۱z.p4|ͨpƷ9^T R٢nW-uPBIԮU;:XgŠU,[Y1A;OIIYdkEK𻫈:NY1V 8$Ve ژH/˒Ϣbw Y\P8\Ҽ̠&VGԖ鐟TqK~H(a q‰O DCUⓛzH9q .CΏg|cRvu|޵GS`B*  _]ۜ|?t0~:`6oTnc7j?L Ze:++뿹X2S9EKѹ=Sv&{2$Mh}0rn25@!H'(4ǦEJբyop` } l/Ar*Z቉2͐X @Zzw~F }:U!_G7EDّ/mvtWI=I%.!~)srpzYBArt\H,湻梋82O.SoQ> lZ009t DGljO!cH;2$ٝaoD̘%h&+SYZ :'QTDNiD1X^&r4PF^ukN/NFd֪IۨOnK-QaJxߟt ,>tBtiu[}P,ȕeNd˜IN xvmڰBEКe` iu+G{1%{N` ϳ2ƴ(6gZ@pFJ{nk#Ⱦʹ9mŠQ! q$4ϓؾ T.3\SjX&TxiN\W!b|Yq@oh(WvHM`BԎ$75 ҇4 Jk2KKOw ,}tS;ĸ d+ׂ^ILF燿G82*_K#NֶXO般H/GbwZ'FJhtdTZD)J(Ӯ8kk: D ~{1* w"ם;{BIOO3vxY[ىR39_u?.ڈ>: IqJ,X[>/㳐/ 9 GɖiY1k6c'|L?:y^cU`G>AN8:S_Tݒ %z7r\v@vp ߑeᇧt}*sϨCnBm_ Q.6#\XEb4,tbzNyd9':ұQ," 5B }Hz(BLP'h׎ږj0Q]tƅpBwDZ"r._Y̤X9.' 1)TҔG`<_bv)G(0* { iu 9P7};⮺?)of Xg|OR= ke+XõOZ__m}e@U5 t EnQFZAA[{G9k5cI[̳^nTwV=0=P2nSUe[|%)<6{'lL1TtC;V<,_ؕW pۏZ.\Ű- _H9y5sH5C46!6WDPw4o¿zGn3dlՑ箼UIn[U=NIܫzݸt2\Uaa+h&#lo5}3b1qKs*}f+dx؛ ͝.ccs9 t߻yz\'V@.5=44VI(6c+y"OC>c2;D~x@&,LՂ!XqN{'mtw֏^Y-UO x2mzx2!w$_kWu6DžƣDkk}%/}`+,#h/qs'.(&C~I5*49]lNϯIlҩ< QN+#rL=+U-ۙ2Mr?R6ʰmmzE5_EJte YEs8^Sߛu`XIJ(N9ߗO.1U[ f?ST|OGan:WF1XT*^M_yPq=sK i#G J6 ] V,/(T,-P- RH=j⦪\/ TTbu߫%48qf2XN>?Diq3,IT *(AU;0^T0iB)Ϲn1o\: 9ek0yR9IPZ\QQ/m'Y*z_#-L!F{cԻuS&\he"J7س說gelı֌֍89_uvF 4+e+3.E"4dF.XaRF<$ WVuM''LO$:Bj*zqD)~bhw% XdZpN{+d+~Z 4Ƴo?HrIFֱ/jUq  9Ouȗm֡S\2Mk}!'H& [Ƙ͠Y(![bxj,ͅJni6qqن:E}}Qc~3hHU0i)+~#ccEEvHfffʜmM񼷴xyd-u"'Oa?^QׂI^^66Wfz n]3kMGSoW>֠V3$jfI@#7u2)8DfgMr: ط-pW3_QTp@mП'TPmWܕًwfȐyگ}QP -%饽D]* K߿s4#)W ,:) =à-}+[3gX~U6껛$J=5ODvvm64kajVw[ |n˩O.(MQR"]8?\]Ux?ΡרLf6olw9b-Ipcs׼籟 ڃ.˫Sfݖg(|bTۿ;Ap\Ι}r=>Zcm\22Yp/2HhccN`{HԻދe ѯC=;Wƕ{{05lFhG*-ha9u?~%D|  5[}]Jjj-pzq/yyfAesH475 (,d|.қT Iʌy p͂S0fc}?w8aj4h5϶8; 5Ap󬯯j++ Oj+O& (1mP%cӏ4Krƨ޽m=ULCY]]R}4eq:;?{7TD{bMjO}8Ts0IAA'xʉa~ }ugGG&ݿh n2p>|xjϘPu'sn|ppWԴ>?;֞Ia=\յnV UW󉫫#أeij&/ p"F&cgwp-|֠3cp:ى7+!fhloO> ~D?l=:)үa_8et_KN,e[^lNʃ ޼:p-%Ud1xk@q!gAc],21T,KU\4;|)XO1_&c* $pl $9gVȡI`p57?ߋNpS /ǘ9<6ʟ&@e4+a~>6\&PpW͟_rqfM1BbGu ^@~F'`#ql'n>U~KNUT4v{gx 7Ȫ9ȏm]%A:Yn?ēCCKZ$\f;\О65,`s# R1Rq⤳@ubMSrzzsbnkO!:Xn4h%Lߖ9PECG YP.I3߭w[d̰ܔBxq.IU])z$p@4)Q]cFo#u@aY/R%-[qtyhEC>rFݳj_k1 e`<r X6dv;@y(^I4āJ!*a+VQ"\;~rCc?wawcyfoƁ ݿ?aYۆÝNZཁw~ہ5t *~|qʕ䡨1pBcc;|X178#UE:'CguN^FN;fp g`;݀IP~y ~ 3qKKsF7ye=(lz!EFM-M07 ~ӣ?[n`kAU@38*u=v\'!eDύ|<(х!|NOlŭk!$[B!B5~ujxc1<046r:UDqi ~G\ P+#蛹WJ_VFC@ϯIU,ܫYYL܏Y[3&,UN/|YnjdtV̌X~6Ux Uߌ *phW;E>atlYb5 2Kv]]oY|.;gDŽcUM-'=uaeHr+;;z[bA0H"kwS<>6x\ K! 2/n{"O[+l9'` ;C_X' = Zߣ25CQ#Ouun^At2 }T b%%)=.,8wuQr+II?Yr(Rlrb{E*7yAr pȶPIv=X}*rPݖ•45=0qtlrgQL5jHGo%}-;0mcZQ *g~2N; | ^*6r:&U8︭iqYff'y1LN܇S\ C<79b˙W0hsf '&&+“됦~T_FhEւ&*1\.iDLllt4u9MC*bu!i@!ׅ6|<? B@&%#8Z"΁pZs)iFx^@' | B ⳼ꍿ ?x7T#|F;8c!>k}=X]cu%4@6Z^ks ( 7舛!!])bgEntوՍşH~ymKϞTRmu~]v=LsW]) |! + +>QlA}R:@ʁ!@~Kttt`@eeoISȳ!yJ `IBYQ)*EP]ٚ3Xa5 _tfpp}U#XM(8ݢhjQ¤|UH/~];O_/?(TLa•Ϛ|#ϸys`]`d [9 \HtE{9X0(*zi_a}R. $bJ Bs=Zo$8Y=wY( z#VJ .dBݚ}λpS HM}f|Oa #[( Xdwee@Fџop[]m@^Ɯ" hq` ,,0M-HHgWW 3 LiL yܯ7x*}(PԩDM5^ -mz1C88WG3t}g3"j@če5mu)gÍqM|ǮSw` S0鯁slqb$'"w1ԑqvqz]fzSe~;c1q9%8a4f[zw^ = 5x>d;XJ{;tB"/ЌKɁ@ƍM\`B Fpw{p3bJM:0Ky38߉zm[*,+kxʪ.8~_V6Oh=[/a48R)TX\Xff*ir4?v !ze~]NC-,f:x;%(-^[[*ǟ`Ozzdl3~7.xo}FU!2k7Կ#8#.?>鱸7޽iEQN!嵰d#w&A&΃?.(HusOL澤w?5-0hGR%FN^Osso@6MbiHgZW Tvg2!7Yj>b+c%E0ڠl\gqP&Z]]+FlL,Q 8aII2Z@܁t$!T­h1\edg0@ɰ5-b {3..sz`P$޾} 7]Z@sX`$Eϰ26ZE~(:*2QMT#oߕG,{UT^)ҳpG, f|IMKfHܳ{ջ$+KAL\#!9wQ`/MLY YII\:שH""&t$/OGbGw.)WBMGkLlH1js;kU_kY6|t|XI`6jP`7 Hyʱna9Qh>P&> ᓷb[g"dcFѵɂ|nݚ|UƬ77Y?4qLkkTvepEAΕTbtB^Dxn^lݳA 6WbQmE;e Cۂ G"KîR"]EqwC C>[WF9UP0͋V0 ao[*i/oT|RfLy_]JF PVY{#wtSH㆕(((v+{Mo)%UkDEþz]bss3p.yV47pWuoF*FthOm(@g'e{; k[M1,i^\#G,~"&bD`GK(B?Kp~te('~E( {bhL 3*(zĔgͽ5I3i}J91=;"ѷYvڇD܊62x2kA=xZE"*hz?߆L"tAoyX`++2[ aj/S>b:hd޿{+7L'~MD/>o?ИM$z lPZlֺ7M7"6bcW,Ϩy/pdS("@|>bFvzlzs*m1Y0]IJ{9ψ8J^R U1>OͲTl9ec "L8/;560q'^?:ڊML,U#)G7_fQ &ޛXwg%KxFKhs< We-4 "YuRa0DŨ(hMuhƸ_.~/qmmY,L*kKy#L4{F?(N2OIw،,)^$z=Q+3 0b-98v*"/2a7/]^)Efo/0y\sly/Xp2toĪr9ujX{K+t[-bI^%|`:a%V8,~ ΁d:eiG%95bqQ "S@ޟJaN5R( GWL]nUzb}7ܙ;6q߿/Dh'3?{{4T)«ȃp Bdo,☿rV4, \/)_ Qe2T $67WHliCJcE̲?3G>B-̫-jo,,7v`BۧоEh(H2&<5K]oebhd Izˋ9,bglgl}k{j(Y~s~[c#44gN-鯔1ZR9(|hRpbɣіQr9B 6ôqs%pݳ'2r[7fB{zҩ!\4֯E>uaU|;^֥&-+BHq&F 5#4 ъ!vxŎS!L?&?,O3,ZEI򩰅#\􉑸 n6ZTK̓柇=<y?VH7-wa( gqp齱/al;{Y^NpO|#"( :z$cx>@!ঌԽ.([K &^9O!- }-|@$ޘvmn!u#?@9o^kn@m6o7N8{G8OWqqgg<Ŭ \2YA }NU2`yy=n[IL[Q9C]j]bGt=|QX*weΆ}=P5yL?g.N:?zq@Crp O Q &sz]Esoj )#@b/aː G#~+0< e{>&[Ide*j9I~zg_򴯟 }8;裠H{o|ntycy8K?! ;2.:;A 6o<"=r(" 3C{17 ~a‡h~ PU9wfYi6` څds*z6u+x3+RLq9a(so E, v*Wo.P r|?:&fgXVNۊi}ިGDDa~=Zn*gm9u?$oTa  (V)rڿЕv~lvN]hm%{t@fS--8ۆda A],El\Q,zaͨi(+έf/P ]UiVCE;$ 35 L@E|k6uZ`sd3][`Қ{FN}GT? H| '? pTTt$'Z[4ix]0YV_N=лQSĽE{^`(UO?"ف2vڐK iV[E$^E7z _33[23prUt0 4GydPjGb7ɵ?܆5H7K'] zdz<16&۹'t%\6|#k g`N,*3Wʷ@+tU_eФBU(n ųoI18і0UPIN~{˗0!򬺚4W~!/98?{za|ZHϰ¹ DzX|32>RX2S̭ϒ8vVj!yzz: *+NgggTu$@50\fxbh>>mt(.J4r @m///;:m#y$._B?}U-L= J6Xn}q~+yQ(ZA` "QJTmԃ22H tJ2 v66c6~DxK߀PqaT,_5 1_%I]lmp0 B]NMD@P=};ȷN亶1~_Kt q+\lk{3x%F onq`CB>4GoR8{[ SV1$5#F2l !t>yhĘF88P|KsSSg¬ZkINʊd!_WsnpoNצ'I5V1@HZrFZZ탇yl߇1Hi6@pNkcՙ9dQ/ԅe9̠!E@]SGʹlծHmfhHC18,0Z111RRnȼ"SGȽsQނ?SҰ?YlAb,xyt2-?X_~ A9w}g^aŏM E$OLHZ@PKE2* PKy.F2angular-1.3.9/docs/img/guide/di_sequence_final.pngLzStAm4Ĝضm۶mol۶mĶ⹩WjpyY~K +B 0e,%L-M܁5̔Qfne.A&A4gb9 1$$Q!#0E!D%?o|Nz^|<|f?K:::L+:++9, ͕q'b#ACz^hji4{ K[jL^h/f x\\f¬_]ӧi ~حg-gϛn/4"`M`6Ӷ2Lv^u-?6o>+ TWfh ʞƛi{Rb`oI $,mmVߖSDO'j_d#3cQȟW߷ B nz%g鷠VdHp^?.q hxty4 ZĐ p>o?x(z_q?: ޼ҁΔZl@Xble06g"bh}A]@ﳏ!8Ҁ>90 @챳EPav @uoKz~C#  ]"IAD9'G㿐W8'QI ̟s)C 8~D(8n|삱Bpnaa "#$ɩ&Q$MPD*`YB33SˡցBfss4LmH,Q#ac{44))c.HzRutk|W>V,/ >{v,0Yd{6AmkV[½Rbbv&Ӡx0蕈LԖlWWP]W~o33Sӄ3SBR-"z!``sAP{mD01RH8! @]K f!L ~}u~aiᔱIC?ͨtɬI T4^‘J"SYC.` уIq$p ا#Z[@(]$M&4=Qwo`!q8$8t*B%m9%%9%n +|($:Q0 E `5u1YզOeOY1ŵ5tnu7jST'Hҗ.l6@VyI K S×˓SO_l4 ~V  f 1^A>/X/΍4V A  GCC7"ɑ0$T$'& *Qc{;XZZ:2cfCDCJaԡQD8$>%&EI{6xD' j'%9 4% y*9|%}zqpy9򕼎bGm1nn)o!A^B1Cx2*byEŃR3U%ȹΒւڒ2Q }8۵1ٲm~y;qD%[%E_L&No^0::-TJJv"U/;u(q6766#\֯8 -5F9<åeUZ5_n])l&֛׎mulonv0)mպsgqsW.)"erz2a}]~9:(=s[#g#c',#5Zh&":$W27wÐS^[ - &|ma  ~ϟ 0h2 3Tԫ;;|߉cdn4^$wI') A&D'**OH'dd: ؗx<ƒcSp7e?]5t7a'r[S8(^dsuJ5=4#uQ.Pْ퓱)48.|\ofG /LM&'(UbT|NTfVU55\ݪmlptlyt6JE"mddSyu۸7]D$T+IVV4R^SBTVVN’WMW[Md_ZiN ˗Z>yw3^ßfUM)oRtw%áK ;^-X_Oj-AK\C i6r%=3` jCHtbWwo7HP(5`9Dw<_2VwM[p`XD4ATIY>JAT$7sZ, 7H j&G4(IIe.V+%fÇQg "_5PT 52aWb]iVCMaDi&b89Nkㅥp'9SڻƚU)[O g GjД9l)55n{ B"dShXg=\4%+2\]3ӱ|pNJ6םvo\Dv˽lN]MƊw2s=Nݴ?4NLީvn3*w0d|Z[ߴ X<0e4 ~'Kf{nZe?ȼns SCS5[ٮI{ezx8n{f vQ`,p&#E$oD֖L!l`$aK846bIZaE6f]C&љS;G 9QZ[9{P d#K*NSX:8X7$ 1QG+N!Te\flt~Vɒ{,(ܺx!rU{ԿM+vJzq}ۺ ;S Ѷ^D+ ɅzN-Yk5#xRXlW=;}?"4N6CX`CU,iNT{axZbʼnlͽ].8E*LRTsv% &NbgyDLNS{xh'zŌ.:Lm4kQ69ݳvoMHJ]˧gt6[mn39Tڣ΂-ln˝;ܞ4\oipV3wiȞd1Yӑչrx/%#2%Rntj:w=2"-*E/Z\!Hhf6~wh_<3?=Wor}d˕O|FaibvoZ~mzr&w OI:DGpφ )" tu 4q3Il4`bd_wH8B"@D!+O #RGGC&ppVy8Q$Z>L.nAP 5?g@L;9ߣnf ۚ4*Ogȧ1\ԕaa}ʝ?&hp,dvstf9+?%-N(Ղ߫_HPTШmi\R9<=T88!+qxBvۋRʈ <"9dM+ 6!./**+.`^VUWRՒ~M$:(Pl$H@JVMfrC-Z1V!bGXT5roc NҐHQ`V:hj2"LTN/QT/ѶҺcw |UKqK-]&'n{oAAro:Z S)oO9M*N+M:Zv8-n-82[ "{^=@A~tXCS58{T^>QLPƿE)yUf e^+p0r՟ oeaifbdqgʉͣL");0p0x(aAv028 ʹƕDCmOug#)1\/F"IV<)4cq;KIMH.AYV.ZyTj=HzVv~ztc ˚l4l=[#;]7Yy{ՍQ{ܚ:[#/I$&.,g? Hl)n*[½]8z4kk>t6l]xMtyml^uXqI$U*4[+%cHÆMsۜF9 ? ,هoMN/M OG]~/hcW8q: Fx5~srv0umqM]75Xޜ"_nX?q_/ߛܓ/M9I<9Hs0f?}OyO€g4ϟ KWwR3|i_ }'wuJau/F~T#s|`wmq= k;?ǬprԶpWkhltGpF0l+_o]PTHs~@_&Ҭ!>MLN6iJV;.lɬ3tr+QKOm6W,AK  XXH<;ޖ~U 7:8;lr'ok%K#݈vƽz52-5,pKu*'J2T-5/@.1)=_iܿTf[312_n-:YAOrhxxspv"9SUY*T7xP gUZˢj,.%g3F?"&P wcDBB5ӊꜭ螚]ZRfa751[(*ja4_-dU(YUK+ J)o0_[ՠ\a> J;Zq^p=,T|,و[=,8KR5Mp7ܭǝbEԍQS}|׭$k㉪PeHm.FlE4RJsuocy\:g>ⷂ*&Dom\E EM4l5bPT?p%TB_hudAh^wICD=!Q%" J,_47> W3<O,kZ1``NǫG7 O0\xyclDSk ˁfk7.CP[1LB"U=\]\d9ḋ@F+bD:xB@`&f ׁ&_]62 z%ў׺ZICWse/r( 5dZtV^$ V`9m="%"6uHnjH[XH}TH(ľ.rlCeE`6j&VVmcg4EL5r+*ƱaBKfm9a\/rq9?>MTwv&HD3 uBM-Bbj0#%_UB,/xTzo Ve؛ks*ժ-z%hDr吊gL\Lhb?Z~3R 6f<* ݶ/1fY ,׫URU*B0yG%ӑw1iZ%&g`MT_. \f3zF j/3j lj7X;tDs/6&D\.F_WrZOc;$18MVRZi89RG }*v}*ZgvpٝHz=y3_qRP+hi躝mk *R_ե+rao^ BڔH>~#.&x#uO=T_8\q_ձ[+Y%D&+riѣgX]KYHM+oU |zU_rEcCԼj%g0 S 0nzM터սL -Cep5ȭtdf{-yIP` P+A 90 Xy>ٿ';-Db\ή`ÎMSNcQj4*x2>Ǎ S#aɚXԧq=ǥ/67v*Ԅp ,*蠊ZR\J(AkABBDd %GjKatxB?pWˊGEaX7GJg* bb ۇn׌^-QܓDnw=yXb&b?cdYav~$6 K(eCԇ*J~ Κ 8@M> JrKO_b T} 楄v V׀"d`(c( 3@c0BB[ȡ?#ωG\L!DCDH Q:F謟NȃC A0tyGzQC~ =cdj|_wNܪ)$~3$dnZu .xSR369!61߷)=lf %|: v$yIK* ?jZA`K㔄?p=Dm#3ǧ{eHQX!n RRAIxǯ8 W}8W{"؄&#JKSE6+j9:;gvǥ/ zZVvٷtWL/Ci{oo~=#̋FWK'}K|)*V~<}NWr?`\y]~\R.|H> n@1{L.0Bf-^?~7z(|Hu|w+{P^/ f#+zAt2MVSuy"~g~7bdAjF}ٵ( kMNE;{5ȯgiT5ېygS] 4<}N C8# F) SS: 'i3[*6Zl׾xhwvy;pw̭^|:\Ⱥ3ǻVwZA [x{woӚA|&nmJӧA"j`woؼtv Jqi灤ԁA̋Ml/޿z|@nnjbFvU: ZfvݥoK~[WUy}6_U-u}%|ɒy@ zRJwuGYY{B?"0s (Y&uQݐ $R)y.+i|~:N2|(X=+5 dH< 6uf;&IA{ Ը++b?B/g\:KwbϴwwG:Hmz&>qPMd~i1|[n7=VOޤ1q *g0H$;t_Cµ7`^\7썮6PـfdTBy_ #`~X:"7>PCȈh"d¶"Y<6З>tn"7n?SmnhPC%P{ܑ>c}k;7؛`fӽ[q#_l#[SmO\\#:q<_c3C/Way#k44e/6i !"Z{>|o2Sxȭ$#sxӿ9桌rꃴzS*Ku 3Sby=0}?i -/mo1@vF:88.Έ`t4:9 ߾ /J(<}zM+)I|=] H*2" {ы(QuP扳pTD7|F2d0uYy.>)+\B)m?9ˍt'_/^gjɪ"*o^Rw8nyp쫉{t.=b2a}V&(TSd30;.vԶhK F>F> N4Tbb=opOqv"[@#CE)*J'g:ؤmrR>K00`b:FT,!m}ċdwȳ11CUrRf7UqfG$ .73ZD)"xCyIXF%u~ڴ#gc("t1Bh_IQ;D6IsRwpT79_%+Rj1̼NU+9*S[Da08B@ӎP}n9 }ֵtC ˙A I'7C ߈^= ѥ10=bkZL#AA"3.mg&{BV9c< sc c"jv-hLAѳt:vfDX*U+pQvށa|S{ύjkuZwAqљ3dWVK&\؟Mw@* p@HF1աв;VEOcL5ԃTåpV| [m1Tjut(K0:p:LcxD >&1]X˫_ҘFY!'uȧLFq3IݡL\v;ۀvXtko;T)%:Uxf:DU(Ϟp_xعV&ֺw5C}2*%Nc#O*t?':%ax/W~*0jhNkc V&Hه¡"i!mJdbېBTJ-7jRϘW\v*49+#^}{K`.pRη@CJ{H]3c?&"/C'aZXJШy&|koi!`>|hNo N2pVo>.ʑTᱰ Xg;)l*]iGµ7r>kmp߫m>A1<ł,e*/F4/.4`+ҍĭm;[WX|9oAPv_K6C=1$S&W)BILLWWP7u;\!髹"ujp9L2Qy"W?rY1`2>f㿈v* j)<^0"!aP|fs`gYB|Ԍ| O x 0%+!YEraSzS#67b* dhXeE }MSsZsB-|F&f]rh|@CyU\{uX[oI6%̽J+܃jcl̹Qɸnka߬d!=&r:M R6Y42{!lh)[8s9R$yȊL?^=<Ʈ- 9;ˍP )ӝHj,z#+F!szȡmtOHTrsk ~_ZPh<dD+F+fX6%\YjDO\?rPD -`]{&96S7ŀQ2Œ{'Mgw4CF-7Z =YYδFn‰$x{TK#Mf;UOj݉ z(߾݇[}Z  B/3\W胐p($PFV6\eϯ ͽU#WenF9 HˠDY^%ri^s_CxWpQگ'[WIM~ŋQx<rwB:%x tqA7Ue%({h\}z%W#VBö7i;HY |A^N/xBHRRR3e? P|8DPjkUV44@^5RܷF&ք| V8se~5} Z ߸ӆ[6s  bk>L7q:biRa='ͳ^L*V#i/*_SFYڠشK[_96^ H:S/nvjAaݺ؇w(AuQ\2"KEw%d"na¤sUfDţtd JʒՋGb&dXBU`Vs80«fW-IPXcevLe8-]U-8oTV(|[m3~ДAR|]UV1̻z9参:zSsH΃QHL6ЧѥeA"zGt˨ s:1ϊ#O=u5E1X 'IB:fsxWQtM"Jpێ)Bh:]YL6Qʚ^Uf^Mݙkл˱JUGˑ[3v7I5[QWF=RV7rXg11]7lR6ޛV[\#c{jK⏓§lD.?b'6'Tbs8% J\]0"`7%ZoZz=}*P3hhiz3'wSs(sJ>[iuֻ ֯i<#[@ZSAd )>c l-ɀ tZU)V WgZۥ N&d1fU(*ͦ̎kNm|AsۑzU!ӿQ`x`[]mΟ,j/aE旕yNwL; Og)j!E)1XVGV'v /@#5%Ą-HZ:N h{Rq&;cUp5]B]1ȃcXjt7ݿqFG;sMDC*uq`Cƕ R'iqm8kU A%I@X' ;[VJSW$걅͸)P)!Hm=a뤃:toE8hf CG=$f~g^oT-ģZdc*9#*6I:0UPJhE%gu }JYPq*J\}c]Wev(LGaVv=~x^gΜ19֡CcG=^v4(;f…lo[8TD1qPؔm!BAPze™U\K;(~MVpԷ]vBcnEҮUc`&f"an SA~kUCzTv]taήj:*BdM.Kh ŵqĐ|`8urNmֽ.z }ZC7JkVQiqŸUF acn`\2y+k!MȒF0t,:'~|k7R7n݊1c`E{~զe۫1:+UZ3+'U5_`u5!E8swONB|T_k4 r*{9vR.L:U K#?uZKl煰%B g nGkٳ{I&/ג{~Mq|(YgU&U,tt+ո+yޜfoa׍y O_N|ʏ9P>bFAJEǮŒuNuY$jr1]\R7^@0=; zQw15kM&׊v_P uRJ [7 _460+LazqtoN:Hojڥ:iQX4pB]D"gwv\R=>5=%5βۏ2y ՠTkTtimWd QuhF*֢t|Y 9Vnwrr1}%SWVڦJ]֩.œBypϕQ+|WoG+]Qiƽ|SXUtGUVeqLlsuC}{eIA7tsy!*d4dȥdsdD9/¿$(73xC yQJ5ZfߪQ'᠐,ڵEң*R[|CWŁ7/"9)))r/g\F]I$0{{Y4'P9\]o R% !)u &y4I4#IIHIN(L4h5jdx3+;"$qRv6U寓G'U7&~(KOal ӯMYNGn4UUQ+tU%R+ҡ٫*Jg64'8r8q֬Ys4mw»6m?EZ[^ cML 0g3R{''i-}oȘ ݟ=wO 'I.>yJF_ ???mmڴ%#$"ąiM&U ^?ީ0\^MWąk:8qXf/R8]X2 X`נqO8HpÅų3XanKw a3`s+FQM#`!\)[U ŊEUP(QXWJP/`|CرcƨA޿L[ԗ NBAM 23G-%efw践^N7iM#8":|lܴGFLj ۵GΝ1+yN*S|0Y.7Sqv{`IKK1'!ʼn9v{tjs`'xXEjir$pL*-d<[dCϡ1TYfXa cPr^\tU*g"͙>`( .`!,< GmnG§eYͱ6_&/OrtswC`nxg #)#Xn-Dw !:k"^үcU&(U/ԈE(4؂>лEY3>ۍ4!7{Ld"Mf1TYcvjḮAÈ_)&lH:u{gfn)4ceĔ-Bfʴ-EŋĂU۱kڇN%F<2Q4i*n̄i1[ *ks5$QȬ=TM5F08}4߷cᢏT֊t nX/rb=rFVSzAQ{T\Lgp6Ls n>GkYٲE֋d9;m]xd,flU3We ]\E K~_3Z!X[w- ˪"nk0;BYVq`"n۶ ;wD,׭xf(nJz& Za=RN.xA޻7s߃}DdHalWx{ ҴiSpeU* kBn\a4c JCE8XrhVld\HtjkQ{)]M=#"] T*$0vaȉMtTg[i^*Q#sc`_vM4fX]e^V᳡WG8/,ia H٘gh0lkPwܔd!h[W T,~vĤ;`ߟz! _駞 7`+Uj[rC⫦e ;Ak/ȓ>Y0:ؙe}BTF%'2@AT2@ _ƇkHXvFK(%5B/!QGNmB}@IHTǯcСk'OF 5.4˂-VF{(ґ,B#GʔD}F)ow+!iu-eig*#]**]x0N$Ƚ>$1jZIzģiR!69tުV;/N4oje&_ވ"ot/hG`;#ڽMgdO?{ʹ˱c<bjz lUIO\!F(a#;=&8eY/ IDAT"M:cĚuAƾ}tRc /`,&UyFx2+=ғ#G9ѽ{bҫD-0vѨYc?o<&9Y]$RlWHl?08pe왫^zŔHjO!ҍ/f„scW!ً#?G.V05{//^lz{Ɖ>|^$jVXeCh =Kk<6n:` O&ܚiX 5}/d@Ŀޛ4{THE%Nw\U2E,s9BqaiD!iwR83I&;XpCG@NB@ظs,/Dę#xqSyq5.ޣ[r*S RE +he.B||Œ *rq& ( ǥ(8E;dK)c ]g5J@~􃗱9G5RG̙3a 5=Vz]u[V`Nl-1'0_U*Ja/|1[(7f}ůw#9v $y4䎂X,kZ1p\lb|0+je啣1j8Hxv0,xn^)u6*hG7C'+Ew#h|(s& )`h KW1{͐|'rK!C㥗^2H!**9U=QU2IG`cW8ұuOL ;GB]qÔ-#"JWߔEXҼT9u3zn_%Ty+맑ĤG[5E,<}> Ȗx#qeaj tvCVԏ9gV̜&`]x|wC0o5;[:a21a DDc[;s7F?aJK"Yo]2Sa/#<ْycZٱ*G~kE@5jzҶm0fb7h^a>ei1b3NP7s׺pK5Ͻ}i7t15Pky̥/5E{}YqHnoFxuy{5^k$t̛nI-yTB\^Lq0i8L^qHZwּ?}.7 4r&zvK&a5h(9mŇ=Tsa~4?̺ 8l^|k9rZgwȥK8#.le<ųk奡轤pJbbPleܠ+:*3{cnf;Ì$s,BKwx4/w}R9wc/0W؏hGmrV̓7⮻2=<ʆ@ՠsom>Zԫk}m5r `~tsT/;{wBXf˒^2 G.?-öIEL8*?SIte{+lYѕĉS,r*5.rK(27PeE[-Ƣi5 ?)⽆݋ϗ2zl$n2SYEIyc=Vl;Ƈ Ji3$,w@oL3.g ,Ff4SJ7#QSto ɔmfԧMUfY/Y?Yn]'9i__)ws!V `a=V!mUjGg XQU-ݰi8VY/@EG⑜lu{mu!đF2*z&]m9woa8ņeMwcӏv`sL,.؄f{! uZc-Oqd;Ⱦ>OĒpW WMD:P.Otg?-eY5WӞg]pOGᾀe0Ċ([y;Vh$5GevivoD5$66&۵-68;;­QRu XU>v!XUyz~~~سgQꄔoDxP |t5L,ģN33WCS^._뀟IJ8>r\q +IRed[]WoUqcU!{W,?} nFw6e~v.ʓIR&ͬX2k z8i!(fv:}uPY6/& ¥usdeOK#_EF[T9dgwg#Լk+M Wd6+ȫ-` b¥k]и/yI`=2KѺJeJVPu=z #ЬY3cj_= Ӫ\PL=VXfBF&#I*|25UGGcdދZ]&76۳4bxc`E)HhX>_&B,7YGfBR gj ?". Kve:6@[ZH^WS-'#Ybl *^=Pn oZ<~#O|dJݵe.VF&Юvɳm~SBܽ?1{vܥ y|F:ۿ'D$dn@ZzQd,nueD<c#*3UF>j#;3 -Lrh70j@ d . Y3qfW}ǏwW_tɲ 2)̙QMvG0nFW;!A$y!"B\N'!9EO゜Ks$D9Ycg%^epQqH E. oOIF/O;)d- vN.(ξocb꺛r^7Ky/YZ p\%u5_}Y.~9&"F//_r&"K8~<&Wt+< zn񼌵>.9ch3Y(Bom(9,n'=qAqҳ^P+d!Y}녘ܵU8[tIcgi;MĆ~(Z3Wr;o9P޼kK3Z 690q\[MyVYn^UPEœF)m5JRsJ|(S91D\\bcc]bl ~uqX7l^^^F#>>>HHH& 5p5A=TPDә17]ou}wSwh k"й/8w7Afo_v!7F/.bj8?4'cUhj+|f 6Ꮐ{0LQx8X5Cf`-}xcg{FQLIN͛VԔl|aj{5zjl4x[ܹs氥aenݤqqAq{ uNG&7~gڒy:ud4D2чlMG۶Ep5)WW^A_??xl 8u`y59~c#CŅv@ꫯvMo0>bm *Ė,rYE);f>-Gsѯ%5=!#n j*%)[@EWt'>ÿdkQSWr%b^;KK#qfk8p6F] eQ X88f.H:G"M<j^WNLY}SRذRгWb#G ** 1A5 :I$bDۂI@X/yy˴R5;E>*"o;Uԣ -LBdg.G}oB:G2i97f$\ G0g VI/z;Zy%BYdgۉҸYZܦ 7߀@Y<{:1#!pcb4%LSmD9 2-/#=##č8}n焑1"VFqqHwʙftY70.^lTLrsS>u )';eO{g`-A]O<5r0BF݄UuVUd/$AB W 4)( ( . (*muED\AA%(EB ^}'E1c l9[`ʧw푆8|A~wAE[ȒJ9XM f73zdKCɢޒ-rePܓ$YC9Z\l2*V;w6Vj.r&X; | ˚wwa"Ŋ-f(Һ=G{Qh4аQ! /qYч(*Y4kbuaaa& AƫCaN2~ PqhÃā JVM 卽y7˝eOqHXʔ:k xI~3BOx6|vBdT"s(F U8՛xw^UtoqO{0^0{; 5LJ햢;0Nwaw~.\4uu:':SvԌm/ڵkzjڵ˄MpAG hDz%::p+/r[py^;4qdW~'- *1ţ4;w'ad^A p«1v+gﳫqXT[B>} Ca-`SF#~L0Ǽ5c/{bc_PﰶGoDG?oǯFE̖rno*gw#ڻƼ5: *> 9?Ժƺoߞ|9g)6='1n_0j3\[IrPM̖,DrG~4ڃ_F oЏ  !?Jrx1,{0M3Se~/-Y2#dlN]{mF+l:t28R9Z߿i|w~kӦGfKph8ث;nskԨadOŃ4nPJhx?!!:G5~.jꈪܐ٩S'ΑG[gZ˯¿bsLqaZy8|U!gOF"4eыDZޓ{q}l>{Y 67;u jYs#yu,ݛxc`<!~v5GlEU #֛ۢg+N/_s3Eq(_GWN2\KKTf\NGQ":ߴ T _ 7O]j|oC 8#r*5LvLl3F?l7H*ݔ7nAmC ,$3vp~>cߔqeRLvr<Ä;&E*\dpc<3VdTsQ-%\?37i1vbUrSox<"sIZZ>j$z<$=?tϮܵ[WBR?pL64-G}~D IDATB6l~]*k -l`\t|be+<\%ŖGd!h#=>e-" $SV[{+[b-M~.EAy8/5ޑz B$iԂX)2RQ,o @\pE̖8̒~里4naYG GC&?>qtFdj,qŜ6g;`|*!g]v|3~Ϳ,RKN=h](6 Q pX4?fڈʘ W4'-$p\WT*&9o U8q>J#2\T~y;/+rEUqs?9?.<M3kNv*CJ<%mÆ a se94hB@4gy (a`|KLN͵;/v.0sa,8 5܏%%,b(4ZIy?@]wvb@Fd~!O,TϞQnqnUy^֫˙WK| {%w ~&$FƣR+wŰizDqO7A 0xRxoaKW-axVFr80dpԾo\+ϡw On]_GDQkd&'16t=|g/;x1j߂OK½! VEa_ݒ ,~dmذ\k?bFڵk,ri*gmfNlf%Y8%,iQˑ!٬2a:8c.U-)`9wu`^bupM*ND5ro<@?UN5qVġ%89uW"G([XGdl)6ZIژT)S|w~S&R{峎VNԸ"?W-G[Z>rU CJi$ TO+I߭t{|ۦBsJN7Ϥa=t|IX~ %=ʣ#ucFX..C:T1s(=& D/.*Cƛg鵖;ѣ=V=ӈVAM˩ʪ⺊iӦ<ӫȐx%Nsv)IgmKb[?un#_D=>{b-]m Uk .d#ApL"an˹!l"Xmn7pcd݄ fs=F LFnm+)pC.MvΩ k24.dqqcl q0сqh4̦̩H>(=YdQQN.U\ʆiczgٰPi2@5W?RwMoV4ӸvY?+YD\lLM8'MګAXtvF^{vhUPT8bF-ZhR"}~9*>}:.]񲶇R2T%  Ac? ep=>&^+*fw}gg +W% <saE9rxErTim;uTsD"`̌eVH@eڻuϠ_q֯kBRp0QHʓKRe4zFH\ '&"Pv9tggfgJJ7+Ҍ:XbmW7rMA+./ 킦qLeT[m5 Pܭ@qwwwwNqxqwܼ3#wgٜs-# x82J*7K2NH `}?T1Xp ;,n$<3C,zGZ1DQI=<0z$Ƶb״^6)+^Ǎrkw zɋK0j-v׽9tQkTf{'Z{R0ut@1g= )d I d~xԧ-cg+[KJ,_yG4M\B c98d^o .%cER[[PX"ՌCK[E{t/s/i+P4AP MM5Bx+NZYPnnCgSC!IaVW_5ݒ-v.3鷘v T`4Q|| {"h/-wv5PQV^Oa]sg" xx4ٳҀR?Jog3ePHFijpa$tU E}/ ɥLGWIࡖ<"6̞G1$dlq>ϧ'r;/ܓR0M;j(%o%$4R% Cԃq نv>Mo]ٯlA E=cOJq1{۟O;{7i}Ƶo b0]be  L f?FsNGRF2y'YE/{@ ҢѡB#`2לzHX:m:xp9||wI1}?u1~:-dޅ_$Q>mٰͱclsŹRQI#Ia#)r=/"=zbǍFE-$q+m7ϙ?T! @ RF_<Es L,ZϚ UЁaN+pe% |:)Wj%1QH]rHB2M NFo&aJXS;TaDC.CA6:^]l7]\[$(~`QbH.$Eh㜧|h [l` l@%<̇edF>9I& X&X{:z(Y*5+r}|F܂dHQ;zt/-n1fEZ Y:\?w5B` 9bWĎM(5CDV}ﳜ{Nn0HpI,1ǺwW mLƆݴ'W8&ۅ$߰pܤ=O ꔳ+eFY$n ,z%0hcKQu,ٻ/5vHP@$ G΀\LӳLd|Ol:`o_YOXa=[mSAsx/t:+!sOd9ۆ~\ǒ O~TIq\gj |iXf[{6MϐSHtxP8 #-OLXhlZ0ܣx nDd8lo`[HlDH4?C1 s:'[sk6fEY::Q"&CUPFF~S -ւ f0Qb( H5',-R^{ω;Q.`6Gu(9v[3 Uc?+ZuRÕb)"Bjc}% &ND ː R-՟t^0\i]߆שna恇5_ssuG3^zv]0S&~Z,O1++Ã&L]eq g <gZYsǑ}?Nxq '@d0Qzx_I޲ϘK$fT;7\Nfz?$4^!`Dvڄh{ E`5&U 3(꿡?6z|[)]#'X[O( 4_|z@J8#ύY;|u=.pZۻNu0 @x4`AeHԯɐ5[gC|qJ;[μww]ʎNJQM)́5F?Aw:*FrOk<=s5\UX>5E0\TtifiK> OHPSzJ\EBy&?_Yϕ_t*a>/D0rVKӃ2L5*y;v2CѱDqF}%=IWI?r$KJ[БE^<6*߉nڭҽWsGWN;c&>0ͱX9\z >ʕB,f7kdҚB* ˟m;_ #&u9)'ȖI 2'(<"6tٳ.e3GdqA,j"J>ziyH~n>EÝn fa%tqE4N$gf;:QhK)Ž7l\s\$"lI +0ܙM@wgd~ּM7_ǭ,Ep:6ф''~Lťܧ^;I_ֲ:1Zwקy$#'.zgTPf'Q/Wڹ;VCԧB}|eͶ$mU-GGnŀq; t%Wrc8kdut0|>}<tw"a d#Ģ:0 7b`X2. r'E3u?D&9TkI'zŀ]&Gf\eKYiJEEa ?A7:OLKY$9 Ba&^,$9.!jKG9,"̋kt\kY* O.c.M@Eiޫ\gscn1~$<%/WbLѾ>dvtI ~%)`A[z("Ó 7 tiWO1ZcjksƉV^: VSUv.wNQcp6([6ṁ^A{\'Ǜ f45ҮjSkV֡ =)[)DV%ʴ*{zY19P Oji'P#o5Ԡ x\fuckbV?sq/=6'LIQ` mu x+-^p.-ȅU[Fb_M 1cf =AݨɊ7o8#e 7sɨDRwr \#>Ŭgl+iVGSBy) rLdf׫H||aX Ö?v",:Jvt!r阊@-$n&*t߷ 6VH:AH%X}%H x%&^ J7t3ġws9 f| n+z) G@"1\b̨:CoynvAv&=8E!rpϤ)'h:4_}+ ǴjKL MBvQ|)>X,Qbx2l}Q7du+< ݴj>-SkjOj_@E`4zMꩣ2mR@Mio.XIURYa;~ciWӰۢ -,LY n55O[HI g35+>5 +R6+ԨA:n)̬#]ɥ8+sAǟTo\BKN?0I, ۡF;9!eb0,KcQ6̪|F/㍠-D;9:=1#)'+xwF()0+ ]HCРoq9g(-(l 点ꋩ_jÂCΣ@۝%3mdtmT`R2}j]fge۬n"SN턳7=&X T@E1|G(bT2| 2QiΙU NR@ zd$ܚ|֓˻3?xu )\/ PcPxcIQv` (Mh )5} }uhKGf%[ws ryk%Q@~sB# zPcxD2%9FF&#GֳVAP]$zo8*eʖUy( Ϋ2%qϹz[dXݷ,Syϵe;kʮ%7.Z=of甹 u͞A b)޷w!+D3H7q4ҩ74>ѥdp,A~yOUG`5yRj wұˣ l@KputXW28 5P] |2*>r;:|/ܽBzMfK1,i!DI9 BϧڝSj4t5& f9)as8^u2 uc֕ *_r*9>%]3,*oNn--[}b, :4٩CV)F1@dmp ݲ+MoY+R e7U+\k˚7p[|RM.݋C.'WCRo@Бdz_לj,I9=JwMԯi(ԃmBNoj,$o|,|٭ɢò_ZGl(b=Ц"UQ, vM.ȕR)((D]pήqtΣ+Zjo p-{>kD8 D(h.$D[H .MiO]M`#Fvc˞!2+ʖur妻*g6 8#ZF`L/.%i8-r&M ^i:7px JYg8 t]J/¿^1CuCzC;{y)|C1dpz o[EҞIT lr]5Qxޅ,Ѹk!W 2_1Y(1?>]7.ssQɁg|2cB>RC!||Ivw,3[Xjب߶ШbǙZg(~^Kݔ=  v_ ) vy` );ѺD5 H[yk{1@]oׅ0 ?ogb <[ii' $M$nhpRj!!GLR'jzz(ܯtbFt`; ,Ѧ9 RYB` *4iJ4H=ʤ ,\W=P1P̻)>{L(E(–+5ED;P0ȍX5| hײA|]n׮؎B1v.AM8J}>4KsI"6𗮅4zpi dI.fQa 3a~ ϛ͡&%o{b?SCl&~Ѽ%uC)ET+UWe14 5Uy蜟AƊ ]cM*wҸE_y6/I@#U}(D)}zj,b|UF;r0-Hc95~}w|cZi`A0n%)vEr4HX0f諴!rV_S3QRn}񸦔q9eL~{ z{ ab*{QYO4e(!ʸ7'_ HJ9UPPhA1f`(AZswZ&}^ F\}2,rȹMq1YJx7WL_|v/Ma&ʼngaoX-fr>8Y:j#:Y)ͪƢ$r0rCaD!Q,?#_؂шyAdW;iMPX L y)!* lx_;h)h0\T̒MN Yy!?QP7?Lo^C!2k0sF ` {k3!ݕ+.`A̬h+ǥVv³ m^ۂ."zS MPY6E^G4߸3R|>"q7n:X0 Ryw9/j{cm$m.̈ )r&uE*аOBBQL4W7kd Zv0Lm[(,LOD#&5k;)439XY(Z\!"fs&bmX NNEI5 (4Q&,0+-(x쥙mЛU.Hr (߮URВ=?|3D}U0Cj6ۂ~wMpMkxi1cewtIqP*b/WN/LΏVS(*r?tq;$}re-7Вཱ|.{ɒTBTc" (}SE}qyi#q^3:aۗtWG #J!NfSS>zK/ԋ"(&qă:R(ݵ'cBU-l7lE3;>բW蜙+*05 e!BRM]%*6_-A5KF7=N%_g DpX 71!ꐋFD}ڡxI0 !:rП)`Cg'[{1 .cn1Ҷ?\>J%=>ylPإC~Ct54(9bV&,Re#x%Iku3h;A8kmf29ף[әmDw&a§u,465ͫC {|kۺp DM9ƾ|رyhu64`;S#rDtkwLC֚3P5+h!)S?pV: Xƿu./5 XsE"V $X_kUbOwZ!wv$_诒7[^(g1k_ lq/5]]7G>:F4 ($)W !. &Lu;)n.Hp3֫`en#qf}Cgke/Z_ξ5Q*:8<[k[OzEG,8᧢T#0AfpյFaoVn#Pg:܎IaOaOb B^GY +s֫@*-r5Gy9|cD| J٭dl, ,Ev?PN@nu_>ؑ1.b1~'+1\`@CTk9d3 M _>DÎk$=3T软m!g#WwIwv>=emr}B?^%U A!QsyӼj8J܉vFHlW/Wf!?n'mb}di`amv k ЕÒu$_iߧ5zu*}V_\_`E4E,ȓ80&#}&2?1-Ո=;|~F i;'}ydQ'KZ4g"˪ЫE,D5]~j%~AnR̀ e\}R.bמC%M9+(R_$(I'hH-zjgF d<2ZJ[o1XfSc{2 ;A+"ݷW\I73 %Lx)&r~mZSLoZG \FqK$kB Q/ lt!\+"0~{kA=d.2Rr~e "B|nPoindq1HYݶ8 lppXMr}^ަ;g3Y3ѣVV.HA<1J<#[x`Q} )>rnһdtAD•4BwFLzmoxAMF?N^LJp(dcY]79c_! nL%r98s/e 1flf ",V{>oƝXV 1[ >7fr ]q ,jj G//3̹kFedugx`nX- X*Zd>Y{L/nrfJIе.'ʙ["'\wHTJcgz-R'd-¨okK333sT_o[yGby- W%βSɿ E[*3rȥV8!b8 5ƫlHc?#< Z*&c9|^iQP%b-ؑ䬬t=崝l.k_)(H=RKLC<ڞ|"=پ]NNY$br1'@yt(~x~C^,>n (D 'Dޥ X m/wڠ._3sOm :&bZҋH7 HٯxN~'"&- ˄AH@#6Dx{eU$)10^80µz#>)Q%˝BIfNF9$M3z~z"$T7TaEEDy_~Q4ʼ1^S߬2(;j '6J(aN<8R)I;q@/F~t^_iώ,neab$^!ҬP#v> _eP4d:x}Q~j шrB4YYrpJkߜ&QqopbλXl#@wW0t4ۂ[+ L"k,TV."4sn|Q#V)pƾh=)0~1?ϭc5hִ.y58>uMfЁwH:gDzY#Vg nR鋑ӓpBLG*_Ŗ+ awP2ݩ.3_މ7U8ҟGCLuq$uD5r@OMGhk=IlSG w(i"<`irD8"nQmrUP%o+v'OT] ̾znPqpV1̷\IG$3D-E[7? UjEFYM$TqV> =zΟ[m1ygZq$t@^f"qgݱL!gr~䶏QA:[o Կ`}5͌xܧv 0D`R5 nt)G"o*vRuBOҍDL'`FIm=#o oec4,<9 a5\7P$ 6I'';ĶWn5,RYX FlmEVFTk}T~: yP~Y$<ţ|*o˂߃Ec;Z4%U7'Uw 3l?JXe<[<~r{aZki!=s'UJc/ZIOψ;G:yo\v@[?beKz-{НCQ(\}? ED|Ma#evɆQo;?qDy 9-ҲJfX;bG%vPte)N(X)CQo<\7#`O-ge_BhǍ*rO( E2* /e,hN|G*[N%#XCAõ3 `m/OlRA'aC ^T?m|Uc דGﲚe0TF=B #2niy_ ^]U`8{ '`nU#f%Z?h_ 1 .Udg VIމz%ǫg.7C09ї]9s/^d.j{HE4z80~o`䒣lنЛ|ኯgFog:T:毄{WW3Aca?QGt}m$^>>>Lt^yoNO|]ܑCGkv7*6? t80[ C"B>E~4mnW4AL$McUODf5&#u&ʟ'2%kSC@1?n$+_̨W|2vrևyh)^j:jߜˌrd wœ='︠Wl<~@-Pm)3U+~7}9gjZlk\ ?|ݦ)L/s-AY>+_֖Bӓ~:#& ƞV,.j 7Y}W@ '̩ 1ӭxGi50sNK~ܸThuAQ{^6*&;~n' ݌.{aPJ@¯oF7z` ۫P6Ox5nbQHU~&xხzX5ÀŰ. ;x/yշR| n҆xxQcDNyȻ,hl|T w!Ju-aUcf^D- (ߵUGr>(_e||;i0UhZgqnO<iߢ>+"ݯ5R7+^dP[3\(S}w,eq 5@4lU nrT\,D!ҵ4ʯ[]aoW񱲕q h<շ6ZE⑂a0qQ8s[WϞAG`ڵezC'a8kE=Qd9GXn?,;]qp$\s+S=^iI_v)bttËLxy _9KKG_A~AW!%6#guL}RJxGh#d[VC=U%1P! W : >[fcy1RȕzGD'VS=*S)%NGe#QL\8+ãu\qH: 넄#$ ^ht'x?A0l.RX3gܫWBAx!̙ rq>FE$TNzL:I.g=ert C h`>үtq#5] FWD_a#^ִloҗ* e4yQՓ!,iЎ 82;{,^zi}=.f>YRN!%g"RpbixԭGܱ5!%t~(RDQXu4}Kh p8zТ;:]e^, ;GD`ҡn癈?Ѱ+G`̽)E۪X>+kZh]ЮϟtIKti]L3)^J ?ӡ$VEbIHwJDv%0bS{/5oehPFUtm8ZsPPУ#s1/{J, ??'đQɩ2:aHpu徚x#?j 1ɴ<* Gs1h$)d SZdgFwR7COoNL[el{6)u?*;ˍTwUYH^,t]]pw ` X@DqDRB }摄HIΜ9iW6}>] Tw-cРA 5ByH3kT$LJ<ᏇF\\bbbQwԪJt] 5} gpqhyL^0 l`j8z Ȫ[FԨQÌ <Ϋ|Dnp癕ٽ씕(ԝ= Nt}UZu'~^&'Xn_'b3a+mDAKڢ!obsuw$ysjo,G\]kgbʴq u@&.hI_ӁVjM&]U2eTf(W=^MMaş,'ؙg;&JLMNsI?OCW3O#h6Y ':S%HB)L2"T ȔhB *g@? uJgXfVntw鎗3d~ <8{Eh=7t/ {]a]΀OoD7q8WĀG qD|^ f,@>} A>Qc{Ye)p*ʢ@O*[E@Z<3G##>熭@ LVI8{k{;"ݽ1Y%/~Y\P~܉wu.ðW8C⋗W?IB*8[]ߜ8#Y\y˨@&i0'.9i* [ Y7?Lȏ{VqдN / oTeVnO9)#ua'w0_Pv胙vsw{ Tk̥94YF~(?m76eRhٸy&n:lӯAH, 6CY~*W')!rP4(Q,PX3:ps@& yx& a΁I'R彥 ^T|, FR۲W dH9\zS2|N6ܜĂmc䭟 )xu#7Jf环f/)?o wppd:7Yߓ4MŊ_kSs9aK;ngo/DjI8LX,=]?sR*,GyWܷ+|`9˩?4(,DP Vdߦ:L[gS pfW+oJos_U5o_@ǥ{[q"V*bư;O9<W+gL{q%g5GSq~袧ݖ]xkT+ ){֢GM5椵F[^&:J9mҬ\rx_Loti? 7=ək<-V^x+>#'G>ͱF=lg59[Q[<'8pPj#jT9B/70?{O#NV:e TOnHՀ2+EGMXsl%uXi-n%C"{5C{HdG${<렬Y" IDAT=S"N\0\duT5qhe)/rC?2vd"0CDddC@9R?%VFb0"A5xYQ#sa;/V7n~OYwNוnDLKǮw5}7tZTC@NsvQ#^#pm]=f?) <])v]aL톛%@G"YRva x ,w[6Ō`.?m؊*%p1u *ǀ!M̽,uARQD=/klB_p}ff fToH@LW"T l*u89W3?~E>P&4t !ESR juS`s&=ͩG=ز7ͯ*Թ[:4!=/5k{"ɓGɛ.P筚鲄Gu)\BPOira p#^06yd=<m֍Y̪̖l*rdM:)g{ȆR(g@#3&߁"zt r=\f<[pV 2P { 2[/#qw ?!+]YZr0l0eoݫuPM- M"F4xz_hG[C|neJAɃqH|x۶mرc&w-ԑcؑ_-Z Ԑd2S^Ha/T\Gw5|`…x]nL߾}r96VY  xH7y(4BQF ʏ-Sh30Ǣ]N G])cݻ^}1yCn3駟bΝ&??PN)ѣQV)tXfqoذ!ZyZi/ l&M$˖-33̬p'W_v_~AEOz-|5뮓˄eȭ3QyHCևo7J@SNg".#xݘFB9}WFeӎޙ2eaE0+ޥA'rǎesӧ7ӝwixwѢE.D pWþV:Ӹկ__nK^gQre\*jvgxD|H_/ԟw97;˜I3˰ֱSPEcA#.;twrns}2MH p6~nGA(((7"JKɾ+肊;(0!?\CAz3΀pW^frAh-o5j6E,+> M4*VfrZ~$܃8RiXYF3>Lz͚pC# |b ˲N~TԵ !4ArwUJW[̉ QJf,L."]aGҕXyw66>QKIn{[{ Ung/(z xZ>*Ic"O>țU;gqz{v3aG^GLmѥg{$LQo=&{S0wM>W0[$csbC0qX1!zIL6^qoބ/>"ah 4,u!  xF@`7ͼc;ܧZHG -3 U*;藡ұmZO8dC?,bqsӧ KE6ցXQ?4b< N TC]7Qg<}]j,'R!NrW ;igXY6UM?i4ü8{Gv\I/`.(;D/:q'51ֶ͠m[#djWm ~<}kaXsg2j<:rO{d7mKɬAEjxƜ᫞3qw]G`OTY*z ccvuDԙ:-kuBMxl^mYuRG)Yjt@8>^HOׁ4m rML2;Oj#(x<6Cw&xxGq?.I| #{k20X:p9XQYeӇ2.hx'+ПfUEA7CY%п˪v ONLJ1փ@aȽ4{Pe&X+)," oٸ (wBn%>i7fC;<t+J.7UX 'ܟy+Uۺk-Gݰk;0qv/Z ϕp#mʲl4=̹d>]ܷ5S5dijz^d^x}RFIB œǡY n9vD[>|0-axb_z`8űu_6t!I.GѬ=Sw;%mAq)DYwH_ D>0Cd0 _~2Q#W1dTkScukP^6S^u#?(x~9xҬ.ӟ~V1 Uh'PjVϩp1'|ևn44 Ϻ׫S_k $x(;"#bXRB-{ ̪(UgW_$jٷTEGFޖ# -.3-+;KGQg|\`.F졛Q'qf~;k9fYY{ÙIc^q1(w(P7˥w)]j +f܎1ҧaCfKOX֊IJLB'^ Hx7 hO]IwLA2}/q7ϙ-3ܿ=޸缊#-_F!LD<41kQO-eCq8$Ł8^e~/?G5LBiRASmp 6tƁ~t՟;=;3Ӣ*X&}f3 .ǰ zh=+qԛ7kϖ|nW6 fo8o°ୃƱ ~EI ;vȪ[` ]ym;>?cb dCT2~ `^UN[9 ޴4M 3EQmtFu +W)T o,_w*jC:fh=ǚ <=,8vBc4c:} N 4vIr'Wx fvT9%>8*h%J/Y {n['{0J|zD隵\5 Bh.qP;!7&#>mE_ \s* Z%Q̛)[zh8-:zz[V4oY.f>OݙX~ O_܅`ZEd2صv""RR#l]GwʗQOny"+^_.A0@?-&SP>a +~bB". 7b7!@ @.SPNfq7"%=Q6~gR:0gI'\#| +=*aJA?#LӨ*Mȇ$~vVݩYH"l|4͠q9lK PԥKq=#-fl=#O */ОPsb(~vDTBfű$NDhF)$o&Ŗo,4-OEcPvMޒC@xӣav3ڟ*'q@:j5уiP)1OVHwчQiCT LF$ U{k`2%g aϚ~~ j3V zKKL(4뻍1MR]i}Cܼf{6H37&5Ӡ@GY!> m@ڟMCQp'`|e>V9HsҔui|phҾls`a>8zFWv% SݿcQ}ͨmT,ok տxzTYt;@Wkn؏o_LynG-"zE}6&cô:~4.*{|eVCmv)Wއ}m06pܮ;AcT\/bm 26Q~9ehS5/>&>C]mpmCUYSЀ~mK/镊*8)!)"ENwQtэl\J($ 7lȳ !?x0 j :s tRСS=\EG[z/xӣZ,e?Y')Լ( O|{ 76&bìU#Ϯ&jGɭ*eqwnhvPTLGR`>d?uSnݯG_o-cbڌmå7m{Lh[UѰkeM&몴/7+3cBo}!w4;`j?Zh[*٭n)`)<8,BZ&}Etֵ )-KXQ91޵kﺲ#?X{p&9DR P'N37Ί@!LBւe`{QGڒƤ;/٨}o$| x0:eaβhqΈC,@@<~ Vc?݋;Qq\>ɿBжm}%u"@k#0%k,6A*7NƷ#@n:ӡ{;UgNa'l^'ž%#!IFpoio89=<5~-8!6mTIB7 yO|C.]$z 5 Hߞ K#@4m+s7o1,g.cNU7͖~TO>?G#KA,:ۡa@ bጿoGqqNhuG5/+u+8 (v\n7~*3 =:FH;J'78At3~EeRC' lw@ ,Ν;(vxt/H_CLb-G|t|sNCO@U")^$vζM9똝7s cl !gaoTZ2އyݯ^W7<`1%1L#`LC uoh/иNڵk^C=Q=|Y![swś{xvp};uڶ; 8V ӷW_f MxW;Al %0 FnHS}͏|4}{AxxUV5L=@nbe/$%=ȨPjo [7qPӷjvHэ n*Њ%:; >>7i nhGbȴoqcGE9n]bΝyO桨VY69 I, 8a>MP|ΓiiXi 4izw1 l"SU"0m=t,7`5U8RCRSL4xڟ{"i <.' Af)S(tdq6z7p4Gq8%r.!+yO T6/e) 0tP 7_"@|IO wZ 2 xoa8t,:wɓJwQm [U(vR>m"|:uÇo>"@ė9ABl(uzg wk)%)~|O hu5BAg8C>zQmҫ@ l}--y@v> FU *nUS Jhgh~ lA؎glg"/˲X;\Է:_y" 3B #@e݊[TDY Ih֤)ԩ0JAQ .Yt[O8s `x |S( ĪM%#~Tt茇.q·1@6\e yňhX0|Qb1h׭ď? Ѡ!vk:O(#toYe)`)p(0"@], L >)X?ln6E+AvA WF`@mGf -up1Xcr:&u.x!3#&n^rGqF,`ྃV ҇BA+HOҖzYe)`)? (ТP0wP-*l_Tl p&QC p$A#>>zJ;x(,_=*WD]д,=^V;B 3+5{F"t/m;+o>T@Qf-Ҁ .CLu2 ؠa{ds@P~֙ Ջ*9TZ Й5|t9+ ]sUk|r M Ӵ Zn͚RMUDrAt!'c/ }CzgC ,ǰcؼwlm2mp`sO>FP֟{vf#RR _pᛗϡf &, Ra(nP&?g?h欇{م@:>IIIRCzws6EKռTZj @h FUdF[׽}I̜0{;倆#@1A: qǎaس{v؁ݻv"BCBѪE+s Eg}t-unAwڕNn/'])zXQWܛ3_g~T9_SpP(P .=)@RjAFT|"Sn >VY g HB3y)W9^ .g?hC0Q/}vlXI~n\ j. eCh9K#ɀ PD;eca7% x,,KP`K֛ahNQ/IKn V Xt N!BA5~({4j7,BP1!ϼQh~|mg䕧pUpA! )UɪYIj _ E멹1PAB!C!DAeN;q& )p/`8M~uh~-–U%*P}5)\ `UAA7՝:Џ~v HHGuS3uI;8ҝLu7 p ֍#+ P4=J3-%*Q2a M{ oxpIAF)rm_-r,MA7ݩߟ1`)\((nL!*7YE^ WMgz|SaS[ G `Af ΋s0ec>twgN7i23Q;u>uPѷ5 a 5Hp']Cpwgpwww}w}U׻jjzNgZc7L sLQ.Jf3U&06Y&ީs,-T &`uN}gzAiHd{8 u f?U0_Us MNdfl6 *Ix H|.?aTWeK򶄜s뀱- Z` prVoQҵbN'Uy;.iaّbMLa֌2l{ hQ:;]1mE3S;֔LLU(-C( 0É6(y7LϢDq#?L+>  nd68tg+`r) vz_BaKg@jh;}.lb&ƶA5jZ,*>IxZϻ:W?|rJX״?&{$q X͝m[:S($LL/I*~*KpDa^I u&u)I@!d 8[d?h5(q%eBz} =w.iG|ag X=lI4? p,%'&xR/TP eXYq\MwK[Mjf?T$D\}\yr)+j8KNUp[LhX.&S1C̿Zy'M(gVދ}i~K{'`A3G#,:cvE?'@@2i<;h`2;5IURKHSn2h?;1n=v0]L3>>xYf"rBE/^'Svze.TcCK e7Oy@(WGH3ϰ;e-&t҇"qrPJHCaQ{[Yx<=fy;  9NGtdI_!4j%C6: v.C0潺_<=.Y"}^ 3|EwF-?Rtb7ST .s^uz?w6C  âѦЈC9/Ht+5d}9;u?e=޽"XtBz%xBu7[ ÙNZN K o(ga-.H GE>eQ4:wvF1ֻg(C>c$Z ~=Qrsc6tҒ&TwggW|oC$9"_$)f=8?v^ ,]l^h+Q 6P$Ÿ)rN2h)1}VKk<2ܶB6C=݅Fڜng࿣{ ~6)+)@Lyα{ّ7n1@ S&:oNu{C$gF#rjc j '*ghs68$2 <,!Q:sS(ۘpXe#j/dS̈v0@N6b$]Q{?Ɨg8WQM:8e!79%GGNXX',kO,mTw[\V[! B\Q fj2Tjvc@ùƊw&Q X:n)GyU:%AҞꨟ/vb)1>V vQb ^-$>Cӝ\rБ@KT"Fk8?# ~29]9R`EnG=""Sw;zCY?\WPP ~=r7 b<322+ ﺹčwdq)3ؾ';0(}?G,Q$)Y,ޞѦU:)1ZvyI@fh9>੼[Q {SbR;g1kgcRji1@RYJ54ڠ%UmS*ڌjf;P5u rf?OQM:th}fm = 3 &N$ЦnՍg.d VdJng'MlfoI'Cᥱ_yR+0t7q߿廩XN6{=Rͥ!E⹇[d(71AH`}I,3FީKZjzvW< _?Āc;C#L׸7-ey 4x$QT}bJGCfzQpHWLC-1Kjw؝ o97 vVs?8iO 395HDE֟v:8%~T^]9֡ҡF.cdZce 뿪D:ϐ:62i6ZaS!3Fxx/-`UCPA46v9cQk)|qLW>hIN(WKM ݢPD5⩿w}":z`b1{Mv& ]V&Yq`i N/?(g ,Lµ&/X":~D|P[8{娉_흱v$`N˹{^ \Bq6sksL06Yg8<57_aTobsMjWS:Ie"-V[zQw Э,EwSz VVNDh]BIiRa#"=\ 6P~?vO yu;(pvn_+)Ԋ>@rGN^lqwmޓ";^N?ǒ_p4_l?Pʆ\vLSOKUw[bNI_:sxu K3m 5 L0U5VXqE{.,?9<@?Bv%鼼,J 5}[-]e2ɼ]Q2n-ZRl DZoH3/Z G,l 1ԯ1z&;1ܲq&:QSx0X/#DLY:Գߦ~&p 8([p!٦~+Q_`U5+/"7 Waysי!tR{ĥv+7 dS'F#MJjTItYpSY(}U.(t~pyLq'ynjAx3-/k#zqҊ) /[" v[32wץrom]3 {7,:UngB؝^K[:[V+3%tmPIne<u4iւXݕHǚ WL ;g,3v4 :SX+iPȧEhƎX78|d DbTY߹r$IF3T ';S8Uu|jgNns!7N<n^Cq3!hA bA_zYUx]s@NR0O H${ZJ[qc:Y2Q YOo_/H(9@T06^>|R@4ۮ40Pu^7?ѫGt6Mb c#/JuP$Ixv}p0_J`\rȰskT{k%pY咃L ϐI/[]F.?:>r|Io{pHxK&zH&u}O R$-^qߙ7`oDY)9.j4[":@M%RN SN3&m&Q e2s6ΒQPT^tsrqέ'adn[s,^Zp[-5p4Ҋ"ϫϥ[=5v4h_*8D 2@ʵ!? Um\-KVM0@`%m dy:vQeZ:#yթU AuVodh>U1TG"Hh(CP?eؖ2I/WFH>vyJ{wjY2Z0pNkѭQxqD~g"$g4П7+̓Ğ w}C;cH,"NZW&5䷖Q ,踑^sO7je? `"lVΕMmF9:@jH=]=}>:"LTKPĻ6ns& ;3j *o:(&L򱹷POdO*})K2"dcQ6Z]dQf/Э篐OP!-4& /UyBq̷s<ߴv%ͨHx wVT_sג쐆LA(Іg$㒨B"Ylj煮3[jԂXצ(7h-r$߼'LLYe:v0k&'Yҳ Bեs.< +Kc&m9eU3ۤ鿘`$Q|KOrl͆4޸?$do쁍siZmuLO+4?ߣo+GU˼ ,EI|t_V|Ko o*2|i/Bbۣk=ܰlY|0}(t\םy!f ihMva:BDEjI*kNU*֊UwF_LQ ŵx(?]Q";0eAΊ`(9lwL6#/p1|_-=AygI휤Ϋ_J8=KH2BnJ O|#Tk<4`"ccj \l5R ؈B;iBNz{üa=ah[OP(DvTBft3'u;-Iz6<4'IMDD+~/2Ob ?Ԍ[QچSJUBhkV8ňoQZB{Yu?c.?^-hR_RH)&L8nrYquܔ{V_w].^W=sH}cȄwKUQqw |4qIơ ''Nߜ.S3޵q!ռ?B~ 7ߩS^lŔ>;` ELȵ | !w\w9sWVZ&ȿYwUf[J͒weqGf჻S[yyXAhT3 FQ!1p+ ,1ek+ed=(y`+r?9pF g`9@#\6L5(uڄo8Et~MAdmG}b_c 쨜5CST K|Cf/v[K8RE ) y97;dd֞!1+S<>Ŗ jeB FqtF$~&om./+:}X]قKڜN@_)݅uĆ{*Kk{%][t68nƏWu2eŗ8,<t^ktq.;2$o˞֠=FJQ`kʾ}@qGfB3ɚ"QbJ۠u 5Qo< -Rm l h eJvƨ89J 2Xcskȇ]ovIӝlDrhQZV,y{@OvcZ9(hUtYIy*;:bh3'iq.4+cJT|cJe} ~Pgz޴hH6BʻDsa,Svܲ)DLi+ӕ4ޓ&Rza@3"؆Tg,ȽsENVMSַuIqEd/mUݳ?jdF"r6WyYP3i3i@HDcj-D&? 'bĂy Xu& Ы҉|6/]6zωw_v]\qjwi:iZS[;c J#H0+8A1 lH;rExU_C}GGK +'i*t1K92rLJwy~S= yƄd_%w:CY'k3"8 LOTˮG{+GzMz ('ʟ_*~qGjT._g&;c98ߜKBh:d!!o]FE8mpۂT1|@݄jL87{SŢԗNX$.Ɨ/۵>+DdH"oՕw|ǁ)%{!F$x=i*Y. pҺόC/-WVg<{umdTH⮡b)G ;r55C>B,OϘLD#]U>"rК"XI)Ǯ `64`㘐jl5DŔ(R_`iE|Z *3ԈT8ȕ63R^;m7Pph?MC Jq+?A(pw`AVg;]pHqON0E"vǘtco]DcϧS.Įd +*CSRU [K],ytTD+i{I t@@ (x dݣ޵$aܫ۱]S96/C2=#⨍}4p‡| f'En(u=Ղq–'umJ}Q,zs>  He{>eUca`!0?u(GBWbQ;qnjQ,UDb ^[^_D o jS&zښC+gs g!~_}/+4-}-nCe5 B~߰ Ѽ :eBS)i{1De`2~`fI.iXk(j n3A^{_wKm7Wuw 43U6bdI2 /w纱)IW!c˚̓UJ YGWIFj0TiD򇏏vV?:yTy;^g恌ƪC onT4G!6!$ Ukx%8t:Hв6I% -QD|l.e8À~Rcؠ E2JDJ<@c Fv[?"cf)&,fV1}2~fc"S,G)-cS=Uc°:1F1]18 fСl V%VΓ@e`)`𲹡_ ݵ _RJ~8#im&u! B+&''!>Zȃ?FGmEC<ժlm9ں0)ߩ@>L}\hbw* w(ͭxxQƈs^Z' )gDz:W_ϽH̵+݆rŘڸUXr8Y)P<-O ^.u`s+SQy>׽M|"\0i+Ciʡ:A%k8&=cA9p!}y>Rޒm14v{Twq5ĉ=>PKy.F0angular-1.3.9/docs/img/guide/dom_scope_final.png{cpfMu۶m۶mۜLl{b۶cFO}xzww坨ӱ Ɵ`ƱU`,e444\O')1Y aw:>[ )77A;)))!cc*\'|α|3!'@]r<(إ"=.##CȓH`&;>`P琜!_ tѯj#ã|$r*F jĚ+A>^MG?3)+D`v1iGU5Y9~?"MGJ+gn5ākzoغa&---am]YJ͍muvVV윘0.TDS=|o(!Wl+nd)]K#\YT?=o}^x|Z GH5'e;UMX#?+n79n^Gr4?_L\%}~"S0&LHXE&12hu$G!V;#E`߂޶u;F`CA_/dh[oo sTNz8:mLvjQ-qldtO,+8^a*B-Wr-"}yrM*ʝ#l h(lRbyMi a4{{c fEFm^8ǟr! X)tMv.Wks,ʯX%oW|A:X'0WLgK悻_u9q)`Xt2!6l}n2;;߽j ,rx3D[ H2,t_ݩk\] a5M=j <̭!K&ZڽE5rK,M]'ZE[F9?A?TShP? ZDGpqWS%#c^xfE726E}lP|K?&_Fl3zsE-<.Pkel:wjbZ|ha ,.&##kӸsWC#0ȗoƢ Qn,*qXڮ|PUi5:ol&EJ H<'QcKQ\9+.U"荣|&BxW\%õ1'sƖN_]Tf8KtSQΒ}'&O-_@5ZO7 P̧cs}8!yJo˜g~FiIv҅Plw12LG37LBtVׂd/4\3͘ EcE\sZؠ Q? Qa4vDqxʇOʻBl5'_cF6x,2R ONdWv0,ʈyQ=Dr. O᭶;$TDPaX/;%}|Rq)UT_Ac) [֓\A "yǛl=(|.\7C?ZBa򋵒E_$ lZ8(8Dw#TBR;_jfv6sbf'vrҹ=m wml>hykTD8GsY¸5vk2榈0'HhQN38cLz~t8S[.ۿhSYd X e#]!cgF͘hϱ'fߊ]X!Wy`KNz3 =;gfuy 0}ap-V]Ͳ W%`gaA#䂐4!A\N5zdA~^7\ [e jj+&Y !݈ H߱q‡E>z8P ԗR{lpM]%z7I( _q:P(r|dp4@~O ԉcbU^5fG+B s{npbnC17_@ [šTzEsjK=!}@UOg̞e0 k~{|1}ƅ/wj>Xo>H.@Tbbu=RY໢[~0:(gw[Rv To%E!PlwEG9Fh )=Xr=(ڇ,\$ >|k{(h,s?y9޲+\z1~r9B}=sizjOY;KH{/ "Q]7$*|"5d*f-}&X[\~@.]qSPן * wq|gt/RO%w5biƦǢZCmZw(vfCE/w*S5],7۠:ðzF:v/馢2@}T7K}ݭ~,$ R 0ǂAψI@@M+dxqͪ6yn~ ؟Sr<-r=iܮmIY{`I^^ul6ivUo|G-l fLvkتҴļȥpR]^=MpQ*GH%Xv Yšb#|kc)U&KS7rAMf]C7il_9t;,2HzVF|WrS=?v5 \oZD|.Z^|OK 5}e71!7') Qؼpt>Ȥ[ax{Hn TO~]0aimOFm{Y2-y,Px %.EteYjgh6RaA\:F Dyd-ט:S"(MਾP_6Ol:~wI>`u S_~[ hH.bmƘuu<ީU0Jك&4ȎVsCCd^7W}ĉA"j1bLT QzNNo iI7|2wp^\u|>;0Ǩ@{!&"e‡ fB!_QiurhG0bڸXoЉ_^56# }X , zKχ  !/>VG!+*ƈӤY[d͍-gpe}<۠M\@Bք֞H2s"< cp_ GL?f:V eATz^jf,}f9%CW)S0sl̛&{R8/D Ihio(&mȇ^r}ߢ}?U Y+0hw[(&*u-9A~y6Bü? L `.320/̼^WDkR676N~m8CN!68 S>Ybb+%c=/</uaRʰ\vrj!:iB0"@{}/+#g(r']eMOT@%mڏΩ;p)[;-9N9H=LLV[Nmp$XexS w*M_@;pqru;9 &0J w`;ǿ̲x;W^45bڊ[aeꕵi,d%s|,G|wc"]sY mgZ4%ߌ_:N4 svwAg+c^lI-s9b+ӄn]^\u\I="PʵyV (5d0OSM>qC<Rrck'zsgs]TJ+e]%bA'4 +fYtO OIXl}xEFԮ% bQ*r}z7'ϊ|9[}S2IcǦrAEm'` (k٫ ]c` (8PLn4Y 8,$0INޛQ;Fmejh8HNiCΞ@KDЉ|ŵ_Fdd36ފ x g!'upaeʫ߁iz--A,9YecMYm8nxyB"r$+_){' %DzT)BX{uJSeŗƙ&7J", xCztp7F>Ƌ;vE;Erᶎ PhIkC C){]KUVDÿM zD Xcf=쬵+!9p>)v07蕍( ?gSG5tpBFMɞ@[I'2ō$f%cj_ݷ+QF\㽆6cE )@@g)0!!ƽӱu_YӣP7@5P*% O:4lXxN5nF3BW(6Y<'@ X_h^P+Ev̄nHVI.3}FCwL,'xsSWmI &2WGHhaGڤ5@2HPі=+yه=UnYzxϣ.(o2tCo 6#K٨AG^w9-ȶ2 mwQm<Ӯ61Bp3ЪgNiv!m$%в*|9oT0&ha (,kvzT9s[ y(n3<}\<}͹ sr ?<9QL4Z[ҏ+O=Yxb/B#M9)-\-:;^vK9IcwA>NJĴt%$'W2PXQ  eI a WF[hku)}9 ^(t;Dv[{B/K*/]n4k0eN~̢DԮTqdA|?$٤=$akMᒔ_K\*0!Ե_ APUW1 뻑EM ĄDdtlqa~nx3 oCWm<&T%lP=zÚ)XTUyQLaZҚEy8 DPȝz ms4h0~1DRx@R'cVŖIfu9͐-!EOe^60'rAn5X뛒*_ypPM}N6Ai|;؁q8ayY!3|*=:O ^ S-Xfqr ֲuQHXdkBˬ/kIi2J3-X475 "D Ē<QjtQԖ/=g_EǨħu7/, ~X߱Ȱ.|?b4PY2p-uA xݷ쉟>hȥޮysl]< qD#Np(0g{-^Bށ]hަ=,_KԿ 3N yWO¿ׁ̞7UWC׹d:qdePaxwx7ÇfS' qJd#F,\$7'$~6UZ_s~b pH`[ y0Bdob4.YDy5*[7#Zbx/XfH>*#7HRti%?1U+`DRß*]/x8ȗյ\=/Mɨ|3 LRR]Շ PtXv-r8LT5Q&{ع "OPaeUlv^:/5܇)1腾 6 aoܬZp4܏r6:X'f4;,´8ԯnUJl:M5]]mWY*{`iO@ոWbahdجXޞj*>StEd%4Eo[cg%uaaˬD]b a}jTxHGM9Bm$(+XB"Et0:Z+]a1\qg:W:z!h9,n۾[ /En!:%h `ύo[ s(>C Q &c%lHǣ$ڵ+.{jCKT_+k arTN65F61߼+s qt| Lx6aU1ePK֒6bE/pQE;dTR4HsqNM-6Rׅ]YC]$WBf=ĴpQCtl\]]&1sXqRjÃ?J0KmG?4Lhn8y[ ^>W >8U#[Dy ❳NZWejdw3 _X|p.3sxUfBKGfib +{^\1%Ўh\1ncQӌ͛C T_U6b.,$׊㧄;頉DaP5M8h.1'GNQ!\kjQ35f U{U@ǒo2X>7+sDjplQUl U~ @"C7 }]ɘ I"V:w ݩϩF#~x[[!1*58oOwL`G0| ~w)"8-F۶hն=Ui0ك xb~#c^=*gfnuzLT`()!3,-Ui0BXHRJ~^BZO~ŀz[ hvx/b62!-V !w*" Dc=K&>)xq擦R%+9h89 71n3Gcvzem6\>j_UlM'F51[w]6.w^#LgJ^547*we|qa.S~}!-qF=SɌ- mھJz3oMBr$s6,pgA*RU*j 04xOܘ\T:]^nKx ٛ*|hG)8:J(4}3#So#)=W!@u"? $~2 U5 'I?zf/OSaq; vc&Yi-͟ Zm:x7m=LJA}ֆ] Rt^mc:fAG#W3̡ӝ{p֞xw~,IJڕMk􈫀-! Kj27R*ȧ UO{س.˵FuM/{J> Rъ_t^s(5KMH@=čA~p JceV=Fw-SP7BӋhLjP:G 3kh4@%Tc-Wd(̖`g7FlK >b9t *pԵ—=K9oqڗlQ oEO&GSM z '9s^.Ť(\ZXAZeSm+EyGlUKOtEzzmیsEEw\J*IȐXfXS]5: h8m#I .hŻJ<ڽjH_FOBԠ >ûy5T 1;iJp 1:+4H͈wۀER9m=[mїښX1ywJ$@ ՀSʏ6?@rFUv.T0UYEEN|5EHFyٚH*J%yg ×13vBxgLfl>\[VyQTOj{ )GVu{K#T/֯ NLesWs:so+umN<Ё =Onl^O>ؾ~#`dTiB˺gr pH8R5LT~ST# {$6+ŴO*\,$N(# wkvJ YBe|"ÙMpQmNЌL(`AHp2Oق䱪IX~t3q5'p`AA0Opl -in0\o|r.^~m۾̦ tAjzz)1"JB1-+$[:1t`'vաrt1# /$G>V;$n]`]:̏I--h|ȁ*.QIR7EűD:\b&gcH&- Vk{HEr+(jG|$a (D٥)b^eĀ\ ŕo[x*z$姬- c>%uP0M_XSfq<`TrRƟY{~ϒ%+K?ӭ|!Tاu8f94ZD$@5Em(Vx0G⥨vǰd?tvjiI8Sfz~fHx0׺4Eo rjjQŪ,RPNoR1$ gW/u h:e[Y[”“]`Ib_iؚ3s)`TY:\ =TJ[*#v.p.$&o$zTJ/7}W:8m\`a2faDwT#mĬbCJǐCE3PRKLrw^dO{ NV9y妺<%py*f*l._Yiꐁy }e**o^ˋʚ҆Zrܭ'iڵ`vYyfo6Wl(~q l3Ns=ɘSj"[Nyn_-LJAܯA'NƁ(dcYYe0FU7ŏ DGMe g@ FiBEAI k1/gtqac/}?jr+c%KR";=B.,uJ: o*6aG'kw- Ye8*_gK꾍^3C \ʼnepؑ-߅,X'cKA]rRaW)M+/X/ $lv'g>b婯WvGAU?E`nC@weDL`3PFGSHfGHIZKX@R3{1Bi)2tr-C %d*Ґ ͣ 2*lBCBr37]񋖳DV3>.W0My>mUՑ[]^X= aY@~5<ž0P춗4tTNDAܙw7m^x[{R%w :MqxJ j}Rd48D0˯dV^ ddq;؈d؍H@~ 2v"^ ?q%&qv6n/^~>w65 0{]0 .X!0x;VjZոs4XrP.Rm:{]I('*ZJz!5]T dҵ25ۺگv}%Gzjp}[އ> &֥+AP*ePhjz׃Cz@׃~2Ao*wJ?3.\( zYgꫯ`|?ϙ3Gν(Uj?3)cdj%)ypiSy[HotmǰFaccd.Lzn~Qr.û+DoF/`K{Pv/~ lů`y}qc}#.oDVr6mȇ;N8Նߒ| yO܆&M_nOs6sD|TxKWD>Z=| ֍~ k27 1jwaܑyXd;ГC'φ鏫y?rW/VYB9U)O++I[:P_r{*>R708 XZR%69jXϮAoC=> cIz]|U(P`8|pYGL<]r%R8q'HƆW6l }) 0ww|f ǒfq|ÝpYж|ԊRL ~6 /L!Ȑz |Lo;aPRXnᔮ Wq8Wvcտ_0FRuߡEo+x͠EJwYX7~|7+6_~Cce֣g=SIFb }vҕ Oi‡QG lNQsA:2 rsB@᳦Y&# б~e4èqaWIvHⲇFz2k5f}=zcL:BjRfMZ4^>Z"ibLkZA.!5֫S=ꗠV<0//bb\=)lc>,.B'\aaCCQ(\5o9FB>ƲuCJ{Q:;ZZ*hKwkG-S0i$ NVnj?^m r LUҺu]Mu;Z+PL3}eڴi،>HvP87HkdRe8X|m5nW^$3C#AaQ;/=Lq)c` "|O7ⓐlټnGo G5 c2sdopx&Gf7')àADE[anU8T誶ϡ@:9[Ւ &&`pGVG/bI۱X=D&檫snJ*)#qa<'N(|)13jMZ 37 .Pi-HHN 1[rl퉕d V SCF_t5mWrTTQ@*/>Q*9r,|*,}`61v𘯾Jӯ_?iXǐ5%P(MTc{-ɀ HJzWP3jԨ@mjUZz[U+^P}@^XKUTϣgU,}J+%{,gC% җ*_~- ZCƇ*SZ3RU=̶E;j;,zw4G?߁IYV>p5kft?h)fc$HCK]U zxsTpy* j3UilE8~aI-FbY8Lrk֬nor@/9c8Mze1* 9Oz(G1yyt' s,& 7^ߓ@c+sI>2*],ҠCwo<*6"wd ԐqJG͝3*#C֣}(ΡL'2U+zWC9'Wi8pؤf=bpfq)3vƙdN98AϠ6jfıP AuWH磪FW|Qg Ʉ :rL)XB'PRkQsI׃ҕ=ѐx@dб>J 9p!7 YhvwJ+ݙET0M7$6ιs>KcM}6Jz7bV8J!cc IJ0[C 7&pTIwUm :q9Xo9kZSj2eO>DZ3.-97p|_-3+)ݳc(ɝ@k}P\(cU We#m0s}KjBB?9t 2ĢO7Usm߾?)%EjNw={jpT,x PUy;YP?s+.H†~z&z@WUFEU1_j>Q/5 FtwLQF2sCڠcK[fKێ;j@KyJ C9o>M%D, Ub 3VU2(#<􀮗Uу|tނ bAs ZGhC@1ctL C5ZE3a oB .sG#7JT~T30 cG~3jZ)u4#3 ;- GKRaMU1CGGիԣ#{.5 2oB*al)qI,eq>ݠ?q4Yƹve1Oɝx&;ߖɞyԆq4~St*5*mʍ\հTAd9(?t:- 41'B[kF:Uޙjh4ǹwީ޽,4;Dn>}1f)tI%.05-[k߳3tI *tkePJqRE_hx WR&F OlVhiψu4{ RNU=6;R߇Ɗ|ߌ)Nwpjq?|ߔ>\MJc+y7 ^; ]ܕ@R~42ȣq=|G2Q o6iNCG;AEALJ4ndk"AJfƣ 5:юc0UTsUq7}('8\@Md[<8W kgTsC0)t6D&e7hk(Hrt2sJ8JoPyOZ9QLvt@z'߁![7J:u~_aB"|4 S}L%;;[&a?ѣG믗yռzUip ]ϹBb.p$&!a7Emjߑw*`ԳEg`oahpX!՜$EW6) ǁʄ6XTd/Rsu퇻x~]ҿ3'~k6<CDpo¦_f<j3`[iS =l!qyo?ᧅ{o04 U؈>CpV]Z2 ٙ){*-ځM9Dqٽol˄Ml߰`u`ކB7ibi]upG/I=#95{w!=d943G2Ykq~ll.[0kVL 2]Oǂbډoۋࢧi 9 ୈ2ݠ?YhӠ\&MXPٸiU4L9y`^ .}4^7xc?Z4o.~+WSZ#m-o3oč?4o$m Fܕ҇wO>  LNG:H #6LVnzZJ[9Z%kҐn3Aq-"?ΉI>d{~y>upܧ8x5W1e;4o;߾_~q%os=@PWiWnƩT*D@.JM<'uA3/:N>ޤ>g^ bQ]9Lf):V5'+cU2L\:pA"cyVa2}:cE\ ;/=1[ Lnƴ(DiWa0GH廱]Vުk0zJO<`IHbcO>iz )X s/xꩯ0x׹0pG]!|{2{hڴ)>3|gx駥j;F%tAJP;41 8T" U . nJ *g(661C^Zҵ`P1bpϧ[%sF<~)3Ejs/LEEU~a51(N]:P 仦bбseKwx<.`.ۥ \wE?{LFnq)C1t3_;Vy )zX{q.4$lb-سʍ >p`&ի@ױIݲz^|)*4L<힭齓BK%^#"`A+X@Ŏ(vEET_ @#; mwvfvI@7<;w{ c< \:HQHD4[9ب3k/^7^Ŷ!saY,(\; UWbqxpH$HBK,cW_}%zӦMq-y_. 8Ų~f:;"QB84Qp|-9zZhο}6qOvcxҫm5w?C|nx"EjK]Tm2@Xt }b@e;'}bXZM0TjLGz־~'̟[&`s2\ٺze%8oZo]pD&qm>–֫Oaڗбa?NU!.E&6 YE0wBU &}vJ㬶m>i;϶w1m|Ye\d߉&*rOy5(EjV.gi"34xgHKKA E@ц3 jC0oR&`m)g%cJ0 h9Kq(wBޒd 6-yg>O*·fđ-1n )2)1;_}?ᕅ#9V$^CprDbS p|)]gbb)cd BC Z:ti- kX .UgXWjS RNv>p BT6YmԾJ] pzpET߹B){as[yo9K'~1V$"< [5G hFcИIhaZ#KAv).v٠9s~)HKnx}Σ|u쇥Wcu=_bI$ ٧aۮ2QZ;MdtmPH;#r>#Ĕ!>|~.y]܉3UE4D{ئoK2d W+qr.=[M":w*޵u6T8ѥ%ZGV3^#-?t+7;vgJ\p_ସNIJCy j_%Iߨ^8m\Uשּׁ_T齡&@i>܉KeR8ٳʍ#/\*k'{u]K7Ep'_>do{=ɷ19(|sҠ7Mbk{1o.2>]]&^q.^u|׈֍JC[dwWOa&7|7İ(_\R,KbY B[CL| ?/;2 =08NHZ_-~^wZvjtSN 7cPySf}L0mrcg[u~v^mw.mk&kYO>86Te^RS M8+RI׌.T,j.v 7~_~?.׶]R⃬xgؿDSi˒I=dD@O@%Քv&wTkH.-R.=NHժ~ .~jUjkX"hkGxc#OND[v-*~-wm0dTvF`ޥRy@F&sC23M}9Lxms5Gn쫽Ϩ.QNůD yP"\N$dGAEjKm.R]]yC8~{+CrˎH`M^ڹ;\nPZt)ӵ8} j4ђܢp`k,&8F1蒮uYo„zD N& =>xyr#HJ\9gZI,WZr|+E-I&WKλ}>//uH&M6ߗ^oe+H^ÊA-nH\qnEjKXڵiHsy +gm&x+t oHf6$a|ںJz?ـa21 {/m+E%8XǪS|߄HN Bܑͽd kto8+Ί+Z{S 3C*1yNui^\6ymOz|u}MwsgGQ׬p8gNjwPSrSt~N.L՘\o.C]1^_oz.t[3O` 0sd9~8,=OV9Kx] Юcgtk ZĂ ՟O`s':Vm1/Ǡɯ`YNoQ"6k_wWnƉ{1{x=w`X_;I$|ֳvThqm Gdn7z+w⇝}=(vlQZpQ$k *Bŏ!j ZZH-_\_K1n%mO~|iݾm}ҶUwSZQ蜡6JfAa34PU+EjZ*ڝ xP`UìWa-m[B*/.VC<ؕYt7wbvtΑ.qa?jZd6Bl9*0D*ك̎xشynoýc'㋣I\= [Н=,7ni!2wlig(NAUg`x~82>x H/e7fcm7>a{} Mw  T!:{>ם=8j~r<;̚qީXv' kn>k: #ؠOPԺ"@dU!\.[Y^P9U){"B5lU*Xߤ퓶 k:P HU>Tݫ3@$9C';:9C'@Wz:uTv]͚5DUb9fD! >ɁG089KXG"\k>WwgGc(͋m8O`[p.̅i> |1HJ`a|I h:o[bWW$sG"͘s$,]H :8 /Qmi dߌU}ToGFC} MөոbIiC0م9{p @btO# IƵF)ȊAZ {Qt _O`c,+#mB{}5qհXu6͚as1skghϓU:X"1>d[u%=_sK{!ɏն h'"u  tkrSkp/0nsQ#?3k_z[c7bHl: 0:;н z4AFrXf t"7T/4dn{49o04$ ex`O= `ߣWrHV l04$)j)rbM^˾عEpod-ڦRƳ&z$mؠTrOl*w1mOڶJ퓮+O-Y;EFH狡6b{-+%ExJ}ܯ_?&=s񯇦iIwA[#†Ѽu/Px9a-!ah F<4闂~Ea|Ww+ B8^" !%3%$ZD3.[uӘ;^<n63Gㆉ%>"#Ш $zGO+@\TFUִEuɥxԁxhK8΀g#Q]bv \QHm|&}]q"קOYg`3h؅9,F1Ƽ莸ztkiC1hL"M۟@Ll0ᙩ6ԋUĤrǵs{ Bd<ͽ!^q.PQ ^?U=JS6v CO.mYk_޾#/9&Rhb䍩sN@mr NkTIs/bTNr ~5D(3زu7\]ϫ!gl i4\Uկc#ߜA05쌡=ґ9>5燿8ӞGLlOVOOWb:<0kd\5wXLX/Dg?e-|v x68ʃw9v?n@ :@䔊.TʧΜ9Sd"0 ^' nq p@@AG۟ sfwØгЫSaqg/k MŚ;A3ejU{:ղkVXUUJʙǁM[Z>yOڶwm>ijń^G"u b)tDYn9\N|w5vc>tQХy}3»7Ct?` -G¤'#~ɂ_Bnzh ydc'(P/ݗ_bL6fBcԧL1l,~|>\uak -ғpm\6VXmv1,H•Xsl?]"t# ݊og= )uMu,+lRbs ˠ?˽AQ^J/( = PІrjr0߆\3rr-(4,1aSWoP4U39ӣUze^^RU6*.H~+"x j}6y_Ǻ}Ujkνܹʝdj?Eji`NB@rݺuCǎb\~1HrR߹4OGFz6A|=D8 I0z2CjT4iI A0Dف!CGOOŞ)дek녏ObXngpМx[0 /ODMGkzLmI@>QX78iGj\"69l r|19?뭂kzlԺuo61 gѸUo|t8[׮CB EI~8Wה|&]Ls}!&&z$0OiصPfMa[_M`8yi9qo#^]SW`CtX0:tLȪ+'/GAn>@DńB,ܾI$z!l #t*j޻f䆆_Eywn Ǽo-*2e "!X̰c_m;6WI5믋v>y ]gK~:GiT9U-.*):+u`8԰|*h-l(N`t 6Va#UW4vCt* a!fxNQ-j>; P.m}ΒISi5 X1Mt]W| CTSV?"q Z0`HUMf݀HK@J66 sm&l&ڼCI'}_}ԉݗʝE)tTܸ84xSЀKꕼɧa…Xlf̘#Gz&ev}aHL{qq}FJ={RW.|>,ٿ:rz;<|Z&h܅KWDg>k0'aVt_o0w\1,m̘1&qd;' z8sΟU{wU4Cf3հ 5T:-B:ˍ+>Aaa,d2\j]8$KF@5N4~S`1όc{p[:&p7qì..G }e8۾mGl-u`5!#6,=js9C ;?@@>~ ;]PTRSd2~GmtblW_q|џ~gOēQbOWB#-#M\49 (+iG]q̛~ S!!BkS7LëBވbNwJ3ʹ>~wSNV:tbr/wNBv<wtEjй ri=`M6 ']bԨQԩhZ&^ J=/.=/]q˖-Xb>pzݻ{r@-,,Ltr' gWg "LʉJUQȤ⧇Y,=ltVn<7uÔk/Obkrx;M @bºCdtMѭIgp+x~*gm o,܃5!铛_^"W./HCT&6KrrM>Ν+Ox֦ S!{!Tԍʝ;܈/ۆ.! $nWUg<'װw@HߤIQ矋1@(vTQ!pPL%5KF$H im61YtJ n6QB}K9-o\.ˆٜL%CՌjK #+al]C6WpM~'ʺw..Ĵðߑpgğ >|}G?0ѭhn'ܳے;j?W+`q)2* 4!a[^F$ ` ;jG#L6F x80ܶp}H!^z`#RCю) ¶m=~Gp#3cÏfڗxRmo}qp),3V#1V)H T4w~=uq`8S\`n#}oʀ?1៱~efl;1`y1$Z[`wnF ċsVɈ Јʑvw}UiY6LpJOE. CN@lJrcx-OjE~ ~?C펨>ha:_2&lpW獆gr M#qGqhq\4wMM{ ۶jXZF Bc #0t@aVlv,k9Px4BPD#vo"z]ʳsu*t5fW`pږ`K.^79[bAHӫs]hۇ=op-{8U8u_Aa=|Vd.~&.A:OlԼF"ҹHX y<1@G}-дiS2x7+JhMLÁƝi;6`.U_hZJ6ٱ&+l6|Et’=a6 EFi,{D/j%a#->-3*hW,`իbjfǜ<+Tn Վ0QqU6бMl"$-2!0hqЎ?kY0ȵ#5:M1iHёb}F]g?/ ol!95Ό{MmWCC} 5jȳ:p3#q`נ9 ُLVVlć//~i`fqF,*ԋ AD 6=Զ<8NN8"hJb3S&OWnT*w Q$&& " r{:Ch qr#P^Q"߇ty84-HH=ۥ~1_]`nT'{*ӡA ,~*f ,cIl0?3ཌྷȊR L,jd`V]L8(9wY (7!,*{ƇZϔu=0ql B VWPٮEށosñ+ {mZA`m1obăjivcxf|}Z V`j6&1`.c- ǸO M+Qـ@vБ-j}յ88'~[ƾ[&P|mF59Ԣg?kLt('['kl.lDnf{6C^!Yp6X=}t㘕T#Ñ[L%kCL( 2®4NPVX" Q X'2p]v:%JJ H5V (5Sa-,c|wMv>\mUf&:y~Pz"ΤVy6{=] qw@ lுMP{fmNXi[ug( (QBIf/!핾Xk%ooLDi'# N`!`%Cz*2**KrAo#@UY#[9[Q+t_X99 sy-T][ ܁ع ,3qy6vv✙;w;n@T(5QD.m}79K,S`]mۭcIc۶InlFmkEm46zϣ9[O#||Dq<1ae9^[U 0R C55R̖ u:yPAH=# q!]hM[)騩 i;7 !a2)2sQۢ"x)||ctb]B@F[ln9e4u̸gt^s}sASx_m OjPT,& u Ԕ3+ԣ^#ڈy XgsMl"|ZྜYqSչbOKT um|e7[B}'-_mU巓GDQIlZ#n#>%]Lx) (ebKgѼ:M~8ux㺖/`:H#Vcο$Y XSVW8@зBlu#p,jCBQA-gF$C-v5VU*^{˂f;5P</ߓ}[2WLH(+h#M4O֑k'}pMbJV"WP,")qWF#"QmE Mioҟl?vH !#T}Zؤ/YHDpZ` >J׸Sskl=d~>Z#9'Ә&h{=LE/Mlj7swH)La$x8b(]eخܘ>Z`}ySͤ$GTΊlr9=HS# 桁uQDFS .J·":.A+}6j\XL^;ZT[ LvdFi i>g jjpRVBqmFvm瘽jIF" M4.x4Wo]5:sW#|ڛ]y2X稲r)/)+vNVhD\ HcL(d;=,^b 'B5oGwk2>.68>@n~”"xrCl2zM=*%N$7*CpI-5t dh-,2bq3 REt24VC!;6mU҇_9)~ ΞV59h5s JԤY1aCY(Cs ` ^I šf3WyTǑVN!I @yKf0+{V]fܸG i%LWSg!_Qµ}a)҅\~!p~'ֺ|_8X9Q@tۭO({zAVo+s?{ܼH޼Y×PmύGRR뾦<*8ǀxCG2N$%ŸP I6R8Sf4մN%u|;'sCoHd۝0`"'B~5QѤ{ƕTXJ.ժ 8mfhRf.^2_t}fdsMD;a6FY/ -d2gt,P8?Ҩ+eW^!/?fyF{tB[" ]RVvTlhJNM͗ Qu@-+Hfx=*(li+w%hW񧲮d YHʺuiqf3#\G̏IWdxί΢q@h%4&dg"|\0X}$%$FP õRɳKř}S[tڔ֍nEn{[Otz#%<05۾L<_sNȷ/CWf)DưB}Q$9B _P}Oke yT?9bbVkL{XÒdRLggD}.Uv[axo!z)L;Oߒμc@a  dm;w3=y#"9y=ѺGOJ$1QEzw`<\heVH6,/ ӈ0otj|VdBNl@rl} BO$Æ&ݪ,Ul{skGq%g6+M"9Ww4Y8yw{#~īp[KhX6hZK#o[x*PxV+=:?iP; ڈXmzإů$NZE^d M_*#t ?obAf?}hhҚGCќnH,?/P05T-XK:}^.1S8B46^ )s_OPC3 S-"sXOR6W8piM $G޶=go8R[e7 ɳn8ES?O+wdޟ&D+ڗ{r1n$4XRNdı?кZR]T[[Gl86 7fQbŴ쾦Jb Gy>6;x iy;5W2D;rj\(YMc4j1e4.oNkPHINCes%_fmQrq9TXuEhskVs( DnӞѴypy ?hdYLSġ݅\\ 4\l+Ϲart=z2 {y4膦͈\NTNj2&%cg3 HxC<À{-9VdrN/ AXϣM ~'LE^|H eJE,>R)Y MVv,m^bNLNyPc}jUJs`=dͣb`d~_"'VLgX8J]MI9)2ac0~{+ 5UK66esO1Hy I[4#f=cq1)ӸkA4ˌ7Rʂ >[m % rEL0S8RTmyn#Y rE~: $tZSKҙ?kY-UC7>=a~Jp0%kB N~&g ȌCcDF#A v[v!otug=Tv67rZ^v~,O&,dA)? _'lrFT|NJdZ'<*: 5N+{Bc1P..®`TRA]XU,zOfVM΀i_C ^:q$"^i\RT%1!~C2ǛS5Zͷ02_X%7ewU]潕E&m-hv8: AxxZ/aHHk6!BtW2a&eѯ@@'賳PQޤnupyT>S!`Ȃ-ao[v{r"rm;!6@:|`Dj5spzw@@W犞fnɱkke:L )['a{֪da &ą4+JVAW^ N2o6Hg<-utڛK'r-|D"Y9qQ*rn(*&b"'؉cuwfqojWk5Z.Bŧ;p5cmd}3u`F{{46AXZ M.dS.4;PcǍdq,wCbpèܥ)')`6f[zfykp7Zl1=%ه:0#jXD̷DҚ&]iFyتnޙ kY}1YG٫wq!Zުx ?eB;'Hb\׎Qw^+ɟRsʩ³NT՜@ɟ, {۬ {2299ٍǿ4z<3!ĐT87RJAw?bvIbcm[珦p/e/]܈gujęF?sU+5oU*wcoq3>KC1c' CVtA#/`}g6ozVdK߉jnFX'c];sNr1->0c_q WQ u"/nXKO%JÕ(O:[=qjgpMi,!  oubwlNЄ|M抴ޙS,ɓـü) `0f}JȔ͔_ց4b  I/`3x61W/ HM䉚 /PӂǚEF g-zm3u}fh蓅Dha2r.$UTTzH[d-c}ճ YJ wkJ+@At? H:zggyȹ[̧]rѴF@8d)-R2KK( dpݻ2v/";,)k[8~Smw=FE|-nt?ؠfWkf{ŘtƬ^;mmzzz4'jQTsR›ky)ΓSָ/8q 7|w9O[[@fh8bZm S#zOa ͒x?5韪N NxI/O|g?gO>&&& a߮z͏grffC`߿7_I%n.EO>iL:i^o>߮b큥 MzP^?d;qjguAq7 ~:U_ JNo67 0_E042(VMV ,ߒ_h(UskbV{gqI*+ $҃yXOOKL'T@rMLt{p0ɥX\\,]>֋H˛‹IavG/zXҖ V `IFO4F)!ApCt7:PUMhzp랊E@!1@0).>T#r&_Op 2$v.AǶr'ԃfP|W*Cmؖ[%eY5C\";|ۃ!x~F,MEF?j՛}q?V`fÀs͛zÚ[ɗc/b`n\UO61Q Yfƒ^H&Y1-xn|Ռ]ݻ~,=WmĘ3 22~=k\r kXehV+75kYZØo< Hڨ|^F@2|T:Dyq-Q D( ̅w8+<r0э~!/ǞDO)^AE F\&ߜ0u_>p5Y@;[%<t|%={-,#a^su^pdGQjR9[nx<."l D .h_`~{3Q(}.) B Z66j:ȣG|D5QQhBXvy|dJ3H0!x(6M ԉZwif*`Cg*6܄P 08pApQaU]p`] ܾ0q&b0.rbȢNvd{%v"8^#c.H7.I5w @!N=.7wA؎&a8~͊*9sRh7c3HH E +E3EDVyUiFL* 7xfru=j|%h]v&OY0t5u7,wX;ʔNT'c gdt(;UǪL#9̬i\sX֏A}疺=MEOdKՐmF+:l%h7a#h\`&!XϏFp͇`~ ~ϻ颚&?H'OZ&d{h0}%FvfM\_cr\kH[\f"*X xro2VzV}UgwY29Yw^JQq6fq1\aN)_ 2I5-P\IrtPd@r^G %<ׯ`(F!NN/bvN GWkޣ(gS츝mY gq_ yGX'pmeΖMY CRx IZv~s_ 9 %lݻ pٿ+)]hWP1 "Ԟ(|SW& (&W MQI1@l{_څFt4$r̕_6̗ n=P0UhQdj_~V4 \Qk-mbN;YOu3!dk/ϰ~1qpeD&o0=&͞%ǰ͉?n2ZiPbFo֡ (m#ŇvJ.v)b/@,h#MtGu:˶CEьXyK+JHtx'@)yo?CڱƼ)<$sU=! 'ķ@"o1N6H$*V== mۿOqDqD]Hrm0 r^C,_U X]b(G)dgE&׻V-5cVee#Δ8Sĝo+=AY<-8[4U|V rng_$) YhMoIBߖ#jv_B=5%M Jov ءpKbb0sE^enV :蓸\p*w-?>2Uf|:NN..mN<YQ%0\2^2_zzr k H1$N 9fFW9>PK_G՗+j213ͤX^/y٩ AWf= 3#kIL*Rᄰu )k9G5zcjNFW $%&) ♙Ͽ0x*#ǯ^'DR@3A Pw>;1i-9M^^h泎x;JɶzpJmUK%ֽ!ed#G1j /m*1%Q<8 xOOO3xJuɚ/Aa#"ȗ> J7P3, ,}@8QCӮvgvV셴)t59/08*^4C2JRB`ldSss~$ǥm֤ɬ@LJ39*# (LΔǍ6grc:3KF#0ä;ڟiqi =;(;rh]O/#h*IH('ЩU t:A\C#JgYIt] 㡿p}QuPvۉߤќZ@6Cr\BA,]SNyZc\>-7&KEtkwz(oႝ@BgثfG@+uSD&L7Nnb(τArvRP,xs޵b)08ٿ5wq}cNcW1 _S<6&O .MMljRgZD _;iur_4-ӚP{,nvfPP'Pny1SCYPbFM@ˎ|&^#Ӟn +_ $;jU0[n2B,v+i93֥S̲ f^$&"8lr|R0z< {9-&Qu}8Q7l杻PGNtX&fA+D)Rme`N+ުc[pΤaKtmRyILgQAYa; 28,6* X_JrȒgo}WO*/+?*_d6jGf5w,6r@C C G@ $' ~l ,cx8fPszﺕwu@K *"d[IaOa(cMu;[J;Qpa>)ˋܑHi`(ʖr6" ̉qm*XD@nbԛ[wgev˖%JDbks=#Qq_DSTu%v OCf`&7 j(_n0R6]~~m4JYwGK?z9C0̹_FH^YCSQ.y2:əNb $B aNJ`&zɶAC:2RZIR+(,riqӱus~D˘+Y^Dud\:O?}'3tg 8+['Rsm @8b(Tpɢ(aE/D9w X@c?*CLY/]m'WzQIcPV4Cm3:Wxǚ[zՏb`hD䗇ѯ' "*GvM}3b-{\8-UޕxM2z2S+r F[2\*I^MAwŌk6K|dcNq0{^|Qv? ۡj.EP|$) 8MI.LzCl9%\>M[<ݨpj26 f|tXuwDA#.^OQ3G7%ҿ  A}qK+-c$ad@)aНfE%ݱ}d;&ʛM!_QH1I *zh' jcB|NSOf]wB4H֢@Ax{LRe 4qv# ;"I.V-sao3h"CǔN++.ӴT|m0K${zQlZj EIw*[h5_Z;nY٢wz}~8 {/ǩ"O~#B? `ŋN%@pyju$|c)oO&B'b(en.&ۼK8Nl]O#dſRz<߃{+|)d A"'QU&o+?Y8\?1>KK;!hjϷvodkSCf/2_M},CC!jIYumB:à:a e­ʰB7;.F}72}ot7Q9Ue &dݱ4%4l(hni֚Pr +6lfpD'zh7}.:N/{^^DSwO˟\vY0ܻG}@fU{[x"x@k:Y-6>ywN&stzϕ LG_&v+ĹD4]ft^4_s$:&jJk _ )LtC@:͙Ŀ*QN| uvߓNfgo9A/*qx!Q*'m!oD2eJI3b¨xkX3Y^RfeS7W(Hڧ e"2aa`Vfn+R{\`{_=`@R=fEt}~UW6s.@z 'iZ(xk_vN|R3n>1\xjC9y].{2knҡOXVYd䶏gd^sm9WijQGU->l(ƳB%] [ӄJ\IWY؝!+5#E HЀTVGhBr@cP)K#\5g3h?aăw_a8ۖ[)Y=yHM8(b q'B9GlwqWy%Uɢ/i;' ~H2];BثH񂲞ƲLڭ%ob"e b.R¥N }OG>Y#eA\^םÌVzG> ?wY'1ddՙ)&{N+4䫈 Nszc"kJʮb[ 1;Y8:|  CζAg;-Pv[ġgQؑqD aQb? ~HU޼.r_mKm;A;>mw#dπ|dSԶ'R?J]$(߂IAakٝ8}m:Ew|p]/!07?JGDFk/ atWI^xwBT8;n; As,;4SMֻ͗]ꫝj>B ="۠ >2v1IzQRSԄ`ޮ.Z~J`RyC`CMH}Xhrzeb2ɑH)2F/<-D/g|5G/u3noe[3e+cѯP*" 2+VlٰN0 U30q KX~O Hhw{ɖ&%0 "_n MiF`x/ CH§>?]@ 'hxYm<6fԞCd2Baa뒉.8!(ϋo*.# ~ӹ;.Äي*]/\\7xL\|GΊ.hdqRZAٗ3"vJ(w9w3V ŗk iNπ1i'\ ! XG9ᇎ*&|%%Mخ^SُAZM )2wV0dD ԅf=يمQ]1ã#sٶ&EvF.D\fu~ Z2(zpyj2q8\$p52OcY5Hfӻb^ef i=f`,C&GQ+VI,mSz4j2.F$-Օp@7@ vlnv:tffR}MpvooִZ&}Ah-RГ^߃-TSgtzy ; y;c7hnnsF[w}LXx6U OV;;/+OqqnD d3꜎D+kr4* 4. `oOQX!YA<2*p'j]R̉ ²8/+n(F|>xY(c>7~FХzr ?^%-VSEH k3=t4wZ g>>F;kfz5K"))o³ߍi8ɂ-䧅+I8|RKRE bP|NOf~#<>$sm  1-}&S$"vCAgՀk0@`# %՞~7ޙ4'[$TΏ;LK9 O$JV 9cy¸Zp2 KP6(I{Xt#65`U|@C93Ѳ Gws} yH5|bW!܎áw+›֦NEKݧ`UU`?sn%Dm% e6j@@PBdl3K^D͈f?.z 7#C/n1djf}'AȅOR2MXz!r~/L(7Ye G7ZZ0?Kh۪ VD;:@_B걚K&xoh5ZruRbJwNHlOlkTbWg~cV:ް%wi"g$:eJ8!]*#?nk.X&_`'E h3AW` ߄Wb=Z!;7,sfk̖sVrC#2bVu1uWHx/{AB(VTi!괞*m"W* \1}|a/ K 5a}Fĸ@X\-JAM^رCصr.l>Ptz#jVş`˶;!tJ MMQlF]v"}|83ʗMMF5V :=9zuBgB;cе LfXx2ٮ>Z nC'lrN1EL=6Y1E-yq袼'FFGZ68iennvb%9.YJ;' P x3Ԗw֭}<,Q"V?Ud%0FaձUTXõx+=krռ+!B'v% eCJ;~5_rjvk+V]vfR,),ݕ'.[ ǙDZH=~ C7ѱkghBX4]vLxVsNtkC`D>rl7 x 9ϣ;ZBмq+\ˊDz?awUdc?w>;ʙ*xBKc)NdxWҶ0{ {]UO!Xٌ(-Lii}s A- t;6 6mR:&bE 陒שS'#'&@'Aѓ@3 DHr@wԺrدmT@ϦnG)\c\q<wAndn碠ߞtΪtʮpJZ:ّ+{٩ysq:.t6otwx/C6ƴn6&fb!HG0Za"&J$I7m@G7<t7ׄCCwe37fжeG)ɩ2]U) 8Jx'+MhZq(UPC;Z?U BpD0.V{{uЦ&liʑEz(_dqG943J$;*8˔tni0c\ۦsyй"ϕk]0ft6G;otwx/ց 9Fti*+?ã_x<1uwY={G1V D#U t8{?V;Ńкe{xBz\?8$k ~U|̄ WӨT;yy6'% 7;Ƽ|b6|zh9Y82NKɺww/TX$Ev^t4tkag/bVfi!&v?@ӫlJ 'iD*#@H%*@PENݑfMMc` 镎A3S'ǧLa55AE9b"O '@:2{'"Ʒ(`E990LϜ>(j]QԴ=kUavsEs.HZUũjjn޵Yl`–/PñgX!th5s[:ELxa+Mj3A_I{Rt#s%u"fHȘvjz*K"jb"4Z I0u9}O|Ȑ(ܰ\gřbLxTiЙұm7zWFoGسg-4+zE*1Wz%&MZȜ&MhH>Db%O uѢ{dr$%i-Tyʍ^hrH'~oNV:u3ŋpIː]唎'pŪpj\wLf枓.)9WŸQQ+y#>%JDZ 0uQi0JD\ƒwF`{qA~(]7Jx V@Ҩy8g uP!ˋ?_C  cW_c'9]xILMLJęG (c]>JE#42~Wx:j67e 4& cW2*T;ŘPByFi%+3-Oi%87L+ ~MSLq,H3'ilg4IJPWB;Bf]o(TQ.J̅y]*A²"^~|腡:q!9ڗeͦu|-XgŬiGЪu gܣqp"rX!yG]Ijn]y |w{i`^oi+ ض+U͕LM_a"RfbB$LBfmrBZrĈNE4;*b R>hPyLZ-cǎ堲yf'}3pK(skZ`5] 9kgL0y*oEM?ՐG [&9pNCux ÍP)ɃZ@sk{SZ}g/EU\ƭԲ h޺ڶn6Sؽx.m/5QMPfmFY`b(_I(a2u FMT`b3-D9"0 ;@Ε]@CsoG#tzNb._$gRMkq2*_H@\4lUwkgv?|0`GaH &fI-.-Pp|͛7^m>|EMZ@̐HSkԨY_kxBx"6}CfF s74qTA\dH4@]F,3{:ÄN@gڢAR!7Uu{Kb>R$+#;ĦNZ>j\uQ8t7@y#u84_}: E"飦TER3QjT@-ꐅG`;)ftiVUYLەuo@ xSgւxU aJW.yZGGl&qd9\k'ߣ͢P4}P3M9D\MIoN^0p()$e%`׶B.w~On.X&=XٚnbJ}&"P\ lGCyVJ׈Cç[J@lА~E'>_ LTaU(v-U6[6F+ҐS]q` / Sgo+h21M?80!x|2|dIF@Cl'_n-Pvm%̆||_]pryz[G$_P\A_|+e:)TsRU14@d+f|8N$A[:z7Ŕ_X 7N*<^J1a)U r" !Y5eBc /G`@NV&rs`EzZ3` !=E,%hhD#Ш֣<:N^CF/4Kfgs?r&d,U;~8/vCM P(\"ߙ;s8 ^A@.\!/tkԨF"{Zzac&wV)m\#'s!կJQ -mٝԭ&gUɢ)' MkSTs|t61%W/D55?(lB#XV^fwѹ]~wQRV{+^ڭ&g* {nexxcG.I$Ҁ %RgZR%NG-ġhFGimwGJ.(V:&m-[7I#סC4k֌>M6YKs17x*ת€n}e7l'oH RqGojL/p ^χ?:\)W s㉋qpR9;?2Q{z8?z U+PT ÊrnrܭA❷ȉts/_+l|kW\+ h]//NS|)V}&Z_pypwDҤ`.4=ڴi.\4)cǎܚD@` ib!ޤ\G/! K)=WX?E.]Q$jQ}9Lvj* KںFp+n?׈ /ޢ'ݭJ7$r ^SotAKFbqkٳ'E'y$8I4x`iLESN@iaÆqkjߑ@=k,NC&nFuɓ7o?+mJ|k֬QĺmT: iNwH.BD l:WF})kXB+G!\BJÜL_RɘǣAȲ`5[\y ɣ_ԘfV,9 Ak"uU|b(O>:uBTW dَrŮ R"]V#AULr+WUWo>۵gFج]4(Idb+ʢDN3{vAc4qqx7BA__Gh lNʙ+H#Dq7_ϞaL_Dxf\;7ct9혥btQMjĬ#4PϦ%נu}uYs0=3~y0g⡷{ot7{stswjwO"o:-U5jTcyiZʖ-'|kTiM4{!'%&D=Vi@TH AA"~ jE:2_R*ͨi>t^t}tvGa\O4_J4mU{L?Nj.n Pu9 E0¬ÂO6 i6drhCT*5|9r.6!).B')^R^ !nW3}ݿc/: )-_C|%:v(,y~`N4<A&Ғ|`_7 XgѿEOCnobHӒNo~#bǷkqYoWW?nV'Q56Emv"4<>FH" ȑ#ѤI|gNAƻlTZXV 0Nx;}>jC/jߚ Xŀ&Ð#smnGܫ+ln@窕8ܸ;`%(iuC{eKň/@@7P!Դx&Fg^4&c1a𱈈tJ.sy[Dmot_FD=&-BuH`!̛:5j@FJ:-ہ&϶DLyFv_gOakܜ&)g*J>6zv.XU?fmAlX+Z6r ^EQ٣<2$t*H!˶!v71*`_4j-B5ģ4ƺk0Xr Рa~Q!t˱uz*v#?cxb$4QEϗº}gй߇:DW*9y( ӽOVj$ L%T UC'?Dw}7jQ|\y282O ,~ V%#r>d_-"uy8F\>j7dStmmO*5cxV}gǻ&")&"?/i,*qbH iS |zMQ\= ^U@?m1g#au-lp b^ = ȱW6}|fE33ypV\:WN/>5?{)#UVE 帻2YW(=;};Ǿ(+89Evw~=N5ArX[<#Ƭ?Tgc& XV >_ԯg'ݙDz'|_Q}c1g[4[ o5oWú}SXr`3R9_6\T UR"%ڇjUڡxU=~ :On-sfzq8 i/.>_*|j$0?oG rY |CIW@fv6Z,1s>CV@2Ϟ= g%hr0ڷIɨVa7[_e/|uc# cId |ƈS]W_/P-P|>i|E,ewvH_QY2Y5l^n@0ES,[;<8I[DVEL3u_<ZhXvѩ26 0~tG5ѹۆȼN>t+K2ktj6|.V/>@庑PEp:&PD6t8+Ws&h{2>yõi7&ѯPy)< /ܺ&0#S`9<;.u[oaؿ8^1X>Zc[br?0%KzL qC933v˓z& Xo!XDaE%s%e}zEQ{G;Q\|,+Rt| ㈅! LF$x(ߗ(W{PD`iPwb+Ikq::۷QK;w\,]_BViY>G$_28DɄVr<c"Q+ao1`P~2"fʇr˟)#­>0zc2Y#i[Df|"=G(S4 5<`4@Q 8:k6&h n. C>_w?_ }/TCחbf&to/>Q_!l w!%Z=+2c٭$Q/^UYM[&y] -2IMa$ʄ\x{8r9E5^IFt-FR->xzX|̆= 8._75{kȸaAhXiE &حfB+a*X3l'PKu]ĜuI@wԑc$^@Mik?_/mr/߬JdMMu @c'ű:ߓ 7,jX{Zᨭ-+mGҪEД\qT'W%BʹA^}7sp(Ѓߓ;9c >v(r)>ڵ , OJ(%[+ z.R .JΉnn_:g:'~J4 OM.Z`t=g˝E,t|WǵxĵdDcTXSϝZ{_6OuE%X6SDċV6 1@7B>`}ՋqL,=ƌd̄5rMиiѢ>p)2|WCe\#-+]7 '#<8u 9UM 'hzG(|zp-_CdhL]-)NQoم)(woYh,Tad8p Lwyrx6}`:5dc[5G_ჺ]l9eavBՕ^-QCϒdƄIcP0= DɌ].zf^!yk&(gqh dD}Ɇ)leѱcR 4y!@&[K1*._žxٓ xKrO)=Е۵ZNcO&ڢ;&woqp}|^yl;vDQ (ԈT @f{YG 6*J#_ϴ!uiz(Y,28g!Qu*9}2<2|GRZU ]kW*'"!Z2v\x 4|BѱYqđ&]=;rp £PY.15i NFD~{?jRCgoABnPIS eP$FכL)H@Jf8d^JBl-ʖU9f9GjU@BW:#F$6 j8x|v_@?4!y9V&33h+ 48πkLۣt:77P\qlpV/\h4<KA q)mJ>)>)4(,كJ7z?6uh^=׮@t{YpQYWFT@>C KJb׾cf6ՠ|@g[;Vؙ/1%? X,*|U("_bǁ(Qo-iHvuYsKVBPLaؗ2}.rO=ЕbHKE>2y]K@s_lSC̷q)zUV;5Də G:&vL2a0 vDWEB"8Hf=Of~jdf/(L1d21? 'pRVoEц ?5OgXPio]r6l c789 &b|mh7^Ůt\c1fN+:1E\`vS fZ\ըX #-ЙGln,|rA:gW땭DLN,T]L^#kЩn1wx[ Vo i-lLޯ`94:I89%-JJqHjMk!9 ve4y-)fq.KY#%+ߓJm1m95g0 a] ʏ˙1jG&ɶP<\ۈUShR.q?p$ӑ5#;<$D޽CM 7U6lc(,P(θ۵){8ޓr#,$O}4uCu8(:_DosUAV>}pP1HƔU])>G*QyYPP@g=]|r\WAⷈg㸢r(gv_|u-(uc?GY!͜B9ɳfdUD2cHKKeztL5pf̗`n&anrwxa4YHa$iiL{o`X&9eؘ6fIQlAgeHC6A? 8Cڶ4FTWBV>ŢMâi%^dV >kZr?0z>opNQ V.b hQÎsZh-&$\IݥѪNRü4-:Kjot#+Z 8Kvedz-mti35O_:?&s2=;2}IWb@6m_4rsu:u+ ۰yjtlXMVqy\;q*6&{{_m~R;" fc^h6|f2FfKꅀ=:}5!cL1F|qrj׸VPoMQSt (k@cqzA^`V_ڄtl^DƕfF&ATi`8kȯLcKbN"75Vr?cڳ ǿ]CWJ|HNrk]j׮}|?PЖ-[0i$+(n\lfQ'lNژhKj4dW:8 }r|RSwҸZ^loE>4]*dzTztنX*,5!":@鉶揶ca)鋔\ ^"dcQF;M# ^sĄb`:ٰ m҅40kjJ,W3QNصؼle"teMV]Uz@]r^r T3*r9b<1g * 9yt^}"P뮝efuU} F$DQԁxDžCwRH;n*^~:PU3Oݦ/$ҹjM!aH-EcPZ6O~0L&sDmhN{[BB˴E%K@!dS'jE}'o^ WAm-]`br(<@ U+g҉8zVrv#3 gx `LDk;1nRLѻ<E⺮*ʙGO  C)eIU_xLg<itpŐ:fcuHUl8!8aנT1rl_5Ԇ0*˂5N<`~߇S)j曡:K,. w"-4דI4k~MO&}=|l>GyӺ"P"5T<,z }Fd nwV*hMD]ek} T'@> 5]ePR܈d#`{ v$f+t.xVٜ@xڸѮj kH3^U]Cn5 Vy:6u,l)ͯ$6rq쪨N삑n;3( 7Ő~QBz|?T-x"ܶSALDOQt&iY:țx?t[JFc`Nauԉ)VT=ɏHʌo7{3nJvgxVs5xW9KN-~Z"W9IϺ@2}qSf`%\A<"e+J<5 $Od&ھ[R/AD)Y"%JF;Kc3W^y[nCGŔG4n߲e ?.%Pm0TgOHIEH?lƎ;&uz5J=%l<2$I>YmRp0C̎D%'b`"1lw^5컺ugz13N07VYI$[*ܰ5_YX߹V䇥 qaPPs'2sNg^_6]a$c@9$ccK&b#C"';{) oir:Ѓ>@7rs_IGkA*=$<[Lkꚾ~[^{2S/Oh̑ @kgQUQ1EdGji"K t Om*s_0fGFߏr4-//ZO)4{9kq-"*R *i=*\z震" `]NddzؘATԄ%p &UPƬ]Hw"XGUMyR{0DB=5Fbh_S蒲@4=t4FIh=JM+:>_!wWBCԀ>\Ff:V %+wB#фR`s`%~(f9vIaƃ{u)~3nbŦOGQ(vE'1{W`wm:)CaXxv,]:m\f,9`947NMn<8i6ޛ*JYNX~~1gt}i#HxGJ /!eW o n"If3%Mq-k_HЅEB?&#e@IXk<8? Pjt˅Hl_RZ1,1{z#i S)GSL3OŸ똷 XZń:/{&]D1~pSؘ'Ɯ)BU uEa?#ohŁ쇾no |j'd@z:ƃOlQ7U`g PnmW1f߉0Ehg5'Y;ogq0}u>]`X4TUbn;(&LǺ5gE9/FxVw-u_/NS ޥj$x]1$_V==;~XT <1he#-|[ g|1񜦘;SK([DTd!M6 mtO=M$JF*-qz@r8W$!'iYf!s ^NL4Pᭋ\3 P?94DN&Z[d R<2ګo'oz6}-]_ "_d C.qyMDs0)h8l`xpSq~xu(޲ mN8ϝˇ>Ga8s}̛o'^)<v.D~MqYx7 ɞog k}d\o.;u:TA(=f=;n~ ~? m;7~ ؁v vu'.i0b[hzT|53 'x -݁1u s_ÐÜ!xmh`.pz>.lPW.ѯos\|a!Z]QQc* q>K+H-uE(4>(ȯ%93xC)hO<pvQ8u3g0`xoKpy͐ql/=0||k'ʳrQxx_-@-<{EѲmM'T1$2`DNUFFy%F-~na8/Ɯ¨a#Pع0>K>wzQ-u'?ͽ?BdыZZұ){: JE-t|J`O 쥋1 .P\^{t/?2'e]l4&ސ.B2 M(J.&RxƼo#˝BF oQNj",D@jv:2lp1-Bq<y=8`jZ 9J99qɘB7Bs{!{_v6ٜGb- c'.=l:6lfվ*ڀ"V&4v3(lbhq`֣)M_Au!g^^c:f( .8)@t>&1]%'f3c 9}qHߎއuDcw)$cq02\sS1jQ&݇qA?Y>@ŴvdF}>t->{ Nl n>ΒD4ɓR0R_]ftH0RwW.( @ !cM~^^Ai9a^JT- p `=Pm;l7'UUvquј!I콯`_ck'!*_&SllCoƆx!֗si"RKH.WTYǞ3 `ï“@֑uF0[Rs~2T8SصdJvDb~ r>KiWhhώYQ㌏Q qt-ڂ3dd 5g.8mddg-3CJF$&Bl2{N@^=mF́9L}᠈cӱ(rz`5tiݻ;T1kg 4,l.{1K*QZ)fFp ǰ|C:G`Ψ'6օʏǼkl5 }joon}P]?[`ܕ#{7t;rĻB̃iޡQnU7qH>=0^-@S7|J 镌Td p)Ok4F:>@Aqq1ׇtL3&J`<:c ٗ }GXR%79Q/&¾^cǁ>)9OXBY!"񹞰uڜ8`SnC_m2/#SA:QP9eJYAbU- Cϼ6&ز1ya*j)+FgNÚ 3؀Gkqr09 ls*&.(;'vaAaoiwAum φmGflf[JI{@|y!v.t<;LETE@ݱnGxϑwqrps<`^)˕Cͪx7 ?&b4y)"~-So0lUnܴ(Hy'X+<68qzCb^/4: ^\r0n8}wgO\+~Ï?zǞW솕g73ؽوϜ-[:]Upj>tP?#zcPvwvdwE^|rcy1JܛB,)cg^:ڑ+Vྩa#0дe>@maIq5hF3:;^xq| (pj~ y!238pYV'O(LGuź"R =wYciUg.WN@\ -U]QlҲn^aa5.XfHEcGAQpq']](GG2mbo+%61@)t@"*¬+A2*(E˒t;wz-h? ~q|]QL4vlEA:Mdw(@ב [Ē硋DK=lV˲A/%e=9N2t䷈|Qn7}5cƚ9`4kޑ4Ĉ =%=;(9.;n.S=P_-q-؃gccչ38УYsdO\w7 a w9[(El#%}ڥ3[C̕nŽiUК+'yѾg+\2<<|ثcOoWaSi< lDhF.,MAPdgKǣM\xHKu[OÈmہz _0-4SNqp3崣gm/M%D3ԇpVOVc4F]γPgKszDVqQgo^xKcO9 m`|}Z =OC@m]%*ih޾ Q[]gVX wjcx57|qh 5 wV^C*G ۼNj;V,—߾V֢I !Ϩ ֹ5 v77Ԉ)c2JmG]jC.-xNI2vؾmys,C'DaС['UFf9zo XF g㖑' PV )ݗ€憂]Sҧ2jTl:?Jc7 fps=PÌe7/!g|1M}30l+Usü%ЭkwYq2Iz%)kro"jeЧd#$1Fv~mRY.s~.]3'Peo/Ih4j#LS -@F E \r^xs-HQJCԛS(x)[n{tJ { *~ OHوH%K0m{lmǘ1!nJS^O#{*HAxkEtPz}!:fR @> nW@5c3fCjHbc yPVE3623\@$ T*fs",35-)/~Xƚb`޹GM_'&`@ϭAD$eĎ\u mHKaC .``w!k3ilyص:x*M`߂Ν;p%IɊas[yK|~980nfxxsn8KOMO.B|>q;у{S+զ?MKfH)YPp\³ZNŜiS15n<(7Ϻs^K_E[F[n-pot>%~^0|Qؘ+yPJʗޣYf-VMpaЭÒѿLu4{n%q@xf%iRnɕ )(30'J5G6Jt98ص[r}=~f -[b+%]A G:6gb@ׄ1н&&'্ߤeRĝcBb3cAn">ꨣxHKx̐tO(ti+MMTɥj jǁ> Ϝ,g裍NdȑxGqo# a/id&7j̱/gF38᳆0454;L8ߵ5a Ֆ \1D1 Ą qTgUED_Tb.^U]k7xXԅ p;U $@40*U]B6+kƘ0蔶Bڜ2o}s+ײXkѪuOB'2aaMmn<\Hi 5 k!%-3vIk MX'FӁqӍxuRPخ-= N-MA}]Z< ZDbsocsuSL9b؛QT1&bۓ}FNDQ[|E<=r=rm*yP3__t^/~|]ۢGg;sb$]0f$c}_Pߓ/qnt9G9A[NjxPc~)v ݂]>8p5dъM澖K~t2AR0_ud0t zQ*# u]#FX'GQ>9px-;Ms=xq'U,"G@{{&=՗I)EțIGPh=Jx(gBVo':Cvc'Oxf-κļ~#{d4L{f*u]/S2%tyMs_Ez2:w1&ggCbT#K^IdID)'<+/CϺ9¨^J#FV}3_~#0Zzظҩɉ(+.C325E'1 ԕcۮ(g B4>ypK!#P R"3iNTICv1RYROv.7 mQq#2e}1hD$9E蹠yO O=ƾgݶu֭^Zd"-+ ;knh߹#ssxg4FMgMs^WYR5pĘ:J?_+!upK<`7lƚbr]̀nݶ5:3\<+Ŀmr2It0:ݳիW}2s; -P97Wx㍘8qb>hM] R/= x5mΩa2)rpŢC*\׿xRׯ J'3a'Lxz0GKs.oiCyU)vuH9kpS/!`I=+f/ڪrGXc*^6ZÐ#b`n38l(6WD ;x(jo//*μs+qvdqAQDvN6 ne1|pf^N]m<nx f8s1cI]@ "F'-˾U}^Ge(tqcCB\h j}A̍H]9CW9$+ws9HB`#M 9@aAD }$LIԲ~Je*cφ-8Zt+\^<;QUS;o^ kFrS6EƍШI#4ap6szb휣^i ½TBG "lj]Q^Zμn`r~ښ:/B}0wizoFzJ\׵ 2W*j9J"C'k=H +e;`i>_~張*-AfiE#x`sKYƺh1"՟?K&w}k5_f Mx Ы|JS:6Xz3\M[ssY@FkP%amuCA U!6qz^Gͼհ8^'w)0o> ?+#Vg k^Z]Է_V ﷅбwgtmƼ*0f+~@=*݀yKEh<Jݍ? h 5S0~ſތ^)巾{^j=*_1kw' K#*XT?5 ƞZQ~"-/К{4?(NW1!|$ !d7CP7˔3 O]D3Pn(-ʮBaf2`aA9[3=I2)ȃyr-lЋ]BKNv=RW]ׇmL}zbbiH=oq2 F4r=?e@o&$?kpfx*`&^qV+'][ˑӫ.}n{b(]mal\|0)5>y fߎzkB}exӐlSE.EGwfM*_p2P(>wCzڦO wM/|:GK%쫗vy# јqHs`رcyEQDӒ U<5B?]ѓgĀj4a)ܩ5S  Й5//  rl!u,NaG/>6f/+jy:K9KqلNgKXAqM7OJwzZ<@k j*6̃=ݭ"965N ':;p98+-ƒgd;6n <=aΓSQLLw.83J׭vܝk\'^ wxo0ZkF0eԕxxF{D8U̥c/C S ӧ I#*x«PR]Uk:˜bU۷cKec06gފ+>G l!̘` >gbͪ}՘y.L>?v!ޚw ?.|l--oy߃G1gѾ8W#07]FwC1LvZCѲѪg8ݺg͹yLf4#kɐl0qW2w2ltl@Ȟz2.MC%uAt"Zd'߂\ Pyxe㖯l˜R\%v.=a<50q?=m /())چO9">u.LFĞ|gyv݌,huuqMGD&G!,\澸 Elx l)0H?E(H'_"q}фi7[1:>ZLTpոxuWxH-{KOFINQI@7+p cХx#NOjs2ӱwg;bh=e,>&.u&vU–6n6bҘ1ֵcӦ1Vz3Ќň{\'V; ;o|b֞b ?6 koוQYbf5AOuPge۞g O܋Cop <r҆qФ:.SFQhUvj@o[LW+=^b'y!K8|Hg|u=׭e1_?5R7׃ ̼$cd#{)`n"3a%a3v<}a{ڗ(|7@'<3(-x_%&{2JnY9fnD!R}JtBOȕ SBUΝXL/=6K>1}:]#NZl)r\N n|e, _'R^64IIf6)a_.c*Ȋv;ZCbJyٰZU 5t("]4龒!+?Y@iYIЬtЎk9{[6][oy&peN O?^q'uXPa6;-TPWKe7{`(TŠ4nnE 훷BfNDDI2kVHue<5HOE ͛c&}բ.C.m(`=Ǯx2pIy 諪5s#{n{5q5|0T1BQTV24ʩakxh\A͂0dXkUԢsڮaMe`J?RuD4/vWb׃^asة YobX^s3$͝ VW~(ddFCc5ٛ#Esoem9%Ng<_t2{[U|GūVePrY6/ƺ9\n8%@]ے$0@]8;"BLo>쁭7$p(6FvFyo!u(>z4^/)BMHҀIKƌ)-`ɀ֪ Nf tƽ\'$T7DNA>-Jn +ϯ.>#Fܘe11lh[ 3>.qZ|{{m(~ь/ro3}i[hnlz8Cr B4CZv amH0cǷ.†Z ;wo KSRyM9(&-Ui8c-v:b1NK¼Ƽt,\Z'r'V8W ۵D Yᾙ'`0\qJG1% @%$~Uy֮(F5Csf,b0oBDmmԘY:R =|ٸ0^5tժq[W}$˫д.pF%U@3ߌ 3ޔ@sYJ.olA-܋K>3{#DFۓHj>> ݦЙ#wMun09R"ϊX ^qNX6=(>Տ“nôʒ8m-+VYps?ܯWfOGtϝsR^DȐE4YhRٹnjIWLVÑ'7 f)GhSځZ"CHC `fe̦Pョ0\r69_ }&'ș[j6b0GaN'KR}}MDSn=4EI̛ͩƳ\uzt*OLq3#ߥ߳=k9D'{2'4][Ѯ-wwwwwwwP\+).{{5ɞd4\uls(9|') v 5-*hpjte7䝔ݥ<Cg$,A+{^zhTEJj$FfG@g6мkֆlX˟6v!ЀFk@Gđc}GyB .l;'z!pQ<~ZTZŅӤVD-a&t!:ƿF~=Ž)oyW%rφԩ1MtFp.6 /Yĕ)xP;ܜv}V{Y|B ۵=aaṵ#CD Kv4cKgAq0rC-OK7 ǯT|%~4ir)>|J~GQ@?)x륮Le琸n#iR6_w 7Io#\vtJY\IOX*\ש &*2 ${ʗP [Oc&!6euP7o>?V4I9EQK eQ+hAp 9A5uhԘvEnL]iIm{&E^C#EG7!qA'8 AaXIJeMY_[\|]]3 ]\[න^t09E߉FK}a4]wwvz" ň#'cZkK+:wy7@ wT&kwYL'vQ΍=ªܝWĥ,E+qoľ't-qHzpXܶy =@S4x+#:y3[Dj姟:]uK0OMT\e!# G iKi~saE fЃIXw*tkƇu!6~3E ip_ҐgMoAEV?YTR6Ƃ_O_;4['pY0mP0.:ghu~rTȴ f=S'3Lw;utd' 6t/3òpedt6^`F Ē5i𚿜#hZ:Tx BD=Xw}1tlO\5lQ~mϚ215Gz!Pidy}U)~Zhb|=WDMxc [`RkO z(dIe%Eia">&t t"mrZ^zǟO_߉2kA 4#]n@!JbݼSNE',^i+E4d 9R Ͷ>>I&WpT _u[t=s֥m"!_ •1V/pK:(_PNAl#GRvKtd{+cuKt' VbNM5u'Ky E&~>G* 1287B t7hoƩ{4>&˾/)KzȲqҝ%1s?L. eHR]Ƴ/OME0R&U^IgҦaPt8wyQ(])(JIݪ3QnY,Uk>`~R|Gn|\t^T9 Kkl q|.kv1f ъiOD2B׋l#&E+4*YSr$ PmiE2r)a7C~qM%^evȈ<*B n Sii1[=zWc&$x0T 1ܾ:GlJf޼}?ÃNvr }'ӯݨEs"! !->Q uJfL#L}[mnjl^?:mm ?+]3E(1.@Op_Ŀ*Q|(q KQ6}_7yЌ5+0OFf.(jCX_z$V\soENQ$af$$.󞠀;"k+` `$v.tpS5߲Jda|iBWG4m`iIq-3,_(AVAs?wo)0+ȜOro c0!g(4: RsҠ>, @`+ U +3UrSwxfAw|4`⴦o仪3#ha_a LjOy ZV%:t:eD+̋pH=ӻџ:*$vrdDhn&En1غ cA뫖g%%R8#`DPZۯ:#9sccWn dhfT}R!Zgw A+W AMx\R{k,dEbtJq*1c|ĿqJ$Nj ߂4mlQ8ay|:#;-)wXB^[ySD/57ciF2ی= A9,qGw%MMӔ~@zV_¬sd^h54ѻ#,z&m<âoj54ȩ f_wHTgiqEVot q۟]WW`ϐI&V3H .buҧc,߳G7NUK+d̔ZF1%.a"P?1)pA$8) b3.a?{}YpُsR-(leFlzVJ9 $h,Lൊgil\Έ Ѫ;I_`̓cX{IHh×Q&P=tXso: s1 ~_h &QC7oCr-Lgi͢=@p+mBoP~j@mcYD/)''Zg`FY4wfPaNC ޸Wf~T\NĎd(U;dniZP;i"[x"x"6(HkkIi[_X cv< `[m&Eۅg)%jvLICk޻in(!-e2&:@F0^l'ᴛ6:ͪE˷G^6NFAl粛"#2DŖQeΠa@-hB_ {Pfix*a@MOr!n"ʿ:ٿ Ϻ`u~J8~fozM,vVwܳ0ymܖ&O*,g/(u2(c&Ļ'}=GE@ݟ>3zX*Brl>\ ZA<- 1 ql[HQl3`2;zx(ER3eDmzezL Pzwm. c?;< )r#f#g{9-,P,sB(H|;^5ӥx QNH<`bB,{[P3МI6\ hgN=OOZN3 8'Xʗ\v+3*˷Ϻ&K>Wk8?NX J.@i1~DY Z.|wZC.kY?+!!Q76]uft8_eyl1kE.#1RWE;PA_IJJˀ.B"F>D 0V0ڝ.3 [[h4;n PٵiN/`g!dIE_~뫸v{YPfL.offV6+&Y.RAw٧f܀6JS *w_;F OG3m0y=R7R gH..;n?;rrLh+$G5_+MeͥF7 /8c/}?X_n2nR;~.vUn> (={/t}׿K-Nmu?bTuŊ^E.2DhBi!ƃ%X{fgJ12s*Ohў ^ӻQt(L>KNZ`g+m9C]jaaByy+?^b@'dFbe2uս1&\pIq.tP{pFBytrtC`&\E>ମVr,.5wHCt@*~M?.0@45NN^oG5!3ǦY^ %P|5vϽ q8es-wHXb"}#oA\s1O,] /U%-D\ٳـ]@ʻvuA! 7&TM 8R6i|p*WϔF jNjV͓ԋ/JGxT"M4tu\,@aLNS%o͓L%5}7lR.mTN.槼9ɚZ " RȜަ88sn}J+ c&dY:E;zRyjyr?t/Ƃ vWJG"Tr~: mBa+a-GҞLiL8>q>: WU)Z5v3ٿ۱f'ewl? m]%AC}g`PLåTm=ԎԳZ! >3]Y j f0$^ܱ|ຎHq zZ5 1u6f6H4Ct)={v--)|ҸITvYV4ͮUNWǵk1 2?ʵuk<{P-i6bZu]p67%:`uC)VY-SxtCW(?,YARA4v]mGQvEA/߰&sh+6|WNV‘~0[QЄTTˡJ=r\.Vo:q,TMŚr1T\d>rvTalp.:OMZC(s [C%(0\ _C9IcҘaMV`<K#7g:)10$Ic;a7,hOºcӓ/J-%:о8vY㐦u3㪛%;CpPR>;=6@X2Pj+os+XZ&,s!=- ]u 2.11T#VoH8+ f1376)6ȄPei{bL&~L QFKn_l\B1}ga bWЧf{E"= 2 *,˪~5iY<۱MP+1x)Km2b픚L)Ik{o=g%2rTZs+2h`6u_sVT8S?ɼ|vu\|bJ5Mڙ/wLE1zVbt{ڥPRRY DK^> w>Rh6$O놞 3~B&~x2fg+9`ڗ-&\w姎jsM,Fژ coA" sQaJ,|=$,v 1@xSktf\tbDA&ժAx<_lc[ p,}.~P1!1na1Xh1YFW?U{rVlZݭ#>W;/s(G[qyF m 5̉{dQ4#G&(/A{\4b3W6H2xcw ,+CHA[5 >ݪ_2c{9x6)^=S5`jXxH-=ehnx{d+9)[_ *@ɏO% ao ^yK a6%Sf@mgTGK enXieLE0mY؅m:풷VZ3P0O3uN2]XFf а16);uٳ8V[3iˮ% 0ky 9yUlWJo~ V>7&TuQf=lUn%9 /V'~`jz ?ҏX"yj[[/;TIBQ?Ib:4|x7|9$pohm _^fp#V}vM ʀ)Ն<$;hvE kB#j=VF㜮TI%$ӕtH3IIO_<Yܓas.9  d> PtF+SOӹt$ 6/\UZ9z [RoVImՉ熭d"4p"+ƀ [+oG'`װrwZp2|sA P a䍑?_KA}BQ^(9,fa!CZŋݮqήmMaAzBfq*k=Qy|M,k'4Kn͇L'$A(V5_`ruf,C#П3 _YEqlK[4:$72@T #amL8.Dk^//An?+V/)zh:Ta'I QI([V@a_q$!&_A +^0BKERA y {ěwx\ ae)5]fH򄍈*I&׷* $Ko6!IN&t 9? v~i"AuQNo=(Ta>s:]'әD7c-ġEYļܞ Jp ^z; ?AJ /f|4N0[uJq@hv,Β<P3Z LC^Xw>/*GA$S|V` jQkl4&y?OLHqA5;pN>0u WMyf&\rcſx_=GEFv17_54z↗sB"/"/>|%Zh6B(KKyn/S[Ll>|.5AV#wrM6%fKy^5|^|j=Y ' k$E" u72w|;ũkQ4*q]t3㣁{#667 DeU *.EWfh\^CSRI-sL[Q^$hsI;:{]+&yL؉W/ uy|w(sE~Dݣޭ@ļl]̷'9ch\*^|_^:zBd1FC]΢65[t"fMIs1):dMb7[(3꿯f8qk>vje+I\!Z?"p'Ёql8@ۣR?[>IԔKiUd05NGXOحA74|ݻ+N^ }A^Ο}w[>p$]V7) b뫿/{]/4τ/[r\9hE\OWggWݟ '}7XX 8rs]~.GnZ)0;>liSSJA^뙲q/[{0n?%mJᇗ?oܖ{?7n?\qiW;=HJ91ӱx序S#gIsilKցx#w/Wq[:کQ$!9F[x!uqW4,ոW -L}!:vdT, BHf9l>:#O7rGnb2?S[~窟0dBL(52aJbc <0X~;4}?|X?T1]%}2Ml} 8R12 /i+/|xd!`}nFAzJurX%]i=v'YFZ4YA [b)X5.4*i"j{`!jk?=4h*Ʉ|z΄nO[6DbT=cڿ~ѷ9n@QxK X+s k7/n[hqK%Nt /ߣ퐼(mI^gߍ>Xk -DOXch`-J%RC"j6kx)AǮAg 'cP'\c0U)D̤ov$pS~˂%m &QOlUp^Sb9S/JB}w[ъayLB% K\էS,h0wyJ`Sh.jRT8r{*jfa|P+U+㪔edTFwxAΜq"$MǑ]< .WPD_ksr>!`FLopUCÒK׬(ْpB@mG/"p΍t[, te)IN>`%ujDi^s6 d=ABABTBDVI\a!ZQ×qQw3ry N޺#6p&4eH< > VQ5j}4f8ް$عC^J M(^k9_s^=Yʗ!0eu(өbo0NvY}GU nJ "HXgJA rrʹ'Ķ \+},ʓb[ۗrutw}5&h*a,Q_ 0*^x$tm\^.uu5VmO\DZ[hlQ.(oѡ3WΆ}S("MQwڜ,# MCC27 Vʻ6BH0: N&_OA38/`c,.[osi>B<%ׯTŏee!zh"g++Ji^-adΣҤva-T̑f8oTx7goSq!FXo]!4cAZ7Gex&,SHTUtJיxswHkT Z2Z]S̏׫UgagGxљܡ\e`lxfKor.t5y`78nKIJƂшe`u>B.:"(^PJڻ]ɵWwNB oa_}ou{rx(>gS !}a9#\R'aKl_g6 ]"hߚLt6Ě !kMx5NIF)6@|}+㘺hÙtAvFuOFXEV**i kLdl/M=81+ԑړC ߿*94\{L8qQ]pV hh~I.#5SZ{AX9rn/=&3赃;I{?bTJ"(!fÕ zS-{ kLSj/._L)o }Wo-,VijSg \O*vcN¤b ƍM[E*B2!/m==v+4[W$Ĩp&:*о` 95 /[YE[GF=STc=^r)R%+GU%2.ިA$b?8o;n8JБ$N:ԭיfQ/J(dp}}x>×j@ORR(!Z(L\nfՓ6M–poa3m}nmɇ2! }]?x(^"D0;o0h֩z-t3&tsZqvdMFbY_Js˕ n0AGҋف"Xlv%5oc q?YАS"iA9&uv&):rD&0Hst~])uϦ|> ]a7rL FUX " p (+zyi^&X۟=@nq?gX:-.q#^:dzn |WBwL`=ie'Z BacxZwB]&x:d^LG+.Gx]q.;hc$ź2έ4Mw)^|pyVz]BbeGT/#5]<۴J Aۏ6vc{Y/W6nO1.yʅeҝNu\V绺xFgX)1#"ܗ͞WLȪiyrsXGI`ܰHWIE_!&$tF ^g!XJCLN㥹O'l>IΏa - CR4Q :y봉+Be#0XD ^ӝ8132E2݃>ߨ y*hĮH׈Uwq ֨g% Y3>+=l(K~+?ܘrfN @(;:RŽP@ծ0FC2aӐ"!fwW UAӞ"o;YgSZVv+E5}gq3~{U4ٵ7oDX_.CThy0zZZT#VNW"_UŇln1!I~i R4F>8 $ȡ&%MyOB&%W;%)uUs.Q bLnhJlXE`7Y";3뤬}fK}2>ۻ+o3H0Wa".sh3Ol24Zx+,~SaRTR۞>4#|9&PRBܕ•u?n|n _ISmiT5lVPM?BϕiRRjt$X-5lV"8?Icm ],{=JhY`f55`C%9$X'rׅ椊,.^ԇ _p԰iгr.!/_HYq|D@UvͲPt-ulm2"?V]g.DLpux.)K.cE3Ow!Z˛G}J//Ds; )TF.8'ؖ\&Gk?h`4 [F>Q~| ڌe',O1l!<IFUF"n 9UWllCC} ƒ14qyvJTHg0!yxš3j3r[@(Ii>Zv5S5@kLucּ>.pZmV6H=qsqҫU$E*A3GJDWBܜȳЃZ@D<~"ZI'| sxP!ۜ_X\bAc1:qS*Law~}ChNHaaܚ0 C $'[?3l @MhA HA?+jV,( Kê927\))toq.bKd*HD ?fuC;lU5g)=3:"<ڀ@M55i71YgO9h)&ʂ죣# #,ݔD|zCͧZ[&&.sԳ 5g:rwiZ2KJ* l*_[uܯAⰐ8u_XLoBS܏_4x(䯆ҚqѨ0"J!pSԒ4[)DLf ttk Տ^up(Rw*!2.Q K=#&VC1=!Ҥxg[r3տ7Kc^<=K2N& Iv>.kzvxS o/u`*ӊCgAVu@QdGnGq~EOf1$IU1Jr(Th>V5Y㳏>*MGv?X?ǷϬhkpy#BJY9y>#\Y?tlbqyN Ϙ-/ Dm/UC;oC0Oҫ݆e9)P˪uM|c6҈bAVn 1p 0'aPNBZ(B!\F~êv7tD[gU~~Zn(Z0l['~NDzEffE0miq+SQx"LLٺ><^kHmDjpv7?sc[ 22+>M59z8| RSSݝR,Xqݝ|޼ M6ݛ{1j?a<15zgP2 }PIHvq v%(mxv]aQD%uT0߼ϋajW;'=IA\(+5oj\)<ߘ#k Z]r`q4Fj×}\ [ܴ;C9zͬqӓtU[^_>>6{g-7P[ŏ cW.uݪrsMBh[EHo!Sәv]Z,.c^X ֠v2A_5,dݠ7rk@! Av顑a6x<'NF=هW=R*Q"EYz鿪S޵^7'YvnŤP?T{kmM`K{oޫp_.ЃE+}WW.u _CW+ M_@;AQE\k[ )L?q'xM|T[FJ ,3Yud^}+4\@+Rݧ\:S*@C,&6Yg_V$ˎٵSdTG]cURef8h\.I O^83T$jd[)k:[:-86&8G#R\d. 9ZWNU&'dž* 3Xt|c!løsOH dꚫI"ouEĢѰսkߴA&vyϞlj]W K[>cFqDȰKٌ-#iD<TkL&ccwzx !(ޓ.wj7F-GMhGT걬Gl\c>",9':!Zw;b ~DZ:djP8d5.LMݫɨj{K&^ ߎ~ ̏3"[X`,R7"h+ʂbM.tv@-BnޅG12yJqda\8Y ק#(G}f1w< Lko+燷ߖ煰@^t&pmυ5 O_w ڴBIjMnPηQ'GuBP=ŵ Ss혜yfȼŷz~ITtpg|9JJwfDތ-x[{sZOܣ!FәjPp Ds)ms4ۛ[Up %|g:}9OSb !t` eǩ@z MN,+:+HD=LmĈK d7.7&Z/[l&:\"hNMŝ3Զgp!3Oj\hVN)o=SCGw^5b1R@̥ n4cnF-:',mT~MBe6ɱ:R7ɘU.gsg< sg8/JӒGCj`4( GH|i? пfp/azW!J,w.awjĂ\c"">ZH;~:/[j }/0^?KOIp.ftݱxyLQ2KPjd<7so#VNלDZm$v"˰-~ y}@8 Sb R Y*Cگdiy^n` 7)_y.ًkϙ(mR9s#Ma!iԇс$gEI`AIj鎼<"hWֆj[FR|1hq?wlI*͝;yd6BweE )K tG %xxM |A׋ _1\-O}o?2l@:@H9xJ3M2qa?ix;h==EMINM=p2B:C؇nZ2KS;IO*~F;Zk(aڽN 3Ŕ&5+jL͈H=l(Yw'bߌC 89/Ad6S$Uw쐭z ?c쉚wNTa|&:rϮ{SBx.E K$Vn)8I<4iєHy5Ml/s+l-X{gC֎N(v{gJc[@{&h{x-]_zz~IYA!ctb@ ݻuVQFwȨo`6K0VO,L%y۟4g5Ί;WwLPK |T%_Qq&K=P oߢ>,zP|67&h? 6bxrrQ6YQ129k$g=fCb{#\(8LJ|75'.!=s^F(Iӷ?.>`Ȱ~wN)xg@0M% ێ.xK߬l7vc=W(ZAS:LҍՉUgJ9Pt/37v*[kږ4-dwک .t/^ex<k CJf4 QZbj~?R+TBPNrp/б&ʜ"3.[|ܱC8j-B&M(qDK6m]e~oxҨ +耄ȝ#k'htͯ컸Nt8nğ# 1 AdhHX+-(N2NIV='bq1ğ5 uwHz'mmK^/ַ a,VdtFy8 ?&sØ>lwiaШe 5,p9IqχqXŗ ĚjTUt*)`st*bAa`* _Z.Df</xUnToK3a$TS -0eB"E焨}G晐rC錘u .)/?c }@&z GHhCB{l?^DG \m ds #CخJy2UA(,r 'm{*. (d?U zHmGG".Era/8/pS~!~@Ggɇ#Jм'o DdIțFHb*|`~exQQ7u,RëC'I[.raaC`@:Rvvb36p6Pw*fwnQX E4@r ߡ2 Bz:h7MNd0LfV-:6z[n6蠀 (k#?#tddTǃR{t^zp|VcݝE? 5vkHHh6-+a7UҸf-ն÷þrA1x_1LC-D*'~g`s%+8+xB6l yZxC.>?Q2t]IFFܟ tAh?t~*2j5fBEKS((WO-P"[8a o=SL=pa~+`U_aZ bc)HNѢ供`GsY04Bߔo@T 'mtX!{oܹi˯>I^ NyU;rI3^ ~{(^D,WUK>>Q]_A f*9&zsڟl E4On*! )8I|"wk#Zy|ߩd.nv۲`)Qbz0%zUJLvf ykƹ%2У+|ped-51 o4bل:=bDל,S۱2ReShۥOPPPh3"Ljwփ̄D~S)(2Itj6ɂ&6h/֢P (R^;2x VXBdO%v]MGfZժ&;P['P]0fUje?I$wxX]n!quW( gre&DࣔmUL Ǖ,CwgcdCh[e4s /ޕP:^_k imۦG/L-I)Жw$3)Q̎v34bBY0Q{]ц\qÏԤ\LH+ʑ]{ɐ3}I u\p8>p*7q-`ح-_L6NZ!m<1s}!ű Α D :n E0򡑅=Z6=ցjy5VzrѼM\5?υ`yLgyʕ{w2Yq,ɶoH-0> uY >HՁXܛa"ES.qg_1HaQ|~I!E$ /I8)U.րjqvWCGP :_>;2Ɉ9N>{#/6cDOd,vp_nfo0b7O3TdL_Nz½>[¦f? #>3BЬ j’=1VtH4V<.,FZ'6,fsn4ڱl֛،~BM 2qDJ"7%XfK.1Іp-CȊA&HR,ٗ7xB/ENV+M솞_G"(!r`3}I>l^+Qz<5| aPqdxF Ldz$D6Yz;k0K،d=37yRo<";L`׳It ]Sl ~hkZ1( l7 ٰHUD\keT&< !ńq㺇+Ko ƛ1HԪl4:ɡ LץJpЪJv}7P%G5vx8?9m>K7Uמm=h+/o"$*],/Fm%וVy ™<^ 8s޵̒k Z'dNUK&t$rw%O$-MDXQ]^lnTYoC kQ6B@@aݰ񦜿@e݈Ϗ/xsO,_]5J]ɚ"*Bkse]Mđֿ]w7 =LېD#?tw]7^vQ3n(1u B ^~\s"8m ϓ^0's{Qm]!drK~O\L%h'ztǪ|'hN=*_F0 %ƿ%`x|j\L7 G f¾ x[فmK[,.H)iz&oXFΣRzk\ aʂ9>BɨqSұ}_\ए g¶& :E%^\Wl1fG\~^ajGWwpWӴ){LQ{ioc@Qjtܛdbu+sH]]ܒ V6K*xݫ;_*hi`bE]熞Vsv1_')wY}(c{Y6hWòu1_VUP"Lzve=If K"$$P z%ð,z$WG4&s.'{4HzP,&B9#D n?;Wc=Uw3~R~Bph6o3!;䅓Sbq`[4ٻӁqG ?mOKFcp!*|Ȗ6WVϭn @ (^y c?XflH , H4^Ԅ'fX @;g0i. h0g_]j}z+??!/Y7h!:ٽ`q/\Dit D#Jޑ`M? '8b;wb)PƏÀS|4xm`8|PyKC^tlHaI'ETDAtҐ@W)}vvlk*wqs *0jG_`2'GRLOKCC籦yw4m5`&ڢGC9I*شd٨39OQw(qYtOiz ')>W(tz0U̗5)9t(QX}!iˡՓ62&K0S>/3HW<)/Ut_j -lm&S.f3o0j._nb0 В_S0f(K❦W׬te^ jn~W_KbOD`2A̗:E:''r aMeqjut@|ۘ-<C3JsS'K^g/e`)DGH,䝿Jz@2&`jAtAL9/[~N @`80CR>Hj}Yw V{&,#OɋPZ*@V%*3MItO jɳj SI@'"ӣ6UioܺY,C yjWh?;O=LUٝ̈uQeߒR?3_^sXxy/w\Hk1OER~*1j3TBoS$"H"~TnE?}/Zl5Ѯ"_G+\+7i Xă%*5wD!*٬bn:]W|<_A Z,< ݲH/^I6~pFH!ȨO_\@rN:]]afH]^-j:@TV۵]g-K}6Ue[RZft@SNrDVeL.)."bz|_QTwR ZE$k{_&Z#'SvAIlO{`\iH;M\H aQ0m]\9R|[hmrm՘i̩z1>56"wȂūFI&E}yVsفflHmrG{lSd}Z>'ŏzW$#ϋΉzznE9;~IݳfH+yC6RvMC G?>(N pa%IޗKaLS_ y֧6Mrb'vC2u2Vpqs9D hZ5 zK5zPٹNAp#o8Y5ԿJ.ңSIǦϻ_!mO[MV7fxu{R ߖ.,U ۀ`@6zdEr&m POd33bn+-F|{iiqXb)M>2 4Oupif~s"67]lyvg5:5: :+&>|!j-oԍg>DwNxgBږmicRT:r,b߿<(o^"܏Pڏ|\c!q5?bH⑳ kQ1o=l>y"4=^I?fuܦݡOń7oo(u`#ld[3]8BQ! x rh.w`OCǺvaW"u2~7dOȳ>6p-F@8]-)+c `zG"oaU܆HG O`HnbC]ZZor#M-IF8Js"2~Mh2JlF7%eIxs9%Lb* ~HaMAtWjŦĘp-ý}^|㕮lV;\>٣|E$CcɦvXw-d@0L?%E flN6XzZPlmw:p7Op߶S*3|0YFz(v( {| Ӏ! []ݤ%NÄWMo|_𸬥Y@9vݦ{~7XGݥ+*9P9A_l o1 JfCӂ5֞ycϿ5퀔ca:Vi;7.P////3r2xpS[\p ƒb HIR/S퍢N gi&𼌢#w=uzy[{H>>y1,п\%S%k;k EcNد8,gǀLǎD+ɪY4EFH;3%z7='"\s%65;!0N4^J*ԡD$av\edZvxiע{۰n1dϡ3TT85DF 䴮[e&GH"&˫)4)SH?Qt-]QONϻ2d&3A i~v#LLjFY]ѷƫϐ}aa8Gy{ܞN㌴;- a+Y_i7 j150G:k :.0:.DE-<)~3ꥦk h =e[voVfeA9*ZE5b: C."+f-βT#GI/ a"q۟|^H"%Qjwy:l~T D*z*G `s8B (,5cOS: {5{>EP >R$+%Lw\bE 5oIp`"`J>dh#k4̌ ZϣʡbQ ŷqK=YT,*1Rk;P|5Dm_.GN54n;R$p_oD.7Hu fT dI*5wJcըxq3GbWw Yx,&/Ѝ3My]9E]V+%Rk=2/<'\Jr>*͜W>gC7􏏵ǺHpbenGDBǃ;o7nc쩫(!ɁR`g\K _H}࢓̭91gܷ<3EEG ?d ˲B0B1tܵEyپ 6=.ump-xmYxf9b>"dfa@(hdM?Cz/sI+I Yr/O㊼Y~Sr%3q4eGj)KY*P@5f[h,wU7mnhR|H!-O،/| a B N_zl:jXQmU/N?)q- ͖#bʒT'ÓbPCp؈7[6BH< i0bN/m),۶@{,!9(x.Kj=AADۜV VvQRImn|I)ӸkH`?$&Xvs%6~5}uɨ taLVKdgD#>ic v;g :pD g䲿GՄMN{>RzK)} )HߴH[Z.YZFAu-Uzjfd0ѯ>m+utW7네QDq)R VY^2\ ~PN:"Q?7?],Lt~<{J ]3z~vx(;edRFʘgdtYg"?ɻ<(1YnYɻiMK%8߭OrCGRrfY Р&Xn0#\J*(}=ZB):|J5 1k^*ѠWP/̂KHJ$Iٮ8鞷m]_SL/S;b* xާNqyGCDA-9>1i_F*KN +;hp}aEy#N֧lMxȡ柟 =AeF7aЬ?o9Sa[=ct;EG=?N!BI&QQ-^/nlsNP`rxݰwysfrq)ON9Ծ5HjYjm4E)@ [WpI5[ZZfR{%[*Qu7i] }M*$Io$lLh7]O'̽t;ޡ΀ἚcqRzEMZ'59iY1tX[+y M} b#=IaM+1ݯxjNjW+#9ׇӰ%EfD&dr4@y" z1^A5g)PJ6\_MΝlBQ?KpuGpBKG]xW0Y=_Z!˕Ϗf|Ճ%̜|)eU%-k NC [We`-K[ۼ?ݺ~?=n"U(0SU$w(rɢ_Go/{D.V7ٕa {7@[406|r|ҰOԅnAHIEnJ3٫s[Jنoom1dϛ/7 yJH^<GۃyBoy~]ǡJQlMZ߁I Ƶzb珈O8wEJ L/ nヲ^S@e>.NUK`^wHCfT1nWT全fqͣ*D!C: M C0 'ۧZ~,Ig>OBBQC{5 kv>տSK04rB{j_Jq*kEm%c K/ɢv8Z;{2B~~]LƿNYbRE?ūHɂ57}s,dxUR^>W|; 3 ^擺[KgS=VJio<6zId^ Éf]X^ĮOPo zw(W RPDS6Jnn4' Mu}'ۄ"BƩ- DmXznYZJ}[4f״ߘGYgv7>?Nq$z|〣>K#/Rۉ!'2Ю0 Aa# \ySV*Iw@*ɥ:cgo|ACV򲏮B of}r}G2R.˿Z0 ~#x&G:S [NY;-?C%6_[9C#+Fף(\R*K !8[ N0uRVk.(My{v䮫(m&yHՄB{ep:˨m@+RܡC[xN"8-wk Kqw'x. <1?{̽^k^r| X-xGA5T>ՅA:.h2;־*5aveiWp1aj:&SǸUJ.qhg5]Ď3'tjt$IՒ"\,i5!Q$c,bwB! fҀ1 ?DCی_d){}SS6,7L0qWurY1Sh$<r[D j?- -sA8۸ p|xEū$/twD;yo)ou̮3=GP'DFM}:ecAx^bd`0R^:WT7 k0GU%WWI,?nY=XT_`uT+]tQ?qX͒tMbJƛ5g~y'JVK6I$ĩr[gWlqY(y}lk7g;HXdz-U؟8+ Ts`,Kj?T axQ=~zE+Ry˦Œm9WN-_s6ʼxL-pBq=^InqW{y IɓX*Y? W8Un~LVl>E~1t6hz_^e&? ك}Jnl?S~A+F6Nw1lд+d'e~(V-"B>:ZWiu 75[˅&&1H5jL6 *51bmT+ǟ*RbSI5^jZqQ-ݵ>gjo:.ZsGyUcRP3/GoT]K7aTZyw N϶ q c |[igl67B2=gUhՓÃ+c<6w]_a*߲O盬DÀMO$ :%BCk<5nʋϦST,€y#p*W[R9g: rMYSv" aw.$rEf|]s{7`uhv6/,{sS"JSbb /<wh{P8 TAZ(A9_Rt.+dox6mj$V#܀[LZ3{!CTjs7?I*[ FQ'n#?wQTz5SJhlB>9=}gsmwiAnM2À}͵(24i}TPh2- :͒q^⃥cCU:.lEmUC'I JC^AiԶAjj@ *!?*u^0rД%#_OV0ǻ ˨ 1JuXk0/0\CiCU/1ɖ}`q+OyƊ[-1׃ǜ:.=3S`t0Zڟ Zjr|3S8&IAiH2󼯛B:\6 %l2. Ѻ̮{c{G5L}g1at/=ʍzkMG42읱dtrƐ(+HQ#|r>*a턤}-pҵ9${:kƝ/Q9ZB  ;Wj-;W9L 8){"/?YzUX~,q%Ilyp0&ǕDFE~t\0an/W\ 83%˷x|qx ;[Egh>ͱTirh7ET"멛!I]; [},Zt㱖!.sR{r9La&h lh: M<:==]/5^.6jHLP67qB'=sDmv&y\8!$nJ {y NU<`f˅lA|(f%l3~gzWBҶ{$:/%aH-A|7gwM5}l2. 68N#KWQtөI1T.I7 xX36QBQ :*'EKi,"?) o9\ixI-;PTr6Q-o{=4cC|ok_Q}odcXF~-Fwc˻aAiG"CGg˘E+6b](}.WgTXhfU x{0>}ur;h@jl*|kCZutf)ygTPk^W0`,حۣ R5UN2Qh;'^2{+:Cߴ?k BׯH Xϝ_ $3*Ȟo-Q/ mR!c-5뷲t:1F[{y0]M%5|Cv:XB,m SU(ާ캿ȑ LsP\k,5K5}츈wn %i ŀ%SL_dX}vG,: :ޱAslve%}:+79C{3NT?SfM\^Ne /-uV=͚#萅l 2Ct.T]:^g[3ܡ}9W48__`T-[wߏ4h8Lx**sKQj4~QJ#S= %r狍68^^ՑS_6yzX_XcC?׫2џ}q]C܎$ȲY:#0'g⻂&9hVs|4;ja:rxI5H#o tɻҊz% LV,C S`p;P1pG{|{'ZIs7(F+k+ENTڹ'ei۩Z'\Μ S^+}if.k!N2p+:w_ n;~`b!=6AUR[Ҧ ںTK@%ԪYU@%fOW,MCpm"'k?ZO1G(XA-|&MLO ^|b s})DT5͙7}p `%&)D.mck}X n Ⱥ7n(=۞\\tC?`̩H\w 7}dV:{Y[Ny˛ꖄ| (BjO E4{pZ1sE g-8qh7 }p ; vCS yԽ/{y~0uhwm!y009#x\qQG5snIL^`[=wnN q\.f܂V ;!͉ΔPPG 8 RT$U!^yCUjȬ j\S[>T'>$M+98J4z&+#Yĝq) ܆p`v:PtV4Gъ) {P{D2~\F*],|?Gr.[Dlr"{|qƈV 0sI j@χz~` '65UI:5bqɿ&e;RcfʥK)s=>2NJf4\pcO!<\AvC湮rNJ_^N_SPMd)HL|#S7^D|$Mw ϥHv~vN۝0Gb5a f/E9A'$Z9/)'^5/њ5 =f {%?pi9*H;cFW2no>b |e}m&Ąy+ogN D +yzkYS+ƎHPB'qx(HRLNAZ9ѽ~OF:N}RziFpFKu ȸlK :>m>}\]Z]t2 tP=h, 6ǢJ".}ƶV>  @{֊W%یpRjKc٧6.gT/귮kfj{G}~8JEuo9/"Bq FWR)j; ڗ:;$e4hX1y[)^_&#Y?;j݈5O I*.rg*J=U槐+~!CdwI#}njo:>hpwxnxGLmOEF]U5o41SPzdvLոԞS#{ƃpg4U<)xwe{]6ĭUTt .#4${PJ}q&8WH.e^g6'Gcg?#puM(Hut;$TT!xo9y5P/)4lV9F y&Ҧ ' ޥ%0fʾ)7jZ>ͼ} XD0^k洁.En'ֆ$\P^RgBqE1;S}mSx" ?gͪs{E>,_ ;/I4mΈr^k`WRg9QU_yJC=0ƹ&M2 H;4R3}8juvXa$o߃@" 8lkeDžJ ѥ!DvW|ҥ,q_>kЀOmY Ā+6"!t+!YlM$䈍>U]HԜUx3ʾ96c=I] \vG<{=[™{ \:!{Tv#:$nVaB+:{{אaY%-I섵y~&g!MC;|ZD4גS,\ISLgGt'T]t4CӭwY%PX%ejgN͈3˩A#VE;Q>a[op:E2|s띘ٓU&rc-Ycv1$PDϛ Hުvcc?aS$um[sVD>/q89Z$)A="0z*lAqNKR֓%8J*gwލ߲S4rESu))1{#]fJiذ;\DE.<4XhM}v4PݓԋFRϞ#}U2`,0H1<1i,w]+= ?/9W4g㺾liCԍ]_#[j2?\T=Z]yٻx^:@%_l ^? )~`,ƫ@誆WBd.(qlrwf\? O4T 8Ż[# z㵤4Fr3lX*OIIjX>$uVpFZZ]^6_\~+Q?:3q9,GRd= k+VϪY/Zd \q,eߜVbcdB^<{ isF'i\";(jhʹTa/$$Ncs0'j4!Sڽyql X;RII󆨖nxVVe6f/~V8a؊U ;}ꊾ/YL~8X אOB"韊J8DEX ޜ\Ü %1X͢eBW(ÖspՉHLUY'܎wXD7#q',Z,PK`r=#PKy.F/angular-1.3.9/docs/img/guide/forms-debounce.gif|uXTZ3 ""b) "b! H)%"( |k@}{|u֬{~y+I* >ov3}TP*[KAL++-A wXg*Xe3˿e~!X23&3 b-pkY_ZM;@c\Msb"pvaM H9)С4u(^HvL)g^֒I-QwOYWMױ^uyw;#g}+'^N>O.GDFE'$&%gdfeWTVU?kh!xZ>wojzՈ7mósO/-~Xi֗߾opg75soiR/8\1,r 8LrOn ⿐V&jX[/!?_ɧkt A ޼3٣ԓbJ2_dYi/lf 9dj֓I[f> ]>gqMGYxN:/{4oB3a/cEo{⥽YU+;:4fۋ _p\(*x߫sԴX#y%@͈@=<?4FKw7eP!汾o(>(!?X%T'HP=eI}qmrC`9)zu3dʔ+̬!S2*{ä0 0))ڲ7QcmAH%AZXI'ASqjQ_B].Q ҡ,sp~tՅnV:ŖsxM.lXhAEN;ZL%W.\)Nlt-0?E*˔~OMMg(lh&>K;ja,4QFK&kbz9xGmN4QTU}?(~Ad!?SsU^<=3bj)̙iT?X|'4<"F3oSPZWi&3h{Z"Y*ʇ(॑x'9e)Rڰ:4/Cs_Xjg(ekYhstB 9/Y2>M_FY,zt)w;y'T/ 6 8j|2k}M¿WROdHIO ]&H\fcT}atyD˄'॥V`?N͋䎹I*+NKTx9d{mgTj}Wy9^(;M[ѻQwq}ŃV) P7o]2rȅ +Uet~J-ކ%ڇLUJ\+2`Pg8 Gx+J\heMzJ=e2, |aovvϠKqtV{WN|EwˋUէ2x(^5},"reZzF6.VҠ܉C&I~WyB#zpV#A{4 ӿ4RVMU||w)D՜i~6]KQ6}gnOq(.sYTmSg>вWO^dFek2y+#]֕t!.lP[ZȃzNۃK3Ybu:,ǂjɭoy>s;!xOUƃya^a-M,t{SCw9e ˰$? ~1\;,V'8z}վ{epcku,Z<8n: u: b@ F+3[*=Nhd0 0tygPPK0!W2ObIß̢Nn']W{3Exoy)F37z8i02DRȻ ڑÞd2#t c|TV:X(]0:#]1v0ElEzQ=a1@y;إ؅15zU] H[qLdE=.dHB<jHW$-㹴HP_pVW\ʃrAfǼ% 8*@2wMf`_}%+,˪jO"ꄪj>Y-"{/e_U%0R<6YN*o}M`GYY([~ M-jPRio#N*+.#7W @ƒWV(XPT=|'ֽH B? ʻ0^pVKoO,|ͳ^Z.<9Zr’#ֈ| BMoD $[/:uWI! u_Y*~cE}kv O訧{F]r5X$az ,FӧQۇ T!_u^֭sF'/DH?&39,;Եl9m]3hh$?֧Zu}yKsCTCwrT^,m.*v 64Bu,WqOJ=iU8*g:jKxkdO')ٗɍXqI(<-+L'޷棔0=!mAjb0=|9V4)V {VR$P!ÜJGi^F3ب%g_|004f$w$H鑄ĥ›(?r$˽zuW%_y]u}뺃g%ڭhF+GGߌ~?f!7o^ży3(=$Ry+vc1Kc]c]co ?m֌~34rbć1M [Q@ij ,$=$$C$c$IfۓܬSvޣvIs/;yw 'hV f],BDÅdDž؅څ̱\wx3McۋǗQg1x"𾥶=E>Fcz;(޿]_jQ^qc][~{fy1v}d߹KK+jWplol0juooIVuxU^*>P>Ye[eyn;5+O>׮U+쬉};D-GyᮬԭxSO|4?|2b[=qO W67ot;nn[q>?s3)͋C=66>;l=pvg3VxfV ȳ_|IqN%[>il_ ~-?VVV8dk=۷C/O} <8{[/EsݷP33Wmwq u7gضWƿ8c׽dgsġ)坝C觠nKI,_zb?RD av@3w<̞bFqܕo6 ɶm'"{* gXȷS9Cf39ǮzeA|iW<7BqJ9Keа{vwb=:y{N8>‘U[wtw ,;;z՛ɡ/2fWVe?mđUϠ^\ #!RV(H$wg8b1Zܟ]kb.O@rjWĝѶ8d ڋ3#g3j:\=Rd6ipIj媉qrVZj\@4/ SXñ`U(T#ef&6G*hObq/-9 4X:xLgpF̈́N,Nع|١\r2qt g'[)tv7?n_Zy|q@;B$O@X8jD`g\|=Vf$ +n~@pi)~0ǵTDz WA۱g?p2_[A?0bȫףo'&gfο[/x Ϟi[% H/W复I,Tbh"q< 7 ;;[?ԷJ27ۚyaٙ2 P@v/NNrF2򟳓f/n&n0hl$ Δl!1Gzϙ Km0oT_$4 Qt:i>Dg(^Uk]HxL@RRf=I3љd$~؏B#A,կ; 0~ nBȬ&+lv)X rtJȱMřFK!,372־͜ⓒR~{y'=b͠,X0^~^F96"eZ,>k QpJ10ӫUr?c2 @ܶiU̪1bN,Ufu/nU"j<:Of1#/(XӋBNo^Sf"U ;XE,TQ% SO6P2oڴ ~N>ӽ j73oN(2T7;o3 w3 .|LB Ō So@NC*>݊az^<G-Hdf{ӯ-#VԪ eLwF0i"7QJ![Z{(b8-$n(:[ _2%|[!vzgbҙc'f΂ĿKMtĒ*"pq J}XHag:Dόz"3Pj9` @{.iHhRްՐZA{E]F󜁩ݗ|y X#K^q}!<ÞYD$޿Ze+^$v[!a(b:N:Sl_Ë#U}>Yݲwswt5&QJ.d?$I\r4__[*wf ?m2ca_zSU9A<_0$\Fw2S6ZKL'!){Ь'rR7I쎔ϖ)z]"7BY5oB !q 씟3H]REg4ґ/Q pܩ@Ɲ.zr('Fy6A:juXol'e8 ϬPزE(ѩ[3d]iKt }9l(~~ș~XcF\XGsGni26O])%vHQ `hgg]?4lAkJ${E4k2;ui40n*qV rIhN&( ^s?K 4Jxq{{nn[z`C ‘0gn6{&(Mݶ˵H#Gy=b8.9 @ y~|=MfPGK n;( FE| az=^-T.Yᤁ>m pAJp*|6› El=n}oRԦ !zTsC6 xY[$ U>+8܅l(ZpB4ԪBr1,x\YceAcBT-0y -ҟ[ŸAqxQzF^zQR^nOcxoO6? mQ}E~ 8 vaʾ T$PwC$zu{ #,Ӯ{ jaVtٍj0?oIK@|HLG&=h`Ûa{",u!|=DMWszU=@Ll1*b= b*9]|pG;FS/wHb….R 1@<[D!d!tT%wB7;f_ϣ?|y?@9ZTV0}I%3h[RMbxŠ^xY_/ ^ߵ̤aw_:mcӳ6C +le ! t'.'4fa\f%5fOk n8{8q Tj~&! B)!22/_gRF斶:]DBm尹h_)a/"bwf+k=Z_ -W럢'à1I-Ro++drAFq܈Z_SfTVGi27UϬ",c9p>v)>wN~Ra{ew9푖".Ꮪwl0pY =GnXqV_yMe(gpTa ~pw~>VJzS؏ҽ+_9G,sm+lS捃c.cQ Xrx 5 $^[H!m`9 i!I1r$t ޷M4|:9Բ6\9J^+D$c6;|>sn.,5c.Ҫt;US$NۘhS6ZNwi*Ȃjr"jiH|A}b7XI2EPi[KFbqnIh/IKPi+$uTdeB&3Gd9 ֳMaH:tFxwaCB\5UAt}{O.EqZ§//%wMj^]feU?4^uu=W2zq%߇+ +Pf7D1qNeal%|o AH0Qɟ\p;'90\ ԼN׎]*XvIޙ;'xv(|Wx|9Ou<N)!N0ze<;X875}Kt~[4Uٴ\ߩi) LoL;: _6ݫ͆ ̅_5UE1<%=* X<<#pEP>)9(oü`䆃'S-!0'e/Y"C:;"+#Y(;{EFѫܜ̬2܂9JgĀfLc 2Uϥm!;ut:;[Q"qɖM+\VO:I+ԃllHW0kjs=ik @(>RIutAGdLnMeӗV b+3D.=WہlvEKgZ,(99c=#Od>H}8Qyy}[AY~nXji:a0.MnaX ֔!%_@JC(/IUi99Tzl½\z vtK~|LJz;`z=ѧ;ѬTqӫBl$T4P'౲UB׾vc(h5[lS%4uVA6ҝN?γ'4g?+!Y#\gϣM-Xu7Fg v띯yW PԴoVz^"Abʆk%M*TIɲ=NDXͮ멃%JE}ũqfG;mNE]OI>iVSz$fE?dU;.t#H"f8ާ ?{+hMT!|m}dKLړC30)gHGi%"S%r L3bӎ8·Od>*)C7bҋLO:]ھ̿5' TAv0!R4'}wVg;݃I!_AdD]]ޝ1@Px`YW8GODοV!<pB=ߙJgoCq7GTbNz?_vy!/}, b1\JWj=%<կ@OPnC۳E)cD \8?#m-$XgOA@` '~qDI?kK? ] 23_ݕNC?PV按JH 1Zt[q~{یMx;EBC&NHbyeC a'H'^vJCnLBbٷ*ՙu)?6N#O>.cX[tG𞞺H L!>k٤+I;{m'l9Zx}߅X @y eɑzڊ2$[PF1ٰ؋Nr.Q2'\qssocom݆I67E&fp{j%͑ cFˤғ-S,"Ӳ27ͨ?cpxPED×nW,_ƟA擅K_٨LȎ p{aڵ[Ǧ:0\~&ha&9'}5OU1T U#(o`T6FL|eFv$۲4Į|NUKExT'fCi#DZ ԃAcG J5çTVi*{UҜ`g6uNM!]4 AD|9{򇾯^ډMo>XyLح/fZgr1E|€j!TR~0"fJWGH:BR?E0~N.\'nj|dd$⫖d+pYu52-MHi>2 {i*4.+gCƮĦK=Boj[mwߠ9Uh%MRS8=!}ћ|m+=N.uu;;\ְ;hؘװ\4S>NP)zʛA!ч#W~Y w_,+M$'M4=S 5|zƘYkJ0$EjQ6LjK^b_8OPa!qwIsItIƩ+9'Eoo,dv2S1%KXp1Ei1tN ]Ӯ)5As2@QJވpQ\DJ^Dt8!f[RcbpkP劑r*m^M䤻XL (d'CV7{tyfߵ3<[qm}F;Sm˝bxols@4ejKc'i۩;D< 17 .쑺3p| 鸻g@"Ͼ*K^~O}o~>QXfJJƦ*Iq1W]=2 P8kHй (޷:jpH!s4Q,}[Jn*N ~ʂ9@( W$1Bpc\tGT$V27 O3/4ٗD53+oE7$;°a5 4 |sN,s7zul'a69aa̹p2Q} ^),?aKKŋ$$x z EFy8 9'p_ Ϩ:9PqVPr;K..˾_ox??8%?M;&{&nR\ y1|mf2d sqYS)>G_vj&| s'+TH$le74(zNs0E'HyFHQY>*q]\:c&AmMIŹPC=9}Dvn?V،@W28[ _|ܞrg(Hw))'ψ-4\f,S'?|eDU!a can xAAPrĻvPT$7w]w?%sA_%H =m #HVvvk)r^a2>"vj[v!mc!U]{s9EjKZE|D3T B:`+!@㠣`@V_W1\%D)Ш'|<ܤgw[WDp7(*\p 7 1en{/Cocw} )9*.!B^pP6+3#(0@MxՉ(2[!2֜aJ$$׋ _P xy]2dmcTm}T8aQ&q(? f+ICatü9_N' E8r;e$/"KQ\\]q2 )&0|t/KJ ~'CzҪ/h2#) 2arG>Uf|"ifl7j#9q#&hOY7Iy z,13<0C3^G<+/(O+U X1#ĝ"b&b i'9ko5A3$br@>ZTĈ w8cdɧ8ƒɎip!}.&jDq5 r׷R8%Γ,:=DzQ>(0 ۮ.U;!;/"/=+ ܝ̂0! ÙJp0>s?J>@zB'T2]eHb17r!Ïƪ_5 :?.eHsZ]T)ۇ@spK(V`T(H @FgeUYuy5bjKwYYznl|ah@BxiƼֱٙ$44@y XȳHX%@DDF= w3-GY ƿQ Y؄H%pMvJU2 MhnTp"2> Ks>*8apr: rA0DHBIp ѱ) I),Tr\;d/#EՓfDŴegԸ57 6}YTh0I H#J\8H Hy唐O5Nc d7!CQ {y;\!G.9T&~Xm˸ׅ㹯@ FƫϤ$i@݇gap-(\wq-z*z %u"RB'"O(=?W*RYs-,􆂨XXۡĢi+ W$Oό(ɃUZ%AUt`4Ą~ lrkB Uꏀpx* I :;z!@ yB/0wn7Q'%(2PY$I]e}HΤG~t?<e旄x);yH]M!UZ`7Wm!0;q*HBe,1sb{7>hl~hI$@ r4TPRSq6$Pbr$aH <ʠYNg_T;X 5u-d'|?M5ﳇ=HD~pk7.OVb翍Z"֯s*i2DLkOȤ[Fl} hwDӊM{^ou#/ah_׫4w!dxA!$^hoˡVq2%Ͼ>L߬lXFA~ᙂⲼҒ򳂚jZ*;_}Cd捑щ[S3޻׮H.>}TKo?﫞?X# Gca Ц`);LRrn*(s0pQY⌊{B`Y^ܠʉB&9Gu/V,ߝa.pޱ:9ҫM.8 xBh(m3 Jv>ǐb?. =rEpoOjxݣCj{v#2T/qb_ђsqvu껞iyr3Km D_RUHҤTVr-׏ jE5묯Š{Kj^YoRRQ.}$wV׌Ԝ&mH-5]|8]rly(MBс*#[<6 IM|jn 4~g{|S?0O= x$اn_DP_}?\7w}/6f,F`Ѓ9#]O꽤~M̂Ud͖ YApؚW|Z^2ż[F,'n|q#%d;O}oTL0V供1"l !ɸ?mٳIf21:)jyiAEӈK6M~M=kDž*!o;{Oh\^yq_ZjHчM^s;%[ѓ[;+UIggOfoD|[GoTF=I3'UAw'֥ 1y]If$o3EF2;' /bgy_ǒ?wM ]Oۭ"(<~9^S[ލ/]/n_2 oVVݳ2֢#zG[1rlόWV Lt_>m0͡N sAթv7=Ssv{sb+/D6kwN^K:@B9-vLPҔh:N?DG ?R/_ٌ9ߪ{-ur[5!o񤠳ys=.Q{ -쬹m\9>ڮxnd>h۟=Kj꜉?>w;B'YكձrN8H@lh0&1\IFIa^>(9HY@ Dztt,kc l1#Dvq{p%+tlcuOP `aB˽?!լ>6N+u /9=B+_5d([M&d5AӌK((v2*rhRT֖i/mmrl-7O G & ptuGJD߫vꋑ9*OGY#{HJ89=xD` j^~*X7!vvϞ22Wi8aUlD ݓPoVH <96A =cs Qr-Ba%fyy׎:W:[h8<7N=8+µՔۧ[O&ߩ{F`XbF?u0t6I6NxI6L5fŴ7O4Ī%9ѥx62|XP@N;D h=B'mk"BB0M ?4N6uHx4U$p.SU($oWS7bT*KfC;@,AqJu5J/ d;GۿܖghL PcSqa@C5;7.lʮXȝ,tWgրޫ1fSœƶ9~ԡX)?X2Uqwз?-f/1_N=<~I?p*j[^S@KU5+>CҪ޻Fx?&v`0[#P9/&\~}BS!],埛C:Wg,Jߜ㩌3:Kpm)y]:,.JJĂ:tMa2ha`K;k7 QViONU{s1'Ԗhw+)FcCR#2Ĭ`05&evp>gyHtw cr1hd=.!=l7&DVzr` +:ќP}94Tݕב;[ LtkEpn{ XJS>r vofL !1ZWFYG[HbMr8G.ӕ& EvNؠ?i9LH[<0c}*Iռs~b5ޢ*b7¨n?NӳLhMihQ7j W7w <pu)!8$4n_;0٥|i:F%H\؊m40ow!a+,, #TF;FL15New3|B5#M9)"3`]UQډjV{~~ zO@F%!HH:k]'u0@ e"[z hgE(qgXH_Y]@w]X~ŭ8u}8 H1/Zxc_ i ?\r d/)lKJ5e@^Y%ʇ'hw' ) 6~׵a˳@ KZY|-SPKz\upPKy.F5angular-1.3.9/docs/img/guide/forms-update-on-blur.gifTU[6vٛr nDTPDJJAEDE[;P TG<~1g0tw\u]s] />%%_fd}en j22j?5ѯGgɀ? Ȓ1rh^rX>9_ =:z >YY$y Cp{]JUE⊢?/ >3g-:cI-xfWqPupLٲ?亍%"txOO5[N./=<}|CB#"cbCL 3fZWUޯl̮himhO~?08fxdtl|brjzfvλmciiq͍?~[W ]ĜLr12 bn:C0B^_/X_; k~lg#[:Ɏb7F咯xU5QIMd],6,{E̦u,wwKy GS]30\:Wry*Bc"vt7,^M{3kٰNǷ*M ԹT]x;^r^W4Zz3Z(bwNQ ؂xXb{oI$:am( A&\OxtJ٧H" y(Zp0sGP<#PTp` [RqY1/BN)v,~2V{0%~F z $ AUPIߡb7trJ|сzK{*<ǕĢxɶrZ'V4ҫTa$patBVj&ŦR5[6Y& [Csi NUU*\\ʗY TQm9JhPyCDwٴO&ǗsP&[?MYu; 0xnpSN3:DB HdňWg9l^,hiQ'6컕 g0*Nk-8VQѹ7?*v @E5"S2Az PF&ٕ&ep9t&~{0p'+& Rpqs:УէLKv(mAߑ#>%d68Xgz/9]z'_n6 {x'#dNyiT[BkSZZjݙn %vc,i0:M!ZM O]%Ez(dx*@W/rxtWŴQ֛1cp{hMC(iF+ve `bfiO~tޱԀ?3|!~b!Ԙo~˙ɢDt!G*eulMSRq+լǶs/7Tk_WcxuB8'<%H jt%j -흼NhQiY6[{e ~)F|?\(+'j,]#;- 8 [!V\0q!^6Lش;P%'0P5yJISGL偵 12k% Ue<w$noϘ^LP&5p0b(' )u蔨?Ʒ}kˀ'Y1֜. SŝFozX"B/^~'Jx>ͧr$'v|%DeKrj!-\/T&%*J#sj,F򬌐19=0;/jup͟x.65y r=hw2.$)c#PsBsL.w11wX\L_"X[՚ ߪskw /yYi MqI_tWfVBP@n>pWg٪8vuR1 l;@Ĺ22Y#ZBƼWŸ(R|jy+pI)LoU7aJsdCie-Zm8skxsW2݇Ore|=do`1dQ ~;RU!H44{N-ee+h4Jp~ڋgڮ³DLǹs\Wܴ=n5,Ţ+C-/-9}E/L.o5fVRࡼ,$IJI{8M&3!Pq#7F˛ӨZ{ky. [{w qK=W陛e*3^Kz-VmJbEXI/$Ѻ^IqdK:#qˢ^=ٺr0'mà]2W-Fh!p#\:%Q?ZP;%Xq&u1x`g}f\g2c7h A'52 @ PP;O]B^c[qFoDR;킧Cjdw@jj&RMD,gORx~I締t!ï)1߻'XBiH ;oAzt# h{,ݰM"5| (.`~V&@4sㄵ<baY%  /i6dY\RCrԔW ܛ$X3f^^ܵeJ <`;Q sM`] ;؀'cvSt%9`9=iXR,bfP%cȻQ7bJF}F[(A&5Ln]GvG(0PJPPӱPsPwaM=~nnW|҆2܂2ª2lģa7#}">GPF=|*a2 JJ4?]dxGTXT6et(wϨUXQuQaKn4 鬌 k~S@3$`z36)uX.YibHx͸q(mGܻwqkcq(?ߏ߮]C(gF= T@' fA_)Mi1IZIrIvI\Id vTqQX( q e 1I/)2T 8*MSURժRSo~IդJȂPaRrD4(%UpV]t۪t_23Ӭq!)DbTnQ%3*+V8+F++A.+4+)+0*+KVUvpvVvd,Jl/uT9 9MZ9v9Q9U99gg 3-92K嚏Zx. 獛--g[_ݢ[^ߑ߭;K*1y᳚HȷK., *(@*$|VH]H\]H]HUH5Q9(d4+uyT`1LFH_,+. R,tXYAEQIb[%")SB tns>wyJ5KK5Jp˴JREWݙ(Vf[.7H|Cr!|Tlpp2pU;CW22O+:A;-]ohB" \4na| :y^Y\RGvyDڮ"X06F3Ұ rUnU;Cj#ʋpkoajrc3iqql궟v`{kU{G~ zc5XwudSm@zN`d,CDV-bҪ"'9 UY]6e˦<*`z 5{P [PYoAdE\fvɮ w\&W"tf֤Ǝg-jHp25ޢxiK77W UAFvՋW01w3+ۭu$^wIN͋-nX$4)d5ududz-s(P*4FEgN .J^A k7e<}ELUE F\@ Μ#dx]*M3vMne5]1Nޚ3!Ӻr+.9ڻT!=5=x4x[9=ڽ~n 0'}b>i&iYP)WC$KH*Ƣַvsigg/ vgnVkl݋E @!q!!!!ܡk55mj^gz~zwzv)܋d:3:3gcg>8Tv3Ѳzf?U `P/(IA%4'_PXT\RZV^QYU]S[W_ KoWޭolnm/_}?`842񟡎nh8PŃBbwRKFT‹F- ~!(qb.8r%2PL`7탬A"@rP*NCnF@ t/cy{6-{Oךl/~y^Bvtr4#B˕:E#nIO? +y64YNXQԹt?fcAXw'[_Ob~_cDI1%; k'O'AgԕN"lVڕW7`Vd\5S6޾GB]Br! =SfHwZ8.t0>µ_FX|-M~M Wfw>3଼+&Kca>Bz,l1`u (Gv.Pg4('Vjpt,=w|j:{f~}rqy%)\3CqAJjB< U` 0aP:p#1$>(wL?7G z3hGhRݩ1?=kQwnk܌4O *Xs8lp:N6ӵ\3I?ب GDȐ C!%s-agQ69^BQ0@A22 Zh:`քH]H·_^2_8ڭ .HajA'a7`lp R xT.Z9P]p#h!̡>np~yrK敇2,,4"Rs5 3 3='1>fvaIb@# p^fPisά;=1m^3<f/so0gՆlp{a2a('#]0Ko`Nzoo0Sg+d:ck܇7F^^ԉ#t~xlQyQL^}ю3ˈ.2,\VΊ>gyԅOqDudzI _hҗ.u[ZUBS77bf˙ګ_贛Zi4W-`]83%hD.}G+7^`xK I{ċ3//|gKx~vh#BSذ18,>O1I^g%FcuAHg{qcfP,}Q(s$veX3-+J?E@:B5:C eQo#&1I @KsY0Tg[*ب{\UP}E6\`7͹{wuuxWZ3ha)1 6b G{d?4&9nbVXLh['VNovĊb0Y|P5Ѻ ?45A;XĚ,D6fe5>,{=\0ɢ1ٙqx_椢^􏫴wB0>7j|*DRǩY9|S&[kB`. /P1{=\Fp'@TO~hpӳl?Z 5jE O:c;{4wh%OС2?'t*-$@(Z3 /,> z<WLl֩QSj7RnnIouXs԰i*_&[ْ=N7F}+wԭ™524#)2 ЌBOvde".ѢNm3zrΛB2kgS (}Sl4rW 0`#WBj2T?|v K|Nc:6V+Caғ2IMSBrF;o]vJH& rwu>4 ?-4nsށfaRf `vf<ɞvVZ)$}{L-595J L=MRڈj ܿЄ@(%h3EN;sdr}\Sk\q]1UI9kݓV]Z~`n痒&&ƪg7:.Q4,-k_u}Jx錨[Z_bs^`a)՚^.t \b*9OXj-eWG,{-_ nZQ7~] 3-E(܃m-ׂFE3/_jxf-q1bH'S>c5YϳI*Ą;bh 6Oa EG'ƒ[Q/p&bd{) ge$/S0QwE0r3{.zs2{?6eh-O8 % \+3'󌲉= p?UD*OzО;Ǵﴓ oD5EQ#܂qx`pOn\Ŋ9stw$3GYPX=\a?vzW/%a jz`~?4Wri;0y Y{[>iJYLu[3 [$F-\媞K|yCu{{hVnW>5R2 $ \@`_F.y& 3v$(Js,,ُd.1P4P|rdNcթЌ߈>2!='o;Yޅ\i$'Qx=YB*35S.39Jw$-*3%ޚ*+3WVzzPU]S2Y\<čߌp Gk7XaF \1 =3,گku{A\|]X\#>9&tө&yvi,Bָ§cƎm7]^dD/{=ތk㢻8yMșBk.$Wcozca'<^af,g:s[X338I[R+gG֞1n{[:WZL9{$,P7Y/E_}i\b畔9뺍<> ;)GeDY*&>ؑܤ\ ;a&5QՁ(#P.z%xI4?? @r$2)K$+r^FD8^ɨިvZ:"em91Z!3>6Y1мhǼ.DQ#3kB7unUdˡm+9tYy^c3>u c CUԚa3}/MvA%/Z'ѳ]V4pJWת6&N.ɁlQ .߱lm˚*c>/_K9]',oFf~Ejxz4C1VX#՜u=>gjv6LX#A+c,#=B#,`˧saI@)Tȴzd1(5"2[8ô5F+""e)2m4a0zA)u$s''ÞAqd+:^QV|U)QNX#C#9P4c7ƥLS(ӳˆ&6;1_8 K6dY,L7%Ѡu <oDXI>QO+k.ӛ9jK pK=/+/˨ 䂮n_:@JX\s^xbtwr?\QwG80€oX*SL4': f@P~"~U7ud~2ZG'x&ϱ75o&H`*C~WDA(غΚ)Ix> ||Γ#\[ vԅ,ڗ5&BLHTG%_&GPk"ovX |QtCӍ(ЂAЂa9qXF߱L}(X Lh1<'&FgvgE+sh 2mdgMT Ƌpv.I=>c!rNZ8غ^%;s{l(<ȜІ r P|\4{\7\Y9crD{ Aף3q$ ^fb X(ϦnϺvphHÛM#d SP+D~Lɭ3~+">~O^Tpx KsxG/LT$ QG?]1p<,E#] PϏY%9HS}Mk K {N/(ʰj;wi :F9yD~| Yؔ#}#@흙?3'76O֡ GͿ{3;QOM2%w2ݝpټ_I]xKaNa5ͭËK/~[=]~zڧjQPD?p <BC#b"bRS2رakIY)x퐆W-]=|\=K<޼%o'b2ϓ0qqh%9#IR.5y_o O :@cW*9<5C^H_XYKRXkW`1Úk V31_qʻeĉud}̸594OtܗXh0={eYQqI|UQ|)ĸa]lhH[>Υ#z*߳p6\R 61C?OmLmѕV˭7ִ3Wo;xZA=Nyod?lX2VMPEGκEꌪ!ݞ0T_S]/\L:ŞrǛO:6 w0 h "xYP08 h#q!XBϳ@!SGl)\ CVWh(S'4;F u_=,զ^xX^~pE\\R˾93oKcvst C1^`,kC]neг\x#Vay_+T,~yC_*_?R9o:%9Z)E 7 "B vݐ{)~j HѰ 2q2+1E-Y!0(^n]~@eS~4#v3OE#̩ON7D/U-ޕ^Ӣki?gS$#, 鵚$U7 ,0tpZYfp?ؘZ} s0vʣ=BbU!@ qc=򔥞ٟ֯1 P͠Ct4qB.''o?YEy/BP;19 UQO,cxǥ>ALH&|*{+WRiН5ؒpN"<7ցZϫHAQ,^Q#B!YXtC1 !hrM ; = :͸.!D4@M 4;ː׌:O՝֐<%HphI"q!Ɛ\舜Ł}xq} *'r* 7" $MX KJCJrFt,ի=kUm6ܡγwp>胑 !Ip5yɊ0\F{R zB-p}#snN6e1Vr  sUcS?BI8j3`!dV۵ı]#hhBt62x|FGByT{, tb?u -$MCOH5.}:3S S+%V鄹\. ea$~$.V8 H[93#Su46 y\3_ 2JŅ0JMG8AmzK#VҀ/E赴hKKE]!~8#@s{{9iiq`Q 6VsmM@YB&bKlTQFHV6I4KXNt`ysrNiVj's{z ^2T,<y<=t˿ „pQU~4*F׭Q@v|9e=A]}(6$Qx;}HW=q4Qtid691=5;3i V"Anlm|ݩAń.x?C 5'9Iw$8" t$*Q?@۳+נ)ub6}ت"@tq6TQvTo!2V=Z}[m%"V|RW(D`;+$A,|$<&W|)QRk1`_OUI7dg٭tS_ґNE$̠N_WIh܃vd SaJ(Ts!i{bb9Te~6m/io[|eIk|'tx%*:B%L)|j͉P2>]!tƒ 90'{`!Y<{vieG N"\.&Vx  j`X@ﵟ͋zu ˍmE))3tnŹ sM\b2H ҜsF8nG>ƹ{?6aKFzFvx'l lLvu&SڍnRVYn-[1L^nFUGD\eSˬסxfOj35{^Bjᵻ5^kW`xۍP&&㤢O:\Yj?.lB-|?iU<\1 B 7 yQ&G'7h׆mׇ>3s!U_j/o=ۻwڽ{u 7:35,Go9lן~}mkJ&?Zޭpk/p0P>IEp9BEHH4DHΡ\8ANF HB? C%3|,Jd Z4Hz4FptqsbKaNiԡo8[=kgqгG}&Ij_VGj%*V8#DܚXESy=`k#F!y\e9` iK[yDp{0Jr*:D?T X蔇=в~^zJSW)p/I$E4+oau>* *Er|DpD|z]OKo"|?4ݵ}Ω;ȎКyͩnJ۶ PIY2#<]?>P&!IJٗٷdl1X/IȾfTHfiCRh__9?3W ٫͊ŖtrPBHTuBT!6r\5zD=H,VpFd3S>ҘwgFb M!ʃ7)o7%J8.b#l{q,rGLzn 0N;Y`[篿{Ӊd"H:V+CUT8^Wm+\ !0 NzohNzUϭwR8VU.+JSOL7WG8lt~)BJMsEo 7 ¨9zc6vl^+칄WW1\qv+M3sqlT$٥YRg(Ϟ<6Q6N;UJֽvx4p70d(ޑx @jrKDuBފ/{! ^.C•3IzyQ#oT9Oao-#\q]z,mrkx [t.νoD4Lh ](7/#}So_A"^)]$p;r/9 c]*1ջ+ IB sz,<)0r]Lnᕊ(_نvWMcѣ_W]E̤;SF`@aI> lgUzƚIsB]) |'GrB h+*P6"873|AoN8pgutH*<AgQitC<1M'wk #lwz/&Ύ s5o·Y9B@ 05mo9iE" b'%`ع!DAty| yEWf Bp UaND? tOF*ɷ މc9 3f&r+r^tޤ -zNSdOsTMے7Z]F?v6aeO޲bKZs*߹8qQXc29By :@/+PSn#?.ʖ (Xz^1BMdq'DknA翼>D@r5z-ft†ħzFFEa`'XֱU΅e5MUeɾO*Ե4e#sT4+Y. e2kLxP5;x7Vep>e. ,, C0MEUsLX,S8O l+~G&\v3v>>jBRMPnDL݌^Pd_ xdcɓ 1&ԯ#bXfd"`0PZ "Г'# N-R?Q>UVW-uvoA\!2`P["F"/4j8'-у&7J?~;%N.3sS`9n =plQ-b 7[RɎ|pE/D,Іʆbug=;R}2;Yʷ@ݹ!?c'}$$VR)57^~(ǖ=7,7Ԯc+fë?=Q(נ&(]+{ u MY^%e(m<A_+@\fyy)oBe;O)o-J<'KHv6Ws3z$ *uPf᜘BB|+U{ɐہx5j.'SI=)k4 L&'8.Gh=n>0ۣOFfk?Iߎ'?7D5 < 1K;b>,FE&'%2YiY)9~0*=]VRY^UQWPT]]r|cs ]mKM!EQ {7v_>f#[񉐀@lG,߇O9 j z)?t DD!6EZ7o0\H48v{ΌSy5LeYQގV=qos?ӟ [`E&nBwD Vmrp#+v3֛En=O&v?'EXNmˡP?/̿CZn eiXv)k Qv{@Q>#o_=pOo[g+HZ10_P&o .~`V,w8 DrK 4nF3z^Š$mX@x.CdY\%jr¦;_&1[GB$,/?n]]R %ơ<קY4y`~ignvY>¾5ewkogUnW ʻ.3yNx`>MHJS'UW͞u:S|a[}{Mvq3SgrÏ5,IU/PcRsRĽz'Wg]$f#DdCuJߞƼalCSV0}mTLl-~z3{n,lRaWװ[4r۾,6:G r8>䕚yW{_e_нʏ̾< {y䗁//b䯣_ǎ9bWz6slDE@d3L8UȲ(ː-U8nl;B;f[=Žz{q1]腛s6{U~=>=y__'/^z_$NZue*y{o<7s;"?b<gZbT9cej }sA4*爂o rA/ȁA|OGuGx;(TF-v=,Jx&Bc%#`ܪzKMk-팬rً[  )"֧m:v⾛=Y&[H_m"&ۢ T;:47FwϲKM/SdW\Rl6@TBU6ٖB"P  f.7^̪1d"( L2wv'(?8<"]fvqjmCAtP|Gh[qkyE+%YYxh[ɿb;Y֣A;#_%KaMT n7:Ю)3G; dQWEBoC:LJ0@Iυl%!AwOۏ{sQf_'g1 G=NTK1AJyz횿b)sɍtEd_ш¬y8!L$OopD@[l duC. v(KOBM~}~)-y䇈[|\0K^*1<|,mF)7jlva wx2\w?'{orJ [s=&/:LZp [wdr I8kbS  wC\tA( %GC3I(8addȇ$e6a Bvd"n*D->4x`)5O$aڔI8n咍DǧOoo6_usfC{>D9j!`xuMլٛVvKS߼$(G (,+0z&8gЕy!j? sOG-VmWM嬘e|`%Sě.]p/m=p7lTf֐u_j=e%:顔e-wXXdtDi+NaZGx݁ A'ƶ=rY;&\rfZ|ew=.&t7;5t*H] AhA}NVpY]|PKTbb xPKy.F8angular-1.3.9/docs/img/guide/hashbang_vs_regular_url.jpgԺuXͷ.3 Bpwwwk .'BpwL|Ows8S/UjuUyZM9 #eU%iR >6qvc+*m]*%@JY\Y5_YLi6p32࠰^0 xl7>MdU%LL\VNifk]pmWEͬMaLaFЎ&&j_o]`O:qs7{+ho ,H*dlלd@$j??* Þ);a d쮬_k70+Opg;y& V^ꡪt0SM aV̕?`Kie86rƒ9Ÿ1 =`x# $\YKV s]v={ !'H"`WFm0rX&}SO{c_pppppppJppppppipp5pppSppp \f d@ ͐dryG'g׆O/o߁A@@ @`@CEAExPaa QQ 1#bb$" II)) ii YY 9yyEE%J 2%*** jO_P7P1Iyţ}F[@DGG]=}!aь1qI)i鋙ـ9y K++ kv,vW}Dg8R88a888[pfE;xx xrxx1xxq53 $ZFN$ &%!#""#N$n!^!0x  F֓.ɘTޒ]Sː;$'? xIaKBMq@K)JiCBCyHO%NeOjꌚZڃ:;= MM- - -?%m m%"]%"=2=?5}:03gZ"y45 L]_+пq|Ӣ()%+(3((w (d쪾PSVU3RPQѧYy%ͮ=CcӪ[{'ϣ?k`mՐްĨX˸DɤT4L,yEŞe徕UՁuM͹m]ݓ}C#ӄ3s󺋠K˙kq8) jva-~ ykϏ/o_??`H$Tl<rF.^1)(Qb8bbbbŽo=7!={beIII[Ɋ)T))WF_ӸrQ=?32kȲnͳ's^7<+H+D(,-,././!))]X^Z6PW^^AVP <үQ-YZZ_KP θn^1 )|bݲު:&.QIݙمߕЍsqUVQRvA/CC=_Dt~[H(hXw|?~OOtOMNIN MM̼՘ӟ[7__8_\_ Z_^ZI[%[-X{Vλ޵!1euGWϹy }Pp8$˟gg;OėWW}׫77Pbh/_wZw{^~?lj׷ RX ~ 1_paMPm1EUM]CS7oPT,|*z.~AfuF6|v \,oAo{ӃBC%I"##}j΋KO.%$?=G L,lԜݼ  LeKJJ6˿UUfTThԊ}z^[X0ڔb*ЎԾ1YܭAoo߇~A _Ҿ~3y581v}y|GDdմ,bRrJjКӺ&6n^~ݡ1IީO3󪋰K+k̛߷g_w[O)8;)>A iy5C?`Ě4lR*zN>WFLӬlM/8>roy gl= ^ꗤTt̼T5"%ve.^U^5.uV zMR-Lm@Ϊ^~A1ɀi[s vK֙6^*v,]\_.<.Z9'8)n;KBD$dT u-'=CGWYܘ<|BBhRqwIAiHi JʭꢚZOut⦰fV6:2}|$C!闝+fGG~151;9?8<:>9t|rzvkEfgtoQ)гח\7P_s668N iDE8GlE @E!C9C@KCŐ¤|F!e"$% "N%&$[%ģ~CDOWM?쒑s,'9/9xxe̅EDk*_' Ԗz)LYf_vP.G]A5uŊ7JJw]*j4543Ե1uuu/ ( ;M|MLo͚-8--kmJlV34qǝbe]]]D<=y<Ͻj|||saB7  Юpڈ"T)cb 7{&JLZN.OLHN[MQ:/ckg!m W+//-T]b^*VFZvS>YQ[[eS-SR>QI 3gdN@`T F6ލsؙ̛gZd]V\MXe=.\_'@/ҟ=p` h`((((v_ 8ƪ°8S h ?@(Qd}5¢` 0+XN7h>WGH<#,.@0ȇXxĀdT[#; !ߢDZ֡!uaH`cb``bMa+`b!׸3x&xuPS64·#twf0Rmsx\c"mdtkcUpaf'roZ 6h.@aLg"0\@W }7(T 0. _gpDp> ]Bh!j0X|~U`x+B!"9>b 9R92?r0( J*:j  ;:?z, Ÿt2¶>EǎjfXff_vGSuTT]+ojm!m=o,l'7>Dxdqldknuuvo>oQkeelyb[vguq0$|R m/~7c? )ca@30 $c"a( m8l0χ B!n <9S'pR)-k`,J 62/r J<j!*?-.t¼NJŦ1Emsg?yv0&1 Yy=E e.U&u6M!m ]'gs ALdB,Fؚw_qjqs/9w b ҉E|e*1+$=*$7`ҎꪺƮ{}^#ci%Ucۜܣ+쭰?Au|HwXyD;hXxhjpj}z!ٞF&j/j1?ԏ6V4G vbvz C=_~9+י-L.ˬ+^ki5c[3;{YFGH >0cAO/#ea/h  &ЄApp{M 8 " gpb>^|Չ3:.SdB"bg ϙyx%$ed54`tohXxD仨Դ3 KJ+[Z|695=3;7px~qyu}s uG/Z6L/0AMLi?cC_ p#J̯ER=7u@!ޠ?_ i/"p؀p͘g挳-rv6wd@dyҕIShῧE_ %a0*wO( _Gl5sygXۛfL7Al/.2P2"Cy'>M?sn8D7mRcM"9ja~ByX sZ-Яzd-s I˺Ұ?g9bG_XeLJ<moךЎՆ[+R?`@{mnsR_v .ln ~$Nvu*:=\PWwC?v(M3)Hr'`PҤ1rkp+p]XrRVfO(Kzf%'vMf7԰ydCۓ2ЉyƂ̡Usw+RӢS8U;?//*"=<줛 >={ٯ*a OAz!u35и"梮I6m|}Yە>JphٹICyju+yn]"ISFFg̩ 7}uk+͡qoԕW]UMvCTYo4xri^ҡ[PI?WlJ}G?0lmw,W/Fj؉Ym˞KQ|5,vErNL"[A31wJ';X [&]_4w!ȒkbPCx:Њ6-ëHXf3Jؔ c 2*Q$o a)J)aȞ h41=Y[ .tj_:ewRP?xW0z>4u? 7['}q+$<C߃sJDh$&" +ۨ';F7WiSPU> j$N徔xMK`m,l0𖼇Kb*tIhLhb _AgudZ'[$Ra4Ƃܜ,*_sG1(ΚkQ)țy3M3M_o'ȩU׬='Yfgul8bܜ܏0.DUNo Y>}NjԤ.nETl Y"k6'X/'/!%)=t Ř×< 5 Qp54%r^==133bOo+ּ,ٽ"BCSNM+[ج./ה6p y爽DS |a'Yi>{Tm8oǯr s7=1q%x 9TgpнCL?ژF&1CŅUkwxXuۡ!J3"7gy޹ ,²^s(q\Cߢ{[g:G]k'@Dj+‰ ZV]]S$ rY2."4gĄO„vvf:k\|nSY <AAVTV]M8^(EyьYZH9W\9Q+RO< Q=<%̻yׇsIrNyKM Jŀ_=eӵ p?j81 1Z(#ujwdt-S 쑖qcpe6exFv] Q:3j'MH3Y#'s67DKQMT%Vd/aۆAP:\b"a7&mFjDhtcܓŨKʮkZ>|d<\zTCqJ#y@Gʂ\Mj-hqys\:zAҰ:_aKFøZATNMT^3JN!g!WscZG6܇|a STBT?5*TjSh81ʫ[w O:{rE3 uӟ,vI7_,DI$v 7.~gEkhzhEZ>tq둾Ks(=;/`WйH%<8 9P+KV&Rѐ@nA.PO&)1tѱEhMA/T!4kzK%"" I>r;(t[a:|oZ. Jj&k 3 )v,͙QoUŰDZpX!J!b\_^5@W7֯[̹趚ˊ6f.,\2oGC86[}g#HYiӪO? (q xd(ZKt| CJ"yX"'2X=ayYvs 85f;3 ,(@d`VpSwK#8<7|G_;Yp?m$O]l6)CK; n=0UWkXJ㠻TE?{xSa'{2Eq ӃpTD8A9f&kbZaw6aVσ]#a-Dm/5!/e Jo.p|,cC@ir>IwB.ú@orWEP%hyh߫Ź&y.AKH<_XcB@ittwײ;cMy )G84;DA_,]3{* vGOͳ~oEfvDo+JI6;d~?F,^Akg::B?MtyoS6Ʒ$+C蓳^ Bt]Ir~U/x0n.LחOSNHE]Uy^#(R8 iqՋo{ udGRDMcTh~8YR*oWUcVC ?B)/dttXySS!#sλ7=cJrL03 ݾ{ D5ۿ~N{(J%Oґhm=cl7hk|]jL"ȠM"Lvkńf]~Ʈen{y?pc]>AD@DџNOE[kv/zm,gV-pڙEhL ]=mVTaX~SL_k-ɭ-W}wmQa RMS/=uu}`=~t `q>G!/Q9 QF~?pGg~n؝\)8)j"S8Hԋ(JVJ;F^RYnWcHuԗRC^ ;R'b} i{I|KΕ[x9/7][rExx9.:bvhI3e3o>g]Y>1]WX| Hnd9rT}aSQb$+iV"ᾁ7d>U2E/~; J]S|.(gӆ.KP}gX7*NLW*b:=:}lvdXh}+u" .hwmaoHI.JXyެ ISJĚj[aH#k\2YZm1ORIƋvTДb#ons!=e~3M3FVI\)xLpm렯+7$eHgE/BTliCE@0z')k}gT+0.Lu-a~mw;g]%4hq9i\Ϊhuِ0 v]O¶mKA6;X6<}AhYؔ, ەaI8Ivo=$͋Iw> $IEe_xE -ގS`+ 0w#4xb}ġ{2>B.{U 0á-[3Ps"NIzM/sHyil5$14+/뢪0vxo#[.Y=Su w*=ZSyh+f+O>fXd:%#FfCӻSU3mmޱL1ޛ1 )fz±sp+'KkX? %.f}eG"ڲo`+8{Mⶐ.f~+H`Gzz/B>4t?$"<`;:2 &(S˳k&L;|xYm$lShl{!"({&z|?@jW'Z :"sۘÓt)W/AB -ԍ6_WvBKh0BhbVRK-8Յ4xUeގ,ML][R-R.Fguה}՛`_%;d{AnleMq =>mW^%}Xc6Ǽ 6XԾU%p9\e%H$՚S/O[nI>3ջsBi{z5 3vS2Pc4x|t=)eR^fx-D׃,% JɲJt?8[zY8V{4`1p"3W `[,_~>wJC~O@='*G8y\D 9% @A&6ȍ\L~7ukׁLH xR|ЬuP<cϫm$yP8,_,Fzyu鯔 j/g`soI~7|$Ma}EVM7w|V(Fh~ l`Bp2@IO6Au3Cm?ZbXko^T/65\f -O'pA+09DZnT]O,n9(/8}LD)?b"C=zNP;^7BL' @Ui{=wG~Wbm,:xh!'П{= &F0EWRه6x+P1t;;$lQɿޡmW,$"@bLD6;t,/vXe Hf=J*K$'Rjg*R[OTY hrDɧ;?/w-T-:X&^ؕS;CYP97?M:B5g jzdB"3ej6+s{)ZS&S{Fj(cڶ>2l&`ٵw}_jw_L"mJV\:QVSl9&ع; R_T],3;^}^@lN`Hn)бm).}ےv)o(qMVAs<)U,&^w›qdᄅNe 5UM{9&d"scdo?Ydgfx~?u8H-Tdf9)#%iL#ݍuTinoqzoiO +ڕJj}%9yV;~⏘^}"o=Ek6SK2^.5.9g<k~|kֶ6vro UEcOԵqjM|X2;Eao\/MO=bI&G-NOwޓUX2 >Ӗd{Z5GŽ)Qo v(x>S: a5:Ok偙hc5m+&bPZ:KO塄WgALfAu}&|JԽwwsɫ=NЯd=C?*a'jeEbOr!ռƍ,w7Os>/w|RStg +Ϸ[8dI?3o0u7a6) q9y:}+^|3d7}퓈$8ji& 1J]^C{3*Wྪ3b5X0ۀof(=fӼgz[{jcߛeT`ח1% Z6"+<cIhL#unN\h]˨3jו.GX }!9llbpT厳tACG 4تӴe=]P8>b?TJO89x?P=yД XY#alؐ F>P~Zd9Ka6*^^5qm K}U $NlpX\,*KIiT^o.~Ȕ3Fl9g?ѐ*,0ZIŐ8]t7~WͭfY< CvC|*EamB~w::x *Yχ}s0%Z{ 1tF=oz^beלnlU_WآՎiq72Z\q cg/"sBU[3l$~>@d˫E['GvnAK!*}BĜUOXGsL eEFsj b%]#o6tPZ<07\SU7-NsOa&ybSclh?v|mouCLY̰8uo!q MvbTCIM]Mv9U GDvy̝iVڬYx0'y6Y󳪶΁Kç8b,H2@#TdP[=ӢYhh/7rAw QK+o7enj[To,U%s_ dW=Y ?WSqhថ+bUg.LNz&EE~/v 1D6} hd;1,N8Nl$Hģ]w{^`%t/zzH)U#D6&7hUE2D&[fttRP&F[|;gU$2"9joRB3:%, $bZCn,Phܼ̀0;!]ɕ( wVWwn5~tDiT4g iI3o+%XˮTϲq+aCcNk['>l$I.%''A{aD ;`-!LyiU~o]CV(?L`:g˥(tu yYPEN)~UsM~t!"<*dbVxnqXmg)Kdkn),Ե׫0C5#Y0o-GLj;w!LN.ɆRs׿}Pa4t50l&Seg{, $8:wSA/wioaz` ',~yJk^:6xe:s٬WF'ΒؼA4 "~@~yzVHz龜p#K=A,yjPFI:&mKDL#ꢂ^@3˯ߘ,b٣֤)9i<90KTm0A5|j ^J!'Tfx uT^ GFmqSqkAB$;zf+h{TIy )1'.Lm qZDa =ȱ(˷b7].ʢD_` u% .hE.gfPo%oZ\T;awZ_ϰFA!0  ~z tص_tgt鞗hd| LYX\wsoUpBX %yU4?e-/8xu'3?[; KN #J&ίneThl԰c4bNsX/I7orn)`O>:O΃u;& ^gڢkvd7;mp7$ 8/KQvP=wtEm+:na.E=LK#iLDv]9vQ:>/<>hتJ]oMBDJ̏;H- Dכ2 ^9Z;7s!Ur ,rKYW3*J 2us23$hjtT Y^_my 3[[4fC+30O$ܧaz˝j,9k;M@ɂeRtv!Orc !FsG 2"W쬫; [V+/4eO'_wT'DD#JPz/"`@ Dz QPCQAޑ&M:k HIB'@|ݽ힓9Ifgf8RB8zld)kM6u` N2_Aڨ3ŝϾHVduӹsb߸5S Olmay+xc<4'Sn^sVW*ߣk$n=PwXҵYnTwT8~vhxDTxhӍx`wU t߶2ZgrTGEz0 r}Lh˳CoŽ>ynq٥y.#CcY1eО,@9‚QRab8jlvޯy. &F{ۛ6' 2;/:?C+%JHan-BųGC-gzZL⼊o rԤdNL!Oq3q9ؾYºƟis{O"΅${A/}wM?h~aJ6J=FYBxZZ-3JH$} K>dE W*o*^Cÿ xo\m}j'pD%f(yJj@DxGZ+p5 T9O轼۞S#.C"ٍ3|J7cyB k'uqe0)6u]֤82 ֗yA2Իkʀ.*(o_[r2Vfë1ֱr'7 e.֥Dm:i8Sݜ{8yܩKR} kZs`GixYhkmd϶w [[BC 1ף\ߑBjZfΘ7whl Aޗs*t 2`9? SٱjLOz3@KǞA yLpFHS|^V? 3^Tޔz3I"^vԂYk-t$U40džC2eLwt3FS|E䛄nvrL%<+?è m"OŒ}|uR+ҏ-98̨m37*;8oIRnV&]ܺ_n.Y *}iҘ+> YtUq"ٱm~)ĮoCB 1{ |׵{ ɠ6̍8~턒H"TW{uߘc},0Dܓ>_;UwmrW=:xe}qy&RISYݽ4:z3ZaAq|AA)5 i!PPklwEXc㿾]߶)yQH5@@R>@%r +G3)A7Ѐ%t|4М4T66E)Nf m1䪩xs\oilL "f@hr 53ǓP ZS!"EP >br6?&!,VDNJ+"<'jR⺺X[fs/xLK[['qNj>^R.^īI ۶T6-g \ С܄MWDr0ԺDmKh>uV:/Q +`O7gFmṿVϦ=]a2 tHIuَMNO[n9 K!UnOLL{r? 㦉Ϗ+3S?ʂz?̈́ \SLkb&E`dY)o1TknS"' Z'vJ1t|}YקA[*!G}1wWtdθu٠{6L*bAv<~ P[@*̬"F? ~Gb.tNbNxaSv{. kvfM3+[bL’>|>s8D9'|DMV |n.9m_^rP[-@t57<ԕpRDwnۖ6A5GGjU|-1*vp7qŭ׊Ț"Vq],5 >o+61)}\3 )) Y`7g7 ܗ1o;6pcɔ3BvkVaZ<n>y?ܐ%!Ȃ$!}ɹ}}ΈeѪrȗM-طsOlvk\:Eo'ȡg pZ]l>s7قB_OH"$ Ө1ECTEbEs ʝz^&Hi b[ꛠCP&]24+㈸` {]vذ8rVDv 49L;PWSɟdD.G/d{?ƥ7'S'+^c*{q }0hH޸ڔ>yST#!?K-kAF$?j|hn)!p od+e1f8cGOXd8=qۨwJqR+jd5A7B5J`7:.!2q&Io΢HЅ4јCߏ6>w"%hizʶ8HQhwÙ Q *ij ]Jm'hܺk󐵓a"󤾷\ټQ3^RXo>(P4Xz㸥Y*,̪CDzZbE,RYGb@/L#Y%u֌{V\"HS͚40{h܈N#ddvG@;a<ۏ$|Z߽G)k.qu3Rώo-S_k2(DsDғOdDK7#@ XU p|㽍\MLndɝ-,tY8i )P+_TlM"!*Z7(Х/m?-AqRuȃT7A$RA_WmPdȹoC_}fmWdo#7":]l"6t^˩ɭf˓Mo3۱_ۻO}l>L=0|.GTW3). -^#RɟkoT(.M߷z/%޾4#oa5/yST+T8zE_6oCa{HU ߁To%G,RIσ`7qFh2Zpmp5r~ܽI)q^Y8kjGZHlIl I&#<-ǸE\B! )0,8YfTZ_5B!jC u [Dqڄḭ&D>[Ws0zc[+)GmɮVڞoZE|=%IqJ78ä4:&g'ߞ*W%TgECDo}za3Np>_;'8/C|ʾ?45ZA~zWvglZB=ņ3L/L ]'GxQ|םS#B+Z^:eyͫ!$1]s'O)>Ȓc}*\MpH~Ny>uBйx5'H8Bx2ɹ v*%JBnJHSdY<7ZKq +|epSSW*AcU@%tZE@qzGh]J'N2hWp|Ť$;kgr,2 .{#::PqblE+l=RӇw

    x[r[Ǝ?F$ιlywyOkJW*Ң2(>Bd&̟Av0p5^uu" SFZOy`U*ݥ5@<[pEr91ʻÊruQ!%el3S wm +ꎸ;.0ʆ}ʖJ%BbuEb.{~eR5O4_ eZz&䆽>Wo(%p_x6Zj['N"ͤ(Ľ)vo݉::<rR:Q༇GUBDAZtջYkdn \wi9$8%31_fjbCh{581SM;; w X w^7V{L$o.~ceftT0R{H|+DֹS;zIJ䁴$g^:Չ.Nٺ0 L{(o#LJJ)Mi<6%{׷J\ tf7_V};+?g@;/:K>M?VCS~U6`Opz5DanA'*#?B/YhqH,SFd=‰ XyU,ؘ w}ΓrCHPDoܜTZfzΎs l#*!I?f JUT@]Fn:ٝ}B+!2Y6D#raNq3ſK <5TuE*4͘B#_&b,lklX>򽃗Izs}f\7\E_:b1pbPODm= e>G|Rvl?cš5f>;7U]`d^IIάXc*,`:rKL.*a48y` H\v2ɝ 0`wX[5NkBeހ#3"#p:9Nl*8K}ӵqUBSXq:ӈ[4$r7ybă} BqLpoPbZl5V}%^~llXw$ݏ?~χ ܍'ʳl%ߖ微JPGs`tG]]Wnyyo v18G I[F0}C I_AQthElGr7KVJ&d~B.A Y8vژ3g;t6($ 7蒣uq `N76/#)\Gd-'kBHwʝcJv|KHKS Ȼn)> [s F$F7>&/]pZۑ1/5m5VꈬWE~`(+{INl-gq\ru | xiea?)~Jf{LMZ `G|Hӥ٧E0e{$C^_wF[@>kZ]ʊў.]_Zt+qOC-U ,b=HiO 23P^<@,Rlb8lfVs 3| xbr-r (p XD;Ћ]j)?٩_?ܸW:=^N ; ƌB:dž_A;q j:)ReYѢ.4InzÎ&8im)4o:ó1LrYQi*3Us"IS K(8zr*t{P,y曑e85!oQ(N/?ؚr\s8=7=[Md٣*2Ã_bM9Qn:/RE&!m6$,6wMP8tuN:{Ɖ(q{ (z{{=iŒ"!' J9 :$1E[T@P ~:#66g L qȥwRL$fzqFnYU:%HR_0p߸Ѷ=8]Йo:]`80 k{ l6܆؛T%0f&yzY Ts]ԈHZ֭c}9i^xZ2g@/XK.A0l|vԐs ڇC13 .%/ܢ=O}6(@&gY~4r~_ӧa0xrۉ>-ka{Qn]4`ObUJfFH}C 5Z0L=0zc22|qoS0D/c1|W]*)0$W8u_ꉻ(TD 褆olNynZW ڃؽ{Qە9J} 2KqZ(ED;5҅a!;ɂ|5ٶqt{̚))]j.4s~2`\XSvjtkV]ow mב,opokh7EOus`3W)k[̙Ռ-عpro,`ヲTߝ1wV8תԢvQi;)s!\wAoG#6$5F%Q^܅7/o5c/:$yDVp:cLSp/"VT f\j,(h-*ʓLD-'y̟y2]КVt^)fY}1{a_`}9NyʐA6YP@: 5m`mn- f?=ig 8BFZwkѫh@x0צ^hx;mf{Z+ Ӌoe콻bg{MNbHB,v7>|Cscq8G5j$SG+$YӋ/ؿtrvA+llQgSskzI8k4|F\jM,z kS{C;;NNqGpqcA~J,M{8tX).mV&5(CDÆD f]\dN:`4/b`?u5GT{Vo =O{ vmV9XDyXP㢠-pf!|x-˻!±GČTe3@,s((*QSt%G JşCz <@B"-KXjG(il3{ؒ݉ Οн&T+^Qז7H2H"^lȃ{EL'e+xΫlEEH+E-S%=v&{I\a5l>8Tw_W\4W@mR˼j7|_-}0䭘 RO*}DK[`a#/Oi$ }rnZC[[l2K| `{.aIeGI*EƗEPe=S W{z.vvaB Cѳ2]{Siѻ}BtV3noͨueNۓ1Eֱ-[[XD9Zru43KA%CN@5x-i?ŠXjΰ3 K rhd">Tc6N+ُQ p0 ] &b 4Wxw(jfsfzK&\ANQꋘh.X j1zlYKQQ)QQ'{3KSw?**S^T=_̆a❣Ic!!ɤ`")0}A@Ds2pg?ڨ8URZY٢JX rm%&3#d-?*q`d)8 qX#[yx`"QJ{@{'ES/(/FK9YP͐ *ĺ8'#uc!k/ ./>? 4J?@ Ә#pSkXp 'a?L,,8΄/2y _oЀ7/&Fa(VULd]/W)k<`>?(NRa_-yeں@kX`BdffŪ_ z!˭8yN@G:xTMVm򑈙N#39AXQi %PB~=1@& yC \qf!GF\iMW0#xA 1K%G8a@ K|'7Ey$/'~sCײ8X3{ULm6(X~]W7vϏL=Xk0 ~e)$\ቭ[4/RFʇiC:g:O}׶@A0uel 2y9"GF:-H+7\G_*B* udoA-r ڿ M ȅ%w\>O^\^AFEg%AErA[Ga%l{ E.H%6x4N$Y0&zI/R F{P Q;)DRaPal D$9Hx݀lO(Ѻiu Bܽ`C\ EĻptx$U X= P ́x؉ĴhI?F%0i]Uh>jϘC2,Fώ\#Ԩ G vLxqq=^HӁA sWbh/(nm.t9p\f23,;`킜͂<|<v1o 0\bh%d4dⱿ"J͒82QghHɼn 3 yg]_he2:U}u:HNԆJqJ>玗yC9 ʪ*~jU,ހ|"QXdֲZtpMȒAᡫeγSʳVIi)!1QƏ;5A4\bN"MKϚ̪,)K0:89c9|I## ,<~_U$+ßװ;F;Lx}i$jĶZ9\]hn9w5ppp)vpssӝ=rkC鴶}`_2ώ~{UtH%3:O$iΔ J Ҟ|owϕgoߋ MM~Bt$ L\,\͔t,,sl ?hʩҩ^/(c%&)hX13>@"g0^nf#ub.][E(нw;rxH}νߩ&A{8kIҪІ`@ F^"|\e%&s|vd,T0>y}WHf&d^1ϒnD |I,','5}C \hMi]\xJajYqH}z!AS^u q{e]/_Z`ZZY.Me ]>yAUy lofM?%W3 NgJvu=#<߬96mgu4>kQ X)4)lnJFN&.}ًWXP~-w|~D]`2 i|vO;ia/"AaMLpL@LnvhxXw0|nj ќoH(e|*:zWA+EӯNkۅ3ӲݙuNZ%ur*JŰg¥ O 7Y ֱ#DE xߘ0qpF*I*-ɂU0"g:=3#7gw=1,3Q$!MaQSW8i+bɑq@ֵ/}[q~;m^WoM1r29Z mvWd>Uz[Ҕ溱/K*8C\BY͹mxy8m:19zUIj1qk,MIIܡ'ohnVHM{5~o/r3y---CN1;;9/R3Ep_RL9dqoYysۏ*+N`l\ ,Q1f>ΑfV)1Q]0'[6?gOoqr.)юoc;|߶fZWR@_UQH|֓`g%=˛Ӂq!g}LLa;<3>Opjo'q_KjFLꞄ@V7y :穤? 眔2G[da"ZHVf١L1e}dOwFX_.>J7<,!F'Wr3LKu'JXq];UڷhQ , k}d!aQi8#Gƥ"ڸt]k¸'DȬ#r:duR8 ē6doơy Hlqmw~-Yi2T~)#-+kc\ 7zuʞ;WBQ.5Ԫ|/W(ONL\.ӮV3!1bcՈu6&BOEO[.gjz\#79Eec-~lJ wgGƧOPajЏʁ!\l@2$/O!Ƹ*g.6XM8~&nbd*d<\uDÔΜTxӭuUer D)w`Hq8<䛤$XER-+61Osna%p%VaV%ViGGǻ8i\)fi.i&>φy6^ܯuVWHx}NI26z/Sǽ7tvoʃ4C×ȹZ6c2x31rB\˼kuD]6tn/kpBzYv7,`r~\P7q(2:vڴ5;n/VQ Ƣ]I('1 B ·oTF'i@.`CB] 'TK>v@ƿ!IOe\:4g ?R9\AB DgfT 7QSݑFG [wj y%4(/hiCVìa`5W$oYb9~U=Ύ>u7p2ZZq $$ VRyش+H(DDVǩ)[zanNfYQN+5hZnE PV(=۳lj{|OuHG %~ICP7;8~.###zo'j))?m8SԎ,\(QN-{O7 +qu}<_1v{*xa\Ϸi 1zldp 6‰Wuv3Ir}%'G9BJ_`wlbkS[]r²tvޞ:}mUBp3'OOm5j9i$僊̣۷RCcX$ҖzSFj$!$~l"6ao9$4 B-f5O=Q`g0WCLtG)nxfmmzˊZc]G'魊Сnl5gJ VUwg#SaH<0)t*tjfS%4v.^G1" 1W'r2r(3)Uwux %cM|Ly!<ߝ&@ 㖡*JB|,,F&ΞN$A&:#b49пyiO-|;k;M J/ OdQIvKŃraOS=o 1ãtƱ4\J\&"'<1/#tPjA0-?#qZ l-O( hvlnnz_%fɛ"1;)/BVՕ[JtJc4C;[G :14y"H,fU.STJaX+Lz$ elhd1rß;'2ĦM͌#9Fi3֜U'Uz[?WN> ۤ%[Ud ?Gqm}Lbd)QSFp>g?#'I;ө`z4dL^zΏ_a!>;=DfZ ѩ)aS&N?ܶrQGBQwZ; KraP=AݕLbmmݯ}nԐDiv%)O&aQJCB.+>8;c3?f >Ӯ6pgJB J5ǥoW|x[zȁ*0"TZ_Exot YO>Yڎ@e`hnI%# qXa_}y|v$:m/Sâkq}7fY\- X̗\AO|`6vLt*ڻ_u= c2pa۴㚦ue¸ ^\7]jA { S8Z4QKX.If)S穆7 NvZwוQщCMW^Ɂ-1w!Yjws;Cshj3[yi'lsЏ<ό+dqs9?[_J+FJ^&o!DŽ4wt칗W ;aWƓM e.C;;չ70Fk OW/M=qZ8oY-~@\DCunsLeu?W1`+:kȳGVc CLqҗp"/'6bAwׅe*zß⛁(ڈ1o I^GD̔ZN:*@45qhq^ΆigG6%Z4ZLf-}5b`7KXߞB!ۏF۾cS`\ӓ\V*%B.6@~\܍Dʍu\mv˧:y<\[gջkԔ%@͸n™[wv-L*b7%FAqT|NT.~הuh""waͪu%/}YcFR;]_ " ˱NJft9>uo%]ɳ /$~b셻C?[)_xkwJ¢c.+%GqhuF v:ዅ't9wBd j;79kL%&d٣'OUb+`E N!P}c'GwS#E֟Fb{EM*A rVD\zDM΅gcct'i%iI'P$7{FGy+n|2H풡ދ/:qMF)6i2K\foA$ϴE@W2YׇBAS1~&fo>D =W)JO|YF ..Y= m?2"V~w|20/Tf ,X. ].4IxS(?e9I1FfR_zTN|dZ]t[hoo;b茔$e#?Q ~q;00r:=hl᢯Ӷo\Ҭ74.䛷/6w/RAz E@^?QgY*Ry7$Ʋ87–AD7+>w҃;Ԃ`}e-Wэ>.uTtG P@-xP`2C"~ac;Y L |J3?9y'HžUfH5ÔI|w mn&#Zrlh*}UWp -]Qfu˷Ktm4\A Ir<1\K.XG=p/)+),/ }֣3x"y7s~ܯ"z0}u=XX\EH>J`y4_Aܬ8YteA5,W]$K'ZVU3Q;@om1^gDMZh9v3[3=ȽzNGn.=XGj\YfF>۠K{Ŭӻf>!wP0˜KxsJ5mMpG椤)ؽV4m;nwf-~XaW6@v:L9Cs~"(#20jOJ%&``nƻY[-IyC\֓Ih k: ohhB4 `Wz4[qqqXEfFTN6igeGtza `ū!\1e]r"@v[ -sӾz_ʎt# euIVpnLdv$wV SW@>oz]-^oD؛&\tĦ|($>w '(Mo?ߥcp>gҶVcs+fȣ6vNL\J#M*s)_-@,b~u TԳ.N,@⿫"2k|jɺG=~V`{@eFHjrX%Lrޯ^ojOۣNb KVC 淺Q\B4Lljt_=cz'{'ʒ7pDS!*$"E '6NRS3nNcE_U-~wi(NT/搐obK#ppӴ~tsMN6%!"NGxOS b0𫜼Q\lBrcck*%gS\mjgWbhٙɍ0 Ӄrйze pz^g%]/?xTg8г|׎ͱRe<62V WVijͪ}Ř&A 'Jj %+KR!CLkZDe'74hs򥀟(nQ Q`:n8Zxgv,?`lJ"|rDcS&$|P'nh<[_W88sټfՉvf-Ww~d'OtMx2BCݳAzyh[mF%w[F2 ($ "h=#Ș77$ Bk%,i O~E=ꛝ Ε}Mr~k}-cǩO՛'/WĦ0%ԵWxɓ#z_${\X*::hK\vr)/R-j# K a٢i|2C4V"(Œpf.EP 7˝YnՔIl5 ͣZEvI8s|DF 5|R+ gdF&?oxQ^\Jjb`RNgw*K dNk ze@w Ԃ nn-13#:fxhծ$tDjq]P;NF#8Myk^% mEs S1m|?90I3;uVפֿɳel*ZE+}UjwvݺlaRs +C$ T'1%_t|ڥ-2a [)\ 7Qu'h4uqҵXmZ߽8{`blJ6߇rv]W@G"TcΰNڭ4Mnи?<-O# J(=2E":\gyEx1]n?*!J`;&K xy(4\i`=^ݳ8)d~YuAR9Ô3e;P*lo?w3%p9/Z=b]vJ567 , 4:pRnz(:(#<<:<,^9yXG x s%GT~J%o{ja_2,!}q41޸}niS^L?9|T9) 2*vNCAv2wNI\_X V*M) :HՌ.4㶤XlWধS@DF/(!?+ /0rEyMx,T¡S;850UZK>S=D d9'R>EDE3qY+6E 4lJxB:သyuW uL$є"9-;?uRBM:Gۨ$ 'b/ڝɢӻ7jwjJu8]2W'C><.]3t \?Nߛ6{Nz՜Pd^F6LW*EVNɌ 6!S_?`WWXoq; &CeS q5gǩ$HVNknn% ԡ Hj dX|k5uRh cSR'i8M-pb6cq؜Os7g&9*-E6&a.k..'†]Q;zlV4HhYs}Qu3AFd7TZ|O4q ADn˩_>smDÈ-5Uw }ɕ K8/ 8v` C#Dr.w= `G~s%#N-pxYkTgO;^\@ hK w 0* ݙ#<9X*6 i[*vU6a$ޣ O#yf ȁ <frҗZ+y&dVPPzJ(6ϭ)K$bykwx˕lu_nx*@ sz#ǜ5j}\u?v m%DsxѷsD*䔲NJ~]E߾U?rV>˓RBaΜDla\ã$X'mkJZljIS^x)ijuD5.2[ڇHC)s RcNWDOrz8auN g׉5W?xu@'cרxZvexqp2Wn'uwΔSu Úh,<-nqHW2&2Hi0/tPytث1*X{\(1%&!~`ռNQNxG  5(ˢo&vGW;%jɽ%$B +ƭu `dϸHsW'-qFfi gΪUaO pp~Ƹ*͏UU.8o N^pzXatQ};xԝGvk4:xns(<P4z~W5W!r*EPV/#Ql;!#C, n; 诘Do 1kJ͇!er #OU- A;r:dND$Q^;aKwWQNADd5tO&9m t{^w4ζř^SC!dRQ;@A#BRa,WXn^ 悂CatI}p/p(HU@bh-Q<www ݃wBp'Cpw7̙眙;s~wwuUuz׻t/hs/-@ l!%@iŁ uWhW=eE5t >yXpN9 ıȮALoBvhBNًvBp+f4 _ *ʥP D2Meł.]6.p@df6BƔ ]?V[[F4M!keR)9Id%R5\;;{#7lOm(޺?֋pF jb{|ᘇ@՗-[ Y8Zf)=Gּl7&1~ɮQ+_JQ E.{ޏtE;Rߍ'%u:E-#9M:J|V:څ}+dJm/ ܴ$SԷK?*?9 ( $;ߗ>]2ݏĹw+ Ȋ~f >J Rn(Ԭ-mY9?9=3}"m'^i/ޑIiqn'lxlqyv(O.F)BG\N>뗶ω+zNe-m5WmMOTeG!i7#F̫U.,bk9;V)z%ɼEQRضd''bA;BrXIBwN3{V`])+YqJJ4ʯm9?_Son:K1A_!aK6˾R|8ČQoGt|eߩj< -jQ~\_$SDvgv[)cLe0vL^p]dInmQ}ݢs07ZlRsp^ jE &;q/jBqugbx%9ca1h:* 3wpr^^kX,7cM<(Q3Z,5c?T󌘡ŀd.p>ssݩ%bLmEԞt}e/w*zt -^Kr:ovẔMA`W O9OaM˷F,\rDSnu IE=h;Hwi>i1_|>꿆\{4ήM4dY%O.YOPEf6(Asaռz\}.D^5J'%/8]aCsXm:6n.Ik9襊 cvnt.~q}S QC_IyW>[Oo9=y|IKqE,l9Y-ϞD{' Sk$BL)_uߗc8ec󙕇kw'g|{!)5^l 7hsjiwp$rFymCS0BUBYh_-IdP;yv* X.JSdTa%] =vżT"/@1%4zYz9w6c9xOdC\_WSe1Ɉq/h(SdS1~6t69`Q{\`DVwWtm,`7xA]A?H<o@bRyfAiw4O>#YmKb4j Xw?b׹]旟^ nfq0dH [M,by["qkzpg^xpY3Nj᫐Ԃ һ4gxmܱDdߞL /jkyK|5P %ꗊqAt.Z(ǰfrxtW)>~#m7q!#Z/K&<`i8l Sůp0!Af4P^8 ֶHRͥܤo:{OHMuRpO??lY%d/{RiT$ ?3gX- ^0E*ιi9zno=$}]mxX`` Y`ga=>X9Yi cw0k.%9͑5jԒҟqdԫ3wOPh>A2iӻ침_O5N֎y)kB,`Cd)h"kp8|nd=FOɘIv NveϳJY ʗEl ϗ%1z9K6ʻ~;ea#gOH M@mϑA\Y͟5I&%D>!i %;Wx/..ƩҞGέ٪ Bf\3~QQQD%솙]!0(h-#sN=0yzб }B K'" Mw',r0X:x+ !XgqpĻk1sZԄJ >Qj/ݪ0ۈX'Xڃϛ|wYrQvfϦ`ҎN2+K:dչlؐ(nxsv:>Yێоm/-J.I#Dso[M_-Y3 +`I|cmv:Z Y=.S# Yݬ:T,0@1{旑,IFBoTB4+('\ ;KN#d"d*~ۼw] ڰܻԭ\~`0A{Q= Npϓ!R;wK_QD}ΨB.v hu?Ajn'@Hs3*>3dGhzX.r^aP"͆=` Mћ A!!*Rcu{+ج'@1m 0nZTk#9JYcb.Zx :Rod,+UIK>#}P0* ~ 5|X(8i g} A3*qnIns=b! WW1‡Lf"'{@5R*$B)\4ER& A8:(JҳEN^Yi;;K%@2a$NxPHJ=S j?+vgUv='CHbHs!>"y<]aMX;cmyrwKn0DScOSmN+ӯ3{ii'OږF6H๐mF؝c] z+N87!q.9+HUMixOj ]{e3r@ ,:6 Ѿ4= ir郠yTsX2brsS}~8Sd˝\92ޚR4|ػCB@~Lf8OQ.h{ p$_R"+ ع O &Փ:[m9p~]/`´Iݷ`woxE݉RVR+,`_ ODDțH.䲦Wee6#*Q"fWEm<@xa6@Կ Cװn(>Y-C=HMNdY 6gM UAv#]xXߥ . gq\u%΢:Yp.FM,"wod DH4.ȆDZI,9~0YYj_2fԫ#F}vFHi+Ms mLE8yx:BQMsi\d81I5ķ吉v}QFdvCL9zFlBgnLAm05[ʇC6 .4OtH͈zr~>һҦXjHN6%ڂB *f-7#`匔䙔:"|PoķE9V 0w*ZZ-0wѭ3\DtAI%,&f9i"ghr{,!(_ `7(OZ+͑ɌLMM :C v|(Ga ` \0oEL8^Q!HDv;g"n\1,`$˔mzAN"@ю- 5))f_Pכ(&$46X yCmC%Yv Ab6_]HNXk]t ^@(S\co}k&Ȉ?E>9q^T#×Q|`O%%&ieKԔ1QӭGT):c.߹wὴl I`;KBJ?lcL >l<[|_R(g9?Y9਎JP7W@GN]Obo) VJl}o0{!(LyҲ 2o_r Ms ;༌|C:-ڦF?M,fC<u ¿LQQQs^f}<9e`3g1OMkAFʒ$_1R-}}xS6j}T2kR|%Tr<ԫÅ~gק $ =UP4(dZ:SXmS]-ӴE)$ӯOv/~P5hlul7fY/nW@ߴу @wlʁT{>'  ǂ>S+%%b:% $ 01$@բ,yzG` !ߢErhnzTTT(+Y賎FUCU>; DHQ.:0*2;qC _޶rᄨyl:W 4s !=5okkA4z;,E$zͿcHtim @XW@ 4zm% FKj}S ~).j%c]ҩhHÁe|{b:#QJ'{prb D|2Օ\,E x cwWiGv#]O3l+!-JV ,':'FZO>6ylw/;a/G\*ls#ȃ t֗E p9;Rrz )٠oPܚ\ XށL9hՋUt>WlO:SJp ޡGW(vm)h=Y] \XzVpSڠ'[twro- u99.VnęL*-FOlɒf8״n8=U|)ʞ]|͌:?Iuoǯ_ a6:;[; ~ͣ'}7m QU/,#/2I.A]}fp?S/M}k8#ApYZnvL_զ!SzCI}ikWwtu!6XtJE$g"q߭L3 }pxx),ބ.^%,"fP:zgk-s Ttu(ٿ93 oZ nݞDJ*:Q\𕞹̀2n$>۷? >Cxkp7U ?3U,/K @v,#|zFבj4z6&;uIDFt͝< VGػ~HKEwk×Wo j\13j&t$94vs"\,؎TWf@RF@G*dK]47<$GWQ$|*I}z|?<:0تߠC\pw5Z eT ]97CvW|"EYMq8ULMJQڲޢ##e*Ʃs6fSb5˴S>G:ڮ*Tu3F<$F3+-fj_T\E?<TY(^5}\J"q`=A V+m)UJU(U>ܮŌ1iz5$튋_ER"醗aRdǘ\yܪ+ 󡪞4oռɩ)YEjD+5{iDNNɷ|PRAD(MKO^*mO1ʇmϹ*hJcz.c@]q?3uP!7K:9" `rhfnpdd8$^L3 "ݤaf4Zg}'D~Y'uBӵחv4Ɋm}&ܸZj%1XHW^:6uX fUTƜ{1Lwd~;d :?66PƚL|sG:|P*ȊS`w-80`ڈC6̛fIC<&r^SSCvUHzZER?4HJvvk䛚3I ذ,zUbp`^pdE&WݫڧސJ[Pcɢz{Sӗ2 {X@M ,YUǓn {4 }"ߔѽ[5+!0=E?pd&:90K_.,1Z܆X}L7W\|=Eco^oVm4.'%C2!Q"= 3"7WapXƕhc0_UCq=H#s\a9U๪uqc03)o_:C/H@I[6 0<4V^bDÞyT#-C 3t<Rw~"P(v)Ot{hGUDEMie\b<2ԠKle G>LB,|TB5EZ\gi,FA@֌1A˘&؉/6 `~hKG UCŅ{(D'M2.nMo{\yiC ":;,;$N VH !Nr#X |%RwT{, 4lR՛R@7=TDʃ/ ~ši_͆m ~_eƎA5A}89䭨?֪Gw @‰O09Bcejxz!P٨5GfFAfn{3VQDh #VCoC+9w]ņp4ra?u3/d[\i?S^x33HNLK[O:Pј)J#3Č^XC=c1zg";ߘE?[ X?$<)2ni21Bor=|pʽA>ryvs{ta\kad_\zBk{5)9i=c[q]O~my">|r+1O =q]+"5 Jtxg-?)@ɍ[|8at1ZW3|K67۫}Fpd/n=LY9!=IE]ʃ,n#uhY&nooO| X鹅Qnt$C.-#:.̖p :7@~e*gWpf#AZA}XjrZnޒe9LY!cbo SO -q"^ syXj4,^0P. Ý kP|}ڻ"0%q#dް7;8gOk.shi'5z}\ hd6]<0$n?L<`Z}`8T  C׿9Yst`ꑶف6mz2;4:QwѸrhP}KԖ(* kXLYE( 6TGQ6=¾]x3 2ҫQ >0dokm7 JqE=}#kDqwZG.ԣ(7@Aa=GDZF@FL~W"!:a5 }_יB|vf@#*C21psC(]Ը3wL>xԉ!ڡc40Uh%0a+nML24̓!9Mr4%u<=64U /IUcK-s2?z`V%53nEX5I]+%e"$gaJ5znX!n0fϢv: lԣ "Q?JˋĄf$Yl}*O1~*iW-n0t+{6ﶾlލ3]Jf/8Yɾלc]L]4V' bXzb_@Mǂ7Zv8Huj/P VW, fWTX#)?9|ql}'SrΐKw s9/o}9ShO1冷Lp\z26 c eomZQjglѤ5[qQqc+HN$!#qsSʯE@@SX%}HP#LEf>Z6ɉpQ)Zv!fꉉ!H q'9N]bӍwbTP9sǯy}6vLI:alsoti|0 Yp],?H}+X'ÉH#7Y8 i:8Jvxx9_A-5Q=5u_۴U|6ȏY$҆_Pօ&XS7QE[8śq5ңY@ S(D-y&CR'22kuF O#,mt&PxJ]顯oELCτWJJyqy PS Np*r;3d*sؿ?`;MuCnu *kim o zD\ĨbSr3<%HȎp`L1__jkz| b;/CPE"#H~RM-x5BNFXj3Է}eݗB8ϭڃ 1W#8ADSeAN,H?x+WEjLM܋]` =+AX?.jd@3p&nu Byj5n$v#E/X7ԢW< bexm6-mx UT6_ ]$fUJUiPQUwo3\C>.>/D&w3v~LĄ*`@ y֕ȹKPQ#}MforߗE3'YoZ(du 'J⿥oFfidfy)܏U}.Z|N,ڲct|AYҒJaU|-5[5 3w`kb}u=\.{uȣ 8̯Mc>.=Z]toqw|li,űvvd5J4{4:Ur_4Q#/dՏG9_J`no9KIävt+K3sXiQL[ -U&d7\GE EHx,̘Hk}]AN-H%AAwO"n\vϚ {et HJlN1 )>''m Q#m ;/7a{V9n+_nk,V̕oI7\) g/~OzPtoDQhH+G?!›dpIc\/,8m79?T+.6r?XypȞ)">?ߤl!_3j䘷3;M.Ӂm^>Py8[l 6t$^7=t@%{ᇅouK =9$>.x "Wl@#\#U4M,G~Z=ͺFO OMLWU;ef,Pߍٵ%a;b1=R5N~_\Զ r+3Тkj{d1RQGRjv1}P?A˱_x+Sݞ6bT+4q= + ™~YOg NEX IY&GH,B>(J  煳% / UQRrIuXW]xdD_XB')KftV)̮O:7¼aakXQj#{bЯ뛛5AQu7%b$ZD{5 iP.97REROIꩋ?pk>uIoq2A:G~i΀ 2h9q^^si' A`=뀱jacӓ+8AyN+%6|Ahh;TTU1L.Y6u[mp~:pOM҇3Egx c iQt^ٯ (/-.KW !|2&9KaULBœ2lq`u*"P9 :`JI96җ%|00ԋc 2pۓt\\*撟r̻F?#ARoQ(*F~'Q\]`L])#I"zZ1-A7)gWސN3~ #< 3g.&$,ZX./*^qEBLmb@R( A4'FVH9jAw!=KTb;}Pd/AmQF/G>xO>ޢYbEDjR,(YIdAG^t v,IU#npg:ꞛ+=Ggl iS5b f۳Fx5!ʧ@o={\Ԭ6橉'Mp-Q;YoUTELy/?կvm6!l6xuPǭ-Ub #TOxM3"uTw`E+%*&6bg-vc`LBN*Z~@ [iߟ=Fݫ칏xZK/ъѕ9kM}-tԶYy S|s,԰ׇmVB"T(4Ngi]5Mr\\o|s'9#_ٻw8 muJ"Cy%fRt*XzP39Wqc==yy(nf,HbUhR4uo{輦nυn1=lzTIׇ{PCu$QVvijp6_W nh%` dMu:J.B\Z[dx48ԙUvk:Q.]_pݝFNc!fwR.HaDWs\ѱVp}Ԩ=ў?YϊK@k2:.RINr!k2n7bEIKZ>6wu&J9!Ȗѧß?'^YtKo錌#F{mL:F2_(,$$$Jl^>9H!Eb ïM 3no-J1 ߭/zҖI:{oBflR[GOHj0V9_;Hvw-Kaَugap_:E_P=lWiWe!C Y"`dߦBu,RP!C%H"ƞe# Q5J̣\Ϲ9wUc<?)ebrs3_CG;~\-9S8u7 OĶEvLE߿B ;Wtb>th(FrAw$wѠvRBldﶧ5w;)Dķnf8$ ?J0ADu+GG'TSR+s}e4| 2W/:4=40Djx]el?5BDo?Tt@vQM,1 y:n%25U!E1C~,KIRph2xuPS,xH x[uP5& S;C΀C3@l|إuJƝ˄9@r/ O(/EfF3l&QyuH$=AfԬ:{u,pgX*u|R=iz[͉Jg~!WEǭʗm4x2amo*4{5ӜmUܝkWD g^;Ď>mkp@vKVS!5O 7LJ*Mݲ1;ʶ򲼋?=A\ RR9Uj{&&^F?dX15Ɠ4<! ǶgC/xWi{@R7,MC3DKFEn k64-0'0ro4wszU3/DS! E_y&3#Z;Reky0BVЖIg=r9]I<* V/n-Q_ k#$"wdM bWȆO'px94zz[~>`&P4[HiO}b*QDU~-Wׁh &V֖\/n3Qڕx u-21&p({+(ZR64x4LB(Ou^uB d݁멐dȘbTd͡фȁ,.ERdW6,ŸZTlP+'#JL(޲0! _GhDj#`ǦSݜ` ~;TypYzUPP\w|8ϺW: ɤ(EQP(+HkmC ^eP)}{{U@ 4qE}kM Vޯ#{iia{gڌ*S m*eQGun&l w,y> f1)*TVZO@Vd 3%6@|,H3۲-a ^(&u P:j"_#5c-x􎆟aDpτ^$\W6S/|^~>L 9)tu`!+Pɪ f5gppC"w)~;fb?Xjpsr\Y-W:SliZz b(RZQn֍=ʓeNLL]jG MSX_s|4C7Dv_k %N' l fGw\B]7ŵ'mzrH6.3W)vPcpmVZ ]Jofx4%sQ q nxy,XJ'oemU6|1֨kԿPKfa)ړmPKy.F3angular-1.3.9/docs/img/guide/simple_scope_final.png<{ct%Aul۶ubc&mضI&LlOpbΗ~ϟ^ݫ{Uv=O(%id000dYD ד= 99 ‡,@Lߙ>$ǃK FG\ F{>Xüj@#~4HI\X* pXz>u_~  CxŨM zwfU 94L 44t+ҽ⼜j[jyW?BzGD@Z ̧l@bHy(y~O+X 8}=v1%!C2[kVy+'u^ϽT©B+=mC{jgfc {C+!:::J}k52&!G۩ hk7WI C$T"#8XRT_'9rNiG[WD7eL![zfL@ ZSy|zGu")˟\SQ`,6~~'zg]x};heM>K-pNҤ/O܈Z"""QQdu U# >ךVBy=M~ \z~נ>K'!]+Qgkr5w~ z(f1oey>.X Wwɹsh|x^k~YP#-HקEN7+C๲Δ@8$Y\x>ܜl+=r{sHg%FIT4ƯRJ>lrw: T?[aqOr0>-H^]psl(.;Dŕ!uՠb:^djȰ'\t5AHh%ôL(7Cosx789cp@}C.43!BM܀G7vc'&!~Y/wàN] (X\ֿX>~};zm~\ae#] oact9Y򺯬\W= >c&kpׁs h]n{ OdFn/a¶Pdy".wmJeޘzU'[.UbLՠIa豎?axS-Xm(}6YY#=v8؇΁N kCVD>_Kv?(wu"[;RքaK:aU.B?g'qȕs[^վGJ>%-/G2K hحoߥmƒKЇajg|7귉>[ b o;Ah< Eߊ9%kMaLvzc=l%2`qVzc4/tΐ8ž5_-ZV(()-=M(kvS[-Ⱥwm WGi_#(Z*H{5_Y=>|8IҋH An8i5\S,u.d S NDhZDUuB 3by`}|Ю?*$r憢krZwVA&]`5+TЅq 7(04 P! 0%mǨ~ $]̷OyKT4 kXn}Ty9L-cgzNdIqq[ w\,t8aaL)|רDEzj^ AS%'Jbxk%:j_n, C-8@ nc n QI-a0C@z0&g%?jt"cwkfa:QGtuܾ*\h;WЩaxD X*bw+F?E59; X]Q nfmT`B+TC/B&̌% i&g'|{Jr= 'l#n MU D(Ϩ P&tP8\nH\[Aqc.#3 9#_ӟCk|&[K)Vg"NqE58V?*m8#i(bjRFNJeq@-2D@t97,'΋%4ƽgX2E {UnOQmL .n9XVd\4l:t %$6eǏE+!2_|B[mm'CnxzE #ӊ]7vmZ (9p#ݘ'e'<֑Fe7" H,0[S(e6*A#2韑991Zr=ӌtt#WϯWW E5t7^bVM_Hmy*|d#.R_kҳLDl.HopՆ @ .1+6:}BCH:=ϭ V>n-Oҫ|wc>܇rkW2e>4)D fH32UqJk/ _嶢kXS=;k=̺Gu;#p\.߿rTEsЩNW;@+Di24v"VƇ".Dx3 (R?kBGOR !h67 _mv[i +Q`%[#'XzjTS$^FSJzP \Ƕ_PPb0,)KWFH8'T#n0TQa OHQQktz ` vɚK,XA[,jA?0E{AJh,] 2j H6]mfKL #DlM$ QHJY'$k.lpXPǐ4ayΚ( S{1J*/^<%ZU،N_4sH0V Ztw/cBƳ.9XHV~EdwUOy]=*Φ-V.ʷ^A ,M ;n(6UnܼJ^&}OZ gU )Mh{ƕv)溰%^V4TJ?Ï@~c%lߙ]]9^="j$pNW+Br:X_1kZR {/w<(@yEl%!=Z6UeM*'+˰lÜ56*nre7pix z]bbp4!Gq%պ?fw7IC!RȁOu&%oD΢" 5`%6U$$XdV͈r{)R$[jd*p *l / Gzg@LS:Hd: FUDWxsJ+l`Ɇ }ӓ'9Hop;(vz'r4Wy_$q3e~|<RIq_ۚCfhn1lIr.gqwمމ ;E/x8r^AZAt)AᑞgFH S,e"l!apXHU!F@š8:ӝ_c6H‹ŗ4N#y4 -Q>~:K(eKډ6΃A ºd)h@Bh_[ [y] f$r`3Y UT/a1ٓQl[gY"dS'xbQ#Gն@ofڶfCw).;v[^:+9--*AC0Y,pi Srcw2hSYw7;5:QyK*! {- }l;F]6.s Joڴj2y1N|ia>K8l%o+9Y۞UwQm—1Xӓ%9Q)ELgUo&ʱiP5/uLVbа}X > `sPgg!cĹ)<86KZiBYA'II.0򑺉$&I'u!.|}Fѯ}uxG FG ]H$|H)#XPWRsQۻǟц^7EN#)EI}HS+Qlܙ[MD,<_3^ Ms{0")))x+7@*$, ~VNL%Ͽu?oL;Pa}g{X"g`ng24u/YV4OZqZկ&ޭVaáiPt ug}|&a.q}0VÝ \+o mz֞ \3fu "[,0T;BS?j4ӆМy怉` '?9N3^OQjNY,y[L눅5nђPP/\㮻dt1Qn k"0Ůȗ0=R$&D%%paABүI`*A7D Pv컗$} 5u w; ,NؖDc+t0f/i7R@ v{ߝÂO׻v~W{)7¯ga໌km$/h +%*U ".vBA݇nڧe+g*FY @UsiffBݹ˃sOq^⪺쌈,wR'aki⬾vTĤ M/H[5G e㏷Cjvp䆣e)˫ԌrŜ TŽєg̲۫A۩e ad4MmҾT z>e#0n..8Bċ< P~D_{y.I7:3M|39-QSP}!0A>1J;Y f O$# >(ew._:6^Y*er4~`$˳lGh ?:hPWb _|i~}<4LРx8/T.,i9kVo5FEEiijV H) pa3A˗)|}z jd~܃.6L4ۄڄܭՒݩnЃqXjhxZ8m_|q@$:pD.ʏ/)gcW_mkǰnYdUԵg_}C4Z/nl"{`:-,V30Nܺ7)]rĞL}{8=PMX*p4)TZIhUa˄f̽u8_Gϻ4# YxWf05dד󥦗&lҒnD)jNMrebߞGI.lĥ} t3/ѽ:2M'Jyq_bTz,4ljԞ1HGz{|8&E.Oj=G_gy5ٌDEK%w.Wcgp"47i쯧~Ty3ЎPJQS"B˖EZ\_xoo.'^5 QVèDt=MҾjR%&Gs. I <3sHVzSTۢ~͹z]ԳM47{xlxUv+ã"is++{XHf"XbJ,bܾ]aa8uKԵ?Z!9W"^XN9(g s" U'Ubg;Ys/i >ayf8To"F}tc(Hv bQ)9djd%55nHp-[Kx2ko%/!(M)M1𠍰v%}7E^T"EHh9͔Po=3j4HIOG!SDixSyנsgRkD k]:6J`-5a.dX nx-2#  Йu g6J?I jNQ){s.RfkwArpEXJPԣo4٥DOP}MTa q:Zg6hďغ&jfוWU\zO7.F/#ͯIn& Qη#C1$j]ts9ZK 10q Lݥ 81zǃT #him%ÈaÄe46lAZ5 `/ƜʞvYvyF[=UQUIx{M'O`Ěѣnc|`{ϜZ+3_Il_k'.o5$F} ʠˮ*ugZOW+NZG"F\ ##Μ&h}^I;{#]f% ?&2y%:͘kmQg@pya$$/ ֭9){>mWhhoAW08 m$E+1T.e\sñaKpFg;DqS52`Pzc}  Vت0n#azE`ThTԈSJ H%M,dysG/05(h#MV  άO7A }湝v.qqP 0ee*]wvB?0I@}4?uDAzۿM=p$h4on:P HL Q,.kVSH,U.F@n/yV|`,@6nգnl}ܢSOk@ÎXL`\bHd!|]e ccBU(Ɣ2'zxkWGQ%TZXT*I"_5hrj.jןSOۃ3m~TrA5lhxnFcmwJ!zbT€|vh&yAt)(7(f~[|zmRvϚXh,0 a}fΞh č5P{7G+:տw$oʙqqN|װ$D),N  nH^%1~CjL{5u2X>lΘl(a 8n=Y d(ā<\@ D\XӥȨGJ>u+c9vy.zxg~_4_bv!b3BvX0uTɹb(EF,O-,\tE&9&M-GMNDu>LP(|]%k흍|²XbR]n \<.7w0ٮQР8gVV}˹B1{Q0YIIG]7^l2l䬌BrP7wW.7w*sIR)?]&*@"~ 1Rv(U?/MNkX٤cD8>EuRDL$Lκ^j(Iquu7dztAY2G3Ż5u=Lfb}eڲ<^siРe~B'#xYaJ#=Z lv?fTBZ^@4oOOR Rh 8֒4`^us$z[j rpa/_bJX{ma5κ+qA RS"y4/zRB¸Ūݿک=r5oT}x\c=AG;AQ[ Ǐvӛ݂Xp :VIGfU_ҝ3hxb&PET n*T4xޗ'f %2 +) %op[_7 Ͽ-?s fH |EdΤy]-WM -kDI)xE{;N^6.E)Gq#:6dф r2}h5w~GĬ(Jw7 :<2-T %PwZ|l0K)L%P'4i2yFJ=7C_S칲+y ғi2l(JkҜ1~%@ZvQ}ܫw@V2OOaG<>5@_7$AXii܅@04F s;LAM5Rl5i1E0Xt[Ru\JAEp sLiq> %qYwAirsߢᵠ*hM$w+2w` u.fPӣ[Bц,@lL[?e?|#4ds,%)zBeQc[1 9M̉e-ҿ7Z[jd, SÇtd{?q? + Wf>"JNwQzzy4 pKiCJ z2?'./u~uݝ;C;8 mm_GM8abق$CGRU nC^$CJ+q3`иBnlp'm!Xcr\Bn-SSS wvD(|hJTZ A 7̴p oꔅE7> *%op"/XP*I1(Ֆ&jG5Jtz@NS[pP,cHJ'(Q],mНH l}k΃H+Ǝr໋bg ʯ_jݴ?͊8RY^,CTY y eQl̋$n9(Y*P\ttD-+RU ^?ޕs;Y[؈htFG~Sx{e%yw[Jqo=wEE&HxIc" B944޻>&ןHLoᏡ!$Y(LX &K+}Y9̌>Q놱T]QttBay9D*|`6­|y3-_TP̞o A*sG'mXDZȴ}bΒDN94*)jn-꼪ŨZyfhTR. jA&fPzZ7y [a'fP?.jm]o7WlpIǸY73 "ʕFkL38 v' 9%& Ȩ$hBbZy)25bEcxD5~@3YS1@ Ѽm0F2NO!3)wF+GLȽ;??zކ,.$ "^FHI6*z.̃CtW韺eLMt-pk]AUݏgpv828 Vfb/iZm`";hD.-DydGַ}w}`4B/mЎ=Xq (Gg^ 2`9GDBv)q-4,m˽Cʣ˔WMVկ),&.\q_ljZR}:L+ĬJ{?ҷ03,w*}@EL0\ʛO˼uK3jʘb+0 C` -2KMظ6B).J}%25 m[nL7piKDU^ Eq_6De`g_6@M@ ^}FOCe1}sR1 gèl#}Rf&=a*{dFMY3Wd Kii S{ {l|Ñ i jܱj_8&>c7^QPJm |#M2xYxjTづozE`,z4MR 160h# WE X}hD͝eӄ~*hA6t1JQx,t(tfD(͐x \g Dh0HU a 63dy*3TcO1Ε~mQīS˃)?+e&`0 k*ШPdڑ{L3edج 5=v?)Xhr; 0OvbYC&zxS[^d؇5:c`Fyϡ;e58qUtҾ]{YDpʗ}]ƞ15zY4PLR|)D1N:(XUw;&*0 [7H :(-j߾2 xF$qy!}:hNG$cpy=oݥX*P* bLhbPfqE]AZ+!Rs]$uʎx__%di}SeC_I7:oP=.O,:Y+ݾdX]9 | /tڦ׉c<,5 O! .s.bgoMpfC%pX lJ}z]M6#`*eg|]"I|n `^|.ݰ֝rf }ĐS!m1KɎ 2LX{w𽕿W lVp3^sH;>X4y7c1I/?t&UECc1g땸sUD-kWGH0fQTxNS{Tþj4#M73"}]#@ޗEOc60޵ aصwdj_8?V\<%=e05Xo+e,%~µ9Jfu>vs7nID%>#6+<<'Qj_{r33҅]q#p`=5NVPAB ^rrqubPwtu(XA6"CQQГaX@u:ʀ~\.NC-X߇];waᄑ|ÇiARR2P.`Z`3шFD"Scv`}زm+/Dq1N(^tE|]6Ux% )"8I׏OaC%);X"֘:1吜[kKcbh1ѦMy{>Y k6EDJ>SRI1_`m(MCע^-Wyyy01Gc"`2о/>̲|Ձ |$\j?ʅT4 F>0k~`|s U:~D9쀧j5+p*#[Ikehl$icJP !ǎg0ؠ:0!+%KsDkϞ=ٽ;vp$&CuQ^mJTQ+Lf KF13i& W=ӱӅBڵ ;ogmwsaG5PV-NիVZ-TX߃b B{U*r wL =)ӽ|,ݏ̞V͉+|]#*A5*QLC:u l@u9l@Ŵ`H֨'жsOtTL"DNbb֬y~_*(7MQaBj(* Dq. .P61>T ##} 6o7K~q)+ď&,3K,;VNcߪU+ kwhO|1t?_;}G n '/cFMߋ֭]ٖ ,)!dF_>whrJQ8'+4J#/);q\ei6~Uݪɚ5kW_cM\㖐+{]}zBBj`dOD(FGj'i%\}dק/w3fc -Z`Cv0a˚AӔ^7*_|-[1V =z۶m+؀r򞑑Q&ʆ5zE7p2eu&q& Xof{! L(|ONF޽qcDuD&6D GALXb8t@5Qj~uyB~ɝd0Bv~W@4$+OTX}/ߖo\?:F``}ѰayY&O4GT'7I)}}ff&O_A"iiiܥ@~dĽuQj֬'3)PH߹S7آ駈R¡-ZLa.\-__D,d7$;}]S.޻ЩCgDS7/䦚D9'__b|aO2>0DszxZ:"YBy]~>hF` Mru.o1xP>]fdKaǽ.,-׍L=N!}{^{vú /YfiMhqq N."gDhrҥK1|n%=tPԫWkdbwrϏ)(p:o1C6QP8X]qCfHFi ,?ڈQ-XɌݸ n IXbD#~^7^LPh@pBC =7orZtVrtؼv6f4k5FG:aCѴYcDǡCyf[+W޽{ѴiSr-wBi&N Q@H%M?dJ+ Ѐ6;F6MWr+- .xW1}tt3~ԘT#L\i4sKⷦf51W 4@}8.<-$}5(%sp< 3~l=>2Gr18 TEN d8۷oHy]J.5 *(&")vxT8EH""܇̯]]. &`y?! SO= 2[wQd#uv ?WA\Nѣiz s$-W&Z0-xZ'̣ ܺQTT?Iskώ/ԫJl/SL¡3ga(NկjժᦛnBϞ=U)P]Ɂn]Cx'$^arЪICDmμ>5,XwmĖ /\<>D]Ct`%EQ,] жi]DYNM`HDôع|@RDxvre$k RTX|Z/#}ZV>u|Gow~D\lv=jLOL{ F̈́CC<^M䏽uߦӌf?=pz]1~]hZXBZ^}:+>mO܅1cاaˎP )(=7w \wu+_u}QxgS@:O=Wq֡U^qI{T^G ?܉#G=E(FQ[ <3d$gؐX {MTc> T]>Q_Ŏ1a8z}`4#nђ=Р?>|^ G~d};i:Tv6qo⅏Ֆ`Whٿ E,mnK`\g(6fc7Ѵ)XkO}5,GiX"ty<^K'mơ,ppp45m篍DAgLzg>ٶ@<`O4 hۉkFҦxauDL+#<x8fr)i֯]y g~z"S??׮yx5 #'WhyO|u-0C\i b꺜4W1A|t9>|RXW"$$g@^ xQңEt${kEPQnJov8sERJC+ Ohhǒc!ڬޛ1T wnנyHOѨw\\õh|`|]Gu!׉to𺐴|3{a-7tCTТSzr*9M@ܵTl!1BX%/ʣYG*7/aѶTpſ6 ^}A9c&O_ðh:t7-&AȌHZ։Ưu~`̶.W<3mc.iUR'뻵JN_NY"$Gҕ2R|ǃsGF x8,ڥZ2 ^cԤgȴg`dRȫtIԒH>s]Uhh%<@) 8Sxj:E6TЛREg[:qDkɾ\d[W% x]xߺ$cGpL{~޼^2 '|r"+DcH ֥ǘ&w/G,x˗/ݻwPRY sN|˽ĈYu(G\c̘ࠩԁ:#]ХX\M܈K]r5O^ʹhvyOv`c16i/'Ӟ:vš~&Sܤӱ|7.{5U>H@gG+YC[|"Z1z_eJ[wGĞdttn¡Z֬LۘQVTSͣt ̪~N8Ϙs켘O/p{TĴj<󴍕Z( {.mGp#ON\f"Y0{{mQ!]I):!Ŗ,%?kOtэ \?ZBv}9-mBJ)S3n4QQRG@4}5iڊt ?m6x7l -//MB-UCW$"#ߪƹ@(@.o;n I?rY +Eo5&hsrҙ2J~9cypj5O2WOe;|d$K߃U;nPr&oA_7a>y.~-y5] '(!K'䙷p PO8wLnr޺D<@5.O|u;3I˪ OP:>2C[!3@oڒx(r{/eO`$ėH kvpm6V|ԫWORZv츹,T†Q7o|Q+>r(i+Кm/.O.#@db0yذCr>ztGI dhLfmPfa7 W'v X*i0au#GX $( NGhX2/jH;{N{X bQX87,^efGjY~&V}NgF~ ߿_[ȬOֳQLC zj_hzV^AfK +&0{\yd4}r5i=Jv–jN_Kx(瞟*ZU 0==8N8|2ѱըm9HSx Fc\ Td35 @_LLkL%Ǧ% Ї?Ӊ6u~/JLV{dqriIUvF>,~ӏq" ^S^r򥝅1?%cQUÈ[YF 7=3;HJ_. dXmޘ'ɡJ p}pCР{ VԗFCCpjԪ+ӱlݟG=l {a ='aȽ_uFӝٜT`TGOht$F8V |4+60J7w24yW3b.>gZK7>ٳgpׯ_8$믿NDy_vn԰, kZJe[cY*KƵ %+RX=^Iùc}Z/eO,7<[;+XRV,x7˺{5=dbndX+lJKFG7cUL[2""I39ݞQqlwbu3 UDl+zGz%:o=*qel\+J/Dy^<|#zc"~ :B>$'^ϢEo}in\ދ< t\8X8PT~dm4jLvG*hu8a#pyi4ubc>ZK=N&;SGQssZTNN=Yv3'5$_j랄aOtٓfU,IWqalx*l*귥UM/4wxGQ!~ʪ2LaV|\Heۀ[GgDž\9v"[1s"[wnaGHl㩰prteJǨs.ugu'u?(O f|HN hԠ)d'K(bQN8;MKW {=O׆y]dCh]}{̣QS.aDNxl*?ܗf$I(Q˙2v `ɳ!v zꢃt1Dj ڍgqyʇ1kYWd.=MJ Y* 5Fh+u}t(m5Xpg$3v*1fa˩y1mH.,y{P ݎ2f w.;q'8\A>R'Y^t _rGݷr)sOE:]u[A#G wÖ CMim-L;!:tI͇b&M3kq۾Iӕe3?rDv&O4'[$m{ͦec9P.pQ^{a^U :JΝi޼f[`iI~ǎ|粑d%С+>/$u27.e_HRYMK3`.FJλohxbBf΃#Ȳ@Myc?U^2(=_})75;<]tRt=?J`x=f<7 c^>D9--̡[T)~&\99~sv4SeR=*gH!qcJʦ{~ϖܹN!r#9!˗1i3R`j:4/v|SIVc@}5fC[#?YgEA 7`!2հj4PQMҮbCk9^y$I1aƵh_$DT!b^ba2d/O`;:T̛7)43NNd9U)$ʽx"UViӦ5u\T#( G=;7+? [ fR6a}콽GRΎ G8ȆϾ°6?q6<=/,k {yV|ڝӢ'5c) Wҩ߶J>q6}Ջeh@oLTG hjl fBվx*T mevNY/Qg=wzw!6Acnq"9G89b~=i|3C]:wڮ||:5? O$lg&K|yJ1zu/I"C9kp|1*1bK d+:Yl ),h5DT`8h30P:ːhJϹ96f2];64)X DF8A`Rxx_}Imh;3~?[ѳwO FcI0n%R$ӟQRR7oޔd!EPݻwño@ؓF)@xY*K䲦+-RU5幾-n !α#WhԲ7t>oX?{4#rZ돬_uHϚzoZ~^tlwR\D]3 ( h-_Ӭi3dxROb| *ZuE%u?t*Tȷ+0ʌ^Y+NoAR6L|rc>psq >ц L&3\bUM E9$ɒTCzحylbhW>XH57Ye[]+Fۭnp סRⰈ1p7W>J˽Tp>TlmԨ]mjutڹ%"xb-C$۵gڵk2t͙3,еqNǹ#s.9,RYøORAH/GD  xXǀE+([„}L֑.*cXuOnN}+ҴIMR)?OxegLnS6{;?ɏ˃7]*Ln z8jRO;=T᱌v}ׁGz𣽅Ro? b~: vk!| 0dABa/ ppd3.ȮEurl-e-Q3}!|*ݷEhY;<&|Ğоs!+@ 9Yl5׎f/HȐ^=ׯ_,еqKs,["# h /8gtpݲ>e~/x[)_[~տӷ?M6BB1ɪ.LdJVgfa3l +6`}T뿿|zҥгۭ5bdB ;~U5\`(Q|O~PʾPb7Xxm̴dӘ+xr`>|o//9ڦMowo<:uL޽,Je~݁`N)Y+F+s"WQҎ?b $_μ 'wZ:z/C!?<@\Xny[p}ùSgIJUޟj'twRhRK:rq%9b2Q)6:~6mtE .F]-zmceVcGҥK2ȫVv'Y5fV80''!d4RuV&rr41Jp vܹ7.1ok(i*%OiU sHߊ_MEV""yݭ~x?r|hKE9'rNю%,K>ӮFQÊ8I ߊr덜MɥBhV?,Ƚ"c ZҤJX &(;_/6C©zix71%{c UQu,Lي\ ]+SI_܁h6W6RCT֨Ъ܌rR29~ 7_ȁ}Ў={RV-X0O B7ZU*,?*R.K)ՏVe{}>bg`zN9.^EMx@$Ɇ'q'iu @-PQ枯<˷]vm,.^y0WעWyBTIrJ Wr ~9y; Ө>ܼ ]uG!bwS2gInw (Gph% ,lE% *G#[ZJљ(tl=E3+ǂD>JEH(|4.}*Jsap{?pY5oSB)a9yiԩq1.mb,UH~Bmө$!$ʓ[ Sj ҤeW (,Pʎz(mVsEٽ?ҳ8T YI-}H sj"< rQ|۱l<'_&sdG ;M's+ּ4uG w0}ndTө^I_+?rʗ)$=hyO"9lX3`FYBuZM+fW@:̱)qВ|M˖q.\Zblɾ>'v}yDѷ[ _ ip XEU{6Xr|H>4/bl,楟q\<'C,]^Ҧzzǖg /}B&Og\_;d&a,%/ʤϳC.9BģmZᆹd>3(b8_΁v8\;/{f(R̸<9dAD0*) >W,vumtK_FG_zRr9{8Bµ{$CIt&>ɝILN"=-Mc2Vr6@%?4w)j,ZYD~xZr8q8}P8 tW( >E%/2yR>BNtP7+4|:ÖVDR8Rq.C$S u*=!=."~9k}>5:Av`ƒu➂̻YNMyqOHp6AWQL' AZUvBeC)A'2ҍ8BfUɼ[ ( FJr d) Ta̱9ۦ,GT#ԋP1TZ+Ow&m6JLF$ "D 9S;X;83*y>JӮx15obro}2NFcֻ2 bDVYw<5n!D 0k-N%YiTXTl8uk C%P% ;X9־='bxO"MdX>ATxfai#+SDWۡC)'#C<'8ܷK^}2~>0g$ukB ?r"wDB:w1q=Ø>2[jPBZ'_gJi&g:+W~N廙ƈݙw A5i\߮ȌS%DpsahXiToϜp6tunrh6ҧ;Dm"`)ݻ}t[6`@ls);hh"D`QU$.!A4 >u6K~ƎΘc(b"Jf828e/w#v f :wD,Vسᚓ+6Y%c/:Ej5|.d,@7jCULTBQ 0]|"n :p V#{[UوJ>JLx(V\b8V5uv J} )ڭkD?f(YԔ)x3F$HGцK^f% t,fy^w??luBR///|T*TԆU ~:#i6ר18S{b5I^a\oLLv8SBQG7pt-L<|%+B.iRQɾ s=,'}C6:?ܙswTٚoO F]9JTMX0u@h`ܧ:*{yd#G Ј{[Jh7r4W[n]KفzØuE,&R={buT W-iyj3bj@|j!s]EzDLj#]ATV[hP$C O7Dh`XI~U֭$"&E%U8pv!/n% El3 Ĥع+^WA}(J?jc'?,s*Tc)1;ՠS{'靇9g]g^K \\N=DZD|/&"U,]/݇՞'6ECv%Z˷x}HP+ċs?y`_yZ5yF wC~+璱puU}}Q1oŰэG,rԑw.W=3)wr6-T" t<5Q)i꒹$sgц4 `hfX.AӊmٹnMfѼR i?fَx` e]$3s|sSѰE޴ݤxJkJ-Mլ]$q}zUWrV8$n0 –);kYd o>K_n116:9Pk4U X >_q6-x42ל`Ͷn?_a8U`2Ҵ';ޢm3&c&^+R=hb|Y")@pMf= -[RM=Su;n34 Hy^v\9F]<y>V3; zgqbz9T޹/zgu]K5g(!H^%ฝ,8i?<4;Nr6+I_IFb˜Nc%.kCkȤXjtW2Ge`=b^$IUUiں9?_@[[Y5M)j)~jΦcTqĬ!Df{6X>A5}l( ~$ʼh NJ[I{Ǫ1Y^B,Xb1"Caf%U> 8rv(6OI O3۶#m]B m 8fGjѸ%n`nv.f`/rp3nn.Êpr E(VnP'Ў"uHShFü:4vx muxu >]BǑFs!YIiZ7"GP%o[ ]Ѯm$XE,S~G6M[~@u-5Ƣ4Ppԏ$&&ojU+?{O%VZG &PZvZb kye=R+7 s &‚9 "))sSɩډkXiE\)įBQJ7槍5P7{h:¤wPE,BcWɱ3T+ -~5 `Nقˣ-|yW3]ㇷ?&5)@(O>1ATTFťõ"k#:%<2Y8 D{zcA&O9vI8W*ʋSix%֭F-V˽;l[%@8=$9Eyjf8 D!TPU2!58>/>TOv\vb6}?@F,w~e/lFiZZt"gH[ ~QKuTh@mx{jqqY0A~_~%խGv嚬 ;wS69+ A2W[D.]Qa˓I|Y^}{F +VdРATT}PCnkԩSI$ǎ2Dҷiܸ1ڵt_ $ӢE oΕxĥ3 H8\7n; b0ǍFҢԅW SxTSzSNq?J!WA( a˰m @RDF1{AUȒV[kDR'v!zbk.x \ Ͽo-ZGͦ^:/+:$>Mz;'Mb"W!zu$5BIʲwނ6E{&MdP( IsaÆ38)2B EWgKWݺucd(jr_; w [YGq\1(ʙS(QӠB%#>mw {P9u"\mGK'E&k8Xʙ/%YMw@BmZω5{ _o;_zR/?P4:-jF6^3}h2SO}F74~E1s1^JsSXҟ$.:$FLTO$q.O>xk}IضE_%3pb7:4y\Ɂ71r{4PMS7~}8|o\!jmtOl 숿Ɠo0e=CUA._13mXצԌěֲ'ÿTgN}V/ڏO7-WӲdKvGsS2ѺKJՃD=?;ʪ/ϒݷ>՚ԃF4ZlElht*|V~y{0o. ~&7SdV|iر6 װ=i7 #,gfrj8;N^Æ55'T} ?3`G9!IXY22l&=RVIrs^&<Uh^j{j\Tb`P%߸:\3V2RPtX޺uK>,sss@tG!+@0\2rsqQ33:saŤ;Q;l֬ٿ 9Ѽ32 4 PS괠vɸt TNRt?3Xt)8w~ x7Hׯ/z/@{D\z1_]'QAQU(\]:w"bGpSsJdUP[ 8|>b0 B\THe#)jݢQdHUΤv*2~I.|i=0\SFp+JVL&;(Nɀ_tʫ.&vX@fJJm9f}4!; :11sԏGE%A<>pm6L}m͘g`!-1ɎWXEA}VUZv6D85ʕ`1QwT J]yLgl`Ē]8D[Dfy^t;ٸ'UkF轶{x „[aۚF1M6ܫ>+bk|l G%݉tk"OU<>FyaymI..:M?C= 7Q1TV _Mvj. 1 &qrH0tCsl:DExX\4Ӯ dz7=7OLy/n2rL,3~iM nJb̔t7tJe<—ދ'UTs>ȑx&%&AL??Js5$bb۶mEsfK3fpRۂq.]DxJXcvj H S͚髳Р̑I@_F?(jڳ*t|e#֨O6Y->~^bla RG-i#'ݽ7 Őp)FJp|dGDb݋yn{ e <f1&%pIcK-=k|Yγ{Y:f:=[nC0f=\k<<]#Z"e .>4fXR7?ĩK"(,'6kX`e^]f<z\p1Ucm=Hon|KMZr$k0L65L2lGI Vll}Gh, t[aw'2"JZq: 9Yܻgּ;pᖕG' gsKw34A>w`'n=TqDqP޵b D2@U}HI2L}q8z4lU N,_#-r\[8`ĘmFZK0l$g"0O1ؤ Үiƣ>|Fn!cw}R2ԢP]~,$2SR˛$uAw$|LdhJPV'q4+"fH P:4%{::< ZU#P8(337"Nr2F(2ų'6w.p^?n?lyn&&~:P1願fs-'E/C2>ɕnQtxFX`d"=KW9so[*_ĎfP7޸%^JЫ/ic 9@},|CBb#HIlF" ٩wh)ĬjS8) Tnm4G.&^Ҫ`/u5>&Ff Aˬ%<\ni6\1"nbZuf\G/׳T6vF6cV8*;t/+/NҎ(eO'%;y%Pג_CDˎ`Ty8}BѠm'JԶvv]8z?MHTjq_V1a\4N_e^![nZl>S̙Dw弿֍G6."^,V}(׽ ̘okyc֝4=JTƃŐJda^TΔ1Iv)274+a5s)Kb4f\ < Wk9{[ey>5YɑXSbȈN̫o0oH?mF~,Y  nU;X;~{tCrW3xy<$kIrH2.Kmp o)uu,^_Ylh"sN)a.ǣ $å\ʧŎlS+ܵI 0I{g4ƭtJh} #n~ -w/Cԙ,#>\#%<=pk95&L5ɀV}.GKY*PRNtv+N N]ieOjj*n/X/f|ʣryܳG Y,vJq~ڝxzO>TqhJb!"!h{dr )D%,vO4T-}n(`|KQ} i l c @9XU+OM5pCq9CN1Ng&ncvqह ~ty)CC@~:(ZN)pv)(6Hώ#:Nmb^oPm-:9!9J;rҭ'$g7HxzEλm]8tuk| )9Vc">9#z]uдa8شn73||;5kY}r䂫%[ y7QkI~WMĘ4벆SDBr9|tCvٕ|Y"~O9-g73LaSm!v֮X(y3)ݓJv҅Op\F0ʴ'qٝSY1̗ήf [tˌX;wfB:ȤH_NkV^M"Pۧi<4qx: Awwu*n\`;,uطPMXieo-#e#NfԸp(uQ~%iBFxZ.DXnaa}+>S=W}xoâ͛ ח=<.|rg`ul4ѢwZlnR'6GE+Pza5 921Bb" '\ȤhG)QC:Jp(=$`ڽĚ  T͍ z1IAנuUhP!Ǡp9{T5L?T\Xm;zm;!ԉ*rm݉汻~{mU7=3!c| ' \@-PIQBR1W\sټהTxԾ= } nǢ,,[#o.稁TXæ 7K\Ie;[s'o6FlwM^B=ٸ"-yȊ5 ռpET+YŷNgm\ K׌J~ |+Z{n@QYV^gy|@s:3fpU\~xK{UM~|0;9g7]Ny+.:;K2Q};{!c&ePYFNBgFjOf:$@o:R/gȓ=RG.d/T\}FԎmI4a#V׶SW3{+g޽4~Wou6*ڇYم{k{S-Cod6] 9#&I:0~Dbt-Ъd-t;Ej2P)$@\4ͻ|a4DY E2i@LZqI#EDS'V񝈍_QMM$'f5Twg@UV£hi%K"DZ~U쬿gj 5s=S׿LYb;.չYS3gfv{Ljf޶NLPLBa< .O!Xebܰi}&qi4Kᩏ{+ңg{àA: GcվR;&UcQy^"7 ƴ;Mtr Gb.:gU6w:a%s깜 -;N^[SBUپc[l&.~;y-20 ˎ騋WY6 OSyLGDGd'~iL+wyjs nyxs<_4~Bc??~I_v%ݶc=34%]O~oA긔+/ut:Fea-Ϻ'&ףK& gg6kysƘȕ#xu;Ogf/q{4(k/ut}Љovp(0 Ǝxzt:ŦP}Vã[p]/qY}x\7) ҞUe4;U*U)Vu񧆓v-%bsgHv PRE I`pZ8Q[$?gQ 2\^hѵr8e6_cJLUkk= F51RZ]ki{bAC^KPe&%ӃX> 'G }a4q׵*JQ_Byqfc&6ܽQ<[MVJAb'<"‡J_eh,P3U~H2(h5ɑ&?ۯW헀59޽ͽ~r(~3mh~0-zX, 2nݺcPѼA>}{ ;tJ3<}y{i PfUV{VmI>_;ֲzJxom$'v Ihʤ;DNO9ey< c8a]6V{8>O0Ur{Й̢:isuB \ յ#?XmSYXK/ctFaDDsg.v7zQeP3|8>1ĤŢ.-d񱄇D<&ذJv >`3d]깊h4LĊG9}ܒwډGd!&㘄hR}BQ(bydeۤgc}r:UM$^j%y_l+o͛7YfOI}%I4AzCIxKvmAJ2RImИ:/1O= 22R=ixZ-4i 3d-tծҰyfY!ŹE{-Ҫ6,xx>h2 N*o-8}5u ٸ_fzt}Obm|&V]%C @Ɛڃ݌xgeO=w]!|3q6XFrl9JQ^%%^=r ;nNODz|;'ǢYK) g$:1 oݻd2ZqS?%/,aX"x+Q O3{a6A+>9$w r@r$OmIUX~{k3ء=:`ԞX_`z)&Р:āUմASx8 Í%?gpN/ua E9`#8s8"{}W$]Op]7sX*gP3f-_x>o~?);=<2sZj -O[/9ve}!^< 9_dr'u0t^K-8 .}K<.@\g϶ږӽx|o\DCIk*' 0| G%<8w%}rGj2,%f: |,sʭa_oζmdI*?033SݤYEc!%YSUFs<ݻ?YM $Cj4`c`0G:)"h Pnr,MTz1.'k*OS5xs7B^mi7!s^Gə_3|ą(~ud.fg͎/Sm%‚e1̫xok1-yZ1FBbH8$tbV]$N3N -*GJɢQSwSKpڝ|%}L%TiI!hCͪSˆ&"-ӢibvlS͈k/a1F$ kך,#LjNZt=]AamɎֺOcrv#dH{5Ymo2J#U Mkq(Sqٸx5Ux:JMC-dxt;b[9 :~/&߽{wK~E)iFIak~NF*8 .f2  ְrՂ?ss_8$8㏸v O Yjϗ7חU!l3/ 1Ɨ rZ~MjO~H}Yu,gUX5Ci]-Q!!]K \kV#^Ɉٟ0;c1s.CEa=:f %z'3yӧ2a|Gv?kf 1)X%/$.3w 0§Ӯa}G$$X7{p?<qpX^V{ <+f.ο/ŵMd@lYʖ Z~4=ygi%_ϺOdsKH̢l'==HN R_P?ʞ~{v{ҞS?6 2dH`48p@8 *Z7o߾رCLܴU]ŵXv5rv8KRGMTu ^_0 Bk >zD-9q5?j@CjX1o}e'Z 2?P-=4*nVM̎մ$9C©wap\fU4$A2t!D `a%ᗝ%#M2*jzM]cÐEߍCFb18jVBɝt>)-QO & BcChݲ=z,9=&JޑZZIw6Nej6Q3IZ+cm^a'$9SL~9 1'ӾwECp"#q6V81eI h GٴW?#0zRf 4M+~ľʝooj^imٲ^z%մ,2"Yj E'1M&@oғUW]m 7idl,~1W\}N\\L`!0Xl-#@dq{V<cjPYin%$QMsVJ 5Kրd68Άց!,ΣG\퉡} _$Dn#5f!!'vѶMI3px0٪kW/c"Z6_9`Y4`*{(륹oi[Xx6S$)Y$'Y2XmڴI *kU_C=ҥKO9dT5HMۍ/ A6z<ܫsLn-(j.ɰ.2g=+_jݮbr!II1&)~9aC >96ցHeόoi,>{(ߍ *iص7mgq{*rOwN Iࠀ%VU Rਸ਼Zook4Q]^ɶ7!cfTVc^QS뫕V)u2ZO6 ׼ڽ6??WG嬲 &ju0Z-AMY?[w$#3# WM)GhYu+`u\oX(hְH, %K(++ wEEE5T(kd7 ֬h@A'tS;g9~= f 9hjps̾m4/nxf:Ūs٩ުЂ?"ݓ>$I"GPj$t;a> xKͅS#]Ps-ۥ*dԂNTA&jF˴Z.&uV1iק}ej+H@@[WGFu tױnݫ~MF5-k6 ̚8ACj,@mQW+9<^AI"MPB-:Y>گˬ,ufeXMa2]U[ozˡ\u/:VH"` ST' Nrhxfmqy/˨qԤjmIf&hyzm%2>Nz_Deog&wsid`~E'(Fnn,#-f +Aɩɜuټ8Ede0ܱTUu{ѬS u2M9JPp (y'Hx5vb8ɷln /q 8wveR J{u EIg'K3Y>ή%n44Vk,sss-9r}w^դ\XXʕ+T(*rMOOm۶lRF'7,l^s5ӇoQZ ._>I!r;x 3TM_#~˝:djkmdN2L#cWt)0ujEB9ubEKʭh}/%| IgP\<CPRA!~)Z-(|L.:vj\OdNew2^dYoC,?e1\njRmrrT>D"OHgϋ-b_pu1a„FKf@I!79]3(|ipx"j )"ypvZZ\z(sE R &Ȏ7̈MTxjy],ͳ'c7 W}I**%r1f֩Zz*{b%tF^vf]ňsŖ'vYf@& οHe;OzJU Z=Ի3y{}VNy@73RuvG:|'~{}45*O8}lp'A?MCHVWdu9OՊ 52YY eF 7oެ`Kp(A*jnB?FoΜ9u]t_?eMRXH#$vJf.!˹k{3@qPͽ5."j: 7O~bBm$ny5 _ږ-x$+gTH?psk20<,z #1 Sն^bgWsʕ]V1gA7@&1hni%_R|[CaL5y54Д[gўڔpuN.Ky] \ߞsϊ`JJf(8ʅul.On *{2vh]0̿Be.r^#rYsQJ*o8eʔz)7o]x̞=_3~z/ i]չLRwadSI\L8ё&5reŬuNI#.b.d ^i$o>#ķbIT[9AꞜR#>-oIgݻ5C[Kx%ZJ2Kxh;csВΓ$`CqptӬ˩#y<r{C97svT$)ȶK9<}M霠!6 O][ll4 rcyk(FzUPO]\!]z/.e ;y /w2(wMee(ޫ$^\UFhvqQl[n#ĜB\C;0vT* }r"rCۅbu(p7F!X< C[ԀԀ`n\̺Qjnfi#ZcsK;x,mE+޺@.] ߯뒑vL.mЫ#|{cC`pRUY7u(RGQu>WUa>tmڵ,,5ci@CٯrERTUU;FJAj9M4Z@oB&`׌QQċMX8&c@#E -.)P^{[qWM)\z#abO bHc,̣與(qK3en!%_J[Lw-q85&t̂eXYsF& mJIIΊ%&btT)ITLb%g":9t:Lg|*ܢ!y@蝚¨Y,/eU2gIDnL\'٦ZB3i_݄+LrNYʌI&\G-rPXb$Ae(>cT ۖ"MGe.NӖ4-t,$R%4M]oȎ\y{uwMA^ *8u>*ɒ4C8sc1=`&@}cA`Kj5 ][o@?L(tSy s0O濞v(>`]O.жiTi y y{|>V'LM2+YBV,KWy#AkX"b!@c &yinY'wqqج<}瓬j9cƎu6* 'D@RXj4ݿBv|a!4z_qC,]̫P%ZoT O̰UL׮];?PFwE5+ /F>6 /Wݫs$-ʲCQu6'{ (I$GxhB|i;;X}g oKay쓭4kodp\7_Fhɠc!(t&ȋ\V}a;YRXdW}A 6St"ׄσ7~ý3%ɡl /An7SY`  LI2zPS&XZ ܏nᶏ;'f=CiQ!jOpxLUh&?ڝ@|&U|ϛ?҂K8nVsY -Ąm֮wp8>q(Ҷ&ˬ/ei3'^6-ޖ *hPԌFlSrs\a:#]%82`ċƠ9Ҋ{}EכN!V `j脏;ԭt R64&ǓuM _jnv scEe[s97+_KxD8յA`NW>-}\OoaAZ4Σy׳PW`dyuhV-^w 8ec b7{Q;OM<p _XU_~MC<#W>㷛YlrepތLw>E8zBxΏ(C/#Y9kߔ°_W=M Ln9IRעimUsA%[^C,l֌([(1L52a;F:ԋ;&'OO99+e\1 OSѱ;&m aFʊbPGQ^)Ǩe+ glX!ffě񜱲B>m};s*G,4usidDxy0 D4M[J(vp%8#(10^<6퇡iTq:TUِEEҴ̜d]X^z( K*7S\ qifnQnI~AN(MĺnvT,<Yu i'iXk&[oowH8Z6[.ijڡ+lT>Cϣ1&Ic`< %}˟ex:.wW'[mMDd9w\t#\}!{vu9}V<6HB D֙uAW@4lb&Kl;6nc폫YG߈'% S5Du DtA9%h4*/xw SFx,?}4?P,-p2m_ .G/ORZ[n ۿb%W?Af~TZDžK1$ܪQ<_Q_ϐ^3~G#Rq͌^{hn2B>uYϞEx1^ C<׍ d_q#ڍ.9uIW 1RqijrSP9 C|nrUU9Ju! WmPZB+&S| .6:i8y׉C3Ġ,ͰSQQSi/d,EN*QA 1#èvժ F!Ȫl CؼpUuucۈrOsN 4I_jJ.bXF[&$3q\zC{33HLM r+v!@[ Wx@O 8&WL^~yd$Tn{.~n -fgh_lFL\zU6z#Gwi•v/u[ܶuQx_MmKaod҂xi߾ u3Wַla>'Dj2xyie>/ġ9}EVfakqZwX댧 i]1 {M V;zLxt$譠R;DE,lTH0*e2P;w&~Fsn_bN϶lf+sݫ̺;f qѰ]θM9gswTT_ h*˃Ɂujn UC6՗PVW[Qf %6;^}q4TnpnX}ՊJձ8sC"K3YL9Pa%7*+QGV^nk߽m613p2<=Wok8jD}CR+DNJQZQ$ssX:_~?F:R">|RiW΅6Ccki%( ^kPԎ0hYYYx1[ngнOW9]8 ^=SDG20!ؑڱ5*Ua=DBIA1KZOJ\B<{EX-*|v|tA`U-F"#(e01t؃D~K_CjD)Mp3q[FhHC&|?Q]W|{.}03,x(7.7҃iݫ0r pnlC7\ģPJ@l޺TeiS8"u4$Գ7LhMrF멮ta%`kȌ#QP?ȭc/Lb} ^Cj.1BZ<} h6p3vjE2%Y$:^riBXO:޺#ԙ7Lf,?lκ@;E5X6`P=[S_KM7VZųw>Am9z  $KN ?Y(Z%h1[jT2fb:/^>Ӱ/xCOnMZ5͞5&3QoYB2?>`2.N*`ɬ5,sy0`@ڴm: $I'`~t޲ mO嚏Sym9 z~9 b^qb o 5>cVxbrJӹq|71 ̥v3!3wz5k#'Fg2Ŷ:D,;f D-CD:#u _$+o?-!,ą""ͨ&vW݆.ƼgUIn}11WAUJDb,ۇ5+%z]Pkx\&aʱr<#tuj $Di-CeL܆tB;(*,;VKgUWSZZKR[ URV!s!F%Q'Su0okf2rһb|g ;ዥnފ ʊN}bJIcaSjS,K+\D yZ{mjKoxpNixpIf"M2H$X3[3z܁gf1뗇{5XF(%Fi"`1&*׏99,YzE]2zXzPXPNx*u@c_4Oz8 kןC;)|R{yLV݆F=QF|B;wf)'%|Xn^,1P{h9gI=oIHL䎳9blø9\TgueT}5ت `ز|S?c>d̓!ݶ24x /;sǶ"wa_Q̷&Tg@f @X˯?MPxK`?@ jZ, l&v%Jvld6a=ܱ^oHۃXqQ\C9ݪOz!$lM*[s4D44oZ^^y]."̫3C{]^*JE nӆ;[ٯj>y.1[e} #Aۧzw-śLh͟_e_#p'{_はsch)hEH&6=+hs;#(S%Ɠºl9 UCy悙,|ϣ|;:C] oNUqHԠIV^[ و[,Z*bmR:6~ X ֠ir7lbNv[m-/_O깣i5?L5Ir|N}}p=SlXL'ƝJ}3p9'M2O,#'te\t43`Cs:|4zii/]»p}вDvⱱqk5b9j@GY]uQ[tj'6-IgzSV⛻e+*1*`9>x*N|E$a@ ^zj&`XjME emZӴYS >y}LfV3)γA#Cx|&ϧE+, F8WO"V+-fV*ǖMXr e%Ɠ߰Fe6x#5nZfBg=5sӣK0ïϥ˝g%QFLW.z}oc)`|w}˗˧O ) ,7fb_>]BGЅ?k|["KS|HzI߰d\<«w@R@ j=Bԁ1>Fx`_xQ8 ᘶ~o]CT\yT>47gh#25KdUGطD֙ĉKH&%-5jpcR 8:EkK0-,-ev9O-&&%̌4c7]:ޖmS^#+e"Qo=kiمǵYeZgݝ0jl}^‡ -ԫr(0?L#Y((\+STDwG'H._h/Dj 6 ~jkkU &$&$y畷Ty,Y-HKO3TT?ӡB?[Izi=˄ ߿@_gIBJʚ"wVع}vF鑭rj @fmFNN ke4Pys msK_r*Ody6ʕ V-0G7'(n "=[FFV Q49B"ƾ7;GXOVBmb46|dӻ7J-m|wl1 [Ld Q @Hd$m@KfHIyObRS0zQG7 )~t#c)HjNƿdtoBIq =V" AdtboaP` @voD,C$Hj~R33[ %(+)ŋ{>())F|:bD#6.}Ahh({^1K|t'N_c u]buFɗKҭ@2i\8}t5J)e* @. Jb4|]*W94~$e43ME%©ߋD *MIe̷4ayBo5AETA޵9jvߒj4> . Oj , a()$u?rH?H?dC!|9<].(5 {Y9h(+,ĩ:>nE3ξS堦gm"z(EsM, e/ف>dž C^~(!ߩ_^LV#On eL;F}|y<+0biz2HLJ7 w[fM=9{,C?`6!@+dU1 _?7B4yjt}(XTX^ZNE0 [ZiirIf͚Ԥ.9>Ao8~8,Y2\mݦaz1U@ZڡiHir%V0+{y'_FM#9%9elU(`D||GE$/3èNGFds T J$iE'3ǩ aS٤嵙.cYz\PJM$+z:YةL d2S.LB&>". fɭ%IIA ytd#@%, t )%>(5 5.m(УjE'F7;Վ5JCjZ*o氨qQpXNn=cOnb\dĦ﷠Y9eSgrϗ# sM$U_z]ޮ\ , 3,NJz_<4J. ݺ;qݤfy.S$,$Q@G[罉S6W5S\R;^NRZ.i[H#uZ=w)5Uo,0n̙3b 4mڔ=zEO|R5ރ}9;vbo$|&[a[ǎ8U|$E_ĉL|r#"=r)&[$ykx4♾`N MQISSұF,eߥ=y>W <9xwFp…,*z,zاI5B: 6iGO7E\wP':x{=Ol/@\dWRTS4wi]oK+#h*-B Ts.uV*m zFwBPOξ駟899&L@fX<R'4$F>H-YŕQ㓪vI:Cipp{t'B)~Vi^'=:aH&oWBLˤ\&ޤ WO *娦!J+9{gost!\m_I%(>I}QC.|b!NP{^V 4zرcٶi&%sϱuݻ7s%dO5(}>t5C; |EվOP?C,0&C#E+-(H;N2I\ RC9?|:$$AF DҮW* G+MnR?&d@xzԒr^{*˕e?8F0&~z.UO >W/ 233Y15k~=^3,AC6o^? |Knt5r1g.cܑQnkz ' )NvPiXN  g Sy |͘9@ ie8p"_ jI#SmOqaZ Soα7}f[v+XK<P>x[UY߽>[nG|ljAo5#Wc@ò˿F=z/w}{\JcV\MD-'Ќ"۷ɬ,3}c ?֭Z_'>GK'\&|mRdѻˠ!uC˨Mat1 ,oͿ1p9~'Reסk`<[/ ?EclhȬ㻍QhQNt,]qW3چCY%VoG G~^wBcƹR%׊][@KN??l?BѶ^*ЬmQjeIڂęSѡESL)7P?) -ѭsSvO<;XлpeW, qx k׬Ə?44C E'ݜQ4혊]~9ƸOUT|;^U'ϻ (vC(iԼ|/SK'2VZܵGB| 9:@}I=R=i^޴ e2^mAp'޽j}E,w#B {/"Q ,}1agU"ƽ?'tÞqs+@L@Eo@ُwʷHiͫ7Btk3/>??\~0l;N(d]xI3Ɇ]@t?3j)qphWcˉ8#$|}⿢1ـzvX\ .ā~嗙 5bQ_]?^c\z!K08rM-ދFIo6)B{Z} ؏PX|.ڹV-Æ^_U7 |i6نW#\KdEm>Ajc$ ~tF:֭[cȐ!hРeOPəKhS8,?rlq4%)Z⋙:+v% w%(")4|!!\u 5Q JK̂sL(Ի@ _gt#13H`#XSruAC ̎HnQj\3`S -=\ˁ,-#a8$J9+HMY#J (=JuT 5 Vá\1)GDm?)gP1r4¬֠AM-2| !$TA(īxdg`rw E R 2 3m1^HĄ)G}{. H }? &G"-C~)N`K¥/e~\ik{&Lp!a1KDƍ}'cP@׮]Yzl|gYfnжm[ԭ[Wq>>@BvtVg/Eץ=04S4 x(ΓIQTL'A۱ꇔƁ(fkS3amX'*;ۧ`i1D7C>v{L6҆! jۂУ}_/FG:Cp@@|bThߡ|s]04ɦ\N|ju*(eo땆0jp  ^CfsE"^&NmP5ƦrDvJAn9 ǢWhozMt> E@lX}?:vύۊ{S)? M$.]tI)^5>x܄ DGHfzEɎ`ѦlDh"cwc/p{98 jmMdP'F`5Al$@"rLB`)N~>$հ\edlv &DChXYg kfD䷥v5У0d4^AVyj$i`hƙc Xs허"+D^%&a G'6%, e 2R#BQ'4mHv(P9u( GxD4PТA$mjV .&!Ҏyr2!,2'^O7]p$D UB65Hj*Vgbԕ#uFxJJԟ]#2ٟzN@hx"4*G݄&IDF@̎'M!@KO?sN_m)xm m+?k3ڶ? Db?M>f ߹m9}lG{w::t4c9h}F5/zH(Ub}2@rA @v m9I{+T*)Ը{9PwÈ,/?؝A7,&ɊEIy(`XH3CݘL?6e|d :O|" /e˖Xf t¢dR3:[OzbϹxJ(آG!k{ Je}g!haP/3`,3ô?;%!7 I.-vqKՆJa <tm#HAOrX@3ȵ1 Zފ_@{2I ̛ @ߎa]gPI"fُ LԫfEA=9k?NOA%p:#گToѵ@)¨%p,Dϰq-<ڶýw LApyBu2S>> [j#Lcg؜9OSCY.'WƃgaG]Yx⤇ i:˿:>c_Ƙ{P3҆9Ř2<6)q^5r.*sk1f$|%#S!([o |yƊQ~zA$N&90/$QMja"ߵ:5ed9/zqC0JGY!w_V<(rda{}'>Bj׮L矱e~<c% Gq8#EF%4Df_om$*w QaX=m3dvyC%}7ǎe@{ԦhBS"7x:DvOkD5:˃|8y$$^gSC5O|r41 B~̆ 0 e&b%U+xz2M fƳ[i['d y\p(w q 9v$dPXѵ;`. 8L8ѱ (8)X$S#<& vr=qꅄӺ2dv\8ph!$ tEi&ni`'p߶o稅/lCaPAtE4LyAiDl `N A8: xub2HLC!$RX*QD>%z )#C\%e\ep L],ȕ%w=\}rˇZ tbn~u>\E4RmêLL~`~_}-ڷo׼xpoߎ/2y=4? FZZx@ pF* \:'W\LDbDp1{<8zbbq s\(yN @헁#@_?a?QwX_βV۸spS4W5a)(ѵw_X; ^&VC#adv@RBE^$[%qxiL*[v>N]t+%>\Pϣ>zd Of_i3\[6]A {]ueI\ɛW^[me\/r}O FP[ix̙8!o6t:rY<Ә5k R1LXn?(3ZP?`֭ի}@il$fD$I=>Or/+?r|Z$;"X90QSƉ[P ;6Gv*|77::8W_]6$7G\Q/7%QQmVU]A 7P3`^yzR{T8v>\ x(KqYZ ː! 'KL(+Cղtst{ .Ĺs?#'9qRi7|pXLI%1}vVTH)(6,L}rC5:H`+xDH4I\Jpr BW8򼖔Cbxǡ"ǛLFϞB 46X6DDn j/92>ǩSp[P7 sqRӪ(>\$!@R 1Irpɽ\ PbࡍWO][~k,Ś09دғY9".ߋBy8Eq3)!,,GPz܀{N+W"cavwsV߫Š{qpV<`;5vB(EzX,| Wĥzt eWkﶙMbF2_=i^_i @:NڢO}RxO&\".b K.B)خm:eJ-عd.^P ԾbBie("2O@/S#_ X(S#5 0&1=-4cРAF@:*mjܚ$E,j؊_n߱I&@K\O~3%>|ԇݳ>*&{Iv*y62ؕ) 8!3JiĨ_ o!/ ~QHPΜ9rm@*wJ_a-E, s#OZN2iy. ƓY| M2i yIyK 0Yҷ?,g#Z{֬wm]7FΙbji*^BUV #ef? Εg2'jóQQ+/WG ;mk.|f?3gf_\%7_'Xaf`ף|+!'B`"ȕ*{?WZg{@OP~'YX,?pΝgX}n?Z`Ý`:I%'qMw N~?>zM>|Pϭ5!L,+4G b20* q{z<4UnHQ.8HJn.>'5 #*0<e3Zp`!q/a0U_xp1о*jWgۥ'V2^R.yLD+mvet0ۧOz 0U|**VM**WɊ,H6TjjH3͔F}j8B7cڭlvuNZF(i&j6D5j9yP4`nXՒ&mj-ГwN@IhՂ&#պ14TR/MؿqFw{xiȐ n RЬaMV9W%,f#xhtP)/LRӢy Ņt2OcXΗcKK0um_ϟYmsȰذ ī|9qWPB¸HAH4Rɤ3 u*>y^20{#hg$je5wqC:boJsEᘞ.`<6l;*UWnC$C-BQcF>*n<*ءXS/%'uTRdu]@滃XF*/4-⒜E s6PN\p* <꣊<(5J5c!!}2^KIW˔* o@[ /yzkx(XsΜ/AP4š<,ΓMiQ̂i H$nEl-8"A!BBa>sH4NG@bX|6!Yb,JImH9.?z9jLCN{. f(r 8yveϡTSQz:%V,e(Фy DM3¹خj^mk@I m65ьARGDnZ"̏!6Yq<a Q36јK}֗t<;yGn b0ya=j!ߣNc~ *{b/6CoGe?q6+" |ZGQ(- }LH8 րX x#&&C >[aCNJ#6 Ӌ8[v# ᑈNSq5rȣ@k ZHKz#4p$B)P,y(7#B#yyy)_=ϋѫ>}Y ^;k@36b6b'Ka l"^x^s!bR?ENxKi`?;~]1SfV&}+Q[L}u@QLAzP28UdvewK dz`u^σ=_1̳Q~7"iXԁHȨhOs 1#)#<*t~~ 8j>_?R4 0q̚]8;}\t;Ms40cCA YVd.JƄԧav45E/v[cɸQZ8{S/%uIdi%}Agz6iι-~^Ŀ`UN̋U O=<(ceW2ue\'4PNh4jݻ!aޠߞEO Phff`d,dܹK܁܆'ށo56F_E?Oc/=]#׊cCi|3Rbt(8r  Hc@?!Xti=L{nP/EHh NnހkƤA0kst<&EI[7faLA^!oc `|2QVhD`qσ]섗p&)z$O!s7(B6©R1b:+~# +] E58fCQevdo>'6gsapٷxs3ASpwp:i,.@V6 |g5P`cRax'a #qd /?ZǶXzwmcϡC F})I&,^=5̜ 0xʳ;k>ڇg=8 ܯń!}~na'܌=/ v #]Lwxy9>iA ۂرG91HBB*󭫎?$B'wYXS8s[GT v\҄k-Cdcл0GuŏKcKY|wt? -O,w~mZNjP S0`{\% [ESLC(9t6mXJܣGUR*&bԗs%Qj*0ŁItu çm#HMESwگ認~c_nngt1e3P|7N]4ᾉL5_VE* sz1IgӰ/ kb2fݷ&qf{;a3J-6dA5>x=cj7n2u\m4ߏ<O-E>>P44QQQl¦?j8t2}R=_No@FZ\~~\vQ\HPSR/)D30tHk)0SPͰbIv ,B,d95Nށ[Ħ@S< -;CN&U\.&C]A&dZ-3JUV΃fZvTAm.֝IxXs՚}IlM[CpfImz.x hغ <6fl.-['2* AB. IuR3ZvXq5.f MA"LBűjI^ &V1#> )DӤBz0[HɘKEHH0NA_ @0 cGPFӱQ@ >ݻw_W |>}0CjAuR\:qӍ;b3((A}DhJJ?}RMMEzzC:vo!THP9?I/FlwV3= 2(;s8rr8#d.n.LF,Hv,J&Irfʥr҅BdȔ (*cԙFq!d {tdԡKa+E>=+9d`f$@`6[ev+{.ڇh H_G|&%\E!w:\,CR3"\\سyh#ݒ'LeW?rd\<:YONtcOk4op}yԩLT Z )GTy@A7Hڿ7_HM^fUd:Cձ.*Rs^)nzZϫjUFT9|cGh+2)K#/-nt@n$‚~ß7rLj-4JL,2ױCAO zj>brc,b;J 8r"! $y(h*őa,9ASΈe2D%: 8ijV'<{~VJF2bkܥ[DBvN7\#npXǀ!|RvmQ'FF' Ol3`쓷თ& *w &7CZ!Q0qL|#PCt)=Bzܲ7=ODפ#} wLzִA؃}qjyBtJ Kv(0@Tbh4|yӊLZ\4_o37hW2;GV̚0gQq9k46KYX9 r_M;KԡEL= ']E~(7@ NEch,:Fc֛#EMB Arzy"f܉x̴ɸ{H4B,4Q* &;Z $C '퇦i~xhڰNLB0C)@GjM $Ѹa4l8e-mN$}R \{#2B|[PUopSeUmGq1P\b`1=_[2b9ۏH<ַOnX|6um!&Z<obгso3̣gf(^ (Xx`%3Ptܙss꽩r*U vUݍn2 ϸeXvtt,cu9#"FhQ^oEv3h~ JhבACFB+1X0fvk`^'&!IEq%5LJgX/![8FyZ['%cvp辢u0+eԓaǕeL<ƾm$1Oi?&;"46gĞ0PG۟9Qj-ނӻ[K Bx /v_Mcઋh-3`H)i*"?+{69&u_-9OP%5tai5V+ЦUSǭ_3,I2‘ufPЫ'yNcnrhPjRnhϾIn?aѧsam><){ف:w%ThэͪjF<8ڰY]λ[3y(..GC0}TU %[#YĐӬKKv~oz^W9< ΰ G/nQvղ%B#o,`ԄwݮPC m݃O2d4hn^"&Gh_jNbuh4daK+D}sGȪ((e7*$X}\Jƈ1_Lbtr%C|2 }%P3-;2χP-/@%pGFGjVJ$2YDBivdvùtԑ|4}\LٻpD@m#ASμ- 3Naeqmر|gjv{Ѯd ĿOPyNc$] LIkڑO:{~ԋCؼ=tt|O6|Kkn߃~ 3Kh'\?mxrZ/4v0Lʖ-ٓg7)زrg<絠q[nnh< G6av&la7JiA57"a+rɥ# zC|%Ե=/>>E>*ѻub7덚0a*O(@u`Rq!P٭d N:/Trʄ$fQ?T*3l%Q^U(2S|L2mTSƁ*4a;_,c,ht+2DFc%cAՙz;K\Pt`3&~峧$E O?hnrnv C4[_协>Ҵ+ih27YGs|0 잋So}4}Y[3'2fl^~q-b\{YrOѲ(:_J玚ZD7hwLg6|>;a3Y;w-oGkbo=C>b]|C^v5[} i7̫},B&@\y/0aZhS_dƯ5hR]NRM,*87MCU0L]Fn)$U~JN&(Օ4+Wlc:$R bw{ R#:d!;~O]@)РbbiMD oj$Ɣtq.b}U#DA4(tRF/d4v1EEoB(P};kLKgO |?ZMp2k݄R524G窵ۙF S,O\g=O1z?82K'UUZ; L6F}}4݄ q/Dj(Jʦ%;m3X[=V&Nn`Α9.Y\r]+ )7eYsI9܏GԄN.`\w1ݚr}VO(XKbY` Q%A3M PiU ]'iiUk&ȗ%!iKY#&m/1ׯؗQF9%͔.ķQͮ^VOaK/qۚ3G޾P {VKu5N5[J9zlJ*2 gƩdG_ޟ6@E^KF,M~LOyo*-xk\&- */>j|d]2Uƪ(AEhԙ˞{a5x߾؆\{_'> bmeUu8].,4MofQ mک i$72ӒƄ?[h$ZHΆCVq޹+A`eftYj#op&|w=mض6+=S~f:iVa*Ҕ  R)e\d5Ha\x&<ővv:?Û!l柷'˒Jeݗh4MYX4hȤ6gMwSک":ltZ6h_By 1QҔ2BO0ֲ&b ؽRk;&)eK.pFSriP Ox2 j>sD]i nͧ62AL _Oy{wuL-jY/rqizLvT5{**UwoKd^-(H;vS]I mz/{|TW5Y=dO엤NNwSNjEXJ)&@P=|J}@_oE%6[$qy/=<犼)Z#ɪUX9hϼz-#"UUT,I6_'F(-bU-N 4y沩/L8wlW ӏm{Q&MQ{ɐ&|\Cv[PrB;3%/y{}N;w2g05aSp4sx]=ܤqc''666['hl:ƶm'p.shf'ZlI񭨝d/v_N)ktA (`Njdq BIHJ(*qFt%9$h/)˜wnn(Ox<=-/_dh .AvEmVUIAOi U խdb.t' Kiz˩}S5F߲N6ϯg# /;4U:w6^WCx +h$'SV[U@La<_Fdzq]X;/l#2O+iWr;餩k5FKoD^?|݂5O>wY[/b+XW:^chcm/?fH^oyŷQ3D- 7^]D6< >}v%[Ue\#d&]cLgutjӅ&C4B0J{ۇm4wr7(}lSҏbe}HͺyQӅ@iV xb_ﲸjm͢g+;\Mb $uFD)N@?Gc< ɎQ]qϝVDv.rr;2SuǷTgB&Qh$z]o8ڦzr$4'g}}xE-fpKz*~bg3MOqxoxXTiևfQ~qFUZo6uӘ,=d!IfG-]8/taznPadh cbzR˜tV'(a:|WBkU- ӅO@ŕ 8azcas0zIZTBܕ?+M0yp}jU푟I`ϟ~bW4̚XBE8X\]X-_+v49D^rzL,pqj (BCH &AUf9Q~T VVtN^GYb,G!eI\1iTYsVݾ+D$ā~ Ò@_VL'Ł1oğ_\衲+e!ofVŇfɍ `w3FbS9 yb=+s"Lg a8t=U.}OOt}3; nUm nw/n;3Y?b.NY|)}D@+*2IXГtTS/zlw)n)6򭴼5oe?Ժ갈 kǮ:/d煐NTht^JaY?i(6qeN RIv͘`q"Z )'8^G?mW'B;W_x:w˾[zprDBJ.rǹ+WUC! :ln鯾#vPp 8e3IeeI2l!RQ*F5W<,X,Zp0uL@悡ZX)~Mn)?S^c9Ȫ2Jb7ItWyq<4uw~ {(ʚ\XCѦȢC MK ( MRmwj\/ؤi>8Bj9ԚɞظzG,r-JOn(1pqҏ?M=GPE ]g@wP "pc^CҮJeLkJv"A ٧)!n!ٞ;eԾ &ZWs!UHAJ)H .0"Ƕr=x7_*f>[[ǡrV/˻-4 ]iۨ2^o+İ>jc4`1/M!)*uB"0T] 52ecGqH4^^!َ ~@ au:YSvFNT=pT_eZE_Wni/8:0Z\V?T\iw:?NjAS'ݵMkI{<8>b'gIgbbRE;jD݋uZbuͣGl0JK(r9n5Eml\B8VpP6fc<٣X{ȜEJ?h~;4vldB^[(=J'14 H*mahw_9 vB#,)/ -Nl4Ev^JJ{#e]ůRj1"D8$[0KY #rZ&s2.\: $F.q m(Y~t9U(#hf ;)+t˧ESh-isyKZTQחJ8(//;"n!o)ԡ/,╪")l[ŧ&!`{iѵLLeq;>=;(;˸f[4YxbYށf.l1uaVߨDWyyq"I.?S-jz,A2pеMY"X {}[ͬv0c')yz?ҩ}JаG%HZH>sRLL g~{iP'"|ڳ-RXB*We<ULEz/-ܘh=g c0O O,u\Q#"<3W,'TpGtՙ#c[1fx EH-W ԵdnpVe E#t5ﶽɾ͢?`,KId9b珕9W I[0oٺ=u0F#)RXU~\cJ(BTH[UrU%&~ov=9{?:(_ӳ(CE0_wN7iӕB=y٩Q]K7_[PK/R_MI:+-aͪʵw7ք}L6{zg^@͓o(skiۓ$tEb=m[͋2G7&YZ3r&V- ?{2h$\1{OV/v2(9^ڙ-)kba,+{0e8>u]M<\|d#p WsKcU]#*)'}]qi"v6ĵmY8pjsޒR5]DVjMj[=?cVoۭOf}I9=XzRAukYFX'HRcьΝ&'^~mtEWұڻ %PT|PwU';MwD$+*M㓓-*ʅxh,2'P.Ƙpwu[\gy'İm~&`:#cϪGE.z!&s)ss#4CNJsZzJGTA‘wRZQc}Nd{acdj |B]YW?lG 6T Qodum_EŴtofPqP5vZɽ6N 1H$WX\,.~Fߍ7G'?ȥ1&3{bc]muYa7 {3VHhE^q`3K;Dkc{۵W…hO51:y8s RBxZzş94t.Eb,&֛EfoA~Yc\#~? ̻dݚC5gio ]Q56_G#۝{Υ⤮IT2?ĈlP[` ̖#XaH +NtcWm@s#|Zkռ]y~;5lmnCʠJϪ)Vo KV0s*\_ޔW70X[B e-6h68 Kca^O(' EH%Vbxl$wvyzkӲ"% )w5e:ePΔ(ĺvɷLJIe*}ÈѠaLԃh#==qLʋĀ 4>:إ]!B#|V׉դi(ԭ( =H1)rPۿ{K]NTt?jM}輋vO-4鿤P|gUV,n4d&q-YFnɢo:!jP eP({:/80eIY£ %_}QJ"Qb*qWlef:Cej)^WfmRcs%ZpBq\2T3t[MRv>ѽ=6~5(}S.L68ݏOE= |̢HF+~ ~pgXn ;9m˒7D"PRw&ꙁ͗:_D`0kZ֤[(t=}M0E"ua&NIg".̷J@WWtI'q>53>/ e/TvdPz^ϔxY d֦ n%FKSضsxhACxT`#:0?aމO>'̡ΛD> d,.|*(`eaO7Ȝo 9W\ALho4r/8ɕW&rfJrJ⣡e&G`K@"M+ckU9p=kLn HC,&Cj74ڞDzqƹ+0 CfPFD0"'@3v䈦 nDn,7~rJ;邽Hod V&\O1G>L Jj$p^4@x1Iw<8;{4f8\q:iXkD3jbxͨhcY+w k%ꈱF]{$~)y\%˓{;M48rMK;D%ZٮF2}dxA [Anb`ֵRRC 6WzD<4$.0yQ[Aly#Uc`\Bm^ʫܴI8G&_ѣkA55j/LW.κ`+ K$:x竭 ]:2]}$kxkq8,'\INFyJ`.hGLǡoO,;6u{va^N͙׫6߼ ƯSwpN.[2G-ƌ)g=l+7bO/N ˵axzNQ\7Zk]] *1fNOf|J0p'U:K5A N.a:PytOy`#ؔ=(q(h0RX7lS׳]gbo0\$CPnY!5[??g Vkg}^G"6o&3Rl@w_fWINX``L.%;HOvaua,MtA'bW=8Ux%'^0 ƒǎ.\ 6x9 >+Ǿ'#X9XŤŜOrÛ6u'(v+24f;zW)e4d6i2pu?{Zb␟v'g;;Pdw)Xˍj>s (Mi8ڸu(\T*[:a*A !TW|q@Ҽdr Cb^PJHx7>K" M`0VFj+eq>gByب7O G*ntO?.8VW]mQE;hM߮\Гubeir}_;mA%׿\/=߱sDN$06DPA)R844v0e2XWZgUI w/yE69 V⫩H"i!Km(=qxtϖ!B0V@Tԇٌgrkh))gTeJRK^Qj@w,"k5yDN਑nzw9pAQ=h2JNa+y{E_Fs_g5ͽRwG(Сi1ef mZ7Y CqzcîV&[Heh˭&*zWZ k]?O%H~pkmybӾB$ulEjS~+a9+Be T^m&liͱ76dיt@t GO&HY|HBc3mSK}l1 kE7۷ %DC&v줯/J}vLW#w8 P+)c|r֒=L'z;~SfUqYcvA&O*:2fy9f-sT2/КI I|D_X~Dݻ8(QlZDIu!HMSf|`ǒv+S\Ż`G@;k7z_B|H"lU[Yng_M('׺JXc}4N̦a<dtOv|\$Zqi44i#HuM;UN^ԡݕث^v]l |3%9*~iL9lM}y$rцxJ/-!/F>݌Ɇ7؁gY/nHi wLUEFJz̙$)"!9 VG|v"*\Y /*"di{vz\oI!0x, /g-bVp/~N$C NֆBnVv2$P } l8A6j=bY1N_xKg .ՖgZ &CVM0,~7h JsR/)Q&]0m,!gM$˺.]^_Pk=]MpfjL ޘ|b5dlJMeeUM޴ Iwx3hVњ!|T/FcP1YOazl5~oAߴ|UO B<~hbA(XZ# } Uf]nq Oi+3=l~T]8]|ٺ|n޳*Zvu4eSACT *:v8^ŗBI.b|1>[y wLw!Ϻ1 H 67!.2 +q*!1(Liۃ {%&ؾ`#KSr|7.ԿmIvN6n T߆:i/h)5UGd]oS ЖL\8J(֤S2ZnƏL@㙡ɓ鉝dw_U BxPQUפF_q/PK|3Xp'&?egR󛔁hC&h+[^亟bT#11Qoeu7p/Ύ=n]!\aI|F&ڬ6, Vʊca.}{G~ Y0P~-ϋvCq(ɰfT IW-{TFu:.6)fX{^嚶tE%=IUY>_>-9<_hqٔKwG #4`=BI4^#.:aX/:􂻹4Z4:M+搁_(B8`.^vcš6)PaGqkn&!RoƆ%@Fw$ 52wfVLW1`nNSeـ}B4YUX=F\wͮ6̪coӳHJQytQR pEwxI(5ڍlФ+PZ)%"4< ǭBIgE̩+19@S~{f*K `N2mkgkW)qE6[ywB(u^JXDvnt>=2 Xw{\T QSOңPoxMI~!7_q:)b',aUlsXuSvz6P(NA }b1A+܉%m UҴ$b_Hkū(Z#چunӪ{‚-D;ߖثTpFQCRGzG4d<=Uq9ldM^&4Aǟt3+ƚܵ5Jƺa,6V_>Ӏ;Tm OD!Z#8 Ggwo/(VXiCZߔp@MӪ2ٷ[Zmd~;V$W[ksv8`B_xw8FP]1DDk}t)|߉dZy//:xx MQAa$O# L`1 JQ)]8/F?Bޕ5)%1;.p5A$~|C&$In_lM:Y,xR\7 ]wwj#;0O!:|8}Nl=iJ~ߧXE%W*aSCr뢇GkI.@y|>;~jqF ɾҙFYc`R2!G-.g+W ؉WlVqQboC9 хMo~nVdtlRjE>rT 5O1(XEʍZ#/s4ZuD~>9}݌gxuI>H"(+((Ay:́X ! N8EZ77,~K.: "qgo8vX֧jVP׎\j,w3920nOd孑h KN5dbed[M[?ۖjC0!Ԥt+AG8[!蹠ѩJjil׆oNO "0i^U: ~r;||LJxzzKvL|6Oݨ|'oKw:+hI̍dDPHA}o$8kWYڞ!˾0zL O-l@r~Ii@"\l*$Haz=\h~8mjפ *> M2wP ϫ7']Qiʧ!eԕhrG0,1xX̑Rã8mEB>I^%}Eok$W۳Gi?6r5znksR$S'P8ū;3z!JrdrJ`ʥq8ҒtncD f?|MݛϽkx9'7HnrvW2xIc!bUhڑ 셮_ |(ȁ<=q{p'G!4<J!VQg I)"NpJ!X7>i|\|j ) qO H`V&L^/*UqܒOJ**|?`GaQi똠aq>s\a!K `- ѷbSViI08퀖T5x^"cd ţ>r< }`(E4[G6xDf2LY !΃M5ZW)K+&=qw$]0Jqq*Vj4J¯)WR a)Jgre49;uMEZ?us뷱6{Aۺo-N5^>Xkl\`YYʽ`L? ¹3ݳdv(K:i2wH{~BZbbŊjoD@52̔ EbFfp-2t~/Vwv3D7XD|lcWn&XE2^rld5D@ob\ !>)]e"E]BFHc-zEZx./v9ό*Z K ?p4b+Ͻeۯ4J>ɨUJBKE𵇚R2)=[^t.no m?Z$C5+t> un7 I?Mo0#DX5mwCe"j]TV7>X8c6rjd_kI 4|id|8"fZA0ي8yju';7_N{[iYy7Aޞ'#hpaRLw%߻? ֡cԅh*$,߀/8Év?>eH?ؓ㨋sqrId<_MбmjXnX7 Rą]LƮ̾M, J !;j4FҌ:NJoƹ'B= 7bK;;Y%728ug[{;gtqPn$W KG }Cu 7ҽMY$QP'1E USJj7o)Ybu)0 XG[, Sii\FM v Rv#B[=DC`rjdfnp}O1tq\=o>u`P HR2ܢmH,O 6!J7[,8|LՂkk\fEѝ:+<\ka()wk+5ԡ1!45x?qf`6`-;q*PPQ_XaBu71rÿBA<zG]Ёۖ `* ٷg+iFE٦ zeևNY9A$?-QfUc W06N_ bBVFL'=8 ܿDD*Dk~-#0]5@J5"w)9-,~Y\yGi"q }[! ԾW%tZ<ѶT-~_;%>0d b|:|~Q;mD`5sJW@*">(Xcd YA~8ޣ6_TF47c}nCq>}8 5MkoaUΎ=#l2¥n&h]/G#Q9e6cY<.tҚ+WA ɿB"&F/UIN,LϦy@]Ϟ6cgN}U*zs;\4"PQEWhJHo>*}r} #{~𤵷ׅEy"rm++w?UdއUÈ\ ANS !<9k/3yvǥ-hzNBf^hdGMM?Rmџ5'2PQA@v<U}^K>LjoTKJ$oRMbjA=]g=hӒQj(/EZ9ʾ~hpz:Pvm^Bæp(5=bZiEgHrj/5K8:6[M8Aݐ=I|@Jyͅzca[TEwu]IF`$Sg-k9L7/ӓTuM 0rbfR,xE / BwTIMn))nGp<_bqzu'Y>Þ>RxDEYs:+sg8mJ?ƁnL6|۝UPom#J/1s&/A/8AKؾ6Z_p>瑠x['*riˬNa1N-8"dZ)ᦞ{di=m;8'`HU̓~3hBzJǕu`q)Ѳ7ȵ,v=f)\# _+l8ѳOohB~N\ b؁*LA>ittNB["{8s갣Ip|` #hMÃ+R$ʘ5 0:'0T}%C 4ҁ&$وogt/6UG:Y_1PhfB* y1),4٘W@eȪ꙯>O[?[3c# P*Ʉ ҩ~Bo)XOUC=d0׻O jnLS I,ByWsZ}=t"[P~|Iv. m.+#Q'er$s3}qbb,۞µYkN꯰i@/"moD[,z=y `/F.˹t/_᪷a<^"=☌t7Nt|zӮ@F񊏛o6J53d'1.BpzjCtjV;Еy NkCSF.Ff6bhCuKƚ_o)˿A^w!/yA |R)!(0LfUlE ?*UTCPrs3*ӁD?k% qQ87ogQ[-80%DA* /ip&/dѸ-t4Ww2wgσ>84%}KS4]lmKCNa h`vqvhE$h!(aϧ@g%pg ͍ah/1Sr'<2%^ >""kIA+48H wT2U< }"o.7nT2RC{.&DE8ApGgS*q>/#(?iN %GeHw>Ѥ_gzO_ENwYZS;ILZ1[=ϲYT@N+@\PJy6~$5>_"v0Uk2o?R3+)-(0up5݇GtlllLΞF>qXF[xrtM">ؙ_whMYL׃ t?2I˛svb.YZjR3' ɬOʱ : ^<'oI:m~jEYAYr ϥ7_^V6?SF6@/> 947.o|Pw405r%WqrN@?{< P P;_  $F +<A*CYk{4UOJ`9Z1U~;Ⱦ#/1&aBPuBXQ%m s md;e`ä ͩ &.]ŋIDo;,m>W _CPg/yKF~ ?q-0W??_V#ſ'DZ飍/0hX@OfsibtUmz~ rӄyz1CÇT@er5еt"zQ `a9x+^IVؚšI REW1@i,­Am ؾ/Uɮw! 2DBPwjrk3&;COtՎƐM3vXbuT_$ƌ:SL)M꿾L2O?sS#rCPg[}a/ˈ*At?6e'R: 5QuМ_@5l_,.V}($5K0?;sgj;S%saA2q<&Ooٖk@6ZA[Qm';jM6%>Q’*l =+Wi0i >/H)(=9isP=MMUZyܲG kt;_`8O@ΆS!EpzL H;{hAw -M+ΐ =KCn޶+[Zy?"Б?,j L_y9m, !Or$ayLBew V!R /(f&{sV]Wﲧ7h()?5pD(HLXG0 $[?}|=:%!S.7&&B} ׾Vd`~=p",}י)/?_ -= ɽ)0Xx1G,2W4VogZGeqp1IiruLD^;2'utte2dCC8rxZ:$A'#=5[sR_bNh ̓ڰݖ4viBOhᙊ|-!zMgL舐'C؋U|U\#I)4%|@ E@C[&#Ik12u(EmW퉫:vI'4v _V@QUHzj17{~xD hxI=`,7avM oN2ADK)Fo c ek9vO2" $%U}ܨĨMsvP\g4 F}vir9J2> 5LrO~|_djm1,Z-AΦF80H4*gakQfF@-1 nTʼnGh2Nt'XF˩^sucQLy'^#FFd(t%j,`*ԗ + .B*^Xy({L?FWeo e8~ GKp27:~xT8/T*]3?,&}!I.IL)rѱUFƴEl <KhHH QlFDAerl*yj9=Nw.mûꊸ<h푤laq,h>m EUU}k "/jjbw/Enp#S˯?g`Ɓo>N~oU|.whM ?7TEk2(]f:RGfIrZu}pH]:8+|2 c՚JQO\]<67@Бu/Q~5w χDݟ"_PpΤf߼t@4ϸu:3PH[V.@{`U{ ӏu%ջ ݂TRւfXW05M4ұ]&H]$Y0ƪYeHTD'@ `r+&`~ ~rw,_jUa%6cwLnƤCTܤR:W,8CEl3!-Hai@bLXHAaT=S+t&(it 0n0$R<[|;6CD__6?%, z10|U)É 10|QIo->?izI"z}D.qJ2 [?V!7[$_4 _e_pDwᨠPqҰgF Áj2a^r)Dv{9Wg3pe+NV4_^0IT^d2s.㱛ŭ?Rg.^*\,I[VQ?IrIڃSyrFP(P&pQQJ:Iavj)9[J`+C#싂~Bw{> k :O8[x| 1p)\N44k_[9lGm@jK7jRF$,$4loTBb<NqT);*P l$иr`CCUȬːVFI`GUԬAI}b Qݺ`3sjoq<^יD^151gErwvy8r[(SՅV0-ctՙ38T V-鴚 #ݎu/yrWdi!8bxf*j<Ji֐3ui>.슎HڵJ™69}4TP7Up4!aK^5l;lբs.F.iײj@Yai.7v) 0mr?Vr;])2I78dzgtm1_辣 i^w8# t{wD/T;f wO] ) ${wv>VBOӈ#Z}"e< tp@2B>5LĤϖ1pv'6;D*@(k!e}+ Xê˽. wNA"3wp)r4"c9vIPDŬG=*t(!QS`,N1p+~vp?Dm*GN'O&aOhfc TrD)ԥѮcA"(ՙ1: J_ЀV}Q9 `,P ]ے`MM1MSRG>IS+8U<LjڅGaw?{5۸O6krܛnu㢢àd@eVk0pB(zq%nkES~3kde^ cmi$ *DʥQJG#ʍ=k3 0o+'TAEGoPyj8uptdrؓHT98Gh>R/72s(n5Q[Ǒ뿀bgb"H00W[6 +*I.u:ݱ-6Uby$аR3Gِz1(',U4_x0ס9wT!-=LXx(#́dy;\TIO4סI6<"TH" "L8FM=ۦ>hC' 8)GDjUis m/'ewG*t>غ?i:U)*fּV?1\#ipLv \maF[H沶.Q 3;cQja;JJ|ZY2Z%ZjFa͔"GJ1Ha3@\TFokW1p!]yh+7 n}z 'efh9Ы5؍ n@׎XýԚsojQ^td؃ܝ(x2t=^R`Lk`B%R3avY}dι nN5IqןN|U'y¿0_ jgUuc媷 .&i1itd5sk΁'<hΝ9[/n.T3l]5^#!0ԟp&4 D_3tF4fLD 63&Vw R]?H^navhZsͱ,!)}4YQ_ųw6 OKGA- .-`4پGx@O |âooh{\ X[zEʢrJaܱcԅ+34DanÏkjn3>}wO6$$Jvf2V$|{D:bDXXw`Yx(SZw8HHHtyCݷyU0 VK`'nUڡIUۙ}r[7(v?=~zR?+~q ]kQ/Y>^}Z R)+AP/y]{ZF0FǸ#a)QZk%mvJnSx-Q zc9?` 9NmXEÙkw!CUo]ϖxa Tϖi'ₓE(*p~9Vs!j/`Rn|Ֆӑ_k4ijn^]BKY助qfTW4H4@1]kzgTM<ƚl=߂MkL>rf5ZoLLuw v L.+3^.𱊩{?J0tт-D=nDtJ:I.V{џǣj6GlZtW^ 4bALE"cf>×U$NLk &\M?PQy ‹pJ0#.}^fWˣUyc7u2 LJGL!YQR;zȷ?&10,aVBA7t{e>[j,;`4@$VhD j7$ba7YL@2!|l#T;~ePKnQ";.;I]߹DND&oh7m떉w,l*UPMx:%kpjhKht\(c԰ 9)&p'Fs܌XNpt҂1to{f()(*%#[15N<" W1͞m6V{+>#mȶM2e㡕` \XilX`Nkvហt6"G}I‹3eխ=GERS "Zփa=B9")c} eze4]_PjV]5%z|.͝޴ӏcO?dz _s:lnwq\?1le۬Ed1#~5Td⧕2۳/9mHQ<ǹjjvc'*ђ Ds1ĬmzOtÆK@+=?b!dB, {?z#“Yr=L.x[Bp-ƉS[vNsgZZ TG爯DV/RF{- 5&{A+j75ʡ!sgXkh;y}MZ3i`SЂn]Wk$),t[N =۟v7cTaӷ#ᘵmv !*ϟ7"B%N%W0a]'}4y}a;*WnV E(!\ ^0j!qZ عH,-+ћchR1kqdgU4=6##WΠYy!_yWvz@r!R4iYaWȔzE%?(U Vw09@1E$hl?Gl$Iʅ,2v|aTׅlb–A7Ik_1اð„Ы&WDk4+R}%h[+|梕L~ށw.V6 >[aQGV>HJ}#NmӨYw.! l8њ\t1lY\׬EB.{Ό Zն Lgzb"}c\i(U'J*Ty\3Y.-6 ЏHǺ !zp0_8׋B7FOM"!bF?8>UioC{.wn3_bh>ay#UI~ S D3+cj0%U4(g1.-]"X1, %S\&0$v0#3ky-NN{~/A4EAs8:3o eUGwWd}Yu+S"CCGw[iҀDvs=7Ǣ_c_Wa~n?ѴCDD۞ ȭQq-ĸfؚSzwoe)bJ}/{9rz :#/y2d-> ؄fP UF#?,@.aaT/Rv7 vʠjnbtfԚpf S wSji?3G\Z"6vh]x:$Oѝ~7JQ>N\C ;CLK<ȟZ,t6Cx2\ ˡ'ڦX?:E*xZr)*c]ij$ԳZbyNNCVCCk n1j#[T`hgxaGێY%I2e}yUS1%9PV1ȠSK[#Aw3Bqٵdk0Lgh1$#7p|fw;<s:tQDb͞Y*3 )%Ĭywj_cK݌GA% xn)+YJ8uoXHmw™#_"3s\P=~cx5yh]ajf^ox7KĽz?MD˾Y ѳ m*dMF F{db;HxB98^ Ne4l#Z\PLݪ4щNO w!?,o*XY`%?N1C:rc(ܰ`Hf%,iLIZM$R3zT{]H8i 0kju ae 3bhbM8[Ebr8h<>Ư=`^“ljɍk_JH̼/{ҹkF0AMdWUDރv#smL9|9Y(pͧ$OT.`Z '[1ԪD5h|^Rﵰ: '`$*Pv?Y<^5G )uH<~GG•$u)@~/ jK EM5Uŋ`~oN -iUӘCz#&{8&:^ DuL$=(vw`5fWKg"}x?t5|rI?LZl+w"/ȓf;t ֳAuQBy`u?۞SSTE7ioҪ10 _'fq1M{F~Ā&Otp{#,l.SYC 񄼛LeJ1hBM8[nPT蓗""y^1jQRz03UJЂ<R `TV]4 ag* %v:ѩLJWlPWb<ƣ"8X?"D7+%:V*l;Po<`iC=|YsyծH$ ? VxC{ї>Q,ΘRy۽S 0::B҉mmfVGD՛Lb/cQptӃ`](-`iB<yP'Zke0WU)&~$ e"ղ6L1t?x~!|뉠K_ɠk+Qw뮝zw} }ۼQhc-.4Bx>LIQ `(3do-xnTE {oՋpCk̓hU9=@p;v*ioշsLjL¯q.Ç:});1b̙~0Ou>/QX(xRW 6j a^^~B,㥶$QiF U`E>-b\8y㈛ř(gֱTHB%k5w/̤HL&($H@C8s9CѠ *r$rlk ^mƇd3NB&3%}uY)588xnyBMrAQʐ= [Ow4=;^X}w#e6rv06V }V1.d-KM'{(zǡpc!}MGTɞoIO43J%g0s\LT,ժNh9L=τb(mBٿp:e"rh69Sh!:%V2)Fξ6QN_rcZ8h )/$둼wk12urؐ JgDxX(>́:8 ZxĚDꐝep "*جp!A`Uh<,"rӐa"\YXD!ܤg2)&D+eB\8`IMS i0R%+ %npW.^3DGG XmO{=^ 6 /;u bX>__a,o0! FZܳ`Az ^#b"$|xzNf*# 䎨Y({0dJT8S^M@jvTm f:='*uqqccc1i$ڵ +W$xa:Ov"b @>;o=uYn0*tI3Xzaq[cUP?҃̌l8E K, n*;5_Č&\0[ SdFJ9Ej.QM҇ڄ 3;T,퇱ʚU &#li25e 3;&($FR춚gs)ׂ\O^ZPO9>H'+=epY 0 M0J[`_mۊLVtLRVױg0JzNj`Q, {OW\`ڥ4|XpTϹg>}ܰc曅Sv.59gsAײ@ވAeb1!u~wv%+gZ^J%rFP#_M0|,4]˖gH(e3!AjxhHp'=%+TXL/ècewfLD4سi5%0-<0LPt hF qtO;'4xu,Z11iWN UQ"w-m]Aþ$KEɲt v?n ]fCV/dEv,BvBC)B &Ve|Gwx#v 8R73CM<(p8(|(ׯ0<]gRT^XwIiXV\kgwZOA`)77ؙQ^c n15P~sjB(lM[`N:mׁp=vXQ7 ۛC)ޖ딍kЍVZ?\n(Jq݆͡nBn/H:a_m{ySkt`@xcP"O] a_h{B4wmj ^zppACwކI0/c5/rnf!F*uͪ[/n*`j4B5e^{Lkz]Z[PuUwԢAfc)>?VvӣׯϞ=s c^]v&E88.] _Exy ;zBS:cu* 9jnW1khAŎFGޙ|=*OBܢ=kkq৷;=ɴDy0^q0/rikv7cV܇]/߹Wt}%ЃNC z>ҢZY 7[s)S"ݻ3bW!'X- xPZo^By=VԮGyn_Ih !yIf [3cS/^㿕{f4_'ǣy> 3&ȤKV߾}]|8(Sj?wKELyW~j"utpZsv>|RdN;[\O4HD-ڋ/2aa&f޸q#!:w֭Ш:,9zCrDD&"§R~b·\dE5ܠ=S5ӹ#hxq{ c>H8>LjT)`zFsN`Cv#X5{36ٚHb)*pMֹeuOiʩ}_zy9ÃG>HkoN]l RAɓ)im\u,eJ?tdSe>hd_"CX~ؐggbGyfc=VVtmuXK)rOu4q٣28oIxwjyq1rpRV (*nrܑ/q/Es܅nVQ(0m^Z,gJ?" b[Y;&% "~'UG(!gI9yT1Ca)T |uqSZÊp1ON\@J-mhXBbm;9,%1 5g[ЎiEKX#LטF|LsYiRJ',ФST{H;mB_y=ɓNUvrf K-1EVp:صk^P ZE+Zh^6͔IsGxf@sƢ~j4.r4Kةu|.2:Q@>~<˔ZiEӴϥSR[k-H )Ҷ\Ѳl4gxPf\1 Yf1˛Қ<%ڗ SifNTP^e 9 Ycb`J$!U9ʬ]ӌX1N\&߸ r {*~[X`DOե{#3ix)SH(d:o+ >9˖2Y.*7,'#\ ^K)KgÑ^D"=%4^2q9=.2-lv2M\/EեCڲ00{=ӻ 𳼠L,O7^Vg:-ʔɒcZ\`,+?{0g%ܑ2d4e ̔)fe˔ 0?KxIENDB`PK2N\PKy.F%angular-1.3.9/docs/img/helloworld.png͚e[]'@ wnwA@ p9/8\4{WuW}SQ@%AT>#_$1E1Ex9{'Y]W4ް0`nR:nꎖn.0T<`0~\LSa67gUV6aWVf}GTn|hQruw>MJL'@D@`0%)V [::":ƂO2[Z/ca=||Ĭ&.m# ̃2d/D Й KZ6l9A|iq ώe}/%z\Uc',,LK+i0f k֐H,)a_e d},#ۙ I\*$Iv`҅s<բ#;$$D~?̀UX&/r*+Wy_$6.sKR2^QVl1IHhu}r,H[R}"ގ4(cC;1hUIcZ+̟|8rnɉjR""$;?=%%1Hm" ];u PR-1 Xy{_cB7 â%HFK@GNϨv5ՈSmccǞ9mô"^DZ;} = +o?TÆp"x_.-L!3qL 6C 9A**Q>mp:e')Ώ jS G?qJjed:.IY;gQ\NP2◀2')nO_t^،ڿhzˬkXX9iڢ&*It-ۘt@|Dv;$a`@Nʄ޲ rHv%wXDN\HKJP?W.<"f@0j5]ȤjYN&jnD޿=qd`xwz~5tEyA+0[{  Xd3wh'~k,o݃"{O]K>m^Λ9}"3K~45=r/LZZ.#r{}uz{1tv[ҁ[6orE'Q~FEà&+ |{Zo^'tOWW @3հs<g)='']psN/?#a!4d c x{4PG0CQ&mICynЋ[:,n&HZ;Xvv˝FƎg[ H{H60v fQ<WhVr?kljAwqY?&AT+.`j=]C7//xA59j_^46=fǼ4dyl]SilEפ$;TGɍepv-6L\LrC pRa^qQ+>*-G;+鴘MXuR-Ѳߕ^r1Qf>wU mw{C%5Y{{H#0);6܃*JIC]r}zc&׍U^ _' =:ӽZjIp '"gb͓z|VTsh*sT?u{vjOjS!Eҩt,MRRRZ A"!+9\jb~;zFܝaؽ?(9£3YcsBV4lP~_Dҟ u&j <@,*p&4[ uʹW J$X=Λ.+(`mAk-6+L4˿^nstO-Ľa=]{әxT:쁩͘X9)XsY<:(-Uvs[Z7!B,iQb> ݽYm|3ez7(~/Kh/cf5uI)oVV7{ c) HbI SaQ}3Nsi, 9&mA;|nGbbcAqd|j6)u>7a_+Pc*fD?aT l%tݡ6Yy O(^[K=Mbv}nncϳ@cR\:m5lm2pz+/q UcgSˑo3yoD/0{jр#? $2dS`O3aYw%\v"_ƳѤ=Q1Q)8PX|7_RNj|U#]}|s^kttrbAxl~rh/›B ojjjyN=\{)0 a):qmjV(5x[ۜ \jZ:_ *k p:&م&LtWiZlO>G$Bگ9Ω4I\VqjVX.n$3C%ՀAJ[fA`@/(E"M)F#h/DG*TEmgquP>x H=4Y >VŅd!oBqXcc[,%9y݄ :u+a5CE9iߵ?0dM-Z ;u+bTg},DT.J`K0>`?ڪ` vd00"|LN}VVTLùp&&zD{ {m.y?܊Vli5mrUI˝DJ'"~͝0e|+4<~ ߻JeC;ϔG髪g?uE.|ծ-(QٰDEa| }ʇ F :2j2վ =fyyy|KfDtPٿ\!{@;$zqjC/{2%*ecp)rQ[E; 3 t&@(a ķv-Y+`Vh?;UFPXdhR˷ޓi:5cIJ@HX&II&UF-9A;~z`=!B6wafx=H㉙ g]fSU]U-x<@t43jdnoδ J)6 6+Lu7| 5z? jj3@)yp6XB7!XJ;;;@(p*,*9 a _2_%F"` I C[:g/991B6d=4 m6E"d#Z8T=GЊCM%βڸkc#K9p>/#X/*OLŽdZNt #(A wm .ymԥW^A8+*XR^Lr~8 )r~!O<2T u 34'ujvsݟo/lUL߁n])O8z/:v)A1,[I~f /[W AJuMizį^@Rثlr%Mc&lpuwSHiŜXn-Ze7m妮JpPm-[j {Rk? Kq,u4>h3KhHPjs^4b3^䵛Kt`(r~z =Bf #D0t{Aߌ"e^CޮN'CU͵V+ mp@S}J3<d^F%Z.^#aJtP `VKg}\#9yǩ\X7a̘4V7EXM4˧Whx6 p}*.!k/%*O3)ig.vBDKPek`!IVII  Gzb;yo[]"#~M1Tp?bw؆G3#x`` #`BR3D%ED?,lt'bikJVшX)@辪3{cYڪ@J1DaS<*X?Uk#"n=w|!~ak)m xКsq)Vi1䈼=D'|y*_oרhyxΣ~qq=I bx./)eC84qnWbʩg$#a\}_c D 91˘ ^Oׂx6?Pؘ[&.QY_U[~K-0'n~"Y8OƏk%P)oJƐ]:?6ڴ[SC$ܨ=,+jPJ8зpB0"E᧓ V( Q1_:NY{Y:uAiRuـ;,C \p,9KOQBTm&x#F-9X$Źi1'!Vq(Cg*)R3/dqBw+NN4v@()R֜C.,îJ_^יGRwvW_^j{p-}*ᓽ,=ߐ(9Ճ&Y.. @'+rP˿lXvdIƃb/!(ݺߝV&0!@<,~j\@8 ϘH^n`%>qe 3I[:MH` C@T{Z!4~BRЗ8|&I W5:W d4iX|{@S} ؕa ^G,OLMl03pꔑcZu:ʇZ<":FVܠl}DߢW,DgzO]/*Hߙ15|~rCTIF5 AfJ!5+E!@-j/(YHP({Dt8>\XḢEG`698T<]]]q>ҋ♌uː^Bc-t(?"'ξv(:VG%ާe߯8)8NƄ}2F 4Lj:5~*|KHu@o༘u”9x֥uؽ+^f*9f~X娳ώBMGnF ѓ>&O:i(7Ɔ+3֜RiYSo|VIǑ0 $ +uWPoT~e0$q4*b@,P8v?w=S`WXI@٨11{bu+ݘPf#S򽂅=]qq+m둝E @0/:9"v/|v|fNR9ѸJM8vhSԌd !Va. f=V|{UnF!>_F^52̲+'n+}sZ]0EOrbǖu0M@~OpM.:"aelؕb˜5~dq4%NWzWYQ_xlQ?fKE6whH  ij4^ө?|:3B_w*µ.I} g}J^'5Z! TT3fzȑ+6-' rňJl+Û'?.7$@C[3٩SӏX26~L`C֛]eԸ$?í{AoۀBefL;7J^ gуIo˽YOBhd**|RVXt jo;AG6YA ƃӉH!x7Y^\T Pg'{ƚ-m׉_j,;р:K}1Cg.6eU] fuͥ 6}=ks#Tiw+;O;m6&?v, /wJE4)Qs#ٓ񇇈0#ǗL7!#IIv1+6<s՗D&Ihߝ5:tiTJZ[(eHFUyZv*yޥgɱFz S]@9@3Vk:'c\gCQzn:OCo/l+>[k& zё㼹mtnymbu+u[w@1fiVKO/w|WTC>+A q-uu1i&zPIyTG9x("c  i%5((OAZTL>A誆R7 ?PK,-PKy.F*angular-1.3.9/docs/img/helloworld_2way.png{eCQ6 JwCwKwHt#% %t#%- g<^몉PVFC~ &+#  ]RDlw("؜R.xQF 4Է BCjIm5 wc's(WkSuk;sw<< ƦJj P9Q%. KHp GoBȡd%D=22_e(dRD받RSOQ?~)W]]Yoյ0f|1,=%].rZo1a`}e|yYSPC~ud _.hVZoOa +DuM ]ЯJH<P2NuAC;s)|a[GGGvbK{RRqO'_T^oFGvO/O/vOE^ٸBaR( JCCH-Ӥ3d‚6IL\D76?)f3)vK*jB<U^a{|tn0%::)m㆜|+M[ Ig[*LOw44%Z666C-$AeWt44islW{a$ə/.8+-'υ=6É[xw%WPM$﬉^+4@/ѕ֕'Xb$?1 g)%t4FFQ Hl8_MQv~[2?!"Bit-8qQ'ƞb}[E$9'cc;D艬ԮuW);]Ǐl6#@PBnvJ0z\QDIo$(Xt4y2_%diA5·1ͽX{ Xhf4A\Ϸ4)k=Q-qS,j?no$`%y~~:HCBxȣhm&DR۟57eđ˅TE|a[}0iwHGu)ʿigjz\[W>&̯s[ Eikkk^^2i&'sFV6I[LׯKZU ) V-W:+5C/޲[G/D߯\Ѣ,чmmF]>DAApsҿb'##1D_JzzƀwQZir^E5*uAVNؐ">aEAJ ] !.bfF};w AuV$W*Nu~R{# YֽŠs0!~9eCQxKd8eL9KZMB)SpR%z0׻Xe8A1]4_ |>g4J;ݴq'Hzqz3zy~*iq+qODbLj~,S:w\0~(h*wLpIr+U{?wE Ě=-l>q2o~, sJ鯰E"_-~X'> ffODnۍ0ؕj$^N<=1V-"a9v)NWu<#a}T[yuIqQ3.'-*(tX3`4lyBl"m~QR/ɕTS RZe 1b8cV?AJz Y"| Tiꩆ *{#'s|:D yJ)̎Y׮.79$x]]լ}>kC,hϱ;?^񽃣݃9 ѡɟ_0.:#w3aod H)we[3 ףֈ|n:gsKgJ,R|83%@6X;\A\ob6]@M'!䠪#ئVI}uE)^eo  1ŸZ-ߞ=f߸'pOaUn 㓓l+ROe_z"plj\l$.' a_.~y7Ljknj2iZ?yJQ_:]4)|!u`@?.؊Ǩd; D␮OrM/͚܆fL%Oby Vj37/k{}F;,-7 JhWlllCYx! #1~o:n9!NPE.#3T77(wR+s1$_33ci'q!`D{VO58e-@8& ޺rD_:y+?rZ*1}79Ngz9 '}y]ZӸHJ~n~&]'H[DB77EF:#ӱO~ZW "aFQ162%$k;#5@fI(ώ%IXRhzч+~>:b|MT5c\͙KvluA bvVKgF 1Ȏr)NI岚 g`xu}[FY8Ag<;nD9PR~\LjE,p e^,a#$? Ջ-dzRN1\W^ 6n^Qn*9^ճ9i_tt\ͮSZB,I1{r3yi7Ou bKg&jPԴ+4MF?,4nE\#q#[  \:(ug.t+k69>@ [{5K?&i'pa#>Q;!؋ V}!⧡ KI\+$uOPU* 7b,gnnȝmVvf2abX6fXdJBR'%/Ζk @~<p~O&jWK"w^@ә+3ɛY/,*i'5OUEEEu%~98dKG_ x`>1b8n(Tr =XRyʙ?1[FEZOu0nLGR!ȟ|OLq~{S?5 3(Hl CΔNoKX`c.Kz1Ã͵B/X2vjs&[ |9!U⥤x%1d]W^abj8tVNFBǾV@Jib9#^zr, g&J۝vhVUcI6}J{e."gvvBCྺfIOOMۀ]ʵP=D 4'<7RW(Glb`;J:f&IW60@bTV z&#o{|F߄]#wR BZ1iIs1 MI͂D0v9f4v! W4 a~qf\soZBߜ3J?fKT7q u)f勞V12 ~=emlIQ?\h8)LZcۥU(b#"JuSpS/49ӵK\.ש+ k G:[ 7QVm:L\uGQUGwDF5<"W$wle>?\K B,$SgM/{~ΙQ{^F~e_FG[p.OwYexuu^ki5w5du3r<;`N wASͮsr71{|d(zvص%4C^c}E*/(VӴ*~Ub99FD];;-V5 :7fY 9-tt_h,]?u"u155 C}8õi'"%%:ǟ&9=) uglƦ3v%ˑW7qvtAOU!w%CCHx=-y7aشY=Ғ1؁i!ݠBg̴xE#7ۇw2̺{@L$T,˗^镼e>';~͹Nvq{r5oX(g"`E8^F\>/:%%J\w`SSy2CO<34ִtO;re9Jr CR:uˏxI"!|8e|mi#TQA$_<ž)-'tVSyO=D 'UR+SpsΊRg?I@JV|7{^3zot@n=zѬms cY@cla7 5߉ONe^n?ؘlv 'K$^ރO[RL,4ZA |7 n:E &P4J,ʇ qe6bd'R¾XyuN+#}"G9\iɀa~+}q~VSЏ/:Uq[7p-l~q |2+W+M1}bN m׈Pcͣbz%7prz~ĭ7;Ġcf}ȨK:~Svtt_69-Q@w;݊[N˖&=/2X2q @U DbsL_-~M۹"ҩA0P]Pމ,AT |J| mZl, |NJL  E @ <pbqkwuWx/aS? ԚI8FO J<+ 4&2>;$T.V~h1_!4s԰igH"\jZNGnP j:9;xgqOa0Ԉqɟq^:|i&)AE:%w`$7]hͮ>Jhjm¢=-5Z-Е(;u5SU,P& V*>aSuu Z"B{+AԠqX($.Qhd59]i|咭8 2G2e큄ssY~Z1RW,*&0cQn)Th-g" ={ &""RdBc155ّt w=L2xt݆U赸 *\iGQYnп(&eWlJ^ rps| ݣ Z 5MlCΑkt_aL=xg5#uY)807Yǝ 89jŊ-nGo?hFKC=@*RdD6)Cdk*)jTL E {[%t\ %(+~y7/p¸kM>w]*{$IíL{אՌFS%.4Xh2oT&2xV378Ķ}p*J Q{jFv՟#W:.BM{ןp:=z'xޕGyUPm@惦ӸJoLxJrhx$pZ(u&-B>^c+JS1"227z\DihKqSkf|q]t㜔Y"Eϼ{L?MU(۳2۬_Gz.#B6l)lN8Q +}@,dсLbHvZ8g<2L'sJ.1G_iE_Mv1 [  RJ#Җsr.&#p֭=j:u={}N:tJ' OQ Ud>s^Fj_M?tq-Avh2Pve"5NP(p]j%BlE;-}(IQ&frZ{ao+l?pqv- nlsԝ<G8BopQp:J͘Mb+W(ZG5YėF4#^fRP,p9C[U @@%)] ʱORfHB2(ŎPЋ :@f>%*pr|A((\Y:a~]eb̺Y=2!H?4MhE*ؿ lf?/6L:4wa.%MJSPRXK(q&?P |5Փ5&:Lа^n;Z=C|(22XstD.lmmx.pd;Xp ioհ7KBf0徝S?*x1 Tsw?.9=WæaqCeeb# /it7<7A]2J1-Zw[} O }Q.*X֍Xqvq-#2ͳ3&YNg;^59x]$vFa><:tz% @t2^%wgRqH}fڨUO6TۯF=M 5a)1lZu菬4tBٔ aޙ3vx^Xtzv4.k>1KBamLЫЌ _r#mH"7&guѫoӹR~NNmޞJ| ?`بI E' nFfu?zSZcYr91"i:-9{^F$%.Q}r6;{bZI(G݃pS] F)gm?R@|@ ZTT,`u_[ }ʬMUq[;ڳqa'XQͤhyeZin-]!s'd=/xUۈS*tjh?dC'P^OͶ:V1J*Wԉu4?˽bۈ.3Hd{- 9=@:u?o@`~O3<5ef. v994kݍx=gUNBqҵ6]/(cx+{XpЬ/vȎQry0{{u|$P%|-ȥh 9FЂ/F )}}8G22گi/h~ZK _rA* [<ZO[W6sbBӹA̼&^!D;(@R]Q|ױe^(-$Sjz|+d8D1S. b j=?i6^x}.jx_i;a.cn[q~(mL*k;= ջ:/T]|sM*ޒVrg ?ف n[_ Ǔ$ʲa깡g.J?kf )`lLXdԩ/ Wܨd;Qpn_OIv_ޚ i ͠Ic`pPV^bv )r*c ] Q5888~w NZ=|D@@@\7vl?/CqvT*)!BNW 5Ys?A1@ӎ]k \?LM{r)h$|)LU,{JdKD~'送\M kVDR xO 3ZW:'}1Dﬧ>W X*•";por]bܫ5e5Ž?"P!|j, K"W4/M$jq? Uh] B/AƸE?UZWQIr1V'x.++ 1],h;22 :g@@ F|:XjyM+++Y^w,zS(o C;-1׃z' '70 ܼҏڍ EGqӢY#oL"$L c%> gם#r~:^"̘$r @>n1h9?:#lghVRBoFeifFWQ+֌%LXgoTmnй<2ghX|VZ5#\7DD%p`:e|REhoRm4@ >K1&d;C{(c=QR'x+zh\Ƴ"!g 2Ѩ#yKڮ{@M?Ltc F& -m__X2P`+6(֐2ǁg:TgL"Tq{I~  Q\j0s GUM-| $!a$㟡T֕.#K{ NLښ0n) X\iqqJ ^aDpGYvwvB(?r)w9)=_)}RmSd?:7eS^r@PN}CCB"H<3c"< 4|:'_(O.N.Cp&MЈ"P~Ke፠PS-MO\h*#^+Hiƀ?ϧ :z ͗˂ʠk~ސf_x1GqBbL?޻XKJEx]? !:01 1I 5:ͭ zqjW_ñlqwT}]I;xg_q} +o'1ˑOO Ƅa0]4kf <=ZFx aS#˒! h>zyADg#p)E5I3IYBN TUA5LpV/qBwk<[GfXm& ll;/:?RRAeڬ7. }0K&u#8k2ȠT61%x <6๼&([@f~ FLOccҞq03_+-G=*y`9.k~vxP$('̲:J42l _k9"U:qQQ@ +,(xtD4,嘙 uKTwJM ZБ䕔 2\+ |$R-F@ #v@`q`GufqvMkU|dSSEB "_TOA#tWbt70+k@? )zPN2\ #!>0~a(fohv_؍~j\)( 0 &7*.λc {0q݃R&@vHRGCW!Bz8]O%h@3ɨqCP#v)PZ4v C!noN0$}I#@ϔ?6k`,cFDaD."a?%O`cQIR~ bo-"BTOmϡRRR_B($ 7gff=s%(jZ10\A×w℟!rqׄ>;UbI+d N]ҟq:bOd.~ JC!3rJ@qT |g9S,Ԃ {R!U0"aCR h%LU C{cɄ&rylPA~I 7k~ l(OJO'm71$< {zjfffB2~ _E+7M_ ΦUk}`bl,|9$#jq>1y{8 Nb`&)6Z}O ~_iktO?0Gcg6@_gΩFa<>?(>P16;%hDB fRf>RW<.^׿ *LwNPO?<,=j9%盻#~ Vrs#WֽzqGY Yg?|N;oN(v"GHDpeg8*R~ZTA!flZ~Ff}݇z5WUU,2j9nB"Q헃{98Ap8E-*U$::! $+tQZ$D0ll:8 >S}wwۋNF& nPmK~\D$q.34'4=^bcCwWSR`5`97 + ŸdB( ؜{=|jC(=4lAiY9!p>qNqsp>?v{Z!LXH*aVHd0[T?XF}fMQ= Uv!B?>5(+;¶%cE-ݰX˻b32a2:#"!^&hRjL0f4A֑ʕoaE]g[>Q)Nhb?:Y) :H$R6媺|&Rc._Ę=Z'Q/t)V0%i849#f^FVd$N֬|#&^̘A4)uhoog.ndA&N¤&Gl,aCQc'ݯffsO>u^U2bD9z^Vk7^%Bxϳ9yBDO썌1:788AspuޱvvK G0{E:\2 i,Zէy.f̜cQuS&\ )覦&6YjAu{zP$,qɆn{KnB :*֛ Qu ͦqi179%ݟcso9S߯x) Dػﰘ37!kŸvG0;,HMG!! ՏcEPqVo]wOGNtB4'faCHE:`wlXa}o(7oYYYX"/ @}]Kl`V6t[`huhy!8I_D_P?e&j Ɇv?K )9&Z-@6J|R Ν>,!- ܼT LC~Mzh!+̣96ɱ[{ 'Kp~gFayB칗!=Y@ŋ/%0gN@3.TT=$"!wN'!dҠP;0,W7ip%ЂcL2 O\/!:9Un'*\jBR0@8{z?Gc%Dԇ, $LFbӥU~F>6^}|l$9i/LKJ_I xVK9.Up'Xs#wH!Ӆ(.hɶQB|@j20I-Rvm$ 8GMT_J&89X$ N՗Yy΂@Xqfe#Ghv">>mw㢫J #qXL ZKs|<:0+h)Q.Q=A1ԭ[25x`j| .\~fÌBUȬdtE^1hnnbE5cHzgTA\g1ؘp# Պ{󑐐jψZ1#N;ԫ@_A9F Zm4!ntw`pPOt0e/? #B}B0K Gg]=~ 4mrp nA甠c2F>CE]'&N_҃7ew9i?uӟf Y1 ˁ-,!;G/~6Qpn:xme<zZ<9@ X"C[})m<a M[kʫt0Ɵ~d404 S*=z44%4ZLPFOt2H?*(]-i*'֡e8qc_Z,Y98΍4u99YIlZ2D*}˟Qh< /YY%DĚwW =ߋA]tCO<):$'Mfg/NVAYde'NzBVAEy2~`vTr79琠r';XtュnsZںQH ] *i!p8'Gqe|_J !_bQ bn!ƌ\CHMKĴYatv"3!~?4LҀ0:Ej„qZ>l &6>/Ĝ\cm* K5:Dڔ;M9eJt`ChNs3"O؎*5L,?JDxFFK*Vʓ_<b9̇7[g1!(T~-fUPȥ{N_n5 < 5t:$oN$& $25/lT\&fVq9ۭp؝Pi"!iS6ӂAœ}'y8 ހmkXbeP^{ϣsӟIڡ-{vL?Lq4#GHJ҉0?.%%1(% @@+t`#!|)U"Bb:M*k| {۪׿   vLWOjuNLa.ҿʭnl/?9Bt⁻Vbޢ1`cl;0R}3}it/(}uv=YԷk?ذu7^x_%<=w*GKgIŮu}^Y9,j̜:KcMÐ3b[Q,G$ǡjhP財G}?K(<̴lXKØ8pyeOD_G h-ú G3cVV.pT^QT+}OTr.l!|ZwiYy{iK`E,kjL4ƏD9m4~~x'q9.݇m;!`2ZbKVO"ti8l]M؂|9f_p).m( ["L槐K벢S3+֬X(JoatZ,,bvxUUb-7R$6 wcwaP+DH@J{K#j@)] Jx>zY9 w޴Q؍~ y!1):-LF#zdt`G!UEc |z+3f*d?_E#zT>na1:v6UQP{hc;Ff@kK̹RG?`޼([ŏވֆrn1bHunZgqn43>Rrpy|P?;pE :\_t ŹҲ2B43 y iA*$G?P/bL >W##XۆNR"EDITS=7e&jڛD5 0 q% ڇwߍ̔xXzB"PVU>\m=p6mX-V06Cp hMkPw#a ޅ̬!);zfz݄'ܔ=݈ONf>V^+>U7 0j|L7Am]z`cjl#țv1fNN0b ;;N;wl9at>J:u96+!\9'w bfl^wsÏGkwoRa!IH֠'i9(9 +>ڈ_8ReG"/o~d 8zIFCKG/FeeAFFCnvgo1;Ӂm ,d nz5 DA",Ʉ*H[0b({X$ tCᴠs Ea\sՄ5j[ZqhZz{\l:b+ (Uc3Ӊ#h?[P~x7,;1yb4W.5 !9Pjc0ߋuc2 t<_nZa6uc\>0tbCHJKGfj ;9 /5oGUy)ʏC}ywaKaǁõb` wX@(& S'sq/W^}6[i;fbZFk'?G"a D1fd : Z &|Ȑ7B]na1"- >җt4cF@+WDQ'FC?:g&h>H]64 g1ҫa-]Fs-X]#s.3ʷ&~6v᳭bU/ 1zT*E?;n*ZFyeH3v[[lT*#E\'%%Nmd$ |&&$6\~5HHcKtj!#xBpϙ#Gj05qb,\4LJDbʫ1ebK!1k,~t-jT Cj$H fm:*cFg0ȱ1wh`/mFBAZV6\NY 7v GtT8:Z7`An^Yw)b# C@FZz*1r0mTd'@O ˆ6dH&\5 &AhC:Qϟ#D/Dbr)1x0v,6lپ qcJ ؤ,Jƾ0ahdBڋyHϥ@$f3Tj5AWN ĔLH%ri4HI؂b\6`dtfIu;3C^Ncd[r*-Aڨ ߇0*0s"6V#;w RbٴƚhgN&FP)1rIF`!\F# cA3s 'D k1N&ho˟4v A  ZmQrpeWч~_wHEapp!9FyiDCчPĎὛHe/ETnի?Ư~k@^T*@'L>A[p3PG(&^DD}He#J(TZ~ ]/ajhoO=kYrA;'ѧr,s-Ғ1sJFUIJk|q$ &MIOSӇؘSdqzҁv|[qpB=+^&.gL$j"rl޲IhŀBw@*ݤfAǮj!g{]\}P\n7sE* 9+*e,?&* ƍ#D` fZbmLeӨsQ`BNҡY^sVr "$/xTNԧ%gt5:}x}k'..To-嵸1y8 vNGE];~t-hFd| 2B@^.%HZH6 ݼv;6&gji'.Kh].h4lJ-:\.V9=fL=BEK%r( X6VGh4ai0q|5 6߆c1,V""j,.FMaNnD#.~P=OQtcA9"`5^%"B"&ډ)VMQԵƣ F99U'sez0AM 5ʤ^0ksBYX1A~P<;,]z|E`غ`&8#!Ͽib7!!#40XLZb0>S1'JYv0:7QEE 05>RVJq"\}lJV.rhʔ:ǜi'h!cղ4R  k98ΉspCh &cO& )|Q { H$&|0@T%df~sp>\qof8߉JJ;F4A@} `tr(!SVryB.IqEJ̅NKY EHg9GɝP!/$ 1{,z梮)?@I+;Q5V<#oRɾ+h}g:""2̓"7#gEI`Oӹ4  Q\V2eȫ  bE ^E.} d7Ch de ;vI??_eqo hן.'f›4n;^\[BbTy9 _Ko5"]@ >PUn QZۋdv`,eEa#HQcøl>#mdx0y V%Ġхv .ݠ]XnbD|wRDGG G рsE1(i757tα%hokD*a.rJ4,J4A 0ZGçLVS(h___$ >S>h%ILWcߎO1s8Xas7`hDjbAtBKFֺJl_w*],Ejj&d;nBR(Jbۦ}hlCzFtnJBvX>EP+☛ Q>CߝF݅{vZ j EͬڕMMLA26gѲ4+,iIǝCoE]; _r10@DDe""0&'2yPy,)׫/h(-$ ·(lܰ#sG㢋F 6:&W]$JQE4(k„Iqp_!LPYqhoDbUёZ6("̃Xp%7$s`ؠQ߭ҥ71맣]]gb4{v\l[DJ.!Zm$SVBͣBQU42␖,L<Un 9Ê^BI Aoj(%uӃ[@!bVԷ0}j4HDlU"U0G j9-(fF(@s #Ra!R.`?tv,U3S1eDw;9Lo;722~q3o ut*R,ĚgcJ#Q ^^sjYpT(HȢ~ZvBд(V88,Ћ 'N т.+H&ىvA^JT5spppp|v1-NW.&"!W'ȴ(n?MFm/w|0㳕O@w98888.  W`H ZM_V^MRďq +DFhW$p;_JϱA=i#` YN<^u @gKq~B)#Y&@.p}ƒM(eR4^9y 2ݠa?0{=uT7#YMZj`D.Ѻ`DZ)7x/XOs8B}1p-[\& l[Xxv⥃;wܲH> VG瑝=^xcRӳ~7^$?pOĂO>y20tㇷ^M,QqcGu3M-Qܒ`.NЧ{hdjZb@h*ܠ`5()z6U^nJKKycrpvixס QVnF{0Yx} 0V*dimk?}16o 3 FjZ2y'T,@GG.yqL\t'MBfކNcˊ`5 0n7YI%` Wg d MB]tY,d{{#l>3-5%mpppSQ'a)+z۵c4 &ֳVW:>/FC=;V|;}}ӦƧ;][ '[aU;m4hw[/ԅ䦣IJNg5`!l!i*% d2)Ta &!1]HVr8G5" C=һe7 ΁QO~#Zf55՜ֺ"<`hT&cCcb@6.3Oj=l؁mװn|y㧈#KuAR 1\ Abg~ XS URxHeL!FX :V7 2ھ`msppáرs;ʪ0.'?eTTBU ֛ᣍŸΥo{DP Bfxcs09)}оxeyv.!<(*.Bup)G~Mk"LhX ď#bhd߱F?~.xp(n7>3 $cta%;j?*M ! `yg^tڂcʙF{spp}8,]X)3'C!B V?o}^ʛ j/Ə~;LʖavL7V?؝hގ.FS[PE#9Fsw "*o1vȉgسm نk//؅"I{}d~hmgÁ3g#"& 2Fr8[&Hװ6"*[@I?Nã;?ap^Nv` &'aiXq!湳98.9181I2 '04bPPn+NЧKH-[d2`0l2鵡v=!iap[8ֿ@\~b{S!21qp| {X}: z2 Oi"Z~]0)Zz&4 RRRxcpb%2$A`aB~6\KHXu cS9hN_Z¬',3F$q241/q&-`kk"%bRTrBB\^r 1L@Eo섀`G]1h(IL$ ~V&6c~b%0:_a\Dc7oH *B2a28AfЪT]nn!n Lm)~"$d(a&Pf: l8ލ o'?_vl'"hAX$8J\roHlb *={=^3rIhEǦy4"$e"J#aו-ÉT4Sb1Kl:ɮ񴱜98.0|?&ss!!t *!Uv3 &6 (lBǷ"Lɕ0-\kkJĴL(-hB_]G; 'Dz=|D<7+9 Pz=M{׃c_baLIRtrͲٺ ǤBMme𺭨mFS^me)Lǡ䏛؋ -+ 1x s`tNI?okHxy:=܁ (7?Q\mP\rGB!B:N:G2zXiIۃT!(9mh㛐sh۱o>=z---ό H##bU3bdJ!e;<;UHwk4}MA &dΌ}k޽LEc9r$̙D\x@g߾o!ld+FMlD@LDW?n>3t\Pkv`uxMo#z;v #;EtuBH)5JX]8\ш7 w;a !LÂ0dELBxoFN LrWDlJ2ӂD ?Mx$ )۟&2"]Ć dDgiSE" K?v"<"=D h46 Sdt6WbyUfxױضi;nk$\v ”"8\^~$M>Q"`0zȽ(޳ۊxd ϰvYkbDb\4HZ("sB&=N]HNaEoh@M$&(3*hm7kDĂ@.X̲IBju+ D [U3UXv-#梢"֞T}N8%XEX/1R0zu?"t]p_\X=5JJC ޕ\\lÍ1zhXt)SסmxoyF~Aѧnҁ@cg|=dSq 'h?̌)y>ͷ?GB|:n uuu5}fCx8J>@ўB\qdlٰO<7}@ njًta!iDW~t4W`ɝ`}`[ZGU_϶#Q#.L.tlt-%b#iD|\R RwLhl66vdbd[B"ؼ}ԶL>łȽ/?>GZQr^{ /ŦV 2}&]UMV@_ mD\ "VN(ذl؀̼ omKnB10A j:0rD6khDŽcnŵ^M`bkލ 8I YXzaHV,c!:z}pj=p{ͥ8|hzkԣu7ތLN4B%葱hH,bԕ3%ݻw__22^d nv\zLq1^r9 Cbt6|{by{͎*/ :ք ` "HI*}:N][[7|< #m>!E?o+ {Pyx4`M(0 b Gg! {Pt4ƄWz__ꢆ(Y Ą +Plpm,fϞDv=LÄ9WK.& 9g3qݷGwߋQ5Ň*1q|>rr 0uj$f[kdr MA}7 ,^JoqƎƺ?yWE&KHrl=ڻz1vT\vXXy'~v֥%\7.lز ?'+y=kQ{G߯撕 %0mMAV&MCCbbSK uӟʀ ?;ewލq̘69L`E,oX1ٓq5WA-.LǮwOko"k07w`5xgAD \hZ(#' (hԏܰ. tRdA5E=݃2LbTN=vp9_Cx7z삂x㍘1cO$LɘjH~=y̼"#ijQwGt t<K& yٱY {?`vFK(Ȍ/=z^?fvO6v fllQh`rnZruG!;h Bx|c4XDnFQa0;a4 !hE|z Zyc1xdfm`e"#YY * b%ׁ-AǠ=*+J;xg RǠk7 pݍ7a)gQ3yxijcyzǟyW"l.;Q\\X-rmc`GVJ.V)Ѱ;D"Z[oGdd$GoWRD{1FTtm„ Xx1#0Jȟ Wļ7/É:47>H.{`J\C>y7%S "ˏ adHerD0khL_z@͡/zȫp!).;B3 -;1a0lЄpp@] T+0K_34HMchU),;::NKjEV=!!1lJ؝Dh#bBdHMiF,RDjdn@m.$5!J#!Ĉx?A Kz$@c#* !>nb:N+2 *FroJJ$g@ahccRYeGQQ)RGmGS NAlr`ؠS(`O& V$%B6!L -HNDt%e0i*Ôݜy 9[Gh^D$!|k9F`ۯ!e|̚V6`)ln@ktƟ_<ԜtXPED Rmg8Af<̿4Lܸ6rx|BI少ѠR$@TbA阥z% Av;'诩)r~ꩧXpX^^skS70%DzM]4HT.,iC #IJwhLk[#dV"*Hԡq{=p-ؾkаShTP g=LFfÂB$MA 5u?CXl1TWmE^~! 'r2* B/F4t Aa3/-N;a U`"*AiIk X04o!t {v )'$ *jttt|4Ei&S;\d{>E"BzF+hv@%E!t@p|X( ~O y|D۬vT"eKdCU"~JЂ~oGޔhP[P>/aYH+y]@l\<_BPCCLX+5+ E(+%}Iv8L1l2ֈpUݽ$B8CdS#D$]bB\7Rr,h $SlfIcbGSBR,HA cg!>hFJ]QZ∅!'iHsYqCeF(c˖-,rbXr/EZHEX477N(6Y,4O9(F^K7""֢TȂ hdQE֩Ȣ&eiyN5D5԰V򰷶4t Ї'+t5Mt}vرF}\W\3|cGÆGNG/|zenb'copP}E|q?[q /|>NZX>~sАjcm IX{la_\?ـի=^y~Y Zw{ex'{͍GasO0bƵ p{+'_ V((̦cǝC"ːζr5.ϔ-u'f>ʏTC?!pr=o:h{Ss._|[j&L>5XrÍ()@ 17nيEKnD^nZ%0X1-۶m^oeKԊJqKX ]~/39/{?.? %eMXrt4b6 wB;Pqh/6(TNm;a${uhJ+qW#7'GˋppFxQ/iĊwVQ`bA>^ \~|]h=%G0H4C ᪅ؽ*m@h܇^3DDL>=HIGKWrGFmu#Rñ~{!1`coĮmQ^ӌˮ^YSG=KtWKOa$}pd''_;7|?+O:Q 1@/_˗/AGc Ο.DV F%OAfr/i(gr61 qe(I%%agrE&˃X$@W+J1s|ҷ m8AX 2U*u˯C'm7/ĉV<%Qk PSU'{էP܋Gwtix17+{G=6nR7+]dQtg/M24xp`-=lM ;e%wFE:upԵԧHk*<ʘohg) @5 hҼ\9{MkBSF][𔣮<<BK%KSrUհ> ojicåg3 j[19#MdNG7;@m=L,Y#ː_J/Vd "*^B:qRy:U4_Yvd֡ 8z,56J@%VTš#q?}QfYFՁ![!QCo -'Fp0%@nݐz)RW _R'ر#8&56WIƳ }hZht:2wD?]GwaEEwW'ZZ5o@$Gb>CҴh@֖m{1ŝx'I] 4d~R Q[G!Hd~(B ˵`2u{C}C˿ ɉٙ@Ɓ],iT#_ T CAP'}M'PQ,mtݐ̋Ebvm2U iPYg.&e'xt~}M3V.fpUZkxmz׍~7k ڭ}m-$6O<|'j[q-1x Ι kĀS(*-G@/^ iS!ck.ȃ'4wôYOS\(+-U(cxR_ʡ#92&-ff,\0/%`<@dGB$fB6 ́IfH=| X`yb"!.ƔTlؠ$Ek4̙OO)nZ"3J˪bUJcS?Clխ",ztyxI?5TK#24{U_Aׇ0͑f99jd>Q94k^xEɃ]'nX w^z%7ӹFY"5jZ(u +x+H{Lœ{l^3ÔV){v&!bA74mT^#* nߍxT,ThT3)sei "5j`X?+z;X|J.~J Z@$_epJ~F[gBT:; z" dRɘ%$30>vr2Gwv5 YDc*Hq cg򭗽pkm 6(E^N b )u5WaKM\4MhSၻM~gS9*[4?'@m[udAX<#|KCj]S!!H|v2e%}lXOF)?}n9Ϯ{td$GOo<(AcU W7~ٙ8rndWQ,Én}@ u9Ϟ<9;5̵f%'{vw=mqV(?pLM옉M_M;%NڛA׏ B[g/BB\4 2ں,^jpT7DNC!?|H8yaOd@Q]tY:(<[huW1_`CEM;zzTlوVdd`n^6 v7.v# >BPjttlGБ U?D@? 8s ,۾قfO_O=$1ӎ.-<O=$rdf$1+"8koaMP/#==GvCΖV$MDZcXBM))8sxzlEf,܃^ulF:TLyFƯWXC|79)E'vC/|3h`Dn7'@;]5~X'Ur?Q+3wf)[M 0`1>-܂fVtfb j}"v6BLkUع(AjX9HglHPz omPVr>8x<|QR1[o^CC@\,*szBeu GFF<£eAINe_ eW 6mf/> l5OΟ9[%SζV޹ ՍmĘ6gNSԡ@=0;vlI9<}u_roofMN/$NxƢ"jjY{]u3QRT;W&`Croܴx1߃gKQ،Ғ2bhxJGS|cD1Θnv#% ؔɺmk[|]k5 o 8G@.z<6P XH>oDL7RFK =ⅰ،򾜥๞^+]#w @K< hГ m]lPӳ!1LbBAĄHidc adL-@Ua4vB##7DŽ 6v 8EYmAQqVyD$X`d\' 8A&  / yQr(ltCJ\k }x cY5Ѕ&\I -]}d0[! V\)!{"Dc08B/a&"ۈKH' %e7V~{CҫCc$F(1ciFOmr!"o,P_Hg0؍kv!04&Y3fa}ȚV0vVYw+5-/uCIFGJV "0_vÿ<;v؆q;k!xchP/a"xaқex 8E*L Vsk.3 2$N% Fƺv`Œ14}pg'sj ׬aѢ],A$ĉBM i×_~\~FY ^ B$7muecԴ~jQX6V҇bRlxKR#;6G]?Zze5/-DF"E 'MLCx ڝfn?<6=Qq˱K#6P*5.tm#jf  1gU0aFTW XQLQ3[ 2V ͐S~B"111 t)0]q3kkb/*k JLX黖`1\%yn,໇#PFw-Fʧnz{Tw#;A]7ԕmpQ90;ҢTˎ~fLq0I@tdCVB%Ł]8s|b77B$\*=: #'c옂oŀO֧)tKZ]{U?>\05ذy.Zo\kr4ޙnhwA3לc΂ 5\U&v㵍XyTi,rMDlUm8#q|:;kQ v*G+{R9j=k h=pxo٢QK<ԴO[| vdhnAfN6LODEy[M7 46 I8xCoGzbxysX]v5-Gey1Xy3L>+Ql߶.@ >P̃J ݠ N@´4XxқC.癖nkơ`" 4BU"S0+/݅)ҢZbM?،'Ck:~`zV$vc9͊eX:3t rm;(xPMmqsi++Jā4e4yX? 9\#<'4s*C=Xg"tfHD2Dp0`'# ̘i9⋏1ʶ e^7w3[V\eɽXd9sYsg:u~6er(gǂBЛ`~UҚ.v|kk#c;w$,,<s Cnբ <A 2:ǔi;#]-u|0`*[IJm߁uwc|jF#P@~_&̇BdCOo/K+#wpsa@="fLGVZ<94zn< ᗯ/C 6}{G?$ ),L=e|.ڻFz?{.<%݅"ͻy7NoYVr/sR2O9|%VUa[qwh0_*9Ӭb_/=܏ib T2]dӿ]7nοz$T&]VZ{<3N2D?DpbQTo:!!avGpxONc r8Y|"#,dޤ}J%cٜ* x`&giV|<6KgWӍ03N#.tt{2Xr%"""~wҲ7j`Mq\ R[t{`ێ#9c"{d\Â#c/jZlڇ (Q4ܜ )- k/E*C4* j̋yw6v و?*ڹ^Q7g D[O>4dPІ7b! t/˘wHp| F8~RgcP[F(ѣ&2 hjj'π#ze;9 E%H˛M A,71gf:N(hC{S=b>jRk돮N%!6DayZIE@c#:<5Ϸ`rLܼr<̚OLTȜ6GdBJwA!rW9OƔt,j|wޣFEJM:qX Nn-ț6EjJQQ| 0Ie'!d};AHebub1h6o܄p$^ME]PBgP̈o?~ǝfu#)D'C:ҨZG9ws#,]լh 5]{,]껴-iV4V:~8@_x1y8kr-\mner$Zj®e޶1E0#ld+8.SX9{VY-FF[g+ɦ`M(1qn6b ;&MfGp&`f(s3b21Fݩ6xR$|,]ښQ׋^o<".|lFh7g45j Tbƕa1gb*<8o'-@>SÅ9+ x$#&_vPq D&xoXQQ* %HO/J" ]15 iХ)ZZDd2)qcpYyđk֣CNfӬnhl{g}f r'㼟c]Ѻ]]=쁢jC /X@E2T[H6Kt^mZ1OYͱhpXLTvbw5 \mCR}Btt:ȡukq1|̃ndo{s!:AiTIr4QYS>sנ dɳOzi'ѲNpfqI[ZV?v(8&Kxh\c<јpǿፀ3m^^G&L0Z!w\W%}q<iWݳ+cxW(Kr7@F׈h@Nkktio/HCK c,N26]#mB<Κs/EmSwuNv2d0`bs l*rЃG6̰ 1ra%/ycQ;&~ͻ`p=w_I i'p|W,(3 ,(glm̕ 6'[Ooڲ I7A1/BM-/ѷЮe9zz+|I9Pod FXȂʸLgE#=L-nbͣmˍenuQMZ!.6QâNqgiX-΂n LB3Xنi8{ m-Cp+Z;[F][̩X|}l~WMDwWDXVwk5>{ %cHgG{7'VV YX׊ntcu <JJPYt^A(c@oG 09 rq, =yJ/#qrں4 ࣢}h2C!/= L:| =} U;Ƶ@EGpL1BCپûGvY;!1e=X0 1)i !ذ^|k- ^d !{ N#8rx/nn)E==p}x_\EMc5@@ehU{sD Z v"#)]uǟ/ %8E76wlGEE=,V/+Ƣ[­f_e(q],yɦ7Y6X`4RU*ZW'Xo]L~}CqO2Re6GU3lC[dTi#RXF(Km0֧5]; VqyK^T4*yHkz3HY;s\\?q[m4ǚvbLzLnU4`|s]v3kkU;))a+0 O IWx i3(qhkmųDQy0Ҧ 2Sʙ %awlCO_Cz{5 L[|Ko訹=GctTW;4oCڔp:NGzF*B5fX7ه5w=` L3|f;ȩ:M@jERJZ)Xj y s*6D`\?Nĥ>fu(bhLJOdNŪ^F|O=>'묆<[KW;6;cJKv@ػ nҦGۯ o,Z1}}|?ŢQP) '®ԔbtbءY@UjJ5)/Ï%@--.Zu3~ؼu'>"ǎISh'I@bbӰtA!/^=T.;Br30<&h4՛et1$\t4HAҫpϥWoNbS,*ШZYUT: #2ȏEmDFT~RVZO$D -,F*b×h]@截ư(HQvvƺ:b<@C;Vsūqx=bָB7A^f6hPWsE%(-T'bRLhDl2$l =#Ð>B*UųӡQu7xȍ8u$jk >_?ơ6Sh?k3&!.=lI&oMxoYY(:q%B44iYU]Fj;nBlR*jttw9״Ig<5CN@"v?6|̛3'} P_&bF@lGF+iP+mQcXNQf.L۪d(0HM(c#ȹaP=r{zzȲCcRKaP [sGgcU74 / &IC-YCN ya߼66߼췐,bb GYL^v%%wzaAc=hb.xe".i97A$`GG[u6ص_䦹]o'{1ad4\EwiШ>婹,74,I?/HYjT˽}!|Q)Ud2<, glkg'si\](JĴ{0hui!xOJFrI4XǕyI0 _1ח33;i?gnv-i5OnhJgڨ̣Z LS9o` W 1B xnh>6yH%UK@q4چbWȐ(s)`k2iD* t6a"Ab\5}2E8"B|iGcksvj6qqӰ Uu-,BGms'/ȱhg@zJw:)fg|OW.zLsƺ[镦R^d),e|vl$K *JOʑcz00ͬ»+Z:ҙqbǏAèoa]ccãz#7#+=X~59 zC wjTh/51ՠj }l٨_b‘ϪPL̰GR?>{l|^ ~|F~gg W0`phjQk 3/9wdϕ[^*k604@?,ytZt;>#wtpf;ߌa-fFcS9Ӡ2 P+[g[a50>@s2_Ǟi64"{\sMH2 <(wS ` NjF5nMݮ\SFkB F\EV3+*I %4+]vIKzTpdT FU_M~7:XEM̡:Lբ҄%IsŹif;8Mrpwkk~}wN0)pM͞ ͐qȗŒŴ9hoŽ=O!>_w0sj,Ell_АIXԷtWń-.>cW8zd Ϡ_~F7b"$8U\ ӲpAS'saO>ErSKq;t=e!\NqsM)6|sRpr?{%N=xoބÇ#")1,fC,<vȘA=!񔣾G^DX\,=x?`q= |qmXYiM-O.V"R8ԃUk\hr7=;!Ɓk`Ӷ Bm+ NLC|&U#:ÐsXj)b"c7(;_ĴL\8fa^|%*})eG~FwhPkYN=]VF큂 fjgL*%Ӿ]k -7 euu`0>+i紴Yu( v];gwVsaa#ϡT6=s$]}ǜ6"GN5e'O`qFnàg-x21.ti6s=by'+:0kl$E{0y7)GXx/=(>8Ŗ_?'B$"/w b x Hanq 9+<:QV\Do&n-Mؾ 0H8{V!χ>ro\x4cz^"vl dFO …+#&s OO-o@_ L͝iعs/<B۾Ֆ؆{r ;/9z%3%9sNǮoa*<33x?"y$D'OACr$lϑ1, ! ",!Fq|i gƻەeinDOKȥ0d@7"%c=^5w-;ErX;j`ec:۬Z!iR#%(lMU%>"Զjq%.|(b@Y0E\iNJ_p./yp9ݡ ιmv~ΑSMK^ bX1.]⋡ bƭț5Oo!5! sPQr}V)8)!+{  ®[{߂r7T;O};qvGg!(x0S$?Ü+D{<=T=hęwa3Μ5E' $xy pItбB.>{'ΟӀjV -8PxFه!bHuЭTCy !#wOaFlj'g$+Uu*1T0# _/ŌL+=9c1&AO_?f@Gg+Ε B(4ġ !1Q5 8+jvqMdB_:fC3 7NfwQaUYX`S|ݮ ]ی:Fhu$˕ghwӠ`ҜAYTĚU@qV3&\ /@D,~<fM8cBTjzԍI&v d2~hi̙-ǹjºrڌٳKv,a!>2(Ŝa4| ug>9Ғq/EE 0ZT6'@XX( M͖2/ӾIJltD4)%2QcAffVs#hwHh*QzwM 8) B~ؔ%@No@r *6?8{Is NKJ ai90u*-u $$OE?3u8?9<\- n>+g5u,B+q.A=: 5 ;[`q5gGsDz 1+㳵^ ,xk sQQFB([: E2uG;G֝1 st\z4w}ͨ,BtB28!:::M(MDŽTpĔl]k˝1c!]Vw 8 RC⹵A `c۝A,ODUfQ޾,]@x2`H ~aĞP1ްIE: ЈǣL%ڻ#vԋJ `܌UyɒL{{Tj˝)ew;s"T8,j/" }a$wz諣&ĀW_>KyR7|Ga 3z7]kAS53aA[ @#!ѱ^sl#<pcxlsDe;<)g Ŵ9"/8%G` ۶l–mѥ3RhUkɗذ{G3X2@a9`TAMu%j众G7QǿgrFNmnnAcu;mD5]KsCzv٤G3<\9nlVx!;v/AW9|a*K$@M[wE<ml®QXx o7E#WXQYYPq,zNͬ݃.voWh>9Rv=6lBuMÍ_c$`(v٣ąb'Ak-/}ՀC6#Q;ԏjȼ/t˳gWe̎iǽoǨ]^\scp2{yk;oD;gw.16>!L,5Lv`*q(lX}Vc\]kc'w/n}fM[枧P[r9,[}3*a@foǡH9inGOGblԃ]Oe)Vݲ / 0د`BrR. IB /zY0hUZz.EN\DM?{eJ[o{8cT$2ً/A,\8UtbLD$q`Z=|׸{و4(x]J։X~3^ Ά 8pzQ2: NUAEq`=KSaM,AFJ\=i6c.f!1m".]1*|p+\ͮ0ق+WA NJ+vL5..ʈ4&bLFuIcϱF̞R[o~u}7S9t`JI2su mD4Mv`oۉT!''V ǎs>NcoZWpw3bk@QO=$c\|y,Z-oZDvObUΟc7a_z6UjJq931cȇJABTl>Յ1`IX0cxQXdw4|Vs%,sqmND$dcCw 10-[7mZv 4j0.3Eb;o6,,CwW*#LCh#.3GGƍ̝> n0%z P`hu":6y/^Hs3;+mAkaM6Ayk|tX Qe@ ax,5*;>ۅ<G~3"Rg"oyu똔od`604, ]n$e8"8/[| (N2,Q$j1l~3z1a2W 3A8d?zcȍBvfO1LglcN"d*]8t)mChr"oTdDnu;y:YׯN׌ /`+ƀ}= /Vaơ YIsh`m2TfߑON.>ra ,%_&x@TqCsκ ȍeBXx,6:Sء?0QFZy9j?䡩PH|X`5Ё E!n񠢘0g,l-gp -$?`o *"J důP_[>7_qӐvV]t9_ERB,ÚSNaԙp;LFb둑_Hk/'81Qf;LDc8ehkmAaj۵X4^0A'`xLB.ŔSS!#=%/XDʦ0=cݏ| ufDƥ@^rnh(ȔLn%WAO@spl>>[85:8qh;Ȩ4]=|>a;1"a9}\$f(7d/~dBOGR*8\vND[]%^ ~q`b%mA_-'X{:iÑ749.!DAJHLGzR$\pt4 P^>L:Xy%۾ g<-}l!>ˠA> z> ."7l#]e+v )6H0F8#=&;FCg4PQ8Ѩf.bHчZP#XE2e_#u]KuB/2QY)؋$׹J%vgFiD ZcrEQV|I~p#ۘaRy}u(^_C!ÂKf%W_.5o:FM5QEnL,E$1NQ1R&HEWq)c8uJOM# 4롏EVb1Y@iq~w{#Y+WN?h ;8"+hš2Cj=z2TՅRt$Y]ܧQ񟮣-^] ZĜeA WVkeZ`'E)["$,gNAg U$v.1ki^>&J' ħCRp;;=Lvr61a5$X.!1nl}(?d_9ȕ:,/dW/#o:Z%y>Y`-%MrW#k 3ȋڋ=׶ԅ₵-/-O>~%Tz=hlw>˻Á^zc~Y>,d{N`͚g˚'c1X 4؃D%'yyW!NNXYL: Gখ9``{TmbhEkR@,x,ޫc3Yߐ@)$6 efꦒ|^#B^\XxM, کJ%@^'Z-g`v{az`*=*J;x{`>.Ab| ƒ^z)1:ső'0|SfA p^~y4` {|\~IA :sO=n7#"h.0{zyTULE%nTbhjeȱ7ӌm+#)qMء} @+F"R„l#bBfecIK԰A.ck3GM# U %p>~`M0EoZTjWac}ԔeT8A{}o!0vwم$~@F@nn :J@QcB9h( nsR:y1Z-h Ԑvh8Q6saz&tcmPjERk1ۉS 8UU񅙨܄y 3Ww?N?@#Ɵ=ػ{Z`LJcLǬ3Aɮ=uo+1ZphoGgk$d'`sȰhx{׭}_z FQl/Bđmg}wl'N֡˂h8R=K/Z0IS<.> 'NAqN"jw 0uRŮ+ژ8Trmmx'`uX*ۆ ٷjyضqv~D|u V]|1vm]գly:[{TJ5hBRJL}-d=a n"G9^'%g^)8v2S3Ƴm}!33J S,-QA^.,n-eqCY XИ UsXm,crvqX{^X(ttIsQ\ k2*wi!-oؕNW5 {Yz}P)|-#-= *>ADBu"36m@%x];vctT0aϡDC C 965&$&㓭b 5V'QXŤa V_:YOcHJN}퓒ܗ60ںH/*P;~wq16~a:T &[McԛC^!N\%znuv[Gb_CȃG*^3@Ң]q( o`D9XE/Bs>rIV>ʬ}T _c4/gJO؁ߧI^G$T@2ֿ`$KѮc9Nu $j#y@P5sBfegV-uFź5TX>yz1H`)Gca>&N܏7uq\6/+ ¦϶"xr6߈s`0`g>޸\ {o´Yьm~+n % ̀~L\8(n < h ۘĸ#9aT#6>%%%Dֹ_p5p zfD7'D\pjlݱ %38;]˳N'o²/@hA0_1&X$pOXqᕈ5hPS$N94z5N%ۘ#;S <p %+VS7cP\:GOjr238u""6~sc\ .fqsI 77o ݖغu+>?6eis D7ХY~7R,T15Gn[}m&fC{=\y s9Szo`h '068r\̏w׳y8Dkxɹ2x<*=eܘdH@ AUmyZ&ڐMv LRv| *$ŨgV uر&/z a+RSz_Ce[n]x᭽}66 .%}9T[bĢ >?'D' (sG͸~Nbgqtuuaڵ000&Zx8ezzzXR"+K2,&~ 6 uj^.Ƽeatj[KO5Ѵs \tL>Y$D$&JeVr7} Yׇ;wbĉ08@,>~zTWW!==z+dZOGACXDkk+<ٳgpmA "z -im/-2EAǞ}|c>CRoaPTIEVSU1+YCjh!x?逻ȹ6C M2>CfC Fȵck25[E4L |.GCQBCHl@E W^+?߹cgOA^iE:?w my<8̈F\` אk'9,x_ CWὟzjpӍW}5ywqfLNGKQw:p{##:}xW]<KިM.XY{qֆRdLn׮]8ˢ wXV&J%IF7]/45@ Ȓ.bS*Z%'Y+* "Iq!@en^YPbS.#+PAnW;ɩRj!%U>nb%U a2MY6eyy6E؝%,(ykH jˏt9^X68yi,/flZn?eܾQ2KMEB@g p'ϘC;oDX͎*]"40t:k0{QPdG/H)= ע7m5W\ cB{WNĔ2|YE=p[6mBqQ.N`.|c7f@W1\İ=G+;>Bum/n>҄i)/⑿b Q헿FZJ"zkeŰHsBrDC/_^"غ^8 nxKV\ PqٽЇ[o`Ƽdz"ƛ/̄_>jN ;jܓLUo&PkC0W B· -7b^y}=~Kh <(ʌBii:,Jd5#91}R6Ԟ<1>?U  !{d.2Jbg̟?۷oG{{ƚi4GNVVfΜ:dfe A'jdJ`a= ztBZ\7|"pOɍARk$LxgOaveXYWD83t}V`KQKo HΉ`4 ?5Xc0dBEWk;*kO57a9 _z9꫎`GUW]?܄t;9nfeO x+^ߡLX*c`c`\8]uxq0,?&-JRdL9~m6HGNChnWcbð96荱hicGUmJ1?)=-uxwXi:S`pȂ{7xWqM?ddc]U8r#Lf&Ϸp7eLiCݩ:`R~ .Eb{cB$gjۍSO"6c2JȾֈd/Ep;~׾Lagܸ#H-DYYp~F*4-?ViPha%ࣞ y\OsJ2CnET[}P@x4IKFA>'L٭.MUsLKTb=*- <F1c0}FW_JkΑp %F~뫒Ne%WP*Y0|a#2%WH;4)Vb*5ZmLYBOTS[&a%2U'M,[M˹l"d z &롽6h&9s-37dRV`YW`nv$]Rd7.>2 {B0?z88ٻϽ"y9TT|3o?^~6~%۱on簺bv80Z)Vs,4\ˆdr+I/V SYgZIr '`QfNg,n/M#~4jMcr|!]$g81F@+|9Ԇ,e'!Q:v'*w{p߷ .[`@|'jj[Xjt[Hn[O`RhkinF[G/R󐞢ǁ}GnJ@t1ط=<_a >ZEH#>*}e.&#Xr-O1) )F&چAFӧOǩJ XDdu0Fj1i"h>ZÇ*P8ߴvDE%c,Ƹtv*껝-Ogw}I0grt}UsXΏ=+Q6k6t*K~w"”7C6K9F}s'O@'z?>~/#A̜^Z 9H4j0l"䄳EY B2BjV{fg.X3eRHKD Xт 1w%s9,Di}@'G 2$WΘ$_V,+.6b?@vF*ZaԃW^K!2S š#/^47`y!77}-u5;O@= ri!F 51 "& ۷nĶ!BH ϿcQ 6g6,Cnzj[bgz:;c/O \2؁͛>@:ES0L+`m3l ݏ8Cz'z)p]HqI=^K ScޣXpj*{T-:[jp3NbВB%(HsI z ?Xߎ. l&d%+}-Ŝլ\2t'ws i.uYɥup/#cs}%sUuQ:s]suA-Pnv>/|E@1> #\!*/5&L?`cbǚ.0хp\PP>bf_b]<|PRP8QʍJrn\sH2* ۍ9 #97s5 5W](9{`cر X̍]ىiR+GPSw /YCLC[g718̘4}&fOc1keэ7m@q&/ pɚ8~`'rٓponk!:]4C Xd1#VsOۯ<CE@nrLT1 (9[1\g@]SJ&ុPl;b#qš[yW%qh=&Ϫ N_}݇}]ݘh-|=x'_xgg)x Q[]dKWT㠾r)9= }MXf ܁G~es ܹ'2h"!>o/w-wTk_hi/%gW_,L2}Hvv[uXqZ{!o<ج$Mga#}O="̹3=?\<}9z$" b8a@CID͚8hxwFjANq)j*n6+W,,^|6꨻<d3@ʬJDo~,JMMa*>!SfL;dPK2m(#P^E_p M^Ғ'Ɛ 'm_x)tE$NØΏ>yzjԁJ@#s w@dF@79ÌM1# Btm(w)V.G@@NǬ%!;-:X+*} .zЄ&Nx1kt{%o| ۻnELt8g֑Qqi6Cv]22{n Y1&ۻ3Of ),䄋RjOnQAޣ-]].Zr3" `rX^mlx-NZNLYg, `1܂Y* slr3N%FIJ[<@ Pсe!1aY%HJV&.) d˥)J[U9ER-|_Fŷ*#X() mdTYhP0``H`9_s*N!;o1Ӄ" 1&NS¨1J*%@W ,1>o鳱G ]4Ϙ 1#۪PPgtdӖM8m{*o +ש`H5+8fp1Г-6&P& 3IҼBKKyF$U<>W)¡%約aނgG O (@(;4 p b~2]R'P00PE{ƣy 5!g b29O5Ӓ 2wm0Lkʘ Q沖 ɶ{R:TqcBN #n`ƺ ~)K[:ia̻o3lATյa |*1w޼g)9ln'+* qd(-U4˻ S'޻{r ' Vѣ'OqQAYL+V};W GۂBAIqޘOu\stANkUM1L2?&Y*9LE\YQp%VjCՃŝ~],QV(#՝h(r{(8>0DdڐF8/7@I씃P~u0~-GLO\ 3 V"c_ c;k? 4xއԔDx6v!+#J Zyum\(Cبm7GWԝ`ݶ~$Am$׏iSᡁA XÊAdg1WJ8 CV$'F<ģ\ SIԵ0cR>$'Fދõvg`dCbblc"PF݊^y}Cx}< ̟;;Vx1f 5sA$0ӳvWdIdL\ӲzvRWr>kJ^)vKR 0ma'ʥXPKA^_Yj5Xxq3Bg<£c# .Zl߹E )2u-HKK-,=[Y6Bøkñǐ~5:1][cW$a: U͘Z>'P6k*u̹s%o9EP\R#8$5$386>1leu&dG`a_ã44hBLY N7KE'bUKk螭8\FXo+LHEwqwbƜ9̙Qy "x)tκ*?ҋ ̯Պe ;1I9.@{iyCj~{Cjަi"Uw1i 9qCn'zD9Mp6碓5{= D)Dv"/H3INNX2z)d嬯4u_QU09܊)*򪂜+|&_NNާ%XsZ—#U/E 8%ј+nƦ]A&~_] Yd:ȑCHJu߻E{W_߆.?釐 N;W:7o ^z ghNAN Wz8 llnFrN)? .mCDr1~pckZCnZ<6lފn ٱlU 鈋5^qqn@Mu[oB} fK.0d$X>.14'ẫF\L2/(Grlzawɶ(!Ta;GɜYVY#p{%;`:!>1  U#FC3gB焋[#&(*&H,#L\9*"2+DߠVBOXADJHFLUOPO)d"*9T\OK^*u3STIaĕ3JZ.瀬5qw aLF5 >kJ>W_{3]p 3Q[QDgr/6l=0PWSz\cQQy)ԑG.>ۺ>r*+QF%5֒c~G+8qP[[j|a=D|ks' '(8-Mne /6V4t@fČ3P_x҃zAWw7Oՠ'++6Db￿yyhӯ"n7>x+NYx~^D߾ejZ B{eTm iQ?=$^ڙ3ЄkS}-:}:m܋V8m6؜簱I 9 @SXW\ܡqN\˦4gKETD " .RCKL߰LQzd]T+[b?Ϧfqd);=%79o!u `68xr[|j+PI <=~(!r4$4dՑOC1}"hk1cL*CS0Lig`\a6fLdٹ,8|%lH{~G0h#2[[dڏ&;̙JrNZjt .t1ur NF 9yf֐?gb\~T %#rV~t3Xfq3яNUJgDnf"&5A%K=?;t2{^z#e1c 1}NC]Zĸtu":&&rq>)i9!z֐>x3< ch"!Mnsm,IA0P1o@0 ~2l&9}RzD 0mP."$G2rU8 3Pn>)wJ).N]-r.o1R2D>ˆlޘ&:R2s"-_kWrzGS26%춐f*jCIt3_”iS")f}ՈM[YP4Nz' 3F# &Ok\ɤ|aA߳z1a"}##>ƝL]B2B\Iar`2\LS`دBZ=a(}"Xvf2kJ3y˜o J)*v~s2fWK.) (IY۬ȳK&~>Ox\Ə yw2AR8SH82隧} ԠI`*eJM|9wm訆9 JG.7D*ִz)XֵZJ*y RrO 45c(PD1"JP%cQ,:aD2tس|ag,a Mj$T,H:3x]bΜػMڋs;h&+WՄp$4،c'uXb1Z W!#;pN):P][ ڵNT#!g*Pst6lۇa.Z{ĀɁ+ =Xyh®'Q4a&ƏF}{jeh-v~_<&nsVVv5V,8v4g?#15htm͛!gd%9H7gh=b,]9yB ¢2h;,#4ͅJDR(jbV?.o`;]m!u 6*p0yI-rH$Cĉ.{%1 a8\F>(S!".ֽaZo,,ClL -[0 %Kp"%BwiR㒵K[@FA XݭE$.b(=8^߄ʣho:vT-_LcFXp`~~swẙyxw$Ę od̘ [v܊o=$Ec`XxU1&9)4qH6!!#O+]qڣuq:MfPECB{"n?n); sn"\K&KCV,.Q 9o(hJ;e"ݤ\[Ve0򙎼#Z(U:2v&L:ȼ%㰬pP;n'0M 6Xv=j\ثH&n^Gt~fD#u<6.qaP9 F\rj" V:X ɥFƍֽ_ 2'1~$55!#وypIF!fM"l 9 VK lV#kNT#C6N)EձhhBQxً &d>ǡ:І[}58E p)irffaa/N%euwՏ'1|>&Zmh>m;wЌ9KVѣؾHwϹOnQedCx14ϫgU /H]&Fg(Fc ]5Vg3+&$m"Lzt2ʨuY.EDLDxAm hCQ&H5M2<.h8dc *;\җ(̥TM?d+LM)PVvD]m5R'Q)YNk6DQA=%רArq B# .f_sani@qv4ѧ ' q" ̙sJoFMS>Xu#P7t JjB @S[  Ş.hjNG'd,BI\)[mfb0.}&Ʒ9m^΁ĝixiMmMdS"zYewU.Wĸӑ҆!"ᮌc7֞NbL Fȳ )2;gfdɅM-3mݤn!]K/E|q(Uhk/$T X]fQVShaAȁ% 01] HxA{A5VBSS3\MI[I9{/=Qeٱb)MDkĿOa; X L&nj ̽p<QGeNMKWI[6Ab'ר`JZ6yd9HPݞR,e:ZPk×~ШoCtx70}ú>b(**ʚbȐ!򸎀6!]U&hFU[5ڲ%ZQ8XU # UuC1@UlLŢ1 ֞zc]}U '2]B 2oF(٩$\ N"锦)ޜà2"I6N3b_l '+Oe2H̙36nxدݜ9s5z[< O<#o;F6*41iUDR? L $%(,ъn(Z]m2(X'C,C4ou A4%FG!lŤÐ |ZIlu 1ZME;0 aOPQ lo5a(qY>]$'kMliGrvS fdzHlly,lq/)CRW*;_EAI}iVupQqCqMJv1|둟?@ NbM#Q8cDžJm0~4Bzs!KƉ p sZQLI" D=8AD"Q<#";-xK6D:`?dH*ZvRІټ†TVK6-uB]] \Kudb)hVHF^֮[;˧z QSKvSpjuiũZ":Áf q{d{9BpdJ340% 6Xht$M7!괭I;ݠe0]bN8=T63^N2*Î{# #'.sS0-R3'uXp|vf݂c+WQ& Tiq4+vA~ϴ.^P1C*FH3-ayT-!c[9km̑D2Ir``zDn̊4#f6uێ&uRVC$f Z,RdۘԪp8Ut >n VɘdkI,aTs ]Lnd =֚ WU'H`&0 M̐la,U)N$$2S4bP ɻzzF+gz4+Oim=L8*NzzO}n]MALW5]ŇZ`0=C$&]~٠-]R-,닑2}~ɺQZ&tAny)RTnXZEk`W*MRghjTZi3 )Jӑb#0BB!-"FP~m^v{vٔIFO2K(A1`s Peq;Y#9tbSF,ңdwlMMƊŘR v/Y|+KtK4~hr!3Q "N:v>R{D ϙQ% / HD3-u1DTr_"< 4v.#x_ŋ紐=Ӣݲ&)DguN$JfS1YF"FUSAҍP|%o$0%RHQ3bɌ?HF7|T ӚS7:0~lڴ 7x#F DI~tvd9U!s[< ,Y?+H7 }Y̞=[E}iݣ=a)j,\~;N?>d%ef}3j)[KƚnbΦٸ1 6) ;IjTL^*h]A?U7IZ4ߪ4RIjH{#js0%vo?;vt&B9&%9766Nf"( yT~s^Y裏3^اņ Cahhh;aqۥbH~ҿ)_PP N̝;fadfflj޶,괺ZVaŭIZ4:Mӕ~UPn:dy -fh dH&ICuu-Bᘡ$zu9&P~tǾ|&566b޼y;Ϯ.!x.뤒4_&M:Dԕzq{DԺ7ѠITpŏ' r`B,LeU 22S^>IAy JkZofj $1zt]]lBMOd>`ʨo<0(:;; 'uP/&*@^W^u9S\HܚX:w/Z2& LЌPQSMFf7eqQ ͒Ʉߑ{ˣtE>'β7x#;ՍAF:-\#ʍ0eT 4(C+)| IfQn@LcKpOX:Q;.$cO-MK'4R眰.ߡ%%Mo9E%Wב6U+w+tmU u}EGGVZ;B\FdNRRtuyK@PZ4#- UKeeehJA6dʤYR(i-nC\bDq8mmPNAII=RHcш<==,SV*̵i]y||v$: !3$7 Qrp3ȹ{ZQR-!|] v ACSu3Z|dǠmR9'ːw6[[.3\2)7ߔa[Q)xq`rg__ɇ[7`d"A:>zf/i+ ʎXh0uJ*Ma]6mmU9AǀFoGFW*QX{ iiCl>%(U11YzDsϞ=iu>E! nV6~re YLҵn^$#sM'1e1BdN7#]cQ}0R>@4ڄMCҝ2uE'(YՖ/`E52nv-" (hpt;A%5B}R-Uje%ѽMkt_rgVer6$ђq:l4fd`Gm)+"&Ctìjz&HITDˬkc7ˇ[?diʿWՖ%hhA 9ԄnZP̡H?5h"qdѯ_? PD8cikḾD˾0,( ֺ$hkBM1_FLKLr{<6;+ih&hF(P+cm:y [$Yf*kNeb{<{NZ+ʡ3zw|;u)//gayHcu6N7T{ nO. hUCKTaO9ec,JTz]"n]$u4sșkKe$llPd Y1aM70u*,,~l~Նٷ/fY̜s}~I$L"f0_Gf\ܳV6ViN@uG*xh̽c_Cv''f2Ndx*=YO+ok_rZm L_#̇~yєFK؝QVLgT1GaqkYܘꘜ 67B'_2&d *Ki p;-uJߏxGK$ ա}nj-El$}כd֒/ ]>&Fq >#],#t+jhWA5d~0V ^meꏤwץ3'_"&xodx?^o}ZN)MqT$}\򲨶%4׷~,ؤK-yBfTPo-1#w}_; @tqAf⬰|wEu7d<PQ9ӑwaH!O3HыU'[gұ$.HaMVB-*77td۞}M~xl s0lxXtXy{Q>sqܞ n2jF6J꾜sCHyyRz{n]!1=DiossFr=<˦A^N~Pon@㏊,򻙞QSv{⊬+ (44SJ;a"ƠM%&əQiYC)SL@;VwCq0u]_2#99v9+ӹV# N|3μ`vgkSˇ,0A68,{β餢_~u@+ZW{-[d r^JOpCWhJ5o9stŅZ:i^x$(VlW!oL_%x J}kc(Y1˲ eQJKL1#&Js]y @?}{ ex\0fAEѬtII'5t/c#n:EΧigB~E<$5<9 3k4egbն[jvڭs/%*212ꗽỏ%0?s~GEb4AF}ĸXUMeD<58!.GWu~Vq}2bu刔b_zt~؜Wb"lJ oS|59-&Mii+2t>P3NVIpV>J~Ooᒪosq1 l&p%d`yD-4ML@y &#[uǀ n9dvX$bdУHNB 7]Z;O=Z yb [l$k=6W1c;5AZFEQZك uƒc3/f""?v?F ~5$_}["i2艌v%.,$-Ct|CK}l(2 .8] &9cפ]a u0L4t_0J3ٚ\DJ #Hϓ쒄iG+r<ID."RbZK)# :-o|1RDqoE}]CxC Sp]&WcHxtɪ"NƸUF,ϭGDq2Hc4~ Jwbz/2z/*tAO Ae@pcLJy®[7z{Sd~3}kPk hуkylpr[ ip3i/ DZh(e#T%!wrgVF1Rߪ%Y7A2t{e]X>h@Wtd[ߘ!C_jw'joXpb _M#$gqq,i45%#mZ4GX'ʑ |}4I7d8AJ꽒gH-.vo;yM\__ KYYumQa8RT蔿kYR3°7XAMUi:@3 #z&W9áy ]ݨϦ_ `jߓw8ANǖck^\*OIK47s:R?}vvv:&Y^[  swR. f*RP"Ͳ3+,~Hسy}L2.ZAU5;/\oO2l̢k},/H g2 d2DCR5C&h\kNzs+^Kl`6|͡UTE}?#%T`{k:-.KD~"JKuIpcS ;er6jh0I:g|ћ bl=8МJ̃G 7Uۡ2=ap'=Ʌ1rq;ߌpQx嚩vt2[t:;7fXp;E C3JAd e_bkL16=+UKkje,SNVFҩ5+ !cbPy!{ l`c}~ qeW6Ek:P8Tn8 goY?J|QdrV[<5D0TќT XPq[C󡣓~3/=@)Y&ܭD|ou=;ljєjIVSYFLfnʭ>%?4[inHCCEd͋Mh82}Qe L8q`KPXAQ/: up-5%s_nApYaP[{FOKQyy|0m=)f&5[ē÷q)*.exDN*m 8/}1yJBa5'L,[S6no@c$:f*b PTƑ M{t;ItyYt^f mmӹTJ:!r5HQvV ]+u>qdMg!䃬:u6L]=#"bkSv-m'EUX͹7hC:ԧ ֔ƞ"VeNmlS3K7oArV".ΏgJ7a:Cg"(#ٮ0lzʺ!͚V{N2jluǵ0Bw.Y$dE;Âk~|[ߏDzCB)֠DtCC/@'bhڃý^q4סL06YR\ 5z]e)(Xu]QIN7 @:=( 𢉐栞w/E 0ngB4WRNd',k~zYQR'"@MW1ˀMv@&& A߀lķ*<5PU^nAj*h v>, Q% d%0)V{B--q&4<,:!狕kMMXd;o n81DH"6(QbHaA3⺺6v&>TDI!(BJ?T 2FŴ=D٠!fU۽{H<ԪRdiE SfUA˔)6,}QH@ '"r]:$lӶ99쿓"njmi*Av .f/TrGOz/$KȽ8U%^%9PaDm`J'(Y[ 8? FC̛C)CҐ߆viKf֙e~ʊtƽvDXrth6DHDSAL] }Qb#OPPG;0MosHcq.)[2|&By0d&1Zfqt厰& !lcs]DFC4FTt6MVMF'Gr?29w(d@2_$ݪ5Xޯ@,ge0[Lsh)*ҩ~ S2Y/q `WuҦJ= 4T˚P'H_Jrh)D4̘FO13+~1d;+_BbG C\Rԗ t U#5Ge9X(@ؓh|PdNdE(qga l = Kʭ{\*̣IƤ׿`|'9]nǭPiT G *K,|: [jRaR9X^)0btŨTHf9>B9gtd&OrhtK,=ǾIcu2Nt..JIe:cVea{.H]o#o>tlx t_|T.%nEq}~^s|oy]5 V9uFjU^ rv1u64 ?^zL)qwxIꄿI Pl)9k:~ٻ>/541In/zo-g ;;iA7CTh|:^o1ˬ:~ug:g$Qz_fB.>6|ZͅݭToo_Х/o{^4%1ةMEʗ}G|kkR8oLحkΝƐə-Bj>.ud%ȕO& h{+:Ekp~ 2lmP׵#Xg* -ޔ8&x~XJF:W7<_3<wFpkIoZ]KW[7җi$v4}hڲQWJxƶ 6kGcxTَ՛ӯQmEPzC/ m%K\}>/}9&)tvalY?hip}tFAag3vmM-2m@sۑDCL tK BT97nݺkߙ{g+i߸h{_}r5:qތx-о$M H2L_S7# $ if %Q#>l|T%p; neTF>=pvꗦ^|Dq-_U?Hgw2pA~}4-B#G} $1~楰$RV ٺD;o~`lc2طN,-_;s_x rm,?"&OKc, w'ߡۛqG#QܦMuH6>4;ʲ F71VW6njޟ^޽[!Hģ{azB.zZT{#ԡ‰q9{ݔr%+Fw ;ܡ/%JGm/)B6f:4y̿AB{Y2Ez&3lkt%c=o9#d]x;q!=F7;<eɑ:E`aj09=:65MmP 7fE~s۟R9'ҶC% wq~蘝Ae'$xV :U{;vW˳Nv@*VSLPT&EZ48|%$>' x}yW?d2_Ry>dN Y}Ju[8vl청t߲)r,o2LԐO֣͉b'b;22ltNtw>0|[Z!fքD2&!8^{~L*ŋ1#2n8Ye}{5[T 37- 6'Ih# CT7BROD"Y}p;1|eRԔ2T]+[t1r1a@'?  (U{O_44(>E^^y+ .Q׹=&~|t#H Vvrgf䎈k#8ϐ;p*8)ЙUe#bkۙH):= 2i65JgbmP[;qۯx;XFJF C>>_3Cp*I;!\w*x4A-_ټs :pQԭ%0ZI69l~7ݷ.nʋ:)&sNRM<ѮyBy|}\ D;C>v87QD evRP $P%9,H}MaL?-F\0 "V~|KSh*7Bhs0+`鹶q8 T8 Ob8KWAܾ>'}}oN|Tq^Hm =\u1y뇿!|W,lՉZeTL[hxڪq =$2m^̌rlRm[yC~ػ7M{kGzf@ ՜ND$Fx \fO1E&Q؋wq'6ۀ3/<'!ڮZwp?Q'c'}6}qm&Sk wJ Њdމj߹֝ \X'L`im>}w,JK懿൩63u  7~zbb;H=C)yyUxL2Q+ B`t8znAwmj&?$y']9jo gKʪnV N݅Is<⸽l>sh~0}#4z|CI`Љ,YPot4Cfqg"EZa7m@ʼʫ*x4کR1r0~I и]z\IA>i:)#N^[NHۏ{SK&eLE!Y:(%u(FË_N'q\gd ]NfiWdmFDᡇ7+C3O.((J{*`X,vmtlG"ݚ!drޅunZLTfE ghײs.":E!Fc00Awy-ϞS(y6%JuGվ-L$^2wH,+ #&ɾI|j|jئ>z^L˧o{Bh]#O{íU*`Y~E˝~ mbY͟x|~aP K` i YUi1»IWF_pz]#1sn`5JDEwyoR=CiT%Z_@9/0XO\ޜcsu)*gT_}}Wz=Af_3:Jb3eaq|ArYfCDViQ& stc氝$K^K>1 8{AL4!Ɗf?D9;k?;G(iA] TO 7=^oϛv(2vrcuܹƕ9MF4Ӹ;m` nЛD1K+߄1'/"$@{"FN*b,v=.i82OIMx5 X$PlxZڭ.n%s ^<__%s ** o%ugrn |w#2dh$]] Vz򷷡SK60.Ɍg"7SN/R΢SE{}lH 5Zx ?L ~5F[Lj 1DjIh0M \P,G6EYzt vGg>[!g|t~~wR/dޥ+>>$}{Q~>_o,-;s(J##8ɤmЛm2޽i_}S|CQOdws%p+d7  Lt U{kG?PBhUtQY.J/ mG!ϫj~rF<ΞG/-=t}TC+Hyҗ7ѽjkv{yW,'y8eމa B^z^ J'B_ s9W8\34GpvD8ixyH;Yu7ZRDLKT:; N"+'#9AĀo4ەI|+:q[ݩ68 bqe̢zvGwWPkݸRuQiIZPCX368†I}8e4i,-itRpw8 dKj.Ö"V{^sf,4w?M}AF/dK+zOF5mɝfjGa~p#8t\σ~kѴ4уi#φ]YKLotztCNw:dR08?˷Wa@N]9ž0=5)=.'3[BWzcvet~ ˵Ca)uL4ztpE,t oJU-N ztYlH8'Kp6L7UX^r+ZG'`#"HVfXUt[|N%'vwﺏ<4aFc .%&$L&_CU.Ը!4؅9+?@,Dʁ!ޟ20<#+p5wȤ#(ƅT٫G~8) |.zO3ծO'V7 N/04#&U590fnJ;Vun2(v2Bu3C}vՌjR*[*=r&-z B|֍RQmyC yѭ^~.n.g4Ȣ߈~IH\?d{qO;ZixbSL4O6?mØ5N.9Ywec/mG-$i7T޳G''A\N'iO=g -,+ :SVyϥZxHOhɪ1D;([uҮe0 rẕ3%Fx\̛&.m)H)bt 3簜q:mw0n,姵~,=EeB[. `v.u*RGj K&Dl J`0.߭C].Ϩ -G<9U`sii9B"?e#&I3KO!LpRչh#E;z{IY %ܼ(sΆ[\R"vtDÝMyv?\*B ZJ۰jjPp-Iֿ}VQV7qrŖ wYOUR"jۛ"Na~zhtD/|1lok>kV;#q͟9ǠLؒKU̜ `k{'DSP b*Q;@jmFp!]涉:pOKV[AtLqp8}?*9mtaoim/&cWBbm#J8mVÝ~_b.R~w4mx wx(#Y k1 wQ {y<2vq/݅(gڅn\.OO&AtWNGY2Mm&LMJ8))IK;)Ĕ4ݩU 5\Vʫ(l/̭]B g^f>~1aes©+9I,P~aru٦`.8^?-,;>Z)d p}OP"27q;MBӲnll=)Wٴ]|]b9>I) =H>!bk7dH=OFsVکOUd CM%AQܲk[x c283ۇH LRG==gneLk:GgjɖS2ecck?;NIxG 1>|U|1F )wL"N؆,)FϥE d:UFE/])ѐzLtCY8 [AJAΠaE655YMt%9̬ES97] RQX%o3t))H\9Q&{xpJ (4_NeYan6v'%n" y_S=%X.fsvz@"nՕMˎ ʼhXDj oҜ<^%T4qgwJ}:{H9FW %uN!hT!a L&=3[toq?mQG@f7x0xVj60"/_Nh]{d|:}$ #g4껭XoG9} >W2ZciyM$qi 5a6z|*r=2H(بraZC78=.zJ*:0&/E`zOeIA~~*\ZI=W 7hxYG9@SA{F*':n?;ҝ9؉/uZNi>0KѺ/gDz#:AU +6CcG)Ug9WG˝ܨٖ&O#>*<8kd |=ښD逹#и'V (Ux~- 2)RFw8Kgc" X'Gq7k~&=X+φfZǖ GWaVTXcd^ط)+G׏slUg:pGhǞmpf{ uCAc8|Tլ1}<#yly2z+^4a5h pJr}:qe( /~~S+sޑxB-dH5bttxƮ5Q}=x3³M`iiT<;ào:r[R#;9pY_b)9%=~ 3){b<\:mBHϧaW-ˡ$?zn}}~N՝L2bP*zx! _6n̼%ÀR碂|jkǘI=9O?_}49.̉};)X gGN/,wgW2rPPA8ˬi31j`krٳ0:  F/#Bzek|K$Ce˷W_9^jTEC\#r&z_}׶8&gq̑?6i-*O{o>իgf>z5{c3{Iw}K:ObÚUV usC pY8d<|=L/n!>l əܿ}?ϝ4ui snm[,u^WÁ)Q(47vTa%ioK7Q 0v5NJJ&/{).*"++ϋ;(؏ f^xt̙CIMM%t2̻y%'1,>Ov~m${Nꛛ,_YͿnc5g/X|9ɇ:`4q8j][cg8z8ᄑچ&LdŇ1!,%+3uT:[LnU#N^ZvJ]#42zMv=46-v؉'^S^DeK/QSd9K{*[jl(v&F {- ;A.dddy:2%-W@(-_OYA6#n^Fa6I AfkkJkvT5A$ތ3_8@{s_`w,1F]~{M 9cOG ރ7x*^yR k&l .DE)3g5e 0b J3MMM1 ثY\{BNDZJfά\#fh>|BA(77ˈùx'pkDsL1YM$'=脱b}xkW//b#hll]$w &˯;pЀ=*jz>)JſXF8F6ݵIzk!ՇyǤ-.td0D(d*k:H2Pzh4滟Ѥd9ҠT߀>9zl@ F{k=zer<-Vu ޘ4lޑ=#"[$GZJiog 1ʠ7`b>*x_Gq8ؕ)-k;;%EcdvKN%-p [ ? +avbɒWTӣ&jqrpϽkߢo‡^ǂy3.]џȯj@H^j2{ O)_\ذ;B0sr;|o³G8x?-%-5Yf_^z >KTr>y%4;k)ʰ13?"A|O=꟬jio=Qhy'S"xwxWMKm{7N.sd2pDLiN )YxRn̅ZFM]IGyg[Q{Mw+}9YE< -|)9x*!#&3(ܙuw)ߌ5H)9~8 I'i+p9Vr%dVhR\)OM֬{tpZMEi>m%7O%oGt6 kXwkUe>^mmmy?ޏ`,W6[v5w c'/؟Ʀ.2RNRBWOxg 0T6n?I>~D)cǖ=W*T+Y>Aq~䉹}`z#̱ݸqX3ʕ;銣#rXza\3u,n*=|7{~2RY4^cm腲m,xa|6eo|.^^!c[g.}w޴dޔ$?+U;غKEyUrhsIJuEˢ]p'1o#&%ن ;E$|7gk;7!m)zYwIM)6՗WЫRT]i/L0'V bIJAyf 衣Uy#cG gZ|Q)G|-?ǡk`gd>i3bmp`SP|!f5BǑqIZ]-%\N YJG:uF\yxh,~SB g]_FZ"lyŷO 22!wD!g_QVZDPh8ΘejJJZŞ?WNs wBkõ׏ŒDK vZ{k.6!'88+.+wo%tf]7̷aM`͂cO-{P1o&LL)s`P"`yKqZbXΙg)-/l0{>zionWj-O =F<  AO? d*9>4eϐCxkFOM~n ;g7\pR(v @h!2s >l$|Gt酒64V e˞$q[7}7- &2s}\7m4fFBzzyU6JROĤi #]|-O(</-Y9:揗;tr7sV&̸P6nIp8 ^'߯/ǡ}]U7p>D97W;=a'&:XN\TRc $4_K?go?&\5{i9)%6Jx9%բM)8-Meri;Z9{6}VM#icş>T2>@zu9̜u=/2+WDtƆ<֔V!.>~gG;:ӉSq\9.F&O^& __?0=~}?o**.FJ ZegZzY|]_zhRd鏋`ϑqC)J\aP299\0ti`? ܍>sk2½>@[݋وH,7͝gAGɩu֪U݉1!'ϲْ`J0b4?MSy[tHHOSS#fn}} zB#s뭷{stRŽGiM:`73zP$z j5v,~@F~-CcW rp=r߭p~<ÓO-G>*i[eՁwhut= 14Vp29N&OAL((L=!8* Wgn{g?̘o͠3tICc)gSq g؀0}o 3al<֯Rj),eةx]$gHUM5MlCtT(oaakyy ?F&^?ڮ{hlGxU ;~n4tep3avldtBn|Q70qR9g_?³Nse6k݌/>}VX1]G]Qbhe W9Z+OOW;UuD_u )hIAG/h!*"ͺhACgOo_x呙^YsnY?_t%4j>ߢ.!3&@]??}>A&=-A}8x㯹 N] <"/w9gsS?v "8s0嵭892uT 9-uxS\TBeCrƹpPPѤ ne>)ع1rp_GTXC&Yj*K9xvU(hiJ)ZպQw]Kx쑥bbxI9[`tU*g~S<0vqy6jK9 z-uuimVVG+_Ǝ~|Z:twR#֖&[Oko|RR3ozؕڡ>Ky vZ-jV_OIq1MY-*),)MGEEZVeeueغ$W!d6IEY];^^*6ہ ?:~B.h`ρDX=sV6Q3WY7Y~V5<GG` 㼝ܢRL]u|&+X0.twR1oؾq#Y9z@ֹ,Zt= AMh| yqK,ZYf0jMBW[` -vJk ʼn|lɯwlv{^!R['94&P[%XxȂYٰ((p˗L~.ݍ[gN̉Ü<]KZzA^ނ1 ?ZCH"PV.T6ieРzeʜ*A#&Lur罋eD~W~t_]ږ`٤+ACH@D/ї_i&$4!CNg(ϡқ5Z;4GW_.0;.=.Jft;\b8Gf㶣Z4u&b˺"i@XSE~yn1\pY4\-xҭ6ZWoְUTw>>yGٲ-QXMxxUkcneOg.i$~@,acSKgg;{fͽw?n.Ģ ̿^d(CI2 d`\b[څlf nB]_$uP#omMgSL!,jSG[=uԔR۬ء*t;I}u*iO`܄x89S5F߂2\ܑzqrvfe@Yu#Ύh_ bf/a>>E >n`} ݼI;}FX*hm0M3&N ^~-~1:ʨmhBUSVRNsm9um^``nTPr Mg/QWNp`R3b!'m=89*%/w|LESC|};G .[8pw,Ză]Bc{ 񣦺/|! 1t4ky8_}~] n09YY7^g_oeµд޻O q1hmՉ_-9]w9#x"1ϞÝ1hoehBM=T֋6hm<.%9܊F/#Wiin^(Hܜ4עP: XBJ,2||},F766EDn69òP_G8P(1 -Y X5m1ex{Q^^./^o['A؊6OWmckX;8qd`i\}!S֝!-44u]IZ~|MBv01zhl?^CSK ^>(t4U}ns!fgLF=-:f#x!r>^n :qrqz]Gs!͎]GP92mnݝVE5TDaa1!8?I9[ )竘@ {!'N=.$$?J; @CMݚ^TJ--(t[wK1K^NB9rrE4uɀh(h,[YfOdx_`S}u{<6>/? W+yIg~T!3|/1z@ Gȓ>̮C$ǁx9;ϞcTu[R,y͗NGjmnB+^[-V{6{{=j5٥QOqLA̋xN8Bqn5Wa9p6:@zkO_|o}/ze#d>믭  mw+w䑽|*J.pr>3ӫc7@"E{6.N7zʾĠ%\6oF]c+f9TaspZ!,Kds1Wg%3I{`ٌ4+/^yݍ`b1vs`/9u,2""0ڸ`CBwŇ #&2qJ"+r-6vDFFe\Grplky70h@툉AN Zqph[I׉^J^z$oǎ팛uO=mv.<')I=H<~bLB)!xF0j(2[/m;U 32&NL(9}w]d$-(8OpݜZV;p69s46pAR҄oNjJNN&eeCbwUR[׫7ē<喻 fYsh(?Omc{ߤT8҇voJFF.*;oOEOY|% ? Q[c>g@7?^[z  5>?<^~r1sBn(g3. ̚u(IkO/}\TRa_gQʲ'wn9f\;NTnˆ}MseGaTUs^KMxxr>'IAK,x9Kyw?k""+ | fmܬy8GhDiPPTű1pt#6N3A> Oظ 'LBfH\•e+RBٻc+ 2$ l%uWɈI3)pn$. tII  2rr.\?fxr!UywV3vձ`:w{??x/?|ogWz1rl lضugPz?{ן\kuL7/kJ)Ap!'iOlLOg B땻!yq_yq9u];rQ? ܪe`kHOXS& a+-DFEZC| _?QRQ8z BZW`-9x|=]h."=pFI[Qn|nF@LFV Fꤢ̇u[vP:1gT>7ϽQ(W{#*=,  Tߖwk/n,F\H >t5^TNV?}{5za9b= rtZlJ䶐t(#r ?hkkޚ 1 - ;^d[’}vJ5_%S;%Տ{/7^?*gk?8n5J/g=O/:Y7v w>>֠(LAKCNq-*} Soc֔! 9I,rϝb|n=_ORŹlݱ}9Rر 4mklJ 죢YX ~,n?L|[=sr>x^t-^*GgZ0N;V~!i(+ī/=MIyCX+P(>w#᩹76q$HW'_W郓/XFøs7.6E1qmKO_!$/+N/C[Gjx0ͤE'r'ň/29:p"߉'lFAaA>ÆZؿ\?>49 .H^~ ªUqR)ܖ𩘄 7o n6v֚%%eACX\]=Pw`#ۉPlm$CQt:*Tz%_e JJ$1h 1o2K L޵ʚB6Pǧ1^x G->Z ]BV}Ejzg`oqeDX{?w7cIS#{eּ Z:pYXrCo襵s{&]A~!ݺVYZ@r[r ?is :ik,gփ<︐zEcWR][ͺֱbdI $-n᥏mQ¾#-ƆƾF1Iߡz4:J56*&zVo Z;:$ g8~%]:&vfck%t(v %m{pTy﮴]IݑH!@`Y] ;!6IRlvҋIF M8N"pmb @I+v_V{tϑ0{6F=͊G30w<zGaJCy\>w2cƨK475H\Y/t X^0gՔ,YG}'cmݣwGNZJ ۃrqPF~?"o*,@3>"kWΣ 8oXΕW5+)֭#,T+B|}I'۫_bӆg8\{ oђ|9=݄1׍=p;nl`?EL5n"n|:]b&ea9>vt:/@S"[5gŢ9l鿢IĀ׀#>66 ͦ’Ni=nVfNZoԱ0 ʃ 1ʹ?aҔɤfլ$B C5Μ)gBj&YS'rq!gN ΀9TU'cr, ӅbC[]^+> i`=@RrR*-B@ !F`sEltV,`/Qџ.;=]lD8cZ΂BP]\in%^ PACuJKxTUN}.E_c%sL9tL0-N]^`[!F ѱqث\a%CHʲob{xrR9DdB^ޛ\ֶIt:1)+Mb%1)hLy84FLB.Syij,]64tZ4az=54n&feLd|D8uQ^9.:(nV[{,~l9ZvB!> @j?t3AIHnɜ';#,m&_09-4"t ŗK|bDʏ_"Eb')⾼/`K9ziǃNw{^LJ^|+ e . 5n/j@цheD)Râf-Y !^J n3W3} 0yp{+eU1˥r$-csS c ir뀖E,?﷥s>ݦw.c֢ɅWȞ5z9!7BJvGG ZC7Krxb6+g٫jڀ㴚tX-XʴO 7۸R׆W=_o;;rC+R ᧦W+eijT9V=9ÔPNLLTA[,ԮnV+-h!C ĔN]'6lIǍw(țLI\Y'c 1Jd`hܜ4W[;omUy<hv̘lKڭ=w\I Z!\"a N ƈH '&pr5o<5Ni37yVrpoDŵMNIf$sOGm#mrRE݇˴4rgw?%Nz#" QzkS&%twwEԸ9AJl&<<͛7EEEbB!F2M&j׶TC:33SBp{N8Fgo͕4X%g]]]jB1/xvwq8^lC[^~{=Y;xw}N{>m]N<?^w_/ 7awjKB997Q[y$JeNű]+f|1@W+>rf?AkNŜ:RKHTV0up-jhLZB1BZW[BNa; gbfδim`ӫ`oQ9(Ţ2q,ZS^Фʳ !_{G x]5aUz=F[Yݧ=C3hFjg_%k;C5ok/n&IENDB`PKEZy>GPKy.F/angular-1.3.9/docs/img/tutorial/tutorial_00.pngl{eTM-48 N݂ 58 ߻?zt5UէNs%}@Uda?[*:E>oNp]!$RB*nYp* CPdb4آ ӋeI)ވPaB0jNֶ 5ƔofcY:|PD~.I@@e{ ^»A7y@C|& t^O`˕ɐx?c]+R!^ڒ I Z>{@g0?: @Oh>χ[od'kEG^sSP+ /kczJ])bW[;eAhzzt-A5 V?I֦#YPN$3"/CȍPЅ$d E8indP04'V[_|Z)Z.rpLO4؊v; q8_$###4 I ƒGI~ٵIJdd\#$w%#  _fr"Xxg0Zp0ԫUČ1Ocfl(g2ۼ68_oSpIqmj־F$6vY9g!Mz6YRV[B~7VPo)k"'cP0 =7CxyፍwoY*H#02 |FS4'pZv"{gX?|b˖э,4nm' |>v#|0Af:˻*azծ3uMQ4%LKBVcS*j.g&U}wިV hdzU`0h kBtG0pJ~T<9=$|>i{Ȟ'N223ýø]/:a2~.$mv΃c[Gt}fk gbFY 12|Gi>i~R UtXzZ"v }`j'~&{]ɽ4?N\'z֤]Yox:GDa9g#7t$EFX{Pp/21f#/ 뤘4$[/N_"ԑH}}XbƓX٪7Ӌq2Io~gF'GJW(-л&ؔ0TVQzz욹ncrnUƦ⻬%Ky&笫L11e10M:-VHy9Vb|B{YC#3uc{Mn :yKwW֏ݕ*зA=y4ݺb[lʱyh&LcLdj=U{mC 68XOͶve6_=ZM,*]c(yNGo^sH]~gבmicrŮT'ީ[;`>Z @qG[ˊRREԐZ>B/z)xNg]9`俻BEB; #0`/<_&V`ǂĘYhRuZh&9iꬍ䠘aMfаqyA[yV'^/z(MްwD9rD[9H2d  ru.hXt]45|}#65ɺLS6ѓ/fַ2a=o7@X94uF1L,fov#P3.\1~C|ݍk:X@ۦnVi߇~K_cRq,c~:ȹ&퟇uw tvz& !VJvxNE|v%];(>R*^e# (N$Q[~J ?z7BUB{|eæJw\,rh=fk! Xzo߉vX8J\ =#̭ͫ![ޯݙ:x:ѐ45!no{jӫr+(tzi&nxZw˫ Ze1j4Zj#:2{z.WZ/%K罰=[m<@J*xa?ؔ[Zp!ţF6}/`)lدppOTuD.hqFoVNI ̐2U%}cʌ-G"U *Iqِ۬vN!kV/D iPVqs÷r G>?2?ӛ?{(K w)`%PdxHҮZUͅ{N7ÉUEHb Ï~zi 7.QB1zHYvO^ 8g+ 8`Ĩګ*A[_:RP{[f݄*G\{z1rѮ F^6☺{;'xFabWmԪtҸ6=4UbEO6ڬwE{ju19!ۼYe̼'J~?t/[Η>l!-1Aqn%I@]jXRpu>2[zGǽHƨUQA#Eq}A} }bn8Fo[8UZ^'qL35ڸK"06Bnى~hMNu n#)F3=]lQ搣:o]~AsYm_ӲЂC>Q 21&]:]&YRMd5vyT2IxkE x rLz/ݼ \_EZ o5Kߜ) mVLwhC!T1WZ H]%HRia7+tcG ގOLZ}0CAXA-] Ke*ɠQbZJ8S_MnN/eU+E8&t5UZnw}jtc5pRFz- wfoBzqpEwGdK{̇K|&/C'6,Ao]/ ~vd&o4Zvo)=7@Gww!5$ry= f({Y"G_NGHn!m eyx'Cwڢ Vrg(~ ,hˑowꉀXQy5MOEOQyGZ&Y|y#%2v,-2G-oŎy_u$¼g>jA$~7wfz*B>@v,~=:bJHJأਏ$`ҰMPVd6%$V{+W;p?]BcBO)$%m ']@%cJ38ATHSCn@|ƻ ⑳VC^E=f'#bChVEUg¡E^ [JyE#*nXa\K9űW+WH V"XTnmWْo\iN[A8w'*@רCqCI+}F+JAr<hn9VMY$\]Dow[q~OjuU]w%"9pt{U@9Mމ=;!sH=a *\*tƏ|eb*΂MÐ](ͶRYUDE> g. nr\ǚ!L-{u{\f3 |r{C߿yZ+@ s!8HYͫB%P)Y{Y{3(b<Œ!Ǝt3SѤ=e U3R:{u|'iުpνUNɑrDZJE^nf𭺠E3G6W#XYAGT<ۀNzxk"}Åi54E,a(VFItP|tu-2֙OKN?/^tWǩSyޞϫ<r<k]^+eRg#2cɓfqLݯR)/+ cw\]gaFGnOXX%/ {EK R8|1q(uL1~N{s!9cKZ:SV9n L"aK2IKe? V;ïH2CIa̳MoNu6%^Z ͩeVqg+fL@\Ywam6*.渒 A0g$ź>^ǁY  2> 0LIިgrZg$f:ysoGl&cIhLO6iryYO.&k cuNi|:A.`et_:\iu)5`3h1h`'@DDlSI$sXQ~" xt(cHD&C٦ey^]!}$nĎRKfڤVLű;Bwvq^pb_crXQآ@ү^\i&!qQ쒈J=bz 4WqK9W&=+WG#S ^Y$PynzYIu,__KuX^N| ?'.jFR{ z*jYJ: "S~~o)_vc[9Xf^G1b614TVOWZ;TZ?DGe`p-QЃs"Z((Lȯ#~MݐQT;Vÿ&tՃ [|ᛦv3`Sn 3v B+1MXI;~fUDNi _5=F\u&z9ٛe+~MerrBU Zz;ϛL#nLNq3}mW9#UC&EsGO5H&bN7( g┖fWI?~gfu EUB}c:ru/k(]YEw>ԣ.o$vuۖA5>3 x6/)R<:Y fyA.W5M$iI>.Zz$+`/l8dWhk;nId/*-J3B;M|uuUFWȱɅgUŚ`zX=ǦqkLCnCycvҸ߾{AbK Ua¿ì}ԝs⹳e N X,5{ۜav L7,$2DT6B| b~ >_.}©Q1$C;,6{#[%b}B/Z$N:۸k~WtIM8 )fe+h_z د%F,zz{Uu KZz!nB|؉踒X'mWs@WYTqG)V8qNu _9Vbbt)^?#Q.aXR˘.C}Guj{$LF|Q۬$XyFI= m/0KGUJ8׼*ddsVףݣ ;|Ҋ,TZYsJ*NZ`ix^g{_.'IRȚnE:Д&_3i`l۩j$ ֓Z-+֘qbW[c?~czk-;(S_x偫4,I9r1u jӿ"ΐʭ}Tku0Jg#glGJUNM`+xe5 >-2+fk7p^!+zԵm=dt0fQ{בZwx=Jfy\Pgpz~_6A#eMJpJȲh_ESz& p5f݌!hm}TC0@k%]9eS@ |ACGoEwE#&fA#4Ųtՙw e}nJBŨk:1Jﳶ^٩i/3 K`~S(6[5%o@XLYH0@|YkaBN@CRC%\q%AY&Рa  -f\̗" tߌ%;mxN)[u IޙkCYѬghǢfz!렸5~evfbAeڝjvypY3B^:M~BEa6'P(T% ֯RG8^@(8&qq =bpB^}_\{x6JmuQ:8ntܭ-Jh-sNIJ}kre:yLj߯XFY7´+Y/3-mU*Lx˼Q-SL=tiB``ŋUЦIY٫9!R âPڑ]RN9N+&C^EM( &M2 ^>E=l/$ŔJEMg@&ݛ?G oqzkK\TkIKVϦ\vIUWow3mYܘ|,4&"˷ޛ_</{/迳 "f[U0$tHNaϬm#s=kG#9 l0h5[frnJ,SٸKlLYOp6 cEL;\{!H! qU{stݖwiU^LfRuzJFףJ*8|OkGO34Zf]VB[xMvcyJo.%QK/iMʚ*#nVSz$38DC,kD;D( liɿ]Z˾'cgleY20| aa#f* V弥f{B'VNǣw:. =n4xD0mOxclt 4ԹR}9w0xxch) :eCde r<پp}OCւB ;^;0xܴBLJ=>=mzIM̼_k$"F4A>&`L>*FOFJ!S̮T̥$O''mF!m, IutxXH˛eWgdk6m3 H_BZ;Iy{2hv鵥j< 4^nhh9G |woŎ*+(}'f3!C{*w I9fvc*E diE^XmJ~~LZڹ2Mժ}g~l ofuU>+N3ꟼV·ȏޛz7M&665-:ufѶƽVHÏ{/^v }\ߘvȍe1=d8!s?'#ӯ"F.Q?_# H s\k a_l&q/LPhYW tzxE`MՒ L;=d=2{e1w|b|~bk WT8-d*kC(GtR>ZHcmP(y5i(vv# ҙ0Ћp8SDQ$ֺ}ݷ~Jr(]4 /ngwXokLgș d n;2֝zbU jl]Q[='L>3E nhk|M) FZjB#'biwTvnKשYө~W *jTM+WF43^TэL9=Uߺ -a1yʈ0񟤣 pP[1ws. ׷Oڒ>fzqCGQ-L2n\ b8b,AYc#3 7;86_5w<*u)Ao1KԸhHY szC\@?Q%cHz`,Ylf 9wZ$ק"g7MBO' !+(,AUHJ^䑭{k~XyQSHoGA:Bx;mY"X*OrQF@'_ V;p;j46ܥxG u+QlU7i4I38SUGKF G14n~{}hIh?#xW֭vیL{xdV8vw8US6:l(iIAQI`38x+(^qH_M䟇N,t[]j{[*wݵ'xs2+%ƉbDStj(LtE~=2/i~HR-TI>, &Hã; rxB߂P{ M^ɛ"K⺬#,pMJ+[,M%h($VWp#uyŗIp5*w;dϧ(\諎8? kb,FiC%^p&M.T-|[E?$xGEq87YiRf0 8`s]Z[Hra?oHaݓ2g8hǧ⨉-> %S!OCB(+J2Df9Eusx 9CW4@hb6o1rk5>wO+W~r1_@ #e4?⧦KSU((}~)0D*/]h.dnp~KSi@ GULa%Gv:U)j,'l)&aЍdVnP)د $_X&bCn|Mu9&) _6j_ZQ]794.˖}K0{N}ilN*)o?`wՄQljrɪ> qclO&Iς#FC@D- o:-p[2 uf+%E{"~ijAsdYោ:$lUh%JE06^#;4]>/\t Lβ0lIzF,D;A1nWԔj`_a³8c_u97U1pJĎQ;3a3htӔ KZod % |^Xe.{a=2Ys{}iqޯPMܯicWk:k!M`@oh%yc߂/|LJ!デc=^FyFe$&'P4b#m0CzFL)@]-bpnKoCVϽ4S*ܗGF9љli\×W4d6 ESlbaO1&8Rc i%VJ_4?C%',/Irav0_~D09>*L!K3?ezĀ'+Z`R P}+ J\[\^ F0u#a@m$ߗuҥRiizTCsYr 5L (UWgUҝe\9BrEcnrNϴOVeD)C6^v}.$k!"#l͔N#DjU  #ϵԢ3x|R钫՝ڶX])ǾD`HB-sդ8$d ;9P9$HUF1lʮ+(yiVYZ|M8D]_^waBSdƠ}mz;ͤ%'&Kqe ℯb۽-_]ѲoTjЦ]qq]Grr٢sT5Nw.F%"gP8"cK+:.%e(ILʟQtq=Q-#R"[á M2EҌXco"me6P!|ҙ:1 "ig#\D4lK :yws&6S̲'x<[Y[cR&? ɭ t `8AFZ;)npxf};rr VVb7W57O+xv%}q>`eJ9׋&isT60z:kq35VYWbRޝRM|`4\^_*]sxՓ D--@˧Hi|y`AO-q (M:-tyXzN"ϏC ge1W⿯@pD6Jgm$G;0A%tLje5M7H`B5֢1\rn[hW;S5.꺦' G:!{0TB6/~ZҚzj-|*y~qE}1/k|0*k),PU#~WQBo=è,k1np*-ѓH')+&]NÖ́UD䟭w3->Hc>Џ4kSXZ[k8%0xpSŷHX鰘޴7({B!P2|䒞kK/_ Fw.tc|da O+{d*;TJJN @77WRm]٧srL>.7o4^V꟒WH}$YoW[tѺ!\{5!H,xpwi ً\pC7kUժsQoHJ1W>MAuÌYڏq&D콎9Nk` {y~Fɐ)Q顎'| dR猘RY&|>1/%VT!#6UACI1¬> lYI_lq,4   IT]/"9-Eml3)Z6 ] 7a_Kh°EERb f\E6©p&Bxʀ'~~l^z%R"qbgX@ޯ`igΐ4vN%Z軙JSiK}0WqUZRJD`iYߒ j-nJL36 789)QI6BhBSnwx,B:)^K4 % N6-L/ °t(b6-+h-R;ͥdЭx {CTU_7&Pch<G!Iu2F/&<կ (j\T^O"èXNv2RZ,f "U&f=jdtB?#!fg6Kr!߱vEs>E,k )<8 G7#&nt2}΄:4`h+FILOZ? T QΉsIpJE4跗 w'V)q.,z;CA?[f w뒅 9?+ ~PYh[S7UD:H2{wStJh /;$Ҁ06ÞgP!ӤUJeNH~&dm"Rbv+` zz/ S5IMˉs8/SQƀ!w,nP%=4\1%=/z9Dal H-qNHH!a<}u%5 '-xE 4f)Et@C*GRRr_ţ8_glj_yD 7ux$A@]a^xէ8jQX85QYw#p;DV} :v, X L Gu*}>*^+PJ"1(|)ec؊Bv3Vܭ~] +ޡ7A Z"Nя7?S\5E56vlf+W o?h b허]uRH-ڽhx^.z5E/+N\]mG\DV7]utC&GF^B;˭E@ɀ3/vJHIIڱܪQv^^YB43{c@G\ rX.>Vu2s'6[lĢ7Ǯܗ}ʹ~#8/l#),5dLkUDڻ>eMt֤O~tW1ryc=\W% I2J֔弧,D&Wf\3΀n?vocV%JV=w`+@Ţ/a~A1yסVB֌(7mVbb{2`(~QP`Rc5W({uab9TV}ꇫVo3ʩEg22@a xm\i}>'Җ!z:lhs h+/U*E'}щfԏ-A .*J)|E62oEɹt\M՞ > !SZoɎ\I&I.p\n81 bWVbܩ7TZB_kafݹ8Xi09G+6x" ehUDjVtk} Sꓺd+c&6P TGP_΀)2 jMKPSFQ \%3OCBIۤC"!SNY̸Hp)NQj'GS-#_Hjl<"M`Qzj &qGjCHuc s$n<60#˘S։|K xjNO$zql9 WOpb=eDWيGF@Ut`ߒL>cA1=ʶDA{}9w>x:9NYSf/MmT}( jc#ς]fɞl6HT#tPgO)no[&BV")D'`.M:$8ZU&2^Gb&+ ɽUs0nQﰧ8m> "yb\4=|ѱfVX!~@"+'5LKI=x-ɭԜsjfeZˏ0n:)a1AlsJذFMJܧۆpjXX}G \MQ٬nxGٮ} 4Æk.[ֽޠ"9y9Z2Bڏ4PIj삗3 P~4JUSa _hU'/?( B >~jɤ N z#OԾ\#tT' ׻TЍ9OZ<@TDOf~{ 䓩 p'yղm%gwj~,T>dk#("M]@xQO!+@Lc̔$N9 w..燝h?U`]j(gî40ZzhF)X It_y 3ED-KFAlEK:WTUI/ng|]>6B0a-jkOjRYČC>V %`H(ۢޏPa9JW^ VWDd졑R{jL!4 VWF Gl?N=$D& {h@YW|Ҁj)cAagTo,TD(5f=zk.8(]$%cPjF{h:N5KGsaF>kԿ|~PC4Qyb7 6,ùgޯ ,nx¼71, CP"~Rp.o* Dx~t<{1ozDmEV\!l.+&|)D<^1`_w{xH0X^.eJwd|~?4.:<;4n-.)`erbt=!|?fL3t3ޮ{ya[ u /ϴn{q;#<)C{F)k;r70u[I gQK;&bLa}4Z-o pYٿ=u< tޕvw>,xL)7s*DQ7y ۴!` yԴ?(g(uFOޑdXdҜO~7_O :,fKȉğ^[VW(QU e֥'pW"6`Z.@٦#|j3Ngo5F_DzɷeL؀&aFe}!A-nLM_ k :v2k7\+m?ʨ+pT&pAȽ Q_0%)"R ۣ6hmFfSٜP}~8jv.sCguB R3},rtcE=ݥ&h < 8kd eUo,AHEi FKwӲmNo*SP{9KK?V[GXu";#X3q/.E,]/W71:AU`]] lK&b?m2QVI*aM;-ˉT˞n-Ӌ_}820l]_Ap0l*,}\6|ru^uQcFdUk]j6ڪībP;/0**Kba/X>wYI]TlWعM OHg:iE:쮕5LU\}z &O|bسݲQķ:ss{Sc!Y5/M>r\}ИHjI("CN cL_=BBIi/Q꿕ֹ>My*_e̕S Co?%6I]'+AxiT^ Xk8*A.[}aP7o뽞PKo1,qx]кS&7B. ;{C~bscP`:2b7S֬컷G>nz0GIv_j>|u./!L1&bA!ɤإ_͇1#s8e`z71S=b&!CnGTSF)&]`;>kW`s8x MJ^& Ct3\ou25mx7@}%UE*d~O; mf?0WҸCpzq%Q*k uƄ(ZGjHriߨ͍],s} -Kg:t9H^44/T+j^ntv$,uglkvW'Gpia^aLǞNӭkbqHQ_U^ ;{XyQcÌ}l"8c 'Z\Ԉ3B1ê>5%a\ =ׯ_29aevǚoUc4^`פh,oz}>kl&¹w~ *s;0Tf1C"c$h`{i2C~]F@>"@FQm.x 3:z<16_`ւ`aqaI[yyYyy9&#;;?tnõL|`#FDZ(=n?߽*[SFquwܟ(~EJ u_!>l>>i*f!͂#c=n1`"TP>+puGswnB9~eh̵@6)bT+F1.V60Ti' rN% ?$V !ں3]8{l!2[fC;M+R֋bP`d[o9/0isGzS>,V<*#˴ "J=%?I}3k3Sp9ˮ"|Щ 0uB ͬrRO[KӍK"u6P~8SҌar'%t+ ~.E< BվՇٜ8nRF[Ȃ }[ wk#PlŃ>m*6k^rn͆,9c]qBy3dӥ9$,#c>?zN!/❌d..oR}6D$)h3_ TgC}q4Bp63uKcr3Ip,[_߶L3^6`Pz=Ҝ2f,sI+"J|.LR =w K"Cns_rH;th YWEL@ >ɟJs X0?zK : '{} Lf $ض!xZ@,غepT}\*Pf;n'8irUih]&U6.d=MY\7L7N=CYCKW72 ?dCSF$]e ϷE㶲 O fy"rs7bLp n pPY]뢂X&Tϥ#]h`, Z܁mqSLc'PL{KyeK%{OOΞi;-bu[5\`[7D|4:(擁$?Y{)FA'wU6~2fu[EF8ƶ(E ^}@ 6<@znMg~>8,W "kmύ`6J?ύb%ޕH[B#IFӐvNd?@YiYIs80HRZ?…p8d_Ӡl^`bp'KQ'5;0? _,0լ>?f}f^(K$i7>ƛCN̑.oW8DYvQ:5Қ L:xQA*b6s3p Hxx'^G`A$'^8Dyq@,r7=z1~&vMx9l߻6to(wL?me~†Ҟ7\c]ms'8)![G  rT/ =! [<-Y]qw |F^d%43涍AHgv"&&N8d.[[-)d"X R徑L1br_~"cq(#|;NC}'&?[?%9I]kQ&8tλ{ "N1f;d7Ie>}rNwp/v92.2WGY[cy+&mݕ eܳ^Hq'}9ZkT@(z;@pwV2M뭊y=w$wpuV?lEI3W$cr}m\F?P۳} jݑf;1ߙcd ^/ b sߒ 9 J/@pkf,v%"pٹ](J:瑻v?'}Y\쿎tGC"}70.9uF%)5xCVbC$*d- "Ǧ2 h~QE9F».T$=(xC= ;bN?H@mޛ$.0HfwTR(~|^G6Dhk~&BZENX5?Ŋo` 4C}rDd,TqbA6,!ڤX6 z7WS-.6Wd"sr%w@1Јkr@[ocdr:z6QНZ@D!N=t,\  `6L .M'Q8Af/ r7J'mlCq um65k)H;^m6, R 7䔴x>$$>R7A wfNs?a{cQ4{~wHaGOrݻ0b-2{Qk,$wjYtJL" /Upr X"KB`a\$M`X#Zp8A &%F|՞N}h]E]ks':ƿ(N:qveM'pXp]+v}NƝB$=].p<Ј 5d1kܩ}Рn̛6pi+Qa9ZN$rN0G27ᢃx$D/>7m)msD4m$6`i÷? 6`BBx΁n E9N΄LZ;3V~e;t&9D2slgZCWv.Mm 撙d6KcMk>[neclAEc+UKI=oU׌DS`~nj>-MYэ!^Ď3JFŪdR;%*rff/tO{;o^BU8,$ pJ`L]J ܫ:(Ekj=]qeP h 4Y1ثݹI쑷FQD\u o->]*pJW ټz*ql0%{4qC}fAXN:,n]Ri1ZX+5`'50 4E"B6Of|QS:=cR8TIPK,xzPKy.F5angular-1.3.9/docs/img/tutorial/tutorial_00_final.pngtcp&mvm۶m۶molۺ坪:݇}H9q8hlh 8I % `Οϛhp)))u.8F~uQ"_08-N@!BT9tah}(nR;'Ν˞ni !d!n&|c^ه$̼K4FbVK&:*(Ի¤~ޢƏm8D_. a2޾?*4dh]L6"ha HaSVF[!  46I8t xqz:tǁCF,$ꇩT0l"J <62V+D "_B/t`JiܷB׏ /0@}z §eYS՟㊫xB*K"C0(5f+NgofJ*:eG}(}iPԑ 0|9rDb52+^Q6hLeu3J( FX{% V`^@+z na# ըJüdTLNgLe:p .Qbridarv3`&GqnN qĔ}@X!xoX"tPBo@'e*!r[+@Be1~}Q d H>, &&;qde=XvMlv_`G'''jUJR"q"elb5RuEWMGX "t+]`y˓{ "TS*A9~ OҘuv(y|ߗ BQuJ$b`i ALJC#3NO34{wg_PWoi =RԦi`1;BTĐHNNMōx%"JDI.k>300FQDx@tKt.V0C=`ԃغκ|D9nI,.FeF50&Uuϗk[4`izs굚kXPA* 戎y lj\ w$d7JȢ!EE\Cg`zZk}flۛRh L;I٤eI OF1KQNI†/?v7 N}SuDjwW(G, bX{PLPsUܒ.zC%p[`jr ~}Vսf/};Y|OXZ!*xh2:?(Cuw_R 4>[.z+fYbkO*>pÛL]eeRC1^4^ώYik3Լ̘ߊmڿu% Z?uC{j(lK D-W5sE P~[L[+1至C);D-qZ, stpg5hvf z_{Dru\ d! [u|܁kHo90'vsEҺy 1 TNof-elQ!|U/ͺE "z#3i"+-˗-TޠOFEΙ#R ѱ ~#{$7Pa1g*dBww6ٷ`+&&^ NC<y(X6qC_d܏%ёOwl]l#s; 燡ynvykf_qOӥ=hgW>Ѯ\dxwѮF E(/SKn~NopwyyހJ>74WI* T;'a: zB$U؟~YLEr|!Fr97mug/?bŦd/ɂDbT+5$~Hs Eaڨ<V" S,6co0oF/~,FiӋr4Ea4<-J ER^!(iKqcw䄄~ac֎c974]yg\xl T 0; 2T̯&scw:"tnيTeG¶ǿجXJ;1 SyhoP=P4Շ nv sOn3PZt獭y)93?] ]tg9$Ma"Lj5!ró W und<}nRE7m[x q $Ϗm`[,NAl[ @VFcRȁe ig:z.BJ w- 8ba|zLqǝ6xj֍k8RYqy|9m E^c_; Ԝ\.Fն5Ld7o J&2Z҂/&v5oh, 5iqt䍞aTb;2HRⶽUSNMgACwcE4= TRUGǖw2 ގyf+AK#SNRL9TXD4䫾N/;vPSFУW?f_-;DR[-ޫI#MWZE0qN[P:$^A^}4K$bR c@Sc!gOPdOL7ׄK2TVx_26"BA254#H#-ہغNO5#CT 3ۈ yF$Eз{ k.ěCN"[tBp\Dk)cHؿ^ۜ2^݊^!ѯ}Q={HCoF mm۠3474,WGo0)tYY{;FOd:3#`#>9 bZJҪg ϼjC>m!r7 ½(ŝem| Z0B1VvՌa3f&t蜯RƿBnOF]eXg*/'J, jwv0-vp$=!ǴONd v7q|܄-PKSyUYUc֮  {Q:E,CpG<= i$OzmL#_ޜ5~_; Gc=굵eRwBmv]y:FC,y6 +rGdߐZԹf"ޡdEZzz~}C۬dDKWD<?" SOrc+{OƠD:C\ zwN?9c6.NEښp_R0Bo+u_g<"bT} *s!ӎo;ߍ:kOQ:wAbNOSOg(@ԗ*QQVu5qu4zgF;K{cHǛIiG9DcHsD { 0٣}8j!ۗ YR>0 9`AɊW䚻fFd#f[ŕL)#gX&h/q?)(8KξzZpު\i b}"0i}wz8|lr :^Cn忚u1Ժ>{qtW,x7~rAC!%\-.Vj^IP`~i1$CR/9gXj3)Vm93.ͻruDRڲ6/Gbq̧T :_.ך ӑ>جSitհhK6!52HIoTJ=C4y0LzQ_3C#G!=ۆG[jufz-Nc)c1!lHͭSU-̮z^Ϻc,5EB b" GgT! i>K',_znYa 17i@s.̵:9/pzq# G2͂ !nr/O&R'߿l8+YΓJ wֆؠ(3Szfu.9붛ݒTީ[up^hަ—{ޣ_q3W#vFA#- Otؐe yUG~o+gmQjj&;V|+;_WUH ոcmn~_#bk؂ (QP7@)0  DV. OeBV?8p'5j%07H *lrb8Lr9Jȱ6{Nm7Bzs @Cɸ^¥3^m?; !M֒ _q–OW+K]^|>z;a7'+/9._\L> u\8aNǍ `:dΦ@o|o3Q>gϏqW8Pp8 Ľw HdF j;Eɼe:pU7) S#Dy=>#+zE P_/˞ďlgU MOL;u0[,8+s[z?Ck(Ⱥ$~i?+z@ŵq}xnu+)' ""{xbg/VA&GV|^ wX"S|G cv{?/tGh-ǃN -m6r7zd<:՟cӂ'aGNuHJkbQATX:Ipl]3l,$q.O<'!&PX)d h+`/$LCs.AXm-MK]epFq2Y8oiytgwa.Ws0d?7-A7 Kp`_c &Qsv\irTJx'qw8*p!jW1rLDnitwȪk.J6r'[xGKW;>>hW~{RJ\,p%*23F_qz[|6Ћt}5D,,*;7ЈM2cDC T@fT"BSqD؃AQvHQ61qbq =:C|>_.&?j(TPN\!{_~{|o8}Y$:#b`7 vGJRrJcj>=M<-D;}'G NBD7 Uݢ=jOo܆ItFܠr1/V\0L;\ĜOf+:N8ԩnn.m0CY.4l0m|fņc>FgFA^$T֫܄ U]xhr]F!xEqC@ VFG*l e2z/bT ^1 G c:Ew:˜Vrh]x9 E8Olgeh˹h O%ɼӎeΟ։a_ҀZWۥ i՝_4ؘFqT3lS58sZMMPgl*d(oee jD1yzSE0nɢZVMɐ[-wHP?aڭtZ}Fߠ{F@5qo"~ kH8) 8WċJ={{̢Qzry,me~^ ,^.-hEBWzu T'd !o[4\U^dM.2:P^qxO%=01k~"-H2xKY9#q,{ s[R˖X5LC;'=6ڊ˜: :IQFtVN3 E/aWY9pk$Ĭfx#kN%ZTIU-8D5 }#l%I;X81]"bt/ufr?D-{|HXyx5议ȚB5EOjܧGj f{?q.ft;ࠡ!!H2n7!vӾX11P*0E)wt|OZbqL"V3<[<7^E \`:78 KOsٍE-mw[+GC({ZhEg6;ֿ[jAC Ie=nU \0khg GkxOkV  3J\Nu4uk#1{Ǹ=Tr۞:Y|݂y.cYO)D:jnxYYSJgNjz'¸Z~rx(bOp )b&Yt&9{e[(λDW cf?9VW9DۣW!Q_3n ow[j5ZNȝ4)??!t1*&l/u7$ANAz>RJfE$cyZdB;dgQ eQ\i}| Y pU:]!x@z'А+ND}{yxx|xl9pd i6xu ёP\pw1S? nԦy|CՊ!f;1k?<>x=}O_Cz8.y^ol{eIN%1ku %i٭|U79mvMHM#? xmqX."<\̼[_(Rqqq|||/kO5)GtߋD2~Vf|vqA-iIY܍`+ rғYdI HF V-?11륗j狳H cnd8ˊ@v-xAV ~v1Q~NAt\/EÏtq1HGp-ŠG`CHH(t9sM!]Lp46nZ{9y~K(~!FFE.V'LOoR ~+9S9ȣzh-F=ϭ{'r쎒ї$Ɍ.9v|B^n7 H#,Y"6%Wd~xd*rrrzzxя=xc )~\k/X&SCPEu{ƒbv׻ܬUűP$Uh%h2v71 ^Cpn.WtZb[]haP9>aꊔ{-C!ubY[#jGݪ 沱5Lƨ%#q UCxHHcEJ͝g{)uPB ev%F4_L4Nz-Ԟ? *B.砿n5̹$#5H!A_jbȖk j\âRki&m^F htZkccc?ĐMN^ՍvJWȒ*Js>~0=+m5 2/#%F[J ~ÝQAr@MbZfz6}pbʡE6@xH2d;<\8HBzܨ8:89M!)}]SJ;:T;o v)JٳlNv|qr:Yw>&w6K ^ lYơΟ})+H{Rui^ {5x5E '\"bb Fw__Of간0i@yDŻ ۟E߿?HXHgy$UѧMS J%iP.0fevWc'<`$7fK'2-z(jVY&)Y;68`ȪNB+J@tF`Ш(⢢/yJy ~Ҵb^;:Щ5B_Vɔj/@uJ#^P" R%4}Ӏ\cZb6ek_o&)jN#u,U[  SB^lfbT|OjL..G(jAJAQ,G\w^p0~(ad J(}1fG51.m!|!e TUL LOM$O\%V){A Z idn1fW6Ŕݥ)+rZi+9QwLZY! ' @wQWr@Tt+E P >fņANG3R)Ӽ`I5H'XgRg)Pp2'[ @D7@ŒOU=ZXxyr1JS@똌x7%1rͦ951.)5$hFf=%s Z6?К$ wZ -%?"6Sȵ1.Ԛ,*di n(rm)NR͖ fT`DcC.x4Jl.Sg77ck~3fJh 104vlu[Q6;Ϳ4r-U)qJ"6uW.[-֮ nOWq$W6_@/ WڅOF[Ρݑ!ӟlV Vt:f[3xi~wS ,t?0Uf\Z" |\7 wJ=meG#տ:V7y߶4]>\՗-«P? P/O_mxgRI PR6$On7W^'|ߊVGU6Jt#.i!ŖICP[<KVpu9Hp.4FBl]7 MhSEV;7TIP%JSG~>]vO܅m7u|%019G>`ώ}s|{Qw 5_NE :~83n5‹S tX8V"9 kSyJ\9 UP6>:)˞QSn 0V6yr FoאlˢTp镖FbMys嚭< nj:_t,n7 bYnUDNd)M|Foѝoڋ0ɉ7~1I>A߱P*'cyBP6'ibt֬yRMNhx5Ԫ;A}ZB\ ]G1LRoنB2v3.\xX%U%ش8ע}wXeG* gggY!8J/GJ̾_Umg-Dk}Z@ JwH`!դ pPPo+|RD?~_=!6_,hJdD颸߀3#NWlMjFUcMWQվ4C4Mq5XJF5gݛfX W&Zc]ڥ,f|_5I[LS|T qv &HjIA-XdT&?А*bDx?S͟kk/4y,^@kƤǸl 2|`F52.Fc豐Cv 較r"4Km!6ŗvuII܄"! ܃9 *3XQaTBxܿT+Ϻ@`k^jqޢy!RcW|L5jl4u\U,FLLT4q.\ƙYԹ ,|W8 x~D9oYqhGEM"dTq Ė)N!%P?K)W HV.NM\<@KZs5$H6OVme*^l);O6' LZJElpIc@B&TJZj@,Ԋ^\÷SF`ODL·cwH<<ђɩ#Բ@!A*>WPIV _fe?bT!W)'&Htox%BYNRyD%ý"5@c3ODdIq(]T{>O;,Y$Se6h+ -@/]U5l0PFϦh5R=1uTMJ<cY(l- }!zf0<1jWUA:hg]G 9g8t^,oWXʆ;8'1;R!f@f!r4f&&n| 6Y%}Ѭ -M ĜJ?mϯWj+?R A9 ,4i6y e׍5O]8Qݔ_a?o=>OSNm:Id5u1yF2Lhxf3}>OpI01dUڅ EbN9@x/7CާK}Ɔv$ @DMh1yEIxXV?jkY/>/]ū)+=id=BըQQ{%J*{?2BTBL*}ubZ!#쑘 }Sb~sۙ,ݒ܂AT%nQG wWƩ9rJգe0^QA=MGbGᬼ.$G6 :?5.1\B[qGE*~&Km!q'2)*X_ vzmSξ}8|;+U,h;pLc@S]w/w%VE+GI60D[Z7mIֶ~}mD ?]tPYRbN^-Ed.VeغD+HY -m9/k|R]f'%8M$rE>34h5"+NZ]^=ݧWa~s@d {1ּb1iꐕ*q6!DCcGrRyʖRmuX\i8d R2['bp)E0®|B%)H#r3E`#t>mYŌs0h<`p1 䤦2jߕĘ Y@1%N9\vs%.Csl,H\6sI{We"d!>]CKR1ڟy|GW V \_VTIDͱ0w:$Dce&-Ow%% [FݨC%#J=ѱ[rY4o[OF(> *EG`I߲8쏛~&UkxdB?9w^5ř g9eg{Vw?Gh4wv2Zu 2WKh5)2X~աk/`wvRB- PMH4 vOnA]c8G!pۜp9-aQBTEf: =$,'~eOQL_TI_(T5RTo8{I_E%ʂ8ՏǶڷ1h銄u0}߮Cr,)5"bfZ՝8vbM rM((iw\SLMiΣ?T{xj 4⃎oDcjJgU7c4aUN8nuTLL]޼MH/gD(l< yyB!ovR5 G%N+`z۳'Y2Fyk|ljsnUqLKqph&.7_1p"H{mo.M2\2]oI b(9U_C|[yQL2EӂI@~lݨ1T-vaPp+L2&cYn {xʄ˹jYot@a Lwޜ죵Nxs> q30QQ]p 叙RFV5e'~̎ ;p t.+Zbh3qODf,n."=?:$w}w7gZAM9omLA]:5bFγR$O{Qv" c+OR7 8?B̜[zop_,0C?:F:Ru%=uN 'ZK~7m]ذVĹA+zJ#왊Z,ƛ!n8^Zʙo@LO"͈QǪ-a"!~y:O BPM}8u?n 6!6srsT Ҷ;Ѱx)u P"öMiP:BEA.MB\(\lFV 'S耊ȯڿhO'7re~qt^[үi_an_~Us"$SBAF,I aI_fFAVq}FVV2Ʀ2#XUFY^%z&>ƣD eYOyJUF&VmC_*t-*>deu`( @&82)[DHҧ$SISiML fu`caœ3{Vn% T*l!/Wp=4UV)"L %ȏHw/#FAb"*Tb)CQ&1:l|յ_V#FU[54aQ 5N N&Sk_(hᖓ;1P Q G<1|Ӗf3zqXAsqz"ovۛovۛ)Xo [zh0x4WxN[l<ԛvke#ܡGl*`(c&Y%dCm=;ၾ:G|wm]gcjզM׏=|/J3dTi%Nzc%(_? bXU+r }qbZw6)ۏ Ƃh%DJ6ӲJD+ 0۫fQ#g1⛄⹴pPĚ{,QKC4*8WR=kˋ9ԩ/P@eM UX;dxJP(y9p}QQ2KQ*mHPDϷ]xdၭ@ oVIoӗBq'qY䅢* ~X.&C#D)rxvQTEqyHQq7qO_ y|3#\Qp&Add4fQª7MP$(5t:פ3)gP=7>C,y|j%:-˝g~]9;HpBr:xxuM'|v 5Kzy8K8?=}eqJjsB#oI3;+!|Tfc] Kr֬fjzA)+0'gZOXiۤ!|.i_@\; do.gψQvǪPϵJ ]MF1J:."~UG'lC(pWP*#C s+BVKJ$zIiUR\'@cj0lUH)x@K$㓐~7 /Hs,Z \Afőe/ x ( dKw1qM$++(U@(/ cAۃ[tD2'a͌ VV!W(*{HDt`FB%OJ(X%j9&9+(PL,L~DJJ2Qv*.gJ_@ WBDX1:08Ll?ϏT[ZۖNf(+UzCT04BF[zfa(eJ#K[/`XBFـ)†]3(J]z/S_{;9F>*JFXRԵ0ʎ>lmER"Up?4"CkEXlrKݠaޮ:y N7gLOd ؗ^Vɵ^o-k}`>;Gfg'7WvBF@g~Xꔰ'mfZ% Yŷ/_eE"7՛vE=/'Vn9t3m2p/b}"A9IaՐ+lڥ6^SgO#*jO}w{+7WZum{O5Fvi6VީGzŽRM?>6V :)l?f.{ۯC5!g\rs-Xu6L]ݻ7o gy^'!.rb$9vy?yڋZ'51֭+y+4uupV3/ׄF9>hUK])/E4~_p<܉! C ~Cƀ0feE^u֤OFݏezEJ P^lVXxy|}9_bxuFȫ?ZpA&:tWg_qly?(-xhݹ\'݃Q3O;(-7a?3pW{ P^~\E>r៛xRA도NatV:1}z?߾}E>kؘ Ͳ˲VՓk2}rѠ9C;^a|U8#֝;W~@rW&tੳOHA˯M\9uZ~ MS P9׊ {-єj|zZdkr˫OcΧT?k05.;">kצ{_[чFUa80/mՓ*xa=ZU޷V LIUP}H0z#'Kܹ9f boiG6/Uޣmj[>uR8ѻQ(R4oЎ4r3h > +χzuL0jEHO*zr[-Y)$8΄]cՀ, +y=ϙ`>2ߕ~AA?;ϫSpAAPTl.'^jz0;6)##;^@ZJC̪Sk]޺3s}E^R =\ϲp҉(wqפ& hQ0e/uԎ[ns~=:txR=K/]Cŋ2䥎;/*xy== 9W[!,^=Do_޹.ӷWU W^k׮8b{s[~꩖YjkW35時:Z_O<7k|~} Ob:pj{pc͏jRzs.8"V%!6<\Vݱhmԥ- *q+3k]h&]kWnSHmox$ѤN\QBS3FkšvFgX1n%:0w0h י?E'P eum]1{tE-,wƩ6&}m&Z0/՝:ܽN^W}7{U_.v65+δIvYrFQJ:~f,pX>:^S]{se*jMWW7W r4CeW 4Uwf5g57qpZȒHRݎNl24 ~iDfFf&_3\$dE<9}s)Fs;:$:h;[呷btͫ `L QXYO]ՉU$p%,sD%̝dC_wJȮ+noFҕ";lY4e2(J"FIdU0suRDcUgۏUf=WrzevaTw,[E󏣣#Yu ٙ?~&IVVҕL~;I%R/':i,m֬1Լys0۳gOtt4)2%'?O5?h4؉d#F1FV1bİʈ*#F2# $铋ogXM2mk7U.Ca5(Mz'W:*ͽ Pi&MѧQY=fXMP!yVe%KPJa'I$':|ł{;;$s$2HJ6'Mi;$߂ IwD3~JBghnqht/3I²4/JWt'*F)'m&&g/E7Zo@Z\.ZdVR6nf %&ozəl716ٝI4Sgx #+ۻ䄅"C̺d{F<{6BKR=}T9# BBۛQTo"s8qmk1F?wvZp8:}4K0/P^,ԿbŊ3 rȴAAP$SU&y/\飳mB[c2䈿xeEn:#rpwxtz}ӾAYmeUȳ'DBh}\t}[U:ʹT;ShyLǩQbWC[ɀ2>5F/C~kW!J㤯4cLfZ|O?߸q;w~kW%?݃F,ٲgrolG|?bEoGr|Aɧǚiaܹ>ʎy3bݷgWoKF=<1~%_2iI&gc^]zm͈y[WNkYYe&-SfST*yxx|׮]L t9oW"cƽxth3ӻFEfM<:V*?Kyw yǷ2J0M *9m7>չw;zX_9P[ݮ]X8𖀈Ĥ$ԯO\[cy]u~^#?zwIGzX|y͌ijrڵf3r Fby4בQ Լ׻r9Y{ ŷ./br:P3 XzL^Sg+څZ:$&D0`܂c+w|Ʋy˜jo@9cF Сu9a/"cR}_p sN+L _d%U~}ȍuuȉX8;uN\J'b9euVD4|.;䴢f[.K謹yaMBtVWN2QL7QNzc, H*C9^o2ڵk7iӦ5_В&ļnj:ZB:%> VXI+q.ZEK{pM -9 xL7ئwzK꛺.ۡmv14}J 7PN(;\Dx[N>ߺ_HAQƯo]:ڥ*+c>1}GO^+oyخ@Ӄ"UY !Q ҢYo鼿p>}?pOO]e;; N3pReJP2- D#Q N%3!,X*D/ *Tf:u˗/^L D1n%CэJ4C )LyC!ƭ_p\͙M`B" *}yW*-/GFt'RS^jR U_,9 j N?Zr9Wmphwne-,HԟL?wmAԥ8ܫ6wDevA(YQQNlxfQ0lC ) S{sO\5RixE0JTКkÁ *"}"oG&Uf4pMac/:\zW$ᏸ`Or\ӫ-Bh469B͛4 L Nt aS/}җ糎7 %n2z^ ڌF1Sr~_VVY7lnuМcUfNM7)Xuo.pbdὌ6o&j]]"ٟoeQ Θ9iD&t)vޡ%} $LΖD̢.YG$bAPۥoetA'Ҵ/&Ƥ&nc nc!iIʚE#%yfXs~{B¸a%1;3 Nܐ9g9RgƯ5&,@,b4zR 0@K(9'%44t9^~k'bk #k|YVdqPn:sP+h}k~P?V^SQm3.M0A @qނXR#Xp4Poֲ&@Niq[Y̔o﨩s8 zyЉ"W]q[aWyMF4Jaf=$;$*j*Iφ% Ư֊ 2%lQSû)9rj½PQpbKеj \F:ADz> KӀzK <&F`a%2[Bpy%?lYQ`uA9(*ØCC2Q2-8 10懒B5ߩr p/hyg }H$A-zH6dfnUe\_MnsˬYK^uƋR6\HrG"yM8jIUcW8,`^9AIv6eo #p& Ԙ(AEgU7bAɚHd:&x9C;~kxx6,hְ/ ֙ֆ9I§ćLGYndLìN5#6eIQPr2L)Jn(ZJW+/S;LjW8'bZhVS(yWjY f/@14@mRSGlTRM$Rߞ΋UՍJ4E9t|,ei<9> T2v*Ut(M)u~#E# QO]+]zOxѫ7VիqlBV}8֊)TK KDܩZ*<-'g3}Bc#+}^V}xm]QbJxhb^[sM䩝;Zc wW.[ ߯ҰBsNP)LY`TCAi ~@nV$'^1U{+E/k7r.A$(~Zowd:-4mwED\4՟_RkQl k6Khtъ\jJ;`Q`UŁ'eV|Nz{]{ڠݗmN+Z?/WhIENDB`PK >k lPKy.F/angular-1.3.9/docs/img/tutorial/tutorial_02.png\eX\K@pCNw`iܝn]9{O/Vլ1 EOń>} "H=lO_@~DI\_Toeeޣ6rì{*U^(/qB>G4T (>-5,*GT2F4S,J{A-wb(="Egf1ɹ6lpZVXGӺjO O;A xlc=FcXUԨkxp/mB?"\Ó#ªY,h4cIX>֠w{d2y&06_fهjDUpZF>F4dKK8Fc艟!+*uyx8 +,[2[0G_\łvxPk  Pm {-[QkvX6uE+N2d>ARC%LC7`jbdxX!A\|*:Fw8"Q/,ļ䣗z@CA>ui-je)adMIUL-,Kq7-d:(;8Y)>>%@U.K9{%Vl {3R1[m: -OTsD.-Vܴ4FJAOyDÊ&DScE~V;4"&y{{tuqgjtŗ^4eĂ#sͼW.+ϝ2!QZdS;(ߩKoo|:qJ8:d=_q$?\8ͶsV(Ig"Ԗn퇋Fg }S;6U<92/,'ngOT44Jxp b3O4&+ԲH^,3k_!+2&͟'},pH֕~8yTЌEo z-j[KXMɥBJL se">JH C4:+JZ3팕@S  d;;&?,vGBmn`(>4 ^R(@^7  #`PLHD(f!$",:d'~aZn]|e;9:tTyV /Wϝ_sJCd5R\X=Qsq2Rl0 e,Jz9~⸃]/$ٱ5&&tbюx}{dۛ)p155e(eLJ`E 8%($!&#%#yDH͗\:s)cj w<[&yI⋥Nń@0e=c fj jmD\!Tkd*{G@ra p@N9"tH$ x 5f+b3knEPBڟƩR6VwZ"l4lwOItAzd5zܕ/cltH UH-2OgYTJU\ϱHEg$bAheN|2e Dq&@TJnzfSXǹ$G!9MՂ3Hrm}1VI%'F9w>*נ7Q#.g,z_lÍ pn]-?U@xH3?gvZgfMMeE`iKL@VH"n4V]ʈ<:[͍4 u<.8r:¡->Ư8Jbl;cȱ9>Ou#Lh" D Nwz.aF#J2é9ꣲDHSA]&CQ=fxtrM[\(zp*ex4]NdI],nGbbY{2Ys{L֕K lݴckCB<{bxwˤ_gyÊ.w>6:ir~6N<θҎMZ1 FB9mmW3eƅ̣䡜;(v+)RӄKO+ az+,|Є߀D)BatTxR'?F QsNzm¨R0}jZYl=^@^Zh6`S"KuB<^F;2S3׉﵌o@mg~ogu8++k6tD+H#2y\zbAhPOn9s8';aFg"k~?;1f ~MnBy@{QvFk g0X5:%yxZe;FqsG0+dȗpev+u`7ĵ/}kx3|>E|vю nFZ'1^vkja/%o'D&ʵnNHU)OńLIe8{\R<W)U~:n5] 60hT}/oz*xW}-U:8ʑG}#?rFqȁVTiK*~h5+=ܭX_uB!°' ;6ԚO nhw4nF۝!ͽDO|ۋ aB bM:3>)4 NX!}۾m0d u2qCnЖĥ7nˆqGBHa }Ov;Bb.t>(~KB!t(ЂqVC[]/8N+b'wB0MJ>]ֆ;/J*5 VYiM!BGZ)6d0 q8/?䯱I V8/FΌڀ %$Xd" =4Uz7:ax,Yi s+,H@vSlXfRo֎sE$8{I:[TPp|jva޶MB1I>|Dz/rQr`Xgϵ삞a) M=2MW-U?rHnZ9Qc^IEˑxu&=1m6n ('g^}7r']4Nt8}.q4|EUQ|iB0KR9ssH Epږ|ݨdxw}V@Nܧ݄Y ~ozBwDVd ;C|tnK,[KG4]{Kw?iy)j(67(1,uqP;YA4B1-GR77 H&tUFTL{' P|<ʟ6䈒#D#v1p}4]oe\\H΃~ӵΚ?ꍽ>JKTظqܸ5T崟cG"xUK>V \>/TH%.hpw{t p [!0vro! a0[om:&f0WS]lF[|ƹ 8n" x%;jQ62?,VHdBF]85 洎ħ>IаnQ( ްNYuF7A] aT' }{TrvPz]8!9 FЍhd jqF/hH 4xz/gM١6K!ĘedKe&W)aV:N6'4Ǻ1w1F.V=gފ7~^ntú'{0)3˄ϲ#O+:Dǩ,!9!- '9P[I _Xetv2$ac0Եg (CHa4GB>A`N-6h>Mi~K^;a?-ZE>ܐɍcbiocUhao+Pw70l8IJfJda󌻗DbU$G/mp?tei5c V4 4Gz IL)qm4טH ͵6P Ǖ b(AjS $TWG򪾣c/s~18)Q V_b&ZYkwv|Vو@ X_5 LD#ۏs۪@^ O-eƲZP&`]?d`z}pXxUFsΆb%ncS0fޖ׿%~3D~*.efwT"ʎ[5ay+_V 6 $8䴋,fc  @[3zWFD6ۢ[6l~Bց>ć<)ɿ0"lY/q*s~_O%޽; FG{^N Da-)dЉKl@ͥ]ZGLs>v2mOk^x!E8 /{[!P>?b>oJFN!4DsnTik*~@=MqJbVlAw(k}%+UDT4DiT4{RPQA WSN>j{288W$eV$iҝsVT#yV Ng^]xS!R.\ALȣY5^TL7>64qόr"[zEyޑ\DWi ֈyfv+=)uܑb5Zv2"d7\Vۃη!UD +ڽ7zy5Mm Uٳ<4p/ r6>ՐZUw_`A7kwtɪhb.~XMP BFˆpuYv_'{ խpUL̬Pts&\{JQ.+ѬLGDb|A 4S6ől]c<<@Zy&]C+MM*\4`ۿ9L)jtuN#~(V:䊀Ëmt}Ik2]ʨBT qXk}܍#Hѷ1|2Epo+|f7` lC^II@j4?cy~Yreַno$S(SB堾W4@E$6ͽ <"T {#w EB%!A{>|GP gl2 DgW0SE$< k)ִK&.a,?;2ϵ)M҇*lsXK@XZ+7đQ[]9wk4 ]xg3EӤ;_{YDiF0 $Tk uoe?EL2#Ik6 r/Z6j[md#RWRV=F|gG S ׳ OI1bn4AAw?MIW rd?XS@u)cT2Wj.ĢM g@vOKubK^R }\rc8s0팮5 VFj?# "NP.-qՍxަc(Ze)'Ē3Yzfẗp< mxvȘ)z\O,ƣ.Ku[@BH&GtMS޵ PgZ3XKxw,_ bOkE{gcjD J!$H Dϋ2k_Ni&dSTRz,<. 8|rW~N)hTRz_p %5Y)ɳ<=y($A>L^ >_V`I% C1=~:t0/ v  47'-j l5۸~,R^{rP܆H.Qq!; fii88 4'yg# L yy4NpD֪|wF  S);&9 a.zW3%&xW0(:G4a+?Xc>wX|)~ئŝkbt)!T ; 9-}b9qKç  ew+S!Lj; |,b!לd7p2;Pd/÷ؽR1[d_ 禐.u'̜!XD Nᄸ&\q7t!מW|Fo,T(z.)]I[%ن%/a\#B5k.og7iXJW DEvȱ/2i6q?!9+DgՍX.%^cwbjJo^}U@ ߳]ҝCO Z.omi ]o4:l 2,;aUK?T;F&фo5+Ա*kk/C-+ҩX?Ԟ;5מ"="?VDe%1^=\7زR3Ul50SFTwU _Ϯ?iG۾=\5x·"5G_DG:]6nD,@,j~ QXwu: 0Id$Jl.]I k Nhi ZJ~T1}m3;27-BK#{tCF3g[zL ]2ïOg(\!jIK,!J =}Sї1rd 1<ϕ5k/Jˁ4o w`&,'$bjD-YɯClw5|CQp(kEbقîz:)9R1#1~ tfRh1f&N`p(CGM .%V4" Hk/TBXkMP<ޡNZFqs>NXog1~M1]TuxqJ#<9K3?ǹ D$4GD_B@cU'c?K-6\-ۋE2$*V?;u&T/V"bVik@ɺ"ιPxEI[7mDzULՋ~pG /ZW8i0˿C5s崔]`|fshr44YZ1L]8v%~ˀɭ zMg#BzZ-(KEh"_]=hdl&#HfkiB&dRIʘkWx6|PGux/QG뭦Qw ˶$ۯgTuK޷0/xTI (5h \nk Nu/4㯸&1,'=G0\^W@3Hǟ0yܯnȁ"a<·3߈NNo~2}H헜$ zrmw*9̛5vY7_0>O?B_~gwb(w%_aWLN%I?hD ﴩ9ʩ&4c)n?mEHRK4Zx)ty.]\>/ָ!SΗ(>L4;]VV,?&jG R),pny hǬZ ȺT  RbQq6ցj嘇Tmwg&oа4KX%$Vyb~]w#|V<=ed![7]nn:pe`/,XĈx /65m^ٳRyQna ӇCZJ:~W}\q~3ȏD#gvbbAHIYH+f4Z4FCUVc,r=_ d89J}?1008{K;FSyӟffL>6"mǟy:yjMGm H#K ȟQKJ~}ƴ+r Ry]@XTqVg[3\w9T b"#5Jy 8eime7_F8[Sy\0eo&]&m{\&_y޷O'D<'ao" sz9 s{SfmQ' ,,cw#!Q7i4ӂ!S؏u3q"Qx ‚NMdNÎpr~pכ7-w4 6գ~7XͺƒgIEP oQ c eҮ3U֖->v+ظLZFYr !á¡ ғNź?iQX!f_cYmsZ!wDm+ UFfNeMF0H5fzJzE# q?D43g:i1{Jvw*NMUz.ʜ'VJ?,4fD(xiK-Cxp<íyEFkFOe|Uo;dgA)4Lh;73$k$8瓁)ǭ3lL!teU@S#l?Zyǻ'e'T~*3Ud31#$H5fl?ON>:@0e4z0B>[xM[::j9W[,.LE]nHZYpe)TVq9VrzUAc0AnD*,9("s_ d6qa\@`-TQ#`5gi_ih.X3Sni0/H4_W7]ѯϖBzB59w=/)SR)4fZ}"v P候+y^Mtr* @@Vkva!>O}jH)&Wd.ڱg'%!c|h&ZKͬb|Fe(oyS9a;+qKq1}:n b~k=Os~K R geRjmგ$̄#su~1mnAGikg?v!nL.y_ JQ*Pҡ/d@Hȯכh oF(9C7c6*W8qeRr/ܖݳ3 nkX+xv=x 7F\25bhdX2m+٤0gYЋCU_S1b4atnxZy8rіɦ֕ش-܉AV~mn~v"NIkX~e(-/oʡf3jn x@Rҍ_QpoR6TG&HL7q:w0?˱c^u5j5jrb-;`NQgl reR5OG{ X+ 5z՜J+ڈ7Uxu0<绽 ;ti*3]~&ovr{u<0]f>\o?N1/@󴍏pa_hk ??L J5k:+XmҲ=؟fB>|^`)ߟԭ+ !/Cse! `9]DQߍǝΖ?ϭ抣܀~!_Q нDEr£v|b 3g'Z hD4^C#"X~c7Xޏ{؜{Iu+ҢTbKi9æ5Et;v9A=Ӎ47{mK0Cq'U^HˀZ!B ɼu.mb_z#VdZ*5=w^:\0XA?jqCEEi8VqmNZ_ݛ3faMU|F: ! a?ZÑB+lzw CO}fy}K۞,๳XD%!$F׫A'ZᙃBctshUd^[%*8f NB߆5vdщר=: >+A?$PNQ`rB)T1.J,!fqT2xQNHuY2}4w6b߳R2/mԏ)^VR@$ "ӌ{YدqJ@J% _ZQo fZ Vea Eš"|"KAn®h.UEOC)9-4R岄bB}7z8[" XOzN Te7ƥ98ԎńC4*-6(Ddst˗J5l>MDUG=h6;Qg'>ݽU4d>w_և͚)5zd!/4A|I?&h#:@@]pĠ?C8,v-KHboٸIEͺˁAڰ!*bȗͮWҍ2=c\2R"bE+ zƺ]ɋ;; y.j#Wjo Jr(| vHVL7һs u4c-Ļ 6cB ^WHF¿O[o0?,Ნ #y(SwN"US#Z{/&؆l@ݐ7{J3'/̊b so } Nd;0-m9U`իă`!y0GHKPm 76LVË*U@t{Al+/茡Q&a4iFs9_`ܹ1$LT/]|}cs;u*E->1zXqn>LT'*fVOD: de TB-nv { oRNH`$;b9hYc2 bj푔|ƥXcH .͐o~&Azml#0'G~ m=&i7eEoyd !FwLj)4%H)qU}Jˉ%:;b Q!X[o9q@V{7][ދ0[&XA zG--pꠛKEدH$h!i灞PN$"Y#XJ6 )pE?whQ7!$U!^(,=ᄙd~}GdBNJH3Pg/o3]9AzR/ЎnQ1 &m9GA񵪊dU>_g vžf#J_Rݚkvd {_) #~D[8vVoV.Wo'֦dj(B*UAf0m r6%Wj~6M3ksHh$uMԨI.'H,5^Vo-6ߔ9?CHo~Z~ IN̩o%c=2#O}sR2SdJYG?t F7.x5N8lrUpJB껭l-$0k7Z)>z$ꥡƌЦ>NqDD()dXO*>A]D+Ly`%MM"68߽.ieq;߬)_kZٜf4qo:(bGCr+ x.GXjfxKf*ǵEeiJT `7'8(N\ܯ89@f9tzz0PUWNlq_ If>.X nM.$>)jKG',72l *[*0cϵ5*Z?avo ˹5 G PݠG8Z7흧P`6. rfO|2ƹ3~qL:`d"lrK)9BL6wtT0KGVWk;Dp F8=B3JݐU?a-W!UI_phq\R0[`jL/YEGw32jWItkp~axI&z̵ޯ?e>;"/F\đaYfm(83~W#?/p֠;\\Q~ㇺ ,SX7>܊#( =5ui"bQQF'Zt-pnjunM}z||aq4=phUfJXG'%KV"CmQ߉VqZєc|+:L1 ;DZ`XX*/!|Q Lˡ~ M0 7l%c8fCXSmf0Wvuwg($Os]4/)Q pG NdkB-`UT:{d{uzl1+o*obܽb9Ph}+}G555 ۨPpZjҍ-uY:[m _!jq+Tsܭ酣Bk}1OGgZa_?__ _'uuw *Vn34c -4I&_I꺅=S d֚*#@d_DzɳY]$胤x5XU{ 1uC?+Ս2 U%H]ΗcJN`(4anWđPN5QqH5]#$P=3 ^RXi6} g-ʚ0p'GB#٭&l|buC-b"g7ZAcȯ);9Bt" :;ݠbB~%dE+aRNIg@Kfi$W$)ܣGkiBAʬhaNXhP#(0u,ʵjةmEʏ$ϹKHVbl)k|0&^nI;ftx|R@XEWW:2ioJ(L2Ɩ pAoQ[ܙP̡J4#KcR(YU +lHOsI9n̨]m^ M><ȭͶmc'Vjﱛ!Dp . 4[=*;_D ) ϣ5 5cV@I- UK_*xhFrl-D.L[4MHR5W[s6$'F*2*uu5;QGk=fcڻɲgDGWPPPNlP^/[U *7׸啜^,qByeswC+h.|^\^_rc-M ڪ5qYXM?2/|PYR# n{(eޢiiBXbj ӣ~m%UzȇO<6WJ(#-&8.$֚rݜܙ)n;rUȗxD)ȉ~MVܞLqᾕ rsоrgmʨnk=SY%,=ҭ!gbV{oQ" ?oLj|j֋=)1an^\\4"OE% &)ޏ46&?YW}8(J%,[/U fU(] O]6zִ&E++Oo"6?wO甉L,u -f3Cd[ {g҈vg&5 8^{=n^*Zz˲{-Q7[oK]CBƒH1tute*U)uX]D AYI o\s91@#{_鶹&xFƭ!;Z*]?B:FbX{$3[< (E;] `4,/VBٶN݆ue>*0B|){V;!1M8 $'I_5FDW͂i(^(tN j4rsUzRwm$Dh?Q@DԚ(ŋ!ZѯߞBR@uHq>%հevZHk6M/~!M%XUBjkY "j-66XA3$ |c{}cg wL+)_ߧx=}0$pD[2_dj))YNA{_C"-B7IXH]C DѸ?cբ3.[mMw)=e#r#֏23e*GO5f܂mkPǘ(f$]p{]` Q KIӣpE_}39dYtSH"--BA %۾+x ?' ?~33-%L 6o'd)e$f"H#j ybF`3psc\0eN .J5b,m)$02ctg"Ij.DuBm^cd{=*5?U3҅tx8z8xr-q(\1} Ăr_y.04xnp: #?C[DZ߾s3mh] y6gT\"_lr TYH:C" 52Ҧ1tC zhb 'Y~;*r~nY-ΉN/Hx+[ATw,@d`pehyt2+Azۉۂ)sݶQb&瑀HI"y~3ByfF$s^+zN* N}Fӑb0tw>@Snqrlyޜhta']ȼP "Df~.WYhoFD s bffX_˯嬪ZKy_kGc~p$ ")l݇yk r; C̏[dWGFw'),?ʁ utW58Qڦjh5:31VAq TjDmdXHehP$eLo?=JkD7|B`!/ u rиnLL7TwԐ רtFֽ ['Գ^'[7yu^\? JY" rŻvjIu$LVkI]#u |fIa]bFn4/A3Of/6&iFwkig*}ηn|f/>CG[ݿDtZ0hlk vNXQDŽy!\QBQYUeƋGۅHQneZ_:ZsQݟ>#a }bVUmlH+'%/Evlkql.+0Ն p'iٰޘyTm&̻ g(<0NJP7VXn 3ިjRgCAп9ǽa0e D )6d%[R)18g|܆;H1^H~W+>G{PuyxWPZDFv:D2cȖB7y\H=_ٕo?vjxsإ/""=C!y'w~ŠYف&}yyg_[99qGKCCY.!wixٯ^W(Zh(BB?H/) ^_.YX63ǹS7jqWv*c=^sh{R>R8 7dverkQC9 nW8}OHzrE)BV8|hV(<I&7ԉl4a|c[Mz֗L:1[@Kg1{,.6oA#'09&/Py+l?F^ު QIqfC^b{8{zF4M6#nJ'L/Nsהi#%3b' `{{GM ~%`k]ԗaIntf'㸭U"JPt ⵸ѼaWpwjz&b q*|:{%.z'QxB^ T9 =ntAxJmB(to-nБ jĎ~e{:Н0h0w[a)5m\m♽3 "}BQNE:9zm5V]軲` ӭQF;z;IسIӕfhޅr>zj%V0~-fLa|Y2B Hkڈ|DΏD/V~||4-m9b-I9`ljC]4X̺H]L▐ 3(2s_))O C-wDV)\Kvaa,'ci JWJnBoC1-7+?80i?o_RBy۹?}7x2_h2ehC>W~׼烝N8^g!f] jcx($US ;ݝ]Rߚl<;wro0f×M EMd`E!>)q@h.T9oiO /ύN@El}+|. N(xLNjrk{C#*gOb֔/Q^x(+dr+=܆m P*E9? !#$O-Rԉ{Dž8]_Cma)n _hsƇi/Aq]CO:6cKWB=oo*v}=*tOPJJۂ#<%zX o&`M +?&aؑ=l])F\?R_})!u}9q3=?ˀ.cy2β 5%0ȱ6[ntkf&B %XwT'md2I~;,Yօr3'{(MGoL1.!*?K{)OeRp8O1ʞcg5[/O_=[_.{CdH#X2^.Zb `3J $ d.Ϸr ,& %ӄ#kʽ VPDN]v Ɔ:ť<^BfȲ7;!o Qg|4cCJt}\:\IJ'-<7c5y-c' 뗫? S $r /C Jg71vȾHx0G2[޾J,Զ.SߠԬQH[尲l$NI&hgݎ(ٻvZ|$Ï~J [ ^DL0}ws߆|Y*b2(w?;anl,#oTþW!R*ddH3*!{' n`NzO83^rYx}U (-\Wtp~-XAKp|k=h`ˢ Q_]n|y!+LJ{<{ۉ7)E\s?甘jXdzJ:Ino1-WKL^s_ Vmf0r躒*5ޚTdCM#:$4}aI9TRh"Ɠf -}'}4$%IԫURv=q7K#8XGzaVYՔG<|U&e'kfvi+ٯO#pH$-ǫPl!.!AjL3䡤MEk|p1N)9f9'G1_}"x>gqG1VnR}+ >\J9niFD'Ec ߥT#P88|u0Ҫ''w uL_֤]`"]5{.UitZkMt-KIesp .6 !7ZBt1We0P㢽a CL}n9u3+7\<pirUklC6Ꙫg_]ˎגlJJłU9НƓDc!ZYxFl/4i}l=]k@( dNл]DYSَ(V9Eca֐u|wCNr!b=5LQ|ǸHnYڊB^$@6;"T-E:4Ϯ 띉uOغd:/fA[SYϘ,3ϛ$P.}E.z#%X$/;'¬pe{V;zY?H*sPU#.tw a3 *}hgهɜ (W8{JYQk U_ KLr X9]íWKX&O:eA==5<,px"Sgc2Krp#@QT;) cQ%j;whDG ͨe5DјԖ[@[םMν+k|Ņ1AaEUMDӈ~G=TÔ2,'zTz1s~u{N;Zwy;=@Y،\~NJ3$)՜J~%S5-cP7lV$L1ן-ZS2Lo\gO~,;>i`R追U#Nt3q>{ys.QI}dXzB5ocv=6M@;]5 FYV\Ǫs+?h1JˆcExTlY,˯fOgXsH+k\U? GFrt|;KOWG;j.OYHm8ye0A.*Bȱz1z7j™G,2mމ5B_mE";48B V`o~r}e?}4ao'y H,49C04gkYF)~P3 (;ocUX }jPsxv=9ݍ ?oUb7 86} aV;e~kNDSjOP M|Ϫ[,0>ۜ?8i70QƕO'NXNTԩ`jZF&b IGfPyUg )\G-$\XΧt}^m kpـ2M>x`D:3jjVBt !1Gq 9MI.Iiyʇgclt'u3x[vZaf <6֣{Iv̬T/@=IU mJp,XY1?@1d3Te YDʔרu6mDëmz[`X٩2=|k:' 6VYSԡd6D^V-~񝶾cPks4}7 ?FKe㱩mH3]=F?y_PZKTZ>(8#ifQ$0F`BN^ /Jh!#"$x0 ?޻.phjS bƾc[Zs.8`+Eٙ0b}$Wv(%J=!hE .a]`\K ,w !]]6JBVZ|Z; r=ɞa5RDT`,-gNM_kAD9qUhn/(pD1-qlpq>-9PAJ=+`A_ b}'#*rW|Kcu&, 1~V$5Iغ$;M {UP]O%KTkuuk=rmѬJLRk^]<尋|x,I"-Gy"w/sG "x S[T?M6E 2deH ({oaBX1}ΰJI%r¿@O{)ޱ =p}s^oILZ"J'W鳳-B꺮u`8yw zH&MmTӧf!NQ7"yDCp.ŮlCQ~GLF2 @I,M}j^dkpU&koS3㝒-%gH!sJ&%E}^\߳l;KDY5Inጐݲӑ˕f)ޝAG$ڃ.~!Bc-m`wqx'BA-{h=se;7)JLO݃,!g)z`)YtDN=6 6ly9@% ݶa}X:T0~&,kWVѦC*cbe3ݟ0Ikm"|\zGQ9GO^v%^BJ1F.ʠE`hmJh$(? 5ǡ+3qFjƳX{*: ޜPY{.p`]o\詆AQUTaz )=,xU\ :v7mw[Ac<뜐=V ޺зT[AiO| 6rI0{Y2/1 rOgOr,oO*1ƻwts\vDNhXaԺU+qtM?o 1USUc9R`s,U(ky~eAzgJXF.rx -dպt';81:LN."Q[d5ьo}X/zxrO,6 MY?s^LJ4w@vg"),@ܰC&W3{`]_2V(mxKAx{4X262RhUn_(eᳳ[2-IzUM:H%D=NYVguBy^_F2(vk5 ?u#䣄4*7T6'k@ӽjK/si߻ړUVAx uCLyN.KUhRL_{mÌ釆p5j:mg;&L7"8䏔81%w-=[lķc(jvs螉iOãn罭s` |UۤTp8D )tjsHe&J\A A1/fݹxv-gAePg&@#|L: -9!eBl4x"V'Fxr"v @:+yb?ZSu>ǻ=#+cE!ۼomCB\${g6idFx+bR >< iEkgg'THNX#Ė\?%Cf@ Uk9k=Af38lt+J9en6sRMvZR%`Lf7 uh\L?Z/[ Ŗ@H܀ʬൠz!EK ly߫$ +!eUY.bؙ rEeWA-u'tz: m 0JodNW ״s!.G@D<FD&j֭6V~Rɠ8|.ݻ)#>+hQFQFEjZ waڢZ'Hl$;mC 1BZHF9q?sm_kkr7+Le.] K*^8;:=7]zիW#a,9nYJF 738I@rř~4\#Τذ )ለiCMW[%_l7oב܎0Ȓ>=7A/@Q+p*_/?A%ਬ6]7QqrC0%/2m[JKMMEHHY&8j–H0,|jUr2c)"tYW(dkq!S`}Wf̘9sફ:ƸlCqZšA䂰C8!Y%Rײ?θ8g ;sby6, ;`-H\}8ҒҰsn4Јph6J+횱lkY U_ ?3غ{{ow/IHDDD@w۽{$ν$w"Kcʎ ;~+A,G9)ZR+ŮM۝RÐ)c'Ne:Q\ɼʀkw޸qvqOvfx3WW\l NR%FIU['K@%x$'NL!D)l ${ŧFP`Yar{o},lD/y/7[Nk~ʓ@婪WIBKA}a9^0*4&<) .WQSslX\ݞ%[o*tkW=:҈zHYLcJYp[_mD)p@O_MNN62s:O"$-6*J vxM\jBӟ_21lIWǔ=k3Hpz[)Կic2~[joVvR? |35+%~o IcРA$g9rַK0j1RW6l'49Y7F6g3WTDq坭ߦ20~{mg-K=e{wUhҮ!~fPv98~,!.|"Q:YnRF;N22-f}&1UU3?HQ -Ja={3hΦ)eXn9pJr&;-Mrx`z ]YAN˗'fjT\fʧfah,(( \0[r+@ŭ|QN,ԠN\^ɛI “S'ϧih)vٸ'֩-ռE4|y`xؽbbðyRNA>zyPp~8Ӥ_Q*{ /m 7LriKTD EU0S`kT}N >S}N,VsS$ZmuޤixBV!(w'LX:`D9a6 ;t6sW^imp*_cNhluNڢ}ߖ(,:w<=bj Gߑ]׾]ËtCFF+̞ }(݆[wUb"Q <zq&qgR`3ύ>ۚhge|>45-t:Svmn<2j2o1kΔ<^};kgz*1𿊁j7[3&ΝW ]\t xtR7 惞=uRF{rRLԪe< Vm H\;@Zxs̏ :7ENSO\zSG)ϲ pDV2mnMɵYkmMs ';u~iv-`Ʀ?ޱ= inΞ BƋ8ɲ"RSѤca'ğʗ*LcW#4(HCrg2"ltP3i `MB".ʩa$McGֲDҤ(bT19 AN𤹬2W.իkIcZZeߖZX--U,ŶGIm ݍp.$i*6;Z5QXrj GQOqfجcC4+;ނč[R}K޽AU8֧SYP[ [,\;gG<ʷwg'jLBMp35&vv"n:8섾'zZӤ |H&yHܱ iM͝ *Q;dQQmzEb%"@.& ;\Xʾ]Hܛ Q͡/N{N$ʸَeg.$ʹŽ$Lu2Py܊Dxo< ھm޲fʔoM__ y؝ƭj4qc>YL={4"E0 H='MgXJ:عQy6+ aߖue֧Ź t[ +4~-608?8}ex9w2UvuCnv.w C{1^;rFy`]8G\0yݍaT2#vlH/.tgdٰ+aۿ/GXסو+˪[M<T CDeNGZZZX$m5=c P:S8Z U<|s ëoF&qμtREشI9[ąvoOLc p(bJBo>dBS7Ѹױ)7>r ![~'~BUذ?/,+*}Wt?v*nͩq8'f~V@gn\9y[T@§|hK_+3!%_͸5ԡc#||[{ϣ<\XDп 2iy6_ 'nɝIF͑~0vLI ׿Jx/ lDZZ6zn[5]vY&U 8TLNdeԑ$l[N)7Mb"L7ѕp&ʩKSp"nD q",g} Rċ%l~rvQַ0}[8;Oq=M_Q-tKZDu)_2qdt.V ҳCbyssr*t+ZJ,Y=F4&_|yG1̸!7n-5̾oQĐ+Aph0.|? [ӲsST y ƿ{\ t ľl/{ ZuQ+_IEqEr-}sxޏh4l4X >FAD֎GiC85܇5E^Q`/1gM;q<^tG0yz$WxHh.DDX wpr|=u&o׆,=6#4`F:iI/DFqaȐE Ohڽq;@6ġBIg Pf*%!nN3D.3Yq6&kTnfrn_ņt[ӇH'xgypE,iK.eE^w@OgHD;Wz*ɫRlyQ8~u܄'4.S{;uAg+lmu(է5zT eټgc/-~;Ug+_%D(ȉS;l[,qr)Dm-o}26{\Eae/i-k}ūkd|^ ?} ĮM{ѩOcyTMat=kჯR Ӊ+)QZ0l|9{WnSV+L{ =x9MCTluJ.65| Mrg_Ѓg(w%1aTQ0ԏƨw1\P.^_}٦j_'BƲڈ!ۡSsgK/dD, 'R{G}+u^?؆qu-;fT (P #<6 IQs} vn_xkyx3mAw<9#И<ǠֳO!*:E&ҘDÌۨ#n3fOWz7Z?/kϏAWgcعZ($ڼs_Heנ92x#$(Y{0}$,۰ OMEV `*wp`V]7c`\}񴬔unw9.ևN*V+j4G /91kr$ebe'yo" ^ށIUؓ 6sYV"*.8 \LB!'? I礣лn<|GmR|й?ހ-:#`>|*VoG"\{75oA<AVZ:g"Ƽu(Fji|j#q+oшԉAJ"b:;oBdhY: v' oE`Ƹ (>^}s)\VG2oY˲O+q5d7d'MN-c^5mYВ~G\~Eڭ+xX߽|D%ie?"u٭eqolWt\E6­({ r+6Ms/S>|-^ֆ墥|"QPlu\4HWM'ai+4;JawyK}T|={ؓD j/U))N\dMޤRթ6 qD[|m]+Mjm{nK\M'#bE6t bĹ2tFO4|*pvX/E"hybPOh]&@1w̫@-̆_X EfFa$?.e/>r3֨}?Ƒ}`hڲ9B)͸F%өaز+-;A8-:)sc/«_e+\^ɇt4,ZBFKWki~鏟~$'3^x5 IDATK؛o._c>D+fO_8%בD :r(?ΚC}ؐ@FUzrk<#٢uG[3VW-,\`{Igl)r|; [/6뎅qSRcu ݇:aW0y:NgIg0ֶ&]Eц_MExj(ƭQnuIo%,$ߝ0t'W'Zp,S+jsT7*jBpb{||<8YcY%WX.#7DuַĢMY7BR6|s>NqN~2<+J2ms&w@Lڸۙ`X_. /mxv:-=٘e曍i׫WFae^jٲeFIFZ7Sɼ_@[ݽ Վbݚزq%3;M6mi"v!zKsm:vyAؿlK!T*<j#QFwEp&h ޾!ܞ AZ5Qfhi%eB8iڸ䆻qYx1gFTEA^ZGP HF.E?#%v+ 0n9W̘(xi8yOZシKIFSu+!7o]HP֮]1Tkۦ'zvDnuCd` mT\x 4j4 makp5W!uAQ|"a'ĠQFi$'c#pҬ]Kݯ?[dE$4={ K\9}oHp^VC~o!};byXa 2uBkQ?;¯ ÇJMįV[ߞakSZ(BC]G&=o7Kf`6,_eQi#mus˗m-^2paeMw/ݔ\ *re6]6ݽ pXf C~)^$ ls:ݤN+( V\a@S;!E!iroYMZ7t7Cd㟈RA'l5|:#g}5a8aWJyOCZhݖmn;vdҲOXعvv\ qlxP K;j@W@ W5 ]3ЀDR5 4Bf@ 㖬$#8Ⱥ@QTl@;y$DXV!)Js6-Ţ>ѱRA%O16qmM&QZ+8H{|Ըj~^Zmq@EP4$2I䖌Q2WqF_MPz̗%}"[H PT\ wN%I)HYG|dD I͐Lp$'QFru<@{iCo1bC=Ӭ,+)_pmo~w[_*Ӿ=lݰqI7i$$_bb* \vc4 e!V'W&t'qRycӖrxyʅ/Z-o,xL=fgo -*JPg[ܚ O_u:Ng\ ;\6k?ѥ-^w.Y 4Dq!|a6S5@ ,KrwociLhgƴY~EY>eK5**'vP'sX#F0vmFAFrrRv4TfIɼTV؏{ w&[5Dcҧc19uKfMܹh%mNZ D +pEp泸 A qci$MN†_'a閣ؿ{|9m1r ɐג5K~OM{hr3c ͛'hд#>ÅGP%:bWLUط/7߉[KAn -XrsFW]u 6./1=@NBCHh;VI΢&t*R 1ajn jicͼ6W$n]ajA*ҒElO?@_n['dqV]Ug}ӐL ;#(5xJR8H"h6vlM$`z,ݔm8LI >.3&yK7aǼ\]dPVq-mHĴ9kmgzGO{_rI#cpc'}u&3 ŋV6D+*_&gWX wG$2AiZf!O?MظI= Ǵi:&Mh#?gʘXk~ƲxLנA5TrYܵ ۰vu$錌-syݏGЯOl\[w1k ag džmظez͂>/)51qrݹpfu͒Lzފ\0T-ʉv*IU\+W"nW\u9طqa6Bk7Ֆ힋KWS{Fy8V,i@.Op+]ԭpٱik6x@s*!`8<8$skKkR0h[XTN ɓH8==ݜXQ^S-_Xmp9;fE CTeBv?Y/^e/G Ȳe QwyB8M6xqhp[Gp]G qJCUԻߺyNNawY~0ϿpiIM6H?$ '1|O y9U fu8C> n{&{6^͐gr֎2‹JjYG[u9K_yk4=' bB(7&LV@9Od[P6I,2_c@Ɓ%NbWէ11$v;{,N򻏷P}i˨lԥ`{cѬg}sAoӮ$۰|:̫D-]vc[X/~9PJO 4r ASbuxcEB4> 5" ѻ[1kO'I;-H8rdIQ>((ٗhEWME۷ rEسs\JTi%99>Uh&hzD2=^uÍnc:(I=tB'* * ""** T"Ezi'yo0@(w`3fݝ={@wNA\J5eJ#;<@a$˷h[x}3DŽwQy"W& Mb<5AdUďyrppElMɈP; ("dYR[6:;'o𫦦Jj'^IyYYEq)F&Μi2ҔOpH8R}" 0F17#©,-!-h {spċ6"&r!b\NmJV|̥xe3ND偁r> F)SBvqeE|čC ?_\>/fyO.ǥ D%9ũ-fo@ٞqD8^%ıNe郐`ql#xJ:>l(B>f^L=!stW3w.:_쑜. T'r $v9"עZH:;wRy˃$܎,q#*: r|Q\ReRmSti)go2$tp|._xk*7i ܲ1ػps")4С J,Ⱦ+i*%Ι SF? 弉&:ɫ4. NђvuuScJ!ٳaΜµjT[_eAQ@5g 9<6h('!p+SӡSwM4i3ncUMݢ*u( h^\ eX-1:,Ӗ-"ݦu;:6=zΪEs:؈l8aҐ?:􇾞vᆼ_8 !^W@ҥr# \yo0b,]AZQrr=k%iEC*Taz?R*$KWD&vhRIט?x^?G*+4ĹEAJ2V"獲r9B`rp:Ur ʈr3'}/?rGMxx ?s2sjAf|W1c꿼uUA TO_ӳ[N\+SYbe`Yvbpn r=F qb&'z[DQrsOǰOUm̙\q9ȑb~%uB]$2hv,Xr+pg fA_9o*^ݺEHOqZH\·0xp?,[Qd! XVllhaĀ#e; Zh_.(5D\Uׇ#%;W]}k ?Jhqɯ!-OÅ jB/a{/Oy  j@ANDœ^[2?~SlfCU-fq-8chլZZn1Lk zU!ͨr-Hr32څmr87ӖQ'Aex|sT>soյ$  ^,p͚]naі-^Du\P}.htoJyc?wwfF_^4ٞ[i[ԶEWĜIRR-׋u}_)SK_…}n$mL>6uLBB- 7>cƏcނ_ _Yɿk 9?A71c:uw" ǓmL'l|f=V3"Fk%ؿSߖe^i{~Cǚa跃nSNTp`]nn7čz_ݬneJy&@s[SYFo2`|\?o:䔿NŠwtt6͍뻈:}N;sVs_c(L4GMn:i1(`A+|vHrMEͪ51xk9Z9 ТԳΛWG_i2KBt*nZ0L ϛ/ Cbg̠7Ǧ U}Ntj:ObCQ+PzY/hذȴiI"MCgKȌ kz΢H Z_Er6/j-ϛ3FlP("Dܪ_><&ADϬ +]ݬ's}Ry)bAHׇLԇcvNH2h-y*6 sa@S\D*Y>f-T8!vDJESѫ|i53B?Iݾx[ԬVKqyx:(>Y&O|՜n1ӕG|ņ 8H/.<Ԩ b`Қ4mř~S4*].F so-9F0(O}B.DrɅrqq$~şPx@a!le9N9DUVK=<3'“s`j?D̿s90H~X]0[\nXf8bBlĀoSg  l8DP}vb6!)!I \ ztGx_k99ӳgOQ;#~R .9Gc۶m1i$cM*Jm 1Hpȃ +ڵSfq\P_34WMSzrTjc???4m MĻ#!@\L|(@eQŒf,A19Aˎd\a61ZoW/8b(ظ[c!0 ՋשAz='>xEő Tc5{X:bpNg =X4pL^ym7v²75 M22%Kjj*6j_]|7CƪNj9/7_M o>Ο9AR71.@TvhXF=1o hvZrj< Ul1|D3vmډlHC &A"ĉ1{lY)[+WVPDƁ {c S\QBؽɅ/P4 ݵ6*_|!A@l_~57QErxo(/_^=.?3MĈ&2P噩&_sV`̯'Q~ +7)$HuL=U|NٺS=b϶T90u/ظz J+)fbvj.c)@l2qmT-f)ߪ IDAT^{ƌ$~*^\8̝?c!jfmcצ=ʻ/*{ibvx/>e*rdኸ ;7Ɓ]moKs8+E *m; AV?O,7-wry YDG_WƌnKxW0vX4o\m52m!ѨAm*D.L\<"EIrg[{|~!0׃@|>=gE>)M'&L~-cIg6=Ֆ#H{  ٪U}[Tt)ۿNy`z/[)5 ]^|Bwp7qNz-c#]:i/FU0ƂXiش 1Ҧɶ[d f_, ~}@dkc>/vV]ѰEot&& fj^N`{e.9h1eJɈU4u\DMH{ZXO>J!I&c1()leP)p@T W/. \D$E_SӞ4'IwA/ Y C~T}ŗ:9RsͣZj*ڦ4\) ft@ X܃@S犫d|JwG"VsǢ|dYti~qUZ$^z5\oLvyX2`O= jYiՠo؉9S@kP9iOGNd[=ш,wCdK-C9[_E 폜4cx%mӮcN&mdb۞ضLl۶m^ϻZꮪl_m' A+/3*~YzsvRfsq̗XtV9tg@ŝS<59 PTZL,TpLY Yu~(+w\,qҺ~?G}ֶo}y]dc(\ݒDzBGwRTIѶ_T  2ANquE)>~Mzf2 M( N0D'AARIt{=5(w,{0:,=;w#f)A(s6=mg*Pj(x:,]-*liSeE8774cbP ˵A`B}aZF|*؝Nq6 qk*@i(׹bGx=0-W!akpV5v1;c*A<˫sc\Ev]eQEL%Qtsj,Ϟj#B-bum}@˚xc󊱥^}A5]hVңCӤR6}Th|xm|g-Z! cbҒG>#X.J"¹{.X-F3,,qBHe \< MQL^aRO1`V 1B5k"(=D^$0ܢ`16@DEo+l*:3`xUK)aJ͙K@%|Vm{*Zݮ^DDx@NWC-Vm D8+mVɒ<ɣ ^f)${Elm~_HcJm=`qx܊+x$6Fc!ٸQSݖ491[HzW.Vow.޲ 4Ml\q ^o,r3ߖ-ǹҍB"x]'䟙͍49q2l2Xn-f9iE»14.r6acKob2w!V-aZbp \@ L'qڈf>q򑊥톎Rq@= (~Sd"Xx+9Ac磪E,L5M!(FŐ`FG(}%hvb~ iAF6_%:1_ So¡X&@[ UN43LyuG#}ШքB4QSKKԙZm?3+L@Cc7I&܃icP/ 빸IqkAE-WK){O/$Z)߆rmB_S$@+ʵbWDUhJEJu*+挬?(Yk='}O2[o~0obμO9+ ( |p;YA$Q2J)ͤkAtzĄ^P,ʱN%QEHnX"Rk_8U@Q`qkAA`qMSca#5?T_XJ ޑIFng+oV A BuƢ |0ˋTib.:(- ۸seUf8FSg(N2m@Qdxfi|(=fm``wtA$)(CwEtρXOx>so%h1 #ztg/`4J۲]&",d・V絆4dlUZ~rGuL6;f+|ʟo\ "h/'4+Gx^:3p7KJr;1Ip1h~R!{}S?<|Rf6/EyvW.JZ;uQ&K5$/W.{i.CKjft*DAܠ|+ yت MHA?*YX;@"sj /7rF\m5?v&`7꣔ZTq bn$Rs>Z&huWߛB̦%72V0ݠj!*2O!0?=ǩ)bW?' |_=ggo7\We?@x"EϷ_sbMfq=.45_.ɡhPEQδݘ:d w23/̏Eo5MW :4[^ҍ寡aa[XlOquےH8 YW.P*6\wT{JW1G7AC1?i;QM?e39!M# k GA]&FœLg236@{JNi8&&S;vd63S'uB5A9"XdTaN6Hfwki62v?N~MYoTQ{y*YAF|K _d^WٜSDV=+ą|}5js{1ꢣ3H69''w:w-]aEڞ[ħW+% f`0/WåM)źCKQ)wYu[SZ+BBBu)ZCM}ލJ;LgmԬq kNk}$-n0jΫ_rv]`OS YWH=GMR$1 Y3F/FuWUɯj=c7rdO5 szwM5u8Tl Ӹgnxp Ȝ,OBOL֒_u no=;;g;T"*c".6p[zØD-1At숦C5Ca5W{Ţqi>ɑ4lsrez( D޲x'=,<.i JtZ=QXQ-c>O(@BjCR D&g?2!&XE]000TkŜX_iP*w`qc?^tԵuB5†Tab!H!N%.8N2?v.6țsT~wE[ls{=&g.BL4(."8jnDR%"%5Tk08Ne\52QBBB0:O2\oM*V$\1 RPRvpP֤/N$Yx ,4)]{F`d3f.y IOFgu%wKqx1įj*jQ55vkΜp:)OfS}GOqq~:PNǓ}I2 *xn{N4gDI 6+M`* >1Ȑ$i o KJy%9EUW )yEcWjؼJez3:VTDC8.1nP*k]|4jy= 4+c3,qP+s%RWuVwtwHNgk1"͞Ҿ7Sl)~cJ˥h yLgɖls~CIzW{޾{G ynf@B(|F^D+&Fr{Zu "VZ՚gt=v{qB Ly_N|Iv@#w!&Wɓ.B,ܖ.#~7H'Dt8:J}Q{?*F`Cu"vF$k+ڋ!n~~d8rC yL&]+(>eOQz|帵xb /+9v"TsW@k% [IUNDET V= RORdE8o$xW"OI?.KBQ* ,@# 6zD|@it7VL-yզGB%Ym灏DL D3:%/ξ^n5*]?zk] {hǴ!'FOɥ$6{b[nH1|{cT]6И6ul`x/&/]wH\'~H\bg0Ovx9cl]Gxoș]i #U/(Xr!hkXPUB9q )ua۱@68|mkbVq"pOZH8y\wP݃po?۳LB`/ȃx$hB('HA|*%so<7;\^j])Xj p^ʕ"`9N&ų6N-W0f9IYT2WȟTOD!T5,1ߟpCBȟ X՝ )VG2Z>cuFC ۾D$axhbwss9xWWStfպBeقLǣ-] S> &7]J9ؗYQ"ߐgcڨdީjULHl_穊*w8H/=9nk1g=yH a5r[%V[.oD\~Ǿ•%(8Vπ:O-Z@.?.R[.]bZF$UhuHi젬'; Ez0_y$c.쏨'Yh/pj2tպ;" r|#Ϻ p2j鷑񧻼,IUIGSQWhѦtSԪP Q,._&~HB6#_jՎҙ|""wJ) /bD7_VXM;DZk{ \TԴQq)ʽTŖ9ZhR M7p^i8Lĸ&QTD|DL#,:|̲*8O_egIue11>=Tٙ ݊*qgq"bZDA&^IXXrSTB"R` ${}>9b##`}JkpHQ}+2i6{ z*M¨Vv`P҆)I~!LPo&%呴md|N]e3H.B^0Chĸ8t"#h*?-@CSnfG6C{jI(B|гVl!_q1?q9{÷9CRBnsTz/Lvd$g&CYxEm)^2cXa=~$7ݵ:?r=ߥ[Ĥ!J [kX MN_d+gfQ>̉Uѕ;&ˑm$+By,lXI9j荇OW(L9d7ŗ$d56xA7ˤ4p!;caO'ۜD#  Y[H,3nth!f#p@idrK䡉yue:Yȋ{2ڂؘs6"Fa"g{/05 hXZKUJ+_e/q#;;,77g:_S.@֢'0>jBSߟz[-kOLpUGh( py%Z.<X,q_D}[8)IxV&Z.qg2A@}$KPG (?4'Zhh): 򕘟b4@!x(VR!BIt?kVR9ȂJ㴰%'04}Ngvp4 kS Ɠ-*yeO06S4Ǜ6BCۀ$QJ+I\㒿+tVYs2.`};_l ,RhumAI;A ! {3ϴTB$ً͜fps^4 r~)({j*9APXNUC^r9,ȓ k 3QMTs]J6o nѶ$U8 Pƛ:C]WhUeLrgd-FyH]M&1'**zH5frLCdb2N^9s\U b6o`v7l AnA`ylm0q|FZ}TF " t٢PO1 `PR |iafw#tnMx:&$vXs&Zr-ݑ&BIXDw=>o P,hmjIx0LGxUtg0%8~Lm8%j?-bC֙$r|Y%;0tbYzՐq,\G/.(ؕ.(IoG'sMJ֫Gia쮒@ݔ"`B1oB؟6vF-_x>тP%E6/M`a/9p? Tڬ/n@מ68_,?y q:3ܔ^(-94L@hcդ9T%8"†e,KR[x?#WXJwILC;x*ALZeZW Fm O0R[|Zh [,{0RKH+wUHfLx?˵tEB2/Z_@&qm +}7 uvlUD^Vx~F0eX 7E3VBF!!i6/1J LbrǍllliB!fhP;qL Iz"%G.5<.>%U4#> }RTGYy^aax\Nů*:'wV~a(p0+Z*nt_/;Zܻ*a{gHG~Ŏx ,REq7*jb;Dte=C9l?kǙ(^02%ץI&ُ5 3Q+{BiC ){t=o#i%iHQ/+L/PTh_ χ7ug(M7~VR]z=P>:@3(2aPt\O8%Yd=:ap m!yO飲Yw2ʔVn=Fi}-}2h y=y R eyzWNJMrW w`br"1!:cWJ?/'iݣwH _j O#hiXvsD2jVuB4p;N-6&Ӱha{V羄,)w(l+~ Q&)q@&:2%=Uv7S;B1 %{WݭY#|>t  Xǁݖ3+?'TѪ={3۞7eW&Ex`G/,"jlvd2o D.~K:W9K,.3]evۧqrl.|~VMx/1\bazpAѫODtXO3ޥn,m^Adk.LU= 5٤hQpܯef,ZϣF&M|8uuj#١K0uB"~PoóكDžr>Kб ؀hf=N^ڎ;5` gLܷv,\)xՒ {Yٮ!tr:N!g7voVPO7*>Ib0\Q?FKnvPB7]E~,}$PB9' megM&tu!WTp/(Sp @wݨq jA]"ϗ!o +}|J01j<s4i6EmyRz8UBɲYQ!ɸ1}3+=^K=:So ib׵ B|{2XpQ-W~݌SU ,ۗA<]/AmǫT7qx\t~YvD[9h)12SţV<>Fs: 1^m:RȐ(>EȍHGۦB-hgD -)04[56:رsalNjC(T6OG{hpQ0w*KRM?wPZШ!/w20_B[&D RȲI0xE؋'SIC?7SGY}GzLK֋䚈rj 8$K%8ːX eIT:K^f-)hdpQRbF'V!Տqt2c&&ԇ-R=֜%66XB-ǩjT^eGEAI Ϛ @k>O>A+˒ut!T4z7/Ujݎ u4%.UF"h|;z+Yd`g ;2 |+ј0&EYϵBŅ(!.pvqbHOܑ<?}=j9DڍÍ&)p\#eGgwuH$PSe!bhkikkkj+=Y VhЃHFkeT?{x*{g$X]rmP :eRNl>x:ufG-Xׂx܀ P njɌyKaEf7PWKK;箜'mH(|'C?Vl!KpX(0.fhՍ LJЛЎ`MvT@5>npIaZU3X3}?adJŊ]\u_EA6q~qUϜ vuYrkvP@ >xN=>f޺$SLЋ0*"aRJy&T~䥥:/p=^ؿFgZJ0b[;[ͮŘgв,Gjjܗ:VM,7 T#z<nX[u+ФNezU ɩHvwqBv;kU?ۼӕ;vf~ԶbhE LVQ7Z#bDS"Y^@dﻔ2BB k` nHd -USh!#&!{^%6*w`gߓx?zGw54*"qs޾E=A'XP'wl~)e J"$GPu.^ mLYq̌LI_-t|3 ({Lc9;^Y˃?4wi/vX#,Uz1A?b[ej7!‚>x 'dn~1lv ''715dF8X%Yֈa3*ߎ?q$I]q۟ ->/{dʄT~IY\eތT2#iN Ay/Ed%]zr`duN ~X&°ն0.2 vAÿ^RE]݈]"E6CՕD54'YG?^vuO];Hl6֛Z#\&9ӳYWJF &a3/P#YYD`܋h 4~DܪxF]ju߀c)o}-}o$víL0vo@JPgDh(xxNfZ|֢TU LHFd!.W-RB}9uJPΩɈ&wbjT*߸89;HGqI@ch*YTȝV} ߆ҐaWDbjEk1 %f8cJ) qTEl,_29$Y~Wi[; ྇+ jO6[EuN.ˌU)TDbN\sl$:$}A44ݲ hI偗=T1 I:2شomH2 [m8WG0$Ay_tdVw>z_5[qnFT"E t BgH⨘ʆZAp0[ak8$b_(_ˎELU(M 6a+a;zuWtJ)r >tN&0:ӐCEY 34 Ɨr)D8f\U~vٹ3*?M_cКԻ8d~^`ֵ.UW_żGGE~~@EBgE-1'\1ǫ}M"!b耉@Q2%axL *!jgP_I$O:&w*Hb۲^NP}E˹'!\ChRWށ^e&LϴK^}wwWpӛG (@;Vߖ;&zPUףG@$I.Sso ΋02ȋ &9X:ht/_PRMU"sZa_TxOhs×t,oUڝEo,R:r}ȧFb@6NJH| 3{M]sU*,ƒh\֛MdÔa|raǛ66.\5*I?ip[DW>lU7i`[ҵw`ԆNBH;W=͡ҵC%;ZN2_ҋӝ`E YO0W\QP_Nj&]P9 YZEw)񍣯N6>ުWLSj!zp?HnIڰŬwTR}$D ?GjNr@e"1b# >??#Ou#?˵l t[ aY:WFV6Zl0:rARIi:vO/qNj,iw{?kd2$zSf _$TԽ  fvY3\ UD0sAP=0- tRJE%"`{t|p8+A1yA$Xf<&ttTrr=M1/8 p8ĠK`/"pzl.鲝? ?r갡EsAC43~߆3Z-H!yWXR\q;ٲY=~AI(C&M{ ։}Y0 eZ,`GJC(q]{ G >|g1]DP<_rYE\%FF:Qn`V ~U/9%b"m  \թ'Q@\=6W2 Of%| ݧy J{ODatow|m[j^ޅ>5W/ٺx i\ z3 { T&#\ge!W@-M6 (`lvj/YQԆAPnT\ iRuii/F7rVR}-v8{c{Au3E|e#IaGzrZ`~F3mhrBQ.*!ϯTA .[]R'<[i|ɐhq s+ޞ#jm( ۿmG}v ϶ <jr; eV8 ׾"0qΠrL=JD-`l :PNŊ΃$v b}DIZ[7P~; G,"'n|P@8BK˙8NCjVbRhJf@Ti n ;Ks3MQ5E2IBt]-DÌ'HngL#] 8>m͉ݹrkr-6*f~Gj#?YJ9ܸ5oppyףe/>xnl5Mzp#+oJK{ E&Ev.5m1GhvDXغDyh#jCj= ĥ1՛NMoX=/(\ r&H@'$3ZdSc*nuy W~As h  ZTg]FgAlyԸlY~%갛. g8ȁ/Y9sz#ڃdcݳ^_h V:6rDryLNw$z֥!ˡ ڷN|G0 j2# Gv,h4GlKϦ33EO1ߕDz$:$xwDW 굉޿z}?O)"&,KY]߶]6?i~*_V𓉡e& أM!eo2ӂJ7W2'EDU]%3PHj M-I -sV#>Nj{b4s#M\a}bdj.U8]E̔^؛i˗fzϯ؆Oěn2<2PjpBhCuGFhLҵ1[hxJX -W6z! Ӗ/ cO1A֋gtq7C04'|Ua%bG!R'cx*Y!n -UU9)CH w4bd6@ʝUŴ_JMԊT?:0,krf]6"3)rv_\^ϙbԑvh*AX23x`\\@)k)YQ(c{$PJ8+pz25Mt{ qr+ćТ=Lܪ }43P4p Nw}zt+2A98 :{<!mx m-NQNk-v<qpDwo8ioх7ۗ~a;*&o)G|{]םa?|9;~kGRй M$UJItTMLD,2H5݉_!o)["TTm@YlDc9H zCRTH;ùW6c;QgN:ª,V(S hBzݑے'^+5 ?7tKFR1َ!yT1M\nb9Ynn&nO߾O˹g&{@V k,;t9-&3&֕@6򥈽`5řg?+{vd:j8Mjg4D:x)*A5K`2gI dд8;sJmIi*Ğ]b'h>hdQܠD`Q8* -STOg/NZۑZ+ 'ij }7m[t: m_5I|:PM&W+}2>T A@LO4ydE . 1{DV-bÏit߇o{62Pv gWï;;SHTxC*KjO7t2TY9X?|8"ro-|r5'c}I0v6j&Q@\:#}pH=sѹ˜F1^s MŞRWQ닣]⌭(MBlfnIW "{*M<<ƱGSަKCq\Hh%W׬+g~whNsKEG /$`ހ;N,K]c/Lgž<|i9"l!:4?X:͎Ev EӚ.Y̻Pm?V-*sm&ڢx&;&dxiVτ?CJx<JmE b)I.7|+hضg#l.$JHLIOMc Rd>pNdʮF~;l r*“EsSg[ cF xJL7KӒZgR# I0+L&dNl {zMBVRJL8 |xHR>k_;us|ĕD_a̸1`t6]h ltxPJγ[x} Fa)f3I'Ȑ[|vZڠ dA@Iv’ +τfImJYuz1fR;dTON[ifM$]+)ړ)$g ,;T%fƐ|,e:9":" YQ +SVsnsd<ߪsO7ΤV]~˙œtoUT&1H? ŒJ @K_=t ߨ#=Gu'd$d D5/=kKMz5^OοF u;PjxߐD.埭y|Z؃؃"- VD &2UuܬhXAY oc%ܜR@J)ȓ+tFx-:6OTMRhxXe{cE.ND^_!nq+P>`b0~q"kBКƕ89u=Tj9%A˨U-%21Os\:9CYouw=g>3>yi_kX7m]WM)ފn R[UߺKXXT&ZS Їu(l# 8WZ'Z } e]RCC?9lQFwi#]-.&7\1)|4t=ʢ{ Ek>*`*YTJJ)K'@d"8i]?V6A5!No] AMZftKLxgx1c&lƽd,LhG]2Bm6p\b_ȗx$xzv'?0狦K +fꔯ  W_)`%V%&2H{orQ.8t6ԤbJŲRvZHhзjG! SYeBr i Kd KLJƒ8ꑳq(}|{u!o{qM?=[.MUހ]RGC Zg\G o!#2yVȰʔ@1FMjKvѨfln#7<S)Ie"p"2* uϋk@W7(i4Ĥ\8D68$).AAs$riBj)Ԫ؈޻}'nJ&K&-7YbtJ3Ru0ei5l4~u Ȅn !b !wAIhsϽ+B JŔ5v:>s=kpܚp;uN(W[Rpᡷ:P?Wj[>t/p !u[/y`I%9%bIf!;*I%;@J )~bJYWV 4R_Jp7TAmeAݚ 'g9{CY|l2[w(3`BG98f^m.ӑd4[#߬Bԇ T|FUA~֯Z-M Tuo x & %\* h6b:* j%.DĚ)*j. XED`s rlwꖹ?zn}$8Y`J "%t`sLJc-$7BPPc܁ wKuLӈ ^3`ܷX'%2m_ /.)?|;0Shu^|Wѣ%uGJ 6(MkvG_f-5,B*fhckF8: yl![-7RYQ->S☛SnpS3(ӽhwݤ>lUiտe%/h#0'Ƌg¿W\`,d|2H?!3N'>@%sMbWl_O ʭ{k P#(>QM9^(M(4msuȂ'^ (f7^4nXyk\Y-˗x'FcFש(hbx/^g~d=0z}3G  g! ex=x$*l/ wwBE`;~vU{jX Vf̟b6T.5~5r5z`5c5YBr(ɀFZp6UͿާ)tɉYmM |]C6:\v| n-:$deJ,U Tlhr3z̨w?)_[k;}77"ԆK-smKrI\1HVR8;!HD6WTfXbglFu07 UϊZS-|v@}t,0eC;9sП/pMZ+UK,[ wB⺄Nt: phahaHcɦET*EÐOw/a9@~\{ /h* 4.lnHpGq:?M2ϮFn57StjmFÝ^Wx C|wX,7`=iכn ui͂rY^Յm)d9\t:DR*>Q3YqHHs޹ l*}D0%+yi>7>)"y4U Ya.%Pj[xpOh/.+i8S%3 ?{(6sG*}]"DӋT*u_e\*FoHNRnpebvx7~ {=[qCݠnAZ>>|vmbL wf]υHEFi^.,xL8Vzj[ErBVV˶[3!$M6bBug8E6@jn0]3Hxξ{p`b|_׷;B-ɀzqz*R;$0L9$ s>'~؟nH2pStr4>W4}/qF͚w-2?>鞠)+؀2%t5Lc{rzÙվ?e_Ywn-k෈]4CkX୆g-Y1ϞK5qt'r:Mġb pxQ/ѧXt9p-\|SuK `?jFF1Zwp6W#DX|Iϻ#ޮ-_)\SX?GJ-J9DMj ]rHJ<$5 +jJ>WNgDُdp9kNx2xM?ޞi.9#D) n&'wjh MH8]6,x>,N4خfq7 c([#e 3YǐR}yθGV,KI%@ZltS'dPdݼouW~45tuKǤ <"]6,b·f+@:b[Eh0O` WO%g0,;Ͷ2wn\2i^&eY+Ha ;B*~C⼠'@*7KL eS?m? )W:BfZط>E,.lHͶET pR: AD1 }S΍hw@f"oqbkߚ- ExhB;F?9'uaoXG_?-*y|~J/ZY^.g,lЇ41mϞꯓC%`+bq}磢*OFxϖ'lR~ ”!C;I4`&ծ<#I'Sy᷃vSqڐp&/mّn'h vDsrpW.I*oYoGh6y2z ]s_q,*Ř sf'd\jTj> dv9~O.lxuJ5<}pK7F-X)-W h0o8XK/=z{]JSzs/8f z𓧙!n!^@|!Op#|cg^D$g&b\(ed$uqJՍvݍ}ʘY󫍙 dB 8O"trZk찹$˓. `j^բ bupS<qf7]IAV-9iSP pF2 {rcC_Kc)i*Zg/Mu[-eSiDp=*Ք/g2X-+9 2k(Wu*l4=ԡZ?m$px_ $szOG/m`?F.IfB39sa=>`wPက0> b* >oLK&4|ū6H*v'>GKHf}86x[ DD%^yfÎxXnSJ]E} kJsg-y(ΗS*4rm8[寽;odb\G-x48e<1Q,3WnD:cGb%+!$e/kWIO7@kNf\8(&*' ݃e L(5oQdJ0;LwJ_XcC`]3%q9ѴwpYGZ3 $ u4JnFW`m]k!]MzhQ'W&V_` `ZZD!cT#"WA:Ji?E9lc5߆1&U, rt^?:&`Yu6'1ȳ_qu}]=X3sd)ݲ!3yj qѹ|6pT$u`NOqg̒H1T*#Jky;u-r'؋UY9* El)Fx \ BB]hAUL5f$^>E>"VR_YZ7خɆhp/|4S_I'RFa9)c % ^?P}i 66`Ȁ0K4GT.=n\Vɢ28Z{!AC82څ0p]vm6 U_Cg4?~`D2':G 28:"D/E~HSXc bp.tDK6(K뭐Gb?!w|.4!RQ~+N$la*7 ^sjc sdd!l4b297V Y76ڱ&yÍM E8,X*DΤ F\-A['\Z鶵LX̎=Cv 1%ǝ (~s[ 4Z,Pq`DѨ@bviAx6y+7V;^iRuY&ViK #33Ǟ*{%hKxXV樝$mVQBX3tE]k 2P<ᬍ ;,y$dDŽsoge=7|\׹TdX 1`"nt!XF={derxf}#'6*4 2 F 9f֓׷^ǣ ]qRgmJe६@=o=n4"vZOZkAi'Mg{](HT04l.{&3jyC.:ǻ1R@GI)I J2)08$*\KkmEt9pE _[.D8!쬩 hO)2mbтݳ9㉔$yBZ$$ ٕECsQpOͺpG8潛Q/I+Lyُ_vBf^\1xhƻᯈ;衏@'NG;m  ۲ncV/pRuU5Pw2*=t%M{c銐lS;崤}_z@i|ϓ?|MuϤ8Cޜ?Rvi!5ZynT&mYs}xjh!~+( # ё|MIq[xc /Xm\q=|#1y,O&21r- 6V F&lz?&Z%/p[m{R1˜#1V.\u*ÖG^-e-aFe)9W$ "b&Qz~:kn/2\4+36gw:FC' v/$)Ho}F=w߼ntȵ;2: RP 6LmMbm,eIM4=>a=dYPm82Ncq$ 9ce]+25вm*nY4u V :< H)l_KI(ϒHLI"C5g8P:X\R+Fo[mR>>HB1B1(}54Ca%̯T}K")yMo5Z<]k*϶ji7'ةTU>H O-sB|!0m? {PDQc]jC(+_\mJr&.5Ya ,?vl>>vS=n3l^ 2'ٰ3E06 5E -9ÃL֍oJKM *nM̵ 8AkJAEL.eޒTDc&{t=L Ay2I'dz>9|Cju`S=ɲo,ַ.U.&ԛ1 Y$0nw-s c,Bʉz,^w/Ɠ͇ˠę&֣jDPVoz8\"H.dWk=ۿ0T-u_g i@-&(n,N ^z+ڄo NpsYJ;S צ xI:-jD+Dчvт]_x5eʆ^/4&qĝ1|VX3`{%ݕUfYxSz||1˓ӸW[6t[$_g3 eJ95CGAug𺞈zCXyQCϦ !>aQ@s-ҷ澄a3c5䳳G`/^$%-X3 (hYI^"*׉Ata+6! `OK݇@rl\! Bͬv4y9? X*qkeg>`3yzwSΨdl~yDAg}k:xan4.[ɗ]Glw^T]N f%++%;6·izO@tkF7(QHl؉U z?=Bg_*H4CŵJ=r}TeVwF/o,XIz顣 RCNHJ <"Lu1jvʔwf$KmRhEJU4cT߷eE2īa=9Z{+=2-TLo3x%P-;-^&ƚ Gʔ9qMH7~M. [ !RޏP7m%|&~~~~PeQ,=)/Iź!sOau H`L=9?.@f\,VfV_⚄gNS{ZbQ񹻈HP[ ci?.)4Y](v7|܎ṃR,'!#!k[C_ʃa& S,V7jme<iQ@| x2  >ܵ4e?[VE2YoaijRq$k-XL0g \,CȺ/Y<+ij =jtTZB}J!:afV2Cٵ}&1ӔFӆ٭/2񇤝n: ueL"BnS02QE':ah+ƨ8H_xaa/R̛>]ylN$DOpK<+ѢeXYҊZ01ƋJ5yiͬgp,? wrC'@e+H<nQ+XdROʉ ިSJtq$N Ṙ%I[~^ MD#Klyydnш >u V;\6j҂3-/KF7w5旅w#' H;Ō^O&Fʁ^ ˎUsV(?`|$*z9ɬ&-]: rHB͗$QA5},ת][|}(>j̗ $)EdK|c2}G%_`jrf+$@৊:8R0 9^s?m'Bd_O Fmw!lr }`"o| v5T%v5OATF {=4шv&ڷsR^g deP&TL,Wm?NƿCuTh#cg . ίS5F& B#g`I<6[H׳J$Cx}(q&]">\^3pC'-J^"cd_(Q@rô?k}E;au#oIg?ݝ4"=o(X{2Wt+ouOj5Z8b' Z:Ê%0? m2ti՟AD7*+ѵJe^ >v7a$DƓfF{GQۂ.=ަm. ÀO{'Fnn{-IEvv.qi[z9LN OnڏGrEλMVC0KJ~|*?z8&ҽg;4މu]?ь&![`*8`'5/镺mc6س2AZIHRGc>aĻ]Y*/2ׅ$ i&c:ՈZsvq]2i|cKlU߇7l^HTF|̨:9x^f+R57Ȟǣz~77SqOm@BPP:6$. IW'YjQxmAJ~̄,pD Ƥ[J]A6P܃ :~<9@v Q`tg'vp3~e.SR(vQX$r)"\8n-6CD;>Y$H/Qh'xdɓUP?T}c@mvds 3q2&skmLdsrSmv}yw?x>N cѻ 瀴8A\J}sQ_0h/lg~":R_M "V͝y"2"|E|$)6)oj_e +hQflQ[@38Ta/35μ šԕ^LcoSgM )6L2IU6.A dRtϓyقO]R2gYXѽb_|\ve}!7g/9Ok,vBxXbԘ\+}$MCn/4%U>$]\h?nM͞ac>/&$&g [Hg_6e~F~⾲UM~zkY6?W:'snZPԽ܊niq`Ar UJaȯE }w>nkd.qψKe7q/,1\vTl(asP˚mf nS0f<4`̵T܆=b 7LR]TN>1LKAꖐAU݋ |=V\Ҿ2i+ۋX%X 0O2jMP"g@e|JI8rX7/۫x=fè+Pܩc7X>Xui|3X9;H,uC@~ 6ͼW{m+repIHmyzaDždjA_iU\x̱SoZAF47{xcLiӸA8VRQc g%p߁x$cɝ罝YgD^+ؙ`Ǩ!л9\= $)JǪ19`o{![uQX:E%vm3t;b^'z{<7#7'w@X9Pv4Qc|(n" ʇy|`:C0[0`?)ؚ skr)o@7ڏ=k#,*t$k~ ֨Nc-H^2x֋TR520 |{S0[u ?}q=5K1bG4yAɆc@ \sk/le<)f˧=E\");-2obϺ\po^)/ V^hBONA"o>zަo'´gQÏ7G&`˪ƾGwͭnB?Դy;xEEumo 󾏙}^nUc֍w>&\/@a7*^>̭R&upuJ[6(̈́J>7TMSΘ.1zSQA.*im{zi?ggo8< K%nKU_G"=J&qdrܿgڗne)+5m;4orWOӜgȼSңVگў},Pc춅;/T)֨td9OrQwL+eu΁:MU6˶0Ȋ *)K͎B ON/zgQv@UGFPnNv o_403~qUv ˲Ҵ§dҡ)})w.+"'~pt.˞Ihfz+@3Ŏ  vIlcc[y/,=P"ڠ̛5$„)Avɍ/,&'%ƈ 6Um~,T(6MNpzE'0[=NU&SU&g=  {- ,4C? .9#ȞOx9Q5fr7gSw<'{gk^dw#DJĝ߻sjcNp f6]/ s ] F}uX>M 5[X/r 8\UvROX{4 #E% k\f/{K. 3zF螝f^Ip9bيC{l?  }. GI(N|^e`nPīXDsec51Z?9ɷA բ[ ۋ\=h7(Ya^L\F~L~uۮ `o١3G;|֩g|w̑i"EPSf$\6joMeɧ-d$V6{U]@oal7c ^W#\Q6ለJ~V%ba̭EZhjnQvi2 ;3Inn9=NSe5^Rm4>o%c⌕R;.|*KF% |%@va")^}w q#,Gaxc<ݭ דPFkK]<6sXL b+m~>y}]\<`Oˆp0I%ysu/w+xϗ)s8+:/sNTaMbR"Ԕ#ۍ:7R'7-w(# &l`fWJQ-}u"Qa('/c:6GKZlSMTt\1֮1?VF~T![eXdu'0 45Vo(o܀'=XeoDFvgh{DGF!D ?Z'G,}Bd:v2i?l-rxPh+Է f^u +1şeاFm٩QD#\`l~{<]D*ʡh}ɇvO=c %Q `x ^H!z̃q IO{p݊< y5bbʘ}7=;Ws!\ (yʴyP$Rj7UuA8rJ*H|PPF mS2Z6c)yn-! {VgN KIEiet :/<6 c|5rG'7fhv ҍ\mO\)@ <~ז;Od3q@{{v;;qE7ްgͬFŒTョ>D|Dc"voCrcG^ A|R^,c,#Yl1A̕ZJhA(ZXXJf/;WSxl.h+)Lֆox18!D ??UMhRFg]m{!(EpF h>(B7ٯ}/a F'ZYJb60PZokM>۔KH&*?ڐw{[g+{v>*dYP g֨ rk ^;vђBgǧWJNxH(&3Ao;W6ܝf}'fN9ƣ6Qǿ|zYc; 4O/_rV"9 L=d bȭ:e-DG %1-Q^>VE<6'8 ՗B&"&?k@D 6g/+LƸ5..cDጒIu wC:o r$φiice?*g~?FG Zr$PNU¿ՇbSAeË}ũI I8]=K6X话&bk_jeTcfqeqa5]`U-;E-Oؼ}X@tK[`j|ٙ=]9C0b[]$vD3a0J:\_FIl{Fe' >3hf>߈.8.6Q-\Ԛ:@>,ï@U"E?ܞ\i=$, {+=k\踎ҩ4g [^ume5{G9*C)}uI`JTpHG 4_ D/NqFoY2( γt?]I,\Ў]!egE[1y\^6EB[}2aaes]"zR?[QgP1DFEb43%ۤ[JBjfIHqUD8LQUܰݼbIEUe_ӹ+s=ɽjMg>/RUpFDG0|A١{"YxpzzX~08bKYl_)Twmhk Zκx%=(p[vF|>B8|[΄CLp\uҶ=w<gWgpR0׵ 3еپv(!(xT&9(Ӿ!|1Y:i8Qʼn]x}4"RL Q>{ױ8Ӝ4ukcHl<O87/i>Ż?ŭ-;(aJbd62[w [_&}q/'4WInՄ$}>qFVn7|r{9LQ4SI~d ~dYF/W[g٨ohgBxW?- S*ڽxHqh 3Z ϝ!kæ#$|4q{ &h/5z\FzlF/Kdj v{з+5GwN B뀙V5X4b'-^"X!Ed]"̜0IPm]ک! Ti2YW3»z缅,m+QOX%(Jm(f0L(=x}'V3 0EʫV ?4Xei3\IԎ}}H>n 5 l 1Aچ" YFq,bKUɹHA C@!Yr2IvHoy2` %ر?LQϽy)&}f^+*ZJO /6/,Wkxp V9M4G<\3Prr-5j4;g8\bmH$A{ ]8c.n=vD$C" "c2 I$WжV_]TlUF3+Fu㟔;^ҏ4RL9ak zly!a&\',>},σSbɶ/MR)%_~Y͹F0G%m7{6Ӝ]^Σ *{<]fT^??1%䙙 `!-o:m24~1dچJٗl쁃>]xJC§pSBqv6Bh#HYhO8|?`]R%ϔu=\y9 *zxhgB;{9PW\ֿXHW藮 ^A\Eg?zZ£=jzLL .\BXjh~dJdu_d]gŇ9($ib:K{\[߷8+o>WK!L [RIgYM/wh+˻[\5θQ-:;|[Y\DNVS}j(SEhxx/{\9^AO@n8MҞO3W]汇F&-}D %TNP}.l"B[rpݐ YM"w@m8Kk8F-3$l0vm†y*!~XK᝶ 1k[sGedbe 'l M",xCԾWSJcV>ו,4ASSoX*z*+ u*\D yRB tE3 q}UV['=KJN=ERGCtXj͆_!igS YRdPqE*,]fZCvޕc;}U03XRf'bzmnRL,u_٫uK9 o2>[`aAlP"<2ұ|7ËѤ\;F_Aݡ{:OlW +cH8H571d\gy'3:q7-[S%G,o/fJ)EK/ϥ?OuoxLJUqywh7"z>J*gvYfVKr"+aq M7j_f߯N)=}d&ƵAoѭ+RTHMM4+q۵o)} 3*2QB} J5،v_Sy^'t *{DQ OP͊oT7Ea՗&u{/e(M޵kT'>: a/$PH8Xwh%yyTj6hoi%>ai >h/{͐BS &!o:] ڹ0%Nj;^~mpuܩtZ>b~W@:bEq RnJS #xiuW։g!$tzH._EOj9f0|C~9|h;+N_< ͔+޸kJ0TBcb>A "2HBܰ̋#л ~n>͌Es\^M}qZXXe;{ _ymWX `!,6  ޚB9Q\Ľ3*xip?r-;۠QlG,(9zlmU:pSc 8/د 5Q"t5őʓ.]$u"*NBG7 ̏{PkOI=oYMJќ@աj7ْR2qhmQ ' $(A%j,(=%\r&i f`# hk\5kL` /k5dZ^0 5 PviAM~B?z^3NJVKv%? ul*Q/EcHPuu:I[^5 \,<栊 ɉJd`zv1u{ @%HJdr"<̋=ȄKBIj /.e8eEkwe!  O ES;+EBGMBn @*,#UKfo[/W+=Lqj[mgl:z*gNZEE3{ȱ(mGa x@ L~"qIcTnUo+l-wL@U*EZf|~A^\:{+ph7Ì)*DEz rurju&w ADU./b9x Ex_JtVz/Ԙܞ-.ܨ{c7d׵GD!~.&+ILnMpV{$jz Dch:H o!ae"@*+20 wZH3mFk _)u-rD]c&*, r4Ez ۂN/lj!Vs_#d.Ue(`b?~Ou.} 5ģ8rִl<u 5$Q4wK/ 6G@j ,;*BZ*\kME'0!cqv[@y!(@C?R c/> 'cY 7\ U<| [4=HM5S)Lg?mH&eQ_$\u4yNJFPH5⎞ʪo_EhEԚ@[ka}8[?ҟ NqvXD!?%'B&boY):l\SV`!E(PZ< ̱I/M!4¦ɟȓM]hgn>Ҧ?kmXo!}9" n[H) 54 |4JHk]<76DA) UDr 'юqbnJiVMAXש‘*SŷU:<Cӹ8aAmM!o<\n=B^~R$&2zdn‡^䡽"g&~;$I s1Vf' @Nz "9,R2y122-t uu-"7qb`E/t` ƽԫvbg k"[9? )>+XFfXl9HQ sA E12'[L4_Dw}pcP_5F 'I]1ZGiD?SЃ5lXCQ%3SinP\Mn^(Q!(@ej(mMJPEpw"r8Ə|M3 V=1;OO8=+,4t7k-ƙ'Ho~\+{k[f߇,Ocp72O D>]9=YC뎙1F?ΚI}u|96kO qJس7[fJRqR7œfd_1ؖiͭ6_+syG|jL/y,GV-m߀bMgq,SȻ%XZBy\4\Ly+ Č#CIև(Lc\G6O}Zj4C-Fba~.xgd[5dK22Yhw.SdQ)N۟k3붔R,{ 8@DO}rPC$/0X>1FX|Qp6^)c%Tf63*Z߿AeȤ S-$r*UG!904a3>hnS )2?1#)X-7Ltovk/RUt1SLZ ~`;f1(2bMد\=]!%]K Σ\Dž$'VU]E&qub}fY}B +OXo[Ìm~Shi-8PrX <+  O`:ngE8nht:vag_!KcŖK@$d2_%nh{Opd`][yibK;n03M;_NJlQА{-QX30O|.O~Frerν[DWMgH~H4Mq$xƑg#>T*Z#R}p)T:eY?{DnC̗`m8Hq!Nx kpr5̪jEcFC)tDZ߱z2i܏S&Ч.`Ӏ\0\xIJdShú@oK͚rQk&N JD#dOM ;-V`'}(YS*TH6H߂?$&U Ƹ>f ^E Ed&, ~cC1b.B_ax$L⩴iЍ=LlݼZ')<‰2셒7k:PX^>ItXsrmtӨ971v)l|H%~)`kĥ05 bY1׬hȯX"}lX 6&S a,RҼjPs.{wp$4%^ٌt9>-d6}͌,P0/#Ka*6o@Wf+Igi /bbZwwQy@!rK"N{>ͳ˧B]O6`){?C˾fo?>cĥqyoZW77m茶`9!}+sy(*~Ѵ$FH&x9bP` >ߨ~n#S$sDcY/U?#id8s[c#K `p! Ρ$X+`aI!a6K.ME\!E3L%=PҢkڒШ$:PBꢚ&qD́lT:14z, gwUsx `"Q+lU|W?EP@\ir=e=C)X9(`N3p̦>8$pr_SoG[#Nsh\pi1H\0(/мZ6ʀ􅣗kfՄ=ӂ(j'e LˆvV |Ҙ+`zLN`|CWa[M<%]#KHy;;#L˜^l魭ĕg[Uʁ8)wqkv eeDu:<ꆢa /RE/N(g 4_`?-B; Aev KHyXd.ao=tj~x$4]Hj -OAAէQlgON208 P&,($GMs35+,P|o!漎.7H4Q3eHφ;&@X}--g$C^1L @.tyfqhv! P^S pwK$F@:B恘s\7ԁ%!Fh6ܚpܽGLo+w`HYᥔ|{+:N1r鉞_;mo/QAzNFyd/O7Q˫\ ^g6;g #׮Bi`cX$Կ/yUDH@O2ǰ=. fU۴jW)%n| [O)[YbZ*mЈ.-O]D^4w|\Ewx:#@>7OzLg>[w uK,R9^=d  &HڤAsSZ?iQ( >`Yэ]oN%t3W饛9UF.n4fY>-Iϣr UpK|A=I["BY!J&cr]Z:DR}ҰęHj[j\2Na(.ޟR=") eψph()!GHXrVg)_W֞Aorf/Ow 鑨ePf;}$yTK+--q*dmv$j*7y?CW+IH$/G{لn)&R.7xx]vc VZm\/{?6{#&8/{! pA f%{\E0Ǵ ɄO6s7>~WP)S `XfpTenPlcTM^XA9@(^"f{k~7R@x&<8kZP!|T= .6(Y,.~--,~ v4a3P~"sC:-lJۅyL( y <2R";=wV#ǁ!$A77&ߙ7sK_H ຟ?_46qɧ̩ʲǚ9 *(;{qV~,fP9 9VUbjĝ`o C: ՘_ Ć=`/ =tᒼ}\o(BelqQh'd䧰A(q߇Gޞ? /P+dKJ3qi.mA# Kw#*fV`DW-K~hTtRlX+T|VrO~OT~Zc48ι,VS <3q %8gXc3YL#ߡSNu#QRA;+l=r] 1ߢy uJJV|㠰.`.=Jz˸}XB E:cFJ[JZ@AJB:;;uTF@Bbg{~3{uuk3Y)毁鷸箳EY`#u/ v+9Q1Ey`qD>WY41B( x<-9̄k0O"Lzo>VR3\1?Uߜ$&W2{LV9&z'NXH[mv`ݥ{' T}}4\l Jn 7е Ȃ#Hy3EH}&={dQ4{M](Bs?("u5tv4ֆo >Sh䦟+pT1B]1C˴Wl؇y35 #M9|9>[(f+KODj<1ZZ F}.~fNq Ӱ%rǔ%#Q`Ϡ ?#~J*:c ~]˾K`:HL Bt^# OxB0\Ufj0=ߖsUS׊#qoY! Pm;佻z ":C>$! ~R0<}0w0=9}^gU0BW|ۭg._2cK䁛 c,y覉T-NP:WBQ.gC 2KVB ;ULMp[픮j^WtmHqڣ`On"' tkmњ=r7 C~86WHCvq!|IsYL夻A=ft,|ibv:/\Rcj@b_iKn?ܐjb57d ~gqI)8jQ /1?J09'd~Cʷ%]Dp%xwSkduZU4vRc[uW~Uվ_/- )Vwo,%=}=OO+˒Lfb[= 01kK=뭳di " JcL^0o2+O3u$JFT1.ۖEd">GdϦDžj4xR }xC[M_6/$tX;-MPҠyQ>zQor]]LI}m~=*ޯ[Otn>jF̖Eo)*s֮LLPDL3H=OaPgl'QFDf4~L+߸abMkI_~vEJI>|~?n*kJ/)rzaKXDEv EW@ee4">.O";kD!EJo(Fqށ O Vh(gtsM}Ks1E~ zO*>J~qp*X4-gݟ >Ln7K`a7c|XdaQ=>?0 aK z?Z`Tw p|5½b[l9<]9'3kS *Zu3p,߹u `|[Tp[l0,$1ce}OAQR7g慥nK$36|?Ɣ{ |/kړiIЮC1@pZ|Ab` &gH= c1q4b)˗Q.,,jEkYk/os1"<]w.DϟvWK! Np.Cy@|hpw5ҥKiE'ҩ@,&DJEOc;5U0Q:} )7WI\].* 6lwL"m4 ._`,mC!w Pˋ!݃>O(>[aIl[b xi}Pƕ]L:[3KR"YIo(}L.LJnSME7EV[fIY aKE `1ǔy(SXAu @mY@I>sUm1T+(zM<ٻz0=T~O)£z0KƧk?pſw:vnWn@%o/"bvxGMjNTB"Rq`&_re05স 6_+p H<C?V:sA(1pKݵ^.;nƳ+;$=JRD½]`m~ ܝ' |.V?):LMXBg3!c4=T?MXpq\qgȔkfezP ͷXuRy@a +`|Rj wfV +TMEBX,+1h1b7?.: XPW$ qn4=Áưc8iy{ğUU`inUݱ\I9x9kfZTD3]mIB}f`#Ogd&7z+8Q"zŵۣVa@gm tF򢜷R`ߎD2r}v:xh4Iy-Y2Pob4EҮpa%z3PHoܤ('@FO.Κvt AۥY@McVyi}.qO-I* =ۼ1}#>\ kC \]=k1AYI*Oq E ^s #}9<|Whq]gCL~,bRq£/8Րڽ5/R,A!66說)SV.~^>.T m^*IWM}5Ȣ!뎼y+s -3>;3hX$IJ0p̕i`b8'9==9ED׃ODX†?9-.x+aO9=&^cz)\&X-e\v!1bSJ_ GeY1lb)Br\mZkLPu/^OAe]mf=-M̜O69,!F"(ҋ҆z9 ;<,:ŴXxJC6{ct(nyou8cgWY&~ٵ=饈ǁ6${9M)z@F#t`c1D,}^J}Ԙ{)o!;A{̻v[۬{n2}2Y]RUiScBubxaKW3 2p7gmG6<tv>,NTSڨbڞ7y5./[vWN`](|}$sf蓒1a';чK%mE| @w.,NQ,BVN|ӟa'.UA2>}m1o(aY kOagdd1hzHFUvWd̷!e-M2]{2+b{d:Y8@l)L}oUZY(3 4~Jb_mPeu$]:ǐJ^U-C͗~u[6YpbJr:dAo~Ua/7i>̥3\ddgiay‘l~]ܟhTG >n9_l~]z rɅo>FD%mAh *߼3W3=ѢLBkq3ùGd_cJޏãvVۉK>Nᮇ` IS;|S8C /O6j^5]h=ʽ,*)n߻,C5Q>4'R:a&hn鄙m3g` G6m7T:c"l/;2W ~4b q+ȣ 3U*4a (_bhT nLJxZߵD|B.'''L.o~ iוALmz)/H (/3$3-*udNCD6u{noTx$?)ߨf2)U]VLc /jth7yLܪO@C"{qŗ}3mVY-8:{MN<<@kثRT>h0"a[֒P7Ѥi! koiZ)E ڐ ɄE?)U{[^<#N⎺Îl%Qi&l ԣW0L[iսsʧ!3r#^\96c \M1E@iB8B>AWkG٪`>ο1yC/X|)C〫|{pX6!Usj -jy66jU+mcgJ m2{&wZql^u;ه0'H&}eS/Jr㉯U؏s3ԺKUEE İa6¶?5翶! Ww%#GV"AcLh V]Tg9K|8M:}:*Ь>t]4:#*#pr€n_yO.0mKElvsBUXHrw#ōjm5_L5a 4 )& |y`-u;\)eR#WfEļ)] !r2-duA%DE|0Ef޴ \7) CSU_U} xC"#դ)Rcjzۀw!t0 4L>=l^Mս=EQ9z 4g l!)6Iz &ǝg7{ir1`Y H^dIMd+fҤy\"C"2vȔ~ ~+^VܱcfX]c*bsQOφZ\'5t>ytqҏ'- zRKzKW5!{HE!dm΄ғՎ݊f1*ǿ|Q = (|f?E_д'l4̐_27"0Iqҧw',CeXKUZ,= \2~&]C>++WWŜym"kfUbga2(p&< B>!eVWV+B"ZG 2ֽj(➩*׻ŏ]q#KA +|$f0|It0LN#U2>^H: ,JUѳWj؝=G'M` (;4!Sc_=/ /[514K}kpu Y+u؊Qm$7/'h@4pP ^i&dl0t~{v/, H4T\ӦY oY^dpot9:BOQDu왲ۚˁh/ ^y/$DIaKSZFN? m%w I "EU0 W³UXvy!{S8΂".x 峳# X8jxС@>tbA ra "Ha}LݾA/(]˜Lt104!4sw_q8] oMC$& 8rѼ2u]9W~ ى!2[jAbM@p`Ѓ2 Uw7Mëi4(6rǵx49;ç;RZuSN\vkɜ$)jDxz1as]WB#TJ-L2g >jSj]qnBJdu{@!- 6άݗ4a#<^0LR'Nto(M 0+5(93r Cr;]QdpE=RChR?<{ayR{EǠt >};ͬ+#u 6Bz"s0LZ弔fŵ7XP P5P/*uD0nkD-e[).3kY|a-yJ`_RRX[M! 6ʭ4V9ҹ?ԙbP[o|pi>0(kQa665F:9X$ ,A y S/EgݥO vCK+̠!WNU'h[ 2 w^Y>;(nr וLjQyL=~Sq :~ݝgú<6UW;.Nf~wJ Dҡot,$JxѼ2%1AAtUwT.ɏ!CO|_jMQt٬m>A J*A cƒ @}߲WtxbX_V?65>;pZǗQ3l _.h MBJeN`d?]LYK y3XФ`` *,GQH~指aWH s[(cssX]%wd鑎,ެڑTF*~BZj}8W.he&:ߣM/=þΘm%OS/2 C s&s @R0^됟x#Id)=R A#YG ]{g(de " 4Qǧ (wee7u)&;k )Ɗs) gT 5nLgM+l4Nvy䊦Et-::'6\/vkAq_O{V̭$R;>Ea0I0cIg#^e aȞj=VQEif$w҃&`\+&+Ph}`Et~KJGWPSBz,ls^;R;Ecw㦛/bsF߯U>Ô{y\1~dx%y|W< oO ́!'Q5پV?Xo:)|yסC" [_3 >`֚6Z O}mDɧXZL,ŭ߬ S0.lk[jISᖄɊtE8/>}T!y~xjpG%}zfz>{y$|JFq<(U=SQ{&HZ0+ 20gPIG6ǜNc9"-:(3(oɱOe7[Fp#D"Ĵq\Y/~lָ:RƸ-aazזژRJ&f`ʦH]3"iIT^fbƣ_3-C%|*'.1k6EW&s"n/Ys3 kK}<~f v.hrzH+ת@sdJB-;amrsn^vtՎb#˧85bչqśSNK/n3G<⠿Q+Q)|]q-q4ނ)I4x̯--v0p}ǩ$ЊoљLQ?>{!==YoSY`ŌW\vxnOaaov*M%rQU~m^wF rx/_qp GkeD+ `?Sh²7'Z*&ycSGVR=tդIT' "F©pBa} 2DžlcR=y~LN&20H`._Dt[8tV1Um8k*E>Se`#oav e;(M~q÷ꔓߨI j>gq#Ѣ#Lro苋4GE杠p-Vyt/}#H}qrQAn*K&$ -hPK uHU O7  D r3ޱ/@nx$:؛ARNiC'x2hbe(V|dKҙ4I5Cv/S{) Z#婝6,rt V)5+_M~;SDj6Ga֝ &i^O0vT3l|] /ԁߨ:Pg<t2(m8=injn? CS#z~L4a_O}yI}r/&I$nΒY8~ gr dA1JC:ZiUJ'T:5/RZOLOp&$ B0vK>~چÆs x!d+.tגd c[޼ (N[¢15ǂ9Y7j{rp.9*Uq#ZB!Ոr!ϣ1,&sL؟}1gRWm?v+郊~xTJ-zGhorm'v)**(zZyQLL C$ȹ"5u2;JL[q:s[@>mjK~1-TS<<Ԕdb.q]0 <јveT,P H-e=ؽW؊Ƞraq*9ŵ6bOkYCyIq?lP=N7evdz{ qFgd176-ceaZ@%Eᙂ-C+wp oňM D{=v ]MA)rmLY~h U,@I?_W鵲0İ6i=P#`)&0..jK<) UJhl`Xu? gb4.Db"JV3OTL)Aop҄A# eJuzcOnUNO:{[Q:`r<Zr\?[A/ƐDQVՍ6蓡̷?aIPH}IVveiM Гgx7:]U9|_׍BaIK* ǿ [EF̈nߐrw-u`x(|эWl kI}QB٘59 {cr]A;Yņ?|yFKŌS (f=)og$*Np3.'gݷF.կL ~c3Jv>Z"j] nRC%j`iL&-;0[q@Ʉ٪WD*i]ڢ۟yĹO(FB~zDu[̋H&e]>w`_eU?/a,˲Wت- KS|J}LvJx5[RZ7Wp;ΊZe06aG߄W 43QLսj .k 0hR/ONKƶtD"-*b.#1Yxzx4)_z"|P7J Ŗ=jsId&Xtw1XY2UvΡi)ihB/;H;EpDQJBVєSe>gP0v)|\|%akG[sx6$ۆm$0)A93Q̷2LVc\/I C>Gk3mjGt_jF.W(>/WZc;#Nh/d[&EӍ(5<䞞Q? 2O-^Yt҂.?sF %Q;Ɋ0wz*Eoe&$}C[Ȝ@U/^Of B+(vIV1Nq=Q `­da~!#`xՐAp` =^@JrTAB>7͈$H E=]8(R;U,g:䱋e,BٔĞ\Pwy'GwA!{m\Uu,bQZ'K)t i Of1 4 ꛟsDR"JRUӛt֬$JbXȍwZ tbs}Sr}'%:t]YR]Ffk ';VaLڬ~M9~> ʝ-; sf!zT5ԚZ#l}brqX sJ8k̃ҕdTLYQ94 Up {WRqQOkB=wP!ķ|a'M&Uq4sVIo.?}S=dI˛fSF6VVYAsp rK7 Vs!sEj:*06ms !wKoʹqWEA &󥖺j@ %cZM6 ]0E?9::j{XuPZ;D8KDfu.(fUխ᪮xdtDށ05:YQ#/>5Qk=3J˵?3fRұ2V5 XLF\ҳФ2` ]vEsOy w)}Ëct4l*)jfWb( 1kSfTªxpX2_CbCdkV(|ZAbOF0<3Q >)R53)U㻅>1i3|4ѕ> 'vF:SM k ]ٝwn\*s>1JhSAHMҪZ3"|P)ܗ.W ;`PA\Vb+a(z*mgԳ=>Kn%Լ8 EaIi].*5C?u* :v}ץAL5QSyvI jo,F"t*Ĝ zPnsnW*.ao +qOK]+fjw–T.!/X ҶU!RK+Ma;)eQ f $UWqyg1Mv!Jml4^9Ik!ILG9+̇a*yA!Ά  "9:ukk(S?Ȇ2M 5V޽/=><?&uD5PR2Yb􈸪)7>HoNնW,4,ir*UY`kVvݭͭ3FJ}|)A]WcÃ<2qA`EvdV#tW(0R1Q\EQ4ضXrH=!yMȒa/B>[d}Γk$Jn@dzr|M:':Jp{>3@MZO /F3W RM]&Y\M)UʙvF@r.Um8,mn5[.%`%"E CD[PP us|yM[7ntht*/ 7fJ)^ȯq0 *и]ެq+,OO@/oP%0mKik6v@~6hdti,Rdm+BrxPp-#0'{4j";g13+a&R}/-WfZ},,nmX& Eo˽ܽ,?s,ׄ$`J]! 0m~% C\z'Q:Jh$6`7 L]=tY4behHyݤ9}`Zp ˬOtzV`v;_#$O\({辗Bb%߼@::+d:q㱤ӝa9 2 '*ZŅLs Z"0*` mz5z)z<93e(MĊ1.UjjT+R'^6ۄӃo7XW {jWK:U'Q("PUj|S։\T1+KDijX ݯF sy{bRHb-*P6ٮeBC/X;kAU5՛Hϗ":-ڏݱPh/=N\p_3TcmYȞ { B|d˯EA0^7$h0\= "=DUyט=}ۍ98?FJza|1a\B~AX_"uZ-27嬚JӢ:k<՘h;ʕ\ 57[QG@=jADgQRZS,W| iBYsP>X,h%jSr䚔\[~x3; ػp"w b2J.7,fif-9D=mԿ93O_3CMNr盂tW]MS犡Bqs݅% E󊍢ʛ#W9@g|u8aJ<-[ 4b%\Ns6SZ0r=OC\L*2wjLfս?xm~c3hYi˼fk;9xMUZ dNDv8'$e+߿_'N \K dP:(A3̏Y)mNCF<ȭϏ+U k =:PƒwL`9 #g6)_,HA|[k;19xutij0>nΣ>Լ8܅$*{Qr:+XTEHB<ٔm$mu~ X'C#N@VH<]R`Xe"gB ݹ3~9 ,A9%̹_wG0PމPqpUqD;]`ҟSg!m(kM|14r'ڿNYߡtPR8Biss>T~?V1xq=C# dSm?_RrW)aiu94}Rz )%bs{nNf= } ,u> >Y*M/ͳQrKU.},`|(ݰu]l麢sؔH;vX Լ"V4~`>};ί]b)WBo&X Ove@a JXpWk?xloӛYb (r7 6aÚ;5# z ×J*J.N tEMCv<́xJ{iODAe߈*<(&p)nB'.>X$,p3#X'gIpC< Pc!Q e|9n.&;.mPEC|*q|('&DC oF e{YO Ű Fnfzx槦ҴZbgSA54\o7[;~$\7iD i~mUFIeE9+M=OMcL`Ľ d#]oƂM+<݄2L".ϙw{'%L83\_5. J%J=6j̽<H>7Bbw.w+XY̩[R-[Ҩ̖IՃo!S_p\ fD 'Ô JV]y4$f">#$J#ZQj\ G.M`_n ?^͖ cy֗ i/?Eڎ;~JV1Ae'~>{c#k)8]Pҁ"H^񷜾34lwIR?'ۢg4j\`eJ7DHlgGGxBޠt')2:O6jl:|3I{Bv[:7Ӿ?F{e/ϕ:vP\Ou qqޫNkFkшjy+w4M4z\u:N"GMQ~O3|y-| }ZP;#>}ϘMHs\"Q{\vۆXjb$^)>:lose<6?CG:Y{qC_sx xBG;Z|I h:=oiC#%UwS~i|iy J P{,BzR^ gBWIbSUwai\dnfs(ll*#8xZc8N6v5IK_ @hۦgw-2\6kA$-#Y!%p稑/*v[xO:d<-; ]g`.ds8 -:.q I7A?H/x'C(  )`% .&!#ĜG'6.̀ݓNN/ez1 v8o{5Tաzp]ˢp $o\t)(wF?\Sr|"^i9K(ùNEhx޽GS`ۇ,zFB/xlf.X TVGSϧ W뿐/7ab>]4o\n4ltz<DDOuyW)J`q՘É< F4mAgd4vw:ob eϙ&9$+_c*$Y8Re7=) @Ñw56NSA4;H-^݁t=t; //{/-;n;7;-~.^}f] K3W;ZWx"g;:ǘC9_ Ov% n߲CB{QFv*=]'B,vד~> AT,Bw5⌎Zw w $OnӑeRLI#d$Q4!0\$eS(AA11ZP!琭|ñ4o,@P[G} [*{<]wB:F|&r7 UHJZLNK7s|?ed6'fu(eC뿢[GcdP?(,iTq@o ON:r.^fJsiq19ێně/T\$d+Ζmy TNud 뺝1e% V4cmOWqAfEՅBU&N/ÃiPNܧ ;7~eXQBJYa0O3aΩ$/^^/7igI%m;-2ia[Xm' iMR|rܯ"^u_iJ՛W^ު {nx_!RbHU$كI8ؾ- ~ԽnizKA'DGMb:LPGH4"4hIxEP}'38EcpP`\>efT-+^oq`U S|?"ڧBW bxf3H1U.c\ !J֟ETjWElt&tT_I mg(<#^f#><{A~Y>msTDa[/^Q2 O?;~6O,Fx]ׅۈcj|}Si6}v$ݍK\,G]x5V%âAo?T~v&I*#o䜑WSKl6^/RV:=%.c[8_T:J4БPqP8ٔC+l&"=KpWH|8;oW5m"B*%`72 K0Mg*%vwi  0ޕ0\7FP\qF!@HH%#(ߔ~"$%Y T̥7DKhXf Q@#CYHO2Ndn.0ݾl"ދL%D+SD.bl,}jQ0te<DՈ ;', 5Pl6&ii'r@NSӭ-mKW=; .x/1Qƕ0ɫì knHxHvh`]7\,sO#?@D@4uRL6cpX횦m( jH`;Sq~.d54TK ]q~ 9Qc4\6朘1h+%65m|aq #΅9.V%8FpJijFu-Sjz abM}gCV!"21J F` nTtaA V8[l}Їqzjc #&"gr;s%`?tI#C{ildbK@oGG6ڜlB%} #c^+lA'r/҄-#KV\Yvݘ,JPd $ԎMe࣓mHwe.L05AzDb)|Ux,l# +`9\syϰVD@gKx`J:_vbJz6P3sRjChw?Pkv,#B~J;G// @Z,Ȱ J+~0ÍOZm [|(8*ۻcD_%HCz4)e*.ru /SwyYPC:B "Yxa3^r ,V:THƊ:~,1EIj6'c2&qK΄K yP\:l: 0X0Y(b, s# (E % .Wy^ef5]-`TE?so ( v]hYŴ [9$O6F|Ŋ-] Lh ]˹A&XJB3s2xe}wX9f=?َD#aA#ՊNAX.N֪l{ 'zQ$GބB*Cpdv`[\anDzop n5q,"/%RߧnM1(a_{AR(tȼ]鮹XZ ʙ/M͖T Ј07C䎛IFl3*ȗdi)a)/W~C\J+Xp72B߆=*΄[܆xJeJʑF\y|S|dk9$m}5m+#t}>= sm87{s8"Ii>uyI:Af +$@&;a2 HF׻y0B4Ch41u)C* bw04%`iVph۷3܆4FZD;ԹJJ'~4z+2/ыb.,*&rg?}.3clZx,,80x :cbD@vN!J ]V48ewSf8jtunb G.!4 Gx ;Wң=eBvV ~Yjeژ&{8Nb7sxeq{-X-?Yֲ윩ћy;Er wY /{ipY=?~k(M^I*!&s M5h {iǶv7C(HXcP'L*EwE3($?Y㎉!R?jU;3$Y*;Wܤk&~83p, #_ᮤn tk6L-~Bdj ;:Ooc uw6\F(h5R_c5N' $gB I[/z+?.lr*ʱ{nY}7 tޏɴ oLo2PMZ deUysQ0?˿nPN흳e~j![=}NG}-U;!,)y=Bz(苘`|S^ $y^4.}}:" }CQHN\/%vNJ~Un + דu 1Ŭj΅G6hv,j=€"% )ϫ2or¬XˬpTh4͕@o)ՐjC>Ñwbq\0Yl$$CcOY xu8q -ݶku `j>R~QbwҔ4DnmNf#;'_0w fʬBHg{{ W{pʉIW8w?NO;Y@L@g6{NI[{ݭi?eAf}/y98@@TD6:'Q/<,BE莄PPe"R~rݬ+NY~*U bo)$/9)O13nz2wdQ"G^2.1kc,^ohVF Qkrx%4& ݎstFJÅ@ztw7;wWf9()|"\b탴+<)O@nH{=e 6 oWDJ V{ײ<*jYE*U5E /']8@O2j8 g96L

    Y myC?%3]OےQ2%- QcT˛xj|\|grE8!Z\Ak%\FфWQ pnd䅣hT 2eۜT'1\60ʣD܉Hft34NNs՟_^?x__0EzTuuu*lpDsۃLc X1 {\ġM /q,BX(&L(qT)d%xe0w#Śż u~Y`d^D_j2.6A._M^YBF1AqqY9NJWIJ#E0b}*,}c"PkUGb3f.J} 2ίOBj@ba$S5YúUq |q ,6M22w?I&1%0NL9*F%O9boF~/ ֜5EmGFS}Kj"cTk_7bɤW񒯑,F ֊@ gKbfj_(^4Ym>^놀'[5$A;UG5-UdUT JaPټ~.*BFp>]KtO9* l>"]4a.я*Uԙ{{sDܧp]f.ƛt 1$V(,q}_c 'o4˛ WLZe+][ %cg޵tMB93*ꯛcSky!Z@U7PNsF*"3ws×}.TBC$<7]Vf{7,Ԯw9PʉA6Zю*IPxܿѢt|>D|t47d,8S;p_ΰ@oYRT?Pc3\>NkgR35n#B.;@7aX3aT*5Yfq{#Q6 tqrCIꏃ![͆{A)*ZZ-SHw~5l 8eaӎeΕ 'XH?_-QV~BY\ӈHn\8DZ/0Ps,MpeR @PRڊe,S/|8ABwx"rLZŤnѯwî"|_DTdCq7o(']bC?_ϗC@*/B%rW;Y;N f/ \`ѿ.$)Qe5lof5caZ!`CNhճw;K*ƒZ$sڰ7&GjGUm4qN^:A* gZCy/) {Nbߟ?؜ch)HMK3:CUi恐sHnXW<"$~d(xE_G˵fNKV@'wp9GQ8DXVLNeC˟SV)·#9Q6ǎM*@ГI_p\6(|N +;8?.@Z}S2XەY*WH)| !OA_爇0JNJd {{ h \N.!WNrOg>vٔfb5?AiHW nŀL.e{_ZdؘkLǥ71 =o5o O,m<ԏ۵AUV-Z F`HN`Ł2!Օc >aOjG#Py_P(Dġ盽 -5S5[\PI;\}ܮrjz#^mƙrRXql/Xht֭D2Wh^|y&k}FN Uú[74 18A)p%'7ܨ>,F`Xs?9vX1|9 mHEE%w]gZCQAڜ4hLT1s'qx吠9DzkGN VIC@el ut`@bo7r.L&X~vۑ|a$x,SX@hz-M%R0KŔ,x}T`7)Z|6 ) >tm_ QGg6{`(*<,蛭0YQQe{,L@l1Ҳ' =S>rMy v#`l6c4dVeODA + i;^+bfay)X1D:etdЯL P:ksƏXk7aѧ͏4Xr0T2kVmΌkvdE1@Sd{VY77}SQw&dB[[;2S6\]z@^ϪEFH,)J!%KE13뗐vt%j`*+-5ƣ-ONI@@`#ج?GT!:V Bu< iPd+u 0!lOT1oJ CFxv?|8M,g'* *=6777ABVKE/V6b%1]zϱ ED&"vu@P)eΤ nGx,\pF |DL: 病fZ S`C2214T6>&6c)рfdZeQzK<5N \X-,c Nj4[GZJ@dž AףBRLN:D)W.?P]NKE"qr%]HVB3̌*` +|z<4Q]HDP-GJnur@7Ȩ~{`^75X.Mh6(/3GHåmt S2i{=9ɀRG@X [? wQ` `!۪dqL'gwvDZ02[-OTtzOx *( d#o1<("@@N#tLtџR@޶1S9{ԓ6F-;2ѾWQث3s]K[n}AF3<7 rn>QHf3#F" XIh>\A!͉p bv}Ju?-8~%;%,8, NXll"<!%;t>2#b#]1EO`ir`\m! 颫0f^XD\ B ]  7}z@0E8e_3K%~5̑Jxaꛢ#um۶m6:ձ;v1;fǶmF;ƹK8 *ն;㹩ZEt phiY\h4]O1[ܛ}{|ZC2x{a(R)M?w'@Mlp^d:H[LbK ~{qѹP4W.q @N}2% R"yDH@o,U5QvQfʧI,#,B)Se5A*,H)R(_Ǟ*aS'2~ x*( &m*s6 kkalV- VSPXʠ ,V4 KB\eJxJŌhء#IxNW;˵mk"jT³Xg݄RuPCҫ4:5Z^X9:QN@ndodtrjRtag&)|LȐaLo4󸚆[~zzPL{^ WS dbXc8lLgm}} 5cxQ$i%S:Υ܁zka#{ǘb*5+HȢ+R7xכ϶;@~'gʟc9VyސU2;"cޕLybkYYI8'ֺc~`>o?}H)'LGt)RNvчN6%ܙ)1_$mD0 ߺadQ=0x"vΌם4B.?]7L##Xp>!qKsv}R&+ZmJ {Ox)msPSKHS4.-c`+-VV\bd.o/'Z˶I6MՄ gZɜѐ˖'!L1ݲDTׁg]X#u:~XI@BW84'-L'p f0(j*nú1Q~z%f59VD{H@LF3Wf ,VJ ++DȫeL#fF=9PT@ܰHVhح€!) $!^4$>ۤgnor gq&v,Oc C1!'ܡtʄVI"%LF)=dfB4\m3펷ב|{.pJF=i@ғ tz6,x4\+=5_9y[$'a2Q{ЕxsP?$h(M¢"=FR[V_zAc󺕯Y1 D(h=RaZ qpvR2G.?5*-+T. u. UˀM{h(8){`QNH/#VХL#qY ("v'i<ɢr%dPT^b(_y k+53gY=*ҥ? 6״)RxnpLW,6@Eoj+}ZB;ZKh{ YV\Q${9 x}xrS>u^S>sX@tdu~Ef ^" @:K(%'g4Na H$)Su pxϧ 6tK.U{/&qBBOPaѩE̶SEty3g½^YgrLcҧ9fB-ANxoz+$Krv9O;-r=V0z{BSN2V2U^KZý0YkHB 93ͼ!78IO:N@MDs˝34H&HbS҃!JҐ9jj>1X83g("CYND%c"y7zIz)4PvIg2/r ]Z j;aib koJH|+yZKpAb(\wDfpfI1!ҜGT^_ѩPQhűoݜK-nMNRj3>EBb\t^~7>f.Hr๺x"E ^FLǀGXHi`3FFxdfgܟZq+6##A}[W痬6 IdP>?}t1RpbC Q9sr;J([{)$O(!KaZA/^SYx(3=O>6)HS,s3Xg+SjWhOqKL #$4w݀A)tdm24s3A%#4Dᱼ(t{8Ppuz6ڻN^Ar d:4=<|Ovn.Sij::c1& `g'=.Hj;az} "cE5u*~:JIӻx/_G=X0^s,[`/E6륂0e0Ni}b|9FɌ+^)QHovF1Z=ʕK=l<؟V/Pz ^-)x~YL7o1) Ub/~weCaI-FϏ)3"ygVn4% qtP[|iT Sщޞ'F[h g/muG=-.4ظqGq qJ} W$.GJͿiUq@Fз4Mظ%HlC9y\2B;i&^r~|Wi9a<v9#$MKK..]QJ%fP>6YqP:I10P(1db\A7!JOHkXg%6]v aMnS(zcZ18R${/从/f[sYq/c_DIA#]5R>ӌIܶp%C_ِB3ĄHwNF!6B6[k$fP')ь?e5+É/֩q\jdyTYmHq?[1"UnM-q][Z*F2D[!;-(UNGϺS^3+o9 NۓHCiގ>hjGWTm:⵺}RGutsd~xٜq !`b= `6'De=4(r{6j_rΏ9Zyvu "SV5t9c 䇯Te04y_+jd5l~/"wގK'B{8LxՅ Y|vVG5}9[4??^2<?HrX '4p4/XKUqmrmiФHC Ns2 0_ضˇǽRyZ5ݰWwBۓ;AN}JDqlF]^NxF&j>U^> mO?Fq5.r:4 b) ևo=p=hKv\<;Ņ|WDWDDJ]Iw Iy%kaψNN fy x/*K[6FcO,r,ϱ/'4)ȟMQV) fxU=|(I7du>Tjf,#@BNSQ:P_sD"r2nq):kI%Iv\oTDժ/PDu9yEiSR26( ɲ(nt~]\p . 碿BI1^洱k O8 %slL:4#8Y|F᧗6dU&n2Cʘ<+BoasXT'=6ۘXn%$R~YqY.yٸ>[f`2}< TV3?Xxu\2KK`zwjMuaCShw"Mn#כ "ilS7ȑ\ț%\-0ڍڑz:7$dF׿%r+vdﲈ@H2Ul!]\=RMx;% iBm4LcOaڙ3\#4 !Зtsv^tյ/XYQx(?9#je6: Gȑd_7nFf;щPΛ#Lr|;2 yp,{;}<^=(I1' bْь nb&RTR66[6M>;9ETevَ&ͶZ@"or͙@Я-Shtic,, + 4*@D΃PS܊(|IE#԰~_I9BϾU9WyR,A.X/#Ln \#`s}ga"Oq(KJ 8񨒹SFqVbSNg1(n^.%5;`>3^_m2.Ncg`vބTpS7ֶg36Yk({~"?0x'_%odڴ4EiXIW(d'Fn؃q\<ɤ,2cRDI\ei*tXz"5~0bE`-ouV>8%*^G#j#< }+(,vXoϺ~MшӜ,muCP}Aai9l fV'dfnLglb>d"뮴>6= =I.&Lzx)58zM9WyVuiuS2 <<V(i1"|unk* }<{|hݴ7mbSƼkm_-OyC1 _ٽ7hEon׍W ]؍&%[3D(x+ q1[%6CKru^$̽ͷ #8ɿsA+?|sJ!>~V}0[K*S4v'{bm| $Eg64]P*/q؟8fz=7䞜|xicvܸ|!lw"aC ч\|P h֡5M0[&}#37V㦶7?f=9b, σx-2,sSmU>%o0 wde˚Tqq_ʺf%]Oy 0X\Q[#a ڭvqާk-}5)Tɵfۖ91z.j:T9|>^F: ̠7oz~xOe0zp쯯|}v׿=1?Jl䋙w~a {~Eu{GI7\N4 qzw_EXM;\'EŇ?"jRVe}>fM8Q;%B,uWQ̟LV]=.c6 {jepb"=ቇ^QBE[V)35O\ EHiw 1$b[4k2Y.' y›+[.OYQ}}wC Jh-,ҭs#qb mIO*+SW\G+0Uۢ(ocm,^ȳWud}wKuj7v)$_@Lq̬Ͱ]&Q^i7lEz\Gk[Q߽䠦zq.#Fi.P{\ 4 {G)pbՙIJXO⤌ @ϻ-(oRd&C~LY∏hZ&77<|z۷>N‹N7ќv sO!\նu-nE|_DM{ Zc}mąSY bS2p`ekHos$j`s?3{ӆ)m*""]7)/PǮ\ f="_ %\o~†*1&)!AQhpqILN'T;_AWȉQJ5f$cc kB{}7Ҙ`*3S=ڕ@2+=z'ƠPLaBԂfkGڟ)Чp ExlxȌS“:MP4fδ>tJSJUG)Ha6mKXA~*$*ſvpHcu\ˣ/{9nqἍvWjQ  '~J mV&G)EAbQ8'~ K( e92 7s<Sbf#@h;WΡdE6͵Eqnq͐ o=v8F8;Zf㿾 ]f BV ֣gx/W= [1AnⅷN0U~{'}Av l0<@5nb 1HYIȵɚb&&-H:̶  $;X,1v/fWWHq"s&N/&׈{$RAl^ϒd/H!Tˍ0Ȑo($I_[boC#r.T4dzUґ LyS)!e#]aӚh/b%yvD}4wC(vſ v ^Lш`Ea sc:J4a%tGe.-2311(-f~̊:jb2Y_0"y/a d W駢GRw.de #&cv>wƮz$_\@(mK=%|hCoҎމ4` ?HbOab+Y:wzx7;FviK*7VzZ<_Ҍtzgvù@?|XuPG$ UU貊h7{qӚ8-{F![J}[UƝA -Bp~vp% KҞǫ <ފ6-,Xg4ߛ)@.Yi9jccsuڥO#NqޕXEDΉ$؅:ٟ{s*\/ ȃ|Eie}uF]_Unm \l$ .Y4vl]&=]WRG 6|16'* t'q$ϸ9ˣ "2#+l{A&L<_Ҹۓ p,Р+KfF_!8=.hQ6gBL͸+/bG =fBjJ6=ߋkQi e6{FarF8šLRa7mN°n)pg {B +C_@%+PBc)Xo1OxGp~r7j]!H|A0b{ ;ΐ2OcJ .,l;ocu x:$V7gU w"eneI*PB IL1ƒa6Ss%XF"H v~3z BŒ!pIpyփPE&o  WIFLAR\r(+`41Љ{o5ӕј2!PiZ9Po2kM:]HT==1Y&{' Mg-r7TaF&"L- .tN[$z?n?=@9iY jO*3[,[Znh i\MtFd'Oo8^)[dT}oO}9]jܔs},vV^.7IrbQ B >yPy@wߘY\jJ C ݬ6 EWv> ,[>o81fxVRo7]g2q<1xK 2/$>BR{ jI f;}0FJ׫j)JQ%D3}`YA,>@}gcCDf<}Ļ~v~t% 75mH7x]wsYu- oYY 3 txdOq$DiQ:, gpP;@k&Bt cu@p䥦GTz AR'Ae[f˿փa%!S>"D/0Y8YYsB[3y='yM?[w%)I)̠w%CFjNWAѯ©*J 9Idz؛9BPnV zU{S_&{rGC֮cIj dʊ$5Y+|f; Rc(l lܬ/^KY,@D@N+K7 kuS$C~8(VPf|zWqpz$]\{(2^HB|>o(ZbBfQ(hSqi`c{r,qaRT衉񨣎DTeKDA#~ChXx]Zfzϸ~5IڵBG# Y: 4\YW7/b4 NXO㡏3g~89ȸ(JᬠsVUȔ&ɮǪ[߀@ӢQXK$S('އ[tŴE`=:A!qoc v1⪜Ab/ˏY*1WnSa-.&|=J0Iwn+ ldގ~Q-ўqfa:I*gڔ8 R|{k})R!l)EÑKy8H!'QӆdܡG46i\MWA?ry;M8\*7~WR' 4jb\X2On'Y$)6jNu oU^=plG+Q_vÓYNN:!_>= 7T|>>C/3D'VW??%"iBvHۭkH٬xtcڑ?] 3lҘE:vTJ~M?iAC~x}o  q"܍(KL )i$ FK$HɘIN]$k7w^>Ui2#mHܗ'@$,WZTG7S5l)ͻTܡa\$jzs'MC7ZoVvGis@.\6U4jcIÝ(˙N |?E63Oa$_eeg:Uq%䩘dgúBP$>FG/~|9 u/FpZXI7S뙍[/B|@/i3]HTIPÐ1vx=ʱ3˝{{Emgmsda\nX#u/oQl.!Hl< R=e(ah=X`@j_8 !p"vmM Y>ua2,1b`!#Esv81``Ͼִ0In9@H@41:5X@4>+0dsHjzcU*֡d!M.V AznEsĘgq$^#98;"I 0}}kʠf\u$&"ZZ8͓._zd m K󃔲{k[f"Ƹ CyWyןR8W~X6=N>vl- %2yAӎX[k3i}5gMI0IԱ6[BJpSw|v@vi [_rbOnؠM`îҘ@*]%˾ܻ". ";)3툩؜>QG|&m:ܚ_j,)B]dOESJ4O[>qǷbRJC)$"+Fv&.zD2^QC$[N QflWS 3ZL/:N̐9~{ۥQl66Og8sv"Z誨d4z?zxyD4 @v~(PpPAͩ\rՠ$pp UEtroϳLdF=Gy\9Ȁ=:!nKK`nu s?ɝqAYR-}eH8/ݏ!O5LQgp1T*) РR䤤_apXI}^6FSHPD E!B^EM$IWGF (PIج4X{;$280Jb/Oj;>4kO""Ja7 gy@]d 4Ӝj'%c2nz\oQ֬l#mu[I߃-K6]Mj84do-a7a90>E^v8t  vtl`[v0MKFVv>Wm^NP{m:㒌_)# ϾϷܧ`rЗuBb5Ƶmi&_>9UB_KV$IF#+yGG܏h,ُ@M e+%!O7JfKHu&2F#[+"%9,96^*_ )|49ߌaNa&?NcgD}:Eug*F< rGthO5G킅K($rdmMJDȒ7vB %}J[RR408Cw"<7<}/|jb,\"[ `û2+O8zQd< p\HǞMͬUHOyeLZY(HSԶKnS{Tvt _4e>X7zE0V:fD*~ꯏU,á'3 l~kR_EFQ,,b [=]OF]wXЊm?R(g [_ N<D} Gg}͢CWZ=L ҥ_ݙyߗrDEΕ`4YcYɪ;;6j=Q7Qw0hxYѧ|W\ot_g]m(ǥOjL,(VOS^ l=b2(ix<^~q MCɉRg # d]ž281C hhh-CXFDYBFf;i#L}H]+;ј)ӝɒSZX춯-r{A[C\L' Ę>cqN@u=R:y[~y<[`}*4Dh!!ٍ6d@&u*k[._:M>Cw纁SU| ;]^E>=m^"#cٖuj=-ߧhForّK͛nBPU܁!IubO)A՝%~FD`x:זS+FQ[ް9䎪4yӇ]EԋJ%tߓÃeٖai;N ֲʜݖտ'O # 21`ϴNߡJ_s$J/{)rQ2&d^`(ej?Q!d඗͍>"Z2&.@t4Nz$!C) hȶտ/+]6o 3F?tڨYP)qky@OaQʰHwc 8 ]v5t* Zu) u jU8镯c>Rvi~O:~*.%J2t☾d$ٝJw@dqlC~02uadL]nq˶m~ݥ?]k9[{|\&[ָ _ )w]vܶJkXDC\-}4-ͺ?~6g|}<9nq9S2*uX0a݈v;FN('%55 QDӦ !PHrxX ɵaNl{I 48<^_wj60"sqųqe 5Jޮ"n9!f^ԭy!ASyrjm &?b82R!;wDBĺeFIi%Qk[2+ M#@iܱr#b(\*}SRB}̌,#bDvn4֖5)Ly-Quغkj TTr{ P WnJOk@o^P n)YRX+vrodF^Ԅ)Sȱ6jA]8(k`Ҏ2OV9x>Z7nD%жǴ$.LN9nTŶ;I1{]g,0hI80m4ݎkr&k>۴&n ghwO;/M{6_|o^WqT$-@o|.OGʤ]z{4{.yB6>џX8gAvKz6mD{Sښ3L)?3)No/3˸7; hDrᙗmv>uK*uІ|+ŀ ~b8)n YGc~([6MgۮS_t =Y^a,oE|JF kn$kM֗d=ynKs=gS{Mo1{DuWZ::$ ֍HX&о?%OtfІw7C7wM_MRT܄[l-LzFOS++0wY䯦OjjȪ_~-dgRI jCSO6#&FPJ*EXy˴xL~J@OVmpAJ4Gzz^$,!!qKq. n/0EY&MuJiFsr=fsÆ|<~f9ynTK jGןZ]Sޟs= b G2x(V}9ޜCE nco'Ό<Ie!9C엝FpDtʓDrr68pyPm&D[bUk҈69x{5sZ_[Õ7]bӶ|kռS̺6bk+0&گ68V9s}S==(lh7J_7)zP]*]:E`ZHֈG?Dvv?=Ri`MԛH*B*&SlL$fVs]K we>lfZ߰Ӕ9th&C0z #-aRN&m g`_HF5.]o|$!X~'NTiP;ziC+0RRpq9Zhԩ8w3(v0WaQvt*U^Kܡ;&הe7`i&|ooVxcIU7 _pŷ.#Х  sf q|eUF NT Ʊ,Q >c ZmIƍMntyRg 9($55QW/PR/Hғ*nܶڽ9ضn/y4S]ԃxL]u}{6BqKs RQgMU-E|} a΃rvkz~1&?w뭭v)szJ_Z)-/[r<y(Ea@G0,U#m#⠦<=~\P1ΙG{^fN=疖f: ZVο:3_@qxE%hYƓ(S]iZL-_T:>U?@{x\gϲ!8yXVv ^@ӎ\CXN먶f1܃{1 m~Z|9?K0YO]4V}Vi-,9z#Ԫ)U??>ގ3u)tTˡ#"LyYYen@iY9o: `@NF:k4?o2WB+M`z/C1o>+?XS6KeD #yn^JٺmoSi5@e(+!:IAUK7H -*ՌG`m@2@z{ `8$v6C~1 }Ʃ(,*?o,N_*~uI|%+ZLB)'HOˉ@v;vws؝7{/.'8(̯@D;s൧r~y  Jn)T[p\R.B|"雔}Sw| L9nN*xlMMAa߻N7/yulÿXT󏟘x/#@'߯~ Ƴ/>obUT;~{cxNILW̜ @5zvnXPSlw'7<;?ҩ=ţ~13q3L]xGP˯yD2É{ )>i-`\v%蛖 5Xl>` po-ʈkcGF@QI4B͂6 4E>*Ul}x>c'()a88h>&/dT$AcGO`[XBDb P'y&~~a>F1OK'lG@&;[7$fp55սt6;~)e5<}Ky?ʺSM8;`OW'| uQx6mIEO??g;0Yi_$A6u:_1f(S;ge 3/w}L;#&ί qw^4'x.nȹK^{o\w!ko'A()e_` ȿ7}'~iZEL\bna7}ȪFLf?# W":̸x*_p:R}&@o @>O w(1ou88G~8f FDioDO蟑I[Ral\ z6%!/?dR P;<7z/b#G UV6Ryb9֊YH 'fbywuh#͟6NDx8FTx(EiEͪ}#{M}w8^_V݊T:5ūp:Ó@мy3D)DVB k>b x B=u< !w5N`"~lobB̀ٽq}݈a>o u%9 J]EFG x$*>,ˆCw\;72TU$Mp2e,F'ϛJRQTX.aϊaNTVVx;vL] =̼i%??9Njz1}3SǙ͋fFA?ӧ_߽@6D uwp\,xM|;W:Y,$ > IDAT Hf[~4*=GJ@x 7!7 pxq uFOɹ&*coϻ ͸x Dx2s-Tu-FΚ(N5d )™QQ.jӰ/شiyyyK-@uMscæ]?lxRBx+8^TQb<֚&|_ |;tsGc*ZbܛЄAf 3a&&"Ҥ Xt1v?FL< 29Oķ}#*gܣ F|X^;}@'nlt;Zڸ;4[f`ܨv@2UTo†aΎ~ &{{ {@KjᤉĞerhi$.dXlNo/nɍx/c0VuwQVL&^Vo>9(÷~uJ,{}|[0fH 1 k& w W}K$U?V55xWo9 <ԞL-UU{8zʈ:a촑ɍ j?EpxQ\kǖPFޭK%QUQmb}!jUUWw7wml 1XB ZP}g\ٟKn?4pԺ\xdp7מvc<[͝:,_cF硒XL \‡̍HxgЄKP$GS]D$AXwVذk^=voбlO>o!:`5cˮHe2"M_2 5sW?~sˈ_8v BҐFFiRÇ}{P޼!QD%&\38ɺd) C:/ۂdHMIaZ:$F@uyc_dؾH44z[7@xK"SMw6"(1<,a6"̣ [6l !,z K 4qt[sBYY8k>$yQ Lh1~Я?˹ed "7MvMe31ۉH\>-lkyg8{*l6HJmk4Xkf '98n"O(/a+/c#VШD%bBtyWc@/&R` 'k<'>T@(%ζ",.:#Q'y3XRRȏowHCcJ9bd j PÆbgēU0 &P(yg rT"|JL/h+;oLA#?}h HM$AdŤpF֭5g٩kMEH@}ZţGE.%E#lM(Z :xz" 21c?n&yԯWcD]vpH0yjg]gsM^:i9#^EI\ޝ*a3iѱy7gΎ>sѺY0mww]mݻmyy Ə`A ZlCw?楗^;Cv X&gҵrm$7 ?/4.ǡ4R꼖R^0Iv0"-7MpEPp8I0.a~JYb<9;bP!y4sle:oU:c1c(MjkQ}JiGA FRb *c"/>اO?=b -IY=%Od~ KŸñjشa")H28"&E? &g`a쟉Ay#HC{%`Q8Lƒrc+ϡi\,\FbG"F$$wr@녭7L>¤QK¸X H3/WІM`\6%h2cY_jde%,=\mt+l9PP-2wc2J]OJu5WHlNQ>r.2mg1 _q{Mo|RعlM,`UGiHy#\0rp'K/tDa2raiZ[@tEy?e )1A u2qg]YfiؼO|~\snmm}f태C LZ#܁B[an-l 6+]Z@JO8IC;14; G`2GOec2#FU\=v.E}[$`Gba1}ItUVb;,ڋ#&al`D'!#Nj> 9Hb1[ʰcFW(ӇlAHH!PZp Ԍg\dF gyF,Z KyX RK/@NfvP>asFnB B,d1ScЄE'RJE|P=uf U![IMF6A򥐙w%#S",5]B$a"a"9XG\rWIOktDP ɨ*)I$Dۊr ERbؾa?gtqغuk,OHbP#_ذ鴳 MB;+6 m%~%^Ž4~T)gs!lk1!BWCi#´!ϧ4o]d+T Nм9 }4G;sU=4o5˩wd$b#8E{}|'7a 1$h,e0_֏{A ÜM}  SHJ'R2TO Z[|)5?@Bl"&@~(: DzXg1d;4yt}/5hn(cZ Pgm͋mZ9N$KǐL`S{q &݌Aui"Cz4ףBd3#j8ɿNlBAa)| {HQ ZK"TT EdDurI&hGbT6qAc-UPGu646P ,lbj[OAj8R4RR~ĸ%:4o&Xb4EBU o:H fM+NAT:sX aEur\ӐU( ^TPтF p?!鼶$UPOX^^F 1>, BEIxRX*nHvxQ2 "IILaey)%+I=7$CSN)2 y 2*_L $3Z~a:d;7;󧛼+-&gJiZu Qj&{E2v2 +ћМո<#@BsW?,cڔrd?XHN]bݮnm4Y3kytL/>!+@Ezq6Ƭ!t%y;:~mnPO_j+v+O%V\uFW.ܮ.J;7#??-1fu hi˭Phgz7@^^8kF[%wqu]A~X#La(1{@/܍7dRe˄fHs;{?NOrv{"`Fm " 9/S;"uqyOH뼆Q=vlչ=8$(aMf] $.5!q.;B0 -,|<ȧFyxe=  -@Cm"Z4 @Ԇ6^w-vV W˭W}^v^@y e*2{noq1|l[vY ŨֆyW_dMHĕU1w*Q@6n7E8c< dAM5x1:8=f(wUsulSǠ|ظf^}v~ݮzպsNCGbז|b|,|-ڰ`^s7i-w+2XSof:_Ҩ}U {ҭػbcL4h1%ػbA@7-lμNJ.3w;oR^VIL0]|sHK6t[0g{:i83rt~nRxGP^TIya [jܺfZ Gsn~-}blXjٴ#^[xGw|k . \)ТPD8P_ "^.8D?w^/nA]@N6w'O@S~t=+[ / 3ČSL0* imej 'Hr{#bءOL㍡/f 61+# c(C"Q/>1gV{ŋ !aaIGQP!@L#wRqrbB[HV9(]|-:uu!#o~L; Hd˿Z4~-++[]{t4j7RSs'wg_0-5سF(P1lP6v׿(;o>E[U,@h9~aظq#}r&{Q>9&rK/ ^{5ڙ-0b]p}rq@QEA@@^(Z0`yS'QBZ\LOI{~m?4(a| P>^z1T-|#&4 XUҭ܌gѶQlVRl%K:\?Gܺ2( bDt>s '\N ܏;^5~XTbȨ3Ly'%-դ9-@B^qH 'Ҹ1a|vr"'6!1f/֙#Qr_{^N>'tG\}qGx@Kh^Z*\+ -[_~E`àNs=t. ,)ТRPPC+mڗ<[]b_^-{/ǝ[ϴ~gM:}i{o/4qTtz"g}hlؽ}lБAma( ] q E~,l߲\1tt,j<: &95ekїKҴ1'H.c:ɋLw]~mɗ`pKlG2y fbF{nm)lٰRcz8 _7˜hgp}/8Zpy,(1 1Ö\$YjK?%%l顸sQE)ТvfEa_v{ɾ0y(;1}i_/p,{j)nSUIP?ki@WXA;pïCmf4 鋸 g̀"Gg7)&0iƠCqeniI1L]!@6:i&ر{|[ΡK,Ũ#]S8L}5Zv؂Bq@>ʭ\]nδgtA4x4jRصIuSX7|3/_nE_|椅mz^Z5CSRX֢Z%vIBQ@t5u&t d(Y ۟ Ә#,YӧOY'%42m!ӘN8qISZ\yNN/0Юm=6'\~2D{>Ճ|l=vK[ϴBg؂1h Z z7.#ʼo)ݯG@Kt W`XpĎ`U`}y[u o:qʧ#w:A}?v:`? OM75]:wvFNPOt -cm,.@x7oތx>\@[&%;/}g:ݿtEV@ ܝ_bAbɛACPAcԐ:;wrEu7@\oҞY߻bkXMX4b|2sΚmπh=B ;T9Y>ـPSǛ_!oMc([XZ#p#PhbnpVVlF!ջ#99/hmHv}Ql)TKڑMXi{v21r6nZ޹ݛ{Mxdfd2mڴ# `PPڂ@[,Ut8;ƍ31h;oðaÚubK6ozF'GrH>1C",^;Fwf*jcqŗSJ2o3^A^;&_t-Jɏ!fU=e,Zg_| "| |h Μt9&1ŤX. #8f` :c Аo[I l])- (,.sذz2ѧwW%woE ;w'4rC$]wzc,W!<ыGXuۊеg_ 3@y͝>z1M^%xm-(S(Yk=(_-O,mėA5zB.eWD*)1 1bd_zY Ceeӵױ@̍|r~ݔk&/Ohq\CH%PX1R˦OIuND4~,c+?|>o> TEFi@k@5/Aͷ@PuqI3g|x PZΛ7c/%-AdwbiM&6FѵCʊ Pup_mX7\ӥHm>V!m\|$0H:cܺ>fōל􁨨=E{b7a&ͼIB_fcĠx1gQ1&\xᰣ8sHLKs Ͽgy #!5z *S^1)0y\^vdT{F^=}<ty>n%HIDux9H!5!O Q@dوٳgc ;s":tK+g~%WOB{.36G#ѿk֬Y#y9KQTCٙH=ibX\pDU":>5  ټŹ\N>|ώ릜ٻ̊m_,lۺ\ZK6[3=0K1~xD#׫ k.s!q+L\>6\r¯%nՆ>Z (ԋC!?vKh#kSN@W\ 7eN Q[[P? {ڵ&OtN.֣ RPXXE>h3qBAہk큅;k.r$УG4Ckѡm˖esҹPSN(p> +~I l!#s0DrM]t"J#ü/umAıE`֧{Sa1 4qld.ƨI//}~J9mlH)_9J..l+> Xr  s~  Z(8a6* JWnth}QVXEKL@_`˂4rq~8lWPP`b)HԖ9sԆ~svl-t!ڵ _s5mq͚5U6mTzuG~nnU̎:)Qc햊k]TC— P\Cz(W_=1[f 鶐@o?هf@L]gڌ}W>f:i9m-}vFluMMU =^.t&|(O(&o*9-]ct ޙ6$XZ3C }j8_nBfv!ƌ%i^^nؼk,ZH@#'m\_xgy}^U+aۀl_3IhQw^<*-]0E kC~-sB|HzFb>)ӟx]5J7bx,~<9 _> |BT NJ&"T ApP>%z .!7+iwI/L[fشR1gQkP[ rpBcK -B ’Ňp$kd)nRݬ/wlP阞1zt)9p9(fq)ӷv_݅CBgv ;w% [omEu1/+#T[9aYVA+|7'tq& Z@#k%:+ 'e9u@~(T}|$ڏQmKeb4gbMm9 B۹c -7ڹZ@cԮM[ Xm۶b5O%wu1/ }Q3JJ-ٷup|6EUnW3n$ Q޿ h! :1 rr{4P~p޿` ka8s$2"hih* g<<2mVtA@X 1\t#V,3o g]( aaq&ۉءDMy3Q uqH>~HKm-o8 Fe5epnvnFE\l*}髺pWk7srWlƤGRc GLB:)Y5+!2uNA3אݾvq)xƍN@ALU/_~z;1[f _cRs$̮23ԑU-v!*i$$#lJݩCEo\+\V -8qM ï.d X[*f}J-eWgs}w/s}b卌2Іuh_\qJgfVuW3ZH1}3P>or#Vv^/:IvCvN,~磟qGS.@cggӶ};;KO ZW_5fo^z%ém#W؋ @3o$G3L~ `p[9Q1đ!^,-Bu[n}z(r2 *NサH>v 3;D֑?UŔPA>u{ (EAm{+/@2- *?&.&чZ>{ܻa=)Bn8R W"F^zp%(.NHIH9`?>>(t5qm1Y_^Xl#qJz2PGQ/S~!WmzKkŸa3`$(]k(x/5oՀB:^J!!JkUb=`Te#nP8׷K6f(u-Yy|<1dhWO eTq+U0ab' BMbnx Ty9 k68r)ź Y&NJ7/ -v]slz}^]Pk7xp M_.}>Ǖ76'@'0g ڴ=gc۴cXǶ;(['xhwkA=F~qS=8?k7o51`tM2؇PLOkQۦ;zÇ={v!̣l᎟0=?dd]FM\JsvGF1jȗx~%7ŠsѮ}b7|j/w[k{lWݠ.ې $ HnyBH2q ?'߀/=#p`(BD|O\}d<̫xzE E)]19xчЯw7n[r3Iڎ!㚏qO%?6?>;$c]ɉE,Y88H7پ w|_1. [֭O;oI ",$ QAѓP,޽^{[-._ &vOTUaWsya|M!}P=W[ Bh;ډBj ',S &\GܰnR,ZYW0s=iŭکn Vx (g>Nq=1|XG4̋Imr cCnb5&ﺻ֟<1V{q[/9ips<٠ F IDAT4_畧?)WOSc+GpHh0 < ,@*_uSgzN6i=ȕJ9/p!xkm> ;Mr[cN?+m3T5yTxw)OKU$/7-7Env(NXonfb ^( 5mF!KM =ŵX|G~]hV!3,9H@Ab-ȶʛ3iv;2 mC>ѱ}0ޜgdaШ؛9d%#c62{z ;OE*MQV=q;(XDps.ۮ/bd\ DZre>uzw }8y#zbo^m4V1FPL>;o&q9TyT}ܦ>^I^YA1"^qxwHوgMPi2JqGaId܃w-p 7_A*|':GBX˲|6:lEd۶u*BjWs ^ 79סS} Z;r$^ \E!qs_px&Іa,~~(ÆZIw"w hp4.Z0=<hƝ׫]iKeVGA#Jh VkxՋH +`Lύ( *9FzXOڦmY{Nb>g$P\^sPCnstׂOr.D*G}gѬ]-г9yT9_c۷@+#qW\q~it;G(؟+{S}Vؑxψf=Xz5)ik2WPȏ*E0TzrR 2\FBÂ\dP4c㵼F xXAǛLUɣ6r "#"E_3QS*N Br])6h4-{#Ƴ(dz? 4^jLAA4-2Ko:0C¨IV1:IAE#4]3)(8j0fyrsri{Vwn{q?_Fp) p-)1X  IZ[ OdlOv 9V̩>WBQTP2a|oxC/7/sl p&4N_BƏ?+KyH6)CXNs428mpVp{Xzz!"8l!*7&~ML8?/yIU.][ac<̣.'[EU Ѳk^:5Q~+~#Nq𳤀] $ 4):-ʷО -9OuOl}XpfǒZl7Qs s,0XNUb>Vr?;K\%wq9]JEZ_)fIPv-ҡ]+V lZXñ_8e[V(P ZcĶ7vLC6?:Ɵih=k"mEǤ% *JE[&,·!bO7B~2Eʺvjöx.*A`l:ԉ^H=GO c/pΜFC;nm׎ 浭i]0_8<ӵ5`U5i`5>&kQtҍW:Jx4QN"uSP6ݘo j4ñE WӍ~??k hᴋVZs}Mʳ+lKor|7*b ZCA\tl۶}JwMGc~c=Vޱ9Uֆ|q׮)X[7k7QXIʻ9tML9;e(jAL4p ENݱ0@_D9SX2?2g~6ZP2m#?;wfP($S#/9GI 11 eػ';wlnTj3Ӿܚ ޒO0&8G''klUцV4YTR(R\Qؗm n"۲TO-1bDwzx~۶|/31Tssӄh[׼Gޅ uݴءn>`-.)`)DǴ8zn8~< ]4~/d>=b.LTTTQ. '3αӁ6!K1u8n8lc] NG 8- ,,mRl9VPI!nmQJn=PYWtHַǧzh"KMA2iw\:)︂. x ̓'46pPBiɯ/h҅%xXd+nu]9݈__@I5]O&0UwLY鞗K@M%?>^<jxzM8mKWZ"TQ3߁Nq}]KіNZ)(bl@CA 7ogw.DmtsϷ1 )S0r>IEUzW4uSddZvL@KC43ak5xLs/vr(*$h|>Fne`sƌy::h@+jCS8 "{ӡwriS-\|rˣ0C*_ZX֭l\?e"{K']ڏK.㭷c̨0g藞lY!ww=H5tO#G&]{49:tQ[)`kcӁ08loHvОU.>FOvmF'ID݃T»m1pQHV p lB`K,L4 .a ^|"_<1~Mg:ܕI@u\ABb UK Jrie6pӍ[}ߣm )7S-OZ2QuKlǖ议9c,G>hP{~G-V^:ƌ_3\f^AV@bS58H'2[_RR{:~sr{&9sjoX@4$ɆnЅP= ) C__}>M(-6~.Iti>_@r mau +mk'Q٦>$ ^+6}_Oo4sk }U\hY E.t۪0T,MI]EKZvX=Cp%4{_ &BBc Snl>](pPBΡg8NCtl|)Q\\ñcϠ)@Ѝ",?qdnƫ ԕ}uBEnq۵H~)=,@Ll8 F{Muek/XCW;mMȨ_ൠƱz&Í[x)ڠX A^i;Y<<ÿB=o-?;ǥFl 6WTT=Si;(C"#أg'ٿqS~;xAn ^Oډ.h?eU=R AE9LHl[@LO`;9QZ&eyѿ nٕWUtxB%n~#%4Y[cune(D'Gկw#Pc@C*۶qv\?:aVTIDW]=yK|}b篹Mz>SR0;niW_}9%3PCMWnE:A^ƭt%aj}9sټxtS8 7Ƴ7eTtVQwNBb-@[G힊5~vpK$СCCxEQRn](pQՂjr}D" .eb{pG?~ΝUUQo3tUW]pzoF3<G^AP? -M`hwqp k"ƣVWl4k{H4 7wطoSLyXכSW. hPh۩.V=tz( S~#PVesGݺkvkN~[(EC_=oNFpZf0Fp 90ѣVέ;p7ՉM~䦛nB߾hްc~?y;siNV Bm' yh?h3i1`U!\\hy R+ӱMv֬2n!gD ?ӪCf' hq`dEӝjS?kV&cjh6WlYh8Ae2;u9[:O]&Ef@@4E6t o[W^y۷o7Fm_zo4s@*vVv A^ Yȧdtla㜠sp5D4'qafֱ+(p)A3>T0)˥ ps-(d,}Lj=iUq`ժUƯ믿6cXly{1kk@;{񒺦dxӃՏY*+د1Kv}ru5oG}|y5nFnWs7^WYw^}oT3/Edx6VL{q5_/c5Y0L Yaڋ!;4 OJB[W#1?,^ % mˮ{$cExٗp(Hk# <$/lZ=֠ %L@d`z9|D'ō߈AyT(؍,A>(ZL@wt10VqnTdœ> ︁ːU{|:1 C@*|c;sKPV\9#· f[KFB ]*ܵ&G{|wߚTx'GaOQL9F! QD|t(^{|.\r͍=$?''o9>S逵w#/%,Xހ~=kO;q'Q)Яbe8n.zݍ& {D\a&/+܉{g֛DJ|8fa@.ҦP'&<9yL1qzzۦ] 63?{vy[P\ `|x11l<#8RX.|>.Xy Kx[cz*:P~?3,WߎnQjuxj@1_Wjt-{WۙsiR,Btaaa `t–hWlr"lW\&+?Hu݌>'| X Vd3qfҥ =8iY9zNLAoڿ}냕zvt 7u+s/ۆ|25F;DT/.fr^햫qvg"6 i݇#j'z7Fg'a*6o o4)|U"I )hP]Y9GExv&݃quG$ZH.goȔVPQV[2Q^KQC5;r/ٽf,ƳV£8_`[='`٣9{O>AH= ]< EӃ׭3~wd%Vڎ(5K'11!HU*5^xo 8> 1xMO:,d;)q3G/s /}q)'ZN[DŽpE@C$AB@S fiv.1IЋrtsM 74^;}{R`y饗3ӪwvM{ҏ8 qeO1{m9vm=[}"%;"c/ *2~1R!(ϴh.ߊ*:, hf;f Aq~BEw.W=F1o-(-.|%=#HN돱Cz!У9y:!02MHFuE>v܁1~8Yjf oR7w7콁E-k$>)>L#8c@7za׶(*G<\{R}|2jۑ]Tns7qރ㌎jҌ8%yk IDAT1bؾY|8kY#$gUP E ߴpno˘jd<Ⲏ9 6:PO/m]PAӱ8@v_ G@O>.,0P+(P^Ml0.lF&tW-x.laڵxnj>+K / 22BjaӦM´>ݳ (ꫯgZkD`F:1DUA-9de*ꨀ$ )-h= 5PJuuXhUصaONFzdxT۽&Mp<Ggڸ NJՇP׽=2O`K"Sdz/ƤCKc;A8\r_}5:SRSS D^/}<`|h%pT ɽHBGzDŽpd8wY.N褃Bs_vP@=\z[@c㴻N-(~AAA Buf wuw u(r<44nAi71 :n#oxؐ=hXUzU1"H#op,]8<&_{7E @k72>:CH!f"xa7m-<ֹKhv*^{rP^@?rHibS?(>+s( =} tOCz|ãvm#4 rv/\G?~|o77LJuVNr/C5 tꖆK֜  qͭ.{q{?+o) 2&ޞسc/JKX".c-Z:aq`Q '& 2 96q'qijM؃c<9l ]S# ^/Hhpp'7g>Ztt9P/jRAP\Bq~,:vq -\(`A>*}#.bk}( wwZPjZ&!{K##"\r ]Y g ifgՓZL]oI2 uT8k3V-݋s0rPVC)SW,p?!gуR.;Úa,LBt%HnZNel".*@t':ķG0W@<Bh\eP\]!5 ;Cpƥqw=?k%s˵l~o-nT7ܚ[5Ik8}?TeOۓGdcTgk+qgc)Yxj737(U3[qhJ<Yc R7+q裘ŃBh1>ؐЉTz2{>A*>'' # Jh]fs^:G+Rc7BjT1rʅ4& |W.ȑ]W7ˣ 7x0E7U,$2\x15JCZYv} =(Z'BIF(=-m௳c g pt,nGnJqrK71S=D&|i23_>$_Nޏґ!:11%QDͿ|+pð<[*9v!B" G 0miGd鴿c7k0F|":| FC3E4R޴2'p]Zp&iENt?Ơy|#x1VZtqٽA,~s>-HQRE֙qj,iyComn~>[Y1t"냎mn=IJBi|vjz|׷xZ͚6[(bqaثl !mEyJgZyĥo}99ĽN .60C; Pe9"L!WID?+ v$95%@O|BO=nJ[x z RH 8mɧ"i{%Z_~9+|\(EzlZad-̢NT3Z/OT[j/vTH@*8W$ 6mm DigX Pl'H[>X ipbHLL+[C5Ki=)hSvQTȷS-)bp~8C3UkV_0VxKs 2o21d͏FO3C%L>v"9Li4mPi1]K})A/Z>㲯$ ܐp*C S]e ǻ1%cݕR:jKJXA8C\,9."xʅylygb[ ս.6ٔX7 ד.::RV@- Z,1O(rmG'jvVb5HoIWete2j|k -3Ff;Ub`xt0 ""4kaV~ӳ۰'̚FƒOr3i%7A2^W4F 9LFN\udRHLCtf^އ $&k`Uy(Ӂ̿`9NYUŮ䫜2qGAD$C`q)R"zMrn47VZG@b!jhD`F YUlM;9u.Uf$"-NPk6k=ۘ9~73F䯆*L^ nKWt#/׳JjW k|xDpҮL%໷-./6;o[Y99lNggv?;Ghn4D%>*hnbIl@?xZe\ ׬^gd^{$7,.إ*BZaȠ Re/aghT &zwjFi`ՃU;w%ztB~KCL]o lN, ,(nKޏVX(d)s/7{kK$aE=c?TqQ͍Ɨgs*OQU5r8=>+'00$*YrzE(}^ + \$LTRnC .N+瑱PC i.W%HHr{ђanqw튨BFdnFN8$p ߞW(}HVgmI eCfcR~XHJZҤb~(f?&GTBg"tZԽ-#oo:g̳Jgj;014my7j.-OÉ 4% &࿟ j8~{C~ܯI Ū|Vf,p45s΢I"TKcF,p *,>7xZnd ]:ߚ8q;t܏vf4_g0KSoj Μyύ{]vY̗͚^vKߎU#>^N[2r-C"*8&U߄8xXbTQ.y9j׵VuU/[8zߚvoC 9^WC#^oj?b@ !njN6IkW17m"Sh?Vfvor_|cߡ&yh_APϊ%yUyV޶oI".* kOunC^mkMN,)24Uh|D v_I1(cө܄%M^]@]96مȵiC93V{.-P.gvd<"&L&:+Wt UmhAo2.a+4d~otM6%}?+Nñ psX }+ :d^BK q2/EjU ^ja.߈ ig|pmuêf~HM5ښrI9V_4*@N@1^G1rY t*Ҕ'߷{@8[r[P,].wKvP<+DxS<λ'w&oy`>ۉb?6G5Jy 0. ;<8?Bum‚*[iixΧa|<ܦtw>`X#Wp9F` cݹ1CY՘sgֱ֗kMr@NqC2,<;(U_FJ_Bw(TVNX)]P.rYr'uȼC]s%/b?T!DqJTKC8zKO|z1g+r. lL|ncy+W3-B\b].{>߮~xc ;_o Kp3 f/;+VHH:֢>̂zl#뀰<_deJ~oX7lEXc"=lk=N0xɌcMA-uOA泤8&dt6c_u1Adߙ: b3)dF ^MDG(*z,U\/Si-dFi񕲺e,xAK)cȒjg>rO,\!igCp#_݌͗)gFV敺$ *o!X,\d+CL ,@Bͼi^ 9tp,>zoX~=%KAiCi׽19 ] Fq߅BΫ6܇cx{#PZ'( ߜEE,4Y 1W'jqdkZx48xraoZ('?YDqf6fD3 z29攦 A"Vb TG4y;^Nec KT>]abb5Ri2ϋޙ2РVgpRxx@HZh}{2|j4SڡTtn.r! 7?NU lkx%M4^(8,Xe Fe|.sgI)}8Jcc.CVBt"pDvHu{l jEe!IӉ3&/dHד'+tuj{BUjS*㥑|j+R$C^QhU'o=yZPS&V%P T2.", ^v`o9]Ŝi\Ev!*\PN5jMh/c$W*|!67pنVZ9,steYM#2t.$N!]+* 4S7\a-ۤkœ%"wzK෉ImK>, C;#@XikRdjO oWK!{28wv83˩|ZQ 9\k,sz'5zP:%}#n=.697NZI-\_hnE)%ƹ󳕗jܹ˛5@cs(YGÅSzq~BP3<K וB:B jO|]||6񬬊Ba♃!7/*kSǥAڽ5J jg!+b%oD6A1:֋ҪQ s<7RmF\>Y\nN_ri [K,. 0 $~4% ^xQPXVSDڇsK h[&KȚ/Jnw$\3e@x.WV/9_=x G :ь/V4KRʼnOu?lmeE5aGpp |iY}6R[xii,b*bJHXHj=?s}I9A\4SvG'!f6?܄R+pk=ޱ7Xq(PIYzg ȶ+m$Gf&t=zm:fX`>?ۚ 0>efkQ"u.wi1d$6Vz>+zW,D1ZK޿Vsva=1b3푟P)7+ru\ODiЯ5hõ=*{: āEy! mM^|r@/afw$Y5pâD[SbYQ{S:BvC^%u!>D`]x*aTZ cF[c3'ݾ@C$!&$G#0t<@1ݣnl' &4!']^ @B~,1~ƉRɘsE bY__pBD *vwmqa\!u#0f\f%O~/8%=T5z[aʷP8{QT]4& F#oND}n'1xt\v&EWtb/,|;!0Ots2OD!E||#+e-,#}m=7сmʼnNJL&K=<]?!\7E[$ ߡu#%}=?_a5>@mcaXm522|Fu T-A cB6mP%^%=aU}pR@prN-Υ}C0b}n ,fEnٛ' AU͹ぎJnñ|8B' ᛩeC[ ^N*zxHdv7t<p]]6WS3E%67玝wsYحHV!a GRa ?qDYKdTd;Eh}bRtj-~nbk9 U%-͏ObbHCD䘝A5)A6B-,ug(=sT-_Z)u_}t y.*`?]gcE๭qg =%I` \@XХNq|i6L}C |kͨ|5[{q,JL?܏;7` *u[` XmUdkc`=]Ipcs^&b+0q)vSΨ_}b/%iASA!s/{Rq9St!„hf/P'|hFKo}El#ԸjQׯuZI.Gt_kY9Eh&}XLUDe>T#,ߐdEs<6TZ!iH^g2>h $Ba9ߛ ԷLeUi.a$]KOR$ںn{슼u1EhRoK\fbX*Pƨۯ"bJ ./~{C-Xd<(Ggb^Q{T6n9ug}hij$ <&1Ma "Z8D:-#,-xaUJ:@Q&6,au˦;ixFa$eRn?bF6|H3&`h ӗLp-Nʨ63nѵi}~?ٲ3+=gpMfj<3F8FV 6x*lJW(.GCa4z_V)y4Z|tj>,.Wb;o;=3 3u2WͺcFaYq!̕&3؜Qm}iäiha}(Wi  +XkFϴJBZ*GFޯ%JJԾӡ-: oc$TQ䝱ޙ%6k]gEaeh}w1Z_l7gz9X\ LAFݍ>lŴ.BwF*͘Xx'a9F,EJP&8O#qU˾ W|t=ZQt&=&b/XB:l4'r&D.wHZn(~5=c>n V PBDӛv;v㵝6Jp0 צe֑|k]bpW ud3j{f7V##>bۯ.&Fo yѲ[ 4qxxtg=*?SV%8Pڄ&(<%F'u=MGI:iq]8q+Q|Eu9&Hv?¾9^嘍+;P\<>4,[!%3Ծ== !-dվ8h"&%&ժ n "=vRe7}Kv.$ewƱ{Glt8Lxz6MG5B8ܠ.|?}pc*c hL.3eX; C#ەԎ!lYh- 7^iIb1ʼn}HZZqt|.J>zQ`LZ/h?`8!Cf rƛ)%M87piF3v_b +B5=>  jy4JPU$A~M*\B"#SDWIJXVIrdb6lm:;aD? A;J]FF8T<7bڛ\TiH[_k{|D}(GՖ1 E##9yeqmoG<\9k)ܹ{6)Y4瓾 Rxy<] t䋲҄l9 r @f@D"#7nք zwƩ&4Zr3?>f}kcM ەǙ]e #7=fv+KLE;p.IuNse J3<|B_|t~Ro}=Rp߹4Z-3/<R;geQ`2ݟ"{U tmWJ hgA&[Vf' ǫĜ-GE- :}R9~=_KIfhjyH]uJAJݡ~l +Pg`sq]I'*z9Z-ڵZUUMt`Ih%,*\jspf*9fܢe̿s?FZ]3eϷD *~c":mSRNmH̆ KΞ$g|]K0fC3#sJz D\|LMT #KiHdҶ&fcLO+ZoKKɖQO;me;'K X>PG4qɢUSM1MBOTZF'tm9fw)';2J/lM΅6)͓_6)/W_B_:\iflg+P^v{AD#8t^kK:{ޟ87_A[ي`0+& Ԧ:? :$. L0dZ/ Đ]{dR5P9#/,br189(dQ` ]p$"Y0G#QF9-^/zq1A7 z XU#0?Pb. <3f[jۖrK2=!r;n/.oDGS7߰WhhtTV)|5 g۬l񹠧_uoPy!n ]f<-iE݊j_/%`uoȈ?}]%y12*-̢=/tg|96c[[G]ӎzLsm()E:KA@: Mo; J'!3eJ䈬f1@/bOQ9_9`Aèצ?J[^ʌ!|\kNe- r=R_6%epjm^yS "Cr6+GNoW U푆i_~0GG) S^$T>YR P;U ɩ )deA]|uV*'(1,UId[W:)jm+x>*xyJA#`Y)_=YՄ?i%4NNRlGjyo5Nh]R(:=Y|MVOUgLDJM|/o, E.[_.n'!h&~i?XZU3 Bے 5gWpO.J"ME6UIUr(.`fnۥUOeԫ8,/xt.w56Ŷ f6톳/~RKV-RD\f$C _ $X\fL],˺Di:pTgQpQrךYNlQAAu EDS[6B=`74"HT4N F<*EI,M=o P׵ĝW;y~^,BjAu8 3/j*C$?Ֆ=3Z)CjoSrlVSI>oMt4\oY%''E|+Hئ(E)>*<}; JofhGue'+vlr><3 ZC8Xesˊ!D97E-R4(0 {FS-RMPN9 o6lm:f쪂I|j<}M ,ݮyй6=v H6Ȋ&u, p[װq Δ+jD77Ev=h{ʩyq9EϱKi׏l÷KˏǜVW ^Msbq(|k<vT|)oANh¶R`NNQWJ F)VrB3Qv$u% plrH77OuiGY[웖rܔ1GExosڏӀu =gxRYZQO–~gǥ3蠥 dK7h83B8E E!OO7?iJ H;J3l ʠ΄r>GPWՂv : ̾Svf>.W,f 7Az%.ENa\SQ#c,Uq NxB] 9\^ӈ]#;F"} !n`Xs݇ZlEKu]C >%֩&6Cp5:SI՛fݖtM=?# d'cz~&e]f&^V៨LunMj8n"UhXr8==[Euغ_7Z\9\XXߓnl)>X:G_dž̳|;]IcywҌ~/OLgB;N-ɀw6o@XoOvb_چd'X" P{:]md~))9تbGBa_ _ V'7Js[.C5jvLGŇ8wJ"~o*_WXfĴrh`)U[4{z[l 4usAIoosZ ]81CQ1OpruYv +3%`Vr<Zc'mm N#f'ʉGV\)ycBH)f*ilnxBz44ё2WEy~&%Pb}Xw%U-c3C?-wщJߝ.m~1aBu(CMAç73hK(sQk$%fwU?2*% !w N-wwIp4y`c׮ڵ֚EKHuٲ]}CvoKa'uC\By-WОyE^? _R7" >Z:~OGCłyS}~E.. *5{#|dI s8Q h FmV#|OZ. gtomDin\v)M|[-/Zߍ8&,f6Vp*"![eF%/z p?_wΉ.a=빉ǣVR.&t~D?nLSfe7@Ƣb\O~e uu^?>Λ t[60ddnC-~@v <?S=M9i Ӹ-Ÿ2ۅډiG~C*upYr:תij[Q9nl%ʊJǵlۃ`/3=ywN~M[eCg{!n;#c_;ƞS n[.%a .A ="ǿU+)xVYuxt_!a2b ߱|܀jr;,lRN峏! '=N+|UDn.i"ڄuƂ VMsBPVO)tu|v }+{|6.Ϝ{@NYK* 2|wqVY3a`f$3*pO9+IvG6;x~؉t9Ȯ[~_&t К\f_ݷvMB3dIg*+cP/4im g&F8t"ϫR7hjrp>}2.:﹖3&0c~WKq.,[ bS'Xە)CJYg`lR̷n)>Yޛˌ7"EyHvOklZ1}I̘ΦEJvp̓]o==4ǵg|l!IFqw6bոoXTC[UVY`dln2K~ ŷ^)c/@,'OKU* TY++Usj.Zq!'wstAN NG$58l1c%-$3ڀQu] A?Ӆa]|7~?AKWchh n eX [.n4ߟ)"1W{lv[^ۛ G##31?b<԰2wiNEg|vj3cqF@?y & _R ]cwǚlMSȈ7G0*uՙJY+?2?-a!Iu iSf#PXnƭaw^Pf|3\{&HE((]fx{[_>7gTH{qO-fj_f7Hbz/sJBӍn ,$\.0ִ gDnZUX.c&$zx.# I-)CvX&13/uBJ^BcU @ϰj ܃~yUؙD3j֕oVW?ŝ2Ð{g^y,@KޛQ6~E ir)B6ْ 3ng=WCw<^m1p3E0=[ko4CBP WaLd(P;Q kҔze0z^izRAQ-Bm]ac>S dmIJc DQ[*V˰TC^ޗ%va>iˋ֣L=fjk ! i $4K1y6x]$M;zL2{]jo.a ?6@b[! zk2W& ځ܈AN;aVFc ӺR,,Nɳžڒ8q[Ol= 휵%NMruQMkݫH%oɖwDԢk}= 2KsLoL7@Aj/piڗ""'.7÷BV(?W?Io\~&#ÓI8`yܦ:Z.#vuׇkwngw%?kb&ۢ}(w~q$%, [ g9 6/7|YfzTwi=?b>?YbCϊwOcT8xgu {AtXG6xiexiC+#h%̗.diZ&Pԙjc?o=4m3?)oyuG8G~6@p ud]@@VI6 8S~(p|X m:\/KE[mQq5X }=+jg-ŻPD*'wP@l]GϷa%;2)/~(Z 6п͐& QT$PUi2ov4:  A d b S6\;*]c7->7G֠˳ͲbHNC~!/#0\9+M*/|Psb=%E6/X;[iK_ i= `wau`ŸLZ"y|ڪd :f"֨{ѷyr *Uo#r;z_A_n`0X*혊_cB'W7cVo2ouX̀e@+n ׶N7y^58]r<-,T=%R͈;gO2H?\)gWb*J(ɾF&dM, (Fj'$-qOEwԤ9n.Gܬ dBˑV:&# Nht d5͙yquQt GG 44?-ܯto屭uZ)wna(Ge/ɨǴ,P@{火dRYe 挖eJ(ؼ댗)5 VSHq2"^|ہJ]$HE?ErR/R]g9r[c[6?)5= IsM3 TˆJEՕHwҲ6ғ2_<ŜCٯ0>sjۑTFm+ Ulye 6Q|>ZO<sBmAB1HƻC0d<AM/@0^Xk ~ZE47~)FJp*;tSB"ޖ5u!fWVj>sy.[BEM'q`cEYZ)+j "NhcoEj'c C-śkXS83]e֏8DZ',+׊DVu|;VRnA~~EHRN :B y.YoaZt^$,Ʉ#pNt᤺QtMN:ݓD ڦGj//'PWws8,JL}ji7<;=;`Æ.{RB1z{$ So~̿9zmG7^r29(T ]cYwGڐ>d@65mնpUW`{k#oKu8Ff4ԎQˤˮ025Ub9oOyhr:dt${Qq SicʯoG;*:NKMxǤpJZ0j$J9br8 ~ [N}9A"I۬ ΋QE;` Amll w6y{ aR}Y!{&c[@~ΞLƃOs$ya~d݋EsGoޕV"5wʞr13:CX+DP zi>Vu]xQ(&F0pS$Kar<cݔ1$3u ڼskjKAIɈjϬ'Ⱥ1]|x'0v\'Y+q$ѪIyW%vw㵶Lb+I G90v5wPu&]S>A/||^J0ƑQPv*9*i//$0|&} L?mx0߃9WLc/D4̄ EcZRˁ2 j`# cKf8p}8x_'E>hDQ+|xӂn |h닠?0qjw9o1,~T-$&rPU/I@2~l7eQg=_6UBB^o8z;<̫1}+ap`on`C !;h]lCV')]N8gO{IM%՛_ ޿|$^16Ąqn .T $V bEs]Nr7cTHqNc{7̞[C(s]NKAKMD&cqtqFo56˭{i"!\(,rBGvlxj׉g۵f5e`u{~o`~5g#)uGçG1Ԩ/Bktwx]Nuuq+=8kQ muMdvGcqicnǾ$|~%01[RBq&ApfK}p$NM(Oj,E!j~jM0ggK{N;L d3H,'&^zi t=RKNN!sQbVst? ɮ_<]fΦ29/)QW%ٱ#(8}oE@Hػ4Q6ēLW΄ rn Ta Ե)x]x{4"voD6-z^VZHy5Pmwv7by0nIYuV\+wa>uX+\[,χHi`iLiyDz'׀pwsQ( BK_&3ÆbjO7/_](|f9:*-PR|Nd%[;hP VIX< CC;`0 McS` HW>SIRyQ|;wgX,U gT=XMQ:Ƅˎ| HhtEBH4G|CJ@&^6Kgݏwmt mta;kjfqd+A.q#xϯLofuc,ivr&WW.G8 W)H`gtn Dk14گft:Zu[toҙtwES"ěsoL4CYDQrfɛR+s Un8&Ck+=xWR9b$tOVngȩb63O-fWDvcL:G5b¯ ,L+|q]~f^pavSE(gx]G->[rH77D%*n *}p2pvPSLT*p]xb2$|5~Od%n]q}x ;kgOYT Vn*=X W;Gq[V{&sٿ׎v ǭTԨ!1牍Kv!>¡BC?Dָwޥ`K4x.\+8oolb}㾊\u:!3$XdEk tIa sp6u%ԵgU7zkWnIw.~I}q0j |$34/Md׉fRE6⫇\w3YX[(ْ#g@r?ۊ1 qjSYݟҬos?ЃákkEF ՞1"4l'&7Z+bLH=;GsНLtUIWeje`!h&jOR_2eӑ{4Ú6٦)9#q$.J{=*&O|2J"Mh-&\թy!yEѱp0flLu]ڬ,Uz ^'.-p!F[G#)YbJl¨QX8v}/H 5;T /)L5IiB:>sn_NDN^<ow'LkCpMr$.LkI|D.ѵXP5:'vy=yU 1SuHQg7cT]M)Coo?XB$è@L5B4rNe<w;;IɌEMQB[(CY{.ŢO`|#v+1PYOmUo?KB\UjQ_1-E঍9{GY BGU&мv꒎*zާ`ӒN,Vƒsn^ojaXo_3<4:q.U@Wpaa_wAF t礮Ji!;1O8FqL-TzZIJm̙!u6mySTݗ0Vr) 3Y@LFF\c/c/:} ;DGv[B5Yȩ,Ӿg6NX}B twh0 Heo3%ڥ-^Ecto @E xPodV)":_k9K {:N`r8&T&Yw>IBj -T67iB8ZKT[Fv)ns< Zk &}_hW;|&f>h|+/ȶXfCc%Q˥-Coe`.OI*մb _׳ja}?PR+91S4~HFv>OG&I4EVEcBc-GWm {/UH3?O`^EVqt~͍) ڊmEeda FXe0cIiSUGJ?woМӲ~g۶31"~5*K{)cd6 SުW+% =cTR~湆k Z5Lxw=okG(TV ͕6,Xb6CvmV%vUk[.i&TnQ|ʠ7ukOVS)ħOemalav2v_OK?H䍄WO;.VZY=z6@c;8~^"7 XLK3hJm%l᧕4?4Fbźq3Ÿ6и:է?/ Ys{l(2l'[ÀHo8!g{恩{qIհ1 vkNw4~(89ݥwkoorz/M~5(ZB{ UƴE =.B!=J6FncO]| ֓\V_aHN,3AnRc*AwMvڄ]*&u܈wne?ĮH!~k;LhA͇<GMHZ>F4 5nHH}(-l~.hllkq!OEoC`uFpt z b^7$7SNMnѾ7353/ 4DZ0ipZ1::B\-OđU7+PJm MnG 6΢|fj+2~p}ϝJǿczQJ3GqE9<-0ɹw9,9( ^<nUm̡l86a )e[^GGƃh%)1.nP}J9#+u{%Hd*dLJAb {O~b؉'DVUi8 c>ׯu7u*tx,VoY[fގ!Om@GE pH ]$**62im-=zK0 22`| 8Qs&"Ze$ƱKR<-&\~V3ʤZaq?u)REءm,wFvU'm>AFi߼O'PKW*ӳu'=s3|C8lH}Jjh̻:NӅ^Ad/Ǐ%{,Dla=- q1剚/3y| |#IJ6nN$Lh46ͬ@O#&,1eT!;<˝MSd1|=tI3Sjg^g)=ZPh@t,e~ (CFx $uq9,/zvk=\Q ^,$Cl$颱~Fm.ʨ- YsgJR )+d8b%&OM*A?1GLwn'ha2 ~霆hz4⨁uF?-,\[PTrhȎku#l}*!Õĥӫ͌me1i \?f 1jwȷSImHhbfzOa\b:y2-y?8d/ʹ\QŽ6|TY_3 ke hdҮ_! I1ӒPjv!?q =d:&yn\${zD_t+5}r5yd~:x[nmߡQۋt kp-,~|t zrǤǣllb}_r@w;M 9DE6>u: SNB@ _ x.]ж컌J+7 _)Qo;}Y]FRezYN.WޞzYFwC %8hQfxS$Yb2 ~@Z'{ Ih*ct_kYòh%yJHow8^RyȮkٌJ+PIw9/w4UMîVT_uţP| h5"=)zF'ǩ %>{'tX 2)x5$>BǦA̅_* js!Irs_jauU#QeCٲAd3Z!ӹuځapbpw=e/BA'`( {͎-c~o?FKi,;A^$^0h1׮)%^ty=H^o [-|ӷ 9qr(>=# L,_gw[T)@s_}`4|jˇs mXRXW  ߰.S½ )}_७}iy6}Œ%@uˣ3HTL*ҋP6^:8Yk\D=@wY}]ʏiv{:#tP=)X_7ϢGA* ȷUAQ% 70=N64\gss,ESUit[ խp*NW6 DBLw6KAO~h" Lht֚">w°.#dLi:4 *eK{+]V~WP 3=ſZ{*%+:+Λp'gj]fZ}Jbꤖ:~"B-MeU2@PQ՗h{PwK_*~A5,b՚/ޥݾX7$Rzl{*?};9SKඋzU|K"T_pS@'z$om,Jߝr$8Bl'K+9PNϖtcӐTs7(b[oxEseTX$_͗uI&09,^AblL_dzt ᱒3;Sov a~XZCAn~@WB??7ĉdJwKWmg |MN4GeITx aVk6Y 3|l4^Ww6 FУ|^q/u6V6+>O;B\v^ף4lc lk8{,gH}}IR N5eB &:=~5~qV$* >scɫݠ1Ad _U)h_Өxm0].٩Rb`(##&;!qVDYN-J ô 1Ȱm%Y+ɵ=Iϳ):XiGsTR˖EL`}eme4p,d)EF@/fuuv [egƦMƜ{7 Bn hez K|ɾrs!2r߹S[r+ /.t?G7}$## c8ϧW4^{Rtcdz4B+Jd{0eɰ&Nԩ#l(YU {*b\ҧ& %[SCfU &"L`9Y߅bh XaE\OAep\35Gy U66NZ#Pz_=LJ0#ɂDA"3n{$jqXr 2ktmDz6LgI"ͮ. .v'RGE/Am }Ղo7JbƤI1gmHY*t: ͵{źw{8<9DiM5׵F FIXhy^O" $!UA6zb/"<Sз~R|5$zq !ؼz(ˆT O--,_!wiυ>rwO-Yny9%}_du@O~l#O|!kW۵(ԔY8 4&(Is\ܤqPd:g(pKG- p?#'%OGDv..D\W_5ft.w"9 pJPOԸG_G4܉`/ o!W!Uԅ>8Xك۞Ӕ^2g]+3YPqTk/7Mguͩ<(eO?*ypʝw|!~uc`I#+b@畐o;ٌ 8s,֍Pd/?YJOskH`6`>e_(Ըǹi'%s4BN`TLWj[&L,b(!> Cp,$,K g@ 5=>|w_VY )|b b?Aύ\&񵇊9!WĢVYRm{pvrFro|*XFX =Qͮ? ۲pCBFaLT"Buup(a^vgb7k#`m!8hYHoipA+:dwUuMQ/֝Xjk 0pSw67u|*BW!O%dÖRaT5ڡbB0)=mvt7 S b (%h`(-s_P84x :I "/8+m8%I/ti"y ֍{iO7[H.yJ̿GAZ*(Z" 7H19]9)4!aܴ'w1eUZjA7B.e]|N."]mYUA.[ 0e >GZQ+8fR塑\k¾\As8r~+ܙX6^Kt!`=ifL[W\\,.JAiX|nfrѝ"gNcyCcW[Lxy*uaKI2"s{W`"yDx^RNWW#՛β\[./ gJ 揮4 W~$Fp_V .Z8]gy8lH_tPO4G6'ZAކznHS8#s?ՃHRac/*IADa7('} 8nm]vS"S zcIe}{7HrEMź^n^|G(7SKg$MvͽE* h|CDe ׁ U D!x4 -i(T?;q'.+pdƻlPvpXM~@X;:C_oi|Ľ `2тGO9b3Kyx"{ ^kC%}m ':Go/%R3ew̓Fc*NA 'w hB4;Y+丗&EYq d="N`,|h"՗'5`x`m#Zne}3cyh$]1|!^V$0])O^pG|yXG,MibZ`"%F`9A]AxN鹤-Nȑ_8u(# pj)/DjPϗeD3>Gu'!%h԰"Jz|twx9"͓8 CK=k'6''D/o|"Q`_i}Я F Hs8-–ѡ+aWZfXB},zHxxx"P`q20|:f`E>*<-FWdA[|i'z[KkݟuS ^bI2Dkxszm^TfqU5eg\4Cm!7Kj6!hKmwgN8_IQ᝹iHAZWRM.i>'n}b;]G54%Q}$V֙>)1)!oˣ=)$Ba 6;JHV)p9yVusR^yE" t3F=0)gߋsAa_&緽gz+ґ$!-zBe4xWwO+ &Q~-ǓL5sn(HSMSW{ H#܂( ٹ _<.`Q@YC4'0?B#Xڶa}HTKHk|!2'(kݝ?]}:)];kHO xw.D)@o~_O3CXO)޻39nI t-CmLQXil%ߝT 2g=.ȌUJ_shaLmZ+ͶHk})yNujIz-BZh_$tp--?!lvg. V\FUO֦<o~UIhڟOG=Zt#aӄNE #m*!JʖQ)K8,)ڵ%^m]uu3$E}-^In\|!3|.1Hdv{T}j}Uc>^C|Hmɂe9)KTRxyzdQX44b_uq|M FtQg|>w&M6 DÑPieȞ(JF!P''7iSLg _^gxT^|ǿHJZLVe|0mVz?2PiwRP)D:>G O$Nsj!]Ğ{ҫm˃ZG/U=.*ls<>-ƵJݪj-D ,%3y\^ Oum0zZdk6I]M}z6C(z焖x BM(+tvd TrY ӺN /MV4\};UOyV+b2yc`Qꯣ S6 ,w޾Qimw AзAD6߄Řm22 'QdPxPl Ѭ@텡>n`ԃ o8iNӣW݆>cFk7td@߂_ :&C}<4\w"/Y)p$Y{ON\ Sl#0QN>[Ο[ϋr)ɍhrCArqwp>Dz1ЂU3EsJ-\-[Dɂ仓c"[U3U)m.ug%%KÈw=ITUX'=Q'1B"K2T"H9uǭgg9j.wVҥ%s 3j"f+91Ԧ#+(X:".B9T[1$E$o!Ԩgk-+xpc IF1DvAa,L͌RZ41{1!GfjĮ?JKx]4f"[fx62{%^(^' ِ%9M;4>yJJjA;LYNRC#m x=/ҹkB}4c괙6ta x^t^UmRbF2:v$Hכ%DϛfyxU+ 1ˣ$<>3t>ێPCfxG[x`B|\\J4ݳ~x>(zaJߙ0Z EU&Zh'>ҹ 'S<]P3DS+_S 7F!O\B ("WhqR\ǘ&X_;\W%-&Kui7ڹG! zO?8 $/\emߐOtncZ^yj ˕[ ȧ^!,ȿ5 Y獿`vp0-JKm *ް& TUu,Kǽw{Gc?Jmv*&m?a$GQ:Sb2WYILY.a=>a9%I O~@sH^Ū5db㷡j-~) (Xd G 1ė7Sj;h"_WuZrOVm 0F[m2s*Mcdh3|@INy|h2ӵzsz~AbLWB-8Oq geD) *sRM8!;aBݿXX{.V7FqHI=Ɗ f r8If5?PdCIa@DP23scOYtG9۳v hvǔŶp20wOKmw#C 3/HL|E# #e-q~H\ZMc GNk:-⻕5͸zl _,Au~=׳ca-`Ц[fX#,R DLCFw48lh,eye TVor!D_xyȎp-u-z ZqGGL$Ô2ݡPvޗpKU&IڡO ^lTU@cD,7r uwm9n+j߷IC0ۨ#GHxݭ##mvQV. {xd=0yl~aJ"Vjİ nq&T0c=$/o^}j3ՔP]{x術Cs0-0MJ Պ% zH<?&XjN1g.FP/#x4qzxaH.́ 1 \0tq7.NswYpYڇghJsʙR{iN:>^X[294&۩7>1dZUW\'^ {zx6*{D &`SB*+"h_>zW6TĽ뜎v|   `3e}0 W{Oگ(Y \]Ref7@/|ސ$zAj`ܗ0sBDTRoe1zs(p O@eclq*>3nYG.gs~m 'QL(MoiE/j3s̻,y9 }o%2-wF$ٸu#(q$G'ZO~~x</KO$ϹLb׎IE|C EV{\-~T[Z w( 5oOs$0@\wX0Hjad0i$>y7޹?o(b3 Lw,Fl[C ~x| Y$YTBZYz7F ۔x^frшHw-櫰TLL[1sB>*e>U# &S )*%@V7\ޢ+"xL~6|I팤8bP;aW cho>+pМgp_7;[;FH"̈́ElJDK㧬dqT_ŸԘon17bTU࿆o:0I&DT d@5<)+UeRWSGMÌީ[ qr<^`~ !2S:-`@#")AG ӻw3P=kL ng6|P KHr\xEu@/9!B=c5Rhہ:ĨYTH&i&>ǥ25<鸓 <\A3.8]0tDiTVXga8%L$!HCq[_Wmw!<@w=A elzsKc+c:EDjӫ5bz A<"^t,g߭Q'=sG9uQc7lƕǙFn'cg?{N؞LtMKFQlWH<`3/MY<]0PrEχt/#|ORGZ"jluLwRBEW MڷҺz[6qb}yr)Kt\?ɑMq"T8٘Bg #N$Rtgm,Q-9:B3^)E*M2rEU̢?8(SSXt׉H)V.62C*\*ˉX,dsEg˫H)bvTw9ZxԤhv*g u }؋fWU1ک%b 6l&NDŽUNi>BjEUگ]a{}*n`\<Wei@gp]-6隈|Y] Se%ⱓR*\f$/;l 4TV,kN|g]7*8\w[\ebZs]MQLSLdx yVS%U2SE44#WupT >AUԢӹ^mi-r! z#p0_gowE|JN h>;V`Oֺsl4{}2fCpL7+ř6VԪfF|;W *JGN雙nuassoo1iA#UV#QRmhqշka|CHLs'ύԪJl/p/\)/\ùل>JgJ#+.Z\5Muneno+]L )<][Ee>]Ax{q~.R3ZaT #T=P«Rf5$@,PIt!e,e׵Cp&ѦaNyX\˿O=oa2UّCr!WfwwG_5ݼ#\1CWnH!,tUt_<pM,ܷ2֎0]Bфg^pŋ!p"Qq'lUR=85>Q}:bL6ݿ_J{ 4;"^Pb{߃c^f:''ZpݪyA5U2vo.E]¨e }ց[v$;yȓ'e?. K;M3YA3$c]4a:FdI E{qdH(kfZf[Jsu$i}huF"[Hfb;hq.f{]76{ p'PPV6DK]nhJl¿hzgr:WD#4o "1[=mHZv:sfMwQ;-C\C<"e ,(yK+2֨ln?fdInPi`G? l.;oMZ[_ƮuSV]^%krhG!^ fg[Md/vz [`X`(FvPW)z~dkwqⷄ^yA39&qe>S/k밨sH{- +`"1 \GL!İ]?aɅ;M=el%k(W*Y1ļxWԄhRj=_o2@K!:szdH/ qMS#9e#՜lGpWb{~gY/WMΜv'{`Fw+ 9LP0mε7 .#g40>j@?a=<M ߵ>n=8؛OuftޟM2Xz|plz\0*5 z<|{8`4}`#o^3LY>N /4Lm+_LbQ@ 8OԴG_q;u%>-.\#:Lj\dO@zhgpm=Xigξ?F.ޝFr+FIWL NV^>؍= QNZ2WǪ-X4wG}x۴~]H:nb 8;;I߶ qt-y>SJ

    xrI푻Q&ﯪ#a+`f l7$P};-=<)沟m@Sϣ*}3hY r&!& &2}Hb"I"'.P]RH$_^V/7@tF ̴e'{q{""2tZr9?S [$>PjH!%aQ7J7F]~xAr-71O5&,\& wx]g.NZ?xx\abEc/RsD Wk*a,*k12["$1O[I?ۥGlck`TD!MK.a!]og+5-wT 1ϥQOFSS[b&K?;Mb`N3 ~+|&cf˝H1_t*K2+u0In k\+X}Lvx9s٨_;"Dh~glX$n2ǏEPZHyv!DCrS7~Ygd:N$I#IfH;<Qg[D_W<O~=,29u够J$ acSX ErCH*lspB¸GV|-|N;*AD@ j7HCԒS:&@eyHBwJP30iQl=:AI5+QU!ާ)K۹/tf{:kk&ڝ ]cr&VsvOWΞ؃ ZQ`'cG6e*flW)gI>&ؒW+Fec;rkeskQCy޲j?efa:ʧ;D>@n9 !$D೙h 5K= zjUPWޱ+z n$?ܦvM!o=OtpY0c~snQK}$02‹9K'oZdxO%ihsH)a~ɝ9 QBC@yN j1r@*]!'[ 7$* i||i+(4!'S`o_Cm$I a [mLgk (ٳ!>QAI|f*f [J[R5͆ITfkb5y1gx[5jEQĬ(j֊.wՌ=5jHHUj-jKJ[jUXj1X ^?_|5]SPhH4 l1sH{YnDtt0"ΎR$<!r(L d?}_VVon?[M4n7υvu _9)`pKOؽT|vȂ;9@ҺZ=.t>9Y~K+a& 3m Eĝ$*=S.EwKѣx+clGY!>OoI]Ma㳐 -׎8צzd]q#+z23Gæ8!_ 9{21b׮1T+ +l5D:[ +ָu\VA,#37O/hBsYjވXhe߁u'?G?K:_0 ﯉S=O ',v9;b g#簥0 ZkYqmX|f}+:_A_azU\ل07,ȀMb>`͌Z0*GnQrnA)e3@'FUe\v|xأɔ;ؚbW:2NIBPUN $'Vvf (Bt:{]XH. 'Ϙr3i,ZNnmpf~To^6pK]tcuHjZwR%]U0Ti볧+JgQkB-%+ߙ 0̏kDHU/GG'NCZ!:{GY&w_ GZ Jn~o 9cU t"e~،jQPPU>Ar'A V8DHNpj3``}8ve0: "҇T-_'?jk BENHvoay4_%J|Gg<}u -Hk Bg3W4{1jt`D72q'&|bwc*:^E1HJ?W')20hO.%*]%U^?]#mKLF@~ڊtɏ&KVߐ$^~aC  d_-gMv$%DIU&, ^4PS\G@ 4ڀ~3㜙bc_ \yתѕhט2y6N(恰P @d0&qT?-*EvѴ= NL vR4Z5fɡ<qYL0WQ_: !oN:s ߹˻.:YɌ\ } /q/ +cxZ6W!%kE7Os4}"iN`0c\:nmʝrӲP:=R?9AEePDq{zK _ku.bKǦf7JPΧȴ8 uQ>>1ʧ*k7|AF &up]Pzu+z3F~:L\&vn*1[V"fq_Vz|ޯ>9i7sn%uǤ[h㣰-M0V}TIxoC_G'Gi mc6$%'8Hױi/eJN#G*/cUQ*nv ׾|W֠* _FېF֯m/R|Q948?$-'ӦdTaAw$4`NƓaݾDp켳`'-d Ul]# e=ş/dgr4Bms"o[- E@h;HKF%^wH(@!4?G G0ddfYLj5M|񺲥6ΛNUjP 4csq8d":VKIE㯤#v%߇{F3& CAB5ap50L l)[˂莬oF he[> ;A&u>+9IJEm;a-RQy7(GA ɳPت6T8r8k.#*jM Y뻿9K.E;`@ ,l]d9 &Lϝ)br=J&p4LiJM{(ϜF؁vl~qJO*DX-iNeZ|2L9L"\Ȓ/ƴfNHo?_6?*T~,kt#ޚDxeJ(omx;H_ Dzw`"xp?Eb!/CEѱ?B>Om1Լ0f"4`]߸xX[ų}^%);H`vfbۭuh 'H1䁕O2visNLv(F?L1iR OE|XV5s/rv:*`ȸ Ro%xk2%΃"ҴsӃ+(˸.3uv=u OnD=;XS*pl/qI{NBEP Ƴ$1Hdܐ<-7OdݷU<$7eC$e?U,%aR],ڬʸQEr R9(rX^mlrۄģ fMcmX#>Dժ"c,#7)0ͷg^c+sFo8 %Žulx^o Y6@5#*Lt]iKol| &]2_?h^Cmj&yӧTM 0I#L핧5V>Oi;+" hG=vp#$sk21}'w҄.P3:/g ֿ)ݾ3ґƛ1T'B#xE%7lJ殧i~<12-fig,~&,J|\ߒp4"y~NC+'!& 1(̡(#ItΕ`qpX2a..yB%ӺPGBSy1ca=Ɗ rl$ Wp26e[־5?{Zgγ]eG'rY/VHa"#?# ͞ շU71\RX+]Tz~Li,N.{s4BP ˭76; +Rfev{h"R %gtIC^Pc5PuI]gVh+?)8yBp>%ⰁbN@h\X,.%((~dN>#~hXmjxtTOhNZbt~J>xIdp ɐ^~ɹqboO\ +\EZ517d7 :X*z,mW@-ugS!zamuTGݠlW/c$QN׆[_*[_ԜdlMxBY/;Qgf$Xx$}B}j~?Do!ZwF=> r `\-`xo_|ѕ ؒԻRMWPK6OjPKy.F/angular-1.3.9/docs/img/tutorial/tutorial_04.pngdpfA6ƶmkc'olN6m۶dc}>O:u=3sz{PRDÅAWKW:s j0DZ\D7ȂEϫYy3opXx@Tyh[hFSF6\ ^FٵT`V{SŠCh$>7RAX zA0m 1$y3RN.()TrT!Hr#lhGuVjɼ4_ ??leo,0P g$Lи-w-ʺ+^HzRwK)I|9wYQ2hbb,XiOFIn˵q1K^heV{*-46|Xj`@ ōpa8c)e 1#ossؗݶ$:>9Y_avU,/kaoܝV6#jeGϹO J^x4e@T"Nd1)Y+Z8@.z`!Ap!u1a>,e811152UsE8 Hme5 ׽e=I`Is*B -ykT/,'Y 8Sde?݅4LZdLc䣑 G#TY*oÜX꺡] ~?[R.ꧺR(//Q ۆo]kfoW}kҞ9=.9%7-Iݸ%y!P:B/А).M e;C'.[pu}Ji9 M8|r,_+rfW1UUlm*EK ّg`+fJ#;8u_ refƱ %=rDs캶;m]~->lZzDIOфݕe^@1W;T4"tWv>V`}"B5q \6 rRA^EȲĎU+f?3@`,|.I͛~^hTbU=}| Ys|5K/+2=j*I\(vj4xרmdmct[gw_<Rnsa@w\',/ xN<*`7vʡ~]XtÃqzZ<V|+fdl1#_PgFhᠴ.((01)026 aCUۦouF0$+r0x*:Z<:EzX9t d]s~-OC_Y:.)\n y!IYaCyHE"/ϽeX rFwTw%99 śꤻrkֵ3\@kQ铭|IO Ѝz>&7•P3j[ϟdnjoL/eȪt6?ߢ&n[J];7?Z]ܴ. [nwal8Aד2xwݧSqhnFW5p@[eU$H/:HWGhEgAu Ԥ 3 )k`n  أ_˹1W c0T(QSk@F;pн*  ٚr+\W5V$Z<7rDYakӂ[{k=ltCyy^hB_blH{`M6v\pVynt={[F q,/!% ){Dy3 QinZf?CT]OMxVe A,o=༇WԅJ4[cًAAXp[-\i> f>y}'_.IύfAoiXi}~/giF$%Oꭶ1,ݒSΊϥ.Ώw |DrjޭÝ4=mk?-֟C)M7-% إU. eK/%MY%?\)"H xP4o/~8bY=?omܞ*3|M0jl'^q` f+>|"6-.K Z6wIl{$;5JYs9r\Ca]$߆慳gFNړ)8*LD3PpC3$SRmP[Pwo|5lRy Qp5ޯKGVê0eӾr5m[sSNGv.-HVr-m% E#*Q kE&Wfr`ao:w8S 6~[Ha%.mB_Rw2)@BY`a)9Iοmq,k |+"vl/ڇZiCQ?{vE``)-i N =cG87v6Jhɇ#8-08n+< Bq*Hֹ>ƳIeAPK{ 4s '۾m "XTr%4ēVp( PĿ#he>64ju_v%;LVS4] }#槥Mlu\ ;11)_=oc?uU#aK?-FK 9/ARUkj6v sSʦ ²) Ȏu$z~E!}u/.wG1L\;,4P 9ޙ̔TTGSzz#]g^{8r2} =>[4Mkku4XI.jմ3_Va{KIɱq$ 5OI(|gyN Xk6JGSWf "*fBv?.Pyx, ~tSNИezd1a$t[OL= Q z熸B$] ԇpʮcݻmوYBz$2fd4岤z)EFW`Q7ul}U@Ǔ\hdn y{pAW;' 6Bw oV~jp]js+Uf@jG%@'{&KY2tU#)_d+Mj&@nj n- T,ǗyQc#ZEEď% i4;>4PHGc h8d{hUz~$w輁ߋ/BQ!WR2DOj0JP"c_ |kp1X&.M3@Q͙ '?@%Y[V3eeoڰsԝ/dohvL0hnfD7>0C?ȏ`Puݷ]=ޏeI>]hbٺ.^i^ l>7 Z0Ʃzj^֍kV/QgAK*kwA>NHR;8H5f4psqɕ_dv+CBvɻ/!^$gcO6 A})u.S@s }Z`T#á@LtZ}*Pz䤐хh݇}]nGrh* V 6  Q_7EmvO:.b5xogA1|.'>ԟ~RKq2'ѷ +3ZVb% ]o<}okƌb{vmw1>C\(_ ܇QwI<\,ƳR5 C _=0Xk~lAIWSTD0/C~k?pVR*cr! ?LhkoOSVl@9qF(77qk TA)^97W?{3{&]E%\CP X{p2#'71rucpyff-wkv,gř VWL;GC03 3FL`'3l-qB_힜g)z㞤p<6yy6 ݮ@vƐ{z%[\ۭ>9 ny^ߣ%% 1۾OV#] ?RD8m i@^F/^~|npGl.fYvg~łD;hPx_񘔼H("唠(3FgI4HAå~?z?&ܸIH:!6fLV뾁#,Zw2'TaA"0Ⱦ\DhB Ş! ]0Tܮ'\P_NnZ\kf;"Q-=IdJgѾM^ R9Lt-qT|nFׁ,>c;d_6 &~Z2J:%=TD2 zu'jFIZ=J1X7Lo8 '̬k) 0DĢ,mHiiicfLųbQ_ їAyi֖.SDԡqӻlү'//;?}@𸖱{-zqBOo:n3bh(m"M3ԧlUr0y҅4ŕ5%L}=4~Ԇ$%1A_rB|EM߳DEw1vMޣO8AD*6C @b<7$TWYvJہLaҎ>y-Ņ*￀1#Դv\%x;t7@g&V~?5:f{"S"uS YҐ zN+Gqb# cs;JS܏Ѿ2/ʣ%_{cP")3%*ˍ]jNG%2 0xx5LƉs"\MAhrЫT!ٽ^ H(^E /[[wyQZMf#X➞8>yq=EG:=lLI,F! E>_杻\;33)owֶܧ՗L"q[ C9˃`PrXvlv^<.<)]?q)XbβikACZU@m CqߗW +J{&&$ G|];T"zOYvzbwgBwrcy=[]%=\}H@-RsS$CaR "`o•$))9A ~7~HPA!玓E|XIqה' oŃ ܡԚ7:a/`;](FNv;I \QuoP &( *[\aL R̺Cf\1$`cs   |(4<@EL3Xnm"n&ovAxxhR vAĈ"\Qy80(a&:[~Y3q>̰8aXCO8rƬ~%Ž 3N &}=G82-;M¹j&31ݎ$Da!=C4j/D~ߵ9~]exNw,RJ1.x{>OnVm;dy;ӝ,nsVh}QH}?|g$'uZ{`a^Y./kIKsO@gA%$c3ȏ,Ppf?R+'D;OJ`qZ6n8TT ..S7sxdl9+~c/oRmNV]4xþzףFk}T̀ 7Ln:a+_ RG9qojTV~w"lTED >iDTݏ|3=43 upg_+(K'т2;GMRceS7c!LME\Ob5)H m> R OaITP7~m2j>;믟hGMJv8v?r5wScxwm@o5‰.ğ.`#GQCǮ{^IHkH:=IW?oaD: ^W3ԢÏ_.+jspjH/5^-V9A\<0LL}P9<"~ZbTGt8""`` eAN[JBLU|#4c!Mr;:OamqedYG`m_ɳfFll'sǔNږ^p>i"\yZfЩj=vڋsmIQ|4 g]TE+\0 .ClõuhEmߥRy_ǧQLxy V"KpL~x߯ʲ-)3M0Ѣ*Rd?o%&@5ƽӻ'[Yo`gK.G(ѕsoeŐأMʣ.>u7tSR@5?~=Go RqPP@*++)M o*XecS i?hc%LQ-O1u8\P]o\x\GNCF>LPKS1 eT""LR7#%l8 v3R>O+AWQ5?i:viDŽ &04/{G4/c/X@A&gǬVϤPܚd5eȤ4mJBg'q\W_%= TYUR%=G!uff-{CqAV\68MpcKŲSGlS+PH) x)~᯹!<^>[rvo}46,i)E.\B iFp昘 g!d aIPФTb5jtR^+q6#U 7!2M(-7=/2wKHig`w=HʚC{ 9资"Pg]y巺:%)ňL +X)Kf(Kt @iI֕j?pc @e2!y D>Gm.d`x [Rz?hlaRaz-I!F %ӪmBYD;.笐㐔pt7N_l|ڞx[ Pf!ZwЩ£}~ -9=.@5>&GW OW C6hw.発HvM!7/RKLK[K4-G{X k]o :႐@,,dҫt'tܹjmbk/_.<À&ef$1%^czO9Fo6QOuӆJǀZ]X;9%xi&,PN `6c}P/;g7iૐB TƗ 絽P}f{bi81?I@^$!D.nr'j^^%*W460 0.]Ԏh]^'#"Xali3 _H{ q7zAQb[FtK3h!ۜRCypU~^SɒMYK#dp/E *m,EDF%bN]DILIc*K0=nۓc%.8͏Un”R~ؾyXɋ3P0BzCՎ-fs+GgƮSu_d\FZU( 7iaXPNKg ܉UΔJiyϭ#Չ8vn /C3iIev/ nNX#Dw'/,\Pb=1iD}mK17:ÐI9ƾ [>27D?. DR-E6D1Vܯ얘2/ͩzAJhwe`.7nS\v:v u3rĠA#?b Æ /lzǗVo iQji#'=M6"U%w`G(l3rA)ԳB!_$ƜѸYnC1Y`wr< !PabqסM_H{7~9n˃30n^KZ Ȥ'v}.VJLH$Ou}ͺ ߅ wUХglZ-3~ U36yT^#9-{D> :*qܡ HcΫlrLqza.Bepȡ}Ǜ?!<; G4{ xQ i?pXՌ-x(I,_Xm%I&=o] ~'bҙ$G9 s2?S[fxg`4U)݅_>gx4~U7yõ!e>HvRC|Iֆ"G'NP;~X@KG T?Zc"5j+Ň6_4SSS4F6aP <_0k`U2~yIv= WfLjG!7$}nN}/G$=<-} ,;+==$؃7ACD#Vw+(9+mD^hp-nQ<;1~pp=hz?VT_PuwM:5_[fˈؿ0K3b7\\LĨC.ǓJw:,FEk+)elgz>l %-9#z;4rI 1%.T*ggSA[pVľUムX6{vUq ׈ h!I"N [[b7ټ$ռʪJyPv`IuԃZ/a4aK#39v{"'LFcɼ>Wh;y HNf$S baB Jq') u#pq =_jp/<|! &&!7O()Dwd]6\w6"0[o3®4y|}H^8—^(tAQsi+X`tHiKs(;lJ` ޯ".~>5whS/!ZT,3󞎄֛`0P.EE,ׯ!>blY,x/Mcb~6%}8uTOٞ`6Y~rʰt} -I"fZ 2wx\#B#k4/S yk@հj hOOOͷ6t^P-31 ʽht֍'޷;J:̇O3I`I>8l:rz3Mo@]ϴt r"[hk~}黶] Gnj_e#fH[63s=yDO$| Q@A,W?sIX7z|~Len=2]jxxT?Zv3b۶WH Ċ᡻@6% 2& a Bp'߰P]53wثϗܞ3!fj>h8_Htu5( A~g¹ɔ-Nw;:!ZeWR X򽤇ԮRbl+~0kpOF:9 ٙN k~q3w-XZ¼fcy̛dө׊d,ΥR %jGcs6W>c Q՟؏AtڲrPTDYw%LuK 0mAhlpq 0HOIMzesmԞ{bp4{Z $wD7B@`Рp`0}. "t~V$3f5:dynG4vQL\{yťS)/@# o %MIeTOd0[E2[-4R`Bŀx$82cc3iFId5}[C/v,_LSsTim}/ͬ=ɹoNA\4@s@IY/mj`!hC-V @o9szNHiף:,nvA~A%5>6 KcSo$Pܥֹ6"g֭m^cb)X ޼MH8N'#^QMV4Kq{Ga-)8$4r>CKZ7K%K[eDV. mꑥOȷ-4'b<1!XWcH2zvw̤w`Z6gQIã,i̟3yAJLڪ äW`eT `R)U@ʦL ">~ÇsQm5<*\#δW-2!RjLүx\7Lvmf?{f-mr,o,)`4i3h*`0`%NKi/Sl %L[l܉֒-575g^7ANB֢\RrӇ'FvvIVa 5d a*HBS$Q_ *uq{±JUi㌊ϷZ#2)i~86G)^ !0=+x֊W_ሐMX\ /w\t3Qx36?,*"9ev캌GqsP7Hgnqɻ5,hh;dCifIe?`SEqCSS^8rN&aܗ2nI0D8^`6 @[==] dJ6;39d_6M}Dˑx>]BAXR:&:aΉf l^FcV!ErKeE3V$e{r/'Z7[?`U^AOh(9)ŶCAtdr dr1јjWS뎐Ê?{{zB`ovDQ}ה\Md/d &H]ɸ:ABi. ?qp }{DAK$FzJnX54pg1UOS.E \(Ail0ѩ-SyMtec !"36\/L8݇Hsc)s m?u|D)OA*Kܬ 9%/NX9|lWW D3&l5bZѕ+:3iZvN6{xc;~|JW9I╘$Iga>.ײr>zxRjPm@;IpJZ# .v>/pE9 _5jMAˢPxrb;ϯD;:x #;aN7g@¶dnШT9 UL`2H䵎k璝4oMg}d4VcVƶil7mm[)@$(=cO,<ӂ':Zҏrj_i=qmV( QFwrI`~ݱ9 , J0zKaU-B]^_F.')6E*TQ~Q>l0NS$~icCt(lq<{g4xqoDFU 2R&eḰnT$uiCIqy9ͩQ7'Ōy`-/cBH0hu iM k=? bv3nT+(Fz=s~rq،m $J{:K9's5lJ'!,1zw*)N&0[~o|Gv0cns_Är.#X"1kֹwz ]I"Y2nFcǐrFJUo2c UC Ktx ӟ\YU\"3zOm֐-H=H sKS X>\J !`xf֬ڿq :[ꚗӨ؁H6[6h뛒2щ}/)4x3uc_^-&íkZ)xA1)1h5}s8nUJ㌵c % ڬ(2%\]s-dQ1-GfsЕ(xmVB#e(t%ߏw< puwF,CbRġMxSiy`[i2QB]G\p0\C(jbs5v o58uIMg '~t7s c-#~F`_A*}CV]{˂"հ6gn5 o@Χ>k8Q1}1xJ*ᵥdʩN}NQh;}4đ4UA)/#V=c,EhD$%RCNjQY*T'DPnNV#paQS:EmrkŕڽDKJ&2_:88drIb,Ԟr$9tjM6մ;xmQE#Sv_Br 3ԍȏ";>Ej?9Ȇ: ťXRKސ\ͫ-AsSzxa-׶c>!&jvܟ_eJ K e_]p^f)oGÒc4G aXg4Xc"V=4nuɕeӨ%v e׹;o-$G/] LҼE=^4WCjuF{fU1=O6ݎwьj$\_jSvO}?="$&Xu,)4ڿv4x;ESHxk^_OiuE9Zn];z( J &:p`~?m:`OBVPQnwJvK ]X2,=vU b(=em]x?d\'4'Jqx(8/v|]Щ9xj )G j Ӥ]RLWנ>/qKܽ:DJ$c{U@L#߻.&lDP L^eȍбП_\_W:tdոT%Sa1oĀgֲ8y4#_Hq{WC||D#L"94y^ eMts/x` 00}e*A_$$!'p-(+WD5:Fy _IEJ@6 !SwՅ`p0 \~”{ë_='K!⛗3U\ ^q5J~Ex!$R)!^f5'A,{*\EeNj.KΉC^Y+Ufh 7(Rf})=RE½Ë́{4H+kk㫠3LY{##_g8C /RހYigUHX6h0G0} kG|۾|Ev`#za M,Y'S2͸:zDCrV.a(DIBPJ:r֕pC]J )G㙙! { juDG($R>Ck/J.{ܓ6SY9%iv Ԫd?Tp_ bKcGo\ ?jAI}7_{Wzԯs2j+j_o,HP/#trQ$©{wBo@Ђ={*8_$=GY㇅f/wx{&AԙVLL/+A^a*^(vԛ1RU5GЈIcGiuuM$ 78ƗQ}B)j#Ch 6՜$!MׯeǮ+eaAsLک O اKt9nB6ԖmdYOؼu5?RZ,>#>yf7;w!8Icl9i0dpG@*2_&5$k]OcE"Dv!\D5kiGmtMQ)QUm1ҔWCgC0CSQmgҨ:ńRh*LvZL3j% +_". NIu+_lX+;%v(4:dx{%eU~b^Qje>5@ǟov8~Z91PbiiGUBeG]ð|KnfQ-k]5VOFjq|ZZ?meQev{J5 cI@GwXA n~å*P}Pb(UiѣZ6|Ung':((hÛrUb~4fc t7NiEuX9А앥XHOUeRMd{x;Y귉۔b`)H?>I=6.9R`;NLn0ȒZPT փx9KK1rQE z\  [Rl7R\_]3C(2VZt}{[SiFQՃi Iv0ܸnS dz>RP;AUXǭ tNxumP9[ޱXL\WXj&ްiX3CO\(@B"K^~1dxC[; Nj#mw~2C]>%1cx=L0FiՍw,3ZXJ~JHoq-b߾ágןJ//,$u{gCR]=yd+# /5`(OC G:RL,UNe"6KIqGU`vxEZZi0%1„x9E U+M}^XNMh .R6ڿ}]]] E^)i2g7seFURTdxPx@\97RG%ۃd hCmT%OI}`4w( uy+&mrۛ)9Btrw1tn[irlUoPr~s y  -/gN9qƏe N(ko+Qn PAca\(5t\da⢍eXԭ$'3ۿ.@aJ8DT[b@[Z-L+Aݹȩ|6 eRS9kdyw@Njj5]i KVm Ԉ=mҁ;*j,H|T [2:!i`VcƗb6u 5Eh_vS\Y'8C.両h5p_2I}@Ocֵr&caK~3؇{M9ga>zl(>S9*`c'znZ8-m G%U+{߿d<py][jy :ʿ8e}EI͌`gNKc F! .^:B<8sep^ I!('g)k,JqpAsTIi=v@BF20}u}6He.24[ K (,ar:~0уͮNJL/IYgVQ&mm`Խb>O><ɹ0/v?} 7\JPȦ~S"=Ec9Y?N;籠wv$DWZGn T_J6 #,,TSHV˝er5.H>] ^ba6_8c ݷ>vΩ;N²tII)bnҎ,2kۘs[=`XM_J:>;uh(Y\إ\X@ o!~"J_Ƭ*6^otٜ;1 fN \[J>UW;[?sd>\`hB*zJdX|_]8ܽt)F(JZ۫-\Kӫ?+ą^2WxmA^-]%ziݓy<<"93GZ3mvz*&xǔP_BayKkBYRH >X7NLB7KOs\TS##z   ?K˴ɲyPPP6ʴ  !RO7(CIVeȡԬ|r}"T'ҙHSwms@hQ6}VHDj0Ս/YFBD-'/ӈlOω,`2Neald-.e@Rd-VIYH|@Q!tG"0~exJ֥ xsj"A(Btuؗ *Ȧe}R6\R?iYEk[?GSΪ;~OI27k~>|mLi#.HmSDO3 2h^2h5,I_s/FRV hܩ[B08*Úƪ0(Ռ+FWH,P7\ҁ;9GY#'Rں8fPж]d O$;K5З,!Wv8 &x;趪@#yu.Gl|Ј=m`-I} 2k(e55wϧ@}KU%(X~#7Yl출?l PG)#J6fgDtUkvPA󦀅鍊"ql~d.\(e?:# 5?u.o`FVĪ}\*q*VDYc{q*#H :J0D:PJz'mwblҶ\xj)O}km!ZV @=CݚZIdƼp'gff V`t☳VڮJrR*&>!(:,x e4]{7#y| qkz,rÜI.ncyTg\&Ysp?$ T^"͔RA[z %RXzc~ᓺbOaꯎnEm@A@aÎQ'T$HdHC?jIR@T~ 8 \rk3XtD9]9ҡ uf"y^+ǾY&鶦00^ڨVt$'_ UqJJ:1烣 V1xǣf`hpTxAA)V0UNj6S /D(H:Vpix5-û|ejYRY,H\R2\em_u.opC ⹣q 8Y+Jy!Yqs dW-eES޾-RN DqXaEZ ޛjYQFĻ# j- (DcˉysuQ'VkK's->.;NyNm+}/I' M[Sk[-6w9McM] %s<\5WIG r'S]j KcU!f*ّTaW{ﬦcL&YTw_8@Fj $؞Pԅ?<vvgC=^n_{EbUq-4hfyMqr; 8gw-!XXTS }|˓$zܱ+gtӴuTrsqS]/br> TѸ,n-/ cpS0(żې |YoZRY :[]h68"R!sSfͲO#'ĝ[>_ Z@;(ޢKtTYO'ox"i,7ÆK_t$Ȕkk_8ђxy $pRSc^ _6ya$/mpC7x2r-w9.EPjAb`> ͙7t9ɖr9Ӎy9.#(SWyٍ/9Tϵ#0n8OK"Q. 2^92{2ڬn'jpzdgBw{כhcv@BuC?x! Y-E<.hK {J2it@4ZMrLdv86K>[GnN Fc@O+Mu5ofxj[1J(&>{_o"2 sp{qWӉbvz;p9 "mZZ:bx[*++np_ucJ֗ ?5?%Ѩ2[/ACş-v30ғ{|?"2/!OsP^! N\i&6:@Ry?>nf1Wʟ>#U |fЇ\* ɓo>^9[ nݡ39p&貴m!o?'o%a 1( pfa8jj&DRz5& h$V'sWAA:۩ x-Y_ג2yZU{,uIdžOoՉJl#f`i$Q|P| 44*eA-']7BIʊ=xv}מr=%VY:[y3)6;G #e(L * _GbD7 ]uUいp`}rO\G@~#R4!>11wflbHñZoW;utz@2o*/ðY_]˪|/t:. Nǖ׳t!n(!ٜ-ttUd g[99  QS6c[﫮DE5T1qQZׂ_V^dwGӜ1 1!ޜm?΂ ˩d1~'JxgTƸS^9˾`ǑA<`B(NdMQUw*'b2^B2gp-f>m#Ard*jtv^|>< q;8 VR#my .Ӌ.̰c]rdGm8u"3Eyކ *N\{tڷݠBGSLB)9oZ)>J0~WXfdͦZQ"Δo;A.LȿՊĴ`)WGiA;Kk2ۓHNfRZ=0YnV*|옱8XL;).?y#%ʥs!Z_{O*QNB-~rґGLi4+P lZf:ONDH;fŻ^a9(}0[,s=+0PɠRٲECG|c{ɖ]QS x@./ {0SbrvE0΢Ѹ_H:o8^>׷\ܭK3$yX`:AD`%^2 4ޤE[)F.<nBTWb# h4V3m#8;z=.|ZCza|FVXw i'zF\ρ@ӿ|~~0"=pK>,mؼq<6%6$6W/I[1pz}G=- c4V$jBd۴`@-NQ@W@xu%;=:)Y %2[7q h㷥j#*7L\qgz?i`vV=:9%U:(T%5:8!g7pJ|`qE]jkH;yrtyBMҮhFuV*:h \3tv_7$u٬Kz4L%%d _W`!GHx1PLzSawqQwE?m(FdݕH3m[=/4+eS*U!w5c 7'Tp}r۵/e OLgyB;9uQq} e0'W t$y<)) o};y=x4`KsJ!t6R"N|o[h_=yi?up>95XaX WSR*^ug>-^T]2Z6T $ 1wD¢׌hp$onpbhf`eݙ"&Sڵo+9Q+dzv=Ɵf$V̒;n`(P!w? s7vu 6@;:[Ah'f {&o-;3V%w _k=- ^ 5۵st4ꌥBoƤC`+t]: P6``aMg{y Ԇ,C|cON󁀞#MdhU":9+r.:fŮ4(wmnGmOXY"x2/:gd v/hYo"1cMb7|k^Cp$jMQo! 2{eoSQ[ F"57Ѷ*76^_Cg[]zآ *ay4Y*B2QQEeTܽFhӼêi*cn, e U@/3\^`1o 8,;R[_U$G?2fmy!C;:O٧NTWFZ$ғL̴Ӵt-Z2fʹr"J06EDhwjwbb(|ͻhA@m!&Vd݂).a1Tp'-3+)yBGh<5EؘܔbE&NߠO)x]M@>yMMm鋮ЪH KvHx~G"υZ~68GCnҏ UfZXȁ;j'#8Ee;`eiy!`GcfxTu2P0P>7b!6YElbPmb3^YTe-*dny`$z;I926suhNLLؑϮ窣.MXqaJWejR;RᬜMCUGJj|ۢV'XUlzE! 8U#T){oZIb:&[^q$qR+^36,ߟ_Gx0i|> |$~k,ͥqz!Xv*{ ݧЍ_d2nFa,y8^xkJ+>eX$k".7==0p.->ct[%g=BoziA1旞C 9rme$y6X:[Qi.ԯLY-ԗ2Sڱ]fr(]w߶|x/Xo#_yKRR-v~ۧ}$lu~5v?82 ƧMMWr4>Μly7YA^e"@Vat2}!XMx%#M$'Bٱ_P'z=gyk4 v 2b52>v\ŘQs;Ѝqe$H\CjߔHKpi}<'К99ŧMvgmnh9/J 2u*8y?)ThZ+k*n?_~uOr*z1Nb@ck.Mscq__O!E2#*eR'"dzR|9M9'e}E];'L`eff_1g"ԯu5XR;&\(2+(59D=<.<)b.^نQd~|O_wWwlp@o+r A5M캭Y6{kr.nrӤuHcӖ=} 9DWTd AKu^\Rb 4z6pkt&xQqz(y=pLP{_.˟ VGL[j}mӼn'! Nzg0С,7v['ů">ɹhkLX&ܘYus\^jj;0{".@]0? ]?!W0 H528l@% ﹃"lG y:meFr"99^9r!ôOp|oxV#I X#skmP:{^bwJLgF"rv$ xKu |liM!f +ĎiEaBz85 (u<ň|4rH)"IlvՊZ#RW^,R2f!^[Af}뛪UX N? (Z>ࡲ[AKS@EB#⑥A{g{O'N)e/ stl˶-BpTA8!~Vy7 PF"!&ժ^ٙ%{sDՌ(Ljhe `mۖI.;'1wrUwGԿ28,( 6lL;}c0n+}q *l֨(:k@j  !=&MY'o8ױ[.)jp ĞO(x\ϜE=GmY! W}LݿAƬ Nq?U-Cg$tg~@eLKd=1׻kN }CPr <9_`3d`9GNNgt%,$0ā=Qc;mĵd1l!/ y)*_(h:K,Hrls.hV,gƺs mD l-Rwq C2ʬ?'\{8 YĿkG%AY] u4O?(//\'O_ dqu\8)Ս;Ծ]q*!#6pMv52:l~ye9J4ʑlo<: l2Ɲe^pHQx ed%?qX3 yrֳ\9!填Ɗīغ.iч#0'PLP!,Ruæq-7 q +/ ȓ, .K%iᝇZ)=q+.J@s:*ln>R,#"]r,q'=?{dz~}Q;7k{?؝jyP{]9 (E2ST`"gC4U_8ֳ6 @#y`qoo=Wi`t_E씦○zu>'3ym 2a3;L8uDtA8 JKЮ"gZvKYVF黶. @T*O)c˦FKl,ӫ'X<[>ט6,ٕxOJ ӑ\?ǩSB>W˛$AZ,d>J’˾wxLn3Ϳ/?種6lfeC 9̈́͏#>Lod4SdO}CY{Bi9ITRg^@F_. qɏ!>LC|:sMz_$ik%^ldNšs'92ڎ|2!eW1Vk^ʹsEEEXMR*FÄ0 l7?n&vMW_b3{L i)r5UGR[~Q?sbHŷInVZJ`|"*&>:L,N!BpT{ב>ta; PmR`MV%ؔ"yS _И#ePm:F[h 2Et#m4W_}s=[Q=Gr5iРT)d#O>zctp9tv,~> r(9hzXmqbӘF`qޜ+sN7<;]V c7Fi_MCj:1ŋ~7o'm+_*Ml\q2dFq՞ *ݩ.`:ʒri7$-qA~;wfaiMY>"ԭ[Qh"6VsPDk>9yEFn)+V߼% ?^5kvY[pш68:F[~-Zl%\ՙƋn? [!z stuAGVZS=z8|rcFqI'!44̿*=nq*Tɓmm%&&iKg͚5Wxt,8X*G ʧ¼y6dMM{r7A 1!!̗kԝ2>~t2{"Q{>ySO=Z(MUnyfۼF=nd>a^|IF0i'IvOYi~ooC'1s>;&ԯΧo r P7Шۙ}^ؽ5 |oMJK{H %B`X5V1#f~?7mA=Y }.18j7|1-O9ڵ3;WG'U魹Y̭_"?H"K ΥHqЅ[y 6`7\im'T%Ź^BmpnULDeN{ڦvhq%%2i%Nn+Kv~%8O*TڇZBA\Iisۅч‹ڡO&& 젋^\}WѤi4Ə[= (?՗K ;r;w#'kOD_?-E6D~n=>ĝp;Vv,M E[l2+Yo=+`&ԲIG[ˍ76?n=qW*g(rך1!~yvnL>lnzLGQϚ̑H@W.\p!nuv W>>o{̘@ѹ^0|]wЭ[PiilU;ӨssPi}S=f]'ޙ`$^;E_ۡ67\L3.,i>B<N2D K? ~N|o1}@[5隌_>32 Bz*z-vUY]vN۝9s[57>uQ3תU ޼޷|ZOȤ<_ڵj#8DKon228(>^f9- 33'uJ]()ľLA/~(QtųaT93S)ew>xϻ6P/ab/^/嚷EdXsa} w93cgm֎w9Wö4Sҝfv!gЀJGQG7tõ+W)CkAI_W zJ#"r}ڞM\bR 'Xi[ 擻: wÃJG5-NB<5i}3麥=.KESҌ:y zhQ.Bn kٲ%oߎaÆxٙwNAR@TA`U;m1 (}||e)gDD1Cg\. #jZxxV/Wdp+ǬYW҈o4 6NC {5}__gڛnɔ!)ʪ( 3ΉaĨ ^_(*xg.Z]"|r?޲ ;/os~kwf"?S0ezwM4mߗܥ 9+M' q kۂ@՛HݲO2ZI0m<Q>9w fS}~hS&cC*AeA>з[L+,ؖ"cu*зm/Y/͚$`٪.DSe,Ƽ(6a"{r7KѫOClߖޘa89WDΉCoh>2 +0wVt둈&MSѻoCCgoA\fkމa>WuZ$N.S dHl(*Dv̙c@&Ν;&m )(ie]Ec۶m #h`OGuNiR}41.i޷uk{:*q 8V;ϯMoˬڨ`?($N~o0H}[sE' AN)Ӹr\{[6e!^?`yag+wŝ4|I3jXqze%dʕZ\W;zlL;ZzڵH۝t,ޞm0Ny6u Sc7 Q#{zL]FAOvrj#i 4Ũf%?@6qMq>޾1vAdhDEGКܵ' {rQ?)*AS^-0_/I 7-rL~u8 Ҙp>||٢e<XqqoυO\&H~%%'3`+_;N~%0@''RRn;> >kq]8SN5`Jr:NСC AXN'BeH\I&_l)ΡUdT J[ʤ$#)@3-Nr[hd%6j<70PvӴU[*8`HSe ,㶇چQ}O]A}6/SL1mv-wEE%=46I̋J#u(XpFp4^;GuEg kklˡ~zV Ƽ5WM@_i۱ evy(Mqs(]*Qh)WU[oyP%Jpvd$ڳn:#)O0-i|&R?g 6&'1 ŵJ Pn5۷}|[gޑ&NAhH9䘈H"R2Ŝ Ʌzu0V AfѹҜ""iXSuBN.H yv4=<#m׵vz^uȈXO^(&Δ. J,QT::<`_lyr d2٭jq>>u"L_r#fܑA)7]cJPK,{g[3 pM^T?؀4oݼ:W\a LKK3J t. \*˸n KKRJmi+0{⣸w}G Fq=U%,9:Wz!@4RHU[rꪫLZQJ#0j~O疃$QUV\[AmO[ߢY@x 'eƛvDz+gMS_[=_ e:\ƿMt#[3s^aՄ["v)ӻ۾OYb"HG5 h!R,<ؗ& Ƭ,0>DrVuG)){eӑY/>{d!SqKfQHHo^d.~{QpW-ʡ cxpWɓf>y;PLƐصeδݹ VХ*MeѤQ}DŲвUgq{Eݱ |9?f\ujllEƾ dr74!Uz}yDl\@3f8E&$%*?cƢ NTL rKwr&,\53?CO'K x[y$)o_ȩ4d 4؟KR[ ^Ýax+*=Llj-:mV3ܖe˰Uq\hΜ9ȗy晸 rtթTvS0>ʂWр=&FbǪ-[ȑӄJW6M=F[b˲Tg@}-,{ƎSOݚj? )0~FX׫W}ˎY\OPkjN4nفjMu[BS4 uȧnn]P?: -Ć[=bk(̙6<@^t) QK.\D~1=dmG]32tXO"tx`Xߖ`7ȗυ;}>]v]X| ƤnB>5B>c:fNDz 6BD]cػET?6ҀJ;.>;VP>rM\< (q>Z_Zh B+6p.\gd&OJfH{ < ʯsm82mGr=g(F,mٺSG+ߩʆ&h;P'nB^F6RvQ[R>R-G񢷸]B$ΆM/.䝭oD}%VskDC3~!nՈ~ iaī7A2Vߺ9+yS7zҟa !g29=[/> A!S҇"!\נMP=@V),Eym90qvd-8gus-vL;6'SNFgV*6oXEq5k= 1qgff_Q?{W"ۏҒ۷/LZфz5å4ڪ(Q~-2C9fjl-ܹsv6@ !0Xu Ɇ]~F_qFFV[P{2Qn(~ms-g}RA%3)H}ݓcǚt/sG2kmq3R:T~^=jYtOٻy!mͫ Oc1?l)U_z%so͸ٸ㣩h lI'ui\o}ڦW$*cgmӭ:ȉkih=:A#so\h;:[SF/Re) E^)S5zSonBjDheGPL?iUVvzon/*4 #RJ:)D5u)~I`hCb<:yp=$5ؿߠ ի߰3(ZR`;*aYaw:@ϰHޱ'5h$|m @+C&/)y7Oj*Hi3D<׳8ԡ G>m5@G|K.LZN{Wu H "ФqL.܈[ /ڭ F *̞nkl*|.ҵWΰa(A{+ (vfsғƊ[enr~< MS4فW]D c[jq6s/O8t>}*AP/woBRNf6Z˷%5$phͪv~z)d)-OqV^m2$ؾ}{'J ۂFM<@ӹ~駅JG `#@#t:Wu-W)<:*(ȫM- S=GiUu.sūNin.qYxIӶW <~J~ kݓFεluOf$nRK1WL>T;huvp͆*Bi.oVLW(%#y4"ilyf.eՔ3O{eaLsyghyrK'mm+6EmP[*,($ׯ|>~>_HEUXAv>eBZ$"u6l^ ;6g[ڧv27rG3-3iD˞ͯå5?1>M *woj*;g߸p-9P)?-%1WY2nj{\G{NUPHs=g WKœ TPTt FrL*У{sF}7+[St06]Y3WQ+I)c__Gdd`úTnC-Mv;BY1Mte})RSVa6ҵ FHA֦M/魥+ <3͂Qygb$mfڜW}N,[ DunN]dGEZXG1s~>'DjS;r(W!gφ9䤤De ؠh!Զ8`uLJJ:@Ey- *YdN@{P*{k;Ɩ~CK.eQ*GAV^ԯ|PUVm=s/-Q?`VvD5zYtV,*Uk\@KsgqzgĜ CG\> IDATy. d&=|ǃÐMwo8xH' n\MԾ vނS˲(~ SK[P|Om~ei݌m0w NJI !tx[BRqnDznH7OĮ԰3׏0ůyD`+^uNYH]|̆֋@n-o|Cyq>%j>r(*>v}s>AuXP1q݇ c޵~cx*qX[l1J2l] 6m:XUC*IR)^iQk]jFUQkצ=AqNFtu [7毑og+Fb-K?5*Odd(nm7#"Ye-`G'bN4Ldjy`za@Zj<1&v/~ifϜMnI N?VZ< UMv8PB .`mJgA{-+Uu8[`m:|6G{XK]Uַ{W.KM)NY]ĥCfG`s7}0il:ǪOh f8.յ%i^4FCM Y^ RCq;XJ0훢׈AMS?s{:}[KCsW!h;MZxQ_|dUn]i[ '? |ܷ-V zs\q4NЙrwi`nُ`= f8=0`/E?}LΩJ˱?=OKќK}NߡE7@5e_WP(ύ7ވSN9J"o/Uv 5H!gp\-, nB?#oOc~Hhׯt3i.%@j5÷LGip.䚲;vjAlID8L2Ըܹ)]cZ'q6y"+gU'7mJ#,>kG. hGe2~=۬L%Tiۚ!8y~ΛzK,g觛i\\4X`Zrq+,RaA{q_{V~նמ/k (V򣩡aj4Ԝ۟F㇏u E8N G?ɒ"g[8B3L4^%T@x6T~_97#Snjߛfdbg'҄Ȉ2ĩ.o Q*bHL)?~OL8s_eSg&~aM:9L۟ҭ,XM^Hnt\Եg JG$w?yH@)܅:jo$s~t¾'F5SM˸;vv weEdHx%.p+@YY#p|S-@Hp*O8IN(ᮻk1{9FEyci0n8Asuݍ̤l8%C-HerQF4 "Iw8@MϖZn-O.xH8>>>jY)i>钬˕W9!N?tyilӊ{[>]ʃ-\G{reqXm|{cE+o=W5ÚiQ.дp)Jo{l (ÑttOgK8g 1\pIYس% khЮ1o3SKoЮ )SZn1{ LrɘdD&f-S_5`}z>r*jN*[5D\ؽ)/|nƟ L8cEJQmw= c=}qaY6:Q Έ*6ڡƲI m/zZGDcCE?eE i(jt[w: gG~x?~.it Moy+vd)+3G D*ۯxeFj*5M;K" S49*/\{Zp+u^a߇l/4hsRq)_۶1M*xѸʦiW)T_ N",kw-4Wѵsg:j9TyOmO8{:l~ N\SS8Ujg]L{`iҘOzV?u=U)ߧf[LeM81>TKOSW>sY+g>WQ}/<ʺ42,k4mJ@U\`֏V7jխ Ebu:;:J{7lF׏//뿡qYٗ_rIGaFNm-t<jU}fN5 AXٚҊvSs=J˗㦛nCƁnD)P-@7#ȭba:gDb.t?3y;764ccdgm#o8W?sxb_R+pش5ǿFX?\ ()Ė)%:yQ]Bd@yGǣ37D^#ȿeF-ť瓳G9/3?q?2&]j3|ߟU^).8bcUbN[5=Ww"OAь]{why,ۿLny_=ϩ廉e&J=cu U}]w̲gOϡgSAvw;ŽudLd}u}-Dlwa/VqŁ .r ǁғ6,e +ܖ̄e#%R# Er$>&Ybry=i>PqP!^kwRV'X裋W3w\}4VV<))֨s^ĐfCȥ@UGs5Cv$4|駆.Ǻ# ܻwAcTQ(.ÖMqf;h hh7(vWz]@;k[ qELG=9;;?4_AIMղirɫ~R{63/D4bAlo&M 5Lҹ^ N]'Юe]w_iOCV_~k?$Bxiwi=s]3}COml731IW#қ Ÿ嗭GD5)ַSsIؗɟw\ihyL{+Yum܁g.|l_1 P'I)I깳\J=åTe MO>x$2WE5j4j4hL!mڑPh?6 *qQؔƏVѵ=j /|g9WS[˗A!d)/o'v@IA?q a)xwpyWGr}Yz!JAtY@ख़@=X&Fsox+Ob̝> MУ[gx*|(xL 1m$5툆 H>P[vL>B9Z, B9Y+>~:c *h9 e*Pvf\LO5KHt7o9eB=zv-;rW/u]J3B)4p:wn՟Ƴ8t. C^5pjzi8Ӄ_r%a=]僿*3h.**FҨBc&],G%ؑnKׅ_^Ѯ`CzIAB| 5fLb"-Ɠ6qOhӦZco>}:藺򫔚OPjKrw 2 pa6Qi?8+;7 gܡwk¶l`A!H+f/)W B~\mNKOv>e1sw7r˦/ Ҭ][O2_>.|Juуo[G-4Spʿkmz)٢qyL/0_fJ._Q;"hcru&{'ݚ_f|f4OCo8\Od |h=mNd7|w}+?5װqZ\ulɋi?>} 3RQ:HB]lY< \\B{I|5 s ӟbc۸=g6aC#HfLd|<m)tl؆3p1 q^+;TPnXmGo?)/#zNJB9N:r+ ;Ȥ6ZڜL'ׯ>$Ko)wT [0p&'7v\>@p.ҍYoʹp& ={u1W䀲p~UtܖtsZS-[O#, v66mD?;LtɔI$g&nժ)N:AIpι9KedR{NSILH/Ӂz0sm&N˅5GCK)yS>G#/êf?$9gǢMPsni6ϹMO2v%lT]Θ83 O>‹'Eaܵ VXAflmzS2"޼S2/n_Y{5g.B=NEӎ-ўmʠ>A1]Jo͆czvؼ!k`Lz<#X9mLr%'}1A.9I w_ጋղ?k_2_/.# voB߳ɽ !!{/`Ŏ(bo> ,ϮX@,QPHC@ )$=7zn`';S|{fΙ0V?珇&H6 Ut^$ȴ)qU2J˔]ɯ IL2{)|+UQ1ƍ$m{JkH:D& R(e^,Ig_2ҶӅ"mrHTR!ɰp\hRO_#kV5i2rNd?d1UAYeܙاq_`Ֆ8E8&[?Fq5PcKgf5}[=cq6y7̩GrxP"266V6o#ÞH~1%bQ bt7t\}X* (L, R;~+Ā6..W2sBJ1~p yYzt#D/Rf]6;X%Keφ2kzIH|&Ց$u&]lXLW`eV{ٹ;].2IlٲI_jaZt9O-5++/܋%*`֗Kk e~3dTJJ.MZf/"^ԪBB%2prɊP M-ұ\ )iPf;Ov먲Af`Eڣ4v[*(ܺe,Xa )74M4љOӾF&i'[~6sz'ؾXqBwK gKQr* ;K̀!#}Lm0Fߨ}3Xu \d."SeYKEl+Ӱ9|$*n*:YV^@&cd\c, a?_`.N_}wr_"AAyťD虬Ӭ>p56f2ʺXو#;Mu`j \a-Ys߶\b=ҵՓcF8R3g*?ceӦrB.7.p 9D**uP4(cU: Z{ҥ@iӦZWˌN9P9V䔀4=$L ٻg7bRKdRbZ$gpFnz@2De {0s3_aLhǭcJq8V'6<͛SEzr wʭ)Rr)YaL1SZK=d%l>Դ,u%2o 4KuE_Fc[iѨ`nԡnXI#*@~ܓ"eq(Cl޶EoBR|Y:}JƆJc^dJncfjdXhh8h1)S^֮^ @YYB[emžIM3;eo%HM%t$8#:xjXA+8v'r$j,6-[mwiIII?>>^F` xId]F_nsٽF'N(v)G 8exf* 0S8 Nأp){w%4AzL~gm>gpa~„q< Xʯnn N*P %<;nY2 VpщsexNc %6{1h&fssTg#x4W~-G9:ˤ`4N/]˪^(Lޛnb+>u#2sv>tSek޹52‘$G<=%w4K}O%#$՟qM}2׿gP@џ^2@R2g\Mn~ngh8赛F㽭֟xý epևY{OaEV˪#Ʊaw9)u}=G1x馛?WΕ;@׭['z ۤz"æ;`/v9CN%W[Y 0tِQ spfOG{GB¹K‰w$,rɅ䖵TYDقa 7ڐOq$>pszj,Ѐ0=l4HO';X 䭄k/Y(3sC6n܄aY Kڃ):_B'˄2gRJ:>"46ʕRZ>BJC|4E$/a\ mjr"8WO:>2nL R24XvIT4IF^1?/<k1Mk,Y!K^yes CjC:D^`ʥXցѝMg3"$F_~Fb4:ݑu0h>V6F,_spUc=j)A?'t,W8A&/N4@~>BW>]൰pO\FK}}{t9DCeJuj\W.%y(3G -s&ΒM J]syV7I.GA̰LÞEcMŞs"Y?5>$ oE@?wzIjAE ϊ Hƭ+9샜R%ovy P2}Wh_ǫڠ z-/3D4fuyC 0 u/޹SNaᩯ&,T69q?j5b>ȋcdZOٲLŠHn=Dp(հh&'6alq0hU ,FB; /{ -.8>z->;8RݻR _%R'q&晓6 ɝү`@^ɨWMzwUz8.n[q_s}6ɇ ppX^p^G_< 1}@ss?5~jC-W:T磔N(t }AkGG%B#mgҢ9$q}+!b{) Tr) cyݺu xRK.$K/'P('* \`u (,SJAd༌ںuyA؛600b_&3NbI W}=Ӷ6ٹٽgٽ`vpvopOsW |AgN&Mϖl"<ۜ#\w#']n䭇_U PI/" 1qÎ/8yπ"C~Laoӭ=}*?icSLalX5bVlV!o `$aN}AZun'.!fXFC#o)sJv>h| |V"-j_]:K.(ɥ4@>DZe˟i9 Rқ{oF;ێP sfCeSr=Qx)P`A@Ëm.{Ԯ]js _n_=8y&)6 *645oԎls~d__3ҹ뮻?~)I8@ǖ™BMa<; *5Ų#*`ݲnd}[ }@ Jܦm*S~/M[?Fu>F() U.rw Y8mԝ,ËE۷7Yc~Z~GHHkoڲ:M fLPurO5pl'UOo-yW:Yb*9͔U< $dhv:.Q&!(G.r&–wA{S +c$P o);P )|d7zH-o8k.(jsGO% k%oIJ.q\q;8)HIokvTwa'xZPQ{x (6'-^L_8\J%@VnPɍA *Nz箇}{N Cƹw/}0N޺{[\ t!lu:p\fbs{O)] 8"Jy) %1;d2aXy(*]beWBb|2 (Aɋߔ[!κl>}ѕ_i?)fj{&$M>rq $;7?u4hHOcP~HH?SRByRN~ 9V^z@~6J~63F"qHT2[OȘ??N=ϐ{/)˳z{ot4iLy 6)X6(֖W^\Jsf'L*#o֟Km۲!x$40IiB9x1.%x Rқ{UZ\6GQ!C(cwR@A%ɨ !p"9#=/.qRLQhIoҝ@O?΋mP})攸u& h? T/^=zɔ)SkQmh0hܓ#aZyX=*Tf\x\q5_<}m!,<6]宾rϳnB17w'Iˬ ӤHXJYNg ?%7=~;l^Q^}3c˟Ocβb2ᣯwz>9]6v?֓_xOT7W9܎AJٓK+Hԏ6q歎LдsnJ^{TC9lz;[ֱGn_?U&c`o %3J;d/P>bٯܫ# 4v7uQ懐jl?,?|'JÕ{Qh(P(JP/Xr)M '>?AsMv p0&9@u:6m>ﲁI M?Kj2 r& . tG0D{&14P Hn~n\ ,rTWK\:*$ǀӟ{{iH+@BJJ:zvovnbh|s;;lwX}{Һu;D a|bԓݰ7?^ڇ?0`X^ 4PC3fΐ;qZb'}D WC^~YҩGV3ϩ2y;UL؝ѳ+tQCFhI{ ߍQTxY,֑O^zro?u'PpfF4D3^|šB6iwjonu3y≧.Nx8 ;`y~Ʋ,^=#8AvX0'$$Sk9g\ivZK$#P@OE^E C^H̻j.>kbp2bLQ8#[9HHiZOO.JZ=2> 0[H\OQ9T-R q{o>X' lLw's{qm *sRAW %yEhK#}9qW;ߡG>:\~8VJ%/yqBk;l֙Ȧ-1۶Ss̛+n~D]Sνff%02x%,y3(h\ҍ9T* f|9H|m\3/j,i_Nx Iy U# [ csn¥oh3vXy7CYB@g#}~r-zj+xG 7P8ȸɱi;8 a \5n+m[:z%/%看u/GX3qv+7K:ҦfeD9w(wpٓ .SJ/ O.䕿&JKSi{`y?io~\GPx('>XmpXF\.A*V(Z ~ef!<';K^2$hm6yPW:@(g5f\|w@ He;Ϋxz0M@si :6=.%OZ'x0_[,m&_}0L,Y)ukו-ڪcL"ҤcIPiI ~{*QF7|5YO:U^Ϥ$@iisEGM2^xyg{)Qdm" fC'yTb`ʢEq 婧JݺЙF7F '4Md˖$9b셯q< ϜQFD^zB3ᣋ.~Ɵ5c,_/'_gv߾ ꋅVK/8y2fr))5jFIZIgM┧u#e^HіLngՒAϞr3NrR\qy2 ՟q܂]MšE8F #$/r x69W[l߿#~7Zza_gwqgsQ55l,DZS95G_R {ϋX_VF,@bkԔ!C ˸( $ɕE?>n@ ڢdy?U0gj7lr 7ܠ3 *6p"w@q tXP(/4Y*?yԪU^O(oֽ8 NW IDATM/iSɋ/L/$YfWʎ2dؕrÀoǻ.S2b2SIll4&Prݣ0}vG̖"n:ݨi,ezWZ^ޤIer)3ϋ!ȋ/ ZKY n^|õX*Nχ,p.,|>t!h3NLJgʝ>6M͓/Q-}*?Of+O>QwGWm<ڧ^_y)K*|<OTwۄʉݹk&!{8|0W+(5k,5G"ޭEn.IÂ` ۯ Mzz|ruWH`А#OPG}]v `N&M9JGM" * ,\r.chּ3ceucKuu™Zu #1%e!8HJ2Io {2eܭҠaE,kҴ Mսi5q 8,--C1<͐ -R'^US>Vi\ja&ir{4sq+%qWrT|ٲeCJtMNAOѥpfwFmwi370w@G-]D&K>K?Mvb{Z3Ih 8|g;YXa'Ob,'m Aݵ^\>}: ?Ү9s.< dSȁJr#8C YfL U/_/_.w1ܩ7Ľ)Y*\㖁%<[$YquoNo-wnߕw߿\6kVCYҥr5[:)ԕ  ;uЗ}FZ?VPp_`?h ˸[Ia%/"0P ~ƍ2 o~ҵG7iٮ~8ZN/>P\ןTufb=GZWm 4 Dr%]3 fe+~$ͱvҼus) M=WLÞ|ϸ';Uf]R|f_w H6.$ $-q3 $ P4-{kSIIrˎh~ (0^Rt38j?3R>{}:mZIմH̗}t&B:y~OɅsl,kϝ=WA_tTQmF 36EIheI9řd+ ,^Xe>#Y%20%\Uc'ށ^ TO6 o]ͽT38}褠3y`c*l0hp^ݪw²qO'K\ZYt׮]Y+Gi>H7"9< $I; 0vs& JhE iKr2 ? uV4'XLկ'Mɬ zݠl)fM[st/z^6ba_7HʳzJYx,^+(@.-ڟ4'v &6& Dm`i]f[ Pɽ+ >{y3TUTf:Cɣ&⊂ˣA)P@eb$ȩm@DN|JG s]QP]ƭ$'n.m&!8!p$XmnK%t l߾]&6^F~ƩU4iT5'UUU}:a_c x$n"!`x6;T⧧A nLo@2ڃՔ2iF *Iw "brH>p-}0LfiW]ҥK@+O?Up\Se~]OݧdLLY*pUT,ޗ(3KFfU菮Ng"tp)g3<؏4 5Y;uVcNMā >F )$-Ic{fWC(i3i-Iv{׻^?G_-#FoV9̕8rAW^'ӣ@Ѡ@A9HsO3F@ f: " k7#eaȕW=+=K l_ P\sZ(۟y&0 Epi ! !An0npI;KcxJr4yoyf|.tt?@`Τܠx(U萓W @%Ru؏𛞖. {&uҰ,+B7mhq+HN*U00g $gj%M DM?#74PɞBwQ0/_h}UѣG <; })=\r?묳 *[/GE" *тU `E^S9 Δ|N]^|vcϚL`)@b\.;h}2rdm`& nx1Iyҟ&::ZfܴmyKq,h'YO\&X4g MmңwHI; \G1h[ՃumWJz_ >s[m&zhU褤@I0X>ӁPb3DN`MHspc=;Ȁ`,ߋ4IRQ@m2k=EgMHKڼm? i (pm&?KHzwRrOo,5gI1ԛaXvot10ia 涍3,ހHޛHO7,SQ4 _|V%U9sC=eo7|S:vXPzx8& iPB:.YMp"Zy2d //~N}/RB 2R֬(0tUиԱxkDE6ˋlApq_׀?`ASs*V`>&ۀ~vpmWg̃ҧrЏxl힤lsu֙7JeJ"KVՇt{P1Nj"9 "c҂~i0. $ڽwe>"-'OQs[=Ik 79b\K,;ay{ 3S\QBj./G?yϋٽa칅%mMCN}QޕJzr$oF4h~$T'M$?ҪU?Ǘ[W|2y ' qR 7$b_2Gܴ 3axo~vZyaCE2 "±^%w=v[I8\c<6GvF&- %z(hsJsמmqqӽ;8Ev;6& d]C̸/s1Nt7NիWO.wȵP%|N*zjժupEE T k֭u_Ɏ;eII~t6eze+ZpOf? *i*nٲ0Mh+6qmؽ=3۞Uv'KI$H sJoLV &jSfM~\K׮](ٖwO''NZjt3ln;mwLVTN^'KK`Ic\|iRg}&_}TZs{8(Pd@%h;a'*o[%JQ(3Er=Sn?ZYU|ȱ%/N%Izㄦ*v$ 2w(<.̍& !7e6e$&;w[o%۶m@7xC.\? >\+D^J"*9s6'ٳ&KYr5Vr焑%y_q˟'~n:XG.R%e *?Rz= =b\rQ:&]8Pс*2iGm,Ŝ0TQ+h$Qv7eDDT}xU9{ww*Q 6t 5 %[URGak~ƂZ~~Wd*SLÔ{QĢ@,ʥoJ.odBGBehylʼb$;-/Cɗ7͋\GIG^l)ܸ(}YSTNDzw}] \)}-(֭[@J2k,.'Hlll@ȝ(%_\ G*@tJ=dýMCHK>YC`JVP4@i[23V(,() @姙#qP%Y:<֤OxnР* D,Y"lܸq 8 '|R-[K%K{衇devnG* b,HF]̏ZcT%%K;QˤUk+2aJwM+$"UHp9-Kp_l޴Gƍ]%wXH>7K-իvJhXNnM'?i/_‹IVITiѲԮ .70˵bN9C-[,s%+&Ii{H34^ ZLH'k*˹cY`ԮSVڵ.k9npĉ(.gv#3/ԡ X-t5 /2oĢ~\Ul8'v|~y769ݺ7rM>n~J5t)p,cf۵!a?WJhG'ӧB2Ҥi6e 4L;̟rl&!>띞%}/k#-d5܆dp8I[}KnouΏVp-K)@tӻ;e~FDn؀%\6dIr}NuY3Bvr GOHaLklZb\ɇFMTԬ<)03duh0~;u4HC-M7G|!rOD3/ +B&e27p{~Vo o4Q%b~ lJAJb'A{~ `cxx>⋶,q[SRM ~NeE,~}yAYsmЂ/P>T^ɂSʫ"##qM<'#yq.l:(}L4޶Xhr-*7Lm7]U3`"ya؟E-UTX -UGm$\kFx6?3t9JBTn‹٣} vb65?(΀v7d'Gc} ۇ޼AHK{Qt_ɕ:(o//gޜ.?.F?Y ʪO˒D* ypVM ;}e+pK۪5$\WBu|uzEiUiK*ŃnS~PrlOv~oB{"ZsJbq[ cB ||-\ +Y>=;=9F0bj_Ƞ6A_+:hwNkʈ%ULw'WN'41, 8١wixM[Jf" b!Յ?L(V D{4! \aGVhMjrZqe @u UJ )cnJВSY.yRJ_ PBЛ|L^ƴG2Y@9}`sqJp85\p6{=#7yjG%iAˑs'M#K&oP`s`lÈ ם?<0m',Pbz@o1oi ԔB2Ke|8ߟ.12ĸ%^,^pkt Bm~D'szRHVKSuoɇ%)3k#tٖg{6Ea2hdh1hx*r1 V&X%0SG+@/{딊0Dr:۾(3"~ dE-O5ˏLO|z 'n)2kLCv``k1j$͒E :=FƁ|Dw_ZVMǶa֋b#g7sȦ5ж _+r/#Iumʓ=99@bo*WqrsK|ßc܅s&>J&s篨sKgPVTqk< s#K!(%!;ӻDCC*RPm@)B!T:䜮2Z [iwh0KP 34k}7cE&P:Wk3D@#b˳vY(5Z[kѲdp4ܗ1)Q;-)`[ &D3?n&&=\ٯӣЛuOk8MbWJ6wB/0Q^S˗ϔU0 t.ׯqrO^lʺ@QURʸE5^tI]/_Z_?;۬pj(rd }^g |XqD̂f?Ko Ӄgu0EaY%CL{!:O(a-epCeAH7TǪIŝ0HЙ]8oHbGG޶W'BoTfH|@W*|0_ܤH^n>hѤ@[ |f)wn0.U~l˷ڬm!f4""5N|'L[:ى&XBo,}*lU Y]:rǗr.?,nR%C|IHW\>DnW0y|0Kul[8"BTr.#~kykz.FlZbwsi0*FQqɤSD4& #73dAj.s% WiDYMJ_asLo.%F3s`=Aӧx+!4]/j;:A[+4녘DoSZy[HT9a*6NbB5bo2&.qPv& k?sV'MMQ[5@F=9!Qzn-VKG4R1}7j]7` k#Egqfxcغ̤>q")/}fKfǧAkriu\e&_mq@vt-DH|Er<BS/9!N8Ԉ 'Amdh =Ș<=u0Ŏn8%q I.w5F,l'5r.{ _P-)BqQq/:fszF=ƘwdL>o Ĕl Ag:_,M=BCu^@bR#ddYsO}LY)63QR %(57̑4zo ʢDYv U`OHb>FcW "Nc?q=tC36 &/oJ.}#kWa*,?X!8;P,DT ѫ,7!Z5[ $#nCnr>:y5D|>WZ'.[4j&.3 < mӰTcCF70wn#D,o5`2vree? =0dO 4 Ǎ]Eͻe&#.&_?c4?/W. `*{.ocꮻ&b νke$¯sbXC"om;Uᤖw=ݠϩ/j>f4 w?bRU$eW!=nPm:#֦r!L LL$KraANz7Jf_-t:p.qI5@&W_"x`٠'6jTu /ouu6Ds{6m#_̐>W?N3[[mM<|$D$?ô; S.T1S x}S v;Z&ǐÓJ*g.NY7!/*%x6/{9~Pi7lCEϛƤ a\ ?#9a,.wj8y΋I0v{Eg=cn/]|Jh nʅPў2 5{iHz;c)Jڤ0Q(<ǧtK̔,~W+#`SLc]k<K1;eTG>?6_rdrSR#:*ދ. пda0Uo) GY7^o m xwXnyI\VcIQN@sc @!]J1p6n,~E>4=Qb?4=򰺡R} _$BdI-DHw{[P]iNDQ (*1(㘱J9<W`{ophx*64޽bk&e(|IϳUV;9;Va\a\,oOeNYk;\x%Z]oMq+v W=*4IaN Y M)8Z?P**ZJ?4zTƅ5!1ozFq8)>77 F$*wֳl{b:&?9oXz߭ < =&|yd OQ#"Su0 Ws{v%fJgj#n6(i=NOʒ߿Ws@~H|*,4B1T9 B^C?76"NcI/Gh@w#Is>eɱcf\  Zއ=M OĢkE>ny=&3f21T !HH!y[Z،ʸ>!Y~6H_ 9ӅI0P̣n͠R?/ʵgpLpF"F~.*F#Ӕu >55ɫKAmQ Q0CN)?-^] q55qPn@ˊE<9=D 3?;ʾrndO[$iVYn+W޾vs/!v N1#ΰP9 shOO[_+eH '.0.t=䜍̫*_gҡ.?p.|-vؚ_%;ˠ 8ΩH gRHg,ɉx@6iUק ^WCO t7-'S۷0,8u g5,DFGo`RfT\Z$JNPWqS__%'zD6pn7l4TIbh$d}s CI"By8+Or4#|Jl'L)CwE+;< fW!NcPlЁAVbX9@ReP=7$-:wMM4=}q5O*yk?50 qb'NN ;Z;/M9m@3?S?>9hm[۷X71K&˾21)Xwʪ0)}U":Ӈ[ɧ?\kg !TɈIAxX~T]hN|:ϸvt(%—|[HϨUCOpEၨbw-nzk[T9ǍjAlk  cVg`|:"Ǩee+&q$/MEt?vV) F 53QuzX,ci>uvo]"wrnƌ_dwDNhZRW=de"NM1G%M}{tdgWiui4RFSDWX9ɐ0I$-y9ҢNo~>kF3.ifBy,c|. &0;ٳug.|f1Yd^=pldyan*nIVɠCn1Ϡ"rӷzW;q(\;?Xa, q^ZeVZ8ӟQ a Z}<ݚANPZNM;gFQ@,2i|‰ؤ5ŁӹEl(S,$KeP2z@%@b"u& -وCyE5⇭՟N:񑓵(\2 R,FnYՆaerx"=-E$CDϵJ5^$g|jh$.xa_Yy]βI\,*j*ǎ]Gd qID=9oEѻ{yj^;+bK^ .y q!ۀjf-O{mܯ@7_vvw'-Cj'_///fe3˘`vszb׼,Sjg/a ɀ?W|6 %AtR(l}ǀq;˩\n0/zԠIGps3زUlC"4\YZi{zTQ^V!DX0ZR ^MnEN* ℎ@vByܹ ~nlf]x^%W19LvCǧz`]\O;P^OIz>:RآOcj]B^$㮝CHrg+LZ%_+Ĥ0JJ$ Utr#ؔft t Օ" RQ(򎖫T @) {j4*!!oRNWeh,P xZO8BjDƬ*xA 7S6!^kLJ %?[QbJȱPy !N༮II6ՕbYl+ȺmL*/z="/D_ž&]BtA\?UGjFF5"X ٷ 6tq{.}~=M&趸Ti0K, ;ՄSY%7 {cp4PZ,Q=ɫ OEݒ̮/Gó^"՚#85FtX֖[> }4qAY5)p 0~|aNӾ.:^, U[YH^jr< y'@"x%sy~ 涥H!]%3&x?w+R`p%[ѐe/K6qUJ d4O ׻3@ёL͸f~,B88V ށe7}< ˿vGs?)_"*#VE [eϷD T@C7b{M"IBƆME MnkݿTn{i i<޾^r<8/hѭSՖdVl\ɝYEWnXcfSd|`570`~-:b,@ؚzĢ5N[h.{)nZ^#=14":A/r=0c9f9lyM^cy9̶_{ɢ'$p +.Yƪ-[Ÿ"rH82d/&!g,[{7i":1GEm1xݟ*HT/s]=BUaFT$L+V |a[le^R+u/>1({x;g ޤxe9SAAk(7|3P{m7Lj1-䬬GP{F5s9eMJ\ cV>ڇH7+tdb/懳pbۖ}ĔV~иNi!+j4J|2U9#=2'K Hԓ@_]G{no_HޖBeO'q]֘E{l%ik~1l좮FH^`B,i3&t8V磙["K VL2m.#xWN_ť,(F>+ȐҢK*oHUn\%\]áv?n%Ýr ڣ6_ G0ᓥA$@q0W M6Z$?>:g~kFierbߧ2#s|-PH14)a0~rJ"wYwwŗx;1@޳+L>H ~<Dd!Ɓg9PkH;Ӓdi$~up gâ+{THfUJY\k3Y2$#Į)=}K}BF3Qi]ڳ+. ?e] 8J.,&076D.'$8x,Uƌx6׿WkeUGBVIZ * 8mC nQBs(B_I7f$)^p$z|7pk~$.VP}oayO[Tw$I[LX6磫&t#aى-ۣ-uBh> R7ٹ4hp^ l'< ^2t Wv8.vYo-'21e0N"rI_zQݫV>՘]L{j=si+q6VfdW` ̬Kе"ԗq*YȜ%iA T^e-1B16f *!.n= (ț of 66EppZ xezCZί9ubЖ.plłY+ OWCjm;bLx&XuDBb,VOk p0SBOI8V<3-LГÞ&rؙԌȽqjTc[M&[_҅豙pqT@P\\WdͿd$w&;%|hG1S ln)N'˥A W6l d-/]Y*E-!*" Nv_Q  [5|/g!J}cqK j))qO[q\,]P >J} $y3BhCN~gXG#@]F 8 mQ_˿0϶Yf|(@HݧengF<@J69KٹR{k^Vբh)cl3Ѧhʖ&J/z_nP8Ҋg"7J1i,\bDPxbBg q#< #ޖRaeq؈|n- B~CASzE{{$Il +~5UBִbL޿XS~VR`hkG m4HJT{Bp!U+TK?9ӽrw[ Ѝ7bs*/"6@/3^X666(Lm7Q篇͉B="kKJJJ{7"h0υFςݦSMM;~x .USUN2X/xaz](9Wb9j:Xw7RbD bM_VT"ADOXwg$޹}GUC{c%5 zZ _R,̯%l@ M2rX0rY^'H}_&"_ 0,6Qx7'^ K{p |UT>X{Jy a[">$۝o .4V%\Ol+ |L"`I NuCN{6sZ%$xy GIHUTLΫPY1jwbX+v/ku!B:@^j5J։֞ʽ_;p@ryYoؓ nع)/,@&C`^4rtJ:7fgkɩI˯rZ:k$B6EOjju?wHhى]ygl8Ab<%",97"P\lrO;?ųB 'tUCp̱GM4#Z;IH )nZ VdxJޮ]ޒ$&Cʲ!&g 'B>.=[ƜTǞk>\b/Dm(LD* ҙ>j 'n~eiH<(J*E/5*Y%L]UN:X}咹0RhW`wF_}1*{ `fv]m/5V[N H[#.bl`fފy"JCincDvӭYfdQlOClR?y "D:;_G# ,TbWr:C⡡,Ja\HapS6(X.F}ÝEv>^# _?K{.^4 Ե F'#$?l0޹oyY i5^hZm&|m,ql%9-gAq1eWow.1O\<[Ϧ{e8nC' 8F\WNMjpg&[< W@ *Ug`pi6‰l]H3+_`-MLQ[8di%Z_isW.8}:[E/,9j܀7WM?x؄?y=B }I˟ZAHq*~pTM27 sBr@#c!y!n?%|O>yO4rQC];c_@ g@52(`ۨMoK~(|"'RfY-;Ѕ/uhqq(C.04~c ܲ#凞3ڴt YwBa G:tZ`, 6PV{#Ӷe&c^:,[/@>{:OCp-w[/08S2!`ҾajTëڱ~")iI`1o#۔G)fA6TS*s+kl$ʫSߢ/̵éNJ}Ms"lUsmz`Kgꍧ ݣKYo@=C\PpER2w}hk+q{ıw$hǚsc%̏!C}60>HE+m g#snAfò)TArOHXs XmQX |.%&`ѳ6ZjpL}UxǠ&ٓy ̐]:e%XtJICLd[>dS^8[isl|c fzNj]п:xZ۝TY&$vH5 !-BH1"u$vdQҍ'$FnrK63xh?r:(w6}C{\Xlk픠 9WjjcKLzqxǪ*5!=>\$r+XpŝRO`fXFc-F RY!pRA#s6R\;:h;qy&,`7~Y~ X{afu&^wd- ]HqŠw,La6w5V・`cj IHe' <҃;ն#~u[)nW1b|Ypin5]c!=*pQ:Dq!$Yq#}S~Wً2JU$0YtZgGgYb\ACMf7Zک)~G0 <6y="馉 1Y{K+[)]n~>"e,~@@qSfdP+ JT 8偳US rrlP39w}*U8[= Ld5#aDٴŒ p ԣE8lN\󫓮.0hLA@yOv o!FR4~uk~ykdۆ{e}npYYR i!aQ͖ǿօ[7;$w S!HO_g-ٍp-~xbПvED~Kb{ܗY`x1b f*.ݻsiЙɅb8eod4W e=(W>Xϱ8HrC%v"vGSň1c !SVdOm')}(:z)D\Br`ya 06>HͰJYX) z%_^d짦!tz!zLc/W{Kut0Lz:ݰQ'/Y0!X&ƏDlO~’ ڸ׆BnK2ո#L#խ4j_jYmG((sKA[iQM,/ڤؤ+$W#H N42+3><<<(#Rph@?K?Tf-NI@T(RsQb蕸cTb,1|\?10v޽ }҅9+zo?q_[>04eE0h]yaIHycnu&ˠ<Z\wcfĈvvRDm#J*.H4e|/ҙ(+;y!BjxXnw\W^e5^xU[E\x7?ny ,8kvh*T lѸXʷ<+B FYH[zFIaz[BKr)QL.{z[H};gnOȜYy.m"'^zJ=#lE?cDR2R_ i=]ЂB9">"lj%1j0#Ou|/ʕN_H{O;JP2]:~6fW" Rv?98#^2&X Ǧ,N-F>4G/0u\KZCbb&AcԆؔ,$>'E69W{U{(K-{po`^GaTVSk\KD&t׳eGtu _}Y 3o yT,@ϣ%\z]Q<NHxrތ{ "R3r_e9*v#ʕ%ũ(+[;wV^>ulZ*ƣM:WLG<$o7Gz圐шw9)&$o3Z%c7t>rz3^$: w=bsY@b 8U2=dux/E_LqA߭XatLыOΊ <!QvRgf#Tr"%~h)x $QjRJ=< ѯpyNSlھK Əv!-P&8u:tTHEaPlާm8RX6 $w_{=D5;ɮwVf)\pMO354UqFPs  >|-w] 3#)p 0K uyE%.Np2hZ[ϰp76H5yVu)x @#<j;!|Ocm~ i=/QZzQ/DŊƋ5 zFw}z<, #->?Hc,jh ;]gDW)AHG?X)%(q6'yotJ; Jhl BwYq zDio.3<ּVmpާ}+_V_*a@qjߍ}"r~BZߟ&q=VwQ[$,4O沒MW}~E}_L{X߀μ:tD*IVzړ5ѝ%QRVM4h1D1TFPl)lɁ[̈A̐$8T%vK '5lOV:o[ s(Ymu(,p7qF"Wdo%ql]TvR)N2oWŴgV.OJu2ݡC/ S}+SG},Cu_.=AiKߺ[dկnBNcZ d.Y^;xD_yoee8䮪1efa:f_kN [1 LQ(=,}3@:G;`RaOE}"0쌑ps7ʦqMO)~:!Œ(R?~G@qsK˰ P RuM V|7ߩ{*\dТCcinSԡN7M2yɊ\ z&n%fb2pUܻ A cŶ5NXKLF-Nk82q9ن.+)9Oi;z6'D&3s&cP?$9H[ csz%;RrML?LfO guF~ "F|Y~c:I1l%]V~p~?(PlarZYH{v6Q .T_c;^УQChH! ڢkpH2VpEig85KeN62;9d,="cuOsCFHATvX#;C>rZBXu%YFVHԄxj^}&ky/&o %U3Lzw>(^Bu.U?AbӮHҺt>و&`Fo]#ýYzw֒nU,^gSҞ^\ងhXptgkuT:3{JxjY.gq.R붞QNsg+ IJB7NFa[m/0~(S+rQ "in@©:EN݂+O$י TMMTdsw01Aق,w7E]z(S1kF|QNaXYbR1|K#ޑ"i * 7:ӏmX³&v^SVWGOK(JlU_}zg"UO*{9l[ _c`z̯KR$]{ ҥ ~%Jj%, ֲ֓9F%E;75*Ȣ!3v/ JHG4rVCVTLhlZ"fΒgȺVn,4 {̪_9NCA^(H( ~_F?^_xM7gӣjt1q\?>/w۸luq5#.,bǧ>9i~WWcUsf{dd@ϱB9&&:d\I=>Biֱ|Ny9KnR{,)( `@v&TDfѺ)kSMg {y1nVVR.0{ltlI,X791 %2Ddߥz ә sP,;EkXvS`Bpni=jcXD_ܮI-[* 43><}f% oȫ:^+w:U=I͋vXq~LqzOQ)9 `E(b6r )&gY zґ O1wfۇ͚mk H>u!{ubTӽ0sDcn5qs;+y]z(qꀬLYVD5U7m43~grjrA_9>bwpJLqez4G`^ 2Q ijmN[̬vȢdFPzz>Uu8AC{ǝu r QݞpG R EyGa:V5L-[\0R藺jߗ`;"o7|?VXŝQlUmJ|Te+/؄<Ȃ}Q5p܏&|gtir@|:[ts+) eRe̾¸ }>ЭX~(!BZ-hESk*?JЍnKtj c 2 AW`7=+s/N5J*'&7F< HLnu:A; X1D.0*6Ck0u!y@?=AuQq8e,,3ү(0>44dMԯGi&͑EXRY$5#^yJ Ftg(2Lö%ZU|xHo"pƯ>b-~53JFHh_dw VRɯcjvt7 !="bx R2p@;8×htUz-F-:|s-+ >hH̕;z.w? |' CEi0%Ap{)cse8qÇ2`B  C Kv7Nw1KfW2_uSN%;OjosI(mNYiV [kx.C@A#z]ZI-{mށ_r콃568"\ #ZK3q{jKBg\rN}Ox Inyɇ}#2fӕ6QgT/qQDqFӂqpy벆V)JlWNj'R7;Kh4Ǔ6" J6 RY@p:$T:U$@Ӻ9ؽWHɒ="xl^ o bU]U]j)yd;g^1R^A^F;l_JV{婹eY7d QN 3C]  *+ cNSN7Jz}ն YS=^2פj)N͔L\fEE0#XxncXگw ћ7uDc{Q4^Fx hY#v\a!+[5jw,c{t^6@hD7 ]7 XZG_ʱ4kf$:џ|8f8*?.D{ࢋ+_b9Ol)+Yέ9v3$,oqT[ϹO;'VtJS R'3uẗ́Kn 6O Gb/u w̌EI糪'n,2[Zp#^kn3E.-կDroTLDk|4̈\9i잿"Ϡ[_iP|`6I.3tP*[uO8Ftxc_:`LI)Ƨo9@k -N!_dFgW* d%8lk(f۬-\;0b[q1,F"0VS_5K2!0)Ԉ}μ]6ØRԴ3†+Bx8= T39?wup>UqGc<_0EtGrMo+q\ Qo~{`3&gm]8.<2 -\ܘwt@N!3H|eLQp.GŚτѓ ө[v25+i! ;DѫU;jScQy,300|qy󌕾L\bWkɪ]T2 inaP`V#lnl̏jA>1  eU1Peؤ ql/!iWRyPSG bj Qjtc8мK<-j]^ c!9[+d>Qa*8m[^dDdž7󰝈A~t!Nա,fQ9f|oM'z^V}oƣJƻS QR,?eZ&ж k%)3\YIvaQ7~/M|f?;=%4./`+a';| n,|WbBtمRFnOjuA:NK. Y.l@β}M{c[A\QJ/NYѻIi)Ub웴YJ.q6zlr€%]~'&OkidizLckKx#4ꗻ3`wK?|S&ӟS%rn_*TVUn`XCG=ѫ0Κ̈Öl 1.+K]f0j]R۶Rׯ ,U:b[}./A'OUAE\hZpSRj臤iP1eby6qNF}C`+0HUIqa>%:I_}ěZRs5?FeFw6 lDHR/;T,kOAPé/`IED]ג'ˬ(?A-φW֬=N{륾!iq9+oMoHo'̽Ry#E9ܘ 7( cƥy{K)BU:+7Z^ xOucS(K:y'*lx{A+7&(EmD.FxwҰ@N_ Noz,F+HV cݟ%74 + !7}#ڌ:O=CU^IE&UWMybrl>q]N~nw\,#KdmB#_?=UIS:@o i'n)tk­.E4SUR t [t5}7:\1kt{F8\cq Še ?5L_Ő)랪^M_{aj2 W]I(׹xLJz/j!A%_3hf4<֩>N76p&ŕ[}{)Xj y0EkhaG9u4E4}y}@X0ulbi6o46q%QՍܜӢ3 ܙi%S3&{{-=GbxjШ$@ֆ2oQGѫrVl.+(LyuEj![)]- ) ˭sU'39 Gg% I=1Oޖ sYUs+%WYoy\=(#n;wh'Yh^s(6M2QA;<&0+*f=/ƎYR*GZyn~-{+w,$\؃G8SBBwa'M=S>^;*z{֓ G딡9N{t!DѲf*V? Zw A;$Y %hZ뻕]gVؕ!k; oVɛp,!3&[Eߣ 5t4ILX-_ `\б#?YLfM߰Li#RgwS7D[Bl*iFe^WVESk[x!1޿"DF1Dt-7g8h ;%65z c1d(*AbzP Ub"/kѷ0˶Aٗplr[WΠ?RvYncfO#8^rc jY{X=U:E0ܵC^d 4Hɕb~O]3Ԡ}6TRTqabKӋ}? |Oֵ FȘm"sGuKb$1LT0uVw.zlQ1JRݏkK5ѓI=?p' VQveF XeՈX R?Ƥz `z3O4,_! t-S[NfXD3u9\n/iuvTvmOg_0(yBe=D/s7%#'cU ?ǫ-h>ϕ+'k#)77ϑV(%] _PVoS*#RFs"OX cSF[$!U&'hX9uׯ>)bqp@bĊ8){ GL. ,ǧb~ּJH&|'O%Qpv<}:OOEREa<957lq}/rd3J{4ٰyn9 G}bg4Q{+S,Q+4@LXDn?Ζ RI 1nKI3,[|m<4R J|\xxj|JO[0H߭%cea 6ȕ/ݛ2rɦrDs1B0ZIzv t?~WOoUD`)42Dcy2A4zB?38nFM/ǸH~7jQ^fAvZD(3KĖ+.pvpz?ٿJ]E%nfcW̗nB?.DR<-Պn {Nv)W.Cll?:xW>%-ead7 Et+" Gܳid̿;.` E^WC䤙/֛o uu\N25E]@\hƌ$Vv5@7~Lu]Q("m0EtJ$Tz]K= )[Eti83ˊ22SlT<⻣jre`n^EM)Mnc L(&L]U9O  /|Ir^>2>iNdc"1BʸI,O 8N#E fPcᶔv}?eW"] ]j%;#)lQFZJӑ:m-Hx'"'̀dnoUC2\{EVvTӼv'CX>C_84h$ ĩ 6x1j}d,0+Û|BbNݔ*m7eԲ`-=ss$$a +mA{c%ۼv[;,tM sjJ_TY<4*ϮoHjǗBn-eD6 c|nKV8emjHĩPO£v >˰Cqю<$Ym~nNY{8n G)-.H\uCpx1=+!H)iRYkFm671]%._ƍlu."A.}zJiN"<8hTfƌfO{_W/sP)q@32/Sۆ,'P~GK6NtLE@(R[yP(ɽ vxKAqwT}Ed C Uke;yf8o]؆"'װӮCxeUFoܫ$̌I1I4*7oyUP \>Y|&F)/Q\䴹ڈY/nT3> = ^ELBUC=_ nU0R)5UJ{{aYd5ٜ_b@R)3DDqAF׵WWK[7㦢;'^k#bYru`3>;5} m'S~ae`= rWISR*C^At%oঞ豣kESv{M8S:wS?"SDڬai}Jn :jmz&1s<c} >Y}br#0g3r+K(n>5UL$==^x_Ot X o6\eCI7}*4M-ܜ"ggPL R5%+D Y_[^hEPa8 ֺ379"ʎNw  3*$T>i c [o?m{؛Â90H KU{}pISXc#vVN{LĚD]|v_1FËl_˩0T~3QxRtzImI)-<_F9~ln'fOQǰz "O4`"S>ؗtsv㺅oPu,M tcW(dw%~XnԶCNz;Rl2 L=h2Bt1lxI^JpSgwDx?F}O;Coz+;evCp,L<[!2G3x&&"2nꮦ&َ׫`S? YSBn|H] AT9^dmKUvcѻ+0g‹(J[Wd0rq}Ip[ŏDn kW} Mus fKj%1.:SКYx*;l>~qGEMgDT3-\ٗ@4XN`'q[bem^lŸS@P!VtB"("f]#kڜM-yS420pYmE[}zEnx^b= .[}Y)nOڝ߽oOMy6 -Z]~?HWTeoċQRmij]ڽ"`}TAHgzs9"-~)/'QӢ%asC<"Q{=9ottY^Twq`4%Djg;~[h|h^AǓmma"[u+[lрN2Ub1r M"*JaD'պbgZؿK֕Ȋ@8Bls+M8nuΝ#?8eIV*oK&,@xi VS"6F-)os ꝷ~g/-֏2r4 q-CCH9rDhwŁGNFŧ0Яj b팏 ɻmlFz0;d4|H$Sط𚵜U,N`Eb)Ou:`GD'{>iZ1캧D9p@Y'~_ o/3 ui}aB[56;$߀̋%8E.-[RzU~:|<@n/%5/'Xݟ dW?I_>jEଶ⏟ܧCn?tL*yWݔ< uRBϤKVrK{O~`\G(|1vhaA劙E2O3!6*?()}ңaihKl&^+C8]U|u0֐ȏ&MeC\f#T͂+S]98=|z1bMCmJms 9OhРAl:]ueh!{Iar[ǯW\._Q۞o wB19V&ص)P{t:s#T=˺*ΫSZe\J97 jք 4+ZqFZqJүQk|&0p}s t ͦXZ>'V1OQYR솿_s&v1^t;}Π6Mt1oXǶ՘YE`;D9ڸFX`k9JAy {@(g_dՁwwn"5Y尺¡Ai{q;*+jR|%#V]y,Ȗ[%{, 9d?IO[3yˋI*4gN&.[RnI~;R"0ԍ7G PvRt9zzvsEhv->ٲON#N5M0e3%9ɞ ^:7jY C]Pdzcب{ =ڿ  M<\̽|ľn+ H?H5ʨ9?~R6,tSVeWJL-5N}hN<8=}lfHsC 30,Fs o~9YZ_X|-ҩHz#y3y#N8Ja "c)9R~V9HvIоAzr+csn7S ձGNc8}8vksw԰U@fP {vT4÷2_<w^2wSoEC>6 fC]4{GwW]ޥsD\ظ,1g%VvA^n^?BNg+|?u,tpIREQ4&>?`L(}G28#lv<#zVw~SxH/H,m]vwd̛P֮EpfL.jsoҩYgA]+.t nx9|"YH"7t[KZFtU0aUNĀ{;s^48N& `Sؑ&1 6!"qJ{L5G_ ͂xi=2T3ڸ0A,Zlڇa~O$DG"nl27kP|ad4vZhQIԂ[y* #aJhsH˚M8/(P=| |ې)LE%9z[فӵC1ݳ;O2C`_rλhUA_pn| ;`wLN~3}CxebvUpِ|m+"cE; p R% zNBSαzocΡඃ mn oT*ꓙq~$J&Ep:ʾg܈s~i(Q`Цh?i~\@ %ѧ6-Ê1@(ݕ\&'yx$|l#w2jvt} fD)pp;W* +miӢ!ͥ~1$i-~P }gl!rͿĚ h٫{.kOC8{2VLU!:n'2 jV+Uxyp9I&[p'S M+SRx f,GR •ip1*UF}(QB:ikx!>(-U&|Ϡҁ'VBU` ƌG՚DJ`R!_r,;&ٌ̧DTNLX{%> OrhYPZ7^gs^SsŏI'ḔVzc-.>yǹog _Ɲ!╛h)"~^G-)BzmqYC&K[6!A咞SJz0]Pʽa ӂh=-ׅEdS* Zc.uvy&P2*qf?"s"rݥ[Դ Mf5!@-SV= e^29g~sjr:Dl>g9)F(\2E,9\}Oz-H~ ^_CQdJ>hڊK[?|wpǛnro>5X8}"&vBRvKLȊ&㞟xg}5w2ɳ*Z^C)> [Y. ) Du['~<7r=wibYƍhq!UK-[ŐbLU3\'E35Cs@Mܽyc Vz "1GA] bIjHٞn~f?u/.lD ~RY=@+,UZhƛCԔް@HTʹ YݞO/R#Q^}7bQ/tФ8vr$Z30 0:"< EL3 ]%u)ΟgfW3#Ife#P[GΉThA'53WZ -+ic'Ϡ/!\XmmAO0RѴDqh=l\ Jxal!4-fc&䷀KýMwؠS9m9d}cE[6Pc"ό˲Y/ mDw.rg3IƃI?lr٬#Lyh9aYc^ ,2a pmL`R7_OBzH]ۧNz} UӉwټݯ"A!(Q7_yjyUݐ(1H!;Rcx1hՉ Ww(BW%[ԽѠH[ˠ4_ kFLopȅlQ.w8d 8)OfE,E YA ,.3WhĎH\~8)Bk B)XY&M;)GdCAl%\!aEU"KzucEKS B#= IKB.}`K^d=8p7bg$mP)6V'-V z/Sw#Q15V/—28,sT2D'"#{g:LD4/͝:N'QeQUѲg)3}I?lNsH<mE(V=>H{s)$)S(ctO7BH+Wym.U\go_3RJ*`T>iV!i(Y:\NAK FMM(eVihSPB%h/ŕ+a_4{ /~^\8ƚPm[`>tf;eVڸF6z/5@kbT*ϼaȯ ^9۶XH3" 5|] yY;|Q?M {\@{>Gt 9#RTnC;kS5Œ gXmp>H10㖠2h|2ᙷ;@%g' WS ǖ %y8^iy* +~ڄD u0gFE_ٯ#}f܅@!+* &#ߜҚOPε.&h1jC>.iV 7rsM nBMJ khR}5Vf3Il PfӤ94X#K Ljfy˜4RWޤBkoe+e ʇВ`*ˑTX_Et35t;$bF(.heZM +-dߨxޝLw,0bv]o r0|F+-^}&/ {MB%Xla!](z"a`HrI1mcUtЉ@ NrgӉי'VCVK]R9MC$XEx:^]PQm*itG B7K=-X/2H#G 5=~jqܐXL"'9&_A L?1Ry?X[ۘSS8_  ϸhh)KKQİ@Ρu_=HT>KwvR1_;AzYn怆!]Cr/MT_ƀHaA|Ej &uһ[W30l Lm)@b4Fh6FHH qp4~, ڱ aB?ym#%^J'$[J{BmO#<'TjJ6k+"[3tmvJDJ 2w.ڜ /=GJC|z-C2CQ>7`CS>0T+UxϨXvM]:1tpjNW~f?-Ӣ)Ք_]+ qrW5"|!I/#;'G>`(:^#n=aHlA?d mD j=;U^niF Fa-)N٨{_+}`Εlűro7~}BDީԉN\ ÓRU䆡vڑѷ&ZMnoVfKD3(\|W~x)dc}4m;Ɲ[C95E^\*٨XfqDF}h1vWZ$߅S-0e~| /AH}-!9=Ɗd'5z"<lAWG2flXE<}j.8FḨ_p8wi_p ߐ**TE5 N#w^! Pv!Vhρ7;ߧTd9 $D«]I5Lrsu&iM}~愳UN5* p+c|e }sߜo[{W!Ϟ V~y'N%Cm`97Qzgjz]̺91RkfÒOa E"Њ#<d\*+2D<ƏEevǴu_zKT ќf <Ĭyӵ;l7EvWc냾h ƴpP+RQ@M ŀ/_'$CyFcbmY'UwD/[n0쁃RɲU'ab9J#?gORT$!+;8Ggм"iRdW&J+58.LbLM={кEhjT(j#1 =d:HSyIuJQjst4 M'ZN:>ݘA6īo|be{}"URCbRg|1,+d4vdQ|쟔zfk*Em;#_ن }*Jf9|`!Ŕpƈx)~ t|x=S-N I~{’9nɒPw Ux剔PoS`SbY,:b,n?[)zS 'S/6{rmmp*&~?{=o#jtm2)g86x6xPlM>n6i >:W}W eW)%gMFpG&y%`86b`9`X!Wc(J+UBӹ#f]"a2~Ia>\(DX@_HVG{1jq NGQ~sz{Hnut"Bg Uo9xk+bw2oRHtTQUT{hC;1d\=c\ ZD~EdQ+;eѪ]S34 yfpql{dXMG?r~4D" N؞-c,]~9E}Ul*ǟ!ő'S7Ўr:õLPXԃE^oqJW_ E;_K4ޯ*XlL6ϥY1/^ n-C#$X7rE dt0ky%!'?UQss ̀jHAWGY.*]tFfܕ2mF"3g(J)DW?RaԩkBbM۔Z$1wBagVcavV 0y-O/ňG\q2Y`UV5Xm lzΰ(tV}7glKmdՃ,=w۔5T Z<4>H̿˜"WbVu4z[_`/# ,Z﷓/YN5^fnKxLI3)ߞ| xK Yt?l4\t}s^>[UYa2Ah5zzZKtBHGcl4.3'/Om$ PR zU0v_H ZuxUKng&)Op/Q?޻UGid.ECyD[| ~ˍ젦>5/arMt>,ḇcՕ>z֮暤TIV͚{D*i2X+͒ݝ_FS"11C ;y ~.6;."do+Q *Xm?ڶ4f7;!h#~X^3j-#Y{vݏ[Gԟ;1R.>P\Go*G' JSwF=wջYRז]BL`;!=M(id=fWK{r\1FJ"%]s.]U!0Ԕ*al P`сQG̱חq67a5~H+ĩ љl{*G藞+i YG0KxdA-Pb[4XaJT*_wxҽ53\R 9SB=3 ZQ8x[=9^NRۻC ^*E i]\X[\-)2`*6ͻA_H\߲ܧ@-_DJ>1c c@u{6s QreaV+, sBSƴ"^(] 8>qRHtZcm@ܺkh}6![N R5RQtl_s,PƂ:T'tD, KzM;nM+ Sn;U_fZ )QfLx[[p8d?`oXv=ZŷJ@G3qWfH{SW=7[)Z xs3:=\k`l#"eP#cD ٟ,g\i0qq[MqJhF.Ub]: *$CGi" &0!UAV&cPoLD2noу &dlpޣ**A%*5=]I @b÷ }ܴ?ScT )U: $ d`fbr&}]b5_yZjf&=92?:D ՑT!3`_cVLAh+t'@u2 eގ8$"<ڪaQ![2ط`LyKz;x, z^ yLӆɉ 2ga !*u!X%r쭰)̻8>B"8 Y[rgj  N{visWf]aiϩRݲ\u4T.Oi?qi9^y9yTåY+x]"f,95=?Q-V[YXMQqI"P]Iqަ \[&XyZ|sjJu{Ҡs?i~n־ JjqvWG*a,͋l+ȟ<,|y3͙_-)n]v9OӚœބ;Dޚfڱ8RtlsJm ύWdTv` cf#;y@uP2XP6 c޸R;KFKj\?\~`u ͩO r5Ba񖁊x-CtT$r$x6ezX:P5S?Qd]zC$։6`Lg.]j(n S]?ܶKr,>_Uۏ/++ͼo@ϋsu'No<%'B%6ġ Y3VTiY uq0>sgrxī8{S 8!wj-N 5nڍfz?bQ]S9.bGT(?@րNu2Yz80Z|vm`;yd B`g 񲿯<\Y -3QZȂm-~qtNÃ_>| fzF־h, ߧ3&ag 3mY)s_ 2YuY8eu{C=BJ&na+^x}sMݷ&XדgsulV ޞO(Z7C<%h5,9W9gۨ znhUWopw &:W]+n7B.?)WezaC73T)Zc5YݏU‴RHe*W'POW>1Do\W^"e Eԕd(Sت^NrCyؐQvz_c/U33=E$a=Eìǵѩ|E]-\J߾쇱]lu!o "oozagBFf<|p]nGP>lEg!7g"6+f;!2.63=Z~]#ؐ55=};c-R> qynՊ=K~hw;V_M; m*E < }c{p;-U =#XdW9<=UcqMsC1{U)Ph eMgaoB0f(C1^l9qPS¯o.3>:#jA_?9/8 uї] I< [yß> YJGlO#eet4E$It[6ܫ@X ^(סI٧'^GK_>2#8YN,mvA=Cß.?uHZ[>ݧ' WrMn*3^o#̭: J`fln2Yγ3#X<ඳv& '𶸅S@! dy-7N8ۦr AD-qئTՇV$El$vm2CY]ß#j~:2V7'/X &|K+.QR 7Gg\Ǻ* mTЄFf/S뭴t1mMvb lM`Tߟ2!#kŝUap {lYtE흤-u\u=U-AKaK'v \ޞDB߳65C׉Coʖ2=OtyVbG7,UdҶwlJy< spEG6@u2Owx%ԲV>׻Z-Vצr{~KijJIM-ipyP;ՏoB >"=ɓl-.kPXnJ^h:@f9bh-LJɊTi~jbzTI1r 2 i ~dIU c)3ܬ)ϭ LD%lW1t;I&;15Vb+Pb$ۘ=;4Z9uqm <vէ٪.''_X`W`L7m_Oϝؕ#Rwbn|,HXǴؚ?ʚq(CJ}FȼۈID.`gY¼lmiv̈́ݍ I)yS"@bmSۗbGЇubCjZ8TmU *  rowl$%._B,nd#:2e lii;AN]n2vw'E+s# %͚}YXnvѧ; ɵ|HRݾW"Wϫn 5)e{|HM@R׫~torYjHdZgޢͿ{h@M흰/gXK=baJM{uEVN\bVT;Vw 76pbsVчwj.Os_CY[z0@0?t50)F}qB+l)V3QxqHaaP =--ưx65~Mo;ׯ4^ԮpVsZ*Yb#6-_Z1Y'[AqZ z8qb3zn\ %z)o~e,aRo$ɱŁ+yHqxRD~mD<ۛvytc*ֺͷ֦ F); :da@w;6Y(.44kr!E*k3NwҞ}p^ ?Rxl~"ƄNjXY)5'zbJCcG}h^x}?>] Tj"J(ܥ75cL#U%J.#>Pm?D2U.nlu̚AoD2ǖ A?θ)3$%{M3^$$[9tU~2(WdAUnTbTkJXj̹cP(D!JlU'zѓ+ٺS(~ީ#2W[g jgmʣ~X T8`,h2e>JrPۑ(W35GkK'!x欵mO!NT^)ס~+̼lU6QVku(MQ)]&.:zDUNhJlpUCoS7b݀G|)d| >K~P 9g;  )kÓ UBa(,IdgykZ\H 1?)5%JS5BKį-<v,Eo b45aͰYdJV#GjǫcB0 l0>jM[?n% է6;Zudt+7qe9*֋ arIqFptЛWtSH>=z~0/tJD@z;)39UvZ̡$Pyv{\~{ wx!NlaCZ2GL{ ~bgQDa<:y}+d+P S &&+ \ӎt#̐`Wy zDaw *nkӅt vo-`xK:E;Я]nQX(yU+JugT*nHM<'ᕅ c^k.#fS$lOyd wWrj/'ߍS 0~CQ ։2Kg\18 Z:Ι"gzq#.JO6fNȹv1sԯKJ|Ue9iIso/:jI>y-YwWd'YrS"1X1.uT,*v.ljL 'Z'?0Ľ1bt$|=I@\ OjzxJKc5lr-}:5J\I $ {ͳs >sOSԐȢT> ϥ4LB.ukIBl|`Y di*Lƾ@QV} 86!p$4-|лS{2 u iK>B~k+K|?ʾ_,sƀaF|)Φ^ɫl]{v fwfEP-^m6syor" *: |QWCu 9 ec|eDO*_O^I8>adT]tL'G[v8Q˼ƃb*+JC=L g 7KhICxtpTRON^%H#N1 Hp1/ř Ƌkj{KD'OA?]G8Oiqk~blɟXӊV1 <8Ed<@41pN:9vf(kv۾D[B/QHl*˴>1i(=ni*Bac:z4MԲyOBE@I!c 2HpWA_>H]-//ܝ6k&C(ͭª" e5.3m%&6m'^tʖjP=^zD@ XЀbXC]5ƻGCKݢeN ЉsVAlZBFSdYͿ>EgA[OD]~!Ɨ P3FC7'JIMSͷ- ^gm\JLIcCͲӰh/ k[efϟ .X5ce_NH>x?*Ǩ2J2$m,lɟU^⑸9~OGPO>؎_c~/ zem 1) 6/hzi,z`Ggg.PKaƧyj*{Mn|zP;SvLU(jVW͞MGw̫^3'O^@{'S,h4 nwuAsȜU QJB]sqXr) hE'}C=yp(|u$۾"v[(6 ?n> ux;S!}?dD*FЦ*d*W! +g;Be6Nχn\xL3Es>jp^8T9tb f@"]v]m1{\=͊jq7"]KZn^)K~gŴ]KZe?)B#' \~\}V~ ;CqI[ t'dzșkrvF] ;7x08ez uҰ[pJZD`=r1T|=,Ժi ^*\\zBC͘g$}ɉ/]IނnL73 ZNw4諯ӝk&*)bh/_}ԝZտT" *z7(KGmş;kg'd|~o`dj,N$2xӹ{<݌Kx.<~1bBĬ&4Ɖo~;QzU;pHP' 6o+,d!XI0~VuI{+m|g8$9:]̢Q(ys Mj/U-¯g46{9[8GƗNވ3& BjNDD.t>y㻦nCk/Cnۀĵ:R::[TcsV*7GRuvWgu~&|wCC&>H V13_L2&Hca0 B "Ha4v3tu 5j^XtgjC7((޾Ot]Nqް" px\ x{4 s|'8.9Z/qtuQVosq4g֠A6{{ۛd\~؅ =Ns#jwC7 vT3=tWwdz~[EU3ĎU35Tڣ{(UŇ"=R}<}_׹sϽ"E;aB$Eu/CR/N;x_`Yv/6cNDPɰ981).QAf00 ¡硈FK>_9S'b(1d XüJ8ք9VQ<"pD^?!GV_^@@`Gy]mUVz+;Wsc>N#l<`8JU;zQ?Ib(s^l\=feVtw]y=ӭl6ݿm4Ю`Z6e*>u$P AX'wm׸jtoJ\|!JR8/DntMHtSFRKK$wPLHEzHJE2 PU=lH]>blPg}bӭ[}.Q ?[?è}) ]J+ho 54+~}80"3oS@r]gE*K˷i5{CڡH -z6']Qvsu= gy:S?F(/'@4}607MUfa4>/jTnG_ ^KN^sb@n,T8⣭\B9648)k,նVֳV<(ļIGo 7 ?f ֍wKl!@l\ELWGk~q<9߁7>S!`qf Sy.$㽣hK%%i\#={F{^uM]c-09xg^͇R'@|Eo(aljpesB/C/9KY&O]/osNCf`p=&!ƣZN#iYJ+}l TV( u,Ꮿ>*Em,xU6 s=AdzUU3LS<1~[8əDw"K-j`Yp2^U|S|s"NPH0">}.o$tYPTb~(rZUpowɈRtpKflnюyY!GϿIBtjR(g3pKΈkS)US#O]|.y$= jS0z{dfڈ ApM|9F~f x]-6rڌZ]V1x-6Qx@^vK:rcmX$__SLi𤶱66nrPpsHm=>YOܢ%|cr(~ !zC~W.>=H)RD*2ԁx~kG0*B4/8{[z .8G]p]frurRH ˍM0+κan,w-FـEQM.َB m~:ΎZ<qހiw_UJ_} "I(T0 ɋrb5\u;?9azie"UGb 0!-I~# Q`"QMLHKCpMw*a=7{.j`u)}LJ4HNBsϱ}1ETva"=hgU {:{_ingڐYuCr k=IYn`ߨY5U7Mɀ]t B % Uxt,D'^%OmDؗ@W4<+ˀ!a__#ƊҼEψRPV 1{*ߗL*3Ʋ7{nYZ3oXS;%ȡ#'R4xk {B&?-^RbʭmyH] lb%R#tLr6gxb '!u,y4jwȮ η&AsI"_Hu4o>P O w2cRu4![>j>q3.A#72JNf:ۿfqy .O,@{p(ej3 W\D4֌_1=TQgI:~/wj?WچK_7WlӐ3sG޲7_!O1'a8i0בz8t:&ɀk%<ֵ%j8x$A)&),/ 34z]$Qlf_F; YÍ}X_.:+{e:C`|JcRFBp03\Ϣ^]/y4;Uٰ419≛؍M?xvkgG؏Y4T*Wk$/X z "hOz efZMτz&GiGYG "PIG72uyvr45zрP*#5 GRr:!zHrʺyaT8~5M\yuB!hGa r:*ık2 `)qԆK&š1|ڐ?L.o"(cEh~dᓅgb99[R`eA7urcE~1 eTp߳~.5(e:_V̹e;D*;Z3r:%u%iw*9"#'PktBޅh0 H^\u ő0dȦ93yZ\Ak@yk0wr5: lΔZq}NHD-X)$pz=2C)t ]i3ے [|@L-Rm (R>b~G@K,7؀~f CzکhtC8 |_9].z(K}*M]ێL:9lkF"_ s;vʞwƲ| 4a??ūp xWn'db6VRB1hG=2T[Koߢb\T04Kk4*՜\2# K=/ڱ=^ߘ^`! Ir%13}8tah=1a0aYe{ >c/ʻ*YS}3+K % KV )$ȟY;Jú Uh,,,Pq@wHHSG)Ez0XnN S6 5ߢ<<1^2CBA Ѻ]%SvX_Á5SŔ&j D~=AN=,W$5H=K\Ҍh@r,YnT>=2GFP~;ԏ 犩 : k}X4pv6㼪cy޵R@ 4f|m f GC;x9WL'{ 7m)9a,Q}Rp=~! XJu~S% OyǿCQbݢ9 sj ɽFI1ⵘóL[0Txj5TqR>X*}T F/INI1R:YBNFҶ==#ZS>]#h x-$2tp*`9YkX#]YO^ń[awez? z37p`mqUgZ7PBVhIp-$;O0& \sR&m .+1U(:7&5zҤMUpR9X-Τ1. ׺ply:\{~)1fϦHX&y]"~51I܋<,;V sP*܉jr9)_7@pUC&x58r h{q5.-AՅ;4< .*GiW =,Ii |QWRQKxXnFeS_H/cr( )vN{aMՔrD49b  PKfRj]n-$*iB61_7 \SܑE.\VmM^p݀Os[W#A9?c*U>n`'.wnC%erkem@(/va.j8ugC+&Y(f]_pwrlC8+eU6UU pG+,׍7ʢ7L<ơY%Qcp>;8;c̩^Db&w%KQ 6:V 1 :no󚂟>\8_4=E[}ջPsV`;`rmX$`d: 2 k-GkZdAۦ.v4p6Yvl$㚜UYNerCEg,e:-K wZ7syS) EuFqb\M;WG8 )YT X|_YIZ ob)C?22Y>P?&T6GQ*g _V~oRLu*Ұ`*}TH>hS[G}suIrPg6tWVoe/*p Ks~wfscpYqUhpH:D9=ׅ욯#mJ'*խ\ U/Hs1ptA׺u[ZMsAMlң[0ĂNl*FAdlShr|q6ƅ7BfwQf* ӏ zEt0Z].tlJʶ!M_8\›g[VE7]a>dZJv߻vA ?>˵RI Rei *w'Vnr _SnKYqZ-o9,2M.F޶ -5k$-e뜞F8ZO_wIQsj-G )K;ƣXX&q6*zRsh+-.2l!m(a]Ʀ1*D;ޥỀ20aɖT&fo'l|JukB^&zQg:1sC[6limb<#%?z8ZW] Ue505eȥ{D6K .4#67 IG}L0la߁25{BȭjoF9s-\ b6˭|7#SչVb_B,="j߷Blۼp }~n /+4CN+ݎOϬ}0k4*;^:^=DV z5uR>z{6$c= ڧPv3=Sɯ,Ŀ8Z\`~5t=o" H'}>V14DEsCjvws+W?)gv0~HcZe=4fѡi4 _f>A(%{'7׼ȩInj7-qqw?yYр" @O6~\slR71Ѓ w8_;Bw@s{4EVHq|EȔSތ=i; "!r͓jgsi3Yhd Rt{ӂgxp&3RD 2H.|\3?ㆢfm^BX`kG+ĬF]ٱe[ۋC՚_+J7%&Rհ6އ![ } G4!u{ 113= X 62/۟L4kXoA~^85S7~Vri"2/NҚ,19d.pdtQ";D"Yw߭aeӟ*HözCxIS󈶯$ Im6'eF{̴ǯsE3QG:ҋUH$A lPH zXZnDM#(zt#<4H_rB՚$|g#ŸXe8=/l_罴UmɧBGwe8$)VIFLl}1}kqr? ͉dbXGrFНB4Zt# #ߨ"!ث"|E!T hd\|pcX1QV9Cm)zF Qr%G,v b~mn Q훽*Nt u4j[pB ;y>OjXo) +<.`^Z ߙDz=P,rg~ˮj(C^im i[* r>.sRBnRw9I+BG[9!DJPK2rwe<|%&DÓP7>1Hn]9/*!E, 4iǁX !Wg돷 ڄШfRm`oPZ4y8nN83@yƑ^=Z \[>DV/MJgss{׽J$[X+@VK<&aY2>;['YEn$&ouOvQ6qEHIܐPEV}jvU#"?TMv/o疖q#Av:ĺ,K7l&Nrx!u;mD6<~~xΏz\Q"I:&)8S zin-ZYY}ϣSGFzg=x)n9xˬ|Ltl0 `Q1l}J.`JS |dNp s당X,"ԓgRDy}Q]Wz{Aǎ~Ip ;<<' I J&kIaŲڝa,4{IMx6 }cBj%(̒ -" [t _<ɡQ+ۥwX0/_} 3&gi"*_Y6ccg q[k:gTcke.i~M8yq;{, ة%տȎ?Uq?x=a˔?F6HyI@\5>q t`ucd3e/LbQEvI"!.b#J01\/p`44ۗYMIRKh? cXK%>k64=>jVh J ,`*c%uT+:(A?ct bp I@1ֿa|ƝV'aEt>if0<)M#::=;-% )>ώ#  a^Azڎ`:C!tRJzZj,3h}8٠}̶ՋА HǞlc0}%\FEo. )<RJ#qRY"o\oIHtvv\I,t)*,6\ _#1^[ן?fk~hX]hZ^y)D$~~w4C9eл[y'FrDK󢲦)N>oΚ0gD+/~7[}VysUΕ+#B{{{|NY`)㎁Co\:Nֵozr kSUBPuH>P_::bT9b8n| &ˊ~F|9s}o]XT(2nDEy_4}\wjGs.2kO t?SvKa)O/+A_OG?DTeN߹l,4R6^1\juF#Daًyq*fיdixUP#h:'K#CuqJbS+d_L`H)u#R8}:XJJvBլm_'gO~Y [OWٌ7S }% 2N3e(،J"gślhߗ"qDgj .Y_a[MzUVW[A0Y],gZp7P2jO S=Ơ@IS<9յKN]Fukd~ixOnlyj9z;1677P䄲`bz`>ѽJyG{jlྫྷRgpǑ%'ĹF+}@95|oi>z'HS~aSI? Qw{S\ccc\\8NldH?E]㚏QQJJJl61a+1hH5( eIy0)<? ;a͍s_=[Ke9 FK̔̀+F a' As ^^Ěb+XO"""v8eR\nGG+.{T,߳iL߁bz[U:-Z patThaayWg*[|w}G4F=e{@8A*q$xܯEǡ1^ͳE:Z"]zjȚ 6Eԣ:SxB:ؒ@FPy$3^ ٨ee766 j gAL6kp1 ssd'~f|3|V͍mCOݶKlJJw SJLwPSf7I,\\N}s VcD( bE NNN C}SN?c|fBmW?(n$T%vAxs799T^>P^6:eؼsaϯBiwsi"kAZe恆~ЅBdkXCle/`^bK،EѦow&S*D<ה9lWA?O4]\Ut8-R<ē[D),VKKKbU}Oꤼy<AݼRn[j¯zsD*o-KgL;ݩBC:񹧽͡ى1Y%KKKeBkGFFꄶb Fc/TSw\WRMR* "Ah-N&l$Y-!mnGlC6obO>b\[dE[PBiB[[Q_zUNW ޓ酉'ƭzDMU ^Z)UY~`>uqjbhh%֋M؎Enqa\uSSSr(&C<>L[ԤD@^:Ֆk Us(\Ⴕ-FTTԼ6OVnٷioRJeP'8ϼ;tb_omn?g6o* }&"zWrQzU^,l[9h]jx"0冥^x;lxeZ 鴽 >&ˊƷ QSl}@ Ck•.6^C=8Օb C*qxbrb)`;̫eZb#" I!QjPG"Jv/jatg@F*T5j9W)kA*eZuMM͕Ywl`)y} ȝ2(Ra>N6nKKqw.Jh8໺.!l>oRJ1MLNNzvYdG-GMVctk7i#rZzum Mu0o{ئڟx?DfHInP2b%{A,r29,WRf22WVځ2"k hfy/8VA>%ѨE? 9-Q>.=)oxLFvNO|Bӛ rsߜn{w'cGiLw79ļ;(X%:pڻC47=3= J&uyDDb,X_/1HN(Fbd˱h/4CpCRVJx6:_[B2hEdcPH_XLT{\5]>rUkvrq=u8uw;kaHslnhpO8#oFʐbuqd Ԏ4Ԫ' sss25^) yhTHB<<<;!&.&6Ȧ$gkhv PWs_'6#k%(qӮkRZ3cJ?Y xڏkF> JTiP/hZX@@Q;kz w3SRnfRnꤍ<՟ MJu+TIngkkkG M;m 8~ErM.^t z._/FDE89I ަԡKFMMM!xmib^i>tҭKg[4-ugtz/Y?FK(_.ڠw;lppuʉ73r\"`,; %gϟ1ؙtk"x"'!嬟nZ "3j< >!࿋,dp|9T;MZ7 vtiDB#/C yD˚Ӑ<|?U@68 _wursXcyJ\_?}=9&+D-'gA'"M󅛕5q57Q ZAWaF^gEY[ӰŘ:}X.3 t;,OCsMێNOgosTX1(slOHdvmj6~j3ŰvO2z$3svyx(KMi BzUy~*`u>*miYUښ$Fs?%m{ϥK'$$I2"B?:ywZ+3ZpW;{198gҰ̼gN?$* +hdDG>"]uϲ?;K`x(h5l 9a}oPu9?S'0 7AHyyym{4>QiO)qڊ?Pj: _+V9V3*ߜI5 6GLM)ձ^moG_^c*ʀfH|bbMew`6{*8y!I1W%!yW#:a2Q`N?7$ apʨ&Q eW"P5}|Q'$4533A1r,d RjNMg-i M5=pfM8;q 9ԐlP©Ae3տ8 bV`teL"ņhHZ^ 3c,C\'C⺥5tCVa+ 49|Iyd(<\ClJfoM[Qî2y@6}5xɓļY< Idf;WDm{Ri덡̤$A߯8&l~WBB41n{+)t49%Ku |\3f*Y !OqoI`O+GrHsNi"tƺPӉf٬dc7\,.6AU#' ,q@PA=6f/`c"5fvr[Dw:o}7ea\TA`8a{XB>,YPu ;)ˇ$'%`5*? I5g^70p.oU =N%>GDSԘ]hb] RIY sJ 7E3aH v5Gl(`lm }GVQPp0 U; ZF4,͈ Vʯyn[s)a?,!¯o6Gt7 mXbsuꚾl[Z򆮮.Beef~~s88|@FPD槤T@TU$zz\`QTF [pcɷDS?QLmƧuMM]o-W.3'X!OB ? Pex=Qk~6 Td#zQTgO)ETܨ~U}̻H8PorAgwmc5؝~լm (b&r@',=1G@*tч,8Io异ҬLќ2Q|sXO1.Y|eF·'}DZWz6a{gG9:40Sntaa-=nPz^ORYRMAQ"ps|7)7ҽn\DO˕@m;b=ȝEVd5`?!]7qâ5H_PZ45MgR}f6yW%%_)=) B P JfC86(mvlP-LAݱ'(!`eLY7:i W]@O3CTL# A"],֪WgaqpU+#BP7a&&„Mw ,XD}jإ; {u+1[FMQPQu$6'|j5ѷ)TH e@Mf*%ZwZTUE$(A^]] L%ЖM~g9z ;YN2) )~ksǧENxpe|* UPg+_a/d2[ \ڧP.djRtdb;:6Nz5Gt,J&GiHXqV%K5M oݒ[z CEWJn- N'+庱"#B¨F{Wޭ4ȻY% d.C7   BB/l+]!<ϦaVh]}[9>͎̟ȣL*lF7 Nhe]ӉG^VZ.[X| t*?|&Ohi5VR_ҟ6p?X$W]LQζNDm[(uPH=ɺ%qUӛtlmmDd(w֓r恵REveAIX8Y s ׷CM'37 Q ⣈ [k6onskl9wW_ Gߠyuiik|bAyYm)vEQ8 :T0Is%8ؓ5lYeESwy,Q=M}!}زEx]1r qU/עf;]p+!!mv34-mxblO_bVW_iY_@xKNT~Sv~ Jxt5Aˉ k6BUL; A 2T/8bcacuQ;r|2\kTgvǩ<ru Gg-K;B;e&k~LZuTo+b<ɽ)8*E'~?jy5= ~Qf~ gp/FjRY&YDkч'C,״Z οKY~/\j l ? ^xgxa*ym, ǣ/;9F=3{ܲ0j.Xř*(Gw♃z#Ua!#Ro[7Q;)FDHqh!"vϩLML [.\+H!nE.7Q/b1RنuZx~g^__T)η.,XI[5DEEW½iQEHNT|P߿E_K$l]Xq)I# Թjye#cx7vˉ@q^ZêVr}ns^5-UM pۉir#_`VrJ%U"aY߿yk\d).vr5Ѕ7q{4G#0ˬ<35&ې@ƥ; ͣGE}P/@v/h#RZS_9t~ki]?퉒 uj4t+lM׼H\[5 S0;ªQƁ9e9\tbcؒ~.O_Rp8` a]@Fhh:쉄.k0OfZ1sY[‹2 ]#3O~4UB}?Yeݡ/磆ʈ .*۰c֟0Bb+JUPQn @g5yY](Sr b6/_V ޵U )* q仢&i'٧%ɹѪXvC҆wfs?%Z=uD!hhӪ?^~MSbNc7Vۮ觉ߜ'0:2+Rk}H}Oǥ1Wa0Xp=Z{7P3 Ɂ?u)ub;z߬<_ xgUɻ]Rqp9})*D`MVs}:2+uaKqMvxJg{;.E?{iiLzj T [/t-`6vj@b&#!+qUdC_ [tJR`>T2scZ1!?Tc]?}̯YXlJ3t'SRVf{_ #@Bަ?HmPkL4t'wOT5A>B/Xj?qB BEs u?w%}di9qZs |ɺϻݡծW$< Y% I___2Y!Ӡ:Nt"٢qW 2ěe7_(1K4ZM1L=hd^=?z~*H 1nh/@Q$?+*-0Kvk~7ԥ.M㪍*P/ܑF NcZ$$f"TW'k ssL>E 7^djC)Zd+^hxL9rBô7j?;vU7-yT p]4?~T BOk--\$SA lv%{ ]L7C!!V&n}`alɦY_w]Uܗ 2{(UN#9stB~Hd0$㍍qf6T3NBa%GWOD1Lߥ΃$ekjt|K:p~:[& -FO}&8gH_͒|8ifJIdINB|WL" UW "`Q0Oˎsy\53`2)[64y`Bb^a'`oGdմ&1`zT&EQ};HE?MȳIN<( q/jjĂaUK9TCj`}Cbf%"n"=ryj9TC\C@ycB,kjB#k*I yR,j^%FT~m$9/̎cqJWF-\͑tS}kqt"IqO9ٯAd⮤HZPYd]Jݎ@?wRr6i)+m*+:1Լ-O|u(ྣ[`Dvr*1Uzz#XFC‰/:zquG͐?"zmy f|J$E>tH4zl-h5wl|/LC];Tia^+/aU-A?} xѨIfKP獈/ +NN'wCHc3ndw[٣.e5sV"̎JtcCOǩ%LYb-2Wᥱö03 *+P :Wrp] p8.2 Tԗb`8CVϵF)P7R 5O&DUʲWTlZ5Fq_/R²"oOQKO к0࡝4o Y 7.eNP.N<Jō%z 3L?g5+UXln#q ` yf 9+u(Xb&\S%?QEl봩 BoS? J8 KƔPw۷z~rwE |- a*7?ɦ/#)rk'{wתԸd4F1q"1C[l)!O:2PBcG隼vI)ڮYkLхaz[Nv$ FUL= 5LΠGGPM($U*Bet.nO)3dP2ۭEɎՃE#w׿>W橲DߔVFԶ ?xG>\RrwN"o @ @y֘*{5:)Αsn1Q"Ok<P(=NqҬDM=޴V;a2j(BpD@푶 0 \E-iIJ hyF[1.gϼ"ݘ/_WTk[)U%PUG~;(NAuDR^gYa1D~͚ MME{"j uN7lc"L?UtP[7]ɫ_ xkL k)X* xSt8*Tc^]735KGPp|h ^G'"2g Ƈ_:^"]&%u9'դt}BfR]0(p\eJE :WGy$~_U G "5eM1rʁүH#mUkHΐeY^0+: 1|d_sKHaOOOEH +t kscC&PYKb&\%~te+uI1caVbgtQ*[V]1V@7}8agmsbUZzy6z b,Қ!@G$C\f-LLA1-OמհJĹ/ۘ>IBo~Ᶎ/@ g\,; ̬-d*'reҧPQaYw |5s󟂩͜.݉u%A&3_\tBKBWdP۷s`m6>R4C+$!zr2R YcPGq\4nsV*+Yy58ڨyz6Lr%<fϟ?)Svz .RclTY:N}f)pn$~/X^،IX :Bh{irh}hг辠'%xh".!Vc_o"#1@*LYګd4:D]!`~kݞP~N 81oemT[OGap}nyerYÛ>IT!SѲSR3G1Sh(~qv}PL-+A:ܚvJ йTe"|A(ɦ]m?ZJ.0W6M]L~)"ljb#u!& դv) ym ,s:74>z%훒%!uf&F'IpqxQ '~_FVBI R!1ZDDDR7_j@&E酆ua?Q@37@ 02Oپ7()[Iut߇yh`[x?zf.\$UAj$aFi Wa #@h;L9Lha&a"glJ֕ (#'m8]>aKՉIt L<|{#X n F}pwݓ¾{{ Lю󱂴b(?vjJAP OM8|+s/lW0=sW4@O~ St?M6e0yӺSq.yWWAmOwFbV~V1 ^ڍ~VR0%-ܦPtVZ( EC\(pv) i[)=cX߯ܛVh ֈo:3b".mH<]P!<㓸)XFvHRxcZJy.\ ejq4Hb6-B}͙Ul$5#uF * Z(& OHWx0 }Ǩ:?,z5[懘q5,62cG [)01̥= a/pM7%vPG%my3V|'ӡiib=aiHJ𩮳0p n(M(E pAF=!F{RdYa5rsVN^F :`IPݤP˿dVZ3XuVC&f9 ?eTZ>HJwtJw4HHwt4JJ#Ң4! H HA}ޟYk>̚Yksv{wlxTh%PA+xC*/K,ClJ\,l8fpg_F~b%\ zUwۚwS !kwh+FмC0C՜l'xut%ZFқh2مfrl+ngoչG:Lw77Coԓw+a1- [iڼ!FB@4}FEfX;R{w(yWk &)w <=45DaNy?_.>j&Y)IB# {bIHbW~~G)jC'1CqyM㛘׷WSobntDN-\/n5rlv(=j_F57VZ7s+K6N`uwKh.2 8um=Yx{IUqjշ0V Ė^ǔGFgG.6,hxs OjѧrzV^'H!Umg>VxLhY@v5pp$rLۓkl8}249=tV1?5o;HQz9ϷNQl ç㧵nn2z.&ӽ e /~sfurunD荨ћApFm>$99TT`LZ(Ŵ Yrr#8`Z,s86Pۣ'IZٻ`S 08v*1w=]]^tO2$ʟ넇Sۮ>vswð_Eurd/PhZ͆5m}_K|:pJ7]^nB-3w~K3{9D_f`t\fdd$i!+hHEEchgR:5~Uxھ_O.Y:ss'O~~K:Noq9@ycX6-I'C'û ެyaޥLCb?Z4rhցy~/Imgi_ ИnGekDk~iG|`(3wb忣 ]Rl*`C ULNGX1(\wu3ac:487> sk6{1_L:C}uCxˠ`􆋇8X{"A꩛-#Z$/4Ct%8nJaoBosb K7z&15R^';TW?;A.{m/֛ m9΄^*<qiΑغ=i`lTL @ݦxe:U)Qo蛠m(DAʭm@wFI2dj͋s< cʬ…hN PbmOW&r\ Ĵ--]\9I4i/̄h!{z%2K3!j@?* RAz_ l 奸i_[ļkGj`̻xY ttr=L{*+ܷ&RgRkw#6X\|v]?y"/֮L_3Ělkr8ԟD+J _pC++0VrEicoEQܹEDs} o< >tW+k1Ol${XYsvw6!WR_Nf{>DdFޗ';gM ?RRd={Iv9noóUSM <>\+>pз`@zvei0HgZ5"yZfДs:(ef_ {I2ҁןiLf鋥|9tQDF6:qTQT:7*2SP)"݈Z~Ce2&OG#w?ӯ{PQcPӀӣ3C5UбZ{qz:==<=,>&Ŗy4a8j@*?k3< z! u3}LZ?:zC!,56/zE8}RRNf/*IZ"`~ λCdzzsV 4ח@"bQ HrtH9rI!Vlh0AA!lra~~WG?礂Pj 1HvPv5dcV)qs@j?Aɜ 噹LJc167ok[܏Ӧ?X_;65E?t*]υg,Bk߾=#LK5q?>d|c?l4RJ0'eZ`h3$s/2 _#ʎ(|g3BzA .>/^ཡ+x.b5@ls@pL_3.Vu9(p}A!:఑_}h#z5 WZW6cYеh _3ՌLJm}:hG x?#,jH('ߎGS靎)FhxB$eFi?ꧮwM(# k}0UfmWN4:'p 5OPy3hjJM,'|ui&q.DՖWPؠ]WaTEtCzv@jfnqɡTys3/&mHs83YE|-5Ql"!64]B 2v5%E杉4" Ye t"x%EGLr|7TN< yFIİ(*7b4 ^{ӷj6u%T]TmW-w &#)yy ;豯]3󍝅GD>%y6_Hcn.A*P!Gr(*}'?i}R3?6hK qMY-% $ IFFNJFX%!F [Q41܃/\@ RއUH0QN+/8(3c:D(75rSr#|S%vъfl?gZ:RUWߤqHˡvG!${ȀBՠʱ,N`Sm&v1zQ ]h1@j\\y Y~k`b1!ɤߐACxr&ANLP%i#8YWln`G:QsDgzR7ZSXWU8dɶW)s0湌W-o"R֡BACnB}N73vF)fZbqh3li9~{E ,~2O, fc%u<.p l-<:]qp dt&b"~f֟4mg/TK>*R!P-I-SR"*ѧc+:H3O "WyfY|[lT%p2vOJ!܎dt*S _`>Qn+8`'0ry`c8JJj;7Bi:"bVLzr0&չKЇ#^(A?N{R֘޵-rLb"7$$!:7Ty$Ђ:0mJ@xN>%g*=֚LhS2IQg?*菥Xbe0$eͨ]] >E}θqnT"v5:ȡ!TPᇕJkJ #ƌLD<iH}}W:6BQvl{IȯUG0g/SX)E<ԄM-- u0Tt {֎:gcYeߟ'.Dk0c!ˮE2bBSxoYry@%-gJy|/1֦6Os e.]x3e#M;0f])=qF$vT'dui8`/:yf4|-X n;0FtKW2H iSϕOY6z!tּ!%2yv{je춷hn#ei_$cm Cmn?W= p,hZ殴7x՝o\'(tJ[Y4rԗ3^M<`SUŐpe_ JLRz1CF9\-(6:IY x倠WEZ V<:s,9HC-{Dj$kbLYAH R:ta,C6,/ڊnƟ5+V?{8 @鷀Pd)%rN'Z6*"Wٜ kV:?.̽ 4a111nzھ%,lY獊!?'G ⩘ 2}+~h k44[htB_}ҟGma\)QS/ V}N,.5JԈyЁ^}nJ$[)Ees p3J˿" Y m)pF'9ą1e< O~w]ԟc74 >E AiX%zH$ 9 dKlXk03؃%E8?IB֐ӈ&xm`&dk~QYj@krՔM~-n\+֖Fy6YDpCK),{'sANn(!(H}5}ǮK^?|^[X&!@Z1ezBƵA AX?nRyڶ1u矝߯JπJY ?ʖrs!y_ԉ]l%''."C"v;=KF_커F3oIZ~=X@/}*b$h+>~rdk7Qݐ3v96O9'<3>#***&@-p/8@l~R5崮z絖*%OO9*L`<>lk܁Y?`~Z.3(ux1b e@$;!|/@z}f)!VʙWk}/b|~гʼ{qBEx42Қm DZ9Bt%)d sA5?Y-3###55p ܄Dp40)E6GsZ|OoNMooO=_lςM#'ed{{;5 "! @ -szz{69n4Teuy`#@B Ā@;bIz=킿 NĒ3`ɾ2O| %%=ra'fHGHkP` `zAƄ/]=zt@vq{^sS^܌Hxhrf[n@lD|K%YD-b߿-seKy:|xh%م尴ب6oZ[r$:HOw{l)C-Oy'אSL!XQLhۍж`cQQq?0;WVBθEլKf8L29VjDOpI@;ÈS+*$$%p$%),rx3|?wJTn3hPQ~5L# 7@6+$M}Zx6IhJ ƈt K#FVTs*(^c|uh|8h۾+%D\toӀF 6̌m_6lĐ. uȖk|ЏҜMdõ[\.!{_!e"")~`D󜛺2%T>z2bR(|p˃j`$wKh< ߒOXAW\@/殧ԫ]J21%ՇVe"Vꈘv$,{LAŖs N8}Dk`e&fhEU)XƂqRZq fr,#/".NW;=TV DVzdFcF"jP /'̶a7Tφ+E ݽ6vv[Z'W'!/UHI t\^܋n@h!MrZv:cn(EҚD,iȬ9Ǡg-QG bj}"•A1C6M! b{syf8x6^*@og&H.eǿ;D=:3L殌{?#i?*ݩ\J/+CjC(;Ei}U`Z;s Jp,z3}Y# -/"Z8~е'$a.fGDꃉ( ؀NX+?&eU28+999Rx̠A &,d"#faTfh;g{|N'녙&r·nLZO?ֱ_m rhYPp]`_"-|C=u쟭s1Dz~Nyk13C 0U\0mnvv^(HJhc<j߷"kt-1#PI }uԈ8"#Gf``Omcmg82:}% :&.ZЊ4W2u%ByJpy8Qutfl)=C9|Qib_*I4{saYM#ϥR뿅sObOh7{vƘnX:7ΰN_ 1PJ%,u;CL>n7,ۄNn-irȸ'gl9kTOKGm#"1 atU%8b/d!&YdW*j̾;/A>"kER-U|ߐqᱝ ت%jd⌇Mt+%?zU5`s/y 㕅}uQg2v_"^MG%}9OW!  A洩WPj'# ŏY(yTHG h<>, GN+Dz@7GWU/cFvyL~UBZs~FD*3n.ѧg \/uG"ở [ 92 ^)I>'(2OiC` b "Wwf\ >-L{CnDF[?BXE ; A2 SS hSw9:"8ᜊ;J516V blQ*T&qegt ?T}әfk55==rRH Zfj`vߍ.0o:gc2`qܡ&Ԟ-)rZǐr\ײ1PQeD :^B3W{9 j/UdG d ԝyWR~W2ȐT80 /?n=#̫Fu5GrH1~v$Sy%i>io%7eP*,"[Nm"òi6zWXd0vyaYLџDS2Ra#qhf|=RUb\!;rWD(f!YĎ&ܪAV~r\) af\3QM5V+ŏĜMEk~vAN/E5]BRJLrqܴ[X'=|.B \90ei6gW] #~b`m# ߜx*ZlJkLЪn"r#Œ!td')S/ܬ[֐`;O Qz*/ISRiL#GiZ$ w\0Hx5L0'!roּ KB1zDɭ(-3yn"Jfx'8ňzǜ+2\8m`fDkncg 0X.y2 kơ@f@FWMiBT_Xah,l8 -2n\xBR[ELwH*x{v8b *yo kvLz fC\MduVV`z2LLAЄKu {-Kh_ -=UNoGv2(Bx׶;DkNbK6gcԛI), zUF7GS㾅IiZY~+rQc t/KB oϠTo>.Ws7 -umLEtDtr<{o5(Y+bv *g&lC/TnKZM+l#C /r2 E"W+&BM@t@ƁcEPX3(nV`^ %9RS^+A"8p=-0 #)(AeQZQkum|VI_Qx~0(u NqSt袜딱R2i+pU),)$p&,5;JfAkgGD8$NSmj,,%[5s(>z&01MyPr#\OGf 2iڅRTu'Z@g) ׷DguHjċf.2TyB-\'j~da`:`2&QDžG"54\;n װɫγUP6"$gڴx^bjaF_/\~=j$V2I-H&Q˘?,?AS^dˏ%DOMlnܮhe;.1^Щ|\Q2ZK=p!*4Պ!u@j*g0􈣯I vdp+qL{D;gUt#*ֵ4jSĂ7X[Pb_Sb פsHW(Udmr|GmPMeƳZ]& W+\# v]+ .%9QzGuRV Q1̔tazpwCx!"?}hGGx]iЉOoxז,T ̽*'seR@.H˺:Xp-ܔ yVi͑˱NW (Bj=\ Jau9%O7Q^|O1>6*~$RpX$`fxs%$EXWvU~u_b „Y*j IR /#c\WjpNagD{㜠 NT'd!A\KnQDoāNH6w?%0 hRɌ`˚ fxZQ4-4 d74J|O;?hyۗN^b!f4FQ΍VM *u-bj0bO b1 ޣ9SFtMճCi[WحH3[}' O(NхjFpneih6a_Ӻs-'>q$ 9`ʏS zrk5~ug_nYּ5/ޅКI%oåqgJ$sVTZ@v/:x<{~w|^2I0Y/!PJ`~LL[/EF FU<+)Bv3<9Y|J8WÙ2D)@o}!uQ pq3׹`{f WDhEBN{*=G&!xNXkRS{*hO1.)6]r#PBw#]Ge]M% "٦6s@Qui]]ayxv^#uBCKNߴx K 4*;1ů ":T1 -|苼u"J$c98>_o*_IJj ɳļs*](/^7=:@Q҆ * }ҐU{'%) Zq $7y'4zq>Ilq0dκy 1~U89[[LʂlQp~4Tq{ȸ+$L= (5Ōr BrF$_&WO.3gnА#ېG r Ae- ?ZAח%sB \lB }pZBcdNsNjnvbvT SӰ NH "EOz̰ߠw]SHh4r?tJזMsǔA}N8( )띭Ƅ(ZVkJs˞i>:8엞pЍ3"ug+H1ց4$x!bŶc>+bg4=7Xf+BMG$L>zRwr#IV[@qm[{WOJBc~.՝FE< &1ʦW[pYn Fx* ],"1D¢pkj ؓ-xH pGG2 k_vvv]g؍A0'C(^C`!M<| h؞*3PIhM5X,ttrAqeam=p@nq2ͻܷHԋ{M9m"+4/q c_ #1bMuztw-)b~PEq6ջS M=FrHq yLGQҚBM1diJ,$#(+rG|1Ž7wp~w2^F>0e xLs <"=wGDاncw_igݱ wAsv(_LUut<'h; ]_q/ ̂zf+>y ЁǾ}Xca#BNA8OԦD:%bSEGEܽprzdOiNKq,T!kh<~*]ᖹMC9S qh {|\]KcKp 8jhPIUż3'6dl5Id8s?m?"^o܌֖qv伳@vecN¸>O=$]Ai!@#4;"kScwikDH:$8k8yD#0oD3Kʤ󷎕C" 3 : WO o7[1Q=3gvK lMPʆ\ːHu1+1!r+(nߓ+[^#Ը']w~{SMT`XUTI%7LҬ!oKƄ'F!0 ϝ5 0ns2wRa?x}ү|Є4z#?SKF60Xǻ c~ !5dE@ /%)drhqVC?Cdq8C~愔AZ jJt; [(E9q"'αTy-Mƿ#S&Czs&H1fJҥCWx݀ݑCד`+j]e ƜҤ3h y_fɁZA"WUH|^J xyV%7R!ǟQω +h"֘" 6a"uFƊw`ϰY(_G"@'KvZX+Uy&nyýI_a&\vaZf>4QSһ Gl.stI'Q9+zS0ꅩµ*+-Go_o{?nrS;?-|dl"A,Y{8ա]>%뱼}>%ZzRj)5|I%13s=Ax!&戕\3riziX^$'+&R$~xjӴ%&]ҽ|EjKvֵY>`7G+ ,3c`^A$'BbLЌ* -OHFfWy543U: 1,+`Lf)CW$/8g1r\wk?qQ-|K 8~s;p)jB )ka)Q;ӝ@dbrRHENO/#S[>ik-D1Dce)WM( <xI 2<DJt kaqj/1kb@J i0"p;7=o,3-;"Al] <}PBMU`O,/Ql? oS>֦ylj5x6N2IgwE\v%ZBr%=5 %f€4l}::RROQ"FBŠ}Yै^"$ʩ 6tU99`z`cw*h*ƕ-i'ƵU;}UTY.孧#;yQ"CC~Ⰺ =?Lh^  I_Bb^HbѪ1q/aZ\⁧4Ҷ1nZE{SZͧiG\޴|/dFPߊ&].*/sBȀI`Se3]Qc3b;.!sJƭ̒#n8OYiH,&UPygf9Jc'KcFOe/pqE]tZԠ$bx&Ƨy{:BB{4B0pAt;Xﯕc:Qnh8D cN={?soYI(c))9~!i? f/և.]DxEa9*sEф5~`gkƳrt* mx28qlq"4CbRP&/)T_p؞FO&ෆKzp bnCI N@MZՑSW6zk\߯ IC~f&xJ?]$KŨKb3~>rdzHBƦMmc$m E4I:LE@n1k21MO0㑡3,vvv6q{H%"z% 8 sb'.'re" ax*` [:pVoH]%6ҙkl2{Q8KWolkWjq wϟ',qympfD3TċiVf`^khC(ˆc@^zIQ,Cd^|8pJ_ Z܀,mi4~ z{+=FOU tOABPys?RSߧeTuR[m-+Bu-z%ơ8+xy}ي+1@,)\fGw:*JÃ6)o7H9 A ,b#y2pM %h ?FFMD,gkp)$N! z]8^m`=~b>IDe&Q2j06?u=Ӧ6 bagIv:ubZ&faq eos8VC-Oxɀӭ>&Cu WqpЌC*\8'bNIh=^{$3E)Ǵ:f9䎗 q U{F  tOs"/,+;j`?jdž?ʄCs)9k13^u^·1Q5ﮘ #fs$aVCyB =ǀ;O.xXᬸ ZRFe3{3iT{PceDV;u!e=Dd= ec#,yDI9PJ@#4/'p((WVK6E᧨VSܩ3KYWѹBoJIV;='.JkC#=Bе?}aڈ&e6tg%rB&:LsQ)6A5~O9$]"l3~ ̤Y8j`j{#[(*;:աjLx |.W IDNJm/oZea C#EqbpG洤GŬg81ey]^:v. =RWDs#CrTh1^Y< 7Bwjʓ-_]Uf.V^X6uu :uXX I Ne;ƲF5KIC{'M,aU5,4A2~y)+ׯQ\E))}+&O I5ۢ*-'<;]4<hDy[fP`XFRxIt jG0^L4Iׯ~-=݀M7j`Ggr jnбtd{:GURքƴ_:Hԭ<'[7xZXCӣ# H{aE=&%wGaJ);& *w\Z'g1O}Œ4")6*V$ࢂ-fOW?uN MPKxϟPKy.F0angular-1.3.9/docs/img/tutorial/tutorial_05.pptxUpdɒ-bf3333cR,J*=usi3w ˈin+r p$ =mb XKIWQڊ;(0E[`B}T!~b` _/j<I&YBX!ɖ\׫ 3n8 F`,.(s:ҘE 4Gum/xI(W+Bu~]މr vRw$]ڰ^H/юpoX%v1NVPT80!2~UB(nhȉ1lx81|ۍJp'nμfe\]rujIe_F98i|Tځ=I5V)BEpjyв1 tP0mAuXT\#`NItN![GF48"kowN0,h~JHl2rn1P;%=%q(8fPxRj< 4]!Jz*͊f)1 ]Cj/;M\eT_Pq Ӣhĵ XF(%Hh.P38c̜voDsOy-/K wW7d\nqdx10*o#GH t\cIkx4?G 3<h g|vvNVFƎПo8S X>Ġ® Qlߞu +ߞnY_3snõ@ϼjv}m 8 Z8M 2ʻڂEݖqc̄R0F*yrP1*c^9PcvaЕ5ƹuRY<2;v8t([@l}9;~r }'s['}Ҋw_R pxh3_fՎHVn#^inyZrdȤYů5r,IL gE 㶺( lbpiv0 Lq¶"%]'O~U|~!M݈e&1TNJiΎLnV-h$ˢ_RM"ЫM~c0+Aj&'$ThlIW+\3 NՑZ"kg8vs=#9;[[FZwQ'EE?zynp }QQcga K+ux<QE&ȽV/7?N|VQ9v|Î^\CE9"鵘Tu]hf24\7$/M6H SѕJxoJ} 5mr%u¤iw7{d)ȉy,e֮}K w+:-DBiO"R̓RC\Amv/Ƀ;ޝ*qWr Ou^y\QDPfX/MlPe.otb58' Mp ˜~w&5OZ"텇K]cΤ _M/OiP);YhedEdX;ю\אOHpS,2o<* oJrU((A!\e}Ve%zdX˄7V&Oq N'K3s?oƄ~:?z0@!?\Kq}J~Y5Hr tcŰB_mGIx@TinGM@05u:x1\!6 gYCWlm~8R%P9R'*ii: PRwg$V,UgcNRU:3/i'T8O0 1V/HX"&H:aDm2fͪ-5Q`SQCfL⺬1EM?O^KZ\VI@է'OjsMMٓ4a&uIK* IXe"  bSm֬:l) Ò`ϣT%RPa2 5ߔ!qMw郷WA؋Q-⩋` 3 pHQ)x?`zZz?ʽ;|9k1RqQWM&?:3p{/"fҝ-hs@nr䘱9:^F6!ZhA:8w8&;epq:49j"6Nwޡ2b_d#Jp6@Θjo-$}!6GAtBD7y/P|zէ)IVvN`` 7Yߘf8MFl9a#EiK̮242a{q2XbS= pBʂ^?K\.Y; ]z(97A%o;` q ^3I:EqY_V־ *\Fe3ܢ*^Fyۅ  ̳2lUd@/od8sj=FAIJGJ^ddv Ն@d0sHS̚7oy; lٰ[ֱ9G2HomKuÄnn Gw^4YH+| _0ӭIAf1j3"8S"jc6sOR (@@DBHZX)-0ʚ=m3!7 * 1`A 7X 'GFaУ1HąV7z5'O>_N2{QO5pW nt봢+!Gn9ΞqjH8u1Z_hUR:ϴG#'C8THWeA㸟۽~UFsDŽ7¼jUp0r:r$3/[ťt&Mz x7OҧmTx"h:C_#mE".2koP0%@>%HYis7tζtLPcSWXlc|>)-4HZO(ms3pj`%'D#Y-J2ւ,;~()K Hx1T| ctQ+ý5SGC|&[g)V4ū/* Y*R4"]\WgwIM|K3zZ|]: w7(P[4[+(k|B'4ZyX7k<y \ރogw8ہ 6ğ͑?!{Ho`? ßv`H;%XQ;:;'FɁM~T_[S 'X}bOdy>]hl)a)bz2"ޞ^1?!_ԤQma˵*~:0M97TuDF;OR^Ydf&qdj]FUD= .kIk[0z彧-[v:?nI*F"pL.Xȯ![Y;Ӥd#TNM??dgϓa#o],tdR֭"r bDF F)D(_ڂQh H&XuA)̠s^πbJGHLaz!5f0qGE v`t1KM ]p=m- IQxj "9v@^ _Y'k\W_V-mHVl`\G'lٴJ_3-a11x)~O1w~ݱU2X> TAja,b0Scͥqw@u]%Y:@K괨\S:z plRjQ` A E-,F bVb?~/(X(U(.L &`͌jܦ 87% %z0/!Ԣ=+ z_<|] u biX"xdهvߐ)wv`!ʂW/ Z I4P [ހ7}Bxкyx-"oPeP \3re$y5'ڛCq/L{ ڽܝi&eE' [&VĈwy"ٻA\Tz9f@SB:t΄/?xa ٦s,0R{j猌1~.NZˠV7;})Ʉ%V85U#-񶨣9Up&\9t,qts2@]*3v]w۷b wYu!OީyŷCe0u ,Wh>8'S-Gj>e)*մmPs?5j KRA]%Tȧ{%ߵ֧OWP甠 9r<ηVJ Мi5TK2{q##{[9= QwLA#h1tܶALD!Ĕ =Or^椔cȘ~JN5 B9j5|arHޒv,EKv¥+4˻NE? /<%*6SS RDK8j{84SDjt(GPM)QSL${Bmؒn$J>] -EhD➗CKn3I9Ai]E5 c0Ÿ ܹv6 ϯ, LFk0LPAӆ]gWM/SM9$axGNS,/I d "'eEO+L 9RI$+Oܴg?KA֐_2ؘCRKLA-Q*<:*okɘ[CLP[_ 6d_E u؄[D8tya> J s E(0r"5pʿlDuT̽+]B8lw&V fqȄ:،oli38$~9^Upn!T$9JI٦]޿lZ5Lh_w{Pb-?hڗ4 _DlH4:aOF=UW845a s{3,u-!VMgkn><?c?4RRTY5|օ2))&'. N)kd%M4C_g_=-SLh۬!zjNGHD֢'q4+rK%+6&ҟk+a 3(3N8=$J6f8l#1o۔ '8{?>ʝMUAxJ ߾ɥ|BQEUyCrJE{cŪnv}͜7*6&9*6)gU>3k|Bb6I$گKRbJ'`bwu _[DB& ?v_jѵ4:$ yXȶ'l<,m&ƓI& kyI#`>%U=-#Xv&7ʐl~eACѬcMU!HbLքhQna?rRL' I.<)]pRFmlMu}[yxA?.DC~ 5W6b@ouQ*ݹZߋsy2yo ¶a3#kǸv=_/83:1{G wU7" 3%گo,̆9tkEUk[&WfHl25s^LY`1I?UHmT&RqSA\3-/8Coe"' ? }s݆zhc QV{r+\a4oc\AGy&\k)rμZu{JpۉPkx5N\3h@#w*i`nȡ?WʬT͛L,uTn:rp=횧((M+nV cqFm6ĩ9,HY{&k67oT`Ya^/$94&c\  ih)/赛咗阛TĤJW]ڀeT JcZV" ҍ/( R,aM4J@2\~?IG"4QYJ"nBhm2閯saK[Lښ;R I>)>,W>ivJHV1 {o8mtYCr1W9.Cܮ܏nr-QZ8*9M&5Jv;'$YlaNz$QQqRj9E Lgu? ?S 3{OߠfY? U0u1(WlP 0R՝U\) g斨>\̦!<ڃ)Vu}c|< Dم΂ uM.K7{1$;L\KJ?^2T=+C\TT 48"ΆDN#+mSƙLe4hPz9RM;jnq^IIl jJM|@'?щPc B7(SE)\K1Qi]\p w6l{Boǫ˘g֪uq?$GgWirE.aU~f!εb^"7Nml52Uƛ)Gڬ261-튤4l^ , =OɽP3՛A5MgsƊk:! z8|,PsLu|,{}7x8}QQ5I0qjiE8qpζvE l ~ˋc p]eIup7Q:sؖ dK,9]RCƙ" (% Oj(BYq^ \%EJcB/0+AIsZЬs[6ژV1)lJ>^^;b451?b B?>\(0} 8Vn$9D%brgED0)=LHGvFPkĽ% «R0æ`])M'ƎR@D}B{W㵁Q*Od XD>t" !.Oȸ|3GU0wSU='㨿5AsSmʕD'.; =(WE0J5ϙpX,n@qFf _ IrJgHZÈc>CYhӭajjt}R.jDu$~۳!M1M|/D$G"B]fNfEQb$Ur,[ qX!Aa.M Co-jR=1,' Rœ<:* s&<%8x2Z")VZd=;b MZtom nX>%Mo_A(GܠRz2^9R}\ڱp ێ6u%?k6 epQMF#'5 D|5됷ED3Uy,ݗߙ7Xx珖~,:ی˔R ޓ9 \wM _J}jz^ Pq\<{eg~$u rlo,>cB+hv}_8Tjg'>;o|`4if;|nR:tTa30V6+rRjDDxa۳$\FicmWyAٳ7-T:tb= "UeIQBRP[66k[3YNRS޼(EYӻm%iӂym˶s7E/crD`Y',*G ĥq*;_F직&L㰕>oRi{WuVƯ)4yޞ~Uta7|-lx F^n@>C*81s}vq0B91J,a ַ6b i`f|uPj*[=#."V^aشr(iLG 5 TJfB&U&=0jjxy+V$l3~GQGzj U<ݒt^ꡱhR3S}Çaʍj+P B5gwJ[v lΑ/okzNW$4"h.#ߏ1 ? _uyT-sFSPRp;؉1!Z#tI5{/fX :BOsɻF2Xcێ6[)"ѝ:3Tuje0e!J&қSӌS{}Ctڏc/`khTO"rp5%{E*)X\&SaJ3%wrrY7y+8{V~_2Nh}i1?U9&gm\c!k;S;X ѿJ\Fw>GLCsKׄl`<ˬ ƕ:tiװW}3!=E#ڭX|{ZM3TVHT4[u! t}>?ZOݪq,+2cӧo;dFѤ1ʌ< Jch3f. Iֈ0Q(tdj:?De|7.lOO<{5cps)$˪tЉ[ZM BO/ml <5p@w|xXT֤_) R~29G歜'"!# ]NY-dߗ7 寪C@O=5~(k4sةE/CK+d=$G]> MmveO(Xl.UA50B.ArfרH"qpi"A7kTm.'jxccFH㗥t+BP-GUM&A)ԣ5 {d .N5gTTG-T+ONpfAGTXbf qD @:SobWY7O7IɉFfM*4bsEe<"j\U49΁%%(]BpoEo >%EM_JƓ0`(Zc+>4Q]%lO=<&v驰|,hG!BR{6M Pd k1WEhhN155H1|0"!x~tTALF^tte=)yNM{s-9% x;a?4ʄ94%*Vp>9ζy15w'Zuy v9M:wA]0ڑF@̃E;̘iz\ŃJ<v6/%1./gT?-1.~|I?rnXW~eGѻVAt\ϣ3 s:sztؓ3,V\{:8:\mYT$'&םrH">,_ hՖ!` | Z%+3iVܡ9&zã}N\ߥ6#oa$Nkv&D6(n|K C^Cgq:fܖJIsPcRC83vi_g޿^p*531j cXޡs0[̙X)gifvadPW.Uc|T̕o+NBy |N4΂u%m*7 DG4uJm&F;10@7e4/&<+λN:rg\¾kѡc G kKBҺ-m,&ѭQy|< |C]/~fĜt{d0\W,~#>PU:kgom)4IhR!|jut%M/aڅgVՅ+vCޣo7'{FTšP̳ xmѧz,{ɜQym WqdK1gõՋ*Pj&I#~NlBK "<ܲ>8RrW̫UM>XcM [n)|< 3wʕwoBR3aQ`eO`l@^Y(jlS_/"16@`](\7oM& sm,6 STp4h')g.cnq1W%9Fռa2ܷP/վ*rQT׮%ޭhh_oL@rh"0s ۳>(`}+ a=u=c]!?&ɀ=voI,7v?wC,)Zdѷ2a6|1ֈ vyGR4 dE_D(5= yW.e6Z,膇f=}gN AǬefn݁6Y*oL ƂL9.ح+5^MAIejύ=34a~TI2β.8FCKrkCQm2ZXeI O-wElCqf,c;C}d̑e2>FaSc|*ᢔ*|!E%XbC@`[L0rˠFTΥ;U^E;Ay)>4YGaQ6m7"/2`^eIZkTeHpT#44 M7 20%yE ^@~pr]J+%@ΪriYyѩ|Ta&Bg̚PQl%Tz3;dݪ>Z54nhZ|TUβ ίiޔ@mI7Tf@zHG"RDXE R"" B"RB*&B4E B( EzQBHIp I8y{8nbs5Zsʹ\a˺cWu_q4Jύb{5d@֞ M4R0=a\w[ыOiW.ifY9r߹C?,k 0cە^̍g_͘\ള7Em\{!G>wfLU^A#i6};t3vixF^TU|P39 ԍSYu~ kK v{='8Dj +r;%M VE+#4+jPaiC"Y 9Y%buwJЄCOE >Su:~Q|8Lk1m_i #vaù~0eu?k[ UF3\ݳr?Ų_bu͋,;;yLyö( u7F;cKVvIFlC' m}}cz޷*f{=v-z )KV|B%]vhqD[; Wc'@G_qs8sܸd{%jы/U*0(_ќ}O||/RנWΉ/Zv|^5 <i;bPP⧗Ϡ+Z/V[{ڭV»  ^,)R- gD}tԱkl&f .˫B4į4~mҙהTd-_b#>1, O}I\:p?:ufGvں~Ԇw~54č[~Y݇uN%~Hxӻ/!Io j[LҔx >wiK_IqGF o֣Tc#/2?UiXɛT#|UV,'p1_2ye`4io덁 j+\+. f. E.+.H5 p`@1jki5^An~R6r8^[>Vϩگ7N 6{KyyVv |N׮Mt7j/G +UO92/TM1)TԆV _Ý%#C@UqZ$}*`J?5-[ؔ)X}p8|lm`SԦUBӲX=ImU݋q37twuyW>p1!{}ΌP/4 L]UvZ^S!󩩞䪺houpU7ׁkWyb;Et y-8'T_וY jN/;zM>B؛l(}%n3^-tlC @h'B>Ȧ~+(ƮO|u*i%b[77^p5S:^ƮEV7Xo7\_5Hvo<gw![{R/{%?[7xE\|C,.T{{e7{seOxn|\)bu\;~Q PO_v:A.L}=!!>W׬`[^}!...u7 ϧ㟛{9y:'-µVp_{?ރ|ƽ}\sW w~Ǵ=*v:qA uv'<㗐QTRVQU=o`x񒉩es {G'gW7~{Qq ̬ܼ'OKJ_TƦ7o[:)]=.~[Z^Ye^ǿKkyыk_$ظE:p-Wӱ.<.Sжc{/qBGi_S'S[ 78x"Q)Ig#e6Ry16rqtXG(6yrS}˙Y&>RF bBhu-;RA^Ŧԕo]bXPJȎ4. eI!AVQ݅MS{:[R|Kr):caAQη S>{%ًkk֕4_ :1ձ* S['V(\ZnyҰ% ^@"|]hRʑӚق=:r2tutB?_ ,oğ! XM˜$"gd ׶I{Q|9kh"6 \{0%G{ ^={N`ϷV$񶛺⿆0Gyٗ]Lfj hg_ gS~Tш#Wc:+7 7.Af \=Hbكm'AZ=ȟO_@?A FWF90N?Kf2?X"u4g !qr 82ɬ(*7,Ͻ9]=՛#M/uam4`kQ+?߫ !àը{g~;OnƯ{祅>BCx}Ujv5! !Ocԛ^tӷN]1)=[:ïRr5{IV!GAl#z_  _$S_S\,BkALd+|.y kp&|Y-E6Y hɄ\ FAdpp~0+qE%Gsog+xwM'#U*xp]oUK>SK:~ݥ\J v5nv]Qb*C"q(Ѻ`dDzcZmfy9t :қ] ;1wD"'}kt!x ΄QHI#7d79W ]1hMq2_%f4nya,ha Ӄie!kaEyLdj*7]FҜ2L ILeY4+_Yƪ3E&b]5Spf'Us&bYI\*U7uƦ֦LNŪr=,Z;YV50o,Rj6(O<\m˅s_<1&KP L VUЬ0 Ҩz(z'5~" Mᘢmw pәFfAy,dWAxٯkQﯽT%atǎi x"&Ha.(E;$j63TMa"9sϺ2"MzH'$ﰛc0 H e&ZŘ=F|X$EYBPaN6b6m\n~S1.F즌kuӵڞuNWBckS}!d?{[tGdbkDeUY7,zHgW 5.DR[lp Shk?~)=M+v2LicӠh5,_ީ~Jq,y&bko0O.IffRSH~__Bi")NMf[7)uGm=CN g|=v'UgiA_:_ )(ގtornE $>4~ϚVB-Ƌ]"acu &W%ⶡ9pl"V.4lLi3j$)X" etYRPgSZ/d$ڂ%H&bN>gjfbO\4x52u1`4u7q ﲎ۶~vD[[=[TX'jLj'bAG}g~3o ]^J ґQkM8D /g$rhF" ;kN{ du4ѡZvW ʌ2!L`@r# jRJ8RV:{?<#p"99đJ}5dR7˙3p)!,OxIcv] q:v򙁃umF_;"EXukEb.Iەvʓ:G;lhTuy5,4]Ai32A tqܪE#{+01m +=; zk6*7՜FAAp3ã拨v,RT * ʖU)XRT ~k4\TRrnuS-7RDLE?i1Dnٔ6;HgޤCv: $n(O mp%=q\ǧpTJh Zn]-+[|%wh~~R\ 3UNuVGe& ڄrfa:oh.Ԟ=HN,c S&s˧.-8Y&WnEeJ2fmؤvq8$$tH:~U%+%s79{$ĭ9&DNJaVQɓq:Ú32iJVϨN7^qHM_.{V߿_!+MB3?V_!@;b㫁5n+kф=#M#,A}A(?1\"n{!O6m0а @X,$* \&?Urӌg);/$04BՊLy(t:ͯ+R0!᫨nƏvuPOgjja0WW2jd|Jgz ,׬V۩j"? ~?Z}bk"D*?w{Z>$]/?w"a%g(ڄ<Z'#.  i",s(@uj4U]6[4b~ktVjvٗlQ'2ۓHnބnWǜg;y>tH̡B-f{>{q3K?w5ؤc$/f&LZ f, ;BLeQklgJ ~-)1ºc&`hYZHMqfsbahY;FEQhYLk&;yc49MtUJO&&XnUVXMV˱wpI~t#S.a<$V6dvB,AB3nO Rb‡vIzQo JW,7f>?3 dD{1?T'vk=iTiѤVc-`8nF=8Ac4yrM}o !LQusrF&vod Wb`ۅR#s97:DJaѢt^&xnY(`"t¤Гi?ǃdW'kO:T |Co*<0ڰ = ٠f[!tBZWG FY} NP䱉CBɹjE<$3b^+&ˣ}bm'')#97.ÿ9B7}eMf4)5k0n"2xѶZhhݦ3op Wg^yn6: K]Չv~7}; #?u_‰`G@y hX.9ϧD{{Z!LfTsq%0"hsɈV}zNxRA/>z="`e.Έo޴yx׻ݟޛs<fCX~?;ʺįԙ9t4HV:c$s\Jq򧙖,Gu3oB 557i7As} M#rtƝGje)yʷ'=b:1R`F?.bOjEo ~jˣMwWs6j۱d(р1"gvR_3ai5:"U񛮙>oyFnMFwl ̠e ]LrRbmhx3f4C~ATߓDqrk;۴ՑЇkrnQbK9Uh(Q!)Z6j DMkCͦ$ )𯰺7\ bSNw׀`R'V1a1WxH o =$S`8p&W ;ExPNLX|8\C7lY190VCs%AP8NoD+tS@PAM݅3*=/*#}zecJ-"Tmd 1TF8:ڌ[[mL=|2 tʏJ0<6BfAv97nj ~fy5I-Ƀy ٷUc-,/ ߵ$(^T ng)C)MpƒQ@BK4Mi,f~ 3}[:̙в2qrТX7 [yTRhbv/VDeeY$U eNu/?k窕OYđ4*@ -;=)(p3s$^? {%@g-]yYzQWBrص%Uvʳ_6E 9Ǹ98V6Ԙ8;vala L+;n9 KejE+:NKE=/IQ׾ZU LRҎłFes*k?~iQriS9 h9pʹcV>MbIYXodgHux+vy;^2aR3QKi<ԐFDBF^85 $d:Wf~'@8ipx8EBil1Ȟ\IG_!ōcξ mq% LK4>> ɤv9J%g6jXɉg@ծkeD$cΛ>7te\sșyER뛋O7s炲*<Z.|4&u^$utچ(R;hXLw=vg.Vu7ƕ-ؕ^ w/qwSLd̟>‚ֻ1]CPC.d8D{3fHHt樍c)g7y BRQpƸ/sL31Z0 WH*1z[U`xҮtt@KVg+Akkj/kw)idz3ͥ;ýv8^M.X6o˼SVrHٛ:cc6uVz&w~sߦ0,o>SNRJ=Vʑ!&6!DfHPg]rnGy4A;̆ܵ1oVvz޳MҥFdp,X Kz.DbWtȸr0n=]ȣWtz UX%yŸHGHPzJ'j HHa 8iwOkGd)~,ŻFNL5\d/pcGaӟmøkdVehSeH.i8oѸ)uzLۛ_ fzF#CRu |1ٌUp20 :Rt[κ~PbuunULQ8k{ۏ[]NLtxΆg- bS85~8&lgB+& a PK!`Ty1S&~^bucwYf B*o##?}3n24f~; Z;LÎ]KjRQ >Pg`X3Y f4_bAfn T/C\o<':k#b~=鑂׬'7#ejm{ERٙU N煙]fmW,%̛^u9X ŪOcNK/ pYdHTtshgDc|hD[u!9 ݦ렠 @Dd[zt7hf >W?tX]82̺V.Өȫi^V.nê/eL3 =/vFN V4mIMͷ[ [/D8"#g)d"(s$Yf@3nFhTyOtד:]uU&uKZ!r#܊B$32Дf#ӭ˳<<ۥ |?H\H_6f);x;s~ =1mR_ߔj,>}eK+BǒR+ -+?It>o"_R ޱD[ j'V]čQj,q|@Ρ1<]~3~@GVeBG"h7Zp4=J~̋!\3}=v3.&xFeML(C ~%vhrKǼp+=\6>9Bjt,׃FZɉF瞯DYQ}Fl_FĜo'tX@[IB{嶄ky爭0Ut*R3^geZTWyUz욹ԉk[ &t^2ZȫN(F;>tY^~k6Nfxs1‰ }kͿ1Cν8*VF gX |2,;b/>E&AnW4Ӑ"ˑW c% ^ tvÿHH'ǜ[ȘV) ;+] "{kɞ@&'Έ]`F&WqN\CG% 4IWg#(OѪb03lK"(Z^kbi\lɆU*r0qG$S.SB3scEhEHI#d̘ kM;1i,DGe䈳^*?l`${.@gu0dXn>E.M092#\5>FJnaQ'l} ]aNR&efVC i\\3:e91GR7g]EmvކĥF5V.ַ u`S^]o5|F&QW >sWtGr\gXxrׄ[y\=3sCbo;zRY[B3x5MD d!|EC኱)wRԧ5d}k;<S:rfBJ {/$N5)OXyά!38;j` n;{vAM8̺Fwwa,@J ~g)M!H2H=n){ C0`0ZԽ> "gv&lF/3aH ,Y%5fLZ ̹fkaA\U#G`AECSrԮDMݛr6&2LD8F,Evbp N2 مs&(U5{.Ŗ'7Y8,qvn@Khhϡf:eI8B3aŘ~aP;q G߃tdM 9tl\oc82ef"@?&[ :s;Cq L $=#`U֣fCy"}H t0(*@l% (bĄ&mw0~ǵhH7ޮ`_=-F= &䇇YQ.b6W^ԉi=+ 3PBCsZ/ n&擔W_k3b=]0n̈ņq_UV]0[á5 R\FZ5pM'i+nޖdװN6ѣ y5 [%PgvqC)f.ÒY'PeLd.J=2}d}\3/+dl~ lֹ Vds2h1c6cMyI4Qι9[= G]k3vtI [?<ڕ0`*!Q>(wYh&e)=Gd$"!M-ovN8vSNVYog+sW~u9s _}m#z zO74|Qpoa@W0yEyo>ܚ4-i tLvn473@7B On܃%䛇sK̞ o0"/ شsҸ$썔˓^x S\sɖjOQK.΢8Krr,uhk_O.*g%õ+qBRXZ{O||}TSZSl bS7豐Cdzì˄ˬ3z$s+J{5& {X vjۚ d#FḵeOο-{m t^m[ƨ!^y[z+;o*\.tUIs*5OyW0!+)޺ v/jus~{1w,7ٹ3X/lS*vE;HӍQm!e 9U*YcwZlnE>Wv<_)7k50əh(ou~%q¹/F$T'vطڔEvVϟquiy.*m!jvTϨp]A. P eovcsEŧ+kon|9:!uCHO_YF&|QmiBjHԮd#QoPA&}"t'~hsώ.gJ$1u ->9gKmdϚ:r9OCǐE> ;8?J7 19kl^X\K4<Ԧ_c*/TM _G֏oj;HJ݊7;LeM^ƳێE%\d<mnjI,r; Nޓ rF{he9&mK$~.Gr! }*!WS9 "K TF)VE_-W>11 6zgO>4ٶ\>03d <. ,a8(7{$`rEmejt6*cI_|8:XȽq,IbZ ]S V -TI}ە~bZhɝz -Nf˔"UO%|EÅLz>v&*r43MUQJK̇`Ρe;Ey\HwxUڂK"ڢaWc}qMr3^F7K<&ϼ.SRSw8+#-sL"pZPCn(7A䵣/5Zo GYW鵣nic^@&!uX$p+1 ~v!#|2$}W_ G&W5Ctu] =ΪƓf.XmusGȑdm3b<\oQ+-͡Y!!?x3C6b$b:_2`2 nw :D]P`y1HKfzsO2k`p{a "{"2T ZOS' 'bf 1^˸RKj/ZrWg_;:J?.VbVcE=osjHT¬G*‘; w&8r`Jv`E9;{<$ڱNIVͣ[n4)x~1_tȡrO]\Qm( ݗPnV(ݶ~M  S, ={a0qg2Q'W7сN+澭 -OV`@zt_>f,%٦HjAEbEEg[rT UNO,d3BQd QUB(}:f1W,K#H{VhtL[8Y^'alѹ(ٓf)Hc  5.ۻkY8@7D#W *>t&^nP£2&*[ۼ.:]wGe1tTڕC։"ZjznUNt>9?T^ڛ-f~RX*pZ-["kM%H`E^=n}miVuJŧfUFI?cˉZugt7U&`t~:W,{2lFmo 12tbl BI0Ԧɱ~ZKvi8Hvy4"8CAžNPtϕ |fYiY;Ⴞ2EWL#](5cv!8b/#s(kb (nbf#舩"<+HO/:ϭ߬G&ݞ.X|oM ;߰Tfmَ|ZyǕi Vd -Y7QE4PBfsb|%<)r/ԢNiۦ̸U, &)4ǹ)Eq fUe:uA8n@iF*FƖ~j;)K^{ b9Y2ʬQ_.3ոO'}x5U53}n#-ND [llaH{w==)tTDsz^ȃ١ּ*=0,xc%7-~qd^GMU !lCՃ/ Lʵe;I˚-SH{MK?^Teyk/MlwKt|;o'ݥWΘBAqZ~k0.IVH֧0)|=puQV@Ɠ x]T~)ޣN y`qHyRjӉ5L4Ȼk2gs^H(zS^ǭ{RE WW.k.S{tҊ6~<3dՀU "{Og" m)?+*8&.G·3HڅfasE2c؄LuUgWז[Zyj_`$y/P&?؝J›]j!bA3! X97S,Uu@I#hacR=cCU׿G 6%lVP;nۚAH̑O KՏsEpxc7D :Nnjwvp}Ԙq2#McPMX·(F |ڛp*qb:aXKrӼN΁;5 j.tyHW, xkJ2kb[bꄐ VzhZ\\s[jD2" 1бׯ,c 7$s2cc[OoW2~jc8V;Ul6gi%*zcbm,',h_YI#=gg2I5iB0GCrSwK&Lh =W8霢֩Vȹ>{bR拊[-Y.)ޅlEZ?=>c%Nf"'g a'olE:"nMŔ)+%pJdhUs_z*Id֏n:@/<%>ހΪP^Imp .WfXfϳDnAix!{}j~uY2$dհ*8O H~g&K@ӆcqJ Ç`q::I͇[%b|ӿV ϑ_lkN Q"mp_*51E22GzDA=6 3ZHw|!< k/tocUv=~ Y8FRi-Jfʼqun@6%lϟP}Kc$R.A!x>!wHnzqMerD4lCq\ZSk[7WsTv<^6>[l 1ЅOIpPPud?1x9rtܰN=@$Ω8BPTCG@ßz/>DES_j".&Hj7o@ik.ǒu]rA0* hV,7G#o>Qc[ $ӓ33f؈sAt15)n{ 75%}(=s^@ǹqRTa .؞LĹؕdJX5uil!{]`i,8ghqb'g'E:#Qd(2 0S ~-3M)(8\ s_{Q yD7NO{pŻ60tfMo8Ч杽a62B*Dp>U"Ie( lq PZFAτX2~ۆj"'I0ݐ.;`P'q6rhD SډVa\y//x#g>Ѱ\ ȔŸ,5[\ƃɉ2P6cgH>pT tWrKI%#:8W׺W0 roBDSSJS(B@mƴJpdV/nvuЧGK91hJ RhѥsF&,NC0v]Ơڝ*%:k}:wv.|]Άl'fv^腻#Ԗ huE~O_i]沠UJZ`tk27CDx(hDݞ'$zP&Qk0J>G;E5>j\88a JRT#(ڧ ;]XF*-ܬ59 yU ~a*oD !'w\!sj<{"ׁ 4˄&™ a@YnbI9(O3 Hn,\qn -1,'H)2P|nSH$lٚ40G$қx.ёdrE%gI4.Xg|>uXM  Vx>q3sq+]扲Jӳ tSPa eiҍ"y} rJÊu'#\يٓ~NӳemPma% tCV*ar(밌 u3̛θ(,:*èdӏ[~e?.q<ސy<XCVEUǜX~ɞL 6X -38j۸嶭PXy>¾k|ڢzM Y3W8-4ѷa&^H~׆lk~-%Iq;|+TM鰸ڂ4%àDgo Jx^h"3 $7~ĭ19(cZ(tPĺ5npq0}O'H7OoL6Mš(Yuc zh~̒m?/ U:~9nRϋQ?܍ïv ݢqpBH!k)Ȧ̹ρQaEBm.n}~cs: jHmؐv@ ʿ5R}>`zGW6)S׏bAi\ZXGD?`3.zY(?~S "ߢecC؃>&mccս.Q#|dOg "mx04o`*kP. 4L5%:{4%DS7'tɒgJR#JI@#Rf,~6~[^oAw؇}M'Ø?>:J"vP+D9jIe76Cԥih<{ U wt\9W(Don۳-FC ?Xx`=C&-SsCTBSKrf8@m/@}"v*躾-KӽghĤzb ̫Z@w1d5tj ;i\F͡%-+œ+4uq61"mdvlOT]9"K M8cCZƹ6ɬbwX#(0+=tMlx @F.0BimS#S&(D@I״8 %e4RUPwO93FԼHzQ>Lǯ,#PiHy8xJrrTIoI^tI$ h<`D>&d E&݁DdNdG6FcTݜ>6t`tm)Aϥe#i7>"C؎<JSfWʂA9-cp86h[|DR[B$O0FA餏ި4pQ_w\oV]q_$DB1!Ff ٥eк= n,XZL pm8~D̅Zzzc>ҶL>@a8M$c1dj0L_!_j;*c%WEӽ!fhRvM;a{1irl. UO}%WDD{$4E.>+,@Çm~P( 0 U7SCc=m=%.: /U=(,[4 L]r#Q.3RZ-SJѳ+"BZ9 e!Q34Or*|b:wP&[hU+0 nIp%zRĨ`UQ/&'^}[~!Se\TvS@ HnsR2m}yZ p.z ezg#{۰H1+,!p%~#GUf^8 vpSEcWlgh!ei@"w҈{ơ7hn-!P>b?a0ek 6,3^ m셋m1|.-v[zP4)kW1&|~v՘ kv@Y;.SSn mCL+ %֌^fGi2&:"fWCR8 ߞ[9ҒT!81IK|yw:@_Z)e#BӖ3AyW%L> *)< kQr{lsiNmZN6*}rs``_uJtv 7TD[Yc0feeq/V% &hӣ Xōç<δlx %{69M]ՍbyON=eԕ\n4}p bf@LvxAΠݾ D^Hq@p͇U)@[rxC5Tq1}zj jtUF65ʆ<9Q#SρEw }:(vC:u2sǚGIO;ZꑎtrwI'۞% .AN2R$)sk|"A,0vu n?ViLF-뀍(U9<pĜΌԥdv2kݱ-+[$9 8?ӝJj;w5R%mpPnaB*@&d3q辅I>0a@Vp1Ya @bhl>PbbPu]~Pwr&#e"Cz;J, g-vJ'* flnj %S0-mHSCMvdUK&Pr`{L'`uCYavqzZ_20[Ǡzi-9! 34;$^`%b,s*`7]֬n"Z|I~Wl hV3z 1]56'~2i>.}/i|DZDs^&#D`|7`:IKamnB>޴u$ KhF"@Y=Eŧ8 b,FvM --V}^!Qj,6tβYcEV]g(ñjْ,B8^;WƜ Ȃ6!g"l?! .q,Ħ4$Rs\iܺn~Z\!R"[:`.W3ZD[6:MxZFy~HIF/J_(-,a& yqo~~^r}7S=\))M q*u.k><8>HʽeJ3qk86*?d"2OK)9[ )9 J_{Pz*|T|ÀoA0~`rGmVOd$ 2y?0ӟclh)RT[+CQk=Rߵ\}*M4 sVm?m0*rܶ}jQfAD@YݮY92  Fbxk`ʌrSZdev*,WJ-wƗ%i ;גۋ 4w?9+N ڇ ]C%)i_Yօ_#ŴP c5g'ȟ{LjoշDАC7LqNʦ"lVHlvѕ7b1td~+:~A.j  3؆+!Ʌ,nFV)&WH>3r,%aԝ,˾+ˤ#T>[X+;c2vVLdA|E'4;Ou@'.} j}8? rK?UKI*WQFhS A^;tglm^zn4zv[(bl u )NW8ۛ9EqWLh3jw |4 &g V7&XFK|% 3Es}GD̋ݐytR!z|9֐nlTSB+{8TGC4jգnIYЮ3,3,|WS'<jA^Pͩ$c5jYaezyXoywIp7~z-im@9r.<~ԻbJZ`N3%kXzN\3tzqM"dt( mV?uiNdPE"%GlPZ8B>mŇf2ʾqE]rUZo댢m{$VXBu*,*^yyw־1]E)!3%34x`U.V[cUAvq j?܄"sI<^A*XAKHInDΒx퉳gIs>H6@2Jm2W?Rxb}w.{ʛԖ64?ho-[i›nlMtrb7lIlMrr6m'v`7h7)l-'Oq+MzV&od7)o-'Oe+M~V&Vߠ)AmG/ol~&w_A{ [A;:vxV&oЎlZod+ ot+&oЎ}WJ_ +%WJ_ +%ibat?cmoM,_働l$&C] zGdOޣԖPof +)} R睙m.tǷv:I{uWrXѡ@Tjv SW{3/ :g]/~9 Tq;rZuK#=Z:urǙkZ큐W %ZT7,4 )tjWPu⊤y_}jrwKկFOCOqZ%lEIˋ7哊܆¸[v9GΨހ__U7_wZe9hEcvOG$T`ti<@< uQ/{M{׷m H^JGKJfzv.'T)_˹_-H;xا?e(ᐿi+NBv#'ub⎜>RIm|!RGAA7.?rD[>xQzrMNd~ތb9g"u}:=!]a]P]O3Ww佬8͎;vEj6=\Mf|2x@-sm;[cz\<=n}_~ݺжo/elԵh, JF&hV􆥴b6~b/3aGuj^Sۧwf^媓PMO$Y-DD_؈o1 KzLʭF[w\_V1Ӿm t,ƗNL ڞuMT0hcjH(Ф߳r_.r\uص6@\0q 5N[3K񊋗gE>/oӅ/Kà/_F{Ab^i†).yä!uXX%/]G9 lq!񬙵EӔ+P9= ˾rv˸}SUW6kwHh]Ys{Q%'Ԭ}Ϧ-??8ܰ:t#}{+ϵFZ)Z8{zlbcK]JoE (BS%ìw4HSsg_Fּ7b9ψU} *p5ğLZa) a= ]]qғy |Lp**` d)Z!u- UY!w#]TfJh*8.׽/lٟ{U:[O~6EmE]{7ALvO_C#?TMIރh`or@ Aj_ݡvə xShs &>zC-We1 ۸ɂq:?bVV[GB=1FDy$W 2PܭG_m#?;\N{#m^ r<[Z/7 ~S{^$$3P#tt9SxHg}BYٳ{wG]TyHO._\Yſ:á?HqTu/O*,/2<ʿgK?vB " }CӮO PK5?PKy.F5angular-1.3.9/docs/img/tutorial/tutorial_07_final.pngD{sx%]db΍m;78Ll7 'Ķmۘv6ow?OOSUUoU+K"} QZ oa{@|]p՝UL] MH(;Gƒ@c <~cxڕW?2* BP߿Nl0Q}m_MvTaÇևgŐ rxGL(=}6q¢3vc{׿$7eu -nb 6K{?%>֧ 8>iջUl,)|p8ʏ EanCz\J\+PϬ~>C)|6\l<,z}쑝o 2J]߳&r7"g&6*YA #E 2O;Ze+s,J( rebo)999Rڽ= S.l+eRnL4\F0=忿nͥVs&)CX 5B!P-Y/bms" 79{9!V!3{hD: x̲pR-9Z$lF9Z~. gQyp&fF/LAr8ZF,Q 5&4,4P-;D#cѵrK0X%Wͭ'#TƏ5C%]NFYw/;ӛ)߫D2k` V z79<1ҭР78."肕[Y`69=L9 Yb&μ=1D09tH9,ڟi5щhO A+~6$DwH n[-2N ScWws{5{ #hJIOoV=v>{ @EHbƨWf[3*bSOa ca(R)Jzڰ[KFc&>k|3OXAhֲdN:ņ"gGX2uS4+1H2VgWъyp}iy!a_#gu"Kɮr&bSd:_6+T:?ɾi o~ h[0R_ ZR4ԯH47Vi@ P >;8*|fH#޽c3gqDҜSMkcv &7O ;c94.b+ⵐVt hXs~EPJzC> 3}Dyħ+Y?=Vzlӹ8_bdEE ?sPaPNT %_!xWLg{ f܀Kt ^w@o}%\VkCuyԉdB2+]f\\A$Y%[_d&%ioRX%4[qt;өN &];GBsXyDX~x|O}hGeI)~8S$r3Ҧ+}p$m};@Vf)F<\2NQeP,Z5z9pH3cD?,>gIob  *< P4?4-QH9ɫ Hh,&4Yk5WoQqt5>UX[/^qIoe^{!qUZ@c 0#U*^VxJ3YGoԥwho6wd E⮠zJnԘ2uI5gfPn.)'/kwHJCERu4 TzAg/ ͗{S~?:E~ &\'28DywhђDU p=0s5<"4a08Q,FG,6wK-cn#n\W=9V)xaG#R G5Lq0RULP5>Trz9K%0mZYHN*--Mr<g]PZp5uXQLiPtYeKw.Fb֙ioo=i/@1wmF~`|M2HN/+b+XHZ,MRnNBqs;~4#sK)ڨ>8l|лxMQ9,L4vA{i[mfrP;P5CyM@₝>S+jBDWAE|p+ɁÞkrh4hdMwcWUOz=i}Ŝu)_SI.ȓ%_Jtwcޭfi>&$_4|ƒ8!y&ٕ<+P$(Փc0hDpj92~Ew5Vy= W!i@kRƙ+3_d\&/묋͢$صKB8{90<<#ھ5۾׳ؕU&ޠ2YcvjRz䰰˱JRݷdX.D 1zc(1Z"\Ɗ3Q;wZP{ń"?RFVDUvEMs5.O.crCeLͼ.X ƳN{OcJލ#\#!@r R^-C:a;O,%?prT(ҭ* /6`fm u<_7s˷C݄)~ܽ=$ݗ=ٌEH&;@HaH)@襉\+ [P9(t +'h*wFASFfFCxlfT#(|dzY;|mkS?#D]LWh[Ʌ§Dv72Ǫ5>qQള'WVsy}ImԛC:0&)Q^umR51;i6+Rp=H/6}ۢ}7@Ҋ|߈Nzi᣹NvLIOm5fg}!GX#,w3î03Ὦ4A;ÝK ٚn 567񟗝tɏhJ1O׶5v7\sV=(\->x\wFV+D9%eU"Z[ Gź:EӒPf(#C҈%رF>-tN`qx\Z.|:~^^c`P{ >7Άf]v:P:\s;X`ɟhHe"UO{ק&eQJ˅ * }yRr_V'XWZ;Nxt8\Me:d0 Լ2 ޓ՜~C!:2h1Q#R2 X#/SNDM`.6O66e(r - &k ެewMpO<J>6$_g89zr^5KMgpK =ɩHNp(RjD)w"~MFZž0NBvFO >8K?뮮I(=?3e,ՏRr/&Tj—A7iqkE(+QT9tMLnޓ.W+0O/oRM'4t+;jwR\Kem?V֛݁2LBjn7p,lS(FΜѳՌ n~ jqE,f\| [H>bk|x-h 00]v\_܈@ީWngM˔1w1r+ז;]@ڥD7h^y51β/ïS#C6kgl+ p}鍏+ ko4t3}?a/րeCb| k:;VC0}mkE:f5Í)$@ oV4@ !n#H&y>c,ܗ;sB cܩ멥ֿ9 ͝Vn~p.==0iw>FоP3R4[4VPZVVBEv2"F1118:{1˔.+|DKd#V#, X1)Mu_9kOrZ!hj6鈍&/m=\UxBG]bF.Cʚo1x,wV`XzWᤢ _㣤dEzVf߰ma7€/&Č2J/|%Rpp$+}3_\X4ʎ^'E8Ӹ/lPng]MpEᅳ㟣Zܣf&EP=̈i ޖ1I.Q**1խ$&o :B6j_D/SQr_7;a1vLq4[Yj^QR$"_QV˶A }Zm;MdŁ $.w<9iE4ayrCCƏ?nj. %Mt38e]<g4! &g-5,˝뢻+J}8)QTlD;:V"ʋ۳5;UsN߯?jl陼Glؒ/sd8(dHkVIo9r 5nBj;Ɉ0')#2xߝيW@JxVհglwPҽJdIv5x8@՟&;>t/?n>Sd(ӥ ׭ >(x88%WR&&F|+۹"DۮwP'##`fJWvlrp>62qK\oC |eH?uZED,Cdp>pw]>99f0b[]Wly3BUc4+u9_,H66%jm'*yrrU/ox=YLlyk=g LLG4G_ςtF"XXPb.b"'(⛚"\h jb Ԛp0X92۴U'r_Sd4φOh9IM :;Y} b 8[+sqʈ6QQK ڭ [N{kZsjoN'onf9ȗcNw}g9жN'S x٪۰M䉿δ8*m;͌6ݵrEiYcJo;_=?1w{er/?y^ `m'*†DPt%/5K fm f M*n݌=?Y<ζR!|m]Ǐ-xѣ3|KUVU^^̉;Tm{`S{1|b:[_~vMm:y{۶_{~u6XWO 蟐"<@|GBB9Υ Wi_&w<oIk5Y4J>H椦 @W ZF4Z0O^ #.k ",y !|s$Kfy5 Hg,F||Jc Hn;e/s$=Ou# +z)ԩayb38 z+x~uϓtKBUpe, a !a'fB{^ѡf)6 #^Ry$^ݭS&r5FgN >+]Q--KiFT*?}:SCvLPvI;LwW _8]6.S}"؊>zŐ >{oGs,x|dCS~V!QǎGCCCDŴ)2O<Ŏxmmt-Nm;< -/ B1={G%d IE:8 -Ҭ4;eyYV?fONJ 4jH+dà<߆gdμ{q y#*f&}~K+EY&,MʵG'x'ȏ_ ʶTѸ4<@M4GI{Lq_Dd!襺Db ,qq+ :G[i+MOO({  l˙8Ng~2|4=e9 M)CvLռ瞫Q ZaiG*^IVvk|U8++P?q{Z,A{j{I=aߴwS2|wSbxJ?@:Z_oV"M& g9s,7f֧R < y}\4IY1_=xtd1UL}w?U*]1$lѭ:~U?ƿ[[YdPb5/z_ s|Cކ'Z Wg=?;;}9c㉗Sn;EL"Zv`[-UB`:߅j0Xǖ`?/Ь+nk5DFA;`m\rljԲ߅=sIeL,ˢ*M&QV7E(XUB4Rcp99.[̾o"}Uk :(7ر :KoUV qX)édzxw|Cam$+GO)4h_{FȻDм;$e^hnQ9c_PG'O.͘]( mGȋtvK!nv eg{5ŘbO&=1e]A8}t’iO 1M$|uŲ%^~tڹJNv(ibu #c oVֺo_q''OXaF:4Jffp}vF06Lǡ;\1!5c@{fX&# S #ɉE¤ %u[Bg'q↧Pbbq 8c?eZ>:R_]f7Pڤ g[ +ԁQ$ favfܳ.rJ̫5YE<>A6#z/eZ3*B7Ith#э$\V{V,)Z&$@{tUpV|ɨG\#)|.*-HE}=Ʈw#/#oĄqX^?H}>S'^~A ʹY-Y?]KI宥rB|}x R ]ϾFgأe9xҿ 1| b?_ȋhQ*؈O +/zo^\R\(b@`ūK=*/~t^e|H43D:u?RvU3+vV:hp١6Miv~ߧ,"9Jn}fd@Gl[ c~RS]5emn\ &aUL~ "T!%upC*gneYe'N7A>m# (***U6bgrP 7oZY8!> ĿJ4zxJar`L[%HP~;7eJʘO8kLd( 'DJJz:/qOˇ[ݙ +ѫSp\F<.8ؑkKҋOikPJf+gfǦʮVs̆s[_ |yet$#>X ]0rk?w/sjϕ,>qະM'ڨnt_+k6<A/xE 6 I$ڑM+PQH95Pœ =`. U@JK?AC$J#'ɁTIkzA!G!0<=?^D^mUs>}3>lCxhqt|>(uI+ՆE/nb@WbIĒG8_a*mnm-V[51;j~|e6 7eQ|ot |Qܨ9a|X&3rBAq=qJXdRR{/aL6/p [fD۪AW? .RI> _!V ~%:➦dW ERC= aU]i3vv̽RX;\2j j8޺_ ]Ɋ!l~#kЙ§|C[4Cfj`r$Q}yЬ0j9ҁl1>eW ֑T\#QAE,7fcK)gj 2YPY Ns8K$uA |3| "8ԚF b^eÝO;w;EsG`dr)Hri h|0yӋxA>/Ye)F@PhA #WW@qЂe~͍5jHVUo_w)y9: =\Ƒq/Tr/]n}lhAk!Pܡn PMK+SIW)&%;'{kN5Ce^.;I$ %za* 48F <0;O_\ 1!2 /4@e>鄡@e"K P=8_PQAnhgX-1mmVEkqϽb^a:iϩV b& yqQ LO/zqKyƪ'_F\4A>IPMzIعG,@}1|GΖ ,H'*IP640nzgj㍠yo}WYj{m a(t@N"<,%@lfIP<6!Gd//*ٕ^T*)2R|R@x95{njP]:æHOr&<];}wXчzGWk3$a7y,Xlc^l|jvOe; d&8= k6k/׀,}uj C0}ٯ.3;Yѓ %kV.$dO4' .!4K r^PEE>@3<,H$~tS50 w)|TgMC (7xTl-k5αTH"eV|dtpR)> ]d}D  ߌ0JR4oW<)II/C%> D/7طS:Ө#E/T'eE[r+)󓯢=Y_yՍ]nѡM<$S9H8rg$-a#|z䴪~-2r<OE a YYo49H]rUT /(Ohdц)|d{5n׆3"Akosӕ]N FJ@c4&. 1X C I,C\5tkC7.7Hcp^/$/ cBA#563ϝWm`T)X΋B)Gᒐ4h%ʆIC(;bP~T|R -YXAmtt<+Wnڲhz(ah%>MtAWWq):Yf LaoyeF4c2ۡtW$l`5L _?ŧlrv0 >DK PN >ZQm/HU I!윞ι]!] ҝj("g0ph8}!Y`T"TEF Vƪ^5Y#*+Ċ"acwu3Օ_j/QGg `ivo*dɳX֌Xmނu p9寷 ? v0ˌ:9+iL}r#&\u^V2.ss>+( p~T؇ z&PdaqU/8\l6ze{I[[*qZJ) @8֬wWh0O# |ّD>/W]:=x\} oݖkrkTwHlBG!m9m1J9n֢};˱[~L :5rrsp)QY_O/ ,oA1|0= X+ABB/'Zx[r(wwXXANTQN+ϸ?MiS/7^܋~&L&r"IN.$e4 CJ(#4Ð]#adF}3g͉Rt}_&ou\t]_bCD4oQ'!: ÝD0zwL._x oA^61p4Q(:`](ˍ޴z_HO]sQ{TU9c; '{<~ޱO={d&̙󦜇3Ϛe A*&p)3$$$!lIf$O]3AS}$ʨ[l>PJ-b/1nTKZH#ש \=&*gCꠣŨ8 $d+,))3Կ+g5q<{mN@tE 05SUrbہ0pG>T}\vib$?N>_`rI=UjTm;b':k6#?n ݻwGccc0Ⱥ0P ʅ(W+!l~?iJ? >M9 J77?V ѲyuU]_3M"Cy"h.$IgB]gPCIX[pJ X8 cD敗_ƓO>pq܀MR@ (\ V*osf FT gd` 1>}]9ӗi2X>s lo~3B^N W\m v1ɰ]gb?KY|BnVd7ܪ_JO%tVl\מs;&N´Kq/,Nb>ğJ(L(!KJ3EV $%4 'D3O\}=Bsc5AShYAͫQw}vѮ'ڵKm,ޓFҳ,4aJoF&ZIո;QTӯ ٖ 6Akĸ"шoO|GKz\ٵ ~+N֊OqyQHFF7Ha;ȥ(WI##~V =Tlw_6yrIkk$b4 oOD=v\턎i 4«܀솑NՖsa} mE-^]oE3oY /^Tz+0{{%xW0빸[qqÙluz6"ԐnHHHBDgŦШ^0֌E+,p`H24U I6o<;p{_c4_w7^yeyÑL Ф756᝷S?aGk.EFFznTy709dָeh8bM]/FfZOD'4k ߋ`\C3%;ÉLi۷m3fMpň1ctSBJJR1<"8)՘D ?dL~ XK5S@Մn4Fo*n}} y] Tp&}`&n82`4PM ^Y=(W|ϔhW^^`w~W^ppW&RS)!!qؿ]CI!¶|LkMӭb 1j`ͷt9n|-z5j@kX믧5FE\[w}S V1[VLz8\$mڸ 1"Y'xCZw-? rM#6N)]?9ۧ& 9Oᶇoݏ݆~Zn!:vMgɇ8C yi\n{g>O_ j1 FEa||l~zN|<\dpf܌?^yFQ벣Sѫ.ϵ`폿b|cX;1Y{ehѝP0$z4k`neCLA%?˹{;faB]濟cӭW[H씎S/]h< ?OC(ɥϯ$JM7kBɀ& 2@*/!E]#@kZ;+mt5kdfk"~@t!AhZIw'ԇ#2U+Wiͱ9s]-D 4_ovRAUX\&b[or*Fb|j={af2Ig Bf?p޵_v-FO_\XdV?q h+qc0BS$|5bsY11WbkK_¶bFaMD@\$P4m=GqzJmѪO8lˎlFk3bp}2뮿/.蓼:gL3} x\1lCx~h @UE^j= fˢ|(;^t2lcGZz;Y1USӋw_~TDXupKLl,y>=:UVbYN4801*NEPYd! bAk3^yjbr < Q 7~7q"$zM& B WFhF'; oΘxjjja4/%h5yk|wW1̸iq1Qda #*~W i}b\C }/ךnnK^L .XJ]IA&_̧̽iF7Ysq3*B ǫʹzQyr%{e:^s˿Ft 7X&̾e^Gt[ :ƅצCFN%;?'Zp2 z?d\-͘FsҒ64 G +E=>l\# Bw pp.!p@!B=$u~zggf7;;O>KWAzp{6B 73QoIi!cx+47=sQCaa%_-D8;EPD8)hfH60YG\;دyvک*;,UkƩlc-aۘR:<]11N~t|o?l (|$0p|8f_ZswiD~lZ )s55x7eZ'c0> gw4#Zw FmwFBX m}rz|\{X+y0h*g]'F1Q~@rS5aIPN;g:1c44 c=q6ޔdf\\7?6znU}pݾkTYky{h9[3iv}VI}hq02Nj0F_\u/s}߯FzIR+PZہc^Qׇ6:g(m[!ڧ ՟X2FJM'LJʊJv5*g5Fв t!Z4m"PD&>>K"2N0sxcr"p*O-#oYmI!W+N8+o[|3+/#xӲعv/NC<u#-OGD$ѾOWҡٟ Mu&dӡG:*dPt}tWK\f@}zыܶFtV@kʠIUH +}=hc)tåiםÇ0ekq k}(X KK7PT*c$.;i`ݏt,J##K]m̧֟so߃o>3 X#cWcӺc])}ֽwo𾧁G xA6iC DMfB/o;=tag<3FT-ػjKٹ$im6wNꍙt퐋EiGU$/ovp'xDx8x>`|}+>  p@6.?ۅBj%hQm$E_F͓IR4eJͤǸL<+ tFj׮ɫGI'tK~1uc%.M4و93ٹ6y\Mg KG2^5`P^vDT,]Jݟ2l~Zr)=>~RMi1Q~@$uH^?yRn?&M?ngI4 UkGg':z?m/Ϊ},zc+w ˽Dy 툷N\QA ~mб#HD"A-0wԎqOe/yW?Hn)3h}9Y0:åxtoyţK xe(IM&l0^Qֽ^zt8GZ9AJ2d&B]|K̝ʍM&+Iظ}^o/apt-%?>Qېf_I$ܸn#3 [b<կ"tQK|o %N4z-)hU^AU~ʔZy\/:wXX;SB{9(F1$R-Š\51|7wΊpY8p22zSdlY{#\wC/PSu?HҀΜ>\L>1g9g gHfa`4L~ӖdKǖ!*GG&w҅&}oL-<>[ʐv[q`$35,=g%c0#x]69!exER}'EMUPy{_ @)(E'2iyU/?+ :H&͝Gg}.GAèw48qlB %wSNT;]6ZZL_c>+ߒ+Vm/V&4ҵwO&^v/"}% O{2F1Q~5@e_KPi*~vgbhh&1m, s石)`%1spuūMśKyLDyIf/u9463( ~wt/gcE^GN'ف*@o`TzK lXlVϼR%/?MO>`#3Oν x2:%hv'[ֳjZ~ݍr ] Hܵ%ٷx ;1'39r|f6^!1#p4i{[|DکO씉?o}⅋8dYڢ,אP)(#G0ESTHv0`PSQ^1$%-UzZFc(FPQOEvY!g\wl@^w(ʊ:&թ&I:N̡A!?PH;kr~s2o%g)Umg*丣aj>sXv;[88kxF/l#{--~^9^=eA3arU|LN.8"^C%kA9rDNqy&~%xL}u5zJ{iف%#OutHD[|p~  Gkׯuy{#N!`[4{LC.R1T&CoWϲEYIT;[.Pԫ?'v,˔caS}.+? @wR+[nc͜veZgy4o5B aq"c})!Ϣh3F'mv׭ sbT*9@5RVRܞ҅s}{u3kם/ng0$obKhҏ63r(R ެWݐg0blƔ}XU|Q|/p]SGoXf-ƌ QbH(LJ UC+[R5;9Ո`^ӧ5v+u[\RYb1{`RYMI %SEbm%Qr`u|kY 0.[uwm"Β),#+{lg'Y^#x9XZCeerIIj]J̠@) E:3Ug]͉O:l8[y+nB9>|q}Ԕ3&/\Ic2;7?JVNNo/4/;HU3>9څ+1|pm 폥T:2F1/EGz{ۘlT҉&\ `X}llXM~lώ^:'2sIԠőjBq|l^ ;e@bkE)LV(_KWtuIT.ᩏ-<(Eص%!D{ʧCٴOݷn8(*tbT3͢-4YvuF qFCLAy<ﭡa]+ % lPNb"=#LqP^⿖I raE"zqw|b]7)Mst9}O UܹK^zAS&#š=in%g{'dֺT,*H}L@ټ 㨢ެ]5,8f*i }/.?755.'sYY :,v?gg#qfapm||#̀IsHj^]ĕXeนg3O>F#ڢFz@ @[t''ZA!!<\tjN= -j\H2x%a.\E-]C}a$2SYIUl{';Xu;sg kgbT{f{@?C{PAf̔c?- ~oܪ:iXh73[`4f/2F1/PʆRW!1>b.#ٸ6Eݷ%tx%CN7ss9HL4RRNĽ\(6,ƭw 0Ϭ-k3RK a&a+ x]LtЋpnG6ұW7QÙCeŞE=3fof2@Բ$%%fҥ@GKS'Y:IfNSSUC?!GOX*^;l'KU <0Apa )xIZ&MNݸP_UϞLNV >x{ \͍yyZ|i|}(chxhiZ>{V`g_db]%N$>w75_I>xG?Mb(\1TW#{hXd< .{ɳdԼbGTso߾_޽{3d4)՞{WYYIɁ G6&ź} }uO ixC|O&%;W´gxouGy_0s:yHZ:þv"#GgJ4Ⲫw’݅431&吲c/{7e;PG_`l)CԬrۮ.e o_xCSӀ=-^fnPVZF~A~*(eQb_P]bQ*㜹T{KW<@b[V.!oLݨ2+tOxIu߶gsrf;> ρ]ed^r*]Ҏ{~qV^i./~o_/,qE +f7.+'~GޠdWLr0v"oC3MyP c׌-ATJ>@Nt0OHԝ;x5ܸA"A%8ږGE1d[,6/^L\|`e WinnI)644rJ2r߾}sijjIХK\mM+w{J;ıfӏ|r7-)ݽ%;DرwP-*RRR b>JqyYkr!G]\@P&dҞ2|(}u6و=+W %N'F~'$G<yZ<73|kkkŧa!;;;O֥N+'#S5BOx9HS-ɐ.ڴi&nmgϞ̘1C{O`J$"yt0u4119FjKV][|/ܾw|&!,_-OQu)\D3;s21n=9lP~08\;y,DYזPHY՗=%;ޗٕcb`xXQԤڧrFO$ll? DPB|&1F%䦰{nrr1Qb'CHh+&ͳœiխ='$cwB]!cxxddeeaV 8-iL85J"zu*3sw|^N}Ͱ1*̢Zsn;ۑLv[8qPSާ+a>$5{oȮIq`OOfb*G UbYZT:ͩ,n,b!eLF p4j "!=O"-O'_4 (/㳕[)h&NEFL#i$mp zg$g4yV L2x` tI0gQZZ yp8{QRRQHgϦX_RyWk۷O$(K$3hr/A̖?bۂ/+:t(;w'`Zd9]vÆ =裚LNR\xᅌ1Bãܶm4p E]Ę1c:<#бŅ8p@X\pcǎ{aڵ*<8q^OȺL4 e˖=sB|7x7o$=7n,O[r)Z]G~ u)_1'4Ykok֬D> &0n{,|Sa@iYwΟ? 6h$R.=.\AԤ܊+ LǻwCS8曵;=zpQGi[bQgp2("D8} IU~_>1Պcߙ'r䗛x٬T7: Rš'^BfwOa膵<1,e3Nn/TƲ6-eœk{zV|GΠ5ߪD|bQIP> ""#Puic$_xߴ%e0tj4BX6[1;(F\7irZ^iZR][j2Y7V42 ۝'t "#+b+\3C|GMG`2 U'>ȃT;-̺{*W熋'<؎OIb ~K#xro3|!G.!/_~źm9y5G˳q{3DlM{Pxg]7m xd.ĕgŪl8n ~8~vXWK5 cq.}˚,77' ڃ"݅bͪ9 *z[ap8:u3fN I2224pٮ]; 8Idr- ') QW_}v9aH-5 2DJCdefs9gPقJ"I)Rz%򜼧K<555s@J2`kDxu-DSYA }tlY~Od{I@%e?%C$^_yyNO[dҴׇ"Z1GإɾS(K^,Jj離! %r_.$(}+qΝCO -Z<'6nȼys, u@y(\ȟl[N'gdrZmUtDКœM;r> cw|| gl]zrUG2zr;0M?g8u'?`ۏ0w56T5hj` ۶RJQF ɹLe zNf gq)S؉c][¼/Pިȉho7GLlem;KLUIlr|l^ .a=#V nQߎd_K2wT•U$ƛQ_O6_ +믊h$˥vAJvSW ˳aЪޏ!HjeB34:sϛ% uɚ4@hV?(APJČZȝ@]Ph>ӆZ\_o*V/iA(Qd"#"K Q|(>Uqdjی3N 5__ cLܚ0*m^hDo.QgMeÏ>+hi o&2F1I&<2zٵn=?kK(e20x"Vr2f0s,>/b<&vmbӊ |K^΍ϞF]y1(I8FLzuT3uGL17{rӃZZ0T3st|)X7y]V9&0Q-y_C1a |^Սq™ mf2tZVZOkM&U5[MAiZ&gC@%(-`R1GtI!Ch,Ss:郺P sȄbυ,Omw.zO|z]zmo.X/'A4CeS -&x}.$.!|1!~=N`[ Ih $SLᬳL,t.rbw@K1:2RB ԇA0}SUi4S5hS(c FVnC ݠg %* ELF,B\ 44:Peh4ը|u4<_ I?zh? m!_83eh7XT5#Yjw^1Qb+ I%R Z+&R1kqe2ʡHR ψ,XK JznGsPBqɥاpA^84"D[d>] 8VR"PNAuoeS@VPSМ9Hf]JDFɸ^\nr2h?}N>z*pOy89B5[ U:@ҵPx }rۥ;@3G¥ՁߋЎSeDnÝ(Bdfٚ}O Ӯ?&S eb_)'ȔC2HdokR#&OkB Q@iI->{EL˞!S!?Z 3@MR5)*f4VWZ=tPtGB~M>&d>ń禦Ή_314i! (A Ayyָ8F)s'=N\8 54qj})<o$aL~յTpQ8L@^CI[.)|Ah}?RiK*#$n .ԖTk@6J}c,Z`(>5 | -y%Ck.:ΧTـCJF9f7o?w OKmMHżp~J\LKYc-N=k_.)M)ь?/G|!51CA~o:&Qbm(@PH!- e1:1C9I5?͜94+iՎ3CvoAc}\pݱt?RVb :~'ޝ;v3`DfҝK>ڿ-ݨ$Z}O]Gjn%/M3?ZHXq|nxl OK/ey1Iӳ'7''̗o|EF_~N_nĽ;D,3M@C\#pZGuwr+x%\|ͩ>:_L548A50*h@.EV_GO,mM6ѓ/V:/Nq@^1ҹ8jHNCiQkhc]&QPS kqu>y8w>'OWŧ 7 H] 0 {,wb_Pj4J*ѰgA1cS2=$;~G9 njxk`z>aRVRs]ёzv&q(>1bX*_Ľb.w={CP̠ÚqMVSZdŲ%Tn-s8}w1Q~!ԥRR5iJg&,i6$b*i\wtNn⋄e,i6 P{V +`\EW? 1M9xygݷEc.;)ݻٟlLQ.lT<@'yqz-^L9c/̇^sU_]sϵg.sxZHVjgadiɳ9rα\snGj\7yVp9E/Yғ-h]SQ!0f%b2G|J0ϴͧD0;Fy TSP|AӞhgׁP&+=4XLWPj Z,7jX0Qj ?>66fdP\6}9nn^)vORdyT4bL4ЌJ?$sP/z((3Ny|tFz8tK3G' >^^ٱ6SZZ>6l.7o~L3^cHpsp^NCs*EV*dQݛR}[7%,#X 142ga .9&0'gGK)CEO 9(F AOI| 2O/xv8aSBAA*-^Zƕ?5_Ldv01sSTG}A癟(zl"[x=P~Ӈgbg)obcMN_lJ]U"nJãd؄KwPVQ?,CyyؽM4d3s'# O4{ /csfhz“,GJ <ΨxGn~ 3^2猩X43[sb3rUNß &NᚋS[\wC yF?ǟ #mM]0)8pk!&e|44zC͙ZlyA5A(u 7bO};.:T;HʔQHk@$b+2Is xbLLf ijtcIL !"@ fMVh*KJ i EC[Oݬ}2@Sxł Orj|E`c]nO`D:}.QK% RSjH:ic:u3cJ.p+}/ys-GOu-nBbVRѯB[fI&.)C9hML".I1BMjb=ܿ!TՖi !Mt JT%#/Ϟ|p9$ʖ mG(FB.oc/ 5F,ڣ(;ZFUP3A5/fJ=ވ\Ɂ0AvVRIMMg0bQ 6l @lKiv˲bZ2` M* s4۴{}XxZ[1.EAsK7 AS._]Q;K(%'#+19чASY\98Ev*wi xjI<3cˎ՜€iK7sp:mq=[#+ 6de/?R{e1ݨ\JDK6{ARL U,xc+}$}HJ0ɏ EALMs5lQVzqgY=ts[\,?voG@.i8Qb LZNC C~EI/ðgJQӒWcW.(k|= [4h&">5"RP&nk?3w#s^|?=@^,ԂXg&YƜx zf. pErV7qsS˛ޡDuMx=Y KJּ-j;K6/凾!ˬU$*'y}tf/qS55汧ٔ~VO25d"m$+neZs}SܝwYŲ?<)W%gsz?n-O_&7I5پq'3y k`/J>#f϶r)OněFId^x=5+y']2;i\*.N{: 1@#Pe eHծ+]%,|oIeFXP86-rOtA!3֧ZDc 6Fi-k%=T4 eL @CJn7Z~y=ؓOμ?}LjJB`%Hz0byˈj;ۯfȕ7F;xWq:%O6Qz$^8+Wч8'^EfF3^|l^1&LNbgkt~xw v$ɳ]1waqY6cy5\fT ,6xr`+YI%tyPm\zPV5zb3Nx5>SBw{UG5 2W1 A..דK`gyR.tuwLo txcz2p4P4;> ϯc-/|~%9uNy}6P/chW[ھe۪a;T{:޾6j,Q~)#|$$$sgmKIII4?y#U`+1X26x]|n N@1瑩u5ꔁbI!v2>$+U8hnO@K|FqVU42W #6dLܻX7{/$ FB|Z)q:-Hf<-;yy{AlK#P ͘>d$f']jr"Yf9fĔ"O8jXHKbn?jɂE.Uxwhc`=e[l5 <XjUξ\癔=p1@w9B_fC)M0BY%q4/<#ZdZ\jXʘ~+i1(3 /zaj6\uƈE5mҪ}O/*c^1};ុ%_ZiiGu;W (e,\FmLH|9#cIPO֚IK\~oθJ^5n7FSur~7IȄg1@Se!F;f]ϱmtz+)?tu>V?<X\:F+i3@1jRSQK>Isq=_z!)ڳLLLԞttܳ}K_M8۴n%n[}1~7Af8Un yg+{CKN }؎hBӍEPFbe~nR6EOhRu)^WI@)>t~9\u)=Ң"i }/=sgG8_KEe3֔lfT'&aQW\Ic(djF ĉjx fO68*EnnU &3G_u#,CjP:DdEl$D.{;%ŵX2r(蚅u5Q_݌9-N9)ٶŚ)cjhTԋk=) p'v䂇otW)2Kk\Z:4:T5?d䤀0 .fxVLϋ<ԓI"dR>3]ݭnؽ&]Y NYN$BivqEBB֬\?eQRVIvAgڀR H'UCR:#Jȳw7|#rQN9#J t5vmydj(TRJ :d,LKp9id|^0]| O6^F|Z,&v=0 Oh$i[z>Qɤ !g>hIg Z~(XZA]R4Kn.#C Ei&Z67z̧[v59c |yߴdscz{Ɍuf^s蜖 |4 3d.d=M uN(2«o7}eey8b $lfWYN9+^q:b1C 4RQJZ\g)Ֆ ˩ 9 ADIBH"X4XUB!p-h{'ུA&ߔFV`60lmAn WJnB_鋟C_zf\?dɓ8յ$[,vW i4B[%l OzkâPqH>? !СOʓnG0/<5<Dqqabzuwriөs'mrm,%d8 [ʃ62pvb1Q9s>iR;M=UJF^ǝ0nEųD|q9awYY9z_l)E,=Hcc-xOR{hbI[8z<3!LZ9S[ @)Wvb K8w:H/l_~~;1k3O|2FmI:8hW'ƍ."|.;8ҙЋz$RUaO@]wURl1C1#tͿǧ? !)O'DmE_ow1<&뀏h5{ 4iҬ ZP`yE{^^)* HN($$!\mAłwٝݙ?`DFbnDPp|I%Ï?HS '{lHC@uw+JbѠz禢6j6n|Wx\F ;ǜx'pyq牼<<-3_=f`qfA9,r`N3ɁIcUV`]Bg@FA`9B~jfoe22R#^r)C3kZ۷!lHTMp0ɳpl60%Ũold/TR!f HIJkpH 3j)9{*}bɒ%hdbT¡>T-ޓkl@@ RI)0q$ݛ%Od-BO;櫰$Pr)z=RRS ر~7 gMF@H4 Y "w|ENBHuBTHB;Qm8}2`IPHp/4M\r=٨`F"t@@scn6`1łsf+")/ O>._re:()`2<@ q'8H?u|^.PQ`ҷμtzdO;[~/679@EF__`RQS]vb 57 DDFuu?OaǏO:P[ ߾7`UrsRq9wHrZI9Q^&@5H}Y x{갱zG+NPG$'؅Ш<ըPgZ!C[HH%"dD23D"MQY!\F8SOn b Moa#N7ۂ;=(YUe EJx2%> QS8v&{گk{\5,[iM%'p%8 ɕmsDj4 hhh@Ba)cghddg 1- Q1QLALVKhAd:k -4_㴂}ܝ($CE@$e4pA.ޭPzi|۸:\β8ι`7S C[,C"QU?(!Rm.'`ga աP4"#Gˑ91,":9xf0$>TDkMt \w #mv) u^E#nFlۖS/:P2 `s N %ti0Q|k&sI9%_+{@Oi$ϯmm~;t ~kE"9+ɉDNF1,qjy@Ooy;ʼnynﴜpvBɀdSc3voى#E,@Rddd.%L>s9$`_FO;8A6 E}]zē Kȶ"̸"o/FH5^dPp2WbH 4(.*+ap";7iYPdylV8h~F474a`9ςp:]Nl3| Lm:Q"Os Ix{ᒇaPnL6~\ ヰ땰90}8ͭN@hzz_:6,^掔@A=&E nUE%","OoM8vX3g t Rq jI&N*4iH R1/Pr2i2/Z3us[W\LY ŽjkUc8=*7F-_[Y=(x &)HtLэ~bY'JA#Xf-,9򐐔4ui6 ĎGj %e!䥏tB@j~z@2 %*  섎_H-} Qkey%*Upa!Yl-p}"A}GsoI}%&n:#G`ݺuػw/qF\>gOFB0QIԍňK̈́MW0*śD3\ ؝MDI&1[b6"11`K;}$J×2{ZO;ݹE#KY= ~((ZHRPI8?'##dߛ[ ˫QYV(#LHH@rZ &Xo.@ȯ>ɭs7=Vr5奅F]---hlhDYiʡux@ BHh¡T);&a$y\a87ms\xz| Hr< (h2Ħ:_-:P`L /wV}1*֥_b!J[L8{BϦ7R2OZ-8u]K@[ G=~$RGSLY 4HG } 3Z!&|LIO9Ke=| \s)ǎp0 0[Ub@$2=A7Bc!!!X%R(boz$O'oN85Ϭs&9qk`2;pۭo`L I~+; ?|>9I7\OF`D3k \iu0,7^߁ڪZ+;ƴVEӄT";}SC 9\ҵp:$ j F6݌z=FtZv,;*5" hdJ#oggÁI9q>~g>ϕZ?BovnvD&Fp%E|=gs=B PrmL$hdz͍05.S#.@r֮Ech6}t>ӊ6 ڎDȧee0,,]^$=̢n;yS[ +lOqJ7N4Fx#,GEK[-[yWW6n$=ؾ~(^*f^@$Q ƍM];gP^|z:Gp&xU95_WDwJ8'/[E\x" ѸiN^nt)s\!zZO-nVRi-)h)n@%w ֨q>fUWT1q OO\t{d|B9=?؅̌ #Tc'=g"EA7m,/CYf1%ct/%J~1)uRtQRDyr 3G V' *^jHңdM81j2t 59]si5A6;NiU'+%~@ @}NsukF9vS:fwk ܽہP`@.q7 ~]? l:Wu*{omQ_o%Kx8M%;~}\0epw$A_|2cNˏsc EDrq׬sa%Z[lŋ/2OVU*Vx%O98z$}%$|D Y)$g"6GO>\5@-y%Q~^Yyt)0~,{QXM0F Z.{)<@-dribB{ lVUl rC~.ynO~\[q9>ڭ3! v% 1ZXHn%\.+9-ľQVD׋P']Lr{i{3W%_ B}|-a-;W_}łY? jE%":L~ކi\[7aպD{`N <~> O.C(t9F2(5prJ'f ! <CYp[ 4b[/&ctIZ'r2%"`S%H#iD.sN.*S=Yǟ^Z $pS"qa`(E8|+0[ vd \Ct %?jj",7\D< a|v*tĝ>y6ؤtwPʖu }Q],KTC|S8' '-gFrjcigX9Ĵ(^m%_m|G9P}|-% a__cܾ@&D󓕚'zIPs%yMOe0%b\v](q62$''VKĽ~g\d$Ux͸+1<4v|R\z#p:*r /BC5d8uG)ͷ`Y\|PB7箆 fOv<8gw8#!"䛿[` LO2rgV%8 N (M|ܡ״ܝvoJ}ϵuC۵Λ(IJGǴi3;&pA:TĪ0ppCH7?BկVqQXa+.= t:ņ~Gi9ԍ{Dz\sw Jp46&`~jl3y\S/G|2=Hjp>QPktx޼.YtzV.Aa'uw֯ꡳ 5(ELݬ+ 3:cr,U{Sɇ8Q1zCL~s<B1-yMfWX IN$ED"䐣}NV p=k݁GIZc7۶mC .ӿ `2Esd-3oSnr5guO#&-{ʨ?f3g(X?d`-&r7sSzx Nľ"ԛ$"08 J Hy,ݔ(Fh؉** vGw!8Hd=db|S(n%Gd;GN(]RUS'27$21{kV"qtEg#L VX4a'@H)0R&HfXðIE $Qe QɪuhqL[ˣ 9?8-F'Jfa6'vݍ ﵙHY\!T%3#T*LF!}Qkl5ba0 #9T kM-VAM0đE.H~VdQM{fy)"^4Jdl,Fj')2yr :`D%CR|F NkT, QG y*%!fj۹|g¥s1w0BLDѕS Dk ΔA<*L|*~|&s[3@T|J}p`3?Cܫ?:`rB`N8tL|m(n疂! "Yt]vH|z>'A8OyT pHQQY+],ҌAD͓W;5䛽}}k>@=A$V*/hͲep5`PxaaVkACߡx{5n`x g6x$f"7%2Br,r }87#W7Q+}r>t)lPTR&5Zh4kᯒ'gB,A"2fM׍@"& ,!byZef'*?D@oD5 $МSfƫD9 ø"Zn%Sq\ V_)ٟH~*싧G㊍v̻{4&҂5& esѺs/^_%’7±~,lNgc3a+1ʾ}1 ?{puyhDCg34k (lN7.VᥗFBJF[WUXKVh%݆q׍wpe'ZHQrD&gቧ@Yx={yWEӥx\M%x]=nyjr:Jq}d Pw? z eP.nO܄߷u/ f,uXOl( sm1ccFo>[QB~!mРA2e ƌ>}tGIpBڌz 7ʋCAyI7 &oÞ6hBqB*.EB!"@@fI9v2si:`,- dʠph,nEi/dVNss%mm`,FG֦GP| C\v5&r2qQw}h}Xc?9a=;IܖHLNB{5=,Y!jqho9J5k +PoU 9:j!m|,ƼY bAM!}I\>IGhoT8NJgUC:~A#}?Ͷ"reEd?<6աY y򤾠w?ϷտJ[r~xXW_}AAA dLwD~~A Ҷ$fB? 48l& Ov́x&Qӹax5b20JKgRkKM5V;rvQQQMh#6$Fv44,z%\L@y e4Q]a:6*-`Сx/hе?þ?:-) =1W@50NvL43 :[˭Xa֜<$$&`PX".pP-LA>+NّJ&pX4PC  7A/Âg9[ *AtǚFu2 *.H{6˷+Ecp5F?"fTzEunO#9_Yp$v܏1) ;mnbs$ d, )Y$xGZhc}? HJ @H-dAU#lC7Q%Lp #B _0LGHqЎQS bXX/}Ƣo7uu19<jX]ڥިoZ[6(OMub\~4رUUUvY:{+ PÇbKŪQY} vU^\)nkBfBDZ ^yj>:\ + ~8>Y|^SAsl,#Ԉi}FkGQ럈2&b|N %֯/KKK&a7ۊw]>?>,ZQ?KFL7/]8 --uҊ凙F`ȏj{H)!hU׶+ *}3gf#ج.f Vl6SЈl LX/S@I}(%Vl!&uxSׅ`=пGxhtr&K.[+/bаo/||=Te..n# 0HB$$=(FJQ()0R+dž7e5.02xჄH Y@&GC.W+ >Z:|fs`\40|LTޏ>Jă{qKp^v[8V*Jݖ_`vw1n*: š'߅yILGүÊ(ʃ12;GsB.GskB8dQBط =E\^UqdB$\xᅸY@Vyy9vSaa'Q'z 0}e5Lv& dMC˄Oâ)x㋯02>4?<_?v1R"T$B὆‹"@HY{q7"c\p5oa{7;EP+huxu?Wڸw<~3qC8VZ,^6R& z˃Co\isϿ7c(P''10xYBgiEϾd+cO`ܙx\k\y˝~&eUB+1鶽_żA8vR1^2OAg?1j\ewƷKז!oT) t._֝,˃I ^X%88\+Pq"z;S "% J{ӯ/yro꟞K뻫(= 'ޑ{%e8Xmz3tU6L>"#k!Zl5@:L56o$ &¦5Ԇ õ%뭸ނ]e"Ċ-*Xk _6UDZP@ ?CA33#U&X \ M&QLٽ!L3+R4OTinJdp  UfLΠ?V0a^fa6u,x?rRcRlj&(soNy "BNOsl'ϒjх]x(U>vة5L"o9FA='4=F#t~FL#BHbp$!jDynvq߃3RTKpV ;avP I@$L7ׂ Kf(i 鐻,Ѫ-̓"T8^x,ûOBfCPf8,ƥ%MDѪ3d&|{v|ɛ66RC- v%3QCݎ`\zG:Sg?LGKx Cp}!;fCemZ2aa !T"#/i$|% ʆHk)gԇϙEvb8E^t1Q{QPiFl^!m^iU& .O"vxXpTqkW<6o2'^p׮́WAal1‰83Yoy.t?2gZcnD.4(YDe&Y϶N۹PLAgwC{'[ 19]L>jBÏ4>.ɄFRz{.;flFϻiŗ0$%4kEFA 0璫F|_2-"#7; GKu!} -Vo1}*s`_d5`Ɯ9 .$`uA͎u+=DEѻ !Fgg0Iނ\̭)IRz2X+K'tfF !N"c 4Qhs"npAYh%\y ~UbˁJ\2bti ^|o `a`<##W[V :6 ǔ ~׳45 /BbӁ%fp3Cxop &<K^>"zŨS@{ ^xr_CyZjv:%[I;Whc%:(F`n6"OUԛ`XLBۼeŵl@#X 5uQX1tzh\ ٤q2; NIX9?nYlvS=J;hp筷ފ~޵]-fc] CHX[.8Plv#sE%Ұ~RmH cak/YO-èmbᶢHLTFf h^+Avv0rbv@)jۼ*lqy?ۭVRRR-0HK51ةN%A"c@)a}+ #i͇0ȭd[D4gJ qs#AS=ko@ˆ/lؼc9Z,Wv|ޛHSbnP,ENJ(^{]`CBf|RC$[E(ݿjr5ڜ"\8}*֬|_07.o3^xQ*dU+WDd ?/>|u% U#=.n mzS1g82Ocugx/q^|x2~u}E(.mBRr$ voAf?}2R,z1{^r eT2|{b8v Lfn-TLYh.FM0YR ȑb38YnKMtb8ɜ6tIrN+PUɱH`Qv 6X"z;Z`MIjLbDd0b<}<e?%k&ioD ԑ>ާGkG+&#וh$z-9,\"ɑL@fZ~,F}PB1ed*`M&~NY8į7:`aSA몲.ԙRbs#;84_MJ{-11m\r Y֭[Y/Ks)SJ v-~ٺنm[%҆/Qo} |%\1}VTLaVC+.ft (5IdM{0 ъ ?=(^%D_OʧâGecD;Evs\JI E>W6_>,DD񆇰Gf=q)4@RG\Enl9qwcJX؀Z*~Wm⻞W_KcnSDAnLäjxx*|A 2t%k4pt`n9e, {l\4pB( R,:/B]l6c]Al~/HB[wjBī1bxde0F׵A~ 0fR2&g&Ⱦp}42:2&6B0IffRlGB[L *i+F đ+HOKBuU SC:=P[SoU*4!0*7T!9+)QR\(A~BROx̨zc??BZ E29Kv&^w-W郱U Sf_&ظGA`NƬB8ZAΨ1b <&?yvLJ`_{ UusN"lE!ĖߣR(C &i}1[+Ł m@j^KIΣQX2e{?Eލ<0?YlKFnr(>N i8²cT.AR|o92@Lfp>4BaS?P2("/)a&﮿ :kUaa$$ 1 uټ}]Z D&J~q֨Y;u#03'>>%+-&@hX cb~Zc ~28,)wd5zCziTh|o`ٌ&Pks6?>ר  kZm{kj !,4 fgXĴDƎ&&ӔB~JRVlP'If`)A;oe 隷zҊzDGBTBP1oYi,;T2,1EX,p׫?Hx䋃=y# Rvl2NB%<?ߌVg8\7 }C֧?-&dXe=`?q *K "Kp|<tmtTS_ w[)^| 0(%շPKXц·qSBD n\:v~yT0gQs#ޣêg?ǞPv}+ӄ!&9nbʪHJP؄Sz4^ލw=1!k)&2٩|f͜={ pQ@Vdф6Ag6"o>oY_@7yR^鐜l`7hYfN.ѩ4!w/H5WGc װYFSS]k`܄<Aw:ٹQ@*d{U ='D>O<佺B#}4{rR dn GDNS<V',2Dr5ثrkSfi9Fa*dmD[, !ǃMܮ҂biRqn"3-GsѼyT.9cwwC:fty3Nt?]wOX>ۃ駟f~ش`Y4Yff&QWWǂ,Yn թ| m4|+xY.ϔ4ڛ"pgg2[ -0Za %t$4!}' @@ \Y9oG{#A@ِ΂]v+\g& 3B J`"T+BTN6j*?n2\V֮߂Ĕ}GAsGcS63 Vly&\x%* Fdt9bS{cڨXO76[|!) K/kyf\; |[ ´K"|҆Nga'+wfO?\}Iׂ9l(v QMD +=?m~y 6|R(s0{lV ."N3ݥk''K~udrjnow"7/H,J-} n|PW~J֡I ;Obp'vr|mJ2$9<&Q%[j*++O?a,%MQDmoO%H3 ?LlB @RL"+yb; .Kg9Wy"I 4O*Ҙ{s S .!4ь88ïx}jEbA(M+j]孚C>ՒUT;bsNN'VS㣷˥O4+8QdD!rIg: M/$WLi$0'= >RѹqܓF<@JVX 9>ըo&P7nMn|2o޼~e߶y;_T!EKc lf, mY.:aߢ! vg dqzB*] 5H%1}wO?/>TnV`!SM&7ɸP)hqyaGbAn\&1~~:\ coF"^Q8W\7֋/GrqIMޜBť*;8Rx*NIT8<=BV֊p}bp0F}AU럐}R@U--&^BP<8݌5h%BPCk,xb||< QBG]RKꋙʀ[!tee%ؽg+' ))YtA\fX%47V[<}:~,~<3.0˫MQ+2B}Y O9Ky?+ Hq`ix} WbK G08UnVĴf||SQ ILVhZ ⑍im컿C_C#T}m l 3u*aFa 2db{g0H ,`lO>em?8 i]dYv:.:rz*ȜScY-}e 쪠>-:w臜ƦV| iHINBiY)mݎwzj{uA:n&)Url޴ Λ95@ ; , ! J((J H*"" HHwvNϼ;f !{9o}qߍw_xWv-2yFLc$!ӽgϞ4)Qw')-Dy>S sy'prPK +Y EЌ.ӈՀ^ lN |=@&!C˘={6Zvt_M姟~bKv0x}&u+f=ΚY ijh(i>`ꐫ +;B]r³5#;a%3|b} y,SLjO7އ* oO| & ܭrSpUPR`EϞ=x '4[⺹I›I<Ү;~SB֯hpbҪL)6dqJ&Ͻ\@5YJ{fF&<Ç [bb9 d_?S5 7ߏml B)Y T\)%bcTbeӅ}9Lrؖ }~>sqy߿9ٹ4Z5VZkBo4peNF$ 2g.׋GRυڜGb8~8l߾~)4F 'ЎSNaaT A&Y; ?F c4"+;ZVubʴ9Z+Ԩ]3"ʢe;&A+ͨTN>L%WE uGzR*Uu+"ǣZ@+Іyzi,[ ]Y< :aĬi_#q}Lü 'cbۭ3‹|| Lb_ Bq L#E'5I-eqEO@ۗkD~|A۶mcƌWQ%b/S (=ƵRyj(齫Tr Sg!H&T)@^Ɍ"fug|}J5ALV#xO<ɀC2PBy# ?A Zw38$^.*8dN'z&rrK@Eg&iԮY*W3s)}O{uz_'Oʕ+kMkop09|>=\2riMmA"nf *0E6vKc VÄ` LF=b.!$$^`'e0spYkyd}_i=ϐ0f6~iλ^]Y*fd'㭗bذ=}t#qR #5NǑK8mP"4G7gU|h$ٌ7={c۟}fe1٦3L퇉|IMU[`4V`ѣ۰]hYr c:tލ Z P*: ]!ؑ@vYTS 󿚇ڝЪ}c;.`hS"voZπ%h#RЁʠRʞH͛bӺeZn8/t*=|J#?%[pURfM# ʑJD"qwJjvvJq%?{rjnˢwk[-I-j,1Z"_& Pni~tjYif$&D&}V:R xzu1x,9ІAm!4f#+ma5Fuׂ_xyR?SA HBL S;-㎽l'@2B i{4wjj}{(;y.E[YRFX}Llbqq!CD#$*d!pI%i"V8},>hlUA5R@); G6EL7 ػ (ܴ#G)䩓suG&M` B R)y&vt[RZ20G NJ!q\~* 6&Sbh@(ʗ|)]xokWa欙Tխ3IRjِ{ ./_>~GWBS S#..pD"THXӧw9-[tMr@4GfÔ,T7,&S`Bel`5cz —MƙM߳  ^ ! 7e+/X': % \@lTljRP«+VϕF8 NJ?]?"F#?d٨]!ڶj Gp 1a2 YFC01ܗVi^:.< LJ `7둔@#HKLFCisc#^A^;кc4Nd+b_Xy#0:ssоsg,]*P=.'#ɔL|e0طwBâؼr{&0=4-jO6/&ElZ7l+M0p!C@LJ9[D@wDIOpGmIMm@f\h$pIm+_n'Bo|އż[Jw-{zjP؞@@;9i(4DmNÇѴؤpp/ؠO:N[jZn>s;^{2d?umNIMDB}}_۰gt9Yhޢ9~7֪dz9\sx/Y( @3v!Q\>2 ,' `#K52-Xw,\9U5UGV-y{8͔">XP6vXN3qDo]3*A g6tD5[2{AR%~9&%sQmժUNkW_}5p%\;ICqPj'xW.r܉'Ѻudfs$ Ҿ~P(ƌt zQp1ΏK<xR>BV圬L |li0o< mÏ`ǁӨ߬x /HM$nQ‚`eP23n@jychy($a܂z3\Kv>K,V3'rjyKESxn{|!>u.gԣLTYKX7n6`љ @pͽA\-uzQ\.|U\Ƕt/FDGϞloƒPEp^rtwKkIۼy37o8Eʈ#xp"J'_n]_dĐիCrrRS>m[GtqT(FӦMi>5jt|8H=#yK}L5N9 {z=~e8Flʎ-lV(u_^K<~~V='mqd܌w#8L=^d Y2,gD fRx>Oώ-ݙ"ŝ\ؠpԯ߀׿rg nfޯb"C rhѪͭ/%Jɩ^gғf Ff^ZI#$Z?څ%i8s b̿7ҤXڰ&g"ׯߩSfMG4[ ;utF9koOԯfs@oJqÜ_͉IA~B&KmI#dQ EZ;T0rE,]k֭EO_ -πd=0 j*s+  , |0ps0FѮ}~i,/e}nBz J>%\:}rRPs[RoYPR# ΝBbj6~v&{ 6d')N]eN_,^:4]ß7c;o.^uC40)ͦt<l)Ly2C۝2AZ.ńf"t̝; ">@e˖aڴi> b-ĹL3f2&LwAGУ8ԯ2q(CP9}: &D!u6 &#j֨g,cϡME^JOXr |ǃ!D\9md(`A47]zG7Rhq- q"]'sHQnGtzڨZ)V ̯4.XEe0IS H|I-;i@ x+ոs)v2вigGLׁgg/w3Ya9&V?0] ]›c@ϊ\dhc@Qdգ3_o |R=߾ 3?WWG#χFLgd:DBf:%c92 +7EMAgErGȁ>?O?vi aĘQ[6^*?Ҙ[yhJWɻ}Ra+ >}8y  LxzPDAINC64I) DLs#+cɘ1{* 8, +ļQ߿YEZl3a]:/Bu} ( $h" GEK9 拴e$R0qQMBIBz ӝرƤ9lR1} f| /M&٫d'8woz]w?VXs '팴$"1z:C;h5 8p2l>aF.P.Hy!=q;J5йMk3p 2wFO4=^2:Ğ\JNh^.6 a;\4Aϗ+! YI<5yXuXy#;Ĩ+3-JهuØw4i"7 oXPш VFO h(De #oL7 }O/FMaCѯO_ . ֭[A +yn/yUjŊLIQطJ`Ď|x K,^(t!WA }=nx$E &Z20递f5Aޢ)E~7[6n}\x7s9GQ4ќ?(n k(ߌ=XЬI""?Q@bEBL@+#Ujs5v|105[òW#+tY(EE+ېs@eZ FѨVmX{c[|.Epz^B?b᪏0kd.=& Y텤swX[X~,8p:?o>>?G\/D9reMN^ ԱbKOĆ%Qk+,%>~+4$ZGEH\;OаH&1(eDLX/uHyQtSq Ƽ_rλ&_ *'F3t:Lf:]O֭0nXԩWQ_# " $"֟`1|H~zGsz/$|P oX$$BYT9@IɌBQdWx1wN$ի4=*dnA-#b%ۗGjH{Dѡaso~8,:/ϝ^60$'&㝷Ʊ0wBA6Rɐ#9"E)+(f*M cxSU`: {-9 27ði3QBXa[g}_~b`)>s6~9c`?!| z>znj I,j 2/(ڄO[~Qx` "}/֢g?5LP#c9o@Qvw@ձ_v-mqҸsݨuHV$Wdآ$M]Ff11x3j4MA}$_~EZɻEhV,xs8X ry[rYـ&^}Q)㼋hn ,efCY60p 9GLv36#x`2蹆3˒ÂJ!ް20lMF6ag j4 [yMod7ƓU`xNc'WɝV/k`t7/۱H^4UM,@ tltko}iUu,A,=-dYoGݛCj 'Z&\Ic)ĶR[rM/sgACQNU>Sgt|^ 7ɐݚȯӹ7S<\CJY||MdIq?)$}J@J])`mٲzroJ /M:t7{-0L\cۑv>8Ryzܵ&wPsM4 4M (|Ո׏㮥 L 7fs|7`ܗʲ,,1Ί. )d@!ˏ43D4~zdskw)~L0X  +LFtYE3ףm_ObxsU l2] ghL.cıdz#!6ڱL.@@xRsY+`>x{ ? CFBaDmU*. ] g` ݿ`kQ騢"?g/N9o ,z6;+i5-V۳HV"9 K-F$ѨN^}皯f 4wjss25)JMӖP4s^ u[!wb H3yxlwsh1YYt[߳`atgҥe˖%@PޞM'N#<3DBTߍ@dbIy^? b-RiJs-gI JLL/PB.DݹsgG+ Π (FBp19j`LܴPxi0n8L5&z!6ՕrJX.# H!j @(["BʔC #qh vkO=1t4a:JDBnS&^:6o,To-Ǩ2~ˁhƨOEMv3XS쎏:TB`XeXG/_X1n·x 6kݍC&4+-E7ڠFVv(W)֖6nK8^ў+en /2;{t(6EFйK@+ʕ/__(2Mfy<}@Rv^}UY#W s'fpGiEK nXsgJO)1 h1#[VRn621zTy'fqs2~٘ki4k"8D^G_`2+}0G딞. 1!lX &F}/Y&,2OV: ES VR5QHHZWR 9qIA[iJf~kfn WӒl44k d-An֞RrJ}'Kϑ-xs8l9 S`XA9,bo,.%nK2A84쓟25^cSXr \ yax1i~R;ggT^ p$0YVʸ&nu=?]Kz!QDs)F;&!Ô'tCB…(U\Iԏ_] &'(BYF́MC!\*'ɄxF2\RLX˅\#/cgShM-B3G.?=²U+r[7[N<9%;7ԟH 0!9rSN|{ j ڲZ-/(`Q\&h8&xPz%7Ͼj3;-ʫJbj4)/\ʼngY ͛w^J<(YThܳ$ ::$BTNrZ)kϵ {$@'1q'?~m&L5J/Yk"|;p')+뉚X2X2X` j`fY ::PG OvOIi HM„_֏!i0sS^At7غ>||9} *də1c2!(P/xx>L5)ȑ#t;/g4mR0guӅpʔBbe;weRj8""mo9d/J|.LwcDZٳg+rs̸q޹><4q(uL-s=n9REZ`SQoz/7Sj-TL,6vg Xm0d 2:sѵ2Au$Dp>;#_H2kWB*}>%_/v ?|8 T EC9ızYL{a0kCM: DC?/^Ĵi8ra- 9aԬY+Wl cߊde̜lJAX)0G|%T鬯gݞ!:e{ "RPwILZ@ekR["Tb~Ћ'@/Fn%$$0w?j(@fe1JwMW:BCCyt?RJ-""$_DŽqއ fXNx fpqjl.E$xB슞''sinMnxwʝqP. fXRř 55{>,?n;]GOpG󲊽'\sNaFj-1r0is`mTS*~ w,*V`kDM忁Jr/9֭[ #V6!`P^xF@&OB CӊN]CY4[l6;o֑?1} Z D{ŕ1h@D%kp}=:bI_,pUd\w$j4]\R/x>!*DEP_$Cj&D4 Dy_u; wwgɓ 4Pq~0- 69t>TK~թXQON//`!ҫ/laPݤ!_yNIw.Rmƹ_&" 鹋Íl&*йO|J$t ug|~ xǿvŸC&7LӈΆbէXxyculm|rggEHh;F`CMD|{DxQxfx>J=g/˱ӹhԩ9 {UqχQ7c2te#%9=.b5ZhF\lSpPQs&s#o9w߃ x3 QU#)$J4r\P; _|F_^&q賡1^pSܛNVĠٴJ^o-Zlmvjg.a? F)*iGiۺFVL= S4r h8 ?owLM&/XstS)LF-/s9Gv\G$%|wYVJ/lj (ꞅK|B8\|m~fQA V齇 SFkYPLy?Fnv@.x|ȧ*$"+ρmr38|<v3b أB$C[)|km"J|a5B2Tg|6ѡM.DV*nT_':;JjE߹g`͆xd@[Tcy R&v H2 \YWs9"c )d!bՇড়rPF+FG1<<alƣ.-%JQpxCV[~6[L}<ğWHZMhvOX>>79$3ӕp}ih1fW(Y4=߯' /0ؾd3'ih@%]VGrR%,e< ESZq~Q'#+# O#PܮTG0lΖ' hQC%>J~{r} JU`j 1-,+C'<{jջ (cI3|8MaIsoF+&L==cMPSoiɘxT9Re`>)m8sƔG0bD2|vK_ʙ1?2z~E| 0M/3< Lßja 5epqiTZ B Ko.b9 ]qiN} Y/՗pv(lg.cIs볕xqbu(NCzfͺy쯎mp|I| :?~sD`Q9˪ʰAe="k6B0-|B(FP?TCyuФxv[s]B~IQ;|Vb-xrPo2@T8+ПѣK 2^D-( UduසvDmx z4ڵ1{WD!u巰VAJf#d?ytG@`:S@ѹ5v}cI1DnޅS{aӮ˲8(¼aER$^a繢=NZo/VYSѓ-WD!" u_O<.c}@ƣ{|={v4M(݋\ġH۔3MJ 83}ܜ6ڨ @^)2L91ۜR!SB*aIneMC |0xMIȖ7Vo_*߶SlWϓ5[b`Rˣ,1w]@)j&&kœ7\ F: \9#Z=دb]|2>+ ^9;|/ Oƣj!8;$ř5PxM5xqdgge63 u;ǔσ^Xa<Tq.`WG4p YL8ʈZBQp, Q(]X#[6vkKOa_,FL"(E1J.X'`*HXr /M+A"g# *Q 2c è Gӷ `R${_`Bϖk9&P8-hX35>6GL!ŐXt*~ %D"Z$'A;_( z6S70[#\"*:wұ1á :〆dL8Cn% 5[ڕ`m6ⓌnA)GiHBM Z7lk0@r@l9gWŽK`(+ /˖PJ5\E#@eP j Ob/9&RKa8 w#+"fk/Vi]@P bt6"ԨnÏ3S.=cL[G HAC^@.a@xFP145+قW'ۓ; 2O^Pf0 'U spO*:|qIoCSаi-@Yu.I3 [Q9{E.TQ>Bf*5v­R αeաl$nǩAiDv/Ğ~rn!h^ˇ 7 (pЧFA-%EFgǎ.2*UA1ÝO$ew1' &hЀm~l$X-0\ĴoQ 0oΩDh;z0!` nջA5XaB`=G抾>QӧO[ms78;T: YE\3LW::*mWرmoضmx <ȅ m6ErS`"-ˎ,rKH4F K-,L@3bhV]c#Ԃuj':;_Z~MJQC-ىHHK?Vp)Ngfz.ĢB޻\VV p%yzpߍz.-}A$}W zɊ<'\-P_?4X´H1e;Rf;Vx~ݾlu dقX卸z/LLË?| 60yHWx&Qz^l>,]% f/4+p~J1Ü%+))IJM:rHGZ= Z jj&rZU`g `RRJLJ)E4F% Χd0J buaR> NjLw"ȁWa[5QڭV6+0|.Gh;s =-P[?zET$|3=+cg*$p>_5D= A+b>v? cD@˚۾"C!ڸKWebǭZ>ωT>~5~ǡѹsg̙3HC0JJHfJHt@yoՁaRx*3ƄJ΄K6W-١ȸv[:L`BҕD@;T XlsU"Olx i)5>}4X Lna!py>>\(^" !ClQ@EHds@:oL@CZL6gϵUS:VۊR(=A a;}0YČ'k@T:tlѮ8{xLWg=p|wVqҸ#4 ƒ1oxRy"O`.pKdDrR|CԨQ;ۡ˶!SE'z@Q-td=5I\Psi(JU J:5a:^zR/x#_7Z[^Jmja7o㟍pHO@xDwa ƣTr_p!jժf{j=#p[J؂ `0YyQ{h{%[-YwC%禐)$@B B;IeUwi~gfv% &gYΙ99]>xǔewEpvzh9{F #H%b2&F.f(tKq.GV*.f"jdxE&o(5 %l>5QW}0; P ?*|kxogJXRɴ"cRpJNx!diWqlr]H!I3Oۼ{*hf_Ǥi5+5|ab ywV[be"WɉȉSRrJ}q2~ ^.*-ܪd '-^V`J~@&Ph8Zoo@Hm )e>!C.2D? =2D["ˬVo(oHpPÑ鳄Gp47DGՃFC᡺ύuCb'XjQ{k(#v`%CI9bv`eZ|]|\NnY=DmLyN PsݼuSdN/<f4:`}Q=eةS[e@-Μ9&%aݯcFJInKrJF> GvNL\lv>W8U߃d ų&c^;8(q`\ 3ٱ}icKT{33sãO<538;'GwϮ}[e~7wuQJ?^T;:mPRbk>W81sX Axa71ڥ%TFRSc}։E "m $%>O˕mMBBy+PJ*f9R 4*;Yͨj= VA. њ8z8族]./*2pj?^*9]qevP]Y%惖14pe^o<%*[iw'S7 IX(^{&d)8=r"SMl۾Ş 3_Utռϯ# S[@lvm'8qkPWwSY8ܙhfBo0iߌy(O͛o&3-Fx"=*\LnRc}~\1X'юFϘ *wlΊ_luz gwlK߿'_}yy@S,؆`ЇZ+kA'B?\^i\vn:J2HKdT3R>]u(@擣\oй ԌBz+@t @JY#iZeW,Q~|F%[ 47~88#Lsva,-]׎OVQm {{ VLc1~~~JňvCa,㽣N"ޤhoƽĦ'KִB&n%Mxrv99~ш QkZMWu\o.6eYsH si~_"4Nmx]uu5p55{f))3gq|Xn<-Mg|x|,JupcN!>3&gh#s'#B7m$plFW 2o~U ^ʲupz.;~ ׃Ammmlz0Kn~o{L6.Μ@lAm^rcXj> ]9^̞,R4]us&_uPΤ^Q'`DL/gTM]5KfLf?<˭67s~߿&S_{A^Σ|| ɋa=/ˀrdϫ֭Rlm{Ose(Z#lmӭ:zLÔ\5**4e-@M)4lЋ8 ҉H à^퇢[l9 hR{\)A$'b)T7L Gh%PKP\l#D(\Q4vryA2|Ph~-䧎>GҥPFq1aoаK$ d,VLzzGW<34@{CV(E1ϯD`\7<x* ;\QyN9qdAJ2nnbF)iMUX-^ &,XĊq2'\c|`1VlwQ1*Gu#'GG//g4;{m$aLb1{geRsl&ۤZl[,ʤW&榱W3$JYEg:Vz;&nA]KHa|σ0!!I?P{9>!ʦ߼wR~b@er4~{<cLJ'J%-Z#<Lwi_򕯰sΰ`I$0)R$V;E}VqN;ZGJf~'8rUc>~vS?[ki 8}$ċV&'5~:t7c~?Rvmsq% ٱm]x55ؾPdgRV-_']X̚:Q˄$-o#<L3'_!ⵍ\x 4U25@ITX"Z+wR_W#L[O/-7n$@M.EOK 'Q_ { }o֗@!$>o|n7_߲`Mi(C |cԊc͵6^~̵14ϤeF>6wI2gEyU pڅR qũi;=@eB-7b(Kbu&+梲xg9X=hR6AOx XUV3HÀzb4ʑ0PjWDEpnn/{8M":\FY-CsGa(KDB bO-}DhBGOI}4#=Z> O=Hgi 3͠"VwNI!v]n-1^ԩ)$dǠV fw3R4/6KT.*Lk]?q1ue;IW 8SdX*_EƖ97eS~Dt~#}l~55$&ٿvBj>CUP[KsF*l`ޞN^hnЩz!d&twu=U193 ?yA?g[Np4fC9JMM5us$ {+ 0[;a X]xz.Wak39wc4;,l81Se3xgnJg,cf$l+MaIr17\o͎[Y0ƏP#PFɡlʰG)jSyJOCIE_HMawb.IW7cŸu&%xV3!v'/LR4 T nvtN[ޔASgٰ a% 06021sύN<6PPe>t(?oTh?*P>Q气1QS&,#YQ.(m}VR 'hCV )u~Đ:vJ1F6Sx3=928>c+EebN,>KVRX5XX=5 l+(Sֲmi|1㮠 YJE[æFcp|[6˖pH͵s˛jy I%0744RNKu 6/KƏ͛[_ѣ# 7 GGOpԨU5Lnl4 d'kRP`u!Bʏ{UF?x#sRF 1T:q+L~u/•/^!81&7s_;N/̝5ަf.BE737j׿UBFz+-Sݰ2!utwsP0v<CLoM\\(Z_t xAOHձL^/}Dw~ NEnn \U\<|$'?‚@p%Ҥ0wt٤;UU1\|0&J z?ȉC[@J5Ʃ書~rLXLy7ڹdJ/@ꤥލ_%U)4hL,Yٷn4eqQNJf`t] }Ɗ>^[c(X>_`ʣAJ  68J6!@4v^A-?xc~Y;8?ôn4| aEM[$IkRDYJ.#IN],T?8^BT`eVc?ėY_CEQ{q)5 lgߡoJ1ǟ!KIˀUP +SFW]¢8zLn &8vUHvS )K(xi# 3[~3R=&oP9&z*+"ڏ0Uշu/ ̿a5._YKP0r Z(4$$5ܐq;vk_7ty?ǟy?1aYK)}lY[)1 dua!I qL5ym!dp_0qmJ&GO ^#6|,1!1rpuԳ _PX>[HG]p-GTfg,_*qA_ e1d)*Գ4Hf[Tύ(EE*(Е&<$wHUqj4 qu7.ch Y-$&ǀOIjVn/mԱz$0*6ʠVLmSD U#C)F쇫B lEҸ }Q\a9~?#UO#}AH"C cZkw"puY,iRi>RKvǐO?S(J|@xV"-~ђ꦳{4'oaC!H;[:{ ;9/X(|h.@1["ʊqbs P%@\Ҷ+HNˡt[]Q&Wk岊 ~*zԃM?|M"֮0P̃hgL6݃3ЏcQJZ?ɫQVWb?pVtk@EJz ~vZ}NkE yOe TCItE8P'|Px\ְkXs#C|< gSiUt$0_2ΡCd@ɣ>ĉ9-Ku]UW]%ӔJgn߾]R"I;)2(4(("C 7|ۀN0q)(.?Ƕs[QwvSV]Mzծ,'1,\@fQ*HI릓$tS8C~>PyWLnL4Ѷm+gLzk3gdb Wih&vfO-?Cs[=&1rrei;$cٓ3rZd>k~}9W_ΤV<(O'0%>W#q Twxe$z}?7 8ݾ2Өw`ei.x|Z (f)0EVa4ɒOD}eqEe2-mt$@h5;ZCQnB/Y'j[o>׋N,=HWW ӴFĈ#ǪH'+[Jd慠ȍcؼ,:k73/d?]8f3Y^}{siXp:͵U ckf/S\6gW @.Ǐ @'=5.NK{s]>V,G*:.&XWɉC?KwǪT>[Yh6]-ujaՊ<΀[-T9V:W?/-%@_ 5udLxmJbB6w"b:ůiٰa)݂ڊè"Ԇ3&?CS?u@YǠ jTBBW(;^Jbg|5i*PIi <ŒLhFmظ+G}CfQG}2"nt6tfυƸZ(@N4ܜϠŃjd 1(żOK/5lJqFL֊,g/]Ød'._WBfi\79FJ Xx˷g?3#~MMfk)SJ)7\HuDXp3.d  $rP*w\J?3>v1qY3)H)r[raaMO?utݕҨIkp4Ttj uKRw˅)A16{" *<胜j R'&!EebvrX=ψQcǑon[_ݐM7\wmIcS;m}:X*h&'N60m V]۩>DSϯ1̣M =2ovǟxuG')w)QOOB݁m9}klݩf4}ԟSϭt۹;ʅqxK<&_a|vo$;%^+kp;L+/)2U2{?SPq`o?[ɺpL?_C Bf RQZrJACf&l ƨ7c~DCI~)m8mrĨSRIBȔIBd 'E|wG[#ͮCj(I#"GK5J#dyͨO7}YXH;Dc4}hFQ1ogM#@QQ!{;c5eyP/@IqAQev̩Fbj:k8K֑6&bLH@'Q[Srh<(6 ,___ǩQ WHʠl&!;En/F+W ĉC,)Aa̯p|UudJ5rX$-5kYYKFtgQF)% U3WoCI'>-Dn܂I_*.ED ePCJ qR~iddfK^MJ{ "JsY ygٲe 3f`ӦMr񏺍7NNt*MHLG~R"t)'Rf1{, Zb5{X2} ''} Jr4[It7nl om%'5eR}'E)%œ9k}ƽ|뎻X ןŢO{܂͂W'yz֭Xi%_~~wҥx4o,wIͦ78ѕ%&Y\;}:{1 '[rXu h8DO.aw)o@JZ϶ˁc 2yy𥬝1yYqŏϘז`hhm<Ƌ/A!2'xB)5 ,~h`I!IF$ AT(\P"6P-ʫ8e5806iCa-cX aBV+EGE;E@i2+XaEp#PFO,ʐo{/h826%㉍|wߑ*-;4JEq*FNr c 7٭pQy"eLуt?٬ QLa/lj!ΏUXV|^ O DP)ZPŐh,s$Oe'Mh5Jv;b*K_KUL(%d0Ep~\R$lͣ\r9h-66V~7խq}ݻ͕Mn\r\hZPKFp +Apʾ|S%IeRuXRf_{Ա)(ҙgqh7gf93-_ϴ\qOsX;oA??[9[ ̓7S C}o} VNKDUIfqwA.*~P&䞻~I=<^_<^b؏Sϐrsڹt!F3ed't\^za!p WlhsqP i.Z!1Xxl=kÓh ;V([UZ@5.HTtT,G6jD+#JfW!.r{EË?H9Qpb)J^BvЋZȍ,Qc$7*Z1=Wݠqz &#AdOMKelXv;BOZ,GpEH@k!:\8[zQRR^k B",I%NG>z;`Ro(TI6Q`$ xSVijWȠ+fOPۯ)>qcnJϤT0GbXfVۆR o|KgAeSR2^>'&}6_q{dj*Y;)vmuV222de/ >W^͝wIAA''OՑ;K.ڀj琜4PARJ)مRc?Gٹ-$.#ֈ?I4=+9XiLOSuM\OaVJq"Ib..|k= [8nV2hwOsSQUˤiϚyJjV>fN5qIJR*NmcRՔ+c瘥4\Xv,Ǹ}3.SLVn.7e,sg"-9sIf )/R2`|b_T#ʆNÆMx>OÙ3f $ڭ N,ZY x) y1(F>~HHzTx{9aZ!cu6 L2b6p%e/^K|t~bG`RѣjP]jŀ#&1UFhu#Kw.? e9#3L{L4}T/3 BG8&>Ң`ۘh{˖G]COsg@ja_ԠNRV!F)F TG-xN˪b Ž11b}mP8QL WI?8V @-F Zȱ\:bWc9!EÏ.NҌ  FB6wl^1z\T2uqXӵRI˒n /+y|7*}YVVf,wSZ:i0HX}R% X\PByTIZ^K9nw:鹸%+{z36'? G!އ'$!{H*/(嗼z=,oqܧ_]6K&nTcww"e/III2w$au7u &|y¥#-X.C f{[,SHHL`IzQm'O.!iV:u &x BIyP5ByEM(>K_ 3d!9+&}ֲQR%1a>YE*ZS!-FBr佧8آ`9ĉz78Y5A)80-fsI{dp` wbSW~qpDHɿ/}W:ܳf͒f_5Rv HJi@ӧO-Y@vU 0ތT[l [βҫOOpB,RNN?/xX~GTy\TյU0ϭOd-%hW]$ebgT>gV'*Q5=bkxKY|;*4ȹӊʓ5IOk_G9$cL<%ӹ͌!YOW3\|暬l4%/GwFcA˘,_Q/9*r$R"ƥ;IZΞ㥍s:_o`G]⤳ۇKcJβ4ps1?XǼLX F:53fN*6?j+$JㅤvsxO7[\.GAl hxj\S3BWВ`R`bpk1!-baײ(.R_"|07 RR>9WF: 61#G.:/poF }( (2RJR%VnXöZӉ(FXTR2 $`%v-Æo^J1RF^|99f,*=v3uYc>iIt:s殟@+;k#N&S8/geĨmv7j0$dƐ;E߻YybA ֯`ťS47[0N(gŵ=C|Rz4{jQ4+CE)xDIt?]|D?Jt<|Ld()]Ƕ?@?.#EŭNdRt[ ɚR95]#M8]z/^Ēũ b.?/IU,Evp9&NDP~P%&Wꋤ?w}&*^RH)C=č7(ﯾD>ǎC5Fv>xѧЇl}RJw[=[wmc&!$vvsf~w#2#޶N8'Oc:ZW3sYΜf#aj̡u0==]v`[ٿ/T8qW5ee骮.Zۺ9p0ǫVWeϑJq_+9uQtayA%ĜzTs4qDM8yx!.?ni':>;RG0I L.SWdvaaK<`d)MgނDЌEW H, K"?=h'H׸)c0.N$PPtms'%WvvX[7618v*v7T@jibJ=c}♘gI}3~Rzu &WQ^EVFK83%&wtc6e0itRcHޡ~TSo{dU<&M H?^~݅<M&z'19skV:7 o*MF+/?8N/_hmd”y\4q4kְya$F#cJ@[<ehkiޡcﶭTB\6J{YÎ=ilb_e=g{,\sBx/ S2\9mXn۾ M|cv`YmwemOVTaSu%=Adi>-͚@[DOd\t颿n6+c{4<Nr_P#)\ n mvBrp4Ga{ieg++-4L?g7x,3j(&5COvIV+uNg` #3tqlf%o36xi:ZH@s5RP*݄a35JE-!@f_z23<~WZ, .sK;-$pHVx:DFЏVqf 9l3Zes!Q EViU>or>BypJcX( [}gbst"BfnEKO 6?mS=bRtUH+T(+!yB +8#ڙvXtgf9Ez{s ԙv$RԶxxRIȕb+iÐREeұO/%CKvgd0ȉWt+ft潻!q)EB9? &?6JF)xT<~wVԖF$4R3cRu{BCg($ao%=1JTTqB0z59c;ƾwjϲI% dK?z̒Ғ̻TsH,W$_=i)CrdQVR֠+Sd~;P~o>梔CRܳg^x-gsR7nByl⾻F~A+gKAX'Xo }ǭ<d$De'fp8\Wɮ |i'H;+3&﹓%\­u@9thcV|tDv+]Ibߋͥc50A~z5%_Ot|r29[Sǩ&-_@I|9s̙N13t:4.z .^*_45m[vyobY(Ww4͠Bgd&qۏzQ]eS:x?t,M{N1;]$tJ [bX,ÁC^Ă g*9ѠYuѾSArNVt6q=Tz|c0:"`YqzygK65( R%&a/ FNIxL"NaH;*4D7nx<~Z{=hs@R%"KjҴx$s4>^WP~E1qI2]GT{风+#=FُN^9| tr?4q_D"K"ܿQ4Ǎ5}'C&LGEkׯ~Og A?G:4y˾Ms([NIoC3}%{NR{۠yqn7r T<ɩm)5u,gҹw+0=r2p v! XT[%پu':e~n;;y3hLf3HvstS(/2P Fco%dF=ZOZmG9.qzƭ)EcE=fl?HS 8?pC:i8Z\mJF]Ǜ0uqn&_)J sI `4R;|o}yP2i>H92}!A~A{ zw-#GK/`2TӾIIo9Z("?`RĚm[PX/>sI_##5]Y3U4TCW[ N @;(X3DKatysWk7sٴ tPyIfsvyk'O&{[R8UQωcM\zAIDvlyv nNjk`Olb̞:ړteE6Y7PCc&qvC$F1k\^M#x8^}1wr3% amO%&o +MDLQ5!.@r8r)|k`{jl/ZF &-Q#G:K6~M"8;ɭ56f_瓈^U )R[)cJnn9oNN@Z6WCNC%1 GGwYL!ZʼnJ~4j>vKhgy g V{:vFF~RU"W08=Q0_i-:''An{SⰺPƈ\s@ |Q+R_˻O֓tq 7OF3kt(HsI~3Q%g(s  42Kq;i)5t G眛T{:}w.$|܅3< 7KqkŜqkQiX|']}k`:-ҽ{fGUmd6ɦ !л_ADETDQD@@ $$!{lwsg眙wM(<3;wfΜ󞯼nFZz'S?ܤ o숅L X2z\rarA˓>|@ix3<hD7E)68n2Kmh!_A>-V-|5#QpŘ8:{.2$ȱ2Y X ^- 0y{tQ?h3yɿj%߿[$ی`^\|~4\g^'+JdMAsElZy>n2$ZԣGkȄQ'}&gsĐzqһ@d||<3-場l8&PE̸wmՑL'vG[,>>'<װ .?Oot\RsUBѨt'//᙮qqĐo碯(Y\@N.?Qng';cEjA[X껷>v=0y99ػy3 (NEmM-AY9dd;gtVV=iVx lJٗjhN@NE;2vS]{bmc{6~ ϿIV c;zgP `%H3"hT|cd!٦!`ԍ¬ Y(NG_ Ȅ|qHKt|3 +͆o }l0r9GVm-5vFA)5!;Y>a.Dl}4r~q~]ȠPȲe%NB` A)5jD{ uȫNGAC}Pc$=^R?&i(^CwpZ)vb:h Ɠ')6f \~\ʔsJ, %FBụa)äbvjhnM#KD6K'ϔq؇RKh9@Ts9y97o琒Ƣ;DQP=}NѼo "J\G հ8ȵݽɁNfZĬg:NnZzקOjK'yцGOC"#LN j#D01d&'K'0:{ivr]!hRZ#e z2bu2i%/}Mhoӡz$*lrɤ|@l;L+IA`''7Lh݉[}uxL2G{/nCO ZI;@b8z2+85Prϖ>򊹹D~l@ ׋(\lK`B `~ 2iBb4Y.A |<U*"Rhj:7ަFS()PnR }ՄƓw"Au+9F9+#cqR J~Z"6z)1-dsן deTݴ uϦ/l0SN?,/p.R}Q9M)o7\GK֬EŜ`sihGذ~.'~YqnpxHá}{Q<'t+Sa؋G`4þ҉;i09dAqd- 4EѴ |c,fLk?Z]ZT&`taw;]J0Q;0f^} Qیu;7 x;qXfG8ּ w1kh4tM`rh?h#Nj ltb;xVޅ"d~ïlwѶD_ cF~q3)FҎɣY)Z$c; xv:T3Ѱ^BaN -A֮7uØcҌVۺu$d'SuB0ڐURT5-R~¦%`nawaIFqidP#zg06] 4bEBatA^v@}>CB.Ji}|r9fNCey*vL f :cT nq##?:[H@nn>ڀ@:K y(vcoCv-GY~2ւxP^ގ#ȟrlxp?Fwj长E P{ZKp _ãdj%=^`}ъeWހ?<J1mhѝ 4(*q`'^} YvLYHW+6G@w h%IXrU!a# s ˓$ŏis0;]`[7wZT6\sk&ƻk xh.3 ,YlzQ!FKt$;* }Wy`8X64TCH^D7%aˉ ?P <*˧ &BQ7-x)$cȁCJ%r>3jBD~HJN;zp1PbA6 iY "'f[L>xk'xC;@PbֽA tjk uvDT,\6 hYo!2q0aE8 >1GZ´JV1p1\q(ϡ.|ܷ~d&{Uk4׮?tP0:xb#X}8Uu` LȆb'eڌc`h韊1pl^\ԏڎW~˾HOaS;r &nكGLQLR h's:;N6D aZ(:1%%%+i4ܷvZKرc-Z{ns"-T߾{>AΔqeB|rxoCf# 9dق C1΃8-*\(NlaLVeehmdˮ\:?pmFQ^2y5R1hTRv<oa\' ?M@ 3nSljxXz(0>wc8(䖍%R<1NWr8TS r<' D|b [+0eonm /c˔#ʙrFWKe:{SlYG(Eገ2!>UN9&aɬ8ĐjL>f&PXL>Sj u)%&)(N6h!Ee`>r.DoڰOM8-<hIG8^N]ŝZ6FS mMx2" 2(LT:"Tש8|2+!_"#Π|N!yÀZJYP E,zݤ1b,do7~!37-;V4Lɴ|ZrrQ>Ÿ 4oz/|t)Sbޅq#[x k `8_[?jųFLpMt^b^j-4t46܃#A0e !/\"N49.[ l.x* E+U +ډ@:Q|{&RDŽ جIݎXO'&T_:׀O;v<1dBq=P:}H-D)X~ *'N@p:2iŞ3qI ГOtyH5S'w^FytʵbFhEsw44/ćCvn"[ )Zb .Fb m;zdd`^RFoG-U-/%yj~}ntH6i TNm: :c2pbO}fΘL 62S3) v&C<}98J11H'x d=IPwNPw(gcR}<6r0 d: -yq'C}W1~1cX+'ڟ{c9Oᵭfٸe]}A'FPD ldALʶ2TTuVGTe rM(Kl"| R\|P 8 (B<*dw0r*M ktW\y}g9qmbz{e8-O!oQzR8% h쁖KFX2uhn83.1| Z3i#` Ґ: `%3LzxƗN%X50qlJ]8ޣV[nd%R X6IdÔEaz)ti j`W!|24-לU(I==R`7I_fENu6yXKDCU Hbmr[Wm10sl)pT3I}j3όj>i4G]w݅dd󛸢\_d?`yy9z)TTT w$g`I-K2aw$G/=ęX.)rϖui6!Yaʡ<GS;b-TLBlZl[hQc` CYʜBI͒XX$qX$%>.#)T5`'yJV)ɲIp$GWY_ݜ9CI_i&yAK;k`^*(KAը.>7]8=,:2 p[c jh AH#!Q0%>fJ#qD -"A, Cw'گ[PeEMIZ!}R.Ta  U> dzG_Q%_81t2OGSI=A(Qt̬L\qذcǰ@߀ק֪(%$ǚ5n1~T[v_c .-lĪ_˿/My/mMgH\ұn,jho3F_୏ԡQY(Ii³X6_M.dH߭3"N?~#z8>s?C*d(I3_>bS򥷱yO2 1aT$]J[Q^5S %CPG͎F_Ocj9@^i ώ#ʮPh3U/ .@qI1{<*>tKtRmVgMѲBɻ_yS;4Qׄ`9Y?Ɗ+FfΜ9܁v$$ ow4ͅQvG&奅h&: p(:j" 4*vL:|W`j~'0< 7KҔnF =#?#kF! 2I,|g^ U H|CHچ~ 63GoGʉhS\qNrȇQ-_H.勮N|B:ً 5TP%ݟxsi&o]11.IJA酔'q|ϟĤDuTI% xLݴ={0: oÔ)S@;~sIRaIע"|E$945գ#Gj+O?C]q#AC]-DGQqz:1Ctџ1@ւ & hxEoW8c.\d>l@ Z6(Aw$+`[^V< E#(/7hX~kd OG*FODzE1Fi̍${%_LI:hsUI_ryuq4rC\7ĵd4{/:26e ;Ll~ @1y*%帲U2ЕZVQԴ4ܱIV+6|^,m<Zkb,^8)zǦa<~[1z~:2A|)#<-@bn!2)͎-up#P:zX)4"2x`LHEI]9E:>ED3b1n$٭s0)ALQ OH@OԥJ$hH/4R?~"C-ݍ8 S~>򙤋ddĆU+a0gl2HW%F/[7y&$MK$%袋o~Ճ:ŝ` ]jވ /giGWS3V|ML!qKOmnfyZLnBJl`jC.̝Wtv6DG#pa0Pj uG*Z?`qWŦc{IS~gK2"!s8`5y1#7h A֙ )d'aII(`?!Q冈WZerzJeC 6!v (ej`Ϟxaj!3ґГzƒ'2` . }>V$KR Nz\rjMfF MU=>!uY[}n9HY-o=nD2ˇhT9)w ^``|3˰R&[},-ńvld+;{Q=q"ca(&m;R'j:wP̺s/["T*^(1'pS寎/42TCi Q &`򅵊QA-J!==M P~aMh*F\J>%#lXnŌ%sP5 #VAˀ@&&(y~\(`I]:΂84$eRhk6mǧ?݇0~x)i$)`Q!+W `S1s+3|g?y?3-4~\Y~mqu[oyWЊ̈́RNJ Z\8߸~+ )عs;l %IӦ,FLv+,qpۨZtK1fL 87Ei(LWZYXF g_CJɖ`ꍃظyӳ1=KN܃S0wl<X|5FM&cI,ژēS(pE(`+*YN!A(;řM1qXqxaE޼GP\XF%[vRmVhf4w}}=K-Hsh хs%z{͚5 ;v gfҁQ?Qpi&'od_/mP-b=S&)W2g|v%pkȫ@\~uFҞDbF 6nځ|x]H*BF (/'XjIGQ=c5߂.-l.pAz=ӆ; (Ձ x#3NdV8\)UI cIGvケ:6pVbGM|xh)6#NH6aKPY FěšnMK;G/ iNEa%:Y}*, LjK.N&3zblAumbvҐp6`!#7>cdV V7`'뢭M$y24w cXJhB2qNmT| 'XԋoqPZp<Dž#A#5}j^I'A#HxK|P8YD˨И3dF!M8 ;Q~!`d)+ZJE3fW ,J)БGyfdV.WcƼY,t_oKY'I(9hT$޲2 w$rVvcS^' yXZٶ NkA\|<+N1oGJT|%0'dL-cƌa)iؼsѣZ;=#_YGEaa$Ss=i dBV~ZS b}==Rd--M4|3g|h(3!o0UONvNh t΢@Ai׃2K>-JC) 㡤B+ߨU˪qxt;QVu?;:W;_߁tLI"vǂ|5A'| >QGV Q\,ՑnC2|hbvUY5x$RpEO@8E?-N2#uho?77@qMPjDkwc-*2Iq)b'tyS~"&Fkרy M;RC6iYeީrFHNG1R䋜Sh>I3d~ǦMpwꫯ>5zܹl>t0֮]_7 cl(B1u2AkkF_Ӷ ݂iӧ9\*''p!Ӎt=nŋFx-\y}@a FѼ MQbQA޸ 0ࠥHNRxňQqHLb7G؀m^bI& VEDG꿨Q9+$ĔNt&# :87`m dhntyxtk$\a3&;RLXpg"i xF$hv`(*3eqZ !W"ߢ3poL7*BDM֧~ӑO|:Ig9|k3 M%$?.<[tЦ[TҵE#Dc ycbi  Ѩiq\Q郺MEu"Tvױ1̴<2)زa3V[Zଃf2f-IZ&}J`Qx%n] I ";''?<3mj~୷¤I#HtF h:m+z444ARi+!]nzLK <^lG/Àr0P q-c}m=끽xQ~y n?S1kj8ҠM’lʗkɀya!y#1H-בX'LZ/D+׉X\9xߨ{׊t4VEͻ-n߼#`7:j{r Vsap#A/fUSߌmDNƸ,*?2sy 'VkN FQe^TD;dtHYw/B#/Z. !gw2 Ax9#J( ZSh*)TVFFF<-طm6-Z#0v8ff6@@9*#'k86e u'_'|(R͠V?*`3 bhnhb(ʊQHJJdYmu*QmVGnԁSg LRX|9n\uUlp.,]]]ȁ%7.1qF`@ +兟Kⲯb <5d +^gK`}%9X:\v< aв*zb/.$5kqvtЍM=ܳ/D,H FoiTa/Uލ5vs#(*N4%\ J)JhkԳQ<3PWI"*&h`ITK\jMOO]vwu n+./AIy)2p QIǮ0i5݉V|N\Kh*lcT2h%F 5Gc}pv;hLJJ¤ ,GTLjTL*ۊ H)yf%Ynxр iZw/IM@⣁SK0ud uZ#_^ޠ{Gz**uq@+rCn#SHab3 *%? Tҕ:*`2z#DRI)/g jŨoע4HH`:Xf@31>+RJBGFF*MF"&MFD,M9yÅ3pRm@S!70v!dG{k+q]희)))(/@P ~ A*@<@*[O2:Li%*׿p59Fi֛n/C?nOA~\drtH&$Z7Q1vN Isa` b= (OS?)kƬղ9}A;PR(J~OR< @A Pc#d iv0 qWrR"iD :t_m>!gp'$LJvuVz|'Ѽap!p#⚠ QE= !Y}~"eDF2*1JýZBA e)1 (S"QR$\SRZZ]Ɖq8ZOʣ>k`0o Vi5mϡh=2C|)&?'@yf}d@i t3P7+Tϴ]w?81S3R:>6z_=2THyBϔّNZImbFyNM ")lnn_|;&fcf'\Uz8$M%U :֏tux}MUm\cb0f~B46rM^ ?:%{2X "ܞ*-iǐ\Q$J>Lȯ#|_4x3 \h" P*V)_L &;BrF5&py )HSL8U 2Հ+e-5S? vMG5Q5G&e(wjLf4u!2R"L#@))Af'V$C@lbN`l5oQj [[ʾU(j 3xO/ /^_D;\~=lmm̙3hm#iOVgͺOj dDo fM$_ɏ8iMMhwWqE e*<'mr2%!lSgΐ,7$eSc X?KOƔ}]&gPry3S:#ҒwKޞV4ïEYzܶnH@I\kB$3 #b6!tds/d#3vAO:UVo> w30bY91CSD?"aH^W~ \>GwV޽> S''@$eyy%S!(o"Lf4CIr0ȧp6 ,aZ7(UNh+~Yd E-`wzpY@Ayx9KPWLRUj9qEc R_IR$M3 )m fV} _;L]%8eR#gL&#͍K13,*G)jPȯjNH5hT4G7R |6m ̿I ( %V{YiG8D^^F7.dA:{5-}nr\dsź6X/ +OUcG@0.O1 9ODq`䚗HؼT/u9?@ > p-@[ (EG=ecHG>#/b6w/Ӏ.7JqTއwwQ\OO ~(\TeņwcW yϚUf'1r̪06cc;bU`"1teHOj` }1hqGb2GtYֈVߌ?vb92fګ`p!ϧ%S}ǰXH#SGDoG?QLI3i*4J;9FW*.JhNyP铩Pi2#2SpD ` 0@JʪHXFWJI>]cR'pL~/8 6i'@K662jŨA"ѾJm5`=ʯ*ӦMʂ2w}زe ̙}{5j8u}GBK}tZ2Yi !1k!c A$tp_.z-:d r`7J1w9IEi'9 Gz_f>;6|x]Iy[Ff Lxm?T5I^(0Y$LOs<\xn$cj=쉘91/<3w vRNK|c;z #^6P5!BMs4 KGݬѸ2M؎݆X-$$!t? }t.al\(V ?Ѻ \9V\g xoqzs*F(#ơAƎDU[7j<,$ON=C_QP̻jd$ʌ (MJle"%7& Qu9QYk>|a#. 'QKk0ra@(pR .4S{IWVi`&NyZ._ȣ'N0aWv̘2fZ K̕XFFg` YO@9@a2bd*$]dh$e]@k00*UbgF1/gPu $IJcfLpiE݊S 0)os>=E&YZ i7>uNAٜ Twa&BG%m4aGDBj,\1b(3ts{05GQW F$!H(ŲYp ݺ$C>߆Ύni1bf69W Sw;^0"Y6ﰰ`t cl"mWGk_q0:DUvhɁQgoZqh{GeQ? 7.忣QR)c9UP uc 8Uʤ?b2za'"_e,XT^kœNON-$)Wk)#ᣏ,LGJ裏4Hai@)!9gaa!׿=|"kw':z1TEc:Q"{(M<݇c.뾼Ɯ*vz23d&-E@&5-Dp8 ?K[MHvk܀YҼZF@Z`V! @x,< Cο 7YPrʿ.Vy_d$A#h9ނî$y1l1`Gp$!0~LJ?h@.#M{Ri\HO5$RX4p9{oN4s{+bHLy{'}R:uF-08Í~4|܍4y+5{{Ϋp;77o#P3Dfl&_䧎 g؉Ά!AOթ_DPJ9(@sYE.B1v2T6!HOVa@XԚJj"_ T_ 5(`wY3\]gƢ uH#n YQN`A< jЧʾZ}L4TD*™^h o[^~W.u" v YoW|Af^ f7t;ߵ ۚpcYx, $߂AJ&+YYV6idCcaՎo2;@}O&#g?!.X<BDr^ŷ^(#1?#es=}Rfc'!)opƳ (ZpjKf4~GuaŎFQ[NѢf0.:d4 >|ҋx{(_-3rڱrwN-NHFM %ِad&Չ$3b&xIcNOEj^&gwaz&-8e,`G'.ą1R7Q%%2&U p!!@ Z1J>(9E"Zsʆ/QRI4e5ʢZ*)RB8*.ԀR V~_OcX ɧV@};c; m[FL}3A`Y!,:pG~6AZ|'&&2m_VVW pq6:|36ַ.l#:^^2R #`OD ϢiFd@QKR >:/212V2@yhi!ɽo1 ;F'0c,TI dN%݉1P @s hnn$ȌL[@ ^dC)ȃ2ctVѩ1oG7~sy (8qi4_i1EM$Rӱ?!Ow3.hć58gmceZ} GV?87:ѝ k!b(0l"?JRmM7݄{+&s5b'Ʋep]w2O~d]u LwI`=ԗ\'pp53S˹Pz.?'g'}3Or~Ip;k(UZJH5=4OǏ6yeD'Moiђ}2ry%?@JGE<:[pMi`íg?m{o;Ig2 U(QB)-RZ3 !섄;{H{_I< ~#Yz??>WJSAgjM*GJ@}n3N&Pu(~G],t4*?Rѓ_!2CO݅/Ml' n_{;~ϏVu=X.ߜj%4+2ە[N} oFm 1AZIGy\*OLv8v }СC (/3zMR7{CB S <+{z6~ulڪFC+ϖ6 -Vl}#&B;- KɌxPzb d2 Ny'T 9(<ݱ,2z׿&u5@f5:x .!-y%]lrEFK $ُUZkO>_guloMdx*Oய&"r̽Aˑ#Ck:<3aedОf/ 'ҪNk:VdZVr5ZؔFKI-'[LVGtptN5+MO6sZ.qE}ݲ J=`~D?Ծ=Nxԭ Q>CΒՊl ̽>uʧTyl*8أTL+UU ywIkW],](JJ3yG*_""{1oٳw@ɽI{qmT֬Yg:=golırGmn6Y( xL/X05l~JЎ4VIJ ҩ2DEm|q}{FdG9:v $ #^O_Z6B*8=sr.$N7&4|fr~w?T[r.ywniE`I$ %`֩|De^utq3ϐɤeϧf\b9;[zillTD\Fɿo%߽2. >|]6ʖSxh PEa=؎ZjO{_R ` -24ֱd=G9e碫Rpz7\Ώr*4/AnxJx^!!ɍxT3yuNV) &WG:?OPf~:ϳu%qw-%'r^z=>>{^{]ۧʳ 8WaUZ"&Suz&"U-گSLB%͑#Gx衇@]nQGRrw}PĈ\x NfgW-+.e%ՒL;.j*R-ӕv p L K#OWbh,nm 176qbt3dXZYlJrݯytt8N57n gҴAhƮ"Z|ǥ)-Q}#c.?\ q;\~JjUi>bO%8GЪn]{xO RQ2\F\_}_-ni QSN)@dNqKl2׿2x`l~K הV3 ~zAsfY>Q;;Gl)))aӦM ,//WIII%\޽{>|)7xc1ʾ V;  MD^uD6h+H@]^M%@]볱N:-Z Nnj t܊!$ LnN&$, X^ZSc$-5EUe q))YVc|ue=Sx$'|)fٕ13;A;,XDeAE'M]G\P+)H|$֗ p &<6 aZD#Dj"7vy8\/ddYj-f%纤V::6LGߋ-. *7qԿ{xbj5qf6FЪ !֨ɴ}Ӡ){c+^y-G  !)9O|+Sq;ٻXSKIŕIM^Y=VŭhpOJ~mnvUrAJ+;Ҍկ}ѫ5L])n~y5uLA};v1v jO㝭'^xmGO`s9 ?{Q퉝F1vܭ'ʘ1wN|;ùY@ l8(f,IFYY̦Qk"4^}+QACaPmGLps&a7c{KOcHWsvu7Z"2j|1nG_`KGhm^c?aHvuTM\6!^_fG [8T1L?=O~u7FckTLHJ6\rbb}~)ĵ^r >}/]FU1_)c'Q;n3"]n8v9MgckqSڀ٘ɥ?Zϯd<$jŇEERt$EťF^|T5G!?;^̝^C^}Y7ue*F~iGsϊ(+f_`h2JYrf`DZZhijfz}r+eؚK8-V,ZܥGgeiivŶp޹NVmXIĤ۷o*&M8g[;` XϙLԺHs`U*9u>c8vI-gӿW{ dz1m@֟[+`Zvmr (9'Ҩf~撋̲P~ @i`#Gؖi78jx{JRcPʀo:(x\ۂZJf.H4/=Z1ZZD椓9HpXݤftRU C9o ҙSko\םٍUGcJR;@WWKX /0ϫ}Ks߳ @uZ=pD#G+X/ ^jQ*bt|O-W$o$)2dbɓ'9  $KKK/kY nE#Ik.>C>Sq[K$?eNo8jhuPQsjs=tã}Kk'vm_MX,*l}XM:fVRfdY|z$R\[XZ, `hC7f&Weu~5]0K$::yUdqDh9' h)ӽ{X7AI8q4>+/;pfG3N|񲋨:ujs-FN[˗3?*?ZĈs82~mj{L_zLS/,热MZb &냤_OTDW3c#qm.p]͖ eq~rna"Ȋܚh`mNnާh鸟~Ǯ\jL'OuZx߬}J[$9Gc,u3˶!7'3#rE1泴A/cg~Io{`ϳ~$r).HClu"NA.H'$kƏc%j7,,;'NK G:gRYή6gKSS ͛x%*/_]|dbJ;ftѩR]Ab6ʆV`a!z`KgRZS1Bpp:gEHx!!aFR\xqq(}D…cdT;FB@/|>{ KZ[&c'C#,[-ycF.zpi%\vC^a 5%K':.'>ءcNHTh$9&r5 < ĉ DCER~h3Jlu (DsB-=Nͻ/>˪78x572ص{+c9$&&HLqIMgGMeʟC= < %}] i >_I#`mnínTeS)j-FQ7;Y5ݟ91j }iăLq&I{"(zu:B5(e04VO-#:(|Qfwf1jxB='w)u;iӨ|so=l{,j ^JllZx52ShOӸ:?+fwb1 ؗ\nX*bǝ  KdX8-x<ʎoO,]>|XYc|I.GU6W^ͨQxHII4.Fg TUUq1'Rg "Q߮HiuO9Rָ,N6arOQ3u{5Ƒ+g H `!5jtnX&K*u=@cϹ13s7 ҂鏪閟GoO1L&*Q1V*F, g|.Zls BhD3ԒnQO$+<[P(%_ߛW-0hMy+~&4 3WK/:usXEGyOXy:H& 7_ݍA(0gڏ$\1±WWST$.1B 2F5v}TEp0o oqL(gOjFGKˉl&>2dVbҶhmsc'\惡YUt!FC8љx۬4[CM47[MD|mPI;ͭ4p9߰8QIpnD*CNE,9^u&c6aq *Fe͓k1vl)aBNYh ;uESbbLtj/6%HI+qdAqvY^B#MDjq8D=eNtŒ4Eߙ[m8EQԉ2{3~gٰabI{ӧOԳN:Ŷmj P\\ wNLn^ELI)V)mOK E@hV):mnvbzQP҄F =_oXGY#̘Erj$\r{oDa%Z< wm%!v@o#Dxah"w*cGenCI>$tdN_j!j'>=ȶMxy*E $2hx6):,Y#'P, WT"3g%˷=y0%N26rS^φuFf^8Q9JO6Yn ޖ@`)x>q8{`Q^nJG8!%QyNJNR> 0e:X[[vMCOPR.đTEªS4a33yx?b 48fRfu<@L >$ |~5kw:VrT􋌌TԩSN.E|J>myܬXO||_ۗ]Kx FTʩ4֜H ۀ!qkxwGf|gptلlPbt6enFgpl:V9_~ 8/3dB&H$߿k;`L;[֭e+~ Pxw^~ٷz9mމNQSq{&ew5I{*_鷎㟱agw]%S0%s%L,= VC<Zl_-+_RnC$v{VV}+8CWyRy|49vuu&@= k,bQYbؘ }SCP%wB)"1_ EWs[vp@(Rnaڵ irbb"ӧOgY嫃][)X0G2Ff?BCCS!$W_͕W^y9y-e!!! N7o2]Ɔ}9N;BUe%--4mPnxUQCÄZXzDDE y/-/> [rѼٔsXȦ :c y1a$vFk$*%pOV3`hN?jg´9}%־uؿqdyڽ?+n YSoˌy? \5 aRbTl8k>Xλ]0oXfk4wg4Wg*.H-}fL3B*K9l=HKȠ͛w$,+!;?/:ϻdWӀK82, KKZބ؜\_>d@"fVsy *Ҡtѷ:.cw\JԔ^ۙWP)_cR2s›fqjv*Tm&zP.ʼnUٰ̠&*-?G'H6zimqۋ1Sڔw k6v{?Qvõ0㘼żˆ16g}1G)l&B|n$ Of/y;WNH I׆C'#oShN_cbxl"yLL(G`qxF䡷8^(@ \x8|y8&$Y:>*p1h@_.MqIYa9wI3pjIM!Qb8y7]8#5Deg2j-p9ؽN4BqmLƜgYv}o[܇%8gQo>:U1a2?_ᷗra #ҙ9o$SoyN07Yش>$_GE?$b,')7Æ8K޽#V#3h)~z+N8HހJ׉+ɮoM=+aek?S}CG +%^+ww'P 3tn#κjظ>L# `?`۫_kݳGH2rz1s/7Ow f^`P>Rs?QOE6SL:W|#byx^x!P#=g"$VK⏥R},?eݻNKH*|$_ڔQhˣɓ'+&MS#I:"HUZZ 2\VUsBXDp>jgwdbjkk֤Q%'lQ'Lbb6kJ. ?[~rb:$?LDxMOžaTDiJCWPrdj£(IsHsNg  uc=i9,e"+!}lG7}1-4x D =t,Ǡ1 n&Ll > UKŖdJ"3&ؾSϛȓY g]nM87U+Dg7)?WDߌ;K- v{Ϛȯ~u3Ciyɞ1gbkqH^7QjvmJhvKsen-J3`om2m(P֣T6P#oyEmbC*]j 5yxjiԇg@ D_:cBfOR^LASbQg$'4Rb\WD1zh;QEPiPjڍ#ΚnTڭ"L̘bmmbHNDI:/aZڄX2 wt[5XZ0Ę0ů7wPpV-j8̼m1wEfǪj@C :[|@MU STQ:Q\-6R{ „iPz|dКNz}\lZzWeV[ I[Mu8Vfxz1\Ԋ{XjqK7vkPy),/`Mf+ZtJtdLJxQJw-#$^{-yyyKIF$9)9.J h%phuQ}^r;9q@95fJCP{h+qxEgo2yŏR-ัx~.1RAxjoJN}f\G@Nಫbkj {ɍ̈idHb96,_E߄l͟m>F{Y6 yrS F\7S9A^v^qCHMJ]+y PQ$VCQ*md&iY :~4˪~?Y_61 GS)v7j_9ZJ/(%!9|N< wv/Ţ)p7K?Lf pcyV,o"qdWMjCY mgd'k۸GnaCkXĖΤsػ^(f $a.зbQ WHd9Z⋲8$4#zU>w GW@H@RX>V5f9~4à?i?Ƹx OS ЗuI |VpS9'e5j43z4-Eλ/ :eh*jp1,,>EN> 9=>bݱһT;hܵKNEgټcMߘ,=Zhf>~62ȨA˞fs1y1Gn#pX(Gɺz䅿=KMԘڈs1wݾp',G6Zj)O>ɧ&pCwqDʷg^'2-uǜiF y,u@9ܽwֻngȠa$ .Z?Oi۞ɦ9hT p aPҦpQJ0k)51LOIMS 'ظv#L̛;O蕡\"2@w8z|G+$)'ʣ[\|*SohhJ rʔ) ؖIS|KEDEw II|Z" HQnё>tHك]9Au@,'U u u ܒ1c JNhP.;<3ϜbI\vpj@eiT'7`m gq8jŦ%" 7NjَW#@\_alRA471۽CJjn`W$~DDhdM#SQ,J]-W-60n8C RDE?Œ=. *BND;ڜxe88-N*XIR"A:gŒaPF:jBE]m<2 ̠$ZYQ{1cs?،*GN^N2uR>5"4MDz;b Rz %:]`."zk#'C풓\VY,7;6mbx^fBJtA518r00u!/Q\8=EP 7g}G!HhB(Xc'8̽\2Qn>]~}uV9C'QK28FJxU_y?nL$r `)feIF_#্vl/F]E fR 6Tg2{c?jt֭Jp*2JJt-@ϟ-ܢ떀 9dVouy\.5i3:~ErC(9iycO*#^죒V*@Hh"]n_DK4`_=UsM/"[uݵ| GުNn$XZ U~%jF+6Q1`)vrK`2!tfaMYڰQ%ō  bPLć*]}-8*)Lf̈$tr8 aXL$aCim )R dͣ86P/3Ү.r8*G6N$hqCR ɨ%A\In(Vk RM^ cU*Nbl GN,`;&1iUTl*#1Gn[6UϼrL84"|W%J(bÌ~~0eI0tj=rdJypp:ҿy2p$q`EYy fشLD;bud"\++/-_Bf-KwS:S\E^AofE,F4c)0*\F }DGNե);EtrN9Vycq٪YkaP[ņaЪ-QtTa~q*ej{C &^{5~mNpw.sϝ'l承VǬi*)-*ym}'СC+ `裏o,҇P:>Vȅ ?Q9Z$P-eYs`=z)%H=ɋ*sӢh -ͨoJbe!LN@! r+LcϽ~m^50t:BeQ%ta .Ơ Bn V53WHR՞v{)s4Dv?' F:}g~ry@Z|Mj}|ŸE c-N}@:1Kϋ-%iLy*VIg٫ Z2E!8m@ۚm$O#AE@&waG>".ro31{Wua̾~LB3 P41~~>j%4?gQH?RU=ǃ@T7^?Nǎ3&Mߥ40~k˫dQyc{:H_o_$=[Q 9H(uY{0{L=H&l H(5ji 8Ggd?9L?Xʶ=.yd&qqO5~J!hſO # ?x>q8(.j6U@L?b5km,8L)Tų9Qf6zț5LWnӊ;2 Ma4qO!fPM/gŮ79 9H4K{iIR-^„Aq8ß.d#}Da?Ο˞"X2ww D9A|ǵ2@BG )DurSOMHڄr{0'g yB q9l!`hBIa7[; }{wP\&"^jU6e 'w!/eh#?ooeKmK9qi宋ݵvsX{1PK[%3Rh}0Hi| eFIiV?+ԁT (YhΖ(83=Z^B(A4NAQQ'S&&%K~Jy m .mOc9 wy3Uu5TP[XE2x7Q.b>f$ƌP|;m3b*O<{ӟ3nBWY, D|YxѤהw[ ]lAi +8sj^} NNjV&9cΟGedI{M"SD zK [ɛzL<>Mh[Lkըkm][-n1jNce)]K+._-+v!C S/d;b47ث۸pUᣝG+w1dd EEM|ط aج5p .޽ǝ$~xcGi{eǔ=LNIOb|M-5[Q[/w_Ȫҋ,g‡~CFV SRմM҇0xP]m&&1F*~o? rsqŘ sp ͣ 6ѡJiíd; "r jj`݁8k~3rbqXh:vbH  V VOueDD+>Ɩ:<5DU2?ɌRx"/l$ccꗿo.JGI GA,zOKoy͍巤v(cC,zeR^G~2{etz3JN)YPJ K(,*z@V'y*Ngڼd` s)gE?RqK$gȔ2p{e}kC)- ,%שBJ?Uy&hϖ3Wl5E<'2<W]~u/Gea %<3rسn+7ϔY/WZX:NB36gM9Oidr2%/{LC~\x0̻vz{:L؜Rtl:b8Y%'IjT[-vgUGvip{N@_4~] ڟ;>;xuk].1kp5@WMK,O R\Qd0‡~ I>AiőGVY#r?NCK}rtK6s=դN˧ AgWTBٱh %1MZA'M4qQ*Rz 3:xcZhji%{9V^Jю^h7jEem*9 `cW2U}̿1M5J[X佾^p H믿_gIfTϥ(_]qPҰTVɗWۋEzٚ>}r>b$df"5&3 :N*.7T8z$ZFkB4C'Oy0wz! )-*D m,Je839ƛI9<#m?yfx%Ï_\r%)Inf۲kڸ/Ec;नO89< 34 "EPQbfͫVD ,9<{:w0=~u뙞zU;{ϥll¡'L u&٤:r'*™\#Əy()(rJ6={!bFaI)d q`+KG`v>z =; B=g~L-GQVY,=.݌ZM21Ҧ#L%G_}A#sxEv]ЖK>| 9=p9HP[ޢ8R}&3C7)# Cwxl=8'qˠT\B:n[m&aUPcT|:g]{͛Vգub2Ӱ?n&Νލ25 vL|~Skpf?aSxՏ=7 TAMr=|]ߣu59ɐ}I^-"%䔐(P0:d0a߉lh 0%{ !o20:EۏHlPsk?(jrQQ#: $ :Xг ^Gp@zlS+sQPRZ"N0Ft!wU"(>~ FDr*u8zBg@Ɏ LkA v*0PҪK*$RD9[_3?~-WyL ZHi:7:iPP0.]Z'|\|\9}tL0SQP:#Dʂ3lR' 0 iɝ*.KWr#K[<] kSn]'BJl;Obbᓍ-8=3݋7@sm/r `]o?/"VoZ{c&N9%qɎ):bw 6;@bB^ct  L:`~qk xшdh QGnJqSZ:euDgbQ_ę]Œː6#BVvqdv9/qۿ[^ PI# r( )D)c2]vF!=S1Y@nu~@&&Ul?ؑb7CBS?Nsѥg/,z0 e;G݂.9U<{;) Ax|^<ŰX]:Vl9*'W.P^)g8rx7zMssZZ Fkf8?0y|tIƏƲŋWJ99Z\9[ ]]9Lr~C8z7gPiC)}=cr#N\ nPN8V#ѡoڷNbV.r!:NDYo dA]y5q!,l7B"PB IZ֙6i PdJ2 JT!V [J {i!.W2KZ FȚ8 1AZo96 y PSXp-0&.@ 3{͜ڿre.nЯ{>TsRGtT/wY`h'9M /IhcD/\gA8!$ݡC܇M߯Gi^ w>x4kT0f=v|r3VJ ጥA0;)WO\"zFk(dgqHc އT)C2n8c >#=x&㎮KJ>sbH򯚩z.3>(R$n%xhyf 4jJt ʶw I=qWf7LQ#ZΧIpwFTN\c1~xM{f|J!&w5cV{NrIerb}1'6!U03 ; jXJhLPSfF\BÆj/V|$cXp "D[pqy!!l"6 Hn0AP٭ڱ8aom 9[9 k\*ZD"(/%uiĒpb%p֜܀S# 564t,A(A:pz$FJb+b'|v.\\=>W=fSr+ir}l޿sDyE)!G\ܪh/9՘7og6HؘDiripiAAعs'\1GZZoY*\7}C)vE2S'ot1W`j[.ƲI_0I@^i"a`#ZR+ *\PrVǾ;an0{Q 14RLv&4)P:SJ8d9)@&R@L|^vw#Vi9YL ɉl][w|߯E=1vML³333 \-YShH#,0D(_T;]Sݎ;%ɫ*N̩SvTV1z2r/\•=Z6.8D$qp6mÃQ+F$킭IJK'Ð]''#15 )IH@$z^PkعC7W^UnGǾ]%9=lp*ylszĜNĶ< 9on -<\^M`AWN Cߎxב=~:,|3BWs^@xp2 YUT!8! gw9 Zr Vbp-cNF?)(qtN[T葓ںuHj@\8nEtZWL -AD%1_|>,Lw~oX7+ j\0wȞ}Z#/$1{&} v̅#Bh#;%nfF o@O (I d( vq3lxf MbhFR?nFv1Iv',6+PΌkL+J XE.7P~=:bך'P_&iAY7T6806@0$}Aǀ+WqP QQ}u:g"nBY:+Ĭ`v[~r{ކ VaV3ԇit[ȹh.MYsfs[ ?+FSE:SGt@A&݈xo/tzGʄȌJ!(g(\gP oDz{b0)O1yv8UP$֑*Y־C {QE>f={6wDex} othݽ[ʈSzݵXIT-%nItL3O<J{RV F=DظѤ &5'ƩG1| 31+"Q jr3Ut*i@$ @SYRcߞm8?ŒZh5~WkxKrFB" 2rHfU2:ΚY]Y*TV"%>pFn\(5*t ztEN9jV @ו=??q^zW٣߇#y!-UJ#i양1wdOطoTjPbkWme(\s MX>F!4" Odg9>C9QpvQu=/eln ejv=!1!$1Ň֛QŎS, u1wgڽmFUeyg7-!alo_VA AAԞ8; Vv=r /N"@&a{7B6=rGR -Þrh`s^ِ?Kk/Zx Jl(rx|}k%ฤE"t^}Ux*`w2BS}w%{z{w,Bzr Y>zw wRSika~iJk p@0UIpVtmbOGNHLHDtl4艌Eim{/4.Jq92 Ř GovnI`& t=Dߡ% >3o1B"/?3_30%=>Eap7['*Q^_ц0&ĢPӇ1HK-ŬV~UG֕ #Dcp P$\o@XTFT`ɭ̘ 2uz@J :^Ǿ."<&3f+&FL(GNtS .atLl-.GXJ:%PF!D+wC9`FBvZ/˯QE ML?b{l%&dȐqWsqyHC _i[[HR~^T(>%r98_ mJVXD.ΝˤM- Y,rԼ}5>@lCbҡ(ψ(E$ԄܳU F`tg"#law5_sfzmE Du:L!L(1)_[7d#\eMH.O҂O.J֡Fm $W7Mu$(vQ7ވ=z*Ю];,ZrkqAlvI:x&  J@@(m21}(㕓<~,ׂJK.`2Z lR󢅛%@rK3Vm$1c6l/?= 9! j'K<=f#{+l^݂I3nE4bcloy|XqA|NД?h 7mf#42pS+_~Elx:Ǧ?G~jjkaCrO \^4h|Q"ecoٴ7ޮ3IJs20B -P@)3$jͻW= )XKrZUJ42,5Z$OAlT(~CpQ:&A(g9l8:e"13?E| 7-WAO6,U(b8pT%Nn?|g܉X1hvoXç19*&5uCjZa2qD!JoŽ{mC=富Dt|(,߆PT\ҌΰlPhDj$ 6A.7H`ŕ(,FPJleAP9#u &H"SzVD)B'C#Au6[ 1ldwv[`yY6X(.jU$E0[p(:WQ(9t(1A?%vGum/Qo}6[a2  1*T}:yE+2!#:vl f a!Pab%w9~@ ج)` ~윴 ت uiTdo"vZrI\zb? C?N3ad6 :'A +d ,(DfҙKb%%|y%dC^Q2&YnĎQ/Cff 0 0Y,sx%5LRb15-'d1İ6Ѧqy°˙^={ŒkHl'i[zҤI\8bXneNP6}ARkرcdу>ȓ0h8#=E( /H[m۶R-fJʕ+xbNz'N䀕Zmm-7F߅yٲexL޽},Hഴ/} @Y݂Q?*+엡+ŋ^Fn]xt;Wt*)]#ְoSOb׺8{:tN:B@?;.;Zx& _sŢ%"*z-WөT4HgdјǢOrBۤ ѮK{tn¼{=ރ zۭt.qrW*F,^#NBг?*$47Z"lXS6 @jJ8DTˈ(H3PzHEXяWL sUm'acwKqhpъc c܈60b0}5opfV7sKFjd8v#Y$f ??XeP$(~: hM2 9VIݺo\-}q#D올j&uE\8T“ Bnc`Ȋ@ǞHB4 sVĦF⢁2r]B1< 19qfg%L *0 %OO!m vhSq]ժ˿=$!-5 w5|@_v3sM#9FoaX ˗/aߺu+g/Uܩ;"F2F*]UR݀Ra pzQ%1ǏϥUF4 QR\\2|rΖ03f#<ݏT\A},{4d3]sH@ݕKxqғh?fl5@ GJd~Gc6߰?Ǐ/P8u0!q1<f޷ףHy(VY|.%ARJ6u¨ػe7v<Ky´ظhG`L!1BaLUF4,Pȩf6ƠgR{8dD#&ES?V-at+a2v  }%ވar7/h}|iOcoދjXrlc_O綾}D)d+b],f"mN}&a=ׯ'kӦ ]wLGI@|vb=6PoߞO?et%\ĘzƂf1ew|]$W#BJabLOe7n_ nVJ}͒)Bq12 ܷ^zuzgWfjz {aAax慹c x nl?:=Ž~3YIՠ̖YF[7[l^ g`uV|xvlk݁*A_ǬwgӋ+PId!C%Mq9j(k<D2H˔+]ǐ[S<οE9waMý>OiY'#``4;bnl=mWBV>G8Sn=,Iqh{NiwPBncQ&ɗXżq`?RGv^[ؼ܆.!2a 2qbeTꐍlL>W2jD$(f&D#@#1lOQrTb\aȆ%Qm!5D(`3pj]!\݈ = 9Kʠ \ xxG! \-"J U %T"$j=4~Z-fK63r+7aoC$ZR:#;Ց`!ןK6,l_1qj0۠<=>Ea3JֱB Q[c`Z?%4DDr2C /=bH|`;c=#/,AxD8&2[ْ*H2h|R3f׶3zޮ'سq+wdl^۳{74h*wHk`jND$%C%QUN(}nteh٥(qp%<9N3h*Vi1ظ~#T|4~f-ρ\0])wJnGnI<l}TP΄ %D@T݌ysͷ+j+P{߭ZQ X r&Ů Y-)pHiQ Iݠ5a㺟4tc/a Ĵѣ@Gmrm(rl La] }nªbIHGW[aPn}a ^]`Sw"hL(DJ3雭3k(2 0퐩U N{>xwa;XKӳ;҃P-[Mذ|)kFHla+ @=ڂi|T6bԨ9_|X ,'|p?YAvS{G)H/0K_`H o.L{x*zl@kRt=e;="LDj`a`VbَmG`x0GKPoD] RXi 20Q$زW1hl_ti叆(Ĺ2\ҭ[xo0N@(Ow>dMc5>9\6XP6/!!04/:t(+vhq~W6@!|{E,ƽ_$@JDD, ˤ8IV=)1G]+bط` 871Mzu=R %eX0i.z3 J.k]8i~\?aDJb =ǀ,UuN~_1N%IumEޟyi]W0c([zE!׬Zɯe.}0ذo3>zC[٥->sqJ2\ןʿ+(ޖU8vA44HAMkb~#K˱lcGBnKBd*QVDZV5+Q 3trO]* 9aR\* u?Bd`PWz"E?}',FEC ;W kU.ى+<=@!oLm "y.\(2V۵;#!۸;~لVm(]<9 N^ !150p!ӢѨ+h:+]4Ȍ1%m 7ܒV TWF"7[BjK p m Z97`40KeDŽ!`*#oFfe$Gv|qJ٭-ѽG_YBjr:&+rn_,fm,@Ą GE:HZk[UA7i01!̢1n  ]P̀IEhAQ}EgC~CώoChl J!dFc{"=JT6 ֗#``Gİ"(XT̂AEUR4 1b5R.-I6<RvB֩8+Wpe԰AHt0`O2YE(f?6`_{ I@3FvGL jj%bRbף912TV6"(5ni#CmU=H@4@qv$XP߈Xՙ~Pgx Aݐ,V)D3  ךBA paaMQСͨal@(FO0kez ae5Ee?; ƒ7tJdbP*{@TD'ح00Q*mB@.inq.VΆZHfh!{@'h~,TL^%C87Cq 1iɀjA*ƮwnA6"^R t-p3騩MC]nYNSM u0U Բ(}h*wtnƺ4 AsB{۵}P|w3 >EpAvHz O64ATNܛew<2P]G!1[-v7î' 8ƃp5rbHC(-G:&f3@-kh񊉮[FW;Us~144U?Ǘ_~:\ G?|9c)yE?T3q{ܙrKoi`7Aoֻ'eS,)֑b()9$ldXXg['$@Jۑ{=!!3f>c|{$!.KS z't6k18V?߮[cka.S33hԵ}3z -JJ +"X.f>  Dehml*pNrBDzxW U$Z=~o67  g_]4D{T]U^0J)j h\Vn A!P*dM0/ulWL2C;ul 9 (TQQ^`6I6L4@!7GaM#vbbaH ]DR)3^ˀ̙;anl@}!0P] [ ?Zf;*loG!Hr*=r^ywjϝ ڤ]P8#1dzL4E/UI`i08UtD:vi2hf"hIH\u4+83"+F!>Nq.]CiWfwK@,r}<P-e'/@b<>+ < $rzxDm:V_# '3M]'=t2qvܵțIA;|3|~ W/ob׻ )ٹEdd(g¤pzM23. #s٤F>E0'uWFg ;j~%lܸFqTN~@yQ)ll>d2'C $J!C^d`]oѽ`FBqr`FUS3s(N@37{XDg" wimJE ZwY Hu$5f;Q:fH},ɴPkl۵b$;ݜ p>i аxt9:cŭ'6/MtI X\|3d"NeBMut@J WkqlEGp=c])4--=2=Bcxq<ڒ3PD7m-㥂xt}/;~[\ͳ@we|?p6qM}쟛Uo>7!_[C9l^WMgj.nذ3$@(ρ"amxSI1.i!b2 09x*@$ jy/0p( o$"Rc4,ǒ?B6:ut67 ۜp20v)&gfF)(OCӔ.(bEWPf%zM3t嗱?&-LկK0}%AiJjo1 ĢJ1 $2nhD 2FRfGD $8;;&F62jɐ0 v;V"d`"䚳9%r1LHXA+aFHr\&tԬ,v2db}.L֤shBKk쮋:7y#^ y~+'}׬_wx7)z9H6ȳɅB1T~];v ޻aѼ~&~ DjQضq5O3Nj 8ȕJ?rLw?5w9Xmrʫej9 .EAb v?:'q\*B}+a[}4Z F8`ބ;uh;7 ܏QcswrxbXAk|8;=;m6)`^"T$1WTZ >l&V΅1lxʏMy?bdo7JTOD<9a6q/<]3β~:tKac(]vpHy#jW|'bĔaH0%Qz)bV;Uf`U l'5:XJ`Y+T<$Eæ7˗##1'G}Q HNJ!TUSJLBDOh|3jrZmUnvdߒi,pO~Otwز?~cxZj:WBNqwoLB%0Iȿp{fX't܇qz;{n6YꠗQq5eF?43392 .\'{`CwIouZ\`<"eDR`fb౧0!+1jD(ݨ.܄{#ZIQpǍ]땫J*رDMb15E(HiGw\m}o } ;;ov~s;_iwOB۶q?G214fFQuCo7t?-\s$:v. .?Qj"zVsGx^0ݰ4ƙ眇gSaɷK0dȾ бty'(KCFVa9&L Vcwnh=*Qq8CdXGrѷX*W!T̥a6/6 pTJpAB"LQerM# G9 k ;f'_m̰ffax8nih < e@xXP↘01!p؊"tθM$lL?)cqz7|$$]QD/z@ sBI(Ǎ>C F P5;UO^ 4d~> VbMرr κtnH4LnIQXH?<#`-9LiXGntqТPbb~a (Y00(@( x~ ] nՅNzS/enBU5ihwe4wKaS5̹%ܯ 2!( z TW0QY^( <Uavn]KǽBF^`20JUb)qk_$4;;“O=N*@"V;\BBBPqd%!ҕ#3?EѷɊ{SбOgŻ혃dKĸRSbâ 5 jU5g`ڟnip 3hki&g)T뚐4Oe!֠imʬ,퀒 $-)J/`w(f$'9^ Wc`'#=-MFd9r^y7_lA֎`i<J:(V|\|09_-,,A%DKF3<,0=GcQ-_Ɲ1k\ dْGʕޢ| B $.G :D*qmh> P&_췜E_q%.,&zӺ[5៏>p/N]ޒTJHHBP8QH#du,13{CRh:`Ql;nJM@B r48Y!Tv093dBN^:+hJBCĶ|!oAם1_;ǜ K|c%!H>do%a%[Cд;VJ8 p4_52voة;ցm OéOEACjR,\!MaOL_"Z:*!sƟK4O6ĆMm{:n$n<ɆhQjQ@Лl$ "U ( +X Q\EE`Q,*~Boފ3=+v Ŋy7 cG(y xqsj/jXRQd= TE1zHjJ+aUxh׊}Ԗ~Zhy`~_ ?Cl/lI8f Zs+|~|0A,P/tl!_{L-^% $$D)uBD GD^iNZvRcbu&& $^X󟟅ڽ0rd~3w$1'aYl1U ,ulMȣbՄD62Yhc/`(VW-{oFqDjzy'e>[ao@=q毦ㅧ_Pֶ,[(e1PƞLty*XFMfb,mT̉cyV:'8ŢRc"_:3ʨ^&ecD %MG␔łvh#.Oe8d2%8U~HDVq;Ľ> OŘ&!+Vܭ:׮sL $Ųba8t( 㵿>oCIk.Ŕ3@ - < c+)ɁRh %@ <__}%Λ~^2ɓs$$$$!wqLI+15 Z c}}vA3c;EB)1 ZjiR#Zʘ"sW3Yǖ C c  2&]7[ᲥchP2M:@G  9 ?^Xuo/wcFMEOli8fJ?'@(cJ4ŏkŨP;}łP'Y>'AkMwTKZQE)2%-Xz9EuI-X+VY  Fb=JoDC5Gn:!4>w؝h^b+&IkF8ބ3+-J<0UA\vމfڴb xu1Ј[roB>n\~,*0p`iڂ|GiqgXٌYϭa/}m'~=m[oz+w1Wa0 K>(!زդQ~Zzz>^f9PҿLБ8i$vkWr^sF-skqL-n9)!;r%^8? +CFQ.*HrkXeSa||ed@!$b2"#$ !PXnBH\čkѮgG䵅;ট%ʐi5]":*mt|bMESb%ױㅁ|B XyMѧ0{Jt7X7{w? ]mW߇/?[Oy3gc$I-6{i=F\r1<%06Knǖ8߯obWd勤+*|&(ʗJFqa7Q6 }Kb5y 8JN L0fԶ~27!H#J4xx%RceXrR;E3a1Y%DJl1#DH3ˢawcg ͈?Y ]Jy(運   ]Sk׮ִR.a)>^\cp zdmg\sVgjc3};e[aY dGJtڅVJY\BBJ4"?I`TJfp+Jln)ct4-\wC Se$"$B.R"5"A4LftXWpSEU`!$#XEzvbaEg4*jG$n^z'!@Xnٌ=cGs,^s<9%cQFF20B{D6C>UT%Yfz6bbU>z_X Þ^ b-%㖮CQ Fe; +gxn:Qa$# ]h>zUG϶ݰ5x;D5XȾ6B(C~Y1!yw*ڀ‘.و&lan^5":D"qÂ_SOg+%?ziHAŨE-cZ"˱׫ؾz'UQ..8PiQVZSI);o.yy.2|-ek<|',==ӉXvLfCIt{KHH 18G촪jV*ܒu3O>cO1&jj?j-"ٍ/axrd=PvU}r t!d/\8= #\p]̜͆,mF]5$5jg_ 7b0*.R[1& aFs&.A9OVߎ^:PɼKƛs5C vmXEx]z1X~=74aC}cN_ONu>t)|芥BӜ%~o4Z%$$$(LI*MRdbeD& q}1ݨVDcuLTO ?Kkd(y#;Rň_KZ u2 Er)QB&#Id2nFf񠬼 C fc(j_ 5-Ǝo6a%cVk1 ;#mg(V3 NR5 3e7;D [2L.<)Pda?c"1/↿^JtF.cPo/Ò7z52A85ۉ7pv΁~xoVX|?jG@փZJSM͌Dr$D'$$$$䙞2e {׳equKR)qIJZ(JOOGNN o:;;;A6d_?N(].WTuxEak RBN%(]#&X`ES7k=Ŭcp1BдVKPᮣ!MDB@Pҿ37H=.!!q%'\ɈqTlUDXrDVDRIo'PB  4ф.hO#%噙lByҰ^Ri6&x&vͰR݆@وsJ982I&ݼxIX &l2m SNC:4(xe (E1! ALs&[BBJ1>H.d2NJE$qkM$DX-~xN5)!PQ#{Eמ]P9o-9թDTbnEsXX\}w%^(?erb M269$G2`DBrpfⳤ|)qk2j⇓ YP)[Z)%$$.TÄ*0Y}S2Is"*!.1W* w ]x, =s+P~pX{Z() }?q$̞V.ZlªboFZF23p`^l7$?`K߄Vz tU0=Xbac*d;ҙ*cs8|Bz7|())a F()x2{n~Fa,F.CDIbA*R]H(%ROx vJIBuc|r\=!Fn~/ބ珃_1>)^T97I ҔJф5;x8:f8O|uR7\X=u~yQY]G2X5 88ߜoT"Gnˆ\bY RnJU1fRRz(~̫(F b%4Ӭ,Nu\5B HqhGDi P3˧ayԢB=cyZjgԹO7NJ}$}+;e ` "E-1xvL6i8fU_[%d$'@ړiJ8밺`_м\Ɔ@'OQ`-Ҟ^m4ξIis^NIҵQh6=I?m8ґdߕUSI3Qs0fZ%3&8O_fk369`z/O>e9IʤMG>%t'k1S)0pv"3IQ9cx=e[Zŵ??"QH ! "9i82J$f˷{ӤI[G?56>Jѭn.u ^ g{VlŞg-!r8 eСGڱ8Φe4qkov;\7)WyHRd#ARMII)3d,cOzsOj:.Sd jk`[^rUODo>;z3ٱL/DB!C pITk׵)ngJQ!G+بqFiP|FPUoVs}@2D*# )j{/Ozrsw?#[gٺApisG9*W&F/O @-Sv^_yua%M6c[tdW \$b'zBRn3,ն̐n8uζWm#M?wM&B)' !Zl +:ɛ:phnxä\@!dԖq@<Ưa̢s)`=DX. hKx-9 v~;0T 6R#R\j)g."Oz=<ѣU~NlaC9|U*IR4%&~+S9Z,n2uq6*GH{qP'߹cԭ1;^v<"NÊ8Hx X33rYNk82cJLWxpJzsa2%xPFŜo\:.q.en?0Wҿ5E%d[QD=Psf~1R IG,LQ]"oDVV &!Nh<-b2 w2U|Ye·v7!_ R+X)L.4l pxWH A&*83mI;|KwtZG/llqB7O3=o7R_mxB!c+4P}2*e6[dVK'(Y 6^Kۋ8 4z7Zo{tn?*^;SF/3e宷GQ0` &J(\^O"=w[ݲ@ef/֧wPC37nF0kAS_QIC=-!*HDj}0JYFGG.5AkO 5x0GY}]S߽Io.hu 2aaUry98T $</HuHL,|kӬwtjdL'yh X$$+e?|2ʟɈ0> e,z'ӳxBFH ؾn[E߮#ج<ۧgS:jF'DlKY;<SaA`=ڔ_,pHwVYk2`mЋ2B'kșHRn:`'&2#&y^VM"9M)7Z 8=OEaJZGXs|m WGpERe yhƶT,Q7Ju~FB#+S԰3kyb2 tȩE~[;bw\̆EOa35֡(!ijD*v Äz9WქHe-_!xdE>BE=4Ev@W Qhݹo:h͎3Kܯ4 t XHSiSpk˦*B59hsG&/خ`!/I7zUԠ>*3 zďJCBC_fta庂Z,7\aܦH0[JvF;1}n^qs%l֑' A2Oz+j|_]I;*;QΠaeP+’w dC Wl 6At_%(%p\!K;/ZV6qD_W@?goF!fVv}#P)i+3-&܍ ρεaa6y4cm=Ck#9\,E~n]Dy}ė,,Lh)6׼&#pp)+/T23j_ƂNeQr엃Brg6MH8ڼrq>ݵ+jzxSzDݓWJ6= V_UWuT#f5j&CCH핐[ b*]GLxL,ȩY0ɂ-E0C()Gi%E rr PY^vMYX90K>0z%'̹ty5?JC  D#$ B}8u%K4&'Kg~d9K%|dK|/=hS9s0%=EY>oP'_pVq]nUh6mÍwRŽ@:JAʺ['V#r[bc}.ʗegDJ&Yie)WtN@fm1>#KH(%_,l:Md/߲%%&ib %TцL[@"K*S<b=E9E j]/>ڥϜ|( `VćtN^h' !DCeYxl=%g *H'I4mǽ .L'KK[B]$NeBd/J$Q݅%9hyd6L-XЙsl\Zx3*SLx+yP!Y걎ikw1]'FsM+N\™}G@>Fy3c) 7B+jbh/&G%/l Qu L]pxW4jߧ` 6d batI,Nx^O .h[-/:YV}i~'(THX %s<CPQt﬍Z >"*yNWOoͅF1kXy˿"0A^QMwW ŕTF_)<2+YV_aBj&[JsbDj`oB{?xUٌe+*~3%ER OQjNoZ* .GTNXL{eifS>.P*G+G0L Yi;z$df2Fz||M?UQ҅LJ<e!+bPlmrDl(ԡ61;h  w4J6@շ%bk\?zOuq+ |1P_qg@ I%ͺVt 9]`J#] 0 h S7f4&bVF6asк#xGT9D_wwoJ 6cXJa0QۃƳx ~ZGm q 7 W ŔI`*L&Lbb&/әgaYnw( >ȷVY!d@PI"3*qtQܰMI܎ `4pu6Neŝ`E^bcR+.ۧp5#|htzd5>:muXN_|?k!6,Ҋ,jKDmlnl ~R30XFt&5ecTZ;:YqxrqOrv2Bhhm+"֧-ƷKBp,ρlKuu˽R )jNn)'FO[@i쪊P՟9 # B0Ta>\-scB+8<%QmD*%ET$N?0e LvQHQh-2'suBbpTsmy#D q"V,;NP-jT܄5 box"Вͱh[Ԩ"o?2/"A8&3|Ͼ5HP)/³2> ^5ei gX`𿌍Md.CSX}p9Qu/͡^(^ <!djBDSFY02!_$']?kD;>1R0<͘>-UPO$@'7b^foOF\Tɰp&WIeZET!6씳& Q-AKc4IqXb,|:T{WB4K^"3ďLWI LkH 31 *e-BC]5Je<9r:,`E[`x5G{^U-ZwB$V6r. ?cX0s9e-={b6 Oc:,q:zXHU(ם y  gFFZ-j OOP1֕5fEhSK)V)s{=K`A?Uf$,r Rv] "Ő$ .'):s5ȲVE.5k_~_*`zM6D搇 ds  b˴h1ta'-C17gbOR͎K j갩s*C e,ɡ} CqQ]|`,Gݧ\FR;}iQpYnI E%ü&wkiN Flr!3S)^o J1 ~G#?$Uٱ_)Inz|+-m~πEHP,g;df]{hJ˕ljl_e2=g t;fC nThsu@1_zm63tF?pvqI4/oSd[AKMz\&] `b,p#EѡwR1 |"Sz?}HDo|">$ϏB&}{4q:5hM(}\EW }סuKN:39.WS/P$qv $IR_R$ҰS0Z5`)0IVxs dR52(tGk4y`~Adv/0.pcK"s$ݓS瓱RɇsKarbD{Ysn.IYM-m'ǵH>jYY.׃9k|8ٹ8oWlǪ LduZ(m G(PO s@C2Ep2϶`|5pagΩj;a;D>K C:Wʵp(cPb==^6cF9,Zb^HfSx3>laTW-hui"O8s3!>ҒD@$K`Nw@n>ECt*\ ',9VGH͒ = "Č.;l@n?EQ~:'jr*u>m<|%闚O5RDGaQQnjC6KjMiYu؉x, Rܽ'2S$+Gqa69ߒsӒe ,!XKuPiڑ4yp6"q#R̄G@si3sK2;>h#pN&.s>#EaZYߩX:KYvK-XVl[څgDDClI#L?\;B/"pAUGZU$e@9p30ysM;%(_YYIdO.8f'Ql̑KaǽÑXk^jMzX1n_5u.IA]jZ6m AW$ZY^nvk&&L +>y9rqk>f2UǨ12.?5q(͌2o|!N8uNT 7><.4PwMG 5wE+2Ԭ#;25PqQ8FxB>h/-l7^K*^R `Hނ[Jn6xi$sWW{K'F (w|t͒ 8ߦbW:[F$O2 ,'|2pdK02r>*(aq|Cәw쥱oXRws&,̈́t*>ُl'ZW)`>s6f ؽgTMxւ9iaFDt8$(X bk;9GN0Fi5+sBWZ_Ę&2es_ZvYJ5&u`?^oF[o83' iwŞ(r-L9} 1@wHn*O/#nC-[Ƶ#.'ߢzOfo, Ĺ4ۧݺlϔU^49>S݆v&﷙Jcާ;S=/ޙw/kp0\bRHoك`lD^>ċr,<*0UY)b@(T+^5 QزQ`av3tdV2 3nY޻$V}}ظ2geaڌMC&Ϯ㣽|h}Yf7c&2$ {W}Vl|ҧlHEX~(cW- }¥̟xis#';6-Dz5ϖkc;;k<0I)WE²9x_FN{YcLq6Jֻ:?v |57p 04騮e΋-~P}?ӛq/xc#!^p(ĉ9"*l] K 5Ce? -5F/:G?b"ڨSr1K|ZC;?b2[}(*{O dRٝ~c@G{ZESU_()tp,2`MWg$O %$9Kdq8@S\W IQ(*gf-6A֮ɬ]s߱ 99K3<1k')c45w% _HhO=,0+CзHȊlu{nEvood㳗]!Ӝ&N>k7nިV=qCRNJF) r'abʮ ~k`zܫVq߷I2zuٲl8E$lp@r2Xr}0uRӽs*!cqJ49zfwc ,'ۃT&B\Ω } 7XbhSbr*!憮7sBrl;fE$j irɝSn;FGn7ݙX2Ǿj>CH}1EHng~jS s0F'_'%zaJbliXR|б:+~4N,ذcd"Ě~fa zPԻF$6n-{vbp3F: O3B}1a>VNlEDkdޜ{;,lؓ ]gr>o/2(~A9.,JB%2bM&\Y9C~xH}DqQm(]"Mߺkӓ'4g%84 ӯKAAG4\)͈ᯥMIiD+L]cܗ7W*$I2YI,\۔ɤVY(UY=A 3NS+N,de&A>x&FF//@D,M_֙&J="-`p߿N$U7ʟb/)F3&(h|4*PkͶUWBlzYAk@斖s8`&8;K9!ha0\/,1[ڿp,΍o }?iPw*s3^*3ڪbSM9Uxgp®Jn -TN4O}_M#RlMuaw@v"&+'TF'T.2rݏLZ kg(ԕfN$U2DKL~Ȉ7RX3Qa1r",JPAw%Wd$a(5}usU~>نrMRrOhx\*jYt0DBSlɯ0 p /ސ 50rtOa,^|!1MTXػ*::^C[*.[ڱH-_ }VtT-% 'nZ ,;B56Xѹ 2c3wj% >(CS*&~T4g(CgM.$ZL ʗ0yNOC??`1FF+'Ν.%M>.EƠp*b6_;h:bXvgj9/㌺6qulЃA5=I$s@I:|\M<-eT j52|`0ZsRbH]hTI_}NԪVц$C' 0E.C;׀k?kuHoGs=WB6{T(j-g>PoO-&7f?[q{D8dTY/w _x?Z-W$J U t)Iܬ<=4="zq"#Rt3B_ dƊ:YwEoم$/I`dzwV2;K{Gbt؈~?8,TsjuD4pfHϽx!nŰo 52%,^HD%:]x\~IQrwwj0kH$:NG&Rj{+15_.]b~\vRRBhG*n4)ϛ;PW)]ٮ&)z Qzy{){[F^98ZMKa7q|a>e meb'n 2Ozj4zT+]ހ[ߵHZuJyvIVCwdoܴz Ԋ'@M SM"畆]VeR^ nw52\ɵbP0<ҌW]qt( 6tأ^n`@LKXl|Eq@*DD Oʹ2.jN%oFoYU#xFzb0Td#di}J`K) aէWll5z2K2BH n k%K<9Y V`z7e&hUU^mpb8FRe9_:쇥VfW7ڬjJdwcmwf6//Ҏwjl[X6_ \­̷m33Ӌ nPؾ:2RlOИ:άqF-(;]_0alMK 5|hdK[DgQ[XLʈMڎ}dI\A/>1C#]=;f!?|N>T|>t|  AVY9T`t8➁m9o̅mɯ xjt5\<:3v*\R&~0c[kBBe?!f ?,]@*H$=Vo+w!@v{O\h d MܪJH"rJb\Tܚ v[im+g%,: Zd˄,cxl'if  jN$'=PySRp,zYSPTgj4,K燐Fp#7LmqIXM(o(]cnrXY@GV+vۋ,ubBF3.gfӢf(jCfq%Q+4=p箦CPL; ._SE#3/ 9F 1\KyaU~)&aXL.z5PVjjNIUa:E-]zk4%Z⇷2'CCJM3[,h oRht\Dz溹5"Db^R.l0&㌂YYYX4A"[ %zH9&-@QD@ % ^wQ\Sdqyf "q6)a3cV%ܔ.3deK֚@KJEy!`I1R,9 ,J ŋtGR&uې+poҎ;@ E?-J0[T/ddM܍4)o ;HQDyP {?LFϱIuPZuwz߁$W!pEE;TV&\?k P ?y+!RZ¶.Lȸ7 :(%dP!.p#^.ܙ2 ~yE^i pr .KޛDy1o;@ĴA<,xcxlc&1(=)(o[oBYPiZEEW֖Z~. g?C#È@$Qh\#W^>(ׅ-#Blg#|2d!(Eފ06Sb'^OQDyek^I~/_Ā(?0ҟL{ID׈Dg% %ZPFQf,fq۹g0>RP2n#ƒDE*?:0߹vh*-!Y,v+UmQ+997Bz=l6[> //}~~w:ߝ^_睎qgu7o\=W/^_iuG/'!W+C@ǵP(^78_Kv>F '4͘:u*X8䅭ӭ[7lٲE"J@Oo _߽?}=uXн>Q}1O!!!j}//쀍7vI oWP[?߃vmw܏b3~v ?׿m냢#jgý϶zv,~w{}C8aF[˛^G~QDEQDEQY7"("(- ("("("EQDEQDE$"("(RQDEQDE+7g˟M#ËwQQGG PyA#Ja`_^VQh=xϮ%<彔?`a\.[(w-.#RS<{_թWaf޼y_a2D(J@ɷ%KO>F Gn6}e$kX,|O,nz'rO%xr95%%e^Ν;p8aɊ(>:a=CLqrׯ S@3gD\\/^ aoXVoߞ!C[n/%fP*h֬3pd^rk!T4}fff>O3!z3ۃ?k#I2xz[< B T< B a FIdE%od n\?{'.@ UQ&> S?^"nBj df`wRkTŢ0FiZBCS!ܷխ ֲFQCM7q3#Mpş oTr*TjQ)AEz'xgef?GoR%  1Z Un8n>z%|YH5y Lr&'RҡAJ'Kfve1( me^{G8B#,22R QXVVΞ=^S,JVgΜC%0`+y`o0~2lٸxj 9K[Z n8 4}K Б`4C `P80X BZ:o F#,n,h"1$Un\V >AqV~<үo0bu.TH (`G"n_)*0d۝B4Ɉl 1A\4(`̺o$F{KVYTԯxqQ!) [GzfyWa:P;wsWV %0 XWj jV/c9etqJ4h $" J6[5P j6S6Lu4 _f=lP*]0"4t,k']'wB4:)4\%,8v*ޙu<tcCjDl""lFDHX5| s`(JV&C.Lg , Ilܺk< zwTy"fd f/L `CPh"Cu1FXBuEH2U̘KŽ-$F 0dRbjig[`ؠc#AB;!e"QOVp`/x0xdZDA#; _+~*j1йNHeB+(ZTQa^TRD%x'gXq2Iu[bctȼV&!::S&,6Y8?B&(׆BGmTJCژSBJM0"t@p]eq2݉f"Ttm4R'Ԇ E4f=(C9C ]ըG B 5aH2.kKITWFAr>aCV: mhTrRFJ-Ԥ LtXtrPߑ_ 'k|g`FӌJ߫/5zT1uQnXVٷaPF2ٓ ?#~S#D4t oMZ'> Xķ;G08%jNp;s9HI7jgL1MgA,ԑ1!]rW7k=k ,&;oū+#Kx׷xD P-@zـJGs.b"9gᒨ nQ#H'Ò)Chv"vv6 rחq4GXДj1EQ Ѕs8 a{x0fI% }+{Xb>]G? l]%f;͡"OHVxGf.up(‚@VQp<[f'&]϶FNE$C|Լtl?}ȕ;nChVhYY3'#3z? A38u Vn?jmcp8OW㉁/[!< .]xK)Ypvf+ƾ1)Zr7E %p%w@}&N5#+{;U:z?A6$AJ#6^"U9Ex0K@=СUuXIzhR%X{Պ#O0'2n:VĝP*`᱆Pb4Cެ>}:1`mۖI W0gI˵9fc#[y~4 Fv/}0G0>|2"yb\bxX3w0n1h$.v,;i+ŲQ&^8p+GCwI3ň{=R)W Ⱦ9#aH8EPr8s}x1 356B?cN S(>x AHRj7&~6 +DNv3.YZ8"uPb_|?oN 2d:xX z OͱK9АPi#!Oۆ7(ĮQ|9U~Ct'|z0D0wH}m<4Ha8wN'u.=6-w.C.{$b%+̟4{W|?2! Ohp{kS#W<*g!gEE(vn-2*=Қ D" r >7e]#j%Ldi*e.__qIQMNJ=ꝗdgb2?;C[ Ybi.+a9xy2~}LXɰl6 f :Lдhsǒ&y6R™1nDpF ؘç1kH3nCbb8e'ҰdG8x  ej:sbĎW0y$z`{M_X?b6I+V0LWI02YNKJ_^MCaf ARVK'+$'_yg'O-BከQ l;L 9X,['kelT6T%5r™yԢRFOUˋ' j'1󣙨$[9tsqx l" X?;§n+xoܜм|ޝTW12SIj3>uW@ޜhq#8uَdG_ܠQ4w=5T9!s\pZ9?o?? ӵY8 oNHT;>]_|;ǜ7ql&GGeg)xy0hw0x7ۊ!5ʁ["{-Ķ^hfѣ7cߎ?Oȑ#w,vw;x hRGcLKl~?]׎;{q3Ryʕ\O&|0xc1 +&`֖Y83ju];~dzM6CsCnCVq,9Czae“<MܢspdX!,g^y!?FmЪQ]t ڈ>7`Ǯh#{JwmbvbyX,hCUu6.ŰOy*tKU31a*mn.,MV 3ү%qEPz9[cޅrox뇶3bodo(LEMo '%2%cسv,w[ LmƉQLj.vGq7f\WX<*:-Դk01cj{b㜑opA/ĹkohZN+'M)>('2i2J*G5,ڸg0{Vb$]KqvHMǷσ s!7nF(sCV";.Z~5=kJ ϻw`lX7g=&Óv$aUd76.J1o S㤧(:Ԯ%+s#<: SWpvٗXpoM8Ixmz,5͘/ao? „D?#GǑw˶rÆ(?N*hH/lRҥKzj|Gyd/.L6o,iPVje 3o(ұjCc~$(j=v`է ~_]%p_Yw^⩓x{QLh,T\e:~ߒ $1DžK.B(S--;w6 jwy d&EȘIF=vN^1rFO@6Orz2~ȸܺh|*r +q*%SaDL8zΖ|uFe Xy4[$E&IP~<98%6[TpStހѥFf2)^jDl-؆{#&\(7I7 B/)okv22LgRDČ Ky]T(QK}e6/D/Lr40p0(m< Gѽ8qiKsY`EVleKH2Щfe\!|pپdēEi ;*)> D&#J.:tU80>=J+mGJ|^% %:Hć 0 _~o߾cdy6%%%ŧT в>(^m G:>pXGCjN'bkResڤZjXTz3}fJB.YV\R/J Rs2Fr,v4 ,L\ԛ{r?#'.‡~CFeM<jzqH.dX\(!}'ZXeDzf6v7t v%ٸpq=6sʱ1@I֫F a&k- n ~BNwe_P~B*p7|*tNjPyJs*TGx?dhܙi[X$-Flѧ > +nҨ- ۵~քTv=-MV\K͂CVZ  &0d >W@kBKv)(S6;ư> 6Sf3#C lhMMI%'bjc$m+*;Bx9Ү߄':}(0R[OowMaT-_ώ)Ra.G$ѥX-YYVKʤk Bɣ8|)tJ0p0)Lx)6 [},ddi 'q83fc_p!lHA\yLW2 ӱB)7إwX3M8Utu9&.^* 9lԋKn6Ht (]B -ՈTjR2JL0QxVRaC17d6|*A22NlFFM팹'u"ұ *>wl`nMHր15 j5Fa-/~I1fX4a"ح_#tJy[MnU*UP8k?NWc`Lzw86\tj;V/3n&@'?FH'0Ś;\̸gLOzu^4Ҷ=YՅ žVR3 v2BD;rSETl9$2`&^തSuNzNғ.9 Øq*uy&ȀMLIjBշΗ끇"[3DsC&L@Z S%$))6"+=h*Poi甪:r@R1D0`Zy+~UK7*vB9C)[6)UϜį#yVrp\^kqᆝ+\݇ޞ՛cX04 P|I7cޯΫ`Oj"9E˗a zjPT@,zz 3#u,E/g+P$\έF#Y?|6ڎ͟CI!Gza _=mBbިlĊof`M8p<05fMh$:T-Uۈrp58HyrT -_1D^:Cof jWϟYaEv{v?6hS V5opdsRWϔܿMI%g(R`*< *䖡“ɻy p$&%bq9y!v6. .{XhP.. +ODzw+"UmYE6cX xKcUXdޅ"6B"D7 kqkT:fYn6l9..!&b$&P"jٸ%%'eLJK BU(*_šgp"EP)!?=7a'fPDɩ4J>kŒ?QX)x/BU<Wۂd#Dj$dIǏ5kr YRw~.w:, WjTJ8 c+I*4acsH@ %qrAȫC4i~lx= 'TEk&_k̈"bZTEVf6bzl36NCCe3piBtD<0&k r)yS._;OdYvHQ">,)/HYZuvI@y'ѬeS8ӮGx(=>B \Waφ5Xz~?7gD}KquIח*8q.ZU[pdfY* qAnܸt/ŕ4i:v숖eB㹎>7+`ۂϰ|*T GOx'pj0— ݧSU"ϱl1^< {LJ}'\~T҅*T %?c;c8u+n[epbRs7j$|^:H\ S]YMKhvEˢ#WV7(7$ v,ƨ?D:B=$&uFŊ#5}# xysԛ8xsHQ9]O#)Qk\#&vÿBEu4u wCWoSv!I9T"Y{/bsT"5i}y}7'jN|)bAHJit^6E\0zvx[.;@.{q佡Hd*{:B¼l'WD񚯡eDoshhY"[n~[UVJ'lCjV1!*.]<=H bѹ[/a "vF\$ePBVk6`i0 ۋb5SR{'Tj(uH(SH7 Y|Cu"!'s~;XPh~о~i"6.=Lп c Z}T/92/lذYydߏ?mܨ|0ת`Փ 9d&Q{5AATvh]GvmA~CtB{FL[+.K!ElԻ!>^4+ᵑ}96x4axuBB~%,1oëDtHR2C˗Ko_. dܴ άhX!zc:`TZaa h2pRr& &@p(1h׷ .ԃ%E-nV.%Wg\u!єC֑w|!r#w Oͨ ϷԯbĠ X ({˖sbr܁abػx {ϠJdt1'"D%Tp &/ (!YjZY9] ]F ;aFBN~\ԕ!=$AD8圮٘ALn)xa2u!Yg9 K6H-殸@g`g>&X^#7AvKt{^0oKr6 ^_:gal5bŊGGsł<`&xYVVn]J͎5*%b\8f.RANe6sR v`|e3\gypP$&9ˋ916"WPZH̙Ixr% w`v[t{(Y,"a ʄ Dj,a%\KA`p)u"RXPݟaE'Lrsav"{\F0R2l#ȜJdzrW!gG֢ͯ:)_ȾBI8m Pؐ7edC.ۅ(I6|&kK-d'rsqvjf/ZrPhp!cʈ nڔC V!Ap|mʉ% R15!Ecr2 .3JPl*xd1䇯a[Ŋ_97e5p80l$S.߮'G^Rb[FZ lh=Ao1zgF#w/71UʼnUs1|$DHlfQ 'y饗m֭Xv-?}ԫWン_8R5Y<%@[-&0k\,a+/w;'GY snx]\<`&bӸR֨aȸa6rdQ']||9!|\lpN_6ԮD,a'ZBzNbx}/ }2e'wQ 6S#vt&:jzQpprٖs$qI-DzpFA8i%}{ pZyrr+ 1]i8=zFLXd]LHTO-䱗p {vw*4XR)7Op;#G(g3#r{0F7 sc h_5 ,o}X(n5B[{Q[釿c 'gνN)Y?A BOsr1ad|Ux6a&ĔPwŽ(\S^ @*%xsJ%ĩ:;}i񉃱i7s"Т^EHFJn@Hug$/( n(@IBЕd31杮4DN)f;ݞI]A^@usy7_Pq7˟ ,u`.\L̈(zwJO|qenE6 `ih$ 2Xf߂߈+(p?׉')E|㩧@0C_&U|z̐fX(0E` R~bSPF LUa-l樂+bNLRCUCqb 7($}ӧ9# #C[µ|YSoRNaJ@VoK *Zr .({RPiẞ+ ;@GwRhխ~dA bX:*2:,0ˡC*H;%p4KkBoc W=cܩOAygdžp+HAd^0#...!QuNJƞѵkpY.h9/(h$[A(%/}i]F` |79=%dMo[F0' tgbK>H; #d;ۃ 9 õ%Z˲v`zzzz Q}^/K(8R,aX\Rq eN#1)WY4b'\E{ԁr}EB?(=R0Xt<$IR)8}Lnh\r> 6Jr0Wض<.QL\9:HM2F8}[3p_K('<"HXN`$<.kf%*|#1u@َSKxx?ԳVT&pEvwg5M@P)BL(SҷP#~ES;֕ϳs:o&$U5?]*ߡ@[aÑOa#`R<(;Xؕ:s3 ė* Lx=qD?Ư+_ a:]f&r(Y.Gio6lb@Aѻݙ,JR%,+yId`6;I[(CTBٓC(;j\:>b+2".U3nmFUJBd2#zx;bZ@h(RQԊvֹOjm>bӐ"*seTqQ?c=qr`YEagˑwL:avycgZRV\ٝTr:ܹ 9#_~mg)q38ŌҜ}z8_!vr8qT|]#\׮'bR9l Je˺:Yw1)(Q%qv ]ȅHlrϝخ |(.%;T$Q1.gvdE/jܝw 7;?g!U+S$8.VXWiRLO26z]' @ Dp"=WvyqHcSZAixs| zaכJI6h* .ȫ:m/2E"΍k HWu n>LYNL" igc 8 yB0WntI|v # 5> toL qBjrۖȬ:4\VsFi7;*7,d ^yNDVJS➋Śk _+cf[\{a<^\ںt GM]o)'))Jc㭇'tXD$/>~_;p@yAJ")ii33:ؤ9J .FFL(d8W~nct ۡOe/)qm^;=Z7F^M8f[G鋊YetFXPJKKjOdyU|x l#W-,l h}A9c-aN l2OX68>s;c3 cN2ɫVRVŗ'XesϨ_âB~ C))<[yC]GRBE19NC }6ݤ;J^$Pp]%۲lV8bcGL,-y+tZ088W/xܺŦ֔WU `F^5-A>Z|3ul(cÜM%uɜ׭9>?"ՀLY\47VWNFʢ_4ona4_Hi^&fmu0XG}yxڶ%e ޛ-F RƦGQiy Xdk4rapeJuZiW/PԟvY7 xnR1{INYWkirJuCXt`UU{Lf_j)>- i|x})+`%0B- m4 M]?J’UۦƱ\{=um$TQ8ΩfN0`-r I ;vAA,uQkꋿNvőv󔈖V&BH 1T}i.VoVT3fH}: c-BncSzq|p2ʸSV2jPu\F߆b/*[ϲ&#nᯥK˥Xy!#a!ƥ09Z0Bb/'۰F&C#faLgI- ֣(RU9)M8{^ {%֛ cyvA 7gKmb0@Knw=դ[uh%vdہo^HDj"w(>^D.@ kA-,X93WX뙱Ǘ܇/-$Voȧ.!Nbr>ZX^Kl`?r%52@Lqd8ۛONE2e-9=..Noey|kg7x`hpLL,?p'-1jeM}w"g|D՟a>kZ >@졓.LХiC 23p g6|E4al"^ MpOZ)d8Q ?Y81U0ܽ\*⼚ԲW|Šx]}ElE]K%YEzi-krH]X$d/썈k44|Bҽ4|ۯv`/wWMd~|qIwd"2نF5 4װ2<<:0P;K\|ڠHGFАȰ"fc>,g"MIiL|Ra P,P~x$+ }]QJH<Șm?/DfbYSC /|Of@`  K]n#VO^؊yȴ߼TDymƅ}{0~0{b:u,&dfV8`F\0 lKdlfiwM

    @vt"dTő>M5S}ko/wG]Ni$C%~ݿ DJmamMe9}S4;Lz'^>};pfr]薞Mim5z/>(\MP.} %c8$}Zrh]~E.tgBM+ZJSc6ad޴{h/E\͑ K^O@`SPXJ:o $mrȜHݥ3Bg>V7R͖XHoՆWh%;6`%8|+4iHZ|zVro.V&Qv7Q`:5,/ѡm7!8[C+mm&apD`(j:.'uUGa 7"W+c(HC;L62'5Ai[h0j}ttO-{l|#*Lk/R,>, ])5,X} 79&潔`2r˸xųh6ىiʂnvhӽxޟr$Y4,R@z3'{rDxAjU" Tׄ.52Qw >3FR&*Yƍf?$rň2HivGO0c_@$q]VE޾I~YTVE> <߈EZ&IƁUI уvy8ś{|!7f.؜j[u3 qY{=PRmݦ{v J'B$hk !$".ξ|J8fl= in79 !L ›+ eh~2NT](Gq_u_͉l$kKes FbIΤV2ͥƚ9WJe4;.2\kEɟ%Y~򵮌I18Kz 'lwǞpYT—ql ݅`"]Wwh4Ȯ%Mn})Ya%6~g-Rt3^.߿ QA]`^=x{a#HpqÁh}4  fW}?N C¬h(P':Rf<rZ'PN;]/m |lK|$B**}5t)FF(5u4f+6fz(rS<U">DSƈs6[,q5PTS?Ynq~=hѾ$51ÚsjMfI 룂h퀳|cF?ˠ?:׃ :rn6cS@=wxEʐz>.Yx sёFJ'T0ǩXFd~' R! JGce\QcnY4*(-!2RRX[.'0ث6jr!iܢWǀqI(ZazG h[ [KJH{Gih0 YOv[UO2=zk%iBIH dȊ_s(ȹFі`բ;;1D*2q~J 5G6ުFTZS}Te'AJNOy5Ql08WQHc W5!}l^|7DpcM"M[_4X,>YIݝƐvxxF;ߞP=?҇VEn  0j3A+ƹ3iߺ=__~Xu:J ZDŽ.1Pc4򕰘~[C$!J]Kjw6ׁB"8qpF`/X݂PďjpX\?owR _eFL)[*W'qZ|*Ю1۳B"b)Mܹ^%cps0ÚV`7~VYɀzMS+fp/aV_p6Omol݈J'k(z;nBv$ZEt5oJ,akG\^DBgYYqbPN [= pӗ)F or0#&n|e a㻕AfA!轃@fb7_–ʽcq l=i+E\}e%Ci ݡ4fAd7X{ckJ!?F6 gǰN6 nV ί~#ߪ*V&.kk ={ rR/5/z$Tb9$:?V#,bX:}| l D N[P\~aIw<*ƱK}N9AEKN=HфD z:sES_fSV^Ex sЏ̴@ot סDE)'kRnez4,#Z]*vmoܽ+WlSG9+DqQ]/2u=EֽK0ŭNhL*IY:O-JrJON*SJOV;+{B1h"_RP/&ҡ2xXt<6󭺮 =0y|(wKE0܀%tCCR**^Y7OWC֋LvS\1{n0ts)Ɨ n6@7"RlFt][6a|j*`VGcjdd($~4%) [B\BBQPӓOTǏ$!udיĔsEDE$p U֮CܒNDX.QKE0t_JKKH[XKMDge e/V:|Ye]ec΢Oi- }N[O]ts=J#%-5l6J"@Y;5Q a&#@K2㘡>3)q\V@[A^kTp5Օ>ROȇRm```5{~o=y^TG '(uF^¤ʉFH4Ơ[zS a!6t ~.]h)f]vN+:& +^ɤߍ@N%HǑ[[GG j)P/qa+ZeMW2&LQ O}9r`r6Kn$_b-D)9 ǢB\A*}7wל ߴa8iU"<^9EOyn3Y0|LW֘5@ƺ MNcg@ xwL1kbdmE緹zAMYZ=x σ)>T iWD MYE \ `WϋWH.wLLف\Jaq[|<=LxjQ q x)c!1' |Bzrf eO%?<5UTf/7TbCK7:H߻)+?ekYVדt {2̲hb@D*7]-56o立Sg+M9k%UG]׈^y׸6bp%&3"m$]b *'Ѐ̊}Χ޲H:rp盂>LB3grA2deelV2P)ܯjg(s駙E3P #d}.b֗hmYS K.hҏaY"6{ob LxNpDX[MFl [ Cg3Vw`C&3B7զNN6D‰'^[B쵓f55qu)on9xդNbWvM%>?;1ѻxêUtF!/~qZAJkwW\" NCdAtDW0E{: .[=h@:Ͷ%STCz/,24ZS>~P#Ƨ%Ef}&z(uB@6);wXM$J, b sP]Y'XEN${3%n9T#Õ $ࡐw`3@=^5JQN,(CF 3TUr!g:{묂KjO|AfLRU?cSNjJ>|U8o-M'@DqmaNPyצ?OKV"VF *yr@E*buu"FTZ5euKiOt|ds3/# q`j_Ú;)i7֪a_h~_feU)&F&Jgah>~~`\0m7hy`,b~twgGֱC박w!^:tsƜy9KE*>/nMxhg &R5{24N>ji~߬ƫ̞ffR9{H񟪛ӒncyfDؤ=MPvuRSJź#guwZ&8HKh4ݤ+-*0܅Q>p:>2g`nn^ɠ1l"[g$s91_{ؿI)-f|B-st.n oazmݢ#j1yR!|y4e3"Y!0?-Z5/M, v[6z]Ci%TyG}uEзHUX~(sوlMjKeRO.VǶR}X{6nэư7Q]y\qԕ,iL{M'q*FkDOɻ ~CUᵂ k1yLw'{[ElB`yzDz$Okg!hDh(-6igo̻Ns4b 8waڽ>1;e>; ~tiVk y2 5J/NqIih|mda;pַ|]I=ezQ@DW(]uk(9<CǼ\0Jy"j)` T#t&$; F7mELޘ_w\ve_PgDg}wypcax_z뙅Z+hԥx~aԈKz'CQ. 6o)|=a`Y_7_MeFqSȄ4-!asIJ;P;Dsw/ِ=* ' 5O }7K8SL=(ȫUܹ~_3ia>18#k%MPaರQ|G=9vS> '1< {"H~%QO1ĺddjΝ\N6 -#gml8&#wtr s75/{mد2 ~b%rG cE^j_m7>4HwG!w{'a~(O Ԉsϯz kn?C!t MS5.){%#'|4ÿsqL9,K4$\$m&?*|Xh9]0#,A?kJJ<ꉂMOb'G¨ #cs|\_*C|ӸH̿?/BQDw>0'dk!2j!%C:a|$T6N RIvA~齃WhLL\#E1!7SOLSW*Hom_ܿs{be9R}6R#\Ʃ*nŪ$=>f̓p}+KwZ֊k3(O y d$5cy{2}űoFi`ܨ'i"aQCPť ԄPVPI@/}Xbu'sFà CО~ DȂduqƙmZc"a uILu6C:~:2XC!VOX/zs]]בlx^Q=x*0]kLMKr^>//ԙ2+fz-x¦˛zr/(Gl(d&bC(Oot':<հɚViw h'R ~BEsTZ%ɳXܠTbYj4~޷} 2+t`зچ$kY#J!#/>d!Ro$l/*S lƋfh+V *c"mZl9Ld_Odz`3\ENJ}3a㬝zI t2euG w YKBz2t~a>`RjA%˗-ޖeg IjGai  ?é_ ]C'G4 oq&A:kN̤;\<G6/ FRR>4ZeoҰ:%FT=ȳ}N_n on7~]j\5$2%ZNU= -T yEs<вUsw_Ҁu{IbtFndxw%~̇dUMY4T}-`h'tD:xEaeO7D)l_>ny[JIet-Sy ͧL/E8Ok÷f m  RsJ5r/OB:ܡ9Mw "[hi_Y8uH"瓧=E㶶7o8bݡjÍE|@w޵/ndr|!;)zr{qifZPVѼ^.dP0 P41[- !FʣA!ZTK:lG gQysV'0!H:QVt*CaC{s$ӂB)ЙeUȧ`rЕ+}an%I =(|8Fʇs˻diCAxu|6;CeK2[ 4?O5X6wɆ /#k$`v,,Wn+u.|Sr8LKnR,~'迿&2)cS&qbȸOF#;"$!DwY};[ UOnH~^(A y6PK>6N:z7tOYC˦sH\.U /R] 4RX*#3b/\FbG&q|\|噙ty4fjX Rqҹ-D=Qx " Kf:JJ$; 4)ndji# $A@[,v{(.s?l6OP[ !p9Nn[uBXguqMXs,|R4~~čUQyyr|4CF@ 89 Ӹf.#8SHrJpX)<]Xwjrp]D!]T=jD>t\RF-1O|zow&6%^w!>@6vv=MC(n\2#W!)5'lp:@2۟MU%@#;hxo3sOabl236?^A҂HMi0 !n8(OS8(;֗aE;M <+l4QS.P& cIS|>jBp/MG3uJ`T K^2R$h (S_W&1l"_鮟xJlճ9&!4ms7'_TdFK:J <%Y1ÙKP 䂲ФϚXYO>8L~bqryiO>oA%q:2mOoX)&4Q(٤>5**WQg k#b2ˡֆZZy0ZE‰F$T΄pᘕ8zTЖ ׈מOQ<@Q8\x)B{3bciVM J̄,ܫ .,zۂPX6G)EGR Sp\,yGªxrC=Xqz;lm&h*pJ&l,"d vDDH$5<)fܫ>rDC8A> Zchi)| k|$p4 :d`mfEԓ_-jVvh愀c9^XP0xdAy4/x)ֿ'rQ|!BNٯ4՛JgiTI!`XR&U8)6a869 lL]1XP ƱRYPE nƏX؁nhSႎn(-5ɝ{XЅ!񋉅,I$)%$ifODmK-W[xجAC :ʸl"ܩE-)0x#EGxn #ɻ@j+Kt&S-?HkTö0gR .k,A+f8"?uyӊ`0t<~NS;7 !GkkhvX2AՄfEp

    B/E*mS3'g]^$njbFSM=qTB0vY Z+O2ab*,':=s^dT] It~@zзGM,!7"kE?H"'S)Aas'}Ml[#7{%3#0@5P2\E-1!Cgg>zg*%q^M_n&Sѻk.ԏCzcE0oN\3^˨5)lG/S#L]$>bY.} -V6l zFyqa (|:R$$ӽJA!>TOeEVU*O^yp<%[jPqPlxiKB  _6mXR䉫$.:Fo}45#^x#bE2s:HS7k'J1{OTO*?5)j`;΅M/rˀ4L1%G[c+Yv PWzq.% SĚ5%$ oW,`(((F|T%ln{޼F /L+?]+7 %$gW$ODA}/df{'gdHCxD'Nj\OC7  @l+ Udr֭ӫB(F|ͷ1Ĩcsb )3}۠fXgd(j% D${[Mϸ[v])Y *F"J(6$!V߉nM&G.hpqσOa9g`0נ>qYݛ]:iId_W?`I'bї_aw3O? NGKHIB)!!qԓX"Ŀ(P̗ iQ qJ8\uv$:@X8q4̝1~ti_NŅ| ;Ыkn!ihE^|Tڊm$G-4F8l uuu|j6ݍFHcRxg\{a1[دfNglXH@OHH@RRҐٌ(uD:D'JjQUVQyUnoxG񯻮;ѽs;G/ɯؐ0Eĸ`'7Baި۲ *4V,^.K3U ʋ.6֥v% DFlHEA HݻwcYS:'4hi [rAg% ;Tq[#ȠNXa6F2+,V+6;\MNdAAAJڗ ???T#1DSbo V>&Fw썛r?~9{«8cI8S0tH?6sb%p5w0s Zk7cɇ>vrvЧףS/g!akukR8ᗄRBBupݣ @Z-Z?6۷mFNL:IN3P\nLddfpmbFj:\5EUu5AEe%nނ7ckv(N~52[nѽ;y~dIE*ijkV/qWw݁}U5(ݶVmƀ݆AᅁᮮOjjlhı'ko7t>[rR+g[k`ʕnO;LRj ٱHF{[Z_"c|Z K^Eb\§ ;Sǎ[&f{*(g#h8<"[ASx7A+|>uaW.la$cS]_|w} :bС5z<7=PB}QF 9n2Hi3ekÏ?#/;\{z YYrΙO> zu FzV=4|R̟?3Θa}&%[m]lԴ2% d"q$I![H9/^so=m_Ǣ{h׾S$"](:Q$Q QHO<jt &TM #鏓|bB>*Rm;ufzF67c[oaa81x`nd'Lq{4}C9rf6PeCjJ`@`w&cnӃX}1sV#F쏙01*EjjZcϷ*gdt%ᕋGFm(8 +Ic7 # ɣ1ϏOp"$%'aȈ+Q\T(.Z9R YF)a6&գ3i<|C,-b)0T]=d׋ډ-ز} Vwn46fdۧ`ۚu |5ۊ"L WEs۶m3-Y-l“7t qR0i`i84+ szOn3C챍5 9Ͷ#;I(SUU*t7ħ22/MDKFA$IxP/++ö۰pB|yh_о=2s3nMգPɇDn Rv7E#?Gt]jfm7+3m1x7y<*+i|h)~L8 FBv[SGj7G:ZPrP"z~ eu'[oR5Ge 'MR~_AAO=xo`YNmb3bkr |Jd֍cw,[69ټ;8 ,}.ӶqF,+,z1֬].=қҧ}8,$9Vjb!eiqtZ$S"DU=|@4Q u4#fmF +7_C^0fh > tR'B):?(pA-cl(ON'weʕG*$WU7ml57q͜n\G|N)w΁ұf]AlA_j22$-L m$M$i&賏a‰q?nAAfLc'a85Ĵ&Rm%:>E7fL"d36_$X7 F'`[+o#`бSG^Uظzm%F&Y+xJ:)2uEkCI2G#m)QE9i𙿝^3(:5>/w3"#Ru H-99;vsO=O^SL? ]~L AW٢QAhOx^s# s f"e-i .=Ϲwtm| ź x^SSjTVVM$y&HQMC0111mtkb#xS ʃr}5]wC'b)%9?&Kb_c~y P3jįr+1e_{|dE$&,Hɤ@C+V|[oe8i8{9(ܦB"]ܾ00 )5)pZ#Np!ɜ\OЯ)_x1R2ܰĢ!(~"D>֩mp*~GfF 7#X3&,YҬݚ;]!Ȟ%"Z&56!QTyY ^TvnK9ӏ>8v+61 ڴd&z6H3K.ʕc˖-Bmm-' Gmb"D&322xTÆ CΝ#ej sopmm R3`݇pG/ЙJhXοT60poI<֯\ڬfCmK!ahD^B<mPj(k*edHG) m_%d 8ވ`P>z=àGdDKJ7IëoM ߁>&Oh.Vtu>y|fU Ҋp3f?ς98L:yx0!$bǯʧQ.>#m&vZ-.Mr\Nq &{G3y(!X\J \3NbfxMG2=E mvL&\4XXQBR^24vOdam؁_?ll>465t;Ј$Xqk1cK.ԓOŜK/,~l-njZ۠w}=֬Y5fmd#;;tmPa{v?q7 .gTwޭ[7L8ӦM[4_g:Dc=Yl(,+RQs+^{ v솱cQBb f}820nl@LICn?S6B5Yع.VAtn60:dft3 9٨sU$g22Qc'We"}AXѱ-*?Y [r\{6c:;v3\^V&$2ha+R0ѥ[$U?Շ*gf1`D&6Ȃé;w mKacqůmCj'"/dˣk,\jǚk†R8 mrGݧj}ӌd,pb~dEca!x>Qu;M dRpI11[b%_ho<2aFYp{ u8 ܼp.V&?{VuhOKe{$g'@;leMe@ g;0Cvpd}HWeZZJ)uug0遆'-{кym%arn{>,p'(X!5bPM@.ӊ9Y08ᅧɸ;Q,܄ݚe]bՅ.ČRSS WND Eqwނ{fiǸO7.m.ze=&Aº@p{`9nCpEu6,Xy_t3*bt\RqP!Z@:I{<9sP]] SГG6Ea,;HQӍm=]$Є#L L Gfv=񢶶^ur-8yRPT\wa_i)zt[ yj@I}PSpPۄqg/c#,C{['zMۼ9387mˠ P(@֮CCC;=>'Y 96"Xpq#,Nb-FqrlslpG!mʿ>[YNiOu`{9@7l]`45\DOIPHl%!#{FlZXi0u\)wJ 07YYaT %l@mMQ:vDWq!>H1`(R }[AH::{9%KObK`%-xP* c4d"(ƅyś\È uH!㭱iO`.ggE6ᢇ fOƞYzoE x-ߠ];>q+,1`7C53kOkGxQ?GI2.^w?Z6N\Øa܄֭Ǯu=xk>“ΧQ9 I:|۸ +?}9l|,>]ig7Aq C:#i 05RMEѳ%xp^ӗ1E鸨 ;6hK{;)ShĴU. fc4M3頄``B&ttvqxH'0 b$)7mrJkٽnBŒ%Kb{[Vgy҂N )ɩ+:lhu h/9.hr3aHI>tD$zɼTcۀ iyjgAR Ř ̎ށndi(+ྮ~- Z"-݄ܬt(aaf1 9$j~zN=,A}[;׮I/8JhZ$䴆t2gfOy0ՠxHn7W8L+L$DyGKgAe4qߍ/aڿ8h+J__LQ̂{_v2pc ya8"k78.x-8:58GP]x↿`KoEsf`[twvuBMi̓>X%]3͒3b3#Ű3: XНw'NJ v8b,^Dp#+'(3)]PdH*BE48]nBf)FևMFkaO} F}3H#3'Eʘ&~&@Ӡ1 e 3 Iq R}p?iQ{GӪB5#/}qv0,3zMp j3d8ΉL#1G_>Ҩi\*EPo(_}L2&ָ7ނ=epI0if Q-)%٨%t2qkZBN~Ȓq7aAAJlܴk>| .S5.y)*r/<[ ㌳yP]2]l\=.JuQm= ܦfVϛU h_A+g%hمnXP1@bQ M^9:p542ÀOԌOŘ2(z|֙㽗Ps=xcKJdebԻ/3QRU_.$|! rٱo>,[Hvi|\Y>&l|J^j TH/ uȏ~tvuvv0e?G {if(XX(ޞ.$aF՛gv*b2-޽O=89VO/ z јddd 9 Wp`/xpzϔd4v@PW֌h}o PɎ ', ttDm]=%#-›P\#X~Gk;{@kPR^24OT43!2xLi~ع> ZgPƫԄ#SG8(ur(u4HVBG ,P*$&y iZ:>#%FYsF1ipT/5p#P!ixkĥ"hƒ@YdN"|$<~E$&oVoĻ?S|X}ؑ ze[_8D#FòO nD[ h > YIߺ`gTR 4J4ɢ6I (sj4RqKXP#6v=\~$~8 ٶZ^\aD:pw ]&^"GZ 6_~Wt6o5Et/74jv>;<}*9>ƓBZi279]>\UB<@)+?+׊Ҳ <ыXR Q3v H^i޴,h&(ʔh黄c_S;J*FbҢn6oE}G͙ ε[ ڬ4=:ڻ 4TvdGǒ""Ĝk|$[Ld;;M })T<}*% l>o.o2:j+ݜ|L1H=ټ0(Dd&fk}Nnl ql!5G#z.NM'ct3_o ?" SB\CpI `0 dHRF374sޏoǢEcP uWcT _;H8PeZǐBJ!H@р+Й> v;w4~?o"ԅ%vʵ77pӥal]!ޛ1i&ּDX)A %KTTY.yK sPW*xK0p,~+},rR>XA dymCL:.p1(ܰڽmƒ>kN_CCOXOm<`1ȏ?<] p52_I!$Ă,l&菀M-AÎƆz2A؏p=!&{7sFLk֬Qc;oՍqAHnFh$wÐ ˃]}P !@7s\XرS4`B텟Ɣěo.Z)@YQV1R 9)[{Bi Cc´C"|jW#բ}ZHzѱw*@m~( zHNW_ǝ߬63Yz }민DtZY%Eho!g/ϋam,dKWBFɻ6`]畠hT^mAOH 0k]d0L0OۊN N̚'C'x1~y 8^!Q)8< He3$Mëj@:x?h8Ҏ_9qlHb+<+!ͤȠ+?x9&}푼^AepbpO"¥H<$z x Hዤq%-% ,݈l\Cܹt16,@n??$kr{!cP)S0wvZQQ(qSg”Vk.Nz fMr\pԬ<|=w^z&Ӹ k]GLߍ?yۃiNWۊŗফA-C w+O@9ig80t\Q iC٨1OĽ !]⁑6%(ߵkϻʂp*jT(/}hjh GrTZ Q8)&4j5Z۠~Wq4vhz*ö=?e*HNYֈ=[P+PR5O2,&3©Wl!ZGkK4^)rs0y^{?+$>%h۳(:r2LZ|q2%zz;ЗfeaH5zL:l:Z ӦÔdBч\䔙w|L }p;<i,Y 5s 7 lApΟl 6a@Ut"#%}B\LPuvX[%MVW{hdR50 (Xe0&k OR!#%#㴎 `ۑ4_9hO=b9pGa(v4 `GJ \Ty<IhT1gl |#zGIq9}-17x!$ʍ‘v\}A>˓;|BX`'Io>9 v_/kCـVc1$ ߗAaGƂ4XQF8gTw sySl@@Tܚ#Ÿko'n-h@2uʽwdqch@q1ΞOz1z,e,)U\)j l:vCxQFjf;Oo@EVTByA__>1`)Eg~%KlXJ&EZKUbְȫ qQ]=/#4gOBUJ``ދʁɓ&C5جC:TY`_#TJ;~ӋdgǑG 3KkQ1_]^Ltu>c6 ?p>le{rTe>Y\P)ǘ*+`6%Cf1oʪ1|YZ(vt w8GSRMsจa^HA+kAf?Pl$R(PƦP-ǾQa|97#U|v>֎2 ӏ,csOjK#G^I&. &Bi09)8#' O1>6LLT\TG牕qFN#5Ќ$rxMN`o_#}?>9BO^ c. <c$n O>"CۏUr\r6402Q; `˦xgq_.CQi9,5D(pEga,be|;*<֋Yj*2=p(}YQ^`LLdK ! S}$`:N3|,fW<]~o%ɋzs8XP9c<9c=Uф :|A~jXʃ-ؠ );^0}yg~;F>saa30v8>`Qo1ЖyX&@Q{!AEM[Ĺ` i/pHg"dCKjh"Q zP%}$3Aq;ލ*:tUCN==)%ؾ9yI'0)Ƈt%=LS^ݻ}QEWC@Ə>ز%Hy FH0 kJXގ峜8mc N;it}jOv=k: ";26ꯋy_ 2r V"a >YS,pbTR3c cN 'VՃoBUS`_ׅk:PyUI3}3}܊r酙4&}xORK"`LL6$A9VLױ\CyV :Δ&HFtB#3{_D @B]ksLBL\AHDKW{DoGs$.Qx @ňL ~3kDBfeX>(E66BP {Zށ6;2ʍ?I*IS.AGڹ @+Rш:62|^ZRNW3g !Jd|N=ʏƔg T+5S s12Y,{.#^G5%9{\A@yBp"@!_\a>|b ƒiؚXFfPK7xɷȵ>^7|Q-&}O눶+D@犦Kq&rAD)E\8~o3ـ?~^zm9}0338Yx6R?GDhfJSdvRp`PW Tp%*i:ܱw<;8":cG=, t˯4`fd4@yݗ[! Ua-Z ̔M{uX6}䖕ÜjFkS;\[gs!b,DdHOա v>G͛k7|]^'Ք Yw}85b0gi®m}]Ȯ%省}];WTnߎ0p  k %O,Q|>s%Iws tм7Mz?kFLTWg@ԇ6t*L4Em`,ݐʄGR!D_h3>;CTiKD`#DF*Ԣ*۸v | 熴cW*(b]4kTAj_x,$y`f%C[‰O !*=0.dxXZv;Q؍ 8sqשãѓg"8QV)Z{x:|ZV;zHVAC !Pc4??߸o?Q:z?#iN8nh1mPԟCGlLaDq|/GȠSAcq ,_)ˋ%pJ!Ib\st.i_ێ0q2lVbZhʝX1>&ڠȇ q<_PN]=K1h }HœaT;3% bݴޔ<\w~ (-3 %nj xԵO]^uUb{߇<=&T_znNPfy{n:f>z6IKGYt̫Rn/˧ͬKh,RUr?1etC?nTo, j \}x"ATa'@ /DoNauFO].HYz J4Zi (ډi]||4a2#fDG\9*>Q+`Eɿ?IbTO83ơLŴIRs ov+.},Cq嫱pm"A"pcN<<ٌmఫNC$w@>zLϸbjcŭb =(̝55^Eŋ˱?/ ZTŇ%ur+I.X/wE@Z?y[txgPƈnVO`k"ʤlC8  cI%<8+R0A oCr](r4/Z?4n{ 5qphԝO?0JB@`izȲ 0Norp3c==7=PQUzܸ6WIJd0[PT< J)Ww@?rs2{fd_gI@HD~^Ca!*pHa 7;}؍FS$8=x̡IKFW+9P?Ea0/6e,;."q_1?]]9m,[6!>&'ǿa(Q D$AAdCÂ;y.HF@e{K_WL1tY1D~~ ImDm:`dnV;aQ#ZA+p:mtU-<)LR| \v` e&KfJCEQ:롇 wwaC$_Zuv]ÊuTh~%o\=v͕ 0R)C ZZG#y5$퇔Jhөsdjeqoo$9 R YqO$';=3pRQtz`P$B3.8hZ)D\B;^%.L߯CwJ_xvnOA{^1l'Ecbūu0Κsn9&~^}[h'e>N|.,/iI, ys|#h;Dw#ݘyp̾㐑Ӣ@6wv= G4I |q E_^V1Cy@׃6z5˂l &ЧFG|ݔdy˝p9]SVa n8cwއo3V#(&oÆWwt8\V4<fUlB1UB *3a}9Yv`M0Xs9~caI:`@a1I7T%'@ho#-"eZ~TԳ򍦔T N:;:4i~:ZP'|vC6 =UOhZ,8eq$ԪoÖס6rOG?ob0y# & :<C#hP 3%bޢ@5!V1d}k5^]C. s`4bHp䉕hEd(#dj\KTɣr.UvٰiB JYu|nvlm`@eE 4Gdv?޸=+L@ ɸCn_`i4&çYxÑZLuHk028W +NvƅgEE8ʳ10 ;Vpa<2>b-ZAlM=3گ/╯y݇aΒs0}|,Y8k6'3.-4c~kx[ǡ ¢ڝx1D1buGv8.+5|ǭְd]L G<~W@$Es?ߌlQ6iv=jXʑZ<}]Vq(o~+4އ3qؙ[c#n~1=V7bJ=8.ͯLg_51i螿ue8!&<,8( ÷w8'քvl~чi w~se̖1]v+xDH2 DHnM,i}zyY@,C@1(!8IDkkwC R8|ℎ ڶ8x4^=uMMI"tCA~AFٶt;R@jJ&V}0pt{lܸ loTpC/ˑa&v^|3 6fB]c'6}PU4 hwm5..,+CGN +9HPioTgƙgU͛w9*hgXMp6_z8}RL|POKjm&2u<|>>j-Z%? Lc_(mPDOP`g&~GEPH$uF#è! EB0A6Ijh5~ty3u"ko;I Fn臶S3YRRX |7nfZC"!E=Tko'I>Fi (u#zafezeCT|^׆)C~XAeL-(D 1Ф? ି< dðq9jp9cs1@_G4(/k3.o"AQ.)Eq-&mw@MLdPIp>4SbXt!3&g% ]sn`.Ā.[{!e$٥Cr XP~N`i4FĀ_+j%` Js`b쌹ȭEk,_I6~Fa+p2"BJڐ U OC&\rOC@3'Ҝ$YH:@V=xh1UV} 13 x6%:كE$ab. 0j~%?=O>!!3Ƃ/Ez36 qK1-Hk`-ɧMA{i5 _ [3?Ec|n[fAhZf{(hEזS{1-`D?L1v&I8>]< '1b~4m!&RU@RFC@w$M=+, ~;`^jcc5otBNC5jâ?d0A)+ m . EA&"BZRIDQRd#m\J2 YgE};4Z&X;۰wo'ddYG %c7wOC2;7zTV'w^o9̈́Nkw5 x%8L$\'>{Z>V.T5R-qlYk{d JgI;6DBn *=|NY-?y4M_͉ 8YTnI,HRPsx?T/anT9*3Sp^\y8B /^߉z.}ȞUS`Gr49)k܍_9N1!);g-Az3mɒ6 $8C5TLS3do44~Ht!ɠ;Hw ~t(0ѻ1^l}xװ4h F~$LcQ/I#02) ([ʑ?:BdAkvzw-A#*9+Ndai !۬_S} CJϷ|e9NS4ӂ8lz|M$p]E5*$@3cl,~4*84;8#P+>x}+V`^@<aHί0}Gֹo'\é r>|, /*\wy!}dM(-aZ_+?53PTV HI`ѐ$=F]6̜?$P@vt"#;fȕY &hQvcF~$%W2L)~ 6 PH! bV6_RD i3UHi #1`yo+M"4{ɇY6M9к%(1ڿI:R0Fg439 :@ jVSIE8놉8"Kf+"; &zTiy l$e@~ -$HmX5L$$%H ҙP}T2~ڤ.X" %rɢp$ <j?XG.rTTT`Gyƀq%`ԨQغu+&"0[t)cގ;ec1s{ţ>.mL{碦$LJ}ΟzꩼJ,I7v?Fd-ZiӦ~{hhhsƗaΝl:(ގix_z۶mR~7͟k{X%iM:?'?I&񾳃 {~v cǎmk 3-#;`ee%?ƅ+(("g} g.--E1PjUt 㓑':&Y' G3}v -dh=$̺g?mW淾ƣ =X' /ŻW߇J/ -ج^O\w9T\%ӕxv  .aJD ցX!} 7'$H(7>KM]hkV@,Zui04p0Z lEwW;]2 XPL_PvB MQa 6_OV#> Ӭ M)PP{) ^] ^{"ԔbڬFH! ~ ٝ#}ƵP݊*̙3.|>skhjlR”L wuҺRf4o߉ƺ}hiđ9Y'R$ iogeNNt/`4fZi;;7ߟav|] iF_-w2; 7.=ft?nyt3<a3f3q V[vŠ76=,1h>*K8I^ o<Dӈ%sԨ]WlIػǍ wýNH>L/i6/ DrAu!Bi!e(N$WIFEFn7$'P$ Et-8롽Ul%$Ȼb} )8XqhoG@>|t^Ew0œp¼p>>}=xzؑ8 >H{ IB~Ly,(Diǁdj+msm`AtDXк?ZDXKA*DX"hxaxK "_FV@9ل_~= Xs"͒ &hX]Z>;qGL?[֬[|{r>SFJ 1Ix> oގXuS  pb'bc]Zڠ_x'EGKL9i kZ45FM/;[נZ7&_xy*:8 vV>dju.<cƔ`Ӧ zjdxVOhjAzВCZ(5 K/:Ɇ'3¿])W cBA4 ,H/}d̝3 % ~,;$Hż#25yzhi5-71qDCA~?1V5Xx Tb(Xn@+vxיX(vUq5<]i-wYNCS_o{x?k;|FrU&h& +Al1DfA Ϗ ܮ$L*JVヂ!c+%&"99 J@uubBmu8N,@c ;v!';m*%G^s0R0?L=Us`I DRDʲe^o}ollْl+K%QH  r"1fɩ'uU[U=Ճ 7}t׭[sD 07BcC4fS9юlH=a<~6wσދ=tB`6ml0uҜ'>0<6H k<@Fjyb'ܱ 5-ZT܊jF g2*kP[Y٪J.9\I뿕܆UCjj AyiKQ2cdjSڵy0LDf#}]FdI<% *P`B]k+;7TE)*+!6תd K@@k ~gC'fbu-3fFt,+I4Y+]W11+/Cx3Q72XP=o5i|wn¾|& b7>j~[xv@B I]2Ŝ*H*YɢB>_h?G(B6c[Q,09gzHP?`;I3DGgE`4K!22VD{)4tP 5:XX<(48,,B岫y:Y \4gMMqJ ym3+Eqg(<:9r0 !ψ ^`t;~FNێ]ʚdҲ)>ikF~  MX^"/eJ2e,B%$u ϤtgV&UBt$4d@0BK"Z8b&"i}` ;b:.@"Tu O5x(vSEb]pkWG~Zv &n^4J~]7ٵ_cJx|o1W|-l1ɰgޜ/$,Gb{ʛy+Y^&KPBf>2 ,N=|dUCҲ1E=o&J~vb($ q-/Z>8\^g 6|>7KhA B@Le?vk]WCZB&k";fTd׷2Aq[|8iTT+UE2`Ko4Ii"XZ6%5/q=GLʑu:Sر;ಋ h)H(Rڔ'3? c:DSSCC<'\si\/XҀGuX+БCV4.(RX,j􈞅(6"@j?sOad<۶fpwQ]S<$\2;5s8jkczoNd_݋r,iH#㭷cnT~E!{TPy(eaC&&1%8qqyY "O8bŊ9H<t_ n$hT`ݪN?0LRxbsȀ 8 IL `fb%ly38YMGTI\8 c]OH؂h/:Njbuh0:058ףGNGhcw4l %edRx(u*ЇahP:%N#h56\:;P\:X(PцmܘIBR7px<`kQ.diK1Ӊ$t~\ a6p΄l85-h,34 )h,t&<3X@%‰3ptvb]f _# Z07.~)5EܢU"yƂ$@b9Ty%EZnTh4EӴwwO!<: _EJ0/A*r:tJ7:cQ K4h;]{ 調dUGavrHyN|_خCv," H{p۪.8d\6Qu gj)BfLo6"s!B,8u9m. d-mxn6[L(-Ѿ8UEUɨ 26l4h/d~^8X/1rLVx=^~EDR9(B:ST;8x BH`d| N^P5abt\AF ?fGuM% D657 53P^Dh%CG@f*+" T7cq1\>$gڰ %^\Kc YR/˺`[@omwN_J Ocx Mq/|O?Z@)ȼ&3pڠŲ:I}GZqlÓ;xwq0fFU$j؆G_b.TT DO/kWž7/ryωƮ&Tȅ'azd4vr.ŏ~95>d܋|O6o<kC=|غڍ㯟ώFVwj>xznwN)s l*^81tT4 v^do+[3/`wݻ2PQ@(ˉZ(Z ެV_4M3YF'rJ9sYTDXwAD00} bHbs Xx\TYdU&uOIoBY,n$+KQ=k`J0=DyI>YU OS[,(V 4>XNďIljlc Fff;Q^Yrz;Ln?jD<ƚ*~~\`9𕌳a=m}Z:pUGT%Iy%yM=;PlS^+' Xs*heO_ vrOX-:!fJ#.wΌ~1l J߷#QR}E>R#J48?o~lB0?鈌J'*Q2es\p  fQ3RR 10KzKì:I"bQYF^ RyZ^mUu|./.CV~3XHrĢ0J <0JEӟVi'^W;}[J.~,nxk'&jRvҫAM.cWV75d0֊4@y+{٥]3L9GTV-! 4X0[\a% < Iܷ9C9(yw!v}/|OIR/5KVu.KQQ4eSj<[vvpET(S\$ď:o߬J~xm- j?O642-]w/*{kmI1t WyI2r-"IInMtPƍY#x ;C4<<тSpۄ7eds|~<~tpԩu4^{ *x3BۀYd-NTJG0=44=x !Xq;aUaת*yQ]N$:6AF$6cMd& 6ܽOq;%IHe^K!T`{-tOjk$LXnlx{w',`&$yZޔwe ޙmyVy4{/?Dޭ@xIV\Y+ !J@\D,s0uZjn'/Uolq1_q;|/hgvX9]ky>kV5 whՊ1z&o&^YI2ќ/)KFgI,mPٲHFq1:-g"Σ!&F9`21̪ZƎ-*ϓ\>&UY%N}/ }*hol",*ŏ9J3fy/0f&yݟt6Ҡ"Ȥ}h@*p;(iDUXTK<8u(p,fhoUMw7,9C\\¥Ql4Valtf9ܨf)("bye4$^Ac*T{J(-AbG[Zܿ?|9l޸k\@(o~swKz0>ҋ`f.O+Ū8Mbw?D>{nȍ'h<ulX%WIU4`6eq] ĕpyI&K UIhp#(Ïm:8gT[]\H40ɸNdu"Y;w܅"'a6[ %ې2 }Y&v;= S*qCh'ϓF6h!ɠ> {ɽJEv p:k{i(\|vw3ឃgpGm()-)(Ji򣚧V,u̓ 4gZs"iLfWf0#`N< zLicgppԼje;-4[ 3mon0ͳ0*sO Ş2H<}DPC\qIz+UբQjӼ6!!:;q6Dhvٝąå fj0es`nEIs0QQWW)Ƒo#bllE.-=fg ]&S [F:e,lc`2&K-z>x 1m"F@}s7MhAux\s}bn?Q Md4Ru=``=JUbA#l.K?ܢmyӇ5@y(/ɓx//~G*zբpV@,pU*yL|b6 ɦS*Z̜= 24op2`ⵑrLv#/nf"fjn'ePU2cl7+R?cȊg@""pC)Ο:VٹFOʼn7zN[xmذō`s'4Bch23-0|ذhGJyr9@[LJXhp:\ԷzxGj^*UdpiTZJq;9M.޷ƞ 72ҥ(>DPp J9NLlCǜ?잳V6,h/* _Yi3\2'fǓ\%xė "WahdW Ir4~4_ "2wz܋끇бr5ΜESkz2MX#N4?ua+)lN,' Px2w l&(0nJߓS3لҵaxn3t ۋ`Y w=&f9[l ,|^E1I܏Waf| o[y'D__LdtHӼ>7L{=OG<' P,e]7CPdmPH8w$mj|rAq"/:PUB>'ފL9*G-C,V MڵneJy%[Q }r¥FC*G@ } ' \u XPsG%8ua];]RCUںP:ƾFAwPe/ǼKIs%Ga2;v܉o};x;/b>ىقԟ6 z=FiodiGi2UsMbhh zIL3W 1w_B-^'L|ek3<0F\$ bF\mc9""}C񙃯~/R2?lrW,l ?>?5a-Tⴈ{*惄\.MjX/h^Ċ,\z]xfAk{s.3N&o b\WIDLF^~'$QS]6'P^^u'g#p8( pWTV9{{nWZ R+7|/}]p߽1I-a9\DA'9FJkw!S9X}:%N9Suv@ܻ4FV2S!+5M׺Mُ|3_ G`!Ԭ@1494W#54C\x.j.ُڵH'Py4N~} F ᱿ؽރx4I(ʹ=c訵Zz'oHʅU织03H s ;kɳi~#cZ9}1 Zk֡.Ѓ_v`Hgh&<)dUߤ$s/wb_ :#43*ڷkEt> 46~x̆hhB2M}K\WcURJy x}?8pYܱ>{-:~+ZZ+SqܸF"dO=p۬M #{&2}/tRo0jYy ybL^`P\w\/h,gް(6㖚w@uky5j WZ_?7p}PiJ0 ?ɤ4y M>'wtxpcJBBw۰w5b#{78u=eh %EQw߇ ÿId)ZDںɗcH?X5Ȟ;PDoO"|-y*ai,!Ksˁjـ~u%&yW }ͼ(*,<26&H# 51qA<<ܽK0 מ~\Opdyn9g<.sF+G5v}aVd7b ?OM%GI%nuÿ%{-y2$b}ˌ׷zHZ9z$%QYq(I?Ȕ IyeE1>J8o *#klĨxy(,2V0;Hڀ3I^Pg A+:̓,Y ldpǣLsUKv &<ê۰kDg7ڋ#8~b)lٹ!)`0N;4>BƱ&+Niv$G ' `2@یgr>X2LHk~W;4J ,v>+˰amxeGA}k ٳG&Na819݅o+sa #C(q[iv>pH|<*͕(`DX dl~Aa9'@6 CNVx#$5-R|&뾓XR_ABU`ۂ^S[0?+:]ޖw<,7HC3L9"C4~OstllhHGSy8GlO% <8Y}xmDJ֢`Gi9./}Q?މ`? 4E;QlIpI8xSY/Js6rN`zO`>4o){0A;{ 9% ~~nGIIo\H7᭰œ#a5rOX-A2ĐYAbMN¿^T`F zhϣi:LG đ dZ̰tܴf9;/)5Ď; r/>X`}X_}K?kW2A,UWe$d圉aB;ea>$biBJ03<;I?i0<F Q2Ft5;iJ3~ 2LHU?kX$;@˅T$k%4WVds.VrTP걠k}7[[1@0`ND9]P_( ) j*Kϑ`F qYX4o\\:~~ӌ^~mk6mƊv 2\.JTUcvvfW#_M0Z?|*˽Wйv3=7J=9\xykXݍuzbbgܯC{B\&/RaK*J~w1wy1>.SVvLq4*5O9#>r^>Pϥd-*䣈|-?{ѼXr> ϣ\Xj]/!ԭ߆ "^dYL_ś N|vOq9e SVD_qEgĹQJ, UlEρ2K! %w_fE& ѢC )_kɹZ 'BJnC܏*[åx˵8i]wf!{XE]/Ltn'.b:Xss %N+.Gb:HSϳ'ꋣe=ز5D4S8O1_Ds{?v?.Z|Nj`r) tI6T\OD^c )#9Gd@Y@@S>$YpOz$y79gV{J:߂\ċw}:} +3`}Êoǯ`S{qc{`[QO\l!<ͣXC.C"# Hyr8&(PMk=[n6(ټvKӨj(hpgY 1LҨEϩx-p% LML"'`s`|u]wϑUģc8eqpX196OL0=M{^vv…a1[x(Gqj Zv i j"hL@!?D4daYzDQbHmuS(\u W_vA8Ry:ۇ( XD4$Ӫ2/Hϕsg<,[Q^p>ʹ(p|~7sE'l:Ϥ;ϝ\ 8V bT2(TܔYH5"P%j tM&$ Y湓rր|O{` HHBBX!$pOlj@)S+V$1!0ʥ\0E;AhΑDVGffb8w(.l!ޞAQIo~̛hnCcfSd% &zP\5EsϞx0:1rJN9ƺՕH+`h8*]k:16bd@ftV2n OJ18xU8sd?^z j[VгtwwIUYMh``68]/g͝i ;q9lXe ˟?#P :I0^uͬulžE<|_t.69Ӹ:W_)s!vvٵݲsidJKi`RU+Q^^Gؾ8x&iq]^<[6,djCB^@,kS7g;I%yT:g mpnIc k=!)" \F'|IJ8pd ?J:Rw{WnB=uV4p3 I ^h^\! =7`ѾjcC1ag `4_Y WF2HcJB{fSiOZ|ĸjKp6/D\i7IL:t;a3ZQs#+WPU߆'*S,",PVBs8\y_Do6tG 8s@fUU01:#ӡK+# H7@ ty9 ?͉l_+7Ž{$0e85 'Pr3l./F9p>docp]!o-)-n5 dp-yM=z{eק+2,my/*y^;|x__m@"ʪJQ)uvՄ/E>̢v^]Nxv*F\SnWl/="Z;g±7ǜhشe3<2O@J}1\J8~S|0W 4T!ѿ5ARY}Y)ᆑ̍Q b`5ÜIÐy8 J)VWWR*H"*-ya)R{dr`X}M+w-WafUTo'lYm}W._!f*)ȊVs*\37xǼ^T W d\ FԼ =SxDQ{Mx_?ÖgEMS-ffyAF.,Jx1f95Rijj×%z򞖷 Qco|O̡X}#|Uan&/JK8B[Ei]xy]ko7>#\v( q1v3!|Ap;aS7Lj>@L&5t)neHK<'V^B&"R" &̹N>gToX m i71:/&(\XyW!+FJ&;L&y%yIOB0KYL_:wΜq&Emu*xP&^Á2$pZǤ|Pqel#߉=8rn /*F`Yp=coj΀ ,+qيz.S뽈5mx, al6?:(GQRV'IxY1lqLwcS 'C$c@8_şqю AL_x -8s>u=^nϷ.z;C@CUtϐ@XR4 ֣ΜÉ}G+o{&<+|Vd¨%IP9mBNwQ4Ev+6 pv|v[4_4w|k+09,h'cUE߳׾#E[} ֮_@X*&jn&5RZ5`ډ[礸\L])ϻ[UgZL[P6~Pr*@ (f;'7 $E-*jFaDAL"Yu󱣐A@ZsDSK16 YtjA"Ʃ'a!p&7x)z(kź5+P_65CX4XJ=Y:2sSffcM1Ci4ΆvEN'pKCo(6 oGQռQvZ):wK ]A(lƝ׼57_0 _jآ$$o,T󗷛 ҇}g>LLT.{(Tj{UP14ΌPߖm[yre?|at[;߅Zl0Y-*e/Z,S_4õn;o.Nk,N>=wΉsp؜XeA$Zp: P]+p4iť䷍!֮ToFd/JZJ3QMd<,", I[NB (7"/lPoI> kyRΒrh߸ Lt2A=xXyX~#fco8}D}~Kcto뚐IzQNn% Ť]& j*1[]ZFdn1zRND !4['7[YO Hc׊xx&~Kl~9d"#xv 2<뿉i&~? {)F!0+Lrayeٹںk˜B1o`VMWA#8x(|4MKY_yjZ P{F5@=RSaap<3ASsFFF?pG 2lvteө W`==*]!T:Bu+x(ߧBoR;%.(6S#saLϠy>F'8֍[y-GjQlI=qR͙\t3J ŖɜD@ndhB KˡddRJ`RriE=&?G<|@?r (\1Co2(Q ˂z\LA4q*0/4-M7lJ,EiUX%.K۪Jgx9 B~^m'!.³{-ܪj9w;4n&~dsl;dU5Kslb[۔U5uYTh~AܽCEQ0BP= Hj2lJ--A%҈%iz?2\ޮTs)J8r+ż;EvW\s~`e*tYzT֠<KIsmp]4"Ek 4e]W;] PQ;f-D#8<qy=ʮ.ܱe;av/5mu P}z%|Z2Y J̹*''f0ldyNcNg&,O%&ȯ) :DgyQ6g (y-WS6*yS!ϹTN'^A4~ MaӦ̽HqeCeU9LFCCy|% Mj2 nW`46qAHSxW120My%~Zh̅S#M"l"J$"jN,֑l`:,cnvόNL<#q[ k\$ ?@a7mMM( Dis)| 54 PECCj@ZDa00xEE7S_<97w@jVh-Ľ*˕{J}>Xj S@yzj W@CKQ[_K@etfrXZ^nXRr$YR5']$7`T_*dEvzro~ ]DFZ ڱR$h,5rYyűj?wt-[6H&Pe2Q0&f$b8\CX``9 b7N2>K{=< $7?+!gPTbn /׹x{fF<(&fPײwn[g}v4ŋ/"K捉L8uD3ڸ m5e׾ wy=,r\Z ^׾-tBKo8FMh@y=x{`ƍNȘXN&B(1xN"ėEKNn38Z_K^o< x8|$v?YLۏo1v.;՝dQױ 3x{ç>I6|u󨃌r/Z1_|/p> D(:NAde&pe?/A +e̜X(ƪbCcjS4᰺hkk~Ob|.ŕ**ػ8k޻dɒ,ލ ŦWSBH#!$/BKRIHH!B 6w[V]2;;;Z2XמoW;νGL*ƢedIa1b Hc9yR>v2&X@m%) Mq#@UrZ(lI_>u\Ȱ#p*ďYX;W-T{Ă:%`bs6o뮽(uQNq"vJ&C ܴj@Iqzl#pIqe;ՍV2M6='1sߓ2239pI|"K"D!;R4 Q&J)JM%+*H%kSIF{Q?fNow# t{ "%9ٹ 1Y$0x7[t3&G"7]_w' s V4{S = ؼ!4Ə0O|_CjKgie2ɤsf" žO}3h?kQ\T]&vӧkٵRE117ɬ ƍށkoe)N h 63 hy$}ዱX=dKBn >֞^,]k_+:hcU+V>A#U"VD|٧Ӧѝ;~'μz8 ?' xn7#jUn<:yz盧tXa}up)luwqÅ-0Pxx;ke<$DN hTIX*RMDzYQ2$FA>/>Cvwrk!-R g‥ IХvod3`X9-$ <*1jD)RvoR1w\O!uT!'UH`/ : NRN =+6Z#b`0,CdydO sd yVGZJH4| p& )',lA vl݊ƶ.$1f{.J'U!X|"0 Аp3adf9Yرs&M`ՂfaJ 'z{:V]0 8XW;SF*i:{,p5* ) K1z/:&Ϝ Aj6 9ЋL6& SD(YF +,~j"oG](LE<1!F !G 8gXQbuslS`)m5! p\e)@ W"K0*2 T*u) J"5PU5n8PI^mҳ0k@=d6xQ5SNeǔ*@2>F)l' n1DDҘ%rr0<nvA:e1Į307TF$d] x_-K'2`HA#De#daQ$5T 0,`]Q{aO>vDÏ)An49G{rxhmmA]hlcܹ8翞z3gM=1nmhi.Kr_ɇ.¢ GL@$ ֏Ă;w Y^dpȠ/{7QV^ɞ}5&%#7يW_zzQ\e=woüݎmek0yR;_Ӂ2&wDlyk#J*SXG߀ə `73'K-P=E61,~wG͐B:,\lX_*A+ %xHno2dҨp+R9h'ux Lp2 njNmA3QSV78=f1@Cg!U}+ f.,~YTbS6S+P j4S3Q( SQ*$^AgzZ}ZiD7fKM..oܫ?S[+ռjwLՖRVh q42f !EjHЅdA2IF"#HBa#AD~d!ʬ ܸ)V0]azDT0TZ&ÉRcOœ0%`yDDCrZ:&wS =ÎʀW.f@Ӈz{0e%0Gl +/\ 5'f+ע{x Lj41Fe*`JARzOK2iQP^Iy8u=9.AɬXssȴpz'* 9l2,f+&b|TW6+ f-Idd&݊>qa&bkP\<5qʕHLJEjZҰ'LUVvW q<9;lYьxYXDd]ل$b;v b KzÜHVmb撡?4TUb@"4ul{:z89`W{% vv~4D2GJ*e53a`@\B{jq]d=o >{+g=o.P2صh^􅐘$]M585c޴4x^~=i:MLp Q`\LLev7w`w$ؘ03m6l;6s{" AG͉F>#cݠM~&PRSL=^ ȱ1'i3t `A[]]=zLdvO &afg8`}iE1.شՋH1 [řdf k^pAx;KRf4`Iʌ2N5xTN5h[jz|Sd]^T+ aQ@R>5ԕjdOaZP|gp&1B$C)DdH{Zg '89aLՒGF+E >$>>H0A0Ya'򲤜0Crsd@ !eVH3y=+=l6˦ P{v|P+*/XxC=h򓋑7'Y#!> (_)/c&bn)$c4NU9i ) CD%{dMwxas&O:d\ ?Z;pe;=_þj pA \-uB,[؄eڊn/~/1*͍zZmІ[М*;މ%l܂)X1]kFٕi0myvif4mxi`Ⴛ,Wa <=R?mmFV7jA{^n-:G иkTeh %cQxZQ4q*K$nFcX1brx0AzETJ_(룺$l< bR&4䴣O5 C(~D^GOQ{4>V:) Ṛ@ww ::`@ѱNX"A&R Ckpek. He "Zkdb`jc€GZc/;ґ:8Y8܏iho{Ѓ$a7$["! }FD$i?}@Vq9 {n=a8gr4ڱV[2Բ0ᑖnD̩Й 9a` `O?ra՚.vw| HF® ݷI) ]dÔIEص#z:[gnb'eHu)f8)3gaƛ XqYx=n%4{A"TULiW:=jW'n@#f3ɅT3iX,>/" iXf2.i&<m=0*mBT@׌3sq5aOoŁLe mTMҠ[6ض!tE:ލKp9{=C &`^^dK=^{j].`3监P8CS痰m YSp7 (gaO/*ZPG4 U`BL=Zt7yb\&4lQL/~} D4`+*ǃp~s 2@܏:BFZׇ>Pwosu&c娬VgП 0 EDI!SDg@bB TEԚ&E N`bpX`PIS+ Ta1fй1#*hײF[ {b~]jpNQ Q֦JxYD@ow'zBpKV}Ө}m}u6Za5M1sDr)VЁ}If(-G2/]-lA+&ɅzW!?3wʶnTέěaL2Dz W]-J4F/J(.eR{$ػˇ3ob㿫_Bg[چ@1>iA ^`G7`L}ppK7fhJ( 6z0I˔ixF6 k=>;lL3ƴY$ LXSg(?ڲ[jW㉧;1c| 0|-K p$gcҥ s=}ks3bAR3 pyGbZmI/=<:|=yRd+FP Mo-?. JQe|_K0}DFc.]Vl`RwؽuFPdіP9AKM=֔Lqu-DN^NxC(XaŗP΀%@tF&'7^)#-<% dPQ5Fl%5 d@^z F= $8C{'Md],$³ss}qa>lffԡ$ b4dC&kk4#3ʈneV/RLY0XU5_^Ʈ1a*-??C#3;Wu׬mʔi p3 (cBXh{-[Dx TRo;FXUs`kúx,Ldڔ /s+[  XBl,m Cغ{u+zu+K{ʞf|g=}a1阼x>f.*Ѝ4[[9LD蓅"/1IIqS EvT>gaOvމtb:HlynP=B6 jХa ux6 aMX  `Ai^<#L'̬ـmY^AMSPYY4x{w:$v !wa&V |%u8`@6\yRxɧpH-J/OUWƲex [bb"ÁoۜdO^g }i5&,ĄnlCo@]*Er_e*(pԩ6(AH-u̇ ECեkx?9XR׆ 3䚣~_HQJ*"e43rNN}Qlܸ֭QQQ>)0I$ yAc.ŰA.!VEi)\Y0V^@;{XXd V|w×PYݏ H.)v4AuU%2{:#{@߆9%e [7@cB71 *r3fBGMp WjxB1 1G1^k,ԾƢKbvikU2bk$-ըira7`Þ6TLEiu=a̙e(ˁ͠EX1˰4k͏/';Ʈe]T+t URKu;HAC%׵¬g덋Cx٬u69qt>&En$&O$z6<qd=Ӯ*hI& ugArȜ/Fq>$}&Bt]L/q'4f!44!/DBB"#:LBSa^i+2ثyddfTscƬl$rK'gf&Mmu=Xn;f_x^BX'F;VU"72j ݏJ G+k^QlÆUGd\ot:cqfΜn2)E^l&M mĠ-nvo߿sge{v/_o|e ,±Xzٯpcn !؅?د_7} #=?؂fXh??}E-|ϟ {ZM֟vgd#/rB"v~&@06%Co0e$lnڅ?<"sţA+Z,jXp [":'3z>X&}y uع :ӎ|87gסiX}e7=U}qXIvÎ+19Rzxf.`3vB(k1_(v6u"%>^ srD"ףVcd\lM԰u!)Bi>?"FT4E|zDϓ)L:ֵ'?{ {Z]~N&mp]אnʤ^{Ű102p] }$Ӧg  œ1 ~xb] (Tlg/ܾz|ֹ#/I;CP׬Bx߻n>o?Ɛ ^?4,Wރ4[N]y-k[PsM~^9Iq-H˾bp~oLT[W5/jZLC 9>g)s-.=));<1?e^<g21ol <. :|NvV@V4 Mɚ& & :7?^ 8ySȓS2dh@]K+lhHNCJZ̖$nԠ><ljH&šbEwg{[l,`Ms’Fs[$Dx%g P *O :DJJM4dFnz}ѯ.I3Q*fFQ`' f[mM7(+d(P(?֣/}?X78~'3@"4>xYSHtPcAJ)܍UgFF &MA}}Iv1!%D%Yc6r/0QBzxHHBs9~O/0χ^z$口"_2nXQ0Cawyæp1I3PcQ;lmmEcs&cҩN˩k|->l s9 0n-U b㽿f"4.oA$:> QVVjcMs??#z%/=ԄG6.-ԯ%!XW.-_k~g)c/Vye'SLQ/g0A K< xeUt"à7cftc4ry*6T"h"O"^aF $q&#>foT(yyy|ayTa ?nn{c'Pēf iA]KrVf/φޫuG@Q?!9Ow %hVY܌]]? .scBxut-&&LeWS - 9H{;}2d!ʥ.XfִhB+Qu2aH$&g-ˑPvYo 9r?"ђ_\ס؈zKqمY%Px% \ D?3)0DL,}K6$;=s"z 8Ta2.-Z8!T,Y'GHÒ'6BHǀۈWKp굸2eyVDYʫQ9R9kF/kc%eBH^sًsx;fЋ;]+Nå^AWo/ZpBI ,B5M&aĝK R>ь^wp7zUnVCA-& h O{L6..ku0 L:JQ5H1U%׍Ca,Y|SD-!Ɔ6q$(#!C8r,@g^9$W޽HL"1I>w^* 8 }yo8h;XQH}g6Ln̝?UcBBcޟ4ʥTb.cwaAÿT> 663ϜS]t6M'PmRvMSP"CEGO?ΚƓ^&NMi?ԋ2 X* JuRS+irq4fT͘}$$MM&b 5 Vdg'`bu|^7K_IIxLOMw PZ8 @/m׋0I>Bla[0y :&oDbꖐZRe#zoB<\|ZK&-gLFh ʮ׈MJŔX hE]=":")k'JqFzXI=`ǩl c_L$[/d-3\|!eQ~)qDBFkB Daԣ%EHEk?Sh (W9Q]] 5Z' #nv96Φ< 9E rss9Xvt J-N3g6lx۶~;"c+LO[{T%ݻwAM&u˱X-^;vS턖WOH☤I;@9'%%qzgƛofcn^cSnL,oĪ$3nrڢ`^&6&l}, sn P`q@d:{8/W%J 2DxZ.ɿCeŋ}o7e(_/ >b3ɉCѴyE'PP PEsHe@U0 ;>i!9X=)nܒ1b nr~ꀓ1̔k@wQk^ [H( [j28fh0"fI/80Or𜱠ț8 ~)L($!,W( G&,KQAII M{e0]!T&;W-X)IHAg&lZi>SWWL/,YS/L&F}!ڠXQLxjo^a?B-[>:uIL}Œ V"F6uй:mM9e|35y ">2 &(tb%SO"3+ 'O_' ]#-Xy1lx0?BtIn̈a]T!-Ǔ,rj |6ZsWe.iI}4nIxގqN 4&hSb+2LH57~}tsuz&Su/"OH/nffQς#U'41aSEMq#"A^I:36P2ȤFMK TMGR|SNMgzJbD\ND9X%2qq|F,#G)g^06s@N<X@K%Ҧ(}Ctmطo/ʭ|!))H@jZS<ҹAd2&# `MBdII 9yk"<)]?^qӜEbL80ɈdG(oFƅ mM  >2%#*ia'AGgrAѹOLƃ1=SNk+=&Й¥X)ӄ$Nj@y#E*>GɵP^^-ԏlaWß'E]/| ALjd<0;p$0-bbK]ՏK{ 8[p%])x5x۹:!{b"-P|ON &#hnnASc#gvىw}N&TMYtRnɤxzV?T &;v獙,uSȨZ^U$d!, (*asb잎C ꢹ *ZZX&$/Ǩc`geb5ے؊B]un7xLr^g qQ˳;X?CwiAh Pt&,jJstJJJbTw2`T@;T8S_5T, $E Y@yc rnezU1s?C8t4N)ƅ[lE{;{H2v@N]Nf =VMwyS!Qܦp ]'*Ȏeqw,>W&3ZZ6z(,.DXO\e(fr #od؂.cmj%AOdp0jM(/.㛺{r^W]tutW^/~K$2%yŊʔ)p+ U'Vle{>6TȐ'>0Cy<<U#HI4U,ufd9n=`1!@Ե%cڱ$e!=]`G4z൵# LƃAtBCX`N NJG%Ag22R"K0>UDo~پJ믿F= %GY, .t-bQ(_$jjFFd' (<ۀDyjb&HQ;w[o#՘9w>u(T4h/(#p'r}KCpX(R2pjOu?7)yG r QS G &c|ǹ70e=8> Y:u ~X*l\gDRbxvlq-bRgu.4$iQ' m6~9s`űdES7ek9\r(nPRB2,AeS{cHҍ2PFjII=e#```ԧp=;;;yP{*ޟB5(*-b Rcd|5Tb"6a㦍ر{'SSpUW<4nah4{0"1#[pf}41azEFYP%{҈ŞQa?Z`&!/_oݎ y9Lb,,YӦd )'08fhjrLR)lsD"/`ѢGLR:)y(|^?3APՁ 0SRZH*D/]rNg\}"mcP'1Catz& LpbӦMxgpVmd_V,_/rZ" )&ډǙ$' u2u©2tZCTfP遑J+(`L|1R#Q!+ MK.+|RQ,V@DJ(Siy = q-e[R .ȭ.SkP(@lj[(- {,:W^~݀v,`ǟQWN4I4)я@f&j1b1ޏA\,QE)E{Hlq!Sݏy0{ F`ZpXR?ߞxO)̟3Y+J*ޑ>`z_c6H"*)o`.&]/w~a Vt"F_Ur”lD9$r^K\09ˁ \N9|h4 3񐂮t1rw~y$jԲgp%ȐDjǎ0LQ_ī%3&YVOq ٰPMTDJX^{5nu#ӕ[5[5+W^y%(QF>?vڔzj>>}]lܸ5\A3 Gsmġ<&0~=҄pϗ?bz"ȆC2[b C<`?|tp-]l{᝗/~MmF閛qUWޣlCP o$qjF"\aʍ GH `n0T, =c!TEP$/9T8n#(F$ UܮdP]hoCko;jA j 0SuQ,}1.f1-A'o^CZz*ORT9l @ɻ_# RyNf.~vM7b8ߴ( [yAcJfܹ\.kx%{|#UI/sLq뮻fS.\FD3ޙʦNhp{6ҋp=bAQ=pMf[J!l"idC_{IW0F-9CmeCz&b$~{w{UG8-hj\R۱{|1|c\ W+u.^ڽ/KP?)N G*1 Zg$D*/+ )F&Jy'j8p0TN*o>hNEXpLSP#070qL3҇ζ^x3YV{U""7؜Fk /|”@,4H*TNuD5r,=VYY/~ܕ\ی3Fn ,&W73Ҧ{zwr>L*IlEs{l*&NL傉\G ,tJl5 ;E~w( `Fhc,BCQ~|Zv*qOq?Z)Gx`f͍o'eW\omX8>J "@YZZʓ'=M(+PV.}^6b ) iL:%JCt,p 'BnGr.e`|%9|ir]x?KKeYZa/Wo߆˗b*gN5ʕ2hwh6"&&Kʕ+~Xx;F}\HP"O?؂B룘cS&$/k~ں|!OϦqAlyi 'cւs%X^Ы"⣿-.u3.| 2 xMG=ZX}YRZ"Hg'(}?*%q\݇'b׊OrG+R#rHv[d/-l_gl~ rW8F˳QsSދ/CbkArAqsxxHV,SM@1(< t@NgQh!HlWqLZ._Z[\it]cuuIGzSиPOu.70a;RbpB Y(ZΗELG>#2RYeBj+0uZ_@"tMMa< ^ロ/dPHDzUR+IJ^}I)|q&9:fCD -!KHZ%p" ?t?9m~CY8!n?c3x?"̾`%f/#{q5kq]w"3+?{z;ZfaO !?KDomueXfԞ iii|D^1N(J)[Lt:YĕD4㎘ wF6`=OޡJҊA_B!>/qeW ̋܉ؒ7kJP{'2@VgXNLFc){{xuԗ͟$OqA#<%~INBVPR]xU~g{zo$@zGP:RDDQ@bATPT`AE6 m/3=Svg7 OJY6sfܙ{{{Ċd c '+T,'\Tί?~r*g ofO׭( y\89'BSsnxaT]3^]:@CIڹ@{^ܪRO ğLG4٢E GFؓ'B 0#BJʤ9@M: 9^vn'K$[jؘ8 .< H2t毥T~5ꝫC @( JȄb:],ۨ~-irմ+%2zh+W%,)~vz X.FqOF^CjjteȐ!{q5@Xb LسFgV.5 P)*W02/ |VrߑSpܕ"r_OɀL-Z?λ٧Ž+nL OmF#>|J۷/o.#Ş9" @)V%eMPj(4zj@ PNPSlԥL+r$C)y{dYk_ ]w C0(W3$%>Ν+]cC49eԯ_Ç3ji7| Nd*LDbiդ9=l Y222[o:q,jTkѢE޽Ht%, T\qc6xc,a99*HkTmPC%2V.,aj9u9@ESb5 |kuxzN䝫T.zJx {UX;Xm%k0y"O 0Tݜ3DS[(ՅFJ#%)/*\Iצe' mz͚5 ՠQ15 =X~FZjM^M VszNk׮]ŀ ,8p(Cހ&`E GGV20%%0L}9bЋD>QHvRYt)Y8w 1zQkr 7bfI!njvu7 tZXZKǩ' ž,0hBb[":}b`XxZs6K^AoԀwKٜ $@(C8|PߟP~{;8ŝCA?[lϖx!( }rZ{N|T>X8N:%cJAdU{߳ TU\SI-'NDk@ބ +*  倝*bXak+ǿR}:y.)$ݲeDB IyM>UVb8PRZ(VYhSFї_~)$Rhej3_¤X:77Iڤ_ r>>i 2 E(ff"Td err:Gľӣwc3/,[4K[!KiŪ={RҋD"T! _mJu t>A̛ Q#㑷Em> q/g8d]dla10Q;H %z~gf؋uej4t1nt8φBfi,S0E , ә\,%c.[) Rͪd:ByxIxx׼V0@eu R7J$ %yM>] Q OT~*OuRW L*SPqF[euK8a4i_8N](BkFC!b*esצQ}H8P$]F7IAmT#@Ig}&gJjC@ģVURӮ~SթQ|ԨQD &%5A͛7Kz?K, ,(xϠߠAbDuOěܸe5[٦*V!]Wk%ox4(;eu v`2I"4&DFB; Jعe85 g`i\VA P~o\L+"V1o>ƴ; ;̅Qc`=?77˂DFGBG%!h؁j3Q2ҟDq8|!DX`33ԨX<1r>5 3GPk>'m/j ^7;jW~LGͷDCc*yƑ>}(hNR,;y2j¦x& *ҡCD/y eтɋgi pY6XFA >w¡YL[Nex9]@ܤ$LB<碴vzqV}=aÆe@),nݺwCQk1VF:M^Kzf˗/F;*Y3PRΝ;cƌ"R!K'}7ߟDطܥ[C S+;[[v=~:C(|b?>^ wE٧0{>2߼X9M~3xS z= kVc(.؍]ӄW0n|/cLjyZՇ={֑6;w7׼)S5m0˘0."ҷe2-e_]Gp=\"e0($~8bni߿F:vR8|'ޙo Bq]>k1>pqebB~c {3I00nxw$ ?GdVTnҜ$73ŲZK` O)߀*)>=RIsDJ$Ci$NJEj. =ހç  :Q~ 8􉵈3ECsXd"W6H4qn=  LZEEe֭?BC/]Ʀ}M\^(q ;h߾-[ ݀oZ-_/hjR{Jڙ={hr@1t mnThmp4 \>FHϙ65r-x2&̚ L" n_*.Gc52"s3b$|FFd?4ls'|w?/lo?AgZL0R#X1?CP`\߱1JmmŘu2<g N3 KÊ,֣!``>ߎ {4E;8:ǘCP|t),?׵F|Zuc gb)-'"t<y+pgo' Z(EbR{Ns+G담A~VFIs>4^B2 Zgִrmd b|-Whc8{~+?RGz7RS;auU 1 6& Ѵi22ڳރաYL>? СCs$$o]*{hd[E޽{ݻ/OrM:U ï?)<{_n|W.gI.~xAr*eyoֲ$%$h5dϗp.t쉇 돩8Ή琽=m0S#! C.o;ڢ0dtn0X2m۷KP7g㏳h]. --h#Lھg H߽OG۰`xz<@ZddOƃc=wd_ -o6~qbH=.30Dű{vgs;϶!)5 # sML%p{336zl(pq<2;#dYAʹ$;UK̗_Sv/v s￑б֨99Y!nעy5bļ+m$]}l(^]W*uRTV8愥rPvh\/Zrp:\yv8;;t@xI8”nD9@Y d~C|1"4u8>r /vٕӳ1r~i_X %lfr*hU+KjTDqt 00 [3'4xWWXu80嵆uB Cllfs*i 5הvT /7}@Tew*_WrXfk21yı&9Cґ ͭx.ku?fnxi?AneYiirv)߱& !v(Z?( B7X'BvX!3A(rpWh8Lz\~귫'SRpm{5VR'AP7W#l-~v.8z81;YzNuOq iסE# }8,_R+N[aWDzq2h2zoߎ_'Z)űS^x5Zn%&ꫢBst[4xU["omuS:%HAWPzu{`_rѮ?8ǩE8P6Ɲׇơ|7d+V靍09x3u{뢱?[m0x*1k[ʰb~6>|<qϨ4|kb g~;_;-8k #}n>N̆hG!iUs()oa@2}|g5qz D(W~-J8 zGV%w*cQ8&P%GH Bf 1sdX~92(6 b`9Y2ΆRɉa(>Fr"jY ֯7,z' 7%#3pd'lR2جvPa+#<{ȋwX%>Y1xbhfr m^mYt~%#Pe^"9XNgqѨZ*՗v`g~`R]oаc3+reb$sfQS%r J sBUhfW.Ooo|?N5{ ꕗﳲ]蹩xX;Y!CoZwuRwpDmd9$˜‘ڥ\xB:fE՜(oƊgJ!.Rl H1B $@E]l>{' sfrN"Ymԋrfo%XhdtcN7⚉P#٘a!L}|" OjoKjs)^&&fe>kq ʽ #eJ%?ޒpCTJu;۱ 9qĠpiÎ-)qCXr8<6~q|ʀaT`Zm.[x(0@9mlӶo]qJ]/ FҒ\H%sQOF\|)6n(%#I7 8^e~ i_ Cy8v 2& Yq]bo,6hKEVWqW P3e}r?Pv?ʣ6A! Lp]z9u-kA bl3 \ 1ĦKp[-rJw=w99@B9rp ȩxչoZe,`Iaf74Fof~" AF(.R 0f ()TU:VAj1SPlOc4!\-z(씁edOp_cTqQ}7^:H䮙X4oz-U)n^-AbC5Qr %bmʔ)4iU'Y'znٲEW_jJ `HW0{~px+,ԡG82Prs  P'f4Iu$b>LSRp0hаU4)iXt"'4s6⍅.`F( &ekw 6F?m']j.6ǍxMShv.&) [h0lb n1A}nCeL8uqo6t0PDhM h1[ɷy Dzph1ѣӂe)͆ V=ݮAt"E qȬL|XL3cٟ+6 mʒLEb}>])quE* qTb8N*NJ9D]Fbr2Pe+ywm9bݏ:<ڴ!J,ր77{ѧM'-B-7Mmj!r0ط;Ch8~ 1 cX<} Z6fs9.N纾UINex<rryAaصs2R"f z^])65nXPKRRʌ3hNP%[o˗/lj'*=G[ouHWR 4ov%·9tz<u!::b0ɴ[Nr7Gߦd4#2A\¤@6u28%W輻^sc]ʵ1bL}Z%bȏU>Sy( ݆crHL.$cSgr<(QeFqP 7ǧ5p}_U͍md]_8ݔvJo.Eԉƨq1ip )^Sz-k5ks]h0`Xh39jbBյV;ksH!hITc,yp6,Ξ;M^knf{cLo/ ^>\K\rS# k!,)O|>X`Wn Fo0k;7jZ䑷t vM pfXL=mXW|t~1Lhژ|O%Pތq5UvtϛаQ8;x%SARմֈĻ"OURZZh"\wu"_#s)@2JJJ~z1277Rx@d+i>}Z [wh.T قAڶ/f2XGn287GA_&Nzߑ?(Z.:*+>7Ge ph #B_'l6XL3 r{* /:[η||,Mtk.A&M5G['] Cb01EqgWYu ~29ͥ#Yrk!tzy}u9$a 1vT~3cZbҧ`>oMn yL FmS!,ޅ(un(6@}p绷Ex~ t8{pzr 1խ)u9%*rӁxpq&s@JAOuRR-8p`01Դj="И'&P!yJUb Ъ\E/)饖C%]\f S W} ݣaurawH.\Zd*k?U-]IY,b \Q In("eSm?Iq)D}X|:i1j*  d04mlqHJ G ΍-:{ #])ZD;5["| e{k0%( Q&IJ/q\/˅ xoJP*)G#ŒG,h2mʻ]u0n0@ǚkd9#$ic͚5)+zZozEZl FjC_ϟǑ#GpB|G^VZܑ_9rHl߾]_i9+/g9T&~&+?^ ;#*I88v1HMy(jBP)1r}("bbaJp(|K#T@ kDw5AetO lrr@m5(\<-uQfF#,Z@Aa* n'J6.m`-㑂|2g-J#ap8.m5hz TrV^ -e'p=CwǢ[|'xn Jx<^?}=^]xħaf‘SP<>-Dۢ:X8  # 6 ͞&GmY)ZUSV؋ D(Ots ct r%:#c@F:j?D0tP 0@QD;r_~!nK'~^)n$+_FFr *J`)!#E‰bĖ"ro_r//\2*Uwq9Ts!.zѺ;-l};sRqQp6BߛϕAZ sSP0kTqrPGx?" &'Rʑ}%w1 D|h󔿞BNdTbtM[($Tދb&CBE@QW+pVl>!Sb$@9dNm-!-n |?;ްڰptqUJƈ(1Yw"y-D{W`Z7?B٦_Q\q4zv,zi0Cfߊ/}Bz̟5Ֆ:Us*UX&r9GYI_(Mx 0qFV>$juJ`N^=*~שS'}h;vA@U~>R)eb܁2iРUFQNщ@0N+Ƃ 'x#S[a7S ztiuR9702'v#Q0s<`&%uB5"T^{ -(M-@;*S9Ux1܂ br:U_@&P{STX1jAS%qNwOvrm Ԣ.'y+cذ--leEvҲBčG`KE/ɇڶ}Y{YQׇ੩o#"؊Q٩ԛI syO%1_ d^^N!uG˩2p8_V}g2%%_3*%8W_aݺub15ݯ_?ٳJ ,E.̧zJ((Ob44LRYr>H(PGa;*QTnng tU}Ek@F6Lp(hiR :[\g5 )cl3PrZ$j) /-H`<|V&L8yI虪Sp(`rnѶsl}ގ@0x? v܊Yg^Ħ3V~^%Z8$f}hD˟ 8~$*^>6&B5q̌$8lBgϩE~8ΛxAd!mzF;B)AsbMƿk+kW 毻qgŤ.FXDeN ? S(8JNӛek\(WAP'uFhTr| ^me%ã |`p`y9 1~J5GYr| g7g>E@}rLi^7mP:JS.y/PIq$E^3yAЩovErBr~F_A ySp8&(15vv9T=Q$Y+c9n۶ Nݻ7F%&c5ێ@De^c*3 7k9xR},fL{$ ?r KwiA&}=bLFt'o jl.,e;\(9bAX|+ ]3U)`Mcl-!>9K0u\49ϛ1cI=ͣvhc"nyG6'IcKry80l,-[ XqǾ I6 ݐ'bX|6$Z/DjHv~\gɌ'^8yqই1yD" 'c1A:=>^ax|)|ω`jk, 7] }o_ ǝn4^ / |o,+AdC&h2Zq}gP`5` uc0Xyԍh$M2uւ ؄Պ%49 rXsXhd<ٝaQYjrqA\ V.o1T fs*ބ.(GTu9?!'~-%JG #Ǿ$mʱ2I.orVfѸYw j!-BƊ˵Õavq0:8 /%Q`YXҎ9Kӱ,\kF#aKu0#aFh)Q"<>/<v v.L B ,tmxp9[ϗ`"5 AgvN ,X[:cFD"*Cb"-xNrh$HܬnÁZPI2Bt: ƉmqnMI%=e8Gg@ݳKؘh!6b^ױǣYG49ؽt@*fIZ}vn}`2+n|H  ݬ\6]asuǰޢ +F?GLs㑑Q`kD':.;?#+gR`DQQb@r!|j:B/n~|҄0ǃ~'PJ{Et k/Ŭ|l+b9"@9MP-B9 PN o9XrB¯U46)a&r:b NUdʅy/9}|d\r%^{5R0"|0brf7'$waW'eS}OT"w=\ك "'I>Uy3::Z(L%QXJJHc#"/RRG~12m=bp] r`t&QEVDǑJm9MGF=jApNH@I*<ݘVڑډ2Vv(Ek0OR3 haw{2?E$4t wq9i4D` d/.NE-q,/'8o@U!R/ʴ<pԫ/$cؼ[nF9ɇ=,gm4D-"09sqgVM1 i<铊sJ N\9o<XryGot( <>7l3E N`N 76’ZVl"_mEyyt\ñWaJa,-D b Vw١:aq7.:&ǏqRR aGϛj}$4;y?p-jy ރk$aA@B77 ZED:len9cqԮCJ^x0M1n?cXq j+Hľ6)yzZF#l9@Oѳ/Yc8r99+7 ohӉv &x,#B`//euq ™`nũl X8lFn'p`zLk~3Fȣmz\S5(rqjC,U ҫ8UBNVv0W] DE* #rU}jw%̯h,HK5"8Ti%>0PJP8WYrl3 *zEX 5Avjv &x1]h0ZE6IIX;X\@'S"p[dA2V,9s/Q[%غeGt-pSS95ʴǏ~~ȭMHv*&ڐJ7J>(tNz'B={oǵ^{IOLfeph}F#$q~VRfې%TMx-Pdِ8ؑU$N4b@#..nNPD4A Q}fvs]ΌbL™ x" Y9V<9Ah9o[uia)rٙ WehuhcH,,Ćnt|E"u<fGvBZaLyOrHi6]"$Xb^~8ZN8ٲl!wz}86e<8+8 A0}6haCgH9IO_S0ivC\[pmG$TfJ-n{iU œNᗵ1mQ0qً^ YYϹ2 x7Nbi$nAfH w !̀QpHoO F= gT(jGx,^L)Ʀ._!vq#N0bCp}X-ڕfPm-ŷ+з92|~*)gB.'TfKhTV n xV4qZ^S@D'vVC b*Ń!b[NA\99ɝLj-?ⳏN"w7\?VϨddQ //I28uus~~VY6B`\pdp;؍(m6AxϔNi=kKGঢ়&j_kEvN~Alƃ7Ⱥ\vLGA+p*2rNxw8il4f.''?C>@N#&Tꑵ<$I+#wYysٺG.T2(,x6J7TF$qz.t\E# \vHƑHq62&y4h}W PRXWp A&i3չ!#Z[Kފ#[{67S&$$˟If /"pmqHNx;;rnbê7}H֣v e|fO}ڔFurRNr!uy; ni!, ?R69uQ QՌ3. v w[ P̎޻<>M1u]3L3߉aӮ0/pjcqD Nhnt8:礋cKEtvMYPB{r4 gc…Db/=>'86#nu;]۴nqc3kh#촨Ӷym8C4t r(h\lrM046̅E!y8qLՔP*h 9'ʚvQ.kP~݈S9LH␞-r"T^p}9:^yLч!$N#7V;?* HF>)e! rXQ̔R#SxQ"㲔ZƔ:"eӖR3v1 Fh28dATO28װiihغ<}3?~3b<؊ig E>I$"lAJhM x~.^P8v aԍIąj`1RFRj5e+ z|T^rJ `.F:iu_zAܬ}(.(\Xr˭gh |\_|I? x6mz!fk_FKbÆ b%Ν;c֭E9#/b~q+}ܽGJipUfi7hS/ڔʾ"ZqE"`qBi@vxW-p yNViӉYn*j1ڄ"*R0xN]| mX-h9]"Fɖ ,lU |d)"rĻfKXट<4@Nnv (Wu2ޘQh̞gZ|'b%yxUM9.P,A# ^"x~_4VSWks{oN?[&q:]D{V CnOyuI&mcץ]#Z?8ŤVҰ.BPH M[ibSڡ(!ɛ 3ʳ5 4xH+J-)MZ+W938~#6>([? {Fk |V4j;>]::/@tD_Ąs(ܺ'w0L;]8u\\>}?ZwH` ͂OƟN@Sny%3xi0o+ހF D+(ը3&sb׳Ыn1f85Ƹɟ1!h9ZM^éQV4AY3ǃ+>J>BH!tBG +6P׵ZZvWŎ H Bz&>ssIB>τysyWwam5Fsk˰r!cp֨MlٷWMsQW pvoёRmpK5Wbb9Q0@LqWd9 <}KE(` x]|C0|•H.$EC[/bn'yQ믿Kr7)59曹}K6$;YLWX]7yƅvę ~b[P Ww($Jf^h)JJ՗@BrkZffH~(2%F<{`t{5:w~OR]~QQI6%{|x- SEd( $s3d4{~L?D]'Z1ߟГTIaz~rqu^YSMO3h@2+txl#u>ZX  K:#bcYuY+v}"B<%,@ ÎSz>:qjEsjD:t턃vvn?,fhj% wKţVl8} 1-wO/O].腟^ [%c}כ=}c_ t)!]s+OfCߛq9޻&ιy패+??B°0lQ +Iz3P^t ;,yb|ZlRIX|Pn~WEjLXMV#x:m_V9w?Č~`L : |?ig߀ D.,Glz&,шso-:xCMIe󻚍8T([7f+'j-ȋt6ڹfTa& 95֬!m_pos}C?R;_}UwHI{K;??jd7o'I( \IuDqDRI*U\[[k ?D# vs3%5Bpy˲ZYD$mu(bDg"j7"[*.˅%$YjP&*!kY;=p{t%ʎ?D֘tLױ` aI4%H{÷fWݕ;qP\0L;1JB^ck/dO!v˃SC?1vjLuYjX" Ijׄ9>ăCg#E+q߆p o(DaB%J 0y Oqvx  FbTo8%{qpopq@ uGwąZDtgb3hÞZ7hVV.`12R"ǜ^Gnu`ؔ,XRYܰ*eX{/j5\ʝRְ nkd hy>< YTHKP湟=eQy~I@ÏExU@laf ׬?hd؎FC9@K/M$UCq} gڱIPYfqoII (glZa߾}= ᝹h΄ֱ&w3ƍv 놘a(-3Ss<6SuekS̱W=#~´׽x >!wœb?01];렷PH ^8K[+d[й{ ,l0K9U]N@#Rס#dmўa軵euX15d/>J =8p ;KкSҌyyS Vuؿӎ532C2 L~ZU*=ϊG|$Y`[U'6W!O #! kSH](sȊZ˯U%%d!M&v]6z_؄ ڡCX0Q{Ln}0GYȊyExQٽ5F\Ƀ_>ߍG0V12 V6a..5taf-N<* :kJـI1ؽ| r:lo?(-i"~ &) N$&!6>Q)@Kest#>mcvHr.w/Xxk;Z [cBGޣ\4{,]A3׏hևf+6c; lm(:GM`]ztoSAޭ˧3߆o}ʨ#|WA!5\~l| qxeŠ) IH}Nn\_,!E6-Ɯ^$%e/RBuhhwh> Z#sV|rLqk-#<,Td"Khr'-}]Qs=xT}<*Cc؄mOfoYY1xpoF:O"ghn:.MbYy>^!%)ڰ|rKXf W\nHj5I''wIsʕa C5|j?yC2S& VI=<_! 3ni&|4'4 SI6]Ki~?e7\!&,z泀ہ׷AA#ih9(2z~ lbmۖk ]?%HD']QIJ:&VRNk&IXhB֭ڝ8ZĶF\DIQ#ޑ#G}0`DQ#RR$׮]DtxCq_I m~Kp0|H7G a3ʊ*uvع}i|D k O^ ߖx1F)SxU̙gāI0$7Iu~JG߷kk_dLzP%k! œRH٠ ۊRo!">˗h8|3G1sV9-Q1aOĘd,a]?̸t5#^(dޫwŢ>t2Rkr+0-)+scgEkȋt6;D1+*ķ1~ R0H_^֣nAxS)ՋYOn@b4<7.Θ(;4h Έ68MXk d;1?c06/G)w27zY66?τ.;'sv3'`+`*XןO=f 9N4W*pgrNT҄"6A,SNXd1V^qNVnB\'2#HǁJbuٓo8|5V, ]AtzZo ۑ2:΅͋\JjNKۧGه`ପW?7U^Zd@r 6 3t,e#*R#!R$N5IFɨXO=%/e%B㍬VA% emzHH9.fpyRh ~oTSsZI 5>xk$DƁ8&k:ЩC[1̩u`'r̉$! u&Uxd苳QG h=\n?:*1F$YpA^"^tX?:/¥;qù*_1+^_Z(ۜ?lIGn6"ģCu5?cƧ8|\za&:$PyMŪ%$fd9$/b͒#d ֜iIC,RTna#Ktj(̠~WWr%-Ġ%# Օb}Ȉ ZM\,G>e @.lYx~iq蘨Ƹ`˖d}7Մ~ɇd0i:[ڶl /m׮E,jY<=I8:gD7v?/=F/:ނ x=lqoƛK*pLXNNjtƥ=cZ܉:C(s''ឫXuJ ۍ1T,^ WLø; W;qǽjN||O%=X#0e\#Zaf;L%;tۀYOcϛP\@Yv$śVL|#*vłObIkx}FXqQعKBQϾ ˪6slQy:|yP^CX797"G!S#_X ǎއ&ŒjD;ƴ1lpb݇r~O*Ys:,\skތHocLJm;x>0 ޱ{rΎ႓C&}[ԑ{ܞW3MNXJЉ@Y5#gMxz6|!TSF6YX%HJ?q=`(&ͧ%pnH$Ka' @|8C q@sʣz/B9{b0c5(Yw'%b /),ZyJ4PD WjB8`0hB6<ፈ4 ]Fr_ve<%3IKt-cu]z9t{t9(bC!El4#:#1q XQEG3ϰkNZ* "20N鹄eaœ`#Gbmѽzf$0šĈ\؋/ YgG=5RF#G<#Y֫IcBkk[V%ly}/ K@iـx]XsAyY:P&YqxQ}" m0 Jp h;@Fٳb=Eٷ"JtQd L:=l:}pGO&r%<8Q& m;p\ ^6XU^DOYVn>x]лO)V#\5?_C:ozFVk0iL6>E\OБeOɠLj OD>Cr&s]A }'-^|-Hٳgaij΋6)1bȊDžbQb5V8grNJ)Ȥ؈DFʏ~ٗGMizm4/ }jA88eOd'fN0pwp5qUwY(.iM̗BޟrM5'4RfauΏd_gԴ4E{Y<[Iy@+mm$wrTgmJbo &Çܹsy=k2> .~lF"s@N Ey>k+'#(#ؽsi >>%n7YWdyы,RX KpèA1𱉥ܚz uЈZaA5떑wn $ 5dJĄFT}{B&0+)9C,ॅg`!)ՙ ;؀(Ǡ{m]ˈlFTK5b+\!ǩR=I#/uF򤭔$ȃ dl>ϟyi9e[eԞ Is 8΁|Sd?4i+,5xht‰/χb,Scvd&@Qj`ʱ5Ȫas0i!6Qd^E7}9xE tit(nhbKI$CbLl""K\_y$U9={>zBChE:4%TYV' _6mی۷1`TI5i7Y\gsֲ:wN82/IK2U eUd5X1gs\#]ݎS3sG2c0h]w(SAqc?*VZwPuczؿIP_G#]K1S7Ȩw]5jvKg& AGPzY靁~/3J21CbE">FG''7-ʃN/)ks2).ptC dcT}RJJ%Ke؞5p?Y)@tL jkPJ Ԧ4 tQ+iqַ'I_q > J3RpS8 RNsMq<\Ha{0 {O_ډ=B)'OFT0[,r6[d ~i.@NL^fҤI9$rݘ3g{$++ ?d8㍃Zvt! ȑ">VjNfFXO`}0>Kڽ󚴯t뛫P-r0VMkETJ Cfh`GnoY kA,cPℲ3IO͈M>6H!,? u& U$~(% $Z_GR%M M["D jqr(^ph'Z&7St(ϴ!"6Mk$RI3ZxFi#XIsdY@%>PɆ`iOh!8w8')!w'7` ucDm'2),QD2OeHItHZQ4ITYѻ oۆW_W;-㑙FDFkiF|\ܩԠPqU3PXt*qjR%Eca0PZd?KOϏP:A+sp!I*LֺҚ?qiе8o6 {pr/3g*,J!$HMZdׄ\zz{^"n~'$$~cCPr84ccq8ε.@&`D&xyP*f)MX( 9$W뎸] Ҋ`.]pFd\-Ѩ,#P\ЌCzzUWaBI} =U:tdd$d":AjJ`Wi-3o$BIZkV+gZ\JCܗI:IR$pJfxNГ KV~$8&{]55il'|NKqt/t5Μ0NjO\蜉?F)z%%iD*M6ymžwsEVIKdNqDp 8M%? G.qa86Ħ%NёXbCˆsG~,ݭuyiXgDϞ=FQi@nFC? nF:TO6ӍBˇ<r|ۅk$⑘=sIVS a߲v{ѯz;v&#qmB)E=oi39 ,5^C N2 C\S'q|b9ɡVp-w@}PI>N+4tBDRIQ6OΣTWp"xcwD䏬A"_#d+88Nj pA 8)z8pZs ,8;'QtqA\TT$V~wF ߡdQW"-iH_Z;'~kN$#<m "UZZ,-Zďz+׋:t(7&E7 7t*c{'< -bb^X-s`7jYo-J7yKdZPI9TA}IŶԕ5u\Sk<'˄.xAe ܀ƊicS0Nm pZE<o'bך&Q[WXsZ){p2ϴ&tmor{ 2%9lKǟ wΘVf.lޣY$hC_$VI!|Ij'ipr} | BBn48Jf )'OV,|{9p"N7mtߵ8",tlZhHD؄կ;ů]s6}wN]v +쐫=??:eI~_ j۷¡[d,왴}{D "{&lߺ;-dd%~6P9r}D'Ǝ_BDV"p;ZrC4D2*k: a4LMé)aw'SOh5 +NpRp ; mϴRˌPjK RI~zGa-qc'OFA7lBHu /~DH䛪؜Dz:z[JoKHH?]T%b1ۘMXO06b<ۻ={[$Fb3ݻ 'd!Mo$+aWɩM-,KdZfYOMƽz8$2|:z=scuXfW .`e6U:‚\A]2Cphw$)pPK/5p@Vqqa  4Ɖ{ZAn7w&˻M- W/dddkdz>I݊gX5K.UFX Cp55E͊ӄ߅\4Iy'|coM+7a9}|>A ˤ "[k< H$?Ԧ89d:u*&LSYVV+ŋy_>@5'O̭-)ҥKqwD"ALX%kGcb*uJ9זlt쿭V[SeNJ̈́ηs$:CXc?pIu9DlfPU;6>j@u M8^sZŅʫG\9: }\\Uʥ80bjEI]q)N4" 㔋8~Opɢln)N0VqYpb8̒нC33Y޿T HRh ɸXl9==01xX*kZk$_%B;4]x8(1p2+bSa8aNasM)q͡8p%'Ȩn\|+ᵒ׈H /g:M hH̛7/2^LP!n\˒7,y&vi`:%5FبRmz6?tFry8C޽{~(U{O7Qֳ<4;?Zefb~kSh 1U`wam;vI?0&ՒJE:HSф;*1 VUl+4I^cOQѡUFZᓃVAwd/9jHN݅p*Ղnlqd%`YU P%FdL| TWv]4i$K<.,iqkC8%J;?I, |>a*~%aN#RR\8RFTj蒋0 86n$v;lյ򚢐wRP^]F*q,賍PX5q5DUP!5RC828i2!M^ć3U둕nqqsc,HђI"EtFC$H8Dj>꫹lOu#(H3\$ӧ\U>'4Ԩ^1~x%SRr'&qPRRR+{EVc4ұ3HqbI$,څưq&$%'7&:]Tׁ;w2>˓i~bcZP8YIh1"ǢC.>z*` :pNl^fD5ɰ9A{pжDi1)3E]s1qx,ˊjL=uTW"d 53$:^?0鸊i /iu@O{bC8  8:u^F"t&QF6l0N333QRR1M]:wFVX|MJTbaM;Ţ.\'x|D/ H!LA/b7 z!$ɴj l)BTh5B.|Y=rrZGyO;ðmK6ö322ݪ/B:ؒ3Vᩯ+?`Ex" <' :$"ClrnFJz$.ǿߋ a휍xA9]?.C]2bD8<kV!/y 3777 C[F,cc$vΩ-2ٟh?,3a-x_Qyw zbLbbb-b|yЂ)GW=FL8j{}}G}bud[HV̸ޑ:7Op0y}X!R?> d+dM)iB$mђ3' i(G^RIw `Ŏ;m[oӶ ١L%ǸWUwdEGו%F&sYqQNqs>WȠ%%ٳ>':#.>_{""s5XIQGT$4/yjEzdd"A2~ls*NK,GDrĕk'sD5`FJ.mD%%09QeNֻLB@}5pI""m69~b=)_7K/qKɶc[y境r}\\ yS2,Pb(bmxo8*0 )еO<؈9/M^Fzg+lcHNEu#eXs 5zB ^}wsً~`ksVVFtdWhK9SͨaN}Ķ}l3YȣN840BYέTS4tώ)mm5e+P3VHO vG s\!1&mYF =[&D:QH; dy!]:byf|$y;9jph_J+HHJFJ(,5w$Bc,B]'iN7 'IGJP: Ъgfb۷?1b9h_l`p:x)Y]>+5ZJd}Bp 'wUL%Yuz eع~^+,CdD$:!6.V)H$Rd5f.gU@:|"j3hNtͯZܹ)Ս<|0?_|(ƍdc9׭[I0GrBBcJHY{\` X]!5f~u-~m$r#9#!>)GUcj31@`Ji|j&4#HL7ޥ EX00…HEdžտa]]q%GˢPTVZc]|u:eLo c{3:F“Q #h7x>6pe : Dݻ*8׌AHrLXn ̏ŷKfXRpﳽQO-0Fk}Y9|w :!INj8{G{b|'ʜpijYCkBrR6..Ji#]tp'4Uvª(*M3%$ᛖJ-&hB>}`zwGyޣzt.qA^nY~2`h `~|"g8Uj`ac\tL4ݽs֯;lPQR6mpsY&!%8jnĵij!=;,Z(2i'rQs#Kފ+~EHeS֬Yc:-/4/;te6;Ov3)HC )GO J ӭd22ZPu\o'?}B%%:]6}q?i`Is!aaЈhkWNx{FxvTꛮB.En 1 յvxq~ۇ'c{^.m3I'2NJt$6`8*֩JldF٬N)B=' ×ԠiocW%sW5UTz#RǫO`8fHnVP8I-8%FIR%\ N8Mp\'IIg$OPBN,iqTnA#BIJ(^IJO>#AğJk$e9/ZEZ3OF.mr 65&-Neիy% yW_~<&#DMv"^QդDtiaֲtOP&q0՚YVV`yuIj$9JݦPf߯!MۇZN ; 5?R$`BYCT' .ucM\}YNrЭWbعU9.*wgl:Xuө}ĖŅ>.uAa 1SGstkFˇEva|u!VSX]`9E770Z 74 VY, ZτyAR]IJ),d"Ə6NI䒶9|ظ@}{[h+2bٹ[W6\|^L^z$m—Hu  V:C8N )psM&:9Ruwbݚ8 ۪j`1[Ъu+))N'j-)mMS]'t%4VB,[w>;jd2K,Q4#E):'ɥMqB.ܿ_~9-((8eyE$% ꭷފG…i@hP^5JhoA٠ {u^ ~J=R%`M 6]p^?ח.dHCO#*LҐ*BPb>YSFS=d'pqzF+qՃC`fuQ^Gzϛ40 Kws!^,A#|ׯWSZz_TeYHhpД;>NtieTR'JY^8N\')((.XAܙZާI T@W^ĆT"iBI1M=.+\ݻ GQt?゙ /ԩOk-]z1ufc,u#y?ՃZ%Ic-H,t-Ot)MđSɝMdXH"<Bfgg2LcV|]2Sc-XډM iY "S*8(#{`l1@frl~p  `oHTyF K\qSTGRﻦƊ(}qr88erS*i KpEuѡUG"Dᄒ>( oqZ]UujjQe/Xt{ie$&5h4Ó(R { *:Jx@ԯZD{=3~0sEe.d!8Q0\l4!51c':iI%RI&hc[7-`ߣE@Ħ>JkBnn ]t9e_J !RIr h|Yf%/\'O5- D\ҔoҘ۴qd!1L@tLsJ"W6%Hl:m1oil m۶)z_&mlhEdDɲAj2KYJe9^ܭ0a0X7k-6ĵ1dٰsC ;E #KXDGGY-c8+rs!byظ^l~6)dES[2b"`5ȰW HI5Qkˁ닠fKlE(t&ɏRRs`GQr l\uNSKMF% M$,ۀ;aߧuET+2,p$2W0"M<ڢrc)z)$Pۓ#ee66Rvj΋ǡ](٣C|G,iI'lo%o+Gbvkiu 7#ǕeNe'"!!Q֓C|r)ܛjI֬bp򙄜w .uiP&BDdQmo-}A<4(Ճ&=6'BYcΎ;vaM[h028 #G#z*n~'#%֠O Op$%#7'7@-fj-i3ԒIѾ/vf/$sZӤD|ҦڔK׏,MSLDNub$$ I|\'++ŴOU#IH;qrRl$%T7rAӢSG>"RD)>ShLg0 3DYr[9޸Gڈ=th!mL~Vd.Ok o;dX)GRcxmlaM,bDrdžx 8*'F8FVK*)'a{05H6`Y3?N҃crNF(3g.#W?w- CɊᗍċO`[Kqۜ:Թ Wm[NIعƌXR6 :_4n||W#;-:du팇_xx~C2B=>>h+uFN<n7'b>l^% tHMB?[IPi$ 8D 1!>ro`%JB3UQpҨ%ZN2Wo?{'eu ˲AEFcI-Ƙ|ј5yM45v.4 T](><)^w[JG-3HsrlHpM7)_geI &§jI&Jm)A 6 XSi݉־9/#+k/Ir*<{Ra *-p2:8yɻwC(bTYw+u :<<C-^r ;->^6ۜU.D2;J&P7WqWF6fg?t#:nKX ~|}7.cy1e+<u4$ʝ%9[ٱןaތ2nt1wwrH^IQ#VĤtfNDm0(Iҗ3¯(O"5R )?(X,2]濠ֆT81p0ӏ;F ČjβEK=ʵM`BaR IA/UOdF24^>0`JJblZgM)yS-q P_S,b!6GN gKL#I-j*sj( )8$ZH $_Eȏ>3V\[ / ʉh}>5Rm#;?S[̲U4kxo i{v;lbf"2Z,"zW7åX]dfm.&G~`ǖqq2jz\|,^.ZlnV+zu3o[OoՏtPj\~ihlR6޺f"d$~!܅dgpmgSdlB/P|\G0}ȶ- trcpZjy&\g0M9fdRwk` Q$-Z Gذ J5ۿ6z=MsXxoqDsx0DSY#)쎷{3b$12x+I&&AoĔ,M460bHvm{7ĕkrꝮ6\ɓuf@^uu|,޻Ϡ(G)P: h?>T ɺ$L( T?R'rLZz~Q:L;c< dg咞 G9l$ I{Gh4!Ew0hŊ夥*v~ƒ?Y3yTCy؃ < &[DiK D-ʩ0nw&bbѪ?=܎.zIj(/A`;*>-)4771Ɠ*n#Uv`t1c21|b,}m46S̄)I%k0ɛL$Ma0㦜'i/,ڽ~{B#t&9ceFup*a8OFV5y!!VfYG;̼z*I^bG1Y* Gft]X棻IW!CEƪĨy巯q\E)0h<3.ęSqwhy2OW.(>oe"u!`PFRL?M\߹1/-'(3Bթz$ҹ}#[7gc=$ip_'ڬP۫Bv?1ta8=jvO(h&~8F=UuR16'ROB>t9ՁeD (#f`M {~Gh$:3r^D3s4ƫ"ƶ1ǜ ˜4xI ֭)rN@##@0r,5isFFD~Lڽ RR`pS/(9wܩDJs/~ %bz"v^._N呿[laq0]?`1HKMaoQ_3`&YWhmXn.o{l5ߑM?ic촊=j^8ٲyO=JN{S'l̻{\ye}/GF_y m :YT?ָ8Ryon2HAsr̠דkˁdfWPV[//'ACGIDta#(oFfsXT#,|oAee-m1dpwBjUnO=s1ߣ^gg Xd/,xԤx 0u(6~ضe+餧xZR2(f? )طq.o}sN*?#8PFrԽagܨ(I@s kk5Gs &* -orOgWȡ>ahnZ=9E M!Q^ZG7Mw/*VS0sDޞ8 [5~zC/tx|Cu kum}_iaD&6f{sz '/oAL8)N $ %֗@iTyB!U88}J|Jg;r?}JFTrOp7&hp~ѿ# V2MK̟t5J;mm9-flN!p)U-KLo?".FA;O(\ގG{?_=$Gw)m%qJPEdo_c>)G hؾKvja޽U~.`75QUums[K),*U[:dYh.9s-bKGcKj*IZff1֯]ǦO61x@ Jzbm5& 3}PU揷HHI$#O[YŜ1e2Mx|NvLVR2#삗SRE|jv>*ذy+G7L +vaы*Qn|^{'oaLBSs`lbo>kn9Vy ԟ1r(.,[P}0M-8ZQ͸}v:}k>Ramh9 [-mcML䠹 dh.D9~_+maJuOh3x4`PD0XTOs<LiRXZ uXpo H(X q)q$M$)\&btl3}~ZIܮcwcάCiqd!DVI ;ʹ~~^NX ꎣާk>޾Wh~ɱ.YE*4lBp+~1 OCp_(? Iz6(G.'7jlVӬAf7wSyc}GDt]BӿDۥBUUWׯA&+/05鱧5L:a%S/Ԁy>RR"}1|4~Q΀Fsh>:lvLCgKUG9$O_%8 n2p }8Mbeޅf`Q .[ S&'/H]={J8a Rkc9/6wk 7.3琙"@\#'SI5z[RhjŲ%7pܹ\JNAV]{3.XNÓq;ilQV> أRpYt67P}ŊP|-Y;ć=9 9䳳"Y3]w~v*g͹AZI-t8]$XNtbZF!9Ih] IqdƘ۹BowmGϛOI~>O&HZɴg ωIe㾠5=F_HZ@T.lq?'@ltzb%YsJlBz MŦ/p ZQ48+q&-.n b[DTԅC(rI<&6_Jy5k֑;h"fs}Q11錓M<ϱ}nV1jH2k0f 'LrS{=+_s\f_;MʎO`ko45O Y=8[0"c>LJPnA]GrLFg 4)'!Ĉ#lX *ܫ s]~ڪ Goaz='izԟJ ً"zAF 47؍MJknI |+mi23f0Xͯu`*NJbopdBҺʑċEUWngGfZH$J+P`GE5o#B2U X>j7M'M)k]ġ5{J$];|!_鈊2 z,uvog(;o/@pQ_˿F*0nr)mxjw W tng msGb 7}"%>ChL9H"YW_0D1y|jXݥj!&h$bjS9&q)2  PO1TcjT屴8/J$&U[X-\B<LEyȏ3c6E;)r}˯ww6f8kg>Ss}5G8nt=tĩBMiY9_5:=3ΚΚ9=eza{!ڠ-E; C$J(H2z̓{h(Sm_ѯ^GOzz҇'(>^rA^;*RYφM<\=ʍvyʒ n^~\}!r/íĠF#Iw~ݎDtli!UR")\NɆ&1$o*I%)Z%ib>EM |}1?Jyrߋ s(?{6Z /?,p9u}!O]*5iPGgE u/@|SV+c!&,Y$PhiPGHNZIU3H* %~ϓPzXBbcZ._Igo*`M\C$%֍[GY=n80a)I i7hisH}gnS@r<y9,| %2'D۳gN'9!Kj&]u5HA%lް<ߒGVv6G`};]N"9OVTELޑL۪m[ TD``e_^oڿPU="|z.!Z?z_ze0<"3=s ߿2u5J㫣& ڕYR \Icg&mC\=ʊ |ŋ%#Y,u<6.h)FZj$h<81KsdMAa4&sO#W[fdLL9P*<>FOzWMBJH:a D.\t⌾Z'$1n$&U+hkjE;;%kh;;Un-['w9yZ8 C,` ?71 Qˢ sӣ긊ng<,]T[k\p_=gOg.ֱ/un *!ki7gW;YFI]Ĕɓv`;.]5Bsn8ٹV KHIW";[ص\ZQ=alfk1Y6lI Jϧowm؃WmatgqI.EZ| h|rSTBm;1uv *G `#!҂C"|jar̀ʀ/ߩن! XI g^HII! *^JJ%_dlY6Q͜3uH2O-"2?osu*&8$l4c̜9]Hx Q>J˅3[la…<ʱT;<DΟ?_9ɷ.})un sh N?-u8KH_èyOIqQhk2^$8!^bCk԰~*b6wݫUԧpnbKo{΄e[{rWcnoXi).) |Ι3'q_Y$֒dil ; U:ڪz0t!eseþ:@h'Lj®'K?@֓D@jB+Ќ;z^17ԋJҧ_O6JJQKtIc"_j2K?|?RL:!$3bLh^\.O&(/4j?, kn/p@K$3_0-1JjNWQGg [\U 5S/Yh/ %yk}s.lbDǠP0:(cìZ |r؈#8shB.(* :jf̚ɪ,Ӟ)8{7bR)T]㧳{~Su{8mB4q7HCg7q qRJ>Ay(<>l8#f;igAue^GlڭQ*fgqx;hr~_ui( Ehz{QAahQxz~W2|*"-[O* k"ã,Oާ43z(Oד%$NGkMz!tRƚۅS4ֵNJ!E/NV8bI(H~}./Q֓a2:~BD^#Ao F#D?XϲOW1:MKNW1ˌoצXgD" ި4_nq**Qg " $7\نYj^zX$IMք @K&K`j3 lQ)IeCiT磏>'/"ʱٳg+>VS9v]?P>5qRIMO%G)!ʠ$y?-h E;l4!ˏhg\bA?џsN~aaeϑuub0?ʷrjkZx|r:qiR';]"Mnbvw^#><,` ;¢j$1biuԤD^|٤>W0=/"_}/[8y{7Kzs(6M$9If^AS2ĚCQ2]M5L#|fNN']nEzę0Ȝrm.d ksp 0#Ε"X::4aq9zbvvЙMZCWN7(3X=7D7SJ5kJsoy\.E<y24In_GM^XZ1f%=C#ewbsD) `jkO??'517o{!Ɗ58ww84 {`vnE/dInmM<Ȭdvx nIe1CGCo珙@Vpͪ/quDPP8SC>i.'WH-ޅzQI"ǨZ,l٩'`ԡW U!(Qk>DK`)yGI$om+,^鮠qh=AK @/a) *WZ㉬î>J1b&oKEO>$e|Y׿53f`_3EPƪvtq]{ĈQ}Ϊ:qEĪ]466RYQEV2Rbp=(흝 (4dGIexYds8kVϔIl0=R3u8~KSF>_4 мxr(**kG[YKbjÇ]\Ǝ@Yi:W>w~:[;?@ܧӛk|f-I8l8:RnDs['VT v׳v' ckFjH#us%f[Ů[-Qb̚>s מȰC~*ej<‹}4Yăm&mTgO|DLf[*ݭ^ 'бsyY|B{ )C0zxNI''A_\7 {k<{7]3O+63&?yWLd\Ͼ27'G1w9C/fSSpӍC2_ƴ陬zg#jjxh-Ø wV!^3d F4>SLZoU-~Rf &[V8.uMGdIIφ,(HIXg {ZаqW[<} ̾x"2t)+;vJђuYo6; 5K {G3qd*ZHF8]$b;O}_}>^6$_r#j2Q?1iɻhϒWYNvYʐk.Ik;z3zYIy qo anV,Z^zuSIs?}{헡kZǽ?{TcrǙD_!?|>x; KyW`-ѧz6?Ã/tfgH9K( cԍtӷ?}-Q?:(⿣NL*-M*CPʠo]TR+{nӹ馛ڹ_)B ц5Uܾ e])H#3gLS5'?ZǼycJvTq差i'Lo$7~9NR/Ljz"jhǢ~F2Lj};_ʌy}MϦ }>9POqة?@*bL^][I\&-sᥣxEr-碒~xsԑlba?/m`ܸt+?5Vn.~ܐ.6@'m-ݨz,~^}]lZtGSOӖwtΚWBU_W3[.]u&ӦEVæV 6sc`LQV:506]ljA:b rɊYŎxocGa:SKظ(I/o,ۇnO}dફFoS;knG#b^jݟQ#릦IYxB.8x+s*[``Lґܙk6m |N滯i<&"a=ھ(czBX#ȗ⡌/ ]E@/?Sɸ3gWLguT71t|kGGBUј]zmhdnU 2g2a|neK8+xwbt]Xg[<ğq]q=տᯇG[l$J'røMeu-gtYv{gwH&f~(2Gj&2cd"*KD!-W_8b$m<&:"?6DE4FyaK% ph|Y&h(eC|ٴi4?T( *O߻w/oR__9璟ƽy?bI#ΤC8Z8t1;W4jb۪f]=\yŕN>jb/i a#֩چqdU+V {W'u b Q$AkP\*mDGs+L:ikk5YE61d|fuXg`P9nKɯ@menIIC#ǥXk FirE47{9z05~jmA{88n;R2شy'VK"z<+/žuvDToAnNԡ>]̺8b({nV| 1a-ܐTQѠ/!B|5ru)8oulfV-ĤTð:[9:}[뮁+骶2jh6aⓦ!1 iKH0V!if?[Y%gp{99O+7HΐbvpYi:ţ&yzּ~lTs0N{4;`(&b6* 2yKLZggvoJ`4I4Uװx gc8m-J+))qI)T6>`=^~Lͣ|O]bM<)jwơſu5ej~$PP4!Aɾ y5>heQ79JX%+^Ǝ{ qIH؈`y녎}~=y@P}R|"E{!^sCOeH=ikhǩJay&wO'Ф6=wgĐ2.!$Ռ)e5Kd *=&GрEGl7k,r;?(5Z*7QE+0$/`~' Eϩ GLZ6 }WϢѹ\}R>*l>t:{elA틍U> LaL;ˎ`!v ^WHb#%@?8iI[RK lgf?`޼yJ}UBF[:j^yy?Q.CLxu7 t펷Ij~al۵wp5H(b->'SR6uW`l`@!m'ֹMApLΘ27@RN1bu+ZUNRkP-ƾF*J餉+QBٶ5F`Pa#HOMn!@X2i<- JTfN*/~W IL.nj/hmç֓NDKk -b<&>.돁CF(T^Y kX[Au+&9945Ayl߾,.`J|lhlX,f}w}%Ksm.f\o9J kh_PzGe,).?iGR־a=l:~agm=iVb{/ &d JK}i }HM=MZ& g=m^9Y=-{C*d^o_[0GuGl(ހ8x09/{bS#֬7!IAF$Xx%ÂwgT,쉙l}w1Vms-igAٺĩa 0|̞t[T`噅M-̅CtmGO\x =_ ϗ1 zLNѨ> FǨz}5'LC:Y0a (laGϯd<7ğ0g`";/@KDrx'/g׎CyV ZxZΦ'@?$]'*+,{ v5GxWHObxSb*i2KQ9zG.?H3)Jֱjm6R9{ i;XVF)$v 6ߧm`!)p%G61;iniaw$4Ji h(r H~osΣ"8ĢLcCr&Hn u$f^KըNeUH1_^> C?#,ZH9VPPܹsmW)2FjRp8< z9IIIL4I"@ɡl69s?F͌-^m0+]ݝ,q䤥xo+"C, Gľ*JKs+ )L}rIE9>ͣGk[+jI`29L y$f\ y^~)23o*bh8AyI4I.65 菎Ns)*,Rn!knJckYhAG*S&E=Gz% C[{(0'.k! '%75Q\R[VK0NU-;ѝƐv89\K"y8:S|p7+VI[A]Ӊũh;)}Xqrh sw/%D]STӊQ񹨮6RYu*]ST~R㝗43q$~t^PHW:ƍbr.oO5G ̌ sP Bjl?Ȏ58O]k*h=vRΤ<&;& SɊM'F[ϸc9u46e8;Hv3xCL%BZ{#Mheb?C.鎺+xC ]>:3^1rf0D/$cX7 eo}D=fzԋ:XDhժlR_Ds!״usdVe98@ccf+ ӼK\NmE ^ɯIV% F*>mGq#7>HDD?0yq6F7p:ϝIlxVǖ7b/.sFh!z"=2L=_O>z-.L Զ͹Su<*5b0m)fd<-ͧ4<ذ~=7mN8vQvr٠2t)N<GlObա6åV9,c(<&[lQ3nSiѦm6-[G:tH9&k>l;$XCJy6ICC#L10nDME]ĸq\C*F^Bzv|'%3y}uۻ^v6SElJGGSt~;lg vW3n4El|0ǏudP{`[)//dx\bW8xgB83K~f;s? bdgGWMcbI¡n㓕c ƝeS"PTb%$')A]]x.Abr _Sv#YU5'#'kŠL2 {Vc͊kIH4MA 1y(شa?tڣuf{%3zH<-uǎ$7/C1Fc>F/Ry7D4¯ P"i"qv*l~dФ;hpCF܄l]nn\EàVI˃N?-JZ]Ozi :gTdˎ>w(?^0)&!Ylbyq4ccby\^x{N4AmMTFnܮW)j!U4{|vki좳Mř߽nR-&M{k!b5Ov ٘SDNԺJHiC頁l\`JQ]@K)VCݶۭwuwm "mS(Vn̝3@{\&Ls󽟽} [@5IyNV8mvhkkںbVbkX bks}W&c5jާF lVYj`Xd-}&LvR Ks4J6S.'{ ^D*v<0 3b™t x ^2djcV[p*F)Q _}+e:y8 2a|fXelюH/-˥%5OԱ5E0_:\0McRb=03bb#xԂk'k@vyY%PIJy ,l{=^TTZNBN?g D2#PI4fҥK9%nJ?px*.<>]Pox^*ΑR\f7h+~ ߋ_"=bX?\(;&{"Qt-}aZqh~-ښ2l[s' _7dϻ5ؿ{>Fs坮 6[K}nɑ1X5.fteوVv3ٱZ֪2̹o®-k݂ˈEtf׻fcmѨѓws?.l ZR K6QM&<[4cf^<UnʱΫtZ-m/؝L5m:Λǽąe39\~;q66z8- }O!+rQqEȀ{QMM(Be?&xo4#&Ε-vvJ̼f ./ꚡ?Cl 6'ɪǕ\H6m:朒.r )=f}a@Q+?)sRŷϹyDoxQt(Lٳo~i1? gwIBC4#Cxn6a-3ƞ;ji8{t \z{ &Ǣ(o;SAx 蓞niHg9f¹B*?aF:_lܴJ*v*N;nw *3ݰ?$2z :STi<]j2.LÔ,A[Srg`|r~GҡmmOd)} Vv#DEr2ߛub; D洵UD-P[C5v-X}4>MЁ.'5 o.Ib &OcG€}xe(y.p mQ`ZYbY-]+I_|e]+ FѰ2 no=!sm'^{"D ֢ qÑ+aXQB:.CoЕZWdyɞ5#5pwjh̞=;y8P,Ŧ͔P Ϙ1C^^1 ;NJkagRծbw]SW:mޏdd&je_Q(,F1LLJVGLb6qkz#cek=3L54T¬L<0%bto5甓1Ͽ,k͞`KvV{%{zlmps)9v;v@zfTt?fhL 9fǶ!,,=wH:YӪy ]&#j21}\`~IЩr3 s?vY}X/$(mWq@iwX{:?$%1V09He) ~]!d'CAO^ak}LO*xb)=y/6YE;,\S(}!2H۪Q.tN{/'k09հiQ[[)#TAޱcya󫯾wI@* lFAϬf79 'EݗT OO]nZלG ƽ(=%=H@s)g":!̘W@(, F6ŏ"H^"ɣ/ 統<{A J#<w΅f0sCxMq(ڀ?yS)S8(DyZk#g~!3ISJx75;;[2IǴzj*ԧo_D$$sͨ(2N":uMD&`t7 eЄVc֯[Z#232Q4d{W_}e֯CTBRR7z+4 `*&6{\JP'4 '""^㪚z^VKvn̜k5s);Q 'hpA(uHBY1ۀC %) ?wTi)IL;AMQt4f Z[",VjؚYE220Fkk ˋVgk2X[u[v#-W+.-GjjJEVNbb:o4N3ZJ)YNR_!.Fv[uNlcؼy} U邓8ҨE۹+<օki U00d050`W &>_99ndr'+h Y9xzvK*8kڑ KרUbʝPegK 6!H!p I}PK>{qhR+@>^-kR֤,% ũkS*< t )x.rA'PA /r*Fy!2qd&Ur| >cD{nƠHI` BÀ Uv@ہ^?rQkt6n4d]J-1y ӕ®42up+\eQǎڝӣgUby9y)e&`..L6M;ݳB;s}hmm޽{K/6I7ǏM7č퍤cM| 7܀;ο /E[ް:v2})wOKf(-ukV1EyXߗ)P![/k**˲u0L vȮ+C%nX:y}zaon`))0[q#齬z;GK+p۶E]u fw<!Ij(Bپt(A^gl~]­_)һe 귍BTLq'5p =NIE]%)zW%K!uϛz\;o/nZ&' XI\N9wu{wN Ў+'#yi09H}޹(NR˛ S(s|obùg)3gJSA^9sG_ݑR\oHKK-,R(|@/qĽ(xr`(zr@`b0@)O䙔 S~үkoA]݇AC]ef) `b ai-Ѱ:42`ZY_ɗiGScL-&RmeՄ6{Mv7mVTW u1ŀ}CEZ4*4&Q0hxvnہמz -5W\ g\=d|HFʯ$F_~}q-p9h1sCm7mߧgh(NmzC2.XS*xaa|@ZԷA鰣f6g؋?Ge6{ۑjd;g3x2ޙX+¡{T]Kj2f!ƚcʌ.lk2 zdvKš`imCrBLCKsԩ T ܔ?_1k ki9J pbӢU0))d*W>&;"+_pSmPD'kbݴSrI OnH~գN$sDtyQqB,4>9Cʫ+WDqq1! D!A#y#i,[s.I9G'><$R#< /Ja>qq< UP;rO;0sI `˭F vE琺o:߅+o\|"-<1WWa+u;|g K 7\7K.ytOojgy2j(M Z8p''_~OFܹ=\ܱPihɗJ B HF\r j?CiNdl,NW]Y]Sq]T*Y0[mL놞6D&ꛯECnhmal OJ'93غo@!Bf0rXk]S2 joC$AUsF(!OEUe% NKG~nz`gv2k aP)+}yd\l&N չ9=4hÁ%Wn+lvLf@qݵEBpCH㹫'_}>,JwzAoz z.fW`wqmqXP[ElqpNN)BMl l1ŀ,FX xg&I#;V [Yŋ3 ({Rf&STpI@&u !YfC[YYxIѿk$B}RYa ?O=zJ8. f1;QN b;ڧ+I(:g{]%2#Quš !K`3L_UaX[WfT M+ :z壨p0 \vZC5s=5]l*lعCz?3(bP h` pP WqRf4Ἡbq=֬ŽsňF4Й8E ϟ% t?\p/.;%2蘨E#isB3'ϣJ>F;wtj8yJ00!~ fjĘ1áËEtރo4rzdT!#_r_CzݫY=t@M B- n!orĹ\z<Dl.*/P!kT?n #N5@IP91:suR0>^)б:Cgp<9i SqBܔ Iz̕"OxMs4nf]s=A_+f%SUR-[xCP_=."9%?퓇@O5<ۿs yްiGr<^I LJpfyW[1c,Qf/J+el?w<14Q ׸s_P}C¿+->/yG@P!Ԩ`QiI|s`wtU֯߀M6bΝyX2r(&͘|ޞ}EtxbSA>GR$ 5k8$oР.1B&rA 2h @OF;6Wt挒1#Ƚz)ʣܻtR¤)>L^Ȍퟂ6sa2p0(ݸØ`ulf*ukA3iǎᰚwfam0Vdg Pj4VWA4ڽ }< FzȡOFdd(jjǻ77#Am*O+(zъ[qKFKCJ5]x vŏڠ݉7sc1Ee]31Ძ1C4@Z%Ĩ v`m5")Rpu.zf bkz:)y},>H~BxHdr}E r9xD29C &I(A< DgsuR&+P彉t CGrs%zL}')ǎr͚i-ȳF!:RNii)TB> 4|衇"@),NGIRVi#E>x85hPTTƑ -ot﷨IʓQ~ㄸp-ILz둄7Pd\>kB ܑ:T kV>*m zpGς^J|4R>(WG}⾵KK]pDVPёƀ JTF1# ][7o %M]E0x-Ŀy7||I a䵣'qXJל*Do$OJݠ<^JӠT9ZkF_=PsG,Ys5)wbʉZZlN -8pBxh2,*Ξ[5_Wl >#շ_c+űGWkBh}\(1 q&AA62=j6(Xh!r#6%Ns 2q:=1UPG عc >|=S(HT`¹PD"*1 5U%YW#)JwyQUV Mt_L+ ׾v+zZ٩øiש$WϋB\ Zkss [3Xyt6*Gx9s¯5$'Ǒsu,'\l} r==y9GIgVJ^6 u"" ʗӂByi"*!$B!3IykI-Hѓr{( 2.>(~t~[!4ުq[&;8b( ) ܩ00@֡Q㔞p+ioM?_,AHPH6Zk{)GoRFkR).xaɫd҆V爺BqQh|+k2~m ^%o}vn JQӦM!= 6qxWȐ0鵰7rnaJ/zG(iw]4<twhi1bVrR^A{Pm1{kj-y"@ QtJΟB_G{ܿ Ka"Xݧ[gCdPD蝗d  6y#inQmUUUm"%-{գ LA,ݛV1e𱣱u&VhPBRz6tl]L$c\ A8v<;zE`|`T>TGFQqn{C͌p=ҳ5;VA{%M(5=D8lDd{wC]ҐÊPQ](+C i)ɨ-7.줖g}N[J>j YXtT̜,XLV8erfEAJ͔5DOc #?)3M-qKr^M*x1G0j8Իaw}'4zֈkbŢ=[{"DG XD+L.K`yJQps~a9B W,yʠ*ak zuɻ RTQ_=SdKh R*\t)O>M''A'zV_ZF:R@.?;ćo^󮟁+?^}UfT;xGF⋹A8 'Oܹs|'o=ILPu6y䩸tth?/D7AHnhQy nE+=GIIܐ\e 0D:_QC-p)(.c0( 8vĈ≓%>(鹣':'ﹱpy}^/_nC|Lswq5Ku_'j5:?(n1l9妑3cBt*x:dߙ1Z=␡ѡ.932u^t=TWGt؋')GMīС|J4 [24J xwp@7o~X8K=j aYtІXJhGLU"ь-vÞ =TۀV y-M,Uڅe:AÂrt_N-+N ,ڈ`Vc]rR ~ܿ%y$WӾ C%Ӽgw:IABz9|g¢6T& 0S'| O|,F"(QEq U"JzK},ywwᅥ|f2{NÌSI! B=zZcu[%+QjԢhVzba.f2PhsW"!Fj62`f;J|=' dg@#>1+$f(X2(!iS>&;u3h=HUjQy**?@>3(%㖛=C!y}&F~=HNm#'N@_(Xdev{KWی, 7:wGfEԦ5"<=$=۷w?NQ;tϹ]s uu0Y(Z ΍CXe;Jl}l2"%5j&:凷!* rzM1qHc8x &VcfdFJWFV^tOgkB%Ha#))R,Qǜ?6b ]FBR,cɏˑ<eu!* G~{* 8*7; cJ>)H@4U rDV,MŬ٣eC}]3lwGjlX>!݇PGʀdtT8V3 ] +^*9 ? 4V wGlfGv3Nw ظ'h*(rGEM#~X߁}b !c&!(R (Rq]ӷ/̵嘷`-.p<E Ǟ19;0㷡 9}ǁ= Go!sf }{ecIѿW., )S<(m;܈o} k` 8^\5%ZP{O_9^rk=>]añvml%ބؐyط}7 rܴ+ͣ.YR~8:'ê|!Փ8(~)zdOT9N vC4΄UX8ly}/;Fĕ%CY+5އmVXU$KUqe#F;P:IVZŁ(Qȩe@2I}=qIzw9&L&[cb`h.hCG0qʹc!({TJUJ?+1 afъڬ6(uPFEŠOWggwE62r`/f` 8ދUVץ!4< `6/S.Ĉ)#S+Ǎs!񒞬§[|9םAϘe.}7%^z2nqoI|f4xj C&aqѨ;v ҊP4z,@iY*CІx 6ᬂI~5J 2j 1_Yֆ:E!196ػ##/N9mHPêcs-򞨫,-<z !DI]*91-+~[MVfh1@".+E~ltv1 )lQ0̽͵FVDNN:2׫mxZQ qhk@RZ*oN;o0X4GeXѩMBhaب{ؙhRO P9'JfILᝏcps8Z[aЃ '`؇s YW_`UfPJN 4\3le`@ODxD/uHmcdюT$'+6*D_י@$S4 TفAj/G3 DJr&U~'<7Rh-8ȉMuaQ# p週soXgO?A#僺о-Zė)uP!=5Z&ロ{YIP:g[DM&]P FI-C;_TA hD`yN^d>q.3vlف[w`޽ozb(X6gOGX|t=bx쮇qu7wø!/GufPS/uAU9pD5ұwT:t} Ro#RwHRO('Z'N2']H(N<euN6T#++D[+mSQU$'532sbȞ]*zdnQkZjwɱл_!ZLń3/"[sF6\[PԔ΃:ьcːi(vvXM=QgoG[.L#y/"Q}jzU5Cͨ9F"[03ԌTvM{U|ߌ:1Ŕ$ %{*@3'W|F Ǖ:! ?d=9݀<ч)d\Ǘ*PNϮF^E$2V%e;pŕpˍG@d{ &bѣO)4M-)S: Lq tڨ;@C"MpR P($4= *e,6kl ) bOK[q?T8Jfcyp5uK/ļ>͆ފ;٢ݣ;g#\<, >ZD(X(:=+<6$mB4g?2O=Z 7o4r!QrKŷ\1`9=[ZVzg?T4WZX,Uj4aQp7a薟WԚZğbɓP W:P"k>&1+83'[X;bk}(~)40A@S6O@0P{{ p ?D/+G>9)P:,llVD# wW˿kZ;Sr)f^9ِ㿻|5:dާt|άNˑ3NV8UЈ1W^ecԱR3.axoۯʟr)ߑB'%yohP~ >Ü^@׮]5>+ `P!F O9tu}뭷%X"\ ޏb dKQCo_^6k~b0H߯TU 9l(;xK>^5?D4̜1DfN7*ܴ 5Zx='}= ݹ Hs[%~RhBc@jZ":76CU<;,MX8R+DMt4d⋹ׯYik@\B2,- CBr& _4Bk4Քb7eW!6*KJE-r3y]#֯{7o(ӆC2lގc}<q D 6#1O!5. yCfw!tRn=9*Yq(44pQM 7>ӌPji)!^1c f 60dϸc H U3x$ފP% .|UՁrܾbp_^9rv 9N W-N9@ȹ>Οʎ&cMQ4l8֯,{KC^E ᩘpN?o2T;ƿo{- qםPF+`>AA`RN<鞟 Df .ÇKZ$:3ɻJF6;B[{Hu6}! ŮyDZ|Lv=`wQ8bП TWam0Y\]q &EGhPӱ]-RMط{/!(.8VrdqzvY(Dy *mհgc93!ضq3w^6[?ˁSTF44Q,yy ?MHD'Ӄh[&zgND.NhbbE ѠGR%w0h d4y^ϔj## {ľ:7O,'|rIdD7uN{9ޞRyqy >9/IQ!^Jsh7zх A|P3){)F(/7X@QC%C m&$Q1 ?B4Bč٭[7?/)|B?8<;J^+6^''Y|,ߋ<;߇Ĉ.]!ʩD*~qJ.u.m ~1.!{E\ͯ]?pP!9àS'ќ^mܡȸ( =CGǞƳo˦bm㓗?Wq7scee%/zAH2,(G.!ԉ?ϛ+J󋌝@nW4@{t?%;"V@ű=:b0RVFp5+ng3#&o8rGXtf]~"5P8?2(INCtl*JdKẌ洦*hCЯh5nP~$9g7lfnCft*i@MC# #eÁÕ,V? kìˮ F$e}WڠIAR³d+RNg. U7G=$9%{ ]NLkz$L ˹8WNDvrGI:#OIgY+]%.d4PN Qt$y)NAk,AG-/@eY9jkjܐmv~M(?niwK_o`uR{iJU=*+6sυ]&O56 %;7l Х %ם={6XDҾ$ l yyCkU)!Yh5 lBI60ҒXS|KF߀' z;pp7z7Tsd=ޅ` QĔV؋$ 9n7ccB;fJ']}G==^&%Ȕ$/ =NIi'"c<.1M+N\sEɡrR(O. 9r8g\_S1dr8r$D2(a'/;V:l\=9:SbqcaUCy,"\>k?[gzYYok$ z w*˫ v*݅b(?V6F)~,qqHIHe+IIHBsJE4j%w"&J PTuUjkP(8AdH}{`@A2JЌl|9o!>f.{]41E/q#"菙3fr/DxN[BҼt#Fp6%gsQ)a1I p r{B\_ffð} 7.B~qefwA ;E0y=''-C(zE8(RxԭlrB'上^'$D\ syvr+ )tB>FzkVj ]'+D!܋=9AFnp`rkvq*gz:!20R/VC-^D)Ԛ nbw<9\W}<&' uXojz@*Q[l14ԡ`JvƑG0YAR|"ν|uGQmo{M6=!!B "(S؞ g}<{ϊ S{H/;M@"s ;;wv=;2 %.Ft0Y\\0e.l2OeyFe'_ODB/ŀݐ2T"-HAQ] ی5|ø=|-F+7nܾs;֯[\ʩ&^y! fz ?0{.<<4k@%-.haB% d(Y$)BnB٠g'r>PG~}CK6|)|_=CڱcG^OZ5 քDTArP/Ybز d8*Tض}'ɈܶesXn,(rHӆ{!5ZxLK3A]Ђ=^4IϬV#F4lB$r@XMlF jRE`SQD#.w|귴3D\}څon'~&x|Gv?'KIlߏ,G*[H;/u|ԩSylfUU5'`xǍVskbj"ӓ΁P7pds1ڃPﮏdH{ާxs:~x!UĦϱo^uEF !"z @K|wMM}V P+d1ZⴁPuA%_KxY|c&ÕNE}c=zQ~ߔeM *}H)j۪U+x:?KrWYgk5F Ĕ4@ܻxZGF4tڷCy0(-)ENf&|}X) F_;0I2ryN1u".I Tb,ѰgƣVoNk%?B()TpD6w(AXXPi1B&TʽXj$¨ip8YƺD[slVHQ Q":]<&TiB']ȡn)]t.rol;ҁ2cEk|V8$"8HiLDUۉ%0㶣dRUh$!`I1O!BɺII7}IcI]N'y+pdoθm"?k^-| GRj* fu5rW4:tB}ӌūS)={IM |*\8e2yQ&-uDˮ-FS^c3˧`z>} M$N,p8KEiJaHJ-x--}tǎ;aK4ށ;bêQžHAB'%Ɇ];@Elc8}b{s (H|\q$#kKsX G}>!8uZd̑:6Xlk6`& HC$U(cS VGCrk~v@8$Ķ MEkB4y*Hv]P 25q~`ܣ*n;[@vSe~~U=I}:dm8dqM2 ``X:zrAf~Sv YϾEݡj\|)0H"yqrˢ\U,WjlXt9ҫ46aHj<(?O:Woc5l4lY'u$eݹ3õS@M@D0N r…+RZ>9QB@R *?qzXr,H6H%*jb\fҹb+mtNDwx5X; #'$$XR4)ҿV,{VaH8Ao`Ϸlb4"QjjTU!i|SWY>κ`e.{zRvlمy†'&a"HG:ߝҋI8RF#8ʫ>j~Sh# $0`'ƅGY>v2*)٨cۅۣ = _@M,pIHD;|?I1py^6a<|Gj@ u />#[aWc[;p̫χ֬;ݯ: (]@lw,ցڡYD]IGvM&n5خَ*ui6Ms{*jqm肈dZ&-GP wN I x^a?筯 Sž{񷇮A55*:#ޙ o:W͂5y*Փ2n4d[38um7b+0lpK(L-D%xE)y/w 5hSTRP#+Hs[.c˪FqeGYs  CW0Nބ.P:;o6z),X[Hyf?Y!iKMMC9ⰤM$SI.t&>B}0C=&lEj: (0d}I I[#gM:EJN;&aT{`bCCͦ'EIZZ&&]4#[`0ap3hKBЁLiв 72q9Zb+-[fG^hj`MA{R(R L{O{IlM Z۴pTgoi7v}#7vR=ՂA7aʔKMʖ>Ձ%%HV,̃·,X͟DϿ [΃ဠZuk6ݺBdZ¿Wq9sg\tt.щBrWr0cVXQ#<ҬD۸OM{ɖ$<ܳ;j5,~GU#JV{/EYMdhoTLj4^Ht.yyO"wA vWn5[0OJfNuܱ۔RBY4" 12QikK=I;P]ydEh&ĉJt]K {pP;as'`- W\u Z\.$-F :^-rèfBSG'v O٠EVF&SRln aؒu5 ?B 5!X*l wLEPjױg[,oP)RqM7q*6A`q~jԖ;B~m[ݯm'Oz!و#9 =9? 9xr-} DD~xїa@\/oM@"??豖9spky69 1 \r%ի'OMtP-TdMK0_J/heTZŢ6`phHQ;BoMAJr&RZ,[\t5MGC ?E_sc$GTPBRPTT3 \B(pJS4c?'՜@M4H^DNq Pf Рc`)!W~N}F{J_6d+U6HI܂ ZX Oנ>:q4qvyؐY)3}]/l0x0~_kL>3vHv 7ŇW៳$|箹9{'@}p ~ =th3fDdTؾ}~)l.Bo/_qjgtQhvG<[og!Ht.]Iə\.~^DR]aÆ09s Z l}|(OQ$dհ%:' 5+ڿ:B2Xhz8fJnR J)Pj3M"IHwR&gh,:bA @J=z.% T$&`5P^rQDhT^tmuƚ9Kӟ#OGʱXТ5R8PSan|g:m܌6-aXt9.FṠƀc>ܖp .i&mRґ,Z`?%W##nr%^_Ax ܬi-g%S?mez(W;|`W`Y!^VX3ⓒ|(yo3p#GxgC .N$kp1pqPaPRKO9s1pp 'ON-aTMz$r|WNcnDOu(;qz.$ { }9СK_\;Z 鹭PЂDz2TUa3ŶKR  GUOu@`r!x>g@ n V3 @u@`}Z+ǟBKZlKgFV.?*0k5h٢%VZ-[8daȅkKG^p{]HNf2O[ b4G8aoR[8$KiDn;j;bϢXCgoĻ 6ᗂd杆k͸` YՔT͞C71;p-Po8ʱ2 glnt,4ak{>Eft{`Op[ς&LligJÞ _&5+A曢@;$={p+̙3 3T4Ǎ3lj=bFRT"]7YgO -Gڥ=(?ETݩf,ܪ O49h0M %mUawO2_PJ Z. X)9wVfԹ8(,*A GEZtjnFš#X2߰dN@z̼e4TgG_pwC.3&?! Zm!ڢо[sϻ'YD6kQW_oWy桬_PP'r63X" EgE8 ]سFm]Tl/J˪" fXRP [PcGŤA.=ܸW.?zE ՟J/S Q-B>&dN|饗py蛫_h-Y&_XdU[ᲀk>Dh7W_}-{(RJ#J XJ^OVTr~9.o;~zL 0@a _|"6\KR"t0n'`4O]쎧缆zj<1pzfxyC/==;_һaA$NY$AWUgU ~ڐ\3XtXYc턱>&nu~R\}@c=?u%r U n/]MB~c7^2U`蠑ҿ38 gC?#CBwy'D~O(Qe Ԕt8]~2cjϿ (qU|`?^;01tY-2Wlg`KSB?eʜL3A҄̕G֒_G~c%rAQ t(V$I{+OJ{ ,)y]XTrgnRBexBnQEZ{ WA.Rd [ӟ%=611ၷn:w-O * IbW}n'&쀭_Baz(_[aȁбO{?Xr4ha+C1cEWa/J]8i} J)h=: Z㣏bܽMBzJuR5m۞t "|dy+ljٚNEQԵ2mp(c&$f1$+_kLVԟGD p]mL:oK/Jnm)X4-pL[9nxF.ՠEa}(3PbHgifIL%/**h4M"V]s*εH: j;? Q8A=pc}q(Gv ) 0$`J0Z쒏.ƨE3DTխ&QTyOj:vAcp580,\ehJlp@{{ކcK_- [ƥ>G*ӋjwT$~ٕ(b{E>{~ZSGxT?{GސaM\dc mP<]j]a%UU/x06mƏ# TB]5B_!zy s[TWg[_#ƞǟeW͉ >J&SՆzAߐYдAL.Ĥ5Վ +clGJQ*l࿎R 0m喥יYԦ>]!Ogn $Ѩ ;T/[%Dc-;G݁*xk]GcirV_nTkT|Ox:;7=o[`v!g4Werˠ5婃3.,v%aU>u8k Xꇩj:auBOZ8ez7:PrrTqm(Gz{*`XD]VJZjND=j\t~;d$nf$&&r# oE< 5Cio_ϿZwHJK鷊*4F$1/qѿ{_I/G>:(~ `gUz1%MnJdK U? pSQYaQKZh-GJX3m0hٹQmr# 2aWе#M3LS;6HZS/[-9)4 -]{9лU (zbD1P~A٨pxŞ#*kpNNN5L۷vr* Hޙuܸ= m"_& \L͟:6|Yرm֍p7 k;آl#8\3ΜpR,*F$`E[Qb!+ƪG*x-ZUeĶ(VѵCoRO !JuzF``Q%p0%t*UoS),E"-Zd@ǀC>Z;Zgc?5#8V25[M{j/F^vpʼnBg0G6Mf v؎}? Qƫ+b0T#m +-~nbь1#qƈ\LgQ5-C ԍBC(N5B`hsm7 YA1\|4w. ۷bO 9 E~%Lu^1'={"=3Z&M_=e尲ŷVo-zҍߕ6Hn$k;0"33@㊋HNҡxc *Vk?*[Fk۠o;+bŨtk>#Um7ny tmʜ q__3˽?#*y1₮ƫbӋ.|aJ.WQ" ɗ^}߿];HLÞ%qd7¤}^"@`d* AX?[֯}1srbMDUBVA ga 4ob}Oü7nO(2R. .aY0sWAcgcp=v9 )$ dYa<>63 IBntׅ<ꈯ :@t꣈"ѢӲ$_9kb lNDNj6H}4  u:v#o< iEyzz:dPVo=- 9) S̨]^UhV/YX6 Vj/qAlHDdoAthppd[%|))QVB /^X;o#&\5ju6QiPBFT" 7ar{# ^9'; >_>vڶF<$ Pb) ohaWՅh۹{v@-~)|bdO_l|SΥ"{1nl2lEG`2=o:x=/Q飼 )gae^™>(E#^̞5_qxoGyfܵ\?} Vlj:>l B)`7i~=nkl2Ygq9[~W2B6|~g(v*=33>ޭBC3Fw/MX=V}8XGtc룼(_>6Q0gxu>Y.u*P*ljnU+xj,ZxQHyf]S~m\ш]^)j=_{9y/.68wB'Xv蒨G] bOvic@f (Ŏ.TMOۿ$mStjV`{v8{l>PoOlĂ.|&.i[GzHe_*9Ej@@" P&$$Z ,+7?)9Xbm2j^ndZH_BFYgVfJ@=xE@(` bs_W6b`tT7 ^z (FEI6͞9׾j6:m Ԣϝѩb^ẋni,d@Qv7rqoPSWn"5~ON$+K~QR%IE]+GIbR2 QYۀ* ) kUض=ҭ?}\Xa3[LFT(hy7KD spMc{>V1WS G=.-AE#{ Lˋv=L}EۄM<)yo!cVaD|Z&tj3Rp6 s(V m.> YiF6 <;x #` lpD#tC +{_9ŒCeطl?v+:W\%Wbòzdpf ĩHY9{T gVN-oQ,ɴx E~?|!fZ$Ui-Z"SS!Na,UVqts(fOP`} TQ}-7]SϾzјs z<-0>x.[J GH uí¤FAp,iڊ1?8͋ŝ(}*(R %YP:NSR0l,]+, ~kA ł*:x,h5p{`/AZ^^\_dcAc،IDiпygvl5yhwu\w݉kY [vԽ1QqE70oPal+XֻV;ߝRhY'(F`SlLt,-h`Hj;ѥkd &129;mFYyl6e\>,\vyI;pC2aZēA)qa(@c+~F))|"Ҳ);CJ98!~tЩDB%)x =À6A W:m^]*.=D]8"QF&e>FJ/^(U2`9EPJ`6ͼ Kr{S>miXر~;Yj)-8Lk` sǠC`3gpqreTp6F22fA S*N?[v?\Dd`ܓA=|wN9 Du{^Ċ?E\u`tT %b''@1^E~k^7\Dyn5>t*f}lxF,HeQY iNGmY!r!UqU6BXqhtB FQ}i1)JTA;5cctAa5|WvԢ^{L$ʱ}7EU8Gyah࢙Ow N_\n*E1dTHާECF8\rߩL3,8R~ѫ^s*g9E3 ==o5UppԫlSO>x9ٓ]9A>'}ʓ+K(THxmUsMLy >1@9(Bؾ*ȩ(&TJ@RK}<>h_c6y42rK6hDw8ka^VVJD6W:D_#;*}Pms.,@ p$qe _(|E/XlU"5&T7cʞP?%xE,*;f ,'u}6Dv=pi Pnd㘍]teC/nyR3[@nm,Ae%[ GDJL!ܣCA3Kb(P!"9%OI 6*(RTA%[n{C>6ZCa6ꏗAp 06U69h1|S]x*'^BV"NުxcmcRt"lIر)O.EȊ(rJMcC*%8Y*va-xp!3% kؿZ'XVa#;kLj8zSI֎RĖw *rJu}s |Kuc\cN;>ƸM MQcZfK>NQhpI }4&S[w%;!8101>D’UK.3g/GPO3% =UQ "Gq{+€ƷؒgJT]Cذz={Mt{nA$Zv`1@J$ #qyЉp7*!<ϜbF?{51O_G9(16==JJъڸE, !kg6H?NSa$ '˖"!рf'I0 le6⧻;Q__Z444p"d" B3X]0$ %PlXJJ ӵkB)(ȩ *i,и!0)Y$)qti^=y&7`ExoXmЪ+:3\#Hс w(6b-{E* ?*=ODd\E EPYܟsK$׈Gw4pu.YT1n CuHnQd,@sq'8{d4:>zz 8A+'%3d# pJ͟arOFJG8S" PSصcjjzm>N놄4<7s`be]}Ź 1/DhDRJdK dI:rщ񓇚ѹԡ}9!(ۇcԵɊpJMQlD8j0sտF KօM~dx"<( W-O> <)'PNJY"L"D, t}RIK #e""2B'DcDzOzhk۾-JĮų{FTq"『7 qURtOVS`4b (-5(Ƣ*(cesM tqT[cw<[?YZ$A mF]owQ sQ!jdff|A}25k- =-Ht<ɧ@IiВrw7ط?.cÆ}z}ytc} cG0,;}is]O?,֭څ]Ϩe˃}#JI{FO?Wm q!2kKМsv؆ zO2x^ؖ_TL:?xł1̤N D{u#L0x{g$X%ǟD2ͦ1J9th.U #`3yr}y0磠%ZVW|ͺu;gJ P[lG/`tΎ C}f@Ɏs:]c[?mXC8 ~ ^=) ٵTTA=|1ppұcΝw򚿺[X*&3N$ LN#JTuZ/@"#SJcCƹ|#n tB{Pؽ-vo݉ {Ъk!\u@?HcD\r#ȵZ =4aR*>Ѩ%4{rGE0K!]l#L#A2YQUƑW(Щ̨ku n?܅‚"B8Hմ`sɨkyJ6siЏISӠ,XD?d3zGLU?=]3+эq6oM(RH2ۓBDp(pyB`>a͵M>F8~b: -e؁0P;G#𧷻}TMwa2,g_Zi̐Xn;~L?&}_jT%Q$cJ21Nb ggg|Fmڥ ቆn:_(UUs*;ya!`z}6gKP5 wu+N?B|XT F˳:=nS>+"3 y('1Ŀ^aE-Ta_m%9h+*L+>pD_CFA"6N$Cjѳ=]:}SSʚ=S+C uxX@/x؆L͝Hv.@p΃n7dAhzpł:C xL)]'gT[Iqݴɨf_u %> ,PM,H>HQ2T1S關%px uxր nHC֝dXIzqo孜'sPt%)Ct0G:qKҮedUjUeĎuΤ[ByHOtŞ !cb 7NEBޅf|n7|7Ž+/50GgF4;>K:yOq>}yp" 9Bq|V \!{»툑KJ'ntP RVM~'!( kBD>&SȍfT.EYc!F}z8dՇcY<$OST?_$|WU"]%`&=2 ނ^_V IjoߖP͵-*G%#be\z)9xnLD t0|#TP•#5p6ȥ7S92 `V G맨lGBbTh1{%\/C,tor~[g"du4ϯ\>rDW߶0yY.*]Y-m BU+uCm\K)4ssFȷL_4$&6&bƨIt4)VS`a۴ӎ شa3Чfv"j:͠G?SX-?8~IX*L0rbB*61/A>`AV|r?m=_PMYhd.B$H;7Qo9<t̚^ Lwёk-RRm%= qgw ,%.9nh/ \ rs0KsG$KhȸLƞ6NWGm"'F2;5t`%0K"(Ԍaԙ)Vi*2,V ~Of1{Q,Uqsv3'4g7B1z9(Bs0墢[f, %"'JHUȯ8(R5f' aWQ Q ঀ/ǀ> ACȬQFv gb?D~!vzр 'nB`1 QzH^<3QS0u&C{*X6bJn.WԊ9DlxzIA!3{dfЩG8 1[F?LBnv^8Y}qٟDYvT8P>(|%gVY4l4'jh" ԇR[~085 :\zt$VPLpL 1 9 &;t?k,Umm:M,./^ ׹:˹G&o6i3P,; u:@'H_iI Z50 &4*0dt X+jIv*xrvdR)h:?d{r!є"31/fP%?Uy,K8ϊ^SdE%*+ڽZhIñ)|!>Ά!؏M?nƤa%d EϜ r5+sH14M^kBɐQI>Hڭ %EŅmnv2nSv aT\닼xPO)c'o ¤k'r1ts#q|9ۗn7?+YY:i |# ቒ!'JsIR[&5kq0C\^*GJ%<p8}4bՕu^^RYwD 4 hn7+\er>3VnY㋐'vDrƖada&qb̥^Qv4w̖%#ne)8}pP?/F|Y+8a+('eŒ-65qኂҤv%HIQ9!xBbvIJ_ł?ŧ?H ]!" '7/t]:[@"'UVae)Pd.h0SN.O>bppjy7WCn...0( e37-\}4^gE,pTLx1Db5.h.ff3eH:փ3xY:2G?>1b]uZE6d*xٸ[1;Q:Ն0]o?a~&_'*{V}دz\yi;80wA,Vǘ߳n$a-t*8SNHbWacg{S|$ P\/~(/-mtε˵g$!yPOe#[PW*#˅6j֫uE.B/X"mz_G Hd>k*-C @1L֥P|&j:9q~~n$LjqJ`d$M*O/\WȞ{{_b:ӎjxŤ Ug~^γI)֩qa"uRRUy|=u@DLC-6U CYΣS9m.zƉo$- wo0qCF[Q An+.|F:w$g DQva@$JBVͩ?KBV*?)bHbT]ZGwye5ڄUS\mRdڦN YKIPl&/_;簏&F2/yeQL1SL{A4CcHL}/P9[R@R<.ݮF|}26sn7uO%yr!H{ 0O(vpm/%Z"2Qw- ,UoKnPgbp tM- =Kp7F|To:F5'3-Dh`U;VL(v @Mh \[l5dlh*Z4;hG -O 25;CkOX<*F*5 xjj^}WbyL\s'"jxlpQ-[.\Κ]ޔ] t֝v\_8=,0(l%Wy9,)9Gc0ۥvb̩X 4&"~iIۀ $c7^Hb Cz}# s"h[!B(Hy5y&VcөTjU qFvI 5f|;”%k=Ӑ۹k68vux d0ϝ%%c:ōDG !.Epck% )Xq0̢Y~h _y2uU{]7(eftOC (oŘ T;:2"1)9B2R_8-AP dT~FBJ2=JR**>,Zj !d"FBHOl \4YGz).yT%3 ESoĥ}O[bJhᝰX"P0Łbfd߱> xS<$Wx&;1BZ*ʆK:f n*5lQz3~T){.T<'H&tbH[zrwU0w;K_r2+&Oq#fP>t5ˏr@{ǿY r:uZlA< a ux]J)eq U䵇K<ibBٖ~TA6]-E&Dl>qDيi/eq*s9U-߮,AJs{Nm*%iS^5b} O/HxtMd"Ľ aTH8 NT(4,5_mZiYSӁbYXt=p l}>su{ $ nsB-$Vu`} 2:0=l𞁴3솠nOr6M5TLSAM'6M>EX&I\c\Y#w%oѦc[zWG3 +zE(2nb|07_{^FG-iZ O8mukQ]V`uHa-rԻqhDUJ=EdlIA!Gmjj v?_Aw`낃X04Q1eH_'0kx>l"d}z'Q*Y@"z0^]1nCVn3jNA =N b{mnm_Nn&UzR"$m׻RW[τ%PBlS4΍Z OѮN&2 @'O@ɧ׀(͸4{J* 32n,!~Yd>;vQq\OspXe{ lIz؜]npEuZ19\G"Yr}فcrfB?ӕʬP"#}At֍(8:Ff̔26_t(۩R:5Svː̅)Zș\awdk.2bW+4 yXGjTdFD /5xI]"R҂9iFKw֝H NJJjV:,.H)*&dL#R4/n~߭cv>EẢE]Yq_LS|2UUU=sVvH) q Xw@[i{ c} -spE@ÃB,:DԪ#xCVXQfJ#R(2 9fzF Pd%jkKnҪoNef,RSRf>z4rJǠT/ao6s/ o*lt( uA{Vf|I!$uDiwAqP4<)#EO lT !<= 3@ <`uhU 3䝦ɃsA9ØD/dɶz(=/hr0u3#x;zBKVБ\ә$(2`*pLnLLR-- >êĪyސ8)LI).y{W~Q9(rmQɗf*xf2̍ ӲJ.jKnj ; b9դi_1ySjnH=̮@Y,YM;nLyuxNUeɏjb-*rt#ɲwvw_[")Mq{7t,`o \ם,&~{vѨԯ}ŷ/@}/heR;Ղwqkg.&~Vè! 6Bm9*@CMY4 ;  A7#C }pXoiCZ`gV99AIS"ZzI;z&݉Gϕf%@R~`&C@2[;H@/1tK5;cj^H'Elg~|sGaF,ƬQ gE ,շdQUGr#EV(/U4{1ƴiG)>hy<P'A g)'XoqL5t Pn2}0O9M0rzY%~Ҿ*lLf{w;:레zR('L7"Nxn$xawގe9Vl?9Z/mjEU9~Ǘ^yV% &(ANܺ2S[\hmy7ˊ*#D-%5iSA~;e:n.^ s먊 c)6T",$ѽyC|g\7lYM`!Ir$3j9 5!Rlj*ǥA$aШޚw2F*+r'Ѱ12#6:4 > Ki'#ɳtayV>ԉ{i1: LUn`usNݧԇgv5E2IuGȶJ_bB}Hw^*J]dp+ :$Wc/O6^~ Pnp|Z0oE'Jr}ʼxOw(hv1c%ИTүk𞖿D2 4ao)ZL| 3ϒ_T^zoу ^. ۶%^߹<+{_7IƤH3ahZV.4&vT-<;.̈ya+1Ÿ3;ͷD"zCI a`IH8" I2?4~/g 㮷|_2lLd0^OM5VZ)b]k,pp}`P큸+8ggO6Uظ5~)&vq[P { OAgZpZQPiJ)/pwrڜwĹm&`e9o|ձKHƺ u93z{bI r+8D+Fy ؕo jRaFDTV'BU1u@o#AJ]FGt9HG;v 6X=ruApWSle4k չ1uLj? RYaY%Gm䂞Wa>.BG3m]M B48b7gE14e4nGVDP-r1RʹfcNɦ]5aWgN+oU٤W#m DH P@3*_6? ֣jNwHg8{%<(cY̙LD@N(ED(X7l]PE ~0f0+4"V.h^_A_cu[kW)e6S2 E2 JlN8͉95$>Nb5w׃Y4&2 2?2Ko"] Lt8/r,2JaghQ\S>T<U:Z{4s2 .#F|uj,[)5GTfQ;8²br魅=7vHH,d3.z~|vQKosz%<L7Q$*^0!833d19= E]zrw^(b Q0%ʨ +rt5@n,[h=tG TtLqq4乐}6i+ biSYHI%.0݇=GHmm(.؝h!Ԋṱk't lW:mD!gɑ$\v&H*iNpˬraa{yOS3yz08|C~4b1|?T;}W[q4p-tC0w>dKֻ,|usώ8ÕnPUa7\HEP|HȽ@I) ÞHU V<635 t؈ˬ|IxfWy˱U&1ρPc:q!V& ǵq1 Njၜ͖ΔU$JmraV# |9(W:u\r#g}-3SN\xf(}4V!M^o&&B@YL~IЏ R_¢p;CؒD')GƮ@YjK^MRt> nVد:qvm5'D*z(r~צ%ȄT%JIYF eY`O!Ǘn7AΔ#H#q;0{s!D;+:||$/WȉV(S* ˕\$J_w~J@ ȭѹgN-G ",pR~B !mj}c'M Oj`U: 14pA! ӅeRv[ )u̶CZc'X8믘 $RTĘUpۙ7eD__c.eHӆcP2u32"ȠBΓ{E*~Vп.Δ.)hq{tH]SGI`}QD-|;գFsݢȣV/Ji.$28M6qibߧuj >k`"x1NM[DҀ)} Nmy@ >S5;p'E]nypkPUM5Rȫ' p !\ ŚB 1Za՚A.072/7RzyKB[?[U iG7z;#mv "89~uռ%XnILnpXx~>A"Ⱥ)Tˢ;Mvy7-֯W.R)5 F"KK4-jk('Q Ad`Y"xd#f?3 qO/ _u2|aR#T/dp}ID+wB7nU4H 34_Gkv¾[{4{nyTտmr2JjbYyʃar\ x~;P ~읆TFw;qD2TA7*u iܻ1䵬^HŅ;f]ބ:}2))?2cL $;Sb2PF%[>pdZ\ɀ1ge7xIWaWǞD;͸'.`fHEdȚs!bGIN$EyJ.g ;np=eΤ @Hnwj_$)f[QH|B&1wP2j'JNqGOO;gߜ͕݀k{̻o9Ubt[n&&$g"ã^0Ǐ\AA$ HC}h~nH=漶!DdB̷sޚ86g;F{4;af]~?emsxe?N;kCmf 葠t ?Wʜr70OS>l+*"LP)x$dЋm_u l[\,Ho\=ý$2q=yi 3hxʧJ^P;-HM455[,Rp٪/b6 [%.j˵QA|HnA0_R&-.Zd X%4@K7[Ng1 { oQ `LeyKtj;6? V_ujG`МwU^QS)G'R)\g vI4>ߌ7ZCR)sE|>!~JyV>G)OrgNb)̆.D CD]k4o׭3gH+Gsv ;̴ȦäV#b0L*ܟ|N$Pڍ2'( 3 |>n-0aks_(wτUB0iD>W'z- 3HvRj͕{,o;6RBjoR*<ؐeF ADg+L,81$R%B4_.}.XĶ6ZEhBQ02N6ϭca/)Nm~17GSu<+4):T ,d$vJIn7^@ YG@94@Gێ9T BE 5 ŊU1ϋ)9zLHθ]{à)bHۊحPF̂D4TsV:&;D@)˩1p So3#k~˵GNja`sPzHUJHc8`?B`A0Z~RDx ?oץ!Cނ`q @J3 ir"AA:ȥzdm1'IagdZ@-$N+Y}JE@~1v"":2z: c5aCCk# ]O5i2dD.Lѯk߈uZ 5defbu@B{NĪ!w_A/!맷Q_H\Q Y[]M :%䔑(8Ԇ,XbassD8 H&ȫ(y=G^}ȫyݜܜüd !F|2uB+"EZf~MJIBMQGa2 `$.jj""Y0&R|Sc&mюL=TN$2"AB7Gϓg+נ6/=?1ѐ"hp؉px`.j&[E b,%-#(8x-DF ( kd܄lG7Gs3rudt!! FI3՛V‪Tj!"7#\qB2a4c#& A^&du6܈ۿq$="gϞ4nܸc%y^j:w,C.ȱ:30=;cyd|d% o4@j Nurr7 =AMl !RK}1oh}Җ} !z, hU0yh׵EAD$ڌu?MI_1:=R{섁ȳ!E F#0Ju%N"GF'8ɝ0y  ! e!1F[buĮʈ5eeQ6n@]b)7@m'Ȣf>j# xw8Oπߏc¥hdDj\i$+e5(N촖xx ۈUV]D&Lmo0* YEElAE?Ui ڀ3P~s4)N5vܪ> s'܂ ' M]ZA=% -DO& XO1X3@\$:| Q%AȚ& ݇GbV1 T֕--gAh$&BiRQ & {)Fb치X6NDrQup'mZhר $$$ ㍣{\@q`jm_DV7oa9;TtnP jc @ g]6=ϣG e=-UTA͚5/^zcF%d􋦋IݸLH? ;]G>HLcGEb;)na굈pIN(M!&\JD1)5:(.U{+Ν"DaYoT&.|{f*8Ta›VRA&&rm'iECu\^mZ[nn$ѤU[ڄ\0]>R[5DF$Xw=ckF "R}Rx\N"rh'`WCVe=HgvCxmbĎWCa"~=$BN?L;o+CM@ ![l-W8tJs'`<+_J֍o Kʕ1p@A9yͥeƺp*=s+i;CqvCxˋX 8jYC\H;{;|cjBAF%;5:oAm6y\{ʒdߝz w@CBzTfjLSx_{ Wy l;H?z^4J9ڒW&/!)^O)[ 0*ʵXh ?r ~^DKJ⓯6x=Kj틧?c` !u>_w_(Ĥ-۳fն5 g.D\c& )|4\r"Ad-0h9}/6:M¯гE|5u"99VoW-G?n¥ 2@鯝OaljX#[qd,ס8?k@6Y186cȕu}|U`3ƌ.$88Lr=)6wҽlCzAI@!!%Wdȱe$L?Z23Hq_Qe#*͌`yt{ /ÑK9!yKタ_G$Ưcwiz^/ŌvL; 1wq'!Kk\ꑅQOS-\35jcǒhW؊.N>ضv/X7,)cy44Xl=&4t.˜:ihϜcQL${EsԺrEeˬy: wՂ7~Dbg1frWē(37 \ajR ˿{SA3w0dJ|1:/o*utڽ_ Kkʭܳ{̙8^z ŬYp)w4t޿ܹs\ v QFNHfCG)|^`v[n0w%?^\~}[ȴ=$=k)7qqy.BQߣϴ߱e ;{"%PDW 48 ;[ƫ]5g &TaŎCP9}6΍vacR=_D1XX6*ءx ouaZ6Bz3O]EϡG}C1eF|U*u0(|96gÎe쟋Z=2BJ4&t%BA2ap#;FG_AH̜ |._nD7cɶ2Щg Q{ˑ8s9Fg2zʷwƜ124*з _k1UH΀$;{KC󦫑zq7nKz`8H  tR w1~E3V8z܄\ %Cy ,Kٴ:[BD&Gcoпj(\ jĨ/j%t7ca2I#6}vcÑ>}F-k EO(?.Ezd4& h+zOՋF2 ,NT 퉴;F`O0yKzNnIB:z$Vy4L\r KǠkAtnBլ+8J|& icpr/įEW`ԑ8C4n5ql -?Ѷٟs bhװq*3 W†!&n*b^/Zz"2dX !UL$szi`SN_r(md1{B>! r. OT1>[_t^1y*$>\Cfav[c$x8 | )K@RT^*qh*q.]NzeBDƒ>#?űڰƸxl b+G+nA_VkLkh:&]aN(Hť#{4돝@xԐjpeSZ\waL.нziL3N!@}~ES1BW̛5Kw~-$GOS"4~D-B0')CoB*ţjcО1e;lr Y ؁۲X{"&/؄Ar|37f!ݑIwj-{Cep.\J՛a+xuW<&moOJ{]rR[Kd{2<<\H~g`Q|=Phhw4!$$$gcnsCddug3;0!5^kM`CAϡmƈ:2p@)ʡa߶MW F#M:s4Qyo[P>]sxk*9P+!Bc- +;3۸xh#Ǝ<j+s#Q7܁Ԏ'(x Br1@To^M[UĿvd9|npw88$.mVج4HO6)8gw!%Ą+ՀhQ@ WT,_ Jy O3"D&Qtl;b/ v^șUbX"Bimd{,1$Uᡐ*&DHIu}[@+UQh>vǨGVh諶nqX&@ΙW-= Аim I(邑 u7&/z9Q^InYv z/;aݦ͸tۯc'u\f -/}ydQ |>e݅6ֈ0: cE5 R(:?BufT5DH!ix[+-tX؂n]:c𠎐qtcCP]@'$[F$M;vֿ9E^}#;F[WxEhpPK1p["TaKf n uCY5pӫ Taצc܌K:ѵ^ E]WΎ!"'0o RZS@D@k&P@0FdfoKw!뮦b:ne<џw_J:,8 NY{q÷¬=yw/*&Ũ;bg%ȶPHJ|!8 V4WGJk֤JWQO맿Ǣfh2`&e_=[}Aac0],@ b:G3f4a[ נG#h؊O7 < z=uFźH8#Y'90GCd5 QcFԷ#x{_f͝ZÈ0I54JL c:P<؊0ӽgZ!C ~}1dZ U9OY,њ8}ݻ>,>Su]*ǒ%Kyw9WR6 `ftyG6D /cCgà DmYg$7~?NTvN=BiW?x$)g0+t'JG fE Ww6xw0;@)3:>s{?K:<  )!l9" ڀvy%4 q"Ƴ\,By( ")y'V!f':G\.(OGT!H㢽AexgL} p-!! ƎǴ> sgd T])ZI5*)csjQ"W-2p9tdh S@M9*gQ&2 $H%# $bQHqI 6&*<[pu… E3's3%ƛManA0i’0:?|"aKa4@6~Xˏ=+u' ѩmpHNLwkkh ƏjFds/~w0$* DBJD[].t<|Oy%[>ۂPkz˰y øwG(,1֦jVA6PH/Ųuo0_eEefŵXG͂ #i{rvaxrH #ox}4Xuɨ~ ;pf?-4Fpln̜-ϖ۬ģA޹#%y|\ÁUq2@Ϟ6e GEK=:cڵ8~d? EV,$ nٓGGtБnsam"踕t|@b:ҡ$b%N]ish`YK{Drv[FJB+nExl]x.{[<-Wݽ\֭3̡xX/:c(G?߻CvbG;Qm% "Q'\2Ho ŢQ/ 3*'S:v} 8Va`(,*IPD&@Gh:v}vp0'n#0ÑSOh%ոx~ѝ1y.㽿N-{)[jR^޿W_}_~eM֒ڿ9=7}Ǹ;fΜ9ذaCZLYv٠`}jPHL jC;>kv6ٕppc|kUئx鋃vcfÍW`Ӈd9.*D8u /YP)XAHv^KC pY@tf }] v"^'PYgCnQWteE5ī!\lC8فرsnY;o0]оq7ϟ!YUR 8}8#w-6VW$abtgc>MS}֯òW?Ƒx0/00O:%HƩiL| ft 'ⅷ6!Pv-Ǥ+ŸDE2!Chש- #Vڀ*Š,Coz uQĉqA>~ʐfs,Ʌ;eF@'DZ 6#[hAԦ.R^ǒc{Gp[L[ gx?&!qLjxrV䵣kAn-xŏ0r ؍1TE0Q^Jhu6a0dž7"0 cqH ?[/~n0 B;'݂ghs$̜8 mb b0 w{'[0dMv0x/Iraapq^+6#bxlwⱅN딅q@vdB\w=ѻ$vlX~KPB8aðїcG?íF CQOG\#x>EE7aCŬGłBj8{x)"I ˕ X,EcP])*8E9eoB:SD/u>$Eƃ//]ŷ}2<^/za1YJ;C|#cu"waL s<ߝ=? F\4'eYԴ-73Mr=Dh3 TwNk`&P^\.zdUsº{ӮAQ݊z6%TW?\+~gsŃ/>1Cʾ|rrZ!n$Eہñ`D,=%8e"ub΢c,'(9(\]wy q* [l9w>#^HK[`flJAΉKP!"J:zHx ; b(z7-p.ަm= \l;ɍ5 qoM1 xP'V\~^q qh\c(5=c'.S6#+aݦ>isy>? :C¥]ܨ G=8t.@dW|<׎Ә7a"УO>6yz]m[%Xx8y%\ڥz`=9FDM3֯X~K񳛇z/U\[Yem XPE!MEtAj0;plɳ)/Gd#❏lk/9xѨ*! #YN>_-̎. [)|ilDɐGZ@LU2"/?. z}>HV'r=.$83!{hU!D `eKɄ,w$zskQU;. JϘ,H,;, !1!RC ='y92p@fY>/*WJ^''OFiiQB?/2gG(q6,$ʲ-Oq 2D;cPeO8"8{"MirG@ݸcѫ\g#e1xA'd֨. w~krODr$;G$d]Bʍ ij*"F raau %{Abƞ|x$D:WA77ls"b"Ȍ2C frE[0u 'nd/N*}4澝d6yիEX𜝟˘\ʲSO>)%, ފ}ϰ z`1=p V݂;L""Ețo)prӦMmGzl}Mڽ%Qe@A mia[h1GJR5$1JQ)8cbR$$W$5ʼnd &yhH.&&3mN=INxk+3RD L+y[ noXg *.d39\ebi,FbgB^aX[܏Ȕ˃Wd-h#4u_ F{Vdо%%}i ̼%/ZMDdQƖE@eNwȲ"~N1juq 29 '\IctȪYJzy>yC1zhl߾.?((L6-ZtO{'yE.TsX.3DypD19ƘDE:LkLJٹ[P(ț#,RwdLěpFkIM׬عJx2YcDrj.v&M=f ͸Ab+I"Iﵐ<p"a8=) %A'|ߓ& v62( IKn#2BARgCT' C+&]$5}.34vEd_3w,G@3E7W@7b`n ǛGKk)x=927?Ґjq.|j&V!r,#n*,5O%d(?={66ujgoM&HW7WG{K^ZZ DiEuC}uTGPtKOwh=s:E9%t9֐!wprʞHaPȭ>RsN.a T{/~Š/yR _MTyvJpP{ٴGˣ%XZ҂V^ @PKZTQP^ UF nVP~sơsj*Q*`RxdH=oZj!HѪlTDNkT;hZWKU?;~H۷Ege$&C(ϯUCy|=aT{# ,P+ru&RMvH*Hc*qnhkѓFoN%21f P#p:DPG@DE0UދP(] @+"j@MKN(TL+H2go, œ ~6f zFYW SkW+|-s\MtZz#9jDuJROw4 f oB)drB4t:S MRWhyQƥ׹!Ի?=G/MLK(C8%_Y9JdSpu.*Q{FSyR3y2r&[ 1gC-Yk10=k&u:x&jAU߫VhQTy'"˶,UUU PhX-/TT Hl;Q{*eX=q~czp5_z(ºZ5%NEbd|L9utSKzרRWjlgZ(|!2 jMkY v )'՝浀H+4*B!r-UU/t{:=❎2JE,S"4q͌s'J Q )i3x:-9聂H^ z/UD/WK ޯ[f|)4`[X9jJ#$]NStsث9Z)TΥ%jOcK{-^ΐ{Ȫ#^K- s%!HNN&1R %zt>TYH3`U]Pi<3MA pSVN覒َNBtAUTϋ,S&wjA&ʐz]!Ζ"]Ж<-韭Zȣ7ΖdL%¬uu:ֺPrU(-U:u-t\g*OHKt,t4$9rUɌR*C_Rb8J2 eRm(= $S]?hf|'{*K3rpR&zqa3-# „wϾЅ%J5vF3_iˌГuOUIENDB`PKmƔ^DLDPKy.F8angular-1.3.9/docs/img/tutorial/tutorial_10-11_final.png<{ct]fǶccVΉm۶tlN:wfYx*LANǏ"J?~&R OnL%m LL ;c>Tq[Ѕ2Z||'j)DC^ YN\k$eTILFj@̵oTO?O* +b^AJ?/Q._u5+)xX@U_bqm| @VyeFl\wrr]  *gm /.+ rp*P@/PDߟ0EAλR`xe b0rF&zTq]#oI Qf]Zxb l~fɪ>#JA#'nSUEͱPw勔g`jD ~!*9U:ZH)lv9ڻ>i_QH n@?WcᗐY6vJexN3V=,>"/o/";Rb"@'}^YCy*w<dߍF>WD$AJILi?b>\ɢ[]Gʓ/n2gnv ɻGlPuy%3B.jg ơ ը`~nvlF1ծ琓8xʜxzKN`.{q paNH s˳zPXKыxb`>>j/r^t(9?ߔ뼔}/B_Pb  W}3O(l=ejPo.c9ÑkANRȪq-J.=j|zbԭHCPQ(D<-GdG߼* O6V-qo],C&}jT\)P JHd.h!ʂq \J ,-Hp I/o&ȅ6%]c[Nap.M@mo/=f!/x?+báJ iB>aв{s[?t鿎FΟb @Ȟ Ԕ0{ ^fn>quY6GDqn /X\Lz3eO20RA9ׂ?TcJc,S<6@NYhz3zfZe|l߅ Dа(A//^K>ӆ>1L<@\b"%Om3_&"2rr̿F'V{\Q)"0(KdQN2XpxDQ3IRlEy)GuioT֬xDo,gޕ2xEYnyԤ5bQ)۴yZ6=:$C@'0'fZn7~FS{6SJH7a:pDrOC)H!1XBAzXzb={. B|98n_-)~C|w#m./o%UUu@ #Sj:$"= IB}Tqo]P<"gC>gwCNbx D`7n# y8qsAp91tkZ^,yyTΎCWt PgO)Zbhl?|i6^u!2&HA:2wiWP؛o\tVpB!:CFtϦ 釬C+p#{}YW 2Lyꄄ-@ !!+qXf}^p#vt`Eézeޏ|A4+$eeUL21ϵ[.(\R]z >0%0-)yFT ;Ռkm؊uոCl_ ?a^Uhe*KgwŨNf;'Pʓ݌!3A"_WQ6.h-:uH-램b^~rx5\F^+޸„ud/8KJ0ˊtzbK*vCY%A'V{h{2Oq.֬@ș 䙽S[HPiP;1Ж,]V8U8لys?T:t$[}}r栢R_f;qv(O& C`0bT SQZƊJfyOFr-6 V!49T28K+I:8xkQg{z_p;xȡ޴:p6a&N3>Ff&;ESA ҟNewd~ \ $ ßB%=4GRcFiLĂ<ow)({˨+Q4wc$&,¤?琢Y1("VxMw.DnEW1|!\vBOk D`PK;7=p뒺su*xCI,"KZ{^v3X/y=~LەfXvZTͰ@ ^l=bIia tWa¤&i9 L@Q,Of=7[ :|d r 3jy4ߞ==Wą1~t6W9QB*RyMm~[a$f$;`nófl{D /"|qw%(錶>sdy!`V醯auA>8 ̀o( Ǖ #$>z58(ulC~uc7> G, S)Ka.0*K#X!K= iXsPn R 巜dlL\i}_0e *:mY%.) rg_Z;QteK$yK-nؼ >gcX}]Zc]:"7B8EYm3gmw >*h#l]]WpǯvR/81p {/\^wFE ฼J_oN emxQzu0گ鏊XڙNk4{w@7 }e|,D:/ÕaʶI}4[r'#exzBJṘWo5\8&bvDyOk2M5"(fmklEd@]mHz42TF[f~8U3 7JU9y82%詤~$ײpʂϷ&F]70?Hfk; Ky67ӹ5[qFۚV0Jt†on!#HI@jJ,i's"(.DHпimFEQa`¸%^xheusv!qBkjֲwyNz-a&*m|'A6WU*Ϭ٥jcRMn;|.`[AM%2N-FcDr?`.L|hjQ ^vE+ ben8@lW*9`5H p؜ gwSjr0 U+6"F9 :jRn*bd+:h^O3 ̾rfpa1Hx%ށ01ѢI|SQ=tt#kIe}Zԯ-@S6?E#'2F=ǟ)*~R3{g;uft?`{s8ch#;e7U da-ߧO;"cgݪxKmgi"NcrK=ף47VȵhVֳ6tdhvWr@NϼYz INiݠdH5I'IJd;Q'=P6Jcv_n08vGhl,rj}x,M$c,זaхi*puێ܋3uNL[biFd.]$n- ^&c_k@mMr}Ҕ% Sv/@´dI$Eqw Q,."2vR[y҈ LT7hv3*5s)`R"R8^52YBB!+8N@ѡpUtQAlMl{r+V1s )Vʝ1MNGhIynIJg%Ԯ(Mf^tfȻ$~eyФ@! "cJ= g Q3XBψ)ghy 袹Xz#Lח ?Z 1=]DVKbxo9!#7Nb kDfrBC^:^ ~dMZ8|۸8lo&+~8n9e \8*W"E>[/(X#[:,880Zq:03F { /( lVQK%Nb1x++#TnK}1*ڣM:i>e!).k>4>*A?HyĨVۼo}2ዦ  .N2=;+]ȾK+AEaP-aI*<鸕rBeK[weD 3BBn |HYY5G68ed%y7;RpÈ xI(|ŤKcixn gC5Ҿ捴 9nZL4ۯkW'~ `sê؟kD3h#?gay~>90Ƌ3~Uˀ']YbGW?iAnwG>6.6^Ay9ƄmM 7Äp^n9Od$ SoS'NHN;DYdiEY0kcyS>fIڍe\%2ەp MFZ5.YIRb7 T^Y韗L(]L%[߬IbÞu7Fd?`*!- 7 o|+Ռ_` sçTo5_HZ?S_'fzAP,8N2 H!1GO§P{xlBj8V 'HN#" 0 U4HW'EչS%̉3nwo^lr("}PQioXios}r#L6ðu#íW'?EeFh5Ð4 fϳVt^^H1xlmWVn?^<‡#D Q==_g@v|J^hv{P%(<9U#N_JfQqqzsfcbr.+,rNNxruh#&MHAg'>KdBBl@RRR' f:!N:rr;Ǥ)sqF>rjVlT ԇj**7V PNJ?wb񈳳t[R P'DqdVA^f+i+ <5>8[A?G2h{:ֳXs${l&}` .< K`9^V %f<]W}Ֆ5:Q2J bhj+LH<"#mUFd<9c?$KYO q5)C)߆MI+,bT`䙊?0ߒje'J>ݧ/~odkj٥a'hmb^a@:دݜ$ĆdJH \Ч2G;dWy+u]>5QyѼ_~\}{yFs;9}tvv\ w;u>ES̭5Z sc鹑Sbَ1FGU鼬sl1{/sȁ*"yf43ffZw.ܫeO~t:{r>Vdh2rs(Eof'fH2_rXႰ-' 0ѹ^}zQt>kD84E`I .Ԭy*>qG{owzw䧎po*x+L|<*5H3Ui]mf6亊hEqDjͦ 5{8sx!T(Dc%7ܪ^y w'!GzL `sL2ŇЇ&&<.z E0oaT@d=o&DNʵ+ Wؒou¬:-[F./pMrlE! K-n/,Hf@C{3zC5 ] '7O^&Z˖|]C;R,5 29%/͂obQc&TK}?v$Q=)"8)N$dL2%JBe.dܡJ4~P'MnNV~fGKJaLLW$ecSZVBath\"A~$Y !PؽӒ/g5+3^j\'3M@!Sw{+֊<5W =BBNTfj*=Ppd͜!= D򴎳ՙƙ՝E-9Ż<-sV3K,.*8v㸤fppHDlfPb1Oai`Ś&{rUH~ޯ5ZRF>N h0&^Q.[a)y%;d|R&Ɯϙ DUeģ^W8Eӥa Ek]('xϔ3n]Q=j"\8E{(ك^78Fӷh1șBH>G&}aw*v2 x tP81\c|յgZ{[cہ| j-΃xuhuyW egۗW GF԰艟ʛ$,A 7+T\7ά4TҒ^dQpq3(GRbۈZ P!sȗ=?KԈC۬0_ s|Y,Ĭ]M?UT= elYCh;MCGj|O90򿂍I k .>s^-UtF:r{'/vAWiyiƱ 1my^Qr\ڥ>]/5w &WhKS-Uҹ& ëS٧3VvZ"S#c,]Zu>NhK@֯U44.-1ʐ9 XLY\ I::]+ *Kƀ9huB,zҡa?Y}E8ZQ!ʮ МJ?:uj&fNKM6Msa8CY\ߑM@l`un2?=s.@E i vS*WȷpE\j\,A]Uԩ+3T8jx dSoo5_>E$zv'ʣ*q_+80df%*o, jr$vu27$ (SrߵIwb^KCq Mf$rw"A4'ހ|r)'ME-,6؁/촺^Q)>|!I'}F{ _Ϋ$eOF<,`WE!sOLו{E_UYAT5~텕&r M5Pp{6@DmʴJ[ĺ:wBY[ 5͇10j;W,׸ۊZK Yu6pAP-Z^޸ts|i헵)71gL!n N`Y_۝Ov@C-q 6|%8#xۃPBthd 9۟ G^+gާj:G 5߅ETOweYv}|a: @B7̚7g]U I?~Sͼ]V_e^XBeo ِ3T=sֈX#jTzV!LU7wn4mTF/jZYuNOcd HsCV$ґwyzF1ī3^D׼?*x\d48Z1\;HI !%T1ZwV+3@hAοp?!tI٦bVrF돻!ScdzM=wdrvV=x얡zY;YoP,~ϗs5m;(`E`ҺN"MU>دjG7NGO3:(h93AM`JgB g~!a rdfE+x9"g:Dv0Muc0ܷGRhbnanwϿI$,1:s-NZ#mrǞ?7톋J8Se7= -pUdӘ" M,H;W+Vg,hڔI+A9wC) =1:( n?uce!0VG&PZMԼW:]-Xm tqF'83R\7=4`G})vÄM:,?]CFr"uKWJ365}w :uE9_yZS[KakO?F=xL 諂S)FFlՙY Y{3mft+r-W ڷrK/J2ߑ*ŦEƞ|`|ch(HmM8T:v-"U"=.X%^-@:\P}l3{nXMv[wlgfTeMRyq(O>;3ml^s<=lik8DJ5C;$W<8Q2P`B?S,h5rf`6*\#0i=Lҩ"UezB8z1{5-MGUZ}Q0 iމ V9/otB?m  Ł".H5Ď"M0Z4UG3h+1jbOAC \5]#UIb?!%x8 &uȪPk䪁#&bnȋؤw~~kY-qk$<%wX8dXKW!%φ6Z}#llJ~,^@L G5"45{3 tu%+mQjHR7ȚQJ˖,wj*Un%)}P#NRyixpb10½RG>Zi _ǔ`$^{LM:shk@r`]S;设i췘j}C= Zccdnt%ULe4)\bPQ9^7 CR!MB wMj)0{@i{Uԅ[9_P9w6wbfH[Z8)=L2t1EBFIH>!F>9!c%$o,H؉6bYTblg!s$~OҠ]tIyQRz_F?m` GsI%E?M!nxKiL}f$jʼn(:5j%yk1 dPvJe&8 lbl C1nl(@+΄F"HBV4uCaaB{Zdy tqVLiK[e¿J#{&Qؓ m O*cYUAoMڷ.Ccu8{0ōR.)A_[sȑ?7mɷF׾#[' }s˶*; - _Rp0~pGJU$˕:0ϧ+Q/wEFú:eo5XB6z[ Zj!!tVcN_Y-QZڈ9Di L]Ǐ]SfH(IЛ~n6@c Dž[4ԪX$w7q~lbbZ7VtPZY>sEq%d7eG|$2mI1i<]Jwh' n!81wmcZ9Y}~~xLض)zvZaԖeIN\뼕|s)L6MZ:0oO+2IbMMohz)_ I.l?_pWK9,[-:FɗۉCs9P,}[7Mi1T :I|:\f︝ ]o FcѮl]i_LsܵMrʼ#MMѐLxr]7׻DxS SA_ e[]rCU``/!o&=_ P%1ׂC(|1"SuFC;= zuIШQ/|@i$fs[[aqm`1:NPBMAFﬔ=`[ԥ"ID;?5k|t;uD+G"t!y"8g_|-t[;q\z /8 >SOB=17@Њ~n`UXbJ/ 4m۶A^жE|ǚP ᮝLEmSIHEj\ ϳZm$k׭Śk|(}h,}CHKICJz*;|3 X9sh[Q=t&$Ǜ\=f1Y^ʾw^ٽ/4yԱ:vȵ)t 1\jڂJH%:M;Cb|6>*ionw9Xfy~+w)z8~S2,Tx vTڹ _w'ڴjб?f͞;٤|K{RCa/y"mh"JHhhm"lwڍ۶5kfE^ t M&r K% 3~CП.FՐ]bHZ*滣žL+Sձx$%y#_hR} ~W<:1~6Zs%xn 6Wat1gWv*%N%Y@p:[B(o ;t/!-I^x}>~(zx];d8|OoH,N\(##`u ll>l;PFIZӰI!F"ŶCXZ;v?s[w` :uꈫ]^}{bDf#ybMmJ5DԿhȇ`>>#m0`4% !%M5Ũcmߊ|Zm6ѫ'uƇ| hʺ/QWA2ed,l}cYYQFJG@ul%RI2OϡZCડgaP\Y*1cEc4ks؟gGjgJ!}>/1q#p!5=-.F+0S'y,@'|9s`޽RNY7`8̗VCӈ9?vCjZˡ""HH?s ShwXC!4uMHZ-NCHs~G~q6ʭ?b0 m{r_rw(T6q 'E1\W?{^s&[0nE3y看&^νi9<'g}]뤦#~S]~yyyZ3f .?:M(Ci3BIv;R_UsQka5q(b~?;dFÕp~RxDh)$$Np۸a#̝5b؅#q3ТiW # Ck W;gˬ0䤩W@װ>U=`$"K\[>htGǙ 䅮rm%Q+Wx Pd9ضUx+PTb.àc_[ aꔩ:t(,zKm?(2D (5,7C#MMwl866111\Ok*fgg#33[':u1c @Cjm4rt ׺1,{SARxaJJJ.*!Gj'5kԦ42:ew eDE/TjFB:$$bڽvqYgG/gO>Ɣנwdj%iŋc|/((Gt) Mg;|^/,H%lڴ)vaÆUVxI3. ;wx?{+WDv{HJDrwPKcePYǮ}6(;XĔt wRVzU64oVQރ!tN7:vm/9TsQ܁xY Ռ({}~>e!t]qN!GK pirVNC{o\.ج()FnNfNoUe7Quz8k(CCB0T`% SњKUj{v@eȵBFQ>I/N&i!T^ĉJRC` /?>(<8:u/sA#ƏQħNĽ_if"#F/K뽯qu\6F;IHc \d jgH <@ǎNa5V0ȎQ+ͬq#ePU=33>kQ9s$ǹc̈ERhEC7hFQQ׀]e֬YKaǑB X/4úOEcW}tƭB夻 >q#;U0;]QQ^kA |>TWYYmo?{Lw$3C )-""u[@E!t>1gZ;ἽcgճZKH!%`2 {|fnيYO<Ҏ<6- E8*X0\< wMO:}耒@_T'#@;Q4*/zuȂR:5a ?rnϾ"&N!SW(uV Sj0@Drx=> b,_"e1)a (#$C-\r,2`0ɀ$rk HfƀXNWXk=H{R ހZDXJpC̵I KfdPj3ˀe=Ƈ 6ছnB~oܭ&Q{]nAc8Yׄx3"a+hX1h0ձv$&bh>B/(A6yEEл:İ1#qVGz 61E `e1ǫҥI HM% YKl96eH)D^v!P2os6d0fqyM!/^\oK(JKC8 XԊǪ~Z$ ={iC+n/O߳Iۗ,gExg1,٤YwONkwU|sHG7+aL-QHCcTNGCkO-蓃?'Gz-ݓVaNh3oqUK*+?t>+r6 Bf[m6x!Z`e (*v=ct ' x:hp`R4sLX"Wm~){9ndm]kZt*H`0i)FYLFQڹ{Qq1]z[1BQK# Pw0l_?{b "fEa qwB&CvNV⠾f1ݻJ_P`Ѽ#kdg呜Q}FMMVԱI2ٸQ2Hu@,"@ i=fET,J .!䅌)*bPy9l dn_BXA ' 9T,<,΂\w>¥SKOK[ ߫"\K/t}~\QA+w/o@ &"gn|H-C~* ^Lk]" +D\~ ʀdE&aQHok.@)t)p0z $ _=݉=Qȼ"\0+*Q2#*\:j\uxx@4 4H2!AfEIj\y;V oPw  oiah>fGZQrGIAYϜ>> 2o \MFsZoT968:m]:.H~Z{1& 2Z@qmMIBCDZ@H\  T:aO{~Av؆ZZ{,}Q$8<6>r_~Bq~y0K+ؾu;ntY{Sע%rkC3y>Z2yM/.F$D`nv>/,&ān@Y5a @'Q[8Rh6VF&+-zIy}qC`šjt{-c{djMsfBG?COюr|shxIfa/ÞU80fs0⳥ye\XƮ0[&=Jk.?ߞ6 .^r9~kj;Qd_?X{1$tYYYGŀF8} ؄8aٳ|% |{/b]GJ˳N@ZN}B1&CI uъ-(|Oam, wS̝ Fw}]K'E[W@a3;q` ӳ+İ㑟),w cߎB=Ա#[qIJURBTK.eFu _ &\yܢ=ǀ +R`Q1⇊#+;a V4%p8j;+rRfIXa @z4DǡUQH+b[k"| L ׳dyǯlCpf# PF\m{=?Z|dvl1d}qU3RFR2jo&6u:'*OgmFbi 6">Vcb=`ˣо]V\=:\Èk!!1B J/ꀝ[v~ T9_͂dJVJЋ+lwILjZX6a߿kc zu.SW@r0KUu$]؛W7`qi)X1'#kLo}N& Z%#f<#rk1c{ _Q_ ~/ 1xƥ%=I ,>>T;_ږVkȟ--lwލv#Jp[C'/Ą~ю V{FG ~=VFڷ'ZEJt7H*2G'^Ǧv9n ;QXRꀅSR^21zuF5<)F"yìEBzxK0p eP=Xϛ";͘a̺}&w Obּg6I{izW!: ~:xLFƁl}%z*g/!%2ȤNzg?~ojO ߉ *Ea@y>mqAt$kEΙP% }BB YBj~ ɴPQl$ OF>K'#Ug 0dE.OV21.EU1Z#Dکէ*+6Jj\@ʔ>M:J^e(tx`UïH&ˮM1rd>V ݌#=Շ(9#EpI˕Ш[AgF\b\*\1u*Tr zrD!?;j' J"AEA}iEC٥ y]h{&rԽdw(C|L*;bCۑH0 ehY8W¶o2+J'[ } bXZƲƲovڵS ̢9дoߞ"ĤDe07 (*\)@@ZF>?3J-EPX6'$A)%HhgU%f}ζkui[F|46鑝r^>Dx$-@z-2XsSQ7]lKp#Q޵F⒡$ƢJrmntC&ʏS.$Œ%1nc| u~ԥ_4\2lcå؄U=UEuBg":[nv_H(_9#1GG  AOjZh$® / H_` X˦9+t:Bl&&j靛1 =KrkjZbBVtdӄ! -%EGsW6?{21T#W#eD!J bPvL ݡf;uG዗v?ۛaSx|uJƴ/nR&mZe\ ;L *VOA~ hLۭ;A90ۊNB] GIn>Í+)+ ?u'f؄ÇA'L84}r9JZ2(nl ^MBl/U j\:d>_~K duxW0ɈKL"i S#DTj E 1B9dy2=(~Zx$3܏A_"1>'9O}apWqE&KdyPBs"BPըkPܐ?0C^fc#:J פ1x6ޜGo+WÇg=}`Zw"%x_$7bX.x_p@4C-`m1 ~qܯCna=9 X=xix h׳#V36ڍzç\H pXYQM;pǬPof"GwXq>ai-> 4^ChS3Po^ m}vm>TmKîFPb۲ N-8XބR:cqŴ`$]+1p#֣ hNq^.' a5TA|< !fbKyxC6'_‚ѷ!Y_%>y(щR=[;b"BS~S2q(22yl"c'\a ÿfIʮuТ1Kx`[tZlt`4tP哐^2+8m`-GQqt?Eqlu&":.ݺj!p4!11Uk "1PvާiW(t(DlB|J%R!# I Vy#/زp9adeĽ)NǚO%^v-/aQ&A.b}b:Eg"Q+uhBI: + THR f+ r=QJZvE)m}51|zW`DY%@$L;obltAL!#K}6R!-$g"dzژ@@! 7j^˾ރo>/Gt(`Vhڼ [b%#g;4b6whb-k OsF(y>?Hؠ[`GB |Uzw<ǜٛ1O뽰;qsq-!ڈfcxn#/'Wwx7c< ;|$>~ X㕓qO0*sdص/__//FPG$B}.7=gٯ!Wd&҇/Ábw^Å>A F#XljY̰E$Uyz|O FN=dڏ?g ɋGGŎiӌ'14"Eh&1?&#+eEׯD&YavC 6'R_C7"~;g! pm#%. <Q$=K)BZR_^fIpjF\ u SvYʄDªz{yU{~G !eXR|\̼p,_}JKf [d\*" ":`IX҅#g>AO;CL׳pI-LDZ$l^`X،-s9`[pp/fݱ|R~~+k2*ɒ}U?) F=hƉJxt!kl}_XY<CFBJ\4.>MKDzÅ!PBi'"LzCX,>)-I)s=okŗGJE2khlRSJBJϊ<j3JIL޲c~cVg. c&NT&Ǩ1cpA& Q({1-?JB7Zϕ2@]%0(΀sB/Avؼ<8Pe d7]AJ\A7p{-1Jm@d[^8%ϸ1ELffG-]3;a<6u R ~7XZ4 l@hZkYt . Q*5Ew-JhC ` ):fB# ھ?t<-r"+519qHQPUWJ53+ՠm+\vqɤ k[%1HABY*F`ٌhd5Z1cA]8'C'n#3}醔л4Vކj 0|t\'`twsCn0&$Xbv9x]([Y'9L8iY^J}noKxVC?]>'afW?^Kջ߁8+]VBcCu`"kE1u7DCI +l$Fʓn!F%%$yaDZu{jU -_.-;q(?=.>gd緳+n"_,@Kc%sA$iwAo^rr^@D lOcCT /m(X&{6T 9~bfu[- tw#)) .DTTԟBZr?,_lDG`o1NLEf|d Yʌbhd̃Ӧr"EuYLR" dD[7>3 v  W'8JBҠqxyl7ǚGA9'cxb xcax8INn‹GE逶L&f1 ܈X1ZlwOSnjc7 &ў)X?9|$ -~\'kuH +2Cw߉m q˛wCrrTbc>WNF#a{\GY9ޟc~WG>ɷ 'ʛp˕ 5w^ o?<څGbˣwa~~h F6!5܌d^|}ӄgbQi.nLSkT!*Hf,_w DL|<6SKp$H?1Nh wC J^;:臽֡QSU1 .{ʏ)qh#NLMIguݫD^3݇u 8s.ع(rrlRxŲŝvhFvBT.cl4De{PYؿk`)9=((c{q,_5Mx(۳Uuذn% c(aDo 0e1b0~xI3CDM+~˲p]@^X Ԛ ΰR!TȤIS%J.кP822u^DJ,N;m$tF⧎Vnk*eŐhPvnCQ僝I[6!o1zKX6!Z-+<8`R@s+J&'x`<>N ɊCq*~;SwR_q4(O,MUaoIĆ 'D+B";f8)=%!w4/r.X{5q߫w`DK0jhuTƍA-N>p,9;/DqQ0pJ4tFx'$/b_o=@flf7ˣ~i<8#nt`ر2:řsrX$e+ekڎ3V̳ Ɩ8@-9bH-Ȃ%5[1^=ϰ-8VO#1ll~_xjbY,fe>罍G rxn)g;:5 ވG:>ϴ6f~\ֈNGr2w:3$nuFc=9'vظf.~96Pv5ek#I]AdȂU$1)t$/Lf$iX9[i`~.KD]AH)+Q 1,肔AКs O=ΝYf /n2 ֟0C  &D)9لXbB`ٳ b쬤v5B?l,Mp4gFn"cuZ HCL6cӣv;V12R-;bتAgAJTg44{ѭ4 ۷loO?SuQ;7A]yGGiife&`܋Stbm.bPS_csVۄ6!;%ÆK¯!BQ01Gt˖I,؋MGljҼ:dHV{P"@ZV2 ط:D^4$dn9*FEȖs^fDN\ *^iq>2s@.2||\ %"$#a;qB, 5 Xg cO{n;]_C*}~?)tEJ8>+_AtJ7ߜB4藯@Ŷ ,(~iBn'<3Ybr%s4r9aK5CEhDLHP9Q_] w pS]%w+./5+ "V'Ÿ_4F{J]ޜ:T $7hWC!VMS.יpmA=ɀf]BzMCB'j~<ޙs  . &ˁJ4 4nz/!-2jgBkD,581JJaPlUIX H*J#f#}aȘ_v^c磾C&r~ a~kܷdXq-n]sG/xLJE™IFF :%JQ1O끍M+fR0DXtNj!0qd[5SyXo*2I\o: Mtϝ FBU!ΡBLJO8Z>eSgTtdT*V:'Dd4bPx8ErljY5LB- [X2ddiƳ#q.dH6'8Rm3# 7Xv&h4as*vLȹ`ajNZb]6hcdd 8/vUUn 1rNUr2AH4hƗfe4-2~V)`$ 'Wi7p}jRfɦwX8\H, >M[Y/XQWc 'HD&._&Bjׁ2D`V[586c+m,ne 3fĜ_1whEAM0z "hk" Zbᨓ_v/'[ϣ`Msǁ#\66aٽcɜG*i!&.8 u0?u@p[F1DZ 7:!b4RRXbF"D8}v0?~yVzN9އn}zKj_#?w%Q?9VM&\,d?+sY\^oXh/g} L>KWTTo‘cǒfbٲeʉ**!<!&QaM#em-$C.)) ;{wE@qAADz:l_FFO bY7ƎONNU`oCI,р=[ fͲBl;@Sۺz2ڐ]ɐ3`]$ F:]bL0*J0 Et_\^TC0|rTp?~y-8Fu#%GʈXƫ(1.W^#6("G}R+󰾓Jd|RU8]xR)_ſ~ꫯcώ<; p6f$.p)7"&*E;"4TĩJJ G}9zپ iIZ$$CHn4dHgb`RW[eK6  Y./RQ|.αk4}۽֯Z"t* #ynh"n {76A"SA1ŀ=`QA띝0 3ICX]X3F*V#8@eV 'CJйed\c.,NJFk$6 U'J^bCNF׫[qB+HFzRR-Ec r`k QkBCIJŌ.Xl^ ZH6ݗ۴iS} P2`y,YRY20~馛88dqkOpwp̞cb˗_ԩz!dffbC݋gaa!ߗz!bz>x ^L0u## ==?os&$>>[t)>xg6xqQ;wmxΞܽ;T*yfw`M5mZ orPژR>݌W`%$! %S%şM 5?OG1b%*D'CMI,d ܄(px,MH(@QZړ9PD!}6'Mp:(1ax@#8CJX\F!5 *D5@*vOѩ8KJKgLd2,^I'1)صa =C%p:b;|vV-lEf HJK$Z CpM2oqLՈMNZSNdA2L:@NemBGǷ$g+p>GnN%P ^lz{ٻߟ^ f.Tpʇ n6V(`cdGе+lcIR{#>=eXx"cz{%vohEׄK!L$ htͣ24}I#.:-FD~d ѭL- ˱eW ]ÈK1 ?#u9=E091ӧƎƁh"37pC+UP2H(N*d`B:/Zfffok 2c{mu?v FQQ; /=a; ?CO>d2k6l~ k20+m/R>+tB4Ib\5〓v!VHf,U\ 3EI^ Tˌ27[/Xq a'Tt-^G#.C#}Ή1_1/,,KWn>5'3` 5ihQܣ7v؏뮺vctQCc-ҒQ{VRd1Be5ANtN4= UF/ހ*1TY0T1J4%С)3985<p~*\rt8:"2Y#BFZJ47"y4.DxmbcfpJCRWܼ"޽rM4)Fz4hMV׈q8Imc6q~b9]{ 'Հ2@ԒY=MBL|?.8=H: * 75ERLڼ2\UOl~Xmnw.ŵy8P-fYt^ ivrd4}==q89Jô`(SJH3Aۣ^DtVlwqמްX,zD!;) ),*%[.qsq%y/_DZ,;&YY%$@D^g,`Đowwv-o`1|A:$C-&:W)"Iq!ܰH oHZYΉfT6(W)74z+F`G"4CJBUZNpXV^nGFj1dQz*0# "OV!D}6ą,ZףI^*F;@.'9gh ;<:28N- W*dgf`Edfa2ƪKz3#n >qgdv 03𘓋oTa|l9.**٩0b)ևb-7߄q0)kQ57`3()MÆH.6R9zX^$! A).cCO\BMX~c9ba6dKǹӔ>:,qEh t6Jn%2rrt< FKż QH^Yt ɞYm7u<FĦ<)X?s}x OKSޞ4-dUP걚G"K-TQNR_ꢧ/^y SbH{3|qϴ[{.BrFHO $드BJzP̣u 70}LR'y1944ċv(GKb+ k$$N-"Ҡ0H<  U/A^9dtwY+HX/jqilʌ<ň}"Ϗ"H~E!* (f>d=rqL2@98Ϲxvq& m"aō(Fz+y''4J y'Ty@K5J!K_/OX(,ϹX;@D23egF{ /?^Px(ծ.]-@3% jsc͝;flT50 :U .,F6f6¼j3ua6cTIs()LQٹӗW-QBt!wVrQ|$$HpWuIOQ]cR&$ht|"Rv.U`&WĹBII]&IrMmAx*%N#<Ɉ{4AYR{uBM~}c&}cq0J ZBJ~3`]wM,ZЪ3 H[ iiHOHY)v%SǛxt C',ۚ\'z}ޏ<[ ~t6]Źl{v.5Hє${t~ o| 5 y0 ueZc yW[Bfǰ`/dҝ0<Fq)o#k?<=s86XFɼ#v 0,i;> Kʘ=`q<2abt=Q-(+vmxmzhSadg}c(l er ;" <6AccpddžB; }l=;7Owހt~ۗqíw@2Gvg;e=hZ6,p <ߠ|vsΜ:\S;7k<#V(GҌ!vD_тwpWLVlJZhSy**vWp9ZzFN1(jRO2$%ヶ;x f~2 Y^bl{F6٘滭0c [t<J(؟"[w>;u|]CG|] 2U;899)|@Џ4G"([WرFf*D~ESx+| 5 /85ms o%A/gF7ǟW#ҳ%#='}Q6 m8ݟj5c\'NFی*' zX`G}y;L6#_?@{nvhKWigaA|KG&nO"i$~_#L"dy旿W}>9sj0x ͯH"/OQfcO>#oyŹF u`(+s/wj>#cx<2m8&SҀ=Ndn!pp [a ihʋmHpiD[I\_=t#/]WyaVؙjgfUt $mQ^ `OH:=>烩n"֧D̉ؾs#Ƽ4 + F`#ڽ;XajO_ZNkR?@(HI8VMB}f|=4pOm_h{?2Wf!+b ؂Sp^ܟ05O'wtzM01byg% /yNQ>xgo?ˣr'QEyJnz4 !ˈ!Lv%ID$^,LDřᒢNVɎQy"('f`Q0X$/~5._j@Mic#+DQ]=kyyJOCٌ 0 0gy#v܆^䖷)#87\tW&JʪusOg [[ ͍Nnko?]YhS Æsc(tfš^X9)"=# !1d1󢹲}3ie8x 95OxҜl'l~(@AU y8 ʐXM=V^2*ര?:2 @>&z3JI2%(QLN~ҙˬ^s a4bmCVYxbo/G~EMk3n^Ѷv<)E/hG ;_OCubl\?90vo=]~dӱ⦥Ic"'1F9h;g!աr<=o܋aMc֮u.s96,DȀc~Cx凿qÒ"om q7/vetD 1s斠du.GP;"" ̲ `eoCyhNfAiiS,O"@B޽۴Xm-FU'c8݇-_~KiY.Osn\L(mTPH<+o؄%x1ʂE+xzHǖ~yX5pӂ/q5 Ø?@4lM9<,\Np˽`ykM\Vks62ƢgO"|W^1Hh4_]#nI($j.G() 2leqݚX-fTiBŜf.It[n' oSҠф]PC\pF+,;`50*[C Vy#aft ѬRܺf I>< i5g|Ŏ}OĞ\d0HV[|3Nx'w6[^&) E\,,z#fD.spiX +Ϟ y{'Z{_&=]I=JE$ٱ߶:"6#W.A"~bO~z (WzgI9g6u@[.^9NgKHy-Ѥkg]xR>4L'ZfK߾(/^12(D1tc`(燤T<%8!U*I3 w0|yNKTbR[X[bļ!MLcH }^J4*UTBǼT>%Q|{t X֚)N΁s KFT{-{ߌgHDVf*19\([ipK=VFG(?|l2J"#T,SxŁ3A hC-}((\}֪z:3ryIGZϝZ/UyW"2="JIT/hG[lvl+IwYTU7Q8f`8V3֠0o oGM~Y(fVj*9ۊa prqvK22ᴎp &XMafF}8PTl@̔ īƳӑ]\<B`w?Npms`HF3D> +QSȮeJcߵ؝\4eF ;8CgO5&h\.>J@9K4<ۮ~S=UW Ѭ\ [ ;ډu "'i T*Q%= SazðvSPk}Sn^:%v}ֳ^dMT CI5P4 TҺYBP07sΧ ~CW"zDi)>RHJmCrF|oL'#W7(K$r2xUt^Q1FqD,fibta?;)Gu <Jwطo? 3 2@ڊcstu8w'F'*J8o/Ύ3[׳2#w!vr3'_;ͅL386!,j.o%rKkmox 0g`rdZP^]{𹣻o-3&O݅oV\x|"@Ӽy 8cni?ښ ?y͘4<˫eT^gWy$de#iAh/n4xn(v"^f:~Ćlǀ5}QXu([1D6\xJӢ0c64ڃ緞9iG]ZZRxy 0ҋ>].nhYo]x} ^+chnB 8 *T9mWBǰ֕EHw %x*2ӰI<0Bw~#t< B$rT/Fa"n_l)˨_4TP4WՋ&HSKSu?"Ad61fD؏C6LHIē h{OQsʓ~=2yqa,yhi3V҆gT:ĥyʅ0U' d0¬?g=^o7'H&<23*ec$)PL$PHzܪxJtz glⵈʮa$C!t8O>vz'q;V-jē%XU|Ͽ?;q VϿ/GƁݸq28 "J[FScs'cسMdԠi.N#4ޅfabN}/A2+`c_e1޵O֮߀~oxc<[fLD&01o<ǿvիnÐ _jtQd0 q0F.` p:|RI8;^a2l/"]|j#6mJJOPI\~yQ6SӤ<72C I0,o*ī~xR!ׁ7u/ ˰l} |'ck4>dqg0ۑ9o?¼B1\xZKǀ^:=\[nϔ z*Tsgg+ YJDY*r w { Sԋ-N3c N|^'HEł (<=bѩ㕎)uj5tU _*ec/ݲ}}aRd7Aρ#FJd)+͆j|?n]h acKaȪeKy#0c8] ꂋnoB=6}H*D2?Kwߘ dC {,b1܌`ggcQ'死Y9;wҬ-pfEyW\X/4t3JV5]ޚf1@07! -z<VF&ȟ-w7 C"k1nbŢnYx@o\p% fvJWԌ{EDl cQ4\e&s~Nx%T-%4 #Ȁ^h%u  {a!F1Q c' 33yp.zJ$c9e@r ElǬP%t(TT*^>4}Qe6 *Ӝiy&ӞdqT唡 O{CHzdNNizW)*n!֟a?3 6zJ,Rcӯ@>J^-*N '+\ID%$(>To);^[``B(/)`Ӆl5[Ʒ[ $ NUL~r}5N{6VXL& nr;l~yf'ZS+R}UW6mmz䡦ִx%]KO+z>ĂC׭YD5XD!l2Zgܳ3LRQ!qb%yScS,D^W#!LdHHO1hP$:A# Hb [&pɛIM^I^ b#:&ߔ w0;Āew `A Az#"&">:8 tsz0+M(70z(g5R Jܤ^Ѐ'7<\;8L4i5sP#0 ck#A d߁vt_oC8 hm5LalN ː+ua׋#Xg!?#?y.Š6!/q~qLdr~9z_?u7B?FشGC_DS(3|-{=zs7DgY$Vވ_I}&̽9oxTՍXyzd&q@[.ʌP^z{v"nǒEln'ih\ϼǿ%KP97-EiU6fg8? <ğ &!Y0B(DkY.JCZ-8mJt ̐!p4HK*LQ=^Ksf+[ȩI`CG $fb"';>Lwlxn\ό5~6WVMug o>|&FF1!{pCp0ua&c"XQ--߹6e '; v@ޑ!8xu 2 lD4Ngo"FFPh">x&Fq:uGaq5JKʑ6WcٺJ1U$`aw`5yx(dƏ)^wuk0.P20)qh!aN4!(k _U[*m~*)%@ktt)')Ԥ8ZrMջ>if"חڏ r]/$A%qRRG~&6;ԪCUPTδÐS6 Нk^~df!Bdg1/Qu'pW$iBnm,s0.jC"8%(__PW?j^PS{'xc΍!>Ž^7`;{;Ci=z@g=Dw-BՌLLE7Wbt8X_ ~gixA}/O:'΢c8U)p=h O|%t &9M\Si))9~tGÛ>po3=OT8n]liDy")SJ,["*"IrA?F6,nů3h\Yh?6 t|ޏcO`nhMӘ#(BIB77a(Μ@q6Ҍ-baTf^\ ~E9p xx̓X|3M8ĀHY:v.' W6𮷰gqt"x&=8}fu4#.,=peJ/o M#kHN*Wt)ȽT+yV)'M1NBb9ZR:Lt>m]PҦiIs˝[ŏ|_g. Ap*Z4Vs9\pQSZa-;03gF(6'hz NW56}: wF0hO1v&*99^%s3ѓ0y?ʀ\(5XkG;;WyR({>oqhU ) jYI+i=! `~ x~O4;ʗ/p^R#(/FM oFNv8t!2avb蜀f[:b]jZG D^]jQB`܇`0k4sf#./lx39%I虪!oC9-$8 YzDHHd`?Ibqf)G"ċk$}- "t 33ZХہ 1# L֕2o0ZЋˡXl!jȥ>R@e~ں^Cnvo3O{GaF&CX6Hg:z}; &z3>geB{ rQ6#>Vs/9*x vѼ|*֖A/> >=]W ; 8_| K  piY% :l}k?Z~/[˛э T 8GwzSc_PhiEptaF΃wOԈ Gtaalup!2 z(d2dJ®,a' Q|1:#8C靓cjSAJt'^{E;?k7bŪyU v'D EYlMwmhiHnOAƲ ";3 v6zQUULwܮ4>]fo\dPuWE^tITK_"w5Dˊb?CuE)l+V:,\t̛PI<Ў~wÞpȏG:f}ꡔy([.Y ?£?9+gHw9cC:.dXǡ"ʏBӃ hIlEySTޏ 7J} Gf`Y &/ g&lÐJ.y EWIxR0^(lÒ#y SЌS?XȍQ]lj@ndfK}cQ1v+1w pϢ=<\ ,""b&8~ G$zn>*Vϓt[HD"=[7n+5Pm*9>WȌnQ ޞ$Y9{ 1Cl @Ie76sQ9ED *"kob< {ZeE 1= $#yyy+ <7(JKeSONDI2vZVZ2ynt-C\fph)a[$߃p[P^d]Sd:NP$+W.ϞI{C&)r P3#ۏjFpӘZauUeZɘ fe _hIU|ꓩxLf/vFd_.g'v%!IK\6~_|MuI) e+t눸 ӟBIqiX}Gґt #co~ &' p? ],d nA0@h,>d*ZbhD{Z-,7'kS%@05aNX'جa\;Xҍ63Ãa9ݏm==i b&آ1@wcn,##pßXFxY*bjqY=h>,wKOgâ&LF3ouF#?:ظƾ/2Ey8^~k'6lڄb :)/ִ A|GKLvG*w9y.0YZټdE8oGƑ"qlCQ,_M>Bf8w'^Ń#l t{xஏ~<^lrkC~f:;pp^FvmX^vq@ kz=V[^޺ixKZkT14S2^Db)GSZOc=V\}] f E~BzFg翋~~\wx2>?I7c-1L^``g x1:! #(Ms#=4x&H E@_7Y tʏz'yŠ$|x0J|2s&Br5{$$ϕmaO$;PsW# f!{8EM:$;C>9.GLIɡ߈c 2FCB voӝ8ڍM7mBKk J\.. I5,U{oS?ћu0KeDvRu78fPuh4=$5M(QDZt: 0&]H&b܈"Ag}KQ{}O+M"*8;_CN@2= ~W>׷^_|(()E~V;O=菘QUSwO>p>|o|nd8 }G,cޱ~R3m+F/~Ӂt:NĂ%!%H[r@Om|*.E$G|놓bE~R83 _@nE#ͯiz]y83dÃld*1$Qs"6?iqb$XlT|yO)91:]ŋPQY}_{,q[90YL{.J}?C%Z1x,PJL"cvF4ĩ3r5{a7.D]U"Qe^±زKK/{߆`rU$_y5X2Iv<,Z}~+6 dʚ3lso=B˼l^3WR";o^` (9$=r6_</0fBQ#KOQΰMI%29}EϐֳE65H(y+e?.0U)޳]όԓ/#4:K >S`o}=$t|uw0/ۃ#8tn5Q` lϾsaʼ%exgـn?~i6X(|wϣ$W@؛/{!ckCy%I7?~VGк46΃KDHC  29=}=ܸzF'|Hwsp}% nu~ǒ5~R8y Q\Z7AlsWS}񐷒d.*I&`ST߳Jĵǂ<*!?nvqmTjJQ;gPW2>kjjPQQSmص-xs.iKlr\6>N.L shr Em*Jeg'qD;fevzmLr-͟# $UV+g䕙R[K"D ?g2&/&[4Z'Z)PL=A{' |>A,5AHL1G^M:&qugL5RH mi|3nƊf d+Q^9@[W)aQ=H^ibc]YEҕ+0imFv9BT6AvY 斦#~BnMDde]b^EG_8o琗cђP kMw݀9f`՞B7[ ?|aW#ӪR&fp3`X׈wV\w6_Bd_R~eGzÈ75GC}# +( 0xI&!-眚'Ey' ਟ+(iaVe-̐Z}z:gx*U@JFhjnB]}N<'cOia6rJ+x̝Si:fxxUڏr#)?_ǎ߿AD+q yƻTjh[ $USWM&q>[" %cdmQ ${X}=\1ـgC3)lz0ߣw0_R.f@)IZ⺤z*T&Ω$L5I:C\, h]p{*s`e[|wNJbNUM;++QVUyc3F/\7j}i4[9ĩ(LDQ2C++6ވZNsjS}HO=s2`fa4/[`7>g}Swuiޱ(G^2j 6vem5x5GJ]$`RW(h,m+7htmUACIJ}5=׋Ύ{}v he3$h{.%]*BӔd,S.[ \鄸 ?][HF\n.*8E>QBӦ˪F|5NP CW ,̱ 8+$ H7Q0q!$ IA w3 fY79f8홤o꒜ǒ" 9Pӳ s#vNlN V')%"ÑFCu\!5`(=gg{p#,VK8!6oz'1<m[nEzzq&4 BŌ8X8@8L7\Y\ek|bV6mf#m} <,_07F oؼ96Eۅ 7oD`r&ͥa.iX嵛];o@EI1K,̀p$} y 2Tsw2)%MR4T5ʝWK.Y%$Vq GW9՘m*W[Yߪ`X*-+@W?{W.ECc2,r#Ir 0a0t⪘QWo?~.Flz/ɝо^۵GE TU99(] R "Z 9 &(:Up$ɘyb"׎&Ǥcl  EIR&@Ɍ3 A@tBnyEz*'[Cߤ #q^/%Iѐ꓄3u@)Fvlk쿣K&=lHLt"-+ Gi?SR{"D}#gM >А;{041;zg:QFh(/'Ϣ%Yv>CA z=N`R<рH:v{O^u+^}9ᲫyYp9Ex¬$#dF] >?"zFøip%z[qߧ>D, yPb0ށx8w 0~c<ӮR Ũ@"MP]c A[f4 Fb,؂ӦEېzY0   ȓf)fۥv]c8qm'ON0Q_] ӜiTCQ-Q#7R}OCР2A̶+:Cu@X Aq<)›`Hz1D Qrx/r%R)'z ptF.$eR.$y6Q4~/P@ݨ7rEwCEBrs/bՊVLxpftP;Yb{SB8s B1 OQJCQE%&F=8΅dlNcm,fn6-_@ gbޢVz>;nߌ2:9x_?^zyܶi*}3c2iAۊxm&u!Dӎg:صqֵ>+x~:Nùnݯ-!ӝӁ3Gw1vyV7FGGpl'rb]oY|rzX`p)KUQ+i'KeTwxxw3{IuKOO`yO"]rw?ػ}{%odO !%K,(*ΪuTVmj׺G](%Cf@w^na 9ϽsBkc ܌f^p6; O#sޠkE_)%T>ufG OH32pσ<̀#e$?`w$uդ[C/ K[)q5%d&I B EؽQLFo2e@U'k깙C>lSFYv?RQP\ wW͇-%L`%ka뮳@}'Μw![X*7[6oRs갢jvCYAtapId0e0W0mF5Ɍ3" ߬^ C؀ G/߰1()ꆑSf`{ r5TiY Gqs0b[ ٭kt&a̴{U)'g@NW\ub w܀3Yxy>y0uݜn$'߇TVàAKvO ٝKYGfVn6sy?=^~+< OfoT&j]`RRLW *R{ Ĵt/-# {lN|l%܌I$[BJj?r6R ب # ىiHCi{LcO43ELf [^µ6xn~hmmA]M=cM|!--#@Nng"Ѹ2IOJwI3 x#u5*"NޑMܿ1]i~0ZIm4V !2,QYQ d%PH0G.QI[$î@À."ѵ ݣAj5=CG{h  [ {licɑjG~^ ٞΗC| Oih-/'ɬ>bx2&4jK.7I3tzݾWAaQov8la#N#LZPo`> 'eh4ԓ"dv;u=B=`z?eYL,3]<֝kks4ąb"B ZW;,G$&L@#-G(r[Jqۦ%+;/N1dc Q-r90#<[:^$uTuP(,G܊ ഐ==?0^I$^ʘJdg˦>nd+R;)@S=)}U$8Sbr5ChƠ Ul hyn #v\O#q!EƑ `$s^Ƒ hT PQǍk!E*.p@}Q#Hr$ւ/ e|Ĉu؋HNMGnn.kp58Yxw{HJAT lކLf}婃232ac7ߝL@49ΎݖF$-TxȪ2dF>lnF}K+ltÞ[[0\0o6*6afϘϋ%-Zd+茜 ǞdҲk##Y騬@>~-L` +Ն`}g܈A2dTl߀)VdgÚݺaxk[6vJzd-pƤŽz] rL@5_D)#R^f0J_ҫvY4V^FqRTFqJEfhFiFDJ;Q<ޏٷ%-]~];Fr~DdQ(*hB`M/:@+.S#-b+CWh>9`m?c.Bb:VQ _"i虓pLupGi{DBDE%B Gĕ T]kA\("u#c`C%L3QﮓK/ˍjT?$Q4*ʍD|OiJVVbJ=ҸmPвL6iޭB. c邗U V^GmX~_*Ū`Y{W̻LTAmd}o´3/嗝{{7X;Xx8 /\4ٱ d Fa~f.[af띷fF-7W"f¢?-[à#E>z(DC u-^^Ç@kadžo`Vo펥 _KE)]e;QQQMѷ*]2v$Uhb©p@cg{Y%̺7U`gm3>sq PM =5S|Cyi#l25))L ^ 4x}Uwqy/j21 ̾qy.銼jX*MBPH9aQ,4SaByrU܇^\e[8Ơ)MQ(L%jaCNNenN%8TfoPW,(ޥD31h⃽ #nh;b.a)J\#Q65&hUGRy(gRA\uv%xM|?&ETHЈlu^U$U d cNL0&@& 2.s4zY_I>y3i*{c.,X =+ A^];f(ev *d]t[R%p,%3 wK{pܥfYn ͊͞~[ܟ?cLZ~L ˃G|-g܄|:FeBfVp0Q։fmu.eSFj$1|~R۫`01b مTe@bK4 6$2Q˼\X'Xgu\&6r αYv. {F Orc;N:hlA2Zy0"8 lpSkw]-qJ:ޝR8ƞzp1J`o-V ``r \D2LffڜAFtHJfFe])uQ6b/%M0.@Վ4TQQ92U!SVJwfR&#bMRc6TgA*3bx?HTrBEss'QINB aJƴ#^MF ^('zuMcF$O*Ԗ-(?'<9- 뫏@@`,P,5uR%צB]ƑnSeIPP>daL4^Õ=3M( s83c3x[;6nlCUNdnIjX[U(jUۉQJmb"TDX+t[rXNHF)t5` /i0~JSwSr[`Hj=t|0HccEgdv)5Ъt<;B`ˋ` F; ScݲXi;򐓙6>5Q 'Ł~f[&ʋ܇RR ׫7b՘zT+ W/Fzn>ٰ۠v5-_cfo_v T/Gg|هu`ɒ/)@=kOjP ӦU%W[ 4xsv&d`13,ZͰK5{vD݂%QǰqQQ]5!XT ><餣A9!S踖I]zO-d)vxrW%&\:/.N54sV =_۟|}hOܶ=x垕ȿb&(ъ=dxJ|E+-ܛoƣ/ܭxU(\1ވmUzi5솺^lvSJ&- bjufwGw.Vm,0T6ٍXjvzre<_y0g^Z;U0rsqU0ܱ@Cvjt w}AqZPݗPTUu{k&{>pWw5ېDcutSgX .ӊ 3EI@iiir,إ966Intgb1B .]cS&P0r%8LmEh&u֝ff.8 n.NBkCVMGJݙRJ٥`,|(~x}]  #ЊҔ1@BdViɛ[` mWaN2vk Rv8@NgbĈ$kZƲ33Fӓ&ͿBI=lѰ֯@ۂ,| 7Vwv0hDlݰux/B&;W~j>p :=~V/EIl`-)=r ϡg!=Q66ַh_/pt@KM#ZQڧ <4q<>~gnW#O!U7^k~ř*-j ¨}Wwz" Mww.Ĭ% D iU LdQF c!-ԴQ22i$ |ϞHrxhnDqnO߻d˜c0Yӽs+ p|L̝@]=ϭpFl5n‡槠mxϥůn[X{n| |zno<~Vv-wWrF#:XSQ^1~xL:32)q߁4]wP'Rh\j;:B%EQTO>ހ~KFS .ZxaĜcGS=CJGM]] .݄y\h.ZeTD*ho;q1G4M[{khQf\j~ OO31`Fs YpOW6K`(n޳'+qf˱o6`G) &Ql܋΄s5eMvU۩-[[Ab=rrhz8R(M=,&;C/ @=)cx7ØnZ{ KpPްg2ii)X6&DAH #-=s͆5 NfQzᕈ0Oj? z\n7Z+p%"լG'npGT8yD$%[ݷcg]^t  b%O@?%^W2 1^m`Vb`SΘ# 6 Ґ߃G{PRܻ~ H/(Fz^ sj7{ `|hv1vgh 4r >Ä7<|9JTea 2^2DflhRnhn@M0kiXgT5rJ4d -z8)~?;a !597ڑlvA&glգh KYykXTÞNY:K%{(UQ&2kb%xŽW寯g ^^_/Q4`)i EzKWI+m Û|o,G\[4X wO*þ@24-;)0cPRx{{c^薪A[[Pql#'lݺ|eeex1l0̘1#|$ga(N '䌆CܹŘiQ-H[ JDdƤ?~<s) D\L^Cih(2Z#z߮n@%̓8xl>n,v g,Uxm}h2sisKmu/^CxcV3c+qF_ ^{>KO?nkj<;V7&$ yn,ސ{:MXi^\x g6fTT'u}ߓ8|<ˠ1I*+97[~q=1R\=͊ 7_>Ώpbɒfq5Og#~{(lxYǰ<՗0Ss\2N2gj^Z@0C"تG=<@d/Dډtz|Gphm``-ȃ@^.H- Rԫ˟s Xf>NbinjMjDdYV_ ܇&*զdJ oh0OaBCRNW):"|  Ru%fBv2g;`+@ `^wn*#O*F5ʀJ.Ȥ>c-;E? ^U"(ߧbL}R$gfBcJU6Ta_eSwݮC0H%$ɑb5_zf_~z-!8V.xaTiDBшe5?i,F.W;|5ooz up"='ƒx%S.ͬ¬Oػkff sv(NTK$}Q =Xx&ؓT G$\ᐑ7y()1(w3@cc#6nԷoߎgyr PTTtX(J*"o0į/%} ܟ7_tۓWM |^06~QF+7oV}+zZL0jʱw< s`+`cf]kbU :xyf~Hojy_oK>˨f%FA}P-poϻAgoG>m0(}cn`s ma|s3uC |5P9_XW-.o׎Eݺx5W>56u}֜9ʃG~oJz*>~\|R'/Nm~,zrh)H' <!p|hiH$QJ1TFT"qd] vR9H|H' r%Ɔ;)%:{"0k7A+ٕO@yM<OW.=r{M)6I`#Pٺ娮lz"5͌P(}ST A0EX\J# `\ \r4'2Ps볎m?ہ0ޏt,۶mΝ;9%I&Eaر2e :\+€}݊ry 0B7 nv-Kwc3yF4xUUڶ(@ڨ/!FEs65Vк55 020!icF1%Í:ؓ:_C6ډҩ1]Чy?o5oCFwhBTd`G|V t[P۰Ed +ח):j2iiš[b/Fk+*9X[j!EeaE{BTQi j$E5]@)Yevڅv b4Ĥ70Ռ͛wQ_AjGZf L Gi-jAMk?c S{zH FBh0v GJ˷¢Wd0am/2Ӣxa{g,x^'A(ڏ(UT.ڌh#a@`'p#edI:1~&L*@'z`E@ %KCPP`f@mˏ~ xN0Ґ/]O_Ё1w|?2{+..hݺux K1} ֿb76fF]MgbrD& p);>EK0&9X<R~w3RFkQ v94w=W\yfFuVV΂Ú7m7?Y-*l~5҅b+qS%cMbb|$zS `pə'î. f]I\KOgl|c>4U1:UlٴG"9@jV6yʹgوocp_tF$lfťzGEiBF.:6r7o92ܐh1.Ȅű#"3# uu:k0:g¡^g=F(e[ghhiD# hMaq҈B7+:lHNePYQUFqO;F z&DH9mR)I.(wˇJڙ &t8 s;V:ԾNYM IRPש5hɻ-Sgf7cr$Gl|'耩Lÿ́TҾ= Ywm-;G"QR 0 J GL<%)Ih;餓B=~!RSS~J~]w{͚u&Nspd6cwa˂$#Nv<Zpo o,Geu|D6O%#[D0*qZ[w?&V&GM6k ,6&\JMf=6<ǒu16-μfLp1z@[oƜB?k8<<NNk/5_=*x-(|q4ӑcS#l?N_܎fՀ{XDžσ(! FXrG߃1bi1O:RBO˜ggɰE]pUs:v%WX`xԮG}n g%\5XR̋UTc []H&k&TryE\2Ym^T#5%R(7L@TIظu/2/ks!ν5p"0Y,m¢-.P9HDȮ#J\T'%I JB#4vdUU<*.qݩbSչMΤ :8naʔTd`IgvІbJ%ujLxfGB46|zVBfv"!O~JQ;ɹEi 9\4ȉhF O=T,^O<8~{-_ݿ틶f7:ѻt4͍MhiƦk{o{NƐ$^% Kp6%䆵pӠPm/.YzE4p$:Tqp߷30fΙ˃fξ8 Mh2K0Z31t􂻾{{x*&Qh)[p*GFcX~~{C񢱱͝3y$ʏ6! ..cwW?⋸1w\/ )%&T/M}7,&b :=~>Yf6%^0>F+vﮃVg@5-<b{ybu@VdTFhf7XF~{. ҅0DKJJխS=#e|FP֖#g|2yS(*l6+נyh< utj>Y޽{cժV9dqNwȡb uC/7GEe,edeaW.0+\D_Re"kJNpU7Bͣu|?O AبeF?FSk>gkbem^gzʺ҉BC)q7~qN.pQulMF"IxiPyz,'S܄cA !TP-*l$!rͪg3A shÇP3c=io1bDҿӳGČhE БA0ЃE"G`t_i\p?@eg}q$+ ҡRc5Y+&W7(m6_hGSK)$(EYfqx[['ilق> }zFI~\{@E!!*$_"UΎ۟ C%}ӨVυH,:l͎ql0*{ @ٳ$[X 2킓?FӞQ%ii9$FMUA#K\(ss<{Bx46) 'n#BcՔqB8&y#(V^"1z%-*7Jzi҈:N4D<0>2W @$=m};ҷ%C۴RCyG5(GߜFTk|ʕx_{.?充{MLLAH^&{LPle)6yivRHPjr6kAeb)!q}=ZMڽ LZ-]* JPFXZ 53-@'ロ?7!ի1zhӧO\(Vj%FO (x^O?JY 6'"gBYC@^g2QPp"PJ4}wf>Kg`UP,1`ىeBY[].AzqLܖԲ#%<)F#QD]Z}dNlANa[Z$h=CFzʃ_oߺ]\`'\#3}]eU:by&e^A9}PpVc*UDvv\^ 3"Js&LiS-jA,`'J^HŤG}%JmVj}xR Ǔ:#G:oǎXp!?~<~ĻPՙ ~ ;VJJQUMCC\C`niV7PR#J"D < DKLľZeCŵ !@hW4rꪫxp'%JCL` PifpxFZ7adZaү`]n@'сMdcm捼CqWR,dEn!7̒59>y<Fm߾}q}„N(e dTvFzd@ D?-ٳ'ǓFk׮믿^xJ$ *4Q}蔾c$POvMQ;F,'i(ψFS\Jܑ&(SHQiXY$~>h\% kv2d_>6'lmmaïMn*$P'dtƃ cƠl5V}=NEȬṃ(۱ 0M0M<0G 2`FxrWkaJ2ªAexшdv}xtfEI$ishR®0J^T|Jt$t [?`@YvHo :Z7S^HDv7r{ꩧ\ftc/!&p6x(H \eX4$TVVbڴiy3h՚ÑKKK5'(]; &}.[3w4ɈEС 3~:Wm" hH0"XϏ>P~Jw+W y!99Bh3[0OVΞ={`%f@dQ9 ؘԴT;0]#׾ y5j|h-$-6軱LDÈFb߼\Mn.I~ĥ9)4<Kc'̩,$Ʋ0`\ytz"Ā&Q\Xh1rpzܰڬ8i7CJm "LPJJŴ:@T{^* H[Zsbúod|S|\bOAM Sh-@(w' 7qF§Hyz0[b}z"TN45/n8\)oĔ8C$̛/;Mc#t̕w$ݐّ"HM+L2OQߐI#s8&3ZW;2M<9!FDJ%w)OhWD8Dj2k[ ERU! M=&OD~`Xqz5A{FQKܵUW#EU' z^E CO4fhy]})+|M9Ҙr:f53 j> ?giT?qkRZK ^?/&8s ydi~FM%?Q5 ΢`>%FDzJJJBfq >47qӥH\qNLW^p1B'IB wڍw]?9k1bkh>m5_{.G_d P6?ԁd?Dg}r ͛wTC # )FHQBZ$$|WfzEZ'KKkw>ơPG^pR7^ pA Ó'O4*g0fj j0owzmlfB&$}k&?8!~4@Ia̱YIF԰&D4 jjG< 4 -OV8￿;V6{Uh wQmٽ~^H!@HJA`{WOWD("@zO睽\B|yX0LҳAV0@In>lnil'Qĉ@!0iє89Mm$33 Ha.42k_~) 3up`m<m[n=f|un9!sH jz&+E MVO~RE`1bmcosK/AӴ!Wm8ҚHQ#~I 8'h) Ç7|7R R)Wj1^«jW 9s Եd8e dL9ؘo Y.U`w A(6ȰLDESZ E'^=R%-22҂0a?kl4&O.Yr5U$!O1=;vŋ]h9RQDYQ\Uv1%]0)1xiLQ  *p!Ylxe?(ZUIVj|4R+}cN3>>!ϫ<a5F\`NJ5eʔS@[׍j5k֌u[iAsa֮ nu>;\5n W 8ǎrEx Lk#!E>5.RVVa @?io5F3{7Imٲe<\AT˺:A-zZL$PY-"zq5pFYA`Ǟ$aʋ'@ g"T-d 1 o7LٚE qFQbtCH7`]<AU~>C!]O P*DIJ댁j,X̄c+3$vRJNE7FF]Ns3^<,woS*i؞|I3I5/S J$%O Y'ew.Z*n $Υ5H 2I֌1jMH^u9>2N/JJA ,/[>]NNoLH@jH:m%-&6&r҂jl QҞ)_?6jB p ֭9N"T(VdƄp ' Ms`HQ(e 0+WY`l]cEpU<16/naAC .A.0;R j#+!|Ed|S*q5#afMJj5pvv5"9Q4 Z,@R/{l_{s1Ƃ?({`Ƙ^pP)6 ځۅ7eB(_ P !<#:d(nj<7 <T8;wnƣF^|OSIng-RKєpP~րFP3č~G^ӹl<2Ă䇇=JbJk@f e%@gk0ʻ}k>9jO($?0dWckx4UzQ]d?H|jKq7ڀ _4*oju%PhZ( pm\{ r)== 2m$c-ć3FQ35B-ė+p~$RęܹZJىl zͫDg7YFgXl|> nXmXo AīUW?~^OPNe smsR|~baf5c*v.SʷS_Yc[O?a]ClbW#(-NlHOM^'?EVv6wA%Q쐫/fOxHR'hpQQЬMv^]zT|@ڋO ^xQb eӋhێv1=ps2i~ݻd9gƚ?CPg;nbsM8QcB@\XĉH~I&q/Y FHHjMi,d{xF()K,qiJt~R@ryh횋?+xW0tp4Iq(U ?,D5o 1yW淄p~'zDlX ='܅o^}v͏ތ;Y0㯱y|k1O. x}Hq)y~~܈BtL4i% Uޑ54r|``ĨQk+?q <(_ng1gyW 8 ':z%Yiڵgk h^0Z.%R"Ád,wmz5O-&)>ӭd1Τ9=i2ԄK5 ڌ(#.ͥE;^<ޟPj@22Q@:pٳ?cx${۲^Y5x1̈́ &Dzf{a$0ڵaSu"B᥼0"@4?&MR.FFٜd8--qiǞĢ?A V3H*Jqڶho!jtο[˿G1u2Y?ڼp'xk?~iDyOY%3NL~tJ|/=<}컮WOa5q&x[{X|N. H< cڿB}2\?}./|t7z\9>43txGHs_?G3gc՗k-ޭ1UE[1/î E~ "[{&mxr:] 홗_UйC,b-ȱ.(Q{|H”ib;nnƵ]imTHnڴiO8א!Cڥ9XFzYϮ%ʯ%h#Z=f PҋVGP X#(_9@*;~x{~ž/-^oP Å?Cd}QɻֈA\cО3Mfi1JBх}JfM8,d0&˻@c7Y4%2I>M܀y>eI;Q0y2{h 5"e5ڨF;.\իWsјP&ݣKrIDgRW#aqC;IY\n?fiP.? x J! > G[`r1pHo0(B[+wᜳaƟnaǣÈq%^K~Ɗo"y8lq3Zg_ms H~Z\& E#OPOLh Ik4m y܆M?-Bb*(㉐}Oءn .K&cw b) ig :lN>S^o0D+њCͧ h NØ#3+ L N{[r6\PR(Qm@ayCf8\v}77 "F]Z LV+"7zOtzE3fFdNq6v|Ɏ)AE}(䥾'^Zd&ÂZKEIxdOH ZFi^:|/]LƌiމTHGpXڵ3{uغu6mݻ#h TTaw(KKLb(BL{N^͚2)Ko,IXQ6嶭[qŗ!]^Lz#},ĥp!E!T"M %`ᲾjWz!CІH2xH΄U6ex&AC5f+Aϔ_.x*qe]ф;I^3`e.4km6íXk0t{Z({( &&e,7'E`KJCbJEN(|H2&`s7c-ڲ|غ$8uz94COՊ-~>{{.b㚑W"|0Mz{Ae!=#qRF#%r2HQ&C!C*Hݣm&&ʊV(,݁Zzj@I s ]3KBt[[mj2EhT]gG78hz><@}OXTjT#ݢe59&bV,Z#Gc5Xxn, 'OfJwh"^W˗/R<}FS׾ &2iڰc7S9qz]j}"huȲb8^+`gf x$oXlɈ/O΂d߃p1Bxq$:zex<lZ8^fM'^]`btҹ).urMl|pM#1.>G᳻cc>A 0P9&3 1h=>f16<x  ̠D(j[2 ɪR>| 8˝hۮ>] W*;!Y* |C1qW1cF>FM .% R>}FQToxIcn'V Wa0l۴>ɋ ܴB.z4M,3EVIjDq B! SՌɸ8IoW\WCL$iaT&eN,X ѫ0c@7eDL @/¼{`ώǥC!*9K}F\>< ~-*e#^ժ`h'~%X}(T6F-Q+9s&OڬY8U*uY3L{ϞshĴIoN.&rtJ({DT'?n/d@~x JANv,W>Tx3pS#pި1x7lAat(LTeqgKn\)-W&6|z1)F$|l+7*ժ%M?g[2-@uEwn+'*7vf8ٍJemi#umtn-?/GʘpÄؿe=qŽx bTz:n%jspӓ!:m5Er ݅clqa@<ħe3L,h&bZh`!1 ^kM :&mLe}hׯ0D'L.mHY}WHK4:O??Vnd홬kvd׆-p ~G֔4.6|i93sL潘>зo_NCn=Rը)8teѮ*^$ X>XKR8rw4J6,^EF-}.^=d!'rmD7A<;j{őjTmD$*=zw o5jQK]3PЕǪ=Ѕhv{"^A%A!U`N 3jv ܍b>(hm&'*vm񠔝"=NJι=~G|M{0aQi@ bvYм],[ȅfd'ժ/FjQ=Vzlw%>8<2ZX` Ψ6QDt6#k3*KG HʎD<'K|bs g7;+#R`LS΀fYED l+:42sܤU,[O~TZQQ;sE 5Z(YqqA뙄!Px 1cqߝBN6ןl׮IWѬgBŪ%H7q'*a9=]RJޕ{擛#?YGVUжU?PYĨDtotLk)VEZhѾz%3W,S#+ڜ(eP-gr# /hBV$?Ƽ|vrCF\HGn6m n _p^ek5.7HC;ͱ p0MO:[}¬}Bm? ` Sqv;"Y\dA 8=~*4Ihc;SH2K).SZyHa&QZRxmvJpFӈ _'+J!+&3lؕr3,X~|<ǁnH!_2;B8~({;YD1pxku>x)fbXX) JlLY`L2[`Ł4v{NGMڟcwԭGOARѳeك\\UxhGQl{6VTИm]N$@I'K )SSR0d ~l( )kj% 5O~F?Ň2MZʵR L Ԫ "$.%6~;\B~vL/)6`@ rÕ:Cɾf10mh J{HLQ U pEWMRe7;77Jmz}B6mBVV)OvD62hPZ;w/ 5Dacj:xO"˄MX'sE(xbdB[DnfHb(+0?,s~,%}9GⳚ=XC҆Y񟛶#lL a^<}>S]ۏ@\F_%;> _|Ѣ܅e vBn|خ:/߄Mqb"Cݜg7< LƔ4onP쒑ie=d֘>:lze#!(v㷥v=(=o\_;'aǪ2Vb (BێMF \ @I\ۨdRh#'A`9Gϭl "R-t/ްP'|~HD3ivL^ =0NO9r~d}-Ǚ}xч}Er8լP@,4hHՃ+ )/<.p%KDC*AǓ^ٮN!{bbNt #C%$ Cb>. ]h"Blg=u@uF"2C ~ ѡ`v;| Ly X}#Jݴۏ|+f.hsrط]MN#GFx v5*(PPq`RƖrd L@I pd#2hjsy oI71Bs|iYSD-&h61HR+/#I4V&IώDA M!!h=6!)݈8q]}z)2keA5V9)IqWўB<ܳqwnRw `ug\'~ޝ~:lo]7_%>DhՀJY/(pqkxh[ڬ'5NQ$QY2?dڿn '} gϞ}P҈f:ş:ON-\T5 NWR S^ِe "QeUJV&(|n=fm1MP~k;^V?{Kmz]>&_/tmnYMlCӢB<\Ŋ#bfpQ6V p gU@+5O jY mn1LƹMX߽2GӦ(蓀F#Ơ Wa,e^qo݉AoD2>nM;-J{x-i: aQ݁+qG\BDJ.bہ9 =ZpLqNrj510ierz eLjJxZ}=X1x0xJ8&C!|\ad8~c3Lw'ֻQ6{s D~~]ږFyn_FkKOPdq* ^*dC<+ heN~.=p3۟u5QT⾨tڊ9c忸$IM٫Oo`J_?)ሌ1 D12&ɡ 7lᰀKRpɈߗ"C2FfuX\C鍑R="DD`hTDY8mN,q*({YEG䛜Rо|7.6PT:rq@qY)fQpa-Dir6+cDx8+H2ںm/oQeY5Ɗ #򹉎!]<.1bseU5M$v粍-B gT)VzJPaFFSxy*Z`%".]/LEBrl5€al)_5uGD F#M+3-t4­f  bH ;\ce a)ބ/ ϼ.K)atڡؼV1 Lib/ w,tLA<*+;^A>bqvl,] #Zaw!YybcbPc96ʜ&\6-[ ׇ=_}c_NmT0hٻxtt1^3S=Pɺҏ}VDJ\νB|kz냬V)2eԦgo<nIk6.N>l~LR6or|aׂ`?}5a:<4q8t`MyHAY2򲹫E̚`L[?T^K`ym[[4ٌ M:, ʚ|*,MҋWC& 㟘+EPBV a1ߵ0Nc'(Zhqѹ> gC`G- |xw{z#u+ލh{+㛧5g:~t D'Vol<}\47ce n{,FS^߱~C)ws5+k&_ Y(xED[4c'FgEZ*X ư^\4I w[gS"GckX(,QeDwd@yb4RH[ MBGCT2e˖aΜ9חDkrbK՞e喌3'{u5Zτ~WtؑSȅ76ҌQQ>\7/a>Oiք.soŀAD諳 kL6~YQ2ɄH hcn j>">JoO HuB!>՟L95O9䵻裖];yi2nہWWu5RՄڶ'Ԛڈ'jT޻mfr"l6 ['i;JwcIBeMXgKJv~B'ׅ!cqs|8c^?z/]'.¾al]1 q\w0T!>-F|ċnsFܼKnf\;%Y}&fC'Տ/a0➱wrddgr@'}kA5kڝeT3Mdqz+&zȥN}@@>Y6ó_ DݻWUNZԙ:I`tGCOin*P}ޥKΩI!t$6lXāIp)f}Xih8f z7nhg@cBk[(PEZT*~կUCX|ŒxcYr\ _,?I6eBI49>A9HNBOR+շ杫~ cߪ8 ;U(]O٭cQ.EyfDD>py]'&{Ɩao^"IA3).h=HN==$z'Bgr g^ְ\U H[-RRC'kWIM#qm7 Yx$J`SaL]ߧHR5)k֬ʕ+9W-S Drqk>H4oޜS7aJ Zb̉nV* IGD4NVYdM 6m<ֽ{"٧OHn>MSO:TmuEBĺFC["\ݦ~44]'1κ6!Gө3 P6& (d;oMQ0̰j&cs>~B]*?GWLXsx'n0^&"[ Ȕ!ۗ5{፱Yrbw!u5aC% 9-s o~${-^}y$]KL@@A'R|/py(P7$>(dxchuiI@9:娞O:Y&k۩kT\DCW^ɁdCz2YQ)Ɉ4[F⠱M&M…^x'5kUV`QTFG!,R* Tkd<97;!>B=ʷeq|xE;]$ʘ3?)?{vCv2H.!$qRUnJAgG/ (h܅~gu{ ƍ`wIS1}2hWFA/Z[{ 3xвj'VoC ˟wlޖ/ϓxIޏ H~K+Xm|JI%w^]vFA~>v-tFܹsrK)75P Dkt 5z5 eLB> ,P7L_A-9\>v4~LWR~CC3d1*ؑLVSSn~}j\zNP{ Jsa6?u.dn FUzjl55͉V^NMIl*JnP3Xc ,]_{~ǁ^0i GXs0vˀUjkm~ 7)q&\3[MJΛs=.N7cnQw{-D4J+1ɼX ]|LjZdYqO~cCvVѶm(X1ڈɊE?sVp ڨs|MΛGy=z>?侧QrQ uZj3#'QDJ+EѲ| 'pST)A z#@{Ea \p*BM ~B Mx4<_p?YZ?A ?_hGu} :*΍(:QG.16煆SVA]q_>m:k"MMҩ|+mj>O:8 D8=4?UNl<.fgx:/E7%Lyo*5HTPjGVp:)W[C &>L?kSchtzrT ; U&t *7.{H7Nc|p-Ѧ=wΌnߎ;~A_߉X4?>?#&Õ !jG LD25xgO\;%*ʼnRL˖-1x`') ^!p-I-hmlꐕ܊4(clQ$dn:98# ELUd_ *OUh$!Ȑ'qK?eA'j!%]@엶h^}~m: ;x{ cƚ}EX]N̘D׳clq% ? sJ9CœY\}l~qD6G'rMH긵S65sWbG#ZP]onBu'5(9 f|jSsA*ϳ?lQwlrvJXyc[C4|&dahϣ_" 1_7b( hoX(i횱bOqo u"V\p"uuT@]Pɰ;!:̟E /*JZz,2t\I 7Jx%7CB@ ΋F-tNIVSw}Gׯz_P!7Hl5{CyY9jPbM\SN?D0(wV9Rׯ_?=ɾ/̑5{n~FP2 `h &&)6顢"쎎EtػUB**=tlzN,2#Lhŋov-Z1cذks%f+G΄L1?cG»<_q.*|V{%에9ϏY;^Wץō)^ȫ K`> FT} :D2Ԛn5Bo5aЇb}U~2l:͉1ńf}:LTO2`m{zLy>nCѷ֖/pMÐ& =<sVQՄh\|^D $4bȈRqn^RY_9fL V+AJĹ"LNA{}VhCb?u+ exLxA"epn וb7_6q0Z4p UZ2.&ƈT=vS-!\x pz?TW!&BҴu6 زa3|Q@jL=n5;T:LK a dC'IʲO~.$)d?;yK 7AHYJb!5'Tjpa#UoEJvZեƵװݻwc޼yEtRuU]؂@MܕDW4tPNyD\w5yhZ(qډ5f&&1?^*M&".RC/V*n!U6''n2}"Ȱ %.Eьh=Ģg/~[BeG _So;[i(ˈv6f+mHrMr^^0yDb#| h4Ć?(o/c",l9LWљcQA-jdbG$)Tۆ_VDtl6"2т_L/ 1W'l-*ٷ4s Wd1 ]/LAŏ`u $z[pل,J/^Z{LXxo/cq餠͈LwH.cGaLPУw{2l#rDN$+#PV1c_Q G N{D!ƒoGi1@=mhFJ6qg1aR`#F EP*B",eڗN&PjM46"P5C P+; .GO9Xm0S:IeXz:\,~~9k&6+,a>:"Z)D=%{5ɆՈ[?3Сgyyy'4ɖi[nzD~MDCG"?dN?E򪫮‒(:!嫠x%MPRR¿[_<$EwJT԰Pj %m&#rVvXVmE2*ҳ (R*#(ňHNy7D Iah5hj_ ) UĉnGa3 D|?;eBh@eU&` l\1Q& )vev,bؘMMvG\CULk&1z%r+1-mv'@L2bRhcCL#}:ě4e%vHh46 Utl^2b,G20"el\*SctAr?GYnf#Ȁdtdne9zC-$#5'73Ғ*vufB/#eV<߇ko݋[ⶑc#qS [58g WT`/Dُ]c)#Mu.,y~6w!{=kzs1pVj~ٌ Hxu<MQՈrH ,'926#{X^L`b@YS/0$×s Cß͸\|T (&l. K$R76Jr0(]U߾/ rZUX0߃^gb6"u&]`Ch^x- S8C|xÆH^=b@37JFq- f>̑$|lNDS2(X$Һ1`d2ߩPjYn=:AVI4#hq$Ъv%/QrH)m l: jx?Oi`;ML1%Qa][ogO> h\X HR6ɓYMd" RRDCU|:I/g8`pVNZK9Ocj(`D5lwPPBQY=v)mȧjT%$ q #1[U d% OAZW z>D*|&;+ M;)fD0Ed)k].L@S9T#5lvW!%0S!)r37T}ژ-3?~vij#uHW1`t=b m+AJw ^(=LK\w>[&vM`ZATq&x IF;ġh~,[Un2b"(O7iP3:d"l=2#-AArz ^bXm*,HM1)5 ju8 ֺJ`o7Vxn*%9]Ѯn_Ǚm$jRYK n]T͍P2ޫpP`V>@ wmu 6E0rw"z'Z3{X 8 wyOEޯF,_czGJ" "D/r25+ Yooܸqܙ6ehl'g G2s,}t>,VXoT.S l) pUpjnd%O It"cfT V3 ]$ti`mץR{А~ d 1VQ @+ YC_|dhaq~֛8ظl$2hmޡ^$XlO vRR{gc?@:컆&=.nEEPjԦkW#}Tx,d4@Nšwnu f?؃wF Y297 n ?*6ɘFac`fW]>n-cy]3Ulοk,o{WRѵo k' ѸC t8 :8G[53q[g@N a=`euvkOޏT 1BzD}rY՘ET9 %nIa(nW2jch t,NdՀ R u(i]\eF Ɖ͵nP`48 ]*ՄR4.}.}&ָQ=8~A%_X?΁V2T:T5i~n"7jcdheeeܽ/s9>ţ>¯jS݋4n:䪨15N6Ef&qD.!w˗P *OJп"F>"}jQԪM6fGCБB76MhD1pdҀgP*XԖq8#r&v=An'm%@aE=(<>N,hoet0quU7@lKck猲⿋uf b$^e1C+ ,l @dES8ԘF@y<i-GqqO,!EMPUS6 aT(24f?h3$)r[ fz ëYkQ8R5>?\+^Uɾpz{|j`B'IU*^?>1y~<&ym6FYJ۲e /^O>+]O\tkDRŢEx~HII QC Hx޽4h /H!5L|B~̙ @mW-8]vc "?qIHH3# 27~jsd&KpU0'ѽ_b͜^ja@:5+8z?eɲ,m܍mL1j! $I 4ӛblpnK']oygwN dq|헂Q02oǁ#caۋpitV:Pl `[hGyO;RjMAT`x2-l%T7S}A?$uNv*OBr yG5jj^ׯ$;);UVJFʸ?nFv/M͛avhճ)(A/w@Xoe)==r`hd?A0@r0;id@^RFU Q>o ~:@Df{^zXsak>ANU 3UP){$YN6ߡ#m&[8=64-\-.\<()*JW VQT_OYNP@R#"űcxp$P P"mݕoFDM%"q}+bAׯ_kb˖-'ѣOsAOqq <ˍGcGo+Vɓ=bΐI (zOA/a[5&8q Y(q{z⽏]E!f Ч902VtxC&s/ˀg@b F,u@6iFJC~ %iPc'/~ RG_M^dR"xVWncܖ@-h/CW“W13IK#~o.nEm3ǏD0LXLL&;4cmYby^9Bس1͎} v IpZ`fץn#`$9 Zˮ:I@4$0|P(Mo2[ lv|z[wx$p1#hĭ}L1-:Ώ4|;9( }6 ;AI86opavTsb`Q)fRk|Y?ńrI9j |BXCYP?A0pfIq5pz0OKj axꑚÇw.FCb/^xv^L Df?c Od(ގVE#INn'۽ͅPjcrSRl0 a #pd|`L6職=įJ@#oXă>ԧb`r.:<R:ǀ=Lϑvۻ>,n 9&7ڨ6:I)..,{ ˇiobSŤ~z|0d\uK6&rVWeX/ D?oĖAA$#]KܵHiN N5PL,HWq}=p'eGM-a1zh*~ ^3@CBv|6\5Όr蝄+G`HF0b܏ӡ!M5|B==QL额Ɠ}V,O7lgۿRGw yN9ܺ%[ QhD $F߀ƌ9 W >q#xDw˜TLp&ʡ;)@Y磄wu{$T!JVJAb;o* bSb{pY?tK;6Ul9*ЂaS1rt}hnz!Wӌ\c"$!%z#Fd:#xwKqPCF $XㇱEA0FDNV,5b1tT ~6ə"{)?UAAbY y(fG=Nd~g.zV;UU0mwHaxkQ{XYcOm3p6a0&\<7vu7% n'`E5٢ir:`GT]w1FN/OczxwThs*F\?}s/ҿ߿wJ\I09v` a5YpdtGޔmSO=Lx }뮓v7&Q?~ۏDBXAWj붉)>߸0c F o]ޢ F!q0nUc\VG`Mu '2hAzlz8F 9ٸb/^\ňG`eǥ:1/WE@-Bn*-eBz^vT-wzf f2'``M~J~vMQ#:-҈5g&*Ejf|3zn %'_< fí!e9#;A9 @I*")ۈWf$exJHZs #=ńLI)?@v'OBbݗ] F rzyL >㉘PO*0־xwl;~`3-N7!(bw5GF=!u:e:ac C7)jtHvH2lA _jOr+g0!FeT\%ANNR˛9YJ{#hih:D<NCUx6h( ŧ|(^Ku/}/F|m@GfHA6/ lH%#`o 6 5ױ6?0U Hq Q++B:.^?X-?}M(qa;`gޗ~e(eSH Zz)}@Ԭ|=*.)XpnB]:OCt|`m'}8)Faz ܶc,?Ju(hBL̜gB;P]f²wb7%ATK'˞k"H9?0lZ&MMQTHZ#`;>\G߂j7,yvOe٣c0ȶ<K^ID")cy,*" L! |~GHuc==~>c @iF&J ~YԬnC/Wz+6-]!W`ԏP?i&&8fa[(ܜ]'>ha3 ؼl 6 ẽbbv^xt oEEN>&7k}$A I [Hp^Js:yѧxglȡ-c7ID? L?T DN2[hC{9!CF(8fQ$vV{=X,6Nq/Cqջw܉cFW7JQ!/,@YS!?) n-`GSDΏdcp-VSf;A[T1;)9#!1FCH|zw!\at 8<-`t {`OA1g0Sk@44!9M˯0Xò7C$= cp]Cqy "XI/=:|QL{K(Ӡ Ma0+bU(ꐞzշdUcOHcYe V$ +UAF ّlʽ{|8ye#tއ\G;zP\NeSzx( 9e6Eԑ pH_=>,f7ܕ vSc!iZ~&d#ʆQR<>2Vy9Q*ܨ틚je 4%HJþOv؁ye K$c-{AMjPVS;Xi v7gUZQ07zFK :~K+hA~Ho:k[ڇvCF-p 1P[[UmFu8.yz 'l6v7:ڜ2%G"NFza1l#0"4dM(+bcTȍ{Y`3'!)[tػ(ܖ \;⼺ft$삳iH9Z}vXcr]".UGPe6E8 zF5HI΀楟)?nCzq*" hflv8U0loE}fu9>_S{19A@R}WLw;72)\ٔLdQOm9m H;v'WBUU7c\ X{TO_Fp{U#]w0;w |!|;"׊TxܢAzs2& EXGp܂Y{/+4޽^ƶL P>齴 {l!ULÝwgEPAֆgx(b@SQ5}0. # i{ 9j D h@?:̝g,a|̮]4b=@ "w|GkMìfb#a3gzgx٣k(9 -OR_H|뭷m6̘1t|-'_G#Iڔd{t yեDT!GT/0DA>Zy[@-غa;vO7БSb؉SF= $=B}okc'ke~x>7+ OpDI$"Uv?$`M,* "QKa^ **蘑\_HOBT!V%QpR{^ HJFr?I-r ![&E!;x )( W!+3Aej %R [bXU﯒Zo;u?/S0WTw&YͬO>Xt 6yL-#-˙4NЍ &QW;P׼~OZ#;Fp "uYΦLzlhgDzH`I*<4V! 1埏`ͫhD.Ύ/ u`(ZFZt8xɔ* ǹcv3 z5#yDܹp4|٥D:-9_ j@yX{Jnw_=)QW w~JkQp o.Ϟ?QG4 -ف+7_?̢,ʽL=K Z(ٵ#GpWQ¼y8Q˚'ĈϕT9p("BTQ?HLni $Vj%)Dod%MdLÀ?{(O-G+y"^v&Ō*I8<3)JH.GSY=.']NgʔkK|m!F^2~|9c!\;qwfrk̓D0hn׈7D}eq*oK#B%72͝K/!N`$) vۻ u< @CnkC|wo!y%]7a,/MZK DԠXA%ι\nKo_;ФBNN.'%͟Cdm*-1Ruy- ?g< CQ&y ,&Y=9CXEO,+QHi9)$˜^?z)PDC끻#-)ϧHq# OPHk溺i5*U%GEG; EE r/Qa[ş]w_'0"O*Td+ې`d$ Imre =%qrhs&#c}*w؍w@¶ x<^SHRDJoJ/ĉF#IB$'| t&!pFrp6rQrPҋ3qcɧ WaĜqpelIR_ Zdob7KǫLN1˝\NQO&^ZrCxde:Asj3=ߗɁ]R!Qk-:h#Q GE s9*alko|(=L$t4F{}n}.TgiIccoRZ[Wo֭Ã>^W.o?&S+,,q嗟DSw{w3SV L왴;lLX+`:/sς~vWנ)瑅o֙+uc$DڒR6-!M[J$+8FJ(-w.Nu$TI'XpFiDj$@Icss1~x,|d硰OB")X>P !p)Sߩ[5r̯ºGd< TM$L15"ԦF>F-<9?FS&Q>9~L͓Jj"n֣4؀|!QV7MPu_ ? Ē8Jmn#2|#פ0LR-I6Ԭۉ( q w 9+vؒX=lzcpw8E 4L&v['-^sH=&B &`ߊk۹s'}QnuzsŰaЯ_oſKӅՎw(^%-Fي[⪃͜ɖ .(m2 ]3OFg|$!qoi&h!m)IپLK "F1%MI qvr_].VGk;u);A%Y')ĵ`+CpA<=s,6xPݹR,Q&5Br_ UΨÏ#iF3'ck8 בfH [kz vQH6!5'"Jry-|pPHjyGBlN dg`^>|h _A?,pF@Ǡ- {. R'ild[Tf3BRBmml520à nlb久L)x[{0v̸y.VoK;?ہ7<&@`RuwKꎟ pc?`4z r$UW JALNYN* ۱Pcs߆V1edFaH j JOb峟6oXS46i 1n &̬.¶חcߡFxaA1c1lTvVE}WFG_L`grx'IPGX{Wm*_\//^B򐑘rhDoZ" i&Voêw)/&oDzW>E{ !d̙m26b$Wb0|<qقwvǸo`!{]8VNrALZ5cB7*FL<-;KfI f }SDhE+ќ;.rǹpǁOv#{浸fh~>k<IMzy9)Ad3OYv٭hn= 9WNc@W7`% ͻ5k${MBQ(&urRDrwǏ{5yPM($nϦ&M J1+H$lڈhD4͇n3P }QU9`t>_63@GRY$^%bo`^B{kWg Ȟ7KB{I(ŋ* QB!hb l,4![+'orn*c) HBFPҫW]syinPAT絨ǂhq>~"vu*9[eݙm&dO酰iٿ9QThRR-USBoHkGNn.znt4_w-"ODMz%*ַm!96|i=zWFvZpFfd!-#Fdd:!SԤZdՂ6蕝;!AiB^Θcm~)!DӉф9\ب/N|./_ѱ+(ͺ䢼~-xTɆD}>7ZC5I <~]6|Sٳj X85jySwY;Ei{b̔#hVo ]W!Dܢ3#i <h {Քn+u:!"p3^bHH^H)o[ 9 q%)d"@I)i"<`[PJ$ pGXwG<>ث4>Bl9NހE;h{3U`BKv wz E"%,z9Trvs ̀gV qe_;hlTcFtꑙcQhNvb{M/EqOjS2x,«jBy]rx.[8]gW)xFpF o~L6iNISc(A!CtG}hH]y8SO?!صFȚ[!ak@`d )F#($Z2rQ  rIT2r⵼M8"W|9ʘ~4_z>RF+ DQ%+wMT8yiAKh9rRb)')TVI9*Us`@J. J---(..!2\ .@7  + \J&&N)r L#y| 9N.]q'A3yC0ž ](=1(M_gwi5^gckzV!#`C UGzY1Nnp8@KZh*fb?ɲ`/65LjitQ6|0B$^W2ef:\aHiD٠֣p=;JG] PP #ݳB B; ;Z#2秤'$>xFzf&iWuRMoB.b\y|F. 'w=YyE]g_e*OD[D5ydN$and\XI);UyDϗ$}Nz8y?!r1;7EюEfJ 9 +bǎ](Q~>X(U<*Ӌ1*ՋF!jz"[87cWfAK*j:غT0i2Oc(( 0P Fg@,>h(0 F " `c ˯{ =CHJiG΄"I^~QI:iGN:'&!S*@y'9H.>[9ʪnK\DU.BZd%ڊ\~|MӒ$z'Vcx !F#X=|(VcSk &͙#rB{Sc.W` hmh__ K_ZQΣ>]Nl9y\~O3c օvPiw9s@))Jlmz^xq+hs򰵒Fk0bŮSbRvr>z't;C,oZbK~ܾU}c?;@40w`a5jNa@Qh5gzCǧv>0Z018-]D1Mv ~TZB8^;a>Om\N#L: hF9PFp~8 HIalL3`M $/mhN$sG>6Y '&$ H(WHGpFrq^ӗSg&@!)T@)'1 @qI1j|x{_܆}8 B/׉sNJP-<Vq IflY:H "@e-;$+{!0 .6 W}Q9pHza<0ͥ.A@{O 3R*XS>)#r J'B FZ*8_P5w l\)! lV-^~zaIMILڔ8JN HlݺHB.y>Ǝ" C~r(//B7(NjwpXG txnollSv} &f$;r ִtBF8{S3yU9* ,(흆bwިbaҩ`X a! o@KrU}ӱ}[:.?6.= Ғ0"xA5#qԫw~'_܊"uM9݆FwѰ{~MFZ#0d'E1?rFļV o9 h@TT>iA $"97 Sg%/xPqQfM;PFq5Ip$;0̞BP7"5g/>;vgbd[b%%ek ޔRx\TY" -̟s.GVDvFubKՖ`ՊE7] fObΞm/'N (P •Si$-(td1B0 Y529RQIuiۧ'|\FRqI19@ʼnGʔJ!|bX19~| 3ÏPwñzXJ< 8d)!$ۨqRi[$%א%^ְK.wk'0L @ ޑ+,+Wħ~g͚ŭL'IM); lbԩSx-[yÙbR )$*TqK~2΢!q7Msd>̘6kgQ)G)!6g1U&"_ i:)뉹_Cd0@.\qRr/& YURǠ Ӣ@,le/(ϷQ$>F34 IV!` :L46T]uE@4("]oGat̽<Ȃ֬A;#R աELъqzbX=}x+GӶ:FqD3>v|Æ6hqϊp`>[uy#pgt!ec-k aAz4Ea~_l+?ǝNclb?1xV=M]u UeN9)!%֎ng쑐 wiSP{7^ ؾv .e>*Up4*-er%&N!FN[1e˝rR) ߸t#0pl:Kz1c4xM HI8djTɡY(6{%F=_knX 6Z?1:ߩϛ7oTEHC _JAtۭ܂֖fdf瞱%nniǎC Rm s=RsHi9re i*+~:pykx4f=a*_ՌWC&Dc 0Vc~HJ6#%]cވ;_(# ^Ed:ň8^ ¨ER zP0O If0sG&bA'!7W`ص@[H I3vb-0#noDm]L'Vdې@2 !D$MB"4HQ̆^ʑ ~cC85wXՂdl,C=A7xz(C1f%} :߂xZ-TN|rݵϕd`2Fפ?*+9 ϒ߇ ݁V rt`*^bF--orԨBPjf:~1 cd*<L*Tp6 %Y(&H @?QϓTK=ʍ\Va&Ny޷o.?z~~k.f)Sp0Hjv@Gdu%%N;b ,rd:5W ,9>(HYW=Ƨ/ƨ[cM;ήD4L1 "*+E;.l/a㮭DJ1N,l4a0VW TㇱL!gxf!lԎ)Ѝ4FwQ5 /폩ZXK/o@Lv&Y*xոYu3P:uV&BێG]ۈPԌY \F+e{Ћe/nYCwĥ=|c+O-V# %Oc:/]F8i!bNIX XBIDx'|I99 ;)\D᪋b捛c/c-u2>9A,UMv 4QcbNrq2b y o 9BT]j̤$@PM6fuڴї@IsP Y&II4in.}K/ϯ 1Os;r^~eniOR 5kDD=~ dw 鬸18(zP1ٙfa6=̙䍈B+V傎1qJ@UpsQ!ha3iҚгo) e! XAIŤt26#!g~e jIArJȮu[ ưc6oC *#ʞ"dV8ՊApڀ|%ga[$;m=Ɋ#SQѢ,LC7Y+(,9ytE4bV] /(*p's&XAErtbA8ZT[ϵ<'۹*$Б&5RXA#PX\U?_G,}C\y˵((eҍh$w"7Qqx2))\o!V*>[ { }b8 Ln*I`@ &lo$"ǮQ<]w77#76`͛8Ҝ"K+ZȍMH*6J,u@ Lϟ?f8,opH{8 řH 1b#dN(!b4&:^0ySwk02F5/IA(a^ d4|m9^iuQLyϘ }25q]e군Xع;yEЅhm@ifk`#D+Ɔ>\v7;f+mԬ.7e+4Qu **lChhxx~2i#^\%NJr*9h$D9lŊ6e" RKBw%᮹{ 0T*Cܩj&FN/ĦZ0,ŲտXo %aCxqp>'a̙(b $ӔjMb6|juS O@ Q̐|t&P4qjZZZ3e/$y+j DR$W^PUU=]QKH)}#&0yRTt.G>"A IiqGb^ʍ hʙF\R#썠CS?;&€9p""PA/~~NMhj( R4JE$4Q" ŸeB4Yx= b5OGDI1VK}L$hF(o:~RbrHb1n 4oڔh#NO.q\ҋRJ:gN/>F~A7| fNF.l1{&"(WJPʜwW&of r,w=5X[82R30nXpH ѥMU fr 8t `Q GRg!k$Y'k9"e1l 0ve8،"R,9E|FQ5-#Gۈ 8b8¨*<}J8e}3酯$wf\>KH`nPh&UpJVBuػcXYSPR^T"șU|k5B|^)AFȦFG>у().19mEkS%,XZ%U7zlnJ|LZ`DM#O jZȍ-T*tLGrJrz:~wp7gz2J>4_[7=P?D:tgS ]SuNNMY,-GP4)aصGDyӗՊL6wA)CK;&jf`8 WA`SC]T:Y\rr8" ? *OLI$U$ @%w@pa>Ҋ2 3 %e HG^ 'WF=b+\;SrZC6h"qٌ5ؼv#7wUo =ovQNT]ۉo8WH g7nKTP7 .uS}pJ HJ䚩Sv@+Y"Tל(S+4d&KOh3A״Qv6]Irgu,**{:4z~4<ߧ'.(ER?-PJXIK;/l zN'JغKP^ePĞɶVTJ)(ض ;UENWƦ:3PTc>=3 "v/߉@f&6l>G zgK=F%Jce5twkKtjP_soou# k`UNoDň%kq5wq!eNTUM|e}!Vcei0mO>h†ՇbM=f0CǑ& .P_EqE3Gcv|dB"-+rH2 Mj13gBճ b>* *f]P̃C쳠b99TrҙIʯT(A剠q*o6[HS'מz:UQYo-&xn~8c.PQF1IPMD(Ge-dEjmmƶ[8˔?JU S.ǕYO*vS_="O"wT0s&`CQlWrd*0t=Ay*xj,OaoL86UQ+z%6RFV`re%}5"&ɫ0*J>x5z l{O5އ3p(q&n._]ǃHɰ#w1;8yjn " w`EOv4A$kw|V0rTuD8X݆r ?yڪ2xKte@9ک2O<\wwɒ,^` B$$p19lpqV^?3g `Y͞93s{+;>qZ8M8p$ #bao=?scŽS-21&狰aX]g`,(_$߂Cȝ%09`JP3f'zi~p|\@U)1y X9 fv4c/>Y M"<ȈӃwQƇϷC5Qm_0P%EӋJ[DZAYQC3Tq2e -[f rZnh.sK_B6mk(yD2-L=FJ$r!l -xC+X"@S1 B&>NP*zqa w|ET2^^3jt"n@CNEe;uq&`#ưYE(^mƘKaxpMgPe!'>!ŘN+~}`‰~+6`dkq҂u톇'ÐC /rJ04ڋN NvbK Q4MS XnߍX"wau/5X=j<엡P&4u1r\[_NFbzWo7i pҍ}zp H`y~P)8 @M D x-=/ _?]bjRm#,+-c$ҹN3\yȿ.|=/2cxؿ 뮻 ݻ?<h4#Ԧ9|+9ԏ>ԕs\kԮ]X?ݔP37S0`,^,D(rQ BAd`ƝP|Y'>{}¢SCaX@މi%@ABy/VjM-`uYVV \D !b,㍏/LI1HKHTd% =( "7)1R̽k"Rs8&:.O[ %UjHϓ!&R%Sxmh1HY[z;}Jq_䇛tuRQ*f&y `A@&4Ǩ#RH"eGH܇A!ߙEho6ÛG FS@I鲹au!E)`B i\mrzT>Y ?Q|Oo[O0(/ 6\N#D9$,#XRaÇWyTׄ&|l͡?tFh02p 0P4T 16y` f gz\H&`D]QrԢ=\bccb_hnM~63(ƒA1ᵧ;wg <݃Gd<6=O`jڦctDKʦHJC}>CA$<=r~/e% yy2 Z|ن/v{;Zmpr!rir%ÓB5# $CL?R͉v0/Kž'!^)e}s?:(aZ4*XBj3h^#. ƦmoA٘|L EX :X̐&蠋i FIYKQGwqTw5 dB݀.4"3֪/ sPL,G0G>7 ~BR?};PԔYӎ +ViF);OAp^2(pGGH#]ؽvףaw_/nǙ!(mW!Saֈ(&_Xĵ0/p )KqwǃoU^D灶G䵖 Q8\`{9&BjcNԄH9LF3vlݎ6W*UO Xr CLL,ST_MA$l=̬E$dT`5PKpӂ4~}hIۺFGG;[e!C7N(He$y DsI܄IA7"!G:GhT,^jJ3Ds?*C6t\"04Fyظ}RK0gv0`߅~zr~T`k,Wއ "4k'uERDiq(mߠ" :O?~zjj@>kM^G$֒0P'# ץ_VB RIZج6xР4lh5MB 9yH@@DUn)b&QF5\K._B>V6rQ"t3vjFY7_czĥ@Cm \ ?ES{7H,X"O/Yetf.3''P1MXqǝtPX ?z%5VtY}(͎ pL?*ʑTJE^{1{:P{(zM((12ƏNqqdefoêL{/!T˰eX?_}L** d$%7nR* yPfwi$2ShPa*}@a)L!fPB]cD?UJ~ :7=уMギˏ(Bnσsg 2?(KEPGacA_8^++kpo>) Gd&e C?m_|(s&[I+S@FCsC=3P*D(+ $k#Vrs0uL!Yko 3++v(5ͣM#)W c#")W^9O?݇X\]ˮG-{lTtv(RG`%Hpلi7_ NXU Fh=y+O>Ƥ)#QmFɐb4T@KP_r-n{䯸=7+䑃hljae _iEAFZU/Hl^]{OBôE\8*2TYyx-ןF3ϯɛ  g9=7@$9|@4/y6qn A5S>Am/%N<<*]0Ў@;يdAsTpd;w<\.``0zBj/v?A"q? r0_/@vHLc15Ƚg&%Ef~ 1:Bth|aQ>ɮFԗzgsi}__&}3xzh>Oe8i<5sQk)0?AaD/JE CȐ%Ő[ "IE#S+fKP&(p,o< ?x_H}x` ]x &yKˇom_A}II'xcI5˴TyE8k rMonWkO ib!" =$+l.phtd="26)+d8AyD qQˮ@ CshdyyC0+ǧ3bL<Ke7#:9 EkbLbuG0\,@@(7g8vϗM4k ՘R)NmFək5fJD%CMƤdH9n6P*GC5og/ lϧBPFeă9?c@"cBAp(tѸdt<^,ۙW߄6"RL{)8LEb#;@ -/] ) wPiů~}3\yؿ:>3Nףp$.B,\t9Rzog@jFb7fΞ4H>L&>T+a%kǷ ILs&%eK{ԏCRR:9{5u#FA0 ioT,msVF֡m[&!ϕ2j=zƎ_NTC$W"qGVq[8LHIlNXrb8(c YRRYF!!J3mx+Y<'T|= 7"9a#1~T 3M ]L#j9%Efj"ش 95uUj#qBO Ee6q8qB}XN}[P~u篠.|#4o?z;Yaک` `fܐbzT)&U%)P,FbxwYɢczB¢)&_ V ".LjDv;p P;p*9;Xm@.2J)TRtCAm!Rȡ.Q)`t]@"BRL5##+S*dMnp7#<]U _`v賓Q$bu~^k~px8/yV?4>N`. `GSypIuinSMXƛp ~0i`09?wLT(~67vm@/B7d^E$.15tfX{Na_ y.]|5J^n$ 2w|\z饌y.qI9V "c\qUkqzXJCSO(3B[bĈQ}~IKtLO0+]N5fkOTk9ӧbڌ8Ǣ"AIIRWV33'k ƨ"Sk`YꧬsS*eL@΅EIHl,Bbv2;"п~ 2SO{OGC~ '\#Ǚɮpr ҉/Ǎd!˱+t)cRXqĈLχOs& 1Xj[5fm $y 7u>\CɮC69-*NfqZKЭ`;k|gv4(qb[98(<:3\~s1\$B5ӟ5//eV@Qor"^o˰w_^xu(-+NffK̓%_NC+`u7"'3lxNGy7mfR\}5,T?䧫`׎mf 򪫮b~bٱy&ګ'cZ)=%l( ?Y@<< ,r}bȚV1|L(lICDbu<6ZCcm3Fb/KQK}J @Bu?ފݨᣝ eA0򣃈4d ]p@)Yp4i!#N$DZUv-n%\C5b K15ނVv>}"qrg+0P=ZR^=K@LT8cR 2q5ƵKaC10 ",+P@l0<:ϿW{DG~ LR7{6;9''PγEb5Dqċk3%wE4XK9S|>psi!/I(᫯Ȥ_SO=@NBsp]J@o vh(:/ ET؏>وQ4b"vn9#&ن1qnT9c&bXvl݈ @ϔț8AχB(tN{999"'i9MHY|)7X4AZ BކᚹpXDn_0bd  bԈ,*(=JD9*@9o2#j8 +BrW5(IQ +~" (ZC"FJn3M/^ 8Uސ_KRf<%Edlvpn3FU\MήV0t|>:IkAF^38@7i+\%E-^1F䠌OqEM^"F㲐Gr2cpP^h%4s\4 J,GC2v|FgES/ZgC f NG?' G_GaنPJ0^CH9 )Q6l ԪX|:7~W #+c;x7. d3i‰z`gN{wtڤ;k"#8**HG pal޼Ѧ4r[v^H\ԂP[[fl%Adge`ƌxGsAjW/[C+X"k1]wzrNcoхE.Q2#' NǪCDCj8N!69Cb?L6 FLF8,u4r0DPƱ"1AK]*(8q@-syahmpEE[ C%1Bh$LmƬe#Q>׈dmtGD%~aԢQ{l,|NYF f|I{\r3< _OUч!1_[ENrWY@-48`[z%v.|.y/`3MpBfO!{9~>ۼ 6>YGed!khhVlڲ(Lqz h8Ԅ oW9uɆI@71o>;q5b&MT*aՎ&"/*lWsNt-{PA*6*u@nYRQ=D^ b~&oA(E_(yIm ^ڀc b/գ$  +9 #^l,Dqp0ڜ%3u'eclhO$j7 &'k+05k7ۧ@\qD!&3zp:dDz40F"=HS r %G룍0!Pp]c|XzРxH&ZcȚGT3-ؿCDᅈ:a hŌ~$n 1Br_@?1g^Xk&JW8}sXoC$(c6i|<\`q1XxeŨ»ˀ5_Ҽ7x.7n*,N"zٵb11j RbC qzxڍHH;!'A՝[3MHL +%xGA^vV 8oV>"{GmEdL2V&V> ӊrl'B)?i޾O;xч14'f3 C*W 'nݾXB#/_a7|=8Ft1I d^ Z̧4=q1;AvnP;wFWظ"@j#ǘ?6eD (JS %x֛n_ >߶Eq~w2Ty?u =mm$"|sdQ|p޻ G-dfGOS ¦m0.' D4QYc垇qKbJ*gTKAS$3s?znPz~vKc0{PI@BLz qnkǴV3Fw@%jvPml %7I@^9BS sͰIw\$=X^DL] B Kx2=F;ψDB3N v&EaYq`#Ņ\Sd{q#WΝƧ-F"ɯ2,\2J`/`?Jk%@y۷3M#^EV\>m$h^j=Ã7?aF|L4v=_ u{p;'իYnY@LEzUVnt0mB9nE@SP,ҥKY; r^jt)袾E4ϙ3GEt'N@,O a,Zz5^x\P7gZe䡁WtQVV#GB hFM$CcotIxeի8q( }}s\~ 2GC{{;R^^͍}ʊN@Upף"EfNtb$'W{IH;A9pʌ(yކTS]GRv6v[H6H2Bl&-) J /8b i { KhN9b|f8CuQ߅}CY&&i9xs26+ܿuAP8RZS-dʟB_)8" ud(ڵG3z xoz ))aBͿ4jv};3dɬKnN|nQjM|iomDAA.6 8h8Q=FP|nfZ@~nƗVEՂ$f"!&TU'E&{"#1i$,_ i\ꥊCba6э$2"m 2G85*Td63bqNQ*D'>I& h=3RTV"'iy DZF:󓼧Sx HMd Nd57qI 4FGeh#2RN(UjXF6e r 2C5„,yJ92;P{2ydBτD,nj.+dKpxĈKDg[' ^"pH9hnu0 ("6*6J>M=6pb4* @^  PjP8,F zmA#݅ :ɐ ą~yFF@_t>P0HIvOw"rX>cKp N5`pAOqu6mbzN4TSL\P{`$}@fmA6,R$JTaڅzȈj]ٖ)QE'`:u#Ѽ3\apup@l\3 da09A H6_Bѹo_K)2 @Q@3|y+E7Riwk'@ '|4[G3IiV!y yRף"HT&\"?(Y_86yH$R)lUؾ#H4xl` p 4X Up W:I 8倒Gnڴi%SSSq]v+cu|Azz>x-ؽ }N|n=#MG|\o[>z WߎMˎCK]#*k T1y0((ɂ#&)#[JcqݼqqطFO( }46lǢ H¬c!x%Z{c+Q{=Z9z$V.Vc=ấx0d,,7'x1qMKNpk(bЏ0>ʀph?(t=MmhjBrt7&2GNƑ F#;R/}"0*M` !o' iDĨr,'$BcƋn, )G8hL(Gɥ㑗3k>8p#?:*F#äXz3vɐšGOi/LɅ0dX󉐵tA@Q,!!IKE[Xa 9&B"ҽ$d'.B)kgpP3\CVWo/N{lCј\+:,ib~qtHɎ^:~Ē$'"£EVD@ 9}}0JH-RaJ F'49B /P``ϗ 4|z6GMhhЄ<A6 >nCn> {9%\ш KtzUHi>ItVBrN&䭧DSȗ:%ll'7~uԟSC-0 e^Y_:\22 tZvN!Iĸ)#H>ywxjWb4G@ȴ?n^A5O]@Ȍh<=ԀӼ%V@$-[0F͘Ts+0bsBAl]۱i!?plDm=y 7-ʓr;f#>4y u/yKu Ƿck0d<^(,(/+AR o#GɝѢE[122{B}HALD>l]<:He" #3#|Flމ~#f\ԉ>cXVxa*سs+z6g.3Q^;~q=Z[ Ơt1MHJ ?[[^TJ`T:I*  4aγĦhj[-*TTbue9]F'͐6Zm=vS"N]/2q_`ILX76;nc#1{y6ZCmLo8 CA\\ %t:ލ?#(4Uv0tc&BQ\{GFFcl5kr90aInådpb 1ّΆD[ 8s ,}uxL(ht@|B%BQ H8)1rj1=v~{3JYN1(&D+$nq BȀZP&dBXp&(f8*@]F-0*7^o^ Ⱦb<ɴpL()U[O2̊§Cs Cru8f۵pb2AꑤBlK̹錷$+ ^,^&:; 3q4b!M.Ɵg%*e#J# \t2z~ߙ2d&- bLMv ||9;7յ!Nb4vy5:'[ ׮l 8BwƢkQԚ0?p^<XLD ߎ׎qDzO{ ĮwX:w *gy>%3 Yc=};4g')Nx<{0iP;J}i~2@̈3/(^jJLDTLH#LGGGiH EB<~7R.`Z\l0怦>}4%66Gt̩!-5p}-tۡ%܍p"/s̜?2u$-5 56)Yrpv4?Շ`ӎc;c<~6.,6j+%khVxL&#2RF瞃صS .C*8H9/r-z{JFzJDv(  }ЩULD>iHKIBJj> R!EZ1&ĉJwRu PR>#rKˡ&];ٳWUD SQu]=HAZV.D1Ǩ `~5Z}^?Qt8lVh_r׊DƤ"&6WB c]MCnvk|,"1 Z3j=t#ܨğڍ%y󲪱c)W;)lZ1=y/N$]'=cٓ^>|h>ĕI)(Øh^sokF+gWu?m.dv7gL'@`#OzM PӨř3p @@Ptu%83US,S>SJB% Kvi"RR!dGIʼn ϔwf}D}Yf$}4xO>݁&-._6w?{$'|8kĒ ͸ւʨh>ĈJNۥg 2)eJoWGFc()ȆFFzR7n*5eSJED/)) z+!ʰQPT2:2D߽IIFFG{ھkXlNǠ /[DdJෝ.V. ͂v#l4@E~S & n:a.[~"cȵ][Sj#1oK4HJAq^&ΜPfnPy/˯sHĘ8y*}R#6jSs.~0)/I%p8l;܈IDd.y8&AmQ!HfQLF>t5c$u YW=b146ÞõhqG2\:) U= BC^&;x,zdĂcz"*Onm7#0> MErNߣ,#܃(T=,ud;?^oO/nGK ^}'ޛb G D "Lv2&JDE@6y؜>NAEIq, U}E@ϧ˜9l @'R)@cN1kRkQdS֭߅vy`0JP8~'>>]S=4bM@&߆¥9HIOڗ4E'kdt& Q,҅ '` i79CQ @c>ΩfDaUkLţKòfm# ۷c'pQP[17?z rE8]ۏ`a BIKM DaxЋ7nz}z ߓ;gjC{*~tn9^N@ ѰGTvE{E0 `zĞߴPmGܹ)))?>1/21B4E& /=?_+ኹ `YKn6)#y%:L6V5Yc9~$l CUYf5X͌ԯm'@>sLI,Yy慴?؆㇑_ͅ$>9 Be1'TaHq>y5E<ӂn|񇨪"@?>tlDF~*')T* Ta&_W^?RdXh.;tcmZ7fS/v4jbiQ.;NyEMň;ZϠ1+.qQ4|(aN槲5UzƦfĥ#=Yݛs]D b#OEzh@B p`P Û(}jwA_Zk3R+@Lf&aO*X2HKAJjo22{!nW/n08 E 7*g0QOЬ[1JKFٍz7CԜ/--{+,\D_ !'+BCL6 `b2h@E+= d"d܌=Y] !_mFj<$*c!]D R L,. 2w THGȠ@V OA`uP~~r7?{ԑu,Yr1^B/ $MͦMMJI wqǽ[e*;ғecH Ckf=sbH5Ji{ 8tl"&F+ c&!-C{BBB~e@ԄQ7 (Vbx* K?8Vk.:~o]6 ;>,A.pd,`BAQS lIQG8;|^X>CDP 5سGcl#rWXjJB0胁RĆ }c t%xo3Q?)ds4Pp aF,#lB'p[X?fg˕Y:w'n9uX\X^s\#urڹKPy%1%UB$/9{ gYc0-6cou.-u:b'G9MpɻgᾜZvv6wÒN^裏bܸq>xxL  V|\nx&4 529OXCLfȪq ?dž1t ߹V9fTQ Jfl1pL> ~`uvvWY R;B[ehD@Hƾu蟤E@畎*  ZooX-T7aFڀAKZ<%KW鷠|#ꑚVI =v-l<ʚ+pmCQoU *1 f Og-%`#Xln=}#>A-.aƕY۰c~tN^бgBvC #K2iWB4!e @h'NG"HJa3D h6Y00# (K z0`@`ȏ g~1l},y<'LH ^{M&:S1}Mz+T:5 F6rX)V˪fbTqFĎU>AlK Wc5 ve^=-04 `gǥI3KT@ 8A\B1V6AiC!0N!vr#hxiZGCB,?3ԡ@pی&xwNP/|eTeF]OvL*^#q\cAAdr$Nz#9*s4ʴLJJ-CC cnUlٵ%0ۍ8r n5L>ryסޛM-ɍEx1ZJ|XV_c%0dG}1zνU6|%``'o.5C`ֺGc7#5??/=QLBk}9`VXW}Rx2cl[p9 C3W࿷Nr8 Sq[<]$CUصk'ֱBѿ/,Cق ]0OqRvdϑnI۔3308O-AnGߘ wpďcMشvN+w`qHޝTΓP /K.)2?8j({lAK$t]=1A@2s}ou5mח6-ap7S>JgNN! z0JN䰅Pgpxt%Æb#_u-) P]YtT" }GG͂QV^fך7q1|ߏ+kĐc0nxx"k<t6(^ljSbΝAtK "5 -{w[1m(<x륈)m_SV ~GgJ!ӱyQaBt/N5xONѸcZkuM^QV }J(.`c/ ) $CZ!a&B@l@E #|ƌn-̦6?Kx8>.kƪ*X1\Xc2/M i jE:>7x.Of;e}쮙f}־STUJBD'}VJ-I+NS3P|x?eݾu`T jLИ}׺?okh4C MBUriYb]{kw9Fa#m4]8Z ;?7";?|D[;g&Dz5niaKJF&S *_v`H'+7]|PTUҔ #̚ &cd &`YX$mpJR'#vǠE/``fxjpaU F(kSËY#53C2HE[ aP3$Ddt"ΦMdKKJqlݺk֯w'AڇA㫁ԇV$t`3 nݱ?Fm˙aG fJV-aDÒj<͸10hb1<߲ U`ҟCD<ƉP$Ɓ^L`y)woZLR3Td51 U!(9_fūMa@_LmƵZ8C$~^;WuKŌq#PNzSB l>y)>*\}\8/\.0 <ʕl1tf`w;U ^aݷ?b U(C|\< |5C n=AyYkc}%37k PoFD=ޝ|CY%*J1cǣ( 3.Wp]uؼ 2ObC5,O99'y(u'h05"23L(iNǽ!^R;v9sZ2\SDu^${LCBb s@`s+|U>:ۈ sb̾rW菸n8yJ/qUZqM% H2bլ!d"i:U {8he >2g?g?f*B' {4lvNvnn?'([ڜL%tM'k- 9W9AG)c׺?L 'pYqR^7v~<nX'ٟ7r,L4/u#6_屇Q5\_(Z .}Q߀o":2 I ص{'~])sb\uUEoEֱ& L{Jr R70Cjx`9r(كG񄕛v£RNU j%vIj Lzo~.]o܍Et^"~ h`:h hyril}HHpEDDt&m{qcf6o$W:lİVֽł~Y[Ykф2c`^I6JeKPk.^JA$8J[Rts8s2Q}2eV/x߭;{H4&b)+C (` G}GL H Ys%itB{s9H[;mJG~ϝ@0/iF~xqƟ-3~sGL;[oŘ1c?<K.\()܅Jn/*55Fe4S%%Pr qSF26INnÓۭN#q  03{JeiڜVQh:aƣ`\lkjlrhlq%.f۲d2ǡ k;rv^ų'/kOnZ65`ԉxm[A=d7#$6\i`ݭM} d\Lyq~uA9XV-j9J{=/8bHL1+r0Oƻob@@ /^ڊ)qMY6?u]=z%_P ܬXdQ&9Rd]necֆʞ;K3cIXFau}޵N򇗲 3?m؍䮸< =850a.3bC"?'%}w#8"gLڃ&)}@.(CZ|g@dh8rb]4/ׯ0eɮTAp׈&0@zEX~F` d,lޗcc Cc GRN_~G0f$`옑h44kVBxd$ϾPiQ[cy5}7a߱2 2 Eaa ƍаr PEql{my<x8dj17%lQ׭гҿ M&F"VA!CXBN@J.XpnukAߺF36 v2gBDd2$ϴҏdYpK?fWϠ`zNHZ ĉ%1]w]fi$/{1(@dZ ʕȌJfVQ\5C-T bBau$r ,ƟWll1;rD"J7gc%ܿﷀ֦kI`RdCs̥ ;F;;%:(UP@G-t98p2+]eQ蘯JQUYŌ*Z`26o]&f^ᡄN=aͨa@eP^ K#ttC9Hm@-xhoB`@? o:>,\w}7OH!Ig͒ObРA|!OzjEĒtMm\gb\Ŋ9w  QVg;ᅤ[n}\$ثFݷ^Ɗe1sHw{Ѐ' 2 5 j6GluSp㵓C9f.̸.4}:M@ %X<!3@[0òuMiE=}*=Aq0X3,ힿCS}pRC/h zHCkضz1NZ0zb:**4TZScUBS`tlڹ 3%/?Ll:&Z iXOpԊ^ѣ[8RusKǏ,:.sn| g52>S|\T6WjW<\@Rz]^M2@ e-rbܷPt< ݻD!kg̹N }s*!\5;wco$O /m<ޏt/U#Fr:pHRIK88kEnQohFniPh`Gq7b沁UA!ph!؞WC-w?hd&CHxT^ՆJ11l2_6I) E~#o#jkkZbBYi91yṴCZd! ݋^z,$FQm$F!^{Y>8pU>* ]EYLܠHT퉌'4R xneŸȘtOX$D ϣIh>k)4vA)J ل؀ތA8eB @n)fT! 5>Hq0`Uv=t+7"91ccp&}"6C ;j{>̟-욤KCưHJ5Zo䏺bm6<Ŀ ָ{឴C'P7FBB/H1EyMΝ1k,ntE!wd2(,ӳM%]':& Ltq cpnXe `X/ A(t5<.6k c%Q|~q/oTVp鲰}4J-'Οm Ml-Uz"͈Vk.HèakTSPJٽ cFͦf#*H.0@i|FZGcb@eu&h%RUI}ҩ! E/o@ gm[kk=De1ᖫq2ʪ 3X)R̺EҀ=[p  PXS1dx4އ;rqބ1#[dDз{`kImF7r?Or~m`$c^|E 1G&X9H46B <eٍ!:&>dx Hϊ;<v)W$ ҥGt8΃6 !0Q9 8^F(>*jpA" Ѻ;&ilMڇ& [>tiz"r&4XNy/87 nyVhxb͑صeěsݝ;s1x@>\V.юf6wMK6Y{KQ'ugB VJT>*>ֳ'Aa/<'GީFƂՏ^oAJȎPCb+ VoYo? s_| >G }?W ÝW߄rnMx]2dDHZn8:t(?4W!y:$׵S+vu*X(ðلO+4PU⣈ xq (]by },#m3 f'IdRxxj1~ۺ=@znDi M!籭z2 0 V5UճQQ׀]#+]G&̃P[:"#@QJAEifhv+w[ggww?~Y ze&.T$ ARl%S&I%-xhP$xhP+o|#pS/'|oz)]79C;҆Pf,siս⋜!}9w0)yC)}Qf.aM >`ZPӧ{[oFrbx!L?lfPj/fgt*\\_i3UM\t*&nL`nZ4<ݰ l󀧟M(m%hrEZyn$ 5~~xp3,>?ḇXd&gFchl%/X'riCu(44v<<.~()s|xd&;?RzM笠]&Zj֟o-fh0v EJ:3j@HE 6WM+RfJ8eQB\РW6l] =p$D *oDzmh(3*AiM=:w?q<~QʕvAyq)6)Tj/x*,u8ݺ&[SEzwAp/j:絕شi+ $4eهp"V'r%Rj*Q"",_R:VpP#PDuFvc0D@MpK+v'Et4F'akνf7ɛ&fSiȒ6븟"IO@\~ĭoF\b%P9D)zJ"v=C\BQ{Ø^cسgPk8܍Q?q G|gYUtO?4fO!Vc&lGOd??}q0yrRp6^O`Pu_ 38vg3][AOwJ8pcEcl' qVS"L1@?bT DRk@@xP)CDe~i!fbUi# W^Ihªs7B[0gG`(o4 \#&MU_՛`ق#2! fW7f6"R+DŽp[YeJl|b0K1w CB{$[w`,I7!ko~ ~YsE.Vn؊ؘN87 5 VhTM(*/9 E@\t(.s B|.u8x$Ф7$6lFPj (N= r%سf-:Ce>DD|]@ŐmJԥX,_v2#7ޞ k'}'g'wO:`οY\?S&&Iϒ\\ 59#agZ)Cjn]:5cĈ3*[EMѡ]{7'n/>*ILD ʸ$gy/fT#lj"͇&MPB {WO=mGwoDhH8~$&[!Sr+?ĩ#sM8e24h5X;d7Wq^9lYM:8tdzhnjf a#2kóˊa¡dmT7t_WibFZ :pI2k E;bl2&)N Y~Xi;ƎIK4%!UGZ%^w? !/EgW@VÂiP{b!#&lA)xi4mjJѹ'n픈Mӯ߁n27 *r-=*zٝ]?E'AO*p7F50b')b$}H +yi8KDYz-UUXIb<u5Jr鑮(Bdˍ-폒ha'Jl JJEMt x쒗͛y sXgro#~8Wc9z#4(2:̦wG@\;F :CB1QzaQQh10O v/-caWk\(/wEŊNiPKdzѷ?{~ HcԘIG;^xG\$9ѣ2a :^vZFuBRyff9b⁇R0+C3SiR<ؕj$ć_p>e2ocu,*ۗO8 1h~Z? >PrO#Z>&O\;k"}Կj-Mت]^R9-J\~|\^ -x3GIb$N]ϽW^cc6lXSNŝCrv®26i0M! ZHRfܹ<DpOc6Q<ţQf)Sr,uqѦő\\DM`e_ØGA>mvd]@ǡzd6`ދ`/qC`ҬM:CDF GKc8ɡR}`:NAZZOhcm8d(Αݣ|;փ2.*JB.H|Z$Tj 3ůUaQ!V,[e_,MKGbdiza\1Q<\sSx(D*K~&CXIYC!bȽNcƯك4]O&?榤GL?Ի_g(kDtAhp<$*$0eHo2D@"UG qg }e13ɤg#^a:6o #l`J_m?tO笰9{E-\f1f aςZ`#2rv/=5: 1-u7 Tۆj̸.;;e;7R~pn^%_ĆF 79p(A|r*tvʠ-š՛qpxd`*ޏp\)A|gnlgͬYlYMi˜ lGx!/~ \2FL#<7Z(Nfy>)f4=c&rR}5p轛3|=Y>c Q#QvI,I5O #13"ib#V\x?8{D^xE [nDVf,J\e;tӳֈIIɨ9nmPUE")yWm^VԉB44cAJFdot* t0e9Ɣg*qfsd$Ngv;ãqߝ~Օb|Ri5C1/[+g|rr-|u#2Q}%ib#I'\t`@ R(/w}L1 ?x4@لNQ*_^/.!pSIaݻGqD6OX"y͛w+֭^$i@,₣efg!k1k$6QRVU`œ?;6c˞Hћ5o,ˆ~2*I>#R E@ j+JPRQ4RB(#^lafPƴ#؜k# hM 3/,3q  xX_3CVȵP.dGH*~83͜r"B{eEt<C#Эa~ν&~]Pńz%VNZ@#B5E c۶<jS'%!,GXw|4LFއ\$Nqgƍn1G *J@!pǵ"Ť_Va׉xӗ0 &&^Ѧ=ju} xjPXN `|xHPRojO}җp\g̟-*k믝kcf kw%RbU2|NO ﳁ+Y16ubQRjac@/틪6{|[c#}K?[XacG_>Ծ=qշЈG{( ;+FT1g蜈=#C5]Tx;eh8ccd6ru-XCg @z2 bá ϋ48yd֭_Ft霈30} grNl]:xtŶŷ_cNh\]6a, S `Ǩ7cQ_ SǑ8RHlZٌaMxb𨡰`\WR..ľm+PmנgRZڲ"U8~ʏ@pTT)&McM)j$$uJq΅bDoLքTtgd }k/̒jңЂa#1rF6H 1#-*N 2ąKrpW7&oΥ[, j9'mK!(բzj/L tn5Oǜ#JedOD)Uqu6qap:LHݻcPD|R*)i1whC0zhQa|'Lv&B4>葑m[6111EIE5S՘qA5>f2Y i~hk@7f`CxD Ml"&_=%ZtĴn MV 5fO$ug}1"B5j2W?GO Xbĥ='@)8]Ibcs0&vbOvf3؛˪!T0!A Wj};HFJIC~8k?'tC%WtzV\1٬v4[Mk9W__A"9+Ə8vI|1sL();W+6J4iQŪQαc8EHR}G`Qd y(h̃-&3Ķ)ËSŠ[/pFs!bJqRJ #FIc܇g[ 5=^G)L8lZq;O}C**P]U*԰z=$MVW5Zшr7 )<+e$o`>>*/mV3hL1@Soe `WK` yla)zM\}TUC $QRq96܃;3ѷo?ËZ6lfdT_ )G\^-8$o@e[ 5?fh%AJ pThb@OfG,$eSH!8m<`ZTvphniƦW"oNN`?AhpL)0`7y8#v7smK i77?öq=3ja݌UtQI̮n7g;>DT7""i=Rq݌ݷurG oÈO6,CYgRTntg~c2 N`Ϯ=صc'^9׽MClxtNIBמ/?^;p0|];w?iv]s0v3ᬮbNܱ+.F?Ex~8S?w'1rK/Yiq7'0A1$z.{Eپ-B)PHbOE< Q E@ґ^B %oo3ww6Ps0fv̹iߙ0a{z#)9](DҐ7D(夤K >iW袍Mxcgo5˱nR<+E lS$A. ś^΍>z]:W#'O#@zݪo^CX ˇ D6:V4!8FtHgUVJM8(a[ᆫgo*+7sce0%XѺ%C_KV`#/k`7ћJJM0ҮOSMϴ믿fQ}wz)yjQ#?$@ޯh.Sa@˜fxo`fxU/ڏn|"b}bкU Kt<:ҙ 6ĶȀٔa߿ ~K|B #X?-+}4$L Z/N>T !^V"F>CJ۱p#l'6]Irr<ˡ#LXziOfR`A'XJB%(Fکz/y >i;jL\uᔄhԔTaW+suF&joUhl $RMxљ(& UJFFgka`0drq?} k"59^92"p67=j;md1ЄTB'TSR1y#l),;+WV?7_F?DS3 <ڠrRg*)\`(zwSkP?Ei:J6;tZ8ٝcmKK./uI!FТ2ZB(/K{@(4t'쵧^2OU?пW? rgJ] Eh?IjsU6. 4VMqImk{%cp?Y\?3aֿg''w{҇y"aޓy*)85>h84ǖRPQڡ?˟+Z4#~|ziM8\qup8]}k=Z *HB;hհ0EЫw/r}ivQ_[ w42ÊMk7 )c,r+x  H.k+~Azv;jG!-x,BRfG]xSى=S6su}mQdbEѼWGqOzx-Lţw@U=DC#N)~B 5&!ysDl).4vZ28BO{#_7o V\8ڂ_R@I%<8E Գp:aN6@Mftl߃@W;%E QP-ޞM _hҚxΩ46nT#[fW!H)c?2ԃ=) B Aa$<~) NID*/CȲ=98¬/$+ Λ7uT5(>tЖ5Y+6]lAATdjǺF0I}q.rDwE}jlq|0MD `Se4"%ѕs~ 7TWEC8^@T]m[aXf#FGBwK.vb_ 1_V8TAcݍap_Aja(~̅f*8>ROF]+X|j,G(^yvɷ Vv8_'TCt)izUxIQnV [@ JsRQYSD '*K1r1G(I3!6Jb A6#!1VtQϢrpblڱI޿ ⢣'|1~P^H3Jт'hJaPζX!>خ}KNSv3,Hlǚ=~D5 0g{n۝jkv t1k "{Evt1] lT4<>vXFLM(z31>w R2" lCgDbػx3V K~e\h =ODz`%Ƣ{зs~}#]  V<|S(JKgݯ@/YoaܒGSa6zq U=yMYHnsd>^oW)i}ʄg|ӛWFヷOg9}0(ҦЦ4MM@FceR(8w[fEd4G_~sVoX3P1`yX0T6`e=g~=t*zwU˾7#6%ŇQȗhn $YdOr^0{K sքd=džTc 1FXGn6%^uD7yҪrS.& \tH@:iW`w߳>3ߋp ,/Rs𦔹 r/#CSvgP_ljqP^+%H@׃^bHbVJN䙙,Ms(KJs.x+QY֤G1}iL-X﯀%9{qrӸ[qceB/z}\y(\sXxk$ܑ|.2ѼZ[5>>V[kwz?Qp nXVIcx|5DQn}QS]GJGnl`SD Ai\É U-%gW»?q!C&c1kq=1 _9xUd&}f07 :ziE۱c|lؽO k{K 1lo4\KQ;y%`?~P4oYNkl>L(AÃs8da&#F^CI'k $"S.V2RQ -ѡR'-BMNHo6m۲9+1yTA^iWt26tyfI UWzMɈ^tMA_3_z_)}LV硠Ovxt1XkѪO[huzri[bqtK헂YOOS|p :]OV!)g$L':[wl?z Q /3R Rh(a >3ق]ZQt9CiA=}yբ^7j#Da2jPZ D$wp9)uSƓ*qB`;(r3jBL d?;c#9*hᢓrj65>b,x\{hԛo^iODd1Ѣo]bN$e _a[Z\~HhtAـRAqYd9[);?uf$ewAvmo6VW=`Ab|bu@ `wyP\=] N=aAT&gq~Xw8ґ}6>9.Q Fo?-VAA@ʎNS㧷 x DŘ`5CQgE}V`̿兇=pn7Qm/fb! ᘯNE::鷢;/#6wGaw o?1۪qWi!T㖩c@O#3/0(|}FSjpm gA7w'A?xc}1{:JagQ5wlGςKX3׃҂(&MWMuV̙32Cba]v?gE}_rRê?`æ2Ja'*jHPy{YsFT݆60XmAme0[|&R<4AC*A$*E(z^tB˲\7{^wz*t׫TMD )XR.CN2ԕU+θh7+1flnGb\xt1Hi^b/0ZO9@HE9&ZmX[cGgƘn&u:(8%Z5;H#+|CP%ҬFJ(e5z1Q7r/>[\?ă,DvPwb=&<#'q*z>L~&\ 6:XT91}$L{w':G݉o2a &zj1jB q0%Rͻ$:%1#{tƆ[PT8]^$X ދd%dO2dKAZs+J4 Zt2]@DտHAe9o+GMꩤ|tש'N4 -(w,E\Fۨ~ȽNde޲:Ē#h3 f'ۍxxԝ0n(.z \D//Sjjo?v,ބ?z z$P#IlI#Щ4M>KF|0= -)A.1>?3๟U)Ecf9AƟ,ូ17wNo3wߛrKX2.{b|V/̚ˇ \]w=cxR^끫V/ƄA*`3H@OzqI xї`%wEyTE42 ж]vePL( {\8Nť?&l4wW}D|B<.k:P]]UqPE#T1Q+* #ͥ<8G~ۋfG ̝Yw]}-w?z8/vmvnp->pW![$Xtp#WߔؐwB^h˨C\^^/(>c0LP!A*X+U '<-:$fe.Q{q6B<jƍj(T?P^*ijSEE,$PҶ?rssߩ r ,&JPm琑ٲA3;EvȱVCK76[9ڡ~N P*qyDفq`O`1?K٩30 !!AC&fdX]}j(,˜w[,7ua(؊zF <8=$TQQǠm@?05mǂsn`h*`la PFVzz-„YRϮܖ9tҝy&CUuv5I?`(8J *bϚ-;P݃jagNjp|_&|2e3Ͻo#=%=\MMPd9 8PWJ(vrek-þ5{P{s]5z1Ϳ vԞ9`X4? ˟Dױ09T:aκU Po1|g!h|y?{ĉ#88Z(}o> Ih#!*@ >0Tr\C 5umѠ"=Ejƿz;z;@1C]xx;8AJi"쁖I{yX3{:aVh :=s9PTe >=spnX [{^ݎe O_~sVpU _Hilݒ\*$̰ԒyGךK )Q0v0GwwLyk&ft~9<3_7ol7E<,ouP}s9ϘyP<4{k1hjj=X2܂)NŔyLzG3g/t .DDdoTCW*o}axmE,y?P%K{nqz] RYN.?|ɌݺYOj`Evш:Q}LFn\x6y1|1-ѡc 8}PJ'$Y$h.$ UE)kuEkp{ԋE$zIV (Ez+INghXtK:958lv=y%Uu"S{Eq;3PFĸqkҏ0򒑬\K@r}]'PO}0>$g5Z?h(:p=,f9ӜJ>EM>SVMA'}SNQS7YU+@߱CP|i t9੧,АǪ`/FqwCJQhtZ(xs`RWI@+8""L?GvR.n0nN}\@ub8uAEe*nS{m(=![U)}yfQ!HUw=~>pLZquźOZY 'ņ)So"vKZ`-Zxѹsg@&EQ wn5;pBñ]_q㭷#!:XG]ѽc.8o AG~4uPxE,P !$H0F>l r'&5yaN] g}!^^_HMEY(˅*#؛+-b;-[ӿè7)q4KWx5 -qWAm =/jXnB RjrC} X MjugXmhH=|p-iNd8>Q0nSF+u saQ' Lv|QgM›/Erj f̘G=zK.ݻwXDYd%`^Y?,_c%h* 'ʫ0obT#7#DNĘqp!^щpq}3@y1iCR%"M|zBiо щ*DmBP+$* R~$li" +~O467hػ^OMYX"T`R4SqInX9w X :tE[⁉`!%Ѻuk7,BZv+~;yPtAQ_ :=3:c#X~#Z8}J_JTR%anOǭ߯!QPv, V)Aቨ:dM3RɅLH<u;ˉ69(/ F%z(.U!)Z^ an >_'HwuEU0).;IʁqF|g#Gjf*wD TRPKIXZ0V0jXh6mzAz;)D#^R7pji6^ m m)0VèfFv^5 7ɘ/U0tE;rXDJαJ:vs90P؇Kf|v{9o\YN.17&D51Ң{6edAS!ס6#ғcJGne@y*/%bțN.> y,K'J6!)RXWjyZl"MCm(MOXlƒyPF3#;Q5'Y*^FzoGl-?R m:D &h6ЯOkQR]ϫa!o O}d\J&aJtUOO|pԙLIA" ;@M=^/- Vs!Y;Y\~{nMOcVbKl)_Ec`LiDxO)X#]SQjLPmۓ?AIxѨޱo w_ѠH9ܰ{W"%h UDYO`ʣhֻ/kf|^hUvÏ8^oF@@s9Ȗ Гu=9ͳp5}~z>|I7ZeE%Y&kyrB=7vѾ}'h$o2q`jrLa/mn(:r*WW1eK+YXVr{0YoJ%ꡔ?AH'I9ѱO>oGJ谅G Z >ւCw!Cbt%Mq%k$k6+}9=3q{;n8LkKoDzOƬg"1}|-Dё2]ʾ718z=>zj.~[OM+S8/~ LlX/l_Ck\6%e’7*n&ҲGhlJ*0mʓxGac9;\8[(iKO C2VcX&Fb/XAhͩ)%Yp)U|5LI1UPL`c&A 什6@k؀ 4#P\xo~3΂צףߧk`T! Gx&e/,"znBCIh ?p#:j;_܋JRj4i΀=6#JCްn? k4(y@K\j~-CObWpӤ~h²G_7@нWhʏXp)Բr& J*X ;+ BA ~wGIAr怓z XzMCL5 -Gnh2 gm»{cPST.fx4lS17kjt| 09&/`2'cuܞ:d95^6e(AKI%`$z 1 }Y/.vJ?1h!J(z56\8F@AGVym HABVX74rHONAoF?ppWP8Llu̞5PuQQT _A#ǭX1QjD5QYR /UV3ϺBвGL|\^P_b ̀(!h>LLC޲rCG_vhO}^ q2<4(#.^(ftd[ Z-4+awGߛ8/RDˌh,nWDq CYEUlyU[4A|zƴ3". .u̦t3,\^J (b;Ꝥt`4n#XԗkZY kg-ǐ Q[ZEmtC :Pv nDTlo@NxN$_M㒲ߣ`̏GjB:)W {~9 S^ȿ҃_K݂^ѻޓ?pXȸ>[Hnm05xxd nW#k 7 _b̈́E9?s8SCޠ1Ǐtש^q-,M9ٹ V'r2[Pc⑔', PԈKJj^Η,O3ˡdׇDZ9h X}HjNwȵqhr]% [oBkr9bB=<>ki=0a0t~|qP}t!7W ooмK>:Kȥ<" 6,<+q#22#E80xh4kPVnO,vhZӮ Aj nFaB>دO+*v251Yd%OEXAT5NHJ@ǎY?Ǐ|v;Q $@Yex(.P&@YV*`/ք1-WetT|a_Hþ\21݇AW၂U"*ȏ2N-UZ5'#^>L@VVڐJp&(-eCIw#f jDEmpsw}V=.'iw)2E&1G[PB̙NFӦٷiY%N> p ,k#ߎ3Ep,+CCIUK)Ӆvrhߡ=W͹o#!:!h3n,D车$GʤVt~֑pwwC{Unz*-Ac"`Rՠn;f\m C/^8<|Ei`a6D848%/N@~oaYs _\VWΣET;'ð`zvG#zwWqyɐJA:p^B ֑ lʍbv+1S*vd<\", UTL&%tM=m۶eϟٶRSSaJA`(uOK0{XUwX Z$,40rS.wS&H(ݯ/_mpympP P=e;>y&؜{:GZr,4x66byըCҥj2<$.` (GI#ZD, 1( j;y_َUl3:O\̠<P"EVzܬ:xxo4d@#ҍ 4U8,j!;!3킞K!pD2C2E rG+Eϕ:h0v VmĻT^Ό ע̓PWZZ3RsA腜6g$hzi^`$IMݣMv TS5da3|~4-VZB+,g-eǏfcDlFkHlc[&FW^8^RϤbjǭG2zA#z*qTTT!&&ciYd^\KXTR@)quú~f`kqɕUu@u #@w:B)nP!t FSMNBD˙TD}6{CS+`|, *mP"˟!Q=sL{zcTCWAxzz1=t^{ %%%XZat:vdԳA4o@h`:鉴(&))HNNMR,,+E_DAA%ú+Ѫc6';lbe} P&&AGDz p  ӑ Q(Yو"`zM`-i$ry=>euC):OG$69 W<scb$VuќӏTP0)3kȼP҅&ӊJJʵGWl1GЅ>#W7"K=#V}b[>i\\҅~Ȟè!ь]`0q8*m9Ko2 F yİ{WJuszk  #tڱ1TzyL zH"˟=geg-2Z\gJZEɆ1UJ=\09R+m1GztM_cB\JY.v@IEJH4P1#&^9oq=||:|;<ýa5Q?U4{y~*!GhF*u'Gdk<- ixDe"Ir(RJOߗebb\E#RJ1#>D1XonmszѢ]K.B"Ħ%08 #y( UB@c]=. \)hZQJ CH ECx;+(n,B! E8"@>0> 0>3ǧ3pd~DqZ&Ć压D/9~ YG"˹Qǟ@)4f"V|3zKx"*I)=)/" B,i>zcsSNc%سl75V" _X,Vh@GP\z<)@d LlZr*/CQA$=p,l*(h!4BGOumEC?e|䜙,/HPD#)5~Ңݘ}Yds(Eƅ51L,.IE老F"pc-JQ KYYhP9GK-3w|H@zv ^α6*~4rқ7,QQp?7 y8e#Ȱl0VMmP9X(U 1GhptEc /~Y=>탎Z8 Ww 04'0*Gw,żMI7 BH  5G﮷UClv7(L“aS OQVYC~= 1q1hd&,Q9-dtiuuuuY dCIY83Re*+TYd9a&z*`2s9msMS0P hHJjUH./(7wsUpP̈RkwVehA_A Nje 92;>%q|$?ȉzP7*ԩ^2怳L*b*xrY=P0Y[aŌZQ9o/¡ ȟ lC"#0#v R'^ m/BY#{pnJu,rN}r7~ *CW(D|!#b{0Ah"|eԷ0~-׆Uw˕޲ҴH=;H@3,./ ^= 3Z`ˢufP4"L jcpŴENAs{/ 9;rFQXB8X%p5Gh=2j;C_ 3W_;&uސ(rT1O' if,.;P Gw3Xj*C&.4i| \:Zqw\5 jί,yxdga?z+>Z;-_ 2Y߶T^9"Gx^̹NWf-CfB:ZdOi[YdJQ?|;DeU-Ĉ[M|AY"b3aQxfˡnYd93P)TFH{* '~EVp; &`0<+3s-nq-&=~?CĴxtjm_`؃WUW-S}xԇGs\^:jі(^` [\y0j88jHku/~G)2GսS狕J$>=ےyM} Vknj yso+Ynpu}-~٩G[F!m'p^D@R6E/)ڌe3C%{h* 2_1-AYdʠRj;#I oDfx@w-ICLz)(m`1(@ԡ32kcU^daam2|upD9H_0jvtL`Cv4% (ᮨ]WԴD^y]IBb*qyj<8}f\uA[noŠH0z#z()_hѷbG=GednP]gd,rNJZJd $(7S9{9CL^ tLS wA(#1:gL?ܛX1&-ێ14ςx,j?ODCR Z|n+15=⽨>Zۜh6smQSE&k+Y:bQNd,rR/mG$]1'rOp CePiu4 U4K S"Si*}~h hǀOV/'=@qK|O&F,XNC/+/#~vX CE 5:c2Y̰[/@Pb #a2gh4蝤9b*YdEsYQf~<1`ǶeGQQe;Bפhb U6$ţMV< s2vV 1P j 6.Oi蚪˪@ѷ-r#aǮۢ11 )}Xz<1 }X(b={MR-+UYdR ~"+S).?}>8_ Kzr+=g*8ʼn $wE@K[*@ h -TR\ Zw˹gn/Kxf/2o{3.4D?ʵF͹y>PaϗK\fe ʹ{$)z(Ia0֩9'vgB08Hcp"C2雱*!EUU6n̄] KHU6ęeVþl{!R"UBA] i+. nh_#NQI! ,dir F'nX4 k`HR(ȭKaY\#}0$%\JLU Bc81۱t3z#Ozfgi<dD!z.gwv dϿ[ɥky#يBOµA\J_(woƧ>$ˆz?''B'ـ OC).'O-IhB}8ټAl=:T…@FOB([ 8d$'W!S(9ΊP?5ldzTC_e3;mQ!VRR'nY#1$#'RL(yEQ2#xoV:A C`H2R3\Cyu๖9Ź6GRd>lT/K)&Hs18?}>ІQ2hp9LV%xO 2 {SR)IU#v2=VC,JXddq@.pTTBԆ2EgM2wƫr 8|qy%,9qr򻍕Yz2 j\?:w8O*qt.rhwvgdwgH\rr DΕ^|&J7,X_g.G0Ϥ?|}}yB)&1Vf%?絟> 4}s\mLng;۶dMmkgkmnlOvM/XuuHDe ǡbGڡ9Hy%'ZvCvE ehxSYJN,N1M9kߖr<alS4Wh7$ b蘼L8ZHCr0%f.|T5PD0|Yoscz"a3mmJg{ nœՙkL"LMO0#fyx#fbdd5 J~ )fOH*ɒ#yXDX@OKk._3R&LɠT.)*;f 1X~K od."^4]Y[yZ$Nm IKX`p^OxPi2[u;%.l(] =o(uڤ=`f(=?|w`H#|0G&-ۄk*i-hjNzh@F 2?9y(ufcgF[.O ?ŪR\w߶AKbGYQ})^_Dyvp VqZN05wu> 0v O[fd~[E^$T]Uu>sb.O׮ eKƭh$qZ\Lݫmp!X~xD6;rsF?F|sU$&v=[S<<#?r(ʄ-YK 鑊+H0w+0Px-5\x*AHAa VgJh:c3X@3Pa{qm2Zeն+>`Rg{yތx҂z6SZfyT Zv [ѓ" o0{|RLLuѐ4檱 ݝ6V=-;ے:M[ yp``ln?+HfX=fg` ڃ:%DZU?>]cYDqΒH5rhIg~C->eXl6#槯M;>Si R1Pk\'ڊV~`jB<ʊr+FYlCɌBpnj?=vx;iq(Zd"|lyPyrwPB7'/5KkEu5zdt'_m=9|>cГAۗdIU?tUfnB:QanC7a9$̄ŭ=lOQ RF *z?FB7?<:mW;4yԦ#U-mXcw .֡wl4TTNvFR/e֑11٧㪕0Cd1|JU9ڌ!as]9Af3+=Ցn ע5=RI.'uj!4 1L¦W ZeÉח"#l_r-"bFK-E&Iű_,; úߝ0A:yl̛.C&D\nn3cj p*g`6ny-K -&JQ^^1GÞ>BY ȗ(z~rNx}.GlwK@8pG`ѯ/G$Biae( ͑҃0~J8jdrrGsȃPg^sh=¿0 d/a#݃6J!ns+.n ء)(ﱟ/e+tƗ l4"RĢ'l>e{16ʜLf\8܎<(N,e%Aʊ@mI 4n> ?t-(i{R݊{d(([W&DMN>*O?ђ2BzC#/b;v2>ȱu49 4=aqX^ӿ>'15DIt39괋V[ ]1i9U7",H^zՏǩ sFoJ^ء9 UcCj"u%X.y.$bU $$JuBVXCh(&ebYB:6%<:Ďy#4y8GSӂBsz1X%'{΢2pJje 1-v {(b %١|'jaqZJN6CU$T @{ 9 ?ωC:l7a1i&vuz!|~m&Pai)̗V%73~D8RIa6 ށP{,qfڤ`} ?מ ÅZ7go@(vr1)bV]ƆmxjH Iz!sFn ~!i![/l2@lP^BWT 焁*_5U e&&*'C(SZq}( s7Sq"]Pib$~j\$թz8"C7FkV5J4o|>(G[:K~uN>zVN18Ol D El7IcI\r&}*| a!^x )1Ip1i};1J>x9Z1>8=DF(M˟$^ȁ%htomc }8̛0jI=MkZ ơ;m8D^U|ҙ*fÔmoT7ݲmn|{d;0#tأ*4ne*muͻsR!HR7jJJ[\K3jcκ#5T1]_=6qf}?}?3w/gjĬWԺ;.5ڮ 1eOo\2^{*]F_] OgPAИl[R;zY4ۗ-]=*˱#ۿA͸oAXlIQޤ.|,U*"; ߟ ٻ_% ۸-sŖ=LrW ""kXxՌ@Т,:-}uO/,FE ?~rp`i:3?ھ.1fyd3bÀshAcMKu< U0svHك/ ^H~4En5ƀħ@.#Zc/Ǵ-7xL>oz~=J`gRg |X\WE=b,Œ[ąӧe[)@Dռȑ NFbaw E7!Ka]"R4êo$Ғhu7vL$xډ̕$du LUOd 5'*mdl̆4`M B!}[j¾zhڽ3| uM`!?6Oĭ'v1g'ဣrPBiD&.bR7 L85$}X%Q!O, Lt8eFO_6D\+TEvUx[R!M\mHa!vg Ivdg)h҄ |$Hx9NE,yJ\nCCDg$8:܊/j^sB VEraqwȇoR߆1`Ws߁Xdz<$B9ؿ)ϗ\;)?H+>Pܾ&P0e_;pf2Y]|rj$(3uxp^HGc\@SܘdzI{x1yd8Ira+ہpiyβ T'z)]rsf\* ce$@#x]Sƽn͟܁w#C&*Ö!yvD@n">xH<7k^W2dRS&fSۯpObn^.xEz>O>f/%,ݞQX㋉MLyϔ*QՁBW*>qcਥ\<^5g 'ħ "< yZlReyȐ<-؏J5CRZqpNZrb|fcRk|rhIb@+b3{kmǿmj4ڄOsKުNC5T0b2[~4ޚZf/K29:XrXK@SNGv¯m-{8,T 6o 석 #&{FN=h.lt\q³Ll;IlPzmaʭh ENv8܏UCuSx9Y<:w=! ܕwMecc){цHwGv˵_K/=œ/F}Ll[$կnQʦ^>BV &zy$xd9DU|Ϥ.&F5CU.F pbB!&k60@I1mn8.2Պ(~ 0W:{tzE>Fv\zu Wc&c3:56b(˧Κ14M?( qy_zkkHjUȟ9Ua#Y8 d^O4l e9/bI΄;'*ݸNEgvM"3幀 ~-)LkepZSMT1dQ%<ŜP/ 鏦^mW9c*SB֒^[#yShX_G[qbP }&5Џ [<vHv"qs%umL@ݸG lZJ>OU6=ܪįwFؼo%rYY9U ^EnٍЪ(H!ʰZGlfY#y zjz5h~vou} * :t˜bor$161v.X6}<"#0\A߿On / rVa},3Kϑ)EOGfWO2޴(BTFGD%(5V~0e1j8Mbb>5jj0 %Uw0 >N5[N8y wD@FžqOD +cS5լ{LZiiRvv8!UUCLJ0Ų|vTڊ#'}uA@̃xqK7wذciW6&d82`ܰ(-q)]ݥozNC(In ` Ԧ|at9\8.8( 0g/M8@MGYO?g_hfp( TPh[5㕣YHm؁0z+z~O!}wzE e;o*@WŒ$01;qZB5ҭRQ#]5fqhDbpu F֣r=I,Ծ+oDyȣ.k..#Iedڤ!  4cC01\HR0at nD̞f'4u%N\Q{%?/U.,b7hRA)eZqԍBO3ur?;ΙQqKk5u8&/L9J0䅿|mw&KA?R"O8ɫbU!q\ec`ImV̠e>zSI2G &nXD/۲ Q)K}4fVӫ!8 H'0IZqC*Bw/RpfH[,f&fZֽv7ׅs+\cx>uCxcR )$<*+@!H>) mh 6.'#v)qElPX,L8R50_ +w`K71\>.>vlq)[wl;Q&!!vN$FJ=#qqj$GIYOC43>W:W%sOx H~ѶdN@v4ߠI3rDhK.ܞ'ю-,(S kBW)^gYpxSw8@?@Ƒ3?s^J_\(2#\m_'le"NZKBDi2aw@5kdhXٜ* gUo%\K,Rc^i~57|ƣf(ׁ@R{≶s}h{)$Ò蕊[0kO=_Jx(2Cq-(W{n x! gK9>rL FȻڏ)ȝ|Ú\LdrɃ:s6ewwm>$is)c/njgd :<]~g{XC>Y=^7$$\kH υRrbu)ibv{lgDA@ 3*M>2YFlx e`!WVڱo~ˍnW3-zV\-0xT{>=4%ʓM8;ʚAq-!#07d}'@ʩ0gK19iG Х(G8+L&cKL"u+egO¡m=ul٤, ?s%:1+E<",~շ<‡،]FSQGG'm*{ߐ}T_%ɊRA=Ճ뼌A>|AR9o^0>syxx !cC KJoB!G~7WnLRbV}Mr3G@{ax k2d zte51&ʿ0yթ"t bkgPli/gl7zWk[ KnM@篾*5:#f@䱥ЊNìG/jc~%*ژ۶,EN 3Sjh 2w`KP!p0#.mI;'j1ʇ8mKg61t2[ts3z=_wE{Hٿ۲P6"`IK0}L_j}a S1ԪR5;'H5-R '?6*B37|&٬Ჽ=JU&S vd̫x _ QCRx=mÆzfJRϪ`ѿ]qK& "X&K|W$kYVծV1IC`jҰ:i )! UN'NssLw|~EvY")oztd!k_1D_ ̓LAP_1ͤ1-aL"T bK»bz*`>sd޾~hklTb'pCRߞ ̻`qq@]{؏+tAE7"oX:ꁩ֏wKG6&7}2O,˜&Ԇ}"c=)1 B ᙕs96[($7. ?_SH1~?&e~v!CMzM!| r#=ݕ#M<5Vlg&Ui/>+|*t5̞$}HgMLp ̶|/2HookSxC8m'Y-5@(`L^@&À|E-rf̮Ҟw~ߤ܃ԡi& tVMۚ`m/_YlreY24CQ RRR9o*>(??|\FܻvF6._.| .Urs.wgoًQgvV|R˹KmxaǡO)9t7UJXL|{GzFGU _&v,,\\CBB!ֹBEӟX//k``+N5c&3=3Ѕ_r \t2fKlt6?9>ak.ƼqWp+$qEbEֹkxAŭ Q1Gn¥Ik'N97! g_<>@y]ٞ?yM?r<ք?!OD2O>>Q+CЙy Na 﫫Dž7(8Nx}lafW L}FڻMzcjq>ahH2jwdIVbhuwO3P$Qh)͂pqaܶ}&y%ǮoCZrPVL\ ؎pyl4``YVV4? QzqmI_.p2t{IK?Y()Y,}43^8ɛ%2sM{by@DI^(J/%t5"BBSbG'!CF@yғpc'b@?r؂ Y*(T4uc!Bv Bry~c|j<>0#j``p@-'8#WU|nH.?|T?H]mܴZ:|XlRY|P?ޱx& w]pl{ty֨W$mu녈)Wr]-a"nL{3{Nf9 hyނ\N RW`ʰӫv]krN`z$hڰb߉Z؎']5?U#|UmgW!.0g'_~c_iIטjd>O0?qT4EΈQ9^ygk}4 2,%QVXZOf=É'z)*>Cl^^ٓ>r5{h:Fݵ:jV ~ hQ^ װ,./װ8b*tlKvj{9X-3 9ʧ5xVOйiOZh=t˞ h{&;l[52b(b0aگuf1i-niiwz;6Xf eVTMo&F|Ϧ{Vٱ+&zO8U+դh,#CKۣXUJm"HpleY$WR/ytˢ]lO!$?j2ZAvL!$vS6 9˰y幄r0J7"rj{rDO|w)f&c skZ #͢Jo"gJU8V*.VHʭ![oC׭9ڽee|REݷMgE@dS8Rf$QH% p!r^#ۇzY m ==D~rK_P.~k#B[pcQmgQ5Q*v1vD,,, M:\a;eڞ&⠓>j+VA4BsO+2lBN'.qS<̾8z enB*"mGҪ=Y?68YIHI˧nOf^k9]{ӫ.s"bmzτJչ h 6 %-sC*Ёh*WAE7Bq:rHaӎG'зmUP@,dK&CzПXFN-n&j'8.LvM R  Ti[iV[~~yf2eOCEcGSNOm$J)W#Tbn3w4&GR坶 utNCq4#^oDohlh~AjR'<=~eid&\qG V{:]JPX(CeQ )h26*n$kJ6}/uTa- ѩ cE.XB*)h[;UCf|xq=aI^̐D'ز<АT &"xkBߤҙ&7tdC}e,p@RgODLv 5eD21&Me~yeo0ͅ!}IJڇι([;.\ZtY7\kS̶wHʛQ#Ӓ*/| KM)Tǵ#Q%!9*^-岋-1 '<\Br=K2נ";*ÛNי9$aƈş0: U.d8$WFE8 JofHޅ^cI]jpFEh(ghߤYaKr[P*W\t7530΅jŋ]5E-ѾQLgޱ}:Ց.[wkr#bz1.X`Q@@N=aϧvih/"Ucc'c  U.ڊr.n|dg P0.XBHfv%h0? E#L^|37+QGujkJ7hBǯ-؍z{8:;QƢfv)wt q(CFm44YFxꖪA'̚-İp .@]wBU^ qpDuMKrOr׎lED󋂎J06=rWj$zj_SqZ?1{({פxB]~ UҵIsa.nfInxL=̷ºC8KAZ~cy),Xv]|,Ŕz#61FkM6>N,]AF _4AprVN5ON`Av=h(?PތWK,umW`_ l;m;8Z&lz3l}zs )۟X]qiIIN.*/4;E,{Ӌfu^\>^H^";xOs~r sR6L\MI>4)JF#]K<^XOn~L?A%3TH3@N9鳑>D09яV5+f6# T$[*|66\. QQcS]ٹVL ŊsBfPb'9!fgk(~t-A/4n^֕OzT NqwQZ1\g?e!éېRc,MQ< >_]Y+^-^]ߑbq93/~UP/nALߍpp=uƺfHwqX =*.FPZS:G ۟(qNXUE@fUeYOj? g.^ANO%s]1 k$On)#UJ ~D]nE"ްKy-\Q2^MoW]RL b<3V^!' DL0>D 6-.4[0#^hxm Jd!QNeڪ ܐ!G`W E4ÞhT@ wHܼI1(K5)?a89 UAK@m\caDf>u Mwg.Erԅ~y(WMHe*ͬ1yBBqZ o 윈M#퐻fa/r\TetBܼRGT!#Z5P6$!Oc/\IDiQAkz9[aƇ rc|TL?oeHDFVE2]*FYd41:xxzsGC[H$q4cü׹ TVuY0εtMbX6h+~Z{P?tJC=E2X cJ/3D`QY{#=4lj*7AzI7GaMDol=W .FA/Ou> _?PDV"{:aj"{8 R0H_=uxt{}@ϖ2SGno=,bS(R0"Hri Zf?Olʸ2ʘ2A ؛jVniՌ *O,z%fLNągCP,#>eِ3̫}Iր[HW?w˂gzm8}ٲCLD[_!W.}H)dNϽ9xafp}4#PLwrE*k 2/!ͦH ![DXy\XċG|)MJ?D- 6C5𒒷dѩ:Qs"?FfC=kw{khM݈;m$}  % pqK\}G$tn1)B yCE}Y&##}d;oD*" !N= %oaF )\?7k+vd9wzg9}煨!aH<7O 8S|G0fo 99#Y=MZb"3fڼ,JUE`Z~l-RQ:{槼YP"-7Y 3E.[^7"7ŅPwKܺnw; #hMR+v}J07츪"Z#|x'J7iL̈r"_z_M9YjPIW!1lVӈG_77p`rS~%ARieg;g)݅X}&5Ճ\e ÚuCDL֕j"ĉtILΖmL֮ɳ|˷ھiMϯӖM= Xo4*6n+n7N/\z l!d! H!^haX7!bEuQٓ)f!c5X7(oIlޫ$f:!P,jLqZD?a&*eshW7y"#dDh\= WZUUN#TjY%aa$n[k\R+WǂO{ !x#U51UGbN54(=c&Vv?/hPGRWUXVٺd:̍'Ga#kv%%Bm{>a [ +ư/H*O%rAFT+/4B`u A}5T(}VʷudA>c/ }@3:~[by#Cid4AOoOX&WhC:CNE\!h+Kpnptl_Q zGk޷k@JZtKf}UV:MGx<]l{4M|=6 NxoaŎg}^À4iGeV`?Z ƑOD»PA4@Ƽ5N&\WOmI_ZZD^b?Aagȸ\lEnw;wfBOgmhIVW(]33+^nxg-bL^Ox<~f='?U G'G@$-%oiH_>#߅$8}Ƙ@RrJ'pzlyVTW2*bq!ԭ=>sFff}oYO+|`B`"؁}p d:3wNٕ ٺT%o&^ߋ{p{f YVqYN j4PS? hzCFWLRѺ:hPQVYE=$\0pnT1n]xB!:YۮUaBCȇ IqV^lj GJzu>J$P6` ^Oߠai+?cۆ- Ej`䢇2x~Fp ?iE 5:|x$&I1 ZզGҗPb..w^DJCf,26^ ŖC!;ԝYUW3 (S7ü*WtnLK_lJ5d[ EMX?o&dPB&9le?0H!p"0PdB-x}JxTrvW#$2$!wZ<}Vue3O1w-\T*yN<#D|FY$y.O̼Вxsf;4(|"l4- biqJ?BJa\] 'INBJnP,~^fS|U[oBzç4卫^&DgfDd ?uM@;5 by~e߁s-IBܬ=O䒽KQ­^\zJ_ӻGK(<)wTO$Yͣ^bE,Z" +BO# ._EŒn HɔqQ6\hZZ~6RmHY~JR3eՍ)HVBT6[ :T/-у%% K,IT6"Ƣ "Zԍ߷Rs}0"a~jm6zB٠hr;M3B 텢 ! Xտ!AL}s  ucޛ~z`(y%@yl-?6Xg)-YeI&M+ћ|i K@9㱍)@d,OGC %@D2FXC3\,_e(Cj,|9TXb.B4/:pSoo@T B+M7N>g̸ս #i5@L6&d۵rx3y [~! \>QM0[J[ tfI;t.#$?EIyvJ;ee,'$03u lN A4QMjg#9֢.?G.& WBW?m7,Fa) 'QofmX]=O< <0RK۵VY[}nH٨kD}Z-B(y-/ݪ6BoRq;Rc;FݩD3B;֠?ڽ v pa5 O?$}0RsLVF .p %$b[C] %:)h͒XͿ})lB:FiqըSF۷O,#8x$B 䀂AJ`ufHiKi}+?t(q0"QPjDž+"S/MƯIy݌%u'oQҎV=|l] CJA" ڎdS-rGkr` NaAݱ)_ fL^T?냟w guS>w%\16,4iہ޿4#tb^aJQLbQ?潮<1{MOyf-,|V"C< 0Mā"dKLOuds~Rvq7.J{ҴX|+*+^[>]9u7HHB#/ )N[n)l*֤[d| }&3p~:@i0v\ Jt?e |^N3Ѽó"T1i/]l/f:^<nnEz1%U+Dؚ3[4Xm4Hn7Pahx6Wr`[ZA*RFo* 1 y/‡6HӤBF0R*MJL7nH; QR IQZ7L^$&0:FplK÷[E{KE\ASMV(} ʟ8T&vh|xB}= ^?Vv&$^2WP] ut-=~.,ϒlW9T"^`$\H夲H@|H%BwfMH?Փ͒}+EVZ((aʒ +;ezsVsOFҔ=Eջ!2w[Nl}~` "3!H:0CɈQx6yǦz)A:wuroL@ p(%<02SZWn>4SsCQ*'Xčj!i 8!o(G2LGB|٭ALDE|P=YqfsZa_ˆf:Tu0݇3E )݀H`7ж"'ikgTyf3"cE/-q9IDD0WUW ߐo_Q%Z܈JksXTi_Ʃ D3#br00_MITGXF nɈ?=K{y?uXfmI.حb]Mn]vf FuQ]ɳ\4{/ -5Z~v}1<5|~;9P+- L{vԺw\5.IVҥ.[_H8MsVIB/:q>xz d>=P .B(I d R{{vͥA?F~P3O ^˖/Z7 FG;z> S:{+TofTw91IVoxCrCH\RT  w¯hW_zE\~!'"H9Z:o(sM&}z1mO^Y].X%V .Z+pĕAa۪$H$Ao,ZO!k00I,94R}%̯˾Rht#ٙh91p`%V V6q ).[ߑ؂i.VUXtCGK:\u18#ݨZ9 y ۢ&גjOSh7̪6e-lfdTQ#kyO)8. Hqvvvꤕ <%AiO&XjQ.7C#\"x[G8.vMhU2e,NY( TK=-#~J5$ZJ>;&$FZjٻMXAL1&6buDf EUđW WQ/aMޔ8תLmlLFJqqjQ~խ!4uXM} _PaІ+ 頃gSKRkjJ0a7V#gc]Yv e*e|iS[GΜ.\ 8%Hwf!2>$CS)Rx=`U_3Fv b#4EQ)n􆁂ש#2]yWlt CF 8mT($5Vv{ckܶ0NŻY@f6P0 PsUqƫbs{M"A_lPL#F͂8*4 6:]0h*~W Q~".~Q) бUKxav~bQأ%`$q!*.l1FFɒDANҹ_3sӃ^7x1^x)fn@,* sA1aAbh*A*A%G|V+g\v4bR7-tR VfnR&Vs.z2qUYcd|L4tI |TAE{G\-M2a!Y"m>C8?JE' o^kgT)fv).fF/χMp|]6 o1YoQZr/F-Ed|`r/Kw!x\';qoi#!$MJ7DŬ,9ꚛиjM+6s|Kr9SOFX݁:sR M3>TȭccKU52例os݅o]I@N s{"SQibjA|V{t+cڴ a˷m"*Hfn% B *NY^6gXh$s02}9r{u(쉱( pQPO>-IJVI|PT?Wv(_u|zZʚj _] ܯFLcYr;:sj2@jE>̐=GOǤ&@T6[#Zh ]g8zҥ"r&mm9=dy18~4'33%B~}, ' 7^aQ_]ײ2NόU&cve՜˙~#p3(-4~`Tz=QlMaf!U#|!dzғL S.DA. K>a.?Y*%RT]Z=K'1̫ 0>8G5 =*Ɉ9_9탈Ψ1 Kwi]RcwI`zYPڛɉ N]V2{L,r9HudbOˉljXr·t>g2,AUc>^1w/D,O]n{ 3桺MxwBe\(uY`tp[ٴUCȲ)Aav)4vp nSU5l)7φ5eaҸLXE*f)@8|ifH-5M>q)⽳rMeq3' iw|}<M9(K)ݧݢ2F#q!>Ԅɒ¨nRHmr4ZȱZtN+\shG;%eHѰbt༝`AϧanRLo]b"9cs,Ptz~/xG!;uUf(*d`ɳ mI%Y/KTpcTY$}qlL?|Njy> PSu$ˠ$#t+'uq/BU.н\}gMuZE=oKK8}#y)'(ǎtG\E4{Iny5,!]5)U-IspHA.(GvјJ?ٚ )L$i_ȭ,SX=qbҪX &k.u?rM M&^=2\?,Þ՘eT*lv4]Y[}0NAQ˅Z rUO5ǎMYt4ZǦD"wuŹZjU #:1Dedj\X?jwj) 8GU+Ηe/\\Yx1c̑\&6P*t~Xx 47$i#S t!ʫ *3TRᓾp(I^ r+12%[߬?@R XLa8LulbVa䕭0՞{I|+,ꯩK&cxv_'w)1:9f#%X5DX#dM<L. ig;*өlE!qߠ."=[I%h[!/`{iQE\Z_ 'z{.Lj4ȻX7 @bȝhEjE7i:a+ ^lYmeqAFuna~SW7~wMܺp75|1'[it*i䤓s8Y68~O+i8U$G]y ZJçd=KH[-^8 &S1 YGz_J31Wnc'*Ȩ|w\q\K#7 m@&YwRkh!T&'?p:*i]J{5!\^X7U &u||([93tWD Br0MbK3+V ]JDm(}¤>!Y}WbQ&Us%4$~L 3PԔB Zr49JP*BhbrMǬ Y#lʂ^T: .*b4icPA )Kwe[ )SlvT iHBW&E߼b\XKc/Y6JWk2_0Go1@6'͸vB/g[Nf'j!xXcScO )P\L5h4b)Vt5J?)d#mo`HQ/V>x%T5+Ckd!cRX 9B2I@P\b?M'ó}I~&Vh,u)N!^ˉ%FKsWq^ >Iݨu6}O7P (Ryp??n}7l*'ճqxѭT ~QՉ]Z|h1o6ӱ6| K3q/Lj*eGNZId:f-z>~iP">;܄Y(I}gQޮ2QD8܎x:' vA*=.wW'L)̙y6+ܾUTb]E"9S!`yZ4sŒ-yNs2Q ]~1tӳ [lfi7g]tT6oyB0y-bNV~(B/; lvV퟽~Vg D ¯$ Fm۬qS .i.PUp4m8jCFq1ѕ~W|x74=7HND0yWi7H:MIMT/DLҝ:ԟh%+Ef{JEڟV}W& OᄅyG=Ȃ*C4i\w%Y'wQeYUd®@ztͷ[S:׼G`LfĈL2$DZ^53eEx#&OP/ J6«(hmwd3 F!44Z:)Fo,ˀW%k$ui5vuLx= 5*k^YV- kx$?J&r ^9n4j'wB;ˑ](킄)%-=^L& []Az^kE ,Ӓ9:]oΞq|w Q`ҤI#yK E%f ߥ>rRIZ^)-ZP03k\a)R!^" ,sіiҍ$)zcFiL}8&$rgBuNq֑WkɀM_ZqX5piuu@jQhPQ\w}6d蹬W/'<jV:3MvhG|2u Q{n{$CjӇoKw?y s>KXPt\]["{HL^gTv/Mi};⤞o5\WKg^l\0 ZNLe>yw,w^LA2g~;ƀ>Wd̙tFh|u"V#\4Nb,oLU"=jWl8*o-Y՚\}^o0r[7ݼz]s5ʮŌ)We7h9*XXmxe7W/B=vnZ־qpJ @;@ar&&LY¬ɽj:2%0?ܞϰphw/IB Ґ@Y?}JvћM'ZgfÀ pݎAqm Ʈ/rfYpu`8mr ?jIcxty;RxiM@+OGLƏe̲_qwsԚp!c  渳|6mFq˹*c-H"ExgD&:$@TIzko?{jGmhWŚ2h31ĞTE:}[95N1QE""Ji*nx|xQ}1ih: _c{2aI gὮhpE+)% RLxÇ?bHiCxɦ4Ccѫ'JWp5İbFP;l+k):c$Ѣˏ)y ~8Gsvo$'k7[9q#,ЛS7H; Ȑ2[#~Q03Ue,? *C9??b&TOU>8Wv`N DC L)'-5E;DqxtM]\*E}&(%ifFx8W ݊QQkzS9z"WҢ4^ X?5G᪍dȏH 7V6_'ǜӼ=~!2ӫD܍cL4*`ǰ1'n{\ jˢ%N ,`E]+'3S}v\OMk]⫰pb[˰y0eGvDfY>#>Dl~/\qg:vC8}ĀO]?%F E㑳bMo׹ ?ӦJRn,8RβT -Kb |7sSq2i;*dn̴4)5Fa"ʺ-b0nGf/W9/@j.??l{ߠ /}=Q2q$? ]KnnFO/S{3tZc:ʫ\RaX/2ww܍awpXEӶ cM!l۽+?s\ŐB0es+N~ 8Jy Ӗkt҈_ =R~JVEHWZz5M"!$enXqzMCYS1'=r;rk8z[Lw)y{oȶM+YF= J}5:Y/Mbw9b4DF$lψٳAt'gN|Nw[pn`{qĜOW !<_-@vcDBTr 庹z`1$PCc="w$a.Иxt|tlS3f)bm`M#_Aƾ|I_nشh? ]K#(*P@w9u`.gfҲT8qb++I%o*.~b k\'KcyB̳1ʡ t sٝb[Lڵ&縸ۛ2!*+Roj`zYX6҂ZJD?b"@wM(XG2e&}W֙8~{j;bBt뾛eI-XV'P'֊9fVpZoEz~`K;6&u%9V/ar+)t:eэwjuLK]M|~L'':=_FvNjGPCGqһ$'xK-КWKgY S%MCsUaOxv1L#Ъy`5{/`䖔(s7Y9jԲk[,#}N: OwG?4EjBWΑ9iQ/.[a8p;ŋ~u<gKnM-/`ʬcy-͋f]?Miл?M+Ŕ3wgWh+O}LAݫ&8Fy5pQ\* שFQ8ϑ&j+nJ%CRV8)VfF\#&>y.koج8߭uYArҕkab&9'_  y743WK{Y?c¶cW7\B YGBmm޻GOf3Guw9Շ1 FMsOG2rYߏ:kc]Y9s' pҞND+tq8sAarNgwke <'p ~¨t{+wZrhݽ|_)6 i$WF?K'3g@g>ZHy^:[o'!$ ')#(\kf;©7f8b-!ȎDU4&*齑 ĞT!jt<4.2[{u?=Z LT(}g됔H?36'x5J@v2d*|c1}S7RPN8rk9]lI4f˛*^y`ǝDWSZ˽F8j3e[w픞:{'6a9-h$k Z6nt"RC;= P^~\8C?¢Ҡɓ֮p˵j U>>œH@*V0}X&{j業O\WN-k8ŧ ʽ1zdۓ\q @s($/3 xba2W*$,aТH,jD\ WfrWlNzgI2~O/ks~ YON`qX>饩jp7p)6d_\Xxoe잧",H'bv(ijJ;iwX2hV+4gOru3>"#~Of~9CxpȦz+]N4s̮rP:99ǗNQq+(Z^!YFOڏ}ƴh|=(Qk H(![bbަbsO%#9;wz bH>t$r0ef񗎋&x;}5|A*3:cy~ܴ:t*BQ宾j]p+ ųttnE=NL魡ZM-L2i_Ĩ1 yXA]d%dN,92tݹM۶aJʦߤ7yG!.y<LW1P@ ]ȟ{t<]K܊L*̾IMy"Ď%>lu{2[dCa%ѳ%kKrS3XꆻE% KosWhrMr5_2 op+~%'ydsN#%F/JrM%V诤8DcyV.6]xZ9UFJF1VJP%b C$ۓKqEa޸ԏH[h Q_:{~Ucg'rGJ/;Ah3= RX>K'uH'tRMPT5#G%!E("xPcZy룈(AAfn:©z<9%@“T>k o` 3byDrDЗ_~A׫u"B/_%HO=d߸cSP12U< <*&BIB3*NJ:b>=")C_wfU]SfttYj5G޺عU5F;(]5&Y)SCIЋ6uqǹ!-_5Ys cDU1U)vW?^׆{9ڀ&f Uqw(rI:Vxdݱx$K.qlA8srœIͬd+SǠRZz{S]9t$'ټ|2p|urcҢTNUۚL1I`U43,4r#pnTKvHݾKϭ%?")G&;5@'6ǜ0l dj·h%ީ.@Y6AR]luwQ,ߗ2>Ne'?CkuJ*&I7gv0"-^6@2fz3.ݜr,7طt4[c:4ݿy#uVN^HtN¤Dj H'pLf L_3;dBĻ5|`.UH=uЙҲW2Iw4K>rwғ.קb! ! =Zu9xq05rL\X˛`WS!c*˾ZLaә@19i6 E>%F=AeGC\GJj j%o~I-7AuG)4HV>z:==GdIr5nn{c7>E1ehG,SȒ%*&6e73^W[VᎫSf&LŧXgLO[ѵ2n,Sň5ENU_M^+:5=[_(Uz|lmJ_Ջ?]Q|'cr<.C˷s Qѣhn:7~J0}އ4oUݹTj9~PU.~hnTg.n:o5Q]1@ O:곘(bVhtOy<9~-qV+Y ^`RLaNMeԼy(,@34^=ʣi~ LPJvNg0] 0။lZ3wgI&CJOuLQvE*; e̟HSPIVϙHھI1+8 fq͔YhYS<)ۿˡQm*V71}w Ƴnb݌˙r|9W34 ]ٻL܁(7P]Aܿ{j\]sVh/gkb.)@|ԛ|"kJ8b s9Ǐcӭ,ePUNrb;?л;{x!|qo>9\0 B_5i3>|A`|p5a,:oMF:uk)`֪4)ǥ-Xnl˔VŬ&L6s&&kbϝc{mȭLV4A 9g#ѵ%r K?jW31Id߉jk/eU>ߊ¦t7&Nh%f݁DO ;0|06@[^47R~hQ">N'ؤT_ 3 Lq~X~ҕcP?N1^+̛ d[%8H-48$1"'8^o+sSڑ蔔% ՞a@wr3=7'T8 ==] JigΪ?˩,YޙVJwd~2*tOmOvMmvi؟9^515%I,>TI(#$ &ub"Har8J@R7#rٗr`q;>MtۺlP0:1Qy{˃Y`4"u3 >}t;~ZF زs9 pqwҮjC[[G )% ? c{X/u 3>,ts3M©L!vRleKDXocbcx=5%de )ґ!6W4GܩrY=_ej2֪0y" ssuCnxzz m_yǜV Ծȍ}"4b@]/M O7w[zڲp9xSg&E~KTBZpyXt_BC2`?o`ؐԙ u̐aYDJ0B/tk4x)Oi7>&KvnhT|ҮLDׯ_'C#:!D#GI&[>ŀ^B5Cx# 0@IuriIuN6P$k(NCHT/M]tJ}[ENZtN:tZ'Y$k1]@r%)(0ɓG8?OBV?GsOܓI; m$s*Հ?77:͖>zmc1ϐ(^4=rޛM퍸?ى/+o[( T<_z/H TH!^ (k] ڵk\r(72gV 'm"b O/V@~+BP >ã8x\. "F!Lyg9 -TpO “E~V9e.z[`L,i=F꘻HjKRY'5=A(=SVし曯0+|RHQ )GymΞ9+ .r}yʹlo!!/SRU $s BVL*[sx"DCuȁ`Gu`$V+RJ'znݼ͛7ؼ%Νֺ% gk9ƅBj7ڹz2vg_*M4)#?- ||Yl_2Q5qj#K{?c561 >Gu 'iY1D&if):[mѧr2%^~AsI ]3ӯIڵ}BN5ϣ]i'gǦDvͱ#G9q)i֛^/(wME)^8E#PgdE%oooqVYB-8X?tf{;Xx{EHCz[Y)F0|GJY;׹xΝҥܼ'@T)_UVjj)$.^ I@/G{s%堏W91$$ 0Y=%mQrx~:o,U+hY2wwHdu|{(]ѝsJ_>@@N9_]2cġLPuq2t:nsےɜY{:&^Ȫqt2K64+ƒ{iZ3|ww;ӣ(c/}۷`Q#3j \EbC8׭̷q=~>ƴ#&1}atM_ dX: Zy8{b<\^ISڶx<+:g1Dno]sPKRΧ#AI:M~?d߷+.eX->$fzLIS[cqUfi˓5૱X)@u񶃘nrMi{6T8xev cak:|qU;O2-x7ά!m3_0iڬ7j#~^~Mpd_͈)t`,/Nk29/7>nࢭ#/.9pޟYl6oERM*CLƧlY!6Yd %FohEs]7YaѺ*&&v %87dpC7['7"|(^KP= sT.R/Ԭ;WG(VFf4D%R<Pʨ-l۾ o~RP|9r{e7F)nkd`:5h\Ӭ 9PbdV A)AYu(v ~>=C͛7AÆRzWRt?myO,⯿ЊW. lѪg7q!I&~`Ke Ld;A*N>;QjȬU+!r8A}ʃܧ H_dVφ4쿔] dBn3EAR羡퐊;zq1OYB..ENl"I.գ `]#Ŷr_cO3i.ƸuSKpSï~U:UBHE>s|b '!z˄C.F>?v!Ldy3n6@%^Nh[>u`A `4 '˿%ׅ|:wvn.Wtb?Xƴ]xԞ޼2I8\ &`6o0lx^>Gsq*/H{p}9ɬ*)5zvA|8{Т}+ G3&E iDW ɂ'ZI4$E/>@U1"&5c?g~9Ӌ_gbb5?l6c9nd k 1j_'wH?n^i3>Rۗ}eɔޗnςc*bR!E5;%}ϝ2*[.|S񧝘}#J)!OH8Q ,ޙƞ_N,9afkt5=RXm@W_!0u?XMyXt.>j2Ustep)֋vWQWT[SsdQ>K2zP#$soE}0|-SzU̅Igz)K썪Gdx6WR~}1|/r4cȚ\ی>lbϼ2Mlo,`7nPpxWx /p5?GAU8{7 e8=.[ Yqsݩ4(mad4eGqMZǦ5Jyqa6ʬbp?,Ц.x5\% fB)%Ct#N<ӧ9wǎ!i@jծMQM_Ļk-%r_7?tLjOP$uN ÞnS?w [,N~שc3\嬙c'ŏߧ\ҋ*ZYM8%W"QoWс'pI}ؔCPU%$WnSnaI$wt\^YnFycUOJDPxQMO Ƒ|3* Ν)x;7 tT0Gx-;Sl焹kqՄ@ %tLz-) o^_0ǣ ! =~ιP@&ԫ)iDߏH o{%Sa?`*2U~ -М&y_ (( ?5KJ=tqܸC! :b.nSRN)g$dp")-jOL )/9K4ǑxK#:nZP(4*|"<:&8Е ")RRdta7B4r\$u0:y軨EIUbt8>zIF1Is|*R;o+HGR0Ri:LI6ڄS)ZtO3 VV eol{PdΖgϞeE޵ @~VĀQC(Z(  [H'Μdv(l@;|b10q̲Re3Asڞ}7;|{T_~]=tth = ;554pħ iN&h3P@˧8wlOG۟27#^q!~\9=N~zYzҒ^C/AI:'IC`AUJ*/jV-fq7|Ϡ)lЅQ2:-`i|)0KܤoQE1~6ekR CB/HfmJJ#I@R2nٲs6ϨOQ@ = l}dIj6U֘f-9%Ph-`Ycc^㽭zJՋul\-rHVYi?/~8eԬZK>\~if+Z޽PVM}+²'T_ϭtf;5CFcbn KdgZH1#txM%.'иqc9|: u WFS>& >-bJp $,LJKuvFZ3PRB m4"ۅ_-V\[ߠ8y!"=zK~]h@ȯh4(dғ.WE0|,ՙHKJtٟkAy?ߪ[ z܌!q i{łwڍ4cm:6$V/35gskoluƑҢ-+\*$OEt,ĕ]_(7znZzeQiK0eAPtT@LOS3h@_s AsanBpsvEցI} O|97-][UIGݏΞGJƽf6n܈۩-U_FB *rgoqdIcc^A24:–7e3<Z<~9[e"U6ͱEKf%8DJ7T|eʗDzbљC?dGQUk׎mCJqE`>vstHOzP7U(6C:usKJ5 ]B*62%=a2z-N$4%@ &@X{@e{xJuh: Ŗ h CvPF!@u퀹t*ZN/kP3 U&`h=\D*tCиPJO,8 y{E+ȡjS+er.:1\)T-([(\O3N~66~^w.QnnCYkKsn[,ᮏOЭ%%%ކ`w"OOOY销-OQ}xjEk#ۙd͔tM:O<I3jQr1f`]':\ݛ|j7Rbny>7B M=}2z㺤6ģEB2dhvVaHF-R˜7VS\⣻ܸ Sv*)7Ebz7ؓT&N,FAJ2#cI]qˊ[r#K^+s}nJ;hx~Ǹ$ Ii=z|NV5P'G''r]wnʖ)G.](Zo>[lgjcjjKt)>-&=h*SSSe L&LFzyQ2[S I\$.X`~F1#QɃRP&4Sz ASA o#6r)֬[ givZwj+i:9A-b1ebNG’2<.SQ٧"L- j&i6>oٜ}E62˱#ť=X*~{W}SLK__,QcE?2y#foGIM"=X'U͖In4|lvL&RgIGN(SBWϏD'V~ y]رpW1w}ˁDJC9)hٱ 'Se0Q3s<&YkfPeZd<7R}vcF#nRz{"?/h({g/+)T!vrb!tՅѻ_թKPt)R{)BnwL"u](@W'o]za{P_#)eB )o 3J ɇ+Wp4_AZ$j(R4RMÛ܏7Wxh&X!4D>ԓxY {;+yBp'P{+$oq-L~ Y'~p4S/Eh@iܹ~g ndnFFU}k [ꤿ:C&;,'^?;|0 ="mÙYɼeѐ=UŚdyJ>ږ+R$ptv,(kIj\ļѐlJdsD'Q"o}$sєB˞3"e-}m qT?K608q'3q&ajيU+-LnvyZJG) $%`&z  LJ#D ,=KOu"oB#ψԅG*Z/eomL<<{UߠSji{8"?:cⷩ-Wm*"; (v@qw{q(R@R(Z-Z $!n+l&! _=<̹s=$M*89eڬڷdN>P. ѓsNF&\E_t8Qu'jg4%3&S3yH3 _81hdŨl{6ܺRWfPMw &&@i渓'Nyf~?;?ÎS{Ș& 1H %LRؘwzk? 3b1Z+^i. ƟEtTy˧u%W&J)} qE<:ŃDrQ0EJN<^'=G> ՚IRh~pĈ"6v^ Urf'VJr..lM{ߌ6zM%X^K׼NN1-s/IfB߯ѬaڴiC%dܣwTZ)UO*郔hoI"_$Unt>}zKnvS Q|'n$I_T;q)yzɓfS87] Y_u}9{@^y?f?95'Z< lV׿ '/Ⳉ> Λ qOٻyvvvLKl5kտ ({zW&߸Hˈst~5zۧ^jQV%_|]|\pOv9(=v"d4yO'%$C}\ͿkOH*J9Ç̞1.=r`E$\h03/44wҲI0%;2[!ER4g0ywsU:=;f#:mFLq66mAHlq]Tv-{NZg>Ҥd֜ Ok}fŤEUiN0h{֋gG^$a {>Ϳƒ7qNj ~;׹u"8̀xn%9n~4G))«.hOO `Nծ72dڵXo#go^c.̟3_.P*`RT&HRT@SS(L5󒋉I #"c 5@:3򽰇_/֧6*K^~JNKNݎ|Vm?Э!Zǜeq!C_RI5k9a;4nTiҊiOq1]-c xU&M| #6p,H)7|p7}BiRTJeEJxJgP-vCCrGJ+{LD<} .sqȑ%M" J.ۡul Le;ʶhCgQ.GB\测IuaiҴU%9+"؏tA?~t%kӠ\c])4նECӖƒ_+Z&Kա~ܪvdz UObu Mdø | f΢Y?33rTa͑1:(Iװ=Uc89Bi|lnPWi= U`C_0I4Eԥq?cz1 闵x|7|Hϋuvm '[ -E|`>)Iy>Q_CJ[˗θ9hKE8 0#3M3Ҙ6+*tL%)5ţH:87R嫰u'3FD!g2ΗD+EC>'~:)m,M*lJ;[3?r&N7FQ1_=NixM\3hXNX͔=0܈/-vsqUݑ⻢ JOciR3<.N~w#jn<g2pMbK`.שJ[DfLYz ڇ 5rȁ_+6#ɛ7n2w8;D͘0}N"zOP&Mb4aΦ - VwlLISk.!h~eO*fZ6XmE=Yi~4L譔ok ҃y+ŋ,>ϸ_+CTY]Ӧ{ $11o /Ad(Q_wu\ܕ91tjnp5fGe{=a̼|W"SlX0+N~b_ach<JZ :GWVF!L :ma0yq4d7#9q@|y: Tp? ^#I.]dQlm%r[1+MO\32a3cs~)ae~K73;w_ǃ3'k|?yonOܿG[hiיb6DT.uu"]!{ ͽǯ5qs Fa>;"IyV7/.+2jd'Щd$U d̀6qW="g׻N0h~8Ybs_r_ǏݣWZiǡY֖0ցgI-Bdn[&Miw7괡GEc9c,[2WW~Z/'LOf”I^tjcE+QV N5`3`RU?s uRXyUұMFVET+܁\qdrMuh# wO8ø:ISROL5C<}(u/㧾xkuq7A\}?ő+/c9:/;x}&gj _~gyxX8ΉJ^ qR.䮳 URkhkSnLe9jǎի :RPI㨶Ҁ2)@TRswr|jԿ"q*`Ik)wf 8 es4&+"~Ĉ03CtxF+_Z֞Ȁא`qՖ7I~ZMB4e} ?KV"HE-w:ZRn+Yʥ :C8Lgx- 3T4k,9d4FUж`LFUFnAUBP^4cy&Dԍ;yMŨ#7g#.ZC ӼLoS}N[b9BlTNJ 뒟|7xW Wff?,xd!5Ax6E*n_Ʊj?tJ~w:HK732yuc2=_Ils?=cg&?žh x y)%: f̤Ru6Mh̋ix9;1k6_ǪK~f~w>oc-?.ߖ } ›[8q. *t+u*d`dP.̚1E@Ǵ2An,[sWl37(ۆŤxІNV0!C:nS|YibCH :ɒ%˱kM]Ŀ7w&S|W".i"zqV#ZT&v>tj"E$b12'W~Ec~<=u'{:9=gh^/{uJ-dʲ5}ö~+*GӚbϏaF.ep|ֵO'սFp]B5f2HePX0;:wiS^1 : _i*moM^F)wv)ۇ/6rUZM|Q ѭk6shEAĄH+b`xJ/Ab%bGh)*%3_pd1x?%6:(:70Ńӽ{^N)LCD{hLMN ^xul>j'",֘Ҏh_\HV+<$7³WlBٰR]R>}bbB ׃z*R}m)v#2RX*jOru)SwxrMWƋ,82D<ۭeODT][[ ̺^2.&eAjT}%&$MWȏ<at.l\mq)Z^4/Yjdx~!9`AU0ޓ .ٳgiٲ%nzk{Μ9&/Z`R]Q $ݸqMN;zƴDR`29a0G*+dhB (^w?F&E/1ܯx&p{k<6_^yڼ x)yM9Qȕ?xfp@8fzOڟJH'bߛWf澮W +G5SWC֯-xVjI%+zƸ[l݊.`^]t5݊\/t#u|ugۭ^iD% EPI^{AR2~ƥ8f-`aDDDv1Cky]Mx\b0,H!i6<-SiW/{z8{ny;bŬU>!@NJFޝu_ 5BAX:o?ns!;FyGӍ~ ;F)j;cV0r `PF<ė7#-]J9`  c,=kS:tɓ'-uE{G֭۷K?%@LJA R|F%s.PVA!xI+ $2&*Ǘ`oʿ+>wOūGΣI%oc'R*yߒ2؊@ Q:ȋz#/KI^+ݳN'~ٱU6(88R}@J[ߡPfs+ڑz~0)/=5BOތf۠E["#Oޱ'KFle)BOwX\btmYRpUML5xM,q.5kD<%-F>'OQһf$s22Т+$ (W\lٲN:q!֭ԩS s:uUVQfMz)ȶOT/yKSDIua&:޳F}64MϚw`k4Dؖ߅Dǖ?U[>EB@J)@l|,6~,yiT }G`ְ&׻yZ;#MZ5#,[̒RSPHiԮ(oVO@ eqsEaQMreWŇ&MpF\M5(Ɲ7(={D_׍`@g5%{3i^/d[ڛ׏2vd2H/ػgEi|"n<\ُ2>HIgx]<6iVY,bӏIKU5V@iF.ZEk 6 vNYO ՛;u{1 Aqubx\c2ɟ8ظ"Q0PЗ7w Qjg^&/NOw̸{;2p"ns#JJ@QDJisMURǏsq/^i׮Z"]%40Vd\\<f*&q?Cbm*,#$N+VR%lJӤN=ob@࿔}DRɋHtx獛)GffdP)TPZJVzVa?O)G+P#Ձ&x:I0uvU ՗ u;vZ:ޔsysL9v}nPlDiAޮZKER bŊZ&MpM9Џ?H5,%$E\*`R),Io $PaȂ1ɛh]F!SfI$U47 Zdk9 Wul[7KZgKe7)^+0DFɌfTYrd%+%QFc<~Q#nM|7E-C>N L"x iȞ%#-Dmpt=^=յ7$MƌxR{{P@t%&Eg~vn]=z NKN.ëNcQ|&S#8{#@DE&hHu2%?[-@=xۜ$R'5o[Z^R)/u^t5Mgޕ1dZmqcukJJuA9V3$UV;Gid0);wpKInV6d͝'9(.iP(MDφجEL6Ryҳ z5/3}?Α}, ˇ] :e_bFH5iј0*h̳2W ,kiRk>`67r*A_2/|$y)eT ^^$#/Me4 L t2u㗐={v:t |J+INr9XX M;Lwi\r0ҠjI*~х~F9PiӦ ʕo0)nZ~́Zpq򉦳 abl)Ф\K03^*@dIUۄeyjP`NBYT?P^"y:yI{CF bI. 6".6"*umVdjA-Z 8:^ -H-R'7θ'62l21gx&Ɏ}YP^=ԩ#k-ӦMHc򱵓ߤE=w,͡fφrTl.\YƄ \)ŜPp# "5hZ6U=xr.0qIMSCRQ%V3J\y 4;DBnx1g"GΜ),? ;R Yd%+Y- ̤O9,L'NZWEvΞ;;"5ZnC|zJM1͛˚gΰbrvAٲe弖K\NAH7)&N"ctڃδ9iٱ(f"fP̍J%.B)JY#ָ%VMtl3p1oIT+*/c}MI6vCof,X7w7T}LӷPZJVdR1%.+ⶭ"8 ?Df b+%.%nbD!AXRD *^M@@>geFT%K#ɥGFFR;O P.籁Lf8eq-m 1iӂZ# IV*'S«f2hkR«V*)` HKJy[V"ERĉO^*C奸| yS{!㩐u"o:ў/iFz%?J0||LPiVdiv80?G Nye47gIYlRTrӃ#:G0&4{\Jcf2+$*S իW'O<*U!NH-e qKQ0u~W{'71WPc+J`)'(Sj*Wo-~JSël f8bQ0RțFy[HdN57ɸ5GW"އKP\?\^|NS̛plS̤J)}ZcC)TMf5(Y+`SmXV@i%+YJVd"CO9&m瑆ܶZ{3J Ζi:4I1QK>o.5ϢEXp! ufit`RBbOe%0 PNԞJ^@]9¤1 jebҨi, 9^68(H>T& FȾ|7%L xjQQjyR} yiT9>T^uJtl@C^[qнmn6m&Z4J:-+d%+}4ͤ?YccKi)c zD4f`)%9*6 LfGE!JL&j&i'/_.*%:XcBy5nŗOФפJIh%1J6rE^ DFwP6A#IY?V:dvR1tYƹ{PR&%m[ ؾpw' ΩXRsvvfȑ;v)ƅkwӵ}[ƌիWeͦ% Nie+ˁnY )VF٧d+* f'KMrlY$SǛFC>j&AKPoyI)22&=,6>(T;K7?ª"}?W<$}Jt|.^ǫP) &%;QpA<kiL&J#=HMㅫ& .OMeKf_Se!vR *%2O$V4#247mN~ #9r$gΜyZhA-(NJFG~;̃,3@KY#h %dB!܉Ɯ8ZŤ̼&y%~_}@• 3eBj(d%+(Z}^֙T^|l1{ jƙ1V!%hedʚGc2g4IeoՄ`3iI',"s='+JTrKqOw| e ޽l[lrɉ˥&M>?(ۤ.i.&M`)a$~̚!A#oӨ4IAAh;e3j|'N0qDyB,yyzfht*I+2()[t 3YhŹZ2^ ҨlLk[kT 'Ɏ[HL&^!Kc6,y2Ui{>RëwU2dȘlssi yeP~h`RI7h4kJJVR RkDhL>vbMVg>j' ;r{3Ҷ;(%e"c%(Uȱ؊9'8I<9rUx֭Sٻo/ׯ'off;v&ȒˆS.HSL&mOQ0~n&WJcd3 \QWm*x6CR+o["s64Loy*K8J=ec._1Mzo©ۻ){ƮI&[J}cIeOt"FJN#7hRbMC"nܟQx1|te{#,%kL ?u m_TYWkŠo@q)~B*7/$yG)X4j??mfKW4f/{aΔ߱ъ>VgWYk4ZRͤ <&&VcR/4mظzG;W :NEl5:OxTf(88X6UVrʒT>,k@7ru]qtq%DJQ'Ej|L~uFfڔJ f_=cyz^0uoh,>x>)M"/$/2 jy%'2 oK+=w,pBU)}i(N"KJËFlb;ccy>%DkIc4]ܷl fVARMs=W%dŚcG7C:5k֮9'aoJBs>\ӹ_{/ bP ~[stlt)5_ƵrTcU,/f{Kלc+B`#bU}p"%JH}zy%-w%ib8)>4gg퉓r{*~?" ]izlnы/39HUK65'f4:Rz K^2-K'~Ɓ99/.c!M25aZ-w~zO77ܿ‘](Q}f"Ĩ+L\Sܿ-l'(kYճ7[ SŃv8hm훧gܺcX=oٺ9(q999! ~msmX.^\k|3O]m)x5Fk^ * zed/\g7`l:w↓f.ߍZo K40ꂏ8u:F^;ŽnؕM_ȏGr_+MD̛9kuE z]rt6/nn%Qfa_yS+>}f6^i*@N=3ׁ")ش?[X:,[odMϦh2HG&w鹵OIt;z%?M6zt:]ML`R,P| W1\R%JU+n=Ork:w *IA-f.Ǘ3 l%ULThK5+$D &9*y )5$UL7~T&ќ`hO9oq'JYwK(+јz:|ҭDDDe%~_ }&eEhs #i5[u~#nogGz<_9\(oVêi)"4h%{&þsnEڿbcF|@8iYy%sҡCg$1ܰ-{*@[*WBvθ6|wA{vM:(q{;_Ǔ,;3|uVkOW} }u #1} Zu:v߬Lz{2=gW6Jf1_Uc͗b_fLql!W1i~n`-do?yGPVoqZ'V]i?z!Lg5F$gVwp ZMG;;j1OM;3 e 51a\x>#Ӻ}W.[Wi-p)i&:OoNj?ϭ`mTà`4c/P d-}!) 7~M]# w_%^Z-8I\KpMMq&F%.8G|͍' DJD)ZJIxŮы%l&M(cdQwϹDdlfM[1s.=sf6a@r-q--૪ѯE/8D/ 8[\*cbs&X-kċS¥$28\9+P%m6G &bk.:/܎1Lv?(6I١Ư++V[Sى40Cz fm&U(vF<|Xul)r&PBC3ꞕ/gx*k|j:b;}6y q,ʃ39Aw}2Gj_A> e^k2<+weʔbĈ&$ ! 7466,Ond3Jyt0VS{\5k?x PpVn q1?KT\Q1yQ}*ްw` ~f4R3_ Ioc+vM良%'l Ze:ކd&~#l &u b.|)>#wv񦵑(J>6V9wh"9ԹNC6%dxdI6\&p 9Ep0ј#.&]s;A|j j1Z+D/MI|U[0jރ7%9 _,/y)y :ٓ.WF=~Dy,xNMm2ilj"6&Sß̒L XWWi#\L|<{{{ '%QHRZjܹ M{hTOz*6l%b5zAQi=ĎHQxѴ fHêuEWѤj&|XlB:E*Iɉ:]Z/Z'^HCVFd/A&8L['gVf7Mi2ƨ'^#/^'!cMq2D^8us K6 GΧX63A'.9RҘ^]zVtRj1.6VA << \M<<*-^5)RYGo0fK- Rr1tzw_2 R9EGF&oNI,uqrV\4eT*@.n=3]&?ŚV$G<{M\ z.<ٛjs?J}X\ J~Lu_+ V5M_fy @'m7L[2m2~)/M kժU`oIbBqe'^|RjP'*v-آD0~{\0S_|I oBBebch@){qgykc_V +mU~'Wr)؝"Y|Avu Vmo]b@D_.ɜ\g c^D<`~%M"h,#dPn4>w*ӪJ7^hCzf/˒3,=)u2c+(xMWÐıWTG#Io7`FJպ3Yb cma"oh>l]oZ/xWEgڶ/Ms9nTqq%xy*;{H& .&J!D<ϒ-= x)N+uC]tn}\ A.t\z9Џ{seۦM%-p39kZS!S dS9/?zgpZMF\͟Ң*l瀝ß* Fz"EE 6}z90@ LmQc/}Aq`8_-ޠ&Se5Pf?RIkfdGf/p.|_oݑb+r<}2.F'٨:/:4$v +ޤ>%{S^U[=kF[y rnO%$/AҨrcwgE,8,󀏢h.{BK {UEA bDAD"ҥJ/B %Bz$wݻۄ |>3o'95 uɋOǚ/?Iwi7+fA^U=)xMh'I CJh=+-3f­lF?Ֆ#fv: :ňY '` P)Ĕkf1IOff& kr3&K*Xξ]r b l5A.WwRһgޱ**+e>5chYjggײ>A|-L#sZ}#fˢKMi*$,$PLPj3(UnYOLIn9?ļ#3WIi4 Q]MzdvBЈwsەs;sK1g|RMMŧ追,nh˛lYmD]Q UV ),6wE{/~m.#J'̎9$QQiǯbwTJ+>{rQ Æm,6z `V77*ආB$$\8UɎsɴ- 1aLX:-?kKJ""[ׄs-6O; |ͳ=g0 [/8.oz\x u41C/uq E5} bq0=z~;w⟝̰a[p7R/8ukf3?_Â*z,.ɟ6FQM-Dȓufu(w*nU1]ѹT>B|U[v!JEFm .vs񾋽>\bc'@\i$tw%47G ès+xEE.Gյ4k҆!EQzP Aʔ-[O.]9V:ARo>gRxI2 o0x6 NNNr;RH%lERY X4s85->P*R-¤HAްkҵ5{5읷u/}I`2TPUݍ\XseɽFݚO%ER$OJFu@f jIkәίЪ]@b?/ 5GʯbѪm*_wJ^$SP]\;Jx1S-ڌH@t2-ybR) JrAr^읹JkNӴu6Nbˀ=}\Bv Nyv} Yh,v$$M@R7׌yV<ͩ]r1I5ȆKqԒb,$W>?YK EL`R:c;)_ nc2gK`Rdwt4͏WHgA鉷|2t[zNƜGOz,~ڧY,CR~='S=o$SL*ɝZX峣?6Lv8OemBj6D /}᪼& иLc>EBkij >~)6_Sib[|#]H`P ngX6|fO*H@/)oavf/2ڈcZ?tFRn«X 0)ΐ>lOLǃw$əOJ$ϲUT$:iQZz0L^)pS96Tl]ZD5y5oܠҙ3\Zh(¹NBSS){8 ˕BjyA/I!j;q.({ ݥ*R]]]ePhT$!e;W$6d[VB),FK>h%0F}.ZKds];[g?s_~e kQv5%ǔ>Co/EzhakۤPƂ*䧽W5T1ig̓KݶI.o =ymɵ?m۲wJkA@em(9IĔ/ɚݧPmO@[8{t|c ?đe{=͉ iTQ,[9jpT0Ήڵ{W@Dlg2%ǤQH~-zڂ6_s6{Zj~;U.Gc{{]`H(/b)Ep=JT׷_͑gr垞OSl}v1 )ŝQ%/WgW(T$sGခO7NYkn{3jpxvd3W֛|ٯdzgĠbQ-b]'9Y$\1w?T"@\o>ƅ' V&Tn_GVeU60)]EUEoҷgSh Kchd@Qh [Kc=B~=X)("󷭹_dD)PXBlr27ȵZCI&5x|8mdw}! dINB/s*$P~[a\4i]Fnz&:28ರ@蒗w6$Cow"3 ӧgwOSs\MJʅq:.a[:n>M~1m ߼wMfL2@s; 4͛`LKqu7;HJ?:V4ȽlQy3Z赎7dYi!Sl|gr7458g5ՙ8k&Rγ焞 9o#e P}99Ơpq@wVZo_^eUٌlZ}eEhtj6U]2Ysj2rՃ |zTbմǙ7wRB[2kHKWRruL]فyue[57Ƴlʹ8Nӈ\z[{WÂЯ=^^:}3ӯz'}^bp,ײ|vąܻ3ikyWee)o;y0b9BrISiYW$iɤT Y'K`RV% )}>+Sg lnU[?xyyG@X:d̏ [|Am AcQ| bmLkVn>-t̖?87oQfyB[OfJG)],RQoŧW1h/jjeiUplcjkux=Bkkx{z<r.yEEKbKJ 1n2fősɯu˲ڧ4?VΖ59^ڕy?-}h\MJ!ү-fdXb{F~ ?O'&V*5ͨ-prבʠ:[Nh7y5))W>[xCom,.K+|TMx&~&%/yόbt}:Hed^yo,I?]ujW&~F=Շgo'C2> f%vDAI/Ss/R:>>;J3qvM |5;,--ȅ8ŧz[Ճb(O׶,n.zv~>+ΈϞCٞ!j|Il;1v${.sCg]䋙3FXHv{1RK.RϮjZe-%d)Bzyya|||G'ΑUڳ[6q蒀OgwRn&T{֊y͈P '_Rl%u'5!I9Ռ^Ҁ$V?5]_}z vM==]Zӽi2=((o>b}Utn^EJi%^~Z;W]CY?P">ڎ$% ^i@XкnjM˥.OzΖKmkW7f2{%^ 1;݋N\=61Mݷtr-9MQjGSnlچa՘,tw#^?Zb`(bv_2; 7~fgYَSZ6Agߌ77;f#yr9 ƼcVqs AhWMcܹH:ߎQqaWY4, o go?v-&+rO.lwx/'tF >w[Nδ6eZ|=_'*ow :&7CZp*]W/gѕ?~4XGO~,WagJ!۱ȊM斮 ӥI}Τq>y}`} st]ѝ]s'$СCm^Kم0ތؔoˇQq8>\˗ rER:ף[üb IL'+ٵZ..bȥu!4-#%f䉆d;hpuGQ%O27gG Т[g6L 7+jKtYx8u;9 mGb1?ћLQ[F=zr `zU!M3} n'@`{WġLEzb!Nd5WqDH^3ZS<ܔAIW7tNNC ,)d|%B LJRVQRK>Ђ)t^K *(֢2e8 ^op=BYDLVXAF5ͨDq6f)"I2KDQ̅MN\;~CDRzyZBV5Ԏ٩`Vg~ci[GmvϪ-__w[E#/2/S-_]L1[[zP"3O$Stx[6H,Rλ\ݱimK$gV ;uX,_23ߎ$51Mfe 뒂Bc&VQ: dk{v8-l9$gI>n}xnibfW?{qaWe Kf48RFI ި/,JRsz {*)%. :`)@S ZЖ0PZ 0م`Γ.Nb:1GVB<^/be=H 6P?75JѪ3E?IQaeU!J,׎^&H6 ZQK\ge{`5G/Sp2bu4we|2=~Պu?F|_LHm(ջVu Ɂi]\ǮG8 I^XQH 4eiiKKwln4ܡސ <;?rI\ҚUȑez3X̋kˀr~¥OPj8k3-CJu8;IHk$_ˤahn|ܟj8! ב}cVq]|KcsR3K%@y][ôW|lwN'L vt?g۷K5NBR H!Aʠ9V)bvg`<3WU~A,rt}I2L_?qI)=)u<˔w Mtŵ6!>[޼ r3{{(eh=MW|='GIݶdk[nG+ݿ,z2=*~Y2նEoh|0~iV~|PKj|U\I2(FےϜZEFp7nʮڵG9.U LC8+enG|0'\gٞ R7 3J6 .8ۉdcIRm&XHewzrѕm@RwU+7y‡,cB4w'еf׬ljT^kٴu7vxlaU yrJWO< xϋ%+@S`}pFx1̝jb&HY:0c;U%T/O }I&T{ʗs>2e@pC;Q1ѻuo樱p `s=ۏ ȯ=P+"/. `]%o_%$# ˒U&T*ke9͆u 7Soi^l͞؊WJ}HVZF .Scf.nҶ23;G6*_"eR}=n]N䞓|7&{+vzֶ&˽i m~H_l|V~=(Iȴw[d8׏n~icsrNlVԔ1\AvLT&w%{LAEzz:iii5554qnH#!HP (v&{w|OMX_cV9x{Hԟ$N4U(FdZMb ):Gcr/ED'ݔwqAyF\L$^'>Áe8mAe%p%SbY\ &v4UӑeJSB93v6dq)Mx.@/_3KO6t'GLȅDʕ!56rge獯Xn,4x '߼ȹK7z" /_<\la" zųt BEJR6>$-)%E GTeIxя4tyS2I6RiITog yYDTAm)-YbY%vRStZeӪѨ,)0]OFrɱ \w[ G&CPs}=YP4Ŧfww+*V}&T𭘴zhV|N5F禱9k=rzU?$簴T>=qCZO EdPǪÈI@/)oavf/.ffZ0YZb/#jP)J5R/xiF7f P(AfgA#ŕ]5Z$;6q#RWKx )EvBRkʳ!9ׯbluǒ?X.XϱWZH)טRRmR)Z$CLJJ"ϳjT؀v{^ȲPʯM˟ٺ"_ڂ:Y^>Z9ΦeH L4ͳWز&ofe-g?9T}.EW"i_B_8YQZ$U%K]_=炫*hzn([LT{)*Vy+Ao%԰0[m_E5HIi/5$Iu"ߌLH&aM%ޝ_ot)֦'EkW&KJI7uZPƑloUD+WԣX_eli9TFZO 䧡pZC\2 ;؏u+y4{l3Rܜ*:<=prXW$j/..Ó\0xw1o|*&Bhcsxxz0ʤA18/b+Kw+H/6NR^[\,URU 6Eܿ5JRJPRJPTLDzc?JMLJyZ#u;%'Imf_hM^LZw #Va#lH*FD0'iܰt"a[q V\/ k_:}R-L`YF}F*&mc~ݙUDhVBuU*6TReӯO? L*RʐK8(QɨK*I#S+Lx+iq'@pDi|Ozy)j5+%ΜKͦ~NdpB0J%A6( i} !ԫ,LZ+&Da Ց?fO AiR%k"Ju%whm槓kqt*|+/@Tj֪O mp4/%[-ڌꊗ9Yzİhg\1"Du|I6R;{BЪ[%]U]VfPKrQ !mپҮc3..u|Y#_⻛;@jpusj Ry) )$MK;dR\X.nut[\cMm$F4FGWnG;FE9iŲkn9мsgB 0sdӚ'(`֝(^{5d}2!xw8!(F\횢P|M[WX%eY1'~OҭOkY/8M":04Zz]r<5дzPI7;߮$2')S_߼,WjH`=[9|+ 0“gYr+*ӻD&]i*1 8f.Q <\egcv" %{FYq2/ $6MAxaH>A~d]CoDy#:m{R2޲nϯuN1o8>!d.Nz;xZ]썾oզtcޙ'Đ`p&'crٺ#KT%ʚKk钤NT"P|=u73IqF%: &j*kbZl!&ȉ:{2YB*;o󙝕/UTfޝ8KO?9\s.kG51ŶO6P/:˖j ƌ}p_N V껠(`Wu#E+7oh7ꗟemt;yg2g|-L^=wߜ>_/& Rt>3ao3mx{#5| CGQv6'orMھ˦Au_ƪNx؏y>\iz6WX3f,7R.ؕ9I9/R)_K:n*)eke@P.Iαkr-O_0OJ>cu K]_1O$-}X˴ǞS—-nt,XA90wށ[>Ѽ nŒyoq~;^>Hk?ٯNw{=i/lz-dD y3KxeićGKt{5fc'Xt*uѡ PݤŭM&8<}q1 ^.~s_G`̯{Ov"kVI-YZ$N6Y*-HÈU=@|̨r=oEmnYVqRVZ (Vl0x%8u%o,~\OnjB,"6{ ]2L_FE-شfX3H|X>m!9:5guxV;=tyyګ[\c B)UVB)mUVm}23y<.\ou~[7Yq"Xߡy|Fѷ`:wGp|׺zfbw,^? ˿q-Ֆϭ\;{U*Th͇Zat,΁ c?YCzYF==6}o^19iw8 "1zqp(!7.p4$G~`7' s7.!Ą* ^ڳDmo|Ǡ8y{;%|Is ނ9,Z3q;H~zx9XփM$Ɠ?ItNމRyS@2Ӊ/U򟑜NwM{M/qwxe/Eqig~[ɷI87ʌn5=. C}1u.uk0w3l?}q.fńwI-IKJI)@J뉴WFx5|g)ZcE-i&k&EM-9-՝,(jZpZΎws&&Sm.d%lI/7+6pfZJ 0G0g9۞-cD=ԩd|3XT~^\>|_Mju(](~+ o&G-,*j):Rg)6j{tk4 =S;+WFֵ8K`8e+PkI廳%e{7kT!,o&Ӱfm\I8#]94ޟ298;%sv7}*ۖⓓhW}A 'U[T,WF VL #Z2et+fbrt֕$:P6r ;= 4L==dӣy3{6͘8tʍ)9f o#~LSY򍣶<]Cݷf`>g~v }z 0>w9fuƸe _Q4Ӻ`bF6 f !%nJJI' TCI#N(J)H9y%MrYFp*JK+Vbæi4JiX)mU1g$L`qOW3\UׁLeu_<\Q;R[v*lRg I - <㢌/-|e|iM%`i(e]^aʇ)mR;(6jI5TEM?NF!AN蒣|Y p`?ĮV<=9dFgk,[2+ggV:CX#jW*$ܼ*@\wkb3ɮց㛋ٻv5{Pz4 D\fKnLywd㏻p mznjP?ٴr)hԥ5K9rSw)[̘3?A]9|)Uе]MWOpBek}wƘNSBžr! 0_mc;tsVeQ=c>d<%;3|KjO0Z(! 5%/PT>\̣ (l. T 䇏YkO8'Sq*p-ˍO%&1Oݓ~搛/[OY/_㩤(f7l`ÆU3xš7^d1޼s7!uR6gm'7\6f" wo2~zq f"wK9AKf/Gغ~H!ʙ5ٟȄ~4z'3snwq~qnH--mj~ӇV3qZ?W2nڻbKkN4jwy>RrL88{Qf?Zj&H:ɤ}8`r[s&jϥ?7 $M(\+gL%ɒRRiE%STފ*%s*iaQM6b;8DxJٌh*I 5k^C+-޷ZI9ϜzFgaz1hݕǻtGzsYRn>?3ߠgGyټmI]1b4<ؕ dPvL{s&tdؓ&M^]i>YڝS!hG0_|n 0r [pv%F֕3zmh6Eg /KvxW<. wXP:vΝNΠg323}hMw؎9U<m!by{_&Mu2~}ZS!,RB2*JyIc^\"N^Mҳ`LkHw,EhvI϶5Ol;<˺_Ura}6oͻt38{ y1'4^=NIܕ[3vlglF=8YwI͋r iN3sP1ȯ ؟k` Z;7cQb2`xSzA컝F,YD րRޫÇxu^Qb~7EQ;=m{o?Tg',egs/9~;I84& maӎOTvcbLO6x8'ҍ.%U,Ô[ܥ*׶=Փ=[7+ϐ-i`wqX}  rXz [2+܍z^|l;am#w2oӿ=z~q]װ ;y(ٜ Ų=x]l}Mz2GwLgQl2F,5EUM1]=gd9c0<=d0Վz9L3%8ǜY0+;jL_ZdU5 2l ^6=3-O4Q {T>{c`)\,(ũ"ƾI7uxi6p͔G`w:پcI:R޻4jYןM}軄a_>'25Ѣy=\u-yl#U։h%[rd{yt.Nź><P( 5S Abg~!J$α栗V%s0}¢, w㨷KIq< ##ʞ=X9K'Ax|lްpy;w|g[| {@\m>Ax~ز~f&l^>]MA+~(6})3p>)rX6MspА!,Y1(D敥~`Icѷ8vb7#V9_. 'NkWa"j|IT`NSl*p5tMx1b{|֤dS\ ȺߟrCwC Ѩ6)Gy/)_yfWbV&KJI))qPxJ @NHN*ڒ^&l5:;v!rq0oIzdgYSQ)Ixދ&uRbk*J&"N\7-!__v8jȈe#j^kgyM(yYØ;ẇN$dg(oZWMdԧY%1fhT~^uՐL@1R5e%iܬ HF]ͦծ봁d%Cz?2|x 6p"|6 1+όO%|IJIxV~VIO7^i)h(FbߟV"IP)EtZbEJ9kHgLjhcUZ ;9Ȁroُ<.6MV▪\{R-TG)%S(aCI))%WES TmX?gImߎID%֥)Dc.ִ&[j;BM|EK  ^ DD"HAX@:"RE{Izog6AWy}fog癧T6/Đ97#RKKa;AR ;#V%%=;ѥ0,AC\;45O$&gvJ\ z>ꉵ1^zq7heLQR=LƵD: r1sϵ4ZpRPYZ3mџ(˔}\ܨ m.3EzRZ?rEՓ[}PUZ )--y /OHeZ W,WŨ\ZfӋ z l_?oX7MJߨgRFV?ھ1df͒3}^C=_vB#ՁJ]@)8|:޵W| ET11BKe4)2%eld5N6 1$MdINlLϙ2?ɽswk"B:TaNg*r0Hq3FC\A=jŔM|ʋR4cvN*ʩIM5ZkY (U'0K&+(yuN# a,2LȖK\Qlܖk;~Y g!Az֐A> (_ИTM4-Tgk񭀤T#&9Dz_/*b%kOzAuz63Y(lûcywd^ZFgFa;Cfr&%E,^zάw[Q{YCP."/O'\dgq6=?ĔΑѰRY*FIk(.og3Ո(CWS|?M_f!OTHq6| ͟L1e#|hk/_ K&(1oT(^6Zsp>6-ZKzRzܼy9/ "̝4m{l|N8:U~pUlCi6Z ۆsfLT~(c ]B$ۢETճ#:~6bV/uG MG}&{Yq~I:@Xr[ZIe[L*dwnWC4t)-U*|0 ~&~4-aX!6Щ;7bw0s?\|>eCnOpo o|GXm!0-mxsV\e2[5cM&-tS7ؽ S6m91=?sZK=nkֵ%{ܛJ>V/4bfZ}痩Q9_/}/\Yږ{{0 Ebxu\~/uZ;oLs÷t.ZQ~1{_!^ ; W|ĈۈZ˿3x^tŏ|R`2l@=-G^Joҡ2r s'D>ӕX2S\xh6IzJM4w[ZAGS~ PRl/V8-692v!YbTV/\),^J#Zmye%h$0$ظXRS3HC샤ǫӬ0xfJ\/:$&&@tF~ cTQ/D߳X^QrPD7ТiH5HtnQq[ y3V I r-яVtV_.PFdn@#4r s']trcwȾy?nH[9yD7ӴX(?ǜWߵoυкv=܍:z!"\Ue #Ru*IEڶa⢉t Llt(ɍ۞v&l(WgjQߧ8#\/ލMCW3^3|}.鱮4|q 6F_+ù̺& 7}LM4yBT\VdW އ-[%Y{$Adܴ:U] &vJsUf%eXvya-+4޾sԩ?WKEF5/BN;fԪ1cqfJĉ_HgǏoo~Wϖz,CӦA>ľ,y}unZW D{VRIT_q릳2e0XFu!439⭤v!/Wo_gGw%&4v޲ᶭd9b:"SNuF|p#'~`c^ؒwEy#ܻ//ڛzQei%-!? AӘtkoGDjoܚK8V~x,UB(ww7{L6\+|AlF?MZTQ1?MǴ{3~ÞL\S{qqi/5*z6Ѡo#/gg8sN;i޴դ$QU +XTN'=Px.f 0' %KB*mV!XY/ˎ[4PѤ=LBd6I$+U3cdTϮaߑ˘o%M' ZY ;Zff?~7b1+WoN#%ѴgsB3,rިމQVq X#T5z>ɦէ>HBkUDU>fdSK|0a}tfLXC/i$*]$r9kg󩭬39G385/@8jI[y]DԫM)&BzKxyvY ޸]Xc-T>3M~c6w"O.fPZ~nRR%#H=&pշ:cOK )H}_~fgkp)IO9̙;/zFу,}2BYS=dec6.wR7嶫IuUMM*'NQeDc.QqΈ'/wV:dlC#V|ʫNz&V#!%샏]xJf~ nR|k_>I-i'V->&9: c;I Oc'py@6pxvK'2Fi*25Izk䭵'ף bقKҦ*|N M3Tkh[΅-B >RjX4+ڹntg>ۨU͛Ƀ&Hp$xyAC巸>f" d뤝\M=K"GVgl;Um[M0W3ۓ_era^ZRr'պ(QYYYdddKzz:~&''߉byopiڡ9~H1`ACkBkIgE r!N0)+J;:c9͛*" Wdc۹QC '^J%,S38`~ہ|LER0qj\:]wm+-Ԝj)y5*3,'}@8 OwqȺJE[d rYi_s/qyץmI.S:윇Oҝs*ϾYvRU4l2)ݏc۲zS)  ə-aIl\x__ ۪,CMe[Zp LYib X 5&h򗋺zZVL%--MޯyX[t"=DNV LVGܤ:>LV4[#7?E3fV^y5Ln=rJ\\#cMx^;sLbDHNXk xAv ^9' ge4-}ҜzTcG _]{Hi5..`4[ӷV>7#M`Q,@2wN|h&}<]\k#?b3q<P,ǔ'/;k6N|}E2:ͤ_Tڂ&ۿ͆Ru ~ZDGwPO{v]mOt PS+R8PRES?xzyV$z;=9YUk]^B]ݝe&T 3c6Ulь4ǦwD)Cp"1iYȋMQB8~iԔ#;I@fMiQKk @v#-ӑx}Bt+WIՈ2ty}^o%+HHӼsSznݲ;LQa'rM-/s1}BdSgQ׋5$Pn]*m̦ *+{y{Oضr3iѲ 7ەh{X@ T*08@fI~ S dƳ[4p(OHGG$ƨvH?{Wұ vE9V̞L~Є(=[DL> ǝW-@QUV ͤX].ٶd&9%sgq)\,PRԔT2QF:˷)SˬvYJ\\ɜw53nxz 5"gdFk!8nݞMNz6r ~Ē.ZDMc( V* p`VZs$O'2z>GeHNJ";#ʉf~DS].` nM oLӎi٢%Eع 7?_'ȓ&MB 牟{ eT`R@֯YǍ[7ȑWӪS:;Sr.P!Gu],ilWVԭHwW=՛r2dTeJ9\Oh#wbzq0_M4-i^~^CgҹVWMdԇ{)yK=\:qSx`);2㥴-c G&3jg$}x~<^mTOrz&ηҡ+{B^F+AbUsi OP65,;XSXjզ#7)K[iF4n{Syv{?k$?02t2-Q`tM3.!˳2f9}gOKSط+2|9~᭹_ L4D6Ο)9it< Rw(15Yw e.lϩ׫?ԠUC}H=ߝ gJJc^)aϰd\/Z-]'o'䏜71HоPM4 _[OSkglFWSb}E.^իWwu\ ؚr˓FFzFl;{Kݝ4<7OCgV{ܽ<{}r52@ S711X#j%u]oo'Kt?Yfܺu}{~W,@]EVf:|0dda4Q4ٶlkwORy.OTVuz{HxQd17m@ph:AR1yJ\M]YO"J=q@Q\>sJ)CiSBԠjxTJ %->զLj|Ůg1Ja3`S͛T#i} ?|6sҴT~}m,f !^j3w# e]8:0bDw;x,Xx~L(QƗ{Lڗ6duHb-~eԠ7yD9u.E/oo+ꁣXJ[A4O^8xSU{޼2|K<%h7V2'?grlxg_޼K~popc ,БtֻTNIcͰZ*FSq9yۺ•xVL@EUdLus]H5Pv 1||"$"ẍ́0:;A :jJuM4T Q:f="R|*bZkQti\CgdT@P:V:qHRLdi69x[9y IY ebʁe02Uqk@TX)SP:~ +B$)^GgH!ǔ6)[J:u ?Xzn{ &-j(U l))RlIfԁ|v;mߪ+0M%h Sj{~$a"&{JdxIES ̫J wAoۚ\-CYdJC\L+dsӇq&qSyJ8*βL,ut|/ׂyH!myuS0¥Sb!"}wdh@bm06g,ljx\ mDz}b&a FGf;{/>h:<'z<ߍ.es]]ChԒYNcFg0B[K/Rt:n{H :=nE*\Yi4BAXJ2}KC'b",8k5mAb%zv%n._Ḓ$z#;0K?S xId;Kӻh/l~.&hZ'bJ[{J]QRRh"~eOܼܻ+"AS>P4EVz#J;!k,=t$e˖e)\y[R* RdL}伹0H R*$#e?[V=${ZD{?'G?͆dtwqhP( !Qi7J;Q*imvAZ(٩KYxiHzV* ԩ!&/HlQ hƚMvc!$izyb Ԡz|׮wnN<&O& Q-rqǂ RNɿ8ܨZ5P"IsLrs>iV:{NGW:CI{8N*bvu{~ |$ES^z]̔?оgq9Ϣ1KO,BOHsnk߻êxܡp=4䠄iQy.uc-9dIwF4+̳ef #c!ގyîrP bsL{0 e{0+_Xݢ*'^ &$+vGY<7gք'qen`|Njs3NI ܹ+rp ێ%R= σ3I7n[)zc͉9>+y\RM4yJ3WRTI T;(&ʈ}DPŊD\|Nǝ{p35 co=l!<٩Ǻ3煯^jz4v"QXb?L֍+VT`KH%k&ϋ쨧MaڀZͨ3x =Q ʶ;+?$[~^_ #gu{+-˖Eo6]uoOf<qw˽抑Q4 0Dg2}1p75$5. c{Fueڛyet;ͱoEyߍ~XezgKꅷ.=CR~okOZgDv3)ɰY=EA58䍗=3PܷR]i|^ur0NZ͇3Gptr'Tj߈atH>vhSVRtEK[T@5 `wB%EK˅s#~Pn-׮t.{(t~BW-Ah%f_@:v 111V24<.'ʱ@s9ϖPSb92/Qk (SpdvwA*7B%*B&r?Ʉ d=#!لto Ydgsr`DûܾtEQt᳤{͔[!錘#դ^r,v1?$?Mԅc;bl~`vzRr9h5"AZ!ĺ,2"`QrH+@,Eϻw@(4"kJdT%`N.Na'#سs7b̨1(ƚ5kٱ{':dpYp[cP|e՚B'\)o2]ne׭SݠHJHBIrR ^̹Sgt\A)R zZ=PB*I3O}kalUN6[|Q_/|:F )^2:*<'g^PYwAxԠFb~\ʋz/y\qr' Kי"ť%UM>Giӯ //(%Fp>\EyƱqT8j&h_X2!ieT`@E 6e?bGv}O6!ECT*AOjj׮]-ˠ%q)l-Ӻܩ,= ;emZ?PYeY=şa-hghD,+?=C~m. g={O6I ZJaQ=hFn !Ͻڃzթݢ?#&h&);J8,'B}TQHTK(ZOùxĪ/VRZu>^1Ee̙,\waFԶ$gQkd Ih[6fG[򪶆#ʝ:6:5:'O,[^5 8MxLMLH'%9EƘ1\x+.&{e +AdT;`)@Q ʢ^<$mۖL7Bã[-Y%&h\Wb$)KD))Ekh m +sr,v2>>… K/1~xN> /={d{C+.@v\"A%I(l+$o3Lr!IGR7$<}lE;ŹG=.?Imbդ-&KF ;$ d׹HNg4Z?u*ddJ"4)rơԴT %xLL"!!bcHJJ[#24m$w [TN @*!~ZH5@uͯ$5DM4D,XPvmbD%gCz[L ~GYYV-&MѣGի7nܠk׮Mp|b\G\ Xr<|t\\]dͥ.M.@S@e׺섫*(jZXhE'в.-ihݬ8_d F3dLSLWgfe )dI&(AܳxV^=xy{ e;Hƶ@Զ@iYl^jmh&hES;(@ oRLn{_y̙3-[9T&$$SB Ue].gXX|=J o]bb\^Yhoޒs@g' :]&kIQD^y8b*^LO2PrQ(o,Α3=]hr2+b9M B*Dr($r8%#vg@odAW]^9Zi (Pj&hSKEcK%~ʧ_ٺu+AAA̞=K.ѻwo,Os P%@KQ.(/jQL)r[gfd-ɩs Q6-(S4Z] PPB#ZrG:_wxDWP6#帶ж@as(5B$5DM4D$j.)СLHiy۴iCΝe[cǎv"p8 T4 x}*pWqB'6m `^KΚs)LȢPe-L?m=mB4kQ6RJM4DM4RY1'NrŲVnԩ FŊy5R=bJv&h&EA m3Fb6g dp L! T0*jh-/D$bK@ӹ瘂AڒQڛ9Τ8󁤚 HTK[Jo[k)s*k7Ҁnd[$XU1hĪKy'ڃDM"bHܹVZѯ_?olРݻwHU6=ΆQp59_R`nrM4D?=MNfȑq ^" $;ߨA-=?.Sն}Bvz;z\ !*c:%l/I9<Xj(ȃֲ 8GjpT5N?(IϱKv6f vt Rr#A(7irNiiB _Mk[W,;M}h',יo.}¶10Ӷuܩ>)+P8f̘슯;`0/% sDj/ +cѬ?VOCSy6.S.Kfoy^YA>s M|Z׻غ++4DP֭[NJ+ԩ|Æ ̚5mʋ~+x r>;[ ǁiAKA0)îP8s3 I,-):#7 ԵsWӍ [[| TkצnD@®ÜARz:4td;{]qqQ-Ҷ]]&Ûv$J͙v5ڂĐmOT&d/Y~~\8]$tv?&Ϭ|!KΠu<S;giԀ?!:nODDy YB4J:'Npig`wDSj >kh\"N໣ Q|-E>fk˲>՜ҥ#:r616_0|6vߝn/1Ֆ؈[/u{/[LDts (z_ײqD-Gk+*z7t7^d97-J d^7T'^o} } s?[;=jQ6Dڶy.[W{jQ8^M-mo#qM5-rVpnp=6+WjJi=| .cNǞeɼ6[d˞+|0z k~:NhTnfT,۟ATE[ k>JK4D'?R'߱cӧOcǎ >3go~ &VVrR`S)]䔌n@J0q:u}_,e}s(sQW=֔X@6xCcIs7ǼΔJb|߆k0p41c|39j9I0X,!]~\ҁɓsy"ݧ9}Ǝ-ӭx"S.>E^ y}vɻϽW'829-_E܄}|ue 횾ʥbvoL@K+B Fr;'ܫسcV~3iNh1`4[W&/9`3WBPҔv q+uY>'xx́ yRyg]& ={ZjL6s6-Z˕+Gͨ-uAeQLYԋE@p֠jSŇc|Bf;Wi6;sDGkrr8JyX6e],צΟۜjmM>y)d&ffG('Lϲ؊Z~DnPvFR1J-U[t#i^nA-=%[,U=0$j>U:x7h:e4G2V=9IqX7y녶8WJr؀o,wSiF=n;-G3cB3k^~֋Nsݿ%'"nWhS" 6gu\1wZòNXp Qk7׸ \z^,& w^'5=3qvi%O_;߮28T$VaqЬ P*dLn*{%1KU G42D6Ϗ tmR5^q40qB #HۯX&#@Q&@5>E|VMDF%͙dC:9nS(*CG8`|p Q˸3ɔ%!S QNvd{U &b0K& dO Oĉ)SrŪ1h\?`IOف*QG¤dew $֭(=do ]ŊQN_#^=i"׎;7:aۍ(}Qcy`gJfrAgz6~l H)'_?*V_ =DF> dM?9~2~7/:".XI!L,ь^7Ҁ ,[E]kX~6N1foA{^!LE~Aug" Aj&0:x K,^|>QlSyg'J![ewa],FyV!?vBq. JARഴ>-0zBlڑgC|c~&::0LJbqT``ҵe̙ ۲h[K  ^q!?lCl3'SM9 0:HJFLf;Z u %x4TT&'#2Rifiq1Ҋػ *.z=!."ŵPK 8ŵPNjO?myZ( ٷ;;;;s;BGGe>U]M ,MpaSO1i޽­R5E\.M +h3$b54J+8Z4mA\qfQ=(sJ 5ݚgFahW+ֻiHbLޞ9.?2K0EyhcpIxU R) *jٜ;)!b8V_h|KѧĈmQmi|Z(ZV _~:lݎ0H a7t։ ^:u:8n uJNTIK.%Iӫh`?MftCE+KT:#$LG|g82 1ȓpw Wd|^ʙ\wrF{].3Sذmnߌ%?'CW¿hV8*U&Rl:xB}*6W\f"W9!ZB(/t , '0k&\z._YNŪNC{Kx J=7ZCkVazx9L8FGQ!K7[cɼ0xR0WcJUW!%7~,.>K!RJFh3SfzJvnݺCa编13#@iZ߅z-!Svxr|#z4n9'n aQ8wVGcmHx%Lz5T|=Ԥ|*BS–Wqew:z5Чރ3V9 T*+0UN`s,V5$!):]ΕL{O;ӂ廸z`qa2vÜ=q3!JuYm֓NoɨGF6-*Jt8uƍO~:FŹd#Y\20 e2IEwv(N"ud\NG u>-BI`/!RI By~R6^[hz?"9Lij(Z* \>aK[wC90I+◟&n-uE.񭁹ǡE?Xjl\6>$7&7kwO3[ZaڐX,QxiwRj,ZMp BBz _M0@TFsJ} XGIO. +'" oW ,47XxըZ*B\ C/xU DL~njͰ(& jXA<]n_|[졝!utA{"?*Qy[u( ;R&,W =1U+R9w&רy8j zZOYs|{&P8QJyx1u7QQQ›grnJ>y H#{&,i+NҙMjTLqqř|>(L>E.I;S"mSP%a'ĂTwU{@k'o0RBƧAꚵҋ&VlE+쓷_ Z E^oǝ+qKt)zwBEn.j|e[2rHTF.\}ɓ'i&ԨQ}t5:ǰ );@U_ C02C:7jZH5\LJ i0kE+ o!M-!'`HIa 7QZ.vPoIR^N/yoLr~ĎɿO^^xJQNY@{'0f6rѢEu~,X# 6Z3yVy WwsT2S)󍹐B" ڎ"r]?gn#yAhKd2#V(G Ysgo ncg\Ycx "{8```طov ???]R.\RRi%㊲xGL(myDm(Ԏlz\Ev GqcdƤB^*bRɨZB&6"X'?\|XC````` իW… \ԛer%/]oUTa$P7i#J.z !yNzg*bH% cЬuO$nSg߉+@n*5iBGFB^:}a,ѷj?~NDnԣ491CΏƮ xZ x,KvۏFtl<4&*sE=мzp>FuJYvQO᮱4:楸AZ hTM&Ed~`t$5H3kv(̺4]vaǎ oE8C?%>)Ӑϡ$Ґ˅߆pe']:PLTV 9 'x"Jy"t< G@b?t# DŽ "}1fax7eߎrn 6[\+qL_mClգ)/>Ss8s62^B5;r w}u 7ODd4 vt&o9z9xE(~ݺcg0u J%&Nu֡m۶0af͚I*[nI&12R!PޗJ DF,FǏA܅2I{6ꐉH$ }w©@ NnzIt$=#$VchQz}Qqb}x"%e7tzLD<|+wcצ0t~YrL1ط,>ؙPj(~t-G ;ty_KhÖqc&=йk? 3 ߌƮ[OXFQcӪ)ӥ{*8; FB\.LjV넃8w*~](3[1O|={Ev0|,Y\>{GG/c{BcW_ap N/z^ڱ<p;tŶ Qp藮:sM݆70ׯVPL̄-СMX0b=Ks6n '3 g``x=:t[Mͬ$ݥKdddp p>3VIy LBeRKdJ>10_P1R& m{.i!vbg0Aorm55cbͪ)0{~\e8ҩ9ތFŘ}.-4@l -^\Me,ZY1xcFЪY\y;f}CҖhi r~ ó,ل(dE'%a%Ĝ 1dfΰs4b=%(,8^%#% lF W:n!9k^|oP98!;Ό:27;B_ waς6;GϮ:̀]݋G~YDi0zRn`p/0;ܕ%.ڇp,=$:vj,YRfGI”8X?E郋8ЌO0X?o$O5z =& kcMxaqrrj*oߞsVK%[j)SݝUR^ՊJ #dR| Z=bA\Po8Pxohg e rp-ȵ Abuć_|yRjKh,C?7qݏz aDl}6`pb TaV,݌% vo;Hvdػm&!mvEb߱qMcᱥ?q coS; FѠvi|֡# 9B~ص9wn+ظd5d<$ A6wl)47?#{g5Qcؿ4LjœEd:i3/q"26ʸ#4+gA`M̝g iڶ{0JV,BJ Э[[|L&a򨆙ǎGRP9b3000 tM8iy3}tP2 kf'H u.N?ƟCDXC9_5# QpCM.K*_c([FI ː 9LN'ߨ#&k;p.Uv89]BhlB5ѦBе#d??6]6)Ď2q8W6;sj{res\; i|pT_E<)I ѹIa_(bXo/T WҁB^ٟ_#BU.ҕڠAwF AB?12ۘآ.&EPE 4p괰d%#I%E-ѮYHRoBcq>!5#OF~<|~ۯ*w]Щ}\~ŝ RT%pGG!rįbƹN11.D $+yNL1+0qpeXRM{~uOz"]} q Scqs(_ %]loAd}ѾT~}67f``htGhذ!fΜ{qj͛ zmB퇒#&B0B*MIAhu+P`QeaVe{o*Im2i{'ED@ZILfI* w6._ٳнe"r{)|޲BIck9yN {KJ&~zǶp"/hВgiHMM@LR&Lյ3JuБRuVC:jqdВ:1Br 34Z#f$RiP4R"h~jYBK!stA1q !M>/XG迨yZF*DR =Rr՝Hz)*Y}&ʢqwC*c;HEJd/67F}:2C1W2h~Wo^Źap5?Q$!@ow8E\/}gOFHIi:7s6.F67f``x5?~-)Z(MOOTիWI?^FUضC2]5u? l5l7c#ih/Y]Dc?qԲ.6\{v ()WrTpvv QY!Kq4ljC=9򈰴xNz?o0MYvVBr=Ts縫>7"'n&=m;paΦ,ϥaJȓ`kfjz&+ ?!KYB[YPoU[Ϫ , tBy/$nxt@ţ%l*@謋21aօ(W)ώ[yvo]zcjX4a9c>g,j)_pYb䌟Rkli*EBfAߺߢŰaf*ٔ*JP614[fK9kmnHQ(Yq)96$`5Ed#736 #V!/CRRҘ!VUÌ妻)VT@k=$uHBZ GXpBt:!?2a )ܝivf趶RU(ap$CH=䲃}} -5M!(4BMn`/P_0^m QTY7ꢉ^uV^r>vTE6Jf;j[Z3M PptϳzoI.!0ȀRTnBpy^I{9\ePrp/)ܟ!/-';Qi-RbZRIo)HT^ 3enNہize*If2"b~P60_mmdƙ$ C~l`\"~6LX5ɘ,/ t6[y%+c>h@HgߟW,УZB䢨K."m*s7+k1r_S5[8+L)Kԗ̈́b*H uiwnɧG֯|`B}RbdDsHd'2R}SYOC}Ϩ(9nj9|r[2[Zfqw.?L 2J4ddyGѕNEVA~V9s it@ |}"[]-d霄tfܨtt!HYUyKqDދzʅO@lMz .~MQ9xz`'0;8eX6=,ĉ_%yF&?/ma~CҤ _nācʋG]Զ ~ي |b5I'ɴXBRtq-o BUKTKUٓ)JGCG2-gد%2셐A@ ז{7)g98"Eʓ-WΐT` _TQ]B&,AA]jDx7[A=PgT-#)F#sK&N IVNlG0K'}*9q( R{Ve?cz(0ĺ9^dą*?¹qwle5ic>QeUa@|2Yv.cm_oN8 -~i\YNiy-Y.dnsQ+TIP5l9%R'~6m\s>|j-THw{6db]Z x !9G`/&ǧ#)2xMR1 qah?l}vfzA\7btqϩ%2Bqaz§G0 cHCszɓECTK·&l>&o{NҊT &CH%b <ߧćExM5 q,Ck~1"hUhV } *mo!R:PjA'o_ЫEܕa ]9NgğF$cwO cHE(zX-ZV周!(ƨs*O_ѸgHf(nt8m\|ʲ*p`u Н3z..֗~,jz%XKFijN=Fk`}og~.DJX]U Km-!]a- yfey[&&(*-unH[DL{-ɷvO_8O_Qƹpa\.9Q``bJw暂=57DSwQVhvd]2J~7A@-ڠZoNdghA#[ax^C8d7_53:"L"jIJ?uƏj*,d 룹;ۏ|;wxmQ\=f瑫&}x9@~m$z#yXa?2!^GGɐ+K1TZTvރOYzBZ0m kagAiK%pҽhR5sQqEnۋ#?PX/C`:a0Q6l W2 zZ=HTH&=K[`IQǠoW ;]_3:xQP ?*G>'\8am3GQ^[*0.gS&W zgi\6h oOa0A3t[ʟ @qc/A-Mz{>Ob6L^f >neJ%&$Q%+@ia bמ$+/ ȑWă:u`4ͱa鑍/=.$*RF*/8$ QĦ PzX-ӭT<Hg sZ 5T-e]e? NǏG<:NI78͊ M߸,a,j|^q Hq$y>޺r> c`{Ln6l}B- J$2(gjnr"X(Q\Ɨ,TQZPt3porgiɰ^qF x`!7&`,m﯏?7Ini\@LExTP0wImOK KiQO ޶DjK'g,XuBhbJBH92=oDh UZ7%} ,-t'l§?/D!M_FÂSihs0q`1˸.XU|CTIחbSM޳HKe/q kx#QS$s&| uuؾfCe=pr-*&_,]B I0QVg7dwh2_8P,9]LI\|1Κz[jqQ̹PiBl6r5V:kLbox814uPpa/DcHɄ0s;[,*ˣ']߿_qͰ@K @ Y<4<T ] 8z|iAw+ĔTEÇb2;hȔBwnAq tM] dgɆ:I TЩ5|B [5r%7y&657Fᚳ +([8it!֖LqV@p0Z5e2"Ċw5 M:"n: ?^tۦ!_ uA##Imz..Jo`/G o/!IJǛ`6:xv҅G~is/pf8BxX[9ɗK/  22Tv3R_@IB-SiEm|ǚb‹3ꘫ+ ThW(qG~|,t6n;Y UFrV5Q"Vt^–& bQn"BKLnFC F,VFU$Le;y劫lWg7260\(u#(<[F?8YyQT)]W~U7pcdzR"Mu.MD)`6:׉F[ZLT"% \zt2Wk=DWJw*'RŐ0]8# G}('C1eIѷA.^=Ih7NyVVSZ<%]1=D6h4D sҪ*ݾWI(%Qɹq}>GO3s;ۜaBEa3uv}B1?E6 L_J/=n9(03L4SS :Y"ray13+ڑ{E T<cni]XY:|Vg4W*M!"yuӂ5PYA$dߘf)u!le`~颋(ihEN>F5WuPF+5&5y+:lѮ(9ZLlͺM.HIHucV!NvXp62qm:q'=q'ٿ-}8!QZYDP% `r Y! c²ef ԢS, )a4=CQ ;^{e*S/Ԩ;׺=`zPGXbLq|p!gJhEG>Q DyJR ,qvuhP (C%&`Jm|2;o&YIb3KT SXV X ; ˚j>ɠx0iQd73X!R SOt$͕)0棟^fAC"Ȏ >:$u>J4EU.G_u9]8vfTo(28um|/Kd Y.CWu(SCWf7o>'eYraJtз۽MJ|a1tD'J4*l(C/a.a[A~4,B a*-clQ9+L 1=6Qd~d 75U݌MS*Jʑ\ U'y)eWl-Oj^CyO5Xh2JI2UOj-KGGםᘌ{NT0۹ ӧxZ ](CӢ$Gd*z6#J %.BY# 18"j{\ѫAzquă"I߁(ԅᩞ$0vMNDUDϽj_C@{ f]_ɒe]uxyp 8ao:AvϖFk,y[XȸA^'#. >r-銥I%$۰B}& Yt`/A׵l[e5Yw'Rp9R0XK LC‘iC8YB/r SdK1.Qxr}L/ml]h9bs!Qkݡo*IULfbE:tl0r%1<7#h6*q\No8W >=}?XBR,ko~'}\yF7ei,!npWq]DҍQm{ /- (!VyYB)̆yK?ﺯ(Vef=)c W wX$)AT@jg˖׎ 8K5'|UZQ!XW> %0>FXX6*OSF%ue@*`A+BFiLj>^2F8 3ZB6NRa%Vk\e©A* B؄ pa5G/rp>F}bHR)ug,閭%<}@;s֙K,H^Kȹm/Vl)J/0dk"#P\TiQT3]ʈ2Z8ўDќbAk y[i˒x>v uAr@?t{hGZ^jd4MJ[YVpN+6 |n)BMd>W8=%$RR>k^չ)fL9:UkU)>mgDV3!+5)@ůi0Sa8 vB|%4R5z-p`"o" {)Ppd! B ai+8IԴ"MjJ)q9mc*(ZZ1Ǘ<|02'uMJX~|״5x{Mo4ذPw(9k_ ";jMf+t 0[ʭA+W.$}&c^W!9n00- JO~Bz,}1!u@b-*cTWcJ7%ځZ! ʉ&G:=.};cTIU kmdvslד[*l؂ROuh`M!EKEM@*` /e*q4݄ j"g$mɤ`]&E̔WO0uZv Ze:ff MB凁~/2&b_CDn\'̿vg~4ө[Uo6% 0[j[A[| /+zjPbLw o2$$ҕ07(!Ԋ`9hIC jp0_1_whKu;ۡG4\M[fhA:_pQu bsMiL."H+ .<{-5NEƴuEG32甝ly4* )F?0fv0ƨ8Z9{"-L ) A YY2`u x{QL'9bl]8V+7[T" N3zQ-3L⭽z0HRشEz9[f@2$rwe5 H0nZ !y,P<=|2-*aLN7G'} epV1:ZMm!a2< uRyרDEUF/%Gτv9P&x"qp.,0KP$/F/ܕV>f2P)0e \3YĈv5*pŅTV߱q31Lvz:YBa%fF7ѹ9@TDw=R qubslD K% Ζztv O5ͫ4dK2yc##y֚A{jfu%;wMpd,Q< eV'Q.saTzd!棍FXpdlEjv0fjFQ I|3R}#>_.C2-knDtZǫ*"g[\]s.db?EIO8@`NaqX>0!lCAFWk&=FE7/ z .n,bnE =xzyk?C DV)\L~e~jm"Y0hE6kp{YsW,^~ O%]L}W7dP23uP 9Px |LUࣸy<5ku|:.w.Ϙ'v̞`;s-N0$@-NF;gڑ'=E`Z,15g̍B%1z"mp=&wRUN+>IPOQs[#DJ_ PL' QmTiT~k$:tH}q<"mЯpϼ]0h7ba _rMs-.'ÌU_5'z(5%?Ԩ?`?}pf㓲NoUKt!K'!oLaB_ϻ}_E[{&_/0vhɤХ}pk~b9TWj_KPฅo`ܮ _0XUv9T$l)׹ 7F@E6AXh3O4xc\CD{`Zέ5H[9mnJx>ۃ߬X]:眷+zhs /;?BS q|IHڒrHf~R S[f&Àp|@Ưiۆ_\Mȇ#XNԧ$;F'&<6((\0agCԗ{6%XA+>^^2p^(2;t)vˬKKt ILU;^|&c?@L`?!i.M '_`]{[ΡX]ٽ$&O4?B=0ܝTac$t<:_h"tYCHy͌< )*bdvww:=P*Aj-UnGV M$N AC%!/6Pu g,ȂptR,% ƯFWvOʡ9at>엲46*n7l ~;kۆA;cgv@VCJqWpC8&/mNԸ:c3$Y̕{ZA>+nlHꚦ&,Zq`l:t+XH(⢨ܰF!EkE>Iͯ: _Hnb6fZ @j DOb!yij漖.w{a6M`vYwwB5{QCKSf:n&"KA<1 ^-,x ̓ܕ0 \iy= h`9|bUK JeЉsFmX͘lV#k>R}ٳ㹳o`VX(򟄞FuWVڔFNj^^KK;yʋ퍗@ןũ5MNրI'⛕i)\dXdidPb͞z?ǍgwR 4_)rhU;u(é*TCfPTea8:cD2axLZ_قrw^yĮM԰: GOAB:+Ȉ-LcԘ눗-]O9eUWF!fڂ c<"hVֿSGa#8XiKPIIjtJKnM]¨?QS/BI99W`^f \Tz?_m٩l䠫4sco}M1??Ʋ82x )+n8I{`N)QlOЄl9~9wqeZJ29v,bA7dg?1PEjf|̨_ *4We ;\Y/A#!s0 ur!WZ-EmDb6~MecH$^}X.Ac҄'J[R M-WVByv(T>Ee}y/ϝ!x}/+({/HH}ACE kX?J޶]KM.,&˳)-0\<'~Pۍu2l3rڮ(ooztQ=P5P^u'„1gFJ#2%gHchZ{iVΤKnڥq9džkIc*a %zu7Sn*\[In0 a"JgRWQP@뮒?WBAFY.|/-|fx>1[rͣ1&y#۰`x C '.~W-A@ C?YRR2jB '[ jԐ-{=hHBpUz8|^av]y=ax}k=zr{p 2 pޖ`_*Q"VΘ4K?c-J h;?_<Ěx.Ec_ԵD?Kx0g>vhEOஔݙ6GBXap@![vŻk͗^BQ6,8)RN$Vqf=pN99{S| 'sJEEG;3= P&aMnI_<{c;U#H9SS߳AMެvNv}s(g@&Il Egy.nq4Bq-GVt.Kɳܗy~a#槅TI}on)k.澘Mg><'Ԭ̹Hhfc!3[\^? 2I#,wmyrӳNd0bdTj10'p/=Ln +D@TL;yeԊZ$ٗSXe[ [Ӈʫ8D[ [Z%TL[+F3J+vpZ$j;hxż_O8A.:TAjj 6)m9Az)s]NccW?L.?+yP/jX 1O0ݍGo:GLp: ~G&dJv4I.K|~OHV#tm5Lwg5WHj˒:CQc1|(XwЭŊw]{c?o4U UY}FݎjϞ7#OG~9h Uo`V|qcl;me[Doj9 E>br[yXq+p4s21E3=:rqHMgS=X3f/ySmH3O5 {^~A./to@GC_#o_W?z՗&>{=rs8|<ՆL໗o'2SҮMG2m<9~2g6CdcCi.$?R#NH&^xv xRsRev>0ϗ!!#=Úk^A|+@B5ќȊy5O k?’w3!teeOs{ỳgy`f*'Eu?=QxM7"#l(?}7G ȅ?0h4Ɯdó;-߼).c;fçOT53S>~8z¯)Wv~==;w}ݕ\qu$]8TrO?ט X\>[p1Re2?uk*N&[׊Žrݤ$ף$xc+[p!JpL$jj0 uV (i}4Ӗ wc鉪W/j ˧}0 q; Ɍ[ؘ iV'&!?ϬOܹ]zeay\-%(zMv96BIjg#$ N˫8" :R~]PDGxOo ri%&kxۨ9}blМ{O 2 C x_'Ritbpɷ.T^=hէ=;VoWotxWN֫-tS]7Ha^6Y9ͶrEǓKNNfyQE[v!9mkR lKҸ.6Kayo1^uGsJLnʧMLE>5Hi֑ uƍEx9a8{ͻN92R^Cѐ>n^+㆏(3c1nwoEs]]e#&S0zN!|qH^,M|=Hx{A^Yct1'ůFՉvt$b*w"w՗SGض3Gpa<&Ҽ!a "c~Nls5SB -Xe/ښ.:^]pǨWdiؼ9y?|ć EW"Vsr zT+PI{3p6G,ȚIĆOW?gM+56ć=N2kiЩ++f3/([Q$^n%αז>;Cp"%uUoR/Ŀf(-buHK'.&m4z_Ef/%x&,^>ih8yWx\(@|J4hWZ!`N"ګ_/ToLb5W@mqS~ ªz;@+$^;5Fb\T(CSQ ҋr7+ pM^ ۾1QOu٨ȧKLxDRMcs> %U:E1M-լFbHKX- .,.i(.)/ nr2,-zoӘYuʼIS?t,2!iК2aG-#\}g\,- ϱ|ɟQgJ63j874C:Qn!]篛-ji֝;3.]b뵢~cж;-ob%p;z ǘeڂ,3 G0iF=rhТ9m7t(\ 'KbU΢3!xu/tH_۷l>MT^L9zRzvC-H~-}Iwc. ?3 ӛDzDkC8LWޣq[[g6v%G`/-Shp)n^ :pdfmxfmauhӼ.vb/fuGKBs^S +֑sQJ ^'k >J_ЮFƴWv6Lfb,Sq{'!yd+=7pdcփ^mCsHч v.c) nNNifYɢ6n|xkz*OS8f 5զOLh>6!TE2 wҏ`" [$p6~ydOdx.dž8a$w@Dy_Ú8c5ؠzBlߓN{ &Y[87O&;m#}mǣoCE4>"w-_wCo-˗ais$N`Ѿ,f976ݼϳKda¦ظ9j ZBƩ\0PVY;gg "!O ~}EwSS?Hb^ hW& 6M~zw}ģA4.؉Z<6Q3C4 |1Rݡmz,΋>M͑Lxr29ѾdXz&5 N-ضm1MCj NC14|H^Ԟ4qMks鬝m'$? m֙3SSJH')Cޣ2iӼ<GYl7˱wbSb+&w@ռ=%k^-^n`]wgsSHnk}z >NA,z5}\c?/|ƆYX]dK:ݫYtMr6 ;D~L?Ofږ:M8\~^;iS}5OLY:ulшB]tSY |a>)\ܶ+:ǡixGǷ/_g{yKֵ8CߓwH%S'-%w{|J%oa+[> ]o,BXp+_3csʽ2 *:r;kAx[Բa^N!e>-Pu[ɘ͓saZ;~ϊⳟߤ`*u Cք̄%@bCa`,?bD po%'xE= /c{#nwlK2m~-&~.3,& /݃,uoguiV|lt gZ0q&a$778>߹@a:Lºq[ͬTԈ9XFb =%?wcW?< ;yvb&Rl(DZ n)7f5OۚLH!II]_oq?[ϓW hB@d0F1ajS'!Az|%޲ҕgS9^ʤmS#U|@:V*xq|k> :6emRV,[A{WP%PJRJ7`X*T;维R7h?򒟨F = sI4[3l\fB /~+`R =[ӄ6WS+T]=9t*lC1QIBBqE.+^Z 9FWWf4 3LLP $2!K _9@~ރ?~Zq A)^$_,d16-91jђH+PGCVL d+Et){7OSS/ODOpD$M`R('$93~ %v`+]KXM*VS2:' RUKV]  U|mJU +kIq !AxGpb1%DyPoQ+Mg 0߾![jzޤoc`RoFvh\b0Xs zOIJw3@P[h_T-Hf=70q~x4;Pkt]`7: MA4hwh8;bGbC& {fzV.^̏VWAv4BDVtI&YC]D^pk4Ul=fl+0GԜ0m'+ N#ͺѮfm{ خ.D'@s D%5C)y-hٴ6O%cv| GLPM/N|j\**hGże*j^M9҇1oEvjXIMyYQTK98'+H7w! ϒKUrvf(&K02@@siB0fP@*n$Jrr>DNӤh|,|3[LW,_[yHۈhe lZ;A]{x 5i$PCt #KH=iH؅e;ێ#؆#M (_8KQHݸ7pK;W>ܱmt}ebjfqQΘ"s'p>3WImn do}6.jq QK*dkJ\&7 *]i5Z6nDxx"q]h+%ahc8r&yZt/uI(x563+{I]yRy˔V(j1L;u*Jm?0SV+_o(+"H)N#`EaLXt$?&_F'pEmϡlwoi B)bZ1QxIM%66@\q@N8 "CHW[XsI-Q F)+LXd.i6B‚sf s((" $JF6X &د0@SVo6䒑WWqi&"1  a!mШ8/ȤHkJU,,ddP DmJOS|8j<ŗFQ[ϱ2v>[ywOOQy"hzvѣ[.;vw$%%)RK9Mn 9I/4h*ofep!١dgHau`qb:Ψ9X,W%mŲvռZǩf$o(/:2她ӧٿ?soUN:ѿE*MU֋wQM86YnAڋ}⟜^9~~J D' e&CAAAX,l1^kBRu@}%ͿPv~I&N7lؐΝ;+m^RVf9B큹[6K)ȎKym.e@KZ7]y VٮA6M%ypy] ŌT^t K>Z~&ݬOCڍm'&fD{uB=IW xzΜ9MmgϞʽ_5N@ l>\{V+}馛Il˳gV&Tj wCX`/gr%I#_m[ŰaÔ|NHe:-R6J-P |2UYSjls reJج kNkRGybk,/*(/۵bŗ`1!ёw&UnKIvI#ܞ={%찥@VN1vОZ 5R:hC.]V+Z^igׯ__9^FYrPyDDD*Vf(}R2(gH ';k)!e9rАϖySs>yMR^USgtERs]"2{YF2?X_dY]͚x6l72 G~G{%nƏy74w=Vׁ2}`&cٚ$Nb,y&#%>!TeXlqrmT}WS^sud&6 `(ѳh+Eֈ33p&ۛlSrrZ^=e)i˖-lݺUiI@'$9A[jS('#kxgϲqFeo)ݷoJe~ArPX$(ш%0S%*I>yQ:. l5WvDՎԪZaS~Tb:4$*tͣSURR9f.\L7!!CҺukjjEi,XX/E6L5C1Z0@uhd߆elIA= q7*CD]l>7"\*X50 {ž/@-'bbرI9.^̱+5q||2)e@'d?FΝ;W(_ 'Ъs9YtPN4e{$u_R]ʢI''*l}|̳̓Hu+ɉJ@,59>"QwKMpw/fsM%vSH+\&& 2i;|o_T"Wԡи0g^yn #j#:Ve:/QT%Z9T .U@*STJAXYW+N<u3+V1\6k,ERfMR  ϧZ[i\K$M\@ؤji؏7+QhcjjN&@옴V62uYS*bTTMv5xyA(P@dSQ)(@DH?1,)40Ք7@OV6X,@Ug{.ǫ#n3JJriN#kuXFUFO[^P Њc׌Jw7ϩ`{K+;WY|E+Ϋ<]ӫWfEe#}uޣdu*Kһ+:Uۘ d`1{KW!ra# * K!I*9$jfrp/B|˸q).).f*ʚCx ΉKu*պ$y0ϙvuͷF-}U"./-K;t[Ff݀M$`*q]&deݵz+B43`8]4,?:B#92Ruo,q)` ]W_3oZTQ^FY` Vc!:.#^\i ?ܱirʯtӷ۩\wqkIUwNTpĎyFZԝOEkCslc KT`d^S)^'Hqoy~_|Nex+NW by+H'+/W_^^fqh>""[S:Yq5uK(&7U D/wpƿd,M+!,ǿ>ׯC;;uPT24*yL*ǡTn4ҥ3\KqVTsJ+W9.*` L{%^'@V$aV[YUsey-Zݥ%i))Cc]溔\w-fsoL`@(Aɝi7ּ=;ШL/JwwQ)R +͛ x7T@NU:T/WcUUks:XW)׮W~depT%Um(]ͷ:r渿emF)珯*oU}e<0{f|^4iꌈ &Mn(ݫW{Ä_K2>bxH >4q] {m~k7dԋ'$T\v6{ڤ0.r@|ڽ PB1jT4r͌Ö%xy^jthC^ oaԛ&?D>h@:)Mت$JmRRشq#/bwP#JݦuX;"icߎkaJS #O6MCmuR^ɐ{2a3xhC[ r|.&~ƅ0"kCxySc;sNQd]hK6}sbqq_*:-SY^hN5* ݨOIX`@;6VpHEWîvұv+2!ꮅU !bʗh[u[ٞZBDx,r(Q|h iPB5^CB[:uu^#i23 m/$ÜzgKN&6.H@%MiYS<χ,:iޢrPoWO,n@&7rQ̰ 0&7IAωg8QlRYBH0^g<oz$}D^®T#9ˁ_N(Ψ(ק/_}5)}TcYZs͙OhUXW͇ſ>FhW\+<\s0:2~CZ}; g/a' ȉsdS^ñ<B49[/'|h/rVcSXCu&~~^z1dt6Zy1rc($}Aoh~Km#cW =Mج5| Gm<.PB!Iqh~_ǏSgBJi^d_b;#fF~r_~<+rÔ7huҨ7ΰ.J .-/Tպ7l³#sPZzWj?&7Mn`;VǀqLk7wzM%uT0)coz[Ww5I G &ehVO@F~g K$ >"@\kguX [JVj+T.ë%2 t4}Aq#sOٵ?|iT>Vr:=5.!]ߒw|{o<Ѫw,Quo Gw_$u fG(A&-m#:Ybo/ZQN^hLVt~4d4]<}L?op@ˢCZsf|=S  o 1> "%*=Ibh(?H!Xñ5[;FVkVSD5IfxKX-8ZVʷӖ];Yg>޴eg@""#:NHʪ# (&7HRm=U~jppnm\c :]-5 )_+xm8YNJ)UR7 $0Ν:Sr/}/:i#,T i[,κŦq5xuiGk إcj &7&EEcјda( GCb<1z**hfb$ n$ޣ5۔bw"ObW'zؚ.7vMc#'Pt!q!}}JyZQxHџ֓y.FTkW5~a)[6".̟`DgڴIBd Kb6i@/(C_oKβv~MJ}'֓{!oJڴm SZ\Tr&7A)`Wڊ-Vc_iqH#ԺH Ė$ nŸ&ս:@@I),))!4,ͷ0Əp2_DQ.kXRQU⡚t\[SCQy+bb1c֙0; 6O!ZĴ{9 >9@wm ;wx=܀_QSz(,/ml COLb]X#ulb4K\8bƿgXw<[!(HTQ-gV˜x)R&ߞY/|,nzs ~`?{\\2ϒ 6|{.Mu, Ko(j1g^t*v$ΥtJya/R2&`&-k=^cQVS.|'i\$ꇩG#W7)E:J܀MnrH'SzA+[;QUp)%69OnFq:J)a2N@)ZkѻWoMHz@کshp|Z ž1{ڡzj`+:j4 V@"b1_N̦MyIh|i޳v-l sB-xHr"5 8O׋!~XrSbf~5Qh¿F,zhMhT,{i*(k<-w${8M~\}~?TRJ'եUBv&7U+ĶJ P`W8z[H_)bkTP*oi`!ܤf-ÔGޡ0F υZR6K$.s\|#*UPHP!8%byc '!֏,-:Ub4KA!yԺ1PTπ뢓F>9xiB~F͹i+,VQ.Bs(4"}Ȋр!Hc#˞'=K ŊtئHؑzm XlRd4}S`dm6:SmVǶ;:mv:|ZÚc]=>E4|#j}Fo~0U₁ U4VTh3^RZ2.e?%<ʁf3]4LG߫{?zdhQE}P@PJ4@@*A@ K BIDI{of8h]76mwޤfX#Xn]+[e [07̶zf7O ǦB F_rWcVۚr(T ԧgڽ`x.p4!ZKjc m,!r^g0Aflڋf.H(\sV&t&G`ըR&uۛ:v}s72M E^#ټ)-O"IVDJݸ'׺ PƂ>M&(X87bŶHg3Ld[.9ccMڠ=0Jo3LJ!J]b(gEiۯ5!y G7F6'XXZK R[Y_9wUZXf>&'K1) uf%FIS[Cszxj2n ϼmMy.oE׀E,F7S%_N\L(hN&%cY6xR<l< HkK2((>1y oB\m#thE1lIE"i˳dW\{(KkеNj'^sBeԫ`. s~JMJ<`2e;Z)Fbt _QWEf{]3eYcinռ|E'ⱰN3v}LЏ4A D~Ql;r^l]q%x CP' #\yטɊQ dq1o[ 7Ewu%JG*]xQ˶]fzi@t31)W-'7Ŗ!?M1^cFy1 q^Y/ Ҫ$Hg6N%g+:;+Nʗ Z-Iчv>b ~")Rb#,;rCi sG)\7wIf LD7k{cטnz?8,H;DYH{bH#5s9snM'QD$ ʹHWf=wWGu ኍ2攴?P@vtH,R_(r"!룹iEkϿ t#ֽmtOZڦIL0IRt9-^ NhdzMgFm@܉DuAP7 ۵$,8gUaGCī,>SNrnXӄ-[;oG{7`]}2ddx[ /R>!' Ni ݦc4tFMO|Z0nˑo [AlG)~3A;7$NwmGH{77LbIgmh!I^Ih6C5L*Lšs,90 ӗ닭zK,b A"D:oOXOnJ>ٔBq+ cقA(^X䎰Xi')ARsÌ's?@cFölȍԘi qgs{i3k]Ha/$LfZĤiC &wLj5iYf^vݛ"rka>Me5K]ɴL3 8_c=WDt ZΜDWZ#('g%IdAh{B- ZLQ r<엛M Q&Nf9Ձ̺6Mќgl{ˌ2NW3^M潚:@kH5򷘮A|P-ğ݁ɢL"I45MBTAnms9 Z&@RCE\D:Ģ3ȝe,!dЎyPTd*K.DZ*+jӹ.u}#MX'y4'U*i$ cq:l& U\CR4 1TEΜ)F $sE_iKZ-t8'R 9@5JNps CvZX /58cZfb2^~8qPP?v}20ddO1̬"4b4١CI ݩ}[f=at@AT 4WX534`VÂCOyv? g9 L%;;v0RTI76iLnO!nBd_vʱԮ]rWϒrVy(9ޏ%0 h :2KPj H~U#2CwzM⁲/sXgJX܍߿$q)CLGvFfdƫBhcgA+JpdvY:՗{i7- ԛybJi(Ji~ع%H0z{Kl>$Ft#jgcn{x8/h4*Q \~$K ND]Cٛeܿ t֫hO<4αQC|&12kf$x b𤃱ZyM*JAh ;斣i Hac| \Q 7ʱZO#<$$9ؠ(Wd2&|)SK sg^aH>V?(deedkrKa "xU햃 P:8[Xc6* KYUl0m9x&.|u"kA7@lQB H-%F>;7 Kt8)Kd8=u@]`r}0:g-L/2T\A)bCj?kv'+K~*8} ohemYtR3>>@$dx`e5ϱsj#K+V%AX53(NKFFF5  .,'KPv6Q;_{.݈ `i7 KDCh`Soq'Lޯo:OԍBzÕ@}S˓$*D`?},^-BX9djRL/v2ߟNLCx< (GEfOFkػ<7O.U͑{e+DH_-]J!bNodb'6ŋRDOsOCr;㟇_‘D{R~4iKACs8v0ֲUugQHjEAwM;8|.XŮr֫P^N#4|j3av]/G%*;W#ڎ5O& Vq)$n]Ibgjg M;5 L}\Q%Zbw ܑJ4pwٳkɆ6tXa͂ `r9U)# 4 Si g̃ ˰dxrco9w2{UZEVїrv=GVm{ߏ(6ET9d8D/rNs7RNY M 3^̫?X=`tJ-! b^ @c`; &Nކru0V%.(#'OId =QfkX6D#_tKF-6S`pMvE>wӫuP[!=ĺO;XsxACWV(w`c*F{'qä 2 T*$ԂNռ'1u/u<ɯ~oνXIK>5$?.B,Qa=b;-$MXykC]NOb1PauFTS3 {_xc˼RbMvۉm#{mj oBa-l;f"AlM4*+0J wؑٺ:#fpq4'+]ߖWsMx@ /d7YfSA1XP_kCiA%يپ5rA&e#<-4 ݲ'NcF- wjĮ4kK`jqCBv/jC3X&V呛hFemUc.]s ۭTj(II9O[R/"a?JIuG } thvAi]T idZr3cc>~ mQ[`<{'藗8(- QX/Bc凼L{; xv^ͳ5ɚIF$n0#=W~@kgȥA_M7T{ɪ]:ȏ>[?5@UA;܍wnNfmn.w5C}[̙V1W.#iԙt N .a1eovM ˨5cVCi{;,%[L?&dDWzGq@œuKskil:2fT8XQ*+cN|o:`QAn l 5)-NδA'%)X B9kLHK3؛AX\}:;X ?qcFF犘ON =7bbE&3 {#R?2#?ycHi," dȂ"?︇ x"V+_?:0'YhS`niBds0)[gᶒzd9anvA9eJJ'SgC,z"6|N4%SxUn6u]*-_]?m1 @*U خ@ϴ n)D x h񀀵WZ* >MkEq|4!פkB nNn T,&[m*h>܌Hv٘T<.SxΜ&ԍob7u_~Kh)@ʒ;W[ E\ 0ZK3b "yRʕbE\I@KR*9@;Q$nEf@YsmY'{8f:KJ*}m=?ږ1(i N*AW?kb]&<d?ޅHӉdF8b*-Kos>mȿGgzd;@~mK8LRHEZS aO%k ig; 3~^A'K|547 AJ& Ōpl$o9EoP>r?@E!1lV, ,zo8!5/);SN2i1zJ8ǖq9EMR!]6]94y;|sbM}4>ĩґ'ځ_Hj٣9WJ|Bo;4 S1ݡY**I'V 'AU#V V4ݎ0l (hbȋӃΙ cGLhNGrpD9L[8 4?YG1G B|ȣuK]*;$j2Lx\_"v`n n}#^Yڿ5 ?oU@T74L/ U^ +dG:VDb^ڗ%)8y8EQv-)uЏawL բOK5,BT$ĵxFT%!b h@F} DW`NG]'W\2~XH>!ub%dSŪ#.5I1U*,O{=9)4[Zmx`1+*pyoZE*#U`GKzbA?aOR9k:>y(m2]][&&J&VR2 U?1P'xⴈf?HepW~Ӫ~PG9]i6d yZz Ŋ6[~wnßEPr%>FJ(]\~?>o sgUR#/F ʼ-k/:ۭߚm G!% "7aIc D5[ޘmχ߸~ф5Z{ IO)2כF~YdD;tk6qj\ 'rƺ8Hئz()YcB1!&mw'`؈ Bj4>9)IS@G̥39e\=M63`XzfUTrPH]a<(-0φzEgtP2^ǡ".TÛ.l# A+ }K¥ZղqmN|p83NMp-u-jZHLy\zǞ. y%eSUK_ˑ!Fj(wr2 2 gz.Iz u G53{R:" @acLXKF9\4꘷VϑH8&Nߤ ݙTIׅoAH5b9;go"yh-$Ц"Xܓ3Ʉ?)y Ji,;[|nj~fN6/  ]9$;·LLKڎ'pf@=*r<&ɗUa(L?:T?:|GՎBHx6\`E9 C)0ҕЖ + ղ%8QqOq&]Ǘ?'t;kp-} ?Ycsdky"Z,urTP࿩]*p0LpGK.ꟙQP*qⲄCUId8|u QEZt#:^1وSEdAXWJ5ntdg(Ȓ#a& ;>KɌ9p M6u Rd>'n̘$4br:'J;٫OhF&t RcnH%e"c9$(Ҁi#U%770);-5O_oFTƚIUzqr@5w|1qnwi c"I2!;>`zr? ݻF pΡ oj'hČt0%5ͪō\GtΘXAأLJ =?2/q#by4Tu{Z.7W`PEONnnG Bh;8q/.&7Oщ (DFI&>d<8Adi&+~yG򤄉ք+`i㴳,ذGNEӎ:>R?-UIn} ѩm;-E{S:TCn2DDD6+7]/^]7 "B%;aEmsz pP 3Z_|EY|xe`sv^=];G8T$x*G[q9(![7ܲ^ NR/e+Ū%h$$c 8~ﷅc$.@!!ʕt8HZFFƠ>|ttQs SwQWCgW\k4] U% ? < )nJ㤲N+x@_mmmPRw7~&|&3GG:dR22e =P{(ˠ2Բb$Bp1YX=$ȩ㪷 vΨm61S!bǎpr$1ڇRIUG=Ux[ ¥5d$Y~ 7 ,'CXWrGe$$Z7< on;6,$\hWAW1xc:*=uS=L<GϺPX s tWypF1 "%Ǘ۟by`qYsrbQɇD2Vїd݃ mgXWqݣ0n^mD1 i5PQlLA||hVy ~y ~ΔgggƦʲ܄D@.K_8VכuuL5~îuSy Eԭai Y f萘>+5RX ,(WNLɢY-xȘ9;SƘCFyo 8!C'*T\JI>SyIA :k3c >sssث M!gx5b3F#/Z(_k6 أ ^R92=. lןjr2r.2`9 FtNdEd Kbܕgwf~ eq%PGU! ?2 )@Ƣ~c ]8%bg-4Mkv 7.Tu &8x1V"A|`P0g=-aE0{Sb04=OUGMN5 Q0GƑɤ&&@imSEȩCAنR?~Ǫ$ߒvÏC[mBIc}$y* ͵գ`g-u { L n=ZED b v_ D4-~xqf f2ҿBKLxb3D:y[P`~-ԑdN7ȏm2}0氙O uz5l)q֋h*orcb[}a+PCzPZE#VTP!2Y݂!qEnTW n|2R(0\Y|\;^60tI$d^AʆvpPJZ^s/:q I{RuКE>4$nss3_*a;\T WÒH_HI3@% )OS$$d6["zX0Oxʗru)Fb5Ԗt"R7b QTABܤ2t)˝.s;))O}}tS$iD6d#׵I*sf{h{5z{y}=h]uLS[EtG(55xI:!ԸHG12v_|>UINl>d蟁s׷⷗fzI~vVɓ%g|-),DAW GxPw/)t:?&+2+I&- Кr)c[H v@.\_\`XL&X& +0v#?7YܿD_Ӑ?3{KY0N/VGUN17jOi'hnt*KsB!y5rd;H|T?t0or6_RsB)k S{$۩Z/3t?G9V";so31"X-q]đ$h|ZzF5OLՌby5O9!IU9,JӾiaUa1X(yQ粎.%js' r t7^TZ~s#xɘ~A5D_NZ<)bkG$+Tbe$ 2v GlgÂ>߽ {4a$k)UJ"4Ō[JM+΋nImǒjZQsSh-=Ѽؔnwa!u¼kj.P!==5{`YWE~NVǸ%ºqBiR [)vu2V7%-h/* @rZ;MT#P9n(=o0ݤn~_F.ke=,J }~y PMt{@&C3IRzʉgOG6pڍ*R6{oj {#n;;QRs+^lH%}ˢfjtřYhR 7Dv lr /VFF։ VK?b59D2rd^ #Ww@<%ؑ;EѾR1/631 ?ّQPOhS:lIHL*CȢu$pڡ@ cRP\n_6G`M ~v]1IT9L#bƠH,AIHGstⷁzEXhҷU,%ܭYof9㥑_*m')(^#(۫1BZHC]q6S_FU9*p "rPkr*EH\MoW7NѾq,Hb']}zcxQd8r i{1R"5`l^wIC`e&EnGlB00\oj9d,. n!ìBPSnܒ0\n Ҝ# 09p3 {/4kȘ}{oF+5-gs/ 5$c N<8&i:.Npo2D2XjqَF{ AQM;AcE ۫tC‰vbYHqRΏwQ?~`8 )_Ok@B2A.n[LC}?΂pun ,`hg(r<@3*&?nzT(Q/<n`F7e1]Fʭ @} ~n$H#՛P"-PgGj4\4okK?]et%ZC\_b'",E?îL0Gm\֓7*=;h= ^V?9=df  =@}/Hav;VgY-7ӏG3MjgB6^Ho㚶fՅ&Y0 đ>|TK}8 V)q%Tz{-R2xɤM&9522e9 fZXJ <T=P\y 3OzUxvck8n_rF…h!MN2/CH:IѭVd+IlKبML>>FP `2 ۱/ɣvL``'!*:,}4NUu4mDqV_alBAn},9B&_ a;x[ea<.?F l?24!ɨbgsͰL[%WڸOy 7wrB2 ?e/wphHe'MD1!s.ε96y#\!#KBFʈGNz “nzA^ޙ`3apTn/07\PJhGv;tnPEvW/0çgN6'< pt"KNepi}C`~ #d]0?K$ TZ>X _-X _*LD+qҢ&5tӒe|kFLxȖH2(|(&fI f5}ʧހ5Cj{DZ_f&bmx3 g)Ϡ- ` (*#/Ö4j{#'j:`J/Khj[ 9LO;tjd?–)ܲȗ;\@ܡsȻx33S0{E>3w//A=1J+ټHf&<4mf9噳CtbѪ!0`oԝp@Fn 9\|pೞȂAl=[@.msܟ_p*[ZS2kJ’V ڳUhosBܡ' thc|\~Yw> 0'ĿKWΟF<8WG^"=fDsH:,δ6UQϒm#J0GOU0Wz.yFk06b8n0Rz)ȍ3ӂS01dn$//.+|&a 7jOpp\ ͫh#uDs01\YdwS*uΡXW7@--@[D`VHI_'oⴝ~ 6s,cpDbP#ξpJҡ_ALj^JH_ͼS/l+_O7cT,1Ovxlf ~\Gˌ;|S''V-ڶP iq0Ұ< 0 G. qB5!.&-*1kwl%iP,yLlmk$PEJjTѨC -x/L,µA2Lx‹z~tAF@hBob.߈aՆj &iUkڭkF_h5޾}[н ,@k!]i1d"zRH15 Cjm hquyl?| <$pk:HN}*m%7=x8x: Yt48={,Ž;q& F#|HNxDl Th9q<^o {ay:l]t=zcEĆw;CYk8~š OE)V; j`ZTGZVNJ^l>->罺Az #h"N-E6(9SpǝPYw"hFCE4-[Roz*QkZ%E1Wp<"L4:}zWIXDg[,փΌviܸ0x4@s.&MIޣ =z4 =ʗ/M6 :6olz,uD^otƄs)'oͤbtsCr%6m@_o%a*!at$JfJp7!3uWŮ tZ@NRRҐ⁐ $GhQBレS`BXk ګA)B[&~ӑ~V~3 L|z yQ21R(S/cư4whHhM!W3+= THHHNC~nHOJC@*(87&o R?4,x%j˃Տaay`_FаNgT%,K!&j[j#Ghflo7ɒ)$T3w?"=5^/W,Eľs E#is{6LΨ2v$@hYPk*nVh$qnL &Hmzɉg4bzl(iJ~T$TS/|B ՛(jҒI3拳Gۖ ^@ Ft;T0 *BKhmBeDrn_cҡUZn\_JPH-)[B~$עw}.;nhֽq`+nڍ^Zr{y@.xvNYG܁U$5jԀRĒ%Kp̙ 5Q(P=O󙇲f͚BX&k. DBi )1:qE8yP?LnxTRQRG:@yܸW}bwlO1 ar;H#e:$$g .Ksi ƞ+z} 'rbXeHKu"IY(LM"czג`Zt C{ńb:.قPQ[QBg\Atk)-V} KnoPr%4iY ҔL $(DznuL&U&(vCj#w`RV޶,JgAT "`EЈ>`BEA"!WjQ0B,AD%@̕X Q5+}v93r8?373<3,3gزu:숃6?X xjHR(#+*fYm,⇗.tMp@rAy1$Cz1^6RѢFdap]@ylĉ9rdCedEH7>p>VuȪAx$+'ed fB{7(Y=xK3h >?BFR"G@~h_:u.D &C\;ޏ<$`ґ0}/,ø!`ʵ[EXtX"z>(NFo\^DbH;|+F}1OO Ռ×qYϱaGXUu3GqeBԓ"݈ g܈wu߇Сx ~\Uxlxio}[_bq#І,/?)!8"#o;yF-{>D* ?*S8 wAs؋Ā?|ډtiԢi=/|'vwZt|(m"ܓQWqH!fMc s>>y~zGkz\N[^:WɁN qZ wQIn,qG1ZT:zZo>xyOsX7,[x5.o3^b{g{؎~C_qmo><ʃ7OG{{c9Xp_r%ܸbFo s/b<?NE $A:8yh~oٳ/lوM\(<3ބB7R>G$ICߡ} |w7Jy#.}@0,BxM[jyiǢG '-O/e21\:e.X=B )  ; ~XJe&RX[uuu}lB7`q\o7յ_k=ư.N':^mLz5pjNچp\<x;ëϽkc֣XW 3@`+EvbeC[{xaZ7«Ͽbx*z :] >ڋud`!(G>WbKr[ї5?EIr߰/9u/w,T] 0/ЊX Ÿ*V=>O˿+` p+ѱ0`ca ~gH8c'_A- U\[srœcX]cR:7o^z$BC%e4/'H9PY ][I0Ѻ3 D 5-CZ_}n/;>([ak[n`8L =1ۓhj̞4YU6tSxc*RZLLh[;+rcSƃ2sΌNɨlqߍc a-wZL;=9+~*ވ`) BVY.Ywb'f$Mi7 b%lo-z1^zn'tJY6aoЂ&OBɅ3HZ\v4?>x\lW{Kѵ zfrx˯Į=[Gðw coEM3z۵>ُݪЮj]7pQ5jtibO'[ciM6+Gg(+sǁ^+Lx&V'{==XJ$Pt2O&r Q.}"D~lGE( *1x5+ |wá%X5sb& \9RR$3bI1ޥ ?FR]b[(0PPL{,\nAZ<sN6ԱAZ(X`kY>CTw"!M謨숪'z]q+wcؐxg76Wa?aլ;gbKPldi6fގET^L4ʲY_y(y{5]tA=(95 )h5DhXq ^o=ߒJOiӗM5+ޟGgc7S?b1{l-Ŏcs81 lýeb ҉;D{hӵ7bE%6Lf=NҧCnARވn.n(yq;p1sO+[^17umr oQCK kWUWɋc锒ԵLY u_24;QU-[:x;Cិ3&  ?5tp;zӱj\%;i6.*_:F:?  qc1؂ϺTY&+Q NlZz<,fy+MTW,**°ax/ |Y,haD`Xax`!L°%08Ԍq%"$0 RE.D<^֋.KA/+pÆx؃v#w-LWC@wO&Ry '@F{d1!I;{XT27Uk<ħ؋o>rV};x2&To] e.<1 mGF,-[_f'FpXME&ׄdy,q @0L["ope^~IKDb;Iqc@dÜ$+.E$aB/A3akQzy%NzoNF'E^ԲkM>[F׌bfK3!J2='H0w\̾k.x<#ژ:D=XxTgO죧h%Y #|G#H`Qq,&a)g1NAe1xhB1uM5,X }8Wq0B$'[%R= #N]VFtW8$>qr \D aV t ⬯bS t(o ZRY xXIg}ܸ"LeϺ}Di/GtEe|/X BH# y^q @/uvGcֆ_L] Ο(^25N|C/kIӰ['yc-y$!$]OF O']N;@:~䌅CE 9H>m ScqcJ`ѿal#G _Gi5+0\~bo@A/,.xПJ.fQ@2 lHXQWI}.v<@`*~z*$}!`0RD7=a<5S%Pd`=rzܩd^XDէa=Cڛ!X@N"nI #kG zyX3 dJ I!y" LPg3ȅ &eS~*YXʡZ*);A=4ARl(1z0mղP>OC`[VR2Vj(<ሁ{Ct}6# .Pw !%i H)F{!;%\CZT5L2FM /+ǐn{>|kD; Iy%yCc)š{d|}+g'5Nd!D$S1p*ўɄ ]Eh$ye93l#g⡶HH9҅! ©11X09?qV eFS+Ӿ_>t%R zp]$%住o >|lhhthE=jMP=N {ÉN=0 Qhduna-x*G|T7ce8?>Lė'Ň3Qю=wOq(3`V!F:1HLm`_zÏфaϦ |Kwˏ@1λED˶ypaexXjp fa"L.eqAK5;@fD˼BlЈHآC) =%X%Dj/p`*t40 )V<=qLhc*rnSxL^,/,ĉ(+὘?(^*5|¸%)=KNuXsjypjǠW'Dy󌉣2ȇVNcQ FD 5+[(z~y 0ݶLU.Q]E:N'ٸ^j(oe*w<+CdŞ ϲy?NҚU͞,דU_DG%U; P8cHWߌ.WQ^T caRPxG֭"m+#2DϜZnItN OZEs+a*Q?e/Y!{6 z^vc v'̀OEu\4pM<̧qx_\ss!le_z5?QU@H2a5(pb  \Ju\2ѪS5,bm=IB%OvZO0U`<zwɵ* 5b|fjμ"<{Mcѭj{t-O5˷jNBf*<(>2 ZR&>S3jd(sגcB["V?X;/$_g`;tfΜ xx(VtlwsdŘHOhlS[#M8s1к>,R\R3?t 6lFʉ VzZ٤:.= `6ƴ:-R l2RlVI=є0h)kU_gG>dc5j iqiE*4Ek&E/7iС|ִיTpӦMݻ_hҮđNARsl=] ?gՎ] i9sΥ31jɏL2H ʋ5~Ĉ'L[:iP1l͞:*//i/yz @-{7LD[^CE#N=r8X9&S'hU;&=U\hEQ9l%Ҫ)9PܤXuzRey50295>ˤsKM2QO3uBГY"7&儝nω);SrANcxJNR utCSDDA-T􏨧e_٩o/4L -WGZ|&%<&/؝W(^E.ZgL/R$4-#+9Q&&bVv}2իQ+1OyBda+jB}IgPmT3t?Uq|mg=-OZF35뮐Ysh|MHVk}M-䓍gROf#̵Q i%6(i )EVτ2ȇϞ|PkO3W /vbzi8=ma^v6|%sIVWSqƳ*tޫHfl*)ܕAZ-Dz5sz Uag#?Hy/1ԭ\06LYKdԯ] XSX&OǛm5v\Λlx]-LճYE"?a~h0_.8@-Pm*Hy:LVNszL]rrjg!hf>T*MST7JԼWMϙ+Oi]SIzm2aʎ%C2^dT*i'q6>rxܧ⦞|=UleJί!‡8Ɛ_g~h )<՜tX.lV1"P#ۢՔ̯D|./+(QLWG'56?zSМNP+>OCbˇjao)Ӵ|/_MIENDB`PKpF22PKy.F#angular-1.3.9/docs/index-debug.html[r6O07'5I;vi*8$׫$ DBcdP.kܓo&)ɩݴH".vVGz]6׋tŐXʳDzϋba:. 3L" LvJ{YkŅ7Cw'#KyZ|;bG '!@R$ل+H$H)#l! 2;\R<pc$8K}֮m<#+AgAVS=v6{ύL7]YzCadH!}c:/M[-^w1\;aLB;p-j)}w_G[A2/|:_xOXB9@J z .!OIPp-{?yOyuHn2a4o`u޹,EUAN.B6͈VQ}ڨ-"顝'ɬn;|e&CH.m4|%cEf(r_D>;I@_l: Bz~2GOoYëEv \edʞ>c'hAVzfs̐YĚ1˱UҔ ;}la',e9Ar~=g dLqmolñi'޴dբ3'ȘdV0ibb7u/ 'H=BY^"g<:Ҽ&{5_ξ9(J5%""nPۣã{/x-ӒNjI Bվ>x`|$g^ɦVXAd(սC\u~YQaTڃ{aZzثB4uT5&jr=v!)"T< N2S)3xS`hApk_ Nb$BVidQ_t ]fR#aWj./?h$^WcD"(צm .i( <-]X6glͷPo3vJ,2)9 ̠U6mdy`HfsyT"NYnP2yXp +Yr !'=7eCFb6TCqdE u+ BHT|İ@ojm'cCP T-k-tR?lfUHQO&`N>IM)fI :|VV1`8 _}fǮ+n%zcƆ\NP" 7$/r k_Vk,M]nO+v5*D`g$S|@,^f2jS?:Uaw3%dgpzIŴWo`8M7{ "͋?.7iz 쿏xҍ_bG}sE]giLzcӐcf7]\Z}7t^ RSv ^ͥ Ao|cW)cK-ٔ&4⢭7~qSg+`*qEf ~!nޟ$Gk:*)ULbʬnо|c~h|Zf-Y97wͷw)e?6=>ෲ{E-2|M6&J7{i+䫰ae0X 8QEV%2eMsh1;hrHP(lİ*xt;KŜr\VBC_>$UmIVH~#ˣVBݱ;&TS})PSn=e;ITDƐ"{j?TGf;sSuT)3h9솺@ JG.QɞĻ]Y35~S¶z!UsczFi^TT+sVdjP&r}ݲvƄfi3NHty3#%OK16jEg*.c{<'ZZ1df=<z'kmMYo(QSoAZ ;lV8nKDgP 2J– pss0yj=AucxmCҨTvN'wX* NpiGi to="vھ[B ڛNB?FX&ZI4X0zbDK"QT=s,QTA}Hn#aRn&Ḥ)ޒkT:xp1zl'd`}L!yl90')ff{[AU;.SE]n]8W.,oL(w"#Pi:-s2ֈ!Fr8bҙj&pKOmH>*pConHzcnO)0) -A$&GD^[.hPM:l=vvޅ4׳qۋ7plu8(kI44xs=hp] {!剪mL]#?fĄ-|kIh!?]HIݫ23> pI:W˸H:TWxuEqM5juS.FCln5 9* pkqc|DlwK#\KE?RamUcƜQ^ִӂmn;2(4PZ j|΋7;#to7!jS8n}w= ::؊rvxAx#NcOnYzQ3nd[+(gHTT2N`#iZc@>g%"nnv&Zљhuo0mC?WJ h}#zpzJ0,JK-I=Fŗ=gQaZbL%S}=|뭥~ na~%X_1T70,p%Α"_+kf[D?w}|51HUnH(a,I1'O_<~쯏E| d-B™Tҁsc{Y/1?l0-ќZg(NcPKF=1=D w佝z- =-PC10ِ ydmjY5`j'(6PK@1PKy.F$angular-1.3.9/docs/index-jquery.html[r?Oq;%d)gvI۱]8@H'oIT!~yx#L|)1!}X&G$3Wf,se<`rF6H\qȹIgCД _ 1\\D.YFj:wUI>rVQGZFr@DIG2vM c5:̥6 |ny檷E9s=uE&hG*`SPt`IL,RWS{̊X꟞Ȉ\ыO*-PRR~"ADDbj1)8X x5 E\[E(sN@|P%r;WQ.dV2߄XDqS2E4jNƔZ 0(T'Y4766rF.'Q+2"ڭ9 EPh姠#5rw_T4(4X$]^:gl>Yջ?+v9EC a(&@r&$D !|ưd֋iRdfFs% SX& OLt2J` 8@i5Uy0ZЁ2E(HOI+2GPP2&6WsJĩdK |[ E,]p*FL3M<8ל-$>O|W_yN@@g/{aR23htwFR<59h4=Hx ('v0 of*o]gVGz-Iu`i Y-AX_{b+\031 U|GLmΕ1f4mƟip.3;|2z[D$4v!mB"ZF&Ɲb B/.w/$^ohv50/I|Y2Pp0QZ1,:khmڽŪ޹A.(Kgn> Fx94?/2~yZ!44b! Cػķ{THVpN0]%nfgx} !Yd¡r@Cȇ ֱg/)Ww}/rPq)wq,V&rI9RRԥ5i>ud8W5BPfZu@*>Ahؑo&^oт~5䢁*R*c4|Yz]d!.+jUQ5!}⎰^-+ yP~GS8z M?#T :ARn"W[p:\zz "4(G e3jkM>%՜9AƼ(I,w%䗃> bOOQY`|@ep4&[/ʤ_[`e_ސ] z(}oɟcK2JȖiI'EL`&QD: ~3qsKflk5D uJ]H4HcC9{0~ժ7߀2LK:# 4ڞW!}A@T>#ˎTr]3xSo7pknmiG!!3˲{( tfqn:B׮Esi!`eiN%~ˎ@91xN%(q˱L#knt;<ϕ,q(<-]X6gmͷP+f& T%X$+u[5luY){ȩޒ5EmOQ`ń,BŪkI9>iRnVTuNrݺ_ ]\_/)BHt *No\ eŦSKhW~Y˝Jg\!.S:v;Ѳ^>'ꌹITy2No<^KCN~pWoċ fseUE֠3ױLlmm3~*q's3T㠍.Q#PfT'{,t4]|W2m+ںCb捊sо(m,.Z<::sYܽQ|M6G ӷxa+O&𡏍Q,82wNh˒pY3q.~m9fmQL F L&ng:S+_Hqp˥dݴM6\:JO}Zzu JW;6ryvDŽr*QÎ|:7Oc5#, rS}%;VR9 NH̩5S)v(9Du%{ •ȚhQ;ogY5:}l%~Hs×7lNVj e4- k |nL;y0pMבӿP8_ʸPjt֮!wۣ9_Ң{r{xO֖k粞IS%oAZ ;ox+!\ 5 (hAD zaKhO8L8jhOck2wPUiFu;pq 'OE3VH;3rDQ[V-LMM'ԛOP#֝(V 4=^- ʰxfow* |-ak;Ҡۈj(4t[c-~?7!Ԙ}S> 1)3$/|.hߛt2Rt_3 "{âR*&]AJdjS`0 XG3eNlԅo;X.< %Ȩ s3 D'6Yd 5aY4W , 1XR"+F*($y8`I O}TCs9WZ`aYLۍ}L#o\H&h{|$8JK=#E"3H_Mi6+S~zVs^G/>a+Y1`!YR 2TlR&id3j$'"WEB[RY O@|.Xdr;Qx؄X$iR.Z3,F@J(M0$'ύhnlm7]M*"d,Dy YT*姠8 5|&w_)0d, 2{޸: Wd6V,}];j8a, YB q&\C|8D/ !|GZ^g$dWkV+uSDK0?6QrҬ p>Wb*hΔвTF?!>^'e!A@@NO P:+JnON m3V؟,g*S6bTF0Mp9)+Xp_}3?^~P8XzA$կ*̰ƫϓaCQ:>>lC؄F"ke\(}Fbf\+wFR\h4b=VH\RzM;W73Qܷ^_3HߣyÖ$:PP,/=1s(\031M Dztm΅(0f"D6N,yGQHZ$ 07fFqJD+_LSlSGN MEL>pc$8L֮mL# *wLY*](f,Lk[{6?=vy.7.}9aH;/} q«71X21c]#-kE.ځs^_NG[J\e~!gpݽE`9-3 LOc %cׁQSڽ߃G <DEէy9O['a4.%R5%PrPWLN*Q(}ʉ NI)bnTUHHi.C4|.>ǫjB)+" f3y,*9*,zҔ^-+ yR]S$S;3! n'T$\L"P:EQ I,z ȑ #eɲMcӮOi"Eq5gN1/2+˭`0)+t]bo_~1 O0OQI!|3YzImhB' l^ZTborFMIc)e,i]GHULo*Xshת/٩k[I-!цSWv kPyUjŕRPPõ%3j@>/%p5 0ˉ-$dyvqj)uð C3%dg{8 [«7\߸‹M7'"w+]k:޸bCj^tWрBFD,6=`olzMEUvF0lI[`h8.O$Zgеƍ$4^Pߐ&ܟ4u$0R?5M$Q ne\g$*dۍv:চ:HU5A!z[r{ 6x d 8൸S^j"in܉x 0{* h1cN/ki6gTWLp(P pTKJN>śɝ[ۑ Ýt:IONL QlEU;D<ҥǑw1] ,=ۨ -n3[z*MDj '0ԑ4GWJ^׉Jj`3{77;Lk!ʍۻA=\8=mI% {˞¨J`Cck1&_`jhzkB"[ㆁ_:}7M> j#3ま~.Wh-c׭ãC'}r vl$R$J=K@pJM!鳇ao_axE(8S C:0u./E!ư%3T }pYJziӨO(Ꮌ7\Ӻ@_j &\6r!oGl])]Bs;h8F1ux w_ !u[&qj+ 2A?PK&13PKy.Fangular-1.3.9/docs/index.html[۶?OӝJJ84vvl;Pj5d-@HJ:Wx${ xx##.E:jH_,lcE10KPZ&FyeB{tV?{MxcÅМe|!F2"cVdz䭒XGX&KD'vֻ/e.0dY!2{޸: Wd6V,}iN`ŎN C8H W>1 HߑRFW4IECYAdIDhc<0$RLL 2h'65qRjAE|JEvrxbBb4_4B` 23,]pFL38ל,8퇯¾_ ( ^z{=xyaWfؿyUɇY [HTAN` 6a_!lB#X5s2.>aR13h-dwFR@ "-'CZ"Ce4"v ./D0M&K,Y_|Vp̋8_egXNL?|B<Ӿ,AXut toꀱ@{`{(*@ji+3$&2R \.p[jTd1JGDk(>'($y}LƑ4P^e>ɉ4@qҬzMȗ:2vXd&޲LS@TB׾jj#`eiN*Y2<O2 WX!4ʵt2L˴FD|jN3P6[(_D%hg qLq ϔ( f*6T@􎼣Z$9BLJhBX,]+<,C,]jܐ2u!y~n#1M\e8X2"ܺ!$*vIbXM7Nmk5ǶB1{!߉Ti-7k-t@lNuHQOu&O`N>IM)fI :|VV1`h _ufn%zcƆ\NP" $Xe/~+gASװ%3=emO Q`YǪI9>iQgSMᔿNrݺaXM FI<ٙ_/q >'7bHw+,5Eo\!Sq+Qc zH#}F76 O`L #{*wa`u~?8+5qE}Bw5b:u칂4y(rDF\O9Np$Qz8¹cdvBᖪQLQ|_|Q\uȴ)֮jvJ[ [ 7o8CB0l񷷿u|﾿}H)C}Q]HrQ*6ټn(U L셭? +!6:DU0'۶x?Ic>/넶*)pmc[A[tED`# U3Y.R*ܘ%Y7j NDSq^]ꎍ<޼1*oKrKHm(kFYD h"2L;Vj:5vO%ؙSkRLGA`7Q:v”N$rȚ =3 ɬc>6J ?ZZR'+U|2_떅 m>f7&/6Nq_i/yZQ+:kWovۣ9_Ң&3[R$rAne㨶.e^ԁ`%OoAU_Kyƛ@UB@U؛ )OTteڡN5#&&n]+lHA cbNGM2u b$`LձVXuFұ?2N&ؾgǫ/ nWܷp4ҭ%`saюGPIL^;ի&f[Z*ɝ h'?3oz𲦝l#|vۑIEq%HPD4s^ܹ90\lO@x QtiV[C*yݳpҳZq <^F9C$O䮶qLM3xtԊuب%-qs3ъD{iA+S̅SJ܆dQZ onϸ|1*9+ kzl<4c(sS[o-[Hp 0+yZ']aQmdc<з{^/Z˸fEؿuIcz]6o?PA+(9&SHxO0X7߿0f Ji܏'?{~CpGޛ i]/5DCJj Kߐ7#. j4mO'F1ux w_ !u[&qj+ 2?PK1PK y.Fangular-1.3.9/docs/js/PK y.F(angular-1.3.9/docs/js/angular-bootstrap/PKy.F4angular-1.3.9/docs/js/angular-bootstrap/bootstrap.jsZ[o6~_ J i"Mgeڇ4-:VHINboUQzޗZM/]u>nUUrk{}ϗ:h;]xXkj4+4RO/zY]C~iZ,'j(+ T(5JMTrVjNاG̉GH7r1=2ze'*uӐuS>G<U zޠUe|~fexֲՠc0EU9u%::L(DKIN sZݯh2tf)8Ykf}Tna "#0oI8"4CZdU2% ʀU6/V8P&/yק ]. @IR#7kfnb*|ٽȖ]RѫGQ 0Z)MAp9K| 'Bهn7IU2O6Ḻ~}3غlѴo~?_Ud*YQ պ[&EH4[:Mj$Ǻ^"%*]Ku^ǸrdE1Rv/L+cVSSJgE!jn@^R7dVĬ'*]9 ,4;^ Eׂ#~'b hU<J ~cSR0<PRo,< La~kU5Fo:meűLo38V9%)eyd"x_ 9V'm/lÒ=tM8)ed&QȨE}&OEkVVF/u[oV`OD:/ɻw(|WjP.T*"sN}T9adn˽dFOavȋ8iBk'j`N}o,UGD cbGfbʘ΀=rh]s?"(ytv!"!p<`Tt2G B^L\kjQӅ>/0ru~Bc?6 4sGAV( (#)QG*Ä xzY׷GQ,P5 @ukL&Ω5TZLOLJFrqNDNdE/VO%7e\e% H K@?,,zCV{ #[;6`JVպm (3Qm0TnQg$nRg<.W,+0eeƇ&͔ϡH+DYA,7)3HK$VYy5.Ƽ D[!SȼEG]A}xȌQIβ&Df筘ʺPd,I*'c*|Z~@ςtb-* $/#Ck"yF=rI?͸7[A%D1hxO/T&grB5Ǻ:OF@1p6^LE[|@NY%L*/'WEܜ. 9Hʈg\,_K1ap',lO}7vHx<.u${(fnid~[<;a(3/?#;F]S1ä{ޟjM/. o<>eڸwJ17^%n'dGXȂ4-YbY!zw*fBÚj $p3*ի!V7^3ޝ-p5V(9CH\Q ; ]B _EɴSJznOT:dcv!ܕiR9"ys̪$CK'1 >>D:ЦKwjp8G ;9B,츙!cOǸ0zG@"$gi(3x5<?)H  ia)v!;(Tnl"/1c^B(|$mtrBSU`#_=,a|!csf0.U"%Fe (!|(mt_μBrr owsݷ{7Fw7IģKYL2YӢ–}#(BFp>MЬҺh734߰GY/I&9z)px3Q,}OʚWn#DLh hH 1Ҧ.)쁛Au_=:0}RDs1Dį|Œ8]'E+Ntlui";?HNRwjl&py 7!6 ;YSlBgCպ9(w<٘fH=>50Bg;T{ ĀrKKͩ7ׁM'LiWrx6?*2 Uɗ%}͚2ھhݗ]&׬- zC#n3@Ǜ4Udn gHv+zD\bQzol>s 2}m9/+.&~*5*" ?8gl_q7_BP=̫9k%{C1LC.&Y@˰RU82uqKwD^đd-6r]}2Xsnj˦-{b鯯_[.iS[83'*ex8Ul92ywDf"J󰉘i" ;,C@Bfix[Nr2pWTI < UÍa887&A CO1#s%*iP؊3e73pV(XD EV}O1"9='|a%H [%?߫(v]qo f-#z2[{i(jNFnEy'h:Jm&^Cs&'Qcб:rA֔d@w};F2hlBM:(AI7j/U, NvMf`J_'t} 7C Bctז2 †S֭sS:MK d Gmv|sbΜ4P~-H#fymij:֟Ќ- i~ߔ*>a=p:p7q T^ؠ+B؛W-6 Q]KR^"eۈoʈFRLU@h"E1= nv$pr:8ɞk/Q0K\bk5d4=rW#f_EMIw!ߺ+Ã3JmBו\KؐYɋfײ8U!5PK#冽s/PKy.F8angular-1.3.9/docs/js/angular-bootstrap/bootstrap.min.jsX]s۸}ﯠQM(ȞN*didi}$msAd%'I VW"L)3&OiO"& /kӹ^F]Ԉi,fyk B"6юu22\H2 ,S5b^"aew)%=:/IҼ~NRlDj@L` u,X[VѴ4S2{LX% $܈A HRp8@Q:hR SzWƾcUVl& mB)QaK;- tL)8i`fOXyYyV&$K]z ;XG ;70+"HZrĕ֗2*ɿ֢~ !So ul39ؽViEhM]B¼1ymDt,ǕK\]aD$sGBQ0/,]Iu d%'3`W@]򐺻4z>b7)B,~1kTh$lYF<ю iY\%8lRQtdɃiI̳DSJ&Wj!9bqƥ֢Ianp4OjW$ 8RݠC9tܶ_ժ?$`J2\vTШc P< sXQƣf5&jPDvt`HSkxDqMug`WŢ~whҷ!F$f%+~-UE{͟"c!HtL T\|kE%$(5 |953DE8Qum2G,>^+գy^G dbaVFi׍Vx07*&a~WWEQAoB";>F/SrG 0~T|*ou561*4Q6H'0`Й c *+!JM{^R[ ́2gl:?QNEFoCX 4mpM+fWW)@EFU1 l8<t%Dܽ=-L)!,Fo 8BRφIZ~|wh:с;<[[X? QW״ޑdC|N 7@y tg?3@vXYCMQI"cR(P|"ҧyoKo<[Iv6[nrD+VPQV- ~h-r8kL] Qv-&*~bzii$8D2|%s<ժx#VQߴ^8M;u^({$5~Aq_ߐf"]SzCķ45X˿梂ΏN=-U^Y~H5mp*qu%zdt$Ȫwgo (} PoiomMc% d/)^3!MBvC4j cYL0Ͱ1տ˕"((DCjsxJPb$A<6~2m}5 }NnS )b1`S!Q<,cM45e ]R{o/Ϝpi\Dzl qSʢf;I:F}p~@@u/pCQ!=ݸPZ Fx{c ~M"lQۅMa׍51l}}qI9f wlgmAǵ#mR7N@Emse |.S-׀o]@  ZCS^j2}4Q~@qy{oVܐ6F Ig!3_'.x>OcN*2jsR&7p]L39*\^JԃcEF #]FϸP=DL bHIKX$GTѵss] nJ5t0;n߱8# t﫬oBmU]5%޼( (j(|Eta܆p"횊D?u[.t?mype RAUe&>{ #R NQR/_PK"%# lPKy.F<angular-1.3.9/docs/js/angular-bootstrap/bootstrap.min.js.map\ oH+=`q7BqrL&3dh9IH^GuSR{5v)vwurUmsN׮98/U],N۶eoΧNS\WbQ5瘻3tJ y o3}~׷x!#y g2yFWWƢb(17AOpǀehr|3/p%:T%r&:SY-{-S^$U$6z!3>TV |l}$yjʁ@ BE0½rt^8=&dҤp@eF&LSr4$!*r!+)lmQ r^xZjcfIC|P:L8D}L P# Y (_ouSo(ڍJ{LIj6G$ 䅣+VσTQu(y*h~ ] v{JmL &v$ʙ?)FOL_Hi s1|((IO#ယyrG$4I|\R$tqc00tXNs|SI^ZG!*7 u*y4j9ji'd B^DAmiP ԜX 6;mve !2ɾBbR%g.s@$I7e\GKqWRMdeps!.^^rMhp``SB+/'e&TS|08QHզzc:D9z":% 0d˷BR#5" ND,GŦz6poo]7 *Y݉Tz>}-jpIn}|StWV&&Z$TBn.\EV9*`.UT <"&8'E5e0$(Wj-j6_cS_{pjt.%bjIni@d}^@OMs3ȸ*hˋ>Ak1&UT@Ir&`^8NJ`*<1<|L7OY#/04*>QTQR Yоӟu\2=Q69t&!]͎olNbb OR WhQ UL,@؜ԩLuP7rE<*9JSB'q<4=Snr4)5r&}If9IR72 ]ډEUDԐª\N+('oKyeG =N& N-NT "Is\K3嬯KshiӺ|q[\-j9vE_2lwVW ٪`1FhQ]t8 {[]Nh9=_sA`Oa_Pɞ4ŵ Ó/N@Ɏi3 xQuU!7ѶpT 9AQ vc1Sn"aUw1"P~^t՗LNӳHS0C^ya3_@YeEK XT6ke_h2W28̚qO7Wc熨`:٥ʹ(RV?.&b'`'$QחY$*dW$0~2TQj,{!D_,\Ӻh.1gYh6&[MEVab}d_FJIM |5aX|THf zt ^a\{ FΫbuzQ@q~^Z0W'ZF.;@!{~ez\./,iL&blodζ{wVة}I'?-vv6$ Vϔ )Q4ϑ_bđet^LKS0 .Cq1*NI0IEqtCD\HC= gtZVH 6f9f;up\OD(qcaJDwV"d0//Q p,5R {Y YTU0fɶn=Y!L@ddU?ƉblD60{0ƀ-ҹPGMFȏ9P'OUdAqAfw&=urnqƶDǩI lq65Tۃj]q)wQ7qJ6v+x\QuD(eiF~ rI3& Y@8FF[1HHh _S{O>/ٰN 6iѾ\ r ř h(a$^I@ Ŷݿ&مiBy1ȍ8Ժϰe0d@b&(HkR'̉1|=:vS(8j'[h/Dq&߻ie\j9 N REbam n N]H8r7&6$QgĉD4ǢtM{Je@_0(˓y6'Ibí~+@ xpB?z:V..'ߍoXb;-Lؠ=6l".q4+Gld.۱H*!.|2f &u~ZqլU8|ɲ$YA<| N^A*3dgRRfY_/Q(6i 5H/s*27&BK"=/@85էj*AE\6l;o9eø߽9 )O9ҙs!=HA9vrxǵB(KXw$)m624!}^ajKj6cmWZq>Q{2wod*#EUJ8mpeYfJ6/wpSB 4R0;Բ@} ߺaS,ׂ_))4jMʕ`yqEը5ΜN`䤛dd+;˯B~jFFV5nFr;0'jDieGR_at_O_ [1m]㗈&|Stu n*83O tSmկPIϧIE D D`w%!b̈́xI-rP^' _]\[(9O\^s;[%b೜zG)o̯:$t/srgYLop}b8xrAJQU ,˗rxFS7-Uz?vR ~<_m^y Oq Z`q&QNlMt &Z) nisgԧ֙.'VPϏMOA!.2D `'41<Br垞YJ'kp:8Ul"IOH%J?` u2]qꐏG&d-zbX6.ٹ6rnPʟtrhߌC/Gܛ|)-Yޭf:=5ŊjJ/R79jpa)Mn"a>O쉃NC Y~MrH\\Hܾnk3EKmn~01`,wP1r&̡Ljk.FGRR 2Th*f*qAb lW7q^9U;_ao2X,/`0 ov gn^deh[0Dor$"]%X.q$1l'>? '@_i?PKrDŽ8DPKy.F:angular-1.3.9/docs/js/angular-bootstrap/dropdown-toggle.jsWkoX_QiEm2"ڴN8mf%c.p_}l@:;D.׭sb[PV𩳯uHo-.3RJ7*"j]5Fmag.#oxt4("깖- tgR= d-R;/>|8~MUFX>ӦJ-V}ԚmVoD|J d) ezfP_)W5eRy Jm,DC=fxwjDVAY.=Zj9C)/GoA:'lٰ=@h@Vr͟e!mV/[ ͆&A}F3T550ZѨ#(]%EO[WH^sT.Ai@k VEcʕ4ٽǕ-գ0lJ#lMl% dk,]6!*Uǯ!@n"Z̮0(^<1 ~ק8ݥ$_hvM O}:Ołf [o88&wxpt:CMg§G8zMQ2*>ۺ)[%Ո;6Au[9넧cf:uMf& [@RE޹7@G$ԣcV>u9WDcGGxסWMU'|%˕~_^pdwh C888@Z/; =ព G}@z_0Dr}h>]^W$^I64˃<$[5i+-]?ww0^W.ۋo;]!^dn| N2놿z|:>N>YSx·v +Z#j^UZ[_ͭ]mbчd72<׃ᤗFz8ٌZbճ)}"wšSjX~̊ZͶFZm6:Ӧ]oݩ-b86È.mC yo ^ScQXZx4* YB$u|+#φ ӊ/Vl2) '{k uv[xϰN CY-3TVo<+·m?s׽I7EkA12GM]PK PKy.F>angular-1.3.9/docs/js/angular-bootstrap/dropdown-toggle.min.jsTMo0 WZ؀l paCzܰaNE6UDO(#0%MjiVCZ%nV6T`Dyi| ZՌҹWeݩ*b v 3nMdgXV QNRtg{<R#0+*UYq>Ǥ(|Pk(x;+<-] ^?k} 341P:miUnsHAzE]I0f{eyd LYSp'r0pW@$?JkG bD0%jR [1kI}']<ֵ>a֚c[G8~L̓Pg@3LGgҗOHLVUdwݤٹ#[-Ud,+Eј?i*G(9Cg.*R/yӈui?v]Έ?w]u&u{s˯0mD]0/5/vY|*>1(5M,lɨZH`HMl5qXlƞ]>8*1A^+FmW|ڈe?WsrALbO*{=lk @mvۍB|hEX^p"Ĥ P*|!0a3O-+bY՚k!G1L4,Kl\p aՋkb2))~1ے$FTⴤR K#eqIR s ޲'~kzˆ#gX=q[«K?pqn ~Nk{X[sl<˪KB4]9͓"|i%*֊\=#o}:t%_Լֺ(YźɦeةCL?RtOiU+ɣ/YZCN~|r{NLUq I ?AQ_OvP@"'mœy25{U蕢dIuCEBAB)N$"cE`dY<aypYIIl⤀I8snuE4C Ƣ6s~^v' <4󧗣)g4:'wxOWϛ7h,Z뛁{۾?.d#f鈦0kd.zs:d1t㎧~vv|3xpCx>%N۰ yaAKw0`sϽE$czq9Ѡx \ڡ>&{948U{Jwٮ?rHp:Ai%~O<ܱ?apǣk,C )X"=<'{ V@J$h2Rf׶ʦC>c>ĘTTi71 ,_TŽ㔚|_d'Tu-8VWUNנoaROU Ai?΀/6*$kݟEGe-R3i[à(laT\Q.{np'@͡(sHlC+F 3j%&7{ZVjeҲ]F+5v8CegdL1jjҡ#@F0m).)NiY5->\y*pF}Nay;RXÏ[tJ;AuC.?(]$ )7|퇯5AZ:oJDc!ucBӗ[D\@"ssUO[[)4O a՚!/ߠ`%*ָJA.݉ `Ep9 )lxD$UØK;Pcqw-ɺŇvnY#4I˴yJEVk&6i#q;Djs|{-SXE+ ?!S~|UPKmAfhPKy.Fangular-1.3.9/docs/js/docs.js[VVᰑ`2 t$,e[, I0}kldUud͙-{֭[4hR Y_e. i1m`M6Mjxi$6ițȲ%IUE^M,oxxy|ilTUQ͓_I:X 6Ӧ8͖2xSMT1H'} ytYZE>LGE'Uq,j8́Yssq3ɾ$aSMN4I _j Y~x4PXŋ%B(վB-*(FcV?.>qsx UZA^OD5DTCT 3V$Z Y>Ŋ(h7-9 %V%6E$K&IDe#%`]{o fDǰ,ǰu=}f-AP_H._o6UpBTT4MEATilڃ3U>I>j۞uzGo"\_E90>'VA`@1`2e7<[פo!}ڍ`X2fX/ƕtˊ>9T3*! I< i"WSc2H=L~8@Uxj,ǖD;.BhOQ}IڞX ' V*ؼ3R~2ƌoL 05?ɦXm('oh ~xv~?KAmQ? H) ZޜeȁnQ\Yhkw6IXdbkbm*=+5(M3N?HcO+ʸ:鹰%w%eڭylKm4$ђw J g9*A2X4}^iX/5]⻨ck[}<)a#<% $_uιճ;b{ծ;- (韨J,'a0Z} /{̍kYnop, 6!uPņ}p -Џu/P J[nĢVZ\xFpG17Jn͟t,m <6-ANn̴]vpCXy iSF1*u3VA1GE8X6/HD+;i557W 5@ 3I(aGlP'Һ .T/ph z耢/}yhCHb)3$!yZ-124ˈTG&B:B?;m^V59C8C`M+tyW\Ն2zeI>ߙ܀sTOo(?u \AEZI[ZH01 +xM5q5J"r˛w:2y{y Y َ4]n,mU!,!<+Dii)DYU }H %UOOInL+ D#='qѐ4iQ9 + d5X$PEʶAYS^,z!ɗ 5?d)n(J'V߰{LDNf̀Ls."U]0 Ir>2%IՈ1x7pڈR^>C=e,(pqaRÊN*"<UMksJ LRtQREȐs@M=YnU Q9+I?&Ő!5 贲~[2QzKnfI6(M;Uԃ1ᮚl]„ey"u% 5SYSq8'NNJu`H^cz9ړ`C|irSSmox믬 N}d&AWW*]]vmffX\WiD8#HH9=2A6-W"+v:bQ=<)Fgfxڗrb- $X_EF P(ܧŴΠ._^,i;- ,-Rj\I)ܡV~([-/PŤmB3Xԓ|F$popB({y0f2Cux]O&eGiU0A cPҵZ] -b,^D &I3.De3p;[=c2/99+ꅜK8YQ0Ls}{yIIA3$"% 5z Gn ~6BAGz 'Lyoa'}" ;bV/ V|ŠDb5Zp@S<A`WԁR ,eCd@Zڔ8PEFjd:"*>\jʛhK >la @m!\O#¾Ӕt굪I,ҢN< K$fgw#wT q(86`Oզ^If>?'.-(mN?@Ȃm)hHPzdCޙYJN"3=>Qj଩'Dq^jqۄBoc}B2[Xp(t2G 7VLdc#B=ȓzCa8YI4̹̼=yr[pBA+X&d6E6y!C !斋sB@IIdzU&ʠGc鷎V8˘F  C.,cmO.SBV'6q $rˆW HLGqxTûe҇z٭jU\0R$0tu7)Y[Ja{0 'qA^IZS,^p ͝IJ@3{tƗ{MbJUe&L]epE`)0O!]Z0kpԔ @&:8~˵dtbͶiΠ3w0-W|~Vero9/["+2`; A ͫ^'B} H5mJf3Ʊ̳m2S.62b44#(@5DSWUu w/HϵCTHE,r]dU",=+R au05TTPIEtc*]^yKBV6 TD)r{PDaf@]`$?*Ӳ,P) U}H"D躕ɴBniM]V.%p =0D*7<\Ą%Pyq݌]|t' ֈ¿^7VEyГ' )L0*sᘿZ:m)Ef*ͨ.;E"x TU\kF*AꞄL] 31 b@z&to :t\G/ճx`fRWC狲-?8ʢL$qP(΢riTHÛYL!FáSiȌo2BM\APh!̀z ''Zc?<$AB5(0P.uL: N BUvqAK3I-)fm\X+}I3@b+/3w]tgĄYAi]\5ZX%?D3fS1! ?($.<0# ]xLFL ĥ0m Nag01ޞeyP(M$ۙ,4,O𑄓DLW#Gi0f^Ahck^DBT^t.|Rw&|jqhi6⡭O۞M\Briopމ VdDM"ųll\NcFL>5򀿟mlkM%Tzm!dַ708 s5US,Z3X ѥ/}T.Q_PJw^)@(O ]Q&Z2JBM 8Cl $ UXty>ep[UJe>G+xED0BbA/Uaw<\0}V~z}k +OүȟϿ~~Zvpnp׈7 (n(ҙ^f7Q/iF4t==D>?S%KaPџ| "mr\cvh=(CCKgq5tG^Ms*rpvM=[mvT'whm.RzD]EE}ָH"7X#6Xx~F>y_>~ st~cQC$ X,x; _c!7б&.6=T`._t=Ge!s,oB2?E'tMdž5)6薂rbZ:??o<˷bB2 >qԘ 8||;g|Ԣ;0*bQs6r2j_Wx 3~qyD_bQE%LAj?Vޘُ⛶a(ތr{R[lE %="LH˂gxijfƤyY,*LCXo;D2VUQe`q@V0&)t%? _çnhݦ!(xMytB)`9Kqe{#s1EC$EoЯi8Gb|;':?hetPKR4J&mڼ{'QWKJo `G1~Pϵc/).@VW=5yŝ["ᖾقFצQT0&r .C|1)>Fߵg랁V?6Zh\Fj`^?"94 ] _.L4HwwG(|Cn|LgMſ%[U]7kz6}\[j*G8LDzk/[tR"S"U%"(Uinnͧ:ڊ5%ĥ(( >Hѡ3#J%˸Ԙo 7j3eQ7&ŝ97PKifDPKy.F!angular-1.3.9/docs/js/docs.min.jsZmwbJ3!9C:N!5RulMDNz$k1dbJ?/FRͦS fq|s3u^[VV_\(n+|R+kt wR9Xrv.YyhC|gn̖kZk[XA2[˸~Fs}4gZ-M8fGq .ssV @PD/*[=~/y4b!?Өb`jBvg{ylՌZkJtm1® jT`2lmk}Đ#F[&ev>0N쐽f]+J* 3e&57M!#^xQ,JNO 酓NⳘbܟ3ZD5:>ViH:F^*(+A}4Ry@$fMBיX ebdܦ}_H~TtoҤ_Ri!;xώ3 z^xNi4 ߨlno޽py7W f (]-3b1][1ŲR n;)6S8~lTlX?Ц66"LO<;Q8I9f֢i?1(sn,%"ں"aah,0ŸK15dTڞ'EIt~Y193c*,.y!;/B01/lm%Ewm!$'!1%إ`הF^_xnJ~I+bx2lZ>>Âu?J g03nҾ:M~KU/=Q2 U&-bpXMDB;WdR&:1#L-dp2THEk+z ?.͋h8I@~GEx~uz૘ēѤ; 'd3ٞM?&d8wBJ+AB噅'kߵ/#Xo؎c8OJE*O͍); ;*/u-Gc s1/>!JI1)+Y r):'-"DE}R]|& "z?_;;4 Jt܊l]PΚeQI)NCnoX  3;N[.6e'ORBu!Z:q1$pd LyXY:rd|@i&M )r9(Do&26!!K]XU?HNma&R“S3(Cۙ{`%Rq& (jEfdɌN$XX@%h (Yl)sX@>{Crx!Fj*栉9? 6 ؃㮐(##VNm` Y|F%ts(c`b0rυ ^l@KVx cv)TJsBByNє$U%AkU,)N^iғly7%76Day  2%M \PEh4@n_TA^931q8 WnP :Yp1@OF]1,,f{`ܻZh18q)sB)cfMs V#(](:jeՅ̝.*b2a9"&yR?'ˇt}lreKkP Rb~R CkClAf {ҙLRym5*6<})3qUh}]J\$d ͤ=^?<>j*6Q$m>*PQcFOf4 ,ŘQj航 !u^Bx4Rܕaz#]+z [/}닱⃈rh=(qFED<53m<7hKLQEeLpDqsw5f{[]ce 23K)]GN>ԍ0:u=Ѧv-Qf  0|M,_PXOgRI hP Ke7"Cf/}6LvU!f%$i_p+wx.!")\4QGX*g۬짫0`>W>e;+R{V=Ǧ}ѪbUP5Ƥ1l nyR JQWJ~u+ď!&kV(h*T!<^1kʴJrh^@|Z +T)yx(HX4o gui:D#߸˶P$*>IC``8ԯܽF@ieP(OpK>~_Hw;C0taE߯Gz}Y^ԣףѠ>cP13P|@ƪXqPsTlX{'<@7-*͆ݢd)* _dR"G䞛9,$ܬiIj_*#H\_R'L/_X%N6l iE,->-.W^AI.J*Ҫ t[:[z l64'o<+OoW;B@O] wOQ/ ]Khd>L/cLtb㞼 Q`tbė(1sWE;1z+pPFZ$s V9r!`޵m;>}F#`(9nG (ڢ /r$'˻I9_m~qo\w;ayg~S?j4DJۻէ>-<-Z_X)X,6`6~ $Ԋ.A-=8}$j\9 #g!M W6+F7$؛"eWf\^6o?q 0''AoHuI-,jzOս~y:nďU/#K`"tԈŇ::sEjb>y{OMqw搩ASp9 o K-]Do]vs]5VF0vc:όU^jݠ7do /l.kp{BWw*KNcL16F$p ߿Mi 񊂃PPK !PKy.F%angular-1.3.9/docs/js/docs.min.js.map\VH~lUPF{@ӌ/0>JL!%4CI/#/RًϱqT/d*/߭,Tt2ȪtV + | &]6wsz59*K' _Or#tPWW2/1BV~˾\+?\R??͇x~|P>+}v|и5~ӃaД8-w  T D+E$/ /+x!z6Ri吁 V%Ub+/?_(ͷOB!G"~ߑn""8g3'wvDUmJXݮ G)4h+0AHV`D؍ |EO x*M cϔraw^(Xv2D :>r2'&S8n0BT0sܠ>@ [VV6N',@3%廠K !3@BX&&1HP Y@D]88cۇV4S8 腵 9+UvvAm AGDU;pL`hi 80"bPK1@ ':# 9 zLԈTޱ!nD;(J6 1DZ"#Ձ=Qb5G2dP3 |׾ AT7  3!xZZ[̅+rF"mdjRYk@I.H 2fC6DF <:eբp" cz%y_(,$<;ɬ^?1 ! }ٙ[8 EA H.8^l=R=ݻ0 * rK-d+ ^̉!4ּ9X/J61Ätp»L Sg3?v8ކ(ZC~ q5}5~'?ۢE0{5+IK(-&sR0;\$d4RPIHd>VFIZ0% ek1,jwR|JUALdI+g(C]|(uoE5tNr8eݎΊ9:.oiuVi,/χi?@ȯRadI9e iqzUsDOaCA>{Ѝ};  eYW$o'U2ay[tHeqw:r97P83geѝi\2}}rQ_~fz2͖8dgWob:<=*K_#Ȝ˷rleN+cSRbZ .@&H,0|,옝N2S_5.9U61@^d,*Wf0Pp 6?}ݎ'M4FǛ ׆/ ۫+޻Ka.@P10"t"};]2N /0Үt WoWaϫ(N WqmQsk։X'tiFLj%E$OpQƲx6%I/QK>xZ] 7|bp)ҽɳ[Fe(8ͮ؈ ΐ`^}Dz-6˟dG q|{M-[89KbO AD,Ӳdqܶg~f&g&L#Ǝ>VY/z8)OԚ\'Gј X*$Y'`ա8cHJEQ_p0^%j;jkӝ* 㒞0x7 鋐B LjW `5^ A&TK"=$1Vt%:V6z4' 2K/N:;A#و$BuT;r蛵ozdC$H5hOV= >Z#PL=kRMTA'gшrk6r` &I4%׊&qn ȷ&ʽz{ooGS~q^"9yD--N_u 9lX\ջӓy^&f,bXqףd2sCX!#gՇ o:˽/ovvwv v/u=-m@@"UʍgGտ\[sߖWOD =>^9>tӓ޹{/GC1<֋ov"8P2\&˄U׈:_:\tJC2ʊsĊmc4by]sx̪4$3zZWjWLNγdmo$ (=Hg  K1XV.J gӅO4fvvd{ E伝7Ggia yKz҅*%2U6~;G,OkF" q,rXRfq9j[:&kϸhmO%倒cҊWƝ|b)p!S)ԚmԭX9E"UC3EʹH'wf6E6ځ:r%ɗ |QOjdR(ti|b_2(g pegNYk9p} rrmAX7Hb2Uem@f!ق(#F1F0b6ӰQͲubN5ƫӱ9ĊURɬd,}oߖKgTޙI'W4o!9/43QODȋ!G:n0;K#9B1ƌ.u^TebLd"[iZKlSw Z'<\÷DEg)IE!$J?}4O* \ {P&RsgƘy慴H_aV"Y(=EV䕤_"p\(^,!+0&^(;dG.r/Q$VWX{ƯʛL57PGm,Jڀul823/T?aFjߕ#z&hj[ٱ1)Pa >/Kzd2WȀlOm/*kL.|=",*c zז ɧPh#(c+*ou%aL~>Tmea[( 1VՍUyH]ửe+E~:|#h{O"k~][JGd+ȘA6*"D&$"2z~,s cAmּdcgq-䵛R8?;D+InZTbYoT6P+ k&$H1…z~8lKhaenSsPp4?mG.pvṟ{@=X ~ - H{T=qŏ4\"S4MqGduh3cz|"މ˃$(SK7@knАx:r@4nM,mƇ[YmI!N_gɵIb'XK;'jŊA\b2ѯ^8˝׻$>q-mPϋ^#p4E^ZRdh֌o$w\CN ''ذƸ-1q-~ ~yN-p$e`[Gj–.Yqc izG=OAUu0׿v\䩛_U~3v +ͭi'_)1ANbΉf}ޛҧ#I(nrD.,f1BIGI-nM]zACMe:=Azcqq,#ܩ1уe5㨰M=28;ɜK_ꎋzGܮH6NzK *ݥw `v=#jDy&# j7ie)r6WS|^>C꫙[өMO+͠2 `%ݝsOqnPD=X _){P2d L9HlTqBĬ%[q`?D'HS(QBPN^87,O5KTxePBJP9GcDFV=r+H '?y"{^rܬJdXTfOxD1p`JĂcAZj"=\ 8P_DX6JpY >8jqB5ѱ X*WSxFn3l8X@WFGm(͛;lMʂǖL@spx'A;MV@Z ]i~p0@TpP6F*\iGX5>͝\Z%dPmFՙ8~"#D ĸ$Z!U͉l҃S5`56-hL`Plz).zaEpZaW$E#iqC)dK2L\9BW::<<4$sHR qE-oՓ't\#lM۸5vQ/K e?3rD,bNc"M0#iL7(llG["I4G#;ٔ*T ڌbbړ7b0 IT[* jÎ^ Gi+plKH+YjSuްh&GlPGI"qƒGSӑ= 9Zy;C~qwClIt_2Jf;*/,+L+ݛI 1@:"^Co;Lx|-1} "d-_"s*6:sB !,}G$H2*:+g^Y /GpsoOӭl^$qkg"SZFؽ79?:"[kz}Ukw:㝾}oYZľvcuB(! l4"Rvn|99rfQx{f"9趯lO7KɅfK#?MYE\/RɄJtqJ*|i0n;Tr1aIp~jj7峥o%+d"HAtO3dӚΕ1x8B'vbqK+>^p {^=mLiԅ~o_)q;[/v?I07o?~y]MehJUۗp/J۟| E@*l Pm\-6>A yH%:>۱ $ sqjVu9>rLX@?r@-tUؤ@"Xmfk[cg#Q!o M!I9<~' sVuz3řƑx}5tp8.~pppf0zw"P@&]9Q5c?5Kw\go8juBߋ><9QcN8qsZ# lSɝ2|xVEpm:PY'QcD":p$Iw8i=}:%q*~xav9zH~)qi"wԺjY w󳳗Nb+?a*p n1E_@k/QH7<5g:Hq2ߦH/[Om0h`fk\?F"4ΥE=\__wG%v=1!|#/n |RNQ1 ly@nӄġxFrzSY8\0T3^hH;_Io7ȪCah Դ!(dzgT'7޽+v<+-!$ҁZʘ'vHY4:ƒV ! Z{>=lpY=cU2r ss(|>,p8/V]-9S_{sk">%-=AmiBo!+,M~%8f.|!uԮ󾜢PU>W8( ?шs)J1faZ3ۖvݼ~z:/̉BaXI);p.ṗeSY~1WvE]06{M,`([vE;ԃW\m,t)HD=:Ű PmqXKO62YҞm:/Q( סKқq6tUH4슷?%ZMW![*7(}fOgg51jn|ƷZaGG^sn2K> NV֘( n/C-@DoVcbqS9(>vpQ}js`W]w/*GzzPK'!]_PKy.F!angular-1.3.9/docs/js/nav-data.js͝[o8W4c/Ɗ3'$'Ygf`Vۚ%E;ރ[DDER6]T,)2V7W~5ۮ6O枭}׫mԫ,NŶ؟ǿ~_Vq^w=__t wGɏ^WE[/jPhAb!hMTv<ͱ ]Z8*h䙷jL+ ۥ9nW GvOkb8WHkf8waKdzuzMN:Nݭqof2j(xdUޕQ1Y?2\+S^yL'OŲ"6l]0$B6Œ-eoTmӊ)vNO["H&Ū "(B&e|@PP80mUn0}*O祭ylPia_\L0@oCfiUL%;}G%2Z @qq+*ZsB5Y.,]#K׶ &i tsY0P<ﷶJ5J4Q\d|"@Cp@ϱ*:8R"zEAQt)TtM`E`21IxA%ͫ"i}j|T>ɖü.Ӷx4°. f! [H7x>q)gʇx_v>LcP BŷH 6x_; T)Qb}IgPPD 8>S0P-apxM*!hGFCPT.f>D!IUˮ1yf51m5U@rWy;5+ QzPy2GTi^zpq:EW:;F|<1XrL d#+u5[Gy)KqEoCePˈ:meNN' ^ %[[|g7.4p6dPF2OWjdSVM2[K Dn>oIS!MΟH֭ ,ĴӠ|5Y3BAũQ+ʜ8t ѹp1iPYଚ| (&y*nMo %Mw\ 2+&1샶."cT4>SfT1N^(<{MkL=.;is¶'8 Mj믺*L%j]Z}+,#n9C&}0Ļ939BܷQNwHigF VxP Q5#H*$gL+>{0[5efzjR`XpXm.ҒV4hYsW,Dp2 ZJxD!IGRb7dds һD0M c@ɘܡg-OwdF(oi޲ Ȩ 6/B5XcGY'5ϫ6ϧcY4'0 $ r Uܧ;Fn⒫[c|/n{Ƶ Lk(CcNg.ymc,8ZvC#< &gX|"GpuR&;=$Bĉ^ߡSp)aZY4q-G(:1 7a$ۇ6kRhlY߻=2b[,;f4$9\X9kyTG$NbhJ~'#.L_;#J.y]d{0H`sM^^2 b^K84@rw VEхϽրۍpIa~3۶0o>{e;x#LV_iVJ,x^SB `'A$0|7]ɒp~]lS7ɓ Z~ɶ+*L4_:`$.<@@XXu vHpe-)EP^@ g5;?\q"~ĄYQ6eh=cQy(/ҺJJ{^ `˓ b3sP3J\P73]tTp@d*#. CЃ% ;ː X,ڄy]n= FuY}[ld^%[yȒ㯪c߅.Ng\''$SĶF\de3\6&H|bԾVtyQك-?A_Ur|O.Fl0E0ޅmQ#~LH3:8cD p`~! p*F""8 qR Ϊ0H6Ƃ8R?`XT0ϺR#aD)Ⱦobiе(j*.ya@> }7{?-z9'OXd%=t *G[e Ditw 49me[Di;3,?&qetQA6㝭m$ۿzN!#[\F]bmCo/>Դ~disw(zniY 7i#} 2ZEw6l76PZx .G m>ZΨ.D 7 Yz `"Y. zGpSg}E ~sd?ow:G0°Q7DBĄ񅑐B"p =U]V_ ¾A? ,i bB#n5XfX aVV.ʭACTT\P,r-' ]W%YNJ%:D{\|!@XEU h>r ig|Pw*;/asiWVםig<݅7t~;m ()(K8yw섀68[k=fA)yWTC'7Fڇb{xD"Y7wj)N2!n}Xp:.[vvmEyys51+_hZSC 4thN2TQL˴` ~JL1ޟjexf19uNT\7w7oW$IvъtkRT--(37&1X[$)DBaheNQ #g9mWZgO(MS ҳܚ^{H1 [ic<) CTbtZ@h&W@U`CZ'ccݴz=H[&hGn@eY-:p}uHH#!ZOy|l%/ǜITepwIb?ԧkt!na߰E1p7gs%i:DQs _aAX=_^T͔/^nAq^PB]Nd{&/.SM gng:%6+(*0!߳Ќ_c?-C?L _Q~+{,?O+7̯Bc~ |s[rRhv:47ܩ}yq~Mho6Ag([3L%[7oC~7V51dwnߩz{ 4; d߻}7:W`p۴)wܚownwLw@g[ *tk΂Bwlua-= {uPKЍp3PPKy.F#angular-1.3.9/docs/js/pages-data.jsr8)*Jvllkg6bbJXdŲ[ノ#A DB}ߏ#Q$e_VߕӬ(g/.Vr7+ tiW?ou{ wעރ7`?H~Ql) iM {ûfY+9FᡓE` "Eum7?(jSi宬C1x᥻ be|(˾U " vrKS(Evm,G6VU%i})lӮMl]Hvpם7nWnLYlLa ֒m Ԟ`ׇ/HÁ#Eebc א][e:RU2 }+t GUR̰Df!@ÑDƢĹIG.6 ,Xr6, nZ T$o.1(SshґZ+da-9PLͪkU% gEξ<80Ѷm-XUF: Mlet!kɄ[_f^mmw[خ`ai[>K8ঽ+vb}.j]@k롇aLeȃ*_-t]_4r#Az "% y8p(\Ik"3rU8H[լo8R۲o|@vOM_ Ngôۗ-2e*$|Xw+r2hr,5R΢hҕv-K K hG.CLCn]4P)cl}ʻY27mlbquZ3v- PCwp-;^)T0a c_, t#˾Z gP`F3~(CnV??m\tB)ߖE-T:0оHyt:Ơpd[򶷙v8YԦg5:9F}iI/TUz:lװ[{qL-^dܷ0Z^en^mu'zL0wf+V~7{ىNt[*q4b(͖^NA( i }{9Ui^l9IBÒةb_{ XJb3_S2-4Fo0~gʅĸ^`>$w=oLZC @fҶIíeqᕥ_Ağ]7`L@[Lx#it EK 67wܼZUnn xE"1̤~C Y 1&/7 VԦL|5&¤U:#EBEnҚ/BOJM:32l|)6Ĵ/bG~`b QN]U,db$(NmCjsl臇a,HdY8_&.uBTG54Ȫq_#ZfDkCYALjGf>~krt#왐3%!1[i1-flOB'e}sXuMxØ9"cϑ\4ėLȮ^5@³'L@jr 3ⴗhEQ.~) LFNV>ݶ\潦Y84Yaz h3aњH ;E"%*|cծ;ڲ;y(8ݘ9X2ڲ;52nlYx z..ӳGIWl=z  C4)YPh2=D!Pfट-?+ y1ƍWp$+cYNjS7T7[7HLGQ, 5FV$Y5F^Yl7I7,q }.mYdÖښ־1x[B[ښ׾18\>޵!CW1\ČwzbkIf#Qi>gѼfwqpH4bUAezSzN!N=[0%~lV2-[o5ڒ־Qp b~# yX:Iy7 |ċd1_t+hG. d6Q`Q;1 $a1ʫ%Qǔ1cw[[zuR5`0O*أM-)Γ̒|tTc"5_Q&p" TҘ/AwDcʢ 6>9w( |rV2+vpMY7~.-3d! YXD#ӳ3A75kQmHc氶T,rQ!7kH_eBӦQśS<.n11⫂ kI.ZGʅӹ8Fă%S D`>T.F:Kσ < qcx0q'A+ ySDG}z cf Y72'Ӊ ; J8Bdr2t-zUF2Dkx:R<+YQK50pJqYZ.LhJr dG"D>8\[];t%,ŏ`|EfpTԨvR֬dYRI(qC=R=ȹl_2Fs<:oW\kr1|/P"<:1Rad51/j\jBfT%!_-oܣIΑ\8ak{ x"&+@crJVE%YkKpPRx G8sǁ#ȶ0~Z ܐ=’מ$0UĄˏID5'#Ð OKo[+NݾPm ~% 0S+xEB6 / qP"=&2#Z,*w, u!".YqDyӶvxVL0' +%wa4 p,2 eeޗxr)l͠uq$'0䄽CrO7ՀGv8N@ZÜ -BD|N~d""$&1v:U՗C6M?>xQmd/8=ӿ_? LB0]șǣ~)YX"(LPNvʒƏ 1P 0<b čPS' XsL2@{wyo@N8}$Oj4t&NM'%mHRaә}:y(C܃:|H~^=XSj h$Z5Ki7w$,X=̟#a]ӉLu؞\Ѳ+$Rv0(O(+Z)>GIz7|?y(SxP7 ֭Zy b]N6S_> 2JOaݶGn Ek1HZ?bjTTЂX<^P l䮯r;G8_L rMOS]f"%{Z=owQ/U~*BzvX{UncLpO +(yX}/;r)d`^)bp ->fhIj'Zdse C%krNrH2T4;!궸D}ۄe:M ;Hí%.`0Mwt>d*Jk=rSïHgVȘ sӂ19A^JOwk5Ϙ Ղ1]A^ϖpY;jTl '9Nc[uݎnj5>'K VCcf:IN3ǘN,/cV9qf2c8INs䝮?X>I' y'2!䝎jS4a|2 1> >8My1i8c;1> t<8Kgy1Y8c;1>c|@i}q0>N;g;1>9c|@i}q0>NcqwZc|'s>qxX\gWyq=#ԍ3(["Gg&u&'q4yu) GsI ‘&̋fc3(͑'gpp?c@4?tl}6kr }9c}y']0w:c}q[_#lfNӊ+cy1V0 + Nc`.b+j]%9J݌̸gۄZM+չ.8;>,t0 ]2f!;YK,y1˄91G@i}92adwZc]2 1> 菉+*a|\1 YgN&l'T NcǫxTG2@\DžVG?lo}aNҼzINCåTx8Y4Iw+< yx*8p]AC$G;tû Sel}Z k{?,`EfZ#3Z5!6f)wpHq0ˇb qad>AͨeN;.tt-j{' 9Бm#qfE,̒9A#gtwyeK͙=tD\7Sum77g M,^OyKL2q6T, xVFfn0Ͷ>gi) ]By>|0եE"VKں4qmE82QߏΠh;$51'ԧNFQE|y Ye}|<tA9 }cKНqjǾ51t[_=j)`)A9a>~1R9!+K:==v7)d2!°65Vp* {cØ8E0>C!n:+`31q8'p?(mYa8_[ z*N}IS$͖(l8X` ykBG7 A>]ܜF1` |v7YayP1hۚ1:1,JR͢WD3X2OF _bCV g46̿ihҟӁGb߷Ƞx 3#=>M2EH1LxE2$ֆok*"t}c6%d5 Ч7cK-f.yȳy: w?;[  Wy8bO m :=sXM P_~*]^eQT 5<j 3N[ ?*=YL|)E;f]>fhM# %rP0pfq#@gN|[3h /Q:0J ʓ❓W,ÈL "j_?PK k%YPKy.F&angular-1.3.9/docs/js/search-data.jsonĽ[#r>بIni7]fHaL&3]LKeeo-3s2kWU`gD0see/:,ş͟8tޜN:_~\׻պ.~{ >,wy3?ܮ\f_,wek<<.W =zypzņq;n%.Z vO~gn<=SGYz#N};=6'mUq(ƀ'ӊՏwOU#'H_[ ,X&vOeU6n^];-Ğ&qБ?=qTOڜ:gWKUy؟z3st5^]擺lJ?TW.T󉞿^vY-\8!.$~-fVҹisRϭˆgptx.μ=~qsȅ5Byǫn~QȧO,' ʼnK$=O߉'e8]yzۭyU!S=z\Le0P|E''DYy ~~@ʞ4]Z\'ڨnBk~y OLʯȫzx}^7- mL\-^LRJ/>:uz1;ySyw.i\%:U/Z_͹>*x&d߬}fVUc{4CaÉK!QCT vcadBדyXcQD}p?Lhyjf̘H I-Duh!Y^Wq+:׿ݮɩiBSZMCAMBc=F)57ktצ;il\҆LOSǠQt‘b\ Av'[!mh?򭚬iSh fÖx7qi)Wuxa2;؛>`30$s4u::*Bվ@g:-R W ;ht ٮJ# ]{ D#Ш[_ 9:Էgx8s7` @w3TvVVku3vJiwzV,Uֿ>UX32C:#S٬J+1:/dm{Ea*r]KA8pC_KŽͽ Gsy qt}Kg/@?oV{ސ,A0=sjy$lZn#ф}R;iY@cTd'4><=Ώ2ti> -l%9ZXŭH=ȸH Gb OAVIiIC˻Z3)MkԮQtj3]$5FHztjo=Uv^d*@n\pتF``Xz$x EըO f>=Lq)zMu8!1BOt}&: V4L 0 . R4 Q,}DBD&lv͎)c)IwL?phKn7̀[ T<t4eVӜ 7: YY)o<;&~#iW 4!Tf/gPY /na2}Bw[jgXxfƺVO*Qhu=f۞M!ۍr?uKߒo&d([)-%U=KyT t9'Gq??& O UV%VTlhnH:`Vg~wɏ=J ;!=ee U{ _V TRUGahHM j^ߥ7>~)gg[,y}.]p8=HusȤ|a؞OϬzh͆F ?;5b NzV}W gra#G1PV#)ۄR^]4-M8 %DV; _1i+/6Cԅ2!p7-kqr_ $P #%}fY<زR1Me#ﹲ55z B c bx 3Y/J8(co1 ӝst02,bE͘E"0֘xGs贖^gz >Vc I9#SvRWk8‚nv[g&-]uBƒ>ýea6Ǖ0vZ)Sd~![}:tf_Z s4)VY&89$]&G'!TvI(aQtؙMYVГ&B> >bdG rcӡ>4paeTmnG12-]=-\b5B[1'!hQv񃏛#ӳB Ai%mx;*I`;՗77vlIM}@k0accj~Z{;Z3`8X!9K߾wtxc[1?; K 9ʬ0%VA|͗Ʊ آ!1-[u6:u`_S9RSnne1d;Sf a36w0\ecLh*;Q櫑tQwx]R˔!֒x3"'F?w"(5F[n>]в墩\Op"H0^ȩ?*v{]uibgL[lo<,$ZYxMȫy $D!gwJ:XL N"wnPAMx#yQR(*DF nlXNKT+_MJGA?KJ!bõk:1q?ѹd/ 򥰳žǂ,N,^]ˠf髳%oP.'$pKϦ[JA4iohL6{xfr Ѡ 3Kjy#+pthaf3+ 6 L`?%Rr-|"؂kefz1oPe Uw̑WwVJZnS@K9E, [M1^uNDžpW]WYuoPOY{ LjA}U]s\X5A +QxiʶY!lp{'= 1e-ǎ @H|BG LRBFi~dd rD4}0=N5^LK+ FSOW Wg[Y|LPJ.,/Q:l;95Sc|< $v fł<'uk➢?u,/ioz|nȜqh+gAOָ䉞7:%T2ƠRKb 7Rz˗=V.i >ԚACզ!.;xf#f2 *Fꈿ3Z@ɼ&7pX({^2,KM c=g K9XrZ̏(' jLo(T)Wga b-M uPV반q_TХYdO h/~F¶0=TЌt L2 SD'}ׂ{/"CccI宛Ҙ7Đ,=IPڲ!5Ah:\ɗǝ%ut7y^%FUiyV } Z83Ȧ&l`F-rtu 6尌߳clBת}BO$59AdY߯j#NDg#w:'Ͼ[;ThMwu*EiB$-#a(\C^YOW$ )JL Md@vI:CyOPemUV%7Z]64I\V Ό"_{Te6][3d6vGUf6k݄2cX!4LdNcZ1{N5%fCyi'fχ=i~vғ11;  E&<+X౧ At:T/Bsw*Qڧlh/ʹdb~wLT(2@Iu|HѕrSit?`֛9po:tϾR1s:W&iF= &5pT:R7 PvneP v&mu fG!q#ւQ"CJ ړ*+xwD}nZsbټ3|$mAe0,G`ݖ!(a6F>/bT5S# ~BPmhm.6;+a&rJG; #a>*^JH Bg͙gq[Usm7 nN/Ww5Wݾ6R0T`2թ*QA4&)ڢ>1oɼh>3Gu޻YN@Abz-R|Rj~ʽhJ?kȈ( Pj[g>gEU)߀xEOmn{DuHqrY?@(P]5"ܗȕ_lJ>]Q*v3N0PMlxA"EAGd>"b) O]): D|Ut(26%i`q?IU?ERN}(9.P)?nvi"쭱74*..QTS!U^E'ziݤ$U)ZIq~~CO3HT M&r"y>[Z_lDftDa\N$5 "[ ?8 )tT72&Q1wN^=>.ӆȕ}H!OQ78<@~ĉ.0hcMuCMONn_^v@[y@af \f}!SU9T1e;w$f [ZR('`/d>0td&W!;\I8 60p󆶷3I^ށf%t"߼؅`"%{Smr%!r%dJC0qJCS?;}ƾ!k/4b~:ݐ٤- ZgڪxφG+e2?YЦ @ ֐0S7=DpEЎ I 5MOUҜȻUa ~Oz#%g}sk̨y&ѬS{g&i6b1 z'e8WTzgLfDȠC˸Ӎ@ Be("})(p WvNNڦ >V&+$]W1JB1sNrGo+\՚CSBO["`Tdyo|967CVW羮3M)׿>DYMV[xIߦv9fKDT3RrE43HZm M4EweX^cysA-W< ;ۂc2MzE>!)tNڱ=@6i|<>vֻCuzn6jm6nRxai?!`PriaV{Y_J\brLSzN; :ճ@ jw?pKACK칄B"c.qeM'BQ2j4)NV}fX9BR+&9RBnۏ'mcFE1)NB OED=l8 (¿+;=7JA!:C#WDa$?z?u4ds$u !!rP tcѝ0&:!Q>/e8% \$ EJ*z'Y:K AZ0L '%]u?ǃY]Wlp0X4Y\9x]*gLfD/?o^.bQPV2*^m ;&#K໒^죠>kP[k|bY694>KY^ <:FHN"#lW~"Og|;$%ExUFNTdj*GYF[MM* s0d$AW}?1`jXUډJķ /}U+|hL1'\}@.IȌR1e 7<(N#mkSf9YvWGʑ jDoikǜ6xfQƩ 6HoCS?46N#|FDzɣXAd) QEFGJڙbQam%KV-*R9xm<| @{}t#v $,愁=_CD8H(xLj&˰uiWiג']EfxKKA[N} ^d+HTE!Nt ֦0D03/?)~z%'ө:/HuX}Nd^ 12BǜArw 0 i:6 HR|$7hs8i4A}"2v/yǁLɽniZyZ!ZeiȎ扟 Z] hWD1YgŸz{Gkkޠ= FdzB,6QP^:{ܾhNT29uL(6^ה$TkQ|ԩs]RDaQ╓rR":F$Fu$@*]tQDty/T QUn1Ň Cx M6S6HF0*SD;u"8 =F$x࠶=⑃Z6Լ.dϣ  N^!0Nge1dTڕ|KWCa푎'I𩌝* (2?$,mBISbXFGcQWIh[_LanPλ'`sI]5ڬ?4gYwA⇿\O:䘯[/w~*ulI!G痭C4`8ml^XF$;-+zo +2P'ă"b O~ƑZ\f|EZ]%2sFlLP-o3Ʈp%2+\áE GjC/! lm=p͵N[q ZZ|]K0ar!GAËw\I^Mp+ tW\4NĤ1a":a!{ &b1LstvAQJW7wBreXawh͸OB*Gi+#J\ QtaR@C8e.0xmz曊ա4DEݣh2Fm',Z,iqeL}"z$z!rD F0\͵uPf<mȁ)YTٳAMbalE`CntD#U]CqHmj*[ &v#g!ڑ+'`>wlSJN{:ROO B :*6]a^I1%e*F4Ģ$.2,L on,g|&w)c:0!uzR|xxyǯV⊴{2Z!繕΁Ð |FcP({/k]X=`[^l(q3Ԭ, D>P1@#v;cvrFO;%jbU5$4p@2Vk`^Gxt~*dn-^RH5o+:AkA<UC~YtH)%3z B " p3FOWH1suzό)+gޓX!iqߤXU58+N)^2Qz Evxm>lEmbݬg#CG52x?bO[ezN?l%?pШFr+h9nRՏT#N|!sfW@$ѧ-PGa`;b|϶,V- (-X-&353`U*l1Ғ% Gϔ`-vFb*gA sn6O%ÐB撥(}MH oHZnr">J~U7뿱,,quiώJж/,<'l\YsLJV狡YA |HM 7גn2 51?szm~kӃ^Hpʆ0=9ze깃 80*hhH9:M'vHC?Je@kD85oev߱uxXɐ *orŪC|{z̀ɩIg±JApsҸ#TRK9d)B0hn':H+{;-3@E*FAS[1”)%$ yq]6A%X~IlQD_k'1MBB3E2?axFNܞH.pƞ[~o5Z9B=ĊK`Q+6] 1~uiόunPq%(Ppo 'iDSMHFImP屯ła~MLśU"~y"=MիeʨѤc+Tw70FLGfeu /f%b^ ߩO[Lz4鹪?OFw{4>5yY[yL K;!-ްS{‘akE,tּ[!V Y04c1c\9*bJ*VCDQ!ZY/c}LGza$*yywznlK#:Sߡ ڐP,=D6dTfUxk:mlf/(rP#bY`r: !'m8:cD%R*.EhGg9b` 2.AN`Ӥt=A-HfN`IV*l 6I>?.JOhl 't_FiѾΤŕ'4ǦW$FGHza p' ~y<.dT#|qR vծF"֊JJ/Mb+Wb+m! mbL@X\`n4eU*-/*Og^I(`.44u@=PN24 ;ՊNIʝx"P֎_ z{ YL-ΈVTW  Ps#py(Oƍ03*m`oVF󊦦btd)E/YCC@E鲍\p[&"ȑ5EwzwXgh/zZvu\q5]ꈟGv*#ad_bʄDf<~qQd+h&is1V;/E6U$KL$`I>v)h>VF@>IAK=vz9\]z53V0#R"gh733Mp0\Pgkw4_Ьsgq1ʣh? tހZQyiZ"j;Ƥd"-˺X()BB3/ΔX*8S%VЀo{y9k(R) ,IƱӳ7(MT6]q+!b^zgA#bg3 f7/R3-ꐳ eY٪LaJ^U;ŧyEŋx>*cg.R\Y:V#R"?" h 9ǃ6`)΃ X~y\E^<%ǃjrBŗ#frB#'Ď|1W sR-A_ֵm#Bk4XU^k6R}#ÅEbpN)c o33\y}[ l_'Oc 0 gM< Z>G>ڏ=2u@_=Mc I$PU LWt>|巯vzڽ57!U0'ţU*&RkpDTaT^J.&}95qNn6R(h*iTo>fd ;[T0'N(~fQuQ~!q(+|潾cWfWu'PRبIIF4. I5([)*t(8ApYҏ})MGR[-7GG tqj<g][{D2 XˌS m E.ODNxBbl9\*a=&q B:*Ff`l!e~ob]2~1rŮ 1O7μEDtHzbO HI5.aXzA4N.ihF&ZۑYPI8]m2]FkyCa#2-Ak03>.ɮoly"i~׽܏q.>hwI2QJW%~\֠JZf1Pd{h0Cu| _WSa\hwV2_)(Н+\x= m W9 l>l ^N9}Tۆʀe4Jgnʦ$S'sm.{5TЋ@1^A[WWl[6,J^ &aK꣞@"!Ә唬ٲ:k?Eeu!T֊Lpޥ5'薵p@zTe{ |I߸?yLjD]~TOV$C~va!jMѠS[A=)ȱz+t2BArUlGX\nXltl1c'|\7* Rބ e vbnZ7|نG.a z\1֞JC~Ifg^']W't'ҀV Ey1mYiF7Ԁ,JGiw3ih *mbC/#)}ybw~LH_% Q=֡ q U%m_jԇ1dmi6Hvn]oDڋKkpגr0Yԥ=lFs=`qÑL?[G=U;k bG'.h)3e'6Jc<Ȋu} S +DZvr-4viAC_S˧Q%tҲ /i!O$6vy%B2cX;\NF펋`dbU4|vHpɲKiP޷~6'md0 e4~88erǸpy#?|[n1*a2)4@JT~e-ŽNwaeNZ>'? /4RU[O}E toLZ;Tji%5} .Xj{oCE)iyVZRu8@l@E`7i`#|ui wMĺ^'a CBPxH[*ESe1Szc+]m9bL%nfn}L[E!tzE"H׊`.I@ni4)!r'EA_ ܶ!NO0y !P$lqWS_?<3nw(\hwP,fj׍sg7/Xu殽uW'z@~B9~4"-}\H,c>*$e='NZ^U}T%FB/!tg.HOMǽ(f%DNp0*x PF(D1#٩n P(iBѠ8DA%-O &.?z< MB:zxc}b& 4oDb ͑SRxgy1;Fy0<\"&9qi,q27DHbGKZKjU0H\tG3m~8$DOG]fV5*QO}qIm1-dm"ϒfZhg/mjy2x ;L&} v N nj\ia.㊈o*LSd&Ne'Bᓓhbgvo2,(rXMc4ݓQ3πy"m_rתey;+nzj'*fʅKF5`ohg9}PJӧ{F|NY m8D{7i㰍v䎫:zp ?C^ZRC|s[[~B8ҧ '5:t4Yl5FQg:"%pZ~zJJ8}'ߒΣR;JlnH CGWF:rbgyK͔`Wf%(KlE.ψ\)㠚pFpd%*jДGTZ-/WU)_kalt*J{YϩzQA*MTz5a9=Q{>O~ׂ: !.7n=OOcc}FWsh:٠^itX\>Trθ/ap!=DyB! MME"aJ!̐loc||n.ni OwsH[۲yR)Pn9ԋ͋¿=/ Zԕ.b _PITWy~CG }Ho1Pu^)NΫfSRRFr.v>c=hj~\qiܴ,Zy쁨'gVru5e"7m^{Z,)+!+P(duf4tC×#鯢VbW,3X.lAϔEW !DqC0wBy;=PŢ*-1xS]@hιٷ)چ1T?v(.&ES E[vLj[}lx<X0s]-D`"ٖjsU*5{~C`2BV^qOb$hN?([JJƉ#Wлݍ+.\ #?% ۍ{13<Gh(3+j$Z <3nΤK \%x '`/>PŁ51Ihu?3Aqaܿ ^/F\D Y-tȏ+[+R*J5H:1=-?SH^ԭҀ܉P`XGBg0 S/bHR./hĦP0cLBwL"f1N1Bd=%l#b 3^#xtD$, FF9!J4j.`Fr 7 t aWdif |-iIȵ|. iZ)wis#!\0:h9e/x.N/+73Aot8a  (nX7,SAro\ۤ3&e0!-_\ֈ!#`#R 4NSsbfMi75:l6q_l) F )1-nbhF@kӶp,azs'[svBZ?q=72NQV?}R_ɚq~m9mţ>/XfE-7rk6sgN5*]gNw3_IlLv~$gVV=}˺3brzMs6E_oi(2;YO:$v0 huɛ0Qr{P0YE>ډe4yyemȀ.۬u.t7{#£ `f(c7JMweЛXm;JD>sEc u2_lF2qM^>?"S Θ Mগocduffag1}͋)lqIT3.N1~(42R˜bL\Y"-T).v}Йf/qM18qa˕-3P)˱b=Ki,\9DL߰9s"5cѽ524,Ő*HwIRكc]xq<0P(W.0N6y0g K* na8ͭ;rl:{86S !0ĝM G;bN-YXZ[ݱ-ݜxXF85K$Zg/-9ٍ3FԀ[ F7_=p}4]e +F1V摓T2P(а>jE'Bα=Q@i`T8lxe+0q5C(Ư ʽ^=Iuۡ VfQ]VWZ,>?ӥ*FS$\c:>HӤo!nj|B< GQ30OXPPLYCR+L>@S%3PM.V'_fc| OFD)Eߚ?zԪ?'gGPB+4f7p(QUͨr;8v,rBSB_u=aBbQ>̎F#piµ2 q4;T?NpYv 2-<)&kjf9!uMe0-H!>l3O- s[ft|x)m۰$F=t'ChqxGɺ5J*ɏS6?U[3d}3 R:z.nr@э RN봐| !tTiA %d0ī㈹<]O9jV^epY%ai~ BhrDȬ;WcTs*A.\P/·jAP` 4!#srP"m>/uLD:9%A@e&J=Q'.L 3c9~sӯC@&pc~5 xДWO?uEjeV!yZN`,@( nWK/P1fzH#E|m )CA7r젓1!&ۘlƉ1 am&d j.H ڋ:Ԅ3 >|JO)5=<BEb&5ӕDF-W3dZ\p6`✏[2BsFhJ/6ɫiVz;).-8&ʟWgW1@v݋pk5A/uimO0j;@&MCg;D鳡gƴpBC}w0;cnIa\CM)#[a1EW7D ߡa(ғ((SW9Le0UyNƨ䏂Kj*2^{gi}7X9kE-8aE_Ǣܭ.u"lJ ci%q_tKi-T5EtddC}6I^.fS?]jHK:;0u`2u&rBZ>ݟN8Εn݋\'ʳkwuARyL%)*L@w d)w 40~'mG1 `:rS4vК":ݞv\ҼP4|Ne{,@TgGWQWH6 rAݔ^{cGjpM-#ȉ e_IP\_Xd<{Ҝ%^y-wC?AO)Iwj M ) A dy"(H8g iN !GLHgQc7;vYBU&%dH0V$>xk|" oy_m4]8{F7~ܔXÈef5191gАy 将$__gF ȃo6Z\BW b 1T79_FSfg~swy,] *59MwuKYfJ)%ƽr#򹧪dL#ߑ3K@%; *SE+ Z>̠W|ԩmv4W .ʎqSMWX¹@?,g6B0Hɥ*n2=oL@/FEъ;G8$=?YcdA_-0pG`J7p -dsޜF o/D ӝpm3=y;7D4orBKJ1ff^sA1r| >I ʡtOpe[9?5o Ebf v[n9 ic2g0gQwlL\]8[gId+S7f=*84Vz0qB5f1claJb,#\p]1}/$geR3̬ʗT`-} & .4 sZ+y_,@9qmeR C3WjΏy`󕕈RNoe[aEڔB?ɅZ1lsɫ,1[OjI韘}` .g>r+Q##ֈg{,ur@:EKo8"Fr"BPHF6k:8ƴ b\.In'4p薙CAd.%:1v6Vy-CߞBnˠ%}=h("<葺Fx4uB0}#Gs_5dk_$ pb, Mߙ°4'DFfuE^7u➱w;AG&`p5 Kl[Xڴ7^Ó}\0~0[Äj1C0taO$- cC 㪊HZ}T9UO|b>+y8O"d F؃=.38A,PC+;GdV,X9;Kځ( 88]0D ~=Hc!H?@ic 3f@(;i|17:~s+G5=|:Ҳ;_~" C[;OW3t6Rc5F|h|$={8{.BCTGE؏ůZPO0кb#ucHȀ0W#9=m'N:F| r@2QT"V^4*HIJ1AgB}H3]Q6F2x\P&? P[_UUtEË(}86^RWgVgBuVM-놖I}u b?ôʉE12E ]j#Chp;?9S''>h56-WC.a*E[[fYLX0[k-]A)^=JA#MG8)1l8QEr\i3fAh*\D/{dG6U 0]NR )P)K>vbiˮQPt{R% 7'Ԙ Fb+ܘP5ns,ͪd%*ufAZf$o&_6h.1 tGz't;HeшtL2+ЊZfYK.Oܕ^C4I $V^d" C'gr03BvkMD~ֳNRs(b``" 9tLӾ AtZ8ǃC]wT/f(5iw"{Z8x9&{YݑC`pp\ w[c꓌d۔ǁCDCrG\-┲)dN*^O_%*-<~T# Яxf1Q#^j05i+?ߵ:t.|wIN}?-/灓%Y< 4u75⒨)yxH! ]$̜?ÁuDŽ}ΏPcbF|@/8^kH5b 5+ުW(AYB`h D(HH<\3;)*qc'q>+XlMTGR8"F F:bL@kIK,,BɈ_G^se>v|ϵUH r` eK1vߠo"2pcr h%?pƂ)8c9s"nQ25be䋌*!Zg9>1I*iaeNJNhңLLi cR|",#¥&OV U=bFiȞ0x{11lH4"P#r6b YȲ^V7]R*(4>W*[橋J \ѩý/#m5u("茴ŪXb @9(OVRoԄ9T4 Ȑ0/kivI}@-5.=ySb hy*d pX>Ǵ{+!(;zIMa=anX_MGm_@d_v4`g:YѼεsWa |k0ASNS0i*MKF*i:)_au&=:sƤRI}J>82/qJ?MS c1alj>MK UKC=fzyz'r~TRKIA=rِ1.8=&OPfNnf,ՇȑZ/9uس.1dY- ߉%@y9~hGyO,Mӕ+OW>?BJg.PԄ|St< [ċљL0 c5ٕ#WҖj,?ud4V v 53(,K`<߇ҝֵH91A'87i1M8b\q _<p2?T#~|sF.uPDo/Vg@ 墽 1Rfi"*M-GOnyg9R"x!;NLG^Bv B~uYPp((B!J IJd°i5Ike11DHip!hV:s&CbHqoJ`< ʹGݺe*G Y0L 3tR\\} e͒b5JoHx¼N4A(QOݭ'O1?RTA(Ui=EU[. e9TBTbRZMyxB-`"T(Hm#85cHGAVVWϫD6"rvA#3 3tʋㅺo 7qVI2!+%| !\mjI"BJ" UD2E #gCMrh(ߏ_Mw[WȵW''ŏ?uRc#GbK XACl^ He-ig8bJ[I1V'<:Yu7\jS}K]6Dݐ>S̠f2}|NřfWasc$)'˼z  RD/?]2~jt҇~+-ꂔBAb>e21:Oo.:aq@b;j (]b=;x*$%VA6Q}gQb:v4heP7%h}D^;*F$G,/3Hqp@Hخ17" N@"È<0vQ{?(lót 0DHA<O%0W [rɑeNMANU 9)@7&Xx|Fb1NGj^M B糜ҥbee$D'>3ޙbk`Q3W+Ћ6zM`mBмXCh`d+}[.dM[HMZ&fɌ)1&Mw5lՈa S0S[=t,C koܿd[s@,QrQuoHG")0 ;hqh&*Ç ȥZb H}@Tz'p$_/4fEM| KVrt!D˫5 ^t$k ɰQ(573+-ڲsNsq̞*(Ah dq// uI \;;"iIR0r$tg}4hW^੾{ 2T; e|H2P^fV 4D,h%ES : ute @ W +&1\G(%>M?_q9r|||||?YNb AAQJU͓됅goDقd4OXW ?"Mv&i@3(&xMZJ;^%01X3p_ O[JpL2*c>mf< YC]JgMPu5&5׳'+PcY`3%}J#ƬwQ]@Oc~ uMw -Nլ#YAP#[!݅%3ϙ.4i9l>9^`E\Gb) D`P-XIҕNd6 "/m8ZI)U^S ځ 6uGEW[4 cs)Q%K>*ۏ @8P G!;en1JjE]G9#{ #F_(Y"Yx}/ L?SHoZ%xPwwˋT#U,wuƚ LBP^1T%ؑ[~.^υnm}=>y(9ZM Er(CtsbV kh҉fDEE,1ی&>&9 *|#EıRKn"VYu mJ1!()?UPl@${Fi ;̙`$*WVX4F먒~/@i՚U6h,*BM;Rh*"x@S3Y0薨Y1dxO˒K}{=`8\H=Iy6/5w]$UOxrQ 2/Z:'\NְeP"4g ei#IPr!G2,iɑ gV^Ƙ7+SE_,4g@o^3Fe(򢨓/ ,4@ifk ŹBR=2iM.g*@YG(Kj 0p@}B d&`Z>f[$oK&-v]&SI56̮qU`~jUXgd K5 ԋ*PhybOmZԄY5)s\J 6CwMf'mlNZF1VRՉXRf) i{Rj*tdr*KJUt81ӚZ-+Ib OKh$2C*>8|m!*G\N;b|W$ţdP$(y7 t5Y=VeF| -E*]F&2 >D' d7 29yuBQ8&N͝*3J\O"h|Uۤ{n!`KL T"ŒL: ɪCFFwɕ$J~pz^iq`҈z[|., |`LM. Sf&ت y@5qK #fg!bJ1}idC;/\CgE.( ZE5$V ꍌ$={؋?(;^ SV>&8d- @Kgra`p'gMHy(%YG+$,R![=2ǭDLIy,Z[Dj+A-`q9:ZxJŦ>?{{n6 B@WRY( h=閹,#˦(x{&;J]F+'l^z8"G3c4"9#%ĥ @q*L]߷}ǎm2#vĉ'.|rO ȕ*l$tK]J::it̞B&{o­qἕص v)}`V&o^$'0̡X*#T9$#ޏӡ;%ooO&g_Vm?{\w #)/fW;C ُؑᷴ\#>kv1ѾjR5_$U"56p56J=dk&@聏W3LgRN4eE%Cnӎc8O  Fғmp?ӫ#޿ܠ$1c$3i RGx.'G9$wn4Z`k31Nb: /=qvZzP 4+rVbSgg<-p*h@jW1R=](.rC1 1;SsHeKzۡ`3+B B2 XvAH%RgcyJ2͚s7 ̥zHt2oU?Ad>:$NjU{ }-KSr$9@3p9[H-n %kGtMBAM16cA{yw(}";`4}18Sw^U ;WM0ִ%p(o(. ~XNk2 \԰yr4P KZ='g %FL=Di]L JF%<^hا%엞բC!kf{%ly'+ VB*W\o?-΃'^ЅX~spU5tw3w99ͳ($54 vkq*5㖂b/UOv`b eS_h08ЗfИh oT`bCM{`/?ycP7tG,b p{u+tuغ Y`{/ Ց.NiO*ac猇FzµX1hm2y2wԪfil*-lGƳu 0-c07ɤ wK1觻O^sc&#ll;ϊ/o~#wPyչ~6Eڨ M>=q}C]Q8|S̬q!f^F/)P-A{ON`fIw`1iI6RyDTi63E%;GoX $?΂>! ǝЮpV+~mXT0'}+UCy]]SуQ؏ES a`eUDDGM~PkC*?- h6ךT9F<ҳǸpS4;κzU}o+vK蒟X| ZZ =p,NI ?Η}oosyֈTZ%[ZGyxx9)wF6@7HY jvAƌ՞}e^e";ɫO5/mE?=fnSN 90 c3T>e _">dGwS^8Un.nS1Mx 쬮8%FXwU6 8,JfZ'FA a R@dN1F]0qӯNU0`\t4,%׾ړf3? -aU̹4E%q]ouH5ߐOݽk~њa>V ̺F + P}8S ^ Yy]@P$H#h+ڔml|A2BDM&Nl1@!_GI*R[83ݐkV 9Af)3ٻr*g7s`=X bEn^D!nW@۫CfbߓzcWQ301y ~xZfc0GJ vOaDVyM@l1q׃= 1{>=O?Ϛh/0axw&35/܄V0JmjL&07Lć6~J''Xs<.?U3O\3 4R)a|H{r'udJD{VdZ |€>+Vd~!ym.f7H(1rѦRljGA[~a5͉̂&HHԙ)_/Wݳu!&QbnlC=g }m&q"o3n+yտL/:t5tO:C6j@ȟqKS+ݮLg1U(Dl ]7&d= le]r/H,٨ Icr`AWw%Rn,qFwΐ3<|@Pn3b@/ZDUHko7B8p-=|OTԃŌ|Z3hVBUىRh8&r JU% w%` "%j V.bqY*50!cSMW Yٰ4{ꁗyC$0mS΄LpGnUS\_o]Q_'`b^#nʖJ6`[*_~Aqı![o,Kzb yHVs„"B ZeF?@eB[Ff+wEE;*d2m` 8t'꛱$ߒ6 2噂Won(ﰦIA=ڕ>BXwZ\xJ\Un3j0Las9Io+0j7puZU%l=Muf`B8I门n(lopx'g鐌͠lhLthV7n$`|g _?ٱv7=/o9حٴ df㔤7h1+AN|Y2f4ݐ S8}J:iE>St4Վ3pz;OL6s]yQ) )4n $ܓg gvك؀2hie~1I6(: ";Ȱ#k`2$C _BfNe{\dZ-}l::s=!CBZ&1Z-_IKYx?Ccțr @C}`d HvQps{._Ǯڠ9#齉02a7jO eY I31zc  ZCHe:*~׹XmE=˙_0ʋZyO7hM{̈B|̤HN8tS)z 1sĽE+5{?|%87csޞ.`C=},#ʈA,_4 p_^?=5ؽt w&sq8n屨D]Ažq 6+ÀGݚ(pj]\Yk @%Nmڪy$"s\K'n!:`)b >'MKj 7ya{[uc3dI*UEXOfYJY+ՠLs8/f*~,UNe@u\^+0h!lɒ/Dd(:y 7 {%( 86<+&~ݡwɻص5/!C@&w7ݼrX,a~GDmƳedZ惪&S3-\Aɑsh|ORjYZgh3W{.d$HZm-9 crtf,+|(NxPX'~?=3pR@E{hѳk1෌rB>"dkȾMj$;9LnM=yav 5T/ 8G!Ԁ$GI *<(Mb"o6pw7Lk5  `f}B0?d0"sLM_zիV՞'1Ϝ>LJGƯ'բ0"'x5tx )EZ'f(;$GK~{^f,%Ǽ@)?y?߭"Ozy?8L>H^#}v|~>C/F\Նۋ>K&!ISSFFKHD:w) Kwq;c9 SwcvQ1(i- K L*~IZ u&O'{Y`19 sӉI&hW H7ǒLRi`@{$Ye:vᷯ畑c\^IKGJܱDrۻgWq8ױUӑsk|$` kcOfT^zi}y7|TjzH3 -T$x3/P \" f:6UPwjVn Nu(xkN^8[x΁xx:juFPwpުz 5kM[ܢ]4!kn8[C¶t#/nQp@?;Gx`Y^H+ŵE|KΥmZ03(-VUd>&Om?BS1\I+=QQ5KR-?x?E0sj"_¨D(yؕHQ(=B )HL%1\B3!0V7ۦpԞ#.dQd XGx^4^Mj}f\!YpGN2%VopLwc{ꊮŶR!efd b f@}T?jXecnc||iWؿ!",-%HNWM*m1X@bYTgZ>ZvL:$ʥi#qEd4m|(ܣr_ܖL5{"q} [hd@ˉ[aɕ?ۊ\TBxYWgCL<-(X 8M, 3`YrC Ju~o>8@|AQ^hr: 4PUUi`Qc;I;QJr Lr>F@LxCS1&VJ2ePG2v,bo=O[5P6yF^;9PtCkEYr D@;mҊ`2xE[ Pj{5{s˰  :ј3 W^7'aN+y9&ay90JLɰڔO> f8^/_838oK19_z(M2P\2(`beOjbZwG-~87g=rajI鲻Ȏ01L73M '"sP5wMn01GiHoW~KLD 1۵HK3@Bp VX.Jٱecz 4un=蛏Pdӥe ï[8:7k*M.`k=tj9ƀ#)w54bc}X}ċ !b>M)VG#E"‘u1 踋ƛ 9y=4m$F@{N{tמD9%P1^Kq {Giٮ(GgžWm~Ϥ)jg)$FRhժR@T21) dsɚA;8,0&H L# ~"7wWAs8L|0^a1pEMBx>zd>)tI.aa&} 5h.'U!`.1T.f8AVu}@UnaDCߢ0G`4\=4&fƾwQwO+?}oE'AcZ~o2':ֽ&~\믡zXli!*Uc=1T^MI-*!')(,e'Gן(מjvh4߿luJ*ob T$~Q)=z줎:EV8\8sVnjp6ǹ^8GCht+C=uҊ̅V"M)UYF0 ?l`s kԩ*R a*OJ,\qJ÷ џ+֖,mfr*qccV]+(VW(2s W9W 3B y-UMRZ#Ŭ#^hPu†Rg_ 5ϕ]A ;x$%[]|-Ia.T:bǔX[5 F q"Ez›sXBeW*m2B+/v.{?f5+^ ='lwYHX(%tB5w7s*w"< [*i]dm=Ô=*R%^wBl dg 4)ʝ' _`@}u2MܙL8Q8ebLR \q"9Yqcz>5YQb{:Ћa ^@@U@8GžY\!]jhVEAG P # ~NC 8<0rR\I >/=!8J,0O|s/L~L6[gC_l׭t>%]Ȟ} o#Ӛse<FMKEGuRy}uЋ'|v_>ojnZi2q "0OeV wi}o n_)1+>P[?DF^#E;ٲtzWP6h]ׄn*KMUbC,!q g:WvN8S_Z+m9A*ԳO&̏rGE5:9$*k q@bdCiFS@2 *j[Zֆz x:ժ _ޚ͍D|&.kR%Íi|7d r\ AqϤXth8. I>6&xf ,DW'?wp(Ov,4)}p\ʄ^`t%&IpW|KJ%4uwO(l /5+!fHӔȝh\I^\Bp/Ѯp`O}̊1`?=í\ *&iţ{a;"}2o#|od>\ ]n/=3zN n68Q1U!dg 2[׸*dNS.U~fBݠZ{ S7v̭UX(an PNQ5KNX!x:˷dNr;$ĊeG%o|X;7/Z&%745±^J.w u?qzgb\CKle =R^pjV .gD`o%IiASpvll1[pUTT^:rK:dv`M.n-Q13UP4χ#X f#‚ NyɳodVaV >"A.>9ڮqR<4 *9̍=p֊DI b V yu( %گF+>.@L %PoZ+ 2a!N-UsQ*kDO\#F6_=KX'0Ѩsal9R*7qst5{ \Fz:~5:,@wkɵHH?4q&[㑉æ\YG P 'j=rmDʐ@c{B[2vGΥ\F>R s0LqK\.]-y©jĚy3ucg09kbdĊlMWFjN/<\&D8;4:* -jENlףY%~q)+A%"+7=UTtw g[s͌.f:]_WDVVI9z`=aKytְSi_RFp")'S#b vM"$?z2@0tJF+4j&9c/ey&x`MFxΑkxMt&ch"ݲ 4(M/5;0#ˈ2ڑcؗfFMu6&"3;Љc 5kG> Z?Whp0Q)lJ FV;ᙢ8 ի]D))(z7 n JtrFIʫEc1O3f=k߸R碫5m*F</1@ADBM}xxA&%tL.<>5D09%ND/& ԥ=cfb/@.ShBy07ԡ#ns $yW2o.b`V7Au[h]g.urU!>~DωNF @{Ejgۑrb8*3*ȽzU mBu\tn$e k]|'8ߥ6*wiV,]-m|Jثm>vVxΔߔ&J\bah{;lYIVע`x!KT|L:%8-ń9?+PY5ݘ#Fzʼn˄qI/|9iOEGy0:4v:98Jh|OfrbLp>>׹Eh=hԋl>Y=81ly@%58@LGBF"je(7Ɛ_~,o"OxSk `Ogqģ-j8u#>+.+t}BܮB."_CcT4 6bP-ۉH7xx$*xk9ED~,8Y~B!Lj* /gIISe}AéRiz}yv'FI1jJ|+4Mul`zT^ \8X jc +qZsAE]Z2>8?:nn$2 T9cc50R'ok GX~8w,xhc([Km-ϳW`T+(LYh;6hw3ם+p>&P%aŢEuod5ydl)Ԋ4Rr1㬠WGT%8x@sʓG3$03FM}QSghšX,!i3hJJBGʊfb: ɸR,q'qN2Ǡ..&(Pzh?YeD Yyph݀"qɚoqh Lz`I ^ᥣh9'UG$ 5,og26 )nO_~|R&Ӵ Ł֡D"4[%7}]F _Pr8z1鹢{.+SHQUūDAyKpEDQtPJZuG(Q"NOzL P] ieā! (pVl,۶.l*xĽ#yqlJPdv?}ԉq` ~4Ƌ/+~̛iɥ'k?>i*C6By:<$z߮S8.W{2HyN7NeG|ˀ-wX5Yt[F]3uXs6`HTW= *bg,V q'q9K6KI Mٔ:}S(2ﴗN9|~3K J/[@G.^B[Bh%$ 1^o`:SP٬˯DV +J~^qQ4 '\l7{!-+`jdGڰ~|g~ӊ6{ =ߖ _mhG׸)&-<qm6D/pg)tv$wl[ 6;YkJ)B)jvz6Q\ITeVkdrRQ.ejE" %*-)k%e4zX[3>?2TVSk))YDiPa"&R%?WS ͽ܉-.z)u1_30sm='ǚf}<,o} [t$:〘#{>7Mz#2W)`>z697U>%*,|Su20ԕ j\#V.6}ߐ¹R5U7ۈ  ȭX ‚oA9a}Ay*5w\yj"h#T_]bn)xMı~ǮK=*ݣoZaVag&o)&VRʼnBdji&!:v"(:a1E0}8]s8ZgV< O#&vgkYr 5ϾK'H UNP0處V$JL}_3??5u$K)y&\N$1-DE+I]Px/ؿ1}hy qmW[AA.;yǼ f3 ݻ Ʈ(꤅q2$MJdn~.{XL \@QΤD ˲V|Ű ~ -VT*y^ͭL( 1[Xs/dan k~CD+*P )7{˟}`y,.J39N2XXu)JDmW#wraT)Ѵ4%|'i#Z9?W6rYd#!ֿg@Mx/uIA1Ѱei͆7OhVKX?&4"9z$ȅqa8dz^X9$MCv 9J=52 v | K(|| \Ƒmm;OBzY4[ z,n,=-!DJlE|2=Sg,.8PƂ\$ yB>.Ni?*mR^~nܖz%iwT 8)KOR0{\ylژd @> 6;4-@y0 Ճb MnmTҥJ >H yiKqR(FdjC m"zl2fBOD)>VMp1Tm> 2>#EF=3k3Ml) QDETv[oxὮ֝py_P毄0NnQ2yz<К0.k ,qj7sUHt).>D]X tnh{z>.܆V"`t`PY,&!8,\TX Ea62c2r<VV皵_e,S쒏ԠS!2S? اQ7|P%-` Q"Y*q$ICFW"C*:LtʭTS/sy|]^~.eUh}R$5r:NPxMmeڭH?ofnXtg?a$Q琝6mq<2g}1sXm撾&k|gbĸ'DŽF# @/}ҁ1$iЖYHR1:JA+x&o5e2bn~bMR{&(ȚJ4`Rhq !/=zިN_(8|F'&ᒮux;vo1|7~b)A SWy e{fG`7utJUzͨ51 8.Q:5WMRn{EuNw dUK{2u3%r益+1UЋo= /{nzn1v#X7,vD\|fyǭݏ+w7o_ ag0|Zg/Cb Hh3P`(l$vhXu[ܜ*KrjЏqA|P=t v&,I-.w˿ەoVKX)ѾXL6"jHk>< ^uVIf }kՕ+kaX]oj݂4.%33+Ag6Չ\&D.YwԾM5cZ[YcǩV[^4Udg+g|\̀8q+=p\ lRJ:%({gDyR,oȘCab=A  GMӮ}u ><ԕ竚 em N6myIyjS.'zGB䁃 UBM"Nsy'JN!b0EPb'ݐSRTp/gB5ݦ:Li\LZV2Y# q FZ4cy[`*jFXj-#$ TFEJf>b LhGB_K7( RF֭2J+ trɤ:pH:.xk:+ N8ލw^mE|J J6b#D7REY# i'Gyb{,Έ:H>']݊.*F bW𳒞Ԍ~=3[sc/;ɲxwn-Z\yT+t>%QG/FZ$ ߜ $ 8n>I@sfBj iZq& :Q%ߌc$W|)B7ȡ5jVY D G/R+B4$ovRk8YO؇,HP0H |0?Foͣ0\Kȡ1Tw òs' ّ hs8!F|Dgkƛ1ZZ95yXhJy]/^ƕl:ҍ璖c&,VdL+PZZTnDU5iyd"Ve ׊#L}<`#&€c '1/BM mHtw}T;yRQO]3+hڱ ^ %x'PP|0 ڡ!E苐Y=ʹd JVWҶE2Y1Hw(Ź@|s@xI8gtց7--ixFtׁ6'{Ƅ&^?R8eev) q>fV1$v䗻9I^T}PW8\ ܣ gT-ǒ{ Yկ~:BCqܜ҉M3?h_¾bt%"v@ڡ4)3NwjF-/y5go zג:VAˊL|B#Z)u@)8a|^wy( 8H_ #M0;eډ'8~3ݯkNj?SL{Y-ą w,5 \[N86S0xݼw ݽMu fqpMNrSŜ8nn X9«:W-=V"FmWS㞢ӯ>+x5 /wPPm2_v+b%"sھ Zj}<UvzFUUKm@=:92]Ȋp' tX4ExWO.mGZ$)9U"sLuUC mA>S;-ctE' ѥ9W\!;1B[9f[3nqe"fj8uUL>G[= SaROT7ARÚٮFڼ6-Gf5tUk09 X?3Vzc;*ws^O hO&+k6R^4$[ MqQ?S$WNyY<ߐ*rr< ;]u `׀-g40э|zs tt&nn:X9F9| 8Ir--7!7XL2a\ ^'Xw:ӼYv0n0Z~zYmR)q5Se:3^ #ڒ'и+f0\ =೤ xD.m`WM;X:4qjbYWLj4$S\t ?n$7$8 eX.?EY[>=T(O8 =hoNkXt?ÙGj™>^hM^ե ' mkp&4_8۳^ХBe'>FJݍI,1)b3(=hk*gYT=CGaQˉQU;f{̏3/Pq5F ߚl\)&yW{) OdnEj ? .I\ݫ Ȉa`1~Op{ޗuIZ:OAen?N~ᖥ7jPJQ vSO1멃YysXRQՒc7U26%֥S(kh'J.L,\ YS5g8;  ńQ+k:.0Safk755 L&Mo,33ޟb=\˚g\ӷeo\&/edCq_O|֡cSw*tԜͥ;rTl秐*k@HIf蕘)WpJ /}H9B"/#0l% X/cI2,^¦, S._4dN0u- FV_)q2/>Ƿw7@@Ҭ$AaHj4ƄLU%AJJΪ$vȿZV8(&C?G5 d2/LhMe>D?kmHj+H咫sA#sn4.bW4E:m3U],קO=s ǜ7b| /[Nq6y䐋6=<>[y淿a3Q|T@m@3ěg5Xon*~IN  Bπiz/xz( RʢTR|9| (d Bd .1|Hi5B* z 6lC2fEv ּ6 s7Mw,}1U;xFXv@( {/%od4XGt>}I^En7DsT.HJiyY"? .,[(7C5o>?HJ+0LJ ~GaK62u"TMS.5{H=a+S~Jӷ^Xq,߿; hvIҥjb nkIN3Е| eG0)'?8d%ɭ8LTtGB<"x{4TTaAɅ!)o)æ<puJ 7W:EHb/,!`F(*} e(: ]0RO6poƷ#} Y*il+HzĬ$B9wd ,$<D=C$%,-g>F$v+B,y,.($g~?H ~.pq߉-} T JzZE}IN ac)U҅gvM3;SR@t*x%N͹@N@'PAuCūCevGlVmdIަ~P ;ō%[pZE;*Gr:ƌ8GWpd"o<з)Š b%f|x !upR0. H)<34IϘ k[q ^ zN7{Ă(MY4+kIs (v4ָEHQCba""oY9yb,tmn 3y쬙;dīo.KfmOAiBKS8XMp ~|eHvrl;Wҹ.Lr0_ Nzj38/VcrKbg5P|`r0ݏ4gȢd*EZR\.y{4p3H.VAd>ޠl 0"A35Ŕ\-7 @< m|+ڸGP,%"ZCzI]&kWEi ؏/Z0i@ HgwU/zhp1F()yĚP^nuzJz7h3_G0Os[/}T1GOWfl \"EA V)h!uVɺ Z u,F,`Wfo]ҷvQoԊךk,3X v5"XoOaV5v ʂ )zb25Y#TZtDž5\zb89M!K\.5wm^Gy{vL?~PT>h3.} -<}ďyԗ`s,aA<↾H`l.:߈/vUsrA m/19 \yא6(_ϠʏiZxa /SDB4<"A#k=Qȗ.m@>09f*t=`K|5COS/fHrc9|kW,2,ExĔ/x^0K_%1:).6v;y{0S`kO$knEYbFĜlr/nԘ9/\cfT M MMgk: ~jօ=3ˍMBY58CcgjsX' z,Pg i5 0VI 4ݚ`ٱC~W6mwȣwϵOɹȼւINbvQX2'DM\N,g,f썳7r$ 9_M 'RHBy*8C$``$b!iVD HXo9bꉬ =P*Z@I i3ngY<<-a!xEPxxCWR\"? e" ;ݘO3ר3MCN(V֌>-_b]yёdCe|4ov횎Y+P07pd"&$04YsD\|y>u S Bܓ?:{ ? lI?IHN˒Ł?YblK5]TNПКc)$F=#5Uhs .Das=e[{v-:ں+¦A…3aJfdheLLgla|_rNab:j" d yP_"&KBZ ,8m![D&L#dvzN`蟜IT{2;7NoQw=|!)@Z)WHف8Npp9mmt c0HerKR00f,04yؔb}T> N]{q589$d hlVM:9eh+dOQ\l.)|eOly@~4&dbuk2/P"KhFУLJ]Hhs)YW63Dc8`sZygo kp`sOU)n{y0D仛I ə߾9^77v#ɡ)y)6%IK`,>cSR,wբb$@.2=U$"Z{G}P*YvM+76vJ.>Ys_C#Utѫ{N?g}J78 'qPENZ閳W}7YЖ>^ԧ/dd1*5R(zǞr}"?0Ss˟fCv؉Vj `B TbCjrO#PYVƎ!Y&&mJ;10V잋G71p~m3eJ%"b0+C \Uh1u=-q `FLˡLdSP?/ĽGqO]OA]Aa-UfڎuT}^ƀDC,YNkLKjӴM>-ցx,2f@=^ DZcD~dmNΔkaZw ҡY)Z] |[b VG\TIKvjhbH[[gD%!UevB cPNzQ%'HN>/šdZM/k}>x>Ml!ktCnZ=(V@Z%3V$? VTPsj1#8!dܛS_H\G AdM&#eèrH)ev2D9_S'eH4Uv{ ʽ2 fz7qCG865?ΣcDK3r w &rzV;tqTfxZCTHKvw v%ŽC+/$ErQp=??dO6'i5N** V8e>+8vN6׌t1x{.ٯ"%Z?CrfN2` &Cn,YJC-SJtA] 6jިS5be@>_haԗ@px@JW7#GA"7-BѫO}CGW&Sbڭ>yBSVU&aE%ʎMJ  `cd"$ 味G-yvxʹ8VLG+1@YFH!٭ݷoxEdYdd-~uhSʠ;p~ 9Y kb[M8]u@/-\ (~bB4o.dt*'h.`.n.W2-%s,Qmvy=0a]'LHR!ٸrClrhzU?XBI NsI5eAt6q z4My,gqՀGMWKt8&ݎ֎hz39O3EЇt1m=bAYekioe>g~՜/n>F,iu`pwc3.%S{JlLe?}K}HN3t`5Z 1FN k0Ŕ 5q.0j]Wt75?^j_gwWn 0 cZQF]Q$BMdLԞW/-!^&dQƴpCW>-Rewgb@13zǾ=-$LΓ24Tzl6K)t.S FQ5bF&/Q k*5P;Xl0taet}|z;<wc>+XGgpnmxIQGJqHS]lo-oDMWp̜dHPTQ[= ݙ]XoI`f-Mvq6䊧^EJP7œz^rKV}[ulHLv dZYKs<|x{9x_)Ђjh:E}V/oM6jriHM!jPȗ̏4~oo!8Vfc>ϓy.A`-a CH%.B`:[N x7tz~o՛g>bq艟HTDFl^*TD |B (,鉟X+~EcD(+/"wXq-Cyy6+]@.$Pn>/h&6'Yfd6Yρ"wPk!']}#+I3ʞ"*p82&QJh-K9@0,N|v~wWFEYJ>kn Ʀ--iqjf?G^!LG6i}YhG-'xSCş=Fxuf8)צ ӛK^> W#fg>=-oָő?/ѻ ճ4_1Z=݅N=c,cV ,Գ96^BvfԞ:(Z'[ZsF"k6\)@Tt=K 7e7ii'oc& Q?] /F>W^WiLKfJ;L)դš3V YSaƞ[gz%5ɾ`$&\tơNV/y*ԮYH}SMTB%`v8qE!Vifx+7!է'o@•wGy7ީ1ҪW"U RdR ܛdM!ִbrWk%& IO_~va0mjp_ vLBz -U;.$ Qȴrbcq>A0(i)32ߒJ.{F {38~/f(g!"ikxl$ƇU~E|=^ѿk6|S]XG}^p?}J~ϸ9 DrYg$clmIbkVTp(X?DklJ}\ޚe_T5Ov6t-;M %*,h6XjVtlx҉&ؖH$yj^毨ω1%#:/ޡvb*lIVu9RpXZ2+6HBV=9QW6_` v6)Qaj/_T/U8!%sz>0OJmD |2,RÚBo9CM4c]\H4 3eshؑd FT6}[?62 )Aʄz U -˔gCF<~ύڃ*@[obn_n|Q{]Թ^*G:m;W5e]Y3 d>R>JB#rfmkAeOGRM[3P9 ~-+3F#kD"S! \XR>Hrه*78XWcI(,/f9sl]Dn=KyL'x\ho >ſy ֑ӯ"6K{IqtOsF55n5lgrƓ$xB$}a~Ae9&R?ѵV *@e؝ݩ&LjKɓѴ!cl;Y֔7 HOD]d?PYIӹ9!j.U.NPbO0}8ٝu>T o 0|[ G]>:9 I }ЗRc>loQ1GA ^ bֻIǠi7Q^J^aZjA:y13tGdžn ⧭]GR~o6l0\ai*uzKq(ƌm#چ5Hm[_35[%5]oF2_(;a_ A & 0g y 4LLe4`i\!Ŭz>LjD0599:Hu>@֐veGqasZx%ZmEj@0HB0'3ۤgRt6VT+Be Gڣ>G5 mMpq_[y?ˣLG<}I߳ov-$H}û0AcS׸aeC\01I'\8x(5ӹ2Q_֥8BJ33%H97Cj.ʁYGx[ r8;JU_1" lpmOFq@%j{DU}G7¤'@)*B05ժbAh7d`!%Ⱦ{Bė]DcU< %< jETzt~ ]B`Șn3eZsi':u{ըr]ϨAH<'%=}russ+hOWc.a4kGԫ顃Z5*>N4|=Y:YSC_O-J:SfNnaob'tYM-@\L6CFhZH⏛h.бIdx=˒Svp cH<7O$r. :3;xxJ+L)2t2?M ٞyltD }9ټ@ikLe@+٘;/;{*AR:)/ofq?;D\_f׍ ~ Ƿr@7]d֕48t8w29+Na/ܹ6wm#t ÁP%Km,Î9ˉ  /yu{gUl-͙2+3WA+s\gmfE|LӋe0H6~LeKFV|c!Szqzk ƜJDB~ koU%WQ~Sý0YtG'F/{҅Ղt4;o0puyasɃ91v{wBE߈J)Sb&}}.^FMn&r fQFD°`Y!ް}If/Wn=r;M<΍<p-<$V(4Z ߜ ,Q5ҋ{K/Nj'+U.*pW?[\id{; c y1=2ҘkZUY *YOy"T6%v>$%-t⭮aD̵zH?1k9qf7~q9ȳs.sU6kāSLAnjC(ЂW7{رnU9Iټ:Y8ƏUjYHY<ʭ,dX+L;xL|CGBHbU:OO !t|8ITBmiL$.<%$rAϸx 4؟&袸IT+2Y#'a8uZ*jCE]r~NTfMb*ilFeDZ~H-./1ۮ BPj=&JRaGeNXt0@+ nPh5 뚟Iz-[q;KNd>GrN]/(-.ob*/, _=PoRx."β" Fy 98Hi6\p"Y->"3S2 yWAN_=%IԆ/!59%[]fNf&RY' Ěq3[MHE: &ED,G*@pUZ;?XCTSԚu>.D6*pkO{:Du '>AnO2q=(sCwjK=:+#Xfnӕ]xvHE*Ōf:]J bs޳*E*̋hT_R+G\u=m.2c{i\<$p81Z5oqW扉YIqu#Oa@edޚG3R!'F5kWXF2JHI eD6`&$3MMʘk:-P#N?!Cno5 M!yu|`}қVV~@}'>tY59_)g]e&c$ JɎظ\tJW8-yݬgR]3o;ڔuR\`2wxU焱&;TBO^閯*wbElhwPURn*Xbڡy,\(.`j>ٯw2]ދ))Jv~VßuVM.SF~ϑغO|U#wj<<.}k-8 [I 汸F8Nϊ^i$y9RS> ķ ~ c;,:>*ވ.Vm2}î6Ρ :52˕4ɭϩ庸KZoDڕ"\65Tͩ}2~j?m*}ƶQG&sTʛ<멤}`7KK.n+??Je&eH+lͷuF<\mome|?*%;Zyh$4FuX GJBtU>?A`na9ѐch H= f>CZA@Z[8fꨯFz7!3}@)B ^$YoK0V%7pMȞ* !#WVCh֭ȣ{<-'8B6,9oG\pRy)j6'   e,K| `55%/]⪯s0 ox;ʕ& &cCK:B;l`2F*2G yHEIBvZ5ANƉ&Fa*s_jL횝xOm'|ܲG'nA%JNLL̙sLHs1p廾>8` 6YAZzvDa3T} ;)n[`94.Y5?۹t*'v=6-Qc S$Oi\6$Yl[m7: KpKOx7-b PvX;op6. C 2 +USNr!z8E<V ؽDvn!M^śHO_zr}*orKIl{@T4n8~qG!} @>ĕ`})1mG~utİUl7|l7rA| Źm4}nMQ`6fFۯL5  y\+܍bp!#-(jfx8b!.襽aľB:;Z Fg8/jhbˌ޿#b)ohPv訫Jw a:"\xpj1<}r{ZJ)wgXc]p4`<8AYcZs0)-T'T!/T.tYǂK٤GqA.+ Ϝ׺%G@~Ϳiny,,J#٪V8r~o8)|Su M[uPx/ɿDwX^2%X@ h]-RuL@* -{dHϑ[|8~sBsc{} x亴DʸmOǀ (20M)ɜt֘6R*o)b =" xgF<cIs_s1ICNlqs{Dh.>PD`_>P ᒂ#oWmpCuB._|d]hz̮L^0ڜ1f-[WL=I-LG XRB|fOcZw>:uF)hSOЊx22*}{tĊBJ H_?\hM2[՛1nqwu|Q D/7mpt%.g s9!1עMιz@irY7 úJjLVȕ!ւzdLb"{jJAt*5-)Rʁ gkxeSJ.ۢc S\Ǘ9s]I )/ 2(?V U(; Vs)Ȥ_(mb艣u4USНy{dΥ"-4 'Ib& Fr^gʺ|Umz2c>?.aR2Z-H2°F)[g[P9 .;)w (H1t>nBTs3le8{O99QId:,?*A"Pq ,g[=P}#^i?5^LOwwao"Z=. aaH=lſ@b[ WLtuˈ+|^J} 9VMp I@id[y=BD۸cQ0{(:l#/WIhJ, iie#Zs" Ԩr!A[enib_ÆS_q@E KzP1gϵީ~2SW[*] ڃww$[Ȑ 5r-e_,U#+*0OO1(;`2/hrfuP^lg>ӜwLt:~a* 9r6IeLca81̉A)lx)9] @ (EDZ3Q" UOtz+!qzaґ I@Ͻ3Dlj@s fC(`lڄDɩj2,vJ{ΣQ/s/ʮ%Իgu2a9 dSqVgæD Gž|(5}r033'Xݖ!?W"[ |3-r~rzjvPA wކ3eC|[%8›4;gRe#.]E{ WiϤ#yyY^L œHPif(&3;1vxA<yMrJS"i0 ~$, ێDF.5%6䍵r B( EژzʖI UՍG5cHTJ0ǚ!}.t"5dO5r^Q{X`w/@$g8_X*fNufdJ4YF2V%K K7 0Z3"!5Mߋ:Pz819QGd!J,+M0 !ώLRps\E$J5;N#/E[** %40[E|5>bXOpYcy—~A] &^nN3rBM 񟷀~.JXW'̚iǎg>wPKARw o8y&?X"1X:гV0 |(׳'r_ޏ.cE6> zok-y4ZئUD<W28d3Mzden+M9ƁE /5;kr`mpC+˨Aoʈe;O}H>ÖW-ʬv-b~Z?$UX>+Y-V!YE\#.RyD1]ƞ+$99ڢ +,LUOAul`X[5IY\8VzFvgcOȿU`ÓpG\sO+dX-lLg$l-CO.?5-1-ůvee1 #B1) b+UKj@}`sBZ<)^\{KH8/NtXx[X?ߵCq`w-g/$5pjm=WuT4.ٲy,ïƀ%dcQW9\rΩ:5Ýs؋sHC&*jDZV(V C<|vU cʯ?8"_WqWMGl` 2I.Itȓp혊*2J?gp ܒ\9Eȯ/[DjesiRёs/{ϬjEQS^`戬c(OYZ#j",bG\X1jxgF졖sdY\$J֖{|Ռ c7_ hl[#6vj4=~G Q*t_*"kW%(,E'bw=(+FQEWDWI @"w&J?v`t^'XZ AC/cd5<sND9Rމt̝=%`.*DONE?o=aJw"+17 ?tQ.H0y,ӆVZ'Ɇ|#HlEY۳⸤bY{{W [2tZx +Ay93?Bp֊P ˸*e8v.fɬWN 7 V.VpzS%bTbGnORA<$犨 X`(% ~苡C_ B1uyթemP뀥:`_[UFt8:AЏd <0G{x+ .S5s5_pG5H捷3V7k1PZ/jV DKL&{KvwnQ=.uQxӠJpj@![뗕UR{ tlMppeϜfm¾-2>R4-7Xb]y2.Yq ݭ?*˴mmm/6% U(lk^E ѲJXyls"b4$9GT1'7tjf0\fpeeMLJ1Zůa)1g9"KAJfmRS#fVJeXyV?J2?1E0[9낅@MYSM]j* ࢮe80mQ!RkLzz i;aQ_`tʨK[阳%ĸ%ߺQPb}肓‹AУ*X-\hwzoyn0Du $ )TR4 Hnwh./ǘOʸuUւ75_&ũrhuSQ i?)H"@=椄Ӿ@gjv9=J|Q#& x|dÌ!Im4I8We G$o8MxHڡc6,$K3 xw91b%jǁ?bN(0Eddmna4;ޛN*QdhF $(MAYQT3U݉jc\?^R t_u`FMQke:Dk|ꢧQT4\ bc9J8Qfy{fwu^5GB^ĴGqaϗ,Ḩ1TwvxۮTRi݁9\Euɀ8 :RwR&BI,Gunl1Rs}QbOd8-IVR6:,TíLag1JiRd&Q4$g1B+B^ 8?gG87"blpu Ve^V|ݸp5b1e_|+]K>VOUFLΠcq%JnZHVk\Aj߳# [٧gp oКO"{FLPgURM0ۗP V{B>&dcg|TcKݤm];6z&ׯKhA}`@ҷu,RZ6TKpO^AWZ]n#ۋ]kt͙ňKy{vgt4g͚pm˥9ʑ|X̙m ~fL% d@_v9:׎ 3643RŘŠ$N(l%ygM0r73: bR{Uo*3û/C'f/x@C܅*6jM!зg:߸c_~ԷV4r-gYkr_&”xrii&~y֞/^o.|jkyx|/!Uۃ^uH9k OWr?ΏүAO B=vhc׊R,:˖=p#?ظVpȊR$;֑ɼ$X;,mQ?D_#6_OTi5}~q>3p"Fn':E5?ce?5|~y7/,׵r8]C7_}Av~1pS8pr̗=IJ I@'?M&gO\w;N:x)əNP ;d '2. zO?kKV ˠrgRc˜Qy r.|G?]o6Vvep|c`BG94+!jeEYW Q /q#]4|`JjXB m> NV!{$0ƨ|h0 U6LykjH)=1a 44{hLy./J&TO7kO˾f7k\K AJ;U+Gfvm׌&vDsLѸ`!\ǗzO|Z<Щ%޳hm1?<6\A'Ǻ)cƝ)2?Ð}GǣVO`KdV̠4?֡a~ۿ)zڒۿ!eLxс ęu\{IQC_I޳s YJca"j3'tOb0y! &Gτ.r;F0CV\p_9U} 8wA^>٥v(D.!Ԉ[:\^; *mEzHg[P@2xq{z4;&Ed\&ހwA O] 鋶%!ȁ$:Suᄙ'c+oQ2%0T k@~plxx͈ɒ5#L-@ 3aY<>̙`;0 %,H'$һ)6hxXWz#ًs5b3-yST(_s&i&Cg AJE6~$O$H/UVѱ|4Xcť0h7 fs5ppJG&;Ŭp|-NFhks43[}ssohiW cHb*IεtnmW+D`QV ge+s0#+R W(~ySՖb&|{yHXxƉ՛1Q6OJceڛjWLHbuxw:W"SvUmtC&V+IB䖼"q21K%Zո`LuDD22Ev$Ί8Ljˇs@?(P>>%9]s&~ۑ;{w3y 6c)H&nͅ^|(/z/(+i0"0]H @;Tan@^A(Ԩ?ѷbׅYvms &VxX1)99d?T_3֧qiKaߵ, [$ݎ_vjp(Xەd`sӿVa}l5^+UC4rc!h/bs>x[#l}$pdH:?++k[Wɥy@GE:ݬjb$Re]vʴh~WK)Y`W)ꋱ(ohV #{D,}ak;a+-ĺsjqv2@t.v}ZlEg~a;LLMZQfT".9|L`钞l3J^[p.p0qKT*/&q X?HnE/ਗ[UMeãT"Dk4$JT4T):\IڵV-tq0KF7Bxzs*p#P^O47w"LC1h`8euS{ӭӢ}Wq5H wDBE,kh'5G#dJFN_bSvd($b#ƧAf:(`[9)6>L_eV\5v¼ˮ"3I ;yJt&>Ri^qflGh G tbKLb`A{. _GgXexʾ w%9GQE{-8O}Yⴝ $$SUǑŻ} bE)8jIk-.m^^>]SsG-~,s B@<ڝ}7c9Th:P^ 6g)\x@w#G&#w>49Pfڠ|µj=D#mY(|xuFg\ 4ˇsOh%Ol7JG e3(Ĕ{CMK+#O R}a"oݐN'א[mE^Ոp\HthaUBt҉Uᩋp~$4(#Z8y@thS%_vDTB- Wh-C<AH\h ř5&%p$w!n<T."nc3..Ex a8z]A:-VAM‰<=_&_ SiU@.9ەx2D(*n&]RkW*Rt d,GY!v I7_a뗘B@@]:b` Ae^V;tRAY"=qv0%p˨[QZȱs&XsGvY2Lr@}WSac '+,!>cU@uyXNկ Yg[ǚ!lLK= d2<ƞm$U5%5yVb()xBß|9`MOq|VyyGb c7`׮n_-}f*Cw%S~x 6nL Q,aѴqy[>Jm,eCIL`4lߟ9g0Ȇ"(7򶑇iYVHxrd0I)lleB \FKXՙ-ʼvj|sU=-{AhLӑ82Pڳyˊus=*?.ؙBB0uXy0Z%&tȤ/圣WڟXZQtAOväJѺQA7,n7o:bY6gW/iOY@?0NZ1on^J+j BÒ6*^a6{<}?ŷ KgpyAeAfC8N]˚}*[(v,! Щ[]K{Gpa:;Lj#i%Jpۆxn+? Ý\}tE0kU1̖e65~4C֌` c;2UEo {4X96V_%lT Tht/\ńㄒj"lJznjJg,a/&t@^ y aѽ[ǸC s )7cG/*jGZ-2~bxzoo,Sfqƛːj@`4)ʯ>+7# ҲEaHBGC[F[f,e82 zEZ\]!mImpđO 0_#4[K \_,]h5Hjj;,iݶDZhijdz9}+/ҸJR^ YYZGiGaYUըﰟ%,—qbyAs3ij'!c GϢ:v1y4wRDe*&񫍟?:g.XsKY<%4pmagg04$0e{ f%8@,2Yjf""iXf:<6NA K9lY8$سQy[f&Q-]U-I{+5N5Mk0+uˏТU3|3/(iRbAK'iI-sYX q#)d Õ.d"8)Š:*3RE-,/Y]%S8ex;BHZjჴ+UUI,'pM533TSQ?r]UnNlgf(rjX [+wIqL4'XnM kd# |li)!\`[)#x!cRd/p DDVveSehBլ)Emp|2$~G/@h(1#XW8JyYL4T7khL~hT42IGWY_!ۺօs^|u/K^Ŝ?,\LeHm&f20Xdfꎄ|Bq.X D!) Yw /TaUPEr"%}_jc(NVx.i!iJG{vb-V%V}j/W,!!+ȩs_oaV{/橫6Q91T]@¿^ rťH?J֒1ߊ=óͰ#%C7l\\c}or%#$s"œ,)g0MQ/3#^$`mA\տBGrTS&D ~S+B+ewF,V!A4a6#k |6˷}  LfJU΅DM ։4KU] Ukh"ATlшia4:pzTsg3 ꭅqеQ[DRwe8wV'SJXʏpK-oWE\< d`^, Gz/o ׷?aWҪq^*)OAӸ/sN~ԴS1׆'3,C.=x(%V©;ӰGH1ήCLɛUD$yrv)1-Ƹ7mqU+FǥFâ b54$ޏyy/UDW^wz{1So\"' /!Ցe$ kj_)+I݄E"Hix'Uj<]/<.~ QAsvy.͈*odںSKcg-MZn:vD eSFQs墜ADldH^sH{>רj&Fk0 r렮ݸ#;hh2c-!DUag+Bm,& 2V05a!l$G. Ale8fBkdv%Uvd nHM, eZwNUppĨh1Z^B`\` -g?CT3BI g%+tE"oީw=l_,+k%ˀ7K9GAEu*ct9kא~.e$NYE %_5P5 `i'P:vnU<ݯܗH=NAߣ6oafDt2gSw)X(UpߑY2̏T1UڠEIۘzT ^l\ G\L 9.6?k~TB±Rv^ϔ h/qDl'}{+^հm|Ts~o/~J4ilt%ɑ$pT}3Q|p/6JURwg{iHxoֱZՔڼ2[<ˁaj^;ה^l㊝.>6;(]Tc'Kg+Cd&ןv=Bjd-̀`_I?Pmd UI:7?i慄a6Rh!֤NœfKNI57P<`"-lYRSvSApg&ϡj3898RxmBPl Ig8žHBȕC^4X8bIjN ^{zuFU@Iӓ%|ցH)1UK9TTTH^Eu{;m#3 RTMU Eʏ (6qG=6 tC$w<!p2${UQ}fǻ{Q@4 H'Y2Y쬈-amqz}}*}x߮_f/|Wh3گ*ZrSg輏љ0mQ$˜uE[Fys<$Y8b2_~۫TB*nƚ98!OLCz6?l/rc,bՒ*fQ\'+GVE&Cl MGq$3/F3 1UeT֐^l79K80V6È!aƘMK$=c ˵0U X?C6'NWEe%]ݾ%YL4̍M!9dQŖF<ںĪ~̏tځ)\}X +]=wC蓢v//Cn+'!/M4\L'J75ʘ0p/>="ǥR!KT8$ qe 0Г(J0#7Lqu;$9wq:uWJDyH‚.r_2N" Gz۰XNOI. G;Wl5鋤hq2*eF}}}mf0:5#-Yݡ,vɅqY_(PZ^LdGl:Pс: &NCvxEQLkgy^UxS9ǢLv<R:&U#7; pmXŞn,ć7< yo8(h.^9lPpQH+ w]Pw(Ѳ %%#ሉR'k:j2Y5}JkwC WSHcVTA¢AApWJ#$tKpŧ޾[Z v B]_QB]%8M$XཹVg٧G1X;"&(M.zާ?u>+`c0dΠ%g%6w a! R"AmmbTJ "FccꪃoljOb1BvNvg`\rygj+?pV&d ,SXŘX,դђɮ=j[Hoi!mą!ѾCĜ.U˩M$|],̣Ia9YpJ$.@R7E:o6*AiM@0CMFB]QSuM5ssN?ܶ)Z&)S*.vvTh>PJ-BWK-=_׳DuT"fD.Yٸދ9͗&Kؒ?{bW)xl< YF:ZFM@QxZ]. d!EႬquH0p4;'qQ;}{ܟ 26gѓY;߫gCY:fxrfC_4Bᯧ$5Z_ ' Ca'':8R*Lh_J0y2V63~cqw{PGe_ eJVP[xHd |Dm(J4 93O1FM,+BTko<(LEFja#~O4+M O">Bm!{YO>,TU8 R 6;L%e :^!(B B)En8bUxGZ1}"| ڗ6B&2JXr03TǛ2f8*LVIt) =|x*EYGRa=R4q8pޥVAn]j*n?x%]v~ >#$Uor,6iVw#<+v*;f֡0fdB[}|T=} 2)fxhժسL[,NJ,6͉!u./Ok[fAs%xhb咜tp "+UL<8QƼa􊚐BJ睕PzGÔ{ڇĕ =Lל|)`LBzXO~_ X<-)j"v,bsx#sXD1ЈTXkpү]EghA&Qq砞k7 ۹ ^ү(vVhY5I[l9^jbo,1։4V"V ҿ i9ޛD1^ֶuR)ey}@0eA~8<)sW{ڛ*^Pu}hÂ>𴂑(m0j"7ƑWw`ś¸E^'f7)e@ؚ<,0/UKj*+,VYҙG(7u.)4Oxth:)##4c,B6hWTԹ,r;)K"UIC8WlAaV[!W´@B ,*w UGVZeJ@G-P I34&)3`GCj+3%cePr.zP$kuǢHyllh7ߝZWh(| -*޻b?Dɋp:2Xר]co `>.r:͟I3sD?_1DʵgpQRjUs+ 2VL3hGKo9L 44Av󘽸g6/W1>d˵bzj*^I&=x}3!Wm 9Zu^XPOPHOWsj"*q; ^i`YrBT+Κl⣪$*쵛X$R;cn.0=m_o"%gEh_@L)M Cy0drV~T_Bm=,uYqب?/]P#OB|dSYU&aCԟbnYea) wJݪ)hlɗIvRR[Zͥ>D~s7j[72A_jLo\/ŧ!#P80vZiG/Nkq C]ؓ9+C2əOi>(̋C($AnLNVdJĭ%FU}+f 4"yˮ-+MJn{?VRRP-m2*kг;\e0:F:I*+# ʃQXSd ;!:SK3B!#5T|*AO)þϨЯ %qB#hR`9I<8IC|E1mWfȶ|5ʥ- f.9,J}xF5͛p5D?-&lMQ˧)xiظ bO~NU a7 [N)12=^p ӍPg )? Խ9@9*pvȿkMbǿ`|_D7* *&/дCR>j8-k;)vbKhAY<b3Mc$`1@|AG>y\^Tᓴ%WM\مPqd0wKS1 r)RkZL~*\~~ aIIί0Qb.h'怟DN Ft,4% Ct mj니U# w8HI'PS}Huߤ?̚XUwL;٣*y| f5Vʄ=\쓷ȁit9h(zR*0Zv%Yud&f[L}דzhq 5SZClv}աh;j`u(m#lY x"|I 58L'uLWmo~Vas ;<؝yy{r{V^Ny{B{bQbG;3Ƌ#`|K0Z,F'ݝO,^/rϗ4 e iք*MWS(=w! E1ӘfK}lY׬ѝ #GXd )CC [Mυp*D2(Z!L pⅼ|/'i<ȾknȀțI"<.jkt癐K|ai2svWvE Mʣ&Y_¹_t(sVzHV2]!TlᶱfVKPڨ>B}ףs/PcDȉ> x5veFӯ0A}}fkrY]gN:&ҫKޮU>N㋿#4Xa eu9^MxlY(~P?1KZ(ePOR|a%OE/ޚyOb]tklbeRﮭiFwxwO4[fbFT~F*#,"9/f[iuwI/2,G9a=% C?#!a(teny2VA2E[Ą)Ro[AZ%XBZ[`Ni i@'insl֫i<@݃7Cő^le5;@TMgcdk"XݽW/2,L, c V޶р!1BKG^Y*ĶYk'j>PKn)#N(_ifMZ WtH٦ ?~:sa( 1줺I!| ژHʉZ.2o!jT }s4C@kȶQ4y{4\Cr:W+^'*<0=MxIN3N=asX?Qo3O.6 IŎ*f*A\8nω=\=pWKt[h@w%wJOL؋υڻ^{_f4 ՞t'yi,p?:'n'?<C0޶rF{ Z]k ځ˺jiaaҡwhXs)VeLƅ!D{8AHZG$EܷXBU=573lbJ :[<A6>Sڔ%xL暏`j@U{^c ^— qKeTpUOg!a'$>HZ-}cƗPOyWp u3ܶPu3WGH{׆'mCn>tzFQ@CgsBFu9Sn}ǰ%QpTQ|͏`Kπ4)än*`aknRxԃOOmj%ppn6>pr Wݸ˵fd2khD T'#+d(d =.LOxY3P$09m7rR{ Qɭ!ˈӬ8RM d9j_܇ԋlB3F s]Qjvq BQV*Dn:9 x#6| xEOnV5|sNtE @ݫ3~+ (D<1[]kepa|TѭǓ;v'!%4D\9B"ïyn%vg5 Bסh5ዲޕKl0V& c5ACQNʫG 4GOQF=r=XҮB9Џw|(|| WUCskfgx'8+JyERMBɶ;Eq+m 8FޮGmSrȺ y̜ggA.EI6`OO_k5KŃENGpQ/#>d}P .a!ѣy/v}LdeY`䵣[PX :-cV2਒aQ<::㹑†EWd(GeCx^a: )|(StOCb!FQU"6c;zNܹhpZT-{=+Sp g23>,t?ugFD4zM®?ʇ6)r ||'o;Nj)OJ#m|<>AB1b%[:rMQksⲐiB'ߑdТH1ឍX,бf"wNL|xv%λQN8kA,s^Kfk˹g%J?fi0RQe$1 o[HI A^2 ɟU2ۨTGt~@maL}Dq󄌤beLήC7|Ƒ8+Mu׍+Ouv!p5'rL&ن@n9#I(GV֍L_>BzŤ"Ȳd2q7*2fxBU 6}SĘOFWe}%]0PvΑ&2g& [\%*` -i*(vL!arfa#8<Yh*]1!?SPzr!| YL4;o7B<"O^.[+FJZ2*g=#DĐVvSϮFfWBÐXa~5T;!SE/*ū.A~Bkwސuc8 ^~_c>ock\`dHA0CD],p@!k jԌH5*@!dk=ozk$fr2RCNvqRW)!a2p<NkAz*:zPj253|CpNedbV Ic%^0 M&ds%L/$z [2E\bF%yTkI]:hH*6KyDGnxtyl 6#)-*sB1 }gc5KÓd&kFxSԇ༻T!BJ"rsCdF d!\%&ңE&4p& .WI0gٟPxڦbx|yuwP)w]E2":A㙔]VĖM*ޏif7ưv8^jRA VL"oﻏoP(tNT婢7‡w&0"jeQ"~UnNWP mEO(ğW0 hhFC-âU!F+8[W vo}ҟ k8B$>EAh^ C!:bUT,sy}*'K0gWXgEU3J<(cbv~SLF>69i'UN4Y 4Sx&*yG=G\>%FP[Az㳫i5'Q{TL"Q@X{< rD" vۅ?;Yv$rЊHTPҴvέMnoq\-8 c7ķ"T?u_*SCd^PE\7\ @A&`N{J9>Y(ђc5TU4J/ 5T_koI96oQS븛oR6<"5a[KKEEф|htoP}cрdsB=UeO? >h8HeT; ٭V}TH!Љt*9r,c]:cAEA(y0Q`x30=.Xy'r Oey):xvGdz\_ (0*ZuNj%q$gqs0ɆxnRuqA 6\!8Ry#Rv|E$Ŏ|qJ^~S;Ġzׂs3+U$T|i9j,p{k5 QD\Y2Tg|[&f:6mzg˫ G"Vtlw[7z]zL )x.6͆5-$YlRڷ2>@[,Rɍbw ~=@wPFkq}~ȋћJnĭq'*c) ҔP9wT=XB{΀Da1' k̘Ԟ7"աxloRxc[ 6xF͐)q}F5bsJKz?3'Z8K~ڍ <,$5ć18SE{*F%tSUwER\f >+re7ܞWQH"?Z)UXyFS[ 0Z M"QMZFe:s'!JsPXbQ5ƺ0EcnK5#NLflD[:ukY05c;Wt ׊vEFCP 3 X܃ۺo.4V}ٲ,܋kQC#ܪ!L@8k.Wa&'u<$f$/O ֟-(7X>@h:{x\!X b]{B**c+zQnP͔5Q5ai N՘e#PWeD\X-Ha3YcR?ɿj<5G=FSFY矌/ZtmMg*R7p:)#L/,gAA?f}ـMwX Tឲ5-  " n\/1J܃k_kr#Sow +g1CL/38tT]ӡ/V凝z$=4zh*{i3uxo.S8e†jj#$b N$R.CS֗zOO(X2"5@1gQpܑNfU&uQGiӞc䜲VZ)A><_sו\Bh{2yO&a o)ZDʢdYUd}./kWf+^>3bɸmh/!RHAVNUq&-b ٖ]yZDISlݹ%8qBׯ#TuQa`;#Axh T c+@*~U|/W0aYɔ_. R (c0`w1y|5)hir;WTzx*_`:q)`4B6 >t (@xL46Բ_v|BZec S].Ɓil@Uzt.h5*~O~l3yìL3*qUndmK"1t=ӎmF1rVVYZjbʸlQTD6YaJ_ee H̶7Y`dǸ*C3&, įrFf0`fg@}&!#or!Vq?Mz !oiܟkn x|3Q"9a6 bp JN{捵ބOD'?x^:{46a?'#_rOL G i0}G_6RFcL 4!lZײQt7Iw}f,A7eWuk`)nv{ioeYn_?eR`-Eꞥ9m[$<#v7"Zz.-Ա|jG8_4C< LBI J۪Ź:ڎ*cә>TP#~?:}-Vn8^=( / ͻ™lkzl6kl4Rd ReqLfbxL%T\>.p Pn}$, ǽS*\(Qq-9 "*:#3~wjg̈AS.\ l83D;AԪ0No.7Ty4+KW77k[j.D_,R5..I5A\UAQ{8ԤYŐ؛4X52B 9[Kmbc*H;-fX{9IZX7sLlvU+*:w/hUO2-_1u~z7_,6o g]8p^a&-1|w[ pvr=j+I=&i(hJI塩VMCpAg5_@ܟ9Go' [x,3 i&{c?6T!ܲ;{r^QR^_McP U>3F?%2ְv܉؝ҷ#_Q70娀&2 `ӆ6>bɌ*mI_Ekc9(9c wg>ܙ$f;_וofzlij!m-Ɖej" )eˏCmxT~ІJP^ltX;k| Qm%r'ÙvA9OeI=(bzғM|ޚG|X~Y!V8;V[rc>ic9G0|/-.;:6Ԫ3 0$uI=#m=t8͞miꊊЎgI1^ Vr.I;UzlL"5QJ#>"`Նnn'KBRd_2,aʢlQEU7Cffᇏ۽֑]XAidi~R"K(YF/q%+eJjc%d֙LUb\ 77N}tY;DD#(0TkV 0[_.[nJj ޓy[B1LJC)'Ew> qIJ% y4]4D'}@`@WDR/;^ v& @人^a FxT#I.<啂%d}Ud~!AY?O( ~8f2I)`Q[C;SסwًZ,AJN;X$WD+#:'m|).cLh_'Dg}?'ȝZ3(9qTî֛mgqP}:S'-:%"W Ed*,.ʌ%C!T_.tth&=¦rm K0 ӫ\V[)޽w???zHeݩǭ#0b9:hlJ@&|Ao䌴zmZ\/S_bQacat@E=97Y@i,Q#\j} ^CuyeEIn?ٽ;Y0 P"9*\'"ِl J]J8i" 0o5{{.y#ɀYZ2RA,r4QtɩܠJ8t'j*ΰɹ,PAKMrt(̞SzG\2}YF*BjBWxD1~Ќ͂sDhk!d-E*J:B}G;F<8$p<]mA+}Mb!G(RF帇w&mc5%s:i>U}o\FDѐA<.2⚖IgQT!aAӘ0)Q:j2T _!׳#QA{J+Gbn#r(į;:0 QBTpGİ`Da‚ 6T<']6>+}8iU-Ӱ؈p}WR5a҅B{wB)03R (h%yJ/V i|~ڵWe@o@޽k\d7 YhׯP6a xNɣ%Nr~Q+LPOفtf' 6bŘ*hRx.hAII5N AM@f g~<4q.+k-.HX,UR@ݏ=?nC. ;WvJ`Ga8GK WA: [ɯI9d,')<`](&sL0dz T^8S~ݛO)~\P-Έ7a 3  AF`*'1dh8תZ(ĉW3!Z,Pŵ* (\XE<ŤZi ^ /̳.qj(w1#9z̦v1}Cz:Kz3! r !Q'Ui'?1N1-ZLHp'AJ)bȥұ4[Q/2AYAA>29k/,dV#<($ZM &i¯2WJHʜGF*݅^UZT\',1 3 (T+lwe@)O1IM"+; 6!G pOqZzhNPc@CK9.&G+ n)N=ϲMݸˋ:pFpa1u' !0TɵSjm'¨F&rtY@tQ:"H̢e[XX2\.3Q{U41t?SA8~?:Sٛ<<~4D3r)jѾ6b^ak+Gqu9)L _vC7`XNVNћn8"&3<Xk֌SxSYFJaV /ЄvoS~oBƆ21Ld.ܮGHׯY\[s Zc/-!V`갌tc~`l&u7y a㵟|Զ䟱[Dr):` %4$02$zԛD aڐ!5Ԉ 2y1Qokټ l7ϮZ&*"cSPb6Vޙd >20)]Ya Q~ *DЂ@MMaZڡ~^_Xhx b<ިugvY򤔅0"UU ^}'-x#m${|.S}6vŀe=D}G d%Dnx#CwxE1%De mC7v߰Xy,X+dh µb*ȅ:<=jR xlC9rHxXƏ m/XC"8I[ײVZ^KwdB``u.̦U)_!ԂR݉T >IeG,I&t )r~,qtsA%eͩ1ǿԫmz]i(\euW B|U)u/0W0C9ؾ]PIHR.4TϕMnߢxH_OJf0.XՎ N>JX(D|CA'%(]qJ󎍓4ϥ(=RaUO*]MBiYi,NxfIS{DEKJ"i-kTIF!.whF:*ud1v 4;h)XؕcgH/Bk! K"Xso XOE.~\)慗+cb󒾼%jXu"WK3QNcG3 K{_,4㲵sAs Zh(f](PE` K! 2肘3oPQE"`z7 6M4g kvs-F.ttr>0Rkcg|TntIڮ ۙBZa/Y-ozuO\JO7 `[N b9Ew`]zq=t^4  |fhngЗcǫx2+P\*?pjͲk##'պGs?TTF+;pb˲qA%+Өei$$ɥ8-IglDt!IC.J S% v&ܜ"]''[ 2~YP/m `maL/\EyڊJf!067)Jw)\1x\{eN[{x-W,仓5:hCt'ўbVN.#F81>H-'m-ud!\Rf' %)i =)"Q03H3 Ht -icNgDlH$eĔnKkRo)- ^+D-+dUӀFA%HСoYEgA {(s9R/)ΟFbn u95S(vHɒ!DǾyR M.W_*7@Q?$7Œ7J)߿ "006Q+@&KDɣ >OKfh<8sno*0*+d$s2!oxd#GZYcR x_^yp}lq{G F_s\}). Kc5Kw1Z%EPAgO\Dl]ڰel{C7XD-̧ o*艒7dA5 6!Ⱥ )B%a.<4^h|`Kb7^7ɵF컟hMQ,%Ԡw u9v,):lťA@BE\1hHS2eF]bFܯ=N"Z*p3z;8hd 6'ũ4IH3_ХL#aje[4y-(x -ZsTڰæ?2F72I# O4c'VJB9A4+]zpD9bisǑukP]H2)}JN V57s624Ă6bM!>#CI;Q ڄ* Q'tp:T︝G rmY>iIm' 6iP\.!?H_(PyG>|Kƥ{7Я4H<-s ɪ$r+qCDž$+ R-.ɇDw|V|w%Fm;$i IB&EQ}'E1R^I6I.q ސKŃ.՗:hzjK ["(k9&m܊:*EϔhW[Ak0{iGr|NNĸx6MkGfy%:P˃i\jǬy4j<.M&O6-iNm{=JofV oyC %6 *vUÙ1BrDp.'2,z o1llBۖ ~ZZ\i NQ51 ŹYTwy=*&,gz%cٖ,'S%7XYy 1Vf *"wߩHD~GJ<WWaZGjMe΁VTr}{T>MVٗ4m}42c[ϮMs3tmXaumuA'L~w3IqbHF%hW=6M#۞^V'a0oCa˹I> K;~~6"/#Mٞ^ZT'adx.ϱmϯM,I ~:ҴeuADNgCܚ g5R>YluݏOk2ܝE%r=ھmO4.9M> p)=ִ<]u٩+{ܷNI0c[e60o>#?Q" .:uq}W9n;8\.>vMwilAP<o9s[eQi].coGRv|'fǫݧܱYM~k~C|^^C@v$2֝+/@(-_6|Ƶ=oZpzmox=\y_~'[>TB)2t‫oޔ~Wj vhXƼ$وXݽTOmybkݳzssyQ] ڳcKбMN(w/ cTLY_`ԝX8G֙MsN?UdON;ZfoFAޞ .`ÓckCf`ۍU8:*XO?y!H{Y;">$rz{gWRtGcՖM_Ob 3e#:CZ#y$֡&5l#j۞u:δW\Μ0w[oq-3Jv{`~6KPKl7PKy.F&angular-1.3.9/docs/js/search-worker.jsmT_O080)BU m`HI;v)w9Vd6|(fNӄD wUwݡsb8K|}4|ު M̳ԆѨʋ<딦Jv: cZSPv3*AX+``}(&h/Vzxg/|C$8=XtZX/|1+S؍(WZ\b̩P<ʷXv!]c]6tAjS8??&vd8f7lE.Wv ^LaMyAW{)j@a7}*p=K[T% ŝ76R`4$S(ԒA'znZ#7k4,=W 0O9J{|z|kca8;qn虒4Pb^ B;a-C_1܇G{[\S:<IB1IGrJW5%R 9y!aPrV ݳPK*u,PKy.F*angular-1.3.9/docs/js/search-worker.min.jsmN0z*z?F#AP()|naS>x]]N_:E8vJ#/nWw0:_,]I_PZsإ~j Pz"yO,emg,V$ujb](AGlR%|QHKcێ%L0LQա핌(6 AMTPKxiyPKy.F.angular-1.3.9/docs/js/search-worker.min.js.mapuVQS9 +}ɶl^%<.qc pήB &0ddӧOOdߊUѷ=*W-6=+|ȌjN:m;_ur1)O'?xnredkŋ|]ugl_{<3^1EФT&d֛.``ņ)/1>=#d>E)_$g|v'PRxIG&,nɊl&h wuSkݟeG*̲O33|~Mnbo\5κpS9_5$1:Y.QMoܧClU }aSn;3AAY+Ky ACBEq#ԡ M?Hj[yK75ڂ]?` @U-*bHiCȌSaIj]aa(̬s,TF.O3D"p0:X\g }#nic#p R)IPAfĆ&[u>D 6g*iڟ^G` 7?Cauq-iXCc8)"}b CuD`$AzЀ2-8}hQ@SFmY2(iQgxኒ=gvŗKiy^ΌxV<,֫b<Oy^z̖$|<ʛKr߽y.rQy|~{$s>_ˇ~̿'gNѻCyYE״ukZ;iEY̋|Uȥ|5pȓ]ΊCm?Ew>?οe(V&yM/0}OyU=aPq,-䪽 -W^pn@o]$Z=̓4;f[[[ړ7٦E[GUݳcdz_.l=݀gYzBi;?eiҮ1BcDayr$PέQU3+Yh3Ԋp9TE8"`ZZp"LXA*Ċ0H&*"Ch"&9=] 2ḼMOvhSI-`xʺ'vTcCwAb98Ԏ`lNXb:8Ď`lYb;8"*VKQ-F-!*kjenT8 mOb7ni{h'o"!: !F<!mj ld InͱuzF~3h[!@35df2Fy< @C`[s^Hfl&3k4 mz!,m$-(GC@VK6CC64@gȊLggȄ@̐ ! +2!9('C@Vd:#C3rP>t66d2! +2 aȊga˯Ae& +M UÞas 0U%h3i_S 1bΥ}ACD+̇ƈ9y 0#|14$h  9p怜/DzFFlq 9Awga̞Wn={+rn2i /A{8r^ҢڗUà:5v@c|Ɠ#'P=b|FFи=H3E Y33. e|AOHϸT- 8xd[ʓ#5KkSByr4VBe)j!htkByr4fmY5(X'G#h֖u^"X'G#h֖֟H1eeBP UNIU*IT$ g=♈Sig:+b&DG,d}6ixn˵7"&x|aʿ"=oizx[ijHGlB-`1܊å5`EѬ[uJT\QF{ +ZUZF,JlTe4V43uU+& =g}4΢>dPi6ZT+T"tv~jtHTʖpׁtz)|c)dޑ,Ttdey[VJ>Jŵހ0d&oUmtxG൥N!^"+ ýj)оJL>DTk++k荷Twe1ޜ ϰ} {EOgp3\ x5]2,@*r #4dLFn&l?4Y6 P/PJo +*yɏ;X9b9KJb+M 0^0x'g4\P1\GO}SX%!fuE$}֟gzs΍4QxYXDZ䣈*`76qS4i*†Fqrhr8Lr(%E[u+ሰOiW[4(X5G|o?Ds>/T$P\U_1[T"g,f={ . "d\Vv)[׽./P8''\\~{N.( ;#Sr%Mˏ[GIr ?j'Z/hwC. :tY$8SdHe6DR,n*k rrțʃupƙzD*X/$9!n*B܏70|x3"PE pATn348sz&%@B}m["ɤ0't@'lydKU ^PsY\`=AOrE\|D 3PaY~QT499+ZhDv-zp,էec֗1ez M:wZQ -\ȨaT+- g,)p"Us)Uu] a`Ї]*8)J()Z!Pb(#Y4Hu2sQL泬dyEEqD 5QZ#62m)㭟ljᎯ' 5>Jx vVZrڴYNȦĞZ%rȉկwJA5lĝ*+Y?bPpV!\ ]yy})J}˲I*agܪa̮8 k h +ĭýxt"GUCz YŚ4Z뢸iOW9x]JNiB ?z)5ncȒ\^ZEA~ :I;iGF PVcpL7jG(܈}F0Z!2\GUq6`& dxS!vpuǰݡʼn,.Q(i/Sf8ީjogK«"FcoXY_#6(7s]nik*j.cm 'a#< w,BvyEv=<賏JϢlw凰))teq6"6nuNQxC!VL:JnPǖn[M25xrV2к9JGJ|Zと0$K^"v""~Q8ąc'oV)4#2Ub&[]%ȻC=1iQ g's.kpԫ1na@՝=ύNBюZ3`pN",^ C).qyE)ڻ_a.-xWd[wRV_uK-XUԞ Dn0˚羮NwR;akTh`o+dnxSo4l6':emwXȻ c1,5QXvj ryǴe[j>h*)b97b<>L`D \ C*EU [8N.-1B;ؚ Lഀnw8Tvh5^vEx0p3wV i<QIDxLFxfr?>obN^4[77$k}sNɶO*vwrN{aMby ta?0^j+.K~'#& '_)+~ j]Z4oqx#}gd;^8ΒDX54{-󩺧_=`}wӌ>ءB-}DPLa[Ӎ}A-;e~xiCg8[,:w֡S=M"#E#"B ɵww=FT(U9"ӛgβnƗ4G BM`ǾAnw  ==5/SCa7Z4F<Ҁ}:8۲4㳶lTujqUOl.HXVPKYRnmPK y.F-angular-1.3.9/docs/partials/api/auto/service/PKy.F1angular-1.3.9/docs/partials/api/auto/service.htmlSr0 1k? 7`q!ʑ!ܕŲxzL6ohJ-X%kR8b2,~R?k̡pW aEgX 3ҨH{ɗ`3k5]=颕DhU{#R_ύTvZM)PEVM9z5M0xgh$"F1}@[0 q-{RPx4r._@n=BQhX}VC˨c=R*vOvPDp T񁜱fi ILg'{jeڱX#3OilgkF!Cxtϗ=/ sJO'm{ZPKAR~PKy.F;angular-1.3.9/docs/partials/api/auto/service/$injector.htmlZmo~b86UdmK"Dž&bEn)n|en${;Jeiмt<z@ٶLZ~'nt{`1y}]5*_Mhf'] -֫0Ckp^wrciԶIk&+R_m&2wV/vLĢr+[|3ZJ뇷?|Z=W=ڮ ]kT_jR[fWRX/P["I?M{a!!ۨڨX`p1fޙ p/܉>+{omR$)lUf'VGMS 5F%a;A7J{Um*(wy#ʌ%&#`u0*\m[Q֮Džn*U;]E|˵Q+WRW^]]y%Os4j{?Z\Ve'*40`7 <$ɟ{W8$Vo Hk~K'}d3gVOFiP$4.h;%|iZ ~/ mPvZk'B7&S+[T)J V*(( VbŹU& m&&%pOkw v2΂ %`ܪ Vmӱk+uW^ٕ"2ؕ5-W/Ⱥ6 #O޼ %c"նaVo24a0÷'7O㒶a7C8K̛߂uX=K.Glg Bŝ>9E yvX*q$#?nY>ݒc"ރƃuhu ħ(@DH$;Ϭ'+\҂Dr =36bn6/ WP`X@Ć*sWB_#*w,H+"ע&DqI ׬ſ\)]UB\ִ *D0( `g^E{8O ^ QۼS2jtj`1iNk"-B fCʠC2Y,#$rl,|0b_H؉rHbfm8 b@/r$A[>M{+lҏ%6| ?=A_d"?' GA#[̃^"}q8g鳟l4l;`%R *+r e W|`}S}WLDtU'0>I0٥iZLcG}bM&dŔTȭ%頭% e Ҥ8/sKR- PrA]!>!iFg$8G@ Fˮ3kaG^ BY D LqqHv:E$̣ ^)(ٸYX,&SP:M>?roWxK:$|P m}"kMNDZovCϾ/'>8WV 03;@4Xm+@ S-e\eZNP@0LCy+C/T0S' "@J盲x$lO|:{$\ #MLdPTD!D')lRr gGa.[YZևc Ѐ=B t1X|PEEݙX,%$VMvtJ=Nvۜ]N},S?tEWBrk8`Kj4"u=۾GelAk_).Qm؛U7 SMG=16SzbVPBc#N[-#$)|NevaDWP,H;[G[P/Fhq`\RCu%r,7]Ej"b-`đKCmV>UGo F@ltfS$>G[֖k.ayQb.c|2U8$_~u 0I z!o|S> )p(.)a*c C#mƥ{=N0ȶC'&?uKx$m tu`qP`%dNX Nk, 2,S _XKhؘNE}l]B:~;KFh ^\; 0 Vl1 4ƮvJt&Ñ-N<#uLN*{Xټ]AXYIl5Ӵ@zR0g~Ys4@Nn˴"#/)+`GǗF@Hb5d=FacsP_3t^hAӨwIUC7K;anvMף"]ARc>nz'cI?ZzѾ8+'D꘥1N壃QA9Kp OV7ױ{>grͩaI|`N]]J:x4Ƒ)'jI._d =hy:ߟѠ~NxTZ̖b"-#$L:gYӸȧPKuP C.PKy.F:angular-1.3.9/docs/partials/api/auto/service/$provide.html[ms_qC9ܒ@KOd&i2IN?đD ^$>v_$Kҗ<۴~u~3,eMj=Yk㟺E\_]&IQ}?l}ek&峦ܿۏ>]e[,<.wr9|_z[Y׽y^lE?Aܢ߬imB])uՌ$Wl27ET/IF3}(Y*K,gmDݮz;+B?bl=2rߚYUQ|3Ii˛j=Im%Vֻ*{YYtz&" IfUPzgk2Zw扼?O2,g^\S|F$#433%*Mb AMֹUv{+;[5-?M]kDI-0]ֱ:v4[ ՒT xVv󹫫ljƇMIJ5< A@q\FcuaZD2湀Bg4Hz7~YvYPV=rOD $KxAXb2} ń7%Qt^A@$K9rB'Od%(5)e; SMRu?qܝdRL^ =IrU3Y(bz Za=u5 JƳa>fEMo>Pb *Y#X&fID#A|VIjQ!um l۔X`;`xid4+Z|IP=OrC`:˲pEfbnxyS vwU7/P( ȱHx;#N `.vj vsYdXBcC&b#4 jY&ek$u/kH7-[#vfZ𖲬J5MA5y!uWaK :p򬬩HONA6ANy'ܾQL>%N:R@:,C Ѭ f6P(zS;uKTMQIEXufAF6AF"D"Hpl3,*`r|opBgbX^e$Ħ(s:6VZŇՆ9 }p6fUWrbH S ߧf-U'|Ѽ'Eڂ>w3@`[T6C? U :d"NW<?yأ莎>uS9ƓtZSuIr&}-|m ]PX73MAn]c1؋ݟ bB ].$CEAG{W~f;eO,orM ͦ0w&7 C}E%1WC~yx(^Kθ&%DM2LK5xTqyJB Ucspυ1Bb#Z.աp8EdxIX?L["5 Gᶨ m%>m,E*Ln\PQO ?l5=PNF;){.F%iD3?E3rJ7dq cP<3qޖ{)?L͒aDQĢӈN!GW4ڙF P-AV) ^$ kL(;dx.WļsX$1omTF8D枿$0c7*CgS5e3HZK>I@*ܖ WxA!9)`Ip$ O)dGy㑟AS_@PV+4 >}뎕[ˑ!^F(,A}(θLQ[d!_4F00{eB½"6 6CWRQm+ \;eQ]oq$C7a` `Y=X-$iҌ*آ'sI #}ɇ &dnv#=mebɖ y\^vM$'ڶsS;mMh D-3K$p}Cczz\9ei e0>(YOKUqmȚ1iaٙUtB0@sV"ˆ)3Fon:{#5F|sEM˧$pcbMn×C2v\p2 0Je鿤[K)Ȩ툪K90>캢$]Qpve|:G=PKHJA 9wkji$RKAI!ݬ% :u$NH7eTx>T(8үq&7E ҏx4h;e1oS~]6 }l'o6Iq@7%G{f(I^`B('X8̀? UjگIj7 B/Qgmc@Q+-hCۺdr[>V4ԏc)_h,`,s6\sPKzQ( 7PK y.F#angular-1.3.9/docs/partials/api/ng/PKy.F'angular-1.3.9/docs/partials/api/ng.html}sFU3rDdv&qt˱ˍnmJA$$"& -k<)A̦*6>}AW/\Wa5$_ĿA1*7ob8xMOϋFհޟ峻.ӂjpLE?pW/E8rr/. 'q9fY:Ԡ~7;_>Gϼl9.q5|0ȏzރ^=Vhv``=ׯY9jov~8&-}=o`~t2.2~Te٨8Wev1.fY>=|Re x^e1g,Y9.rV3"lY ̫7uvV-;_Vj6ԇe~:)bR]&e<gM1NEzT]̲,+XX)E=8ˇjQAvVNłQ(ƛflYrv 7y9O_@Y̱h`~{0*d ?½A(;z0-jR4=Q L?Gj:iAD(}IGo;Phz9+C{nCf o7x0Xן>2WNWD7ar0;A ֋0GCGMRŰ<+!z:HluQQG?ŎFͺ|j tM%$0;{*Y^9-0j6,l4cMKϱL0Ld5aC0a!ѣ5-2!b_:x`Z wiAowM>Y pKEέQty3DbRL~+>:|tгƷ¨xk,b yz4Nώ/Eysv[ee+9z15D4ĚDʰiB\QfVsB1[M!IAv-СDxlb~(vfSe9soz=; |/ IܖLff"QUQ1 yc:A9dy"|M wըus/^|I{Q-/+62UӨjpj̐ED̀yԟPqgG4yCF$ XPT3Ų8DWZ l5qbd99X^l*GFQNOQ|~X4CH tEvY|oO|IB׿&4kwEZrh Qpɭȷr$nyـ?>5 r@K,zAͬr #Qi?Q*\ YXIϐ*\sG뤬_sxq#0x_kWO>npTα[٤|9r^Tg8'=[M&VJON /P/a(*΢%Gx }ߎ ݌>?H >XO{c}vavmg# {(:lzk+nM0fۃ>r^v;'n '}|,}48gU,.Oä5]<"ڡLpy2G}2iю޳Y*e;^G.ht/62)X(}3$́uW"(XL%X`/%˯|+ܥxAjQ[AvXlhX'r˟)|h{$>ͰmcGgY}[WȎ+"y6_-ɳo_8/qD^?{晸K4 W0_~9.zF] \7nrG`tkHniU-Y2ӣQPK 4aYHV яj?lfށq+-&|{};Q]yW' LmHO& TrR@odcML.̪HPE9CjI'@0)+cȍއ Y@-*6AT %RZTO;J}LGB@FhCw}ú{l?x nVwX<[f J [ U͆]ݴP58TB})w854l~I1I"QZV-Y oc'| /Cs 6t@Ƶ`bmY"PꉛKYWf^`N&Bv>vjt%>VȷqN?.wl g}w"y5Ruꫫ3Eކ~5ΏC?[EskbC~?]TQ11@ /bY$"CїOzvvՍƯ$u07cK $6H O\UֳO[$A6C(םHD-sEm霧D6 _"$ 7q$&17h?gیgOda5N|e[i_NʆzݫW=d^ ɶ)/b%Rk~Jaҿ#(0=缚cg2P|kD 6/{z"gyadb3Q6~-h߂1]EcGxd&Q27|l`nЕO kQM&par t};M7ߙNImH)5韈Tm6ΤJ~ Tx8F K\w&Q,EIS'"o,,_l* ABFt{ - KݨG}m{IwW]൳xכ^B)CH- 6 Mm.5,:q}Kƙ{zxpqEE|V#ӚI{Ѷ)ác#OF 9`Is)ho^7cg%Z=9B㟌WbKlA.<Zސ3> fHP/(4UX d0\]F&r\aZk01sl-wVhPlf %(K ]dkÆ6;m\`t uy ?"ʉK9( Ia;`{fIgVsmKsY{lc K[}l ]'톢aGf}vސva3fK<$_|c5WFA YV΋G:'qp m^PZЋtoC"֝E^1ÁFO[K8_(nF" vnn:z.~Wx9pufN HsjZ77Iw|EFPHj/[Y}Iz/}obԗm=+1*o)|Dk yOB@퀲,#-Э*)rD<}MCB k=GP`r䱡p}{b8pT |Oc!y} Gd ^@ _p-`oUδQu$%A~sa QɗYqv$A`}v.v <:p:,+?`VkJKvsqK*.);wK2!גFp2{T%;oZ'LD@qOZB؋U'NwCN&0(gwDf2MY\ȵ38V, ^=jq+ʏI2ebՖ;{UT4iNO+lp,rd< K˥:tv0;W.n$ Iq4 Yk6 IޥC6Qr%B>>XߚQqRQ\6P5I)(|u#yBZL^q~v84_VlBUvjlW&N~;v$5Pa#G)`>I*( V7=V[qDa"ێhʷV=2X؎9HgW>^NU]u1)W6C֏w7,\㵋Fîde^?fp=ZopT=`gc[>Zu42";3إm<.> #=0Ϻ´}j$XzʆiOhr~S=j+,Tjd5ϰd\77cU wsd+bӦ D4..Jj %LÀ{koz`0/o_{fy#pI.hI-vjpy8"e .{E8ةvw&{V#n}"&l똧jǭמp}ǮOHg9tp𪤧TeR"!69$+%:Kؙo-g~e6$Vse#a6"G\!6%GX`n}RWZ/(c]>lBlh $HjLnZWr4i(|ֆyC|ӎbE|/[ń"s? ¾oz-*L“jѕGڃøho$JZR[ZggޗV}zj#T9D!$#'T-"ew0By,g2UN?vC57Z@ *…^T3h(Ruۉ6__kדb$f٥XT/fǽ$4.]R*vFf5/6%Odo(lFAcK&F0ۃl(6L2)5#H$OO0^00n:WSc" b5{>M- \?oZP P [ϧ-gI|m( \Z'Yo2+ FU\9-h4RY,ą)õB&כpe(۪ 'r:Bjx@.[k2P~v~r( C({ĬŹյdj<<*]&8-2cR%'%R6[tO)ٗm믇 z]lhTZ](>_;+(?o xx r~6wz^B4MO9@Dn,~mV4W3xJ6WiQ5LzO-p*w(0 A@XZTwd΢UJ{(CYӨtz ogsxol#Ubl){JptXGJՉş= ģix~lEl~,Q9##&?8HW&PI>qlnmZ1;V /S|0cyʷi(@Z,QN&y@P猬T?XR֮SXeQ[jR[eLe؎1l0UrXV͘"mIڦ|IVa$nW}[(^ZQ@i?p: \)t"!Vti^qF{LJ Mr? Un:a x";:ͣhL@3p잳,󨸵dOQw$j_)߿nQqopVTJ 皇3|hy5 ) 5YKdԦiviMxUbIX50VOV' ;1ͽ@]S 0:F7x`E Ef2M;5gi`)i`TaG n߽҆;,랶1~g]' T 0Do-xm^A+y؉ x7Z|͉+ݐy'W5թ6'!C 8A*I 9NfY,Ö"F7:z u?|,Y <|;aEԝW5ۼɬ74X#(V4{}?}kmT8م:[9 k<,rYjm˥K0QA2a.{+,`Q *pp| #3B?# pl[U{NΝL losԆU^: (}v#`!5h+pѥ(oG rRQu@%bY|:z=bD"?bp7 esOg2aRH*ex4BmD.AL)޲<\$XW0߀=ոZa-8sN˱=:,I^2)"lB+IALDd>ВRnnLtޅAhI'p1suquSYu/FXCE)W_:*u^{A~T xRizuآ'iqBl`m &YZ;gw^9onbmu*,3m:6O/Z'˧.ߚI7M]1_k @ /\G`V=LƑ8^Nig'=s2O6R!P ,"uF %ΚT)L+b =Hk{|s txGhm2[hvD'd`מrIS=qqU^&0;BrhM'oy,pW̿5EiD.;*q(Z|tL{ Sfy N{hC$D;v00Av+,^!Mz Wu% ٳ1jvA4+q8ھn'*Ҥ; .A((jE2,47q,j2R~k$Gk/DRksGPNDN;h<}¯ Ov*q gI]SSb_GXS  &NnB46T&Ɠ 1YYRƟC0eѓ;ʆtb$oX6 e]mՆ>6-DB;:&ԁ:L5j}6zh ƱAOi"6^ptԩqpھ$*ǘW)$ [ᨖdskͺoPS΃{ On;Z(ߺFi6ڗB-Y鉟3xaT!̌C:;al^ ^Cc&}'NNMqcPNթrE9'c<XoL9AGh%|FJ MOyxz9Rk(%=S g`\aN/Xso‡#i㪂 %QI4޶v5۴2>' |bzҌfz!nyF3e;3zcg,r. #D !͉iңTʸL.;)g&4!wB Z Jic#dMc61{Ѭ>e LauB1X_HEZAk?ACE0ͫ[%Zh$Χs݈ؔgqZ/dQ(JDXSwaUHL6b@;Zji K' };&2O08mOH,'!b[D_t«MAҋĕaxK(+-[kS( r/^bIJ6ыJ}QVtmm@Q!ʗ",zOON^joJXUKȍN'jC;={bz!3姏%n]9P|]U4X =~vG_ Vi$ᮓ hJapi>8`FxzЊ9T@&nzP+#)D "A0N-C"TH;;ӈsG.ŦbObZP[3n lbJ#Lڵ8ώEg*W;ܭh0߷ tIGe'Z-n]NlY}X;@em0ļ?F~ZT. m@eos&e@TMͦh)`ETĄݔ=hC0|uJaKe; ѱedԪ\nYվO'r\ bQ";x1V4^r/߭mjlI8B?ͶRlBZhWa =<շ۲P{B#taQ <6`B /xfDSʰa_ؒCq] YOзI5̵ϣX{'j6IF;jh Fִe<~ÄbB(ZZk"Dj 盓s;`!Ut%֕OD]ɢ w1]'NXj-QM£l 3df AJz8G? t_ewF57,tI$nĵӻ/v~-;%b4AZX/6a6w?|Z['VhF[cUa"EVLiÓB$`l0ݏٌJsM`4v@avI_OLh,Du&txoKP9FG` J@x\SG j ՋN6ŘBCH*kje/r m^2,{M hDbŴT = /hxf(-H'͊pjdãͪ2V=! lŴ@뮓5uIt9#Ժ&$k,C>]3^1U%po8-g{@Iy][&Jm< +ĕW%*=,?s0ƫh酾dG09]_KҲEǨ{GLʐǹFvo'DZ>NVfI)@б|+Z/0撛ӹ{b6֮r^ 6$-=8M,UJ* ɋ7#NE)UmP${XWdObO'LΡv!V ,.͆)upD?$j7<5hf7y2p E7\?rX8 Fp^܂[EU=H|R{{Y+t qrdS+ʒc ejHJ]09>L@i| }$`~JA@PS,ƎѣmB8 =R+7uj|=j/$^V 8@: 7L*즓4iJze{Y:JGڵ~+0.IldAuߒ+=I\EtNiؼg&eRi,v i]t`թ0T"I!h7F8Q#zCo~5+mp Z>?J$ۿG;k~gwû @ oz|˞THu) 1Rծy1_ƎAu"K1`|vHu1:U7/TVD_Aa.{ 6Mfu椝y|ЄelprpBGCǃhvct@^[ϵ*.&;ŵ0‡dl !Y2¤:RQ,;Jc&`QIáK[QUziN* N3@Mա'L'bQ__|ɱf9c񮧠NO!byiA){?^ u,C:OO+";/&I\KsDx>xs=(_Z+vЍb5l<\t",JFC_ 3wTVaoݾOc\a8#)Epp< URȍ{AZ5 "t +8>ƬbZVV]li.~ p!BN^|PK8@2PK y.F-angular-1.3.9/docs/partials/api/ng/directive/PKy.F1angular-1.3.9/docs/partials/api/ng/directive.html\koɕ޿ 6 6c ,cHNAHvC2[ʔ5Zrpb7Y]u_i&q&.eMӸH,_NtNęo'N敳Iq"c8j<:>q4OO{*7kvf5*-9G\w˪\7ԚU2ieytjg-.gٻڙf֦{49ȗ36ɼ([L667eϗƖeƖOuuQtXc1.sk_XȠ X:1ٔX36l;[LKgN,'uay6/gST~qլᏍ]֓i9NP$"6kܭM @yn l60Bm 0 |ݮ\cJm8ȭfMّ;Ne`.u[,\֫ `ƭ=ܦY-46Kq斜mʤ]m*r_C?ro51+Ld*U% yoffwyH*6aD,f^נY^Zu#Wi+lw0j,|m髋FxIx [ЗUL:cdRYsZWϵI>kۢ6U\5߈:oIbA5,b-$l5}ۦm=E:M\ISIpE$/C5N:d/Z!؋ˑdz'L*,Ba*>Z-45ꔠ& *4g+G( 094~8"K X7j!3e6_:hMb J~϶hqQ:vY ~!4K &~dI?aR>?=ʄrx=Z|yr_W?2ub|u@9(lrlA Z3q evSuT{e41O^Z mk<9 i1!~? Y&Ou? \khϲ4#m@uDX+ zb.:TTmFO#e b i醅$|4I gpv'˪@q#;s.~e୮%I!G 4X`R4F3n&/Lh6'&B,|Y/QbA(ȌIlcOӯِ7|5%0Qn-%U 0DFn!N*=h$avL>ćp7% ob@;e. [˗H;ہ\3Ȉ"ǑBD6U&~@Rk?S= 7 4I qX5ٙ-r_QD Y>]m`db ) 69S&i?JBJ @AX^sP G@& ̋M(6iϝ$:p;8XȰN\$u U7D Kԗy%;[*X-MB] 5{5Ix"R1V0z8T2/4̍0 H&q<XŀڢEHYV~ڻ|P L$zg ,2ŒkTR*>9 h?ERBInX ,djdPGUGOB*չh7o.޼~jSH˷_y<|/Yw9fR͑DyEFS'BJ V[X[DӺ汨 ̆XmYi nV5ޥ2en4ѬN @f&Wm.ESfsxMx]SṿM3&F.*r0|ky6MVf]$mЅC ?K b&| 7:G=Iz*xEYx]k{uF; $M -gei] .L4jn*f[s78/1WX]B>+ȶ\J*:'nW)L"#.L] ; 5i5(tɢ܃ذ oA"ISêցL|t{QpεveV\,#ӇTSTeW/NQ>1R6p|7p p0b1YKQMy'[8~bֈ6FXOX!4B=؛"E\m&.<A=8BޢD MTe71"  VHy,XVpL @[dS>BSW@_-gsi{j4eto3&'$>줨SO/¡]=y-Om<%P5`wdPW\gri!zk->XL)KdwSbQwS\p6Ig$~uO jDAfܻM8i9Z0P[.%pH8ˁ\'ovsჂ 52U <}Ph%>0+wV>(ͣaÇ& 0a9T{x8TXyvNWvk#qW $C3*^pU =jtV=? <~>64np-4F@!A[ޅ}fm54"ez&VpeU_Tyچ-+tXCC á܃66k)kZY7]cS`hu"Fx8=HWF.$;/_d<@Є3@9T *#RirQ%hUwD2p\nD h!i#Db~嫴];I$nc5쇀 ԰d`.dr$elUYүzV 9TTP- $J5ABt#OT $$P±~xFjc, `Yi]t)Jv]$ aτo:1ީ |n v#hPDTcJw~á(L8|C|JOh-q:6+kmsPG;_qǾzÄhe^Bw mI> ߺ45t5Ihڜݚ=DdA]<(u`Ɠ+25)fEtHL>`)*dl*75)@  ZP E,6+k]̚&]3_"[? ~J,L+>?^9{4:+5I^V!vHne"ҷ^u}D>2 `9:)Pi"]HǙlqPD )I8 GP}|TEd82EӡB9Ry xt{đ2v[hI(gHآi*1fPV]h;P/O]pOcWk"5p%7"s-PʝOɣ>6ZpL[U)J9:WGv:r 4P[ !12=b|.C/=:0y"N?z4;PTDQ-i%I.ڄ6ƫ)SV6q{)~]7nY$j9{Mh@N"FTRe-bEW7CAANxĜ GOyF:!1u 1UZ%((X6/u*&~)XЬ"{LqV~Bh迄#SXA`u6P!++v} !$#n.  Jş>VR%µõ!\%`[t3J:t b@hv?!nWzyWր!^ Z^R(,7)^R3,2|:^|";*~l믓.'1M(؀!c{SP= .Ӂ ɶ^sp&\.ŃL ;AhRҸ n Cht+٘\=lg~AYNlSo_aI:3ڧt$:W gMЂA"n/p#x#zo Y;Rq5}w S7|3O?HDH3GF zU}VvRE^(Q{/@@:PR{B"OgJ|`t"ӂ?ɗ{B~+kᗶv*yD),=s{+FKs [uBoWo=a8ف^C) j.*'B#ލ^X&,n$ h]^7!Ed < 98ijAW2 YuX]IONҭkѻf#0C1cB Hwe6` ɸWgWWbSQkL}v`!DPKuCOPKy.F3angular-1.3.9/docs/partials/api/ng/directive/a.htmlT]o }ϯrդfӴOkORi{;8mw'Mn,%`|s: [ZqS 3>0V?ſSTzjP Qҩ v2w3K5r×{6Rw%+*"l2)X[="-^nGnatDYj6RAJuS$5AfhScqGP,Tf٠ g#V' HQ26wp *hd"pC@ O3!ǀ1{U,hluz2~!O TEF"Q+XB,ƙ1$bڣ1㺥 ҿvsuXMbs4aahK{TR>/.60> e"t#h:Ln< [C_'F ǝifyxc.ӕn1)fUWk?'l<gUYMݍ)ZĆ+Zo7g6]kTTfZ*mP\9fMſxPC%nzF]]ޮ:#Nks6C -%fk+itka1)xNOmi)q#!7צ*j Ѵ<c-?FFm\Fe!;kiܵ)1tMٴTI*3o̦t.( )Қw81m!צRXv7 l[֨G& jk\ͪM/*/i ݬH<ߒFDݨ8Uj,B zG1 bx1m!ڦ]Q徳[llD8V2)cLK.Xx#Yld *HL 7 ANf * gH F-?V%EecCQz+jQbiG?ı)9$+j vJ"{m[#/iKEh4-;԰V"pKa*# d@tt%QfN+5)Mn4<@QMeUVTaW+(U@ZURu`"URm.ڏ\s29( ,>MQKI t$@qwDRcC@Q| ;RCKwcu!nR̼tAD%OZN~Mdև8B`K@G'tRggZ59OdXyrAg5e5V`$!ڀKv>+ 3,&#അ)5GLչR|os?+Hrst)0(p]ttSz8) i,/u6t+*St~Y #F3y/^Č-)6xș]qA5P[DcYFwĎx֢Nv9r:fM[FI̭l)tNZL={]%TkQ(*ý wVP=l0 @AŢAtbHo);.Sn⪝ظ1 ԑr+"v-y~f:zJ!BǮ˒a_ [:HaS>)A,]/.*״:4 fKQy+Jt|Hnq{d/LF/9bj ׏:PJ=4]W!5S_UZ)ʨ,aH"~bMݝ;'؍Ť/Sn{A8M@DVb{K+d:Df2 umvKK:Hu,M_a_\F^s7-$(*Jm7?q} RRlc!yA%c`W*:h:E_h)p];u`HCúѸQߜM6;n{ j\>|Ao^q7z`Ѽ}Sfmp3󥫝OC!f(7y4Iz[ <'9`L(\ZXϳ@6`1v`DdZJs~,*?Ifoč)-b BCB+,zyq=A#gS<%{;qkLԶxbJU;% d/ rQV~ 4P?rxGl^? tZZv ޙ=Mdm+'RWO:I˹|a=҈j[V\YĖaU-:&U Af!JrgH견IQ@#Z"1 ّNqNJe-J=G*x)K.kՠ4ž/e>z[f{)jx"{JN7J?&>@9B?#-d9t/>qAgCd:o$Y{H_$d寒94= GI#$&P&7ҠS`jg+c@]@6 إamptp?F=WJb7YѐyLy#i6}sf(YUٮù9՗bjhjmY]$Di=G,Τ ?URmY|/ʌ|ڨs輬-v}JNeZc=O=T.1ge.4\EB mN4ˣA_}I,zTEdopY?уWS]ŨL{VWQRGJuEFOv!v[Q";}IOL ̑ϊTVzizvިIo'3>Sd;T#[%rIQ++*JBfܝiGhTG\̊ΔByWoO8:O~RdhrL|NJ h/|5. ʭXSdT墮T*l1Qv ^^ X>)R_ B[AʬHP)X|zన*p*d4Q"ˊJde t,%ĝUPv`ʹ. Qd*ChTq?)63et%MJqЇ|2ꢟ7W,XIքbc>:{L|yyk]g!3џ`ԯ5n_[7t|b7-;Ji2\q"t'`Ob nXjLYdǩ"#b j"?๙*зl(\MU4t '[åoMJ#g).s/#D3zt 1<d + lQ{2 X 9hQ= 7B/ϫJOrnZ@lxq.K BjEce B'k0S4'ﭿ&3E)Lh; 珂xX)8B C6%;y"Tiy=*TgZf籠Ք(#9Q@y FO@Ľ!n6RK JRj`l"QP+2MUe$,De]_Sp{%-Wǻ--ғkF.\Ck<@"cwHbiGJ~Fh8Brxq{[[f[8 !u/" ~M.?%b E!Y }W2U"0v``Hs'ҝ̓3D& ί;YDl-,zƾ\=T(7;pN/K ~ ͒'2j@48QGr=@nX3{BȽ4!`%v5TEPU\ЫJnE=01m@ɃJyѧ 8's|䏢F̰24EGWEnOHhB 'Xh7Ls ;e6{~7z¢k^嗁s}ԹT-⩝eႌJ?OڳanQ KK=AlyP>>|tkxyT|xN:7Wsp٭q+:v' n2&%.g"BI*a痹- x޸!%EZ۠;(ҊetH4͖?]V!~&J<eU 9Y1#h+-Z _Y[J7n+k+H<f<]?qr01xhpy yݟ $[@[9-%V`(yo_n]b+`^'70, x}0~'~/~ Yx0.ڈ$wAMS])ȶm{t.¯*-Mx@X-K dKO| B_! ۇwNGo[kmn-g;bvBCb+蹆[qqʸ~vDuW ^j7 >s*\lGL4zIl .Mr&\ƹ©a yo ];CֺѷXPt+F8|EֹhѪY \w7p+?ה!ulM-єRy/ۄŞy|IsFPP.8} 1߷FӜQ9mja%u8n$a^*`nRY,7j7Mʗ0ku(^|9VQu'&FTl'ܐ[ݕ TA~EQm0IEEݞ~.%l~_PKa& )PKy.F7angular-1.3.9/docs/partials/api/ng/directive/ngApp.htmlYsJ'zLD]GfԪӨN&΀w xwX~=HI;`wǷˆlʞ'JEfzr(nsMD.xz:Kɒ ?Z kJrكruQU^|~<63r!0 -oϾg2FL[%TFSWjS2%kGl<+z&r~i],M|6\!_mmxK)n'&Fzw#ƞ?^Od_@qGai!x.L$R2n,W;4)Xckduc+'JښZTn2$ ˥Y-o%[QœCċ6G+įNسߓ?\<$7WwVך؃.Wszкo^IxxɂY UdƉꔽ- us5FAJ^ H0aB(뎏^I=`3kS DJܧ4 *xT,)K8N=U^|^VmcQUcWv&4^\.`Դl Vʯ~ 7c4]퍖]{v+"IZ.:OCP㨧U4Fղ>Z⌭ $fS y׼lAvB"!%eSuFvxwB΅ x>}XT^R`f%!L`r~l%21v3H2jJlUu ӡw=M\BQLi&:RGJ072g qAE_/cMn*f7eWQ9Cby0NpLrQ2e&Hv8$:SFl\L]DOw|MֻJ2ǮCu 0Fс?FQN *d~}0m5/kl-/>, a"ؑiۧ H#qː~ l|g%-iTR gj!\jksȟ$<^c" !"`?PrIhzQ ` 8$lq7K֐$Lx<d[M"uEOqdDVFIi6HolFׯ[);(=;~+y=3A>78%`Kp@wOh/pU%甆{a9~GWܚS=b1W|f3!4O94t-Ŀ?A%y-ɥ)D?6Ή:f#ͤgHv 6Hw?Dv AFf !%},BkAuŔ0<E*4 DDa t6F! Džpa>&PǑOr =bu޹NxZ哂J~1HQ1@5"@.u 4 ByxɥB )^=bGLQᠣ6@0mmbGr`Nu?p/fOwdY55"rP\ NPJ!SfPJRߤ`;?#I6x} SڨvJ4ZILiS-wx>Pc^"^Uj08M "b=?{8Ll9ģ%o_|v]SYxK+x;1B`ߙ ,=uWUtkQF)"\fv%uZgjv@ \Օcݵ,2\aB(|Gk^FAy<'q/Ȇ][R/u ٲQ hV+[j9\հ,5}WV{GLa9Hû=(FRi S(OPKT PKy.F8angular-1.3.9/docs/partials/api/ng/directive/ngBind.htmlX[ۺ~*=k ,C='hZHڢ(-w ߐhQYQ$>(s||ӯZe|\Vykee^ָtNl6.z󪖮j-L #BR8nȝ؂9-i+5n{!_"՚((-~w?]b l{~(bWX ^p> PJ XN~mC=@N$A܏i ϥ!iFz(høZLpzlC)]9 D7c# 5'[J=1fX8Kt@lbİ5oB{TEE8E mh'ƥV0_Pb Gp!p.W\[K6z%SPV*3l?뾽I7Q7>()(,M(gSe FM646o[G Ucm{q0Ze97SGOis俛:z3MQT?]67CT)p$S>&kR5}Sу|CaX81uLpda"u/_wH X;MdtL8/JAWwV=j/?C_7+_3z$:~Ykf5© haG:a<4Zͼ0-{S3/SU"ۡe j ɀԘjmVKTk:4)cQ<+vg+48hzI;}Z^)XTC-U߿B1w3Ɔq,L@LÑ.H+|gR BӼ-?E੷zјҎ3x y )A9Gj@c7)=B\!8Cz{\۟>]a[Ti܍?yI.'AFƀjO *>ǭ8[-l8Qb͍g=;| jP(lrM37-rFO|Gpbkp ]o&!$.v+PHh$ɈUt`nVhq%nM 8FZ N>)z=̓h+<ј3?{4Ӌ(m۫Hno&svxbJc33tBק7@ ߜA@ GN PMFU,[ K?ы\RS{kFZ!ۡ}H~0w)(rR$ʑEA1 }PK. PKy.F@angular-1.3.9/docs/partials/api/ng/directive/ngBindTemplate.htmlWmo6_qS*)/@&v `]aZb,.k/I/M@"">w14W6"MgV4).Ua~zd~~vRrSh18\V㣨<$ɳ?C!1c1oZ`jk-LLuLJ~(?R_{,0VY~o՜{:+ YphZ)c-fڞaQjz۪>:A(8+|.SwBؿr::}z[(Y/KSYma[͡f0C/%5UJ]p"F|#K,U2Gq>XB+S+B nPB?\9/`*4G/Vn%Q Hԝ!9h7ìi-Oj)wWg#?a V;\J+rP:|e1I`Bi25%jD:7j`hڢf`r=y.N7$K jf;% Vgۮ u}P g.- X%/З0XVv/<g(QK.?ѣ?mKt߄;"=G1sjF>G^%@=XXN%㣿[e/hVN)m!n?uFyy83TQRa*TvSD,jŽӂxPKL⦵16y7+=ꞔ[«"J-UB^b{=8Q.55]'B8şr;=6 wmIfNP( \K!!]f$L{[_^?`wvm^ⴆmogczȵk#e 2qw.b6}[[9_'Q|:o{PK+C PKy.F8angular-1.3.9/docs/partials/api/ng/directive/ngBlur.htmlVr6 }߯ȉ/3K_jumI̕TIj/@JڸvgJppp9ܝt! FVn\4/QAl/b'iEAm~٢ y:][S~GwEvjdRw 8雋D[9|pnRj:z?t+gYul~-ަX:֥Պ>c 8Z rOèuTۅ/Z|O2;ņ{5Uv(t3CrPD(yzU|D)اԛs:C]9ˋ[,?Gn,~L7^9!oj L$S#.=sNH8nM纺wȒ5Xџ<)^#Tn.gA6 K*toɾdH|'=`J6Y1ߙam}=K6Vut\T0l_5I-S$CU{Y,C$jGՠ8g՛ezi`Y 8}1Q;H;?x%OC.Y\/6weqY=bw^\wgw4MdĹ~y_Z %\6_PKFE PKy.F:angular-1.3.9/docs/partials/api/ng/directive/ngChange.htmlX[o6~ 4mb#)Nd-Ntv_>-qC*EyRĝE@b}*Vlחs.qU˹nFm3䢖.]gc>*M^K+*'w~lFtbx#ֵeY ֏JV6{nЂ6ט.Ьo&൰Kl)$%Jj_/J$et\מ̨3dcF+Ne x%~R6u`/ qxȉȍ*l2YK RNW#wBBW3[[>'X'8;Q%ÚɮjZ_!{nj&@%[|maS홃hw^53[ƃl9#WXG%Nx[c;&53yYAWY__-Eejqoxbo6˟!^PVq@oXp!Jiu9Q3xF*P>,b@w^[OK.ีd7=¡"g z %`-_ACa7X57>PVtx@ s(Jg A+SLɈ}%)_D*FEPpwak [R\(wxs}uǘnRrѸ^Ȳ#YNtp4y)"u1`@. [Nߖ?fTno @VBXHHDl ,yMNJ!ΊVQSX~{TD܆;{6'HXP!eN׋y ;I"o h*޴Jzj$U)}9 jFY|OQ /,bFGg~x!zD' "!BE!0^]^{BjssϨNU׎@VzؘG*wxjVZFAU8EĨ7/y]+h c^}xXvj\@|"'K:ƾL;Rp;KBWr^n`Ry>s7 1̾ x N7|NB eu&gtzhͨ::3dP&k|= sB%3`QIsjݿN]jhEL4{f=_JmS{g=  L4$Ԝ?}&)Ys|FXWZ|RˌίbƠpp@Ll^̙tyL~B:k{ 9!okQqjE2Mz0Z҆Y:MX4"YfRxE[23W UK6>B *l!LmKCKCfw,NP%)38XPdSкY)Ź ~zYT]<:PlQ^>.gWcG)5JQXJ2(XA8(ς=B# DEc+2fԸ@guo[)8 aȄ Uȴs,r4',+PLrdj.Cd7+8yiփˑaBiaLҎ$;?;hDJza{LqVcx|]CEɉW7r{슱v4N^ Vz:,b+pT3"bun }CweWa]z;{2b}ĎkUZApL:ؒ[=e|gX by{ޓBˆ5Vɽ-U}Hha,<\uzϒ(Bzc)}B]/HX|1ìFCC0z}$O^\2SCߪ=[o;<<<,EadYmRM-̟ ۾ez%\gwF)wcmbjDUUbtrt$a5*_[eGYdLl5\J%dNʳWB]/'YV::3JFI֩ &p/ ]UStQ/"B=1YTsp,zZHoW%MnD Xp(6\7*'^}Q)+`{zPZ݈B:uIᵺk 4 F=Z=,Z(!B,k'vS*#B^ޫ@2Vn(T/Qv (EsֺM: Iw^ %0yʫeU3, ö2GJSgU60%x^H9J(yW#2" t?f+" )Q8 *QG~E(C7f6^Eg!< dJ}crnw/ٗ(A;ࠈKu 4N[BT*Y*2-&Hakt0V.`"X FLʑ/G3BDCOc.? B9{{8A#ۺ408SyG@ivQsp q ]\N:JrcŠo7 ``8AfsV铳/ϋO"G_ړ&eDf@'bHڸ8#!bDAMPdTSHdjQ͊_;䗅{)67yWPC򑷸ymGF"> !=yZUfY\e2^nDL4ȮM<%I "ฎQR`m&QHK(Xl K! ki4"6H%2n` .Yxc9[+?I#W Wєpy\{央@D\+DO[4Cbp[(ӋHDճrI@%g~I)dȃpdm,7e '}ʧ+Fr"dPYŨYub}E~NSBBJDΑb%[B .VXcSJ>"QS6 o DD4"m`5g)9[L_(C!xԐ}& ܣh9>Hdh ,nAjޯ+9;j+kaEEˈPK:bbe!WD-0s<_N o#cr=vқ$55CG =nc{n#W-/hkZc+/'S P1^IFs9Aҭ)9bxǖ,fߩȼQ u)l*.Z8Y2 ʘƼrMx9tOBK,;hA60 DcCxv½0_wY#|ZFJ ]nTjیhΩ;hm_Q&ׁ-u}3S@;w]^r-^qp;a%o&lo? q0}XKq_8cHgFCXEjz2O4U閥H}yO+6vɭ97ӭPhmT ͇E-THk &Q8^ë|HXGD(SJ˾Dhx!s''vU9 #r:T\w5 'AHAPL6ƺtءy n\7qF QoTAE|C#}ISqT >Hy4#ɹ$B-sʁ>gUy{9{KH!{ոj֧Ҿj\,0JVbk3zqnKKTs;¾_]PvQRGqcc G '4  (4Q4!5PS9x}0W} ϶Y %M191ki`iY;Eq2F4ZM޶EFTpbg<68s~JIzl}@S{7:,Шi2ư|#8Ls5Ie^d8Fg@OK+IHoivpP Sp>J! }8Q-}Ago2Њ`:ӓhL/E> 2=%hሤ PK %PKy.F=angular-1.3.9/docs/partials/api/ng/directive/ngClassEven.htmlWko6_AhbZ!húK7`h -j-w.󨱗D{TYcbvXyYW9o&>}.jiIv潩v҈ʵ[K1uOBh.ע 47z0xT ,˞pvrr*Ziv$Wk:ln[K;#WlByRmFVec+%Iyeޯl#{VWEk)x/XKqJ\6qD֫Tqٕ[ T4N"iz!HHR3D.r|Eޜ8KX `-udoYoEZ5cJrKH$&[IE`\dQ޺ȵ*̗zuVjd2Еxt-b?uQ8p{v5jx?2*~EƤR0/`Z΂bגyhϢF"L,؆L]l"h1o;GRSRޚ@Jw27(x].+AZ(=2OoN˷Q;9`]NRAۋMܹ'dPX /1"8\]yz6y9A€}J=I?0gY+>C= b͍>]q{lʣ_\Fa͘۔"G+ OսVX.@nJV/\[#m* F -m M$(>s-PyJ-hNQۥ{rȷIn\bV3*cp9(h‰ ܗ9lDKqnPr%-UGLHMe+ ŗ ' :S!«Na !{0 ⃤ Yuk?6`;7EZ^MJd{~l~ sι0 fh[ 9H!c,6Z9ٿ\J$4Kd[۬+)E.%~qݗAeJ`ᳳu=>2[~5|q[TZ6, Cv}">i'}kDueOױU#=^EMcc&;!lILtfM8SêNsl)eQq8 r۪䀜O#g-,">qڲa!8CLhO2s1NeR-G0ƒ%wĻ_PK wVPKy.F<angular-1.3.9/docs/partials/api/ng/directive/ngClassOdd.htmlWko6_AhbGQ!húK7`h -j-w.󨱗D{TYcbvXyYW9o&>O}.jiIv彩v҈ʵ[K1uOBOu=}~v}e\уjLdYWgGfGr)-涥3r,d,զkd[6R.\Z6gouUkJeׯX]BLE#x-L$Rԏ$%yjN=M2)+jǰf`kS%{z+:r{P_F1ٲ%X,M."$"EU}`\?ӮR#Kkq/Lx[Zg0q+6#d),x)6~-ʟ Ŏ,:mDA-bMt 0u&p>+9p:8v`&oаҝ`zL c":^z jrPJSm]hԕe@Alq'q Ha *v z II =Fo;d #ɝjCXQz*{qoN/kӰ9h{/Ѣ9;$ 1ra$<ƛk}0]0lQ((S$ jb{f9Dk{d (,c_57tő;n)F~0>5cVlS~*4?n:~[aTr+QOXs]oJn{*V@T8r;&Κ$9P|ZN;XmۣQ)Kҕ koj\bV3*cpPQ`ӓ}V@ L%x-V %WBI\0m7A(S{X7_4%D<ʄkN:}nC`Iq;AV7~PC{c&Goܻ^<|{ qι0 fh[ 9H!c,6Z9ٿ\J7$4Kd[+).%~q@\eJt`ᳳu="[~=|v<OTKIr&HqFuN9+O3\;t;Ө4w&x|!_vgSrqZ=} lU>fgF)y8g&=>[TZK6 CKf}">i'}jDu->OW4c_EMcP[}&;!rl9JlfMRêNsl)e}Q'q8 j۪䀜O#%-,":}⦳eSB.pwф#t";4aˤ[`9ؿPKNS0PKy.F9angular-1.3.9/docs/partials/api/ng/directive/ngClick.htmlVn6}WJ7ʊc&m@}%Z"URΐdj֘"r sJͶicmg7Ru//&cٰ\2uVqJ&-2ch֕*L? ^>?n>\^T̔o{kx XcՔj`)j +vTEþᥒ$J)zrc<'؆r<>j< HStuciBVM<M~s'!abzćv`S[.X$Zjp".Ϛ;ĉS꾴fDVKeYB6X'%DKҪI}:yOD 𖃞s 7=1 ~{ceo!(&AA5:w|DkGH8:>P4g^̥ӬKU\_ɖ:Ele߶ż: +|g%5J3'e["whjSvZRJ)$'xz17zcV`[A8v”rc; QdIPkV6,R*_knԴkVpre͵Ck򎬸q׀f-SNhmlMniAm*M@-U~N 8w`a ae ְprE!>xżE]c S, % =3H&]R nw319 \"r/gF{)GPzm.>/gJBqz6ryrCXP+@]gaw,h ߭Իj`XacM81SvZJJ(kjDMI+I^~?jA$ J5GI\2i {GلTw#"/D#2Y!`f*Vg97 Рo4WU7G \e1Qbc@b@: 0QGp Η/Y 0S;Lc?0OFC!Xw1W5=4Tyq-?Ly<S `w=1 bģٛ_yr<8{x4|:u^NO Gw(TMWl26 ʉeo&֫X .3 +;>bɏGgǧ,lݿ~NnqEj]WٗEP&"b [k-/3e&gJxuK&;Meǰangular-1.3.9/docs/partials/api/ng/directive/ngController.html[rOqC'69#\4V3M:qL;qE Jl>DOowQd)tc.VIiVgt.Qo:[ש.,n'մ*i.mibg+45%6ncJ2QrO/Mva?w(|䑊S]Ug(p7)J|f:LOw8-t6υrԋyBQ\N*Ui:):qB ]fbP@[b/,1ziFA[țnJomCΦ1[VcWFe,')V 93QC)MS !al*g gsTP_'%Η暠qb*\{ܡ\2bՅ)]T_*Y.tKg-R^fK^} wEvܘ2f=W"LПIAU??IX{t(_Qԝ*˜=kSO ՚) oC$4iZT,"ߑjO ~|uz2?/2}͜^([7}& ɮE&9$dKzʖ)֥̦̿xj8]0NL4xbJ"_yHa9mp#6xe8l\ǁ j& V*x8 b7ނ7FJ"T z^&_!9QuZLk6|!Z$G]אW96Vu N8P8P^E} :Qk@]d^$Mu};+Ed$7hja(!}ݑ%||F'ΊʮLS\Ce:M?O=GѸz>>p͂:YZ\ hrp(| Xts4꓎NR L"}KN8Ϛ+ ,L?X`T87%5lIHGƄ; , 0Ȭ|&)/e;%=X #{1]NR_МY|fG9Ak& _j1_~).jm"_ NT`8aip7cs·V3؅A"rPnWƑqdy/~;|Kl#B;`~L]Gpxu79tA7tZ!iddï mEd^1bs>/dJ |vV#ְ+!4zmu AosKb+x~L֍M8_lm^WhYlpʼQ5))5.'lQH,T*Q{M_ 4اM0I{5iDr"Q87 G^FiG(c0 DU#`BPAR{.6;byONH/D^_PV.B)JMꂔB#gkްsa01: TnP@.w%E#} .Άhq:(G-tIΟ8z4nMf>>)js`JexA6خ T$>OΆ`y7S=Ӽ)ٰSyiS|U M2*J&mIHph+-oHH|$ŮL'2P|eOSn:)jc`tu7A[&oȲey.;:~`4{/pszCϋ2 g^PH-4Q$k l:U''Qy ?"~+Zko"#t q҄}h W7j5V.αi1**I|TC7{ du uLPPy}^jddD ͈{3&[~:I`5lFțm{{O)%&H^50IRK&4, pr(%Jb٥OV{0q F6y;ш \=o#DڨW*ZwތTUFpTH39ڲr0xQg!rL%֏r/G;B?͍^@P@{^0Cׁ$m RyAK.^{pQ>ʅ=}A8E^B?)N `lp~v{;Dpcv{;5ks;+| z1XBzs، qVӡ#5wn# t:sE)麙Ù/߃o;lyXxfWoF`FHNVPmVEw.i%PS\ `2QGM4bB^76&C]dGnE]ZVtt*f20x1x伩>fyݳ5t|+eȤʀ=/ %R}AB7Ee>F{AŀƑB;8 ;qϐ gJvzG fDgx M !8X.X"j,TeΤ_> KL%s ѿKa~Ւ1ٟۢDXI{el=ɺ111(bN xDm0J7Fȭtc˭.9Fdx)xbWv2w'ny_(eo0'/s!шqD+ k#R{,@8eX@pyekGN(ra rCWjRp?&\b^cq9pl0ZU<eHTL" VbCr?xukH1i+cVRBppCH,EIHʇ(.K r~\eڀ$hg*Nx~]Lɢ x=,`pG#٠lgJˣY[e[FŘ +*~y{9*BU"kZe -/!4+N[ %|[iå%#FvI|d=p't5>{}'Nm- q%Sg:@v3]o%xF(UB(ɌiMPKT" PKy.F7angular-1.3.9/docs/partials/api/ng/directive/ngCsp.htmlYmo7_(h"!֮WG!E4p8PzEn\jgʖ}][%9 gs)6NΟo<_kiYa4붒.}f4*o^fۼqEny*QrjV- ~WNKN/u(6ࢲ,{sQTiΟm썚y~f[sվ=HY6y-7bNq Cn(Y(QU5sz BYi3韠-(3(Y*,#k ٕ,iQx.盗|Vik :%VҍW5?1S!+MLtڈ-J1H VNpzjN9&`ZHzqiRM)T7rJf֭se+UN}~qq/1+EZmdM[l^|"QńۋF؄KnD5 qqv-4։ B5?kS]#u1"V-uhZYs~$Z巭AZ3!('**hDn-~[z[BtQKaiT@ď5^Mb(jW`| Ǘ<{7~R>I,@/)!,տ l*,x;@d2Q[xl((BHY[HO,`6؎I/1DS-05$_d>v($|:f 8 ;W8- $Ōȶ&+>J41(`6̈#<hbm+VLqR7< 卼…Q{bM!m4x\YO$/[ iST-h(.>%sxUV^sVs`[d<Ɲud3#(`C/` %Y;c$M6 J z,6ׯNelȩ]3kJESbSb@tP΅*#rR1XEG8{oe>pRrxΉz(Ft%|].(+KЙxkkRd[U!g)Q:sAT1a @#m2z\vh_A,3f}X!L܂3Xm?b4'.tؼZ|\E @_t\"y/;T QQ!Nn/~۠ԉDL K5T*~L޴ $E.~cȋă+hTƈQ41-O6c E-*I0 $kKp + k] A89#?wXDd2 )6^ߙqgR845x|a[4B $dgq':nQ?(ntu_SzۋyI(}t*@Qnӟ֔䈪϶BJ & Hw`e9H]@+j,RShMË{(!7wOL $_t(|rD Ѯwb2 ڽ|Uv4X' ,NȆ$)WʐHD;t ` /xH'Z+zjY:NuXZrg C-4Z 8r .;D~{ -=ydt&DP>V*oMyQWfkZ:Ljh$ n4Cm; A $.ޮ: q<.)!⹴qeލ$䚚Tf?û߅=b =VbOuNh:(f:ݲ54|+aHw <7Go=$z HPh4k6|_a,!n$.̨jTXI=FmG~p M !8sX[(RWPL[> UkF׻kfAq͒1UjW2(.ֳ`^y0hN4nDvʹS| q)r{Q7ub-iAYt|̊7oӖc@v۔#n[rgF\S|䆷y`)8.$1,h%n}@p/E(SǼ 8"r $ܗ|DshoR ; RX|ս ;OXb\;&Ȥ9|""U&/H%ŷ_Zdw`O'^\BgHɐH\%\"(G88¹$xI, Z|Z%Q\U*Fcr3sE05b=?'Nw"XLϣaz$FY%[FKi%Coa`ݼqIzxWƒ{ٷ|zٔ=PМhO(1t,piaɈ^,-q-J cgO^g߾vcC{؉Nc݄+ֹgGyKDIo?BpPKdO PKy.F<angular-1.3.9/docs/partials/api/ng/directive/ngDblclick.htmlVn6}W 8A!+N*$ M Ty]wd'i\Ԁ13Agz97hfY`l Wr[XS-axȕ?Zuk{ڻ_ݾhpw:/?~X@-G8E|0gfJZ:QkSYu6v) Q}u˂U')pA_ QjִZX{+ioa^[MJьA )Rv";&$1,I^nvR0Y srK ^zemiwB-@2NSmh'S?%lƦ6bu@|A"H{+SKo遫Oҫ'sHN*"l|H^xBi5;JQSYBj`[goGAELid| sIzݠ1z>gp9!SkmxVqГB FQx1pm8M 8Cq\ ~VE4Yu _۷3,&R<:nu n WU)y#XPPKIDS PKy.F<angular-1.3.9/docs/partials/api/ng/directive/ngDisabled.htmlWmo6_AhXYCڤXn(tLKŅUr{$'M D{{96b9?kyŬ7Nq?gLTelYSf*qũ_ZJvڬ %gO+aK#˝ e Sb6tCV*nP[7"%5lK[#\sJZa*%GY"dqt1WKˮtg"?b#}jh)X)L{9^ُOfxݓQ^ ^ c[ R* KɏOY%Ř)JɆu)$eFI"ςtiU Xg%79uR@-ֺSUs݅c-D;+t^*[-:Pf̰PG`t5ό7ӊqsm󬅷E^Jn*ZBfB6v]R9[r#+w1a$]"碊d6*'+%,( w9] 0[omE).Pc`V˜frp^JQp@؉ʚqcƦ0(MPрLkH@._X1nzfG%'9d֜0Vm%,E ͂=7YȦ=pn:S!p(xF'lr6W_ q#*Ȣuhk^YA9zlR-D:4c5xw^gLGRF?ZxD*\`N#3|탪&IW #>-Y3lj[c[QR j*nǔNaohd5O: ={DpAN!7ߚz{2 FY9r蟞vA~;16]M Sb?+.ͪB xΧ1Jli)-jIy/ ɼ Iɝ 837|gXED] ǥk&zn~Et@>.uGMJF+W#b\eTJ[9{F5OUSssMh\B [ ]xHѧOvXX1xKEBՒz`| S&f:,k̆(l '$okDZycoTeu)cIbRۙ1 :T@| lq5RGvzR܏Ǿc)kQ-6V ҂K]Q5(-LFУD4~ryy}ӋWGٗrÜ%(>#8 Ms ߉G!0yy8]fAQУJ~  ߋvӣ ӛ<(牷'ztU37טD_\᧤KnC%e{w]$Q>4d8PKSKPKy.F9angular-1.3.9/docs/partials/api/ng/directive/ngFocus.htmlVmo6_qP$")lX20 HtR$GR_f]̀{{ή9mʲwEn-<XZӔ+[nq=pcZ:ܴI5}v}{{ݢm ! ]aQgF0k7|F01`颮x:ub=o}Y}.wVW%XznA5U3 8>m(Dnx׻Z|J 9_ņ{zd-!9\`d߼~"D_U7KoxYgƍAO[֡VH @)> A@ɨ|җ/$=2zW5uOFiƆ' q:5{vIi 5]TU9%QujǪ24;ɦ7Jъ {0!ϥ]\KqV8{??́bFNJc@e<c# 5^U": Mh[Dž^/HO?'`pe@P)̵no_l_ =NT\tVQu* "Hp\dID]EA]ãc{r#?>db_Gf("ޑ +A']&OҠƁȴӚ`ѐ%3c7gS Cgmrf)o̰*ɚ+%ä1.6Y!Wn)F ^$KxfZA1$e3Hl*{N_4vY}MD^͢%Q7˓V?.c=& F*WCas Guv etfiV{$D q~ʤ0smK}yū}1|ãja7͋_]Se7Ǻs& |NӾucVWe uyop]亼MXZ鍭\+|zp?c'2?+a4&siÿY=_v?u`*ZV594jЈiYZYb=QͺLi+<C> c\gF@>G*Lø'h本;9Qt[STJeE0m"xPcʓ=D벨lͥPo?]Ֆ=6;a|9Il> GϻPqgA|eڃ' Hjm8; g 2^L5v8e* uteNs|^I3j;XWx0D2Ȅk TCw)J j7͆@+ Fϳ۳;#4$l8Rj{Q; q\|Ph'>H8(2X'6gC`w,H7Q:ܺYOT8Cށ MNVjj.R:#I ՝B!K49w҅жdOMs5oцQz$HJ|)i:vH9deyv+~k Kxȩ/[UkMO* [S3 Gl~<7J{CK}>Z GʷN)LDtBZz#~BjxQZU =Wm13^+3衳sBT&H%n%\Dر]Yёqߔ^ח ,6'EYyd$"ZF3啧_ ٔ*Qjr'4ԘFޒ_ŦsvZrs;/ߓZzMP#NZ6+`c" Qm-(őUd^ۖ(ny"VԒuARĔjwE Uv{%`Ķvh$X9it.f_鯽qa !?ځ6׼ow@8U cϧ2KDv w(rӥ5>AmI&S`(ޠ4GMrgD'친`1[pv[)509RQ}`u3,:JJYp HGnUw }zR yK]uGhӗGj͵ۘز(҇褹QFgWݦ:s*fs'qײ٦goqHK)6.@Yz]@sW-KTW!]  B۸N}VM==,@Qn l9</'J\X)uJ`N0"[.Q3H°2Pq[-i5m+{<;^Ҩot*%Ot `u``f%SL F91HH;)2w`̀e EѼ;zb¨lU$eaUhW D|_xwc( YQB*XۢAW_3Lp&ەMv_CN/QSBxkU<1u#+ܷ[gB6V)Q?n:3~=j`2/[DGV%h3/,)e)9h2K٦givc{@^bXZ]iN'o";^n Dїe ai%MiӢCs;V[ $kL-f O ohGvb>.^D sźo9:%*[}*3gUӷ8GAaiКMT\%wd5ή^VXDU݅-S=>&2͹acUOyp'% "^,x;7`PKmG %!PKy.F8angular-1.3.9/docs/partials/api/ng/directive/ngHref.htmlY[o~ׯ*][Lї$@bZ nE/#r$z %~g.d^'ݤ5s8s?9CF̯kZ6lReΛEI/6tlr1ͭ)fW҈ɕȹsb_ZW.Y ]\w~Z [9ntg(kOǬTګcl^kfs<-d7\M[R7e$pzl{YrC\--{"~!o|WBRS*3rQ {Zhdӿ@D}ZJdJLϥYXNS}Q643H'YguF߈*S:fhse \I"G?ÆɆ-u)KErxDEJ'+:$`I ~:6C8t-SK]O5]W7>CEuNTj) [hk?~br':"$/ڈAg0U uX(y zvqRE2Ӊ'zaI~fF߈fʫ/sd p)g/O_2a6)G0Rʁj%)R 7Sb9)jt:g7HSqSqr0d[*Dr1]~$Xw<1l>ZK9"` IR2_EF8?(iϧ F~,>%M1&nEF:xLjdÔX ޼Rհ#"db\ cO֋S|C8ղqQH!iC9cKvC;NQkVQCy\dP%Ww>.n9t&GG4R\dk(tg!r&NeG bxĩܩ BP4/v;!ޗ = 0|y{ǔ.=@VxlF /z_lBۥ4Mt=ҍ|;U~GktJ., Ԡk, wuOp yhKړyϒԻ&v䌐$!lyo?$m}J{N=/i&Gn^ɇ*d_Z7rL+= F {|~2£7Ur7;}ُ~ݼD> qv~\I0A[#~ToKR]:C6kF~$AwvF 4nZ#%qF\sHƞ=~A ۣ=RkZ+έb'}W wv\~qh/}l]]H+j/_>n/{߉McjwJg_]|uuW[Y <MoQ!囿]Zq6'rYs9mgwV=ke;uZYƧʷru!ˏ,[S ^.cf{+D4݋fM8Hq;X JVZԘc1\IS8{Y7ᝄV*Ǚ$I+BwYI[eb+[}{+淢ɕt9/d2$G?9äf{J!tH`Xq0ѤFS0"udzW~n!6HǙ.V:nje gt 3[`HXŝh&^*; coK1P-w˽yFq0ٖ+'4&Hb{= ZT:gKt'h^<)C!+ٳ\ڕygEYܭ>ѢF oQqxS uL8dr9֓-' TkLzJ*xi#]qCRtpq &{5FB#q&aYHt[{c-߾~-:d5&霹nҫu+U3hDFVGs}cxB"Tްh)DUWSd&4'L.0Ӥ'JqphHx!:Q& z8Z Gu'oeA:#|N%ėc6Ƒ48qrqj"P&w;& 5S=1HSO A+ {lR{ $VI; ,DC!"xs}$ H&ۣ^Q ~'b@pvYl$r90AlJKc ĸdpD`W%Z~ 1bQ`{4=bAFW"'=O8;X|G/1[ӳ!4!]`<%oE4of aP::bT)[M!(up;5H!Ap @;шE=[ ScH(-6l1U%a/ĵOZbZSqoC o zP{4 @a=?jW-P< A(Ÿw]Q/&MS3?Ǩ٬qIq̙+0bxL Ho~7zߧ;<$I ځd+KO^@r`'F [y-:1Oc*\BJCVA / sp]`=֩[T5(3샦+p(]%R뚒@u(ߡ>2ľR 2P NJ'z\ݷhPc\k>He+!}·M7)'n~]i ?;p\*(1 )D#Ls'saIB=]LtAK,%C`=Ro:t1P8tv`, )]Lǎ,BIH(!V!(%ɯ?Cdh({5H.A3=Rr1ŧl/VIDԭo+s E 54)6deZPP"1T /AhVciszyL+qiT=Hu4琁~(PmYa%Wy)せ0if1v4L薓4TYfuJ/bXe,L9d*l2Ako1٘,p5y"խ\ (Jy%~ž^,8g˯ۻ/0t=[3Rtxqu{ n9N@pϗ\&O r2L׮c~l5z+f2O;+.6GLj*  PK٦ 7 PKy.F;angular-1.3.9/docs/partials/api/ng/directive/ngInclude.htmlZkoF_1PD,R~t8nm]A1"GZVS=w$%[nfwAksф铥1>En,J*. _:Yn8Jrgɯ>^iQg#Zf2ՃgٗGLT3׍(>~҂k=}*%ň`3SJ+6OIŦZ,Y6"Jrg8O^Y暽$I&OF atzh*XUH勥QE(/|k v4Y ëB#Ohv`^.IIOOM1m `{zbnUB"d 7M,9:݂-=2Mk,PVıOR}s 6W ` ng^H L ZW"ڐ&66q8;M>y13mJvIw3OtM Ħ4i_;9|6 |Qo# ֺ DwUd04 ֔& Jc`:g^͝ݑΡrk0/mxiܞ A;er6gSeH4v( ~n)yFځaJVUr^\,2ZUa#>J9h4(ρdXbD?/|?VПצ`HrR$Ģp,@?U`m] FH9ΟWh?rO.2{N.jK.l s/π.?DJ*" ft(b K31˵L +?+p{jەw~:f{".TmbK}k!-Hmy'>(`Bۣddd*̢"a =wakDfHx qQɺ5*9_冎Gmɑӟ u#P8#u {GG)s/p۽_>*XopʲE26)em V2 (1gG1oSQu 9`rE?9wu (Ay (|Y|Sř-}~hs^]\Xw/.mZ7pC+}GB4ޱ?aMnr Yݿkuo;$)i~=& ~-l!@SkX>Q so 3$%JusZ)wQ=*ϩ x0OJevjﶚvp5vzXU] .>=W7 j^22Q[6-atU.NΉlm/Fth-fWK8],OG3K.`}5>`/ᾞhJF| q(ܴ_ZI;unNglS}H}2jGwm(d- =m[nk'4oYb\S:!ҹeuv(F7̅KȦnj0P l|Zq /h2PM}oM&7ʗдFTl :$|;8~0$%=47#N'N]lFt.o ce,Kׅ\ů2TcFiQθ{~ZDkq3_ c$cGX#{g= |϶ThaeG%>]iN4)$ #\5 7b0;<[.xd{q9?K}\H( P\7PK4`V1 'PKy.F8angular-1.3.9/docs/partials/api/ng/directive/ngInit.htmlX[o6~8Pj+YC!0 k7`(@KU5rfIIN]J$UF^-+Z{kn(&ͺߋm*KtqZS:-S[E֊\pr^+:J`^+9 C.ZR#XSdiR]P:(\YChk0++p)t)fOQ%'9Mr+N8I!yD6XdWI#h[V.`8Kc,nAL3xgqx`+mkȶP&&C0Ge+RW;+}A’WJѴÂ^K`ǐ>fb+ե|pںM6J'̈ `^.Q ~$6=אaǍI$CTfҸ9+JlQrlp耠O(#3lU!H0Ǫc bb9?8կ<;>:rtڝ+VL2 > dlu*HwA֧$уg'?};o( d[1%{@< aS̺GBb6 7Rl v52\D+3a9\&d)V |~£wH'T !c<Ḓt}fQvEV/9\%$#@ejhHq5;F\|`JHo+dl9wX5 ˑxBf<.m/˄ ,\OsdBDeR^/*{hSx2ZSrĒExz=}DFG~{"~gxt5>ztF7,Q8[1oI>x)k埗/oev+Ft{9 _ig8|~P"ji~9Ŋ{A )s{c<_eS(,FFXts3*p{K|2rus弽= w/|)z*yJ)Έi}V?c\Ȅ8abԍ:d$k', ^vYo_(enz4{y2'C,a>s;:ر[}ɓ`%+`Ak )_3uca⩖@;ޓK3׏דPKN\PKy.F;angular-1.3.9/docs/partials/api/ng/directive/ngKeydown.htmlVmo6_qP8*+/{YCCa(n>EbCIݑ% :K瞻S)xZt(ZqM_ݎJ l/6p.t[4bٟ{tNjLtw__>;iVĝ-]r|w?,V¹B5 o>X [TLVNF,mV.BVo-tpm} l$~[# RmfurbR 탔W١hNApV*㓬bO'A۬ Xi3=X"hqM<A ;W'L 5T q(!A(]FUw+ 02o~P};GMkF DZ@f,]7A$ʄ "~PHgHqs$[G@['wJ̾@6l&˪2{{z()A;O}H/BdbU֦P˫<|uzr <:k42$ jpeAYCM.t"fMKyz^]vR=Zx&$֖X4>R4%19(U}Y4EJ@>w^HEALI N^ivR0Y [kc˽HL+&Xe<ŜwRJ\^[=efG(,Yu3e[ 5P`AzDub~DHoB%Ҁ Ԃf>R%=ZkZ2-5'(pء**ΉMeJKEhD8.mx; [z& h|  Gj%Ufը"T`sxB//.$|Ckgp6n*。`G9),!5߭磥"&/ydZʤnp|&g_0 !]p ~:j3WiN|Pj OW'& $*_/ׯOWLX)oif1yx,kqژdsK cEV?PKJ PKy.F<angular-1.3.9/docs/partials/api/ng/directive/ngKeypress.htmlVmo6_qP8*)/&`ɇP݀}Ć"5#)9q 3`,ޞ{NzhK2{{||()A;GH}dUjղLr7yr|q~tdyhMmH#Կj9у":}L$#G犧V$UykZ É$jlH;AymGR1)3yb)rmAX9IS$~{wTt$oD[z,ysO}w58PEg^I2aĊH(贕~{幛س^rvԌ|]P5 0FMY+ǩoqY}&2ҾD@ٙY4DžJZӐ"kʽk@Weg~L)KIw9?"3E¹$nE+ ICtpnQP~J6RѼ7ogsyWH//mɣ;G6֜GkRPͥ ~-:\&R׸Zשə~He;s>]3*3Ŗ?Ec|RjpO3De5|~:qtqS0Ad\x![lZ7\IJzƼؿPK3W PKy.F9angular-1.3.9/docs/partials/api/ng/directive/ngKeyup.htmlVmo6_qP8*)/@%`ɇP}%ZbCIݑl'MH|xsAg\t *[qպϙjG}9oeɭs0vbݚ+w+ŻZѵ=Q[ӗ7//nk#ŭ ~zY %\~0zSK/.B{I+C'j`R5E.7NXu?C ~sj1ݚ0JvqVG'}*~nmxmżBlX8IRPmRyw|F:3n4M*u`o.O 3@(u3JSo EHȃvkYa!F`QC~Xm=,yB@(b"rh_{G04C oJc@LjQe˖ox=:n9@hk#$p~$ DS&#+>m/<(aS #w9|dUQW]kզߣv=GoI 7uCLX%ʅai<nL;^R'[">ƚAm3LjFI)qKw̰Q"EvrDŽ c%: 6XڑTs hs]DdXI2@%ai'I)`3ؓ^jvԎN?fd F092a:pįOc@ܳ5!X 0@ps6BRIo_wuvI9Eu;xJQxRGQp{݅߰~Ȳ x@5BvReQݛETťTOshAϏ{'|ˎwMܽq`F()$Vj`+ŠBM7jI+2᛬sIzdOff 2d  Tk(?C@GHD J#Gׄ.=<ۍ?B$:jW勿kpFiv={@]ds޹3чk- 0b݇ |S z'~\*bf!V8fW>|TA0{D>oØ]/PKD PKy.F8angular-1.3.9/docs/partials/api/ng/directive/ngList.htmlY]o6}`&QKcym n6"G⌘HJRn{I}=ݼld$^dRV/NJ[2M7ڗj:ͦ\ 狳ul6V^_*c_kܨ4 Ͽ; rW [Y%b_ND^I.NtZs VIku-d8omsӈ)!gf,AvɳT.'{*\S'.J̕hJޔ;GB7cD7SA>e=4@̬ue$M̖aӲ|΋Lu`}ghgU$@8Z~bB@5WџD #t#jSt`=`hEYj%N,>C^Gη˷CaysG)T#(TkU',)WHkVuv T]UV $ֵkSU V[V"~TrS(8h]T, Ӊ6VzMySOJN˦e ժdXeV0yj%Y|+UK M ;ҹ;fʼnc"h׃a٩ ~ځ`hU Kk:!rVzA۬d^qcAM[i;ҊFD@+M UpN-^m #5juy)˕x%@Vx Jߒ 4b߮9o'OeKmJq&OF74 X3(`O &"N'mUqRNE(`!% U>.,FtB@'8~v\rA&a'2tbfZRug{ze#YI`d"J\#G"9N`6-PkF3ŘYx・ " !sD kJУ>Q6?1XʨQ7(Zcǥ4WQh(l%^<ɋA-gTkW{O}ӗ/:|ǕM-ckׄ r0P1>zeE3ׄ>y(=`c'9rj䰄êR5*ՖOU© u}M ?Gpr~MtjSPʝ ,x2DUFMQg#<2_t>_xC/uD\0Pv( q'm̍d 1drJ!/ A ;rB!O?iv}BԄk6&bnDJI{::~p)q8ĬxO+ Ps~6#x Bk|Wxˮz#IE']T%Z,(" AAʗ[P'Iƚ{׿a@eM$Kea9U]}1~\K9 !%>|$s H~ b:7#tZS;i~':4e@rU`ٔz/2} Hc~gt1l\u(=Gl;|-7W}{\n _th44P-:w@X\E.U%Ş3GG3h=,Q7odDn:䚯fDBZ 8p\pTE@"'s_ NPotT2p+p4Md(A;IAmxQ\^Zxx[%nR++OK(=+Sl?IDY4@ aNe^njjxJ *-lhPUrIRjFOI|ϖwN"wިI;MQXQu*|7{U=TFdi B?PK&C PKy.F9angular-1.3.9/docs/partials/api/ng/directive/ngModel.htmlYmo_`;\.6iP'ZPJښ"Ҷrgfv,;CbR2;3;/ tzut\kϲlmܦ_Ίf.ah<Z,1ZghoopJ{d_#v.kmV+~뜾uys?N\Fo]U*XTFM;S_lߪP2k/VPt, ΦxF pt Jo}0g-.jT:mۦf{@gż҈w, 9VWS%4][e{cGP[t! bK!f:L4NL *KM]u:' uЦjV,UugdDt a:S).2~WΎ`+,d`[];un,efY;`&\ߝߝbSQF&ۑBPRoqV%wFi*Y_2@:cl6NyCL uSe>pߨsej8;~zI&Q%tA/0ӹ5CTmjܐ=[<8l' q~TQTWq6Yc3bCղ]^;mO^ Wc=~&g:"#i0xBM[$ vn.z6lthA1f&E@Wݰ+ Vq gʋ##Y yDНDt dD! 5$>$d3Ԥԭt aS2!#!"8>r%Qi-$8ygKһ>Q:FI99cݏ0 6`Cp9[dIu4HmfrN#Qܡs"2ˊhyd!C Wf~:u/0wa~ ~_ %Ty -6S%dpvrȑ~@uw3vM\! u8g 廔ZJW(`5ZCt&.7r_uw[ s :oVoHfp \ޗhjlvӉ8GGidWUh`<,1B`(.ӘwŸZ&z {4O0 d4K~MdD,Џnp$u9.S.G Brĥ7#tQ R79ޙ9#aܻ qE@0 x@e Am\@|M/&Y-up h$Dg; hC۶46u^trlϩw(y>}nUz דW9fyq.Ȣ>iWC\"P4I^sob27t@_ޙzSqePN {j[ŔGK)׺R|Cm"`SSМQ˦#]/qsRIYOG>=GK4#bndbGxM_IR | QfHPU}}՝< E_R|$t84|a (p$IpTu&J# \$sMً7iS1{k"AgN}[?xEҋ;b"ƪ2R6n[S+bZx:Z~$4EE{sSz& pQ=f꧷lz(,⽎a??tSz*%C33ux3+߿=wAhC ūxLzWƥ腈x8ݻfW^\]'rH:x Eh0JLrU8Wv7@3sDZC\.q爕/B*E/V>"~*}i y'pHX~*dzH,AAdniRM<hޯ}T ! 9r%Ť'GbC]&5ښKQ2 ]cĕ̡o/-7,U]d;ܿ E7i $UR/Ocyz7lӈMHi!V1V*P"H-pr7TdH9b 81 @ @ek;n ͟z a8ҬVphb70ۻhQJ}3Gy-G6' e2ס^/^Q;ߠÃdWTY)Xʱkd|))2WQ,'[+jC $A{b:ʸ7VYDhkzn:W>j4Od^٢>EUőǶX‰>!PO7,SqGB^YV>Ir^§nHk*%5CvFj?%.\Q֗N";~S%4 s~,{&BqAK/pQtfxHE‡1@<꾎"kdE?h@y%.Pԧz֬M,"}ء3Ԁ:d!0xVH$B6Nm)2xrYk3Z _:*cI޶iJIj>R>:'ӡT ].>T:}Gƀ}BE%.tCmS2F: ^[RkUdBEAd&x/CT6@OŠ@Zhhz]PKӇ g%PKy.F@angular-1.3.9/docs/partials/api/ng/directive/ngModelOptions.htmlZm_P[;mYzv N7 <33t*~ 1E<3L6ˋU3LV"IzU[:~&?5Y?>O'7N'jڤ^|e֦i\d.mF[W6'_ٟ?Ti]W6c:K-|IUm׺>lX7\*+Uw5&~墩&v\R>zD7{?5Q×pGkk6¦FUmQkHKֹؖ}+>{Fgѕf,OsЖ|߆I~Λ]qds6mmTߘl\ƫƛR`Lc9Z-B RҎDv&CxN̚c%TˢpF*w"m VQbd47ZTMeR*ҶnXn90צ k6(+`+GU28k˔)U>7JC:r\Yl oTUh&7%v B6O$s0 Wz鉑h89/M* 1_2/[-i唗^뢅"m޶&|TWKk!ө.jM!2s].M T :(kˠdd1yX4kL:{snBܕ+}ù8u7s ;*tkSk 1vDީ5LEje׮o |r} dZ /LA05 ?)BJE$|'ݸ,d%iɩY^"/Z3?Zz-=MEl~ P:\I 궁e tXMv 4b CTʨd;~ zĈ*Sf$VŸl.jk-,!rKk]'-B;7܏qI ɶp [qiP;HNF/j\b6A+הRQ[燑o(dbCj|c A ),*uoJׂPqPi=?E=/Wu* %scR+W[Uk3Ѝ刎h)] [EwQ۩QlBeç6!<(?g~Ჭ Pg84/a7èB/=Tgƹ"n<?S B* 5]#Q(R6So̖ST992x-؆.7@ݹdB1JC*G&B4Q?D``CZo  +Xd87a&QT3*!j,d,u[H( WiX%sيc WH@z_^ ~R3l^8# x&Pbf,'X g)̚D]8Pbo/P{!)45}0XO&^S98jsQ580TOgg2UgVRx(ʇy my¹n5eŎ *勰8-(D@t%@1Tנ!}zZ4K[2e~[ x 'rmPx^]q! 1 s E{qEg8ld @!:tI@ QG.T(2B_QA{w{@mS'إHASERHL ߽Hz"s S#)RT$@VXBu Uw2RɄT0u#!xgŌ+О/ѐ 9hXE].%*uםw8qL">DM]Yt}X`|*u27^v9)p"l 1t|.ࠔw8,Y+>g vdP@.j%{wKa{%@]i鄣Es$$ tS`4RklBK uxFH_;ThC?1T?=aHP&:U񄍅mؠ6y0Έd$wOr?*R= ;|ކ?CtLOG)F&^a..ԣ>Vj].9Nz \n<|ט޹zbѽ~pZ{d&@b.X'AZ)uo'_` ١xw0yPNJ^Ʊ@.qnibU٤e+QqM-8ՈL_#+NNz*h,gGvOn)A8?^9A#2ND P !{HɳWW>1mQ= &9%O4.ӡ«E]@Pm&^FL)J tSHڗ :b,M@wa]khfMpᅭ:__V`17ٟ+ 8}ʬ+E%>1}(E,kˑfP{VR@T*-Ŧ,B N ]<&叼Uf,Q^34GN 4@@oXHa{?8rR(55柸NU=C1\.gĦ|)(̠bj28:xXCLu[b+3DyNȼvOfJ!ӷEjߋѯ6meS6VF~wo*,E|J2amKVRx*?PKp +PKy.F=angular-1.3.9/docs/partials/api/ng/directive/ngMousedown.htmlVmo6_qP8 +NMd HKĆ"5(ݑM uxo=wTɠ3aUQu~u_0zt_~o+r- 0vbp7rnמ[ZntmOU7Iywqp[(7x;ȗoԒY^~0z9فS#zfvi_ЉZ+ͪuYCnu]:«08ym3>Jyg 7Bl~MVnQ6JX*hju=&:A ?F +P T S@Q0!E(]ZVy,Ј !0T'ALJdI Nx-vP{tޱQhH~b8peY E2h a蒼v6K4 {"wsp;V9!3/:ԒYfo(Q Csس*D Z7:'ǫk@4^ߢD{Ý ReL!vh69EJ"IU/gsܟi}^<Cwx:Ґ ιV`<ő%uzTms9Eb=_gB5|\/'gDS";\%Ʀ"TQ=Rf 3dB Ux>1Gum8M8>/4i` ~ ·o3) "8ZA yx~UK< xUa)zq PK07Y/ PKy.F>angular-1.3.9/docs/partials/api/ng/directive/ngMouseenter.htmlVmo6_A(k`;%ɇP݀}Ć"5ݑM uxϽ=wTYg`w (Z:YԺ/jf/>rqԅjF><@{a,ky FBio_|s}fuՀ Mb8u9%v=`rbFU)ҾVlrr8e!wNXv +Oc [ 6x)s#}ՌG>4?}سWo魐7YE;Fڬ:aYtˠ+_;o)M.u:l3 R]9(ńbn6(iM4"jCum{F NhL!`> P:ݳ t|'aȧ~.,/`fV A,VAl Nm5z angular-1.3.9/docs/partials/api/ng/directive/ngMouseleave.htmlVmo6_A(k`'&ɇP݀}Ć"5ݑM uxϽ=wTYgqMQu~u_pzt_~4jyԅjFFP^{Zºѵ=Wo[Gxs}[wry VKnz!rbFU)ҾVlrr8e!wNXv ^˃31o+c|-[m羍ꄱG>0?}')ހ2ӏBBdYV/j갆eѭZg|41`R:.HAptlT c@7!F(]ZVz -ֵИBJP};V{t6QhÐO]DeY _"` X]U1;ѫ`ȣt?!j2\vLY.)̶h֙n˪?6[;?JɜnD7@UֺLۻ:;]]2|^ߢDÝ e0yLŴń\Z>ze;a1k*dJlcd[]'+їҙ)U}Y4y݀}v NL($ZIf3cJau8xV)"4M, XkC幧E+C5jhgÌKXil.=wɞ8Kv"i-G8x"`YFJQȓY]^9y.&үxLr2&;>UlZ8Yp@|o#g,d8hP¥ޮ/q]?w?`t\ k}_g:.(be)qyx1zABCOGLṅY/PKv _N PKy.F=angular-1.3.9/docs/partials/api/ng/directive/ngMousemove.htmlVmo6_A(k`8%ɇP݀}Ć"5ݑMHtxϽ=w璳z97؛hfYd h+ƫr[XS-avb0rXk֍jBGxs}fuـ; >-r<}ZBAp)#znv^ЉZ+6K9Ugjc۲ۈ\',uY?K31 W2 [ 6x)s#} c}.al"6OR\e3e<*]|#\ͪEw4|E:k 0şɥYCi>z 'g3P׍d !FYDвcd` Rxܱ[{Bt'2 ~/b@?+'e0"nUaĮ`oգFVGHDG [˸cHqm1f%DS3bYgZ-l >*#'s{-BZUY3n~1sFg{n%-W"(Cdd (f-R0qPtz]ݙX ^S5 Oȍ69E& |R0})r]ޗJ(~ gฐtR@^nv)=34\cqgr/bE˲) o6;^aE6/ `/ZPE^?f\bNcpNf,0yۘ|B:0l>bC?3xuI|s'KeUǕیϫ Q+%je pƼؿPKWK PKy.F=angular-1.3.9/docs/partials/api/ng/directive/ngMouseover.htmlVmo6_A(k`e'%ɇP݀}Ć"5ݑM uxϽ=wTYgq=MQu~u_pzx_|4z+ 0P;|x؂rXk֍jނނ|s}jـ{ -b8{i9g֮ 6N/ϫR}Y+C'j$oVnBTo#s^e^K31 WDz9n lRF6c}.ql"6g)ހ3ӏBBdYV/jꨄeѭhZg|41`R0G 8r6 zx lO! ș"iE. -+Jɜ^D7@Uֺ\ۻ:?[-oSm>ed}6(lp'EY(&#c@1k1(RjδbX y4zy12i.RqĔK,P=E~>_DžD'e$mtHe* ;i+&XI|qu R;,yj({PMZ/(Y0sK0?h5h`/œrncz Msʌ!인ū؜NMIKU ]Fƒ!B6{Bh4H40*lZi{Փ'UX=yp(EhKApt0 QwArS`1r%HuJNqvbo&/47'[q68GmdkueFo:J p S?uѥh%q? oAY hw `f[ uɊwŞ'%tqr|`dcYL[D<9^_X=J7I"5|QW3NY&ʵaSS˼z>X ^R-< GƖYAϮCK6)%O,IN, S? &-LHtbZF)"JFFwP֚+\@y}yrŔ6H>P |%p. ϭ`Z1lAhf\Y sFL% r\* RAK\M!yŚԖJLteUYF .b{KBl1H6F+E. .*I+ޟ/zёv8 `|{??bwxЌƹMG$A) yș2uoѩJ:Y)|]r𣜌Iς*5̭t 8^V$GXD>v}l^r'p: {$a%4ZĹoߢyÁDd=y@=/ARoUzGd4󛚴—HܞQrp P4W009Q{f[k}/ 4HU n9R;4(c} YsQɲWVU|FHmwÅKZl8@?k:pZ==, =.1+BPP؄P 0S_>R/ E$0r`S#8i#@X鷠p Ǥ'KکY͒R2;{,!S"g@<2gÕ?Mϩ'BB{X'7E5#m=5/f 5 ]é {nysQ\XEu&8幠3L)8abmcTX B\qtc yQ0F#YNkÁt 2D.ǎTO*-,ogiPZ}kǣu7?|?$})6TBvblE!?1m,=>VknIGFzm-yX\ T8K}V) p3OggvD~ sصPg01[%hSa _ƒٴOoN[QzcÏ@'ޯ@yWWyV=G\Cwq Ƌm֕(42Lcz54nL(łKn DrEK"|Y)Ia'QV/kS_ ĭ>^: Э=fv\}ɜ.zA3{p;z֔PKd] PKy.F8angular-1.3.9/docs/partials/api/ng/directive/ngOpen.htmlWmo6_AhblCYCdh+l)ТJRNa}ϑI3`Dޟs#֫ƹ~ȲtM_.+x7sD-];]/2kd4rr'28VX7bUoho/ߞVF^\.|:?U[:HI+]Kߴ3reW*eN NGӁC~ [!;d{y1I>w9q B Q )PFɱg̳v[S@0DjΊDP^K#eP^D+uGʢV<% rm SplH7?zs6:fQAغo}/q8{cRA5.ˍp(c/0WHOL2?Sn}DxfMyŖ5f$O+2 ? 2;(+\оi1I2^01^QXPKi PKy.F9angular-1.3.9/docs/partials/api/ng/directive/ngPaste.htmlVn6}WJNʥXtcY}۾X"Yr.;CRrmր1/gngfTrYجE+|7 Ar;>_]jqօjFX߂w:[^;tf)s+ co;}.s@l9`$xv77BBw4uWj*,pK7n9oR80&HA-cKApD$&u3H`cn24EFYee^GbJ'#Gޛ곁Zl=[CǷB[T2XEYD.۠ 0]WHX h4::7_oa1R[[LZ.Q$LhV@Uc/!d'uk5BHuLP~|_0`v[N.6Z_%ǪO,&+`F J捡@ttLWlĔ<-%Tm;FaR Ʊ}A<ڑHUhTp9Ml =2l9[t2I!"=_%^vе[SlS8 6)JԹK7kQ|X# lrae߾oSK(C+Ԇ݌{[.E .d8U2cfGoPKoR{Q PKy.F=angular-1.3.9/docs/partials/api/ng/directive/ngPluralize.htmlZmoF_% J\ZG!hr@hڢ("W˒K;~R$˱3"zuOxJ^bG΢:Ij2:WeM7EitHT?,tۧY뭲mNc*$n{'*RvVꅉghg0%RkQ—)-U ZueZCN10ے8fk%j34ӡE O!2=|vuU,t w 蕦^ ܨR@ Wa@[0_A{\RL/FU]cIUϲޏ?|Z(:,/MkrҴRE{yCD…`*+YgPPIfK o*tY+#7\jd~7 cgE,L%hz ̏gtQ(aa4`Md 0˭Hde %;m]D% V_5)$t.}Rr GR~FVLLXDnԵwaO' 7q.;y4tɱr$Txl(%\U 9P?OCtdۜ!&;PkĽ;51&Q>[Q7#ݱ4BдR˺xAovя9!MQADr8 QPmX3H"psϏĻ/3цLW4; _u>T rO<yA1)*6ޡQP݇ YoeEDȌys\\~TXO&Dgr{4k>& 2ڃs]؄m_PgV^>ҭ%Ʀ0^K 늲Ҭ i%$@}! won(PM$FϨoXw!\GE$(P&zr boybua'D3Ȏ^9>[ʚd|BosȒ&*N0&HHaqT Q=jEh#U&{)Ȉ^\:ͽ I`|Qt5tE*F.uT]4Zf>Pnj1.څ:)Op8`<)_ie-ss⼫~MDeT,K;Gܕ4Lx :& ?E4LyVcGE9[Aw#=^ԅc9ݪL_La_?#2^<کiܛHn{.b|e]Z&Q̞R= KH PuM ES%7eqy5fMG5|69{:]=h_\+%~aΟGnB6}5ͦtx :3|7Dm!8t|\DfZfJ^**S^@2}x/jF~ F̖r>z&*l+o\pFi&m\1%,jo r#6taH= cۼ;]awyh7\]1|Ҍ!fwͳ^blc#_1  #eXcC-qD`TcF' ;&{DP#V=D8"*Q@ } PparNM.|"Lo}?i>$g6KµK3)TXc W=HGp'H\p ;0ő" r%/{26\rQYapR8y8>4JǢEwv qh@:śĤG$ *"ͭOi /E0-:;]H=hyї=L+&3׾Kp4gt ]&*]|>ܑIaoկ \.T -1}եqBbnEw@[:՗)Ero$D]JQ GfZ2XթzgN˳[?Qm _#!msEɡ\z4jrAd8rqi" t8|6F (R4>n=E'7}͘E+?n`]NQrV1X?@㽺ub--K.gZaen?cF']-`(O ԩcV TNrD =YgSBxIAKCdEh꡽$ 3E:x5\{S7u|(Wm ļ^{srujjswc!!35yܡ jj:δ c"֔;_HZ=wIIة܊($K(fRMb;JjCS F+mg.=*OڣIM:>_Q뉄gBW\ >UKB/ܧcFB-2k[OA ;QaEND0S>]qj)b$u1@ɨE>xz|toOu׷|wS5%f?iOO+ƭ zÈK6ĕF&B<)PKyi/PKy.F<angular-1.3.9/docs/partials/api/ng/directive/ngReadonly.htmlW[o6~ T4}h#k Ŗe%JTIʱ7;h9i`3X璜ƈql#]3J6&>LerYSe&[qŭoZa-߈U+;6^N/__VF^*\._}k}IR۟>2ۋJeZXinj2۬4 cӬ7VGmpWYcT3;T RlЂB jS^Z1bݬ=&eX9azbGYG&fjڴ^f`J#e;hQn\n3t- ſ8J*RAc,>P.t\s(#8 "`j)gz+g!%9,ai$|"><끯nq6=4L;!Ad %/- b'*  [6[4G6&U2PM8;<0h YlK (*BRNۓWgWu4iuejހ+hIYјSG=ѧTйI@ƮuY\@@R|G-7>6㨚G Iu%w`kO6@EKA{Dq`D| K7ܕI^eC>8$FMq0:m &*zDRLBسZ=o3Ic Gssw]h\McCXJQ31P)h4 j'#$' `sI8>0(vp=1z՟a=z`=}{>V/+k߽A! SDF22p[| 4FdɾFxgo}Y<1lZFĦ`S0RfGUȋďf6GͿPKPKy.F:angular-1.3.9/docs/partials/api/ng/directive/ngRepeat.html[nO`RBER֑)JN6E`˻%|{'q}~3{w$EJ"w;?wDeiOUUxae=%n5t?Gؤ_nǾLb$6GS]aV{0K 8ٳ˟'|]G-3>ݳ*ɴO(ݵjV߰(JӉ l],mr||T^}XO{7yUiAb\[s331lXŲa~tn5yW?cm&KSSFBgnn337)QZmO&)Osفi*뤪Kr}eaf}|e tq,-Gq esri+̞]6"31(WTA}$~1}ĥ#$W:WZUfUd\N-yVx,ze3gsZS㕻ɕO\a@aY`*sP׺z=[TxDRɫ)ว4Ss;(ә[~\z4`1}SLS VeI\pen M y|a+!-s.W$ @Fg?BNR]|x0it,NŔc"˰LU7\Zh6̔p8$kׁK]Awn>'@ dd2" NFj9<= ӅawnK_cd̹hxu06$|hpOێĈ+XqriH_ g1'ıOΏQ=J?Ć6x/Oj`zCgtoRW!ڌc,+.tάszDQ1h[7@Vۉm= ĤD]J̨ڛyQȏr~s㙯}6{ C ZCb +7@!c}A $DBDAAB!B6={_c BrA cUdU W7&>ٯH(\ jn+(qfkJHeM,]Yhdi ` M9+awXitL8[Հ3Z@7ܼ^ұ J׿JH4٘_Tz8g_NG A&ޜ Ji{(%& 'hj'  ?Q2†x (l6e(jg A} C]]8|)`ul7{O`_c5}G!0Q[J3TeNvAsqe `a6u&3_̄1u1>EUƽOA]HMY(yo<׮fEmSD K){NNJu[M;f+zwsPT%(;zuPC2:㺮FE5"JDΗ %l%30PG[\UЏu*I3y2& cckj}5CYx/ Ok[W# ~βNP*~x[Sn{oG=(I a rT % Qz_OO3-1V}nBV$V-F=$]nJK ޿euY~OHd.QC2"n aun?Ԧ~~6Jv"#[$ iBIxSRX WtCihri/qv *G5*1"~JJ`Tpj`h^Ƈn> 'T'MLޡtx̋w@$rb!="j!68?{ ~1Q:r{ Y #qcv6(V=BH w\F"c-G{]ۑV>]  Z&˷VMT |rR0#B}q (=ڵ?5. qơNؘ8V84?3:8AMÕ s IB&.M^E(߅Swd=.dQvRGƃgψ.݋wsx~ R F=sW =]n}$ſs˜0??w(V[;wRY*^&?N^2?K cBt탔_VO%A(Lj!}1]}C_jC_|JraG~WݲRV)ڋJcp 8 FH9`%Pwtl_We hH?jL}9ʥ2yC\CixzgRm8Mh z5\ܩMvɎPTꇏ&:{&YdD[Y*1" ʀ1Tzٟ*iBU^Ή4be3wuR7Bv)3Yg8HBC84wz֏m%m=y"C_7C|ѵ9*0 ׺JIbĜD7Ayw]G@ uNs4gyOg~l~Di:`$,}{~<^ ېb6 5~'x$hس{f{.n , HoמC~W?N*7b檃6?PKV$1PKy.F<angular-1.3.9/docs/partials/api/ng/directive/ngSelected.htmlWmo6_hbXYCvkn-l)ТFRNa}ϑI3`Dޟ;s#֫ƹξͲtM_.+x7sD-];]/2kd4rr'28VX7bUpBԋ/Nja+#Kr{G@X./>U[:HI +]Kߴ3revS9Z=h+Z~#TIu%I}R6Bɖmu+$0#[đg;ϴ*xp,䳖  +>\NTr-+N²V;fğ=Jo09:#@p$؎gZ+[F ;}0n_9JDjzx[DҊis͕jn ='e(K iwd%Y`)hgVʶFzqn6^լLi6|G,DX G'k敮=Z/JX,2h< T ݨhJ@2B:2c|T-L$?8$%S9dgg}ыӓ M:$jugE݀#IYd^*BQU^+] +:R[ť ))'2r)mPI ͼΌF RN8.AyI>H)PاF;f!#C>j’d%`tڠLT:u豱BؓZ]cԷQV$Hf;64[&YJY@zH))hQ- x`l|=;N&) ,;GTJV7Dw̏#+FP{Y߾>^!f}pt`3\p݃7}ے˃gdY%O[ BLD oV\+nٸ)!iLW qe,؈|˨:PͧAZ0:wZ&$u+z%5i?&Ʒi1vCZ `㡛lxҤkyeVM.u_.~*oN.]7ԝ*QrU7TxVei {oy'E [wUT,^>՛37*5/m;bsum+]F W)9[?'SAnM-$-hN;C!K1T7S~NPJRuQ=КYZlAǟu-yuʛL}`u]_SתLkmN|Ti5GT $t#6k%]f~E|tc ,>ǵN(o*P)L˄ gtG[ky#޼BjXQZU 8Wwm|J GK:8&.ArfM,qIn֬Sbs{)^]]y=@8ݓ.IJҍ*ǂ\ ٔ*Rjr +oa5PjLQoQوĦsZr}%߃WW? H GmVXrZ'#x-y ~g󼅳@ŔEP4-LgYJ@pnWmJ7eE>YN đd']3z77 ݥ ;% x#C[/ictF)<۴=q_ cp"H(,^!iG4 9KQB;|͞M?HC ̆D[GJ&+VI"뽬z.ty9iHgPjt sV/R[)pt&B8yT:zlQ g@XF]HVwr~&,ldK(4 j=ϻZ9oh6K:5jB0KX>Jt?{qἭoi>4Z8oWT7p!WXrlgo hR!~X(X<7G-B >kD.apY=en['ltC8"A$t9[DQ_ނ flȊ?W9 Y֦s{s!(]hՙ\/i{VnE1.JQ8AAʓ bN3}.=.P\ޥ9)9|AKORͽ$_]``Gd8Ie=Ѩ 0cM`a& WX[ބ7Qk`}XeP0Q+TVI6) P!ja@&OG)<Έ \\Hg;d'ޑ)b*$ϓ<DS9L,hf7AMbZ}7|Eq?;[Nߑ-"$8d]!$3FqغN618O %|H:ܺ?{3e ό(;.!O N(g<@|=-}d8a(R-wG"Ay-d$E ScshApϧ`Ir0$0)˃*J0U)-3thkk> ǖ3G ɜд%3G:{fewKSn=% Ub/p|h0Z(KtbƂzѻT#2z>sHe&, z[Oj3:~DS F]j*|>ʎDǜzAB2[|mj-5DUS_ΐ=뾹P*7{x09uLߟaO1Uǖ b2Z뛆D|x# r6$xD^819^KC)!WaR>΢=.g.b=MWɓ<2 F 0aXT^;Ⱥ4@wU9IY8cO{q:n8ߠZyTTPqk`qp?]')a=j`"w_d V4̏7Fdh!&eU]}e9~0mI4_IYv8c\#{OkO+ a%އh /x~JaZIssqWZԊhc2yli:̌a [kLjY\=K\yNr8ˆCK)[C;zvvJסW Bjy]:-w Iɰ_@GU~A' Opа/0_&GOPEܓP"qt|R\; A^9igNb`6.P )w"+LfX ZGǃ0Due˴}t8s[=; 0;H}{)xK()Ik=!1ȵgrrGz5cE]wg0r'JUl _PK4jK "PKy.F7angular-1.3.9/docs/partials/api/ng/directive/ngSrc.htmlUo6~_qpPg}Oe  :`XӽYBy{$%;ޚf щ?S&\DRT۴0mkigX*eJB(ł$OܠsMi S[}ww7%ª-y4GQsL -\f[j_YH{35Wժ0-cvu&T})2!K,bL/+lj]ubUUӿ|?iվ ٘QV,N⒙Ҙĝy#˷Oy-21;wپ"D+G`ck_'j1e&N aLۙ0:cNR0#ev>.8=xK߁V/0%?_d"zlrbO^jBiеݚf/8akAi ;5 +xzFx7p-)}mӲ@n㡳q$u7SI5S<),&DP_UG`5(OX̃͝hj* n~!K6Μ`xX,*Z3.GHX?~&?b Y,>+ϋa Oΰo,{xϪ3/x@ W9UnsV=?N^u˸/1 !}QZhC_"Oӯ,7kBFsǂR9a}σɸ4δU`2d$YӍʿҁ;)ӥSl4o&lǎz$f2[_g55寃|9B*O=fg_|J_-koRVB(!d2BCi:'B2? ;8i4y;X#cxsI#x ژ+PK(NPKy.F:angular-1.3.9/docs/partials/api/ng/directive/ngSrcset.htmlUo6~_qpPg}X/K,k`ÚJȓe#)I6Nq}ߝ2 &ܭߥil^K;=ӿR8,uzD,($u|nKS-77w%ªy2GQs Lr5Z:VMgvtgj<7UaZ8[9uL!{SdB3e.{1׳A8N@zg1ITA`k5cZ5쑊4GuËVV^ҷN]rq ةg& օg!a 46i&:y: O@AxbOthnF~5mTSAvwohaʃ$i 16~19ބ0+3tXiC7Uj|<vXHbaNnnUs0Pv=>9ܳ%8! 76@ I?jnu9#pxK⍗zƏ5d;sÊ ?2qiuV}-9t͕HiwI#9#NS"K ,#h0(ߥM&kO=TALlO~eΔ?6\ vz>]L<~ZX1ĐZt† R&<=#/#tlO<k($SdZ@{l'p/'2kX*^y^ȼ޽<PKHPKy.F9angular-1.3.9/docs/partials/api/ng/directive/ngStyle.htmlWmo6_AhbCYCXn(%1HʱW$'qu6rswTFI򸱶3iZsER63lRVqOd]N+Yin}ߵZeJ3篟T̔ [kx hbIgFaTܵ&+'{,F+Ў5,+Qӧw\Q–ͩ;āS꾴fDVłKe9n.8_LF.I^02D%)YOg9Xz@ϷrC-d{ہCPCU0KެV`ר$?\0Z&-@&Y Rc27~Мo!KBCtrvr۰j dn`k& bF]W˨|1jqYX1PTg!iACbi{7 {_\"9jyGe[!Ϥx"!`\q8!0\Є@BP224S!׺|4҄k9 mLC^E^{GdVMjf)7jALϽer i9I8gPKr) 0ԡ0H;Pahpp9(f1.OI}-]>*{^t:F(Bh[Sa03amPǦ|lq˥Ҁüp44g(9+.USY+A^L%m%`Ul.g. ZZK%v^Ai}lCWFa ([x[=ZלZ4JWo B 9K˛e:&?^q8 7 XD:=^MCs9?^ fcqʙMxSu/%<:je4Z}rX\9܏D[F\Vl4271NE9af,K-.B)ns6,`q%{ nnpҬrϻK)xi{Hd7T F@guSlfcw3Ѓ''|R^uM ݓ!1_ˏ;Ե0qz ]OJcspgS'0Й% (>?AA#{8OeJ;)X!8 ni{[Rz:6cm" fTݝҨSr/0ue3BC.vBU+xuHW#r(O?RݜV" v{a#^";bjI*-$?1I;P8bTt$. kƅ>0|q~Fl7 oIr"$84N<튊TBu. wE;i5ןt+a=J_?TK 0%kK줔k_VQS,?{xx Jm[wsbvG‚) 0ȋyhf$FFMtI9fOJIfԵIy;UvEVO9O9Sܥ.@> h4i'rɽiHp `b) 58ԽtQKRV! **UvqbWpi%-E•(—Hc˽8E&U򴶑Ώ gmtLpR_oU5Qဆpv,~8t  Wxqlg"sg|#]HϦM-FUgT gt2z7 ώ— #Gw~R3O&[5 0EטU4xs?×zTӼqoOIQCKMRm{̚x=՛k:31SdmLn[; xzڒS>M\GZgh}^%雊PK6 PKy.F:angular-1.3.9/docs/partials/api/ng/directive/ngSwitch.htmlYko_1Pvc0I?%:Et $ݢaDĉ);J=w^G&{ьR4i/l-M-\m2^L?(ɶyz:uVH-r#v%i#ږżPy; _xvR6r)z:G^HΏX^MV$D-MMF ׷G)ejsx^/r[GRJ峌/F}F C5Rz5]U%ZKs_cORDC~myf8ZJ$nf N+BYNjYVmzb[ktN VkQ$l kh}%%,5ۨ ~C~IbeZ@msg! "1R|~x_K 1P~iY׊^)Uuo/?C2i*n[rڊa\5F#+@#FԦeHj?,ɲ3vs?KQ2'WbŻʄh_VUl8 Bo!7 *sn[6"+IFAt50]ʤiEb;Yn$0LVy☕j'B",+V]])^ "lŒ4V=9XRLB>KZؑ"`|^lPmV.zo;J6ȆDg˫D&{}La& 1 + [+KEGF  ڍzŒ^/\zߝ2VLčwF2cDFO^'/ v-^Chq_Q+Fz8H !k){%!IeRzsu+,d .i]@*0eoWu;ZRJe24T\$v~t9O/(| A0NW g͎#BL铷'f1܌$12WּeDJFhBtČH7~I4>zZj/c:pr.և0R0}#+u^m?XLN=%) OE>l`PP6rg W ֔'gkXh@;W P,7"GrhxU@ЊͳxF,ڮ "ϻMT p2/~s6~o֍pu'NMC8:uT5 y>ښ9:,PR +yӈn[7o"y[]kXC`䥬be" hH%&-bT ~:2k@* !&hA=(lhul:3gQ;!s5ZFa_ROCZQ[oUE,}Mlx&~ȷz~ N9+gS);\KnX[0i:ɑ0l{\52Ax}@+Z^0,%gf[Gɒ yIϓP_$3qˬiP%@'-6?Jff j @,/p0Ƒ%Eq:JB1G{ *9:j |}6h55D= -w}|sQrݲ C1#q=FPObs7N N(Pƶ  XUTciًZMlĝ!q/n(.T][R*Q!mbR,RA Ƌ7=`z A1GUW_ɑߊ5WgGtm#fJ*:\hwA]]ATM9?.mXN8dEK'a> V X~ZƄ5|>u!nl@"tI3.wM|UԷw^x_?;=t="ˈ*v0д/@KA˭qT \FALbA7>ϟݝ ܊RgDprZ|$yְj1hyGؕZ]A,+ػߏנ Kqp`#+6WӧK ϧ>]6\i:<vr%1`=8q{ڐn$;x=qSه?cs>ƔgiX5/d^8g!'ʻS\ -ߏzL6Bjs <,kTk//ƒK_5]\2 ⴹadJAW/N0~\*(eQ:¾dݣR'';&1$B}5DyyK''˓cv{W/N|hnpRTsq>*2u? O8%׎Na@*~f$%>"^CnˍsOo(<puN?@dyKC,-LΡvPfo4~I:qXأ!N;h&&ZLԨ^x l%~>ص')m>-,ij dU[]{[>? }*m>+Ua31oO٠yƏ[N? ^ђrxOPKG wPKy.F>angular-1.3.9/docs/partials/api/ng/directive/ngTransclude.htmlW]o6}ϯPjiފ6n@aYТBQ }_b'ik L~{.=hzz4t!̲sJrL:Bt}<>oZiH 97breS0<-T^×'o_y]pk1gnUȗŇ#eV#ZȪ)ߨbl"¹d!R䪤mdMf弮']z]d*hfӯZQXsrbi: z>ZDOONAk`UySB$3kiy wPd/$];Q%nrh2b$Em6\7g):Q (%THX1g^z*9C>4_Bs#2B!6}1nj2YۓT)QVڭWRnL3.Zd IZjo!$bcN_ N-p\,!%͙41^-CGDžC\& B~loz9,2%Am!?[+]1yE*-̖$Yk؍ճjZ[$iXHfGkWҰGBΜ{D „ySBhޠ?/GE# N@vTem9kJlgҜQ~ s~9= {$u TE!km}1L<4ߏ dݧO3:QG0ɅMi@CH:a7٪q@pQ)2"&wٔ7zpD1ͼ(s?ta4CGzSJ+|FՆj%\~k.XjYhՔ(WRBgۮ\#ᘯjA`mU['ۡӚz>h%%kwS ZaE_W.#4ɹ˪nVNA(捉?m+Zm#& 5_.auٕ/9GC꒹7Ɩ`ВnȦeYy4 BPy^ZQP1>z'܎G'%t?#Yc0QnH|⺭">B~xKȂQw]Tvx\gaZvi [K,kCN0 {5/˫ ^XF9щq+'6o* ~ ~+ c.!G5]F_eFU}nselJ;UzSn[ur-YM^ͿJW ˽e 9*˲w?_O4z:S)1+пuz+bYx.٘}[6b\f&rsd3FK$I'n62+U]_)ȯJjyblH7/c݈z#H6(D %2z=+xT@QR]ˏC7}ۣ֩gBvUP  r 6,ESJ(m#{ "q ֌ Hӗ@[!48Oom{G'ItB&`(f0)-x뢣V  = ,[o?MO肰7pG9nb'.JdPM=Q`ĐUХnT_"j}Qy bN~e} c1a.g9^c-?*K|A E#Z bç"j~1}.")f@Ơc_8E©IH7Ϣo(6 g7@ E8n:ޡ|Г?6(FSxZ,uJi?ξ $CA.2[Pk(艽\'ڇC{S!ofq΁Xcw3L5!0F[YGOyc5g sjƼWG\;{n˚a"׼SwN9˹Sl}*;Fch!bjBM'A.۬I+]R%cXQ3"=kr%ƲVB@5('' 8KҫfĜd`=+deo8l9=ϊ6F4IKԖPR֪aՙv&axKXwfO}uDz |CQ`hIKj Hgd4!e)b[YI\Ix/jlVEEc}dC;fv95=Z;= #^#@<6ԄdXg {MS*3gd fbFIVPi5;yvzyuu&ItҹD)`rTM eU಄P>OJ*"MMr+ !tl#?;k,9!*cDPLExFdmV7὿&>0dB{g^JY ^&?Fe6=؅;7 2F, ڣ>>ڰ. 6$ (]b,;9~7yO{a9m-(U_}Y*Z ;{7R.xVNݨ%9q2X|A_LZt,z/ЄHoZ;gbfk(`POX~KܕB@W/ń7ÈseB Dt 8NcУ>ch@O`Z~ɯbzqy|ps4焾|y^"Q6 ;*m'LʖeQ2|OȖa,7Y]'\b;zχ&L<}"`fUJ"^t"8Rc dO_ ,S-<(H k'&"A *Ck:IEXV7s;Eejm )A "[8y e8ҟN3xb.Sd(MXnG(M/\ʧ?ϔiFV"1)E&sd{Ҋkk@iGSxwQeJ?WkH9N@^R/e 7D= ;wd 1gjLuQR)JIe9,+s wû7LA (MfoP'Qk#IN=nH%a `YFЛG܀>i3S>!F.-Zd".}_XR%gpkHsD#ЗlMQT ;A< 9ŧc"T*aY^RZ{Su1J(H`Tj Sl+g-x}ٟ~ͩP;5pP9>#660K~OJ\)Io4f{G| pvm'"6"qӷt!"Ϡpn' 5}b]]urlvQ=N,uAΔ %]5Hԡ9+أxΐ+$!8!S 'Z[_yeV%$O架E:_SR<:ܢ,ϾAC &ao!? 2!!SpiGJ̖ب'͋lARtEm]{惪m蕰5]~{v:B.F ppƽc;D)'=0M.!E NQy+Nj +AdJRB9>߶!* ttYA|xJHzd"^~ne6"xdsiK|-|u͉/Dݾ|8w_ k E"d9x5J%k%4B㪰Srd pxbH4',6u6S!5jj[F=ih}*`<@F +sOzGl {ӧ\`_+! ܾ$T4܀oddW=a9j2GBȱC#7)+LjػF^2 TqR^P\qǽ3_ J9s4 Oŷt/sO#$;黬79H>b0X?\J]ƆUS{#R [P1gk8̚24{=0͖avT"R5:_ܟrO8KtC?5W(\ewe}ypr {^{y,ABRw6F¾Eғϟw1 C:0h->  ߛ`o-,=)MEA-s_iYh&36G>2؏s 3s`]Ivޣo.qhسH?S{!Gu7]i}6!RU;͢smOߢIM=*BH;11W/U =O} ;Qޔ]@ֈ2)_ mab>`l %S1;pkzWiA4߈]zTAVFԉ).gV=;{۶}Kk(D1B}'8U!R5HNb;WpE4k ˡa}[p1Tv󌡓(.(IK4ߩs箋-RsgŇ^K0!BpN7y@[l )}ɣN&o@t\xR?4nv>5CcD튔o^7Sˆ I/ ch Vk 9ۘSEU6?Zv`X"u:c@OM!,' j_)]D }pgA`p^]A[*gzSð2@@mroE=WNBnpu=*8I~8OcRwie@|W9kseu ~E^OW_ EDã nsU~l} QofZ;mp1[\Bӓw.$CVޭ6ψ{`^p+PKӦ4F,2T/R5_d ր %1 %Mf("~KOL mCB4nGfʞ|ud8ţ(q4!:C{y].[;Qt=yV4,F-$DNgk!̅UVo3UH8A59{H- br'9{ɂD7OTHwB`5p`@KFƳj3Ϩ v">C:$, 3C](oxst6nM΃wJʐC$~# -[QksB|uN1|Uވmo'G(eE4x3MpZw!J.-nc6I&f^xxf/x:mN#L8) B_ׇ'.4'q;ui|oo;Z'=S)q|5 j{PKom$9PKy.F:angular-1.3.9/docs/partials/api/ng/directive/textarea.htmlXn6}WNjhƲ ) $N_>pY E*$|}IQu./`!̙! ZCˋֹ>FvX+\5&=؜jlɭr0T9\~p[G.j]G6]>|&[ 4z0xT-|ϿJrk/NDKa _q=) 15r۷ҊMsVϋ\/,Zas]9/+O}gV+ABՊX?HѴsN2v hThd8L/,JR{zxD(T3+튼= Ӵ4PSՙ1.cXK_&bBN׃$2dR5A??"ײQhZn`t }ի,HRG1x3Pr(`;-ɜ]jR`힌d^FK6rrbwĸE[[irQ5+C{TECCW"6tO)L @ibϛGȵIhC w p[&iE=^̴l 0+Ǵڎy8 [!Ȍ= wg,*]Sy,y'猩&88hw>} {շBWtBIRk+#zuPB$˃x^ylxz 2y@NTGeDBf㧑VK >,~"zFwu 42&E1^ǽLrm9Zih^m{丐DV俌 6J 7C5GKN~85 s]\7c~/;;ZƙZ3n|Nt!奵QDW!fr2u P)+@\>.r< H[&n`fbKm:6(/(!)a$R}G% w%gYdܤH;1ڰeg>}1cy3 GqW[#AOƺ%0>\Cc>%PќC׼,h׹}gaETl=O&7^T#C ݂ jFB߉H62jORTkp8`搾Oc3E +d"T";ĸzm?'O;3X^H2g'* VkpO@8c꿡MFi;8g2©.H[Q=|B`qč~P4%g+wַwfʽevځćc΢5j5dx !Xa(,02"}> +~$ %qko3/RHK.k!e>8 2p[xN ?= Dq5w]3OahsL~*noPK^\+PK y.F*angular-1.3.9/docs/partials/api/ng/filter/PKy.F.angular-1.3.9/docs/partials/api/ng/filter.htmlVMo0+FD,JA"%J='`Sl¿ $9ڨeg73$y{^\αJV%(tͅY0 ~y-Tuڋt8+ Z?Hrx񯹑J:Yxq7Ztğ?bUt NJrFe"ȵ :A(,z7Ʊ:hiң\igRӵ؋p$I8"P8\I)@PX̓Gv.pAGE5Âj5߂j :*NԨT4#t;~OCf/!XʝA[3{( o a 5Y]5^"b7jƫydalAg`ncNĬ^]@gi0lm7`\ ҕOªHOtC+Jv)zQ^M#?ˆh_H6A$F,LfD[ ? rwE;ޣL{3Ft\xk LQky)IB.r);&3cHfU'-%tL&'F1vZV;"I8OCY{E5a5qd%/=3Q.ʼ&6_ C4sXk25h48(vǬ3 )Ea@ 4a^hM6Hؼ%5bo}8w` gYs{㥯e!0Ցfs\AQ(<]lPB/eY]ƦJ"1X?djxb\ nr),'{1rK$v b2!z䭬P4-}!syUӈ^,%4_6X4zE\Ԭ8DKho>mq@]_8-kLw`S5}rt)׎'j E0{ZmK_aO;n͎ W` Gm \M᎙3ip[2vz%f붼m#DkY9`$6 GZqB²D_] - J7uҢ:2z [ 8qO,7ڴ! [Pn;E/~!$LCC}`3|ܖحk !1] d%DWPHS9df i8#ZSӿf˄yɴq^+ =T 7 @hyڻ-9fR|RT&Uoa:O98]+$pf@))B$T*M|k0)H Q1ndTʔJ<;^!䵟_-wҞ|$9{ѝ[Otpjps1sx@7߀ҲCh7,=kn 01$lh1IWb: jE:rU/PK @ PKy.F3angular-1.3.9/docs/partials/api/ng/filter/date.htmlZo6nZ_^:޺KtbI! KEo$n~IRb9v_Hl"7>cP,?v݅Pa1izɢ8x̏Ձ3MN؟ /T2MJYҩVQ0j dHRY/xe.Ig; D̿ {\6|\Kz߬77ug`4hEyJ!׈AE \$sVS"BxsI&󌍺&~W7O2Yӥ}yJU׃f]ɱ~\Ch9Sd;RA(,kUwUR)|ҥ6[F&=(ڑ+i0ڲ;dMvh֍0:ZӉ͂7L_U!F:,E4f= h4#A!*7M"g G. rmdy!e܈*s.Rs#ehmhАÎS` ?($U@*+UC]KC0.S7imMNAۨ`Jkm (54P]CWH:5 "x8y;jJTuT؅g6, w4Kg_,fDkG%6p!SO~KTNW=ÎmVv CŻTmk ttkA6Ð7hىLjeN~4y'.( cqIAs86㕛 gf@pɓ^޼FH ,6 ztٙI`(y׫kO $S讐3>rQBߦS 8\Ӝ% j\/ZfYӚ )39r;|֣}Fզ jUj}T1{$ay4yqR(H4HU8gU-mR]8u6cɽ@Iwr(6I$"VMH='MJ /CEye!ZꙬ4L79l΀ROo48t01<7s4l{ O>96ΐ >V԰/qW^P G{ &&&)5Ut/XJ56|c6^a-RC&z 7f8A_cpHW'4ɧHdn]AY2Y*>{7#E=KȑjԶʨ)$/ i }_8D.2RϡKV/'-k8*EtEJ,Ep;Hy݋H3t!$M' ߼ G~MU {څ[\ L~ /(ZdfMM"}g߈ VO=bZ#vzv!MvL/6=ۚzAڽJNjJzJ%K6~Tί k7P`BZYD:t~YKS誨aw_X%ڎrlx/sYUn uoN}$Q&La* q &*G?8ƜeYjDߨRVD}E*ShV#?g|=;GKT'c9d7m6ku12P1VlTEjonuSˑλ'LR%UR\LFMJ;xd"㐱UۺR"g*eXa*y\k04?#Xeԙ}LU퓱;:;}I:#'!gFYQ̅jiļ*bʪɘB扨 v Igs7Eq &cH&G,ӧP@Gw?jYf*{h:y.($~;[Jڢ:@H", ^Og{^vk^AAp1u1MGGjQ/Un7r0݌Vp)k;#c " g+e:c,'c{yU#(+u!c='vV$+G63/ v Cqalv |:LX;Jun,a=+1T ;A`jͲH3'e]U~ӿ箧u@Fb`#SB̔Jļ:iV„A*Qo~)hRSRDw6ر`׳*`1W !Rڀ:":ai!Ó?9q?=VH"-` \]v@˺* eP|]=[uiוhdU.^櫖G [pJ[e!^ .4QDzܛ q" 06 y~Q+`ă `~ 4M~,I|d: v b&dȳɄHWyE LoZ$F j!EϔgS\ue`x/ҜMxPi\Eb_SNd]sxNĬ-bo(mMM5kuHLehm"[ōxQ|@3m+v>]}9 ,T6D~B餾֦|IQ3׹PILY*|Tg¨'B# $0߀VQaL5fӶ_l~& uk'Hl2nJم&?NՀ |Y>p| قB)^] R1Y\+s;@ v9tw3e: }.z(LZZ n mO q7a[--rBy4=G}rȃy DlOfkAmA0& <*vԸ ; y?[q{S١Xj48@4[TwP$AL.+YQʡDD Br-<(.jM] 2Oo&M!m%NNOߺƒ)0CN_d Q줏V0Y5Gq莎f|k}uC-cT$d:I G F B(2 w!W~19sRJSfLG^f_cY˞u^i'F/ͧ˘N|zٳ]'q0Pr[Oч_3E@)|>zz+D.7S{]1:n&gƾ[:-k4]Ğd/ U = ش{t;X[qlJg}-# 7Z@Զ"+trl\BɈb o|Ǜv;%Fz;NսN:)fy2*"y5l2삇azKZUGNL@lV\o .#)!ĸ4i(0P b4t+oS¸+/y.,WWy[ȰwCµ~BE`bZAhŁ8Sg `\Pğܴq'!~e p w4-;tH0vwM6E-; %]:t uklvVk cP/Iz_826޺dY"y[Dł(ΰiy5ZGfsu/,np怿7sKHP}7t]v. _s{{ۆ`!8hT{8bǺ51?mӺ+Lo.}1[0؝8xi|9P7T+vg²t/ͺ3Z+6xv5 0!-[$=/7Ǯ qgvkfs^OO7 _o_PK9] "PKy.F3angular-1.3.9/docs/partials/api/ng/filter/json.htmlWmo6_qP*+/DQ֢݊5۾hRJRn}w$eq.Dgx/Ͻ&g>8lY5tR6c%3srm3^ ͏'̚2Su6q^ZVJvtm?;|vrTq[1H.toQ6O&/^B)팞)M;#ZfE."_RE׈R+XQ)Yjj< \#,eb?wGtb.Ԣ%25nܶ;{=[6SleE򆳊 DLcpx$ijBIAA˳_rL_pP R)x)j)H}RIBA^r‘UIjYgZo'D 97+.,`ӀI3wl>a^vBw~1$:WEN.|KiuMφ+|4&JSt ޸3vD#k*TE7P n]$ވ'UB=p,9)~BDNBO ~xI8")ex-P2oZ4'pc%ں\E ڽ5;HO_OG!M (2&t ʚ42ؐs&Ѹd@L)_SiБ? ?* K-(P}.3cYU@M\81^S2$Lgˡj#+aHm|q-Fڷ&1kq7)7?x.y/%p@mSwdf3< 8t0d8,~U,ԍ[):nR'۝9&'rֵg?' 0ly<)wEl@hRE;>^}1xןp5hQY8vˊO7dڹ Dq3Lo0$:暕VTvK&y2b-H(o&kM҂H^rZJe6ۥ^ʗcasX1ᏻ\X%Wc& ,NILE`lA9&jzPK~q PKy.F6angular-1.3.9/docs/partials/api/ng/filter/limitTo.htmlYmo_Ahkbnn^_hDD_%Kl# vc;JW1D^͢"JW4f=|kQ̥y(К'b׋_ϯcJ,E]G1/XqW2/b#ȁӲ9Wa d2QX^xV |~$^̤R(yx?,7dwMHyHβi%si{~-|*Uפo} RcQ51'^қP ]?)m:2u%"fR(ʊe dL";2J&ˋkW^k^VB0L0r3eZidCJp#4LxU-+*еdRPt)""fWbD&rT]p0߀"g./Tĕ6>sa54zF$n¸^ j802QlTZh Q e}\d ܆Zm D6& '@'Xw>xۺ"+,ݛÿᭇ̭EQ?<=[bp0,a`*̥?lk cj6-^^AEFV+|)M##+ʺŻ;'ʮ#9GR7ܖY}69HE` 0Jzsy}ʛCBc4 c*Z2 V)m>lKx{y6,'q*-q:@%[@0nTMK얠WkJd̀T*["z=^H=M7ވm@v!.K"v=?^k"":m|4˄JLa%(Ĥ>6[B;4f9h N0iD m'׀NpJ,ų;4mGkEuD۲320Y<(H&"!ba:#\~Bh$/\ "b`=D׀e޶ ^b֡^쀤r<(̀Pg!(Xj)S3}PҶ 0pѸd+-  (j[U22=.ǬVNNj܂9仦xZzup EeӨURm"=XMZ:nCHs޹t&6k[\,=a,5yֈpR‰bs;m:Y4|ss}Ǡ׌t)NoۭLϟc0)SY&*:HkC+ (&ֺV=l!fKd>YLNf&>5#8L0w|b:QJlxP.8hc}5@iLL18^tpM%tqky'$9[< l3" @~m7.ȼĿR'Aֻa^^KFy/|'`gwҭnѿ m-S YӞnb!ޕsuPoa;0LQ vZ3>l&j`'2Bʢ]F<މiC&}a'>d0$,l!عBhmmwV@$+RswUAja{yuK[$;]/MqA F9Vu͡kxub_yrB+@=Y.U٣{Y1B҂*^M(򜰶=j>͢LjxajJi/1-ARr< 9ϴ N'3eܦ0Ss&C="[%C[[2+4{{)\hnE$:wBƿc)v2Cus}U^Yˀ.6.a1$ة::1yjz ;9%iVL^_Yݹβ.`贈PKH"RPKy.F8angular-1.3.9/docs/partials/api/ng/filter/lowercase.htmlMs A4N?M'=%FERN2m2S$, z\]xKiboJi;*Lkwc3PUòkJG!`лB k+\+RXVWkҫ ٢eypfDjz:ER!hU8:ofmܴ7U)?2NUt"U|Q'x`?~)Ġ)^«LyڮP1w&Y{b-5)b2ɩ]>i|r˜g y!^1ԅV!Y6&_$ۇ(C:[nMX=)7MKጎZzVÿbǀy$%ђ=kɨC=FQ.NXa阜7nVԐ_tN25JcLbL8~wCX a^9F.[:?:O`i1_}aIuؔq)[B-4I{A֓=V7J.hl%/nZ tќ/R@-(Sݜd)_zY`*,;fQz7ZaÂF+ Myؼ2WnG)똉u~A d%%UgHaCcK[Myeiu$¤j * e̙6 mi@ը3+~biL@-˖S!t+1wY,Y*y{|KO07 jb4`IAMrYBSlҬ uchB'E-ąX̝nlW϶&()_)PxDfdiV4 Y0{;C%onz2M5ok*v2CQ~1K3tL^ F2tQ`U(Rg)ܯt٠7QCG5${gf*˥tUY`Ax_!zÐ8[\CQɔr080SuwB[v+2b]FhzF]+@ & oFAI i H(]ƻdǵ%l7#JȄ*4%- IfJ֎h‚. ©ho.;>6"lNDS@\iy'bsR)+0p`[fa 2l?Z-w+-"[oPVdeeC!`$V?@f\СLP2\ 53?4ʟ'8Ѓa⠝b'lx[^ +p5xoطk0'-Wq )(ֵaZ!l;cUo5h;:6L"/۶kvu-LN",L;=ܮvomw7Y]nNۘݹ9ٽw Ӊ>`7܇_ n(9U-m1}]`լn{.Y`Q'1Żb-J/dl@mH&Ҝ\E\b;+]( =D1"Tx:ҪyA!–нzan}"㵚^ ^鰤r*Ήa ܖ],,^Gu4I)j\\G+mw]l1NE뫟Ue 5U§dq"]$ps-3qr@9K`LX^/95hSI}>?qB ۳mݢݤ_ VqgxCEW\q۔*oʩz;,D u.4=JF![_RVނYbDd ߑ.O̶᙮7|_/#\2[ӡ]yPKC~@PKy.F6angular-1.3.9/docs/partials/api/ng/filter/orderBy.htmlYs۶]Hem-S9moKrM_r E$XSe^޶# }B)VZLWZ8^U,[2]V,2PXWhp,H"N*Ve)j2few]~yz2W嬈 MVp O~Y"rr"R} :ײGal׵&_ų,O,tZaG/Ыe0Q I X{%E~ gJUxwi qXdٺHmnYq•PF1ʠ7NZ _aYjhveɁ]. %RAI\jQj9Vӓѿ`q*ټJphwU;JF6Z5 $,q_--qH<3h)(s5pU$BntS;I]Dk[@bX%a9& %ʯh<%wԮZI9Bg7>ﬥ4JxMD2Wg Sڟj>F;0s4BJjtlr\ƵuY!<'cnƀ憹0o/7zxz`]y2weA囊uM|25WF6P4u97Wuh(Z:*Q~cy]hM)KhE*3=8*:^|b|*"Ӓo m@tW\)'L*6@.|h&4?A!9y]2En`E#gMrgy pHrTHsu\yƳ{G[liñ& ;_{"N[!e=r%Dmgk nA웝&oac1<^Gwפ55i5Z^h5{hy 5:߰YShWۻޤ~]6aϻxؽvp`G!7Yoy%οQM!5Ԥ͏PK/R #PKy.F8angular-1.3.9/docs/partials/api/ng/filter/uppercase.htmlMs06MʡTǁ2•Q-%$JNvc[d&Hz5mct5m0Mߍ@VղKjzt 2zK`~|{xYC^{dFPUū)Zy;@T:tΫN͔3+q֐LeȬ;cTQVJF>zIe@N Z^5mgBDJeB}Emr'[ ւZ#ŽY\!(/ON9Pc=yV?e=#~@]j" \ecBJr(ɸ}2u֤q4.3:2j5Gj\Z no.*KfV瑔DKE;aycroK||AsZD Qc)3ik෷?ͱX%>A\o,?gǪcmY<PKPJPK y.F,angular-1.3.9/docs/partials/api/ng/function/PKy.F0angular-1.3.9/docs/partials/api/ng/function.htmlYo7߿A mr NqIۤW'()vGcܒ\)k|<,9rAY#jo!PF,klr-u?O<];=U%-ȵ2/{qsح=-awzMve?o{{ /R ٪.6Y4NK7H.V_ %XlW/9ŽoVE)|hW՘WkRKݳHud, g%~m0U 'u&~pfTVkǝZ&A o4vc+|\;ۈ#x>;Hѕӕ Y \a7/2"M KEkXFAp|1.*:gFcTQr*4W5|' '^{kk}e'kѿXRO2N@g1*nOned \IOmqO$G, 8z _VſlI;T gx':J8<m1+Hpz[T¾Lm)CYB%h)RNTjwlDy dédƲ''{1cy`S5 Esy RFƒżz<5C _h?C{2R'0V +a$F|gGT>MUq7(ëz<" ݥ:)϶s5\%Z~g;p`q7M:Qo\UnzG1B{etZa뜛T;DrB(}^sez'ņ5Aq^U\ɡd.=֣::=Ɣ캶(y8]wGZ>;$ ,`5J/PW_4Xmm>B?Nu/׸#.(afpwF`Bh-dGu~Jέ.xYԪŪMD1"ؾjN9ew,8Gw|w},]I UYo1,gAvCSٴ]@on޽}M J9^ɏcMQ邏5 q5bJŧbDb< o/p+9t4YPΚs8"ӄŵ&'2AK bѵG0i+_״hfAVLcNl^9^p/ [3 "H"&ՄVдh<-"+Myd 2>4P/YvZeA#@k$$HD?mE}VW/kdk~Y1b97R88|\?n}1B@ŀvqRݞjs)4PK&-PKy.F=angular-1.3.9/docs/partials/api/ng/function/angular.bind.htmlVmo6_A $_֍0`@-O%Q$Hʎwv.VΔxwM,n&G᧹:glW]{eu]=vm|αsik _}y箳`lMoo^pF:ɜ9kc舴^4Vݝ5TQ$:*1NDk}? G֬YE[#7'S-81Xuk.: |?UA'znsAP'=h0t7‹BEs2ZOa_꼝;?[N})ynb @ R;J2̪&Y~vd ZʹֲYb/6_ Cy&1)ݲH;fPiz5C~txn)8@ Kϐ"n6Fi33;y }^*W"g+`2^"-eFֹ^P kUάL1Gt,VErznW=(4 7 Vlvx-L.:$.<*Z+,_~銈qLG"3=ibpmEp0ZBsc}F܎ \֎+}1iZ@ڱaVoWTbf_Bܸ)>&Nڢ~j{lMk2"0? @=^{=`OS~wP`))(K՜Ań)\d-C$_RE>ػiW(7Yo C.Sz #ˠhu~Ī05Fmqg|D<+9>e 'ij SZc)N6a&AR?R9zN)x4<~m9)qtyމA x+^fPKvA PKy.FBangular-1.3.9/docs/partials/api/ng/function/angular.bootstrap.htmlW]o6}`ݯyjhȖ (mC(b#*IKR] Z{::6<X;giRETvf/ڔ*t>L/|%k+]ڣxtQh3?zqliTAXn`p+kbq'EHk7zM J}g*m_RwbZ%r? ۟eʟYʊK]fg˾xgO?VI,+IC$Fjwӊ_6oDu╗=vd5Ɋ+8J/UCI2YS}~VF䲴>uPUIQW@bqЕN!x9HQv, T79XVj}q=+ n-T;-Z i-C/'F%,>Elt5)c3̯ڱ^KQFR%܄#(ei g¼i+>#.L+en^yRdE(dQM#*r/R('j#De"oDa"ZîN /aHxSoxl LR@o׈i:d%o׈jfF^v(,Cy-v!^sxk\t# ١3n/k44kMХ:$쳬l3[ƶ 6{ /~j(J]ј T'ksܶ'ٌ^{(tpCwF7 lM?LkNV-/~ GiȤF߉a\i9{b- QE|ӳZ_oQ. aMܣRt,>Dϋ4( ; {?uiʶ#~h@t\T^()JYGQػf_/|fnq,G4Fp&5oxF=c԰#J hy&&>Gr94jg豱Gb2Wfk/mFm~}Ӕq1f:iΑzqɽBju?őc^ jНAx#az!N4#Il4)i̶ZyXѸĎ~1[Uf%&+VyATK"'NZ͠{17֐ofJ naB4 fu.fci&QU0Sԭ\0^zYd՚&\kI8-a7 Vm06"?N-Đb  CJ ;J~i J` |ь *N7B[ ݖWŒ8\̊c H. qMPj1[& JU2S|$lP!_ (ϩr!-8Mx`ʌ+ŋˁݜL(bA(B׷U'"!#$.R7Bл`|TٟA t9630GާOc5.r 35Q+_G)J/[,pA-# ג&.ڴ6gXǟZuj[y&uaa@͵rz#ljV|5ӆ S wNC&Q\ "8.deףاN4/KT67|}ƧM¤GNp GdQԲVe qPhgcp=m^0 *٨vy8M0 )op0WNW$#dj7zWF.N؛ͺ\-Fx%QqƸy=W ({]I ?L$;W#w$Hx X|#tfmxn,{{w \f k#@tV;^6 \FF W8S22pVoU[}ѣ@Fٓq_f]wO:n.R h*Gk-~9ߟM#rug`ÒbjCWi$qM [^ p2#7IE$$ueu^u|OΞ]- W"-4x|Ztdwh]VY0dB{=!v \3?&P׸n\*`v湬_:p&kEPjC+7Lc~ʶ3Z?}jzZaGc?!~'`#:҈9`>>a!I )gSWM8Gj*͈& RQ;Vs =ۯQpyY=?xwOѠq?pM1qe/Mf>d*w C8]+̜7K`;{wk;";S! vHʆ Svqj~+Ѹ?yǂbk%}{T.w1ھCb1 =@@_l_:C/{7?PKpwPKy.F@angular-1.3.9/docs/partials/api/ng/function/angular.element.htmlY[s۸~ׯ(̘be7:͎ݤ  h~IvYYX ùÂƊg5kn(&墒>߾\.Ζͥc#xS=OO.O~~Jʕpg:NX,\3V*ܛgrZAVn=[2j64 /k_\X7ұ S9_W]]l A0N{j+7;r4&zE][+-8aEi*q_a5lՌ+ 7by:BY4|BK/P?Y Ǽag>95"VNxfzNOXɕ{z:7CED+O J3s]Y"HRNهwr/!{@xPu1Z!7pVZ\N~4݂0 DF)C|q1.@n3lŠLz@~nYpEl6X ۀnXuè 9aɶN#vL^1"`6`Ns=%~UG+[,JzWeᅩY U+4CKx 3ne-X&k0v51ڮA|qn^1YjZfDFPx\0 % 0*hm*Hމ%( ;ǫ꜒|/9uZx"IC X#͎u5"P@W\׶^ۛ9bc-,#&=Qr!Yzck˂_p>l`҃1|Yh1D)E yw$ܞAn  g#K;EzsDP-9iEEϨAR4كxU8(in@ #nF C Tv)7>e7qQۈnyxo09F/~xW5c@0a<2Ə81n຋Ym6xbfuKtp~`jwOwmm0q04hLʇTB=+,reC 5۰:T-C!aCBX@JG}}eP_~PoPM1yK n~JşP6E#VY_W?\Kz.{ԎHj4Ń A՞pjBOh4HpETPQ-DK8\gJ%еܱS[QL A6TBF >Y@R]O|yDwmje_U;20b?t@(c\ 5H{(pDSJ41RyM @T "tҾpz(Uf%~RmpWѼt6^FyR p#8 G +[!z1^tyf^0L6+d8Rhqx"#x/߇{t զ ciG G~GPK8Y_" PKy.F?angular-1.3.9/docs/partials/api/ng/function/angular.equals.htmlVMs6WMlwL2mg|II:uڞA _ˍ3V3W vۅKFY`_JnFSQ23=Op* k6n_zn-[E{I{ƈt<ן^xFd.D?wES/ٞUH+:hE;+sUUYMEtSS~[p$ck7Ev a23bչÏ_LTog)f*ꤗB,W>RwaPyuLZYtWᰖOΌ 'm&ud@HOFQ5N8(9M̑DUH(x,{-؊b|X㎛^(nI,m4o%m5#^2d t?6ޓ^;fa0>`öw^ x `+"oz̑ ՊRK7gF_Tv h,*jXE]>0#VK_2D0 8/#Tog)`#62 ΩS8ztF[f($,bW-1vxNGG1+XF2K('MǕ:uCB5S |4^lb{@ QS7N S \a|=X) =@݇w N~=(Vr B9t}+2X6aﲻ|Ӽ?0<J \_]%\#Li1; [YZJS5Gao<\j̺tbm.x4FPt6B.fh7fX_\`~yk|LH J^ZۃK0W)Z~m_rotS\!u7`+Cy^{;v: *b>r8Lq'$!(}9 +3+P-Ŧ}ȁ~ b$vBPa5ŪzF陸 45Jk4NQci(vm7+.VMp Vc#3Dl/@\:ڠEsDP$23@Li1U`Պh,pnNGG:7۔Ͳ'p Q^uڻY&A.V(%nyVRl&q`֭[)XXHcA[[>uUIf՗$ty>iM~CGCLx N%x5OKiv՝H,YJA #wF<Wzr9 :0$SƢ30W#+ZА =:.*bY&+D+):sjg%K!$jR4~q)tɤfk6^{ᅼXyToV4~BG 'sQA\nE` y5^at $RIQ g/$TKSq4(On0'W/}.PK0 PKy.F@angular-1.3.9/docs/partials/api/ng/function/angular.forEach.htmlW]o6} q0KjuXECf@-v/EhbBI~v]Adܯs傳F򸱶7|)l3̳J9znLN4;rE_Z2/VƣB+^5'_<:{R5h|U $)˲Ξ<;f\jEsiE,DKr7RۮR1)ws_(_]6°*r^N)Dg}%hxW)S-ĄRm*}WnvuOEC&=qR !) OYjN,ELʃysO+ꡲ&[S)eRW$CALԏ!oyĈ6ZuR> 1xx^gT;we ^~'i~dJOf?| vr6`ou@r߹E ;Vo{9[ )}lz sWZ+=c25`D+?FDS },AEIסb d;Vy3$8\t1qZz -dfZLFF!fpsr14sF;ԯ̪?.CH=}~{ގ?@K39 9ewSÝm]cE!pWU59Xe(j_i)\ɍEFeXתv=~LC!<4r_?~}-#3JYZ yID,0@rHefPynd|mKCx$] B zcq;hp=Af r`@5/ٔ ]L !_eM\ 1@p{&$!NN|͞42l%sv'o]^[{j.e/EeriݎT]0MG% I $ ˶v~pT?xlgr@~+藸NfֲM ˩֜YC-N5:58} Y(ZƆUPK$Z0PKy.FAangular-1.3.9/docs/partials/api/ng/function/angular.identity.htmlUo0_q I˜TiBBI[ӭ0wiC9>-\-;}Skằ.՗|XY\[I1/nJkrSk\Gik!ZpU1F j4h:JŢ(}>;FrkFm0ŠvڈaDr;ѨvQ1fzk넅 հW3ؿQw1R?{@>ARF; iߕs1ܥjP{hyfkA:7Y;u'bXgCXٝJ>:36n4m.u``H+84Nub^D,ɈF @o`eJ%+bE'[8n7*jo: ,ga% f=4\٣0Z\;GAZ \)KXRTmb!/Nw&Ifմ])ӣ97 #.GIp{ ;>g?I0"D$͂x3"r(8;.$i.t$hh0ݙh|lZJ:K}5 HڱF63 У'HYς,m̜Md(jby@LJ~%UgV6V 5K,-x5;Z)=U[iJujL/ђק ϪR/-; TgTD1/ C| aziզ evp~mqlR(UG%AVf4-̼擺'_~3&*'ay;6~$zyER+4Q8_87bsY7^!}[ӎDNaP a򆪌b6[{ȿXpQo,IONH>60+F &V$FGX+,yht#S u⚴'Zoo$ǴptfT--ϊLUԬ # UTb>2O# jƴt/\ƿP%aq<}: Vp(ezJ~n7z9{ iL;v*[o0̛ωT|W V%F94 | Ri8_c,d+uXr,LىOI2g\/;գX?s7$ʼrR+(|D+I# ;N%#BP硄aَn^ȶ6z \s~s* /YUg"W<~BWhP49#$&d C3n0b 5.*'6"h g2,Ԉ̺_Ԏ20ОJ~D`RTwA$?$!TUYuq>m8ڛI66!ۍfx:x)waśnvАo 8aSԸz#!`) (fMɎ/WL. ̅Fn~v~ pױL q+ak83J&qKv}CH+p&o\" /3OЕh0BSn3Fć%Ur~daْWd9jq-Yؐ-R4X(<3l5[aFB@9>(֊pH!>*(C"B 2-{wt;O7X;*; qq$/Zylo_i#p(-;Tєh(W#Z,~{L(qV =n@,bkB #aG{&Ծ8GoҚQ~)Y,K;8m[.W zC0)jbO(@ZC h_͔G@R*zu)#ǵ"wd 韣V1w!s("t3>fnRy2XN9C;+ T;Lϲ Vw Qxt- a}K"`>?PKnPKy.F@angular-1.3.9/docs/partials/api/ng/function/angular.isArray.htmlTO0篰2¤@67/01w'&ǶlwHKaű~we ֫q(jH'Nx9uWi ~2sU[wV]Y˷˫㋳\kEndz傴;ZX2"WW+Fn Պ2@,q3r?Gu(boc-@b~!ߥCv-3IYZ9#B^G1_2 6΂p#P'C;F~y< S' D{J)'΃Q,Ob@Rt*zRPd$̎Ȃ<,FaF|"_RP$`k`G&`VaopEX;c2QU"RT Dtb _?^$13uD bz.5aPi68e^.q?ò'6܊ʑ{+Pr3χR$MQwn(F3 oI\H1/c3FwGQ\07PX!P!Ǻ(f7 G GnPۢkhlM}kI;@{# 3p$?b_e+ Nv⦍{ٙ- ޢI ^Էv‘YyN}eLD|{>^cnPKfPKy.F?angular-1.3.9/docs/partials/api/ng/function/angular.isDate.htmlT[o0~߯F7ĬeM h ޝ4Ė픕_%">r&Hoa^N~FTݤQhۋjU=Pgz[ݸ|Zx8?]].߷+kp'CFipnz eHEj?_i-8y_ѩeGʀoڙOJ%"\QOa#-@"~1_Cv 3)UZ9B^[롔c*?17sdтFNz#iRqhka=(V'! %Cd3hɠI ) p. MՊ#-f3Hk`9#rC 5.5QS!;~Id.L2=f8kt O=α+bόU$JA2OeWvwXuzQxVX]9ok&_PJ| 1v6V b4SvgJ)B4F1Sٙu{Q usL_Q;Զ-87 #^bICs# 3pq _w A ooϘ6}fg0px& ގilpE6$5tt*o8i>|ti΃#;AwPK24TPKy.FBangular-1.3.9/docs/partials/api/ng/function/angular.isDefined.htmlT[o ~ϯ@ldJ}8kw8i]TK19|C ޸vS]5zb&%`]J˳u  wz84=^|~|{N%[X2T#ï4V9y_ѩeG/ڙJ)"Qq qc[ ?J fR)!S롔S*߱6k/2 փh΂#Q' ʴRpRqhGvjdRI`b(\xJKNd̞ȃDcyFS2Zq%+[o&d0<{!`hSV(,FH"o/l€^ gnT؋P\bt8$qҍy*;׶ÃW53Ax+Qf3RI2&{EX10ûAs( AJa&Wg8GeK>07M!P!ڑ/sQAx^Gm jZՎ ~oIC$ Y;YʧhvMؙ- I$A&wvk!SO.Ϝ#":0^+ PK­PKy.FBangular-1.3.9/docs/partials/api/ng/function/angular.isElement.htmlTmo0_anHU nФ w'&ޜزns~IR\rܕqX-sھV=C;Jnwqc)4Y(55Gp]qZ^B;9Z\6`k#*pFóPųN_I-˹Qk}6RrmDf^2eNj ( PYQQ~%f3|Ӹ;>"̍h;wHbF<~*bxH&BY: IVBBwW~"C1ڝJ>r:3n4@~ M.u:! AC ?9YCz'ҫf@&O2A= <FeF,~lObi_$ʠKp`z1%bE8ObϒceȝZCCn`6Iʌb`B4=ͺs"e6ϣIKV?^s9 p؏ɱ3%R|Q^vgvBӍ57yϝh]ΧK1BG̙> 7g 4Pt.$1 J\q%.`j+-!7M8{`gsx&R8Q 4;MB6]^iEbORxMwPQ'!PKTLPKy.FCangular-1.3.9/docs/partials/api/ng/function/angular.isFunction.htmlTo0_amHY+h҄w'6ޜزsH?(lZǹ}ܕ YX-;@ZnFT Q ;սJO7Wբz6:WzpNa]O+>C.g-0txz|qN%[X2#¯4Vn9\V[Fde_3KE|' b/#-@"/7~5@̨Ti$f<})C*?17s2 ցhN#Q' Rw?5*&۱2hK%'΃QD@@ Jt**wu;* )ҰDՊ#/yͿ3߀+"?X-lAX[S2+F az3#$Ʉ;Db sPaAD7sfJ_l[6Lwٱsgg/]= aE@E*6^x+Qw3RL4>P3o'7aE(F yB*1mc3ZueK.(lOߝe]}%jP#޲GQۂZ}Ćzkt< un ‡Gll h-X gܴ쉝%Z+8695 #*OMt*4 ~/ﻙPKPKy.FAangular-1.3.9/docs/partials/api/ng/function/angular.isNumber.htmlTmo0_amHي4Ѥ}ABw'&ޜز9]7`Z&Ǿ{^-Wǽ}c7)agu(Y L[ӧZݸ|4`OGo[p5`ՓGV՗wǤQ¹ձ(C2R1Jc 3ښ^6z$  zȨS.{ȕn|{uoBHU:d1R]XJ9>s1"`=,0ukL_ *g7ʱ+cqsy;5~@Fqmy01 ACɐ.\%YOc%Z'G2vR@fK A4FaF>KNr7|L(T0 abïw5izhr`zn ~—GllCAkϸi'vf hRk@ H$f3N83<1ѩܿLҜ oC xPK-PKy.FAangular-1.3.9/docs/partials/api/ng/function/angular.isObject.htmlU[o0~ﯰF7Dbp&»6۲B_†I|n2Nz ޸Ǧj@Z^8 ts\-ٖ%<4s| N0V}onGw֊zt1'-b0Vo HUƊf"k5h"; =k8QQN#e3ˠ{ ~JZ fb f!!EHFz Eݍ$I0hhH#h fT'tINl_7$L} 8"V}P+kuuZFCE]|[zB__X6(=;`3R'P)פf|p: ,ߦɑQpEE o֟-1bQ_RuX3S'(>p9nMDrcpdiMLe~lQ8.B7(mp+³+ї| Ji|7̼F-EkJ ͅ&&Wb&gg7E^r<;_7Q S|$P VD.7#v?/vVIX57!aG#+KypU?jH,aN%pljl#.*^TjO4iF&"xE߻U PK FPKy.FAangular-1.3.9/docs/partials/api/ng/function/angular.isString.htmlTo0_anHYh^x@I7'l?ҮlZ&Ǿ}ܕ YX}t#}7U{*ͨխJOղ6"mO_{pNl`Ɲ棕tasv8Yo5VրNM[7?|\Is[(C2R!Jce/nΙڙN6z  v¨R.;ȥn|{uoOCJ]:d1R?%1#yK9< s{iD vD:TP/Ѥ?<۱2;hK%'΃QO@Jt*z/:9^2YR  H3`4fT+d+—̈́"I/5{, 6 -ԳƗQU"ڌ)E*κgx E"3S*n 5LsJ)Rvw/fa.^/jT4 +û+{yїb:i̼b?=Md0dy ĴQVrvkhsT,G]rAay@~/;F좘+Q"!*u}ݾB'6j/^.G'&'|I1~V>-!6}bg0px& L4Mb6o3$M:D}P׌PK%aPKy.FDangular-1.3.9/docs/partials/api/ng/function/angular.isUndefined.htmlTo0_anH M hl;ɵؖ픕GڕEjrqws'j{o'J7cSz\mFNx]T:ҫ ӭ;[+Tk8[^]V4NmPU՛o9i%wn5z eG¯4V 59ȝEGeYoUgFE5"\Q^bc-@b/з~ٵ@(eiŦIyoRT~bm#֞eށFNz-$KQN1QMQp~+hBQR `b!8\JU't7J +2Dai3Z(@"4q&4IB<& 5XQ,;XF$[c DufԬ|81#ܗVA( Jnwz {ޠyǖ[]9po#JmF_iS*ピ 6v2-h 5 eb3nDf@p: !HD_$=j[Poc5i{h`zn ~—GlSAqgvf hh-IAIf[;QY4ѩ<'д=j?bPKZ5`PKy.FBangular-1.3.9/docs/partials/api/ng/function/angular.lowercase.htmlTo0_anhb/H{@ xwkbpbvGڕ!DW|8 [جƽc7)a(ZUن^|~DV7"W-0 UU]._/Hs[(C5R1|Jc nyEv>*Ȃkg1*T^:rF?Çwo7q?p_:d1R]OIpQGK PKXTJPKy.F?angular-1.3.9/docs/partials/api/ng/function/angular.module.htmlW[6~_aJ$ 6jBE*-*}@RҕGyqSZӔJV|a-+qbQW?lm\,z4x4(t5[{y*׃$p=#lOJsJmN6g*'_*e2b=MUz_}n;#Dpɡo-\kFr#W;vaؗ:#C6{eϢU'$PKDd5i~*#V#Y/\Ό`=(\Iub+1#$qr'6ٳ ,#%ӯt*ԪVn;i)  Nѭ8ԿdH< ؠ8"Ԁf }3Rlh{d|JeXD ܸNe KJ0aP~@B̒e%>ׂ*IuQ0?:C85)^ܬƵ}w{T `2]ս2Z?7sp{F. ( N*ɫp*=g}DڃY^f`V4]%>hVJKfFVz5H:gA /KMYگWeIF9g2.E=Ad$O13SB+dfuYg^fn4x;?{"} REY:^lE$j.L8 6eG V!J~ X/n>Z&A{_m5zk)]`ӫPGoޟ4  @d*@^mS\N5FOAY 9:b5  >L`C"bPrIET kCUtf_^CWc$#&Y=#C7ph̜9Qƈ?Gp}u=c2S啍t.bG>Øsܯ'x iosp7HatybRpmpr&W_sUU˷{.zݽK7QzI^܁h5j+m& J7vK3B(`nV9rm's V@ Kk1Rd7lOO!2 XsΪۘA|VzA&\÷ʼnrF0 A4r)i ;ƀirxLgG%{ Wr48k#GIeKEe/Il/Q%!49&{C^SẤʚ(9w@iҊ9r3'IXBn5M` ,0lB@z Ѓ{="Hz'@#:<=oHP5 N*nН:Ɓ/RVoMPK J&PKy.F=angular-1.3.9/docs/partials/api/ng/function/angular.noop.htmlSn0+*RMH#0KZdBIu{G*"%̮Zv51AE9maG0iOks*ys|c .:z;b|UoEXCc[].^WN! MӼpjBVs5:owXD&ka޵ꈫ}pR k~W'~Ulnޗ\ ΊnFWG,~NN IګA?EڱV汔>ܳV"џ NOv4R%yoD*3T㖵LP O"N[kB] @V)]jNFDEmSFOԎ$D Yb hY n)/J{2j.)nP6JZ?0,= |NrPp>)vҰh`U$@(qvsM9gi֭t##2T:j$)qE+dm'w¼ڍ<>JaAG7ɁNa۶goo qУnMum|У]޼7~Y8DMw޽?pۊinLt3zɐbݑ Go5>4I?)i"m`v}yqdOwfqX io~ylPc9[gnXtprڪ`4Kuս?Vvo-&ٵx+#<ă#ʉ,ǡJ=E&qd\K0?a$G% >ɭ+HEuީi:tPm=.olW}pGLh@6I;cA(ŧfEApRٌ"Bm GoSQYFu=8/7N2!'í]0޼7hDp43\8~` PcxзN \RtRKx&2Pj" "OKH7Ι/%Wp,rY OLB؝bґso\<~uT碻re&<|_ĘQq+,50tcƷR6br<xs-5!,2}횂 A!%KKCo|9+Į:]iq ^D= oT՚=)m=lսKkCsbWy,"Y>T3wPm=9nZxMFbO̯3:錳Y$V'>O,=PT<m{c@`"?m01P4fi.QnIf %Gv7@ފ˛!9Ж3$ޱd3P&TGPEfH(g !2LBNG҅'P">!BJq73 ڠ$c7{ J.Sr#ws:K8DdyHQLÂBxPKNJ  PKy.FBangular-1.3.9/docs/partials/api/ng/function/angular.uppercase.htmlTo0_an p&ƻ\[SVziW:Z_\&HoaYN~FTݤꛣJOwj]=PgzRlZݸ|Wۋ\ce dqiz̅^|XQ¹R>rvL漢S{Fd_3o}E|/ /a[oO$(kIʮ$f2hj=(hᗽA{wTb(V ;:n9i0c?c̎!/uQA^Gz0iǒ |%NÄ9<_$ 8q:ؘ]6枹 OD_|pG;*p~PKF PK y.F)angular-1.3.9/docs/partials/api/ng/input/PKy.F-angular-1.3.9/docs/partials/api/ng/input.htmlWMo8W Kb9~N=8E l7)PT!en`ލyo#JIvAahԮ!-LߦcHd'J퇋aF[wҬE Rˉĥ)c? Sfӱ+wG?b[Xհ?=Lwd (-.?\FX1vI"#r{yd7Nh)bx"q䭔+Aۮprҷ#2(*5Ԧu`J){+9ɢ/H #"6{Q)jPBKck?t rkV-ږ` Ҁ6X1\5s`8*wQ0;" !'Tݛdy!:xO*l6i$'Wջ$ #;WNN'{aN5\F>c.aaJ8;%--s.]xWx $t'&#|r =?@q|LȊgHNg n#62&(;3%Щg_΀SJگS_^[/rQ!wL6J}pS?ޟg^wuv%ݍ.(7HwfkFh-jGKX>>} nDSh1ii|ˠNb-#;7? )-g[!z{wsg(0p8ߑKqDPK8NPKy.F=angular-1.3.9/docs/partials/api/ng/input/input[checkbox].htmlXmo6_Akb86/hv+Ь-e+w#evܦ3~pVj1ƴ8.)Y5UW\gW\xqE˸Y\q.Ȍ\XmoJt/4ondw/Rd׳fy5~xQ.L˙5<Q=x/',S'ju!b3S_jYq:IBRfM͆Uq=$L);ɒGI '< XH)LW*Բ(ͮ=G6韦BYoZdV()υ5sDHoO*O聆.t+I\ZF3kj~-PΰΈ֮(?!gV5y H k"R'1q&qR,rO9ʺ<h2Q ^XAG]@ $} ;zPղШ ̲:X7c0FKbJ,b\o YpDEdM.ceWfՊ}cνsT>uCr5z{  "\pnUUTT:. T5BB0:l/P0B,}Ugc q, +n\R3C!Lܔ{yİ aT';NzbfMLÜw2w+|ᕈ@fA 3%,em֫8=!wJog]'z؍HnlCLrnx8u_\IQ޻]ހuDT騱E8+`:nSkGM+49Vk0x7b} n2*tA,EpGf>[ ΍rf3M8;`hBsjn@ec*}o4R`M_&$va2bɫV }I / ;0A`gJfZX^8Vk!@RvNA̾۸fK .B҅At_۱z-#c-7`D]&z*BӁy %V1DPH'˨4g(x 6w-܆xj *ܼH'lt۽x@pI M,.q[󾶙>1v]OXcH#oS1cl 776Pĸ;aN+c{@PhPWp6ش p \z=) ՑC-4'zN٬ 1RܠVm$%Fi쪂D_zNWaHHtTs!f4GeMgcMNy꺡0Cj4Xzśv&ڂ6]8Uo[J)*p-octta}TTve4FɿPK%K6QPKy.F9angular-1.3.9/docs/partials/api/ng/input/input[date].htmlZms9_! ص)_եja/db 3c8=ݒ W5RtsOQʹ7tZ-2YΚBʵ.ӓ2f,FMP.a?Z9Sy5}}K ~9y(WvjDqU5_9Rixx @/jS]舉+_Rfu007+V\ORO q[?ez|i 7V+UJD>7.g,e~(1Rycbsj+hgb oB!d gdi+TLXt"DY9Rʸ=7Wo^~SdN]: P%XbDcUdTZu'.h 0YRN#ǃ=s'+|/< u)uѴxxt09:N2Hk]\At.?2BnUON'UΕ6 Hi֊-roBq.Do^ʗalКը@TiyEVӴ!OUHWfK!yߧ˨.-T-h2JuP'P?@X:\tRۊɦz9fBlڰe:Txpq( 獎|8~Sy;?Pn YM2 D.G7F"O@Qc=^Ǧricbrzäޖr6޾宷r[>6PWc ,^P9E8mPRD3/MB8?1★jOhBMmi뉌<̽G8_I# O ~ bձgI]8OLFTZa"2vhv8| \SdOnH?VJpc8 0)Vhd2єpq\c>( >#+@󈠯*S: `prɉ"=@m ynT#hU%̄+Zh-iGt42E̼m_J|)S~>&ơZW98T`B*8I`82X'_e~"@8 o@1AKtO:?ڻ7~p@PbYܧ~8`a)l~iBUI¬'m1t0h&5ZAcyN4$e|kMS2 MxPZy+n{a Lm:9gԥ ^׻yKՋo.ӹ[q4({Qa@6KG\nS0O='΃A\%ZD eg0v,.{v O CMyMT?zv*Jpxt|r(p.ėwhAt]XkavP_nA}2SgP@wt @H<>MN >|r>?qxg:e#vXw!Xq|VxW1ۉ?$| 0-Z S+[_%NuY wUww؞̷}=_Ҭ,n/#_×/,_JMũy7Seu -c_3Cq0G;2OS%vjX F֖=d]TUt}` 5Oǣd8\/[M\r6PXp#jtTVsMYxqY ,7 [u [0ǟ.7Lޕ|*Xh)3 [V3mE=v֪>gRUH]>?PK]I !PKy.FCangular-1.3.9/docs/partials/api/ng/input/input[datetime-local].htmlZms6_(-MMR6eu$7Lf.nda E2hY߳ z3'IXv]/D󃉵9Mqf'0D::6J3\&1z$ʹZ%YQ~*cXȴy]*TEy9O8ʌt6TxƟ8~=9\s~M+]^(-迨Tyq>&٨,Dϭ~14Y?̈娟~SJ9U<ٮU)35 )Qyl<bHreŲTx˴DA7ʠ*U侴Ӥ}O̊qkьdceZ+Q*Xa<#r ŴL\`Řĭ'e>N>g4Ĝf%Hzb kgx,!TX- sU)˙Qi)ҊuUى//_~T\B nPvs1T6*eLm$:a&Okh@irP\#zslU^ԘΡWnթT n;_~:='%'[ .r |&8 <9oCQq=ˌO](qR 4m u㽋' ~COȈ6È٤-XKēv'av_^~hU'7Vvp(D}* ƠGtneFXYX"4igT]e kŒwY_R`4mNdC 6m0^^wJ'>?'G!ÛJ#>5N-E'f7jTY%3[to8Dfן-*N=s+u.Y}4^O1X~ 9 MbeWyVk(.1mzk e("H!ʏObcZcӯ:w!HE J}\No~' 7x =WVf9SĔhSaΗly3π3HHl3xw>ZA?ǢI}[|j:h?dȈWݖEo+.+ D (7"3B{6pxx $Dv ?B3NSIYʐ5WM +#3`ooюɝ=ۦ̡cP :Yt/?]u0UiBfu d D3G^S/ڝ }:nԝ |.z>\ax!L.U.GjR(;zc `s"w'aN& 9uv[HW;r =e3)ggY,Ѧz/҄o936r) V'0_Ij/_X@Gz]۪Gs 4y4ЍܛΪxi'mV3#|oi5pv-l 鸚 Yt6!s7Dv/|qPe{81Z=uLnQShQ^K$bTk4m>G5(-aq q,-",3hCzP E9+c'3VP%5Z᪣p̘ZNBF mXa >0vP A#,GtupAxǥ!Dcp-/RBs e_AIlxoYB 1 ؉;#YU6P0w7#臮"vnQeB-ß6} ̿26@sllbΎz-R1 K@jptb[0BHolr]t66jer C{(]m^Bu/>2wr^_!W u-h'  'n [h;(|\޹&xoPK~Ӆ !PKy.F:angular-1.3.9/docs/partials/api/ng/input/input[email].htmlZmo8_*/w8lh{@qb۽/E%ZVoޠ}8/-rX4hc"3Ùg^Qӓڶ{$EӦJd43KTmr8~ΤI'6*L%n{UT\fMMy.?~x'2եF/7H 8?NOt՚LEDH,mMJbI^nBM-QDNkxh [Njy"GQiǫ5+řVQAS%ھ,#^HEiHc> %3endfK'TYooykS^Omo'Ejyg BDoQ5Y_*eafE|z)ۉn3gs&Z@}$~x{lL:.`/`&m2ǣuBIm^B2I f`1ΥYGs(ͳ{S4*Wkaww4[@' xY`^U,ެS N-j 1UqϽ6`L׬T)_2TD QQ+-hAP]6βץӉi ﮓיJV!xd6G0=>@d*@xS6FEfƿHd 8'Z%[0j~[IdgJ8pFu\Uǟ>gKs='nAM./P*pO?pWKpVU.Uzb\߸[nő=BE`_ BB…31t}jҞ+%LM߻HM CfΘָLj`V&^) &RxslhLJyLNVϷCpnP%l6*tm} "WRo/N5kاp3\qM@5`A[AEe$j1m8\r6OC i:QߊzkcZ)Ѭ E_S?GT$!DÅHs!;qDwd1hv:<);0A;SeSeߝ2_dYC2ޑ#H Q0UHCz R¢[UAH @ *Rp'69taD|%s>}wfusq}T8G6d nj]7$@RZARn c@kK<9`Zu@ QJ"uLٜw]7y'5ǔ*T𯼶oJrJBtRow !NU Jm(e5Yx|`+YQQf$,lS!@y|yіU=bntPw#p6dD'YEj`_Tz݊UN,7‡/\on|9\Wu]6[;S3(h-];+԰Lzt5aK!mKa=,)mO,(~D YY_L ;ȎEckz|(-A4Тaj{MB>`qQz ,j*% d< 273tMviZh%ĎccٿgC >nF[֭&|Х?k6n.v>R7F/\x*p.ė3Z%hQϯP#Ao]# n1 O`{,=4)I\$;1]+C+-|K?I^t/"ԝV=Etdz=9fwH >ExV5,X6Zo49vOh4}sOwN<濙\_O%.7P5Ž{^= f|IEd· &&>BOC$*X-p<]nbj"?spM  yզh7ᲀH8U[їJ[ s޽[LF4wJĹ9bңr@[P&MXkHPSIKuz')];meZZiLNԦsBOؾ,Ϩ*$J7U ?w z- 9{ /uWDNn9bH\ s wzJOPK* !PKy.F:angular-1.3.9/docs/partials/api/ng/input/input[month].htmlZm8>Bv&)&dW7U K~ĚDF'8=-9N慗bbƖV#Μͽi:~LiHu1krm09N.Mbf֙&ExuaZIVN>^t解Sg'q3c3$/{j>ٳʕfHoX9n707WNBOCb7-&upR~nkR=41k`SskN<:;(uHr1EW@[d;A̸]Y<ʗޘv^?'bw7J燼oXZ{L}*; s[{U{S %r3T~E5Q,=7덋GGe>"X3W1'.Wy[B}$~5>%wUK;wsLLyt J)ϕڸNJU^ kt~ύg $Y}7^,LA{湚&cLnkF&/ 8jN_1;·+ =+(sUnѴp[2J+hvи^D{[}U/Q$*~@[8Wd`%=B0U6ZKfƿ Ĺ8~Ҝ)PyEW/wg@d>5K?J-$]^uDYTĨJ,{ mz,`2ژet4"_WA."`h!lL[X#3gM 1ېF'gd?k:4w:@mEtì 'ڰe<'8SGlgO88GtG'1 8G|O:+ mƀiCӄ^B=+sȬrKEXE2'?"7)fCouyB/" k:󾁾/%s#91~jlXqa(d#7k(<1z@Vkg":{!{"!?ҙ|!+g|A04b 1Bmlv toTj.?P>cY(ڧ;/x{a)zg!>lKA 4ϵn͍^S4"Ō'!A-Ӻ`:B*ПpԻR8%Z;'2)holH^DH~ ryuG,Y]MRD LzfB4L|t*cqSO a)ث2:P#Id(Hv 'lx_WRބg*-h!s]--nl&7%v Jػ<˭ x=:FҎM>r$Y:p6c/a*'GvZLA/f֏ד S 9|Ү"Jewd/zitV: fad+%U@gG`@5K2#5W.bOxՆzmZd+JM\%Z sE n(XJd93V VT_TZ%&!OEϱl+޶r]͌0y;VG2o(nsA72:6G2egi6&zFGEVdP: +/ M/k < BKު =1& ۬*>>sdnE?BRQެN:?tqrGE\`3!swN@5yeB#;.3nqdܢ560qXyy8x ';4LSQj4xA&K:)H[O1}WF5p3fHO6O-U#8RS[P 7 EN@fpԫ"Fϔt(;ho ؋e9?=%ЇwӻeCYwiEIl.~Ue-fN$b̅ O|!4˰U[3$lN֬dO;Nÿ0Sp4}57AR浓3 #|x`FBx.(L@ ſ MCYe iٽXDbO<' GW|rs{|i[5FD\f )O U+Lo2 Fm@AL BZy]%?8 p+<, 8YRx|]s~IqTps9=X>o_M8y '2 w٦-HIyDx"W/ (~gykBE6a"qĉW&΋BA] +=롰!y]?_t1S(~Op rOfmG/ħ<6j>WAJ!>? Ԡ1P o 9m'nwvz68Q|}wHg<~, ůzJ#]z9#Ϟp J65#y;:n{qj{wӧ{ƿ'vyoy#!|3͍$^-8ٙB.J>HlepG'0N{O ĝ*A9de r\jqkvf]T4UϝFLY=ڊR5NCE vMd' ? Mw[b%;.`o5j؜BIsyRoD_hTGm_~āge1GyP,08,>m_083?v=X-*A\rC˺JŠ\PwM?PKܕ #PKy.F:angular-1.3.9/docs/partials/api/ng/input/input[radio].htmlX[o6~ϯ 5J XYCv[v(/A-Dx]9d2l31gQam<\ڢOR]F[Mk"I-O&MԘ4(FV.E$@M)bWǧǙhR#+xѫ#*4#YF/EVFܬXz WX Q 9M}G2yx1[Ȇ=i>_5B8<V,6`h*X*vמ7wPVCo >Ņ0ox-ez!ݛ AID(\Vjp_'?^~(/ټVW8I )$f1@]8ye صFа L6ikEøeHbJ,b ٬eUԋHTg"9Tˮj1;,qG'g |< v \ݷ/7^ _{W7hdBU5u `vŏirnm+S¤ Y*zvϾɝid^,<`6jqù2ώ򝋺*A_\nh6L1GSVel.X#,  rZd]PE47q_}s;t1jܶЦdmcjKlYsy.{ r%ifiC'EvPad%7RmSh.op ֊S,s@Rj6feDp _G'0p +PlVAN{lr4B5BX~L )/{##EqfvAjnOh3Qu$U$\}f!BhNɷq8K$;/7c?!빉HF>~`C3)zo!f6 ѭ`]RɎzX~F o &"@2 q":`}=q_火a 5f֯uS= HZ/l3;kFZWYTΊΪ[X'R)ͣ͜&M9*^R[ku압u&M&o+q>E&s]g9h21_ASX,OP7m25M-T*U.&-t"K)(BfOCIXbwH7T[ in+Q*=DbƵh9Km]C:{cR:OeDo1Ck7UTun*yaV rpvXm-QAt6yp=v!ͱr3hEĒW.#&91bhZM[^J#i|{e7vŒKy֣z}1 a~I (atlB;Ip@)H е[Q}!{']=PB]aЍm cFD>Iql)\r|7Nۮ` jv0l~S׎ziV A@Ec*t@].>qp[csnsC;=ɲΟ+p,eq0Q)c#ޫ$³^# ? ({K=l?9J(G-$HC~ߟh@*6(I5Pu]()a5Vl"shwHoZ\JBVlxou_͕A7WʆLj7Jh  5Y?H=vn0⋜[66(r@Z%N # T0: Ye'b:d[:_,~m"畮4.M<\AQ?u]gI<CS$%tD]ɪ-d5q?0 R/&*/˾~oNOTpnjD,\ވl 8eϱ7qs8]pL}D<(b?)._ ޕ2X!"'sqˁQWqa2,RC*&tgT)h1;lL!3Y9xlCTF2tI}ԥߵkƧS{&>bp}1 .{Yn)@J/ LO{>=s?&N6>&vhjîrg` #bP{ "iU߽pulkҎPْ)/`س,)/3jsɳys1ϸrJʾYlB}\.Q4m>0EgO%ކ⨊uYU]WaSjќJNٿժs`>"]-.'ft ՠs,/%Vfv\w6p1ץ^P%VD_mܰTÿ%wvgI:'{PK塩m w"PKy.F9angular-1.3.9/docs/partials/api/ng/input/input[time].htmlZYsI~Hcۆ1-k6 C,̼9=wi:ݼ$ӺLU5k eo֦:]zMRki5KOuWMR[f(G_o?}ӝL۩'˺5qNw޻MBY{t;/S!á߰1yxuYl{2v5(#ki1Kpi ҏ$3 *.54Y5C]Au ~4tarUCYG4S Ww\I^Zs+Ÿ<,;]B-j Z vClDmanL83~뤆¨; ]Vib"`ϒ } Ź70YqrF n>~*G).+T^O#7j9{G=䉈Dգ# DP 5k8X~ WBoƏgpH` !& +5d`8. Y *n@/[H~* ^6^n-&Բ?CϧD  Y#*{|5_9y/_ƽNxGCZz'Kʅkr ol}T.ؒL{ CPg$dPwAL1Lj G(U>v]5גX85/scZ_]97r >r|"zP7#}M7ʏpo"?C %uR(^6L0A%9 4㫸/$8t7 1%\ Q/T߽S)}*B-IȧzXE[3a+muУ> ۃ.ت,ηǼ<f_+b9w fP }:emc%.}'n#89`LB3[{Aך<\y.]mv-T\CjciJ֠%ZSBO27CWqE(QפpUtB0q  ^z \)6ݿwgxx1b=s_-І HB&||t8)΁ CߗLЮ*/-3FP=8 g2VMTd~f\-~0NmyA$>-4Ųӷ` D51Mr kYxE<@'G?FؓK۟<+wrM[Srϫzjq$aE$9Ai&-yq9Ϯ|A\cp$yAJ$u*뗬A\@^A*X :j7z &Pξ;wr"6ybjw"#(?Awql0|aՂЕ:.(p sPK;8 !PKy.F8angular-1.3.9/docs/partials/api/ng/input/input[url].htmlZko8_Mu7)uycٱwig/=-ᖺ64#LM~g_R\hut4W*\ qXNK_oQhTP6F*kR3NˇgDmlci| >wUȏH*99,&rE}D4&3St4{Ӭf mY]ykn<U+Ëw҅Yx\_+ySwhP6V|Tk<.N y$x:Zp;fRSwr)a}MƔ4N=f[bl LߩNHaUV59%0/g!O)㺯Sr!p"QxuH緹4KOLZ0DA%0^H^W^4R^M^*[4&ч! O-?`M2CY4GlNBnÿ %J#-:hivkQ U0Z5"۰Ek̻qz_vVw>xJjT\:Ro?׿S+N7UkS)Sab\}uZÄn4DŽ-B(}a&. %6 :fuH^٦+k%BEo(_"Yq"~T-i."=v 1m"wJS)YQt!o+:B8_U8R diHJ£UAq$c2IwD#j7Yc'&N3ޑrKIv||dԷ w:빲ȧ>:iCmp-K$QCTnO15&V(ƺDqS3 (t.u,*P#䔤>U~ LJ)U%ӅT4w%9ot!DcWW U ȡ oc!0eYqeJR/BKPTkԆ#%%~楮*1G2ۘ $(mQ8)nɢ"~]yKMM8)ENVWb{6?Q\2;Gz5L'bӂtrAieے`O#q@ C$ =+Х?uN0Wsd'Eg_ ?[ܹ\}6#RT2|% ĝX)"QU=4H"{ߤeTzTgzm.8JMf/còBH^yU== KKh<C'gC}LM641j /ВSl(^7\9'Q:^(h9|IXj=)A y!%Obb^ҥHڟ&Qn[r}FW;F'B!O}ՅABg="0 ;=BQ\ 4;)+Ew&<Yˇ3:ٖl4W鑎w`:t® MƑm~"w"o6$Ihmѵh>- 5da/Yۥx^:PݖA}ݭBY!vjjڱ?|a>zlDFj o%oy~\58|Nz6,,SdA$!댗 _btw!#]cq1U߀&HEpbOZȹ<񙥤, Fܷh1i~{91cŞm7o}EwMi\y "EzJroyzvpd"B&/G/fK$IxOխ[£]^)iO`LoC٫P1n.Njo,BVw M '}1̍n,Y*׬KCg6zmY?zRVcf+3@{^7לPKoBT !PKy.F9angular-1.3.9/docs/partials/api/ng/input/input[week].htmlZmoI_kff"V,q|bEe.:!>=a<31y{_P3{3AMtR3]NBi2[]eָIVN:3d[QSsWϭƼ}=Gi&Ύ U3a-ߎSB7鞝׮0 Qc__R;;n707-NRuO q>fvt&F=&Lv~3F ؔšE@ЉQu[ә.ώREz_UĖR9  gFEBeչ-L"=4;}7Zۼa6;Uef];3oM'^Z) K(^j^maTܕ؇FţLfAjJ6371'W{[A{$}=:#cU X"LL4ک ]\h\yrsizI UƸf+UV^- Dnr~4տ^=^EWZys)ܔEQQmcr&&1 ld&139)K wH%;}jRR4aA*<_m1J̻ʷ 6J"JSP Ai(vH#IBSpǣnڒhc.2̸{=9{).&q\|<@lL;=fxb[اm׶q(C?i/}fK;D# ׋ (VI,i䷋ r+zid ÀB3 J'cKq G5棊AM<4Qb C/K.ʷV3W-ЉT5QQ-c8t;0n@397W^IqJKnWqύ."0;8|f8}k7nv!d褊y zGB0Pkkm7C_~fL"`a_;Rھ~H}nh1/C p d<0i&:aqؾr{#Fuj̈˔wc{b:1d   >lqp9섲LMZ/(lFMe 3jzR*qZ*3Diw4JojQNga?P[]A]OiZd~>L/F&F^կdC_ْP2 BX A W@xWS}ů˳\2("N G^&4|+Į 1GAa?H.~&+zEkS}ޅ~/h .v&Ǩ+ ?g҇mdzYA-z ğn&N,L<.CpY R_A&%GWme G M:9o ;Qv]dy[}ՅPYu|vj/?U^=\ݺS[-H".&' s@$y܍9XoaTݭԑPKHX PK y.F*angular-1.3.9/docs/partials/api/ng/object/PKy.F.angular-1.3.9/docs/partials/api/ng/object.htmleQMo +[D*vFB'ѐa8'p j4OJ6GB)0̘ҩ*}$6ƝSm23=F.;χ7J+ ~ )o]dֵݐlap'yZf+TT;Pu79XgUz;^nuD/Kp^۽~>K)Odb?˿ P]gU}݈PK[óPKy.F>angular-1.3.9/docs/partials/api/ng/object/angular.version.htmlTn0}߯-j$w ۦAR3I8veK/adKmK$xΜdɬsG7HiuPܮ1,gyz~g v:@>BIAW-:k<)pO F?;<{qPVH ^!$ib>s'3v֬0:Ige,䈛k0$9u |#1OOV$^$ .(XY7 bioB=d +,SIɰ2#S3ߍR2FݳyAX&J:cG==@U(+S,QxZSʔ4X{akƌI me)W۪yrЂ.?kVpϥvTCel#xa' `-jߝh>G?"|RZ/erCd”Wd!?͕7\RGspA4@߂"t?/pҡ-nP}kpkԏh;hJ(vv,N#oq і&4E0Uo ۍ[ʺV4۶~S K{?O># şPK~ēnPK y.F,angular-1.3.9/docs/partials/api/ng/provider/PKy.F0angular-1.3.9/docs/partials/api/ng/provider.htmlWmk#7bHBISo\io\Y֎"i{IWM1otIHuk IK[seV2}`-7I-{1JY8ݘ <߂Xhk^*M'2>4b24[ҩ6^0G5)PWsA ѪҬʶF6IgbqQHzjn}ȥRT+""`"(Ip YѦaOCc='%VBƚFFY<_DH6¬e[Sk_&{y/B{t n5%!X T[o>Pniݚ?2k5>v>~9klvtoE0C&)M:,|<{|b-(=H|&pz]5!"$GωGh>x{݁z<\bK?U ɝ=KÞN SLXC5*PpEe.D!fĂKܲ-b> \ҲQ/KҮ3 <0  ێvf)_c,J 7*4קzzݫ؂CE4sw&vh.&Mtl!tʂGvGBks; pZ*_ CeR:]]^HkvF}wvyf2vn 4I!锧9g)0c nh[0%LV&׳G<] <͉'=ROk^`١V8?[{NeX]0gw$:0HmvD;}Fa;p'm; 3Ѡ HKj oYj߼@=j}욹_9m-)s 3L#N.5]})7F>Ƭ϶VJϘ9N32|Lp"=+Ç_IģWX/1rjK x7?8`侧%lb?w#kFYvp42N0t`ez%=iGZUlBV]pJz4:齗Xwon,hmNcC|E'|`I4A]rwɜShh= vQPK(lPKy.FFangular-1.3.9/docs/partials/api/ng/provider/$anchorScrollProvider.htmlT_o0ϧ8enҒ HxA iw׹ǎl[duQ)csBx?wUI/uM_1ݍ]tWrYUJwʅ7hˇcZ٫olety}zEǭ\# wf₎IJ,O,sn@qX|:<`enrڗwj7ɍQ͛zu%)x!|2Xѯ7EL,=>B0JVv?1}!>nblS dDL $e6RaV&$.YJ\Fy;r?Z~a[(<8C"B%Jd4Dȩ`,v+9VjțMD\4)Ϝ9zӎ MI4mTC&ƒGZ}n!enZ<_\o&6z3/9POP#p+P; OsĚ}vPA)W@0PD8YG$A$-ǧWW´_ }O0ٮ 5Hw@MB,b#1ܾs\EP~A6*q1ZHHgwjЁ#u`! M92PK_PKy.FAangular-1.3.9/docs/partials/api/ng/provider/$animateProvider.htmlXMo7WJSˀW!zIMn{(zv)-\\j7Xr=ր$jIg߼⬳byvy߻eƬKW6/])Z͓t) rͽk_4nM`F?>}wp M|>GQܹ#Od-W[eGu%ӺJmN6FqT[p˪hN:4U 1c}#U\#X?(UX(&_Ƭ c y=IqT7#{ R*QęiM'uO^JևVݓݨ{;oV0?Py(9$ A?D"'F6Oq[Jwg3xBbRi%OkJF4ȇVndlUP}Z,<MX 92۸gNKzaƮ[(iŝo [v98?q[th38[_OE9mYÕr8|Y擛We\7Lh&i*mƬV/StjG[9!¦rN4pA=qo`TaZ+𪺧{;:\S3[d=ZلM$TiEf [=(DZG1L#ݤb62&svXSbg;45>dWA< Ƌ;0HlH*_ʒb6r$v),>~D6M7|VD\Ag%q("mid *ph(!Ȗv@ $*{1)+ *섦=d+n8p` X#M)΂%h4XOjBVQ 74(n~ e(D-ָ=#\4@e !dЄ*2WEoưVPNj?lb_c}60qeRg5R;=BcYu=3g 3JN&UϑLpdJ 6fR3e-g#_Qk(jk J}Cd5"U(4{=CjmLwWlŊ RC<*>ABK݂a4tJu8(̾0NG`]PKchvPPKy.FAangular-1.3.9/docs/partials/api/ng/provider/$compileProvider.htmlYmoܶ]DwK Hh 6E]IĄ"αRtMO$*9h=ݗu'}?mV\w6?WZ4үW'Zwk x֘}6f+a?=9_j+7˽,uDbZ=ߞ!wC9) 6^_1Z9pX2[vj?6ͫ\V*ײza1KL]y~{+Duߥ~+Ůp`l*zc֘27lv`/'e/8deG Qz)β"LU͕qn-םS'+oDS(%"G│8""Xo -~b d|m7 B{Y>$ E*`/؏3T $*@7 z7':]F$Ԅ/Ko3k?-K-xW|# Udm6aexΆL&| ][0L{7\Ɔ*j;+btdGlړvR)e=n>Zlg1,#q: deo1t<^&ng:EYVߣ晢5W~X?Sȫ*[wTϑYfQ{Ys~6nBE\м$ԬHݚ{iꉎQbx u, $})B  \rV9&nvt΅j`PH 3e˙)y,Xa_(ι^d5? J7>zeE'.ƟҲw1ZO3 Em=C59'"`V,&k& y glKR.ohΜq tlFOxyƱD(bJ7)Z =)ō`lG ?3itជFAE+- m|K)F,Dh7 ;qFM^;mw6Q"a:~ H1_)/+`^PDtԘRsX"X%V%Vv'xwY j!V^PD:?{pIf #b2 1Z 9&ug/ɾ+?"zDR Ց U%W .mG`IȷEɴ`X(?]`Vx>YhƢjlQ)BV(>gȐra&rv&9t綾sֹ_0yC$(ܢ?hhc 3ڎ?Nif^ZS7\=sJÿ%9ai^@ YG~L,K%yHgEw̚Ƈ(2$0R1wjib8 zT3PK2`PKy.FDangular-1.3.9/docs/partials/api/ng/provider/$controllerProvider.htmlVmo6 _Avk ܗmbV`}m֝,\GJr  -KÇzۋTTo3Bwv7\z|)m ҂_tNtxۚƭ;{f/[wo~h5VHLplF n/0>^7=^TLN^R48Y9CͪuƟBV^:7MYjEm xEqR*DVc\e:o+^TQ<"FI\T7YőWRwYBʢ"h\Iy 0%fA9{`@U9,C`  k §1JwG*2rKF^ 2VgQ^dT *'-GƢD%V6e1TJN y!X~+) I3%㏉wڬv@ߛ6 Έ@ت 8÷o?G餡E"fs$Vm٘O8Z xF{I=, p)IbjFɚ?T’q}W5&6l/g[d5N>>'bEy c +D#>G/" R'IK_pӳ (-<} +?TU !2ܦ+"u~~7HpHQ5^7T{jn׭`nVJ+V,;aVGYMK;9$$}nĒYXQ[`Q,z[47BD t ,=p77!f)g9oss VlHTaPJb(fPn'ZjN!"kXle7gk$ѧ:eFZL\A v~ߗ) kGRH"A}KtK]^QZ.8&OI(=cbGI|bt4 80<t>љXkeV9#۔*BcXx,7e&&E 9 ?g\|gj9:W#MĀܴ aV+uj/Fҧ[c]kASLRהH#bd܏^rqY(+eD=9 b۳(>׃sOw=1ѿC o~٧sƠ*e5pO%*h+))*ޞzƻnangular-1.3.9/docs/partials/api/ng/provider/$httpProvider.htmlXmo6_AӼT'6ArE^  ITHj!%IԀw)=p )ZvZGm7ڷ6Lˡ:iwZ|=V+dkSwh5{]+GOxe\eVax0WBʲ_gg_U';;UJ'?=+ m02XF)))[7>.r]>g j'e4U*͑Uku:XW)1N]Zݴ_cTkS+>;fp9jtfS+xMy-fEޞ^ݲy;U~J N;/W#XA0 7PJ,{Sl-"•ЃM=uM946] z.TG "@TV~9hҔNNZ /_"hCOV8)x[a |3%n}tZ|39dw}T`nR=@JZCZaS3tCx`Sf3;YaM)=GBXF380ޫZH/5P'W'{%^0I2\z'd(ACt3Ƥ;c{9 #C [4#IbC{p_\o&K@Zd-wqdۃɒ[V-AA|,` ΩL<߉ nTީ򐜬Q:GQ_/ýB-zVӳK{~ Om& Cdm |D9F,5L^ sϔ"R$~kCԓf-,*@(0ƪ/}=(r<%D#~9m9ܪN,V*(E\;%A.qm% UUӀ&dA%@ጃ]'\*&GI|Lf21'E @kPo^F io7m PHͦe v% 6I!!Z# n:TFn+;Yyc(zrn 3 D2^lM1T}H Z}QD%1Z%`8\#q^B`Z`C\Λ> Go][3rqWF3yI=@AH N*P#0Wj`o[gwOyOKV)ܴׯ s/^~VC<ۅ=^{Ǵ0ďs Ya+ǫ̍P =Iz 퓕v?:]WuqΠ˒Tds#."8AvxD17oW@/OJIܴPOA926Uo>3J_%&MsUoAn#hfY\}e扵NxMh.;[:a&'~"VoXD2I>~frcy*\ojI͞]HT 7U`Hb, y̡D?N7zQu$JfbdM|$]1X nsuٙNg PK2 J?XPKy.FEangular-1.3.9/docs/partials/api/ng/provider/$interpolateProvider.htmlXo6_Akb$݀.nC l/hlqHܸEݑ/(~>xjq8|-\/J9W^r3䈱ʼպMf.Icޕ 3X@aRt N8/3c %~Djq/N\!BRteT-|Ӏb=!nO%Dո!SGX=cȰ0@q tq/m~MhO_t~5Y$&CEXGA5v͙/7|FtMg0GuZIQ,݁1x;p4'ߟGQUCII͂>^`AE_zQ4Rt $ cw"9 1ԦiPa)I-,jʁd:K}+bw,uj;^GO. wloҷ5Vp3TRV\w+ g6-e=<(]ycϜ ¶ ЋuZԯ& ?̂hR1o}|;2CtvNSPKVPKy.FBangular-1.3.9/docs/partials/api/ng/provider/$locationProvider.htmlW[4~_q4Pvm&%KVT,ЇOrfbꉃv@H!쥅> v|;uWgG]TkqhTz4MOVr{wq)uil=ܰjgmsgewrWw}Ҳo^2;;:<xX|QcgGz3&"bpzt>7__b_ዪ$B==MUz9|Qxx0 1.tdFv_~vSН ΣYvX 5h`eWpvhD<ּnlzh*@$V-°aɳ˽y]%zK\O'AD [g{v4|]Y$F@1Xmn&BPƶ|n;K J^;jNC-@F? *t``XU®hଊ+a8tpڤpIgN9_u5ɛC< )z4Y)bd6}ϕSNLzNϪOV9-بkDpCzp|06k .-%UUԚ>~60d:U$_*,mvF*I֘#m2'U׌օr)%:F-P;Ep*o1]sIoZYG`:;M?Tߒg {7/ [xIa!3MEFT`÷r0ol ?DP7s`mF-)Ok3@<v'|<ћd SDnɂ{6oiG I畫W/f㯕GiMM Ej/M {,[N:a.p ?J2J7F_Plw?_ӿMdMxD+e!hO0vq3FA%h=A&("ڥKga)RNFJ?ܺ^Hqj%S;lﭣWM,yPKV5n{PKy.F=angular-1.3.9/docs/partials/api/ng/provider/$logProvider.htmlUMo6(Ml*}IK(@|\(iV d;z#r8#%$(35HA-ݶ7S#qҭop/Wۯw}36#1rě|̞t|逾w!8z p>z} z-9Fcu4Iw8kj73:'sUAl7?Wtpw|O\Z`kG ߖxjO m)E]鐖%#u^ژI]Gry~F]F?aqZdyHl<=U[CSiMy׺((&3,Gy -ӖihHm G}Ùz3=, e$wi^Hy(Ë20e#d3zA˱S5 7Հ2eq( urǝ >$g#bl^U$gGA]g1^:゙dpePK7.gLJ|S5O;X?$@VWR8SЙPp&&+|$+&DNIB4Z.Q_HܚJZѲC ֪;c4JV]1Qx8m15|B3hsK`z%SF XbQg` | 'r\FEt;m#Rs,9K H#pGswũOntydGnE]86cPK$s=jPKy.F?angular-1.3.9/docs/partials/api/ng/provider/$parseProvider.htmlRM0WKᐘ n$HH]g8e;;j?`7T`I7B |l٪pٛoQ`GI,)bbW!"߽1F5s:>Z?PW/;:9<9 7i|_oA[aKJ3ӔW*s^5ؓ77QGg1RPqłd(P?S@\3;BLO#:`Cljrni+c×9+|QDyb\Ojs'{FIiڻ&ٕbg)):aR߱-1/QG88 _@BڼjkXBE.\+/5ddoM0nxj rɻ-:OWD!3Ԯ2CЊ}0Gw"ni+CWe'Q qYF ϣK Y"e9 PK PKy.FCangular-1.3.9/docs/partials/api/ng/provider/$rootScopeProvider.htmlUM8 WǴ:2Njz-P`+6c+KD%$v 'W=ߕeG܇ݦCLrs՗)MW:k#z:om_=_8{yӢoP̓ NM/pº62ħյʅG\HduR`xA|6U9 lU j_U1R7} !jj-uyzҶokT5z|i ~-g2%\O 0DD <#Mǁ do|onA102|&0ER[FP]I!s[TB ҞxV;Y4ᵕ&8Ž &G2FQS31%~zO∦EʠA>"9⦟p$O AАdcKL ^I$wr2BXV$7a<[2DgS"1 +25*,1ەLK&lyBI\h8T vI4ݫ 7tBqPFE?KrX*~)-qN:_SbRzPbbPQP $ҩvvِv>JRԼ=dEZ̮b%2Wi&e@\O-:3l yI-zY"L;σI?OΒ-yjoh \<3hNPKPKy.FEangular-1.3.9/docs/partials/api/ng/provider/$sceDelegateProvider.htmlX]6}:cR)mQ1mm"H D[ܡH-I{.IēiؗEq*8kX]wFzA$]M흨iL|㊟Xx2l.22`+%ފ"qז!DGa~Ȋ7?YˠiPfRdɤ1l]|Tڵ; +_=µr0{.4=qIa"&=a)ֵ;(#Gu^Z|7-y++Ͼ3ڋ[cWB2!0w߽:#Ai|u+Q9#.d )2OQq0B[q1q5?qƻ kVʂ0'KrB})1INr̬Xz$Toe!9J) s}0&1%nxNiT9["қ҈hF ZZG?tDdusTA|ܕ -hXd< hKpfysp^ՠ(G)'ļCnJКV`T5&#IJ}Yx(0˸ͤ|"v ݢ[yڻIMoT㛸EcvvXA1 I^wI[n;Ӧ$Q̄+&D(QZвL)yXhFFiyI*&ݕ4Tk*h7\CPƶ8lEaX>G-0 ~Fi޹x*DPo肐ƫ6Qǹ ɵ6( jbC{D | `?Nˠ|͠3U[[c&7#L9aΛ]ϒ0SؾH:!G|" *+{ )seƮ{o8D5Ugy8Ƣ,wbt=:Wu-<pxQ4kiASXt -`FJa.TNCC?+cuNi&3|iS|rNQ GM24e%T"] PK\PKy.F=angular-1.3.9/docs/partials/api/ng/provider/$sceProvider.htmlU_o4O1 m˚vOBpHă&'lg3c;ۖVv=qW*<φn;7 5U~Dq"NLқF Ax]οFj㫫5Λ)< T?:Ϊ8N9qo={3*8\'j6 uOQ?`Ckko!~a5DtqumM")Jk8:MA0 .]55Ru;@  FZ5S_ixt!2- \#4`m5CZw@ȑ{3/6>z !sbFpZB#Foo>.M̩۷7̊*d9 %ԎƽZl:dGbpGvKn$<{I ^|$QvZ,R#)"$7}pqp:WU1gL.&î!e4Ne4g[u4iPd$'{"R"bF4W/9 Ʌ62&uW7Q$Z~aBIE.F2kr )(JULj>{QKLf=?d}fb&g>YHz {e# ?kI9|J")8]PKyܩPK y.F+angular-1.3.9/docs/partials/api/ng/service/PKy.F/angular-1.3.9/docs/partials/api/ng/service.htmlZ]۸}ׯ 3E;k`:b$t=miDx}Ͻ$%S@_sV\B4iUЭ-LV633{QҹÊU4vʄ9'/75Kխڴ7<Γ4懗jlmVwxt0B/Vʪ .mQ.6+]N/ojE!ZB{QTxrW*{YJ=6$I^TU89/.d[fW^BժABnwÌVNNz1Ͳ"y^]^sN+{R:,iԸ*o:ihi_h1GW^*jnp6fmzZ.ɜ{i^wZ9hfEM o^l$Fg% Fu)SKlAlWIU+DB`fȝ+F>WP[JHG[&(Kq_+\~ziJըxqqsڹp.IђK f$Ģ& x` l+w KAĕ"4CSՅEQYaM A៘}=|$L2&\pRuȓѢX;1iM h2մmh2:q;޽Tb)l 0"yeM( mV@:Ʉ'(J1gX ÃcRM-~@wTYB:oP6nps$vؐc x qvߢ*ԎC0K8 NLOUiߤ{36uK=2Ixd8'zQ ~ _zNԓbcbeڝց \b?=g szꨂ-VC{M:!rjGd>@@8]e**zAwZOk|h!nF/~F"!Sq'{ 4qEhs, f$d~ #^:cUY Bi'x@e @mbA|25\'gȤtHGO5:ϐ{Y7@LhW7N\T%߻oCwE%i+(A.HzKW8]ْv }|@(9Z< DrHעG8ׇo#g@@M <?gop 6IDH]ؘz@ :'aG\sHǺ7]r\Њ+K'_O FD]tYPT4R&p۫KCbzt^ƧYǸJ1U PӧUTc 2ز*15?ip6oƋPAa^T=G:n-.~{.a಻lYlP|.v :B9m >G4FCTܑt*>Eyad2C QzrϤk$KfgwZ/0`is,ά-#7Wk7SS-'dw,{uVhKS|i{pGSAf9#cܷN*Ŵ4W5?J!axCUJ%`Bx>U?\gPjn "`*E[*ȈRn9<+d)!%ko,"Du,uqWZ OuNW^de]& OJg$h5kD$'>9&UV#,'=HF4Tܻ2(x /ɡc l;QOVm۾y8|{\6Q EXxv~G "i7vdp#K#DDoKs Ů6&?=fNxf$~}Lq5.tBWxv˧cx*~0!:g-R~# iS'#6|g}T,9n8Drr ƒ ؉c9ҍ" $CR4.aXl}T'hӪ8y9C Й[4*D5܊9@sy2[R]BfӴj7 |ǚ m j'Yp]|#pw<_-Qpk+0.=*""Fe oTۆ` ߠx[Sa鄙[¾ufDIUky.aXUZA1m5ռl^/ի(Ү|HЂIf yrY =+=R)#6yA.~eaEup= y`gd.5G9Gop!g}ëɞ,dqq2z?O|KmSbtXb}fʦM%~/"2r[r-Un8EYkxWk@$)|q /i%~'_P 5:YW'?ݛK)蒧Çۏ z_S!"D_(zՋN:]A*Gn`E_c:db~AljwVV?^^b H ;_.!q^XXMTLa8<긆5$/eȤQ#8݇RƆxlYo R gWi::V'ƸIu>3y2] ϗDVEk[=}X{C\£tꑻ_we涴R"?9#Rʽ4#K?PKЪH PKy.F8angular-1.3.9/docs/partials/api/ng/service/$animate.htmlZݓ4_ mg.1mpRM-S"ɗ0kWC2MhFTw A?sY Bۘ9<+2R`!b\CԄŋHbjD"eJ NY\rwVjN9M/Ӂ?r}>),7T7jcPl%#O0I;Ij܄4ɐh9 Q*W)-S p% UVHHnWIQt\IQu5UR!8Q2lz gR URd(Q5bnYQq3i\RCk[LTPYðC:{:ȄPe^m`{%Ք,CoaQWOMM CZ' ]4YTUR~0?;)Xު=:t{Fω~j`Z$ [Lg ;}ZMyo٠"fqF=d׃"F}һ{BCRh{(ӰS?/2Y]*OOߌ@6P>&poNahzK'ڄPt)!JaݺG[>} j!`4 dRub'2轫8w\jo\=QH&a2 !"\G< Q\lt'z[}ߩ&ىIvXϦ #M9>_4nKۂ3&K3mۘk8 8K&!$p{hdM$(ȋ_sML&R8]Vn$>[2sGr~h2.W@,uȝg)09ɳ3i/FUBAWNpt bkӂ!0H&ȒF!:Њaq:D}ݓ㣄ZkI-ulM՛ucn%fvŃ>fōs%iR';?0y0DuP؞}EPyXp e8G6#:\vIC8uL]c͖6{"EB$N+p '03lps@RqJ#' k 8PE xQV&ϤU3^m )s!#c?1 {zIYLS+D +x\b+3ɭBp>x2WֹeۮȓB[FJ+_Rغ⻌K@Mܗ3DܱGv-<*ōUW M%΀d--OV7T9cΣJbt-;-Pñkd|޹C3+i.A++7<0}lװ2x2]PH&}Pho|LVd=<=A }6Շb˾FsZ|n bU,|Qt"[N( ZdzQYTi3jԫO"0(R j^t Ƴtr3E{O {Aby(PK%/Y|O<;PvC@]x}BE*skw!Ÿeg-r}5j'T2Lh:˓$m(z#EDݬtȬd2[&WDwRM8rˮNX% 1l-&ia'Ms% 6"*FJ HOEVuᓕ1'ZAZf ,d<DFܫ1e4##]}ۀ]tW~m1I| /CW4v7%zCZfosEd9yD{6Ewd :Ū+6'ةp%(hև)7ϔ?OAz+ 긛 "\ҩZ,Cx%ێEygZGP(SاV%~PC<3ozw@l4);@VIkSg:Ugc!! оzg6Pdr˲.i˔F8WPKW2 PKy.F8angular-1.3.9/docs/partials/api/ng/service/$compile.html}[wF;Z$Tealŗg'vYY= II 5^NV%RkoU8ɳ8˲ڜO8.7˼_bQv_M=nquy'oWE颞{v_9\) z[o_ab:~믾˼mO(W릾.&#;*nU~1;)U~y~pr\ΞXYwU٣z~rF5EE.I͋lY.'Myym/cewz5)t1+{d 9*E8Ju LD8W`:9J^wvfm"7b,.kb-ɼYɗ%/@I!K I6&MqlEs]efY g;U6ŸrT*1E+󮻲I졲}U?<1ыJWgy2 <Ȱf^xbS9Qvn1\wUl ,pE8uj^{0;׋b Ds2=ve x $gqW%6'<$&'Ā&_8 HaWy7^-Ū`) ?[M,\kK *ˢ鲜Nnuu9{^wc+{M"&YUMźʠ6X]\faJP3.6x $ z@|@ify10AlE{4j..I-Y?o\}) -5 oO U“fȱ| 6 U^b]Ț=񧁴hK㲚ʠʮFky|:޲lAQqQV / } Ų9Ĭy- td RX/&>±D#@Gmq*Va|t n g bN}}7J:EP'r]\[TV4ٟ64,jQ6LX8OfWTEBr 3>ΛlujS(q0F#`3ŸB|)c4.+2C~);AsfX&;g2CY7ew{?H{1{_)r;IrS_qXQ֝u]CX2,/{ 2~~j6[wzխk/7>m:7vh\g:|oDp<&7&,h%t..ߓ玲{[N\gHil)gvlYm|Sc}ϔ0\%<5v=)U]/?7 %U0 -XK 9YnO_TTcCuخ;lN r4t0S{4~F(~Xkֱ8$/ :6MF1Y{KZ+5Ճ{09YT%4y3jܠD;60һ8&gW^~6jslbᶶ:uk4Qx04C핥ηug1\^w&/̂"7fj8,~b4lN-q"r (-|3S„CB\fUx#M1W/ $7A@[ͦVƤ9,*&sy'1M_"E5ҿ[ ]FW˛=M;gILuԛ5a[QQ3? sۅtvҝ <;}Ӏ/A P> n'Q֫+qee7UC$ȃ+8nA84᥀a,_CH2dof 5`8p"!ME#QY#/x l^LlڎH"!`1ul^vAc3xOf4u 4+ A[HoxEL`?Ā:5/ :Ve/!=HUI!|Е݃I S!82fЯ6vyx[̡eJ/O'/Ca{udHu?nE%Ȑ; +Z"߬Es7@8v_d%Nw76iރۧŤ` ťlj9@ s]@ (QTQ}ѧP;rs|v:dl>fnMvQOU޽+5c0PT+܃^&3}q(=ƻ~GJ'}D 9_4k H*bCp>xĮ(]1H߂(D{Q&ٞ)ߩQ1U33*pBXO\_eT^5S -'7jGau_p KTRB0a{B od@׊tvH"= c qmRL'+ƚ)!6}Yn1CG\aG~khomIHzk4Pڕ(zFіUS߀xW~gËGyc\|"*?%&.`Ax ۀ[,ߦ< ^,sz27Bg ] 7tdi1ɍ v0xcq?maܱ?.bX pٯ>G4Xj ńESK90 fccy`.d‹oM.feat>fF=R%#CјgwzIl"a_<M! 7;coK{"S6!c5uxe43-L 1Q9St,b`lt~ #n%*OC_6m~\|MVXQHDPtG~hAl@ӌ>1 C9שC EZA~YLıʞձbbx]? &y$ KNcU|)X^YNjYghG!%USiӁzRg` 9h 2|590>ǂ&\r(yTP%"R@ɡq8H1u K:Y~K =a 􈗆44){*M=:.jI?|Yn )8 F8< 4X)|6$~$^j &6"od&ԩĹ\gTb޽Ro` d^#KБ1 N=Z*G;đׁu8TƷ4K|<`FYc~鸎j-%Oy TLR %&>sy*?ς^~t/~R劗`,c]0`6|PlTD2U(ppMSϋ֒K&vòٻC }zXOy 7GKeS=9\ EhK}ӫ1Ǝq8z:xȧ"C)(Not:R|@M\fUĤm蝠@N LMy9\ vl\L/٫?.JrYsD29Ů*Ж:Mm)]a%IQ#;ΫOݪEnoӱY6MӶT* eadL0t^%\s6lq?'V樯Wl Li = r^T.R$J~$0#4%; &NhX<},AF,=_AS1r|9JEOHe5*^ajd|"š.@(4|jeSm_o6 c?D_3c:è_Ti36m] y5h:CU{gL]~}X9 ?<T@EAYsmU\qBYY{@Rfo be\&$E@H;/>C{kŏez ܛl鎁sO6JP u优X C1 *npuYI9)&_O ~>)VhKOPp Op1 6f*/+me9C6;FumƕUІjM#ԇ\' m'{''fT7EGƭmUƠ-Zک 5v7M2]7'$I|ٱfy#o G+ KAttKxKAӚT<~{aCrD)D`]"yT\=ZPwOGd0>hq9\B^T )M:IB~೭+)I?K:jQ u[$,X~-JHQ4QE؀p@[#\ϣx6QQUM`gTH {8bskUHmE~w E؟W#S'ֈNl' -iՔ$C~d}/xsMҨ&԰eސA kŻ%ݙM2 fl . y{_uO=Lrn¦) M-8IS.f[f -bSFp,`~sX٥e +m~!  +*OF]bW=8-/MOl?9 w6Qh| ߚc(n+΀~VAGûTH>#{|AAI`PDRmb W5; A([(wNd:Ɇ"=1P]:.&8fa؝Z*̕wkKBO|u4#{ g:(T6m$<$vy'.?' `=} =L1Ew;R&OCg4(ybm*!vqaNpV, A 01alYh a԰^$M[8H9 pW^U,b&U?7wAYϼ,奛3lvnE0U4JXsMCjoQ\c:w.~Qifhbp2)f/ՠyQVѵTx؈9sas.d5(d@B.IZUu=$WkcHHGYh%[jqVidzUb΂h c|E ExQAqbdimTUѭ{bLvQebI[' tC?BkJ;Uf΋Mm(\axۡeTJlэlR=|(gA\iE8?–Хf۵aÙ׫^V,XpU)@&!% M< #TJ֨z{SzlZ8GRMcš"^QΨǥ I}@Z#ߏ;}>GLXP&HN$5q)]ECS?U2:̂^mCayOC8tFWl:`CwOחu5bT{AJbJ 5%c ڌs49a.JdXCRH !اg7h]_x .KA5?: MvkO+.Hhʣ!󊶣+q! +U^6bw`<0UA F`"{LҸXq9}MvaYvZ !%/:L;0Xt1">"6.&"ggz,6I.3 cy@lwMGqYA8'!yFeg4U(Ȋc3vJSR,q^AҊpAL%y1+xkoޒ*pƒy ':9HHB3&r5 &LGS-"ꀍ93Bz'30C׳gp9؄O RG| KmKg ќԷf'$hQ:?'N17rlf5A$ ǃH!CDlni!Ks6cW)pJ$5g\Nk*(NxXvҖ\H4~u=ON f9K:=BHW%:  ތd_N]M]mBۄ`jWZ^k}*H" rxk@Ko]Kl- 4k%} #^2 g cˑƂ>ٵwIpnAJLm*YyRPjbii|? ?37 ~ J-h%TVW,|PɊaDSzr)q5|-.w$]ua}|G1=.!]]~^L䇞tR.zOm3.<0y<F?+S)]󞴮%{v B@?pڹ\0׊I۠dpF9SqFOiJX/%"CFc gKUTW~염,<~-AlSdTɋ "=}38FŠ%΋|WV%1a =hjy%tP"3k$ ġFw&H[( y}>R=zFQ\0yip#La`yO!x=[\aaW{IVGBTnٱI: "rٌS$F]} b%5.|;0A@k"b=XAͫ8k[@@YWܤA^)@洺3xJfAH 3,fG~0d_a@$`e7_Y]3962,EW% 򄟞 8_Cz?Lfu?'۝u4@m`xI+È:i}Q 9 $*B 7{;~&3B$N-9?szzTo |YŮ)x}-b,ŧo? H=g(L~#%xGZ*}pȋ"\]֟SQQGk |ebO`wFR׭ď51? @|]nA_wtZ?/@6r(xKM5O#F SE$php9k뻭¡ë(?IyH(@B 딕e5JO.a@Y |/ Sg75f?SfڜPvdgi<Gw+E\&.!+R=Z.S6ءs̉  Uh}@bI%pE.dIm21 jC@U6߮}<}!3M%._! 9=P!)ZjXCĴ_-)`k(?4jJ/ezd һ>=~?.CL}Tuv)w^ly,IxOPj+x~J=i@7t{U&jofi"a?5$5q.ǙbZ2,].++@z`b@1  ˸v`S XQW>&XJ)ܳr_6Wyl(qiTd&)8~O{ʦd|)H$ _e4tk( ?[Aʱʈ)NְucJ7iWW(/y 6jUܶ:v}?"t]>>^XC0g4jrV@o1 n4"&ñ*8f@YZ$ѓw?KC^mCϤj:ZDhF?!_D $ۥ"ݡm{/^9΂`ϫ =(?bΠTSg6jv۬ 9ॶk4݌094RwEQ|b' J0,)}PQNmLH #I52^ѱFEgU@d6`ָM3kYIѝ4 F;0/d:.ģ!ǁ^;SĢI{ENP};?<ށW.=e@VSE)ך ¯mvCE\@ I._cЫQ /Ңz3GGd(R,78wyo{QÏPe)$g $L({v|i%x~vXrLĚ#--ca10e)tP戋N .?28YdkXGRuG)Gat@\L燤TPy`ڤPп2F 0W5ϧg$?I GNj_AUpΠK:-K'ޛX]5tnY6TCgLHqFLy j49E ߻y#ة˱l,0bEOӌ~/(ei~@#mq=fF4%g! b$q, yPK}C3PKy.F;angular-1.3.9/docs/partials/api/ng/service/$controller.htmlVao6_A(m$Ŗ4Zlݾ @IT&#)KNnf MwݽSYcql)]ӗJ2}Le!2rF08JX˗֕=y5vja+#KV1Ϗ~y{u̪[{{,WkV:Eig䊛qx.Yۮpv0&U&d1b*x1'YB~6=k)6E`]߶=dط[U*4?`mb,y#x- $ ي49?|jYso73}z#_E:fʻfaOJr-?"ela)#`YaKV[gRe1Xn p8 ERsB ykϞXf6gWNr.vgtGƲrf\eN{zJ{Q9maIwL<8+'j@pz3f5:;yQ mh g va| ߿*)~`Ƃ- ׳<*TIsd}Ԣ&t9-_OH^M""h' BFCMF':-^]-%C$8.eaJʜ}Azw:cgˆaVdob=r[(xp7y.H )|Ո+ h|)׈W.1(|k&cH<5o +oUo ZJw"썲b`iLBh9s՛[]{X.@9߿"Thf%3;Q޶ֵQA#Wb05[ 㶃iU?!6P{E&#.%Fu*O`'*I멌nn&xlEs D6 ЎƏAz57|E qkqt@0(P:}jWÚ?@|-NLKXehlSR*[!;Ia=u?pLIq+ݵ;'scmF DOФ [9DŽg֤R21ȁDBEu~NٜJ^ rذ[!RSÌ̠*>M}(jqo` 9)AfBT sETZn= {&bI6YNFS E?e)nk6I Df0$7~㰌L$o4d^H^C<KR9ϒuw`.cp\CR sGiYI$BI/(N4 ϻU)5ɴ]fq rAf*8= QV'!$D$?6E );--({$X:u؎Tj*JbGJC`z´,Hafmfb(yk5!Y@ 3>Z0`môrٙڝ49^/ƲenrzU3c?[~^"ifFƤp=r)o$ϫ<^56[%~aɑ'2G+ټh|zX&A!T ]N^M:Km56GӦMnBȹ'-4x8)wf rՓPKJ 5 PKy.FAangular-1.3.9/docs/partials/api/ng/service/$exceptionHandler.htmlV]o6} ԏh$SkECXvn/ChZbJ*I9~HN6C$)sϹdYgh{y97WeJ׍ѻ>+[?/.Қےn #kyKB7vՓO^$6Fnà >[RQ]Fqk/n0zO6`䎛Y]ɴ.kad{6rnV?7vXWXuҲ7J^/S E^>]{I׹ʆ0*v΂.]P#63^$@UG\cz+IV_ʾUe<[gƍX?ȕYGCC !%}H3Kf/NQ  D}U߭Jj0ƺ VQzA~7|uSH6`k(2G;(vo|w{Y0lUՏn 2F rN/"oV RZQQ`Бum wd)<0( 7cfw$#N'j;J@ԇD{{%^/<@Cu`j*fuXD,>x+{BaqUly9ą'[Wlb_ LCr99f,U쨜"@쒅l 0ʞ~[g1{Gl:Oޮ5/%ٵTj$06;{)I 'Ѕf;wbFmٖK:n _zHϹ;\p=$ܢ(t"ܪ3iG^a fThA=˖~k%Ek!\}~'],M}TFmd/bG# MٝG҃O=C>8mcEh|Ҝ ¹ "h0j8!Gt;93*b:s`_Rv [zkv{TfUm(*TjH<Ό] ,:9^z OaL$îvk, 4Ə+ &y>@_YF4ϋiGT OW=7;#oat9^a +.aL`n*1 y?0=$iB$?Wn!FչYJßIJDW!K,(P|C9w8<uă3NtdFBb(~ QCEz偫UUkr!vp{BW9ugJ :V<w$AG;vi4J /BS*PKӯS PKy.F7angular-1.3.9/docs/partials/api/ng/service/$filter.htmlVmo6_A(ÀƲbMپAAKg Mq$wGR~K( sVMs^e\fq5o%7s͠.[^ GUfMy6ҁ?-Z>IՔMX}x{[1MkQh/?gNbMLSK n"q_2k]Ql#[Rqs\-,ؔyƋ˿3gb_ ZDWӭ=Gq@iE*.?6mDy 1µ@d%)S}q|(<)bZ|E:Ӗ5*:fh/yo)  =no{R`ɃE  :̂Y [(hV¡PhBFc)E%/Ah0I|[ƑBf߂;d;*ak@ L_].]+WuX-ڔf"/ G+m0*v/ U]in-ue {ݳ'>{ y}D5IZHeHŤQlYs %1Kt\:*>y,zQO1a>$Kn6hӭKy ߼L0ZW7DNA@vGp\H [F[h=wӦZ0:|%Ak n[&K>BbK>⟛G#G7 53_جU!CX,,vQ| @yf1ŻDaj!*gi~!"\"lu-#(r@g.#tľ<-(&IAV=~TŃ7MQ)=n}9<)}r)]5DUv"cz5 &I-=ISݧ 4 UjXA_Uwj7dh=d?ڑ1Ae10'2Qs(YM#`P10ۦ,*|V9FK~ALR`H?)axaxk\'$d \YL􅴍<8Cy6 Lέ>:F"]E`-^,A͆Q2|\,zrwϾ~c I fQ2_+vʫO;?dp0\S+̳sj 0wqS@C1AHA:4"3,!o ="FQ@O6i[& %G*~m-ipfȵb톐QԚ2<\#)d.K42 𰉮W"ԟh"OoDɾj,g3]ETqˢICohw0),ЌnIdzB GF\:K!ՋB%̟4* L#mҬU1Ъ >XHN:S6| zѪ,5'>QP*}Mc m#E!$_!XA\CY Au: .Xh=>lbROO)l,0QѷF)ЉѤEWoIkXo-ʤHѲ̿\1;!.um[gu>[f6_ Xì;niR088qTp30@Bp=Vv/,ȐaLEc&Apu}07k,3/yؠu' k'_N.-<./± [JZtօG֧q(ʳNkliXQ*nv1fCS-i}Ćkj.ron\?i= i 7b{ CUFY@U#0`V{y3BuI ` )n'^ZpDX)r`!2si*2PA(f‚Fs˲Att17-x:K!0w[a`|nz jHbf+_m1\-~` 2C1Jp Ј]hyA`0{"yɸ׀P cQ\E~(/P숀f01.zr*x"`U"S>AMAqIQpd(}F"a:0ѼY@l"jIĚ(:lp74ypBT\z76!%?yCHF \\QbXcgeb0#j42'ڄL4"9P*UX~N1y@lE:,<^{^ȼ;m+S%|88" dsUqtŔ୧oöq \W; !&SK1|Ie09]6hrRt7S1ޤh8$w`_ż`M-G1N0SZa9c1;=~'Xg 1Z搅;FU)7A0h;;tLC-$vk# »=o|cFxno3ÂZFWr8f/J=D;v/yCsh0Ga}wGF?&( @|  'E*o(؞`&c1 whYIBS2zgE_C *9'{2̲ :6f))Px^kiOЉg~aK]AKTTF&᱙PВ)v& OE.av<4uF`gGTXa|V  @>U>W.*h5_\hi=78"A1֯tssi.cma+Me2l.h Vӑw@-#j0y{n %=>0w b+2:˺ 6_6V8Z?.F8h*' k$x#{#9ԭ]i4첫MH$%Aё:o,C +Uj8!unf磩LE҇q3Љ̂LwiVŠw!obV 'K Ԯ(fI2Zqi@rF%C&s?A$=mjx?< j1݁/cYnR1eAfCD@H0Cy?[%)J\eiR"3\=>W,ip-r4(cuU z1أ/fmkaP$-P͂43ke~hkn%mTw˰ ]1g%\jBD_Mkg)sd;mf'7 CG (@hrrNq PgZy܃SjlkBѵ'"f.f`H? SQ4XHտ UUJ:>@n*m6fuR{=OB 8 keQ eI䀏\5 ƕX Cͽv O[0_Y__YZO@"zt:X(^ 6t+p᪸ 9veʫ薈="@b)SZhBsԢՌb4`q@Jρc8m)od0gM$QK"",n,>2T -2\OmL?5d>60Jzn:A( b02 CSaA ^FO jq |:I"jv¨MF/ %m7K1V2[dxN6 ܆ 0t<0%˧J3@}ɻ&i˻Ջ{@T6֜,ܿ@rd*aΏ} XX,'NN{ s_Y-ˈ6 PL P= cL=x@=Ͼ.PY7Sf=U:,'kê6K+!^BAtDg,h*0Kؼ, Xۨ;˵h2S&K. &c'Uh2KSImqN`wY'qUnKg%mr$K}W*50} NɢBZ/BOZO\C,t\GOW#)g s>')D'``=a ͻd`2$;tbM1Jc~:8ϱKc('Ļd,jQqɛC.{58>y*Aȼ=i٣;ѾcYl` ~ER``WLl ^Ni,pB}zYY59RI0cX2 ;\%W90] ;oipwN Sc*l h4QGF6W4v=u.N;X .}DX˫hx.^`F$Oa66Ԍ@s#[۲!:պz/ukSl@!&^cNm$Nt6v- rPG=꨽6pO<(̓ȣЄ{J I,a%F2* 綱bg9ѥȦf/; oAE {zĎ -`XBvdz/6Ӧ7QxnM_Q-OO1Ҡ6E0JKl]4q3WdjA")J'rB,Q(7ClE]Ih0!`]J#VUgXjH+PQ4l9 X=Hubh dPS׮ث#t} NWUXV28.JnDQy!H%1,U&a3]d9>^(цGr-VB5e» (-[)bė/d J-`J 4/AܦW,sf6ifAqT@#t!f3VD | c rьA(*QykvXLMC,v >$D~[}x@Ct TI d6_NIVEY*}Q2V@TOoG Mh5B-3+BVs ⾾V{ Yg1ްv(ֶ c <΁326>N7`=Tnmu2[*[$p;ׂ oێ&Tu܍f?@(e_rӾRhruU8D4=ՁUxBn GG%ފ';( krdQyZ0cyW¾8DاWorFc2Z/wbN/'AAu0xRWx.O@nY}Ѡݯ#+*cF 6< sF X,=}rNqxRsOPj 4Mf# ) !h&wQ򤺓ǝ%1zYVQ1Aݱ((GcDװ h!qL_U'MU6זH)m/\[4Yu?;a U-ԱN5̬XTM=:wpC\{e$md Y G6V>Nh3mצYc416|UeP;IM::6&>]aԂMzFHY>ÿWFF >lN/&@q:ڛ`UST7Z'@&,Ư: xe%-e6.SkإqݱI]OR&AڐV~#]nODl{M+KѬkndpϲ@l7r\OTך Н u1x27pa#4>M8wpXmy<`n䢤d(S|ٰ~̭~. z'dΗW]-8[MT}9֓,1Uk33onb̸;z ]g$rKvϜ"1%cc 2n&6]T,"h&@†2kyG淞&L)d$i Vy;P[7[NSBDnCaVZ ^;XWd`փ:yM%yvu0yy rb*.)"gh sh[UU;ex*FٞfE@|k SAVży˛Ȏkx"B-D`/X{}{fA8\iHGj1n^~g,G[WbE+Kh ʷ荪RE3cjCʼnL<5LKSCdTm`'?^^=^1v'ç[Fq<ՂDCrء18Q? U&g[Br CWbuBpA@jO)m9rBʩCI|͘d jå5_1U-qE=wumJD# M k 3h]lhr9\{Db-G2jjh y-CRŎZcLMT1U'_?9}r)- ..!v7ZlѧR#$8yKNZ^Zfl,铣7F_XYOA}ce]ʒV<KoTֿ6c%aUK0'J_H"Q@5 -@Ny??z' !!xUXY׭Ź;A:Aj">dCXtmubBt +>BctMarW.%XLfTۜrQ*J}[u_hf9nS"Ni~ֿtDF3#'xf~EB-,dGX7rݍ6?r8X5VQ/TܗWL[5ܔqbY#*u9M>miZȨz~wVMYpO@O~{ϲaN 4g3Ը/]Ԗj:\a!UzcBb%x.dlʙ3|SJs=*tqA^}W"Jag|MHOm!cw~h;:TUqRb+ v^IwD?# MtpxaXY#kݏў/8{9U +lDGd :Op;d_{Ʀv< /HWbhX;u/wL>CqNru[ko8`^,~zMvGP-l܈9`e_`o7pܺCM@">f]Z@hV1,X%U(iClPX/ʂAcT?|~qRv‡>,Vn<{jHz{f8[ǒӨg$6L!!9!ى~Q^I(Iz<`7S޺}߆X' l!{?3b>s9ZbM6aOL8ُk7<8O=t{wi#ߣm66 J^7Y5Yи}2\߽[Ֆ~c,mtU!OE%jܦ+yo*J\Icp.Ը)f?  nւ*WTX>cn[>3pim'LJQ TWr5i͇Vgp:tJSU>ڄ]8B`u8m#S DYy`KmaF:<=!Ym858 uG~=]|[wҴ ݘ ŅaW`<&x;Ϫv4TbT*>bx~ij& ޓyMH#q&x_z9˜ yn}{gihA :se֑BG&tFUeV!(9-$:MQlH~YQ=i1ĹS} e]u%zo8V,WYi4@waX؍TΆKYMao`PK\PKy.F<angular-1.3.9/docs/partials/api/ng/service/$interpolate.htmlY[s~Ҏ.St:(t[58K%$d̪Ņ)+vyg,sΕc)Ey3mj2y YJS_G@ы4QYe/RHoMq MU ; >*H| 6l*U,&K W|<ҹ#R܈XZ)&:H\)6eAS=Xbv]B'hlaT8X*M~fT . >ȪG{=yJ\erDUDT_I._PÑd%zo.:$!LN -#LBa(Usف`u2M6r)%<o.{S -;00 yUT?U_lTc@2XF˞ZȴBeAJgHfz̪濛![X\C/XzeZ[v )FuZymGgp+G T sb]~P׵˿:v=c{t{Fҕ ޴"/1]#^_-Ga ;Y].߀ȅ΍GbiՈ,U?ڇT&'odHIFp D@AEaa}(%prۈ\\bEA` n>22qm&d39/\|qVU^Y.itYZzP˳6*:cu y6 2J!)ZB\r 4D= GHc 0p& 9CatjD>U^+ OeKqړ؛ٓC=L~;hTӥ3rdndMXx9(h 0@P mx588Nk5 F2q9p(G6GX=moV]Z!&@ |1G܄R\vDO@ '[ JeyU7rΛ4[>>b`D hRUf%4ReZN>ge%wJ]:B^1-eLrM"vZ]\N|κv~Oz1V9 ϕ  r.@:9ާUvck_}_WR6{K:p|2RP;iLqB&HC>Lma\a+~ސZ'9#hϣ4+jUX^qu2uR8!Ahi{ 2? ~ŷ5E'GNeRئk X "wwX|xG% rE'sxMܹ8EOww\CD#, ]7R r2'Ha9ڻ 8MNSCHV7أ" &:#$(7eCvgb.#VQĩj( Ŀ'_s+Jn12r4.Kn|w^duO1\spAúHpUq7>l]@Z!`ފ;D+Nx(aXl[[ęʉJ:tjLD~p DvR/!B̕|nXl=&S%;pH$)yXÃz`s8=)k穒GKOQr5H=e WCvpu Z_EnPݒ#:vBy"ڝ3$k0 N[H?Ӳ_\yBViT2lo]pfɭBmS` ` Mat2n(ryt7!1_2|BvK>qPoTWd?(!#.QWh!q:FM ]q~+Bk9Q&7 ^㒎GC_׶ZȏɫQ/kQU~s_-9PmkBvO&yL{ sZwSVj9)#MyvSr6("td(͡ΝvݸږvHv?!p\ΟaH}IG6t(L_1Qduyn|SAz/6Ƙi.6TYaa7r5X,ȅ&YGh˯D˿CշcA5CYGdw{PKyK 8#PKy.F9angular-1.3.9/docs/partials/api/ng/service/$interval.htmlZo⠸ X_ai Yh P '$&y,hE+7laO<'Id ^7a/?7z5%mvWټ,ƪ>h( Id HET"hd `VEfiI8w9Ef15А IYv|#6ln[:SMQgzeI'1b),AUP*TE (Xkf$nF k+^CBpOqpD_b$b&Ū9]Lsa[ 0ρ  =j8..es.t;i;"/Sƛr+SFTdsK8jSST0iE. &Her_XX$zƙYn]-2D'*:s`ouz{{/VegbgNzR!đmde7|hXWd z&P$*ƶ&j9]u^Jb`D*I&Z9:xRH C7YQ ŀ9,F0OJ5LFvVW0 RP)KR& |dEʿRT SMM\w%D{`J6vx-ˍB&ȊS '/K 38Bf)AUTp4SfeQͱIL3qTIA8SlJd<]L_W. 3٪>t?CQ?{i/gHg\\ C)OA׋#IsX iᷙCm"m:;16de+$S XQ,2x]l'2OUqtx/%LAX;aIyH3Ex!q> t*yU tuQb8yDŽ3eN)L2Ke7 2Nt(<6QbB%Tީ?gX)-J [J$VQ#Q .]vF끑 )(dWW"0bhg^l_Jyu$ MV aB$^_[ Xqh Lj fv+{$kHaݠ\990uAyk:&PZw5#|qUn7*%ϧTF@}6ZZ@J*N'}DpuAQs @}4-ʜ5/}A|ur vb@D^U6q}]߁Unݥ ^Md9c/9 E[d(̽@#S]?pŚ^ 5rų/F aұB@|5 %_d|/ÀWzYd3G20Oo 5C7*!0\7BZcO>v Y>wxiS B/K:;Fí&:,hf;%;aE v~\cWFh=WoeW߷(Fs_^Y__m7 Y4wQ{Uˉ/PʢI)l~;}ܰ n1ОF7ԅ!TR>Dʀ&M*J_474lޜxF9gn54R3B`zWwm w~ɭn~ďfйLO!  mۭ_U+tY2 //.qE;h0.+/Dc[34wƈԝ ow"Ȅ`Pu%f" &Z*igO"?B#KZqp EPGGtcB8Y{jFOȘ4/A`CQWպ&¶8 CP-n|w޼y`ОɍqzQ!lL`mW%~EkNCGYXeVԯ> 鸞zsA(P?#fo0~$|(shLS y<:חd|iʽiU,ur2X既N?u{Ldۢk%Ey&*D?8zbS BaooF`(LHY]3s1 &TԶ&)r;5l7͆HK3ߩ`OzT< ppʓls,*pȅ[ Κ|oH R wLԮ)&~;K~S$0Pa0i"yvMh?.iojm99]QUd& ruJ՚\ɾxPKA%k&PKy.F9angular-1.3.9/docs/partials/api/ng/service/$location.html[[۶~ 6kɶExU4iM\ڇ<mEw98|3$%^6@l-I oÙXU;sA̴/',YΖ{k\dt6KYRL:mJtPu-g47Y=$}z{ά(<+c 5n'wDVȺ>5gjHTĕXYvu'0?+V\gӐ짷I]=':}i 7׵xlq"ng뾿ciu>LjYCgs1.K Kϕ̕BTj{)4嬟6{6Nw=S\^2sKD)ߪ|Xډکxb!hB1<&6ZyhCKyCQ+{!u]ɗڜ@#RoSGGv-C"{V髹jl8U )=N9B湅b0@ ,Qsu S);Zw(Y\9E #!\,5 +=y&u!'3PȪ*ta $MLK8F2uL٫F4p&~{tFTH3l/i;'-U;ǢfLH9KLaVpG裩6;& z*9ߵ!aoז>W-KL0 Dl[Ɗbt)jJ|{M%ŮP 6f+ d7k儙rsb=w&3űXn+i3|e=o8Uya7]b5 >iFGgK~Qew@aZ%%`@1?yc5't~U\V5QmƑ iڂ1J>Ƹ'Z@Xt\ݶqM+Y$O؛8cV*H[B~m`'=#arFSӓx)`LY /)80 ~}jBYflN;[cakQW*S&e19??il4KW_oEbYeTL1gP3b,-ȫ Ŏϭ6 <s ;}'酹03n/CqkԈNoCqq1{7iK c<<;Rc7?{5]MV_`hΖCCƗVUdOCXb$G;4bC(f' N hǿꄌl$xX-2Xa Hz f SX`㬄u膳kt!r[tZb߆+;]taۅjI?9߱fxq}D-#.Qt#ǁx"ܺҕRKFan`>o/0cv=]R>hbZbqtp}(]Y+Wd#R /D5]9䋄SBDg%Y(e #,̐")$DM)=g X?@BeJzWJ̊1!Ț6,>2 ?p v-D$6$c$BL&>8t=,&_ b(՚:&6Q1=a$9$kPOw! 41P F[w>en^njk[@M \k"Gc]6"NLNZHsۣseӒ)MEX(jYW< Wi}U4L~iQނg;-v!#$JJ gI ~[JGmjfgh|M~/_?X %EkhDi!EK *K?Htj.#kiU1 rԌΐ]>M{|jMdV`hs/+ߊ8ϜwwjXs}lIrb I⚱_2S[:h1(ejk.|g'iZzjhnx?qw8TֳN(R̕Fh〈ŰM7]vw M[ypn3r7%ҕ\cg^-tV淳Z󗴌8}ORqQV/+Jh:UW?‰jqQtz$ ?PS1#5jJpL|. m60iT2([%>Oʣ2FBgH(O {~B̟y|EՐD |TIHGuhY Rw:¶Hh# E\L4*ս]&/kdI-VT4۵?˷Q9P@E+1 w=VS,/ _ݪ /3\Gyϕȝ` T>Η^PJ O|5oY43mn`[$:?A ;ۙ!;:wx:b:pw 6&v T ۉ0ğ|bЙGCF0:u^b\ƺY]t X>N`* T.jBIeSl|_@rJ.BOq}@u{+~:π^PKKc ?8PKy.F4angular-1.3.9/docs/partials/api/ng/service/$log.htmlWmo6 _6j/zq< pvp[*'Ma}$%i^4%G"[TZwm/oyVU^e*;f\47gEv;[z+ĕW¹j)f7?9?m nLonQȲ1Ԫrnv,W57"0ig媲㲐q_TѰ*)u"AV:xg"~⾑b:tJV.[i'6fJo>QhE;D$,iXIJԞ}}oz"oQOq]]&Uyp^ttޚ~kyWk3giDt驪;H]4|+DPxx إS< f Y҈NFZ vfsZf y0F-?\KݘuR4zM >A]#o>ߚE? Racx-)ڋx<7!^D=nLL7#1|x8 ?aZDʆˆ w#Cg#ڍk},>l8x^x6$ ̖D0=e)\Dq[ӘWaيe6Z{zJ׳z}m(vhN/'2SpWQ8g l]X.t%`_Hʷ Pf ^ѫ!.1^O[Jt'T:飫%/u{AFzN7]`鈯J۲jeOO/)vz˄R†ǭh̿4FQ8_7NO6\`k+EVPgcU >1G. ./7Vq~+ !g#A?R~J"o7;7~z?,:Z!t/B 6؋ݜG8lsob``{o4դ0g1Bo6Ni]ǣĢT*̄`]T3IY2pڸ #qGW %b_!2d اt`\X|`K{p=6o06Ey0G4wkە ] ?PKp@PKy.F6angular-1.3.9/docs/partials/api/ng/service/$parse.htmlVn6}W"IPId-nZalh)%$e ^dɎŢbDr 3Jj˳ژNߤiMݯB6)m^P5<ts\%VEViGfX{0iŖ,y%Ӆ+q'{GQC9K/}F A^SrbLkNY/Įy![b -ߵ+f)򺈩&d4/:b{|}! gXý"VK/f|ّ?lbN} ?ђ!"\sbR}Ulei}ICڨ0b2\ bM nA R=V?()ΧVW5$$& GyKY[ :-)E (þl;%a=dahr{c4Y)eBlAuVcp`{dƈto"39^߽x҆N$A;k <ٳ7O;Z~n;0soq,?SN-9l>'N[˶AcwH+1R)A:@)*•,s ՟Ke[tms:k>4&lL#(lOO;U k+ *gJ] 5?t8[7 :HmO~  ϐ&%hJIX?'XuaWdDC ]1A @5znb0c;3ݡ F6tA b^|< :  i_ېȰr{_8ص 4j#@F5Q-T `ԧX9'޲1hݷKh"䟿&~IЊcۦnbG֬XYN _(fۀxc`@[Bv,XY v8]2Euwym&&ET<1{/ n /Qj?;a/83d%Z !V' gdء[+)[ۚ!ve+q1`dkbL77̂ih;"4/Z[ArŐQB 8 _Fs AVFK.^Tnʄ`I+hnUdOFq Rb޿PK> PKy.F2angular-1.3.9/docs/partials/api/ng/service/$q.html[ےǑ}WB45EaƈD+P֣ @s] )?̬:ֻk/Ci4rdV$q/|mh<^պa3NU%E=z]"7FGoe15ƗeOa^ݻ>Ë_}—"y\C]|Ah4?~YRO>M7"!_v*mnbtsU߮y]s5@|VnOuZga>'M>nUὮuvInXbYsu tnsK90ͻ#v2vV0YdየdBEaf~i'4_'y!dxz^Յwyr,-+WV~+W2s1yrH7)Tnu]4Aq|%k󓱾;l%r攈\* P^4VrkmKsEeprEC]fKKi &j_P8fe[],BabGo}/;W 'wa7i/}Q ~^፼ܦ17?WEZ^]??o;j޵C4G nkp8t\țu&E*;w/63[Gpjr? 2w(Sabć7'Q |VWCrDnkeʹ>X H,ۻ5ܹL`&o7yX)ٍ/&c؋^ŷeZ`̤XմEOh^+;EI ~+}'~G,M9Ͳd.~6}r\{s?* $ӷwc?7"{:e@e݆VeqѾv7ZE Iup U/+ Y~*! _xpT m"]M t̃`/< ԸIB{? 8^O=oeeDayP+ &'+簌;W{8U-:gw~ᶘ[|z Jf<˓?w05Um4T81 (G/IFCQjJd7I{?Sہ3kƂQq]g5|y.-{X]7p#${,cik>XnmHd arxev   |{|i(* u*r % ǥkB̓j{ .޾](L-#Nτ2O@LF zƷF 63`5U, @NnX<|'7S;1xҷXԚYO#|';CBipGH%k0f7) %=FMZf`#*B D 4JaY)#J;ҭHMdbQ40ڀk"y3&AZ !ZE|LfџFB}%w@/1" > C Lv ej35U)h],c 6&rwv$}>bVܢCȧO^k =Bߟ>}yIϝddJbE(y B .`ңQBTaej^,!U2mD1<) ̽FcDKZv"C ^eb+5_A]%4OZ*RkUUj&fiD?gʐ7i*NQ$7c1U``0>4ˎJ6jX0OHF2j}~AkѷVS"8*lyw/FM1dܤ`NSAQ `,)nX,yM[/$EoFѼpJErX̓7c"Uo4@|,F{ z)>;쫽Z+>fow/F,TAZPGkp-ZkȓEiai\:r \gNXDa+ļO55֏!TcϾq 崂` ^ӣa+>|7D(B'&+y"p`j(& QwZHi T16Ǔ 3f:Zf #^Eڲ@ex'D ~~U;/& ؊yc?l!G^DpZGۇAi qtğ%N\qqh);wFbFJ?2([#EH'8V-9//``c ߃AGUC[y Z`6ك,x~I2\rј~AbƂ9&=`#hY:}cG1%,!)I0I&/ٞ2|^Z! ] miqQ.3N23ۻ:=rЧ7+9P4Y.'?~ps9C嶰4o씗1!ZBtP=ğQ+J c|8ǩ4)jHIlx18<[v=&7zTaWoۺda: ӗhn&jݽ 38 D|W2j{I ҝj!82G)v̈5H{5HW&  Y/mB*_%T`@`F SvH( 4¤y}0}=8.1A\`F|PGGDlIkp]JoKmaK%4mg=nvVױ N虀{Zj}nᖥ\ vBr`r$]!Kܐ Jאޠ={-64pbȣF:9(&=ub/5hdEZ5&wnuN\IG@7;j$2~O|=Q -y,p-S L48=T_eXqаܔvA=6 {3T_pD%ՅiTl MGM!&0}"0ߏ _d+ben]q'PSϙǹ ·&civ!r ~4Fu[c=ie4ꑢ!uzھhvr ҇+O[3 רڂcDJ^Lvh^*Rם37zBk1M,^xLX4y>lGFA,d/f_ |϶jxGD^,Aќ޴=f<=) 'tJM7Ms0lڏʼԘhpR ;)]{E=L>jSg>ʬ-bǨ R 31ur(:Ũ b:0hl\?&Za*EyOS&MԠ1@9=d;Z=qKiEϻ^K qh  *Z z2FX¢ G<1*)g4yH,GO aQ|<{[Pƨ%lzٝQ/v6lR'&k8€_ft[$%w\I?Q!% 稫ekSҎjGbP?)f`˻Jf6E2M(SϏF7"aW zR< &j34{$ :]g#a3.-B5h&rA">_PK8>PKy.F<angular-1.3.9/docs/partials/api/ng/service/$rootElement.htmlSMo W6HvOiH!Rozga&ŀ;M}l7Mֲ`{ڀuktj]%]DŽmz#2W҉ j[d1HfK_ vhe|0Fr2^m^mo>We;&EXU1ެue`li]s=[-CTfLwS-HID]{ ׹4>JSݴ%m2Jm|m]\xBaXT^Xn Ϊ7g6k3o)2JcЏx7(h s1 D:zeE,`6#˜t3gj"?p>iG"f|}"dgN 7Z^}v K#+S:Lz@~}NS"Bw@y1OUm;r᎐s;>`G.k]̅.MD.bC"ǯ^wC7J807,Sߝ,/?֮=I.xڃa1xЏO/WN=Fh¿[m{jg<y7_$I7'r} -/Y6is%ADn*><# Sv'w4{u i;uПޕGd#E/F".E哌NbvF6fHFƘxc>/A5lh7?纮dS7Ƌį#Y2< *86p5({#|t`J9Jgk+Iǣgi_(qN+3wI?԰Y .۞Bzu0ӫ=8'M뙸mcL G>/8mٔdhHJލ(Yxh@V.*\rwgY-s_lZ3gO6ønZL% ^Sr6?@?gL}B` ݓw VWK3b>ҏ')A~x*J좕XG7c<"ρL*cWΞ+.2zQ I6)zbvcߏ4~Cݏ^[XbbY%>)h-J=뵾n(zA ,f>=2JQ>6ФI&*q>Hʇr{>Ӝ$?;jjO;<.9{>]D%x ;ئ:N3܃lCT;Pq\^$y4D+d(Fxlrԃ$`ϫ~s|Q@J:H&5ݤX96DK?"+R>h7ŶӦ]ٚh-O^`p ~A@B+Y![`(mfe^8.DL1|>#1l(9x(ScJ=z^ )g>nGarN9@ vw/ V@cLt/;]Sp@rΎ0W2aoϸb703pBZ8}ʌ#!q3A-R h~СLEFrXD)XTTt!%&Go*bU2uĻ7j.EH2ca1\yBUthwM0K'Fs)mhFz@ yDsaDD\n5Lq*r^h4]IBI<DHbjR=t e@!U;A]&6-}܆"`#),۷@97[I . Ialoua/,Af[fŝPG' 4!5G st*#Ջ}ʳNLgUJZ8>a!w:@?co>Lyђ eAd*zAg@1 QAטr1<%aSGOw vz";żFA@) V8E)R+6'@ȅ]Ĕ#9Ab[ hn?*ʣB}}_Cq*0Y5-(mJwg^a*wlH[}.bDHiФo0 8#θ/qٽn{@X%H8>?O5ft):':{`TVRL|yJQбuP]:[ʝ%80̏uy`6r;$"*4; _U"KQz 2spSP8R4K]6רN>Aʌgz15XqpvdG Ö! P. eK{k(yf^m;t߉3!"  !Ubm K<-}=i@p/-]K߫ yo !=8{("A 9mR uI;j_q2$MYIie 5Ҫ4I:Jc6z$z QxEK'Lа&xB記 oVgm.= LNO-w h.JL)P{ӏ-La3ϷThc&>8`f`jl:'q)tg2T !N!MlxsE|Kwl?/>Cif34sO"/UdE~FY9/qE:p'HWN'[:qe/%6X8"tr1$l;\}`%Eˆ}2}e$'a홏R3\i$Z(isr:u`Qي g7Tvl]ḍiAPЄݢxٕ*nE*]zn1~z'C3{}R }eugMv=ndjrą&p>  9=9lfI)D 0Ql #juX'j_aM3/JD@ \M)a =J"!M0'",ԐI+zgS/l-I''ۇ]A@ =ׁ DdV?dԈ>w)=m)*6ml= jr,0~duwL},*7;d;KD b;@d9"B4`-&+5-@HДo:HP숂:tUpx ٶiφA୺UbPĊVPHVX1k#'H)Z74z.#坧O ok'1s.-ގ"Hq97J CdV1! IߚLn) |Ku] yFAŦ}n?A\0|nH sEcψ{ KA 0]nMD*)ÈK_uDeYس; r}}AD!qוan `׺thHOd5(;/cM˩^@ck_Z=3ƗճF2k˳wnlʏq1"N6s{/W>!,}3?`+ V)#x ȧL%@J6gUf")"L#4TV-d#qCԌJ>^4 }TcJS--ODҮi"3yT!*LLb3c@8ZunuvOlE늕7\aEul0 R-:SQ:.㓯~vW[-շXj!l$p.LI1gazC< ,B5gGVj3) UTX[ 9W%(x}?O 1Ǭ'>; }珏OP!Uq0 $47EH *뭒´Y(yNc>bV)R D1K`svLPf҄՘EJ)21sO4W/2) 藦HA+Qa.t3 b]|30'@wY @拯KetOQj78nU̚@.&Pr`_k>h1߸V}c=m V, ϻ\T YrPXCC5ΆP]eʣ{jU:,P?7q4/oԆ0M(u5d{ԓ.i Hxec\)99AoN4,Pwv&i <)CC5U`cXVQY kl+ #as 8djUmA!2~N?̯xFw>@\[EɧdbMz/pk(: _d=Qª517׉wS,[uy uP&HHZ ,J3vXmǂGBo$Fb날ZWl= º8f2z$pVF!#AIf/e Q#$wD%CAȦĄJel 4ӿ}"ȶF^`+<~1ŻC(|cC@F569g)$⵰Μ)!*QIÌbZĿX: -$NBm#~eX%[!lbch-U۠m8&JP^@- `Ec]ϦasX5l9H ɸ%L! _yAo36a\@@L&A 1[(- @V?Hh} ;m,K Sŗx!C-BKۆ źAW!/ l!h2BHK$Jp/ e*l@ ى8g܇!"al [Cr;qLD 7jn>YoeW댇bb(c4D.+5Jw}tVbs-+ML 4K 3\x߃b>dИ:Ο …c3HbFQ,bFI{Xe'ئ3DuBg ҧV;39nIp{ww[Za M%{9SR%ca72UWaa2==>r{-23N@JTPb4+sZTt8ɤ8`T86.̦I^}kd"YFJ?i , XShIm9O]Ur vEEQW ֬A^tG) xxE?m5KB8'u9'{ҕ6*{ҧ"=;Z8gw|x>fG[=&e>Yz <}N*lg< n˃rz2PC:8lQnȂK!lH)s@ !FI8)X*s#vE OD$5Td5>4K 4Vד=B<q%Fb}t I` 9)g8gO4FL#PP2Q"eQ"Vؖ,XCAa;h=9V2Rtl?rZlLSm/xPs,P=[𻍭C&}-_T n-@M*5oc.ͯPNZOAxYDDmYT!yM"Kg?kBABx P"\V'.Y:oYv>Md89Phz"\Eݸ,o&Ic +vyEZ3 t(Rq^"ZÚ&aȸ>?}Q&ݟ`Ә!DD.ߡV,f$^_O"4 X_lc2o}^cNh枀GA@јF("D<:ӀReV`%`!w/( jYV׈$9!a)sy!Ы{UeM=DY:ި(%Mȱzgq^=μʞB;Yze.]AlߔdxVNkJԠXa뒄Ǻ uAr `۰0Q$>ˁvWy>]ۖ:mOᅘ_1É;ҁt=];X,Hȷ\<Er UP5y+R5cJUFYCў!&qt8A!cgqYCDZKD-hӳzQDlY\K Ih}-C-;,`zXCu2W5OEr)@jFTA0 .Ƶj %Զ3Η$qX_"7jb"gr1alG^7NE 6Y@ˈq1x0}#Fd GLw"/`m:R'j pkGV1*eZ ]#)>um1'*m>Y]#?Զ (PdpTR &U0QSd3 RpKbNMq _ $hh.J\HSˆ.~xnuH3d Ǯs #>&GzMzҭ=?Kt{ʲ2*qXڎxP}+"'$_03#]\@r<)N% r, Z<GY gL0+8īI_I)﷘c֠%)!n 0()JL 1eu kB$oX!-V7yhMupJyW/ʄ=H>'H,(z?*"ECa=3Z3蓆bED:?j# 0nJ`T) NEiJ[% .3#9+"yCƨ&AmZņJEAjUT{]/a~M5Sٱe*G#Y6 H$y,PM.qd:$n8= ޸FLW @ Շow$d[rDG\ *א2} _;e܆n[PwV7zuw,;{בy"+הxWmFnY l!oa,jxɶĸޭIhߝIMa/ o~X A0kmZF ^zS׺!Fꉭzen_觡 &byrNAW (& *U!`jF%'KbDy1XԠ'h~$T "*}6n=צ;*;8)^uՌ}?C%,篷o5yg(v;l㟻ךtw?l`uE举{HfuSljl\+dvjۯ@'/[0"^߽ql}Xغ)2T߇Vzg#9)?Ʊ1K|l`kv;݁-bo-b387J\on[pu;\U֒;!+PKʴ:&PKy.F<angular-1.3.9/docs/partials/api/ng/service/$sceDelegate.htmlY]۶}Mۑ؛v& ͎!dgDx)@i_s/.Wzlw8 jy}a6fhM.Wby;[&wnsr^զrgժ_Vzpy0W`\.??U+{\o{kvjAߢz+yYlFWՂ_v+[!%|xc"eqN{TpN1|~ZD?M?v!^bv#΢Edl 5dֺUpgVJ͋u|y_5'^uV UWd@i2\Ę`)@>]88+8r5Lb!;NlM=xYmi6mzwkw}YTVG!$HO#SXI7Z7"؃<>agߙΫ?V|*Dۈ?'g N`ס~,^աוl\0 m-PWk+P"WnkұvNcx'~4}:J`jL#/&Ф]LNa&5LoOgac#\(v` .Xf8oקd&:к82waTB6v0Աو)Yt|vb2j,q@8ESf)/.`x$i!!VO-t$$.BthᒱJm.?!z2ޕ պϗȩg8A,{p7c|:V@.Hh~Eѹؽ.'oOLs"שc =˯W#Sq{7nQRWYxPHp2y| bX'YvC߷ kPS[Ij<5p?9FV D"A,}#olvZ峋o!,v?Ys,b͞wjR|l=,@|TsL;nA 1Tمtӭ7{ @FD}Qښ3 xWz>^Je|pR?pPKxWPKy.F>angular-1.3.9/docs/partials/api/ng/service/$templateCache.htmlV]o6}ׯp|4CkYCuXn/  hZbK*ywIJfD0eޯsd %bw~DȐ 5Y]\̓qXI4z`MݔB6 Gw݃ڠm4+/J {ڈz9N4CSlVkXwAW&zKk Sɀw6Q y{XZJ@6cy,ijO*擛ap)K/,ً7VsE~/փ&7q9Y?P7)eR1˛sDPwfEg#-?$Ks/ۨqtb1 O" /6"ɲ|H I|JG|r?zδ%e1U8ݓ"+_$Y PK:.PKy.F@angular-1.3.9/docs/partials/api/ng/service/$templateRequest.htmlVMo6WnIjЖQ{l{(zĖ"U}lԀ!Z yoh.Xoi}}{?ʲUcRnR՟VrsZݗ6JOè[{"@Ή[Ӹ/? 8{s-ʚܙؐV9a]afCEHj÷ݝT\evc/~UbWv^:4:%J|<1l$m  qRS4 ^ɘ!_s/2ޓḧQ0dY#bݲ{/Fvjdi3i?c(b/JQ2 9 fi'ElnH e42K*rs$K"cucƴtn5[hDfBgks`)^BlO75 qpXJ[O;vHz1gQ4=d+~;R9fl|k > `\;gb dٶR)VX`g!7 d#íEUBn(C>A't刖[TK&˲.heNVZy~TwiPOg C(r:( +젫!t\ ^Ԑl~c# ]1o=;NK) m}_x ˻#Uצ=f)p G3t+Qb*0lI׽)gO}$ԼTZg6?S29 թꌗśJx+XQ$0?[Oh9f6`ݰ+`mO0 ,zt|칝k4,q%:_ccdF݃t$7i=-fO\b<^;!(9j Y`rMF^Rziz(M% uCSr1 «<YGA+zj880p$ ͊= |R"az&'?)PKW(> PKy.F8angular-1.3.9/docs/partials/api/ng/service/$timeout.htmlXMo8Wnڤ@d5I/m-a lbK-ZԒ7l'iR`b Ħ)i8fQ #Ǎs}K~>*Wܤ7Z|}6Ty̝\ ;\e%KqYʞ /_\=?U [9X7 fٳ^Jqk/3z-2殥3rp\27]kd[]eݴ|me!bUrŏ!7ws~-&ʌ\6nƾ?Z2l$R4$Hx'^H%peZIwe)_EޜǴc֙r7ΔY':2' JI1+Z ٲ{%XeE-rJ i>CuNjHtU(.޼lcx6t-ʍlkYC9ߟlѷYg(`F4N3Μ򊻪̕nokV % _Ycy'?L(a-(9+t%k2Ӳ5W`zKG\ E g%8etU6R)6'SV-ډ8b7W QvꝨG5x[ ºS\TpIteL C BYoTGb6F0-Z6'.2djnuo=>XxЭBR6ĊbEJ~ځhΙ/=1POb >,SŇXvoUשKPSLYX5p,Z"C\WfٯD,Ӆsf|b͍6[qg-ʽ]C j!™kOUc"z{Tp"mc-N^w,x".`n{c1. i]9٬A,%|ZU4& mPilhb^}>ѩwcc<vhSmbUhK\!X,?WۯdHbbJCAa7>"{^@<͵VC≨}X@P:W Y_u-h<263n0'B-;Vɏs;1ώjoϮ^"#Y>J Dj5`AtE<`?FF{삞asD[QȦ 'u~1SQ^1xfJ<iD q+? >`oU ~KPXQ_lQ9n1Y+  E;-q]3w43v&HDo,A)OE:FxH/$632OџP | 1v#M2՝sB3!+b{qˆڈq{wWTKf\lz|=P.z#6WHVNZiCVguYmE~uY!v7OC [X`9 #} bB4,:;|{`g 7cBX/'/N7u~"VVe]+-  'x:)\K'")KYf+hArȔTemBpG\>bYF<~@on½N *wիkKel-Bk }j{b[&$p~{pwsj6XnqX%p{BpvcT=9c#m]NRҎ;3=5@HRd VB#9mڐ6(J>`p#/W7A{#[;$ԊSBVXaݘF$TlC%g^Iť͉N|\AVEj#3CQ)H`.Di2ޑ^HT_x{#Ӥ!DgC'8& &ex9.I4,A͐ÀL\!]EO*ugM|(9bZ sn&* ̠Hzg; },`e-e!ⲅ,#φ/3 ~wn#?UǕQJ0zz&ݵP;kٳ4v^C*2?>͒rFKM4HG<9-ŕxCZZ ]48UÕDq3o1|ҒO\J=滰2"NFhvnt5r|nz8u˧Y|-ׯZ{R5g!pӃl^|y51ՕA8&vZ}p]~l[(/|on" }TOQO !T&NHIĸ ~X&?}x (8}j',_fOV)M fۇ"XU磜B׳Laq|DPK{ڗ# PK y.F(angular-1.3.9/docs/partials/api/ng/type/PKy.F,angular-1.3.9/docs/partials/api/ng/type.htmlVێ6}W }H] }- .M l~kTI[7ȿ ))ދ7@~0%9sźrβu4vú¶6j:‡Ƴk`WuA${dST~[cM4^9oy~iϪudz94 btɫ]fEkE퇕LewUĉ+ewc|y~T 4[oUôu٭ٍM詷hzOU8uhT'D卼&Ϟr4cR ozMw[7)4\]1FqŖAks*|U1},JT)"r?t*rHLܛŠ 1:+˯@ZGKx:cBNZӴB dUgqz&DY`}PPmc8N+}6i@xdBa5cQm -?kqؗw<:ɳȚtv3Q^(4PJ2,9؅QAE7,mX*FWƦ *~ֻ^łrpQ/5z Lc *.,?:B9NN>4#m1utM+ ھ.aG6,uPPKGa} PKy.F@angular-1.3.9/docs/partials/api/ng/type/$cacheFactory.Cache.htmlXmo6_Ao`[m/MT ]:`}h--jܑˊР(<=SOJ4Iڗle"EkӏM ճ2i\T$y~n)/UȅzYؼ9z5M=:yipm[K^j:>x4/eJMHOjҭd KJ ;W>KY—ol&2/ )Pxq]VZ]LX+QL^1!n糵ˉM /,{IK% :`dk&0/Z =LK wm[D%?bbtEU#VAM&q7~]++Ek<3`0l%MN0M`|0.8Ы}^[H +vQ^*BuY)Z)QH/"POu:[:&r+! )|yͨ+PLԠl%iŪZFzհD I j40fňp?8yqִr|;*ywC ~2ڍ [W[qA3, ^%C2`ZRx%`?^Ҷ3UJOl2*+rQ~ZQ'UUՕ @]֤Ԗ$]h4ퟭ4GW] 0܂q̰7:DŽ(eKSKRF&a^?URс2^=}A.kptya/iy|iyLkܶ C0Z$,-O2В-#n`Wt!$9V+ (F\"ʻ5}_ԘDϔvEb0S.ssUSH⇰ss n`k4z0l24|bDĻ^\hc HD9WiԀ,csgA,e}P#W@ـ4 !=L?i+^9N;nPކLc[^'BN7ˀ;xH)BFN׷F(j8u̾2}n%qASqC<6 z)ZdZWZ d4[NU#Au'UMBqB%U8g ٲiCqMD*hj{ΐ4 Z'Y{?PK{\PKy.FJangular-1.3.9/docs/partials/api/ng/type/$compile.directive.Attributes.htmlYmo6_A]ۇ ŀ6,ž-qI#EYq޷+P^ Z+G[;:~&wE-}}|ȝrXI%ۍp76[b5UrO8]x+D7uVAJW*iuAf-c6Sq~mvhQVZؤIʬa,>SaͼӐE޾ |oLԙ3EFxR'cLj1uKC o^&K;+`׃0(rN'#NϽ J43P/ԗRbIH Fq'!|W|%T 0"e*J+$~#iQhP&)9ǀ,' BQ>Mɗy]FWNru7׵ X=9=ڊ9zZ'WaA"ɺ6R|KAGfx&kZhAp0f4̚\v( .Y>:@bDdQ9F~'FVlp\>C&$Ol=e62? W; dc>aGHDGtÉg<_hqJ8TAg;-us>9f!ޡ*CK'WB[Dz\3,(2 V:E8LN ?;m;J Uሒ]yPgc#@(2`xo: |- F"P?,.lgT,S`1r+Ɠ[ bJ2 -.PC>e#O(eαn 6(a5Q?U ?ظsc?Aq~KH؂=`TFjȱ$ݘ>/h1^<`.Εz '!| Pjn9T6$HN:;]͐ipLWCj H(>4'krOņ)8vD2t.8CM4+؁Jr,bQHZN!je"* /*=fYySEife6-(\zqr:&_hYQsѣrz:';[*M^FiXq. hw_~,qVt7=֕4N%^d"c`š.oCn̊duNǗ2xTiҨqMT7B(B#Ќ5gX>Ӊ>«Czs(4w+ҭAkբ9[LbUED&O)LdƼ$08.|DWF|gy|1@rEgE-PGE`.Q4] FB(4l Q몀BщTRIX 9qA]D%&+ @[4%]SeysEJDZLJ6v-]"m/T`7&S0 3/ .eN1E!(ɊPOS<K ل1QUtJ86:(b&(@@i[η7b pUXp12Ocv'"#El"<1\M l.gσ3/M(FM.V#EDraMIΒYJ@5to SX|<0_Un;Ov#zZXI Ǹ|ФVg!v/uv`ӎF\=b/R僰kF-AbM D:>I++蟎m 0$jg)=1d=.i$`] Y@S*D0' fww$[ 'tVN[et[XMp+>EY> +2aWc:~s28m[4/b"1wnfT@bF3Mq3{I^5`'LܬzI:tUt?A<;=kJB B1zc1hw&UemCfݐEr*ʥi;Xijo_Bu3jYй"d!E|kьxP ?. L؀'ݮ_*º`Ur3P82\+amDl># ٙ@1{~0 @6#t*wga~S^8w2/ŵ MS` 8JʬIvn@Glzwk߬~!<W\=q3@adKEMZ!8!Ԝtf9s[ b1*4K\\f\x~ EU/T%׺{:T a92Lzzy6Wd~C 2D >e8QaeZL0t flt Irb³kHVv4VeF8-6 Ӎ8E%kE!o75`(j=Y-['La ĈѾR"xDI!xW 3 մ\1 WJ:NN/8h+TEneU07`HeP8p18~բk6&CRNE@9B w@֚7`bW;uj%D`:d>D*iZ2\l.ȏCm 08wC壟y~!s^4&2hϝ[!5v`FR]KQBsQ-JkՃgYF)DQ5tCA8FͫkDuX{$ !(N(V"L?B+" ݀͟-XI{ֶC5xٟ=L('| iUjH bۢ nV Źkޝ[C|:Ցb' ^Aβ%O3 6o0eh|S˵Q3Uq{Nِ(e^Vm& Yč_;KQZ-BĜ_$q+#9_J*4"6 'cYw˙:cҹ:[fA! ZA@sLYxd ZYy% 5ъR]b{LI^ ,oMyG QHw[E-N䷥@7rN 6B\" H"RX,lb=q]3ܦ>8sD{cT_z˸ t * r҂C49!֏E`}r+7Ru&ae[`ꃠ(vϗ'" zX:{w@O/RQճbBfRe S Մq(?yJ`H(-B"F y[]ZtY8"ylf2 &Chܮ]>M$G< x@Ca2DHƼ"<0q4#' -]LF_9E:]&?3 PD 8@PI(&hUx|bƿZqr+zո=QbB/di6+5=H"lqmq%Ʈ@?XrcHOܰw Ww?{+Wʾooi1k.5v- (^oW46'6w+ nb"F*>~9j8bzѺ[Ӻ)i^|5 yE*߁Y2]p*kz YU-Qik1$YG{Sۅb)S26ػ[-vՎI|t\{E۳WBuUC։Imqn85"kLӨh`I@wZ\\()U/L;.i,i+AlhHF)r*jDCؔZ6UK$ɓ?1+ZJKN$f@v355`ʲ r^-`]w8}5:ts?B3| qIHv1cqwwFqF/&@7%XS)b>zXNۋUWKJp@~vF-a¦E)΢z*_ G m]ῖc*=vk>nCj׏sC9Xp!*#UGݨxg}s=r+ENnf#[GraS:z4AW⸶ 0՝Gw[<[ɤclᡖ;CڻWGӨ'˕Zmf5D[#?{ 𾉢#$vsmi YҥlZxSU"iMDhߖ!:=nH*~6| D?Wh_S+=owkB"ڽXb%Iw<GcQ{ K)9k]5k7 DZ@;PMqRǼPZZ\G?o?%ڎP>߾6׎uF.·}gayW-6<|)-g0s!Aqmhq0[WLL&!EǏe aNd2 GaY#!m}57DyICh4vj|<iL!Sةp@ߖbY]#c"ϚagS0>W~0}$]s~`1hM1qF6pZR.FNd!Zm "ԧ{w |x̏k[sMd:;Iᡡ u»U|JAB^,1ir eCߥ5=;J`Q!Y?g% q` Ddn'TۀCT%sFg'qEtqdwӠͯ93 .+yT50 H_3`wOLE)q%G@^3NJy3 uڀ 3Q$1A("'0}aZk!vwt԰pI5䟝&K&_!l ʢNIy̙<./E&i=5|*+szF@ &1 kH !<nX/Jߊ YnD]zdY ibm'7{H{aGLFq굼=s#6-[\Cw[k(wdQ8Dk~әgt+|v~7+@'ل;P6 ?p PX/F{6 "& Qa7мexPs@xG{pT+A Zs_+Zӽ%1۹k!npOT"VF`X(3IB 62m4/dLAm)Brjh<8͙a?F?7  exP -EXD-BKnz㱓mRGb3 6GdP23ii×bt;Rk[dVhm;:D%H a{hzԓ~4a-'Lr^/%d O9ojV#%̝%>g~S7leM6ϕǨZ#n5}`ѠTߺu[Ve1Qci  oτm bE57qop4z {2]c\%mr2j갇Mg0 |^Ź~JZ5ڎdAW|cK s,ƍsUAʔBK@H& Ϛv[Qrл8dkűqڻqZkh[6?p |դpdz ^ 6 ki[b). xxoau,an9Y}Wcwk8M\V B)(4LYm&~ӻdm1dTQ Tg6tLLa؆`$oRr1R!=x0mytZUwuMrPNCP?8!IٛVTu+'ZAшjL%G|_ma}FSWx@bnO?r,?}.J$entf!4_ (/dZmi-p# bx~7R0=fUCzAȠz0_q|4]{5_ |MaDur4-p2ZHH3p ,Ц7Fʙ0oWy=ݘy}:) 8VnbfwGg'q~6]gXŜݦ5]=E=pz +( Yjwv^ //}_]okNvieoػ\]oax}*4@!R.yP+/)܅W߅7633i'w*6s΅KQ.K"xQѳ7HYD0͞!'\9p/3LWBȝG)sy`Si xʰ#K<eܐd_OXq^ENƝcZe/,88ZkAʁU5m! n/1k"&{e}÷Mq=]<=awkU&!֬c "~kt%.mPKP[G#PKy.F;angular-1.3.9/docs/partials/api/ng/type/angular.Module.html[]s۶}ׯ(i#w,Ҕa'Mign?榷 H(A9j'ŗhYvDQ֚$س YjOƴ4]ST˴)tM^v)IWu2mTQqoR7T7䳳=]ŌVOYA$ɽ=`eStݓbjSj͌iŲy&sEnkQ*biJkRb{,->~Z͹Z^ ~1XY7TEmj0bf%Tj9rhmYE+`$5 qN=>(b_,ڗUs˝}iz͙,^jڈΰ֖lAj>Sf-gBu Fb RE.pT59vzjlZ#Gp=/0*ss)9^Cmޖ!;YǹH$K[HJ4l *[Ue'njU=GYt`z2&Xo>ˡDVn"%?e7n r=+ -EoTq%O6y[Ao&MUk!M~e5<ժЂ0Z'z/43 KS.%۫Io{M!EɶDw|뙙j7 @ܾ?. &>m8h3XLk!ͦ4,oD6gsNbhA0Z(,amT.,⠭yaRBjQʷ7GuٌȧEm:D2<`hqd^Byӡ@<ޠp=?]H{+{܅__ XJ tݑi')MoR .DӰ-(=Q^1鮊 k+<`%/͡껌Hu=SEq-/jo09~D`;N|w:+Jk^5[pkF <a J<rd,íe2A;,Ac>9:c3J6Ӆ77LUn4a&"߾Rܝc#96SY3a,)O|)l l?Kυj^!`R>f/ -!TИ:ɞm5',&}uXUBC|B׶# ػZab&>ξfs=%;S}!iңRu-2W ~MpNY$w/SA2 Q T+텶Uh㳴OSK ;0|U ~({c ol'fn Na.T.a<=`ݮJBK 4׸ OzߴB(:yOs [wq}%CLp|7 륋fQ rk>Q#.YZ.%.W㳖mʺ2?\[嚭q6ޗLw9NcAR|f xK]8Gh/@O,Ŧٽs~V7M;\[l;aU\x_,=rKrYt@) [-mEnܡc ,oAxXuk>A*;}M%vsu}4a坃ac/;_+]VQ&^f@&q&6V](;qv$ӿ!<L Q&;eg?Ty la;/]+7.kFQ~vW3q?,kɑߖ\P(kX)EWt "{?G <LġcNQ"d[Wxm FL Bc7(x:#y$a9?݁ >b#r!vV}CP,a"RG60!ѡ#-V`>7`|R(YLHdi C"K{xDo m g5Ǵĝ@Sbo>+ǂ=yB,ffP.=OcTC!p`-{,!~!ݑOhOÂ2 ,tv;5Ы$D wZ# !PK!r2PKy.F@angular-1.3.9/docs/partials/api/ng/type/form.FormController.htmlYmo6_A6֩v [NKg$j${(Na( ,ǻ/Ve$nmfU ?|B b1.OMRGy0[J]M (l˟6٪"}]ϝYwsK\IϾ~J{⡩[g`rj]f7ծ-Mn5>-yUibב Dg3w!870\akj!eNj̦ ̔:-_ ;hwB{˓ r25̮ME2h :As}IŢ2>('aA)N*g®%eUۢH C (zE6xף[Q:"o=a `qBpVtJXoRNiUvP&VΓ6Mr ta)okR뎝a 6OYG + XEzϱ*bʄ&`wTbKs  ЮgZ K:(pO_ 9`cZo8|hP42Gmi5i%;h_h!lްio"wbHEMyI4Z۰Zؠ?_ɺ(z6nuUm 54蕯#;f~`kz_*apa#tjT$ "w _Yl9H Y[-`(#c$DXqGk8WnœmS.3Z8-O'wMRC*aBUy釽a<_ݻ[ ! _b#F{fy4'_O/6of a 8* `wȂ4/ ^WM`u`(y|_.n^>94,:bѺY{b_k#POt<#:y{I;62gƫG&?~AՎ8 1F乱$[RG 1j"4jQmCgw 1|g'Ḳry#Ie"afʩuL· ;yczUbt4HN:wt?|e*>t>Vq׽ aN{ev97 5Z^c2vǖt4IqZ:ry4靽4l`_ʣ30NUQ(Ӑ'qoUut. fz^ӐaV4a- :B%kG}hPLO]n8߼ @'z4dpi(JPT|gm0B"; k",BWsrqR'a)*fًa1Ƿ: I>EʗfI]/Γ~xZyQe!/jC,ôF,5 4VB"|ݷLs En9ԅMҼ OF&b:C"2B*L&`¢JCqѹe{1Dp !3T](teV>ȭY>_@(8򥽩j Pcv#D"{ԋk_uM_'WlzX,=M6 Qk˟&t*Ao+Swo1;V,`W? 1q@UtfxǍ, _-u$՟q} (om-;^Loâ @рdҶ9/~,ĭ 6\K6ܺO m>Г,ʿC~>B ਨy],6D,J%fъ!Gt} )`&ztc=|]\{*B(X].GZ\\d fX\yM #rz&>2 X쿤>"MDd'a+-> [M5{eOO3AMá0 ce F͛_QE }[^*fG,?w@DxMٌ#-l£E Lh R;tLA;C7q+@&իl>!ui2seNs,|g2|yap=N&c(,|jk4sF6㑘Qt[8<ߋwҰO[HhI{E ? d 2"] d:d;!xLgpZBX^LtFmx04kGi2Haz !,FoHז Zc.YI͛`#>%k÷HPڱE2l3;3L]CvhHd 񮝉<|w>ǻ66qh(Y \Ü!w4|E:ė;8 &z(  )i-ʼN2-/umɌϒmbڋo-.omvxem+s^Li2-҇,I;*/ -]a sMPy8$Rjp(d)$!SS,ɳ 4Ua P-\ŒզaY2.rfylD;o$"z6k@fBdž}GVx|Iƌgl\,$-EDqIM 8-ӴSLu"b1XKB 2qgu&DM+"?>\fE+qf8[O6t0#ΰGhzm.7`HI:pT əlSğ@ZI7mFiS A{*#^1Jǃb$0˺`fJ"`ҰɪKcGPc i-A!p& [8˥EU \d`s-4("u)+HUa yQ"!NkQ~I6b!Xm,EIG,1"(dnx"BR%pdnH%ß6-1(4:{"Uv?D:y*;)T84kJ{GNzHR"9TC`dbUOİ36jnVghv=V&9 |),k1/cr2|i}+Bs~>Y(@qg?HE6PjKnUuAx#ㆠ~D(Lo\n.1?ڷx^f˧d[X]1[&9h{k0KC7۟{츒f,s_bC)K?gMk_U+[iH)X;HHr!_֎c1s2>T,5^|t1R@ͩm' 5uɩ2w\xV\ÈH!&3SM€.%f'(AexmpWTg4D)-+b-5J\oxoPBD*Y.lc5%L^]ȸnq}w_rXV`7:T޼ εo}Qn9زg\+G͊DsQN H>a@^0P"B%Fv.ٓ{Uw֛QvF@m@8ǭP-{ĿqsłX߼ݯ~6c2d 'u6 ]6Ŵ/܊ýAv ܪR|gq-mQm?q0mSA*O(@k%֪ѿSwɫ4;}d2맚\jU3o7n\,~,tTD`E]+$t䉗x, Q;Xއ̙$"b<܃jXDJ3Sٙg^Ne\q@i;O% (dxia;:J+ApPS!1Z?|OA7oh-t7%%{-)Ki^Y{#ȠVDw^\]b#-&ZΠBbmb3iCrҽd" %uN  iJ CPw">a2nLpV\ÔzZrBjqet Eӧ<քil+ F_|KELxZyz` KҔbQiJmz\N{X̙[fX) ]D-H,IV)RU@E D<-6c052&.V5%Rl­#T*A} -۞fDdB|* Eۤ _'6laLoy6OQZQ6* H"8糅ۢ 3"ԝC;6sDS]8t[w;_^sD Eft>aFJg( CȀiSr (vRmĶ 00+Vde;`\3BH?G5Yw2( j,Dh¢:ˊqi|P!j):|d #Yj3g(IHgXP@E~y^k(:%]avs.jP|70ye/!h ΤTj=[=ee"@Zxv5J<_tj|8B@ R,81H9K^"a1Z.G+wn$I뮌#H*ٰV*Kt; 듂ZNsY^bلEr%њ.&г1]1|i%EņǭzH5ХЈf!QH,'g'27l5 B"(4!_wQNDz$emwR`pFD:h^_Q3ⴘkBR$i5US˚ LnHU_>"SuVՋ&RfX#XC|dO{>η?F8y~ۃӃ꼏;o߉y69x96@OԕB1@[r+TO]a}}~$Ts0&)spyp5S=t0".)BM2~dL a΄W#6H &1mCjuɱf K M#m@eqQ<i"G{$k袹F0hqBDCSʰ%̬ <- 5%hkX) U8w & -܇VCK"֒q_f؉;JctZ݁6Y'!.p+V1I'cBӢ0-yJy7щ2Jk \ҝAY B- -)<_;#) i_E&<²+EǴ- 7HB%JQ?g~MZ:`5 ZvQ(fg(VHM벚5HHh\٬h@m',Ay1*H vZBCI1<,ЦЇU}9#`+V:c82MBD|m?;o#2DqӡVb=׎ 9$-n6#e09d%0Ra_H''~*x{v7D蓡9/YG ~X!~ȅ.8Lk,ZԢ 8V]P gZ?E 8Wn:LN;gn^a-{a/%y N/eʞV:3ŻhwV bI2~sd1CÄf8J֎LC1hqX&G|ڭ;őU:[/(JpOpG.ǂEZ&(Vo==gg~=Y2)| +GZ䶣>4Š%BG+=ekMv4NYbM|Us^_%@-JT 9:tcc5͓GCukj}0@g9z-"-^;„jjm@&d@?vZ3':[`IFǑApZ(ny B [`* R^Uf>[y:>C77WRj$njfg*]i=km9)KmUQӺuQ^yaKOF .~I`/gbE*8Pܛ]y%1eږ, }H3%n{3--_ݷkd^.KL;tA$_> b.U2]$[[=|-e4Fy^GT"p0+$7L75Imc9W= Q O3b98隮t 9CCAˆ_grw.1CzLW_u+Ʃ%L=8ꕖO1fЊ/Z!U/3# 2hIG_J.OA88P' # _Z0-E[ -!JW4#H m#-L LOmؕonK/T/ st}c 1~j}g-$/A`NM_#b(>J{.dz{#=>,a?Y8`yofhD2klcI2Z/O MV;Ho9M ( VA(#yD Q?!u&$){,'K\ޔZ-k]ȘQ =XҌ;db2߲{N'J]&^Pl K1 a1_бic"4qu(ѝ &e⅁Ǖ^y*V3JV-5NsChB/:⺡x@I$h$O83>.]p+C4{-r eɊ { (y"}ѯt0^]eQDb#M*ƁL wrVƪ S%Pk$HzbщUEݵE{ _OШ5]V݆_ӳ'qwL֨XpSW;f822 btQ&vϥC&vѻl=shxFPKA!pPK y.F*angular-1.3.9/docs/partials/api/ngAnimate/PKy.F.angular-1.3.9/docs/partials/api/ngAnimate.html\mƑ_1^'$w%nwd-gle)q|+@]>{yHJJuwJ3=tWYvUndl<֓\n_5|hfI.uZ 1k4>ΪysFoegBv<y6nsY[M5gӫ܍;Z*W F$h5˫I>}sv7i5$IVĘyi j"'WN6ӗ+{ ma Iͱ1l7n͢͟қiO͓/N&osК^{mw:][\!xoUUs 1䥱o˥W5efmjm6j&WY~c46Ui˶y|v4`:7yhKAMtpe!1$jUyjҢ#րtdV&g7 FUZI ۲I;\&Oezyxt|dRJ)2EIt slcg^$^?؍M[7ir^l30GԢs}qp6_^^U\knH' m'`ii5؞ݤe YjvfP(7^ݬx}ϭSK[Tk %eM6}U%|ɸloy.(h3HPnYaȘ3o-LzM+B K^{{Do7ɬvalzQ` Ό*a׊ Y{)lz6ru}`-l"(\ lp!4):؏+ȉ I& 3NP' "9Tpt;kI/m%e SP"j }~=Mv*z(*7rt Fn$S%6e6$.F- ;mXsq gU6R"Q s:8:HJP,Iqݖ?zỶ e6)69XWf1Gf~*֖c5Sl/z[կOk-(i {fz [b"eLm`Vj>*^S<)j:Щ|I2P=5`:pF%Nh΋o5V#儵CJQ vM1 aH"ENu{@0Yv!ksjYROU9A1r9B:pI,wdHJv V8h5c)"/kn(wn}D:<׵ӇGQc:/9w=.%3*ad[0*`jZ"L‚?gVةZ1 ;"T(PE{ 94xX)y4t0@Rv(w09) ShkN JOE|9ЀA)ZwpׁI)7IܢT\q/TAgX,Q kH]05Wi#N1L*V8 PU|3:!!< J^Ÿ v@C C$"(M6 8T=v=Smg5Fb,}Zlb؛1? T/S8ڇδ5g}<]K':W/@OgF8M'E~t*$ܿZ [i,lD=u-B: *d4"6r}+!2H* eDN7 oSy!X\ .OclcC\ObdD@KW %il8M c(W["N:M( hX쨅Wv9nB2)Fex8Tfnfw! 7^{lVpu,"}c$+oPDj'*!{dpI,Cf(uJgg_#7N,@35u@1QuFfe3T4Eg SzHHL f7k0FLg,*~EqB5ʢiiF0޻Qψ , $e ⡉:g7ZBmOa’@cUD8qTt, !t$ɱ<?(Cї8͞Y@\픠ӏ *u5Tһmm˚t""Vu#& [7/n%|-)D գ씤S`~._Aw4z@m؟MN.qJ]nGz[bG{PQ,F"wrݽe(gj+𵢤^Xf+T9 @VtDWJW2Gڂ"0u+,29/݂OL L<>?<4zJwIծ4$`WKb hWF@ңreP:aV\3s V(V@aB +4 p]&!t;z(8GairacVw:8@Fb!P#~dt~cC:pgBqH_ : aM{oa JeDjXθï1ݹȱ?=y8J`cOޞ)rs;SD*-VH`* J%k(r; M&hM0>s1t1VDbV䙷+t4Q'JA9cSC9 lWpYttNrT}}Daġu{q<QpT;'dA@=|"QTwƝ_fEoy7|yJ.B_˫$oJCE4 4U98y%{xd]+AOKILj9ӟ;XICݛj-qCC3;&V&ƃJ) K{q+Ae@va\ +T*tc{2r \C/2٘R?&,ot?;J.zHz{-a1oO[0؏cdI*վC`I(ӄۡL^.Њ! J@sOXD?òޯCZCŦ2CYCډD%ɤ;8~Kp.p8c,Σs#ZX!1x]/x8=,Xld1KV&z[X ߼B2p #"qEp^/\Pݑj9utǁ X+=`>J@N@?p'o,n5gh4j] XS""|F+<{BRXM+J:ք|_G{|B$K)Lļڢ@) %3jو Q |r- 8uQ S*AѤq9C*(RGB,0Fѐ(ϩ>K~$: <&qd,!r)"\F;g$j,a}CL}+ J(22>4j+ Bf QQO 0ݵPX"dc hb2[ x&Vq݌3ɇ h9߀L\?6ֹKCP7}5硤cčgBO-[Ē( Jv>5*ތ`D `5mSoÔ9$&d6T'nu̢Ux&)./(_ej^#{oP~)|ܔOYи*^%xO!Bڶp֠h SՎfcT_MT/`d"F=R?ɲ<0A>ӆ|ٗOR\?U7l\ #1g x+aR1(6Ĕ )%#pZFC>2&_;$#*!w1'8)+w&ײ#ywAhyl?亐Âam|- | mǫO[R/_%R|n(wٮ&~8z4"标-dDI*Y-4 9T2UPK y.F3angular-1.3.9/docs/partials/api/ngAnimate/provider/PKy.F7angular-1.3.9/docs/partials/api/ngAnimate/provider.htmlmRMO0 WXG{ gq4)IiJayϮyP1VS&CsA6Aݣ=fb`FGj;B0CwHת(r+fnOgl=gRPl?ҧ%)VDj5V͉a@UZH3mIwPn)v΅sM#0PLDl,36s0g0+xm#5]x@g>蓣}a3uö!ڮH2x- 6g|(^ yX^~sXx/S~< Ft'K1j|Q֢()Ŵ+U}PKM0W&OPKy.FHangular-1.3.9/docs/partials/api/ngAnimate/provider/$animateProvider.htmlTQ0 ~߯ @-NÉC%^kH\v_c$Ĥ.Vk?N%u\!X, )J7n9DEϋ{,檧Ndtӛ ^*#kgFR螜]\=KGdsoLJl9EkZxr$ 6On'su]5zo[jQuURn‚ВFVW'^$&F]O`sGMngpG?rꏛpWsCU^1%%cGr?Xy 7p z UmR~X<=G7r"sX-GcYr3jx"IVd5[j94 `1yP86`atq(nxOliصۢtWP6= f bX}iУhV~`5P=M0s ;nts[3l+] UW,az*-ix;p1P&FZɅl0FTksN3_=,@070bbYx f6pÀ|\@XI6'hU% )7'mE8xPKpx:PK y.F2angular-1.3.9/docs/partials/api/ngAnimate/service/PKy.F6angular-1.3.9/docs/partials/api/ngAnimate/service.htmlmRMo!Y=4RUJN!RelHv^3u6j f)E(n '_28j?~nBAK70bΏ>pFv>܏λ|7XjX'V.c\%oϫ2loYF/'գfbie;ZW2)PFՂB cHֱ1!#<cXa$ La; gG)C4IDk;CےgLk-Lvc9\rqW?b[ eXZ`A8NYJ]l.Ůa&uEi\*'Cڌ1qw{-r4BtI|\Tuf22}ݺPK܏LPKy.F?angular-1.3.9/docs/partials/api/ngAnimate/service/$animate.html][s~an /u6M":M'ixby$$"@Pw ")3A=G̊GyT.4|\tg÷"$ JJE0/tZ7?}!4&2t~p8|~#5xQtP#jR&$h|6[D4Qj@Pv&"|T e:=|k-֊|H 9*[ rRwck^ ԿѶzmw B : KgQKwL=-?Fɼ;;-ki|kE/2* .u8TE3~Å}PVĈTFԨjWj _G|4\ƺ؉iѶIi<}~"5at"Y/sBM`3JPzJbei^X2 Q_~J= IupR| u>eN/a5=&}kΏ [Π2վ8_&}1ĢӹН~JV}\oY9 wC&K!BQɭZj}+ʊJ'?Hg ݫ7õ(@RxD 4R|Ѝ02H6 O"Sbt|+K[( F9q?Q 6g7i~%gFI[D 8K%,VjT;hXQqCk" H~. c Nd<'}Bt(@B{_Teq4eq3->VQ;`zI**t2čoA?fVHz)7 t5ܺ" ;r e#.= T ݱ?De d!E_CȪabPɋ}Ew'[+ԁJswS\FY{VI9"E0azߥ%GP*}">?`<;K_͖غ&%gFr-bhMnpa3e_(o佄lH.zg0ˣb N!*GCC< x#P\qRoi^Y6hFE,P^]jŁ߉Se+xr H8[=]@ f"APۂ5}|g_DV=s"gy3sH2U@|^JuJus=Jthb..Y֑蝨9qtxa=s0ZV^!yߡ}TAAB_\w\ aj+bMH$g {};+4Uq-^ AHNBpiy -C#>0RDnkE H]I:ˍ+D"v;s<@($;C9_!&:+ߊ0>fkA$#vV>m1Y?ҾS+|I92-sյv @&"'Xk3)Љ6"%5U%%E52AhR4V12(u)0tE< @Wv9rc>T-,Y#Mǎ &(W%2ZP}^)Ѕk^ݐB{#&QJ"O8OLC2VQ2r@ b3O"Vitjt' ûtYk @Rlb[Ndž{1ë[$p {bCLD\bk+4pz #y [EcDg&.&!7q e9M:.so驕x¼@ ;)b*"̖ Kpن.ut ߼LH}Q}Wx-ncdQT6"vߛh=}/уZD^ (!W2co2rXk/٘܅<~%)riӋ2 Xm eBF+wudt;-B#j@DQO&R%!\d҈LGyC!-e͖ Q\WW㞔>_Mhp vFb,Kc(9ɪ\%.h`P2.ŢP/q1rZ&r >a}OɌـ 3`TgL*3<21P>K܅d2.|+r?^ŋnpWvqD&_K,AR_^jM\O[fwDW R.9:ppQ}Ӻtc<A1bmK OR Wgz{VU(x0k#+sJѷ4\P}^0Jo(;w}Yo2VZ ) f{xo}QĤ2xꢍ"j!3jQfvK%q{=:ӧ#ZfcUĺši{E-:j)il8S5 u^̊ jZ-v\M^qdEGeHh=jCj}+ ڴ'8*T[-Aǟ"M;8=Pg+զ2;[_ (aی>|и:`*:R>ppŇ/3e/ؐE_=7[7رmM:9w9>yacZyxd Qْ]>tYZѾgSm,*6kk ,|} So/-@f]`<)x[d2 K}݊)fVL?4@7_vHSDI>2rNU&Uvjgui:]Mh/u( jպOF- 7K,RhRt$:ܻ<5TescvۏT Gk9c[!;h\ 2֨h.'!̀Qw%cp3Kg+ 䇺HZ+8>4a&ke=9o͊cvHfOWt~;4[d=Vb1a;XW6{OW٬ˣipb08MkhNr>e윞x Di}lÒ^REsklڍDpTvsJבwjc܆x2oɷ\n=͏wVoʩο[̾aUoo^rMauWG%6GqLɛ EnIs¾&I7xoǛIM+s%e7֘IqBRoSL#\,%&!$tr HWǸB>j 08aH'g o>Lj3G2K2=GHmB~q)oViء}M-{WzԄؕw3U'ȡ86kYc9$e_ 0~N%9v4JMdEAJ&aU3vp U9Z4xƢ[aze2@ܠ"; G M>;;<}P'[q#jG`RU~r?1=+'L\;j)N9ڲbQ$.>E!S)>%NusS̙ }ǝ۝ I3&!a!ڮGF+% = C&pZ#"n:6͊ǯ#NqevD3"hёVt۠#90?pzNO<πN{6Eͧ==N'm> RZGמ%2c(MtxM[$ݱ8#즡p5޼RڔS+f.Z[Q>F֚<&7 Ɉ\)w˒ʔk{ ?JcuIlxtvz[ ˊyC9S9R[G(ƒ`̍5:cɞ4t>Zv:hW(wPKsPK y.F'angular-1.3.9/docs/partials/api/ngAria/PKy.F+angular-1.3.9/docs/partials/api/ngAria.htmlXo6~_)k6OkmnbhRlݰZ%&dn %wpV9?;k,+YZEƛͤP.[>IO̚"kʩQӝ~F7ؑ3CY9YTu=ЍH0#th"Ԓ!p1F6Ξ%ϰ9&rq)qt$Ox)/P<`NC"Sβ/Uz sFĘ@+΄le#dSSF1ȂB%hs#z$ !rDE콸j+b f}1|MH$OEsY96O:!7BnD~Oo/G]{M2WGtfvF!3-փ0V\ 1"Op^SJ7R3u'ٹ۷^[`ÇE/?}I~Mb@=Hv@ӞJ Z Ij%ÕFnL.ViQPxO}>HZޕUB\q'  dT9}TQx3T*))7mzj֤xgY[iKEԏRr?j{K`c鎨MFWnQkt!B-{H~;oaN.}D1d*%jBu*9ɻՉ gW&(qTe, wxpée-Pptt0%:^@Ƒ(} {(e˳}O-wUJg *-RFqS#}Vw <^4 uA 6Zd䃞c#J^]yBEh":ceA&OysdAco@VM@a&s]RۚyayW9ĢVaez,,iuYKϖm+j53vT?^ً1&2?58p۳q?}`N|ә^I*iYņґG FO^݀xO~THQ,S"|+\d,}" Vy8 VR~!4G^%809 dk`+nNWrXf(!%Lho(->n }P=fk0~#Gۥ;1;9)ق&^bAԍ;-x a MM/ TZo/gW[xYBO鎸zK0Ctip 6(CVSLb {A 0;F C Iڡ%d3C܍A5ѷиuи)2ȽA|;HDk? PKnPK y.F0angular-1.3.9/docs/partials/api/ngAria/provider/PKy.F4angular-1.3.9/docs/partials/api/ngAria/provider.htmlePj0+k*zW^z)X[k{x%d%_=P]vg4F/ܕ-❐X@Β ZU7iWθv:ۺiM59,b‘ _UټBZ}usgʷ25ݘ sآgU/Svzt݋<@ФvIjJFK` [c)ECLb N)n7~¿s]hUPK>LPKy.FBangular-1.3.9/docs/partials/api/ngAria/provider/$ariaProvider.htmlVn6W &kU!¨ hiK%ͮhSJRoa3${f h97 .t{;-XB/G%4ί]h~2-m R~w=:'xޚóoY߶+k$smFKCӑ~~j%;ߓ@1g ']UL벥Zl3Ǭzk7"N:4MYjF-bد$~kQe1./c\j6gII١O1PT/YŞWR/^ʢ; {ڲy;6~Z`+<8Csf$"թڕl*`q WH iGagU,6hTEQQEcRc^k0wr9ZŻ Sb[腦Bj^,VecZ+:˪t Qg'0~c u\g>{Bx Z< ^Rx{ ܧ?e+Afew =ZF"F?f;s"Q{(MQMj:/6PC6ge qޠLqS}YV2hI\v'ɪRp@f 'TLE? XQL,$3ꭰe/#Pޙ1f@{A5xKF {ԞAh%\EY]Ri)YgzkӮ#RqY" cÒ;AnMb.BVjjྜ6+i=dlPKF4jM PK y.F/angular-1.3.9/docs/partials/api/ngAria/service/PKy.F3angular-1.3.9/docs/partials/api/ngAria/service.htmleQN0 +f!n(D$0Y-m%fON8v޳^:' Cb%{PCy(l‚Q/0&~em̗ uP15X/xK',x$N[}<$c6]+5ZpNO2̋x3Eg[PhtgovGpϼL$. 8?WcuoFe::Fc>I>Q/(~Kפκ7Ȭ5c#?Ac ''[*=a4Y,fCo.g aOȓ!B\ _^'aWE^ܳ>0ŏjHu) ɳ"@M)IP>Bl ; wj khofVDI?.()݇06~_9dRVS+ ?)17b Ƣ24_;*VӚ7-T 9g  !A I mF}l OͲ,1fLe>SE1ДL>{ܰV2JF!u&bNα}/ ц)*Lt+Gq_6 eY tY2#3;Jϯ%‹}NDUJ](ǸՠQdossW2Q$i!Esm+pϟ+cS]XP7د^z. /Fƨ[{ǀ?vn~^kOMҍ1z`лmjQ<(5X[}ߊR:"Z* ,ǖԭFiuJbKYVF"*X<$ś˫702mŭ=E6hޑs;D}?(O,J[iRgZglzk4h5^Ӷz~Kt*WM͓˗|#G cH#w sg/L ]/H:Q)GIjUɊW* Ad/,(҄}kb`p2?ZS|ISHwϡ1p\ڮ(h9j :;a2 dE#wDĄ@H:夦A{^J=\8yΚ ݉QQVYF;Q1Jި2W}5'4}PGNǣ}C|f~ @8ND7}8֨Ɩdnz_!v 9ΝO'C v'whN3Bt6P@Bw"X$IG?cY?89\AQq:kPĬ#oFV smfc!~iuif"=_/zo`=APK\ PK y.F2angular-1.3.9/docs/partials/api/ngCookies/service/PKy.F6angular-1.3.9/docs/partials/api/ngCookies/service.htmlRN0 +HqBd [úJNqQ y~M[{K`yqڲ#֏OI!J|l)-fq^G} `)Qƺ#=P#,1i nI>QwER>t-}JIMbWr*s;n;3_VhD؝N 2y{G degRPGދCgoLu#/3GGGac#L9sN6_AA\535 9dI~Zz8 ]HQ/U(Ŧ]-fomZs\zaXZ22s⠊l `8\^}Z xTPKgfPKy.FCangular-1.3.9/docs/partials/api/ngCookies/service/$cookieStore.htmlWMo6 &kUA4i-$E.E\ivE[UfSCiNCjD3o>8ʥ jzmmղm&H3ޗ6Jl{<[ˬ)ns"|ǤZVnҥ=_vó~]-Zĝ neh\>Q6Fo)@b:K{ZivEdZzMQzpNduyX/, }EμI ϞNwuЌ*͠6pȃ<קBUIE=uu%CR<== ރnu"$v|QxWv!zueY|qF7g1|8BQ;iqgqg"0,x$1<|"4Z>fE i1Jm18K -uT-eUs0[䙫烿zp9(2NHDJW;Fb#E: f{"$\Q#Mkչr&ߧ ;E%F68ˆ>F_Q= ȧ9@NALE?9Bx ߢt n87*ɺG\˒'wꑰzM8%$LF6虉ؼ-0?V}%)P)bռWn!LT"Aȩ)fr{mK}&t|j~:2vy_ၫ)]bL4C-r˃\ˮ/UpM}=KB]j/rMt Jψ<-BwbGd7XV4i pԗhRb#04oƈ>3ab~Y_׿W_ȫ,/ѿNx^+@rrĈ_Kגl|~z8.87o`{'8o0&о|3PKM(PKy.F?angular-1.3.9/docs/partials/api/ngCookies/service/$cookies.htmlT]k0}i1 veAobIrlJӔq+P\.&s}J+RkƛU2,ciz>0kkVZKL#mzW|R {r8,?) # p;C(ize6PD֭kL<oYs+m+)t(EqSv1U-2zwޟI,u)NU&x_Z׉l{NpB^$R*L8;F٬|-c4c֙N 4DI:lCP^*AI,$d.;0SBtzi }\?WpIMtz:+M<mt\218 bnatyZJWKvʯ;ej%𦄂v% PQLҴh:-{q n!p"VPuKVB;ڏ@/At`\7Z遆 ހeHŦc;ƗD/ ]ۋ2*iZǕ²'}H NhwEx qV@g7?<˳`*UVt$w6·k+tV4qFS?g˳zeګE-aڈM2I2b7Z|.2~,2,:5JTMїJ[nrUӷmYn:QhӖrU>Yesku.rajenU-:Uʭgwvٍ,{% iEUCJ^wCkVȺȰߖꓨ7sƂJXsKUoal[ P]JqU^rDY ]=$UY\ 7&ȶ d/;Z!,M 7n!GKjbaU ~~UWҀE'i"nέִ )߂BE.z^TgKLC P9,J]2[ȑ ~$};bH٬'g-AyaQ0#ȑMYn0lhZ}oU$zޛ@3j,GB(g@>;ZOmcH嵗g3HJ䘱RIO%a/ُw[Mה F:n7H`6L0N-Y!3 ?+{\-+羱W|=m s0YɺQU§ arF? QTn?hB">L8M0Ml?ױ>'?5=Wr.|a=7w{4ɗM#:Gzvx]o}p|\--Cd* C ~KNs wqΑ,J|Nh/vY^u#jl(" Y$dJZ9X$!}׵h0jׂ {IA%v(=|@^#|M|5yRt(W"dog]- RnYS-Sa^]Bc,A+UlNt; '2JX*~thpKl= [Än7[+܄ 'y JrHxo8uu`cΫH6f %(zH5.b/Ot/k&t9rf7[yCF#6ĉC'xag!⊗p K%OqGn,{ ~^˾‚2i!B.RX]T|R4 ~i8*$ ܍Mr k``34)8MBw͒`@*$iNCCH9Z$ni2<y, IcDa9Fi{lw7qẕ5@ƒL۟D [.@9u'Uc @D$BXa2w _̻@CpY'PWH;\{n0 }&JyHL$` 0D_1BO L[@mD3֞1!.Dk -B&3{ ں7?\Z5bQ悞XDʱ(!WD-E.iFƥ7`#6i \C>Jy"#.G iZ~["=C 4MU6/k4o.hZ)>4S?QJҭ qd1-u} W4A8Gҁ3;"g~~8K ӵ#?ޛU]>*|xJr=i`E$kqX KDn)1UG-Z݆9q! , Ëi .EG%wߝwK Fi NvCfgIRsluP HwN[nFޠ+dچˬ$ B ]BDֽhI_M:$6F!BrJ(^rKesK=ZbAu뫴!6 !jmu~AS GIompǨL0;k2䍲\"R! _XAs]@o#%0Ǣ2!wWU]G),>iЧPY*4LR@i:BZG;Nj~ONHMRr8gؿ! >"M֔ _xZ @6ȤFG#W# {i-zBy/>>|tΤxjI Q*9H}u*M4f>X $o/s&'+l7+wlwj7II?%U`P'cD /G19zɐ` }A#5ODL(2$ӾzI`sXBN.Ӈv:TOTW9*RL:qSl8˝Ѐ<抢ǩՇiS-&S,2_R}q88W %RAUؾ@~/Vu&4ͦT|ԦtܐaԦ /M˷Ū ktzig ?y83~qn?ӟcx`֗+9T7t9dywjlA,| 5U K>PHҦd;tI2ssNȜiG?]!=wB4Ԕ[0T+8 z$7#1' & 4r:tRDXnZ4A9^xpθD7?(۟8?k^$N|7mp *3"\ޠƜQ2|$gRv{~ P[W^Om<$2nr> '~=?E̜33l6z!V[@Epۗ|%x@ܱGwOcPkZ#cI8HLÓ |%՟ێ.(bXU[5wuInYsM(! wmQx,.< 3fypgEp^7Y_#uqLN(+ʢ;lA|,5&@8d {cc&GS `R- T(zĝ+/pD%hcx?Wu{= S, GZP (/PK:LH'PK y.F5angular-1.3.9/docs/partials/api/ngMessages/directive/PKy.F9angular-1.3.9/docs/partials/api/ngMessages/directive.htmln0.O^J,ɻ>;/nq_^lUj'L]?s Œ_L4؈痃Tߦ&x0n$7"Bh(Yl3{H_A; ° N;AH+dot?"0[s2]#|[Uy&0}܊ULWb;W, ~Rg71yln]i΄`MGUkyphm*Z1WXݺEcE--8 &w;c;"_>}{1c11ģ4:bY080 WR&Jw,/\~u4;ˮV-! /IɱzPKZPKy.FCangular-1.3.9/docs/partials/api/ngMessages/directive/ngMessage.htmlVmoD_] /u**8@8k{/]{:m@Y#5e4X/Lhx!:TDm5St"ثG/A]I=-[#Z_/iG ,MO0>@Ot02PiG`_ZjOg.N$.]RԪ-Y ,4IT ZO7˴=nvyȅc;SQ6ݎdvÌ%RI:y1>QtM om+rHQݐJ#R'{+죧HPRL\EX,_D7m9Ae9k2\ގއRLDJ o @"f'ҟ`JOᔻ.p ?oPK-`% PKy.FDangular-1.3.9/docs/partials/api/ngMessages/directive/ngMessages.htmlXm4l^$݉eZJ(Hx7n;.3׽k 'e<3Vl{[n(MsE%}~sZrg\opyL5]=q%\iZqo:YbX<'TܹlZknDFbkV6OWL[okY͆4NڵE.W/,ksS9_W| xfHq9XZ vJeVnkA3cLY?C61Ȟ%ZJJ`f6R,WtR}qP|5:닰Ѩ6:owV0߈*SyhS81$qJZQzy#Ԭ1U=3@; N$ EQ+ 1c^J4809 0D ki Vy\mne%X l{13{# W`fcdzFx e^a0$fd#wLXkl̊X[p8q0v"|n95t3VfA]u8Ot"o5\)f^c%lAz.5V(AE=ΉC"֍7nRlMQʭh(X1-'[+@7rCGWO-p:} S{7DD%]^T33/ U G4VzGaGc^ X vz#Vlgz"yN\8p~Cc۳bZ;O3647{Y:վQ(_e)Pj$DzdgLey{gQ"8@|{wCZb\Ns/w(&C$I&inkߏҸa8xL ,jw1Ddc `)(wPMl(4ڑ3BaC_ADvp+e Gm3obrJ=r5ڷȮñHqOA$_j?MaIⅱJ&8z~PYpctG?eBC'HG<$]5&(;T3AG`HNvJjP$;M&]}E{[&zЈ o||lwh+#nfO/RZ?dGg޲5쯿vI]HƵ{DZVeS|2;)z(?MH_Lbx+\OUAw`!oQM6 ބމUFo}g( PNM=(7vx?q7IٯwfoC|y0;g^ěO*W"f)@$ćt,PK\}qPK y.F'angular-1.3.9/docs/partials/api/ngMock/PKy.F+angular-1.3.9/docs/partials/api/ngMock.htmlX]s6}_0Cl ә8n)B3dNV\N=J&YX@VuνR*Eenu{$~fȦki%]r(ދ/g)ߘtX;ǃú9Y_t;VO [6Rqz臇y-;5gjdi깴YúmsӈqKzFN3u~앗%J;qh4d2IGD47ʼi4wB jJ-˴͎+ubnV аXmDgnNT X){s Vj:O^5B0HZ Y;#E‰3iȍUX*D7 `%ΚƣF-!s4ʊsޑ:أPq0gA]LktEyeiEi8zj\'Z)pc6{-D&bphȾ1B`HIJ'˰*aܩ}JЃ{aHMSv;=q7A lMϞ-ySY$if͜\/fp9׈M[K+ZBڴʺ41TEREKl'.~%|:*.㐸I"OE,[<1G݀mc<:g [O>mfjΕ_htf^N^s a?B!Z UeeW'?ό9#^vuNyg#ZFOg $پi^)PS#B>ȶu8 r#(P-xHٺ K5ؿsk}O$ÿXנOcG-J RÝ<=;''g#'y3'qT{CY =\1)u_ )4)L]g5xnHU`K쐋biq t9Cld @w(^Q2b)guWs-S*A)%B5h: prm z RR&Vb&ȏ5_*8B({-囈Ҡxr[]䊃]A`Hm|1L3eoHcpNVs̖5gM3l(2YfU:4 XzM)ƺI^IRB_q lF!&8+n Tтqx:pHA| t 91;+ ;18bn-\6fW݈/=K a~å,u]K, ʅCK$/$ t .$_u* Qh<!BBJLX.*L Y½&WXbV+ Sc^r! kq~i0ɒvM+O~!OLw\}OC++"^_FA xsezthhJv̉.!z^e] uYhU~ȧm?Dg#񃇏; S@LW蝺E"H ?h801R5ώ?O wR=;\=|ә5Ć3I@n[rRö߶tspf6[^g X, `*JTFB!CCPR& ) p~ >BT3._H" _NC͋}#_VAƘ6'ׄՠ?u#%3䶆ralOk*i?\O0Nt yFW2r(>|~4 b|_zxg2a0lm$/Ov-OܓɿPK>ƖRPK y.F0angular-1.3.9/docs/partials/api/ngMock/function/PKy.F4angular-1.3.9/docs/partials/api/ngMock/function.htmlSR0 P+g<Ǩj֑sCGN^iXbI%J77q`}d"A%ڭVWi?Lnv|u][w<3@)X@|G+Ͼ4cOӘUnG)wc)3iu7Ϋ Z+wVh;HvFSkĸx0 D甑-]fHr k }:4ת3iF7:9 =[cH>5@T,U0 Nk)e9g]Ts$"roO fkȔD;`j=HY^L۴3ڦ?MWZԯ{ PK|mIPKy.FFangular-1.3.9/docs/partials/api/ngMock/function/angular.mock.dump.htmlUn6}߯ TH4UHRn)jVCI^kc[҈3\.`i{s6x?u+?,m%X_볺s5u׻V;+dգHΉn:#ySUųϮ^vU-ܛ!RUU||uI-9Sl͎~ rjvp^AI3Uשu^C{g$Eo=>vKV%yѺiGƞn1c}{{슎@3[L_&d.#:/y=\F?yHXbJ]y ` UBplL+&6nV uW4I߰)nCj3۩ݿՙD8d 46ܾ5I)d<;^(IM΋I v-ٙVhgb'>k'g47c[c#V07L8v44y˪@no^,.A7Kc6H}Lia ̃^MQ3>[ Q;4rCQl0jhJ70`oxld4pTwS,\(]%3Kѩ C??OâI 3p! ,± UfPKɊegPKy.FHangular-1.3.9/docs/partials/api/ngMock/function/angular.mock.inject.htmlXmoF_1PDL?yw@jp(VJ܄ܥglׇ3bZ<&Tr{7gNzܤn3F 3d2Y)/Kf2vt9J$-ƈtiVAOoS}]s曫o+iAm$zQ֐i~k*ak˄vjp|]*-wͱU;6zY63U"[+CougX'^#{%~ldP>uiAWk&;u_MN"8RTr^5ULe'՗-U[2KA7/h0vK;:YVI%ce D4OB۱+B,UGFR- B1o3$tSqae[pgx,ADc4"/VTWm@R#DfC[%Az>wi(5}U$dEPFXAr^P$LI^԰ZS9HSȪaJ}aYL=vH˚eG@j1H=2$"U.'dH6dŽP,&e?Mhqr}Z:I=65$Yq)/RWHx DY-ѦA6IWd"ccU vr[yHAF ,P0/j1|'6qHi/Ż!؄Y@.Kl<{юx\h8QiItH{Lj3@^ ^qX/lrX@/Qg#[CjUcE~,\Q<5L>DjQ&7B3uD\`|RΙX- U岥#! oa DVnX/@-7vr>;gI'9rz5 ?v&tK'n,*K[{~(-5N|2bf9+e\AZj*E)b17>*y}O^8C{^PVmnQlKl̍sI=]w\¾} kQ@#'鍐'Y# '$ hufnl)~C].u:R` y )9j)7>B1܂Q25f4oRaP@@BhOk;N2Fc / S&,?viu6w1Jm=Є1*~9_V.M?E3$Z9HPlˍ6qzLyapIW虁P 2̇kq!DZʊ^Fw^s[ѕ5Ju(γ7*Y!ܽCdJūNÙ::~.n<2\wz龨Myl zt"0C!aj*S'ܒg\izB '=>Uf b(N'ܤq۫goީ>\c%V#i/#-raRmA{6ؙŶ1)Y\z!Ge';Ib\Ψ/8ihGx)]n|`CxK)dyG~D70]èmÃ/p6MsumU% >=i̳V1nsTRnF$_f,H"|vZ .xS Yk \֑ij?Y[Mzgpo熚KV?~ő4: 'm'b=Tm~ɬQiwRU앫1I) RL.Rˣ}FF\7YS_*&pY~+D5)f)monkGU9;'rc+.nOGgG&3>K cb U ;>谑sR,s.\"B6 ?PKlPK y.F0angular-1.3.9/docs/partials/api/ngMock/provider/PKy.F4angular-1.3.9/docs/partials/api/ngMock/provider.html}Qn +hNl]6(85Ȱt? mڸ_'ݓ`ZECs!'!*odR@Bʑ/`&ұ߲'F}t *iϞ¡፼x寁SzF)`2c-,-u}7VI q8:zN&uz_[W|KB6Q=Sɘ ;'zu4/="!/པ^n ٌ 2cvL D# 3qb m=JUnֱh>_PK߸RPKy.FNangular-1.3.9/docs/partials/api/ngMock/provider/$exceptionHandlerProvider.htmlV]o6| t&"IREEk}-%6H/_YR (,]I;ܜ!X] .3r&-,%*ۋx,kʱ5ò"ݴ?cC6(3)VV_|Ԛ0ܙ8xNjh͉,vRΨbF֩AI]y]UcFyV8*U9a+/>*e_ (-BU5H!a's>h%I}3fx?w{5T$Ž ҔoO/".Tc-fU7p|pS&GbZ | G1!8 ^mUCX:/&# *2a.B%bji'MI3Ok0Lj5 Σ͌Ձ!oTi1H0o_5E8ы`;Uot3ί,|F-Or8oUioU"ݘ#//[hZ.ִȐZ dJu O<"TX($BZra)ŻJ{$"!~HX*5ĐzONz\r麉kS`Ms,4tDUbOM,=DA*@E$ѫ6n39tyv aeKZIp^0aso6)o XrQ碥4̺E:zf}"Pkp Ub DyWh7慨W)zٯWs2|6enU sV8FlН^0<`EI((zPF,A4Ia;R(lГ PMVia#jPieUHhH꜎Uj8e:H~}RLCy<1}c3hvWvZ_ꜙD 1 :ȍ枹fRޯ΍;QMdΊtUR,~C!HǞ؋VHoIFpA9D`P9e7PˢCvYJ}t/BǼJ*o566sw_&,p_vKYh+- H BPk (aXncŽѳQaE~fxj7Wu0E$*]<{A`thjqГ?Up\¹L%[Q@)_Du&)sn<\zuSaxWM_s/v-Җ5nw*F8,1/(YCP¿[|V.8'7?Lw ծ7/d#1pDkp?hnvr?Onzw3ZFJ>>Zį'̸I-6PK_ @PKy.F@angular-1.3.9/docs/partials/api/ngMock/service/$httpBackend.html][sF~篘dهMko/%+{)@`(1.?{K3"X6T%==}ST~=$?}yiy?|t棳o GYgZ .tya`%88wM3? WHϟ;=럾ʏ,{uHRsHM~I.tdvhCĪ4 di<SyGI?hZ qz90T_AuxPq}\laws:uD30ӝPOowa|ڝ7ͿGMtY~^Z; 0U?qJ~FHLg!ja"ʱQXNDxx$0#M@p7϶*"11UONN^HEzܣv*+ܛIUuHK(UrUdt)]jFMG Lz1ynr=}]B6J4mAE;>ӑIh #sQu݉U]D7]c$hT'X_-Zzr[JX\h< ? HF\@'Pg*3 L_. #Q㌛N KEФ#Iڝ1@5p Xy '-(R ZFaց pR˹SNs`0ZCa`fl>"&M+E IZ8%tZ+ ~ ȍ %j@TDZ(^c8<>%XW&߃5פ'OpLF ȂU-B,D|t;FwAĸ SME>:UWeUf*垚f~H>O߂݃^;$r$jGJ040] E;3n.YNI)#0l6i±1'PyBv%̃2J CԌkw#4d `4{E@9[dHb{a`jNzq u1C &PVGH:VQ ujXJzVyQ0P0Y7H2oP 6:#o!8F/I< F hDZ3O\X6ė`EE!@S K\gQ͡ 1u'u2ez 1FȨ)"uXY* "sDxcR,>ՠqHfR2v76|(`:f6He{)KȕOv{oax~_5+UTcЎ :R$'FOvm 3(9mr*#!y?fo.19G*TY#G:D򀃐 j;"(B$2^%BGe`):q,zт 4QI0}G/"JD?)NE9t.=@Bk<| p<&FiT!n.ֶq5(1D":8Ƴ"BckpHc~:LWKI٪tӱUO2q:"}&A^Bw~Egݼ"DO!)aDwɊ?fZs(g꣠Q]VdP>@藑"Kњ4f3M-^iLUq//lz8h,{"HoRbLA0XdR}e}AW[(錽F5j&CbA${0ijҊ<{t|:QdK5pSP)5ma3DK=/Tgk+k2N/mH\[OujLJD\Pt> +AP1@N5"}v=Ѭ7FŎ/IKZ\RDc^u0cɆBOL,(׃mgg"=o҇:$~ !S/Ҵ=s~%E =?Mmu~~.m,y8_I"!,QNJbvz + V!$$',Yp;Ш8<uAÔXNr:D%6==]fX?6hȍ➛s.Uś3V8m{v Fh-PEa[A![XR6g)A3elH@vO%&@1+CSTQqZd\ 7*è8J5uo7e [Ran~AcOWd"5x\ď4$%}KvŖOnȧZ}iaN5;| ).{JRm۸B7 a9Wni=Rɩ'g20]8Z6\!BsEJI!̗,TU`bQj}[T]&NbI`[ʺ|؂ETUV- \<;1uCF.fKc@2HPKrG9,K-zi.p*nqd$̮KŇ~Q8b[@ƿ3.ϝqQ.R4 ϵP*lW=Mhr~.2*CFHJ){otTyH?rJ1lF0eD,8y饘֓.θQ ixQR/=-hр&+\~]TE^By>.iTzuٕQ!+P"@ׅ<Sߵݪƀʁݧ D ?J<]w>(] 8uSkzQ,sq5-^L̠_)$V!NoR+zn6cWkH!lҚtCM鏁CqИHJun( aD.qܺΣWTYkumh׭Li=Hw߀Z Ғa7H#@,7]R4wvNtMmf^g y3AXWz'AlRk/ `-Uٺ .æb됾Z򄀄&6aiN xn^ pjgdT1Ehk(+8esՠ]$.-B 1[rYcY0 ֮aqٽk%ݶ~?8;͟\V6i# *՗V_ɽJ՗-۹s]]\uz WPi9e-l9jݖ I}S8sHGE6yt}S)>j瓎R8c:)r?'}9 `݉;at<;Q dbzJeڵspfp0TOg:*#|0N:cx8lD:ٔ*:>;J HCNr-'uYƪC,:GUYxf*I)]1[dRtV͋"imEG je+۴'zߨǐBűЀ8iCLN:1BofGtP-W /:/ gY3-bsua JX$ǸԗfUD/,?}^4Ϫaz_\7GxPґ8Сj9Ĺ:)8>Łc1vAdSQse9_Qnl}e܊LXC0Cb?nZ'a_u^{9fF:i϶eմa*l(b6%\EIɜUPgb id~2M&Vf6a%rV*93gx:bPKu,PKy.F=angular-1.3.9/docs/partials/api/ngMock/service/$interval.htmlX]o6}ϯ vIj:EChR􁖮,.(vI[1("y=KuڋѼ,4ժ/$:[,gׅu1,ު*{'c.Ub\>}r~YCbNhդq;EћZrc.E?jvp|Ԣz}\"r=vV۴rӬnDz00앪˂WGj_KAԚ8IkEG}٨?s1;fGѦ#ސNQ4 Iy*R#@1,j㼲{ꩶ&6+jr)e[~aư؃nJəGU3Ib7LT˪@9o{,edX޶ $cX@7I= .ZYYXi~3n7r2]Vjh?>JO:ØUG=ZW\7lf06e@0>4̂X xkNC09<ѯ=` Xҷ"\Lg }|@;iS֐SV`?!qOOj@8KC~"}ϫK 6sKMPlɵp&9ds^ ż V'6~eV|,H3'qUbqWaln36៨aYl|NYl6VhUuA R_c.7aS98^F sb@B(v} Oa!+zO$~B9+W!>bKU ,p.>=-'8ƫgʌn٠ Ȟ2ٳSF"P14ԊAX:g2IڗY2Ro=M&s$q$ظ'+&t!n4+/\Ѹ ]hkP_!yȔ^ C0pH ijC;^ᤦxk5>z̝̣Wv/\"M6H+N]@ cWo!*!f;cEN~zU~79}lj "BD+(J Qi"\- Wd-N53NCg5Iȥs@swCuAh~*a+r^Xe;_Xy7x&B1&qXv/B:&X,y={8$Û(o qs]J`Pmjܤ Yqþǿ㸰 H;xu6y:KØ5 ZBHsGy>5-e7(R$.?G)A1,aprHw{ ,k{%wG$$l=3W2޻-<42܋VֺADdܿ I.e1 S.{C_PKJPKy.F8angular-1.3.9/docs/partials/api/ngMock/service/$log.htmlVn6 }W&VE/].9dH$ӯ/)m66/ĶY>PKKI, PKy.F<angular-1.3.9/docs/partials/api/ngMock/service/$timeout.htmlUn0}߯¥C"!!QijkS;,]%R""e39gx'@0U_P>n.y B9^.owp={^B>ʀ''3H< ϟAs/@>m' wۃ׬vj#Ymʴ鞎Uݻ)dͮ4]:I#;qtsyl!Dd Z| >|.!x_LA2=-6 R#1VD dMԚH.#M-1C RZ6R-Hd"b.*v x-bڜxT !` {YѺDݥwsEC 1ц^Q 8~`XK}u2~E|ekf5q_&Oes]jBVD&'Tkiİ oa?9 ,LY xl5 #D vE 2yL^{C w*}kxp3r &7.oOfMے@#YҎc<ř2LT=Kq0rJt`PLK k7qOp# {Rn!Q##*,M6,ZtPKȡ tPKy.FAangular-1.3.9/docs/partials/api/ngMock/type/$rootScope.Scope.htmlVM6W $4K&&H^gHJI zK4y\)c[pɊܻ"Ce]vA2}%!R(xOG뗏+25@7$v]۫7 c;ls6X' fk0j#͈[wL悤M^r&} b⷇8#3o#dmV)f5' JLk " 7b[4}/>m.r/voSdQ1XV> tB:d4Da\Wyg5g@eX{Gd<)J,aԛ8HJDB{hG}0EL6>@˜H>jZ"#@성bM%g`$mѭ E\'l$ T47 $!`9%SUBEF.xY |+BHb֓ݳmI?J 8>w .3:ʫ m|ƣzȨE!.5:2}9p PNډ9,nŠJ DoupZvnjYβ<^# $4D09d`9a; ĨSX6o, "#ՆT8Z7 k 4gNrGϺ f5G yy$5D/s {4[5;"e-#n>X=I9gLǿr g+PKZs7 PKy.FDangular-1.3.9/docs/partials/api/ngMock/type/angular.mock.TzDate.htmlVmo6_h^ P[bFKgD${dM 'S&Eei}y\yߺ4(_uIaTMWK;\'W.Rz6YLnRgTo^`4`cC ]p' ?,?N,?OKrU+rg:KQ&ߟN8E-pb?V78;8ÑC#^;g±bK@'Ԓ.@O֦?6{0+k:/)bg`cȢRb[ŶHh;6,@@1Usqb5GLdFZ'(дИ` {8 fnӰ"n7]C;@YdZ񵴊YFzn 7E7C1ۡ2_H+,j %^`Uwz_rw ;pWFNC g% x< "'(?5+p K]m6x:n{T?-TAW8Y[JȜk"<;Nc9-|ڀ_!4!6a 7bDXj-9pNBf\˟CV`w O7-rO_Ltn5e\-@?G|xWo~hoT^UY`]4à!_(`/+m}e5~9z7- ڌ>mu3i?x)z-4qz\nL@DXři;:BBG:/:}+xkHL Na a2Ung& M|ö kw" X  V !`B`+oC5KQ¢7ɕPXi7IJd$3qxb>>Kfd1[){L6xE99G!Eho<~m1{ك·{k;Lo|Gxa)XF& ]PK؈` PK y.F*angular-1.3.9/docs/partials/api/ngMockE2E/PKy.F.angular-1.3.9/docs/partials/api/ngMockE2E.htmlUmo6_)Պ6M1nJHLhR#)#%9/}l/ǻ<,k\!t m_pa^ 7~kA'*i.l}3Z,68h J[G珖O%ک pOb,OYj9aU0_tNmFVְiTrn*߭ W l6+ړrXQ[ i|Vpڞ]ygZlce0aJA(q+|p:F.]A&΁ zirm άu<0eEhڳbhf&:5=O=~! v{c2TvY2>EP`9]ru/ 5p0N?./HköN|J5!Zʏ4m;p>om4DF@r*'Ѫ镄>+-u& ȹlk܏|DSqFx[/U;pYFhMےo΂8OʭkxV>\Jv <2OW+|O@R"k.y҅р$"*0v1HaQIFӪr(I2E 53AwPb/dUy阮 :+Gi8#ffH"1{6ؙ * R% >t8#PKۀWPK y.F2angular-1.3.9/docs/partials/api/ngMockE2E/service/PKy.F6angular-1.3.9/docs/partials/api/ngMockE2E/service.htmleQAn +5EPu^ZU~AI6~ DQ3&'j5s]` Jwz/M$3e;ӻבiT.U0cy^Ic˪Ԍ@NWv>LTp]5it:?-1{ԪՉ%1%Z57\:WiUv4!n/ʹǑ6WF<8Jfj)_]9AN<JQ7E1jۋ" ZVjʮ`miPq.LOR+V-T!'pF+w\g] Q~/+.5V7meJfB+5xm!F$LD$UU5A?CHM``8sև!LWǑGU1NTL\ư3ڪ $[,Z+,J6y4&spUOl5X&p_9) "'j" BL+#1 i䱈X^ zG5g\;# o \)ES*apdl}YcgDaZ Ԙ:99L- X -M]S#J l]&+ i#8Q.29;eG<AaJ۴hrp6MwBX KY`Zǁhd#Z0~HNSHV$NTj\A$!1oV򁕰(V"rNF"Nk +dW-cr*|ɚTVIW.<%ٹkhD80%acVd @; ΀<_{%b(cgj-#8$:J ,Ԓ yq<9Q.E<9 XB Dfȵ10I -~ot!!AȪ~uv `VIٰAp *3hF B`""k4ilᄓ&k +9$VÎߴu“ZJ%IOxs1Q_Զ@9Fڦ$QuSAp,PpI 4gƙ fuJ]vz'c(3P% I8{c3&Rh g~]?'bt:Fp?-An pFL~g `W8~X+ GX\8μO =`ZH>m5TnRA@v2Fnݙzŭd%j>C'4h/[U˴جͫl,]Ed$~ɍ(X8@9yN:x#HIg;H^`:xl;9 AoMBX0UT$_o.Y*M-8n֠Yg{vx,5y[ۘ#ھ ߁)kۋwzXR,kEOJ+lhwIJovmbwwmWm9RvbĨlVs5ƛ3PHy^1[,`.} }Dpn!!11B۫vv /́M&ګD 8UEA@ZK~;s2r?>m \?hB-S`,Jn v'Z+ktwsBWɒ'umh"}Vl3QZ n6!v@mM\Gex;vrꓩB]!.:]J#~*څOV1 CkZ턼۬nlKntd7"ܧ7mͰ>mOA_AOo?0ͻ=}᝭jQz{p8qg?Hs$'9y>Ν~G^%9zJd['H\?JZOs}n?T4Go]1~[5xzށY|{<@nk6]3w)&"lyW녾^O㉽ Gnm1ID@5i2UCؽֿSпS>)w?oT5|OU |_$߆`rDW c?Bt/Jtoh/{k| o ?>O. BPK`£z @KPK y.F+angular-1.3.9/docs/partials/api/ngResource/PKy.F/angular-1.3.9/docs/partials/api/ngResource.htmlU]o6}SVfmY>$n J"KRvw!mv)~sn38 cpP0޷f,F8=˗fML̤AkyÃͣqOw(y~NڋSFmq@z[h#6OB${݉Z0>ѬիET]0^f;+gE,,V o"Q $~Ck'(k;h],ζSߎOy4mCaAӪY8,Ztyg{Ƶ8b ˦ht3bzzke`𓎹PCyK}ysKt0QW e$Buk!@4ʫuG2';lIgZsb/ܹؿe\?9^ʧ(`D ^oP Tm`ޡG]Bh} ?*_ Õ[(q%fɖ߄ E2!DDGE:XmpqD}B{J>w:a, Zg/v@=U*t|PK"2-PKy.FAangular-1.3.9/docs/partials/api/ngResource/service/$resource.html\rFO1x{w/)&^ˉMb,Uɑ$(w7' eIU p~ϯ{nVOgu󬞭ɤ*O3iV.>O'oU9,O|Uʉa_}UpZL?ӽϦ Sc2V>IOO$Ol, "n\/,yZ^}:f6nqG(l~c'|:eM,}_?q7|o%7>yEyU]&n~Uj'9_Аg\E6.[y1]kj7jTNÁ5Г.U uVrȝ(%i&Ok_v'?Eir_W k_bDڣA"dKhd NE4Oi.3_N8=[<0Ǘ*z7Mԩ:UpqәO8„۸gŴѺ ҋ(1g)Vu eb`wyq >pfK\MxH:~^eZ\h8)~CBV4c*PUyq]?KWysuf9TUp13lz<5̖;+2I _w/OzStE7\9e"rt/aѐiEePN`p)]aiVXmW,;_$<֣GS|R+˳7Rʪӆ+Q\­sw?֚V їsM5le0 ]`78XcebY za9Myj!,ۤu0nPĻ g\6=ܛ%DGkA_[h^[M QǣKg㿁%}Lwi]yLt~Z[ 5`>⳪} ٿ Fs8JڷW9O5/̸HˌWy U-Wu? t(g:5֥>lx|wkDxVbz+73x|ζ X/6^8|jP۟7O}j(âܸ:c/K\Kzqc >ުPQÉg O_VH` JD!xUсt^O Un>9Oz!VMA';/>@ul]_ӧyYkoH$]piLNOK05!~fuih?0(^{*k[( >OYQ„d@x|S Hc1,B;\0`磮z4 ݻٴǸ{g opw+`{ Q%@ * #*l,>!+WN1o'+bq=|I}{W*愠<Q3]-JKx9$~luQuC1ϲkDѕ^ 8;!)GQd }%`o(f{eZ8k2.W\@?{Qj8!@}e/Uem\QԌ _d6 ¿fp]~Y, RK_PuoL'lgbb$Sj"ीygqK@j( r>WQ,s]s/#+yJ7b MvZO#Kšrݼ~.y~)r4S,[JL_6@fTͫWok4N4AâkN 9LϊAڶ22Mp==8Ay'%ݵdmfkw˞OY,+>j-Cޢ@1\E|?fF$3f2t8kS92{@K( Jy"Jmtڇz I" TY o힞> 6ɩֳ7ϟz2-=o_.=5pg鷤'&uE[Ͻ{Mwkvp^xy})&0H/b:Z'}_eod!p>g/[0Kfs5UV[ 1ܩ~q/_ x>8z`JL:j%t~K5#6TBzkSC-f}Y\߂K 2DǧZ>yR VpU GZAfL.؈vX=`r-kv^珽2Q&DV]! i8B*xyzQPʂ/bvSpbL[n^[n黤4ۂRr WR,c޶yl+u즐IErxُ^ၗDuC҉7HĻ\*޺;*?1 n[k 'w1ϫ~(נj ŌA,hvYAmFLD:jzgM BI:$>6o%:Үﯵ #CHhm5"[>˲FkԻa.E%c)J)|1S #3޵Rjʻ lqQ 9UT6dQjD#!R yP`h @nIh ozqbrJJ\GZ잷L"%QDwULO,fQvPR1KzZw|[ G=AkƬ0S/H uĥ?`@ID3# ؇PVSGTM{n˕}1ZSs)+]'?5o͏zUߡ3,XZ7 wk1I:` !'P8]U{8{VDYrJd K>h3+SisT#1yΆڃ롶!Y=Pev5McE+tf 'Η.fuKqTT~\*jtxeMJzlU8ކ=pxUeeRv [C{Nl`&):$!v0 78'c$2 6}(:lK8#n1`"ZB)Wf^uYqI9aNφmaR"n.CUu wYf5aޚlPkT!k 0S ٣SZCz1B-ئ٢$睡ANE& kALx'})YmS$2?#n͋Uhh bBO`}$el 7' VNFh`rϦ{oҕ4^9\QXsX$gڱ&;]I@Ҝf^Tlǜ㱻v†`tCWα X3n)TޠQ?AL+$W)"pYS={"p#hUL@gZٽ'@'}JƑgDUDFB[/k@wt+y:͊ŏT͑ϥ".:2)( ;A#j^6S+ B(-搄դ.̘esn f2`p H؍Ud)xY48\i d5J ((sƘ#)Kݘrp,5"s Zp\Ķߡ&F١= yH 71}Y; ~*7)ɥuh+'A8;M0JoIƉ%Y$~"EmRa) fK#|L4Af/"[xղ4|bH(JtPw% p]{~<ඃ q'bbܞеqn|Qk4~%[@ ˉ VX%DU8+<%߬'T}^s =:.rHvfSTSw6ňFhQntTK?L6eSYgaQ`.ѻ;v-at|`"ݶÎL 965qzZ 38X"\ h-H;4dhє͊r#N@q( M %[E,{)kNԕsEՁJ&ӍV#ba>f t~gM+zCSȾD‡!Zw[MJg\ Hõ(+K-i߲vchO/Wt)OX ;ůTkH3Hp3*#qSZ {a ӏVgn?^wllf.|g"πg d2KZ c_P(; $#'<iծ/&/+Tkn+w,3_|{M!La_|S7|%ܣ*'EQ24ph!i6uWu/[e_0ы6Iީ&;f ω4y-5i yҾB>ng/^Y+c D`36ma"̄|"j\-Z~-  lZݣ<|v^}_s~ 8)*p'(f젡4|Vt&o%_!xlo5h*vwnfx!KOA#ir8dSqwPUyFX Iʹ(IA -t0?*v`BGt ( ̂N C4?`MIhF9vjxPK+t@>DPK y.F(angular-1.3.9/docs/partials/api/ngRoute/PKy.F,angular-1.3.9/docs/partials/api/ngRoute.htmlV[w4~_!ImD1RZ[ږ.NB7<Їd%k47LYga眶6ys~wt~~_ؾTzV6Gɣ;5Fnj2;'&3ZΩ_zGfaOOx9CXe;ddi/`ѼFn2 ޯF1:K!|IȪOFxs'ܠ]}/uLu?5)1 +p)FXb?~aDl]nMӎ˿&QԄu{IO_݉FY[5no%qnԀ-Վ{,eX`R[+-[^RZp#- NAͪ89%ܘ<(;~5E6rL[6=*^lN\V{-tzi$'UIxo͔|T\Ȫ?u'hpv" E̫a2ѣ@?b[ED84W(M_S`E@>}kAl1hJOr %7?&SYvD8_7'YSfM4x\W]4a&/^J ݶ'nKt%Ս]fx1~X׹MRO1:Y<*mlK\n[]ÿcDo>&XK$j!jjTEݖiOV-ǒ祚Fg ѵڪ3[Hf& :)?{/d!'o{6R5FdQa[Zgj~S8DEeK0*f3o,''BgTxb^bUvlv25d{$2<2+_Hwv ASfeJvːtLj/B~I"rg˴2 5=M UD5siA{ᕆ" rj*[Ps* K!v]%.I)uP)U#3{3{5Tf̢J/vD,y#HvDw^3z7޽qA@>BȰk =Y<{''H ;(J8 #(AlTWx0E@ekV?]h,|2C*FH! ,N ^(8pJC ѢĔ(*.fiY-RL)tt98@OsH~ǥn,kRw.a:>:\A7z5OBo58m DySO}UJLn>>3@*OE.ܬӊs. ^{WEI͇Ǒ&A;^oĉrnQ#d ŋk`Eے`rsUnJ{t iw넠B?u?rhԮͫTyKy .z-zU`A&#R>5bJY[79.ށ\Qc`ߓ:lK9KAVVe/C½epi%w̵5EF*se F@G~,LÐE7Gل%"!),'/Pۓw8\V|H)FU\Z\5 P Ѓ(mYuW//ʜLE r/ )d%_x|@O؆4a^[p&!]/P.jLF}Hݛ/陼Ji|S6tJ_)U՚"R۪H^WߨT|tk:͏}i׎9A0&ћT7q?^\3СeXO#e !da#lH XMooΐRN&2J– !c(oNfmˢJSNՉ*ޞa%}#% ?qWh޹T)w)A59 uXB%bE&~x̽W>*>!igFh`GVwౠZK >@ʥTS}vtxX_ p'ХO:8.*ߵDO4ZUa3,r1H!j#,YfJ@zkQJwmq6HѸ5>xMDWfya]]zн*67kauY~}u~? .Oh`gK ~+,U8O`]߶^oGyhuxg}F˟2]?ϯ?pq%腼eFVׯoJ׮}Y3r*+{l~Cp1*]lm9KT)F7v9:T x6F I=9#t7cƽ[ A.W0QN O+}FVǴ?T?tf͂~7F['[5˞H=ngujCK'KGa1"ٕ2Ǽ[,[UcҬlmaM0hE7毴x[94[tz 촷{;[wSD.tԒ崝 ~X)x L\9:' !GnS9$gSWG! ]lRpJHvh=#`3$C3{1Hؐ,cؒgB>P _oi<2;]'sby^fƍT(Q;҅baR!yCm)(_x OE?!\uL%dp P-4J(B7 łQ2D!Pu-(&V:+zYU$8`UB%acC ;2.PH_gp%mw˾OՊC6J*l +,18Cـ-Wm ^CbxN)/5^/3<ɽY6lxE]!Tj*ZDh6lJ`9R:^tteAؠ"}XtLNY/PdCcuE496P?kME=5D&*my~yk4{Rrl'(Q;8jH-R`y]T}ޡ^Gޕ-CFPMO! *h1P*u⚨f4P.ɯW,wM1ޤ d~^gwu448lVM!atAdT{bX "'cؽer({w[RR&^Eu޲#~rjds#dArV}I "֗&|-1zOD৭9$E MiGϸ޹JC` ^;m64؃Cfm=zq2e&eE$m_0 s;] qH`#Pa5\Lby.M"y'۞(QMsۀ^`8A|G+N n1ZE ,'6aDB7Mw @'T11KQhy c(~h_l O5[acı {R)͇F2)H**B c(˳j12N t,nMt~Â^Z%T}\:W]#PF3jS460&0 7jpRZ^*+]!}-4jGѱf$zǃ(`L4e:|͡Ownw%h q=\I95+4CVOxVjgH`Q; .0_%i+^slV)4^w`k{DIz:nfzV"t&K5JTL m<(ne=k{6@tlC>Zke фzpشF5{oq "z0`%m}S,ts|-NVS]dzy%=vj ^hc\TyJR{SG#KdeLu^1TPKUoPKy.F;angular-1.3.9/docs/partials/api/ngRoute/service/$route.htmlZ[H~ϯ(RǦy&h 4JypJlڱ]n:;K7͂VHt캜:[y˳sUs̥"u6joBd.8 aSaz]Ά5ł׶i=Kʸ<6q-,7e['Nq ֋?>k)#cefŐyðGJ,Qbkϖrv*39\fj<75Wkkk&F.Nmc#:=h|r4 < {Uz(`Rz c/! :(-"c0f5C+dg:Z$V&|J^zqփ5݁oRo,4y11|'$FtbKm ., H1J/oQT !h#4Cw?M["E ϟޠY[)jGa׽7?0@m~k(W7TTp^ZI#qe\ 5Ϙ(Q5K; 6,e 1D09"X@ckۺS۳0rWqv_XY5+3>{ { '6w\6N#;f6r @iⲲe.hCTHT>߽ a*8{Ci '@HV~'-1Um#GP&rƚq>tF# jKl6ȔXF2ۍ]4Uy..Te6Wc1E20:ÇW,(RxhpPԘ7H9KYXCE D^Q{3uv 4MzYpC @;JԺ\-<,GBn*;Ժ(a~)([F SN|Fv[?Opƞy9$cR4-@KGJQ" ¾"$ק\Dyk r[;Ӈ0ј‹p$-x wn32wyK{ig}/5v!L`Ȫԟj)aÔꛪdn"بSnД_ܥEn҇HM4y#0rSe BYqQxKyqv 3PFfP1/< ދ$DHF\HE15l["]'abt' U~( /[%u# A9S@PA=j/ e*$F T^)'ҌE+EF:^b/\Ro 1K@&E~k< u沞ޣ*N QpP[:ccؾF |֩y--hSQؐOtb_KٿpsF{BF xPo!3-ytKqf5s :>!pPF^b*5!}>zVPK҃K"`E ^ ?JyaldXQ8?9I&? ЛejknY m_`,k{g/#;0[vt4i1Ho5RdܴuMR=pҋZ"ۧʎ5Ko:@rԽVIXiy8'w1 SAnzNW"~#[s)@mQPMwbPy ~@g?O~oЫ`%&К#O7裌 JH#F@"ل/߇S,~p4,vv"y~#TA'u3ɞ@"1 L|,i>QgM^uk $Dk Q#a`$}+(v~g~#KH'ے~%_U1Wcj ːRum~ĬSó݌V wЭ^2& s]8AGR~?pek6kO<5 *X`IE>(m+4ؒ@;6'Y*]B!`vcUlD7ՑDH~V]Ϡ(Y:-̣9]㦧|OYfI[9ۏ/фz=}o:]Yܾ~j83'Vڳ4g{B໇5^:un'M@{k/4%{$u%cf(L4(J(Owj/q& (pK OȪͱ=D 5ũ~+_│ϰjۙy* zW0|$͖q-ۧ<;6dU{8(Z۱ӑb(RVk7Xr߽ PKZF h+PKy.FAangular-1.3.9/docs/partials/api/ngRoute/service/$routeParams.htmlVo6pjqIud: aH}Ŕ"5r HJf6-w{V.XmioݒuJpwvJzn'lt +mrNhU]ܼz{ۛ*r`:F6ʲT¹ՅlZka^V6.\;uhkY" zڻbb1_K>2碘xKLKz\8TYk;VjcW1BiQ 6cDEvhh%:fR"ݙ!S}}zG(n^LG:5ꕣۮ%J:Ϝ6bn`7`(Bׂ9{&ISu096/zzɜ(97@Ri l_A;C;JSѳP<:2o%o% "Vv֒FٲHzI'벜@g'-x&cB(w RoBСy,7RPq@,/{(SMop!#wnTN?1 [Cj ]7V1JX#Gn'-'oEb5?V9`OB"'3XkV G1 jD{hXk4Ծ;*`Ϯ鴧H1c+4JRw#N'wf3 w*ԁ}W ЩϢ'dL ab|O4ak+fSS-tsD> *1ו%C J ćAƥxi %bP9PQ-„ Y:LfUd n)T-"8! gڎdEq}5oVZҁCѼ8->}SM!8)g|v߯|$ŒOiQ`~ s3~d+$"QSVFkтƸ0~!)h՘!DE.ٸu 3jzPK_9xݙQ%7Tb&2otqFhL!,Vf+]LVHoe8-JA::~n}^v_Li1gn ԍ`HExc55 t: \Is 0݋Lmk\ ),$$4,,WݎCĉm"" tiڋ+2&8#?$AYsZ 9C(dP\MAU VѠຎB 9Df 5s$"oz]j9j %*<(s<)Ħ0= p)BBq vaI 8_] 6jWBZ56UwZ8 d.#)F"CYVq>,wq_u1)6_ƃx|?D&1 u+PKZFj PK y.F2angular-1.3.9/docs/partials/api/ngSanitize/filter/PKy.F6angular-1.3.9/docs/partials/api/ngSanitize/filter.htmlePr w©c/bpSHZVZʄ'g c^JNAL`ѦKA1>`]ka<\*i @89#wq25C;yՍ)E5UEwG8JԿS@1]?ۃH |t?++Kh\ y#἖+鉳ű|vUf ༯RGU /b,lt7PKGI.3PKy.F<angular-1.3.9/docs/partials/api/ngSanitize/filter/linky.htmlY[s~p[.In҉M$Itfg6mĘ"h[ђv:l!88ldeL/xYU2ylJ3Y"/L|?ΣX,W*LoEu^ Rs N?=i.tF6  X(^ JXJދ/Ujs&[,M*2YvAz\-t}E̪k%1OL{}E j4n2Tre*1__\EW@]#T<ʛXMwDh)rZvE R[fG{h4J߉<, m61e 8@r VTl-${]=p#bY`um^?% o* U(ucr*U"GaH2.USR )[9$GuɁ\AVI\u^|h GO2 hM-Ԇ#bVKI@oT}us wFXUD7} ցX5~a'>.ͥyŪeU!f~F<֨0ؚ}$7\$&H#9 JEm<ȥ'6p&ǯοh4^3R vEdžrqQf-*-ߣD-L=W~UYOTP;"g!A>ZTmez\62` џ.1\7~/@& n.\8!Zu-]q[U(+ ; ^gxPDP, pڕEv7ʦSlvv2msQI]÷ [+PEq6rOЍ^62Vsj5}J\vy@ĿE灃{v@dM_ESCx@;alY$n]C-Zƫ%J4*:SkOzv4=D[%U*KmDg!n궩LڒeE*Z6bT24p3-! \%B|ݩZƯw(A+nٳW:zJQfgNgGeOe~ͯ\˓nQ%i08pu$cRi!5P>@ kS-a,SϝoOeI0zn*ǩo萅KXc׼JUvgŠjա )ǽ>h9F 3 \OAΡY.V Gaq-B‘w[uK.J㾩E9co߭K" 9႒B:{vWAK.9\Kbg9 n:x galxcgT'*yXMՏ-?sO6w_g6< #GߝŶaSHn?♑ Mvt|R wY᎝XAdSԲ[ptzJM XC p.SD&*i[5YN0|t{ k;܆ėn{|Ec Q t~FmshvƆ&F͔imxB[P8 FrGG7n9@OȾ%L>F~OU0z} wǥsړ]$7~V &]DGظ(vaZ " ;gxhqеuog*_eGAJO}A;Feb(lvհbbt?,L\-:@,ҫAvJl\g7q fd2t>뤰b;>^ !*$IE[ߪN?^G8ޡo]PK !D>PK y.F3angular-1.3.9/docs/partials/api/ngSanitize/service/PKy.F7angular-1.3.9/docs/partials/api/ngSanitize/service.html}SM0W RZƔJB{hK!=Od9%! fP_$޼yͻf*M;r"VՍ;l* _3SzX/[7+"ȉ[C՝V'Xӏi<~IEŽDE~ڦf2Qwk]"Twiw,׺0fo4JL6ѓcK+ɺ#e ߾=e.mS@obuoS~K5R#Hܣ`fu胎Px0yeAK LJIbG$ :ct x6dEuR|1ttuA,Qk{:DhKׯ(LBCR#@G"J+s3NEX%5I,ǣ sWTiO2cw?;ưHʀu-Kw)4o ?bayy] ipE_Vhٶ:Vwy?fúh_ڗf[WYݎ?kl{]PK9`*0PKy.FAangular-1.3.9/docs/partials/api/ngSanitize/service/$sanitize.htmlY[o~ׯ`ǎjw, hkv '2IaDjP;CNIM2{jǨcṟÏTY䤴5ot.mƹS̻Ǥ6;R_FZHMo0ŤP+ï~U!LL`P'/!Jߟ7fr"V;1"&lf?j^L3yhKLi/TN-a*R>=¿y[-7=Yq'\ns~~Ufժ]9G:.S7#LIRy8#2d`{CJ^`VjPBik2R1`-k'+s ՝fS D3甕^ }` (6#|Ҍx fVǖrk^g)F -[H Ji' 3;Sb'k‚)rK纙s5=ib!4ILTTęh+6oqo/} *.5ƻ%vc@p¸ GQB(>[ #|CV!^4]ुpwBBW%` U(d~;IеUI ䷎dǜPqd\A0']h#?V;5 4* m-'u#?'IsBf8D{u>#$IbȦc*DEI&T4a/V\W`fk٫Xh׎#%XNٿw8_ZnVU%|O{irNrl&SFkCM@06l[ad1ǝ|t_TbrNً\UJUG8jjWc+,ٍ?8WCZzIkݞևPd#l&4[\KjJ7ֻ|YR.c@\cߚTP p>Jؕ@LͦOr1`F(,@}!EE:D yceh'taK h 6q+սW :O:GF`(_a-X "xl6^ݷ?uU/ GY @@;(M m D6ꂃ?Cʚc& NW,]]A ? Al',w1Nx~\}hԱ ]6C x!-bNjgݛиr!'`<O\ICɃõyAH!nxWgAa[d*`IDX;E@Πx:gJຼ!:n?n5ϭvtcA3D(`Ui,Il gj 1thA9;`x/~1r1sakȵٸYE$n0+,[A׉l*ɈN7lG3 O@aנ=P}m7-p!eqwУmC{+ Hcl<XC,BSj (3G8$8vp ]4\OyH +^|$*OtûszǗEKV]eDCyĐ&93?>/{  G/ȡ qzR4z#F>J yq%/3w%5}If-RVZ^:)mB2'JPo7 7,"J"bgCE>|$'$OI'PK*PK y.F2angular-1.3.9/docs/partials/api/ngTouch/directive/PKy.F6angular-1.3.9/docs/partials/api/ngTouch/directive.htmlŔn0 ~ "8kXk^hK,jlo?JɼaŢcTCl ɬϞ8hVԹˠۦXm#ZeV,x>^oU'eh4$î.WCw_qIgC0>'?^N6T"@in5ɚrˢm꾾$Ә2xӋ0,1zҸЁU1g.l\VJd8/u/4խl<ߌq*i: E q [nq'PGPt}fpMJ/㘟V"y1oPKl9-PKy.F>angular-1.3.9/docs/partials/api/ngTouch/directive/ngClick.htmlW[oD~_q\DNxUm!Za>f13,7{ӔJgr.RPkx:m쫢J׎eBQ 3=ltry+~^u[4p1FZUk{ϟ_~a[f z4x-r|헧T+aTv;νZ僑0Ӫi_Ui>Ԭ:v. Y}mk. Q-)0GW-rQm>MjAt^h岿ϰMEJlY4l& Hy\*墳||G(mV%ʢ zufhzqMuda7+ONHfTL5Ÿ e픅VEnP'5p8 k8Ẽ޳ٌ Jqh dFQ߭ܐӴf-Р%}3wf4` eci/#֣Β8&ȉ!}V,,N0b`7`dჩ}{Q`*Ql}ɮC%g{L8,6Z)6ict}z[᰸,ՏrguG7DlK M4JEO젵@84Z%fh#YM{mn':=,f g3Rg`DzIy.~.B+ [Oန5[V͢i%sNnH>mZàzqv7a^6fCA2Pcvz;ghˠ+(zt`Z8(Aj#݁~ff_$U6U?^-x!Np/x~" Erׯ5#G-F~g  .&)XGi*ϫَlDDĥ;anN ;tatE3Ќhb,3sP~Fte)`x-;!1 L^nR0G;5؜w!L/,Pb 8Dt|dzq),$kWN%$l4C4wMdXr>\tdݲuP޺fgp\7%t,}<^TB[Q|~NqotoŃE׸Grlcэda.|E<ק .'B>8rq.8ZFfN]}u1a/;~}L'2.7hs}(r^6zh6Jls:?g֔YCYg2T:!|S=O-Y+״tiGZ痯TdKVH>=e#]7zC)sK_J=,r%fתԝV)ypJy&~3D lݥ$iRֵ{lL[6UݾiyϢYyM"3:H ~+PN%էUNY})uuf(`Ht򖪴Q +/ZȇbvKń$:jhHI`9c˴yn [SNi}_z*j+:݊%rw5uBvjs J8 v7`ɃSןug# Y`YFxe9#%rɦ*YW@,`HϊJpgCx7\mv{*mc@džrG3IP"&o!;"8*:HPn!̧Lo9h/:}s!D۠EƊ/L'fL$|ѢPs $nNk4RGm%=+/&A('6#@]oVWۗ <@wc?FG0Ecy2B!{W{ 2:,|܁,&7}e\$S3t0b uzx O'[˝MK'crmI<t"yAbhd?UE]$qDwBSTpOcFEkQ2Δ*vZ/}EP=YnB բY'x%[-LuK}P+X=5.Zw *dc5!&f{t3o&%xK)>+\c1"&wxdrE;h?:xu13:~L YV#]ʊk],f-<|<$MNӨfBZc W{k1CWH^&)R} Pu8,ag^T7Zg D'JezOyB(VǟTLhX1c<|,gAO@B•K#<5z v#yj51'jRWɫ{`,:9?쉩 (D=$crNk^~^iAًVb2^>)n&: ͆ g.Nn6<e&;s儌piu2F"f8WlMtF ~?l ݝ99ZQ:;toxop⭓E r,cIt"y`XX71AQWE]$~U {5R^I8˖*k6 kWreGԝgT|+?TlU9;+;8% 6IKpIs&#R[+kTuKACpb8d3p%c-5QL 5CXLdޠc!B N.zДhB '҅7BjyQ ύS F;;PKʀ PKy.F;angular-1.3.9/docs/partials/api/ngTouch/service/$swipe.htmlW]6}ϯ‚4x`NE$J@I$N vhڮ&sRwW-Fv 76}\A:?VE|4c†;rN6tW=!~krU;Ɍ_U w/DswW9І =]mK5[5426j߹uYhKV9Bn3/iobүLzAq_EbXմ~"1Ftm!ΦTʖdM6"^iĕՖ=6Ymcʢ!XђTor^8OCx ^ 䟍pd ^t5TOZm'nLdYD+eacAkux(ȹ+ a4~9G儜BH0K0{]od_oj+8eZx#:@$@lMXMKZzE,U^@ VW؛ŀ\{kĮxŬfBZ ^BuTϦBz"۝B;! ; iu1mY ;eigi 8I|pɺS sC[@g6 @=댠#`uy=@! w5xHjg7P ;(t`B+:D 5Y8)'m1)'n^)8]nO'4_O2 Zp%/N:FH$J T0'CB%,褠xl5C$I!IsOPI`lzt(i5dMokq7S31el*Km'WK+xH@7AvYJ./py%\**PJGBUcbo0@K,CSBqksET 7yq^'\X9Y/C%TNGoc1g0k_C'IK*3V{c97V"$4!5G{Bk@ٛl8BE!eΔ)ZrYIK+Q mU]:ސTN%(K!8;&έ#^yآ/-pt) t`/^0~an/r-6K/$K b 9+EzXfX_T@_<3-Kig-1*V5O #pTsinJ/LNqq@Y?,A3UVd"gPK{J#PK y.F0angular-1.3.9/docs/partials/error/$cacheFactory/PKy.F4angular-1.3.9/docs/partials/error/$cacheFactory.html]Rn +FVӴ,PU0 :`q/`Lx{/ciSeta>J*Re'fn]GmLIv+ͭ3??6t9Km6zҮC~ucvYhFp]?c ^OB]gVZM3)A|->03nڎ ݍXqp쭆ÞRΊ3!Џ7:^3YkB/]w>dݻZ3Udh#s![lCEhZA|++u .8YA(#HpxF1:]3 eu,a·kRțY6(Þ.Lf?꿡#@ IKkr!bУLC=0:/4q6dy PKRhWPK y.F+angular-1.3.9/docs/partials/error/$compile/PKy.F/angular-1.3.9/docs/partials/error/$compile.htmlTMs W0n NirHVM}4=,~dŢ o1tuݚKҍksP>[P9g_M=_N|2;B] ֙=,#[u8H pնFU^{(3 z2måfMw*FN:R6ѕ1 0I_3" u:٘+[?1F˵[?Y#G-ƚ =MoԻ̒4pKM{`?OhVZ~ sLA `{#U%Zدd }Y:pBI6=?Q6I:ƥ?uj )BJ\)O,Ø/PKw[PKy.F5angular-1.3.9/docs/partials/error/$compile/ctreq.htmlUao6_qS;,I>͖KX0DI$R!)'BGJS]l3`gu޽;&*͋͢58.m&fj苉y.ln8W3%-6Z+cyY"Yưo;~.oޞ_ɹɴr,{i< yE jff!VKhk "MuVYѴ ]A:[ӮXw;%1KgYR],W>Q]}6v c,#9 2kعIΒFo>I>FH mL \f&8_IeY =V\R2.`ew"㓂OӨ'RZpCVAT^`+fɴ<1&œB *T/4HL<N tXFFH ƙ9T evN&;ٶ'? m"#0+ܠ wg@vk޸$, 7$ ~c|df"2Tƨb3:hٳXr}E5סdCàNOEBFhPƾCJtH.ē1ws(,=bqT,<_Rg q/}Pر_9tE艹"{bM[ⴍFћyO*Dޣ! AĬF`z 5۶_Moo/$晒CsioEw;+ A @nV7{“M +hDžqZ~q]li oPKkgg. PKy.F4angular-1.3.9/docs/partials/error/$compile/iscp.htmlTQO0~8A@1JдÞ]%e;ICUJ;w}wg*"7nJ]B7U[sώa!=[_Z8&_ wΡlE>-3R}kU| mA.{oywc3 ƀ>z;0iôy_Q\P+{>"N{Wo9i@>F $P)_<ݘw67kI<5YdLCh|N:{D zsstK ïm8DYM' _ԛΙ78 PK\NJPKy.F8angular-1.3.9/docs/partials/error/$compile/multidir.html[k1+-īys[JBڧY;UTIk'/ !% EwΌ^-&mJ>΅htje\'mz#Zk(nET6  ۼ6,$]Pwlx>ּ=p2;9;\T .bB͖UHuX)~%FbB,I1$ú Hxw{BPv:~U˅iz-C.k&{k[&Js+9enlm;ǟ;v2-G]϶]]^\\Pyx=Q!,[REۥꜷ{T, 57Ztz[1y06EC. tg"l6+7;u}tFTj_ 3ajjeM>>}9,r9JP \rB)+]hU⸝TQz~w#%I@VD A'-E㎭$Ӭh/}H.C_$VZUOLRdȚt5e3/"xiRݻ.\0H}7;,OW~f^:Ҁ4dJ*/YSVIä\y$e9JW`\]iY*?`PcyQEU M{{bFX֢>05ՖA VHbIc` 7CLV z۸FtrZ4q34oߦ߿la>P^jqbM8~{q1GHCa!tSˮcxD>]\ O\t_ܥ)2/CS#`zô`S(d\q:&fPK# sgPKy.F9angular-1.3.9/docs/partials/error/$compile/nonassign.htmlTMo8WLݍ?HlSmE$@ E/ER-H.IR m5 LΠb]&0Uu =('*'pPk%6#AV9YLUαJlÞe=VgW._q+ ,xDe &.dkދ4$«pʖ~AsyUMoj`zJ™MN$}?_Kך$Iބr' @^=͝ajDTK/wbV4nŒV9 4'acLG_q#V*<0ūul8<-3 뷳SJX|Ή( ^`99x^ڞG%bKXXɠd\ɑOМw #![tüǵa},;'U ȹ.@C հtITE{Η_iF ܵML,/lz4j|?]зؤ;ƽr.VΪݏ`ќ5CYkٶ!yXmн* MHM($ˠ 2ǩ0Uy7/nC9ÍK8y4ut^M=6N bd mue]0Szzu/KL?0LEǞyXM4Ma=}|0S%N"#>~%XĴ78 Okfj/PKBӊPKy.F8angular-1.3.9/docs/partials/error/$compile/selmulti.htmlTn0}߯}b Q>/pIbHlc;[VU\V-X)ڌ=sq2IziC~'DB;iiz!u3t-W/RAަQҋ:v8ǬXx * lxS?/9.>ؗNף 8M ~QuX㳵N7y漤鎶UFmk]x{ _O('SfB*kWQ̎F(!ϼz!*6G+ nj1}jLëL>Pƀˬv40xz$RvOi3  E@~ָUJWhЎ'gLp1*]s6(![4Mm7djR .Ò M2yK&B4Tpeִ ULjХX4͙$0e}HUB7P逩]OdpfLv'} C:'-ˢ[hKcml:KTSx 3m~]i*4זFcWcWt[= ~WѐR*-{vhV#+گQulV~. ]}bQh[[,+W)bW1njlCUA9V:ZB ,W\{mpoK9G][Gv\x~Z=?:t;~{0QD) $-*Eu)%^gs]eC 0u W!AYBX jyuiҩcVb9f=ݵ*c ~Á].E(h{႔'VTP6 }'/TqM^u%q?oeWL[㸏3$r< p`)D8V{$&Em$(m58c$ L¤ V `MY/h fh8 )R0P?Po 3 #Ct9t /4onxJ=?A~qO˟ܞqFJNN 8%>(+ niV,sE1=cd~ΞOјY6Cu/}or&Ze/W˵SshU{8yΨo aV\+E}r%u6*;n޺y?$ӷ4iRQ>̞VXl{@$kZ(T@Vo5^܎dGDh5/4 +hcwdVrTi~Md0[.)rߴ;[$B q3+3+qg'/MᅙvƁQ0Ⴒ2(+ n93PKonzLn PKy.F7angular-1.3.9/docs/partials/error/$compile/uterdir.htmlTn0 +`M6 8 dzz>@[,y6H50b$rzV{ߺ%cǘiU=g?Rze++pLQ{>PZ+Σ-tEQtWcfq[Vn^'j:,PܹL65= lOZp⩥; `6Ңǜ"g!+եq[GKg4 禥t!ΘA! 1*)!PɈU륙O,GMr9?z)H MdwhEr77x;㐋*!. 6J?PxY%PKFXPK y.F.angular-1.3.9/docs/partials/error/$controller/PKy.F2angular-1.3.9/docs/partials/error/$controller.html]RR )v2CBmoJqq=; )0@}{ im,\,t.1QVvǤ [p[od֪p[?_=ϔ5۾G3_?W`*v0K5u6 9oX TD3yI\N'\G)IoU Jqe9#:rA*Τ([11Y:nK3hE zV=v 9g2;!#@TX'Zxѧ:kĪ(?[5 9eΖ nϞFAYOy92տ[Oߡ1$36(W%v*֊7 LC8Meǰ,hN:PK>ePKy.F8angular-1.3.9/docs/partials/error/$controller/noscp.htmlTn SYJYӻ0Mm'ӤJMe&;MoI[$ GzYu1`ձW{c6:E}YoYcU`ʚ&2zv=zflP6-}029˥/cAyBiP]u]Wz²҃vVѤoU}];iB/Y]fgZ|zAt8( ]d"c,x7'MMĝANPER,*8:/~y<`f -Kgey-p묏-TO+&;f"np[%p_w$77J5D}Nw;7Ktug VxN3Ӳ~GGyK¾#16`}yD-#ǒ# WA1)H}܁]S&a&U[9bcz tBFQ6!!1?K/}nwί Ƭ/$x2E"#l#-6=ZW[ ^2gc{"[QH#Qwq>QE8œ}Z-i"5V'$]S(v+j K_PKF|LPK y.F(angular-1.3.9/docs/partials/error/$http/PKy.F,angular-1.3.9/docs/partials/error/$http.html]QKS WdCB78jы  /=0,f5Vy9Tem6v=#('y,- Zkdrn'b&VUʽ˲BqVSaA:j~ʨ:m索SUD59֕)Qm/),2*,ɢ$T,;J2:g+ZrLɛS7A~k, CѨ}QY_|<PϫBUQ~R3q~?OI2F*.,ns6ὸ$ !gGݗY\ECZв_PKbPKy.F3angular-1.3.9/docs/partials/error/$http/badreq.htmlTN0SEcun&64}%&i`{;MavC(I}|9\@q1bѱRڞ ӽ l<-20iMDzo={Z(7iC!ש0W\Gg' Fzl ˲D[\.PG~^q+޵Hi8[S3]] :j6]9XAIۊ'D&ΫB70DdF7Q[Y*8KgQg_~yڒ>4ňT:Nܯ/d'T=@@?j@l}2@d$-8YTL3k2:sr@zϊ&bQ%\uVrn[4d; /zQA2ZiX@ǴVa)& * |zΑmŽ?GP4S^*"܊ȅћڡSrUQl)K|"A@BƁ& Dq:^3zRu}+\e= :fB4=2 hTUC'_vcZFYR(JKmLY@/#)3'IV/hIzzKMXS$l%wj默4 PK% ktPK y.F,angular-1.3.9/docs/partials/error/$injector/PKy.F0angular-1.3.9/docs/partials/error/$injector.htmlTMs Wh=Xt&NM2P@n 吤'Ovwv׫Ek(}]JeB7}'ܴvU>n{Jߢs/~@{74AZ|!F#hSa2<&:,kb̟Q$9 Yr8<anď !C0eϫ'3+^ dTh ^B!'S5Z )lbzҜs^~ nɁf@ nv'݀TiDK6yкb'KcNS 6Is5G ܑ8{;MG2(*dyI 6A{rri$m >ݒFDJ6:=LypoOvN_ePK|ķPKy.F5angular-1.3.9/docs/partials/error/$injector/cdep.htmluO0W2XAjc(O+i&caOCô׹$FmN!B;;I靿s94޸ cM˄Wur;ga)=۟g+pLhQyjˎz@$J4s$ox}VV-}Bce -wnz;³2Vv"_Zi$%*Ι˜nH7ZIy%T&3\4REq-4JTbYp+r$9#Eҍ/@X(+z:WcU)iMڔ¤ U糗Ow9@!~LcV֚dsi*6}Mlh!zAE-C'bRn$S5z%8Z Jt5^ $Ma Nzm$B)--H5epOq˄텇@Ф&Tzь&Gim 3jxgZLQ[sK,:]-|p%ud0c68r }ƀO^H ,mv6\{۾8rB\. )~iђMAW0V6Ƙ.Q ,r2{8?ʶA>IvC5z!fMߨ#-u. (J&DWt*V?F_4!UmK4 %jT弋{ts}=laPKM<;jPKy.F5angular-1.3.9/docs/partials/error/$injector/itkn.htmlTR0+)` &;mn[`KIN0$0 ^hW۷8TaqSJv 0ʶvNBz:O/gVhʣ ՖHJ'b6/qc&^|;脕 e[K/QQiLt͇1Vp΀W+namܠ;SI8`Gj,c2_IWZdIdy~XL! @VU9L%yr UBXdNs/3w@ʘƕ⸐Լn֒ *P\? phWR ( p[fC2Fȁ$W[$"8M۱[7yA((h!Z`]X #@CUJtosb\=?Ĩt[50Uǥ/:оB e]=^C^ &~捩с^EUU-pM%%m sXJjp|680'hf v(/>).Gp9y%͘;]5+ou]=1w6^6y٠n=2`%9#2$?{m D",u*/wO&JKre^v-'jR+t.P <>..j2FB9{ =Ғ ӂI0UxmoHdvn;Um8{MhͿX9ƯZJ$XZ]':PѫL&*NU(^Ed"zfauN!i< I09g}ļ*£HPsЬ.P܊ZGҏ܅?7vfR%K[iz%3iRӧ+^ɓQ4p~rq<#A,cN:i:ins4wN+Yh]Z}rj,o!*Iu@/*_/1 )e-628 PK>xPKy.F6angular-1.3.9/docs/partials/error/$injector/nomod.htmlUMo6WLN[MNeAŢ聦FTHʎP~ Qəyc.\6ϲZf8t .{}SV  8i! ֜x7EuF!-v!UGL麟7;#LIP=,c Q^S^%Fi)~02IV[γȳ#3s D;eqW*׷b<7mCRO(_G3))zn[.Q`9i1K5zC%),yJ$-݀|#<©RUc$qUiŇ(2Rѹa!,.i^0`+_}XUAT8`#ɑqnK$ t젆؏/>E]H/~ZR,YK[ '̀ I3U2B]"PDP"x_%ްk0unwUg\uz=4Nv*R8<(0m@LJFX kIN\0x6|u(òpx1\'搴c8 ~[~zeВ#%3Oa mKl+ѫLY5h 8ߪ8ރM]D'xV@V"N]p(`Fz#ڋ[D=Ueb@mN )1C[z?IƇE3y!~--4,΀KoC %nbN.8,@v5JՃdRi, aꐩ΋ƿ[H%0ߒ{%HBW)7bp0Oww^plezA,#ːe$z6J'!JY_D75N~PK[PKy.F5angular-1.3.9/docs/partials/error/$injector/pget.htmlMo0 H6=-Q=>[\TJ+7H^neC1 V8dg<ԀW+;aY!/۽i$c4\mYq&OC-tpKD$ o.eJ PF*_IgT5R>g!,lJ8T9>8J>s:WCy%i~gOtP>:YοmQ_7Z-ڨv8)~쭃ﱣD"5XDI@87htFDK]a10h n|iqIIW>o{U^T#1V7aNW}_nm)yG󓫷}tE!X}(QFƄJV>%כ-ZnD4={EQ,Rڨ==8kmaYWb[tAqX}_ JVgYVGw fPb_WV3BeI LJIlUfUIדz\?nݯ[aϷ@HLV^l W߰b0vUU|UB瀂&c?0 XѣdHq:5 v^eKAh}ֳHNtQx7'fd yI^8q%t ErgEoQ(@ Fe R7= {6J9N7W+9\@N  ~RUc( v) OuOsG)@%5o|P!C9>5hn2>;H:aUen HPm^d],E}N ^.}!wʌFMn~'FEj X0-JQc7eآCxWwͥy~hhrPLp\Ķz|dPKhPKy.F6angular-1.3.9/docs/partials/error/$injector/undef.htmlTk0~_qI-u< ]2=(Vg_t΃EYv!l-5pR A_J'xgA53o8d%_XG\䁩6FjzKvb~5?֟X Mh!ȄO-k_1٬ 0Fs#{%џ) FCfw@~xqCEW0j3 C%Ytz,;A^&* PKCqPKy.F5angular-1.3.9/docs/partials/error/$injector/unpr.htmlVN8}WΖ$-<-PY> Ux&.؎30aW;h2s眛Ql3'Yiڌe0&㕰8*UTri3k!⪗N{~k1l=oҭ)s\)kiR0cvEiu] [龇-nql ]-PMWYFMwgb U+$'gSG a]6g8*.<J#,b-fXY_ ĤkhU x8奪x1u5G\%NVTsˉ^h^%︬,(Z;솓KF S7 JkPAK߱k ÇGv8:u@߮ZZV WÇN7>[Qa\٧/ 2`0YA=4IOZlCPAgr xihD~a^,ƖL)CRو`:S\WǛx(|Lc1rp +Ф-A6O%x7!(C%i VЬi3u%w-č%Ϻd-fl#f!j *2A W"N?Ղà\sg69\nk C#a49Pg,^h R} /F/]{f^ m v%S3骍߼'\ ac4ֽ1<n@e6bDHgo1Pz>^0z7m ehLO}pÛEӻbPK,f8~ PK y.F/angular-1.3.9/docs/partials/error/$interpolate/PKy.F3angular-1.3.9/docs/partials/error/$interpolate.htmlR˒ +Tq=HŤR@hlHd;1Ѩyp :v)I0홴"EIx7>c;NO oM[d›Q3!'w Эč8A-2}pG2L3`2ւ3-'rѐM⣝̈IONq&Eu\߉gl'l/:$-J#[-#XI=RH᧮zgѦa (OOrZX %_LUXOR,٧ROsfYFNlC/M4s722TU=}4ۏc#UݐqvDߕa:[^& R/3GRf}vJ C}!bYl.1 L "  t\PKnPKy.F<angular-1.3.9/docs/partials/error/$interpolate/noconcat.htmlTMo0 WFlb-s<k taWEflr`emێ3/z|{R) _=-htl]\'mz#.I`8\7ŋ"h\wFFqPX؆S?wH$\eݔf}T;ϣT,((#V38O86st'qV7[k;# ֩R*˲6% D *K;jY7Q{y[R)R^U&+2|8Rs;j< !e:B+C ѱȒܹ>&:6v:Apmt TO=՜ٛW#CmS m,#=z1W|[fFx 5.>~Kht7kᓻr χbgrȓ4qNotPK*PKy.F9angular-1.3.9/docs/partials/error/$location/ipthprfx.htmlSAn0 [ c=ԡUH P ~"[$HJQ]RsJ̘ POJ=cNj8Ln0"g+2lub/u22lB{oI;˴OʇKm;cCl=ov_ow-F@TD^4"J>y݋p^5\_ΜDo̽j=gyfAR:ƒfXpimPg ;RڦUhGat .̻ז@&VGoP0C0P{n GJת3^¶y('Rj3ɭR,o~f!fBgL 'NhѤ%tَE ҵ\)h-K7h[ԛOSGOgp!/~"Or@xoN ai}]vBQ@ iΐ i"?GBHEDaw z* əD&I)3cI3mP~E_ڠP&zAe #4&yh*dRx|T͓6ePK bGPKy.F9angular-1.3.9/docs/partials/error/$location/isrcharg.htmlSK0W6f!-HWBqĶ: WlݜC6xW *MzPY.j-Zr&X 摖yKJx; `9=m$zn<сT=]碄\,@FAU$9iHÀ3-,h8K-^ \yOIɮ`9:`ٹC5CݘPjlm-nP<Wv &AKH5[Nwu>u{0*/^Q\S-[A4E 9!v'AOIC<*Po& N` E|*Z 7E~0l}2?`xEx$.A`W0As? Ժ#K5$7$i m2 vC; In dn@#BB&hNC` 2l+:(;0}ŵy1DA2yd,HJ,LiKϢVR~C1?efp; 4gac+\0&P#Lѡw#6Bj#x*=Zyx4%gf-b-H<7XpoJE|0=wQF( /w |zt~Aðd*+F:~i!z Z Gك $ ۰2Cܽk|L(6B4%)0.,hWtDk}i錒9gd% =JPEDRT4T.LqN/\d7PK}&7:PK y.F)angular-1.3.9/docs/partials/error/$parse/PKy.F-angular-1.3.9/docs/partials/error/$parse.htmlT]0|XE9# 8 xvM#-۽u^sTqCי[ t+1,vOggC%$ŏ0+^*d2JeW\Ö|2R%}c&[`P㿞)mec }_R8JFAhJ@9A5x^ONiaW緆SڞϧBk#ә:}=kQohg& 5iMRyH{)xOU|Ny8NRw2Lۂq =>BFOS\Dsd}scCSKmd,=sPKs*PKy.F5angular-1.3.9/docs/partials/error/$parse/isecdom.htmlVn6}WL ~UM$hhE["Z{{HJk'Aj`+j83sθYn'*˭ݴ)JS/]ܹyqYsb`.&gG.^5UϽ,d\ ^8>Qh͎6^O>Z5?+5ۭ~ï<ƍU꿒/rtcdU:˲;oC!W󼚳̈FʍB/tJlYK$ߤMä4>+2ܫ2ȪQ+>*-J#rණE(7b^=r!)CL;E恛_sE_^}]}tV(!TkMcx.UvǗ:;樂5BHxyCBJ@ {g~$0[S}5=`ƁSGNi_/y #3 Qb؉0'&Jv,C4m#K5Bj'-J$Ѫ5 Ա pY ]3u6l 1p{턗}cbC9uH?6>3NHOLcC(\ d:NyC(svg\( JD@N( 4=|DFR$3YxbwNY9tٺ߹e?YD?[շ-b-U1]:)" $zg|71Ĝھ3Y<=11YP*^C=כ{3+y><U}*ӳtz cr8uc!  {^>F3Fșo]g_R2Ԫ\Ks Q76#TW<+BjBBlnIx5}"v&Ps  n1 ad"ccEń@pr&(I;@v@NB3<*U& D87$? 0|؂ͼ+ hԒdPKJ E PKy.F4angular-1.3.9/docs/partials/error/$parse/isecff.htmlSn0 )l[ P-Ӏa/ ˴ՖI(9 .3`rzbLq 5VҳS1GZ-fuȤCQיj(G7!>-ƌB',ƒ,-%n̲,q6[( Xs{H\&Mw0$UpAҙud>bo-rƋ$Ix 6VeF @^m;EN+O_XE%j ܘWTU /ўaR,&9#F@On,^R9k&y%a3e3-N  9Kg1_i nO*x7DQI{8IoB EE{w5AKo>Zz6"c S{k/d{Ó6k k>AGq 36 px Lil1@3o y ZBA{=>ti\8K$Q:Xq ]Й3mU裥yGu]GBMK^%ĭ Ѳo9 Sa//G.0-iZrƢ 62; R|p׫oSgKxV{- PK*PKy.F4angular-1.3.9/docs/partials/error/$parse/isecfn.htmlSn0 +8oiZ`TP -]lYmu$H`ؿdf@|\B-]2VXwylˤFy^BG?d SD4ֳNLTLE![ AVoǰe[l:G:liS5aceKP aԭPhr^ҟs\Z5'Wkbj ș_Zk`ogR$I@ƈuGv!ܼ|z/`WTn}P" [g& ^|r MlyL1_;$5ncwvZ?^*$u|G5,[j%v;mX`t^w"縴nhiڔrS-&Y Y$I7SssLJENN&,ܣG< $֞EL(r\pyn2?8Swp%~Yir;]i>\H[Cz8<]6oUF5ܪ؍Ct9X/n7MxL+:zS7 C`A*xR_&#Eo^ !{Ʌی9WdvNA@(Z =8!u!l%6׼`\BS1҅m{Voܲ {eR.&PKðwPKy.F8angular-1.3.9/docs/partials/error/$parse/isecwindow.htmlTKk0WLM6ǩK -4BYfm%$$ޥw:j0|9P9Uo+U"a\mM=C 9˝G<^iiTAyr1|].nn$zT[}gVUdM0tֆgcۇUw!Z硯P(66xd*YwJ`ɇǟ@eM)Jԧ3 4+-T8.½hkH$x@ M!F,!m<=TIt@^ֆ@{eK`R 6L]VTImJKjxgF1ś7P5rQ{TGIt T Cc-/39Ǖ^4nGQrQ˘r/PK% PKy.F4angular-1.3.9/docs/partials/error/$parse/lexerr.htmlM0lv!A** BaJ*Ƅ$c –իgfdʡr1%QRXMiU$U)"aM&>H#KӠ䋖!Fq&l2[/kW_ųeYsa7Wy{Er*4 ~3.*Ws`)QU^,hb_S[1d@ku`48n82qR0$%IQ^8N꼼"jeпCOg .iyAخ:2 e~{(A9bk:vE4F51veZ4s*!zo+ `aZVO M-`o=jvĠ.hYuE|\dB3eS5[YK@4dԈRrB&reҹb1;Ev@<$#˟7%y'g/ӏpcHwf(4QJW"njثrkÇa@s+~PKݏ}hPKy.F4angular-1.3.9/docs/partials/error/$parse/syntax.htmlo0+ѴR 2jST]1NuiYwRHiNٍxHb?-l%%IBm,\ -ԎQoq*C~>DI\gڄCZ'GFil0ŧe:4ۚwRt kGj #m0?٢ r+tzXe,=|9ӥ[GSpΞqڀ8qm>̺_LYֲ!ZBs±p+zP9QGic ;N&qU:6m #Ptlw8nQ6Gp;.^zı,r lmghꝼZr1mzi٪BR4\ҋl|n&C])3ip_ac;W"S&a.^l@cR.?M9^l FZn4x%NƸ[wUuy|0 Rpsƕ}kH\W,73#͵ &“SIQo>[$r%1G"56-O'*a{ۀ;y5r|J8.{cnEW|G3 IO^!эb'k4E$=R"hrxaoȳՐ 2Qg-**])˒TR`/ի:Hha~*Gဒqݑ*w(QβvC~nRAsssKm2q[7p0͇͗qIf=׸PK0_PK y.F%angular-1.3.9/docs/partials/error/$q/PKy.F)angular-1.3.9/docs/partials/error/$q.htmlRM WXQ=$ǭPU]Ue@K0dcm(p8UJ>~"䨓:p#x2<\m+:{#ȏxNď ot{E=fNV]AaG܌}i}#=W+-W]D cDI6"|,|֬1`*kܵF2?ynYҽyaT EDW)%-rQ93S:嵋c_電KF/;H3B4sr#ٳљ '+QBrܖ'$`͊_.]C4/NͰҗuKG]WWPKM_PKy.F1angular-1.3.9/docs/partials/error/$q/norslvr.html}Sj0+I $VREK-e_S[Ŗ6;3~ͼPAx=M>9Mlc]ǕV.D>ܖw\;FĭXښ?;ApHf{J˻³^!f(˲`U! ytl ;F֣ )T74kMs_,أӂ+ehnSjbFIeƘ Ezcc!;\;hؓ`XtlW<dFXB_$l+|·Ã;= ]dW'?2S;8'$kGIZ.\u7@3Pmkl4)PLևtNnk#B $hs(Hg*"::ܰwZBDŽ;*a2Sopg1A]-(_j(|)lPxy`j]]Uu@`}7ճvC^)kI#zW&>;"=eNb4RPKv PKy.F0angular-1.3.9/docs/partials/error/$q/qcycle.htmlSn0+C6Zsj,ȩM%#ȿwII>5 .wfgq5Zf8tLzh]oǰRxcI=jZc {'bk 9Q>b由TU ^!\," zkFC8xRyiݞF#8@8]jo#K&x$eᏡ;4& @Yz(3Chm3EPKy.F8angular-1.3.9/docs/partials/error/$resource/badargs.htmlSMo0 WƲl@bN!@[۰"3XD91쿏k #%5eR[!~_ _ Mt]TϢ.KcQH^:6T>uH+ay-6W5v<eXUQm џpa`\mTqesBk\f̼ToݞG)z )*B>k̲=)IA3ֺTOgŦ "G))B dqLytԔSum)-5N)[QwZ'aW4>/7JhRmTŶmXw,yÇ|v9w<,U63h2xcHEĒaalvA |=7avzůczj< +{i7ԳPKUxPKy.F7angular-1.3.9/docs/partials/error/$resource/badcfg.htmln0)F.N6w)K*ĘMm6ʻn\H7sq]v!JVnre!M;\ ve,jP6As։wbQZ5mnZ]^mkGĬ7x(HDAM/TMZlEGoʛd1 v2$-felX>nUjr~vlY`LZ4LzkV\& h :&N =ɿ v2 `lԲ׿Yb:'cz`VOŊФv_ȩǒ?;SqXhVcb? F>j/B;ݟЭ`Lg(*Iz%ۤZH+LJ쐦#Qv'Ew 1Xdf>֯= WMz! ;6@_4෕>YɃPKBHPKy.F:angular-1.3.9/docs/partials/error/$resource/badmember.htmlTQo0~ϯ8FDc=ef 1 &^m<۲j$4QJ>Bh\]8elbec;fkӳ L vYwL&ƚ(Md{s/}#Y]-}i6!F|OzythZxUK#z4-eYΡ\uۭ\$ I߅CJy޹V=Z$3UL b\ڦbȋ%JBfzYTBmyQL/;n(e{ }Pf ѻ% ^WTzR}*4J Xз b!TpwK0;-._?̀R(QU&6 y'.*klb6,,xM?[iHWIS p(O>DQ))-Ȼ豉+v F[&DX8_<;ysFsZ]'ѕ:B *,ߗr؃ȵӼܸ-&:= ]#%X[[Rt̽&UQF̳_1`aTiA^ eҖxde;x5(AUI&W86݄b$!!r<iר(|HNUHO5]vR1d9ƊڊݾR kdTa"KX{2( }B{eMCr~oOdtD&K zp5~3~[~#6)YrhG]XgoPK <PKy.F8angular-1.3.9/docs/partials/error/$resource/badname.html0yQD)HۘފkX@W8w۲=E$"Yv`"=&B6m~0^% l%:erYP>7&bpicn ]Bo>o:J:ږx9s ajf z[;O+iͮ]v8o`,ծkS(U?\M^}-o9yPV'%S@w1 S"0gb ,DE)J%EIVI:FS_8Φ0|oJ#  mj_R0F[Xz\ z{>+rXTPOZO1ِr!ElhݐI(\+[ĦN, |K^ h[X<X,^uwQtk2߾xן!M\K4tFWB4zaPK21:aPK y.F-angular-1.3.9/docs/partials/error/$rootScope/PKy.F1angular-1.3.9/docs/partials/error/$rootScope.htmlR] |XE`so=BT5RUU/1 ie=Lvcrcwtiw?Cm3;?vo)ګt1~tߕ~[?=hL*A!fnj)m7?c[Ϯ6D{^qacwVJs} /Y +ΤhG1{㌎||l[3FI+Ѧ uNRA*숕?g]n&⠨,g7l1~4℟F|%eβZS,?R;ˢU1+1DjZ]upG0x֥wQu˾$TIv#e/wpf52nWPKerPKy.F8angular-1.3.9/docs/partials/error/$rootScope/infdig.htmlVn6}WL^)чjUHqч5H$CR^,;CIӦA\93t.uXo_eYB;4}&t3tϰR!^cV3it@2tθKc1ST~{\DӛU^:U"![is[gd/PͿun^j[4޶2%'(t:TvU^gH$o4Wc @^m{+Nt8/ZiN\c mi6/?ur\x"MlȦ)^WH"ULPQs ҊB"N\;Ή=nAQq* )^`p~ kVn-94+jï/.&T3#$$ ab.aae7B/p| -a;m|Is˹5ƨv/exbET]!{W4EM*6<1@C˛n`0E <΢0G2MzTfbM["7 Ok Y dpxTЃej UO\W˙ncgXҰU= -x>K4 ˧ªL74VU>eZZww8~'PKyЛXPKy.F8angular-1.3.9/docs/partials/error/$rootScope/inprog.html[moG>Ul 'mYAX8 ? &9+rf2/=OUw I9 ș~קKױYvq|UUyy5-jUOl3e {rdI5z/GlVfYZٴ٢ȊIeYQEK ύ-xio8/Cx#N|nYL-> pqY!հ+qEAd322/m=$:ˠ'N+UzS xg|F^,T?5Í O;cN`mN mi2Z>ikş$Jcx"z_fE*hHVclw)|NTF8|[eΚ){WU`dCX bip S[ 2|#bxu{)b(zF6j CXfе~aE( ߷@ίL eX@Kj} /ݝA @ "' FLI|1qLAN )y#aGc}>>A}Dd`䄰˚醜u qܛdnDdF`pCsnVvqhP{S@;JMngtZs;C(ʃ.cw*޽1HyW1t Z,)*gHwc7Иc=fr8p`8.vsѳv6gPh+LtUQϘ>–6ށl<"}:N\ZrWv 5LEU Dop̩ϛi |tJ'M@6o 5m\ X 54 NNQgmKwY O%eCm`8<e3ʒN^)xW D)wV؛mMc'-`nqF&(?=\5'p[UŁH//͆zTȚyΆ"HcfxL`M1Wx /FMKao^R" U]NF,ym1E7*wm G$gYZHoF&[oDBgMŧuUA0w]aH':%M55u.Qe6CAU _$Hbo1 ,uHCi0Gx-c+&.Q `1(WEhv]dO0+KۉH2BNJf6|0z{(Kr*Gyơ Kddq^5Od]q,S9Fe rBJۅ)UVn '&EKWgy8b>&t7אDSʙMc@)7?'/'NEY$yT5-znvP^rP`8jR5 ;):cm-2ndM0j :z(@UGl)B\u4yLm_!'zgO,R?c_8?Oq4v[k{o7f42Q2Z7 A_ Ia] ҴHZ[ʒ :8)YPb+0]tprjڰD>F:zd_Zj y2rj%\4U hU `zECi_C 2(w&5hZuIh@H |T嵻dDUݲJ^n \L(btc yQO5.K֭`m'mcknagE|l '35`t6W-\߶y "H^+.> GGi&[*. jFAXU\Hr/[ #TѦqIWZ -?ɢ("oo/K=C4t@YԒ >JBⲁ$ڈ t-*ͶVq%W$ݾ> UvDAAffh b g=uPcOYjд arxC 8iw8||y5~0?C;L!jmg%^zq>Ktyquy-xro'`W_#nv0_R~ֶ$j j^~q63ZQe{㋨//_G[~uy^'rej\z}֦z>}C]'HGª4>(u*IJ'NҠSEts!$My蠮>>2x}=_A80@ "T+k5G6-Cޗ8v9;T T+Csb%ˢp_ߑx5u:`t0/og:$íF Qw0P0! ٻaW=ÚR<%{ E55/-(w%V37ۛw,~J3jf X ]m1PI-kT5'ҒٛO[p)0Zt9bGSo2A.sPKJ99?y|`MX#>`)UQxK2<%/M}?0:g̷n` PK "1mPKy.F9angular-1.3.9/docs/partials/error/$sanitize/badparse.htmlS_o0ϧ8[D! $pkbplwY Q)cZI>FO;!:)hd7(!ZH(g#(0KVGE#[/ai;{; pʵ͇rniT /ճ,rHJ>#4Ѧgd8J?-:sfqpYE}ewÄNUBEQTm>AeUuE^YPm\_ت{pA:EەH7JE%ig݃Lgn1 XGp sE9mppƸS;@_7cT'絩s|β ik>\)D"8.8@ڬO@1${mrwb2] y~ 9\B*wbJ*TS*)L{Zcd?`%*2xZIMp'0 @tbܴDGn@p q1ɍvT?Qq^Ǵ5c)r] <Git 9GCb..9eʵ4H,/k%HfP./PKON@PK y.F'angular-1.3.9/docs/partials/error/$sce/PKy.F+angular-1.3.9/docs/partials/error/$sce.htmlR0yLiXnq:]6YR%9ge9 SֲW9W6F>0V헕fkc;0*اCkVcGgjlODKXU !\TL5Y b\[Q3L&]4fЫT۽j&tQY3m&#pzbU`W0,2lR H_䞳M/=򍴏Y?Nyȗ_9Vʨ1mSp#/0eM=V~:sdp'ru,slV4C'7ώz7Q)oo""/J*woBepGѢ'1*Fсq[wWf LjFoȍ@z=)'5E5Q)IxKYCF"R~\yԕMwmU]O^ ^@Cx F g!nfQIτZiQw/^=֔ n?YǏ_ !@g\X-v%X jܿ]UOw5ޢ v2*]8R:t@$}CEqQOg/1ŝǯV~ 9Ƀ:3vd"᫆PKO*gPKy.F4angular-1.3.9/docs/partials/error/$sce/imatcher.htmlMo0@Vbc-^# qvű-w{MA$ˎ3RÐ[ 9G <ƄQhNH{,|^47Ww6:$l|1fMӬ8M[1pumecbOiZ)i/wS,si]kƷKa샑BpK"[A f ;{R `}^vpIwPNuΘ<|97ȗ 18WR@D'#ϥGok>;KiW9iE ݡ~XH WhdA L%ݨݘmֆl[r9~6֪9G4 /Yhw8ϓGx|xz ~K`3:K2J?I̝稟6?.tz>1n1Re-pjPKBPKy.F4angular-1.3.9/docs/partials/error/$sce/insecurl.htmlVn6}߯bb?ՑU$H} WbL*IY{II(PEj8239V/k;wX|2a۪Gd<{|eXic´^Ike9!jY[tW"?Ǟ89~vR:aNb9KԸ]fYvHBs.UY(7!|>Ϊtn]鱫e iur|]3^V~Y\ =\z,rvNV?,n@ڊ̞8IBޚ޷˒mă,s"9 QW9Ÿ>A;+g-؝WSlboF7E+^'}~p+'ǮyX[1'uV O|5];h{y}Ɣdw:R=?[IR p x~I`z]R{#(˽ 0")o=N {:~1QV1@EPp-$8xTV s+T59U80"T0{%p~Y,1p4D2VPKO? G PKy.F1angular-1.3.9/docs/partials/error/$sce/itype.htmlSn +FnN6TVj٨wMelŪw4y(ɷCч`}MHB?50#ẛ{٪@z'ԁH#DJw2Jy'1._S? L7#1p3,chN-j˻aBFp;p>ϔ(mW,hQB e8fU3r}e+ v N~a^I9›qp9M>%wFI,QP.N^J#|k]R)[C~ A6 H0R}үd敌-ȔÚU)Zj'g(%()*M{lA ccW `b-X*;⥛VI,ުJS '2BH^$oa4pޘ)`@~M|Hy'HḾ&< PKz]PKy.F2angular-1.3.9/docs/partials/error/$sce/iwcard.htmlSMo0WJ5@kOcۻ%BQj$+eͼg.D=M!km6cIߞ˻jj~1ݫT30>I!wJFo:LIx(#h0!^ޮvS2TYr2v!gܖ,p̾mqX ng\ݺ!Ka-kSx͙7S.&gRTUͥx_Hs?gS~ck $yB6 P>gpj2ge" R!Gg=R[OڦpoVG=oY 1j8#RȒfף\!S ;:xX20Mizj,-Vdk,e4ELd _flFgiY\ ZӫsRбj'bI}g2k%e_5 2D;w9:0Cbg $hАr]p=PKcFPKy.F2angular-1.3.9/docs/partials/error/$sce/unsafe.htmlS]o0|ϯXڻJ\LO-O"%F׳)ʇw=3RB[uޏt-D}BAHӆ^Y|#xY\ϢƣN&",L$-bz*:~HgWg۷ rF~=:FƢ(VzI[at {3:=HwZU?fN򶉔4ޔBW^;MpoU)deY]Vqkh^'@cU(BƯGCQKRެ9CLW9r_-a y4^v8^@ g QKH&/}WU &N,Ymu?Y[^䵅wmZ̫(X=u8v8X7N,GT~Hc=Wk[̹`r>V)篮sxs9jaZA莚cW{pWE4`F#'h C/ހKri dI;$HFLs$ 3fO5([<Xc[lbzف[>?~mB{ˈp!@/˾̕B*xS<#'ȧ̠;; Ti)p'#ʆ0j ı`,6 Kѳt s()3/y~PKUgPK y.F)angular-1.3.9/docs/partials/error/jqLite/PKy.F-angular-1.3.9/docs/partials/error/jqLite.htmlRMo W\m69ֲTRalH@oSaxfrPVgBԵ 74rc (u$}!_p'uċͷ 0G;K+m1v[wYf^zq˨^p0x͚NLJ4+\pk%UUE+(Ii*H}8.jkjV@ӊ a!!w@\-\`xH?i4<'i¬>+ȻߜHN/~&eJz_ΝSzdty:wHJg؀crHZG&笏(7(poھ~5[5]{g|O w~4~Ys\_$_'ƯK r1_PK PKy.F3angular-1.3.9/docs/partials/error/jqLite/nosel.htmlݎ0CR61[JTiAZi \gulR,<d3aB~X+C0=㺍]=F6ܕ_13at@:g;>=ʀL-E|{6En֟77v7 zi9%:eY@(v%{̀EJSX'{U]K\ުv4uU$yJ}_1Y?̹ týueUwWLr3iFu-׋N갪j5.`Q1h+능OQj*0m~u(r=otHoyJ'u U Ar S=tma RH}&r奡G_2n嵵y+V`$Fº a4Э^[üNݱt -f߂R-hah0ƽ@fP5T%ݲC") 'EUH&F<;Tz}Z`ԃ94I)Cr4gg%#4_ߡ7j9n*{ ώtA.Si[м~{蹎o./!dȴ}}R6껫 4r@5ަ R ICT Rv⚚pQF,)`zJ%&QIxRIL/Z,ӏ6ǣ5ctYp+vsa}"hO;6MS4Ѿcu.CsnCoLTo݁ƒV=]jA-7RhU,d ݕe [{Vv+޺T'wփm 'BQ0J39s!J{{ּFK=˿ʷ O@S>&L8I>>{?f;hfEI -tZZ=l 7Wu #Io()B &!º[nxԔsMm)tzܗ O@C>&p$$#9褏nlJ*0R0fma_H;$eldA}϶O7fZth]3i"zF4,(i|/J$?>W',R*hyWl᜸d^Mۀq+%JPKVPK y.F%angular-1.3.9/docs/partials/error/ng/PKy.F)angular-1.3.9/docs/partials/error/ng.htmlSMs Whusǭ8M3%L;k`A+lW9yzX۷ J;BZծ 3cV?BGn}/C`\ [^,o6K!hvW\!jc!Wwe&y3?h'4NVB)w[M?g,J&.Z]Q?b\tIz GT:"-h3 CՎqY!AP1oibx~ {9ԑ5|bNAJv?o}DDQLӟ:bZ4Pc6(j~{&ED]A'cJDϊ/䭓>0>t.k ;xͺq6Ɯ>v?s k$uLBB?9HiXߵR+d2`ۥyپ)kt6ƒ1wsf cէT?PKAPKy.F.angular-1.3.9/docs/partials/error/ng/areq.htmlmn0 P[Mz)2tdْ&i>ʎ^L;*F:;2ii~;߁a#쫇ZXD[LϤǿ)edqIywo14^HNFQMf! =:o/X& It^υ&x 6LgδxZ *6IeW{-a<& "xpl0JX六,g)7㌤Hpy-FFh*& j*e觨f6=LC7&!Tԑd:pZZge5HQA@%!rk#wYrs*PKpPKy.F1angular-1.3.9/docs/partials/error/ng/badname.htmln ~RlmRJ[aj`@wcU}nP7?% C!MU~d2O6oiSeta>2׳Nj'Gl]OFLIx(o9fw1h:H(3meeJCGl tٕфhFWv!&x]5o\{ΌjAL;8*>܈ϥ=,3e9 tA{>`#|9+r⌤)B<Gc5uM V·Oq `3H8Jk4Z_g,$TN-l#مm}Ň bӀ )! p5ĩQh#g^rQ!#L~ZBV_LW]*%]wdAY%i(cV1 {B+4Ю?CpIuE`Bz%#˃}~PK{I4DPKy.F1angular-1.3.9/docs/partials/error/ng/btstrpd.htmlTMo0WXAmn\'٠E-887qvD#BJ#Eq̛].;紽¸ꂪ[ZE-J:&f(ekgM![X3kI˶>4Ĝߦa^3j0TfEQ,ڨ;iPWqY<uG+9zSb^E׊TY7qΫ2Cl]UZM䄧-h' #͈('ZØF)]gJ bAڰKmn 6h2ȸc 耖uuҎ+ װk(_X+O>R:ˆ\L>ˉ&ARp6W=W%U y  ġXD5F>{;\2!!B)o@:X9@ɈG+O zÉ:B v NzL 6Ţu DZbܦqb}|?CS {Sx.^\Jlt>?B7cEXd̑MeXϧMNT>В!P7R5ϑU!jP(`0o!8şY,@= xؖ9hz{B?!,{+> H8=e2RH2ޑ54m=w5޳ɴ;sw3%iBpq["rDzPK{b/APKy.F-angular-1.3.9/docs/partials/error/ng/cpi.htmlR0+Hphvok]8ppiĶlK@Ğ0%z&b4[0ucL;x~v1Qy0}j^6R8ułһ HUUUS,a ;+W.e>i g)J B!1,SS?*i/HakYnj!ect0F g*]'#)ݒ}MۻcdmPL/5,-Av џHаKю:ۺ/"뷮RbJ:˲${XH j(hw%[އٺ~Z3TJ+eT^ _"^ɎIBH]V-ZKa!n S)YX$?u &h GƶT)!4-jaa.N$(%שoMh06hpb$Ұԫb O3x1%V (F3p\g-bXJ M̱NHd/_y%'&ؖʖ\u[w0FjHEd6 ".ŝt.dPKBHK PKy.F.angular-1.3.9/docs/partials/error/ng/test.htmln0 ~ C 59-U4 S_@iK-i,o?ʉ`-O?)5~mB [2ӡn(A]'%q|o&;BGcQ^&]#{sj_Vۧk<)1\^C3k;Xe 8wu<׼X*ÖRxª׋ }#VEQH~d̐XLAXGka}3/~r9QI7R&+ :S=ԬZ y864/CtR)e晖ب3w| 9_6K} 2)wd ?d#&=u"pe#jx* Zu 9N/\)@NI x.Js%Drp2,q>lExc;x)\6+Km|7]_1Q6瑸\PKyPK y.F*angular-1.3.9/docs/partials/error/ngModel/PKy.F.angular-1.3.9/docs/partials/error/ngModel.htmlRn0+\yZEдh?PZd*IgIɎKK0Ii_m2U~dA} Mx޵/ۈ1wګx!Gq^k* _+Cض cm8&@\>(i+]xu?&cwpAMSOWά=kA26ƒWIQU77b axCNzW I'~֕E &LRaK4IS'Х (hw ' eoIr_̴0#șd}(.?`vׂ/+PRFDŽ/S^jDIgt ~vү12~.`7.[4eH<3~yG{i{5g\}yڬ5pYTPKPKy.F8angular-1.3.9/docs/partials/error/ngModel/constexpr.htmlS_o 8ejJiڧ%iZ[iK=`ba`XU{dԽl,Y~8Sլх!m7M?|@d"ΫjGj+Di"[OLR4!FRiN=9&\~88e^%.{)Ȫf 4a5Sv+Ѥt^u3F>o * upKJ4تWVPYQfȳ27F2qƾXS~LpQ(Ie%rP;0A.4Up "2A`c==?ݽu! OwՄY%;Lё v/, }|8a%nm'LjGH^kF>Ћx߸%0p KkPp!*]\$t_žuS3̦:.qg\M6.E+ݍr+4SԟEۤb:}sn&.$~A<ѝ?7`gNq]>#C7. a FߚtPKm@%PKy.F6angular-1.3.9/docs/partials/error/ngModel/datefmt.html]Rn0 |Wl@m[x >B[,?JbQx<0G!zMVʍB~22{vzΩ(/ס$TٞAGQxN _2p{|ݾ\oFtn cUU{PFxw2@K6=0Z?p~, EeҽivT ݼ.\@pu)#dLJv3hK&7 b}CEH)ss|jpkS3h(4nb唦!c$c:hgSx 7Z-Œi<V<-PK PKy.F8angular-1.3.9/docs/partials/error/ngModel/nonassign.htmlT]o0}ϯ Z o/Qm= ^N&5k*A(Ns=`Z][[e^iIj=t“U~I+G*Jk:Gn]]o5w%{E <9T6\υ4VxAU2cdvBpi (UtJgV~ntUF$)+zYBTt&E-vpV(?6qbVvnB0-H(L ͑"> 5K0K&ɳZ8ӱaGF z-3>s|7_4h7k5Nz $P22#pKʋ?oJ,5`RÚZA<8 5vϤ鸃 _CPT4:J({PM&Cֳ_+$1+׬9|)s%pT U=7ֲ叓O <ɠz-1Vkx %'/N~k*p׫ ${2C|vS΢'Q7EN[ j+Y8/=&|l>7PK ? l7PK y.F,angular-1.3.9/docs/partials/error/ngOptions/PKy.F0angular-1.3.9/docs/partials/error/ngOptions.htmlR˒ +\89H`R٤`,X@v Ze9LwσK0ۍ9όu6S(du^۷yM |<6tĔd[U1~![ҧÝƤm̫?Qĝ2Ml@2Cg ٕSh2^7)n`f.VkS™/#dc<{řUUqs/fiы|ڞoУAJT?1"H: 6e{jL`IjE eC6-j(1|$ŝeo5|H@1Ǘ!f:KQ7jgD AI|Z,iHv {Tdځtv9Ju[dfɲ=N c(OM PK@PKy.F5angular-1.3.9/docs/partials/error/ngOptions/iexp.htmlTAn0  TfP S/ 4J$KҮ zaAgYK5ǕPǸ.4nw6)$2A39aNX%] {59˟}tⅆa4q$2-C"2Ot8Z{dJ{:Ip!b%_PK RpPKy.F8angular-1.3.9/docs/partials/error/ngOptions/trkslct.htmlV]o6|ׯXMrA ԑU;4@{hފ$bC*I1(%bHW5Vn[eVf(ʴ趃vLgUզrYe:/;Ikͺ+ӹ{+v[}JV7l1=lݛR5 4J y vCj_v4:-8J_*nF_轩LIesYQ(VEzMxGWC$m%x 7t礖'Ht5y+{*w'o48Ng33@cJU.kv6^Z׳|}xj:Kl76" N/~taE\P Gݚzd[bJ[*fb +[toZZ&V{dWݖDs=PILSUuCd Op=Xx%%B䕩eqhLR!#A԰/RH:I~gN^v$ЬբŤ2:h$UQd6T*?:b 3keE)uh?r)LգKźVgUrN!j)[,~97nuS>wG8 ve:B0ghGɱPhމ=.}MlK(vPQ!ipHQ@,ɛܛRhQJ8P%tM,GHֆaVP HNVW ci-hp9_S[!<tI|1 鳖ގ "^INBG>UuCFS56mi_ĕFZHŧR0}20qb+31uAc|Y}ic"(T( sEy}Y^Л/ FAB݄c<! & dk pz:%0v>dr$cU=:اq|ľj9갺Z4:AuG/$P8~_Dy%lՃƶ:ጋ᰸PKsf PK y.F,angular-1.3.9/docs/partials/error/ngPattern/PKy.F0angular-1.3.9/docs/partials/error/ngPattern.html]RN0+VJᐸFH!!--8mZ8XOֳ3jbtថVGkjavq_ԑ>-[\I+-zodb#zs7Y>M3Ax`GK30u=VSuꅠ?zqʨ>ՕmwtJ k`DUd7 -JX[A gEQP5g5J-qR҃M5%+^#tBt`73&F:O< Y&VG-Ф777^lѽ*P{LITuys39deIpX-\(높=>1 $§H I׋v_ PKxEokPKy.F9angular-1.3.9/docs/partials/error/ngPattern/noregexp.htmlSMo0 Wtb5ɩa@S`am`K$ Qr #Hs c PI7oϰVb_Ym**9n~i϶ l}v{1WoCrD^hZEQǵ3#nb(:KwY qy]l,M䞋;]zęߧXZTIeo9@"zifVJ=jkq:[d@JVFsႳqF)G:=p3^iʸM>eN^p`D1C9x[{j[qF"ē$ىRItN5̧%c.NV&TFɁeMV}g7w䛩~ }. -5UU]11uߒ|k:a(ZF'_u$lPKnPKy.F8angular-1.3.9/docs/partials/error/ngRepeat/badident.htmlU8bH-V KGn>(V+K$g7~#9P@pdyz3)8 %c m+1^q7>Ϟm_ 2: 3Zm纡;7GR1'/ ϝ=` ~ufY7Nve!qFl+LH}^ꍷrޘ`fE|YB"i !e-#V(/+) ,k:*Z]x,X<<+'7&̌o~&s/@42z`a !kG BmQq JIMa(N*ן6eږ﫪w[@L5yUOQsn%VAnq2mrLlE<铋V܋}ABK;M`-D}8$9"QPe5F_:=uC#ZZJ@j. pMnA̟RGdB̵8t_tqzA^JvWj^0z{!lZ`M$?TvqԲ鲾}jѤthN^G:)oYNsv=ti(c_~^lSgֆNSa$ڥ >ڛh/RtKUUpR7d28m6Ŝt/{Cl>ߢ ac@Ux__0F={Lژ&? CԖ/7(s~l4FVOgPKW\MPKy.F5angular-1.3.9/docs/partials/error/ngRepeat/dupes.htmlTM6W :R+H E$==PXb# I-}C}$p͛)jO&Ӵ֡]L=-ɟ>J>y\ʖ>- lBYBZ =ԈcU'nob󛗯o/*u_٠6'IUޟv}$"yӝr.۱o4PR4hORo66Q# QV<2 Fե LH<,e}5*2+*Tzr +%3 lElo]Uҁ;?TY mҶ@f*&Ѣ). Rxکe:[GǻPN]h(=TP&KIo|#뵮~r|U]`X<$:W N5FѮw6@Yqd߶Amd(cm䀈G!dUm+ʝb+zMdRC_F@فHh^f.3 {(e uhT"_VӅ蹽൩ӦnE-2,D% 6hdjGPμ(\>F!lf4gJ 쿚zglPKn$Rj PKy.F4angular-1.3.9/docs/partials/error/ngRepeat/iexp.htmlTn0SZ)ͩ*UR)jsYpe͢ޱY6{ȥ"!=33p uކ`%c PI7?_a۾/.MYet@:gw(Sn(ccvߝ\ܜkS%r4G2ECIs[g9 :KT/ݘ qYӍU eS]z{řS.pk*ΤX,}/KH$/#VpoɴJ\T w;H2%8_,86]fM6.km'Rbb JƸ دֺ2]G ֪^?P }'/2rF$ޤ|\TRi +:YTth_jp[T$4MDToLZEF.217a,雋WZٜ؋h5gq}z c kHtxJѧӣ^|pR xu~ TIʮSA0)4_~LN-4bL'ȍb ےU͘7j_+?[HSk+ف A 23K))]Z-=m?l\JoJOsfdP8e!F4)*pMM'1XPK<YPKy.F6angular-1.3.9/docs/partials/error/ngRepeat/iidexp.htmlTQk0~ϯ8<'XmD>W[-i5$t ƒu>Kho&W*4(MǤVӷV*U,XeJJ9㘮?ER>BCea/CbbqY/! w)EQPM:1 삎:IwWǸnQ ΣyyL!Fy6%gRF#\Hd j9 '8!wz/[U]E"{%8;FQJJ&@OH;̜Pr^)o[ydV9( qnKӶXe4m;BFAqO @-q :]6򟗿"g$t!:YF^$ڂi+>e)>\tE468Ĩ,Dv͋'F dWN8SDKghT0&iJBFxBf(P=r)'ƨ5Q^(ddt-qgɤ/ >ۜ c&/|S;%y!o>0ҥR̺n>X.V[1wIhOI廿UBѹ j# Fm$nf {5uF.HvTOMxy 8H5ᝂTFeQ Sԑ5C8U=̎g/ߜ|zv_^[Si4cU=Y ?Æ7jo^yF\m*+S*0r{>Ziz`gxgf(, D-斋`%eObӹ@1ۿiX񘰢.eI)3~6v!"pdE#btJVDEdn&]4h+D!L/of:^ڪ Yoi6y #]џuq,s,0ft-k{ڤJ["A|#X{YD;he {8/4(GF:F `sl>uJJ 3zi7Yh⠎JO AoVe)@ D78HD{%Tbq(dMy ʥML:U*gU[Eޙ!|ɱ5%㉁̼Ηk9 wO{5j>$?D_ֈ#n.e;`2Jqo0 ([Jn +d) C\@VTzMA LzSM F@.?,\&JJowRJu1@(m= u< 5H *žtATK=HgmS"0ᨛ1V aAhƑۮ4X:p <,Gs$ uu:!c*Jhmes0!]R:(qX隧֛ XTT"崋)شy1qJTv}:TiOSk{_kq@Is9 =.~xq@蕈Q&{AwXO&uE"6S) q,8u:ν%5KjN;u5"8Ln|We~NB߿(H_tu;,`2 ߃A8?>ۭLqQlY׈ s(7t6L3*nh&rݔJc6w2 F&6$>HM1gH.;;(*76DL<Ѫ[pOTȧqk'<@G&hqH<P"/P\= tNi 2QH|/)NҩSd> #;2%\15%$BULT2SEvR:fdrJnB7}.by6֠xD='v-SaǴ3PƏV5xkւ)4;xGM‹ӍfGEy5O?{Y?uܠVW)P N/â`FBp%fŅyIFHS[ W8;hqmT7#гnJ&΅򚩄6DR*[U7sxFQv` =g,anuw38 6~ST &oEJD*~"php&uˌXb Ah䎀 ?j!梨\lԒbANiViOQqq AtbX좍}@asCEw+حͰ)gߪ^ɾYw^{D&+%-qWww[ɧkHM61bZ)j<*(Eѧ`݇ho\J]l_^u2AIç֊^I7QōJ HlFA=a]o]]![REG٠}{uY_EF}CuL[X'a9ϋޗn.%Ÿšk8}/\9UW+?Z=GuTțbYc͎i1e3YzAUw!jRJlT"] j ѕC7 `¦K?A* Osyr\v5¤Pcgy V2GtL'm:k_5@֓QpNHwpt+YWuϟ5 Hˤ79T׉~H!~,G(Ng<4{ t?C4ړeQ;f]Y`xZs~I #bvސ#:LpS,L֍9u{p;m誝 J{L1q6װK#[ߟ}P<$4A$s*Hs0K#%D%fmyl_6r1:JIcp0X$&Uf_f`Օ&& \j)zrB$&<ۈN/j@f'T %t\P# ەwKɣ;h}%5;(S@nݐ۬5p6ޚ)TM!Y`i^MJݜ|s#캶i!b7]>-JD1++<߶&4Im#M]G 9D79{%^VR8&ϥF`4e9yRXd'>g ar9UV ,se)" wvwQkb4TPv`WE̢Tz|p;6%8}-cb?[v:]%s޴"~zhɽX$(W@#f-;T~ шkpXNhHyI z<~4|Ajrmw_v) !wnP A#6+Ldc8]28C&8Q]X}uիws>JL4voqg-1.K[J%.P5'4B^fLEpIb`0x~;u/ag,Ć7E)Zߴ P8l!87zFn|9zȧu+obC4[P$Gz##>YOS*pASgj;p=Mdcw jB`!+LPQؔ Mm_hs *[~~^|o"c=5։t/nr4ky%[#mx.Ũdd 6)GO"WND foo|Gvf6M(VJH0@ I2nr`]xL2H%?m+,D58Z:fpr}7tr۠3]2;z<fNã`[ cC($9 64vq2]*XFA,$EʔK ᰿߶+lҽ܂x3*8$9/7o޿KGo,k* đ*H6zJe5 ]ۿ7YmAn A3taܥ@^ ɹ:>(8!dIDzjޞh(r`ٺ-i>/qj(.?hṷ$A]n^,bnsW+y؎.n|: 򹦷 h!܆cWV8Gyb"]GqPfEDԡVdO7WN#x=7L-Kzc0YͶ_+}2qD>+ʆ4K"TEݚ1*cN |c ?`o%@Qc%A}ʳ)n٩@PXg+Ϻy/nXFOP(^×sJF+W,=-69FeJ*9P"xE~_',>Onnp~ OVf~a0-)>#1-lJIo.#tw> y*"tfk]˰:=t&%n nZë6sbփZn>kVL!6K6kGltQBcdMur rLQb"vXPG3 0q/Uk#4J5hݟpf!mǂ{+zia]eܩJm1<"S, t/CHcoK*A0%b&mY'M=ñyF#GE8K#qtM?M%^QLq xq¢ b m:1&ı~װE"x˽ =p?hPK3 >PKy.F0angular-1.3.9/docs/partials/guide/$location.html}ksǕw6`-v+T^{{myoR0$F1@#KO !E^'oӗ~N>¢N>Y4ͺ?b3ʋI:,?I>/Oǟ_M嬞U瓻r5EE^y~¦CiϾ.V!6=~ٽy^ϪbU1[`x<$̖Y]|R\e>bwaڬh]YuqaΗWEmę~ǓEQ(gǓt0/> r5'G?G/'OOg<y~t PbuVxA&+:K|^PaUa8|0cۙߙy2__-l\V|5,Vr?8~9q![E"S2+tpB^/ lPW>lZ(V`2lG}ox9\ŽM<|;W7k*`-v2da?fl!p.DUw(2`"]FO3աZXPW0͛<_|y&cq w>LrV|L ob3 L'x8=f/BY̪yn, b/eqQ7eu^v&ϼ5؈7| 6VNCV:oBy.fQ0 iY< nºo,yVEL" l6jʑZnkiLπ$P〿.lnqS_us5*FK0IN5*wS>n?ρNכ0[4[.Kpl>7psv0w;حMD}~nD_6e.K0Ĺ @0ۦ& ɅyQWᢜgE>ըnR+`#.=f+y CXjp!@槫r b'dr Y.ɦj-.GC2rJٺ'R*5ܽ$;8OJ9K!^,o~muWPΰJaQOag+g>d`n9y .YWM8ʋp c!\6Ų},YavKzt7̇DobdT/r>*F%)#e> O(hv0>MlGXn_<CǗ,)ljq&2Fkm;KvБZB\[m:~5OA>˸,m@PU:XaMq>ϸJiʫR5"jo P'9;A‘COTMŪr{C4dti<?aDx*$ʫrA<˩G-<_9~o Knj0)n#?P.@1ϲ Wo $ '~xlDpg Ѽ6O]Arvhn `N\oFWۅia/,l"!!Q\ !]w4mS&lQQ:֑ց`0kU00Fڛ)T90O?.xeɪ<GjX=h.{ snC^p?2V?+i&Dl@Ӈ#hyP:@tQMu I*[>_B6#٧*آ 3x 46 $c_z17L}*<] lebf%Ԣ?dr]^b?F-9n(q8a@#o'zRKXHYqj"M©jS^ujr%De0?V~jg hgAg& wzȫ׌1#ݠL祜z S hmΖ\_ m=~0*d`ʻ1bAyG6 ȸ_ t~# u2~AY8c }v~xIىU^f09] B7z } 3=ZӮ~59[׀MD"W@ $#LU" xha7hPrAR=[fazeChaM:И8p@/{>lVpkLŶdJn`Fe4%J 6|YaNH|e9l/}:S;x\aj8t'jbCsٺ; vʗ%@ľ0 W$)f9{̦UKD$:!H tۘ }?M RrI`?1.?xj)5GmUEs1#80ae#5ZׇxW] E`ڨHxtg٬X‰&jQԍ=p[AmpIE֘>(DQ5;9peSKO5@䫇i+qXuE%@I+!:zo`s)E[_`CEN"=1MmbK@Pf'h0T\JUh1ӏKiH07@HT% ռ^؈W>&ݦ[GØ#sa#c4G7 0t5 rx9yNհ!BMwT٪m/M maMWGԾCOTH*&HTTy @5D)%Y&Ub)Ge2QM R5Q`eQԎ{ݦ*n0j㥽lW6hdA7AB3 Gn~mOEss5į0JtUȽAOU#8nVzv)Б̔EfwVS@Poc cSN5y"P_)sP}Pԕ$(:'1_q7jWjSK:EcD/[K&8G.E;ή: }s0X~Bgj[|ma/ok|)Qۋ𽣮F&~5E vMtrqt V}gr*$W"ENGw97Iw@+@j(w$BrکӲ* ʹ^0Ls]) &`^9&ĦӁ9Dvo6RY*xnV, x4~`viS=˜S<^3= ̞̂5{: 0B>0y ̐.?[+oMQ1,ik9 <@b㰘l^qj[.`G*O˭ʛLhܒ&KfoiK)Sc+]8+2C^#aE z rEEL v>"3wN;z'Y+rLdJ:=NѲh@b(h!x*1S`@’#-!aߎɐqֹ0M g`U6[-t`)F<S"CL XkaN#(!C+8D]9W9&Ugz|<=ae5}c'+v 7i1w:DL r x586$➈ ?@(r\ǢXiYI,[I7xH~a;$ B-Syl^QdZwǾ[nV/'>}iO|rx1ĭv䕯GėiX5D.CU9ɋAϓ}}`o @] 8{'nv H+pלFT][+||a@G_إh~Js4gWfy|cu"Z;{B't%*z}t !9bk8)Vol5u2O|#Hx|; B%aA h۞Hw,޾3RwЖ{A:j71Wd˘dScm>ț'> >ΝQI?df$h& uQLKelCΦ <9p8)><,E1;CXq7<%t7P<\sSZ>.Ί'J=ǟ @jϔ?VP.ab;wKcKTjNMQMֆ:WH;ZϢ0(~~FZCh&;jʩE]-٢Kɂ{m7Z%l`̸ rwVH>F ; kcr(Gp\4yVogޝ,zC AB~~J]WILTDk]3CIU~IqN:°aIណ[xGð~!&+~h`ԇeJB>hw_&.n)|QW6}aXVGVa/ «}nW x-˨88Ï a^'3ηpr5BD9L^38ߋ4ɥR@Vrdepn{T B Ϻ6[ėʒ2#UJҺ/|KPp~{ -Hq`]Ky%WYYxDnNXQ'E4x;RYo1liPND^ qKv8O/P}iD7]ېLbV vnnZ$rXA/f,pGQOBJ99ݫǠmյQom^m8w]iƋpy?ܧ;*Z JX,17d-0ò-Δx=auZ6d%J2ibEeC5&@;nca,b9.zz> _1\a,|mɤ.xoܽ rRHE=K>J> é(("U}Dȩ&^[E~d2x\:X\`^֯WAr`Xf96#nU:7^Q=P佨Y!`hK|Rd"= himt'(/ #w /PUثDs\c(#ldaאvV G>C [tOzGV O!wHdeoTВ@K72&y4R~@LuEyyBPӭ9ٯRuXwGh^K VfEe2Z>FI7'O>OqOy) `KQW֧ň,*|4b4|eP5N@p:V!M>[ Lշ,wwf|:ɞgdh)P$IOsG%VIePRbDHNPR>&JH|3"1vkr*EGJg{@\e!q.pO,5Y8YjQeݱ6w"ԅ[."0e4_8\AkF\{O"&z=ƭ0Q6LܶC%LS,ƊeA7> ?9՞!?7⡶bR\\ZzO ܦg:t] .H8f%%r$CF+LpPR(yIxgJj1A7;筩/i'Z;ȜMTNvn() \FQ~@HE:j1nA5 -v/3j)[E'N; ,}!r)jJQ*%l(G*KTolW=GG> "8M)Px S̪$5RYSC5y#cuYQXqWc[vOc/YCuS zSm0`]xq;Ƶ9PC\Ϊ3*S;=3x]`tuoTTCswl&!9^3eAm{"x־{ 5'mAt [V)"t#RL0D!-vV{- ~[={O`r1;~ ls3x~۹߳؟CJN{"]Kz\:E=ӛ3eиZw0gduhzc+tÿ3 ;Tmi}zI^?{sf8B\)F2u%0G+bZ42yϠ([BzU%6"AH/F{m oz!5L,+gH_͚NqJoWzHE,طq@}!fKC@tf{6s)_NJ'Džb+zXhc3bq4K7׋5gOV։|D`?vX7qsa&fZ^fQ-o|s %Ԡ ('}NS ~ǣ2n03/,V_+}ePKi'PKy.F4angular-1.3.9/docs/partials/guide/accessibility.html\nW_Oqql 4fdZV:6I&'hdXuIU"6`$}.HLf -|\GjSɣMӔ|NM b;uE:I~x'E\"otmyǺe.x-Dk}O>??O$tqW,AaHYT'mYWzԲoVV6vǩ}nv&4'.s3j6i:UT 1ҕQ*t9eulD*`0A+we59rY8MUȚw6~4Ɔ욯,S.pQ.-xL複jC}UE1-]^J%[msD_鬀<<3!Ezeަ#P9udp91L:xp?Kۈ~87`ml&"P DO&Uu#.Vx\/CȲͲY71FW)#ܺ\B`NeLEn6'.=db>v,8-%DЎ]8^s7[ĖՑ* q!QY;2+Kb3/$R'pg% 2[-筙mNL~4!&Sjs@1|w2e;ʦB,cWc<`ĹIӸE]]vIKP| 2#lRK&>c ^fkإfṖ@> %0iۆЯhWNU7;Etb5Ykf,!D:g(.f-{"4 b5U ݸj, m\~8*)ޫ?_ XGABg$r",7TVBR=([orkn@ .Fgbcqh}FqG;}Kuj@[Ӏ8gŠ\բaRZČD4J(I^NrmTX8 6FRd/5P^KZ>b Z9x~D4/i(T.j:XCsūqB-#R7)&f%ޓouJvT HX#cEP2~E ve:+tvqavVb@YQraS}D{' Ye#T/н[u0EK'O!C(P}%r܅Xa1vie SeIı6q$ܲXcOX\p!X5U%q7, T?'J^ G0~@mKXv󡩢fFlO'(]C^5{NzpsrĆiجT[m,Aޅ hQ 6n@XF5( >mFSCK" ċ8T>Nd#%Du:&͔*?l'Iz;(1VB8 #Y!c\;+446$T/ 7#2vL|Z9<:a$bap| $:i)hNDbi 9QgW֋ x@i%;MtUmt ̄ZEˢE c)# [BDkB!ʀZnsRzW\Ⱥ V7*c#ᯝI}V le.0`:L?P+=,] 3 l1 (C<8-^ $Q(mieJX7iuNhKe{.ѢF9h$I*MdݍIc= , ]'b/ΐZpmвaD h"L~ =i%ӚF+56[lφ֠ #Vͦ3# nGOsP>>@^UT!\}վZL x$؁,K]Cnf0fd)s0pr"A%> %LSЪŠnRM7ϓ3E }1_HbJUmA.*T*yTJ.zl&%( U@mzK* Q 1l?`x l*])F0*T/]j]2Fw"+6Sh5!I6Ί%N/ڪڪ\?Ӎ*#&:ΪߤJL) "`ls(g{N!yL ڶ}РAq-y%54gٙߪK7N쎶~( RJGg~f+SOMGVuKںl~e΢1 ΁QUu:8#3m9;bR&Pq< ,yuSO>qjۋ WN߹uNZ[Ȏ$1a+S韏u[G`*]ír ۿhcyL ZX )'xe 39{'BK,Y,=3OZY41J1}@3W8CлTҏ$Hs3QIYlA 9I?Ņ=kbJ`SMiC#uGx[HIJD@v 2xV(_[43vp2Ѣ=@H ʝt08g"9T.1y",t篷`6*O) ,]}ẽEII'o0srR/0e?|,7/){ɖ;?AJl\ŖKJmҥwәBp_ЯpH@+#Ur5GR3!J2 M!K@k%-*ucƲPAsWA,qTZQr $m-W X/RCіCJ^DWхd^ >=cҀAAPbZX-Y<օ&fr,]B ORe ,a褀P {z`$(14{^ m(G`p>lu.qn?)"g>:I}^_8O^>_xzYa/R/ 0?0P -gXO˿"`;O~#';߱Yv'* EGp6}y5Uyy_fol/U c]~NtJ(Gdx*zc Ev2-8e:4/W& %Cb[RBc<}}Y R ޫ"A?PK7FPKy.F1angular-1.3.9/docs/partials/guide/animations.htmlZołil)iQ(`y$׺Wn$1~3:R'i!1ɽy|3'R;<}5GJuM5/e>oL.O׳,ojj;[P+iuSiTR4w|qO_|P&B;|kWKic]]s2ZI,lMgmzDyUil-#G´'3=?sk F|'39F'Cqxx=磓C,o +l݈X7ͅ˦bN ݩK2}҈)Լ^Z% 䈟8|~mò.⣟JReI+潱M55[T?9W]\Mū2SbE[\ JuiEzdJT"R\N7=&.֪uT1WVU% JH\dm4)Ԅ6NVJcKy,˅/S .O^͈7XC 58iZ Rƻ DRТlY:|Y6WA*+il/Da38~,5O~~ UA.R6ӓY3#+ ]ΥK\Ҭ eg WAI@М)z$'^UCV,dۖ:gwh r0KqJZVH;Hdjb`K 8d_=GAB_GBHQ\(e__t{=y86G?>BΦ2GV]_Vs:X <R]_c~QV^f4w0t}!Ǝ+sV$ӱzo-untu:uk[aRG #ND)sJ{LrZG=*P)FOWQ]= h/"ɩrT2,iJqgkGqH6ڋ6o`ا r2U C@57Ȼf]8c"ZUnC؉W#.P_K4Зg-h[R|Dp>Ft=pS^`wH%v*S8#Q{TkGP@aLlM!8`I"2nn oSsj="C]߾?܌^`ݻAJ`I&FA@ xtO ~Ԑ3HɊ1fX',jԳrB:0'NpyH4 `s{dIB#TbREu҈\ÁQa6h EJ&7y0xM:mDcU5]SwLHR9G7!CZʂHD7ꚃ*)`V+^ A8cWC%+T_]> (h䎃 y͐ööԨz~KpBo괫L ʻ[R&Ga4QjDq$jMgN1Dg<t # bt١$v eqCocȝnYl!<~{A; e#naJ%T* @]#""[aLj-@V9jjJɝf{'p7U!y('3EyK:;mCkF{apWW ³8Jsʽ@?Li݀#qOCn{~Oj?ġ񴎩Aԟ,T3lP4;lĊ2tL/hcaȿڷ%ƑDI+IVE6f#5sSz0p)0CHoW i 0~y BsV!c~Kj9j|!XJM!Cbf)N3fy:zE R"ZxrkĘ)a !:J_. Z=) e'6tIF&xGdeAPWUL޷J`1TR#nQ`|\"\5O Ğd0y&^dPە~hb +Pj:<70 9/tS޻,|:QmlPZ6/01B6~W$SNWW*D6o5-B~bngǦc勫a ]셫╺\7wr<܎z}o=IܨFR< ~ et Ylp':W4~}_?;֖i~ mU{ӰE8qD<0~źW)a%neq詪n˻] iAXE&< <O>BSٻj~KS ~`4E2[%7 6ծ҇2W]fɅ4_؆Uh,TmQ:J4kxJ%+ζ=e9B";TL O^I򷯨 POw6o  {pM%top3Jv!BYܣhO 2V ^K,Yg?_+Q'3vCnK@\tƯa_dX1"ϏO$RO^(0[ܗɹrQ:/c1ޏH!QC]YEizNE^ڡGrWv(yuO"gˏmvhOKſ bsxKÍUnFM򩶬y5.d(`AP#&#;Q{oE7m֌sϽK:gNIӍVQik2a֍UAt)-=%w>}tv[A/>n8Wժ RM Oݠ7r_uZ7[k%ʧ)!v0VHW aLPbCE<}}$Lf"0r0id.Էद߾ X=MK(M{?8#zgQK5+5tzfYX<9[1{}y[\Wȗot#8D~2FՌsrЫ"f}m'WHb d.{H14jԍ}&.A 9G"D ͈J `@#DhbHI@-VV\DS'iq:Y{&6;(]D#d|QĹ "v@q,>P\_/@qD1hPKj;#YZ!݄isƗ(CkzńCgӦm.~J] #df`X 2Go ꭊS=Q#lQE[|.GyWt ;77t UK/;Z!MT(7Za@A) =b`.8LhU#ڨ-UbqmpjѬFA3b:I F\J(^rMs ߨsߝ,/"z`og!ΚI3ӂ.c/)}z5$̀S lcݠTPwr/u҇"fOnǧ:vf{ޚڰ#Cleռ{hbv_@!:YD w;-:I+T9 sHmkekv=5^\rT 3xehD(y5 Vb#VtRq~eODB%ZN8- SU/(G6H bo٧,k}P"rC[Q1`AdثϏ*u5f+ bu#xB#.B`(nIB8HH?Wr0 x3C<^zbC'IF^%|r=CFCN`p2/QMx1$zJ).'O=zcJ2 HF[<8: 4'DArUiCm=W jwCiz'i}i噂JRW0=1(P?)|ӥD;=}b}#!$;>bUU4=jtmO}t٦bw eކ__flYWf(V횢7+e/߹7/_}˕mZXnqNOݲ̻ikO[?ibO煭;ڔͶ].6!G'բkgmѹ|ϳ,;>whI|<;_WwrUQmۺGy_Ɠέ/Ʒ.o=6n}u|WE޺kHȽR{ȻbMځyO>{gxס6Ap9q޵7 n;7C_E^ΎWrŭ맶zW=(vK{Iέ W{Փh|CqrRxĕu} '宝SI}CGкE%WmͶwM/4;A*"sV{U$rlEM16-sSӗ>ļ,k &{/8[X;VډuUL<.>3/6*V>nq_zȸw`[CBUAr0[- RLi`[S# ; nT-cN>,@FD ,ˡ<`Sòw(\K1{YaX ԀMjKΞDe 3-7uU@jWuyWvVÅ21\DUt'}4?|/э׊.K,4prkxGu YsUi*b$D LuYRް+"V JL뻡Ņ3.K ^Tr KEQ']D$ ] "ςOafu!^S)ʍ]:L8t7n-¤ 5SwlA `*v?3S3OK:zHxL#.AȈr꭫ͤ=Kұ,k5j3*p;r'RݷH&Q̋(gU1gy8˷jcO >dr*GLavXW-iDmH`IxOD'7Ȏ۠@_ Un[%Rl6 dD%)Deйj+ @Z+1TS$"IEhiD'Cr8n!di]*,|F(Α$Bb!6W(@YLn ^մN1ezT$Q%*Ux ?<]',PcYX (ÓM53.Y|B<]fO>cO¸mɨ *n&9?ޔגt|#T37~J3*JTAu bwb4⢚|=d13&>&Df.#FK=dUo6SZi!;PdL)b,癣߃GՏP]Or엉gGA 4CYNC!߇#_2s}Kg-)ۡȘ@Ƒ<\ۋ _0Y!: .4=oȟ/KFͦP)|'TQJ}W7q7#rNWU骨`ӽ[-{I W J B>#7u99]Enҧ*g@~&^Jc^|tH5ױ+ qN톱-뽴15 =X3o\. 5Z.C'%Wa5\wF]<ozLd  aI'C^>̀8@@, UL p,DJ@"S0yI b5hT v7Ls Xh|_g1Wy.[;fUv$ \P2P iH8[}~2>M*h]QUL(R5(~t^@.~/?巿 ,ӆ ^^yP')}rGH5GcPL_YᲭЬw! R D 2@8 !졐V7 KX<> /K[@0GP  D<4`NR SH$i# |XQ!Jo |5(T.K'E@* ]A 15 |FD=d)<º܉"@XZp -6q)RܭQ3G!bq!7sT[f~$"w]kX. S0-HTYnaY}I6yb'-(}elh]ƒ?F6HT 2aRJ0"8>x\qHveQ8 dChv_F,"\!@,hh;Ee'mtHe%izy Ћ )R?j( 43|/EX])[0S3 6/\P%(]ftI,-s7PUMWAM388 +Dh,3*nzt N@hԇ`tԀਉT!E1HG'8%M5mԘ },AmDLy81^Ca93q+J4F, 981("ĂCڳCkw7[b ~BW ?y6/PZ [A#Z#/P Jۉal}њDaք5k|L&Cu򆖭Nvx ܁>nFSa-o6zc!e)5jDAKNG| ?4@UB(! l=N!/] ps4[P/Open1%, @p9an%v\y&d 1kQAo汴$7 d0Y`5=BSg_Z2!#}ۈ\9=6>AeJh.6HLVنe)d*R:Ya5 Uѹ/9?GˬAA53tK$' A/;5I\-njI@%_5MieXI (\PrĪ4^ vIX0ag,UL3AkM5_ WQFH 5p`nxBD`k]A,޳Tv%'i > ZL9&!ϒ^/ O64o*xyNwxy*7mNe.o*y=:uصm|Y }<±m=Q۾- CK >%tm;GPqa47I; ۗJ-NT1(#3PID-dtA@ NBZܜ9e;!:8nYAp ę51bb »Z{Iq,eiu8B!90z{ Wk ֧3Rb 'xUFPb#R8>(~'6۩:ldY܏a 7ZU ;F5Y,ईN-g103$ain%tsH ^MN3j朼 [`-Q@':Kz6% ^zɁŦ;™>6ลyql4Kݜ O1T&tr {A] #y@62IKQIփ-NX(H /QàxI}f,?c2b C ]d#L+3 t f!GCmFr/0U!qupFBI.Dڳ|KoE+L(U%@9uU&rBMZ5F@FW_ɻg`3y_ 꿷]xNiHJnxZݖ,즨6L!HtqGJB sG:{vBdDj_P-:p .0ZbyЀ`&Nrm|a$šbPi=Jeߩ#3qY&F[t74LLr:ŗB̬aTMOF`OM}{}~I&m5cy\~%PKnKPKy.F/angular-1.3.9/docs/partials/guide/concepts.html\sFb]ZYbJ튲˥RH@$"P2~u Dٻ\ykc`aEr~pZU`0t9 &YT_Ar7q9Yd`LWdQl_͓&[nI?==6h^\&e\miO{_I9.Q|Yx ~ЍgQY=L"LzҍE:ajj1MA z$;|ţA:<վ\5MK8a94>d@h# ap1E:8=?i@p<[R0Z"|B8mE+{NdǨ'}q0uTdYR $xYqG^AeFrtOwe3;腭q{ cfwՕCCWu2>l R?KuBivʹGj&᳤zTQfeY m =vIXDWrؚ4Ɇٙ/gU6 ]\*`ˤtsÎs6Io<>U w:YZ=x̫Go# ўy0=bGOMxc w-w@W l9%v43B; O,MMFQm-:NRxxƍuPsн?Cb4]!>-6&Ymmt^@Xo<hy&*QC mZ83EB\xYxW|9Q(>Tya:yP;ХςoWn??v[Brvqxp1"f$v XaRgy~Ӌet(g/sUhՇ)A87wԡ&]d۲BD\-#T=9n1ZMo/t9:#K $IA=3(i߂mRL03,B TƓyal/7l0rQ[&oi X/"_$+~CN>mXlR2X@UIz&v5QUO[ Dn0W iHX9ik?Կm6S~TysIf=tAJ%@ÂpӉ/fk)O !ſOeb' \1-`@!XƳd6kDOiz`,@^ 7= 냰z, |R<4BHCJ3 穩MH誙$t8sMM- V%]){[?l8 ĽEzD7Ml߇( )1XBQ `|ZW/5L(ݮװ)9' ޵T5!`, MZrSgOd;ljLW=Q 9+%YRpaK)?$bo#sL'PF'L*?N̆!{fS^|gaw$ &~rf7-@>xEC_)@%j{bSSB0E暬NBjőU5 ߀k!#i_5Q_]#]TItWϱ<1Nݵ֏Au &}ˠ9N{^oK0t(]|Tl5A_M7` pIQ[K!CতGaƮ0нߎVٽO?"kuP3+,D60Ss3Y4.HgH3\ [sa8# U4@4uGRYV%yX 8ZqQKk#qXC;(+BT8QhQZ\ܤ|λK!PE$81~,CT8 Ryy\4SY n+_1!@BI0b/Sx,qk#+4M' 457|aVj~;P8߈" o T. c ֈ; SKGĽ^|v}7oC|`>šU)Akku02gBQ?jGXBfHcH̆5RܐMPN4,/9&8,g$PeZ ;0태`+G!nd+K~- 8~|=J9tPMVT9gAhXq 3U? BiCrQ1RskГ8phBY &$N[^unдDSȎ%DޔT28 k! |΂mn1?8HAoۇymY"kE/O_֘~>l5R\4F]ɱA|g+:e?/&xOzEeJNMѷ_<ٳO.kȲ у1nZ4JtNjt gF 뷄BI^q]xM"3// /x;GNd#b Tn˥%[aP\B8i o6 8'xŮqXmy%gL I?A&<6&Ɓ7QB'vD>e4Ֆt{fGq7Z=m~~-&3[ֽu8i#2+9+YQJ?gE?gEDy(;@j1,NpX=3skza߇S $`O|Jr}u!7!j὞H|!aEyG|Aa]0!a1(=g<'x7X$IB5U CAX; gl\e_-M)/gfnג1):?B9d-kt-{"+{TH]'ɕk{B4OrĞ[8z{QUQ !䇿r';}p 5k[ca`^V z:nX+L(/ag{qV'+ӉȘ[*zPkcs(5/$L]$lquwWdU9 oqQ*2d͊i^D@ł{F[aV Hrw7݇yV E$V886VX2zهl8} l^z# 83M3uäT jL) Jd$ V߃Cb?.\>)Ey pg]FӇ{]Qޞrw:MٞlO}>nnJ{,ai-**#7bM1>'*F)×SpXՕ6 "lt]ss fN"{i| ҕ ֕˵_ gpOdgވ}r*wg*> * 6,6뙭ﵟ(q.d"Plqd i7uaܖ^~G`D2&"J\ͬ*a9aA ҙ_{u(47(c33]hDޱ},CuGx|lqjz 5!{fm.S[X|۸!9M"7iA? +zT۬1 \"xX@)mpД蚲 8U=qI-n3 R}" Ȗ`Cx9ȤA|G[^Pi,lF=E%p]ɷ c Pq]IGei5_"% -Sؼl{K~vab(`\'2N@ٚLjP{3\; yi/` 2XGKRY\\썠=Akwgrb(dm,DݦQTf.'e n:A͋fgl#N}Q֛?l\K5Ёzk0~<VdС) Szӟ~)ry͟é̦^{On(5(ܷs\Ň%_teSjzy*%țҀY.65,6+03͹qbrj-ѕ2WK(]BQYDX1%m}׏Nx|Tg6iPVǏ͑&ak)cۚ:自7EA6ߋ1TI:*Mx>'=H'w 3Zd{χХ}?^Njeía|Vj3X]OOpɗukI[xڊߋ5>6P>V(KGO*܀1@tLZ["thJ҂W !Zsv}EL6V:%V?y&jVb'ctǟV=y&EP`q 4zyci)to1G sdnD҂wوumd$O;$rvp8ŮtFq̒'4yBip_PL2^fhb)|  NGhs>]vDvv6ǞWI L9o^%溇(RP+VK"̃lIݻ! -4o%C Ab ItDрKJ1uFVWxj䙁a+WFzXO c5 UA3{aW34isg[sԲ8ͭn`{u3zaKS1-s`Hi7@j; g-tEꬢ`@JTc3b}ݟ+}KJ_ұR/E^ 6gR4HWL[ G"-3'Od HҊֈxK8)Ax]L OãG_= AAP!\Bi.kpcPv\:{Mv̎.֨w*s'`u'LX_< Sۚ$p#$nʹ`M4=z"ܜ'~H/p[VwcG{k@ MY9&@{?<܋ȶ>sg@@B6vujd7̓X4*X_.c3Iÿ0X"Ë;s_0K21kgЙTqK ;Vo,_ݦ9T@neWDˍCM :>Ke=l՛;M>%[!sX{.3q* ƃi# 7VQh)ʇ s>TءSocӸ](j[E1FU{w?~o=??PK%cKxBPKy.F2angular-1.3.9/docs/partials/guide/css-styling.htmlVMo6W :NKSYE"@E:E9+HII:Fi+Rqf+y^1*MM)n1ʳey]~dDŽg$2\+ݖ%tx_DL傟no_]9^V5H,0`Y z͹FkXxx>h|^Wj~;E`{*~7ߥX;g#*,˪~*kt`Jx\8Jp(!LS+%.Aɛ*[@5 y!V)ă(KxݓpvL:41^V8* MHQINʢ~AJ s(x8U4z%%d;Ͻ#aÒæɰ`c릘l?Cc@wO?aqTK-"QhByV\h]ҚlowJ{׎>AiaWCVEwRQI^=5]g Ev_U9p wkJK* -1S˒JBؔ-$v j͇V{q. 2,㈊`ùf WK'})Ӊ︋740Nqʞ[Oy48p-9 oF%\^>i^:RHmo~ ]9SǠ۰9DYPKXv PKy.F2angular-1.3.9/docs/partials/guide/databinding.htmlV]oF|Xp:o©@SOƉ\gwQ*;{GJ}ERs1;;FQp}لwEQ ]L=͟/ҡ8**[& E=芋JצҦM O{jp Ooo.ؗN>9K*[zgXFֽӝrv'ܪnǾѨ~gqS)F{P,6V[OM6tX  T%єF-2 pb6ي[RSj{k@ωvvR#p*,h˝ bPp T2Ŏee =B#MAXYꑞG."RmKAcyv|R+ aK7S%ӑW٦"]]68jٮqWq2lE݄O )+!et݄yW^3päƼ7nmzbZ ;VB4fTaM;S]b1RǮ843iZȂ`vĜnb [2:r,DUS~/*@rL5y8Chatog8'ˢ21xթ'tSK|cc9ubRmGnmx NN@X^ T6,);b[pA˗dn^׼dCVsIYds8ַcNEN05ls"c0"#b>-PTÃ!a9`OCOɤ#f ߒL{gOLf!ѓA8D5(Ve>&qAJJ`PKzKp6[l E^QgK5& L|["_i(+.P:O) ns6\*!N',\,;-O1~юc {.6,à7'ەm+F0W.vpY*>4u_O0hlAVKU YyWyvio'ňdngXLz{6r0a~1.O80Vo7U%Kj;'!|l񗃅$̲PK[Oh\8 PKy.F)angular-1.3.9/docs/partials/guide/di.html[Fοo83)KS,ݳɋ/ӥ[Ӆ:[uX鲘Tkǭm|m_SmmsS}p/^ۥmM1xp-6xL&ߘEomݸ;{5ͼEۼ9|3*}'Po f }2{ZjZnt-m\4eYvyf嫓e俚nͲz993xCnZyc vZ+S]g ~yq{׮V[~*ƭncz%\Mky5ZFviwvvK @b%hl:yӹil;zEY^- _,[9pkbkgڥn\TkE*fPsU wQ.o; ܮ Yٵolu'JnZ[Y$Gb7-n[ٺ宴~r _[l ۞eyUp|v ̐@p4xf|ѹ`88_]f$&>=$ۦjЌ84V{.xEяwy1KV†!{7b qeͨ0I] W-͌+ƺ'o#yn:Ğbb.nԼ6y0 A֏_*XDLǔE6АNu Cc  ['hG9sԉkUe0spb+yg nZ] !v!j\*I*H^"ơ~]7> /D#Uy]T [5eLi\t9\쭀V+I:./9I4ڼtV xV /޼9k[-8ys"%3/.c_yF&ĵ*|D޷$%CYZЍCWޗ>6v&\I]z4O>yʖ/?e/f4]&O+g̘Ԁ epԜ.-ay/3Y_LH;*$8d5!b`KnlnF@dㅮ]Y!3.gܽ)x V[i\˴fMidPDw. *xIȜmF|,\dwov҇ H*7HL{fY`C2p'+]P춠e񳼮b!Ћ "϶v .MPGQj4]ygBGto7ɲF4@$$QԺ(Aпd_ Wt?߃cS`~&B(2FNr U*Fĩe{=xzJ$2 yv%!,`԰ҙPku@#tZ#61ր/Q {>mDjC@ !!7hT3t!yځux2HPdR?eg[?QYD$fJMy@gUmFr5r^j=f~8׽O=_};Ē!Ȫ+hEF`ix;ijɼ47+@yZA:U'J:o|F;gAM8!bi (a)jT BHl|y` [UK –%m$3h}n ۀU1Z3bbz3sWSc0XAWH 'F£r{3j0-;J)Qʃʂ~I$M }btLPiXmSdӕm@ z "]N,IEhY5dt; *<xAwmxw >"1ny-F`lhn[^3$i}(nc[d<n;"nhbUNG>c3o~`v٣xo<#0FƠ|⦟5@`VꌮQ og GhhZ[? 1}B0i\H8skm-+wxaP-4z,b0jǞ˸`O}V G pZCeE+ԃEgnUEl@5+ʒ=Xozl7GHYԐa.~=z c.L2*yL r<5Y#V. /Fw ihSH&D *@a{" 8 MuΑGR=|k.I)\8=3l!GܨWQ'9/b@::$ -tZ@_w# _,ѕ nJj={XJ:T+0qqi}_5'5)MJjԭOd&}JV %rπCMp$&`{Πj BbKF$")J6-RQ4*Ot` X Ěj4Ǣ(:p_3¬9 +3d$m,5:L0֓J"PݾL<2 @{s#쨄`ُ}; !s5\5bL-[ P04^=}>4a^2꒸JY6+BX"Ss7߻V_Pyl |9uծE9ι]xAnOO|qRR bhJw.KD-Cm0 %dCp7w#wg zRum Бycz(yMYL,hî\@)zCHIOFan<:F+1Z.LCzI0Bqhxi9;qh6:yM钄*(Tbr7/\pin[b^vbA+z.3/~Tׯ=k A9E|db̍Wyn>fˉkDn_:4?WS3a_!W^/yZ"\%̤ d]*vhƬVN(l_AuDU+SAyCSt+cH#m%@&*Y/^/ N)E%@}WTטx" on4t(඲ E:2/  C?6M das?XMM%X,A@WDLfbC4P+xSQQBZb׶Pgs r똉>jTbA& {p(?/֧qf GƁ ?oe˜g,yNp1220ZPW5n#'|/Kik']G6+s<&CgL Gz NjG`:Jdȑ+&18trgA)la+_~%j0:~N! 8VTl<`pIiXYA#Gc_"T5۪hPu#``JOO|mCA$N&%z쒏S %L-[̀8oWVbWv91u& H&)Ƈr<$3Yz&Bü )'ڢ +H ql Fr (ԕkM=/MꜶ:܎fHt 1HcmqYz9c:H1$Հ \N (bO|D/ahcAK"4񿠍?]f,>1 ;G9Y:d*NB{*=H _"NA4t^Ϟs DF#BG*'R 8sox }̉[;}-"B!`Ȫ8{*cEq-NaQޓzWҲ=I,jҮ^hP/4#?ZȱG.8y`YWkL!Yt^ vj=W^A >Lqê+44u<0d9OLqPZ(Hnﴶ(뚏,$Rp`Y=ZLH  PZ)d~[t7"qét+Nzp.'cS<BtNe_=^4$֤gwX(&<ވN?i+Et1%?txF"o8"e0߸WbS/icQX~oz&҉k~| J{;Ρ5c!1i jat:o?Anp9}9DK7fwѾf:E=-o"=w8&F ]$5_B0W5B((HN#[;bX\H$~ޚ[<;;o_Gx4],ǭ]$n| I^d7ۿH.%ƒKؑY0: {(j)ž@H=`,LlƇp P9[H~ўg^,_iԃe0dA>Ij>cpuTOA!8;Ј41@O>^;C`d q x4zɻz ^_Ln0=PéG,s\SATtGe E,[Z7PMjtOon/?ƓmɋBeߦm3LE8yPK`8PKy.F0angular-1.3.9/docs/partials/guide/directive.html}iwGwm PW-'K<Ӓ)E,WFKfRHIm@ ++232ƒw.~xԶ޸la5g$o^1*۽냛ӽQ5lլ-fxQQYö<.1~Ǵh|\emi_>FnۍkAgբ?# fI4w?,:.);hg.y}m'gTeSDo0;h=*A5z;G׳rtwkXy[ii? ڿoe,ޝQy䓢n3o$gr -fougRZd2hQVxrd⸘Tn*YvOI V.k oa3=:0wx7Нo0ke7;)2,\53[l|9]aY7r瓪z~Z{}( eS,(+[9>{^S{4IgX}AXtK Y`dmV'y90+$Ǐx|:e ݥ,zG N y &p:7b:9>-V2r?F7|~ʎQ6p<{㬰o7Q7-ksoOua?y5Am1a 4sWOÇuXl;˫/^[@hNf^ pP%9RAk,k|րݦoi ɆGdT3[L'p␝4E:rn6)a[_n1Xp}0e{hsu5rF H8%7fCl-b,_Q1}PU-f>A>8{R!+S[zkz=0#\ib ݔ kxE:G*}F^1-0E/Qp#m-6 ^8u_?<.`]{,p)Bk LxT3TPunc!oH2|4v^[+d?cE@fЂC(U2k&loZuETV'Dd>۰@,.-??6ICg惪GNrhtB_3锽ߗE BgDn?vr0/ 0w 8/Y!2{6$46wLpoo[c  ?1>Aܣ2֊S](g0-_{9@.5D(o`ra(&[Yݸzp 4[1n&`Ijns| u}XWSC3^DjURE u/%&Z8eAHҗpO5ߧR,\u,}Qh8f1 h|J [.7iU222gw` ;,fXاJuÝ-7h4I=+CXМ #zJ@KIdlɃY6ۣ[ m]NCHF?E/@v,-tRD)nb⽪/aܢA8JAD_.ngW0(֨ڤU"}Q4kxaI[4cyܺN~|'`LP g2ͤi~jI&ѩ3o5r<SߺP'քia[diOwϿml$<~33 jdύ(ӻ~fדaMClRg}0Aqξ`G> E/;W>[:{5YeU R0^o0-n~>8 _{U}i[lwm6&흰q9ǰ䷸206 aH5p^ݙ-f@;%fdЊ;GyKp :^X@]X L$m߉=5v0W\Z)?OEA#6gI:B'ea ,ڣ\G0-7p#Q+~E B=*fɵ0q3#K (SH05 ?s9)9Un##meÖj@/,[ !4W" rIbWV "84`0#Ao'\dt(Llk`,C7qY|QN@F"|:De RBqk8j<Ě#wVut rEׯb:j% =`U\6T׈ur`tH=zB0K&=om߷ULmoU]̮ /ڧaAU4,kdy3:Mwjn "?t3zg#bIW> n70'Z &Rc@y;soBZ1Nt^8nUR*.WiƐD(ee' \HB (e(쑧x`4lrv\=Eު;s, YH4r@rdIE(S*^9He\M"AŠM6몤1]q=}B fȢk= !x((-OXfWllWo10 q WޏKnWjeqeF߂m ,UaR d(VHNT`Q5U# [9+Ş]BЌcDHKEI:@`/ɠgH#{pLCʬZG`4M1I="afCpmiC\O$!͛:'X(f5$:zF ~A.!&gU`gi#)`w٪鯌JT9DxDS/p #r!zaȖJεl$IXSN ӗLӞ;WĽb|(zg31bCPBNsYEm0i ljٞ@U0SBb51`0kV)mz lrڱe(:I⸪n7F2p&!1dgAĩ,1=Ҕ|X )Fdo|R]&w)5*Ѽ ll8m8D /(Cᾷ!H)&4e ^w~ Y\O C clHf`s;W( τͻo]j۝9\0uf惷4MsE,DJ_X㕱뀭isT7ϋ"1ooΕڄr,1 g*Py8FxtFN55[@- `h=Xy`ZU@3`ϰ;/Cap t9Ku D]ȽL'G7iK] dFN"񍧥I2rI$ Ƕ$?vr |4g~G$z 5tipK۸~7\zuZmt#/̓+D{ wM݉nL#wʏ3.GN,Ay <2XX$YYKyCBKy\Ŧ~a9K:]\.EݥУvW: y]-9?W=oT \bJG 79qS p{U0(XWI.F2>$J>K[҈c9d\-ڙ+|pu8Aj E4'2߲ *7z=@߽J8uIKs@a?hǔr4ZCNO}k()cdn8"#K9Q&Gy%w S~S G'^˛0"+w| !Kݛ˿Tu܋kh\0B S7nfO擥\2JCꖥ0cdYd>|uClȅ]bë"#9Z!KITh3@%FL}-N uh '4#r+派@z8Dቕ@.)*PA"cFxg{ \b*^qOQN>[czb-J(t`W0>~b 5[ZKj7] Dr44^Qrf,ba%rQ/۽?U]"%Z]vWG8piH{fi+nNd3,,ˤȧ"^/?h~"hsuŏ7@oKUp6=b7j]qJI@0bhNa9[pnSqߤ cx^CdÉbɲ9~!G2uAHPA" 9lhj;ۍoּ I&[q7"F)"3/u"2l5L걶!,zĨd;"Sao^ŊsӪfSbv'|j:=VFEFeIQC\ W,8 DqqO{K'h8茧yX—RS'tGfoowFY70 c:% mL]͏>$zTF{^ɢ efe,--?fZ j)i6>d3,Bӱ:ND3\$߿mV\ÈBj,rq-%|cZnSf^zYqWs|z!=^m## e " hK_ .χGR/|CYhN&US$y)# ڨw06p 蒜vOyDEDd) c9g* V^Rc52٣9Sl|'dzw&=ښ13>)yK V꼇t=P٘|L9' ԭ}Ud]vvӾr =GP&\-* B5]@0 oBYbj&@Ԃ)ârSO C#)@75lzy<ߚNoYG%/QiέS,n?,d%nq!/v;4GMY$ԅZ&Mq2?e~ G#ZhW%) ؎dn3F`}hħixV2`odRD $̺NJo:%:~ 1.]'8Wc}f䓰4<d;Lb:w̫Eq8uoO #F#rV#W@p0@9v&" Z` \vڵ@|gV#<ndbc1x ;t1'Bc0|mϖ̢tL 0{zNe7]] ny*Ȃ~ tX1KLG cjrc((P%\:,hm% /7: ݞK>dQb Fe K b`軉B1F#Q( diA[ch%TE`qsRw]kzɚưp"< ,}A,⋐#݌7K+'8(!!*$6Mw"y-5:N\BfV:ƕ QGx>.W̊Zn/1zvzAQ1K.sX=^#p^|n}wP 62$6U{c'/nROa+"b6 xYw@ydbZ[IJVPw2;Zqm~a@f w R7Yx'o9,cAdkd]%4A+1cbۈ/ܾsE~>R#UqdEnpnnfqr̹\&$ MWCGB Mjste e欅 G2/h95[˂?ͯҋB,-'Vq8`Z8=H99ɧJw?Aqf̃bC^ ~ZXF*w0Wd2gZ懕f+MumFJ A땻/3.iŖxIpddTNE4]=sf^7ן,䬃f}{L=TO&G|䕌 Zid;dU|3N&OT*]%zcfYdJm`(}$@]m N wx>e8-5XmA$|",%Ҳ}1+-fksS-9hA=Q E@$eCI 9ginXC~(X̪M\QH.sKƊ"g_G bpEgEn,QewpZ'>ǟ踢5'=]%/] Ҁcsu):`Ȗb]J)@֔HK{fK- T盩Q9C1]fڔ)+mr w!-QB+Z!] Bjf fjfHc'0e_j[C9 _9J cx4` G(v;~5d ̨o Q'zyZ09r@"ח<'-tf:A&>0^%X@_ԍW0YpGa8{MCMrLH8U,3drn4zI]=5yW&+Ns~;CV#,@3MAU(#W/$ @eTҭSjRS 16 j֓߮#T9xm_ nJL4H,6fC[opia t0MDV^id!Ņ˂A-L(KV(&Jܾ 31OJ.Mcv$ ӆi-WZLfF_8ϫnjB$JL&YPҒ0Njsƌ Aшfre5>*4(tk̩Ot}ITq/#V_^ ~\vk\ӫgW›Wޗj 2mtE\Wٯ9K6t.6n# J皝 9s1s\R qY"'sCI%Jb`YsQ=X|B8WV:ra*䜄H }ɑQ sn XCz:1]qĞa9 _݂;Oa[ Gt)3BkwDe`׌l1]y!pAiEfJ X!ފ/viWtba`m~ udu"kmgbY]/qSW_X%&-?  5rիˢ| :DٻiC 9ϟQՔ(kOanHdqö\L& +.uQ](}̇[Xyɗ >q{ݽ ,<P%2ZND7щ5eNvʠtu9Wb\5=xSyCOA=ea9mNSBP>P#ҙ7'W(YA}wX%67Cgf1En UV PG:6Ǫ.N[C]1; Erh4Or±jXqG AfUK VMk/^Ht /,_ʋ%ksFc5BѦ43wɏe+NJFfbkl΅oz"QX4dݧ=ƘR*c?ϟDuYǣ67 cޑ@"O^'>##Lt'U8VvʚKפT\W` 1-1@4DzB74=W53-n!߀a飥B1k-KE: klFNRyGHJ0=L)}|XX ϬHRApwK.+ĢgMq#MHY%G-5Rʆ3ڽ;db'oOhyM>d.`"Erx1 @7jKPp:>s/8Mbt QVz/4Kl0a~~06}T,=X/5m`sr]} nVSnc1[&0i|,TV'&.l(:{{$a)qؠOqBuxS Õ8*X0Y1|/pa4D~0ݼD}吾{0~B sg1x9DO[mӉ$̽/ Z!G < 7e+k䛐o^EnoDO15"&L%i)UX.(k1$HDa@ԚqB`ӝ[5ƾ;"{W m:V35};zǧ)HX zq 3MD5ea;n&XR*x;;^z)_I=(%ux4^&{[D }FgЉ=vWΎy$ز^wwx[[ǤUfwjkOdNvyR"?EaG\[muv*D\ٳ -{#i5o>7Rf,).'/0gX|:gd'("ʥ7 (+C!J PVY.Vj$Bziw־VI+,WFV-:FDw6һvDJNEupD lظPNRB2cωNR-R ݼD?WZP6KQ`as#h+! @4R) UFz4=*.%`e B+WUy2G,1 g2̀:ʢTKn=\cUPݭP9L~H6roܰD;Ro hQprVLO(szPKe6PKy.F2angular-1.3.9/docs/partials/guide/e2e-testing.htmlWao_15 Xd*ZӢ9"צvݥlݥL;A%.gg޼y3R9^B۪juMY]L;M卯ѡڟojkPn ^A4-~ޫ/eI\]e/޼qa_;aUw؞˲|Eu|w{^)#NëJu? ct[ߋKûUן- ֫JXu礛,zŪi3ճ Ff_ڎ}C;$5<8U`Z=7*m!yCjpvK꼼(Mz)fh ;AN_|#mhZi' Hհ~I C᩶SK^I!Hj^({ckP~?2SfT`=;=DkI0--0:g'ma[caaS/q45pņl<ֺd|&p y~ėBR& .Pl81OŦ/W 3ujVq;5:X{!psb+ȕ;ѳCTA"龧P4d܃\(9cRu9zd5w%S,P`hKdo'Q7ZAL {[9P^} xNʙ쑤%pkmsߡܳ㮺ӷQA9Y|ppFBzD4bC&RLIy92#(E}i+5*)~Yk/\PC&_~r6A2AMA/ָ@&똳c0N?0Q~NV6c$lم]XFBh , wT&-hFQ@s(k[ݺ""6h+bb=:ߵQQ槝6 򕪻f1 @%e9jНČ_*%.-VĦ|1OcՃ1޵]}M#}Ip,.Ss4_&|t;e@.)؂v4Sw!V7Ԍyv#niRGȢ G]4W ';^GcC@7~J$?c!:;zrJ.B.Ί?R +x#Q)7v)\'{p8FAX;~y9\1Z!̭oLى֚pEBCUD&֑&uaǿML,4 )K'9x.$#kfv4{W2(Q\qބ\kHCJɯbل<~9$x .`T-!5xD\ uiZq=O$TSѵ`cu/-+}I0w纂)LԐ"ؓȤ%i΃i~ ࠘ +"$wfLNHeN>SXi1=Po䤹Xǯ8uah0?N[e{>Lq ֞fQ̀8y1 !E?$1.rcaɃڀG h D`ed%'݈CR&ozk1 -e)/PKWPKy.F1angular-1.3.9/docs/partials/guide/expression.html\rGe pK%j왑Զxv ye9V6Zr|'"ktІh3|Tg$5 Y$ij^q$3r8XyV+ Q%<[bTIŨ^vt*( 8j M1yg \+n! ̉ [B051.}XۆS/n[>R:y+l$~24YW2P'5I>ʛ,DŽS<5$1R_EcIH4 a '뛬(J|OmIaϚ|JS Ґd͸^KVc,ؙ;\UA, 9陽o}iT)3IQA^`$OXSY"9ӹXXʙEuE~A807Z8g]r Ϲsw,.7C _%ub&lg:\C鶞._ .is0Nܬ0;#UϽݲhY%Szxʬl,`)XmWŊW,dz{p6uӮݢɽ5a%ЩRW\ŀ raҳqǐiNO0x߳&?zwt,mw)aUX`BL9!!([XTBA Dpy2ɬ)zyܽZQە~z82D.Uƭtqip~u;2o/G?1@5Ǜ 2}T|`1=E=VWoDHnvg3iݻZ-ֵFVw`6t ٌ/d=T)Ӄ5<`+C$l8fu»t^h?WMQ$**:ňGrS7/"4WGluf FO?( 檘51I'SE4&ǷoҨ( 4ʏvGN"[q|Ci^6/De3]]z3QvO>GB4kp#Hd6=@Zh؉:ldlM5ꗥ4weKࣈ@24;cwYBc#φ盷ʍO~6kn,rai>pYvX6n)'/zԺvxFv/~J@tj{oL|D "p4O D7C]=ߖ<:'g+2+Ql/"_}l~rFD٪`?!,nr*_^{hQ޽Al [ ݓe |zMz%dp]u}<*x%>9+iш6^Û!mW+|P6Lq\AFdĝ*}D hfd虙er蔦 WUhД|9;*NVT57epbʁ}0켢H2PWDW38I IE5"-q*E'V>Ԛb,tp=pɕPmmp֭yGHC~>bzJ|6%j 5 ?gIn_vPu<0 8{0cru~<4<^TV=Bn{a~-1gu^J 믐usSm}+#Ha+/OИxSWbo$*8.ly|1k2F+ p$r(@/sӛT97rrCid fhd^g ;U0KMܯM{'86" xK> rB AP觼:!>]*z9Iu .9B+a"?LnO@W|Vg7 d32 $Pۓ] y5F J]5%C#xU/I>;2[{zF/VK!2HP [’4czUh9g;- !_ƹZ)>HLlI 9lDݩM"Cz^\ HGSQ\(DsE(E,rP7B O=rZˤtk: vCPG@FYi68O 9#$}䚻uEpf/א2rj:^XUy=W\%1r ؃6Srzɏ?n. ,LW)ٺ{VVy$̅<$yI $J JȄ:8兏`pp;:1u-0F(1Ht驂?94^$59ha{H"B1HHBՁ= )t@@F]@pE\սk/ntJaga&mQ-UI uIqɉsJ<({0 ЇfvAz&qRӏT?ay2 9 1Dh8~Jl{)@C<&)wjJQSz^NckM Q~%g!Q4/)r;"/daԇYV)1T@$m̌$L+gaO!$Sl}LvQu)i) \QLH*EJ;*?T!=|}c5WEIB>2ߨ;~ԳsBęoH !J ꁳL:dtͻ祖$TLK1ӏQ#Z-ma?=cg!?R]&I 6zn6b~4p/i"I8SLlKu6M?Ҷ\$Z[ɤ'AdyۧBS\a>8qb5/X]^4Ȼ@+2;=v)ޑ@A^TS{Dn"^j u]pZQ !s_xwfzRcn(b·| IYX* 4)]d,S16@(֋%S1߮*xٟ.q7K$ yzB=%j>ِf}@N!cSRa 3Lōw}\yhu60+r;ӕ<>mN_gE:@2R(ZC8ӌT,ͯ!ڡ u؛uuQB|\ÂPfk#zx(/rw$d.PLF?Ev= D~\;Ӑ!Zyid;ߒcM^ yP{Erz~ i FҀ[} z"\'ȕmX{A\_"H).V{AFC9;ȶ݂!tDҰwvtZW4v)ՙ!j7lOF)a+N] B֧,F!Ȟ&" m6{OH72Qr$7ø)&om G07n;]OXSk G.;vӐS}=G+@;of:ĝR09Yi"-8!,kx;8tdr"JJMA*po&w#&{MP# S5M 7mCmB:bH<$`N8 $ W"D|O0IFPKy.F-angular-1.3.9/docs/partials/guide/filter.htmlZmo6ئ}ٕރ68h\REQp%.c#%{{fצ/W\ $Jp(ZY<[5MtiU;Ojrk&Mz&Wi^e>ͪ1e.[taƸ\bok^~3燧g ~nᒭI 3]ua$F͛Nkgm͎m7^ze~MIi9DjV֫8ճht\N[cQhJ\Y[_zgf+Q&ύ“\R]XsɈ檢0+{63K`zўfaK1IJ㴞XLen\R=IӱmZ.S'"mώ*7OS<$$@dz3~j)6LϾ AMtu DO.,WN}䓅 8;)}u7k}=>n<:Y&,:ok ?Y)nÛ7Rq S5BU _N=S2 Y,DE'^x-=br`Wx"`ƟLzj^bOK#_.&dlwnhkl0JeF >GCJIR^#R'6`nj-;bwHKFVh^ʾzOKYHBp{`ڙ(Dk*/mQD5Y)IYբ-rfs HI&R(-B&yY@`Tg|A~.̕F2iH')2AlH W&EɈMLr%tNo(2a 5UԪ ,iu7V^+0žQLY㊄_o'c.U^qt C$Sj$W¸I(W@*@3b 60l=7Q77F"=s|$_ 'Dqd!+u~:T8M!reJU#;.?!)n4_TFZsc?x1T3滝`tQ!pɸBfx[yP F+_#$YE1uv@Y_x%? $(rmYj.1m:?m0'׌ˎf~#PŀG%zg2Oq<[ӫdլXA'fS')XH$O0Dv(ݫLvR~K({CR(c4k0q,Pt~\_pBbR2X4@%pR_B026 l|31lu%2S{hG3D / Żx ZpV3Pp ~<8Qp{p U*@,;ñ]uEy/}k̑b﫹՞n',r󀀳e<+s!n16Pl@S'^vzL`"a.yQvAl7ѱ.{,r՝lbcuLY:!M9O7:tdz/w4yjGd@Gp2uRrG^Fe_Z_/ ~V 5R-3Y\pmOVƯ8ӴPLuŮn9̩ߤ:-aWAvAEj}@(aA.\ǥ~Hn(z+y5=@cFyeҞ"Tn]u({˩cW $Ԕ#k_M6hY&Fg̤0YÅU%Oc^ciJT읨ɠvoqsqm4w/vߣBn@m$Ƌ8C viOV"A%#/>YĢ-z6xLwr_~L UOG8K? tf?Ay4uaX#>~5 fb6#Hgb?Z蜙 2_5} Pfhlk/D~TAAd6F IV܄H]" c ~ 6VҸFim'2>R`'COՁO"U 7H]O$D c[*, %ꉴ#6Y񛰒ý?+9ܻJޅ]'%gtBe'_+*WaR7yt1̠=4SP; \&Gx1~$PΓ)vMq.P{A!Q0" *-k$]D&>*Ӄb73J!@FLnDT{ &7owBQ9!ײB;/t;u~ ~zW {jC=wFH _@Ih@|ܭiZ4,@?Df0NMy ~4/PK,ƿ& %PKy.F,angular-1.3.9/docs/partials/guide/forms.html]i{Ǒ_цi\%YLLJd?> 9`MkoUu"Î8Q]]]эȝӪIR(NWqR no_򬊳jpR'x0ɋiN7Ӹ,ŶG>dn8.GE2" ˸FiT'Y=6UfE2+=I/f qSvndr 9zm4) :t:D>(fuugeƣŇU8;_ytQ:pE.UaUQsߑ 4Dnl5ߌ VNc7Y^|wR,N\QU~p?̎8i>ZECL;D;vrו9*PE`s첼J& zBI&Uw(1+Oj/gq(QMӠD#eex^8sOQ^T"/x*n`DBiƘxtRʅqRr#􃙍;hA &O|LmR9=$ FI1g1du)eĻ~)KĀKeb̚\񨆤DYdBlNod|-A} SšӃMg'WrEu6 vAVy(R{|lwY2N |y OG ea@]•ȳ%˃Β|<K)w2)-fmqT,?с2O{tGrYYר>b N|%F 4QDZY88*ˈSz͏w^kQ4)tDԤ1xBBZβh2:RѹYTvSa4>R uH(Wԛ`vsY4E+e n)gў(s0YJV_c΀NLhl\8ͽ/cm" w-ZKu{qKP)'R&kMRA{=r@ǰpYIs7tM1]C.S]颈I~E'R }ulCFYĮ7jqwfOV1teúc^e\m|cgme'e=&|PZa;)zz1%+OD?<{ D{2z]\ZS¹Y; 7|z` Xړkm=?Ts uD}S< ^憴ywۭf bÃU [>wIEn{ۮ+Uˠ/#wiN6\%@`#6$3cuoh \˱՗ ݰϱD~J/@JOæO$:Q\{8.t 6 T4Q}G>Cc>6t풽qs.EHH 12)<52967*K{>r> y)zY],ntE b%NG]\)n„iF OTNB*f^.UzX?U9Oq4:վt| n SWNlR]XRֽEPF(ŁpʁMdlD3x=hלw1,%ÈZHףx,mf0Ph:qoМP #ELd*/ jДI`=?5K#-băEIVq߁] alq b T UWs5 1wD!P-wd?MLh½22Fz3Fuc0^9ζhCVmɢAMC%l]y#넪] \Krr!,P1(己nW-o)Ybܙ`3;21l 00X|bCnD}I^U=ý3=̓F-0?|xDxZ+Z-qw=il AtVxG7om`%J4±rdWoxa*jx+E9t_ 0 lV:X!y]4dh" Kz&%5:* x/?VbnuB(_zC*ƃ:;)(Cщ+cU%0=u!4qX1bpbyo7F 3FϮ<]9G)%mylh9ab$؏6a`[3d7D a4jL?Jд8<0^BAY$Ҍ4  lE,. ']*غ`eآ!$* f0 3A &w(s+C:I?SftPilkzg v5L//$޲w=1C\8{;Տ@ @˷knWvP5"`x^.[;cM0MTLW!ڐ&rJ8%YXHb |&Z:6?%^&[hC{n>} aK @/ls8Iv&OРaՅt`'9HB="bV%tCmN+JlgQP<r,*0Ha4J&AwI/|m,f BZ^y-@ prV8Nq^)`D'QBx5u3!6.%[Q.m'8g~EwI xqw8%3`+DBH#DsamxDhTPІFvPLceg[Ģ:H c`v%طW9@Ws0Ƥx0D)ɚq!3]/yik@G :h#9<`,߳ {*@-Z Y`I9YКQ^},<<3nñ捈o`ʮ5yz罂w!gp*7%3rQ ? |0g||MwF=$!~k8lr@Vsrv#V-n\6=M<Ӫ+q~ '1~xy{?tz: W]mB$y`DDi{}qC vE כZhڲS|?Hl}g''_.iO7,A&wWGEAl ""   (] M[R͚Aȳy  Ilt ew;t<qIF˓1L c '}농1]!,Inoxlk b4)T`lTnt҄,MIZAޗLpwLƉI+?Fz;&TJ Sl 5\1v/*HN컇v>>{oYJՎ$Na6]+@&"OϚ?wD4f\(q Wl 5FYa=)Z{d1w3tG ܄:Y_L9HeKi>zwm/ٿu۷*\:%4H e8N,G97yr*;#kI c'!1%ECcdpa**C"iMhzG㓘+I?%ϣh/5h(HӇ5{`-eIG)$` aU;xqHnݐO} @7]~^-vUHWӗn_I*-Sd:"=M~ݶm8z5] %OhϿ/= yfLb̞UF/Mȓ'Kwi[j{E yUjh%?~)O7t>MMC@ls=Jھi͚\51td1TzKzycm}hö̚ >Tev?}ڭ&.w*>RX:kט!L53\-?{jYfV:6V͛kdlFz QD=yv5~D#j~}=3n.f1{23,`4`mA-I818Ө*ҦO[P ߫#Հ DI3ߌtnkcIyඪ ~ü7s@ @G)Ԧ=u M5ܠ夽\BV4u_}nZq`}3r< `t5h$窼uVqVɀL3|x&m?k𡌓`DoX'iK2·=qV!jFЧbzDŽOR㈵+O.y: NysEpœ5|t|N }7U?ݺCV/(sbqQjFD^V7 %Wقۑi }z)\zӫ 0G:>zec2pΡNc$OCmmWW+&}}^e2an ./m= /s5\cɒ0u!`=eXh=Ҷ+ٮ|s؀7q[ĩ ঽs6@ŸR`}qDp1U{_A yZ7:kmm}~}[ o^T[EO0.mbyh5&0^l|_Q#YhB{'ﻰjSfc&dʂɐS73¼vã3!k's,Zxha!=Gm9QK ڢ&q3_%MW-wnP yjxA每){NC.s@3+$H$!SdwpW;/H(Fњ, ,N BNEpuhF+ghhmY UM!in?Y =_dx$nj N" ]Vb ?'"c4~ q9`uw1(io3BV>Tb\yA 9!f;ϋX51.P At^`q̋N+O,zhW4zXiW4$ „W֒\-N!vfVW.҄^%4%!6Ó{[M!ͥ*%v<'g+{F})O2 YnWSE5l䘱lY{3b*N %>>66ýpw;~v/̘Ŕ]ح _%c6)W_;$ީKkZcs `#rOF7bl,y4)y,Pdō}[ú$!-fh)8\VpWg (N\[q~)[Ui(gWtՐ'`ȶms(ٜ`Ӟ|C ]붃nV]N 8j b^vUVjEFR;RC#ښC>|F Y+/-`=gm6pǾm}D|+ڤ&7)ڴM? [[L?ӭ]bmyA-'ĉcw+fKM[ gߐ+1ʱNnLj2fa ln|2FnR`keߦek,]˰$jrDYldd`3|n2<i8 (WF&\, Y5Kv+swm0D( 1K }u}2QЈ;.Hb{HlÁᑂ= YDd(qs'RNnPW&y7AS͉j=hO>2w݂v52)R3Qq .gOgM}'Ո7~ F%#M֞8x٠^#Vh0DV_$ɠKTb# 2Gx2.ǔנ(y;,Py DB7ы>zg8KCDA%R _Y䀺z ہf-ם GRvP-UD=;>- L;&j JXALKdrڮ׈x)İAf5}ft1"`~=k #s2=3d|#J2{XPVZ_wQ4Xh@rLHC\c @T/ZJ+P(͓!1"L "P0cf{W,C=M!Hmdӟ`aB#8Kdi4จ]ݚNMj~\Aɢ%(&}o beaZ.ln8֓Lf?ߋ:Dϵpe:o}W~-3qt 7g;C2F8_ʈ0\@aG@JT4b!1n|aPҽIe@siY] 5Aܴpp"rzD-ꀉ}l[L#"ٖkkUnhfKfG j/ ,bd4I ;ޘ.!",6įJO @CZRm͡*nl-'{vzzKW,_=<Luτe S ҊG7o_@InP0kc8q% ,ǴqKrpOp@"{hyzCI׺g 䪏:X9+0HJr`a9_8rUiN@@\;eS,5=t*jtL`t\.d-AiBz5!XqlghynNDnҁg5xepE >{uO>}Rn0FN:rQz!:?@'ycܦΖǡ#d4&9SԆs_@ʼn:ܬ+&Y:)6| $wwa VlpK?L9>M)Ҍ$4W2YЌ8B!֡aKa 遊-`>vȹ>p$&tGJȐk$Q G|dC,͝dPd('5BT ƛ;rVv4E $MȁJ2OL&GkQPKЉ \PKy.F)angular-1.3.9/docs/partials/guide/ie.htmlUMoFW  0I˾$1pTAC%9"%wݥd!e Dr7:ǛY?yC7UYm\v;޳'sC]f7s5MI7kL? jy%15B@co;èta_;]1vrpegTՙFgJz_::=(?+ =-~?v)婩x[\rQ货m]L薤BϠSA[ItѦ] gM[n(yEw >}!N8;ܐ":Z?3JS Ț^зm>̺6ZO>]ޤw㞕T[ C( I"*KxM;$fb (@^R`cg`5Pcٓ^?i(4NCGFY^˒"ЮG;_?\@lmNyvlTCSP=`_<:*Z? mrLL Jy5DA^4^b{]!Yԃ>q9T0Dށ[g #P8cIY";D<޺x.yv[t BI eZeLeF_ZMfIpj}ZhtGa,Akq{9[D!{*G*Ev<&_L-CAig_T@?8-M-:&\ţav:Ft#>*t-V?19Q, 5=s|*jpiԇ}F6Ѳ$z :{Wv{۷ëy@`!'/D܏wڇ-t.n,t\KŠj1i@4Ԛ$PK~PKy.F3angular-1.3.9/docs/partials/guide/introduction.htmlY]۶}lv;y#+֩x:q7$xI@iL{Ϲ (jM<^Q p?=\hgbxUڵC}9MmvUXW`k]h]X}kB{(w:R+uUcbPpX ?IiU4mh6 JweGkywAsN#V)"됵3.PUbs^e'j*mWn/VԦᦫv[ƶŪr;֨Ն'74rxOؓZ٨tum'ޝ ;ac;$ ʽ3^ú#>GS:׸yYT1QLp x2L)pX"vߙZ8$'ɒѱ Pg5y+-.y sAl _}m1?x! HB&rdfVv-G` &sthZP4%/d:>x7?Vzz4zhfNf连Q0(@R 믿`NŻfH(ȃW+>w>KxeF [uԍEW`#BbJJ8 &8, ˧GD ^matٰI:<\jUcq2Y,A-پ=pZ@hv 5;l5Iщ/_,8Ȝwk A}1>%3L#ٞ*ߕ@.]L,k_ yG@Ń>2"wc Ȉ;ٿUmtPGkǂ/;-R?Yp "ka<D@g!=:OqTDJeT3fIp3ĥ-eYXL'>Io $f[&PCQ -T plq g^* Lӳ(K bKkuq*mc#OtB ˈ)2%Eu A${.qs5#kqOEN.9ruY& (Ag 3_`Day\,"t4I[j^ ݳu4\"=D$Th+.)e7 P%}#h]cm < KVA7"p""; @ZsLwdix&:N& ? y_^|t6f =p%ip [ =^paM۔O*{8pFz$7v Xs_sIƜ/Y/ZtP׳Ip Rt n0uC;0E6ѤL5CH3Ӂ6d/L ]M8_̴y %S  J8q<3 p Wl Fʑ2œϑ1 ;Q6)5Zɯ_'Q ߯[E*3 1`iL/%ʂQ%&9w޵R%*Nx2tyj2$$}N=Ϙ;C3z0/V[oɖiOlm0$G*A%A v`02ɲ|\W,39JG@kć!0}C"$k. k-gU;. bԠx2˕H7/^7e2%JLD%7WO;NCuW2LD뫥؏>Fy@~ZBZ'z,_am7$ANX lI{58H+('$f iY\.iyHF̸a; p'_Z4C؀7!r9j)R5)2cuo/P%c.!6Y3 }8 0`EbX j~ O\Gh(>9AFU8w'N͹xKt.rV <˷\PKMT] bPKy.F0angular-1.3.9/docs/partials/guide/migration.html͝vǑS@a7~$x)Y.+٭ZltC}!IȬn4)b{<#Kdd#4\r<>;o/wV:KE?[?lΊ|={iZ?lsb=j~Nղ&(>WSk|퍖lJ[/&Skl=zڭ]2j[-_]W/Oۥk^W?v'9sMߚZ/ϟz_rI~>;Kg_ϗuҧEnM2_&OB*eE)h.H_YO{C6Jo|]T/VVHOzO7Ɇtd$6]@i*鴺I㳮?>;>,erS$^/W1ǂY]1-η -t(B,,.SˋjɈ)z_΋/Z7KNg:&y1Kw ;wK~.oLݔd&Lf,@Y$"QRll. f[rMErl,+v$I!~3_G"ZjKrtw@oZllSo5HI|O{;=3^vyI8Cˋiv?z' />Z6YT:lѥ~MX_hčK*'y33;$n»LD"N;| 23y|8ϲa>piugٴRGQv]N+ȇXךΗ G%42hqV㹈VS&p~7 S¡e2K7xp>3GI1v( Nw]:99-99 i*gHһ]}vJXsTf~!g8G%dzy>۽a6*٨g$vgÓZ&]$;  4_ՋW-G &oQ(y:ՇYZ F22oė7Qrm&YgYoi,8IZN[e:_di1MƆ%E{0莧EwwnM{=*:Y{O4;9-m }kӎ$iG5_^x\-2QISYBcdϲInht6&anQgڟpǖt040t)$6g;qVZ{B5L0K(guqzO_=nGrX<2A Mͣ ȓ_[m?cN? âiw84-Yo|:&A;5o jU-u0E%LERiJn M`ňpmvs!L7hϤH] vsT :|)R dun1w 򧦻 '~X];@܌DAM>x\bic~gL}̰7LS[mv+ҩ̗ ](4a[-z)Z#oĆyOӋ4}e8H&룷j|!#޻ u2D)9f܎`nbmPx5=d"$+Ƙ $ 2qHMxv@_J=4 S#|'@m.9`MzQ(A2 `8sZp[B34ͷ{䧎Aeb. p3h#:*Ix} :=qc`2mgqLftM:Yс7Ot0oQu +F޼YA|itViss@..ԎuE]LIJs7ꚝ`Rm:5(y/N5j9*z5TvmUN;Aj Ƿ7K x &#fR&_4ҕ=W Kmw&p^P%~KE4Zy[./ (6F]@ eB PK?UAcZ.+Tpt l0ƌlrꓗo7 )R`0a3&z-K[4D|IALʋR@{}QlA??BayWiv`0t^/ gEV(5`ag:"?f0 ?a3L̗-D̫NLt%hqVl*$XνsUP}$x!,Bjiy@n f? S$s&uLIdHA*h&O$|^a"eޮ~aX.dG7 a1MzE{6sr[c$ACCnvJiVԛ_ P6LH6Bivf4/KHں)3)1^kXߞ39K~ ,[},0OtM=Oy3댇l/;ϱ+dG7rܠM5&Os佳/!A?‚u86$L-|(\4T6a&?0y>r~0x?ِ`;1C E"CB?*7F$r nY9$IwQ2؞uFḍtԟtfQ?'籥h/>q^l!XFzj\e$/dԇ ,l`af(TD+nRφFin5XEpUhP93޻|az`@^-WE,ƿ{0ޗAG5 w K O1l,:Y:{ ttfly<[ؘ í`38&|]P½L&r-:\6Hb.br'M7Z ]E4 &iFW8){LFxk#Ksex7|uiw{Pgͯ0i)nqlj~:`%mѭә#<@$30^GAp=a/zn50| l:V,AWmB˹`(r 0'xM#faͬبohsyV 锔Q ~Ԁe/ t# Ƿ{yZ6)~͸S6]ʍ":kHZFXidOd*l{l:tƁeެ&ylimfHRY!6[8Q 5  3wLl8Sdc7n0tB5 hȚQ,fE6ABqVr zȜƔF'1* U ^HBSoL|q+yNWv?ScYF߿BΠOaM#C!2!,_DߖofskGd2v۳Aц}8KY>iwz0t4"Cǖ i@g`5nW7y:{ P(ž_Q6fľ b)#OFk>wJSJX>OM*jO8}b5A\rjd #0/2:|-9ռUG fS)^?^O3=͒-c? J"?maQ F,\ mqYԼ7,N7k:>vdNt3`>~gq`cc<~!Ά.5* yF685?՛ۅDQZa A8Ho/-$0zi+a]2̺1ߚ\5t"0 c֩"o(L-X'Bc֘6Y+0 H=Y:HR:fF&%7t;SK:2 ^`?ݘ=2zy(MB{BⒶ+ԐIipqPtHߋ91-xXzlZ ԩIMJzv涏#k@ጌ9WNY*Λ!TEg8m^[Gvu#1g>N&i:aH8ihyVcA+Ǥo\||[D1'Y/J!UE VHȱ:$b^=|[D۟<"`M]Cl |Cw͔5s6Sd…fH^b!Ý(K{}i,'2Qwy}d.,n&{> "ڎѶ:q=%OViM̲.'{T b[Azۨ#AWG'Nߝf(y^ecgD6-Ft,0Ԭ i:)J}Cr`+3 [@7aa#veQvSomqab$irzREk_QE ݳ8ܜ镖)6gL:k4{Q^& c'я2 ]="O6 OK c9G|5 .B,:%綒 |cf}7pl<&0 zbKW3D8't 뛰R~>@4gx*$3L4d9g;zQ#*F- -B6OCW2`rD: 3Fy?9ܸk b_P݅\ٖ[O`5p_b'J??H5wgAZ ~2bFb<y2uƖwD`.x{?яf%n?MWi'G4{ Bd|xh[ ȶ>61=!1 ܨFhTST1F}"s @bC7j0"{!`Օ:,mS+:c mSll۽%v'Zq$Ө9DRÙ!0{٨0Rro#'{t*_| ?g!A}t~7MvQ莺^{6pdƣ7Ig{$_=AuR7eŵm7C;zv2 >Lp`BHZ89WrOi3mn;?.Ns]?NGQglyZK`lטQlReՌ[4gFQE&}zIP {ck](/LLeMlҏk۱i]6o۫c&HGP$(""mL$ҙA4f3|NGxѽqa`@W_GN/zJ:?c|06 L`|A0Mu cN=K wӗ G tK$ LV1,R4Hgˋ@ ?qr^KQ٣_},r?$c:NFYED$%Y;6}duQFHٷ|ǚq+!ڒ'lBQKoliA{Z@jIG?w+5GKB]H2#e+j 1I%[{VѲgɑoi A@[?ր7+> cCdwdq&>Nޙv2c] l`FEe0|31)igЎG{;/+Vk\#) ߇= oKQ[A( 5.\9٩za;x^:u!!9q6G\DE&ZyyF%҂ ۸Mryuؿ X) '|;lh!)Jy0o "+?[ø@2q)m0TNY$jHrkB%=S-L"Ȍyոp1[Ťa'/W+۞JΜ+RM痑>L׫-g VH=[ޙgś&7@+$=?ۙSՏ-ڤ eyblk\؈e.\?+XV= (AecfsVyةDuTEG=#c on%"#Ƈ\V'-0MUXP^31Ե"ErǬ EpG{OO#]^<vw~dd#Ÿ?iz97 9(zHO{dFX!FHǷ[ zie(51ppZL R-Iv>tѰ[$iB&_#垨D-&iN),hxewJ _VE#<"R8/=xZS8l _]LԻ^  rC%Qd{kWOd<䊐 Op#PR`xF>vIS~xZd Z삱v41Bl[V^PBќ6S\ ՚e^F@ 20fXn@"!Jzcy~jq還Q0刓7 $_%)f@ZXb(L- L5@Ҳ ZD8^Mg ѷk$!gwf5W=_w^BX>j1YZ4ޒ-k9s Xp&NΟ/3 9nCg{Rbؙg9E[)nJ2-2d ObP ԤY$Pdْ3UaTTQy+rK^S(S`|߲oXMm2F69a}#RHի-1b.jΣU5ZYO*m>sZ Ȣj6+ BT ^uߓF%h,JbD&/^|lZU0Z?aPUF :DJ0#Kq,?K]-vWDZ[2$%Ҹ b l'@gfEm"}R!2c OmZD<lݲ Gq!¢,q !Z,}P (,I=֪>ZpK5wZ:k k{cE؍@NGA_j~F"fǎvA1 ,*jnO(dPa2HN&нn5iO'4oO&>M N$yJ~Ch:I-U.3[ `Qz%bZKuZXJIJ(!$%\ ob1lVR4oU<L%WJE_BI4D KA<;2ԉU [?ll] `bL ƄH*Fu֤u\P4S7#K^PqoGǬŘ<܊˔g[l6=+I&/GIJ!ec nZ˫ r|MK ӳ+b}|ۯo[Wy](a7]P)*#&הH"5/v5ݕS _ [/V}y^:GJk~@ I=ibC)HvsuGC//W[?dm%B@mF`5|,rEXj52|Imz!pz!t+Y?{*J2y5 9#OMxrS<*obI cҡ/6`BM{`/Ewݣ-ce{jnߔ>T7~+ٷ:,E z'eBS4&K,`}jW»F_@ QU(5X@1$q\.݌% Δqc`kI 2c|LpWT{bEYޛjl/040Ƌ @1b~AEr3$ hDӁPQv(}ޓR͔dS?m?'"_ g7GW^y|z y>NGpU / }r}|xK }#E2\rH( ṳXF09~ŧ.T{rLjbe"]4-A* S5*)c.ʤaxy!qsU"ZnLsz M_پ;`BZPŽ'2V9ҭm[E/$ń&L:ՠ &7)Z $f{\+oj ˆXܸ͒$O5j'y纵){jݱUd3Vm]I}|| Wp3V r2H( AahJ*$'lB3(馻4SO0]^(px)4<$n[v7(MHPkM,dlnu 9l(e{C*t\*Q *<[4ʚ1%W_;s٣-f]{.in{H \{-묔937u{GP-H;K'Q"_/UϷP%$,%IćD_ 6 D_b#{JVd[Ky~Ud+%r5R98{caCqP=6`aXW*{O0gNJz$ 'M>`#{^V4e %?"hoQHQj]ibEPޞBW ȧr@r{Mջ[H ͟+_2c(F B\_HϴFNvH4R,}H* cVO%j:Yh].M2*3%ik dJ(Q ?fG͠@7QoNzu˞`il폒8 6Pسh7\۠Tnoe;'*w{C U*J8 HbpAh'u]JxĖ"1KiǘU &3$ wz 7r"$ybῧ\{yyTLQ@\/űRGcuK|m؃C8] G[>F+Vo$!̈́G9:w_KKzkȾz0bEGELGrox9fe"߅([< Ʉ 8AA1&p5x<-uB)9Ѓ0(؝4aF f$Q`6jި%K@&W:hPud1շ!E◗,َ Scc{l%*)\9{<j~vӖ+EyqLjT+U$kL ;Iϻ[E ekN(~Gf{˒ f#b:Abш\.=b˻b:1/k3Gϲ?)OHuAxM< UW1 )n9x*ڊ)=;fSÕ;j0\&G$ZTHNuڵY“h-WgKL85o\Qk>-lT3w/&RĤ8GjXW,i⨗zΊ'rn!8Uܙ}>bt4WiKQV]1{-1Z8"*3Cw9Rn6a4 u?:^'`M,0Qk&(t UUĢ>} o@X}'ؿͩ#F|i'g\?^E@MWm}fu8JIz~}43cP<[ ^0r@ ?7)@corRl̚;|tg7-l|f[@lD=D v*OB1- nQFum$P?V( Z) "K~eN[)o^ {7gi6)ai0йkZU*y  )e ߊ4B] _~s!/_00!17Vha,q1q fJd<>[g,Ǭ#熌oa!tUQ*ZF"-Zh]`HzJRq2R{N.TCqNv6T&DQKA1iڣCI#2Oɭ>}0p[di˴;q)8\ 2Twu;x<Ѻ!Q{%*]~3\W$92R}0ΪHʡL']c˷`ƣ)׭}U*3xm ".psyփ W%pD]qW~GB` p~aƣk08 ๷4Y b Y3cX2;rKNr0aE gZ#y R\[c԰n~⸩F]!k]D>%z\s^ˢ%&0Y-n"8* h4Ӛ(&ܮǴ.KoW]kJCڴ[=hnRZ2̛$"*҉F>zqxX 2ETfQGِͱ]~ٮӞ76QUz]eSMwr!Jҽۖkż8Jթ.W22F-wei.<|:Let-YpIR̸ ܣ{$m{FĞ.ϟm n(# ~"7|˽Ϙ'7PÆ!>ءI ;Wb *3}~SwD'+ᎆu]R~5eK,d {.Tҭ?$|Zo}6ϐwϿoyH@ -E|XÈDrA>pci_}U8Ġ9?g r/j撖pܼ(Ir*M^U7=鎲;u8ZK;sgw0CT5JB錬 u=ii9nR0 ^RUpEqRT\m\7`-#Kcv%EBݯ Υ^g֡l?&Nέ#PJv0ʇY'/JI^.ꯧ3nI$W(&fڑT_6X$y%<%i*K?groö'ܡzZaMLc㦇?Y*+/nEhGNc*R:}WOžFN ߶@yB$O_C]ߎ??}:>oo!«<\E;8qpi:qKJN|>_{}.-7! bbynǕd;8iZ-"Ncl+|CwVyaC(-1u|ȟY\k@S0MѤaKa 06,C8Ț4,;UiK6GQ]BL93F7<{bd.x!2<]/joJYI&D9^V&>7߆AWNԠ y]rs7hI"tۣPIT:170u/IЍ_ 4>b_baD¹d&Չl*Yq5TW*x x%&fxF&g)W) NL;cԀRHi%Igwul&^{M٘]4u# HDŅmC{G|M GC7$oQ)HT,vA,Bxx8 %E\+5uSkGPɺ~ vF6E^ 2^o"]g -1DB:$`]9B;yM*?ZvKUW+tqM=";bN [[l!h+z4܍=t~?Ol­`簓ni;iF<@A)%# -sDKQs31?jO A@ #P7ENm5*XQX^Q-ȳ3d] Ny)ˤ5&%ee_>|_ߑ-*m8#Qm]Ս#"W1*pm+L*[ydIxmp &Q2C1'!H׏OZI֢@++ɗ G9zѩ]hYڶ茶k]ƻ{{ )H8˔@i%_NWPr?, X` eo^9PAOhyo,xV?!1>U/2el4ŮSAwJCu*`"2\_lJ FPbXu#TΩnXcgӑH]ҴM0{}8_bÒmx s3JWCJdQ`2s̵R w蹻\nu6ݬ`X % ..hb@FS9c ԙrp6P*SC$;djC!jZKTUh$BS: a▨{_ތ7i%nʽ?s],ܟ臺r" 3xÝjBeDЁ=vNzk@(Ӄw'h1cs|xHta59fTBK I8$Fx q ^"bfV޸)CqAW)"*5QL#|gRyի` ;UE!D ufQzxPb,uV[&DV-npI{(5wMRNet!sP3/ *Cr 5q Iq{CQRbm0f)y&*OXe:XPԴ\B8{f|X_|dܔR5t\4yG2iNnM۟pEV;, nqXs 1`۞^54h@V;Ƹ_I؜ 1Gn"dA)]2:`'Yse  !уAYK&|X9^ %Jh`qiP;VRjX93Q2;Q(s$v:ֲ5'**U6)T%{qGxB"[b=۰"=CKIa pc Iy߳yY*ǫ \8Xl!Z|FV\A/: klnV5Q&1m+IDz&#eYM?_Ee@Ajџ[L08ycì_aOM S*x@ ~~ D{RQBK.8뷧Y{P f6FVly9yu2RF䷫|xT2aw=,4;F"z)F"d˅/w.=dX2De,b!ۭ/Ϳl\W%ls-϶TOϸbmez|E^fV~OV&pEY. }y{2fe*C EֈES"k+ݿ D"lv:(&P їL37lL?;9Ql:%CCb˻D>}od%U!3d *@QP2ym,ZVsLW̗?ѵBѽb"Yc KVm!Bsj̯Uܗ:cI)$cB'aa|je,Tq .\PfRq3E΢RBA!4X.i4IhV! }0A4՚VkE 'GWa,QER)2m'K;TK]$/3c/_!A1XTfyokӷy_$!; nuE,[ ÏjzH5|l4H1+ ùFWv堌X9l#% i%FzOH0tTS|Oi_]R{u:1Z|: 3Pq@5t YQ?ElYFPK@oWFPKy.F-angular-1.3.9/docs/partials/guide/module.htmlZnO1eBťobQ i M`;q!rg+q}~眙%uhjX";3sfժ6ܳx7vze[:|dy3>>I/ƙܖ)33^۬-LZ.˵qN/1Gϟ|afܼg_1_aW5/suUs3eԬ)gTZI ŶZGo#"w0_\u4ӗjVS_dILVT6+݌r7#9h0}G ʿWɤնjKZ7D&RkӬl|kt1 [9%Sjz"zCly'_5잪s ^sSl<_ln@Vĭl[djf5563Yނ^PgM s H"iTJWτm>s( h#j 2xfЅJϰDj:=+L8_o m&XpdUFjAJz PǞu d[e.̼%I`)A{s!j Z3c 9w5^٨#E`ik]B/eKh3b s9&5gQYRA7ߚꝭ 6>% ?$ϧRh8;ʔ?myV &_Fڢr'NěZ|Va-Kқ@ǀ'*h@:LmSBGy9/Z[P}^#83qJzm9"]5"PPp >?mUx"L'dEsD unmsޞT|lR~hR>(6SP@./{#Nƒ Ȁ^$+a*Sg} Cco+sdsZ1_$c8ũP9GP:uv2- /|"/ 5 B J%& < BjKD([Ӵuٽ }/a?=g[>!?_/]#[*"^]+kě7!tywqod9_3^3 gt3PZHWmA^oE3ƾՅP3^u>N1|QC7(WosS?Ne3D {@gk.C|i kb;?c݁q\#SL哜:e)^(èV0 &o ?p&(KɈћ.qf]5[ H RpK/9$`;rfF3%x V"\A57(w+DW11! (̡BdO+74XF\QDk4ࠚѝEZhrl\gDS$HT 8϶6Tx\lI0>pz+wag@N&Lab!{&9bi ]wEYMvS<&ю(gD8+2ޥ^?|t1k_\LO T@tS Hy-9}> KTxp=CROI=F *> #`Hw s$'1 s]Lz40a;~& (~p0g*xf)|i,hlMfJ]ƭX,}_`{w,v7 U^Q|+iLQCGqGy(Xzi?iN̟hT|Mo=CR:%kCJ HƠ+6*y@ƿS&jӠ5ܖQNq;Qt&6A8fO:?$3ܐd^#%CqE3>8GC& $@OL$wF}4"$y 2_<"e C^q@}'/}׌eHASECN]q&[(2 WU( DI֔X 5SZ#L^ bfc*xK@P \N zF|=zaP B*wK&J;t&q\4ۼ|rePFi.J9(A@(<@À} ,/PƝPQ7E/^` $P\ l?މ SP g'=uL3ly:f$&r[4 񠒧xi(P\)%CтJ#*][1/#\WKeOTu| /*Fɢ6Z(v*C@4-QG# {㹤/{N;58 @˨ަ MN4}r@?X[~5i w)O%TV"=}߰EnPxN=g8IG6[3`쎿v5[@z@s.N-*7 Pn>gi ޗGۖm]HNӓӐ*a%^g!ʘPzX,E"XMhӫshO&3ڼL k Mxwzª@ 5Ɵ}#|QI2Ch4zp)j㴾i]^ $#\p!b| ʿ_ৼC^Us!\V%(4޴DWMia0P{@" ϣIS;S#iD!#{y9:mHI^踱o/;#a$Q! LBnĂ7rWq0plg8m'YJqw(靶-G |%18oP6RUVh߁P=*tufh{\\J+ㆌ-`xY##ϩ#ZYg+8rDX38-=ԗgg!J(DG@ `!8o3xy&"P*(Rd7tM+ 1^QQb5} Fl N KK!;#&4 j_|qt$)n:&Y6qٍ$>ۊ/\݈Ɋ L Cc[!5ۥ)ߧ^rڧSBY7NWjfAx+}Cuma|!EXQw. xh{u}9=# {8=\r}UfR$;uUT` b?iRT?U~ 2=e6"]Ef8* ! + FaH8>OB5h tڟOMLnѩ5oPvBIf7D!aĎ?"Sr(BkADUz'ˀDG4DSe&7g%bW k-g?Gdlw[nΌQla.;ۨ.KQ5u*=7uo``Bb-tb6>R7vb!ؔ=P1cOWUbbo ҟ,@ë>1IPKӵ2t1PKy.F1angular-1.3.9/docs/partials/guide/production.htmlWMoFWLƖQlScS5  99ȕ.{쒔lir̛7y}^eF[ dBoZeT>۾JS0KMJ֔]s_k>; g_Z )M.y~S)]aJro:?Er>SQ U?[QZy?ikU#<_dSJ!W)0ʵWLJ9ZbD~hRu = AOo4O/̎~8#c.T}0vTϒfMYhoE፝knN_=& ,n'*8:KV nhNOlA9>jUB+NmZV_H.qv(|+AjJ$o^g/*άB&֝Mӧ.kB<-7 %t-j'/OW lnN |ӱ^qHC:jhIsM]# ˢY)qfBuH_I>_o&ϭ(?iHNTŔPB21Eم Us^G'$s&xұ GU ͞Yp}TINXB ИCƌ #7GV>-U@']-8v,0ʋ a." h` Ikuq 'Cx9CjJD%n=3)I_C tciS&%bhJmɇ0) Shqy>XsxɁ´)yxrU}grYXTH.Gմ<g:VVEgW|e~(&iWIv|Va!lbwªt[!Myg]2Mav"**1'p4j <7y5aL">W OT{ 71+o~{|ks>L2וYY)Ƽc榘E=?F9$aDrաoEj"tugE^?S*tc ܹz“Ϩy\M, ļk}[I? YS%yhyâ%,|*kO UX"{50EC񳮸(_(?46-@%ȶzVUMo7Xr2%eb;c[wb3m/xV"*ױB8uf \-#`M\Ū0-6̇뼨 [LUN_1(On‡}n.s췂47<8rNʢʡ .O$P_=|.^0e]] ;|$} LÕmaێlP ..X/ 󮡹(r]=Aypn,Lvao CPO)%{N2TKq_urL:8du; zkuiDH%Agk؄ny~y(* ͠k+ƜM YA+jCUŶ`@HSʈAjH Д@vYPA1/ҳrX" xb\@»m]X:ךmEr1hv~ YE;DU- T}q,TP %HRkd TC4,nN|CMMٿDOڣ^5v"**x"M x77lna g)c# !*PlE bHR^S$k^Ƽ]{SP4ek>4ɕѳ&'u݀^z1 y<Dk"{2b$r;N*.ܛogoHێ@NP/HX-T1.+6ԅI,dOdJ ܗW~(a_l$ q:tu'uJ2di@(lO1.1y_NjERUG,`/`. n*6h K$>RF}[HϱuʛvӆsY=&nNy"BMA"P}%ZMqė7*~œ_D6feA@9 QYqM^:ԥ2ԲX/`ý3r(-4gei /II$9%K ioq1ȸ]XJHDE7~d,$Y#pD\F#aG CB$eHeskimbhs"L>/W_@;gB //+|* h5)>hV`jP"{4-uy6ő{4Gc"DQr0m6f]X܁;2#Q~ٗfb`/+VY= AWRUa!uRhX썡MV20'J¬ò_TjwlvB/ P  n|)I1Xva_p,RB w $)<cH`o..g=w$FNh#C?(< qvh!vK¶>}YD  ] K>7F99V駂ٛ[i%!`H>1iċp(3$AKtҎ20; ֞6⮧G¾S͉Zu'8ڑXQK_%Niȑ@&|&u֡G£.#؝ r'v[t9ꉆ]3$TJ:9@B4}*I1;N N cc#_D CZ1ӶL:UYfc! ocMCAXVawLɣ%Fht#,B6 V~F,4uL9 2`=9;GF8j΅l&/_d;xR6Uz`Q7W;:Tx&F[fHfrvq6fJ>忱/ yLQA]AUj!gIf/D/=[Ki䮲Yb,` v 9*_$1Ő8[ŢEm! m ie8zwX!^~ܾ8.z=0IJĺ 7!Iľ1Re,2s~sbF$φYBAY 4^Q􊏩yo^!)<@K]eldT3R70,lQJZ^ʍ|Lšo 2WCLPA1GLÀb.}UΔp p܅TuhfBM{$Dۋӭb;gQEQj:6uڕ=n=|]ABԥ`)pEKl,19eMn\`Lӈǜ8-RSa*_2Nm+ր)56W,W#B&NZxN'v:O2aGAXIŌdڢaECD0n^.@䪜XĔyb0.{xܧVO7L=P&Ad{k||V)iL)#lp&փ^I/6Gʇ z*UYr*DsUw`m&uoQ3q!#|Z# 5[X%{GxVbޗA7pk[ w<|Gޛa=כ;Ls%yB~rޑ 8bw rS#DaFCB${FcőqO||rZΛg/$w1tÇGSW_ɽ |'aKaw=CF} rmXw6ys͂/E&U$ (M*l|k:mYgU"=;Fz8m8UI~CW^vGfT*ABj[(EJJ8o8~^e/pz-MDɴ % X{Nayޑó(ii`Zp!¸LCNZə ]O-o"Np@+=u\v܁Ewu|zjJ\xp"dm,! & R36Eo:ng!)(<CkmL/(li%9Vb]*Ԗ? &0`s}4@N** ࠧ}O=+òXúxz|2kWee矓_87_OLޞY:k!6bSi?kq,ӟWE|fGzO~U_McdEe?ZM;]~=-3ANpD=JG%` q6`|t ǮC?c(뺚C6Ūz^ V|gopv!MA)߮;Ol\IQvI<UUnun36X%,êZU3۳_fNʦ,|Ɂ,E9@t^O ]9bWC5B775)X%zi~{~GW{MT>fO116% c˧]* BenKaOq&|eUh7COB?m],> kqY7k {GƳ=ˇX)I\X 2uЯmCdXY5b좇ts%$UGB# \삮_σjn鷪okdxrM'ZS}uc '|InlIӿ71\IO³MUP4Е`ZWkNeu;̸ڝ޳7P6we“[If]dKnQ20QDt^-ck/h^hkA-q<6{6s{G tSW whN ,7Q=}lfYq8 (%&[W4()4Ӏv뚟b++R`QP6CnB_qjPUa5-ݮnG1WљNm\C]G,{Hl^ jxzӼ0SSm‰}_xxp듮Z,CtQ1"">yVaS&LHG urM>v!ZȽ1Q#NUDugQ>7yp}#n˫鉷{ҋ=4MmsO;-{6<mW#iݺ/th:LB8uHk##K6ju!q0#E)NMx?srXY?Uɓ=Q:<5^bw/]PDKd6U5kX#S;!>ͺwYZ;4ApCYG|9O߿W{X? PuAin 6E>gJx4LfJwdٙʉ}IRPVr"ѐ!jiJGW1y(}?&?hYTܫ|Sϩ];^䷥aw{z4E:.И)#M-Q+p ƭ[ Ɯ!֑aOڴ kvrfC PJ ,\ʙ!f1.%5~8<1)~(ϫi h*q lJ:z 0@Ϫc$ J,%# pNZl7xԅb kS;?'`1%R^%c+1^[\ٛS }^#z=5C \l}Aix.x87kLIFvHfoh2۔N{ I{Ci Qc9tp!upg}ZeL6ڙu6"s=}μyXN ،I4$ >2H~Z(Lb{ lo%5mN-o`)*":BE4.} CcR{0M_iPGWP@tBFvG?[Ɵ\'{ԩM%IOi;DPa||Nӈ.B|Ul?L7>0 +)vAv DC8ZMZM$p93J2Og]{Ӹ\T JݶQ,EӪoNکĦ0-FOՕkwct7?^_0D]C r"k遨7@Đ@en?7O!~K_7%3ZpMDZL٦3qBNG5 O=0xBD !u7nohbr&;9u@|XWFfbxZۻwh3֘@B8?zKlan$E˟Y@mø[=Bh n@䀲'#_IbvdxY=:4[1O᪎Y*{Ɏ@UZc%!zvx^ESWsxӹ.:U0?*jE$O)ُK ΘiP#H'i.r/쀎(qy<,bmxcۼzAI̙+^ "DZ:rvDf`END]0ǔf'߷Αmx7ag:%tz^Cet9CUj03lSy1,cwG*-\gME-(V2.u 7 SLÏU$K KQ'0"ʦv15Eb L3B-P=B"%~8tb1Źn[1%|_4E)ɗ ^1Twă "+'rΔ= ?coZsN/ tYQvWuC4>p~Auf a$͆Oa,$2O YLE$٪VS*5@w5 6(`5ƈ T{f(KS7\kL=nE|ODQWTDR^|N_V5nۅ]N^|ˮQcɃéRI*ힵ%G~K;Zeq/kvcPg 9y! <&|'l DoLGȪk0GG)7p{AYݒ 1CIΰ6S! >;%cA?\bAN[AN8@9k1hէig>Wy;+Rؑ?Va$铑G}8E~q?X..(i/uU}tNVy"GplP&0*]HEc#ҡj #^]?ܲ<ʓ]oҙ@sAE2l.8uͣ$"L#1) a$}{Za+BjV z@l 3EfޠƆ83װr0~L?.@:k#vd! UD9} N~u!a𹘿CvsxE{Gǝ ?)g<;.o,)NNEٝ@LCeS ~0O0xVOxkOlߺW 䴣VIhj1Zm'hJ!3t#y55TU.@iAR__Mw(D-y(c@A*9ﮝG7<܆L*Wewgiؼ>C+fQIOlKdL2zR(☐qn`/CW4Y8)Ai`{8&c))|GH@ Myx(uʖME/nG3"KsG~PxUJdmC$+3v{"+ Ʊ{iR#O 9";!x $<%fx~9P svGE/0fu5RTGhe6XCX(6Kza!ؾnWjm yV<yqhvGn@5@8:^`WA\=}t exR$"tyctG \ [~BHX ̄@7AD'>LXV2xi6 (kH+dm[?3S&Aj)^%l8 $Oh+ Kl?L OQ/ Sc7pL, =|䀈q! #-`gvPO5g&~pqc&%4 @O]mǔʋOmѸ@ 6qN"VѠ-Q8` HAy6~8<-(d,AT[!Éd'8 pASj6]2; T}۷D#2*"DVr2$= V&u<5ZϜq=MfR3b 6z 6 f8!MdעmlЗpʘ*HN-{cǹIc[36^H;UH[j+`]]5% F}'p^#mn$\#4As\UQ#90f} 䮧`, #Zl()R|֌=YDo=hex?٧YWO*5))i,2M_ɵ> 0&/" ޖ&~ GݚcsqtI}tbﯪ/RPKr"fPKy.F/angular-1.3.9/docs/partials/guide/security.htmlVr6}WIlXd<5٦N2q&DL_ArM" VgyK ݳgb|{u,ul"-mo5d\힧/҇eJEbV,p{iW-jdsūVJ ?e9M* Dy*?7z[fhyZKīYWwt~3@mT$ɦyNZ9M<ϓ˿зH@L^h>oX[VHu"9ʨK,FEBۛ*cv;j5lU^6"YU-$C IZ> " C9GjsR%B68$~I)tP{K&p"nm՗L PBT[:\. r UBTc辱T}YyHtI$Ox)3RD0&gQQX_A|zvjqC~ g5z`/ B;M aҷ@vJ~o:vѱ|@NElr$-EנMl :KQxBs .9=u2nRf^P(l@{@=t"8pR)h:sCW+yJ7'·k0b^,C-ywΥjߩ`;Bc}L$ YP#>ptji(YWg 1\ʯD7TڿPl7|lΦI X4Gx ̫`=8AdIn0934hCQklHhH4@wK[[.Yan`wR*)43Qйn NGeCC* s&olW'=DL+ =8 l9i 1Ȅ@jA7b: Dc 70Q3L-L>z=>p,^L@dLS 3u 7^Z:Wa~ǻer3zhYh\zm4ƀ {(ܨ2cdjI+NԀ%9Ώo>jUUltiU;rjٖ[?5mOpjLL-ԛgziig|K3'O?-k;7xܺO&˲G*/zSk3!:jTwZG3+rYYӄ8Vs9=EϦz6 VO-·Q,y6]= 6A*NQ6ʷsئm4ߚ )T㖦YZVKu&:v8+TVDBˋ1]r]a=vrRWtU("rW5fM7, %fvJb˭otX݀*JQtdIݬLVh暅!m\QAF?dK،wNJӸF_|)vWz붂Big6Cڀ)`i*Smԧ:o\|LY=$h(WҾ3AꍝVh#rb/gp8iY*]znp$ڞDxje8O&؀:z.M߉nM؄W$c+汰 dK")H7z 5 (цhb022I_20gSp);%DG!iu.ʱ#c҇ES,8> FjWB?QB‰qp>zmŴD[Y䂏d9"Q\ƬU݂ƓFbm)"Cy·۲գG^oJ&ghV7mYNj\!bo|x Yonjdܪnec fu>8o튶4V5 Ĵ>haR^E}u(5=ak/AAlSïٻ)<54&YLx}>iO>=UmiĂW*& BĶΐPIc+_1q ̍:Apܝ+{#!wvf,fHvv󷫋g^=,y9ͫXp {R+L,'ĞiGe6 ]3#"|X{ߎ?TĮˢɼ a=lH.JGw,&6Vɨ0ugU\6Zeo*KNY[yK*#,?#|uO҃~J{զi~hEi9O˔ E|Vju~NzQpg0(XUwBӂ)un@Mxg &{Dmʯ\[":B Ȕf 0o3[#D7cL#AcA6&Lelz< ³}s0)19]e %i/Hƹa3ҹ@ q_8tOy/yM %8&- VP0sm8¥m,< CGB"Nq@=\4W@b~jCF@-&" ⼇A.`UX=P)[l* 륆yXWۏaKu?ٻqV'{g13wDfr9~`È!tǫkyTHC$^  \ T%jGJTq%ra,{ Hi.ՆR&\ ݄.px 97%G%!Ϟ-WbDŁGVo̍Kܜbx:)j ByW$ua-up:@CE%'2EȻIƚTȢF7_ԓ|/ 7ŭe#> #1Ů=Z ^0ݵ_j\Yyn\%lTq暮l$Jt\[J@&&E@5^{rk$]# j%Wp4I7j4p5!Z]ce:ֺk|A`@=hr79`yC$ύ5-Z6kt(E Pg "(᝜ɕ&+RQWg)s3̣h{[ޥz-x 'nHG%K>7J$G'qʥz7#Fa8OS&MhBgJ8B(8GYϷ%BHú*_|I?(cVD d ȈAko`9Yor@h%Fca2)5ϏX!nDR ?Lk. rYЊ#{EfGv_#b@wX5ph{2U".e$9mWyLUh*P*QAH!pJ3d4En )B0z`C4YdFWMLn0ȍ~/&-s] DZ݉p.~8ߑ4SN<[})T%AVlO/ [&R"J~#u5c. d_eKu债y>Ϻq?SyB)LLvsj:tenRކ{ FHd2u۸p:`Bb{KJԃeّwfD4ShNmD}$L$G=B ,7DHrW60N7,ܐS>C3QH|+}Co~`XDapb8_{|A@%4ad7xˊ'Cl*4#Z!n5XuS}ЦBgʻ;8>:sn vʯѓi0-ٮʋx]IqT /cCt8 8(9$Ba 3EpdRJ߄Z 񉘇#!Y"W r@Yeˤ n} ʟ;aQ2 /[]ȋ:ɾy5zo/.aqNoŴO:Y^Ƿ[aaC,P'LxhsP$toD 7dl'~wf#bEFZ<[j[߇fC–01[ӰHEEBx@!XQ9ln褃DA ^L888OП,pxN7I<@Q=5H *6a4w< ˀ<G搴R"͋cڜ1z)񨱐i$ 1rcW6$46]1|2]q?TZV80ld{gy73jnU$^cSNAgg?xmAH*QUj~&d<Y6mPɰPSr%k#+LyS}dc~QƭC$_aAw ~| E^DKX;1~`TAY/PKoS9 PKy.F3angular-1.3.9/docs/partials/guide/unit-testing.html\mF_7Mfp#)c-8'z!%ѦHFyyf/H#]]/Otμ[6ae׭{ɢ薛^M|ؔ_$gdVW]bSanԅ+ŸZBEx?G?};_䡝5Ezxm|^M}F]t?Z77ϧgw(we\kDʏU٤>չ\,ZM4˲韃uȻ|WU1esnrW3ؔbB`[4wn]oC o _թ`_sU햡\yS@S }U7J%nmpJwkK}+GmXF&$; MMI#l虑udSP f01*њ%YHFE9˜\( iE Sm%YC;ȆCry~C/6PzFG%-D%y:NfUfSWlrأ5m<¦(<(UMZX,eQa@lgmTsQ^ߟF}—ApfڑF[yq4'Mzn,-eE3+b[ee"4a8J YCq2춷UxQ5ns! [$Vg[˄4&52vϨ\`e>KR;v|_<'>\11FQh;DP7EgMIs([s@|} *'>Gl 娫:c<(a1hOt1+X^$롼t:8AVDT6t[dz.k7aO}2ϋLH~`#/YhwfuuM9aO t)ECRm5, Ō46kjc`?0H E.='фB?8Nn9dىgy>y{<1yrG˦,Zlk{&Ѿ|h63*5n?RѾ߾3AD,,ݪ>Ms Tan%^d+9Ni(I]IG#/^AtW1`#rgpX#Tjpz(hdc"2Uv^IC3*I1kRޯxtTH^jS#{{Kᖚ{~Q&sX0\E=?~uA|U7lǚk/zqS'޸2ۍ:QA,0^/0:CcKOc=+9?5MQjG#\zG!ory- ?:AkGA5B,}M}T*-HZo q>&Ofzd7y1kbR-a#~J _B 1iJpi?i!s֋?\Y/!)gp g̑b4iK4$t ruD@ɵjBj쾶LpoÇP\_dd}۪R`{ cQzO;Nn1=D=2FfJv*R!H Rh=ʸVbdU֍9ry֌!lyV۔`}i)pT(+=CvZM"lqcތ|VX1vms-B)J*|W0FՆ/0P- h2+-yCZr0ɸ OQH 8C[{,fH fu>f( ^cLJ =T6FyqOf IBHmS* GQ QB@X_-,DFtYh'Ž/ѳ3~pVvu/ x ?%cɭnZ6o!B&Mjjnw[{b /y zd-}p*T{h+:$h ԴHZr_[\@T:8t/<(C]9[9y|Tm-b"w :&)}|"c^axiIH2?v߰!>ŰY\{+9ct/ҷT^ 3!v- IO v Y*wӀ‹j*I<f8 }XOAv(b/q$EyQx_BሧB]}hc%%"fZNGLި[FzuwX &v~ ~$;xUK|RjL=е Fx cȢ93Dt?ړAf1;Rbe|=!1(E[fRi\Y^?L+V@u}[h1gTT^CsFoJʍJShE+5L}7M/kH{ hF9Z,sV8} (bHIqRCC/ i+q~#7<;IЁip1}ϟ}S<2ߡhr+5ɖ't 4ӊ.[ 7 G[UN%2e9Ŋ`?ѿOKDoAkBMG?yf`*8M10b7Z{;(hKNЀ,ÿXyEjEQ"?Sv'>Wi=e J`p&*]+sA*NF=iۍK=Eo%b u(: Cn74}`C/o6 3g`% N&3|^ųz x=<۴xS{\'Iq}jO)+]҇KmR~}a$+/dc؂g4?I,"_,D"M`+ZݗR&pɾbBe-&RLfRr/Y$-} =ة93&6.ίY#%i y3C2[;@6uX͙TpR!%l 8e{OD*79~ /\0~ ($4Xy/V;<~*aлC>f_kV8InLUY}j.yM\9DMᑿ6? t\(>5K_׆p(r;ț,?}c1?ٳ'ߝOd ~˝.Hu\V,"ȫ}#׵X DE#-n6$| '~P"2jf|'| ewy J9`DҞkX||E޾QO}2(b$vD5]F1 j ػ.`* }cp~lJ#N:ZH3k~0>5jCME3wox̜.&X'Cwq*8?d{h: ExM Kz+m{of9хk6D3ԁ$y <M94=6>PKnH2PKy.F0angular-1.3.9/docs/partials/misc/contribute.htmlYr۸ϧ(dtwEoN$;'DBl`R' duLQ$܏sDUWOMS4]fΒ̔m!m\TIWϓM̥U5i]_JTɅzEKh7gj S>~qY\W.7Ȗ8W%ITdtS]֬TLYS_\[]Jy:n(6RC"_$h$shډ3MR9h|.tj4kuj*vrix.\\$]>FzzICܶmDKN5)l^k,ca$d8fL"uSRW(1NgTd< +hdj N\Ý _oޝmERo73ked֬R,$ j0D 3KKe?\~>?rymR)E,ZBWʱv)oSiK5-s`F8gVUL+ ζ0;޿-ĽSl؇h?D[n@fpyrƅdj;eWʎ:!{Zįj&.x7 (mصQI/xq'.wlƍQu!?K>*e -1.#SH0`E&i,] ɢl& }-#kMQ56R ?D-Q)%GhO!9?vYɤ?{dcq#0y:I6:+KAjq[y $"AmN] X Y3E+6U!nKMvc\#?yU ?%1BUƛ#e>d,v!- `LOz3Q%9+ `6`{\9SpeܚVjZfȜ9pQz9ur%W2UoRWztٶF@ ` e],p6Ya`4`+igy-a.JytpAa>L򈲊͡EJKCz:6mcE2ֲYdٔhXI=06[ ).y f =wR,jL 4j3Cو5brJPsPn"F:$Qso}.3mSķ;1؃ VqXV]5+p)3tFpjNh77SР$Qks#HUf,N/΄jC+i}AN?)*7kwHwAD۷{`H#;ʃJ.Ȭ"r2 19]F26#zu!W;:[xy<$ /a4"R~$9w[Ӽ?/rO EoA`[R=Y4/z;J(z$B1>Țk22qB"d]Z#NV,!{CX}UcmWt]!2()}B]e::whWIn13 1X V;ٴtf;g\:Zc#0w=:{`1̗,E'SPv;3zEb{~n쁠hd^ѤܻU,vhֳ4L[y.C`vmthSF"ݫ'fw:5TNf"!Q|+qY}LԾ^Ԣ S oϣ>?PKda PKy.F1angular-1.3.9/docs/partials/misc/downloading.htmlXrܸ)%wDҲ/z4)UMeol!G !a 3y}|O#kJ3` ,hZ>V}S SFݐw$oR?{uZɎUQEe7u78Q9$V|pnz\$wјih5O9Y}W~x(]KV{VR.,[B7HN)97Ъ1*bnI\$qAP?Y\ϋ^fay寣(VN"XѨ |.Z2 VAPPD:#҄Qe/ zEh||_dw&T\F_u(zcN։NB34T,a)!ViP^IHg+^ +ZmCz^ϐzQhgf @.ʴ$~;JCl۱}ʨ+>t(٪Uv`γ7?T&[U/`&n=dJYwɮ-GP|sX r ބW^ c䠺Ƞ ԽĂb+xYHZ!'&AJ[a5!xI_B(Z0-^Y&G𮺹:ZK~EN9hy kHL"c/Eg܉l` Z^iF(z姩>eDJgV @H`+A@u\^r#aԂC^3lz,tF+7VE" 8S$|uMy|#ղH F -P5!ʥZVktf x;83jIou@#Da-Q *%9H+1t kmϙt1[vTۘPk8\m$Itߠ }AGSAUΪ{S3#Lg.twjlW^k;!z4o}G>0PKonn <PKy.F)angular-1.3.9/docs/partials/misc/faq.htmlŚ]E+r0ٖ`Y30fsYRRKUj͞% ^`ZUYp/ttUl2o6Ӣ^M~Qۋt̻鼩{_MͧIu1'>y'ٵof1?L>u躯>-7۶cf}۶ewu.5gY}bZ^ s~]vfbZ\F W.:CK{1]_\=u绾lOF<ш6b>nYyx^T_u<ȏlOd0{響 f:/S~RX~ou͏ݺ\b~".v]*K}b]d0^zߴ7m[ix6ηcthEBp V ]܅)\>N_few ,Rt͒vϝ5?jGOx޹nvZ{UԣmfynS.w{"l_TroxCq[\([d$]f.t[aYMlm&fYTnz$5̷xX_)m{V|w_w#Iޭ4vqvγ.K6Mw;l@~0}ٰjmj?X/޵H륈`}(Kߢs3/FA yۃ[5BM;* 0_[Hf/ݬ\- 3ljz& ąMR-\);:92)r0m7;Jv-wgqhbm; ܾ4ۆ9<\?m(`&@t۝Ѣc21fuSn `svm^ ;g>s3gIf)HuS5Cv: =*JޖXi\$M:=J]7{TWd0bu4ەUz2]9PyWyt{U@ Zg1,Zqϗ[l9OrOU'gج-t;_Hܑl+=VUj\h-vV-s\^ᮣ Au=9i׏LcW) zԴB k^#mѸtJx}h}$@l~Ƒ;dڒ  <ɾ-ۦ\F,r^5& ;ܤt.{;Ĵa=hC;$K-g/ D[^@y"Bu=MYClܦf,0Rz Nwf03ֻvڔ^9)HU͘MU5{y|Kw],GHɯ6cບYzhcH #)(4\琥YF@+zHeL%kgU(dLrbaZ쐡wY,A?wO7fCL\/N .e uU䒫H aeUнHmA~((0lRQQ! W;9Nu1?٤wШT,dLX5.1G48d3 0aZ-#YD0o+#ʌgp;;W$cdbOد3osKR(}#蚊ArH\dC8Ev ٨ ZbM=CjՖ2swć)$k;Gp"wi' jg<&sd[FՒզp3O勶+ʥXAR!lΠUuJ4˷2"v=y|Eu3 , (B5׷_]\moy/gG]HI۸sZ&7eJ9y9b-$L"6􆭜HY̦򶝾~u߮;= e%}- 1XhB9mJy/|~?R9ɢ[ /(tS)0+J JJ | X!}}RЕeܜ:G+} 6R|ȴ3Բ.wHl` ڨZTxFɚԆ1 ׸Bp ִ" |F{2qHh^IRe ˾FD%jX}kdb:'=e.k=a7'**D`~Ti[l[RDJ4|.EhT+VpbWcjFXv֨wΚ~27 A3+$[QHo@JRTe@c emZÏmP(O'5l* fyoHk@1$d{PN6*"#p.cXWxk+ږ7{?&mb2jȓ] #_ 0dme)'!Wu ߂^$ycrh 2 "~0Tݓf^-|(o꤯GLps8:}mZ5ѩJA!86ޒ1eBmЂTJcMKܻ/chp].P Wu`?l<- >RAZ3|ai: @@-4e%= *= ^mf` "Nc#<@?Cq-Y;LsnYw7f{u}n[8!E7w?aɓ1{nsk\8!lIΫš+8 Zl@UOD.y (gmBfP$#‚L)[?T)3rh,9p95i/>cgwhim2/|tH/h9Sb-1AVc9[c5-M͝W%'LW ũ9$ #_</6bD㧙-MRT 5T:'6q'Z=59̇uWRPAJV4S'{YᄉCVAR:4Ԭ5t8%H,O)6 ҒJ-c ɝ\SJ".]:X\02[*-TPS뼃?eM$U߸ ǿ~i>&S+,MH^'A: I' ZQ=YԢݚ覥*nZG:8~b̧DvV(JPf&zfӦ 3-Ǯid|>*?u_BVub >ۇX)jn]bv.> WneB' Mjp#4j_b GK4 DTt,.tMm#R|:,gP+s.y#J}C[(%]egiVC=S'vh\E. $*5"=N MkOLҜ=9LCg1=VMGu(1{[J4an8HSVi&lĄAC *Q66,泊]u?6u+дf!Bjuxd3X|R6b܌K(6k`8Eԟ&=mƏ 0 AQMb7&OX3ٹ%umRcBGFõ@KCZ19*q\CjY]&l9ΨTeq4_PKY|95PKy.F-angular-1.3.9/docs/partials/misc/started.htmlVr6}W 8niIv$=tvI_<A@]~IJ2Iy~\m_i!\lMy.\'dٔiri%,KzSك9*5KbP=:irLoY2\q6;VUF &G?:;85WnrvxLht:]?~˚MGqqm:}G˷onvyaV,>O?~JƊo@<^7azfl]U )C&siM앃sV8Pʐea[g`'܀`ɊKTC*u$5-2Jtkɢl3b3laW͗ $&օJOguUTHn/9AFv ?{by}oQD>b_~Zp¶i0t|Z;8w%G>#zmW_}4諍G;cm\.QE{Mt79RyW߬o0nݾTj+Ћu߬;?Solq,nOUU\t{ۚBy8]XǯUݬOM~v˃>T-”|+ AoKR`;8,FaknbGUM>KuC>Tu6cU\Z+lMvY!oYG>+7dU[*Ui¸+U˱`nl[h?+nzi}eYi]Nmm7ͪET.Bx&~.vP/ڛj5*Mc3褮-׏m[;Iv~h]4MσAU \픃GRI@ގL1:(jZ}o2 Q SPCWj XCu~ݚOj,o*TΙB**aOAq3xM][T\abs]Y4 =X::c0e $P;c:>,iܱ-d}Km旟1G_[x P2UPi!8xwroxۯzoY%3@?RtV>UA"1o~ŎĬ#Q1+wSgN0*8ui1/Ѣq@=0_as9TQF0&8u( thRc[a$k9|~Ҧ^ QAn05S(6}*e6P$ :@"+,~{!_E+TWavJƙwpi @AMgҍ;E<:m,!D\3!_b }A."­NDڢ١ěŨ|3'k-:?<-a4 3sn^vcHe46w7LW ,tA& ^ H0i6 qYfv;R<ݖb}=$kIod .  LRwp&ESb&rϊad, Th{ gj$0f 0 y$I2"%Am 8]Lm;!JPG$E(Lcgf1c:ϋYфP~^ӻUd9zfNB8ċ)"yH[?>spY>\tK0$!Qѽ<$^?a'xB{e-I7"-w3E}v ̷t9@bxN#BvBxpWf-1'#; >fnS0 ( 1y$+_ hBcV8#t#lԈxR"ѼPm%f%ƿkAp@ L/(Ϥ{_$pῠ(i5ze00>Lj]Xv.d4A LP4I!i(~X?RVar،NAQ!Hnik~ #,2Sgxx}9bo~3X@{kQEL<^5O,k&ZLFm@Be} 8b]o։VE<E9$+&0/[UXRt%`!R^Gc#c!7>|lmuQmDž=%l'UR Jȕ¢0('} !G!G(!ŧ$E:y-- ۢ&bdrw!?"En ?m90sBQ9/,u-'f(b&J-Yhdl=P'rzSA.Iw!|DbQ˧gO = 4gVý1] $8؟,M/O$z-ǝ'e IHD[_eTyt3P7fS!ny#П_p*DF7nUu2pD!l[iPŒe4Kmxk1"d"61%_ B4#Ţ' k2$Q"&A!1#X:PI5Z\i5}ۖ  S[}BzY<'ujk6/?Ió:p ٞDnJb-&#OSxBJhEġ| ^! =!sa`Ko?In.' M9WHVS]MfSz;gT xd!?'&7R)4ņ ٕȭX-GX-t<?oICu[QdK *4#3~C<{@Bc4{[P(XŬ{ضaE\e_b L@-.f X1׾55ez_ޣ1<[,4#O2? -ttڱ`lN()JIͤ.L:vh=?_Z|wNp!I QPo2t&!tό4 $vbtA+Ճ lY-FA|28UϞ1WmMCK@hVЋ)hCk ODDs,e/r(@l@*|u›㕌5`EnA&HpaT廤%GLLh>2U߼U*RRs}hyc_Pqv 84Rp|?xF&[@V.H?iN ~@>S*S-Hf~> *&М xQڡЂÝS 8 q?sR(v$c7 O]O$@:G2?FP󖷷& FjY8CX0%ځ^Q8*9 m,'dd?{^ݞƠGL;}@4z@h75y->|,&%m.\]*;b<'%vljC,}_$-RC7es IT3%쵅uЃvPXc3뉡x2#ZC؆B+Pۉ;u!l2򂫬QM|TmxkbtNQqw8U뿏v^3$s#;21É RanD  9 -M)xtK;06IbR0ٴMME2%E q1SH@|(Tgn TBf;t,)눋%@}J}oOwUeֹnvCw妴>?<_\e[hoU~Z6;6靹ڧiW/R l{7_*+z1xj=0**[w}{0 Tߢmӓu]u ӂ֏^r>R~oz\,[ Exj^C% Aި=|6JH3M0ToShpӥ NsK*1Q[]>; "nWr{x`¨-VUetߨ=ԀLv5L#>]8cʹM*ZYhla;m)UޭU5VTb[ ݿ@u>9C_m;7G:j)L!qB;TOLcPʐ誎D:`(a:!ݨ Ƿ.ZVr*ZPMM$ov nW#й?uF)(G u:|Qj5ŝ.' woAٔo +UQ'p$>oڣAtr5ߤD>/0XA1LK_Diä8"f"F;dhݴI^E?.D+_}$,G/a(QތP#4$ eanX(81g2YD//YHS,V]#_E,% y=N Ќ)$2G4Ɛژ"p`7 ǂjuRM%͞HQ. j3]- @ۼZBxϟGMar =@ Y(Pr"[JmLz%d=fd szB(L`¶&t(@BA4Q?iU1DjPYx".Ck*M c*WA&1w PUlmPƫmvwd%H{rgeЁM*TP|~4[0I;dZ$nh++er(F CH9֢ !ޙ11i1!] {7_ 1[, +G Qq |#'/'ci1Pˡ]9xp=.s&d 6eR㧠%JX''ɌU@(\.`yDl_L;j 4[K2йTPg9FQ!_w^ oB][ h|Xœ-)s19 q\ 8[g쓫')`?#AJCnsJWUx_MVK/Cqw77&ãwYemw{@/d|Y-@n>ISL`Ȃ"勥dʪ. +,#HI;Hzrfrφ9aDv 5~0B(L,e2GNFc[ 4tX6A?Qp J׎Q+l*H]뙴38LcqͱԴ,@}YȠyaE}Zp .0M 1) [hx8e LiiqKj;N'-28s)2ឍjλd/!31`O7Pb) 9fkwt*?fIiL`1 Z(jL[|`OZm+dg$mvtJ cz,os7]D#_zvkyK,WsO& /JPs9~[ Nҝ*渼էSH*VWf;Q}ES~(ee5!j2yJ!v,)G]|͞|w^JP84bA(³$Iji(XALOm,Iae8=z֜ RFyq=c?ydALLϔ7W#bCFkDk.@m&5fq`;&ϫnD٭ܹʴ[W3 [7uڠ"OF_ 5߃yE2-m (bɕWi1챣#DF$4S]Jyٻ+ `/%[5MYN&˴YmXOld W%i3zį'I'"o\LMST&uʿ>؏%~.w>jߌͱoݺlO?zQsbSbQ\ǟEft]Vŕs\3or?.tmgi,mJ!i|^tL2*͓b1YEMf08H=`0N6Pξ-M|__>Mi rM՛du0? K~N>2c06I5PF!lc\^\(g.JF"\Yi$NY4-g+G|\-*LTEmJlsc2KI<6_a`'wşN "]PhӸ*#a,e[Y+m>j^fd.X˰&KKΓ蹽gpQ#z@ܔE-CMԧ7f4 & S9g /G-](zf\T$ ƈ Iz륕]QW&Mx yǍ% NV7򠅑y )匃LrAA(r :F qmfI;oL#ߎsٜnz%cNQ.jWsUh9X( 2ecD CzqaF 1߶+2CMO34ujPxT+ԍ *k v6EH|y\ze(wM`ed oKuϋkW]i=wrGwLd.w #ɖKF~ǨrTY'SWɼH, +m2vF6877R voވW<-K呼*giOar%fpr)/r=~ ttZ*\ "PE`[|9IҊQype0 LPT0XnMkR,]wЦAK6td "ƒHP?bc9-8QC08]QCeYF/ |Q zw5\2նM{SK4V6 O=M bŦ+6C~92hGW@7,#E@2*fmId>WVB&Gh5=2 &W)vbK&_vP%/B(96\ -hCk+#/Ӧ-'WUy&fȠȎD^u5'l@'8/,BkC`̺t J4bF-] @6_GVKl=*;Hli:4J@Zy\oSv5S[ l>=Mˠ+eeI<*@Y͔ğړ)$¦: f󤥶-",jPq7;jW?Եp{c'7tsqhϷ6g:RWEī YHWb1*oFE½Ȭ鋟tU!"K0Y3ta)9oXO70w\}MB1=m}wڎ2+;@H cpyHkV P9]tE>(@4&[3Rۀf 1t'X^m@%T\EneEP2[!q֬ڲRliTۚfQ{LJЗ@'.R8\-b, 7hIq]#7q%hz%_Cq8w͵s 265,!%F/o'P|%7ȎAG2bnOWbEPZ5=͝EJp"Zz^2N| }I.ycYE֍bA$m" }F"VHs&QkDPo3FLz~IAgl 0$4D n BwZw$Er5ƻHs{h"M3*>uk}N|T=Oٱ&PٙfՁ0 _8^@h 0C<6F4iD6>a(TR#a"\%tx nj eEYBZXlRDlGy>tTbBZ]ȑAuz/(vڲhbaH,x{;daCswX51d եy)|¡XAxFɮ9pjv{(+%[(z8sYM 1djӵs]`ybې2ENlͣVT vth[KɃ[/q8u0]b'r#,Ts5ܮ݀uq\32d/F6z3(Z}֒E .ڭ3P\RO  "k>>IV9`kB9z7vbv(- 'zʣ2(|Pu_dBMD߭`wNV>C-,)}e +Y(x@ KJQS;@(GRiwLfJ{Y}3lG>x5wnDF5ɯnJXx|u`/·a?y1pu6[C@I)5֗A[YH]ݘ=Mс?+mLm׷! i\ t?oE4eS} G jE@jM(_#!#sG-F4L45ʷT6jҢ'{rDٍb'O} v̚>Beڢd+ 6a-FAyJn MXnό1ZrP?p-G ^cD%-&YdUxBb>} 8͂}Zlh'8SF0H3،oo؊"]hTxiY;L(@YPG>%~`rӜi#XbUm A6K:.ӽDwlV $GV+\}\bnz (AmC8 rߩ}s`~;j@5]} !~f'8Wk+S>{Q=tb$8BG .q%ӊ 6uI[ P#0SxہĨ;h5xhD_kgb;hs)XQ.5w^|-9)h8߅)AQHw6E 8(7@IBal4Dri)*sIlp.T nteo mP:@,pR!A!acj១eŭ32z̗Zݭs2r{b((69+hwhyKΝ-g܉pPŭfڒw\:~-@2i;Uy-_U{60 z\z[rH5Xc187g8,SξCWZbI_e9۱ ANg =S*'CU9jA-ډ@o)E/lJ;[lJ|ԽaW# M&Ozd_Hi>8ԟ&]^:H"7Ñ|d~32m#h77FovE[ Cq9jj9 A Qa!apbg|Dr4E /tN<1J^kk{BS2U LGo ;q{EԮ*?߻O_ci7k)GOCHdž<u_]g^y"UJE,/A{B f<'oEHAb`MZi,}ӣPK )/PKy.F1angular-1.3.9/docs/partials/tutorial/step_03.htmlZi_1ci7E֮D2Ӗm%.WRCr e)gՑC*-=Inڹ>NWڭEr*U[&کʵn47frrS:hYLS߿LTʕgqW.D҅SV⭪{{ӯ.ΕPx3ml aTEVHknFMhepԍ.e{80n*vZCLѽ)FOfS=nxaTΓ$(h>(\HQ'RlMs#t% I4mK!4B Y4,NQت_^IA[RAjXPOXl5<o J6Z ~穀~^}v'L8eX,T&[gbeL>x} ),YxM˝n-ZtQ`lSgn*:)v"WNeΊFcٴ)RZ s?3JNJצ:5n~'XlWC\niLpNcW+ k8Ó[̦"z Z xް:QH4(T3?Ϧ ,S\؝ta~bPEX)1_wb3|\͡ru]Y 1~F1B ք& $ coqOH*+LEs僕{qj|c{cNL1)P?B6vL&#['p-z y$ PG_fMi:{fihc;J{ߺ$v^ l?ĒAၼH{VTwwAAĩqt]+wwNJGpНjt\vҫoއwfxZx"V \|wGὖ&i0Y8 ^ Hs'"FBZOԫ(#A8y`LrFaqF0U@B$I8"`!Q| ]H?fU`Ju71"a[Bؖ ީR[ 0$W%5XΟl 1[~@O:Po%H-TP;Z 002G O-ɛ'q1b@HQt- !"EJ!Zt㶆d*1ks28^35msJws%r#ut cp! y7O⍐|2@k>o>\|z}1z:C*wpǶz&ȋ?!ˁpMq6 R =a f VD1U#ˑMv5“0FvEVĮ } ;^q1&B[ C6òi+VD>m*~R5WcNg. NK,0RZ@hC w뚸0eű䄒V;!DNEv\W~h.l,ky %Ӏb *`JJ; D@8+&,uc]җ,ˆ 2x<4;#`L6Ujj3UE(v4'JUO뚿w)\O@gNLU=sRfxAQx Jrl^wx%1 ?֮M[VcDZg #LU_+G*{/4b y~)F~Zݬ@mD4g'IoB"*Z Ix&buj[aAls!ASPVp ]oƉ%Hk!7oPۂ @]`C~6F/lWbj+„|B=h HoHHm嚠w~F"q\r)rL4Jޡ8dSX2N"op}n g-^H~]& Oz9# O:8(4ZK o@ݘڈbޠ(c8R[9I7(@XD6 X/i_%r$9ȭ0ݞA0%_3ĉ#)) W0"E|,\/G&p_P[dv))1V_$+x( \H2{vwVlE{7H5)&ꈰXn=5q3X4U!ꁅOv:Z㚾4r[u9-r&oy@܎1dhtO~ƱW^d ݌(c"D]>aQ(&,=&:&7}cQ{/&C+@ucpC0((|-goY!_s(<wSpx:.ow|xb߰'S:HzhMBքaFWbtH([!٨9MAn:&j4 n/BVnqɦAI1hkbs &fY[:eztk4Zp}E\ct(rICW2)1/t7c☴JI!"i}6|ia^/$z0'#?10]APs&SNpeVW+ܕƃq/C 9Åv @a>IwJPWKO,Dq75vhӨj: :.AQު }r{ĚI\zTX5=MK7Y9w|D{ 9kU%QEǜLGV*h/ +۲X5˄ x2z5E뛻 q-VuuA7~tG|gҸx-3hHuVF'K=IHGPF[vhB'ow43`$ﷻj骮Kw</mjqR:_6767v'E^M]TVgcWoϾ%qmKsJka_ުS/>?:|,5.h*J2S.ƌH9]jt6~`m˕4k fO+Oc;{#TN,XϢ(6QP|tdePA[Yt*FMeT]R3SdȰרJMY;eIQMYW m60CfI| g#rQ"5JSC(W:- ΨSʔkCf9$%EjP!-Xʸ:)x:.gd8`؜,ak $]%+5/n.KZWfzt U!|+ܩ ]+eyALx+V,LgR(]"47^LDtg@ fWt@T9:80_Φ L<-ưW:"/ *eedy A= %X=Mw䧦O~jLOItYT5~g2|mmS|BQKnt/eugYsSDgtXvɏ@wޚ bc/mYV#$e8ɉ%Hzy%eja31[K,b{)D+uNݱ,q/G@֖.eijyUo|=da@A.@dŢs!]$> -"1O׶r5PHgvSEN\~ri&jQkDTo K';'G ǮqWAjrUr:N]d4P2\X \T1ԩ.8_٘b8wi /h*Te0+IkssLE_lBn*vî6-G0##]UpH k%փ*m}&D.@(q/(;}c`L2tzguzwe|ȾE/3XJ9;s`q$SyܹOP:M#$t+($ސ2xUM7LF%'v$z寃CG8qю\)|pcAZj f[ՔcbPTAyƗE-$M4,j7_D)/$H Z|[.2|q/Dv~$ͮDOWJssRli..,(Vz8O6=2-N ӳlڅݡ PR% yq3bl{4a/8kk\Q2 TܮgFApHuRbg`PtI(`WSMV+`2'MbfAi#!+gl݇l)j RVMns4:)+PK- 9AQCg Wj O,wdv[i94WhLZ# gqEVJѴJ4 p0]ktT#?SG) Df voAezԻ$ >_&-<&)=<廐r(iBĝ6>B"[ȩ/VP3B2CQ? ')6x}i-ODp W|8~]~wR#y*ckg+Ķd3#Oٕ+Ԗpf=3}ug&_֫.^Q*)B™Kr"J]| A-gE]x@9|eyq6~,*8u sm]i:HbFv(utrM=MP6fE<=Cbj'CNi f>PpoѠ\ǣ׺ZsSrB+md?;VnMP?!_]^9c9VL j k5Mj{}Ԓapd&f6 b+PYTWK_XX zF[3΋YpCG(͙Ln)M[s!>AN1S+ds6ٱ8e W1&H.tk]vgu{~~! p7S#RxY'PE۵2ǺuwD<,*%r*S5 ˵oq#Q:q̋[=:E 0,x}AY^FjuAw?ֱ!5x)1j Kx"=RKDŽ.Bq-_aƥ,^ X 3TeiJ65̕˗" OjY^e xaOM:}FEEisw}0VA39ӿo(E5U&g4 N.ᖁGA5]JLGKc4b?wGT0д"Y} _ t͚e|X2," `Ҕ  Ʀ;!&Ddv-闃#0K;ІdE61=Tݷk_My 3CkjlIO') bz50bUoEyMYgT(4,*`tv=͋}7fǗbձ)#p4}O'cL&P Ţ(ũC Y+fE+X:u 3Q\|,f^9[edz7Xn㙪qة=O;>Sb>$<~xf?EuevpGk~hw~y_;~||߿D*6D l;Xł[f?xHIqŸ??,(*9.{h*zftDC acFK2Zٕ%|syy4\kkg5HfPޯ=h0¥~\x4rmV ~i_kaYs,$A̸3E\ N\K{` %iݚH JȊ 3xD`aSу? [/…o/J)Us%LXoGfXu3XzfH" mn}dRͩul%drMUÙ4#}4|dQ\wxOYp1ghS!tbDZdAd"@|_>ԅ 0:d>Q \;/eG5#|3X_o% P:ꉔ zAuP[VpC%' `hɋU|\@_ *_HscmoEp!djym gE1HC\wFW;``E4]ح`gN.Vd@/m.a[: ĎZ4B@XU%Yp_4G8$<+D zYd0:}1(g /ab`yDRWєMaǗUtYh4`2QrVuWBF0 tfGxWKXPϣ^Uoya]^_GTcp-[3[&lu,'/ʭGSmkuv&׆(Wj?еx@Ȃ5A੽ [Q>ʄ=3R z, 6H.d6 ܫEC?V\zx臧`5~VaREr_ܱo}&9 CyDn(?pbJ5$qokR.eb, soh$b\ tX0ݓr(;]%-T5 LQEI7$߈SG_ ]ÄE ^a64l"4钅#zZə6 !\slr'Zj!D,^IP$觵|k#DW|g{ݭ&?{/@4"L&M1@ʀM -"F*6h@A;c$ C7Fb!$}`,rb* b.Ml[4T_ 3hq,V7W>E [}TM dJN-$<>˺v3gsY)updLWs*Cڱ #wᎾL]֬BdsxLG/l6wccty0_$VgfmMxԢb}C]`B$_!o㤌G"Y.E z>ÞWz ED(ގI$%l*]ط|s+LoGK& qd8]M@K_!6k7Ш0P!vxPbpe$S4z1ݓ[E 403`4&]""9+ 4;1)d D%*%;If Di`%UC⤒]wjfUg L(>mB"km/get$Zm,Οd)l $B3=?z4.&2 P8 J8&@,fU?B-CRwˎ­/N4O_ 2Ԇ3KC#pIa3%$JU#@w*t.tثnׯ 'l&430^"  A&qIŃo<(db L, !}IQApiU%)=2jLCIgs1:Þj @bȲC;QDV36gm4.p?MRPFx4ݳDZrf%C)O9+!x a;5 % ܤ7QmC0>ķ{T/ykAG ԰ˡ#cˑ7G#hp{T&Tw=K!~nQ8(nQl+ T\BIhn&ZM9܊;pB0 ݟOZ!p2PưHt( ?% 8w:\$l43<|Y ŅBA_^}:J`Kx®,,m1ѴkP&K-)Igr ,zl:W @loz\ E,Cwbg^tGNq  WJx((TT, IQ#'w.c٫գl_h+C ds}7!1t*T--ՅA 8k*I)i8 LxGPFz5%<>+P!B #ݗ/t[CT(1~jdh-)Tl_29L}~J>9X:Ý eHk$$pZN@7@# czvipnbЌ _ȃJ:`gQnTDMA,~רBKuLjHn'b35-? pV^@M}hSa^,7,rh.s%Ɖb4nZwNzp(xA;lc&@@:2ĕLSOua'g]٢,at[M[N,?+^\'!Ghj.sq͔0>Ci=@-#CmGKE1 7wPQ77vޱuL^0Gq~bˣ_xC}}^_=ܱGKo_Ь{ n8;rlyw=Υ0KN |lO>|P,4ͫ_h?C7;*|{g#s aMă oPp4U-@m7LlRϿtXcIG8@]k4z`L3pzhKeWEi4@ z` SL34 t HkSwӻx< V[o/F ]-) ϒyÏ?z]zw(*uߐU1<4fNH@#U9fQQ6ltyô8 Б*iB*צZd'E>8tHaãutvOgޱ#=zr:;@ZdHϟ㹅j|PYFxWg F9Al?o(O)pu!~ {Eɽ8n;hjH'Q{0O1ՇMbj$`JS\ėgLk%@_j9{NԒH]&,= J"iB'iE< J{u2#$I-7L>2#2 S(mRɡQDhoíp98a bY䌟Nf]&V[\={&9b*ٌ,;/Pp(b>z)Jvz֥7г|;$ '5ʀ(A޳eD0seZ.rvvV2Ak0GaGWԒ tg{P+e$'_ԴF&Z)xss]:!)7bN9F ,1{1KKكGA|{R^Gu9O|fOʷ10N\N:K\.7HRkf' DCΖbH'(d8{iiݰ,~TeKLU`3%+|VxRMm˥G6f*rZUOqL\M?0KօB:#NAF2v qҩuP2s@Hcd]jЀ&Cj0rb?b/2j#N3݆ Q/zfV!c~Đ6? O ?ZwH{8AX{,0&A nlL`׀e>`p{ p1Ξ~KL@\ 0/> {'19D]o c HTF?~1ℑFG`=z Gzfݒ'c\oA{(qB*zP& 7GX! 6H^f'V%ʶiGZB잿ZHS8Gޒ>΂NsD>OD5vmJ>oxlV?t<%`S„ Fċi[۱cz19yrHb =*GH T3# (G\Txx}g?,PK "\PKy.F1angular-1.3.9/docs/partials/tutorial/step_07.html[VlU.kP Ѯt0%]ItQ$CR%+7! IBR*⒨{{xUO^5MY?iLGb=N&K*;z]˷aVl4_I,q[}ˇc=i]gEq4}fYRONeU!&ej"q'lWROCdU>'trkfE1'`p:<}zbd@9u~@mئYTyXaVŤ! YMhI>1MC,b҄URΝ[r'Lw!ɸJx65bޥJ,%Yۓ|I~G< dU̅xtY13Ny|3Z5"C=fRPU5)cms ܬb!K'ꐒ1Lb[ }"gY: eodҦʂHMRc8K߅P7i(!yl4 %T6@ i _}bS X= <giO&/z.ƫ8Y9qMagMZI6"f0r(j|:Bk*/1t==G$WES7URǣ]huj~lnn`j ¹k9W]#Ww퇽fu%.ֳl@H/a an| ztIz6ϊd.n-[\Tkһ[\-$[8u!f,b @fhVmrx?;ؐlFqvgy VȂ{KM}&oJܹ⡄⡹!PdԜp{׆X㦒OW[f@[˚óP8?6N<[ó oypJ_)abWNRW6CVU Gpto%0$ &Z*@&4y)TLf+soHwd+Gsߔ4?I%MxxGriѬ"8V_&hl`&ۍ"dLB l!I= Dmy.u9P&9tGy5+Å,,,#Hl@)@9m cT*|@l&|+A2VU1W51ړNnxt)[sQP٪@VPfe,o߫c`f]D0~iMG2t6IKd ɨc~4O&s|7W$SM 3f,K 9.N$< wTg)Mmz$`=EStDlE%qR|ϋs]I%Tr=`_Hym-7yJA GpLLN> b(^1A2E$ y*LcJ"bz[J9 }/9 I͙;ܞA*[1 Rاb8.h:ng`tmpM$G, 1&iSl<-ֹ 7o|_ZZ0Qv[R9Mb҃;m-x{ ɦʉ4!jkaht! p/Klp6dPvk 3-u*o0j9/1i<~$Y@Qv8u!`pAr**t-QQbJL!fTTT@,p +|yU#A}{`Z#k Ht 4yS){T$19P?ڮׁD"*aC9T>ͥMY0ъIq!|s.>pLȗUh}"T%D'J2v 6}|7 >ѕ_r=ySyk<=6{!סA7Z)*'@5*Җ\^2vJwt4\KKQRj.xQ5ydsZ  [p# ,iElf⁡z"AzJ?,eY.)oE:.Ѥ$ B! ~JwVLbSWwTO5k"CzψO(Qswl JL-Ӡ2.Hg+\IҼDrQ@Wcf>w!8 Ӑ#<eF {|u:pdh;v7e2+W4d9tF{jo8q =uT]?U?$f?>9m}ykNe)y[%&M?_ HUl@ {3c=qC}d_eA[ݯoʮttwnI6]/y.޶K!"I.S} cKumirY|*Ys0E{_5nvYv<Α$G^'(u.q~ҵx2Nd~r\J-ఁJPjq+P_05wx|~kU,qғl)tMyR&(QV' #ғEƗL_t^^ ತE; r4"\U [;ֈ$A$Oi^ apEnYUh߃G$voW ȗ2Tȓ{*ýxK6VP936h;8#fA&=Zv=(q vp`ԁedLH(*C EHxrsNC[lLn1W䫒B<ᗲjpF߸@.D9X1*sȅȝZ)EGma1-ˆKHu*,Th`ZC=0`< _܉$jC}FJ4(lY?r*%>~0@1=Q)+|w -|N1Hs=G'^T%{S%|媗8O? nY4 t9S4i\NCk{ٯ`#ٽ 'NW/~}e]8N ڦu=e2D59;]ߛWi/gǾQڎ"Fdb83\d0 J,@nۮ`-}43@xEb SZ Ln܂.; ﹊zwq.lJZB >nECaBػw, $VX3KM*BCܯt=%i+4]2 ѻG|\V:y|Ҕ+ut*W Zm@.D˶Ю k~kE:Q~ExQytğq,6-A %jU"rE[fcz/8F+uR~nWIvXo"#ly)l zn±ηaѱF叢ެ.7noHC*\"= HRT8 :B(o lTofl8Nm"!#9J >WBBu~!m H[Ԣ2z`.K UpcLo9h6#ʩ罚ܗ4sfI ;=jb{lyF FʣH5V|+q \lDxT:f[6j~@ȕ:\H,V-mu@Ƙ"Haڝmq p~kihá}1Y8 ("VH*J>LٻN^wͩn8KıP7 -/ a63mQpKce!js ^ iM=;Ck^/ƿFmɱuJ"-P'"3 TkS@p:zxhCp _b{b`v:}4 ^ uA-_ Ƌz ^LDd˴($Fv߼m:L٫]tC=.5ӳΖw^ /:!|#'\^v⽇Z[,)|YpaM6#z3Q s@xIs Sk˒z$Ѐmv߽] nMR&=+^Ѩ U2 K(\cx-E/D$:p1۴׍OHGO (A3JȕP,fFnw^0WtڠKR_KB|^];](}dl&`Wsу#A%\Q=k]yjhCoqH ;]i,U8AU!JaSAj؇/ya"ggIwP]{r🋪FDSw/ۃ\S!b1E݌!ƂoÊ / #.wJ'\vwjH}&a2}`b0x k,T[jtx1!-jjz'WBJsh!Q|,|BGҥH0W %o P{O'Ÿ$GMn#[PKEiy@PKy.F1angular-1.3.9/docs/partials/tutorial/step_08.htmlXmo8_sl-e&in7-6)CQD[leI8 ᐖz-Xp晇3"oYnmmxm^Eieh ل賉Um|G7qV&NҪƶUeO;ϣr/1rHvdz.תQR-BZ].OdʤRx?iETEDZHceTjJ+[iln%3冋5T)Y0LW>:yk k#Ntd0B`iyZa2 gmJvZ)UΫRLY #ZM Je[*Q #tM; ml4넔ğB'i6)঺~c,B3iΤFЧ@k*s ]ΫfA_QlY\V?Wٕu\.bzS?&/l%EI+'B er,UYZe*qNMQn qr)L_oll17:;gqݡ 1ǐ= *lu;MtRḓe%xs.PG Ls>:T"fRݴf&yi12"SR׵c\x4m O= ╒?tTqd#^iUdZ.R.:O̼¤ۣ̚Jgaaڜ{`c{~N' zq~-tXoXtF}[/wb[dwdΑak69aw__n3Mٟw$6\!GgWQ k "a Z#ߵj zj *)+`'mJQE10yAl$K~>)͚(T3L(fyՅ p99:?_nlAc(4Zq&dj 9W`"X_o6@l$ӡG\dرhYemF ~aks"xY.>&EOi6S y[#^`"ፄǂ3ýD e{-%11r־ ;wOȴi 3ZLQJ\Mn˾qoSk筻wRYaRVΩEzNicJ`Y5/t;ݖ!e5k dQgy Ja2|s/R൙ bKӝ溔ET ,4J0o p{!)J @ %!@D`s8']D^ )~mcRO. 4SF۪q%wL?}䘋0W}q~)/&"ro(K~rEO}e/;|S;g3?ys5(= r4 PrFw(p{}[͆*N,M091o%.9;[wwLNCuiO@[\fΖpvZN:y4r3GzޕBSzÿ59yl_k+ﻗ9V#D{!uMi%F1јPۃqh7+ƿ%"ʫpǽ$+Pbo/9g7*G>]mŻ 1ډv_`}b=Bp;T'Fb$VS`(*t$\c*ӵj!9RA$+8I |eԞMJ-hL J-\LOM]h=`@*Սk=zpwqI-}ƻ&6( wGW'=Ĉx1z v>sX8 hNe:nW^ zu7T> `d $+tֽB&&})- Ԉh/kjNFUhF b /CC9!7 ¾^3g3M0o^VgO %"Fל 98U]u3 1L\epMoQJh,vb|QPK y PKy.F1angular-1.3.9/docs/partials/tutorial/step_09.htmlXmo_1! X~+.彦ir: j6Y[+Yu+>!w-Nһ%e8yfN-_=[<_aͲҮre]\}ꐯO&lҚMCUۿ߬jxA47uO^>9=/]=G:˲gT6guv',fIrgŴNƋf.kF÷ k>.o/y](,kO4Wh4v Aubjb\Li[5qߔ+mꦡF+ghi7,Nyґ*;슪ڷ\nMB,VS'$CnVzߧɫ/OS(v\{#L) `{W+2z9T(XqaaUSִQ"0J+[uK87 %nx\."b [(!msl, q7EJY<@@u;~lhP|mt_94p#ob}M>7]gJ:APӷ!\צLfz ~<mhg=BboAx##&\;j㣔lVMSxø`;&\royW^XDb>L a5i19}z#oMP7R:ϩ;Ic lh0d{,n}iq{K#?swmq_vd(2EdV>s9;/ת&:?@fP*qT%CÚފ2 hԃuY6DC.bd׮)(1| "k}Hj,ҁZdz/mT4cbE”|@-m\0A|XYF~$žrǒ}e 4Ҷ~!Rv < Duj$["'gւYk}L]O98` c= S^` aotTmܟ+7G6߱@\QʽRIg/qSD\JotDyc⃄&5VU^~}NP/ Q48;|. UrE!<BKݴSG_v !Ra%4:TY"/ߖ N(5<2ktU[fΖ^]aɊ1ˌݛRS5QBAH+HV4k&YVWوK */)|%E+5/~RN9xPO}&U$k}˒ <ēAS(ѧ?Mj@/{KA\X9#y\:$}w cT!]U L3nbT=Fv*ЈHd j2uEQW* E<[Ir/r>xs"NΎϾՋǧPcpO~.|kZ^V* y;9;oVCU/u4V^权\J1_xPKYPKy.F1angular-1.3.9/docs/partials/tutorial/step_10.htmlY[۸~ׯູXO:qMfHL(A@K"5|I݇K"yx߹d.Eި\&ɺyjrjلITVn??'Y$JJVM!ub?rm1ri8yx\LNei՘'O^gʤMTxUm4#*"ҘŦn;5%biK;b#żFk,iJʥIxh Fu AU<+M(l0Vay~!zDTYk 3ů:DG٨u\LbK\'ݥxyF(rR ʟsU"=D̹0 #g4Bq9<hu4!D jN/4.E2ZD.W̖rL1#`PNg:5aa&ʠ.ſ]@V5KAXdu 6!e̦G">[(R)AWqo!cA5Q`G~`PTF߼Y~ZuP9[wC$S.TbRUʦp! +eQ)tɽ1e8X M% Vq搤xAF9uB} cc)r=S UOE:mE[$ma%)LM| 0ٞd:}_V3 8G?(g+ 8..KOӼ>cLIAIZGvvP>_Dۖ"]1մH.+AoOmSQnh[D$na5遺Zі V*)T+_MAq_"2+]m c_{|QB)iD[t9.&ZwY\x!nx5hftBhF 8$;7?ڍ `U5F4N5^OkL7W]0aD]79^DGC Pq}?ܨK79-:ms%mgvG[Vwl"{_,ʏ>pCebePy9n<< Ss`LEonzNhdRb6P#JIQ8iک'(7ζo8%hL|4|>_\?{|21tAZ)$=߼mٙצϵeWĶ^-QzW59yӟsk+J$ o{ eL0Cx|Ccr% %fGKn:GdoQ6PUN'Eu8JjAM~}l7ƴKsm茗&a{E<$9Z3E(|1nryF{IDWto7[ iPR7q9Ms[&hPL̙Izh ڔf6B铓Bo:-̆' GY!yZ5fC0Cԇ]WɨM9+2|⬂ FB =yblUc|B ˣtC&`Ld"$(6U~x|(bzDb5۰04<^zŇ1evC?a6Z]f4GFZy)&'4@l%: ##M_PKƁ PKy.F1angular-1.3.9/docs/partials/tutorial/step_11.htmlZn٬&mw^"FHbL\^A>DO;g$m$s?9 kV[.fΣXOml3[u=uILoOћiR4.ʹiJm6W:=%v.#= k8L̋gWyM6WMcWg_'tu[>XrQ}i/uYnBf7)tm헳ԯ/mJM(xv?Ëi:TZYyZS;Fmf@~t<(g>FO 54ˌ2[l@ c,\\mbZθ _I"͝&VԪP\YoLv.6MZB2r_ۤEnWWmܫUh3 } 4_Lzl(Y.~j] B#2Lî:UH~u4m bL.(+6deXLr0G13f?<1~nË?*9R ]$ &waŋՙIGĕ.O\Ϟ~]LWg YήaN3hX՚6[ǡ?K|kkQtH,_p52g(fLtYqSCEd5n T*%. m.[34s4)F6s LIshP+>5MjsҭּQr݇y[5pI鵋qXo?\ӁG4wXJ=?Qd?C =Z]^o,w #uC +ϠQpK?>nod]7=2/>l˽T*NOc ,@n@ ^ a>BTpo<A 15dD>e,r]FG ga(HE("ר7Iɳ&#fRͺ@F|y !B)@ћhլ7|@2ȄgyHH_6Gf]=t >z<$ͩk?NF|Px\>])]>co-@wmͣ.o/'G|yp4 ZV=;4ի0YGݭc+k*7\6L@zdļ}?hQyݳkz]De㪲sBwB{^"e9Ud*G>h[5)Bt|@ [kxlL`KlQ`oBv|/(5#liɰC-mNӇ%9 U*nSweöKC)h- ]OXdi@w4zƒ!-Z QM4v6ء?;d~ܫe"MG*]zaHeH u;H^bOHLO*tOD6Xp~AS 8f~; gZIQ&펶~2 Q va$c~PBuAI8b ZQ =)) &08 ERZ>A~(/64-0W&)}q| 8Ъ6)sω!}cHbR 0!֡" 0Dp@B>qQx!W?Pvtى֛cAz)\$H_PT(Früp$8ɳP{2y./6|轂vr=nL:Tmxb\ deI?~R`aWY]Y?L:NYV quk5/t㒀uDՈEz=WMoH%z#OsPUs#*`F>Z9`C)fQ/|9.hȯ; mWDm˓;g2E~> A j 2hi] r9Mwx޲f2^x8F i~Ar`[UvGY?Anۥ C0F[f^n-Fq>*KY o*̬O }yN|`+,A/fhݵ 0Msk3,a"wDo@]Ea.uH%oJeIfkV=E Iez[txk"T&rGʬ(;z8~MA9@Ż{(O@M30Eu"u@aU"?#*>=WTm׀ &" 3zg,E^P[矁{!J?6 J\8P_zS-|bb-N`o6҆;Ms^ů_ Wl!Zzt.ϳ!H9G,׬C^{Js=]alYş/ iĮ~l/\t^Z.xx{x޹Re#C  TّQh9»=q|_B-oV:s4!TG8Dđ۞=y+QB!3T)@MIH̖=|ATv ǎ(ST7Nfh]o>;ս]:֗aۓiJ) \ǀ2Q24G=5m4*}Yw倐f=|4Hd>3s2FP|}1T(B8 8 Ea!/Fjr@q۲* mHVv:U]OC=瑢mo;\dM1ֳ|׼-hF&n${Dryou%(./_9~ϯXڼ{<,\mW˼Z96jjy&iߎ(USwXDZD(B .,:p|iH@ܵj뭬|Wmu{3MSH3*RLэ.o&̼}f|ٙD6 :/U04g'_PkzZA뀢tl@*(5K]}Օ*;Ur_Tr*-.U4mnls0.3.ϗtoZO{ڔy]9bz`≞t"Y~qF=KKY8ZFKA0T*,54c +.lb fo8d,Co1c @Ret 8(kEa1-y g<-~CTFTf-p_i~.lXϯH4v&UYgKN >ɻC3Au #w&ߪf=ZDuDOV>NY˕NqWZ_au!}J3ѭqn2:p$ZY+#~p Kn#xFsjJnthSVt?r'_~VPuM2 ҈ M*zjQ] H x% >oPT #%M\qn=LA7sOXQcZJe\c,u]sZdq:N 7sp5*w:U Qh$w]:̊Qͣ2E`CvBo~ǃZCU7.oJ/3?s#SG)q6e"Dŵ?D&p4q(7vEHAG~5(.Q9? ^v ԂA|جNٍ 8BRH2A?o6>AQOn&&K ٱ@^ըA ~[ځZbJ"^wFXn<l'=id/>#֣a{F˶ DlB)cQzb> `V2Emb 08(nc|"(sF%;x`rg t )Sz |&Uӆ<'O6wtv;, %)ɘ4H+E&8w;M}m5}{q'(wNSgF#M?o|ϳl&ĉrqBbF:2>J|NӲM"=ա!f|X,i"쨏i_!2|.³_haM ([$H^0}%ƍ0f`:<ҍ<#EMѯ֭dRO0S?c>g-N;8&%?sɇ#&g9?n%P z|SDrݐkE*BI ;=RldD = 8 +-Wt6C0a&拺,+:g,͎4iP,782?aTyc4f1_50)G-pgQҘ_ 9=`TY& 9Z2NI..DR]ZkjkaE3չʊR@!;2pXuA|f?,0L/ŸNLL؂ܖ}BNe%+> ''c5Q]U4M@yd4@9J`v|>~PuB 6@BHPĀ^@\;% S8ohNx5X0H t¢ߡ?摸~و9Pĝ@yr[?@+OʞyS{>cLg0eX Y~pLQ,njRXpnb خzn 0N#{p)b' /JP&l@abgDe:AGAF+ ?˼QޕruAHd)g9؈ GH Mh,֬^, An\=aR`}_UWSd&CU dB2/=VG `|bX4CX$nk <8?QQAIw ;C³06=G*P G46VE`Dt1Pz$q H(7a/`pN݄hA_P" <Us! ׃ɻGgYUQ045@VRNIZy<_R"sj]T߶Zz&G'Q'E1ck#rt\2 өDɪFD7]J B.xZe M7ZpTw$PI g!UHe5=vl(jmU1"7Ewv&o ' Y k&R}'+C^^J?q;`ᵺD&{i6:XC;*QpĒzxRKPDNjjNw mFz/{Iɻtd;ZdKT9=U'3uDZIS^ -,4M_2_-( \ lv =ag>ف[ 0#H;oQ@jAbZZ5ꍖe t؛K] HWPz9BJG?mRP*뜧(a-mYUȕFjږs-nPXv* vְFq\DCH b%d|6 GEY6aM:ZFK4))cB !vSzyž/ Fu[`ʭ4ѳlT.@fu\ MKH5! 9c>Axr)Sقc ct+ꌉهW *2\8 uf ;)@s~Ez\`KgAg՝EnmU-:BAmPѢD$nwAxCb@QVow X9px *Fĥu?ئ-"pu2RCGY1WBe߂sD`o\@WGX+'2!;3K0X΅>q3=*L qF"d:͕vwP6Fu0틛bF' ͨP=M'2OdŎv ;;f vuJ- AI(rv?Tzj 鵺5.Ճ j_.S&zbۓiXXP,AF%=ĝS!B-%!i,J,BylfY,Gey0z|V vӛv,e?Yܾc Hh[xs8R_tl:Aj:Hѱfя0"1ƱV/,K|G"y{U\Ji"=(<]bK w9)~~exN#EC' Ts.$8 `qR9~L_- *.^HlCL45Fyv#!^J;+hJ6D!0=&^G)TO=R>-/O"G%"L/@!*"<9L(jDU'@"H47ᤨq!\<O& Yr%9do &d4kDZ5WF2X_D$>ڎtDbM`j~j`D`-5+nT'/R h9;8!%">rh7tFǭµ'팓$H;45:&c'! xt%,UUNHIXIJ먂Dd5;xZ/M>!G +ҩÉ~Y /#}Ag%t W(VΩm.@f \KD}""+e/Ei~R2ADA X= sAp#$%ܳ65rۺˮxp͎[t$Y!U5,OQ†18&8pkFe [V,Q5Tj8"Wٚ 龁.cyk&e?1"*V`\osE~ $vV|\ I Fv#65©6CYEBYVgz?DIIwƍ 7vN 3Vα#L=HD"E^ƃ%?ųvX0_";"W-VrQ7ybcڈlKm. h0,LWnRy4áWz?QONr?3S O^xw1 4èuqzps߄,J gN+."ً-".ɍGBޛ@awHCҏOlӚ ryAb{Cb6C2c6BF#_Q+\S|PM6  |~ .Z-G9X *iKZ\z{!,VGOܝҠ,6#9H)# S l ƈ`&t ߆'pcH_']dxlo ^'|I(ϱ[/my>Wt;<4GN>Ą|01 O%eסTX @|ͤ`K]k9t Vաg~tb%HYsꡭ=8Mk"d*h;h\d$fڀܜo<&/1X+5uԡ?)fWweeP=rLBx,SÈo׻ETYפC-bVxF|d>#( SZPf=|7& 1KRAJogkAdHD= S2 y]%'ojT^;u䷋#y&jzy=tfd÷"dB‰ 5H=LE4;~/b ,vq_ʲ^z,2{Wb+}y\oe+V/}J6^/TmzuDXqղ@ۇO-:ne4=`iǢ(6F#b'hrd+9l$Xvu^_ƙ 5JVgYVG$g^R H 3,"x f8likKsZ؇@J2c(up<Iէ*֤>pH\ZԧJSGO¨-BCEt=LQhSDw /lEJjDb׏xAQWV+ 2`"kQ.E~ Ȼ=r?m#(%Ng>5k[f{W펨y=9$L ^8va׿Ȭ"MQ ` T0S>T+ANf8O/bJ匴ԘJz k,z d{+'5nUs y"宍tytuI(03Zz)e!::eb vנӸ ,sF>[j׺0Na,?~ݼςHzE/oPKS/PK y.Fangular-1.3.9/docs/ptore2e/PK y.F2angular-1.3.9/docs/ptore2e/example-$route-service/PKy.FAangular-1.3.9/docs/ptore2e/example-$route-service/default_test.jsAK@KЫ҃`OzSit66Ef}31`KIr)6dL΄ث "5++M'FeC !k[ u0zU7E`j(7.osfIm3¡2By#4֍uwIpgEj$c=BXIJZYkgNb=1NPݶ2}%Rln5p7,'\+܊X 8O5a9Պ[ĝ3L}ψEs'*w?eUp@_`G;>;PKK\x8PKy.F@angular-1.3.9/docs/ptore2e/example-$route-service/jquery_test.jsAK0+Bm٫Eكdv7tMjYWCvx̼G tl2INŪ-z[Ey_+$X(]/:1ąwPpeR֙ҠJT:8|'=CPZo`ȟ{}Qs,:32ji&͂! P 7kϲ iY㬘FPu2|kaq5r0a 9YT+c98O tu?×qmE<5ϣ8$xUVCZ@@~ӞQyPKv >PK y.F5angular-1.3.9/docs/ptore2e/example-NgModelController/PKy.FDangular-1.3.9/docs/ptore2e/example-NgModelController/default_test.jsRn0 +\$EY^0 D'd+/]XmG:L|z [] u6,,XCC>!`|p6U8]Ga{R{c.,^x*8fH9 !hw]G"`tBXA% ^Ez+Fl@Um~'DkzŰ=J3(lC^>{ *C

    !8pMJ:9-#x6;GchCl@e _%$+  zPٴ pk (/PD@Ӛ\F{)Kes˂*&3_v{urhY/+gYEũ9 &<S[z*1[d}d,'$mw?mw!Je,NHwe/) Ow<9PK'6PK y.F<angular-1.3.9/docs/ptore2e/example-checkbox-input-directive/PKy.FKangular-1.3.9/docs/ptore2e/example-checkbox-input-directive/default_test.jsMO +H/mcƓu=#Ӗ,ZcB=@`x3ANqYvC`*khAg-.8tA@qL{}ઽ-6k= xPZ _IסKAԙVFR 8H*~PHs?ؠ%3= !:tۨF0H[c2=ͷǼXsknV:2EMETqgXEd]| )){w}aZ ĉnױcTp=>&!q}PKzn8MPKy.FJangular-1.3.9/docs/ptore2e/example-checkbox-input-directive/jquery_test.jsMO +H/ĶWxcťPP1w؍Y 0<晠`^ `YvEJβ'9lM ; ƑEnm_nmTkY&6RN̼ | ف<7 =D *mk,;M'eidt\0ȎȈ^g&u4=XdXmH%7Mz CekDg}YE-%͵w ̙i)^ƒQu>$OPK2TPK y.F8angular-1.3.9/docs/ptore2e/example-date-input-directive/PKy.FGangular-1.3.9/docs/ptore2e/example-date-input-directive/default_test.jsSMo@WJ^ nʡU/ *U/;IV]hbYI["QdcHS5,{ ha ڰT:\f&u0Vn<:#neuTZV6­h;R2] TVHuhuV$u E-T̊o?!<_yuUJuJoֵ| Ï)xP7*hsDK9hukh.Ңcuօ8Ї[= Bk5vcէSX>!ȓ䓲<"CYUTXǚ7YE-\>o}%2h]rGrxad N1c(a$W4W][?&8Eb3])Y>Fb8;/!W##ߛӻDY~>}PpYD!&wIh+?onnRؓs .`L3n?tшLZY*(JwLVɟn; z9b=,aMyr\$ QoK1H+hĕ6%`ۅ9C$))ŷ(i6?&OO9M'8H?-/PKm{umPKy.FFangular-1.3.9/docs/ptore2e/example-date-input-directive/jquery_test.jsSMo@WJ^ n¡U/ *U/;IwhbYI۔"QdcHS5,{ ha 0gT:f`s]{tFꨴm|v7KeJ;)Ft=_VgEbs?\'lآ yM(e,~ )d=R,/Wx'~D͔㆗OqCIUA#ZDXKG9=Ǯ.$ǁ>`!XZÍk.?`{tcMpV k]F UTakضfp#>HNN >K+R(QH,i@㔌ּwd8 ^QP|gvNfX0wI @}c;d?]z͗K1xP_pZOqDth$=M%P(%D{{6-= ұYƼ si:OdO-&rȘL4cC4KÎc;{ښ K ˘-K#[/8R"&v0nmhS]aDK@HGB. ԍo3>d#=fq:Dyɕ &Uͷ⍂Nl A[9?@PK7UJPK y.F9angular-1.3.9/docs/ptore2e/example-email-input-directive/PKy.FHangular-1.3.9/docs/ptore2e/example-email-input-directive/default_test.jsMj09((BI75Nn;RL7nlk^4 \qQhkTA"lutbRbx H.YPwkk->V4r5zړ2q|" MOUj;Y_EҤ;hЍ!:angular-1.3.9/docs/ptore2e/example-example.csp/default_test.jsUێ6}WLFNQ() $--Q;Cbz93sPb\^.:(kxak;p#|}كGWMiد1mTZ4^ U2UZ\[A+8V:zV Z@-PnOeAŊ9tO1X7fQ셂Rb 7FjyLA'aΌˆ=J=TL`ѳYРFѯ<<ʬmT; Cu7&Ӑ1 &u tDy;+ޥ?~ݯ95̋y1 a>&FI Hsl}hV._%\K7x)3,~BB~aYw0vlp֭Wkedd5FEXޒ/{`k @ x1ý @Zclm$ 0_xPo8=N>R,@T8AgOP~\-XYw‰W'NyX]-UdKQ˄ag]r kCt${eTTb$P`_mRO !,MyN)q>KPSVj75 riZɏ{mtiGIyl޼챧9cxE@PG׍f\0#Cx՝ȪSN"n$^M X2ŽΑO5}?hC ]6L?PK]p PKy.F=angular-1.3.9/docs/ptore2e/example-example.csp/jquery_test.jsUMo7WLîP{HPpP)z,Hb%CҒPwH֖\-93QI/`L5<֯qc Wޕ⠋kX;jLnmr)mxMqs-TkH<\~Hj=_&Y,x/`kIjV;A _ełcfmHO!>[-nLVDLR Fht< NFrQi*XtЌm!fR7 +g 9FI]=~9mVo?q{u6¯# g &}DM)zC5[cZ>]JP8.JDZ[H0~0t[)"ӊQN槄>p Y־<ރ ɷ`#|)|ݧe>xj9gΐ`8S`Uh#WzzM !.2(A&NEg?!yߊ ",]) rݒ$joii+C/VcTh.X$j~\;cѩ}?a ^Nl)A[!"B^|/(|DnuxK BсTN(J@ZG(_ϋYTz٭ ѸPԩ"+Kml2! l-Ng(,<:LG>Ȝ LE%/w jK:W-2I򔧔2܎ЄBR9yNc敞D/ D_ٛfHy]~{Z'61J|vOu }ƒ/Y: >BՃA=k(~EOS' >*3sܳrW`~qy q?mYL|{;_Y*(mfXcDtFY>@kQ? j~se|r?"0L۔H Rj=dP"OT 8j'*ڀef96L\+`s2)`ZX4D~gO֒E8gC:3=.: &/gơ_-;[ ƬeH?z:^KQI;ZbHMsQVn Ba0a,JWhddw/t:q;l<(|+={? d:NG J&΃AB}8H3ԎKBF] M%s>M$N^a /J$P?բ .gۋҕ`o!kVűO~|Ў⢺M`0oF06a95գMҊ4̰*W ZPT{wwi\:^xPKĠVPKy.F<angular-1.3.9/docs/ptore2e/example-example102/jquery_test.jsUn0+Hd9..zh%J[l(]$h%μ7qLQeO l ">?{@IiF*"yA!SAJ4XۢeΩql~9_w!-Lɧg{f%3_W9(LRRq,TduD)l=l|H+ 6s\؆~] 2pp*]QN5T]6m}xN#]HiEL^&G RF†)m܉B7RG~SgO8ZqtOEW55{\FubsM^T'ϼCWw8[~;^Ïd,)t>S (.h #6@@ [`4ŀ ;%"iJ PZD%V-`_ KbyH}kbqNLYz:ͺ%:qdLʯPk;5Oxg'G %-YtHs#Bw/m,Z-;_z7q$}K(-uCda-[*?۾$yBWl< pၻ!pmðPYujt$T| 󹋟_Lve(7PK#gPKy.F<angular-1.3.9/docs/ptore2e/example-example105/jquery_test.jsn0EQ@4N}F/JKt(R%G"^6d[3R#IShΔac} 8ki߅L5;AP8ˣ˷`kҒK[z+Ѵ9 Kg1ѣqߚ'AE bc^2l 1$NhckG@*dJ,u 2;b2\!5!1ӍmFeVY.EHm;-vp5lR%DU\X[C;\sE`ʲWi/ы#cR~Z xY/xr?>&n8JBd>9"Dy p|>Do.^_Uf˷ x~ϭ%66哚Clln]D-x o?¹ B5:gԡe0R3x6~R~;2za!F=PKdePK y.F.angular-1.3.9/docs/ptore2e/example-example106/PKy.F=angular-1.3.9/docs/ptore2e/example-example106/default_test.jsePAj0 +D.vuK/`?`[ eNI=H 3b(5d1C&cxm3eVi1|ճS SDM-ɡedk8J,dJOpQ 6t ㆧsj |=;59_u%3߀AmQV%/kxxbpy:D\n#! F)-'Ξe&LcBG tux\\nn ~$p諸xi4_@}gMHioAHc"F\B:;GJ;'AuDRC_~Vke2ܽ٫u(ń &vPK,]vPK y.F.angular-1.3.9/docs/ptore2e/example-example111/PKy.F=angular-1.3.9/docs/ptore2e/example-example111/default_test.js]j@ ˌU챥GaK}ljkhLUJ߽j?ɗXm :% ys:|6R v>`ݴۃc ^?E ?G3mi}Kad+FUU%9sYDU}b #\] tR "kucU}%juAfw_2I" L 1ð7c􋨼د?PKPKy.F<angular-1.3.9/docs/ptore2e/example-example111/jquery_test.js]N0.-.$m-S]@V=d~1u eMNNul﹦5Su{y3< ~lZ,3,xKa$ .G:#aXݟ,K{Ȁqfu`ݞ[7&gqXAʊ),\Q$b_F٪u T"x vJhU/1'+4$6QCvVųY2zq l!6q''K-|ȾCpH%o+%D2M4Z>nB߄]-|ڥܤ k*fe .erEbm'RzmK#xIc๚#l𶡎.- >ƿ̾]?ƽ B?)ꣀ;5J'ze.Σ)c*1;(7;)4MɊ^O'pWSu_κmoH:Q{Eݟ ULXX4G̖҇LK#>j};չuYccꌅS%LC ЩthPK&Pp*PKy.F<angular-1.3.9/docs/ptore2e/example-example112/jquery_test.jsU0WXWvH=qG$[cwIڦm] D+U3yoWX9[{]4طƾ ˬ1Ro_kca%_ı!e5;69GLKSnacK.axx`ۤZEG{#Ǯ2^LIai4l'b*_ 䠠W;Gwf_㝨j(,Xnep#q&;mT\r܉58L|~kp71lWxjAXM)mr ע3A]q4ؠ%.*q4un5ӱқl2տXs7 yV+aJ[`~B<>K;U*(cm؎묊@.x ]I8h!d38d "bpq]@AaFRx}ӛ,69SꏙJ-,C@=!$grmhq{Z?ENju (UG`iO4mJDV*ArP~$WՎrЪƱBF /0'l$P a#'Y_ 7BT0K37ZYڬ""9ġV@m@֔a z2ElD}xi\嬰ںlM>2, kjz[t*{zo Wo_?JBn0 XRwo@Y&~)6^ 2n3 vEcȾ0hfYo_ιqo7B@PbҘ3J#/HL %A1lT4{{UP,OǃQ[oPKS/PKy.F;angular-1.3.9/docs/ptore2e/example-example23/jquery_test.jseOn1 ^q?aؠl.5hJ`cGfof-ΐS!3tJmGǃG09}ݟL v&T\-=z- >:[|FB>,|?32Xl hf*E܃`dg2R"w zڶ43JiU^PKc{6PK y.F-angular-1.3.9/docs/ptore2e/example-example24/PKy.F<angular-1.3.9/docs/ptore2e/example-example24/default_test.js}PMK1W hI=NlRݢw'ePC&yo:L&eU6{C6xY CG!mѦ8P6C¨4&Nl]7Isw{ wUu}gH}Ȯ\8@^>bJY=LJR3)AuM&/7c7E:5aȃ'o%АdQeBf3Lrq]&Ԋ''=k' <+,͗17GX?ղQM#XPKW͛PKy.F;angular-1.3.9/docs/ptore2e/example-example24/jquery_test.js}PN0+VDrC倔?8$ζ1vki*YWu0ʢurwG xOWki /p0`]AiLj$Ytؾ꽎vg2 wq=}pTmmQf ߧ}fH8d{hHpa$6O"EG;*L%"DY*m~fyD/7c7Y:[ EN"#r&ɢJfH;.O8NfZ+ <+,N!GX=ղVu-X(PKǃPK y.F-angular-1.3.9/docs/ptore2e/example-example25/PKy.F<angular-1.3.9/docs/ptore2e/example-example25/default_test.jseAK0+^i.xi2mNnEv.zH<{AY7Nd,c#v\5؆{mz.0_U0ˢ*0EN{Ki mR,cq=,2)I۵!g޶E(Qj$a9gM*ttt K5,&+p8R;x@O!K m LجαPK=: PK y.F-angular-1.3.9/docs/ptore2e/example-example27/PKy.F<angular-1.3.9/docs/ptore2e/example-example27/default_test.jsՓN0>)K KQ$ K_v.U.BRJK1IJ}}YK,:IV;p\ē:sٰy0d/]EpBbJWJ?_pqy5Q®lYzH}cv[3Y (Z{ąjU~Ԛ5T-T_a ECLby )C^^0i8ƺg>znEgĎXQdOk?3{ޛȚm~\R=΂u/ʯmxi:Arl4~PK\lHSPKy.F;angular-1.3.9/docs/ptore2e/example-example27/jquery_test.jsՓN0>)K KQ$ K_v.ciRJKbe}gDˍ`H *Z GԀ]81 9ʃ! &~h,I1v]IXelƵ2"G#m%Tq@hЀp6KP Q&bt.DSWJlQ96(I¹ |豣L&HiR9~U Oح;r@QQ-s$ gkO%IBٙM{ApRSfwNmz/_ɂ= .ZˈOsa:Z<?Gϩ6_OPK&(NZPK y.F-angular-1.3.9/docs/ptore2e/example-example39/PKy.F<angular-1.3.9/docs/ptore2e/example-example39/default_test.jseJ0E~ŘMRx]qY"in@tMKL9$g8Q;] +7(ȵ˕Aj꟎vݓI}B*/l"ν:fvV66SEor7 KEn2ҁm.JN}%m-=HO z<|  +x Gi2 )&o%}QEQG=baS묽ےmkW?PKtkPKy.F;angular-1.3.9/docs/ptore2e/example-example39/jquery_test.jseJ0>ŘKRضO" 4_HtөvQݴ]Ȅf~T@ qf5>ouW!UMtݩ:UH& ؒO/os=r{`%;[PO%=I7[,iF<Nd #^^s쐛g%.Βp.Ӂ ~ˈxV\DV ,+۞J)4k@V&?PKd"PK y.F-angular-1.3.9/docs/ptore2e/example-example40/PKy.F<angular-1.3.9/docs/ptore2e/example-example40/default_test.jseOJ@ {i z&^ xkW6'EA! !L<16撎%$qKW)okp3}ey[_YeJ2=6"~N\!ylݬK4w=fDO{z@BZc%FeD,HsuwH)ZiۮZ{Ħ\Rl^ҳLOh_PKDNb1<Fm'g)z!{FR?jܵ Xvmwtn&C7},Eb .\lWX4w]V՘CbFhVW7!ŪCirhGqoEWG#PK:PPK y.F-angular-1.3.9/docs/ptore2e/example-example51/PKy.F<angular-1.3.9/docs/ptore2e/example-example51/default_test.jsJ0cx${i2 LJ黛m!Cf?`6(ke "޺5[[yUܸȲhu6czߗ۵pW[opZ\QfOsX"@S[OrƁU@8gbv:mF˫Ƿ}Q5Z-[ bf"tSAT5ŲʋpY3ʋSi*ߵ޼gbpHe|PKd PKy.F;angular-1.3.9/docs/ptore2e/example-example51/jquery_test.jsJ0cxPXM<6&5]JlU\2& F^7KN02@6>g5|T O[n\j{$^X]ibl;ߗRد?hEyB2Yl|d"ʷ\'PfkN D]Ub6+ qIBv3Z퓕̇}l)< a"8eQ,Rgf͛*3"Ÿ© >X1Fk;W mpβ"ދ6 >Ajt]m,GR'$OΪ׬\J ۃ$zTR>K6B;ט9a&E R3u +&Qbf$xIQ? qH%f6 -5GG &So3kHiO(}@sJLp X.**Qo#ars !I`CV0#8#)N*XGH8r7ũ1K;H'?!UNU$0` QR ePJ䌔j%03;Id9!7(V[4n )LWg+kF[uhQ]P{8ch]0iɶw7^QϏlxo (X2Fk;-Ź68cYA 5Ќ6`{'\gU+V.$v?.j١Y [^ߧoNrf"|I=A,(mԌC]ja鈥hVXq GRml.3oĩ'崵l1 $D_>;_}&V&Py,v pwu w`*GpF6R 5TI19cy}cF#H|T@:UQPԂ-D -@MfK3R6FLU$M8JHDޠX n޸K4@2fg335ڟkΨ.=Gp_14.ߍI4duc@ڨ72x<@ v; OjE-}%uBpi 3IdS8U_q]ٲ( xXa,WrUB_T PK9ʻg PK y.F-angular-1.3.9/docs/ptore2e/example-example53/PKy.F<angular-1.3.9/docs/ptore2e/example-example53/default_test.jsKN0 s i8Fƣāw'S"@daˏm٥`JJt8BvJfpo 8(ul׌i6@gK ?zvy,'¯no=, uE} ̅&BeGt\Op(`σt~<ϋ h^׎#>gDX#v3'(c̛jPKu PKy.F;angular-1.3.9/docs/ptore2e/example-example53/jquery_test.jsN0 {k x&07Z!ޝTQ| TՍ:`sZmz颊̲2xS+06߲"\s= T&{rcZLuٮ1 #Uxp*E8?tF+#376%+^MQ, v>u#CGiGh;=}=baZPK8PK y.F-angular-1.3.9/docs/ptore2e/example-example54/PKy.F<angular-1.3.9/docs/ptore2e/example-example54/default_test.jsPN0+\H\8P@?تM 8GZdlqFÞFىgD"]x(Ɓv8 '*J< 蒑oZ!+X6zL0x nkn;o<6;&vf O0,1[ٮ}Pg]ח&F. -UW"6H o_ɗ4[5}PKvt PKy.F;angular-1.3.9/docs/ptore2e/example-example54/jquery_test.jsPN0+\H4 qR?ζ$B;Iî1$!JJoS/⢒HDSq2N‰%NoD\k`Y,aPlu{ar.Hc8Wx_Ƴ0(4 w4 .pa[oenvZyEa=عà y!,ʌ4CM+ Es>{PK7PK y.F-angular-1.3.9/docs/ptore2e/example-example55/PKy.F<angular-1.3.9/docs/ptore2e/example-example55/default_test.jsPn0 @kO -|A[l( v@Il7PBe,ةvD7(0gpԶQp@&׌T~̓[+a\F_V+9emŢg%sc]Pv i$\e+36g%<8EE98x30$]:p!Oj]S-Xn~N7>PK7wPKy.F;angular-1.3.9/docs/ptore2e/example-example55/jquery_test.jsPN0+,7v$.BWt|c.1^C"ĿD!h)vٵ&9 ;` +cE%b3sL8)_8ؑ_3R=6n$.FZx)Ls];sp>fPKZa|`PK y.F-angular-1.3.9/docs/ptore2e/example-example56/PKy.F<angular-1.3.9/docs/ptore2e/example-example56/default_test.jsMN0 s MS lAh7m:Bܝ]H;{϶H&: UUtވ ^5#z#8CoF;1&KV[oJgǶs?q}9o1L\5Kz:!z8?OQEs묪EQ7M[ًݳخ~ˏ{}cXjPLO`xU)#" 9FeUչ{m?['^ ^5ex%q6OPKbPK y.F-angular-1.3.9/docs/ptore2e/example-example57/PKy.F<angular-1.3.9/docs/ptore2e/example-example57/default_test.jsON0 WX$=!+-_?p*qNX7ьg1,ꦹSNGl$f9S,8QƂg3& PtcK {vL3p}n]ȅ<!Q ˌN4NEKVʪmE]ZTTxEv?{QpoVTd\PKgPKy.F;angular-1.3.9/docs/ptore2e/example-example57/jquery_test.jsOAN0 +^Jl{Bv_h6%qdEp`xAō:'oıו)@ypCk6zP]P_eYa=D]rd&6q"| kϯ a.>׾s8p"x/<a-Q,ΉEIHFpl).z!قDCμl[Ba PK?PK y.F-angular-1.3.9/docs/ptore2e/example-example58/PKy.F<angular-1.3.9/docs/ptore2e/example-example58/default_test.jsŒJ0IA+A]v/4[ jr2[w7ͺUC)ww_ 6AK`UuMޱ/ً@6KBEcg:2Ȋ_#>ƩdLڨM\B/lgr3n)<;"i7 1@lr`C&.v[Fi],[Alꆴ5c5y"d' / ͆Ȥ" "-7N5 dF͕oza;ǗTkloК-|FF'v0 zbC̑A,8dr2/n7ˊ1.Uvxr(Kg} @SGVw(ct "-2CQ<^B[?o̘i]93Q"T3 1ox$iYp+L<"Θ?PK8HAPK y.F-angular-1.3.9/docs/ptore2e/example-example59/PKy.F<angular-1.3.9/docs/ptore2e/example-example59/default_test.jsPj0‹t)d] 8DeHrPqKABY'@MsNS@-1!K1/SL8HmV{b*sF?*\59o:u0a؆ ?t.–7uw6N0mYrՃp Tj/x E _]iquh\mE f]0lC&3y%?WB7!|PKPKy.F;angular-1.3.9/docs/ptore2e/example-example59/jquery_test.jsPN0VHębAPVvh"ĿTQ@{wY#`$(yt*d;>ioKV{b2KD?,\ 9kU15` ?iL0.(_{gj:7Jf s8aL9,zDrװė./o4@%EZ\k7;1%*K3:,4&F e#~_|?C7!|PK PK y.F-angular-1.3.9/docs/ptore2e/example-example60/PKy.F<angular-1.3.9/docs/ptore2e/example-example60/default_test.jsOK0)^z"^Eū9M޶edIR"~w'!&&w5D]~*vΊ>7Dғw.jNVќET{cp5"J;*?,:1mMV$itQuѤZf[sn eggг9E}*ن-Iy1=7; se$N*#TRXb( 'yrLJ2^Lϯ~)'WnϜuxQNPKsig kPKy.F;angular-1.3.9/docs/ptore2e/example-example60/jquery_test.jsN0}%8M9qA\*@\8; 8vB;(JC{L8]*vΊ>VDoғw.nVVExcpEѤv*l0`0/SbYau{ST^uQuhR- a5A&Ecm zFLuv榲Erxo)D{a7OGNŢ=1DQUut7qg%crAFZH/FGV?DyȁCB4N/ŅK|?Jt=~PKRDo&rPK y.F-angular-1.3.9/docs/ptore2e/example-example61/PKy.F<angular-1.3.9/docs/ptore2e/example-example61/default_test.jseMk0 Z.V`IeˠAwm%6G6eaM EMseLb{*)&ڏ6 Ax͔_YnXUhOmLJMkoػ?2l4(CadaJi=b$GaFoh۾:XZ/[ 1@2eΆS+ %ȼL(ɒ_PKՀoRPKy.F;angular-1.3.9/docs/ptore2e/example-example61/jquery_test.jseJ0)$7⍰ gn2u[w7N&aN4fD40Ax Rw&q BG)^3VlB⍜Ӄ*v#mp7ؠq.37]}gl4(adtdqt1k_a&||}amۗpG\I yV@x*)\-p6My`L8, PKYPK y.F-angular-1.3.9/docs/ptore2e/example-example62/PKy.F<angular-1.3.9/docs/ptore2e/example-example62/default_test.jsN0}U/q$pV8!gD8qdoJ#ĻNB[Tiof׮LQLwjkME rଥyo)å҅8q uã5^HbɒjFUauYPeq?'Ƴ &i'"j&%5$l d P>:"e4I4^JIĒ}&bkZB {q,kK"!I-maS ʪTM%)ɕge9-1:g܏S!Tev1/I4qb@ʍ]Xgqbmnc\۲+T c FX ÓsAY`Q^j~8BzgÍ3A :Jn@UU~T;v DX i! PKΕPK y.F-angular-1.3.9/docs/ptore2e/example-example63/PKy.F<angular-1.3.9/docs/ptore2e/example-example63/default_test.jsQN!+&{M,{0bV*C&†u3ց;" B򴘑}X:9zpihkU߲r dM&J`Zg+5M,LZ][ 2qdYU4H6xD8)Qb ׍Hw!^PKx>PKy.F;angular-1.3.9/docs/ptore2e/example-example63/jquery_test.jsN0 { KS b`H5\`Hovޒj ՈSTD+PK&KEPK y.F-angular-1.3.9/docs/ptore2e/example-example64/PKy.F<angular-1.3.9/docs/ptore2e/example-example64/default_test.jsPMO ﯘ$x1<AHn u&z&in.}Gt҉R7ڌ]艆 vfX&X4{|? p߻`v#OQc;R1.ޒa^)[umtW'%<&[0C3AO Yb,oUg_Ju3slaHW$9&w$v+c OPK=V?PKy.F;angular-1.3.9/docs/ptore2e/example-example64/jquery_test.jsP=O0+NYH$  ;6cJ0N 0UuC4ɚ7DG(x;=>` eu-/^XV}ױâ\ntK"cO֐_mU73WG8%,&8 A &QI֭6M-fsr!^,St-%|>PK_;ۍPK y.F-angular-1.3.9/docs/ptore2e/example-example65/PKy.F<angular-1.3.9/docs/ptore2e/example-example65/default_test.jsPMO ﯘ$Ճ^{GPx%Rh`[cBݸof>,Inl:,A*zt#c 8Ą61G)z!sFkemo=V=ߏ<.XȓoTαydFW xs% Arua %Ќ$EwX8[ՙ)|R]q\"[Rl."8h.ENI+? X*PK PKy.F;angular-1.3.9/docs/ptore2e/example-example65/jquery_test.jsP=O0+NYH$ԁ#?±_cܦBwPQ &|}Dnh;Yyg9LіO v˪O5:vX4[|? pߍ`i^¹xU]$|u3q+CƐr '~2CDz?3#H;:;9ۺަ}E]sN.1X EVc겜nW»'PKJPK y.F-angular-1.3.9/docs/ptore2e/example-example66/PKy.F<angular-1.3.9/docs/ptore2e/example-example66/default_test.jsPAj1 b .!C ^[ɚz`Bߣm m/=h$Уn5kr(ifDOqOw fd.Rԯp: QZ~i% \2jɾ+cZo5F}Q_ju)V)Qk]$WtkyJ|PK1PK y.F-angular-1.3.9/docs/ptore2e/example-example67/PKy.F<angular-1.3.9/docs/ptore2e/example-example67/default_test.jsN0 { K\ka1v/864>%QxwRm?q-cUi^"v c,$`S$/Sm+mֳbe'\rs7^mpxnCU/5BɃL Lgs;&EzB;i`~zR AU]c(mKUd/#G:8/XjLD $P,chـۻKs)^Q&_ k9F* O* z''gB4Q0֔. s]mf2 ?RkZaJMᰈV?$fX"PKbPK y.F-angular-1.3.9/docs/ptore2e/example-example78/PKy.F<angular-1.3.9/docs/ptore2e/example-example78/default_test.jsQN0+pF$7!U?"{]R!hEO[hVaA e$if+]`{ښ0{МiXz=T"iZelqhX}©Ț?OJ8d=s:&a5+8( РEG Su DKO|l^I)c~S2Z-~)u_fX}$kJ]:pn/s>U1#YDK輁q!/PK_PKy.F;angular-1.3.9/docs/ptore2e/example-example78/jquery_test.jsQN0+pF"$7!v^Di-ZvW(6ZIY(NJ}w6.nM+cLx'Z"ZJwMdhpjͨPmlS@Fbcr@cBFN#Jh=p񲬓'ґ/vƔ!J -;8~),Pk.zסN]6zO)ܷ:R>^z,z&Ќ4iBZ_PKX5PK y.F-angular-1.3.9/docs/ptore2e/example-example83/PKy.F<angular-1.3.9/docs/ptore2e/example-example83/default_test.jsn0đh\ rTncOxw&li*!$O &mb}]l𢆟[!@{q N`1|O?2Ill&$qVlM\F޿u D"Ex5qKI?1t:T5e{|()֊oE$4 ]e('EkaL W</Js9ⳍ/il;GjLnUg#6W;Oh+AyrT&]*a ;){KCnF|r)eyF}Γ7ʹbI5d3⢾/{O GS ?u,>GLSvN PK$c/;PKy.F;angular-1.3.9/docs/ptore2e/example-example83/jquery_test.jsn0đظh/冄TncOSR!ޝ7[ʖ %Lόb0h[d5||Qbtp/9j J*Cׄ)cĶiNg5Nvkꙴ9cmݶ^F^e.B*kt;}DOm`ЉTR,[4k WNIT|[+>ƒ32w=pxqMg~3n(U'Н}Qm|Hcہ8QTTcj{:ٻ: %9@+_ =B41Ryє^H[r0JTS M)ϯ.6"m8hg(vQ-K´l#p}>Rl z :o:@sXeӻicnB)p]A^PKDPK y.F-angular-1.3.9/docs/ptore2e/example-example84/PKy.F<angular-1.3.9/docs/ptore2e/example-example84/default_test.js}PN0 )^H,݀ä ހ!M<)m؅"Ļ$zX_l ʪY >V&Aa_ bƒg3 I0_Z&γdY5vRi?zk9P9Օg)o&|M/`;on A6Ig۵< 59أeya}#K4G"xgq*Ue W2.- |'p@x>_PKȤCPKy.F;angular-1.3.9/docs/ptore2e/example-example84/jquery_test.js}N0 { $M74q7 & J $ 8lt5򢸁h}|T}ܻmzxJ7O]uAʒp=cE=Xg*5U8wsᾲ|y0e[Wls+9΀rVL{=["%s*s>KMęi=/J:2r,'Xq iڲ2`ǼU@^2ہy|PKU$&PK y.F-angular-1.3.9/docs/ptore2e/example-example86/PKy.F<angular-1.3.9/docs/ptore2e/example-example86/default_test.jsePKO0 WX@BHhiGni2%(Bw l{ضMrin8.lspV R|Otʌ+ vS|ϔ_Z!=;o&KZtStA`iG|VK8F8{ f$aB .x='r"H& X[;Ѷ}Rry-+靖uJ*ʳ&!P=7PKª)nPKy.F;angular-1.3.9/docs/ptore2e/example-example86/jquery_test.jseMO0 V/qM5iڑG.ڌ4;:!;TG>?,e&[؏k\T#SiD;ezE)~dJ+R눱ң&5=$Rx|h]45Y,\ 4F۴^$v19vKF4i6bH/VuK=*HIΓ}A,}?qS n`{f?j vl4y iZ_?.urMVգUp˛r},Զ+l+/YZyw_ >jkd(,n_w/;kǹx1!d+W=h8ו؅]adMд4ܴc]>Bs 9>KOo+} rY=14$/GPKA PKy.F;angular-1.3.9/docs/ptore2e/example-example87/jquery_test.jsTn0+l9R@SCPSfJ Iv{m)kDM.~,fvgtx J^&{-XcBҿ kwYqhF}mJ*1&wsTx1>~K-p;{|/x$?GҳȭMrc-JUY/R6[.zҌ >JlαHfndWa0=9sSi˪3=L.@Ţ3SmI AwzFY6w dFC_x <{t䔶lkZ~6_hhanyoCc9!=ehh^w!9:ׅh2a%I4]tzM~5X\$9'q)8G2^N&Ax8j:PKJ5'PK y.F-angular-1.3.9/docs/ptore2e/example-example88/PKy.F<angular-1.3.9/docs/ptore2e/example-example88/default_test.jsO0^HE @{bohxZ[r6B|wn#SX.wM2މ~-0@>'~ibQ9RہXֽj|WtĶa](uj̵>r*r-ԒK u(^$`$.J^0IQ*lA&0!DJEtIb,*߻$R&ĺ:5mV=GG+浃gDؼ0DVن(FCݻꖝ]zآK'Ws520%wHC?+aZ~Oj$^c/Y1&bt/Eb2r)ߍFwxIf2x+bhy#; Q-fP'k9ќ1w)5<aPK;PKy.F;angular-1.3.9/docs/ptore2e/example-example88/jquery_test.jsO0\Hl*퉽=Limة6B|wn#x]Ȳ7m_ '[j9O[l`T'{xmOQdu\Jׄ% }?l6Km%~zCbk"t]v^Kl,Q0y:<( -ȳBG$F@1H5QE6(LbUښinGУ#|u³r@8#ٚ(Mꖝ]zآ 'WS5Cv?JCv~V!ȓ}OjTƒӇ=!_cL^0sĀayIvO$0el_i# A-&P'k>ќ1)5<aPK6m1 PK y.F-angular-1.3.9/docs/ptore2e/example-example89/PKy.F<angular-1.3.9/docs/ptore2e/example-example89/default_test.jsN 7 8.d)݅Zj23A@^1u}-zzyk^zS.V !Mk,)-zayapp}+#`"2n宊(“@&b6ntd\f[-2+iK'd]GԗH*ͷ GᙨSi:mKÌ}˟G\y/60X752ZS\l/ߜ PKWKPKy.F;angular-1.3.9/docs/ptore2e/example-example89/jquery_test.jsN } KibUc]@lm.ԺUf~ ӡUnuffKƵC%R[*8Zj05OLDTYg.2Wq`0 WvjB2wemU'ݙQ͓x2 DHMGHHշEdLIoU7uMN/Δ?] b1|`8(\-h2aJcl俑PKR RPK y.F,angular-1.3.9/docs/ptore2e/example-example9/PKy.F;angular-1.3.9/docs/ptore2e/example-example9/default_test.jseOJ0S $u]d*=!?6&%I|'173( k4˖PVF,e8p޹X ǒˆ̂>K3VcQr283x,V3-U8MlMƦ?q#%qQ@$u ء h# ϶^IgwƠe7:C踝=a,Opd>.ezIӡUnuffKƵC%R[*8Zl05OLDTYg.2Wq`0 WvjB2wemU'ݙQ͓x2 DHMGHHշEdLIoU7uMN/Δ?] b1|`8(\-h2aJcl俑PKy!RPK y.F-angular-1.3.9/docs/ptore2e/example-example91/PKy.F<angular-1.3.9/docs/ptore2e/example-example91/default_test.jsQKj0ɐM!i 4]H-"KFw!w y *1 Eة@Y;G“xP؞)>3V!TuڔE ˦5x+3)-kjL _[ilВPB;U@F'8j<ւ:SRwF:s=}@I8xfs;(v׋PKEˎ CPK y.F-angular-1.3.9/docs/ptore2e/example-example92/PKy.F<angular-1.3.9/docs/ptore2e/example-example92/default_test.js1O0S8uD7بT6±#!;4@P8>`V( d/v*B wnCĵҍYwPŰOƹV#3 :8sxY΅UiA6Ժ?bJ{KY;l9yAOz:%?zy{&4yIĥ&@" D)?+N<|DQH 1Epow%|э5hB!B;xׅW1MLN?`pzG.ӾpxFPKx*PKy.F;angular-1.3.9/docs/ptore2e/example-example92/jquery_test.js1O0S8uD7بT68KZ U8>ݹĨ)P$;x'2lT=-- \KkG ~1ȣSBI[1^5|*,rJI6 |tp*D:F>j{F47D+8qߣxfKl T 0"WdHط|8H {Y&?*jýL4t#GU Уob!O\gR[88 Vrĵ,]hJ}PKr1PK y.F-angular-1.3.9/docs/ptore2e/example-example93/PKy.F<angular-1.3.9/docs/ptore2e/example-example93/default_test.js}Q=O!WmDK |%aᄷ^]Cwx̛7X&9 nȾ] !'H(7 @*Ӳ?8#)gHbm+K*;okMaPv).XD9;6ޒV`R![{tAz `q|߂_33S"BJPW )odk3pl3.9pX%0F֫25e e}PKN4PKy.F;angular-1.3.9/docs/ptore2e/example-example93/jquery_test.js}Q;o +SUudCW CV^층F@p|wIGw^ cCYFC@M>DR7(DT "_r\;Bu֙*e{ts΅zAx+Qo,29CyQ]gЫ&ТY$\NL 5k2<Ðwb y`D Ϫ#hd+*easuʒcNf+F\]0k!/PKe ;PK y.F-angular-1.3.9/docs/ptore2e/example-example94/PKy.F<angular-1.3.9/docs/ptore2e/example-example94/default_test.jsmPN0+V!D 84Vodo 8%*pǎM@Us9>vD:Qbcx,A Gm G$~H*3:6wX8܊6x|tXAP5yQuxkG"G>f@kIH #(ڜU)iZ VԿpQ(NXDREK'p۲+krPKavPKy.F;angular-1.3.9/docs/ptore2e/example-example94/jquery_test.jsmP1N0PđH Du8b{9!sDv3;H&(nAU#zӑ"C:qfPx葺 e!fmk٤'kQo]RΈfպ9QexZA'c+b:A~ȲpDK1bwrn\]6ez28 0̵K+#BHأKBζֵbBB|<9=I2;2.h`6 >ˋzcCZ da+~@bOj)cҤ`M&ds@lЖ+PKqa2#PKy.F;angular-1.3.9/docs/ptore2e/example-example95/jquery_test.jsOO!d/KOdzôK; Xݦw֍?`{_jUuVd5;{RӒM\*hŧ96M?G ]SoITdC㠺[Lufc6uT%qg6 [ߓa"l[7~WGBHءKB֭?܅Ɓ)AJ~VoIHH߭|D^&DHZ7zyyX1v#LSg@?onҽ$S "LPKTK2PKy.F;angular-1.3.9/docs/ptore2e/example-example97/jquery_test.js=o0wQ@4["!R](ѦHj E{lbw} YsПoPz p.7l\6ڨr2p+7|ip{|oзOR (Յ5kꧨ1P}Yى1!4X\ʖ{\P"b¥3Mmw>n)I1XshZr"t hw'm'qY"գ_kh#+B ! 'Xh4*Jִ}t BLsTa)%BSh(a)@`ҐZu^-S uJZR>0C25;G'e c1mb,G nxړv8jM(/PK)PK y.F-angular-1.3.9/docs/ptore2e/example-example99/PKy.F<angular-1.3.9/docs/ptore2e/example-example99/default_test.jsN 7&k9ɮ$ZLl^@#N $umqGaq'pmxQ¯:W'"}x?`DJˉ`ë"2 NҶg7 @}ik-Ix :OlX@b+ >4MM ގ4?Ю~l& mvgQُ|TN2<1Jԝyۣ*h =PӜ16+#fKD">\ڄPK6\1%PKy.F;angular-1.3.9/docs/ptore2e/example-example99/jquery_test.jsN 7dmU6\1ٕ CgvQ]Z w~pH*KIGmET2ܐ_uB[kbO0+aU`Z@|+g7 JT1t8X􀠩T=\ 3+iGghh;G0IN)ˆ?wA=颈f768PKj7,PK y.F3angular-1.3.9/docs/ptore2e/example-input-directive/PKy.FBangular-1.3.9/docs/ptore2e/example-input-directive/default_test.js͕M0)A\@EB NOK(MXgm&-\w> %,Mc aK_gmXwT:\f88D{(AFo[ ,+Jʯz0}fׄ[!R{\I#-Uh\z.9;}ŐcpA_0ĤL# T CcJQf~F53Xk( /`/?[l6~&piX~Ŏ٦A,ǝ2X= :1&NڋgxHC]6bt%BX_,ӋבIhNҀB 5HiBrSB_:"d!zz5W@նWike JHkvPo3F>MNhC5k \N Y56^uKA$KPKjFPK y.F:angular-1.3.9/docs/ptore2e/example-location-hashbang-mode/PKy.FIangular-1.3.9/docs/ptore2e/example-location-hashbang-mode/default_test.jsn0^g%Ԙ*UTm1F5 M~Tw&!&"U*0sS׮Ap~ʾաVuZ9ó}9Yi#ֱ*bÍ'0 ߫ -`baQQ䪭 m[iBcyy~g1;U A;|>>izGtĄ-l}Rcʟo-T0jM0T7ۂiJXݖȰeUKvSdǯ>H "ǰrn+|?%;5ZF ZC>j=_T:kh):Ԏ+ A9br\%H9efS!Ɓɔbw@Vjw?Y^dCܧRZO{p''ɃwLgT< ⱴǁk'/}nеz{1iPKvPKy.FHangular-1.3.9/docs/ptore2e/example-location-hashbang-mode/jquery_test.jsn0y Y)T݊ U7 8gk2YGU}@X h#U*̙ovUV"e1ˡDOJq؂7( xV >Z53ZgFyz9[aYU݂IV1{TEG\0:|'O41!4,l6Fj\e~oYW|jɤB~6T//Uu kfQx-m:!%I<@-hdl Iʀ (K*r;*-'Wz){d0F+(@ϰ b՚tI\W3)҉]#DtDގѡv\Hk)+}yFFx/ș(3# HFkwj]-IpE6m*tqr~~hy7D#yBՏϡʃΰ.K8p_tWz? >:.N?PK88PK y.F7angular-1.3.9/docs/ptore2e/example-location-html5-mode/PKy.FFangular-1.3.9/docs/ptore2e/example-location-html5-mode/default_test.jsj0~ ,C#w %%D7lAQUX;ص =\֝n 2XpŽ)Bta͡CP wINE$zTh$R5OE՛a$&¹0fh Mk vqi|e^J[^w '' g 996cef=?w_j!AWvUbhl PKhTzPKy.FEangular-1.3.9/docs/ptore2e/example-location-html5-mode/jquery_test.jsn0y ˙]LRE* bVlU}ٌ,M"!uEsभ `ސ3hXF^B}x*B OB*vȚ{Oa!p\ۀgj]%JN4F)7۲ڔ[ՁNpMb,-8n44`<+\:bzK&DYvv}1. oWb],Tz$Iw ;]דJ<á,R Qy-] ҳ) \}ҭY=> j`Dm6,rp=J,A<;h Mc|VĢ-KwstB?.$7ja+}hA_g*.ɩ(DVJ F!%]P$܈m&c" 'ʏvд`y`kR8-q4?}?Ww7 $2GS>TZlq>sF? 򶃏:CcczX PK ҎPK y.F9angular-1.3.9/docs/ptore2e/example-month-input-directive/PKy.FHangular-1.3.9/docs/ptore2e/example-month-input-directive/default_test.jsSMo0EiC^@DOT N< 8ݶ)E r17}T,^*:(kX?fw6,9Unؤ*ٍG`1JRڗm0o \.TH&:+>KH]Qc&+fO"d=],/>b|kIJpǧJcǡnVPG爓s68Q VPE q{pkO صI%gOr$l{=&ΟZ&Vm):jG\_=-l(qFSR0 eG=V$7lTY[uεwdw^C茌P|rNgX0 @}m;d?]z<%mD_M}psĞ!*lX1Ǹ:L{F#Rg3X$TPl?.vs$5n+ {rX(7c҃xW4.b:"-cQjOkVm,yȧ,ߢo\LJhmZVlěD\̏OO 9I PKeynaPKy.FGangular-1.3.9/docs/ptore2e/example-month-input-directive/jquery_test.jsSMo0EiʡU/ET'^'ݘ:vgn۔"9DyvBeaM53;Y*\Z Q7lRcCڣ0VXVEe)mK܈ӸքfL\*Ke$nn#7YYx'tDj[4U=̊?At// Ul!~@') Z+QYYB#ND+XIG9=Ǯ.$ǁ;`!XZÍk.?uMb9}B1,eߩ5!t,W*4mKaVQ W>⢼vp|`46 Qo^FAxoErS"I%U*NXl]{_Hzdw.-Q{`|׶CVuH_F )OIBˆ=cϴ>]`4"%~6S徱QK2JE!%MGAO:GLr\&'2,?> I|PW& FƲcLj"ƣE \6)Ȍ[4.G[9d'1P8\ SV!5Ժ΄ޘ4d5,l!NӁQit0<_A=x.uλ(QDvh\߬#)(]Qo\[IR#Y_2p>a_VrFPK'`6PKy.FDangular-1.3.9/docs/ptore2e/example-ngChange-directive/jquery_test.jsAn0D9T* zpk؄ADJAƞyV5DQ Ydžhp {QirƥHo"wou!Z{=DCɀFlY9;3d`{\keR QeF X=^ce-.; Zc4"ŽXIjrPk:H2@angular-1.3.9/docs/ptore2e/example-ngController/jquery_test.jsSю0|+,^bbTJUǶ? 186U! UDJd;Be ObYC.9Bi# &mb29u5~<1wyT:DW'+cxN塌 IL:37A99^f~s<ƛ4`/jd gD9A=JըEY)=EZ#*MTadjC4ZO T)PK%}ƠPKy.F@angular-1.3.9/docs/ptore2e/example-ngControllerAs/jquery_test.jsTj0Src Fa.׽,jd)[wQ:!u`cG6t5;/AE!Э£!ҍ8e\Cc(e\X6HbRw֙ :ͱW2S aIs ƽluitx^XUjB P *Ube=Ff[$꽴FT4Þ9U;$:yR9 $j a$!bk;BQ=(UI]kX1Oܡ".E=u GKՔSxZr y|8"#0b։ ;92Ӌv}jbY +`> Ñ)󵴨 qSpPž{R;T1'[)>5HJj__r}O|S?PK,]֦PK y.F4angular-1.3.9/docs/ptore2e/example-ngList-directive/PK y.F=angular-1.3.9/docs/ptore2e/example-ngList-directive-newlines/PKy.FLangular-1.3.9/docs/ptore2e/example-ngList-directive-newlines/default_test.jsmN0 { +=v@ȍrh J*qNveH!߶ jpaH8bwr2x u_:XUp&sXĸ޵ZyI;~x+ j\º;#SqU>g\`-;'so}y鑆%4zXK^gk/C#Q䨽jRrc tV&2NR,uqHg/(1R a*zQ4d}PKQPKy.FKangular-1.3.9/docs/ptore2e/example-ngList-directive-newlines/jquery_test.jsmN0 { =v@ȍrh͔:%qVveH!6`5$q'\IWu~`U=/Ccz D֙uXu[Sd#g /Β(,ۀa*Z\͑>}c[?8w[ƑAO='>R?dG+=7T:< ?h>=HSTiRz9Դ6]8Ү ҳ$WYVĕ%9.J0II3j/PK/APKy.FCangular-1.3.9/docs/ptore2e/example-ngList-directive/default_test.jsN0 QudtuA,3) 7 O9N.tUՀ{BݨR[T"p"VvS{J6]d^ۤq_[|pKG]^>}c-,=:ؙ P5\LXD!@dݎ&kr>4D3qo_8^RL,OZyssoє]xچG^4A1pe)X7a:'dQ7Uo`Q@4 ۺln?8bfp<9_0}3) aim$:JAyp `.N_QV8ْ.ʆHIdPK؜zGPKy.FBangular-1.3.9/docs/ptore2e/example-ngList-directive/jquery_test.jsRn0 )ceQ`%E ADDz,ۭX/E}C;]-誺P;QJlR7ZRNPj=eHMOrm?'Xytp\>~ f1TͤG9 , nGA5n>am 5`wsx+Jє|*3Di[4@!8ѳgPL8߬d @Ⱥi %![~"~C.*4|%ӐC8 02{еv#Bi?:kAoĞǷΛ4]tQR̀Fp%?$13ۭ #v/OPKq̀NPK y.FAangular-1.3.9/docs/ptore2e/example-ngModelOptions-directive-blur/PKy.FPangular-1.3.9/docs/ptore2e/example-ngModelOptions-directive-blur/default_test.js_k0) ` `11qɍZƾXكb9TNU@ly[qGX꛸`k\*rK*g{m8iVJZW04+A?)_J `YVHXΊ}/R&tЀAZXhRȋhHjeڀ񀟴kpk%G>PHs_۠%Z۞6؎!#iNj|4Z=7`h# :d H-_q2?L1/zVrV늋FA:k03pQs ]1]q:#ӗ;BkEZ"DV>߭S`xɚPKuKhLPKy.FOangular-1.3.9/docs/ptore2e/example-ngModelOptions-directive-blur/jquery_test.js_K0)>0O" nK.Zn>49sZ ^8Uϯ&! }W%l~ёQEnIуc-ǽ- AiV%n4|>,JЏMb D,JR uuZgNj0Hˎѥ̖f!Q^CGCR+9H)(b*)q#ﳄΕ"'B684aN˜9?PKO PK y.F4angular-1.3.9/docs/ptore2e/example-ngView-directive/PKy.FCangular-1.3.9/docs/ptore2e/example-ngView-directive/default_test.js?O0w>%DuPu@X"ڦB|w!*$젳W's˞˙R;U$^ʩEX[/:5ԕ";&x֓jѕlWBoḙbc'y:guմES&8ei=1ъAj[*@h ^-:\y=FoX ,;Am1;(78[qG4/se)gZ85F8a_cw,w'[=&"_OG)K2PK~8PKy.FBangular-1.3.9/docs/ptore2e/example-ngView-directive/jquery_test.js?O0~ +K$ bD' 081u|⴩ߝs? `; tl2INĺ:X23!v!; HT_tbRsQ;cp@I[gJ+aPMͭ}n,Ai!|Ed˸liWcpPMkI-T[8pЀ: \nT,yevVo+NB p:MccerB"J`oT\3vTM?bﭢ`:֊O1ΟROcxPKhJ?PK y.F:angular-1.3.9/docs/ptore2e/example-number-input-directive/PKy.FIangular-1.3.9/docs/ptore2e/example-number-input-directive/default_test.jsj0E,CtY*d=\Yr{e%!P k|FsJl+GYCLV ~M`mnxcA8ޢ+OmPۢgBڪ]`u17A ts2MsIL 2rʊQ+Ѯ*` 5Pٲ<ˋH7H=<[4}$}x٧Du<۝ J_@_}wcɰbYQ>Y9/WyZ󄒼zp\UF P ?\엮r}E#_phY>xy ' XO5W/m4 \=Lm= PK9EDPKy.FHangular-1.3.9/docs/ptore2e/example-number-input-directive/jquery_test.jsj0E a vH,Ytm@==\^YIpB793\mͲ{]{4sFH,|7fN8rȊpkCmf<saj7VAq%6R(|CJf(1 v |xL<ˋH7H5<Ծ9\*^ ߟۚ A @! ͯ }GɰyӢy234_,4 Eq6{9Wm4õ~Z45hT#z6jJߔnt6XXajqPK v4JKPK y.F9angular-1.3.9/docs/ptore2e/example-radio-input-directive/PKy.FHangular-1.3.9/docs/ptore2e/example-radio-input-directive/default_test.jsMN0 s8M#Vhn0ȏp*u"IKHXޗs(#4̓.9H F} 驾<^م~ԡR~ػ^_.r;\8\b6i65 #v) y =YsĥCrSA3m*q귰l |U+Y\ʠ=-7: 9rD7?<(W7`ۚ|PKۂrPKy.FGangular-1.3.9/docs/ptore2e/example-radio-input-directive/jquery_test.jsMN0 sM#Vhnܸb$ĂE~sNJ9A>J]lVYP_OhtjWG2ϘV{+B=.v.]!rT 1cr>KV0_ #5s( Ψfe< GLj\tt[Tgjg\?qhGK"GH7xVf=_PK,*sPK y.F8angular-1.3.9/docs/ptore2e/example-text-input-directive/PKy.FGangular-1.3.9/docs/ptore2e/example-text-input-directive/default_test.jsKn09*aʪJ7a$?=NU^Ay4Jux/E̺`ZBkxžcZڨxj6/[كWb\ J֯`zPpXD3ZJtUB#a{Ҫw~.[LPo4-/ӯhB:]S&O}xݧuqAI O`dY&˛Lab<1UU}^nvlu& )Kqq聦[֭xx,x0&tVz bvH:Y% J,&PK$ GPKy.FFangular-1.3.9/docs/ptore2e/example-text-input-directive/jquery_test.jsMn09*aBPeU%n{0=NU^4Juxx'7kY`BkxcZZx֢/Uljg\uE<R/aWp( *J"h$ .ʊD== 1jPǪ&4[_yI 7jZ^=Mʓo^._ w6( a\ ,M01O|U=yQTd_!>x& S-05Dcpl[cFp|Zxx0 Ftz bfn@:ɬuʼPKM$PK y.F8angular-1.3.9/docs/ptore2e/example-time-input-directive/PKy.FGangular-1.3.9/docs/ptore2e/example-time-input-directive/default_test.jsSn@+FV%]B@JpqX{'ɪkٝmhYI۴E q7jo*YfɸVkp5NZu:zϤ:ȫ/XiSy Įs$`Op(ku.|æuZΆ`GKŰ9XuaRsCX5j*_bB,q!G[G'OIAO8fǠ:V'u۰ 9ReIo1y%9 ӍmZCyq;2Fɭ9% `Ln3Bu( yήx"rctw.xK(Se 9֑+MGGDݎFD.ZF2l?.\us$H$V7 b~DpYtiuӬr3l:Z? DbGT5~=B};'u7PKkncPKy.FFangular-1.3.9/docs/ptore2e/example-time-input-directive/jquery_test.jsSn0}WXѤ8:cP*$xb o[3a߹Nn6/Q{9*,{֨1v-=Wsa&%߫cC;aw^8-yVEmT\JX˦5{n`mqr W|'ؘHln(Q& XU'*Bi/$”eӦVπJ?|k3Fe=2kC/kt\A< ruBl[1A%tcviʲ/'lӺv3!!Șdv1l/0-˅eDRE4җ"y0y{TXgNSoCKwcPIIoʑBD#n^ƶݙw^;2B9% `Ll3@Bڵ q tw 4 bct |4E ЇP~8֧EN#RnG#<K"4jJOH6-[Jz9BȋBHKmytnzxHw<\}tEZ4+ ԟ@4-viا=rd9ϥ Aڥ]jO^O'PqNI4 PKdutjPK y.F7angular-1.3.9/docs/ptore2e/example-url-input-directive/PKy.FFangular-1.3.9/docs/ptore2e/example-url-input-directive/default_test.jsAN0E=U!őuʆ-IbgRwvRUlg̛h`5ɠ%\1D;Yw-*e*Aآq@|Fcu*-/1؍HmD=TkDGήDUB#( xO^ =IyU"D/LxIa$N)lL4_-Ca_`x:.{ H;X;p:'+37PKVܸKPKy.FEangular-1.3.9/docs/ptore2e/example-url-input-directive/jquery_test.jsAn0E9UH[eUn{3NU^CP4Juc̛/4U0 z}+2y>We`1)1VV-cm C?d\j _h.5V} t㥈w m$=k]0]|&BdWPd|óS'Kk181w蛋>I!-FL"YD5=y '$YK=eXlx1΄W"L)S0KCn8vl9M==tޑW59_ҞhA]<%H<`(ku>^~tֵk;I.VbIԅӲ\ZJ֮)UVBdOru9Er@ԛ hn>juQ cz8[,U6#W0"0΋31Jnm[,? 6 (d]lA{[7yS_\]@G} '.`1_xo:<"'n21$tj6ʐdv'#&9.qM($2ȏLX` gˢHf̔9`Q.>}ڳQm\]ڥFěUo >Ky2Qכ0 ŰUadQM9c(b$UVmO?&8eb].Y>fb+##ڜ^@,?mPp_YmuZO{hRח (Qeq5160ju7rQK2JE!!uKIO:GLr\:'2,?:8|3:8$AH{/ .\tE4+$T@-6Oiا=b;p9/AڦYjOIT翓R'PK5rjPKy.Fangular-1.3.9/errors.jsonYkoI+O$'1 Ul0dDD¢AN.ҮjxQsdvqu=sO_6l0̌3AGÁ&WiGOC|oj.V|_+1y0_+ (٘:̻`SCSp~6Y+d^P}ݿ܎`;SMmnZ 1ilH۪4ۙU&fs.q>* jprzaŚ808`sjk*|X(_Fph\̘|T1JMWjbɧ6QpX2ES6CiB/a&V~iz_5na-Vq!VWfUĴqccRc0#R ١)61A w&8l2Ri~X:3̱]M@N_Z\Amb0Ru T#jSߙע?@\47D-*aD;yZ(!W 2ӁrtjeF=xgbE\m&Y+Tz@7;/lBb^< ߽7-6\b<5' =3]w*:A3Q!~ Nm'7*CF9 \|sst+Y\UFĝ<2TUO_ØY(ɱ:|XYS0{٘1`%Ԋu,JaWj]I]-ޠ`nNVM^R4x.\w{mr{Ea9+Ķm7am+`,žF{I!K wKXe@ Bp:#=׎zNK-OOLy$)qF-ju |겾m7;E[4Xqpl('dF*MY-%łe;~ /{9e>1iMSC0 $Ubhtlf]3}J:1La{8i *N*kC-v]Z彝YNOHwC\o=^9[W{J:bו&^ǥ(يֲ2hs`j^mx@/!rX(t0&B/ў1.df3 ܟX_k %}FCbcϑMp.\꬐ht5t7m hG"YXjd%`s57!2YzA]^BF0bD~F%KJt?8uS qh# %(jfoSRMaQۘ +|̽0i;6d ?XVhՍk=IV%Ŗ xh08T.\H E󧾆PpnN nfAm3nW7 B3w͵ 9tGtPIDlY-5v,䘅dMWI ::D&j_0m$j &_"c6jEKz3s/ȗXط2єU{wu" Q4Ne>3Eҙ`9SMH&% 87;Y_B`rVPS7x00rDpDÀP$˼wb(9Q4 rStvv~aU_f2l3uHt?n[D( `ݾ6Y=GoOo'Q+t偳O*6oBD4uc殊*lD'5 "("5GQ7xlsD7ڻvuySm4^eqO@`ͮ/0[й 7SqТQQ/VB 3'T.o+^'OU;=+؛UKvB!KRZz~=V3֩ѓ;hS=vF.^U +{Cu\K4diYA*Pl -:rYX=T&D`{mM#٫2 7 xk6׭Q.>ƍUJՄj|[Ce )}jj> Q 6eN`QgB('-o4@HXPߛ!0Ayow["j8IfvtISNvضO-o-\*ueY U B+,w&K$(#'lO r1=1 x4ܺpp-IKQ=XX (h ¬g+'!;IUը%"tFֶ%~熎ےʽR6+Ve`-W`ϰ" ܀ x\$:i>̢NE׍,d4AJVpzA*ߑXʾߧi/'$Faϟ<k=&NzO -ȶmQJHˌ|@둇ABXfԗ7!'tY³r}/r+G #oF <ç^uW7l0ghg:d5 g]״Ie"=sS!49T"P+bE¤,] #q? ya Anp&&ѿV$/"!Rd#DPu BdR'9WЄPK ɡ vPK y.Fangular-1.3.9/i18n/PKy.F*angular-1.3.9/i18n/angular-locale_aa-dj.jsVmoFίYôA@QD)F&~!8ڸ&i+O{I-s*c1+Y -&0뇑3{ gʹgоxILI "s'ٳO;zgz@Ex8-|haJ0Lu.*ФDELHnn%4 gg C:ׁqh2yMI(uJE- J|sJ3 Gfnĸ^ B)#f7)PեO*]=|^ +~;-|BWbӞ -SZmL\Zdf[ɤ1%g2KK̵vW$R`]fzgR`)FO ˆHeB/c6UB&?:(qԵɴ_[6bi*]Zt/̹t+=Wv%cSM`?V%p7IpubJQS {<)K%h$^Cnh|"l8:eK'jßSc˿WyOaa s< & G(Ȯf[RbN K#f[L-u޿ߥy&^0~'_] ŧ8=7PK._` PKy.F*angular-1.3.9/i18n/angular-locale_aa-er.jsVmoFίYôA>΋)Fauqw!i+gT3- SLNޮ7&aY0I{n~0dbE~-kQ/Lфx=JebjCT9`>;MB٪qawӄ/E iv2 i ]N+nӃ ^BW`Ӟ-QZcH];u,of Ic9SG¯d&" .0I(C)`sZ <,dLp%0D4 +yg `ie=y)U8wq-%&j >˪_.y!p[jXaUz)'V-l3*=ZMCP bVkJE+@+@+@+@|+@\3]|n3ƕıĬ*@\@3g!   ʎ0b6-h7 hXV6_ωr^aՋ^Bu"F(U"88k_/*viS.zh򣃲'9eܹ=gsG&>\ڃkn=v%t'wJڬSlw)o/{G5 #^$81K hHz-$_]M(r @Kqz0>V egN҉Z-tX/m>yZ/Bl2a`8@Iv5ߛ\s_a4ߛd"h1#l639v8?h^/?-ڞPK@ PKy.F'angular-1.3.9/i18n/angular-locale_aa.jsVmoFίYô]?E@Ӕ^hװ&~!(6.$mUu%yg;)4K"k(yI;Nޮ7&aY0I{n~0dbE~-kQ/Lфx=JebjCT9`>;MB٪qawӄ/E iv2 i ]N+nӃ ^BW`Ӟ-QZcH];u,of Ic9SG¯d&" .0I(C)`sZ <,dLp%0D4 +yg `ie=y)U8wq-%&j >˪_.y!p[jXaUz)'V-l3*=ZMCP bVkJE+@+@+@+@|+@\3]|n3ƕıĬ*@\@3g!   ʎ0b6-h7 hXV6_ωr^aՋ^Bu"F(U"88k_/*viS.zh򣃲'9eܹ=gsG&>\ڃkn=v%t'wJڬSlw)o/{G5 #^$81K hHz-$_]M(r @Kqz0>V egN҉Z-tX/m>yZ/P0O0dJm(!/F/W2#]6A癜p;Ia|zK\}mOCt@PK=Sd PKy.F*angular-1.3.9/i18n/angular-locale_af-na.jsUn0}+R[ CFҪ&( EC%FKtwIM"|ν>ıOENQ^xUZmDBx7"3mIF Y'[HkVE3ŝ֎p4rh%z^Y/g02&3(%`0x %l/g#חs'ʭàH"@ItX;V!x,O%bv @9^TA":,e2`Ay-k8 EQӂq82&F>y3- 15,v+b#B:?ۂFx?F]#šyԚ Fs[DC 61_jGn;4慁ChA44444"I ,! OJ2Q XJXrjA{4Ӵ7jUt \95`A}NU23jZYA6dSw2c* gON$VM'.z=S?6τ(MȆ?MȔdHMcvd{F`ot Lxm(t ֲf1'Q(_K J˿TS{ĿZx;q$M#NkN!ƿ]mrsC(^3./E 5/.cت[kph~PKRmPKy.F*angular-1.3.9/i18n/angular-locale_af-za.jsU]o0}WXQ ԇ~&( ECC%rb:NpnӴH|ν>p,"?5[v.EL/,~H$V=:t-%lG)P%zkl Go?vx]ou<2Y%@*;)޺ܓPnz uf{KbBb󭁐vvX]Іl<>mҶ 0zVRPhj&)[DŽT 'bY%c@ +I|Wˌ [S=alT(saoxki`f{k"4y_]#O+0RLuaL14O`pT~4Dg}1 ँ0 CXإ8UqlX.:uK5O--ihs>/REV}9&}"~X|tepPB ]_"i.8jmz0+wh.{ PK>YjPKy.F'angular-1.3.9/i18n/angular-locale_af.jsU]o0}WXQEt PMPXK 8ȉhuk'tE{}}c8[NE"g[gKPN6<Ƒ$V-8cg;Go-h|?kϟ+^)`7rdLV 2PH~Na/0h %l'g7/ϔ[~KْDГD|k!d9vxV!x,%bv @9WA":,eL3`Ay-j8 EQӂQxc#LJ>y3  15,v'b-B:?OFx?Fm#šyԚ n[ֱ`G|:>WSZ [ӳ}zuǑ9#nDٳhe }lFw8G7DLp)ɂlxݨ= EN~"EAJ:bXBN(D=J6/%Bj±[_eu70ڂSSMg'9\GS&7QBSkZQRUN~$(W"D~)öMP6!:-_uKjMK~qhit- 16pQhuJ/1 dpiVkf/Z1oDmQj41M\b/ zbBIݻ ? [bm7F@? ZI P8L4% A/jab8U7zϦ{@^{{$}rJh)OӛFwSއ,&I8^"zk?3Q&)#d$"gq R[IF O"kQS$IBK~f!QCHَp x8&.M(nb^RW'Ou[-.u ݞh*k{c3v'mY\c 9_`PKdM PKy.F(angular-1.3.9/i18n/angular-locale_agq.jsVmoFίXY׋i gIyQTQbH1 Cz(k/pwfm5GEZxgym8d$g]uJ/bUϷb _Oyc5sQ֠ӘvNX"(sDM\d =TwMARΠ%ľ¿[~(foӁ Ɨ# H8,4%(jx p/`$›Hf;9<5v9(h n|)OSO~b]8MuڊH2k[.\.ձ.Ni!V#2| |˞/b[CWFU%4GLٗFwS8&8;&{ 0У_·>jH9& 9[Q4j A$1YD٦J"K.řt")No<{)'_lBş*ڍ(:$ύtT'Yop΂A&8ꉉF޿' =Nb{w:sUzg=οCnPK+HL PKy.F*angular-1.3.9/i18n/angular-locale_ak-gh.jsVmoF_1B3iϾU=[Q8I#E(XoiH633ϼn'4E؆$*ls=*r?.+ԏZagړ7~}?ҲWpO5# ,έP'->{4gSP ;gj'X9[UptLD #2XHg.jyj>i4hLTNbIKxۯ;.nNlnjĥ@=\:;JㆧO O G&6+p-,.Ckm'k,b0=LQuO#b x5}cW(h\x-Ӭ5_uuF,휎M Gp^jpRjaK%4'$y:&e51^Af`iz-f|2ɑOڡLQ"R8i4A0&)W@1LuKz%ئ2.Ckt$iZ4ᙺpwļ Kdi}xgܒbĥIC zSoφ}ض1+S.+12qZ Vm,*S q {.g&P"R<0-D{WL4/nqZLM 䞨CFwQR@+۲^ʳ.O%*p2"f;*$/2Į;,ؐqG&L=-..Ė$:^N^xtBAixlTpÿPK  PKy.F'angular-1.3.9/i18n/angular-locale_ak.jsVmoFίY׋i1w*_0!"ȐFE ^{l/>߬_5Z{ye޽18Uro>Ap [߅+S_FsrJ%քCcG"ӵ>7n,{WpӰ(h51P`?E |h7R3C`Jk`@#:1-@;L4+QZHM <㮨CFa\mQACJz/YtSI8r ]GχsDHP>MDkt[n?wb7Av۷sx A8xnB)lHp|ĿPK$y PKy.F*angular-1.3.9/i18n/angular-locale_am-et.jsVkO@ί4& j;EX$~@)%UcfۂM ;wtǮٸMh:q9l,,N%"bNEli›RԺ+ Q~/{Q_LR@Sd>ӗ},>y~|ZD5 : ].-JY碇<8_,H `-ncW4ߵ]F )Y igEi}h9wq~or3ؼae%;a_YC)'`<,:캮[؁pG,eٯyJh&+^Y»eTI0f5$Q1:yX+2bDohZbHU)a"P˴>oyTd,1cPR'p#pi]{h%.pU&݃;~{kOW|}VSw\E`b24 >UTWXbjE"MLmV|4Ek )2yd-|WĆ.ɬP}qEsC~/CDN7m@_CYW4г䢴>׻Co8V7Ml^0ٰ̲!wg0ziv]rխF@ F#Wl{p2q<%4U,2*$ 3l5$Q1:yX+2bDohZbHU)a"P˴>o1KGEƢ~9%uyxEp"B8$B)ق3X@B /D=:I -;5~PK|5 PKy.F+angular-1.3.9/i18n/angular-locale_ar-001.jsWmo0ίk I I/R(UC F I|N 44i_V$,sw1Y:dGlVh0O<4)߄6܍/-ѝ2, vH^+4"پtږ~3GE^fA' aźe'foa>s`n#X4xf֕n2UWxbVj:cZ9g)t0S1CU-coihk(4/ZWETMܢ Bo/⸈\D9"D L)⬀`ɚe8|vSӍaXiԛMRPPjj!^갛{х i\L#Z;(|f؁'ÏY&Sb/]Ϫ<FM|F67"˳O'Ќה.y!bD:^EC @Aodtw;`dT@u`n:CX4xfֵn2xDҪQbWxbVj:gZ9g)t0S1CU-coihk(4/XETMܢ B?"^@qD[% rD/NRy+5MM EJ<$o"UU FuPTS.d\@N[kZG9ܱW9&wAc;M&Ā+]1U Yލ𝉛l,O?1,M}s9|V DZ9zLoUeuبF0PKe;V PKy.F*angular-1.3.9/i18n/angular-locale_ar-bh.jsWmo0ίk IM_PXD I|N 44i_HX1Y:dGlTh0K<$)݆6܏'-ѝ04 vH^+4"ہٺ[~5I^fN' aźc7'f`>u`n:CX4xfֵn2xDҪQbWxbVj:gZ9g)t0S1CU-coihk(4/XETMܢ Bo/⸈\D9"D L)⼀`ɚe8|qSӍaXiԛMRPPjj!^갛{х i_wM#Z;*|]؁7άl 1JggU`w#|g&>#?"O'd^rIhFkmWxbVj:cZ9g)t01CU-cihk(4/XWETuܢ B?"^@qD% rD/NRY+5oMM EJ^?$o"UU oGuPTS.d\@N[kZG9ܱW9&wAc;M&Ā+]1U Yގ𝉛l,O?2UjbG4zhKs(!IȖ;yI7/C/9 <.gqq/UW[c$wW}zZj}tkx9J:<>3btx'%/ yn3amܟjEėX.&uvuFq^bm;YRAEkV_us LSu`!m7|zڀeNU/h 5at,K7{نk,3+VkHeϋ V9C g1P45LdZ*u.X/TCw%)<7%e%Q)oGe)Kf~Fz]ʄm|* t93w04srvȸ$$r$ ]q-9h#m.rYҐeMTOן`.灾|'OQ j6ˉXSϙֺ>jU~PKwO PKy.F*angular-1.3.9/i18n/angular-locale_ar-eg.jsWmo0ίk I I/R(UC F I|N 44i_HX1Y:dGlVh0O<4)߄6܍'-ѝ2, vH^+4"پtږ~3GE^fA' aźe7'foa>s`n#X4xf֕n2U0]TXA^&)a((Y5^ntZ Nu=Bt z~ɑC{g?>wiXbgVɔp 3Ƴ*ya03uMQ'FgrIhFkmp_"j@~.O^D.@}7H@뀩Y3G(q&A2cELk)]I禤$*G剎)K"wDѱ3GGi%: #."rlw m7tۄ3rVȸ$$r$ - 뿛 Q-ࠔ;@#/:| UY&_[D%$ |rSr"?*YYaPK|FV PKy.F*angular-1.3.9/i18n/angular-locale_ar-eh.jsWmo0ί/e!Ic A @k+@3Mee=wQ* It(Q4x4vcɟR<#,љ2,'ǩ턼iHzwu7n,kI~nH/vg"uϾJ~ aQyX7|JF)Yyn i%BKmk-/!72z[> c\=Z;p9V]OQب8Nqe28Q~9 |89R-Ĭ*fuFsRicVg8bZgE'joUЬFcs+@ sE<"rvJ$-[&0%W%kp&tQ|YÐSjj!^谟{хsmtM+Z;*g?wu/idXawV)1IcwUr#<{#/"˳'dQjEhJ],rMR܏gѺ V 8gMx ߕynKYJ-Sve*QyoJŒGsLh4i6KBB;C?tWXjt9Zw2$*9<$>M0@ۿZjD?gzCX'z/PK\O PKy.F*angular-1.3.9/i18n/angular-locale_ar-er.jsWn@}+VVv%Em&V}AND{ggmX⪪ԗ33gf,l#w5*4%pxn l܍'̣ѝ2 v@^+4"ٺ[~5I^fN; aźe7'foaO07Z!,|<3J7O`GҲQb?R/Dw, !9Ķ }|5՗Kj=-p |HZ;p9V]OQب8NqtT9(y#qΫTK<1+YQᜳyژ ęihk(4/XWETuܢ Bo/⸈\D9"D L)⬀`ɚe8|qSӍaXiMRPPjj!^객Bt~ɑC{g?>wNy4 ,p3+OȔp 3Ƴ*ya0=uMQe#3y~} 4#Kh>&xfAs1Wg%P`d:nn6ip,#;tG}0YOﳛfwݚdz-͎غY}arYyی>yIAj^Lʪ` Y/B00U$Z"TMw%)B ֲ`7d2<7bɣ#Nh4:/ͽ$^2W-vpHyfwD<РrE*Kdw?7\_[yQVN>8EcYY4* PKs}X PKy.F*angular-1.3.9/i18n/angular-locale_ar-il.jsWmo0ίk I I/R(UC F I|N 44i_HX{1Y:dGlVh0O<4)߄6܍'-ѝ2, vH^+4"پtږ~3GE^fA' !a źe7'foa>s`n#X4xf֕nUwiXbgVɔp 3Ƴ*ya0Ϝw{M|6FEg NC% w_Cn-Bpac,i.&!:l%&P`dCnn7ih2NLε @rv4{~-K7b›ll)f 2ED킫Uz051p?NK)@g:MFswӼ:_ots"F?WM̯WPz V,vYT״h)t`À_p|o&opl bIg ^<ۆ6Д(Cg<DX5-.zfe8d6ݡS՟o:C]Wd0P|'jB@;MzL [fz6 UfW|ׅ;~dvCMA= YHum/^xj&Y~'P(]a\,%n2 I\-̆HGZ⛆2TxSf ?NPCcGE4Yip.!x""v (`rQ-G!p(-"mނp9R6Tzq8 ੧,wPKip PKy.F*angular-1.3.9/i18n/angular-locale_ar-jo.jsWkO@ί4DVX6a> %d,wV1nM{33eNZ$یvc?kWWIK'7c [0=3}o7= Hj&i矪k |uUC1ًkϬk.Yq,&a٬9-'\!D8ƥNz6Bx`5Hώ#cnQ1D:fZIv,#kR/WxbVj:cZ9g)t01CU-cihk(4/XWETuܢ Bo/⸈\D9"D L)⬀`ɚe8|qSӍaXiMRPPjj!^객{х i_uM#Z;*|]؁7άl 1JggU`#|g&>#?"ӏ' B3B_Qn䁖c<01j4sxEp Qb0 L30fi Ri3 um@s{S>yiv-;kZnv΅74 SCͺfvDw* `U8^a`'SVh\fX|R1ߕyK*XJݐ){TDߔ%VO;a臏K"(~a$yZn qd? qIHIc{AdZyA)w&^t@L4JvwI@s<Z-jD3! ~PԗA PK6V PKy.F*angular-1.3.9/i18n/angular-locale_ar-kw.jsWn@}+VVv%Em!V}AND{ggmX⪪ԗ33ǻf,#׎F~8I u'~p"i٨d1@;^kb[׆>FKuȍ%wD>UOCqHq+ .'ilTT'8NT9(y#qΫTK<1+YQᜳy: ı4Bmʵ|vZ*:unQ hb|/⸈\D9"D L)⬀`ɚpb R7CAΪ񪅌:xMvv)F2.s5#Oj~ثM;o`IY&b.Ϫ,oGM|F6FE NC!(7]@1 C5 U"8(1K&_ushLSﴇT ;tG}0YOﳛfwݲ[efGl]xG]ͬ09ԬmF]nZe*g֋P45Ld*p {)U]I纤$x2eoTRj &~@K")~b$yznh qd? &qIHIc|7@dZ zA)w.^t@L4JvwI@s<Z-jD3! ~Q4A PKbW PKy.F*angular-1.3.9/i18n/angular-locale_ar-lb.jsWmO@ί4 z(p\a}I(Rb8l=5mXc'vggyݲ5-FmF_[-c?kO=ߤ%TUsfXĞپSdެ1>!mKM"UN!qun 5ֽ.~b]>پr$`wʭ7)H,PQX+α]r~#`d[Kb7ϓR$Y5duZ,BVG"CY.cn ׽eh^fm7.B+(.Imcs j]X/<ݱd6hJti1N絑:dLM\!3v C?c9k9$rz6K,X X/=&g-c0@jḤx*ZW~8/DQ󱒤 MIkYI8U'YQ*<}^FFau |_EU`v8b/ȞGm"b+u"g"jpe(Hp|!5Q$?D&# rlũ @F9pWD;Nk]Y*)4PK)g PKy.F*angular-1.3.9/i18n/angular-locale_ar-ly.jsWmo0ί/e!IR$F*!AB#][w>'i/k$,xv8MqNfģQggJ6Rϖ~ io$nf#ZyӶ9"-M7{Dz<{]aX;E F;Oga]&HZ5+Y#Ht|"]@l'=h[r#Hmo=.=O* cnQE5 G'Oá=Oq|^#{FնɢՊdd4[/Z aUν!Ejg",;4ghz3 F i/2ssm@2l/ްY+߶,=o-gU eED9W R,:`u #,q&A2c:D2\9k"-!;IFRZ$ NL٧LǯƵYht--$^¿Axz^B9 HEd9qFº&Y@Ԋ)J1id|mySb"sw}s]Z5K1 PKG PKy.F*angular-1.3.9/i18n/angular-locale_ar-mr.jsWmo0ίk Iڕ2&1H A!bBn4R^PHڵ}sNI"aٗ瞻{lcp"='جp4> I{R8Wڙѣ7ai:{miLz7}3mҴE^yF7갈Bb߲_0O07!,>3JOҲYc=R?Dw<!9Ķ }|aZFKg6z[ ?RD=ĵv,rĭ@7,(QQq8-Rpܣ +|89RĬ:fuFsRbV8bZY* QhQfWeLuܢ Bo/⸈\9 |Y&Z8M`%4q۫pqSy]`bD57F(8ƷDr;:˝)hT cZ[+Ӳ/?`-c/n~[6M}&.]%>n>~hfJ~rvDN4`dSdy<bA+M<2^n,8yBu@y4DX2[ Dg`Yz3KŰ̜\\{d=^ZWxzm֭ؖn;Y{aryیyS 0XC&e]0YjU$Z"9R&!uI%kUI2e]':T,y:BބF FGi1; j͓{1&tE{vY,i|Dwpvwr73Go nډ{miL7C}3-gH~^8^WE2HBɃKf-yH<_kHۺ6E4@:\RlyK0HX:ڱ1ݨ|fFEq[*GG)Wp4#s^^Yuꔍj眥q U"FgoUТFk]2֩sZ*@ sE2"r6J,X&0eW%kWp÷M6b R7ICIΪ񪅌:xMvvn Ѕ6'G~?wUΟܹā7άl)1ggUp#g#?"'Fgpg9!(7]@ 0 C'5ZU28(1K&ts MSvF`sssm@{4>yi-;o[nvޅ4 Cf ϋ%hUz2-1tf?RY)*"tRftpnR3q\&9iޝL~^Sn.z"FVJ]JŎsJ# %.M2%\I6 i ךڱȦ-Dqkn# M y5$h. }AUӢ나WLNaVKfjTF3uM#Iat5Ss&nCVMa?Lۆop59m>gSХg5 %Q1CKY=kD e ?L 4_P!I!eC\Z⇆3TxSf !Pf$Me! D@=#i]B+xL8dg&ATp(r6o*gd{x \QqKs+!gilTT8E(y#WWDbUj:e9GtcBUc U֣ТFk]2֥sZ"Do'PFr\D.EPUiRqZ &n{nv<~lc.*2-3(J$"U㬅{g<8'T;a;مKޅ6'W~w쫜޹āo`IY&Sb-G,w8S/ ~Yv?1< 8[, r3hyxI 9 qgC/1K&ts MSvF`sssm@{4>yi+;o[nvޅ4 Cf 诋% 3,:dZc1JyhG̹d}0er2-ĊVD㚒"ԹTVQݐWx!xS&/4~2W}ux@y2ǎ-ц%{!iKBb'It KJubReETKB_Z`Ɓ+N^j4(7-PK!ہY PKy.F*angular-1.3.9/i18n/angular-locale_ar-sa.jsWn@}+VVvJ%J2FMC,|ID{ggmX/}i,Ϝsv4vHD5k4pzξoCztHvQNav~n; o'lN:mK#"o?twNW' !a źc/gf`>san#X4xaֵnщe<~^ xyo5B mgmk Cmm %~z"kD[nTQ@Mc8qV*a򀑧8R><qzE$Vֱ36 sH:+TՊ<;x[Za= -luYh-h]:%Hqeo$EmP Y%Z& eg%)kWoM6"2MRa()Q5ZxwƃsB3c0Pqɻp=rʡ}߻Yy4qXawVɔd 1ƻ*ya0ϝ{M}6_FEg N^19 w_An-B7p0J0ksWy6(d2Hݡ]774ng4 VR/;7G^1]OWfo/WefW]xKm|2=ԼmF]r Xoe]0μGYiX10ΜKS&'BIhEI4))BkJ%k% jE΍;eB(_ZxiDebdۍцwFjDNFA>fw"ЕhŀO.[dw\mVzhT QoDsY[4k1 PKjfY PKy.F*angular-1.3.9/i18n/angular-locale_ar-sd.jsWn@}+VV&RIJ2FMڀ!|A$M"6 qUUKc̙^3D6Й/'^0K\@7tDa̘a vH^+4$ٺ[~3GI^fN; aźe7'foa>`n#Xxf֕n2UWxbVj:gZ9g)1S1CU-3ݠ* Qh^f׵BkDԹE-9"^@qD[% rD/NRy+5qp㦦tQby7gxBƻi&T;a7 й6'G~?wUΟ؆7ά<%3b.Ϫ"FxIi6KBB;NB" rh JtReITO|_`./{&tE{NY,i|Dwpv9wr73Go 4t/ r>y=Ҙoffiey3"q(d,-<1~ s"3t$n,-<#SHt|"Cl=hۖt7`'t c #naE5iC=Op|^0]T\AQCRf()Y5^vtV t=B%tYW=~?rȡ玽^4stؙ2!\J~rvDN4`dgTdy<bAhN+M"Ltg F̓b"p Σ!J  u7l2:Ի,g|zڀ>yi-'o۶nvօw4,ɡm $o3EL4* `u~fa`)HΣE.Ys,LMw%)BJ֪iȔd*QyoJŒG-Mh4>\@Ocw(~b$'y:znh d/$qIH&i#|7Ad^ zAv.^t@LJvwIHK <^/5D3! ~Q4~ PK;eQX PKy.F*angular-1.3.9/i18n/angular-locale_ar-ss.jsWn@}+VV&RIC((q.R 6h %iamR_Kvg̜4vHD$ج`z4:i9{R0 'sr7Gw 4$n}Z{ ͸Ӷ˞9$-]7{gDzq<{]aX[v#yb 3 F;Oga_&IHZ6kỵGꥐ莗Z#D:/zѶ- r#pImo.#Oc@\k.G tò9j)"U>=zH‡y* OJcVlT8,Ufu#fq&kt6ZZa> -lUYh-h:4P>[ (8."hD!Q2ъiS8-!xX&n{7|;lc.*VZ(z0Zx;:ׄjg:lat!pڬirPs^Y,s8tؙ'dJ Y0ߙȦϨ3y88&4'Kh>&?QQ󠅘\+h(d2H݁M774ng8KŲ9߹޹6;>d=o^Apkm[7b;jP6}"w* `u8~fa`H.89LMw%)BJ֪`7d2<7bɣ#Nh4:ct^QC;8 "/"gsCM;#{iKB"'I " jhKJtReETK_Z`/2yN;&/ɟ;9uG;y;NFK*<3-dF4xp -R5c[,+on# MuHѰ]$ 'Is97 qfCl2VL7~Pgj34B]s!n]BWfj6 UeOX~fi 9ی.}P^b3`Ռѳ?J!09(k]a\AΖ%e MIkYI8Uʇ !eN+Ǟ1hp%,8N2קh ,:B9HEDXQxū14ALD<<.ـ/*{dwx\8j^/b7(xi*fe5PK Wg PKy.F*angular-1.3.9/i18n/angular-locale_ar-td.jsWmo0ίk I mPXvmhiҾs=ct2\;ب`x4:i9R0 m9O[D;eYر퐼ViD7Cu3i,gH~^H/Ng" unOoa>s`n#X4xf֕n2UWxbVj:gZ9g)t0S1CU-coihk(4/ZWETMܢ Bo/⸈\D9"D L)⼀`ɚe8|qSӍaXiԛMRPPjj!^갛{х i\L#Z;*|f]؁7άl)1JggU`w#|g&>#?"˳O'Ќה.y!bD:^EC @Aodwۣ`dT:N+#Gn1]foݲ[efW]xKm|0=Ԭ]FD.@}7H@iY3G(q&A2cELkŇ)]I禤$ WL?*OtMXx S&):J /צLupOcKh&ĝ4D%!'QPlOXjtx2$*'/M0'Nj@T(IXUVj /PKmW PKy.F*angular-1.3.9/i18n/angular-locale_ar-tn.jsVn@}+VV&b;iR"m!|AND{wg6U_Xb;;񮙏!8rNģQs`yΩHUr7e?` $n 1y<Ј offYڥaNH|LMg' hlź#_hlp\ &l#+މM"bD*-#KҁNa $|FhVL2SQ4(I jjd`AYȇ;A'8U-D0( G,zx %\.J9 r5/eҋ/5`\d뭢Ⱇ*U==2{2ݪѕaZW\-~O6~-;þ~sb=0X cɞ^mrzMėXBAi>$]߇Qב{K ޺-Xa'K@ /KoǦ hse NU/Mc<֚{lC}ˑ̋U皥3EDW Rk#C1r'ij3#k]Թ`p"R 9Ϟ5nK3ynK*XJbGAտ* !(ʜB$ $^r_ݠJU<[E]5 rn4`IHI;o;L Y`r X?| F|KyX/,ZDG7D޾l;͔ PKރ&R PKy.F*angular-1.3.9/i18n/angular-locale_ar-ye.jsWn@}+VVvJ%J2FMX;iamjw/ް_xemͮػۚ{ezyیuSxafބL˺` Y?F鏲Ұ0R1h9/LNXъh\SR:הJ*J2=9^oʄ 4~2W}uxHy2ǎ-ц%!iKBb'It KJub'ReETKB_[`Ɓ+N^j4(7-PK~Z PKy.F'angular-1.3.9/i18n/angular-locale_ar.jsWn@}+VVvhR"ŀQDS6K c'M"6 qUUKc̙^3>HYƑk G?&s(Ц#1E>Sf%apَkF347N/{戴w5D!x:,€XF-g̍vw úM?8jV'K =/BtkC\Lm FF`;\G"SX\k. t9j)=zp|^wi-;o[nv75 SD:eϋUz051p yXEu.SpaqJe<W")`-+ d*QyoJŒȝ2h^K"u(S}b$\ēEznh qg0 qIHI|7AaZ zA)w.^t@LJI@K <Z-D3! ~Q4WQ PKGQS PKy.F*angular-1.3.9/i18n/angular-locale_as-in.jsW[oF~WbZ@&v1((q6b@FĒ#cݥ=sƓeTKs9SYgig~EӴLy['>I>=Ÿf&h a,J.i mhJ&i8pcgF/-H,xIGq?rF7G/f+po-dA5i,:%:"#:D(vqA"NN 8`왴@E:ڮVΚ$YeOL!07S%V9#l=4%: EbEMQuF~&\A&F/JMlz=BZq5˒ov etlfw0~1hsä?Cϑ 4TPQATylύ{~8e^=C iv< &:gHZP _9" =lbH)/& S*=bcH DwD}^bI|%UgSI۠+(:\t ҽh}*b-J="bV0XaO͎h"ku2XjSx}1uDEεCEފT۱RVrSrގpEczwp5!99x~FΞ2f"?rE7~S&:Qg'BQ}.햫q|MỎ Ou-ṣ|ɵm&D^L7Z{$2r_EN  I=X1|pk4=Mg6790I>=Ÿf&h a,J.i mhJ&i8pcgF/-H,xIGq?rF7G/f+po-dA5i,:%:"#:D(vqA"NN 8`왴@E:ڮVΚ$YeOL!07S%V9#l=4%: EbEMQuF~&\A&F/JMlz=BZq5˒ov etlfw0~1hsä?Cϑ 4TPQATylύ{~8e^=C iv< &:gHZP _9" =lbH)/& S*=bcH DwD}^bI|%UgSI۠+(:\t ҽh}*b-J="bV0XaO͎h"ku2XjSx}1uDEεCEފT۱RVrSrގpEczwp5!99x~FΞ2f"?rE7~S&:Qg'BQ}.햫q|MỎ Ou-ṣ|ɵm&D^L7Z{$2r_EN  I=X1|pk4=Mg6790&MS<)ҁs&jBFLr;&J0P.ч.Ml|!mHEN҅?W1h5Vޫ' HNzI6ҨH4!z+?M,6Ӹ¥XZ۩h"\CxʠJ/7z:<_PKUA PKy.F(angular-1.3.9/i18n/angular-locale_asa.jsVmHJ"^\}ںZX&嶶fur0P0I{߶ڢSUzx7+}D2rtp`bvaL9.6 + %2}q|;&c8Q~!0b B+M:N+߇!0uԉeST }0 L15 և6 B1#a Gap]a^VC ܩ%Qť.foxL&*v¸o$: ]GM+ݰl-ǿut2iOfta㱾R3hwutmzA&El]’~gM} t` JUq ]1 S@^`|`t׏7tS(/lV%_᠋T>L : tr|#V$̰B#5nm=-{⮌QQdL-o(&FW헶QlJͬuQ/tÌӤ#";g,qu:g H xY3"{1wg(bGqapo`l P7"] gS)U8iҔcSؓi FoV^6vͩ L^#栣Hˋ`k,|M4bu^a}55Aaֲ&|5u f~$xj W:5Wk[l[kzo$XYK*x\*u-g(*؛Lj"F^#z'0(6: zdC 4X[d«̗>ClAQFiQN ); gkz =j0O$i} NF60t.kcE-&޿〽(_O>~c|jp؞PK |►7 PKy.F(angular-1.3.9/i18n/angular-locale_ast.jsVm8ίEz,:qlWqje,%r^vYq7pгD<>c{ I*&mZYHD/,xCBjt#7;̓Mbn*VN,dZ ̇`R|f!si"o/g|dz{N-G[*㨥C@a 8z;1!Hq}kw$G4L^ՠB(R[B+ZV߷&BKv]'XұtkBW3C>Cwא**$"f6]X<Ugs!,\C!BuDӪ}MZ~@ ѽ۹cݥ1,%Bm%fVcAVˇaiRif߲~~8:3ʅ$`M=FL^?Bʣӵ80W][?Dւu.3~.Ԕ*SA4`<4e4X΄6nvdOe*ò>hћt asjŃ9&XZ _ XhuX_iMo% ,_M`j I)l\h˽/?>F'PK &f4 PKy.F/angular-1.3.9/i18n/angular-locale_az-cyrl-az.jsVmO@_٘%AC5B(yM$4[гfgU63>.~2偛w,g!(?&qY&KO 0Hb܊I/['Em>;b# 3 <_ X۹6i]gHCe@E2(v'0L#lloyۏh5юE;C?iP!cN1'w&ᥓ\]UE?_GlSvT^ͷc9p=;)+ Bɥ&4SOnS`M;.P*<5ʑ$HY 3yh* 3G jULQ3yL+ZZ1rW0ur >K<웶u'򡨞]W]0Յ>zq۾3l[~΅3gY^ԇyiٔ ڒV纆3,GlB𙧬z XEی1}΀C5ªzpK$X =(!09ϣl]¹fx& 9.ܤTU`*U)rb׳\4|=Ce3)O$]f% p=TsSrCBX,-껠nc=PKJEB .{ PKy.F/angular-1.3.9/i18n/angular-locale_az-latn-az.jsUmO0_4&j2ɦטљF2Pv LsI6<祧O~S'w~e" f%mt?_K;CZ۩=Ǹ3t~"#@DN_w0 h $,аELD9[՜ښ)Tu—0scm Am<0-SnWc` ͬH6K"ʓigK0zV^Sx#Z$7b )/r2AQC^J`Gΰ.BFlL5'!Ddũbݬ)HҸ',cmAHuXgld8Ʈ^h ͨ!{ >R2BW̺='|JjJbJEJ&-~ )-  Z%I(@&<(k#2[6=*[H~bQ^XPQU.?̧oO7QB3M-+Ws.qb[q@hj^OmdfiAU{/ Ƅ71,ajW\U;ok8=7G}j97b'5!ym>+N-7Lխ.-k{T$:*K[w.K:)`ZɏԢNQ@vD6y4^)Iw7'kh̡G~ W)ܠ:`usIYZi]ܙmk{omPKA`PKy.F,angular-1.3.9/i18n/angular-locale_az-latn.jsUO0_4&j s? N1q@ƈԐ::\:auz^-y}} d laHz6rI@q?xR&~$wkvjnc^:GL{AxCy b"s' ɫ;+|[ @HX&"ir6ƚ):K۹ȶzw6YcKnﱅǂ4s(OW&`Z9ڧ^SF䭠I('o*Wb[+R@_U"\K`Π*BF,J5'!BdũfՔjY4Tq$i\Sd2nR#X;,t2NmU/ UąaVP=3z)}ݵ}JO LSUTT $LYLRY@E@@@<@9j/ KPx,xPD&:=/1Eq}79[Z-Ӏa\PFkm ;Fo Ⱥhצ=Gn}GiNtY;aH^أ/069LD8c1x7hUsjPAPB_΍/L:S܇+N-7Lխ,k,8/iuu -?\DtRS.~$ K˫cEٟ)D#< 7&kh,7~ W(ܜ:busIY:)]ܕ]kwM 0v°-Bsc:JRSB%M2SѝѴ__;6GtnA+_̩9!UwBJ}[ڤ7H~鶖Mo8u ,xK: M_\j((T"̛$Z"d PKy.F(angular-1.3.9/i18n/angular-locale_bas.jsVmoHίYj^"@щ)Qc@ƹE1זIS~3kI;KYؙgyt`2Vl׃pLU{.m)5ʻ(wފNʗrUa_1Lcg&n`nN:|gq3ɇgns6! kdY9,VG~ L"HR}8EJ%iAE \6hAϸ.ѭ*%U^0J]ocrCW%U<;g+twCNj9D?cacrx> DETï@*Z~);^#Rl?Şѭ26Z8FϚ)QdAׯGw5x4v}+u֎{ n.S"^Od(hOa;> C,9ym^d5ig(ydl|h*c<´m_B9 0*[/Q3nN3&s'u{,rbפ(An;x#*GLMg[j_{V`t2Exi5+W}6('MHSR${ bJ3S O&@j rk~ |IKoD)޵'ʓd6[aͫVN;a8Ċ C[Nu[yXX4h ζ %k-/Om0NCN]X Zҗ4%J@%VG|ߛ>gs^7b)j9RSR=ͱu(Nc`[6qnP%ʥD[NjHBi,J{GM!((%#KpO6@Tx_JM)cJ'R qOiz%"Ug6>ފ߂X4Me/Vi͡nvF+[ Bh)O޿SUv=>ߎN:nhz8M{p-9ν/ǛA9zg>F?SEHgGwdz>dF=Q!*U&*/uN'4~6%Tb$$cm;TSDeUQ{~hFdS>@z-ӥNo˻m;P{RTB%1 B;=w #KE|>f m.Yƨuu0;{Ccc1t>cMZѿr˹6dEF] яweږͮ&1`{z-vύB&@g+!Y[)~JS`K2YL+hDaADu͖DU3av{qjmz=R~w> P H:j f Ȑ9I+r$mxr"Y|^-2%kx|mpUDʛ7t>jZ&<%M)gjͬ1Lq4xmWB~Qa82})X+lHYf _^dU߫R"W#5U'px}(zU?S:l5N%jЬ26tWu괨4W.p aҜlj.¤ʨoh7N,3vڗ럼A7wyQ>kWT>Ee*%({Tٍ~^x3+B~Xy5҅3rq[: fQK`cw(н2N [1¼S,zY)LBjJPzEhDEjY4/|'V0`q3)җ(ۿD=F|b>ӶiU$ŮWS˱ӵtğtcŕB&tify޾}l|Nw?6 m:|˿PKrO PKy.F'angular-1.3.9/i18n/angular-locale_be.jsWmoH_1BI:R-LZzQD 8H, N[,.urR3,Te,˓A+VU:4ҵlu/4:7"%!U,N(Dsؑ nP>$U6xO<l0z`e*]06f~;^b#g살žIV6Wsw9ܡ?Ȩ3=~A3L۲/~gWdrIuݕ<_ #R`)M-eɈgf2yK{g܂͖DUp;=G Z[6]ɎsqOo>%HcjJ7 Bp@e(6$:j nGD H$\nц/ٍ!Og[dL%kjJzp\GTY+ݤ.Q7,5#1ѠH/:qD %X}e ?Rl56+lHyf= _^U߫R{$W#5U'pWl=nIzkVIFLe: :uZJU^e+OBpNkijnIf`<6kc}IlT9tqS\vJ%STR2FEܸэ9np䇅W#]8+w3cN-Mof_fPm6}Ǜȋ+裭wFتEl$WVWfjVڞY UM im+B8ҙJ Kx_"F.AӼ+MLBKOۤUUǏmv=غmM.} =-{Vn7~i]ψupPKrNRN PKy.F+angular-1.3.9/i18n/angular-locale_bem-zm.jsV]8}W\Em [hb!tf4!(dvD:JL;k7 3վ%so2f [ga$FFrj[b{ V>zOmJX,lI[t0G_>97&1zz3X(Rd :wG|wG% ߔGp':&9li6kBU 0ĆTEL!]&6n4 d"Ft- z0@CN6A:6Z?hC N"JcjT,[b t.X:$u#&z7m E+u2Ǐv@U-Pv-BC>wo!us%+ni ncp:SwGhQ3r?Zr IXZ/`z ';UB]Fx:N)bELw^͂jDHTO*#.heFF%K+k)j'ے4 hlUyu K5Pc}qz]K#^ 甗kK.$R@K Pr>!3c9ڰws]D7LFWkQ4HS0YI-@P,8t;}WD/CkȅZ몁 9٭?ƷˇUi?w&_8\i{s :ϪwemI51$Iګ@J(P3uSRlDl'I'׊SxE8֋]glPd FF]0p{a>X_i7uPj|Ĺ>;.P= >rK0haC嘮XDxj ]&6+b0^h7;͖$TDs8/B 93;ޠqh3E❼%:E:UjASlC&ӝC`}DLn>7h^.CTٶWZ -vY2ܽ>#.p_b6s?|w̭!5Cwj#e)V[q+ |&Zw9U=~3jˢJ#T=D>uǫQ)t4xE"I%.:VftlTrR&qR IeEӝrﳌ4cߟzSs#^ +K.$R@K Pq>&♱\mX 2`Xl S]DLEh lQOS(JrZ2v Xd?Mq"Mk}G/CȹIQUsMYoz/n|ߙ~poxcgtl;3{߻h@g piWR͜} -X$cR7v+^t3K gt s>.N'ha{pT,[:A'w6D-idܬW #.fsS2<rG&1ikz^,=p>~dphpPK[c: PKy.F+angular-1.3.9/i18n/angular-locale_bez-tz.jsVm6ίE#A@c V8WAIn86/3<3L($iis b#9aINMCl5h'q1O)|))YZphd$ã3zx\Y =#M-"_}hD!$EyQ>i@c8l䰡-]*~&2bJe£g6[ i*c&7W 94u?l5whCM1R'ʐ H|0%LPn +\0?tItC&z5m'E+:o1PYi ] ^ ~C6 7CfK;^-ѽ给c܅1=clI8F[SHŒ\~*pYwPrO$ JvHZXJWKQ98 WzlNγQo`#Ȕ>НʻN^C/)y5UL"V--fʒ~j A ۬jնb2sܳ}bK^ei„e2a.T _hDjjDC\g"*dU!SeI.CMª/9L(nU§ < ǐ }s^  IlQT eaQѽ^#&e9F7稊2osyǚϋhEp8\!ݒ3{v\r٦16 W,L L?i{Z X}M)fk9R0PCnd|-mOk~J:嬄7 ;yO]l<pVtIyTceL_敁](r,.h}~]7jԒng.އxWqQ|¯PKKe PKy.F(angular-1.3.9/i18n/angular-locale_bez.jsVmoFίYô^?2Ν5{]5P{gm\Mȇ/3<3;m˄BlG-"F4>N.|}ďnG—bHVFbX?8ص>͝\˙xqB$TҽZ_OV(D<+wj9' hlG4Be QOƂTFLizLx7۽vG!1Me,D0DCN6 `0j[5ϷBKv1R'ʐZH|0%LP!+\0?tIB&z5]'Ek:9w1PYi ]~~C6 7CeK;^ ѽ۹cݥ1cH8FWSȞ\~,pUwPrO$ JPy${,%ȫ% [kI=G{>s,{adJEV^]'gДzV`͗RJ"&z3eEdx1S Fmjj[d9;ncؒWY~f0eYL .pOW(>Z Wٔg4%YWL7sYR!PogK1[հ6>fĶhb!ro30& M3 Z*v,| ?PKs9a PKy.F*angular-1.3.9/i18n/angular-locale_bg-bg.jsVmo0ίJtɴR(UC(@#1/݋T7>?Kj:KyVmUxnE)w }Z#GOVi ȁ҃*"f=J/ʀ P 0ys$DUṋcDeƍ)8IZ^3Ps5h)]YqBd*EO`~:;0lDǞ؜ha,5̰۷ïQ^bE*h}mvB(\{(8d|,2{p_w* .1"j=Xaxf>Pj#gRZt4Le=|/#iI<یz-z"QAQNA 1IXj`@q ʹwȶ^g<-Fo +skKZaAaeŢvO>s~9 ^zq}ys%f A r!f ^l]%kVRBHo%KyX$ ?L+ {6[͖]y vk$YeUσ5'!4`JHgy7R]@[,u~lm+Ov†_PKc& PKy.F'angular-1.3.9/i18n/angular-locale_bg.jsVmo0ίJɴR(UC(@#1/݋T7>?Kj:KyVmUxnE)w }Z#GOVi KGl=U ;vT Us,0r3}i~53[W :&FE4$mFQsAƨ(' Gb{,5Xr ZBɁT[~fڻgogdf3O#7ەٹإahJѠ2nbAqL'x9/\8Y^>cNݹXX\d ?!f ^l]%kVRBHo%KyX$ ?L+ {6[@tv\ۍ3dMW? n rKҀ)!i^G5vlX]lZ PKla# PKy.F/angular-1.3.9/i18n/angular-locale_bm-latn-ml.jsVm6ίE# hUQ6+mlOZHX%v;N:hg;4e@*ad$FV!Xm?>3U@(FИky%H󰡓.wF6WphbC".~nF3u߻sG"#3r2?~ZS`e IBgٻyŋ$!Ud$ *VB,SÝMI{<+ԐM+=e : D&AZV)*]" $PmdO (1P**nv^&6*m $6,jkZKj`}@2vKŇr xr-v8" Q! ͙6d2A¥Fy%NDL#s1jǚ>:_9ytUG:3wpj7{koZ}wWMqYExPþH]#.-^%\)կnIklM`!t>Co9A.FiF:Ci$|{? VxOY WOOd/4ÆJ; H\V1# ȊDoy`7͖$4 ' Cw tЯaܨeb6y`9(T9 L[Lw yKnĸ] B1ǚbU`{m Peiׂ?ׂ h @CՑ{a-Ȍii.k"JnJ.4Z]GFz- 25Hx"5ʵҭdZ HQȭՊR Z@=" HFqX^/s cSn2 0hʽ4@gQ7}}WVR_Bʎϲkx߾GsfrʄHs.Kg!5] ̃C3e(;^G,)F$! SLtl e{NO-X/m>,l+ZG|}($[krL K9 G&roBtqtwW㣋z{g' PKS PKy.F'angular-1.3.9/i18n/angular-locale_bm.jsVmFίYi0-G |*ʙp5^#{ެMH0gޟ])S HZ4 ·2$I'72ŷjçGYvIׂX $0O|yK7uIBURG|tBD'|3MӠÖ[f S 8f 4!USH 2 fR pQ{W ]aHV<]Ao85j~ۼ N<L"Eb*T5ՠXtn +\>tpxDn./}.Viv@UgPv--)*>dz}G P⚿ 1u߹xCasQ3t?yZc`e3I1O}~ŋ?$!UU I *RV pgSR@^Vԕt%ai\ǰa>}ّ{a-ia.WɍS_Au%Pd.ɣW HVdh:yKȴf#\h[#\$֨5A {dAqX^/s) c纈n2 /0ڽ0@gQ7}G)Ck\54jǚ>9޷/hX*h7,xjפ- spt#~>N}aӾevvx90@VEv)3VEMiǹ`xnuP%f4EΌ![=65iK#6ZshRD9@`rܲRSjRT)\Еp s.wmŸJ\APӢZ)pҼ$"-kOF / L~/9R1;Wt KC-[TI(- rɣWyX(y߲m܈.^ooFѺ5jQ7WU[V&,0#_}>`wO_W?w~'4ݮɌ |C0R3fA1md97e  P^$i;=GF%RaA ZiX/Ȳ^w<Mf/!O 0fCϬh uItl۰zç ,0x` %q_!FiJ]-PXPl_,[ 1-\C<}J]$K!\JY F!GJO֤ Lh+` AE4R(IȦs%0f&MT !i\0u>۫[PKRsV PKy.F*angular-1.3.9/i18n/angular-locale_bn-in.jsVO@_iL;Gb)!RI%~[8MXvδ.=LbM6[i@ZM2riiUr=; M*w4&ˡվtڶqֳF<68^׀C8}=Wy7B}nX\'bmժd6kw4Hэ Bv Ә,m#;ɏx j_nǂ0#U&NL{&_]PBjJS:LiY/^D p;n==/U*#Rm6Ed՚HKpT6O>5 ML,0YOȑⵎqܡ,BXjH} :F)gPlK\ {a×Fwv3D3-}Q󚢹ڲL.k3w }{}7K&5**?vDlbOC,P#Gax\ͫ /Q _FFmdxTZwh2IghYF3 F&7z6ꎞA fZF?z~Ff~۶ ;b ‚Gq# #+Đ9 9$l)D1&wGyx*u-pbM4r I>\T~!$x]A!wYx?Uԋ?r؎T[iL^JE2YĞ/a6>03L-Bق1gn $Yqz|ءZs)y 6@ErIW2s B^(/o4Cs瞣?C#wmdXTZod4IwdYF;&3ߗ'F„jh !gV4Ժ:mX=uS|<^#4.A,MU6/b]{A&\C<}J]$K!\JY F!GJO֤ Lh+`Ĉ-ق1i'n I,OހiVl^Vj_PKۍpS PKy.F*angular-1.3.9/i18n/angular-locale_bo-cn.jsX{oHO\£E'.qJ!WzQd&MR{ Y*sg= [,GGOc K`{ӫ`lyRoO0;A |Ub[Z_]P3oĩXP~a/(o= B;o72Gvte{;T֭T.vtnݙ-T-,!!")%ן?zzT:NhGq vOE M4ѳit/ WVnB "GwT/ U-AUfU#;oO@ݩXݗff)c2# σHz7|yKhy^RM5qhbO|jsH.z&vFw9:'U\2 1ӕBZV#k+$x`ͦU9YX\3_x7kK8:~BhOyYGC-y[P8 c>΅Pe7E%-lXdK:%SF;l)#P760I^TPti ns8Tl4sd(UO2LO ̑8Jqm+7xQ#qBkD:ޑ ;BNj`?/,LorDSQo=E?k jkf'C!TVG쵶ok={lgRqN*ڞ|xĞwnE6ܒʣ0I*^O%S-qpK\I>Ҝ5>t=']QfčglPaz؆,:l\,_ .={U3}FQ0 %ei_#LRc4@fgd%ٻKjARP7o{Q':|,RFY?.Bk cNBR@1Zѷb[LLC bHS"aޠJ #ϥJ'6D ƭYڛK p\kǝ`FAq쓠2, Ͷ)/qu< ,8h]>SIGF?7~+(O ~yhskz׷PK+挖PKy.F*angular-1.3.9/i18n/angular-locale_bo-in.jsX{oHOzd)b@\kȀM,4o&W,e湳-Q莢f'gi0=[Uu0<[ɋow|#Q*i9Bѻ1[筁kފ3nvBiHv;:> FK+؏PbMPY6sRх=r7W}@4wq H)uԣ1vPaLJ0z?D -s}]~^~9Āl5suz1; @լ7yqB~chAY𨖴<I/RU_|w,ڱ^R>/bk2}ŅŐL3U. +CFkWdi=_>Xsj5\O+jC\%\e\#+LJW' $x`:YXS\3y7k[8΅Paܽ"ŒI-%D)WK(UQ*u ؉4j7[~.ñ8U-i)]| $9 R1nuE5>tT1#DyB$:&WN4S9vR(IֶOa}<}צiդr8b.s^);ri%rId+Ge+Gu+Gm+G}+[9#Ǘ+҉=Šl%'a#yÓUHZJޗ=#}t9|*'zL-OLO4-_ÂYۍ1K\z$ޫ ;pU ȣac6K/#L.R:7Ɵc4}@6\Wd}EٽIj^R{@7;o{Q&}':|"R[GZ?.Ck cNBR@1Zѷ'b[HLC cHSg *3/-ˉzlqlNX3/%X8Etp$}'oEiDoen SPKwPKy.F'angular-1.3.9/i18n/angular-locale_bo.jsX{oHO\£E'.qJ!WzQd&MR{ Y*sg= [,GGOc K`{ӫ`lyRoO0;A |Ub[Z_]P3oĩXP~a/(o= B;o72Gvte{;T֭T.vtnݙ-T-,!!")%ן?zzT:NhGq vOE M4ѳit/ WVnB "GwT/ U-AUfU#;oO@ݩXݗff)c2# σHz7|yKhy^RM5qhbO|jsH.z&vFw9:'U\2 1ӕBZV#k+$x`ͦU9YX\3_x7kK8:~BhOyYGC-y[P8 c>΅Pe7E%-lXdK:%SF;l)#P760I^TPti ns8Tl4sd(UO2LO ̑8Jqm+7xQ#qBkD:ޑ ;BNj`?/,LorDSQo=E?k jkf'C!TVG쵶ok={lgRqN*ڞ|xĞwnE6ܒʣ0I*^O%S-qpK\I>Ҝ5>t=']QfčglPaz؆,:l\,_ .={U3}FQ0 %ei_#LRc4@fgd%ٻKjARP7o{Q':|,RFY?.Bk cNBR@1Zѷb[LLC bHS"aޠJ #ϥJ'6D ƭYڛK p\kǝ`F0jI{qhygF]#eߗ8m¸mxi.O){ CL?w]ֹ5[XPKfΕPKy.F*angular-1.3.9/i18n/angular-locale_br-fr.jsVkO@ί۸>$M XVt& \Q)-3-.6r}{遘S˦"py%<CMoP gx= L~3K n<[#hO<~B#bs'į;=z#4B k2'~X5JY  2%{;zۤ sx-2 ҼOL TH(gVGZưH@E B_6?<7Fn$yL]/,π{NWСl'6tuzTcO\\lpB/tAy:\y%ieKm/E~ao;#FrS󡚅L~&C0PGel\RAem|;+7Ap ^+-g#2_H=_\=</t0i_LD> #NM&upխBVDQ掟;›)/]D~Oi)'FcUZ5JGPKh : PKy.F'angular-1.3.9/i18n/angular-locale_br.jsVkO@ί۸>$M XVt& \Q)-3-.6r}{遘S˦"py%<CMoP gx= L~3K n<[#hO<~B#bs'į;=z#4B k2'~X5JY  2%{;zۤ sx-2 ҼOL TH(gVGZưH@E B_6?<7Fn$yL]/,π{NWСl'6tuzTcO\\lpB/tAy:\y%ieKm/E~ao;#FrS󡚅L~&C0PGel\RAem|;+7Ap ^+-g#2_H=_\=</t0i_LDO@ zG$Gq?sEg||{plھ_+y{Fg'WrI+d q':פ~ tԞA]F>[f+h_ھBg H:@$橶JQk* @1}2`+\>tlՊChСB1qa u򠷍*Qu?_`'z=bz l_kE9MT|isl{e[wcSG$f`OlO=_mPts}kǤէkd|+|0cpCtY1t k9h', *-B0_U"W\TW 6 Q<$&fS(#Jz[-h"Ht+ (Q*(.6r< Q>6ĆO#`w{u?1֒u5*1 jS_T^W4Hb$.$)*bpl¿l;.|W cʦ^a>č L= X8_@z^+#?Δܓʙۏ3er3Qte>~5 8/ i,(a2as V8m6B /nS Ϝ7$(Ż'oh,ʬâsTrO"DZFtf_sӸ?-C[+ҩ5V)o&QJ'׵<9H4 JaGETmȮg- Dn(x,]'¸"-m D# ql- UA)Ov< *Nݧ͐ԋgO;}mЄOth۷ Z8|/R /FYϯA}m3PKc% PKy.F(angular-1.3.9/i18n/angular-locale_brx.jsWmoFίXYô3]@QEs2NO.F&Q{gfv!~=yufg, Y_2'bkbU(].Xx+jz9vܣ7&P3V,cyH'|uN>8{ٮ<`8SrO*gV>o?ΔqʩWTGѹ,?h2R,M)c1znlՋfü2B( cfxD M"ETrX@{Dn-$2qk4Mg6&i^0N *[3f) \rF`sii  JaGETmȯ8Ֆ_NR"( K@<!Kɦ0HKшq$=5H0^VɎG[X H}Hn:S/zH{y84K}6 뇮`>*[ Z04C{GԂ[_a7PK" PKy.F/angular-1.3.9/i18n/angular-locale_bs-cyrl-ba.jsWoFdul`AlM8%Z 8XEĒ}F&M; f)}h<^aç2s#͂2 unnZ|?6qQIEQȡs2sGgKrIl@OaljCF=cO~ms>Mixe:ckarN6aqOv:eB#%?&$D(f#AqMb<,ʜk_I @0 x$ްqlHida`=X#>iKGx4Ҙr6mb@?XB|=n UYFuJ~$LE&?=dpUPWIUծލc?\\g-8#g .k[]~/$3gdk헪B9UQ[@sNq MɨE*{}~7y&Dhms {C?rm0*|I;7QAi`FKM Ťk1ax!}I [y8IxL[5/5rK1#>"I;ܿV{zR,&3 q2O,sSY7a {Ν+g#ϳi{>xiE%kVl(9EL׹VDanPo(CW#p390 AXu6 aZɊ 8K痔H ^] Y׷DΦ'UpǾjY?IgMO>CZO-C|޳MVS0e=5Gl=[`oP=~~ #{PK}`< PKy.F,angular-1.3.9/i18n/angular-locale_bs-cyrl.jsWoF u l:[9l U^EĀi߻{G]\ېBw|Vm#-dU []WiPYVikt}4:i6EKB&+*구M]Pͭ7|[ f}[B Q*屹óa!9 c*k$$ԟ XV!!Pݠ䔏4xsy+0ԀHb׈+Iu`K`{*U#'RI;ekgvR,&3qwC40:)FOYI|$88JVOݮޖW ,+TtR*/Jˠ9puHą<"t]QgQTJ5 2 lФZ?x1/J݀uڗkF I'eSMo?Gx|yt_,]cun:3va[8swv^K6Mt6७gت?PUzL A6FHF^SV!z^pn`VE3M& cEZ FA:o"Uj젙9 OwpIBFöz.R\ۤUQ_Ǧ!>ب ILشˇybf 6bV~%\ֳCnPK = PKy.F/angular-1.3.9/i18n/angular-locale_bs-latn-ba.jsV]oF}W\YŴ`AOY+Y{ƲgͦޱΘ}h-}|ݕBNt'2!P&ԶHB>|z?M2I1gvSVwq6 KW/`}9E|T#~3~ ]_ň'[I){*.NIRLu"b81 edwnOYr*dF F=0FDŽx `4;zج<Y Ԡ.JXetT-|3b+(<"4fv{>[ur=1Q3e&f#(Pcr %"S7$xo_uzW"e<?,2FCMcҍhr fT}֤<'.TЈSGÐ2_F[[.j[.ҁ0Ir];ۼE$LpDÔ48H(1{Yy n-%iʹ/{u+g4jlkYս$A55@%5@!58Q[PETPNMu$_ūa耇88+l8]04e2|>NqQ4Ij4ʳiyxW<祩DWv#{ӲR+wi-\lxvn=|֯ݕ2_5췹V pP]KdJdw抏;4 {˔Z#dt+mU k9L6m|OTHg C2 Qx7qD6d+KdNQ74VZYj:lE-jo[(#wNE =]eL#PK=n PKy.F,angular-1.3.9/i18n/angular-locale_bs-latn.jsV]oF}W\YŴ`n@QE2NWt7<&f˞q6Kc1KZ9 + N:dBr'Lm=ߒZ}֛,e*"l+bSi6   Wpcќcb"Le >*xQ?G?{AJثn]_ňg[I);*6NIRLu"_b81 EdwnOYr*dF F= 0FDŽx `4;zج<OY Ԡ.JXetT-|3b+(<"4fv{>ur=1Q3e&f3(TcC9Oo ꈩsJH<7Is,k]1wtiƕhzKOO.+=d&*XӘtm({p_4)ω U/4>hRQh rZ yypk'L\׎&o)Ʌ6=0%{ &J DNFf2"x`mEmjq[(#Zxi8⁡׌ɱsĝz|PK"h PKy.F'angular-1.3.9/i18n/angular-locale_bs.jsV]oF}W\YŴĂn@QED2NWtEe{R{Θ}h-p>cmwۉNCPb{% 7YΫ8D$ض9׃C"9,t/F`}9E|EGMk)a2")inUv8%Ia3Ê ~. ;%,_u=ii)r6Zj؃_a#tL(ەpqW0wVomOY Ԡ),KUXewT-|3bk;i4}xW796{8c"5e&f#HPcC5 Ooꈩ9IDZ7x>.|oQ-2Z&ғxO!-k+(Kk?wj<Ɲy_Ki+xX*\I|gWLsYUUN:/9ٞ1 -Z۫Sò 镈&|*2gO=F‡x@/gx85j?&hD$Zӗ7[ %.rzoB9>;HO70vb|qoPK~ PKy.F+angular-1.3.9/i18n/angular-locale_byn-er.jsVoFbe]Gri@QEb@Eтm26\ޙY:\zZyga{:`"E颌yI2]K7ٜǁb᧽[&Q鼈Tonà?u.G;c:ި˴Ah!K#*G_8>  -W62ȵm!EP(ZOc)DL/ 1"tBi&2O36o`]A( vmfۆ =mlU-hBY6O N#vFBmWuƯ$@H Ej)%q:KY}3))R㎆ӫzy /jzB-^HgĪvtmBL!ɚ!$ڶMgUO&'нOQO-jIj.Y q1,x{ZphRm [QijM> j~P-Wp;&FBv]5IsX+qSuoYQ+q|΋ d\pmg6f]V8KXZ'PK?*m~bntk&ŅQB^Y^{$8'oIk[w{Uz3=L\ < Ν #v,-)S~!*.m1bʶ(x0_.r>AaYƎ^X.sGqNmWԐIbU5VP KRMVJKG)1a/Q/%P 'rVqxrݷ,y,{VIH[޿gKnsXjoتtm=нmc PKB'*M PKy.F(angular-1.3.9/i18n/angular-locale_byn.jsVoFbe]Gri@QEb@Eтm26\ޙY:\zZyga{:`"E颌yI2]K7ٜǁb᧽[&Q鼈Tonà?u.G;c:ި˴Ah!K#*G_8>  -W62ȵm!EP(ZOc)DL/ 1"tBi&2O36o`]A( vmfۆ =mlU-hBY6O N#vFBmWuƯ$@H Ej)%q:KY}3))R㎆ӫzy /jzB-^HgĪvtmBL!ɚ!$ڶMgUO&'нOQO-jIj.Y q1,x{ZphRm [QijM> j~P-Wp;&FBv]5IsX+qSuoYQ+q|΋ d\pmg6f]V8KXZ'PK?*m~bntk&ŅQB^Y^{$8'oIk[w{Uz3=L\ < Ν #v,-)S~!*.m1bʶ(x0_.r>AaYƎ^X.sGqNmWԐIbU5VP KRMVJKG)1a/Q/%P̴U\<p,D;'nc=q޾= +Jj&x3ֻZZk;vVj0~[ to¶PKJ PKy.F*angular-1.3.9/i18n/angular-locale_ca-ad.jsVmoHίYbzB{R%PtDFG5[RlYz0gޟ][d<6ywa2,K8 MCɆ n-4)#wi?O:*9R]2M z =vwJ\1#VgL/Z5q+ǾX[dLC'4`ĖW+1Zw"Fq(?,͛ߤ<&EC.[&Ysn4qsR'b~2V O#qcG鱠ͫZ{,Dh,LxcwDM^4-g5kup6ա2Ѕ\6 .dV*)>5'SO0%%ӛC"5IȠ&!{6Bs>]wA-!*1MQ*5<8ǙڥFmЈq _+(hyfIW_;=cTA+}C47?=q]{>[߭%\ xnϮ0T +4f>M WdOhGGE)^@+w[!>k5>bęHȷ81zW}wp2uQ2uOF,H-আ5mHt Xk<&DB'Rm9o1lኋH(}ɍV6b]D\Lsc&pT}'8:GIW(8tYA\d~)[Ȫ# ӪkupVGdD|uGCZ.i~;:v|g7kgڡ!s{vk~e/IW{wqTjz]ˈVWzX0/9V7jԩF -Ä) MV앏Xn#%wi?O:*9R]2M z =vwJ\1#VgL/Z5q+ǾX[dLC'4`ĖW+1Zw"Fq(?,͛ߤ<&EC.[&Ysn4qsR'b~2V O#qcG鱠ͫZ{,Dh,LxcwDM^4-g5kup6ա2Ѕ\6 .dV*)>5'SO0%%ӛC"5IȠ&!{6Bs>]wA-!*1MQ*5<8ǙڥFmЈq _+(hyfIW_;=cTA+}C47?=q]{>[߭%\ xnϮwi?O:*9R]2M z =vwJ\1#VgL/Z5q+ǾX[dLC'4`ĖW+1Zw"Fq(?,͛ߤ<&EC.[&Ysn4qsR'b~2V O#qcG鱠ͫZ{,Dh,LxcwDM^4-g5kup6ա2Ѕ\6 .dV*)>5'SO0%%ӛC"5IȠ&!{6Bs>]wA-!*1MQ*5<8ǙڥFmЈq _+(hyfIW_;=cTA+}C47?=q]{>[߭%\ xnϮwi?O:*9R]2M z =vwJ\1#VgL/Z5q+ǾX[dLC'4`ĖW+1Zw"Fq(?,͛ߤ<&EC.[&Ysn4qsR'b~2V O#qcG鱠ͫZ{,Dh,LxcwDM^4-g5kup6ա2Ѕ\6 .dV*)>5'SO0%%ӛC"5IȠ&!{6Bs>]wA-!*1MQ*5<8ǙڥFmЈq _+(hyfIW_;=cTA+}C47?=q]{>[߭%\ xnϮx&!ggؠ0BޕO3c?qDnJ@bF BbBX24V@e&D9;`˨x3;yi!~a9hS STC0KLƒCVKׅbu0ߦx4@U) hԂ@7yjPKô.wKיykcRrHft̂2Jb-5 A\&5B2ׁeE~[SZˠcFgz".q{(&.c%_ш8,G1aqtJڼRĩfˢ4/<|G$ȴ,oPK![ PKy.F+angular-1.3.9/i18n/angular-locale_cgg-ug.jsVmFίYI0-H tg&N{{Fr5kCSU$T"f)Zq6]_}%5lKM,],o5#⹪(aB|R}'36lvt8֤0:"G+:'ĀO@ ;:&Ď/@Nl xkC nNn -5UAP`ڂFS)N|ԩ)MU<- GU[>[K]~]+{ w̙_ᷦWhBVL]cؕT>o(Rx ȷxс{ʚ5@w(H[mhe{%}xJj?+|0 J)a ֨r{J0OH8#:XVڸ p]^Zh.Cx k=kq7>T]ֳu{x¿PKQ:= PKy.F(angular-1.3.9/i18n/angular-locale_cgg.jsVێF}+Jf1 n@EcdLhԃ/8mCTmH(@SSU.̃,OU 8qS<&+yJCJ8w*78F^nM;2MFؘLfA@ 0K&؍MJdC^4lbٚEg9!ϕIH\l HaΜ{Dg;ñ&pё9"(8r?9J/<6b";JU;.䝮 ;7-9LjK>[dݑ4^Oy6}O,Ih.Y<ߛ㱕ٓѥI_D =TO{D:90a=V2[: f勽4Xo"ލ6}0p7ڜiz\]ǎY3aWR(?Q")Y5L=})5k )Ց l>CFIv4nX!J(<@ߋ~ \<^3W%tYVAݔmT$j/mUi}6䒭:ܕ61m˗޿Ꮍfp}\~dthp/PK A: PKy.F+angular-1.3.9/i18n/angular-locale_chr-us.jsVko0ίJ$J>FӇ Akr"hVq6 +9{(4 ~E%^#^'Ԩ{4y<EL $ מqFw?fhO%zi2h0p`$Qn_8~m>gg7ǯܚ6KnMl<`BYzh[=gltXm}5#2hWzbԫ6Qo3 9mgO;w5S*yF*3ՏB^ M+ DJg޹.xOTRupn+Q  ZB(CInk@RGAO@(B`p,."KT.F<ٮrȢ[xQ)b$ED ̺PT?8k)3UTɪ6Tv*PKih4 _KuRK*Khhjن P}09ePd>ȫ# :1$^H cD8[вE,CX>Jxauj g$!w ?C#2xȬ`e,Кwe &:%j+B)͋4oY v~mW֭gl PK-,L PKy.F(angular-1.3.9/i18n/angular-locale_chr.jsVko0ίJm%F>FӇ*"8D][g_ml(4${bE*Bwk8q=0}JpD:z@P$$@b34;Y73Ad,eL{`4Qn_8~m>瀾g7'ޚ nMl<`EBYv;2:6>FZ^T Ga=1U(?ӶSa'zp|Ep;J`K)p<`#BG!/&vYD]`? ^3\eg':TJ` ȩPۚ4hmQPik6#,7ʿPD;<[TRG2-3JVBatyZPF"K+Vݨl_-PKbJ PKy.F0angular-1.3.9/i18n/angular-locale_ckb-arab-iq.jsWmoHίYC(:q)b@ƹEb/I[~3bIK>K,ey^d6iɠƢUNcҀwX'wHeqJYv-K`v}cFCK35p?us哛9xGzK[Nx#yXc$M&a,بe!b @$i~zINM$7hC 7ZD&t}ǥ5 ^w7ȁ&-BTB{~:w[VGjty/X2lVnNdT5)a냇uKz-iQ2qpDz'g-.PKPKy.F0angular-1.3.9/i18n/angular-locale_ckb-arab-ir.jsWmoHίYi8H1 \h /ؤ-̮nһKy{f;'ƅMvz2h,iDf4-)/IxYd~RV]m]ߘN/ݜA&1zN':Eޑ"} {6ބ,HX7'we?IpXk! 6jDDpPF>IZ~z:&q,@E94;uGV=4ѯ Am_+yF :A r jP%ՠPjV`~`Z](: n` Y*U]v~7rw>l{}G -ڲ Þdw\`+CК+}N2j̠hFw>Zw4JbOV(1yM+n qXU c=]]Z9;=hogGp44^K/x(]fJ0k\mh(O/+ּH֫tI#,4+^c5`V9e;Q[+|ɮUC][{#OY!Up ig銸=U|8`WdY~*x~d!ر! 2+=Դ Gn{G{;CpFS/ S>8 w?%݉h3ǟx囑_q? MBhT8Iya4UhB:%lL4 W9[8ai=͓}mPKO\L PKy.F-angular-1.3.9/i18n/angular-locale_ckb-arab.jsWmoHίYm1W@PE'8%R 8WqmmB7kMZz_b).%`0'A>ɝKa-90#@!:@y$i{|r]o&v4AF): Zׂΰ:&Df#9EjXC(9Ex Na+\0?tYrP.Wӄ.OE {41P^*Y7 J^Bؽ#2?ŞV:6vs>3dԌNЌcՓ6fIb.J ,~;Hz\.VMz'Xn|,c}N-[&0{<+? g"eYNR+ԜT! @ua$rU$*rުD0r]1OlW'ʻVut9n.<QD]SO=yLW@^Ň vE]+O?;On"΀e(6]Lf|l/x>;9~ᦾ/v4|Op[^DvtGH K8`d2fScq4J x*U]'D N>1]߁G,Ooҗ/L?;O>DVft1_~my?~{~و~gaxn~唏`ntO c;m|3R" spa2D`)[X ܲ "Jus')2ǖ\9(JawOI+kw76M}:^.'>' pr'oe>,ݜφtZ< brcpNɹSKFu B gM)((^d>UTMn\Jۼ&%i<%U_+ ѱTб;U^opPiV7Ta&HpTh,-M,8<6P M|6˗8*L#2lqDz$Ǧ .PKee PKy.F+angular-1.3.9/i18n/angular-locale_ckb-ir.jsWmoHίYbz4NqJqzQ /ؤ-̮nһKy{f;l&M|;k,ZeKad**Y*Mxʋuo}^٩G5`W۲Wv<3s gK7gP>I7qDQwHH~ߞt7!>5MIDkVnz~ȂQ"F+Ա 'IۏSz4fI*jϠmЁnJ~-kZ 5jBNo BoLP[*5=P3u CЏr5MD_qǰY:~P&UzR^5_4~S(w7yв}- 2@|9Ѻ4ۋi2$fd }ft)gM'J$Ko/l״h>y] a=ֳ#ۥXӓ{v G}KO3Ŷˬ|#^ljM Ez% PݚwC.|{%k&8j!gl'>tvx/ٵsqx@`)>D N>1]߁G,Oo/L?;O>D^ft1_~my?~{~و~eApRrG0 :^q;m|3RBKp`2`)[X CJus')2ǖ\%(JawOI+k76M}:^.> ds}|iQ~IE,I[sv=/C,K7!%ť'*'O]0d.fWLK;(nAy9nYS GxW6Iq_IZ!CIJnt :CS*/W fs,ar&{l:*a4 FyЄ&>uKzmhV68\i=}msPK V PKy.F0angular-1.3.9/i18n/angular-locale_ckb-latn-iq.jsWmoHίYbi8H1 \ j9cfvv}X3ީg6i8i}X* nzVWc҄w7X'6pIgIRր]mk'06GW㑥K8ݟ9KbMuEޒ"} 6F%D6HD7'e?IpXynTF0Dd Ա ( I;`avAK3hut`V=Яam_+q&v 9EjXC5Cx?`pg.:vzߎiB';ib Y*Ue3]N~7rwl{G -a=ʖV96Z~{13PdԌAЌ.寬s_DiľsPbe5㐿VWZ{bu_U1ȮzXh=䀣fxqLDq2+_Wj1Zj3DDy"|^ TF"~K"a^][f5\IpyeebD N>1]߁G,Ooҗ/L?;O>DVft1_~my?~{~و~gaxn~唏`ntO c;m|3R" spa2D`)[X ܲ "Jus')2ǖ\9(JawOI+kw76M}:^.'>' pr'oe>,ݜφtZ< brcpNɹSKFu B gM)((^d>UTMn\Jۼ&%i<%U_+ ѱTб;U^opPiVhݕu%v8~9=6!f1M~Kc =MUhBк%l6Kg4W88`i=}mPK.@PKy.F-angular-1.3.9/i18n/angular-locale_ckb-latn.jsW[oX~W- c(͂K)d6N|!V}A&mYΜcMZЗX 7}|n$g%agq;wd)\]F OzgMC+Pe ն,1LX)֌NlMR=){ko}4]M/aN4|;'Z+'9s,/`F)Cx u,2HBDQft1_~my>~{~و~ᦾr ^'Q-x/qw";'Ef$Ca2`)[8e<.-;rC\aQҕJW)n|etY,u ҙ60B9;cv5/#ԌixHIqIJgDL1fS6œr&U Pzo0tVʲ$/R**J&3Hs۬N(%<%U+ J@aOWtAk\SD$OcqeMHYf؂scSz[) 6;j@6U&6ZOp_촿_PK1=Y= PKy.F(angular-1.3.9/i18n/angular-locale_ckb.jsWmoHίYbz4NqJqzQXgI[ޙ]oݤw%5MIDkV^z9AdQ  u,2 H}j]o&,a ZaUz-kAwXJx^ :]'A0Am*A"l ޷j"fAvHVJUki/Pn;-vo>e[;̰/B*Fo/f1ʀ17=ѥuN6(͒ؗb.J pw_jFk\*O뱞8p7ܳ#o8XX;/x(SfJ0fSkRmh(O/+H֯tI#,4+^ykrv2 =LlW']ع:zq +;P"_]eM`vɇ38ˬ.&3z6/m~<y1O;, ï mW)aV҂w'QoFJA}.L&(l6e [VZASn$[rҗk%]))iezm_צO P7`2ܹ>4$!N9TGِRVݓDL.|L.۩19v PzɈnAȼ<)ŋ̧uɍ+RiW٤8$硤[%a7:6 :v+:~T^  \"G<:;D 3$CqqǦ)4f]x~3hv}>U&6ZOcp_̴3PK9PKy.F*angular-1.3.9/i18n/angular-locale_cs-cz.jsV[oF~WZŴ`{yX((q6ƀFc]{l slڪ83߹|bLdylm^2UۛxLç;S^$i\~7ysU`=wJ7ͭ=N^|ʎ1Zg&nbN^$ 4?g&n"?sed?T9:,` rLGFCB{WZGEAEF~2`v0FC˥'}"u5DhA@z?C1 Ƈ?hQv6}x]ukuTOGHdHU9|׃AFJw_ :k>t{"-#rmt-rn[g "db-,~B5zPbjyW#f%b~+tXӷ%l :}7giYN~޾c6t//Ӝ}iФrj,^ǹ՚Ϝ+9ؐycq*ac;Y+KIJ:AtYT,Md]O\g* i`xUUU˜o3aļȘD<0TjZQEb=i^y4Ҟj´n)nM!2ms6]/W~"<^k \/v!P* b8=O&:G.eZ|[xܯ9QCD9̐@ζ* ,|JFF8;*BAULRz%٤tNT7'mz-;jxTM6*JNY&.#g&t8%K9Į.| @SW4=a o5~*o.L_Gwѡs _PK ( PKy.F'angular-1.3.9/i18n/angular-locale_cs.jsV[s6~WziaCl qC2-{K6cZ&#}򝋐-2Y.Mu<-"Oq5N6^Ĵ>|?E*2  ÄSz7n:qsgcj9!hOL$h9YH8yq?  =ܞV=HM~τu$9lY~6aE).&@!ywn$ࠣt gf~ Q1b|ڝ9;-_.tއ$R֠&&ZQ郐3P&^~o!u(y=lA=MtsGG2E; |[-twJ#3J/*/"jFʶ.=qڰ*2J&¦'T֗UA7+U[105-i&\(0:r&"r󽖶9RKSe:ɽv|^Fm OQ<~V_JR2׹ 4(Ood"U|jjEE?VQIRd!1:;)V#vlOdʜBn4C# KNPjCcR3r%قF,dϐM`ɛE L~޾vAE縡qi qwUU([L3?,b2&p9a&)ZAG%a\Yf+ϾacZV?4ZB-弧|ٍ;F!h/Q4G=dP^)q6)!Q"^NZoBwF)9xɗȉkYyЅ8%ݕxٞQU`˗P^cMwTûcM1"~Û_ARmWj񵰿PKr PKy.F*angular-1.3.9/i18n/angular-locale_cy-gb.jsUao@ؐ&mkm{~𔪉+03f b(fWql#0o{,yPPZaM.YS[EV*D&aj&9OurGN$!ÜiqsΪacj cruN=zc3’ LEtMmsϣO%$UnhrZʵ7]b{qФ so*dUi bJU*Q"]Uဤ΄D.p!x?_d"xvY$rmhԉN}FJ ש:橬^c|=/*cCJeRX It?7M}_mrWT1ob1h@g=i/ooB]^CWg`D^8qjQhT1~ݔ@F^Z leQF7qrHE<Et[SI$[/Iy \a%Qۄ'a#5QIWN  C ߣ 48ϻv]0ĸ9̀X#ܞ&ԬN`?O3R6vK PKrJPKy.F'angular-1.3.9/i18n/angular-locale_cy.jsUao@ؐ&%>hS&4^Ϙ=X@9ovhϦ9 v\f EI7d!(^il3]RV.v<~<s fW% Gta@wZ{Ӱ=Ps>3 <4>%a{pƆ%8ro{vIAak !m{;l[Ao.M& %{kvU PfYM=Yk@<6A]i;ɞrޤ93g\mp3Xls43~ $PtL*F1}U'0*{JC\T%rl;TA\u歰U偟l#TgTL ?P% T$k0™ C.PqØmʌZ.W={QK]dtܾIM1OemxYY. SjBAHf ð޾烅erm/W풻L0|lYY5u1YQ|Mec/B]^CW{`D;m0aɊCa֧‡(/xdM3. e~+;cq!l !@y& nDk"YG G!`kW=G`F-1sR0ʇ@3V,YUڲ(Õ."11.qqy׎p5s0%CcV:vnu?w`ogS.VLkDԱJ䵄h#X̦D'DKe3ғmd`̞O9" lMFߵtɋJjl!>_P#u2kE*!WC(*i9RQ[ B]5ԔUs=gPV B=5bjl dQtaE| ~#s͍(*g09L8jEı@U.^,S"V,^%F#Y+L@3[=u]{z|X,jRUҾvpZsrt+ VjTdEP(zWM/}Zi5Ќ2WW& Y@sM k[NKHuHhkGBG[SEm^:i#C n ;e)7Ux<|ɞCj違b,e 遼:pPKd3 PKy.F*angular-1.3.9/i18n/angular-locale_da-gl.jsVmoFίZô@>T9"ŀsFsk;_`Ck yzgY!IQ ? YbD\ׄYȵ.|zfĻ% bWZ;>NƎan|79(Ă8d{_=>[ LMb'qԪ_ S] ml1/sOoY.DK :a!@z0Z׺BKAQJT4ja=^ .aW > Q z7]xEO _V龍DUt]/@~x~~n;|{CFkNƜ‰~XZs ÚzpqZrVzST(#Vƌ%jQ;f߄B$$..25vڰDE⧼-[=/,-|(4fgp%Xe5E,게^kaQ&!e 59S3KX<Kdzmg1bg9*2?Kٚ~k'2)Dk|]hjM-s9?ҬHH"!Ê*HFk*ȭ"!*RV*Hȧ"!D60bLr /=2\ cW~#YD)\².tjDV+H+cȠ^X9g)Nc;FOPKհ PKy.F'angular-1.3.9/i18n/angular-locale_da.jsV]oF}WZŴ@w*PTY"ŀFǰ{co-Ry3,*T{bbELZqg7 IV,F>f#m!J0+[-0u7c0splw6 fΦ6DPjG+{g<]"Jv)G=qiF90fQj b _,V(|em!*LCoЁ?C X'a^֡U]H6a#u[\ 03lE '+Y rؿ*7X2@i (/9oŧ7ulv+id)%^@NpF sJ8Jw*UXdU-*kˢ W⛨Zĸ];u 3w~[a11‚ezhw O9kX2Q*i$c3z3'.5C̤JO~at1{>L:4IJu7G|׎%UR3dԆZLfS}YC(Pa Bq5TIkՅ9jꪡ94jE!SC(dc K8.}.[knDXWq9cYL%|qξdbűV+("v8gLMe*9w7 YZaz|ɘ:ŭӋbPZ5.k7='G+k1{NO}a^hw{׌1r%٪ ZV(z.se{%a`y4n$iܰVT4RF AuZ^5jź }gy]ceETyQ_TB;h`VנNEDNY ~޾-O}gAYzZ8HYxn‚4:x$8PK PKy.F+angular-1.3.9/i18n/angular-locale_dav-ke.jsVmoFίYôA@QEs2N#z ~a^s9﬍5jk)<>;IMDH>\zƃhCBO§G(|7)^b82ޞ=M'aa bW/Ps17pqiyDz}| Fpn [[/NV/60ѹG?@Q)w/ _o^*b:WvgCz׃ujz.DikP82tU-tE})\twYEmQ׳{;jVS8eT bQx=LQTz*-s L@-[S)CMZt'RyU 5`j].lbw| #U3EЌꂫZUWM\?3W,_[B)=1wɔB IN WD #\UEݜ؎% vA:_&(Ns;zWXL_ 2S sIi{~}MmۘOO%ΒmiژΣL?؋evKt9qÞO VL}0 dML6xşсbQb {2k;&C^ _桢(9 _9KG%* R] Xi>bPW%Y|Ĵ}$Y 4̕gb #"ro!} ~%gQڸx-o3>N8OOPK/T PKy.F(angular-1.3.9/i18n/angular-locale_dav.jsVmoFίY׋i ~E%΅#dFE5rYת%y};{!R,b"<I,D5|g%qN= 3sSam8r=Ga Y|W?Qs>psi}Dw{4["5[ˑ:O㰥Cg2&pdDT"]=<0/m$~&&WpoЃ F> \%cw eO]Xұt5l+)}@+KlmrM2g:uА2@49|R @  -C>7눦U9MZ~@5ѝܱGEFfd/lb1# L"z,4U' L`{ROEB"NOh%f#hM$%\~ Z|qB!`=S=ȊG0uFSLB1dB"\՚Jq/ ~hZY*n}٤EiU.QY6VqvG>Rm1%xX\_b:aϕ3%Ie &['&6aZrBIN4,|:YTĈb*sŪn l TRf].eW&Nºζߕ+RDE]paT|2)cvob9ϢXiiQy*3_(u-gk,#\ү2jaHQȗD?=.@)4R2I U J;/8пKw둟Ub?Wf,GBE8L1VI \WME/.}xsJqv3EUgxlqOPK~^ PKy.F*angular-1.3.9/i18n/angular-locale_de-at.jsVmFίYi0-XTQlEgl_#N{x k~{g"K+aWNuq W6N`2*0UR(4\lo]U, z*'a7TvQAR|ßj/R|뵬NAnnl[w Wpr1hOT$,- Q/R=J!}g{\# !=JlGvt䰥I7,&QsYnjB1)1w'ԻF'5fࠣ |!0|`~M:N#s!g{SJ,St0 A1}8 0 և6vF̸B1:G}4cU7v= .C7yr\WQLmמ6.IF^~E3yiE"bCאq *)F[^yFg;ibQ6-Xe;\PpH\Z4PLxN9>x:LEghvs@6OGp?3% 2)Z&&}$Ƽ/VN`2*0UPT PKy.F*angular-1.3.9/i18n/angular-locale_de-ch.jsVm8ίEz@#l!(^E{8`] e7Ndi,13ϼ=v<)4lu'·yD'AQ]ۛdC"W{,0盌%\u=8t "`usNogSkguƠ=QPHQ'GoOkb¿Ia'Q':9lif I\V1#ߡ Ȋ]ۓA\pzQ(f;Fα\}H^`9Tj&LBsL2NLwEM37۲P_@pN}򨏆} TwI90o{(P!D1t}FAUToj&nm[sǵK2W L.HDlhZdC*-F[^yFg;i&q=·CN<1ӽ`Y ; sސ"Eظb-J04`y,m,8i^!TgqY@5%"SbΥ,_̣I[Z|vrֶL;[\5Ԝj\vUk5z5}][m=$}[{,)׹ ͓v@5d%ە(J%hPjIz5AɡZCRKDRcKɲ;|VGNrAҘTPJ.wi"DrJk(B敜ni>; @brqPK]U^З PKy.F*angular-1.3.9/i18n/angular-locale_de-de.jsVHݿⅴJOM m1^㵛ͬ :9e۵dX|a|ßj/R|뵬NAnnl[w Wpr1hOT$,- Q/R=J!}g{\# !=JlGvt䰥I7,&QsYnjB1)1w'ԻF'5fࠣ |!0|`~M:N#s!g{SJ,St0 A1}8 0 և6vF̸B1:G}4cU7v= .C7yr\WQLmמ6.IF^~E3yiE"bCאq *)F[^yFg;ibQ6-Xe;\PpH\Z4PLxN9>x:LEghvs@6OGp?3% 2)Z&&}$Ƽ/VN`2*0UPq=·CN<1ӽ`Y ; sސ"Eظb-J04`y,m,8i^!TgqY@5%"SbΥ,_̣I[Z|vrֶL;[\5Ԝj\vUk5z5}][m=$}[{,)׹ ͓v@5d%ە(J%hPjIz5AɡZCRKDޕ/:ղ;|VNrA#ҰTƲSJ.xi"DrVk(BG畜qi>> @brqPKمޗ PKy.F*angular-1.3.9/i18n/angular-locale_de-lu.jsVHݿⅴJOM m1^㵛ͬ :9e۵dX|a|ßj/R|뵬NAnnl[w Wpr1hOT$,- Q/R=J!}g{\# !=JlGvt䰥I7,&QsYnjB1)1w'ԻF'5fࠣ |!0|`~M:N#s!g{SJ,St0 A1}8 0 և6vF̸B1:G}4cU7v= .C7yr\WQLmמ6.IF^~E3yiE"bCאq *)F[^yFg;ibQ6-Xe;\PpH\Z4PLxN9>x:LEghvs@6OGp?3% 2)Z&&}$Ƽ/VN`2*0UP j !+}qkCDsnYBL9}l@VĤ`<ߜPkW cʣ|Wwik}!a/0uԉeSTb!v&H }U(x$X'}GC tJ9 n?`4*{('PM D1t|FIM,j&.c[ ǵgM*Q3׶_L^ZІ dC\Z6rcml2ʳqlwgPѶZZnI*V5j=/8^G_ш~g^ mS[(VЬ,?zt ΟyҲcbZj[:kemT&SS5[#R^"TqB:tK_P! B*tql,`x Ukqʣ2+ma$$%@mV, fTJSƹRwT])[y=i;7}\Z7ƖiFdۤ3gr?ݺ6dk[J=/R_ZgfcU%aB-6ţ$)Pz%_cEiWe "}};AEZzyn#-3N#^˯i{wX I(q!H<'fD_XcjZRN0,!Z1} eh輖3 ?MLJz{{G{PK`b PKy.F+angular-1.3.9/i18n/angular-locale_dje-ne.jsVkoHίJh)b@lEQ41Lc_P{L=vk){}1n186iRD tS݅[S _O{uŒRMXuHm= 8pϦ=D#3,'A$GOOݣGn5'LM[${iaCMt:ph@#&..6fLD4#{~  ѧ|졃qF!<$KǨAQXʰT6@O8u dEI݀q:Mbb ú£1CJ9¯ߡׂrC :bjy|݌)+_jc&oҨIVYkNcJhmerT]5T(nb$KR2. 4KRY(ciUGR]x ^O|TN:Թ, Dhδ q, Jt xFIZFϴ0bG>Zٶ9kKM nln-|/ͅ`hW HOR qL{>;ģݒ=q$"ۚ+>FhOI-Z"ʕ\[-h/SO 0:P{ R#U,Ga$Fr=~w sPWaGD-K SYbU ;[ KK]"u^{,$n H70k^] / =~PKpP PKy.F(angular-1.3.9/i18n/angular-locale_dje.jsVmFίYi0-GT t\03F4"5l^#3k{5wqgޟw Ime{ae5$Z<G9g|+Ǹvp ϦcA{qD!"I(ң'-cF!$$<ܙtOc2j䰣nYHD9ml@Tcܣ_m_oit͠ChPKp~70.F?:BtH1N2HcjT=>t.X:X$Bf7]x_>6U>w1Gs]~~*s>7yr|M G~ƴYv,]jÂd46BLJ3!1{"'hPj0Zu4=7#e7d:O!IP-PH&e2,{B<bJ "q#x1#76Q8Vi_ҧMאFQGhBiRB Η3q__GUA.hb<+R2IZ@jk8*5jm*鬑+2kX `- w,&$h&^TIk]H=µt0 I"KF4kj]}}Ewֻ*,t }C):vt^qDԐ&~i.'񏎽ZHg'}Zk:sGMyi%{4&+S&#tЯAcߨ|e6L>dSAX`jTqv飘]r#Icf׻iyY(X\yƷv@UOPv-Q FM6z}G ِ5%aZ1܇ /IFЛzJfBoE,dkb5E˚TW6dnbk'41dUC92K. \yhPߏ*p0/$VHo22ׄLх#iZ,"H&̾Rb.X\L"Ҟ;i&i0%oOLBZ\c2Gd{ ߬I}D:e1fC2lHȯ!!5)1$֐XCBN 5$$өIrI$b!t8+V2a\;t< is[hRWqZ>QڱB>,UfH^a/p;fsO%VuRtG7Έ;Uʶ?F5t?6u4U?UzaUk`J~\ na2Ρ`UT&`|jC%*k̨ ZRg.w'k{5?j}jġ"-u@ʒBdDzĿ6lܠ7j}m@۷jF Yn&}ccxPK,-Q PKy.F(angular-1.3.9/i18n/angular-locale_dsb.jsVmoHίYbIJ2N+kצ)Y kw03ϘB.Eau<,j[l}W$V>z ^ơd̙Z%0GwQ~ ݟ? Ӊg*JE)V-F )a#q}#ÖNk**NILU0#ߠ b81 idvGi``z0@Ä|3;o5}Yx&3sNR0U]`(f4tP.X:xD>9if7] uK:g|k{] Pe ~eׁׁ_*hwW B1SKwֺ1x=Q0ɨy3O_L]V3?lCƷ Vʇ,@lCU&Fc(zA̒ %<" /M(K.(қN a1Et)HZ+gdm 7!ȱsI.:wjfqLgpDnzH#<7I*xi4؀aCB~ mH!!rjHH!!NH+")>.WB<+lM^)SECsf<׾&MUU +]#KJeTU_{w'|ᩄߊY\W1wgJ'z?Ө&ؚ'YB?fXUkh{@{FDobogP*Bx^Dx~0>AFtnyl-3Fn~{ġ"-̗U`+K A1Q֦5vqZ.vFE߇ܻjAW7_TuzZ2ܷxPK׎߹N PKy.F+angular-1.3.9/i18n/angular-locale_dua-cm.jsVmoHίXY􀚗*(:qĔH1 \hd{MrY{Yppg <̬\d[FiWŠF: iҊb? im!3=|w$q TXk;;} =]+vg}b`I B,0 c+ v%Ml}'AM%'k^h5V@J.!XGŅϾuQGM,i7b>L'&ijZ%cS4HI6 BĘj*A R`>"O ʦAPȟx0|mT)vu7)w}I}j| 3P|ikw їMЙ;(~3 2s٥FCa0̐}˲4rX=wA) }EO}@=GI )K !'1uթRphv:8|jS(bnpUIEsɡX21Q(8{0OR"y-E*18H[|i +#YLfwh!m5K pP-qs6S=3E9Ƌj iiF_ 74s E jUA4e(6\'\DE1X.b>"tJ&~j0FnQסs#u'XD.Rw2w8s]{:Z>,&C8︰j(;+lQKCϳiUo2 v~'tub :jz#Y(z6ҰE 2 l QԔN@)N^OQpϏi~FH66apDj9k '`;\u{ Zy\ኰւU \lp` 9PK0&sP PKy.F(angular-1.3.9/i18n/angular-locale_dua.jsVmoHίXYbz*(:qĔH1 \hd{MrY{YppgyYS϶lӄF: iҊb? im!3=|w$q TXk;;} =]+vg}b`I B,0 c+ w%Ml}'AM%'k^h5V@J@#ggYoIX%"X!\ijZ%cS4II6 BĘj*A R`>"O ʦIPȟx0|m T)v 7)w}I}j| 3P|ikw їMЙ;(~3 2s٥FSa0̐}˲4rX=Z-R{\7LRx|cöTjǼ:lMʄ|^!AC ?Oc%Sj1Tuq8xP᪒6h)|C@ebB;J7[Q&*p`?ϥD4?ZT:bqJr?vQWF\1*CjΗ`i[HRm'zeAgv)s V$nkA M#yi, iV0lObX+S]|E*5L&(o`ܢCJG2)NR\1M%$=eLmqtt|X,L8*޵=qj*;+lQKCϳiQO2 v~'tub oJجv l=Odk/ҰE 2 l QԔN@))*;?>ǦY16apDj9hV|ryoX-'` s{ Zv\~ւ= \ǭlp`9?PKKa M PKy.F+angular-1.3.9/i18n/angular-locale_dyo-sn.jsVm8ίEm w@헂VU !( WqʀúM8n98}Eڬ3c08" r;D:T)jj _ IDBxCr,BeKFO]{jkZo͢!lm2 ~;׶@r5~ QTKnGє8:\FRtXx|ǣLh׮+a2ivy}|a^!i|OX9mw<{1YkG,njO}{)%]RD- ~ۣz~HoUG090&g)^xFDP9/Ӳsj2a?%=$YUge!G鍖gMJU' "Iao]E=&3C$Yy5䕓h\ 9p=7CQEr+(>N+9Ǝ}} 4=\~$(0t5Pj& B0s 2NCdqͦD1~cKY1y4G>:R,C&A/r=c({cZoP(ǞTO֘aǾc1.Y9r䃀Wc˻ A7]uKrg>jHFsK4 1KȗJe߸藦C"Ma^%i|ϒ\;_tyr7 8[̞8xJJ B&C%ZYA`{K:G}tߩ`^K`L]XC7\jVUL@CIFGIZ+_JfPRjy6.@D~A_hd\hJd~ijcWI/E9$Y<ׯ8 ;bhzgr;g;| PKJHPKy.F*angular-1.3.9/i18n/angular-locale_dz-bt.jsWmoFίXY׋*8H1 CzJQd M.;m\µbegyvvk؛'G.RߊAd*&[T{S>h(ppxQ 1{lon`w쌽S8PEHQ~]7;XV+Ddʶ_I.XZ 1Bb 3PRB6rգ1N!Sa՚w`=Pp,Y jٯl+R?/հʢU!8j~By.SSzcC3! +Y/Te4UvcfaeQm6HtaKUC+Cc5/| ^#WX~ gGa 8鵡?\Lc0(=N2 ˯wp;|ݘ%Ri͚J=@w@mnhi: $')M`'H`hz8:Iޗ;:6=)eYb]o4  WR(9r~XJٵ!,R8% a^P5gwfA%e| K-^l7bEBe~sNA%BсRy׌;ςgF~yv2x1{ZVt&W#sZj娅 ȵKіd'k6YrQ"f${bsK;L){i º]Xku֟ štQ*lM}J蠊OaEΩ7xϧ/˶? "F Ksx K8hi z,|wOX/8AjQ`\O5)8쇞+_<+ )0!-~{*[=5M}x~03aZ] @};?۱Vx00!(Gϐ/'9a`}9JR/̤^x͜0tWI-K SP@h(ppxQ 1{lon`w쌽S8PEHQ~]7;XV+Ddʶ_I.XZ 1Bb 3PRB6rգ1N!Sa՚w`=Pp,Y jٯl+R?/հʢU!8j~By.SSzcC3! +Y/Te4UvcfaeQm6HtaKUC+Cc5/| ^#WX~ gGa 8鵡?\Lc0(=N2 ˯wp;|ݘ%Ri͚J=@w@mnhi: $')M`'H`hz8:Iޗ;:6=)eYb]o4  WR(9r~XJٵ!,R8% a^P5gwfA%e| K-^l7bEBe~sNA%BсRy׌;ςgF~yv2x1{ZVt&W#sZj娅 ȵKіd'k6YrQ"f${bsK;L){i º]Xku֟ štQ*lM}J蠊OaEΩ7xϧ/˶? "F Ksx K8hi z,|wOX/8AjQ`\O5)8쇞+_<+ )0!-~{*[=5M}x~03aZ] @};?۱Vx00!(Gϐ/'9a`}9JR/̤^x͜0tWI-K SP@6Ǐla<ÁF$^Lqo+[)PK͠PKy.F+angular-1.3.9/i18n/angular-locale_ebu-ke.jsVo8)ڍ餂GӖ a۪'x l9NKU>};Z&l&ayQ}<#W$ްT$ J~u߹zS'A=P*GEȭo-ÿs<#4!t8ֶP(W(cA*#:smz4`#{f0" _ ҾtÍ-*kAX`#]P,;t``~s&j.Ku<*FtR- (  rwlpZ`QZO_}CU|akF:7Cc5;r3~V#(3=2e)g0|M9D'DZa: L.XdJ{Tp;;3'wK[&Fg|Ieb3H R~YdcHhcSA3ᖈ甗D߹L2W+HsM:) =tap#7Ȣ|" bC`gB'>173AoMd4, #>5{7={R (&j|01sXt_tHI, "Nd>osB:suƙUQ`x/Aw8*lzN3vFkNFjt}[ *L):r&!Sh@'T(h8RS)X@&T*zt_IFEI'?} ] Fѧ?ek I*gmㆠNv>ިOsg=<64ku<ůqS-?\,NAu缺=PK[ PKy.F(angular-1.3.9/i18n/angular-locale_ebu.jsVo8)ڍ IU'-&U N;(q`~ n ew:]yر]R L\V;","INj,%»xN"j=[VIf K [c5V$=s3fp O7j&1zbT_;=|w8ߕxG.ib:B*qP(WbA*# mF,`#{ gMhaDE(p~gTvxmQx%V NE`jNC LuKû0ݮ۰kC}Di=}52W-p<\MO/~xT,Z-:,po̝(88]צ|sòy;MAw*LJMq"s[}[9\sF7gSO{ {UaR]9G+o4kqohnaj++wzZ0ɷ̏Lq7ߣMCѾPjLlJBx 6UPm %y%T~M*p2X,lEOZEYB~x{ʉC۸S$ţA&0 -xAKunUKP<9n8]ePK'  PKy.F*angular-1.3.9/i18n/angular-locale_ee-gh.jsVoFbd]IzRAQEb@^h`^#wfZU|an=O9Y̳z"YҎb/i}hB;yC>ْ'ƶ_ SSPu,2 ioc߬ $<&j/mЁ\,%Я~m[MW*A{PUT{~ @p.\0?tYlG0iy(Wu<3|N*}T : r7E ^|#k,qB9 W8Fζǎ=pFl2j&+ew^`459T|ac3I(:>žCvG;{=)"\zeiG'fS+KD[krƽM_[MH+2b&1Ҹ8#EiQ]pre̫ |˪r:0^۱~gJ*.:*Ǣ98 Ǡ‰ NLP>S6_ +l< ${UfP%x< X1,pI <jeP#Bڝ4jً^*1*s-DIZٸ"aqed%' STN|T1zee8h8{lʠWƭejMHӖ3~H)u-g/QU\~ Rx uZЎ;AMjIR6KR0>ա8vWACJ:T%T.$v \G^FqZ,KGc -e@b +q= m婠 ?BqtCߝ9m<ՠz:-nG PK{ PKy.F*angular-1.3.9/i18n/angular-locale_ee-tg.jsVkoHί$TPbi"ŀӊFф+mZK`s>왩)4KEV$(yLh{oVI\T^YsSb > i6[Τƚ%1zN 1Q/B= |d}g==QlcۯIrYvAD": 2 8e/Ϭ IX'L^Bۀ?=4 %Я~m[<2yUJ:TĂ@=UTf^EK(*l-Qjp^&U3_f@JUwv V ZNC 87i+{c[cܙ+=ew40re _%~_1\~lҠ * ]GcHz%Ǿ1EĢI,ؽl |se(ҵ&g/L2셸u>jJ"Ȉ$ +HbD(HHe'/W&JhUcĞV'ցaJ]OSRqQ 8%y(ǡ9NdpbkldW6\ V%P ${UfP%A^W$c^a@ꀫZcKA8Z&(ꥲ2BJNt+^$ {:Nd}G߽0ɿLٞVn,xY95fs[Gظ̬д%əM%ڔtຖ3֗(Ul{p.?L)<FeŁ);@􆋦u53nR)rOԡ8vWACtJ:@V.$r \~Q^Y=W/K@Eke~hxL"s1˂XkVwNqw3 Xe9.+9Z(Ă_H~e}gNQx#r'[j< baj @ ߠPF!@xuVAgy"Dt!l'w^mS|e&q u=@UTf~ tPT.:,[@4L:kk_Nd>LS@v R Z N >C 8wiK{k[W#[65}{l2۝'/0rg N?7JRc\٤AyTo`O!;荽B.wGCF)͕%49^/ÞӭsIx,ҊXIir4.HDZ@*;yWϜ\("\< SfߙJ(AC!8%1(p$#(WBJ+۪kBbG6T j/u?Kq|u /\aꀫZc1v-"yDqMx9Ztb\ )9EV6.Hxt'Y&Ô&2f;#4 n ?-pY;5L'So&25qkXcҴ$~mJtw]Khe'~]8#zٞ)[@VP:(|>٦F)OrenPi!%jy I*Wx(^}p2uZOa (q= 呠CptM8-<Ҡz:6 ֛PKfKEx PKy.F*angular-1.3.9/i18n/angular-locale_el-cy.jsVmO@ί4&j8/RJ lK&}!Sݙ.o]k;/+eXAB'JM`*dʨ SEkv!̧x>(.T\ć,)Q㞁3 VܮQ/ ԹH D„V#;>HQ?`ձ(pW:Z#b].|bsr:oC<`kgV>JIlm \/> Rcf G+~fB|lc\(JoQYTU"tt5I'M)4iUuٳfIĬ0g"Ϗ!Yk[-o4Xn}ճ#<2S^=z,˙@Ax H(5Շt vk+z+ToO[`tAڅL0Y)Q㞁^3Jnǹ]+\h(rX0 R@H :J%Xpw /؜[Oڙպ| Vcb[h"M{r"0luAF_'lf l/6̥؋}k;{CdNކ8 6Ĵi:eՑn_k QVU'σmW5LZ2âzlUҟN=< h泳0٧L&bm0gBE$# FQX,hQ_]<'iA "(dX,9%3~FضiŃ>gU +}gmo,7vwR6vG^0pc9sMˆNYią*0]̫U?Pܓ"aHdQkRa Q3)%M JoJU?A~G슽Lxd1m e̳<`6cLQL./I  I,Oc}Km,-]PK^? PKy.F'angular-1.3.9/i18n/angular-locale_el.jsVk@_B{Y;g4*1RVd !1i-;c2o2a"B??lVh2+"tRDRFQ%#5YN`Z$~ɑ}#giݍ-׺:CrAXNA Kgc4(=W/\~eݳiVgbrrOdƲY1k4*XBqb5:v aelLXzx~ͨr&rP:I\O˄+ރ22yWЉrPNQ~mdTos 5HvY{ Sޟq! =; qS+"bSC)7k 0VN &Z~B e")4X]MƂýA&XIlm \7> Rc3 GIox'q0a?3Fb/=t*SM:qph:xؤӦQWG}b5DeZU<v|SϬk94 e.TeJ~ҟN=".i԰اJ&fm(MfB$,b JqX,hQ1_]u K}kmo*NwR6ZNG^0pc83M˜Xi&.0m«u" `ˠ˄!&SCEiI-4DYFNg.Z̶aB)9J9GB /D_kl#nX|m.+or.PKV딋 PKy.F+angular-1.3.9/i18n/angular-locale_en-001.jsV]oH}Wl1] XbD1 lĶQ41XhqR{L&]j)s'sݔ)#i&U6(Ȉnelon&gDk0Zdȩ [ot0Χ$dDԁpſSI{»;.!Ĕ?+Oe: :9ٰ삭˜FUpdwDCBtCf_g6[J#X&'6o?H `1ɶF-_IvSpP&Vr bKBHwNٶܮw&BbXG]d{m]P6'ok"B}> 97 xDh=nN#Ez{.0Fu&3 kP ȝJ 3}Z} ̲jnR}Қ[JQ7洠BjY-rIE {uĥb5v"V[`ƮeT <fF`ŏ8?f,$?1/Z[˙翤DFFFFFu&i|@N4hggfPfU:QtA3#`9xp!6ѓo e֡v#AҔcZ/~5pNȊ&tY U5,pFpY[O{o<,Jz]8+™+OvѶF#wiBPGXEM5AsDՉ)#ګzQ f. ^;T  TUtGT;(Tq~:MK'迵Ezjt6[pb OkIA1. _ق}ϰs^ۜ0Q۱X} Ƀ.vZ^{EqM|Ut?'8`?PK21PKy.F+angular-1.3.9/i18n/angular-locale_en-150.jsV]oF}W\YbZ`a}E%fIcd;6&0K{R{̎}hG{a"ْ}Uʓ"I l 3փc y>Ok8a',&RJ|a={@_ݞ6(ĄIi'?Pn40&Qf2YÌ ~.6 + %2 َ~q;\p&ja00 F oii}a>$irL!UbT մL郐r&alvӇefHu4Ү?Bc1wo  Hm7m=/מ1)IF^Rfr$6=B0̦n!wVIStZia#ib;+Y/0Ax}M&|{RFZ yUcw"rh7g' `-<h[:=:2r$X HV- Z@:L)/ѩ}J- Z@fPk@- Z@򴀴i)լ:QtCrGpl\ɈWNb E,=wg ,8d9Q|2}7;$Ƀe,u|mlJ6^➵x_\aСB3߷U2wG~~Tg .1d2{jeq dt%siaO:&ٸ*s%2kCNR -)F#2*?~>c$i ƿF N9^8?iXrM+# gܥ &rJx A q6^!vubzgt:''| PK0PKy.F*angular-1.3.9/i18n/angular-locale_en-ag.jsVo8_aEv`'PuhX[5BzU DJ: ڻi@~co2e$DʚQэmM=~N$yV@ * nkE 2F7|yKrN;l@oL$M WQ;Ȟ>qhSٖ 0ldò c6W‘I *  }vl)`ОNE =2a&ے:?l|Ml&.{ NAXʑ6* ->9[#9KfnrM|( EG:'k#2ʶ9yK]|'*ɱ{Gi$g=ZFu&3 kP ȝJ 3z=wby_".js7˾di oMDXsZPBjY-rIE {uĥb5v"V[`ƮeT <fF`ŏ8?f,$?1/Z[˙翤DFFFFFu&i|@N4hggfPfU:QtA3#`9xp!6;eE hʘC+oF8)ǴViS Q _j0.jxn߭=?MB3rajXxᲦ5z3/KW%=.񕋋|'ov;h[;޴z!|"9 ^cu"wU⊨~l3ci B*Kң m 8JZ"{=5VG{E/JVD1ޡf")h4+C2nr&Fk&j83O޼!yHqhSٖ 0ldò c6W‘I *  }vl)`ОNE =2a&ے:?l|Ml&.{ NAXʑ6* ->9[#9KfnrM|( EG:'k#2ʶ9yK]|'*ɱ{Gi$g=ZFu&3 kP ȝJ 3z=wby_".js7˾di oMDXsZPBjY-rIE {uĥb5v"V[`ƮeT <fF`ŏ8?f,$?1/Z[˙翤DFFFFFu&i|@N4hggfPfU:QtA3#`9xp!6;eE hʘC+oF8)ǴViS Q _j0.jxn߭=?MB3rajXxᲦ5z3/KW%=.񕋋|'ov;h[;޴z!|"9 ^cu"wU⊨~l3ci B*Kң m 8JZ"{=5VG{E/JVD1ޡo")h4+C2nr&Fk&j83O޼!yHqhSٖ 0ldò c6W‘I *  }vl)`ОNE =2a&ے:?l|Ml&.{ NAXʑ6* ->9[#9KfnrM|( EG:'k#2ʶ9yK]|'*ɱ{Gi$g=ZFu&3 kP ȝJ 3z=wby_".js7˾di oMDXsZPBjY-rIE {uĥb5v"V[`ƮeT <fF`ŏ8?f,$?1/Z[˙翤DFFFFFu&i|@N4hggfPfU:QtA3#`9xp!6;eE hʘC+oF8)ǴViS Q _j0.jxn߭=?MB3rajXxᲦ5z3/KW%=.񕋋|'ov;h[;޴z!|"9 ^cu"wU⊨~l3ci B*Kң m 8JZ"{=5VG{E/JVD1ޡih")h4+C2nr&Fk&j83O޼!yH}؂"qw\m$[i+'I2s6i0ke%UW>E㼯ȕ{B'TͰY;Wx~yr~׎Jz]/q^)|O{h_Y޲y~Ώf?3o tsf 5 zQn%*^T a_& ն*U҇F3ZCFX/Um>}T"Rx> =QFϴK5p54D j;(!K5ӄ>^GPKӆӘPKy.F*angular-1.3.9/i18n/angular-locale_en-bb.jsVo8_aEv`'PuhX[5BzU DJ: ڻi@~co2e$DʚQэmM=~N$yV@ * nkE 2F7|yKrN;l@oL$M WQ;Ȟ>qhSٖ 0ldò c6W‘I *  }vl)`ОNE =2a&ے:?l|Ml&.{ NAXʑ6* ->9[#9KfnrM|( EG:'k#2ʶ9yK]|'*ɱ{Gi$g=ZFu&3 kP ȝJ 3z=wby_".js7˾di oMDXsZPBjY-rIE {uĥb5v"V[`ƮeT <fF`ŏ8?f,$?1/Z[˙翤DFFFFFu&i|@N4hggfPfU:QtA3#`9xp!6;eE hʘC+oF8)ǴViS Q _j0.jxn߭=?MB3rajXxᲦ5z3/KW%=.񕋋|'ov;h[;޴z!|"9 ^cu"wU⊨~l3ci B*Kң m 8JZ"{=5VG{E/JVD1y,_^kIA1 =_qϰs50^0Qñ} Ƀ.F⹚]{qJ|Tt ?8`<PK0PKy.F*angular-1.3.9/i18n/angular-locale_en-be.jsV]oH}W\Yb@(ZĔD1FF=);6ӱ)#=0]S mCNĄ415 K$F<&iQL) ݽ;{|n Z3;)z:+ (T/_X|g a_Z)iG%-6JHLV0#_ Ȋ" #oNhvݞpZD = F0AØ] `<;|,Lև4+2sN,Sv0U)0}1`+(klRIv7}X> nqvʠiUBH$38i`$$O~T}}ʋ:{~ZGW+\L##>PK ϞPKy.F*angular-1.3.9/i18n/angular-locale_en-bm.jsVo8_aEv`'PuhX[5BzU DJ: ڻi@~co2e$DʚQэmM=~N$yV@ * nkE 2F7|yKrN;l@oL$M WQ;Ȟ>qhSٖ 0ldò c6W‘I *  }vl)`ОNE =2a&ے:?l|Ml&.{ NAXʑ6* ->9[#9KfnrM|( EG:'k#2ʶ9yK]|'*ɱ{Gi$g=ZFu&3 kP ȝJ 3z=wby_".js7˾di oMDXsZPBjY-rIE {uĥb5v"V[`ƮeT <fF`ŏ8?f,$?1/Z[˙翤DFFFFFu&i|@N4hggfPfU:QtA3#`9xp!6;eE hʘC+oF8)ǴViS Q _j0.jxn߭=?MB3rajXxᲦ5z3/KW%=.񕋋|'ov;h[;޴z!|"9 ^cu"wU⊨~l3ci B*Kң m 8JZ"{=5VG{E/JVD1y GkIA1 =_qϰs50^0Qñ} Ƀ.F⹚]{qJ|Tt ?8`<PKȼ?PKy.F*angular-1.3.9/i18n/angular-locale_en-bs.jsVo8_aEv`'PuhX[5BzU DJ: ڻi@~co2e$DʚQэmM=~N$yV@ * nkE 2F7|yKrN;l@oL$M WQ;Ȟ>qhSٖ 0ldò c6W‘I *  }vl)`ОNE =2a&ے:?l|Ml&.{ NAXʑ6* ->9[#9KfnrM|( EG:'k#2ʶ9yK]|'*ɱ{Gi$g=ZFu&3 kP ȝJ 3z=wby_".js7˾di oMDXsZPBjY-rIE {uĥb5v"V[`ƮeT <fF`ŏ8?f,$?1/Z[˙翤DFFFFFu&i|@N4hggfPfU:QtA3#`9xp!6;eE hʘC+oF8)ǴViS Q _j0.jxn߭=?MB3rajXxᲦ5z3/KW%=.񕋋|'ov;h[;޴z!|"9 ^cu"wU⊨~l3ci B*Kң m 8JZ"{=5VG{E/JVD1yL GkIA1 =_qϰs50^0Qñ} Ƀ.F⹚]{qJ|Tt ?8`<PKy2HPKy.F*angular-1.3.9/i18n/angular-locale_en-bw.jsVkoFί ~E%f(86&0K,wlj)ng $:m[Ll~okrK_g86 3NX֡C+gwq:ώ :nΈo\tX(޽R Yx3|!bEyxW|qܪӖ|D,LL* (Gj!"UQ~ 6~4dB{Aa~`rMwԃ_ֱ]^"u*UT ոTOf~ .(/]PlQ f7]TeO :gs8"Pեi @ʮCҠC?BC>_?ga ָkz9=ƨ f`tm%0l0L2e>NNghe{`P-TStSKd?5VK{E-JQDq{6jLp+ZoUh\ʹZNnoNX!OVP?->>#z{h[Gl~PKTPKy.F*angular-1.3.9/i18n/angular-locale_en-bz.jsVmoHίYbz@'PTQbJ#۹EFkӄ;k]Z3k"hK᠋T!L[vQ v BC  YFǴѿ3F%ɨK[_L^]uB0̪n!')f [ 4DŸ׋"L^fFx _oub-V<ت+OFdztOg `'&x+і7w\%:2r$X HV- Z@:L)_S Z@jAAiҦL VP) l@ ʈSQ/ "H [ QԨLtʬ7ۦ?Ϻ؋o(:* ˻{or4Χ&-FD ܁rPE3!{;!$U)|DŽutreD 3 FC"#/n,Kvȯd@F0;҃_ ǭcͻ$O{8TR5TRE!%҇g]rA}ppi'tDzPx8>}..Cl됿ȠCޕBC1"NoDB%"G~@Z ߸leJKWaVW/]|}YMW`d6e_a~;)F35V'F)b_׋\RQfƞEqLb#Vnlحk'r+hWl3b `g& i^xkMdpllkj0jdLT,AFFyFmFeF[ͪCW4g D|M^)D2QڍFI22BOiʦQR9ۥ"W\exT' SrTe?tZ*텎vLo\\+g?yF]N|+A cmW7G=((~ L藙3S܎'tP +5RN,+>>Ng=uP2~iZ:Cҟr0*WjT@xoS7oU h\ɅMXnoNXn!yaKRmb>+a|l PK0pPKy.F*angular-1.3.9/i18n/angular-locale_en-cc.jsVmoH_1BlnVt9I"_EXl$X%M]΂ NN"ye); 4 EBMmn${g;q(H3f*NI8nn|[w r (YZ(dLF濫xºuDpmϖkRžiҧRn6A$7aFC,_=s{` eb x9tZZٮxqL#ubT-մL飘ӝCY`}`b;LcfÇP_HpHu4i׃0ohw_Nݛ@*q(lK'j2Vi-r2h{mp Û7PFCrv%)}Q1ot=^~1L=PK4PKy.F*angular-1.3.9/i18n/angular-locale_en-ck.jsVo8_aE7`p'PuhX[5Bz*.q8=NޝE}ߏiʔ4*kodDE7N2b77ɊFjYg;Z,L7r*((z 闉S܍GW +\v, >.I'=vP0\KV4-_ף+ڼyTµ"ERhcCW`eܪ3,\M&'Lp,fp}K򠋑xf^1~']|Cz0<4{}PKK PKy.F*angular-1.3.9/i18n/angular-locale_en-cm.jsV]oF}WbZ`aOlF`,$mURN-3F\D=nQ1$Șަk3KAt!TɏDuȟd!?BC1"7"!xDh=~AcHk]b<<ߝKkT ]J3}ZC ̪nnڔɲ=3(I4ᴤB<sCV͌=&Rޙr'{FtHuuc72ȭr]}Β':O<-Lp+4  `d-:4X4849FڌʌU2/ip,.)~ Lי3S\'tP +5BN,K>>Ng=uP>4-r0?*ili6({t4 Ы=X۸j+P 5<$ߓ"c+^uPwEp=^}4#6?PKPKy.F*angular-1.3.9/i18n/angular-locale_en-cx.jsVo8_aEv@Չam **8ȉv=NNE}ߏiʔ4*kodDE7N2b77ɊFjYg;Z,L7r*"#fwɓHw@eۜJ]Mz-K!Tc$Hb"{.,Jz]8+™+OvѶF#wiBPGXEM5Qsy"wU⊨~l3ci B*Kң m 8:MK'迵?Xm<*Zxg\8ZH cl[5~Ʉ wHt1+ƏS䣢o~W_ Cx?PK-FgHPKy.F*angular-1.3.9/i18n/angular-locale_en-dg.jsVmoH_1BlnVt9NI#_EH%m}7 .N"byfa芌Bpw""|'im#5Eʓ"%Ä S;wv8y%\g7tV Q{ȟ%>xoV[b¾Joi'?Pn40&Qf2YÌ ~.6 + %2 O8v{Ri.80 #7s4}\I?SgAX*0UC5`0S` dtPT.X:$? 㐙n,W}<B0̶nA6NVISg-;4Z!8a4JsC V͂>&b;rg)#-Vn<ت^dnh wg' `-<hkt\GudX H\- Z@Ft6,SDA*,j9BAAiҦL V@D)«>x%l,ںo\NxeFeס+ekvHx^sl~[Y4tT׹[+,wU7GuMMNp,(z ɗ')k&@Fk^:8&K0ވ@QG$;Pe{dP-kXm>uTB_E4#'|\j㿰jV.i%r'R{ie\ëWPC\rk%~ S焋PKPKy.F*angular-1.3.9/i18n/angular-locale_en-dm.jsVo6_aE5܀&FõU(ح\@AN^q 6M;~s.3F\D|Ԣ|#c*zIȘܦk3C>gDZDByr[cmoT7}}[ Cb}g"|@H+EsuȞvdz_9ɷLXQK''_u8L!H!<{m, /O0[҅_ FC﷩;$;8TR5TRE!%҇g]rA}ppi%tȧPxج.}.ClDٵɟ&?B}1$voHBzz%,[GZ_tci K W_aVGU.*aVu%ؠYmMٗ,kܳ@VTD %+Q;Wbn(TԪ'D\*[Sx'؈nnFƵcYnKY3a0K i{kMdpllkj0jdLT,AFFyFmFeF[ͪCǗ4g8 t)+NFR&,ddeZM-D#|sME^|xy)ХGBg-U9e_k<84ncY(W}g7o `g&8hkykMdpllkj0jdLT,AFFyFmFeF[ͪCǗ4g8 =)+NVR&lDyk7%(=*ZFJDIY+la奌nBoK T g5sq;wr媤ҙ^ʗBi{w v5WA.ݏ-0_fLq;A-k@ζ Q2;J/e4;AɡZVi ~?5VK{eKQD1;]M>SXzk W-q%j7a:ac{R}, Ӟ>+ǿ׫ouĂ<>/PKڹPKy.F*angular-1.3.9/i18n/angular-locale_en-fj.jsVo8_aE7`p'PuhX[5Bz*)q8=NޝE}ߏiʔ4*kodDE7N2b77ɊFjYg;Z,L7r*((z 闉S܍GW +\v, >.I'=vP0\KV4-_ף+ڼyTµ"Nwh")h4+C2nr&Fk&j83O޾%yH=[mPH,=JbOqvTrnĹd 32(0bfwI L^`܃?`4){α~a>YqL#ubT-մLÈ]BY`}`b?L"fEU(x"8y>Q.CT&7 zzK%4=(qzG 7,I,pb55pm=.מ1HF^Rf2Hb}C`MC6NVi[[4`gmQ#8aJlsC Q͂>6brgb-Vn<ت7Nz4+hg-J3<5j[:-:2r$X HV- Z@:LV)_S Z@jAAiҦL VP)(«xl,u "HJa$$O)ڢCJ?J>E;xkoOUJ5nmҵʦX;O߹o-%F#r"^Yk㞵ʡ߹Z}go@>y:XUO NgjCFZQn C.ij(ߕłx?n _؁m+ϴKp7Djk(!nKӒ>'[/?PK|PKy.F*angular-1.3.9/i18n/angular-locale_en-fm.jsVo8_aEv`'PuhX[5BzU DJ: ڻi@~co2e$DʚQэmM=~N$yV@ * nkE 2F7|yKrN;l@oL$M WQ;Ȟ>qhSٖ 0ldò c6W‘I *  }vl)`ОNE =2a&ے:?l|Ml&.{ NAXʑ6* ->9[#9KfnrM|( EG:'k#2ʶ9yK]|'*ɱ{Gi$g=ZFu&3 kP ȝJ 3z=wby_".js7˾di oMDXsZPBjY-rIE {uĥb5v"V[`ƮeT <fF`ŏ8?f,$?1/Z[˙翤DFFFFFu&i|@N4hggfPfU:QtA3#`9xp!6;eE hʘC+oF8)ǴViS Q _j0.jxn߭=?MB3rajXxᲦ5z3/KW%=.񕋋|'ov;h[;޴z!|"9 ^cu"wU⊨~l3ci B*Kң m 8JZ"{=5VG{E/JVD1 ERhcCW`eܪ3,\M&'Lp,fpyC򠋑xf^1~']|Cz0<4{PKEpPKy.F*angular-1.3.9/i18n/angular-locale_en-gb.jsVmoH_1BlnVt9NY0,haI[͂Mt*-g(d9y#,8DDuɞDT§iR'_}&L{᰽˅k|\/öf}!r$aLow3P_DpXg4y֧!Q ހ0ohX̠G1t=qA"3#?bZ ^ʲͅhd,̭)Oh&/ڰOc} k:fҖ]A=XrV'&9Vˊ}_gt5lM ܎Υ4>hdgZ۞;(iq~w:UKZ*5VG{e_ГDQ6 gWK#IF_؁m+ϼ p7DrOk(1nK|S]O?wxzPKPKy.F*angular-1.3.9/i18n/angular-locale_en-gd.jsVmoH_1BlnVt9I"_E`$X%M]΂ NN"ye)7Ew!, 4 DBME7ن${g;q PMgTXpX̷ܺ>9a:0QPȘIE$u>ڞ-(=KrO8L;*9D8%In2YÌ ~.6 +%2Y@:v{Ri!80 ʢb x9tZZٮxqL#ubT-մLØӝCY`}`b;LcfÇP_HpHu4i׃0ohw_Nݛ@7Y/~PK>hPKy.F*angular-1.3.9/i18n/angular-locale_en-gg.jsVmoH_1BlnVt9NY0,haI[͂Mt*-g(d9y#,8DDuɞDT§iR'_}&L{᰽˅k|\/öf}!r$aLow3P_DpXg4y֧!Q ހ0ohX̠G1t=qA"3#?bZ ^ʲͅhd,̭)Oh&/ڰOc} k:fҖ]A=XrV'&9Vˊ}_gt5lM ܎Υ4>hdgZ۞;(iq~w:UKZ*5VG{e_ГDQ6 MK#IF_؁m+ϼ p7DrOk(1nK|S]O?wxzPKkPKy.F*angular-1.3.9/i18n/angular-locale_en-gh.jsVmoH_1BlnVt98/ rY0,’{g'wSb1ϼ?١+r yMѝvDB0P`M! 57;q PMgTXpX̷ܺ.w gr (YZ(dLF濫xº>=[QH {JbKqvTrhqN7qJd]l@VKd~uB;Bp&j`00 &E7s0Y]:G2UZiS!Ӈ1;v&vlwӇUఎHu4i׃0ohw_NM D1߰$I81Wp\{{Ƥ"53{eK3WQY7M=dde_мepGv[F <HYb 7YGFl7[]lDvk!jZ$3Z >l,|.Ik U Ȩ6U>HE- Z8ePk@- Z@򴀴i)ծ:IrN G&e$ eJX[v<rLk6֏Ӫ6E}CWڟ+ R5â<\r_o]ZږI/.=ܚ_x{Jj pەB ]|r+A cD^MQt,)y L'S+&7@FK%{"}4]OPe{P>4-1O?ګڼā$ATz.$spql,\\݄Չ&r=V[x oBq)g"z0=t PK5ϣPKy.F*angular-1.3.9/i18n/angular-locale_en-gi.jsVmoH_1BlnVt9NY0,haI[͂Mt*-g(d9y#,8DDuɞDT§iR'_}&L{᰽˅k|\/öf}!r$aLow3P_DpXg4y֧!Q ހ0ohX̠G1t=qA"3#?bZ ^ʲͅhd,̭)Oh&/ڰOc} k:fҖ]A=XrV'&9Vˊ}_gt5lM ܎Υ4>hdgZ۞;(iq~w:UKZ*5VG{e_ГDQ6 _K#IF_؁m+ϼ p7DrOk(1nK|S]O?wxzPKCPKy.F*angular-1.3.9/i18n/angular-locale_en-gm.jsVmoFίY\* &/1FE65Z{Q{gm&i<ϼ?qWۢ;a"lKj<+@`"Θ:%᰾sgo]:.:0SPȘKE,u!}w{ڠ"=+˕>Ŏr8bAqJd ]l@VKd~sB;Bp&j/`0/0 &E7s4Y}:G2UZiS!Ӈ1v&nlwӇUNHu4|i׃?aԃ*@ӛ@4M=dde_мepOv;FK<HYWbn7Y'Fl·;]lDv!jF$3Z >l|Mk U Ȩ6Uʷ>HE- Z8gPk@- Z@򴀴i)ծ:I #`Xe}P2E2A,R`7II95jFVZiU+|1REס+ȕZa Q.cugjwkGocˤB[XkrZKPᗮsVh_[y%~ȋv?%%o)d{f 5 z$UhSiaO&lOT8O:uKg?ȗX/Um>o}X@E J+GcN98c 6\@Z.nD-< /:HO{b_z{f;G\ PKm솚PKy.F*angular-1.3.9/i18n/angular-locale_en-gu.jsVmoH_1BlnVt9I"_E`$X%M]΂ NN"ye)7Ew!, 4 DBME7ن${g;q PMgTXpX̷ܺ>9a:0QPȘIE$u>ڞ-(=KrO8L;*9D8%In2YÌ ~.6 +%2Y@:v{Ri!80 ʢb x9tZZٮxqL#ubT-մLØӝCY`}`b;LcfÇP_HpHu4i׃0ohw_Nݛ@7Y/~PKw[ƙPKy.F*angular-1.3.9/i18n/angular-locale_en-gy.jsVmoH_1BlnVt9I"_E`$X%M]΂ NN"ye)7Ew!, 4 DBME7ن${g;q PMgTXpX̷ܺ>9a:0QPȘIE$u>ڞ-(=KrO8L;*9D8%In2YÌ ~.6 +%2Y@:v{Ri!80 ʢb x9tZZٮxqL#ubT-մLØӝCY`}`b;LcfÇP_HpHu4i׃0ohw_Nݛ@7Y/~PKijPKy.F*angular-1.3.9/i18n/angular-locale_en-hk.jsVmoFίôA@QE$1FEXU{mQ{gm&i@gޟY{ܕ9ѦN;dL0I2fỻtCcF"imJ)[SR{ov4G[%~=w+)zK(R/ _xwf5 _Gpm{ʧ3AӎN;V\M8cF?@PE F|>v{J#X! 0g cw7sxҬxΑ:JUbjTQa]BY`}b?L"nÇP_LqX',}ƣ>],߃0whPNM D1߰ę_zLKpc?-\ϙ>T$f%~B3uR>Y7M}dd@e R"j9'V) R.hT`Ϣ8TlY&؈N[nVƍ3ya> HE# F8gh@# F@򌀴)3ծ:q|E Gxa ^EŹ.aH&ʷOd@O9Im `b J|}**{}*4:Vdyb{_;*兎veo|JCF]͂WzsW}±-0nLxBGpEӸr[4UAؗ꣉fi~2>CAcNO-.G#jv6>*V`GHX Dž7믱hrv.V&Xm1{e8exA1~gCz@շ9b<>_PKԱjPKy.F*angular-1.3.9/i18n/angular-locale_en-ie.jsVHݿ*J4ƺXwn62( d`ضހwM 芜B^h[t'v"&J@4&ݒ}r?E2 l[D)3NI8onlW.vWc0~Pji#HIE$sCtA]z ە>Şr8䰣%F s fd(+b ͮI L^`ԃ01Ɣ= oIi47YҬx8Α:LUbjTQah.]>tpHn*}<ܬy>a.CT&W z=vJܽ1#Vg$/bLk\6W0_qE2jڑ e+BDej4}A ؙ 6e)i⬖Y5aF5s^;xk4[pƮE<;ZѬ#_m˴<3C_KZmyNkkjjjtR>GA*5@5@58gPk@ ? < 6 2 vաKRP< pp'#NND"b1Nq2E_~T]}ʋ*vqޜbWڢk=2ݺm#~od"^ڳ+r^Kzv}e.WAel:XU0!khxPz$[ݚWN {"}4YϤAEZzۨSt&]{KH(Dad$ۏCMg`c4q)gF'XM| ehP ? "z09v8 PK/]PKy.F*angular-1.3.9/i18n/angular-locale_en-im.jsVmoH_1BlnVt9NH%m}7 .N"byfa芌Bpw""|';Q`dK"jW)Op'@m&TXpX޹̷>8.:0QPHKE,u}{{ڠUzK˕>r4䰧݆12 fd;t!YQ(ava'530Q{ qL0l`~O;N#Džc1uTeS5T 0BFwCa2M.B1aHu4i׃aԃJ@ӛ@ce?-x~jy6LYFBE6=k-CpB ]|rW|}To u̱%0&_l[j_D4:ْ}r?Uʓ"%Ä Sgv}?y畳38e9 )OsPHJE(u>ڞ-7(Ą=IrO8N;*9h~NaLd]l@VJd2~[fwI LԞ`܃0 F= oiisa>$i~rL!UbT-մL郐QӝAQ`}`|?CfûP_@pj4y4ǣ>R]2MRh{(&PM @1ھaA"{*R[~9nwi[c<ט$ffm)~A3$6jF iUvҖ=A- o-xrr DZثw,0Ax}m&|RFZ\ yUcW"jrui/6OZ2)NLWH-bxi֑c- Z@rjfLP j O H6- eZ@U"IN>}2.~(b<~Ǔ,R4*_j 㲀g>ymy^ǮlTR ~xHt<oZ7Ɩ*5:wTYݬWzyl^ ceoiǪ"k1d-4d5:jچI ݚd ®dM4MUu%2k=^uK'?UF}j4aui$8x# Q_/iZɅU8^h"e95䙜f~=O>3UǿosāyOPKKi0cPKy.F*angular-1.3.9/i18n/angular-locale_en-io.jsVmoH_1BlnVt9NH%m}7 .N"byfa芌Bpw""|';Q`dK"j'E@ 6f*NA8o|[wpr (OYY($LF"º>=[mP *=J@qvTrnØDd 32(0d; ۓNs&hQ0@Sd}H1:C2UiS!;Lw EM0B1aHu4i׃aԃJ@ӛ@. _XE+ϴ p2Dr+(!.K~n}N ]O?osxzPKbPKy.F+angular-1.3.9/i18n/angular-locale_en-iso.jsVmoHίYi1- h (1%Q4(5XhuJ9l֦Ng kgEF!yaO@46]]?b" $ Σ U;wr8]%\gOSt )Q{ȟ%>qg\ۓ +}-qRaC+g&0=!YQ$~ vݑNsްFhSɷC ǭcd]Hwc 9Tj-L` LFC~1M>b'u2ߥp@UH)ZbBC$5pkz9==cT 䃀Umˇ 0lYenM4kӀAVьG 'KQ,yjf7V;(֢]oFȃq-DlDkGw9ML883jfa dt%SiaO:KlO 8:uKg?] jr6](DQ֋2XpO&+c6pWr!gF'XN!} Eǡx)AR~g}@a|lq@7PK?7PKy.F*angular-1.3.9/i18n/angular-locale_en-je.jsVmoH_1Bl׾'[:Q0Fn/6f9,x殪dy+r ymѝvۉa"v2Q PmTXpX޹̷9.r _(OYY(LF異xº>=[mPH,=JbOqvTrnĹd 32(0bfwI L^`܃?`4){α~a>YqL#ubT-մLÈ]BY`}`b?L"fEU(x"8y>Q.CT&7 zzK%4=(qzG 7,I,pb55pm=.מ1HF^Rf2Hb}C`MC6NVi[[4`gmQ#8aJlsC Q͂>6brgb-Vn<ت7Nz4+hg-J3<5j[:-:2r$X HV- Z@:LV)_S Z@jAAiҦL VP)(«xl,u "HJa$$O)ڢCJ?J>E;xkoOUJ5nmҵʦX;O߹o-%F#r"^Yk㞵ʡ߹Z}go@>y:XUO NgjCFZQn C.ij(#'jVni-r1f{io܍ PC܈ru$%}M1Ot=^~0L#n PKzPKy.F*angular-1.3.9/i18n/angular-locale_en-jm.jsVo8_aE7`'PuhX[5Bz*)q'ޝE}ߏiʔ4*kodDE7N2b77ɊFjYg;Z,L7r*T4-_ףPcWykE㝿ERhcCW`eܪ3,\M&'Lp,fp}K򠋑xf^1~']|Cz0<4{}PK qPKy.F*angular-1.3.9/i18n/angular-locale_en-ke.jsV]oH}Wn1@(ZQb1 lvhcj4MZ suSWYsؠ|##*q-NV4bV|ßj'<\+ | 5"FN_xw>μ%9#?o6 7&xΦ(Rd 8x#t !Iy|-aɆel4Jm* ##'&"DU*5: fR2)8=#~NzdÈM%uH84jؼM]vH2J#UM5l U["}rF3..Ͷ8v6yWeu4%vF ems+Qv-ZB$ HZ_7ę:1s?y_XdhFUgs*^JaUؠ8Ym&uٗ,ܲ5?ukN VHw6/\Q.T3aTNj+WR nJF#if X0[eI & Djm-.fft֙,RDFFF8eh@@@@V@F9FrCmOʊ&ϔ1[2Vڍlq((z 闉S܍GW +\v, >.I'=vP0\KV4-_ף+ڼyTµ"o")h4+C2nr&Fk&j83O޾%yH((z 闉S܍GW +\v, >.I'=vP0\KV4-_ף+ڼyTµ"a")h4+C2nr&Fk&j83O޾%yH((z 闉S܍GW +\v, >.I'=vP0\KV4-_ף+ڼyTµ"a")h4+C2nr&Fk&j83O޾%yHqhSٖ 0ldò c6W‘I *  }vl)`ОNE =2a&ے:?l|Ml&.{ NAXʑ6* ->9[#9KfnrM|( EG:'k#2ʶ9yK]|'*ɱ{Gi$g=ZFu&3 kP ȝJ 3z=wby_".js7˾di oMDXsZPBjY-rIE {uĥb5v"V[`ƮeT <fF`ŏ8?f,$?1/Z[˙翤DFFFFFu&i|@N4hggfPfU:QtA3#`9xp!6;eE hʘC+oF8)ǴViS Q _j0.jxn߭=?MB3rajXxᲦ5z3/KW%=.񕋋|'ov;h[;޴z!|"9 ^cu"wU⊨~l3ci B*Kң m 8JZ"{=5VG{E/JVD1މV?Ɔ ʸUgXʹLm NX>yA#\ͮb8O>*axh0PK7SPKy.F*angular-1.3.9/i18n/angular-locale_en-lr.jsVo8_aEv`'PuhX[5BzU DJ: ڻi@~co2e$DʚQэmM=~N$yV@ * nkE 2F7|yKrN;l@oL$M WQ;Ȟ>qhSٖ 0ldò c6W‘I *  }vl)`ОNE =2a&ے:?l|Ml&.{ NAXʑ6* ->9[#9KfnrM|( EG:'k#2ʶ9yK]|'*ɱ{Gi$g=ZFu&3 kP ȝJ 3z=wby_".js7˾di oMDXsZPBjY-rIE {uĥb5v"V[`ƮeT <fF`ŏ8?f,$?1/Z[˙翤DFFFFFu&i|@N4hggfPfU:QtA3#`9xp!6;eE hʘC+oF8)ǴViS Q _j0.jxn߭=?MB3rajXxᲦ5z3/KW%=.񕋋|'ov;h[;޴z!|"9 ^cu"wU⊨~l3ci B*Kң m 8JZ"{=5VG{E/JVD1މWERhcCW`eܪ3,\M&'Lp,fpyC򠋑xf^1~']|Cz0<4{PK~˭PKy.F*angular-1.3.9/i18n/angular-locale_en-ls.jsVo6_aE#l>pmUVU.8)qc{sBM">ǎߴeHh-ʷ23tMcfuɗw{FN'W~w|oDoL(R 9Xkw2_AH(Q+|DŽutre%[G 3 OQE G|þz;J#X.'67_Ȁ`3w[V#o3wI3pP%V j-BbK#6HwADnv%BbN mN~$ʮC$j){#G/h,b.<<ߝKkT ]J3zprP!.js7mʁdYmhDpZRB<sCV͌=&Rޙr'{FtHuuc72ȭr]}Β':O<-Lp+4  `d-:4X4849FڌʌU2/ip,.((~ Lי3S܍'tP +5BN,K>>Ng=uP2>4-r0?*ilQ6({qV:ZX Ocl[5~ƕ\Ʉ I1/:(OS죢o^PKX PKy.F*angular-1.3.9/i18n/angular-locale_en-mg.jsV]oF}WbZ`aOlF`,$mUseHh-ʷ23tMcfuɗ|w{FN'W~w|oDoL(R 9x3|!EyW|qɖl%4l* ##'?6"DU) v(`^ްC~!2a6ߑzd8n[|l%> AX** ->8 )*~qM|* E'a=tHwBeۜH]IC)=#R`z#G4X%\IF%L܅/0SU>T¬KA1YmM9,kܳ ?MNK +Q̓z17K*jؓh".)wQlDʍT[7v#Z,7%,y™Bm-MR=rizXxwg<}g>]=.WJ:c.鵋|,|F]LA] cm7'}QQЯ3AgO5WL k gۅ(JS%X2T}}Pm{ꠤP-}iZ:C?`@OU.^mQfc)h<WrVv[&j;KxH޿'ENP?}/:b?PK?PKy.F*angular-1.3.9/i18n/angular-locale_en-mh.jsVo8_aEv`'PuhX[5BzU DJ: ڻi@~co2e$DʚQэmM=~N$yV@ * nkE 2F7|yKrN;l@oL$M WQ;Ȟ>qhSٖ 0ldò c6W‘I *  }vl)`ОNE =2a&ے:?l|Ml&.{ NAXʑ6* ->9[#9KfnrM|( EG:'k#2ʶ9yK]|'*ɱ{Gi$g=ZFu&3 kP ȝJ 3z=wby_".js7˾di oMDXsZPBjY-rIE {uĥb5v"V[`ƮeT <fF`ŏ8?f,$?1/Z[˙翤DFFFFFu&i|@N4hggfPfU:QtA3#`9xp!6;eE hʘC+oF8)ǴViS Q _j0.jxn߭=?MB3rajXxᲦ5z3/KW%=.񕋋|'ov;h[;޴z!|"9 ^cu"wU⊨~l3ci B*Kң m 8JZ"{=5VG{E/JVD1މ;ERhcCW`eܪ3,\M&'Lp,fpyC򠋑xf^1~']|Cz0<4{PKcSPKy.F*angular-1.3.9/i18n/angular-locale_en-mo.jsVmF_1Bi[۱~u\t t3 ZX.Yf\[UE<9Ѿ{DL8IS`tObj #7O(@(ؾRf*l^I8lr[wWpr_)OX(LFxzཽPH"=JHqTr8Ĺd 32 (8bfH L^h:_`34);G޹dCH):G2UZySE!Ӈv&qDlw3U.YbN'C Qe ~i7?a2*AӛAqhSٖ 0ldò c6W‘I *  }vl)`ОNE =2a&ے:?l|Ml&.{ NAXʑ6* ->9[#9KfnrM|( EG:'k#2ʶ9yK]|'*ɱ{Gi$g=ZFu&3 kP ȝJ 3z=wby_".js7˾di oMDXsZPBjY-rIE {uĥb5v"V[`ƮeT <fF`ŏ8?f,$?1/Z[˙翤DFFFFFu&i|@N4hggfPfU:QtA3#`9xp!6;eE hʘC+oF8)ǴViS Q _j0.jxn߭=?MB3rajXxᲦ5z3/KW%=.񕋋|'ov;h[;޴z!|"9 ^cu"wU⊨~l3ci B*Kң m 8JZ"{=5VG{E/JVD1މ7ERhcCW`eܪ3,\M&'Lp,fpyC򠋑xf^1~']|Cz0<4{PKИPKy.F*angular-1.3.9/i18n/angular-locale_en-ms.jsVo8_aEv`'PuhX[5BzU DJ: ڻi@~co2e$DʚQэmM=~N$yV@ * nkE 2F7|yKrN;l@oL$M WQ;Ȟ>qhSٖ 0ldò c6W‘I *  }vl)`ОNE =2a&ے:?l|Ml&.{ NAXʑ6* ->9[#9KfnrM|( EG:'k#2ʶ9yK]|'*ɱ{Gi$g=ZFu&3 kP ȝJ 3z=wby_".js7˾di oMDXsZPBjY-rIE {uĥb5v"V[`ƮeT <fF`ŏ8?f,$?1/Z[˙翤DFFFFFu&i|@N4hggfPfU:QtA3#`9xp!6;eE hʘC+oF8)ǴViS Q _j0.jxn߭=?MB3rajXxᲦ5z3/KW%=.񕋋|'ov;h[;޴z!|"9 ^cu"wU⊨~l3ci B*Kң m 8JZ"{=5VG{E/JVD1މERhcCW`eܪ3,\M&'Lp,fpyC򠋑xf^1~']|Cz0<4{PKzPKy.F*angular-1.3.9/i18n/angular-locale_en-mt.jsVHݿ*ީն?i6ufmvAI` ö}N춗ˑh} 芜B^h[tv"&|iM%15ƋeH l[D)3փC$7a> 8c,R&wRQ nCFQn ]KhDjij(IZY,8xP1rMk sMx^2P ?ϊ!~Ez0=v8 PK.m PKy.F*angular-1.3.9/i18n/angular-locale_en-mu.jsV]oH}Wn1@'PbiŀiDQ41Xhq=c3RN)SFL9lP8Ȉ&k1MzInH„kC#oa<3oE.DԁpſSI{»; Ĕ?+Oc::9ٲ쒭ØFUpd7DCBtCa_g6[J#X&'6o?H `1vF-ߧ$g{)8(T9RTR%!g yl׍Cn׻iE_H1>y6.l_kIE~)J|@rLo@z|ݜF3ֺky}ǛVu]TQGMk`LN]zCDRi +]{%(m`#)h4͡W+{qrk&j?kO޾%yVP?-.>#z^}4 #6?PKPKy.F*angular-1.3.9/i18n/angular-locale_en-mw.jsV]oF}WbZ`'PTQb6Icӈnhcdl{fvlj)s'sݖ#Y.u(ʘ~ndloo5%gۋ6 %_QmuȡUPAwq: O"{#b}e"7w \E "V̹{ȞN+ /#r|NN,d(qfsU!9!H!o/vGi˥Ć3 cƷ#qjmf.I^ u*UT ոTQHla.HQ>84ncY(W}g7o `g&8hkykMdpllkj0jdLT,AFFyFmFeF[ͪCǗ4g8 =)+NVR&lDyk7%(=*ZFJDIY+la奌nBoK T g5sq;wrI.鵋|,OwhWI8~%z2O:Je& 抪a l%Si R:OmO8kuj9ПSc˿WDE7oU h\ɅMXnoNXn!yaKBmb>+a|l  PK#;PKy.F*angular-1.3.9/i18n/angular-locale_en-my.jsVo6_aE#l>pmUVU.8)qc{sBM">ǎߴeHh-ʷ23tMcfuɗw{FN'W~w|oDoL(R 9Xkw2_AH(Q+|DŽutre%[G 3 OQE G|þz;J#X.'67_Ȁ`3w[V#o3wI3pP%V j-BbK#6HwADnv%BbN mN~$ʮC$j){#G/h,b.<<ߝKkT ]J3zprP!.js7mʁdYmhDpZRB<sCV͌=&Rޙr'{FtHuuc72ȭr]}Β':O<-Lp+4  `d-:4X4849FڌʌU2/ip,.qhSٖ 0ldò c6W‘I *  }vl)`ОNE =2a&ے:?l|Ml&.{ NAXʑ6* ->9[#9KfnrM|( EG:'k#2ʶ9yK]|'*ɱ{Gi$g=ZFu&3 kP ȝJ 3z=wby_".js7˾di oMDXsZPBjY-rIE {uĥb5v"V[`ƮeT <fF`ŏ8?f,$?1/Z[˙翤DFFFFFu&i|@N4hggfPfU:QtA3#`9xp!6;eE hʘC+oF8)ǴViS Q _j0.jxn߭=?MB3rajXxᲦ5z3/KW%=.񕋋|'ov;h[;޴z!|"9 ^cu"wU⊨~l3ci B*Kң m 8JZ"{=5VG{E/JVD1偶v4s!Xj K9W 5'oސqhSٖ 0ldò c6W‘I *  }vl)`ОNE =2a&ے:?l|Ml&.{ NAXʑ6* ->9[#9KfnrM|( EG:'k#2ʶ9yK]|'*ɱ{Gi$g=ZFu&3 kP ȝJ 3z=wby_".js7˾di oMDXsZPBjY-rIE {uĥb5v"V[`ƮeT <fF`ŏ8?f,$?1/Z[˙翤DFFFFFu&i|@N4hggfPfU:QtA3#`9xp!6;eE hʘC+oF8)ǴViS Q _j0.jxn߭=?MB3rajXxᲦ5z3/KW%=.񕋋|'ov;h[;޴z!|"9 ^cu"wU⊨~l3ci B*Kң m 8JZ"{=5VG{E/JVD1Ah")h4+C2nr&Fk&j83O޼!yHϼ%9#o6 w&xΦ(Rd 8Xkw4]B)R)l˄u6tra9[1R Q |;mFL NlhH"I `1ɶF-ߟIwSpP&Vr bKBHwFٶܮw&Bb mN~'ʮE~^Vvؽ #B4W=ZFu'3 kP ȝJ3z=wbyW".js7˾di oMDXsZPBjQ-rIE {uĥb5v"V[`ƮdT <fF`8ӿf,$?1/Z[?DFFFFFu&/i|@N4hggfPfU:QtN3#`9xp!6;eE hgʘC+oF8)ǴViS Q _j0.jxn߬<=MB+rajXxᲦ7'{o<ϙ~o{y/] g]f7s5:MD,w%0&NLqA^%KW@6sQ9J/d$=AAZz[ӴtSK_eGJihy ׊(;|]$Ƹ0;aVfARx|{izDMb$gjQ}eŇ\W CyOPKPKy.F*angular-1.3.9/i18n/angular-locale_en-nr.jsVo8_aEv`'PuhX[5BzU DJ: ڻi@~co2e$DʚQэmM=~N$yV@ * nkE 2F7|yKrN;l@oL$M WQ;Ȟ>qhSٖ 0ldò c6W‘I *  }vl)`ОNE =2a&ے:?l|Ml&.{ NAXʑ6* ->9[#9KfnrM|( EG:'k#2ʶ9yK]|'*ɱ{Gi$g=ZFu&3 kP ȝJ 3z=wby_".js7˾di oMDXsZPBjY-rIE {uĥb5v"V[`ƮeT <fF`ŏ8?f,$?1/Z[˙翤DFFFFFu&i|@N4hggfPfU:QtA3#`9xp!6;eE hʘC+oF8)ǴViS Q _j0.jxn߭=?MB3rajXxᲦ5z3/KW%=.񕋋|'ov;h[;޴z!|"9 ^cu"wU⊨~l3ci B*Kң m 8JZ"{=5VG{E/JVD1+j")h4+C2nr&Fk&j83O޼!yHqhSٖ 0ldò c6W‘I *  }vl)`ОNE =2a&ے:?l|Ml&.{ NAXʑ6* ->9[#9KfnrM|( EG:'k#2ʶ9yK]|'*ɱ{Gi$g=ZFu&3 kP ȝJ 3z=wby_".js7˾di oMDXsZPBjY-rIE {uĥb5v"V[`ƮeT <fF`ŏ8?f,$?1/Z[˙翤DFFFFFu&i|@N4hggfPfU:QtA3#`9xp!6;eE hʘC+oF8)ǴViS Q _j0.jxn߭=?MB3rajXxᲦ5z3/KW%=.񕋋|'ov;h[;޴z!|"9 ^cu"wU⊨~l3ci B*Kң m 8JZ"{=5VG{E/JVD1U`")h4+C2nr&Fk&j83O޼!yH)h&Ox@u ïzzK)4(pzG ]oXHϢz{LK.pޕe>,lǚy.$ff,%~A3u~}Ƥ nVҖ=ɲ h-Drr)NX!R,{]6\RѨfEtTf+R캱k5Vfֺ,YgI X&ʼn  i^ڎf9$W HQ- m&˔oѩ}J- Z@pʠ Z@iiRd]u 1^PD ޲$'YT/U[qkKDcWuRRskF7<ut^?[1Tڳ s~eK5W 'Ǿ]hFW33eeEnXq,(z ׅS|/Q#W\Q5nmWdvp,M@vehiOAɠZШSt~hD*WyQ }E\:4Fs|qe;XjL+P[ [KMb,޽":mPKy.F*angular-1.3.9/i18n/angular-locale_en-pg.jsVmoHίYm1-P(:qbl׋ ^%{mNS~6۵IzYŎr0䰥9D s fd(0bfwI LԞ`܃_a4);Ρea>YqL#ubT-մLÈӝAY`}`b7L"fçP_HpYdG} Qe ރ_0Jh/'PM D1ھaIb{&V[Ǵ9ne[ ǵggL*Q3W|0jjy_#f4 ;--; 6ZaJ,0Ax}m&|2Z\ yUc"n hVgS-`'&xkՖwKudX H\- Z@FtRFA*,j9)ZjM HvաsRP<^6@SF2yLhDz+7Md@iڦQR9ߥ >>?WuJ#reVfX3rXڿYx~r~ֶL];W6^垵/\vоBW3߷eJ7H[/.N:&ۂ͉)ގGtT K%{"}4,͏'=vPq(~iԩ[:A?hD>jij(YY,8xP1rMk kMx޽2P;`:0~PPHJE(u!}w{\$= ˕>Ŏr0䰥9D s fd't!YQ$a ۓN =a4);Ρea>YqqL#ubT-մLÈӝAY`}`b7L"fP_@pXG,}4ǣ>R]2Mo@'zG%4ݗ(qzG 7,I,pb5=5qm/מ1HF^RfAmTw5aMS 8Yenm4oҀ@NтG-'%*vE+jN;xknr%V]x&"/֣YA<ӿMeZV[ޅi֑c- Z@rjfJP j O H6- eZ@U"IA>xAԤ8e[eL Vn$$ρM#D+|sKyQ}zЕwBeTͰg ?YZ[27n0V!ϭgrϮsRh_[y+K~W_}/#:j@I W =>hGT;hq_KuNjȇX/Umo}^@E />#'/j ;Wi-r=~{i{ܐ"PC܋gr%U}e1 t=^~6LPK3}PKy.F*angular-1.3.9/i18n/angular-locale_en-pk.jsVmoF_1B3>Ou%Q0kmb‚ܝY`oI[UE2y}S G^Ą415 Mw$>?x (ep아]>.qp,י=Bd^*g{\bE!!,WʍӼÞt%$M&+`dždED '4@j8-g`FaLپ8F0NNO+ !͊njc9T%=L` LFCq1>Tb'՘g9 12Di2xnd?TBc9wo!K 7#5.qkz\9=cVcuF0̶m!wViW;4`gkQ#b;k] aV5+ĻM]dq\ t za$<4j֏!EmؕZLTJnxDNl;W}/^޹^n-Ӻ wi-m=k#ctB ,|r Ac'uαXZ`B8١iXNڶfi dt4Y'BGҼ1>CmAEZjw}O-.&sڎjs4Fłxw @l^9\)c!&rPVx oBq<^9v7cz{zz'|PKӁ+^PKy.F*angular-1.3.9/i18n/angular-locale_en-pn.jsVmoH_1BlnVt9I"_EH%M]΂ NN"ye)6Ew!l+b‡IޤSge<-@`"J;%᰺ug7o}r5ou&`|hGT;q~:uK'迵EFjv6>*Q l7łx? 5_q+ϴK9p68Dj(!s9>7Y/~PKžGPKy.F*angular-1.3.9/i18n/angular-locale_en-pr.jsVo8_aEv`'PuhX[5BzU DJ: ڻi@~co2e$DʚQэmM=~N$yV@ * nkE 2F7|yKrN;l@oL$M WQ;Ȟ>qhSٖ 0ldò c6W‘I *  }vl)`ОNE =2a&ے:?l|Ml&.{ NAXʑ6* ->9[#9KfnrM|( EG:'k#2ʶ9yK]|'*ɱ{Gi$g=ZFu&3 kP ȝJ 3z=wby_".js7˾di oMDXsZPBjY-rIE {uĥb5v"V[`ƮeT <fF`ŏ8?f,$?1/Z[˙翤DFFFFFu&i|@N4hggfPfU:QtA3#`9xp!6;eE hʘC+oF8)ǴViS Q _j0.jxn߭=?MB3rajXxᲦ5z3/KW%=.񕋋|'ov;h[;޴z!|"9 ^cu"wU⊨~l3ci B*Kң m 8JZ"{=5VG{E/JVD19.Fcz2+Va)j2a68ac1]s5>֫/qx<PK_KPKy.F*angular-1.3.9/i18n/angular-locale_en-pw.jsVo8_aEv`'PuhX[5BzU DJ: ڻi@~co2e$DʚQэmM=~N$yV@ * nkE 2F7|yKrN;l@oL$M WQ;Ȟ>qhSٖ 0ldò c6W‘I *  }vl)`ОNE =2a&ے:?l|Ml&.{ NAXʑ6* ->9[#9KfnrM|( EG:'k#2ʶ9yK]|'*ɱ{Gi$g=ZFu&3 kP ȝJ 3z=wby_".js7˾di oMDXsZPBjY-rIE {uĥb5v"V[`ƮeT <fF`ŏ8?f,$?1/Z[˙翤DFFFFFu&i|@N4hggfPfU:QtA3#`9xp!6;eE hʘC+oF8)ǴViS Q _j0.jxn߭=?MB3rajXxᲦ5z3/KW%=.񕋋|'ov;h[;޴z!|"9 ^cu"wU⊨~l3ci B*Kң m 8JZ"{=5VG{E/JVD1av4s!Xj K9W 5'oސAt!TɏDuȟd!?BC1"7"!xDh=~AcHk]b<<ߝKkT ]J3}ZC ̪nnڔɲ=3(I4ᴤB<sCV͌=&Rޙr'{FtHuuc72ȭr]}Β':O<-Lp+4  `d-:4X4849FڌʌU2/ip,.vZ^iM}U':b?PKհxPKy.F*angular-1.3.9/i18n/angular-locale_en-sb.jsVo8_aEv`'PuhX[5BzU DJ: ڻi@~co2e$DʚQэmM=~N$yV@ * nkE 2F7|yKrN;l@oL$M WQ;Ȟ>qhSٖ 0ldò c6W‘I *  }vl)`ОNE =2a&ے:?l|Ml&.{ NAXʑ6* ->9[#9KfnrM|( EG:'k#2ʶ9yK]|'*ɱ{Gi$g=ZFu&3 kP ȝJ 3z=wby_".js7˾di oMDXsZPBjY-rIE {uĥb5v"V[`ƮeT <fF`ŏ8?f,$?1/Z[˙翤DFFFFFu&i|@N4hggfPfU:QtA3#`9xp!6;eE hʘC+oF8)ǴViS Q _j0.jxn߭=?MB3rajXxᲦ5z3/KW%=.񕋋|'ov;h[;޴z!|"9 ^cu"wU⊨~l3ci B*Kң m 8JZ"{=5VG{E/JVD1I˗ERhcCW`eܪ3,\M&'Lp,fpyC򠋑xf^1~']|Cz0<4{PKt[SPKy.F*angular-1.3.9/i18n/angular-locale_en-sc.jsV]oF}WbZ`aOlŀlF`,$mURN-3F\D=nQ1$Șަk3K 8ndKg6W‘H *ҏ}]v(`^ްC~!2a6ߑzd8n[|l%> AX** ->8 )*~qM|* E'a=tHwBeۜH]IC)=#R`z#G4X%\lṓF%Lܥ/0SߗU>T¬>ؠ6wӦH5 نANLD 'b i.U%jfI4Δ;ً(6[oFq-Dne9Kp;,yiqf_!DFFFFFM&˔oi|@4hggfPfլ:q|Is#`9xp!.ѓo+e6Lv#QSZhA5rv6^^&tYKU=,pFpY;W{o<]=+W%wL]\徳T?{F]N+A cmj>()~ Lי3S܎'tP +5RN, Uutf'3T۞:(9Tq_Kkuj9ПSc˿WDEl]:ZX Oq`q-\ƕ\݄ꄉZI/:(O{쳢^ PKݡΚPKy.F*angular-1.3.9/i18n/angular-locale_en-sd.jsVmoHίYm1-Ph UL^cd;^m,k:I9l&;Ug)3EF!yaO@4:]]qƛO(@(:Rf*VA8,ot[玻3\gOSt )Q[%>n=nO+ža'Rn-64u83aF Ȋ"#''4vGj8g` z|0lo~=[V#su!;3J,S0U)0}1`3(*loIf7]\>hK᠋T!L{v x[ v BC  X|iѿ3F%ɨK[?L>]B0̪n!')f [ 4D¿sE V͜>&br';Z\ yUcW"r._:O"-NLWH-q4ȱ`- Z@Zjl2Y|NTjYrS $O H2- [ͪC3S<^6@5)#NFP&4D"lGI22 ǴFeS _i()kxmS?:tPYKU=,z9e,noxzbVLU5*~:7Kv.WAxOguұ50!OsN'x;A-LR5ndw,M` PQGwiv4>ACVn[U.^V% $Qf0v$ CmW`m4B&\nN4CxKLndO>+ouyßPKpPKy.F*angular-1.3.9/i18n/angular-locale_en-sg.jsVmoH_1Bi[۵~|ncMhc/6,haIS͂SU$[3, mQrEFDd-"jlsHD.8IyRk 0a:kڝ\O'qp AyB!a2#g |BLؓ-W[ʍÆgt$L&+`{hcCP"w'0vGj8g`zaD&Bz0Ff&B)rP% LP[* >]cS(*loqf7]T>`&p@UHAޔB]17yj|Dg~0qc/l~QI2j&–- UilwauS 8Yen'M4k5;MN KQz1 ko"6᫭.w0Ң]oRȃQ-DlDkGӜxU4yRF[޹/i֑c- Z@rjdLP j O H6- eZ@U"HN^]XAQ6Xu(b[j 8eCN2iб+e6y #JZa ^,c~mm/Z[2鉊vfM/l|{B}qB ]L|r|wTOcAk`L8Y{j`a dt%CiaO:&UJe?kcN_-}[U.^WG%\K(eգf$ⳏ+CW`m3Bn%\k-M4ܿCxTd>(˯ոÿ_PK:mPKy.F*angular-1.3.9/i18n/angular-locale_en-sh.jsVmoH_1BlnVt9NH%m}7 .N"byfa芌Bpw""|';Q`dK"jW)Op'@m&TXpX޹̷>8.:0QPHKE,u}{{ڠUzK˕>r4䰧݆12 fd;t!YQ(ava'530Q{ qL0l`~O;N#Džc1uTeS5T 0BFwCa2M.B1aHu4i׃aԃJ@ӛ@ce?-x~jy6LYFBE6=k-CpB ]|rW|}To u̱%0&_l[jǎ\Ȍ,:(ʘ^ndlog/Y"-Byr[cmrhT'V~wŐXߘHṘ;RJ?+|cg|!Ey׎|qɖWl%4l* ##'? 4D(RH/uK %'Cƌo¯Kֱǽ@ TUQ È ]rA}ppi%tȧPxج>}.Clk?IM~(ZbH ސ KXoi+lcp:Ӆ$C3vL=^/]\>T¬>ؠYmM9,kܳ ?MN>+Qbn)TԪ'D\*;Sx/؈n[nVƵcYn>,y™Xiř |4^ft6,SEFFF8gh@@@@VPel:D|M^)d deZM-D#| sKE^RF7KȥZa3rT˚߹:xry|zWJf:ޕ3qqRiz-ht9ǛׯuToO-0_Lq;~-@ζKQ2=J2T}}Pm{P-}iZ:C?dOOU.^mQw4Г1Xj*P 5)< ߓ"a(^uPgE_p=^}3#PKZs/PKy.F*angular-1.3.9/i18n/angular-locale_en-ss.jsV]oF}WbZ`aOlŀlF`,$mURN-3F\D=nQ1$Șަk3K 8ndKg6W‘H *ҏ}]v(`^ްC~!2a6ߑzd8n[|l%> AX** ->8 )*~qM|* E'a=tHwBeۜH]IC)=#R`z#G4X%\lṓF%Lܥ/0SߗU>T¬>ؠ6wӦH5 نANLD 'b i.U%jfI4Δ;ً(6[oFq-Dne9Kp;,yiqf_!DFFFFFM&˔oi|@4hggfPfլ:q|Is#`9xp!.ѓo+e6Lv#QSZhA5rv6^^&tYKU=,pFpY;W{o<]=+W%wL]\徳T?{F]N+A cmj>()~ Lי3S܎'tP +5RN, Uutf'3T۞:(9Tq_Kkuj9ПSc˿WDE,+},8c Z@J.nr{kuDr Xj{=}YW\W cy|_PKPKy.F*angular-1.3.9/i18n/angular-locale_en-sx.jsVmoH_1Bٮ'[щsp^ۋYl$X%I}7 .8靪C.ˏ'=vPq(>6-_b4"TcWyaCIer4v$ Cm7`c4R&\noN4cxhKLndO>+79u'BB.O[&è /*Jh\U@GFN~&ghUQ^ك~t!TOoJ<"_z{.0us5,If.\%~zXpBfY7d6@ap R4"j8VHw> .\S.U3eTNDz+Rlصkr#h}Y3a0K i_ν5&28665h55l2Y|N*pʠр@#?#<#6#2#fա 3Yw|M^)ddeZM-D#| sME^\F7KȥZa3rP˚ݺ;ɭ9_*Fǻp&W.rY(MO㟽B.Axn6~O:J}*⊪A l%ci /CGݥնJU/:MK'?_+ۼouX"nR:ZX Op`q-\F\݄ꄉZI+Ə{䳢^F pPKPKy.F*angular-1.3.9/i18n/angular-locale_en-tc.jsVo8_aEv`'PuhX[5BzU DJ: ڻi@~co2e$DʚQэmM=~N$yV@ * nkE 2F7|yKrN;l@oL$M WQ;Ȟ>qhSٖ 0ldò c6W‘I *  }vl)`ОNE =2a&ے:?l|Ml&.{ NAXʑ6* ->9[#9KfnrM|( EG:'k#2ʶ9yK]|'*ɱ{Gi$g=ZFu&3 kP ȝJ 3z=wby_".js7˾di oMDXsZPBjY-rIE {uĥb5v"V[`ƮeT <fF`ŏ8?f,$?1/Z[˙翤DFFFFFu&i|@N4hggfPfU:QtA3#`9xp!6;eE hʘC+oF8)ǴViS Q _j0.jxn߭=?MB3rajXxᲦ5z3/KW%=.񕋋|'ov;h[;޴z!|"9 ^cu"wU⊨~l3ci B*Kң m 8JZ"{=5VG{E/JVD1V?Ɔ ʸUgXʹLm NX>yA#\ͮb8O>*axh0PKɘPKy.F*angular-1.3.9/i18n/angular-locale_en-tk.jsVo8_aE7`p'PuhX[5Bz*.q8=NޝE}ߏiʔ4*kodDE7N2b77ɊFjYg;Z,L7r*((z 闉S܍GW +\v, >.I'=vP0\KV4-_ף+ڼyTµ"Nwh")h4+C2nr&Fk&j83O޾%yH 97 xDh=nN#Ez{.0Fu&3 kP ȝJ 3}Z} ̲jnR}Қ[JQ7洠BjY-rIE {uĥb5v"V[`ƮeT <fF`ŏ8?f,$?1/Z[˙翤DFFFFFu&i|@N4hggfPfU:QtA3#`9xp!6ѓo e֡v#AҔcZ/~5pNȊ&tY U5,pFpY[O{o<,JpMpJ'ov;h[;޴z# |":*^cu"U⊩~l3ci B*Kң m8JZ"{=5VG{E-JVD1ɰZH q`o[Մ愉ڎ7oHt+Ək䫢Y>pPK_PKy.F*angular-1.3.9/i18n/angular-locale_en-tt.jsVo8_aEv`'PuhX[5BzU DJ: ڻi@~co2e$DʚQэmM=~N$yV@ * nkE 2F7|yKrN;l@oL$M WQ;Ȟ>qhSٖ 0ldò c6W‘I *  }vl)`ОNE =2a&ے:?l|Ml&.{ NAXʑ6* ->9[#9KfnrM|( EG:'k#2ʶ9yK]|'*ɱ{Gi$g=ZFu&3 kP ȝJ 3z=wby_".js7˾di oMDXsZPBjY-rIE {uĥb5v"V[`ƮeT <fF`ŏ8?f,$?1/Z[˙翤DFFFFFu&i|@N4hggfPfU:QtA3#`9xp!6;eE hʘC+oF8)ǴViS Q _j0.jxn߭=?MB3rajXxᲦ5z3/KW%=.񕋋|'ov;h[;޴z!|"9 ^cu"wU⊨~l3ci B*Kң m 8JZ"{=5VG{E/JVD1ʗERhcCW`eܪ3,\M&'Lp,fpyC򠋑xf^1~']|Cz0<4{PK+͘PKy.F*angular-1.3.9/i18n/angular-locale_en-tv.jsVo8_aEv`'PuhX[5BzU DJ: ڻi@~co2e$DʚQэmM=~N$yV@ * nkE 2F7|yKrN;l@oL$M WQ;Ȟ>qhSٖ 0ldò c6W‘I *  }vl)`ОNE =2a&ے:?l|Ml&.{ NAXʑ6* ->9[#9KfnrM|( EG:'k#2ʶ9yK]|'*ɱ{Gi$g=ZFu&3 kP ȝJ 3z=wby_".js7˾di oMDXsZPBjY-rIE {uĥb5v"V[`ƮeT <fF`ŏ8?f,$?1/Z[˙翤DFFFFFu&i|@N4hggfPfU:QtA3#`9xp!6;eE hʘC+oF8)ǴViS Q _j0.jxn߭=?MB3rajXxᲦ5z3/KW%=.񕋋|'ov;h[;޴z!|"9 ^cu"wU⊨~l3ci B*Kң m 8JZ"{=5VG{E/JVD1ERhcCW`eܪ3,\M&'Lp,fpyC򠋑xf^1~']|Cz0<4{PKPIPKy.F*angular-1.3.9/i18n/angular-locale_en-tz.jsV]oF}Wl}E%f(d;6&0K=&36cUUKA~31"ZgSKҵmM1:=w;Ze&~T vŐ8! #B48w>=Z8us5,If.\%~zXpBfY7js7mʁdY lhMEp)NX!R,sMV͔=&Rښr;Ft\K5غkFfl3a0K |4/^ft6,SEFFF8eh@@@@VPFrCOʊS& [G2QڍlI22BiʦQR9ۦ"/\|~.ХGBg-UŒpY[W{o<KW% |=օ3rqBiz:Wo~hGq8ެ~%zv?IGI[`BO]v`  433h3(3تW(}ǛVu]TIGI[`LN]vCCSNO-!{=jt6_pbsz}$Ƹ08c V@Rlp{ktDb $jz9}YW\W cy|_PKG:PKy.F*angular-1.3.9/i18n/angular-locale_en-um.jsVo8_aEv`'PuhX[5BzU DJ: ڻi@~co2e$DʚQэmM=~N$yV@ * nkE 2F7|yKrN;l@oL$M WQ;Ȟ>qhSٖ 0ldò c6W‘I *  }vl)`ОNE =2a&ے:?l|Ml&.{ NAXʑ6* ->9[#9KfnrM|( EG:'k#2ʶ9yK]|'*ɱ{Gi$g=ZFu&3 kP ȝJ 3z=wby_".js7˾di oMDXsZPBjY-rIE {uĥb5v"V[`ƮeT <fF`ŏ8?f,$?1/Z[˙翤DFFFFFu&i|@N4hggfPfU:QtA3#`9xp!6;eE hʘC+oF8)ǴViS Q _j0.jxn߭=?MB3rajXxᲦ5z3/KW%=.񕋋|'ov;h[;޴z!|"9 ^cu"wU⊨~l3ci B*Kң m 8JZ"{=5VG{E/JVD11W%[H cl[5~Ʉ 7oHt1+ƏS䣢oYpPKg_ⴘPKy.F*angular-1.3.9/i18n/angular-locale_en-us.jsVo8_aEv`'PuhX[5BzU DJ: ڻi@~co2e$DʚQэmM=~N$yV@ * nkE 2F7|yKrN;l@oL$M WQ;Ȟ>qhSٖ 0ldò c6W‘I *  }vl)`ОNE =2a&ے:?l|Ml&.{ NAXʑ6* ->9[#9KfnrM|( EG:'k#2ʶ9yK]|'*ɱ{Gi$g=ZFu&3 kP ȝJ 3z=wby_".js7˾di oMDXsZPBjY-rIE {uĥb5v"V[`ƮeT <fF`ŏ8?f,$?1/Z[˙翤DFFFFFu&i|@N4hggfPfU:QtA3#`9xp!6;eE hʘC+oF8)ǴViS Q _j0.jxn߭=?MB3rajXxᲦ5z3/KW%=.񕋋|'ov;h[;޴z!|"9 ^cu"wU⊨~l3ci B*Kң m 8JZ"{=5VG{E/JVD1ޑih")h4+C2nr&Fk&j83O޼!yHqhSٖ 0ldò c6W‘I *  }vl)`ОNE =2a&ے:?l|Ml&.{ NAXʑ6* ->9[#9KfnrM|( EG:'k#2ʶ9yK]|'*ɱ{Gi$g=ZFu&3 kP ȝJ 3z=wby_".js7˾di oMDXsZPBjY-rIE {uĥb5v"V[`ƮeT <fF`ŏ8?f,$?1/Z[˙翤DFFFFFu&i|@N4hggfPfU:QtA3#`9xp!6;eE hʘC+oF8)ǴViS Q _j0.jxn߭=?MB3rajXxᲦ5z3/KW%=.񕋋|'ov;h[;޴z!|"9 ^cu"wU⊨~l3ci B*Kң m 8JZ"{=5VG{E/JVD1W?Ɔ ʸUgXʹLm NX>yA#\ͮb8O>*axh0PKbPKy.F*angular-1.3.9/i18n/angular-locale_en-vg.jsVmoH_1BlnVt9NH%m}7 .N"byfa芌Bpw""|';Q`dK"j'E@ 6f*NA8o|[wpr (OYY($LF"º>=[mP *=J@qvTrnØDd 32(0d; ۓNs&hQ0@Sd}H1:C2UiS!;Lw EM0B1aHu4i׃aԃJ@ӛ@qhSٖ 0ldò c6W‘I *  }vl)`ОNE =2a&ے:?l|Ml&.{ NAXʑ6* ->9[#9KfnrM|( EG:'k#2ʶ9yK]|'*ɱ{Gi$g=ZFu&3 kP ȝJ 3z=wby_".js7˾di oMDXsZPBjY-rIE {uĥb5v"V[`ƮeT <fF`ŏ8?f,$?1/Z[˙翤DFFFFFu&i|@N4hggfPfU:QtA3#`9xp!6;eE hʘC+oF8)ǴViS Q _j0.jxn߭=?MB3rajXxᲦ5z3/KW%=.񕋋|'ov;h[;޴z!|"9 ^cu"wU⊨~l3ci B*Kң m 8JZ"{=5VG{E/JVD1˷ERhcCW`eܪ3,\M&'Lp,fpyC򠋑xf^1~']|Cz0<4{PK0ܘPKy.F*angular-1.3.9/i18n/angular-locale_en-vu.jsV]oF}WbBOlŀIDQ41Xhq6K=c3;6ɶj)s'sݔ)#i&u6(ʈnldloo5&_gۋ$7 $_gamȡSAKot8癷"DԁpſWY{ƻ; Ĕ(Oc::9ٲ쒭ØFUpdgDCBtCa_g6[J#X&'6oH `1vF-mǽ@Uja€郐 ]tA}ppi!ݴɧP/x|<^tTZ/k !<"_7Ez.1Fu'3 kP ȝJ3}ZC ̪jnR}Қ=3IQ7洠BjU-rIE {uĥb3"V[`ndT <[fF`O8f,$?3/Z[翦DFFFFFu&oi|@4hggfPfU:QtI3#`9xp!6ѓo+e6v#AҔSZ/~5rNwȊ7_^&tY U5,pFpYӥ7/=ϙW-tKg|*_8sj7[5|7^ )kv?铎~>3xB{@_9ElT*꣊d|jS*kJ3ZSzX/m><,Fx'//kIA1n,XаsZ0Q}=Ƀ.^iO}Vtaxl PK`bPKy.F*angular-1.3.9/i18n/angular-locale_en-ws.jsV]oF}WbZ`aOlŀlF`,$mURN-3F\D=nQ1$Șަk3K 8ndKg6W‘H *ҏ}]v(`^ްC~!2a6ߑzd8n[|l%> AX** ->8 )*~qM|* E'a=tHwBeۜH]IC)=#R`z#G4X%\lṓF%Lܥ/0SߗU>T¬>ؠ6wӦH5 نANLD 'b i.U%jfI4Δ;ً(6[oFq-Dne9Kp;,yiqf_!DFFFFFM&˔oi|@4hggfPfլ:q|Is#`9xp!.ѓo+e6Lv#QSZhA5rv6^^&tYKU=,pFpY;W{o<]=+W%ҙ^}g4}wKv5WA7'}QRЯ3AgO5WT k gۥ(JS%X}>>Ng=uPr>4-r0?*ila6({Yhc)h< š7kpWrv[&j=[xH޿'ERP?ϊ>"z{f[G,~PKAPKy.F*angular-1.3.9/i18n/angular-locale_en-za.jsVkoFίin?IcdFtE%{ƏlB=cMVU->s3,ᔤ2Xqm2ُMrxBnt{F~&i :thLΝ>N'qWtA,e OgnA+Euw?ݞW"&^we'qiǭ*9myzA"~6"R bÿ9;J#yIA&vg!tG=h8n[|Lѥx>%R'LRHP[HdfHoflvӥE_pX'}l]2MAߓ4wPk(]_?ga3VG~@Z]q퉷4FL셭į0S[/lx}(YM`d+s;n^Ɠ=߈3ei4Aip ib;s^ jfI6N; Ԣ]o&S]5vl%.>f/g `g&ir\-:28hl2Y|N*pΠր@-?-<-6-2-f~,C x:(#Ŷx&"\v(% SViKDE o],SmBec*ɤ[!92w/xz|z\l֭]Zk7Z([_\nQgT,w^-R>v?Wӎ}I>3 yB@kX.dAoT*|L lO48kujX/m>ො`Zε3)n,j kKW-q)j?a>aVd#~Bmb>-a|l$PKaz-PKy.F*angular-1.3.9/i18n/angular-locale_en-zm.jsV]oH}W(l XbD1 4mM` 1{&,}L&]j)s'sݔ)#i&U6(Ȉnelo&gى$ $_eamȾSA7~<3oIzf"l@H*Es=Mbʟx'2a lXvVaLB82r4!P!ݐُY`7͖I [#Fo-CơQeb6IvN u *UT5հTa@lAH^>84vnSQ(}

    f>v?铎:1xD{@/_9ElX*꣊h|jc*ί[N o-}5VG{Ew-KVD1y GkIA1n,_Yаs^[0Q}Ƀ.^{qO|Vt?78`A7PKBylPKy.F*angular-1.3.9/i18n/angular-locale_en-zw.jsVkoHίv?KL(dh7&0Ki36ɶc_7ӘSH4 &6id7iMCln Ѧ/g;eZ^*V ZodLɖK0liÓ CĦP d5WHkun4'dB{N~ `pIԁ_ơQmvN"u *UT5հTGf/)+\Pll/z7mE :'k#P٥i ]^~ɅJl@7 <"t9nƂ3? ʑָ+z{.AN24#{n+ hso aU`linGuMy\3kqT֍&ү9-&Z)l^Vf"eR̈́?:b3rG;Z\`]A%(ݤq Kx30[%Q Fى |Z\5:28h3|N*pʠր@-?-<-6-2-z^,8kqQ9(#Ħx OC\h;A;f5 zKBa^+x$~_בsK`eP5ՠp9eLo?-3,JyVFW6 knrfm|亖3 ˣV~,9 Cu"/#ګz%M (f.sV;T E>.'hi{ gP-}ԩ[:Ai~ ykEga.H% x3ʥZ{քڌӻwy]s>֫υqn<_PK}PKy.F'angular-1.3.9/i18n/angular-locale_en.jsVo6_aEn&FõUCPHW[U@AN^q 6M;~Ӗ#Y.U(Ș^elon%_v"-BWyr[coT?}/ސXߙH)WQ{ȟ>u3xP<+W> 0jdKg6W‘I *ҋ}BkwF\ Nlh/C~!}2a&ߒsuh56yq':Ub@jB($D0lt\P\o{If7],>(6hKA@*=Qv'wOPkw_ I<"޾^Ac=?ֺ6׮8|w,aI24cw*+ܵC ̲n;ݴ)e {'Pi4QiA iz^ 咊Z5S$KjkDѭr#֍ȸx,72ˍvv9Kp8x`  433h3(3jV89/> z{\ZPKX2PKy.F+angular-1.3.9/i18n/angular-locale_eo-001.jsVkoF_qRmEu`[tnhb, WvI[UE9}s,O]O{L싐(;rmO;KҸ <"B p,ͭ3\~<1rĂȐ?e}{?=[nDL|wa9?T;N{8y~wAbFo#OE*@ }Lc>! a<{z]bq')P0*T4a~ .C? Y8aty(֯x`xX{?cs> C@~}>|SeC9Oo>ꈩJxg<.kۺZ9hJdM#ѥ<$D[3^F#v O?\e(䩆 뚱ݞ]]=1Q0zHeC>H i^X#B{_djƌ'9.Oy!D\x|W37R>,)ݔ4D3U*m8JTe P*[ 5lԯ\ P`" /Yy, uql_E(Zt2$1^PD2IM*DU+cUvJ]/$8Tr^緎c-֦g2٥5E$Yݮ%LiZ\r[^27W\>zUW)۝ aM%ׂ+uZ;lZ47Oèlg +} *){vF$?˨wY?;Gxh*RK"eᜑrY6M kZv.÷V-:޽mw ~3d:0v1=PwPKK PKy.F'angular-1.3.9/i18n/angular-locale_eo.jsVmoFίYaZ@д *J#R 8=km8^[~Q{glo&i?˳fs+g prV0$• @+r d pCkGiG%=..HMIH(;bCTQ@0#K³<`#r= `<;|]Q NQ*1*0U4`3~ .`}f0 efqlG} d07%=(p&࣎Zm߰`"=?jָmtmj3wcLJ26F+#(* mugLƣq**i0dI Su'O7\zmה=,jdBɜC Cf& $ٓra]>O)3>UDEȨ8qbZo+}|SțiT7DSVLrfP @u 4lԯ\P`\Kq| >x.B]Z(d!fZ$q_[eI܍ݴۉ~4FG[R%! Hafx1Up3a72M*nW\p BVA_B6 W(Cm A?uAYqlVOMe<w0#(afZsHϚ.}dT 6HRK~/%Qa-vfQ &q_[|ւ !˼sZ0A]9D;{1)KTiM?~#C0F{x!!gol^*졲 0x[BCଇW?=VM0Ӝ_<5jJ(g.k0~H A!bBnb+FNLG+ .EߏsO RwjD5'LszVS@ᣅKbEZ2) ֖D(N{$1:G?8j#B̨TIBlgn 'be2 69#Uxݩ%qML/8&Cm. A?uEZy7qlVOd<-v0'`fZo*4]xɨ*l$ ~rKZ胪 L@C2E-d4vr2-ud,RQ=#C0F{x!!goj^*졪 0x[ACଇW?=VM0Ӝ_(CQ.kP~H T!ʱъki@9ܓĮꜢP,) s͉g2՜c1 ~h䒥iLcǝʒ(ԿFI7h.ۏ 5~JBfTBbgvw #be2 29Uxݪ%q]L{Q؎ \C-F4:9n,5ެ@ّʌ9(wy\ `FTQ̴U"?kQU*ۼ)I%. {֗D ѩ* Lq_[|ւ !˼sZ0A]9DxwbRl`^=#C0F{x!!gol^*졲 0x[BCଇW?=VM0Ӝ_j(EՔVQ.k`:(/KzFRsZL5X,oeB8 t?>Y)f!Z$qkmMNߋa4EG ;P%!s8Haw&P<2}7Ȉؘ:LNHvkn֚p BOZC_M/Q؋Ǹ<B-~vn8nu,5+#Pvꧦ2cb ]ׂUT03[o*4]xͨmI% ڗD ZU!@ҋ'<(}/@CysZ0vr2)tpv֤,Q(~k|3ڣc 9{[UsR`UUCmq_=zXyBs~A '4P) ]x̥Xhtfi3 ɲN# Ke`2Mn(UU/jQ}6藆8d):1{1 qȌT$9Z SfǶc֙G _7wzah]|uk9h_K=?djLK{EfRFZ''HJфp [Sљ)Zh%܀]㸹SoPK~HPKy.F*angular-1.3.9/i18n/angular-locale_es-co.jsU]o0}WXV%:Re>0~H A!bBnb+FNLG+ E{}\uAQQ*ND5siNʔp~|Pr2C̴HK&ű>ڒ(4iWQRם۳$\#twr(AwAhཅ@OjV -&̙rǵDVJ%'M>^2* w@2+¨\;A3*HzŸ/x`}H(pAKFsn_N[:v{x!G[= <𐳷Y5jxa/ PU[<V8!C`O4pBpOe: ټsU9͘M4 OW豝@٬UVћQr_{S|_نwm/ i4{Qx:f#"݄0† _hX<t$T ;pCb9uHz&̖myƪ3t>> ꙡ}v!֭b렩-}t[:`Ԓ_M_ڳmNvGe(Zц\+{ĘDE9](@b3t,9:!EKu؄ۯ~7w]g][ PKӹKPKy.F*angular-1.3.9/i18n/angular-locale_es-cr.jsU]o0}WXV%:R2PM?PXʱъki@9ܓĮꜢP,) s͉g2՜c1 ~h䒥iLc}Ao%Qhp;:n'Ao!J~/ ߙ ܇@FdAdr']q=K5=N[!|0^q !p'[?F4:9n,5٬@ٱʌ9(wy\ `FTQ̴U"?kQU*ۼ#I%. ڗD GU"@ҫ'<*}+oY V܇d.[ihvdR!ًIYJ Q|hk\>Qే@VG{`*Cm q_=zX7Ls~A oડUSZE!\;K1wGe4e:3v1B評ePKy.F*angular-1.3.9/i18n/angular-locale_es-cu.jsU]o0}WXV%:Re>0~H A!bBnb+FNLG+ .EߏsƮ낢T,-s͉j2Ӝc1)7>heiLc}B%Qhp;^7 x P%!30U;P>2}ȉX:MNH^wjgsIG|!/wr(AwAhཅ@OjV -v&(;S331.kẢ*+VJ%'M>^2* w@2+¨\;A3*HzŸ/x->i*eQz-͡ݮLK]!읽[2:C壭{dx۬k5簗 {̭<V8!C`O{4CpOe: ټsqTN3sSo-y. D\MaѽΛVAQv< OW+fî]B̺6(ćCoA7ǡiz]a00_h؆t$I9!43wr _{plٖWa:HAK4+衞g.ӹiHOmR2sUXfIm"^pc-(H.Bєp-mcљ)Zj%&܈usuֵNm=PK 4PKy.F*angular-1.3.9/i18n/angular-locale_es-do.jsU]o0}WXV%:Re>0~H A!bBnb+FNLG+ .E_{\uAQQ*ND5siNʔp~|Pr2C̴HK&ű>ڒ(4iWQ2}ȉXu=#Uxݩ%qML/8&Cm A?uEZy7qlV ߚɜ9(w)ETrt%H&qEPk_b'hFTI/`'-Xr,Jo%9ۥi+tKU^Gqrh|5ڣc 9{Uss+k+=z|X!C`^3))@gBx6oc.~ӌlvr|t&,ayxOʖհo%l+o z]q~qqhlA&6 w8 pуnqߟ4d|^L_A=2'.IBalٖa:HAK4+衞g.֞&ӹkiSKvp6[ҞmsvTXf L_#/V1 $th 6Dб@B-Wdn:SoPK}PKy.F*angular-1.3.9/i18n/angular-locale_es-ea.jsU]o0}WXV%ZRe>0~H T!71ԕc#'}'mE"{}}cuNQ^(ND53jNXʄp~ ?|TrRC̵H &š[mEގ׍A4AW R%aTLx1epsa?6# 2c'Sss6WkzηBo`v9n0~H A!bBnb+FNLG+ .EߏsO RwjD5'LszVS@ᣅKbEZ2) ֖D(N{$1:G?8j#B̨TIBlgn 'be2 69#Uxݩ%qML/8&Cm. A?uEZy7qlVOd<-v0'`fZo*4]xɨ*l$ ~rKZ胪 L@C2E-d4vr2-ud,RQ=#C0F{x!!goj^*졪 0x[ACଇW?=VM0Ӝ_(CQ.k\'bisJhTrBNvfOX2>-dQY=27g 6&^ %F`Aoޠ7Q]Hd ^y[7oddY*^0pcvmugdB~_KPNM`[N`ov!]`#ZheWiV$WXkIa-]8:-UhIe+8۪}vXMi]WƿU>_I E8b t,%:7!Is%El‘؁龎N: nPK] PKy.F*angular-1.3.9/i18n/angular-locale_es-gq.jsU]o0}WXV%Zv@}`4J T!71+fNB}'m7M9$v(rŢޮf*c,[NqJXE!IqlR[Fs;vBzL%z$T)tNg;_g;)^kG]k6W [/5޼7 N8-Іkxo &nX4РَfS ) %4;ُ~U.TЕWR]6`wS!X rDf2g4d%B+SɉYJ ||l`.;P`@ͲF{;ః*Rl 0Zic: uxYaQp~Er jcZG>\;K܏R"9FJVfK}۲.-dQY=J,ak{/ܖnx0y; oНS_/:ݕ׽a'{#jX:NF:aws9fIl'l #SHTI-gϞ; ڧ 4OB.>\M}oOHO#-|v%ό9{}[Xi%/]~=De>_* NB8b t,%0!EB؄C ~G^{[۞kPKCi?PKy.F*angular-1.3.9/i18n/angular-locale_es-gt.jsU]o0}WXV%ZRe>0~H TBnbRWV] m7M9]EEXR;5"2͉j2՜bȄp>`䂥iLCڂ(4Gݛih ~JBtoM|6Ep 3 a?4U*ܚp>0^ p!xp7YiԭiMp|Y~49(wu\ Z`NTY,EDrtҨu$"(+_b'hFTI/`/I& d4vdR !`,PFW(~k|1ڣc 9{UsJ`UUCmq_=zX7Ls~NJ ;4P)K܏r2~I,c;EvYXrMi(Unl[672keq-ޞqd:fNyлC;e4pnQ?Uև=p{1~v9uH '̆my ƪS4oY@>;&yuvWl4}oOH{Fl]ۭRc-9׊1foo<@r^N&+n>  tvN-DHR+6뀯]YVG~PKm PKy.F*angular-1.3.9/i18n/angular-locale_es-hn.jsU]o0}WXV%:Re>0~HPXpȉhߵЮӴHqUS%EU!b9QLS,]Nq =LOJXjI8u'ZYQN;8Gct^Q U2J|og_>{ck)TMzWkz B zwa0Ga;&hCv8 |R 偳de~j*3&q-h~QE 3ӊ~S>+FUPn.I*qIPŷ$*NЌ>^$srN F3hw('B{(&eɎ* 6G[壝{dx[/k5簗 {-=ޖ8!C`OG4WCpJSTMile\ ,)ә)x(,k9"6x_u6,fJڶ96µK~YȂa7fb߃EQ댧qhv]s¹6 w㛨?88lO { ͇  Gf׵"Q(;;N.0~H T!71ԕc#'}'mE"{}}cuNQ^(ND53jNXʄp~ ?|TrRC̵H &š[mEގ׍A4AW R%aTLx1epsa?6# 2c'Sss6WkzηBo`v9nfЅ׿{#ۯ_ddٖ =Jd9ffԯA#2%ϗ{pka:sHA#@q)X/ +{-g#}qtV#ɜu? -xŘVa1fsQW\+ĘD U>_) .8b t(9:+ BZˮ w[vqsu7QPKӿePKy.F*angular-1.3.9/i18n/angular-locale_es-ni.jsU]o0}WXV%:Re>0~H A!bBnb+FNLG+ .EߏsƮ낢T,-s͉j2Ӝc1)7>heiLc}B%Qhp;^7 x P%!30U;P>2}ȉX:MNH^wjgsIG|!/wr(AwAhཅ@OjV -v&(;S331.kẢ*+VJ%'M>^2* w@2+¨\;A3*HzŸ/x->i*eQz-͡ݮLK]!읽[2:C壭{dx۬k5簗 {̭<V8!C`O{4CpOe: ټsqTN3sSo-y. D\MaѽΛVAQv< OW+fî]B̺6(ćCoA7ǡi;r.M0g< =&IfsSh>d/f/E=2'.IBٲ-78u摂'[iVC=3.d c]*[ M鳧s7ۤe<;mEl"^pc5(H.Bєp/ucљ)Zj%&\usvֵNm=PKgPKy.F*angular-1.3.9/i18n/angular-locale_es-pa.jsU]o0}WXV%ZRe>P~H T!71ԕc#'ki@9^{0US%EU!b9QLc,f2!z͕\S-IqVYè}?zD&+$d)LW_>#K)VY_Aw:*+; u/ 7A~hࣅ@OhFV5ƛ̘rǵfD%VJ$M>^0JrwDRK^7%Qa-vI'Ÿ/x_`%}Hf2/pN F3n_N&.%[~#CЗF{x!!gol^*졲 0[z-!!pCેR+:jίHAJQ5U³y5s)fn22zaxgK̲f# mRe`2]n,UUߔ׶һl/ y42σ0ng4Bs_ Ȏzþck~;ϖȱcg6`+W7+@ȯkE0gl+0v{> AV@O son=[Mk鋧sOmRҞms;,,5Ft9xε"Cٻ{OԐ "!6E]\s RJ^u[qs֕IoPK;PKy.F*angular-1.3.9/i18n/angular-locale_es-pe.jsU]o0}WXV%:Re>0~H TUnb+FNLG+ E_{\uNQ^(ND53jNʄp~ |PrRC̴H &ű>ڒ(4Gۇ^7A4h#J~@ %3 ŋ/;xx _SkA_>Qే@ͪV{{[`UU g=z,!rNiSZG!<K1wGe4e:3v1D詝e%>H陡}v!Mbixh_K=?djlaa1'r׊1fooB@rQ<,MXW#܈:YVbl­_?^7w`g][S PK$PKy.F*angular-1.3.9/i18n/angular-locale_es-ph.jsU]o0}WXV%ZR2PM?PXI u8ъk{"rν>ı*(/$zFJq"I+NXݥ7 ~(ŚX*,ǖ;Ao5ht7 zw~/]_^0 Je #@*t^_y/S ="=xo5;gsMG|!/aWcm.GA(iↅv$4abz0!(aZ-CF)wgE.^3*Kr3 qK q%Qat!KHzudqJ.$4/pN;KBKhO: hC6 Y TVb%:H@A`J K%)(@1Ǵ|vOU1O~ИD; Ntr]ǒywi!KJ)?lV7R-V7| |<꼵hۂ^ևlta`8Y־ <ꅡ e똝g5fovU32!$*ٖS[j;| t/zv,eQ*?J2F^im[;,֦4{2qƕ$OǠh4+晤\!D]\IZ()gd.Lu\mm{ҭmgpPKiBPKy.F*angular-1.3.9/i18n/angular-locale_es-pr.jsU]o0}WXQ%:Re>0~H TUnb+FNLG+ .74-({0viYԨAu3W0kR'8Xh%fF%WsKmI5^]xBNˏ0I̴A?@dg ޣn re+05Sk6Tz Η!\E (h6OЍA?ME[y3hxn5Df*r}0;S]V0Ko:U-1^r+ WwrO3TE~r%1,f^W{BG#y \% ,vTZ !ad{M0esCg>v/A=25MRٲ-+i:Ad!AV,م*{u;c#}F:w#_iM_scN_ ϬQ8ZhW,T5֓ Bp GCINOɉhV-&܀㸽:SoPKx&PKy.F*angular-1.3.9/i18n/angular-locale_es-py.jsU]o0}WXV%:Re>0~H T!71ԕc#'}&.EߏsOsBwjD,4'TszV&S@Sᣥ+bER0) VD8z8Dt^Ѡ U2J|gg_wp?pvk_)›Nl ;5o`v9n,y)[@>yǺX:7gOn=O#ٝvĿjG7,5drkExߎD@rY̖&,3F t~,DHB+^6xðm>uj)PK*BPKy.F*angular-1.3.9/i18n/angular-locale_es-sv.jsU]o0}WXV%:Re>0~H A!bBnb+FNLG+ .EߏsƮ낢T,-s͉j2Ӝc1)7>heiLc}B%Qhp;^7 x P%!30U;P>2}ȉX:MNH^wjgsIG|!/wr(AwAhཅ@OjV -v&(;S331.kẢ*+VJ%'M>^2* w@2+¨\;A3*HzŸ/x->i*eQz-͡ݮLK]!읽[2:C壭{dx۬k5簗 {̭<V8!C`O{4CpOe: ټsqTN3sSo-y. D\MaѽΛVAQv< OW+fî]B̺6(ćCoA7ǡiz]a00_h؆t$I9!43wr _{plٖWa:HAK4+衞g.ӹiHOmR2sUXfIx"Goh ( ESV!Bl:?Gg"hؿ"p#v׏Y֟:~PKx iPKy.F*angular-1.3.9/i18n/angular-locale_es-us.jsU]o0}WXV%Zv@}`4BP:PWV]\h7M9ܣ亮 RkD4'LszVS@cჹ bEZ2)wj Pvwn'N\EA~JɨdIFlS ȉXu3#UxծpML.8$m Z7ܺbH3C331.kA-̉*+ҧJ%'M>^0* {d*(zɵ/ k4BWO0yPL]ВmɴBtCU\Gqows壍{dx۬k5|w PU[[z !pCેR+w:j/HI < zF(g3yTN3soI[y* D\u~ҝ밄V^QV< OK[f[)ueƽa#AwA; F)z]ݛ hwlE;I=:{5~uȜ\*ٰ^`o1#iV=5e a]}S6<O綥O-HSc#i϶9~UXfű^v0~H T!71ԕc#'}&.EߏsOsBwjD,4'TszV&S@Sᣥ+bER0) VD8z8Dt^Ѡ U2J|gg_wp?pvk_)›Nl ;5o`v9n,yI|R 鹡}v)2xuM)4uoϞH{FOՎ<}{mXjL~8xɵ"Go'h ,fKE '#Bl:?Gg"h?.p:vY6:~PKAPKy.F*angular-1.3.9/i18n/angular-locale_es-ve.jsU]o0}WXV%ZRe>P~H T!71ԕc#'ki@9ܓĮꜢP,) 3͉g2՜c1 ~h䂥jLcǝʂ(ԿFI7h.ۏ 5^Q%! Hafx5uS a;4m*nU\p BVA_A. &׽(lm.A?uAY7qoVOMe <w0#(afZ*_4]x*mI%. {֗D 'U"@Lॷ+AC2y-`4vr2)tŤ,R(>{Fേ`.m(C Cz\#T0Ce`nim!𶄸YK=~zܛ`9"7pP)|]x̥ϣ22zm!̲f#Jnuބ,:RYx\6vp_`ֵweah2Uй a_}PsmnްX8pAdwـ̴_GdF~]+¶e^`q#[V=5e c]}U:7On=O#ٝ? IxvRcO ϹVw15$dhr88DMѱ@B-gd9[UY7PK PKy.F'angular-1.3.9/i18n/angular-locale_es.jsUn0}+,(2PMKT!71ԕ 'k'mE"{}}c7UNQ^H^D,Qcb)n9ZfhbD\L[ zmlDiؿY w3t^yaE F#@&tVg_zG3)[="zS 3PP.kIcág!Bl:?G"$im8{0q}vݗ^c7PKwPKy.F*angular-1.3.9/i18n/angular-locale_et-ee.jsVmoHίY܁m>G&qZqmm` Nkd:M9{glܵ)=V<>8d*lbrK8YimKo%{YiG+B-*J]amصr>Gn/vtW&h9$H r? gdL Y׮O6jSk?lUa%_F1-)%gXeDrſLC9k$Jl^@߆ߡT\hׅo5⽿ezئ:)Ta CE!Ç+ wyiƉ#i7"Q_p:訪2DmKH C L]>wo!]WLhW.q}([(y3؏F S3*A7?1Y̲DħH.N)tLi#go: Y?1&5Kmc@b**3ZlFB>faMVX:SF;[G| |VI@d鬸JQzG;33]CӐCm|d+IG5AcG3v04PUZK8Ձ.h%T~|阬K :'Vt` LM<]UH=h4uT*&w{?}w2^<زrxo< OfJ/ U(\RK)G_Չ)0f_RL z#e(zR,:b6Gh{%%iJ:BCINB]UjE+jW]^^V蔉1W,MmbÒi<5Qfl15䡃FG&~r[{{||PKSgȡ0 PKy.F'angular-1.3.9/i18n/angular-locale_et.jsVmoHίYbm>G&qZqmmזurظkSzY<>2C:;Ln`ž46^3>|ǟ*I" \a,Swa:wswv#04FF&@+FڙVDLwmdoyjǝ:8lx~aDfJ@bD A BBP<0VG*`Ά=0BE&ڝpwZ_q?$)ΰU` U`hPaA(.L0?4pXPjLWu<2\z?AU(2M oi+FP >z kJKð%.wWsיxKcT6%gA1JBͪ|RA޲ЦSTCrS +('FvWR/ Lmor]UJ=hMT*2fw㹟޹=+~Rol];7^K{A~swCh1<۝5z,ïTzcj/W)&VkԲa|HR *bhg#=TP4%j%Q!X^ˮ.wBƫCf$BLLuߧicdW|A *4`9>ׯ,4vä?0;M?WxPKI- PKy.F*angular-1.3.9/i18n/angular-locale_eu-es.jsUQO0~W4 >A|dRX ]KI7>ܻwNURjڮNT#ᴆE|/S\GSᓵYbiB3)j9w+~tgN B�`BxKA > bKcӟHxa l~ ڕ|Ɔp B|ov3N8- ;з1xl83fJYLDDQORM9}2]dBcN*xF̉&ŪA?uRձ4SRdUf0.á3(mȝrqw^;&]\6"xu|ظFNs69[0􂾻췘lGlk-PL덂҄t{'[)h\(n"8<2htfՌ`ɲN#ޅQɈejj(g\;(͕d̓ܙ/'//'a xE6Y^ƇkfYhla=zQCw/o1vIlkQ-PU+ 5C3l$om@+lkFZylCK&m{YiV w4.ޤ>1xF7.Y' |jptq-DHR%-8jnm7PK'oPKy.F+angular-1.3.9/i18n/angular-locale_ewo-cm.jsV[oX~W-P҇KL2Vl7kc 4P۱:yX0|s;L" 8t7qs`I<vLSQ8 m6P&c?Yt6Xq}E2 8FXe䒦r9f"$$ #z ^ ~hY܉~ F%ޟ!ƏCG؃40a 4l`(9-].uAcSw\ }(OX3Vf rOi#Q^,s Ȯ@iG!= >"u>y aq4MFd-4]?'bWJq})v?t ʤ{_q3 N Rnr1e_ .{kJ{.d#+1jb]UQ j1-4%Uҍ@yޘ9b|X6z|R^kdC^t_sƫJdݨ[ KuAP;\K')9vz,煉yuJlsfLP{˩Y["dQ MŔ ʌϴmV$񼯤REIgQR: q<+*~yqMj:'m$dޘQ}n)PS SyG+u#|;{5-$Gjzm]\ :Nk8szۿPKn2 PKy.F(angular-1.3.9/i18n/angular-locale_ewo.jsV[oX~W1[BMHV,1%R Ȑnc}|ߙc;Y'Kfon{ΒC:>7pm?p5҂Q>l`Z@ Ɩ07wB65p tse=@;#;gXu|'*~#o2Qg8Â(#4mWXVgMBB'k84wРNw~بsqb{P[ U ڠ&v05lS ?}WjZЕbae`vU߀ &|Bö[^l#Rko?xV1.n q45bd3hF߉q+ SQZ9.T]|/f.iae4>xjaRWa@j!MY.+E~_|M:!ϥldŜ=FMU Ri1,fsP*WQW덙Z wew(-.j$xv Z MÿICU1Oś`BQ)4rxT9R9r-EN)pJY¾,To"N0yۉݰVt/wS@8)sM|rΗ GF.3Z9Z:Lˡ`INRz01N鳟OLijo5SR B,5JAAEMhNxIȼ!TZSZhv \VV!4uGnU vkFl:Y۸uvqąPKljZ PKy.F*angular-1.3.9/i18n/angular-locale_fa-af.jsVmO@ί4&zbm+*V1@JᔐbݙV+ׄg/=Ͷ[5(塷ĥ쒛 )[4f\籛ISʾ=Mjdc^19%?L$ʓ&̳3Ks+.?7ٳ=gƏ6TYje= sFt+,y>QXl2}j;Cɸv)mk`xe\mkl暪 9w:jQrVS?'8NПd\MLgd@fk]GyUCV}43!83^!\r + -N⮷ղ7D󵷵j PKt PKy.F*angular-1.3.9/i18n/angular-locale_fa-ir.jsVmO@_!&z/j?*Z) 1=m= f=_ovgr$)Yfyfav$I۝Y@~ϳݑUv~֒,rR?v ܸ VjiM)y[fHO.itx#b_sG5=Fw0Fauc;INȹO :Hg۾4ٹi]{$65G0frKS]9Ƶv)U+,MiH1$N8" @y- t6G*Bf1fP,GnzT`vQUZJS s`m= iBޡVM5Qh.?Ƣ+-R| eyi}MBPīiU#;$x ȣҼ/U7Ǭ+`m.Y]iٟGvp~/Q'Ov,h7V"sbEϡѢBwg!<~; IRE@,b2Yʙ9*8] %аB[زAo2M iPНKƟ>.l}/9V\Nvm[D,8,FWsT39N-4*z~5K] 6w// (󸢲u'ypZvyNRMR${T"S䕁ie1(o xΖuj ôsD^!<VM $iƢ6V󹺳jt)~PK*7, PKy.F'angular-1.3.9/i18n/angular-locale_fa.jsVmO@_٘j?*Z) 1=m= =_ovgr$)Yfyfav8$IcN; .2A4|gfC~tkGޜ,S/ w .ynܳ fjZڅaN)yF''i 4xBb]sG5]zw0a5c;'Nȹ :3m]05mEP7Lj2ǸVo3Yl^ExIxTNn@"p*P^)P BʼZjLos ($ncv˹|βy䔪GU12Ʃ{U4U7Vl *&-Tjh,"'N_V$tYV5;"êLb(3ދd և.I7 MnB1ǒ;y&]m?ki90={ D1_{Ox3ȏֺ1( oPKn PKy.F*angular-1.3.9/i18n/angular-locale_ff-mr.jsVmoHίYbz@iU 8H1 zQ5lX"@S~6[)w,yq=K($i̖i_#bq#dږX%jG^mccXL [pH op4Χ7k8xXi,s2vH_"+tx "Ey#S>ֱ_aEd-T3 )I~v]o(ML,`Z!b~-kZ%[[4AnӧmHR0UEկa*a `k.X:$]#&j7M E :ovHwʶe׀Ӏ_r`{`AS%ȲgK3B9He7cx##b,|!X_h?3].%r `}Pj v!%>Kde  %@J+5 OK+U:8!!3^)[\68E4`Y\sM^`4EQ/IN)¤ͪZEysd-4}{ =sݏJ_TB꡵;=|d և.I7 MnB1ǒ;y&]m?ki90={ D1_{Ox3ȏֺ1wfJOqtHGfwyH3}Sׄ:˳c@P\u Xu\*B< ؔdr6js9*kQg҅?TL"h_۫VOx/(°d և.I7 MnB1ǒ;y&]m?ki90={ D1_{Ox3ȏֺ1wfJOqtHGfwyH3}Sׄ:˳c@P\u Xu\*B< ؔdr6js9*kQg҅?TL"h_۫VOx/(0kx>$umHc/^-{׶*͙/.} V-/8֫ωvyz_PKkP*Ǩ PKy.F*angular-1.3.9/i18n/angular-locale_fi-fi.jsV_8S^ wA'Ъlw mŵpq(R{ IoUF!)[EFq:QVږ+©ՅϏ^%iB%V6X0Oq~K_?1JΦ..b4A>k>OxkuqPyMW,"<@E@18LYhvGSR*U*Fx}"#b#C FCf-')It9( kS9F-4Bk4wy)G։tm(/`Il]Td d~ׁoŢ>BByDզ|NNš{4k]c;}8XX"H{sO/?#Ik PѲʜ)! r JƲߎf;3UqM΄_4r VsћM۪D)%+>n)?oβ&ʦ.na0_TO5-e"iyHCaDҔ4ƊjV-i.iSmSmI社5 [`J8&^V8`퀇2,jXl 1k"-v<n(rȖ4I l JU.AGaM?]b<;,KOʘv'w;Į?A!}CJm6 ]Ut_#&EGxo~EwB'kP"k u0U4#s5\j=/7?O!5RYȿW3-7[뤅p>!:pYWMu;(K Yt/ x}{^gh<~|e3: PK33 PKy.F'angular-1.3.9/i18n/angular-locale_fi.jsV_8S+OՉJ@!{׮V.88Qbg|'X$,=nB&Sa$ux8-S gJ8g+ J,%mZ9Iavƣ8p]:McN\\Bk >i| !}ƹ7,p%[2rCSk?l㰦.YDxf @B18LihvGSR*U*F\;'`]@ڷjED>%)0am*GS5ҰXB!t /E?8v=.+Ee_ vEE&I-| .pwrB#6sr7%ߡYyFIFțyzHX]`(%UL $LPD MP254۲68mr&4vetV$V)YqC ~s5F6eqz=o(g 7Ud//MC #-V\\o~pRjsɎ-j$j3O*8'Q?欄k")EkVx8/"p#b*+s^։"'ˌlI>J#K0ݐ6q*Z\A:Tux4_xu#Kcy_LOf i6 ןT/+}Z;W5~}@{ ~t=K^\.XUI=DPR.+~CjRYW3-7[餅c%\κyԕ7r\wGB޼#҄}\|NM,}%47i_sNm0]48Ӛ?>Vn7q]b zk8 mZр4y,9".؟"kcmg+ÏÞIw,NLNKlN\T@đӯTGCD"_ mo,bN:ju;uÀq/Q ~-kZ%W:oRO1R'H,RאwIϐ9"݀ ꃃ餻vsM.Bc`^v$tuNk#us.(>zt-}p {&[h_2R$C34L<\/L-_¬Tө={.ͧgI)NVdo8$gk(*aFB̞E-d\$Vݘ k<,c6Z-WH5謻2]͗B(domJt1mÚDG/PK3c PKy.F(angular-1.3.9/i18n/angular-locale_fil.jsVoF I5 4QpJ$ 8XEƪ}F LM,}%4iWsN M0]$Z;Ӛ?.Fnשq]b z흘[k0lZR4Y,9".؟"}k=`mKI,֎LNKGlN\T@đӯTGCD"_ -o[,bN:}4wjS^ ]PW;*y]z:EbjTUTKz/\PL'ݶBntE+u2EzD ٥ s]ݠsAiqߥ=vK.xDh}d7GFF4g9Z7'97f5znj@fN|ysi>8KJt"ÑTl[GaT pV&bΦX-*%Q*b?P+=(qƫb/JRz 7f`mF~r* /3~IsR/$8-Y2O,JRj<`Ԍ3m0Xj@_)RiUYh\6xh$YDܓ&/!Y(maMrNiF Q _hm?kxl8ۼ;e\9Ys^֣[mzk~4ֲpyX"첽Ȑ#cxc6_slI5K) k )[?DW򬡪50t_ m+pVG9xPũ4QxV]Pi{ Q-]*u-׬v i/oy7(ti `}m*WL^!pt{mvDǽ,c}{zzûOϫ+ 'r6ԧ·=aA\Ar c[ӷ٧N _6z;֎;PK ť PKy.F*angular-1.3.9/i18n/angular-locale_fo-fo.jsVmoH_1Bme7Vt9l |(ژ4,x@ҞNd< ޡ+2 Y]ޝv DD0N<Q`u#5ƻ'EIl 3փC 7n>s+g prV0Sji0"//'|g- 1a]XiG%t$L&+`GbCP"Ðy7nOj8g`#aDYa~O;N#&Cw)rP% LPM;*09 և68df>b{:ɓ91Gi2]QޗBC17yj|ÂDg.R#?`Z^ʱgƘ$ffm)~E3y"sѐ1(J`Lx$шi}/kq؎/-ږ>/#{AЎ*r^{t֭Oy 4$=%4P 5&,׶Ms1OKG i4Y4td5hׂb]#p 2"Y Z@vjͪ<ȩ Z@*4jlV( 9ð/ӫlψ( o(ZS/ma$SQYWV*ttøLv kOsn~)T6˶%cycn9XneG5š_ٸ6Z*fСB3׵eRu&.=S/>V%')'tT \k N 7—}4N-Tٞ:()q_KjuZZ?5VK{exޕГD=FhN$jUk[i%r|kܶRÇPCܱr$㧵JG  cxPK,3: PKy.F'angular-1.3.9/i18n/angular-locale_fo.jsVmoH_1Bme7Vt9l |(ژ4,x@ҞNd< ޡ+2 Y]ޝv DD0N<Q`u#5ƻ'EIl 3փC 7n>s+g prV0Sji0"//'|g- 1a]XiG%t$L&+`GbCP"Ðy7nOj8g`#aDYa~O;N#&Cw)rP% LPM;*09 և68df>b{:ɓ91Gi2]QޗBC17yj|ÂDg.R#?`Z^ʱgƘ$ffm)~E3y"sѐ1(J`Lx$шi}/kq؎/-ږ>/#{AЎ*r^{t֭Oy 4$=%4P 5&,׶Ms1OKG i4Y4td5hׂb]#p 2"Y Z@vjͪ<ȩ Z@*4jlV( 9ð/ӫlψ( o(ZS/ma$SQYWV*ttøLv kOsn~)T6˶%cycn9XneG5š_ٸ6Z*fСB3׵eRu&.=S/>V%')'tT \k N 7—}4N-Tٞ:()q_KjuZZ?5VK{exޕГD2Hp͉dZ-Vjmye6B9\oa4c  \nƒ[(C"AczqoPK㉈7 PKy.F*angular-1.3.9/i18n/angular-locale_fr-be.jsUn0}+,R[Rݗi A"&M8ȉ߱^v#5͜ˌ,qw/%#duFqDCDyƚ4zE;#ou~"#媊/| OTMal @to 9_b=; {U65{b9/(3C@$0ø4"*&6Hm)ITB;#tшdME6YCJ3!Gc4/ѽet^XZAVk!a3(J?*Y֖-PȖ?J)la׊B\+,Pղ"9)Bƒ,i1K}jDjzAA'I:M䗥 'zzj\>vmmCK{wuRVNߎ dEiӿrᦚ8clM5bqoh_ŝ$~U 0X<_P MbEV@R9]-aMl4PVFUZ:x-hI?k|^%ϴ]8TE辸IAX(wC7Q+A8!5bov8B`6zW3t4gc F!m46fPKY|[PKy.F*angular-1.3.9/i18n/angular-locale_fr-bf.jsU[o0~WXVt@}h(BP:ġ9 w`⤗-;/EFQ8-W#a4 6]EC D8G;F Ƚyr`ěs&=_H!s2HHG(}>رs0Ÿe?=S!L|m!/`nʱÉX[HV m=v2s34Npu+xWfBDͤ"Dhaz@FPcL@&4?EKnD 6YC*3!" ,h^$;:ɝ0H<<4B’gPµ&׻S 3-jZ U3W[})FkXaiE=Ec$j  T,+X$2Uy3zIjeD-*]:8Q7STvx8ښ5_[Ϝ_~fgtICKWSSە/ը\]76TQ'jȖm G`B$;kK ӕ ;X)OH&N]pձjA섔uoϪ-_B4ZnU/]8E.R9F:_ =] 7GoG(程ޤ@ c.C~W_[PKGKPKy.F*angular-1.3.9/i18n/angular-locale_fr-bi.jsU[o0~WXVt@}4J T!7qh*ANL }&Nzy"|swr(3\A~mV#W7i@Mt>Xt $8G;F hr3z7~w_7 BE FUV9'[G no4#!YeCS9xm9[$=`k!| s׮=Oq!xpϝʼӦpӌ'.E@@'x&IƥQ1G*msCyX H*,< ĠÞF[FTP`14b~1/]`1F [PF9MEi<49=ޭhmYМmQ-lY p*CNߊKyOĵ"@XU-(Z)]ª<(D.<VL@ݧVLTg4vՄJ~YpqgfuuOw --"*JY!<~gtIҔt.SSgGm˾(r~AR2"ZIJF0_^a7~xo%u* <5D]/=߹y3t8ި+)d)WUȟ~8O0v{ /*8nZ&3<sۿrs{wܱ[mj7xb=١a tma\ @Py6הՀ$* u :hDwݦ֢!ey1IUނ2ir/,- O+O׵p`n,@k˂ll@d[Uy̟jlV|kE~!ZjYFZOdV vA!rA꘥|i>eR$̬&\DT҅ӏ={=5{HEkǮ{mhinQUʪQ xw{yΰ?[LfNI`*;+N3VΦ/tlPdI۸=w}>\UuL>|!H54m[J t94'2Rl\CM^[-UkYTCKZ#߶W39JHg$^1)%MJ !upq]}]yЉDH\ ^ [pBkPKOPKy.F*angular-1.3.9/i18n/angular-locale_fr-ca.jsU[o0~WXVv e>0J BP:ġ9LE"||(rC`D4,=|sQE+ᣭH8@T S~/S7^OƾuxKt^~Y3D2FeF:G_X70#l FB's{*nsK z4ϗBlk}x؟!pCҼUpW]B cm Ƶ05ZfIy H",lgOM1p. du /̈́.y T֏ (ۜ&w" lϠMΧջ_ 3-jZ 7U3vP}*FkXaiE[=Ec$j T,X$2g۽0D0I^M(]rqfofUFq܇­(,Ng Yr=_r#=ӹ5ᘚ[ĻQ^@ܱ[<>SE,y,[%b s!H MbGF@9ݸuoOMx^D6m[U b/-}5x-hȧ5tjġ-x A؄Htq\w.W4!G34@sNU B۱!>˫o쾌:PKwaPKy.F*angular-1.3.9/i18n/angular-locale_fr-cd.jsU[o0~WXVvt@}`JT!7qh*AΥc'߹;_|9SLD~vo8 rFO0\'>a ~h+" $Ϣh ziD\Ϻt%@/,!LE#ᲊw#٣ Cc{0]$3ʜ 1ޕmǎk973[Tnj*(4C@['QeDL*|AMYPR˄ ۙzE:hn(D 6iC*3&< ,hV$;J60H,<)!A/ZzoT,@kÂLl@d;uyjl67|kD~ jXZFOa؈dV AA%|>X*zBI/{^MWKjfjzLll_[RC2櫕q'Ӆrup/m9X G^pNͭt5~:F%] X"J:WgR/|^-OW.OHBq4޲\6$R=(f뭠~B‹uE!:u\sY.xzmyZ/nPKXPKy.F*angular-1.3.9/i18n/angular-locale_fr-cf.jsUn0}+,R[R:3/CR*84 gʿϵ.3.>aRf"~uΈI3z: nQ 0~%HcUs׺^ ,Ͼ t^  dN6 U%>o`G;xFLF+s{*sv r z4B{5p!xLi*SSD "mrDQ35fAyPHI,j,</"aO#wg!j(I^V11x?\`1F PJ7EgI I J~ ך&^N6,hδiʆD6,SWF^a{oF' am]ª6<(@<Ru@'W`TAh4q/ի tXLMjkZʻ[F|;neCx=,V#'wa8fTt'F%]Zgc(ugыޗ@}i(#CF@9]Oa5EYJD7I n:VY@KF#_Wӭ%RP*7, ~6J6j#p}"8zC>BQ>G]&=L"$h ޼;pBs.PK7>PKy.F*angular-1.3.9/i18n/angular-locale_fr-cg.jsUn0}+,R[R:3/CR*84 gʿϵ.3.>aRf"~uΈI3z: nQ 0~%HcUs׺^ ,Ͼ t^  dN6 U%>o`G;xFLF+s{*sv r z4B{5p!xLi*SSD "mrDQ35fAyPHI,j,</"aO#wg!j(I^V11x?\`1F PJ7EgI I J~ ך&^N6,hδiʆD6,SWF^a{oF' am]ª6<(@<Ru@'W`TAh4q/ի tXLMjkZʻ[F|;neCx=,V#'wa8fTt'F%]Zgc(ugыޗ@}i(#CF@9]Oa5EYJD7I n:VY@KF#_Wӭ%RPkUoX.)mlFP?J!yEpq}}Mzљ DH,y=v6~yq]/PKW7'PKy.F*angular-1.3.9/i18n/angular-locale_fr-ch.jsUn0}+,R["/ KC*8qs߱^Fe\|)Ei&"?;_猈N9'o0n ?|IsgQO4v^[hz3w7w.ouzP@3HJG(u !}w{0Y,3ʜlC[zNAXDB_޵mFk7S[wTnD "oN`9ʌTM<$ 53&‹t8.Y l*UfL y+XѬH"mF{ahYRxR4B_µ&gcݩXֆ͙5-PȆw?H;(l`׈D\#5,PհœKQ5؂dÃ0)1KZG4}r U^RpQ˯JN/tL:y׼PxRs O-epdX\v8rچjfMGˊ\g>ըܲSϳ܉y\ֳE6]L>c4oߣ]\*vnpٞ",%l$7P^HYZfZj_$O)o֛Mf}RP޲\6$RÌmlVP?JaCHGoG( ޤ@rvZ~kPKPKy.F*angular-1.3.9/i18n/angular-locale_fr-ci.jsU[o0~WXVt@}h(BP:ġ9 w`⤗-;/EFQ8-W#a4 6]EC D8G;F Ƚyr`ěs&=_H!s2HHG(}>رs0Ÿe?=S!L|m!/`nʱÉX[HV m=v2s34Npu+xWfBDͤ"Dhaz@FPcL@&4?EKnD 6YC*3!" ,h^$;:ɝ0H<<4B’gPµ&׻S 3-jZ U3W[})FkXaiE=Ec$j  T,+X$2Uy3zIjeD-*]:8Q7STvx8ښ5_[Ϝ_~fgtICKWSSە/ը\]76TQ'jȖm G`B$;kK ӕ ;X)OH&N]pձjA섔uoϪ-_B4ZnU/]8E$(7-^B6 R5(]˵AB u:uۛ3y!xveyo[~k_PKE!PKy.F*angular-1.3.9/i18n/angular-locale_fr-cm.jsUn0}+,R[R:3/CR*84 gʿϵ.3.>aRf"~uΈI3z: nQ 0~%HcUs׺^ ,Ͼ t^  dN6 U%>o`G;xFLF+s{*sv r z4B{5p!xLi*SSD "mrDQ35fAyPHI,j,</"aO#wg!j(I^V11x?\`1F PJ7EgI I J~ ך&^N6,hδiʆD6,SWF^a{oF' am]ª6<(@<Ru@'W`TAh4q/ի tXLMjkZʻ[F|;neCx=,V#'wa8fTt'F%]Zgc(ugыޗ@}i(#CF@9]Oa5EYJD7I n:VY@KF#_Wӭ%RP*7, ~6J6j#p}"8zC>BQ>G]&=L"$h ޼;pBs.PKPKy.F*angular-1.3.9/i18n/angular-locale_fr-dj.jsU[o0~WXVvt@}`4J A!bBn AΥc'߹;_|9SLD~vo8 rFO0_$>a~h+" $Ϣh ziDܬϺr@/,!LE#ᲊw+٣G-Cc{0Y$3ʜ 1kZx3n<4㩍pY"PfaN`9ʌTȆYPR˄ ۙxcdž"4yK!e&x1UIdހRh|/ -?KjOFHPKl[; ڰ9Ӣ*>ٰ@N]^5i 썾5ߧkDVS3vI2 [ KJuM\y,S=ǽT&\FҥӋb5{35}HDjg}i)nQ︓ iowpdXtltKkxm15̧tk:<˝Gye=e^=0&F8{kK v>SS塄MtcՂ )_K_ UK Z*zo4i{<ݪ_»\=Q E ~u-aC"?\sm G){p!$n8^QP/PJ:W 7o\/o PKs(PKy.F*angular-1.3.9/i18n/angular-locale_fr-dz.jsU[o0~WXVvt@}`4-uCS9r.]/;8aDaQ"au%iX0z: nq(AHc_K$sot| W6S3˕sFz%}rGoySNuglޖ&υ A+4RSt;j"nlBuZ;!eknCK՗PF>m[UKxW'h8Uia lLkwQWA8{;} +#tW9C*!AB؃7v_^PKS:*PKy.F*angular-1.3.9/i18n/angular-locale_fr-fr.jsUn0}+,R[Rڙi A"&M8ȉʿϵ.3.>˾(r~AR2"ZIJF0_^a7~xo%u* <5D]/=߹y3t8ި+)d)WUȟ~8O0v{ /*8nZ&3<sۿrs{wܱ[mj7xb=١a tma\ @Py6הՀ$* u :hDwݦ֢!ey1IUނ2ir/,- O+O׵p`n,@k˂ll@d[Uy̟jlV|kE~!ZjYFZOdV vA!rA꘥|i>eR$̬&\DT҅ӏ={=5{HEkǮ{mhinQUʪQ xw{yΰ?[LfNI`*;+N3VΦ/tlPdI۸=w}>\UuL>|!H54m[J t94'2Rl\CM^[-UkYTCKZ#߶W39JHEűWL D x|43CH]y1\rv8B`6zW3t4/܇گn966sxPKPKy.F*angular-1.3.9/i18n/angular-locale_fr-ga.jsUn0}+,R[R:3/CR*84 gʿϵ.3.>aRf"~uΈI3z: nQ 0~%HcUs׺^ ,Ͼ t^  dN6 U%>o`G;xFLF+s{*sv r z4B{5p!xLi*SSD "mrDQ35fAyPHI,j,</"aO#wg!j(I^V11x?\`1F PJ7EgI I J~ ך&^N6,hδiʆD6,SWF^a{oF' am]ª6<(@<Ru@'W`TAh4q/ի tXLMjkZʻ[F|;neCx=,V#'wa8fTt'F%]Zgc(ugыޗ@}i(#CF@9]Oa5EYJD7I n:VY@KF#_Wӭ%RP*7, ~6J6j#p}"8zC>BQ>G]&=L"$h ޼;pBs.PKm*6PKy.F*angular-1.3.9/i18n/angular-locale_fr-gf.jsUn0}+,R[Rڙi A"&M8ȉʿϵ.3.>˾(r~AR2"ZIJF0_^a7~xo%u* <5D]/=߹y3t8ި+)d)WUȟ~8O0v{ /*8nZ&3<sۿrs{wܱ[mj7xb=١a tma\ @Py6הՀ$* u :hDwݦ֢!ey1IUނ2ir/,- O+O׵p`n,@k˂ll@d[Uy̟jlV|kE~!ZjYFZOdV vA!rA꘥|i>eR$̬&\DT҅ӏ={=5{HEkǮ{mhinQUʪQ xw{yΰ?[LfNI`*;+N3VΦ/tlPdI۸=w}>\UuL>|!H54m[J t94'2Rl\CM^[-UkYTCKZ#߶W39JH-#]~w&JWb%hgpb8zG.Bq>CmaRf"~uΈI3z: nQ 0~%HcUswp˾(r~AR2"ZIJF0_^a7~xo%u* <5D]/=߹y3t8ި+)d)WUȟ~8O0v{ /*8nZ&3<sۿrs{wܱ[mj7xb=١a tma\ @Py6הՀ$* u :hDwݦ֢!ey1IUނ2ir/,- O+O׵p`n,@k˂ll@d[Uy̟jlV|kE~!ZjYFZOdV vA!rA꘥|i>eR$̬&\DT҅ӏ={=5{HEkǮ{mhinQUʪQ xw{yΰ?[LfNI`*;+N3VΦ/tlPdI۸=w}>\UuL>|!H54m[J t94'2Rl\CM^[-UkYTCKZ#߶W39JH-W4^1)%MJ !upq]}]yЉDH\ ^ [pBkPK>"PKy.F*angular-1.3.9/i18n/angular-locale_fr-gq.jsU[o0~WXVt@}`4J A!bBnTÜK }&Nzy"|swr"|3":qaN|(n%F$EH ̹E ?1ziD\Ϻt:G/?-!LE#ᲊw#٣G Cc{0Y$3ʜ 0+Zx3n<4o㩍pY"PfaN`9ʌTM<$ 53&‹t.^ l*UfL y+XѬH"wMF;ahYRxR4B_µ&gcݩXֆ͙5-PȆwH+l`o>׈@\#5,Pհœ QX5؂Ȇ^Rch c< ǽ8z52_.^ٛ}"2U;8]mMKyuˈVV~ǭlO}ۇs׵&j夣h]X+Ω5/]g>ը\]ӁYaRf"~UΈI3z& Q 0~%HcU&73wpn`Gۃ'-OTml+<_Z ۿ?=۵yL6VE@@':<+3!fRj"0 a= #L?6y<A=WQCMVLy1WIe΀2ir' - OkO7pzw*aAsEM T6| ajw56 }kO5"?׈a T5,h`V A!A꘥|>D*zBq/Iz^MWK'jfjv\OmtW[R}2櫕q+“pm9p]X+NJG[㗞3s5*+j;}˛Gye5e_Z=0!F$;kK ӕ X)OH&N]pձj=tu/Ϫ-_B5ZnU/].8EwJ5+aC"ru\ \{p!$.8^QP#QJ9:S 7/܅/o= xPK-PKy.F*angular-1.3.9/i18n/angular-locale_fr-lu.jsUn0}+,R[Rݗi A"&M8ȉ߱^v#5͜ˌ,qw/%#duFqDCDyƚ4zE;#ou~"#媊/| OTMal @to 9_b=; {U65{b9/(3C@$0ø4"*&6Hm)ITB;#tшdME6YCJ3!Gc4/ѽet^XZAVk!a3(J?*Y֖-PȖ?J)la׊B\+,Pղ"9)Bƒ,i1K}jDjzAA'I:M䗥 'zzj\]x[]"⫔UF5S}<9l1j;y&x\&X9FӱAx}ڗGq{e9_U?̡V30!8TCoѶU+:@Nc8w@hKXx"#*Ͷ5QN-eK5ZRiZ#߶W3sx{'h8bR+&a} 9D*_  ;Դaq]}]yЉDH\ ^-گ_wv9PKPKy.F*angular-1.3.9/i18n/angular-locale_fr-ma.jsUn0}+,R[R:3/CR!(UL!7q gʿϵ.3.>aRf"~UΈI3z& Q 0~%HcU&73wp˾(r~AR2"ZIJF0_^a7~xo%u* <5D]/=߹y3t8ި+)d)WUȟ~8O0v{ /*8nZ&3<sۿrs{wܱ[mj7xb=١a tma\ @Py6הՀ$* u :hDwݦ֢!ey1IUނ2ir/,- O+O׵p`n,@k˂ll@d[Uy̟jlV|kE~!ZjYFZOdV vA!rA꘥|i>eR$̬&\DT҅ӏ={=5{HEkǮ{mhinQUʪQ xw{yΰ?[LfNI`*;+N3VΦ/tlPdI۸=w}>\UuL>|!H54m[J t94'2Rl\CM^[-UkYTCKZ#߶W39JH%+&a}tUX \}p!.9QPP+:с Kd C|W_wv9PK:PKy.F*angular-1.3.9/i18n/angular-locale_fr-mf.jsUn0}+,R[Rڙi A"&M8ȉʿϵ.3.>˾(r~AR2"ZIJF0_^a7~xo%u* <5D]/=߹y3t8ި+)d)WUȟ~8O0v{ /*8nZ&3<sۿrs{wܱ[mj7xb=١a tma\ @Py6הՀ$* u :hDwݦ֢!ey1IUނ2ir/,- O+O׵p`n,@k˂ll@d[Uy̟jlV|kE~!ZjYFZOdV vA!rA꘥|i>eR$̬&\DT҅ӏ={=5{HEkǮ{mhinQUʪQ xw{yΰ?[LfNI`*;+N3VΦ/tlPdI۸=w}>\UuL>|!H54m[J t94'2Rl\CM^[-UkYTCKZ#߶W39JH%.WL D x|43CH]y1\rv8B`6zW3t4/܇گn966sxPKYAPKy.F*angular-1.3.9/i18n/angular-locale_fr-mg.jsU[o0~WXVvt@}hZ*5uCS9r.]/;8aDaQ"au%iX0z: nq(AHc_K$MuY}z t^~ٞ;@2݉ FeF:G_70#k#!Ifcۓ9=x;9{%a=`K!|sWp=gxQ l:fB EkXѼH*GwMN;ahyxZBŠgP&gcݫYֆ͙5-PȆH+l`om>׈@\#5,PհsSX5؆ȁ^Rch ,< ǃ$dz5*_~۩}*rU;z}3t4/o_= !o_|mge.PKY~PKy.F*angular-1.3.9/i18n/angular-locale_fr-ml.jsU[o0~WXVt@}h(BP:ġ9 w`⤗-;/EFQ8-W#a4 6]EC D8G;F Ƚyr`ěs&=_H!s2HHG(}>رs0Ÿe?=S!L|m!/`nʱÉX[HV m=v2s34Npu+xWfBDͤ"Dhaz@FPcL@&4?EKnD 6YC*3!" ,h^$;:ɝ0H<<4B’gPµ&׻S 3-jZ U3W[})FkXaiE=Ec$j  T,+X$2Uy3zIjeD-*]:8Q7STvx8ښ5_[Ϝ_~fgtICKWSSە/ը\]76TQ'jȖm G`B$;kK ӕ ;X)OH&N]pձjA섔uoϪ-_B4ZnU/]8E$)Hf l@kQΗkA8{;} #t9ꢷ79Gg*!AB؁߶vPKwIKPKy.F*angular-1.3.9/i18n/angular-locale_fr-mq.jsU[o0~WXV@}`4-@!b-BnTÜLE"||e_fe| |)$ %/Ӏ0v?:Iq v^k"z\:CoA2GC*rO pn`' gOTMal @t 9_b=; {U65fQSMtfcՂ )_K_ uK-Zzo5i{<ݪ_»Z=q(EqRx AؘHt6q\w.W"G3GsNU B۱!m?˫ol ;%PK<PKy.F*angular-1.3.9/i18n/angular-locale_fr-mu.jsU[o0~WXVvt@}`4-@!bBnT8]/;8aDˡ(raEZ2":IJF0__a~`#"Iqʏ  "z WÁ\N:C/oC2'c*r pn`G'OTmeI z ϗB\gu1܁?=w*Vm3X%evhh&yWfBDͤ"F͂D%X?y<^ĠÞF[vG!j(ɪ^V x?ȘW.yTՏ,(&w" h%ϠkMFwbZ[4g[Զ@e"[ܩ˫g~Wc+mѷT^+qֲ@U26z$c$j U,k(= F$ef52_.~ٛ}*r];Bq>G]&=L"$h^޼;pBs.PK`8|OPKy.F*angular-1.3.9/i18n/angular-locale_fr-ne.jsUn0}WXVRTDl7\0)1߱]g6sXde"|U0":IaN(nZ8@T S~cg]/o_N9:GmoC2'c*t7GxvglOTml+<_[ Xۿrp9?=–:ҼUp[?V2s34Npu+xWfBDͤ"Dhaz@FPcL@&4?EKnD 6YC*3!" ,h^$;:ɝ0H<<4B’gPµ&׻S 3-jZ U+W[})FkXaiE=Ec$k  T,+X$2Uy3zIneD-*]:8Q7STvx8ښ5_|[Ϝ_fgtECKW|+=m_zQ_IW\mol~>ʯl>}&i(HMbCF@9]pɎ"$l47P6NHYZfZjR&G/۫VC)Z$NDY!)~6Jr-hg0`!$] 7#GsEoosT B؁ayrq]/PKݳ^PKy.F*angular-1.3.9/i18n/angular-locale_fr-pf.jsU[o0~WXVt@}`4J BP:ġ9 w`⤗-;/EFQ8-W#a4 6]EC D8G;F Ƚyp[7G9=_H!әX`\Vo#ȺqDal&s0Ÿe?PKy.F*angular-1.3.9/i18n/angular-locale_fr-pm.jsUn0}+,R[Rڙi A"&M8ȉʿϵ.3.>˾(r~AR2"ZIJF0_^a7~xo%u* <5D]/=߹y3t8ި+)d)WUȟ~8O0v{ /*8nZ&3<sۿrs{wܱ[mj7xb=١a tma\ @Py6הՀ$* u :hDwݦ֢!ey1IUނ2ir/,- O+O׵p`n,@k˂ll@d[Uy̟jlV|kE~!ZjYFZOdV vA!rA꘥|i>eR$̬&\DT҅ӏ={=5{HEkǮ{mhinQUʪQ xw{yΰ?[LfNI`*;+N3VΦ/tlPdI۸=w}>\UuL>|!H54m[J t94'2Rl\CM^[-UkYTCKZ#߶W39JH]~w&JWb%hgpb8zG.Bq>Cm˾(r~AR2"ZIJF0_^a7~xo%u* <5D]/=߹y3t8ި+)d)WUȟ~8O0v{ /*8nZ&3<sۿrs{wܱ[mj7xb=١a tma\ @Py6הՀ$* u :hDwݦ֢!ey1IUނ2ir/,- O+O׵p`n,@k˂ll@d[Uy̟jlV|kE~!ZjYFZOdV vA!rA꘥|i>eR$̬&\DT҅ӏ={=5{HEkǮ{mhinQUʪQ xw{yΰ?[LfNI`*;+N3VΦ/tlPdI۸=w}>\UuL>|!H54m[J t94'2Rl\CM^[-UkYTCKZ#߶W39JHmO4bR'JMǛ(]動A7Bʋ: ~A>~uu7a/PK56PKy.F*angular-1.3.9/i18n/angular-locale_fr-rw.jsUn0}+,R[R/ KC*84 +c'5/V–zcW;W6S5/]g>Ө\][<>SE,k/~-x$h&1ߡ}W\ujg"WD6M[U b'-}5x-hȧ5t jġ-YJ +ac"_sM{p!$n8^QP#PJ:U o\/ᶳ2l PKzzJPKy.F*angular-1.3.9/i18n/angular-locale_fr-sn.jsU[o0~WXVt@}h(BP:ġ9 w`⤗-;/EFQ8-W#a4 6]EC D8G;F Ƚyr`ěs&=_H!s2HHG(}>رs0Ÿe?=S!L|m!/`nʱÉX[HV m=v2s34Npu+xWfBDͤ"Dhaz@FPcL@&4?EKnD 6YC*3!" ,h^$;:ɝ0H<<4B’gPµ&׻S 3-jZ U3W[})FkXaiE=Ec$j  T,+X$2Uy3zIjeD-*]:8Q7STvx8ښ5_[Ϝ_~fgtICKWSSە/ը\]76TQ'jȖm G`B$;kK ӕ ;X)OH&N]pձjA섔uoϪ-_B4ZnU/]8E$4^B6 R5(]˵AB u:uۛ3y!xveyo[~k_PK \PKy.F*angular-1.3.9/i18n/angular-locale_fr-sy.jsU[o0~WXVt@}`4-BP:ġ9;8aDaRf"~UΈI3z6 kQ 0~%Hch*@ۙ;]ust6,!JE#ᲊw'ٳį;`<#&Efx#˕9#xo9;a9=`禅Z^9=cJG|vp)ٙr';jBQ@]&=L"$h ޼ ;pBs.PKG|PKy.F*angular-1.3.9/i18n/angular-locale_fr-td.jsUn0}+,R[R:3/CR*84 gʿϵ.3.>aRf"~uΈI3z: nQ 0~%HcUs׺^ ,Ͼ t^  dN6 U%>o`G;xFLF+s{*sv r z4B{5p!xLi*SSD "mrDQ35fAyPHI,j,</"aO#wg!j(I^V11x?\`1F PJ7EgI I J~ ך&^N6,hδiʆD6,SWF^a{oF' am]ª6<(@<Ru@'W`TAh4q/ի tXLMjkZʻ[F|;neCx=,V#'wa8fTt'F%]Zgc(ugыޗ@}i(#CF@9]Oa5EYJD7I n:VY@KF#_Wӭ%RPd*7, ~6J6j#p}"8zC>BQ>G]&=L"$h ޼;pBs.PK;PKy.F*angular-1.3.9/i18n/angular-locale_fr-tg.jsU[o0~WXVt@}h(BP:ġ9 w`⤗-;/EFQ8-W#a4 6]EC D8G;F Ƚyr`ěs&=_H!s2HHG(}>رs0Ÿe?=S!L|m!/`nʱÉX[HV m=v2s34Npu+xWfBDͤ"Dhaz@FPcL@&4?EKnD 6YC*3!" ,h^$;:ɝ0H<<4B’gPµ&׻S 3-jZ U3W[})FkXaiE=Ec$j  T,+X$2Uy3zIjeD-*]:8Q7STvx8ښ5_[Ϝ_~fgtICKWSSە/ը\]76TQ'jȖm G`B$;kK ӕ ;X)OH&N]pձjA섔uoϪ-_B4ZnU/]8E$_x A؀Hot/ׂq\w.7#GsEoosT B۱!m?˫mm^PKrZyPKy.F*angular-1.3.9/i18n/angular-locale_fr-tn.jsU[o0~WXVvt@}`4-uCS9r.]/;8aDaQ"au%iX0z: nq(AHc_K$sot| W6S3˕sFz%}rGoySNuglޖ&υ A+4RSt;j"nlBuZ;!eknCK՗PF>m[UKxW'h8ι*7~.J7j#hgpub8zE!Bq>C}*=gT"$h^޾{pBc˰]/PKOڰPKy.F*angular-1.3.9/i18n/angular-locale_fr-vu.jsU[o0~WXVvt@}`4-@!b]ġ9q^;v0q󝋿ŗ}Q"~dDt4`L(n[ήH8T@$y)?0*@˹7\s>rIg*RȜ0Rʑ?*̹qDa 0ŸT?rٲ@N]^=[i;-썾5ߧZkEZQS$;%9UxP\x%:f)_O@TAOh4%I/3 tDLSmkZڻ[F|;nTCx{3.&_r…cjLmso2TW5ol婢O,~V-3x9$h&1ߢ]\ulᖚ&LF um b+-}xV-5hȧLC%Z$ K5!Q9F:_ =R] 7GG('^_@ͥ۱!m>im[[xPKb?PKy.F*angular-1.3.9/i18n/angular-locale_fr-wf.jsU[o0~WXVt@}`4J BP:ġ9 w`⤗-;/EFQ8-W#a4 6]EC D8G;F Ƚyp[7G9=_H!әX`\Vo#ȺqDal&s0Ÿe?˾(r~AR2"ZIJF0_^a7~xo%u* <5D]/=߹y3t8ި+)d)WUȟ~8O0v{ /*8nZ&3<sۿrs{wܱ[mj7xb=١a tma\ @Py6הՀ$* u :hDwݦ֢!ey1IUނ2ir/,- O+O׵p`n,@k˂ll@d[Uy̟jlV|kE~!ZjYFZOdV vA!rA꘥|i>eR$̬&\DT҅ӏ={=5{HEkǮ{mhinQUʪQ xw{yΰ?[LfNI`*;+N3VΦ/tlPdI۸=w}>\UuL>|!H54m[J t94'2Rl\CM^[-UkYTCKZ#߶W39JH^1)%MJ !upq]}]yЉDH\ ^ [pBkPK`PKy.F'angular-1.3.9/i18n/angular-locale_fr.jsU[o0~WXV@}`4-@!b-BnT;8aDˡ(raAR2"ZIJF0_ޤa7~`%u* <mk"fn\:Gߎ7 JE FUV9g_:03pFBrG*0sքI z M!|s׮ynϟpC;vyM ]23;4NM[8cF BCymQAs)8بޠChS~=ZV#_3w!w{3JR0>bCN¸ oB1=:G{b e* (,Zb"Cs K͖7ְ$5co)#"c 0i&3<>eFLȉ_0ްȽ:"׫@' a2h!ߌdFcyOF5ոH4=eC^řŔm+zTTHP $hZ# MR˔1k|R# F@pΞќg4H5# eF@UG2$x,6xm{֊SӶ1Khd{a 3}h[JgKʚ]TاڹTVlV\Uw'7.&Si?ɋ>tSwrvWJ;yҨ8\Q*R=n;y&)ޚ'_ W| j (JS%Xe4;AIZiZ:CגȯSj-BEZ$EUBkKA Q ܬMe5F\&jz^A989/Ո;(OO t=^}X#N-PK,f PKy.F(angular-1.3.9/i18n/angular-locale_fur.jsV6)Jظ&NPnrh{:yJĹ} iZ$"KWBmwɄ'"P⻛lKjW{,R@,`5փC$V7~: w~+8|pW*2. WQJQ<)|uLpMR¿(pʧx:;:9h1[$cF?AP18G]SA )8بa~0|W<]p9vZۼپ L#ubT-ոX 14tWP.X:xxtRv7}x[>n|=A.cT6A/Jh{(GP F1>$=-?`Zk^{IFɨx+OL=q^Z4M,,7bJDAD`Tle3c }N1mpѬ`@/$ShAjDkT KM^2vpl^vPܟ&هzg;G;| PK  PKy.F*angular-1.3.9/i18n/angular-locale_fy-nl.jsV[oH~WYm1['PbS"ŀmhdgLSg|lڗ79B&CND8Iݤ[S_gً4g"ŷܮ;97i~Z_AE˅BuVȃƯϸtA!!Y{s> 4aG%ݲęu3rx]l@W40:ݞ*`CaLN>0tNVlއt/SgAX1UK5`*0}8 1 ևN¸B1ͪ 2Bms ]a1C7y99#.qkϽZ4X[dLůh~^yV+ 1M3No ;$cY 8E)Q"AiD,)o-ܬpND8BlL^Q8?)}l)6$v*Hѽdo]$Yx^ϗ~pNAl/Z]4p:26EuXH!%BrhH 1A Փ 4$$ϐ7CB s D*/x,ݲb*3:(hq_K:_M hVtjighqjgyˋJxF4@~m4CXI)z^{mdwG =юjv}j8ew9<߿PKpPKy.F'angular-1.3.9/i18n/angular-locale_fy.jsV[oH~WYm1['PbS"ŀmhdgLSg|lڗ73>B&CND8Iݤ[S_gً4g"ŷܮ;97i~Z_AE˅BuVȃƯϸtA!!Y{s> 4aG%ݲęu3rx]l@W40:ݞ*`CaLN>0tNVlއt/SgAX1UK5`*0}8 1 ևN¸B1ͪ 2Bms ]a1C7y99#.qkϽZ4X[dLůh~^yV+ 1M3No ;$cY 8E)Q"AiD,)o-ܬpND8BlL^Q8?)}l)6$v*Hѽdo׮mҬDZ'8w*-ZMR~=xtpy*xūU_W&-e+Zzlsx:7aHuKwv+}_Fk4\a|ݚ-V&ڦСk (T,*}>*3:(hq_K:_M hVtjighqjg>V3Yksјz"MJ9 kM,޽%TU90Ȧl8?^Ͻ }/&|2.ʀNNIsf YvO-ǛsSR'Q֤X=seiƲ|ѡ}go}~~`U-0d_1L@?RDM_c9ι4*AAL]꣌ٸ)kTgR $A?2iO~6 ʳ;ޫtTvA`h{]z#Н9]xߺфntpppx?Ѕ{P>z{==s 3PKʢ( PKy.F'angular-1.3.9/i18n/angular-locale_gd.jsVmFίYi0-t(8 2F4=d$ޙ5/VU-vygdaGb5&Ϣv:uMng\kgivQxn"7a 8,^ۘ,5<Z@ƣ=sPR)7'\ `F!`+yS"vײoD.%ul*ti"'6W@ }.-kA_;J~ .~Ez3HS*5L%\L LC^;R/wӄ{U(OxeH|Ne]u ?5;t =8 {=pq:}`~3ʏV!i9WZO 5si-]MS#13tܻLlo$f d;"P0bȢ ˾fYY#Q3!X*\iD}Ί%*,XP^Zlֳx8Uajuɹy*cXTgj%̯*ҼT E4kFx䔹SqS\M}u- fQVJcu#{c-0!r񼡊M`HDRrBF t~s2Zs2rn#sܜ_zlTXCͬn$yWN{Ag[KK-.1R,|EʨI;UKԢ+OԔ623cgdY|~YMJJ԰,>x%)>O mfr`ۆ5/bt襟]o}v~`U-0`_TL@?BD%M[%.#5ֹ4*ACxG݅ql1R]μ O-)~O.Ҟj"Q^O"M:{,ܺ 0|/[W=u^ ]xn/m4 j]O7NT;~zƿPKIV PKy.F*angular-1.3.9/i18n/angular-locale_gl-es.jsVkoFίi~)((qH1 tEwhcx ^۳'iq}1s)4K}֝v ra{!x7w$.B?,:K`}sn3rp?,g5'1FXR G⯬/ٞ-"&(]Xd<1ӎ*.>HMIH('@QH0?|;Ȓ,O$h&( `ιӪ)CSԠ*L ,2M;X*̱Ja (l= PilWsV~񨏉Ԕ>LS@~=F=ڸb|SLx:5.kۺZ9RdM+ca44 0Vwb9W"i"d\шDqÂ˖9-;f]!6-=klX9U-J N3 9u$f{>|urߥpDjM) 6A7uXxޕc].\g⭌Q%2Z&!2XF_ Z~#x*".D֠ɜk16:OK\Y50?m7,LogT|# 9?afT98 ,psl"/Za.>LKlz/nzEci$sà @}m+[M&m@mg8,ӿsyůPKyBD PKy.F+angular-1.3.9/i18n/angular-locale_gsw-ch.jsU]o0}WXQE@} V AIPE[\0AN +}!Na9;rNiY$b[I19X.pL&z:YtCX iw>a:?E7v)YGiȷ8"[xw@ٻ/c7­}lmp,ГX@a`u6ecWIyҲ 2  i#nX5=Q-ު4Ϸb՝JTҧR¡Y=fs{@^y(;c95t1^ dHȢw@A騩3O 3J7_9Π+C?-pegD / ˀ /JgX3uu^j ȪhȨWݸ+} O-[ȅ'Uk)'cBT$2zln $d ?xƐ&E-幑L s-XI,˞Qo:7N΅+pҢvu{b_U a# 9/t'+LNjkBYɶ1إA2yEYZQЁXfLvfsUŞ(y+NR x]kUT K)Zm/Zǂ㸇5QkN4+n> 1ts. '~|˻oϻ PK!PKy.F+angular-1.3.9/i18n/angular-locale_gsw-fr.jsU[o0~WXQE@} V AIPE[\0Z 'q.I=ls9o"!(I9]f1oER`S!1u?l-]Jb%"1(Kthl1G㧉k>{o;ݡË:d !Yb&Ґ$?{Evm)-WƤkcQP@gaY硁чۚ6}@môǶbe4K0 rrMuO0@Eo&jz4Y4MwbV}NNi%QS)vFP/3= B17 ژ*(X2E dQ#4!zi:iLŒW}JqOSM\љƼP : 2pmqY"+P W(ImdUTdTī.ܕ>N ,Â-dÃ`Keâ1"K*"\lNu =N rѧQV@=4Ya:?E7v)YGiȷ8"[xw@ٻ/c7­}lmp,ГX@a`u6ecWIyҲ 2  i#nX5=Q-ު4Ϸb՝JTҧR¡Y=fs{@^y(;c95t1^ dHȢw@A騩3O 3J7_9Π+C?-pegD / ˀ /JgX3uu^j ȪhȨWݸ+} O-[ȅ'Uk)'cBT$2zln $d ?xƐ&E-幑L s-XI,˞Qo:7N΅+pҢvu{b_U a# 9/t'+LNjkBYɶ1إA2yEYZQЁXfLvfsUŞ(y+NR x]kUT K)Zm/ʓZǂ㸇5QkN4+n> 1ts. '~|˻oϻ PK]PKy.F(angular-1.3.9/i18n/angular-locale_gsw.jsU]o0}WXQC@} V AIPE[\0Z '-}!Na9;rNiY$b[I19Xt.pL&z:tKX iw>[~:7?Ev)Yi_%?p}E^ݵGS f2":ׄ[nCX@'󣁐Շ[י<ߵ@mvǮObe5dPfrMM@0HGϢ&Wjz4[4_b՝JTҧR¡Yfs{@^x(;co85t1N dHȢw@6A騩+O 3J_9Π+C?-pegH / ˀ /JgX3uuNj ȪhȨWݸ+} O-[ȅ'Uk)'cBT$2zln $d ?xƐ&El]&WXua$eOht}oΨ7SWN\}w8ciQX}C0tyΗ⌉MW_E&mPVm#L*vaDc^,(@d3&Iҹ*bOB<ҥQnCKb5*qaХ-Ă㸇5QN4= 1t}. '~dˋoϻ PKOȓnPKy.F*angular-1.3.9/i18n/angular-locale_gu-in.jsVn@}+VV!N6\J2FMZK c'ͅ ^ǐ}%vgΙg?^l7Jܟ.+^0]@g][)!" Lcߊ?He_k鑇{7VԮ:ƀןѩ35Xb E$̧f{ ¼ aPY5J鞕G螛ZbL]]v i:QzW{\@)tHp3BbU8mn*Fk,FN,Dz"е3?q%ֱ9@WBdf}C qfYr(WRNۼΧQU 01&S2ž%0h_>U ")}"頭3YJ\-<~^-1A9qHƨ[Roi:\^kO{*BpbLY$>-r]w \ʺ˙CP}a<|d׬^*{{|tkr,e\9]AU'9]G6| 202!ֹ,Szĉ=a*0cy%K?] $5xoa;GωsT}#$Uc0R+Lin F.}Oq-ynt:zZW(+JMԌv{YyOrSiF_!*I?Y"_oϺ!0 q/ Y"X&4b]$i~RB#bd=9\׋3ҍCHI,XDEh[VhVݪޘ`̙X3fd,8mZY[m׋Ƶ*4J! PK`7&Otp PKy.F'angular-1.3.9/i18n/angular-locale_gu.jsVn@}+VV$%i.%E&-ƀ%_¿wvc}%vgΙg?^l7Kܟ.+^0]@7][)2 bߊ?HeCֻqej]cO6lXv;,_x1o"z 3z3'aa^ivtwctM|)1浮/2Jbc(-.QyOWp:" f'*pe6ip]5#'Y Q tOp|XlAWBdv:)FD!䘃IQdݎyOwM=99k`BGc-L Te=Ka"о}j[DR(D*頭SYJ\-<~^+1OA9qH&[Roi:\^O{*BpbLY$>-r_u \ʺ˙CP}a<|d׬^*{{|tkr,ve\9]AU'9]G6| 222!ֹ?>wZnЈ *#[ۓ1@34!bFw,&QnrNJ~. ;b0_=dT'#Cq+Ѥs67yT<Q,Ub5`)Y`qr7PV!8D1f{>Sbj-:ɓ91Q=eir_aS6C7u JxoȏX֘1 ~ckcDFrV4?| \;xoBCA7zP$ek"$В){5'+#1Gmd+Ӷqܥ ZCv%#\ph&5MZg&X&۶nj h u=R4k 1 a1\T%_ JԨeel KRmZDaZ\ø5kuPDь/aӇ=8=JQ#JxX{\r1ݳ"p8ϡ>Bri%hrWbUEl~H2ޤV_+k1 9ɡ{nG5?ftվWϽ_hFWR"R=Ffrw}-E125imyFZD\5@NU:&[0^CG$?;_yFQ(C? Vxj^Bų 3hJ*~m)jWIerS{m\j'[(ˎR־1z{^:'\PK2&PKy.F*angular-1.3.9/i18n/angular-locale_gv-im.jsVmFίYi0)v OSE8_8td|hz:mڬjB(6[%癗g^B Qa'iP4xtIL.|}ğf+Ғ YMu`*7|[5sT99(\FHE,[ އlBBNzǓ> 0l)rh~C,!qfrGF?C 1،<4v#5`~~ 0<7`ajzk.i+:ĒDjB*Y }8 C;alVӅ*QఎHU49iׁׁ*A+w_ >bh5>$q3ָ1wt;ܑ4UQ3r b'UVJXcjOi!S\4Pu !;XSҰ AԼD͈T̟4BO #&T]̋kJ*XB)%qu1m+K᧴b= Yic~ $-M,cٌdyʦ45bݐ]Bv| VTcv}gȥ~[]!}eb"oHN^q#eqLhD:K &A *Q!~5>KNM~w + LF`9烜1{p?9cylzZ\I{+߹@B*m v|o՗-wY:QU| Lȷ[A'N>=-wF Qu:&S0^CGiv4>A2+郖KI'迕T *vyG db+ƅ fijk^a-r#JD.j[(CWܙ{nj.zgRZ\ˇGPK]a PKy.F'angular-1.3.9/i18n/angular-locale_gv.jsVmFίYi0)8'Щ"/:2F4=xmVhr!Yͭ %癗g^B ڣaaʼnG4xxlHD.|}ğf'rXMu*;=]5~T$蹘($\FHE,[ |BL^zxSە>ٖ 8j)rivC7,&QjrGF?C 1X"0V#5f`z}aDym~=ZV[w!eO;)D, F-b9S鮡8`~lkŌjpU&: 8|<~*T&w :;S)h!8!G g$qo"578Fαn3Vưl2jґW4A2JIOZ3'x(q^d: 6,p!(){z2B}/3tHzZŵ,z!k:v/Mgdm9,܃$3BR7aR&y {'Q6֛.\|8:VٌƺFljK[]H/z+}?or߽fWggcuٺ Q8x:FPY)c ힿ9&k'ڑ>Roɝ de/RgwThW˱\2.KR' .1v+Ȧa kg 4\*5*d:Kʸ*۪2+郖KI J*?vryG?FEe\hBdվy/w$r>Dnr[( \Ӡ%c Y/?SFwPKn^ PKy.F/angular-1.3.9/i18n/angular-locale_ha-latn-gh.jsVmFίYi0-H t\0ǝ0F׈f\(6䒨JX;(FȠe/>.c}""9Q-FR;cya{߾;ϳz㨒unjOnJYsV[iWRԭQ.#Z/ ZKʘ| ph P{QCMɃh% Z{T 2T8t!IPj}֐.?ڀ/O =>?)0E=b^lNj0 иs5p½4?Ebk>N+5Žۢz]}8ON=>PK͞PKy.F/angular-1.3.9/i18n/angular-locale_ha-latn-ne.jsVm6ίE#]?VU !(d{ XuۣR;ܶUUKDyO2 qdDt'Yd[|HEV>?zsiAwJKiZׁS VYq9 /*"V]Q>4!,cE?@)E_neQ.7v'Yz׃un52ycxX:CªTq Klcʣ 0#Pn7tC(֯p<<1}.&Qhm߃0w`=#(F#>~A3#?aYkz<'\[d8SgtS Vޯ<>TL1]@vT/hN9ZFrɐv ʹÝLښnFf+ f3w*5#OR4Uf5'2##/̐LdkĄϤ0YhAxAcZ-C }w'k2XzFjRM Ț) gڂi2du,<£\\]؁ uKvƘD;*]0 QohU. FҤl:6;"/޽\r_X񯼥CH`{g-⦅Wwrry\o?)0I&Zd|pzYhL]5ƕ\.jFxoBq2ިvRGpW}Շ:Oo!򈩫I>1 㷼CH`{g,mWwryryXoU_S{r Wد=nUive-@]25ྭn슽ɗ Wځ7\q5Ԕ(C מ3_"뫘l 4lTafpCcR8V+4*Mmyn,"̤`:=# .C:6NZ?'6oCrKAYXʱT4l`)-|Dyrא!x$wc:6+%Guv?$OvDM (|^ ~)1@7yus$+VmZcs& s5(HF-=%~D7jWgRi֦ɖj(\+HF<#<$vqL>tK1J[`j6sK8B\(E]aVs"*(3BsX[¡f%UOY;|ߝJ~W=2э7]*cҿwJۮK'\n(k_ẁ]1<C/ųg$@ W\ %wKQ09ZPajIzvVg*te!]h /x<3'P .;tHۓ^年 E6ӣ/Bc)4,\ (p/OtQ3}x򨋓Z#&x>Ns•5,IF-=%~B7PauҳC4kuNdKS!a$'ZA a{L;$!eice%x"N:הÄfAj%{in ͅqp`Y5u8R$O H6- k`4i $K ȔfױdlBrqua .=X,cmLTti0͆I2꿡U42+kHl{r}cƿ S#}R~qo_}qTO~3N7]*ceڥn0ouqTڭW}}3`W5eBL\x劫n)Jfέ,TdpC/AI ]}jH[X> /PK;tHWWu`x#1z884@J.lD5)-*Ga0=. Y0FDC}>:Cϳd0բGڍp ,WFOz9CנUv۾oy}|ǎ>zM {ihHC6e5 -ZGFJ#pSٶ59Ws`4- [Ui$uvO)O9*L d3L2aJ/8'IʧA!\srk.!)eo\-qu6i/PKPKy.F(angular-1.3.9/i18n/angular-locale_haw.jsUQo0~WXVvv{ѴE%$ Ar@G!nV\m tw/}֜,ǭ KJ˙&2iE3 U2#XyTG&re뇷.K3rh C.l(DmEr*r]6(-VlHw<?f)Y0= J sxǷ{ohpa5ϐ} dA}iZ"tEUAeEQEA& +!XaP*_ ,,,R5B8nľ]ZP j0rK{RU6†a{6!\`7'x*tA;`El+u08ƭ&E |)s,ѫ~5А8uƦ%j%[ MP &|gFL\ρTjf/luo3n`? Ve<3}D3-ԒewN*TDioJdOҌO5\pIB./Iødԑmar",6,~3;B`g^6 g$Ip2 X #7 up٧[S^h(RHHv5lĚsӰ&=|q/@+G\HQ~i|gó9%tj#Bdceoْ'|NQ2`LG~fM1dD˿L<5[$Sau-Yd:a~c(Rmu 7r઴o+cj =_pܝ-?P0dPѴ٩$ )(V_GjWoA2`*.?+[r>5Y"ҋ n5{dzgNuOK.&~YF* 9@1gGuJ5 y8}F6VW*l4z{ VBPhQʴhT$\#e{L#v/bMǵ@}\( hWd_UDƎ*ëQg/ 'S ,I.5Db#Biv 쁍F0m6% JZUU'ҏfjܸ\fK+%=*w:yX1fs~NOt-^+1E-&7\ΥӁmָ8-pA_1|6V1a|E S& @z%0S݂P4ydԐYaE:d4f4ISH > ?!ȳP[S.&m;~ M+ ``ش\qNGXM)Z]%z808_9}hp}Ax#A8/<>YW 0owxC6x-PKyO PKy.F'angular-1.3.9/i18n/angular-locale_he.jsWof u d'M?e:R-LVym1b#aap:w4nC {{k$QaԷc-. nOyMyE˚ml&7fnзcsS7]P8BHǗ($+GZHI~gW%ҰI:RʮȝB$bVCb~# y$Ѽ_Ʈz5i%I9w@_d Ǩw ^c(R [UטvL6誴k+5E ݝÆU*v/TѴTE_6+{nWT=g"+դqX Dž{ʀwE\Edxɞ";p~vS߿1EǫyOxCּwKSXA]sK;`C,/(N2q6VJ&);uUF7ﺹ>1M}4Mg9m;x \Lri+N@_b}`OY2(N]0ҫ2)C25xGQ"ͱY2d翅tRRE/BHۦȳP[sx%m<ƶ?)~hT. 4}C+k-'| W&->+G O+h6My$8eGaPGbnb%J0K k(Tl׵o#K\h K@Ehn4CJuGbD 1JηL2:nVcsR 8G0_Mc5Rk:͚5EF^-e6y6Na䛎Ynz3hɺT@ ;ک+;$2#Q@ =Ϸmo3"bwbnzRβ tRN*q ?w Qԅg!usFք`Vo*۶mX]:f4Nkz.l}8SJR?ʥۈV.#oOyjٌx RņH%}TE졇4~]Zg؏PYY{T$^EM%H}3J'Q[3r O¬@B/͒¬V_󱵪*1 PKcg PKy.F'angular-1.3.9/i18n/angular-locale_hi.jsVn0}+R[!d-,M/R(UlPJ I;`ڗE²g\x0[zd&4=lUhNR c7 #%S'*y_9X$R,GG\vL>*/NBwC}7mgeX&Q޽$^׀EQ/=UT~e|lwGZ7Emg/QV Y{q =xBKmߚgm{4!7?mM|%P"Tp:fp3zPqL{Lq3:OtYB(~8o척b:F`6;̫h$iD#Nw17|5hJ*7rב^%auU.%n Zڢr4K7O!#{U1ly%MFw&K7R+ױ`[9#o R˱B5f͚I"s–2|?Me1/&brOMayyeO.o0M{1呤1z.&(?0>y{k2_#\y83f>IÓÖgdDnU@1#ߠ hȷvn$/R *a`a!7cwZ:Wi$IRLubTQS>J(W< ,ָ)aLjD0 h*ڦCJP/;ATqi^4xx^]|ݘ[Y{*+O~OlۜO7~orfN/,%[,Ւٖ1aRQ52r? KL+C").JAS0+AAzUM1>bmA%!Z:-%|uW~Oi{-?j&hw~g$,R7Lx>_ҬfkT㒍5M]4a5c~ Π! 6o '3۹xpti?q '"3|)x`V8a-WC*Q$QU׏ǎZ}g5 PK" PKy.F*angular-1.3.9/i18n/angular-locale_hr-hr.jsVkoH_q5޵N#d]yRG Vn3$0X#mgp~hpN;O  Y{&ٖ0m?l!Y:PHhcC3FH}um+d9z& 0"tm~=[V#?:Bnv SA*0UciTaz郐Ӎ\>tlk!՛t}Y(pj].]~nׁg0;JO ܽ#g^㞿Ė?aZ ѽcݥ6(Eƕ9fBBaV)pG;O:y{IY<,#_nMdTi4M2Y=SCWZWˬI{yE7-NY'QR$JLQFa%;O rdXKt}r:wܗ -u@h.[t5Y"!dPY PU PQ PN PK PF PD P> PfAEg^FA,`ߌM6/Wcy5ttǃTTU6Jj 㲌ctmr6i,6fWߖ\95n+vfM.l/_,Bc׵6^|Q523o}dӚ5^PU_!),Xl.!އ6>bmA)!k-(uʖ؟h _a3ӣF~^OZ }.ږ y‹Uf5] |\|m E`~g[%47}x~4&w>f <`3 Fp!3xa&| /D?aV&B*Q Pe׏ǏZ}k5PKa" PKy.F'angular-1.3.9/i18n/angular-locale_hr.jsVkoH_q5uV뮼#d+o7lI0IE9sg;"#iλÎK7EZ{EHTn_nOyqx ΃StSX\]1?_Ӟ@y$i ,-0?OV"~cԴO%vxrؐ 3 (ft!VQ-:ծEJA= taH& 1;|\q&)P:1KUbҰ%AY`}`VP_qf5Iz.}\RU 3=x[ݧr%|CJ7,p߄|˟0r\ZܶRT"ZX ~A3v!Rۛ0+eؑp dǩ+, vē+tCH^l̊8wY3K0tu&(,f̟K[|2kap}e(L`dyY^x _,룎ӹn(\sm-|qq r Z 2 " µk0ɞ_/8{m1vӞ_/e Y+ _##EꮏLcڰKʴ2$"=i f%(H/ !I5G,m:$dq~SN-+z{vkV7[?7DۦU\% '.SƧ4ָd3 k#MX-} GGw8߂3ho x~4&±̶9e4<`3 Fp 1Xa:|G0pR˕D%IT {spb?PKz PKy.F+angular-1.3.9/i18n/angular-locale_hsb-de.jsVmoFίYô`Arj%PTĹD'zE ^9{Z{r6քCk yY{g2"^ALpRʄ[>IՆOeoPd"X v 0yx8gp\;=#TR[ߺ9[| )a/#s}SNKZE$aF@P qbon:͖ZHFtz-GÄeu7h|ڬ <+3sJRm0UM5h`8[b(f4tW\>tHrҘnpY>`12Bm3] ~@?nӇ ^"Cs6$;Lk2|;a0%ɨzOL]V3Ev{.B&V[㙉K*-!ؚ*o&fĺ%;ʂ 6ÐU_{Ŷ !Fakb9ƣάpM$fEIU\,*H&^̎R_3,6[ˤ&RXګCNs5IHR[ޮ1Yv` G ? #!u~HvaCkHH!!5)1$ՐSCB: 4$ѩ$!7rjC耇Um%-eJX;t<is[hRWqZ>W\Q\w=Ya-kReƯCkoGwG׳S|]߸N;Qʶ?ljF_˜ G殣6겖bR&XUrLɷ[5Mq>]#Lq3@FQ9JHa'=tPҨ.:-% nypȿWӭOxޝ8TyG-D \żƮ1TFBF5q\N!|N8c<278OxPKr"[ PKy.F(angular-1.3.9/i18n/angular-locale_hsb.jsVmoFίYôĂJĹD'zE ^9{Z{r6քC2"^~LpRʄ[>IՆOeoPd"X v 0yxA~3_? 㑋g*JI)oOx-{ ܹ)VTX~C'%-n"NILU0#_ b81 qd7fKi-``.-:CÄe noyk6xΑ*JT5Ul飘]ær#Icf׻iUY(ܬyƷv@UgPv-T FM6{=G ِD➿K0u{$fM<%~F3gt?\lM3V ?UZ ?3C5 UMu+vNm.0!pvmB_s>GY0I|:ݹXULtfh-Yl2IM&ۥ̱WfMfkk.*ӻ݇cAΏ~4G$3Cϑ# Æ5 $אZCBjkRbHH!!triHȣSo#IrC OjC耇 *ٶΖ2a,S:w4Go48-s+.רUXh=jꞬҰ5A2`s{ա5zppy/0}ȴEL!j= Uo kX۹pb[}gft!7ѷ0 GZF`!On8)6|J+=\ڮ$LY}.=fD]=⬚5;#='L' ?7i雃 @C 'IV 0y`%Hz؆9Ⲃx[#=&S۸%~+tjVg*\=嵖kAk SJkYPAfIq5,T@Z< qFA^Lx U0c5/Qhԍn6r*U YbM̲{ y jS֩Eմܶ`-,0SdւcofNDS7d>UiVSӾX?SJTY=E-!=0¿ 5(BR2ELE1:i\Co': +郖gYR BZ^%N*KxxB pIm$!g8-MDqF {OQtu:D3ZS[p`?ϋ o{^PKhO"PKy.F'angular-1.3.9/i18n/angular-locale_hu.jsUQo0~WXQvCnTk%arMȉJى=lH|>}>S,A 0ĉ#rfMmtqd80g {^[[fao֣k^%@?L{GƎ"gS VL03t F鋈p'-bŒlq!ѓHBȸk\g5t!x5y'M|1w 9^-u-~ni /yާ^5D|2ǕIExߧ#-iN40%=Z;S}ĔrώѸBU0 5}=ki-g\QҜmH )k(M ?xR3g2}'[5tvЍ FZ vvI]t[k-%$̃ %)H@a͒j6Y fx]@[/dNQB7>j6&~*ѤL)l.u p3a,hf *XרOmZ]`LW>>>F 6YZbq.ѵǞcD[Wl1WiUST?SJT'sՖV_ckj^S!YO)̙}L`MtnʷIA˳*CINF!-J }!FqΤm:e 3DD( E'M9 -ݠ_7PK+PKy.F*angular-1.3.9/i18n/angular-locale_hy-am.jsV[O@~WL Zb$H1KHBJߙsf4$[s;ٳ[C2/h\6+~:-c?%YPទNoF< ?cggQ2Q Vysһs[v˳_=#kgԳ۱G2)&$|N3.wm̧x sc٬3k~\R;V!ĸg{7=Ng?T𻬟xgu?{ZcѨ~B|<8X Il!8 t6r Vq 1OA "T|xR"2їX'g1cN:ZvJnǻ֋cmݥۀL'sO JbJ^L|L&6f-ZkS5 󨟃ib#0Do c}kwZ%٬pNoBэ;%$$=}NiE^9[n׳U,4+!}PK)况B PKy.F'angular-1.3.9/i18n/angular-locale_hy.jsVN@}W,$F-v ! $rPJrc'X%rl({ggv%j친=svٲ*imNòQ;V>?+a[MvyEY&|Z%E#ec6,]{cO!{f=eÁ EQ ؽY|^o0,GpܧKkm3[aZѭT|l0f^}g?/=:vFo2OgsENB+@&/%RD&5qpq(Q !~{N~E)c#ϯbAcL<ύJ Y$Ri#.d+=Avo{:X[vb*f kAV6ZӜئ5yL8946J|(b:G,rHmURK! O} ؒ' 7U-'C?xѻSfME@~t;b ?mt  *l_?1&TLH3(z Rw1fdm r"CDYGa)01>x6bULОYGaMh%bXd.\F4FY%uƱdmN`-un$3 7EYY-kk|Д*,Oʊ758 ?O<~Qfz;W5?<IiKJG pЖ|IE$+w a[ڮ)(7NJZ\R?JHLV0#_ Ȋ"X uh@j8-g`FcaL١x`2z|\liVgSAX*1UG5a(S`0b4tP.X:8xn*} .VcOd<@UgvT Zr %BCJ \7Z#5.qkǾZӊd̝#h&Xe Ij Ct Ŗ#.@zVN/n2uH8땷ԋy$L6Tt YnB2ŭGBt`]1E""Ǫ^4+hx(T_a]5!z\ޏlV4Km+ v Rj냄B')k$G$V@ZV8$ŝ` | /#NA(%D"+ \Nd]?ݽ()/]W+KƤ}[w8/n]^-v۝#~W/ŵHPFB7sϳݕ~;ˤ~6&[6V&xk4X 5|M4OCmAEZzٶtSK_xL~Ԟ/V-;Q I(łxA$j&69,ҬK9p6QDNj8O[(C gjG~3Ͼ6,@;gܢ$=Jr8䰧Ĺd 32(~[fBp&jl 09 և)$bf! u;՘g9 12Di2xn?`4*AkPN՛@E *r~ܘt\Xcye?nudگ݈*=rVk*Y+RzyoyԏDeFê|XCoib2_‚Ϛd JXG4oOPetP(iu-W1??;ժ[|{' $iQ}eY,8DKQr(Mk KMȬ&^2pPˉv7S/ t=^~GL#-PK=2PKy.F*angular-1.3.9/i18n/angular-locale_id-id.jsU[o0}WXVhRVUCFKt!VE~ا`(E*O-cRH ._є6zlDM"E%_I*Tw='to<]#Ds%WIkkg2w*")nTB'iK !܇-q'Nk 2! >h ܮr~` v% cinÔ`.-o4K cɌtYzqá]~D"1AuPF$' I^CX ئdY5bo.}V÷ʚ @QcA 9 1Rib@K@F@DHZ:@<jջ^4Ӓ.H O#WW? vxz^I"%T]B74zmn'F\l[%\WpK!ySu5ݷ~PK:ļPKy.F'angular-1.3.9/i18n/angular-locale_id.jsU[o0}WXVvhRV'QT!&8ȉڊφNZm scʒ:w(OdFE//2cg'7Ŋf w~d+]VFUޡΎ LCf1pbg z%OL{.,2TްXǛ)T ULu;uގf=>;!Ԏ!q_Bo쐀(x&p^@JR$ҸG܆-!]Zh89 貒]~B"5A#MPV' H@DضbY +v-!+LChkeMfM)uɷ41  m e"Fz q ]od i``.Z'%Yڥm:U X[#{y+x`\ot9!u_06j$MW7|az"U6%CwpMฉ@uП5۫c7p0!'5zCG[dN]\ +\i"9K}lM7t$7jѹ־z3%TyoVf~ȋ ;e<=ek%~6f8T/ĻV` (c]oPK-sPKy.F*angular-1.3.9/i18n/angular-locale_ig-ng.jsVmoHίYm1=p/UL(d&6V5[p]z:38;n)4Km$FyHu7T—^쓸\x9fAU7q2v { pӴCОibn3Ź3{ [ù4mhG294m0aFA1o Oo$4:j/7G Cl=`:j >{':EdbT5ը{.B`}`lgDt(>6u2O@etkv x)JbNo sjSsem6$fl--.~A3~ic2n)-$auuS_ aI$NaN?QF#佮%DZɤ1Gk%[sY-2nJ?'!•2\Y2g{q,ni;iϫG?<o.nxJ~%W5D;K^d@KSFRj'Sc_m>]/ˉ 󅣶<p_ gqeE8rw$.s+M_x |3~^h|5oѱuE}|PKHEs PKy.F'angular-1.3.9/i18n/angular-locale_ig.jsVmoFίY\@QE\eDт`F~](VU-fyq;OYlE6ibE46А]ƫ}'?,Yb8 >Gi| Kblb.B= |jo=o2P(&<+>َ%q*Öe "&pghcC@ V=umeyD%\;+`!lwaت}j.i`9PEST |0sLy Ίnֻ{Y(W})d~.}T&7 :':*8#.g4qrLkLp5sܥ1$fDDL\"-0 Cg/5D qscqVG\u4^B,iZ+gUƅ)LI6ekUJ7oPj_7yε/RlS4.KXdqEj;nc""p\ZQi6% phm6rypZO+m'ii)Kuɟ\K9]'|  ^uBۖl|Q(d R Nx3BK#"NK_N;]Wz/$•:Z+ Oݪ@/g#lwJxPxu̚*9*T-r{ (uPetsZe$RR }-A-ʆj=ZT4<5v^2oƨńtח e'wB0M 2} ǛU?FjSG%4=`498PKmh PKy.F'angular-1.3.9/i18n/angular-locale_ii.jsVmoHίzن(:q)b@ƹkhmb^#c;m)3~)619gޖi;vQ讣&x+lm6 ":r!X 3Ʒ}+?1nZg~XO$ >ڱqg+FT3&zCv5 簱+{I"QĄ("+,ܑf$š QZ'0DE :he84*Dm k9&W F t: qmKH2 t=u}WHlKEYogIHTdHk[[QJw ! :"uѾn½{+ZG h "d/tj/1=( kPATT W' [ U*Q^)r*Yz>+A5-}>3'a  kP jP {5گUxG!EU\Vr:7W6AVyk_fism_6EK]=;.eiۇTҺO9K9]ǾXmͩF!mˍ_`t:nWըCWdSSF)wG;V]_FEV?܁N6Ҍ0d\K,˼(>&7:QKmAn1[h@cԌY1{f~{ʼnQyuϿ^|}~%DoUK),´<4 !ʣn]|yi4ۡ}!*;>'K_]Fb5^?,\o0_sx 7;Un]*gӚԉ"7p0! '5zCG[dN]\ +\i"9KB+ؚnPn6-ʣs}f8JH>H-O#? vxz^Ic%L P4Wb[-*#R ޾z;w~PK,PKy.F*angular-1.3.9/i18n/angular-locale_is-is.jsVmoFίZôBs9"ŀӈ^h^#ͬ6\?gޞY{%4is`b,6kbu-Y6|~nG[%2#X -av{goGC4p M{#NL"AQ{R;¯{ !_6kkAL+^ 1QĂO zzhH4訽N@hpJACk]!ڤS'؃<1bjTz=_p]6wA~`tmЫմByO Uo1PY*] ] ^ۂa냇}v˹id1)lN1$80g=*v(c)ΛW11b\TƖwAv˹m /jCkfYBSXZ8IRx1 P͓Le,>:d.{<|V(K]a2DlT58c32c }?ŧhX"HG,d#򜇑9A^ʽU@ ߤ<|—m2K*.*h^Ŷf$G*혏s:Oe$H&!*PX Np`$>& 3-,܄/"H GH?bT'P b(8N@T6],Xqi&^mp b˱hA$Vɉ2䮟䝫+0'rjc\PMQ-]cXW48P=ӴO8;6'|aQ—rQkW­pnH.|w-͆cEߺVszQ0(8u̖5S] @FPz (j˞v DACxyTn0mQl!%:d.{<|V(K]a2DlT58c32c }?ŧhX"HG,d#򜇑9A^ʽU@ ߤ<|—m2K*.*h^Ŷf$G*혏s:Oe$H&!*PX Np`$>& 3-,܄/"H GH?bT'P b(8N@T6],Xqi&^mp b˱hA$Vɉ2䮟䝫+0'rjc\PMQ-]cXW48P=ӴO8;6'|aQ—rQkW­pnH.|w-͆cEߺVszQ0(8u̖5S] @FPz (j˞v DACxyTn0mQl!%jGqtQuK}85cF?A1X24V5Lr0Q{Q~!0nX<:;>{t]{1<7N;Unٽ^iU_Bz.>^ˈMzȰwgxta#\5jF+|4]: 5D"=CQgO-+]4Y4#MSW88$MymN;jRʹ^_mW4X#½yA~Zg_~hbrq/PKiRXĦ PKy.F*angular-1.3.9/i18n/angular-locale_it-it.jsV]oH}W\YbvB'PbS"ŀӊmhcg${Nwl&݇]Ksx溝R%V-£,& mNlIL.|n'E *&m[9&wӉ|YxkJ@AApY77|3>O'*øeCD5ݲĩu3r ix@.BowFRI6j70ƔG z׃uh5}yN=$N2NcjT,;!4tW.X:D=f7]T>6hp@UWv jz#G m85%cZѿuǛN5*HF]ZfBk%au@$- t[ JVxD~Sy9%DFw1g*#9ajB N2]CB"#E&Y$)RhB)8v4 ضDK-<|duo55Bv+ dHy)FR䲮*YJ@*ifaDQ|,/ $*b#cpKhD ^`6%(M{ih,)OB2rn u4i(uݔ5wpM>]?֮N#8 fZų~,k2}K g>bˊVUɼhXU| L54MN+=P?'Y?0ƇoPKDEӾ PKy.F*angular-1.3.9/i18n/angular-locale_it-sm.jsV]oH}W\YbvB'PbS"ŀӊmhcg${Nwl&݇]Ksx溝R%V-£,& mNlIL.|n'E *&m[9&wӉ|YxkJ@AApY77|3>O'*øeCD5ݲĩu3r ix@.BowFRI6j70ƔG z׃uh5}yN=$N2NcjT,;!4tW.X:D=f7]T>6hp@UWv jz#G m85%cZѿuǛN5*HF]ZfBk%au@$- t[ JVxD~Sy9%DFw1g*#9ajB N2]CB"#E&Y$)RhB)8v4 ضDK-<|duo55Bv+ dHy)FR䲮*YJ@*ifaDQ|,/ $*b#cpKhD ^`6%(M{ih,)OB2rn u4i(uݔ5wpM>]?֮N#8 fZų~,k2}K g>bˊVUɼhXU| L54M8MxPKz PKy.F'angular-1.3.9/i18n/angular-locale_it.jsV]oH}W\Ym1[B((qJqZm xdϠi6k {\B$ۨExDd1-݊ ՅlY0 ց]+'wa2osoC^99(?B=i!}gw<[=iHLr8cF 芘Fz<۽vGk$U`.}aLy.`0j[|߯mU[SLS嘪0 0}8 0% և.QqM>b5:oœ=w12Dms]~B]>Wo!rgob;Lk]27p=ܱɨ W?L_X]pD0̪nr!C!5~n*0!RA܈Oќr*O"dMhg^eD9' _MUHk@—JqHHUUrIJ8⺞D"Ų^SMֲR(%Ǯ&۔Hc ӹ矮C FCnAR)Z H\5Q% VW H^% mUլ:(xDV,xd u XhנP3L$q/M^̚Z%EcQHUFэs"& e#{fwW;;sfr괿}bvuLn\ogs~N;[<ׇNy3}JZ.`NKqqZ/e9R'lCrۋ L)@eHXNcףQPP C9 }~!4BI /_pp> wKfCÓ ?g'oNٿaBY0a۩6lhqkpoPKl;@M PKy.F*angular-1.3.9/i18n/angular-locale_ja-jp.jsUmO@ίlLV!*$Rb81d]ovovK-r gf<(Nk'ǽ # ַM<~(bu⁝apa譲! Mngfv9[ڍa7C3.¯i5X`!yv+ zGe}*ء75#=ȯE݋[H wE 'Fն؁?V4v^t}ܗ~8hn޹Rr}?,)3gxU[12xI46̗ӹ.^:ɦ#Tc-qcIV3tҷ,[:[OWm+o ɯkF쒫;#tZ5r`@& {&<+Gx\B3_(x-fNGJ%dX_\Gꉜ=E2GgQC70J) /B&&O޶=Up PKZyxePKy.F'angular-1.3.9/i18n/angular-locale_ja.jsUmo0ίJm%Fy -h*VC391];IN>.!~sws躙#.Xĥ8^fW+[ [71v65ah2'ݘh]5TX`1!z Zk0GwavUCDm3&.WnsCwfOS珺n6niCM,_)Up/Wm?AlgI:\ڔ+m$JmM*Ջz"C.]K-n21ٔ@% ɩQdzB@xh-bS9a1,>Л\$ע-$u_p퐈¾zU؆?VTn/?u=j;ܓwvgۨF\;t<*,2ǑxUڒ[12`}SI:hO棉&^9"Stx20F1:lj m7[m%o=z##Vs=ZLEJ Ч!&< G]9ƾݗQ[JcJd.fa8(O"匸m"*}8q< V|Ũpɋg~-ȣmo nPK_8PKy.F+angular-1.3.9/i18n/angular-locale_jgo-cm.jsWmoHίYm1- jN1%R 86l7 iofNlNj ;/3ˎY@2j2 3Qw&|Ɵ*õg2Bljk_ ib6 's2qrBHޓ|_q0@H7'ube۫ag 2;#!#I}vAIShuhECZׂNU} aD1N20ZcWP j];6;t`m;Zeӄc(Ɨ< '+7{5`JU9k5n]Xu:"t1}53W~1 4Z~3Fߚ)]QdA/hF,׌}||QkuNw ?Iat-m1 :+s{4jP-;Q`͕d0 .|<}FCCs'(9+4dlvX` KOMe$W@>F)^hJyd{v!WAr(3Č1^N+28 P؛cDΘXD`c*;NZ o/_u+AeF?o5Q_~n?wEǫ `d0).pl/ YhѨ$ZTZ[^ &a aG\iQU`,I/uapix0 : ޙ>87wSR5 'sr9-B:[n=,RV3=.zNØ-wL˥Z j) Ƣ<5JAA,sGYIn#-ls(|#=D4FgƴD7Tk˕ToYsMxݧ'kꌱ~qGj7@޼Ɩz ?Ji7 n鋥m=^/PKw"Wi PKy.F(angular-1.3.9/i18n/angular-locale_jgo.jsWmoHίYm1- jN1%R 86l7 iofNlNj ;or۱\S:%!wVXTF)((e.(K0ɍwm@;JG<(HQooƴD7Tk˕To+<L,fQًSۓ5W?׵ uЁ7o`?yCϏ;'6`u_OǕ޶|{PK"f PKy.F+angular-1.3.9/i18n/angular-locale_jmc-tz.jsVmoHίYbz@'PT`#\E(ڸזpqNyfq[d2EH~oEHuT—[h/4΃xmx3uI ǸvpϦc@{iD3$Qg'Gm5p/MGMU%) 3 fd'!YQ %mwvGjRE@GxaHwC ǭcﯙκ'.I1ueS5T <FC]? oB1=a̓QC3xҮà@i C1t5~NB3V#?`Zmct,nf;᮴QA2j kiI .p|> mki."!Zp"NM ^0w$i6W0bhc QaJOlv,hBrT _d\+p+ukHc Xk"+ 5Y  Yͪ=S)ħ [y F0f~eq6-4(FYҤ]* *ѷ-u]D.M ݰlJ[XL?qd}Z[2Mɕ\JMѱo[IB }R> do>'YǤiwI:PIQN4'PIϤCZzYt&UK_`@Jhhl%QߢM?Z"ٮvs[QٿrKUM&r[Ky/_BqG^ev[F_*z 1>/PK+ۨPKy.F(angular-1.3.9/i18n/angular-locale_jmc.jsVmFίYiΤ$@;td|hz:ז 8^k@~}Y{|2Lت(ިkrgJ86$X f%káwu0<]~oĂxH!I>?ϟޱf+{m|䎧qتÖ1_ 3SP3 .!( I7u݋6iR.U*D\ `![Kul561ED>$)ΐ211UC5laSaz?| /]>tpu@n:(}<2<~.}T7@vmzmZ|9No>򈡫us*cwX$rhFz9Vi ($tXhݑDI"A ^ w,i67_01D1Z4q3QZ Lwi8*LVeRKH=juϟdY7 <+s;';MԪBRkAJk0&Eʗ} 5@kpN`V;oH\AjjV03 6^؀`c,u*"B{ hePM(Mإ ".Ne}qޖЅ{Ҥ 9RSv|GwkFʡ޲1G7ؗ4*Gw~JF#FTW-_ZF紧pѽFфVe5~m}g]@axlqY/PKs9PKy.F*angular-1.3.9/i18n/angular-locale_ka-ge.jsVmO"1ίh6&jy?p dYb8%dܾeWO ڙVڪmBi噗nbdUѬmVtQa^K2ZlIl̩ 9;< tVDYhrd ˾?&gOk{.?d@ x VoI> BcnV}ѝX\!9綃+ϝ^} S8NU R8X-u cXO갯o`L7<r( WXOLMK)XRhvSѪ܀ ,ZqE^t^]1LHc(:^Jx! pUzM9=z!*9Yu@/1JKwKF/|ȒZgtsL(XL>fu:zɾo(a>ތ25_ o驆7yf3 o˟*xUs,](W̄ѨL:tNtR(b h |uWwY^:y^Q+h` Ki"*7w{n=Ǟ0{vܹ۾1tSUK?(mYC ZA=}!0zAELy8D(ԺWXC#l1!kp\SJ [T% U!)p/CMHB›_3T?+VODE~ >`r<ۡHԚVI,˜͢cJH4'{)9;# 8S{ ͽjs]Y7+ _PKcg PKy.F'angular-1.3.9/i18n/angular-locale_ka.jsVO"1_lLԄ##I*&,eᔐ=Zps ˮkgZir oٝrȪȣY۬颌üdٞ.,S%7svyvQA鬈tOs>ɠ;[i}L\~R\ F 5{ޘ0}ANqrgݬ(0.;BsmW;^+:7 fu:zɾo(a>ތ25_ o驆7yf3 o˟*xUs,](W̄ѨL:tNtR(b h |uWwY^:y^Q+h` Ki"*7w{n=Ǟ0{vܹ۾1tSUK?(mYC ZA=}!0zAELy8D(ԺWXC#l1!_'˹F.JB&R_H,?7_3T?+VODE~a_;˸øidb,ZDs3Ҁ#!9+<_|16ו~PK>+=^d PKy.F+angular-1.3.9/i18n/angular-locale_kab-dz.jsVmFίYi0); TQ03 kDikΪF Gx~h-a<ϼ?;n]o!IQkR _&qx9[AtH;gp0֧k8i9h4s6P~Ic > tBD^x>#Mc!Æ#"t&*`ĆDE@7͖$4 1[CÐMo|uֆx>lLC"Uj~S>p&c7 ^ WycEpX6~Md>tv- JN> 9U(G~xwrQ34)I Z TݖݮZɟjV?^r( V=ZU1_۩qÊ(Mq/W UXUFdU%gu1TEg~| ÔF+Ld*_bS.rä*Zq_Nʅ#<F$AAȾ>KS|\%dR#`cqU+A]!Hv% ǕVބpD0U^Z0fipÿJ#kڰɤEӟC+LjЬԺA?=IGk-CK\w +5M-(զw`95.K;OHⴑ5q9,дeOn.QA \rI#6Y{%u|'d}fnJDoT@F7$gS&J^p_4xWҶ 'R-SZ:CCK$ޟ𯍕/&QU{Σjې'$$(.We/L<\V2ow^ⲽ[ (/JNz.?6xxPK|3C PKy.F(angular-1.3.9/i18n/angular-locale_kab.jsVmFίYi0-G\*SES΀MN9^_w5G<6O)YlEؖ$ECkl{oHH.|yjy l1%ցC+' ,hZ n}IBDPdXO=P wj9'{vdrlL7ADTgml@T0~zMB30Q{Wf~hR͞ F':Bw N2HcjT:~n /]>tIԋ7uQ(/XVeub ٥*]g#F~(Cއyr|g*#?`Zmctomq2w졻ɨ [_L\$Ӻ Q 2@J\n+H^3SBr^$QS.5;mTE#{NLDloN@5"=8k*b<;Qhe4Zc"_a\qvt&E5_Nr*u.I-@0j'r D5\B3*i&BX Ak9$$&|cl@֢1Js>*k~OV4YUUu>IVDcBKBw + M#(fo`;5+HHⴱ5q9,te~!QA Z ]rfI#ҶhZ /6I 52nIUU(ACx}ь2>CmAAZzYtI;k_PK#´@ PKy.F+angular-1.3.9/i18n/angular-locale_kam-ke.jsVkoHίlB[ZPbDĀӈQ4cl#?K(wl& Z1fS]%auꓨVSUapE|~W(\vV2U`-52>Gyf,v_5c6F!jΦ.BƭHr_iߦ9G%.¶\ü 84RÆpk\ҕ?VGo \t]f3[mv-D4I#*O}։@7*\ &yD: ]Ua]6)]F-twYNLfӆE`0W6YH*߁˵'Z[eȰ{hZ?ŞEwV67x53PEs/ix9DiJ<a)['m p('S~d\c$\O5 ](F! ?B>rzN\ O"3P"_ PKy.F(angular-1.3.9/i18n/angular-locale_kam.jsVkoFίvjU8q6(1X%,wlO<6UUK<9}3N" Q:=jI<J<*lsG.|{ďfcqN:v VJBX㻧Ծ̍\͘AyaBqk4xB'l-6qaC+v|E*0 Ñ,}n^ÙI@E. 0DEM ul}VY] 1t=(P)QrlP o;ZC۞0^M>bg*wA]t$RU?w\=CHqzCZ/V1t=7Ty P?ʟIӞqD6,WJ< a%{y ?p(#sa?rAK QFTd Eho Ï0%g捜23u-LrԹ +RNB I~la߳3Ku.&sZi#PH~v%uEG 0A͢9{}E jP wA?Aޭ^WυJYsc4upTfqcM CMVO˕NwMnu<ڂ3=1 vfݏoţl /,}:$*%ڗ zxf潽(S)(/! *-+{>HyV%5* } +LG.cFxějq8wK7 ~Ҏ 90ucoBj4O=.y~9[G /PKK{m PKy.F+angular-1.3.9/i18n/angular-locale_kde-tz.jsVmFίYi0)ȥ:ULN ct5l^#cQ{gmלSUK gfN=QE![E~uI7TzZ>G{ bX kf=< qj/ Z QOR%>6>o9(D:K$5iS˹Q{22s%'0+E>N.  Ic+ЛLҤ< JX/eJwYfj;+M*W_T* ݊Ϙ~) a ʑw1/kes-4ӯQ!XAR#+WŜHDj>Mpeq4unqtǾM5v; {fR PΔ|w [|E/Bs$O|f- {lm.KSu<ޚx͍Դs=]r+4{=IW KUOC<&eSNhG 譐*Yu*M!<=CEd|'ieGRgANO24;;,̕Vzj[v~T-!~&'vjy@ {H^kZp-liSXڸGz5#{PK> PKy.F(angular-1.3.9/i18n/angular-locale_kde.jsVmFίYi0-G TQ0;aiDiװzmB1^snOU-g^;dGaGl7 "6 'Q܄S]i&jmU)s%%b@ւC#%̧K{8} ^ 0Yo4 sf(BFq>JE=Z$=[Ö>Fq(Æcf>;] f4IÄKt0ILU6m 9u21PC ] n ~!C냇}:) /F~ܙdfCg&fhM)~B3hfeZF[-rcT)s"!g$Nʈ%.[V)*DK _D,M|b"\Ve,V%fMϕ ;gغZj.^($Fo*ZjL^*QVb\ln]ί.yJfuۙ\2 6תNޫϪ*jR>;D>L.aI#y(^ 7D4,5/q)XAZ cV%ILj>mpeq4Maqt'4۾w; {nR PΕ|w |G/CgsܤH|f- {lm+Su"ݙx-t =[ ]+4͂}@|DxLx=Ю;!S@A7(թ4Y"$ -lO 8[ΒoL]?]^|0W6tBDlu{mʾ!A.jƻns@dKH^Np#/iMت:DreGPK  PKy.F+angular-1.3.9/i18n/angular-locale_kea-cv.jsV]H}Wܢwh'-W1Nj LvjLAB}R5 4-S i&.k[2"'i.ّ]ƋHr+"|ׁc+'Vwq:w8~\gw*\,- WQʐ=)~n}>=YnĄS+5ٞ 4nU!ٌXL9ml@Ugܧ_le4 ;' `ap:>Mޅ=NQ2JciT,Sbqc%X.Injn(}l n=YnĄS+5ٞ 4nU!ٌXL9ml@Ugܧ_le4 ;' `ap:>Mޅ=NQ2JciT,Sbqc%X.Injn(}l n?KO?ouAzzۿPKrnq PKy.F+angular-1.3.9/i18n/angular-locale_khq-ml.jsV[F~WYI0 h"U*LXi ȘD$]t8z7]x>v+7?g}8bKUPvx v/\x#._⚿%`ZmZli[F)ɨ1h.p]y$ZKMZ*g(\#qYE0^OD-$v5HEU9Ε2™W Snˢg DqBKŔgJ\TM~M;Qa Ya44Πv~$ njG +f~PT8)ɥ#\ Hm)JMϱZtHR42X ]OD3,ϣ]0h2(TӅ'GA0Br̤Zio| #FcC{Xij!UWUX/dcb}Xo-p23pSsrkA6WJ/r*P\8.fTou}T zW aT kf)sZD8_+u-5R-kcG^l0WxdveD QlQYjH39Q sMM'^Q(gyӣ_z^}W+=PK-G PKy.F(angular-1.3.9/i18n/angular-locale_khq.jsVkFί`Z@hU`JkiDjc=dCG&u?0{ƐG1uu|UPj3,8U9A6WT{ެ*fH2\tSC>dK;9}/!<ɾ* RrzXŹ7ek 0*zҹV2gzFO]k?gq0O t+O`Jv~iO*YnIagry{iܟאܚr]"ow 5CKڹ>?PK-B: PKy.F*angular-1.3.9/i18n/angular-locale_ki-ke.jsVmFίYI0 HJ* ;­ADiװFƆ$Y㵏$j <ϼ[(䋨ڭP=6=kby,Ǵ:|~b;HEg*;={q3p k; dM@H/L_3=&=sO7ɰo Kr c%l}mu!3QbA2#.5M.uf&-!P+hk@eVBO׺C7!b2CL .1w`]J@hj\j>Iu|8|v*]4麀 q5Z5xJ]v8Gt^3e#?`Xmcx[gONdȄH3䣍xq|ǭ .ZbzHz^>9|}HRPc#K ϣ/D7"cӾU2ix\ٳšضT@,|VKPX48;ri{*R5Tp.:+Iu|8|v*]4麀 q5Z5xJ]v8Gt^3e#?`Xmcx[gONdȄH3䣍xq|ǭ .ZbzHz^>9|}HRPc#K ϣ/D7"cӾU2ix\ٳšضT@,|VKPX48;ri{*R5Tp.:+׿PKқ3 PKy.F/angular-1.3.9/i18n/angular-locale_kk-cyrl-kz.jsVmO@ί4&z "7X pjLm 6V vgvqu;3/;Sv\dQ_lk^:+c/o$YPᖑ.3ߋCNoٟ1ϳ(iE[R֞ /Nq3!' -Ž@gOg; {It-ܞp!̍U&}6dn2!)^;8f{hkxei{|Mz-D ({o "/XҀ+VI HϲS4B4# $zFI!Z*z_ khz+t>ԣWV18GJ(&ZLA Ԑ(%BVܣUDUtw>D { ׼r>ѽmizT##X*S=Tς%TMnUD .dB3 3 -ͨ7pܿ:*G06?0CdhhN\0:L [b5I5T:Y@b>E@k@]^CSwɰS'C%gLjXQp%3 aw$NjGn@! ;\"4XRKTy+-zw8V;MlkJS{a+r.`T0I܏C7•<UAhHeH)| ׁ07bRKTuDjH- ji<͖9H%seG+SGM~nXDX4&ic*4tW~8zYA1vW\SZHžcߓ!UB?զKҁC %x(Ď6T[ű;8/vKZ/*օَEx8B|, ҲAwϢ3\L|/q(b\b<,BGGq<2- ʴa,_fI < i[JFC0™'-̟ wtޘl:({?ֵ⢮[ˇB ]Ml۰ тu{.l)z YJT*AwjXRQ^ACx|G'YI@@g)YtYJx ȵxVzuſHUosBmBSG,%єʫ `,oxA \D4oد_P_4 uxijb 4SY/W ++T$mLn˯>+2W"?+*?P ۳z;; {O4vCiQ:p T%3ؑئxKt??y{AwyޖxI^`zں۲X^2%%u;a5[Xw;Yݐc낉/%4PsY\WH0Y%_B;s)Isa$m+B]hfA8a}{N-˘O֏ɝN'ӱwcLnMc]K.*_*ض k^}.-X_xƘ|dsF zKy5z2(C!h󨣻$+g"r;,78籠]\woWWTE;'tyѶOBME,%ф𲫦`$xA o[Dw4ׯ{ج\k_Og^;T=,:arzPKm:H͔ PKy.F*angular-1.3.9/i18n/angular-locale_kl-gl.jsVmoFίYôw@QEs2NOE6N5Y:qw UUK yfq[rh[E2!fLm6[Z]rݖgE(E(Zk]vpXyۇw>ͽ\wǛFyBT2Wr>ow2["kS1bCjp8%In3UCD?APJӏY@CowS!9v"`8n[ ߮lօl+sVPB5LB!Ø.B> pӘn,> ^᠋.C46AuOtR0#(pz#GL]_D%wk]y{_ZdL܅/K&IB_^ =!YD=g{YqFx_ LGBNII2h}Jx"O[ COIAѩpngYaXG`"7<Ȗlj!ɐ$kH'̅4t+hHg55,+> .:E ؚpZ@ֵTkm:IB4-OZ@"M@FڂjYur dJ2'ƔLU .f<`rsXTf?N"NMƅBxn+P:yis\̥La^uf_zy3+W>ד.鍋b,[|wZۯ;̼iT=V~?7 VS'#Wtځ7Lq54F ^R;JPn|}<:uKGj9*_+ۼā"9E&d=v5kJ.Ýyn#ںrP}ܵj)Ǘ ]==~}PKB PKy.F'angular-1.3.9/i18n/angular-locale_kl.jsVmoFίYôw@QEs2NOE6N5Y:qw UUK yfq[rh[E2!fLm6[Z]rݖgE(E(Zk]vpXyۇw>ͽ\wǛFyBT2Wr>ow2["kS1bCjp8%In3UCD?APJӏY@CowS!9v"`8n[ ߮lօl+sVPB5LB!Ø.B> pӘn,> ^᠋.C46AuOtR0#(pz#GL]_D%wk]y{_ZdL܅/K&IB_^ =!YD=g{YqFx_ LGBNII2h}Jx"O[ COIAѩpngYaXG`"7<Ȗlj!ɐ$kH'̅4t+hHg55,+> .:E ؚpZ@ֵTkm:IB4-OZ@"M@FڂjYur dJ2'ƔLU .f<`rsXTf?N"NMƅBxn+P:yis\̥La^uf_zy3+W>ד.鍋b,[|wZۯ;̼iT=V~?7 VS'#Wtځ7Lq54F ^R;JPn|}<:uKGj9*_+ۼā"YDrLeTMYWKm\Ʌw0ϭctQ+CxBmĝ^UfǥǯPK^v? PKy.F+angular-1.3.9/i18n/angular-locale_kln-ke.jsVmoFίYô]U8(AiDhk޵5\wbh@<,;nf)T&l!AeRXm] [*dƆ$0pGg}sݟ;&#'* r##gBDn,WMQ+` S8V 4)M%6fR,`:=cHy W}&os`9( R,ud6̰8]b !D16|:bk{mLTd~ׂkOm G1u9]X|e+wk[y3c=c\R*v)HT0]fd)KN%a5%c۩-XL[OQ*aq{x7zvJJ$7X,  kfJ٫#Yk]i"0rX(x 7Je=on=tf(DrU\ %8T^9H\U{h"!US mN, YD9Z't!\ƝAo52yD,SAu`4`f3Nw"e'bSI߄ȷk\zЛh[_M=h- Se&3HHTVS/|>v{Rձt!eZ94]Y* H<ʯ=`$؆W͆HXe(e/zJ4+T/2<ϕh4p1 UWM,lz=v!:<Q6A%:;<yUG'* orJ~V­j6Vlb%1=8~DR<%O`x}F(xPzm],R^`ُ~BI(\T Ǣ(6]DlCJ_3.eչMOagHν}a7u-g4{l{.|0&)ԶKdy跌"2RFUB5Wpڮ7\5)9 &I۳}iWrZ@*J+<2-ANv-M^$+`z۩dP >g܅>h8c*PfD1tQ&>)вQRF > pVO lX0"Un0MVBAyҲS  ̳x+,"ͻ/tє|0.UzD`(JvyG}0fem};r6az3߿˾Xer.8ᓊ(\䀪/p/ x(x+Z$(=, %-p^?&(NX;~[fn "-bj\Ͻ76 uЛF'5< ޭƎ%#u]~canma4UcP<)"#=O&1?cjWJk@!U` 0Ҡfesh]EW9A6B[Igf0y sz W~SGy7ذU:[Ů%XNnaDۀhg][vj)PK#$F PKy.F'angular-1.3.9/i18n/angular-locale_km.jsVn@}+VHI$J W/8!R E4Ah}X4ήTUߪX²gΜ3;kv?O=fdy@Fyhy;4pﭒwaGNAa;Do'{]KS}aW/Yp8,wd~̞߱`^B<&{Ԋ'нdC_ MkqՆ؅ y난{ ϔmZ+8{NLY p҂ HRRMq9)!ZU`rZE 6 ǻ|&d/5P*,4/wΘ*-46h$AL:WOJ,@Uтh  F8AY< #Y, ͓zeM@,o`;\i, !FSPKЧPʕrC6閽R70GwXlVn3bekIw zSʬ} dꚗ*;'wc FU\m It;#7:Os3 !٧S1e|F1z8sqsYZ6K,PKML܈ PKy.F*angular-1.3.9/i18n/angular-locale_ko-kp.jsUmO@ίlLr8/ҦN Yۂ}!ۮ,,rr e癙ge;b[#ńjI8<6I:?K0c_DYz Cۑۻ{yic -A=&X;P_w|= _ \HHޕOR t/q.kswm ۵zwxl?g9BFO&WѠ7:N=> _I@?:a{$lN zɯe+51l$*p\D:IբUU@r\UY2R+>_g }Re*C?TzPq8>'E~GDֺ(kA&6qοID,4hNtl%ؕ^>8O-[y/ Ҩ-!Xt?uA<-z:9q$ٿh5_ȑh]NLwNp>!c9x\g`B~^PWL(ݠBf(`*| M!A*qx-*R0]'ͿJlEz=1QzΎ/bFI'PMQ( Qίf~##DÂѴz+kJjnm_PK*_ PKy.F*angular-1.3.9/i18n/angular-locale_ko-kr.jsUmO@ίlLr8Jb))%Cֶ`c_ȶ~3 U\5<3lgE,硗wj,Yq-N}4YܤZ'w{K>>sxy&vHkόz]׼ F&-)x4A - `B̒WpM}ǀUV=H@{Q{z{}˜]ڎuG xhZ(IZ&&WQ5:TOO=$9GXI|D?:a{`|N?`zɯek51m}$*p\d:IբUN _吹!(!b5`K9m՞2I7Pe*cGH?|.+:FIuljMh&/ 8CKbX5c;YVnZ7exǔA/ QI[&C)Bc|N㘃d6XT4fo`CTjVW=h@]5:#P(|üQE1yəW1d kf(`,\h c*Lq-l)#[J %)U?4Κck{^B =qH,1,N$]%0cBx TdM^Umuة PK=8PKy.F'angular-1.3.9/i18n/angular-locale_ko.jsUmo0ίJm%%B F!(UTMZߝ!I˪i{9C$yK"b\S_DMǢϡ\$^QUq2;YW3!_B=0AHޡ"AҼ^0=2vO}o0WeZ%fQNV-ZU]dj U ɢ(-q]ێa=Se*coTUƺ(\D8Wu*fXk!&{I 1^B> }t ? ʰM8jK/U9Nbq BB}rMY™ sS;/!C ]ֱUR]omw ,B!TE5jAgr{.;g{2餛~pʦt('+oGYU`J9{eJ=ŏ~P!!(_IXa (}m3 iI؜#ϔ3G/uV-*uwʟ Wzv%]pUu4x@4!N5D(@/џkom%tUO&֕'wFEM?Ԑ=孆$ޜMzUGi%GHt M Z1B2qVHK26\dK- '^5 ċ b>wU70=~_/9cCPK&(5 PKy.F(angular-1.3.9/i18n/angular-locale_kok.jsWmoH_1Bm[wmlE'CH0ikQa08m}7; -PꪽEfgf֝mg;viu:I?,dozR?6~Vi3u; ondlga͆ }-gS?bƽo"}K-#?"}aqt%q*K/U9Nf| #2xm$wpI?`q~5f S;(0D`u@J72BM aD`j*Q C>nQ*.Q/x<8XeU颣*Yf8ҁQ{ayDE{'̰O¢ +]`kӸY^HCJ2j}i^8|h}ۤ}ŵ jIy'0jYwIh}zgIuVPHB FEh%imnU?֕'wOJ[R#"o5t%lj_S=Vh@ԒQ:ORiy *j"Eu%VD[+ikU(eU*ګFY'Ġ&F4ة_7#eQ+W%"_DZ^UhoQM^9B[2J{9SAܚl*YvamsnZ[ӱ!*Gk:xUcք+U8>GY90pR%pp"&1[. L 6(vP~JŁ" n')yog~qL/n 9%izkmXߎ[2bi3My8+\^k'΅1b^[y!ض kZ\#i>sZ1B2qVHK26`׌gK- '^5 ŋLچY-4G{χiƛf}y *<{{S9<ŢvMK:D?PKΜ2 PKy.F/angular-1.3.9/i18n/angular-locale_ks-arab-in.jsWmoHίXY5% (:qi"ŀsF6Xؤ)wf־;cz晗gf׌ϒqnEwTE,>]vVFMI$ KVLcXKV*wKR!ޟתp?"j n By.Sz™CK&<^OE6֠D!1Ь ԺVGKT*د qeie =n7u uYj'W~-Ui<^-g4=sdGB)7K'_ѢM6:>:͊lC5I!dmW∧B9htOeԩ2٬X&UN(E|+޶$JE$"NcFYt]n".3:.7GŜdv-ߨ'jLzFnh!$8#kN!B7C>vtG\.?a87+;U `+ :E9PKزe!Ebr. x y~&/IgBdi*Y){:e Ġ]^d. InO3;kx?*?%eԳmGT,ggFN D*XO [='bQi֘q"tS4æ (`Rړӫq?~*Q~Ei]V=AO"9V?߹I'߮|P S 8_g_[i- @ Y+]inPK~65|d PKy.F,angular-1.3.9/i18n/angular-locale_ks-arab.jsWmoHίXYbz@yI NqH1 \ŵQؤ)̬;cyff͸#o{%.ϣzQ gw*t?* 7 n"f 5UضZA6>);g? keW' As44 bDFK#]f8CjW:҉]9g 'pf^*0xWV@aDRꞘ;_FZ+ȉ8S{j i #@ҮTǥ*,\\!1ڀWWܻpm  &jM5)P/qb}Ez6@|~FlrA4]Vz"jyYO\ [#GbQk ȓEDy*\{L6E@ E(?)$8^k ^^;P 9&uG\FcwnDZ'a>647la?ǙyO>fJoWXPK}a PKy.F'angular-1.3.9/i18n/angular-locale_ks.jsWmoHίXYb5% (:qi"ŀsF16X/)wf־;cz晗gf׌i8<;+_5p,]h[#هIQ(pSn'^\VcƊ=nl%8Q!G/{T$O(u`F3x,fMr"iׯI ,?9fƪ@1CI ؕj 5g2h/Y~g w2Y3;c~eW)Zuuc6W 29ǝdan%Fq̦Z(<4+'Q,s+C\}eJBMm{=Bu޾S+?oJWFVdž>0R >T]僐Y1U9-i~m5_\t6]wvj>K%_ѡm6*>:ˊCZI{"fCp88T~}<2o SU*HնEoSY$Rm-mO ΩyD".D;lʲSEb;AEtuYb3Q{ThZ.5DЅ\ۈ -6~'6^}D7PjflYP|œ[':lTO~禾e%i% .cb:)Φ|Cs3A/Y^hM/U%3yqMڿ="OTE`vJh07 m4=Ng:"wy ouD(nw+II)Iijƨ8z".i9 w5E ?? |Y6@KRgR-Ǻ5 B,',S@|Ǐ.͒2KAPnֲ;%`}{Y3˷?0^i$\F?Kx;j &Ez׶'}āfiکCHŜ9]l@VI0{ ۓ"`  #!<Ω}HRf:G2UZiSE"N C0UilG} Tw49|Ү¨){,'P& ߰$cȏ֘~XccHF pXOXCP$Wr}ELHE" ]ge؁8)NФUVIi%4+ePM,x 1A+Lr M'xm9͕KS-Rk@hYm4Hh`Uʷl| Ҭ5e5kr$HV{A؜7aՇ=8x;Q%<-.u1GE,}^0IC=A2ihbWJ?Uo|C }q>TћJwʤZdS}gwgfۇ֑iM=}cnn<7ZjuO{Z|V 2M*X?X{K o)gH .kBNuK%(CI~6ֶ2kGΦ hb4"?]𯍝==~W7KD=)+2fD]/V|2V{ [kMTy C qA^Mvw+(z0=uN,OPKo)PKy.F(angular-1.3.9/i18n/angular-locale_ksb.jsVmoH_1B9}'[щq+ Vn/6, ]Y0pgء+s ȢN:l';ɨi&F>|Ï*͒")A VD 7kYd]opd{4K]B<)kA<+S>bO38!bFQLXnrUnj~.6*dfw)MF8Q!ѐQ=\&c}HRqf:G*UZISE;Lw EC~GlwӇeNid} Tw49 ʮ@kP!@1t=AAęb֘kǾckc\Y9 ~F3u)α9"^&F)o,dLHE[)D3]'e؞8oSI ]Wi%5+ePMѠ&𚦂ZHtL楠sS-Bk@hYm4Hh`˔/ @`Yk4 5kr$HV{dlFQ%<-u1E2Va?qC=A2ihbWJ?$eySEoB#W&uեNnQ5e,o?m'zzyr_o_7fS}mfPyﹷZگ+mo0.#\G_UoKb/ cem6Ń$jPzY#MiJn/N eХiϤCVgҙ?ɻ~ɣnfvǼztɌ)QT[}m^&.Ԓ-E'u<ׯ/;(O bz^PKy.F+angular-1.3.9/i18n/angular-locale_ksf-cm.jsVmoHίYb@1IWPTQbJq(ZM\5 iofm/j }xQଢz:vY|3v-Y+\Kj§I/sL옯"r5`_۱fWv80S}[է=[Ӊ # {GGo[_LFX&ЯeamEʜ2+#!!p:z I`EqAF9Pѵ:ڵ@RF2onI` P%QL wCEwmrMND?dYֿNe,m2߁tXw=:l;Ƹ/lVm4.5v4յ1z(h3P.)w:fJjfݳ/ MUݳS4!eiUxrCo(=|>I%R$Q1!d^\bM'Ƹȅ.GUՆPӄR--Y ڔ4w ˞o gˀLۀgZ< .AL'TlQend#cE⿐grErHZ?hB#n(Ni8T7U* (Gȣ\n,JH*^`'>%uPy |y0̬}:'WM;?sV$)$"#M^:.n AB^j8IA^2'_ C'cNs;=$L=z(`*))8@Sȭ,mYS &2Et뇩rtS(u y*세=^.*7xO^ǤmBJ>֍U>e &~ѰֱYUh^c/_nvNԞʟ9c-~,!pb;_PKbc| PKy.F(angular-1.3.9/i18n/angular-locale_ksf.jsVmsFίѤA4 l7-Cr34x$aI('z1IF3Hܳǡmơa89h0]t<ߌ]K_3ג?ҫ]'Iu\α `~}FCC}?ӗpT}99=>V?wzpą0&N1ѽHA#O+֎PTnj@PE!-7;Y+2Z/DiЅ>:Dpq' F%ߟcEwS؃41J0U4h`*9-]@`}9\ié(:V 7+sm#QF,sȯ@?EI>CuƸ|Vm44n<ӵhjsэ.);v-%ҕkziW[_ -댽3 !gin C*<ȹ!T>?dEyT>j,j;Wh1)k!Uڕ,Bb*Fm 5MR)R0"ٸßN*ζ/LSc/x~]=Wϣ?NO9xxDgWöt'hM~ Xi‘`:GHY8>DxzQ ց:p^~u:t OjUzUv캗,_BR4xDr}62أPa/0=ytQ/Sx"{=4Hpf9=bP7%2uu:Z-%ÜR]i8I,99^s~O,o4O˯%zY8_IiNc>:C%D85K)ړj*ABx$0so@tx~LRTg!IN{qPɫR1ivn0wĨ(xl(+4 uBZ9taM̄ ~ f=>kCngZ =|N8vۿPKhy PKy.F+angular-1.3.9/i18n/angular-locale_ksh-de.jsVmoHίYbz`APt`J#۴(5w%m(fR!w,ayl[, 7Y{"l+"1EDumDT{^~} m3:plH˻3{==&=텉g2I*'O;O/(ĄtOv䰥ٔn˜Dd 32(2~m;RL$ t^CoЁ?C4(f;_֩q.}O0uejF-L L ևvF2MbG*I2@3xҮ?߁rAix7yUTi)ѻ̇XcՆ9ɨ[KKL^j~GOfj]UxSVjr}C+۲KVn -Wgk{ =ދ(%i]O;HH4! JV\B>=5&rU'~ }-7Q_Ύ8hzy~Z'\֧{ PK w PKy.F(angular-1.3.9/i18n/angular-locale_ksh.jsV[F~WYi0-kAhUQ0aWklӈ&,{o3c{tEJ!͒puv""s_DToID>|z<%BVkgr8x 4{ M8zKdTd9lMb¾Ioa:'D;;urlFaLTg]l@VJOځ5=Ih&:joj؃`#4(e{B+;N+sCSL,S嘪w0U.0}2cK,8dz>/ eO2?g}8cUgv=TJ|9Cg$ozɏV2z8kڨ 5keIK[b0~M Sc*Mx(gr+sh23ov3 Esyg.+Vejmw>&\6MVzM5re6ȝ-Fh KY(~/ጾ(݅xc4I,P,3D\bh)_IZs m/ w5;, RhܒC 6$Q4#G3C/u7 p+"v2~(bT Q#Jvj/rΝ=O:oU#+q ]+$$Җkwӹ=k1ͣd݀ll3szkq͕TkcW5*y$Zx,In`Ev450&_ 6͹BJDolVIAUU,AClFE<ڶR-SlZ:CCKJF_j }IڗѵC$M>6/'Ḕs9$qʾ6D80o! 7r%Ձ|cq]OsI}zPKTA8t PKy.F*angular-1.3.9/i18n/angular-locale_kw-gb.jsVmoFίYô@QE貀ӈ^h`^#q9^mUye4'MڣN ]p}u3~w(<7 ^b82?Lƶ9[ZoED!z.& ()#wvbBys"d/" aޅ_.ٛN؇K2pPtJXL iGi}W}ǘ:AĔ*TjTz=_p@^`}`tgnp]>>1|~.=T麀_:zvr<CW3rd8WA5#&8F2o5rVڠ 5#kiјZ$Sal>ʂL(tD|ςNL運ɊQ,jܙX/ Le_wT8-Ķ2hBYH^`6 I*BCJMd7UB=ni蔰_}`|~^-JW*Yx%) ڋev+t9rӞ7]4mWjGcU%0doci%zF{RD՗@˸\!t&<1OArp`4^k̺?,Y ۷n:2fE'>Rtn_rpbn2Fqhn׆RviG*Ji<meT1рn/_/nC~GA# 1yK(JyU%6C,SWR̶GYQjҴJi,U4Jy^8^K`Wxu]5WaT 4Lea!܌xbi{Aq7!Q^e &*ty ll6 qa")%|Hap&e zxjyzaMv#dTHYN񹠣m֠|3F-%_)#"FA,͒&yюK_R(q]L<X9(M=42əЄ Xq/ƐA;VJ4X34OӇl 7l#[`B#M;J%_u",q}}ܮnNT2$nqݮuʎԔx ˄fbgY^>_fu`h-)ו 9kvOT\WbH9ۚReMi(Ӫ+ԕjEax2ům~ Za/ 5fēH# H HیjZ(x0ѡ$̈́oϫv}FgP E8cF_-퇻3rOc[v5,]Xk8@hjo]rz"is^6a~]lFA,.EŎJ_ Rd xE2e2YIcMZ[KRK<_SҤvVSKdgz H'| jzfI0Ϫ KbԴFnbNVO$քO{k|7{n"Hù6lɖ^m9,ʛ SS=rx UL" i~X^mVk$I,O8(F@ :H =Ȗ@mǁUStL tu VU{?.**,[6\e6kG_kݪ2KEC@뀏uDe sljWFghw6{D"gM~A=cYZܘө&o%f*/2 )<F a#*~CvhK1S Ƚ8mB4'Oy*Nw#25$;/3%}JGR?]/oq'ph![4G_K8C30m߇ΛU3tLJtu U^ 侇**X,_4Be6kG_%kh7Pe"]+@@@uDUZ% jjFwh۱zD"g-~B=kZXө&$f*"fv4 ȋCXTN2x*xg;Sl6؞K6\$H>ٲG{z~6 [Do.v ' уsO : X"#:"{krAQ\|I/'ܗk )C$|d&RÔ 䪵 c5؎{thBXwf04PzrKXdDELO=]jQ_R_PY?ͥ\4prsU),2jMkTPD5}b~/ CN1:HߐV :T,Cg( IP*J D K\s^S%U-b "eQQ٫aؠ (}IrNHqBL-| e!⊾n9Z8uy9XmmPK+0 PKy.F*angular-1.3.9/i18n/angular-locale_lb-lu.jsVmoHίYbz`A/E'LIcd;Wqm-6֭oiok;KqgޟwS i;$FsFu70iI\{9eau)H[gzs?zG4{ MbW& 1QB=|a~>}tA!"QxxK>ف&yґ!ٜˆT9 ]l@T ~}kt{B,O8訽h( oIic>`9Tj&L9c+(*,(z>+ U[ê͏>1Gsx®ðC ,Ǚbr'Lq޵e/lǚz6.IFZ[BfҢ8֗"pHYpUJ Qݘ#9Ajt^+kLM9FuIT۴*앷TkDxN&nPU&OtT53ր_)*1EAf֥njF[|eq XŅɜ>UH?wi;1Mh9P ɽ!+mVkED+H?C*2HH"!]9csQ|b4> uև8N*HU`jTzr"ވCP_!8A.}T:?A; zG)(8#3 8j3wews۱&JQ3V?8 iȒK>M!\UG7aHNиZbb :±to5O& s9*A]6 -{-?D oUo(l&^E hQ|%IrRH<ӬѺxoOwkeRcs=ф3P 9+HH"!FQ( ym V$I!ϊ_Vܐ^EBf iU$ ?(>1WvXx_%Z@q =iclᡗ{5hR U1K IB6]:3 ӪˈQQ}q;sܗҗ%>JW||M25-Y(d PFh]+V(VkOr>" ŧjl>_x\e2P` ^C1Ts˂xFI}޶ԙGܥ:1 9d9/åXaUE5徰.gl`׵P2{V__TlF8" W|_َ;j<ʴm[S-H/}/c|iʄBl6 "I 4D06S _xmKIY$̒kӥ;>u+xqB A pB";U1i(C@1ݰM@uabK94[TLU@ȩ\aSV׉)}Ԡ(JeXf4Xgn dE6Iw >MF~1ǚauۘGi _ n ˁ61Cuu2%;^c dR₮epMj}V#]a?dKo-o#Y<,lA.2&|D.~k+jWA3p׽IEm|){̎Jھzg 185N/OPK pPKy.F+angular-1.3.9/i18n/angular-locale_lkt-us.jsWmoHίXYi1Wv]PtD׋ ^Fofm7^fwg^vד(Y\('. ۞o%.%>geR|{t~X(>˅Adtwo=S:4lԌaH`9h09T+_klc7ģ|fM` d+6s7LOa ,)N9s3\bc[ QW@U]M~(E9F0 F2[lyAP@7I0/x nFF48R Pm<|C3~L;Z҈gUm&4SYkxT&_%`c;T㛡a,ܢ%j~ޏx5e'{EcgI $Г(>cxh]E:QD׊aJ{t<C8Za,?[kL-?[ʴ` 0+ip}0A8`:t|cmv!j GYHG=ԌAsF#`E'DŽ~\@z˱PjI|N814| -yRR9k)[+Hٶq,,[I$,MB)Vh؏Υ&n6OX lE箒IjĎw{O6|ye=~gtw4ջ PK`bS PKy.F(angular-1.3.9/i18n/angular-locale_lkt.jsWmoJwՅmsj&E k{f*a  E}ZqI)Cz@Xz)W,JW֭=^޳FRG4=},C]ÇL4=_=𧰋$] D 2/y[җ1kW( |xCä S3߳ ~Ytc`ݔ 3v9(d,8+ l7Ѻ0#w)Ô(3"q<D?ׂZh2 DPi aV^]3ijq4IvouFB4YH=AsF#`E'yDŽ>~\@z˱PjIlN(u04 | -yRR9k)[+Hٶqm,HziD>ŲԡcKlf>kiѶGtE_bwH>;t?2:PKn PKy.F*angular-1.3.9/i18n/angular-locale_ln-ao.jsVmo0ί/Pui A2Ш*N  "s=!Aa8Yl8Po\c'o]>ډxKg vfsi@%Pih&향?Et@ښD:,1Gamz{0i"̾fʶU9kk&P+| t!kXiBm.t|K0w~z Z+yT ڍ Vm Tf#)+,}!oQ= qx,YZS)F99ͨ{0I%u*S3Qvұܰ(ʣf_(etEYbY`J$hpsݰӨ8  02{EX0\osB4.1`|.(qaCiaXEpE0)bbI1`ɓ&AH0 bk_h_d ]KedKvR4p!x@rUק+(0 Tɷcn$3 rSGw`&JTflcaQG̾,PQ!}@{8 .<H"`88i=qy@`d| =ϵ`0!v?h>%]c .\&Qq>ǏiRiȋ0.$Oa*3,dkbX>Z"չkbs~Sih{8*=wDJ =: dFdp B)qTtz(~܁PD4գdڐ[ڛ]PK`;o PKy.F*angular-1.3.9/i18n/angular-locale_ln-cg.jsVmo@ؐ/m}8^YM4^ϘEJ E6]X]Dtgyfq, ]$gNG< gQN(XKfSH܀ zpF8vL~hL-zRH@p"|bd= ~d ` ӌE}`1 M&r^B'󽆐r]1J jCp)}3_&S7uR(?j7_XYLSd:X ^sB/B އY>0 Tɷcn$3 rSGw`&JTflcaQG̾,PQ!}@{8 .<H"`88i=qy@`d| =ϵ`0!v?h>%]c .\&Qq>ǏiRiȋ0.$Oa*3,dkbX>Z"չkbs~Sih{8*=wDJ =: dFdp B)qTtz(~܁PD4գdڐ[ڛ]PK$;o PKy.F'angular-1.3.9/i18n/angular-locale_ln.jsVmo0ί/PuP*5BP:phĉK+N NPE"瞻{8'C(E:vpPsUK%vREs(g~m3X1]FG/ W68@ǩy\t;z?gRQ )o$ r4TaQb<1Ge-Zg8i"ʮ]9kP#| 񠩋H:DiAm.5|K0w\z fAJ 냽n5_XyL3$罦N-F vMw]qY>21 o܈N'e4OpL:iPE^m44@Y--r qyd))D8+Ѡ q4ik^Rqlm5}QS"e6e1m`wЁ>9x06@2R#)},yX"Hb Rad Mlɽ |V8=N Z! .Hxt-EKVvPA  Z C"ri.^ _ u,ho9Oc(éS?>S]Wb2X~ }3QU{}4 kMXP.H_5oզSPSft~kZ@N HzpUd<-ևl0!_K7R h=qo l/'ZschN߉t1S}`Ul ]R9jpB558ƴ!q?;wU/PK_!8l PKy.F*angular-1.3.9/i18n/angular-locale_lo-la.jsVn@}+VV!@!ؠ>PH1 cbdIĿwwf fI33gΚ=Y蠟Y@JY).vh)e0c?dϾˁE9Gg9iBFw{7u-fhN7C7myI"g!}~Ϟ {6){ i#nKM< cBO\{n }~=45VLa5F}WI.Z;  UW2l&G>if`،E&,L-y' Vٔ6_:͌~PKfY PKy.F'angular-1.3.9/i18n/angular-locale_lo.jsVn@}+VV$%@!ؠ>PH1 cbdIĿwwf fI33gΚ=Y蠟Y@JY).vh)e0c?dϾˁE9Gg9vNK4!ٽ~34y6Q޼$fÁ^∳XܐpZg =4zV_7yL%ʦSsVi1'ADrr[>F+mK#>+Qipoppw`Q!F(g$NelA(Ʈ xnH2"U(&:- P!ȬC:@FOyQM"p@]I]IظVi Ð#A.oT|zVAРGyڨLU:_%1n I4K"[igSڜwJPK,t\FeV PKy.F*angular-1.3.9/i18n/angular-locale_lt-lt.jsVmoHίz܁SB#N)dU^mbK&qXCWKq<ϼ,;SiM )+6e$JNcrUkBWbfWBrݍT0>TpYvkEBl Wy\3lV*Ƒ39uq,91uFYf˥M[.1No. +| cnDߢ}ek\mC QoZvAYGs)ܥN?az :%#|*ZtI+N\-ht}j-q}lxp݇` GE]g;a`C?htӰaY7M+kh#QhuUJNpֱPKtѬ@ PKy.F'angular-1.3.9/i18n/angular-locale_lt.jsVmoHίzU2\/6bK&qXCWKq<ϼ,;SiM ~{yMCg хϗgHT\?7YcoLܝ]M'+ܽ1c!߹Qs>%YY}"FvG }~dvD7X.d\QvώX"QƄ("AH_HfG,WL䎡guOC.zkڴ>6e$JNcrUkBW3GCwc(*#!f6]x]<6k+w5袡:KY)7 <}17눦 a{tkaW}uqIe ]5yKjzBLf@2S'XkBexfnDgF,3 `)S: }B&=rR V+ĵPF(xkb*/$X -2 M4ɒځ]̍z,Oj]9friZ?-LBgQh]KaTg27IUTTP. o&ax2]ff "<*ypr2aZxTI5W"*CWMocخuK3vK^,bCW1;w[fzlzqpY}T#{zY bt>E AZLV+۝]rcK2~]\VNJEDO%@Ƀ*ۆF!/sQoZvAYGs)ܥN?az :%#<*ZX # s)׋S#MOQ5%Qk@k/_X, pۨ``&le4~+u~ ~ R;71? VJi mZ\96PKHH= PKy.F*angular-1.3.9/i18n/angular-locale_lu-cd.jsVmoFίY׋i3~HAQEa@^k; k.GkB`^yf6;9mq5lI@#7ũG#kI0OnD|~?>Kc &"L]pln=?Gaiorw\( |bS[MY33mSH- )&dn A~+$* &UY2R,W0`Ib]B:xOxgc0*a*A Ja^&zMB_xrqX>=}$KMm c97zQHYti[#g x2V?{ v:QqAh1FSd:f5 OjpŷaeJEkj u]y7 g7x2% ](i.@닧%<髲0#!֡s0V>ȮܕH"J\0>js*߈7!Shw=[!ׁ8`E[6w/KPNѩ1 9kEÇ-8Z&ةR I-|t lXlF-7<-YIs[LPngq<%&<ujat˜4+xwֻ*sJ㶗ް4R2'6Dmqofگomq4Od9p3u_ImOjW#1zK+3&<ҵRgML(¿"$=ⴄkTD['hfi+˞-Kq^ZV3۷P=\ȷlsYǫwW`}exjp9oPK[ g PKy.F'angular-1.3.9/i18n/angular-locale_lu.jsVmoFίYô3~HAQEa@^h_F\;kB>,;ñ,Om XD^,tdK"OӤ]aBuUV{{4-0^`raP '{nbBy33mT; [/x0&QS^ED ?A B-}kw%rRz W  1h 㮠?lZ ߧ:B)Bg̡ j- }!\B`}`|׋C7t}Y( OU7HѤ~ׁ=(pz𱏘ZWDrG&8F2K9kmP6-#keq3G`֭(mԈ9Cc_YɱpdY|*.VQ_JAM! 5=™qLh.l*J Pi Old,LHu,xFٮWB!_E9|:L6C|#rܔ :8<|׳rVܲ 7P/x Xpr /NQYV[,>Mm10NrU(@ذf> =qZB7*?LmDc;-lzB.Rĭzig ۷P=Ʒ|my`eexjp3PK Ad PKy.F+angular-1.3.9/i18n/angular-locale_luo-ke.jsV[oF~WYŴn_ */vH1F4Q4#,>B|sŞfRH-Ax$F*.^jmڻMl%?ˌ\X v$0. vY3Mbt& 1Q{ȶާ[X4Æ$f&]E9M,@de|E;6[B,O8訽NChRdk_ƾQZm7&A{P jaz>ttWPT.:$[w#z5mT&UOu0[kc Y*]3 T JbNo>Cu 8wi5چ7eQcS[_L\cj㽧a<"<\ !|6d [so[UOq=7ۙx7jvB4kF$x=#\^Lgw󷨟Oxdd <_ I^[ [B_f;q\|~pUAyfxVYIznc<*iܨ>sUpTAItjξgceoq3PKAd PKy.F(angular-1.3.9/i18n/angular-locale_luo.jsV[oH~WYm1[BݗE+;$#cmM`lF7=c30&B|sŞfRH-Ax$D26^jmvڛul)?狌\X $0['Mbt 1Q;6ާg][V4v$f&]E9& 2b0?_ov-Ih't^EBhRd+@ Fu)"TRTR1}.\0?tIDjL: ko7z@JU7v--x[ JۢN>Cu 87i5Õچ7eQc[L\cjýa<"k hZYIrnc<*i\>3UpTAItjڱkbže{§8[29h10&Qn2QÌ ~66 * ٖ~sow&ްoa#4({_ֱd]H>0uԉES5T 09BFC~2M.B1:ɣ9t12@i2]~TA7yr%8HnSFڱgXU$r? ҏFWJ*0Z7a*MEFM.qxH?HR ;qw_5#}ȚC6{|+H sRD4%y+4~ Kk")SW@Օ紿VQ]H|$TC2% uJ8Mi\+ISdL H)% KͪESRPyƫ [p{Ͻ]J+B?aR_n~ _gKcm͙)'t@ nUN W<}h'3Tڞ:8q_K:UKg迵M%W{7Y5{-n]}Oc#xF q`FIZ.Ŵq0E10m%ۃVQ.Մ`-)&hӂkf&ODuS]^e`F h1*J[?j rĢrA\ H.ySЊAҔSdJ RPp;o8xa.^NElX\D"}+ |8IEI+]+([ҜWwo\M]GM+ݰlX޻?;Ot޸2ě9[O97A_꧃ƴ(&)~ǔM~ziuՊq)#MdF|pRBMi8i4v_dƗkOƋ¡_#-'fn٫rV1Yf#ϳ݉\hy>7'J1v*QH-j* =44K_d9í4!<jFEI%К%Ӓ%ܵtܵBR9_WcUWyM48rɢ1aW}uutb⑻@T2`3^+4!X(O!`ehɠJٴ4Ty8)JfZMeȏ%6t6x?\PKz,j PKy.F'angular-1.3.9/i18n/angular-locale_lv.jsVOF?bj]/,JMVi0N")Ch`|1YpU-ƴ(&)~ǔM~ziuՊq)#MdF|pRBMi8i4v_dƗkOƋ¡_#-'fn٫rV1Yf#ϳ݉\hy>7'J1v*QH-j* =44K_d9í4!<jFEI%К%Ӓ%ܵtܵBR9_WcUWyM4h(,3t}?wRWgiA%NAub <=-n&s?=KL3ZL/-mj~C's?0Q3̀4!QH;d fϋd#@1<_}'fiqIV*@PkU* ^@ dNZ@~``|юCٴH' G *Wɓn-p$Y uF~%G~c_/YCz$:kپF]$[a!qze[kNj = Ut OG ZkGx̏ƥB ݩ>\ʋ:%*j ;lQ >V00Ѡ mg4Tv"Q̷s|` yաhx8tẼG,+['JD5 Ɣ a]q}(*{u6D2O|Wq )isq7-2|,dU^Cd[2U(I AY=Q-_DsyU1`RGk+Y}&;ޕ:Skr+/hQu iT9V!Hd;k3^$14(Mqkl~YA$:kپFC$[^YXCwyA2&~5?qaO Ύoh O1? %7S}^1]r=/G epugKUhw*0A }`00aATk9[ؽT#Q̷{|^G05C8:;Xq`yl(Qh^֠'S2F'CCQq$ft1a~7~ܡJ"BV:D%sY*eقv4瘗Q.=)hm%\V_v4v]3+fJ*׹2o\;!ވF9lDV~g7:ɲBD唋 wh]Z)rm=vֹҬ׿<(hDss WxĂHZؕž1r y!~kB-nolEܻɲ> k.z*%kT`M`gt:9>OguryveԜ-\8D-Nk:c7ĥͧ+1~?O*hGqb $ߎxZCEIV*RdkTgEi7J8?&?i] KabR[FEJ3Ֆ{2 1+.`=yo\pe*hZsK^nZ;a@0gsPKdT PKy.F(angular-1.3.9/i18n/angular-locale_mas.jsVmoHίXYbŐD (:5Ȑ^m n5 iJ7ktϼ>3L=O=fI0e _ =Y-ip`5ko+lֶl7PK؍Q PKy.F+angular-1.3.9/i18n/angular-locale_mer-ke.jsVaoFίYô]@Q@62F^#wBVU-7f"aJиFk0]㛻hE5=~78K|d.Ǟ71%!$ý1I,ZY6, ѹcE?AȎ|}f_mO Y*b:zm/Ёo-ׂnvA爩kg4xoXV1cb>lLCFAD_0L^t/.f  *O+1 ec_1YP,\aODH(O ިmL(4 XG*-˝  Z ьyI.eᣢ~J% ZQv5W9prqb<Ǩ1V U K1\Ř/n(FAeù P]Z%ƚ8ǸVͦV1,sS!M9W@|Hւoʈs_xKnoa/IzKR-!:,G$@t尺 fm[-hτ'u.Jgh{TP+}V? +("/yBp#|*]v&ז.Ś.} uz%^^HFP;j=ןPKq% PKy.F(angular-1.3.9/i18n/angular-locale_mer.jsVaoHίYm1-VQ N.1E\/6_5N[Y t@̛y3fu0H_^h mӚ?ڋmeJԏ^b 2v}5lgt.h?X!ӶL4".sH%>4c^k^,ki\v"7PGA#_"-7zCzbK847hCΐw^m_;y&D~cgP2,uհ.sr VsXMbB:oGnbR.]d\v^"wu!낇s2<Ay;, 1C wu! "/&/C;Z JƄ tЧ+e9c_1YP,\aEH( ^m)4 X?(-崋  OZ ьiIM6eტJG8j/s ׶hV 'Qscb1%P8CSȇs1Q, J5v*q(NbX30"<2s4&_fa n@yZr]8]??&(N쫷-WsEHuS# (͚Oߟ9ieoM7"DzZ%~سI6KtbXD>zK[OR-ρ!6$$@t: z=;&[ OPmO2 $S$$ )m? +("/yBҲam-S9rg?==-V3p'>q1Dn|yw+ȼKvrއ~6—/_5z~PK" PKy.F+angular-1.3.9/i18n/angular-locale_mfe-mu.jsVmoHίYbBO)b@ƴ(5bߒYk]U3ϼ>Ɯ$Is`b,\&\3kmzjHuB/u-72fin#4VtA k6 mǣ!2Eɣ__pGܛ Bij'%}{iaLN\0?օH dEt=𧙫7͖D" u-@=bS~F-+])&wcpP$2ARy.)һ]PV>8,ݴ]^(}|g|>^.]@.Ov-z-#vـ2Lo@.xDr|݌)f/GGZcMjf#{ r̹)ů0ZZ~{[hf:+s*1`QMCUͮ&eL8u<1tc/a%^Cj!eَ6] t,c:^-VLh..񵉷˜K[d͖R-X#67DqiC5wCa9e">1)|3rj;d ԋԕͨmOIZzYtrR{OZ[q|ufْHē4=^.asN ~g4ZϗhSI6RH,SeHU \Sw=;pA}p0Yr <׻iӇP/0&|{6]t]_$Z-z JO'<"t9N3#!v1Wqw9̡=9@̔ ]L--4TMLLĕx&!f[2&: 5lYŬ~M]-ж k> Q\zPCyPJ[wv^ IVOQ E9gd ԕͨMIZzYtr?V{/Z[q|dn dEQn̸] oF~1ǚaژLɶ9 گA?21@7uRMKk[x~B7}!a³ǂ4kDdGkqy2 ȒkVgI̒JGW n,V#\Y2kYg<"UR|,DxމT؉)YX҃"J͟3]iR0ӹ\ѻJJ2@k\C%BiK࠲uUפ-P%ppeR,JX(\ PzaEc(,/؂"w-Kc[AU۹5`q^26 o7&2VkZJ=I?V}GFsz>_ m*°m. pY_#eyıI6ˑ.g`EȿomPuRIb |mVBgzAᆻ?E|k.nŽZoſz]q'ܒGPK7fzPKy.F'angular-1.3.9/i18n/angular-locale_mg.jsV]F}W\Yi0-KhU`®րIWl=coS)mU3ؗvJA=jb"z eqh[l$.|~(xNw23[s8r"`;c'p?,5/`} E|T=gFUE3W1 Ooꈩrgxob}',kM;}.| Vְ-nBgO%i טV;1)ed@%5F'7ɼF')pF7b~ DYF4F30:|S* $ZH ǥf]:As^#eW~ı/SAؾ;T$ KQhzSZ^edzP2ldϠm[@cW2ڵۯjy[ b*T~ CE"N CȰ"nVӄ7:Q_dcw;MtTV e~׀ioZ0=qz=_;'q3#bX_sp'?zM4̬fE ^wŖo =M)J$.:cDixSWPFABp&=JV^Xɸin` Ꮖq@c#PA,BF&'COi84Y U UsРrE4xE"ru4b G^8K Ua-6rvoGC~?qpۿlwĒ-'cXj/GM/ ~;A壶lWۨ%d7hTaQjIĈ~&3pd&4[I pkЅ>*FLTghwAc8%:) C400|%[bsK Ž: D1~YګQUeeI^ C?Q6CC}D:92Ò wz3/Й:Zj!< 3Ү1bm[D ´/T2lo2AU7HjUa4LhHΤV~@3ZڋQ g2t K8lbɰ&2IYdD2dQɩSfv%%>l3xzJk&NU2Ï4؏vR !(C NnD|8"䋑~\Ftv~Hi|D-8C-,"Ȣ*ːa >[`XIUq  m ! OS %ʁwIz\_ئa)׮ sRe]pc4zv(2;e4w]{B+}EW[#Ϻ#JuO噆RjQ˅×ibfde FT:>!OSg;&kȃx/G^stc^_jOPKw5 PKy.F+angular-1.3.9/i18n/angular-locale_mgo-cm.jsVmoFίYw2Im@QE9"ŀw"c*܅wfJ}%ggvif $6 [Y`0ro#҆OS^mh]L8)*[;9} -\>3#ԜMu$"AVHcOm K$B[|! kY |^3v"Q[hbB'˅>ڧ8I/izrNP琹Ն,&36F7=r<=eApm ϩӆ/`ܖJ _Ha;*xr&~*QчӅLUuat܃mi8-$*Y: {:CU7^GwOGˇ x(]cX]7gws%:ZnNw5]ţ L1 Lx:ׁޠoT6VEmu5( ]UX.)w`PPM7Bfӆ1xd=F9`N!̴OpO_ s #“"y؎ 1sɤ8JTtn'uxFInc`[ι/v bNžΐ23~oѝia4x4J{؅>'VW\m·]MW{(ނ?SDcL)0?#{]ſ z#Vw<+9F!(/R(0>P){ /"w)_ [z5i-RTJb0+ '$ 19l9CVSe%9%ٱf4 Ԯ`=>m{ :}6H+n5.+Ͻ`>3zȨxS~E3zUv׉k3v};k:d3}ʼnބd[t)y!HF˩3$/`I.óUXD<+ѳbqd$/f3qxXV·m(%&H// wHw6O?jȔ^E:KwT-3$OgZ~! > ƋײsH.Jrhl8K^Gr~!QTFh6W]K-6ՈD+ySM>cRy4&M>0|0roxHtr5ukHuu\)ձ֔ǦX3]dC= {du\@k@\EPF2\<[94ҜjeIQtZF^6 xjIC^{ueZ~NqKnG?bo|wǂ&u:63.Kp[+?qs=5v+nPKV9 PKy.F*angular-1.3.9/i18n/angular-locale_ml-in.jsVO@_iLľ?pXRJ Tb>Hit ~8ٙ߼9.>ZY8͏[575+"DJfԍ|O:gkBP$jnC}?g%cڽ&,Œ/iBPρV;—MD¹5m"jոƫУQCHº;˜\l & Զ>R1`Q='_ jgeMtrֽB)9+U@Rܘ'9k|X @h(PUH_bQIc?" h4M]1rvun74d,2TL:5 %uUZ%m، :M;HڭFopkw5(+V(7,J2n72hVNc*(FJ(+g$+h]TGmp E5Aa)CA䣾x9vn冬1rڸMKM N]=("{:-u|bZd#p^my1{AEWn)-qC^Ǡ(Mf,1C/8n. O/1ذ!xI{ޙe-wyuXrVmڛ;Gghf3 FQL yev,/ >ylp9Ωv |'^|$`"NJ{S*PÄQ2o%$bJ~>e<(G:OBlA vq}R%g4\}:I%RPETw^[<~'ukU[hVcPKz“ PKy.F'angular-1.3.9/i18n/angular-locale_ml.jsVO@_iLԄþ?pXRJ Tb>Hit ~8ٙ߼9.>ZY8͏[575+"DJfԍ|O:gkBP$U'j%b)fa¨r7L1DLY?`<(G:OBlA vq}R%5e{*vfKp}TzZ4Wf-X" mSx 9*QR+ІPlh5fz3v5Xrv>ap`)S0eB'U@4")椉ـlcplq6xfVlS ~#,qUL$DTa?p *}E=J+z 됛1j:CDzȗ0fL-WKk a{`QZ#xS#:/S I-CʐZeH?ːNʐNːʐTΕ[/ĥ>Iِ*lmlu{@WajX*ɾLzxi|PG ~/i c+iyY4]?Equè;\;w]drll~nzxjAӦl3&̊t z,#+s8eh-CG]́xR$"cfz؞rT(zl)Q s CDWњ hƅL42Bj ~~T@ nf%X O4&TyF[\;Ò&AOc,ךFUݹz![㐜^ $❧A8:مlt*mPKr PKy.F,angular-1.3.9/i18n/angular-locale_mn-cyrl.jsWmO@ί4&x S!~ఊRJ TZI_Hiowfi/@¦}ٙٙn5]d+2F bY)D:49:0c8Ő)24M@*H4<)Ƥрl}pq7xd%VU vC,1d *DaFo!&nDZVH: *g$z |p y:d1\]Q;`?4OZ47| S`BsUx+.`y-Hyk-HF(ؔH,Rˀ2V2222 E.*s嫠Rq'W#RΆ_*1 ."Ԫϩ+QX 5 A^yJKXPI ͢)Fܙ.̾""7eUe$ &/=&zxjEӦlg1B]X:Glte'LZˤe@<)˱VV eLmC/RY EK:7 q`~U4B~02\j v~T~-f-XrOTU, 7Oc,wFU2[[K-qHωnaӠmlt*:PK PKy.F'angular-1.3.9/i18n/angular-locale_mn.jsWmO@ί4&x S!~ఊRJ TZI_Hiowfi/@¦}ggfwtM{ک*DNRJ5r7hGOÀe./ 3y<1Lͼ׵9%nDzuZ:}Bbݲ-}^%fau$n,m;lƓ#?BtAǶ }~9457BR^)pʚ=jh%8>*=-3זUyUT)<ނq x`n zhG(hg6jS=䉈;,9;0c8Ŕ)2t]D* d slT h88< +  y|I *&DaDB\h8yiw޾¢pYS { }=Єzp`u͘ ewD{5Wi}RyYK3KqKn奵f0=Q(-<ީJũY!ieH2eH'eHeHgeH\U*WI-evO_*lmlu{@WajX*ɾLzxi||!~;ڛ _2>VhyQwvf dٮٲ$ &/=&zxjAӦl3&̊t z,#+s8eh-CG]́xR$"Wcfz^rT(zl)Q s %CDц hƅL42Bj ~~T@ nf%X O4&TyF[\;Ò`%4Ͳ~ k$Z'u. k !ޒ(JH&i: zб.2meShPKB PKy.F*angular-1.3.9/i18n/angular-locale_mr-in.jsVmO@ί4&z b8/Rj T(ؤ/zovn-rM\33;Sf7]l$mלpNi{R8&Juv3?igGޔ fi8I(ekщ\u;qַF옽2~I/negKr/5W$O\~j\~>F83 $n,ڵƣ莟ZcL: Ӹ;[fJ-#ú_oTs ^ c!#M {X;R*!ȲMYhinpU% hJhb7h?>NPO1b&*9Ъr%$r{rWKW1V)IhWz!b=D/ZFz*Wᜌ*CQJ\u~R׬!B/#P E:=QI#U0vK+eT %YRyMl;C5MV&@T~. }; R/̤r!ϖR|cr0Q.e.Is,DFR1-wJ%&JzHs^/ޔ'* Ǝux߇ذ΢Er݉Y47&flޏ@ ;naym vz>ضWշvm5PK( PKy.F'angular-1.3.9/i18n/angular-locale_mr.jsVmO@ί4&ja8/Rj T(ؤ/zovnrM\33;Sf7]l4mלpNY{RJuv3?igGތ i8M(elpyeu.'ݎm;f/ bҳG`܋}#װ7;N-s6ɽKv-?)qNl4&}C1x90 6_u!+r!xLZ8dTv܃ya^kG\U%YV !? M6SdM^ ML FUD%T1ZUd}^N4tO `)*&*%vJ/D,8EHO*VE4]~(JׯU5De겲H'*b N|i*tB2K*oMvgɊĻtJxUPHeomݪ*ڲPUpy;_*n;m/?v /|ZS?qO͘ OO&ּG"|PKn*0c hV,~I\ܓ>`)@fR‹gK)Cw11߲09Q.U.Is,DFR1-7J%&JzHsV/ތ'*JZi]gm ,Z&eN02GYא2͘7g{~d R)d,v4˃o\[Sm{][k1,PKGƂ PKy.F/angular-1.3.9/i18n/angular-locale_ms-latn-bn.jsU[o0}WXVvCšub ZDNLV}vNhiZ$'})rG"l+b;I^aK$OQ(`"JU}@/=Ƚyr`+zazNgStl@d^Gɏ{Xo#-ÞH{ɘbG9>[UΞ>_Z!&9e>AolX%Ⴢ@c>1VEIAyؑP{Or1 }h쑕$QT$dUfq˱z)aH7xkhZTZKٜmZԧYA~U Ng.(/DmjˀMUɷ1  ,@= @< @6 @2 @fCRPx8 qʶ'-az0iAOhK^J1\4ܥ1UUlKyXS]VSҥZ! 9ȡ=:yiKnɲU9Xp+vŏ=gVlb]#LϮo#StxF^>(%uL v*4łxkORҬXf-XuÇ~밀?PKyE&PKy.F/angular-1.3.9/i18n/angular-locale_ms-latn-my.jsUn0),R[nh UCȀh91][ЪӴH r.N򍌨hJF}M8>KE WXKÄ_%zm@gϻV`\o~a"Hױ$\e !R|~=X@LlO[&(kv4YT@v0$z |܆<"cࣆ@y\׳<Ӫ+=x YD3jGҠ[#SE.ʼnw#% 곅3.JEHX%t$+Wl&t4gt?ʓ$^LMO755e@Q@N@M@J@Ǻ{RрS+3n   V뵌~lD+DA8J8l(-mq2Tʆ Z0a뿉ͶukB&63.eVM a0^ f{olwyӝ)Qe=R!Ʒ*N%,ٱTq*a/j/gE1qM%CT!9یКnh_U6M [ #}iF:a?駼4XPqvќ_Ŷi$pě(Iy*2‚{ !r)]Mg_vPKއ PKy.F/angular-1.3.9/i18n/angular-locale_ms-latn-sg.jsU[o0}WXV'2\UCȀ 'rbCpBN"|w?sS]6ze]}=6JbqrBBpvzUu=۷~PKPKy.F,angular-1.3.9/i18n/angular-locale_ms-latn.jsU[o0}WXVh k.J*"d@ĉЪӴH O\de9yAFDd%"z>Y&z<م+I[a.J5v#~CǛo9_)O ұM Yiȟ%?0`ϰ { &EFw'c-xm5[; h,*|k P;Y|x!xa qXgyU_cKV{iӈdDc,F?$3"&$'\ԋ[Uˏ :h@XdFHCVBǢ^zlJ>Ms/@Nί<v;qY/x'j]S]tJ~$58UbL?iiiijջ^(ꓜ&te֎>_Ğ]Xa[# >j7:`T} ]a#n`bQ}:}$ ɄsY/N\'Q.LPE!taVDUBG^zJ,'_yZ#twҋܹ~JԺ (jiiHiXWQ|KJ2p`~ 33d3$3Ԫwqܣ9׏mxh<vV)_綄-#bѦ$,Clp%0 c%l\g!f_d7p)ֶjbyj(7gc߷dL*2] 5)C;JYTq*aDjgo Iďm%CX!9[{BKؚn@UvfG3՟QBFTӌtƾ7Oy{K`E_cNOJTB%946ot϶- .*,Q-}tuqPK?HPKy.F*angular-1.3.9/i18n/angular-locale_mt-mt.jsUo0OaE]i%h6IU**q &:M{{{qzE(y[tǘ%iсAthk{+ޓP9Is34M=ktӳf==m)*?/``XG lO3ݚ\9:k}X;:͙9V cXa4xd@fUnq!o4LL"5jvYdhLEK$+9Y'|RoR̔ӑS&#NtwU9չQzx YQr4pU,F:ZoZߡut7pqPm ߟ+ VR 1Qm*cjJ8GH϶6I+<=[M nD?N+W+%JtФ+P)/{aӫ}Dt| LG~@Zc330Ys rKIW?<ϛ, %u, Bg}fx*9[* wY%_/gb7{N}wpHlEfRg4 rMu8fvRzK^]*Ku*Km {;;{T?/Bu.kzdNP6QENY;mڸ@5wO7O6׶DRhltu׭it⑉@'ƱO!1{ƶ3*3 ${b}6̗QkbF5}MvZtNZh3pU,F:ZoZߡut7pqPm ߟ+ VR 1Qm*cjJ8GH϶6I+<=[M nD?N+W+%JtФ+P)/{aӫ}Dt| LG~@Zc330Ys rKIW?<ϛ, %u, Bg}fx*9[* wY%_/gb7{N}wpHlEfRg4 rMu8fvRzK^]*Ku*Km {;;{T?/Bu.kzdNP6QENY;mڸ@5wO7O6׶DRhltu׭it⑉@'ƱO!1{ƶ3*3 ${b}6̗QkbF5}MvZtNZh3Cx)^usۙm4adIQ+?ry# {hntM~xiH^(y>7§̷{a3۱7.ܵG&)F>4Pܬita [B `|0^QݑWɌ3F'oM>Ɯn ղLP}X?*lQ$g*V͏Rn_O!ԋ@;Z]Ī!F7sk[ 3ed;5DdJ(O+meր<JTuw3(%x+R`]MB/D&BM^PDvvLPZA}怽:cȰ.UMO$k/<[L;9M~`fbSryK{<Ҧk: %+h(xtPKџg)T .ZI/b*RbBbJj@GŜQ.TIn9 @9οWxnCI_ 4j^Pŧo6Ǔ 2,R(Of(Yeς`?Bi\[0w֍ae/PK 3q PKy.F'angular-1.3.9/i18n/angular-locale_my.jsVmO0_aEH0+qj(i4U&IKTN>q@ۤ}"R-|s/nnC4^2&dAZ<|Z]^]pL"){Zw}:u~XEcH3f,Ż=Xlf%!mېj^KܑdDb󩅐v|{g5?q\M.أ_/ J|5?mz:jXk\Ξׅ 0pݨ6͸QgX )RqZV 8vGX p1L83^jx"Fmg I!zaHq`5XիX}/Hu((CpL&f01[FSC4@LTֆhQk-D_w7R\7D+z`4NO]~!o7>R.UwF+se"d_ bO= =(?D-ҥT, L1 $湪أ 07MیphۇA.x\( 0H<_hj`h0Of6w][3Mmk)?uXJR:{ꃔ}Gk1B.aB~P7T(z IR*\rL!+j@'QRnHn5 @9οdxnCjH_ u^Pŧo6Q7*.)g}3m~MѰ(iڜ;0֭^k}͖_PKE^1n PKy.F+angular-1.3.9/i18n/angular-locale_naq-na.jsVmo8ί6`?%BzWU.8/jbsIvpoH@晙g^l AIr!;Dk/O.v1˂\N7i&72=zajڋҾbn`q"}|w5A0*ZNCk~%CXmXta[#g dA3x߸t==h `z5@.;M{RpBhR7} ui:iɸ;r) Ngrbbz 靚gG_i{qP3@AqɩOg$4BN s_ JjZeN ZfƌJڪ $DsZSVE-\OQ[8>wgն-ϴ\Kl]I0q*-/ЌW++&-9 j. lsʚ O mR)h!8EdHJ A jIΕN5gq*ٷ,S^PK̹ɱTM-=jgӮ`6jmmbo,VR_ۋB[ ]ǴPy( ρ~cisb 5JPѪn [Ʋcj" wEetǒ l WRgQ w%< ]5%onk"L gf'I y$M0ѩ! )5 DF@:ݒ7;͖$1E:he~BaH.Qw84*~괍.}:E BUT \sl!r,(z6D!~^ :؛5@tA}D®@F Rl2Xr@Ú_jV2:7<]YidЌ%/`&7nt7]a'Zyr +FS&|-|M9t qz㠎pZ2dk-ά,cJb*?w>y^}aCz&W^}L P&5kae`rӻI0+#&S$#4yS4(1cy"=Cb" !ќ䥺VԷUz 8}}N"Oƙhmqi3-hhW, gyK<,4#Š aI aβBpfF[dT ZȨ,Nu<R"E$AZnR!(sD2~7YJ'R'snr,U21AKٴ'xZ["b xGaжB#1y,Ggh*&%s`XڜµpD7T[)152cU d+Wʳ(?O.P, lE(]i8K5Ksw+s@]Wދ~ǓiZ/Fq_PK PKy.F*angular-1.3.9/i18n/angular-locale_nb-no.jsU]O0}ﯰ,$Ta+"JSUipȉi'iZ{OlCS2YkňtR)F0__aw~ bD_G v6D,\/н9:C??EJ hC c`<#‘Jw5 a =`U9^yA8ŧPᭁ@'upBF,JRmo<": l"y r%mrF9?GvA+"Zbz'DJd^I&VÔ$5xPZ}s4N<ApiD4/FOӑl}PB@` m-T)̦ĵBAZ ]-Ԗ2=(f!B @O ![ ĊsRP؅EAp~ژ <S%* =IS'6.]5LRSA;60#]2c'.=FZ} 'V+.;цne&U `l_]b4y#SBU5MY Zt=F]i*l&s|͖_K:ZZ2-jZ^7Oi1٣wSƔ$lHƻHd2t0`!舣3tb BJs`Az~gPKJPPKy.F*angular-1.3.9/i18n/angular-locale_nb-sj.jsU[o0~WXV趇R(UC% uȉM;8ii%P\|ۡ(r/nbD:GnĒ0n?|JCMD/X;Fo h|3{7~/pF ?:CJ @p%ՆI-|G p !EG1xms:z:Z ;zAmycO; NvR /DyHVUTYy,!xIZ `4Rr0 WDVD^ֈȬ2TƬ +VZ,|34k'sQ#4\BL`l l!B @^ *m,#qPB@W 5eLk,ZDi!B dH1vAr {0P cLUΘ0V.L N8YypRPe/A ك:쒗>qQ=y?[Lfܥ_{p9Mܱ6Yt\NiQ%>YMW@Y#2!ϗ,IwlJ5rZ$4J3=QnfSlkNGZbY`Ԓ[!?gU|yPO )S>7F"89qt~N DH\I|x躠vuqoPK!PKy.F'angular-1.3.9/i18n/angular-locale_nb.jsU]O0}ﯰ,$@ꢲa+"JSUipȉi'iZ{UNQ^dU;#IE=|}-VQE LMi"V|U$U1zlDY0^{st^ " @p%цI | x %YG#71=xTs:z:_;s;xpO6ᭁ@'upBF,JRmo<": l"y r%mrF9?GvA+"Zbz'DJd^I&VÔ$5xPZ}s4k' ش\"LtThl!B @[ UʶV(Hk!BڲZ,ZDi!B dX1vN {0P cLuƘ(Q.MFN:yypPg/a ڱ9W>qѰ5=opx8_N瞞ڥ^yp9M݉6tY.6X}H2Mac(sɋKu ,_ZiwlJrX$4~ڕf zb݌f"9l:٪n%#RjK~$ߙ(1% e]$bIJrxC(Ggg@$-gρWloZ;PKKPKy.F*angular-1.3.9/i18n/angular-locale_nd-zw.jsVaFίY`R TQΗ; ׈ӂmf&6Q{fl\K@73ofbl.M*m[\3ɓ~ LCхO1.I 0STʬZ9O`~wLz?sp 3$1fl Xkއ^q2ˡt$qܪ:Hܙ:PXQƁ#AH_(?: v!OYD%0@u`8n[z_ 6}&XzTq K ˇB>L0tӏ2tm(/XrPyҺFyLϼ#Wc[l :Yj5Ka,973{FkzAuCƦ6PEɗsHBq5k-ԬT^iq$]jVX0@ .|2V*"-< 6(vPm! tz"*?m$-7)k7sRu]tbLy4a߳,=w˞.ە5evw9 ڭ,R)/c'm cC%0_:  h*j*XϓBީ5j@BCG|V g=O# L1R~|܌.ĮKQƥӺ}6ژb«W}ܓiu L=O#wPKPKy.F'angular-1.3.9/i18n/angular-locale_nd.jsVaoFίYaZA@QEs5vzQ`oomBq&i@73ofb|.K:N:\mrA LCm5чO1.iR0WL$ʬ:OaqLfSz?wp3 fm Dٞއ^s2[ˡ, R8adZ\LE(@ԑ d |fw' GlC8]fOuR?aN 8_*(gԷӳHi)mkhkx\=]v6tv*<{ NΓW~TE zh6 @nICP3;8Pe1tn~ Lzr~496jww;WIb*8x3`KzC6' iPjlt(Ƚ ExlM5gX1 JM2l E+IcN*YڦW 6/^GdS-urſ1;!]ΙHճe_XS'<37Vy"JL(a/]{Am#n3!'_:A}f`fY5.pҝd Ϛ3Wci5:c6t4ӛ\WN gfg=ide_؃V 8Wh`YgQ%4p0r1*Ō-Mb5@ţ|dŕKB[JkJ%鮔ҢlR]c~-,lUַ PK^u PKy.F*angular-1.3.9/i18n/angular-locale_ne-np.jsVmo@ؐ&m5kڤAL'hI`1}vgZqyf0]zd49lU(a䦁wm4T)8z]Al;hDc2I}{L./7L1aŹYЯ;~yl{cR*4i ыU? YBK۹U߶Pi5=!O~a3`#lC7ΕjްzgCayrE(ы>4bdFKȭ~A `i)Ѝ 1xu>QrFeE@LЋXi9ɒaԒ!$7 ڬhO!SxAֈ,P ]-W| J:XJC3KD17[vnEHj{,Kr@6x29rEM.'c_N y +E*1%{Q "6/Kds4\t0l.E>qL}Yu خYV͕3]DW0+g%>Jod4{Lgdf3 ǖpjS4;7߿@0ꙗk?djFǴ{7%ؖCM$kd[ (F UL%g p Hi9"p N3GRDd#!v/%=&u_J{RTRzyORo|WƼ[Ҙ*_JE2Y_]3rKҘ:_[|Vqz෿PKoUfl PKy.F'angular-1.3.9/i18n/angular-locale_ne.jsV[OP~W4& ^pU,V1ú-6̜B[M(sof9SYϳnF[O4YA[o }veZFKa3FGF* g'.O7 66t\j Hph%8'!^dsN JMFaԿ!>c4"@6mF?@ Aޠ՛ ,0mqVZh<0-݊*oXbD6bl\1N̿&5A 1E&%zQ hQ(xy% :aIӪDE8Uྮ>I  ]DW1ˇg?pbЭ{LbY?wjS7ۿ3Zk˜ jz[JlKʓՊEl#UB5ЏU.`ԛ#% `qػ[z`PK(9ei PKy.F*angular-1.3.9/i18n/angular-locale_nl-aw.jsVmoH_1Zj|g#'[:R-LZzQ1 ! ZX~`BrHF3Ϭ2c"Y@FTqɈ7ɞF ȻT$E)| 7jl^AlnnbZ.嬧@L$^Y($\Eq*E++>jBLp|G&i֫CKceWp7cCP!f=}}?Pr)8dh10BLfS˕}*0uTUST }0$Chh@U-Ha^WCC$81z}{t6ɨ:+GL^+)R%滔$<9$4?by1-7J=4)jF1rrGzzǛVȋxĄj5XE^ӬgEXZL|Fc~8!g_J|ԊڑD\/1Q^h2Im5Ճ5 $$O7MB4 k@9<ҩ0┅ʠKDt<|>Nq&k ]+(]Ϛq?c+Jha!cq|˳k׵zȤŇ!٪W^Ie_Jgc5<]&/#\G;Guذ%0!?/84ŷjd2xX,@x-هfi~4nAEZyj FjD$Ń;\܈Y,8gDKQ[r)Mj KMʬ6޼2pQɍwwS/ t=^~GL. PK) PKy.F*angular-1.3.9/i18n/angular-locale_nl-bq.jsVmoF_1B6{VT9G ɝkmBHaK.v;X\Ɉy5C?O9 YcC&(vo= 6/.K}B{c~\;v2FD!Lk3>{jB+y8K&K4 S]P3 Ub_מ7HRKMa!~#d;Z>]bq=$SAR0Ucz/tPT.X:X,{2@n,W}<2<_x.=T麀S)()8)x#g,qa=#ծp΍e>\mkliI2j" ѥ1#2a-%$}aj~!b H[/1 .eTXV+gDdGFB5,A؈WsђBEbY6)O2=F_W+vnGyv/XU kO9@)"!%PQ="!)HH"!a#axf.XxtJ.0~mE \K r9iZOV,ZMJQ>x(;9x]WlRNԒ~7͋;6WvgQڋ:ؕ}57khM;iFK}_4,(| kS|EѱATMPp#KbG炩 mQ*ٸֶJ)kWΦ_-Cy7ݵn#Zt[-[{ulH2d6~k/*6Ҭ ZVڥhB\x -yIHw; t=XOStPKgʥѠPKy.F*angular-1.3.9/i18n/angular-locale_nl-cw.jsVmoH_1BnVt9$l V^mB4 3k~rH3DŽLQ!5{rm_Kd\.^.Y pLΞ>,ywp?M{=e땉B,( W| >[WpM>i֫ϳK" f!( ˿=o<˥0 w C. F7ɬw}${H$N*1*0UK5a=^ .\>tXdD cY(xd8y]zu RP=S(pzSG ](X߅ȏV1:7pզ%ɨ[įhFƌІT v!.6"mYļ˖Q!p`Ye*ZZ39ASe eDa#F\q~EK ~fyڸ~k3*;vҬ ZWڦhB\x =yA HWwK t=\OS;tPKyPKy.F*angular-1.3.9/i18n/angular-locale_nl-nl.jsV]oH}Bwmdd+ZyRG I+oE30!]t_hgs鋜B^h_g=Bn%/bj,I$x| (ef + ͭ;_=)zW6 )QRQڙv($Hoiҧx8zMriqIQBd}l@VIĊOoRi!80 O cF7ɬwi>]liVgSAX*10U)0}1c (kR׈vvn']JU/읯Kw9@)"!%PQ=X@EB yS$$MΑ D_`>NŅ,l HkX.I2͛5j Ϳ ]+(w]ϚgrU>hJ-ܶlX:ŭګ~sdگ웈K}korAlw^.#FaUk`B]qA7{򌎕^3D 7bwt.X` CE4?wAEZzٶAb<&TZq۝tޯѢj4X}Y,8Dߌ׆2Xr)'*ȡY } e`ᨼ3(?Odžz^~INPKRPF PKy.F*angular-1.3.9/i18n/angular-locale_nl-sr.jsVmoH_1BnVt9l V^mB4 3Ϯw)4>zLyȤnr]mg!׆E""p rςX56c`6wa1wOk{pӴS\^(Ă8_H~m~_pmW;"&^Y6dO\jYN>Ϯ>X*Qodž#.F,t^h2a S4 '&ީZC!:EĔT-լ{.rbٓBow3ef͓EC nxB7y s#ծp|^jӒḓEW4GcFdhZJH* P; CXp,^bA\e˨s 82icWR-癉ɠ㏲`2k X"#8?%r?O bIۇ1.is2QEq"{!gkڡ1FҴ'{R;zuryvATT~>6@pF@ɳ\ Q{~1L0Ϟ`~#z^+WBd)rP%Tjf=Lx w1 և˞(z!|. U u6O}2bKU.g T Jb No  sj8F2ֶ5wڴ$5skcҘڰJ0N5?e~1@-wcp2*d,LZX땳Tyf"g2hl#X lĈ+ϹhI",Oה'l/;[jl\wT7#)u6-uj|~o3*;vҬ ZWۦhB\ =yA HWwK t=XOS;tPKvKEPKy.F'angular-1.3.9/i18n/angular-locale_nl.jsV]oH}Bwmdd+ZyRG I+oE30!]t_hgs鋜B^h_g=Bn%/bj,I$x| (ef + ͭ;_=)zW6 )QRQڙv($Hoiҧx8zMriqIQBd}l@VIĊOoRi!80 O cF7ɬwi>]liVgSAX*10U)0}1c (kR׈vvn']JU/읯Kw9@)"!%PQ=X@EB yS$$MΑ D_`>NŅ,l HkX.I2͛5j Ϳ ]+(w]ϚgrU>hJ-ܶlX:ŭګ~sdگ웈K}korAlw^.#FaUk`B]qA7{򌎕^3D 7bwt.X` CE4?wAEZzٶAb<&TZq۝tޯѢj4VyF N7ɨ`9f\qi&rbVyoBX8'/@;Jϣa~S3tPKsPKy.F+angular-1.3.9/i18n/angular-locale_nmg-cm.jsVkoVίYŴ춠,b@nX_.w5x/Kq2sufoDDqnx,x,q!0ϒ W0H]v7pеHYG}<[8H_0@LE!@@'DF >Ø:[+F+6ϼHTnj~&\t]nZ6[VdDog =;:e86*~ȼ .~ޅ:)U*а\.LLw imw\eӆP̟X3|e@K!Y=] ^ !@})+Jw8F^S's]Ki5Hfа~Oz=Kڅ%qHe3)<]\}SKep7F7 EYx>\Hu;k@$gˆnO|fLNqg5c͑`߆BJQEh*rc\ g_ךlsn!Zf &WN|U>R 4y9QV'uǷ S=>ע _詿3Rs>;vTf/CsFފ;QQ~W^Bp;;[x%0A Sce8Lt Q*)sp,k 8F{s\aE%TBҠDF=j9~uu6^=/W%'"ޝ:R].ÊKaLY_uq+ca^g&!ۜ'p,EPrYYk; &2vD'3ma{bu?JWB%3O"{;zj qMj&3|m#C{0SZpǨ`ЄlRkH.&Dul2ǯ㴺 #)'| PKbur PKy.F(angular-1.3.9/i18n/angular-locale_nmg.jsVkoXίYbℴhS"ŀF?b_#hw5G-̙יfYšNⱰfYĝ`li 8 9Ȉ҂ߠ }4,@ PClm#AR ʵAN0rt7.X:h,t|U6m 9aͷNVm TeZt[S&tiR^l#.I_xV1w4XHɈ FG4gZ.TωC*I10Rt﫮\*߇kg6af w,jʈcBY,(99 Ft}fSc"v;+<&R */>C+ P3^6M8dsWdty 2kmi0bU.kv-=pb셥ŏ:d=e- BOU$!||ܩ2^;עFފ/((݊$'ۉݲc- >|vGH^-akgLߏVIEſ gO]MYc䢨  R I:iWAhXjp<xN uNPпgBK +.͇S2;$g~!WŭyuJ}l}bQSA-gf8VM%H^$6 :h #(] uNR>]~SHU G|5iwI[/ 7bb[EA.Q (&˗\LnhSjM]io\RPKB+o PKy.F*angular-1.3.9/i18n/angular-locale_nn-no.jsV6)J v&ib\trXw:åMl8^{\lmy?v. ZG-6eF̨ _:]x?V*l-S\u`תm8#<\Tp|8SQJ!~>s0P {V|ُZ:9l4'Y2UÌ ~66*J,_T :+ae=`ڷ|_ |+SAX00U[b$e4tP5.X:D>zy\. M`O@UGPv vw*\!$#U$+q_ezwֹejh kQ3?Vql$r"lEŜGS,)3$RnBm 4MBYr `:1i VO<H6l䆐CȈgZ'?Ǫᄜ B-ٿi!DhHIIeDRxG5NF[P4N\97*xtB1#7( N}G.d=;ו KgU W=97?|OnПMVU~ӹ'K]}8]hTƤUq<9A\f~U΁9r%7 z]dt5CiefLtˋ m<87FǖNRF=OZs0.Q {R| [:94'Y2UÌ ~66*J,_fTs8ww 3 ֮ee]y@*U,հ')1;q! StM](o'X{ t.]&r]@uuZ0Vp Z/W5%bZ1 Y3IF(Jfr.4jJI5Xc .MK19W }k򩰌8eɅ $Z)r4}"$HBD5و4;9I§YRfH\<t#i~;xudӢAY;ߓl 83 !&N~U 95gZ:i!DhHQIeDRxG5NZ[f{$Eh{\h5UbF]{av҃{98n>P?oo7e4N6}i߭daevȜ<h/Pŀ#(M/ͯcK65fd^@U_A :&_kh^ZʾR@u6G 1Lb4U`u+hʶ@мess. NT?TXn6ԡ-EIsJ7Vn)uʢ%~_'Ʌ;c:`a:+_3fN5d%ߡYh\i`k=c*uD&m?=;g#dU1[T$bK3?6a`CpKYלxYP&m<2BTx,<-[XC+TL _%NJDsCY`-Y?+}4)/ 9&&:>6m[Q0%G{Wt{A~{EĖ%VMpŦ KԒDXv(D5lDW*˩ (X7~'/gIWC-jdpOxpR''Dpq.YhW@R:Tl#;|fa UΪS̉x|k.%KDH; ;3"װ]nP/iڻ=Sr*R`mэ?Dot]gwәFfA/ûTWޤXAL2j3Nz.p#>SFtׁGx9MJW"5rAB4(91EhTQ ޾jrAĎҟLG#^':T?ϧqX7PKM BwPKy.F(angular-1.3.9/i18n/angular-locale_nnh.jsWmoFίYô3!rb@)૽F~&6q^OP,e3Ђ0 ET_. ZoƮ%K|y/kIMtқu'I;%,յ޿ Ds.HVdb|$F!Pmk7aTtH^-7K+PG~:@9Di9ܴNlު7XQp{G tQе2ZAWJ~ʼ :[h:TJ^ M961nhTCEpM:Q1gXL|oDGbshKl"P(䄁#4qOOx$B03?S`ֿ܇ %{͉Je&ccT,TH޷^0eBԵeWU!w*`*" ھ+<mRl}Cϕ{%`z(bi|O?׺7w~w.5Sb5s}r=ͩ:_d>rY"}!| RHt1q|SxEWB!vcR8_ 5isҞOAUHaIpʨaP1[HN'4Fl)t0ߵpC|z'-.PKv@tPKy.F*angular-1.3.9/i18n/angular-locale_no-no.jsU]O0}ﯰ,$Ta+"JSUipȉ:'iZ{OlCS2YkňtR)F0__aw~ bD_G^;"z A^n"BH\g ox{1}wo0H  tLqO%;fMgCB>+]^7jC74-!I5(ӨTs=zȺ*Hd oBbIZFjQÑ]ȺfɄ0%I o f!*/jߜfMkh\lZ.+t:[Thl!B @[ e[=qPB@W eLYdj!B @VbvA[ϼngAtE.ʃiNkV İ쑞1MacҨ>YOs ,_ZiwlJrX$,=ޕVTźDsnƷ;ukUgRSK_+=;/-/'h\s=z7eLI†D nDV,3IWIBI8:;C'%DHBIޞ| >h]lPKU4PKy.F'angular-1.3.9/i18n/angular-locale_no.jsU]O0}ﯰ"$@ꢲa+"JSUipȱ:'iZ{OlCUTHaZQ,܌NJ# St~A.&5()gG;F hr=  .p/ NB`LgnA>i»kR4$Nt$ 4SdMvź˭f,-M]^|-gP X^pM6i-2mYZ@kYNd wrV U@r>#x`sq2x,.>7_aE(M JEEk4ݳ]oqKV5}VXnc=ݸn[[%u`3kzg}mޭ[٬*79AZMt&Y؏0tMQ(/ܬ1~2. Pe~eׁ?aЁ Ak AwdX-*]D}&b1Q6-7׮i'Yg=- ]#j,zq]k9>JVfZ)[ᷮYUr0 Jx.qX7ŪK`D2h zX%Ki T3:zӋZ^:(hTq_K?ku-]RAX/m>0_%iLAR^Vi\ʹU8^he15A䍚f'Een_]3x@b|nq`PKOPKy.F+angular-1.3.9/i18n/angular-locale_nso-za.jsV[oH~WYbVLIcdVE+ -mX=Vk 7vPH8إq0? I܏Tטw$ZO8<\xۥg:pl$=}Neo Lc@3$'|oYI4NL>MgtD$Lt&*`ƆDE@sWvGhbf1Wv/ Ct=p:>u~H1N2HcjTz齀Q]A^`}`tߏ7eQ(/\᠋dtkvvr\x#I_rɏV2:צ0ls⬵QA2j&4ZWLx/ QMל'ɓ@BF1nɖo4Mڈ0Yi-Z aJ9Ҹ J {nr1DaRLϗb9yDA4U˰S u%lfAR"E ²!𞺵`JEX&EƗ!|X Z@jidf^3R70 >r[H][4 (FV+- N]="v4{n[. ]#h$63GzzgryXoLԖfK}mޗۺ[IOƀ j5q^7PGhR*| yLvgxYV@ 5l QU4י'`=2>CmAAZzYt7m_W{.OvS<8H cQb K9 KMĸ,^㐼((gF*sZ'{PK5PKy.F(angular-1.3.9/i18n/angular-locale_nso.jsV[oH~WYbvA[ULIcdhE+ -iY=dj 7vPH8إq0? I܏Tטw$ZO{uy2KtuI {r}78'59zZKDPݣnN"¾ ga'X;[294]0љaFḀ4b:j/7 Ct=p: bL eb*T ո {.t$LovӅEcKp*Ї.]zu?0{GC1\~N U(i.siws6'Z$fbL!~E3 uԊ0tYJ|Rۛ<$>nlADH SLL~lițY%]FHĚ-Էl0|?+v8$*5_ej}Wxˉϓ' )Zu-f/wf3 )JCmAA{-Q[:CwX6o/+bIyִC$)"?^h\ʹT8^h"fe15^'eGw5Ͼ1I֋uiyſPK ֫PKy.F+angular-1.3.9/i18n/angular-locale_nus-sd.jsVmoHίYbZ/Dyic@ihkX^#R5T%l3o,ީf $"*/0򲀚_F P_gZцy3HY!1LnZWcgr]08BB!"{//{|3 p-G+^HK邅$HL.V1#PEBbEL M=uf&41M hk7t k@WW}4yu1u5PE :P*`fgz6ׇ6IW͐qMB11'ج|=V,}T&7 jZ5K %M6ؽ.XG ]!A=-aZcmtolr}wjteQӷ' ިY!feڴhGZ)×t|dtAy;ո#M H9!SI2BIpŨ|"=<(p#e-@y5PԥZJ;sM*#OZ~"|E%dBeT;?bFt{ %{٧C*O4psLǎsmb3hhhۮ1k-5"OVfjmzZ׳& cp#7axA", u!X W-aM( . e*SmSudXZ *E/,^,np8h0{lt:* ԚMݤ@:黮_KqUoyD\Rp ˘,LV)7\]9]NbYF4i et%Z d EG鬴NM%sH珈)'i>]mB,i$4A`@DԈPFSFx+DrBiװ80\}'J0G#W',tZ/޾aPK!fm' PKy.F(angular-1.3.9/i18n/angular-locale_nus.jsVmoHίYbzBB祍׋ְMJ9x!\OYi:\]ʘ<'T3>?W{4tol]FpDʷg @RT(j4=k)hsm1Vpv*Thu(2V~pjiIU5psLnFsжR4rmט굖|b'[J36j=vQ @-`YhKZ8␣%7a "rYi@Ag"LJ Kw $޶߫:r8Id{1?Z/\qa4ڔt2. Q~\\r%}\e,';ѽ(KOv)9,@VRZ%P8*{/` 0O\#(pz#_ a3V#cZhkajےFɨhsЌ=H}ID0R4vdm$xFj ِ X&YkFsUQ$$7M3tNdgl.pI5:atDVtN9bw.u1MC_%vQN׆fݜDZjNEGgS D~=SS,! yT[0Ϗ&xlf(hT<@Y{y^C$)t ˋwT cWM]:A1_WXhPV*MjNKDj2)4W\TN nXρ% mla>[>[K]VŻVfK3MoMc1n'xǰ+|$ XQ"7 Y5L=!5k( mHQr!8=7X!J$<@|O.R/ 8Qr{J0OH8#:XVڸ p]^Zh.Cx k=kq7>T]׳u{x¿PK&y= PKy.F(angular-1.3.9/i18n/angular-locale_nyn.jsVmoHίYbzBOȱls9Flpo47fpw:337ԃ4Ky4]!I:QCOU>SʛM~NYSU`-5 ~jCW\f[}P^$FOP)>0EeᄋwchP}af3l%~aeW9-0% CdNPZM>rxm $Qk_mo\}(pz}ZS0Ǚ wV1wtmu>o2j`W4cJ[O >ɦndgB_I$k$AKW$ =qx%LB|MȒT9:)pB#AAȑ~ (=3X1Pmutehέe M. HY}tWzu<@ї>%麔GwelV*fFγnQ<rVsMضKoBwp^ec>WJ?Juz 27o7PK~ȩ: PKy.F*angular-1.3.9/i18n/angular-locale_om-et.jsVm6ίE#A@А-|Ml;Nai@gf;ԳBl5YHv$,׏bEBj43wX/AW),u 8v$;x|]aMM;bܬvӄycIp[jv;M* d׀?ӀorAkww$p߅11mled -O&c>2_׷F|.4]G,\h+_زpX2"~&c Č"-l`Ӌ^@F z,kxlDláW]a>%vnԡ1:Όɓ}koZee[fჍ̚JSLt:OR,ӁYD.R9vyzƿPK PKy.F*angular-1.3.9/i18n/angular-locale_om-ke.jsVmoHίYm1-P'Pt"`\cShkE~!P﬍kt<<3q5)IĖI[!|$jKj|u/$F>?j-$|0%LSZ7cgWpr0H`xd!dqgґrWS?LIni!ks,>SFWAXctli8v;5:[1L^l`_c \`A3+EpX02>X߂ŔH{PK]. PKy.F'angular-1.3.9/i18n/angular-locale_om.jsVmoFίYôA@QE$icLSDQ5E~!pY߮ mU홙g͌YB!IcJ,$q;~RG"!5ƻm,v̗ 㫔 nk;< u oBcBApͥ!}5瀾=,P?reLq䰦鈮XD9|ul@VĤ͸ON`4b&ZomЁ: 0~Tul&m1ue5L03L0N}Lw"vĸY B1ǒaݷvTv49| үBq׃^kHᙿ #?bZc=q73z9hS[M^|d4>sA:bᒤDgl_Q–U+Ē13K4-@ϓT w2:] 5[ R-lB4$$ҭs' /DxrOpЀY\8 =>Uge_=g{% Jp& ʂT+i*9VrT C=),HA%P H/% Wժ, G$n^8 8W_._ؿ#,Ѿ6(% 'i> + Ǣ7Fi? |vSbF㰩̘<ٷ>|r]k2\L|،5|qϬ4Dw4-R;xNq!Kq"{X)~Յ+NγK4mK%eCnErvЖr%k{N҅Z=t"_|{0_% `lCH˭|m?jXn~!­wmܛz ڸ-oZ;J {z{j'ܜgPK  PKy.F*angular-1.3.9/i18n/angular-locale_or-in.jsVO@_iLHܩ?pXRJ PI%S~[ح&o^;a*Mizت`BԣxFVEcj$~f04 brӎ{';t۷N۳zk"Obumz 1Fw=D2wm >nUrgfу0󽂐vAm{7=NhMv;ÑpU2`;f$>d՜~.}*)[ Y*m8̌ [- f9x ʥy<ǂr7؃J>J}H2aeLIzŤc\wDDzސр4D ,U;:$Ô$?LU_~Ry|Nw,aEQ0`KhxIH^p5"_`E!+I }0LOPҼlcssj5۞g]y \b|4^9ђu)UT] a2$"[<,WB@e D I>ڄT V $Ty`ƒ'P[Yfߌ̤e:Y&4XstD92PYBt-|6,֕q7PK /fN PKy.F'angular-1.3.9/i18n/angular-locale_or.jsVO@_iLIܩ?pX)%SBV(ؤRZ=5; =ڤݙkg9W>Zei0/(ŋdC_1ye<3J4 HЎ{;t[v˳{]k OumrHbŻү;/dﴺ#rpJލRLںY6k8̉󽂐vIl{Ǟ\\  Gk9}H8Ҫb4؎ɢht5K{q|F#ȁGJ@53qJW$^ <g+| vV 8Q=OFB"HH(/PoɃSQ{=aׅkIxiuqz5``E(I5l!T^"|pGe3(e60)Qg62_gz@5U zh}`@uuwqGՎsǾ9h1TdԌ#?ʞO/b׀>oHGDH΍3YQkAW*!Y0niY&rS%glzk3 smJSMdBu0[=9*[!1\ʘUϯL5zB`{Pn3,ΞSd1VNբbG< +WiҳĈ$ԤL[䨔!{Vȯ<74=2?b(W#Tx KQ5S˵ڳ'WF49o^:Bf(g%Ml.uRY,U(8rL96K{zUFkK!!noCIYCE)OrW\UW-!Z`ݬVQ;SUJ[PU6K;*,+|Mi6^Ц!cY=^M?*''Al$ͦ%/WCm`lqIM$Xm'~uɥ>=^/]מnW=/p#ܞ MY-jzhI"7|iyU6&ޗ[*xtFb0 Vۭ)h( ӔMeHkۊRoy~H_D%ぅWP%׸|Ql]Ju\^8f?W;{^/>nOk\PK?t PKy.F*angular-1.3.9/i18n/angular-locale_os-ru.jsWmoF_1B3imdڊ*!HSz"bA\.h؍Ry{ف]ny,Öˍ$8еtu-8: wY:Y~awߡw?Mv[B#glĞ? vm\9uF6"fqOYKZ"Vy H_D~k :GxK8%Eb${e s֟jR,7%ZrƦG>60Fqz?D*)[1(ՓCZ+̥Y5Jt][S*Tm g;8I{8UK&!nT-*{ðr{&=JHRKMjɴUOJg*3xH#l,؏9qx;J穰Uj<\;={reO3V%yZ#4;arVҔOQ+eRߋ)aԱ_kTI1Te+Z5$2}2}NOI2lO^"J(}56 6Ǹgڙԏ@l")l;&x1p]{2_:Rth#ܞ N ɝ^j)zʴhI";V(Y>0x0R1ţ\%5,7iTnHAC tm*cEZV "t"}\ _k:B(_ʻ)EѲM7/Q[ecOjw~o|)P}g~4z| <c~|cgkdoPKU#Jv PKy.F'angular-1.3.9/i18n/angular-locale_os.jsWmoF_1B3ndڊ*7!q`[ɽF1 a08wvzyZl`ޞyfv,6l,Z~KEe*8еdy.8w,FEȣ4+Y v\ݞf؝ qAxdC(OB? h+/y >ȴ}Q2ςE⍞ DL'h"!Q$$Fq7fKh /tԞQAzh2#;noHxIu~z5``E(Io T^ |%p'e/7VQl`R<c]\|qvطc̦Z3qg4Wѱb5viE'пxHɹq&1K4~ Hve s֟jR,7%ZrƦG>֣0Zq:?^G,)[W1(ՓCZK̅Y6Jt_YS*Tn g;8l=*%wr=aX^OU&F$&5dڪ'G ٳD~xYq6[F᜸RyTX A\5Zמ=2ə<0C9+iʧñ;{~yJeTu<@1yx,uW.UaR %z<]nrUɿ\Pj[v.o[E)LU)mAUY/g侮3/5x6t9'BӮzRI*m2lwT? _r}각yŇ+y-SN$Ig; A9pqwiLOb{0̳N(U=\g fjZ]7mB\A栯C Z8a?ӯa>w`ntxX(2 9SQk3?[\!֥ѵF h@j>4(N0|菬Ҏpdbl-FX\1ڶ˾'am8o5DnOR4EYXumژݔXD0}"4lH@Kߛq(YFH'UkmPJ%_)[fNL\!__ѬTY - _oѲm7ɶJq:GޠzTۋ n+3?e W%C 8f~.TH"=ܵ$D}TiyxEnkYϟw1D [d د3Rh+k-PVCw1(5(8JV%X)p$-s]RVI6jLP5V%O_:sh1g?1~ƙcB`X%Qb^CnH&!rB i.~q%,+˽Ne97PKw PKy.F,angular-1.3.9/i18n/angular-locale_pa-arab.jsVik@_,!8I:%dl$0:rYm,)nBB ^Vs}4ݝ,qIƞj,\d>|wfKf {yکҶG^j,&_}K= 9!/?USdCXܑ>pz s?C'a]&Iܘz5=3 K/5B)m]jL75]FG|D˹QN`&_Y:‘Q9^[5 |m>V}nU:|ds+"+kx bI<[M>+|mVV%14}h]CRm `{7"NIrM iZlWO)U+գ"^np[})K]Ǩ :q1p!Cu,!O$!ۧ"N .SDw5P,B$k! YpPͷ`lp0&_L$ܩ:w-s+>6J.SoY9,w1ym[d YJhQeUk0by?g<漢u%yp*c1r19ο*\TWT5bb.ڒ>K??`\׻`X'2-coNvC46 ɷD!fqX2 zUm׫0PK  PKy.F/angular-1.3.9/i18n/angular-locale_pa-guru-in.jsV{k0Ok޻]uVZM m*MNZD gLiӽFţ,ZOtvUt;d_3O`ӌ UuNzjESr:u_$f61, WO\~nݰSD}pOQ)|0cEo^M,6>iwm-eG<k*a\l  Cdn* ?LopyWb Z [?40u;-~ Й64`х͗GC6F!5˵6@P9i)Si$WZ4J=k-L"="E[YBf#Ѩ"|T71e/b ,~ B9 Цl#\mAI]vw1۔Sqdݦ# Dݥ##>9 ?}^.g[}c719镥ʺMS*#Tt4Ufax>T=aLgBE$"n QT_,PǁD"xJ7!NR`?^;3hWĀ(bUYl<%-g.mjN2*(Ϭ֕=˕u/N[Ht]ifqcí=Vt_mL}veN1TXYmJeS_a_Ho{vW3^ !dU(fE)$iR UKcOGeh9ˣ*]&Y V Q|-j:%E+%z7Ƨ&iXhQeX$V1dO? 2H9:ѯ3}gHBi/9٢5~_UmuتtPK ^ PKy.F'angular-1.3.9/i18n/angular-locale_pa.jsVO0i_nwzp^PdN 0p֑uu HBCZڃleQ< ,1_/qݎ-1r,4顔ʣi^[M׺:Ct^ZN̲۱&Ž =oMgn^ZI t/qV̷{e[vױnYl}p|{ [&4x|5I 6?`pULKu 8M0.(`TzK{;q ɇ6s DXc?Xw!cÏ.l>eO-Z5 v^nI ᘥ6hHAqoE S۪|"$#*ZU;U((4lA; 1MCđ &E AEQP$)"ۊ.V|+C'b(/mI*UʁQ(>8 }YӮPg$oc*ggXӫJՉUuۦTEY)ӨV}ṗ[SESdb1KDY -h3zGQ}D B-n C~l? 7fЮ!cUYlV<%,g.m 괆N2VfJy ;IiU{M׵Nj76~3&JfQRhxUͥZ+ʫԟ(<4ٌQ.e.I%"/#ZJuJ%鮔JL|9ZK0ZƋ0KJߌE:^$$XG${;"!EϐEΐ ?Z~ZKQYPK7u[ PKy.F*angular-1.3.9/i18n/angular-locale_pl-pl.jsVmOF_1Ⴊ&V) 'D-&a1^ZK3ك,ᐤJ҃^E0e42-zƻXEKbY*"i&<5L\ޞ Χw }xF]0\E9:(DL!]sgw0F!d"G1=WƦ(aS>! SR% U$Hc y`4ɢx) &ZpnŸ`C.=b!{M̔-6V 0A-f5J~.$"V(YBᰶq2v ]d~k3M9v]X0G1u9>kɂ g.(G)qz:g#L'F7'-wB*Ǯ?LsJ"P29iFJNE>[JuX}\S&]zmh8=׫KZ -{|h^L3?Ok!g@ĺZJyfMƈ<%Ń$bsPOILGt8=&RMriyMugdڃ $J@+ $J@V+ KgApRo\P9FEk /bs ??-ا 3f;ajm-j/$q֔/*gp[`zͩ]GyG[n;ɤ<#ΪhD~4f{ ދ7HDZA3łFė;|66^!/iܷхl=,>-'bwN'F0tSDP˳m}8ď}萈Hd#y4ăΫ?!/Bm{ﯸMa/Mbyj:eF%z$ PKӗ] PKy.F'angular-1.3.9/i18n/angular-locale_pl.jsVmoFίZ׋ierDUhE)dȝkmBb {gl9%)晜"fkSc/`|yЇocUB$) Ϝ/x?+wkB&)bzxselz<=3 1%U Q¯p PE4>>A,`& 6t1r!B4jxLق(Noc rPj^ Br,B> pYzoBnZ!/>kG+m0QM) &<݄sAkiم%N sS㳖,prOks{6tbts2p._э.T~M4׺_ *" %'۝#PVitRi۷\.ʭ/y PC~\y3<\gsT4maF  ~3 TwTyfvah6Y.*Xj2|]d"_k[i/i $r„Jւ]cR^߸гL9/۝A zN6$PwI~akg8MyxK>كjAC0fFLj~&B!_'4-Ҥ~tԞQ }4|3hxo/tކdݭS j*AC9B/1l 8zMz"Q/y3lVaNF 2@sȮق_Mnۇ-vU-rH|aslwwz3/3u=ѡ}3zmhCSC[Eyb 1 TzZzC5MyS:9sC{"uZD5jƭՙzY `IFKаXbK׬ERYNxR'K!d-j')/Uil}YJDe/0Dv^T,n\2.M 浜$hNa-TͪVa;Z^irz?MmS|m#*sTrG({'ȣe>>5 I]8xZ2e/<&%\㸿((i cXs!?r^-*)M޺{6q/_׵ǣlPa^ڹ=rpSP)U7fZQG6zCVE1xEBjPzũ\i*j{TdM)h(1*Kɦ0Im@Tpn)ϔj@ d2S?hs*~ų\Bᒊ[[GyʢЄ\i6-8ф&g1wKg4_0]ωyPKKf PKy.F*angular-1.3.9/i18n/angular-locale_pt-ao.jsUao0ί𢪴mi;iM Z(UC%&Jش tHMޝ])A)gWLav'ȑEd#b%KV/3&([e܍ݴ۾;FWZ~PYŻ,s c1}39|AiV5OW8 uUamӛ봼m  Y:j1F1x;.M =@PIȰ9aoÆtMR>~R{^)2Ɋ"P# ?0ҽ84O. 02!p?Eɪuvbvhh 6٢j}`` C544ˊ"1'=X6<5䣪Oȁ'LlE ܏b"|q^QӈFuJYV1腱T.ƍd.~Ҋlꍜﶻ{(Gkpevׁlhdn4YzH oS, 㸼YLPK"?PKy.F*angular-1.3.9/i18n/angular-locale_pt-br.jsUko0ίRM$FR*!J%vn slj} 32\kE2Ƽɡâtc~ޒ+*b!\Дz0G߹u;{9' pA 9/0swLU nT@<*½<'̞Ռj'Yk嚍%݋K5sX;:i6񆞂j©4gN ӄ$ P -)Me+Kb.vmyApVz~г>`, "J%j;NcK|c(̈́Έ ɝ!BV6RB3~F'l6(ڪ孙VF><40z! SG!:GUi8eQ~VBB*UPJV iM"}ʅ^/<|r ~[H+=kհ{]\}w'S{es{y6r*P/K0ld p}'>}}Q~*P"t|#mZbʫH4BH.T6L"y-sRX_KNԧ?Scۜ+4TF-q;Xrw2cu.lɜfp5]C&G }=Ct B}ـ ^Wa{][k)PK:aPKy.F*angular-1.3.9/i18n/angular-locale_pt-cv.jsU]o0}WxQUZ4 IRCPXKLH8̱vH-RSs=v]deE3^o0 Eq"& o@,]E$x҃;Dofhp;:nǷ]o.Os[z%,nRYſ$+scH0}39|An׊5W8 t/.t.amƱWtm  "Y&91F1y;.M PIİ9aoFtR>}AZ}g}TbdEXJFX^GA%iƍpF8IL DtUI kΔvbs={;N `4Mi`lV.oDUpTR0RࡎwoeesǗ, P= ug ┆EY "zAp8'/k%I+ˊ:y{<DIN)FMb W WRaiZ6gGw>#ϳt8vv֥ݽq4i+,B^2=T8pl( }6HJ!Sl)@B6c4&W"W}[#ekЩ[R_++ZUο(I* ], i+>[122VD(Z#_&:˻m۵^PK1[ PKy.F*angular-1.3.9/i18n/angular-locale_pt-mo.jsU]O0}"DA*P`ҤvLJHTcUe7 JKve[$Ϲv]deE3^o0 Eq"& o@,]E$x҃;Dfhp;:nǷ]o./s[z#,nRYſ,+s cH0}39|An׊5W8 t/.t.amƱWtm  "Y&91F1y;.M PIİ9aȓ`#fe > -Kuܾ3>b s"L%x#H,u/ ࣠M4F8#$TpQ"h-gJ;1칞Z'l&4 qlZwz"8XhoPG@ ; 7 깈K | O:rG3S[qJ"Hd 8qW뵒eEtf-Uh) Zix_OHӖ(2 ], iK>]222VD(~\&G}@g T Bph<۲ >˻۵^PKQqPKy.F*angular-1.3.9/i18n/angular-locale_pt-mz.jsUaO0_ETI1+"JSUi4(q:.P`'-E";=v]s^o0 Di""G 9@SV,Y$yУ;Fo5fhx7v;wndzo];h!kCX3}@Be^{/3N Uz+%aֶ]+<]HЃVCȺ[Ǟ]\㍬hCXgH >Fh6Ʌ0h4iCIin4ŬdAB5 SD~ 6lJ^G'eΠLO*C사 +S1΅i%ơ|tY qԐ.JM֕l2vC넭6@rg˶uy'&0u |,+^(œ`4>#l?3e%4(r?ΊX39{E^+[iZ2+eYJRujL7jŋ*\)._K[ٜ;?lwP]w'đ:^֕ݽu4CinxXK"4xS&;|l84@W5J*894 {Kc `Ȕ'4%XfLvyr-rǑ)_KNRP/F^i^Ѫ?w4mO*m"pې6P#0nE:%jCDѷKt>H VS- 㸼]NPKª_PKy.F*angular-1.3.9/i18n/angular-locale_pt-pt.jsU]o0}WxQUZ4 IR(UE%&JlK];vas]ATTL#`~P&-85t??go21t*bF WoNڭ#t~7u]* g_w0g{@髚t\_sURyĉ{I󽂐s k7;^+8 ІqZ^S^C B`ɹSh94qCQi.KcbVF"IC|4#1dž߶"%bm6#/;H],u- SPe%e*kV~qbzIql$`bCLX>DPH [Δvbv 6ٲz]ޚ`` ,C ʪg2I. =8.<5jHȃ'L$FEY) czaxy'ii#ˊ:yG< TKڜVuboʊj}(vۣ`eYO.`ް_c"ow&? 7yqnd+BʩpٺUL;HJ>i@L5c 7"Wk/UkiZ`|'F#m4hU;PG,q [ɂi #B P>:G_`SDHN7oc0 YYPKEl6PKy.F*angular-1.3.9/i18n/angular-locale_pt-st.jsU]o0}WxQUZ4 I R*!d :6}@EjspΫ 0;_DȢ]2ja%ЗB9zs轲 FnnnyM+v d~PYŻ,k c1}39|IiV5O8 uW:w봼m  Y:j1F1x;.M =@P,HȰ9aȓaC˦e ϰ:5>b &Hx+H3FFQeF&Ar#N♩!\K)>y˘N }B s:[U[=||47x#``YQBDQs߃eSC>x̔V <+&~(bYu8ni^'e^+I2aܨ-OVR*X(,iB{v=ǎ\3˗[=Z߸ g凂yh<홇Lv'oY>2/ KplٺQ[* ;7HJSl)@B6c$&ЗIU$XqJV|bdp;¥P@GButx(~.y e$|WcsS7+ PKhEPKy.F*angular-1.3.9/i18n/angular-locale_pt-tl.jsUko0ί4 IR(UC%&J%R;Ϲ@feә8h0dI2&nSGs<]Psf[m9܎?Fy%< eJpIW ^7`f]WsĂpgݪkp,A^\|!\NN!x7#XdK6ܩ[$47M(@z1+#d!>ʱ׭oRfy ~aZ{AɊ2P+ ?p^Ldm4V8#$T Y"X5gJ;1`{;N ` m@ -ql^wf"j8jXiihoD@;7까K,| O $ȃ'L)܏Rzaxy/m&I3ˊ:y{< h%Uf x1Y+`bsz#o ﻽x:{jٽbKsY6t V}'Q p}G>~!}U-Gw ~xVIf60gd$pFPU36LMr-rQ, -;_*ҼUۡ2m)Et8`e](]钓r;!:G }@ v'8ywe $|W7ck][j PK5:CIPKy.F'angular-1.3.9/i18n/angular-locale_pt.jsUko0ίRM$FR*!Jl%vn slj} SLyvЮaFCCE|c~R lQKVX\Ϻt^"8]* dpo` 0: g5#蹾۵r ťB9\yb{`@xCO[ 5sp3Pfb<,e~J"B| T`CgD&%vm)yApȫRA?b0UYQ\𝠱% >Hv_ q $#ɝLVW)!yəNz?sPa VmL_ G + # m` hxgfXVUq|3SG!:GUi}?+!!grBk%I+Mˊyv͍&ZfLxsL-QTʞj鏽﮿}.tǾheڹ۽<C?KQN~>bG>шv?G(w ~x O6^1Gd$ q!M z$]H`\:ҩӴ%X>/6o Qs8b/R9M2;!@ };CMzNɤ`e6~\݄um}ԮPK¿KPKy.F*angular-1.3.9/i18n/angular-locale_qu-bo.jsV]F}W\YI0 HRЪrd ĘDt #c0 1LmVU--s㹮[II_cb,n]`58ʸ+ ?GBW\4pci{  *NW{;o{pnL[$+/֎ NK/z ` @DAdF\2m.\zCJb/IcA:W6WP'ɊZkQ_;*\I:y\ENe *~ Oz>pWL ,!z&ESsaNvp!uA?ki=d=0#\3@ctn-zl[3zy!1%7Gc5ZKWeaK-⤂i/Lp/8v9sjBxܔSuIqTZ7,I%9aޱT}w05aZQ '0!/)є'e+fKvKO ֕ƞ,ޠE)OG;]fl;OgS$S)H (&Q)W}n Z_t@ `ZH@ UqD,pl4O\4I-Rs!gZ< q.j vK*YҁD&|h)!K~KdQ"lPK;7 PKy.F*angular-1.3.9/i18n/angular-locale_qu-ec.jsVmFίY` KA_3ctkX^.^y][U♙g^7B%l5 yHnyHM цo1I\0_2sSZpl$µGgK;&12A̅Pd{!cM"ڮdaC5t"&p 4 .>> ffyD5t-z0@Ðu:6NZ/7&oC N"TjaCS]Cq`~HpHFj^&u<VifFGU'v-z-x%V@@}Dj|݂9*T#?bXccf:77ɨ#74AQh+H ]-uq%qqsV!IV쏼ף$8sZ I\Oď 9Ӊw9C|Siݒ,w8=Ifj':Dyg P1͈g,Ӊ7dKvED.ɟk!HÚ=\>I]vzgS%sNEH* 8 S2K#8 `+ATlq,`S+  `+]g1l|O90˜A*/=Y yD MAE-mj.x,<'8Ʉ8ogsWK\#IvړqtD+nls{&n0>LIzfyNE\@XQ{Ą—~Յ)49@8-kBN׳D6S&R0P<Q.ii|!Ue+靖gU҅J7!Y~Sy:_J%?0_4mwJmwb8¿6 Fve3.Ě=FiBP]ܯbE˕^/^? wPKD6 PKy.F*angular-1.3.9/i18n/angular-locale_qu-pe.jsVmFίYi0-pKA_3$鴇װ6kB(ܵUUK gg7Ŗ62oDDn"WɒDh×,)X Pen*FA2]qdk8nhtb#H|'3;d &|/-[ە6fqPaE1]D[ 8F4 L~flIIFsq0Qz ~ ~ P1|vF-ާ!I4[) U`hP,S`q`k(N&8$_wcz5mx[&Ou<Y=MvfFGEGz-z-ZbNo!]u  Ha1ѿsǛXg &rf_PM>]P*Q NZK^Žt[Ady ?DGɖI-tѬ+O$H 9ӉQDTl:-$gDlp;MglG*Sk 3M<$%KvKk!=I<-\>2vm,ϦJR#FpSeܗFP`+-vZqtM$ `+ vuGdLrưiC>mPR*R٣ӀX4^qQG_;cA Vbe>ތmp7ÚX ~z4Z@+rpjVUF(yZ,NjXv:xU}ʳ*$x\sv'EȽ1 Ftiݲ$䄥k{bVQ5vز؅iMN&$FHl4dk! YFo\>)2K7F ehOB>|RymKN/cxsVvʴBuw.[g#-aヷ~(h |V!o1-.~"֕\SruoгvNHƚRxϥ ToH6ki~v*s5NmBZ\FdTh_ĩVnN %i8$eF9īa}mljZi#Wr06jEzj["荜vGy_|ՁowzzPK5{Ũ PKy.F'angular-1.3.9/i18n/angular-locale_rm.jsV[F~WYilZ KA&dhZM3FmYYڇz|0fSȋ9 leB-Ci@j #oYZPQ)RXdfO|X{;_f)zW QRQ"I{&Q[~Ĵ-n:O1IFݸRf17js^>6aɑdFZ88:") U'FE1D'OEH땿kɃ=x^jH2֑ZT8ieN N8HUEӢ1 0 i ˵ͅ,׸cT{3Muv]nI:5+.5mD&]aQ"iRgw$%ca8 dInBfHLpj$2jiJ.cu`p>)2 (}[!.]}Zsp\/T^+;% 'ٗzpp׿9iserr:;oŰ[?l|7\63w~m[yx˾˦߫u%@N.2\ zFGZDdlƛwx.M` -#ٌl|*s52kVgZ\FdTh_VnN %iY3CRf$ɺf6崚6r%NksM,G޾*qQwԟ7zgz'G| PK|4 PKy.F*angular-1.3.9/i18n/angular-locale_rn-bi.jsV[sX~WtQUFgeR[AM%)g&:p݇]}}\ԅ4KUvo0%Z;"tU񊅮҂o&.pH ʂ Ǝ%0_XSk p[(ncQ9dsK"_(ždk7QFIݸ bar## hwSOҮdIL$T^Cۄ?=t ]gkhc\ƱQsi u=(jTST@z/ஃtװ+B0? 0X֢jZ)O:侍jBJMW && R]v8xG.ǧX(prUnp?1J/o2Z ѥ|Ռ$ASrP"R.>vl9 g7{+$>X&.}Ɠ'̵AT5=36["v&1=K$^a%R&G! aFOKIe00#+LB!KgQR|2|VB'NCp g'$۸lS'rF"0,7$|x$i$E-J8Xɶeɗ+XlPaxpxBx^'W1K-r@D[&^Ҵ.<*ghQ^Mq'6D%{RzTb./uy |iK)70gdi4ckڲl`ۺe Cť*T>R2b?F [\=i;jo9+)ۧ)sZn\Ӗ +飔繤?]t:s-Qf jTѦlCpȨ kJkXwpEхl˻=< W5uk/'`?6f7PK~%1 PKy.F'angular-1.3.9/i18n/angular-locale_rn.jsV[sX~WtQ#FgeR[AM%)g&:p݇]}}4EB%*k"dŎ]U}b#)I Rx jkc i8Z5ִʫ95ubN(=G~=~7'E1McQf7*X27hbAQ@-cM"Kf"ᠢ-:C~+nqlT 6{&Hb b!Uo U* 5 (j6|Eg:oCrȯATa׃Ni; i}kOe ˛13Hnt)_5c)mI|Д\z,쿋8}p%M) =Ʌ2K_Ǫ/cʍ>5p!Y%ؚ.fl2ضnBPq)PK'. PKy.F*angular-1.3.9/i18n/angular-locale_ro-md.jsV]sF}Wj Z;/jFY oFZ1+{Wayh5c9UWL]wˈ+NQy#5W,PD(.c 7kNNwdp=wKoWp#0R`r HPI7'N1_T?s<=RaƝ8i6;(5cE?CP1X24V,fRp0za~FQaq;N!9dSԠ,JXaw X>dX 2dV̸ٜEXcK*Cd>& d~׃g{cqr<#I$_E1co]fm 2qWM]bPKSmt@l9.QL:\ :ǨI1 (nL1M/mY) 6Zs 7D0EyB- tr,҉h}1LdÕȽLs2o-$,iQߴxz=~7 h"A8DR([jN|i㢋ڪא+JjF,|S]1}CHqm~m_~!|) [#f|poPK PKy.F*angular-1.3.9/i18n/angular-locale_ro-ro.jsV]sF}Wj Z;/ rpFY oFZ1+{Wayh5c9UWL]wˈ+NQdG"j="YP]n\Xyۇw- \O[JE˅ *A'_;{H;YlĄQTLHqwⰧٌXL9 ]@uc1ZݞID = lcD>{ `8:zMއ=NQ*ciR,Sbq`+\=Z1fs>\br-êɓ92Dir _=#F>>+'3G~IJ ѿqN1*DF] ~D7uĊ-_B/9L#_ڗHrvF1p1b'|J4Ⱥ16e*h].#\ V(l.]AH'bp0- W"2Rzhm첤E񄵽ƈ[G0g?t3-f] (MңN]}ۡc""w`UoyKVI d,9aqUQo͜鍋OR~ͿwU6VwP2kUM{Y%2&ٵ\Rj$(T  2Ts!I+[Vߴxz=~7 h"=q є([jN|i㢋ڪא+JjF,|S]1}CHqm~m_~!|) [#f|poPKG PKy.F'angular-1.3.9/i18n/angular-locale_ro.jsV]sF}Wj v^u;dzތbVZ9 >JujƘsYL)`۬;V2w7ɖD;3^E@ی%ܬ:97]xkߎ#sAU2dr>>ww<_# "㩘 8aG)ݲDU+rx]@uc1/ZݞID% z'0DLj]gwQi{e>$~/tUK5Lb!ˇ]B^`7hslVÓD!Lozv~-6!B7uY9$>5x_-B͒ 趢#f oTƧ7KZgZ̪yEVC(PT L(PO )55Bj'P}(a8x!/GS!%|W{m1 ʌl6aѥG#4,.ʷCӇDdEr]]'.? [#:Șߺ9?[sjb^:k+g,-n5[l,Ǿxs6eV웚aKsdL\ mSbm-\I5HNwKQ{V5Z0^P͡$[l[MPhε>O#0|5QwY8,P% ф(ԖZZjB|nݢZ˗.KJj^E,|c]1^~|CHq{lhy!|) [#ftq{;PK PKy.F+angular-1.3.9/i18n/angular-locale_rof-tz.jsVmoHίzkAQE ŀsFl^#{mPͮ1 mU%33TT;i@f3_GSxoG^,(c3 ) qjd4ӽu]rL Zΰ ɋ#,d".@$~a}BVHo½i#^L6J8,AbpLj* 3bi2>}ڬ֤$Ds0Pz mT <> h]NeS)unc{2 Uu*`gܛa3r l*͐q\MNU?ⰶhe::*Qd^ԫwhh害6d86Gt] ř1,91}ۺ:vj2JȖgTy%=iiHI}3>DDvҐ.Yf TUx| ,hS#JIKHa*ғW^`EqE`/5&#AVN=avB9,9PkN])^_jjFG!t8.z|>;soohF4F4F-#'d4Ω :S$Aơ,f, 7Xð$P *%{߹e6YDPgmu}Zws"k%ֳEr_ DZxb˰:9z}IIs oFZ/Qu-g_F?2'YiqE`J10_/b:=P{y4lܛb65Ax]FV-tJ?-}IJZoDDvӐ.Xvf T{Qx| iS!JIKHa*A߽Г^`IaI`'5&#AVV=avB:,9PkV])vJ~'/pt1p']:uFhQi݇b>5Dh[~h^ͦr~gTxẍ_`x˩N Bc_zSVI;[aJ(Er\PḅX(׶:s[ϹJ YˢHh9O/Xv4eXwT YݞKdd Q Z/au-_F?2GYIqE`J!0c:S{y65lܛ cۣMj2(e:Zn*P=~c-]I{5m6*,7Ey Fő"Hctlu_mLD\V6ȵ /_B7pʭ޼3 |y|ו5. PKL+c PKy.F*angular-1.3.9/i18n/angular-locale_ru-by.jsWmoHίb{/Pzi"ŀ E6dldlҔ;cU,e㝝q=pջ5/^摗jdG˫dE҄7X6\0A,Lb5`Wz)?ߏ`:|-GC7I̼L?xx3ܬYL/ld~컵~vÕmԘ11_0F!ha?$qa uzQx1 LO7%b:`uY>mE9ET|qzط#O'J'Oaۏ.(~($f&VkA_/3"mޱ"{=e o MB֫| ¡hެژ<6VXr2ϧe3-mWK䌆 H[0cN)T+Rts"%@1 \ZM"_) bUFef(4'Ĕ]4&rDK%<Ȍ+=kCMB6X9cRUVgzr1r>ؖQ jcs!I)vUZ>N?<[<ȵQmq;\a]R.>Dni%c)6"Ӫ (:2&, Ο|^S$^kE?#:jl:+Zq)Wզኳ|l4h qGRӯFPtRg?yg~]f@ۙ=tpcv,bJu|k(tjCut)IEl?+:&\ySo.dSHuJ/c/Cr ֌I`D:ʒ-"d~[Hm!$I!Q%jI bWJ.XҼuc4Ju^4X!8+ l~fLRmHQ+_qqޱSѠ7:?m4 uxF :jӘ<,y,FDHir새=1A PKAMv PKy.F*angular-1.3.9/i18n/angular-locale_ru-kg.jsWmFίZI0-X6v!|/tr˅wv-Gn;;33/zabA5&:* HUc^@oKm;u <|֋r,a3,ʱGӟNO2öQ](PQ-ILT+-W=~ׂߛ .r_gE|V/g.$_%#F'l%07 Y~:)%{jc,ZI[`b=8<(Rɋ^-3N/"lŒ9PJ͵P`TƤpkIs7Q|4WE8SfJvG#(\lf5/ 3&x| 5 b8IVYUȝ>`[F7ͅ$hUi8IRXnxH"F9sMCuIۺubVP>ab.;Ug)꬐jť^U+ROҌ-49HiO?C-K͞)7wpp0Ťvf&4K;RLo eܟNmw(۟.e9 ?yEDŽ+y%Ul .8@Ue_SVQPP<(]'BYE< -<$I!$_-)UP[\{KZ^r:S/x,}lg6Hvie3&F`Tac6p(/8lu8oXM)\hOxmqg: OOނa5NciL<#y] ?\Xe$49ADFk{ PKTҎ PKy.F*angular-1.3.9/i18n/angular-locale_ru-kz.jsWmsFίj ZҦҡX=c#p34xd&Bbcc{npbIˌw{<"X, gYSEyLyJLf^+MxʋUl9y<$VKY]{НB ʣ&h9xHbe]dL~f} xXz.Tuj%8,ԟK/Z1c#b @`B&xj]7Mgy]81Fȏ ڮVLUk3 BU:5 Ps؟#\6d;mj5&(SP_%7QeWz^vӆ V ]6^c_Deɷb'}s6tdyvjYG·$A7SQS[f>[-= {s%3CsWLHlȞ2p',1:bC-Izշ۞O@8-ٛUfJWQL~GM^j`r.`f)jUn]H6&k^Kz_B+ALʈ,raĀ4SF8Ab3Syd1q{mIF+qLʪLχ2Aml%)EӪJIǒtC6-Gk"K*?ǜ-7~;%҆~UwIq8)MWBr)eٱ?epi_=OoS~[ݿpp#v,ըbVuPFv/:,# ,ZtHLRᦐ^,e (=)X3 yd](KRo!$D%r4]*+5P8gIKϏܵԋK|9Ghٙ͒:oؘs)Uؤ 4j8Mz3K0tv4G~3[Vb4|M@}BkvbGohSAAw`X r>ň|^W"^ɢ:N2^: v׸PKѓޑ PKy.F*angular-1.3.9/i18n/angular-locale_ru-md.jsWmoH_19g&R-L bap&7UaggyR_gwQeG:z^[^B#˧mĚ?"22z}{6u7Wz+Ez&X׏lȞ2r_yY";btĆ[so= p(Z76&͢&ܣirK+e9Ӊw.`Vf)jMn]H6&kT^kz_B+AL׽ʈ,raĀ4SF8Ab3Syd1q[mI_G+qLɪLϧmޠ669mJIǒtCV6-Ck"K*ǜ-7~;%ц~Ul!*l݆_%:?GVj >4F@}'Ŷ83Hހq OOނaucqL<#y?\X{e$89ADFZ; PKje PKy.F*angular-1.3.9/i18n/angular-locale_ru-ru.jsWoVfl`m7(qH1 CV.\%c#c}Ъݻ؜ƇMޭy2T[%rttxjB,ǎooHnf߹nml ~{߿\pɜNP|"=l,gZd}r',1:aC-Izշ@ ͪch%m{qx>-QnilZ"g4^E""sJZA%k)IגS7Q|4WE8SfJvG#(\lf5/ 3&x| 5 b8IVYUȝ>`[F7ͅ$hUi8IRXnxH"F9sMCuIǺubVP>"4f@}Ab[hcAA`XӘ=r>ň|^W"Aɢ:M} 2ƾ?7PK PKy.F*angular-1.3.9/i18n/angular-locale_ru-ua.jsWmoH_1^'7!M`[ع*FA`ap&7[ÞTCʆ,!<^#He2Ik,I%i/VyL鬈T76Aspvu8GouAZ.ny~b-> o /p ;f1=q}fS܄5$8,( Y)c"b B`b&1t~EzhIe}8Z'E$L XƶQXOېUk3 BՎz #K4#\6d cz=6؜(SK[2HFᑮ^ lK{ׅeMX,=jGX^|o0h]d<xcm?P%IEUKi:v![o*r~oϹdF;(}M6is_\(8/ʎ=aC sͺo펏@ csh% 7Qtl~FM^zpz`EJsJ:QSM7)M«(DR~ޫTEChO )O3%[4DWrDK%<+=?jCMBZ9cSuVgzr2>؎U jc{H)N]*'EG"-@ p59DTT~r޴ TTZ{MU10굉$9 46 ɟ|)iI.%Ӗ<. ?Ar]5{)0KND5]dy} 3sȉ;*Úc-Ն;c_ʎyHGᩇöGc)ܙ|=ht{ۖH-'\_`#fJOS4"L8)> œ2bTl-\2?-N.$E!Q%*Kȃ~. ĕ(AIӌJ,^KEeZ.WdyνW,݄ &diVl/;f{ }e.(_,EM0/ g3#=;5nb/y`se6)^00 "& 41 (d-Lq6fd~^d xڇ]Td ڝk5?Ԥ *]e0 T@0@ LaC& /0QѴDaJUzzUQx L%n7]``uU>mEET|)qvطgc̦J'OaO.(~($ZT-W=~ׂߛ .r_gE|V/W.$_%#FGl%07 YCђY1yl-0p2ϧe3-mKGsH[4cN)T+Sts2%@1 \Z{& 1*#[BqPcbL.`eL9楒Qdĕﵡ&A1):3==gl˨M.'IK-IZڨ8g}Ibr.Xs"޴TZʇMViEzo ƫ ph'lV(MZ:#8qw.묐jͥ^W1g)XߥYh2OFPtRc?eta^=^N*˷SNᅃԞ0v_M*)^+Lğw6 Х,WzA#0e\RI^$, L$>)Y3 Et]*KJ'o!u$D%r4]*+uS`I WYEEECeͶͦ7lĉ<*lη}_i%:?-+H9K_~0> `- Rw`t񱤠{0qL9BbD>|~cT dQ`'ǾscL]c_\PKO9 PKy.F*angular-1.3.9/i18n/angular-locale_rw-rw.jsVmoHίYbz@'PTQbB1^mڬhY6kt<3UQry[!<1$ dLmGԪ÷GYo"ݰ@䋜X  0y~wn;`H99(\y"*|%Ǫ:Hh~q_9i:wUXo];[wԙ(E]7x6Ѩ5wz.+*>ԘQAZ=-\mFWcs* l4;_\AB JSZSqoL⿔Zӹaj6ntDuOTm[[mIި&j o&lfR+^&MAz=VexPKBĿ0 PKy.F'angular-1.3.9/i18n/angular-locale_rw.jsVmoFίY\ w U%dL#z ^;k˚K[Uyfy]<ˌB ᑌh%i cj[zi/sr[c 8 "`0σN\wǛtS"s2vPH?*EUyn($9+*cCDd 3 8F3Ա SH~vUo(l^U@hS+Btzc﷡͛nX*0TEիa(-1|8 05' V¸] D1:oҭi7ё2DmsʮB?QBB}Dz|g.#?`X߹p}fu&N]%~E3u!`5Եǧn齄N&[*+^n $/T~JlM^``Dr_D YK ;#3OWD%jG8FGCl 'jrR 3Pnws JƆzKLy$15#/%ݓj/hp7(7-1iSM]ăhr"s O!%bɖnMC;bH,ެN  eߐ!/s86JKhdȥIͲE]>KlsTw|6(+UGu~| Uav \3gMzTִ76%shPcF[`B Y^k qիrM_ _V)Xd`ݤն *?OF%]T&_{?gԲ' TsMx@T~k+[I.vE`=ށ[V;֟7ŇI Cz{kG\'PK˿ּ- PKy.F+angular-1.3.9/i18n/angular-locale_rwk-tz.jsVmsFίѤA@ 'OG#fhF){fy}=n9gᆷ-v""Y?N"vɆD{3ޤYR[)0au*H;Ϻ}XpmB=݅ a2E*/=ݱk1a_۞{qK%S c&0ghcCPJ!on`d+ ; `e;`8nZ|Lօ$isJ,S0U)0}2tWPT.X:8qf7]X> l&p@UHTc17yj|Dg&R#?bZccoaz富QI2j,gHc.p >BR`41I;J'\W6L3=q͟X Z4q܅ݨ0A2-Ό>fMC6{Jfմs!9*DN\+r?juO<")SF_k/NDsεZkIe5>kHc \Xk"Wk a5@U"S<OxQvRm(b[jQʤ])0.ѷ}]GLTեNnI6e,_mdZ;2R7}e/|ܻvti- B'cVlY`Ik˜|exLxW-Jo$k -޹4Yd4MTٞ;(9q_K:.?`@>]𯍝=T{{KDeO=RF5Hd$ɶůmEm}4p!W6)mY.!} Ey%QR~^o}|@?+:tpn*}< [(44yvyeZ f7_ikU1 X$i*k|6>e $,D+h a @U"gS<OvxTqBeqK.4p8IEjFm Į~T-iΫwބ"&JF7$2ίzzyry\o_3{zžWR3Py>zJIJ|!1uU6A,5aBs<&mS+ҡL5҄\,@Z]BlT8ZMKb8$?_𯍝=T{KD/UH#EN)TEJԖ\FrO{m\F۷P\r%}17 t=^?LN.~ PK\4PKy.F+angular-1.3.9/i18n/angular-locale_sah-ru.jsWoFduZP41H1 CV..KF&M3{f%N󾛻f .Ϣe7x*bu6_ā%t@klt2D/i'족^^y˛`|x vrIi߃,؁4(/ ap{w0^ˆ'Bc>r;e{R@],tS%ŷn-* {DŽ '|=TB#@y\@eve_s$gN]ģ]vQk=CЋi uM{[jJ2^j튜l\q/K܊%:j!6A'6k]<ھj$ ¢m:ՌH;9@D酪)}#I-jx>KR1)աF"iEaĕQ%eֳ]FILM@ھKR%':+5~Du+,<^ I#OXr_ VFO'VmeNiRN-zܦq&6kv(QSlM_&[MMꤢǯW񹁬I&o*#G Ҙ$ [8NV=– 9"rT^Rc1lqCiZX*Om\ag<૬ݳ&o̅ijrW(q~xM-N#"Pdn?*6h Y;6nFhuw4^b|E,D_8#pq3[$WN  /\8Ϝ|&WӒ*8}ѣfwU9;& 'KI5*@HD 1 V ܖ 4 ϊPQnӝQKYT?TT P1kX"_$m@Mm\dNqnЪUP(FO`1e6Ę(ni#ɃSGwf>A*13sڵ{ief S[0-0L/|NؖT?PpyqMTW0 -bIuvF(C`z1!wa_j>nl U[P7qUG0Bss6b13W~1hj~:/PkUS4eզ=Xoqq% j/IW5MvMr6\%nM^7D jpt 3D FMI}Dm_ mzaZ6TzF? BՔ$QP t7#QJRTvjCuHZdqzTIمaQj"SӾЫT }Jͤ+Q~{ڠn< 8EGqá4l5FP5|>Yj(3EwUMrRo6|<{pٰCjVx\Uė!'5kcf2`*:T(n8Y͔g [&=rx^âQyMr]$ǀ Ac 4 PQnP+YTz5?ԠT P1kX"_$mPM[ei0/]&jqVD%2&{m.\-NQ^v.@u/n^]k׌5,PKVg1PKy.F+angular-1.3.9/i18n/angular-locale_saq-ke.jsVmFίYI0 HSE9_#&:{MF͞&j 33n39I-:Y Us]p|W(̼n* ]b-72>GѲp? G!ZZS /= W=~|hEWp l ð!Ú'|̏uA(-4eĊ\mH$(NBsN6AC+]!&CX"00TE4l`(=' ]@V`~h`d R}*,.!:Qٶܜv)y*Km=Sn=j`+S:W];aPv'uΖ%K8fӆny4^jҀls | q VT cF>lM%;|Wx/]υ: 633e|gtx/L {oKc<13t%ѶfmKt6rÞ;mlţ7"Aׁr*nG8@t"X}|=éDŽ;( y0>*R !+yNQzD0aVTy.O#U[^ g"@Xgtf[w o@v񰾠SuO%?N;]ݠt<PK)򓳱 PKy.F(angular-1.3.9/i18n/angular-locale_saq.jsVmoFίYô~)((q.(1FiDh`^Sqwྩϼ>3mg $UXg{af5V,Z>=fGeb%ց}+g1d-{ Ͱ!hx53 < ~mV}),!:U.ضܞvy*KmSndz`(SP];QXvgϖK9fLZc/5Ne!w,$B_a3 a$*5R3di}gJBTY21!f/}~LmۘMOIaoweL&n1'IOm~.ѮDc1zSV~z#aJA/1[}DD5P@szL!g>?+M^AT^i Y0aTj"h+<0q6sT]< -^7%=x8yiCfthpkߟPK(G PKy.F+angular-1.3.9/i18n/angular-locale_sbp-tz.jsV[oF~WYۍi>g(d6&0dc˞%36S Ck;/dAyd$%Z2j[9]#%l*\"^sYM>"U3aͳtk Pe~e׆?߆J(w7z$##uco]zca &f]%~E3uY[ČlМJR`ХJ&nw2!#W&ύFƌ(" DjY9%)Z4qgSOFXy/l gw43RpeQjߕ|gkpHXC' fF9d(E; /MBSJV5^< b0 A˜E^ w9sݮ}ɆP _ !3vfKo,L!j6*]AX^XŰTu,[j`0IEhYI#@RqR-4ePEC#W&:RgF7砊wuXjTukʘ mmMc?}5Ze mZ4Q۴\x6AwZv{Z?y KY^1FPK PKy.F(angular-1.3.9/i18n/angular-locale_sbp.jsV[sF~WѤA@'Ob9FYViB(g%6ZaڇV3\w.߹tԖBJG-CHKҵdԶxxVa彰5m,HEDqu|WA p!a K<7"32 (/Lkd4 RL)yޚf2"[ըzq3׃87aclx-%(u&Ba|1"34ۙ-If0٨@2vEb9xua .^OîkS]BױLoD$eU&uJIʷ\\]]DLt֥ nXAeMM?y-zD֕3upJ<\]ǾxS7e*1%vLȷ뜬NLYzDFDoj9 yۋcj* T&ն 8FuI'(O'%kaG]^aתQsuY9aZi,gFQ{ 5&j{o&Tn}' =|@?:2=IE,3&5 aߤ33mhƝ*94 "a3aF ̥_~1JMLS3Q{} FhR;_qixCx1u=(TjLx L E ެrcCpX?ư*=T:7 7 [.=f#pz# # 1vctn-fa[g&fb--)~F3h14 #H7M^dD_}(]A>>5 C(}R}< 3{a S$+Y!!Y5Z3sEśO cB2Ҧa{$nz+4IRM"xV Ee"D%7a]hjsf'J${Q< Jr$gi?2sWqi+6c*|J.g|bJħBsJQ7ы/0hT ?Mw'ɎioY}]ڗEC+>{F[7޶tZ[2vHUkszkne.WB"J8i뷦dGWwYCja71iD222/!,xRmYAKStI˳B~Y^ï*5lZB^I8%ծҶ5r&? mh"|i1kȼWc/ך-lK~+9>qz?PKw PKy.F*angular-1.3.9/i18n/angular-locale_se-no.jsV[oH~WY<K)dVl7<=|K[slY7H1wnsҘCD:ҀEPiuMxrui|T_ ԵXG{<9Ǚ8eڳhy$9(HAQdH^Hg~tB7B8&Lv䖯.WU䓦 mU,OHm0@ǀ /Bq]0Sӝ.: !1ΠHL2LU3 [߀b/n + X,l{/z7>V :n;r&]+_~~ɅJl7 C2i[ѹ给m6ȇ5HnӾa~xuJ g=UڧˆLgc F1e^ONߗ.,TTF,vYBLXM2ԙTTaOc ^*1\E=ny W <rKJ?V ;_hKs)kJ h`"^_4f{5\j. -]Qk X0+r)j*B{i@ŀ!p_H?0W,~nujxjpw8=PK_9 PKy.F*angular-1.3.9/i18n/angular-locale_se-se.jsVmoHίY|E'8%R 8^-x1{-m9{gl97,dyg坫4'N-&4`Q/np]ރ\kڻC$3%`uKXE0xGc~K_=G=gS)( wg_k4]2tX텾tC^(/X1$l~/` t]@vmm%*d68G ]X"#nF2f5r 2jF" ѣ}0dřDζ{ SjX&rRύc e^oN&,TXJ2ڱ2ZlLuK071^*1\F=9F:\ds8nNO4q*}W4:d\ dy2i2&?g6UMmvΊ"ʣ: J#$b_I%u }bJ"vd*S|)8RѢ: ':sќm e } p;`s)KRrOW_pa2 . ?uwVFIkY]͵q >WG>ZhG6biQ}y([s|o᥶0Y>ڳyfR59iO_H-eM`ȾEl}aW z/h\FܛGpҨ EfAg =wϑ~ԩZ@CK7۫O.bލqAT;iĂ1^xKQÆPEnrF6M[/(٦ ]Gyظz`zZ w~PKZ8 PKy.F'angular-1.3.9/i18n/angular-locale_se.jsVmoHίY|E'8%R 8^-x1{-m9{gl97,dyg坫4'N-&4`Q/np]ރ\kڻC$3%`uKXE0xGc~K_=G=gS)( wg_k4]2tX텾tC^(/X1$l~/` t]@vmm%*d68G ]X"#nF2f5r 2jF" ѣ}0dřDζ{ SjX&rRύc e^oN&,TXJ2ڱ2ZlLuK071^*1\F=9F:\ds8nNO4q*}W4:d\ dy2i2&?g6UMmvΊ"ʣ: J#$b_I%u }bJ"vd*S|)8RѢ: ':sќm e } p;`s)KRrOW_pa2 . ?uwVFIkY]͵q >WG>ZhG6biQ}y([s|o᥶0Y>ڳyfR59iO_H-eM`ȾEl}aW z/h\FܛGpҨ EfAg =wϑ~ԩZ@CK7۫O.b\^A`^F԰Tѝ~J&6ۉCpCF_.֭nWzvuPKQ PKy.F+angular-1.3.9/i18n/angular-locale_seh-mz.jsV]8}W\EZ'hB(SMJ2hw4'XJęvX^'qiv#ߏ)EvEw!<1ɆInчw1^dBwK;%`ssn3[u&`<,ŕB#2Y:G/xGg- erMqvTrh;87cFo ȊDa'=-DD =F0AbLyTa0vNVOK!= SAX*1U5`*)0}8 0ؤv7}x_>n֙~H񨏁T!LVZr%BC$bGLk,pkۺ_:==cRiBmTw5a:uH4Ҝ% pv!Wz) L>%-6blfM(eƺ9 т&zz-{ |kr\M4 5OXz{xPζUʗm֠:6acI51P@jW8^C`Xx!n@`USik)笄L$2^9j$\Io1/4%UA}UwuUr_[VH)Ijo,|~zLhjo5UsQP[Z?0R_F'{/Ē|[fdwA䌎^s)X96Y%\,@CGH:/P=wPi(~lZ@CKшq/;PUw]?,,Bt?H!x\Q//LIm4R.}/MVY 1~ e8ęy%QJ~oC|+9<׿PK PKy.F(angular-1.3.9/i18n/angular-locale_seh.jsV]F}BiSc7y\-Vf``M0x7}hls=s?eA9ۋGx$, 5 f{Pcc:Y˸`8JΝ>,qwp ǿ,יt6WQO!>}HޞovhU+5"qQ{0cFBP1'4@yr*dD5\M;aĄHp`2z|L> 9.P:JUbkT,Sbq`k(%X.G)f! u7L?dOd<@M!LPRZr %BC77*I"q_%͖1molai%2zVg com өKF/bv X%t ELȣ dkS˦-.b|9KZM(y1ݜHB{TQOٱ7YyF: {kֹ `ykDFԋIA9ZV)_]bbk&5zP@Z%k T[u(dIŇBƫ3H25ܟR0x-iNFz>y,ʼ RY.|o_MɕG|x:!0'ժŝZ*7{c,ōgmgؤ:w5v uԗy]/Ē|YdA䌎p%D9y%չ4U'CՇt&_ AZMm--cm켢iaaq8$2'*[ #Rj8jTs Kc)jtVz_Cp`^vTzg+0p~>1;N8{ϖآ(=iKqvTr8P1{?ֹcFB1w鏥DT$7v7 }=pܺj I<"L#yb*T5ոz=Ʃn ]>t8z7]>v70?g}8b ե*]]A~ɄJt)<COpj/V6:0[ږᬵQF2j keIɥ}O95H\VqL|BD-(v5HU9f;uX˅3VW2~v ?G<g DqBKLT>|ڕFⱚj#J~E֐EFSJ/m%epyh]AUxH˔?%tDK-\5VKSEg4,Hc) [ߟAh&.px!ej~ʠ ˒@f.<|> Q+ܤZYo| #Eo/B+LVkZHU-6_>ضl[K& njNn-Jj b/7+ @Vzm[&_a͞dYĺEd0@rհrzXE4Y:d3UƅqUE2kCβZvSmPeJbN~B$jB6++SYNq.r|m٨۷z}7r]$0o{U]?u)zǯPKL PKy.F(angular-1.3.9/i18n/angular-locale_ses.jsV[8~WE R%hPF ێF8`qPntqO.3gvQE>$pkbZG{u Y tuJI۵mޏ 7p L{1푆z.& Q/R$>5GOl >Ù4.J{OG(OhcC"&.vݑI(@G5\ :a}|+ui} 1?:B2UjQ S1{LP]C`}`t}V(ܬATt]v#*!{CG jϘV6:7y?]᬴ؖaF2j kiI+ɥ}yIĻp ?U\b&DM&ۚ| >cQ zLmuX3V->DK” kE¨Zêx1QxZǥ~EDl ! 85&F9T#}5[sԳѠ~UxH?%tDK-T%VKSEg4,Hc) ['$xJ4`V52h|ė 0 }E=7@a~0΢g{ +5M-"ko~/mۜ7% 717+s)5=BqoTKqL{^6-/mb,b]%'?!5L-~%7Br5aUQ,ACxx*z ¸*ۢHZzWlhᗍ\ITDy>&j5_,G(S9p4\DlNkHk9Βb7^\wÞA&1Z-r/Nd/_s_Z+"B™6ɞD;j28n6vADT<):3 86zLf,#{ n~Q1t=C ZԎJ6!eC؃"0c 5aax/]C^`~h`TVӄ+(/x"8.~ѻ&:UzH:_5O4ryr^<#k$d8WjcskmMFfh.L.~E5hXkٝ&^ ݬT՛`Hx-^p~O)~$]&_$YZx?\T\pxOxOT+33UkPi=a!^h> G}S༏5$,^m&@7J7g-#eĻT{rVѶ'7"2eQNXIޑ-/s9[ZlnT OBK) q6 R"8R(lw`KDJ<ci>Q[ cKs.r7`E4JUY'Ds9N2ZZ [WK^񑗣Ya|m۰F'P[Xp)O~!ѶDC1lK=aW< RɃ9|$d} (O]0LuJ!dUt'3T*M~_I<˒*/ +L\wÞA&1Z-r/Nd/_s_Z+"B™6ɞD;j28n6vADT<):3 86zLf,#{ n~Q1t=C ZԎJ6!eC؃"0c 5aax/]C^`~h`TVӄ+(/x"8.~ѻ&:UzH:_5O4ryr^<#k$d8WjcskmMFfh.L.~E5hXkٝ&^ ݬT՛`Hx-^p~O)~$]&_$YZx?\T\pxOxOT+33UkPi=a!^h> G}S༏5$,^m&@7J7g-#eĻT{rVѶ'7"2eQNXIޑ-/s9[ZlnT OBK) q6 R"8R(lw`KDJ<ci>Q[ cKs.r7`E4JUY'Ds9N2ZZ [WK^񑗣Ya|m۰F'P[Xp)O~!ѶDC1lK=aW< RɃ9|$d} (O]0LuJ!dUt'3T*M~_I<˒*/ +L8R4YYPho0Joeh~Rt|Uw?3M}1<7Fp/]k}%}2w+84IjjYLĻ8oMDfò|ȮejaQ drbei5wE3uƥq e9"k]ΪZ'[m{<7 Q|A@gp/ghma6)T6\ϭ^45#x RwKRlϒ!~crq7PK+ PKy.F-angular-1.3.9/i18n/angular-locale_shi-latn.jsVmV8![uqM4::ɠ؝*\\\w-ysC'$iL7i{"l偧kl{mHi]?>2 l҈wi2v̏s{WpӴC^8BD!b"Y(҃oV(ÙIw^F-^zmhHDgml@TDҧ}ow&R3Q{A~hxl~=ZV#ߧu!ڧOS'AX0UC5ja*1Ob+J,!ez.\b5aU.]u?70:S!=fCpzCG -Hqo9#ծqέe>mk,aA2j4RR]&vjX*1IDy5Ą6>~6k.χNYk>sj(c$Uu-/J C\isΚb|NÙ*Fv~^%GkBBkByUΚ IpbMѭ<% $+U.J*IUdS Hd 5I=c4pdZ48ׅKy(\ MrNa8L䭬&hVTi}]Ewֻ*,t }C):>j{۶9+K$|Ȉ4BٕG{~( T-Ǝcڳ EC.RpXZ714wk2Aנ2o r{Ui %E3ut%*m .EENZ*&Y X!+x.o $-Hm\y+{r&nv/Z} ǭz%Q^->~ctjpÞ7PKmb, PKy.F0angular-1.3.9/i18n/angular-locale_shi-tfng-ma.jsVmoHίYbB NqJq(r 526iK7x]Tw0X.yԻ&:,t@z _Jt!p`ѵ\r\W\#ծp|YjC^dD¢F15oϽ=՚k ܦtk {LkU -"47%oEZ/:' Z/k2-JF*T<&S4 L8\(PME0mfMZZr_+64?;6greQ@̎+(ڕ9pZ 2;{~ҏyv$;igK,ïĸ'QUqN)0*W$dfⶊ( < 2e.-ZG颔?P;F/+,$=w4GoV /ԍ&.[NfKH<hPI*4 _!hzI䑊^ ͕#=ij'VOxPKf7x PKy.F(angular-1.3.9/i18n/angular-locale_shi.jsVmoHίYbZB!`G)d6\l%{MR{gvKf=ϼ=, WY}Xs:ܴ'^7ʍ| ئ>Hl ӥMa~skn#|?pL{6훟&h90| { ׁkk4]C첯dLLljaM]0v(:BB_f^o~ tD/Ӏ? T|6pvg֎5%W:kB)a D` P 4a0=A|]^`~h`٦LW4g7P&zDGe3x׀nDwo]k(=-?`Xѹm6EFdd-zjtisXѽ]iTk-4oM+ {LkY -"47%EZ+:' Zkw=jEz42{5K%.g+msu>g)QlL,-dWmngzvpmíh#jIJ'UI)7YJ~7Oej|ꯐ )(jWmD OB3as){'-3lكVB00ySIz)s1XqH#yƹUNը 矶럫XCU0OSn.VT1ULe(t3?x`[E [K*^dʑ&|dǃN <~vIҌ{c)\KKpQ\#Ѧ_t|kt_,-p#]k g9')\J?ۖ|8=-;..mۮ<VtJ_RwUQKPzͨTy {VF)h(^)KɮPHnב?J<)U߉5}Xa!; =*nh(OhR|j- 4C0OB#*;%4AŬ\[8ɣiv!xPK60.o PKy.F*angular-1.3.9/i18n/angular-locale_si-lk.jsWmoH_1BmCE^mE'_BHsU5 : mޙȱw}8`]2}Xgie;y$2yFL<F>j&P c/ ,eڈ&Wd8ߏk8mw㫟&9e= G.dw~jl29,¥fLĘ1$0q`twvIY`:{ XGȏtЯ{ֶ̌ېU'TL-L`>c_bcذ և06u4m8Pb~1ج|ܛ{V(Tf ?#XZT>l!@1tپFD9UTمcߞ]g8}E2jġ׏hF)ץm]$Wbz 7W.3CzNݥJlw38slYwU]Y<)߷,Iv |Aޡ[+y#$h9Wyg00b+KEs,R:*ˢSxR3Ko eO)שKyJU9o& E8=cQ_豛wE켸OXZ}tܑӑjY_t]ӎ-ּ޷ Su56x(uRe/|A&Z7ԕp?]%iw#襷R?EfM&[o_mTqrvzPZ ũ}r`9'(G ;v|2lwTPhXLïOIRLqV+V%J/bj"$UvҨ< U*Y5ii[ PRiR矐jҗ  yw^+$a'C9(OEt"(4WIGAMhX1t 8q x:GuR] ԇ,Q;tӹfmmqPK,mB PKy.F'angular-1.3.9/i18n/angular-locale_si.jsWmoF_1B im ')UnB.ma'.,8H, %ف%\U~(R0.7>l4AK<iwٽALK?;p%S1f'C@TQHnK80{I,Oc0Q{ >a:ׁޠki~06$nb r)SiA S9ؗ#*MMUq,60_'fjce*ӌG }xk~P/bN @1tپVD9MTٕc]]g8'd Cь.SneK?5ںYķ$z P.3CzNݥJlw39[plYwU]Y<)?,IvFj:rHuX,B/iGMk^[Gѹ|_ dlHF˺E[2WϾ ANfh@YR_n4S;ӑe[#7F7ίr8q]{t6J>8Ϯ,haw7R.O펪 3|i V5 WE*)jԪ@UL\*_NREm(J0P<QMa\E!g*u &} ~9,qw)xJ"j*/c婈1]&O߷4&4ţ M8Cn%N } ۠AP$j.s0z: vN[PKcj? PKy.F*angular-1.3.9/i18n/angular-locale_sk-sk.jsVmOF_1&V~HV) 'czJZu0ػ8],OuwKXEMCl.E+3$,C@Y`}֊CaQU(aX;D>A.T+ J}*GP @1Z>dQk&RKi\FܱO3ƨ"5Sg1|ȨEȌ¤UU+i៊kD"yD+r2n\ka^n%gFhgޙ^a%M tY$\H:ڝ0Y)2ӌ'9o}^:jB{v>_H^H0_Z"o32 LٮFyL7n#(VD)mF@k7QtrưoUeDRl eɛT<(GYkJ/{٭L*o9XV9΢R[ǘ]:˃uzr(p*}|tpXhE0t,W}<0\y,~T>LS@v|_ Zb|C oBLk\2.r:$f?='cU^4v"-Sq7HY(?L&{I[kȩ|38J艉x?!9G,YiV,NJW/AOLB#yr8у^ŞWh~~5u+R'ש4TD};M˄(]Z@~k٭j(RFZ@:kf~,k .x8Y%]F(Z(#yDޤQ4HS]hT.̿>$+#{X/UhZj_,J=,5~ɭ緮kOΗCI?=R/kܞvPڼTbapzrm?lUaC] S fd(#`9H " tԎ'0a!eq=Aڷj5ADpz <ˆl`C|hD'" X7L<.%5ӹ>*LAȮ\U*"$VAkc/Qx! BV*ɩfQ! B*<*9l4gaxF/C`x Tka6smD 0Qdi4y Q?/nE4}ӻ<W }-ikƴٕrɕXfeىIY n3ZTҊrm1v]˙Eo5LOMp_oPKMYC PKy.F'angular-1.3.9/i18n/angular-locale_sl.jsVmoFίZwie%)d]m𚘳wڹwaMTj-yֻtpnpV>.<fbUgPvxK-P!D1t|VA]\/縌^] \|j#l]ۼ&4DW$V*eCJGIYıovυ|n>|7B+Z튝j̘^8]>َ%aܩa˲KC:pdt /]aa'5 DAG 0`|`~0ǝCϕ} u=(%UT-ոT@zE Kvz>"Y;Uѣn} TWJ9 Үу_ A)w } s<'A}{.kb_-l2qVڨh2j&dIB@%ъ]`jc1c~7.ҔdV;k!}ޝR+w:OEw,;+|"XTHRawjT6SȽ! 9>WCpPK7ѡsPKy.F(angular-1.3.9/i18n/angular-locale_smn.jsVmFίYi0- .I[Щ/t t58g-KBK&$UOY k癗gf+Ri;PMa䊀D0o=(] xo2?z`i˛[{rs?8˅ ؿO,s1P⼒QW+{d2_RQz83˖>َ%aܩa˲KC:pdt /]aa'5 DAG 0`|`~0ǝCϕ} u=(%UT-ոT@zE Kvz>"Y;Uѣn} TWJ9 Үу_ A)w } s<'A}{.kb_-l2qVڨh2j&dIB@%ъ]`jc1c~7.ҔdV;k!}ޝR+w:OEw,;+p@$4Rzh\ʹT8NQ4&<} 7 y!G^GC@b|pZPK=pPKy.F*angular-1.3.9/i18n/angular-locale_sn-zw.jsVmoFίYaZOyQwx{^͞$mU3q[fd`=nQ1$eޥV>:ۉ`B79K[w'wӉ\G`"EA!ʋY)g_:9 Lf+_w&a-A~lXB*9m,@egCowFlԞCo؁_a#$Юqj]HwN` {PV P[`K 2CB0n7§2Q_ձXG.}.:Um?uOtR0#(pFbѵ^~Ack~%cXѻ!%oi&fBD_.~^||t2">YDRm L#c5pr@6-A̻6S 9'o nU٭\2Y ̵DdҤ|"|G% 8W^-ƫk:M8l&iOY`yyu;n,,lG-72tM—{['[W@(:g)5ց]wa2˙3}v@h9:(\y>)E >>tBBWQ &σ5Kh\e1"_BzYh{҈ 38tq7yhw Qkj]HV` {PV PZ`K 2 CB0n72Q_ձX6}.:Umuw])!zCZ/_5?0u]b撱eQ3&s/HSVW?ωU>WYEr\Ӊ,"6&2@Ns8mYDA rDl]L}oo#_7RF ZPk"2iR%\ MiBlՖ?SKӴ#+Hs"W3{: TRސxCj m6^SIϰD-l)$@ حfҡs',.@-5 0IY:34Ծ+pWY Cv]y(:Rg:F3gwO}NO\יN%QaOsgrMT_8s4~jt><ǝ:L,؋*~0-0_/]Q<}\j`W}krPK:PKy.F*angular-1.3.9/i18n/angular-locale_so-dj.jsVmFίYi0-h t(kDi/le"](6.Ӫ%ggԇ4K.k[yD~̽NWe6*Z[B0qi)kZQ(*mTLk jgLk(sj" N:T큧gƞ+({(x_I?+yʒT`@>*),_6lT{A;DyB ͮ|ӪUXrJ.ڴ"Vp-AؐGէKT}.Z'\§PKKO PKy.F*angular-1.3.9/i18n/angular-locale_so-et.jsV[F~W` 7Klo"V0=|P{ظX'QUK =, IcMAҸ 7 =`.4H>"gߦLpui 'c|\Zkß= "铔_k/ù3,ǭ*8^zmYDD296 3bRg;R{isP{a0x~=[YϷاC'؃2 c3ոZ}=]A^`~`t׏Ϋ‡"Q_ֱ8^t{aGI:PP:_CEȽ`R)ۙ/P{/g]҅G% TX2|ZmF%祅#هYL ͮ6|ӮUrrmh"wp-~7\ŷK?U}0[GPKP PKy.F*angular-1.3.9/i18n/angular-locale_so-ke.jsVkVίYi0 h R0 ۈ?}`wC9ƱaTU-<3gμ;nCqM6RE SQ MS^pmpSIx(BעCc"Za< cEWtK3R8Q\ b}QoOwG Bijn5C$['RF<'v6<`~ @DAodF\j\UfKZ"'I#A*Ww@^:6xިM.yEy`jPgaKj.pW]tly5mz%ykaQ *taRUAĵ+ZK&T=䢏.3?_\cDn>Le5ԥ0y)*B d D*x=碔-3f(Fњm*tv~[>xhk*riMf!ܨFknQxڵxdtNG!,+>ϼ]֋Vچy`~ٕW Z)`dB4!*A% bEK ^ tE`^)e0X0p(7k8x 2\dmQA?^86Onvi;AS:%ǔ9ϭ$^80Jr9/3{ɝc X:ʔA3^;Ճei-DǺ0'X- m@/G#OR<%+ )t'I۫@;]R82ʺ9&SP6SWQSY%+JeIڟw_ʼeC>Uv~1d_j+K].a.[πm>~M{{%7Av-pŗ \?q>PK8$O PKy.F*angular-1.3.9/i18n/angular-locale_so-so.jsVmoHίYm1w@O`@ӊEт_XE~KRY.:K 3ϼ;nim ${y |K"_{i /'AζLu8 j~gi/G}˅g" ٣ߘ_>2kbž{k'vٵ1R Fd; >e v򄁎+ ;' `ga`8n[g> |= b"TL9(= wEE]?L? D1~UdžN=ԇ.Uhuutu)(8G/H_EV1S|Yږ:ڨl2Z ke +ĥuk!DTHV$z2J]CQɆly#1|jw& X˅{;37K2U9i:ÇnI֠& {8^CBR2wo#g?0gsnbJp2pvRI&ʐ/6 (@/-t)`RIa6u0GQAE$IL, < xP-,1W5ƾGX{^]{ϰ(MnVa$E+K2'Yֲ>WK SsFL[YLQ1ms1Y?8kKvNwmN \ K}hݪvkp]^ǎ8K M>60Il/xS&5TWI)5j'DvB[cO=TXeˆJy/um &D4^MVYbɍ+hzFX›7P}\WbCDO.}RAd|lq ;PKTO PKy.F'angular-1.3.9/i18n/angular-locale_so.jsVmoHίYm1w@O`@ӊEт_X^#%).:K 3ϼ;nYm 85Γ-| _ڧII= itUV;ۘ?L pL{9훟&\($_! #[bBL3poM;?Վ_[(aDC QSO@onIHhްF|;_ֱuκ}3A*1ԙiP4eᮠ]0?tHǔt](Ư O᠋DM7C97b|DU$F~5ѝZҶ FUbX+_/-c}+V!ZOēi(eRvID3 *lGbJ3 DcMN VMvfIXVI!>D p#HΎ6Qט58$$U.swMSY9yg9K}1Cm8BO 8;)ऀC|`US% (@/-t)`RIa6u0GQAE$IL, < xUP-JX(0W5ƾG{^]{ϰ(@N1 ҸJsKҼkYok~I^%wܕQF?,+w~yTLl\L⁝#u+n'^ޭ++uM{;/-t7^;ql`JQ2&O7)^@>i jk(ҪSj< N:T>N *zy_I(yʒ.?+b0 ?ʫʼa ՇD;-{ӞU6:pZ.ٴo A_ӇwK?Sc;([G{PKcL PKy.F*angular-1.3.9/i18n/angular-locale_sq-al.jsU[o0~ϯPR۞!Kh-\DUE 5Юwl aCrs>SҌuv:`C{Q!9vqH._­$<~69[g4fgv:O#{6wFx7@WXe LD"{~ \a"<, \;Us zV<:irjFm^$cfFR HyYqzS>?~dKDgr~$l2"($j"iUS2u54Y-NCj#i+bCḿU-3># U&wj9^k &TYiCV'7ԚٵZgJa6WBPq~J27PlsZ'5n~I>WM7iPkGHs H*)/ "U/|JڇGcΏmUF%DM$ J`jX7Un1ü&2eRim{"< b%c9} 69Epg!Y􃭴jN-k-*k6-zZQ6VL)J(J8N~/XIJmN뤆o0ɇ& js0"G5Om: E>2AdZMeEħy$|tEhס G#*&){F ]CXiP5͜uxӏgҝ2%N[N+W[q]Ѹ_鎩""K_EE^{`]sjFh_ -ݺT@F6bpEIMV$NKZq()_IuI-J*VB? ky T]ꋦOQ$9X4p۱.lp)\p!D茡+t)E8rWan!^s}g> PKe-PKy.F*angular-1.3.9/i18n/angular-locale_sq-xk.jsU[o0~WXQvE ҭ , XG 1Mԉ{}NBaD;H J3NWqFw!91&^mtqX hNJzo=a73gp@s?~$l3"($#i2Y5u4Y%NCo+#ikbCeAnXg5ʪV;8^c FT[qCV%ٕdZaSr]dnuyiһ&y?s6]AtfQS_0a;&0tqΔ'yvC?Uߵv^PK"bPKy.F'angular-1.3.9/i18n/angular-locale_sq.jsU[o0~ϯPR۞!Kh-\DUE 5Ыwl aC |})Ai:;v0!(il;8$Z-᧝$<~69[g4fgv:#{6wFxז@XCe`LTn#{~ 7 #sFً#rpm?T={8́IX| Mwc+1F K!;i`}I% eCŅEOIX}aʈAWL *fׄZf J8 ]վ VJǜ:`gj|FfI5@?ɨ&wj9^k &TYi1CV77TF9ڭ3E͕R.H8n~4կXimN릆:ﰓ{:4=!#ai&M .Jj˜m/">#+=M(~ъF~]pz4۩b'ev轔+Vy(+FQ!y/h;/x89^܅!ZH\Dru[xUkǚ*yW֥BjрW+׭Ј+abZ Vl\`& hep bv() ZR IJ疐kURs bP_ -}u$9XLpԱ.lp)}p!D7茡Kt!M8r`!_r}g>p PKXPKy.F/angular-1.3.9/i18n/angular-locale_sr-cyrl-ba.jsWoFjuvMH-vVe] 4w8n!r~ޗ3r²imL=ς2 u-gS? &|?"VqQN8K_'Χw =xоyÁ,eV&c3np3ɩ16̵uQ9YXx'K=eR/0D14#}8yXy :r{2w0IΊ[h^ ncݐyM"GK9fVJbu*@/}az"ć _ܶq4@?qc"M(#dz ?ۇG05?}Xu`@yDU+?)毒V;2N\dX$#\vb. ۊj|׀Z~O\*»|AX;d8e|Y߶><RJ\xGhQv6~7#([Q1.9PH,jU:rw8Ia FJ)JARKǚ4{<r)ȗԁEf̣8j]7"!pPKP{J*)&eRQR\,2UۥCܿV{{6ӡ7u!p2Ox SR:zy%bK˔yr+OwX㬿PK PKy.F/angular-1.3.9/i18n/angular-locale_sr-cyrl-me.jsWmoH_1ښlzqݓ&R-\k bap&7,qޝ)gمqXγp7{ /Yiq("_UY:"_iKS^t. (yZற2`fЇlw|w?Ksf Uzz ,Tj=/*ma;eQ; ag}uNϯ^ -R_pm=q tv],1F\aʬx`Cy*"4C68o/7PKp|؃ PKy.F/angular-1.3.9/i18n/angular-locale_sr-cyrl-rs.jsWmoH_1'CHsUE 4ٝf܋)gمqXγp7{ /Yiq("_UE:"_ikS^t. (yZZxL..p0?+;>囟9ٸH2ڟ9p{=.oLepX?c/Z c`~&&L:Ԧl1ME>t :a':6xIU~0k@Y T P p}ؐ Co8LT96(Ƨtk:::`ǀ7B RKӐu(/F,Ǔwv3k:itXoJExƫ ^p %Jeit@*GLcm.Ȥd,96r!v ^r,$˒߲O2t~ݧ_ڣAä;N\S{4R_NJhlfꗛ}R,?H):$7#z +Q&rvaFAAXU*] 㚴2Q>_QcZZ"Ϧ'x.XYg~E̋~94_+2{ްC#/vh8qt~`li:kd'V8ټSB_vp `%8bD0,J=N8^~wNoP_PK02"~ PKy.F/angular-1.3.9/i18n/angular-locale_sr-cyrl-xk.jsWmoH_1ښ 'CHsU"j 4ٝ%f܋)gمqXγp7{ /Yiq("_UY:"_iKS^t. (yZྱ2`fЇ?lw|7?Ksiv~mkW Rtto^"S=aV)'nlfǛ}RK,*' 9Ȧ8^@iªeTdmAQPP<-GUJ¸&-mE 翥ԩܥTU{`UK$2Uw+:kﲨ}'WVQyc/}leVfc6V\oE6n >No -Rpmq tv},1=F\aʬxdCy*"<C68o/PKx PKy.F,angular-1.3.9/i18n/angular-locale_sr-cyrl.jsWmoH_1ښzqݓ:R-\k bap&7,qޝ)gمqXγp7 /Yiq("_UY:"_iKS^t. (yZற2AfЃlw|w?Ks] QK'AYXʱT4la)=ϨF!$}>ӛt](/X\=ubzJM-сP} C1u|^g,]2.mjB"elm4z)ǜ+55QUrYq;*Adi4yŴlDkcϦˉЎpYۣk BSi&1 C`1_EH%OB㔆kr5#nJ1b2s?,[#&+*+AdPP PΦESTSTRRce)j҂ JII5 $)Ň@ UDl[;0Pdxvua2 IGj~X4q$>\{.j[Oݾukz_lQ/.ui]\y_XsaGgv;كfri9S3!*mw1{Ȑ|ds_̊5^3nPW5,ZА^dCe(ڷP#)}ʑ01 WZ{-ὀ.?ZdD_ЧJeW԰ĹpQ N*1OU`jTj=QӍ\>tHv>SMY(%Xy=@MTkv=x/KAjB7yi r\AOV9et.,|a[g KQ3?뺇) ǘk9=j,J$ u%/n.͊$b6ʈ*Z̝\=a9IDf&- $I&$N@!}dA2#6O()3yYXTtS!V̱$XAVp*SHf21:r)QHD &](nħpeҵw;TWֿw=ms>]߬O%?ɦxfN/,6+̧Ԩ >phghi8/8_ u ep/ )vp"21r/0ނq iw`X+kB+Q$Ae׏ש_/U]g75~PK$@& PKy.F/angular-1.3.9/i18n/angular-locale_sr-latn-rs.jsVmoH_1li>uOԑmarE8%M]\B<ϼ?l(d9yw!lSDq5J$Z>*I Ä փNI8,ij?o۝AFyBDP?>og2[$< rm;4aCsce:0wbCP F|u]N3Q;Ճ?!Fm{QgiBg}H6:C"UZQSBF}L7v!LowӇwUbQ>j P ނ =x] JJ\!#n(IT%ƴ9.wطsיxKmXpģ!&X= qR=k}X'(rƩSӼjҖwINV1|Mr+z[@Lx.$a$ŘpmҵŠ;fΟw}vlu\9UҰ-ڹ}vپBo|t׋ݓx3B)m7c`L^p>0rJD/R@F7 X`W(ACxYV4vhcP-(uʖ~&1A#?m״ZwqB_ADr6Ҩ$:#f<H#jT˥^8 W4 coh~ )DK&//Adp.-Q0Ǚ?Dfc8"&Da&D:řVքW&!HX?Ru?OܨF| PKl/X PKy.F/angular-1.3.9/i18n/angular-locale_sr-latn-xk.jsV[oH~8G4q]㚄fy@EFhP`~0F]s!8)rP% LR:@13b1 ևgj>- U6C2]^@R}.P C1t|ZAU,3Up ˼9_Y)ÒdLh/8rFJ1ZCNhpOd*<"iB]KK"d42sg&sOXN٣I I 5?bHp3YHS)JJ㌆rk&.THla;?r,*#,$VhU!4 f{N\ y('Q B@ )kWApF2b O "mCy#Ҳ' f3- 4m"T&RҬu,75o|K>peҵw;TW?w=ms>]߬O%?ɦxfN/,W+ ^\-tr8= T]xo !y PKy.F,angular-1.3.9/i18n/angular-locale_sr-latn.jsV[oH~WZm1-Xv'((qJqbQ4c[i30cJjRwߌL7O)YoC6HTU2ڐ*}z8 倗MGLmtHv>S]Y(%Xy=@MTv=xJAjB7yi r\AOV9et.,|a[g KQ3뺇) ǘk9=j,J$ u%r]I&[Ŵ%mU;3{rMZ@HLICr/ɂdFmJQRg4F߲80qBZf cQIIe!B T H6ect RȣF!9r'MHYj/3QO\W xj?%ض1:!J5ʹ0ҴPH1JòC.ǣk }ʢkw̯Ow=ms>]߬VovrfN/,@ۺCt")Z:@CKD/ߧ_j]NZ U[Cl4gn͋y*Y䑯*"{45)i L< X-d xm&nfПw@ zG6.>1Evg'|;|v+\y̆|[?UvZ~vÕmԘ11b ?A`B&xj]7&cz%j0Vl`ra:S @ET55Rl{]OzQ=-)qv7gcϦJ5}gg4cg[fΟp>}Aj_r>PxmKQOnɤVx"y*A֢<܇*Raeu[HFeϣv1ML*x4V ~INY<ϼ?xNc$ۤ=nKpSŖ0OGjȨ+?ۄ XDۓt_Ͱ#^H2P\FqJEr}Z"=aK$"4na%7ޖ:p#!YHrvݑK҈+ ;0BC]@z0NZ[wA쓧}cH,Se0AO1Ob+ LrM>b a] TvJ9Ү sAi G1t9~FX3ʑ1vctLvagrQ31к0ktNc^:f,Mg{1PF+3$1IT6#\1Iݖn<&U ˙u]4P7;5 \&2I4&AkDZXF1=kREpU6aJy3Npz˫vX ^9T5emY 3 dBKLWRPr"(B!{+x; Z% e|Uk ?e$L킁IcHoӢԅK\Fa8Eܺҡa"J=إo}[XtrT'Ifݛ׆޶ k~ZMtm^1w&>WRj%^/Kt0 R8a[sC>fKۭlS9>]C6"ۆ)>B@ | {e;&K^lFE">7ANZUj[K9Tcʼn$*{kY6%rC_ڕV[j\ș\`/W4;4_C2Jd}|@?:==_PKÜU% PKy.F*angular-1.3.9/i18n/angular-locale_ss-za.jsVmoHίYm1W@pODSbEтmz&fm}Y<ϼ?xNc$ۤ=nKpSŖ0O·GjȨ+?ۄ XDۓta/Fz@υe | [+͉F!$Ez83Ö>IEi*Kn- u.+GhcC"*>}~#5Wvw wI=p:jnuO"LajT=>型 +\>t0ICz7]>6u6ߋ>t1P٥*] Hc6 7ya)+G~Ĵ ѹ3ۅmN6IF\RfB@KSo ìU9O|z鐚7)KptC$$:&SJp$5w[We.,gupC@Ԁr'UJ{xVҘY>O~jaK X3+\ť֋l”fW4ʃsk*Q۲gj􅌗"?D6+39P@1C VvJ@*k8~ I<< xƐަE =/0pu?uC<}5D{sϱK\jaN,ͺ7 mtZ2]1w&>WRl/%g:AZNǰ-!2ťVU6V.!~mgt@K Ƚ2ʹK%hR_6{hi{ Q-Y@RNo_|PWǽY6%r?_ڔN;j\ș\_.mW44_C2{J.do}|@ӏb|jpoPK< PKy.F'angular-1.3.9/i18n/angular-locale_ss.jsVmoHίYb@щD'Fтmz6>ө 3,؃86i[RF~(ܔyws%Ӻڛ}$2JO6%ցc+#,d48Ƈ+8m؋h߼H2P\Fq>IEr }Z"=aK$"4na%7ޖ:phcC"*>u~#5Wv/ wI=p:jnuO"LajT=>型 +\>t0ICz7]x>6u6ߋ>t1P٥*];H JlNo>3RVisgO ۜ8+m4䅀->Ys 8!5cnR>+܋2ZI$IuL2 Ijt1Q\XL:ᆺف2N<Xu1 _|&J 7@fVKU) ;C-f iLc%xP הUe)2 /1]E~ JBɉlVfsb)0 kUU ֮q4xx:0 ^g'!MRz.MW_pa6(5pJyk(cLc5naQQ$Yuo^{6i6eR vcLL|ЯĻ%^/KK:AZNǰ-!2ťVl]9<]C6"ۆ)>@@ l {es;&K^lFE">7ANk-Y@RNXm>oq^+:hm҈)LҚT\PBwi\۷}\Wr%=x[~S ?PK5~ PKy.F+angular-1.3.9/i18n/angular-locale_ssy-er.jsV[F~WYi0-hZUkt: cַ{83VUG;xYBl5~`#' \]8ZajM@?&rU"Wk90Yp`WSkӰ=оqDӉA "}/鳐_l& ! Kk7Z|7+b\T)#N wzChb7b:i/mЁ.5ȯ~P;ΛmMLL,RDկQ*恞Qzqסt.T9!i7Mx_J>Hu4DzӤ@UtÏ : J9^V EJ3?W/_+|0G$MfQ !4cW&2Ŭ8ckSL$-v޾kn/(?/6}phPK7: 4 PKy.F(angular-1.3.9/i18n/angular-locale_ssy.jsV[oF~WYۍin@Qłsb iJQtF;_Ygl3UՑ@|3̧#bXF׀*cV6W|WFLjr&6aՍnBu"F(U."^88ls_/*viS.zh򣃲', ?ukWڦKfMU/6*ﺖ3/yהgl}QI5aۋ'tm-I N4YAY>t:N'AZYSt"m?5VK{E_IҴ<ƚ ]4`/Wƥ6x#g F,1ZL} E\N0O>?ZAo޾AoPK-{ PKy.F*angular-1.3.9/i18n/angular-locale_st-ls.jsV[F~WYi0- hZUmiDjK3{VU-|xy ͒u*dFNΙ o(gZ?O{'Q8psqȂH5փS ˭5[>gvmNzgD^(DBFIEv.;V;B*>I{aX'Y:9x,g <Յ@`F?@a׮v{R,O訽?&hș27s>Dq':E2UZiS.9wLwE? ëP_Y8:Q]u߃RP=(p&"޾aAy{[~´=nH燵EfF$fFL"h&~6V.*TM$2ƞN%G{DmD:9U!Grze/ԂL Cĕ"%c0%# ѯq!QV?ZEIDiiY25i+OS.c+AvdN7e˾>\4zmQB X̤vp)M!]ٌQz1BkK%2kGΦ+Z*)\'KHl3!}_:v2 nkB>\Ķ k~%R^~o n!U(~0/@!@QZCbo&KkԂ*wi|V g=O#+Seb'_>/CBY|8L9][Qƥ}u6ژbpp'hHz{?[gܙ'PK5YPKy.F'angular-1.3.9/i18n/angular-locale_st.jsVmFίYi0- h t ײ`ӈӂ؍vI36ׄjNgfySi=nqkr?v<Z?"Nr+ց'`d<ۥ;8fXhEaraIbߑ#;`{WM4B.?Q=3,!}_:v Q= NQ0:`kR z]_ L0뇾ԛtU(/rlU$3:I79F[u ! O&BQU"[DvraԆLO>mQ4I@dJEb^¢, ?Maz .x]:\p`6(M|tujEIVp9~-#- }E[-XL7ϫ VEvoL~WIxZ˵YT.sbۆPQ)/m? n!U(~0/@!@QZCbo&KkԂ*wi|V g=O#O)2^1/! Ox0toEeBv.[Ch][y/_㒼mv"/{gFU`b|nqa_PKzPKy.F*angular-1.3.9/i18n/angular-locale_sv-ax.jsVmoHίYm1WD*F5Z$)={iZ,a<ϼ?q8dywa",b&$-ч73^dZF>A!y Sa=wJ&auuNngSt7pO= TP#)G/G|v m|{.äCsg fUbEOZi$ )D F= 0FØ0 `4:Z?.Lчt$ΐ:1*1t0UY` tgP.X:8,Hz7}x_>.|>a.Tz {Z1zcG *Y\Ւ1q]:uW$f?]F}z if_0U,l|/:Gf ]SC\j%9˅7oDd;# Yg;ōFx(D+C$VEr<'&>ֈzt݄W\7r#ō6"Wg*%zmI=-7%!- lIȣ7q|rðϢk#NE Nu "!J0d)BoBJ/J짮}*s]߮.%TxL/]]\HOFSC5i|kɆ&4\>ϡ mg4qʟ| c|pnPKv\У) PKy.F*angular-1.3.9/i18n/angular-locale_sv-se.jsVmoHίYbz`A{DE_Ҕwf^V;K3Ϯw-2Y.mޝtI+I"!«tbn ;O@PmTXIX]]ӫԳ- .`|2EF!@ >bByxs%K0oř) ]l*"/Zi$ )D F=0FØ0 `4:ZCowSgARJSM:* ,0} c3(k[I$L> uw hKѰTLS+  R vJ\1#Vg,.p_j8e.b:Som+Q3uVЌ.#HzQ=ٴM0],l|[̣L3J.ԁ@r!SI›z``2j ԑɬѳFLC#<顈[+"[@w9OpoC`9O5@剉Ϸ5/]t7 D7Dq#!ՙJx^Dn[wjOk 9mIHgKB.[h E0l/ڈS*S]Hȵ$gDеҋ*kvʜb? gulUVUqN K=!cqi߿k׵zPjS~mHWY޹BcCZM=v#N2u:~,+~Lؗ ɶ'xza+@azp,J0^mtfGT;x8׭:NRF~ڞZo^o'Ҳr #ՠ~nd3 I-4p>7fфFi5G%&ݞ?O 8c=}_L ޾PK8K PKy.F'angular-1.3.9/i18n/angular-locale_sv.jsVmoHίYbz`A{DE_Ҕwf^V;K3Ϯw-2Y.mޝtI+I"!«tbn ;O@PmTXIX]]ӫԳ- .`|2EF!@ >bByxs%K0oř) ]l*"/Zi$ )D F=0FØ0 `4:ZCowSgARJSM:* ,0} c3(k[I$L> uw hKѰTLS+  R vJ\1#Vg,.p_j8e.b:Som+Q3uVЌ.#HzQ=ٴM0],l|[̣L3J.ԁ@r!SI›z``2j ԑɬѳFLC#<顈[+"[@w9OpoC`9O5@剉Ϸ5/]t7 D7Dq#!ՙJx^Dn[wjOk 9mIHgKB.[h E0l/ڈS*S]Hȵ$gDеҋ*kvʜb? gulUVUqN K=!cqi߿k׵zPjS~mHWY޹BcCZM=v#N2u:~,+~Lؗ ɶ'xza+@azp,J0^mtfGT;x8׭:NRF~ڞZo^o'ҲkBxƈu5LjR% 1X49Z| e`<1' t=XOC瀓poPKtjp PKy.F*angular-1.3.9/i18n/angular-locale_sw-ke.jsVmJί8iT P]lfa ۪-6y39mg $uf d^k&օ7EqLS?:o,յc\N |c;+8ߦc@=B()=3==~k˘PBOvTrt~DK@bF Ϡ PE>!}_ngv41OX3 ; `m`8nZ|fBQLLrLP[@0Ktg.X:X,_n(}1ܬyA.=T麄@v<.Z|9<CLd珄=զel2ܥ6*HFa-,?=h]^XZ) ^f|W,͚Cb&B c@\|8'ѢQeF=Lf,ř񻸉XlQܨ5e&`5؆IZ]؀UT0Pnũ.? ȷ؍`$vX+Mإ"O."e=/W ȥst~~'׎c'ʢo75'KsA8B]. 5yƠ |J T6$y1iyD^H"kX%.ޱ4*ACxyGh|*c翵Vg _5V/!ާz"LLfCS6i>K9хɊ&4=!='O 83h?G~OuyPKܵ PKy.F*angular-1.3.9/i18n/angular-locale_sw-tz.jsVmJ8!mV4TE mlf3r/ ]967%y3Y!qmF,&Wњ\iO$ ^&ҏ[9K`quW5 `th<Ӟ(DI! q{\[|BWpM|'aRa唯.66@}_lOo$\fgv- `[`8nZ|fB8)rP&T9j-L{g`3K,&wz.. ew 7hGp@KU.9]O >A7yj9 2'=զel2ܥ6*HFa-,?=h]^XZ) ^f!LfMD!Q1KGE!Fc!@\qX%OE˞zXR3wIzW30QkL4Dc&/y,yxW+GFuyM)O vEI]m] q% ÕpJôJ@n+J@2˂`$ta>WQDb,Nu!YHn4ZiP.MwQ"蛗^.?"&BWnρ;-\;9n+Һ˝75'KsA;B]. 5yƠ |_wK Ce1iyD^"kX.ޱ4*ACxyGh|*c翵Vg _5V/!|(8LfcS6i>K9хɊ&4=!=g 83h?G~OuyPK%L PKy.F*angular-1.3.9/i18n/angular-locale_sw-ug.jsVmF8![u47 U/Anonꀴ0`k{86MD39 sʌC.N;L2d02&xBWIO]BWX8pk1{gi/MbAQȟ _qg\[rB'poL|OӴ9 3]P3 U2 Ğ=;H\t^`܃`4  oiii>I:CĔT-մt@=rbaBowӇef͓YHuJ| d׃?`ԃoJ@7yj %PmjsF2cZ$ưVЌZ,\>T6MdĒ jBr6"萨#<wFn8'ѢUe/ݛV=LH6,SF,;4 $moNhq75Or=5㦼g%jj}c;粤Ȯ7ZɰZ@bk9$dYh&>}؃UT2ť.@F[j&Q42P;U&uJQ+y}ƲTХȕ5st~g1zkQ*ܜZxӯi vJ} 5eƠ z4|ߪwK _#q1iyFG "kWi\!D8;_A!o-}ߨn~{\K'KG- e#l~iJ61ͧi%4p4Yфg95g #1~_C@_bzp~ PK>V PKy.F'angular-1.3.9/i18n/angular-locale_sw.jsVmFίYI0)G 'Щrttڃ5]-KB&FUhg;C&N:L` JpӐx7Ƌ$pK@&cijNRXyK8b{<](ĒI?>?:Ov/_{IG'g|FLd $ft!($d-fw&J%Q~!Ppp~0tVsS!N$rP%Tj&L`*Lo1% և(f>+ U 7dOh@U)5]a^BC1wo  & inss,eKQc9KOhFF_Q.+ì7*bI(ځ媍H:$:fe"h{o2D1Zq܅ժIF9Lۈ6P(ْk.IΣFyܔq6ZM\\!ѵ2\ ֚%j$Z@Bkl@ 1c9ba >WQɸ!b纈oCo/G8@QԱ+Feo|}eySEC"W&R nϑ2w϶[><{1]?W{ofOW4ܻF]Zo{ALU~m,I<FG`Be[p%48bdLrF6WaNsRI%{d>Uc ԦebITqw\rE'Z T?9@#6R=rBD%թ[5` 塣0>)_)RztWJFCe&^Tx7 TĂ.8ȍh"%N[Uh^ׂ&} [SJ~8\sxAtiKG'|}PKW| PKy.F(angular-1.3.9/i18n/angular-locale_swc.jsVmFίYi0-G 'Щ`Ig@׈6l5(365GZU}홙eg* N"H +!¥ <ӐpϨgQ%,*)`t_z] \zK winfɺ!4SFy6뤾 wfYGGE>LS@z5 5![h6ؽ6XGt]@aEczNvVdtM˯Fgb5W{n5LŚIfds.A34hҳuovLG`B*e[r%4öb%\rE6ad?N R%I%{dѓ=UzOcz̦/ރejMHT/iRt]rFE'Z)T?9@ "R=rBD$թ[Mw'jD@x|CGa|RB SYKO)MJ,74BŻEfflrc(ka'_4)qB:{H{puiMߗ sq\7PKmy PKy.F*angular-1.3.9/i18n/angular-locale_ta-in.jsVko0ίJm%@nCj9hЉگ>_ɻOG7Z)Xw*f%z +R۽hllx8ߤ3:QU"ÛǡHxq0#f)M7( ё=g5DB[Q(U(Cekx&@{`]8n@\z`ɜB=軷[4`6 Kk99{_pxHN#-x Г”qU8%?hea)z< N~KrmdYJ"}| >Љگ^ȻOGWZ)Xw*fG%z +R۽hlgp@GIGFvLG+ύ <EB 0<1K)'nj@Q0M91&/ bzEFE*c^S3*` GqBxjNRA߽ݢէxkXZKa"Er5ʹ9l)@g,ۭ0H|ؽ3-K2Q>]tdvL C)VXd5j[Π!߯1llwr|Sv{oE*S;m3m2ZMU~]MKEk.IBQZAARM yifUAuEEWa&O3 dDi.[q0˘F CO8n9"QRH٬ƀa+8J+f7CT)9-" iWFl7vߛFurJ0tBpl8PX{u]˧4;_78 H%c_g'5L!]BjJ$X3 ơb ڇl]9w֬)y%xӒf' 8WɁZ݄sJZk/4VQᨇ)dRE骘sr$J:I%j'BYPY_5f!>Oue}کdPK=>>!ZEǽΖUfU.qu0'?hUOq@ Qeg'՞pwS]zzi9.2^"'E>fqDLW=ygn3F7Ccǰ06|IE%[ !vomkq5r;1"ѷ6|ObU<oуh~)+Eq(,@0LYJ9q[+i2ptpϘE1kc-Jw7(Pj PXWc8*»X:SHGCfV&ci-;'yo4a䰥o ]#z!bBQst@\.G tґ1Y7 kZM`TyFl8j$L^|ưe9NEH٢6U`Lr,ˬj5*zWM5..;2& Gj2ͥhO̪*Q$ adșr2<[ 4 *0Ec7M5"QRH٬a+x%o؍#5̾gQ$4]érq`lZԱEKkpk+ q팦ca qu-g(|9_ig&]*qƭ-)fdb I>d*_sg*|ABZ:p~YDI nU{rVn‒VFʶJ'LMfuŪxMVP ]\6|"TeUdUIn=6_z͜ PK=…kt PKy.F*angular-1.3.9/i18n/angular-locale_ta-sg.jsVko0ίJ$@nCju9hnmCAӴHX}{|}\!*<^ *y3ɂ*Otu8:zqγ(ee'՞pwS]zzi9.2^<#E>fqDLW=y_g# po,Ɣanlz5Q=ηB%j}wbt 6Domjy8ߦS:QW"[ǡHxq0#f)mW( ё=c59DB[Q(U(Cekx&@{`]8n@Rz`ɜB=7[4` Kk99{_pxHN#-x Г”% cS~ۂloߏ}\hU_+8]1kIqxbqhTeD5/,=SQy9ޏqہ3AW ZxDR}+X}wӟo4½Sᩬ{8ߠs:QU"ÛǡHxq0#f) 7( ёý`5%DB[Q(U(Cekx&@{`]8n@\z`ɜB=w[4`!Kk99{_pxHN&#-x Г”4)n&ׂ5gZÎZN_>bӎYLPx!&>qUQʭu7J{)e!p1́3 >d2[qg*|AFZO6-i}-R՞xUhyNP &oc9NU-2hEZP4G')B D(2Of\-ۄEOە PKi[x PKy.F*angular-1.3.9/i18n/angular-locale_te-in.jsVmo@ؐ&%jxkO/IQkMC, , Xrw$n癝WlUp" nzG]\s'&tL?4Q!BONBFw}КSӰ"zI̘Á61Z~>sq}m"p}iX>z6;ON1Cη!۾2eaH=sd-lgΤf7b;PTMLª] WY}W |U8Yhg9NW"s/o@>{D u- "A<Á}YMnF|1*R1T31uDW8T8BE݊m[? r 5:lBrFWDLMɃ r,M`^2odB(r>6ľY{TZ)rh{66y3guM[A)5lu<>AR?;Bs/rv׹rY9$})C^`OP c@$; /Ed;!(V1- v [cmf+S eՌ^saX_IJAz?L*ό&1B~a 'B,m֠<$brbd`VP+ #yT4el@(RRo1J 40Ǚ(K*WR;G*ҏ\b_K1qܜm%pyRP J0K`oX$2_&9(%$,͆.s>v׍nc=coPK͓lr PKy.F'angular-1.3.9/i18n/angular-locale_te.jsV[oP~W&&ۮALPK 63X]'oU0]9l<9ԬpV";#)\Dsw:O:Xѓgsċ£՞ oFf3S3m&:q(V[.H9Bwyw۟!a^iIXZwj'O?Ƙtw׺6zIm#uΏwx]WJi'ȧP}7ʅQ0l +C2U*jjM*]ba{dleBJi-n\_Y/C`ɛdTAm5#F7-ED7 A)DOIZU(6EO,Vq=*My-x^)4j`{270-!eUC("v[.ˢ+aNhkph:ω\:\ĉ]]aznVd×RgiKzZ&R+;9e.-تc?׬ި@ᄤal|o\!£nϰ,($ KE΍OViWz)(.E֙MFsVEӅr ׵|iwɶЛX[ܚ)K߹bV| J jeFի8\=?_PKջ" PKy.F+angular-1.3.9/i18n/angular-locale_teo-ug.jsVmFίYi0-HSE12)MNal/$8^Z.;nʄBl6 72$q7 iͽXm>+ |2kq 1q<]\g7 d:S +2G_[w@Mޭ*Nq6డ鄮YD*9M,@eeܧ_lv-ei*c&ZoЃ:o-tׁqnTvm6}1t=P U1 `J 0N} w!&1nViÛ,Qױ"Y8^*4&AOl{: 7u$/bO֘6zwxțh3[-?z IL[i Z aF|QT\)YFde Hb<3Ձ'Ea$KkԻճsbLTr"V#.4ԗP#W'<+Bg|{O`"vB}9)iQCz/Du;淎䝌JH_,/'ZdL'vui[oֆԤ GeNΨf m =*957*a8!)aX*;WF"3*r3 | IEmFR(sǢ,nqlU^JgʹKufӅUQtaܧux8_*Boblsk,qŬ@:yND;cl*M-R/x\N=M;@N73]0%5\ ѽH.5TP^ky%*/ee>w~XRё]`CpLT洚[|}P# gs]T͆w^CYzI2ko#]|@Ucxnq/PK4" PKy.F(angular-1.3.9/i18n/angular-locale_teo.jsVmFίYI0 G 闂NKrȘ49 .;kxj >33/) IU4_ːĝH2wbEBj=~gX왯@U7 ƞ0ûгwpr>?h,L,\TOʐ~e}=o{8Y""bx78i(Úcb  8F Xʈ)øO94[TL^EARN7p F%+A҇]AXciP,SbqcK 6I7qZMfb%:u(TT49ׂ?ۂB+wI(qϟŖ11mnmq73Y2Z~F7ّ6h|͌lyY%Hʠ%j%5xf m%9/MU6;I:7!KrwgĘFDri/G$O&y[V0*B=DlsRӢd)Nvn׫{tݟu@򉐏ZҶު cI 띜R2zlYr0џkZoT pLRði6>7Tv{QEgUf~ڌܥ"PjFEYGd#4S_\?s"̦ # 9~gZaU8fTY:~:i t:<˝wXUb[0)0"߮zF\5x`T 3(XGw"9;\ACJzYTC/%rʿyaajTJq#fBpDTԆZ|W S]H&w^}Az&Q}ThaKuTG$ ҭNh# N(^B,Oz'm)*=نYE.֡%B'7[LC00T^a8!Q`]0?tp%Dtbb|.ê7n,cT:ڵ04w :"8.H+ߕa[1[O{@ۿ]:G ՈpS T<`п2h![MʱLJm/HSSe>,+LΪa/ *dr%O#ޝM 'aN91),]R+܏F Y)gt*&+k[ɴ4>JLoo[39ԭ^LfV7TTq~?-.[Υn} 6맜ܱ)ktӟr<euN1E׬K W:<(#nh>x 9Y hY&UFBLY6ne >Csw?X|u{%~|o\ 3gDRJQמLҥay&Ν™Sz.a=M,'w+fNj"X)8oRKBe6$Z VnMAC)tokcE*lkQ7BI>G F@;tUFW8IHV"I"HoMxCc) &~ sQX{8i=ˇg .PK8vN PKy.F,angular-1.3.9/i18n/angular-locale_tg-cyrl.jsVmoH_1B.r/!u`[\kp`08M]e[v뤩Nw^gv`F-dU [YWiPNHb3qܠe e6X jMFUNgvm F~bn;<XGig*Gǰ9:3 m;w=GPE=sP 7K;6d˴ԶB~C>5Uò_LK~Z߬B!Wt>Rԟ bqjVnY0;띜H,bXj$ )|Fb؜-o LMc:ٜ??^T95>CmA A:dOluJKJ:7?⢹\궮?ڷ^ b~)+R*F?)ǓQ]Stͺr*Mσ2ӁGpPpZ0:EaReԙi deV 4wW]yQ27&2SM$LyMݿۋq|yt],]C7@ԑmarEĀi]eNtHxyfv6mY$=ld]AJ#]#|օ7. ȪLr Y]P]ݎG~- 9ls6up/;;.qzǣ>}ThaKuTG$ ҭNh#xm$@3J04vݡ"*381;;0@4"NaВy.vS`-րvJR [*A0|(pg.:Ayl`D1>qaA7. 1t@:mtcZ_oTjx^ `kVr,ӦRb }5T~a4j0cX/+Ck~ Y\HwgSDy4IAXSflNwrJ&KW c%83Ho #nG,csV2m6dsxR-ּ~yu+0"?Mh*U/o(Epܯllŏxsۺhr{A?+),wgJOFY'wzL5ȕ4=OBiiND(ZIQg&A [B/O2_uEɰߺ۰L60}w6vpo/9vtiE sg|ppT#E7 iWXGx%KdhE݊)DŽYV)hb !NxQŔGSɷ"5VC(y~H_F#mk:~*|+o$E+KۤUV]̵&,Kg!؇s㱩M\^]y{ZzV&zxZOup˿PK_F PKy.F*angular-1.3.9/i18n/angular-locale_th-th.jsVmO@ί4&jnD}ఊRJ ҃MBJ~3/G¦yyfk؛%ǭ.S߉kA4O}D ]J'ٛs" g'vJ+NL#}?mowӰMq"=D!GF7^/l&pWaw $OnlZ)#zKBk۾3M2Pi2n90#2ïTuU_霯XT~ZTY[)逨Bd LQQ$H I@C:OAr @Euz0^HUBk|͛B,52(_¢VlW5c31)kR#TbBQ-Oay($c.rJm^ۗSl 8jWy@U[ff6 U>8F>btĈg*JSo=ru!"CS.HUwFe:pl6B"^;[ƀo)Vnh U=h۶aG -3NUWZo]E `Aʯ E*DqEĐ44ܭ$` J(*AXTTX /ʯ<,׼)dR#sr\1!,aU36sJZ6-5K+&D,b Lh;y vE}9<πvg -oa[*q\g`lZӈQh(FgO{@>ؓ!W7BX*"?cfXw2ć;37n߲w\}Zj`AsKMZ/i ɩ)ej<051U % bwG]ZTv;J0)1n4_ gjH}I\Q B|ȜGnBGRww=Jf4k9pܴ8C׏Qy*%.lna!3႔iXogdYF3&Ok/$ѹ5ٹeh bZރmV/{2Cw:vf U0mkePo`a:Uqe8'fx~H*XIb R? Ð@d;/ޜ*y(e姱w^7hLW;κna[jkSٜ* [PKdd PKy.F*angular-1.3.9/i18n/angular-locale_ti-er.jsV[oX~Wn1@}IE+8)d6lU_ޙsl㰷Z`7̜4, YspU:i7Jk*[5Ĭ9Y wFST(-Tbc:^i c8SY6*Kj.Ck" hWLΜNZzKnH}BWE︅C8Y,XQ`&-K;ReqZy/X^DZt⦕59X2eDgh ]6ZX?o⎪BtB Zw qVNj$?"< /wY27낉ȱD5x2)LUAT<7#y -T߉=Ab|ޮ4ߙg9ӿ6o8ociʛ%pPYB6a:ءbWY`)hȟ p:6 hlT[(.Nf4BXm8"tz\=.PKU,p PKy.F*angular-1.3.9/i18n/angular-locale_ti-et.jsV[oX~Wn1@}!Ѐ%EFm 26iJ;3VfZZ`|3̜Գ 4i}PUI;,pe)ZK;p&|ßf;!Eԏ#5`_ Lonh87.'`aM }s-'c∼?"} =x=ʰ&]t rX鹻C;E!cA|qN<ޮ7HiD Zj~ hv-PCDž5!ޤXALT;*5=3u vCNЏr6M9Py|qr&~U,=TrGw}:b;;pŖV:m_2"fhNMz0ϙ+tttVGHcGpMUsO$F # fQ%ޙV2S̑#TbrNc ^ޓE휊=grU;氵V0'rrd<+ L4X,N8MB8\R :D`PRD]KKXhvЙ٦ң{Mj؟f3Lj+Sb׺k^=pK쥮]M59ПdI}XO:;NYWWe]/K^ntup0⏢ʯ(5x˜D hU(6B񳐼;N =av W$<rό8IwQr'Sfkø45?gtkYx-L"'I]8̌)څҚN iNa2:%f7Y/N-)xI_/{Y♞K#(^0rWӄC$28nmH l8RH_Ks(v&yߡB~MPYb#]/ oGc"M񼣉 G>Pdz ok(wF3מ*Oa/~Iwpp;PKD PKy.F'angular-1.3.9/i18n/angular-locale_ti.jsV[oX~Wn1@}!Ѐ%EFm 26iJ;3VfZZ`|3̜Գ 4i}PUI;,pe)ZK;p&|ßf;!Eԏ#5`_ Lonh87.'`aM }s-'c∼?"} =x=ʰ&]t rX鹻C;E!cA|qN<ޮ7HiD Zj~ hv-PCDž5!ޤXALT;*5=3u vCNЏr6M9Py|qr&~U,=TrGw}:b;;pŖV:m_2"fhNMz0ϙ+tttVGHcGpMUsO$F # fQ%ޙV2S̑#TbrNc ^ޓE휊=grU;氵V0'rrd<+ L4X,N8MB8\R :D`PRD]KKXhvЙ٦ң{Mj؟f3Lj+Sb׺k^=pK쥮]M59ПdI}XO:;NYWWe]/K^ntup0⏢ʯ(5x˜D hU(6B񳐼;N =av W$<rό8IwQr'Sfkø45?gtkYx-L"'I]8̌)څҚN iNa2:%f7Y/N-)xI_/{Y♞K#(^0rWӄC$28nmH l8RH_Ks(v&yߡB>[I K`dSyhFi w4N<ҴxpT[ymhSѲ2 qEÏ4t;\PKVd PKy.F+angular-1.3.9/i18n/angular-locale_tig-er.jsVkoVίYۍG (h<!]QtĪfS{g !mVU-w̋xUn'AX$ȴMQD*U@v'_}Z`AuD} jjܝ|nZsմIzБNlӉ}n+wSA1@3AϠF^:uԐlk|4~f!bV$rZ񺇪),U*qGE8-8"](tم,k#3yY1C,/Z,^؆IGj JEb2f܊K(%xXZo]:5ݛU 27LV>EW_fM尕)Su<ϔS'HթSV7,T5tL}pzA 4Wn-~fq"bAB#jBکhqp^ݧY.?G gliSar0  _%aGw\L1iڕ]+iө z6D(eaH.B|=Ĭf @)5PzP-aWUF!h(!-]Ҹ&l R|N&>!+1/qxa|*T[RR2.2v`ZJZ ]! ț :lwLEks7etݼilp PKQt. PKy.F(angular-1.3.9/i18n/angular-locale_tig.jsVkoVίYۍG (h<!]QtĪfS{g !mVU-w̋xUn'AX$ȴMQD*U@v'_}Z`AuD} jjܝ|nZsմIzБNlӉ}n+wSA1@3AϠF^:uԐlk|4~f!bV$rZ񺇪),U*qGE8-8"](tم,k#3yY1C,/Z,^؆IGj JEb2f܊K(%xXZo]:5ݛU 27LV>EW_fM尕)Su<ϔS'HթSV7,T5tL}pzA 4Wn-~fq"bAB#jBکhqp^ݧY.?G gliSar0  _%aGw\L1iڕ]+iө z6D(eaH.B|=Ĭf @)5PzP-aWUF!h(!-]Ҹ&l R|N&>!+1/qxa|*TM[E&A]{FIV_״|k7Dx4{Xmi={zhmon㚌7 n[<PK=_+ PKy.F'angular-1.3.9/i18n/angular-locale_tl.jsVoF I5 4QpJ$ 8XEƪ}F LM,}%4iWsN M0]$Z;Ӛ?.Fnשq]b z흘[k0lZR4Y,9".؟"}k=`mKI,֎LNKGlN\T@đӯTGCD"_ -o[,bN:}4wjS^ ]PW;*y]z:EbjTUTKz/\PL'ݶBntE+u2EzD ٥ s]ݠsAiqߥ=vK.xDh}d7GFF4g9Z7'97f5znj@fN|ysi>8KJt"ÑTl[GaT pV&bΦX-*%Q*b?P+=(qƫb/JRz 7f`mF~r* /3~IsR/$8-Y2O,JRj<`Ԍ3m0Xj@_)RiUYh\6xh$YDܓ&/!Y(maMrNiF Q _hm?kxl8ۼ;e\9Ys^֣[mzk~4ֲpyX"첽Ȑ#cxc6_slI5K) k )[?DW򬡪50t_ m+pVG9xPũ4QxV]Pi{ Q-]*u-׬v i/oy7x]N0tr6+Pb6a6:a"ma1߾===ݧU} N~{[UϞ0 [u -NKts{kGPKl~ PKy.F*angular-1.3.9/i18n/angular-locale_tn-bw.jsV[F~WYi0- hZULX ehZ x|3=$36j 7vYP(DE{",,S 5 .$§gob_A"TXNY>tYG`|9GB3((zw{ڢEzx ˕>"qTr}0aF?Aׁ̧;RSQ L>@o؁_a#4L( E=p:67Yx&^SAX:`+ո1>{CMDOcf^wӅwUcGp.?A.T&AuOtJ=FpApE9@9=oql>v_&͇G3zU1>8BPK{ PKy.F*angular-1.3.9/i18n/angular-locale_tn-za.jsV[F~WYi0- hZULX 2F4]fg,{lx UUK ܿB.h/aApi`$F>?xf< ۋ3Sa8JfLOӉk}\;;J3땅g2I*AsdC!!p#}DH34nP1(!qn2YÌ ~66 +$ҏG}ow&ްFhSz׃uj]}n.T<Α:LUb ո"v&"'3/»P_Lp)?A.}T&Au/tJ=#(qF#Z-_$qk&VK~Ĵ ѽڱ'U$fbol)~F3 `t60;(s<-b>P!?SOHFm>ei6.""땻k,z 8 p.:pUXs<TgGzx9h n΃my"Y$&zǫJr%P^aX;W75CFXiU1in|F@uAishF@uA+l4H_# q]Vq<#1x]9;1k K" ,$[YFI5y&=y*u]M6VOZMwO۝-:*̚xo 6  @6׵~i;~`ʆߩÆUŷ|gdehg2l޹4Ye3:l|*s2kWΦ+Z(]GKI֧H"#?mpcPj#Yq-rz5\DjN[(>;9ߎ$w^/*Ƨ GPKm PKy.F'angular-1.3.9/i18n/angular-locale_tn.jsVmFίYi0- h tpd|hz:޵IBx!4QKgٵgEN!YqIOW4X{S gJ3^FTۋ3S:pl$,zvvpǿ-g=38FW ,{i[qjBB'.,GƈfiRP1(!qn2YCDAERӏG?}ow%hްFSz׃uj]57Yx* sP%B]-|0 #F=0&"'3/›Pįx&Yg᠋T>L :/ :K%h{#GL_=-?"1mtmiv쉻5Fh[M>0jjXk0Nwu0J9OxT%yӼ&# >鲈C4d5"땻k,z 8 t.pyHzv{ #Ɠrl _$_bb$\qk>(Cgݳwέ+뗼Dž"l$zZoqtQfH}_9뇍S dLZJhoL6,~^6*LyFW^20vyZ'GPK}u8 PKy.F*angular-1.3.9/i18n/angular-locale_to-to.jsVmoF_1B$~U/^hm -w^pVU@3ζԅ4KUKaWU>ZUo"N_|Wց]` dMkװS!($BKs"B=ߍlWpnul(QKݸ+?dArcD@ |B>_LOm$n'T^COo0!*.d[]Qkjc.Dq':T)TQ C9|15 ˶j.\b%Cqj.:Uz(RU?u :S+P {CZ/X#|aѹ3icVeQ26-](]>7B͢j ?aci:2ms:<ȥr7) Xډ#Ξf9sns2ДѮܭ;Ok.&[2+W]}kꕗ1\m12iW,*n/%?n55-zU OX0axq87kj]Ьa{n TPx}4MwùS ߗfoq`7PK2{ PKy.F'angular-1.3.9/i18n/angular-locale_to.jsVmoH_1B_$U?؊N>7\hm -M]΀ s!g灝m iˬ=l1h]dtYD"2# V[?`U(?$BKs"B=ߍtpntl(aK]K?dArcDPF>!=獵{I7*J\Ї*._g8GsІ]﯉ʻc`{PPj- {pWPT&,BjpY&: ګѳHTHU9ׁoV@ >kA_`A-UF'e[MFȘjt!tPׇ A7wZ2ACEguyK['GłůD=E= sܜȑ,e ]ƹ[G T+H]Lejҥӯ ` +/#̹vc)dҮ3X5x86hMX6hoLy+J%D"8#!dE.yɈ4lH#AO-~&Ю@g#ѭi}[]j/φ}$ly; z˩SZ z=ߧF)(۹Gu8JGWP.jyʒ* >X>῔ZWԴ O )q',38 ɵOpX 8iOqTY] 4x FZ?4qzxAr: wN>~PK^_x PKy.F*angular-1.3.9/i18n/angular-locale_tr-cy.jsU[o0}ϯPR%IRT+QQ` nT X6i )sǼ (YǣV<ŬG%Oɉ9 _ bEeg';EW̐w? [ן+!2v:<Ya(c=sL6'/bŒ#k^qʡѣTAȸm-n\6Bo.ô=[ ntl`Tx^ӐuGzx `IDQN!b(Q(/cLy }md/cN5'XU՛:D΍ZKِG!')pu&x0)$r0E EkaVЏTyZ*u13o~ ÏBevX E!W HHZ~R3UTV hH(T1 rk4%Eb, " &Hlu m,PGBd2tXȊFъGr&~Z2\*kej%Ňc8SS߷llQq$][;+[ߝzI3};wjYN{!?d* ڮ4%.Z 42#+Uʞ5U X̡hXl;"tF:`a$)~ur0_kQ9뵓,h%;llR6ϡ:.7bHpP ]]Ab,;<{pܟ;Qg?oPK3]1PKy.F*angular-1.3.9/i18n/angular-locale_tr-tr.jsUn0),R["XM"iFHUC $ىeC]l9?Ӫ(yVUJx*g8[~dd)ʢ2ɳ3ŝ O}kZ}3t~ؾGxGyg"K ox+<;dl+"‘틘rT I+h$U}7P;wŭ;V>–9>JϪ]~}XyMC֙:D’BeOSPp_ń=mhCSڨ^3Ao; GfwnD:,G'Rj΁<Md:d[^hnDv 7BXUQF*t(՞:a}'E],[`Wy;c,x"k$5+?:F q*k4$T@Iks;?>D\hlA]& ѨXPqqԄ1L~Z<%6UjUYʹ:4$߯pf(U{x؞0SOzVJF2 ىQ/"ҏHF~r$kخL3Ȍ<.UhZ Td7y8ʷr"StHb>ĩQw,h%(녋7i;6ξ>67bipчP ]_qZV<;>;p ܟk?oPK(hPKy.F'angular-1.3.9/i18n/angular-locale_tr.jsUn0),R[!XM"iFHUC $mىeC]l9?Ӫ(yVUJx*g8[~dd)ʢ2ɳ3ŝ3O}kZ}3t~ھGxGyg"Kx/ o{x <;dl+"‘틘rT3I+h$U}P;sō;V>–9>Hį]~}XyMC֙:D’BEOSPp_Ƅ=mhCSڨ^3Ao; GfwnD:,GGRj΁<Md:d[^hnDv 7BXUQF*t(՞:a E],[`Wy;c,x"k$5+?:F q *k4$T@Iks;?>D\hlA]& ѨXPqqԄ1L~Z<%6UjUYʹ:4$߯pf(Uk{x؞0SOzVJF2 ىQ/"ҏHF^o8\Y5lH]&tdFW~jZ Td7y8ʷr"StHb9ĩQw,hej&`®]F\l8@8Jbt+ԓ!NˊgLJaξ]t}k>hp PKPPKy.F*angular-1.3.9/i18n/angular-locale_ts-za.jsVmFίYi0- HSEN5t`nAKk<㮌]C^r Б5 wZ>)sIKX(ַwa>+k WpðVNn4PbRk{ܢPa~O;N#׺CxH1P٥*]3( vR<CK+^iѾ!"3{M2Q3#kh.~y&Zv{#f[7݄"D2K!eZ4EE>kb§߶q*)Op?YrڬL{٨M)Hj9gW?* R,N,Fs3}b.>a%>GZMQ9PTO|(,Æf4 D,Wx8JxϢJXҚ`_Y!MƳ/^lWR\ D:VYͦs4_ 4m=&.>/3郁WP.p&r9 I\ ([,6 m$= dԙ{ܢkUM_i;ް~<;2a%*U[Vx?Xu~̶ ˬKԫ'ToӍU>]Gt2jjq ~eT f! Zd487:Z?Q?5K{Y?/QD%9eD*˭mj[񥝋&jf{ _C q^wV =2t^}lL/ n=|PK7O$ PKy.F'angular-1.3.9/i18n/angular-locale_ts.jsVmFίYi0- HSEN5t`^S5wP{fmo&VU;ymal-ʷ"i?N<ɆFхoڥI< o2pSa8rΙ>L'a NXbO\ QOR$~m}?=kbʟ;铅~j-~67,9ml@V$g;RH9ްFh|C ǭskw!eS2LcjT,S`qtW.X:qMbU9t12@ir]A~*S>7yj|Fg*R#?aZcctopp]dLȒH3 (nKìuU3&b/⯡QԨCsDY&CvB>N*YR~D <~QDZّ4fќL0ɰ'H =C# J1¨]tsa hᒭrL n{Uid3:Kl eκ Z*(+]{-I6vHi4i_Zښkk\ʹh_Zh"j5AWy'Iw/>F큮/uƵzǟoPK򣖾! PKy.F+angular-1.3.9/i18n/angular-locale_twq-ne.jsV]oH}W\Ym1[(ZyH1 c(` cC ͬNڇ9u=M($"fkQߦaIj|{I@&|?>l#?k"n*ځ0[Sw 7plO40r:ш}8J|d>=wǚ, ?ol2Fhl\5UT 隅$HL.;X[@#&6uv!4`"{n1|+v¸tKTɛ> jXDkX`Xgn "vquxug,k [~M]F/˙9n2jEȎM|&$f+#s.@+ؑf y&!-KW%{GBƒ`>vl?ޝjG ĉޡ"Ѣ/Vӕ8QJ>(*!(:V&9T}>s(n%#܂'@IE \(maXGT-\R P@ +A0$]bxK٨Frr!ݰ4'{aK{90^ MvQ,w*mU%R{>kOˇґ#Kڃ[s{&?Lx2Q<۝/c;gOrׇ}/!:ɺO+ z˥V] t;3e[d ԗ>JT^'ȄyHk}#U_);~:5Ba)8ےac1 DKRrSs nv,=.yF+m|ˏyrѿ.I/PKtC PKy.F(angular-1.3.9/i18n/angular-locale_twq.jsV]F}W\Yi0-KT \0a5 ctFk=6a =wl>s?_7B*Am~RxCBjoI3_A7TX N$0_3wpl>41r6ш}8H|l=wǚЈ?ob2Fhb UTE$LM.;X/ādGL"}uN%,`"{ 7]cHVn7hzMކx/ NQ,c5h`)aqc["vq>Mbr5ú12@49 үߠۂ C!C:bju|P #"-̙a]9]^j)*~A,ٓ2ÕӈҴj/&3{|e ]fD[(˒? D+ BĬ2P@#Yx6^ccU\D}E2`I?iKZ|$=կC]";%J[pd|0ta/åqrdRFžKl9W(Lt5i.سa_k`Drŧj Rr'7d ‹,>N/WLP)~FBHI|_DY1̗BEJcf DJVkR[rM J; Wk ]-vu޾<꼕;$l󫗏k`Ǽ|g\PK1} PKy.F0angular-1.3.9/i18n/angular-locale_tzm-latn-ma.jsVmFί`Z D :U.r_#N ^{^lZ0ϼ?x)4KU6(_&(D w񊆌~ȫm'_UPX &0w̻ǑZr 9X(\Fq?IE lms@!|/=ˑ>ن%4lf٘e3r(H76fْe"` :=a:@:6NZ? ކx=nL"eb*T5հ 3]A^`}`lӍnԻiۢP_86^.}TAڵoB=qzG i(pB5#%c{k[S69$ƴggf@4$m}}[1!P1Bw7SѴ5&A]~Jj]ML(hV+ÞNhcIizLܦм^*WN ,'zY݅XU"7S}NvքT'gɚi %ub/[9"VRZ Hh%,VBN[deDVBJ@" 4cx6W<U cVyo=lQ4HSP9IiR P.n8Ɋ~SFBKs z%{yo;5- HQܚIE[Lx{T3u-g?=æzdoaò—~Ng@KzvΥsfttg Tٞ;(xq_KjuV-]rE#^OZ|?<<'IQ'DI'P$4QI/Pm[5,\.6܌/]4X}xrJy_t]O/SPK(n( PKy.F-angular-1.3.9/i18n/angular-locale_tzm-latn.jsVFݿ\OlûKj6 UvE p(҅o9wZe}mQ4\Q5HڏGT.Yj]ڛm/U&LX0w̻ZfWpb9!h&9Z($LDq? Etms|CS4j䰦˜DD 32 (H?d>6 vtI!ӛtCY(X|@UGv P JbNo8M$G~Ĵ̱Mw KQcs[_L\@$Һzjhh%X1IV{)? !fa| {4kaϦZG#{oR;GIAz1:N^OxPK;x) PKy.F(angular-1.3.9/i18n/angular-locale_tzm.jsVmoHίz תҁ2UF8{gm^}Z0ϼ?x)4Ke4(_&(D W񒆌=~ȋM'_ePX &0sۇZ&.r&} {9[(\Fq?IE lmsٚ%8hbو-e3r(H'>fْe"`.z-x]a*[]@o86j2xMI0ueST |0oDbuKnKr?{]/_4o?PKY PKy.F/angular-1.3.9/i18n/angular-locale_ug-arab-cn.jsWmoFίXY׋iŗ)d5%{M.G6rVPXٳ33;̞d[m$pғQ,NY _]ǎzJ}jĻEq' bJY;;as|}7[dglnΆL%1XΦ:|Xq"}@}ލt ºMI^F V^z9Ad[cq@vÈtzgz9iLY™ gkX A1*]6صYo84Jx\MzIz 9ԨP {.0u' Zfb {+WjGS wm@wސGp- U(|9,uew3[ eHI17uOߟqطq~񔑈w>(޵Sδ:p8j%,| @dY Voɔ܈s QSrd}.@*(З z;70C98C)lj]֧^PD#$YNFE"!=Q6VѦp'j5bi)"E_^EGiE/eXW*F3-x%ԯĐو,<8d#ح/Hh"Gh9PkS*̴l |[r㕥rSrÔT+K(35{Yԕ8 UGk^S~Y۩gÃ'Xa\ko0=-rh]4F\Paed ~5)ɻw85{6/40Ѳ]ŷv4ؙGnG,2%7"\BTzYϧ 4o 4 h"Bk֣ ̞P#xc:.S/(ifP,["{쐞(^;Цp'j5zbk)"E_^EGiM.eXwU,gZ*JwC^Xfd#JR@w8G>ÒJ_#|ECCMxS:rtDz,,,,ZY*@y<ˢ_b?ZkN=3~xuf":'JTֈ<7"tVrV(l6L&P,8{&T xج$%xO' ɂn 푤26~ͧ 4xq;_)ulG<Ǘs}m)oNgRڔȲtsRg?e9 lO Jٟ ].c!C3yx+Hn΀҈~^!GJcv;CĄwE.&*[ľ#SefmL|;TuC1bk yU*#^b[ =)6;y8xog'PK x# PKy.F'angular-1.3.9/i18n/angular-locale_ug.jsWmoF _qZ^/jQm U/dȒ-}0>H<kf[m$paUI',Tc=>OyI]ϸ1W9-\3U7gC|,gS>b^8ޣBwxha]&ڤk/Qg+/= í18 r5cQN]Wf g/T=c'uC5;5/*oxmB0B45jT35x? pgl'L >00t݉ٴـ| o{m#҇)Uz-;K(l7d>\05%rh]4BRafl j(e8:qh8miQ˜rFAFpe4QbS4bv')!q<<ģ=iH4Ut V$n>m@&7O'˻@PHMזʹ>2]sHf.m)-K7~(Ed{QurNEZ\-8l B %$ CP@|Qnm\Jݜ3JB*ch"&LAh(%p1QيM%v81P :jh~Pƞ=hϰcFBԁzo;C?PKދ PKy.F*angular-1.3.9/i18n/angular-locale_uk-ua.jsWmoH_19 ɗ&R-\kb08MY.얤;vym.!l<^A+HWe:[Ik<[Iui6yL颈Tdxhh4wOK_?53Ԝ]\d)26;&?q?s7_bLc~L sm?hU pdS (f#NIvaQ); }&a*n-=B)79Ro1D̨vH%m ZHGHiD!HC/(nur4]OqX,dwevPe[pxî;^"#g삤ĚJ? veyFIƝ7#إ}*Mv=Һ4R.=4}L̟oi6rċ6aŭ wB;&ۨX|)p5mSq~B_F,YqxW\γ惼rlFrI&Z2A)nsZʦSTEifxQ$A;Js<%h+Z ptCq5qt&Gq`|ECUnz ?uE-܇]vX>DG4]I5T%@Z8?듉3OIƝ7#إ}*Mvi]I ) F}I'S? ;fCBisLcscFMǢ=Sj>ۦRCs~2f,C^%9eEʱ{H }SMSOphU*n'і\xb %IkDE)x^B ]4զSqهo}߈Xy;p+:0L~5k9>GOҶ6ՒT4UI4;#mv䎰DfI(#]jd,Jےy/N!SȭnJ=n6icм DXe)7͆&T!v;O44!'*8(B|Gi.^]XC^f2%Yϣ2.a^[Qlc%u krS5R(Dڔ ًU_xG.gT̛iљ̝nޟ\L+)f MGl,_YvGג&:r #5(=KYҬ0 WӜR| f.h( .d[VVD@dv_HO!)ݫR OҫBWx /Yϔ my,h4i6^z&O]cw8q~`li=-M8?l|J|7ޓMx;-qg&ށt^į9),#s(o/,'0:eg/τPKW~l PKy.F*angular-1.3.9/i18n/angular-locale_ur-in.jsWmoF_1B3nm~iVTD IO]m0HX\-ߪCl>M7mo%(^gk|s,6|ßjy&q7 b+Y %'7Ӊc~+8=KbLĜ8I>dMy8WM>K㸡K/<7X9U1#$݀/s_ov-$^%tԞCׂ_ߤ[_zƱQۥ]ȁLLrLUQ*A0po!.X:X,vU4mB1 ]6R(}T:Z-AlJpr<#VYᙿ Ց0v\[ܶ&R Q3m?]8iC_lGnAOk]yUxX^HhRRZT䞪h>IS5GĔ1$*{ڭ#YZTh3 B!pj2}N$jޝU#I$VDȓEejjGeݐ"$A` Y^%5Jt"oUd&X'% 'djv]^m{7{c?{n'gaxRf= k*68'D cQƧ-"odz(4S*4qH,~'z$R_h /,T\*E/w$մmΦʢ^0bKsAʮ %m+b8=+iY_ q_}䰪P %aľ\&Eӊ4([{E"'e.5-)TF[&$&G`ƿWv||`MeI'QۅY)#$}j-M4M>A'Ss0Ь+F~ F_ ݵ]Kqix˟PK3q PKy.F*angular-1.3.9/i18n/angular-locale_ur-pk.jsWmoHίYb@yE'8Mq(kdlҔ̮؎}=R,3/8΅]NR_aJW&rXjMxڋm ;q]pY [k|s?s8eX!h8BCɋ/lK?!pLT gCGQ$Ͼ9S@LQ(9WOJ#$didSL@:!U0IdU,QRdy{"r6=n@V{!'c|Ԯl8K Q,ˣ6U OfT C2fN O&S9!wXF)h(^K. 1%$?zPCOJQI0uX?>CUPûEEK0ԶA`¨jӮys5m#y"l՞څ݅/aq>U@ϖo6d@X;6|?PK6le PKy.F'angular-1.3.9/i18n/angular-locale_ur.jsWmoH_1B_\ڳ|i"*_/l$X, NS5}=)y¸<إIQuū,tocֆO&>Xϸ1וƞ%0Ƿc~Kß=KbMM<Ĝ8I>ϾxCY8צM6K㨡K/=7X9e1"7DBQ@NWޗ7;i/:j/ۂ!C tGc+!ަC20cjPz{+ w{iM' ^fӆHK6+oGkёbJ9 k`'q(=쇰 :kվΞUZ~%ѹ̇m6EFؚ[t02|У{x8 D='Bͽ@(BUtVH$i?POlۜNEArwiNn,%`JVqL{Zӊ /m۾aFa0b_VR7*-'gyjEtrpE9QBSCW"D"%$'`W4||w97%JۆY 5n-ִjyO[(uK2Bhv^>+? :{M_c㈫oPK{G PKy.F/angular-1.3.9/i18n/angular-locale_uz-arab-af.jsVmO@ίlLDp?pX)%SBbL+݊b>3;/ξ+سvgq5pqw =Xѳ7vEQ3vlvngݎ_ ous"Չ#>s N_w:/ot>X3n9ɓM>3?yoB%mj`kD[<6?1znfRT}Hku-)ZUV҄~ck PPVU*? ޵xV=3xM=xR;J+Ӛd.HöeB5@lLTJU 4=!hXd=LM5.}2R2(DǠP&FcT,e.k,Lrdm,^sܭ+I; Lk綩ʎj hK@)]T*o`'&YI&,I!iZM,߇(ʗe$̖:[Y&,KD!"vS߿d76]ɂm{+adKB>tx'Q]~n_P4p^DX^+ZJȰ4s d~fn>D͵KAAFKcn~cl41&zH Xc(?VcY/^xSmy"a5"yp.0`bfT/ZGoBAy 0nO!RWdTD*S..xƦ))8)H/Rƶ gx_zҼY3i9飗MR> EB%Xo[mgHylm ,1!, "̸+ZC!Z.Z s@A_[Cjg&x7 ZLlx 7 80wH=Қd.HueB @lLLJ4=!h0d=LY&^T }1(,ɾ5y 43Y9wi=iqݾ6Uٱ6W]Wf]hFU NM.2E&,I!iFM,߻(ʧe$̗:_Y&,KD!"gApRol&ۓ'Vl?bXy}F hQ>Bi,͈&0<_dEPBcu:<6B,I,퍬luo^ߺCs $b Wv4DűJm1^Jěn Ƀ v!s0WQ (Gk%]g%0=ɣ8<"2W9ܦ_'BmyE?-?e/',aXtd :LPxILsG!EₜK$R_vUkqųl* oPKrdn PKy.F/angular-1.3.9/i18n/angular-locale_uz-cyrl-uz.jsVO@_٘%qw UL,Rb8ϐlC δ]=\vc|i/I+BƋuB6ӽe<̋̓$>d_sIzbugm\)9#? k&t  ž/6OlnvS9{}>MQ7,}eev1mѮ92-|6Ȥ0C M-]Qs`~ J^ [磮A~;D?MêԾ5Ԧ%V#ls82*& *P]X bJJ("JK$ށJ@ˡy;t2&jipХLZh#s#`N[#VPkVR ,?76XX6H:ac:+L[S%PYB'ر"uO1^}^u"Lϋ0 n#p} VM<|%<_j3۽y߱6Ynh>A@b>)LP`Uۢa3>̏aހчQC+$||4 ?c"ҷ/h@V'XVrwڌ)ooA"ܮJ!:C@%@v&o9%L` %boA2N ߄0-:cc48BKJzQ 9Q0'l⏭}lm5l+9H= Vx֤$<NJNNÊ0Sutik~V),wI*SW]7=/uI=誼x2ӳ"μ<`دNVf? G4 ,8"Π!>vq\.e ɟl c.,Ցm%@40{%?-9'ñzÛ 3sikyh .N4Rv6 y݆>Yj{{:X"i&Q`˄UI0d@A5$bƋJ4VNKo%<_KRJy3T^R4PsҊ*."ǩ<:Idp^zGH8#{ 9=%|y%=Z[PKUG PKy.F/angular-1.3.9/i18n/angular-locale_uz-latn-uz.jsU[o0}ϯJmM>%KH\D'e.@ [5 )c,Q:-ELy"'-Ҁw#ъ(B RvRq譳&w3G5OݠocRBeR&xҐJ~zA_amh !l##Șrtk h(| GPۛ|l9湸!xf؆³p㞁4~uC^gžEh SVdӦ~61,ӛ U7c$V "0.2y0. c#{'&6gg3G7 Y6KSPz<҇SN!W[u]#dk;fttS@w{dB~9 ZIJWKI.k$K* 튅ήҬtnor<7UO5RH{izB)؞$ggb[DU,*c]9AWB0ts. }ϝõ6}gt=/PK8|PKy.F,angular-1.3.9/i18n/angular-locale_uz-latn.jsU[O0~ﯰ"$@*P؞Z)F.JR Ped$Ne)qIƆYj;ŗc,Zǃ+cv!ɉFWDGiGknPKNyɝ3\v>}vt޾Gږ"mRſUcK sS '+bg´ݠ#"/7z& h*4Mrp$\FbNM͚_ c4ʚOml$E>aOfqfv h*4Mhc/"VTRE fwTQ  R7@v+E3X DAAPE(ڥ6ֶ!Hh60xtHwø }e✐J^g.͇ĕKJ,ɽۿm[:e\>}<'p 9%صm.&Ks]6(? tE4~5y sElmvJd7IV9wڷK9eѧmRO{if; )x)&pFTp>J6H?N pN8B%D(eHy~;lvyyv騷_PKZRtPKy.F0angular-1.3.9/i18n/angular-locale_vai-latn-lr.jsVm8ίEZm$ıi(dz8㠼m[~c_ݶKZ"<>cIE%1e04w:+5I`Mcʆ@D@XBo E sS_v-aUEE׬جI( ?|83Q=SINZ6U3-Hb"a5A{XZ@e[3}+f$͕+ӊe-bVaT|v2)krx;[s&|J'ڹ3vq̝Ļ3 :M79$=5W ?EJGx^B_flg Bx^2:Ijd J;/׵8ЯWQĴ7SiWBupDOEJȒSJSsRTO{3]=9a'[Y-ŧ̗᮱éϿPKv PKy.F-angular-1.3.9/i18n/angular-locale_vai-latn.jsVmo6_qZlN 4"ې^Eɜ)[ں;$نa_sw4")[q$IPpj["MքS gإI X,:o$7}N|[u/4MPs>sH⿗IW{܇ dB"&OZq8tb3[z1!H~vHNJ"`#z  "7C ǭCݕ-]3v,] .} ZC~̦̄ *Px$ج.y.2YȲm߃Wt;Eݗ#({#hڴ_^`_p=.<\=w/*2r&• k R{U] X%,g?>ꯨ5IN*:b5XTSfYΚ($-Qc@+ѻb y&%xMT۟V[Ra!YRے<Q~qI3ۣO$9Sj9 rTʹx""#qʋiX*|(GYaiʶf,V6I++}WZDxuèdRww̦ʕn?g6&/鍋g,$onaЮAwY^Vd_d?Q|J1(GtP3荐@AE;&C^̣(|cοKg W)}4 QbZoSiWBpNkx>%k#gsETW!| eY~!^8y 񃪇?˧:\?wPKA PKy.F0angular-1.3.9/i18n/angular-locale_vai-vaii-lr.jsVmoF_1Bۊ*!H0ɽ /6,rw>,.jHvyfvށ}yV\$>Ah'#K|sZw&|xWEa$pn^\րC-e,ljjf, }q=s !'=)hq:/8ק5.?yoH:Njyp8cy2 8Fԑe䑤qpz MIAF w&B ZNjZ)ޯ72oBvc *P%դ<ûwl wim;\fӄHg<n|ȪD*Y#]ҀĢ@!uD|) ?q;]{Y\IcQdLNhF f>_꒘>fYM?&whY4vgWZ]ǁ2*twuQAyMEo@{3SuNsLQ_*Iv)`Dʗ]*x*0$-JM˜ Qv$p9y:G"%_4?0lZ"Gfw:+mIv.g,KSԌy+#{Bt_MĬ)^'R@R!w6HTuJRPJ\Qɸ"mO D Q4maDƀuof1giCb;/3Sw6]EQu챰Vٲ7yTJ/a "7r&7a2673c G3fC>a/w8w'>ü 6v(F,8^>v2 8F'Te䒤r0sjZ#MhGqAF94 г:@*J!K!FCi` `jTPr;$uAgѦ\.C[$S 7h dU#PA,sȮAK'CHp`:۾f¼mJ浮=\ }l.(2j\{4R=uILS ,w1vm;+ݓ+6cOu]FԻˊ k=kuȢӣ- EX(ѺHc+͹]ϦU$;0"6B{%nKc&}Xb̄ߠd;8}}4ퟦBOvVE۞] F=EtE}fS2}UQX0#xCĞw"OIç^/3η-7Wh#l? ԤpN_6A t뵮NOBrje-ty`tC>"%Mo5?0dX.n),ҥ mrlfy&g45cHip?vŬ>pbESR%kNRsBn(o x;#/qI2Qj1N|N|G.HM?lgM{!sYE7&wӉ+͘@D!zgnBN({R$uqOf+!F3'8tv+dNp7#!#IyVAȉK8Wus;u\;J~ym0kP)*5 'ccKH3toZ2&tD?YV&,]T2_ "6t)\#BJ1th'R"f/t~D3(zKbIfU4^ϡk\ivhvTʰ1e=Vu]%]K>Y(hN'YΝ2E}>3o$م)_t6ݯ +5 c&ۡത8Vkm"NY*@iebe0\Q\0Gy M|~ 68K~׹EU8+46 vRfR8agJ D|w0Z_g'h93ɳ"0!f[{zolz\t {]i[ y+3\̥ijƬГ iN / :bVãT)SԂ;E$*{~LRPL\QnѸ"m D QjV{:%4nH4]*z蒚=ؖU6zk=C?PK^K PKy.F*angular-1.3.9/i18n/angular-locale_ve-za.jsVmV8!j&Ic\'5N&W!..mӔDyys."u!͒`5 w"dI7wxBWk×GioI) V]W;g6"tdlY!a'Ew+8SwCV\ZgQ _u}cxe'3mXו'B'8ET/6\E۩\$$J@OQo5]XU*JŒR̂)9 \pWr_ PJW] 3UaDf+ 2Z JT֛Dޱ#=8m0:0Ki"A RIVz6 q M8Ɋ8[X-=jZXjDG]?wxZԒbe,Iߖa)_EzҴٶaWKۭjF>zXUxMom/\-|V_QrwL n;Ҩ +Q3vg =wPHq_K(uV-]h/m>y^KjP$,3"[.kVY膥%zmE b[Ƚ..[ڒGb=pů~loqE|zĿPKY}S PKy.F'angular-1.3.9/i18n/angular-locale_ve.jsVmV8!j&Ic\'5N&W!..mӔDyys."u!͒`5 w"dI7wxBWk×GioI) V]W;g6"tdlY!a'Ew+8SwCV\ZgQ _u}cxe'3mXו'B'8ET/6\E۩\$$J@OQo5]XU*JŒR̂)9 \pWr_ PJW] 3UaDf+ 2Z JT֛Dޱ#=8m0:0Ki"A RIVz6 q M8Ɋ8[X-=jZXjDG]?wxZԒbe,Iߖa)_EzҴٶaWKۭjF>zXUxMom/\-|V_QrwL n;Ҩ +Q3vg =wPHq_K(uV-]h/m>y^7E1#冿kN[nX9-@ܠ3.V}޾潥y$.]TAv0'§GPK͖jP PKy.F*angular-1.3.9/i18n/angular-locale_vi-vn.jsUo0ݿ!KuMs?8ƒ0 " Ç;j5D}Ve/Ku$w,\!SI~&϶q@UEes]h4uGO7w x: #4L ;gw[#{ dG=|pOse?l-N*(,u~R h{ǵF 62&/ ፔ6M ĩk5?nc {%Zi&ԢStK] ˱}SlRi!E`{R/e)U^KoRFꂄB;W3o}J䯑  A@ ,NcU"1{ ) PšPFMV5=7\UIrbF*Vv* dqoGd$➪]QO B{qҴAб MEfYukҲ./5[-,{ڳbO[xO]װdz7hת7?ZpzƄۜp鄳]NFoxAvF^AJddx٘jB` UKHFi9 ګVdqrsَ9H_K=SK Zk}@A῵W㭲9{'h۸%L#eT9NƘ V&mm&q4aYyCw:ܷ~_PK]'PKy.F'angular-1.3.9/i18n/angular-locale_vi.jsUko0_aJtRBk}J" 6@G5aIRϹcceM!8 g8?1y?l#ĶL6E&>VתjDͶHx<-S&$D 'o7H<\]O34МJ(,u~ n!`h;6PGPAspaHǪ.TU@%;Uݽ_!`h]vtr!ݗR_%$isL$_.9RMlJB$( ;.~_eHȴ!]}ݲJm"wA1Bb4i'/gqzً]'O SLvPGuԅ2: '䶌[\ !jQD xkˮ?(M)]Ppc ˘ ø8"]4izM0*4+ؗqĦ[:a8sahǓmTkgi/X¯4⭦>p:ڜŜ#l=C:'|' OUE<2?2Mäa%& QKfYESZUN%}>͛=έvL##-:ۖz?D=wkG[WN5#2Ñ꿯d}g&ᎆ/,_ϣnOi_PKZ`cPKy.F+angular-1.3.9/i18n/angular-locale_vo-001.jsVmoFίYٴ`}E%)d;kmqkz\VU-gޟYvlBd+IL <,Sj,ͷ$ǸJB D%ۊ$gVЫ?}M%~u=9z.. 9QR!%~~}tA!#Ezsח>r8u!nd 32 Ll@VHNXH.#˴;p*JB% G}aJY,`~CMzǞӵÎc9hTTJ"JL%C';Kw3wuZ]l꺌PeY ~iׇ?{P!]ę_ָ17pi65ɨz+O_L>./1Jlj}թ(C2]XQ83|аT }/1 oj!V*~}TŬ OOR͆KDBrQ-r-=+U?PYϗ~8R*TTѴ*Hlu= < 'dǕ3!Ņ8i r;i9L+"(<|iCh&:ib N0)o 8EhLIVq[<\ч7 otZXQ2k,_\?lx2EʝxxݕĻ#a|wt֫iBm|Ǐq2  Q*S Vwa6Kwpvc0B>~mtA!a<풏|qtryŷQT~.6@EXe`vn4E&D% F=0FØP>0t-ߧkS!ɇ]sNLJL&L`>1% ևOV SB1#a5 2@i Ȯ°?TCCaoҨ Y˓; 2U|y 8bQ0^AZw#8q*B Vp?*o 8IyhLzQRq?g7[J-pm鴰5w/zvbyXoJzg7^k{Ex{$nբz5<]&chOků z)ޔ :T z# AS` .CEjֶb*uZ:C%{Sժ{Mi%nk]\d,1bȯFe VrI 7kMhgVyo@X)/ifykXjǿӋ9<_PK] PKy.F+angular-1.3.9/i18n/angular-locale_vun-tz.jsVmoHίYm1W(:4A1Fƹhk㋽];kzMsWUyfq[d2EH~oEHuT[h/4΃xmx3uI ǸvpOc@{iD3(QgGGm5p/MGMU%) 3 fd(~~#5)"ez aHwC ǭcκ'.I1ueS5T <FC]? B1=a̓QC3] / {GF!_?'061Wy7pWڨ 5$f8 >lhT`4I;J'\S/mbb;4j1bhc QaJOlv,hBrT _d\+p+ukHc Xk"+ 5Y  Yͪ=S)ħ [y F0f~eq6-4(FYҤ]* *ѷo,M]G.M ݰlJ[XΏɍ㘋ndZwUM_+ /~c,+i. 5zA|4<ɆU ,)|N/Iʓt@d !2-J%h(^ OJ8;I+S2VnL-#+]~^-~%JrzԒP$vۊh\\*umR4۲XCx r;B.2RWu}yůoPKMPKy.F(angular-1.3.9/i18n/angular-locale_vun.jsVmoFίYô^?s 'z ]8k.mUgemqdld{bbBxBnbwoXȍ.|z&I<ؒWb#XVRXݻ w pvC04FF }$|!}kF1q vGyjF*9츜M03U 0 PEIz lҤ\Tktg C.vrWwQjuj.ĉ|LRL!ebJcjT~ ]C^`}0E0t}Q(/xb8y~U]2MuOwh!8!#YpojGLkLpޭc?Ncy+cXY:?=XCX< ֝f*bIWGI&j*xi#4+ܳQX'ѢQ{7P,LSڔ8l $mvpM;SāVyx`v*^DI{,ci0Y!hY%ىh&V@^k RZY7,Rg\iXKkL5vyCj rV$HVj_Ig|oQ#ŮE|| `?aA5A4icJ/f8E;yWFCꯑKBF7DM{O=w]{>^?V=ub_K<v+<۝'cVj}ׄ7&NlAQR{Gl`@! yxc%tͤq7TrX-yG[SP3 .U pм\4I#YI&jm57B #&V86j&}HL)ST!`]N̅Ygӂ˼P_xqX&ٛVU)g && î;^B#V(Ùָ1z4ɨ83hFFK#}, M/Yˮ'ު[4gHR`$ywUZ}t gBZAhH_,*VϒG(aOMɬxVcLd|UV3\ĥ,;>XpVE9p-U5u?^b䉯DU5jbU 8 +87gT eALKSq @hSs Zu&aE7~p6>-:]7D+e]^[_#T 㼄S:)Ei;N;*rUK1w>]dxdx/J:T{xI2gi);)KkTDߖh+c5R}XWt#/OLq.Ѯ[A4PLmQ ,$2:I lKy#)Nt%B55mr{(~46p\nt" yG%r4:X-tk ^OqPK~uc| PKy.F(angular-1.3.9/i18n/angular-locale_wae.jsVmoFίY׋iKtRAQswE^V-6\oׄj }YEeM%_/VYNYLC1gdL,SSaM84vݽ;{<]5>7&Nl\$x$H|ߝd/dml5ƱPamMA(@B'ENCs$di&(Մߠ =TXkh]~بcd$i#1kPP; U`f>v ;1fM .D1~fdoZ:R,CtSv=azbѵj_gGMZ~ ѻuuEF9j `1A7 ]u Ju~Zﭺ&O}FnPُ$9/Fl~\yL'Xw&ƉubEz,yD_Ԗ$U$Jq^_=_j>L>(q2K9q2yN2\KUiM\|]] em8MJ9а} #fj_N.9ӠtGGPKߛ8y PKy.F+angular-1.3.9/i18n/angular-locale_wal-et.jsV[oV~WbZ`}!%ED /dޙsMӮR3|6KeVXCCOUMd4=)6i \ŷ$VKYKazs oFùu9qp,g嫗&-|Ibb"ED {O=/%b3!WClaP+νep@c EĮevA4g hGЋWZk>j_/Ը &{ؤz5]IA ]>9sCͲu; bUΦ &<60$O5G#]~?t>{}H]ca=-ߣ[8c3ϋ=3ѣ庡?ҩLUǺ),.:t, nj2p%^ZtI'z4Hg\VtLSZnEpG9!{2_UR2 <$wfgI]nW]QguJZB^=tOu!~i &P*yDB3Qn(l^(0"7:I3?< r6%7WS#>Ph9[DZƣlaAƵafMI.vZJrC{j:-g||ѕ%e5 Rfya`kˆ}Hٲbq!ՎPzS#a쭦)qBPP<}JXIqEZJϿK8%rMcJL@&==bd –q #F.׽Vx6kB>޿5= +lVZO[P;JvPKco] PKy.F(angular-1.3.9/i18n/angular-locale_wal.jsV[oV~WbZ`}!%ED /dޙsMӮR3|6KeVXCCOUMd4=)6i \ŷ$VKYKazs oFùu9qp,g嫗&-|Ibb"ED {O=/%b3!WClaP+νep@c EĮevA4g hGЋWZk>j_/Ը &{ؤz5]IA ]>9sCͲu; bUΦ &<60$O5G#]~?t>{}H]ca=-ߣ[8c3ϋ=3ѣ庡?ҩLUǺ),.:t, nj2p%^ZtI'z4Hg\VtLSZnEpG9!{2_UR2 <$wfgI]nW]QguJZB^=tOu!~i &P*yDB3Qn(l^(0"7:I3?< r6%7WS#>Ph9[DZƣlaAƵafMI.vZJrC{j:-g||ѕ%e5 Rfya`kˆ}Hٲbq!ՎPzS#a쭦)qBPP<}JXIqEZJϿK8%rMcJL@&==bd BS6apĨuѾ3;ZpzmSCҧ۸ѲzkaemҊ_iEjxPKpZ PKy.F*angular-1.3.9/i18n/angular-locale_xh-za.jsV[oF~WYŴ'PT`D1Fnhc{F޴UUK ܿwBv"xFnƩ >:N>|yğG9s%e␲Hփs''1l|,{7pհ h4Z(DBFq>KEz=9[PxʰOXL;UriBV 0 ȊDLۓY,@G =F0ACN0@K.ӧcL,S嘪v0@0u1 և&IaȄB1Ǟb]͏IC ]Q+s>Wo򈡫gxgL-p[xZZ9sڤ 53scJ _oLx}, SM䄫_yqT&lkAiIRzK) n= "XGybh]Y-u\>2Q NߪW4i"[֡Z@kId@Uീ2W HZ- ad52$0>W'Go[T, $ 'IҴhT:,,ҷ] "45v[h--FXEm`~4oO|ݙ2][[򭱑x?æBF#2TZ=R>eՙŪ[`H19L񎼢#%B5V@AM\p;&KflFEQr5nFRgR O.^#`Z6ȳ9^c*cWi)rB{k,{C7r%i^^/PK⾝PKy.F'angular-1.3.9/i18n/angular-locale_xh.jsV[F~WYi0- hZUL#MDjc{n(glm@>߹s9f $!N;D'0܌S]}t j}?1rJ!e+NNb?س1>Zna[о8BOkm ,IK3{lC!$Ez8+Ö>i@c2TXHx Y~.6 +b2gӻnOjbf70 9~0v.FOK]!:OS'AX1UC5`*恞az bKLÐ Mb=ź>1Pե*]#H PJ|9<CW7 pjϘV[2:lslIA2jfƔ4ZzߘZX"f W26M؞ ւyZE ǀlO1|Z;+;hىJ%-* wWd(]p'K|SIݎ{D*ł%ml{Hw-|`@IU5+h&E8C#<X `- kɫdZ@jjVe/HJqh/`n |N߶t!uY~VINitXXo&AEikʷ~[Z4t<#`ߟmi3eR 0&[c#~MFdT631z1{|4˾ʆUg⯁!y^2;򊎔 X7qZ,ACxy=FոV eJuK-Z*(+]G/ s%QAy>ǣLBe4-\'oMO4cxrosF:[_C@gҹ<_PK#PKy.F+angular-1.3.9/i18n/angular-locale_xog-ug.jsV]F}W\Yi0)HZU&kiJjݥzLhZKr2FU"nX0}nw7pr40әXhD\VIGz7dFH,W[~h>MGtB$&pg#!9H5}v6f]oHOLSs0{n~00O¼tSױɛӧ} o,[eتװۀ)qv7)8&$ݶC*&|TbǒavX`Airx2B?)C{z`:b 8#5Fx޽m=x3DFa2lw/xm1"C9zʌ,KY䕔svb-DA I`$«AH3~ өIg_0 }JE^1x3iJåj!KDY5dDTD9wErx){i}Eu+teVU \&*ZgiXai8;VzP#R) & Y5Eĥ/k&B<^ FR)PΝ UrmmϫyH11 $)c2?[?up4[زYSi̧,,w?2& ^%G !yduO3 zϥX] ԟJy49Ll$G9-b AtJNt "JWPU3qZ->1 D*_lk;Sr[s; 7=!r݅o!۴qUw;H_90~?NMOPKX PKy.F(angular-1.3.9/i18n/angular-locale_xog.jsV]sF}WѤH1$O0a;#DSz< Ҋ6 U+BjƘ{9+tu%R iUvo$(^ тg%q_e,f5IӇ;xx-VNg!0e3* ,8Rx 8!P|zЎV{.j 4Q^F#τ/y.NOgh{b4uڜ3?PCt:>?WzōR8P](\ӗv.KKC"U oBq}=wڟ6 H70~v?6JPK߯ PKy.F+angular-1.3.9/i18n/angular-locale_yav-cm.jsVmoFίXY׋6\"ŀ )F^ \̮7^'XvgY{ɋauѬ'A1dE#f[Y,a)VOy䩵_]h~7<,"e ''؇hzDL#Z,/\m{YaK'kVi3 D@DA~"P!GN}A%+Lg9$.bĺ'G`wDakjcb6I. tj a B%`;#[eGN̅ݬMz2QBYzֆUvO^שXVMeIR7geWEPũ}bn )(.au2&X".7JK)F<8}H9-.;͵Y7./S.c@&MqGPfSAr#: `1:5ϐJ뾐54F?'mG*kHpL]yé0[DοM`}SyVȀٛ<,!qDᛐ*_u7mݥ}4/ 9>7JH9Ю^>PY\y>UaED>4yJ58y96IM$~6_LW85 ۠982).Ê TJ#ЩFþvKp}> JٳW7$ Xӱ=}w:[xp2sw|p(jkGv=\8}]Amzz{Abk̘~dt c{),` gڣ*kL &yպUIJ:6KT'ZSPkR-A{ۣU,AҨh4^ 8*8&i!ߓm؁ 'L`{[pPK/ьB PKy.F(angular-1.3.9/i18n/angular-locale_yav.jsVmoFίXY׋iPTQb.b@^h/^ \̮7^'XvgY{ɋ2Y'N2b%֗&ogKdd+x"l;$O-_N+ܿ&Oןe Xg.@/O((?u?>dƳk b*buhSܳڍZ:8YF-0BD'rqtyhtQAzJC!(FL{rvGvF?h$-n B瀁 ! ]B @SU&x\jڤ//UɃtHWȶ!t0}7$!u:[wnΠ Ͻ}oZZC 2HC3cm_ew%VNŲڵVnE(KoD6=+(*N#v>HL@q\G3ɽTe@7Ŝ vQZJ$qm EIadtIeͺlunVr2Ah382 ٔU-TԉdT+ @ЭyTZ!1*#n3tM'l)9~4oMY"foR򰄴oBթJ޴u1Vм8 (!g@za@Agy>WNP{W~+^פIg}ıIlį&qbNA5rpz2(.Ê TJ#9?ЩFþv+p}> JٳW7$ XӱfW=}w6]^{p:3wrt(jkG~\8}]AgmzzAbk̘~fnO.Ɗ5B Xl$GU֘eb1&7MJyu $3KT'ZSPkR A{[FeF E,dL]8&'PIbylLF8:rX УxnC4KUijYm s1Ɨw2-U1W+ᓢS$IU }Yd,`<- +洌@;R=:_<#JLq~QdT$W'uSVʸɔ҂oI9:-@\(EG1FV{uȥ6mc)rYrO编޿>~n͢x5+| Ze/b^E"/xE:JONI48I%Ʋ<(EN \Jѵi?\۶9n3KSs"_Ork3Ncڣw K[NBIH(|_.wQqO\e5 zE:#gI" R :UVk Bfq?ɉ^/Ox{{)>DxrdLzcۭ9L!DQdHK3a.gfg]_t XwpqGֶh@Lo B,U*gwk A~`{]3 YVӀEIl(Wi _A?ͺk\XGL/_sA/as\FҶn/Fs'FGgzؖM^ƟY"GR=W5EͲcQ$+=*JU N)%A+]E7S~?s(meُS,bh$^J,zV-U>r+U3J%GCwHRz]ƂwE(fZXՃQ>NYv*&J :m'TA]r}>[*bIKm29!R:?8/'够 jy-ٿ>~^bXx5R>x~#"qd `0DQgʳw>“Dn5.NR AKiX}R1_ckDZdjK؃<ٹտ{|b?:qnmqu-gXtIU= #E+B^ Yv(bijIKE2^i5 Te&QRźK'_-HUopm0Y@E0KɪsMM}DײVF]dz6zk-ΙE64M 1tyv-;PK)APKy.F*angular-1.3.9/i18n/angular-locale_yo-bj.jsVmoFίY׋i*EG%R 8=k_5 \; \UX3-I ?2 VN 갩FF5OCcװC3m0@@MLxM{;Ʒ3YA6ҶS˝Ü7v}ˋdN'/pЉ\\>c߆|:&dqrQ{ Mmz4Ѯ jޗye u9H*:5t: 'q9kX&x>4Эx].i8(OZX ֲ4(A,sWAObSwj yZ+Kot+`;]{ kH2jH%(?BQF^J%|L1olj_ l*]6lХ®NM:0BQ ?iCQ杨0'y($JٯB1zb4<;mlSm1hAf%̴XNV]zcGpFN]h=V{R(N |ȀM4u:'[gX}ER"qJh`w)Z_SH~j+ƳQ3?qx^h;ǜ6"M+2\ȥijƠkzI.x$J[eAqrȤJwGm3;AB8q(tDxOcD翅t^8.=驐!RWa>6;D=Wa(-$EӪ0pI+p+BPUxVN k6lζq?PKM{% PKy.F*angular-1.3.9/i18n/angular-locale_yo-ng.jsVmoFίY׋iPTqĹD12'z"7ܳp9..6WU%,v^gfvv=܅yvzѩXB+iD,11ЕjһY/^4˪,Ofi s 7C36H$FO"f2LtI;3%׻1."^3'Trrֵ 222.0!( I#`E4f 7PW(Fe~::AT֕w2A?;+lRaN؉ttJ~PSُ9/ZYvy`mPq%MHX}O᭕xH>5p@ς-vuYD\o0mGQ{>jI `- {iA&y\WF7gMII'f{O{X'笩X9{qBjR6r'xZ.tG#as+p00%cCFP^jA\7QGyx1ޑ涛 x 翥,ĹMiGz*%:G֯*1r&= E-3;J0KgQtYciF>MhBS'nUx^g WT37p8Gq=ues_PK b%B PKy.F'angular-1.3.9/i18n/angular-locale_yo.jsVmoFίYô3PE (8\"ŀDkdlwf0\UyyfTӅ$ڭK3n,11һy-}nʬďj,FOz3OC}7CՇ;qÁɊwg:+\&{#^'9V9ɭc,dF0"!'IgmFFIҘh7PüdwneS)Nfu< LV0bxgn`)\0?td}&ԡښϣTtQ% ~_']/;뀋uDlK3Hqٖ1thAJ*iZL=R|Y,6b͓1/[yi]n3wU-*{Z z ۷"\DS<حmiYUմ23n-y1 W oJJTBT 5/tq-U1 ;q4NϹ5=y46G8KG۵AǑ,6!6{X 4oh"\Sި]7zû PK*5B$? PKy.F+angular-1.3.9/i18n/angular-locale_zgh-ma.jsVmoHίYm1WcNE'8%R 8WqmK~A&m(fv%M)=<, VY}Xsu:i;J=9.!rdaO l*aM.U9N)cx uL" Hb2z $TX'>K"=|` ޴"Ta:ءjMNZ~i=-icQvUwmP/hDN,aMR0 rXyم "'ܪ1E#c o PDIZAz_Zo^1I }T xN3jߗj܄dmRb 81QJ5 |PssvC֭(U9&h,Py|qY&W;&:Yj  xJw}acѵh_k9E(ZGZh_2\"#24g&=~B5)SW_ҵ{FWkmu84_F{|v o=Rs7:fF]L.:%nz^[sɫ?xiDǢYNFc5\H4{\-h9rܑޭ;\Je=)L[w*_5IeO`dBj!k#^ū#UB5Jg%ˏ׸Y1@̆3hE5dkGi]qRxj?9NĈqzua'eŏM#o_Xy^꩐fiީ'seL Ƨ['Si1v&W<|(_~2%LPbyD i7Qn9WAuf[mZX2[%DrI(erc7_?2&|a2µvaLܨƌ73!N[@m֤y9)y@jH`X1a|LeE7B.9@ULꔄ'EhyS2e&-2`u$?/R)U!%։Ǐ#\bH+B=<(0OpP|l!- D\3-B*ۇ;G\Y[ϣivUpPK*(u PKy.F*angular-1.3.9/i18n/angular-locale_zh-cn.jsV[O@~WL&&jj[,V1Ê!I/]5=3eضn6| sYqDtgGl[S8|4K~`:oǭ~E@#Z+Fd9JXe϶QFqU\MڶtQ7UJA!Mҷ+#bsfh>Vgn :';@D:)\VPB<7[nnc ?PK PKy.F/angular-1.3.9/i18n/angular-locale_zh-hans-cn.jsV[O@~W45A,VUL,%İbФҋvضn6| s%DJs^q+''(\=D jJOCG8z\ ,I(<ةxű4~ZŠow5~HtJX#QH؏TQV%yo?";Em5Ѷ1[πy~6$ @le 7 7]>%L!2gA R |ezV5״riW,0aY9,T}9$SȵrH5U2̑=&F Z]:>TQJOD)1D8\(}m Y)dhZ0u J9Zo7Hc*lHw9sq߶ukT>e×Aӽg-}cxa%އV8f=+1O%ͣnP\MZQFR(R *% ؐ&[ jv㹴h53'dhg1Vw%RI8^wHRL,׃om^c ?PKPKy.F/angular-1.3.9/i18n/angular-locale_zh-hans-hk.jsV[o@~WI}p-$E b6f bik v,;琦DJwnG  *_|sGG;>/8cw?Ʋ'a[ $Kk`" W_='mX8Z3 ְM$ td 2?YߔjW)M,c[&HK{P˓%ғࠏY?oQSWlOJ7IJHF~hMcsmlPK6PKy.F/angular-1.3.9/i18n/angular-locale_zh-hans-mo.jsV[O@~ﯘ5هnEk"PӵaڒpiVgqiݘ%i| s%%i9qUDn!\=DFO6qXfzQx°Sz12a1ڝaKI1`ԋHoGx_7x,n=,jI,- G !b5,}`OpC)_0d"y\]]C_J4 UUZ3*WRuRAׇdZ>$S$jiibb.]g*^(ǣRJ< .ytUxJ{< |Y+ddX67v!Jl*`HVfx-iUt%re5~/ Ͽ)5ЯRgo%V#b7}B8LDY!mm&&$y;vPKlNւPKy.F/angular-1.3.9/i18n/angular-locale_zh-hans-sg.js[o@dҤmb-@f\K/Iƭ¨$\ 0mm3h7͒H;sqiB$='=5p>[ARpy9')=>sXI(%A7I?pm{ArQuS8l erT_3;h֖bh81~떸9&xjە>3`O#[XdiQ߶ukXf7ہc{7[HvcxaAw!kVCYkOԲQ()kfK %*F+iFe+?*,7GyT<5}uar,3kif<M)ZuL/$)&)q}_PKrD!PKy.F,angular-1.3.9/i18n/angular-locale_zh-hans.jsVmo@ &mkj56)bx1[Yl{mY`=`H$33ϼ4!R"=6p>[ARp-OPSzz:ѫ2`IEE N+==ǸCeVGB$`54`̊oG^76{),ٞtMb6+)=9φ$ܛֲ͞3F&zd˧l D3]mԬ/Ϲ LOu]YΨ~5eF>,k/C2Mw_TriJX5ta\K{EQFLD%" {j{,@]=2t$j^Ș$tcMccĄ-ζE:9aS6^%m \2}rFqٳZF1]8&J uN+_H%C_4@[Vx5?\\yOc1K>6h71Yx \^ I1Ii쏽mlO3PK2PKy.F/angular-1.3.9/i18n/angular-locale_zh-hant-hk.jso0W4ɶ9|}&C bo.䠘BZ;.}<=} 0b-n 5|| .\" xx7,oiY^HN%;gDnjcZ |? i-!^{!_1 w7ENX86Sd3O2zw:՜u.6nWTeֵM7o&u,H A"uߗg1"¿>Y `,uraMQQڒ3t`꠭upɵ8q=]%Tn)ZSN)jo ݝȌ,Y] _gM;osX)3T[)8Y)Z⸗U/X;J dS4RHG !H*.G:,g8ݥ5$[#!i(~uEG߷<<)jJ[jD?h!)Qr-,AW#*7HM&-EeIBYJWb+鬔4YI3fRa_a Qo5"I/Tq6("7d7/”_Q y q}PK=x>PKy.F,angular-1.3.9/i18n/angular-locale_zh-hant.js[o0UDi(rIPXA%"傜][g;1KTq9>&$)i5 G|CDU4g7<ْ8Xhqt&9 F]va8vwLbӶ #n}㑽+{7֔-B=U ( $q~TC۽7ō}w ,6.7G&_>%3c haDs*<1Vֵx6qh(cnL5[1;1Y`)-ӶܻbbuV(ɕ *UTAK*hv@b`K9l=_GkJ2Lr$-)jn7AWDCkV4( o׺z v3 hT Qa7I_0Y5lb X:./IJ&OZq k0]&wh'ܛl$uHҪUss=y 9"YH`~TTC?ʩV0}T/GD"MxE\YRW οtUwJ ,4)l_c=^6˽?*bKOYΎpN)c&ޮ;UvsPK1O;PKy.F*angular-1.3.9/i18n/angular-locale_zh-hk.jso0W4͒ms8M}ś*9^L~-s> > i5K}|]D>Unx%ѳr2Ls^yFXwS{uִgxf7L"fiuBŹ~W-3mnl0NEĬ=#DO|{g/mt l`װ |H ̩4͆z%>f2zV6״jN͢QneJ똬Od*ndͺRY9v&%W2h@AS ep# 9ȵ.-8sпR2*Lr-)rn7AWҌ֬Qwתz+Ob]G}iA;_pxA(D$qKr(PJS]'Zoj7[Lfy"`x[ͩ%hUP8=.ldcs=x 1!YB`^-% s0: 6 0kz&xE\YB7~BKg%ͩ Ke&)/sz\l~pSqnUmŖPgx-=;S?/PKc98PKy.F*angular-1.3.9/i18n/angular-locale_zh-tw.js[o0V4pM/RTR! rvm,1SE߹8'4 ILOiH==S% 0'-_|G "`|?u5nlgc|$feEq/_}_ٻ9fl[m &p7ȘPh5y~TW,{gk1Yn=phM|KTVSZ>TL\vc5oVIQheq;&kc2cVRYm&%*h@WAKmtTUAO ڐɖjڎ{пJ2Lr$-)jn7AWDCkV4P oe{ 8Z-C4<maO\~(rV%"y!AlKKn8m4uZnU2Fw&c%uo{:&x躆cc63\Ow^iSHR'-Џr0zmj`c"6Z/NSkplƴf[fw`itXb?PAJkhЉި}[&[o-9= 8ϏB bw6-c`Op!xtȖsHTn,s:hm֨z/;W{Z`Cu ЏJT8.+`DVU{Ix/iUtrl2R?Yߔg)6I_JjT͵ߣE{_3+ *Q~ w ,O浠[}PKI0PKy.F*angular-1.3.9/i18n/angular-locale_zu-za.jsU]o0}WXVvt)Ҋ$( XW!Xu]\6MD{:yG(/2:)Λ%#Y-I%.0 agE.TO }B%P7ިe zf^M6),H+wGxE+xw,wABZt]=Eex۬5kKJzƔ B k=xcn6#'`܂$c,C+HyUɸd勁VQNǔ*bRĥBI fEG,=xn5e=@ӊdƒhAcZd)҉F4yaf9 :4K&Ê6%pwt 2|@tKݔK~d&7u>\Xp ΀u:t:T=+k"mmxӁMHi,sUrL)-ѭPHF#j ]6pҜiVHz-5̾3ˊXLZ= vέ~߭nk8 XWlmu}~{B [ahyRy~Q,b 4| @0y4g˽4)ࠜ9Lt#TO>:HGF^? kx}Щ0jS^nv/X"[WQ(FpNhf73t 7@Z"EE˯wm7[s[~jVPK7>PKy.F'angular-1.3.9/i18n/angular-locale_zu.jsUmo0ίJm%FO~J&AIPź 0Ī㰼h@iZ$sw:weNQ^dlR6+DKNZNKNϰߧ)'E.TRL 3ʒd?Zv+rn`7',LsHdXI@un(%٪ӴteNSc۔$WMP/io U.L a*CH2K7To"f +TGooۥ D(EWEyZkn*fe~PKPK y.Fangular-1.3.9/i18n/ngLocale/PKy.Fangular-1.3.9/version.json10 E.CtTu0ą 'J7Tހq KU^ pt JIۜd!,ڨ#.^;X_TpJU ZlLOheypzBv;ֿM?L3J9K !R^A}Z&PKXG7PKy.Fangular-1.3.9/version.txt33ֳPKdhPK y.Fangular-1.3.9/PKy.F4f ,angular-1.3.9/angular-animate.jsPKy.F4$ fangular-1.3.9/angular-animate.min.jsPKy.FA*>( |angular-1.3.9/angular-animate.min.js.mapPKy.Fee- angular-1.3.9/angular-aria.jsPKy.F*N ! angular-1.3.9/angular-aria.min.jsPKy.F4zEE S% angular-1.3.9/angular-aria.min.js.mapPKy.Fn angular-1.3.9/angular-cookies.jsPKy.Fo8$ angular-1.3.9/angular-cookies.min.jsPKy.F^( angular-1.3.9/angular-cookies.min.js.mapPKy.FFQ Xangular-1.3.9/angular-csp.cssPKy.F!6:z7 Wangular-1.3.9/angular-loader.jsPKy.Fc;# angular-1.3.9/angular-loader.min.jsPKy.F-Mg` ' jangular-1.3.9/angular-loader.min.js.mapPKy.F ^<! angular-1.3.9/angular-messages.jsPKy.Fp@% angular-1.3.9/angular-messages.min.jsPKy.F;3,*6) angular-1.3.9/angular-messages.min.js.mapPKy.FM&U$7 J%angular-1.3.9/angular-mocks.jsPKy.FKӣUF%h! zangular-1.3.9/angular-resource.jsPKy.FL" % Qangular-1.3.9/angular-resource.min.jsPKy.F!JB{$) angular-1.3.9/angular-resource.min.js.mapPKy.FL͢+h Wangular-1.3.9/angular-route.jsPKy.Fn" angular-1.3.9/angular-route.min.jsPKy.Fe<,& langular-1.3.9/angular-route.min.js.mapPKy.F>c!]! angular-1.3.9/angular-sanitize.jsPKy.F%ܬr %% $angular-1.3.9/angular-sanitize.min.jsPKy.F(K9*) 91angular-1.3.9/angular-sanitize.min.js.mapPKy.FWrJ! Cangular-1.3.9/angular-scenario.jsPKy.FÉ& `Y Wangular-1.3.9/angular-touch.jsPKy.Fb%;" xangular-1.3.9/angular-touch.min.jsPKy.F[,T '& angular-1.3.9/angular-touch.min.js.mapPKy.FAIbm[} angular-1.3.9/angular.jsPKy.F根- angular-1.3.9/angular.min.jsPKy.F P47vL angular-1.3.9/angular.min.js.mapPK y.F}angular-1.3.9/docs/PKy.F  angular-1.3.9/docs/Error404.htmlPK y.Fangular-1.3.9/docs/components/PK y.F.Bangular-1.3.9/docs/components/bootstrap-3.1.1/PK y.F2angular-1.3.9/docs/components/bootstrap-3.1.1/css/PKy.F4 ^X:E angular-1.3.9/docs/components/bootstrap-3.1.1/css/bootstrap-theme.cssPKy.FHj'I angular-1.3.9/docs/components/bootstrap-3.1.1/css/bootstrap-theme.css.mapPKy.Fo+3I 6angular-1.3.9/docs/components/bootstrap-3.1.1/css/bootstrap-theme.min.cssPKy.F T^? >angular-1.3.9/docs/components/bootstrap-3.1.1/css/bootstrap.cssPKy.FffC angular-1.3.9/docs/components/bootstrap-3.1.1/css/bootstrap.css.mapPKy.FF9TyC 7angular-1.3.9/docs/components/bootstrap-3.1.1/css/bootstrap.min.cssPK y.F4angular-1.3.9/docs/components/bootstrap-3.1.1/fonts/PKy.FqOoOT 3angular-1.3.9/docs/components/bootstrap-3.1.1/fonts/glyphicons-halflings-regular.eotPKy.FL3ANT Gangular-1.3.9/docs/components/bootstrap-3.1.1/fonts/glyphicons-halflings-regular.svgPKy.F`@T angular-1.3.9/docs/components/bootstrap-3.1.1/fonts/glyphicons-halflings-regular.ttfPKy.F\΅Z[U jangular-1.3.9/docs/components/bootstrap-3.1.1/fonts/glyphicons-halflings-regular.woffPK y.F1rRangular-1.3.9/docs/components/bootstrap-3.1.1/js/PKy.F~7= Rangular-1.3.9/docs/components/bootstrap-3.1.1/js/bootstrap.jsPKy.F #qA Ɋangular-1.3.9/docs/components/bootstrap-3.1.1/js/bootstrap.min.jsPK y.F9angular-1.3.9/docs/components/google-code-prettify-1.0.1/PKy.F K iE Langular-1.3.9/docs/components/google-code-prettify-1.0.1/CHANGES.htmlPKy.FuSJ *@ angular-1.3.9/docs/components/google-code-prettify-1.0.1/COPYINGPKy.F[1* L Hangular-1.3.9/docs/components/google-code-prettify-1.0.1/README-zh-Hans.htmlPKy.F8李 %D angular-1.3.9/docs/components/google-code-prettify-1.0.1/README.htmlPKy.F 3{o7B angular-1.3.9/docs/components/google-code-prettify-1.0.1/README.mdPKy.FdklC angular-1.3.9/docs/components/google-code-prettify-1.0.1/bower.jsonPK y.F=angular-1.3.9/docs/components/google-code-prettify-1.0.1/src/PKy.Fe : K Rangular-1.3.9/docs/components/google-code-prettify-1.0.1/src/lang-apollo.jsPKy.F}E H angular-1.3.9/docs/components/google-code-prettify-1.0.1/src/lang-clj.jsPKy.Fo %H angular-1.3.9/docs/components/google-code-prettify-1.0.1/src/lang-css.jsPKy.F~Ar I Zangular-1.3.9/docs/components/google-code-prettify-1.0.1/src/lang-dart.jsPKy.Fݘ, G C angular-1.3.9/docs/components/google-code-prettify-1.0.1/src/lang-go.jsPKy.Fq)G angular-1.3.9/docs/components/google-code-prettify-1.0.1/src/lang-hs.jsPKy.FNm.I Hangular-1.3.9/docs/components/google-code-prettify-1.0.1/src/lang-lisp.jsPKy.FK  H angular-1.3.9/docs/components/google-code-prettify-1.0.1/src/lang-lua.jsPKy.FϡQ G C$angular-1.3.9/docs/components/google-code-prettify-1.0.1/src/lang-ml.jsPKy.F@) F +angular-1.3.9/docs/components/google-code-prettify-1.0.1/src/lang-n.jsPKy.FbJ J }1angular-1.3.9/docs/components/google-code-prettify-1.0.1/src/lang-proto.jsPKy.Fl#1 J 5angular-1.3.9/docs/components/google-code-prettify-1.0.1/src/lang-scala.jsPKy.FŒ*O H :angular-1.3.9/docs/components/google-code-prettify-1.0.1/src/lang-sql.jsPKy.F[cH Bangular-1.3.9/docs/components/google-code-prettify-1.0.1/src/lang-tex.jsPKy.FSt(G fGangular-1.3.9/docs/components/google-code-prettify-1.0.1/src/lang-vb.jsPKy.FYI wOangular-1.3.9/docs/components/google-code-prettify-1.0.1/src/lang-vhdl.jsPKy.FwI Tangular-1.3.9/docs/components/google-code-prettify-1.0.1/src/lang-wiki.jsPKy.FK0B_cG Yangular-1.3.9/docs/components/google-code-prettify-1.0.1/src/lang-xq.jsPKy.F?yɐGI {wangular-1.3.9/docs/components/google-code-prettify-1.0.1/src/lang-yaml.jsPKy.F;2<"I yangular-1.3.9/docs/components/google-code-prettify-1.0.1/src/prettify.cssPKy.FஜUH |angular-1.3.9/docs/components/google-code-prettify-1.0.1/src/prettify.jsPK y.F@angular-1.3.9/docs/components/google-code-prettify-1.0.1/styles/PKy.FǽnAI angular-1.3.9/docs/components/google-code-prettify-1.0.1/styles/demo.htmlPKy.F oJ 0angular-1.3.9/docs/components/google-code-prettify-1.0.1/styles/desert.cssPKy.F0 J Hangular-1.3.9/docs/components/google-code-prettify-1.0.1/styles/index.htmlPKy.F;f<T nangular-1.3.9/docs/components/google-code-prettify-1.0.1/styles/sons-of-obsidian.cssPKy.Fs9L ,angular-1.3.9/docs/components/google-code-prettify-1.0.1/styles/sunburst.cssPK y.F+angular-1.3.9/docs/components/jquery-2.1.1/PKy.FOjrg\74 angular-1.3.9/docs/components/jquery-2.1.1/jquery.jsPKy.F#uoY8I8 Cangular-1.3.9/docs/components/jquery-2.1.1/jquery.min.jsPK y.F,angular-1.3.9/docs/components/lunr.js-0.4.2/PKy.F243 angular-1.3.9/docs/components/lunr.js-0.4.2/lunr.jsPKy.F^; 77 Zangular-1.3.9/docs/components/lunr.js-0.4.2/lunr.min.jsPKy.F.GS95 angular-1.3.9/docs/components/lunr.js-0.4.2/server.jsPK y.F+{angular-1.3.9/docs/components/marked-0.3.2/PKy.F;N̻,*3 angular-1.3.9/docs/components/marked-0.3.2/index.jsPK y.F/Qangular-1.3.9/docs/components/marked-0.3.2/lib/PKy.F3N @m8 angular-1.3.9/docs/components/marked-0.3.2/lib/marked.jsPK y.F77angular-1.3.9/docs/components/open-sans-fontface-1.0.4/PKy.F@h@ 7angular-1.3.9/docs/components/open-sans-fontface-1.0.4/README.mdPKy.FA ,9angular-1.3.9/docs/components/open-sans-fontface-1.0.4/bower.jsonPK y.F=:angular-1.3.9/docs/components/open-sans-fontface-1.0.4/fonts/PK y.FB;angular-1.3.9/docs/components/open-sans-fontface-1.0.4/fonts/Bold/PKy.F%W_ S s;angular-1.3.9/docs/components/open-sans-fontface-1.0.4/fonts/Bold/OpenSans-Bold.eotPKy.FLV3 o S Hangular-1.3.9/docs/components/open-sans-fontface-1.0.4/fonts/Bold/OpenSans-Bold.svgPKy.F+X hS XTangular-1.3.9/docs/components/open-sans-fontface-1.0.4/fonts/Bold/OpenSans-Bold.ttfPKy.F IkLT 1aangular-1.3.9/docs/components/open-sans-fontface-1.0.4/fonts/Bold/OpenSans-Bold.woffPK y.FHYangular-1.3.9/docs/components/open-sans-fontface-1.0.4/fonts/BoldItalic/PKy.FۺXm62_ Yangular-1.3.9/docs/components/open-sans-fontface-1.0.4/fonts/BoldItalic/OpenSans-BoldItalic.eotPKy.F. ]! q_ ~angular-1.3.9/docs/components/open-sans-fontface-1.0.4/fonts/BoldItalic/OpenSans-BoldItalic.svgPKy.F-}6d_ angular-1.3.9/docs/components/open-sans-fontface-1.0.4/fonts/BoldItalic/OpenSans-BoldItalic.ttfPKy.Fέ` /angular-1.3.9/docs/components/open-sans-fontface-1.0.4/fonts/BoldItalic/OpenSans-BoldItalic.woffPK y.FG angular-1.3.9/docs/components/open-sans-fontface-1.0.4/fonts/ExtraBold/PKy.FD?A]  angular-1.3.9/docs/components/open-sans-fontface-1.0.4/fonts/ExtraBold/OpenSans-ExtraBold.eotPKy.FpY:$ $] r!angular-1.3.9/docs/components/open-sans-fontface-1.0.4/fonts/ExtraBold/OpenSans-ExtraBold.svgPKy.F.ƌL] !"angular-1.3.9/docs/components/open-sans-fontface-1.0.4/fonts/ExtraBold/OpenSans-ExtraBold.ttfPKy.Fڕ\,^ D$#angular-1.3.9/docs/components/open-sans-fontface-1.0.4/fonts/ExtraBold/OpenSans-ExtraBold.woffPK y.FM,$angular-1.3.9/docs/components/open-sans-fontface-1.0.4/fonts/ExtraBoldItalic/PKy.F~~ v.~i $angular-1.3.9/docs/components/open-sans-fontface-1.0.4/fonts/ExtraBoldItalic/OpenSans-ExtraBoldItalic.eotPKy.FJQ#mi G%angular-1.3.9/docs/components/open-sans-fontface-1.0.4/fonts/ExtraBoldItalic/OpenSans-ExtraBoldItalic.svgPKy.F92˗ .i l&angular-1.3.9/docs/components/open-sans-fontface-1.0.4/fonts/ExtraBoldItalic/OpenSans-ExtraBoldItalic.ttfPKy.Fi(j 'angular-1.3.9/docs/components/open-sans-fontface-1.0.4/fonts/ExtraBoldItalic/OpenSans-ExtraBoldItalic.woffPK y.FD(angular-1.3.9/docs/components/open-sans-fontface-1.0.4/fonts/Italic/PKy.FJ&cA W (angular-1.3.9/docs/components/open-sans-fontface-1.0.4/fonts/Italic/OpenSans-Italic.eotPKy.FdQ/W )angular-1.3.9/docs/components/open-sans-fontface-1.0.4/fonts/Italic/OpenSans-Italic.svgPKy.FGCPAPW %+angular-1.3.9/docs/components/open-sans-fontface-1.0.4/fonts/Italic/OpenSans-Italic.ttfPKy.FKp(H)X f,angular-1.3.9/docs/components/open-sans-fontface-1.0.4/fonts/Italic/OpenSans-Italic.woffPK y.FC-angular-1.3.9/docs/components/open-sans-fontface-1.0.4/fonts/Light/PKy.FzU -angular-1.3.9/docs/components/open-sans-fontface-1.0.4/fonts/Light/OpenSans-Light.eotPKy.Fangular-1.3.9/docs/components/open-sans-fontface-1.0.4/fonts/SemiboldItalic/PKy.F9\?bg >angular-1.3.9/docs/components/open-sans-fontface-1.0.4/fonts/SemiboldItalic/OpenSans-SemiboldItalic.eotPKy.FBz1΅g @angular-1.3.9/docs/components/open-sans-fontface-1.0.4/fonts/SemiboldItalic/OpenSans-SemiboldItalic.svgPKy.FW,`?g /:Aangular-1.3.9/docs/components/open-sans-fontface-1.0.4/fonts/SemiboldItalic/OpenSans-SemiboldItalic.ttfPKy.FJ&d'h yBangular-1.3.9/docs/components/open-sans-fontface-1.0.4/fonts/SemiboldItalic/OpenSans-SemiboldItalic.woffPKy.FDZ A Cangular-1.3.9/docs/components/open-sans-fontface-1.0.4/index.htmlPKy.FoD Cangular-1.3.9/docs/components/open-sans-fontface-1.0.4/open-sans.cssPKy.FY ~E Cangular-1.3.9/docs/components/open-sans-fontface-1.0.4/open-sans.lessPKy.FE#ۗE Cangular-1.3.9/docs/components/open-sans-fontface-1.0.4/open-sans.scssPK y.FCangular-1.3.9/docs/css/PKy.F% 5Cangular-1.3.9/docs/css/animations.cssPKy.Feф & Cangular-1.3.9/docs/css/doc_widgets.cssPKy.Fu - bCangular-1.3.9/docs/css/docs.cssPKy.F;qA) Cangular-1.3.9/docs/css/prettify-theme.cssPKy.F|Rx7# YCangular-1.3.9/docs/css/prettify.cssPK y.F"Cangular-1.3.9/docs/examples/PK y.F,\Cangular-1.3.9/docs/examples/example-$filter/PKy.Fif< Cangular-1.3.9/docs/examples/example-$filter/index-debug.htmlPKy.Fa|= Cangular-1.3.9/docs/examples/example-$filter/index-jquery.htmlPKy.F%A HCangular-1.3.9/docs/examples/example-$filter/index-production.htmlPKy.Fd6 Cangular-1.3.9/docs/examples/example-$filter/index.htmlPKy.F哋T^9 Cangular-1.3.9/docs/examples/example-$filter/manifest.jsonPKy.Fʣ5 Cangular-1.3.9/docs/examples/example-$filter/script.jsPK y.F3Cangular-1.3.9/docs/examples/example-$route-service/PKy.F53;< Cangular-1.3.9/docs/examples/example-$route-service/book.htmlPKy.F6`A\? Cangular-1.3.9/docs/examples/example-$route-service/chapter.htmlPKy.FIYC LCangular-1.3.9/docs/examples/example-$route-service/index-debug.htmlPKy.F]D Cangular-1.3.9/docs/examples/example-$route-service/index-jquery.htmlPKy.FH Cangular-1.3.9/docs/examples/example-$route-service/index-production.htmlPKy.FW= Cangular-1.3.9/docs/examples/example-$route-service/index.htmlPKy.F}!s@ Cangular-1.3.9/docs/examples/example-$route-service/manifest.jsonPKy.F@ @ Cangular-1.3.9/docs/examples/example-$route-service/protractor.jsPKy.F0Eo< Cangular-1.3.9/docs/examples/example-$route-service/script.jsPK y.F6FCangular-1.3.9/docs/examples/example-NgModelController/PKy.F,wnXF Cangular-1.3.9/docs/examples/example-NgModelController/index-debug.htmlPKy.FY)qG fCangular-1.3.9/docs/examples/example-NgModelController/index-jquery.htmlPKy.FrNC~K LCangular-1.3.9/docs/examples/example-NgModelController/index-production.htmlPKy.F68sW@ CCangular-1.3.9/docs/examples/example-NgModelController/index.htmlPKy.F ?pC Cangular-1.3.9/docs/examples/example-NgModelController/manifest.jsonPKy.FYZCvC Cangular-1.3.9/docs/examples/example-NgModelController/protractor.jsPKy.FWoF? Cangular-1.3.9/docs/examples/example-NgModelController/script.jsPKy.Fj? PCangular-1.3.9/docs/examples/example-NgModelController/style.cssPK y.F='Cangular-1.3.9/docs/examples/example-checkbox-input-directive/PKy.Fk3M Cangular-1.3.9/docs/examples/example-checkbox-input-directive/index-debug.htmlPKy.F;e0N ~Cangular-1.3.9/docs/examples/example-checkbox-input-directive/index-jquery.htmlPKy.FơR Cangular-1.3.9/docs/examples/example-checkbox-input-directive/index-production.htmlPKy.FV~G Cangular-1.3.9/docs/examples/example-checkbox-input-directive/index.htmlPKy.F&bsJ Cangular-1.3.9/docs/examples/example-checkbox-input-directive/manifest.jsonPKy.F _J Cangular-1.3.9/docs/examples/example-checkbox-input-directive/protractor.jsPK y.F9Cangular-1.3.9/docs/examples/example-date-input-directive/PKy.Fu5I Cangular-1.3.9/docs/examples/example-date-input-directive/index-debug.htmlPKy.FːY,J Cangular-1.3.9/docs/examples/example-date-input-directive/index-jquery.htmlPKy.F{\٪2N ,Cangular-1.3.9/docs/examples/example-date-input-directive/index-production.htmlPKy.Fܐ;C Cangular-1.3.9/docs/examples/example-date-input-directive/index.htmlPKy.F$_m_oF \Cangular-1.3.9/docs/examples/example-date-input-directive/manifest.jsonPKy.F(F /Cangular-1.3.9/docs/examples/example-date-input-directive/protractor.jsPK y.FBDangular-1.3.9/docs/examples/example-datetimelocal-input-directive/PKy.F.<R +Dangular-1.3.9/docs/examples/example-datetimelocal-input-directive/index-debug.htmlPKy.FE1sSS Dangular-1.3.9/docs/examples/example-datetimelocal-input-directive/index-jquery.htmlPKy.FZW Dangular-1.3.9/docs/examples/example-datetimelocal-input-directive/index-production.htmlPKy.F`" 9L Dangular-1.3.9/docs/examples/example-datetimelocal-input-directive/index.htmlPKy.F/IfxO M Dangular-1.3.9/docs/examples/example-datetimelocal-input-directive/manifest.jsonPKy.FHj:O 0Dangular-1.3.9/docs/examples/example-datetimelocal-input-directive/protractor.jsPK y.F:Dangular-1.3.9/docs/examples/example-email-input-directive/PKy.F6g4J ?Dangular-1.3.9/docs/examples/example-email-input-directive/index-debug.htmlPKy.F?wK ~Dangular-1.3.9/docs/examples/example-email-input-directive/index-jquery.htmlPKy.FWdO Dangular-1.3.9/docs/examples/example-email-input-directive/index-production.htmlPKy.Fe92D 8Dangular-1.3.9/docs/examples/example-email-input-directive/index.htmlPKy.FD_pG nDangular-1.3.9/docs/examples/example-email-input-directive/manifest.jsonPKy.F:*`G BDangular-1.3.9/docs/examples/example-email-input-directive/protractor.jsPK y.F<Dangular-1.3.9/docs/examples/example-error-$rootScope-inprog/PKy.FXȭB Dangular-1.3.9/docs/examples/example-error-$rootScope-inprog/app.jsPKy.FM~L &Dangular-1.3.9/docs/examples/example-error-$rootScope-inprog/index-debug.htmlPKy.F)èM Dangular-1.3.9/docs/examples/example-error-$rootScope-inprog/index-jquery.htmlPKy.F2S Q !Dangular-1.3.9/docs/examples/example-error-$rootScope-inprog/index-production.htmlPKy.F+|F "Dangular-1.3.9/docs/examples/example-error-$rootScope-inprog/index.htmlPKy.FY^kI #Dangular-1.3.9/docs/examples/example-error-$rootScope-inprog/manifest.jsonPK y.F,$Dangular-1.3.9/docs/examples/example-example/PK y.F0%Dangular-1.3.9/docs/examples/example-example.csp/PKy.Fogl*X@ U%Dangular-1.3.9/docs/examples/example-example.csp/index-debug.htmlPKy.FW>A &Dangular-1.3.9/docs/examples/example-example.csp/index-jquery.htmlPKy.F\T JE (Dangular-1.3.9/docs/examples/example-example.csp/index-production.htmlPKy.FL(V: W*Dangular-1.3.9/docs/examples/example-example.csp/index.htmlPKy.Fkk_w= +Dangular-1.3.9/docs/examples/example-example.csp/manifest.jsonPKy.F^귓hY= ,Dangular-1.3.9/docs/examples/example-example.csp/protractor.jsPKy.FD9 0Dangular-1.3.9/docs/examples/example-example.csp/script.jsPKy.Fڶӄ< 1Dangular-1.3.9/docs/examples/example-example/index-debug.htmlPKy.Ft1T= 3Dangular-1.3.9/docs/examples/example-example/index-jquery.htmlPKy.FI•^ A 4Dangular-1.3.9/docs/examples/example-example/index-production.htmlPKy.Fsl6 5Dangular-1.3.9/docs/examples/example-example/index.htmlPKy.F6 O^9 K7Dangular-1.3.9/docs/examples/example-example/manifest.jsonPKy.F(`b#5 8Dangular-1.3.9/docs/examples/example-example/script.jsPK y.F- 9Dangular-1.3.9/docs/examples/example-example1/PKy.F4 )V= X9Dangular-1.3.9/docs/examples/example-example1/index-debug.htmlPKy.FX> =Dangular-1.3.9/docs/examples/example-example1/index-jquery.htmlPKy.FzkB ADangular-1.3.9/docs/examples/example-example1/index-production.htmlPKy.F^YET7 !FDangular-1.3.9/docs/examples/example-example1/index.htmlPKy.FG^CN: FJDangular-1.3.9/docs/examples/example-example1/manifest.jsonPK y.F.JDangular-1.3.9/docs/examples/example-example10/PKy.F7P> =KDangular-1.3.9/docs/examples/example-example10/index-debug.htmlPKy.F|? uLDangular-1.3.9/docs/examples/example-example10/index-jquery.htmlPKy.FjvC MDangular-1.3.9/docs/examples/example-example10/index-production.htmlPKy.FށvjN8 ODangular-1.3.9/docs/examples/example-example10/index.htmlPKy.F2jQ`; QPDangular-1.3.9/docs/examples/example-example10/manifest.jsonPKy.F8?R7 QDangular-1.3.9/docs/examples/example-example10/script.jsPK y.F/PRDangular-1.3.9/docs/examples/example-example100/PKy.F7' ? RDangular-1.3.9/docs/examples/example-example100/index-debug.htmlPKy.F<@L@ 1TDangular-1.3.9/docs/examples/example-example100/index-jquery.htmlPKy.FVG9D UDangular-1.3.9/docs/examples/example-example100/index-production.htmlPKy.F/YA%9 WDangular-1.3.9/docs/examples/example-example100/index.htmlPKy.FZUe< $YDangular-1.3.9/docs/examples/example-example100/manifest.jsonPKy.Fsuh< YDangular-1.3.9/docs/examples/example-example100/protractor.jsPK y.F/S[Dangular-1.3.9/docs/examples/example-example101/PKy.F mU? [Dangular-1.3.9/docs/examples/example-example101/index-debug.htmlPKy.FȧF@ \Dangular-1.3.9/docs/examples/example-example101/index-jquery.htmlPKy.FT D E^Dangular-1.3.9/docs/examples/example-example101/index-production.htmlPKy.F[S9 _Dangular-1.3.9/docs/examples/example-example101/index.htmlPKy.F>Ue< `Dangular-1.3.9/docs/examples/example-example101/manifest.jsonPKy.Fit< aDangular-1.3.9/docs/examples/example-example101/protractor.jsPK y.F/bDangular-1.3.9/docs/examples/example-example102/PKy.FZ? bDangular-1.3.9/docs/examples/example-example102/index-debug.htmlPKy.F S.\@ eDangular-1.3.9/docs/examples/example-example102/index-jquery.htmlPKy.F fID igDangular-1.3.9/docs/examples/example-example102/index-production.htmlPKy.FPm}9 iDangular-1.3.9/docs/examples/example-example102/index.htmlPKy.FًUe< kDangular-1.3.9/docs/examples/example-example102/manifest.jsonPKy.FJ7P< lDangular-1.3.9/docs/examples/example-example102/protractor.jsPK y.F/YoDangular-1.3.9/docs/examples/example-example103/PKy.F[d? oDangular-1.3.9/docs/examples/example-example103/index-debug.htmlPKy.Fh9}@ wrDangular-1.3.9/docs/examples/example-example103/index-jquery.htmlPKy.F3D buDangular-1.3.9/docs/examples/example-example103/index-production.htmlPKy.FE.b9 WxDangular-1.3.9/docs/examples/example-example103/index.htmlPKy.F%JFP< {Dangular-1.3.9/docs/examples/example-example103/manifest.jsonPK y.F/{Dangular-1.3.9/docs/examples/example-example104/PKy.F-v{<? |Dangular-1.3.9/docs/examples/example-example104/index-debug.htmlPKy.FU@ ~Dangular-1.3.9/docs/examples/example-example104/index-jquery.htmlPKy.FclD Dangular-1.3.9/docs/examples/example-example104/index-production.htmlPKy.F[By:9 Dangular-1.3.9/docs/examples/example-example104/index.htmlPKy.Fa3Sa< Dangular-1.3.9/docs/examples/example-example104/manifest.jsonPKy.F:8 Dangular-1.3.9/docs/examples/example-example104/script.jsPK y.F/NDangular-1.3.9/docs/examples/example-example105/PKy.F, > Dangular-1.3.9/docs/examples/example-example105/http-hello.htmlPKy.F(? Dangular-1.3.9/docs/examples/example-example105/index-debug.htmlPKy.FW@ Dangular-1.3.9/docs/examples/example-example105/index-jquery.htmlPKy.Fm!DD Dangular-1.3.9/docs/examples/example-example105/index-production.htmlPKy.FIE{9 Dangular-1.3.9/docs/examples/example-example105/index.htmlPKy.F|Dangular-1.3.9/docs/examples/example-example108/index-production.htmlPKy.FN 9 mDangular-1.3.9/docs/examples/example-example108/index.htmlPKy.FyxFP< oDangular-1.3.9/docs/examples/example-example108/manifest.jsonPK y.F/Dangular-1.3.9/docs/examples/example-example109/PKy.FCASF? lDangular-1.3.9/docs/examples/example-example109/index-debug.htmlPKy.FAV]@ Dangular-1.3.9/docs/examples/example-example109/index-jquery.htmlPKy.FoiD Dangular-1.3.9/docs/examples/example-example109/index-production.htmlPKy.F[UNgE9 Dangular-1.3.9/docs/examples/example-example109/index.htmlPKy.F{mSa< qDangular-1.3.9/docs/examples/example-example109/manifest.jsonPKy.Fgb8 .Dangular-1.3.9/docs/examples/example-example109/script.jsPK y.F.4Dangular-1.3.9/docs/examples/example-example11/PKy.F Dangular-1.3.9/docs/examples/example-example11/index-debug.htmlPKy.Fhn? Dangular-1.3.9/docs/examples/example-example11/index-jquery.htmlPKy.F}68C Dangular-1.3.9/docs/examples/example-example11/index-production.htmlPKy.FhS8 jDangular-1.3.9/docs/examples/example-example11/index.htmlPKy.F2s_x; Dangular-1.3.9/docs/examples/example-example11/manifest.jsonPKy.F~&5> eDangular-1.3.9/docs/examples/example-example11/my-customer.htmlPKy.FnFf7 Dangular-1.3.9/docs/examples/example-example11/script.jsPK y.F/6Dangular-1.3.9/docs/examples/example-example110/PKy.Fp]:? Dangular-1.3.9/docs/examples/example-example110/index-debug.htmlPKy.Fv*@ Dangular-1.3.9/docs/examples/example-example110/index-jquery.htmlPKy.F D Dangular-1.3.9/docs/examples/example-example110/index-production.htmlPKy.Ff9 aDangular-1.3.9/docs/examples/example-example110/index.htmlPKy.FOi< Dangular-1.3.9/docs/examples/example-example110/manifest.jsonPKy.Fp}< bDangular-1.3.9/docs/examples/example-example110/protractor.jsPKy.F^[IRQ8 Dangular-1.3.9/docs/examples/example-example110/script.jsPKy.F 0= Dangular-1.3.9/docs/examples/example-example110/test_data.jsonPK y.F/Dangular-1.3.9/docs/examples/example-example111/PKy.F>E5e? Dangular-1.3.9/docs/examples/example-example111/index-debug.htmlPKy.FB}@ Dangular-1.3.9/docs/examples/example-example111/index-jquery.htmlPKy.F"~ʆD Dangular-1.3.9/docs/examples/example-example111/index-production.htmlPKy.F㫋c9 Dangular-1.3.9/docs/examples/example-example111/index.htmlPKy.FUe< ~Dangular-1.3.9/docs/examples/example-example111/manifest.jsonPKy.FDsN< =Dangular-1.3.9/docs/examples/example-example111/protractor.jsPK y.F/DDangular-1.3.9/docs/examples/example-example112/PKy.Fem? Dangular-1.3.9/docs/examples/example-example112/index-debug.htmlPKy.FBuQ@ kDangular-1.3.9/docs/examples/example-example112/index-jquery.htmlPKy.FJeD ]Dangular-1.3.9/docs/examples/example-example112/index-production.htmlPKy.FԀk 9 ^Dangular-1.3.9/docs/examples/example-example112/index.htmlPKy.F%Ue< 0Dangular-1.3.9/docs/examples/example-example112/manifest.jsonPKy.F.Ŕ< Dangular-1.3.9/docs/examples/example-example112/protractor.jsPK y.F/.Dangular-1.3.9/docs/examples/example-example113/PKy.Fo8? {Dangular-1.3.9/docs/examples/example-example113/index-debug.htmlPKy.F?+@ Dangular-1.3.9/docs/examples/example-example113/index-jquery.htmlPKy.Fkם?D Dangular-1.3.9/docs/examples/example-example113/index-production.htmlPKy.FnBv9 gEangular-1.3.9/docs/examples/example-example113/index.htmlPKy.FlUe< Eangular-1.3.9/docs/examples/example-example113/manifest.jsonPKy.Fl< XEangular-1.3.9/docs/examples/example-example113/protractor.jsPK y.F/Eangular-1.3.9/docs/examples/example-example114/PKy.F? Eangular-1.3.9/docs/examples/example-example114/index-debug.htmlPKy.Fg l@ Eangular-1.3.9/docs/examples/example-example114/index-jquery.htmlPKy.FbD Eangular-1.3.9/docs/examples/example-example114/index-production.htmlPKy.FnJ,9  Eangular-1.3.9/docs/examples/example-example114/index.htmlPKy.FCSa< Q Eangular-1.3.9/docs/examples/example-example114/manifest.jsonPKy.F5f]g8 Eangular-1.3.9/docs/examples/example-example114/script.jsPK y.F/Eangular-1.3.9/docs/examples/example-example115/PKy.F<'{4[? Eangular-1.3.9/docs/examples/example-example115/index-debug.htmlPKy.F!K@ Eangular-1.3.9/docs/examples/example-example115/index-jquery.htmlPKy.FTD xEangular-1.3.9/docs/examples/example-example115/index-production.htmlPKy.Fc2Y9 >Eangular-1.3.9/docs/examples/example-example115/index.htmlPKy.FOSa< Eangular-1.3.9/docs/examples/example-example115/manifest.jsonPKy.Fd+ak8 Eangular-1.3.9/docs/examples/example-example115/script.jsPK y.F/[Eangular-1.3.9/docs/examples/example-example116/PKy.Fw4\? Eangular-1.3.9/docs/examples/example-example116/index-debug.htmlPKy.FuK@ IEangular-1.3.9/docs/examples/example-example116/index-jquery.htmlPKy.FդUD Eangular-1.3.9/docs/examples/example-example116/index-production.htmlPKy.F3Z9 Eangular-1.3.9/docs/examples/example-example116/index.htmlPKy.Fe^NSa< cEangular-1.3.9/docs/examples/example-example116/manifest.jsonPKy.Fw}%bl8 Eangular-1.3.9/docs/examples/example-example116/script.jsPK y.F.Eangular-1.3.9/docs/examples/example-example12/PKy.F%C 4 Eangular-1.3.9/docs/examples/example-example12/customer-address.htmlPKy.Fq y@ Eangular-1.3.9/docs/examples/example-example12/customer-name.htmlPKy.Fҳt> F!Eangular-1.3.9/docs/examples/example-example12/index-debug.htmlPKy.FH? "Eangular-1.3.9/docs/examples/example-example12/index-jquery.htmlPKy.FC #Eangular-1.3.9/docs/examples/example-example12/index-production.htmlPKy.FN8 o%Eangular-1.3.9/docs/examples/example-example12/index.htmlPKy.Fj; &Eangular-1.3.9/docs/examples/example-example12/manifest.jsonPKy.F g7 'Eangular-1.3.9/docs/examples/example-example12/script.jsPK y.F.(Eangular-1.3.9/docs/examples/example-example13/PKy.FV> /)Eangular-1.3.9/docs/examples/example-example13/index-debug.htmlPKy.F|? k*Eangular-1.3.9/docs/examples/example-example13/index-jquery.htmlPKy.FC +Eangular-1.3.9/docs/examples/example-example13/index-production.htmlPKy.FKyT8 -Eangular-1.3.9/docs/examples/example-example13/index.htmlPKy.F2(_x; R.Eangular-1.3.9/docs/examples/example-example13/manifest.jsonPKy.F~&5> /Eangular-1.3.9/docs/examples/example-example13/my-customer.htmlPKy.F/z,x7 /Eangular-1.3.9/docs/examples/example-example13/script.jsPK y.F.0Eangular-1.3.9/docs/examples/example-example14/PKy.Fܟѡ> @1Eangular-1.3.9/docs/examples/example-example14/index-debug.htmlPKy.F? 2Eangular-1.3.9/docs/examples/example-example14/index-jquery.htmlPKy.F;AC 3Eangular-1.3.9/docs/examples/example-example14/index-production.htmlPKy.F;8 e5Eangular-1.3.9/docs/examples/example-example14/index.htmlPKy.F*_x; 6Eangular-1.3.9/docs/examples/example-example14/manifest.jsonPKy.F~&5> t7Eangular-1.3.9/docs/examples/example-example14/my-customer.htmlPKy.Fwl 7 8Eangular-1.3.9/docs/examples/example-example14/script.jsPK y.F.t9Eangular-1.3.9/docs/examples/example-example15/PKy.F> 9Eangular-1.3.9/docs/examples/example-example15/index-debug.htmlPKy.F[? ;Eangular-1.3.9/docs/examples/example-example15/index-jquery.htmlPKy.F9C }.wGc|; @?Eangular-1.3.9/docs/examples/example-example15/manifest.jsonPKy.FQ*=B @Eangular-1.3.9/docs/examples/example-example15/my-customer-iso.htmlPKy.FV nBEangular-1.3.9/docs/examples/example-example16/index-debug.htmlPKy.F?u? CEangular-1.3.9/docs/examples/example-example16/index-jquery.htmlPKy.F'C EEangular-1.3.9/docs/examples/example-example16/index-production.htmlPKy.Fy`8 kFEangular-1.3.9/docs/examples/example-example16/index.htmlPKy.FTFDj; GEangular-1.3.9/docs/examples/example-example16/manifest.jsonPKy.FQ?rI wHEangular-1.3.9/docs/examples/example-example16/my-customer-plus-vojta.htmlPKy.Fq#7 -IEangular-1.3.9/docs/examples/example-example16/script.jsPK y.F.JEangular-1.3.9/docs/examples/example-example17/PKy.Fb)f> KEangular-1.3.9/docs/examples/example-example17/index-debug.htmlPKy.F ? cLEangular-1.3.9/docs/examples/example-example17/index-jquery.htmlPKy.Fo|/C MEangular-1.3.9/docs/examples/example-example17/index-production.htmlPKy.FD8 cOEangular-1.3.9/docs/examples/example-example17/index.htmlPKy.F~Q`; PEangular-1.3.9/docs/examples/example-example17/manifest.jsonPKy.FB5y7 wQEangular-1.3.9/docs/examples/example-example17/script.jsPK y.F.~SEangular-1.3.9/docs/examples/example-example18/PKy.Fê#w> SEangular-1.3.9/docs/examples/example-example18/index-debug.htmlPKy.FO?? UEangular-1.3.9/docs/examples/example-example18/index-jquery.htmlPKy.F֐ C VEangular-1.3.9/docs/examples/example-example18/index-production.htmlPKy.Fl u8 XEangular-1.3.9/docs/examples/example-example18/index.htmlPKy.FxI]v; UYEangular-1.3.9/docs/examples/example-example18/manifest.jsonPKy.F-zOY)(< ZEangular-1.3.9/docs/examples/example-example18/my-dialog.htmlPKy.FU7 ZEangular-1.3.9/docs/examples/example-example18/script.jsPK y.F.[Eangular-1.3.9/docs/examples/example-example19/PKy.FHqu> 2\Eangular-1.3.9/docs/examples/example-example19/index-debug.htmlPKy.F? ]Eangular-1.3.9/docs/examples/example-example19/index-jquery.htmlPKy.FCqC ^Eangular-1.3.9/docs/examples/example-example19/index-production.htmlPKy.Fss8 c`Eangular-1.3.9/docs/examples/example-example19/index.htmlPKy.F?-]v; aEangular-1.3.9/docs/examples/example-example19/manifest.jsonPKy.F-zOY)(< tbEangular-1.3.9/docs/examples/example-example19/my-dialog.htmlPKy.FC7>7 cEangular-1.3.9/docs/examples/example-example19/script.jsPK y.F-hdEangular-1.3.9/docs/examples/example-example2/PKy.FD;= dEangular-1.3.9/docs/examples/example-example2/index-debug.htmlPKy.F  > "iEangular-1.3.9/docs/examples/example-example2/index-jquery.htmlPKy.F;Lm(% B mEangular-1.3.9/docs/examples/example-example2/index-production.htmlPKy.F 7 ArEangular-1.3.9/docs/examples/example-example2/index.htmlPKy.F\8e CN: vEangular-1.3.9/docs/examples/example-example2/manifest.jsonPK y.F.TwEangular-1.3.9/docs/examples/example-example20/PKy.FI> wEangular-1.3.9/docs/examples/example-example20/index-debug.htmlPKy.Fen;? yEangular-1.3.9/docs/examples/example-example20/index-jquery.htmlPKy.F%$C zEangular-1.3.9/docs/examples/example-example20/index-production.htmlPKy.F#|7Y8 .|Eangular-1.3.9/docs/examples/example-example20/index.htmlPKy.F(6%c|; }Eangular-1.3.9/docs/examples/example-example20/manifest.jsonPKy.FZmB d~Eangular-1.3.9/docs/examples/example-example20/my-dialog-close.htmlPKy.F$1E7 .Eangular-1.3.9/docs/examples/example-example20/script.jsPK y.F.ĀEangular-1.3.9/docs/examples/example-example21/PKy.F,'> Eangular-1.3.9/docs/examples/example-example21/index-debug.htmlPKy.FHXgj? 7Eangular-1.3.9/docs/examples/example-example21/index-jquery.htmlPKy.Fj^OWC vEangular-1.3.9/docs/examples/example-example21/index-production.htmlPKy.FQd%8 „Eangular-1.3.9/docs/examples/example-example21/index.htmlPKy.F~HQ`; Eangular-1.3.9/docs/examples/example-example21/manifest.jsonPKy.Fev7 Eangular-1.3.9/docs/examples/example-example21/script.jsPK y.F.Eangular-1.3.9/docs/examples/example-example22/PKy.F?3> Eangular-1.3.9/docs/examples/example-example22/index-debug.htmlPKy.F\iUv? Eangular-1.3.9/docs/examples/example-example22/index-jquery.htmlPKy.F?\cC tEangular-1.3.9/docs/examples/example-example22/index-production.htmlPKy.Ft?=18 AEangular-1.3.9/docs/examples/example-example22/index.htmlPKy.F6zc; Eangular-1.3.9/docs/examples/example-example22/manifest.jsonPKy.F)j<>: Eangular-1.3.9/docs/examples/example-example22/my-pane.htmlPKy.Fm: TEangular-1.3.9/docs/examples/example-example22/my-tabs.htmlPKy.FW7 ZEangular-1.3.9/docs/examples/example-example22/script.jsPK y.F.JEangular-1.3.9/docs/examples/example-example23/PKy.FOj> Eangular-1.3.9/docs/examples/example-example23/index-debug.htmlPKy.FF7? Eangular-1.3.9/docs/examples/example-example23/index-jquery.htmlPKy.FY^$C ܖEangular-1.3.9/docs/examples/example-example23/index-production.htmlPKy.Fy8 Eangular-1.3.9/docs/examples/example-example23/index.htmlPKy.F? Td; 'Eangular-1.3.9/docs/examples/example-example23/manifest.jsonPKy.FYo~; Eangular-1.3.9/docs/examples/example-example23/protractor.jsPK y.F.Eangular-1.3.9/docs/examples/example-example24/PKy.FA|> Eangular-1.3.9/docs/examples/example-example24/index-debug.htmlPKy.F? Eangular-1.3.9/docs/examples/example-example24/index-jquery.htmlPKy.F$p\C Eangular-1.3.9/docs/examples/example-example24/index-production.htmlPKy.Fz8 Eangular-1.3.9/docs/examples/example-example24/index.htmlPKy.FH5]u; ۢEangular-1.3.9/docs/examples/example-example24/manifest.jsonPKy.Fgź'; Eangular-1.3.9/docs/examples/example-example24/protractor.jsPKy.Fe7 ΤEangular-1.3.9/docs/examples/example-example24/script.jsPK y.F.Eangular-1.3.9/docs/examples/example-example25/PKy.F6`"> NEangular-1.3.9/docs/examples/example-example25/index-debug.htmlPKy.Fr94? ܧEangular-1.3.9/docs/examples/example-example25/index-jquery.htmlPKy.F~A!C Eangular-1.3.9/docs/examples/example-example25/index-production.htmlPKy.Fg 8 4Eangular-1.3.9/docs/examples/example-example25/index.htmlPKy.FQ]u; Eangular-1.3.9/docs/examples/example-example25/manifest.jsonPKy.FS; Eangular-1.3.9/docs/examples/example-example25/protractor.jsPKy.F,7 ѮEangular-1.3.9/docs/examples/example-example25/script.jsPK y.F.Eangular-1.3.9/docs/examples/example-example26/PKy.F[> 6Eangular-1.3.9/docs/examples/example-example26/index-debug.htmlPKy.F-a-&-? Eangular-1.3.9/docs/examples/example-example26/index-jquery.htmlPKy.F0,C CEangular-1.3.9/docs/examples/example-example26/index-production.htmlPKy.Fu 8 Eangular-1.3.9/docs/examples/example-example26/index.htmlPKy.F\Q`; REangular-1.3.9/docs/examples/example-example26/manifest.jsonPKy.Foc7 Eangular-1.3.9/docs/examples/example-example26/script.jsPK y.F.ԸEangular-1.3.9/docs/examples/example-example27/PKy.FZ> Eangular-1.3.9/docs/examples/example-example27/index-debug.htmlPKy.Fu(4;? Eangular-1.3.9/docs/examples/example-example27/index-jquery.htmlPKy.F<(C JEangular-1.3.9/docs/examples/example-example27/index-production.htmlPKy.F+x8 Eangular-1.3.9/docs/examples/example-example27/index.htmlPKy.Fc4zr]u; xEangular-1.3.9/docs/examples/example-example27/manifest.jsonPKy.Fŵ; >Eangular-1.3.9/docs/examples/example-example27/protractor.jsPKy.FT7 Eangular-1.3.9/docs/examples/example-example27/script.jsPK y.F.Eangular-1.3.9/docs/examples/example-example28/PKy.FE[&'> TEangular-1.3.9/docs/examples/example-example28/index-debug.htmlPKy.F.2j? Eangular-1.3.9/docs/examples/example-example28/index-jquery.htmlPKy.FA:WC zEangular-1.3.9/docs/examples/example-example28/index-production.htmlPKy.F˘%8 %Eangular-1.3.9/docs/examples/example-example28/index.htmlPKy.FtQ`; Eangular-1.3.9/docs/examples/example-example28/manifest.jsonPKy.FӓS7 _Eangular-1.3.9/docs/examples/example-example28/script.jsPK y.F.Eangular-1.3.9/docs/examples/example-example29/PKy.F}ʛ > Eangular-1.3.9/docs/examples/example-example29/index-debug.htmlPKy.FLP#? SEangular-1.3.9/docs/examples/example-example29/index-jquery.htmlPKy.FS+ C Eangular-1.3.9/docs/examples/example-example29/index-production.htmlPKy.F  8 Eangular-1.3.9/docs/examples/example-example29/index.htmlPKy.FIQ`; Eangular-1.3.9/docs/examples/example-example29/manifest.jsonPKy.F)&7 Eangular-1.3.9/docs/examples/example-example29/script.jsPK y.F-8Eangular-1.3.9/docs/examples/example-example3/PKy.F{j; Eangular-1.3.9/docs/examples/example-example3/animations.cssPKy.FqDQ_= mEangular-1.3.9/docs/examples/example-example3/index-debug.htmlPKy.FXh> )Eangular-1.3.9/docs/examples/example-example3/index-jquery.htmlPKy.F PrB Eangular-1.3.9/docs/examples/example-example3/index-production.htmlPKy.F{pO]7 Eangular-1.3.9/docs/examples/example-example3/index.htmlPKy.F.Sd: Eangular-1.3.9/docs/examples/example-example3/manifest.jsonPK y.F.NEangular-1.3.9/docs/examples/example-example30/PKy.F>L> Eangular-1.3.9/docs/examples/example-example30/index-debug.htmlPKy.F).:? Eangular-1.3.9/docs/examples/example-example30/index-jquery.htmlPKy.FHX5'C Eangular-1.3.9/docs/examples/example-example30/index-production.htmlPKy.F^[8 ^Eangular-1.3.9/docs/examples/example-example30/index.htmlPKy.FQ`; Eangular-1.3.9/docs/examples/example-example30/manifest.jsonPKy.F#7 Eangular-1.3.9/docs/examples/example-example30/script.jsPK y.F.Eangular-1.3.9/docs/examples/example-example31/PKy.F> KEangular-1.3.9/docs/examples/example-example31/index-debug.htmlPKy.Fo? Eangular-1.3.9/docs/examples/example-example31/index-jquery.htmlPKy.F%C FEangular-1.3.9/docs/examples/example-example31/index-production.htmlPKy.Ft8 Eangular-1.3.9/docs/examples/example-example31/index.htmlPKy.FDO; DEangular-1.3.9/docs/examples/example-example31/manifest.jsonPK y.F.Eangular-1.3.9/docs/examples/example-example32/PKy.FU33;> =Eangular-1.3.9/docs/examples/example-example32/index-debug.htmlPKy.FG?3ZRQ? Eangular-1.3.9/docs/examples/example-example32/index-jquery.htmlPKy.FS|?[>C Eangular-1.3.9/docs/examples/example-example32/index-production.htmlPKy.Ff8 8 oEangular-1.3.9/docs/examples/example-example32/index.htmlPKy.FƎRDO; Eangular-1.3.9/docs/examples/example-example32/manifest.jsonPK y.F.Eangular-1.3.9/docs/examples/example-example33/PKy.FM#> Eangular-1.3.9/docs/examples/example-example33/index-debug.htmlPKy.F'df? Eangular-1.3.9/docs/examples/example-example33/index-jquery.htmlPKy.F`nSC Fangular-1.3.9/docs/examples/example-example33/index-production.htmlPKy.FL!8 oFangular-1.3.9/docs/examples/example-example33/index.htmlPKy.Fv(=Q`; !Fangular-1.3.9/docs/examples/example-example33/manifest.jsonPKy.F!7 Fangular-1.3.9/docs/examples/example-example33/script.jsPK y.F.# Fangular-1.3.9/docs/examples/example-example34/PKy.Fi}S8M> o Fangular-1.3.9/docs/examples/example-example34/index-debug.htmlPKy.Fh?O?  Fangular-1.3.9/docs/examples/example-example34/index-jquery.htmlPKy.FsW}C Fangular-1.3.9/docs/examples/example-example34/index-production.htmlPKy.F-6K8 Fangular-1.3.9/docs/examples/example-example34/index.htmlPKy.F|Q`; 3Fangular-1.3.9/docs/examples/example-example34/manifest.jsonPKy.FLɢ(7 Fangular-1.3.9/docs/examples/example-example34/script.jsPK y.F.Fangular-1.3.9/docs/examples/example-example35/PKy.F`\jW> %Fangular-1.3.9/docs/examples/example-example35/index-debug.htmlPKy.FX*? Fangular-1.3.9/docs/examples/example-example35/index-jquery.htmlPKy.F_yE1C ;Fangular-1.3.9/docs/examples/example-example35/index-production.htmlPKy.F8 Fangular-1.3.9/docs/examples/example-example35/index.htmlPKy.F$}[uQ`; TFangular-1.3.9/docs/examples/example-example35/manifest.jsonPKy.Fyy7 Fangular-1.3.9/docs/examples/example-example35/script.jsPK y.F.Fangular-1.3.9/docs/examples/example-example36/PKy.F|i> EFangular-1.3.9/docs/examples/example-example36/index-debug.htmlPKy.Fd0"? Fangular-1.3.9/docs/examples/example-example36/index-jquery.htmlPKy.F#ƩC Fangular-1.3.9/docs/examples/example-example36/index-production.htmlPKy.Fj8 2"Fangular-1.3.9/docs/examples/example-example36/index.htmlPKy.FW9Q`; e$Fangular-1.3.9/docs/examples/example-example36/manifest.jsonPKy.FN'I7 %Fangular-1.3.9/docs/examples/example-example36/script.jsPK y.F.'Fangular-1.3.9/docs/examples/example-example37/PKy.Fa 'Fangular-1.3.9/docs/examples/example-example37/index-debug.htmlPKy.F7=[[? )Fangular-1.3.9/docs/examples/example-example37/index-jquery.htmlPKy.FbwC p+Fangular-1.3.9/docs/examples/example-example37/index-production.htmlPKy.FhCE8 C-Fangular-1.3.9/docs/examples/example-example37/index.htmlPKy.FճQ`; .Fangular-1.3.9/docs/examples/example-example37/manifest.jsonPKy.Fc7 /Fangular-1.3.9/docs/examples/example-example37/script.jsPK y.F.1Fangular-1.3.9/docs/examples/example-example38/PKy.Fc0)> 1Fangular-1.3.9/docs/examples/example-example38/index-debug.htmlPKy.FxA-? |3Fangular-1.3.9/docs/examples/example-example38/index-jquery.htmlPKy.FC(IC *5Fangular-1.3.9/docs/examples/example-example38/index-production.htmlPKy.F.vJ'8 6Fangular-1.3.9/docs/examples/example-example38/index.htmlPKy.F5Q`; q8Fangular-1.3.9/docs/examples/example-example38/manifest.jsonPKy.F~H&07 +9Fangular-1.3.9/docs/examples/example-example38/script.jsPK y.F.:Fangular-1.3.9/docs/examples/example-example39/PKy.F ;Fangular-1.3.9/docs/examples/example-example39/index-debug.htmlPKy.FG|? 4Fangular-1.3.9/docs/examples/example-example39/index.htmlPKy.F]u; @Fangular-1.3.9/docs/examples/example-example39/manifest.jsonPKy.F-x; @Fangular-1.3.9/docs/examples/example-example39/protractor.jsPKy.F0o77 AFangular-1.3.9/docs/examples/example-example39/script.jsPK y.F-BFangular-1.3.9/docs/examples/example-example4/PKy.F= !CFangular-1.3.9/docs/examples/example-example4/index-debug.htmlPKy.F46Y> DFangular-1.3.9/docs/examples/example-example4/index-jquery.htmlPKy.F ;AmB LFFangular-1.3.9/docs/examples/example-example4/index-production.htmlPKy.F^u7 GFangular-1.3.9/docs/examples/example-example4/index.htmlPKy.FhP_: IFangular-1.3.9/docs/examples/example-example4/manifest.jsonPKy.FR6 7JFangular-1.3.9/docs/examples/example-example4/style.cssPK y.F.BKFangular-1.3.9/docs/examples/example-example40/PKy.Fd<> KFangular-1.3.9/docs/examples/example-example40/index-debug.htmlPKy.F{mv? LFangular-1.3.9/docs/examples/example-example40/index-jquery.htmlPKy.F.klC NFangular-1.3.9/docs/examples/example-example40/index-production.htmlPKy.F <:8 gOFangular-1.3.9/docs/examples/example-example40/index.htmlPKy.F]u; PFangular-1.3.9/docs/examples/example-example40/manifest.jsonPKy.Ftt; XQFangular-1.3.9/docs/examples/example-example40/protractor.jsPKy.F9d7 5RFangular-1.3.9/docs/examples/example-example40/script.jsPK y.F.TFangular-1.3.9/docs/examples/example-example41/PKy.FV > fTFangular-1.3.9/docs/examples/example-example41/index-debug.htmlPKy.Fq#? UFangular-1.3.9/docs/examples/example-example41/index-jquery.htmlPKy.F2?*C oWFangular-1.3.9/docs/examples/example-example41/index-production.htmlPKy.F 8 YFangular-1.3.9/docs/examples/example-example41/index.htmlPKy.F((Q`; {ZFangular-1.3.9/docs/examples/example-example41/manifest.jsonPKy.F97"7 5[Fangular-1.3.9/docs/examples/example-example41/script.jsPK y.F.K\Fangular-1.3.9/docs/examples/example-example42/PKy.Frb95> \Fangular-1.3.9/docs/examples/example-example42/index-debug.htmlPKy.FUOx? <^Fangular-1.3.9/docs/examples/example-example42/index-jquery.htmlPKy.FZXeC _Fangular-1.3.9/docs/examples/example-example42/index-production.htmlPKy.FEᳮ738 aFangular-1.3.9/docs/examples/example-example42/index.htmlPKy.F!=k[q; ^cFangular-1.3.9/docs/examples/example-example42/manifest.jsonPKy.Fήp7 "dFangular-1.3.9/docs/examples/example-example42/script.jsPKy.F& YJb7 WeFangular-1.3.9/docs/examples/example-example42/style.cssPK y.F.fFangular-1.3.9/docs/examples/example-example43/PKy.FY[0> RfFangular-1.3.9/docs/examples/example-example43/index-debug.htmlPKy.FK)ops? hFangular-1.3.9/docs/examples/example-example43/index-jquery.htmlPKy.FsZz`C iFangular-1.3.9/docs/examples/example-example43/index-production.htmlPKy.F_GY.8 kFangular-1.3.9/docs/examples/example-example43/index.htmlPKy.F Q`; mFangular-1.3.9/docs/examples/example-example43/manifest.jsonPKy.F'ݽ7 ZnFangular-1.3.9/docs/examples/example-example43/script.jsPK y.F.\oFangular-1.3.9/docs/examples/example-example44/PKy.FTZQT5> oFangular-1.3.9/docs/examples/example-example44/index-debug.htmlPKy.F5}zkx? hqFangular-1.3.9/docs/examples/example-example44/index-jquery.htmlPKy.FĤueC @sFangular-1.3.9/docs/examples/example-example44/index-production.htmlPKy.FyR38 &uFangular-1.3.9/docs/examples/example-example44/index.htmlPKy.F9 ]u; vFangular-1.3.9/docs/examples/example-example44/manifest.jsonPKy.Fֽ y; wFangular-1.3.9/docs/examples/example-example44/protractor.jsPKy.FS|7 xFangular-1.3.9/docs/examples/example-example44/script.jsPK y.F.yFangular-1.3.9/docs/examples/example-example45/PKy.FW%V> 3zFangular-1.3.9/docs/examples/example-example45/index-debug.htmlPKy.F恥)? |Fangular-1.3.9/docs/examples/example-example45/index-jquery.htmlPKy.Fv۷32C EFangular-1.3.9/docs/examples/example-example45/index-production.htmlPKy.F8 Fangular-1.3.9/docs/examples/example-example45/index.htmlPKy.FWcDO; \Fangular-1.3.9/docs/examples/example-example45/manifest.jsonPK y.F. Fangular-1.3.9/docs/examples/example-example46/PKy.F]t]> UFangular-1.3.9/docs/examples/example-example46/index-debug.htmlPKy.F$j? Fangular-1.3.9/docs/examples/example-example46/index-jquery.htmlPKy.F?"C Fangular-1.3.9/docs/examples/example-example46/index-production.htmlPKy.F[8 cFangular-1.3.9/docs/examples/example-example46/index.htmlPKy.F")Q`; Fangular-1.3.9/docs/examples/example-example46/manifest.jsonPKy.FylD~7 ZFangular-1.3.9/docs/examples/example-example46/script.jsPK y.F.=Fangular-1.3.9/docs/examples/example-example47/PKy.F^?;&> Fangular-1.3.9/docs/examples/example-example47/index-debug.htmlPKy.F+^Ri? 0Fangular-1.3.9/docs/examples/example-example47/index-jquery.htmlPKy.FcYVC Fangular-1.3.9/docs/examples/example-example47/index-production.htmlPKy.Fh$9$8 Fangular-1.3.9/docs/examples/example-example47/index.htmlPKy.FA[q; XFangular-1.3.9/docs/examples/example-example47/manifest.jsonPKy.FjKW 7 Fangular-1.3.9/docs/examples/example-example47/script.jsPKy.FSU{7 ؙFangular-1.3.9/docs/examples/example-example47/style.cssPK y.F.Fangular-1.3.9/docs/examples/example-example48/PKy.F6 e> BFangular-1.3.9/docs/examples/example-example48/index-debug.htmlPKy.FF /3$? ʜFangular-1.3.9/docs/examples/example-example48/index-jquery.htmlPKy.F،L<C jFangular-1.3.9/docs/examples/example-example48/index-production.htmlPKy.Fχ8 Fangular-1.3.9/docs/examples/example-example48/index.htmlPKy.Fb[q; Fangular-1.3.9/docs/examples/example-example48/manifest.jsonPKy.F W7 [Fangular-1.3.9/docs/examples/example-example48/script.jsPKy.F]g7 Fangular-1.3.9/docs/examples/example-example48/style.cssPK y.F.tFangular-1.3.9/docs/examples/example-example49/PKy.F_KL> Fangular-1.3.9/docs/examples/example-example49/index-debug.htmlPKy.FQ3Ha? wFangular-1.3.9/docs/examples/example-example49/index-jquery.htmlPKy.FËk|C EFangular-1.3.9/docs/examples/example-example49/index-production.htmlPKy.FJIJ8 !Fangular-1.3.9/docs/examples/example-example49/index.htmlPKy.FK8[q; ЫFangular-1.3.9/docs/examples/example-example49/manifest.jsonPKy.F_Js7 Fangular-1.3.9/docs/examples/example-example49/script.jsPKy.F_ Fangular-1.3.9/docs/examples/example-example5/index-jquery.htmlPKy.FeMB /Fangular-1.3.9/docs/examples/example-example5/index-production.htmlPKy.F6ղ7 sFangular-1.3.9/docs/examples/example-example5/index.htmlPKy.F*P_: Fangular-1.3.9/docs/examples/example-example5/manifest.jsonPKy.F&H',6 BFangular-1.3.9/docs/examples/example-example5/script.jsPK y.F.jFangular-1.3.9/docs/examples/example-example50/PKy.FOJtm> Fangular-1.3.9/docs/examples/example-example50/index-debug.htmlPKy.FD~o? ùFangular-1.3.9/docs/examples/example-example50/index-jquery.htmlPKy.F emC Fangular-1.3.9/docs/examples/example-example50/index-production.htmlPKy.F7]k8 Fangular-1.3.9/docs/examples/example-example50/index.htmlPKy.F>;[q; Fangular-1.3.9/docs/examples/example-example50/manifest.jsonPKy.Ft7 Fangular-1.3.9/docs/examples/example-example50/script.jsPKy.F)^7 ;Fangular-1.3.9/docs/examples/example-example50/style.cssPK y.F.Fangular-1.3.9/docs/examples/example-example51/PKy.F|8> Fangular-1.3.9/docs/examples/example-example51/index-debug.htmlPKy.FH>? Fangular-1.3.9/docs/examples/example-example51/index-jquery.htmlPKy.Fq+C MFangular-1.3.9/docs/examples/example-example51/index-production.htmlPKy.Ff8 Fangular-1.3.9/docs/examples/example-example51/index.htmlPKy.Fi1Td; Fangular-1.3.9/docs/examples/example-example51/manifest.jsonPKy.FGش/; RFangular-1.3.9/docs/examples/example-example51/protractor.jsPK y.F.oFangular-1.3.9/docs/examples/example-example52/PKy.FhF> Fangular-1.3.9/docs/examples/example-example52/index-debug.htmlPKy.F޵^ ? mFangular-1.3.9/docs/examples/example-example52/index-jquery.htmlPKy.FWeC 8Fangular-1.3.9/docs/examples/example-example52/index-production.htmlPKy.F^&E8 Fangular-1.3.9/docs/examples/example-example52/index.htmlPKy.FcRTd; Fangular-1.3.9/docs/examples/example-example52/manifest.jsonPKy.FKR; vFangular-1.3.9/docs/examples/example-example52/protractor.jsPK y.F.Fangular-1.3.9/docs/examples/example-example53/PKy.F+[> :Fangular-1.3.9/docs/examples/example-example53/index-debug.htmlPKy.F>W? Fangular-1.3.9/docs/examples/example-example53/index-jquery.htmlPKy.F| C Fangular-1.3.9/docs/examples/example-example53/index-production.htmlPKy.F0Y8 NFangular-1.3.9/docs/examples/example-example53/index.htmlPKy.FQk^Td; Fangular-1.3.9/docs/examples/example-example53/manifest.jsonPKy.Fa; JFangular-1.3.9/docs/examples/example-example53/protractor.jsPK y.F.9Fangular-1.3.9/docs/examples/example-example54/PKy.FjZ> Fangular-1.3.9/docs/examples/example-example54/index-debug.htmlPKy.Fpn? Fangular-1.3.9/docs/examples/example-example54/index-jquery.htmlPKy.FN zC *Fangular-1.3.9/docs/examples/example-example54/index-production.htmlPKy.FX8 Fangular-1.3.9/docs/examples/example-example54/index.htmlPKy.F U5Td; Fangular-1.3.9/docs/examples/example-example54/manifest.jsonPKy.FM; Fangular-1.3.9/docs/examples/example-example54/protractor.jsPK y.F.Fangular-1.3.9/docs/examples/example-example55/PKy.FkAf> Fangular-1.3.9/docs/examples/example-example55/index-debug.htmlPKy.F %? Fangular-1.3.9/docs/examples/example-example55/index-jquery.htmlPKy.FњC Fangular-1.3.9/docs/examples/example-example55/index-production.htmlPKy.F|r[d8 Fangular-1.3.9/docs/examples/example-example55/index.htmlPKy.FqlTd; ?Fangular-1.3.9/docs/examples/example-example55/manifest.jsonPKy.F 7; Fangular-1.3.9/docs/examples/example-example55/protractor.jsPK y.F.Fangular-1.3.9/docs/examples/example-example56/PKy.FT;> DFangular-1.3.9/docs/examples/example-example56/index-debug.htmlPKy.F O ? Fangular-1.3.9/docs/examples/example-example56/index-jquery.htmlPKy.FYGJC Fangular-1.3.9/docs/examples/example-example56/index-production.htmlPKy.Fbp8 Fangular-1.3.9/docs/examples/example-example56/index.htmlPKy.FWZTd; Fangular-1.3.9/docs/examples/example-example56/manifest.jsonPKy.FM.; Fangular-1.3.9/docs/examples/example-example56/protractor.jsPK y.F.Fangular-1.3.9/docs/examples/example-example57/PKy.F(zq> Fangular-1.3.9/docs/examples/example-example57/index-debug.htmlPKy.F? 5Fangular-1.3.9/docs/examples/example-example57/index-jquery.htmlPKy.FG@, C Fangular-1.3.9/docs/examples/example-example57/index-production.htmlPKy.Fo8 "Fangular-1.3.9/docs/examples/example-example57/index.htmlPKy.FsnTd; rFangular-1.3.9/docs/examples/example-example57/manifest.jsonPKy.F~; /Gangular-1.3.9/docs/examples/example-example57/protractor.jsPK y.F.Gangular-1.3.9/docs/examples/example-example58/PKy.F(|OJ> cGangular-1.3.9/docs/examples/example-example58/index-debug.htmlPKy.F,0aS? Gangular-1.3.9/docs/examples/example-example58/index-jquery.htmlPKy.FMkgC Gangular-1.3.9/docs/examples/example-example58/index-production.htmlPKy.FzH8 Gangular-1.3.9/docs/examples/example-example58/index.htmlPKy.F-0+Td; q Gangular-1.3.9/docs/examples/example-example58/manifest.jsonPKy.Fc_; . Gangular-1.3.9/docs/examples/example-example58/protractor.jsPK y.F.Gangular-1.3.9/docs/examples/example-example59/PKy.FÔ9> Gangular-1.3.9/docs/examples/example-example59/index-debug.htmlPKy.F`SR? pGangular-1.3.9/docs/examples/example-example59/index-jquery.htmlPKy.FvY?C 0Gangular-1.3.9/docs/examples/example-example59/index-production.htmlPKy.F #7 8 Gangular-1.3.9/docs/examples/example-example59/index.htmlPKy.FVTd; Gangular-1.3.9/docs/examples/example-example59/manifest.jsonPKy.FNԟ ; TGangular-1.3.9/docs/examples/example-example59/protractor.jsPK y.F-UGangular-1.3.9/docs/examples/example-example6/PKy.F#xbi3 Gangular-1.3.9/docs/examples/example-example6/app.jsPKy.FeE&= Gangular-1.3.9/docs/examples/example-example6/index-debug.htmlPKy.FL> /Gangular-1.3.9/docs/examples/example-example6/index-jquery.htmlPKy.F&B Gangular-1.3.9/docs/examples/example-example6/index-production.htmlPKy.F.7 NGangular-1.3.9/docs/examples/example-example6/index.htmlPKy.F M\: Gangular-1.3.9/docs/examples/example-example6/manifest.jsonPK y.F.mGangular-1.3.9/docs/examples/example-example60/PKy.FJL@Yw> Gangular-1.3.9/docs/examples/example-example60/index-debug.htmlPKy.FಬMr? ~!Gangular-1.3.9/docs/examples/example-example60/index-jquery.htmlPKy.F_'^|C ]#Gangular-1.3.9/docs/examples/example-example60/index-production.htmlPKy.Fai#Wu8 J%Gangular-1.3.9/docs/examples/example-example60/index.htmlPKy.F* E)Gangular-1.3.9/docs/examples/example-example61/index-debug.htmlPKy.F#{? *Gangular-1.3.9/docs/examples/example-example61/index-jquery.htmlPKy.F,C +Gangular-1.3.9/docs/examples/example-example61/index-production.htmlPKy.Fn+8 Y-Gangular-1.3.9/docs/examples/example-example61/index.htmlPKy.F2]u; .Gangular-1.3.9/docs/examples/example-example61/manifest.jsonPKy.F0; _/Gangular-1.3.9/docs/examples/example-example61/protractor.jsPKy.Fo17 P0Gangular-1.3.9/docs/examples/example-example61/script.jsPK y.F.1Gangular-1.3.9/docs/examples/example-example62/PKy.F(֢> 1Gangular-1.3.9/docs/examples/example-example62/index-debug.htmlPKy.F5fM? 3Gangular-1.3.9/docs/examples/example-example62/index-jquery.htmlPKy.FC 6Gangular-1.3.9/docs/examples/example-example62/index-production.htmlPKy.FBe8 @8Gangular-1.3.9/docs/examples/example-example62/index.htmlPKy.F _u; F:Gangular-1.3.9/docs/examples/example-example62/manifest.jsonPKy.F$$3; ;Gangular-1.3.9/docs/examples/example-example62/protractor.jsPKy.FSf7 =Gangular-1.3.9/docs/examples/example-example63/index-debug.htmlPKy.FWz"<f? ??Gangular-1.3.9/docs/examples/example-example63/index-jquery.htmlPKy.FCmFzC @Gangular-1.3.9/docs/examples/example-example63/index-production.htmlPKy.Fjm~$!8 BGangular-1.3.9/docs/examples/example-example63/index.htmlPKy.FI_u; )DGangular-1.3.9/docs/examples/example-example63/manifest.jsonPKy.F:o; DGangular-1.3.9/docs/examples/example-example63/protractor.jsPKy.F(x7 EGangular-1.3.9/docs/examples/example-example63/style.cssPK y.F.FGangular-1.3.9/docs/examples/example-example64/PKy.F0a> GGangular-1.3.9/docs/examples/example-example64/index-debug.htmlPKy.F?g9? HGangular-1.3.9/docs/examples/example-example64/index-jquery.htmlPKy.F)=C HJGangular-1.3.9/docs/examples/example-example64/index-production.htmlPKy.F=&C8 KGangular-1.3.9/docs/examples/example-example64/index.htmlPKy.F_5_u; xMGangular-1.3.9/docs/examples/example-example64/manifest.jsonPKy.Fs%; @NGangular-1.3.9/docs/examples/example-example64/protractor.jsPKy.FG!\&/7 @OGangular-1.3.9/docs/examples/example-example64/style.cssPK y.F.OGangular-1.3.9/docs/examples/example-example65/PKy.F߂,&> PGangular-1.3.9/docs/examples/example-example65/index-debug.htmlPKy.F_TC? QGangular-1.3.9/docs/examples/example-example65/index-jquery.htmlPKy.FtjF C YSGangular-1.3.9/docs/examples/example-example65/index-production.htmlPKy.F.$8 UGangular-1.3.9/docs/examples/example-example65/index.htmlPKy.F'b_u; VGangular-1.3.9/docs/examples/example-example65/manifest.jsonPKy.Fs%; bWGangular-1.3.9/docs/examples/example-example65/protractor.jsPKy.FG!\&/7 bXGangular-1.3.9/docs/examples/example-example65/style.cssPK y.F.XGangular-1.3.9/docs/examples/example-example66/PKy.Fp`N> 9YGangular-1.3.9/docs/examples/example-example66/index-debug.htmlPKy.Fǿ3? {ZGangular-1.3.9/docs/examples/example-example66/index-jquery.htmlPKy.Fj}G~C [Gangular-1.3.9/docs/examples/example-example66/index-production.htmlPKy.F{nlL8 9]Gangular-1.3.9/docs/examples/example-example66/index.htmlPKy.Ff;sTd; s^Gangular-1.3.9/docs/examples/example-example66/manifest.jsonPKy.F; 0_Gangular-1.3.9/docs/examples/example-example66/protractor.jsPK y.F.`Gangular-1.3.9/docs/examples/example-example67/PKy.F:G> f`Gangular-1.3.9/docs/examples/example-example67/index-debug.htmlPKy.Fm? aGangular-1.3.9/docs/examples/example-example67/index-jquery.htmlPKy.FL0wC cGangular-1.3.9/docs/examples/example-example67/index-production.htmlPKy.F#upE8 kdGangular-1.3.9/docs/examples/example-example67/index.htmlPKy.F8Td; eGangular-1.3.9/docs/examples/example-example67/manifest.jsonPKy.F0iA|; dfGangular-1.3.9/docs/examples/example-example67/protractor.jsPK y.F.IgGangular-1.3.9/docs/examples/example-example68/PKy.F`K> gGangular-1.3.9/docs/examples/example-example68/index-debug.htmlPKy.F6F? hGangular-1.3.9/docs/examples/example-example68/index-jquery.htmlPKy.Fa_{C @jGangular-1.3.9/docs/examples/example-example68/index-production.htmlPKy.F\tcI8 kGangular-1.3.9/docs/examples/example-example68/index.htmlPKy.F/DO; lGangular-1.3.9/docs/examples/example-example68/manifest.jsonPK y.F.mGangular-1.3.9/docs/examples/example-example69/PKy.FHJ> mGangular-1.3.9/docs/examples/example-example69/index-debug.htmlPKy.FP6? ,oGangular-1.3.9/docs/examples/example-example69/index-jquery.htmlPKy.FӯZnzC pGangular-1.3.9/docs/examples/example-example69/index-production.htmlPKy.F H8 qGangular-1.3.9/docs/examples/example-example69/index.htmlPKy.F%DO; 7sGangular-1.3.9/docs/examples/example-example69/manifest.jsonPK y.F-sGangular-1.3.9/docs/examples/example-example7/PKy.F- 63 /tGangular-1.3.9/docs/examples/example-example7/app.jsPKy.FoN= DuGangular-1.3.9/docs/examples/example-example7/index-debug.htmlPKy.FII($> vGangular-1.3.9/docs/examples/example-example7/index-jquery.htmlPKy.F=ez2B UxGangular-1.3.9/docs/examples/example-example7/index-production.htmlPKy.FV 7 yGangular-1.3.9/docs/examples/example-example7/index.htmlPKy.F"M\: l{Gangular-1.3.9/docs/examples/example-example7/manifest.jsonPK y.F.!|Gangular-1.3.9/docs/examples/example-example70/PKy.FuVF> m|Gangular-1.3.9/docs/examples/example-example70/index-debug.htmlPKy.Fe? }Gangular-1.3.9/docs/examples/example-example70/index-jquery.htmlPKy.F 4vC Gangular-1.3.9/docs/examples/example-example70/index-production.htmlPKy.FuD8 vGangular-1.3.9/docs/examples/example-example70/index.htmlPKy.F1DO; Gangular-1.3.9/docs/examples/example-example70/manifest.jsonPK y.F.^Gangular-1.3.9/docs/examples/example-example71/PKy.Fg/O> Gangular-1.3.9/docs/examples/example-example71/index-debug.htmlPKy.F ? Gangular-1.3.9/docs/examples/example-example71/index-jquery.htmlPKy.FZC WGangular-1.3.9/docs/examples/example-example71/index-production.htmlPKy.FP}AM8 ņGangular-1.3.9/docs/examples/example-example71/index.htmlPKy.Fw(DO; Gangular-1.3.9/docs/examples/example-example71/manifest.jsonPK y.F.Gangular-1.3.9/docs/examples/example-example72/PKy.F1lȌO> Gangular-1.3.9/docs/examples/example-example72/index-debug.htmlPKy.Fv"? JGangular-1.3.9/docs/examples/example-example72/index-jquery.htmlPKy.FOIZC Gangular-1.3.9/docs/examples/example-example72/index-production.htmlPKy.FwQ4M8 Gangular-1.3.9/docs/examples/example-example72/index.htmlPKy.F%DO; [Gangular-1.3.9/docs/examples/example-example72/manifest.jsonPK y.F.Gangular-1.3.9/docs/examples/example-example73/PKy.Fz TGangular-1.3.9/docs/examples/example-example73/index-debug.htmlPKy.Fs? Gangular-1.3.9/docs/examples/example-example73/index-jquery.htmlPKy.F rC Gangular-1.3.9/docs/examples/example-example73/index-production.htmlPKy.FUM8 nGangular-1.3.9/docs/examples/example-example73/index.htmlPKy.FHDO; Gangular-1.3.9/docs/examples/example-example73/manifest.jsonPK y.F.\Gangular-1.3.9/docs/examples/example-example74/PKy.F+!M> Gangular-1.3.9/docs/examples/example-example74/index-debug.htmlPKy.Fy ? Gangular-1.3.9/docs/examples/example-example74/index-jquery.htmlPKy.F^yH}C XGangular-1.3.9/docs/examples/example-example74/index-production.htmlPKy.FGR^K8 ǙGangular-1.3.9/docs/examples/example-example74/index.htmlPKy.F\bDO; Gangular-1.3.9/docs/examples/example-example74/manifest.jsonPK y.F.Gangular-1.3.9/docs/examples/example-example75/PKy.FO*> Gangular-1.3.9/docs/examples/example-example75/index-debug.htmlPKy.FX8m? 7Gangular-1.3.9/docs/examples/example-example75/index-jquery.htmlPKy.FbZC Gangular-1.3.9/docs/examples/example-example75/index-production.htmlPKy.FBs(8 ݟGangular-1.3.9/docs/examples/example-example75/index.htmlPKy.FpEDO; Gangular-1.3.9/docs/examples/example-example75/manifest.jsonPK y.F.Gangular-1.3.9/docs/examples/example-example76/PKy.FhK > Gangular-1.3.9/docs/examples/example-example76/index-debug.htmlPKy.F0(4P? Gangular-1.3.9/docs/examples/example-example76/index-jquery.htmlPKy.FS<=C +Gangular-1.3.9/docs/examples/example-example76/index-production.htmlPKy.Fi8 8 ئGangular-1.3.9/docs/examples/example-example76/index.htmlPKy.F"iDO; XGangular-1.3.9/docs/examples/example-example76/manifest.jsonPK y.F.Gangular-1.3.9/docs/examples/example-example77/PKy.FF,> QGangular-1.3.9/docs/examples/example-example77/index-debug.htmlPKy.F5^o? Gangular-1.3.9/docs/examples/example-example77/index-jquery.htmlPKy.F,c\C ҫGangular-1.3.9/docs/examples/example-example77/index-production.htmlPKy.F#*8 *Gangular-1.3.9/docs/examples/example-example77/index.htmlPKy.Fp5DO; UGangular-1.3.9/docs/examples/example-example77/manifest.jsonPK y.F.Gangular-1.3.9/docs/examples/example-example78/PKy.FTTg> NGangular-1.3.9/docs/examples/example-example78/index-debug.htmlPKy.F&[? FGangular-1.3.9/docs/examples/example-example78/index-jquery.htmlPKy.FUHC ZGangular-1.3.9/docs/examples/example-example78/index-production.htmlPKy.Fo)8 wGangular-1.3.9/docs/examples/example-example78/index.htmlPKy.FDL Td; dGangular-1.3.9/docs/examples/example-example78/manifest.jsonPKy.F2猾!; !Gangular-1.3.9/docs/examples/example-example78/protractor.jsPK y.F.HGangular-1.3.9/docs/examples/example-example79/PKy.F}nA> Gangular-1.3.9/docs/examples/example-example79/index-debug.htmlPKy.FK? ԺGangular-1.3.9/docs/examples/example-example79/index-jquery.htmlPKy.FqC .Gangular-1.3.9/docs/examples/example-example79/index-production.htmlPKy.F\?8 Gangular-1.3.9/docs/examples/example-example79/index.htmlPKy.FyaDO; ˾Gangular-1.3.9/docs/examples/example-example79/manifest.jsonPK y.F-xGangular-1.3.9/docs/examples/example-example8/PKy.FR=<4 ÿGangular-1.3.9/docs/examples/example-example8/app.cssPKy.FY3 bGangular-1.3.9/docs/examples/example-example8/app.jsPKy.F Ƭ4= Gangular-1.3.9/docs/examples/example-example8/index-debug.htmlPKy.FIFK> 8Gangular-1.3.9/docs/examples/example-example8/index-jquery.htmlPKy.F#SB Gangular-1.3.9/docs/examples/example-example8/index-production.htmlPKy.F|}27 Gangular-1.3.9/docs/examples/example-example8/index.htmlPKy.FRk: IGangular-1.3.9/docs/examples/example-example8/manifest.jsonPK y.F.Gangular-1.3.9/docs/examples/example-example80/PKy.F3> OGangular-1.3.9/docs/examples/example-example80/index-debug.htmlPKy.Fv? Gangular-1.3.9/docs/examples/example-example80/index-jquery.htmlPKy.FcC Gangular-1.3.9/docs/examples/example-example80/index-production.htmlPKy.FG18 ;Gangular-1.3.9/docs/examples/example-example80/index.htmlPKy.FabDO; nGangular-1.3.9/docs/examples/example-example80/manifest.jsonPK y.F.Gangular-1.3.9/docs/examples/example-example81/PKy.FFeY6> gGangular-1.3.9/docs/examples/example-example81/index-debug.htmlPKy.FOvy? Gangular-1.3.9/docs/examples/example-example81/index-jquery.htmlPKy.F+sQfC Gangular-1.3.9/docs/examples/example-example81/index-production.htmlPKy.F, 48 RGangular-1.3.9/docs/examples/example-example81/index.htmlPKy.F{gDO; Gangular-1.3.9/docs/examples/example-example81/manifest.jsonPK y.F.1Gangular-1.3.9/docs/examples/example-example82/PKy.FOS+< }Gangular-1.3.9/docs/examples/example-example82/animations.cssPKy.Fuײ9 > Gangular-1.3.9/docs/examples/example-example82/index-debug.htmlPKy.Fk/Oc? GGangular-1.3.9/docs/examples/example-example82/index-jquery.htmlPKy.FivYwC Gangular-1.3.9/docs/examples/example-example82/index-production.htmlPKy.Fƿ6d78 Gangular-1.3.9/docs/examples/example-example82/index.htmlPKy.F£Te; jGangular-1.3.9/docs/examples/example-example82/manifest.jsonPK y.F.'Gangular-1.3.9/docs/examples/example-example83/PKy.F2])< sGangular-1.3.9/docs/examples/example-example83/animations.cssPKy.F0ۗl> Gangular-1.3.9/docs/examples/example-example83/index-debug.htmlPKy.FU? Gangular-1.3.9/docs/examples/example-example83/index-jquery.htmlPKy.F}*C Gangular-1.3.9/docs/examples/example-example83/index-production.htmlPKy.Faj8 Gangular-1.3.9/docs/examples/example-example83/index.htmlPKy.Fnx; Gangular-1.3.9/docs/examples/example-example83/manifest.jsonPKy.F.h)Xb; lGangular-1.3.9/docs/examples/example-example83/protractor.jsPKy.F]_h7 -Gangular-1.3.9/docs/examples/example-example83/script.jsPKy.F< PGangular-1.3.9/docs/examples/example-example83/template1.htmlPKy.F+iF< Gangular-1.3.9/docs/examples/example-example83/template2.htmlPK y.F.ZGangular-1.3.9/docs/examples/example-example84/PKy.F0ay> Gangular-1.3.9/docs/examples/example-example84/index-debug.htmlPKy.F~3h? Gangular-1.3.9/docs/examples/example-example84/index-jquery.htmlPKy.F`uC Gangular-1.3.9/docs/examples/example-example84/index-production.htmlPKy.F[w8 Gangular-1.3.9/docs/examples/example-example84/index.htmlPKy.Fj7>Td; tGangular-1.3.9/docs/examples/example-example84/manifest.jsonPKy.Fѥn; 1Gangular-1.3.9/docs/examples/example-example84/protractor.jsPK y.F.?Gangular-1.3.9/docs/examples/example-example85/PKy.F= > Gangular-1.3.9/docs/examples/example-example85/index-debug.htmlPKy.F91N? Gangular-1.3.9/docs/examples/example-example85/index-jquery.htmlPKy.F4:bC Gangular-1.3.9/docs/examples/example-example85/index-production.htmlPKy.F 8 ZGangular-1.3.9/docs/examples/example-example85/index.htmlPKy.FDO; Hangular-1.3.9/docs/examples/example-example85/manifest.jsonPK y.F.Hangular-1.3.9/docs/examples/example-example86/PKy.FK)"> Hangular-1.3.9/docs/examples/example-example86/index-debug.htmlPKy.F-e? Hangular-1.3.9/docs/examples/example-example86/index-jquery.htmlPKy.F2RC OHangular-1.3.9/docs/examples/example-example86/index-production.htmlPKy.FqtQ 8 Hangular-1.3.9/docs/examples/example-example86/index.htmlPKy.FQTd; Hangular-1.3.9/docs/examples/example-example86/manifest.jsonPKy.F; Hangular-1.3.9/docs/examples/example-example86/protractor.jsPK y.F.Hangular-1.3.9/docs/examples/example-example87/PKy.FveD> Hangular-1.3.9/docs/examples/example-example87/index-debug.htmlPKy.F l\-? Hangular-1.3.9/docs/examples/example-example87/index-jquery.htmlPKy.FdC IHangular-1.3.9/docs/examples/example-example87/index-production.htmlPKy.FGfxB8 Hangular-1.3.9/docs/examples/example-example87/index.htmlPKy.FR֋Td; Hangular-1.3.9/docs/examples/example-example87/manifest.jsonPKy.FT6o; Hangular-1.3.9/docs/examples/example-example87/protractor.jsPK y.F.Hangular-1.3.9/docs/examples/example-example88/PKy.FX Eu< Hangular-1.3.9/docs/examples/example-example88/animations.cssPKy.F(yC> .Hangular-1.3.9/docs/examples/example-example88/index-debug.htmlPKy.FY? Hangular-1.3.9/docs/examples/example-example88/index-jquery.htmlPKy.FDb-C Hangular-1.3.9/docs/examples/example-example88/index-production.htmlPKy.FVA8 v Hangular-1.3.9/docs/examples/example-example88/index.htmlPKy.F=`az; #Hangular-1.3.9/docs/examples/example-example88/manifest.jsonPKy.F}\S; #Hangular-1.3.9/docs/examples/example-example88/protractor.jsPK y.F.%Hangular-1.3.9/docs/examples/example-example89/PKy.FU< %Hangular-1.3.9/docs/examples/example-example89/animations.cssPKy.FK`K5@< %'Hangular-1.3.9/docs/examples/example-example89/glyphicons.cssPKy.FImG> 'Hangular-1.3.9/docs/examples/example-example89/index-debug.htmlPKy.FH? )Hangular-1.3.9/docs/examples/example-example89/index-jquery.htmlPKy.F'C +Hangular-1.3.9/docs/examples/example-example89/index-production.htmlPKy.Fh$OkE8 -Hangular-1.3.9/docs/examples/example-example89/index.htmlPKy.Fqn; _/Hangular-1.3.9/docs/examples/example-example89/manifest.jsonPKy.FG; 60Hangular-1.3.9/docs/examples/example-example89/protractor.jsPK y.F-_1Hangular-1.3.9/docs/examples/example-example9/PKy.F= 1Hangular-1.3.9/docs/examples/example-example9/index-debug.htmlPKy.Fn5Z> 3Hangular-1.3.9/docs/examples/example-example9/index-jquery.htmlPKy.FbGB 4Hangular-1.3.9/docs/examples/example-example9/index-production.htmlPKy.F!7 6Hangular-1.3.9/docs/examples/example-example9/index.htmlPKy.F!"\t: o7Hangular-1.3.9/docs/examples/example-example9/manifest.jsonPKy.Fc: 38Hangular-1.3.9/docs/examples/example-example9/protractor.jsPKy.F}G6 X9Hangular-1.3.9/docs/examples/example-example9/script.jsPK y.F.w:Hangular-1.3.9/docs/examples/example-example90/PKy.F^< :Hangular-1.3.9/docs/examples/example-example90/animations.cssPKy.FK`K5@< ;Hangular-1.3.9/docs/examples/example-example90/glyphicons.cssPKy.Fr}SnG> rHangular-1.3.9/docs/examples/example-example90/index-jquery.htmlPKy.F`tlC ?@Hangular-1.3.9/docs/examples/example-example90/index-production.htmlPKy.F:alE8 @BHangular-1.3.9/docs/examples/example-example90/index.htmlPKy.Fn; DHangular-1.3.9/docs/examples/example-example90/manifest.jsonPKy.FG; DHangular-1.3.9/docs/examples/example-example90/protractor.jsPK y.F.FHangular-1.3.9/docs/examples/example-example91/PKy.FPc/B> ^FHangular-1.3.9/docs/examples/example-example91/index-debug.htmlPKy.FriI? GHangular-1.3.9/docs/examples/example-example91/index-jquery.htmlPKy.F. _NrC IHangular-1.3.9/docs/examples/example-example91/index-production.htmlPKy.F$I-@8 nKHangular-1.3.9/docs/examples/example-example91/index.htmlPKy.FW_u; MHangular-1.3.9/docs/examples/example-example91/manifest.jsonPKy.Fg; MHangular-1.3.9/docs/examples/example-example91/protractor.jsPKy.Fk7 NHangular-1.3.9/docs/examples/example-example91/style.cssPK y.F.aOHangular-1.3.9/docs/examples/example-example92/PKy.FgA4< OHangular-1.3.9/docs/examples/example-example92/animations.cssPKy.FuP> QHangular-1.3.9/docs/examples/example-example92/index-debug.htmlPKy.F? RHangular-1.3.9/docs/examples/example-example92/index-jquery.htmlPKy.FTC THangular-1.3.9/docs/examples/example-example92/index-production.htmlPKy.F~ⷡsN8 VHangular-1.3.9/docs/examples/example-example92/index.htmlPKy.F)j; XHangular-1.3.9/docs/examples/example-example92/manifest.jsonPKy.F6; YHangular-1.3.9/docs/examples/example-example92/protractor.jsPKy.F[ 7 ZHangular-1.3.9/docs/examples/example-example92/script.jsPK y.F.[Hangular-1.3.9/docs/examples/example-example93/PKy.F> G\Hangular-1.3.9/docs/examples/example-example93/index-debug.htmlPKy.F2? ^Hangular-1.3.9/docs/examples/example-example93/index-jquery.htmlPKy.F C 3aHangular-1.3.9/docs/examples/example-example93/index-production.htmlPKy.FA]8 cHangular-1.3.9/docs/examples/example-example93/index.htmlPKy.FvTd; %fHangular-1.3.9/docs/examples/example-example93/manifest.jsonPKy.F~^; fHangular-1.3.9/docs/examples/example-example93/protractor.jsPK y.F.gHangular-1.3.9/docs/examples/example-example94/PKy.F9> KhHangular-1.3.9/docs/examples/example-example94/index-debug.htmlPKy.FY3? iHangular-1.3.9/docs/examples/example-example94/index-jquery.htmlPKy.Fr$h%C IkHangular-1.3.9/docs/examples/example-example94/index-production.htmlPKy.FmR>8 lHangular-1.3.9/docs/examples/example-example94/index.htmlPKy.FdTd; InHangular-1.3.9/docs/examples/example-example94/manifest.jsonPKy.F2f; oHangular-1.3.9/docs/examples/example-example94/protractor.jsPK y.F.oHangular-1.3.9/docs/examples/example-example95/PKy.F~Z> KpHangular-1.3.9/docs/examples/example-example95/index-debug.htmlPKy.FuWC? sHangular-1.3.9/docs/examples/example-example95/index-jquery.htmlPKy.F5?C vHangular-1.3.9/docs/examples/example-example95/index-production.htmlPKy.F4DGX8 >zHangular-1.3.9/docs/examples/example-example95/index.htmlPKy.FJTd; r}Hangular-1.3.9/docs/examples/example-example95/manifest.jsonPKy.F*F; /~Hangular-1.3.9/docs/examples/example-example95/protractor.jsPK y.F.hHangular-1.3.9/docs/examples/example-example96/PKy.FR.I> Hangular-1.3.9/docs/examples/example-example96/index-debug.htmlPKy.F? Hangular-1.3.9/docs/examples/example-example96/index-jquery.htmlPKy.FC sHangular-1.3.9/docs/examples/example-example96/index-production.htmlPKy.Fo8 Hangular-1.3.9/docs/examples/example-example96/index.htmlPKy.F[lQ`; 7Hangular-1.3.9/docs/examples/example-example96/manifest.jsonPKy.F1)7 Hangular-1.3.9/docs/examples/example-example96/script.jsPK y.F.Hangular-1.3.9/docs/examples/example-example97/PKy.Fi> HHangular-1.3.9/docs/examples/example-example97/index-debug.htmlPKy.FD ? Hangular-1.3.9/docs/examples/example-example97/index-jquery.htmlPKy.FFw C Hangular-1.3.9/docs/examples/example-example97/index-production.htmlPKy.Fp6U8 Hangular-1.3.9/docs/examples/example-example97/index.htmlPKy.F%Td; Hangular-1.3.9/docs/examples/example-example97/manifest.jsonPKy.FiB; Hangular-1.3.9/docs/examples/example-example97/protractor.jsPK y.F.ΓHangular-1.3.9/docs/examples/example-example98/PKy.F'ω> Hangular-1.3.9/docs/examples/example-example98/index-debug.htmlPKy.FpVH? Hangular-1.3.9/docs/examples/example-example98/index-jquery.htmlPKy.F5C Hangular-1.3.9/docs/examples/example-example98/index-production.htmlPKy.F{8 :Hangular-1.3.9/docs/examples/example-example98/index.htmlPKy.F)Td; $Hangular-1.3.9/docs/examples/example-example98/manifest.jsonPKy.FG5B%; Hangular-1.3.9/docs/examples/example-example98/protractor.jsPK y.F.Hangular-1.3.9/docs/examples/example-example99/PKy.FC}u> ؞Hangular-1.3.9/docs/examples/example-example99/index-debug.htmlPKy.FȎ? Hangular-1.3.9/docs/examples/example-example99/index-jquery.htmlPKy.F C Hangular-1.3.9/docs/examples/example-example99/index-production.htmlPKy.Ft1s8 Hangular-1.3.9/docs/examples/example-example99/index.htmlPKy.F1%Td; Hangular-1.3.9/docs/examples/example-example99/manifest.jsonPKy.FIt; PHangular-1.3.9/docs/examples/example-example99/protractor.jsPK y.F5Hangular-1.3.9/docs/examples/example-guide-concepts-1/PKy.FE Hangular-1.3.9/docs/examples/example-guide-concepts-1/index-debug.htmlPKy.F:720(F qHangular-1.3.9/docs/examples/example-guide-concepts-1/index-jquery.htmlPKy.F-7J Hangular-1.3.9/docs/examples/example-guide-concepts-1/index-production.htmlPKy.F_? ĭHangular-1.3.9/docs/examples/example-guide-concepts-1/index.htmlPKy.F נQVB GHangular-1.3.9/docs/examples/example-guide-concepts-1/manifest.jsonPK y.F5Hangular-1.3.9/docs/examples/example-guide-concepts-2/PKy.F ME [Hangular-1.3.9/docs/examples/example-guide-concepts-2/index-debug.htmlPKy.F1cF mHangular-1.3.9/docs/examples/example-guide-concepts-2/index-jquery.htmlPKy.F-}J Hangular-1.3.9/docs/examples/example-guide-concepts-2/index-production.htmlPKy.F~K? ˶Hangular-1.3.9/docs/examples/example-guide-concepts-2/index.htmlPKy.F1z,R@ ոHangular-1.3.9/docs/examples/example-guide-concepts-2/invoice1.jsPKy.F&.Q[iB Hangular-1.3.9/docs/examples/example-guide-concepts-2/manifest.jsonPK y.F6`Hangular-1.3.9/docs/examples/example-guide-concepts-21/PKy.Fu}A Hangular-1.3.9/docs/examples/example-guide-concepts-21/finance2.jsPKy.FrltF *Hangular-1.3.9/docs/examples/example-guide-concepts-21/index-debug.htmlPKy.FB&G FHangular-1.3.9/docs/examples/example-guide-concepts-21/index-jquery.htmlPKy.F"K xHangular-1.3.9/docs/examples/example-guide-concepts-21/index-production.htmlPKy.FIrr@ Hangular-1.3.9/docs/examples/example-guide-concepts-21/index.htmlPKy.F/+"A Hangular-1.3.9/docs/examples/example-guide-concepts-21/invoice2.jsPKy.F\1c}C 8Hangular-1.3.9/docs/examples/example-guide-concepts-21/manifest.jsonPK y.F5 Hangular-1.3.9/docs/examples/example-guide-concepts-3/PKy.FTuFd@ _Hangular-1.3.9/docs/examples/example-guide-concepts-3/finance3.jsPKy.FKΫsE 1Hangular-1.3.9/docs/examples/example-guide-concepts-3/index-debug.htmlPKy.FkF KHangular-1.3.9/docs/examples/example-guide-concepts-3/index-jquery.htmlPKy.FKJ }Hangular-1.3.9/docs/examples/example-guide-concepts-3/index-production.htmlPKy.FVq? Hangular-1.3.9/docs/examples/example-guide-concepts-3/index.htmlPKy.FSӰ@ Hangular-1.3.9/docs/examples/example-guide-concepts-3/invoice3.jsPKy.Fzc|B 9Hangular-1.3.9/docs/examples/example-guide-concepts-3/manifest.jsonPK y.F4 Hangular-1.3.9/docs/examples/example-input-directive/PKy.FE5 D ^Hangular-1.3.9/docs/examples/example-input-directive/index-debug.htmlPKy.F>NLE Hangular-1.3.9/docs/examples/example-input-directive/index-jquery.htmlPKy.F9S9I Hangular-1.3.9/docs/examples/example-input-directive/index-production.htmlPKy.F/O3> Hangular-1.3.9/docs/examples/example-input-directive/index.htmlPKy.F \jA /Hangular-1.3.9/docs/examples/example-input-directive/manifest.jsonPKy.FquA Hangular-1.3.9/docs/examples/example-input-directive/protractor.jsPK y.F;%Hangular-1.3.9/docs/examples/example-location-hashbang-mode/PKy.FBH ~Hangular-1.3.9/docs/examples/example-location-hashbang-mode/addressBar.jsPKy.FSKA Hangular-1.3.9/docs/examples/example-location-hashbang-mode/app.jsPKy.F{} I Hangular-1.3.9/docs/examples/example-location-hashbang-mode/fakeBrowser.jsPKy.F;"hK (Hangular-1.3.9/docs/examples/example-location-hashbang-mode/index-debug.htmlPKy.F˖|ؿL HHangular-1.3.9/docs/examples/example-location-hashbang-mode/index-jquery.htmlPKy.F;ݾP Hangular-1.3.9/docs/examples/example-location-hashbang-mode/index-production.htmlPKy.FҦfE Hangular-1.3.9/docs/examples/example-location-hashbang-mode/index.htmlPKy.FzH Hangular-1.3.9/docs/examples/example-location-hashbang-mode/manifest.jsonPKy.F~H Hangular-1.3.9/docs/examples/example-location-hashbang-mode/protractor.jsPK y.F8Hangular-1.3.9/docs/examples/example-location-html5-mode/PKy.FBE >Hangular-1.3.9/docs/examples/example-location-html5-mode/addressBar.jsPKy.F0> =Hangular-1.3.9/docs/examples/example-location-html5-mode/app.jsPKy.F{} F jHangular-1.3.9/docs/examples/example-location-html5-mode/fakeBrowser.jsPKy.F19T1bH Hangular-1.3.9/docs/examples/example-location-html5-mode/index-debug.htmlPKy.F\I Hangular-1.3.9/docs/examples/example-location-html5-mode/index-jquery.htmlPKy.FM -Iangular-1.3.9/docs/examples/example-location-html5-mode/index-production.htmlPKy.Fa\"`B oIangular-1.3.9/docs/examples/example-location-html5-mode/index.htmlPKy.FujwE Iangular-1.3.9/docs/examples/example-location-html5-mode/manifest.jsonPKy.FKTnE qIangular-1.3.9/docs/examples/example-location-html5-mode/protractor.jsPK y.F:{Iangular-1.3.9/docs/examples/example-month-input-directive/PKy.FNWJ Iangular-1.3.9/docs/examples/example-month-input-directive/index-debug.htmlPKy.FA6K S Iangular-1.3.9/docs/examples/example-month-input-directive/index-jquery.htmlPKy.FѪ&O Iangular-1.3.9/docs/examples/example-month-input-directive/index-production.htmlPKy.FO*UD Iangular-1.3.9/docs/examples/example-month-input-directive/index.htmlPKy.F&M`pG Iangular-1.3.9/docs/examples/example-month-input-directive/manifest.jsonPKy.FKQH G Iangular-1.3.9/docs/examples/example-month-input-directive/protractor.jsPK y.F;pIangular-1.3.9/docs/examples/example-ng-model-cancel-update/PKy.F` A Iangular-1.3.9/docs/examples/example-ng-model-cancel-update/app.jsPKy.FLK Iangular-1.3.9/docs/examples/example-ng-model-cancel-update/index-debug.htmlPKy.F|E Iangular-1.3.9/docs/examples/example-ng-model-cancel-update/index.htmlPKy.FFa\jH X Iangular-1.3.9/docs/examples/example-ng-model-cancel-update/manifest.jsonPK y.F7*!Iangular-1.3.9/docs/examples/example-ngChange-directive/PKy.FDy.G !Iangular-1.3.9/docs/examples/example-ngChange-directive/index-debug.htmlPKy.F'qH }#Iangular-1.3.9/docs/examples/example-ngChange-directive/index-jquery.htmlPKy.Fk^L %Iangular-1.3.9/docs/examples/example-ngChange-directive/index-production.htmlPKy.FO9N,A 'Iangular-1.3.9/docs/examples/example-ngChange-directive/index.htmlPKy.F _mD )Iangular-1.3.9/docs/examples/example-ngChange-directive/manifest.jsonPKy.F ;D *Iangular-1.3.9/docs/examples/example-ngChange-directive/protractor.jsPK y.F1+Iangular-1.3.9/docs/examples/example-ngController/PKy.Fq(a7 ",Iangular-1.3.9/docs/examples/example-ngController/app.jsPKy.F+s[A -Iangular-1.3.9/docs/examples/example-ngController/index-debug.htmlPKy.FelڮB /Iangular-1.3.9/docs/examples/example-ngController/index-jquery.htmlPKy.FqHF 2Iangular-1.3.9/docs/examples/example-ngController/index-production.htmlPKy.F@UY; 94Iangular-1.3.9/docs/examples/example-ngController/index.htmlPKy.F$u`u> 76Iangular-1.3.9/docs/examples/example-ngController/manifest.jsonPKy.Fy'F> 7Iangular-1.3.9/docs/examples/example-ngController/protractor.jsPK y.F38Iangular-1.3.9/docs/examples/example-ngControllerAs/PKy.FPa<9 9Iangular-1.3.9/docs/examples/example-ngControllerAs/app.jsPKy.F}kApC :Iangular-1.3.9/docs/examples/example-ngControllerAs/index-debug.htmlPKy.FPsD KFIangular-1.3.9/docs/examples/example-ngList-directive-newlines/PKy.FdJN FIangular-1.3.9/docs/examples/example-ngList-directive-newlines/index-debug.htmlPKy.FtmO HIangular-1.3.9/docs/examples/example-ngList-directive-newlines/index-jquery.htmlPKy.FezS {IIangular-1.3.9/docs/examples/example-ngList-directive-newlines/index-production.htmlPKy.FƧyHH JIangular-1.3.9/docs/examples/example-ngList-directive-newlines/index.htmlPKy.F"bdtK NLIangular-1.3.9/docs/examples/example-ngList-directive-newlines/manifest.jsonPKy.F$[n K +MIangular-1.3.9/docs/examples/example-ngList-directive-newlines/protractor.jsPKy.F=i0; YNIangular-1.3.9/docs/examples/example-ngList-directive/app.jsPKy.F7" ]E XOIangular-1.3.9/docs/examples/example-ngList-directive/index-debug.htmlPKy.F}JsZF (QIangular-1.3.9/docs/examples/example-ngList-directive/index-jquery.htmlPKy.F 6|GJ SIangular-1.3.9/docs/examples/example-ngList-directive/index-production.htmlPKy.F[? UIangular-1.3.9/docs/examples/example-ngList-directive/index.htmlPKy.FLGdyB VIangular-1.3.9/docs/examples/example-ngList-directive/manifest.jsonPKy.Fw B WIangular-1.3.9/docs/examples/example-ngList-directive/protractor.jsPK y.F9/YIangular-1.3.9/docs/examples/example-ngMessages-directive/PKy.FܭI YIangular-1.3.9/docs/examples/example-ngMessages-directive/index-debug.htmlPKy.FC]J [Iangular-1.3.9/docs/examples/example-ngMessages-directive/index-jquery.htmlPKy.FGqN g^Iangular-1.3.9/docs/examples/example-ngMessages-directive/index-production.htmlPKy.F#C `Iangular-1.3.9/docs/examples/example-ngMessages-directive/index.htmlPKy.Fv_kF OcIangular-1.3.9/docs/examples/example-ngMessages-directive/manifest.jsonPKy.Fd3[mB "dIangular-1.3.9/docs/examples/example-ngMessages-directive/script.jsPK y.F:dIangular-1.3.9/docs/examples/example-ngModel-getter-setter/PKy.FNBk@ EeIangular-1.3.9/docs/examples/example-ngModel-getter-setter/app.jsPKy.F1/J fIangular-1.3.9/docs/examples/example-ngModel-getter-setter/index-debug.htmlPKy.F:JrK *hIangular-1.3.9/docs/examples/example-ngModel-getter-setter/index-jquery.htmlPKy.FkR_O iIangular-1.3.9/docs/examples/example-ngModel-getter-setter/index-production.htmlPKy.FΛ>0-D kIangular-1.3.9/docs/examples/example-ngModel-getter-setter/index.htmlPKy.FH\iG ^mIangular-1.3.9/docs/examples/example-ngModel-getter-setter/manifest.jsonPK y.FB/nIangular-1.3.9/docs/examples/example-ngModelOptions-directive-blur/PKy.F#(XH nIangular-1.3.9/docs/examples/example-ngModelOptions-directive-blur/app.jsPKy.F<`R oIangular-1.3.9/docs/examples/example-ngModelOptions-directive-blur/index-debug.htmlPKy.FyyS qIangular-1.3.9/docs/examples/example-ngModelOptions-directive-blur/index-jquery.htmlPKy.F%^XW sIangular-1.3.9/docs/examples/example-ngModelOptions-directive-blur/index-production.htmlPKy.F0=`L uIangular-1.3.9/docs/examples/example-ngModelOptions-directive-blur/index.htmlPKy.F\"oO wIangular-1.3.9/docs/examples/example-ngModelOptions-directive-blur/manifest.jsonPKy.F8hWO xIangular-1.3.9/docs/examples/example-ngModelOptions-directive-blur/protractor.jsPK y.FF zIangular-1.3.9/docs/examples/example-ngModelOptions-directive-debounce/PKy.FEL ozIangular-1.3.9/docs/examples/example-ngModelOptions-directive-debounce/app.jsPKy.FކiV v{Iangular-1.3.9/docs/examples/example-ngModelOptions-directive-debounce/index-debug.htmlPKy.FbhͅW c}Iangular-1.3.9/docs/examples/example-ngModelOptions-directive-debounce/index-jquery.htmlPKy.F.[ mIangular-1.3.9/docs/examples/example-ngModelOptions-directive-debounce/index-production.htmlPKy.FjP Iangular-1.3.9/docs/examples/example-ngModelOptions-directive-debounce/index.htmlPKy.Fkw*guS lIangular-1.3.9/docs/examples/example-ngModelOptions-directive-debounce/manifest.jsonPK y.FKTIangular-1.3.9/docs/examples/example-ngModelOptions-directive-getter-setter/PKy.FMQ Iangular-1.3.9/docs/examples/example-ngModelOptions-directive-getter-setter/app.jsPKy.FZ;@[ Iangular-1.3.9/docs/examples/example-ngModelOptions-directive-getter-setter/index-debug.htmlPKy.F^<{T\ ƇIangular-1.3.9/docs/examples/example-ngModelOptions-directive-getter-setter/index-jquery.htmlPKy.FA \p` Iangular-1.3.9/docs/examples/example-ngModelOptions-directive-getter-setter/index-production.htmlPKy.FZ:>U Iangular-1.3.9/docs/examples/example-ngModelOptions-directive-getter-setter/index.htmlPKy.FjOizX KIangular-1.3.9/docs/examples/example-ngModelOptions-directive-getter-setter/manifest.jsonPK y.F6:Iangular-1.3.9/docs/examples/example-ngValue-directive/PKy.F<-jBF Iangular-1.3.9/docs/examples/example-ngValue-directive/index-debug.htmlPKy.Fg^PG Iangular-1.3.9/docs/examples/example-ngValue-directive/index-jquery.htmlPKy.Fk3|rK Iangular-1.3.9/docs/examples/example-ngValue-directive/index-production.htmlPKy.Fro@@ DIangular-1.3.9/docs/examples/example-ngValue-directive/index.htmlPKy.Fu_lC eIangular-1.3.9/docs/examples/example-ngValue-directive/manifest.jsonPKy.F#ܳ=C 5Iangular-1.3.9/docs/examples/example-ngValue-directive/protractor.jsPK y.F5YIangular-1.3.9/docs/examples/example-ngView-directive/PKy.Fa-C Iangular-1.3.9/docs/examples/example-ngView-directive/animations.cssPKy.FCV> JIangular-1.3.9/docs/examples/example-ngView-directive/book.htmlPKy.F5SA Iangular-1.3.9/docs/examples/example-ngView-directive/chapter.htmlPKy.F E Iangular-1.3.9/docs/examples/example-ngView-directive/index-debug.htmlPKy.FBR\1(F IIangular-1.3.9/docs/examples/example-ngView-directive/index-jquery.htmlPKy.F1^<cJ Iangular-1.3.9/docs/examples/example-ngView-directive/index-production.htmlPKy.Ff0? Iangular-1.3.9/docs/examples/example-ngView-directive/index.htmlPKy.F|B )Iangular-1.3.9/docs/examples/example-ngView-directive/manifest.jsonPKy.FJAB Iangular-1.3.9/docs/examples/example-ngView-directive/protractor.jsPKy.Fy͆C}F> bIangular-1.3.9/docs/examples/example-ngView-directive/script.jsPK y.F;KIangular-1.3.9/docs/examples/example-number-input-directive/PKy.F۬dK Iangular-1.3.9/docs/examples/example-number-input-directive/index-debug.htmlPKy.F=L Iangular-1.3.9/docs/examples/example-number-input-directive/index-jquery.htmlPKy.FM%*P ?Iangular-1.3.9/docs/examples/example-number-input-directive/index-production.htmlPKy.FRzE Iangular-1.3.9/docs/examples/example-number-input-directive/index.htmlPKy.FCaqH ݴIangular-1.3.9/docs/examples/example-number-input-directive/manifest.jsonPKy.F%pAH Iangular-1.3.9/docs/examples/example-number-input-directive/protractor.jsPK y.F:Iangular-1.3.9/docs/examples/example-radio-input-directive/PKy.F};J mIangular-1.3.9/docs/examples/example-radio-input-directive/index-debug.htmlPKy.FMOK Iangular-1.3.9/docs/examples/example-radio-input-directive/index-jquery.htmlPKy.Ft'O Iangular-1.3.9/docs/examples/example-radio-input-directive/index-production.htmlPKy.FD TIangular-1.3.9/docs/examples/example-radio-input-directive/index.htmlPKy.Fs_pG Iangular-1.3.9/docs/examples/example-radio-input-directive/manifest.jsonPKy.F1jG ZIangular-1.3.9/docs/examples/example-radio-input-directive/protractor.jsPK y.F9]Iangular-1.3.9/docs/examples/example-text-input-directive/PKy.F<h=I Iangular-1.3.9/docs/examples/example-text-input-directive/index-debug.htmlPKy.FJ Iangular-1.3.9/docs/examples/example-text-input-directive/index-jquery.htmlPKy.F2ZmN Iangular-1.3.9/docs/examples/example-text-input-directive/index-production.htmlPKy.F,hx;C Iangular-1.3.9/docs/examples/example-text-input-directive/index.htmlPKy.F)y_oF aIangular-1.3.9/docs/examples/example-text-input-directive/manifest.jsonPKy.FoaF 4Iangular-1.3.9/docs/examples/example-text-input-directive/protractor.jsPK y.F9Iangular-1.3.9/docs/examples/example-time-input-directive/PKy.Fu-/tI Iangular-1.3.9/docs/examples/example-time-input-directive/index-debug.htmlPKy.F%3J Iangular-1.3.9/docs/examples/example-time-input-directive/index-jquery.htmlPKy.Fj=9N -Iangular-1.3.9/docs/examples/example-time-input-directive/index-production.htmlPKy.FDSorC Iangular-1.3.9/docs/examples/example-time-input-directive/index.htmlPKy.F[[_oF kIangular-1.3.9/docs/examples/example-time-input-directive/manifest.jsonPKy.FcyF >Iangular-1.3.9/docs/examples/example-time-input-directive/protractor.jsPK y.F8Iangular-1.3.9/docs/examples/example-url-input-directive/PKy.Fa* H 'Iangular-1.3.9/docs/examples/example-url-input-directive/index-debug.htmlPKy.F OI cIangular-1.3.9/docs/examples/example-url-input-directive/index-jquery.htmlPKy.FD<M Iangular-1.3.9/docs/examples/example-url-input-directive/index-production.htmlPKy.FF B Iangular-1.3.9/docs/examples/example-url-input-directive/index.htmlPKy.FwO^nE JIangular-1.3.9/docs/examples/example-url-input-directive/manifest.jsonPKy.F;_bE Iangular-1.3.9/docs/examples/example-url-input-directive/protractor.jsPK y.F9Iangular-1.3.9/docs/examples/example-week-input-directive/PKy.FLCZI Iangular-1.3.9/docs/examples/example-week-input-directive/index-debug.htmlPKy.F-: -J hIangular-1.3.9/docs/examples/example-week-input-directive/index-jquery.htmlPKy.F`b4N Iangular-1.3.9/docs/examples/example-week-input-directive/index-production.htmlPKy.FXC Iangular-1.3.9/docs/examples/example-week-input-directive/index.htmlPKy.F-aoF BIangular-1.3.9/docs/examples/example-week-input-directive/manifest.jsonPKy.FyF Iangular-1.3.9/docs/examples/example-week-input-directive/protractor.jsPKy.FO ,&} Iangular-1.3.9/docs/favicon.icoPK y.F#Jangular-1.3.9/docs/img/PKy.F]bH C * #Jangular-1.3.9/docs/img/AngularJS-small.pngPKy.F,uS~/ 0Jangular-1.3.9/docs/img/One_Way_Data_Binding.pngPKy.F(/d/ Jangular-1.3.9/docs/img/Two_Way_Data_Binding.pngPKy.FǍE( hWKangular-1.3.9/docs/img/angular_parts.pngPKy.FŝZf" 4 :Langular-1.3.9/docs/img/angularjs-for-header-only.svgPKy.Fa! 큁ALangular-1.3.9/docs/img/bullet.pngPKy.FWo⫘h) BLangular-1.3.9/docs/img/form_data_flow.pngPKy.F2z^5 Mangular-1.3.9/docs/img/glyphicons-halflings-white.pngPKy.F!_/ R+Mangular-1.3.9/docs/img/glyphicons-halflings.pngPK y.F>2 [Uangular-1.3.9/docs/img/guide/di_sequence_final.pngPKy.F`r=#0 SVangular-1.3.9/docs/img/guide/dom_scope_final.pngPKy.Fz\up/ Xangular-1.3.9/docs/img/guide/forms-debounce.gifPKy.FTbb x5 Xangular-1.3.9/docs/img/guide/forms-update-on-blur.gifPKy.FH0is8 CYangular-1.3.9/docs/img/guide/hashbang_vs_regular_url.jpgPKy.Ffa)ړm0 íYangular-1.3.9/docs/img/guide/scenario_runner.pngPKy.F2N\3 AZangular-1.3.9/docs/img/guide/simple_scope_final.pngPKy.F,-% \angular-1.3.9/docs/img/helloworld.pngPKy.Fvin24* C\angular-1.3.9/docs/img/helloworld_2way.pngPK y.F :w\angular-1.3.9/docs/img/tutorial/PKy.FEZy>G2 xw\angular-1.3.9/docs/img/tutorial/catalog_screen.pngPKy.F,xz/ ]angular-1.3.9/docs/img/tutorial/tutorial_00.pngPKy.F >k l5 r^angular-1.3.9/docs/img/tutorial/tutorial_00_final.pngPKy.F7K/ ^angular-1.3.9/docs/img/tutorial/tutorial_02.pngPKy.F6Oj/ `angular-1.3.9/docs/img/tutorial/tutorial_03.pngPKy.Fga/ bangular-1.3.9/docs/img/tutorial/tutorial_04.pngPKy.Fxϟ/ |dangular-1.3.9/docs/img/tutorial/tutorial_05.pngPKy.F5?0 eangular-1.3.9/docs/img/tutorial/tutorial_05.pptxPKy.F8lkt5 eangular-1.3.9/docs/img/tutorial/tutorial_07_final.pngPKy.FmƔ^DLD8 Whangular-1.3.9/docs/img/tutorial/tutorial_08-09_final.pngPKy.Fb؋T3B38 langular-1.3.9/docs/img/tutorial/tutorial_10-11_final.pngPKy.FpF225 Qoangular-1.3.9/docs/img/tutorial/xhr_service_final.pngPKy.F@1# ~qangular-1.3.9/docs/index-debug.htmlPKy.FoA2$ Дqangular-1.3.9/docs/index-jquery.htmlPKy.F&13( 8qangular-1.3.9/docs/index-production.htmlPKy.F1 qangular-1.3.9/docs/index.htmlPK y.Fqangular-1.3.9/docs/js/PK y.F(;qangular-1.3.9/docs/js/angular-bootstrap/PKy.F#冽s/4 qangular-1.3.9/docs/js/angular-bootstrap/bootstrap.jsPKy.F"%# l8 qangular-1.3.9/docs/js/angular-bootstrap/bootstrap.min.jsPKy.FrDŽ8D< )qangular-1.3.9/docs/js/angular-bootstrap/bootstrap.min.js.mapPKy.F : qangular-1.3.9/docs/js/angular-bootstrap/dropdown-toggle.jsPKy.F:> qangular-1.3.9/docs/js/angular-bootstrap/dropdown-toggle.min.jsPKy.FmAfhB qangular-1.3.9/docs/js/angular-bootstrap/dropdown-toggle.min.js.mapPKy.FifD  rangular-1.3.9/docs/js/docs.jsPKy.F !! "rangular-1.3.9/docs/js/docs.min.jsPKy.F'!]_% 1rangular-1.3.9/docs/js/docs.min.js.mapPKy.FЍp3P! ASrangular-1.3.9/docs/js/nav-data.jsPKy.F k%Y# hrangular-1.3.9/docs/js/pages-data.jsPKy.Fl7& mrangular-1.3.9/docs/js/search-data.jsonPKy.F*u,& 0tangular-1.3.9/docs/js/search-worker.jsPKy.Fxiy* 3tangular-1.3.9/docs/js/search-worker.min.jsPKy.F ߼,. 큮5tangular-1.3.9/docs/js/search-worker.min.js.mapPKy.FT *uangular-1.3.9/docs/partials/api/ng/directive/ngController.htmlPKy.FT" 8 F9uangular-1.3.9/docs/partials/api/ng/directive/ngCopy.htmlPKy.F 7 >uangular-1.3.9/docs/partials/api/ng/directive/ngCsp.htmlPKy.FdO 7 hJuangular-1.3.9/docs/partials/api/ng/directive/ngCut.htmlPKy.FIDS < Ouangular-1.3.9/docs/partials/api/ng/directive/ngDblclick.htmlPKy.FSK< Suangular-1.3.9/docs/partials/api/ng/directive/ngDisabled.htmlPKy.FDO 9 Zuangular-1.3.9/docs/partials/api/ng/directive/ngFocus.htmlPKy.Fw  8 ^uangular-1.3.9/docs/partials/api/ng/directive/ngForm.htmlPKy.FmG %!8 cuangular-1.3.9/docs/partials/api/ng/directive/ngHide.htmlPKy.FV_8 puangular-1.3.9/docs/partials/api/ng/directive/ngHref.htmlPKy.F٦ 7 6 xuangular-1.3.9/docs/partials/api/ng/directive/ngIf.htmlPKy.F4`V1 '; uangular-1.3.9/docs/partials/api/ng/directive/ngInclude.htmlPKy.FN\8 (uangular-1.3.9/docs/partials/api/ng/directive/ngInit.htmlPKy.FJ ; Zuangular-1.3.9/docs/partials/api/ng/directive/ngKeydown.htmlPKy.F3W < uangular-1.3.9/docs/partials/api/ng/directive/ngKeypress.htmlPKy.FD 9 Πuangular-1.3.9/docs/partials/api/ng/directive/ngKeyup.htmlPKy.F&C 8 ԥuangular-1.3.9/docs/partials/api/ng/directive/ngList.htmlPKy.FӇ g%9 Wuangular-1.3.9/docs/partials/api/ng/directive/ngModel.htmlPKy.Fp +@ uangular-1.3.9/docs/partials/api/ng/directive/ngModelOptions.htmlPKy.F07Y/ = >uangular-1.3.9/docs/partials/api/ng/directive/ngMousedown.htmlPKy.FFM > uangular-1.3.9/docs/partials/api/ng/directive/ngMouseenter.htmlPKy.Fv _N > uangular-1.3.9/docs/partials/api/ng/directive/ngMouseleave.htmlPKy.FWK = uuangular-1.3.9/docs/partials/api/ng/directive/ngMousemove.htmlPKy.FM߈7K = +uangular-1.3.9/docs/partials/api/ng/directive/ngMouseover.htmlPKy.F3D ; uangular-1.3.9/docs/partials/api/ng/directive/ngMouseup.htmlPKy.Fd] ? uangular-1.3.9/docs/partials/api/ng/directive/ngNonBindable.htmlPKy.Fi 8 uangular-1.3.9/docs/partials/api/ng/directive/ngOpen.htmlPKy.FoR{Q 9 uangular-1.3.9/docs/partials/api/ng/directive/ngPaste.htmlPKy.Fyi/= uangular-1.3.9/docs/partials/api/ng/directive/ngPluralize.htmlPKy.F< vangular-1.3.9/docs/partials/api/ng/directive/ngReadonly.htmlPKy.FV$1: vangular-1.3.9/docs/partials/api/ng/directive/ngRepeat.htmlPKy.Fc@)< \vangular-1.3.9/docs/partials/api/ng/directive/ngSelected.htmlPKy.F4jK "8 #vangular-1.3.9/docs/partials/api/ng/directive/ngShow.htmlPKy.F(N7 0vangular-1.3.9/docs/partials/api/ng/directive/ngSrc.htmlPKy.FH: 5vangular-1.3.9/docs/partials/api/ng/directive/ngSrcset.htmlPKy.FsI*]9 \9vangular-1.3.9/docs/partials/api/ng/directive/ngStyle.htmlPKy.F6 : ?vangular-1.3.9/docs/partials/api/ng/directive/ngSubmit.htmlPKy.FG w: Gvangular-1.3.9/docs/partials/api/ng/directive/ngSwitch.htmlPKy.F> (Rvangular-1.3.9/docs/partials/api/ng/directive/ngTransclude.htmlPKy.FmcJFx9 Xvangular-1.3.9/docs/partials/api/ng/directive/ngValue.htmlPKy.Ft 8 Y`vangular-1.3.9/docs/partials/api/ng/directive/script.htmlPKy.Fom$98 rfvangular-1.3.9/docs/partials/api/ng/directive/select.htmlPKy.F^\+: wvangular-1.3.9/docs/partials/api/ng/directive/textarea.htmlPK y.F*}vangular-1.3.9/docs/partials/api/ng/filter/PKy.Fd . #~vangular-1.3.9/docs/partials/api/ng/filter.htmlPKy.F @ 7 vangular-1.3.9/docs/partials/api/ng/filter/currency.htmlPKy.F Mw R"3 vangular-1.3.9/docs/partials/api/ng/filter/date.htmlPKy.F9] "5 vangular-1.3.9/docs/partials/api/ng/filter/filter.htmlPKy.F~q 3 Qvangular-1.3.9/docs/partials/api/ng/filter/json.htmlPKy.FH"R6 #vangular-1.3.9/docs/partials/api/ng/filter/limitTo.htmlPKy.F7.8 Kvangular-1.3.9/docs/partials/api/ng/filter/lowercase.htmlPKy.FC~@5 vangular-1.3.9/docs/partials/api/ng/filter/number.htmlPKy.F/R #6 vangular-1.3.9/docs/partials/api/ng/filter/orderBy.htmlPKy.FPJ8 vangular-1.3.9/docs/partials/api/ng/filter/uppercase.htmlPK y.F,>vangular-1.3.9/docs/partials/api/ng/function/PKy.F&-0 vangular-1.3.9/docs/partials/api/ng/function.htmlPKy.FvA = vangular-1.3.9/docs/partials/api/ng/function/angular.bind.htmlPKy.F;(U]cB vangular-1.3.9/docs/partials/api/ng/function/angular.bootstrap.htmlPKy.Fpw= vangular-1.3.9/docs/partials/api/ng/function/angular.copy.htmlPKy.F8Y_" @ vangular-1.3.9/docs/partials/api/ng/function/angular.element.htmlPKy.F˜|d ? vangular-1.3.9/docs/partials/api/ng/function/angular.equals.htmlPKy.F0 ? vangular-1.3.9/docs/partials/api/ng/function/angular.extend.htmlPKy.F%S @ vangular-1.3.9/docs/partials/api/ng/function/angular.forEach.htmlPKy.F$Z0A vangular-1.3.9/docs/partials/api/ng/function/angular.fromJson.htmlPKy.FsFA vangular-1.3.9/docs/partials/api/ng/function/angular.identity.htmlPKy.FnA xvangular-1.3.9/docs/partials/api/ng/function/angular.injector.htmlPKy.Ff@ Uwangular-1.3.9/docs/partials/api/ng/function/angular.isArray.htmlPKy.F24T? wangular-1.3.9/docs/partials/api/ng/function/angular.isDate.htmlPKy.F­B wangular-1.3.9/docs/partials/api/ng/function/angular.isDefined.htmlPKy.FTLB wangular-1.3.9/docs/partials/api/ng/function/angular.isElement.htmlPKy.FC Jwangular-1.3.9/docs/partials/api/ng/function/angular.isFunction.htmlPKy.F-A wangular-1.3.9/docs/partials/api/ng/function/angular.isNumber.htmlPKy.F FA wangular-1.3.9/docs/partials/api/ng/function/angular.isObject.htmlPKy.F%aA Iwangular-1.3.9/docs/partials/api/ng/function/angular.isString.htmlPKy.FZ5`D wangular-1.3.9/docs/partials/api/ng/function/angular.isUndefined.htmlPKy.FXTJB #wangular-1.3.9/docs/partials/api/ng/function/angular.lowercase.htmlPKy.F J&? &wangular-1.3.9/docs/partials/api/ng/function/angular.module.htmlPKy.F,L4~= x-wangular-1.3.9/docs/partials/api/ng/function/angular.noop.htmlPKy.FI+|iL 0wangular-1.3.9/docs/partials/api/ng/function/angular.reloadWithDebugInfo.htmlPKy.FNJ  ? 2wangular-1.3.9/docs/partials/api/ng/function/angular.toJson.htmlPKy.FF B 6wangular-1.3.9/docs/partials/api/ng/function/angular.uppercase.htmlPK y.F)9wangular-1.3.9/docs/partials/api/ng/input/PKy.F8N- D:wangular-1.3.9/docs/partials/api/ng/input.htmlPKy.F%K6Q= V>wangular-1.3.9/docs/partials/api/ng/input/input[checkbox].htmlPKy.F]I !9 Dwangular-1.3.9/docs/partials/api/ng/input/input[date].htmlPKy.F~Ӆ !C Owangular-1.3.9/docs/partials/api/ng/input/input[datetime-local].htmlPKy.F* !: Zwangular-1.3.9/docs/partials/api/ng/input/input[email].htmlPKy.F&Kr 6!: ewangular-1.3.9/docs/partials/api/ng/input/input[month].htmlPKy.Fܕ #; owangular-1.3.9/docs/partials/api/ng/input/input[number].htmlPKy.F(K%c: ywangular-1.3.9/docs/partials/api/ng/input/input[radio].htmlPKy.F塩m w"9 wangular-1.3.9/docs/partials/api/ng/input/input[text].htmlPKy.F;8 !9 wangular-1.3.9/docs/partials/api/ng/input/input[time].htmlPKy.FoBT !8 wangular-1.3.9/docs/partials/api/ng/input/input[url].htmlPKy.FHX 9 wangular-1.3.9/docs/partials/api/ng/input/input[week].htmlPK y.F*zwangular-1.3.9/docs/partials/api/ng/object/PKy.F[ó. ªwangular-1.3.9/docs/partials/api/ng/object.htmlPKy.F~ēn> #wangular-1.3.9/docs/partials/api/ng/object/angular.version.htmlPK y.F,wangular-1.3.9/docs/partials/api/ng/provider/PKy.F(l0 Gwangular-1.3.9/docs/partials/api/ng/provider.htmlPKy.F_F 4wangular-1.3.9/docs/partials/api/ng/provider/$anchorScrollProvider.htmlPKy.FchvPA owangular-1.3.9/docs/partials/api/ng/provider/$animateProvider.htmlPKy.F2`A Twangular-1.3.9/docs/partials/api/ng/provider/$compileProvider.htmlPKy.F2 D lwangular-1.3.9/docs/partials/api/ng/provider/$controllerProvider.htmlPKy.FU @ wangular-1.3.9/docs/partials/api/ng/provider/$filterProvider.htmlPKy.F2 J?X> wangular-1.3.9/docs/partials/api/ng/provider/$httpProvider.htmlPKy.FVE wangular-1.3.9/docs/partials/api/ng/provider/$interpolateProvider.htmlPKy.FV5n{B wangular-1.3.9/docs/partials/api/ng/provider/$locationProvider.htmlPKy.F$s=j= wangular-1.3.9/docs/partials/api/ng/provider/$logProvider.htmlPKy.F ? Xwangular-1.3.9/docs/partials/api/ng/provider/$parseProvider.htmlPKy.FC wangular-1.3.9/docs/partials/api/ng/provider/$rootScopeProvider.htmlPKy.F\E wangular-1.3.9/docs/partials/api/ng/provider/$sceDelegateProvider.htmlPKy.Fyܩ= -wangular-1.3.9/docs/partials/api/ng/provider/$sceProvider.htmlPK y.F+Awangular-1.3.9/docs/partials/api/ng/service/PKy.F !/ wangular-1.3.9/docs/partials/api/ng/service.htmlPKy.FЪH = xangular-1.3.9/docs/partials/api/ng/service/$anchorScroll.htmlPKy.FB@;08 xangular-1.3.9/docs/partials/api/ng/service/$animate.htmlPKy.FW2 = 7xangular-1.3.9/docs/partials/api/ng/service/$cacheFactory.htmlPKy.F}C38 #xangular-1.3.9/docs/partials/api/ng/service/$compile.htmlPKy.F;T ; #Xxangular-1.3.9/docs/partials/api/ng/service/$controller.htmlPKy.FJ 5 9 ]xangular-1.3.9/docs/partials/api/ng/service/$document.htmlPKy.FӯS A axangular-1.3.9/docs/partials/api/ng/service/$exceptionHandler.htmlPKy.Fc˘ 7 xgxangular-1.3.9/docs/partials/api/ng/service/$filter.htmlPKy.Fh4'P5 lxangular-1.3.9/docs/partials/api/ng/service/$http.htmlPKy.F\< Cxangular-1.3.9/docs/partials/api/ng/service/$httpBackend.htmlPKy.FyK 8#< ~xangular-1.3.9/docs/partials/api/ng/service/$interpolate.htmlPKy.F; r w#9 xangular-1.3.9/docs/partials/api/ng/service/$interval.htmlPKy.FA%k&7 {xangular-1.3.9/docs/partials/api/ng/service/$locale.htmlPKy.FKc ?89 xangular-1.3.9/docs/partials/api/ng/service/$location.htmlPKy.Fp@4 'xangular-1.3.9/docs/partials/api/ng/service/$log.htmlPKy.F> 6 xangular-1.3.9/docs/partials/api/ng/service/$parse.htmlPKy.F8>2 xangular-1.3.9/docs/partials/api/ng/service/$q.htmlPKy.F yangular-1.3.9/docs/partials/api/ng/service/$templateCache.htmlPKy.FW(> @ yangular-1.3.9/docs/partials/api/ng/service/$templateRequest.htmlPKy.Fc#V8 uyangular-1.3.9/docs/partials/api/ng/service/$timeout.htmlPKy.F{ڗ# 7 $yangular-1.3.9/docs/partials/api/ng/service/$window.htmlPK y.F(N*yangular-1.3.9/docs/partials/api/ng/type/PKy.FGa} , *yangular-1.3.9/docs/partials/api/ng/type.htmlPKy.F{\@ O/yangular-1.3.9/docs/partials/api/ng/type/$cacheFactory.Cache.htmlPKy.FԝtJ 6yangular-1.3.9/docs/partials/api/ng/type/$compile.directive.Attributes.htmlPKy.FP[G#= (?yangular-1.3.9/docs/partials/api/ng/type/$rootScope.Scope.htmlPKy.F!r2; byangular-1.3.9/docs/partials/api/ng/type/angular.Module.htmlPKy.F ?@ kyangular-1.3.9/docs/partials/api/ng/type/form.FormController.htmlPKy.FA!pF syangular-1.3.9/docs/partials/api/ng/type/ngModel.NgModelController.htmlPK y.F*Syangular-1.3.9/docs/partials/api/ngAnimate/PKy.FoM>U. yangular-1.3.9/docs/partials/api/ngAnimate.htmlPK y.F35yangular-1.3.9/docs/partials/api/ngAnimate/provider/PKy.FM0W&O7 yangular-1.3.9/docs/partials/api/ngAnimate/provider.htmlPKy.Fpx:H :yangular-1.3.9/docs/partials/api/ngAnimate/provider/$animateProvider.htmlPK y.F24yangular-1.3.9/docs/partials/api/ngAnimate/service/PKy.F܏L6 yangular-1.3.9/docs/partials/api/ngAnimate/service.htmlPKy.Fs? yangular-1.3.9/docs/partials/api/ngAnimate/service/$animate.htmlPK y.F'yangular-1.3.9/docs/partials/api/ngAria/PKy.Fn+ yangular-1.3.9/docs/partials/api/ngAria.htmlPK y.F0@yangular-1.3.9/docs/partials/api/ngAria/provider/PKy.F>L4 yangular-1.3.9/docs/partials/api/ngAria/provider.htmlPKy.FF4jM B yangular-1.3.9/docs/partials/api/ngAria/provider/$ariaProvider.htmlPK y.F/yangular-1.3.9/docs/partials/api/ngAria/service/PKy.F's3 yangular-1.3.9/docs/partials/api/ngAria/service.htmlPKy.F6 9 myangular-1.3.9/docs/partials/api/ngAria/service/$aria.htmlPK y.F*yangular-1.3.9/docs/partials/api/ngCookies/PKy.F\ . yangular-1.3.9/docs/partials/api/ngCookies.htmlPK y.F2yangular-1.3.9/docs/partials/api/ngCookies/service/PKy.Fgf6 yangular-1.3.9/docs/partials/api/ngCookies/service.htmlPKy.FM(C yangular-1.3.9/docs/partials/api/ngCookies/service/$cookieStore.htmlPKy.F: ? _yangular-1.3.9/docs/partials/api/ngCookies/service/$cookies.htmlPK y.F+yangular-1.3.9/docs/partials/api/ngMessages/PKy.F:LH'/ yangular-1.3.9/docs/partials/api/ngMessages.htmlPK y.F5zangular-1.3.9/docs/partials/api/ngMessages/directive/PKy.FZ9 zangular-1.3.9/docs/partials/api/ngMessages/directive.htmlPKy.F-`% C 4zangular-1.3.9/docs/partials/api/ngMessages/directive/ngMessage.htmlPKy.F\}qD zangular-1.3.9/docs/partials/api/ngMessages/directive/ngMessages.htmlPK y.F'zangular-1.3.9/docs/partials/api/ngMock/PKy.F>ƖR+ Mzangular-1.3.9/docs/partials/api/ngMock.htmlPK y.F0<zangular-1.3.9/docs/partials/api/ngMock/function/PKy.F|mI4 zangular-1.3.9/docs/partials/api/ngMock/function.htmlPKy.FɊegF Yzangular-1.3.9/docs/partials/api/ngMock/function/angular.mock.dump.htmlPKy.FLLvwt{H 4"zangular-1.3.9/docs/partials/api/ngMock/function/angular.mock.inject.htmlPKy.F+ H *zangular-1.3.9/docs/partials/api/ngMock/function/angular.mock.module.htmlPK y.F..zangular-1.3.9/docs/partials/api/ngMock/object/PKy.F?2 .zangular-1.3.9/docs/partials/api/ngMock/object.htmlPKy.Fl? S0zangular-1.3.9/docs/partials/api/ngMock/object/angular.mock.htmlPK y.F0}2zangular-1.3.9/docs/partials/api/ngMock/provider/PKy.F߸R4 2zangular-1.3.9/docs/partials/api/ngMock/provider.htmlPKy.F=bxC N A4zangular-1.3.9/docs/partials/api/ngMock/provider/$exceptionHandlerProvider.htmlPK y.F/9zangular-1.3.9/docs/partials/api/ngMock/service/PKy.FEG'u-3 M9zangular-1.3.9/docs/partials/api/ngMock/service.htmlPKy.F_ @E #DA zangular-1.3.9/docs/partials/api/ngResource/service/$resource.htmlPK y.F(nzangular-1.3.9/docs/partials/api/ngRoute/PKy.F*cO, zangular-1.3.9/docs/partials/api/ngRoute.htmlPK y.F2qzangular-1.3.9/docs/partials/api/ngRoute/directive/PKy.FmU$x6 zangular-1.3.9/docs/partials/api/ngRoute/directive.htmlPKy.Fv 8%= zangular-1.3.9/docs/partials/api/ngRoute/directive/ngView.htmlPK y.F1 zangular-1.3.9/docs/partials/api/ngRoute/provider/PKy.Fy65 Xzangular-1.3.9/docs/partials/api/ngRoute/provider.htmlPKy.F:G $D zangular-1.3.9/docs/partials/api/ngRoute/provider/$routeProvider.htmlPK y.F0zangular-1.3.9/docs/partials/api/ngRoute/service/PKy.FUo4 zangular-1.3.9/docs/partials/api/ngRoute/service.htmlPKy.FZF h+; zangular-1.3.9/docs/partials/api/ngRoute/service/$route.htmlPKy.F@p7 A zangular-1.3.9/docs/partials/api/ngRoute/service/$routeParams.htmlPK y.F+4zangular-1.3.9/docs/partials/api/ngSanitize/PKy.FZFj / }zangular-1.3.9/docs/partials/api/ngSanitize.htmlPK y.F2Dzangular-1.3.9/docs/partials/api/ngSanitize/filter/PKy.FGI.36 zangular-1.3.9/docs/partials/api/ngSanitize/filter.htmlPKy.F !D>< zangular-1.3.9/docs/partials/api/ngSanitize/filter/linky.htmlPK y.F3zangular-1.3.9/docs/partials/api/ngSanitize/service/PKy.F9`*07 zangular-1.3.9/docs/partials/api/ngSanitize/service.htmlPKy.F<`Y ^A zangular-1.3.9/docs/partials/api/ngSanitize/service/$sanitize.htmlPK y.F(zangular-1.3.9/docs/partials/api/ngTouch/PKy.F*, Lzangular-1.3.9/docs/partials/api/ngTouch.htmlPK y.F2gzangular-1.3.9/docs/partials/api/ngTouch/directive/PKy.Fl9-6 zangular-1.3.9/docs/partials/api/ngTouch/directive.htmlPKy.Fd] > Hzangular-1.3.9/docs/partials/api/ngTouch/directive/ngClick.htmlPKy.Fİ^ B s{angular-1.3.9/docs/partials/api/ngTouch/directive/ngSwipeLeft.htmlPKy.F(q7 C {angular-1.3.9/docs/partials/api/ngTouch/directive/ngSwipeRight.htmlPK y.F0z{angular-1.3.9/docs/partials/api/ngTouch/service/PKy.Fʀ 4 {angular-1.3.9/docs/partials/api/ngTouch/service.htmlPKy.Fb ; I{angular-1.3.9/docs/partials/api/ngTouch/service/$swipe.htmlPK y.F"m{angular-1.3.9/docs/partials/error/PKy.Fq?(& {angular-1.3.9/docs/partials/error.htmlPK y.F+{angular-1.3.9/docs/partials/error/$animate/PKy.FUc/ {angular-1.3.9/docs/partials/error/$animate.htmlPKy.F{J#7 {angular-1.3.9/docs/partials/error/$animate/notcsel.htmlPK y.F0{angular-1.3.9/docs/partials/error/$cacheFactory/PKy.F# ^4 & {angular-1.3.9/docs/partials/error/$cacheFactory.htmlPKy.FRhW8 !{angular-1.3.9/docs/partials/error/$cacheFactory/iid.htmlPK y.F+2${angular-1.3.9/docs/partials/error/$compile/PKy.Fw[/ {${angular-1.3.9/docs/partials/error/$compile.htmlPKy.Fkgg. 5 3'{angular-1.3.9/docs/partials/error/$compile/ctreq.htmlPKy.F\NJ4 R+{angular-1.3.9/docs/partials/error/$compile/iscp.htmlPKy.F?Y 8 .{angular-1.3.9/docs/partials/error/$compile/multidir.htmlPKy.F# sg; 1{angular-1.3.9/docs/partials/error/$compile/nodomevents.htmlPKy.FBӊ9 o5{angular-1.3.9/docs/partials/error/$compile/nonassign.htmlPKy.F"8 `9{angular-1.3.9/docs/partials/error/$compile/selmulti.htmlPKy.FM,6 <{angular-1.3.9/docs/partials/error/$compile/tpload.htmlPKy.FonzLn 5 ?{angular-1.3.9/docs/partials/error/$compile/tplrt.htmlPKy.FFX7 SD{angular-1.3.9/docs/partials/error/$compile/uterdir.htmlPK y.F.G{angular-1.3.9/docs/partials/error/$controller/PKy.F>e2 H{angular-1.3.9/docs/partials/error/$controller.htmlPKy.FF|L8 I{angular-1.3.9/docs/partials/error/$controller/noscp.htmlPK y.F(L{angular-1.3.9/docs/partials/error/$http/PKy.Fb, L{angular-1.3.9/docs/partials/error/$http.htmlPKy.F% kt3 N{angular-1.3.9/docs/partials/error/$http/badreq.htmlPK y.F,Q{angular-1.3.9/docs/partials/error/$injector/PKy.F|ķ0 Q{angular-1.3.9/docs/partials/error/$injector.htmlPKy.FM<;j5 nT{angular-1.3.9/docs/partials/error/$injector/cdep.htmlPKy.Fe5 W{angular-1.3.9/docs/partials/error/$injector/itkn.htmlPKy.F>x9 Z{angular-1.3.9/docs/partials/error/$injector/modulerr.htmlPKy.F[6 ^{angular-1.3.9/docs/partials/error/$injector/nomod.htmlPKy.FG 畃5 4c{angular-1.3.9/docs/partials/error/$injector/pget.htmlPKy.Fh9 f{angular-1.3.9/docs/partials/error/$injector/strictdi.htmlPKy.FCq6 9j{angular-1.3.9/docs/partials/error/$injector/undef.htmlPKy.F,f8~ 5 Mm{angular-1.3.9/docs/partials/error/$injector/unpr.htmlPK y.F/.r{angular-1.3.9/docs/partials/error/$interpolate/PKy.FK 3 {r{angular-1.3.9/docs/partials/error/$interpolate.htmlPKy.Fn: `t{angular-1.3.9/docs/partials/error/$interpolate/interr.htmlPKy.F]sz < \v{angular-1.3.9/docs/partials/error/$interpolate/noconcat.htmlPK y.F,@y{angular-1.3.9/docs/partials/error/$location/PKy.F*0 y{angular-1.3.9/docs/partials/error/$location.htmlPKy.F bG9 {{angular-1.3.9/docs/partials/error/$location/ipthprfx.htmlPKy.F9 ~{angular-1.3.9/docs/partials/error/$location/isrcharg.htmlPKy.F?d 7 D{angular-1.3.9/docs/partials/error/$location/nobase.htmlPKy.F}&7:8 {angular-1.3.9/docs/partials/error/$location/nostate.htmlPK y.F){angular-1.3.9/docs/partials/error/$parse/PKy.Fs*- ω{angular-1.3.9/docs/partials/error/$parse.htmlPKy.FJ E 5 T{angular-1.3.9/docs/partials/error/$parse/isecdom.htmlPKy.F |4 S{angular-1.3.9/docs/partials/error/$parse/isecff.htmlPKy.F*5 1{angular-1.3.9/docs/partials/error/$parse/isecfld.htmlPKy.F4 y{angular-1.3.9/docs/partials/error/$parse/isecfn.htmlPKy.Fðw5 {angular-1.3.9/docs/partials/error/$parse/isecobj.htmlPKy.F% 8 P{angular-1.3.9/docs/partials/error/$parse/isecwindow.htmlPKy.Fݏ}h4 Q{angular-1.3.9/docs/partials/error/$parse/lexerr.htmlPKy.F3 4 {angular-1.3.9/docs/partials/error/$parse/syntax.htmlPKy.F0_2 O{angular-1.3.9/docs/partials/error/$parse/ueoe.htmlPK y.F%{angular-1.3.9/docs/partials/error/$q/PKy.FM_) ߦ{angular-1.3.9/docs/partials/error/$q.htmlPKy.Fv 1 Ȩ{angular-1.3.9/docs/partials/error/$q/norslvr.htmlPKy.FIc|`0 4{angular-1.3.9/docs/partials/error/$q/qcycle.htmlPK y.F,{angular-1.3.9/docs/partials/error/$resource/PKy.F>3E0 <{angular-1.3.9/docs/partials/error/$resource.htmlPKy.FUx8 {angular-1.3.9/docs/partials/error/$resource/badargs.htmlPKy.FBH7 {angular-1.3.9/docs/partials/error/$resource/badcfg.htmlPKy.F <: {angular-1.3.9/docs/partials/error/$resource/badmember.htmlPKy.F21:a8 m{angular-1.3.9/docs/partials/error/$resource/badname.htmlPK y.F-{angular-1.3.9/docs/partials/error/$rootScope/PKy.Fer1 {angular-1.3.9/docs/partials/error/$rootScope.htmlPKy.FyЛX8 {angular-1.3.9/docs/partials/error/$rootScope/infdig.htmlPKy.FJ& 6=|angular-1.3.9/docs/partials/guide.htmlPKy.Fi'0 gU|angular-1.3.9/docs/partials/guide/$location.htmlPKy.F7F4 .}|angular-1.3.9/docs/partials/guide/accessibility.htmlPKy.F/1 Ǖ|angular-1.3.9/docs/partials/guide/animations.htmlPKy.FX @0 |angular-1.3.9/docs/partials/guide/bootstrap.htmlPKy.FnK/ T|angular-1.3.9/docs/partials/guide/compiler.htmlPKy.FbHv[/ j|angular-1.3.9/docs/partials/guide/concepts.htmlPKy.F%cKxB1 |angular-1.3.9/docs/partials/guide/controller.htmlPKy.FXv 2 |angular-1.3.9/docs/partials/guide/css-styling.htmlPKy.F[Oh\8 2 }angular-1.3.9/docs/partials/guide/databinding.htmlPKy.F`8) K}angular-1.3.9/docs/partials/guide/di.htmlPKy.Fe60 X}angular-1.3.9/docs/partials/guide/directive.htmlPKy.FW2 R}angular-1.3.9/docs/partials/guide/e2e-testing.htmlPKy.F>F1 [}angular-1.3.9/docs/partials/guide/expression.htmlPKy.F,ƿ& %- q}angular-1.3.9/docs/partials/guide/filter.htmlPKy.FETiHl, Y}}angular-1.3.9/docs/partials/guide/forms.htmlPKy.FЉ \+ }angular-1.3.9/docs/partials/guide/i18n.htmlPKy.F~) $}angular-1.3.9/docs/partials/guide/ie.htmlPKy.FMT] b3 8}angular-1.3.9/docs/partials/guide/introduction.htmlPKy.F@oWF0 +}angular-1.3.9/docs/partials/guide/migration.htmlPKy.Fӵ2t1- }angular-1.3.9/docs/partials/guide/module.htmlPKy.F'4 1 ~angular-1.3.9/docs/partials/guide/production.htmlPKy.F2(6I0 ~angular-1.3.9/docs/partials/guide/providers.htmlPKy.Fr"f, K1~angular-1.3.9/docs/partials/guide/scope.htmlPKy.Ft\ / T~angular-1.3.9/docs/partials/guide/security.htmlPKy.Fd $/ NZ~angular-1.3.9/docs/partials/guide/services.htmlPKy.FoS9 0 h~angular-1.3.9/docs/partials/guide/templates.htmlPKy.FhGhK3 Em~angular-1.3.9/docs/partials/guide/unit-testing.htmlPK y.F!~angular-1.3.9/docs/partials/misc/PKy.FnH2% M~angular-1.3.9/docs/partials/misc.htmlPKy.Fda 0 ~angular-1.3.9/docs/partials/misc/contribute.htmlPKy.Fonn <1 Օ~angular-1.3.9/docs/partials/misc/downloading.htmlPKy.FY|95) :~angular-1.3.9/docs/partials/misc/faq.htmlPKy.F;K - ~angular-1.3.9/docs/partials/misc/started.htmlPK y.F%ļ~angular-1.3.9/docs/partials/tutorial/PKy.Fu\e?o/) ~angular-1.3.9/docs/partials/tutorial.htmlPKy.F5Y 1 ~angular-1.3.9/docs/partials/tutorial/step_00.htmlPKy.FX1 ~angular-1.3.9/docs/partials/tutorial/step_01.htmlPKy.F )/1 ~angular-1.3.9/docs/partials/tutorial/step_02.htmlPKy.F+"KO%1 .~angular-1.3.9/docs/partials/tutorial/step_03.htmlPKy.F dx 1 angular-1.3.9/docs/partials/tutorial/step_04.htmlPKy.F!shq31 angular-1.3.9/docs/partials/tutorial/step_05.htmlPKy.F "\1 $angular-1.3.9/docs/partials/tutorial/step_06.htmlPKy.FEiy@1 ,angular-1.3.9/docs/partials/tutorial/step_07.htmlPKy.F y 1 Eangular-1.3.9/docs/partials/tutorial/step_08.htmlPKy.FY1 @ ܘangular-1.3.9/docs/ptore2e/example-$route-service/jquery_test.jsPK y.F5angular-1.3.9/docs/ptore2e/example-NgModelController/PKy.F[7Q/D ۚangular-1.3.9/docs/ptore2e/example-NgModelController/default_test.jsPKy.F'6C angular-1.3.9/docs/ptore2e/example-NgModelController/jquery_test.jsPK y.F<angular-1.3.9/docs/ptore2e/example-checkbox-input-directive/PKy.Fzn8MK Rangular-1.3.9/docs/ptore2e/example-checkbox-input-directive/default_test.jsPKy.F2TJ ٠angular-1.3.9/docs/ptore2e/example-checkbox-input-directive/jquery_test.jsPK y.F8dangular-1.3.9/docs/ptore2e/example-date-input-directive/PKy.Fm{umG angular-1.3.9/docs/ptore2e/example-date-input-directive/default_test.jsPKy.FO1{tF angular-1.3.9/docs/ptore2e/example-date-input-directive/jquery_test.jsPK y.FAangular-1.3.9/docs/ptore2e/example-datetimelocal-input-directive/PKy.F)"7P angular-1.3.9/docs/ptore2e/example-datetimelocal-input-directive/default_test.jsPKy.F7UJO angular-1.3.9/docs/ptore2e/example-datetimelocal-input-directive/jquery_test.jsPK y.F9angular-1.3.9/docs/ptore2e/example-email-input-directive/PKy.F>͹KKH jangular-1.3.9/docs/ptore2e/example-email-input-directive/default_test.jsPKy.FSvQ$G +angular-1.3.9/docs/ptore2e/example-email-input-directive/jquery_test.jsPK y.F/angular-1.3.9/docs/ptore2e/example-example.csp/PKy.F]p > >angular-1.3.9/docs/ptore2e/example-example.csp/default_test.jsPKy.FO̠ = ]angular-1.3.9/docs/ptore2e/example-example.csp/jquery_test.jsPK y.F.angular-1.3.9/docs/ptore2e/example-example100/PKy.F\\= ͻangular-1.3.9/docs/ptore2e/example-example100/default_test.jsPKy.FV1b!< angular-1.3.9/docs/ptore2e/example-example100/jquery_test.jsPK y.F.`angular-1.3.9/docs/ptore2e/example-example101/PKy.F,= angular-1.3.9/docs/ptore2e/example-example101/default_test.jsPKy.F< angular-1.3.9/docs/ptore2e/example-example101/jquery_test.jsPK y.F.Uangular-1.3.9/docs/ptore2e/example-example102/PKy.FĠV= angular-1.3.9/docs/ptore2e/example-example102/default_test.jsPKy.F ]< angular-1.3.9/docs/ptore2e/example-example102/jquery_test.jsPK y.F.angular-1.3.9/docs/ptore2e/example-example105/PKy.F#g= angular-1.3.9/docs/ptore2e/example-example105/default_test.jsPKy.Fde< bangular-1.3.9/docs/ptore2e/example-example105/jquery_test.jsPK y.F.angular-1.3.9/docs/ptore2e/example-example106/PKy.F8o= angular-1.3.9/docs/ptore2e/example-example106/default_test.jsPKy.F+v< \angular-1.3.9/docs/ptore2e/example-example106/jquery_test.jsPK y.F.angular-1.3.9/docs/ptore2e/example-example110/PKy.Fm= angular-1.3.9/docs/ptore2e/example-example110/default_test.jsPKy.F,]v< angular-1.3.9/docs/ptore2e/example-example110/jquery_test.jsPK y.F.angular-1.3.9/docs/ptore2e/example-example111/PKy.F= angular-1.3.9/docs/ptore2e/example-example111/default_test.jsPKy.Fo< _angular-1.3.9/docs/ptore2e/example-example111/jquery_test.jsPK y.F.angular-1.3.9/docs/ptore2e/example-example112/PKy.F&Pp*= angular-1.3.9/docs/ptore2e/example-example112/default_test.jsPKy.Fȼ0< angular-1.3.9/docs/ptore2e/example-example112/jquery_test.jsPK y.F.>angular-1.3.9/docs/ptore2e/example-example113/PKy.F$F= angular-1.3.9/docs/ptore2e/example-example113/default_test.jsPKy.FsZ\< angular-1.3.9/docs/ptore2e/example-example113/jquery_test.jsPK y.F-angular-1.3.9/docs/ptore2e/example-example23/PKy.FS/< angular-1.3.9/docs/ptore2e/example-example23/default_test.jsPKy.Fc{6; angular-1.3.9/docs/ptore2e/example-example23/jquery_test.jsPK y.F-1angular-1.3.9/docs/ptore2e/example-example24/PKy.FW͛< |angular-1.3.9/docs/ptore2e/example-example24/default_test.jsPKy.Fǃ; angular-1.3.9/docs/ptore2e/example-example24/jquery_test.jsPK y.F-angular-1.3.9/docs/ptore2e/example-example25/PKy.F{E4< angular-1.3.9/docs/ptore2e/example-example25/default_test.jsPKy.F=: ; langular-1.3.9/docs/ptore2e/example-example25/jquery_test.jsPK y.F-angular-1.3.9/docs/ptore2e/example-example27/PKy.F\lHS< Zangular-1.3.9/docs/ptore2e/example-example27/default_test.jsPKy.F&(NZ; angular-1.3.9/docs/ptore2e/example-example27/jquery_test.jsPK y.F-angular-1.3.9/docs/ptore2e/example-example39/PKy.Ftk< angular-1.3.9/docs/ptore2e/example-example39/default_test.jsPKy.Fd"; `angular-1.3.9/docs/ptore2e/example-example39/jquery_test.jsPK y.F-angular-1.3.9/docs/ptore2e/example-example40/PKy.F< !angular-1.3.9/docs/ptore2e/example-example63/default_test.jsPKy.F&KE; o"angular-1.3.9/docs/ptore2e/example-example63/jquery_test.jsPK y.F-#angular-1.3.9/docs/ptore2e/example-example64/PKy.F=V?< $angular-1.3.9/docs/ptore2e/example-example64/default_test.jsPKy.F_;ۍ; o%angular-1.3.9/docs/ptore2e/example-example64/jquery_test.jsPK y.F-&angular-1.3.9/docs/ptore2e/example-example65/PKy.F < 'angular-1.3.9/docs/ptore2e/example-example65/default_test.jsPKy.FJ; p(angular-1.3.9/docs/ptore2e/example-example65/jquery_test.jsPK y.F-)angular-1.3.9/docs/ptore2e/example-example66/PKy.F̏< *angular-1.3.9/docs/ptore2e/example-example66/default_test.jsPKy.F1; \+angular-1.3.9/docs/ptore2e/example-example66/jquery_test.jsPK y.F-,angular-1.3.9/docs/ptore2e/example-example67/PKy.F(wX< ,angular-1.3.9/docs/ptore2e/example-example67/default_test.jsPKy.Fb; ..angular-1.3.9/docs/ptore2e/example-example67/jquery_test.jsPK y.F-q/angular-1.3.9/docs/ptore2e/example-example78/PKy.F_< /angular-1.3.9/docs/ptore2e/example-example78/default_test.jsPKy.FX5; <1angular-1.3.9/docs/ptore2e/example-example78/jquery_test.jsPK y.F-2angular-1.3.9/docs/ptore2e/example-example83/PKy.F$c/;< 3angular-1.3.9/docs/ptore2e/example-example83/default_test.jsPKy.FD; 5angular-1.3.9/docs/ptore2e/example-example83/jquery_test.jsPK y.F-,7angular-1.3.9/docs/ptore2e/example-example84/PKy.FȤC< w7angular-1.3.9/docs/ptore2e/example-example84/default_test.jsPKy.FU$&; 8angular-1.3.9/docs/ptore2e/example-example84/jquery_test.jsPK y.F-=:angular-1.3.9/docs/ptore2e/example-example86/PKy.Fª)n< :angular-1.3.9/docs/ptore2e/example-example86/default_test.jsPKy.F u; ;angular-1.3.9/docs/ptore2e/example-example86/jquery_test.jsPK y.F--=angular-1.3.9/docs/ptore2e/example-example87/PKy.FA < x=angular-1.3.9/docs/ptore2e/example-example87/default_test.jsPKy.FJ5'; ?angular-1.3.9/docs/ptore2e/example-example87/jquery_test.jsPK y.F-#Bangular-1.3.9/docs/ptore2e/example-example88/PKy.F;< nBangular-1.3.9/docs/ptore2e/example-example88/default_test.jsPKy.F6m1 ; Dangular-1.3.9/docs/ptore2e/example-example88/jquery_test.jsPK y.F-Fangular-1.3.9/docs/ptore2e/example-example89/PKy.FWK< Fangular-1.3.9/docs/ptore2e/example-example89/default_test.jsPKy.FR R; tHangular-1.3.9/docs/ptore2e/example-example89/jquery_test.jsPK y.F,Iangular-1.3.9/docs/ptore2e/example-example9/PKy.F{[ ; BJangular-1.3.9/docs/ptore2e/example-example9/default_test.jsPKy.F&$o: Kangular-1.3.9/docs/ptore2e/example-example9/jquery_test.jsPK y.F-4Mangular-1.3.9/docs/ptore2e/example-example90/PKy.F3K< Mangular-1.3.9/docs/ptore2e/example-example90/default_test.jsPKy.Fy!R; Nangular-1.3.9/docs/ptore2e/example-example90/jquery_test.jsPK y.F-Pangular-1.3.9/docs/ptore2e/example-example91/PKy.FHŽ<< Pangular-1.3.9/docs/ptore2e/example-example91/default_test.jsPKy.FEˎ C; angular-1.3.9/docs/ptore2e/example-ngController/jquery_test.jsPK y.F2angular-1.3.9/docs/ptore2e/example-ngControllerAs/PKy.F%}ƠA angular-1.3.9/docs/ptore2e/example-ngControllerAs/default_test.jsPKy.F,]֦@ angular-1.3.9/docs/ptore2e/example-ngControllerAs/jquery_test.jsPK y.F4.angular-1.3.9/docs/ptore2e/example-ngList-directive/PK y.F=angular-1.3.9/docs/ptore2e/example-ngList-directive-newlines/PKy.FQL ېangular-1.3.9/docs/ptore2e/example-ngList-directive-newlines/default_test.jsPKy.F/AK hangular-1.3.9/docs/ptore2e/example-ngList-directive-newlines/jquery_test.jsPKy.F؜zGC angular-1.3.9/docs/ptore2e/example-ngList-directive/default_test.jsPKy.Fq̀NB 䕀angular-1.3.9/docs/ptore2e/example-ngList-directive/jquery_test.jsPK y.FAԗangular-1.3.9/docs/ptore2e/example-ngModelOptions-directive-blur/PKy.FuKhLP 3angular-1.3.9/docs/ptore2e/example-ngModelOptions-directive-blur/default_test.jsPKy.F4nSO angular-1.3.9/docs/ptore2e/example-ngModelOptions-directive-blur/jquery_test.jsPK y.F5angular-1.3.9/docs/ptore2e/example-ngValue-directive/PKy.F ېD Wangular-1.3.9/docs/ptore2e/example-ngValue-directive/default_test.jsPKy.FO C םangular-1.3.9/docs/ptore2e/example-ngValue-directive/jquery_test.jsPK y.F4]angular-1.3.9/docs/ptore2e/example-ngView-directive/PKy.F~8C angular-1.3.9/docs/ptore2e/example-ngView-directive/default_test.jsPKy.FhJ?B Xangular-1.3.9/docs/ptore2e/example-ngView-directive/jquery_test.jsPK y.F:angular-1.3.9/docs/ptore2e/example-number-input-directive/PKy.F9EDI _angular-1.3.9/docs/ptore2e/example-number-input-directive/default_test.jsPKy.F v4JKH angular-1.3.9/docs/ptore2e/example-number-input-directive/jquery_test.jsPK y.F9ۦangular-1.3.9/docs/ptore2e/example-radio-input-directive/PKy.FۂrH 2angular-1.3.9/docs/ptore2e/example-radio-input-directive/default_test.jsPKy.F,*sG angular-1.3.9/docs/ptore2e/example-radio-input-directive/jquery_test.jsPK y.F8angular-1.3.9/docs/ptore2e/example-text-input-directive/PKy.F$ GG Pangular-1.3.9/docs/ptore2e/example-text-input-directive/default_test.jsPKy.FM$F angular-1.3.9/docs/ptore2e/example-text-input-directive/jquery_test.jsPK y.F8ͭangular-1.3.9/docs/ptore2e/example-time-input-directive/PKy.FkncG #angular-1.3.9/docs/ptore2e/example-time-input-directive/default_test.jsPKy.FdutjF angular-1.3.9/docs/ptore2e/example-time-input-directive/jquery_test.jsPK y.F7angular-1.3.9/docs/ptore2e/example-url-input-directive/PKy.FVܸKF Cangular-1.3.9/docs/ptore2e/example-url-input-directive/default_test.jsPKy.F zQ$E angular-1.3.9/docs/ptore2e/example-url-input-directive/jquery_test.jsPK y.F8Ʒangular-1.3.9/docs/ptore2e/example-week-input-directive/PKy.Fkf6lcG angular-1.3.9/docs/ptore2e/example-week-input-directive/default_test.jsPKy.F5rjF angular-1.3.9/docs/ptore2e/example-week-input-directive/jquery_test.jsPKy.F ɡ v 㽀angular-1.3.9/errors.jsonPK y.Fɀangular-1.3.9/i18n/PKy.F._` * ɀangular-1.3.9/i18n/angular-locale_aa-dj.jsPKy.F4$ * ΀angular-1.3.9/i18n/angular-locale_aa-er.jsPKy.F@ * 1Ҁangular-1.3.9/i18n/angular-locale_aa-et.jsPKy.F=Sd ' Lրangular-1.3.9/i18n/angular-locale_aa.jsPKy.FRm* bڀangular-1.3.9/i18n/angular-locale_af-na.jsPKy.F>Yj* ݀angular-1.3.9/i18n/angular-locale_af-za.jsPKy.FAxǠg' angular-1.3.9/i18n/angular-locale_af.jsPKy.FdM + angular-1.3.9/i18n/angular-locale_agq-cm.jsPKy.F+HL ( angular-1.3.9/i18n/angular-locale_agq.jsPKy.F  * @angular-1.3.9/i18n/angular-locale_ak-gh.jsPKy.F$y ' angular-1.3.9/i18n/angular-locale_ak.jsPKy.F9v7 * angular-1.3.9/i18n/angular-locale_am-et.jsPKy.F|5 ' angular-1.3.9/i18n/angular-locale_am.jsPKy.Fi5rsW + %angular-1.3.9/i18n/angular-locale_ar-001.jsPKy.Fe;V * angular-1.3.9/i18n/angular-locale_ar-ae.jsPKy.F֑U * angular-1.3.9/i18n/angular-locale_ar-bh.jsPKy.FV * 0angular-1.3.9/i18n/angular-locale_ar-dj.jsPKy.FwO * angular-1.3.9/i18n/angular-locale_ar-dz.jsPKy.F|FV * angular-1.3.9/i18n/angular-locale_ar-eg.jsPKy.F\O * 3angular-1.3.9/i18n/angular-locale_ar-eh.jsPKy.Fs}X * angular-1.3.9/i18n/angular-locale_ar-er.jsPKy.FgV * angular-1.3.9/i18n/angular-locale_ar-il.jsPKy.Fip * 8angular-1.3.9/i18n/angular-locale_ar-iq.jsPKy.F4_ne * "angular-1.3.9/i18n/angular-locale_ar-jo.jsPKy.F6V * %angular-1.3.9/i18n/angular-locale_ar-km.jsPKy.FbW * k)angular-1.3.9/i18n/angular-locale_ar-kw.jsPKy.F)g * -angular-1.3.9/i18n/angular-locale_ar-lb.jsPKy.F4P * 0angular-1.3.9/i18n/angular-locale_ar-ly.jsPKy.FG * 4angular-1.3.9/i18n/angular-locale_ar-ma.jsPKy.F|X * 8angular-1.3.9/i18n/angular-locale_ar-mr.jsPKy.FrW * ;angular-1.3.9/i18n/angular-locale_ar-om.jsPKy.F|Cb * ?angular-1.3.9/i18n/angular-locale_ar-ps.jsPKy.F!ہY * 9Cangular-1.3.9/i18n/angular-locale_ar-qa.jsPKy.FjfY * Fangular-1.3.9/i18n/angular-locale_ar-sa.jsPKy.F펙V * Jangular-1.3.9/i18n/angular-locale_ar-sd.jsPKy.F;eQX * INangular-1.3.9/i18n/angular-locale_ar-so.jsPKy.F^V * Qangular-1.3.9/i18n/angular-locale_ar-ss.jsPKy.F Wg * Uangular-1.3.9/i18n/angular-locale_ar-sy.jsPKy.FmW * fYangular-1.3.9/i18n/angular-locale_ar-td.jsPKy.Fރ&R * ]angular-1.3.9/i18n/angular-locale_ar-tn.jsPKy.F~Z * `angular-1.3.9/i18n/angular-locale_ar-ye.jsPKy.FGQS ' qdangular-1.3.9/i18n/angular-locale_ar.jsPKy.FzURy * hangular-1.3.9/i18n/angular-locale_as-in.jsPKy.F_*Pv ' langular-1.3.9/i18n/angular-locale_as.jsPKy.FUA + hqangular-1.3.9/i18n/angular-locale_asa-tz.jsPKy.F3 ( kuangular-1.3.9/i18n/angular-locale_asa.jsPKy.F |►7 + iyangular-1.3.9/i18n/angular-locale_ast-es.jsPKy.F &f4 ( |}angular-1.3.9/i18n/angular-locale_ast.jsPKy.F7/| / angular-1.3.9/i18n/angular-locale_az-cyrl-az.jsPKy.FJEB .{ , angular-1.3.9/i18n/angular-locale_az-cyrl.jsPKy.FA`/ angular-1.3.9/i18n/angular-locale_az-latn-az.jsPKy.F4, angular-1.3.9/i18n/angular-locale_az-latn.jsPKy.F"' @angular-1.3.9/i18n/angular-locale_az.jsPKy.F>Z"d + angular-1.3.9/i18n/angular-locale_bas-cm.jsPKy.FXa ( angular-1.3.9/i18n/angular-locale_bas.jsPKy.FrO * rangular-1.3.9/i18n/angular-locale_be-by.jsPKy.FrNRN ' angular-1.3.9/i18n/angular-locale_be.jsPKy.Fp= + angular-1.3.9/i18n/angular-locale_bem-zm.jsPKy.F[c: ( angular-1.3.9/i18n/angular-locale_bem.jsPKy.FKe + angular-1.3.9/i18n/angular-locale_bez-tz.jsPKy.Fs9a ( angular-1.3.9/i18n/angular-locale_bez.jsPKy.Fc& * ƴangular-1.3.9/i18n/angular-locale_bg-bg.jsPKy.Fla# ' angular-1.3.9/i18n/angular-locale_bg.jsPKy.Fd| / 7angular-1.3.9/i18n/angular-locale_bm-latn-ml.jsPKy.FN  , 2angular-1.3.9/i18n/angular-locale_bm-latn.jsPKy.FS * +āangular-1.3.9/i18n/angular-locale_bm-ml.jsPKy.F.13 ' ȁangular-1.3.9/i18n/angular-locale_bm.jsPKy.FRsV * ́angular-1.3.9/i18n/angular-locale_bn-bd.jsPKy.FJtV * ρangular-1.3.9/i18n/angular-locale_bn-in.jsPKy.FۍpS ' Ӂangular-1.3.9/i18n/angular-locale_bn.jsPKy.F+挖* hׁangular-1.3.9/i18n/angular-locale_bo-cn.jsPKy.Fw* V܁angular-1.3.9/i18n/angular-locale_bo-in.jsPKy.FfΕ' Fangular-1.3.9/i18n/angular-locale_bo.jsPKy.Fh : * 0angular-1.3.9/i18n/angular-locale_br-fr.jsPKy.F6 ' angular-1.3.9/i18n/angular-locale_br.jsPKy.Fc% + Mangular-1.3.9/i18n/angular-locale_brx-in.jsPKy.F" ( angular-1.3.9/i18n/angular-locale_brx.jsPKy.F}`< / Cangular-1.3.9/i18n/angular-locale_bs-cyrl-ba.jsPKy.F = , angular-1.3.9/i18n/angular-locale_bs-cyrl.jsPKy.F=n / sangular-1.3.9/i18n/angular-locale_bs-latn-ba.jsPKy.F"h , uangular-1.3.9/i18n/angular-locale_bs-latn.jsPKy.F~ ' tangular-1.3.9/i18n/angular-locale_bs.jsPKy.FB'*M + g angular-1.3.9/i18n/angular-locale_byn-er.jsPKy.FJ ( angular-1.3.9/i18n/angular-locale_byn.jsPKy.F^ * angular-1.3.9/i18n/angular-locale_ca-ad.jsPKy.Fv 3 angular-1.3.9/i18n/angular-locale_ca-es-valencia.jsPKy.F& * angular-1.3.9/i18n/angular-locale_ca-es.jsPKy.FD.B * angular-1.3.9/i18n/angular-locale_ca-fr.jsPKy.Fw-' * $angular-1.3.9/i18n/angular-locale_ca-it.jsPKy.F![ ' (angular-1.3.9/i18n/angular-locale_ca.jsPKy.FQ:= + ,angular-1.3.9/i18n/angular-locale_cgg-ug.jsPKy.F A: ( 0angular-1.3.9/i18n/angular-locale_cgg.jsPKy.F-,L + 4angular-1.3.9/i18n/angular-locale_chr-us.jsPKy.FbJ ( &8angular-1.3.9/i18n/angular-locale_chr.jsPKy.F0 ;angular-1.3.9/i18n/angular-locale_ckb-arab-iq.jsPKy.FO\L 0 2@angular-1.3.9/i18n/angular-locale_ckb-arab-ir.jsPKy.F{| - Dangular-1.3.9/i18n/angular-locale_ckb-arab.jsPKy.Fee + Iangular-1.3.9/i18n/angular-locale_ckb-iq.jsPKy.F V + hMangular-1.3.9/i18n/angular-locale_ckb-ir.jsPKy.F.@0 Qangular-1.3.9/i18n/angular-locale_ckb-latn-iq.jsPKy.F1=Y= - 6Vangular-1.3.9/i18n/angular-locale_ckb-latn.jsPKy.F9( Zangular-1.3.9/i18n/angular-locale_ckb.jsPKy.F ( * ^angular-1.3.9/i18n/angular-locale_cs-cz.jsPKy.Fr ' ;cangular-1.3.9/i18n/angular-locale_cs.jsPKy.FrJ* vgangular-1.3.9/i18n/angular-locale_cy-gb.jsPKy.FNG' jangular-1.3.9/i18n/angular-locale_cy.jsPKy.Fd3 * mangular-1.3.9/i18n/angular-locale_da-dk.jsPKy.Fհ * Qrangular-1.3.9/i18n/angular-locale_da-gl.jsPKy.F ' vangular-1.3.9/i18n/angular-locale_da.jsPKy.F/T + zangular-1.3.9/i18n/angular-locale_dav-ke.jsPKy.F~^ ( angular-1.3.9/i18n/angular-locale_dav.jsPKy.F[$ * %angular-1.3.9/i18n/angular-locale_de-at.jsPKy.F@>T * angular-1.3.9/i18n/angular-locale_de-be.jsPKy.F]U^З * angular-1.3.9/i18n/angular-locale_de-ch.jsPKy.Fȱr * angular-1.3.9/i18n/angular-locale_de-de.jsPKy.Fمޗ * angular-1.3.9/i18n/angular-locale_de-li.jsPKy.FO * ߖangular-1.3.9/i18n/angular-locale_de-lu.jsPKy.F`b ' Қangular-1.3.9/i18n/angular-locale_de.jsPKy.FpP + angular-1.3.9/i18n/angular-locale_dje-ne.jsPKy.F\G ( ¢angular-1.3.9/i18n/angular-locale_dje.jsPKy.F,-Q + angular-1.3.9/i18n/angular-locale_dsb-de.jsPKy.F׎߹N ( Ѫangular-1.3.9/i18n/angular-locale_dsb.jsPKy.F0&sP + ஂangular-1.3.9/i18n/angular-locale_dua-cm.jsPKy.FKa M ( :angular-1.3.9/i18n/angular-locale_dua.jsPKy.FzW0+ angular-1.3.9/i18n/angular-locale_dyo-sn.jsPKy.FJH( angular-1.3.9/i18n/angular-locale_dyo.jsPKy.F?!* angular-1.3.9/i18n/angular-locale_dz-bt.jsPKy.F͠' Ăangular-1.3.9/i18n/angular-locale_dz.jsPKy.F[ + tɂangular-1.3.9/i18n/angular-locale_ebu-ke.jsPKy.F'  ( ͂angular-1.3.9/i18n/angular-locale_ebu.jsPKy.F{ * тangular-1.3.9/i18n/angular-locale_ee-gh.jsPKy.F_5{ * Ղangular-1.3.9/i18n/angular-locale_ee-tg.jsPKy.FfKEx ' قangular-1.3.9/i18n/angular-locale_ee.jsPKy.F'Y  * ނangular-1.3.9/i18n/angular-locale_el-cy.jsPKy.F^? * angular-1.3.9/i18n/angular-locale_el-gr.jsPKy.FV딋 ' angular-1.3.9/i18n/angular-locale_el.jsPKy.F21+ angular-1.3.9/i18n/angular-locale_en-001.jsPKy.F0+ angular-1.3.9/i18n/angular-locale_en-150.jsPKy.FMb뙘* angular-1.3.9/i18n/angular-locale_en-ag.jsPKy.F* angular-1.3.9/i18n/angular-locale_en-ai.jsPKy.FͶ* angular-1.3.9/i18n/angular-locale_en-as.jsPKy.FӆӘ* sangular-1.3.9/i18n/angular-locale_en-au.jsPKy.F0* cangular-1.3.9/i18n/angular-locale_en-bb.jsPKy.F Ϟ* Sangular-1.3.9/i18n/angular-locale_en-be.jsPKy.Fȼ?* I angular-1.3.9/i18n/angular-locale_en-bm.jsPKy.Fy2H* 9 angular-1.3.9/i18n/angular-locale_en-bs.jsPKy.FT* )angular-1.3.9/i18n/angular-locale_en-bw.jsPKy.F('* angular-1.3.9/i18n/angular-locale_en-bz.jsPKy.F0p* angular-1.3.9/i18n/angular-locale_en-ca.jsPKy.F4* angular-1.3.9/i18n/angular-locale_en-cc.jsPKy.FK * angular-1.3.9/i18n/angular-locale_en-ck.jsPKy.F* $angular-1.3.9/i18n/angular-locale_en-cm.jsPKy.F-FgH* (angular-1.3.9/i18n/angular-locale_en-cx.jsPKy.F* ,angular-1.3.9/i18n/angular-locale_en-dg.jsPKy.F#* 0angular-1.3.9/i18n/angular-locale_en-dm.jsPKy.Fڹ* 4angular-1.3.9/i18n/angular-locale_en-er.jsPKy.F«(* 8angular-1.3.9/i18n/angular-locale_en-fj.jsPKy.F|* |<angular-1.3.9/i18n/angular-locale_en-fk.jsPKy.FEp* l@angular-1.3.9/i18n/angular-locale_en-fm.jsPKy.F* \Dangular-1.3.9/i18n/angular-locale_en-gb.jsPKy.F>h* KHangular-1.3.9/i18n/angular-locale_en-gd.jsPKy.Fk* m* 2փangular-1.3.9/i18n/angular-locale_en-nz.jsPKy.FsL* ڃangular-1.3.9/i18n/angular-locale_en-pg.jsPKy.F3}* ރangular-1.3.9/i18n/angular-locale_en-ph.jsPKy.FӁ+^* angular-1.3.9/i18n/angular-locale_en-pk.jsPKy.FžG* angular-1.3.9/i18n/angular-locale_en-pn.jsPKy.F_K* angular-1.3.9/i18n/angular-locale_en-pr.jsPKy.FD^k* angular-1.3.9/i18n/angular-locale_en-pw.jsPKy.Fհx* angular-1.3.9/i18n/angular-locale_en-rw.jsPKy.Ft[S* angular-1.3.9/i18n/angular-locale_en-sb.jsPKy.FݡΚ* angular-1.3.9/i18n/angular-locale_en-sc.jsPKy.Fp* angular-1.3.9/i18n/angular-locale_en-sd.jsPKy.F:m* angular-1.3.9/i18n/angular-locale_en-sg.jsPKy.F- ;* angular-1.3.9/i18n/angular-locale_en-sh.jsPKy.FZs/* u angular-1.3.9/i18n/angular-locale_en-sl.jsPKy.F* g angular-1.3.9/i18n/angular-locale_en-ss.jsPKy.FP * Xangular-1.3.9/i18n/angular-locale_en-sx.jsPKy.F* Jangular-1.3.9/i18n/angular-locale_en-sz.jsPKy.Fɘ* =angular-1.3.9/i18n/angular-locale_en-tc.jsPKy.FQ* -angular-1.3.9/i18n/angular-locale_en-tk.jsPKy.F_* !angular-1.3.9/i18n/angular-locale_en-to.jsPKy.F+͘* %angular-1.3.9/i18n/angular-locale_en-tt.jsPKy.FPI* (angular-1.3.9/i18n/angular-locale_en-tv.jsPKy.F\d* ,angular-1.3.9/i18n/angular-locale_en-tz.jsPKy.FG:* 0angular-1.3.9/i18n/angular-locale_en-ug.jsPKy.Fg_ⴘ* 4angular-1.3.9/i18n/angular-locale_en-um.jsPKy.Fa* 8angular-1.3.9/i18n/angular-locale_en-us.jsPKy.Fb* <angular-1.3.9/i18n/angular-locale_en-vc.jsPKy.FE* @angular-1.3.9/i18n/angular-locale_en-vg.jsPKy.F0ܘ* Dangular-1.3.9/i18n/angular-locale_en-vi.jsPKy.F`b* Hangular-1.3.9/i18n/angular-locale_en-vu.jsPKy.FA* rLangular-1.3.9/i18n/angular-locale_en-ws.jsPKy.Faz-* dPangular-1.3.9/i18n/angular-locale_en-za.jsPKy.FByl* VTangular-1.3.9/i18n/angular-locale_en-zm.jsPKy.F}* HXangular-1.3.9/i18n/angular-locale_en-zw.jsPKy.FX2' 8\angular-1.3.9/i18n/angular-locale_en.jsPKy.FK + #`angular-1.3.9/i18n/angular-locale_eo-001.jsPKy.Fm ' &dangular-1.3.9/i18n/angular-locale_eo.jsPKy.FX+ #hangular-1.3.9/i18n/angular-locale_es-419.jsPKy.Fu6* akangular-1.3.9/i18n/angular-locale_es-ar.jsPKy.FWF* nangular-1.3.9/i18n/angular-locale_es-bo.jsPKy.F~H* qangular-1.3.9/i18n/angular-locale_es-cl.jsPKy.FӹK* uangular-1.3.9/i18n/angular-locale_es-co.jsPKy.F"]>* Ixangular-1.3.9/i18n/angular-locale_es-cr.jsPKy.F 4* {angular-1.3.9/i18n/angular-locale_es-cu.jsPKy.F}* ~angular-1.3.9/i18n/angular-locale_es-do.jsPKy.F_w* angular-1.3.9/i18n/angular-locale_es-ea.jsPKy.Fl* Aangular-1.3.9/i18n/angular-locale_es-ec.jsPKy.F] * }angular-1.3.9/i18n/angular-locale_es-es.jsPKy.FCi?* angular-1.3.9/i18n/angular-locale_es-gq.jsPKy.Fm * angular-1.3.9/i18n/angular-locale_es-gt.jsPKy.FK* .angular-1.3.9/i18n/angular-locale_es-hn.jsPKy.F T* kangular-1.3.9/i18n/angular-locale_es-ic.jsPKy.Fӿe* angular-1.3.9/i18n/angular-locale_es-mx.jsPKy.Fg* ޛangular-1.3.9/i18n/angular-locale_es-ni.jsPKy.F;* angular-1.3.9/i18n/angular-locale_es-pa.jsPKy.F$* Sangular-1.3.9/i18n/angular-locale_es-pe.jsPKy.FiB* angular-1.3.9/i18n/angular-locale_es-ph.jsPKy.Fx&* Өangular-1.3.9/i18n/angular-locale_es-pr.jsPKy.F*B* angular-1.3.9/i18n/angular-locale_es-py.jsPKy.Fx i* Kangular-1.3.9/i18n/angular-locale_es-sv.jsPKy.F͈* angular-1.3.9/i18n/angular-locale_es-us.jsPKy.FA* angular-1.3.9/i18n/angular-locale_es-uy.jsPKy.F * angular-1.3.9/i18n/angular-locale_es-ve.jsPKy.Fw' :angular-1.3.9/i18n/angular-locale_es.jsPKy.FSgȡ0 * tangular-1.3.9/i18n/angular-locale_et-ee.jsPKy.FI- ' mÄangular-1.3.9/i18n/angular-locale_et.jsPKy.FB* `DŽangular-1.3.9/i18n/angular-locale_eu-es.jsPKy.F'o' ʄangular-1.3.9/i18n/angular-locale_eu.jsPKy.Fn2 + ̈́angular-1.3.9/i18n/angular-locale_ewo-cm.jsPKy.FljZ ( ҄angular-1.3.9/i18n/angular-locale_ewo.jsPKy.Ft * Gքangular-1.3.9/i18n/angular-locale_fa-af.jsPKy.F*7, * ڄangular-1.3.9/i18n/angular-locale_fa-ir.jsPKy.FSu* ' ݄angular-1.3.9/i18n/angular-locale_fa.jsPKy.F! * angular-1.3.9/i18n/angular-locale_ff-cm.jsPKy.Fn * angular-1.3.9/i18n/angular-locale_ff-gn.jsPKy.F26 * angular-1.3.9/i18n/angular-locale_ff-mr.jsPKy.F_Y * angular-1.3.9/i18n/angular-locale_ff-sn.jsPKy.FkP*Ǩ ' "angular-1.3.9/i18n/angular-locale_ff.jsPKy.F33 * angular-1.3.9/i18n/angular-locale_fi-fi.jsPKy.FP~ ' angular-1.3.9/i18n/angular-locale_fi.jsPKy.F3c + angular-1.3.9/i18n/angular-locale_fil-ph.jsPKy.F ť ( angular-1.3.9/i18n/angular-locale_fil.jsPKy.F,3: * angular-1.3.9/i18n/angular-locale_fo-fo.jsPKy.F㉈7 '  angular-1.3.9/i18n/angular-locale_fo.jsPKy.FY|[*  angular-1.3.9/i18n/angular-locale_fr-be.jsPKy.FGK* \angular-1.3.9/i18n/angular-locale_fr-bf.jsPKy.F?k* angular-1.3.9/i18n/angular-locale_fr-bi.jsPKy.F* angular-1.3.9/i18n/angular-locale_fr-bj.jsPKy.FO* angular-1.3.9/i18n/angular-locale_fr-bl.jsPKy.Fwa* Zangular-1.3.9/i18n/angular-locale_fr-ca.jsPKy.FX* angular-1.3.9/i18n/angular-locale_fr-cd.jsPKy.F7>* #angular-1.3.9/i18n/angular-locale_fr-cf.jsPKy.FW7'* 'angular-1.3.9/i18n/angular-locale_fr-cg.jsPKy.F* T*angular-1.3.9/i18n/angular-locale_fr-ch.jsPKy.FE!* -angular-1.3.9/i18n/angular-locale_fr-ci.jsPKy.F* 0angular-1.3.9/i18n/angular-locale_fr-cm.jsPKy.Fs(* 4angular-1.3.9/i18n/angular-locale_fr-dj.jsPKy.FS:** P7angular-1.3.9/i18n/angular-locale_fr-dz.jsPKy.F* :angular-1.3.9/i18n/angular-locale_fr-fr.jsPKy.Fm*6* =angular-1.3.9/i18n/angular-locale_fr-ga.jsPKy.F5* Aangular-1.3.9/i18n/angular-locale_fr-gf.jsPKy.F3By* PDangular-1.3.9/i18n/angular-locale_fr-gn.jsPKy.F>"* Gangular-1.3.9/i18n/angular-locale_fr-gp.jsPKy.Ff t* Jangular-1.3.9/i18n/angular-locale_fr-gq.jsPKy.F* Nangular-1.3.9/i18n/angular-locale_fr-ht.jsPKy.F-* LQangular-1.3.9/i18n/angular-locale_fr-km.jsPKy.F* Tangular-1.3.9/i18n/angular-locale_fr-lu.jsPKy.F* Wangular-1.3.9/i18n/angular-locale_fr-ma.jsPKy.F:* [angular-1.3.9/i18n/angular-locale_fr-mc.jsPKy.FYA* H^angular-1.3.9/i18n/angular-locale_fr-mf.jsPKy.FY~* aangular-1.3.9/i18n/angular-locale_fr-mg.jsPKy.FwIK* dangular-1.3.9/i18n/angular-locale_fr-ml.jsPKy.F}p* hangular-1.3.9/i18n/angular-locale_fr-mq.jsPKy.F<* Hkangular-1.3.9/i18n/angular-locale_fr-mr.jsPKy.FI^* nangular-1.3.9/i18n/angular-locale_fr-mu.jsPKy.F`8|O* qangular-1.3.9/i18n/angular-locale_fr-nc.jsPKy.Fݳ^* uangular-1.3.9/i18n/angular-locale_fr-ne.jsPKy.F>* Exangular-1.3.9/i18n/angular-locale_fr-pf.jsPKy.F n* {angular-1.3.9/i18n/angular-locale_fr-pm.jsPKy.F56* ~angular-1.3.9/i18n/angular-locale_fr-re.jsPKy.Fu4X* angular-1.3.9/i18n/angular-locale_fr-rw.jsPKy.FzzJ* Cangular-1.3.9/i18n/angular-locale_fr-sc.jsPKy.F \* angular-1.3.9/i18n/angular-locale_fr-sn.jsPKy.FG|* angular-1.3.9/i18n/angular-locale_fr-sy.jsPKy.F;* angular-1.3.9/i18n/angular-locale_fr-td.jsPKy.FrZy* >angular-1.3.9/i18n/angular-locale_fr-tg.jsPKy.FOڰ* }angular-1.3.9/i18n/angular-locale_fr-tn.jsPKy.Fb?* angular-1.3.9/i18n/angular-locale_fr-vu.jsPKy.FQc* angular-1.3.9/i18n/angular-locale_fr-wf.jsPKy.F`* :angular-1.3.9/i18n/angular-locale_fr-yt.jsPKy.F6' {angular-1.3.9/i18n/angular-locale_fr.jsPKy.F,f + angular-1.3.9/i18n/angular-locale_fur-it.jsPKy.F  ( angular-1.3.9/i18n/angular-locale_fur.jsPKy.Fp* angular-1.3.9/i18n/angular-locale_fy-nl.jsPKy.F.VJG' angular-1.3.9/i18n/angular-locale_fy.jsPKy.F+* angular-1.3.9/i18n/angular-locale_ga-ie.jsPKy.F%7`)' 2angular-1.3.9/i18n/angular-locale_ga.jsPKy.Fʢ( * angular-1.3.9/i18n/angular-locale_gd-gb.jsPKy.FIV ' angular-1.3.9/i18n/angular-locale_gd.jsPKy.Fn9Xܣ * Ņangular-1.3.9/i18n/angular-locale_gl-es.jsPKy.FyBD ' Ʌangular-1.3.9/i18n/angular-locale_gl.jsPKy.F!+ ͅangular-1.3.9/i18n/angular-locale_gsw-ch.jsPKy.F5T+ HЅangular-1.3.9/i18n/angular-locale_gsw-fr.jsPKy.F]+ Ӆangular-1.3.9/i18n/angular-locale_gsw-li.jsPKy.FOȓn( օangular-1.3.9/i18n/angular-locale_gsw.jsPKy.F`7&Otp * څangular-1.3.9/i18n/angular-locale_gu-in.jsPKy.Feqm ' ݅angular-1.3.9/i18n/angular-locale_gu.jsPKy.F+ angular-1.3.9/i18n/angular-locale_guz-ke.jsPKy.F2&( angular-1.3.9/i18n/angular-locale_guz.jsPKy.F]a * angular-1.3.9/i18n/angular-locale_gv-im.jsPKy.Fn^ ' angular-1.3.9/i18n/angular-locale_gv.jsPKy.F͞/ angular-1.3.9/i18n/angular-locale_ha-latn-gh.jsPKy.FX1/ angular-1.3.9/i18n/angular-locale_ha-latn-ne.jsPKy.F/ angular-1.3.9/i18n/angular-locale_ha-latn-ng.jsPKy.FyL, angular-1.3.9/i18n/angular-locale_ha-latn.jsPKy.F' angular-1.3.9/i18n/angular-locale_ha.jsPKy.F+ angular-1.3.9/i18n/angular-locale_haw-us.jsPKy.Fd( angular-1.3.9/i18n/angular-locale_haw.jsPKy.FyO * angular-1.3.9/i18n/angular-locale_he-il.jsPKy.FEN ' angular-1.3.9/i18n/angular-locale_he.jsPKy.Fcg * Tangular-1.3.9/i18n/angular-locale_hi-in.jsPKy.FBd ' angular-1.3.9/i18n/angular-locale_hi.jsPKy.F" * angular-1.3.9/i18n/angular-locale_hr-ba.jsPKy.Fa" * !!angular-1.3.9/i18n/angular-locale_hr-hr.jsPKy.Fz ' v%angular-1.3.9/i18n/angular-locale_hr.jsPKy.Fr"[ + )angular-1.3.9/i18n/angular-locale_hsb-de.jsPKy.FuX ( -angular-1.3.9/i18n/angular-locale_hsb.jsPKy.FhO"* 1angular-1.3.9/i18n/angular-locale_hu-hu.jsPKy.F+' S5angular-1.3.9/i18n/angular-locale_hu.jsPKy.F)况B * 8angular-1.3.9/i18n/angular-locale_hy-am.jsPKy.Fxi? ' <angular-1.3.9/i18n/angular-locale_hy.jsPKy.FzA * @angular-1.3.9/i18n/angular-locale_ia-fr.jsPKy.F=2' Dangular-1.3.9/i18n/angular-locale_ia.jsPKy.F:ļ* Hangular-1.3.9/i18n/angular-locale_id-id.jsPKy.F-s' Kangular-1.3.9/i18n/angular-locale_id.jsPKy.FHEs * Nangular-1.3.9/i18n/angular-locale_ig-ng.jsPKy.F%p ' Rangular-1.3.9/i18n/angular-locale_ig.jsPKy.Fmh * Wangular-1.3.9/i18n/angular-locale_ii-cn.jsPKy.FƯS ' Zangular-1.3.9/i18n/angular-locale_ii.jsPKy.F,' ^angular-1.3.9/i18n/angular-locale_in.jsPKy.FD]w * aangular-1.3.9/i18n/angular-locale_is-is.jsPKy.F+t ' ifangular-1.3.9/i18n/angular-locale_is.jsPKy.FiRXĦ * jangular-1.3.9/i18n/angular-locale_it-ch.jsPKy.FDEӾ * nangular-1.3.9/i18n/angular-locale_it-it.jsPKy.Fz * rangular-1.3.9/i18n/angular-locale_it-sm.jsPKy.FI[ ' vangular-1.3.9/i18n/angular-locale_it.jsPKy.Fl;@M ' zangular-1.3.9/i18n/angular-locale_iw.jsPKy.FZyxe* yangular-1.3.9/i18n/angular-locale_ja-jp.jsPKy.F_8' sangular-1.3.9/i18n/angular-locale_ja.jsPKy.Fw"Wi + gangular-1.3.9/i18n/angular-locale_jgo-cm.jsPKy.F"f ( angular-1.3.9/i18n/angular-locale_jgo.jsPKy.F+ۨ+ ㍆angular-1.3.9/i18n/angular-locale_jmc-tz.jsPKy.Fs9( 䑆angular-1.3.9/i18n/angular-locale_jmc.jsPKy.Fcg * angular-1.3.9/i18n/angular-locale_ka-ge.jsPKy.F>+=^d ' angular-1.3.9/i18n/angular-locale_ka.jsPKy.F|3C + Nangular-1.3.9/i18n/angular-locale_kab-dz.jsPKy.F#´@ ( ^angular-1.3.9/i18n/angular-locale_kab.jsPKy.Fz>_ + hangular-1.3.9/i18n/angular-locale_kam-ke.jsPKy.FK{m ( angular-1.3.9/i18n/angular-locale_kam.jsPKy.F> + angular-1.3.9/i18n/angular-locale_kde-tz.jsPKy.F  ( ѱangular-1.3.9/i18n/angular-locale_kde.jsPKy.F9v. + 굆angular-1.3.9/i18n/angular-locale_kea-cv.jsPKy.Frnq ( 幆angular-1.3.9/i18n/angular-locale_kea.jsPKy.F-G + ڽangular-1.3.9/i18n/angular-locale_khq-ml.jsPKy.F-B: ( angular-1.3.9/i18n/angular-locale_khq.jsPKy.F * ņangular-1.3.9/i18n/angular-locale_ki-ke.jsPKy.Fқ3 ' Ɇangular-1.3.9/i18n/angular-locale_ki.jsPKy.Fl) / Άangular-1.3.9/i18n/angular-locale_kk-cyrl-kz.jsPKy.FN , цangular-1.3.9/i18n/angular-locale_kk-cyrl.jsPKy.FE ' Նangular-1.3.9/i18n/angular-locale_kk.jsPKy.FN; + نangular-1.3.9/i18n/angular-locale_kkj-cm.jsPKy.Fm:H͔ ( ݆angular-1.3.9/i18n/angular-locale_kkj.jsPKy.FB * angular-1.3.9/i18n/angular-locale_kl-gl.jsPKy.F^v? ' angular-1.3.9/i18n/angular-locale_kl.jsPKy.F,r? + angular-1.3.9/i18n/angular-locale_kln-ke.jsPKy.FxI< ( angular-1.3.9/i18n/angular-locale_kln.jsPKy.F#$F * angular-1.3.9/i18n/angular-locale_km-kh.jsPKy.FQ!C ' angular-1.3.9/i18n/angular-locale_km.jsPKy.F * angular-1.3.9/i18n/angular-locale_kn-in.jsPKy.FML܈ ' angular-1.3.9/i18n/angular-locale_kn.jsPKy.F*_ * angular-1.3.9/i18n/angular-locale_ko-kp.jsPKy.F=8* angular-1.3.9/i18n/angular-locale_ko-kr.jsPKy.F}' angular-1.3.9/i18n/angular-locale_ko.jsPKy.F&(5 + angular-1.3.9/i18n/angular-locale_kok-in.jsPKy.FΜ2 ( 9angular-1.3.9/i18n/angular-locale_kok.jsPKy.F~65|d / angular-1.3.9/i18n/angular-locale_ks-arab-in.jsPKy.F}a , #angular-1.3.9/i18n/angular-locale_ks-arab.jsPKy.F8!\ ' }angular-1.3.9/i18n/angular-locale_ks.jsPKy.Fo)+ angular-1.3.9/i18n/angular-locale_ksb-tz.jsPKy.Fv>( #angular-1.3.9/i18n/angular-locale_ksb.jsPKy.Fbc| + 'angular-1.3.9/i18n/angular-locale_ksf-cm.jsPKy.Fhy ( ,angular-1.3.9/i18n/angular-locale_ksf.jsPKy.F w + Q0angular-1.3.9/i18n/angular-locale_ksh-de.jsPKy.FTA8t ( v4angular-1.3.9/i18n/angular-locale_ksh.jsPKy.FxW$ * 8angular-1.3.9/i18n/angular-locale_kw-gb.jsPKy.FUhٜ ' <angular-1.3.9/i18n/angular-locale_kw.jsPKy.F_gժh / }@angular-1.3.9/i18n/angular-locale_ky-cyrl-kg.jsPKy.FXh , cDangular-1.3.9/i18n/angular-locale_ky-cyrl.jsPKy.F ` ' EHangular-1.3.9/i18n/angular-locale_ky.jsPKy.Fs + Langular-1.3.9/i18n/angular-locale_lag-tz.jsPKy.F+0 ( oPangular-1.3.9/i18n/angular-locale_lag.jsPKy.F۷N * Tangular-1.3.9/i18n/angular-locale_lb-lu.jsPKy.Fl\;K ' Xangular-1.3.9/i18n/angular-locale_lb.jsPKy.FP* \angular-1.3.9/i18n/angular-locale_lg-ug.jsPKy.F p' `angular-1.3.9/i18n/angular-locale_lg.jsPKy.F`bS + dangular-1.3.9/i18n/angular-locale_lkt-us.jsPKy.Fn ( &iangular-1.3.9/i18n/angular-locale_lkt.jsPKy.Fx]9m * wmangular-1.3.9/i18n/angular-locale_ln-ao.jsPKy.FU;o * qangular-1.3.9/i18n/angular-locale_ln-cd.jsPKy.F`;o * tangular-1.3.9/i18n/angular-locale_ln-cf.jsPKy.F$;o * .xangular-1.3.9/i18n/angular-locale_ln-cg.jsPKy.F_!8l ' {angular-1.3.9/i18n/angular-locale_ln.jsPKy.FfY * Nangular-1.3.9/i18n/angular-locale_lo-la.jsPKy.F,t\FeV ' angular-1.3.9/i18n/angular-locale_lo.jsPKy.FtѬ@ * Ɔangular-1.3.9/i18n/angular-locale_lt-lt.jsPKy.FHH= ' angular-1.3.9/i18n/angular-locale_lt.jsPKy.F[ g * cangular-1.3.9/i18n/angular-locale_lu-cd.jsPKy.F Ad ' angular-1.3.9/i18n/angular-locale_lu.jsPKy.FAd + angular-1.3.9/i18n/angular-locale_luo-ke.jsPKy.F (ےa ( angular-1.3.9/i18n/angular-locale_luo.jsPKy.F?|ɬ+ angular-1.3.9/i18n/angular-locale_luy-ke.jsPKy.F1|.( angular-1.3.9/i18n/angular-locale_luy.jsPKy.Fz,j * angular-1.3.9/i18n/angular-locale_lv-lv.jsPKy.F~g ' angular-1.3.9/i18n/angular-locale_lv.jsPKy.FB;U + pangular-1.3.9/i18n/angular-locale_mas-ke.jsPKy.FdT + angular-1.3.9/i18n/angular-locale_mas-tz.jsPKy.F؍Q ( ˹angular-1.3.9/i18n/angular-locale_mas.jsPKy.Fq% + rangular-1.3.9/i18n/angular-locale_mer-ke.jsPKy.F" ( ‡angular-1.3.9/i18n/angular-locale_mer.jsPKy.FUЈ+ Ƈangular-1.3.9/i18n/angular-locale_mfe-mu.jsPKy.Fr( ʇangular-1.3.9/i18n/angular-locale_mfe.jsPKy.F7fz* d·angular-1.3.9/i18n/angular-locale_mg-mg.jsPKy.Fo=' V҇angular-1.3.9/i18n/angular-locale_mg.jsPKy.FD1= + Cևangular-1.3.9/i18n/angular-locale_mgh-mz.jsPKy.Fw5 ( oڇangular-1.3.9/i18n/angular-locale_mgh.jsPKy.F + އangular-1.3.9/i18n/angular-locale_mgo-cm.jsPKy.F׻ ( angular-1.3.9/i18n/angular-locale_mgo.jsPKy.F< * angular-1.3.9/i18n/angular-locale_mk-mk.jsPKy.FV9 ' !angular-1.3.9/i18n/angular-locale_mk.jsPKy.Fz“ * angular-1.3.9/i18n/angular-locale_ml-in.jsPKy.Fy6` ' angular-1.3.9/i18n/angular-locale_ml.jsPKy.Fr / angular-1.3.9/i18n/angular-locale_mn-cyrl-mn.jsPKy.F , angular-1.3.9/i18n/angular-locale_mn-cyrl.jsPKy.FB ' angular-1.3.9/i18n/angular-locale_mn.jsPKy.F( * rangular-1.3.9/i18n/angular-locale_mr-in.jsPKy.FGƂ ' Nangular-1.3.9/i18n/angular-locale_mr.jsPKy.FyE&/ % angular-1.3.9/i18n/angular-locale_ms-latn-bn.jsPKy.Fއ / >angular-1.3.9/i18n/angular-locale_ms-latn-my.jsPKy.F/ Xangular-1.3.9/i18n/angular-locale_ms-latn-sg.jsPKy.F4š_!, rangular-1.3.9/i18n/angular-locale_ms-latn.jsPKy.F?H' angular-1.3.9/i18n/angular-locale_ms.jsPKy.FinX%S* angular-1.3.9/i18n/angular-locale_mt-mt.jsPKy.F?%"P' angular-1.3.9/i18n/angular-locale_mt.jsPKy.F99 + !angular-1.3.9/i18n/angular-locale_mua-cm.jsPKy.F`7 ( %angular-1.3.9/i18n/angular-locale_mua.jsPKy.F 3q * *angular-1.3.9/i18n/angular-locale_my-mm.jsPKy.FE^1n ' -angular-1.3.9/i18n/angular-locale_my.jsPKy.FnZ~` + 1angular-1.3.9/i18n/angular-locale_naq-na.jsPKy.F ( k5angular-1.3.9/i18n/angular-locale_naq.jsPKy.FJP* 9angular-1.3.9/i18n/angular-locale_nb-no.jsPKy.F!* <angular-1.3.9/i18n/angular-locale_nb-sj.jsPKy.FK' @angular-1.3.9/i18n/angular-locale_nb.jsPKy.F* /Cangular-1.3.9/i18n/angular-locale_nd-zw.jsPKy.F.Щ' 3Gangular-1.3.9/i18n/angular-locale_nd.jsPKy.F^u * 1Kangular-1.3.9/i18n/angular-locale_ne-in.jsPKy.FoUfl * Nangular-1.3.9/i18n/angular-locale_ne-np.jsPKy.F(9ei ' Rangular-1.3.9/i18n/angular-locale_ne.jsPKy.FlzG* vVangular-1.3.9/i18n/angular-locale_nl-aw.jsPKy.F) * pZangular-1.3.9/i18n/angular-locale_nl-be.jsPKy.FgʥѠ* k^angular-1.3.9/i18n/angular-locale_nl-bq.jsPKy.Fy* cbangular-1.3.9/i18n/angular-locale_nl-cw.jsPKy.FRPF * ]fangular-1.3.9/i18n/angular-locale_nl-nl.jsPKy.F* Yjangular-1.3.9/i18n/angular-locale_nl-sr.jsPKy.FvKE* Pnangular-1.3.9/i18n/angular-locale_nl-sx.jsPKy.Fs' Irangular-1.3.9/i18n/angular-locale_nl.jsPKy.Fbur + @vangular-1.3.9/i18n/angular-locale_nmg-cm.jsPKy.FB+o ( zangular-1.3.9/i18n/angular-locale_nmg.jsPKy.Fe٥m * ~angular-1.3.9/i18n/angular-locale_nn-no.jsPKy.Fk| ' angular-1.3.9/i18n/angular-locale_nn.jsPKy.FM Bw+ angular-1.3.9/i18n/angular-locale_nnh-cm.jsPKy.Fv@t( 0angular-1.3.9/i18n/angular-locale_nnh.jsPKy.FU4* Əangular-1.3.9/i18n/angular-locale_no-no.jsPKy.F.9' angular-1.3.9/i18n/angular-locale_no.jsPKy.F4-f* angular-1.3.9/i18n/angular-locale_nr-za.jsPKy.FO' angular-1.3.9/i18n/angular-locale_nr.jsPKy.F5+ angular-1.3.9/i18n/angular-locale_nso-za.jsPKy.F ֫( %angular-1.3.9/i18n/angular-locale_nso.jsPKy.F!fm' + &angular-1.3.9/i18n/angular-locale_nus-sd.jsPKy.F ( jangular-1.3.9/i18n/angular-locale_nus.jsPKy.F&y= + angular-1.3.9/i18n/angular-locale_nyn-ug.jsPKy.F~ȩ: ( angular-1.3.9/i18n/angular-locale_nyn.jsPKy.F * angular-1.3.9/i18n/angular-locale_om-et.jsPKy.F]. * angular-1.3.9/i18n/angular-locale_om-ke.jsPKy.F  ' ¾angular-1.3.9/i18n/angular-locale_om.jsPKy.F /fN * ˆangular-1.3.9/i18n/angular-locale_or-in.jsPKy.Fz-K ' oƈangular-1.3.9/i18n/angular-locale_or.jsPKy.F?t * ʈangular-1.3.9/i18n/angular-locale_os-ge.jsPKy.FU#Jv * Έangular-1.3.9/i18n/angular-locale_os-ru.jsPKy.FSY1o ' ӈangular-1.3.9/i18n/angular-locale_os.jsPKy.Fw / m؈angular-1.3.9/i18n/angular-locale_pa-arab-pk.jsPKy.F  , ۈangular-1.3.9/i18n/angular-locale_pa-arab.jsPKy.Fa / D߈angular-1.3.9/i18n/angular-locale_pa-guru-in.jsPKy.F ^ , angular-1.3.9/i18n/angular-locale_pa-guru.jsPKy.F7u[ ' angular-1.3.9/i18n/angular-locale_pa.jsPKy.Fӗ] * jangular-1.3.9/i18n/angular-locale_pl-pl.jsPKy.F_kZ ' angular-1.3.9/i18n/angular-locale_pl.jsPKy.F% * 6angular-1.3.9/i18n/angular-locale_ps-af.jsPKy.FKf ' qangular-1.3.9/i18n/angular-locale_ps.jsPKy.F"?* angular-1.3.9/i18n/angular-locale_pt-ao.jsPKy.F:a* angular-1.3.9/i18n/angular-locale_pt-br.jsPKy.F* Aangular-1.3.9/i18n/angular-locale_pt-cv.jsPKy.F1[ * angular-1.3.9/i18n/angular-locale_pt-gw.jsPKy.FQq* angular-1.3.9/i18n/angular-locale_pt-mo.jsPKy.Fª_* > angular-1.3.9/i18n/angular-locale_pt-mz.jsPKy.FEl6* angular-1.3.9/i18n/angular-locale_pt-pt.jsPKy.FhE* angular-1.3.9/i18n/angular-locale_pt-st.jsPKy.F5:CI* ;angular-1.3.9/i18n/angular-locale_pt-tl.jsPKy.F¿K' angular-1.3.9/i18n/angular-locale_pt.jsPKy.F;7 * angular-1.3.9/i18n/angular-locale_qu-bo.jsPKy.FD6 * angular-1.3.9/i18n/angular-locale_qu-ec.jsPKy.FpE8 * %angular-1.3.9/i18n/angular-locale_qu-pe.jsPKy.F0_5 ' 6)angular-1.3.9/i18n/angular-locale_qu.jsPKy.F5{Ũ * S-angular-1.3.9/i18n/angular-locale_rm-ch.jsPKy.F|4 ' S1angular-1.3.9/i18n/angular-locale_rm.jsPKy.F~%1 * M5angular-1.3.9/i18n/angular-locale_rn-bi.jsPKy.F'. ' i9angular-1.3.9/i18n/angular-locale_rn.jsPKy.F * =angular-1.3.9/i18n/angular-locale_ro-md.jsPKy.FG * Aangular-1.3.9/i18n/angular-locale_ro-ro.jsPKy.F ' Eangular-1.3.9/i18n/angular-locale_ro.jsPKy.FfY䵲f + Iangular-1.3.9/i18n/angular-locale_rof-tz.jsPKy.FL+c ( Mangular-1.3.9/i18n/angular-locale_rof.jsPKy.FAMv * Qangular-1.3.9/i18n/angular-locale_ru-by.jsPKy.FTҎ * Vangular-1.3.9/i18n/angular-locale_ru-kg.jsPKy.Fѓޑ * [angular-1.3.9/i18n/angular-locale_ru-kz.jsPKy.Fje * `angular-1.3.9/i18n/angular-locale_ru-md.jsPKy.F * eangular-1.3.9/i18n/angular-locale_ru-ru.jsPKy.FT' * jangular-1.3.9/i18n/angular-locale_ru-ua.jsPKy.FO9 ' koangular-1.3.9/i18n/angular-locale_ru.jsPKy.FBĿ0 * Ntangular-1.3.9/i18n/angular-locale_rw-rw.jsPKy.F˿ּ- ' dxangular-1.3.9/i18n/angular-locale_rw.jsPKy.Fƪ+ u|angular-1.3.9/i18n/angular-locale_rwk-tz.jsPKy.F\4( xangular-1.3.9/i18n/angular-locale_rwk.jsPKy.FX4+ vangular-1.3.9/i18n/angular-locale_sah-ru.jsPKy.FVg1( rangular-1.3.9/i18n/angular-locale_sah.jsPKy.F)򓳱 + iangular-1.3.9/i18n/angular-locale_saq-ke.jsPKy.F(G ( sangular-1.3.9/i18n/angular-locale_saq.jsPKy.F + vangular-1.3.9/i18n/angular-locale_sbp-tz.jsPKy.FOm ( angular-1.3.9/i18n/angular-locale_sbp.jsPKy.Fw * angular-1.3.9/i18n/angular-locale_se-fi.jsPKy.F_9 * բangular-1.3.9/i18n/angular-locale_se-no.jsPKy.FZ8 * angular-1.3.9/i18n/angular-locale_se-se.jsPKy.FQ ' Bangular-1.3.9/i18n/angular-locale_se.jsPKy.F + sangular-1.3.9/i18n/angular-locale_seh-mz.jsPKy.Faz_ ( kangular-1.3.9/i18n/angular-locale_seh.jsPKy.FL + ^angular-1.3.9/i18n/angular-locale_ses-ml.jsPKy.F ( Xangular-1.3.9/i18n/angular-locale_ses.jsPKy.F"4 * Kangular-1.3.9/i18n/angular-locale_sg-cf.jsPKy.FGkF ' sÉangular-1.3.9/i18n/angular-locale_sg.jsPKy.F+ 0 ljangular-1.3.9/i18n/angular-locale_shi-latn-ma.jsPKy.Fmb, - ˉangular-1.3.9/i18n/angular-locale_shi-latn.jsPKy.F~55w 0 ωangular-1.3.9/i18n/angular-locale_shi-tfng-ma.jsPKy.Ff7x - Kԉangular-1.3.9/i18n/angular-locale_shi-tfng.jsPKy.F60.o ( ؉angular-1.3.9/i18n/angular-locale_shi.jsPKy.F,mB * a݉angular-1.3.9/i18n/angular-locale_si-lk.jsPKy.Fcj? ' angular-1.3.9/i18n/angular-locale_si.jsPKy.F( * angular-1.3.9/i18n/angular-locale_sk-sk.jsPKy.F% ' angular-1.3.9/i18n/angular-locale_sk.jsPKy.FMYC * angular-1.3.9/i18n/angular-locale_sl-si.jsPKy.F\&Yn ' angular-1.3.9/i18n/angular-locale_sl.jsPKy.F7ѡs+ ,angular-1.3.9/i18n/angular-locale_smn-fi.jsPKy.F=p( angular-1.3.9/i18n/angular-locale_smn.jsPKy.F<eP* angular-1.3.9/i18n/angular-locale_sn-zw.jsPKy.F:' angular-1.3.9/i18n/angular-locale_sn.jsPKy.FKO * angular-1.3.9/i18n/angular-locale_so-dj.jsPKy.FP * angular-1.3.9/i18n/angular-locale_so-et.jsPKy.F8$O * angular-1.3.9/i18n/angular-locale_so-ke.jsPKy.FTO * angular-1.3.9/i18n/angular-locale_so-so.jsPKy.FcL ' angular-1.3.9/i18n/angular-locale_so.jsPKy.F +* angular-1.3.9/i18n/angular-locale_sq-al.jsPKy.Fe-* Cangular-1.3.9/i18n/angular-locale_sq-mk.jsPKy.F"b* !angular-1.3.9/i18n/angular-locale_sq-xk.jsPKy.FX' $angular-1.3.9/i18n/angular-locale_sq.jsPKy.F / (angular-1.3.9/i18n/angular-locale_sr-cyrl-ba.jsPKy.Fp|؃ / ,angular-1.3.9/i18n/angular-locale_sr-cyrl-me.jsPKy.F02"~ / 1angular-1.3.9/i18n/angular-locale_sr-cyrl-rs.jsPKy.Fx / 6angular-1.3.9/i18n/angular-locale_sr-cyrl-xk.jsPKy.Fe@ , ;angular-1.3.9/i18n/angular-locale_sr-cyrl.jsPKy.F / _@angular-1.3.9/i18n/angular-locale_sr-latn-ba.jsPKy.F$@& / Dangular-1.3.9/i18n/angular-locale_sr-latn-me.jsPKy.Fl/X / Hangular-1.3.9/i18n/angular-locale_sr-latn-rs.jsPKy.FJ> / 9Mangular-1.3.9/i18n/angular-locale_sr-latn-xk.jsPKy.Fb[ , Qangular-1.3.9/i18n/angular-locale_sr-latn.jsPKy.F`oNx ' Uangular-1.3.9/i18n/angular-locale_sr.jsPKy.FÜU% * Zangular-1.3.9/i18n/angular-locale_ss-sz.jsPKy.F< * ^angular-1.3.9/i18n/angular-locale_ss-za.jsPKy.F5~ ' bangular-1.3.9/i18n/angular-locale_ss.jsPKy.F7: 4 + fangular-1.3.9/i18n/angular-locale_ssy-er.jsPKy.F-{ ( jangular-1.3.9/i18n/angular-locale_ssy.jsPKy.FQ* nangular-1.3.9/i18n/angular-locale_st-ls.jsPKy.F5Y* rangular-1.3.9/i18n/angular-locale_st-za.jsPKy.Fz' vangular-1.3.9/i18n/angular-locale_st.jsPKy.F w; * zangular-1.3.9/i18n/angular-locale_sv-ax.jsPKy.Fv\У) * ~angular-1.3.9/i18n/angular-locale_sv-fi.jsPKy.F8K * angular-1.3.9/i18n/angular-locale_sv-se.jsPKy.Ftjp ' angular-1.3.9/i18n/angular-locale_sv.jsPKy.Fܵ * angular-1.3.9/i18n/angular-locale_sw-ke.jsPKy.F%L * vangular-1.3.9/i18n/angular-locale_sw-tz.jsPKy.F>V * Vangular-1.3.9/i18n/angular-locale_sw-ug.jsPKy.F\: ' 7angular-1.3.9/i18n/angular-locale_sw.jsPKy.FW| + angular-1.3.9/i18n/angular-locale_swc-cd.jsPKy.Fmy ( angular-1.3.9/i18n/angular-locale_swc.jsPKy.Fcz * angular-1.3.9/i18n/angular-locale_ta-in.jsPKy.F/ angular-1.3.9/i18n/angular-locale_zh-hant-tw.jsPKy.F1O;, angular-1.3.9/i18n/angular-locale_zh-hant.jsPKy.Fc98* angular-1.3.9/i18n/angular-locale_zh-hk.jsPKy.FxL9* angular-1.3.9/i18n/angular-locale_zh-tw.jsPKy.FI0' angular-1.3.9/i18n/angular-locale_zh.jsPKy.F7>* angular-1.3.9/i18n/angular-locale_zu-za.jsPKy.F' Bangular-1.3.9/i18n/angular-locale_zu.jsPK y.Fangular-1.3.9/i18n/ngLocale/PKy.FXG7 angular-1.3.9/version.jsonPKy.Fdh angular-1.3.9/version.txtPK 6 nagios-4.3.4/html/angularjs/ui-bootstrap-tpls-0.12.0.min.js000066400000000000000000001772271314764422400232270ustar00rootroot00000000000000/* * angular-ui-bootstrap * http://angular-ui.github.io/bootstrap/ * Version: 0.12.0 - 2014-11-16 * License: MIT */ angular.module("ui.bootstrap",["ui.bootstrap.tpls","ui.bootstrap.transition","ui.bootstrap.collapse","ui.bootstrap.accordion","ui.bootstrap.alert","ui.bootstrap.bindHtml","ui.bootstrap.buttons","ui.bootstrap.carousel","ui.bootstrap.dateparser","ui.bootstrap.position","ui.bootstrap.datepicker","ui.bootstrap.dropdown","ui.bootstrap.modal","ui.bootstrap.pagination","ui.bootstrap.tooltip","ui.bootstrap.popover","ui.bootstrap.progressbar","ui.bootstrap.rating","ui.bootstrap.tabs","ui.bootstrap.timepicker","ui.bootstrap.typeahead"]),angular.module("ui.bootstrap.tpls",["template/accordion/accordion-group.html","template/accordion/accordion.html","template/alert/alert.html","template/carousel/carousel.html","template/carousel/slide.html","template/datepicker/datepicker.html","template/datepicker/day.html","template/datepicker/month.html","template/datepicker/popup.html","template/datepicker/year.html","template/modal/backdrop.html","template/modal/window.html","template/pagination/pager.html","template/pagination/pagination.html","template/tooltip/tooltip-html-unsafe-popup.html","template/tooltip/tooltip-popup.html","template/popover/popover.html","template/progressbar/bar.html","template/progressbar/progress.html","template/progressbar/progressbar.html","template/rating/rating.html","template/tabs/tab.html","template/tabs/tabset.html","template/timepicker/timepicker.html","template/typeahead/typeahead-match.html","template/typeahead/typeahead-popup.html"]),angular.module("ui.bootstrap.transition",[]).factory("$transition",["$q","$timeout","$rootScope",function(a,b,c){function d(a){for(var b in a)if(void 0!==f.style[b])return a[b]}var e=function(d,f,g){g=g||{};var h=a.defer(),i=e[g.animation?"animationEndEventName":"transitionEndEventName"],j=function(){c.$apply(function(){d.unbind(i,j),h.resolve(d)})};return i&&d.bind(i,j),b(function(){angular.isString(f)?d.addClass(f):angular.isFunction(f)?f(d):angular.isObject(f)&&d.css(f),i||h.resolve(d)}),h.promise.cancel=function(){i&&d.unbind(i,j),h.reject("Transition cancelled")},h.promise},f=document.createElement("trans"),g={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd",transition:"transitionend"},h={WebkitTransition:"webkitAnimationEnd",MozTransition:"animationend",OTransition:"oAnimationEnd",transition:"animationend"};return e.transitionEndEventName=d(g),e.animationEndEventName=d(h),e}]),angular.module("ui.bootstrap.collapse",["ui.bootstrap.transition"]).directive("collapse",["$transition",function(a){return{link:function(b,c,d){function e(b){function d(){j===e&&(j=void 0)}var e=a(c,b);return j&&j.cancel(),j=e,e.then(d,d),e}function f(){k?(k=!1,g()):(c.removeClass("collapse").addClass("collapsing"),e({height:c[0].scrollHeight+"px"}).then(g))}function g(){c.removeClass("collapsing"),c.addClass("collapse in"),c.css({height:"auto"})}function h(){if(k)k=!1,i(),c.css({height:0});else{c.css({height:c[0].scrollHeight+"px"});{c[0].offsetWidth}c.removeClass("collapse in").addClass("collapsing"),e({height:0}).then(i)}}function i(){c.removeClass("collapsing"),c.addClass("collapse")}var j,k=!0;b.$watch(d.collapse,function(a){a?h():f()})}}}]),angular.module("ui.bootstrap.accordion",["ui.bootstrap.collapse"]).constant("accordionConfig",{closeOthers:!0}).controller("AccordionController",["$scope","$attrs","accordionConfig",function(a,b,c){this.groups=[],this.closeOthers=function(d){var e=angular.isDefined(b.closeOthers)?a.$eval(b.closeOthers):c.closeOthers;e&&angular.forEach(this.groups,function(a){a!==d&&(a.isOpen=!1)})},this.addGroup=function(a){var b=this;this.groups.push(a),a.$on("$destroy",function(){b.removeGroup(a)})},this.removeGroup=function(a){var b=this.groups.indexOf(a);-1!==b&&this.groups.splice(b,1)}}]).directive("accordion",function(){return{restrict:"EA",controller:"AccordionController",transclude:!0,replace:!1,templateUrl:"template/accordion/accordion.html"}}).directive("accordionGroup",function(){return{require:"^accordion",restrict:"EA",transclude:!0,replace:!0,templateUrl:"template/accordion/accordion-group.html",scope:{heading:"@",isOpen:"=?",isDisabled:"=?"},controller:function(){this.setHeading=function(a){this.heading=a}},link:function(a,b,c,d){d.addGroup(a),a.$watch("isOpen",function(b){b&&d.closeOthers(a)}),a.toggleOpen=function(){a.isDisabled||(a.isOpen=!a.isOpen)}}}}).directive("accordionHeading",function(){return{restrict:"EA",transclude:!0,template:"",replace:!0,require:"^accordionGroup",link:function(a,b,c,d,e){d.setHeading(e(a,function(){}))}}}).directive("accordionTransclude",function(){return{require:"^accordionGroup",link:function(a,b,c,d){a.$watch(function(){return d[c.accordionTransclude]},function(a){a&&(b.html(""),b.append(a))})}}}),angular.module("ui.bootstrap.alert",[]).controller("AlertController",["$scope","$attrs",function(a,b){a.closeable="close"in b,this.close=a.close}]).directive("alert",function(){return{restrict:"EA",controller:"AlertController",templateUrl:"template/alert/alert.html",transclude:!0,replace:!0,scope:{type:"@",close:"&"}}}).directive("dismissOnTimeout",["$timeout",function(a){return{require:"alert",link:function(b,c,d,e){a(function(){e.close()},parseInt(d.dismissOnTimeout,10))}}}]),angular.module("ui.bootstrap.bindHtml",[]).directive("bindHtmlUnsafe",function(){return function(a,b,c){b.addClass("ng-binding").data("$binding",c.bindHtmlUnsafe),a.$watch(c.bindHtmlUnsafe,function(a){b.html(a||"")})}}),angular.module("ui.bootstrap.buttons",[]).constant("buttonConfig",{activeClass:"active",toggleEvent:"click"}).controller("ButtonsController",["buttonConfig",function(a){this.activeClass=a.activeClass||"active",this.toggleEvent=a.toggleEvent||"click"}]).directive("btnRadio",function(){return{require:["btnRadio","ngModel"],controller:"ButtonsController",link:function(a,b,c,d){var e=d[0],f=d[1];f.$render=function(){b.toggleClass(e.activeClass,angular.equals(f.$modelValue,a.$eval(c.btnRadio)))},b.bind(e.toggleEvent,function(){var d=b.hasClass(e.activeClass);(!d||angular.isDefined(c.uncheckable))&&a.$apply(function(){f.$setViewValue(d?null:a.$eval(c.btnRadio)),f.$render()})})}}}).directive("btnCheckbox",function(){return{require:["btnCheckbox","ngModel"],controller:"ButtonsController",link:function(a,b,c,d){function e(){return g(c.btnCheckboxTrue,!0)}function f(){return g(c.btnCheckboxFalse,!1)}function g(b,c){var d=a.$eval(b);return angular.isDefined(d)?d:c}var h=d[0],i=d[1];i.$render=function(){b.toggleClass(h.activeClass,angular.equals(i.$modelValue,e()))},b.bind(h.toggleEvent,function(){a.$apply(function(){i.$setViewValue(b.hasClass(h.activeClass)?f():e()),i.$render()})})}}}),angular.module("ui.bootstrap.carousel",["ui.bootstrap.transition"]).controller("CarouselController",["$scope","$timeout","$interval","$transition",function(a,b,c,d){function e(){f();var b=+a.interval;!isNaN(b)&&b>0&&(h=c(g,b))}function f(){h&&(c.cancel(h),h=null)}function g(){var b=+a.interval;i&&!isNaN(b)&&b>0?a.next():a.pause()}var h,i,j=this,k=j.slides=a.slides=[],l=-1;j.currentSlide=null;var m=!1;j.select=a.select=function(c,f){function g(){if(!m){if(j.currentSlide&&angular.isString(f)&&!a.noTransition&&c.$element){c.$element.addClass(f);{c.$element[0].offsetWidth}angular.forEach(k,function(a){angular.extend(a,{direction:"",entering:!1,leaving:!1,active:!1})}),angular.extend(c,{direction:f,active:!0,entering:!0}),angular.extend(j.currentSlide||{},{direction:f,leaving:!0}),a.$currentTransition=d(c.$element,{}),function(b,c){a.$currentTransition.then(function(){h(b,c)},function(){h(b,c)})}(c,j.currentSlide)}else h(c,j.currentSlide);j.currentSlide=c,l=i,e()}}function h(b,c){angular.extend(b,{direction:"",active:!0,leaving:!1,entering:!1}),angular.extend(c||{},{direction:"",active:!1,leaving:!1,entering:!1}),a.$currentTransition=null}var i=k.indexOf(c);void 0===f&&(f=i>l?"next":"prev"),c&&c!==j.currentSlide&&(a.$currentTransition?(a.$currentTransition.cancel(),b(g)):g())},a.$on("$destroy",function(){m=!0}),j.indexOfSlide=function(a){return k.indexOf(a)},a.next=function(){var b=(l+1)%k.length;return a.$currentTransition?void 0:j.select(k[b],"next")},a.prev=function(){var b=0>l-1?k.length-1:l-1;return a.$currentTransition?void 0:j.select(k[b],"prev")},a.isActive=function(a){return j.currentSlide===a},a.$watch("interval",e),a.$on("$destroy",f),a.play=function(){i||(i=!0,e())},a.pause=function(){a.noPause||(i=!1,f())},j.addSlide=function(b,c){b.$element=c,k.push(b),1===k.length||b.active?(j.select(k[k.length-1]),1==k.length&&a.play()):b.active=!1},j.removeSlide=function(a){var b=k.indexOf(a);k.splice(b,1),k.length>0&&a.active?j.select(b>=k.length?k[b-1]:k[b]):l>b&&l--}}]).directive("carousel",[function(){return{restrict:"EA",transclude:!0,replace:!0,controller:"CarouselController",require:"carousel",templateUrl:"template/carousel/carousel.html",scope:{interval:"=",noTransition:"=",noPause:"="}}}]).directive("slide",function(){return{require:"^carousel",restrict:"EA",transclude:!0,replace:!0,templateUrl:"template/carousel/slide.html",scope:{active:"=?"},link:function(a,b,c,d){d.addSlide(a,b),a.$on("$destroy",function(){d.removeSlide(a)}),a.$watch("active",function(b){b&&d.select(a)})}}}),angular.module("ui.bootstrap.dateparser",[]).service("dateParser",["$locale","orderByFilter",function(a,b){function c(a){var c=[],d=a.split("");return angular.forEach(e,function(b,e){var f=a.indexOf(e);if(f>-1){a=a.split(""),d[f]="("+b.regex+")",a[f]="$";for(var g=f+1,h=f+e.length;h>g;g++)d[g]="",a[g]="$";a=a.join(""),c.push({index:f,apply:b.apply})}}),{regex:new RegExp("^"+d.join("")+"$"),map:b(c,"index")}}function d(a,b,c){return 1===b&&c>28?29===c&&(a%4===0&&a%100!==0||a%400===0):3===b||5===b||8===b||10===b?31>c:!0}this.parsers={};var e={yyyy:{regex:"\\d{4}",apply:function(a){this.year=+a}},yy:{regex:"\\d{2}",apply:function(a){this.year=+a+2e3}},y:{regex:"\\d{1,4}",apply:function(a){this.year=+a}},MMMM:{regex:a.DATETIME_FORMATS.MONTH.join("|"),apply:function(b){this.month=a.DATETIME_FORMATS.MONTH.indexOf(b)}},MMM:{regex:a.DATETIME_FORMATS.SHORTMONTH.join("|"),apply:function(b){this.month=a.DATETIME_FORMATS.SHORTMONTH.indexOf(b)}},MM:{regex:"0[1-9]|1[0-2]",apply:function(a){this.month=a-1}},M:{regex:"[1-9]|1[0-2]",apply:function(a){this.month=a-1}},dd:{regex:"[0-2][0-9]{1}|3[0-1]{1}",apply:function(a){this.date=+a}},d:{regex:"[1-2]?[0-9]{1}|3[0-1]{1}",apply:function(a){this.date=+a}},EEEE:{regex:a.DATETIME_FORMATS.DAY.join("|")},EEE:{regex:a.DATETIME_FORMATS.SHORTDAY.join("|")}};this.parse=function(b,e){if(!angular.isString(b)||!e)return b;e=a.DATETIME_FORMATS[e]||e,this.parsers[e]||(this.parsers[e]=c(e));var f=this.parsers[e],g=f.regex,h=f.map,i=b.match(g);if(i&&i.length){for(var j,k={year:1900,month:0,date:1,hours:0},l=1,m=i.length;m>l;l++){var n=h[l-1];n.apply&&n.apply.call(k,i[l])}return d(k.year,k.month,k.date)&&(j=new Date(k.year,k.month,k.date,k.hours)),j}}}]),angular.module("ui.bootstrap.position",[]).factory("$position",["$document","$window",function(a,b){function c(a,c){return a.currentStyle?a.currentStyle[c]:b.getComputedStyle?b.getComputedStyle(a)[c]:a.style[c]}function d(a){return"static"===(c(a,"position")||"static")}var e=function(b){for(var c=a[0],e=b.offsetParent||c;e&&e!==c&&d(e);)e=e.offsetParent;return e||c};return{position:function(b){var c=this.offset(b),d={top:0,left:0},f=e(b[0]);f!=a[0]&&(d=this.offset(angular.element(f)),d.top+=f.clientTop-f.scrollTop,d.left+=f.clientLeft-f.scrollLeft);var g=b[0].getBoundingClientRect();return{width:g.width||b.prop("offsetWidth"),height:g.height||b.prop("offsetHeight"),top:c.top-d.top,left:c.left-d.left}},offset:function(c){var d=c[0].getBoundingClientRect();return{width:d.width||c.prop("offsetWidth"),height:d.height||c.prop("offsetHeight"),top:d.top+(b.pageYOffset||a[0].documentElement.scrollTop),left:d.left+(b.pageXOffset||a[0].documentElement.scrollLeft)}},positionElements:function(a,b,c,d){var e,f,g,h,i=c.split("-"),j=i[0],k=i[1]||"center";e=d?this.offset(a):this.position(a),f=b.prop("offsetWidth"),g=b.prop("offsetHeight");var l={center:function(){return e.left+e.width/2-f/2},left:function(){return e.left},right:function(){return e.left+e.width}},m={center:function(){return e.top+e.height/2-g/2},top:function(){return e.top},bottom:function(){return e.top+e.height}};switch(j){case"right":h={top:m[k](),left:l[j]()};break;case"left":h={top:m[k](),left:e.left-f};break;case"bottom":h={top:m[j](),left:l[k]()};break;default:h={top:e.top-g,left:l[k]()}}return h}}}]),angular.module("ui.bootstrap.datepicker",["ui.bootstrap.dateparser","ui.bootstrap.position"]).constant("datepickerConfig",{formatDay:"dd",formatMonth:"MMMM",formatYear:"yyyy",formatDayHeader:"EEE",formatDayTitle:"MMMM yyyy",formatMonthTitle:"yyyy",datepickerMode:"day",minMode:"day",maxMode:"year",showWeeks:!0,startingDay:0,yearRange:20,minDate:null,maxDate:null}).controller("DatepickerController",["$scope","$attrs","$parse","$interpolate","$timeout","$log","dateFilter","datepickerConfig",function(a,b,c,d,e,f,g,h){var i=this,j={$setViewValue:angular.noop};this.modes=["day","month","year"],angular.forEach(["formatDay","formatMonth","formatYear","formatDayHeader","formatDayTitle","formatMonthTitle","minMode","maxMode","showWeeks","startingDay","yearRange"],function(c,e){i[c]=angular.isDefined(b[c])?8>e?d(b[c])(a.$parent):a.$parent.$eval(b[c]):h[c]}),angular.forEach(["minDate","maxDate"],function(d){b[d]?a.$parent.$watch(c(b[d]),function(a){i[d]=a?new Date(a):null,i.refreshView()}):i[d]=h[d]?new Date(h[d]):null}),a.datepickerMode=a.datepickerMode||h.datepickerMode,a.uniqueId="datepicker-"+a.$id+"-"+Math.floor(1e4*Math.random()),this.activeDate=angular.isDefined(b.initDate)?a.$parent.$eval(b.initDate):new Date,a.isActive=function(b){return 0===i.compare(b.date,i.activeDate)?(a.activeDateId=b.uid,!0):!1},this.init=function(a){j=a,j.$render=function(){i.render()}},this.render=function(){if(j.$modelValue){var a=new Date(j.$modelValue),b=!isNaN(a);b?this.activeDate=a:f.error('Datepicker directive: "ng-model" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.'),j.$setValidity("date",b)}this.refreshView()},this.refreshView=function(){if(this.element){this._refreshView();var a=j.$modelValue?new Date(j.$modelValue):null;j.$setValidity("date-disabled",!a||this.element&&!this.isDisabled(a))}},this.createDateObject=function(a,b){var c=j.$modelValue?new Date(j.$modelValue):null;return{date:a,label:g(a,b),selected:c&&0===this.compare(a,c),disabled:this.isDisabled(a),current:0===this.compare(a,new Date)}},this.isDisabled=function(c){return this.minDate&&this.compare(c,this.minDate)<0||this.maxDate&&this.compare(c,this.maxDate)>0||b.dateDisabled&&a.dateDisabled({date:c,mode:a.datepickerMode})},this.split=function(a,b){for(var c=[];a.length>0;)c.push(a.splice(0,b));return c},a.select=function(b){if(a.datepickerMode===i.minMode){var c=j.$modelValue?new Date(j.$modelValue):new Date(0,0,0,0,0,0,0);c.setFullYear(b.getFullYear(),b.getMonth(),b.getDate()),j.$setViewValue(c),j.$render()}else i.activeDate=b,a.datepickerMode=i.modes[i.modes.indexOf(a.datepickerMode)-1]},a.move=function(a){var b=i.activeDate.getFullYear()+a*(i.step.years||0),c=i.activeDate.getMonth()+a*(i.step.months||0);i.activeDate.setFullYear(b,c,1),i.refreshView()},a.toggleMode=function(b){b=b||1,a.datepickerMode===i.maxMode&&1===b||a.datepickerMode===i.minMode&&-1===b||(a.datepickerMode=i.modes[i.modes.indexOf(a.datepickerMode)+b])},a.keys={13:"enter",32:"space",33:"pageup",34:"pagedown",35:"end",36:"home",37:"left",38:"up",39:"right",40:"down"};var k=function(){e(function(){i.element[0].focus()},0,!1)};a.$on("datepicker.focus",k),a.keydown=function(b){var c=a.keys[b.which];if(c&&!b.shiftKey&&!b.altKey)if(b.preventDefault(),b.stopPropagation(),"enter"===c||"space"===c){if(i.isDisabled(i.activeDate))return;a.select(i.activeDate),k()}else!b.ctrlKey||"up"!==c&&"down"!==c?(i.handleKeyDown(c,b),i.refreshView()):(a.toggleMode("up"===c?1:-1),k())}}]).directive("datepicker",function(){return{restrict:"EA",replace:!0,templateUrl:"template/datepicker/datepicker.html",scope:{datepickerMode:"=?",dateDisabled:"&"},require:["datepicker","?^ngModel"],controller:"DatepickerController",link:function(a,b,c,d){var e=d[0],f=d[1];f&&e.init(f)}}}).directive("daypicker",["dateFilter",function(a){return{restrict:"EA",replace:!0,templateUrl:"template/datepicker/day.html",require:"^datepicker",link:function(b,c,d,e){function f(a,b){return 1!==b||a%4!==0||a%100===0&&a%400!==0?i[b]:29}function g(a,b){var c=new Array(b),d=new Date(a),e=0;for(d.setHours(12);b>e;)c[e++]=new Date(d),d.setDate(d.getDate()+1);return c}function h(a){var b=new Date(a);b.setDate(b.getDate()+4-(b.getDay()||7));var c=b.getTime();return b.setMonth(0),b.setDate(1),Math.floor(Math.round((c-b)/864e5)/7)+1}b.showWeeks=e.showWeeks,e.step={months:1},e.element=c;var i=[31,28,31,30,31,30,31,31,30,31,30,31];e._refreshView=function(){var c=e.activeDate.getFullYear(),d=e.activeDate.getMonth(),f=new Date(c,d,1),i=e.startingDay-f.getDay(),j=i>0?7-i:-i,k=new Date(f);j>0&&k.setDate(-j+1);for(var l=g(k,42),m=0;42>m;m++)l[m]=angular.extend(e.createDateObject(l[m],e.formatDay),{secondary:l[m].getMonth()!==d,uid:b.uniqueId+"-"+m});b.labels=new Array(7);for(var n=0;7>n;n++)b.labels[n]={abbr:a(l[n].date,e.formatDayHeader),full:a(l[n].date,"EEEE")};if(b.title=a(e.activeDate,e.formatDayTitle),b.rows=e.split(l,7),b.showWeeks){b.weekNumbers=[];for(var o=h(b.rows[0][0].date),p=b.rows.length;b.weekNumbers.push(o++)f;f++)c[f]=angular.extend(e.createDateObject(new Date(d,f,1),e.formatMonth),{uid:b.uniqueId+"-"+f});b.title=a(e.activeDate,e.formatMonthTitle),b.rows=e.split(c,3)},e.compare=function(a,b){return new Date(a.getFullYear(),a.getMonth())-new Date(b.getFullYear(),b.getMonth())},e.handleKeyDown=function(a){var b=e.activeDate.getMonth();if("left"===a)b-=1;else if("up"===a)b-=3;else if("right"===a)b+=1;else if("down"===a)b+=3;else if("pageup"===a||"pagedown"===a){var c=e.activeDate.getFullYear()+("pageup"===a?-1:1);e.activeDate.setFullYear(c)}else"home"===a?b=0:"end"===a&&(b=11);e.activeDate.setMonth(b)},e.refreshView()}}}]).directive("yearpicker",["dateFilter",function(){return{restrict:"EA",replace:!0,templateUrl:"template/datepicker/year.html",require:"^datepicker",link:function(a,b,c,d){function e(a){return parseInt((a-1)/f,10)*f+1}var f=d.yearRange;d.step={years:f},d.element=b,d._refreshView=function(){for(var b=new Array(f),c=0,g=e(d.activeDate.getFullYear());f>c;c++)b[c]=angular.extend(d.createDateObject(new Date(g+c,0,1),d.formatYear),{uid:a.uniqueId+"-"+c});a.title=[b[0].label,b[f-1].label].join(" - "),a.rows=d.split(b,5)},d.compare=function(a,b){return a.getFullYear()-b.getFullYear()},d.handleKeyDown=function(a){var b=d.activeDate.getFullYear();"left"===a?b-=1:"up"===a?b-=5:"right"===a?b+=1:"down"===a?b+=5:"pageup"===a||"pagedown"===a?b+=("pageup"===a?-1:1)*d.step.years:"home"===a?b=e(d.activeDate.getFullYear()):"end"===a&&(b=e(d.activeDate.getFullYear())+f-1),d.activeDate.setFullYear(b)},d.refreshView()}}}]).constant("datepickerPopupConfig",{datepickerPopup:"yyyy-MM-dd",currentText:"Today",clearText:"Clear",closeText:"Done",closeOnDateSelection:!0,appendToBody:!1,showButtonBar:!0}).directive("datepickerPopup",["$compile","$parse","$document","$position","dateFilter","dateParser","datepickerPopupConfig",function(a,b,c,d,e,f,g){return{restrict:"EA",require:"ngModel",scope:{isOpen:"=?",currentText:"@",clearText:"@",closeText:"@",dateDisabled:"&"},link:function(h,i,j,k){function l(a){return a.replace(/([A-Z])/g,function(a){return"-"+a.toLowerCase()})}function m(a){if(a){if(angular.isDate(a)&&!isNaN(a))return k.$setValidity("date",!0),a;if(angular.isString(a)){var b=f.parse(a,n)||new Date(a);return isNaN(b)?void k.$setValidity("date",!1):(k.$setValidity("date",!0),b)}return void k.$setValidity("date",!1)}return k.$setValidity("date",!0),null}var n,o=angular.isDefined(j.closeOnDateSelection)?h.$parent.$eval(j.closeOnDateSelection):g.closeOnDateSelection,p=angular.isDefined(j.datepickerAppendToBody)?h.$parent.$eval(j.datepickerAppendToBody):g.appendToBody;h.showButtonBar=angular.isDefined(j.showButtonBar)?h.$parent.$eval(j.showButtonBar):g.showButtonBar,h.getText=function(a){return h[a+"Text"]||g[a+"Text"]},j.$observe("datepickerPopup",function(a){n=a||g.datepickerPopup,k.$render()});var q=angular.element("

    ");q.attr({"ng-model":"date","ng-change":"dateSelection()"});var r=angular.element(q.children()[0]);j.datepickerOptions&&angular.forEach(h.$parent.$eval(j.datepickerOptions),function(a,b){r.attr(l(b),a)}),h.watchData={},angular.forEach(["minDate","maxDate","datepickerMode"],function(a){if(j[a]){var c=b(j[a]);if(h.$parent.$watch(c,function(b){h.watchData[a]=b}),r.attr(l(a),"watchData."+a),"datepickerMode"===a){var d=c.assign;h.$watch("watchData."+a,function(a,b){a!==b&&d(h.$parent,a)})}}}),j.dateDisabled&&r.attr("date-disabled","dateDisabled({ date: date, mode: mode })"),k.$parsers.unshift(m),h.dateSelection=function(a){angular.isDefined(a)&&(h.date=a),k.$setViewValue(h.date),k.$render(),o&&(h.isOpen=!1,i[0].focus())},i.bind("input change keyup",function(){h.$apply(function(){h.date=k.$modelValue})}),k.$render=function(){var a=k.$viewValue?e(k.$viewValue,n):"";i.val(a),h.date=m(k.$modelValue)};var s=function(a){h.isOpen&&a.target!==i[0]&&h.$apply(function(){h.isOpen=!1})},t=function(a){h.keydown(a)};i.bind("keydown",t),h.keydown=function(a){27===a.which?(a.preventDefault(),a.stopPropagation(),h.close()):40!==a.which||h.isOpen||(h.isOpen=!0)},h.$watch("isOpen",function(a){a?(h.$broadcast("datepicker.focus"),h.position=p?d.offset(i):d.position(i),h.position.top=h.position.top+i.prop("offsetHeight"),c.bind("click",s)):c.unbind("click",s)}),h.select=function(a){if("today"===a){var b=new Date;angular.isDate(k.$modelValue)?(a=new Date(k.$modelValue),a.setFullYear(b.getFullYear(),b.getMonth(),b.getDate())):a=new Date(b.setHours(0,0,0,0))}h.dateSelection(a)},h.close=function(){h.isOpen=!1,i[0].focus()};var u=a(q)(h);q.remove(),p?c.find("body").append(u):i.after(u),h.$on("$destroy",function(){u.remove(),i.unbind("keydown",t),c.unbind("click",s)})}}}]).directive("datepickerPopupWrap",function(){return{restrict:"EA",replace:!0,transclude:!0,templateUrl:"template/datepicker/popup.html",link:function(a,b){b.bind("click",function(a){a.preventDefault(),a.stopPropagation()})}}}),angular.module("ui.bootstrap.dropdown",[]).constant("dropdownConfig",{openClass:"open"}).service("dropdownService",["$document",function(a){var b=null;this.open=function(e){b||(a.bind("click",c),a.bind("keydown",d)),b&&b!==e&&(b.isOpen=!1),b=e},this.close=function(e){b===e&&(b=null,a.unbind("click",c),a.unbind("keydown",d))};var c=function(a){if(b){var c=b.getToggleElement();a&&c&&c[0].contains(a.target)||b.$apply(function(){b.isOpen=!1})}},d=function(a){27===a.which&&(b.focusToggleElement(),c())}}]).controller("DropdownController",["$scope","$attrs","$parse","dropdownConfig","dropdownService","$animate",function(a,b,c,d,e,f){var g,h=this,i=a.$new(),j=d.openClass,k=angular.noop,l=b.onToggle?c(b.onToggle):angular.noop;this.init=function(d){h.$element=d,b.isOpen&&(g=c(b.isOpen),k=g.assign,a.$watch(g,function(a){i.isOpen=!!a}))},this.toggle=function(a){return i.isOpen=arguments.length?!!a:!i.isOpen},this.isOpen=function(){return i.isOpen},i.getToggleElement=function(){return h.toggleElement},i.focusToggleElement=function(){h.toggleElement&&h.toggleElement[0].focus()},i.$watch("isOpen",function(b,c){f[b?"addClass":"removeClass"](h.$element,j),b?(i.focusToggleElement(),e.open(i)):e.close(i),k(a,b),angular.isDefined(b)&&b!==c&&l(a,{open:!!b})}),a.$on("$locationChangeSuccess",function(){i.isOpen=!1}),a.$on("$destroy",function(){i.$destroy()})}]).directive("dropdown",function(){return{controller:"DropdownController",link:function(a,b,c,d){d.init(b)}}}).directive("dropdownToggle",function(){return{require:"?^dropdown",link:function(a,b,c,d){if(d){d.toggleElement=b;var e=function(e){e.preventDefault(),b.hasClass("disabled")||c.disabled||a.$apply(function(){d.toggle()})};b.bind("click",e),b.attr({"aria-haspopup":!0,"aria-expanded":!1}),a.$watch(d.isOpen,function(a){b.attr("aria-expanded",!!a)}),a.$on("$destroy",function(){b.unbind("click",e)})}}}}),angular.module("ui.bootstrap.modal",["ui.bootstrap.transition"]).factory("$$stackedMap",function(){return{createNew:function(){var a=[];return{add:function(b,c){a.push({key:b,value:c})},get:function(b){for(var c=0;c0),i()})}function i(){if(k&&-1==g()){var a=l;j(k,l,150,function(){a.$destroy(),a=null}),k=void 0,l=void 0}}function j(c,d,e,f){function g(){g.done||(g.done=!0,c.remove(),f&&f())}d.animate=!1;var h=a.transitionEndEventName;if(h){var i=b(g,e);c.bind(h,function(){b.cancel(i),g(),d.$apply()})}else b(g)}var k,l,m="modal-open",n=f.createNew(),o={};return e.$watch(g,function(a){l&&(l.index=a)}),c.bind("keydown",function(a){var b;27===a.which&&(b=n.top(),b&&b.value.keyboard&&(a.preventDefault(),e.$apply(function(){o.dismiss(b.key,"escape key press")})))}),o.open=function(a,b){n.add(a,{deferred:b.deferred,modalScope:b.scope,backdrop:b.backdrop,keyboard:b.keyboard});var f=c.find("body").eq(0),h=g();if(h>=0&&!k){l=e.$new(!0),l.index=h;var i=angular.element("
    ");i.attr("backdrop-class",b.backdropClass),k=d(i)(l),f.append(k)}var j=angular.element("
    ");j.attr({"template-url":b.windowTemplateUrl,"window-class":b.windowClass,size:b.size,index:n.length()-1,animate:"animate"}).html(b.content);var o=d(j)(b.scope);n.top().value.modalDomEl=o,f.append(o),f.addClass(m)},o.close=function(a,b){var c=n.get(a);c&&(c.value.deferred.resolve(b),h(a))},o.dismiss=function(a,b){var c=n.get(a);c&&(c.value.deferred.reject(b),h(a))},o.dismissAll=function(a){for(var b=this.getTop();b;)this.dismiss(b.key,a),b=this.getTop()},o.getTop=function(){return n.top()},o}]).provider("$modal",function(){var a={options:{backdrop:!0,keyboard:!0},$get:["$injector","$rootScope","$q","$http","$templateCache","$controller","$modalStack",function(b,c,d,e,f,g,h){function i(a){return a.template?d.when(a.template):e.get(angular.isFunction(a.templateUrl)?a.templateUrl():a.templateUrl,{cache:f}).then(function(a){return a.data})}function j(a){var c=[];return angular.forEach(a,function(a){(angular.isFunction(a)||angular.isArray(a))&&c.push(d.when(b.invoke(a)))}),c}var k={};return k.open=function(b){var e=d.defer(),f=d.defer(),k={result:e.promise,opened:f.promise,close:function(a){h.close(k,a)},dismiss:function(a){h.dismiss(k,a)}};if(b=angular.extend({},a.options,b),b.resolve=b.resolve||{},!b.template&&!b.templateUrl)throw new Error("One of template or templateUrl options is required.");var l=d.all([i(b)].concat(j(b.resolve)));return l.then(function(a){var d=(b.scope||c).$new();d.$close=k.close,d.$dismiss=k.dismiss;var f,i={},j=1;b.controller&&(i.$scope=d,i.$modalInstance=k,angular.forEach(b.resolve,function(b,c){i[c]=a[j++]}),f=g(b.controller,i),b.controllerAs&&(d[b.controllerAs]=f)),h.open(k,{scope:d,deferred:e,content:a[0],backdrop:b.backdrop,keyboard:b.keyboard,backdropClass:b.backdropClass,windowClass:b.windowClass,windowTemplateUrl:b.windowTemplateUrl,size:b.size})},function(a){e.reject(a)}),l.then(function(){f.resolve(!0)},function(){f.reject(!1)}),k},k}]};return a}),angular.module("ui.bootstrap.pagination",[]).controller("PaginationController",["$scope","$attrs","$parse",function(a,b,c){var d=this,e={$setViewValue:angular.noop},f=b.numPages?c(b.numPages).assign:angular.noop;this.init=function(f,g){e=f,this.config=g,e.$render=function(){d.render()},b.itemsPerPage?a.$parent.$watch(c(b.itemsPerPage),function(b){d.itemsPerPage=parseInt(b,10),a.totalPages=d.calculateTotalPages()}):this.itemsPerPage=g.itemsPerPage},this.calculateTotalPages=function(){var b=this.itemsPerPage<1?1:Math.ceil(a.totalItems/this.itemsPerPage);return Math.max(b||0,1)},this.render=function(){a.page=parseInt(e.$viewValue,10)||1},a.selectPage=function(b){a.page!==b&&b>0&&b<=a.totalPages&&(e.$setViewValue(b),e.$render())},a.getText=function(b){return a[b+"Text"]||d.config[b+"Text"]},a.noPrevious=function(){return 1===a.page},a.noNext=function(){return a.page===a.totalPages},a.$watch("totalItems",function(){a.totalPages=d.calculateTotalPages()}),a.$watch("totalPages",function(b){f(a.$parent,b),a.page>b?a.selectPage(b):e.$render()})}]).constant("paginationConfig",{itemsPerPage:10,boundaryLinks:!1,directionLinks:!0,firstText:"First",previousText:"Previous",nextText:"Next",lastText:"Last",rotate:!0}).directive("pagination",["$parse","paginationConfig",function(a,b){return{restrict:"EA",scope:{totalItems:"=",firstText:"@",previousText:"@",nextText:"@",lastText:"@"},require:["pagination","?ngModel"],controller:"PaginationController",templateUrl:"template/pagination/pagination.html",replace:!0,link:function(c,d,e,f){function g(a,b,c){return{number:a,text:b,active:c}}function h(a,b){var c=[],d=1,e=b,f=angular.isDefined(k)&&b>k;f&&(l?(d=Math.max(a-Math.floor(k/2),1),e=d+k-1,e>b&&(e=b,d=e-k+1)):(d=(Math.ceil(a/k)-1)*k+1,e=Math.min(d+k-1,b)));for(var h=d;e>=h;h++){var i=g(h,h,h===a);c.push(i)}if(f&&!l){if(d>1){var j=g(d-1,"...",!1);c.unshift(j)}if(b>e){var m=g(e+1,"...",!1);c.push(m)}}return c}var i=f[0],j=f[1];if(j){var k=angular.isDefined(e.maxSize)?c.$parent.$eval(e.maxSize):b.maxSize,l=angular.isDefined(e.rotate)?c.$parent.$eval(e.rotate):b.rotate;c.boundaryLinks=angular.isDefined(e.boundaryLinks)?c.$parent.$eval(e.boundaryLinks):b.boundaryLinks,c.directionLinks=angular.isDefined(e.directionLinks)?c.$parent.$eval(e.directionLinks):b.directionLinks,i.init(j,b),e.maxSize&&c.$parent.$watch(a(e.maxSize),function(a){k=parseInt(a,10),i.render() });var m=i.render;i.render=function(){m(),c.page>0&&c.page<=c.totalPages&&(c.pages=h(c.page,c.totalPages))}}}}}]).constant("pagerConfig",{itemsPerPage:10,previousText:"« Previous",nextText:"Next »",align:!0}).directive("pager",["pagerConfig",function(a){return{restrict:"EA",scope:{totalItems:"=",previousText:"@",nextText:"@"},require:["pager","?ngModel"],controller:"PaginationController",templateUrl:"template/pagination/pager.html",replace:!0,link:function(b,c,d,e){var f=e[0],g=e[1];g&&(b.align=angular.isDefined(d.align)?b.$parent.$eval(d.align):a.align,f.init(g,a))}}}]),angular.module("ui.bootstrap.tooltip",["ui.bootstrap.position","ui.bootstrap.bindHtml"]).provider("$tooltip",function(){function a(a){var b=/[A-Z]/g,c="-";return a.replace(b,function(a,b){return(b?c:"")+a.toLowerCase()})}var b={placement:"top",animation:!0,popupDelay:0},c={mouseenter:"mouseleave",click:"click",focus:"blur"},d={};this.options=function(a){angular.extend(d,a)},this.setTriggers=function(a){angular.extend(c,a)},this.$get=["$window","$compile","$timeout","$document","$position","$interpolate",function(e,f,g,h,i,j){return function(e,k,l){function m(a){var b=a||n.trigger||l,d=c[b]||b;return{show:b,hide:d}}var n=angular.extend({},b,d),o=a(e),p=j.startSymbol(),q=j.endSymbol(),r="
    ';return{restrict:"EA",compile:function(){var a=f(r);return function(b,c,d){function f(){D.isOpen?l():j()}function j(){(!C||b.$eval(d[k+"Enable"]))&&(s(),D.popupDelay?z||(z=g(o,D.popupDelay,!1),z.then(function(a){a()})):o()())}function l(){b.$apply(function(){p()})}function o(){return z=null,y&&(g.cancel(y),y=null),D.content?(q(),w.css({top:0,left:0,display:"block"}),A?h.find("body").append(w):c.after(w),E(),D.isOpen=!0,D.$digest(),E):angular.noop}function p(){D.isOpen=!1,g.cancel(z),z=null,D.animation?y||(y=g(r,500)):r()}function q(){w&&r(),x=D.$new(),w=a(x,angular.noop)}function r(){y=null,w&&(w.remove(),w=null),x&&(x.$destroy(),x=null)}function s(){t(),u()}function t(){var a=d[k+"Placement"];D.placement=angular.isDefined(a)?a:n.placement}function u(){var a=d[k+"PopupDelay"],b=parseInt(a,10);D.popupDelay=isNaN(b)?n.popupDelay:b}function v(){var a=d[k+"Trigger"];F(),B=m(a),B.show===B.hide?c.bind(B.show,f):(c.bind(B.show,j),c.bind(B.hide,l))}var w,x,y,z,A=angular.isDefined(n.appendToBody)?n.appendToBody:!1,B=m(void 0),C=angular.isDefined(d[k+"Enable"]),D=b.$new(!0),E=function(){var a=i.positionElements(c,w,D.placement,A);a.top+="px",a.left+="px",w.css(a)};D.isOpen=!1,d.$observe(e,function(a){D.content=a,!a&&D.isOpen&&p()}),d.$observe(k+"Title",function(a){D.title=a});var F=function(){c.unbind(B.show,j),c.unbind(B.hide,l)};v();var G=b.$eval(d[k+"Animation"]);D.animation=angular.isDefined(G)?!!G:n.animation;var H=b.$eval(d[k+"AppendToBody"]);A=angular.isDefined(H)?H:A,A&&b.$on("$locationChangeSuccess",function(){D.isOpen&&p()}),b.$on("$destroy",function(){g.cancel(y),g.cancel(z),F(),r(),D=null})}}}}}]}).directive("tooltipPopup",function(){return{restrict:"EA",replace:!0,scope:{content:"@",placement:"@",animation:"&",isOpen:"&"},templateUrl:"template/tooltip/tooltip-popup.html"}}).directive("tooltip",["$tooltip",function(a){return a("tooltip","tooltip","mouseenter")}]).directive("tooltipHtmlUnsafePopup",function(){return{restrict:"EA",replace:!0,scope:{content:"@",placement:"@",animation:"&",isOpen:"&"},templateUrl:"template/tooltip/tooltip-html-unsafe-popup.html"}}).directive("tooltipHtmlUnsafe",["$tooltip",function(a){return a("tooltipHtmlUnsafe","tooltip","mouseenter")}]),angular.module("ui.bootstrap.popover",["ui.bootstrap.tooltip"]).directive("popoverPopup",function(){return{restrict:"EA",replace:!0,scope:{title:"@",content:"@",placement:"@",animation:"&",isOpen:"&"},templateUrl:"template/popover/popover.html"}}).directive("popover",["$tooltip",function(a){return a("popover","popover","click")}]),angular.module("ui.bootstrap.progressbar",[]).constant("progressConfig",{animate:!0,max:100}).controller("ProgressController",["$scope","$attrs","progressConfig",function(a,b,c){var d=this,e=angular.isDefined(b.animate)?a.$parent.$eval(b.animate):c.animate;this.bars=[],a.max=angular.isDefined(b.max)?a.$parent.$eval(b.max):c.max,this.addBar=function(b,c){e||c.css({transition:"none"}),this.bars.push(b),b.$watch("value",function(c){b.percent=+(100*c/a.max).toFixed(2)}),b.$on("$destroy",function(){c=null,d.removeBar(b)})},this.removeBar=function(a){this.bars.splice(this.bars.indexOf(a),1)}}]).directive("progress",function(){return{restrict:"EA",replace:!0,transclude:!0,controller:"ProgressController",require:"progress",scope:{},templateUrl:"template/progressbar/progress.html"}}).directive("bar",function(){return{restrict:"EA",replace:!0,transclude:!0,require:"^progress",scope:{value:"=",type:"@"},templateUrl:"template/progressbar/bar.html",link:function(a,b,c,d){d.addBar(a,b)}}}).directive("progressbar",function(){return{restrict:"EA",replace:!0,transclude:!0,controller:"ProgressController",scope:{value:"=",type:"@"},templateUrl:"template/progressbar/progressbar.html",link:function(a,b,c,d){d.addBar(a,angular.element(b.children()[0]))}}}),angular.module("ui.bootstrap.rating",[]).constant("ratingConfig",{max:5,stateOn:null,stateOff:null}).controller("RatingController",["$scope","$attrs","ratingConfig",function(a,b,c){var d={$setViewValue:angular.noop};this.init=function(e){d=e,d.$render=this.render,this.stateOn=angular.isDefined(b.stateOn)?a.$parent.$eval(b.stateOn):c.stateOn,this.stateOff=angular.isDefined(b.stateOff)?a.$parent.$eval(b.stateOff):c.stateOff;var f=angular.isDefined(b.ratingStates)?a.$parent.$eval(b.ratingStates):new Array(angular.isDefined(b.max)?a.$parent.$eval(b.max):c.max);a.range=this.buildTemplateObjects(f)},this.buildTemplateObjects=function(a){for(var b=0,c=a.length;c>b;b++)a[b]=angular.extend({index:b},{stateOn:this.stateOn,stateOff:this.stateOff},a[b]);return a},a.rate=function(b){!a.readonly&&b>=0&&b<=a.range.length&&(d.$setViewValue(b),d.$render())},a.enter=function(b){a.readonly||(a.value=b),a.onHover({value:b})},a.reset=function(){a.value=d.$viewValue,a.onLeave()},a.onKeydown=function(b){/(37|38|39|40)/.test(b.which)&&(b.preventDefault(),b.stopPropagation(),a.rate(a.value+(38===b.which||39===b.which?1:-1)))},this.render=function(){a.value=d.$viewValue}}]).directive("rating",function(){return{restrict:"EA",require:["rating","ngModel"],scope:{readonly:"=?",onHover:"&",onLeave:"&"},controller:"RatingController",templateUrl:"template/rating/rating.html",replace:!0,link:function(a,b,c,d){var e=d[0],f=d[1];f&&e.init(f)}}}),angular.module("ui.bootstrap.tabs",[]).controller("TabsetController",["$scope",function(a){var b=this,c=b.tabs=a.tabs=[];b.select=function(a){angular.forEach(c,function(b){b.active&&b!==a&&(b.active=!1,b.onDeselect())}),a.active=!0,a.onSelect()},b.addTab=function(a){c.push(a),1===c.length?a.active=!0:a.active&&b.select(a)},b.removeTab=function(a){var e=c.indexOf(a);if(a.active&&c.length>1&&!d){var f=e==c.length-1?e-1:e+1;b.select(c[f])}c.splice(e,1)};var d;a.$on("$destroy",function(){d=!0})}]).directive("tabset",function(){return{restrict:"EA",transclude:!0,replace:!0,scope:{type:"@"},controller:"TabsetController",templateUrl:"template/tabs/tabset.html",link:function(a,b,c){a.vertical=angular.isDefined(c.vertical)?a.$parent.$eval(c.vertical):!1,a.justified=angular.isDefined(c.justified)?a.$parent.$eval(c.justified):!1}}}).directive("tab",["$parse",function(a){return{require:"^tabset",restrict:"EA",replace:!0,templateUrl:"template/tabs/tab.html",transclude:!0,scope:{active:"=?",heading:"@",onSelect:"&select",onDeselect:"&deselect"},controller:function(){},compile:function(b,c,d){return function(b,c,e,f){b.$watch("active",function(a){a&&f.select(b)}),b.disabled=!1,e.disabled&&b.$parent.$watch(a(e.disabled),function(a){b.disabled=!!a}),b.select=function(){b.disabled||(b.active=!0)},f.addTab(b),b.$on("$destroy",function(){f.removeTab(b)}),b.$transcludeFn=d}}}}]).directive("tabHeadingTransclude",[function(){return{restrict:"A",require:"^tab",link:function(a,b){a.$watch("headingElement",function(a){a&&(b.html(""),b.append(a))})}}}]).directive("tabContentTransclude",function(){function a(a){return a.tagName&&(a.hasAttribute("tab-heading")||a.hasAttribute("data-tab-heading")||"tab-heading"===a.tagName.toLowerCase()||"data-tab-heading"===a.tagName.toLowerCase())}return{restrict:"A",require:"^tabset",link:function(b,c,d){var e=b.$eval(d.tabContentTransclude);e.$transcludeFn(e.$parent,function(b){angular.forEach(b,function(b){a(b)?e.headingElement=b:c.append(b)})})}}}),angular.module("ui.bootstrap.timepicker",[]).constant("timepickerConfig",{hourStep:1,minuteStep:1,showMeridian:!0,meridians:null,readonlyInput:!1,mousewheel:!0}).controller("TimepickerController",["$scope","$attrs","$parse","$log","$locale","timepickerConfig",function(a,b,c,d,e,f){function g(){var b=parseInt(a.hours,10),c=a.showMeridian?b>0&&13>b:b>=0&&24>b;return c?(a.showMeridian&&(12===b&&(b=0),a.meridian===p[1]&&(b+=12)),b):void 0}function h(){var b=parseInt(a.minutes,10);return b>=0&&60>b?b:void 0}function i(a){return angular.isDefined(a)&&a.toString().length<2?"0"+a:a}function j(a){k(),o.$setViewValue(new Date(n)),l(a)}function k(){o.$setValidity("time",!0),a.invalidHours=!1,a.invalidMinutes=!1}function l(b){var c=n.getHours(),d=n.getMinutes();a.showMeridian&&(c=0===c||12===c?12:c%12),a.hours="h"===b?c:i(c),a.minutes="m"===b?d:i(d),a.meridian=n.getHours()<12?p[0]:p[1]}function m(a){var b=new Date(n.getTime()+6e4*a);n.setHours(b.getHours(),b.getMinutes()),j()}var n=new Date,o={$setViewValue:angular.noop},p=angular.isDefined(b.meridians)?a.$parent.$eval(b.meridians):f.meridians||e.DATETIME_FORMATS.AMPMS;this.init=function(c,d){o=c,o.$render=this.render;var e=d.eq(0),g=d.eq(1),h=angular.isDefined(b.mousewheel)?a.$parent.$eval(b.mousewheel):f.mousewheel;h&&this.setupMousewheelEvents(e,g),a.readonlyInput=angular.isDefined(b.readonlyInput)?a.$parent.$eval(b.readonlyInput):f.readonlyInput,this.setupInputEvents(e,g)};var q=f.hourStep;b.hourStep&&a.$parent.$watch(c(b.hourStep),function(a){q=parseInt(a,10)});var r=f.minuteStep;b.minuteStep&&a.$parent.$watch(c(b.minuteStep),function(a){r=parseInt(a,10)}),a.showMeridian=f.showMeridian,b.showMeridian&&a.$parent.$watch(c(b.showMeridian),function(b){if(a.showMeridian=!!b,o.$error.time){var c=g(),d=h();angular.isDefined(c)&&angular.isDefined(d)&&(n.setHours(c),j())}else l()}),this.setupMousewheelEvents=function(b,c){var d=function(a){a.originalEvent&&(a=a.originalEvent);var b=a.wheelDelta?a.wheelDelta:-a.deltaY;return a.detail||b>0};b.bind("mousewheel wheel",function(b){a.$apply(d(b)?a.incrementHours():a.decrementHours()),b.preventDefault()}),c.bind("mousewheel wheel",function(b){a.$apply(d(b)?a.incrementMinutes():a.decrementMinutes()),b.preventDefault()})},this.setupInputEvents=function(b,c){if(a.readonlyInput)return a.updateHours=angular.noop,void(a.updateMinutes=angular.noop);var d=function(b,c){o.$setViewValue(null),o.$setValidity("time",!1),angular.isDefined(b)&&(a.invalidHours=b),angular.isDefined(c)&&(a.invalidMinutes=c)};a.updateHours=function(){var a=g();angular.isDefined(a)?(n.setHours(a),j("h")):d(!0)},b.bind("blur",function(){!a.invalidHours&&a.hours<10&&a.$apply(function(){a.hours=i(a.hours)})}),a.updateMinutes=function(){var a=h();angular.isDefined(a)?(n.setMinutes(a),j("m")):d(void 0,!0)},c.bind("blur",function(){!a.invalidMinutes&&a.minutes<10&&a.$apply(function(){a.minutes=i(a.minutes)})})},this.render=function(){var a=o.$modelValue?new Date(o.$modelValue):null;isNaN(a)?(o.$setValidity("time",!1),d.error('Timepicker directive: "ng-model" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.')):(a&&(n=a),k(),l())},a.incrementHours=function(){m(60*q)},a.decrementHours=function(){m(60*-q)},a.incrementMinutes=function(){m(r)},a.decrementMinutes=function(){m(-r)},a.toggleMeridian=function(){m(720*(n.getHours()<12?1:-1))}}]).directive("timepicker",function(){return{restrict:"EA",require:["timepicker","?^ngModel"],controller:"TimepickerController",replace:!0,scope:{},templateUrl:"template/timepicker/timepicker.html",link:function(a,b,c,d){var e=d[0],f=d[1];f&&e.init(f,b.find("input"))}}}),angular.module("ui.bootstrap.typeahead",["ui.bootstrap.position","ui.bootstrap.bindHtml"]).factory("typeaheadParser",["$parse",function(a){var b=/^\s*([\s\S]+?)(?:\s+as\s+([\s\S]+?))?\s+for\s+(?:([\$\w][\$\w\d]*))\s+in\s+([\s\S]+?)$/;return{parse:function(c){var d=c.match(b);if(!d)throw new Error('Expected typeahead specification in form of "_modelValue_ (as _label_)? for _item_ in _collection_" but got "'+c+'".');return{itemName:d[3],source:a(d[4]),viewMapper:a(d[2]||d[1]),modelMapper:a(d[1])}}}}]).directive("typeahead",["$compile","$parse","$q","$timeout","$document","$position","typeaheadParser",function(a,b,c,d,e,f,g){var h=[9,13,27,38,40];return{require:"ngModel",link:function(i,j,k,l){var m,n=i.$eval(k.typeaheadMinLength)||1,o=i.$eval(k.typeaheadWaitMs)||0,p=i.$eval(k.typeaheadEditable)!==!1,q=b(k.typeaheadLoading).assign||angular.noop,r=b(k.typeaheadOnSelect),s=k.typeaheadInputFormatter?b(k.typeaheadInputFormatter):void 0,t=k.typeaheadAppendToBody?i.$eval(k.typeaheadAppendToBody):!1,u=i.$eval(k.typeaheadFocusFirst)!==!1,v=b(k.ngModel).assign,w=g.parse(k.typeahead),x=i.$new();i.$on("$destroy",function(){x.$destroy()});var y="typeahead-"+x.$id+"-"+Math.floor(1e4*Math.random());j.attr({"aria-autocomplete":"list","aria-expanded":!1,"aria-owns":y});var z=angular.element("
    ");z.attr({id:y,matches:"matches",active:"activeIdx",select:"select(activeIdx)",query:"query",position:"position"}),angular.isDefined(k.typeaheadTemplateUrl)&&z.attr("template-url",k.typeaheadTemplateUrl);var A=function(){x.matches=[],x.activeIdx=-1,j.attr("aria-expanded",!1)},B=function(a){return y+"-option-"+a};x.$watch("activeIdx",function(a){0>a?j.removeAttr("aria-activedescendant"):j.attr("aria-activedescendant",B(a))});var C=function(a){var b={$viewValue:a};q(i,!0),c.when(w.source(i,b)).then(function(c){var d=a===l.$viewValue;if(d&&m)if(c.length>0){x.activeIdx=u?0:-1,x.matches.length=0;for(var e=0;e=n?o>0?(F(),E(a)):C(a):(q(i,!1),F(),A()),p?a:a?void l.$setValidity("editable",!1):(l.$setValidity("editable",!0),a)}),l.$formatters.push(function(a){var b,c,d={};return s?(d.$model=a,s(i,d)):(d[w.itemName]=a,b=w.viewMapper(i,d),d[w.itemName]=void 0,c=w.viewMapper(i,d),b!==c?b:a)}),x.select=function(a){var b,c,e={};e[w.itemName]=c=x.matches[a].model,b=w.modelMapper(i,e),v(i,b),l.$setValidity("editable",!0),r(i,{$item:c,$model:b,$label:w.viewMapper(i,e)}),A(),d(function(){j[0].focus()},0,!1)},j.bind("keydown",function(a){0!==x.matches.length&&-1!==h.indexOf(a.which)&&(-1!=x.activeIdx||13!==a.which&&9!==a.which)&&(a.preventDefault(),40===a.which?(x.activeIdx=(x.activeIdx+1)%x.matches.length,x.$digest()):38===a.which?(x.activeIdx=(x.activeIdx>0?x.activeIdx:x.matches.length)-1,x.$digest()):13===a.which||9===a.which?x.$apply(function(){x.select(x.activeIdx)}):27===a.which&&(a.stopPropagation(),A(),x.$digest()))}),j.bind("blur",function(){m=!1});var G=function(a){j[0]!==a.target&&(A(),x.$digest())};e.bind("click",G),i.$on("$destroy",function(){e.unbind("click",G),t&&H.remove()});var H=a(z)(x);t?e.find("body").append(H):j.after(H)}}}]).directive("typeaheadPopup",function(){return{restrict:"EA",scope:{matches:"=",query:"=",active:"=",position:"=",select:"&"},replace:!0,templateUrl:"template/typeahead/typeahead-popup.html",link:function(a,b,c){a.templateUrl=c.templateUrl,a.isOpen=function(){return a.matches.length>0},a.isActive=function(b){return a.active==b},a.selectActive=function(b){a.active=b},a.selectMatch=function(b){a.select({activeIdx:b})}}}}).directive("typeaheadMatch",["$http","$templateCache","$compile","$parse",function(a,b,c,d){return{restrict:"EA",scope:{index:"=",match:"=",query:"="},link:function(e,f,g){var h=d(g.templateUrl)(e.$parent)||"template/typeahead/typeahead-match.html";a.get(h,{cache:b}).success(function(a){f.replaceWith(c(a.trim())(e))})}}}]).filter("typeaheadHighlight",function(){function a(a){return a.replace(/([.?*+^$[\]\\(){}|-])/g,"\\$1")}return function(b,c){return c?(""+b).replace(new RegExp(a(c),"gi"),"$&"):b}}),angular.module("template/accordion/accordion-group.html",[]).run(["$templateCache",function(a){a.put("template/accordion/accordion-group.html",'
    \n \n
    \n
    \n
    \n
    \n')}]),angular.module("template/accordion/accordion.html",[]).run(["$templateCache",function(a){a.put("template/accordion/accordion.html",'
    ')}]),angular.module("template/alert/alert.html",[]).run(["$templateCache",function(a){a.put("template/alert/alert.html",'\n')}]),angular.module("template/carousel/carousel.html",[]).run(["$templateCache",function(a){a.put("template/carousel/carousel.html",'\n')}]),angular.module("template/carousel/slide.html",[]).run(["$templateCache",function(a){a.put("template/carousel/slide.html","
    \n")}]),angular.module("template/datepicker/datepicker.html",[]).run(["$templateCache",function(a){a.put("template/datepicker/datepicker.html",'
    \n \n \n \n
    ')}]),angular.module("template/datepicker/day.html",[]).run(["$templateCache",function(a){a.put("template/datepicker/day.html",'\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    {{label.abbr}}
    {{ weekNumbers[$index] }}\n \n
    \n')}]),angular.module("template/datepicker/month.html",[]).run(["$templateCache",function(a){a.put("template/datepicker/month.html",'\n \n \n \n \n \n \n \n \n \n \n \n \n
    \n \n
    \n')}]),angular.module("template/datepicker/popup.html",[]).run(["$templateCache",function(a){a.put("template/datepicker/popup.html",'\n')}]),angular.module("template/datepicker/year.html",[]).run(["$templateCache",function(a){a.put("template/datepicker/year.html",'\n \n \n \n \n \n \n \n \n \n \n \n \n
    \n \n
    \n')}]),angular.module("template/modal/backdrop.html",[]).run(["$templateCache",function(a){a.put("template/modal/backdrop.html",'\n')}]),angular.module("template/modal/window.html",[]).run(["$templateCache",function(a){a.put("template/modal/window.html",'')}]),angular.module("template/pagination/pager.html",[]).run(["$templateCache",function(a){a.put("template/pagination/pager.html",'')}]),angular.module("template/pagination/pagination.html",[]).run(["$templateCache",function(a){a.put("template/pagination/pagination.html",'')}]),angular.module("template/tooltip/tooltip-html-unsafe-popup.html",[]).run(["$templateCache",function(a){a.put("template/tooltip/tooltip-html-unsafe-popup.html",'
    \n
    \n
    \n
    \n')}]),angular.module("template/tooltip/tooltip-popup.html",[]).run(["$templateCache",function(a){a.put("template/tooltip/tooltip-popup.html",'
    \n
    \n
    \n
    \n')}]),angular.module("template/popover/popover.html",[]).run(["$templateCache",function(a){a.put("template/popover/popover.html",'
    \n
    \n\n
    \n

    \n
    \n
    \n
    \n')}]),angular.module("template/progressbar/bar.html",[]).run(["$templateCache",function(a){a.put("template/progressbar/bar.html",'
    ')}]),angular.module("template/progressbar/progress.html",[]).run(["$templateCache",function(a){a.put("template/progressbar/progress.html",'
    ')}]),angular.module("template/progressbar/progressbar.html",[]).run(["$templateCache",function(a){a.put("template/progressbar/progressbar.html",'
    \n
    \n
    ')}]),angular.module("template/rating/rating.html",[]).run(["$templateCache",function(a){a.put("template/rating/rating.html",'\n \n ({{ $index < value ? \'*\' : \' \' }})\n \n')}]),angular.module("template/tabs/tab.html",[]).run(["$templateCache",function(a){a.put("template/tabs/tab.html",'
  • \n {{heading}}\n
  • \n')}]),angular.module("template/tabs/tabset.html",[]).run(["$templateCache",function(a){a.put("template/tabs/tabset.html",'
    \n \n
    \n
    \n
    \n
    \n
    \n')}]),angular.module("template/timepicker/timepicker.html",[]).run(["$templateCache",function(a){a.put("template/timepicker/timepicker.html",'\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
     
    \n \n :\n \n
     
    \n')}]),angular.module("template/typeahead/typeahead-match.html",[]).run(["$templateCache",function(a){a.put("template/typeahead/typeahead-match.html",'') }]),angular.module("template/typeahead/typeahead-popup.html",[]).run(["$templateCache",function(a){a.put("template/typeahead/typeahead-popup.html",'\n')}]);nagios-4.3.4/html/angularjs/ui-utils-0.2.1.zip000066400000000000000000001032761314764422400207070ustar00rootroot00000000000000PK 8!F ui-utils-0.2.1/UTTPK 8!FXQ8;@ ui-utils-0.2.1/.travis.ymlUTTRVHIL,.Q(HUH/O-RH*JKPV\ y9 ZAAW!7$ PK 8!F+xQ ui-utils-0.2.1/CHANGELOG.mdUTTWێF}W42sj 6@6XdbCuwyVKb's*TթSouǿꊝ؍lry؏|qc1sFq߳ӧ2{VZњg[?7txk9ާ~nnali:7ӃOA$h*B 1QVo DNycz+V xxswGI 0ʨN}0=RJ%sY"<֛s Lv8oėC~;zefK0Ae})9.qÕEc}HeC?Ƨ#*dX g SIγ/I1 Nky +Fa!0߿NgqKzܼ 9F_r #bsBhdMqQ+4BC!@!z63}e}WUM maBaze 팛KӶYK,ǁ=E)gan ihL˅Mn6x,SS^#RpEͦT `W" y&YY% D'3)& ܗt<g+q+UJʊ^J76wI%SECT):̱mF1A0vG2]OT9MSmBǮs3Nt@0cV"HsY8JH\FGKDcJYQ _J4RKSNʭ%LcAkFJz#k@:]%R_ u]OܽJ`Q }K>)􁗜AF<xU滕LF[$5%YRB) qg)UE&%txjMRDio$Yp\ ?MUv yn"9MW"Eu{e6z^/R4ūvZ!&a0ݴ rfmfSb4W0X=i0ڣB .$L  f] ^FJ/~]!IPkp wZiVyNsgo~ʒQ *U3^jcV2DPAN\@/1Dv\fL{t~ m*%1"֖V豘ɭj.Lq ]q.ݣ_2k=9 r:S+yV^G\4(cEB *O No!@bnYGǵH- ^0S'xq i\٩k4dCkUD^6j/;uQE7j-%8zGxJ\"2)w.(?)(ttoD:z%,FMHrH%Qpۧ[}b0S Ȫ9_Jq ¦X I?c9"96(PK 8!Fb ui-utils-0.2.1/bower.jsonUTT=90 r (/X "wvvfj' jG^R0ΫYSIC'+7ix֎vA9<6M / iNsPK 8!FųȻ ! ui-utils-0.2.1/ui-utils-ieshiv.jsUTTUmO#7_1D'. U"=zz":8&z׻y6=3Lztԁ#`*$3q% i!RX_*AO:>5iEK PšQLB% hz/ 4Vh,9%g'?'Y}.z¹)<]ߞ66Vw`lmW"T7@sT-0`s3)WT(@(&CC\g!H}K2rXhpBF wbVC^|*B,󙴸W#)1 NUC *}*z]0)҅"Xjp+t[ :=ߎQ &% 2X=G8xh{dð,)Yl:ëP^&M D~/ Gb HW~>QV0CbػmpluG /Q2b` 6XI%dUqdfW;#zb:c-V{|}|@3E6}^]߇{ IV718WD$υ1 7E߁7:ҠA\/) fUy:3h7-Wp?d򑮋޹o]pɚteʰ|D7FK9/AsHMF(>z:6MZI՜cʸwlV}^HM~ŭ7GxER"/!6]>MRqR Tt:)v3c(d4]{irUFA4q+5,s,FAq=ĖRC&๻ ,(-=_A9B$L8-)`^^;l-9j,VQ(r6&ɸkRA%||NCUynv7 N35:%3-Tԍ亂8$-(AMh K~Tr~Jv:ǀ>&Zď ^;[lkM͔bIUӿPttYx1K_HH`خ5`y ;~a4[WI;pFEk{?.:PK 8!FwR% ui-utils-0.2.1/ui-utils-ieshiv.min.jsUTTeTn0+XX@/4p6M5|ɕĄ&>+q.I09??Cr""k(Bi]} 9e?VHT~LDl@  AOAkJ3)asOg,λG\8k*BZެ]ñXZZE HN'gr+qs8/u^(FB$x[ ^= sgpbHe [鉤gJIѯ@ Lnh=[ZtxLYbjd7rw-`oJZA_`))z +$9{pg:q9t-J*wY3 xfa5.tn!+Wo|~Ti.^o3xi#v * lO UCFkcҌĺ.,gYј(LntC{ .r+ͻҰp},%nCa>.Ifxtʻ>ncoviRL 0>6K'dY1 eNM](p޽i18оАJb`PK 8!Fv{N.H ui-utils-0.2.1/ui-utils.jsUTT}kw9W7$->$Ov,;ǓqbxmʊOlmݜz trsEvBP/ÇCgER`]gJ ĻˬGz<#.w. (ս ^i' 1MWi>MIV{iYeE.. {"żW1<XR4R{UaVźâ<C= y,E@ "KN_|u;;*[o"%GX9u>K]p_8E{7&ux % `,뷀"-_a0LK44qS";j[~Jzc_qo4\A 1O9IM"s=ORLd JU:} ~.`UANU%Py04Y5 ȏHKHu]Vf\$E %:Yޟ\o&kwo=k b{ۢnt}" =mp P8*z*' !D7)KjJ}rkU͠@kOn 6w rM1PİX־ujhagܕzjqujF:GJ"Y*Ƭ&ѐ B_(:62ǩP`Գ;$Hq̮)Ϣ8mu[֣ Lr_UT0v`ZC7*$8@T`C]G"'C]J@|_B}eVd.Ln 3s";]i@[b}6scA)E3m &ۚH{9sTm Ys:b-亃S8{#bWK/xߦ Fgg&zC[^@2MiZW9~ ӬB2FΓ_͑$ 4sб0Ĵ.>rkL:ϊNIr!lcg$'74.}5|jA5*rlp5?lYS3i$Ⱥio8Rv,hA`Ԑ/EZ¯z~]A #}B+cYY/#$ộxr(xLmSqvz2;Nv{#"ٞOt|`&xj`qGR"z*!?ɪ©dIe܂]r qrN:M\ (|+i ֓U`?:zΞ!>| ؛KaPuY:MRFC0ԑuR?: l`Auh7a"+}N)%πf#=B]@~x:iXCQU=T]kĻ"qG*r#N^lTIm#@Kwt xi땂钖eQvę"+b!˻ [*YdDF?*άFJ,6Թu ;(":MZ\&h P#WNSzTJ@8|j?SAV9E*S!9|NpsЄ}ۡ~ J8I`*.9X>܎"Ae?u^)?TT!܁h1Y3`w>wU 63,9]yb#|-c(˴F x-:tjVY:2QDJg`nyr7G( 냯>?T,KY>[ A?8 _zu)@ΌXWX^\͋[ M Sjs1>jqSY H(l=%ju({|4/_>|<81jL(vwG/gF}>Ts VN/xO.ǜLCɐ*VAr\pd!h!?VZ2U<=w{*R z +p|l *G|:N[.BN܆RBAT͡{MAM;^AK\u$QR7G4Ȑjf 4`^AVHWW;lrԌ%WC)Oƅ2AwkZɥj>rZCN _,=S0\lv Ҕ>h ZJ ZS:‹ā"} 5g [\Eʌ .<+; -?,!Bs5 rwE-ydk9Le@zj&Do vMӒ~V|ܙ/DPUGZQWJ1w 9O@r@pֵPՉ^V{Dl4פIk3A`dM2awߕz #aϬaBʜ2|`L޷*SiFC]TY" f6;7VYޓRgssKo?S.D`bĬWo Qz*kEvK0P]0t|jV8ZirK8.,\  C7&.fUC v)LhICǬ C)旃ZSʿsQ b+033iA^_,,]y%8=K~gHXVz֪*E$q#qr]Y;,9Ɓ*`7:" ՖKMPA }mlj4vonj^ւiJx;,hKuʉ,KEy :xUȥlRD0@!|@gqɉJ *E}ߧ}KIǣ΍p΢v%J .=mGirаg h^$T ϨސPR9nvb&S\hnZc/l5T8kI)t"l&rtehnYel5P[X@+",,AQϿM+ 5gf\U!u+Q`Bs`ph(ʅCNj:9)FGD& Zտ ,]ԓ'2WNb`#tV߈(L~,AY^. evA}T7h`Jk^r'@1jRZMY2ТNU1Vf(O3N,YYhtv]v{'* Me궂A HAPʾ8w3-}UsŲLuY%[<NxT&ղwl7:ˑ8k>Nq-p=P TT1.Q:='a5q ٽʨQD@`|E=3Dk9Y;Y+(ii!GdZ>y#q-?הeO&u'V4rAxbX5,'y6@^Q\F< 1 c#Xx/fF|:T;O~k?x|(=9ʠ @F`$ F?uxaEl.7֗I Y7Xb~rAXA|kxi7oӟY)GЇAui,jN{,֡mDE!X#mz=ƲgV/ [3)(W ®0|ν85"]97Yߝn7vN_M $4 Ps@.#L:µT Vv-XTx;M*0)c^B[W_G`VT5 v%EuXǢ/á89}0LGʉd\6Zq';}l.;>}%Ĝ!{-qJK]/ݭ*%[8cёÎyiM,1#ԆzBgS &InޔDYϓ;g:7mTNV}BbAhqˢk[S{]jg@?B8eG_aw 0U?"bJyh`3L ϼ0:=uQ 36!&uK,?rշ?<1|STm; ïWrϑN3EJsF=u0R2EtW̷oKP Da/д)''_Mu_*jLrnU RSz[յSܽ/B<.{`_^0?*+^PA;Lu(i•g30Dh8y"Nge$yO3&q T͚f'P\..,8_'CqU~GAu;,|U%Q<_m94njr:Zzk0Cn]6O*jplp5d)Sz2\[SB't>DFLG, ".˓ǚwjhxJQقwt(+ɏWpJr$=SJ!ǵNQXMzPu>N%v =TF5`NK>2d RVhe4m 6*AB;l[o6>͔ S*nnYMwGmI⣷.f DTR5.x^w.+)Nҹ-%4$SrNp,!{ujh4?DW$֨du-* Գcx7( ^jZ%>Fԣ8x"ԌVRN0qh۬8n61hڲo7:80\ӌN%"2F3PbE;}pq)CE|K&x[:V",yJ YO1cR UhdǕF݋5~@;H!6nٜ@VF#!`S-KVP_1MNXk+M=e# ~ a1ǶEYf*@qfpז! H]kC,d?aLߊ!!%$ yO *Sô7Y!i2¾rM[9? F{  :}[ @mq_ثR2m9|Ѱ2-tVpXOÃSgv=30lji4\=VtQ'(КjrOA4N餪Q/**k~ R4 M4}P2kSұEwĽėe,h:U"C =(JiCi ~91Ml e`1Y-=!0aO߽'()3K<9_FqC=:)(՛$K<%!(*\Зo_6w)Iy-;9wvL<_f!tgztjD}T6\ўt^Цd_+cY ۊnĨ^~fycҚs:/I ū,Lj] IZt-J?/r*QS}tAN*]Z0h(`7@H  &pABƢ) W3,9]\pXdaz1[N]T||a3׆1l\!;\&ǭxd^$К鉭~<FJr S)! %X"yR,.Es"v[Hh+\DSCTcYjy O5 +}0 Uٌ7_yY`.FπP>)A^' co\!歮^LDMJ׵TZz9lSm|yHrR@xP3-(A%ų},l҇+c-J@Bqbz #+Py2v _&׾qqbE9\뛾`(^tEA;*S7VEXyp )_XysADm^ ^|#rtkOiF-DM5Z^ۙfgiUwxDo> Օt~@%[)ăoS7Jϸ}A~--0t֝h ͜k-ŜKP-`V*XwA֐V1g*~mlˈ4V[Dۘ ͐})k@\*ˌO]xEjwFzak 5ph MwBk MH\$JbIBNʺjPчćU1mlgZLcS>ˊET9~ t1+667)xjXCߎBG۲x}F:OO:lCfͧan\{c".?D>uVbZ6^Mǖmn{x=a5/p, _2aQ|û T\$&գ l|@g䍷Ո`I-dC#h/th(0LJGGi h)(P1ٜ! >4= -בEM.uɓp՞ӱ\\$oU41g]k ȻucӔ厪j|<"-5%ؘ..";&7Bjח9e]'(dCQWiPa!8|8[059y/ &Bidvq0f-O:#aڏ H@yJ9_9ovwW3w'SnT{q`cO0`YM2:VI297~c/yno:({[Cg9e-iL^EG\t)Qi05BNe-u%~VH~Q~}u6!Jd<7u /+ )UmƇ6)nӡÖWق3tCO!Up(639~-PS$'!Ӈ }+(k\( n9C™b|R( N"ɤ^tvg4N߻n}s4W@P}hQ2IF:dUTPW-Y .a^m GEbNXf!z!;dqeMQƸ"T};uZq:^gD%1j`KT_Fao}98\EΉB_uu81p$RrBYzol$؋+P9$q&u|s<6D 7>uׁ1Z2ûnH@~h6v13577Ti/ <2CI&\bbb"fڳ#J3M=M29t-vrzj8DJp[Sp)){@H *~(^; .gA"w~ymR|d'hn6̖4hel0-6V>uo/bU\g~L[#bVfϯL*yG;l|%HO/'I&oҲ=;"ś+R*pUpGc|FLdxlO }_2ЕU@o"' k1?g(J1LW>߽O013MuWǔ&HՆ)X)S'Um=Kquh)Ei&'%<ب,`^Q1jm+!AϢu>bOvo_|aIqѷ.Vcu ?}Ok't|sY+yV/:>GXwDuC1:~ngSL5`L8ğXqbرM2u.c-;|}e-g8ڈ"vQGFlq[-RY`kҠA NI:*mHI`vyR4ZT fQ$u(35=b%nz_3D*_u @| "_n(`Yו0 i/]q8hXr.:D zݧWW=Nvw螝A5L6LAmLDtE/PV~@4h.AqP{e.p#&K]2.-d t]rfıj;\frHIExVd864N ԗgt9)IIyGVA9ѿ?Yi )9ߞvf/aN2qcj]2k>hdBdrw\Kxsl4LY8ܹń` Nd=< keR&["g)7ґ߳g)zՐi+ ĶҐa_rVS'*"9sܑeQ@#*']1ݡ=@3k`\TaZyV(:PBz?aԤUI67ңvE_c|=q jy6qn}4[{B*Ӿ!-l{[Zf6ΙEjuy!\'w JPA@dn  _Ҡ7a:ti;Ϲ ㇗&NXYU?׸( q4!-8o84V͂W5jA>+Nwqߎϸܮ9qܑ̋MgNwfpiqGyAݬ]慗q^f{[p8/[ρ<2[-*n:[-Xc6/P8ZFDLt2<-H| r9GBftl:X3)won5oͼr'.bF 5zi!|)q$ᾰ_V=Ї];wlvV &(ImDl5&ajywuj Da#Պ5uY0a2`+[ aXpKӉߋ)M}alKs6J<;UUo_VdTj<~Γ~Zg-+;Ru޽+3E&SEw)+\$قNGVk><Q c #}aaqɯRqRbޕU]0A3Nbl\[eesI)cşJm:5!B'e$ uf҉7{"rk%(~Dž">0[|յ໬so7̸,Sa*_:kAc N9K/"LGb+XspMUKɪƋד)کֳTb\12op,$R?eي'Y$ӤNX߿4iqDs'uNI~!}Ap!qE:]2hy}e{Fboū*-)Ck zU$JKFmy@ +T (qW7eTD- 'hlz/BB?%95(2'DLy){v[ x葜M~F_Q6?%8%7rzq+t3rxFk:ГxfwGP=~}v0<wFA>yxqsT{tn#>hi3b:pQFC?nBOrH;;3t!/b[;o*7Fv ?O4M jd؇ăZ{jY| F`i6CBv=d\Hn` cޒYdG lS8'}أy60p.M6,wiJgnKwl$2iН80 U Q-ie9ow7:fĪc-p_7WͣoMX8/cܔw2THCVŚR/KS;>luCI]&*fU<4U1|2R_p^TLQQ̔G)#1@`Y4fSȑky*e+Ӿ"8W܆1|ltI]dtFj.#}ؙf- a, AxΒĸ7Oߌ5m~:xlQ\;@d]A&RSs/ko P񻬁t&FOԦqJ0hzq]''G/ ôpF;֩2]nt +QȦUD$da:>m6Gc"u1Tǹ"Gw"|<$Vr-~ЂX;&q$!OƄ;a\!*Ts+DatUضC&&ӋTm&mw}GMDh+S-vYEZIp1rըlRtŞb'p셻C>Pm wJ͡@KM46~o5hB.g9Vo Z*2╕)Z ݄7Ea9ҚVEDNJPNh4Q|=iLØ1DkġYZRv_ X8>}dc\-sΨcV{`},-x=Hskz=|i釩3"0_0@誄Ҍ,-uT[ A+ՏG`5'4ZV(y2nyt)YDYNmPB6"P8}O18[bT}iK3q R.<ǫJ+O^+-L3,q&t!`\T`J&S7;gnE[7hɰjjݞF#+ӭԦ ^,y5dX?[::q >hGUf1YcE2ZjZͤW'hag3[m:{˗[&g ^;Åt.&"`W? o1#}NT\ҋx ڗB _Iy‰1ɉ{:|]UHelk (\&ʵ|lL<s00DDQD{:EPCSZ; 9ps`d+nmoCV#%b"7Jl܍,]l]Mް&eJc6?hSaRU8s>Wx *Ȩ>穛ʆ:h;&ۈS]K?iU5+91զrn/97߄b3Ʈ@X}i^ڟT/zb MF#qkdr0 %fdhD34ڮcAmTݮDuCpRd$tLU7_cz1J>l-) Qޖj2NI(b|鑝z!O(.<=;.pcl5WaEm B?liOM Eܯ [#oO95ܑ"k_& E Bw FlGlvDu65ǼPD׌.A Ed/ 2uԡLXl:[$bJH,%A]&7k!VLy_Jc>(m+>i'x|{=jS#V<~7ڡcsK^-M$rA E󶁜< *A&A}&58ݧ?EG3oCc%[xS&l%NG}NrAF&4mIWz ߐ⠭B}aA%! x6F9y{7M,8;2kwoRN5ԱVme~>0& b1veӶ+RgmVkWRAj [nBעcqmlӌvUt=?r 2)bjb7ibhMOڌù]+2Q#-Q)GS6[ݼT7qYB[ږf4e^jr&1iǰiHrIYgJ0cPN@ ҖAkfpgg5(7ZN3ǒ4Ϋ,u=#|e/ws;'a9s8˩T:UuN'sZA!hIg/-ѮնSh`,^.sH,u;=<5t;p*JYؔ ^*np:9 F/YP*vNrm t[Ώm1_:Z&Djm1•Uy;.peHhh:RQ<)kйlR=fI4˽UY8"F" ڂa"JFw^E(h C]m6{hf\ds}@&9e0FLq{,9Mfl6nǘCNؖ<"[s:?pE10velnH\k:{$u99O+LӪX9dK|wI @=DimLiz'#7}Eyp.Gq`wVR[îyTu5T!,lMkVi1czŔtܳdruziㅏbl^aS.ܾ,3ԽLH}htO1xOtC0wl>y':D>4dwj9&|F>.ΎhӮ&)R}g+%(,IńLNz)P`vЛ-0/#f] `uZFJwK;X&INS2%HmA9'6]^^'> Iy|J*ZԀ(ϰ)Ha|tE+AW Y~6 N8OM}6Aubb% t8-& /Mk|Mj۱x= + W ~0o$5KNsS/ըF}=T3:^6ZM[CjgKC[qBC8Uf6Yaro.nsklRIjwYT 0_A.4ɽwA;(vGKoihd866ɺ˙}l 7sNn™~%hEdB+QN5Od{8`~0J!`cQfiҼol[H6c;۷ectv-xCdK?ek}CGXk}jAEQ|f/~7v(XD%UUqI"o+2N*=Y:uU%ߩRseE8h ˅O90nUv&†hOvu_PD:byY 00 ~-`줕Pu#%(4v|}{obx_fgg)8eL\@jX5:Mm :=[ O00g1o@Jpb\Y^9g;|AGv֔VO*J h7yL|UV0\%8/ЛLF8ʆdem'5sF.Vq ܐÊ86<&z%ze (JшKZj,\Ai%rw-xq;nmZ|q9 B?%, 0!R 3MY^0 4j3^ ?_`0t-n7^zER:ƿBDݡ[+,Zx-pHs )K sO|XOSd#P?-@~g' `TIMs%Y'Oh wT'*_IԮ-PK 8!FG% g ui-utils-0.2.1/ui-utils.min.jsUTT}z۸y Qi*n8q)ʒ(S"{zNIBm(=|wmnĽMם^*^{OM2y' ;OE7g,I~g2댧Kw /c>0pwu,;}u #?w?y_y믝w彮]'VFGC7K?C06Oy<]V,Lm< TtӎךeMisVTw}}ݸMyI٬ p`ŷsÊr%+eo}B>T/ YshH̻^!nV B vt F>pıXnz u&Kj4xaobs4,qQV$@OP,zn}Zk}TͪDy8¸ws0u' Aƀ3QN'>]{ėG4[Bn4S E!3s\Ø`@6̺݃|#mx(YD .׶yDa+;.Qj˝ji^ӌB&קfov$2ђòv-n J*WnWϽZB+2эQ]ʸb|REy"uT2IVw"ʓ*}/6`2)%ԑ>~}bl 6$я)&J(&t)B7H5ԗN88|Ջ[Et-O3ƪq`` N([@/_CG;6@t'ҡwl s ?Md-m|anHpp6 pt@|yF@'c]7{m7ض4J&,n( PG:"^uc.\L #U)I/gvwhg> u;$x=r;`-&p*J"K>}vp,c gGńƚTDS8iqC%,kUN;3t58HZF`a$][s,^ *(jV12>"!cmy\]k.Ru߽B߬+2EAvky+>_C<!Fnmk럃Cm v?5P|8ԣǵǏlM6{ +7 j oxM6< Q&}[=r 68] s:9@0>mF _

    ~X+(GV#<#{?bmMU _BKiQ(8iQ-c άRǵ'¨tRRsQ0nn_&(J}wmyOVbx,@/?:D*7:>IH.A՛F QHPT֕)qgQu%\|URoTtBP= im VZ?w|C\W:iPU;t~W{>փKw^9vvY SDwIeJנЕT8N>%8v.r`/hh(Xz2x I.BmLu|̤Dg S-xn4I13['b(4ͽ;e:MN{-NQj/4LX.y5mW@w)!-y)vōiO$aOאMI -)m0S(Tw;BE@~4X~݌Y= MGjSר'$}<`,)THŊu&at%PǪE8pr bX k33tKRs]+t<]~g˄S^̱MDy"ag5KRvh}씽`/+ao;}`亠>WQwvy)>D3>stcΏkJBE5HfV0LIh`cBrx)،QM vdL 6oS56⊏2+q6S.j,"TఒeM <}|T_4.R'f:ǤX BgecLȋfK\)SS x +&uU|tL"d"Ad8 9RJ@j„CO͑E|M؍:ڸ/nH>`Mި mxXFt5ؤ? Uxr~GMa'~O ||139r?|q$r,Yt]x}}M9}S5 FȪȮL-xUrL:G(gRwe6X%Ynagu#F/35#CAUɨzmݖEkwT'[ 9.e^NCM\UCO|`M~ڙY QЊ;IД^6oG:mW"T^;[EyFY%gFtlEЕy5 Y5B&]T* ±kFPq a.1(ߴÜTx2$e W1iv'on9GSx6XyAy`[hI;<1_6v'؇fCҲN4Ld5Uugt$7^g Je.hEBѫf:K)#x rEڪDMYҠ. mȱ{͈9E.4XН}gpM+l0;ذd_qʨZ/mQ|E>s5ba\- I2TT رs%+{ }M07HlOpL4+ 8Q',?& qG|,É4E5 ;B 8ATt>2j}?;p"Ƙσ3"QJzbd*y1O\ v(& l/MFvN'E/&lIcCDyFű܌r.T .`N" GGbڋ,9~WzWs^w$¦(W PjI4kvy]}]YBe6oӤ)HUfpoN2Î oL Eݽ+A4[r*0]}7!lz-r&J|֬>6 ,͆K)Ӣ{?ЖOfaZ5؆]+vn؟){ƺ'}ag+~a}gQX7z xʋ fnL-nGmZܿpc6aSy Wj&_g)ZR_:1UZǀ3gfZc"<y6*w`X,)>jWX\̊~L %`u YR~ެpwhfu@Sv5Fu27;]i.8?RPjA|xU }1&j%X)wv ~ ^y4酈f =OOC nHVFڴN./3snaI֘+)ڰ G 0PHmԗS0WEzфÄ~!`d Vƶ[Xuv..1BL 1kJ@1A# iQP1̹-Xnʠ'!FUyW%֫^F{sf>]瀌#C//[|)?8e!(o8-yUm#_R6+#]~ Rc1mvLl6~vooP{=o`Lzi[@Ə[^WU&0L5/IF3sϵ˂=H83xCyl|5Td@)އ<:.'bF@J@8mHL) HzR `j9r_K 19}9Ze='.ayRx>'Ô3<&j뉷^V$`6U 6rFsLw+s"qd"\IM.{cgZGof)xCp# 3:x)ַmbͩ}@*oMЌ**3x.<%9 Ohvn]?۸sGnrSkKazt4Y@!JawWPze 7샯1`yS$Z}}y\ m楄 H;ؠ]E>Nڰ..( ~H2$T<^ר K]%c^Ʃl9b!8X g,| Yu1)eTLLE.?88H'yz`)ۀ۹YbluI$}2\bi/UNdB>M'a:ֆ,0_0!O icAZ4&`VYO<],R*Foc%N+bbhh+fbhBXq0i]}j1jy4^?P4Y7C"w/k!A_A^[02ԍX7A %RJimx ܌[n9Mt/Js8?5inׄ+Jq?qAM[*A/؝ŲEmjI 0Vx+|ZW1WPI2?=t/>K!}Ghn^zp:"CypUpN?ȀURj >Aš}f{%E8ڎF`vu^\ Rޒ8BO h %@<@I_F)z)kqm2颖H(eRJ)qank=s*C6}&2^ܔ2?F i՜u;8(O)̋v' m-eJ?Zw2 ~`/"h)3X, X5U`րrI--?UʝiOOv)C5iGU4˜xT,YTiqڷUU_dW98oj޸y6}0kI+ܑWccİ&SR +? .I\ I)dblP-ToHe|ˤ|o%=eQz{O%xiuPxGx#aᆋ_Kzik\HUV\jGٗA\P^lZ!&hA_F<?ҥNP$%a\&z\c峡<[2Ǒ?)Qfҟ{U2jryǸ UwT.o&*ɞm+N/7z.[C5ouIu]MAw_˹XLY垘N/ohw_ FkSheSHG*6cZzIΣUg!U9Ζ0ԦѦe' y $(_.ZBlڴB,DjP4+!BTH%f^7&L2B 6BԹD@!DU%ĦM+DѱBTڋHl,DeTBki#&0DX$b:gP9 5.Q!PM0Z9\Ւ oOKw>~GvmJsnDvi\'xvo7ep{1"!j\vIM"G{A .ZkAޱSƵ!HQlTH9F:\F+,08[f:RF:P(t(^uUShҪPtkxPFH> qt᭗MWqKrml{"\:o8<žAurV,&Q 'xLj׸f 툠`P#BN=Zŋ%N N#zŠe[U@u͌i9&sKrK R X0 n$t}s 46n%師q5"vXlF2pf Vn6@5Os4rڌKM @GZ dR(Qp5DWq !㘑G2#h{{uB]a]_2Ϟ7Z);̉7Ζe'   jX.we?];CCkOcUAQЖfģZhBnlq)S6uq- }XnlGH"KQ Xr%e7K,r4QUPf'|075FR܍dMEl$ (dh.Ȱ0 VPplq mdG2epC8X34.hpeDC5>E>.n1--0ʖ!8F Vtи@h. X%s2]6R"`Lq̨ 0AS,s jdhR+qtMm]X;f\"Ae3:._9쟺j/rQAw\rM0GsƳ$D8[ QBԮ-DhzH^,"l !;._9xqFrQAu\rGs1*+1 7$2Z^pް`7zeXa$({C9jb_B+U 3w?W8T>r`]4-WEe-,lq,"",ixw.K/ &%&zr㐇<5]~+vco> ~E7''<8Mޢ鍳 w-@\宻._7w-lx#QnHpsqu iS"WA;._9Wlx SnhpM ([.rYs͌Ox5KCe4([ih pָ& , R+7 2_77WeI~Q>y;vd!7PKXcG TPK^]E dist/css/bootstrap-theme.css.mapUX ɒ_˜XAId-z]p $F0Ikz ߌ\ Cן_;gg)LNt2]lowz8^|8=Osɸ7>3:)=1=1d|c\>xtɕwqct& =;gti%'~"%;?q;7V1ˮ=f$0% |\K?b_D_Z+$'=pcBҗpi ']T2_F QϤJ=IBҗ$Xd"iYIBHRsE\85я$!Wk*Ӊdqtq|\=Nj,Ŀ^N.9'#9~@tսl -mpuƃx4vVkl]Ҳ7rǤ{R OG`Ꮾ6);bTDL2I!]>13|]j3gW{@Dƶp&>10ܽ}ɯe!y7 O/Ĝ5q s~l }'Wp-c/nCAs8n0McH|d4oSNvǤ<ܜI;?0VS ͬmfbi=βbqXd<`4@:jb;?5n_FS$pzλpw_cmDk7}i w|xe=҂Hǿ~@4ʛ!ʌ98ǁ' LAo`I9!i|?ED i$';ex@"A<*>m+[K/10rfKU4ftL#'>&xn: V7|Dev mN1+NĆ QCkw{;:GC ֶGV.#g<!z wbډ{ MPD8^=, (ϴe:Fh ?!'}fJyAfЇF>|Dv x1h5/dоQڦ!1gWwxcFw!{Dj'vNqK^1`N`o&#`A\Pr6l}Cr2)oE0fr# "FU^rw2T'^ƀ+!WOԧ%0 |jHyUWPJ5PU8m@nfPn0B+$n@Z ~$6\"cs YgbKga=JH I@~X%,#fDzmCNN+IN˅囮w1kT L5ѓl"gQkum_ffTiя)w-[Kiឈ;nA4Ί ig\k1 onmBy\fCQ 7B{Kj+KgQH&yŴ"o*6dJ%a*gqˠ^]|"[8Xa՟`I%6+Q{XߒJNmI+5GwNPLҵI߹řQV9'2+@:CpFnbz~W3e4 +"CV$,e9 W5&ׁ)t-"Pd#hZ q:-#uU;-Cv`1@ݥ _, 3L>q@hW'DA)Nձ:*fҰPT} mF)YpV4h D/X U J"N>=gbI`a6*@}PC#N2pu!l?;R&얳7n1IF)`ZFi~#fcXaVJZntHq&Fs|<7w}nDA!Vu<5fn!N1gw{5H/(:l1B:R&yfAK*pez6 4)0H$I@}J}vyf݋UM7r^#k? #,||N Aih#wU<ґcӯd6عtw6͈ F#ԃ 9uYBD`K/"*Z ^kns\TAD&c,@ c2s4N6nZ&OL.Sfd3-_l[.Rp_,{п Oq[X,7=|&uxxm8sܷ:8Ϥ?gW8b$p61hċ,gOA">ŽYoEjOOlyx G#J2707Qvj]j$̹(OQI6mcm-#8#2{9hwGquϮ^Ks).J8ez2F IJ)*# E-~/yܶiI$@,~sfvNkLPi=N2/ȑPyi4g]^dCV&_%Md,CjE A&y@#Cw-\ 0ϮE5Y~ LEq9Nqˣv4~dV`/jsziHwМqrt<3ZZMOB0O0>98|i!]$V|<w{lW2*T]j QW"C $H2%WrgoK٭"*K rgcȧ8 Sf_IdX@`p%h5%*-A΅\4M2\>i8-Yl gQJ, Q#< )T2RiWcr5[|XbJ:y*)`(*ZuU+Wּ̰%wM/93GW D^@ˣTԙ󓥇-=T7? Ux-  U@9EѷJ*q;q_EUMSvu7س7P)[BeNZAY|bPa(gAéjBm)U+ >K0^]x0W]g=Se`P30ʁlj|L%]}MO&:S]8jT.r 1Ϫmk*ST{onXeMSe~͡lİFˉM} N Bjlo S6=2_rFЙ6Fh@憤8SzP[T@&ʎF=f)y[TfP[@  &Ӟ*,<£5URQP[T@>vy%>tZJS$])r &>;[VRa ufCWhφV@}PŽ:6'l0r ['j{jQ#e3]j;ڢNT(;z:n{t]sڢ&n -0=llGŨ魛QQFグٯ"Ё3CTQÐB3F* qөV>* j_W$ӝvU>?l FUV?[k5qP_cMKM)mQXdDtnu='b͑#EzYy G%Z!hNג!7]o/0 z=O)rp8_JBԬiܝ*-!~1ʛq D.#ǍP%{+}mq }V h;ݞJI HiԌ{y۠{o Q;Gw_~Y?8tQe)+}1L܂M5'~bƷ`fS_NE@"x5ҟ\^7MYXOyM8j;}Su;pv̄MoȺDv7TSXX߀->h<AHkjt>Ho 79[ -OMAvN720r [шYz#5^յ?  yk#%:Qs~{UܞU?ڶǽLr2/E2nd{ Z`K/zoLsi3Vt﫼\o0kCǚt`k{#*}u9ux${,~S>oˣ+EV:%Igේ >OnL/E7:YbT[faxBߞPKr&ͣPKta]E dist/css/bootstrap-theme.min.cssUX 4BȻ㟻p~v~ISVe \Ϲg,Ͷg.N׼4{|>-[8bh>q'>Ę&%!!4wx@ Cf!,fGp=*Jه~8˙dJh;6/YQ^ƴ(%Nz@y'[x!(+lZ#>zt=:oCtMo4i>]r,/;_^OS策oFCzj-,L ڪyH ,Im0Yrt<]OUtOyVM_{tlWrW_i7Dd+Ij$1I ՘6S$^&Tќz!ŸyZδfK{"UEoNh Et#ӄ]4p Ǜ罾V 6#)@Mv4b)c~^OXzU!_+PO!RE\Rn<׿s9J(1"{,ٻt'*~~84!㗌L;JFhWPi9(bkXz^S}EB1rq~.h)Jh[E cj E4fR+R+ !S;HU}c~!Fܮ|r*a\a:dgZ3E}on6H2M]#8!}Y7{ ,{H!r=4=ds+Z77 pMm h@6M]#8!S|?+!Uk~u{Eho C@WulVm n kghx:ָG )o.Ndm;CuCd!l`~}Jop D@Բr ЪK@5Q4]nr UB'Xvq"ɝBOzB6`!nxS:`z}hptpV8pzQ 7>M "t'Eֺ ۺ^8&nN3^O.ӬL49;TO5jے?b;[PzN@W[Բ hV'8)<|@mwYH\ѐhZsͣKgKn]dht 8iZH>Q=Z0~"fqtIсМP.G_;dS!ԩ_wnфh}}K0*b}Jop&ujF9 h&8i-P}vɳh[a9F2iZ ?)7A E6Lln"u-L%WҶ{&eõ[ϮGf @t6xEצb EN˒W*M)V.UOG9Q,SϺ))Q'E; 4Q<%u@H 󁤴$"L2GG]ůA-(G_ Nznي$DZ9,$Zat]/4$$ɡAT6NHC+T lTA8Va&GkUFX l(V@wX{U65V@+V%]mhUA )YDm7P.l\WjFQV]'Vhrr픆 !WMW(@W^ e=v6BZutY'DXnZ o5Go?eWx]6+8YϾm!E[?e7/skv27FVX eߓU >x}u]\pJATBgӘ;S(PFìy)Z|n~ovsds.9~]|uV- %Tm/pWuzD|(>}%e*`k_b0]: ilM'#}򀃥2&A}HLoHpD$EiHUr|N3)4nBkvdO@X9blΡ3nt__F܍٩:~yٹeSdEOתwn2qVvOt{Z]]|:?ktU~,^emUeUվzγKWga{& &W2+zyxu*u*ׇWë%f{=dE^kdZTë<;X~nʖRHX˱>8f|fem! ݧsݽ9gBmc[ܹ栣ѡƢ*ë<1Đ}yrq^i^ _Y*=kW]{Ns7/쯞~fR+)r^՗NyܱG[/ESjݱʤoϜTxYݗKkY?2C:U쫨H+3\ʌ՗3HZ-צ卹Lc99_bʞr]@OO:u~m̝ n0c 419$P2 Ĕ1 ڥbqmE.iW6aP9Ku;vJ"0"8}X!$CDAm*X͔_9GCS^[b]>?|.E;'UCh{$+C1%WM2׆K 5= +X6"pBζ߳=Dbx**]mD?<=JK{WpӥnI듑!+28P'sCc4W7&{ Ts4dE,<=P=fHXԺOꐈS?x ȊYׂnKQݯ H2 Oo/CzI;q:syYooLs4)ǬuoCU5% (}Hۇ!D?= 'D 7f@YmT9Ar}}51靘O4ku΄I9A +6dJ7DV&Ҳih~,U j_kr.Mmu;Ec>Su>|~.#f PH#}cRm(!Ok[4|f  MGï XpJ1qyt_htmH>:h@ga̼3r:(4p2NjiZSݎ kKou}bX`I%虹|:Pp[=30@yLCn

     fU1~rZ <. -G2Ύ恊5z#ZlbDJ8<&@Mt,)#λsT@<,m@|s9J?멌Etͅ 4'4|F8Qe#B^~<{Ż 4#n|h- %кX&٩l2!PX&-'}a"eY /CxaܭY];zi}.CbMI+?\t+?_M4y&6۱~:1k7 WxMYl°e+x:3!Ku:+\XQulD-)"- @Gdˆå:yD¯@E.ұ;>Kt>ckK8"tYG\[1fܡ%ם8,\" XUHp3㎶pMNb38: g c~}rzrM\[b+nch.fJDmmw,Bg-=W1E0̫ZT*Q-ΰ3moS{U!w ]vYi.{3}sZ/KZ3Z~TO YʃYrڰ ϏB$b!Hsm8zw܂,W\ KVϘnD+**.9lܮQ|p⫃k*|n[~Ibմl45J䖥AOUQ3 ]s+N9j%3XmyT>&UW9?$ܜԽՁ;GFk)fwR n'?eԩ6JL籗:(/O:,:UB WWƲ+ o,Nϧ꛾R? h#6|n̞v M|9:I(\cJˬu;id?8u:{|s#7|5ϺfÂb_3xLxфMxwJ^z x~x 淥me~[&yb'}b'R`&bX& a.& cxW/]afhmNJ'Zu+]"Y(XDC@ڎ$PNp![Yz%REc렅.ӀZzZ e%A~Ct+٠X7 &XVK~QKG {rԷ" /'#Yr#f#Lؚ]y(i6R\^F|X.DEǷKEWu|SlyN}O>X%.e;`;/R}Kd0zDL)hYv'qcbr;˞+ŗ2IrH$c%,Zr5֍f(9VynR.f8Fh_$󘭋R@z5|ɶrIrZ9= !nej,2:b(PCpOGSA*'BW`tQߖ~c{C=C)5iŨ?tw+]+;gӤv'e/nEY!I$)(Wc0ȃH=Ǒa/ƒNs=[N: ?RP .ĔE O(WzvCIuU ٌn%eRpDXt )rˡ $r}#a8>B_gӣJ` &tkeH[͖ڪUaã1cǩ ;@Gu٘`q 2Ex!z\%_uĭG4[j&]˛:@6ӹ!z]Tvy:c:zJjXBvl3O*_@0<ؒV8bFV0O~/~/7%֡5\GpzNdz%{60%E0:!2I!S &LC2J1JFm$LO4YKïTO3^<џs>3ڇ?צbs鵓}Ov=%gp3_-KjڷK'JWސcfuVpaSM&4.(4σΑqE&1t؆E НOL2QWK:Mw2t9mT1bdFoÛdKһs mY:;\,g.[ .+PL`saBbn$f鴏lXxTn}{Lg&s;=įz*̯g+[ع[ع]X؅]X؅]Zإ]Zإ]Yؕ]Yؕ][ص][صX؍X؍}>ZحZحZ(cj\S7  ΀ gso fߧKM  e $d 8wRgS`v6Y6.B=.& @jx5zkY;@nkVlI4f D[h(GDSD ӏAJIt A)M -%!3ځDں BRz 9GZ RG:z0㚁hZʝz3ACN$uY#(u7V9\C@+PN+. oY#XcMu-Gimu5,Q! e ebxC@0&Ġ,Da T6 1(QcJSi\2fA텿 +MA "K8}0%= xs`fѶ;uan9WB6n\P]еxB,# ^H{.f r!lLDDP/\x(@xDHVihN'Fs<ihN'Fs<ih(#)=a@YĤh΂,ްh%Es|X4gEs/)â9!ќEGsE1կb^Yg G>>~yW5 zIh|P˲6P"%^P+HjI;{h-?i=Dr jIՆsu*U$T e̒5G;_$ku'm^|ڲ߅{ H]EB]LǬ`oZABr X !"K7et ]S]f<oxKZZC)~U[]csΟd|D|-b9sĝ nOÕ7wcT tS7襆9ȱ|.ϲ0 7rb4cub- $q>_sٮ IެsA7<~\ʟ^emK\E5_;w XqeRlWPIf/@!:[߾:o>c,$ $!OcW]DI?2%xăY!}KwV?!g'fJf+<&뚚IXzIYev>bKS\\irsq^η?[\*pO32Vhd9顜Bq>rE@TEl_n52# =t0mVn^U~Sg+/EqxV6M>x';ʼn* ysۺ S.@x\SC<>PPu |>:f s"YWeWo3?cQxE2H'3gSR)s[s=>.( --z}ESh R`uu&&7yO j! DrF$mG2dv`&: :w:;V8yL&a@y{."YHL`uvW͇Hl ppf0lUJA(]L$Bͱ374^$ #ʓ1A Q C?0Fs9 ~C ."j`RNÎ)#.8:^L$2Q_%yOPΐxL+,ywW,FTNCN%.i\򺏗8Pz1*@oHh4W@jk ʩ!cVY|zJ9>\HpDN_%j`E xԥ.`)7҃>Գ/ߍ"W.#Q˰+I^Md  P l-aXH,S,S{p{ v-Fz.A{,YJ߾= 6/|Oz2=K[YVCb{Y6M J}z*}JC= ƃG $= `Ť{}rׇ4ߵ!=H1"=|\>.^)ZnJ?r-=xxFwzW ^t'm3_ TYb6U=6'!`P#7h/Os^\vK CXùN{!FIpFaarSWP\Na;~1E%-JEoJ" _į^p\j7& @#Xޡ+}?A<[QQwR\ 1P}Wk8O ozr7Z_m ^%d9i=+G爍ȱ:|)@{?0w͹/9er>X2l`ڲHO.:ORT`,CTOr냣wu| BI1VGNR wZXWQuI5a*=e/OX '|u;ؾ 9ym_ףx9doa1a3sJ7h]A[w/z`7`8X4Ky cyCk5f 2|Q6Vٙ`oiRХ=1"DUWf,KgVFĶ5h.kj2J&tpeDt:O[a|IdA.ϰ-զ>U7;m|s6-YE 2|Ms%s+Q8=L3$^ܕ5t$ϕDLp%a#zydpW#W2brz1*G8[Y}oPz*B&amZ.rI{\l6 _=>E|Sl'tQ/Szz|XPS"G}=j2O ۑXIOs1H}ZPvmZwEtM|&W$hb+,$Yo]^vz -_\@nU <=}W>\}N5"x,uSBNt4[x*z~K拵Oձ& KA׀IoX|ab̓6 _=A l4tOQ//zzvXP;"Gx}=j2+ ۑXIzǰzXqrubZ,\G]b+i~֜$X*tmY>W~k^SI_8_Mu:B%S|z&izGw24jgwboAZ =~cXw,ۦz_:쯮I%/{u7vZhr{ᦏy^n%kxG\T1-/Pv,br"rjmOh/vCPTu-ۿ/Se0 yO/uw׿X,pl.]>rxk  s)GL- b#7 Tg7cvi3}jW 4PuQ~ω44W<_TȔOa 茲0lqW Lz`uѰUɂUE@HuaкP(QyJ^70L(}N&x|jO/AץUlRPA:r]{,gt6&[&NJ5fp<%%'y(=IԜ] HE.a61 ӅGH]mז؄cS|m1/^eٿ2b$1O' m龃A:SOqNSH?P%&TSJI^!LȰcC:=,wоI$(>Fx/ʛ{FMy<4gǶ.!X52Å,p;V1E6`4%:pE?v_}ƓK8ѱwU%-1[>gwY3UX>3~ qae>m +ztA J}:Bšq`Ȏe9Eq&:LTȀaaejڎ hNԇuaP!. U8j :7Q%~d S`HlD--wtg ) /LQ` kp BL3$ X%!$ヘ8ut7𹊷/?Ӯp4\Ov{ ÿ؃sCgJYva %w$f ,r 8{)MP8tIVݧ=!^GU#?oy$_PٶXҥ;#Ê`ݳAJKHYV=rћjA:6ǂ61WNS׭(1fP/ VSBdR\gI /*0^ qVz|g0x`/:o0UDo$ 5;FpT?]J!*s]rأbiԖ:AOqG%ˤ}1.-K3?Y)һ_tw@Sqad[Mʰ.7\2l2MONTecqTYwk`-cŽgIr=+آigiAL@2&@qm3%#F&45%2m7rLfr_d2!S/I7<a g!7ʶN7K MINsL=E/0ԂeZ0f2hXN#y)5p%H ~OnE7>to*&[E<3۰f/Q:.%E]=s<gXCV #(m;H_i9qr?7D%ܴ݂Rp߼07LU3heЯOdwI4rVc䉙q.$S#{iw ^6QbzWe=hI~@K}tvOI,7cxS&̒RhIpp }zv XJ: G{؃æ JB]#=XԇQuzVo6ldNypZIzEQ3n_ jq{|t1.{f\_hT4" 4wkVY;YB$ww)[,dCM$9 ޳ ]ъ~*F0@/`rߛ)~#A_ =؉NhI l? ?|y;bD)PK*ʊ-T#C-wjxc)-sL GN+vڎ'o|D-7 zbV/,e[9$8)Cdd=7=`|ƄH'ĎsRB.+en}O'O;fsf?=!BOHz5 g6oXb>.Ap=5$k2Kz, ܱm2bFr Ďn7]L<8]uMIɻaA,bǕ9H`P֕]H~c@@zN*$ăFְb\W- S+,ʏU^j\>NYfbnB`td<ͦ2EFt cEVKqq]p?^"  (i _͡X`1&#vAM78 &{:G`& 5ܱۜY /VtlRąJ8_l} ZOVf=4|@Tzwgڮ݆iQjpG^C]4o!>:ͳ[_rOߞt4:&G Wrc*FKLxÍ* 93x080--;;%kkҗ6B b\^Q1B-`4~G_0 E@BAz@z)6`=a5 ,YҊ/+cc`ǥV؏!=OIbr)f:zrLuۿLV5fKLƎ&>Ib$/bCվV_l/6㼥،^l+yn}9-f"Etv`/oV ~kAJXŻ}hu3.O>Q3pIvA~*qc)ByfS)7sʀJufB 3#Cۂ%F|nfKFPZlH Ǜ,l&'l.+7lzGkDJTQ #ȄA)I00L4Hbi&V79[vCj&-"hNa4)(op( 2n}荛800nYh)oΑZX5 cy8G sys=S!AkJh` h~iWt[0՛\t>J/i6}E)%cgcFHF-:(p2^ɐ}gD[aӽ<#pڴC mdoa힔)H7Hqf']1*vuD.%"X9Y8=NK!>\u#<*h7ܛ҅Dr$q]GĦd2Ii7rD]Ӭ{}њf(p~򃀸 l lAh2:~\8PX 4k ;)H$x"L}=ޞr_9r ILWha#ż4Ǫ.6S0 $h^یS{/`yyM_乂NE"c2n)CwY[G]+Wѯ2D-h'2lUs+t龸2t_SBgZ&wGϏM73b,b ""-/+O7l HXLbxYxYy# 0OV%FG.^t/s2t뉅z!{::ʦ:faj98NO6%өGd +{"W=٨A-]٪.MYe[5PQGbOkw?B]Og`2M֧\\ U^19vmK2y̯֗ĶAkd~ K{h~#S9Bk}:#LfIX?h?h|Zkg/IogG6x) [z˚KN$QB^aij@߯ǴM]ѻQB PY+4\ (?0(>/oD[o5#WZc:mt.O0x=/;;h&3N(ARƬs9}l-_.w 1'nX2F5&8}˩ǒ Bn7a=wSh?)m,Is Ng?h_Gj?ə&@\wumaQs&#O L>`3^X~QN\6j1a%}qAo;䑭gn=qGs8REdӇnbwN Iw{ LN c`#s).P0]dQ/p] ME):{sy6 ? HKPʼnCn BM^؊FAfaԞX~3ÏaNe@/@j_ZDtx+H} KX ~# @rD;g(HƕA2:~w҅vFI[Ӝ -IQ8|Y.x$E <ݤZ˴Z#䠮`߭cEol9$Ɉ]^nQ9U{Pݭ0!DhEַCKT6f-)Fqv뮪rM] cl^{o=iΘX>H8}g|f)}&fC_XI}#&,q35CUIcdG<&B^l_ם{i2u:}71н=~ρ2#D\ ~<4g/ȗe2Aoհ'Ƞq#ˌ L#j9ZgxZ= ]B3b1|ø)K}nu(ITNݨHGnj0H"I/B]gABF7([r ߿-5ߠQW|[U8\/܂+A$ox7e[02=&}A&w~[@2y0IdI!-SB-ߎh`@}Bza|Ql ҇zO`1P/ʐ>toF͜ I<? o'q*pIn謄wBS fא8JtyƁ \NMQUbb8U\%@Ur hPd^!  /ZÌi򻓇!HM AszPgIsw= 1{8@*b/8a9ŴP}\8#=IxB+0f]$oEKĒsϻ4K 9@*K*8 I%!~?KkP> &!d qc@Dpwضr86IэHS| 1U Cy8ٰ& L΍cCk-:0L?H%Dpd6nTt+50Ane;Yr|.l[ݛ{[;Wr ]gf!`ͷFe%R4e/HdVSFuwўnWze٦/8ДZ/2ksv]R5Qi˟";SJyCy}YѰ.>rG&%l:Z7 K%EmްDHA ^;n3N&`[6cf$v놿}ޑMb{7x`Ʋ>C3_W?¦AxD`v,AFCߠDrNJF;RوQ8dDnx7RÇ/m8ƮoFPtyǗ]&)R:JGIT|Q$x4Glm񣨾߉g:hs b|JDC6&$!ǃV+}w?8'":N>bP!?th\r -Ol6*YYWqrg+Zk d%VVGM%ɣ-F}W'\Vpܻ%XhO.y v;dpڿ&]]aPW ڸA=Uj]uNE~,8uc۸kv+}S2zтdJAAvx>g yn>|{Ȑt|j:CljF?EL{UT:Ln@X@\pgs+Px)Ny:# J(7ÜFs!S|P҆l8-3Pd|R'i//[m&`|oŗ""5=fǼ{Kd1̦1<]'s"ѝH5 cydñfabIC80;9}83{6Ʋ˱3U$Q^oEazc;(ܑӷUh"C)w~F/ a)mfD{JOׯCX?B [XAAYY%~wX ˨p aмPe2zM02";#00q;+07^pEE&FN)˭+/Bqh`#+G$,^a1glliKƮ0%gct#ƚ8ڰHzXvLۄafb}ixh&٧/7 ."rMZS/oh]-ᘇ?{!Დ}q(x)RʌT.+-YئerO~:s.آx;o84M;P}>O1Ms2}!: Cy ,6& :R=`P@X@JM% :b\Wte|nj̽fzЋ0A~[_Gz VF,pj:fK֡aڸJdH'o *f|WEo_ղZ߸?kvn?UyS .k?pk{LmSr)-lK)?e\]EoitR8V/gt7qInrFԺ0)et/jt$_@&q'774Q&m,;M @Cc$UzDSso0r&xŸ&yxP/"BScDfO=oFUNՑ -jӮdOWKe>]l}QEg2Sd@|z]Q0#rqעATjl6uf o{glBOB.O xC7v5vl|D>ZQ0ٴeϮNc.7 ',]ڇg0YsP74@15 !@0>K۷ӷ^\P {\8(o_}V|Cqk`v J4 FcȚOxV 4_C7@fA.K'| Ā4!~zesg||uc9hF#>x)RB}Bo \W1+/k}VHc$$=ʤ**y(>H !]j8r7FNsgAM RG-#=@>XuV[,ODTG%6ֿ2&x' $=MŘYo>(ߺX8c2dƟG{ :Ւ%)M$j[ݞO->ا@O c̱q{mޘJF sApxA> ԈK5( 2P*i1D 0]g&$iZ2^h%~4s>FOWJCĿ}Fs1ȿ'u~4ywr];RZeegrN-@8R>Lw\tuQ4=I Fo%A0>ոƂ+'&[NJ`BON=+EnZdX.$?"{V(z&ZztK}N<`ŇGGZ}u;xdO;Dq?Wg3u/řx%GV{2h{fdZ>{'}lȚ#JDr-wԗ̢ʣgQ<3\NJ7/՟f< Mq&N͸8VU $lg| q«26޻Շ"48vT߳:7z>c^fAF~~Ҝ$$|?NEL)M~nY׼yM&ާ1r>>)'SIgŎ(.+>J).7X^+Z58牑dB )w<B۔⫬2@ >2;E͔|0O"gA|h1(N9uC)`R->lsgߍOz|?ly"L!ݢ1ZO>fDO# X@@x} ,HH,- c}z Xg-  { hp6Y akV_,;-  { hp6YG~ -8g XɲR 8g hX@,~;,` gB HH,- c}zakV -8g_ XŲR 8g hX@,vX-;-  { hp6Y+akV_-;-  { hp6Y`XòR 8g hX@,\\B HH,- c}zx;,` ղR 8g hX@,f`X,;-  { hp6YbvXܲR 8g hX@,<<B HH,- c}zx;,` ͲR 8g hX@,C0BY-) m(PbCm 9PC=Z,Y6jišІR%6tކ:PC 9Գ5VmBJ9ЁC{jplCm96Pφ+n 9Zvq(C 86cC}lhvКCmBJ9ЁC{jplCm96PφˆZ] m(PbCm 9PC=Zl]6jcšІR%6tކ:PC 9ԳE5VmBJ9ЁC{jplCm96hk&܏*Il?/Nß}!@yC"kFiGtQ\y~lm}l*ҜL"j|AҌ`%h2IƲ !fB덡x97n9y(_~ر'ӞcMŀ-'1>ܿkd_osXW5@DWΟ8硽Ur EtT`-wcrs7*[g3Z}h(=e=}ݚCׄ#_N5V]fy*mLز^%l[ga50~DV>ldQdFmHF#O4h >^5Ɓݳ_N=}0PK̫~MΆn(& ;@\0#Kʡ$y2hoC jنrrw K `s8ߣƯƒ0Yz]'=9 䟦.QNN5H r#O8<~@ΉS9ONs_?ry25}I^S̐f4܎|+3@(a66|٩'(b1z6i1*;҆鯩=WR&Eo\Rlr98 >.wpa*VQSHM_(S&hɘItOI!!}l:-`@J~^ AsD>W١?qV_`JjhU(*OJ7liIV6槦t+a JR(M-򀢫PĠ~xSp #Q+'7L9QgM1CwR PÛbAdH,`eHj@c1tXa1$mEZoMhZ,ˁ3=`2ԐQ  oid9O%-@Gpu_s^@ҀD\ʏC LI%+_-M x.kUׂz{ 84%g1X&-goS oӉ3Z+VY-_۬ (O&4pLI](X .0 q`HJ|o1hJPY }P.h'H$ e-8xtXhɱ uiqI!e(_y8M#=1M zr9:[ P`FF֐b8pSR%GQ{mZPV:ĐԀrb0E 1dHاf;HRv!3j8e5) @j,wFYkv&MI-(X }fdo28J@h7w&CtI@˽ AT(yf݂W~KTV 9v-D<0cYE$?4azf~2?gktXrb0EFgP7LhP޳j,FU kA[dMCC xAN;–N[5. سh״M ۆ7-6= 11d@1)cdh@Վd j%gc-s7pijг8j,VBSuMQ[2Y"H@~W0?{aD4?ZaG@J~ߪ`9\p,?hUS`*pn~b"?aab |$ߋ%؉;%ǖ\ˡf0σ? u$O=3:}&v(B m9!=N{\C vH?Tc5',R 78 ʄDZp 9@LH?c 9q l1*O6(J=Fx14ϻl qh1)Fcؙ-jW g=G:[; q-t\(7(.#7pX>l;Beqa*O98SyDX*&c@ H:}(aNY>oM̽3òJj=EPIe{9v۴iCu#DL8imJU1hD*ɉp*N*~T*CuTYnEkGJ7v zGh=؉˳hş|¿|0`1+.8R~B==@e2Z"e^= ss{3Ns8c>E}~S_aGM R T) TLZuhrQ\mUV *hV[uJA6Uv*XV@jfUЪ.c cUJRp~#OzIM>gc9ar<M䂧NV*|m%7:䕬AX˓ $e G`X ,eXo "ZNeOzg ۉX/ /I;%c+&M =69HyYaU8Ӌr\"d~ '"uqb/%0i91гvXw=:Fkego0U)=TbV6] N$+shOԣʀ`?Ƚm͒;"Uy9lRr\(^p>cdPhE$>a7&" ;}5m~k PN~y?d@-w{eCf,dBm.4c=:JrńdgjnzA/8TAbhs}e@G[l{6_ٱ L<1pp&21:#=+0q}9YCL̚טH~Pt L WĠtoXkl94q5&.D2LDtn,6qkL$\?(\d&WꁉqpO=0M   n"U&j`bcĴ&{vz%F掣Dv/zt2agb[-!śЂ׾5MLBa]<;;+h2Ʉ;2@8s&f {c\nމwF"|aCrm/#C^d.2pA&<NSqNGF׷,h!w( 7#MO<hK)k)w Zqf"F˗ ZS%)%4qMЄ2B~7 $8N8%2&MRvsww`' aJ Cd.U;@4I6 {ndp>MGAnvGt db(owad]im}Pg)U':NN<_"Ճ"B롧rZK[[XYeD^' R2Q9CևVh EN.8@W/ ,Z>}9|QG*'~gq7q9Mk>Ѱ A89۳X.EF[嘔fXdwq2 ,SZ3Hd 'J//+RHKJv^==j}0s.2T.oZ{Kp0Ly%trvK6Ecq;Nqhǩ;_xB-oK| )uFYQ^xb}.h|c,dU#>#;E=ֳOP7l|k0lsYڣ||&)) J9!ҿE8eB30[v)p+lR2vap oiW8xO/;U)>LEXĀkpZڄ`X@>.YG3 =/GPd:U&9Xi_5:E<%hSJ[.H2AOSWRu(e+o9_>UJ,lW,EY;%X)]S\=Oڰ2&Q|>!>ouN#r9FIvB j;DymWXdNP;2=/=Q溝Xo٭LV_|bC*w:8G_DńRV@[-wOsUz'FOc=k̞臍L_+P'kjoOUBv?SdwBnAgS[LqS?|;۸oȏT5͉g  E ȅ g\!HeP}p~tP"]Mr Ggl0^`{F#]jma=#2A%nRQNCshȔ*LD[})}_i$[mDT3H j8/b>[ 6&D= cyB ۼ_8)H*y)Z0SŀgY[}c&a$/5 N'x@J/8d=Lꏗ\p&0h3YFE`E3lxgBf'xf*:yZ0WrxdLjG"z'x'+ j||WfP_,/7+*,N6G50Pޘ䬶* O'hT[,G?0Ju`j%dmN٨7응h2TYyϩ?&/VTN_dEɡ)}r?ZypQSjX( Ahoxt9JH&3EšKX%m`)5'e D2'@餼6!'秠x#/K,t5  qRALbJG |؟lcԲ}OcH Es FBג8ft"?@=nn5̈kla#c>i]L$Ǭl9v7)wl96X՝Ա1hZxƠ9vR&d̊,.wq:)/t+5ձ\Ul;VulPD>DݍܱıwN8vsYg9RQhDYT> .餼4R: oHsed5؀X^~F]8vX̱Xv,ر3kQH6)HJCbVro_d ^L Δoxwh7Ds٨͉F􀽜+~*91;GT{ʷ_з>97Pڜ8'm|ڝLkp=w|15U>|oQ|QP+C͕@= ? u"a.rmjE\iFN\Q-ub5gYZNc醕-/G5_L02-:G.c:"ΨȉbHBaeb3*^?s&7P˱o1iz;vBM!kQD0{-X`NuMQmL`wŢTT5GgRuG,y8퍢#YfvG!P 69?*oKI -v9ґ҄S9 _JnWNzPqNП Ю9Dxs?%(XMF>iC meջ:W$PL&2T\mIIwKj1Ϊ]Ri-HֹXZKTv\ź%Tb\}ԏr,Nj=|`cd.ǚ `^+ ڜ^~PCGjp(ue9>p@ٙr1*|(;ō9bL 4{R@Lv*.QZp4eJ۠42&S׶&}n*.QZp,eJ42&S:ZJɮwJ5K2΅w5!^DFj3vz e0jI'.-܊47،=]pAeю0.> qÒѣ'=A=ɺi TSn Nм(E%.T% "FnA9OCe-4 iW^N5^sB#.%G? j{+?Rv\'5wݷ^Ϫr$ ,95|txA֟oчm'ŎϹ,'ؓǩ}0h͛f0C{gMLϨ~| sϸ/^d'` K 'e$cg vllC Sxm?JSᜥ2!͝AQи ЏSDVN*,}DWv1TE % Lsb)J B')STPhuP4S=h^(a`:( LQAi *@cv),E TXTRS*ށ݅h}g)J B/STPw(ک3E몢=(_(a`b*ć2Em3h;>.qwl( <z|75P&>7[6; D -#)OBL5niїDZߤ^nX< .JIʻ]`a|nPH܂4w'rf="F|KQ;N f[-W<!/G?v6,nnQ僐_x3p *+O[C^؝PnZCJQnCd&%tiٵ [7/8ԑPnIs߳?8QJ 5!j? 5` .igq!u~~`4B̮z\BܣgeSOewpMĎ41>O?P#r?PDY4$͉҅=ol!I$P?< 'Dh0mN XE Yt>tI9I%ѵ#6]M+2Z zʞ.7<@z aŅpї2Cƀzk9^ɉqY. !b!/nuBDlWgہi~<)E?"̇U+IGv쌾ʛcHLz΍Rh  P,!qe!kB/h )W>7 Q>|#xgC]c9QZ3+J]{\^6wJnψSeW˕062|!:|\3P T\| J5VQ<7>n s ZD !'N䪈l/O>!QpuhmC)dVӶ=ko)ùYhcb+LJm^ʏ.Jy[Ҩ8ےFQ9s1gx69ö^Q9~\9s)UZO⌷2ht\":2 [v vr/Gvm7:Ԙ _8M2< v}xGyLjэ1׀W(jg?I/.r%`0y&=]դf = eO-Pgc9h'VqƵ8qp8ZPsn#T( #1a+ Rnmv"B0`M<&xoVP/p-JF|ƑS-J{8'?Juƛmxձ$Lߥtܥն_tEj 5V1PwxbcoV>:}z)іW6*k`Pm$neG}=FGs)~9Yq4>{:\t9i8XL{@3'u5e `k¬{~!xv|K7ڗ UN4ʏfyb^0[ I3Q0s|t rNeDL|P<`޷l`ٷlsm3bfsnn(ǽIW5S>%rٴ.-ayEX]j3DKh5[,vn)^c5 a[nZb@RVʅݥlF$+` [tmTCXwW^_azM)Exfe,e:姥:T2 ͉!+R6v J0`|d\ʈJy0HE N†,Zޑii?0XFҦoaA:2a5%0aA0 nP-=s)# ?$R.Ahp;YEG`x6y Y%^90R04*e-pK9 ]K)]QxUR+żRNs 5/eÜ, SmtqƼ5*zژP&( Uʅ9x[ʆ9 {PƄy+eœS⋉ 6NX1?anﭼV[uч̘sRi.8Kzofsze;㭶MrݙGg[L]l.Q7g[y26!`̗;/ܘG[T͉,0]F}9oNs*Pp9oxs'7ICЬVzo`4j)2MIU Ld9IN*eFqaDA~i6]sMt/ 48yK)##qDZ@%D臋̿ayl^8/mΣ&:64k[wzlc>&*X+sWMU苧QS77\oeU.n@"N]i%K`eU݁}%1TYj. & ;F'+t36[6i;ʉ%shݐe3wݔeb.Dd!;0eh۳*}ZMB薭_ -3ѭCⅥO%m&a[MMt5񽷙[ [UA]Ɗt/mL [ l lwR.g]K:6-]ZޘX/^˛4*{-Xtz"9|t_˧~t#Ph[B*FUTu0"u> j۳JMPg نW2vw\Rʆ?nrݧݫ E3f}?nMt{7?{XdzQ|-zmU/Kk*}NN*aBܳ MrFt9KO^Q8oe۠;TKͫ.E{^)-|E*~. tGzwK1}KSM^T& /㪚 ,:T؈bN\n:|FDwu0qg3(}eюRCts,#٭ē"٫DWUQ|b+ۊMtW7>}VJ@;cj{^y9|$#_A:p{xka̯3i=ڗjTwE7u;"F/sWV|kެ6zP>ڽ|ȡ qF- GNlXC y{p/Ix$GT FD{.o<ЮZ&ǭ6Xӆ%&kSoL‚;DE%%îbs[s %.θc,}h ?yHKU*XJgmB(W)!n*mwaIHv{U9t߇>S+HXq5Cݘ?0ʵɫ+( DqYkUhͼX8^יkB9&ifPzѐ5oDJkwZ]MG~ J'ݹItnu¤rv2Ldt>^xȥ=u!lZ.[cWAza5֫Ww)V:̾Ex7h\DHocl=oɫQ#oEb?_O"(207znC7;:Dw&!i.oې&xbr ms4vF̂renXY^+N>s+BXmkWWtύ?i[itjΛxۀQ"ٹr3-tA:1Ss7sy] Y鹙}8lGhDجnV<Ǽ&S?5s\&EZ+4 -/R.az5w3"Lnpޛ)n[zA\4`/Θgu+I]td&HRwÄf,H(lrPBeA*e"{UDlY5K|T EJnlkq_$mA]){fLRCLao%["YjI#T6UDSqKĝk bk4%Qlx&~|}kqT:]~Gѻ(tgQuw7~7vO w+dyF$KzO`ZWw ZommLi[1fuIݕcz͎~HlgspÚ9=s1lyO0eU9%![,βP~ MW& 4h_CS_p) [Zmp#wkiy+K-DnNwѧ6ҋA#~yHG|ecvAk"s^G9AZΠW)j45-ƼK^mR0*nm n\ 'm崭ӶrZ'urZ'urvNi9m;䴝vrnNi9m7崽r~Ni9m?䴃vrfCFN-h(j穽vMJ6.ļtOJvZRG ە^U:MU[OW'}M`мŸIΝN>jp[T_Ot} nBeZg4wuzfч>FUܑ@Ш{Q4bKM_)WFӈ;wubFS͌5#v4bATnK9I.𸅸%jDeA*qsJ!$eAh{*mgڮFQIжU2 Jx!ѻjwʍv 8F'By|CP7b'\ [8a܆bL=ؑ8Sc*hB[Z0gr&8-Um{USa.ZzUJ$JJ$Jj&,a,z𛦡$3O dMsYI0ȍb#B7aP jc`]kA.mA픶cP+m-3S0iЖ;c`A]CM̊R3g;iF1(EM؊R61XPQ 0*1{XJ:g$t(iS'5%+H0QiyWa=OO0ŽNXeyWbQcy*X dtS.Ff$xzXDy]HSEwN'i#CYRO 厪'$꠬eyjYx_&1yk^s+[A*۫9}%ې55\I%.e.\YNb8qiE-sB IЊ<kw*|Yڙ/&)pg.] o0V841̛-pe 7\>\,Ae?-eqܖ_CMΚT*dWRm=ͩN~Tb$b$VVZZ@\$B"-$A+*I*bh;UZ;Q!jv&\w:O5fD}ui3G7~+?픣]UՂ 6.7@6zUo`¾3ŕckvwJ="S&t6u|g7oƵDc]HzwuݴENe{65dN1d0`j|ȒC׫,j] Q7J'4ج# HDz("5*0?E^`lB`wn8.8n!SpobJM[R!s= TNzuw@BRR. 0#x6}@owq6.vA\ M 2ܟ.o:e%h^;m T=fJ ~|Kxvi[1?l+Fudd|cJY.:ԉA* sR<@"e7*iw_1qP [hj*KOu[.Y>̧]|%P̒q+RI;A**Zt|Sl m ]M nWNµ 1 ?M*֗ؠfVs$qւw1s'(J4HXU_⹦6fVhjvFvUfZ;P^X8+JMo@(FՍ^0*1%7`ʔ^{0w=VA֋mB8b@†/^C,WLJ" 坽Ag`+~k'C L: վk ):igwʅ:bK SXXw&) +tIys./I,RD1ۭ|vQ}ZVLoӥ3 sHfO.VmY~6Fޞ'd[)3P5r<]$_KcPq~ 2w&$$NNd=( (fR~H8SڪmcSD*[U+:*f*}pn (*Ho"_3U ["NZ"cMBX6rcXpkǚƈ5d_ծkXC-},¿Ymv_ݱ&XFU5{qa+5_$lqgF7ƘJj C>&td%Jl娒Fjɘ}Ɣo{L )I#Ji^:\ЂINJW;Z K[@AbI XߍyyCp"|tY[e{T J STV-"Gq"~vTC Y%9f+WR)u@m*=~m)ϪQیÕ臭 UZ*,]]XU~t*V;-F|ԶI~SZ錅I Φ$/ܗ=]OFݑ't% C^Eϋ&MMlb /-{Qo_;W41~#j{}h;U}*zs_}%-v-񎆈^d^yq5Ί㖻O(NAi'~?MjV0!Lw2=B6U=sƹ7h<ðFÕf `_]{xK=ƞ{ʁ^t`__9ظ7? sx5"_x/;Վtԛ ެ8 / hCKP)Qx.#I(BjH:/z]ҝ7 ިtEQ~K ZS]AvW.CQ1y%XO+ԋ-N +A䖠"*[p/Tswi=Z]8>)!(D qt \LQ^t'Eֽ+4zH^6ο@k@x}1wӰ2 f$E"NkG"Kpe$*HdWR$JDV%+"mJe(Hd[si=UF"ULTxz@^h{z-]IQu8=$H/``=hO mgiXl3"r&+"QYD" QEx$*De^YlS*#DD"ۚK멊Dp4b.DRk1P-kֽhJKKeZskcAӟ}U& 4(#.$]qEp {WD]Jp* "#% bE+u B8r0{k6-kKםMj=)YaF7&wf 1wӰ2fLrAL$]Wė^/2v%UԋpcURqʼ(ئTƆr/*@5Ss7t1D"~t>8m|7ǵoֱ;m l6m6p-4tgAc;W dV|vu5{Ʌ\lP[5F ջȅ>XlQ[4EȦVRmhQ\l?\n=777 yFҢ;ᒫZog Vb"vV`/Zn=⏇^BuqW\+De|w/yZ/#W aSbWnWMYT ǚˏZ)<S}׺g3ƹd}g*xeYj$uo\ޭI葆Nʚ_@l\UHwP =Sdn7#ȈSWYeT,)WjFNKo༄YWO. N^ʋٿ=v$$b5մNƝc]ˆˆEo*wXoPhSn5S%%Gе5-Wa iQD^jʣ7D6Lڍ_a3%fB="_wWŶA?ĥyY?#T(QE^p776E[E􊑁O:.4T~3},lM:ר/ A\='ęda\&Okg2bA%) }[LY]5FUVV[ŦشVa".4D%(1E#++Jz}WrU$SŸ}J ~Di-h"䅠޼AAH)gBkd*%SwlV"^ 4v( b\sz~/b\="@42Y='wXE?tnr˴/ bow̧N!}G˧/Gv^'L[UPkx6 o^T{ݧ|/>]]n昞?;2Q|׳ <> Z5)G{s`^C?,_px1ho9,,l݃s%p{JrR#O6Ͳw4 8w0[ R PK7k1Q6gQ!Y$).wmvK1GuJG!T\ˡ0ʮWH+0 O O*IuБ\aLRiz%2GIN_sGM٥P"hRiufk^HD)y3}r˨Zzbqppؔ}̘=|C˼%soJ0[nsbZ*L}-bV  BO`4fGw(cGqEobefZp:')Uxbvh{5s -9{67x; "Nޟň䮷RM-:Y;lg-Le]Oƾň:HhٛSxw[/3vFeRCu+vCgp)g>tr<*c鷒7>|SvҸ/XҬfҍ(/CEQc]eԅo8c\M#N*8[vj ;s_v~$`&]LI&YB V/zL.su<弨}.4Rtvpm7g;8w>O{}ygdOu n$I]iŵO7R{/mθBoM-=a8&|!v Lblzgw(79ܒ{+aĸk.Y7j}}\sZ17G (({߂Y'9bp܀F߰;̅ |KP>=;1}(r<Lez&MdC8FX'iՑjdhMTe,V3^uNK-5hg_n6 id!O5l& .le.I:+86hC9S។sFLut由%Z&QW(pfaO+`ı1p> 6!aFaV.IvG1I5SWF*faR]g3L]_M xAqaV%kσIJ}S=9?e[A,j14v`і v&fF+F|^Г]N/|J1k+ld'oM[X "(:H#nFEfޱ:jI";\3x,ޗBٳ)b[fGU ҤE/Qb`a=|rd"Pܩ;>^wժZ;(jO}[=>mM ctld" #!fI;A~0j\pӊ1:MCenMz[/t05˓f>NdR2tximxU{H%m, )q.&VNN<.SSg=QQxwGTrrT=%o؜6 LG)\n5_Bvԫ5qwRr'Ka<{Co\C\F :j~w&\;n=2-2EM \x?A@mz9bI{, `~ba?m1h;p|8yټ1(I(^1xʽw [MCb<=3]Զb"*?5Y`f5fpiϨqתn&z8qK|:z_cl! B(YJx,>{q}տ-0;s2ot U@L]e-_wmŊ9[g\9^L4Y`[qt9y(voj_wU47ˠW۞csd>[;.h;feHB'dT %Dƒ}e[ULz8I,{*%F$ 33b03ґ"cBV&cBNSX%'moB+uz'T!݌S׻%<hqCƋ:4qʔ"[3['#A\[N!Y29) i_G*,E;Dr<ϛBqiz-:(+&T}QlG[ EaNʠawv9=u2Fet] }] wI|£0OXMb 26ZnUq/"h#b l>];Pz'rvb/ ee|7SEwi\O'p/t*iyQ~Ti" 7/!ÈɤIč0R,hSIcKۜ+tHp^%@qA9Rw~1됬x~`ԆtzVhut0r.2Lf/z6r~g T;75ph-Nl^˕s{g0sy0|F[0RYE#1tkvϞq~R͘Ÿbam#!f)4ELަj"]=_iC*EK8Y;j5]+'O.Yb8_gZFy\=1_VttlO!R O<;,VϊSn K\ ?YYa9Ut$Oϼ8vNŒa,ȟp(S0ÐTvYh}]]Ղ%lܴu/YV*%3XRϦVS7RߏDuL߰c;@wx:C{0RRk=IwV;=tKV {pDyBqM _fҭ|#3(a:D+5A䣳eq58??jdk:R:^?}6P##u"<4$;|'hD ę'Vܕ^Vs8֣{m' ?s$Cif`3GnoOHrP  p%V&h [}ؔ # `fc': _LݾqIH~3WK۫AЋ!:)sH8WL?sC$+h]'9aij[? [ʻUO^-\y@hXLB ?S`*|xx7*S=A.9s~.N>w_IiwQkѻ-t}(n) ׌G|;ޑp6:7q8ރfm>L3K8̚XFtrg;!tOذb-=zb&]ofXටO(.[pIJTFu5F܋iK;c{}[i॑v`o'Ǻ8+NW1 az߁-'ݛp1'^-iiOc%U W'*KAl&(ގA8+}v)(_# /}pJPX6`(3xNyXiщW 0qՃ={! ΣI ,CK3yixt㳌piCOw-@~6V|t;#l7EOד݁ϑk֋LJ+ ԎҖ#1h~: @71&՘@ɱVLQ 7v<,iœ9oZ|䛤uZy vKMVOu]##V!MGMe(I1$ _=D3|T4w X]{J=PKH{E~Xo=},MbuՃYfP?#;l3R=X.,#qB8>cofihwyvzT{ϼE4dLMmʌ/e=?I/,?roX %b}ExW,Xā9uStzJJp+wa\tJp<XƔxow>XB-nO X/oEX􆴃a DWmLub=0V6Kݰ~0I/c ΢GO9p^3ׯ)E"Onp5kKy7HJ~b;^Zn&HݔKv8Qcr %2(5"17}"fm{ 8;&@<2cp(Ez;c;ux8nm1- 1X"YM3/vzwΝw"<%`&ˉds gt̝: -% wGf NH.۠uz{ƶܥN.9pODā} y ;3e`ʤe hiW}S^,ZPAsZ+ qJG [!4 I0{2y'_t69=P F !& CҿKrcTA;qP~hj [ƈ >[ ty%R K}w97{ VzT;SRmh@*7ji}([!8r:??;؛+i#ѳys ܡ'NZȻ%v/rr&CV|3 ?&+6~Hr#Vb ^% ut,jQ!XJh2Tr8WUT;Tkn,ͽmz4I*T[[?ݏn*q4ΐ݆nO;=MZk̮]cDݑ{W톰K#9caPrϙm jlnS a4> P']CiM=;NjLX$83!!ſԑ͞rUʎ̾%x탰HUˢ WiM1 v}D4XOS&S$4I]#$ZU Cro/!X!YVHCqJ}WzeAhPꮞLM18QX8PُG$ٹ I'_uhSdOO|Rl|2O|<VLٱ=QVWd[נc;uMXwYL&Wd~}6ZΠBI*z߬뺺N2ۈr$'aN!8wn]U@*&` J{Xw'It$mYi\|CMkՀQ b\g"g)dCDW6̘=UOB:yƱ MS5C[RQJ)gsҙT8->L؝*-;y)=u^qʷ?9ޢoB~8%IS'`@u{VGu/Ѝ p&_~ F ɷ墮jN4NM0M[J5}4ʊz15/~'?~s/>E8XJͽ:#8ܺ 01x6,9;be{q4r/“R4LuOW,ڍ(.)L}Ikܡ}DZ:<݁xAUD;1ԑ\6+U-7b.Wb)۷'珺ɘ>R.V,$i˗;:p*,Q/bؔ&1zs9s rlPˇ=N5tkeo> ,8ʾkW8)t>6t҃<;"ko_9܂+,|shrie\YE#;Ciѳ5we`CRLsH)ax[ljS˓ƭ6u&Z'R5a/řLkrُ: OlG@\Hƫ͡\r XnM3mDž_$g!DX$JE۟NS*/P^?>O w{3~$x lN= FϯZ9mC:6zqf4ʒb5zGf9:ޜqsOMw'U_+ ~i2ڎ"hbbvWr6ߵvksܐAv]*x#lجM;enԜӣVxZs}**1tpJ,X5?,3瘴,ޗ LRoY5[MywLL9r> 7[YC? o~\B!2YioS2)U"4&8֪}x l_kēe7Ddž&r MzdtON3g!&a0/1y)ָ/(rx) /ݖNw`[wyλcɐ2G`6{vykd>sdq(A9P’C]ɔ3 2U4}}oss_ Q^, ~')7n'-bA]Zy/F ˝ a8P=Tུh=:r_)~>@%p}o;r 1BG܏sA|=YSEmߗ?ͫm:OM3F RWtrٷ߼~_.]S߮vRVu[۝1&TU0dtۚUfl}2X!5\2Mg}]KXbhO9?j;!vcL?WrӏG 1&$7964E?}iB7In`ﳯ|s5ܡ٧ /.mv/ɛr JDOb,NvY|UA` -+yz]j6^U\i _j+ݾsCò}QďV;r_,MD¶4esiud+#^"jZȻfb&+Q2simQ=Aq%ߎ |d?e+L^tٔp.bgpQu0^竼.Gb~聨(X0}{J9 0ZpfU:DlݞoMZ,Ԝe&V042{.o @A?S$}[F0&kؓOHau]-~3E&v.겁E 9/!_QQzi9JTW.`_frzMe+D"{ K]giӶRHs)%{%Bm3&뙍)} G]nV Ox9^ +º,'ԴIV;Ћ:˻ TJ (/9 Pf_n*܈t@ ɤ]zvU!kҢ"Ugbٞiؠe)ZmBOE{ jJl@T됻rk<'KXb*af2jf֌A0j)rƒb`bc,*͗M3m0x~+tp_z'DͶlFGr#X)_~td%S|!ze~\~," ul`ք  oDieH 73ͅ£чND\t-<]vs3D$QjߪcP,skș~|i䔠Vƥ֙H]jLv΍::RL]ݕ؈sH`ܬT+tC? 1}9utݑhccs&aL@_YV{TRU_CP>}[l2|;G'bIV{#unU)'KkrN1`F.Rdˬ) K+3Tԏ8.XS JWbT!!xVEMy9IazB(84ژA 4XXYf~mX2Q#E݂-o 8b`hrs HOzCfeU42HiHϚ8_K|Zz[:e(jvmRjy^ ux'2Y*JlN?N# `m7xYȟ*l&.e .b?4sġ;[F  Md=%OAjA-b<2n Ts-ƹ4lxXb.43՗EM9E#1@p VVObV<ɤD(;cҍi{H/K ~n'qTR6\>~CmaKu Hs:H(p[b ң1ag&27>%^=dRI\7Z/grW٘S7 l]l9:sz%w`ulKFjl_Tb$C"&gQW@Jl_vS{BG'K%nJkGl^/RLN>%"i|?:Uz7Dzy!E71Z:u7v7۪t J5Fϋ $E}+0 3Uq:UT{Aq3<rum="@ADF[Yep| ux! ^ocO5Мqa k.Km w, $!,i a28%ZfEYyvU6HT?kkwp K.G/`Ll·^cKyb~mW }X+4iN7[.ъ-P ٌHJ`uܐ} <_—BuhPO -ĞǷC$[uYN7l!@ Z,HF]B&oB) =_P&vZ<)2 4| -_fů~Z78;=H:la+G7+?j MQѫcp]->N}t|/Kq/Q!o>bF Z,p0mkCiCq[W] uKv\F M1e.s=ɘI.#1 ~#DE'f΁)5PO)|ޖ; hALg`wX=>g_fFO+!C+жFldĖAN9@B/~s#pҀj? 3Ъlb]7y}՟lb2$`T6$ Y !b3p @,g# rP"ӈ즼 @,g/] Ó)@',g ;brv[Lj*g4 n#M X>0X.wp/> ٠ep lJ;S!.Er6&tB8ا,g69'GX+~]튦? Wö$nހXΖ4b95#6󜅔tk#H~5$=X}$ l MwE0b9{o:lp:A3 `6 l1:g9;(]o@,g D# \X"]XΦ"ğ Ez^{Mܬ |?xHA ٲ2 ebYě4yH@,C@@,CG@,C6mõu^/{bz2d+j1}ҁXn@@,g ҀXY %Eub9;\oҰXr[g,glo=S}) lXή1r6zmҴnU %6٘ڿYW5g,gKb$ CFoAJzr6V>c4H}k#?d1i@,gkXή L:l6-Q|O@_ @3Z\ fئ9{o*9/ WFo tD~TFNتwPI@ Ek7L?kp/[ׇI@6-._!b3~m_AYv]j#hKb9[D[5QUar9u?Ek߯0cLJXΖur:-jUtܯ-9[]s t6~m^l«@ q_VI@=6ͼ鈿_#@Yk @==7iT4Ҍ$6rUB/BXI@c%į.I@,C%> eȶ. (P^͞G3e( K:4q֯ l\xq0غrd/7Am~CզT+@H.xCbryU~Um"43H61Az))(R'@愢*T[xda(I]D1ώLf5kqr$? |>LDr3~ nNtum 1~Wgډ}efHT^-BI %.HuM>ߵ:k 2:cU yڏfd] ]}BL^8l92{H"F3Tihʂ@2?PFУc +/\$ VޗBln2k!wUvIY/UR .xXҏPN̚}5fGf=I: dm~m\:~%1\ \JH c!EwpjwA>AC+bMw5K)[mOZme}2l.')$D/+b,0WV:4;ӈ_^p7v%̍pn2&+RcA I؋bsra!IcQ0g:^HzJ'-ne0Xs yĞ͝1$kBƘAqUV&V UxC7eILϺ6bn'D*R%LKw(5 Ӿ.d;I;轘]]ojluWЙ# Hu3j3P+2)&WD)?!Ƣ7]Eӎ ~aEv42G1ُe:lp}]l5|: Hzr}:od:;}|5d:~_Q/hBwI%h)EfEv౜"xtᑽ \{PqnM쿄(2X$OP^Rne!vZ 촀E kq(oHktAC>~;ȼU=3$hx&K6 6UW ->(`W1x-ZVH5ԏnmJʙWރ(^;S'|Ѧ"NSzE?H_r߼Bԟq߾\Phzˤ"뗐4p}1m˄keP*oz$@8oECWX({lW駶Q2&{hcj GmBN%bv%6?U Z(ҙhlv~D*-uz>":{T|haE1/vWq{ ʪrX!ڈ9l >zH/~? n>pH\O079OO_c0BSںh$ n3M ٳ 'G6c#0vtn98to(\Cg K9?{ 6hU-(x~ v=H ig}A|wftvGk߁6ᠳk08@60Ŀ~dJu?VJ.]Od~&xkDҿ10V.X9k{Z) `gn`2Z_.MQ(m>:U]'0n@O#t!'r8Z?!hB<<@k },ղb,t{-"{赢bǫF^=H/!X*|PSWG(a@wVTYxJp.R}̗O5(B" OHQ2{,Bq=9*MwN(~zbͥhݧُOJǛP35'fԌovF͈fL7EFgԒ{nozFW:g!TU}t9Kgd8\駲b&gΕܕJ+b&rp 9v-?Yt :2)&~ C(T>ٳ_);~~' C.ځS\VXһTMNJ*EmmAI|*=%r) rJmK6Vk/Z*ٴ_KA-պ\^͗9DKXGM|IYD>2 xc:_8Ӎ=ʵNV[J-EQ!}^9 !jzl pN~N'bq__K@c /u҆σY|>~uHc!`hрI%rIGG<)+:g8yMʞzaQ˂J% Zx01"z*%D-%;wK}S, ]ZMalBdȭpEZTG'yQmo |w\ab()5.ʄnsNF拵xXX'yq5PI~Bleny4Yzbck/ T䊹l/r%(r2H| -tCXc3}.XZ5TW3 3 iRdj.bq0nސ"2/&,"۾sU1XyQW\ mDv˼ǟd:1*fohjӖl9Gp];+L1^BCꭇ%Md^(fW6|Jքnnŷ`ǡj!BfBStaNٯ c&j>hM TR[aMt_Z~$uh6{dJR,q̎q\fg2w`v%tuEw:(2h<Ƴ#Ĭf-q͞dp'xA#}]RRhBK8%& f|P7sBGQ1ZMffoL$d諍?^%xBvbaF3_Xϑ^~bH4@ [Y:}ɴԱ9<$Tv3= ܫPi'?elku;`ퟱQ  ^=^8PBlg`59A +5@HaN\> ;μ}Ee6cU7 /v5nǴ MwV s"`̞I0l:[8ALsWU@ ڛ=D24d *40qHۡ/>Lc z!BM3!C)L*suaýd-ykZkn=4{e2{Q"XJk>#;,Ǜ>Nz Xg$&Z" KF643[(*5)v20Q9@T5L#Y}O>t MJ@^ON)fv/搒~{9^r`8m06.l?y!4mІ-5 Y)>j`Pf]ҬCP2yKg Y 7O5$v a ʥ!&uNI"&g.iCѻGXě%5t9ʰ=S|&r"UG(=} d'u[WײmNś:3}+eBiO X:^ hRfW, XaQF$M/b~8PN:mZ{j3 uo$+¸ٺSpeѼ6]9mtqf[Ftq`!QwBt^7IbYt[˅ʔ )ʉR*tu+E'I8I=g ѕ~ f#T q8145 *L\K 1K!ި) n0H٤ڛ{&cr%3oKiH$d9~.`Ҧ7 xX>P吇 كe !1~i7/Ù5-<^. zq7$BNPvHcoIO8{lpߜ3= 69ސ٤&zfl@{ߌ3= 6ސel:ηuUc1:ބ)T@wI'+{U,ev.NtWtXA fr;kSݧ:a+g'Ұ!\Ňc򬔿eUG̮EDZX}W?G vO:1]r1!&OE#KϏ,Mkori4)~AV69ۈտ ߉co/A 9 \F*ylE6YI}c )5*#Ft )/!ޕw?+wل\E צ2Zqm}wiEYiał/4I{`t|j@H6l3!Oؖ -\}gDSG/)qlk i?!|\N=$`ҫFqR2kS.MUA=x(W_;xDG AiEE!1kk% oeꔓ|M|;`נDmGȃi#̺P3踿m2WG/U9EN~?ڧD 7bVcOb\hYF"Bs1֬]|%PcSOMGaY}eA7pɗ#3Q?;W˫>YX~NxC) FQHF] ٠AZb&3l6b9:s6LdfyYw՟ۛ䕔>ѧpb^㦭˽]1Oy(@^3\ Ne{ [SB` k…/)ZGr%w7qX('2g<_qZL\&ʈQEg<1tAaX> :| 0D5 U9E*ZA`^eUD@|oͷxz7EFJu:LӍWϦQ3$1l:m`Ge+5#[Z}f{ ?>㏱l܋^R)䪺A5ycx.Kr! , [|[Jg\v^֮TaYem.c/26Buk+i*c/¬(\wLp>=1]frʺmy 9-7QjkR+ƓQ 3`&5N `BHzҤIgDR(Rx2N'Ek])Ș:?\ ]GgN;7dv0댡n`>4{Z"?#yzlAKπ6$NKjm~驊lz>X:R\!UWe+)JkFnk8h:sŘ/GhÆXJAܩuiS-JXXu-T:̣{ւ?)a k"#{|N Ckى 1 O.E0ڇ=Q|LG<)C1#yt$͂7' ]Ln,>/\.~!8aJ+ȓs%`uR-d\G{a.{MȲnCS}5l9;-'~}4ǣ~Oז`NQ)plhyIQ,hC1B tJA @iyXdgh,q:78yWIrOfʿnujkw 1wXhZUَLV 3B\bmu3踱70`U MRL{irҪf$mα⭪-ҩQ!vSHMlpIR%κ *o4X KK)nBGt =/X$?6]l< ||ςg0bi}o}:;3D=`$;,ဃ&.v|$w/]F8](=ـ$?C(z9Q:BKr {dD $4 8i(ͱ;թxPmPHaCO+vj-ȋ?go4E^/taԜ- X2ux' 6};ݽEgl,0}s+ybtB`iC fT])xh@B4FI(R1UnKqGC2tikK .k5lJGh[\Thoy72V"s}F{ 5&jێul^HhKo)ŰX$ i O~%t:Z7#qRڡ9RW,!8'%cnz:TPO6߁@ ]ahe Z{E?Ue2WUj\C`-lp T]KL)ҡ6KRFw (@JoRb&֐ Htő;6^+/勂z.J4%e8+dIw}Df0|ˢ; h0N{('`V 1gf%y8౱TyB1M GZz`fe!3(aXǰmΞ0dP̼֧QFeS>"C(UǾ^"ˊ6Bc03ϓv}0#X_Pip[cIFG0BZ+irQF(zDhCx'GN6g"!#<5/@GUub%=(cZwٕ6%,Uo*|r4#&ݥH5Lx0@R.&Z!@g5_P:yH Wˣbr59[AS/]ĉar1\Ƌ2ҏ(: 6~J,ևaHMUX z@~@T%8n@7$H)ڼC]~v`gm= eI6k"%S 9܄ScE)lG:"mHuR7W>:ڍWzO;%)EX2՚XaȜg+;Gzs e69QDA{4Z>b5b~_F1QF/C*=X ikձX0^6sxI O4ЫqXG\jjv(wCw/gv?1 ܴXE;F `'GRW Hy%,; rBѩF. X=!+㪐Z9./?%*vfQ*4ܐK.cf%hfE.#Y M&o@B& }dx&QGuIafXX@cvPcո{(5vmhY3\]7lnL]3>M O .]<$8Bvy k&RgʇB\և<&4>9̒A鳾6{X:V vuq&ЮNng%!!;HRj;>-ӦƔU')ܠQ4PU5xsg /__bp±9Sqot$4.c|6bځo5[8R ćf:~ \k]o av:h!<e^ȝW^& O~BH8UeƫA7U aS&.Bzh V|"hk kVv&3,9!QQ1}$w{iuSPc8H -t~\洴[aN;JFw-JGY})t3ezQR1EurŦ]W:‰QV ͐A &AzMTrfmOg(KYCFib#k2$_ !VI&-XRJJ(98VHwgU6q^yb  S! `6UY"WguhA*slLyA[{AMLV0u|❺o:id('7y&Ym5ɼu'ι%d=ox8|:,֘Y|W8薑5ԯK6_YE<7e,2UzL}dS_PG/:Q/MF@[[wL;Bc0z{ikK,wR~7Le~ 1wTwOPY)ǽIZoc^XAXǠI?>.:^Q|n[]07Ljۦ3}-O3?RGVi8$~ʆ|[L`ч%tNcߙor+Vޔ{J8^CZՙIdVC5=N_gUqѱ% yiZYEG6)bW{0զxo8i5ձD_;Mz>M nxQPOl2r3,E'R'N(qxA`Z7iq,qūS+D[$R/ OW%gv\bW#M2 ʤfΏd^hx9v/X}x̺ÖdMۗ/r>\jz_WWF!'ErMա{R#{|z~~"eMAd֐d #ԷzVf){%@G(Gkق$x)ccϏAE;+]5Tل<ӈ,/!lĻQT% ȄE1ibҧ#k\by hrzބr K|uء=׿?Ýmj=օ4.[}9>U\lWjK/\T(b-roZ =RTdhql8Z!R󕂣mKà,6zXɍ>n:Ps`谱C0jS롶ϯ|Oa^bBSItxTd [Wr]=Q1Kz DJ SR(VUB#fPӄ6diK˕*Fƌrrbw=V&eT=e*fR7YPfN{|}"kfx!>\Vf'5]˴G)*Wu2!%~j'[Yb?-0Wd6X^^ēKBϭvIVP&Wz5S"Ԫc GPqFyxgՒ>X>;2 NK0X6tj^ .3jJxv^EY̟tBp$D ""j5JSⱨ=si?tC#eja[xDѩOO!ӕG0 Lϛ[p:Ϭ~4Xs=q=j8k5PڴqWR1\DHlb},+t +2),jLg/}#Iw` +q#bGe)("t'}/IBCW^eķйêkkΘ1~%v1/D1QM|w!k1^%0/KAO1)V-RB_B-W=,b+'ٛJBF!OMZ-v,#`T!Bj5m7 i~@0RNӃ`ˈ^ep.& flՅЇ : EMfkt"Tmι pWe9bapbe+XmGY.Շޑks'GEscy3}N9*Xl& ұY'/K?䥖,\ƍ0F3TuHxGGǚ'L@eN$`kB߄w_~=!23]:]ЀWyiP=!VV(Ij:չƵlJYbɡ9$N˄fK#sy,d7BxP٤W[D T%)։lbSj9ᰵteզMVuybrd(hD$u_P]\_~ o@9ɷ墮jNGJ L"Mqq`g?&/u<7!u}w\qm k+Rdiǎ={$@i[Q!nU%v_LbsǧnPvIܝS@ bKOsp\'ا7{\Mpx}{" \P Xrăb+ 5t1 oXTr/4@%\I񵄪$ʆX"Oo&ZM>eVll`>r[Wf:{ @2z(޷P%T)Ev[ܥ'md JaM3 ܕۘdS!@Jl+oա:|بR_׋;%my9]f4<=զ?޲xʔh >9&-&@WZ_1ΡZ#u$=n|f$x0{wjt*fLeak,D` sSUt(Ap[ @sB.}P8jB!Cti;oMX^q;ĥ=SrJуn'%wsouvM{Q* QJh1"m YBR8'5':PYn8 u/>X䣭0d]Gvʔ%3Jjlc?rE4'LP:iל Z4t$xU4dDt#5hT8(G4+eo6mqD$ێ'aރh"B7@;bCi#L|%E }*_% #=InR/9G]\7e=09fa]o~u )6#+F[[i xVmf.!  )p2x\{N2"s[7mLbcճs(s?tqrG *rd8pk֫OSS^u:XrRt+eW5](t\~`>nY{)z:ݮA]K(iosaZhE.Kj)6sm<=ȠUI2uƔ<)8kӥ jXr.Z'YkGPXB˥@p6SG{WQ]4S1ٳGI9RS>غ[rը{j\ML4)p~/D9ЙD{j\g CH#̛BL İlD nzRuU/z"X~H> Vѷzmⶈe׶'uZ3AjT'3I$KW[m?[sJj΃ѯ𙑇ʈ52|j3"r,0 =0iIaF3U? [8(\ёbc$4KR$u ^K"%@{Ӱ{+K#3c2km|v^A^#'sh{:O&~{0v\=XF0]Q"< IzJ2Wm% ذ? ? @VӵFf/=^~`R`_Hdޣ &ŞCN5}%漏#w<1̰qG`6= @EQC_ 9vr䷉htl@>J[2Fe[i HDxxH!G''=_Vu Hq 4F<8oWѾbJFaawrtQr<5Rd&{x+3Fff$篥k?Z\ʙdmQvf!n Jd7&e=g-\e C,o/뿫a@F+5vߏ8ǜd$C9l3l-b L߿tvyE0Ԑ>4!3#FY vle'n´L`Gf e^ p|;r95~#E96dbwd:>"CFWjO֘Jyذ+Į?$k)% e6~O1,j5 ~Q>M5v ۰fv#_8Eb9{\*،w} 5H|uwgN{PiwF)7gQTF!_rާ;}WI70M(:1Quj%;h?mߴɇ^ ٤:dvh+h2La)# xC`^7bob+f-L˺[_:elf7a;,W"LԟF ǖa; .E-K36,a)cԙP\D,qױMɯ5zc BbXW?e.' A@R/)d-[W m.[\`TII_bl`jm ]NSA$;V*H' K4-tF;ʙn e`_a7-7ޫQ)gK+ٕ3x!~͢\ N:1 zZ. q)nO cx+{~}wć*oUXOks vqv8 C&R[Fn61÷|EC/}r NmF+0S=6p[:LZ_`}LqUzَ6[l;+YLќՖ^RbvXdv0;SQ$hs)ࣝR/cC`6~tx<,@oȹ8vx'Q&aR6\G dA-eY(6 I!N+#/OuYqo2dp$t #Cesrnw\ ~K[ڥZ.n")-)l=m\1\$-,~95܄y L|x3%H ذ2i2ap* %p*dpI g=c@p;#`/mhԂssDsP: r2& {|!L3|Gʊ$ .= /0AN jݡ`?/o3C?*Sx 8'A⫺T:"fO?J|aL[f9 R>khXң,sYM<*.KN`8^Vi@zIuWv>yEq4hWC>O *C |EJaxGޓ0f9\CϜ!C3ё>Y?Az# ;6ذjߺv|W?ڽU6e&JD6DOEdPgkE wh@tI|){%wJRA=7I|:r[-W@D<Y~_MJ:[ okKԬW⍄/rE'1Ñц߫9̕JߣiVdDlSA0A"Cݬt+$9P"ϋً(p?Z|b2XZ̫tZ.g&#r|!'&`8/J-!%myD/jAIQ;S(U@L[-!u.uY (aCoQ4;PGF5o~FS\0Nc$S)-f0CJ+BՅb1pIm׌(']#m@fa73?9991\' ZV1zO8|nي,D};{0{Bv"h'zG,sq28?_^z%L?wޅͯ8<5giV^-Wx@=ס/9zOϪZV[iQ}lz7p2B2,7H Wg= voT>?rOS`Qy w*&?^pjoܔ^h޶ 7اD*::ԀdLwTF<1Ipfj9ԯ[8]ٕX;uh:UWMqگGߐ1*[l|||trv'EOt@6gV&!ܰ + ?h!d~pz#b#QSQ?ЏJ*[^7EhN97 N#9ׁ>4z5*@OU_;+4xkzcL09ه+ HtroU}8:'ofG/‚o[>I%4s{B_#jkh:ˀ|~%izn|\a*TB>N2->wT]#Orݹ @&7j?]LϨ5(qwmЀ9o&$(Mdș ;4zp!}C0j=*p Lz,㔃pFo2d[LSwn>L,r6(O+{=lU!? 3L/fZ??'{vb^Uxk w5Efֹ'8SQC\~BOrDy{MuűLd4Pq45! qDhK"(Zz׮JS9. rY'ZH݀TYO7H,4|\#w8 +؇i|U\y@M[U~wǼ rD?7UrҾTFv|r{޳iqK<. 1-/pZNI8~-1ǥ|\2T/mż =\zxo@-ퟞE@+\l>N9tmȺ>:a\>@arGuTRwI-D@ߖXcOC<y•#M`\!Ӣ09 Pqu^)?Q:I٧_Ɖ5I!ȩ@])B#ؘ WSZ{(~.rNpI7NVdU5fvewUjW\8_$^טYj`1dvtY?-4nXzp& k2-SLL}:4JNI3)@D\Nr8Z; EA؛$:Yk^cBnҙ#D_BI:'+KB_VQ= aԑN 6~\1a.EaCV muο RV re-" l";[Qyڎ.>"l֍X*DdyYkVK{FCPv[׳N{j3 spnlMr^ڵ:HECD#vBpӸkcdZ!oyKU]|{}Df]gik}0Scic ʴE҂I1LLu=H|=l2 0y)8cRNRУF|`S ZHRHs@R".ĝ;Q4.9yU}e+0y"v .&+$|P$LsހǬ=#p4Uad8F>;m7FqF0탆5^b\Ydv-6ғ?DtT zf"Cyܗ%mlQKKlr;I Pd]0&@QW 7N^mgA"Fs݉%b@~ =V{nNs7jY#)rH|.,ZS]40 z&NrQo'LQ{dꕠ>E0DO\%GU)E%$` Xei\R*-$ ԫVʓ\tj>uk69N:E>ڛm+wF )3)E8${廲:jbd}'*Fl~N~HZxiG)כ 3G](buRMPb(.ߗǫz ;Bd|Go!Y3qzʋB{n2* 2 Z#$&tpLX+ʑԌpܛ bޝqpePYc`Py &UA4\mV>V^!^D)}腮FB qU38>I,Ʃ#Xo&ѽQIj YSM,E "m}?<=Q+P⮺}ϸ2~5ܨGE/)D9lP^͠g׳j҈QjSSߔuĿ?zS|58}.1>L E 5XZOV[Y)z*,{iQ;*"T"hyϻ|{>z(!x]H=ӫ\S_v5oYwzB^3OI 8I/"J Krz2mm 0{M>L^X6J8KB/MؑM"N=Ȧ9r=TR%~ e HxohjE0OlIAxNψRpϻY XGi-Ip߲'f/ k'"PE _\ΩM,܈A$'uyn^!ѥ[Jp#=qՏ w~Omg{N4rtV.U( cpV |8A%}3| <=WO`}X +(Jɦ 4pqN_̢8њ3|-)t:Hmt;/fb6LF /~~ɈBka^*TB]7f_XV3VlBp/cG%0z:^lDWƜh}3_? XXԂb5ȓj hٽ*b^6OlN`}yi1cya''ݸBoπ}HZo |Rǻ A9ۊA0m ߷c6]|{OFx LfXP$0aWڝq&{ 1,3-׼@͢ÿ5KaVBTRLWlS(ER{uNG5< D3'f{9[qzbh;!U;qH!P\• .m̮,$"N_1&vx(ǓpC1 r0}ZvsE.d;BӗT@R]="mv_J̀A/!e5I\OcXBZJhVCP?!SǾ's_fFzٯHDj|+it|H|r ^RU'pjrk !`s=q"+jfRz@VZwu T.r6k63#"rxδ~GG1qgi,surB̜։BHBɉo( @u G%}1eYYv [ël1dYdX\1rϸ`(;'8K 'b{^jI 2Ұ3͎s9j@Q03raBM>-! Z)Bʗ?h6dQq5-$W3\L&b60MϟE:b6J[)+a}mzj 2%M@BwIKP d)YreSZ3V~@'&:Z\Bة߹.HaF-IKtFZ%r g13+oOKY 7jqL)KS`vj Xeh m&z.PT`۪ڀDW|p[MIh-%eP}/ot! Eh377݆`ݡKch++e+v4Z xHlE kǁ2;7UpWi\m<#1 n_a:v7vKe*ui9ԉ R`9p)zx#[>(j^̫K߂+2ΪbpiCX)S)+-Hi3c& wGwdEl(gG."OYW%nMPVIygg Z Nr|M@Jg![a kzZnȴcYg/zvcX-Ue,Y$Oj-ZA,Hn/Esjnp5 f5^@2zR.*~Dj|vdݙy6%t)I!!Z^D*yoスTtGGm]`z>oeY ns]ڗ" 05'==r-aJf&5sݳ돢{zr^bUs\;8|~ۮUOW7뺦z51SCcQeN9l?V%zLo[+N@jե3g{s?#5܈[fL7. PIcnN[Pڶ3WI0 O !KXm,3Pܓg}1#ѱ',f`P׹ ,鷧(m opv- F%\UFNc'lb}?= >9z,kJ, GBGxԇzf"4@\݂px+/^!|ܜgomss0. ,H> ;/Ora/Cц MX A\"B]nY a &k#Eq yw@S6֮,}{T_X8upT C9iJQ}X=߇Oq9l]\[7|e}J6cwⲛͶ[=a5e"DJ83j,6)7嘠TblRp.8p_&9~Dw9w'vAT AAjOνABZþ;fc/żQZvyg?yzbq]'Z\n*OLtӼ)NׁC?3&sQH6ØCZ+6 {S7'asrדE v?@;tu5@oމ,@up(ވsgxOR. " +rɥAbL'pF.<֗\9q]?϶ańcbՙRa;\coQյ(;¸z0" 8Zg] 駳+J} @;+q:TTL:|8E;]ZJdtn Lv_j+Kglׂ總2Vl~k-ͤyEizFcN#$H;Pc -AbҘT}T6J$m-CH'Io-1;w| l/{^zX_(QB͹*$Vk6eE7` DبNekFT׏^ |p/]p0&{ (tdblebά†iѸᤆY l L#MʜXRFI4(eP##ݶM`xVk# >=8˹t`dQA 8`4zǶW+§ @Rĉ7G k1aELwn'qSOX W"hѼ܃ׯɴI*'k+r37dB  Wz4<\@'a iY&iZȪ2􄒝 rJSΪb7dױRh?%,CACے] t+}U4e'˃lzbXSm%̫Y>(K0>ꋓ/ ]]V% |Cp-\B8}, `hHD(Db[k_P]B-/~j9GtYp[7\ƫ ܷ@{ |xvUwY !KB̼ŁVz_oVpr0wOqiu"A[Gء10OSu=LK@rIV7[ڴi]#kûI `~^'OX.!  r`'ͧv a;lbat5m/֘i51=9O0v+"$/ݜTDmx>x4 j(>bܸcZ98>a_WCPS˺+'j 4_%,pq,@IUud:7r $ϮYӷ:m΋'ƀP|FӞ.Խ\_PKɷDPKta]Edist/css/bootstrap.min.cssUX g_fd_QGIsݬqP5M~9?kR5ȆI0͚$/.&&/s wlG,I۟3UY=3.b6yfǏ&;&selc9mY՚X*;6d}bYKFΥ<7ζͦɛ"xٔhS6MyXO_)3K!ӌ,%Yk;ʲZdaC^c-hQ0'*H*Ҿn5S-v}fDOSY\8*cl`c5ۂ瘚EsF}QE^7OBJ늩λ g(?HRl庯. 4?>ęhxS:zb=BsS^%S_6)SlX'3dڰ͆/8Fusf 8 S#' C>*%fLl7RdtEi;NH5V|B~je!(bs.k&C|h^'S0l-?nU<9c:ͣQ~ݚ‹jf\豭Bdr{G/4cZI^ʕ Fg_A'l#afL.5&>hF)?B TJh'HW])A]IA 6 ͶeAߢsF+)[mb"gg`ru/uY 6ESJLuW=zW~.@|ܔɩkʝ/p-I9J^d0^QW̙m*~,͓b3z5"k,éVYOe^?D(HT#g׆-̈Ce9OpOOd^gZOXqB,Nywr}h-SfUy:@]Qwd5r7 9`K:<x~ei,?(Oa9>\|=s2_b4*F]x6`UH(c.Mwy˿p i1ütTew?Լi@:g7\,Uo3]#Koe|$=uw|K¹c 8ur^5$E l၍J/s8]^H0~&3!,{ Rr2Y#g( 9!Nra! fPWd[>PH"URؗ11̕F!y 1+  :J ϓ9 N"9T#sLI8W(Ny iZ!MccpRSW@|4u iW$MgxKO{Kѧ8Ќ.(`.VzIAO$+U,t\ -k4fc EiJhSl>ԕp!8Ăf3W XD*lj>Qlv4 9 >% 3;Җ'h-KMpxa6|czrmsȩpxHN#4H0芤 L+,i0X\SG~_Y\gigm-o0W>y$$W -CU?6pL3ζmI=Y>`2\Y#!kIh;÷fa`Wl҃C+ C9; ?GҮ "n,;ܒ`؅{xCl^ıx0sP?Vc8 M{H)rV3 99ʼ;^gJ/"9$m 5Fd,\1r cdTf☍{ۢ$1:`k1?>DErѢ5+)cJA9@Ӓ:0Smy8dC|h V=F'8ct.Pe,@vӉ aK؏.ĹuH@飿ѓ-TؗUwEG)e!aflvRtgJ\@AV1:TW>d\t -QQ|tഡr}. )tʎ;4I I]^Л1:mTy&F.JFgiR7%)9e9)t Υ'ct QGjG3'st:y;FG =duI@6_s' c$'n&,R0|MZTܐGxct7 uߌ;r'0\~ :y(gkx }Gρct>GAcd[ҫ>Hc1:萂c{E{C8 bs:cœʠ'tpTK|>.ߖ¢'tH贂Y4oISM >87EVfU sO@tH֡lm!m:zK`:;>%m=y`E n2Ik#ÇG]6?}Xց Ha֕8hHfhrcxn4!J0cJDb}LՀD0{>+dlS7١Frȝ9<_ 귺!t 2u5*WlX5`<*3<'TG]y;^7fܺGգ#"ɖkph"[vl.l̈́5QԏC<z`E#Z %^N+EKR2L}^*qqmUqru2fkoKh?M 8 o \% Fݻ-[׫w/񉻮H3Z&فC6F 򾄴n4RƴZYUT WE X~dq݅A"MzP|?T(D MqrC m=-SkuMJuS;rTݲ .T7Wnf>lUsM۴/㇝nkP|}!YӍn*|lM㳭JVl[:l:ή3L-:6 @57}tegT %t}d@3Js<8D[f\ T2 `&+$>G>h6۬6wΎ<+^VY ^Gٹ4'1eK@Km@%TGq-ܫYƐ(6Uů\xOEN{6D i9i3L ޳J61-r0-f"-WUI#q/b͒J^Y:u=~74ikOyW{Yq"NnAr1ΏR \Uu8rMvl—꿖8~xpZ.`|MҎr2e7Mv3H쇚vĹt N=Xg [pM{CrhmD{!3/yʦXm`^緟5浺\[9USqv%2p&&}c&puV<ެV6#C3%50Ab<2P0tKcRs8 V ` 4Ol1&b+yjŁ/%b:Y&nb&nbnjnjfnffnfnnnnnananini ܃{0pneVneVn[FǖӱeulaPTX\V0c+xB"WVVVrV6Gb`{q-96Vh֮:`TbA[m+usU6)ETUNmmiaS҆UcUE2Q Y)NQ*H + >W$LA|S1)ל &WkSS@\skƲ& K4J`< Q0Tey@ `&r`S 04kFiV @~5Rp04!Ac]9PN   $)9p!R r@BUSre$Z>r!Xƺ,)nu,``q3r9,ht`#ǩ 9>cFs$h8F9C 9V2r*l Hi銰a#!<#+FNC9×535A#g FNC`#˃FNFN9 .9Îc]Ft9e,hY.#g! 9 e,d#goȵeͺݎ RMۍ/؂}ؖzVNb+'rl8A+r|qg\qb+ǹr|!+BVT [9 Y9]r"l4gtEia+grrr&h DiltyiA+A+gr޳r.+@ X9 e,d+gr2`,@mr۞Sۓh{lOy=gTڂ3Yy͜,fN4 9?h8q*f&h 9θfs?hPCfՅ̜ 96s3s"l4Di銰a3!<3+f%d4oD iLMA3A3fN`3˃fΰ#`tgXE ]fv9 0sY.3g!ft9 e,dY.3n,gT*^[7k2 |T /ښGl9M.ᇲ͓HTO&;Sɡ" Lo mC8b IӔ;&Nj"'$%zW: Edn]ekiϞ= i:B$Q@G~[,u:+=mޑh6T%s3'Lz~:7?g:pδ'QF [*2<*?f/m(UYP"J.VӖ'`|q]s_,G2ex wVHF~V+B\cEX% `S:N(lD c#Ԑ'IJHl@{@9 `jQ䲲5DMW=U@Q**RJ˗BTy)檫>AqU ө4.S;p#vA DS)BI<\]br{f>Ǡ+?E|U1NS_XY^9V_& V.5 1rÜL0(AtsDo4?$ϙ#iۅ_ޖ?/+AX"}c`A4C %k׆5br]2zL^lb^~x2/t:7IZ,lL^3Kyu=F.fxׇyo|.8t+U{ڦYЁ;eU:cɿQmStAl8 4M14CWNՁ4 ~#@ ZHIr=-d!,!xvȚ-<])>0\W̭x놓bJ noEF)̍} u6cbSVZ"弱ORyoѦ\*.5.0q)qon1Il kD{\2eoo-+T*/PFy`}u?,`LNn{V I֞?k4U {QJ%ESqq'b>Z6tN,@V|s s"HFK=ЍP ޘx$N2;fӈQ8`d? 8جdCS0mZKj0,sw PӃ4)ݕlRߵ { S]XhUnG$SUwVhjuwIJj]' Vk4H;<-mإ>D볨zc]~b/n>mRufpytyNbG-h |7ʛ:QyQjU뫼TiD";` /j^}$&{oVPc9aR&YpqVŪTCz%;V.> 4JfԹ "4W AϰܚA1xa}f&;tf AkC聡-!#M]ZѱE,gLa KG6 < Qo( Ï /HpN:nАCs^Uv &PXzYمP IBO2.)0h!hs Q>gMyLot+ps6.PE_pTuO^gu+252w]AId{Oo-*@Mw}t=};&cbAӽC^7vKz̷>&l` Tg+asVlYzMWWekdW=潹N!#x{އF{}lQj{;}Xy1+}gYxÇj~cb&To{u:otMblחw2wZsZfp`~ʔ0IO1RuvL\J1)Mə큸e(x6 ' wedp@E@_Suϛ^grw1a>\_髑3X& y9}EaugO~|lS r#Cûp,<ݗ陓ә7sf4HYDDI䕸iWi8!~!/5]~7#T {79WϛC|ͥ 2P97MynLf5-.Jq}}ǞTJ=^- O&7yad2' ۻ"6 򡔟"cJ;1wI?eOy<5UޝS=O2DwՌ8 7򱞘cU\&bCxE `/(t ڌD]lYsgSYg:*biڂdz j>z rQ9pF$ qW" +Ic_)y,3grƠp.|uҧO j<ֵ$#Nm葭Dem["Кtp`+\n%^:ETO ۣĻ-3)*O9ZOAJbչܝI\q{ң<}2?A PO_d$7qA20I9OUx0^|[ukg>CQ.)+e $ =X7:@slv̨V"D"V. {yD"Z1Z` uO>U| QPHD~QoFۉCMgg. !&l =U `cZCsGKv ǟ b{Bu-^/2 jY T#\-KᮟjՋ⨣>1!.%P#^BO' Tq*[h9`L9ݓyIXl[,$ev]c$(C]:C9[_d7dz|poE13,v{h17ՋJ_=DJ\:WXj֢ɯfUHmn7w Xדg|n|1z|g{ yͪ]ROKTI̭Aeo3MS}3ٽOi$JCIQ$̆yS;:UmߵeKR Vڄ`qREM MBeSI`vTjm L,rq9`!$ҕ,@Wʧ-!=-!FlYSOauAp"`L/e5P=-D[.}uW6B}}/i&0pNomwsB{yO`xnIj{@e1 D8K[Cx$@"uXG|V#G\]QF ^;kͧo|^O |Zb=SN(qOm;* Ë$ALIZ)"'<ħ V"ԇjZ'!HS= O(6OEޕ_=%9ݵr"AiT j(8 0?!Hlnp3z!-|F9x:=^`\`{FE5(39Z%n4PޤPJG %J@:G+HhMBqZ{/̉o+ H$lG}}iH X{ɈC*ϪM&:bAmSgL$vQXȚIsŚ̽X/&d>.e >bGXFLhL$NC{k+ ߂.R ]~8U0ccP^O[ %[8l0742u;LܮW[iok51Kfi)fJf 9eCv`%69eVW^I| L&zr'֌v9OO>5<@un kK/z84&n/]j!G[1F8 3)<YՑUx"D [>rsOV3 USФB~"<؟̻_nLtkhgH~dS=rƳ~ٓ}6z[csKzVPW-k9kULo1.&jh[ۆ)ZQ0Ό?c4~]4MI36Nq0K\ߥ~Ɔ8 1gl:M7;sTj8q ײ]YS3zKwy,vm2ZBA` >6coN|Á'^GkXCD]7x=PܚH"yq\*C!,".pn4l*"ܠVgM(6~󇇇`s wӴA=0}QNwe7orޗՖ^kCG{ʫH~KKgy"C)mK?>ކR`걾QJy/uxmIGkMeL&?ܔV)LtPҰ c0txh/7E%uhC Cehr SnAkԍ =/^8ʼn>bVUnB6 ߴЅd̖n{%֬.M+/y]{=ȻWXաF]k a 8L~=h-tu m*dmac>=g0G^Ln}7.&J&<[$s')ac/rd ўU1@ՑT 7tuĹGTRQ vy$:A ^KIuACK\X"+ lRMi*f D-%TQq@3K%HgSDƼ+Fk˽֭ u+sO):Awx5"NYDGVDxjB<悑zkB}ʷ 8:>cyޥWZ m Oj9I-m4cFB][¸K<'7uS_l*jsт&{ȏʩM0`?_~|q@PeLH&q ?+1)4i]ua6괺VYvWh(3~d+k&)ER2q1͞@W =c%:W| 'ѤJ>* zm. Fo ρN{A=R`KJ˝Nm8mK()2yn L DT](NCًM6 sCĈ!;tUQ4tCƢ&dUSхb8`{ic"SKމuvex#p y[/$aBZcdQeMjQ:p89MKr>8  C8L"󞆂.1OI撹ގVbf,XնDJwp 7kuYS}` ~'Imon$])4z^ڦLcG՝F8̉w/=oA4z"]wZWM{SCRb~⭃Bcβp+@m+GGr}۷bbx$0R\Iv6MXb.@97MMCGtbT BLRscII,a9 /M#/ ú6ms/G/7$l Y\c=v?ZW -g'h%|BEe1@lM7 ? 1Q,*#MJ{q煸ny:EҭʏA5@G$ S9jkxt*$7.pOq=|ɳ{$0G|^CL|&ј {wQFUVc-BznqO"F*i7^.Z-M:ބvj7hͽI9G)cے9ޓ|Pt.c:wjq0pG* KCOLjx깊݉s^,8W ~N;G#Z!}IU>IE>I5{'[ړJ2N 8&K?Xw<_/_:>[o$Ayбm=ջ>imi7}-@\iA~!~@~ŭ޻M|sGGj~ޞG.W} P,p@08ݷIBG"O6S}_m̧r3uٮ4Q $"]jfLwDH}PnI+F".u84ǁ ]x0ߪ=P"vka\wC!M!^ߕ^(FFw\VDS)D%&90Fߗ. /֊@Li׽w Wa_gN|}ґ)M/0$ [3#{N3%?kA%R]}6%_eFWjߒUd9 D3ю@dimqw꼥xZp᛼W8 {`|ьwn#lqQ x!*T#-pz*"MmHޏ4l4mxWkte3,qaS; W58 [\Y; HW;=;g( 0eQmot-Sx'7bSt9Q\;iC%>Y9d"He:uՂssuu )JоZM텦{%ᣦ,&?u#%I)OyoO/gю;y%Yve$Vnuب,X vaC㫛O~G2L@^TU=JLN6qMK#]lp j$h(@_GG//w`<#7@bL܄ABcqzFTtwZwuΣܡ: ^gaW"(7ɩ<UCGޮgv=`uY.>2C{޳ڷ"$W;OT\`.pȾN(#1 '1ZivrDmN0.kpd[-C,5ksAx dא:/3Ln'Re^}cWHLlJ&^%7Q[ߡUQ[y>zJd!O_ʭG+9HgZQ; F.L+!HģM$1"jT NhQV[n%I~ KzHQ?Ya:ԠսcGI6aKdMh':C_MSԑQXsQ?:2 4}$F z|[蘿_h;h]=垵.H̎;#otSVէLx.y/^'(C--aT/#^uQY4Aj#Z~mʫOĈirݗB/,ġx֎DwQN+U/kBOp4Rzgㆠ*[?sʺ5n#׋~ệXAvLAEl+Y5SH2Y R1y0NaJĘK/P1@=.` ߯\=z:zy]9&`x$$bXdDʓ-sc4bHTK]P!M?%eth57E 0Pm:O#kyP$0=P^btEG* >)/9Yş=c*Yx ]~8U+x> y])/g*XU\;mFB |^A Æ̷4~@# NvLQQ|<,S}`4٧|IzXG_>ؿxԢBE>%)°(M-!F0b&N`X _Ų bEŵu#@D{(& &8$3C'D,$1"?RyjSzJ zua9$ JQK^w\n~c+ҞBq]XlBu nzwVw},AJ`% = 㺰g(a].K R U>.hyPJڍC-J0OQa:U*?6 4ilSn:8k ˵54R*$gN)DJZ5PKs84.I[PK ^]E dist/fonts/UX beV'Vc&rw<!9:ܑH b^y^R}%иg!Nޟ!]o\6ci-3<=>N>cZUfz&XqE1z`Hs^W`ETEyoa[ƶ~!yHTRɽ h}s1{[nu& vz*)?:`nciC;6T?pEI.r]:3^۬,N+f]iGO() 񔡼-ӈ>cY [S?oLI1PG'L QLo0Eĉ Qjֳ=΋A`y1V*!xH#"_O$`Qg@G-}7 G0W٦#|>K&Ky& _~2!GN 񎼀mVt,Y`B֡J"Yl^1V*0*P5"8P?#.hO! ׶SOP66(j)pQD%Q3pp'~bԄ>nWĦ(D& Ѥ=Cl!S̈́?ߐH@*v;% vmP?ޔ8m}c56S. rAbeH. H隧]6Fw >_rY37SO<'7l0R*Wx%QQ 5HQ'p`*^kD}E"QpҩqmFs?%Y4v1g4dQ?3瘊5SET+t^,u8dxyDޑfer6Kp7padkqGjC&5T4ҹ7^G(<{{{ 1rq9G)d} Dj^)A,[)mb[;Pbuh o #`Q\ބίU=$)sOUpޛ׮0:w!nu_|NǮ@ҕ A`N$\A򵌕y`rJH%gj5UnI8z8qXEq@:xb |u?B;uu[X[~`qmJ],{==)r=OHѺMɕ+wN8 &/jNU\@BPt5C1>[HB" knH`rEm-R3:)n 6dgУ ?p<6\B%T:ݰٜ1&f2]䑽7' %Jw}L̨)覑*jG1pSUG&{LhD0ti"C\j_hUqy~ȸCN.DKåqi㎻?8*](QvK4C/!SQT ҳ&3Cs3=)NrK3^]Cjdžt8;,h龮,ί&:Eun\RBIEgg1f <7L5لVo^`µˆ9%͈%? <{b s"*iȖ沿.2Gsw i#Q ́:rndx&F0`RƟ>Xy?AW_5 $ Y*,ͽ4x^ dL/kc 4 ڽU R6EK[Y?I@ xL7?wGQro{JG}O> &V`bl:_dX,rLі*=DaS@J,ZsIKm%=dgdUVI g'2quG.8rE|FrNHNTH*B{Ѝ%ي X}hJ.4*lJs߾&i›HD sh'#!P{txt Toi@j0rɽ1sx+6dQ͏?ZZWg5սFj`#UY[FQkPVZIH $S>\2+2b~ȅ(O=Rf{F AC|lTvp^ύ˭#RJE7YJ@*-jsH'V')frAܸ)Da 5VYptPBJ`}:T9.PV37 `X_z֢x.q+b}2Eg~Su#YS2Nq.3 ڄN|7ݱ-s-N"چeO_‚>F.7X ti+pIj [/áw%Qh ^o~~& xxm )M"s## yТ7 ЍJu^ܷ=8 woZHJBCR@큦p81.k՚5^=YK!t+#pN<`7F.]XCw<G$.0jƕYc>mH# Ņ\HlLΦx%.{lesOQdm=҇8mji=tr_H0GmƗdw9]+aQaAA񝯮Νͭxaskq;gC}E0 R$AOk!Q,;.:8 o։(Қ jb,p1d,}r1Ifl>kƩ= 8mEųIŪ>PKBKoZfkZ_v"%7+HbAgvȨ'k0 ]lY!V0`Ɍt4pԙE$:4i(1!*C"Q9#_EP|Gͽj8>$׶ˉc*Z?zm荸̡H䴟WH4e5S!.e }`_$r` [ќ`ce@$xs` ~3#zve׏p(`xsZֺm]z ҂M 7}.@`]gGj&'}*O]?^T% ٱsT4^_#3vƈJ1IWJA B?>BhD)`V?w˩狌c\9P} ںpiҨVPʖœz8gjyB((F?C0XbqӺ׆iu0*K++ 6oW95jScUұaIvV <)) H@]kV]QQ`iFoE%1H 9z>SG*0cqx!Q+X+&$'pTfxqG̸GZ_ QH#B}#تaz7I_~|e-7?jjgQ1j1](F"͑F@6}W0 ;$z^x: VaQ,QM.^|}GHC#HtN@|R.ϭ$MF(Բ@׵-BA9rɀ-4:`AH)WļbN}ȵyY:J?(ѳwU:- E*\nU1?@+oD{ O`)6Mm,(r!fO# u`R|d@"Mۘ Y&Pp^K͊Nz f~ט#?L*>;**EW+Be@U0'-)sh%ilA;P8.(S^\yfѝS ZzM#ϜM>FIasڰJ }QZ5~h0]IWv]f7;%]̐` PK-OH6vjazعrWJ.@Ά-6#Ja"^ !F}̞!tDQ?vs }<{w&S6n1ʍ=LAR(ƌ0'KGF]LȃP/0'n z>[7]T|GB øBFfDE%L9JFKYDN\'㍒q4>y<CsBX]u8W@؊ܬMC ]p:Tkl9s /o4=bT_Oh ˱Im %G:G9)>R`BJ^.I"^7Rk̆{v5MWND&J/& ٴ ?|ݡ&y揗[Vtc4_5- g]ph˅ k|5;,\T,ՍṆpZy' AKLt췲ãϺW%dF[ 6j@ SY@< h "YT]N&=!߂IJX4LX QT `#|:}c_6;b7܂~% b U/Gi8&Kc7֐SՖ5-Dw(-v#7b.flYQ\qWf?Q:#r0el kkhc0w>bC#Jg zspQqyE9?<e_Pė|')c9b$Rs_5JF ̂Cqi㫰%-͓cJ0/ϒ{2zcc 0xbr-H'yI.΍evk粮5hL:~oDfiaf@aj^EfVWjU=|ُ$O(4tbRnOPI1rp&'k]'72SuMN\#(d4NNH8 ]y|f6s : s8 ~%3V URjwD7庠M`Q}d Ђً9ko`UxNğC_D\i L =FJQ~]G8NM&0ӕ̧n[8/^B(ZϔTاiw[F ' [/MGnkiRW3dt(B†hB wą@' dS'cOzR]+faβR~qfQMET`1>ϡ}z b{uQ;٪#]B4䞌v*ӸO]nN$d38͖wM;&= 24yx*uI[2&OQm*çzZ boFMI<)t)5CJKȫ%fSbf5Tӡ}a#8@1CqЏaBƭki#䎔LPl [D(F_'QW.t1 *pԷmD%q/0 )|}bjKv붞xnDϫk쑇fL2^ʉI^g*8uuvxTyT0q|7{i)zA?<4Ka%?ߔWJchQQ~r򉕳RXO!9S +j1'W aTG 갩 8y &Ltf!iVcj;Zvl1o<Ʀ%Wn-v7";9H*L=IP\TŮNy+KKsT;9r)|r_S<`VI[BtC ~ pIߧh7y2g҂ [~=fW/wzQ!ܼ sV 8t[%II (b s#K7ؤh.:5ʢwW3E(^:Q2eKJ爪~UԐ`7ʵ Zi-ߚJ첋IM9S) f-%VUZ5//rp=ż_)]A(i? и#ԮKj|CB -{u|q;*H ZqD 0q YrLQ!+s#y>C5V;``0u f޹ddY1X MeG׷=дo +< /\02>bA;ND~{ς?D, D±CEuVzW[͊(hfLSVUWz>%If>Uп[czKΈG$GÎ.ZΞ}kCjJOoy 5?06N`W]\+'*rH|E=A]T ˋ?NyfbR_Ӂk am:ffWîd)T;^ Mo4kw+J؊p ڦFהD\$Gnd,A^,jU\GZ1`bEpK(5{[\4mMj}c݀/0]:lkXDAk{I0ae¿FLN1u+&qI-e Ed@mܷ[qnޒ .X-C&:' L#Ɗ>&-t2)idaT>-t߇N<*GgH'udR/VsNYp[M+w^&E1nP|+G'3Q zW751؆s^9 :8fj单][ul؍L!luf_;`? A6wcOvID*ƣ5p3ãg(N -qөHD;wg8qi9uW0Y9/HygrݚŮO ?T/L(j16aaևyyĭYⴜaGpEn6$02=VĨް޶%ghpR5 *N7#hҀ!+8V}A&+ӟ6ЏzD0A۪X"(eZ/bm)kъ:Hi:h"۸L՚+j/hDծ^AS ~Tx$4KOfL/ FV}Q:wk: /?o\{UT ~ŕ(YoaЇ6[vH; m4:h9D+9Ԍk0$,"QLLWŎ3.NLKDܙ98K]IBZ8SY !sLjXΓv Np%wU-> J+H B%?{%dfKeygQj3p4깶 wA|bd v0!Gi$>Y=Ӻ WinlÎ pHΪ07+Y]9Q<< p"˧3QMF"v =х@m9( |_Y X~"M1A N9IB/0Õ/ڶproCTg E+8tFbL5;fV]ᥫ GDn=BT'R3;eir:mu4ԌxBݱ (#6۬ԣQE箛yKˌgHaxd)ZxM 9)[;'QCEh ٗ4I,耭C6v~7JOZsE>a~!a=:M-vS$T"qQ va+KGY' = Oe-C%n3mṾֳ]:l4x&*TW>"W?4Re"h@7MTZ}.f ˣ2yd3kMϼC3$5SE,l ūϲۄIS¥?r+sf:eۆH1s1S!?+e4+bs ˔^` (g#PT tVG{(1&1%U.J71m\ۖЈ;IH~*&A`",!RƝxXW䔾j<\iH,P0!=,yok$r`u~ @bGj%ފ,vg[Ryk p RgJZwi{=/Y s*!MDpW.x՚ Z N\oBVAK30gtV ϕSLXW05sn憗$/ʎB~<y֎籺,9s;4Qvܗ 50Bt nDϚēԃ-a::Z< k&`/ݻ "&1怊wͦ9 f BLkB7Q{#uf`oxeiGQM9qoeŀiX*)b+on K\=ȭrqNL!)(> F ]@Ba#(ED0NnTnft7܍G7^><~rSa*.#x2 w=8pJQ黣f;~s8s.BۛE{wZn;#N"|5S>8nC) 5Y`Ӑir>UJ/iO˓H4?39k8WLN^{D y0Ұ}09:q22޸V.nV~8wQ1x3L"<wmʘlR9Ϙ£A,EzL"B20 [^L,7`k9B;F]rAwGJe -L2xB ZYF%?_"͓<~NTKx 0[XW$`K1 $PyByY*YjS t^Pi?)mu 6Pd"y_jV>/uI*]0` L=$_ca%>v0- ԷHL߄սD!bS (nf5]K]Yϟ|uZD<ժJ5zڛ*Syk/oݍ6D*ouߡ:e%3 Z lAZKX$Ec kQ|"+3؛oWu=l?g& uTD TQNV HE3\~pTRek&BUGM9՗0U(T#oރ% &=4F*}|$3FaWkV\ޒv7ZZQn@0-J;O?(+Pw&7("Ef&LdL?`m+R-?h|ȋ%O՝P 䵞G`DmğXۮq":I ~{LLcIN<ԈmR$B]hcsD#uj_r<):{@n %=wxR2]2m>\Bipwo|t?B\1?ywa,9yNSTdu@0rr`S =)׌7"^6]Oz7cU̡n9nd@C̥}d\.ԭNxh3\x>O R:%X0us.,hbgBFXvbz \פ+@1s`K*}?tꟛٚ7QJ-&[TwzD޵ 7+i S+{\=靻p&|oV&/ʉ'*ĸgu~BMBOy@Gߧ`n J s5Bܛ87Ji@v}u\&r<\XX2׮o' 7Xv/.Y@~uaK5m= ={h|/#^H1d)&II]u20.PUVYzsF;&np*Z8PN`D @?#x"pLB^{Z-ED]v(М` 1 Cm+KJ] 5]Mi h0jxyۛHy:TAuac)ysoܘaSG)$ ux" mTqvN@[Uj43Y n1i {N/Tj5fc絋X̽99@06| = R < vlb28o Q@F;D:l,ecd-Bl mXLL=#+Y$}n£{)pBS 4Jw.dDP#|%Jp+TUY46?qj,sJT`Jb L(7 qyK&M~ ]g7WE8Erty.GxB5Cfr!h{b#zpZِzNd,gMY})$O;- yq}fq7ֵ HS1R&~ZO(]4fFNHPg6y1ÕK*R[A1APȔS$, A'bCp P4>Y!Ov^\s(rЊۨn p) pi5UYZDtY:1Qq7/Rk @"B?Аox4 s(J(qoc^EcѢ4,ГmXh(b imE e&5C1yvI Z&yeQ`ovYIH޸XB{Π 0\#A4$8ЃΨ ZhN}hة%P}@ ?5d19.PŠjcoWHW G!N4K)f>-tnY4*cN aևD' &_0M& ^ژb-9?enב޷ 򂇥E,d!E|KOP :Yj٭O{ Cfm!X w2\~h&;ꍝgPҲxz_9uDy"H ey|ʠ'[qr|#Rr_kR=y8X]8w=Q-^f6,JEC0 G/Iт04Āc9]"9ÄP*R#LɻXz438/߹zeF$1_IVF2QX).TcfgWUv!! 6B"&Şgt9 hdEpj-ہʁ+~^FsR%a4/}0 Q'`EnɸٕtձW}9 _2PS0Ԟ!%RpB q <$ "ъm|BpZ*dğ_~/` %7y+M"fflnYl SyaU乒+NPZ@_ہ;DTYG:ID"i +9IL{Ћ>AD4EEq WJeE|96pX"HMI'$|K'FqB?Yf"%0q?F=O*æ:Cx*hXԠ~UČ>PKqOoOPKv[E+dist/fonts/glyphicons-halflings-regular.svgUX ?O?vx5yo߼k?WëӺ?y?O?i 7ҙ1_57е ]yNӄޯͯ˿ ??:w~?_|>ӻǟ~/Ͽq|yLZ:û߽2Ck~Dz Bj}vJړ/[3M|,C=Pd7ȿx3ȿYyD}H7yli6DÏWgt'ů;9#Ÿl+|7]<V6`͍A{#{w<3C)\ļ) .rG"tL:\y+g oKu >M''~R72wzOqk1h2A:oF+2 lY}ă$E%2nňӪGIZL@tdlNR^0NS&z^,i: Łc. x0HUV#ݤ)[Up DT*K%T_?!P xb$A3!/^w̲2S "sX쌹v^>ZnSb , @dML P hء2oc<o HD+Y=  y1^@9(O8gGč89^o{O}N DA3 j}?}ICUxH_ B{I2 9v~@cp\ʝ qGpd B$JT+#[ GvrɟQ~3`)gWvDz2v| n*wv\v~|GpQ\0bbQH޸5Afpk L}L B]4({+ۍY2Lo֚2c`p<8 x; 2{ GwjC mq&9J_8ex@3f2#_km0Yᛌ%ljg_:q9mnv}mWEvP' 4k:L_+7VS eEgۅ)^tgHkw(!a?ċ)\_|}]C󹌪10KY-,{FNRF @ge6ֱ_Gck<֗٨ì'I尢H[bw5k^k+m4^o5^?V u չ{^ h )3j#l՘)U=+*D o6,^? wb1i6!OUfO p-Fq`ـ#r`ܽ7n q؆D"b$r4jz_)<j_LK;#@> ye`R,|Jyv61ǥ1ǥ**T>G|QoBcCg[ڣxg#Nr^7b"mC IuV(t_kU;PD:ǭ5BBaceU<7i#53 g{L$;w9NՍ {n"$vn_ .oW2'P! KbrR xq:O=(ʹYl!Ƙ~ ,jE8ZqL֖IJ1HCRHW.8!/gcB 22z9{2,/64CC>7V -bKl>r Qi'H }7WBolTk\ j лx5D~7%U*FIƌX"`0\`|sJLY (Lwh88Aށ e1oq˟*| ʙVݸ3O'eyQQ=Ǽfߡݿ~i4^HiǣΦ޿9ݮnI57ͽ?(AaM0^ul;tF`v}q/ f^Q&+mlF[:武ªʪW>#X[ie#,*;B5#.$Wu+/܄0!~C~CdK Z_R9ב`::zAxwՇQGvYaOp%{wnGtdlV*UMڴsUNawF 91r4.Ҫ.󞿣FR.BTFeġ=kQ_aM"T( z jff{{cm1 Jc@ , 8x%;[:r̄  /Q*+O$v*6zT *тd}0fD"Pi%Aa#uZnTX0 \zU%[vF=O0lCdM*-!P֌uY= B,T=hLdF}*J 4[qht*) xQ琫P$ғA gSU+!uɈE#PYD 'lrTIķp Wo@W]ӠsB ?&\:eCZ\4rգ+/g^<H ;4Uz!%8"R4>)Cm`)f"D3bu$B/A ,[ZGHY(enI"ӻi!BOx*\,dCdz\p`>4 sn C=@C#EU]) *va1+u;r$ϕy቎|BaxMY/EX׀PT<+[OsTCȘχ%\6 T=[P!ҠrЅ5XܪU{SU=;<}*ScO'`lħ~?~1K܋A%hHMS]fxl߻`>u7Sb@wo`]sJǻC9tha Nx yCxH.Q7In^|} #_wK Ih?M$_E:557"7OAp 5x4g1'+"إIsTT/M)vj:f'NCj㭎+][+#:f͍7Fu_ ̣Q`̓6 x44CNfVyK=KYw3Cpk@7sd^wSp-44-}CG^d:S˔ #2SѨ`{r@[ 4ѰLݵ!B!<'ӬtF2 7Hނ.]2! q{Y17 uEգe[cQQ1,㖥N>i[~bMyMǑi""QUVmFL;60s:T$9h2`[dB `qф0tipV:otͦ4$[ ̕plfգ݉a^7UP=[gn99xx GneG. #l&0 ;07VV/5pcCЉ#u暘*xLcĕQRظHq0Ŋc4Ucqb5.S^Z:ȉh W^@n & 8n ;,6%faѕJY-60*:ef i˪QB {9=O[f":@Hg!G9xg9n[fpd%[܁Ĩ:Ѝ՛@6[?)D: *Gh k3< 2faa!>rq0?!ҎQ֖~UVH*)FVKC+tV]6qeBwy # OEZ e7]0c>D.G]g6k :HP E%wT~e6a^#Z 0EvێjSepe;oYꝣuEmaVh+Z︩j?T:@P۸;_ߛ鹤.p\=_EY829$c(w(WoTU(F:ᡗyomi.SW\L{ю١e6DaS[t5Bt/f_YeMHfHCgBb12vHg4Ϡ,hag .d"ڷMX zY5gv2e{ &"ġHTP7LMK zoͅ0J Ϛ<؁E2d0zVj菅O85N0iJΜ7xd^%|ptůC-qMK0^W 4E)A1I.2gɊF} "iЀLԘ2DpyI䪒kw+=uyX䴛QѼ % M+.Z [AzqX /k6FMlr.Yr]  Wb?PHJ5sʫ`L15cvU]q/  FH:slz].aZ7oM]tpتi6$@CyoV'SydL!Ê &XۓLB٪~Ym6ۓ.”Tt7Ɂ9hPe#5Dzеƻ ?Q7,7c靕xk B(Dȣp@c$&Z&Eޕ/hhٌo%=aaaaak!Fղ[^{D/!7NZf+7}>m#3?dqpdC f"+m̰J =0xl>`sІx\[B3p`vU>QmSh+"ET{a󣛘ZP:Ϩu5̚ӡqYI|u.Ue(o=<$u@+ Ѳ OTtObki95| hxvY,K+5pGCFzu[C7ƚ{5&a).-7g#otR ]eDɎf%Zs *&&top]0;et׏Aazk>`\&ψ4͔?DI$DTд"o|gl`4r ~ЮI"8딿ia' |]c@UMQ𱩂u* VDbާڲ`3b&^*ISDei5JTzQ+5&&1v"cMH"P9I/+w"\juLrQwwI(,c`녯 >s3FX$Ür,fk^j 4(fj~F8OzŋE9X/tHSs&h-h*)P@U%,x t쑽+(+Lrh/6U-p ( q FQ1xV*匕\=ybSj>ocO ^BJT>y`f6fag6>N 5A8U'@`@cXa>*Gz? ȏ boŽ޻~~ +S`,N ޗe0 @L> dLe L9- n !V2lРX!JY46'xXdA2W݆. `RZXi [MՆbEP /T dQHYFX_feor*SRClSy%"ITQƀk}M62ӉB9gx:!zADeXX2g|m\Y: 7x!z{顤`e vz&yU-tЗ˨սXȡr߫UK"Seayb» ^„&8B#8I5jv5}rK]) IJ'.XFK7+~ m;:/C ~j;+ߩH2Wz7AH8d;."dAK4+LݚsvpPQu_( 0 2ykf @2D6|bZo3dk~zjT!90B襂|r,;9XB] A[&M3xD⠤&pW z96^5f+9!psQ"zDЮ3!L%@uZ赯Bp8('Gk]C]R\qT`lP"Kb9щH2{&oO{[D#Oۄ$#f\!XX+5h&bѕkC\ )$˂jӄGWGDq*zM:]fSWM$9~Ӆ \ke KKsXMV4H&júctCHEǪ˞y>oy+%YjxQ=EKod[ʢLr2VͮW  |jv#@pxv7U]ֱp/l1Ozᛘ纼3L"qI>@\TwxP3%V!#u0l5kU5"-ёFȞq+ Wي5A%J8t B`Jr|iu`%r.㦗Q -v<9|ikM0¬Zʤ)r. j=5ŔN-:QN&ʤVHƝ=:y:&^Pn؁ 7 Uuf G*v&h3"Ô-Mӱ Y}9`h@ԀQF8:E HSM:P>qaNҬZjPr~X+z _ZYAV7@"ϛEKإB_Z.^^"B %eV3W舆&G`Pճ*RGlL5kUB> y.Dh2UuLXhdmĭ`3q&ˏ:U:nb=Xu:Q=f7y$Ndzi͠[Cn2ݍ4\OGqS0R/-]!aKqR&q#X\YuIDU>;[%2"^' F2UC pt.hq+tu5 T^@,,{??Sy/H FR^H2Qɣb#=-Q=n}gv.B;oq-pʉ \]dz" 9/w !<\}5{j~> Ss>*è@P5hoZ1H}n-L v[zۋO ,;NFpA[!A`Z ؃|.zѼiO<%Bg Ά*"fȕX#[sйznQ%0ل Q%Oɜ7|uYNs)7۬G>, kSw@1\Ց 5U*[j"} k/шZ/$Ҵ+ߍLǵV5s G jp?#i6(4P\Vk'4c g/`RX+"kL]N?=Çxn ݓW; YG~X^dr,I/g8%_,֌sb4P-~4*QCz"{^Z42ZD c1!+L{A-} "596x b2_ WCy4hHoֿ )y4q"[FYYYiJT,CV <G>13 p uff5.@# *ڇleZcO @YU V<3G>H rt1^*, LʹaĆNS`MQT`Xz bjv J4&Q@OjHbo^lH^GUe T0&-BBOaBb8ȤoDm t: h]MQj\) 2ya0@f7sUOğde$FyӠ-(lg1XCy)qx$x %%b܌ XiwçPP :&/y25?ۼ)lu"a5C|r(<+6QNc+sǻz5lijI/=NMSTG!znχz[oG eݘwg#JFLYG`8*ӅKNjNkiRvjcb3&S,Mf-H39ui%[J5b_BedlUbgZSi7ol%vA֐I1Fv8X.ɘ}3sCP1ݜ|&UGiɔgK)Oxƴ&MQ ӂ42 `FQNY jUwz2"ϫn4sW@89C|9!9"y7);I,cA}3EԳZà!E&Mݞl$zOUT6knTUu(G{-sj7d |D|%V!:љE<㒶VSݟ@}li.`,`d&V!F;sey6ʩ0sҦjZ|]CmZؕԀZ^aE#I'e2b%l~{?JŗՔ'+1N5 KY3ִشEˡ"NJ}'fT;vMᐭU#ز1Fz)L(]mPLy'Tug+s]nًF~ QgP 3+OAAU|h ӲE#6 ڰkL߽s_c=>K )EZ{|팱3Φ!MV=FZ-{S?Kh*M>X7auV9a BWe"n,O=0Z2C ^)@fA> |.)0;BPC8!l^{T<,):0A:ot>tR`=*9v%2-΅.M7hԒWs9! BN-H_ˆ{tꆡUS%IdH\Tp,P)@O0" i U,FhuwCu 橺:ubTz.0Цu7qSd}ݙ⬚ m~PV桑_`Odo0=Ծ]]͞7߹h]&8n:{P#uc>!s@:TBIP5axx([GS C"X쿙T~w:l-Ҹ^ПQ~+E$&bӋd-G}) I+TE\cL)JsĬB 55+[`njZ]ϰT M d9}i5hXK0/70#@Afx1 ,12&ɘ'|іgl̳څR!{_R+Qͳb)5Ժ#݌eΗ(M_bF0vYR/Sa`FeAPG=_gPLv2iRw{֠E0}f+,+i,> J "̂sLv((XT=N[ćՊZ| (*;՛t-i-A|F:mx"hy=FCܗ5Pja$t'.4_$d堅˒TfP@§NGZ'ֶTեeW]wo{B",ѳtL() 6nOn— M.z\˕M @{4e&꧝g+#g|>͍w*0]5*=#}T%{4K<`z˜F}hƵ][wQ=Ze}ӻ}a Xr7&Up†;FqQVQ4|'؍^QX連^T?ogFZXKS.k42-2CLuӘQmŪHwB+lȨ(*2A07eϮx өZ`DQ_.8HHjҜO?8s[7='f(B(+=U̗.9}#RCZNj>b` $ح?k s9Qǵ0=ogqtyMwO螣lsB45_wv`6ԝ.fq%7e&:u8qX7'1&2C} DR+D+g䒝$FF&A5N-Uk@L@ 0j-jxHҕJ=½34OG81N!] ?T#M &XY Y!=kcmU_ qF_rojAu¡NcBz0$-$*] ͨo^!TPĚ"|J 7j'&[qK X8~|6!ԀTOGx\YsIcfjK p;(UIHR>.~ճڧ5r>igpYSf(DK]:Ma92]xSeUug G"~ZPYըU8>ߟ(6sP֡+fs`^5g@`L8x4pq i]uܚoʖWѫ齥I}Z03GTz&ǜ61\2c8HpH%;!dnB+(1N`7pl#^f436$jnuWիW^U5Ca3sW-xKfRG͞3 CC;le&{C{7^ax៍_r㖫#L#wܬҕ3O@o`Up0\~(B sW60aFnҫ]:^a0 atu,O0} mt|a70 u~a1+7 pI_[6_=|:̏)~P6+|2ڄy>_IQz&FsBdb|@˖cj7@8c -tHf"ْфd2⮉1(t>i%#ʰrp|OqeFfJ1jL)Q G8+2r}NWdV2RxdGȦg<,V)YHllIK1-%s$ݍT:|+ߕzܞxGǬz 6!>g;szA$U(\{pGb5?3xa={XPnuIsφ7l~rmà-d: O .MZ/ l|k~:ge2/f9(/p"Ny j~|+S˚vh/1fd.#[+gDvgEȉYιܹh# i%JW,c?'K~/\M>X~3>mp/YmSeƁ fax$!ueU9C< ic왊p'>:"".=j B؛'Ց!ɘPGCXWV7gեUi0Ɍ1%=P9Fl8,qNkpנ5SQ"pꌊ? G}P`x+cH&"~)&Ĥ`%ՑtV"1=p:w.jeM~i}3{Ce7<+Lf{4Lpfx d:dES*cgdrH*dG ` $ѱcO C-{D-#v\qlDK`wtٓV_JZRˠvW3/|@s˻UK.e/Q ? ?GٟCȓJ1tG?"ذ i0kuڍ]35{~,>ee`|-zKi-^:mf?KE9g8K~lGUv},OLT'ߔk}ZKL wwz'ϙサdI^뷟x 㸓tƒ}+>.$f-L )ܟ+oݨ_L%3TNM L 4 )1A|荀2r,'*rCV6gdNTƬl9^[3#s"O"lAڏ|ebw5x2oGX'JVzت\ʑʾix*b/FDS[;6J mb>ΗI0J$x?7{A~q%(KA8:v:7ڀf&3Ȕz9@IȽ4v:?zak/Fq ZSE-FCH\$BFcI&r>\ 2}vTg5Kk/ s2˘s˙[@ޢR{IP(d[sH쫡ݖ)yh7Tg:#Hטj`9wW^\džo*fPX!hh!m)22;kN{?}F^t/y6| ztGN{.74pziy {**?f`ct6nO_K_Edb|3:T`rHT|O+Y\9c$\L*o |Olkį RP 99XR}՜$hfYE5ꛨY?A&VOծ8>3b;W^pK FuE?Cf9 &@KB$PcNcNE `䬔,N`%>FVhp}0,ˁ(0"qM]biNWu=neg]3+wngGMfH>RI؍lFRz#aWJǒ~-o]֮K6>}vF}=ڦ+tV=圯}@O.t3gEVg{ҧs~8=[>km׷%fggdN|VVwzfgu>97tCndNe q 4Ŕ8ڟ֑")5gr.*bRam [Y^L8ʍTB1ЍvG4Rvk.[hNj:pQLNDf jNm`3gOim!NjmmiS2L6<ɚl&]l =0:=]lVd:=CT/ xF:]v{Y9uѭ{QC(9aeD&ƔXj! Nu4Qt"D$ ?kCl*ѳ=΁ưx`6"PȖ<.|G~qbS ^]E>c Ƣ䔉:adE4 m]AK`xʉDhv484D !{&={Ț>R"['aUO*@҃V`O<0:UZb -C6x FdacHs/~.=ynet|GU32%3>S} $;.*KUMTV$kIU'|^1􂠟 O-;sԏ"x]!`?PxQ t,côcŊ,)({8FpJE:᡺A(eɱߢsO=Ns͆X:jOrTs=o}kϹYU~<|wy1RsXVyC< L;ğ*j,aQl\_#&/]Wn s)&Nb% x*\vSsr ev̧4ixN{Pre'6*+:Eg4P9O4e.d6\Βly>/( |6LG'Pbܚq4Q 1rM;6)ܞ)rjHFTd MDC?A)Vuzf%nf[1# ً&WC NLJ]l|{0F}LvXt ]HҎNf!* 0[GSvSѝKF+?yOUx3bTڙ(sS?a|+%wǸc]NtTtʸJ1Ql$ErazR`tDW]vM^6ĨLWgdq4[~~?E9}/T:p[2?Ľ@gcĨNEIG<`U>+9.+Oދ1 C(Dmȃ!@̎/Fkw}v[qEdzzCڽ7TOz >ۣNATG 1AƞV'Q!RXnV8]kDO.W'o_㞊ク0h(a?.T}g$3Y`-brxql0FRSL)ղX5PJ%x,)z8< h;s9-E]}"A;VM"w^L[frȖϒ[Jlç$&e %^5zE;.fb5]@?@P̃3 |Kݩ}c]Eeqo3O=AT]O=9+[}~xGy.@Bȡ©Ka<%/!Hf$dlڣJr*S^3JL461 t )'Aw='*\uxq/`vc# ^*KAa)H(s]fC:@B2QUC+d![L,Fp'E5Au8R1Փ j< =.M2MU2rw6a&dgDl5F`.7n%g\m_4Y&L2 r)#D0WJa g{1d_w%(E:i5A+E(Gbӱgݠ(\D;)EhE&+r{Fth/0max hבC"0+Dz nY܎@GT!Iv pi[殺gIyê3n+ܸdņq]Nu.ӂ7(-A; RQNH%W15ultF̧j6[N$6S ?w75L)k%V \o\o7G$T5\:a.x 9Wl3E֢n်&ae ?9)Ѐh!-/II-&؝Kh\P X4A{㇟64LIFB!˭`R*HowC|b@| 5Qk56]ӡ 6Xc53 OeLHz})P>bWPQweQOKM*e>QgwTQjSM*'vP%~r}/]+{Aui?qoUv~O:9: IMj^F/28` F_F`,oG&;;v-&Zk<%/dlWydG?/#OǧN?]DpY̦ᷘ14gU4_P"[ss5[QG(#Ӳ4ڠmVmȐE~hY] [&O;~|!уgBjOh4P}Q M<3.ǃ`hGGs90[q_98>Kj`V,[IhH58 0Zɳ*i%np4E 'U6:M 4̽C:m4rZNb傹x i_tL 3˥5~nm :­v0ם[RPwqʮF7Lե\G1+D[ eI,:TqJv.($qQs~/i^H^txVwo}aү&G๥@N|/2.4 *a X`tu<DXK gXSqQ=ͧKwog/XݦƳjo~C?nm7_,nz-K[_k.uu]TAK:\+(*IrblْeyQ1n t s7y Cz4O>ͦ]3\3ҫ I ]23/-l=LNlxV>_ݽګuzx9߾y% vv.=f/_3Q+2%?RVU0uu \tb1CpX K/'4$p&(:yIeDb,U4Ѧ){*yJe3WHgwh+o*yw/Βk+V׏cI35`2r"lebYWA"Sف``臱.zN m^YEsa"{{&#D Ʌʃw5UG= hi$d6kf]:^2=֠2Ogt_QUQ/# 6_HFxl־ȭ!6^'OҜ7_Pո$3)9 71:C2E 4Qhw SƘ:GV,2y#F/#/#3K >2{&i|E=++eL}eܾ4vUAsT>g3GiF84Γu(`G<64zߠ1zz]gQd!n+њIIx  #a{%2*D/}MhQuP |V0e N|i0/$ ŸQ9Tƥ88A:QW(U4a=tzx\6!.{ \u*\T7. 3bx5D=hgt Xxq*KaUL@;Q<ܓSoܴRO~2+{#%*ͅcc&Xܜ&Ø)O qz8Uׂ;Rs|SpO!0$|`@NkKy~k+'`vSǒCUSaɡX;,5yx9ixWGj O}T0G=S*F?am-a6R?Ә;\մ"frL#1yxt/'/h_LgR sAKROCV[eh?1ƨ$ 4&1yP̣{1s!t!iBwk۠\Hfef>U30ioU_V3Młm}M/j|5Si:?'|Ĩ6ܥyۻH6e62xpw0t"غ]b$)o.d8 oS`;f0T>H8jm`YAjBF1RGjh A5PMG]TȚ|3x맒wHߎ/v+t4lG_.hp(]L33)Ppq6L2Cwfs.( :Y6jF%tVg @hM>Q#8\N86fKEv8T)β0Ŝvq\D 4<&ԹG:Y4LV 8~ZpO涿liZۍ|tOs4w(;mC`|cuykl\rDJԵj^Iә6}w.l]xƳV6:Rd lr_S^{wu-zQZ3ꝶ-u+&g{몬˨ rWE"/包3 (Gͩs^芅38\ *!."bSn;Lugs,[5_0mc-H֎[$S/4~jBtAy f]}.4YyiGt_JKO#ySzɚH2S>s>cLf3驩"PIgCrR\Dȃ7`2~3DؐG>E @},KC,P&ͧdΎ10ϯ-_–ͭ'xHvnvźf-Ͽ.vԸvy̼6b4Ķi}9[sg\h% sfÔ ^uE 8L Bf44LVD3 *wkFj1ɶU|WWZ6>lg[鶁n-Y,%׃-e-'es7Rgi 6`:- çs$;gW ,v?F}WKxʋR^{>nJԌ'4f%Iw[&6͙!ZRnKBM_'wK.~QykTf֯Gǖ&gz[uұ<4L_cѓԭA}_H謉4zkk /'pgy>E>>T`1V@AAZM01x9#'ucEFIƖR]Q-0܃!Ɍ!u'S+ "dH\c' nA(`Yz@/)pQm #{wo*O#70jps)JHS5'e19f} P#M}I,88{AhSrU\< <ք\ @@Qק:0yeՁ(cU/Nu&z¢llh{SK6}_޴$cy&]9g6㍭ih8Vn^qW,_q+5ooroyQYO6vCCwYH̛yo$soG=\pEv G}C'f0 0ԩ5'@Uk;Vh4(c]|~y0&l$"¼a$<>{, Жb_ I5:_ &P0zC PzJ2:>YBgTC;+^%SnM98^e !G8T&Khˑ(ψ,yq/U:Im25fN35ToɩL i&ͯBW5'=ivڣ - 5NFk(q-T/Ā@e5`a.+XY!HSt{\ *i10S -cXԆ䐟Q#w=N\4aʤަӺǙ=]PifNyF7ifUyzh5 ^lز4mجGI4u=$!&N=)f,)֘*aY^'ekg'3bq+]A>Ͻy`@֛; ;&^t,9vٲL%r[n?KZXf!| ̳ZQFs(SRnJ`^\GF-=ԔZ5w]J A/Іs*hBhxc .53m7ts\]ym; ŏ,/3f8 .!Hgȼ%7"Nl [(/<7 9(9\._iO tQߢ_ y)pC^T>"GO?zd#stAˋ1ir!\3Dw#@\=WV_]l,(LSxYj;N|K)߮KeӬqvp~ء;,G d(Rh=}W~O(wk_?ܑ Sc9̔W̚ ѽ7 w2ȓk鸄Әt6%M4Bۅhi|;M<)mjpmmIrm~pͤFaPD]tePDbpΨGYI{aVI%m5yKڮ'KFGF?`{)OYN{߾P_v_VG̫sK.[u1&FxjSA+on~v8ܤlq/{EE}Sfb_Fv :dj>I3‹WXNl .;wϯoxtl=$DU.cW=Q@K$I_է&;z5 [If0 E^r`\WĈj:D V ;;}r܋ )U(*@)oShԯH}јغ0 Q4Ԫ蔠U+T:C(R<1`ڱCժsF W_C߀1`%qDf{ZW5&5t;wGݜΉ<Ի[Ȣkbnt"A\MJwC'D Ù|?OqGIz=%Jҿ*wwАDw5XsEc_$myoYq:z14ZNO:u톰c45gZp,dV؜[`I$\;8?g!floxLd]z\[BLw,t3& wU?l$`7l{ [gIG&ghH3:II!t|Cm8Co"@-!e3{WXE佫 -VX9vKHy򠤧>!6v(tw)|\>mk]~w]ծ6xΚ}nL->xi-.\-g@GES>uЇ N ],f^**)_}yNӂi]lҬ4cKΒ+m$US"ʾYZyZO~XJ00YiYb?Hb[/?y0i9uRkrYD6ξ~mTpX%'*c]ԟ{EX5S)A]J `.Хt$q/O$h @jj;g~"0)ݡ}k4|'ҮXnlqr>GY;*hŁ4^`Ss0[6)$95"08+u pY oZz Ka,0_r%3GR"gʍr $m_w,ȟa٦5$.rVG.-V7kh?ٜh0?.7]ˬh\ZEq= )x@CwCm:'쵟mp3շdmԏ#d X5`z,}.x.Dթ~ uGaVTL)]8=`hlN/o Y^^/[;8o}720}[?m̛Oxf6.9#XsZϺ?w~ކO=|_kd00N}Lh==Bto0!:hxg=H; *7׹t0?xpp` ڙP09xɆsv O3hAŸ 2_s-pdpPÀ*Z@8xVzdjh;, ZA -p׹0E5jbԡe{/fK+4TзoM{AʦCtV:>$_}57`1׏RɎ|WC.2d~fmjPxgdO4m6m~ŕPS#)v8ty4?[j= = 騔=xDlZ l'ȬJZJc ={q s,rEl*F\ifS#~R3ZA􆃎+Iw v' jb=-dg NFSMk7dK^Z25ܦz-^,|N4#9lXr+ж'74.ګ.,^@K*UX@wþOr]8=X-I#dR:A)7~ު3@u?2jOkF`1$J Ơl+*,nYMWiJ]9ێ{&# Xq&>BZ5JWu4NzJA:` 4bj\hC_$ƲҨf.ywO;4UѪЋ9 ThPdx@,TKXR'Cl#<`ޟd,Q!_{_ìT;6?76oot1&[8vLG'C[D?mCX<Vr'u._gz阺}0sV:uC(UސEQ{ pvYZ}[ Ax(lB".Aw ň)Hc0^ (:oÑ [.qMwe@]o<$Ng43k#V|ef(-SY[{S O,F82x&S40'S4Ģklh]sZdlz(ti3cQx)oSE&G~]b^P/tQ@lMN@i`Vip5Y$Q^_(i@8f-c6QHmcI)A +&hր6Pͨ~xc? +O,qނ2 K}HܯXWrF5'@_pQrX1UEhFp!zRgfYVstXĩtŪ,0?V35ۏ{ɋ%djX\fR"XdtK9[&=o{BhVLRWfsƟSG?~{³ogc* S SFgEx/M ogW}IS~ʮzHoz0*Sk)nh7>?sO>%YZ cz&?;QNGp8(N{5l=x>dc 1 7$|Ͼ ;9@2`Om?#|W✚T9?FT{FדG8ǯr-S^fa.apCGiG;7ْ^/eVGOEh*M/:JFG "CƒwP:_vލbnW b2.(S4oA Qm`T V*fz%ǫJGAJ1=Lyﺛ"dsnlQIMnprJd:V:+jITVP"M5i<RTx[AQ>Qb}:=y7p[w%@;+MUn?#yCv|603C'HX %NL-ټV&_Iɬ*jW^Z:2r' jŨז·=Tjep簼ISO_Y4rȢŮQG5SWz!tD2Ъҩƫ ͮ9\VlTS>A(πUmu;ՋكQ~IkDhE.hߡ+z{T:y3ԼlzT*3NMv?Zj&3uQ޼nz fאW[f`-h6/1rO`gԫ)Wz|+NjqNak/fr!CW#-99W)f+ڻ>)|Wxk##q!-I})N=P"9[DFh$oSo2\=2ݒ$;-IDgunaae 1vxX[Tm'/SDNN3Y4wiÅnLF-|SS-Nb%s k 3[AWJ2Y.\z)ܚsa9<)Gt{]T6NkoQilbolLt*#z;NpߺC:_}s>H+4h+vCԛ֩R' "c%nrc{ 5B5TsP.)R?>fD՟xcZdc9.9ySrPu[o9:{L+'QZT@7-g(^X`{U!Fա '߇2T6 SbT?1 @[=$4l.\'00ѾO+ԹRVͯP)TTL ci*axaZ®mkRv"ʣSyCqH]t](  ]c`R}oO>-i`4՝F]M۶%O2,pdն5k’YCN橽R3ƣ !l[x?iSՃ'p3 YO)flbӤaKׇ±>ϻ@(Ґd| p`=  q|Bb 0e?j. 7&)'f!L j y 4/̏C~{hdAYL1IaE0O@_kt@(]hca?1Y"ʴqB.!M; 7^P]ZGxCGM)dQ;< fYZ5[v;-"9uy|S9JީH'5jF@'S6pgK SXeOk\Uq^nM7 Is $bxHBB-FH«Z>hjR@JRbNqph'v%7:Nߞݳ{cF)sMsb˼:{,ҕo,{8-{ۮrVH \PXjzy 8BhM "suDՌ6Ƿi_j2Og+g٣}YfJswyB7, TLgHA9af]j?btzX;O]=<p}f֧6sWbx?؞or]vͼv7:x zhtg|d¾1e뗜5m?{]ܢ$g.G䬡p&OR\uh1  -z}˳_*fsuO ra t̰Tw?S{ڣwݪ9a^}Q\.dDA~ 5z9Rer 5wYu7\ڳIkt7w U\XZbڒ;[ov:2SJuo\^LXml_IfToJ*e3+(I~׽&堅;IznYUَ51=wXi 8cw܍n QEuk>m_pq橄`X쨶çex.no&~Ky<_3.q翦]Gv!ݭ2ݣԋm>ҶIZ37X?;tZ`y iS~v.'G53$1Q߃wOwBHEZn9/oۤg~>dW'>܅8WȵsG|^ԞIHnH(enJ_'|imi{g,؞q.szf_֘MY<6=Ιӛs6ד[kwdwG叺ߛ]}12oGw l+0RxGUw薢}\-/V|_?dcΏƞ,)ҦJ_*,lrYSYWUT̬85q{nwB}prIeoO&z&xzRdRc.;3kS:<7󪆪'լQ嵾BR)Vu( <tWOCׅmg_DDD -gj kn=[WUSS;?aSsϞ~|+|W6H}E}of1_zgajC[#=ݦ׈WPp鞘Y=~^V/7ʬIa6O[?$u .ѿaUD П D *ӟӟƻrS*/ëڱy暕k\ݵfyZ5KuuZUZ:Tn%<|J_oTAui;Gߤ&jUC.K lnFm7vJҹ^ktٚFkt.~ZTuEtJ]:u}NW7,ˤXm .Jޏ n˴f8[:fZnt!E :VSWkBQAEt[\wNFt;Y :,֥\KnB{. q kтV,pެЃeXv܈XtbVc ֢ XЃ؄؂n-&nmS_S6|wq/؁؅ ~x{n?C;r# B4̼72Ff}%Gr$@K' yBEEEEEEEEEEJN1}jN_ꂖC.Ԟ[%O;Ō,p+)&.OljBQel? /:fW @ f`iO#W/\^bi⟶ 򗏈 D:?ph}YA@TIgr8d+;߿z<ڛSSUC[ǿ=mlgh?ދW. y?{%N0MyEǡVNg72z킛BA MA,Eo,oo`j% Nјd.HA j[a dIy$7> v_ @ȍݺTļXU;NE~ DO3 fM^>E΅$O@0!JADQ}T"ٹ _A$4zE2m6fkKz.p {A@UXϏ`sj00Ϗȩdk{XWTFBDZ%^hLʇZ61 9tt% C\/ʄ"Ŗ Ec /`mtNgp?Q=!؂p|*H57<]\DG5AZ*zB钖=m_Pl˔'x&wŕy ]A55P ś馇:TyJ?ˆi^KmvE黱y?ѩ>)n_ln03 C?(lڟ9%G_f!]|^م-@[?_7zw7Q2ΔT.tal=p] _k$ĩ 6T>)&Ii@D9H+}Nim3@* bۑ@yGl2W$<ä˂eW7U_7g7h?FOΗ^hBF51FN~Ge/cKefY?PQ.xa83 3;,,? +./j.=x)Y@VɋA{I[`pތc@oڛ7ǘ$ W XNZO7 Geblj7.Q[w_R:ңT?_,Cpu~O+60bC~$#sT0WJ0jt)9-`U{wl:';Z~5bЅ?nhىU?Mδ8 M'Rʜ;- Y 2)'-d& a} \naWxph|~w,wHJ.X-jl u8fCVOxTֳmGY$gŨ;@WK>N`L 6t|] ;Z2dbԳA&ppF.g* k@7}q5݃ -ؾa遼FZ#cm8R ^ofg7'W\Oo];-BȾ"f Ѥ=#c[ igS`>#SiG,UE<ڱYk𐞰ڷY;Vg% O,͙3L?cMd~zuI7\&30#CÕRLO')tGUb\֥k8t}::>nn"Gl^@B6ISR1^Kj^P*#ਞ\S?N}_MǕ)Rp˲IcO) bO3AFFwoiV|oBiI2HS5 pQ-#VW<X5xa3PAQmYe^Xe2Hk ,_Io7ˏb^9?("))υR]!7P ~L^f,WXo/I G"Ё3ںI2جc};LOuГٞK&d~WH5M\&)@ \y-wkBdQDސ$ \f^WuW!Y=%/J~I~zSލڙ:;#z^>?]w%$㬞TXcZQl,vee}p'9s%_uϟF=h;J-0IC744\U$E+F=g^WpьAH5 Ɯ/sA+ dx"DFgӐETz@oWPS/XsrY:&˷D]@}‚eS*͋$Z4$^1KϲLT!&`TA7!!Ub]}xH{~ #Qv73+BoBbt{E4E2[(6Jws/Veu;7!ǎ"4CĬ,iBW>9vÄ+ǿB Y.2BΞ\$(1/BhC0τF^I,7C73s&)H$ ฀4zW>B..7Zt?H{zyՍkny_r7{uݿYV)JeSg*wML X UkFL'j(u%14%P g5dɒ9 `qF{p~c hY *;2x`pfq+NN򄯘ӴjR*DXW{QY=gd1JLP2J`Ȉ|,N߆D6#=n`]I+Kԍ#Аfޥ%HOPr am|lF\"nV$>"2NU}d{e(w]lC^^~J8}s)yu KNA%; ;Q#L.Vs& eMAm沚͏6m,6Ꮙ>t=A# /-5mc˵Hw/ŌaWĜz%s/Ͱ枓G:S$ΰ~P}]5~dlx_f$ZKb(\ՐmP`A߃^! x!ic.?s*~Kn㈵ ]9xfԷJ5"l }D_nM5;ST/3dIE8w^2`IKZ7"c?bnБ$Lp秵aѦY/I_`Tj-?E-Pf.寏LiK@dS~6%d6X<\2_rzad)' T\Mݍj7|T6 ǘm]t<"}DE9 w;|dڋ. Kiɾ#D@vM_lšX5We|epNFyI=zKP {(I({2'>Glz&yvjoeVd ~^bJVt~Pc)"cy%l$-~>x"4oRSIӅש^KsQwe.g#tGpb(oj gaOyu9ҧ׼O"C]!6 xE3Hc󤇔QE\4Ԑ_bl0Em& 0{)UeHr-`#ͿHv&Tr3}078icqތy bO;XbŮYI kŐ)iACϤLK4 }1TG>'5)6yb0bJ3{rҰ]wcКCO^ꖦ6("5?0%B01m8O !Iz%A':X]Ѭ)ZK{WVyn`2b;^yh*4)Z2ڟר6ݘnmg|حO ݪ10!I.7n0Ŷ0yJ*m4H m>z/p"GG0N$:*!rǻ6l\`ᝳI FDhdl5%܊!C&/rwp8M: zN'[ ;>ƩCj_[[5j IkF )KN^3zIrKbJ=Sh%РCRtb~'pl:2oH ^ JMklhřtɡNrb0oiUu$qʣ?ԓ %!F2_B7rj>Z륦e6`p^] xؓQk[SPy\l6jQ's[ s5`LHdaFDjM$ m6rj=q-yH%fz!e7k°U>2%s[l(R>K Oz0]k;i*5J3`OJ" z x% gk=g[o\-"A7$Qbx|,3YL̖FGE-s"[_^K 4Y73e}t0 _AwRlS0P՟aa[!X x̮dʌ@a]_\֝…"jbQzr\W9nRڃYrnYشdkG̽߄%dq?)q olk٠ƚG$,%|3cx*kk`^IEUc.e@dDfF:KB Anjq2i|FU'bM't)?cD{(~o"TAaui$*BC"QGhм'>= ]9n/,a/6HIW7&pK(R=Xnn svRY`wǪ*NҶO~Q7iVRߍEL\;^ޖB*6h~."xӖdÿfz+܈Ul)n>m(-*Ŭܲ>[dž1ZdxذJ4DhEuD|V+*Ҳt#Ka8~WeW12֕vV2sV\]elǼƒHMA4+Q X]V/r7Ggxk2m:v[ft\ؐS.Вqeе.@Qb/#7tK74:xm9WDvl/xK&P WrO 8YDxò.Ҽta z¾ro@gN'`*|xՋ ;]^D5Z.RDɘ$ơB}Er(%նe 2#tQ Kza^wR V"lm%f;- Z g. ?; U_6״*׸HPSǨͬ+ l(Ea`c\bâ0_4Ln[00Rd}ؖgˌ-GVq%^2@_;5)fVչ-Ң'V0쐎XLun[v`AY`Xh!}c$tFˮ? ?kS5.4:,1 f&#FXE JnjFXkɾ؝@${=8Br~;-'r7]#1|>] i {pPva TV5.{dE5,%|w5;X0V! n;ݿ+DG5dzg%PpD&h!1JS6Ȍڎڎ\u-kKkcXX(#>Wʷ Cԙ-X 9Lo3NXn3GdmAq ;mp<Lr2ڛk>@5t( 4-̵"Zwfdid.V/ݸ5/eccȪ!905hzzN%}Dvf>tVEiU@aPh=[M~{`ۧi1X&h(*_|pAA88(Yrfu7ڌQIWK ųzJ?-ͳZGTa< i^F(p=aУ,I84މuqٌgb^vJ,Hidrƥ4n q&q.A"Kкo+K'ǐ/ؿLQ!AIprj^9_Nkvl>՟>bIL>xyXFHJaxn\_7SK ?ܣJ>ܷۙej^s'ufUX-N'i\+D7#Sh,V3'nO:ex[.m?h;)3f!g7A'15w~63#BCyz5dE,dᏃb[~:־{Мyތj䈋} \I w`%w2Rfb@IFWmcUT%\a3KrPqI)CgI?G5RǷ%%9VQ쀿A{ *$'#Z` aX~h$ZN"M@`b2eX胸Mwi]te~56yδĤY Z!1 *fx:i5EWUDl)nk`/94QhoĮeW^f`2,}wהz=BPYNV-83 6E+ 5~ %rpW;}n鏮l?zaR<>8pZc3".9$=d}%¤=13%Ysf?>lf&kdi*q_q>zBBDnDhk4v>)^v;تSx@&.(S8XvSRR#U\0z}JS)`[=2H~e۝^FV"GYDQ;:קzG%i$ffNAKb.^ yCf%.`ӞJƁsȘE8{CVYoۄo%k %aT}G&|L{N}+$mXQuCuRX<]ഴ< Jie~[%R$ԱF4NR49C' mpvͬdrPi|iܥ}YE=Ư-w[nfr LyXHji԰Uݤ<+U=LQM˙Mm;S402vl&R%qaޫAǘсA΃="Ga^6Fg\i.URrͭcqV#M><;59W_\8eMbfw?W‰ݯR6U|[Qé(ʰ<^P0z~"@>\.8 MIFMxpFˉq 2aqz*9CbL9Sq&atba\rpYB}49jH\'u{j o-3o-N߻'{OPőtجβo gH:̛VηyY睺[X_dq7HhCcnÜX b<4Vq瞮lL㎈T2:v+_\>?UԩP"D >`AQ3ݪ/UjĹ`ΉH LHK^BAXaNWYp nlT+ iGg4Jȍ ƮTi ~\O}a*5h74V~TdOwfu5 {H_b.TWߊF)+(1 9׽~)d+RA"HΔ~NZǖic jzǦWt:vxw=AtύS:fqZ M4׽'BJJUZ|>ߔFO-F;8)0a@ \VIOA<D}z/kTH_fݟg,f+,x-R!{|DA/E& #՗od@KM]JOAh$ >wH3%jQO |/[&'saՌ ۔ynۂ&c|@Nڑ^m׈ch{ =6KDV|'^3֮6`t::o鲸aX*12A\ثݎ^Z>xu`uȆk2%lY'?~'"y ZʭK}d#.:d{62[WBw2 :lv)|v3N7ٔ[%ňa̪`N0 Cwvd\-ҷkVΗ;}bT4ts 5F+uB"yPm,g_ |L%f9C.foBئ QM0 Blݐiil3)L1'AȗX-o5dVh-üO֝!R1u[~C_ӧ>+W9N|&CYK[_妲Q\Rjۮ#n솭ᚌ q~NLgP$*3\;F\&}W{ ߫2Ks#{OzZ!zRl'GtMOt}glȪ4f90gkX@-:@0WXejb$0#RuO>SjBL^箺`S@qҝ_+`662xd$y=:pױxP}ms] 4ݹHdl\/Zp_ͬv_X;1;-y wK\l*IL5\ObB_qYm&c^j9CaaY6]xLNaazO,)!}1eN Hx|djC(%%c[lZ??7{ lӵ%{k2\~pk8{KIngNok2,|1g198{V}f pӆ n{d<5s8msmO唥,<iXR ƹiE0,Vm36-S|=k3^66X*3 |Vd NtduQϗ$=[.M+G&ꑕ yR.CB0ТiY􊻯R2r1.2P-CRm65xmϖ&Šukq"5|$oe4WU>s̩3cʰ+XV] J޹B;3 }*%jUI!I7K8jnvy x]D}:*_C~YQ">VVczUo\o$@opWso&,jE.F3khU skE]:.xա&!Ri+.]@OGpMb+LgoW@X :xN8<^G++_]/͸|tԸZ>me= sNhNnD}mq9ѡڠue"Au[_ jPM+TRu{yA,3NĿÝn,+XkŽfR2Eq&ie$fq]A;mffKGhq#a`o'C+lJYehj)@]t0X$Qha V/T@η$i%#DĻFzϷN(?tʺkc͌fSޑCȗ6c&>o;7o%K8֤4UF<ǟ}"45aqE2" B?)$C]j[ݨŞ)%e+ W!J%" 5Dc,kW58Ա_s_8EŊg\^.G匙iG;)2u~@Nިk>XG3OTFp|0$KV rrwgR9eƅoIy'Ȣ(}mTBS~-Tdʄҽ k2Cjzyl4ZG#A6!42簦AHqI6S߻eF=RǴBj[5ąU1*x>AMՁBz_ %7"6OusR)@uf/`5Y?u OrW{L{S[aF,'pl>l-YZ8ˈg:p#G$-yL;9 T(-\v/*Nu$ % sW)kKToMY>#w 9}^O5GY 4NJtgcƟe إSv\;;~T@Ӌ\YvȔL%Rfu_)!}Д>9? cxRG~GE*Y%r:% ,nR*|w>ޔ7E3 MP6mcnZIf8̱屍q//I"!GaFP59q)۳^%e|'e&b^*s>. ޭ^,T}p &J\~PنAY(v~F|c=z&16]dH@ٽNڭC5QFwtCXH+k{ju1bvce:<^B^.I*5p(r\dm˪* q1HJ݆:,#P0tJҊ ,(X/0Ymj*Rakc7Rƶk 61gdhB Eɭ&Vh"y_(OIDSun: R[qZPxS:}~Bڋ~A؃C_=7 efibփ$P_$bv<~P"d3'YH%}j\nIߥ:Ruln,I- @:B8x1EHLڠOYgsoFʬKt='9] eەsL Fi֭]v_*V+J5IuKͱRCYGv*GGe5nGt̋R^P#|J C%%Vcx`'IE)'5$F T<BSڗ1'q*Q[<`nJ#,;ə>V@Pkѳ-]ĕ9'B%?ITv[y ϲ2?/G-txw> 8szB: ADSʦȓ>DQ& W΅5F\<1}t!)HR_Uk@Ïʡqx 24 `=:hڎё:T38O`7 {f#z7' >9I5 #P '3QA4 i wt7pu6i"+8I3`xUoI: tMJMt%rj*㻘w ?Wmd?Xs[D-TQ7$9;)DNӞw}9FG(_Ov%e#J>+޾ jܑż&!ju)VP+iu97V<>4"E4h~B‰BOЦ G;X1W@1,芭k= hj #̲[Xݶᾜ x O8Ա@Pq-&"ҥČ5zWxo B h2a1^$=UHtogAuZq2U "#mυY+sWOp?6|=v1Ur?`댢;ejlx'ڿlfbԴa|^k2fYǃЋ~Ih"-;ɛ~ЮknwVKD'i{`ch4Ozw"^| "4}i[3.s[ʹ\})UOuI&<>9PU%p8~+xLPyO,` "dfV_FTkgt21B|Ӧd?؎jJ+K8pđ RVQ 'LE }%u\0VlM*V 8("%.Io2 sfp1χ,VW/Q;A խӫ"6X^eex NB@|5âq5N/T;#.= ARlɼ[#۶t M!z6o27@s\4se ]h?N;zUaAwm]f\@'ua+}RN[U 3| ?mxgʐa}ۘY}-7 4SuΖNa" O|)Ih)vC lIwb\L\-ݮC`Afݔ&:}]+R9G [,`W! k .:iVx> be*οѯ$d!~8 EeiB"0^XlV]ktþ]Ц ےM\~;+$qj\ :pTю 񸼔8Ӭ:^霠7\dND,^Y*MGgՂ_%[!i&|ܯ q+n|^5hiqxm;̢ @3_q?wYhSsPL違ߺgwYGAiS(_JGF1,$ # "2-)l(!'O7hVKcwr8soZԨ 2#[&7Yn_%V۞Y\(7Fw S{ԦHU_}O3SNh4lh֘ *!4`0"{ 9hI3zdH<H⦈865mK]Q>STU|{GԖu"PaƠ|ӐڸjVٸP[) `C)3Nj^bKĹYQZXd_?CJAR`[n@uM̺ıĤ 5R,"8*E0j"otD$Dл#?Ur'TЈ%2MxGYJ?D)<ɘ /W2zTjRgl[~:Q@''W=.f"eZp"z@< ݮjU ";3i%We&N{gP-InY-{O{[^F(Li3covgj;>qA~9Y =g F[~ywz'PᙺҰGiT+4 ,kJi<k|vQ܈ t`^h1eh.>}{I>ܴp?$_&N%1ܦSe[5L+D6#Cg Ko냶8rz$ڿI ș7[7d㈢! Yi;̙-Jؒ;K3&+$$~J8z(bj$Sbgt|赓 6aL 5+69O|ž>wd7Z5K4[l||JN+Uïhp#7=ۙ_)> oXT80<`拉C 9$)Xt iԊ.PGj} nZ)CⵓCZtV/fHE.1p*3K( U8g˿BE=o0E~T[I痜hPA J9˧7Y%ԼL')&Zzw49hԕ℉/sdZxO@&h'y,E[KLL1`Rca2m`Kt\/h>>C}~╜+%E9R [:!Dg_N:DxX,xpC+tuE Da-4?@ 0D}-/#vpqauvXU"@F`/Ew@m('CN&;JyhXAٛ,$Ib0T{KUh*1k?1(0/85\P+6=exvDpdA)4&E?75c.ÙP^fHUf^~S7| 6K"5g$]2lDtuOJGp 4OvDmʆr6rP0遮  >)3- B+™R⧢ȨtDqDD+=<=yxpaE_G).إ8PğEPQP00j0  >w1q2o 236yry^ _>10+]פ3okh-ο>A}-2֓!.BtW 3X F-VbZ٣./g>!Gݩ: *,U2~=$YXo ;<ݪ|RQsO @ƈrqNM%g!M7vͨNr)IIM888+̛! -N-]z3됙far= SQ[ `u:x]<~%D@;/Bq_HA'I^=>(C^@*HD,z;¡{78W+e͒%,?X,cY`F86@w;Earr'ua|<JxNBfX jV71椁A_AO z c+졯މrXw0leeYunXj!-)cǔײ]lc%_'d:$M&Dd&4Cz XK5B/7VаPK\΀Z[PK ta]Edist/js/UX Tzib:ZԼZv]lOԠ_}]nol*ngYq~l~á|;]RռQF<鸩SOߦǣy><"gnmlpgQfJ!UJmoビ7zWŢu_z9ΪK>_8 /=7.FlZG,IëZai0ou&ԟus|m;=SVY~y(aBUEe4hz&0ϩʧvt e~YNShpi"qTATTtT42m/҉&3M; GyͳTT>C[zC\I:QYnML7^LK=%<qI`l&Uui3vݚʀXY늾bP5tݾދ<엋٬W} t ˬ:ɯ3 L9lM2B=ZPqAa@f@Fy:co->nTGzagp?pvtw>>ɦc|0b29vaEpX74h5/9Sv _ׇotҰ@0/4BivOvvbݓg$vhr~DGjUuş}k:b͋NN =,^: ϥ7RiiJIj8rӆ~R~]tףɱ"k=`vʄ`1hU9ZI; Q.6uLϵ.G\ wP_I=[Tp.逵઺x`B}Ɇef'xCM]xhiBDSYbM7Ey/͹KY.ί*Tm7n O'[:P8 n]q>\e$e$5SuڇNNt6.t{jHUqy9ɢGZ.{lIXP]I!dž3kIM0GZηt֎ìfI VrXtjj?=F?@K7/33o5.Ç\\Z;#f߶*fwUt=h،@h`HJy\+.}˖D;!ƞ;k/*+x#2/Qt׵ǔ&ښZ}].,LXi|J7Y1#6d+]1:~*JFb Frzth}n%EpJNf`Lo5j؋[*Bϫ)F\ɩJտQ6P XhJKP!t鸸/-XT1j7wx>J:Ŵ*+-O?jc3x m87ư$KfmG o%=m#jU4],2mWt`~9X=;J`FW`zGLz1Я>cHb}҃}^_哱frPЩMC=>sԶxf||ߚמ2%\=Mj25q$~T?ghKx'oW?)M8m 1YQ WW3yU'ΈS WޫN1ԣP ٪-ݠ7jG:d]3rdI*XF[4/wʹ"Z>v d ֑783P!U؜r+@j29xMKCVx+B q-g),#`QR_NZ(|h-Zzz+S0DwR*{7CiYrߚ7k |IyXSh2.hm6*"Lg}uy!H #SO-tOxϒŌzY M <cP?Ιt{fqh.nRFb `>HXZoa {\$>>XK"g|/4%D?Κ<4L%ZU,J~[qlyӆmU7#o]qiux/zkV3rtPƒ8WT`4hJB-NYq۲}- [ea6a,ݪN %C1#.' |ondM83o6{׽\8Fb FK AJT"ٴ!s kKN 9!T/}<\12δsky_=:8B3q?xBSG-rڢ 7P{SJ䤂`Sǟue| vzꔝ ;kU$ztl/-1Dm&hqS^?rS pMZVlm ) ;d<"Fz[52!_N8⸍LPNuԌ #n& 6 dg pn긇iSXeV_U֑.7A|^MRԓb-J~PI<)X@ykzR,<)ު̓bG'[af^o&:49Z3rH_M3Bu~Aml]Q·ܯ.|\x^0m˺m邾[Ǵhϯ{` ڷeCUnRħ)3_by(p {t̯%bI\'֩*!zgr83󄍵͸˯nx~hE6Ul6\@eU̎KvϘm_؆fP} 8)d~0ʪ7irVM>&yk$W}Kt^)BxEOI^j/"R_FB:Fc_~襆vIE[[O3,w;7*r©N盘Hjl #JS͞z}SkXr:9T'v~2’cmxt`6PT_«f z"H+t:z"Ē ʴ\V (=,P/bHƢb# 6d&똉?]/eWa*dr>J"j$DP%_WHWLA4D%\UeK#s@ӭQźiuoÎkV $'K,Ak>Ie ;;Ƌݗ[3SZ]" 2l(وc d]c>CMb)}KAbPsheeܽ?Nv߫Utц_LX7و9´;V;LȒd8,^hʯAyŅX,(u4"'EBS, kHO<*`zքX1X҇jp SQ>m0BD+}6xyÊ`Λm}52Zģ4F5{n{,,=d7"\M/. i` #/0 Jh j`vhk^^Lh9ƌtY}AJI#q>׷Ⲿn/Nkv 211Ɂ׉Pb|˚}0`,Sfi.Co{+VW)R|{ز/¤M)O8N\$Ff's 8< EqV(r U\Y̼dh/|(B<z1/v_Xe|:ͯ)Q2F_i|+B &m!ȔM4pӲrpىAv(3*/٥IbXbrUD%7mXV#$*d}JYyYWx*y+X7XertB+l7 V9DO|ETG JIMlCFpËoR8kb:{R| *0@ֈ[l ٦ qxIBP,-LPq ;OZ8RiR0ja>ܢTt±;Td4鹾r.ز;F!zCwZWn¬7ڳ|:,fn-}/MS̜MvO5xLt94ntj+4$J7#9g[bnA? w;a #KCS˭A[.#H3DyXѤ6>=j9eڈ[8I& =n '5ް#oM#v4B[WMUiN *ZAN4\5PG۟(D|rއXmW,,4J8>kh.G2*[21CR@7d) ZJ@'t=T|RdxqTt)+wl0ǼQŤgMC~0-g<[=LTMPi1\ޟ|o_᫓JdZ}ٜ;+ `_)F__+9|Ň)̣u㗊Ϥ Tл\<_]ZM1t;dO?itt@1If@‒˲a׆+FuKSrHV6<;Xq{: nwCg78pOE@~l y[qE֮fsEXR; D #fF +C7/JmSfCJ>nѬ^Ojm\Eb*lP(B010(qmKA czw/d{'h߹svۃLש>Z[>}%71}d.ی89#ꟍ Dp=\߮+`Tiޱ4*MhyAaM,I< <LC8fj^ Pi" Qg gb>+5rњ^åg˂s M㍎=a?%!|C"gI0Z7D}y6>mCHwMo.Cla2NVQk:۵V{8TQ10|*N1_vT:ֺk@ZӌfBjB{[V7M+Xx ;=os?ƹV"9ZOuh`dd pbCSjպxc"bTlwj Xk DK|w*SVZeRC-G%6=,lA3v1da88$gW[91ɞl]SEWdOȞL~Dvݜ sd뚞')܏sIO~B9f^ ҹh;ȕ!nF[/"zJv 2 {)6B>c;.a\i t)c3pV18 |Jjo`FESȒ`[R2ÐT)](lͲ9"C1ӱ5ǖKE]%Fu>,hዋLQz%'p1 @&tLS;L]/Ja|_[}R$nݮbU6/qXƤ{RC뉇kN9AvSHEV9 YuJ[,l,]p0zO/MiX[{E4]ɝ0h,ϗ󼘕3mK}Z]q Z$ժgx{]|o !E2΃԰)#zP̳hlWȐzcx44{Q= r|b8aLnϾ?'reg +ucZNIC勰6Om 6/|C'yi;J'Û2ِ 7RqZOhv."koQj8ytws07QvOԩA Z,$8ԅK+/ M#wb= ^W5X+*ޞ&yOAG\L-r?—lvuy2 u~^RFýt8 3B+Ɛɯ(Xjٜ\ y ,p̓z D.4AjiFDaqy|EKӵGbOTe:JRa>im=_G*H#41xuJ<|ƙzQjW=Ll|Ys8ȸ b iW2CF/kiF&[xAN rK:lhG&6X&PObN4g}\!4ead8A 95Cz- [֠躒q0fl Td_ ']@!I~É.፹D.83v eJ"?0z`&װl,dߴa_2rώy?Ƀci\(#!k\ nDc Y,o o{rOX(okss"5[U7[J7B VuM>ѾŕBXcXx=!xW՗{/+oD$ "60 GcA]{]vZ}T<.Y& "{2O}XMŝyqÝWDDX$~^1ސE|޷UrU_n/}n{!>K {v:A ]W_؎p O-3s%6lp] P3ȃg/n([**/ßXHr=}Kv-?EY1qoGG 7vh)7v鞬Y{=fO>}-qiA>YwThlkK=Z,bæe)BhfoC3v[btfmvkzV^2hK_},&n !ׇ'G4qzaz%zr|;ee(qochUWc҆%:ŭb6>ėHDO|9סr#"`-Z+=P}j>ƨ+؝:1TiO9>L{VZLt݄Ybq$=Q7B_ȫt4f6<Ÿ-\b\8)(HzD9Ӆ۝R0Fi`fed[:>L ˡKyGڶ5asL-eAY +Mڛx9If:>Pg3:[}@Kmfq Ct6 ymF.rv~R:j7^emM[ʪyϙ0x:ulEF,rBתܨBbov_G 1QuagpD#5mjo̕O ؈) PSoRBX^"kbSZ1~{8ѳ3c*L,pz: a-h[[c e(6f(#Ιaq kDB*,_gC*ڒ*o4SK6y3E[je5k} #ȍ\Ll#tb:uL$3WP9A lv6C ĜBxۉ؊#`b V7rWa K:gCzV7S7b4d<;j yBj/6uexKoE6Up׮<2Ff>]>)'^\jpBd0ILW`X5yg {Z%muvosSh=YY,^k<(ZYYAYTҋ8VQ/MGԖ@ލI ;g7ucj9Xw 4$ߺB4~?^)OQoݻ/0$ٽ~|2f0b߱Bw6Z'VL||@|1lh#]LӢJieo-0)_G2unh'Gm>IԭI@aAЕ7O_%/J;ݺR)8񾯊;cxv荞w8Dy:J8 Q2۴%/UB5J`iѺFKtZ'%aփR4=W$fk]vW-,#8KM,4\]))@1oҶ/Mӟy^쌏"criٻzv4u"8 10 a7t4-Á܎ٻYqyt~d.QG/o~`D]# .Rykkע]|> ^MYL#d 5Xy),F0.zm4M 4eB\&Kbr(z-խ?fܬ5_4:EwzN}*·Uki/2%Z6KTRYsƐȣZY莴=:!)|\m~/6zO p}(|2Hlzq[_fZBVl C@(ߒ3J>tj|/58-5WE1LLcA%ZLgqT})|Ҍ}-1:@HG)PٛeD{NtIcPyo2:PdC2f 'i!-p.t\$^tyZW‡ ̚l!>)趪̬VpfCSjpv oWW.]db$"Y;#]Lr͚ b5nbvCKʹ!ex0CL< GӾ/kБ-z$Nr0U5-C 3[_s-I. KiHZ=8x8 zK92& :^DptE>`qc$C+Sve΍b3ː)֗# pjMۅwUD+u I]Cn"B*#h`^ \vdy-!ȰB Ɔ۳Ť7kE0s,.nUs((=3s2F}443ߓXBfmv]'u}}M.q>&ѩ 7=89AG\vKg"]^oHxqIt;֊l5MMY0O:1%u˱J%d]bcxi|hX ` %D%_p1͊$N]xٸ87K-z_&Y#=e^m˧M.$0(u! FInZ R&zû}LLq޾{^3x5]p@ S cCiz X2HvHC>#pWe4!]M bP?[hI]mפieȾ_/DqD9̃kZuLtV02kQ. P 9o>213fhRt=a݊پZ z 1(UAX" лQ +K.R=?<ɫfxSt.+U@O)$ި9RO8bJ5g \Z\Zj~o0 B&Ⱦ\T]\)44a"' u\bdDq1PH3^ΰiaOHn7xǯ߿!%P=yn$[7Ci .$ c dv @| ֓r pٚc|$ VD;$  ܬYz nHl[0* F؟>\oB`(DGʒ3#0<]گjښ,_Hyus"E69d&eIeJ!}[u;l0a O(VK쎴"G[Y!yۖ.Ówx|l S_­=]lrAv5oۇ='$9L-LȟTWX-'<&XEZZWI"h. - ia}ђw AZCR*1잃YЭQ}.Qp $I8l k5S7C2]ث$"O]%uԕУ6798F/(`vrA/ pLHqTc[]mW|*PTY1ʞ8 zeu_ 5(X=8k\ hSE6C`|JdYn RW N!''0h6]sSZHy{bFж%ѭ֔|Z%=lf ķ;MAIlo[ Df&uEU]"+0r-RM% zRr)rݓt`<h"$񙴽@K{+.CMFѧ2'$ g(otͩ| H/ŪyI5(T_B#Pk '\,$Or4GƢZ޵A[#m~ 3/w5y)_ )k99\$H </X5M.EM֕ŵ&E={o)=Z:AZ&~a--{ܜl YKVr!ӫi\K3 ^4/w,G GY<'u]:3YRqFܵ5[aWi%5Jk 2XmUi.ȺGu>h8t?)^Gs^x\͸Ȋ/.^NL~yt.]P^ped|Z^}4/-/Rd^Pb/_Q}LsR| , rLLd7?f$|? &>>OAԛzbNVAh ˡ,&{?+XoljhflQx1C>l7==A#ӕnJ5\ˡ.z$[Y aTh-Zu% @% a b|@1S=$oOY%PUEruEZ\u# "f>-@=Mq )COS;.~J1zxYsVWI)qquzN 5ZEV5ڋknAknlJ⓪ smQXP}' De‘'MѮ׊lYŞcL-oDzݐvf P+86&O$H+]|8iAM7/:^/5WS|8ãLnlkŸc-k@zE]ZbăΔv-<:g\U/Co$vvu`2 /S:q?Q=RC?x񱦷;5Ec n@ZLuL\2cb+◅S.@}ǯC艄6]Ly(N9OB+cmq#/Py&π-+ 1a,*7뮡Q^r~eeԇQ甓|TE6NDzS5ޜ<L(gl}E!=  8Dǥ0hKd!NEҥʼ%6^,ukmfʹl0z`[mdVƮW 3^e3*a:X,S3Rjq @47".^x{4gyt}]q6-9jzʑ? Weyumi4̴e{ò),*A Ͼ I'u*09`^t/1^8ekVGU3!,Jٗٔ$e^ᢊ؏Ak;7S}.\8 ";h"^"! ~"Gh\"J+As_;# F77ǖb˅[ oFxⵐ aW3&]YWܔg%%Qǐٱ ](X<$-~ש ?A64_dVA.T6VL KoZxa~q0J*^E%:1jȤR[KuRKJ44T]SжA Q!:9_YQU8X2\S8ay&R f^ &ˏ0gf"#LnQ64H:qǚ+w0OD@dpH/(>~z-5p>`t|~@ ~`SQ1p,D7YHe3Z3dT5C,G]=@0VN0Pij3\c5e"@`o#cjRӿ~xJGSTB׋ c9bq"`+Q6;ƀRnYȼMˋp%D%ۅc٧8q ^yvAI$gú!9~fi4@b_ׁy)sƉ7}Eum:CV>ݍd㦫>;2m sR0e&Ylp&0cf9{6W`Z9VJ3n>7%{c}>?,wtJ휯Uf (-<9)γZ]UO3J9WS0iݣ˟48^P8͠gI%A!j'<0ۘ|xg3߉Z)C5;b&>|Y\qZMR3MUee?OYک^$n A*¾N UC8[Ewf5ӸG*cV+\AGpd > u TK>5r&?QT@qscr{5j9ͧZLy _g z> Gp9?A Y(n}ŰY_9> Tj )PK2#]PK^]Edist/js/npm.jsUX nagios-4.3.4/html/contexthelp/000077500000000000000000000000001314764422400163125ustar00rootroot00000000000000nagios-4.3.4/html/contexthelp/A1.html000066400000000000000000000015741314764422400174500ustar00rootroot00000000000000 Context-Sensitive Help Unavailable

    Context-Sensitive Help Unavailable

    Context-sensitive help is not yet available.

    For more information, please visit the main Nagios website at https://www.nagios.org.

    nagios-4.3.4/html/contexthelp/A2.html000066400000000000000000000015741314764422400174510ustar00rootroot00000000000000 Context-Sensitive Help Unavailable

    Context-Sensitive Help Unavailable

    Context-sensitive help is not yet available.

    For more information, please visit the main Nagios website at https://www.nagios.org.

    nagios-4.3.4/html/contexthelp/A3.html000066400000000000000000000015741314764422400174520ustar00rootroot00000000000000 Context-Sensitive Help Unavailable

    Context-Sensitive Help Unavailable

    Context-sensitive help is not yet available.

    For more information, please visit the main Nagios website at https://www.nagios.org.

    nagios-4.3.4/html/contexthelp/A4.html000066400000000000000000000015741314764422400174530ustar00rootroot00000000000000 Context-Sensitive Help Unavailable

    Context-Sensitive Help Unavailable

    Context-sensitive help is not yet available.

    For more information, please visit the main Nagios website at https://www.nagios.org.

    nagios-4.3.4/html/contexthelp/A5.html000066400000000000000000000015741314764422400174540ustar00rootroot00000000000000 Context-Sensitive Help Unavailable

    Context-Sensitive Help Unavailable

    Context-sensitive help is not yet available.

    For more information, please visit the main Nagios website at https://www.nagios.org.

    nagios-4.3.4/html/contexthelp/A6.html000066400000000000000000000015741314764422400174550ustar00rootroot00000000000000 Context-Sensitive Help Unavailable

    Context-Sensitive Help Unavailable

    Context-sensitive help is not yet available.

    For more information, please visit the main Nagios website at https://www.nagios.org.

    nagios-4.3.4/html/contexthelp/A7.html000066400000000000000000000015741314764422400174560ustar00rootroot00000000000000 Context-Sensitive Help Unavailable

    Context-Sensitive Help Unavailable

    Context-sensitive help is not yet available.

    For more information, please visit the main Nagios website at https://www.nagios.org.

    nagios-4.3.4/html/contexthelp/B1.html000066400000000000000000000015741314764422400174510ustar00rootroot00000000000000 Context-Sensitive Help Unavailable

    Context-Sensitive Help Unavailable

    Context-sensitive help is not yet available.

    For more information, please visit the main Nagios website at https://www.nagios.org.

    nagios-4.3.4/html/contexthelp/C1.html000066400000000000000000000015741314764422400174520ustar00rootroot00000000000000 Context-Sensitive Help Unavailable

    Context-Sensitive Help Unavailable

    Context-sensitive help is not yet available.

    For more information, please visit the main Nagios website at https://www.nagios.org.

    nagios-4.3.4/html/contexthelp/D1.html000066400000000000000000000015741314764422400174530ustar00rootroot00000000000000 Context-Sensitive Help Unavailable

    Context-Sensitive Help Unavailable

    Context-sensitive help is not yet available.

    For more information, please visit the main Nagios website at https://www.nagios.org.

    nagios-4.3.4/html/contexthelp/E1.html000066400000000000000000000015741314764422400174540ustar00rootroot00000000000000 Context-Sensitive Help Unavailable

    Context-Sensitive Help Unavailable

    Context-sensitive help is not yet available.

    For more information, please visit the main Nagios website at https://www.nagios.org.

    nagios-4.3.4/html/contexthelp/F1.html000066400000000000000000000015741314764422400174550ustar00rootroot00000000000000 Context-Sensitive Help Unavailable

    Context-Sensitive Help Unavailable

    Context-sensitive help is not yet available.

    For more information, please visit the main Nagios website at https://www.nagios.org.

    nagios-4.3.4/html/contexthelp/G1.html000066400000000000000000000015741314764422400174560ustar00rootroot00000000000000 Context-Sensitive Help Unavailable

    Context-Sensitive Help Unavailable

    Context-sensitive help is not yet available.

    For more information, please visit the main Nagios website at https://www.nagios.org.

    nagios-4.3.4/html/contexthelp/G2.html000066400000000000000000000015741314764422400174570ustar00rootroot00000000000000 Context-Sensitive Help Unavailable

    Context-Sensitive Help Unavailable

    Context-sensitive help is not yet available.

    For more information, please visit the main Nagios website at https://www.nagios.org.

    nagios-4.3.4/html/contexthelp/G3.html000066400000000000000000000015741314764422400174600ustar00rootroot00000000000000 Context-Sensitive Help Unavailable

    Context-Sensitive Help Unavailable

    Context-sensitive help is not yet available.

    For more information, please visit the main Nagios website at https://www.nagios.org.

    nagios-4.3.4/html/contexthelp/G4.html000066400000000000000000000015741314764422400174610ustar00rootroot00000000000000 Context-Sensitive Help Unavailable

    Context-Sensitive Help Unavailable

    Context-sensitive help is not yet available.

    For more information, please visit the main Nagios website at https://www.nagios.org.

    nagios-4.3.4/html/contexthelp/G5.html000066400000000000000000000015741314764422400174620ustar00rootroot00000000000000 Context-Sensitive Help Unavailable

    Context-Sensitive Help Unavailable

    Context-sensitive help is not yet available.

    For more information, please visit the main Nagios website at https://www.nagios.org.

    nagios-4.3.4/html/contexthelp/G6.html000066400000000000000000000015741314764422400174630ustar00rootroot00000000000000 Context-Sensitive Help Unavailable

    Context-Sensitive Help Unavailable

    Context-sensitive help is not yet available.

    For more information, please visit the main Nagios website at https://www.nagios.org.

    nagios-4.3.4/html/contexthelp/H1.html000066400000000000000000000015741314764422400174570ustar00rootroot00000000000000 Context-Sensitive Help Unavailable

    Context-Sensitive Help Unavailable

    Context-sensitive help is not yet available.

    For more information, please visit the main Nagios website at https://www.nagios.org.

    nagios-4.3.4/html/contexthelp/H2.html000066400000000000000000000015741314764422400174600ustar00rootroot00000000000000 Context-Sensitive Help Unavailable

    Context-Sensitive Help Unavailable

    Context-sensitive help is not yet available.

    For more information, please visit the main Nagios website at https://www.nagios.org.

    nagios-4.3.4/html/contexthelp/H3.html000066400000000000000000000015741314764422400174610ustar00rootroot00000000000000 Context-Sensitive Help Unavailable

    Context-Sensitive Help Unavailable

    Context-sensitive help is not yet available.

    For more information, please visit the main Nagios website at https://www.nagios.org.

    nagios-4.3.4/html/contexthelp/H4.html000066400000000000000000000015741314764422400174620ustar00rootroot00000000000000 Context-Sensitive Help Unavailable

    Context-Sensitive Help Unavailable

    Context-sensitive help is not yet available.

    For more information, please visit the main Nagios website at https://www.nagios.org.

    nagios-4.3.4/html/contexthelp/H5.html000066400000000000000000000015741314764422400174630ustar00rootroot00000000000000 Context-Sensitive Help Unavailable

    Context-Sensitive Help Unavailable

    Context-sensitive help is not yet available.

    For more information, please visit the main Nagios website at https://www.nagios.org.

    nagios-4.3.4/html/contexthelp/H6.html000066400000000000000000000015741314764422400174640ustar00rootroot00000000000000 Context-Sensitive Help Unavailable

    Context-Sensitive Help Unavailable

    Context-sensitive help is not yet available.

    For more information, please visit the main Nagios website at https://www.nagios.org.

    nagios-4.3.4/html/contexthelp/H7.html000066400000000000000000000015741314764422400174650ustar00rootroot00000000000000 Context-Sensitive Help Unavailable

    Context-Sensitive Help Unavailable

    Context-sensitive help is not yet available.

    For more information, please visit the main Nagios website at https://www.nagios.org.

    nagios-4.3.4/html/contexthelp/H8.html000066400000000000000000000015741314764422400174660ustar00rootroot00000000000000 Context-Sensitive Help Unavailable

    Context-Sensitive Help Unavailable

    Context-sensitive help is not yet available.

    For more information, please visit the main Nagios website at https://www.nagios.org.

    nagios-4.3.4/html/contexthelp/I1.html000066400000000000000000000015741314764422400174600ustar00rootroot00000000000000 Context-Sensitive Help Unavailable

    Context-Sensitive Help Unavailable

    Context-sensitive help is not yet available.

    For more information, please visit the main Nagios website at https://www.nagios.org.

    nagios-4.3.4/html/contexthelp/I2.html000066400000000000000000000015741314764422400174610ustar00rootroot00000000000000 Context-Sensitive Help Unavailable

    Context-Sensitive Help Unavailable

    Context-sensitive help is not yet available.

    For more information, please visit the main Nagios website at https://www.nagios.org.

    nagios-4.3.4/html/contexthelp/I3.html000066400000000000000000000015741314764422400174620ustar00rootroot00000000000000 Context-Sensitive Help Unavailable

    Context-Sensitive Help Unavailable

    Context-sensitive help is not yet available.

    For more information, please visit the main Nagios website at https://www.nagios.org.

    nagios-4.3.4/html/contexthelp/I4.html000066400000000000000000000015741314764422400174630ustar00rootroot00000000000000 Context-Sensitive Help Unavailable

    Context-Sensitive Help Unavailable

    Context-sensitive help is not yet available.

    For more information, please visit the main Nagios website at https://www.nagios.org.

    nagios-4.3.4/html/contexthelp/I5.html000066400000000000000000000015741314764422400174640ustar00rootroot00000000000000 Context-Sensitive Help Unavailable

    Context-Sensitive Help Unavailable

    Context-sensitive help is not yet available.

    For more information, please visit the main Nagios website at https://www.nagios.org.

    nagios-4.3.4/html/contexthelp/I6.html000066400000000000000000000015741314764422400174650ustar00rootroot00000000000000 Context-Sensitive Help Unavailable

    Context-Sensitive Help Unavailable

    Context-sensitive help is not yet available.

    For more information, please visit the main Nagios website at https://www.nagios.org.

    nagios-4.3.4/html/contexthelp/I7.html000066400000000000000000000015741314764422400174660ustar00rootroot00000000000000 Context-Sensitive Help Unavailable

    Context-Sensitive Help Unavailable

    Context-sensitive help is not yet available.

    For more information, please visit the main Nagios website at https://www.nagios.org.

    nagios-4.3.4/html/contexthelp/I8.html000066400000000000000000000015741314764422400174670ustar00rootroot00000000000000 Context-Sensitive Help Unavailable

    Context-Sensitive Help Unavailable

    Context-sensitive help is not yet available.

    For more information, please visit the main Nagios website at https://www.nagios.org.

    nagios-4.3.4/html/contexthelp/I9.html000066400000000000000000000015741314764422400174700ustar00rootroot00000000000000 Context-Sensitive Help Unavailable

    Context-Sensitive Help Unavailable

    Context-sensitive help is not yet available.

    For more information, please visit the main Nagios website at https://www.nagios.org.

    nagios-4.3.4/html/contexthelp/J1.html000066400000000000000000000015741314764422400174610ustar00rootroot00000000000000 Context-Sensitive Help Unavailable

    Context-Sensitive Help Unavailable

    Context-sensitive help is not yet available.

    For more information, please visit the main Nagios website at https://www.nagios.org.

    nagios-4.3.4/html/contexthelp/K1.html000066400000000000000000000015741314764422400174620ustar00rootroot00000000000000 Context-Sensitive Help Unavailable

    Context-Sensitive Help Unavailable

    Context-sensitive help is not yet available.

    For more information, please visit the main Nagios website at https://www.nagios.org.

    nagios-4.3.4/html/contexthelp/L1.html000066400000000000000000000015741314764422400174630ustar00rootroot00000000000000 Context-Sensitive Help Unavailable

    Context-Sensitive Help Unavailable

    Context-sensitive help is not yet available.

    For more information, please visit the main Nagios website at https://www.nagios.org.

    nagios-4.3.4/html/contexthelp/L10.html000066400000000000000000000015741314764422400175430ustar00rootroot00000000000000 Context-Sensitive Help Unavailable

    Context-Sensitive Help Unavailable

    Context-sensitive help is not yet available.

    For more information, please visit the main Nagios website at https://www.nagios.org.

    nagios-4.3.4/html/contexthelp/L11.html000066400000000000000000000015741314764422400175440ustar00rootroot00000000000000 Context-Sensitive Help Unavailable

    Context-Sensitive Help Unavailable

    Context-sensitive help is not yet available.

    For more information, please visit the main Nagios website at https://www.nagios.org.

    nagios-4.3.4/html/contexthelp/L12.html000066400000000000000000000015741314764422400175450ustar00rootroot00000000000000 Context-Sensitive Help Unavailable

    Context-Sensitive Help Unavailable

    Context-sensitive help is not yet available.

    For more information, please visit the main Nagios website at https://www.nagios.org.

    nagios-4.3.4/html/contexthelp/L13.html000066400000000000000000000015741314764422400175460ustar00rootroot00000000000000 Context-Sensitive Help Unavailable

    Context-Sensitive Help Unavailable

    Context-sensitive help is not yet available.

    For more information, please visit the main Nagios website at https://www.nagios.org.

    nagios-4.3.4/html/contexthelp/L2.html000066400000000000000000000015741314764422400174640ustar00rootroot00000000000000 Context-Sensitive Help Unavailable

    Context-Sensitive Help Unavailable

    Context-sensitive help is not yet available.

    For more information, please visit the main Nagios website at https://www.nagios.org.

    nagios-4.3.4/html/contexthelp/L3.html000066400000000000000000000015741314764422400174650ustar00rootroot00000000000000 Context-Sensitive Help Unavailable

    Context-Sensitive Help Unavailable

    Context-sensitive help is not yet available.

    For more information, please visit the main Nagios website at https://www.nagios.org.

    nagios-4.3.4/html/contexthelp/L4.html000066400000000000000000000015741314764422400174660ustar00rootroot00000000000000 Context-Sensitive Help Unavailable

    Context-Sensitive Help Unavailable

    Context-sensitive help is not yet available.

    For more information, please visit the main Nagios website at https://www.nagios.org.

    nagios-4.3.4/html/contexthelp/L5.html000066400000000000000000000015741314764422400174670ustar00rootroot00000000000000 Context-Sensitive Help Unavailable

    Context-Sensitive Help Unavailable

    Context-sensitive help is not yet available.

    For more information, please visit the main Nagios website at https://www.nagios.org.

    nagios-4.3.4/html/contexthelp/L6.html000066400000000000000000000015741314764422400174700ustar00rootroot00000000000000 Context-Sensitive Help Unavailable

    Context-Sensitive Help Unavailable

    Context-sensitive help is not yet available.

    For more information, please visit the main Nagios website at https://www.nagios.org.

    nagios-4.3.4/html/contexthelp/L7.html000066400000000000000000000015741314764422400174710ustar00rootroot00000000000000 Context-Sensitive Help Unavailable

    Context-Sensitive Help Unavailable

    Context-sensitive help is not yet available.

    For more information, please visit the main Nagios website at https://www.nagios.org.

    nagios-4.3.4/html/contexthelp/L8.html000066400000000000000000000015741314764422400174720ustar00rootroot00000000000000 Context-Sensitive Help Unavailable

    Context-Sensitive Help Unavailable

    Context-sensitive help is not yet available.

    For more information, please visit the main Nagios website at https://www.nagios.org.

    nagios-4.3.4/html/contexthelp/L9.html000066400000000000000000000015741314764422400174730ustar00rootroot00000000000000 Context-Sensitive Help Unavailable

    Context-Sensitive Help Unavailable

    Context-sensitive help is not yet available.

    For more information, please visit the main Nagios website at https://www.nagios.org.

    nagios-4.3.4/html/contexthelp/M1.html000066400000000000000000000015741314764422400174640ustar00rootroot00000000000000 Context-Sensitive Help Unavailable

    Context-Sensitive Help Unavailable

    Context-sensitive help is not yet available.

    For more information, please visit the main Nagios website at https://www.nagios.org.

    nagios-4.3.4/html/contexthelp/M2.html000066400000000000000000000015741314764422400174650ustar00rootroot00000000000000 Context-Sensitive Help Unavailable

    Context-Sensitive Help Unavailable

    Context-sensitive help is not yet available.

    For more information, please visit the main Nagios website at https://www.nagios.org.

    nagios-4.3.4/html/contexthelp/M3.html000066400000000000000000000015741314764422400174660ustar00rootroot00000000000000 Context-Sensitive Help Unavailable

    Context-Sensitive Help Unavailable

    Context-sensitive help is not yet available.

    For more information, please visit the main Nagios website at https://www.nagios.org.

    nagios-4.3.4/html/contexthelp/M4.html000066400000000000000000000015741314764422400174670ustar00rootroot00000000000000 Context-Sensitive Help Unavailable

    Context-Sensitive Help Unavailable

    Context-sensitive help is not yet available.

    For more information, please visit the main Nagios website at https://www.nagios.org.

    nagios-4.3.4/html/contexthelp/M5.html000066400000000000000000000015741314764422400174700ustar00rootroot00000000000000 Context-Sensitive Help Unavailable

    Context-Sensitive Help Unavailable

    Context-sensitive help is not yet available.

    For more information, please visit the main Nagios website at https://www.nagios.org.

    nagios-4.3.4/html/contexthelp/M6.html000066400000000000000000000015741314764422400174710ustar00rootroot00000000000000 Context-Sensitive Help Unavailable

    Context-Sensitive Help Unavailable

    Context-sensitive help is not yet available.

    For more information, please visit the main Nagios website at https://www.nagios.org.

    nagios-4.3.4/html/contexthelp/N1.html000066400000000000000000000015741314764422400174650ustar00rootroot00000000000000 Context-Sensitive Help Unavailable

    Context-Sensitive Help Unavailable

    Context-sensitive help is not yet available.

    For more information, please visit the main Nagios website at https://www.nagios.org.

    nagios-4.3.4/html/contexthelp/N2.html000066400000000000000000000015741314764422400174660ustar00rootroot00000000000000 Context-Sensitive Help Unavailable

    Context-Sensitive Help Unavailable

    Context-sensitive help is not yet available.

    For more information, please visit the main Nagios website at https://www.nagios.org.

    nagios-4.3.4/html/contexthelp/N3.html000066400000000000000000000015741314764422400174670ustar00rootroot00000000000000 Context-Sensitive Help Unavailable

    Context-Sensitive Help Unavailable

    Context-sensitive help is not yet available.

    For more information, please visit the main Nagios website at https://www.nagios.org.

    nagios-4.3.4/html/contexthelp/N4.html000066400000000000000000000015741314764422400174700ustar00rootroot00000000000000 Context-Sensitive Help Unavailable

    Context-Sensitive Help Unavailable

    Context-sensitive help is not yet available.

    For more information, please visit the main Nagios website at https://www.nagios.org.

    nagios-4.3.4/html/contexthelp/N5.html000066400000000000000000000015741314764422400174710ustar00rootroot00000000000000 Context-Sensitive Help Unavailable

    Context-Sensitive Help Unavailable

    Context-sensitive help is not yet available.

    For more information, please visit the main Nagios website at https://www.nagios.org.

    nagios-4.3.4/html/contexthelp/N6.html000066400000000000000000000015741314764422400174720ustar00rootroot00000000000000 Context-Sensitive Help Unavailable

    Context-Sensitive Help Unavailable

    Context-sensitive help is not yet available.

    For more information, please visit the main Nagios website at https://www.nagios.org.

    nagios-4.3.4/html/contexthelp/N7.html000066400000000000000000000015741314764422400174730ustar00rootroot00000000000000 Context-Sensitive Help Unavailable

    Context-Sensitive Help Unavailable

    Context-sensitive help is not yet available.

    For more information, please visit the main Nagios website at https://www.nagios.org.

    nagios-4.3.4/html/d3-3.5.3.zip000066400000000000000000003725261314764422400154720ustar00rootroot00000000000000PKsE=]LICENSEUT 2TPęTux RMo6W )t[Ԟ(ʢJRH- u4fJ6/O>w˧?ϯ9m#~ ~+c# vL-avD4y&ZylytS?ϧ%WןCv;9g;\vٿ|,@G/4itiIM'~˲蟊w)=$Fѿ{ n9jnɈdޝ|=`I]g2Zp>)dGmS54x#?92v)ңc$OvO>XX 1:t1Cx-v 6d0]bY.FhrevLq¹UATbOfé^FWXS1J4:?d=ϭZT$m-t#I4eUYjZl3#H䊶\e'!+aȵ)#ʮfNRs`$CzꚶBj#?Ê_@a&Ds=E RtK3ny4#b[_gsNm˺+3RV)SՃ(jS0yV11 8)T!;rJA&YER3 R96*fb Pg>Y׵X*#Nh~([GHc{].Ǜ̳84+bՃ1f-+"+7׸ﳿPKG1 'd3.jsUT UgVUgVux dvc7 ;5]5db&2.wy&tUٖUZo榔dsV: ΛL7P~q`oRJqwq @ ;ٴQl,MX\܂rkfb "ȣ|qҦ8a!;2NXѷ@mfaArXsSemȴ+7^wjG)ϊqYlFeQĖ&P?wqoݪb$X \0Y9ABD @|7uv|Aޢ埅N=٩c8PN'bX  +dRSX{T3b -'X4:Na<.0:6lwiVnH! `K2j(jf7Yh殴Xٞ蛦#k {#Iu>]"zEt.;Ss,XR q /e|<-kƟ`q1;HwafӍSx [iva8D.ifƥ=./yts6:& H9[,r`ƴ)GڌƠ8LhšsVc䫘n&G"qslh^R}XLakVK(׏/ /RUb$@1,nFhH+ns|>^6 zSI#)P̔? ă\,$&|-Pm\W`0l)!>g֚MƄ|fY(i24ٻsCx9vP)l(ϲ0I;ҌgNijdzdr4!)mE&Vc#1 M_njJ4̗e6p*A~򳅜wX+jf5D*YZ gG:o P.kK(/ǩb߉q Lp\$8RbGLLٞY=;;iM=lxiڦXфUet84@˙e?z^iKejk-xb1 Lxa*pnee@؂tt0td-0GnizXo 6f6Ȗ[9ncgDYEgr@K_Ig鲸(&hyi " H~o=1 uiSѠI&!GSUMU֗I JA?֌4} qWnGK>+e+q^ PX/G^ M\"~0[}(A)Fʤ/pǦynmQ?x1MNX+ AL =R!oe5}M[p,sB쉃ufQIBZ;4QrvV;٪Yd:*v KܙC&)m 9{ĠĚi>OHng-fGrAi9C3ߔ9gg;-X`Ng4Oje^:71E!ՠ}-+ Xޣ!63* n 8}RF.>ZZ t~:$F[yBSrXfRD(UcԖX__OTb%P&vJ#:zܵ|[Ư o[ΝKϓdo(M I+N匚W?hgzv{RSkS{% L>yh6VM4t$OU'` p;,ƅё U53qe9JѸbhXX ^kj~wʩVlB*e@*(ŵmS}1-OIC?ix|=Z ΰ 9H}FpvC ҀCnrkhk'sb.f]Z ^߬{TF!/H3 ) D..eM^)ke'4&5"d? Đ=/{K &u*gq_(f') Z% X WTjRjnb ~ri燵;nf8[QcDA":b;'ˡv^2J6$9J]跽 RcOHBv&r&c*[AB7 ?0jƠ7a!<D FAѭcdL4 mWRMtwdT.Jq|^C^q'\XGو h{1p=Qx줺-b?)n`S/ngK ٶ:+Mǎ$ڄgqߌ/8fƏVMMoQGӡdeQ*g׋A!xDڈ匏CU@Pu2:=eC&4nr̀?lE+uuXX@ޓ adH7t8[^O3oB[Ҷ @dEIf9O{p/>^6:rX|٥l 6"Bt8\#ň$ "$pF+>:q|JϝEjie;?_П: U Q9 V "٦4=5Yғ>IwVU1MMKvY"4\+~,獝NeyogǯKM"?p yd|𖈼19&'P@5SEzleSv%{CioV߿3K3[G}ASLYFno<@zˎ=L=޹ub\EBQ8՜q_\-V{[#8BiXPc @߂Urf=M֡)Ռྱ rdhuN4GVp-s[ cP[L29>ώ'mU#t~jqVBV1J%a oo//uo*[JdRnt6+["fja3]t}y$ (m *u,T?`B9@C}N>Kv>]\#+ޕbe"[}l+4p"jX5Zïw8wߟ|}byǍOAZ5ԩW6JǾ "ns{Nm)6SيOM*4Ue y.ހT.*G$b&2%(u&5 7!(fZ>+d {T NjS})y|*Q0tbߦS~&@ÖDiSdۚ+ %Hb7TS3X/ǣhsiK=HYrv6̗ٙQZS0:-pA~2:&Ȫ}K6M8ǑHyfNb fs9IW7 yHa~ì e&WaJ~1g ښgT_!8<)[J%ӒcU\f;o߶gNd{uO>}ٶx4) ٶhox <$Ƨe5 ߅l |<:_j@OfRg:3b Cz2Ҍͨ#F?ڔ1̏E?QKM=~n!TOp?ز ١{OДl˗Ku ٭ZoD M\;RV b_[ L }GV62i&oc P\ I  0*6SєugJf0 X }ڡM+DV 2 VYz`FUdrBcYnD>ZY PN+oުڌόcW]CqݗΆ3QB"q{j@xJ1RVŅmBv8,f#CIG/w\{#!?YnprG(B$m¶omQ^cA=lGSjNRriT ";JOM"!^r pѓ^wXoXiVmUqռxq73cT*oxz ~Ե\%vhx`P0sp+5 69s^^>$# :\'Tzm5Y,qH*gۮ$h$~38VdW,*бzz6 śZLoЯ˞y'~ڠV\ ]"ۦs#eQ{&E@;eZ02&s "Űh 9bmC94E^Ţinc"Qc\qTI OM6! ?Mf0Z}@]LEgՈ(ڍ֟VIJ~{&,^H lFj:(5 WhW(uw]1" [/q.Y2.ͣ(FR'YҤ=)|aCzz 49&σEė}`pUi )jA!lZqδI#DBR[ToQ Pn/ǭ؜^ cx%BJsZ=T 7Q_zjL2Y}!')B޳ /CzlZ8\HP2y RQD\B\abTPʓL2xHڡCb=`cg?V1%?C{v^sIį);!; qa-89?gj}c<4ƕmJXRE䏈SR( &2RUS{x=.#kOKڰu CV‘J䬩i N7lL e*&ofmoVկƜ̆ލ+l@PvI! 5Mm|y; W^v}I9LI80jU%zٷ\x?/MN" ?è7R激G T>%ï0flo^o"hb6|NfI- "#ѭ)G``1B.8DFS[kD8pQ"PlAilbmgxjJVj/F.}~jj΀G-|p]* qW ?y kJ !)ϲn&9qA~;kפ_'`>Wޭ 20ƈc5AҨrvWm=?5N>nѴvn tAIS'6D8G&LR5ÌNhkVme/{A<eDGH=hx(0]Q|H "X̜y0W~ ~7qhy2ԹTP+IF'Ӝ;w2Msp1+o@{KT[EeAܸ -Ӛ|@J&(F+8 U@F~U@e{ No{֛Y9"9:{$G?.HN|hwQHIt=/T~Tɥ`b-Eܬt bV",g׃K@0#60vũ*=AV/n% eFx69^a3/&5Vc$ۂ`HVêm$-%ٴH]F+O-/FE^֢Aݑ0*eyw3d5 汆Z &2}V˯GXt#q>wExl0ò_Fӥ/姅 lyT;__tF~3#=#m`/p)}u\S3ek@ #Ar&Ty$G ]nsH5B(L? H0e!sv9'DUʷmN6\4o$dP/dR+Fٲ-gs3:m\/ĉYF(ynx }Fd)3g {dÌث6#SL? =R|aϑ ̊^b)<(iq%}7dQ#a wu(#e25< n݉礀"f+mtuĉEcnL 7k< Nka'_hǘ4-S[H mRO4D") % aPn }Y{ig JGg:1~@(MA_$Fi;)FR"ĹyڧdP;:a* v/KalglZl&9|jVi-,zi?;hVlP Bo^}|`PCPO]L c)m+aˉp<Qfk .s?r%1T|Dz~k.@]F罒;:㪿??/EԱ{2$>9v]D!f)1߅m+S>cA͛B~|L;ucs>u">ʳ13kYdf4Ƥ2hŌj'K|}P _Q1>N#Y|5d6?B7\K6UFvEĕ&*Ve%y14cWmOڜ gŭu/vC UB4UNgaV0jlLɩMc3;fr7x>^vvK+ $-Xՙ-UA3G}8y~Vm~ӞQO AiK'bnCBz=/m |pK X !lV7 ޣ3M}O+2_WdOLX ȇ&cbI db/ ܉-`beY.fe+}9<6j HO5}Ts`V&1,;|JIN\9J 0=DvҎ>^F>tf(䝕[7cɴChF-jt 6Mו4϶뫯 0ǁqhx MPF{)=J#iRPUI(R@;ȖN<^t+L-C(4bk?Pӈ93+I;C5mH4q) f+2}Z7Q'l9NcCfUW-\Ұ.rތ 0Zq-~_f]B,fтmݏV'G&alSL ]- )6Mw:䎦6 ۇ2vqHB5\E1E`͐V)U2Puc:e UpZwRO:. {%0' t!N=X\2aASPl]4(|p9𿘽uѪ Zk\WD51 fHzpwcΰ?4[~sanEBUrਢ.G(gӆ0W[d@̂`b1Z~> ,4ʄnAm_l;5W+3+؇^k^i.oHs'8-yS\mQф;}-ٖ p} t0#dNb5m/'f}б+jM_tl>`EBWz] P2u;`5"uA66QP4`pT,]ugW!k `@d >WA#\8*'(|e= )jMIRjqsF#y1ez|/[wX* %)Ri>{ANUu?qm"'ؐά̠k/tIm@l1W^5A~;ЩY6ig쳝z*mt%:/[o4v+]MmFa ~<-:qG|Lm0nl*R=XOv,y @R+${{LM$'ΌWSSWOSʄwtF#l#vθE:41-KPw%oa O ŗT|އǮ,Jj|:(:x0AXg5<=UxޱM@W&|"3jz-|ӪRx*\8|VhY"`\ {2Vu yhQ{4e?fbc4[k[Ӫuc-r{XPTIvk:b1Kz( ?F9f@+tTZȆQ%*QclyIS^ΗXg/!p eJDA$$IM6IOjj>[bEƢ9!xȁ>\6g&*ryP}tlmwn=vgاl{wqtg GU{A- jU$^^kt*0wPareSvύ-E>^fz^`Dy*ι|r` )N`; ́'0N`5y19gkD&~slPj6C8+U(l#@| 5N ®~M-ۉmqW cY8!6,IHKbǒrgФc\P0-& J )ę˗g01i2m5x7hq_3Iزm&?}ZRs^} 5+% gƘffXQI`#Il?}9xܲIB9|;O:=0Y}7sC&>SQRV _YjVr5l&[w yPŊh&/Rz-s4w;hW*J7MoT`x2 "i< $4EM͑MSV%[6E7<@'h#v9WgN60ӅCƳ|٘8G$:DEYgl:(R֣*tV: #L@@`ax4#I7L%W& CO|oy4iCf /|jqpC0pS[pW9P}_gOg#U`iُ§SNgt`qa+\}Ӎ6]=x\كfz}r=q'i`8J :@B#3q,CǙ]zWaz6g&|ؚ ]]Hu?ޓd3@T:-*,2Θyz PL XA{Qa–|k!Ȃr096DZ!Zq78RM7Mț: 6"l[l |}*od>.f/Ǐ!>O:.;:==wvzPqٲb}tOOa |u6a[cг!z}­M=܊ͫu_Τ&`S;:zX(ȅ-Zծ| d>ֻxmvFpxS@O<>~OwrurW]8"a}{xw`][_.#r? ?~ܵ,5\|,Q}NKB.?ٌ`F'<=xf|H\| L']YWӇN_&%iH2Q:aMSD<ċxXLH^i𤋮q&},Ӌb 4dqdj{ [z<}t G7Oj3C}lW .GГĝn,!5sSK(ΓT97oL=x8#<}<3ʏ>}Ʀ(єCWkF؜>RPQlxa%hQ#] }gÝ0 W.-%F9,E>bLnfr>28p01I]]d0Xt#0vǏu16z`V(+]`lZ[+,Ɨ'8y4$'{>bF㶿oKk' iNS7þsl͈i8;?1cqa慙K8=`Lt<x1La?]3fF?nͪ:eHQ۷3x>}bđHp#'' Lar==y*Qs$w$B<~o8Hg.bll}/ eآeMp%1`LTc`Oe c=!>ZdR Gl+BD'{.a7^JGfŵey?}Ivt8wkr=03l9x}l bB>,ᑈ j:\);l06Ǔcof^>zAm3„2K;Z ƴ" bH6J2hSC£ξ&Wz]ryiD Ё)H Sc;zˏY{Nkhk1e U:G27nRVZ>AE#Z/qY X r/A4/g|9q*tR@*gQp"_ҮhG(SfP$ٕDYq ׃GOF@n^<>TbVvӪʗŒ$h/ {< mnm 6V{6ɈLnA]m.9ڴFaC-ct9`p2{ǖk|A`tj쁁{nh:x`s0d_I Ӈ?i@À[ "1_d: Uzŭlg]`=V,4bHoG@x# /^nEp"Qo‘7bC-/?1 7tqij??weV{bg6ž `Z_m#K@ ` tiOmoi)i2<@ z>`Uc@ G ķ#[S( ԓlYNc hR,/gˀ8ӴܕaypdT״4M$zFO%ƶPR?p 쎺T;8  A£z ,sjA1wSy26O+{*tw$p(K^y [ݶK57}F4+s}4*=+Z&Njn߁980b%SYrjn)%J!cH)]6!F=7{ی6bnnrn4YsTΚpa~Ҧ6/1/=qy&?ok#usf|Ekh>ۚ_ޖHb\ >y|fa+gouEZP\㿽+[|Eѯ6fl4EE{/ιqO5rffEV48"K[Y Uiso~%p7l:gnsW4 9_3|e߀:e9S+L~o|S3Mo(iʣZ)IY.ya)@+ ֗ _V3+2f؍4i"l* /͐ "+xzZC WenB+7K`"t.-IH&\6;J~)n1L.k '(aTBvˮ+!n$mRC 7P a>#NXHk%l -vi%7VբG*sey,N/JĞ]nqf4+ |4i@IK%Rd ~M?sTV?&3ZlgO?9sl_3+ ៯/??(XA{V;i!dؑ^+4MnR2='thcaH }? f/!Sn$pIJnݕށ~B}7FI}ʱLU0w$[SܳS%d"a)=37a*&Xjk*pBAJrt;ȿډo?0ME J 0j<E8T:ðP6XVΆ u"$}X )"0]܋TMNl+,ċ="[%N3}WHh8\ "B3Lntg6C=LU>ul.7|mGL/ tҁ #ExOE`lbie>WX1 lJ'3edg4ϲ 6RRڕ)Gu5_,F%inFDL2^H8F>C7rtX~iS yk\<&4NHH.plþ78qӸRj̛fiH m wY>4Pv$<+,m;%oD6xS;ﬗ.[yGa}H({t*5tR!uٶ؏S mP0E$'Rv-YXln#RtC=¾7Q5UϢ>s|,g7Q[~-;e~y䖝#UF3?qOk ]o ~^D,)`ِhi˂%}}_Ec+wgA֣:l mm]om=*~s`./~ }lPs]ئoYqX|V0TfUڤ5MHΕl_F[P ]Ȱ(lS MArxF?JOAhR_ oMvmԺ@?(7W3 AUM㟊,- cm/b+Ġ~7^[1/:8*l:9^f`t -[_cm@twF Ր:*.?ߢi.4]0>3vR_̾Y[î.U J[R=[8ɪoZnlFԬljl nVt&F ĞpMtσÙ_@=m'ǔij8Fi 67T = Q H84 y<խ+*BZ$hVvnK}ں C2k~53±4ޢ9<w~wmEwro7ay24iӻT[91-ss. p;`<84߭Bk-8ނS@T-dav">u鿉OAT u2N\HŽ:b LS9?`} *38Ff4l3*Ca{nѮYwX;MUVW~!K (NFГ7h'6H?Q t\vr yG2le.}e1fpD TfTeCUGZrv4B  rm~5lh|Aҿ^s3>H~zhݳjeDgO<%MCrHlS"ƒg7)Q$r̍ArY&]7XY'Kdh ;G hpO(Tst sl=Xjxc_2&\? E@JIsP3Y&%b+S)&ꝺ+_<аV$B& MQ@Hg}~ f*/gw8jKUDо*b ` %WW_7m-DVͦ ඣ]ژUj0]u۾~QS{2|?s$*&|[A2 6oi&rs?p-"866bP5F$7 JaPBpwgyTL[~t{UmK]z7hQGF^޹#ڟ ])bVB_|UzbYw|{VN ;N -$xodouU!QFVurɰoJ-[yI!o;~3P` q M[VqOWm2TWNiX&U^' _\$aKYXTO}Eu,)9\ jr`=UѸqB'_NXRyuH h3 lJXY ?U Io<; gn/Š.Itl YaL7 tÜditoSPX; ӓi=] Of/~VE?ϿPo0cۮ(0I%)% n/cUw;X7RS𡈬>? "XQLY+K4!u/`7eb@pIVEi:;@"яB ^=Z밸qG䠪cn!õC b- ,oۧu0"l8ϰgPEI]pvbs nҧݾ0`ύ[m9[ژ;?R&Tv65ʦ90{{d~@@.t-0*%OFU9,+Qªy2dj g+XHnw'DN1PFԇV~Fޝ?}Pwߌ*{{ҫ퉅StaT&w?~?"rBa'= RzDB!dϳG/p ^_-X" wOvbS_4>U~WvuQ/Cꋵtꌵt8 ;7/ڣw I5z&Rwz4f,GfR'>W&Un@;zuv!?qm'_Vw0."Mt5:V'ţSX襃J\?`s`)_DQ% B n4.wJ2i 6뚀ၑ kT[^vm\5yPG^f"٠Ir!Y;muT0 ~gg*_}y>pK_}qלG2/DCkyI}I}IIޓZܓݓzI~b` 2@ŀ @-^ j//~|<_ƔzZ1~|}q]⳽v3jv?-[ X0FƹYn[3 }/4%sыKO;»fUN)2eřZٲI_mzg.&v,+ K]M GUuɮT,risp*Ƌͭ1܋v/EC۪x0c[Y !؝) ]+ 0n{>扸L'fbO3FYSv<[`Qc2 QH+1ȨTQ4ƃIAc1źID &͍`a+ՒB8Q5NS8NyVK RV+iɦ>6u8F,>g)ڴkSnN |I{)GB6]b 8ԗtRl1M6PM*MScw4<I z*k}P^m?P꟭篁Ij޲_qwhux}VpZ%ypf$}w,F3>MŧI.ɮ/!Igel#`cKbigG_s(5nL?ciy[69lC k8fJ?rJ3092"}(~E*rӍ:[$`Ꮡ7|uG_?Y2ڃseH>:ձ[KY]Wp32撨 ,#bt9RzEo_$fI-DP>eʡ\gWbׯ+[G㨱? =ֆ4CjlH9^+bϞLjɈbvB4:l TqMk~` _Œ.et9#P7LI^P`ׅ_]u7;Ե0PS `9tI{"t"S ?MQFMUjjК.Dr EBd1, xWf%a9;N՝_j2ְ=#!~q "kHlH{ڑ`` K63[ QTCLdSҷ8r5O1ļF9=3u,~쀩YKN?I;i ܫ~i>H:akiD%z7z1a3ˆ#GXklߠt29!bPh$YFXI4uJkVZESs{ EQ{ 'P@O:zr4e$6yQrK_#Qxo2ȗ]g77 t.!̩DᦹcjTSgaL9yaT%H*l:1"KtIip&ZQp뤁2 [EU4!$TJؠZQc29jM ֈl Y7 >]7Rђ^lЍTPvB\2Szu pFuGz@@/S5#K8\\pFFu`!Z]iSZ28͐T݊#=?Ǣ{C M榏_ v9z'6h.[Qٱ m ·/>Y؄ns|񠕇V*7zxL^/{@gZҸT9[q3@*BAGͯbyQ Q=f63 B*5K`! NGCJz 'ZqOi6sxo a}*Q0 ц@ {g٢%ŝ|Zpd] 1w'S 1 bJ׈GABA#MVnrE(exqPyf!c?[?pȴ OW>mR5qdlrцHZ\:b#dӺq7r&ҾK}m"TDDw-lljS-[ .knVA֗_cyue|wX]ebIC[47 ӼcOb˭gnbH-wMb` )œI} &ڼx7 j:D&"U0r@jv5œHNŨJ@ UbYWI._u6B,M2A R9eIV`\;8HGӛb7i<1+mh]bDr{u`.LZ1ͭsY\-kϧhX43)g0윣-`OaPk̽,-2s+[wQڡLZd;7z&#5N3J0he1hQ =gfy>.y.'[[])Li-y}>`? ȋ`2K'z/v!Mm,*^s2ކ3{ʉ"ylF-{CJJzML9́%6"8Bu/cu4d+V\}$ۜ)=BAhnÙe_[~ mgl7papERG(^=U^; 6VGT%^%w7B&,U3yf=@O+UV!r)põXӖ{qQɖʼ ?ZcTw%+Q9iE ֫X-/~S--Xe9t!DHH÷\UPǬ&N4(N[̖IE D^J+ʨۀ)FIVvM]A%-.4EO#z+hKHax4˕-JUE{;n  }ԑjT7jy9=.s^p6-J~: zO'䦖bm`H||O :\tHWjwi" rXP/ѵoINV;'_܆ D_茸O%pL5XU!m WOʋƚ=z~v@pv|"@gR%7E[F WvDtSlXZ!R.DH5R%.-}teT9le,C*PT+ ׭pRBp"tQ>0-Y3$\q-x,Ɖ R۫&zģ?#?s&Y_[ogX߬>ujU'@ErrO-#S2)j IN(8İ]H[(sw|Ɛ䐨^nw-?5-bBB063i~UmXieQMtkJ"/r=8$BH wD${OȘrL,vǵTkuV7ER7w)帒&M)ƥ^-7nOyH2vEsre+ f.F1Hn'K:Wjf;FC8ttlrWh UH*$`}`B%fAB1ؒ([lnÄ$8'VҭMX8il 7%>;7ӿ+!@Ϗ3"`b 7z%LiTTXf1mFa#q\,TݤӿBj &H| oI>r'3S{ EσKmf}Wb FG :?Zˀn̄4iy,p$Ϯ㿮EƸh#zfM W/v]hb2/櫃JذܨVHVҺ4MlpP=eP vYnTRVA8Gb`r#P!N:-1餎7#{FJ(fNjL=rHiD э̆䇘IZ1sդi vBArH AyXujߠ&Sc/yvԈ Iw7 5`ԇ p8Jmf݊l9@R :SOyU$z,:Q@'DOnwizF> ֖,*fZRᧈ΢AY^ìFZ5q-k}[ъkn).][FpUr//EVvo )؍$5wCϊnWX_AIy&F[a \˕BuGqL sGZ =gjmȤg#i|; (gON܏E(3tMT5:cS_ \kDbÕEk%-^߃hc>n-9 Ee&h.H?TR؃`oZJZT$ED0+Q@&2S,6*p\wGGjXӵٳS~-m-rFbgB)&= Q;18{}o9Ȝy@Y{݉?$k!~<;*CcD=RapqtHE$&ٍuwDHZ .6+ 7h==ev J…-#dhYC@D"l5DM*;MH5sOܦ^]A'w^ 3xۄ@9]UfW!a~[_/xCh܃Bp",3rC,sSX:XFxawA>_Z~- |PHiK4"+"&*7jϱZsl5&-:zk6wִ]㈮uGFT7]#VwrD臌hEG:Jt& L^Y|v$XkŠn_~l l7 wsoWfo@\O |r"7֋|BvPշ="ɻzkrM>%DWk ːlWYZI,ҷ@g!ŵV E$Ɓaٽr'S<7Q)tdGRm"Wㄌ紐fxt48->J=%>bWنVwp ^V${7}Đ[v2=nwO`3fPl+mlΎ~_'XfUjlFU$YoF]45{ma᎘..Q}LsVjo6" &T/;<)kZtEHEKv h ؐz㥚 >"e'$gW౛2Ի\F%cs]K{SG1:: =ǍkխB-"ѥ(L A o@g_GrgǖqRsk+H[?ҩ9sxPy@Q|8~vFCN.B_ *k vJx$eV*=WV#OL+م[Kx7+xL^rYWA§\V8V85` iy3r%IoVf B7R+}2\'dC6R,H}WL 8V"3QX7x4>NG|1 ^/YN:,'pߧm@ /4·/' >$0k/{ުkPd6C{W@ LSg$ՃLn9 GuCE*Xu1|3w-(>]#8[&}@L7: نO}u#@1՞ȵ/jc\²s^GF(س}ݷ%SQo6;BvI8[nhXₔ=p6)d!6ۋ\zZ"Pb|5@aS<#YuMcHuSd퇐SxM ?IJ4{[,Aװ'nyy=><`&'CNkv.h];v0>m? ybf5-5[=}ݫX[/[_R#D: ЎRc0-f`wtTyES5% ܵd[]JN#ƒDrOK4(qT x}ѧ T Bc 7F,vo&}}{62O3èTѣPv|C۷(';iAdJR;wǸeRW>R+EAVFJGVx"B 71JP'Bb0(JlUpJDn{DS1QQUJQ] zUJaW/(st+Yt孍,iRY,^RYvlq~|Pox {BQ/8٨a?:a–XꪖW䃺)U+9A+I#gM~ >x =X7{y#Tf[YNW6cy,[t t{) Xs)oY!y&mxU7AhU"&{Q |xj'l4R^57K´/H{VCT,3N#mvd< J^y6ǩ\Ap+/Χ; *߮zá{U[aV6[ERz@ %ck~sAK]~=u &Ecɮn4\re彷i#T]&.qHomD#jϳ9jj_ovL*0n(UtB# * cslΎD#MR.|Ji<4bv/ zϝ4m uikeNR_KvT˖dx3vv\Y'붺UN5uw;'Ey"[X1W)譟3BkGI$mqD~H ȸzpV ٷ8Q*:zwN4h6kQǵTQYlԗq~u4cGoʷd`tk;{:ѭa0;0) 㫨$j\4rLznmj{5gUmwY1DTN/D WpLIDi?ti*67¸gfmN66'n  ~G\Оng ےb0Z 8!?6#ll,4q=|2d&g_ `V~1~:*tPd"~Gle|i1_^֣I\k᩹p__E9)Cj6-}%(Ymńĝ[yd/Kn9{YդW_CEP;zB1a⡴M Heɗ9Kul8nzvǿeimEpeU!\) "ܟ6/I+߸!_XK1%Rfbh-_(er-6dt~B>&;z e/WbPOODy%oԤ_EKDmB`[';MbP5ܒ: ?ڝ5`W`$ҹ nd%)@JV9޶0j]+7c4&1Olƺj7ï0Fq4pK]'awHማ| Xx7PBc0ڞ-qȀPL!uθcrI`i bW=GP\,EaIt"Dܵ&T]Ar잸燣פr{FAk}, X}Շ_ AYEܒzo:ܥ1ʪe+I^luZiV|Y3TI6Hפ3Zs*U2裊<aڶ'٭_PiMK|mPk l4f}Y Bi h=/fliۢdcW||nsgD^clTMaco~wCb!冺T%uh'is< ْN, wCŐ5JmGƯDwoiui>֔VELʏQ|l%N`1Rtq3bf:f:d1~:_4֫e9";{t'YR?4ފOT%'=9p[ KЯwZ|uaXT ޙA/Κei9^!3IJpSon`] HE6-&}uk ὭC;dJiuQW GgCO,gFލ\k *vXU Y̅FxclZSbNNQ-4V|CWc4EQ\}KvּzJ|EFFh O~`p*kR,/gЩDQPV.9$L]eip5NNcn>61t%r#d{bV.\`,!WZsJVWG2Ge.5x;!'|Y3)zݷ[NzP4mڿhTkRQ lH笤G d VS_5&![vW筗ʣ ֮(^k7S+ 2qT&={}ء NLhz8`KOځ~q@Z-rX:'<) KI[ECHqo+S!?=m)o  ԄAތAc|˻t0{).Te!qM\C.opATqGEfM愫}7%#akck}gb+ӐKSXӆk9ְPB\uLw9}>( uS ,m=ũvml6}Y; ɾ.7aVJM.nE#J'feH  lv[epYXHeɌvߢn&Moy_^b9:;*"keENM{ۡ-&fE0*@).PwVx/E1#V*k&w]UՒ#Z]׻6=e(I\Sȇ4`uap x{vSkJӋq*D#w ƚ㿪G#A2VPƏY:_윒ѼsUBHK+ bFb) 6 \2&HOكG Q69Vb=TDDew#%Djf_9)_5q=c`6q&9Y6%r\45B}e.@VOM ?ȥڬA<_-;x48#"qdk֘*"^} LJ\kOVq)+;>{h*s0%`TETϡ:&'T3a!B[>892aKmR]E8m%ӹ=j !Xx{5}+Q}5١^ %ծGH]O4bx*⏆sw^QbO7r0^=Rϸg^*9DjiOn,䒼'2c2Fo~?qW^MZ36%~- u 60K1;g:G “3wsۍ:U(:@ijHq2ΥuO bqnvẀU*;a~-;D=iHT6%R94@" VXٗf"j]HQ*x!=< 7={`\1˗YǖC_Ÿ?Z(j*iXq \\ BGQ%kp_b'߽cLw-r ID+2t8I'K@6hvg0l8B0Ⱥ۲.&(?~|q=^v2h"Uz 8[fJMQʸI0QѸ~"jOylF~-g޷ͺ+%bEw4W|4)F=23}nf_5o 4+j7vvMX7|k@=Rl [l'3׈:(`vӳ}:7T66x4( uL^f3RY#rLN*a7{ tsP97YSU:sCe&oǔmo $h>sCpH;0l$a1y,Bk4ke ZwatJ:ȁ:*. uu \ӜEv?M0Y#4*A76HlΖ)8p>9CxЌ3`~b.b%K\7ړv)ߵD$ #£I,y/a' J?T58V'{<%{k#22^ӳwцWN]1G6M&% CW.Sەhr eѲ'GѣU3Q9NIT;ں}N9-̑8Gȡ3"oѱOL49nd/qW[4ău -T|J\iW!~]|a8qao7#Aà^FقBd6=U' U,nmo?7mt}|/Y7]4iLk ?R 򶱴/q?9mC3p#~?`R>JY<xq=__ꡜ̒v{;;,z>wn`506Rgk%~ދ2`CGPDp+oYB1x7q61xW99uʩ+&g^<AO2CN?@RPpv%l1c#b-#/:"[ǕP6 {"3榵%,JM}I3yYuTh L:&]nsKR،nXXO$[Bώ@%̶/+}&y/"o`O} D\1$<'ލݎ{ɄA 716b~)w5&12/%_'ЌP8DDo_r6\v?s8/%=t`qexϾ̌.}_dV@FN>5v)+s)yz5)w7t~6YYDZO0UlUI5:1@DH-99t6;iLO>j/ 7"7ꄚ0OѰh J웮0HVE9~ڮEiyQ$i!ydERLxHh8g$^mI =b#|_fKTM$u4/ YX~ ]zpM'C|ףSHpL4zClYS 9?ӡ.{0R ̻Ω şKݎQ`o_j4[ {j ōnft6BjI1ǩ)鈊/g1FrIo09;IƗϻ̯o D5\ w@bXKorx-K]DnRrbs-\C/!Y$|݄Ҕ"XdTST9w7)˗W|[xRmG7`&=cH]-vX-6;/xf4\-jt߯ H-WnC 1K&{Бɘ.6.yi6.e"79{d8vZt ~i)٣/2+U.%Z65RDzV"&"ME=DB ؒZ\ԏBudZh2M' g5#wEL2 Xw3TN<Djtu5 @:o\l'Me դ—"[f,i%it(XB*2u@Iɏ!Y\ښK{cgazbsźfV35Ѡ _`9C n.:jsxi<  4 jۜ{W^y 2TFȾ|j¦{!Vq/| &j=JW I0URѢ*ݠժ0i 1| dSjkéJϧNS»(/v{Iժt@UD+n-ǸzUkK}G@SVmm9dXVǯIe ^1dnv_F8ݷﯝ0Sf 28e%يaE!AH`>x bFT7DZ obմ\_mx\*%n$sV5P5zRJ<W`-qK_y3{M|6|{3>>N{Pĝ&#ḧ́ʞ}2 \!cBv\Xb;^6n ௙ H= `hc*o&4ͽsnf~-@i'H=H`4/ܷ Nucݠ> 2c'cLE'1!Dswsrݦn}S8fvkWL6G/+ҭ,f9Ҕs] UVB|.b'7xLX (weq}!v_( 6኶x_v0w!{1ptuW͎bn""b_s>'wG;'kw \oC2;` zΠR8rkpSZ$U}:M<-i,`-lwkMk鶻8UŖhddD"d/uuٚ]tCs4Vm te An1ir5jh7ئE2 JG6Qr+U|_Q؟֗V FPTM kӚ \E3O{Cz {/B(X aȝz|iSrMfNjaalO,Mᆋޅ皐HAB}-XEoH"ǣtgRo>,{#KtY7vGc+XubY6_bEnֆcEc +bmMAZOr ]p.b=-VݘI(oWRJ#|tU}jFnW[njg NӏOxxa`lshM)9T^Gx醃:~ !n8~&mukR[>$=k;u>݆~4c@b8&BP_ PĞZ-}ަC~unAZ5M~͛2rڅnAQK]T>zafՊم1jed&ob܏Rz4PXBs>KzsuPL$h={DFrƸ|#جxف6[[ަ8qv [1-:9O7r ) Վdr085y‰VJ?h%ILP*R=4kOE.>]2҆_D`gbE1 bc(7},.P na>Y r;pDVuTb=}^s_^9\Q -׋mٖkڤKa`18+8*h@!F2? ԅ1FXp1VXUj^Q9ltxs`گ6u(W 15(r^6/B(n,j54n(.~=CH %aQb@jG(h_z D}<1~¤%&(&P0R6ά~?ZiA. \%y'N;*`yO"on¾k p):u 8D^ߖ/WCKQPݢPw1t*2ݚ8@gg d8/7}I}_ѯo[da+k:tH DlEl }OzAZ2`K=(/4.URܠ,>:j4 N p  Փ-'xdPRK,T\c j.ҢRLð8 gS^2dpjʤ:OrD +BF]'WzW}/J}we/ 53L8z1}n2hRJtU{{4< uV (c{ިK/똻r?l/vޮ6wdn 9\4ݒni==^%\\;+p+Ah_jJԻ~}-&3~˲})?hqݲ*1c{bm av"6̀$}xd57]4g[aG<[ac-uܓC>^,5g#%,yL-6ɕm< u ?TU'E׬X%yb:Kq3Wv \vK Đ a ^h4]-j8:ڀ,d}r1l]SLJn!(_]SZRdq,#[ 6[nbq x`A rTت ,nuf#} i_^Y6%}8v!o~wQXcܲ}\u԰:(3.LKAT=ոQ$[82 IaBV٦;noabHtM= |m5ދjiqbHf/S=v^h TƆu+A  =,}T\pr1w" zX6w()g>}_BY;TXEPr 'F0C|IS`.`tuoWiT Ym%!kYbaJԐHfcF }`b'Nxb`-nwzxڬ k%wٓ("B3K=z|`q|uBGmmm|A"޳ -רGк @ ɴW25fgqdѻGC~3,A [ Y#Qc-_ZjQ: K>l6>Zpz0D> \^q~=Qҍ_7s"JpHk-slЄhd ͚hzޓ-r`o,+|+w1ãRpb?`%PFm@MABZ=lmʌĺWY`L`P`TWLv|/~`E;ֆ4YLUnW\kk#Eee߈Yk5$ ~Y e5h fHF*.C̚ˬSpCǛ 8ρ,MMgŋݵKtco.(2ΚrX36}Vga:*a`($a(h0$]2}0pޣ0\3{BH 50õCthTg1cOn쵡0:mmT_i  lX́<)l )FIsJMpbūSXXh XO<葪t|;\emQJـ]%5T {͖%Ы7n[8)ŭ"^88)YN&F)3xL%MϞeБ=&8p!3a3^9]FPAruz5qTIDIږ$5@8CefJvk zf ]ÀoyiZ=R<攸 #n2B`V!a. lA-vLEӋ0xyv]gMjp}oo(PXӊeW$ԑ {8qƒ[ ~3fDvN/C7'EYybYʳ3g@>nw$>5~q]x )$"`vzM7yig`鏌6MٮŵgC^6]\oPtQ/ҟkĩEcH/d,W%\'(gCM5w*"QE\X`՞ 0) Xb+ M͋>>61tB -)폠?9F֮)ZN #X#G]S>A}>&DIĤr2ܕQ0Ia6ǪIp4nT~t,_iR^?jmϲAl0͛tӚ)oܴ ^f@xCphjT1+ zg)e^6m(ٖ=sh}h>F32@:^8y84w4 A͔Ɔ Й=*ɩ5f@H t~£DֈItDg1P{!`j Ƽ< &@SR@g*͆H(cpSzު֪U/3ϛV͹La(e&%*#YtبP) z콑hXLM# $xeRhZðZugNDP;C`XPU-Gm*bZoSӈVK,MX:%Pn?\,tl$f0g\hs(ك]/=6+o {&wGfTl0Sb\4dj4~Q}` #% HycgoH%PpzAtO6U /]("xG /eGSN|Q>rF4'Ƥlxݠ&7k/ tϤ@ P-?e9 PIK{0[7hy_<1-¶o MG="?+Ax+]gsϧ^2 GǝVP - ͙Fe}")uSKxۥaa=*&Gm^sH|##: l,)OTFLtY }56hGFƆPnHlx}XmAӿ($P˛P`[C ؽs )[6m24,!`q(%++Nm1(I'\Pa3̏퇏z$F9 8(?90Ӷ ƑVojtzJ_BJCJ_oti̯1%`w~MnǴ)ϱw V +t6CպZ\׺ZPR2eg'es!4mb`[u˖&,7 l CT~J;r|G6j`Aa`_9˼e|~\׫f՞th.o.[k-dJB_bEcǁ܁9::5]}1MmZƣ!Xb"˶A\yZ ,>Y{>36:іȃH:/:h[Tm$ !OgWxh,:fy.t49 rוe'IOZ ]#{P7pOF;XIN,L;M#CO(`dӉ*aA"l/8&&ŢOi :lˎ"{/e_*O z%uUv 8:aSs|~syL.t1d33Y"DDN\ч?FaǑ7_]sg\NL$Z="3guztUt1е-;{kƥv6,' 5fJ0ݯ-\ڹeK/I_ 9S42_p080bFV^. i~: !0Ɉ%җԱV9v$'J_d4x DpdjԈlZuh;{tEz[eWBw?m}5J Aѱ0H"4Eߪn.@+3l\(S(!/Yy'Gv;S?kh-{z[tq[ƍ ҿ%ҿ}x!=veʠt ٕWv\9qU+;6cL /'WH\ rBD[vX>0NՀ:Pnd4 R?LoH%ܫOp+>RYLZA5U.(OK#sİ<p%|6YkVfY{UwuKIz:G`0{VWqȚf<> rWp\ z)7q]/VyvEvc%=s7rhpk?}f;asF|i9C]AEPLRsB1Ϋ@ &QV6 _y4 d6x:(JF%OI@i |!)Qn "Q uD,p)Iwn5ޫQ"W!65"5,F59Eٮ~&8@c;  X nlH xЅ~OYc6!Y`EOX\6b ,Xpsj_,C }wꕍ/jXmۼ #\Ô4{0^A]_ay>h2uB|~`I7ihiYڪ~Xo*6zEј(pM \7ԭLQqm+꛾]}ߨA _DS#O#GvVcJ8WА")kqNe7>OeثbxG{ 1f߈B5~⭶/:(v܇`[2^w=0;Q;z2Dke7GHBZMxFEwsԂ}^ zs )Gxos9  ":Ϭ6'x &_9^S 1M)q"{L*~i|M- e` +=  _)x8(^-j-8mJ6qH`ذ%KF@=I`me?ua`f25"z,P|Dk?ii>u]qǥ5&a^ƸQU`ךK!^c 2n6E6 S'HDpj\)c,§>0u\.2yPhUSXCfJ˿b`9C_3A9{3˫A3 }󱗍5毛{K_,דknmxzY FǞx3-xfgգ2WYsjj]Q%_B%ΥJ!2auk*(i5]Ś ffðoMLE)! ЌO[Px[ kۢ*Ÿ}d> ?S>hSR}Zs~&hMNz$T5rdž:ϖ(q㺶%jk.B;)G }{^:UP &:H'x~vkM@{FA92piVbk {pJʧC4Ha``#:7iyUči}OSq6iZRKl{QFUj”^l \n HͷIASS$nf\hF-^ٞ-FiC1iFC6ymb3;f-YqYHh֫kǣ[̮´j [)_W olBj;H|dH+!CB}N]hsIsGbC h퀜Uz<~C2me?SM\x#zq_b%~ 5@i6UN 8yh׻"\E\Sk9-8w5^Zx Qm[_!+.IO蹫S0Ѱ#:| 8o8t]H Ns_irϦ1a[\c)Rs1c/M[6VuLO~D% DҠ8,td,DګQ!a1.F%aZExsx蝞>qbF xG T f2 zO?71BKio 81""Y8gm HhVu(Ϸ-.&z=mw{$-6("3b0G[*5+'4~d,1r>ɽSbGw\3vqvq~r ^krS5l'ȥXM5u9Lhu+ٗiֶKؠX_@r(:5GA&s;%BCo)*u Ă!]nTCjj@#.^ðhJW}@b{"`GPvaqۜbϮ;-6=eK|^hӶáVRZIMqB*/~XuBbˋ 7&J .3<#<vPȾ rxw $UmHwr{l){:E<O\}&:x#=o+ D{]m@銴)P윧:.sU2ajUG1+8*b[x'mglig'h24mbU{RݡUWݵ-noV`۴-d۶JoݶNo"@ >%ubh{HYfeLŬQx5[*ʶF]#ep#Qjxb=ew4~Pc;JQVܾai[`S"'V*mwCtCt-;Bd۶/n-Zߩ)g&Yߢ)ZnߘAln0̨:QU/abDZVXiQLT.,l4?h!^ҚCIkbe }Q=m针+m~0mʚ_AzLnMc9a?~Y?[.gmffv4G'c3Wg 9\|C $(A&1ȗU9Tpqʜ@;iL?8!cX.MBRVUlEnH9k=,.v,dnFk!ݳՔαb|Kj<@z/ND5ArL^Gړ]׻یHٍ'IUGnG)jp(Ol!&`]|erh+ 8pU*7TWĥwHx#f5,: S bgfԚ4rmZك?eb5ϧء'P&J܎bz/NW*>b PcVlԦ\ $0{5$F.VAj໻܃ҝ"gR٩MSၐA+hD3yvi4nbP>o6uu wy&hʶQs#is8/Cr9Xm2IEu1EcÇ9 q̦kWgtZU7ke[˕1- Lw/-RdM>**Y$,./)ʳIMK><6LG\z♥[laҘMÄ#: h&}[䆙k)dIx6bVC|7_ڔ~f%QԨW}$V.])3- EZ~_3y{vrSj{h6 V9oL`kØdb$dę9^vju':%32f}0YFqPzcz }!"UN0m+SpݝD-WᘈC~LJtmo ĢbuY p>E RaKgbŇF2pJs|Q\rY=e{M?wԷơKes:1k",1kH_m?}ly y:r]wYb)?a4aȻIo h0):*B/9z}|]{;s9hss"Kҹ)k{-aS&JԵ>z.x*3v r)TJxy zPW1X; C(߈,aի$dX#s)tX" ^f8Sѷ+Az<8S Ҏ+W&{ES$7 HQc_2f6#V*](S {d Ym/3b ]H_xSubm2>Ȁb#{."h{G`M{݌6,,c+kVhj]6F"RX@5puY%_Ӱ qbv7l8JprGr,;Ѥ-Ҡ\q]chx YXzaEWSmԶn>㥓 ӦɎ!0t6|D@ԅ\'|xoޭ6`Ob+1>Y%G S %HQEzAKopn狜tz^ &kJqpbl:ʒ)]0i|>Z?+nq `Cݣw P@t0ʄin-u~u#uͦ!6,VР=0*a(QνC(mQ,Nwps'l %]O;~ܘ<=9-v 27*?}!xϻ#02ڭӳuzNf/WQ#.ɗ=LH#"5j~! pEDlQ]ҫ (}Z2.Hdt&JXqBy]#2Z Z5I;.|{ `pYW&t"*=˸y8Z *!xэ?~! 9t%W0+rTd Nt:%FC|jy@8@Dlƭ͏dnm)\h^XlHEv)G2#Xה-@jx#m^ }IFHp׸'neY6lTְ ZTBnBWWUjl{«- s^QF\ iWa l~AKeڼiec0FJE:O"o4;\Þf]9o'm{+ޤ Re]ZwScQuwa1+?mR VuF&;*b:B0"6(VoXf. M4pL&& 6ba=!`kwW0pN8_K}Tx;2?f+:;;7ف G?OHZR ߦ*$6FII& ft" 5.JUp#3a9 QPc^o ,R+0E Ԫ}V`QFPbLW2Rd5cLPi_FoYCEm쪃'.m Y^֏bq07V&U8LT[7W#mF+m:ƲM˽nP&Uj<źu' [WnfϙM83GHh3|`X h!*@ mq UBSR6bT'y-c.EŞ>GB'Ɨ*K1&?\9<|n% sJ[5 rVcw7]r!z AϪ$`cWOⓌVku-9#aBˬGOT&7B9IG:1EXÄ EdIuv\3GQcRzDJW.!kUtnnGùZԳsvpQEhCI2da/>%f&KǬa K]Ls/"wĜROJx(v*{."bf˵řna,z秩M7-09"ٴ.t +IM`7Q_<ȌSVFSNK0{<4eI&$5C?e5`H1Lʀk1rd#ɨ37mg!Jr|:{K (^'`#c'88:,n / h NA!/d!z]h J9OUH5yy.whJz tN=h`(~j[sL*Čj™Ik=-}Q_Bx6lM-2Zp$Ѻ)x,-jV6_nCYl[7\Uacg9?6ڣssl:/ ިkNXۄ-2tep{QsڬA8ުq~ۜJJGl3`!U^f00.DkՑe]O M^Z7qW\늨j+ÊXaP#ҝѓMgf2p[OweYr>Z&mFP08xSLن3:޽7~%m a@/*է-@[h5ۅnG0ގ׳ki& @1sצQ㗈my`7,*PˢM67ZMz6zMҨ8itpWJ2Nol=ex轕ԙ}5E8jiFa#+ ay#StpN?]]-TU} (l'" )L L`v ô+P#V KGѴLz:+0!bw`V%{$,#h坳Fkjݨ{6|HGbQ׍ T!܁ꊄ.p~UZX]p |3چCa;ЪkXyDH3g[ͭTRyȀ&"p-S0!MbXۀ~UA#I]Bq(s;Jy,ErJ#:p94(~eNuK-j= W?lI~YA?ӡd0x IqAqǝx#QXx:u Q#ETR_RǴиbc6 |bf[<$ K1瓹d3 tnFq4\߶cF{r'p| Fz[M3`n=Mh􈅊vUfcp~Cc"M͔Spo%n~%9Vy1R Ђj,>erJlGXIidܦz:Q 6ȀIEH4jy;t`aif\Ds0Tt!J*>N|Z=*׏2_B!|6naRea5 .v| وI@ӊUUzyy'ӺRuEƈ[g؝whA{㊽)sTev{Oy>{vZRvrxX >=H50l}D߀E"kԔjp,u%pFCwG, en3e !LB[0omnFb:"͇gH=,J*w+'qr"oj*E5"G )·oƣPR h4FU 'ƩAf]UDE6ٸmIĈxl!řt lyglEv˷ܨo1Da]֟N'Y'RDխA -bf)0NXl.[&R-3w\x8U6ba4t.Tkws*Y\BuUv2bJhVpޢ{#Ioަw$8EyJ(-#JZ__S{.`~HJ@&sEqqgj`l_3=@cKij^ 'YuG3"X mMu5jpU;TImwmj[Ig XV}Ϫi v6&oo;!:Ţ{|;Pc8:TmJLuYi5w?< 7LM\68_edW)@tc;&>";&c;Ke]ڨ{`v1J8(NNY4l S=1dKzeh8j斓4>f!l恷2>k !șy=21A_u^>f" Fu aTr ;*Go^})fb c#z͎MeI'oV':5Z/_s>'Ū,C1dd^K 32GeleVBT8)'dtܿ;-h׸s "\P&B&v  XR8`5v74SeIfZujISG~5Z>z&|&揫ߡ=n(x{h+ |^u*V[(Oе*fcA)sfP5Qkƴ`}ƺ?4lo7*w2Hvf?_ T;>-n !km:aidX ڃ]#5̼tDJ6ʪKCm))x@xwuXUhh\8>?ICJvk\e |'IŀÐj{do7|ya"j~N2SFlȵLsV?5H`g0_{enm.i|[T0G]lsܵgllrgp,9U|&rF4$WjŹkze֌?pBVm-uĪKwݖVQ w{!mUmxx1d1n>5a<=},gC4}A“#% -m:`{=|£gRc6n AQ(+}WT:Vѱ{"d!plL# e( .>bѤ%ƫQGaHFt<<ز 0e^4$2/,>kh1YܯOy'JEc%av8]eWL&/zGsSA`/2}X_ŃǦ~i( p,~{;; ;/^x?"eWH(b@pw5${nt;0hquq*w0$;;;;NcǢ Ow dxb/EN ^${Nr3/}g/t$5vwwG&Q~Ï$ >@doKd7I]h2;#UI^%{)#vvF?`hg4/v^AݝƝSg;;GmT؏Xd㸈&v]h0_!vGpgkۋJXԳktYrHP Ava^#G;/`h~"ꭞ?ݤU>  T̮A-:wE|7N)'| ΚD-ZLmuB[@;@x\aA?=_>a 8]wl+bP ˎkYo֊'(BgpO16dE>EBg3[䯆!@:ቯfC4J}s.]{ F#݇b[Pހ+_Y}k7U;-0OI@~Vb8[y[ }9qCk] Iу)IM"-9~jw",EUL!8_0#{u,B,cLBZb4} ϚMDS*/kXW.fű]x^3jٹqAvn,Nj( CW*Fn{ܚUpе+@㕑,_N UT0x9=Uoi[lΟ.2wk~;g笘i4,+K'RzT|:_ti }c{x^8Ujhf5fW<ɽH>d"g+Kqv e Pu4F[[$B;M{}".!28? T@ "ؤHd  (c-Z8?̕O 4 'd!/M>⨌EUx!: !e|Fj#%/ZHO`d!xURE_~.Â:`$(g@.QJ]]#Ja 3p]>n!bM%:HJ5^]**uEC TMs`5*m ׍)k0JD~;B/}zm-6QH1~-N}L] qs ZH 1ь&bqpT CX𠽥 dƂG~M8VM#&G5F4Mɚ88Q%y#F6Ynb{d}9H1Hӑ*Ȃ|E6"hBxK._/2c%@Co$H$b FFsȣ㽞Ji,<',Qj>nV@@i.6`ѦpY\1ZҒ&!qQLTO! Egf9Tɾ/d: GHooq̹VDLI2]† `!4ԏbK{v25 ⌰yqƤU2>v%(\(XDݛrl}AאgZdm%R _ " hh ,a[=#\G%)=שCa[(4FQ@6;ْFPӜ0V_C#?j1m`շ/bajՂ3U%Gz3|BHz$p h8F,E|G?NUE%GރFr$4CM9 pW?RĝkRrm,r04 7 ~OXk\u 28I suL7Xv TQt-}G"E3f`hcS+7Įk7]JW*@6m+Z,L[!䘞LjWY[^#Ki>7}B'pk-c(-׺6=.j6"n;cxx\_ /Hek4Wn6Z:7*Bmtz|ʌ)z0 ΩM)'qJߖk4]l:QWQwUE (BEie/Keٸ AUYwmĄuB$5 9Zj3Ɨo|W {WH+Ub"Aр!4CУu=CUϰ.}Hv:ݿ(}^*6! vYqPȘ)` `\Wyvب4=D"-!RX|ld_HdxF`còD|G2Bg3h/j|1Z#ۯY͔k¯/HEUNxSx- H5&ރo|LN0h)G$m]Nb( Ԉt|kdQ+$ { 7c ]p)!*&XHF}^mm-#apY* 6 .W $TYWi~Iv7Ł԰`+R#Ng1lpj ۓG&Уb E\8S 5b_$0@g&`>Ԡf- 3C{z ( a-ּNwԈvSmzkf..R21g5Umu $yV"LPI"gh]~wXo S`xuD\cxG^v.I>~γۥyTĀRxq9'b>"R{,Jp̯0܅6 z]ጥ3E~OVo66j/5Ō⠪?j0LA!6l6) $݋v\uw8hNA 0s\7ڿ-N~QwfQkKg˚NMVwXtؤ+bхPQrTNW̅33I zM)VH{Slx,^*n^tSRR/C))_ /אF5҇1^BB^ bRoPÍ%FĞJYgp[PTab\%$b]m ncu^o8tq}jOD+1uһ/ˬfUΙ}H4Ѫkt`B@U{#iB)? W{ 1\x&y]G,uLk¢-PM(opD EIC%r:RJײH.)Ø#/xq+n.L4Y2$:p|{rde%T줫.,li̵[{ctu0pI.V>GxwL(fPK_oS79Z5lUʊ #OE:oGm;,+ɤkCoj#קi'L.p%?Q}պIXR?(z+QP *ERJuO0ucC$4dD "K?kmK!2564W<$v7t$`i$;\pNjHX(pN!f.lSU妪ʊJ Jz ;COPl'[գ_/VFtp+1"v$"Ln~ra#aٞU+ulq] avP[qr]zk/_`övyABUnXV ۺY7q 7uݴܫjbɪWt4+Ah~OTi'c<:azu1,Y6Q+fvBNp;ArUoӚCVx훱Rj; WK6`˙R`: vRJ<8 ݼ^_Dw~S o)z;Xv(9T{h89G9ǺۤX9Xn.BE e6|pfn$tW 2Tˁ؃KO!ղn 5v M1'> s%yJDeYي"W^fKP:E@ @%K42U!qcUV۵F{$>g߉N".:]+eLґj1 d~^aw]?+V)T(* Lt~w B;Ani` n  Eݦ|ya!SojmɭlZ( -qvL -<ǂjEIi+fMlm .[rjռ%mYc0 [笗 d 52,^=hP*w:<aaP$K'ѵ.P d;ҋJ\+>cd9$*G̛Y5kq,>bY8F NYx3T]~>&l;fSÝOmGA{}Fb c`f߆9g1C-cv%`lo.tV99)'fYK+ pn{ S"z8]N@ H\gNؙ5eŪ,5 ̚lU[2I]F /t.U}Z~"|lw8Nγ Xh4{SG9ݧƼ4l Ky ~b1TUe_AN%\D! abAqiE uaui6+zX O6h" ?RџMS/iPjс?ZBs0H->os9``㬣 ,釠ʭɌ1sW : bVr9iO Z.ym<p<#84DpBT uF9^'zpeybue@ %@=oDဇ 96DzhPњ$N]?f)uмR⩈$0*- XEmIv9(6ֺtE2&-=Oeم U2'xe5:k+/Cl -R)~a& /wV- <<ܢ|,b]="s lf嗥쳒ڳKFL#fLL7+{ʄkxs0ZRJ|iE>.W]`V/dbJx N04׵ aе5r#he"\:5`Ӣz~mTܘfR^Z9Z@- t_S 5rT].8uO{U|JKTdT×|'5V;_(\3,|^Nѱ{cLȆ/efW-oHkZ[-3q=TȨ%Q.Id9UgֶFu -c!"AEVʚ OdnC}&[dBE-$(|fR4Mqc`jJьFPJ)O N̈opdnj(JlTfk휫؛4[8"oVK m㑨a>#Jz^D¨ `$h*wyh+Mi?,YбZ(JtyFr Q((`7`ƗȾzO'Ĩn|']fCpARk0=-N J-YBłRcs2 M6(fSBFIlFݠ+BQY#yH7*v`Lu53ɫݰMy/ζ;d7KaJUQ58 Hkpww3FA{ch6Ns-t|f/D\r&`,xiMᰪt:[kukA ,4'p;ihǟԫ=yu[3f^ҳjU g#5`HGC`J2)=% OuQ M:g-W9c +ImrW+ǥI|~IG=!(&DZ|rTco9na'R-zzz#rt7wFl>G,*R\˓%R_G~~W o`Ǯ|*j{;*uJdS⣹ErH]#*y:OG&lM⊼xɜ )[QS["+ixԫM@nT0*Pp0!4FR58}蜑rJOw=X<=OL4o_y2"!ꃆ))%AˆkCY C` J>Զ`ATShpL=Gh^>Rҟu:wt}eX芬-WMzt~>~'9H{џć81 XʕGa?a\8Oi=dMpɶ%ÍK@F4&&DADi2^V @*yo!1#Te&eE%_!C\lR"PuYSC" Ub,&*~WͼzTN '6Ya-6g챹 r&|M>|eH nAOuU|E(5(Aj!șYPs [C(/3~L-b|OaϜe _x}|UVj5JCu=ZѰD`Kq)Ѫhs)EK/MSp(=U\&K$ Lw*$l՜Uׯ59BYdtEBTC}Ki#p.&fU.lŒSڋWToN 2TEcCyXo&dٖ S,Ʒ\XUJ|̗E>%M}f3;)D . ˲1ΐ'llbz%5Cydվ7Y`;_yWmOxl#wuCE|2`כk~~ݞ*[Swݩ '$M+'+${*]ӐRj- NGӴTl>Z* WBtSd 4l/m!TЌ nl@%6T ȑ5>"k[v51l&ؖM-mbx%|t6[1X6%t8 ļ%!Xoe[.רs.(?SF N(ˁ12g,tmO 1l ,S0#zjiQsCy>h |G>kK8C3zK~4Y B]{~Lo֡R%H髑ḿ"c(Ԩkz"tE-6l!V+f 6ol1}Q,;h#\ӏ#6m4w"#eJgJ<m 6=S٬(:1"(19[*n!5eJӝk~HsSOCPgQd|%/ѓUB@EؕN_t=r!Tkp"\ :{(C,x H+ $>%JJ Y)IL$FS)_3)n"&1bΆ_+XgL?[4G3Kퟫ \nlhv1(2l(t r/GN#gKC2LbUysU)f FE2i@#WGW,m; GY'r/r}''ce@'Op"+uwGBȅ6+Q \J]̄5[K{bP²[;m qv̜ds-Z ցwZ%ך{-o_Jo[$ Tͨ ~IzP+/LޛgtrW"7q܃5[O??}ӯ ~7x&˓o(~*0^na8{LJHu,ޤxL8rmtDGC͜@J;$&>Mri"S}dB`5tGJLV Mtj |^ d`toxq/>`ݨRfZTYw0}!$ $" 3|7vͥ“l3PE-'HlH߯/M` Kmx2, y Iu Mm ҋջCҥ- kOT2)(|mPzGC'JB^\ DeAm.ƾFJs/!fH3wt]9U@|/?AdGt`{j\0('9niሴuaQdW=(Bi$Ǧ-ľΧ\p+8{i31w&ŸF)jU1gRҔxE‰.xpÎT7i&|XFTς,18EEfE~"+Z*SPZ=xU$An7bC,%< j䖔袨b$s.0O57I*˞|"FS%a9NAx7@E1'l\&1s;CpQ3ތ">K!ݪ7UÞF4 =Ce+C"dO3}ۚ4l Yk좷 p*̿JXa%Cj0k'a㑵J|G$@iV]PIìh^ $(F~'y \vFCbo0E{W]q 7Ļʚdo5Ed&rwIE(iծw++aMP^N;NLsn1еRH“AcSF*oYp5h?mt(fç'K > y]4zXo.U4z:Xu H_+>9fU l/JВ/d0vlz0 `ZjOn r>XH .v$ ԔN*Kv$6iܸD.U"ƳP֟jrFVw];(]Xa3.1~`9J}0! *x- D{KQPS~X:4 5|Ś9 8Ǵg3gkɵw[W)Qd?dKWkϖ[Q /;n Cgph@Z5cP Q~w L7t.a㹼[]O89&&Ýh Lp1N>q68Ճ/íW7BH5,ׯ2>d{ f?f |s2Bz2GtdusM/í@A^̋ղ|c.PK$HE䥹L d3.min.jsUT SڢTOۢTux Zi۶+nCEwʔNL:BKL$P&Amԉ}P(ZR$2̈́|-<|ʹ,s@NtFb"7 ]C.mrXLA%-QZd/ݶmQÖ{%rrͅ, ||y8^ ZXVθc;?H-'I8W`ǩFeU+<],YS0)vZVZQ1֔Z?^/cG0;gzAf?x"9I!6<7y&3y*y$8XqήW<: }eP+L M\I(ĠKE-ˁv+k6]3WDB4/Vi1;h>Zb%1nj|%>Ĭ~j6n@teWtz M`wzmvA]rdwsR hc-/%h<>lV87 ˱ r*ڵֳVNc,YǗOhVpqeXxxy|*>v]*}tJ[,zP mi¼+An8;rgd-H|ĝ^ # k&ޔLx&\p IPf4z D6 6bUc0Toq$ vMq/sqRVV/( (&b>)a RlޘZa.cE(2O3X@]#Vʄ1V^5-ЎY#D~ӊV]<̗xu]\z Y40V`r:|e'?vp0Qv@ǵ!}ts?͡Hk+ъyz]tlaX_lX=ط,a&0u'1,f7mQ;} x|՞ ޳W|3j!ed:&Tki",ʢŽ8%`gm;Xf^o;\x|ƶi7p, m)D ۇY s_@BYbD`tx{@a[ 3rcG/>5=8mX-سiyxNKHB2@dŊyZg9mYYdiZ-Ton-kOmߐJ_B"[.]l _ʉiE*EqLxy]{#Q:CQbL ͧ7utly>pe5|ю'Z J;pTw)Jx}ͬOѾToz`OD]yV3Q$!_]7,nٜE'*xLWs[[ʦOF͜I bYunc]hc oSfal 7E':#nLN<.auI5Xtl3ҫlFβ]z:|}u~m0{HKusk`uK&| ~ӣcq w|9%Y̮$q2n8 |s4>3jֶ+PCUw?t<B@gD`X))}Jrfc1-1J}Bb& z?;`ZmpQCb5N͹ ( g+|v,&|@ʈ|9ڰ'LP\):xl+(meN.5#Ɲp8)&@'X5Ş Sq >qrR@քU54eu,EQnr[#&ҎpF]K1mɬLDp@QdSM*#ݮ\Rp_JmxBu*bcwhG|!L5J sSY ^xeNۤW?U١V*uBY*dJb9-4<[~n8Y29j-fӦRbEfy2D򳁷 & |MtrɄ t_}.~Ɵ.v[ګw9ڹ۰۪U-PCHn_:8 뜉P2ysJ99F1fw:WJA|FWƫfY9Us|x 'hpe'u eOSt&冏?zTDKmK+30 tH~MmJ:}Qg@.S}Mӎߝi BLE/\,Ɋ.N?1RE]lຢ_)P8Ñq7.q~v:CT*zp8}ÃIe'ɝ+:l*`Q$3gr]ej{+wY}M0с,<,)ˆ|Hʯπ̋dhIÉM!Kj_ߵF%Ooqb E ; ]exj+o6Զ*0_2n9dQKrHu%yy,$IJ{#i-ùܑ_T#f=ھ&90<#ǕӀGAsW ʾe0t(N+2qcbCurz2ꗃ?=>/ppqxOdrtvG_ap]?8 OO*"?@C$^&Dht:N4GC98K56-@WnjM GL_tm:<Op'ѥ3&8J0ئs܅ btT}_+)ţP #zWFĐzRp.ntIwń90)u͆Ol"P;CY8T՜|z$NૌJT}W'@ .%ўhD(Ԥ_4դAxy||H2Tm!~ǚv˙kշbA$8zgǰ10PS1Tx58 Sr#4nKe1RYksFg_gl4nK뢦zw;W)N;x)H.Jh"9 ~&˂pHzI-I>\U(%MT]@<:NAp؟y]W%O*_>t ?t5u9wg JGHG cѡFD1yk)7?%/Rdifځ@哜h +߾ .iL6/AXL(hi믘 Ѹs6 :7RZ_Q+)E굷m:p/))T2NҐ&cYyn nAE\_fϳso)K$42+*ͷN5t{5tٔ~#HX&a4^Dw]Y}Y!}|ƠfVO[SDn>g;SENgCd:@o6F*Y T% HRS]f>%2R믕j4w=>`>]x쪘W;V;:/]?TGvNwD}UVz  / 斔J q-GA-ƠUJI/u[[coBΧi* EiKkzYm `w:ImnhAU "I=i"# $d?@dt2T0>Yq)LHzMWN~B%5)0n)KbdI%>ݤpTAҡ͇|dx13oħ'h"/Ahq({ƛeHxҡ*[`eayçҼi0}1h~*<Cn\}}~lչv=skz<\fe\_/--m[yb%)䖲t5MpϠ/sD2**ַvpB{Z=.?z.t|Wb.C둍1;CdЇΣl܀0=NT~,˼虼v XQ =E|`a% +WTXX:__μ"v̻[b-s968 b:> (W'EI] G BVL*cԃ9T:ޢL`Pi-5\?uȊPȢNf=#BUYŊgL#E]ĊP̭hMl.$11wv\x/[zZ!>x1]զBo,ND :JFꡥ۰ q/$U<4''{Ga ˲`< p(VN?d1}׷C&?&vy>wx&q>x:f]OFO>p0]sW"OEnQJ6Rn5 x$!/[۽p )Iڧ9ӈ7zq6b`ٝ6QRC_!/ٍhy *`=C89jiMmYy߸_6@__P>eeQ p-g) 7"ӬxNg=/=D&~)kpMnV\M# uEHuEX_#Vd]ǺUe6k\gC+b:%~r8t';eIMnU5O*olrAn4]xK4Wr;P} fIA\?G@ȋ /9dZ{ ^|ՌK9k*09Xᗇ+ڑ6#O]ɤf작MyJf$%fzŠ@L)3f*SK!Ϗӌr8MҞɸx'gm 6^%a*@e֘ZLڥ%tVN>P 9bǒf¡2rqZ~;Kb@+ۣx߸],".u1QWc4CڒuR[q~̲^FR*5-3tA9S;ʾypE│0؃s`7P8dJ9j8x2*Jՙ>QGO6| DU5١]{aC;=v9☝9QA^9 r/)11,Ln/^ yJiB"0+:g*ƉIqBM=Y(Xa ̱$ccjcF:0ost9w$UY>&;fYdk \Ґl"5Χgd[ǥ! ٵ)/0|/L3:9DƶC|K:W' h! )ǚV`+_㠘xwBفis~~·^@< t? fl\X|?bsN.5^9jr7?#58Uϭ??)_7`?2<Ӌ ۧX< Ey(OC[C'S3H obf"JF(*gj.81&ө1Q3j.;j3fBoW9R>RZITB^_2-k*^ޙkp"绽+i(: y1Ck෍n3uhdmy:!8Ў?f[3ï_™m7z̘v5!PanA'evw#Ird2IyFf"ifأ="UHlD o֕0>o#P2Ӂ%njSE|_oZeL DKZpՆHKzwm)e2α+C17}XJM fnuHچ^ `]<:wE _2B\W=&G',_6Peg{Ll$x32:cd=lT;;K>HXC4է*;鶏OiPn=':h $xcoXd;\D|]SA*0 &}P싹TcC#r hՌVTTFZ#ݥ +r33ҽ䑵 Dxc _tBi 5T\61q l2ezCu`ۭQ|;xA7~vU(ZfrT.@-a?7U(Gw{&j)kDH6BK1b^y B;xTw+2E70uE!c0ydɰPUk:X 6 k[aE{Q"XߕLZ~M{ѩLj+|"MC15B}vNu"LRjIy{r:-frē&֦(b:ޅD8"xԕ$WBAy PܻФƾ 95$+?E1J^I$jͮnVc+J*=EK0`S/3DZ@W(.a2V乶d8dHϽrnOY0О{.8-LMeGYj1Vώ;~),jZ!PKJ4{C]ONvN9lQc]M[@EPT 2{qjG6l@5<1܉ŁK}('ԅg$o6P̲?#C dzlGm 42#Ȋ.6D,6D3X~V^ɛF_䪋%|_=|׸6 lJ_o{wnqܕ?z.@93E68u;ʹd 3"{귃R*\==wI_92:%yyv)M8y-2/=w{%O>N-mk@m)--5vZO-Tl ։?J+&$kN҈-+!dllI gxN;4̥T~HohK W~F2B !43M Ō5P/(Sh;pCfIʆAm TsmA~TP)Գ3 GT"=SwpFG6{/) Fhyh5`AjZD͟>Dd}mŬ~LJ^`OT^EPfHgtV%&eOqib܈N@~ܘ 0H݈А) 9 6 (t)i858Q-e,Sl8 i!WŒo6̝&-|AYu{8 7rR=)P\_+ '^+F:I`׽Ch"ٝwm}DTDTWnpRR 9GgE-N=3{ząr>Ѩ~k'gI3quŽly)kU"PE߱; _tɑIbFi|W=VG8K5q ~lcZO,تV\o-66%yx~8y+AtFvYSH!"n\(FDPb矑N=FERcWTE-ᚻ/˧Got.XByD޸1`rvwę}92#\l_eh;T۝O V<(RUzu*W5"uH;K"获kTErxRGdN,hTy9^rԠ{7!@IaJO: ݥE ^7TsJj27F4 &_r&^>oj 1R 4+\V~F8!χsP2q*bTS[ -z. PA& k<=_r+0 B@7䌀ppvr[.d͐>q>*V\iǻ m,~bZ1X6>b%zC(εJZDTa)%#9zPsCҸ&7meD+1 {w|L6dy|,\tN&5iHd8>HBڪTb*rH, Bz+v9Lהנ0 'l/z)sS2vL&m8 kT֟0yɽ XOɢ0{,>&LGە7m$ߧv]8I< +q\I K D X=lommJs=}oU7&d+ρTչԭۗah hǂxw\LvHyGGWZ* |m46qu)5,V epĮ<;%/e*nW&}C*HHJObH2t3_̧o>g?M G|Ikӟ[}W#rkJHE(d&+{} [PY HB}ydN'=[i48*܆~F4D6@牰Oefgq; NA{@͖SՎ:d"֊`{sцй3Hu?ȂB9,(K,5sKJ`];z׀kT!EUFfXk$zQEwq;`mE?c/#1 uƳ(W܉IW4yk&}$aW1`>% Z5@g>/ow ZV{F?^RQ_Dk? p Uli MHxlYĻsǞſklf&|!'uIq4$2CTFOBFNHqR+az%Q+R =0P[0U_HP)n}DcE>(1ag9kwb`وc$dbJׂw^8jY8cІk6YZȹ,sizqGGB>Ե}gA/Sr00C.a|VRKm g1hEGtUgZbmY~K'`?&R2UGJ:"(vD0$n{`C Okq)|T:*Dțλg"';.uPN ĈoۚԩD+?T5,bQbE Z!l M7tؓ᧵s~!,ާ^Qi\FBE <^k@MW6YktWnU֟ Uq:ad>LLhvVL۝bBV@nD`xm`КDYgIJ i% $fglm lx^'I0+OvG{^ܤspI6̃W򕸯u(P_"0 ҂-Vi ۊvҚJL;:i?$qd˻^S"@'SWh^(( kد[ִp Vu Ru[<v9gi pI}bob6k$oPry"ˀ]T[R{oԈy+pw=z 12Q4}Hk4T=^C .eȒT$mBe,w'`ϕdb[qU|١+oM106_v𭍘bRi~lh~G' -kv0jhmu^ڟF3uOQSƴCzLyl#<,T8>O#~jNa_>uP|4j@=:lnOvsi  RfOk 1{3!2D 4iLW̉ƚt9dN9I҄:K$Rۻ_mJɘm} 6[D%xd {JƑU@Ic~5#.=5$ ŗҧK(NdGy%Q6ML- & dԩE UBF5#(h%ArOE456XF990rO{qErU4.ʅdŚ6H#FD-Z ?"%Z%ȪE?И%7aVf&yi8'4f*z8(]:7 f]1 Ŵ(Ѕwd< !) D)xDOzqjl'&Wg6fq %~tϯ ٔK O|fyj.MBrWAYj<2`1uiÊ^o%Qrt]sŇ "w+X?" 8s<9ޖ FE+ovoDܠ~N ֦ sQ0&V !KV2m?<ʕLU(SQESEqhB ߤa'XΝpM\8W^5t{ñOװ;\)?0K ncvt-jAa k $~ڢ# XG`bh[9N< |gJ?:V InKBۭX{ZEzŋ/|gr>}0@aR&LZ>:-GY9*'3'K /C9m%mvxw_v^P 9u حiD6\uM+SJn:WNtrjXb|_&FA RX_lſ?JP:uG֙K=ǙG vGQV4[Òyΰ}IxgIe{1ZϢUlLVQrh'YK ZQK<#*V;ZF焘_D< EpgMt ?2h1ppj77|雧N/[z?11=W]|}uuJTхk9`M18jMC7ZJ'gnt&\r{V).sE"T*!ԸC%mʧvT0uZ1ЦLQY bLU1יr|_],)P5lڪ!k|اN n:z̜ن [kMʼ~uEu\Piu59Y~ssnpw.ں. 6)u%G ) xURUkL:}'iWBNјh04lנJQ6;8Enz=fB 1ܐjNKMi,ɩ:lG&>O>9 ´eSg ōh}pw?=Խ~(&5<+(.g%.MCvE]%lBvq_?dnBz\-d>8<4A㉧/VW$UϢ g{ytt6xO^O}5]/=|}(;gN|o_6<-)sF_W֗GO%<0v1+UZBaun~@8:h0Mm+SV ' >?5[C:0KAY;UƏ=[҆{|1Ehzitw9i!^ZWxh8] rFT/pC+#_BΈh|w@0 |9bNB 4(Pπt)(. 4]v>V0FT+8pJrȪڬ՘'V#H3B-7+v\ I֨:͔ݱ;2cr`}a3= l `߫n)I IwqzU%fe}5T]y\qj=|xCmS^M윙:#?=B!0Y#׃jlpLHg'2NM/5S]g26v`,#h}c X'yYY`7e0f3f6Eb0,e)٭G E =sN~ {IN苣yF>;7]=t5FUFMlkiu`ՁVHH㏏i"H@%xi)ǻ" `W4=xRgv,Pڀjw_4JylO.~@5iF32 9ppLVސreS.kQS0~XiMx^G!:*ݯ;b/⏐!2P@ɱ t1~R5Hdh+pY)ʟ /9r#D5۵7MfOzc|I˲Q<-ǓQlj"YJHy.:00s/Ham+$˽64i³+Ċמ!\gÁûtV{v_` 7O}`RL6/z 4VǬV.UwϗiWk ဠ"}#L:Fpu2k rEat"lc~jdҋc:۟7wToWc[[Ȱn. W ^d-}^'yX5^o®62ϻ`Et1X6KHsNÛt=GEHe\+wA3&F]*7 K4uSnguG! %үGZG*ي/WtMZg-@nox[A/Y5!^@nef/=%OXy#cTm!}ɺ0YŹD$Zʹ}"yjb*)5oycž+x4||{Bi]Jzs6(@m&*g_tSTT¼ci×y]86DobI^ыfzq\ӽíUt+1%6WlDݛ9Y^g]͕ӫ$}{Z=dU!\^lLL;1BD8*GvuF| V勣:;t,V4]LØ(5@Ƴu.{~ڲ7\#B]NZ%Is(&XC..cc1Q>'v-Sh@CGΓ# bavp e&aQ~dHf x~>Oy C [ \WpOW1#f#TB`3hڢ ',PNz:\SD Ϟ=Rťq*2B]_-8^?{F+tL @_qʈ * |X2igL𭻁 T2zEBƗ!5UB  17=g.8P=錋UjDPQ0ȳ w5~ |ҋ@uƏs%8@Ksz%e: +h 2 X߶ڔ= K?.LGJߙK8/"*Tpt1IgUpV벅*-d YS.#SmQ;Kg/D @[1TUeu@ju4ݫro;Ԙ޽V?C4BT6 oX $ݟwߍ)TcejzjH e->okmRgblIaǴa=ڏmz]$6BC|wSIͦWbKT^t4].?ֻpki#<98Pk,UD.< w=܎qxk35 5"k5N&r o{N-Um̿h6\t~ 2x~9Z_yQgl'ݱhɺW}m\L%B}ٸf'%V s92v: ʜjЅeZd 緳0߹:q]-}w3J2OG@サ8V]^j>LՑ3*Z*#V4'dz}\sfk2:˶*e$4@oEY(O./Lxl7UA{ZMsy*ぬ@+|z9hn/b*§ڙ%o=š5<4O.ޯv QUWB:KnV2_e"_>tؗ :}l|[^ݴ\)q.=y X0Q'#К($t^;ΘN_&ڀ:p5x,jGSKrFӏNllh=:בi9n͆FXG%8 AhVd+W'Yw(P9Nqx1Xļ]]3Qߡ)đ FS#QPb<͍Dl;T+\ {`8P?|-#r,w"7=`+|u. l+t!+UnW$֜rh*4,fC ݴ"iILU4=j G"7!gÔN8 :gݡE<汧 5{[ZG֏WPGNǂ9^=}t\w+FTHKaʦLiiQ,j|ڻMϺa.vWeqT>0-3ֲ;JNFߺwWhG SA ;(Ml9\ᡥ`̑ #41u2&\,zZaNjtܓ:PDg &aQ Kd.%DO8q R""!h[=7k(X9Q(PFtH:Y<,s~ `Zza˦`OݠGnOha?ʓ P%t|I6LsIjC` Y}lp1D[9$8Z1mp᧐Zl*e|ē?hRT*Oe-fV;=t=й"$r';^ JQI((ίk1 z%˂3D6IQ#(%=;!7ԬضfͲ%uQAl ކmV{vr@[ztl=+FtCD45[LK;|lͭʁ.b1=),%S%كq HVa\].z6V|z?ڌ |@-fW˦B͕,ꞽZԭcNqzt@1TfN8d3+o5^ G}QRujQǵ[-!7+{Yݪ6MUTxG&—:|O߯ѵ/'o7+G+<p婯ƯwpJIa𤭿̐de7aQ<~ 2V-ԗk_HJ!qyO@>==CoF#{k[nl.hd8]mm,&-.J0&SѢ+M0L0lu+eK뜛@ ~Yܫ>UK㮠=·f3CPV郶lBǐ`ʐc_0?p0B~SIG(KC[p4dM\rbTIi '`8=P.TV\B ReH $ϡȊXFIH sKcjXU^L+Z^hٙﵻN]Z? &/q''a}*7懝b/M/봵7տNx3eW3Rx2^Imhk璟-Oء,&)X[׾pa4.1圩))e-z{/ѡ=x> 9p cAi9f~|-s9?Ȝ##*tʧ!1 #l%*WBǰpU0$ȁA+#ȯv½j C##⅕":jCԬj ?'XAq#{ U"[%["[/=0E*-Ak"-㰬n0-3m@۫86ZK͘%z {\q>7ǯ^)](noAy;Y2l/m15I}_>xwPڛ[[K KP (lrI؍w{ڒtMO憐'ߓ'p+e\='IQRW,'A?H?HbߓQ[^X{4agj/4fM}u_}f :pMBzBB]0B)[SkÙ't%O&O r.?JЍ%Y+vaKP*t8!nzaD&^?YZ0 tih4][2S%P@?T۫$Ul3a$ek~\E NE{.2ubA*XM "xJ&4 FފVTאUБRb =],XS=,'CSĝAP"Nl} _w}6 &wfD@-&n3K5Y<kȘ0xLnf͈ M`H0J~㟐 Yv>0F"'Ce끟T5M _۶9@أιh!m1=:=Rkxpm]k~cMp{p-3J|H[Q<ޅ{nM o`iU&=̽e+;lrxJXba#bmYn2n7n7+W!vx)cs$u|D4 e6:%&gH /8j] sF+1+!%XZSIŠhhs`RzULs5}TPέEU]pӡor};:}U;Jӷy 1sRJ|U~š+ߐ ~GD6L)caqŋ//Xhq>)-'Qp 1= pR9yVOcFQ}T?%M όd(h|YY{Z8c ̘Kbu8J…llE2Uwd69.{eoNB>ʏ$ɭj# rE@?n|p0lP:2`"cW/yaS9 aǔBѡ>GRs2E-od CYFκS\|})#H )Vn:Gcg\9^~X3V d-=lPWg*ua ̦X Y]H6KEʦ~7+Z]hVU\꺓I&Td*xc\ zȾ+D`N'3\ԕ)/r*1bg}/wg;s.X4sQ"X?凔kEe`j#-E+.GY"I$AmCU53=Mh9yv6awVhk'~i #!1.$e#'eʘTɉW* rXf4U(͚[{ʹ}./m%ǣPdH't:Nww1Zۉh Iis@rzkr4 ')&7OQjd.K-qCwAkxR_l Dn:|Y6A2UJ!7"S,9gw^ :_p:2o܎t+e+!mABNum<>ÅoVfzk R,>ʑo7ҬTRڌ mX9cͭ0)bMFU}DY;7]ss_kИ,`%5R`݁c* ˠbdQo[S0([AZ>ʜa`l]IBVNrOJj/iT B;vz-F|8p22#Ruc%(3O:FEV ۞yiZa+-WVkYoEl";ROh~ղȠ?9??|zwv[qq(pVTVcq+ˠ>a9[pk[Df !/78Zq[s~l`5s}rrHͱ9㉁b*==]NY`+]Oakd^ [Wy$]>}kfT믿W*. +jn(Uښq8;.omA(bbVqJ\Fa1/qSe!:Wx%6<\0˄Vbo?%#&9nel܊ۨ3,Yg==[pQĒqٹÃ_"h 7^)w0t=FP,U2.r!ČgKea'Mɋ[Ph*Q;T)ߎ<9fK=W5A~vXhv^꽜!0Q gf~x"?8]vۋg$5Nk^v|-׆4K$@2Y| 8E`/w{fj5B EyEy, )d]Vo4hRUq}VkH̑y̶?|{U| ߟ3g\oZmBԫUb;rUP7{WKx{>w tPOW56{cX7W:8rV%e7+ EHr%pPZ8KxTU30b.nHlEjRܽp¹.7!?^غްjho.aUm0A)mų$yB n' /y٠iMkfrLj/=4d5[uFaYScv)`x4UwDZ=$-e&pm"j\PgyΏQJD7v\SlkC^62;Ni|rǝqKoX?M*oKG t,ű,w xx`3/^0< LyWnLX%R݂'P@铍"+& -nKxY }r)0-**C:&(+-qpϝԟe,nf/JSp,?,-,* K²F]dC}}((HPJpÓddMI]'V)/H~v+b``K'To" $[%2м. W}ǀ Q6eЂK ^tcl!J!ZU-_| z D#hӼ.<32)Jh!$MՇ]7'EZ|D@!augBqCI@cN4ˈP"ZߙK63SPR\ Z-<| ~ͳS.}ƭ2kCAmν+ŒtOT8i߇SzPXxÖvrd%j Q҅W[PQg7Pԙk=$AlqOrR@\!)imuU$,U$i1sqhrUD\5-ڎ,[C:k\f ҎF~vN,`.#QtL;eoðCz=2Uu#nG.,XK9n9pGrK.V-C$~jr-Y$OKΘ:Ő:S 6v"NBqU"(sya=gHdp&gR|-~A,oE?.} E ï{ՠOzzw\AU2+'ğIRw"Vd7ff$ !W~ O휶l7g3IIڴ'o&vmA]IEb.swxb: @xϝ|LÓnP݂岽dhob7ެ="(}Ye6f6ցTh/:~wy^ Gy]#wÃ-8`+}bi'hoDX+KV圔^~#e[Jlͮ=UnppHu_J~#tCw d}\#fM%ec,Uc=+Q 9 8NxƤ r4'nxU[!sy-u2i_@a%5-CW$˿;83ަ'&e/ߪ2'јz9=885 ]<Ѕmhiyx >t!T|+Zº'5/%5+"DH[:,{qN96d G #4`vwt\VK*&,Mnh*ê^ ,0~o-]/YwY1}y+s8-7&$X }I&mu Y.@s3AK ִh#m!(Xc+eij<^ HU!r}D[V耬^6t`; +{spPҵ# NL#ة`e?aMǁC12SﲽtXN9 Wʡ܇ <zmv21!ABc$+vb uu-ZN] *^!޹-XweE#s6XOEI3%;]pΝq3=B!u (E^1e/mQkKvHOϢ&=&ÃyZcv4?" ( sSamnԮPm_ V)uo0xK\Smr,\ E'daQ|iրnNY{884^'N\Sq c@|ǀ--/41BR 1/i| i\A)EW#Lg+wVr|,+#6.G,xwG}aW{x\*F+ yrh< =0C+7{wې[HJJG.Quo F[Ҕ.tyKo T;_*rЫEܳӤnE'Wʙ ff~wAjƿа˷wr&[۟$hckNԨy̐>hsV|9b43UBkUc#Ј Л 7z:wA!Uu:Ƣi!RXkU;afO)~KknV~TvH DIh[iWqs( XKBRvT}s^p 3 Zֿ%Xct/?NME:eҬ!}, ?JU$]E{ˈ>y9JgikW0w&4l:D=F=n[թjmwvPR*m|{N?S?\Ar"{JMYI|"˛o څiohQBĘ`?wf+H< <aaѥ F۵!0wy< qMb*k*ñl'K!$]$~|Vk#Η&F{Ɏ]>;(|e_ޕ^K`\)AKsZX 3ۀHvJw*\z6)<@z+Ng %9=Pe]HX)^8_,?0UH~Ldx.*z!ϕϼ&-ð61bȬI 2A2 -@z` Ugw 0CAكHLMbf) d 1yQePIeJɉc[=@`RW:muezg]64&4U iQvaBmڎu-G&m&V Sc)~n 6 1k ӶH2J8OE>gm"B{8$ 7`oac،J%#AJkݎGRs!= X2vkY7(eC1HJp @X%ܮ)Ka)`XݞL QUӵay 0+WD]ɆY]C$@+g0`fYM"]Fᬖ(ؖ^(qciE,$V2[86cV\{.dWkt;pO4cB"$|m(ȦmXHƔx jrN#ev]*Kriy(cIxV6z[!4 ҋ70ŮK PN:iC( ~pIigA>lB@ZֱE85SznM`&S $Ak>AvBklr.L "\hB*-,h+ϖd/.>+u3 bm9HYԍ1DMV Ѐ\~F~ A%KW|hGBF3.ЏfdT6r:l-v P $ z,y@#u ܐq>lh2 kzDC4$JezmC]@; KA&K&<1c,LXH&)E:TFoV˅{L  ]NyX9M-Zu "14^9RFyϊ@H1u2 X(i\@gY^(y;޳lq/UKD\W癿hxY=>#g*:E(1n4WwiFO6Լ ;~},!Z񼹎Lpq:azo|/_|@9UC7dDe:BvHн//m5Dy^r2 7%rc` whnG^VlFqUA1 mC&MU2ڒ*]ka- e 2Ysq MByxI.{q.*_3um6Cbd*mIULc7xANՕ8صulϪfv(dLQNW$ar:dI )zX'G"dYRQVX,˿ԝ!6[{ɳ-PUz`||wAg2/Sq|r iEYHb7޾N^f2q?^)"4~0=˨!olIL&H?Xnb|b=ҾKR4"&M/8[!^O)-(o$đ%0>,γϣ F{2(X#/(`}%1} ֗~b ˝hIl%'Z^3)~E}EQ0hh1~ >|t?%~{]4*އw":G&}wօ8M^6vdXAl fmf57P^t}R+D֩(tVxgQp;r|ڠL10j_Fv\> G@8Y^bǕT q_*c-TO'pLH?_yGm?!eBGq.MaD̍҄3:>&G)ۋt@r]D$rť2`X&YSybN݄}$o_߿s}4J!m%}$"(jrWǭ'˂ANVf\bdBR. >jC7bwV" D|)9?֎ਜW'2U%HO]y4!A#(v].4h•pRg壤LShLX&PВTiqvPRդRVq9$;֩Oyü᪒}j{\r}t3eMl6UU|,?(Ӓ-TAkY/JIU/7Ji-1䳼! O~Y~h` 溧lDG4h;y(?ls.&^$nM3U,O& E2+rQdfp>T"̢)XdL<eş=XN9䋂 X㧨HemzS_H&eJYa:YL$ˢIT t}NX*x}o;U*>#cOJ) _&i5Soe_x1-g!~m'M|^D;sRD$sUR$MVJaPx/әq(-](qɭGQ96*%\L18O.#Q@!sAXEx2E嬈P'^@=~.?w+"θ pFXrW.&;5ݡc͞}iIJNuII"SEط86T5BTa>:0 [ f l%6/eA_'#oE-Ǩ-旷QLC N>FgTOΉf'Ed /X2X!+ǟA$l$W6 ɛq#+G\KR֒ Gm 9uĠh-,ƹo\ Ofl܄Zͮjvӟ,g'EF] B2+ջ iBZe)J,e,J3*|/CO1 ր9 ?r\z2~_|yQ*y<ȧlss$ow)T>H o. yIZe10o{LuF?+S~WkmIF@5ND[B hlvSE$7yA׸m.5sFD8Ilj7{N\ukt wҼ$5+4/e-хk'2 )[ .XAC~F^KF^ cFct^6Fr% tNi>T›;ރS4\ay3I6-y .bP~@)3yR$yZ %XLoX2G3?-b/nTJr]ԓn1AU gZ&Îi tޅEgD)oeb|> ߚ*uV@ WW^24ތ9{Q: ^D(xG(1 G/WQy?F %1'EfvRV%wy(꧈A#~M~K;c"ϫyW& 3Xtм p.#v1ԀF ~A3(~:<#iZA]~U_l]r̜߁\{;lzEX&sh/^eк;Grč<$VdХ4nuϰ8ѠI~vt$y%7eTm #S"v@dA#I6*_[*JޤI/6õE, Kqg-WCe((ԫ*n#À-rm`.sܶ iLcȝuᡉ^Q|"4J6*M0+L%XJ>lޗQKGIgH7i1+Sk2%+u6k62{Eǣ԰y && g5V\x@F;( 2&wPe?hq۲2aY?h=>n-g/py4lSy$>+Povoag>S"otWrD>KJP 6 o%FADp_dMin0CV=-HaD%,!*d.UvU7`x܀# E\'_@ߑuMoݓkXL=uI[њ.]GWrmmyv6!\wGKJWTz!{:%+pHpㇽ?AmL4Zo)+GEaǐc7tZFmUiԖS:N)peZO [%5]EY@[ Ijs:x;} Ѱ4FЬdO.=wGHhԔn{hK1moPu j:*k V6W_;t~{y,6n&#㹂[<[B 6K/7)PM +h̷բ"_-S/7Ji JiH<͇H8O*RWިVd6Vq[ӖCT]+io3Hng!+-HV M؛21[l&̟҆XlgNfk!\gl Tit kKe5 9YQa(*%*;?K˗bb Oe:HxlZ5W)|Ȣ,m{OQ8GFӪ%–ҋ4ś#fm%(V,la +RvKyw˦e,Lg+O=̜m /9gBQFE6zEQƘ/\S;-!tqCE"  lcz˯[ʟϐß ژ(Bv-MĢA-U RFPip"∶kFLh[ŔОG >! 9 5CUI>^uo9Qf ʨs7{f߅-Exx=טT!p }օ:o.euQ(m <˩eAv\#PӜhXr{{I Uf+I9:U4uiko27.}n[P9o=n<` 2q*s SFі?EΝ`Uq:}j8@<'9m_&~Ԉy#>Ջ(d&[]{]Χ[7t{ꤢy{nd*iТ0Z>Qt3I34;Qqbc6ѭݡY+<":y9ե. OWE%KooOy ~rIG5*slj_aXw uX גu@YGiBbnCHH g KZU@uzݓ= oAړ  Vs (@`w|odtg/U q,-x76q) ^%󴟶ۦz'X)'E$J!ǗOJk\!OÛ%yjjL9{7hm?nF7xoyW:-٦*Kyv6Z^&9o=rq9|G[]fsݔ2,?aij( 3-$4_v ?]kg7Ywj[e@4zP.jX&ԘIyS PE64M446,V@v̞>NrhpCd8W?tٴHcىbn`כ1ljY|jȝPpcgŅ;&Ц`Q, )NNgp/gAf&M,5Y$t]X8б#s.T~赑S@8ie^n_)ڠ1617bl7bTwy;93?6`-Uw=F+;7E(q+]!Z6}wQ뾒iꇍڋ 5 _9gl7M)Gw:3#Ý*ܒs;[4DZ[H̬ f+̀FluQDMh".gAj{vlCDxaq-*/FT_ Uq:*dgkvX޸Nynfc{"C^r+(LWdic;cz䟶IqCzL$A|q{Mq4ZQC~W葴,|xmԓ510IaH˩9e$`MU8?El͂9dQăYH)ZeՆ9jӦkD;̓ܤ#ao-D>8d9wDw( jgyˆ7ʀ (8IJ]db '3/QnS/4fE QZLgG֘ a3cƽIbo8AQ@/aOM *^R"J?g;ojUfĆ&9"={".=툟둗ؾGްrtjZ] m5׷ 7frdDMJjq8#; pID?*5E#qC\[ˀ[?fy;*)>2@"(:>X| 8|P$їc.Pأߩ{!|I7iZM~t4AHd")2-NWL#,OyO*-^{ع 6P%RΡ|uGPLFl8_L/"l&a"FX Ce)M-vؓ Te !ӯXnnNM0/OP^ 7*BW#1w6ºMQj9'k#l,W8oYceNOO1-,On E;-EZ?p-r8oz)y0ՖTux5GZa>5*b'@C,`^1L $wr$꺂՝20.`Q$4l< 8P 8@ =lp­K F32SLxK߻ɛ~A?'@!X "[~;ji9'Ctj˹cv^~A$VWY=ygo)ϱ^Ij:S<\lsVwם)ޚB mZWukmi\oi GR\XQaX'\:ʄtxݚ- v&_lpLXAqk6\ a5N`abJ(:qա_wƥ>dmŇƂ6,@א`Mp>L5EPLwMý\!lL q@lhJG&l86H0./&F*UyGJCY BYi-PlB4۠~ KnSzڤBP+&W+PiS=voNMPT" 7eV!]a!73bgJV[+L^9V#?Aڢ_+T{DatIC5ĝ#K4(ǟyJJק.tNå%xepC}oi2ݑP2ឡ2Rx'y7IǖP/CM%q 2H%m]\5c'mRY x!$\M~3]`jZuY%p.JՑ²9 S@M: #1j۠VzvjWc7ګ<6Q:c}̅DŚ_CyZiqpP|]GXtSvA 8ǯ.VZU] *'rBC+F12GJTh$ara4LeKA.m'dKYV,_wߑ_4 ;[5-_y VT=8=IQ|CrRM*}lEwɉ.J V${lR˫q#~&P} *VWIF ~K]lYe?W|]7(Ac٘Wf P0Jo : M"OY7rC];-v3i@>TG4`^3&2x-QiR\帐/wk6YBm6]N#|Sw][q6f)5}YȬfv( DYH2RGB&X:9*'{vc@c)S8>< =beY/1@<{]bdtRĐCMm,5_f9a I=VƑ҆8>Y.1מ5d֝l (7d!ZF{DhuǾEhaȚ7x:[iKfaWF䆋J I@鳅)޷xT`Ҹ٭ܗ*G9u'h~}T& 9ͥ,,9.e:0rDLd*`ż˦ ox2r&cfs4?r[ Ѥ N1 З3-k s/D} gF|| [ a+2xbXsD@y:GSorLlO=@ɤb]I;QK 4wO=? 2k} Ӎq.&`*>Qlg =(K${9#{ hY.q+64 y DۜC%&U [|WUE2->ɭ6 \)T|4+WqtqЮ^b= C!w_YxwwI^vdo)iNEiغ` >|5r k%Wj^ƺy@jB=n $rL/_{bR%SF>F%3rB.k-S1;t[ն&A>%j1+j.Х4S]1=f.Iei2p£\<˛ rQI]]ܗ *fUK7p csOs.-RMTBֲB./}%(jWHK-ėujط+a8;{NB(X6b`[j \5wAcMf ,jiՖV.WiN|iX8|$H)Ύ!?:ɽN?T2cq(Asz,aԊ/[Sj~qɳZ]SsFY<=R{$ 㷘B+&0<vhQl1K>-Rg>[˃;x@.Tm9jFEټI&yyUVY_H1U]I?% $K]r>EJsH\騇 %^"_זOQ9"7tЊdbPD!ʬY H?+]Y>;˨%-Ҡ=lHej6-HhΙ'78*70_ۅ@LaVZ~ivu=6 ItpfYI/S7s.nLLK`p.XYc+[H80WͲ3(%qܲVxe?F8ҷC풢}\Bv]Q"y#x49|;6G&y.guT>@O`txN%rW &t2g]_2M-gGu$gzZߴoAүo`׆We7qߨËܐзC6 I)^tlW5w1s&Yl9 e*Ks Ŭ z(v 2LvN4v5ɡ LyAO´Et)8/&PiD6b+|( ggnS94pXZ~ |gbb5ɉLs+i$hzD,{vM[hhXfdB8@* mO4$t|MGBEH^7zFz[O;'&P5.39H, OWkNQG6ѿ{Glx]Ǥ#%CJGϨGD5174G"y.`k GEZV\38Xj|V99;0ϾJ['ΡdF>QK3S2;̃XE?U'ZIݫ xVqT no<|M9LՔiw ,hˮ!_G?gu}@36Y+0&Ql oYXOVw"n2Jt%O&BV);ɯd< oD6ުR(* Sz]ё+Ĩ5mf1(BB4|5B47G?U@;׊z0l^"D:͞^YzunjG5掦A=α@G[PF6^iF.4RQh#5oAܶvPk9sv;h =6t;;v?tΠ7Kկnj=A7E =s ;;4mv ,tac@83cCz; X3bC6:vmC;36l;8C8twn#cv;}x0}wv`9dn=l7v 6 mPgI|bktCNױ}6ҷ u: t3VXd9tN=Ny &~|(pOKۉ,~[U<]%ȋ"XTfovX_nT*uY)x y缕,X`ƠTZ$ D_.=}4#I!+_,'!Rݲ`L "h 5;`+2Qs+sTVKMT(V&~{ %L78^sÚWÈ:ʭI|j_eC+:PqY^Pm'ˢ5_Wa^VTcX֥r e ȹ`e @]/+7Y, 0eB e8{"(WD`+?zJE8P~Pr>eb re0FIXZH^H'Ǒ˛|,%+!ǒ4zWZmfb^4xp"H03fi;wD%a =5>"CЃįd_)j!7߬WOfK^d֬:XO#-\?x0п,&|)i}RژUx_;)_qе1}f?!u)|u ?alb?}Vϟ3[XgE }3͍.\^N.ҎʾA:C !J(!k^KbU##M @P!B _zjKPu?_J{"*}?cZ Mgg˃R[J_s؇jC20bVK Kdžct_h|حЂNWLUd X0:t8ҵ@{ ЋN zQҫ=}ŪN!e8:_O D8-j̋GYgԡq&%Q *!߭6jvM81!BA(|&6Vnuse(f{4 _@/8qEhԵ4 6]b8vP 3[]r5́G#v*g7֑"|).7<>ُAY>O6zoAQ;xl"+'M4P nOU:ko9SmG>l8;D^ӫȯQ\gOKKL8xv̔5YI&'m3Qq2eS>ɷz}f(y%{ IHuϼU0=r Ԏ65y.]_#_{eV]W۸W±)ޤ&gn/v9YIة?i7lqXylXi4F3r1L-զ=#>^2}v{?N;'/‿vʄI?G\Edr'r9GI*cSOiSigy(TꔹG^RȻז`4hL_oiSwZߠ `YHS͜19`a;۷t03Z%gZo!fTqKqO//K-?EDj c^_Il_)[! h9߲|) f&g50לݭ3ky@)6 ML6LyK6$ʡ%9#"Ӆap¤Pw~jZxblE.[#V#O9f9 ,ty+ǼˡVdLU|Jdqs*{qXh*,Quը%*a¼Z"U ri8`Dи4 */VK&OX;aP~N丌(}o5Z/v7 t醸MQTa6߶q>B.9;,7wܛ]7FUK7`3[u}:s$;c& ߶3:ЂP愁\E2+7)ѱ}|(Mc'?wLn'IQO#uS 1|ic%1HcAW. e3L>ų(KM"ɻ6 %5<(l:^ 3JWZ>|淿}ML]5<:f{rm*gOrVWZkˆ+P Cሇip2$b hδFH#6lK^W"7db(FRaGxE\T,ݗf∪4װ5mM.;^1iS߉iZ%R;YHv+<.٭䰄S+#bk]{@d{r{jhp\n0i*=w-^G#-?!)w!^XITz#f ϲfk55v[].q:1cxb.MA ĸ7QgX$Ejp/1C "wIVW q[[#b؆9 <  A=I+WYrUI_PϮfƽ> #u4+ć],#9snB-V3΁Y64Qc݉UX^څ![II?s̸̬ƨk.^}m8?lx԰yVj=ڀm81}a C*t'aS 8B[?muq. beHY]Dos9T<8ϓj3e8 +)tPi~mV Җ1|,Pj )hsmEcNxÃK ;20$yr^h_xsh3V&Dh|jbƯrf3~&najuLm\OYYmғK"R$at Qicg^ %ɩyw\k~k}8B@i/h[xú- -~K .!1g㻺G#F0ȏ3"!^;=Da-icnALOwnKh#ľ C7 &BZ %{zƮ=Yw}j?v:K㉘ya߹ /oC<CJtǃr2`TT㚤]cتܕŞl23'0Y?Wb;cbY2ǥX4m0 _. wXdH2>|NDa.C+h] h!㞱*XN Ih8}l@ ]V d#~J!/3VA}9<`<a 5?ΏkIS.ly()Ki!yT6Wɑ90BNRAc9Wyad`PfrC'/9he~8Ƽ9mn6懿 G$rX9:׳mѻӏՀ7,`f{]ע(> jZ Ea&UYNQ1%Lt^`(`)Ͳ{߉ޣLkp&xf nD5S>zQs}er9s'șC@L*+s0&4JxmB"ݷM`\a3yg9_!/^8>=A5~)[v"(NrZ9JbT9hz=YS)c]ɛP~60QfADמU˕~~"󟖲n#"Pj6g3EYgYn`ꩂW e~@%s/} K6sq nᖬ0Oxֶg7EUcAG$|Z)jh%g༯E`gVزqaB[#맢 ypO@ܡ'`P%HHgyy6| 93ɓk~ӒY&eӑɺT'x`@ 2r?ICeѕd"U?u][[NG}Icbu n$Hgel3N,ʽ}ߛVPKsE=]LICENSEUT2Tux PKG1 'Ed3.jsUTUgVux dPK$HE䥹L -$d3.min.jsUTSڢTux PKYnagios-4.3.4/html/docs/000077500000000000000000000000001314764422400147055ustar00rootroot00000000000000nagios-4.3.4/html/docs/index.html000066400000000000000000000040511314764422400167020ustar00rootroot00000000000000 Nagios Core Documentation
    Nagios

    The Nagios Core Documentation Has Moved!

    Documentation for Nagios Core can now be found online at https://go.nagios.com/nagioscore/docs/





    Nagios, Nagios Core, NRPE, NSCA, and the Nagios logo are trademarks, servicemarks, registered servicemarks or registered trademarks of Nagios Enterprises. All other trademarks, servicemarks, registered trademarks, and registered servicemarks mentioned herein may be the property of their respective owner(s). The information contained herein is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE WARRANTY OF DESIGN, MERCHANTABILITY, AND FITNESS FOR A PARTICULAR PURPOSE.

    nagios-4.3.4/html/graph-header.html000066400000000000000000000015571314764422400172020ustar00rootroot00000000000000
    Host {{params.host}}
    Service {{params.service}} on {{params.host}}
    Histogram

    Host Event Histogram Service Event Histogram
    {{params.t1 * 1000 | date:'MM-dd-yy HH:mm:ss'}} to {{params.t2 * 1000 | date:'MM-dd-yy HH:mm:ss'}}
    Duration: {{(params.t2 - params.t1) * 1000 | duration}}
    nagios-4.3.4/html/histogram-form.html000066400000000000000000000100501314764422400175750ustar00rootroot00000000000000
    nagios-4.3.4/html/histogram-graph.html000066400000000000000000000127131314764422400177430ustar00rootroot00000000000000
    State History for Host '{{host}}' State History for Service '{{service}}' on Host '{{host}}' {{startTime | date:'EEE MMM dd HH:mm:ss yyyy'}} to {{endTime | date:'EEE MMM dd HH:mm:ss yyyy'}} {{statisticsBreakdownLabel(breakdown)}} Number of Events EVENT TYPE MIN MAX SUM AVG Recovery (Up): {{summary[breakdown].minima.up}} {{summary[breakdown].maxima.up}} {{summary[breakdown].totals.up}} {{summary[breakdown].totals.up / getBreakdownPeriods() | number:2}} Down: {{summary[breakdown].minima.down}} {{summary[breakdown].maxima.down}} {{summary[breakdown].totals.down}} {{summary[breakdown].totals.down / getBreakdownPeriods() | number:2}} Unreachable: {{summary[breakdown].minima.unreachable}} {{summary[breakdown].maxima.unreachable}} {{summary[breakdown].totals.unreachable}} {{summary[breakdown].totals.unreachable / getBreakdownPeriods() | number:2}} EVENT TYPE MIN MAX SUM AVG Recovery (Ok): {{summary[breakdown].minima.ok}} {{summary[breakdown].maxima.ok}} {{summary[breakdown].totals.ok}} {{summary[breakdown].totals.ok / getBreakdownPeriods() | number:2}} Warning: {{summary[breakdown].minima.warning}} {{summary[breakdown].maxima.warning}} {{summary[breakdown].totals.warning}} {{summary[breakdown].totals.warning / getBreakdownPeriods() | number:2}} Unknown: {{summary[breakdown].minima.unknown}} {{summary[breakdown].maxima.unknown}} {{summary[breakdown].totals.unknown}} {{summary[breakdown].totals.unknown / getBreakdownPeriods() | number:2}} Critical: {{summary[breakdown].minima.critical}} {{summary[breakdown].maxima.critical}} {{summary[breakdown].totals.critical}} {{summary[breakdown].totals.critical / getBreakdownPeriods() | number:2}}
    nagios-4.3.4/html/histogram-links.html000066400000000000000000000045041314764422400177610ustar00rootroot00000000000000 nagios-4.3.4/html/histogram.html000066400000000000000000000054471314764422400166520ustar00rootroot00000000000000 Nagios Histogram
    nagios-4.3.4/html/images/000077500000000000000000000000001314764422400152225ustar00rootroot00000000000000nagios-4.3.4/html/images/Nagios-clearbg.png000077500000000000000000000041331314764422400205510ustar00rootroot00000000000000PNG  IHDR49QbtIME  $= pHYs  ~gAMA a`PLTE便kkkBBBccc甔{{{!!!111ZZZJJJ999)))sssƽRRRtRNS@fqIDATxZ8 \6_.,鞡W5S&4} "2,}EYΗB2Nx(LT*zEvpJD2ËLB'*kr2U@W'Mx#JHЕyDD-נ+"o<6O|de^˱MJcvנ*/GYxzK E:9EC6l+UDW8a >?cLQ$ǧHTB7Iif2m3)%55Ɔ\p]oCdd{wgq7xGkz)mtZޱ-h I)%x$' ^IE~rGNF[(|Ƹ<zPP7gT`a_$GSrIIDM/LɅɞ :rB!^>՞Lw*y"^:U=8\kҨw̭|U͏ZG-s6mʉsJ"liI$Jpk%ָc;`y#qNSphY08A)uTQb\2a%+fx}†i;|"<7#({+]Tx_SB#z5.K~W>`/iqG+˸3h-| ɵ 'Qj#Fhlr,r|384+3mwΛgI .@+pױ-QLr/&IuҜֵ{/,eeZ 0b4x`Y8^c@$ƁՐD&ZG ƞz:-f.f~S1  (D=y3w'cЛ(ˊ:S?4R45F!Vߍ~f2 :!>s[ma<:Z6<Ѿ 'T%gB7-{l$-3p:*Zkz(-H{xw,-c+Bzj1k?j(ؖOw6E!&g,FBE#ir4=eIg (ȊYuп ES~" E\&Բ6x_>fXhTٺ,6?.o[𽴑tIL۩VQb6pԪWZy%'C'{mq5%iݶtO6>5~PG_e(CtߎͳQ_f %_'8>I;=tTwvo~'yYcasۛa6!4iGn IENDB`nagios-4.3.4/html/images/NagiosEnterprises-whitebg-112x46.png000066400000000000000000000076341314764422400237000ustar00rootroot00000000000000PNG  IHDRp. tIME $ղ pHYs  ~gAMA a+IDATx pǯl!JoE)DK[],=-ZաZCB$ }rOޛLc2,[U*,,4 )))vvv1117o.((6mDrrrN:xgg`777C c>ܦM.]4lؐ┿{Ѿ/_L6kL1܊2lݺ5(֭KU,ХK ۫W/S.^^2J;ǎ+<'dQW<ѣO/WVm۶mq]-ZxeСޔ)SNo߾&LؠP'w7b;<>ץALm~k֬3xzR>c9q˖-+(TRRO֘)2/ dԷmVg}cǎ3fV<|Ps^A1ȩiՊ:&obTɿ[uYL2B8РAM={ȉ@%b͑#GǏ3tׯ:aդI$a aaaX^ 2/_jժ1ch'@UL 5ܹsxLM?\u{bb|Kҩ˒4cASB#˄4c4'aM91>>^Kj,qB AL RVqtڄH5l05ƫrZ fcPD ߖTkM "_MW:dȐFٿ?o%'d.e"58%jн`;4={6􀀀"Xj֬utt׶[B 1Lh6a>u;;;[=UYT3RR=!!B3À-NMR8Ъh1ЎPlPȂi1޽t/:СCrB0b p\&ʴYzn;DiCM .`ӕo6`>D'F}t)͛Gk-ltp R1`XBۛ-}{ #U QmcovM8Äp :І ':D\ُoQXYҰA3 =Zg:E|\f haXY3*\k3Ch}+ZeR=$_'< 8|TAԔ`:qai;uTE͢!>w\xBZ `D%9l .b T{0g Um[/)4;O%R)N}K R̖G"f5YmZ&MHYf?pVjrq-{ܹpyRE!!!;w , ly~?'BƝ0wwwX+Z;.E5~ZtK#l_ zNHqquq(oD(O߶SHљ\MіFTt*AS֟ XyY\L}6hyItBƘ~MKqE7B^Qژ)M`7;iyX3QČG,XҰ{iNz0ͱSg9n%;}NrF䢟ܝ= A9j3fh =5`T^~.s5raˏWj13ĭMv>y8wm{f6~?]>wuq.m@X;c)߫Qu.É켒_S^6k@#;)Y\9S3jж7{AZ]AׇOuCZQb$uE;#3Rs^K _#Z(b.EKQ 1N\O\| jr'~j:to\TvoY˛@F,phg{/5B1aG<qԜ"s ڲ4&!BRez~j{/pslީw_(Z-qx8gW.sdo?FZrq,B A`z6Ƒ.ǥdׅ;ΰ4W"ϴ )[OߩሒQh8N-e-jf ߬m2Dق8IyXbЖ5Em Xx?6lQh[ՠȌ~5*kZ9NU3c8ּI7;WH`U7Ţ >.U|[?~=ApdUR`ޠBXq4A$n"~Zzkogc"^Bi3%3,s n&6p5>ƓDM0!6WȶwS{;OQ'7c+m}1q={nJFswy%5IJjzY.'vIInp~X$fB( #Zq})UkA$B _xhVh&(0@ *dtϩ; 0@A4t a 8h`k !V Moӫ_BC`hN5ED~@_E!<4.!H |P=U@()*`a [$ @h$&f P0Bhd@~@?fboxi_"@bIfWBm$uP$VIb PAO@'\#t@HP@~@ t`n i'6j= * $Ak @I6ԐB -d:CF$|Ԅ(h…$P" ,h`CnZð@ɡQ:`s/00q])7!hT2Gji|' &T!g 19HH ,0 )&b k"=`s,,n#TB )` vC$i#y  pPe 3C ?@ Q$s/WA -ԐT`@\؉y,n`Y= 0B1w湢W_ 8d…E4hBI/#xj4İ(ଳ DQ  ( dGDP᎐``/#t!pf#I&NHFOQӦM964#C=0rM#9f pŌ,@i 3l)00a݁ÈJT0'6b$1-]¾G,(ȳ6`P:ĕF^Gcn@  6ȶ TDC" 8` =8EJ =\s̱ -SI{2  ^9 ANÐ=@HI$—)DAA%TQ.tKDaD +@*(0i_C@!,B CY b&pY0?é6TPh]$JB'J  uƐۧ ڨA0 2 )x ³J6􀫲̞P Ђ *BGR38ج8;nagios-4.3.4/html/images/critical.png000066400000000000000000000025511314764422400175250ustar00rootroot00000000000000PNG  IHDRW?,tEXtCreation TimeMon 31 Dec 2001 11:56:53 -0600*n6tIME ) pHYs  ~gAMA aPLTE9JRZcksss{{{{!)!!))119BBBJJ!99RZZZkk11RRkkss{{)1JJ!JR11!)1!9BBJ!)1֭!ޜ!ck焌眥!JRZc{ﵽス!!1)19BZcs{!)!))1BJJRkss{nutRNS3IDATxUK1-|i٢L񴗳bW],aiǍN,; 0{g/Qq|h(q^s0jir6rR ޗ땻vnƸ;I҇`LDr,9=*V/d5HMEJچiQI,f4aq a%pb6VRG#U,$@ׄK'+z EfBU$UK*Tl!1 $ ̳QVY{7l6/UΕvB5i>}IENDB`nagios-4.3.4/html/images/delay.gif000066400000000000000000000017061314764422400170130ustar00rootroot00000000000000GIF89a!, HA * #&$TlXD,z|@E8pq0DrM.eƜ "˟-u&ƞ贩:,h4@MA M<s `%/ ds4!WIRmUVS6A*-5Xm"$hBuW`DL p JKdHW8\I$;4nd4 9);nagios-4.3.4/html/images/favicon.ico000066400000000000000000000014661314764422400173520ustar00rootroot00000000000000BM66(  OOOMMM??????FFFdddiiiPPP@@@GGGbbb^^^uuuvvviiiLLLJJJ]]]uuu}}}FFFEEEAAA333888 +++! 賲)'' >;< 655TUU688//.EEHEDG |}A@AOPN  uuvnagios-4.3.4/html/images/flapping.gif000066400000000000000000000011021314764422400175030ustar00rootroot00000000000000GIF89a! NETSCAPE2.0! ,H0I8ͻ`(N@i! , ! ,  8bGYE»A2`ljL$! , $8bGYE»A2⹁lyl m ! ,#HN08, Q[wwm)tm! , HN0)m4ͻ! ,H ! , ! , H 0j"ͷX'jecf! ,%H0!A[eUټiȶC! , "H0I!Ÿ\yyS݇mtmD! ,  H0I+8m;nagios-4.3.4/html/images/globe-support-150x150.png000066400000000000000000000126721314764422400214630ustar00rootroot00000000000000PNG  IHDR ߁tEXtSoftwareAdobe ImageReadyqe<PLTEOUYL=.h2 B"$!!6[A"kD+5RhU+Zl`BvZd1.U@38cV7%['' phC1$OiI(qlIHdC7-)`F0]8;9|}?i>|8oNDnU3eKv@tRNS{DDIDATxڼ C";EMt5[t73-9sFzSY: oc``Bb.D)?"C1. EZ8?p?HENJ(tq vc 5Xё8 w| y&%a8::@#mI-52upw.P-I ôD". #'5Kz L&>XuQ&磑ZaXBB4d{$H"%v^@z gVXB9q@ƹԬdZd ^~@|0s8¦>6jKhd|Qk g~C2 ߂%g,-/ C Wq1Lq!ﰤT_tL(VC,N%M}=8Pdhplc'6CqPوVeF ]k6 .e}]Cl`ea%nuWé89yEW!;ŵ g>RSCo`+b@j ?''L!z3UUϳXg =l|׾a*l6q L)3Y`_,&Ru/tc-tR@a\0czeG0Òuzy`1XMԙ[NáSzaY>XK]%GbA /7Z]X勌ôI>з&;VJ }zEVߗ2&߰*~ Ih{TmV^D~".CTJ_, n&5_&鬑bC?pr;b6Rl$&@dr~N.'(-JG\eG!+djJ }b$O vfL: [Pn `³#G* iBF0q⃥#.:qE۱"mj O+-RnB;q0d.ikV3X,{ZQYHZiC8D*/(,+*aK$1I:aVg4zbJ9Nӂy@nY8 uUd8P&]҄+L5I#SXURb_yJ!6N~]]]i'ksaR@#r5`r,qL=Ųb)+kS3RL{ڢ~>\..V$b,V,MuiVT!y+Bթu! bUY?M^x]G+Si.}׻=mN1Dj.{ƨ@k.Ē:;r`)+U %EgeBדWnU F|,bccZ9T>jHSqu=+֡_Θaɩ ՓZ|~6\`=j%`1ЭQTCCcw_+G4x}V(f RpĒbEϴaS,Ӹ#AW +ĕ+ "XbЊe@GT9uqr9sQ:',i/bɁ+p68*jE &:\RY4AO$pi,Z/űgĪZ iif.'0Kw5JsTʡwYps.=racjBF5bjP9r2XD5OHa$c eJ")s1x?J,ǜVS|JK8,!:Q%kĒ`rZc#r*F 8O6m*5Cos /KbѺ%uu\rJRk8_(,x2,šP/ZeRT.8TF"%4Vxl{wpa-]a]IZȺ.Y#EbJVjfCëOJ8bat!lQ 2=v:iւR^uuV,Z^oc/ťjWa,\ Z^N[l3oUUjZ3K.0jesxJ =Y|m+-rKfE"ST;Xϓ :p>a7fmL[$sT-~cJoE/K%Z/RySU Z "JBxiթ\n2e8؇E;95WueºD8zXs9arV",7ĕC"7d^;9XuX~X8VQ15Ԛ~͟*][2rI,쬱@H-X8d kVrպ>1zzN4l`u=H {e*ĬXup+*,VXlC|?*܉k\AS$?Er`nu>h,!i|3 5V]Tq$}ST*.n T#=%~=J"nr,?ւ?2eXy,TVY9ܡp ŢG؜;YcʪSL*CJ^5>?Qnn*[< V1?:o4mĪvPjV/JpU~ BNj/j27 !|vS߭ )t]{c:9 weF6%j&>;`XKLQHN$N'zX lP^c=g7jSE*畼3l[4r$ UɏP}oU ւUYP㭮|:/T$_D@ ^erY^NHe:QeҹU)LyV"9n4 r@o\T &d^}X4"rǁ;pa=彲Ֆnx.f1W7XoOaP8qCEb6rbѢs܆jI-s5)n+xR+Ӣg-^5Wڍuf7E Ve !|`-̇B 9`E.[wy+V/D6*Wm+#O6N1b_ԉjaղbɳkh+c}PB]%~-zJQ2\F052iE;=.CplK\.z  ۨ,W)7V64{\^}.%؃2}1X B'XhEn*"v͋/>B[tPq@ GZ0k-ͦ=`X$Dm4Ҋr8o;M<.ؼ)%nwSˡp_IcWIk2dOa-p†słtizc/+س˕<[X8g'c.G/fz0?m Ku,(*G,pv;l-e3`DB6IJXўf4\V0 nT3Xr.j]!B<+W0YKma2F51XZ2|,}T"*t=8\r:qqe)8H &C/~ 8rMl"SaJ:KJOD&.O0Cѣe_i,{) NEU*ڋH#2 k0JX*.mc=2G<.O0}ǙH)t(*|bީJat!hbcTr3`Z0FO3n/Jp9&lzuìb.Ж(uJ݇V;}cȥd H&i 1uu2OTJܓ͂pl*=2 ·>TT\/9G'M"}0)ft/xmO fE7,̀i2y&xU ؍w[o8`p270-g b:T2Tf_rT$BsؾAPo+`׎T vTXCB(ԇ>`A1dҐ)4W{UJzcRy7Lp`R2i3[^>Xi>CP_]9`LDݨs+uPD_{zkP}ˈ䣗 K"C7hS=OJ킝nb$JL][ ١>NP2b'qz.7O-49h͹I!bۯB,T7i6)SY:r$^:U\}}u;SS`i.^_5  zDuJJs;^p'/7h)<&#EI!Txۮq:gFݤGf0b{D?:L 1n;_]T*U.u2-c\KW&TTqa2W5\aU?hCw룑^́#\GdzMX?!GI Aι |wX&3Ɨwe FFnN^x[,s+6)u)@e/뢫j>_Q :`?N'0̡ IENDB`nagios-4.3.4/html/images/greendot.gif000066400000000000000000000005111314764422400175150ustar00rootroot00000000000000GIF89a   @@]11Goojjee\\XXDDb++>""1$qqoojjiihhccPPsGGfEEcCC`00E!jjaaNNo!!/ |{mL<'  !, @f@ a"PsT1\!xhvu0qf6PeH̶OT0l0>  `9/&Z,5 B0p#'7B6+[$2I !7;b`A;nagios-4.3.4/html/images/histogram.png000066400000000000000000000430161314764422400177310ustar00rootroot00000000000000PNG  IHDR@k%+tEXtCreation TimeWed 3 May 2000 15:22:45 -0600E@tIME.F$H pHYs B4gAMA aEfIDATxwt‡B A=!$B ( " ^DP);⥅z/z~^ǹIh<əN <;m\t8!+̈,Y %]wz? - M%;? 5裯JHխYJ Ỳ5=4Fɳxvڍ1bРA.wq/^\E6m_z%+VLc8;Tzһw{ҤIE`mօ/c%\矏;U/WsհRiޮ I&iϟ?11 Y]39sLoq,2˓bbbJ.ݿu3mIdW~Ć 2 WMp 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p 1 p+Wr!3pԩ7?>)>-[ +W.3Yf dLbMp-8.i͸;vFGGt[~ N8qq3ŋ5AtҵC,YU9TpV-Z4+VѰh|rsjkM]۷8pM9rل畞A5+v ԣP*CeVT)mB̀~޼SbL;v]v֭ׯ?zSSS/^x -뫰^j8_|*|5|9gJ7gΜPs588bŊ Pj8$$F-3-[X"::ZMIIpfOlpܹfZ߿x xkٳ+F38AWk%wܩtku߾}gϞZyd޼y] M*O *Tl*Ug[fQwry^Zaw̙ƖJ+ @Y2q Ukr3ZzQh=D:/)gV~U+crcǎqnUQjݻw4jCõuEIJJjW(m5+UiՕE(R>̙̉us>]T|}ԩJ"w =9wS*!Z```z; sߏzZ/5|I3g28&O[mTK &<=}ѣM,Y]Um7<:zzjm޽{H`vbVZ SiטOJ/̜93&&F8%Tʖ-RYrR3][z5vNN[QG##F*]nݦMV^_6ش&O&OiM65)*]l>q߬Y˔)Sfzw]릝y)UK=V`(UF*U8\J?uٳKUNrrjˈuʛ7HɵaÆ ɛ)W\/]bN+R)pxSZoٲ%KQjJ!Ai %JDFF* srwڵK23]v˗+m>s֕}eg?.1 3o޼/r̙[*VX^=5SPP} ,%צM7HLޅSNv4i/_>7R+FWZf _>)))ی/^lYΝ;w1UŋU;/ o6rOxn\rNo36nfjWZJoUvݻ7oomٲE.ehddd˖-5k{ QpS}߷o=BժU[K,iϸA͗s*C>l@snZ78Y0ݳgŋ-U5I{gɒ`͛_agHqaNǫWasSZg˖-&}4o޼ŊS*)}֬Y)m:{͛7sM6^zQQQC֭?ڵk9b)复5j߾}|Qpc oZwۥhѢwqt+TH111~ڵk+^?}7Z 4WcO_3n'+WO 5j԰^pA={ 9slٕ֬')1 n434[laaa-ZP5ZW6sJ3I/^~ѣG#H}[Q9_ nӦMf 4 XC5ˆ Z7n+g-Z4jԨ]vi;k~۵kCmܸqʔ) M6vJ֭[mM8a̝;O<Ѽysb\ݻw?s3gδY̊+fMԗV`իqtM̙c]Etzme8p2d?xh}<.P֨Q㥗^L0ᩧJHH0/6mz}RFRZgU-j6mڨK'y/_7XDsѱc^xؤ.v,X`flg-K~׀5Lnж}W`VWXVu\<~xG !Rb\nݺ 8zPB:wܤI빡.w_.\pذa3c:u(X=.$MNN4iƺBT3}o^FFFN8L2׹i}Yjի++u4V\ǶOov:ҥK?e>ctС'O6}}}z!\N8S ʕ+%%e֭-[Paz55~FEEܹif _bֲ4,YҫW>ȼE?dQRk47%h븦yBBv.{cs}…{˗<ϵTRsr_*~o?7gw2d;ud㮻"$ӽ{;*/.YU$9rС"W  0rV>1cE#k׮m%͓'sڵ 3f|Z3AZVNfdZ4Y&M-Zin"E*THS#Uue͚5gϞJp-2~x jYŜyPBݴn%J4zWƍk>|h@kb_}lfΜ9UJ[mTof;wڵh^3g$b#,\uG5/ºtBpOIIQ5*))ɌQt q~^ڼT-}͛7u>|5o_V_) k "111|˷nt̙sʕL,9r?Hq,eԵ>=zڵ˚oM^~}7(iњ3쯼ޥ<}o \<{ 3̅ sEo׮9f(L n,k QرSi듌u׌`/QMժU}Y3J#F(FͽJTڵk yf3o]!XBLY[s2 ܹs_ݸqJ*:uTFΝ[b7nBJef6s̙5kև~h4?oV}̘15j0'e,^z-uaBBbQ nذ>+WԀfuٳr޽uԱ"UknkFiԚڷ ;v4mњa6m\26|u~С '~r0`r#JKTѲeΝ;[_iZP*U[gUV۵Vfqޥ[45׀B{&?]_^Ə_)RyJQF2P}>}j,Xu{W=-z7>YcY^*?S%\j)2eʼ[2ݵkק~jJTգG7Dd ر[n 8է"aÆ?|hh"~6mUJA\zjF:tҤI>m 3|?L?cƌj#GYFIi(5k֬QF.]D<6:iZj]> q\G>w}=\{~ܹsBҜ}bG}Ogj۟vߡC#Gw;ٳgEΝSɩSwh_5`>4*Xf{MYpa%lbż1QF{ܹK,Q#j0gPPPbbb``9ǭ_i&5^JӲf59&&ƚSSS{O:H^T.F3Cbcc1@侶W^Z}N8tPN;vls=V۩[3z_%*r*_Pi3Fm۶?822R-t V&>3 J*iJm_~GGGk|KEY-3fOw]xqDz \ {ѥK_vRY۷_#G4]c>Çkc-Y5>CL͛/_>}x]tUzi{v&*Z0x`|WS5 GFeԩSgٲe+3..>x!CƎO>wC:ɓ}qzꥤ,\:~֡gϞGjժuȜkF@Fumk֬iL1b̚5kҤI͚5{-QGFtǾ=qVfyC:~Ta(H… N aaa}x|sݹsgG}t6ʛZԇ~899YyNJ4滈dҢE T\$}H7\r3\`All}w'N< mѣvZ\4'oo3֭͛[7lذ#FXGIoo|O\3 D[d_Lҥ맆osr}w[Ω'{| ry?R :mڴD /{355uhFE-gΜy̙s):`f/_&>r䈦7W5W^%5j4B/ݽ{ɓ']cZ\z:q޽{Ͳ<&.S̖-[Zn]jaÆ}~~qFb۷+\k(]vIIIֱʕ+['ӣZn=]FJJҥKΝ[`4'P˗/?w|~*1###۶mۥK+W|嗵W~~~fJsF*_ L8p >5\eo  keA3̉nrR%%%:u\knɿ{zǏ[i'O45֗kqz\ iӦծ];&&:j3g#GhY&Fگ"Ho&ȗ/_ɒ%92 BN@yO1reѫ*UKW^QYK3FU˗oР!C.\8e DFFΝLXܰaöm۔H??"Eoٲe՗~7o5ehF,X0y ZΟ??qD5jZ܋/8|pqÆ Ǻq_urdaڵQNy宷+#n.E:}iҤɯxbsQfj+Vl &w1ekjj5BֺR۷o۶m]G\$%%Yw}ٻwo@~?4ՠ7n˾Z%|׳fͪn߾?~DDDpd:cLw%1*2GgϞ?~/#깞={ZW*/tz饗}ڵk߾} njSkVfnUV KEKxziJ٪THN8qر|͛7߱cSRQpize帆 6n:YΝ;O0ASqýe?Vq kXAʒ%K׮]/o)8879wY[z bt ,0]wG}>{5!o޼Yֻ9l۶͚24,,,..gQѣE!!!}pVϝ;7vX'QpcZgb` ./1APPPܹ7gΜٷoyz+Vtz/7ޘ7oމ'>255U]8vXDZ vӧ栉 "}{аudǧC.-eʁ3f̝;_io֚5kJ>izť>)=A@@9$2Ôn.y+ 22si>)**F*9rdΝWGFdңG@TJСC*r5_<<`"fzzc֭5jdEs>vXBB>*h=EhM|Mw͛7!!!M۷o@1j=* _fwTyINn޼yj@/wk߿BTfb3e97kI&կ__oQwZWhYrM6_SMjnVjzԯ Pzu˗s%˴i\S oS%J?áM UhիWkxժUkhKh.] Fu/0/ԩSG8x;w&&&5jL>]cn 6l2~/_{[ZVs>%Kޞ;w3ԋ/WժU{̤Xb/6bo *URu]-[>СCwr%1ctP6)&&gϞ)))Lt39s*UWʺ*Dqu% 1={ԯ__;lٲҺu*^7o}ZarJ-^xxxmԗK.m֬j;X=:o޼?Uf|W[ӟ8qBnݺQF={̙3N.oЮ{ǮyiJkF 7rى(6mj.ܸq}2a…kԨa'ODszos?~|Ϟ=n*rz7nt?^(t= xOШQ#EIIIӦM?ekݺu]5˗/1cwd͚U۞#G@"ȠGy䫯rz51dȐh ;?aÆUrOʖ-ʕ+/^x *,X0˗o… mڴNw}Rz5j͛7$$$""Xb˗СC;wO.\ثW/@zѯ_?3ܶmgy9GO~7bbb4zw3?T__ߑ#Gk.sWxϞ=.M2ݻwgϞH"ø~G}g͚r?ҕ v۴iJ6mכ=eVZʕs/Occc3qm}bi_6vZx˖-NŵΝr_2۩S'bM>))iĈ,_NMߊ9zkf07ū\:ݧOL\'NĻYwG4T+4+s$>gm6vm_G>3mvik۶t.LҾ}{K\;7nܸk׮A}ԭ[I&r/B&Knr_iTcTr5l4ͪm 7ϖ7O/]}XDEE9YhJ`Μ9ϟ?U53gθ5uְ&3_(Վpk[,Кkn昴IR-СC ;fsSf_vHf]A%K/⑑'ҡ̟?) ч~Yj1cqƕ)SL'Os'[v9M9d%>>><4nSYFͭ~_|a ;m|YT(W>bŊ:):ϟ?͚lu1c4V^G?~|Z4FsPo߾[nT}l%K'^hZɓ'a̵sN!VKMeg/^~o]uj%}1;O:Ӱ9Jo8*U|ZGyDطo_s{ ~'Nhsȑcǎj&'OY{~gګٲe3N:Ukhnݺuʔ)WVDjN;tҍ7j_%=?o[{[68-Z׭29sF{@3fPPLM{'̅Yf5kf.~Q.]<æ6}EVs_ԯ_7J*u|b駟ΔԚZaÆ}zuިQԩZ#GΝ,l՚#""e*y?+Wg"E (pU3Xg:VaGZIm̚/02ݯ)'NhvٲefmHTTߌQpk'6 b^D&(QWzb\СCkժeL#FHNNOڵhfͬQknٳܽUBs}XS,Y\=y鰰QnΔАkxҋ/iVp_xTV*:;w_joppٳJC͡ZjV\.\d*%J"JRq۷O_k[̂4[fzLa/QYc=f>E &Y|w}7&&&lcǎ-[4\GٳgϣGfʪ'X۷o7YlVoӦMpٲe⚹)vءuVW+y{^vuk=֭u޴iv+rw[+'MdPjA̗j͛711\r`yYU[ѯ[_;t`hժU_xK8\^HHٳUH6lPL< G]/47o׿թSm;w|UVJ/###3e*֭[*T(_|Za (P@%vM?}||T~ɚWݜYsfXխK.-ڲe棺*XU7kN^mC>kzm>hfͽΕ+W~G.w7o\5:44fASF u5q-4YbTT6Pin_ >}hU+L+ѣ 3ghDD6MA9~߿5E9駟?~翊o߾C5sD~v微Wׁp!ӣe…x ؟?:c EbԌԩS4Y b:A2^}Gu&ݾu*TP5Y&wp4_)o6[n'K .4رcV%&o<ȣUPNnZhN+VXa3d˖M/pKLLt}%Kg3gΪU:uj۶mM# 3љ3g,XP`~8((J9s(RypJov|ƴgvܩ2 S;wKf-B9RP'|R%kM3#G6l‘QpՔ'Ț5k͚5vqŧjcӧOOIIq,[lΝ+WqT9)'MdN*govѢEV\}ӧϲeˬժUҥ*of֝RW-Gڵ;v옹S+Vh|bŬ{V1dɒxMf?g6RlܸܹsaLLҥKӈ?nϞ=aΝf<>ZΞ=>3u?4nܘ;,W܂ ̓'OZ\4""rqqqT(Jmۦ)ϟ?ִ+MJ*UxqōyӁMTBL\'}^|ř3g={֌;6"  4V!,J h0&o^F„Āxa԰*QYdEj)ڲHD1I[*+/|)< yf_%Јť|/[ 4LOAB>|OVUUݽ{"#>:]Ǘ.]jlldKM Ƅ(4''G 7?D&;wM % 7pE _ _"ر^P(PXG۷&@L(idd$|ex;;g"rN}}>|Ȧ^FDU@_ }޽.֯ Qt]lm((AA'OppppصkCbY>>>J͍`\СCO]k`0e2qy]YYڎ&%D9$AAN\RXXZbJv-q m۶/// TBkN8qA1ҁ6,--UTl-Ra>*e޿_ߩK~~~VVOrHF h43gp/=>>~2\/VR {ZZѣGo޼ũPDCkyӬZQ+"% b )//pႉc`3YYY|Z~i}}ir۷GxϚ5kSPP@Jwkhh'_^Tʛ mcǎ) >!% bYHIe2YRRRDD;磽RF# ׯ Kss3DIJenn.iAaUUUR^/Cbd~xWWڨɰ]2HF -**/.s111RNOOwttJFFFb¼zzzCFq{޽0.J;00vvvr8hhhx-Zŋ/_t:q, (AA(_.,,a6q qqqS&S2>>h A,@qJWWW穩)'hff&Ĕ^rD+u+1TlRT[BQyg y>222??}E>8 (AA%%%&6;* {JEAbLr D177'>B ;;;PaAعsg@@wPz~USSSOOB\윚E֪ŀ$AA,eeeW^$<\.$mذA+jpoB +Dr}VVV``lz mkkt,vP4p__ZT*[XH2JAS[[{ڵ'O Ƽϭ[¢O333---00ZD"@ a |N#(`xF!T`: t􃃃ĄyWŭ^2 HF X)VWWuttXwB_ G8]iJۋ81`W }BB|e勹z8ԡPQ(T* ]s q rzFy1qk<*<;;[&AܸqO=KaК۷S(3 7cccǩc:99mٲ#L.ʽ rq&AVՓ?$∲Qx ǏED-s DKOO⠸vrrφn*|;6!!%Ar-iiiBwr<<3nC q\9agLLL- DM~/0~W= a@h)sHF XLNNT7o644@}RI6i&&qF|o||b SWAO!ٷ*h%3H$pG'-944YD,ClQa4Dښ#YDX ($&&FT&$$໕'1IENDB`nagios-4.3.4/html/images/history.gif000066400000000000000000000016341314764422400174160ustar00rootroot00000000000000GIF89a!!,y0` <`ƒ F|BN8E 2lH$Ɉ(Sn K-_lip&̛6=Y3OT͗E չ3ACB}JTLn4ץW~-UHh;nagios-4.3.4/html/images/hostevent.gif000066400000000000000000000016761314764422400177420ustar00rootroot00000000000000GIF89a!!))1199BBJJRRZZccss{{!,7@P .X0-^XQFd !"F @#%",Tx)4Tm84Ȱ #XZXCa{oj@ ;nagios-4.3.4/html/images/info.png000066400000000000000000000025331314764422400166660ustar00rootroot00000000000000PNG  IHDRW?,tEXtCreation TimeMon 31 Dec 2001 11:21:44 -0600脟tIME 9' pHYs  ~gAMA aPLTE)k1s1{91s1{9{999BBBJJRRR9sBRRZZZcckk!B{!B!k!s)J)R)c)c)c)s)s1R1R9Z9Z9s9{BZBsBJcJkJsJJRkRkZkZZck{k{ksss{{焭ޜ眵便ֵyptRNSab*IDATxUKO@=[lKkۨU"Ak  M~3TMn&PAvpt>J=>kE53AU~I_ ;Q~lVQ=~c?k(RԮ6XTׇ}T<Ņ;v=T ]ىKmZVry@JۤsgF 2uUl\,ZFW0Lr6sdz'FWU*ȒxڂtyE׭ofQ7 &R="#pIENDB`nagios-4.3.4/html/images/left.gif000066400000000000000000000021111314764422400166360ustar00rootroot00000000000000GIF89a$ JJRRZZcckkss{{!,$ H *T‡Pp`ċ$X#F;zA"G2<`e×0cZ|˓ ,`Р D a .`f˜;{ :Ѥf,F<}J(RZ%'XcŚ6+]KUejةdX0޶_M<pV+ܿ<8qMUȇS+@iȆm9{=ӱwWfuɟ͈[W>='3? N3_R{'W7}3f-;nagios-4.3.4/html/images/logofullsize.png000066400000000000000000000225071314764422400204540ustar00rootroot00000000000000PNG  IHDRL^N,tEXtCreation TimeSat 23 Jul 2011 15:23:53 -06006wtIME"'k pHYs  ~gAMA a$IDATxyxTE[eI D0l!Ha 1 EAAVQ  MaMAD2:Qp7|^vwPHx>ܮ[9ouz$7nذaԩSwyڵxGԩCBB (ߞ>}z۶m+WRJjժk׮3boPb:##bŊw}w…+-Z4..n@~9++k̙k.X]wu/^sO5@ 2(=Sί~f͚-\pӦMӧOOHHqxaÆ]t￧w}wݻwҥKwn޼HpٲeO?4\Anjׁڵk۵k4+.sϞ=ׯ_'׬Y?ZD^zhj[@-q+0~[2(Ύd r„ ֯_ԨQիWM2+Wi׿Aփ A._(m`l-X@oLLazjРA'x: J~o/F%KԿ%!}#VS 7))w"n m=ʠk-mA|۶m+Vjg>r䈱0pĕWPھg]ppΒ- V?$ɓhرcNE3yݵ[($1eoxgȁy䑴?FQf(/m K@] ؔ1Vܹ0{wFGG9|ԯ_KTM6ӧO2ekPEGۋ/1ٳUTCƍ{w+ݝA6~ R'߼OU\4\rv0dOѣG:4{}QŢ.+B 95V\yG N07@@Bٶm[;t,^`GE!~Sʂ̙317%%Zr/ر#xx 34o?5k4:KÇiX!;;{ĉKxoǏW0gΜ>};0D5@Fll;BdҥKw |#č)SL6qoփ>%TP/Wn2|S;sX_כoCs$] z*I&ܕזʵ(c6wOD-[`}vYpdd!i2vvK.:"kDpksoݺՓ .G<od%Xvc֬YL={2ԫ\.BIJt!($^n+ `Tl%J-WuP nWu{afTR0˗/f ݼysxѵWj}.^zm\DhѢ5źAB4iҜ9st,DеkW") ̝;WR "XbFXA+x>I킁=z~o޼O>Z+ !3abS9]"OIVlY7u. 64X]u ݻc 7*?>##xIU?EGG͘1OYti,xb|a\\-fh(T_|Eh%j @jG:ISRR:kqUzw̃dg ޶@블VxELTB.n￟hͧOZ*8 ǰ<\F${)C=q;9"p$Q*n I~%X30aʗ/;-N˗/Q5mON@%'d G KBݸqcAU\:~mP>E<.:7lc 4>{1ZYlOMM%sQfPz,r)T3|X3HsC P.@ܰaæMv/^X >Q%-BlٲEM"3TXnnݺĀ{ߜ8qPP۱cǘ{Sc=޹sgadLZ=V`Ah(%;2,YG:,w8PvyJ}QHN_jФz'-- DdKvZj3<G}Ṙ hܟDy҈Q7رcW\c~G JHz62d1I2rJTL[dA  駟¥~_իWw*p;)}Ocƌq[ocYZjhg_\Uz`71xmYf,89r,S#!WiɀΩO:JQՁ,Rf…t[nc~/ 0<]ȳ>+Í򗿐9B_t7laK=۠N@4! zF6%P@16͈ \p7ۡС[rI.D?8:݄mڴaP?YϮDȟj׮c߿_K WS1Lև~^~ecv*MJJȂ.\pCpt7{J SY!!R{E @1`ν{۷љ;v8+֯__/ pvGg}%[b x}ѣG;~Q!Ig{rРAr44&QHutȒIq$ipnBnrR:2.trhޕS0 ؤI , 3ڛ{Y"8I%\,!wާ+LM5J!OѣG)KX$KnZaK.FPb@YcbT{igɼ5&a8-{ނDLJx :tz>.!!/ ,P2(q~D"Hb:GÁ4č&Cěp#@-X]A8gϞi9 QQQFX{{uPŌ-YY^2>P*U0EA RR\\ƶBR-4|b ON||<ݳu5gcN(?~K#bH0܏l1cڰظpVސ;wUp- g (u8YBcb\fQ4 5TAWșV^o]!'8N:D# \0r!3+0:@ |CٱK T{faPyf9TiӦJMqg >p2trcd3C[qXYjCw}8 3ʗ/􇻈;-s@222ăR[gtTӮ"ؒdnS9 oժk-W(tX{!lpMz(J6)1R [ȪU<Eǎ!Cpiii$p/b,$Oq@w\!SDF |Io߂Я^ЧOkbå1 (z=5ִ.nQАxrX 0!dB4. y {-l+iOnܙ"۷> (W0mzzҥKJ5b:e˖3fpA`EgrLہ'0oBz۩ :I##(1G{2|R Lcz}עkK蠤Rl k|,p>IÌ7n|Ģ8%sk =s8o~ 0h1X׹ kzpDEETΈfΜ9bo> jժ@k׮ uBBBZp H3-9Ia /zsm.%3yBX Z5%skY)$;%::ܹsn.vb]TK/)ܠ,:u^'LeI6V\e^1cD$HS[+nG%θgy- y#GPaÆ# Wt+uȅa>>0 \顾?[@13 >xccc׬YENȠTyhfv /\ʘ4LA6lY_ƍ OL`PFH D I|[F n޼9J'QyI8v׾}{ @g 4*)L6R۷c 4nKtubgf ,B!ea٭:u@PRKy&DC ****11H]-1ݴil$++˹L@;w. + ._矇 "{:J:[!\ kQuL" >"LCM!Frj7]a@RJ8eYrʔ)zҿ7uB&AP<< W-()o iDx1EM*{NJJ޽;YX8y7s' 20('L"z,X |"XYcG LP ^2 4pD&!`h|<1Z ܣGrS`ĉC pʼ'-[v!ϋ$W2*򠓯:hȶDڲkGzD |?$x@-?qpzr[rʸL ]7G,GD ^+ 8Lq K#1-1G%Io9㖞-A? W رCO*eW^1. ŋPf2R1ڣ9.AcWlQA;vydϽǍ'''c_ḋeAi>W_zPn(mțy3wBSPnY$MƣȢ7 se-E%s &yV+ x]d^}sB|!X|n-!|q:ݳgAEo(4N eeeC?,!/)AZ9J;k֬٤I6_\ iz"8QQQApvz̍7TX1@DΓ=)%bHt<91Ɛl3xrahףXnv'ׇdYCXDӹ߇ǎ|< \+UcժU |߆ 4YL^IΗ#7Y3AkgddȹxDҰ%lӦSO=Ul;q|8ر#C>rvQxZL ҏ;w.55uڵD a¿Noxn9522P˚5k6Ϯ;f*`ɓ'H֭[O&zGHɒ%4\ HS kr8īB ժU+Vɓrr]o]hQBB#<5qX$,qޱNʁJtI7<9%3}yF2U *T}q>%&&)S|Eۦ (]F?!ua5_~رʛ/^\lIW_>}̙3W\ȍzѢEhDff&B5k(֭;|0L׷s-Fx!hH"UJڒ=R{az> .-[;:7y6 gw=جY3f] noAi0o34 .Tv?;)))xٳgtЭ[6hЀ\Ze)Rz Iz+Tc=Oz[e]SIwL/3xfgHfL> r*&?} ^/uر 䜢?q;ĭ%K;ݎ+rDmUAi@Pr![dITTznܹ\c,9&g#:S{P0_@?x \ꇎҥK3JzC<$JW R{u<-_! 6lHKKS\F(o@?~-($ V35Ex\ɯX+(kI[hsb0 }3yBҮ]Yf)dڵkSNݶm[ʕxp+Aθ8N$fƍ7?/\0iҤ#GS3m>~PՈ!73;nݺ43g4ЗD~Mμ^ׂ?~ۯdx*#n X)CҺukDuYر?g8ڳg;3$^V ={?#ɾOSc7i҄|ȮD~QPrĈ)k7|p}tL2F{NAPR0* qƻvRv\~`mYbEe,jOSǏ=Ϧ!l9u4CUr)n (s!+`ϳAN MʏZxH%܎;E Z"e7(qLo[PN#7" tO 2(N)$ʠ; 2(N J Hj]iIENDB`nagios-4.3.4/html/images/logos/000077500000000000000000000000001314764422400163455ustar00rootroot00000000000000nagios-4.3.4/html/images/logos/nagios.gd2000066400000000000000000000045251314764422400202310ustar00rootroot00000000000000gd2(( ZZZBBB999!!!111kkkRRRֽJJJcccsss{{{)))                                                                           nagios-4.3.4/html/images/logos/nagios.gif000066400000000000000000000023101314764422400203100ustar00rootroot00000000000000GIF89a((!!!)))111999BBBJJJRRRZZZccckkksss{{{!,((?H*\ȰÇ#JHŋ3jȱDŽ2`G 0!$@&L 8P`7lxhTa@a 5 !M>dXACO?x0AiիBAhHal 7?9['SŞd7݋+ţ(FE slYJau姆wgBYR=[wяZXtn8;Zp ^x^ [ .U#tu+{mR7{Y)\,K~ ? Gޚ4~RTfu 1ڳ%Ͼi{qߝ-|^(ZwWo6?,v b*{{{[Z- JAwvvpAS*"^'Q{SsxxޯJG Y%HQTjՃP ձ`SdOO{.^]]]`&|`\o޼^mllllc:>´c·F]662259|paqayyyu䶂e(aͽ~zww7#+ݻc@0^F58.[[[o߾}Ǐq#^w]pt844~h;\pӅ~_|};{Bzb@?CsP3a³gϾy4z`H•0G&{5|'|`Ơ?|bP/ `_vݛ7omgN{):O BUv+WVʕW)S`a{|/#;ۗ>%5|5DQqV~!?B555c'M' Ax6!3 N333s"uqSHHG,XV9n&J){uTsaz <?:  D"Ք$I3A/Spna`CzI!?\~p{+ EX0 t %YViIec~((Q Ct10r@tACqaT@X&GF&'/T <@g@ͦ:=A`[[}y/I)y[|_J=22_r<'_?I_{6 +/ ䷐XEG&xA0 A7n҅  ߇SV:^+3C߬TJxs C C <wڵK.MNNvvv'羦_T$Y%!Q:q0 +j .q5Xx5)²:96>r}/+\ik8noU#3 2}'o\k|uybP޺u T:>>חf'P Eo$Q__2{)Ģú<7AXEu)~_J],9͔XL'-\G C 5JOV}3D%% S8Ǿs 9i{P}K.*U\]իg]t !V <)4U3M]IaܽML6N%Qh-b{Ls.`~_NΙ"R.aAJ% Yog^*)qO!$$ •'O`;z:@tE:׫@FYreC!W -Sٶu,upҧw ߙ(smˋcKؼd ߽w;nqN?}ՌTPOZii/D[k\0yJj4sHB~T>#z)SQ֜@MGt¨,x===#}Y@+R#uK"%iM?NzBs[}{{L}NG࿓#4X(܎RRҒpn_?GFGw'M訽2!m-%1d~{v8ZeX.6C;7gvO(%G?*uD |'<F_dI緬o"&N9$! o( nTL>tR ƛQ:`-K!rS{D۲ q=?q屮ukowW<{`1J[ %"A>u3|Da8`V0%x^3U҅ C#X2!K&8Kɽ{On r>lԘ*16p]FCwuwK )X`dE)ُͪTƩ,mk*/,,`V7[GߦO֔˥ fKX3&Ј.7&Sk V϶{!+)K|ߩCG;?SM/,ݷ##C`##[+tcޝda b!q;^L#4n^|m͛K}WOgwp kF}K"uKn߾}e, >O8%)Q-?>33STJB*8;|F6;; Kų2~r%P~ i`;1|̓jvVRkuf: BŋSwܹ}Oi ClCY @x@Qqd&=Sj5!yH126/cX$h~|Tv?_vem\YYݿ;bH[2"ARwr bCnS![;n߾Z^"[6@#F%=](0:=x" uu^ERAܫQoOhlq Pު=}rXez(+QMQ~8-UwL-eKf'~GuvVTWiAm_5;KK˓/!3 ;An)gϞ7y!a*ξ",1hzRS֦)aMA!_|5 ]Z .n%Xc'i3 >{eGhAxjJ-_v&\o*|Ni6Y <)f7 w Ad$U3|T*M=HBlZL) X3"& O¹%a.N%5ҬhK=(1ؗ^\ ?<;Y_PdÃNhu.?f|uy|7`V;0d7BL{$UYAU+QEE |x JBN??[_~Cl{B(b0ǚ 9B]Az:l0M >Tmn-++kw}yXoT }MNQ b;Jen6OSoS<YUk ~Wc޻wJ)J͎gϾ/>RdrxwWEir2bƉtDD%WVWӫWbZgx()9ه{Ioj|O\)Hvʕ+4'Or<!~*cbǴNb"oG=y 6 1Z}:^[OU*A&E'QaKXOХm&pbz.2}QrΛ'[T Z$ $x|5Qb@޸q+|%\33ި" R 9c{#'*E;n*0OCg)ڇ<_x.8)eGu6&Y_|cS0hy_DIDHdQH"4zVq$)N::꩓:U,85ZZV&IBvR)?ltuS5V :HB7,t_<{m6j*)jn!~R;^WW814vN-,ξD )& x3Ɔה 0( 3_ qD1P|Jnq_(oݺ].;E0#~ѝFNkU^{ 7h3/Khc҂ԏ _-$z `pI"-T.' <. 2~w|MO^L4IL'a^TQЊb:6Xyd-݉.a}ׇʥ"M[6sX lBN$S,N +#CiR颇ҦN-T}bͧ`Z=\\@0X1fB)XUw|'˃+8[Aʂm?SI%Sʕ4Tr`nQ.U5ɑQmAim:{;2$blM^B&O( =௃C(^1, U 5g@324<:&~c O=77jV-.3)!(h>N?jq<7zj׹,ҪM %{ҌysעWԷ ݦ/g_=|6? >9nin666U{ZKV+%Iw}O=*}v;g̫W ? Q4D]G6114bOMH~k\KW!aYTR-~X"sRE/5 $8<7r8Q$`qaYLALiRAlK{aj.05]@E~A&h ưAEȌ+~*prG"9&znܸ'|ɧ&::hŋ\ylߏ x{A֏KnI=|呑:8No4`F%[In[rmaT ؑ}<~?wW{(rQ f._6V͛R) XAx}w>^|E bvjRQ)QPM'Xk'!0K9'Y0y xM޽{qjԂ+c`Bӛy//^ tuulnb$x:XHWB 6'z;1bxlw0B=2)B@>]JnRyAR֭!Ր&Pro$c :ĬadV7ZbzBofRH߄ ߇2F]l5iNGj^i0 ԋ*C )O\z,L=㶴>vKz{z#ӏkU kAd(P-8tй겅}O*+8 T>}GB$0w_,u1`Xn굮.j?IN?T O z܌#wʇ6VP"h"ʐB*J mo@BPN& 驻#B ݝM oH$ 2]C~}/(}Uk[>tMMO"6%ycJῑQ:% ّ{'i&c Hے&%&hb<4 (*UBlocAܸdذ$I1;:eyƺ=Iɴ/G7?V@I5HΕU\`Mf7qU´YH"zA 9Wz Q{rJzjthIr&(f,r(';ړj6k5n[_dQ:X=I5yxx}^gy;\rZ` uu {jǶۍG-H`H2ANO +ᒁi)H>4uE 5|noAgøTZD` bE=508۟):x螘typ, (&.;*`,G`gw<Lcx~"br S2W[/=R\t tK(!.hScE=6%:1M0K.ʇ`&~ȴ)I\mh' T6)#=vֹpZWz)<:!9c3,:W4Uxd K(w$4I򌺻KzĈe cP5|xHi=COAkeZ+QS3ai`jI!eW$.\|n s$ ^lO,,rGO\Rh3L1|:!W M$I3OL+ψp}m0"[.帟Cݐ􄰁m'Vt>FťB" XX_ˎ;c%Ndx3 . 8 “EX?H_Le,17DDdp2/L|,7_AHe% 4cPHȌ2*`Z%gdDVeƲ,w*SzBtym]j~F&`TCv bKr} E2i wS/rozR:0ME%J*Jg-742(Wx_O.ЭrQ{YBKMV5) bk׮|rqqy_ \l/CV5OL~oL\ʕ+X~eYgE0 f&.:CT@t6'Akg-4*g} NÀe^ z D*5A槣<ёS_1 }$fkwFC,kpV*R(u$Kf)CIytP#F%mm>>~Févr;|DCc돿+h!aɝY5 h'CBHd./-e`20#cL]\=CBR>]L>sV!77775kUKS2u LbM$V[0fD' Ҫsi祿F4/ŏ2~hIt ;81As QFe.N$gg2"*NɹXoht9@ ,! iÈ.W>z/$TAFGN.34>&w߿"-Ĕavdݭ+ʀisx oƖxw8o) .ܽOǨ 4&jdtt6̇~(ȂҝQ !{vsWF6"ѧmdK"R9* "SjNI=,*0#{AebhM[;}av, I]%)^P1鋱zNR`k&]zHt^~2)(XАyRʇS0q@_G=.E&~sEO!INR#C`k6@]reݫrHk})513 G5,)\Kpx}u. !Dvh9nMSŐfV%^eLX>q^|k:]u~wtH17oނJj8]E tK ׯxcޓ;87Q0E=Z;K^o~Z 6V4tKH wq-6GP7 p%(!= raLVo,5 ?XQc ҈)7gf`G{&f(کB[H=dn4Γjy^/wvwWV6y] waKmnPSfs޴ZN*Xy#V,xn[tCKvI0Cct"&#{ފ٩"NBF2a@Kv+4b6RMpHG\ru}u rx;q]tyc< Aۂl'Fkڮic. D/uoaQ!vբ!yiG{\J7u c G0O迦9lx#gQ`%,a͛`ynБ>vbwǦ?N<@,qlVqny#,/ i:I‚z-\̧+J(. ]w4|LfF+/3-0#斵C{#Tݽ=(W kUmnl2%Z6ߏ2Y8BK"β_k\5 u~alBk Wӌwiu>TYᆛC-F_Ě, f0gKrjkפttN6}kRY Kb0'{u5jPZD< wЖmuܱr{6?Ã@7oބ4luMm"66J"HM l] 4<55uu`B<~g^L>x Kаco.>xÇ obzZS9Ҿ8uIpiqq8;QgtH8b<-(K;stwwQiNP*үƼ\/U#cuu1T 92Cި6<.ǔj'ey[󰃽ݢcrB[HL^zz`!7xe'lxfɾ8oQnq}42laBl޽ TZйȍu1qt?ᗙ^S%L%"8 ԕlD;sIT&]̏ռ=VŰyiyx jDD`?s)@ڼx`Y*3 'O$W=2aKneg%s?44ӳ5VqYP]N?,|.}:15}LC8^cnbACX^ 5mvM~zҷ"5REG9dX $sE͛_0k .G^u^ x:n=컓Ii4IcFIo.j`yϹaJi|Y3sϭPXhށ71rIYT s>0TfY9.} 3 hiَ a.ߖ6^=(aM*T8׌0}Pv'e،`Z]2D.=|zP{#x(ڙzJB x&=*xA1 ՝݃Z_=8r»xl5BׯfUC/Mt5KrGuXjbG]!_ d}EokA~V|8ͧw.Dս@$ ?:cZ\x?[G 1T.1}6wAulT%ūskxIEg=iglU !ab!ŋO/-p Y7M@@,j?<2ɹ^`'^@"qQX#ʓ G[G~SfҁfKa UJ孍MlQMgQCSELVaE-anhH=dRz!d TBIfՠԭЖtk{@PV1:: 7I-];ecmmSxX>"1{q k"avc;.?;vb0Ff6CP\9%\BSMrz{AZyi#6bɤfə?qte߿'<%.;$ֲrJn. #Q~jpꭝmdJ@WD4:M׼8.fci6q;g|D襺A6׎z6n=\. Ɨ7_⋴-,G=!qD1+{z:;vxP.>>\GS;^8$" W"/Q.ibY^`kׂ޷]oPS{|0H娆&yB jfW7$9~Uw||BBCCK+Ϟ{}(y+p}ï{ɑ2.uf!O&&S>3Du4U"L•isVi&rI*fdWU![:iwR|ڵ?nv^_]VϚ,۹7- b/R+B-=f6CI$],--A@9qI8{.KI1lDKu 3GJ@%H?_V i"Q:;&9ڴSNɖbkaP< IA~Y+USZo'?3 ?صŨݜ$@ZbAGsttt v?.C$>7j"זv wS"nf¥pgdyo}q *YP.bY%YGQabWȨ"C#5:`")[<J7D (-U/MoiRDȳ.\t>8W ׿"nQwNxn"2`f!aAysIC?K6Xb61i86B@0E"p~䑱Q)V:^:]z+4UW đ^Z#J rZSZG0ݐO?ۅr/Ð|ikY*;*V}>t)G4hht1[e*(pm&#wv拕2W uaEawG60q93c İxSF9QVI>|=pmm6V$  QEQ)$>kׯ_2Jl VRfniwW)}lx02Rp.tD _Wuv*~D A0m dGtn|͛M=1:n-y30wUYD>/73v.v}t"gdf5EW3Nњ]0Y, Wx5&NCe-..LQhWo^f[, H2ԋ oԣf +!RqxhT<#d~ p J?P]\^H*RRn|JCo}p⥱fʶE 2>0 p#>XE )aKPPjf~%<2p)}7Ty`0/NAPu lmi2~9l "d^Q{I;;[2Ò<cgKZtLlT^ ';Ү濃#&._++3mRQArXxdQRJk}d#G-C-2$Im*dw[?{rB*{W@~uq.T'(EQս^`zp5,`";S]S.Gix1~i]̇|jFã&gOa~|Wpn.hZ)~ ,FFͿsa,goF)5?`Ǚ.<3 0xA-u~8= w;wML`BD$=EH==2{lۑ2l8+DGx;;޼.YlݕAuQX;nѦ/;v#}2U-@6kd9{T;pi7L?_[[Qeˬh75bt%H& woDdv;vceß,gTK'=L?6IﴤΜ]qiqMp+$ay<@ Q J<{4}MsG穓=p1aTw>[Ͻ$kvV+E1Rݪ Ԓ%(WZ5ꍞnmtʞD˅"9?[)[furKϖs=5pΰݳKogIWO XVFsl)i6~6}"NƎ,oy!{t:OJ/1srDBޒ[;vXs'6m@a/'Xr4)Z|"%UL%նl^viim9Zؖu7xvjVDQ]Td娶F_.ڽ{._RjpNsYlSp;̱lyOOK=]&&dv2O,êRӂ˼W^=zpi4_Se8"fzx'5.M)oGNIiz'6Tp - ܾ@z*^=]7ƪ89bC{B>bP;8B!m6="׼ڠѐy++cc׮]h/{> GpZhoiGd&yd91'|<:iNQzGh8Y 6 ibbGyA3z.bQuM<`9ាY]Ϙ ]qhtȎo|~߼y3i+duG.͊3=/-,-)H7RPfp:"dSZ ĝ;weU8 $"R!u<*]z#Jr؜##7n'AVduO `h$ ϩ~s6&hnQ_uҏ+l)OųqG^9B75-LbKMc4|خ/_f(ZPVHG~C:baR73rHttL8hekdf7(/^Ą|G>l4ϟ8Iiǚbyy$F]VwMNh4݃f(u\%:1 =laE3 j'% m|9I))Cx Cjr@bε `zX7]vEvN ~:8[֌u(\V1Q ;7&`* !2(I/I-'Y.t2J).ul}<[ym PWAwx@ F-< R cy?|8$NِTyi*xrne7eOۻbj#:9 صhfn)XJ?a-qR) gսfT;3i>d2ҏ?[:ƶXn)gZ"هmy̞$(qvNxYnL`6n24~Ypw"' (AcE:~wDF(CqᇎٓUceCF!iXQiT@`~K$$٦Al`(n9PQ5Zu$;nagios-4.3.4/html/images/logrotate.png000066400000000000000000000020751314764422400177340ustar00rootroot00000000000000PNG  IHDRW?tIME & pHYs  ~gAMA aPLTE19BJcs{B!JZcRc{6~tRNS'4 5IDATxm!Emc֭,PjD'x/ʟ~I~a?o;& ^)ZL:\^1%Ml!"Ft=WG+Rw@BaX!;vms AI!U0]jԀZËW l IENDB`nagios-4.3.4/html/images/menu.png000066400000000000000000000002411314764422400166710ustar00rootroot00000000000000PNG  IHDR+EhIDATHKcd` bIg@l@/>yև@.KX. f: O.`M]%:|2FSe) Y7[ǣ$IENDB`nagios-4.3.4/html/images/ndisabled.gif000066400000000000000000000017531314764422400176440ustar00rootroot00000000000000GIF89a1119))999BBBJ99JJJRRRZZZc!!cRRk))s11!!11!!))99BBRRkk!',O8A&C% @)I'`zAdt+Ļ6YV݂۔x9֊ :$8a;nagios-4.3.4/html/images/noack.gif000066400000000000000000000016311314764422400170050ustar00rootroot00000000000000GIF89a!!,v@ ,8 Ĉ %V|1#Ŋ=v0ǃ I~t BN2@́Q^ŝ<'hБ6t92eğ5[45CA>(T)S4lik̀;nagios-4.3.4/html/images/notes.gif000066400000000000000000000030721314764422400170430ustar00rootroot00000000000000GIF89a((!!!!!!)))!)))11)11)1111991JZ99!)911999BBBBBJRBZcJJJ11J9!J91JJJJRZR11RRRRRcRk{R{ZZZ!!ZB9ZZZZccZ{ccc!!c))cJJcR1cRBcZZccccssk99kJ1kRRkcRkkkkkskkkkks))ssss{{Ƅ99{kƌccƌ֔))!!))ZZc֥!!ZZccRRss!!!!1199!!99έεν11֥Ƶkk޽!!cc甔kkﭭﵵ!!))!!99BBJJRRkkss{{!,((] H*\ȰÇ ?L!(3P!da$(MxiM&! x#cXr ,j>ĕ!>dA>F}jɉ2/@qe@?5X8V$"`4W`@;nagios-4.3.4/html/images/orangedot.gif000066400000000000000000000005051314764422400176730ustar00rootroot00000000000000GIF89a   @@]11Goojjee\\XXDDb++>""1$qqoojjiihhccPPsGGfEEcCC`00E!jjaaNNo!!/ aj?D<@5712..)'пʽ!, @b@ a"PfS!xPlV$`bzHʐai⻩`,pa| _*.Z5% B/oY&B$4o0I !"#a_A;nagios-4.3.4/html/images/passiveonly.gif000066400000000000000000000017311314764422400202670ustar00rootroot00000000000000GIF89a!!!RRRkkk!!))11BBJJRRZZcckkss{{焄猌甔眜便ﭭﵵス!&,MHD % &>H&0B&4T0!"$4a LhB /,Yb  ld%d0 >!37zP(kYg Uv`۰hǚx;W.]d @7 (X1Ay2[jjY;nagios-4.3.4/html/images/recovery.png000066400000000000000000000026051314764422400175710ustar00rootroot00000000000000PNG  IHDRW?,tEXtCreation TimeMon 31 Dec 2001 11:54:39 -0600L)tIME ;0߳1 pHYs  ~gAMA aPLTE!!19JRZc!ckk!s!{!!))))s)))))1)111199!{1!1!9!9!9!9!9!B!B!B!B!J){1)J)J1{91B1B1J1J1R9B9JBJBZBcJRJcJcJcJkRZRZRcZcZkZsZsckk{sss{s{{{{{{県ޭﭥޭֵﵵbQ+ztRNS?&JIDATx5[O0/L21$W;n58EATg@P( E>BQy?xyBU1J=w=֎K&=l'AuFOGJROC9d~:π2k݄Yf(Z,HjɄiU`kn΀`dgpQ?S(@dD)Ev kJ8%B$ %t:jI#BnMDl,&Jq d Cwi4􄪤NI=CJ_r8z.ui8m^r9\ZD'IENDB`nagios-4.3.4/html/images/redudancy.png000066400000000000000000000126171314764422400177150ustar00rootroot00000000000000PNG  IHDRvBtIME  † pHYsttk$PLTEBJZc!))))))11)11191)11191B91999199JJJJRJk91k99ss1)s11s91s99s9BsB9sss{sksss{{{19{9B{B9{s{{{s{{s!)!!"IDATx]۶S[@h?Է`IKb [wg s,#oI'Ϧz|I R)f""7OB2$_E2d.*H$=`jp'Vd k剀qO 4O*#<XAy)^d5q1q+d!YxrC>NklSLtŶu-<✱kC#YՍEI&ϓ4Lv8xD9^d<<%mCi44 [ ۖnٶuۀȶd@-E6 m)-mKQ nl[m@v dRm[ ۖnٶuۀȶdpFUaa%<%6\ y{֣6.-E6 m)"یdU|x]{{Zy.aDU<0$ExhGOgc.<$Kn3u$"[$tWpI:<9/.}'zy.*@L-z 6FRݢ=ݢ=%7&$=L-<5#|mcP~m&-ܞ:Dݫ80Jױ(%R^ 5EO}>nZB)aϴAJ Or\K䍦O H5<`56#Yl36#Yl36#Yl36#Yl}?xHi:zozxnl[-ŖzBo8.ȶ2Nv^kK?}r d8(I-q 2Uwp-mMQ{}M- ~tH`uh/V3r d#5wS'?Dx(c'3%L49{B{'V3r dD(/l8aM ~I$޺mBmԪiNNH#6c[ &$S9 ۪ Lեm3Rvj97?ǧחu dۄ$#GQ8 Fk~6҈t󈖲ɥSS>QMJP-m^=vX֌lrNۦb#1DByk.KR^ɴzgwzgwzgwzg \='s4[9Js-u'%bӋRh*ya?܄&>[jRbޜOxKV7O\2RFM<\_f" G֫9S2c<ɦM"F6lSɥ qN~0y>䜕S]q|a:26QT˅u%:7~x?\q|qH):l"S UKr$|riP,8>%-0S̴eg!.#k SO̷JZ3#Yl^<=Z|bYO/-sX/;/w=ڳ+N 9B>x?xbJ[4֞Q&~df$<d=>0R|Bqۙ[/.֫')s>%ᇯ[f$$zyBg[dB}龞ONl8J~Yi Q!4([XAkvIv0Dlcs Ff F6f$"6J }<6dHE6 l4#\624aM7eS.YJF2lɢ',FOȰ Z6gڣrڳjdr0cɂJ3 e.)ɘ8&R[+ZtŘ'\a$KNڲ+H&Mqԏ]qu#Y <^4~[ȓW) 46;\^%ogs@ 5%0lSg#;d opf Y'l1f\Ӫsof,}xvvvQ{qTQ #;%|Ԣ5ծ6d( QLO^YTV$ AOՋoųb6ۼw}]^_tjgA[,5n ϟɸ vxY/?z>l#rP_u|. ~ ߲ b0`XD]53^xNN @8p"OyI#:<};3loYODwZVHޚH֠Φ%eQbz`q0A n;%|Ԣbf'څj?&32 df(}uk(Y{觨=o8T250̠RcJV6[e+i~rrWTތG<+Թ8YQRGoxU[U<04v+1LI+sqfܕg=^5l[ůC:H :nNv$mDnBo˪yty4m١+ Gҡ|v Gbɣ{~Y~Y 2:z#Y`$dw0FH;z֧MS>IENDB`nagios-4.3.4/html/images/redundancy.png000066400000000000000000000126171314764422400200730ustar00rootroot00000000000000PNG  IHDRvBtIME  0C. pHYsttk$PLTEBJZc!))))))11)11191)11191B91999199JJJJRJk91k99ss1)s11s91s99s9BsB9sss{sksss{{{19{9B{B9{s{{{s{{s!)!!"IDATx]۶S[@h?Է`IKb [wg s,#oI'Ϧz|I R)f""7OB2$_E2d.*H$=`jp'Vd k剀qO 4O*#<XAy)^d5q1q+d!YxrC>NklSLtŶu-<✱kC#YՍEI&ϓ4Lv8xD9^d<<%mCi44 [ ۖnٶuۀȶd@-E6 m)-mKQ nl[m@v dRm[ ۖnٶuۀȶdpFUaa%<%6\ y{֣6.-E6 m)"یdU|x]{{Zy.aDU<0$ExhGOgc.<$Kn3u$"[$tWpI:<9/.}'zy.*@L-z 6FRݢ=ݢ=%7&$=L-<5#|mcP~m&-ܞ:Dݫ80Jױ(%R^ 5EO}>nZB)aϴAJ Or\K䍦O H5<`56#Yl36#Yl36#Yl36#Yl}?xHi:zozxnl[-ŖzBo8.ȶ2Nv^kK?}r d8(I-q 2Uwp-mMQ{}M- ~tH`uh/V3r d#5wS'?Dx(c'3%L49{B{'V3r dD(/l8aM ~I$޺mBmԪiNNH#6c[ &$S9 ۪ Lեm3Rvj97?ǧחu dۄ$#GQ8 Fk~6҈t󈖲ɥSS>QMJP-m^=vX֌lrNۦb#1DByk.KR^ɴzgwzgwzgwzg \='s4[9Js-u'%bӋRh*ya?܄&>[jRbޜOxKV7O\2RFM<\_f" G֫9S2c<ɦM"F6lSɥ qN~0y>䜕S]q|a:26QT˅u%:7~x?\q|qH):l"S UKr$|riP,8>%-0S̴eg!.#k SO̷JZ3#Yl^<=Z|bYO/-sX/;/w=ڳ+N 9B>x?xbJ[4֞Q&~df$<d=>0R|Bqۙ[/.֫')s>%ᇯ[f$$zyBg[dB}龞ONl8J~Yi Q!4([XAkvIv0Dlcs Ff F6f$"6J }<6dHE6 l4#\624aM7eS.YJF2lɢ',FOȰ Z6gڣrڳjdr0cɂJ3 e.)ɘ8&R[+ZtŘ'\a$KNڲ+H&Mqԏ]qu#Y <^4~[ȓW) 46;\^%ogs@ 5%0lSg#;d opf Y'l1f\Ӫsof,}xvvvQ{qTQ #;%|Ԣ5ծ6d( QLO^YTV$ AOՋoųb6ۼw}]^_tjgA[,5n ϟɸ vxY/?z>l#rP_u|. ~ ߲ b0`XD]53^xNN @8p"OyI#:<};3loYODwZVHޚH֠Φ%eQbz`q0A n;%|Ԣbf'څj?&32 df(}uk(Y{觨=o8T250̠RcJV6[e+i~rrWTތG<+Թ8YQRGoxU[U<04v+1LI+sqfܕg=^5l[ůC:H :nNv$mDnBo˪yty4m١+ Gҡ|v Gbɣ{~Y~Y 2:z#Y`$dw0FH;z֧MS>IENDB`nagios-4.3.4/html/images/restart.gif000066400000000000000000000017111314764422400173750ustar00rootroot00000000000000GIF89a!!11B9BBJJZBZZcckksRc{!!)!)kJ猔!!1ZB)1眥!1)1)9)919ZZs)9ccﵽ)91Bƽ1B1JJZRcck֥cs!:,uH@B78 8P48!q_H(P`YD@7"DOpP"DHPhA #:ƫ@pA5H#gxpAGm9^xcC"x@AH ,xc-ӱZ ,B;nagios-4.3.4/html/images/right.gif000066400000000000000000000021121314764422400170220ustar00rootroot00000000000000GIF89a$ JJRRZZcckkss{{!,$ H`A*\HC!"aċ 8T"F9vxq" x谥˗Q"8R &L!4h`3i2S'O@55lϠCi@ Ա)8kpڧ_zu.jz*پ XiWp["V8#x k6,6f0ܤ)3ֈy۽SW֪]אOM Ǧ9}wͱ& LZ3lXmֆI%_k=({C4='ٓ^q~A~1={ݻ^N3fLӦM~Ǐ~EEE9zR߄"cڴim5ɔ)1СT".Ģ'3i*T K۶mma(QI:zEf% 8zRv'AYQ ?^Z5&~~~=襘!_|>|g$IGO*kٜ֬9sFQh 5RNwޠ A|eȄYfuJpʕҤIiv8~۷tp-ca`tssCsNJ5gϞ۷oL9i1EDD'lٲ-ZexAq%Wʕ+WfMt`1ruu<' e,_nRŊa o1UVERP3y:|( R˚U]Om@3I.hڴdQCzF(Ir9'R~(%RNh{H*$iPț7 K. Y߾}%38Iҙ0ad Y $AA\xh,7i,4 -mRvQǐmjn[zd7[(RȰaHHRZacC P8Yfĉ%қ'NBqf] .JQG HlDH[$>TKZdܹs=~~~HS(] Q(0f̘_kYU0`hL> -ZġІO7!.dp1р)$+iԀtrN8RH8qQjbtih)YʭpqqQ[#FǏ.x۶mJa .)S&!Hު\Q**,Y2u]34dIwv A$\d~i ڗT:|||juH_Ǐu׮]#]B Q2gd'GFF2_ 21jdf%H[?ow,4P ,8[ӧO޾}[&mtcҥ@oݺb(IGojl"ZoiPʐ!BCz ExDDC̜!@OT5tɈ 6 ޽{a8V#XOO~WqC?f~Y mIENDB`nagios-4.3.4/html/images/serviceevent.gif000066400000000000000000000016761314764422400204250ustar00rootroot00000000000000GIF89a!!))1199BBJJRRZZccss{{!,7@P .X0-^XQFd !"F @#%",Tx)4Tm84Ȱ #XZXCa{oj@ ;nagios-4.3.4/html/images/sflogo.png000066400000000000000000000007251314764422400172250ustar00rootroot00000000000000PNG  IHDRXTtEXtSoftwareAdobe ImageReadyqe<ZPLTE_jrt~jt{ٔв쪜I*̹¸鞍mVRIDATHn0Dq)'3of!dC ArSp g]{%rR.jjd_gW7T{]Eud0MqX.\v+ۘ^npA9C3ATYY1J% i&bS#Y}R %zZd)Q@ڊ\ÀkZʿgB}:t_ jOH^.<~{LSlFVkj`/?8(8? 'S zIENDB`nagios-4.3.4/html/images/splunk1.gif000066400000000000000000000016531314764422400173130ustar00rootroot00000000000000GIF89a! !!!)))111BBBJJJRRRccckkksss{{{,! /H*\B BL8\ A8C >  @0@d̍.n|p.L@BHHoBDZ@ &1H@H*'б:ȀkR T4X1ݐw`@;nagios-4.3.4/html/images/splunk2.gif000066400000000000000000000016501314764422400173110ustar00rootroot00000000000000GIF89a! !!!)))999BBBJJJRRRkkk{{{,! H*\B BL8   A^` " pB R .nD& `@țG^ ;n4p`Ȓ@B`4 W.,Њ@$F["ݻx%;nagios-4.3.4/html/images/start.gif000066400000000000000000000016251314764422400170520ustar00rootroot00000000000000GIF89a),z  "Dh *X0@^bFB(@C!,2J&pKo*l2˛{ j"O3iS)̚E:rHWOjL֜\bٌf ;nagios-4.3.4/html/images/status.gif000066400000000000000000000016531314764422400172410ustar00rootroot00000000000000GIF89a3f333f3333f3ffffff3f̙3f3f333f333333333f33333333f33f3ff3f3f3f3333f33̙33333f3333333f3333f3ffffff3f33ff3f3f3f3fff3ffffffffffff3ffff̙fff3fffffff3ffffff3f333f3333f3ffffff3f̙̙3̙f̙̙̙̙3f3f̙333f3̙333f3fff̙fff3f̙̙3f̙3f̙3f333f3333f3ffffff3f̙3f3f!, A&@4ذņ2ȢG%2dHFv,1"ʂ/Bt2C45R ԡ'F 1scN* )$QG'YiCX1<י5 hSd=| ڗoz€;nagios-4.3.4/html/images/status2.gif000066400000000000000000000016751314764422400173270ustar00rootroot00000000000000GIF89a3f333f3333f3ffffff3f̙3f3f333f333333333f33333333f33f3ff3f3f3f3333f33̙33333f3333333f3333f3ffffff3f33ff3f3f3f3fff3ffffffffffff3ffff̙fff3fffffff3ffffff3f333f3333f3ffffff3f̙̙3̙f̙̙̙̙3f3f̙333f3̙333f3fff̙fff3f̙̙3f̙3f̙3f333f3333f3ffffff3f̙3f3f!, @A^aC.,ذ@2Ba 1fDȑ@!GvTőX]cUǗ(qÏcH1Pvn$ѣH!lI&=Z:qǟ94ȃهD5{vAlۢ8d\\%R]7ޯ?(UĀ;nagios-4.3.4/html/images/status3.gif000066400000000000000000000016671314764422400173310ustar00rootroot00000000000000GIF89a!!!)))999B9BBBBRRRcccsss{{{!,1*C #b`!D )VQƇ 42a P(90(`0|PBZH2$Ni# "3ANC&JKgzQ$يzmAj'u1mDs/x7/Y ;nagios-4.3.4/html/images/status4.gif000066400000000000000000000020051314764422400173150ustar00rootroot00000000000000GIF89as)111199!!BBBJJJJcccckkkkss99{))!!!!BBέ֔ޥ!!9911BBccss!@,*C #a!D )V+Z؃I6p*8,X  bB 5|pbD 2ChxF- HhHa XU` &z``W tౣf$" (6<4\pHV DpA*9LqaZ ز[=w#͚7;nagios-4.3.4/html/images/stop.gif000066400000000000000000000017131314764422400167000ustar00rootroot00000000000000GIF89a!!))11BBJJRRcckkss焄猌甔便ﵵ!,-(p*\C.TCPBƁB(0 N T sM rS *x@?8 @ dxd `%  ]9%@(/U;nagios-4.3.4/html/images/tacdisabled.jpg000066400000000000000000000024121314764422400201620ustar00rootroot00000000000000JFIFHHC  !"$"$CL" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?+Z2[v5J~ϹʀIwfó i!ej[Œs#""XgdG&k5N6M4;炙Ji4Y%fQE}9KkO.E232? 5T~h?f W#P2k񝶝&^IDY@=ץs7:m"/YS.y (9'&iZ/w志l~kxxsUnl=E SRORi[ШҌ?[iGJkVѮ$e9bcnm-oB6Zd::烊BsET/W}Onagios-4.3.4/html/images/tacdisabled.png000066400000000000000000000024611314764422400201720ustar00rootroot00000000000000PNG  IHDRL,tEXtCreation TimeMon 31 Dec 2001 13:25:57 -0600|qtIME 1q pHYs  ~gAMA aIDATxڥW_hE^.iOI1I!MhkI Pki'"}C} B@ (TQZ">A#BC(A#hc#֘\${{3^dg7~of5HOcbJ "@ j8%!4]퍮]}jrDšm}0nlJ~e:u<)nKS 31qOg8![^U`Qf=ˊEȻ3w:Țgh?BoNO~3M66k'F9W˟6=:5k6 4(u"z&;7<Kżڐ JՕigz  ;AO7ⲕ<5Ͷ`B⭚4':x/OonPܚ~՟ W%ioszb(ડIENDB`nagios-4.3.4/html/images/tacenabled.jpg000066400000000000000000000027651314764422400200200ustar00rootroot00000000000000JFIFHHC  !"$"$CK" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?7 ^٥WTxQ$CT-4]o+Gf C VlU3u" *SU#k;ލK?idغVwk߂n};ZEQ_F_ kklMlF7s^umτEógm܈mF͑|?7۱Q^-u{4_>$k#v$(=kGcy7o%: F'%FN=z=M𴚮wq*jqۉ6+ > >{|1P[D8`TH$;נ]5]{iP}{6h> t[9>ZO]Jz< u(/}TEnSw_c'~-.ӪM}Krgc )iykm5۪=ڊ(>>3ڞ;=3KT+-Ūݭ YH=|7gxGKon HnXmoJo0!Kcx:ƫ|U s-ƞ; 6IuoՌ?ӤwYe"e˟>w7\=8Xm*EIK{ާwZk;[P`UZ~KTƠJM7{ZԨSO.Jιt_ۨYtusAJ>#_Worgʗ=`H¿GxJ38i%էָcRs&}\^vkð)\(ϞIXYknagios-4.3.4/html/images/tacenabled.png000066400000000000000000000021311314764422400200070ustar00rootroot00000000000000PNG  IHDRL,tEXtCreation TimeMon 31 Dec 2001 13:25:50 -0600֮`tIME 3 pHYs  ~gAMA aIDATxWKLAh<ã#R$1&) QJ* |bg"5o?u6Eℶ[JVRH5D$ʘ t'OwO kRٹyzfʢPJmUٿ˔C2ha2dSZjbz%Pb{KnIРax PMl(WrIu 1:`:1S >VUuL2Y ,sfwË,`tY+IXב,5ND 4/JOBdM=3fyZOԴƐ$uH) 7Ø RV$IB۶7cͦ{SJ`m ٭(: Xu:/nIENDB`nagios-4.3.4/html/images/thermok.png000066400000000000000000000014101314764422400173750ustar00rootroot00000000000000PNG  IHDRdU9,,tEXtCreation TimeSat 12 Jan 2002 13:34:16 -0600tIME $1 pHYs  ~gAMA a_IDATxOo06HK] v `.cWƇ'ĉ+Hp`' DvqgNᲭaMl6Eɳl=??z6T*ok4`rr&0ӧFx$eЮ7̙)]򈡈Վ7؝eJ圥Z^Jfe9 O3a򈡈 |njMn,h,G>Jxs:7Mm<jDoG^s ;zFo $/Z%w*Yܬ}\y|oH =؛{Dh}fl" `@a̲zE$CpcP,.ܙgɉQP2N@>r* / 0!D7D#5>,gM2IH԰&(ϚyxPBcwxbRƊf|*gM6>7I^bܶ+Gj# 2Zbݷ`KVAmt4${Φ/%GEvǼzHk䍒$o.=PY[*zѿF!NPE ~{EIENDB`nagios-4.3.4/html/images/thermwarn.png000066400000000000000000000012441314764422400177400ustar00rootroot00000000000000PNG  IHDRdU9,,tEXtCreation TimeSat 12 Jan 2002 13:36:21 -0600OtIME &6 pHYs  ~gAMA aIDATxAk0%W3LNOm 6OQhOݗ''; c0CI)q6K4do;i~㽧'˴|q::W!WT*P"VP?2<ן`j4vͭM/S0-x<}Κ/Z]Ǧf)i::<ଡ଼I|qf6MK(lAԷ#LKzqttkL@$X )e&c5Q,>]i=V\@T"AM뱚 PF|,,vX Yi :D*@",@iZݤڸ4,2ADD"k T/">ExRΩ;垢ĥɛR Y!j۠".//sIlllc5I"%g׺_5MJܽHr1L=Ze7ׯ8JjHiG$ _0޿Еۉc뒝ϴh_IB=kOЖ8VIENDB`nagios-4.3.4/html/images/trends.gif000066400000000000000000000015461314764422400172160ustar00rootroot00000000000000GIF89a!,CH*\ȰQ`EFHqƂ!bqE''fL9RH/]I͛8;nagios-4.3.4/html/images/trendshost.png000066400000000000000000000447261314764422400201420ustar00rootroot00000000000000PNG  IHDR,+tEXtCreation TimeWed 3 May 2000 15:07:26 -0600 tIME,.Of pHYs B4gAMA aI.IDATxx I @BK(DzJD"F(xZ"^X@AAP z-P;&{|9;{̙<9S|.\0 \Nq\rH*qiaTA~ɝWX5CI,N eG 1J ˑqNzɨ')i%Y1Q82(s:1Fy/ڵva^uҥK?p.[ANnhӧOM911aÆ}Q|RRR:qDS[n˗//VW_}eNܹcccϟoСCDkYu3N){/AIT6cgnܸ}l0:a„ܺw0jw+T`ʥK7n\bbb&M겅QLf 1c=G[x>8r!C8)گ^r94_RZ}'] jD)ӧsΊG1aT4&&ǧu֣Gvzgpc9(Ccp a!1Q80 F(Ccp a!pmt%44'""78w(!!!u/Z&GM4ٴi\\e\[111*Tعs Ξ=۫W/gE+x n.GNYSSS}}}ҥK'''#2|ܹ\r:u{(זg>}+l3݋-Rކ>ܻRl&MV*gє裏ʔ)Q;[Ӻݻw7億o=wjZhiN-жvڥªU|ɒ%*o۶AKbcc+>n8ӈ zn X=w ĵE6lѣK,٭['._,7cbΝvРA/w^z 2Do;vhM{͕+hѢE–-[Q;[(ܹs歚mݺ#GLkVڷo՟z=zhIƍgϞ^Un:vXhD}%];w?( >c Rѣ*TسgOFk#J~ G'N vT6o}RJ'Nvwvh{ `s*jKl'=W^o@PmԦ6lTB z͛7oʕr&C!!!;rȀZlwF~m۶3㱱 f)]V7nW*n7|Z~]du__߇~8..nժUC 9wvرcU| p-+ʕAѣlj'G-[3eҥKB?h{ӎ>ڸqW;;w6-HIwV\xdGQ9,,lVs[S;tl+/^^UVU^pv1~Nw* ݬc !1Q80 p5}۷]\[{v M0zMtp a!1Q80 F(Ccp aqY߇o>a4XJG p a!1Q80 F(Ccp a!1Q80 F(Ccp as7}:ub߻woFnzdP 0MF(Ccp a!1Q80 F(Ccp a!1Q80 F?;p۷]\'ֿ{v/_a4XJG p a!1Q80 F(Ccp a!1Q80 F(Ccp a!1Q8… N&ѷo_zt6(4=Ccp a!1Q80 F(Ccp a!1Q80 F(Ccp a!1Q80 F(Ccp a!1Q80 F(Ccp a!1Q80 F(Ccp a!1Q80 F(Ccp a!1Q80 F(Ccp a!1Q80 F(Ccp a!1Q80 F(Ccp+9p)8qbݺugϞͨɓ'}}}3i-OZG5nݚdɒnk֬9wܱcǎ=jj?^2i… W>ʙ3g&+)R %J(P@PPPŊT- ͕+H>W|:lٲo>7ׯ_xC)={VuZPT5ʣ9rPAT1׷lٲJ 2ONP 3g=JJrR 5aaa+V UBUpjQpQܸqdP%s]b 0y˗Xb&k*UH"ZnϞ=h&s Q:m6N{1T8} OvMBU<-TPTflٲ9sXBԩS [JZ9rPT2R1TYd]c$ʋ +MTKws V[EX:c%Zm%%%ȑ#mҪ)e;vR26jG/,ZhRRҕ5ChJWxZD7%*PYf1Lt% *˗OMPJAͺdMeYA%3Kk7'ܵb&JIΚWTggnڣ5k{ʩzkeb#n JڵkMɓOkOK.]\ *,XPdzN:5j(WS(+9py&M/|̒+xr7w yΜ9MtV'P@e͵udG.[lΝ{5EI%J*EGGW\ٞ#m0SV-&M()SFHSNׂ2 Z{ueaZ7Q2vڥZoU>~ԩSKTO{}T05(mӔ]rrERSԠ5zb ݻ];0ZfMSL1%ĉOh"ThhhAݬteSY3,,LNlܭ|7=¨#ڣRիׯ_o*_4iM>>qlٲ)+WFuh]}d̝;wŊ֭l=o]Kk7*rOڵ|ƍ8זW\š5kҽ̨TR˗WW:̙3GQ_hҭA67d}tH/S4HO?kz gFEE5lذ\rm8M]x+v=#G\}%x;[og[...NGO<`^xUKTcǎ 6/7nᵯٲe˦Mf>won0 ?866vϞ=^ZoL2\|W%Fn 4h~3X+>ժU>͙ƍF޽~jPB1117r |{1KiڵX=N$=y o3DU_{&[j5f̘^VZ(i|nVR 6mڻᆱ.\,_Op?+WTYf@@5nx…;wE*THm5jR}[3fի>UR,RYEƍgoPPYVaάeZS4 JVtiZ5ұ|ܹӯ_-[+W.OE[Rv_~12{qŶmֵkWhǬY_Hb(< ,hӦMrry[XN:)!'SSSFd(<#3 b Vii͛7>?Qf2ͼK BDTH:{l\\|tM6:ujy1uԈebb}"Km)USU3DFFsV{.Y&y5cfG:>ZK92%%7ЎX=WO^v{gΝ;׷ok>h, ՈvA[k o#zC뮻bcc/^|H-غuOQF*U:qIAZ7o^<%NAJXUg͚5cƌ+߮njm&m)mk[~~~V4DDDԩSǣC),Ӱ XYl ji3gݻw׮]sTވsFheMбc*&=Z m-K.WW>|91|]ti㌌KeO -[i߿?66V!&}ڮ]{>3kQ5%?s+J___E޽{_7)+.]Z=V7^L2NR}Hr?^yk:TAhCUTQVnP VѣGի 9Ck)Ν[-x\MF,~wޮ]YF?ƍ-ڼysEQFP>c{߾}wڥ͛7O}ѣ=j^{5'Ul ؓez)$p|rD˕+ofIt4ITIgϞEU S0*P֭[wԠAnݺ+W/SLQYiR055uȐ!Jo.wnv˖-Ç0a?n?oA;ݠ1bgϞ55U3fkXTu+W*y٪U+{rO}|SPtWVP{~,nGСCbbb~6lؠxr:>}Z{t%9T;3l7|s ^}YHT}TH"%K=ǒ |gϞ믿*#jf388AAAf[}U.^x*UL5=WM游8iii:'N7ꫯ*jȵPvڵk~P}ѣGժUuqGyĚرE=qm_|a*+ITSBSP3fr͛HeAE0gyFRJիd-opBӔV6mwQT)%Bmyo] {٩S_۷oWܳgO``5J)v-F:-Z07gzO+VF:?֭}ޚyyng%J|G9r:tH x>[uQvŋ2N %&6lر*(>RgH^ttYǏuխ[755uuC^L۪U9gd{K,15joc(ٌ9̘1c„ M6}M?FZ:;v<%%QЯphPFF@,XpwPX}zܞIABO?5Wy_4nذO>晐e˖.NDcshٟy֭[02 2O$ةS'_~ԨQ~<&%%)$/_D?ơݷ~iӦ.gcL }3R&MԫWϣGiT\.]dDeΜ9>J>c Xϣ7ef.Iӟk9#\o^YN@>%K'#曄Q;vt>z13fX| AAA:uxĎÇ]ܺug}TSjjt>J… ]&>|ĈG͛7oLL{wvʛy,꣏>zIL<0 K/gh;h*\*I5jTr7oޮ]\1nݺ9~ұcǔ< ѣvz뭷[*~7Æ V^_:thȑ(us}͜9??9˧Mf˗;=*\pa&\f4njgm֬Yt{Oȵj :oݑ 㤤$(4x`suEI3gTzhҥKakt,믿^Mr-zUg*o޼ZZzSaTp{90*y­}CJe)S>|~E9-ZdE6lxcZN:ջwYf]:dٲe+\pHHHFUߜﯔk>2*ɨQ̩};?rqjsmرcw6\\7iӦjժ_~￯%x`֭#?ٲeb}]weuidV\͈ٚ"իMswٳ ,nW^yeҥgΜQ4Oҫ"fdddv:ud?#vٲe/bn@@لYǵJ.#ҽi޽~z͓?aaaֶC>L;kCZ{駟y\M?c W;r;vꫯFL2чTTɻ¦M\;4ժULfBnj.\;pzҧfno0 ݚJ}Gk֬Yrȑ#͒QF='OTrdZt/`RlU;;vȑ}}g͛7ߺuSٲe RV3J 4hШQ#k>]111ǏWSS Rj/^ZRKdO*gԂ>ڵkRsa\w/),,0 @3wiKo@of&atǎ3.}7wQFyڗ={vݦuQojeyfbŊ%$$<3J={lѢEDDD…{?VϜ93vX'Ip(Bb{(Tɓ'9勫PBǍgN]O >^qYf/#_>h:_290 ` [Ν3W͗*UʣBppp޼yoN:gsLvXӻxqڜ9s; Ҕ ǎV=ܣWHɒ%-ZdbzAs[(REf͚lvs)1ctX&+55D7o<g͚կ_?5`Puۼkҍ+.%C{sz@/_^N: 6l2dѣG͠od[h( ̙3%%EhٲeaTRŋ߼yoִiSj;EЃ&''ϙ3 gM;]>y%KV^=jԨӧO:uĉ :tO<o/mĉJ3 ps#gΜya LM41'A[nϞ=7XHhSќ̙3Gݹs\5r_θqT Os)ڵk޼y6lh44eʔSlSfҥӦMszlٲisd]T%Zc 4n:cذaSO>NwXKs %jժ)9+(K.[v[3i0$$d͚5yܹÇm~9JǤzaaa/\pDDDɒ%+TСCؘq`W_}qHGϞ= `ڵ{gYS-Q̝;U65Mfվ/^[>oH-˪`\Ξ={YjԩS.wWTV5@yu;""׶nY5y3&m"b>=pC%vfw7Ug;xP~͠xddx@2 (`Q{BUV3f}wʕ3gĿzV2c1 f秜WSsʕ+TPkSSUӧ> Qkٲecccsȡ`}+VhlT2 yܹ6lP}:>CU]Y꼖K7n\͚5D-(oٲ{Tl_^y…ڴn?}qZ۶mnbe[jz!{Nz3g(*nZϚ78onޞ+WbŊrJJJjj5kNůgBB_|N>|x޽ 'N{*QҴ4.}o>T2p@uSdׯ_^Gwu\)1b„ & Z>dP>|[oUVݸ̆=$QjGe7:XIjժ?)\M.p3gTBZv?`avQaÆ_̒+*ȑ#UVB4s朙<3gf-(#yxxllle;٫~w AAAл.|ݾ};oRݛ$xb >>v" 'NEFF0ӧsss_!pQ-۞*,--Z[[{yy}ȜE.yȗ/_222ƌckk+3==uVѬzz=; T*۷߫n=rȞ={x_nƍ0Q333 '$$ EF id&C ݰaތOFbb[.ܼyw,I"`;wn۶mw`''N}P hĄD-M60=AAZ^zuNNw/]oС<TƍW\aHHERj4ˣG5e%ݻw;͖tQ8%K ~῁v/**\k.6d  ~ѣPD"2e $ Ou}ҥK*mSBI}||}{{{zz:Rw܉ v233Ϝ9sm6B5"=hW~ rJS,0J2JADPPPaÆ\nf͂|_l䈕yܹJrԨQ$… ))䵸 :=zٳ/\^+ۄ=,,l͚5]?/^AтP(z!.\hM3dȐI&]2˽HF :tHOI1777>Ѱba Ν;z3lذoڴW(//JMM'_^Lƛ mhz؀>F!% ӓooѣG{> +U{$9rɓ88Ɂ3)R34(LƍҚPz+ FyyylWOK5A2JA?Ľ{ :7nٳe2jmR2MMMWSSS'' DFFzyyP܃TaF B/UVV'Oh4qd\G eAÇ}8@)D) QinnVZ u+ğ>}jmm ~.ZbJ/9 jM***PC5&J#X(u>|2* }||bbb7㓈3$% b_8q… ?~Գ81 @oTRRJ.>Bn˗/755UUU~'}3fqE2gT*՛7oޅ֡˖-c͐d  1))ԩS$'W(I&3F+Ӽz EXzÇ#""&O[iMM '//hZYYYxxxL:UhrH?.ֻɆT*W\ IF xݻw  &Ommm߿enn. ƣgFH$P(HXhhhPP+ ^[[[ZZV߼y:T`:ioo6m B||~Ѱ{`ff͛hii0CT;r#% bؘWPP`4 }B!piggV-))yuqq1({vЇ`P!] =2~P=Q^IPE(K&M:gkk 1Kd q ]\\ Ed[1Pᑑrd  Al&>>>55\=Kaww'S(3ۢ"iMMMSSqj<:~x'''|XXXVVVȜe¨ 85Q|][[NVVV| qDY(<ŅÇE[,p^׶ @! bi.$AA ^`K:rssP݀8{{{L+u?iCCܴVѴt˗X2755Elr$)?wfU< DG|Qf+SOpLFntCZ[[666<Ԁ3|őJpzgK`8,Q0Nw 8Rl;w\4ZJ? (AAseeeA}zRI6>vX&dggT577CLace:US__F{b*?h%g)!H'-YWWYD,Bl苂NaD//0K#YdlF# LJePP{)H Mr!JIENDB`nagios-4.3.4/html/images/trendssvc.png000066400000000000000000000451271314764422400177540ustar00rootroot00000000000000PNG  IHDR@k%+tEXtCreation TimeWed 3 May 2000 15:22:45 -0600E@tIME-(v pHYs B4gAMA aIIDATx Ng̘2c ֐+DJIIQ)Ejn7(Etĥ``:߹pu_:smlϥK\29"FQ+Qa?j\Y*49.(\Ũ9]fwrW/=2bFzQR\cԻDk:G=iP\OӧD'2cQ8*cs8c?F}]/[۷/22-c7޸uŋ~]43f̸pbbbz>裐:tȰ' :w| ~fɞ=Ç˚0sO>ǎ:uƜ8q"[l61ڥKM0gΜݻ;\ !!!JO3SX'̙ӠA:Qغ`T-[׮]XZs.i2eʘŋ?>11aÆÇwbTYÕCUzBBB/^#5jذaNo,n-QK?!CtZ}g]5D.3ЧOgyFzQjИ-Z3Qb!Fb!Fb!Fb!Fb!Fb!Fb!Fᒓ;t٫W .e'ɒ%KÆ 7mt=k\@Qn2eܹҥKqqqϟٳyIe'pumѢ[GX^ns3gNII5&&&/^ȑ#.3 evk^]=GFᔞ}N͇Z%+װ/{UlÆ ~j8&''74]}Q%ҙޮ]ᄄ:udϞ>FZ4hYvUMضmY8p`UǏ7j@ꥲeZsJ1 aÆ1c)Rs'Nƛc֑RJ\R2K.sذa]v։~5ٲeS(Pz)<<<666x/ݢݹsA̯m-=jf[6m{{ӠA9sh@?}]3-[n7nhh@KL֬YN%ܮ8p__|']i' ;t;VL={.Ȩ xJaɓ'j>6|U}ƍ \3eHH޽{53gh9ۺu~q*TXdfҼyɓ'{ M>]+o^mf[jU L111qȐ!k׮5w;yLqĽ6ըMu>i-M6?+V{)i_ "EhVuVT1 Tgux衇J'N8iznٳ9s|'OKIIi׮9-88e[p>i-}̘1={|w1s6W;yjqЖ8˔)Ϝ9sVP_~Nghh=:`|9Fp=Cm۶g^3vZoРo&hѢyn_B.ş}AT}}}{챸UVYo6l؅ Qy7NSLQך1ڇRT'w> 7%p+ŲerA޽ɓ'K͚53ÊŋkE |RTTƍdxg#H[ѣG5>fkXS;:5l_%6ְy6~c^ns<&3pđQ8b!Fn``}uz7V޽^Af<#1:p 1 p 1 p 1 p 1 p 1 uo|3pьa* d N1(C1(C1(C1(C1(C1(C1(C1(C1( &*n{vz]gϞ̉us>]TL%PiPnc7UqJWnzpӉ+u6_ݩɜ9՞ֱX3FNկV)(UZkךSN_[.^xe7s{5P'OϚ5kVZTRW(+9p'Opƒ ,s@ER ̌QҙT)=U6g^55SkN15Ϛ5Ig rmZ;mjv؝;wݻM+%T˗P#SaGOӰaCen%T՗Fb(=M6e%;`̅朻Or-(((LHHPj_C֝醹zk.-U'N~=}t:tSUi봍 SsiBФں#G\6%}||.ͪfhdg=[b6j[z0X;D1ZZ54kLQpRQ:u{seddd͚5Mrʕc IaZvmZM͔#Gڵkq9ej@nMjݻqFӿ6JU鄜\ ,^xѢEYfuo߮Y9r$P׶j*::VK:3ҵ2{o֭+UMb"Ν駟Λ7رcމb.TWv >#{+A/P\b8fܹ|Ɍ3͙={rժUKl}ߺKɵ~zR-5w{jԨ#4h 44M˗\Rk֬IJJJ6bŊ.]Zjg=zTxbխN6d}'K䫧ҙ!1 駟~k׮8U^RJEFFZ4 dɒ+V޽|t@@@,YlrWi=wuםwv;cݺuqqq{ᩆv{B*UdnT;sǎ6lXpƍ{R-ZYf5Jܽ{(>ٳ!Έʕ+שSDֹ|92$k>sO˖-XbΝ;/^loIJl٢PMڋ'O<&M\agHa߾}|`s:^XJ :7n4ݠr*RRIrJMio;w3f_^5oɪZjEEEQ^z޼yVJLLrzi&,,ׁ7Яu] .|A=N*8Ias?xѢEWxݻwi֭[ge&gyF==ʹ'y P>-DGG[J/\xUΚ5Wlٲ5jʓ7J[`M+H믿Ξ=,5b(GI&;x~ለ7M;V}9f̘kڟϪO аaÚ5kϟv_t_u5IJG#Fg9y+V̕+ٵkԩS,Xp!3cnNر6<<-}9rd…'O1c>QXՠ˻[ .읤7n_S$m֬ٓO>ε(`&L֭Ν;1ڵk7h@1jݜde_ݮ *[ndd˿[{hѢm۶QnNq+V8~5>w9s,Z&}Nԩ]wݕ"Qav+/j̔)Sʕ۵kWlY)w~*[=2Zj<@%W߿_̜9ӊ͛wvzsF,X0|p}lj^xq͚5cƌG DQfM%7 c|=.ߪUFٿ]iv:DY[urvѢEG޾}FSz_~Gqz[֭[7yd;%i˖-綦ԇ} }F̙CM4,!FڱcNj/8c Hu̬H"d)))N}i VZGT0lZDLLzme۷#H-3Uʕ+UժU d 4Xhɞ={ͫyjn:fΜٳgOR̟?y?>C%ZV1ge榾437[5U~}+ϛ7c&Кk֬lٲ>U6d…fAf+ٶm:vh?m?1{lZHO>GFY`A˖-9b~-X`UH)))ѣG'%%1J XZ4hP&M2p}3¼(T}˖-۴iSppӧ̙#G3fLLLtXXLsdZeyKѢE{}vk{&Y&vR4hݻk]^ziC5<Ϝ9vZL+s…}^xQysRQhzY1@8|{wK,J-}غuO?mէg' W^J* gҕDFR{JUI[UV 6lÆ fsBlٲ2Je,YΞ=g/_ɓ'MidΜ9y*^!2VjٳgϜ9_~6M[uǎmNp[RmkY~~~hYfM:tHW֭kOll47f͚_w]F +RfZmA}6n85hۘ1c4VZ7em~_~i.0:r4tP8GF"Yf111{8p"^mݺ<`?3kd*?(J___%K޽oÛ*ŋkM87絵GԘ%J/=}WD]. 6V4{&|+*:xP \cǬk K={vc5E+wݻcǎk֬ч 4iD:zhW=J?X޷o]viϟu޽GEo'u, KTe٦M{λD˗/7%ZTzKSZ۷o4h)QV=݈U)rνu֮]*Tuv9""Brp©SjX5LII6ljnٲf_~??S3TPjȑ#zy3;:,i曕+W*<ՙkLsWZ5::ǭ}*Q#7 NZjW}xWZeF{@8M.ϣD}͛cK?&&&&o޼>B?|iGl۶mbb{キa}̙3ڢgϪԩ;s4Qm/K0^PGYɓGݷo̟?H"ޏgS^= |9sjD- >|pPP9ǭ4.TPŊM˚5ה游8k&?wvɓ'yT.F3Cvڥ&-ݻwT}N8p?no׮eKN_s(Qɑ#G2èJkر͛7EU *Õ:uR /_^Sjzڵk8pҥmѢEfVz cǎbŊ=tTgأGܾ}rϞ=9zhU9R(6mjjO?]`~gbg~С\rDΝ]tU՜^ Tp>(K,ÇWɐ!CZgk˨Qƒ%K\iWfBBBD/^8bĈqi@%Ϫ!yУ:q}߮[VZ))) ,Ρ߄uٳQZR!sڵҥKpժU1T6F3g5zw-QGFtǾ=~VfyC:~T`(Hӂ >  ۷*O?}ݰaC>}wB,Y̨8 y+˵fΜSN-Z(H?oJ400} ]~ѣDK4))I-bJ4$$dРAqh-wiԨ-1_ L u"uiذaڵ=&8qĨQw,*UC锨̝;ILL\tfzرc|`.S=_9s˗k ((}_inѢ /֗쳧zjȑǎ˙3gLLڴ7hE}'N:>>M6MťJ܇T~ *?ڵ>׹sgoZ:~<Ж3cǎwyg\緷_daÆ QQQWꫯ:4j((MΚ5??~kF˗O> .]{ҥK&L0qqS;aƍ}Nob*zgΜ^%,, ϡ駟ԩȚ㤤$bx:ty&LeYToi7l2 z}HNNV73wq^{{TΜ97ozjbTp^|EeTϟoNRANza /{ܹs/6Eիwk>}w޳gϾ8tΔ)S|BCCӚ811QӛU _WIFm.` Fwq ֲ?{n,K*qƖ-[VT髯4Ƒ֭#FlٲEr_CyﺴKJJVP:%ի ~2RRR~9sɓ' eΞ=4*J̢Enݺ}+bccc_yUen@@YܼǽJ.Wz޽{? &ǫz7WiYmڴyíe)C>Lo1Oׂb?ߩS'~̙?wd?GDDk^#FL:՜ -_6mROh^9ٚ9/_K"OfzܹwygNRU/)׬YrQF1G~饗N:rMg^To`2eʋ/`}ecGO?(QBco޶m۵kjݬâgϞ׏ΧOjQ'*-3PPTz*wQҥK_vW3*^ۗ:9l) Lk[8q~ߺu1h:֭[{nuy&''o޼3ڱcGFz"ɬ0  +Q?Gj;waMTQUVuzҔ)S&??@}aÆYg=YrȡKJJ:y.ܒ[ǎ0-$$D#5uh:@] үZI->:ujfAٲeKLLԲLZ_EMZD Q!Y' ,=|=GfXdI/MݻެV2e}#FX`ɓ5Phќ9s k׮ݼy2:P@,Yo2osε W'M'Os'5jZ/III.w_O*h=EhMzabO|l=bzULߕrJJCBBR}o+W@U WF7o^դL5kVڥi=)<<]ޢв4OrV>3駚XܬxU/*ThСUTqzzZl(YNrB=u2rx3GDD37%T…WX˗:,*ҥKZ+PmTn>c}5j(m۶ÇiӦiwy̭nݺ?-YDiBCCw޽zjkYs(QB{{Μ9ӧO׻Ν;wETr_?L)xb-4R*7nܬY[Qرcϕ\? >Ǝۮ];Cڤ={3M4Ig~4CjyCYT;=sڵkkG.]ZUZfM  v1sP܏^fM6(ze͚599YaŊ+T͛՗[FP)ܪU++*UDGGʕ+_|E)SL۶mw,Xk`RѣG֭[w9GoF\\[} Jg{ϝ;7<#;wto*ϐر#s ;rȣ>:sL;w=&Pzj*00徿<)ժU;] ( k׮ \[sߺ$FZڇ/KSzus}8޸qkq9sܗ>(Hݿ/s|RRҨQYF 6ts̘1VJgnW%trҥ}U=~A7({5+s$>|+ؼyv/ڣ2x`0цh'֭[AMr?~mڴG}tݺu۷oOHH6lX^2!Yf L~m ^z \K.mڴXƨ&gn )Mj[ *d-o?oHw؇5AJJJTT)ٲe;Ur׼9<<\Ú|V;22>m=@kiϛc&I:oOl6'88X?nEhdT]t1ŋ-|Ffk(ǏVhJ-[tU/N_/ZH_ۤI싰Cڶm+%i23mڴ/={VmܴkPut e˖Mٲe+X&NNNNIIYf=ܣLHH/~n޻w5|ɓ'z6GIϝ;ҫpŊ Uz'=K[jy?ǵu;wLLL)SM&Ob E3nۺu4R՞̷꽊ږ-[GhdӦMZ N>=?~ț7oCҦu\X)S&ͿQFi߾OqD Lkʟ~%K< ڐ(uOtR3zĈ*fEd ? Fe|ժU3 QF:u>ʲcǎWޣ5rDҷo_ﻣfSN̙ϝ;rVٲeeaMYD sdrrrG+;SRR"""g +V\BzŀJ.o]jJe_gϾ˗/W49sFi9T\يK… L\xqHɒ%U{ cbmY~ZDTZ駟6Ed"g„ j&34\pԩS5\t鄄FnJ[jvz>\\93x~ՎnǺׯ޽kn9K #GϦh ū6|f\>|w*i\fAǎSzLlG//m*J*Kpp7=|͚5KvZʤI{M_@i6loܸN۷o媮Ç>䓢Ef +sU~lٲe޼yCCC Si]vO???ߩS4}9]jUͰ"/[-ZqFGu'Oon OsY\ԩSSRR>իW+ ,1\rum+VPM6M`. rBIw1Q]mMRԢegQ`D@F:kVQ\hӤ[KZ& j*DZGd؅"syofW(0ss2~95Ύ#GL&Bw^P333!yHfMQ;_ǑAAA^^^Z=U*+EOeFQjdUUm۠Ff U (ѣuyWX!Q5%r/fy'c~[xzz_ݺu={rN 녰@ x, QuѫW?gB 쌿ҥKM6`RWWϟgGx… 0PA|ϤKkk,((vd(GEEA:;;uӦMʾm^sssdB@,YHM}555AAt*11Ȧ!Xׯ_gO8;;4 3͍m`hmmU* CBB?~\ZZ }AJd"<>ɓ'999#FHNN2dկPlH vxzg20coooXݗ_~W~w}9rڵ0Q''' EF xe'N04hPxx5kV|6׎A\|rFc""ɓ'.tW_t]^!7|s5# 5QT röyz3gc L5c߾}7na:HF n 5;d &KZ-_ Çz={ O % Hwwrr㏑@Nnn]Ξ=˖^b'_0 *`,>~xqq1Wb@CE9:gQQ  5kspqq6mC`ԩSAr|֬Y:ӓ8pHqoŋ_'zOmmmNNNZZk(XVc,1uT<СC;`同Aї[lsibb2QI <( W|}}gϞ@h5~m@@U.\(}>?GONOO7l/R+$]e8qBS䄄同AǘL͛79s2NJzkAaFFTIqJ9sfpp0\b@n8q%KALX(رczՓWVHB)+++򲲲p nݺD2JADp鯿֭['? B%ZR{{A4ÇO>wUz Kccc.]=5AуP(z#Νk]3hРc._2ýHF GN:Z))<60n8аҥKRa5 {;ӧOϝ;g=o֜9sRRRHI_˗/gdd(mQR]>5ie˴Z=v!% NIj̙3CCCl/d2I?~<d:.)) ݤ0a sL4b!{ i}TPPpppP(P(AA.\ؾ}ttATѣGGDDL>]T߶"XiaaaCCRRoooJE&{wCzy`v F nUVVvk׮f:eʔy^j(ːd  7onٲ%;;B4;E!*&)''Y[[+ AܷrСHJ?AF!%hF$zm+m14lRaÆP(- u9,,,99c^D!(AAr۶mx葕Zjd4aQX)C&!qgg/!X?N755UWW߹s;cɓ'7;(oܸ޽.twwY`A/[n$AA ڱc$*ɦ5 $iر#FJ+++4oƅVV~b} fV E``ĉ///klС:nѢE-<=gH2JAs…;w^xj]vPchh(>yX֭[00E&A a111QQQ*---5LwA]]j2򂈇EpjGlNNNjّ=ّ(AAo YYY۷o/**@FSiٳgmmmFΝ;C>1"]'!XZ fǶ|wR&BC^Jrĉ!CBWYpG6gggBhz(&C@'&&jQ  8`3G9,\ +S,3zbijj;Omnjϰ0 w_{q&kooJY=y!Q`#fQ5?(.D&>,"g6fɐdPȹs࠸e0 ];6**A[χBIāxyy)JXTG pZ 'OzcAőVW$}3կV05E]eL=1}ݩvtwwǭ=<< yh\yiR^VVV__o7(wtt4tohU'ZPm)6„Ϛ5 NC2JAěOKKhܷo˗>ݩ$v5j z 9r$wS+ 1 Ĵ]6_|)KϤS)"-]YWWYD,Bl닂jhbHHHll,rZ,2DYPG&:.** =/ EucIENDB`nagios-4.3.4/html/images/unknown.png000066400000000000000000000025751314764422400174400ustar00rootroot00000000000000PNG  IHDRW?,tEXtCreation TimeMon 31 Dec 2001 11:56:15 -0600tIME ##P pHYs B4gAMA aPLTE!)R)Z)Z9k1k9s9sBsB{9{B{J!BBJ!R)BJZ1c9cBkJJRc9sRsZ{kJRZ1sRks{{RZc)sJZZ{JZck1cck)ck{9΄Bks)ֽks޽scs組罜s{JZ{﵄l|ֵֽ{!)9ZsƥΥ{!)BJksΥֵ޽J~tRNS>r>IDATx5K@^PX1-#ۢ$uY8X*MĒ,w݇ 2:S[RؗT?9QױK(->mr^-J qu81i-s2 ToC)B!Q3k8cƎ -~t8R"Ȑ S\2 ;nagios-4.3.4/html/images/warning.png000066400000000000000000000025521314764422400174010ustar00rootroot00000000000000PNG  IHDRW?,tEXtCreation TimeMon 31 Dec 2001 11:58:03 -0600|GtIME . pHYs  ~gAMA aPLTE91JBRBZRcZkZkcscscsc{k{k{s!sss!s)s{{19BJ{9RZk1Rks{)JJ1ƭƭƭ)έεε9νBֵֽֽ)έ޽֜cքޜJZ{ބޜ!)9Zs!)BJskMytRNST0IDATxUkO0x0NP8"0/NSЩ8B%o&>Iߞ{pW1J-6FV?r`$q ׳= ڡ sgO*'> mffu7#\ۇ*Z>=*pkQʐ$DWRbjUY´߂8E;$l"UY0:#!Zyj}) .ܶm۬Y2dȠjro|QJ>|gΜR1mڴ)i]@ի۷c.X@>`ʑ#u1v\bEfLm+\F:u`J|Rpch(رcڵf7D6lAAcUV!!!^ڳgUnH&sbŘ^xٳgvFA.]XR۷{1ׯ?~֭Eښ^zn!!B{xU#T_^jǏݭ'OW)!ٓN-^Xʕ?qDϜ9P;Bϗ/_`*V 6LUd(K,4hw5Y jΝ;ݚ,o޼޽&w޽l2E 7n߳n޼)m:tH ڴi#̽zcrM6;wNZi^~}vٿPFYJ.[ni([/]$X2zݻb&_hЏ9ݻrիWSvJT ǏzBoѢ"OXtRtl&ÇqAVbZlѶm[c>KݴiS=W'uq)XNصk+{c=o\֞͒%SO 22|DǎKC ,#۷o/7I z$k֭KjSt1m4lvH׮]f%@_sW@3f䥋-Tf߾}޻wo9s(bF.9k֬)ϟ:l,}e[eW^_GP@D=z|zŘ1cHa$8{ׯ_wd/J5E?<<mߏ;L)/L.િd1[ ^LBNO]fYK?A4iܼysOJ#uO.9{ԨQƓtԉFTRL>}ǎ򉻢 .*΅ HvJ,I JQ4('w8xxr-b^pp0 '&BBB :1)I{7m$l CDUbEAG1N57zҽtAMcbbʔ)kI%((x)L2N:..xz%J Љ'P+%**#%G "F+19#0:uc=Ƃ-wE2@u)>;iNsoVq~*/s.!]b=$ln2}Zͭ@;jY 1$nuD2.~&VX9IENDB`nagios-4.3.4/html/images/zoom1.gif000066400000000000000000000017541314764422400167650ustar00rootroot00000000000000GIF89aJ)R)R1R1R9R9!R9)Z1Z9c9cJ1cRJk9kBkZRsBsJsZ9{J{J{Z9JRkJ{sRc1{sZZ!Zcc!{Jc!k!k!k)s)k!s!s)Bs!s){)R{)Ƅ)ƔRƵ΄)΄1֌1ֽޔ9ƥJc!L,xdH," `(Anj.R@a%8niC 1ǎ34ZH =bcDT! =gXab :lhQÄ>zQ %4<8 )\|51jN0D&4`%&XР| 8H$B  @`0s "D'jL%;nagios-4.3.4/html/images/zoom2.gif000066400000000000000000000017551314764422400167670ustar00rootroot00000000000000GIF89aJJJRRR!R!!ZZZ))cc))cBBcJJkss11sJJ{{{cc{{11ZZ{{!!!!!!))!!!)ZZ!!!)))11!!!)))BJ)))))1ZZcc)))111ε)11119BBޥ޵JJZc!P,I false, "update_checks_enabled" => true, "last_update_check" => "", "update_available" => false, "update_version" => "", ); // first read CGI config file to determine main file location $ccfc=read_cgi_config_file(); //print_r($ccfc); // read main config file to determine file locations if(isset($ccf['main_config_file'])) $mcf=$ccf['main_config_file']; else $mcf=""; $mcfc=read_main_config_file($mcf); //print_r($mcfc); if(isset($mcf['status_file'])) $sf=$mcf['status_file']; else $sf=""; if(isset($mcf['state_retention_file'])) $rf=$mcf['state_retention_file']; else $rf=""; /////////////////////////////////////////////// // GET PROGRAM VARIABLES FROM MAIN CONFIG FILE /////////////////////////////////////////////// // are update checks enabled? if(isset($mcfc['check_for_updates']) && $mcfc['check_for_updates']=="0") $updateinfo["update_checks_enabled"]=false; ///////////////////////////////////////// // DETERMINE UPDATE INFO FROM STATUS FILE ///////////////////////////////////////// // read status file (just first few lines) $sfc=read_status_file($sf,50); //print_r($sfc); //exit(); // last update time if(isset($sfc['info']['last_update_check'])){ $updateinfo["last_update_check"]=$sfc['info']['last_update_check']; $updateinfo["found_update_info"]=true; } // update available if(isset($sfc['info']['update_available'])){ if($sfc['info']['update_available']=="1") $updateinfo["update_available"]=true; else $updateinfo["update_available"]=false; } // update version if(isset($sfc['info']['new_version'])){ $updateinfo["update_version"]=$sfc['info']['new_version']; } // did we find update information in the status file? if so, we're done if($updateinfo["found_update_info"]==true) return $updateinfo; //////////////////////////////////////////// // DETERMINE UPDATE INFO FROM RETENTION FILE //////////////////////////////////////////// // Nagios might be shutdown (ie, no status file), so try and read data from the retention file // read retention file (just first few lines) $rfc=read_retention_file($rf,50); //print_r($rfc); //exit(); // last update time if(isset($rfc['info']['last_update_check'])){ $updateinfo["last_update_check"]=$rfc['info']['last_update_check']; $updateinfo["found_update_info"]=true; } // update available if(isset($rfc['info']['update_available'])){ if($rfc['info']['update_available']=="1") $updateinfo["update_available"]=true; else $updateinfo["update_available"]=false; } // update version if(isset($rfc['info']['new_version'])){ $updateinfo["update_version"]=$rfc['info']['new_version']; } return $updateinfo; } //////////////////////////////////////////////////////////////////////////////////////////////// // FILE PROCESSING FUNCTIONS //////////////////////////////////////////////////////////////////////////////////////////////// // reads variables from main config file function read_main_config_file($thefile=""){ global $cfg; $contents=array(); // file name can be overridden from default if(isset($thefile) && $thefile!="") $fname=$thefile; else $fname=$cfg['main_config_file']; // open main config file for reading... if(($fh=@fopen($fname,'r'))!=FALSE){ // read all lines in the config file while(!feof($fh)){ $s=fgets($fh); // skip comments if($s[0]=='#') continue; // skip blank lines // TODO - is this necessary? // split comments out from config $s2=explode(";",$s); // get var/val pairs $v=explode("=",$s2[0]); if(isset($v[0]) && isset($v[1])){ // trim var/val pairs $v[0]=trim($v[0]); $v[1]=trim($v[1]); // allow for multiple values for some variables... $arr=false; if(!strcmp($v[0],"cfg_file")) $arr=true; else if(!strcmp($v[0],"cfg_dir")) $arr=true; if($arr==true) $contents[$v[0]][] = $v[1]; else $contents[$v[0]] = $v[1]; } } fclose($fh); } return $contents; } // reads variables from cgi config file function read_cgi_config_file($thefile=""){ global $cfg; $contents=array(); // file name can be overridden from default if(isset($thefile) && $thefile!="") $fname=$thefile; else $fname=$cfg['cgi_config_file']; // open cgi config file for reading... if(($fh=@fopen($fname,'r'))!=FALSE){ // read all lines in the config file while(!feof($fh)){ $s=fgets($fh); // skip comments if($s[0]=='#') continue; // skip blank lines // TODO - is this necessary? // split comments out from config $s2=explode(";",$s); // get var/val pairs $v=explode("=",$s2[0]); if(isset($v[0]) && isset($v[1])){ // trim var/val pairs $v[0]=ltrim(rtrim($v[0])); $v[1]=ltrim(rtrim($v[1])); // do not allow for multiple values $contents[$v[0]] = $v[1]; $cfg[$v[0]] = $v[1]; } } fclose($fh); } return $contents; } // reads status file function read_status_file($thefile="",$maxlines=0){ global $cfg; $contents=array( "info" => array(), "programstatus" => array(), "hoststatus" => array(), "servicestatus" => array(), "contactstatus" => array() ); $statustype="unknown"; $current_host=0; $current_service=0; $current_contact=0; // file name can be overridden from default if(isset($thefile) && $thefile!="") $fname=$thefile; else $fname=$cfg['status_file']; // open file for reading... $x=0; if(($fh=@fopen($fname,'r'))!=FALSE){ // read all lines while(!feof($fh)){ $x++; if($maxlines>0 && $x>$maxlines) break; $s=fgets($fh); // skip comments if($s[0]=='#') continue; // trim lines $s=ltrim(rtrim($s)); // skip blank lines if($s=="") continue; // we are in a new type of status data or new entry if(!strcmp($s,"info {")){ $statustype="info"; continue; } else if(!strcmp($s,"programstatus {")){ $statustype="programstatus"; continue; } else if(!strcmp($s,"hoststatus {")){ $statustype="hoststatus"; $current_host++; continue; } else if(!strcmp($s,"servicestatus {")){ $statustype="servicestatus"; $current_service++; continue; } else if(!strcmp($s,"contactstatus {")){ $statustype="contactstatus"; $current_contact++; continue; } // we just ended an entry... else if(!strcmp($s,"}")){ $statustype="unknown"; continue; } // get/split var/val pairs $v=explode("=",$s); $var=""; $val=""; if(isset($v[0]) && isset($v[1])){ // trim var/val pairs $var=ltrim(rtrim($v[0])); $val=ltrim(rtrim($v[1])); } // INFO AND PROGRAM STATUS if($statustype=="info" || $statustype=="programstatus"){ $contents[$statustype][$var]=$val; continue; } // HOST STATUS else if($statustype=="hoststatus"){ $contents[$statustype][$current_host][$var]=$val; continue; } // SERVICE STATUS else if($statustype=="servicestatus"){ $contents[$statustype][$current_service][$var]=$val; continue; } // CONTACT STATUS else if($statustype=="contactstatus"){ $contents[$statustype][$current_contact][$var]=$val; continue; } } fclose($fh); } $contents["total_hosts"]=$current_host; $contents["total_services"]=$current_service; $contents["total_contacts"]=$current_contact; return $contents; } // reads retention file function read_retention_file($thefile="",$maxlines=0){ global $cfg; $contents=array( "info" => array(), "program" => array(), "host" => array(), "service" => array(), "contact" => array() ); $datatype="unknown"; $current_host=0; $current_service=0; $current_contact=0; // file name can be overridden from default if(isset($thefile) && $thefile!="") $fname=$thefile; else $fname=$cfg['state_retention_file']; // open file for reading... $x=0; if(($fh=@fopen($fname,'r'))!=FALSE){ // read all lines while(!feof($fh)){ $x++; if($maxlines>0 && $x>$maxlines) break; $s=fgets($fh); // skip comments if($s[0]=='#') continue; // trim lines $s=ltrim(rtrim($s)); // skip blank lines if($s=="") continue; // we are in a new type of status data or new entry if(!strcmp($s,"info {")){ $datatype="info"; continue; } else if(!strcmp($s,"program {")){ $datatype="program"; continue; } else if(!strcmp($s,"host {")){ $datatype="host"; $current_host++; continue; } else if(!strcmp($s,"service {")){ $datatype="service"; $current_service++; continue; } else if(!strcmp($s,"contact {")){ $datatype="contact"; $current_contact++; continue; } // we just ended an entry... else if(!strcmp($s,"}")){ $datatype="unknown"; continue; } // get/split var/val pairs $v=explode("=",$s); $var=""; $val=""; if(isset($v[0]) && isset($v[1])){ // trim var/val pairs $var=ltrim(rtrim($v[0])); $val=ltrim(rtrim($v[1])); } // INFO AND PROGRAM STATUS if($datatype=="info" || $datatype=="program"){ $contents[$datatype][$var]=$val; continue; } // HOST STATUS else if($datatype=="host"){ $contents[$datatype][$current_host][$var]=$val; continue; } // SERVICE STATUS else if($datatype=="service"){ $contents[$datatype][$current_service][$var]=$val; continue; } // CONTACT STATUS else if($datatype=="contact"){ $contents[$datatype][$current_contact][$var]=$val; continue; } } fclose($fh); } $contents["total_hosts"]=$current_host; $contents["total_services"]=$current_service; $contents["total_contacts"]=$current_contact; return $contents; } ?>nagios-4.3.4/html/index.php.in000066400000000000000000000036241314764422400162070ustar00rootroot00000000000000 <!-- This page requires a web browser which supports frames. --> <h2>Nagios Core</h2> <p align="center"> <a href="https://www.nagios.org/">www.nagios.org</a><br> Copyright &copy; 2010-<?php echo $this_year; ?> Nagios Core Development Team and Community Contributors. Copyright &copy; 1999-2010 Ethan Galstad<br> </p> <p> <i>Note: These pages require a browser which supports frames</i> </p> nagios-4.3.4/html/infobox.html000066400000000000000000000031741314764422400163140ustar00rootroot00000000000000
    {{decorationTitle}}
    Last Updated: {{lastUpdate | date:'EEE MMM dd HH:mm:ss yyyy'}}
    Nagios® Core™ {{json.data.programstatus.version}} - www.nagios.org
    Updated every {{updateInterval}} seconds
    Logged in as {{json.result.user}}
    Warning: Monitoring process may not be running!
    Click here for more info.
    - Notifications are disabled
    - Service checks are disabled
    nagios-4.3.4/html/js/000077500000000000000000000000001314764422400143715ustar00rootroot00000000000000nagios-4.3.4/html/js/histogram-events.js000066400000000000000000000035141314764422400202310ustar00rootroot00000000000000angular.module("histogramEvents", []) .service("histogramEventsService", function() { // Raw events values this.hostUp = 1; this.hostDown = 2; this.hostUnreachable = 4; this.serviceOk = 8; this.serviceWarning = 16; this.serviceUnknown = 32; this.serviceCritical = 64; // Calculated events values this.hostProblems = this.hostDown + this.hostUnreachable; this.hostAll = this.hostUp + this.hostProblems; this.serviceProblems = this.serviceWarning + this.serviceUnknown + this.serviceCritical; this.serviceAll = this.serviceOK + this.serviceProblems; return { // Host events list hostEvents: [ { value: this.hostAll, label: "All host events", states: "up down unreachable" }, { value: this.hostProblems, label: "Host problem events", states: "down unreachable" }, { value: this.hostUp, label: "Host up events", states: "up" }, { value: this.hostDown, label: "Host down events", states: "down" }, { value: this.hostUnreachable, label: "Host unreachable events", states: "unreachable" } ], // Service events list serviceEvents: [ { value: this.serviceAll, label: "All service events", states: "ok warning unknown critical" }, { value: this.serviceProblems, label: "Service problem events", states: "warning unknown critical" }, { value: this.serviceOk, label: "Service ok events", states: "ok" }, { value: this.serviceWarning, label: "Service warning events", states: "warning" }, { value: this.serviceUnknown, label: "Service unknown events", states: "unknown" }, { value: this.serviceCritical, label: "Service critical events", states: "critical" }, ] }; }); nagios-4.3.4/html/js/histogram-form.js000066400000000000000000000103051314764422400176640ustar00rootroot00000000000000angular.module("histogramApp") .controller("histogramFormCtrl", function($scope, $modalInstance, $http, statisticsBreakdown, histogramEventsService, nagiosTimeService, params) { $scope.params = params; $scope.hostlist = []; $scope.servicelist = []; $scope.timeperiodlist = nagiosTimeService.timeperiodlist(); $scope.statisticsBreakdown = statisticsBreakdown; if (!$scope.params.hasOwnProperty("t1")) { $scope.params.t1 = 0; } if (!$scope.params.hasOwnProperty("t2")) { $scope.params.t2 = 0; } $scope.apply = function () { if ($scope.params.timeperiod != "custom") { var times = nagiosTimeService.calculateReportTimes(new Date(), $scope.params.timeperiod); $scope.params.t1 = times.start.getTime() / 1000; $scope.params.t2 = times.end.getTime() / 1000; } $modalInstance.close($scope.params); }; $scope.cancel = function () { $modalInstance.dismiss('cancel'); }; $scope.showHost = function() { return $scope.params.reporttype != ""; }; $scope.showService = function() { return $scope.params.reporttype == "services"; }; $scope.showTimeperiod = function() { switch ($scope.params.reporttype) { case "": return false; break; case "hosts": return $scope.params.host != ""; break; case "services": return $scope.params.host != "" && $scope.params.service != ""; break; } }; $scope.showDates = function() { return $scope.params.timeperiod == "custom"; }; var isTimeperiodValid = function() { switch ($scope.params.timeperiod) { case "": return false; break; case "custom": if ($scope.params.t1 == 0 || $scope.params.t1 == "Invalid Date" || $scope.params.t2 == 0 || $scope.params.t2 == "Invalid Date") { return false; } else { return true; } break; default: return true; break; } }; $scope.disableApply = function() { switch ($scope.params.reporttype) { case "": return true; break; case "hosts": if ($scope.params.host == "") { return true; } return !isTimeperiodValid(); break; case "services": if ($scope.params.host == "" || $scope.params.service == "") { return true; } return !isTimeperiodValid(); break; } } var getHostList = function() { var url = $scope.params.cgiurl + "/objectjson.cgi?query=hostlist"; $http.get(url, { withCredentials: true}) .success(function(results) { $scope.hostlist = results.data.hostlist; }) .error(function(err) { console.log(err); }); }; var getServiceList = function(hostname) { if (hostname != "") { var url = $scope.params.cgiurl + "/objectjson.cgi?query=servicelist&hostname=" + hostname; $http.get(url, { withCredentials: true}) .success(function(results) { $scope.servicelist = results.data.servicelist[hostname]; }) .error(function(err) { console.log(err); }); } }; $scope.onBlurCgiurl = function(evt) { getHostList(); }; $scope.$watch('params.reporttype', function(newValue) { switch (newValue) { case "hosts": getHostList(); $scope.eventslist = histogramEventsService.hostEvents; break; case "services": getHostList(); $scope.eventslist = histogramEventsService.serviceEvents; break; case "": $scope.eventslist = []; } }); $scope.$watch('params.host', function(newValue) { if (newValue != "") { getServiceList($scope.params.host); } }); $scope.$watch("params.timeperiod", function(newValue) { if (newValue != null || newValue != "custom") { var times = nagiosTimeService.calculateReportTimes(new Date, newValue); $scope.params.t1 = times.start / 1000; $scope.params.t2 = times.start / 1000; } }); $scope.$watch('params.startDate', function(newValue) { if (newValue != undefined) { time = new Date(newValue); if (time != "Invalid Date") { $scope.params.t1 = time.getTime() / 1000; } } }); $scope.$watch('params.endDate', function(newValue) { if (newValue != undefined) { time = new Date(newValue); if (time != "Invalid Date") { $scope.params.t2 = time.getTime() / 1000; } } }); }); nagios-4.3.4/html/js/histogram-graph.js000066400000000000000000000257751314764422400200430ustar00rootroot00000000000000angular.module("histogramApp") .directive("nagiosHistogram", function() { return { templateUrl: "histogram-graph.html", restrict: "AE", scope: { cgiurl: "@cgiurl", reporttype: "@reporttype", host: "@host", service: "@service", timeperiod: "@timeperiod", t1: "@t1", t2: "@t2", breakdown: "@breakdown", graphevents: "@graphevents", graphstatetypes: "@graphstatetypes", assumestateretention: "@assumestateretention", initialstateslogged: "@initialstateslogged", ignorerepeatedstates: "@ignorerepeatedstates", lastUpdate: "=lastUpdate", reload: "@reload", build: "&build" }, controller: function($scope, $element, $attrs, $http, histogramEventsService, statisticsBreakdown) { // Layout variables $scope.fontSize = 11; $scope.graphMargin = { top: 40, right: 290, bottom: 84, left: 60 }; $scope.svgHeight = 320; $scope.svgWidth = 900; $scope.dateFormat = d3.time.format("%a %b %d %H:%M:%S %Y"); // Application state variables $scope.fetchingAlerts = false; $scope.$watch("reload", function(newValue) { // Remove any previous graphs d3.select("g#grid").selectAll("path").remove(); // Set the start and end times $scope.startTime = $scope.t1 * 1000; $scope.endTime = $scope.t2 * 1000; // Show the histogram showHistogram(); }); // Get the statistics breakdown label $scope.statisticsBreakdownLabel = function(value) { for (var i = 0; i < statisticsBreakdown.length; i++) { var bd = statisticsBreakdown[i]; if (bd.value == value) { return bd.label; } } }; // Get the x-axis scale domain var getXScaleDomain = function() { // Set up the x-axis scale domain var domain = []; switch($scope.breakdown) { case "monthly": domain = d3.range(0,13); break; case "dayofweek": domain = d3.range(0,8); break; case "hourly": domain = d3.range(0,25); break; case "dayofmonth": default: domain = d3.range(0,32); break; } return domain; }; // Get the x-axis tick values var getXAxisTickValue = function(d) { // Set up the x-axis tick values var values = []; switch($scope.breakdown) { case "monthly": var months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December", "January"]; return months[d % 12]; break; case "dayofweek": var days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]; return days[d % 7]; break; case "hourly": var hourFormat = d3.format("02d"); return hourFormat(d % 24) + ":00"; break; case "dayofmonth": default: var value = ((d + 1) % 32); return (value == 0 ? 1 : value); break; } }; // Get the number of periods for the breakdown $scope.getBreakdownPeriods = function() { switch($scope.breakdown) { case "monthly": return 12; break; case "dayofweek": return 7; break; case "hourly": return 24; break; case "dayofmonth": default: return 31; break; } }; // Determine the y-axis maximum getYMax = function() { var states = ["up", "down", "unreachable", "ok", "warning", "unknown", "critical" ]; var yMax = 0; states.forEach(function(e, i, a) { yMax = Math.max($scope.summary[$scope.breakdown].maxima[e], yMax); }); return yMax; }; // Display the graph var displayGraph = function() { // Local variables var graphHeight = $scope.svgHeight - ($scope.graphMargin.bottom + $scope.graphMargin.top); var graphWidth = $scope.svgWidth - ($scope.graphMargin.right + $scope.graphMargin.left); var gridCenter = $scope.graphMargin.left + graphWidth / 2; // Get the header group var gridGroup = d3.select("svg#histogram") .select("g#grid") .attr({ transform: function() { return "translate(" + $scope.graphMargin.left + "," + $scope.graphMargin.top + ")"; } }); // Build the x-axis scale var xScale = d3.scale.ordinal() .domain(getXScaleDomain()) .rangePoints([0, graphWidth]); // Build the x-axis var xAxis = d3.svg.axis() .scale(xScale) .orient("bottom") .tickSize(graphHeight) .tickFormat(function(d) { return getXAxisTickValue(d); }); // Display the x-axis d3.select("g#xaxis").call(xAxis); // Rotate the value labels for the x-axis var translate = -(graphHeight + ($scope.fontSize / 2)); d3.select("g#xaxis") .selectAll("text") .attr({ transform: function() { return "rotate(-90) translate(" + translate + "," + translate + ")"; } }) .style({ "text-anchor": "end" }); // Build the y-axis scale var yScale = d3.scale.linear() .domain([getYMax(), 0]) .rangeRound([0, graphHeight]); // Build the y-axis var yAxis = d3.svg.axis() .scale(yScale) .orient("left") .tickSize(graphWidth); // Display the y-axis d3.select("g#yaxis").call(yAxis); // Generate the lines var states = []; if($scope.reporttype == "hosts") { states = ["up", "down", "unreachable"]; } else { states = ["ok", "warning", "unknown", "critical"]; } states.forEach(function(e, i, a) { var line = d3.svg.line() .x(function(d, i) { return xScale(i); }) .y(function(d) { return yScale(d[e]); }) .interpolate("linear"); gridGroup.append("path") .attr({ "d": line($scope.summary[$scope.breakdown].details), "class": e }); }); }; // Initialize the data for display var initializeData = function(obj, size) { var states = ["up", "down", "unreachable", "ok", "warning", "unknown", "critical" ]; obj.maxima = new Object; obj.minima = new Object; obj.totals = new Object; states.forEach(function(e, i, a) { obj.maxima[e] = 0; obj.minima[e] = -1; obj.totals[e] = 0; }); obj.details = new Array; for(var i = 0; i < size; i++) { obj.details.push({ "up": 0, "down": 0, "unreachable": 0, "ok": 0, "warning": 0, "unknown": 0, "critical": 0 }); } }; // Update the summary data var updateData = function(obj, state, index) { obj.details[index][state]++; obj.maxima[state] = Math.max(obj.maxima[state], obj.details[index][state]); obj.totals[state]++; if(index == 0) { // If this is the first entry in the breakdown, // also update the last because the graph // "wraps around" obj.details[obj.details.length - 1][state]++; } }; // Calculate the minima var calculateMinima = function(obj) { for(var key in obj.minima) { obj.minima[key] = obj.details[0][key]; for(var j = 1; j < obj.details.length; j++) { obj.minima[key] = Math.min(obj.minima[key], obj.details[j][key]); } } }; // Summarize the data for display var summarizeData = function() { // Initialize the data $scope.summary = { monthly: new Object, dayofmonth: new Object, dayofweek: new Object, hourly: new Object, }; initializeData($scope.summary.monthly, 13); initializeData($scope.summary.dayofmonth, 32); initializeData($scope.summary.dayofweek, 8); initializeData($scope.summary.hourly, 25); $scope.json.data.alertlist.forEach(function(e, i, a) { // Create a Javascript date object var ts = new Date(e.timestamp); // Update the monthly data updateData($scope.summary.monthly, e.state, ts.getMonth()); // Update the day of month data updateData($scope.summary.dayofmonth, e.state, ts.getDate() - 1); // Update the day of week data updateData($scope.summary.dayofweek, e.state, ts.getDay()); // Update the hourly data updateData($scope.summary.hourly, e.state, ts.getHours()); }); // Calculate the minima calculateMinima($scope.summary.monthly); calculateMinima($scope.summary.dayofmonth); calculateMinima($scope.summary.dayofweek); calculateMinima($scope.summary.hourly); }; // Show the graph var showHistogram = function() { if(!$scope.build()) { return; } // Build the list of parameters for the JSON query var parameters = { query: "alertlist", formatoptions: "enumerate bitmask", objecttypes: ($scope.reporttype == "hosts" ? "host" : "service"), hostname: $scope.host, starttime: $scope.t1, endtime: $scope.t2, statetypes: function() { switch($scope.graphstatetypes) { case 1: return "soft"; break; case 2: return "hard"; break; case 3: default: return "hard soft"; break; } }(), backtrackedarchives: $scope.backtracks }; switch($scope.reporttype) { case "hosts": var events = histogramEventsService.hostEvents.filter(function(e) { return e.value == $scope.graphevents; }); if(events.length > 0) { parameters.hoststates = events[0].states; } else { parameters.hoststates = "up down unreachable"; } break; case "services": var events = histogramEventsService.serviceEvents.filter(function(e) { return e.value == $scope.graphevents; }); parameters.servicedescription = $scope.service; if(events.length > 0) { parameters.servicestates = events[0].states; } else { parameters.servicestates = "ok warning unknown critical"; } break; } var getConfig = { params: parameters, withCredentials: true }; // Where to place the spinner var spinnerdiv = d3.select("div#spinner"); var spinner = null; // Send the JSON query $http.get($scope.cgiurl + "archivejson.cgi", getConfig) .error(function(err) { console.warn(err); // Stop the spinner $scope.fetchingAlerts = false; spinner.stop(); }) .success(function(json) { // Stop the spinner $scope.fetchingAlerts = false; spinner.stop(); // Save the json results $scope.json = json; // Record the query time $scope.lastUpdate = new Date(json.result.query_time); // Summarize the results summarizeData(); // Display the graph displayGraph(); // Display the summary }); // Start the spinner $scope.fetchingAlerts = true; spinner = new Spinner($scope.spinnerOpts).spin(spinnerdiv[0][0]); }; } }; }); nagios-4.3.4/html/js/histogram.js000066400000000000000000000071561314764422400167350ustar00rootroot00000000000000angular.module("histogramApp", ["ui.bootstrap", "ui.utils", "histogramEvents", "nagiosDecorations", "nagiosTime"]) // Statistics breakdown list .constant("statisticsBreakdown", [ { value: "monthly", label: "Month" }, { value: "dayofmonth", label: "Day of the Month" }, { value: "dayofweek", label: "Day of the Week" }, { value: "hourly", label: "Hour of the Day" } ]) .config(function($locationProvider) { $locationProvider.html5Mode({ enabled: true, requireBase: false }) }) .controller("histogramCtrl", function($scope, $location, $modal) { // Parameters found in the URL $scope.search = $location.search(); // URL parameters $scope.params = { cgiurl: $scope.search.cgiurl ? $scope.search.cgiurl : $location.absUrl().replace(/histogram\.html.*$/, "cgi-bin/"), reporttype: $scope.search.reporttype ? $scope.search.reporttype : "", host: $scope.search.host ? $scope.search.host : "", service: $scope.search.service ? $scope.search.service : "", timeperiod: $scope.search.timeperiod ? $scope.search.timeperiod : "", t1: $scope.search.t1 ? $scope.search.t1 : 0, t2: $scope.search.t2 ? $scope.search.t2 : 0, breakdown: $scope.search.breakdown ? $scope.search.breakdown : "dayofmonth", graphevents: $scope.search.graphevents ? parseInt($scope.search.graphevents) : 0, graphstatetypes: $scope.search.graphstatetypes ? parseInt($scope.search.graphstatetypes) : 3, assumestateretention: $scope.search.assumestateretention ? $scope.search.assumestateretention : false, initialstateslogged: $scope.search.initialstateslogged ? $scope.search.initialstateslogged : false, ignorerepeatedstates: $scope.search.ignorerepeatedstates ? $scope.search.ignorerepeatedstates : false }; // Reload index - increment to cause nagios-histogram to reload $scope.reload = 0; // Application state variables $scope.formDisplayed = false; // Decoration-related variables $scope.lastUpdate = "none"; var notBlank = function(value) { return value != undefined && value != ""; }; // Do we have everything necessary to build a histogram? $scope.canBuildHistogram = function() { if ($scope.params.reporttype == "services" || (notBlank($scope.params.host) && notBlank($scope.params.service))) { if ((($scope.params.timeperiod != "") || (($scope.params.t1 != 0) && ($scope.params.t2 != 0)))) { $scope.params.reporttype = "services"; return true; } return false; } else if ($scope.params.reporttype == "hosts" || notBlank($scope.params.host)) { if ((($scope.params.timeperiod != "") || (($scope.params.t1 != 0) && ($scope.params.t2 != 0)))) { $scope.params.reporttype = "hosts"; return true; } return false; } return false; }; $scope.displayForm = function(size) { $scope.formDisplayed = true; var modalInstance = $modal.open({ templateUrl: 'histogram-form.html', controller: 'histogramFormCtrl', size: size, resolve: { params: function () { return $scope.params; } } }); modalInstance.result.then(function(params) { $scope.formDisplayed = false; $scope.params = params; $scope.reload++; }, function(reason) { $scope.formDisplayed = false; }); }; if(!$scope.canBuildHistogram()) { $scope.displayForm(); } $scope.infoBoxTitle = function() { switch ($scope.params.reporttype) { case "hosts": return "Host Alert Histogram"; break; case "services": return "Service Alert Histogram"; break; default: return "Alert Histogram"; break; } }; }); nagios-4.3.4/html/js/jsonquery.js000066400000000000000000000335751314764422400170030ustar00rootroot00000000000000$( document).ready( function() { var parts = $(location).attr( 'href').split( '/'); parts.pop() var baseurl = parts.join( '/'); $('#query button').attr('disabled','disabled'); var disableWhenDependsOnValueBlank = false; var help = Object(); var true_false = { "valid_values": [ "True", "False", ] }; function buildSelect( label, name, option) { var optlist = Array(); optlist.push( $( '') .attr({ value: option.valid_values[ x] }) .text( option.valid_values[ x]) ); } } else if( option.valid_values instanceof Object) { for( var key in option.valid_values) { var valid_value = option.valid_values[ key]; optlist.push( $( '') .attr({ value: key, title: valid_value.description }) .text( key) ); } } var html = $( '') .addClass( 'generated') .attr( 'id', name + 'row').append( $( '') .addClass( 'label') .text( label), $( '').append( $( '') .attr({ id: name, name: name }) .append( $( optlist).map( function() { return this.toArray() }) ) ) ); return html; } function buildCheckbox( label, name, option) { var inputs = Array(); if( option.valid_values instanceof Array) { for( var x = 0; x < option.valid_values.length; x++) { inputs.push( $('') .attr({ type: 'checkbox', name: name, value: option.valid_values[ x] }) ); inputs.push( $( '').text( option.valid_values[ x])); inputs.push( $( '
    ')); } } else if( option.valid_values instanceof Object) { for( var key in option.valid_values) { var valid_value = option.valid_values[ key]; inputs.push( $('') .attr({ type: 'checkbox', name: name, value: key, title: valid_value.description }) ); inputs.push( $( '').text( key)); inputs.push( $( '
    ')); } } var html = $('') .addClass('generated') .attr('id', name + 'row') .append( $('').addClass( 'label').text( label), $('').append( $( inputs).map( function() { return this.toArray() }) ) ); return html; } function buildRadioButtons( label, name, option) { var inputs = Array(); if( option.valid_values instanceof Array) { for( var x = 0; x < option.valid_values.length; x++) { inputs.push( $('') .attr({ type: 'radio', name: name, value: option.valid_values[ x] }) ); inputs.push( $( '').text( option.valid_values[ x])); inputs.push( $( '
    ')); } } else if( option.valid_values instanceof Object) { for( var key in option.valid_values) { inputs.push( $('') .attr({ type: 'radio', name: name, value: key }) ); inputs.push( $( '').text( key)); inputs.push( $( '
    ')); } } var html = $('') .addClass('generated') .attr('id', name + 'row') .append( $('').addClass( 'label').text( label), $('').append( $( inputs).map( function() { return this.toArray() }) ) ); return html; } function buildTextField( label, name, option) { var html = $('') .addClass('generated') .attr('id', name + 'row') .append( $('').addClass('label').text( label), $('').append( $('').attr({ type: "text", name: name, title: option.description }) ) ); return html; } function isRequired( option, query) { var required = false; if( option.hasOwnProperty( 'required') && ( option.required.length > 0)) { if( option.required[ 0] == "all") { required = true; } else { for( var x = 0; x < option.required.length; x++) { if( option.required[ x] == query) { required = true; } } } } return required; } function isOptional( option, query) { var optional = false; if( option.hasOwnProperty( 'optional') && ( option.optional.length > 0)) { if( option.optional[ 0] == "all") { optional = true; } else { for( var x = 0; x < option.optional.length; x++) { if( option.optional[ x] == query) { optional = true; } } } } return optional; } function getNagiosObject( key, option) { var queryspec = option.type.substr( "nagios:".length); var slash = queryspec.search( "/"); var cgi = queryspec.substr( 0, slash); var query = queryspec.substr( slash+1); var success = function(data, results) { var nagobjs = {}; nagobjs[ 'valid_values'] = new Object(); for( var vvkey in option.valid_values) { nagobjs.valid_values[ vvkey] = option.valid_values[ vvkey]; } if( query == "servicelist") { // Special case because services are nested under hosts var services = new Array(); for( var hostname in data.data[ query]) { var host = data.data[ query][ hostname]; for( var x = 0; x < host.length; x++) { if( services.indexOf( host[ x]) == -1) { services.push( host[ x]); } } } services.sort(); for( var x = 0; x < services.length; x++) { nagobjs.valid_values[ services[ x]] = {}; } } else { for( var x = 0; x < data.data[ query].length; x++) { nagobjs.valid_values[ data.data[ query][ x]] = new Object(); nagobjs.valid_values[ data.data[ query][ x]][ 'description'] = data.data[ query][ x]; } } var selector = '#cgiform #' + key + 'row'; $(selector).replaceWith( buildSelect( option.label, key, nagobjs) ); }; var parameters = Object(); parameters.query = query; if( option.depends_on != "") { var dependsOnValue = getValue( option.depends_on, help.data.options[ option.depends_on]); if( dependsOnValue != "") { parameters[ option.depends_on] = dependsOnValue; } } $.ajax({ url: baseurl + '/cgi-bin/' + cgi + '.cgi', data: parameters, success: success, async: false }); } function updateOption(query, key, option) { var required = isRequired( option, query); var optional = isOptional( option, query); var row = '#' + key + 'row'; // row selector // If either optional or required, show the parameter if( required || optional) { // If the parameter is Nagios object, fetch it if( /^nagios:/.test( option.type)) { if( option.depends_on == "") { getNagiosObject( key, option); } else { var dependsOnValue = getValue( option.depends_on, help.data.options[ option.depends_on]); if(( dependsOnValue == "") && disableWhenDependsOnValueBlank) { $(row + ' select').attr( "disabled", "disabled"); } else { getNagiosObject( key, option); $(row + ' select').removeAttr( "disabled"); } $('select#' + option.depends_on).change(function() { var query = getValue( 'query', help.data.options.query); for( var key in help.data.options) { var option = help.data.options[ key]; if( option.depends_on === $(this).attr( "id")) { updateOption(query, key, option); } } }); } } $( row).show(); } else { $( row).hide(); } // If required, highlight the label if( required) { $( row + ' td.label').addClass( 'required'); } else { $( row + ' td.label').removeClass( 'required'); } } function updateForm(query) { $('#query button').attr('disabled','disabled'); for( var key in help.data.options ) { updateOption(query, key, help.data.options[ key]); } } function getValue( name, option) { switch( option.type) { case "enumeration": return $( '#' + name + 'row select option:selected').val(); break; case "list": output = Array(); if( option.valid_values instanceof Array) { for( var x = 0; x < option.valid_values.length; x++) { if( $( '#' + name + 'row input[value=' + valid_values[ x] + ']').attr( 'checked') == 'checked') { output.push( valid_values[ x]); } } } else if( option.valid_values instanceof Object) { for( var key in option.valid_values) { if( $( '#' + name + 'row input[value=' + key + ']').attr( 'checked') == 'checked') { output.push( key); }; } } return output; break; case "integer": case "string": return $( '#' + name + 'row input').val(); break; case "boolean": if( $( '#' + name + 'row input:radio[name=' + name + ']:checked').val() == "True") { return true; } else { return false; } break; default: if( /^nagios:/.test( option.type)) { return $( '#' + name + 'row select option:selected').val(); } break; } } function buildForm() { $('#cgiform tr.generated').remove(); $('#cgiform').append( buildSelect( 'Query', 'query', help.data.options.query)); $('#queryrow td.label').addClass( 'required'); for( var key in help.data.options ) { if( key != "query") { var option = help.data.options[ key] switch( option.type) { case "enumeration": $('#cgiform').append( buildSelect( option.label, key, option)); break; case "list": $('#cgiform').append( buildCheckbox( option.label, key, option)); break; case "integer": case "string": $('#cgiform').append( buildTextField( option.label, key, option)); break; case "boolean": $('#cgiform').append( buildRadioButtons( option.label, key, true_false)); break; default: if( /^nagios:/.test( option.type)) { var nagobjs = { "valid_values": [ ] }; $('#cgiform').append( buildSelect( option.label, key, nagobjs)); } else { $('#cgiform').append( '' + option.type + ': ' + key + ''); } break; } if( !(( option.hasOwnProperty( 'required') && ( option.required.length > 0) && ( option.required[ 0] === "all")) || ( option.hasOwnProperty( 'optional') && ( option.optional.length > 0) && ( option.optional[ 0] === "all")))) { $('#' + key + 'row').hide(); } } } $('select#query').change(function() { var query = $('select#query').val(); updateForm(query); $('#query button').removeAttr('disabled'); }); $('#query button').removeAttr('disabled'); } $('select#cginame').change(function() { var cginame = $('select#cginame').val(); if( cginame == 'none') { $('#cgiform tr.generated').remove(); $('#query button').attr('disabled','disabled'); } else { $.get( baseurl + '/cgi-bin/' + cginame, { query: "help" }, function(data, results) { help = data; buildForm(data); }); } }); function indentf(padding, text) { var result = ""; for( var padvar = 0; padvar < padding; padvar++) { result = result.concat( "    "); } result = result.concat( text); return result; } function arrayToString( padding, arr) { var result = ""; var members = Array(); result = result.concat( "[
    "); padding++; for( var x = 0; x < arr.length; x++) { members.push( memberToString( padding, null, arr[ x])); } result = result.concat( members.join( ",
    ") + "
    "); padding--; result = result.concat( indentf(padding, "]")); return result; } function isString(o) { return typeof o == "string" || (typeof o == "object" && o.constructor === String); } function memberToString( padding, key, value) { var result = ""; if( key == null) { result = result.concat( indentf( padding, '')); } else { result = result.concat( indentf( padding, '"' + key + '": ')); } if( value instanceof Array) { result = result.concat( arrayToString( padding, value)); } else if( value instanceof Object) { result = result.concat( objectToString( padding, value)); } else if(isString(value)) { result = result.concat( '"' + value + '"') } else { result = result.concat( value); } return result; } function objectToString( padding, obj) { var result = ""; var members = Array(); result = result.concat( "{
    "); padding++; for( var key in obj) { members.push( memberToString( padding, key, obj[ key])); } result = result.concat( members.join( ",
    ") + "
    "); padding--; result = result.concat( indentf(padding, "}")); return result; } $('#query').submit( function() { $('#results').html( ""); var cginame = $('select#cginame').val(); if( cginame != 'none') { var query = $('select#query').val(); var parameters = Object(); for( var key in help.data.options) { var option = help.data.options[ key]; var required = isRequired( option, query); var optional = isOptional( option, query); if( required || optional) { var value = getValue( key, option); if(( value == null) || ( value == "")) { if( required) { $('#results').append( $( '

    '). addClass( 'error'). append( option.label + " missing") ); } } else { if( value instanceof Array) { parameters[ key] = value.join( ' '); } else { parameters[ key] = value; } } } } var p = jQuery.param( parameters); var url = baseurl + '/cgi-bin/' + cginame + '?' + p $('#results').append( $('

    ').text( 'URL: ').append( $('
    ').attr({ href: url, target: "_blank" }).text( url) ) ); $.get( baseurl + '/cgi-bin/' + cginame, parameters, function(data, results) { $('#results').append( $('

    ').html( objectToString( 0, data)) ); } ); } return false; }); $('select#cginame').val( 'none'); }); nagios-4.3.4/html/js/map-directive.js000066400000000000000000003124071314764422400174670ustar00rootroot00000000000000angular.module("mapApp") .directive("nagiosMap", function() { return { templateUrl: "map-directive.html", restrict: "AE", scope: { cgiurl: "@cgiurl", layoutIndex: "@layout", dimensions: "@dimensions", ulx: "@ulx", uly: "@uly", lrx: "@lrx", lry: "@lry", root: "=root", maxzoom: "=maxzoom", nolinks: "@nolinks", notext: "@notext", nopopups: "@nopopups", noresize: "@noresize", noicons: "@noicons", iconurl: "@iconurl", updateIntervalValue: "@updateInterval", lastUpdate: "=lastUpdate", reload: "@reload", svgWidth: "=mapWidth", svgHeight: "=mapHeight", build: "&build" }, controller: function($scope, $element, $attrs, $http, nagiosProcessName, layouts) { // Contents of the popup $scope.popupContents = {}; // Layout variables $scope.diameter = Math.min($scope.svgHeight, $scope.svgWidth); $scope.mapZIndex = 20; $scope.popupZIndex = 40; $scope.popupPadding = 10; $scope.fontSize = 10; // px $scope.minRadius = 5; // radius of node with zero services $scope.maxRadiusCount = 20; // number of services at which to max radius $scope.maxRadius = 12; // radius of node with maxRadiusCount+ services $scope.swellRadius = 4; // amount by which radius swells when updating $scope.nodeID = 0; // Incrementing unique node ID for each node // Display variables $scope.layout = parseInt($scope.layoutIndex); $scope.ulx = parseInt($scope.ulxValue); $scope.uly = parseInt($scope.ulyValue); $scope.lrx = parseInt($scope.lrxValue); $scope.lry = parseInt($scope.lryValue); $scope.showText = $scope.notext == "false"; $scope.showLinks = $scope.nolinks == "false"; $scope.showPopups = $scope.nopopups == "false"; $scope.allowResize = $scope.noresize == "false"; $scope.showIcons = $scope.noicons == "false"; // Resize handle variables $scope.handleHeight = 8; $scope.handleWidth = 8; $scope.handlePadding = 2; // Host node tree - initialize the root node $scope.hostTree = { hostInfo: { name: nagiosProcessName, objectJSON: { name: nagiosProcessName, icon_image: "", icon_image_alt: "", x_2d: 0, y_2d: 0 }, serviceCount: 0 }, saveArc: { x: 0, dx: 0, y: 0, dy: 0 }, saveLabel: { x: 0, dx: 0, y: 0, dy: 0 } }; $scope.hostList = new Object; // Icon information $scope.iconList = new Object; $scope.iconsLoading = 0; // Update frequency $scope.updateStatusInterval = parseInt($scope.updateIntervalValue) * 1000; // Map update variables $scope.updateDuration = 0; // Date format for popup dates $scope.popupDateFormat = d3.time.format("%m-%d-%Y %H:%M:%S"); // Root node name $scope.rootNodeName = nagiosProcessName; $scope.rootNode = null; // Application state variables $scope.fetchingHostlist = false; $scope.displayPopup = false; var previousLayout = -1; var statusTimeout = null; var displayMapDone = false; // Placeholder for saving icon url var previousIconUrl; // User-supplied layout information var userSuppliedLayout = { dimensions: { upperLeft: {}, lowerRight: {} }, xScale: d3.scale.linear(), yScale: d3.scale.linear() } // Force layout information var forceLayout = new Object; // Watch for changes on the reload value $scope.$watch("reload", function(newValue) { // Cancel the timeout if necessary if (statusTimeout != null) { clearTimeout(statusTimeout); } // Clean up after previous maps var selectionExit; switch (previousLayout) { case layouts.UserSupplied.index: selectionExit = d3.select("g#container") .selectAll("g.node") .data([]) .exit(); selectionExit.selectAll("circle").remove(); selectionExit.selectAll("text").remove(); selectionExit.remove(); break; case layouts.DepthLayers.index: case layouts.DepthLayersVertical.index: case layouts.CollapsedTree.index: case layouts.CollapsedTreeVertical.index: case layouts.BalancedTree.index: case layouts.BalancedTreeVertical.index: case layouts.CircularBalloon.index: selectionExit = d3.select("g#container") .selectAll(".node") .data([]) .exit(); selectionExit.selectAll("circle").remove(); selectionExit.selectAll("text").remove(); selectionExit.remove(); d3.select("g#container") .select("g#links") .selectAll(".link") .data([]) .exit() .remove(); d3.select("g#links").remove(); break; case layouts.CircularMarkup.index: d3.select("g#container") .select("g#paths") .selectAll("path") .data([]) .remove(); selectionExit = d3.select("g#container") .selectAll("g.label") .data([]) .exit(); selectionExit.selectAll("rect").remove(); selectionExit.selectAll("text").remove(); selectionExit.remove(); d3.select("g#paths").remove(); break; case layouts.Force.index: selectionExit = d3.select("g#container") .selectAll(".link") .data([]) .exit(); selectionExit.selectAll("line").remove(); selectionExit.remove(); selectionExit = d3.select("g#container") .selectAll("g.node") .data([]) .exit(); selectionExit.selectAll("circle").remove(); selectionExit.selectAll("text").remove(); selectionExit.remove(); d3.select("g#links").remove(); break; } // Clean up the host list $scope.hostList = {}; // Clean up the icon image cache if the icon url // has changed if (previousIconUrl != $scope.iconurl) { d3.selectAll("div#image-cache img").remove(); $scope.iconList = new Object; $scope.iconsLoading = 0; } previousIconUrl = $scope.iconurl; // Reset the zoom and pan $scope.zoom.translate([0,0]).scale(1); // Show the map if ($scope.build()) { // Determine the new layout $scope.layout = parseInt($scope.layoutIndex); // Adjust the container appropriately d3.select("svg#map g#container") .attr({ transform: function() { return getContainerTransform(); } }); // Layout-specific steps switch ($scope.layout) { case layouts.UserSupplied.index: userSuppliedLayout.dimensionType = $scope.dimensions break; case layouts.DepthLayers.index: case layouts.DepthLayersVertical.index: case layouts.CollapsedTree.index: case layouts.CollapsedTreeVertical.index: case layouts.BalancedTree.index: case layouts.BalancedTreeVertical.index: case layouts.CircularBalloon.index: case layouts.CircularMarkup.index: case layouts.Force.index: break; } previousLayout = $scope.layout; // Start the spinner $scope.spinnerdiv = d3.select("div#spinner"); $scope.fetchingHostlist = true; $scope.spinner = new Spinner($scope.spinnerOpts) .spin($scope.spinnerdiv[0][0]); // Get the host list and move forward getHostList(); } }); // Watch for changes in the size of the map $scope.$watch("svgWidth", function(newValue) { if (displayMapDone) { updateOnResize(d3.select("#resize-handle").node()); } }); $scope.$watch("svgHeight", function(newValue) { if (displayMapDone) { updateOnResize(d3.select("#resize-handle").node()); } }); // Get the services of the children of a specific node var getServiceList = function() { var parameters = { query: "servicelist", formatoptions: "enumerate bitmask", details: false }; var getConfig = { params: parameters, withCredentials: true }; if ($scope.showIcons && $scope.iconsLoading > 0) { setTimeout(function() { getServiceList() }, 10); return; } // Send the JSON query $http.get($scope.cgiurl + "objectjson.cgi", getConfig) .error(function(err) { console.warn(err); }) .success(function(json) { // Record the time of the last update $scope.lastUpdate = json.result.query_time; for(var host in json.data.servicelist) { $scope.hostList[host].serviceCount = json.data.servicelist[host].length; } }); }; // Take action on the zoom start var onZoomStart = function() { // Hide the popup window $scope.displayPopup = false; $scope.$apply("displayPopup"); }; // Take action on the zoom var onZoom = function() { // Get the event parameters var zoomTranslate = $scope.zoom.translate(); var zoomScale = $scope.zoom.scale(); var translate = []; switch($scope.layout) { case layouts.UserSupplied.index: d3.selectAll("g.node") .attr({ transform: function(d) { return getNodeTransform(d); } }); d3.selectAll("g.node text") .each(function(d) { setTextAttrs(d, this); }); break; case layouts.DepthLayers.index: case layouts.DepthLayersVertical.index: case layouts.CollapsedTree.index: case layouts.CollapsedTreeVertical.index: case layouts.BalancedTree.index: case layouts.BalancedTreeVertical.index: d3.selectAll("path.link") .attr({ d: $scope.diagonal }); d3.selectAll("g.node") .attr({ transform: function(d) { return getNodeTransform(d); } }); break; case layouts.CircularBalloon.index: // Calculate the real translation taking // into account the centering translate = [zoomTranslate[0] + ($scope.svgWidth / 2) * zoomScale, zoomTranslate[1] + ($scope.svgHeight / 2) * zoomScale]; d3.select("svg#map g#container") .attr("transform", "translate(" + translate + ")"); d3.selectAll("path.link") .attr({ d: $scope.diagonal }); d3.selectAll("g.node") .attr({ transform: function(d) { return getNodeTransform(d); } }); break; case layouts.CircularMarkup.index: // Calculate the real translation taking // into account the centering translate = [zoomTranslate[0] + ($scope.svgWidth / 2) * zoomScale, zoomTranslate[1] + ($scope.svgHeight / 2) * zoomScale]; // Update the group with the new calculated values d3.select("svg#map g#container") .attr("transform", "translate(" + translate + ")"); d3.selectAll("path") .attr("transform", "scale(" + zoomScale + ")"); d3.selectAll("g.label") .attr({ transform: function(d) { return getPartitionLabelGroupTransform(d); } }); break; case layouts.Force.index: d3.selectAll("line.link") .attr({ x1: function(d) { return $scope.xZoomScale(d.source.x); }, y1: function(d) { return $scope.yZoomScale(d.source.y); }, x2: function(d) { return $scope.xZoomScale(d.target.x); }, y2: function(d) { return $scope.yZoomScale(d.target.y); } }); d3.selectAll("g.node") .attr({ transform: function(d) { return "translate(" + $scope.xZoomScale(d.x) + ", " + $scope.yZoomScale(d.y) + ")"; } }); break; } }; // Get the tree size var getTreeSize = function() { switch($scope.layout) { case layouts.DepthLayers.index: return [$scope.svgWidth, $scope.svgHeight - layouts.DepthLayers.topPadding - layouts.DepthLayers.bottomPadding]; break; case layouts.DepthLayersVertical.index: return [$scope.svgHeight, $scope.svgWidth - layouts.DepthLayersVertical.leftPadding - layouts.DepthLayersVertical.rightPadding]; break; case layouts.CollapsedTree.index: return [$scope.svgWidth, $scope.svgHeight - layouts.CollapsedTree.topPadding - layouts.CollapsedTree.bottomPadding]; break; case layouts.CollapsedTreeVertical.index: return [$scope.svgHeight, $scope.svgWidth - layouts.CollapsedTreeVertical.leftPadding - layouts.CollapsedTreeVertical.rightPadding]; break; case layouts.BalancedTree.index: return [$scope.svgWidth, $scope.svgHeight - layouts.BalancedTree.topPadding - layouts.BalancedTree.bottomPadding]; break; case layouts.BalancedTreeVertical.index: return [$scope.svgHeight, $scope.svgWidth - layouts.BalancedTreeVertical.leftPadding - layouts.BalancedTreeVertical.rightPadding]; break; case layouts.CircularBalloon.index: return [360, $scope.diameter / 2 - layouts.CircularBalloon.outsidePadding]; break; } }; // Get the node transform var getNodeTransform = function(d) { switch($scope.layout) { case layouts.UserSupplied.index: var x1 = d.hostInfo.objectJSON.x_2d; var x2 = userSuppliedLayout.xScale(x1); var x3 = $scope.xZoomScale(x2); var y1 = d.hostInfo.objectJSON.y_2d; var y2 = userSuppliedLayout.yScale(y1); var y3 = $scope.yZoomScale(y2); return "translate(" + x3 + "," + y3 + ")"; break; case layouts.DepthLayers.index: case layouts.CollapsedTree.index: case layouts.BalancedTree.index: return "translate(" + $scope.xZoomScale(d.x) + "," + $scope.yZoomScale(d.y) + ")"; break; case layouts.DepthLayersVertical.index: case layouts.CollapsedTreeVertical.index: case layouts.BalancedTreeVertical.index: return "translate(" + $scope.xZoomScale(d.y) + "," + $scope.yZoomScale(d.x) + ")"; break; case layouts.CircularBalloon.index: if(d.y == 0) return ""; var rotateAngle = d.x + layouts.CircularBalloon.rotation; var translate = d.y * $scope.zoom.scale(); return "rotate(" + rotateAngle + ") translate(" + translate + ")"; break; } }; // Determine the amount of text padding due to an icon var getIconTextPadding = function(d) { var iconHeight = 0, iconWidth = 0; if (d.hostInfo.hasOwnProperty("iconInfo")) { iconHeight = d.hostInfo.iconInfo.height; iconWidth = d.hostInfo.iconInfo.width; } else { return 0; } switch($scope.layout) { case layouts.UserSupplied.index: switch(layouts.UserSupplied.textAlignment) { case "above": case "below": return iconHeight / 2; break; case "left": case "right": return iconWidth / 2; break; } break; case layouts.DepthLayers.index: case layouts.CollapsedTree.index: case layouts.BalancedTree.index: return iconHeight / 2; break; case layouts.DepthLayersVertical.index: case layouts.CollapsedTreeVertical.index: case layouts.BalancedTreeVertical.index: return iconWidth / 2; break; case layouts.CircularBalloon.index: var rotateAngle = d.x + layouts.CircularBalloon.rotation; var angle; // angle used to calculate distance var r; // radius used to calculate distance if (rotateAngle < 45.0) { // Text is right of icon angle = rotateAngle; r = iconWidth / 2; } else if(rotateAngle < 135.0) { // Text is below icon angle = Math.abs(90.0 - rotateAngle); r = iconHeight / 2; } else if(rotateAngle < 225.0) { // Text is left icon angle = Math.abs(180.0 - rotateAngle); r = iconWidth / 2; } else if(rotateAngle < 315.0) { // Text is above icon angle = Math.abs(270.0 - rotateAngle); r = iconHeight / 2; } else { // Text is right of icon angle = 360.0 - rotateAngle; r = iconWidth / 2; } var radians = angle * Math.PI / 180.0; var cos = Math.cos(radians); return r + (r - r * cos) * cos; break; case layouts.CircularMarkup.index: return 0; break; case layouts.Force.index: return iconWidth / 2; break; } }; // Set the node label attributes var setTextAttrs = function(d, domNode) { // Placeholder for attributes var attrs = new Object; var state = "ok"; var stateCounts = {}; // Variables used for all layouts var serviceCount = getObjAttr(d, ["serviceCount"], 0); var iconTextPadding = getIconTextPadding(d); var fontSize = $scope.fontSize + "px"; if (d.hostInfo.name == $scope.$parent.search.host) fontSize = ($scope.fontSize * 2) + "px"; attrs["font-size"] = fontSize; attrs["font-weight"] = "normal"; attrs["text-decoration"] = "none"; attrs["fill"] = "#000000"; if (d.hostInfo.name != $scope.$parent.search.host && d.hostInfo.hasOwnProperty("serviceStatusJSON")) { for (var service in d.hostInfo.serviceStatusJSON) { var state = d.hostInfo.serviceStatusJSON[service]; if(!stateCounts.hasOwnProperty(state)) stateCounts[state] = 0; stateCounts[state]++; } if (stateCounts["critical"]) state = "critical"; else if (stateCounts["warning"]) state = "warning"; else if (stateCounts["unknown"]) state = "unknown"; else if (stateCounts["pending"]) state = "pending"; } switch($scope.layout) { case layouts.UserSupplied.index: var textPadding = layouts.UserSupplied.textPadding[layouts.UserSupplied.textAlignment]; if (!d.hostInfo.hasOwnProperty("iconInfo")) { textPadding += $scope.nodeScale(serviceCount); } var x = 0; var y = 0; switch(layouts.UserSupplied.textAlignment) { case "above": y = -(textPadding + iconTextPadding); attrs["text-anchor"] = "middle"; break; case "left": x = -(textPadding + iconTextPadding); attrs["text-anchor"] = "end"; attrs.dy = ".4em"; break; case "right": x = textPadding + iconTextPadding; attrs["text-anchor"] = "start"; attrs.dy = ".4em"; break; case "below": y = textPadding + iconTextPadding; attrs["text-anchor"] = "middle"; break; } attrs.transform = "translate(" + x + "," + y + ")"; break; case layouts.DepthLayers.index: var textPadding = $scope.nodeScale(serviceCount) + layouts.DepthLayers.dyText + iconTextPadding; attrs.dy = d.children ? -textPadding : 0; attrs.transform = d.children ? "" : "rotate(90) translate(" + textPadding + ", " + (($scope.fontSize / 2) - 1) + ")"; attrs["text-anchor"] = d.children ? "middle" : "start"; break; case layouts.DepthLayersVertical.index: var textPadding = $scope.nodeScale(serviceCount) + layouts.DepthLayersVertical.dxText + iconTextPadding; attrs.dx = d.children ? -textPadding : textPadding; attrs.dy = layouts.DepthLayersVertical.dyText; attrs["text-anchor"] = d.children ? "end" : "start"; break; case layouts.CollapsedTree.index: var textPadding = $scope.nodeScale(serviceCount) + layouts.CollapsedTree.dyText + iconTextPadding; attrs.dy = d.children ? -textPadding : 0; attrs.transform = d.children ? "" : "rotate(90) translate(" + textPadding + ", " + (($scope.fontSize / 2) - 1) + ")"; attrs["text-anchor"] = d.children ? "middle" : "start"; break; case layouts.CollapsedTreeVertical.index: var textPadding = $scope.nodeScale(serviceCount) + layouts.CollapsedTreeVertical.dxText + iconTextPadding; attrs.dx = d.children ? -textPadding : textPadding; attrs.dy = layouts.CollapsedTreeVertical.dyText; attrs["text-anchor"] = d.children ? "end" : "start"; break; case layouts.BalancedTree.index: var textPadding = $scope.nodeScale(serviceCount) + layouts.BalancedTree.dyText + iconTextPadding; attrs.dy = d.children ? -textPadding : 0; attrs.transform = d.children ? "" : "rotate(90) translate(" + textPadding + ", " + (($scope.fontSize / 2) - 1) + ")"; attrs["text-anchor"] = d.children ? "middle" : "start"; break; case layouts.BalancedTreeVertical.index: var textPadding = $scope.nodeScale(serviceCount) + layouts.BalancedTreeVertical.dxText + iconTextPadding; attrs.dx = d.children ? -textPadding : textPadding; attrs.dy = layouts.BalancedTreeVertical.dyText; attrs["text-anchor"] = d.children ? "end" : "start"; break; case layouts.CircularBalloon.index: var textPadding = $scope.nodeScale(serviceCount) + layouts.CircularBalloon.textPadding + iconTextPadding; if(d.y == 0) { attrs["text-anchor"] = "middle"; attrs.transform = "translate(0,-" + $scope.fontSize + ")"; } else if(d.x < 180) { attrs["text-anchor"] = "start"; attrs.transform = "translate(" + textPadding + ")"; } else { attrs["text-anchor"] = "end"; attrs.transform = "rotate(180) translate(-" + textPadding + ")"; } attrs.dy = layouts.CircularBalloon.dyText; break; case layouts.CircularMarkup.index: attrs["alignment-baseline"] = "middle"; attrs["text-anchor"] = "middle"; attrs["transform"] = ""; if (d.hostInfo.hasOwnProperty("iconInfo")) { var rotateAngle = (d.x + d.dx / 2) * 180 / Math.PI + layouts.CircularBalloon.rotation; var translate = (d.hostInfo.iconInfo.height + layouts.CircularMarkup.textPadding) / 2; attrs["transform"] = "rotate(" + -rotateAngle + ") translate(0, " + translate + ")"; } else { if (d.depth > 0 && d.x + d.dx / 2 > Math.PI) { attrs["transform"] = "rotate(180)"; } } break; case layouts.Force.index: attrs["alignment-baseline"] = "middle"; attrs["x"] = $scope.nodeScale(serviceCount) + layouts.Force.textPadding + iconTextPadding; break; } if (d.hostInfo.name == $scope.$parent.search.host) { attrs["font-weight"] = "bold"; attrs["stroke"] = "red"; attrs["stroke-width"] = "1"; attrs["fill"] = "#0000ff"; } else if (state != "ok") { attrs["font-weight"] = "bold"; attrs["text-decoration"] = "underline"; switch(state) { case "critical":attrs["fill"] = "#ff0000"; break; case "warning": attrs["fill"] = "#b0b214"; break; case "unknown": attrs["fill"] = "#ff6419"; break; case "pending": attrs["fill"] = "#cccccc"; break; } } d3.select(domNode).attr(attrs); }; // Get the quadrant of the mouse pointer within the svg var getQuadrant = function(mouse, bcr) { var quadrant = 0; // mouse is relative to body - // convert to relative to svg var mouseX = mouse[0] - bcr.left; var mouseY = mouse[1] - bcr.top; if(mouseX < ((bcr.width - bcr.left) / 2)) { // Left half of svg if(mouseY < ((bcr.height - bcr.top) / 2)) { // Top half of svg quadrant = 2; } else { // Bottom half of svg quadrant = 3; } } else { // Right half of svg if(mouseY < ((bcr.height - bcr.top) / 2)) { // Top half of svg quadrant = 1; } else { // Bottom half of svg quadrant = 4; } } return quadrant; }; // Display the popup var displayPopup = function(d) { // Get the mouse position relative to the body var body = d3.select("body"); var mouse = d3.mouse(body.node()); // Get the bounding client rect of the div // containing the map var bcr = d3.select("div#mapsvg") .node() .getBoundingClientRect(); // Hide the popup by setting is z-index to // less than that of the map div and by // centering it under the map div var popup = d3.select("#popup") .style({ "z-index": $scope.mapZIndex - 1, left: $scope.svgWidth / 2 + "px", top: $scope.svgHeight / 2 + "px" }); // Set it's contents and "display" it (it's still not // visible because of it's z-index) setPopupContents(popup, d); $scope.displayPopup = true; $scope.$apply("displayPopup"); // Now that it's "displayed", we can get it's size and // calculate it's proper placement. Do so and set it's // z-index so it is displayed var popupBR = popup[0][0].getBoundingClientRect(); var left; var top; switch(getQuadrant(mouse, bcr)) { case 1: left = mouse[0] - bcr.left - popupBR.width - $scope.popupPadding; top = mouse[1] - bcr.top + $scope.popupPadding; break; case 2: left = mouse[0] - bcr.left + $scope.popupPadding; top = mouse[1] - bcr.top + $scope.popupPadding; break; case 3: left = mouse[0] - bcr.left + $scope.popupPadding; top = mouse[1] - bcr.top - popupBR.height - $scope.popupPadding; break; case 4: left = mouse[0] - bcr.left - popupBR.width - $scope.popupPadding; top = mouse[1] - bcr.top - popupBR.height - $scope.popupPadding; break; default: // use first quadrant settings left = mouse[0] - bcr.left - popupBR.width - $scope.popupPadding; top = mouse[1] - bcr.top + $scope.popupPadding; break; } popup.style({ "z-index": $scope.popupZIndex, left: left + "px", top: top + "px" }); }; // Prune any deleted hosts from the host tree var pruneHostTree = function(node) { if(node.hasOwnProperty("children")) { node.children = node.children.filter(function(e) { return e.hostInfo != null; }); node.children.forEach(function(e) { pruneHostTree(e); }); } }; // Sort the children of a node recursively var sortChildren = function(node) { if (node.hasOwnProperty("children")) { // First sort the children node.children.sort(function(a, b) { if (a.hostInfo.objectJSON.name < b.hostInfo.objectJSON.name) { return -1; } else if (a.hostInfo.objectJSON.name > b.hostInfo.objectJSON.name) { return 1; } return 0; }); // Next sort the children of each of these nodes node.children.forEach(function(e, i, a) { sortChildren(e); }); } }; // Re-parent the tree with a new root var reparentTree = function(node) { // The specified node becomes the new node and all // it's children remain in place relative to it var newTree = node; // Visit each parent of the specified node var currentNode = node; while (!(currentNode === $scope.hostTree)) { // First record the parent node of the current node var parent = currentNode.parent; // Next remove the current node as a child of // the parent node parent.children = parent.children.filter(function(e, i, a) { if (e === currentNode) { return false; } return true; }); // Finally add the parent as a child // to the current node if (!currentNode.hasOwnProperty("children")) { currentNode.children = new Array; } currentNode.children.push(parent); // Set the current node the former parent of the // former current node currentNode = parent; } // Now sort the nodes in the tree sortChildren(newTree); // Record the host name for the root node $scope.rootNodeName = newTree.hostInfo.name; $scope.rootNode = newTree; // Assign the new tree $scope.hostTree = newTree; $scope.focalPoint = newTree; }; // Toggle a node var toggleNode = function(d) { if (d.children) { d._children = d.children; d.children = null; d.collapsed = true; } else { switch($scope.layout) { case layouts.CircularMarkup.index: updateToggledNodes($scope.hostTree, updateDescendantsOnExpand); break; } d.children = d._children; d._children = null; d.collapsed = false; } }; // Interpolate the arcs in data space. var arcTween = function(a) { var i = d3.interpolate({x: a.saveArc.x, dx: a.saveArc.dx, y: a.saveArc.y, dy: a.saveArc.dy}, a); return function(t) { var b = i(t); a.saveArc.x = b.x; a.saveArc.dx = b.dx; a.saveArc.y = b.y; a.saveArc.dy = b.dy; return $scope.arc(b); }; } // Interpolate the node labels in data space. var labelGroupTween = function(a) { var i = d3.interpolate({x: a.saveLabel.x, dx: a.saveLabel.dx, y: a.saveLabel.y, dy: a.saveLabel.dy}, a); return function(t) { var b = i(t); a.saveLabel.x = b.x; a.saveLabel.dx = b.dx; a.saveLabel.y = b.y; a.saveLabel.dy = b.dy; return getPartitionLabelGroupTransform(b); }; } // Get the partition map label group transform var getPartitionLabelGroupTransform = function(d) { var radians = d.x + d.dx / 2; var rotate = (radians * 180 / Math.PI) - 90; var exponent = 1 / layouts.CircularMarkup.radialExponent; var radius = d.y + (d.y / (d.depth * 2)); var translate = Math.pow(radius, exponent) * $scope.zoom.scale(); var transform = ""; if(d.depth == 0) { transform = ""; } else { transform = "rotate(" + rotate + ")" + " translate(" + translate + ")"; } return transform; }; // Find a host in a sorted array of hosts var findElement = function(list, key, accessor) { var start = 0; var end = list.length - 1; while (start < end) { var midpoint = parseInt(start + (end - start + 1) / 2); if (accessor(list, midpoint) == key) { return midpoint; } else if (key < accessor(list, midpoint)) { end = midpoint - 1; } else { start = midpoint + 1; } } return null; }; // Update a node in the host tree var updateHostTree = function(node, hosts) { // Sort the hosts array hosts.sort(); // First remove any children of the node that are not // in the list of hosts if (node.hasOwnProperty("children") && node.children != null) { node.children = node.children.filter(function(e) { return findElement(hosts, e.hostInfo.name, function(list, index) { return list[index]; }) != null; }); // Sort the remaining children node.children.sort(function(a, b) { if (a.hostInfo.name == b.hostInfo.name) { return 0; } else if (a.hostInfo.name < b.hostInfo.name) { return -1; } else { return 1; } }); } // If the node has no children and the host list // does, create the property and initialize it if (!node.hasOwnProperty("children") || node.children == null) { node.children = new Array; } // Next add any hosts in the list as children // of the node, if they're not already hosts.forEach(function(e) { var childIndex = findElement(node.children, e, function(list, index) { return list[index].hostInfo.name; }); if ($scope.hostList[e]) { if (childIndex == null) { // Create the node object var hostNode = new Object; // Point the node's host info to the entry in // the host list hostNode.hostInfo = $scope.hostList[e]; // And vice versa if (!$scope.hostList[e].hasOwnProperty("hostNodes")) { $scope.hostList[e].hostNodes = new Array; } if (!$scope.hostList[e].hostNodes.reduce(function(a, b) { return a && b === hostNode; }, false)) { $scope.hostList[e].hostNodes.push(hostNode); } // Set the parent of this node hostNode.parent = node; // Initialize layout information for transitions hostNode.saveArc = new Object; hostNode.saveArc.x = 0; hostNode.saveArc.dx = 0; hostNode.saveArc.y = 0; hostNode.saveArc.dy = 0; hostNode.saveLabel = new Object; hostNode.saveLabel.x = 0; hostNode.saveLabel.dx = 0; hostNode.saveLabel.y = 0; hostNode.saveLabel.dy = 0; // Add the node to the parent node's children node.children.push(hostNode); // Get the index childIndex = node.children.length - 1; } // Recurse to all children of this host if ($scope.hostList[e].objectJSON.child_hosts.length > 0) { var childHosts = $scope.hostList[e].objectJSON.child_hosts; updateHostTree(node.children[childIndex], childHosts, hostNode); } } }); }; // Create an ID for an img based on a file name var imgID = function(image) { return "cache-" + image.replace(/\./, "_"); }; // Update the image icon cache var updateImageIconCache = function() { var cache = d3.select("div#image-cache") for (var host in $scope.hostList) { var image = $scope.hostList[host].objectJSON.icon_image; if (image != "") { if (!$scope.iconList.hasOwnProperty(imgID(image))) { $scope.iconList[imgID(image)] = new Object; $scope.iconsLoading++; cache.append("img") .attr({ id: function() { return imgID(image); }, src: $scope.iconurl + image }) .on("load", function() { $scope.iconsLoading--; var img = d3.select(d3.event.target); var image = img.attr("id"); $scope.iconList[image].width = img.node().naturalWidth; $scope.iconList[image].height = img.node().naturalHeight; }) .on("error", function() { $scope.iconsLoading--; }); } $scope.hostList[host].iconInfo = $scope.iconList[imgID(image)]; } } }; // Build the host list and tree from the hosts returned // from the JSON CGIs var processHostList = function(json) { // First prune any host from the host list that // is no longer in the hosts returned from the CGIs for (var host in $scope.hostList) { if(host != nagiosProcessName && !json.data.hostlist.hasOwnProperty(host)) { // Mark the entry as null (deletion is slow) $scope.hostList[host] = null; } } // Next prune any deleted hosts from the host tree pruneHostTree($scope.hostTree); // Now update the host list with the data // returned from the CGIs for (var host in json.data.hostlist) { // If we don't know about the host yet, add it to // the host list if (!$scope.hostList.hasOwnProperty(host) || $scope.hostList[host] == null) { $scope.hostList[host] = new Object; $scope.hostList[host].name = host; $scope.hostList[host].serviceCount = 0; } // If a hosts' parent is not in the hostlist (user // doesn't have permission to view parent) re-parent the // host directly under the nagios process for (var parent in json.data.hostlist[host].parent_hosts) { var prnt = json.data.hostlist[host].parent_hosts[parent]; if (!json.data.hostlist[prnt]) { var p = json.data.hostlist[host].parent_hosts; json.data.hostlist[host].parent_hosts.splice(0, 1); } } // Update the information returned $scope.hostList[host].objectJSON = json.data.hostlist[host]; } // Now update the host tree var rootHosts = new Array; for (var host in $scope.hostList) { if ($scope.hostList[host] != null && $scope.hostList[host].objectJSON.parent_hosts.length == 0) { rootHosts.push(host); } } updateHostTree($scope.hostTree, rootHosts); // Update the icon image cache if ($scope.showIcons) { updateImageIconCache(); } // Finish the host list processing finishProcessingHostList(); }; var finishProcessingHostList = function() { if ($scope.showIcons && $scope.iconsLoading > 0) { setTimeout(function() { finishProcessingHostList() }, 10); return; } // If this is the first time the map has // been displayed... if($scope.fetchingHostlist) { // Stop the spinner $scope.spinner.stop(); $scope.fetchingHostlist = false; // Display the map displayMap(); } // Reparent the tree to specified root host if ($scope.hostList.hasOwnProperty($scope.root) && ($scope.rootNode != $scope.hostTree)) { reparentTree($scope.hostList[$scope.root].hostNodes[0]); } // Finally update the map updateMap($scope.hostTree); }; // Get list of all hosts var getHostList = function() { var parameters = { query: "hostlist", formatoptions: "enumerate bitmask", details: true }; var getConfig = { params: parameters, withCredentials: true }; // Send the JSON query $http.get($scope.cgiurl + "objectjson.cgi?", getConfig) .error(function(err) { // Stop the spinner $scope.spinner.stop(); $scope.fetchingHostlist = false; console.warn(err); }) .success(function(json) { // Record the last time Nagios core was started $scope.lastNagiosStart = json.result.program_start; // Record the time of the last update $scope.lastUpdate = json.result.query_time; // Process the host list received processHostList(json); // Get the services for each host getServiceList(); // Get the status of each node getAllStatus(0); }) }; // Get the node's stroke color var getNodeStroke = function(hostStatus, collapsed) { var stroke; if(collapsed) { stroke = "blue"; } else { switch(hostStatus) { case "up": case "down": case "unreachable": stroke = getNodeFill(hostStatus, false); break; default: stroke = "#cccccc"; break; } } return stroke; }; // Get the node's fill color var getNodeFill = function(hostStatus, dark) { var fill; switch(hostStatus) { case "up": fill = dark ? "rgb(0, 105, 0)" : "rgb(0, 210, 0)"; break; case "down": fill = dark ? "rgb(128, 0, 0)" : "rgb(255, 0, 0)"; break; case "unreachable": fill = dark ? "rgb(64, 0, 0)" : "rgb(128, 0, 0)"; break; default: switch($scope.layout) { case layouts.UserSupplied.index: case layouts.DepthLayers.index: case layouts.DepthLayersVertical.index: case layouts.CollapsedTree.index: case layouts.CollapsedTreeVertical.index: case layouts.BalancedTree.index: case layouts.BalancedTreeVertical.index: case layouts.CircularBalloon.index: case layouts.Force.index: fill = "#ffffff"; break; case layouts.CircularMarkup.index: fill = "#cccccc"; break; } break; } return fill; }; // Get the host status for the current node var getHostStatus = function(d) { var hostStatus = "pending"; if(d.hasOwnProperty("hostInfo") && d.hostInfo.hasOwnProperty("statusJSON")) { hostStatus = d.hostInfo.statusJSON.status; } return hostStatus; }; // Get the service count for the current node var getServiceCount = function(d) { var serviceCount = 0; if(d.hasOwnProperty("hostInfo") && d.hostInfo.hasOwnProperty("serviceCount")) { serviceCount = d.hostInfo.serviceCount; } return serviceCount; }; // Return the glow filter for an icon var getGlowFilter = function(d) { if (d.hostInfo.hasOwnProperty("statusJSON")) { switch (d.hostInfo.statusJSON.status) { case "up": return "url(#icon-glow-up)"; break; case "down": return "url(#icon-glow-down)"; break; case "unreachable": return "url(#icon-glow-unreachable)"; break; default: return null; break; } } else { return null; } }; // Get the text filter var getTextFilter = function(d) { if ($scope.showIcons && d.hostInfo.hasOwnProperty("iconInfo") && d._children) { return "url(#circular-markup-text-collapsed)"; } return null; }; // Get the text stroke color var getTextStrokeColor = function(d) { if ($scope.showIcons && d.hostInfo.hasOwnProperty("iconInfo") && d._children) { return "white"; } return null; }; // Update the node's status var updateNode = function(domNode) { var duration = 750; var selection = d3.select(domNode); var data = selection.datum(); var hostStatus = getHostStatus(data); var serviceCount = getServiceCount(data); switch($scope.layout) { case layouts.UserSupplied.index: case layouts.DepthLayers.index: case layouts.DepthLayersVertical.index: case layouts.CollapsedTree.index: case layouts.CollapsedTreeVertical.index: case layouts.BalancedTree.index: case layouts.BalancedTreeVertical.index: case layouts.CircularBalloon.index: case layouts.Force.index: selection.select("circle") .transition() .duration(duration) .attr({ r: function() { return $scope.nodeScale(serviceCount) + $scope.swellRadius; } }) .style({ stroke: function() { return getNodeStroke(hostStatus, selection.datum().collapsed); }, fill: function() { return getNodeFill(hostStatus, false); } }) .transition() .duration(duration) .attr({ r: $scope.nodeScale(serviceCount) }); selection.select("image") .style({ filter: function(d) { return getGlowFilter(d); } }); selection.select("text") .each(function() { setTextAttrs(data, this); }) .style({ filter: function(d) { return getTextFilter(d); }, stroke: function(d) { return getTextStrokeColor(d); } }); break; case layouts.CircularMarkup.index: selection .transition() .duration(duration) .style({ fill: function() { return getNodeFill(hostStatus, true); }, "fill-opacity": 1, "stroke-opacity": 1 }) .attrTween("d", arcTween) .transition() .duration(duration) .style({ fill: function() { return getNodeFill(hostStatus, false); } }); break; } }; // What to do when getAllStatus succeeds var onGetAllStatusSuccess = function(json, since) { // Record the time of the last update $scope.lastUpdate = json.result.query_time; // Check whether Nagios has restarted. If so // re-read the host list if (json.result.program_start > $scope.lastNagiosStart) { getHostList(); } else { // Iterate over all hosts and update their status for (var host in json.data.hostlist) { if(!$scope.hostList[host].hasOwnProperty("statusJSON") || ($scope.hostList[host].statusJSON.last_check < json.data.hostlist[host].last_check)) { $scope.hostList[host].statusJSON = json.data.hostlist[host]; if($scope.hostList[host].hasOwnProperty("g")) { $scope.hostList[host].g.forEach(function(e, i, a) { updateNode(e); }); } } } // Send the request for service status getServiceStatus(since); // Schedule an update statusTimeout = setTimeout(function() { var newSince = (json.result.last_data_update / 1000) - $scope.updateStatusInterval; getAllStatus(newSince) }, $scope.updateStatusInterval); } }; // Get status of all hosts and their services var getAllStatus = function(since) { if ($scope.showIcons && $scope.iconsLoading > 0) { setTimeout(function() { getAllStatus() }, 10); return; } var parameters = { query: "hostlist", formatoptions: "enumerate bitmask", details: true, hosttimefield: "lastcheck", starttime: since, endtime: "-0" }; var getConfig = { params: parameters, withCredentials: true }; // Send the request for host status statusTimeout = null; $http.get($scope.cgiurl + "statusjson.cgi", getConfig) .error(function(err) { console.warn(err); // Schedule an update statusTimeout = setTimeout(function() { getAllStatus(since) }, $scope.updateStatusInterval); }) .success(function(json) { onGetAllStatusSuccess(json, since); }) }; // What to do when the getting the service status is successful var onGetServiceStatusSuccess = function(json) { var serviceCountUpdated = false; // Record the time of the last update $scope.lastUpdate = json.result.query_time; for (var host in json.data.servicelist) { var serviceStatUpdated = false; if (!$scope.hostList[host].hasOwnProperty("serviceStatusJSON")) { $scope.hostList[host].serviceCount = Object.keys(json.data.servicelist[host]).length; serviceCountUpdated = true; $scope.hostList[host].serviceStatusJSON = new Object; // Since this is the first time we have a // service count if we have the host status, // update the node(s). if ($scope.hostList[host].hasOwnProperty("statusJSON")) { switch ($scope.layout) { case layouts.UserSupplied.index: case layouts.DepthLayers.index: case layouts.DepthLayersVertical.index: case layouts.CollapsedTree.index: case layouts.CollapsedTreeVertical.index: case layouts.BalancedTree.index: case layouts.BalancedTreeVertical.index: case layouts.CircularBalloon.index: case layouts.Force.index: if($scope.hostList[host].hasOwnProperty("g")) { $scope.hostList[host].g.forEach(function(e, i, a) { updateNode(e); }); } break; } } } else if (Object.keys($scope.hostList[host].serviceStatusJSON).length < Object.keys(json.data.servicelist[host]).length) { $scope.hostList[host].serviceCount = Object.keys(json.data.servicelist[host]).length; serviceCountUpdated = true; } for (service in json.data.servicelist[host]) { if ($scope.hostList[host].serviceStatusJSON[service] != json.data.servicelist[host][service]) serviceStatUpdated = true; $scope.hostList[host].serviceStatusJSON[service] = json.data.servicelist[host][service]; } if (serviceStatUpdated) { $scope.hostList[host].g.forEach(function(e, i, a) { updateNode(e); }); } } if (serviceCountUpdated) { switch ($scope.layout) { case layouts.CircularMarkup.index: updateMap($scope.hostTree); break; } } }; // Get status of all hosts' services var getServiceStatus = function(since) { var parameters = { query: "servicelist", formatoptions: "enumerate bitmask", servicetimefield: "lastcheck", starttime: since, endtime: "-0" }; var getConfig = { params: parameters, withCredentials: true }; // Send the request for service status $http.get($scope.cgiurl + "statusjson.cgi", getConfig) .error(function(err) { console.warn(err); }) .success(function(json) { onGetServiceStatusSuccess(json); }); }; // Get an object attribute in a generic way that checks for // the existence of all attributes in the hierarchy var getObjAttr = function(d, attrs, nilval) { if(d.hasOwnProperty("hostInfo")) { var obj = d.hostInfo; for(var i = 0; i < attrs.length; i++) { if(!obj.hasOwnProperty(attrs[i])) { return nilval; } obj = obj[attrs[i]]; } return obj; } return nilval; }; // Determine how long an object has been in it's // current state var getStateDuration = function(d) { var now = new Date; var duration; var last_state_change = getObjAttr(d, ["statusJSON", "last_state_change"], null); var program_start = getObjAttr(d, ["statusJSON", "result", "program_start"], null); if(last_state_change == null) { return "unknown"; } else if(last_state_change == 0) { duration = now.getTime() - program_start; } else { duration = now.getTime() - last_state_change; } return duration; }; // Get the display value for a state time var getStateTime = function(time) { var when = new Date(time); if(when.getTime() == 0) { return "unknown"; } else { return when; } }; // Get the list of parent hosts var getParentHosts = function(d) { var parents = getObjAttr(d, ["objectJSON", "parent_hosts"], null); if(parents == null) { return "unknown"; } else if(parents.length == 0) { return "None (This is a root host)"; } else { return parents.join(", "); } }; // Get the number of child hosts var getChildHosts = function(d) { var children = getObjAttr(d, ["objectJSON", "child_hosts"], null); if(children == null) { return "unknown"; } else { return children.length; } }; // Get a summary of the host's service states var getServiceSummary = function(d) { var states = ["ok", "warning", "unknown", "critical", "pending"]; var stateCounts = {}; if(d.hostInfo.hasOwnProperty("serviceStatusJSON")) { for (var service in d.hostInfo.serviceStatusJSON) { var state = d.hostInfo.serviceStatusJSON[service]; if(!stateCounts.hasOwnProperty(state)) { stateCounts[state] = 0; } stateCounts[state]++; } } return stateCounts; }; // Set the popup contents var setPopupContents = function(popup, d) { $scope.popupContents.hostname = getObjAttr(d, ["objectJSON", "name"], "unknown"); if($scope.popupContents.hostname == nagiosProcessName) { var now = new Date; $scope.popupContents.alias = nagiosProcessName; $scope.popupContents.address = window.location.host; $scope.popupContents.state = "up"; $scope.popupContents.duration = now.getTime() - $scope.lastNagiosStart; $scope.popupContents.lastcheck = $scope.lastUpdate; $scope.popupContents.lastchange = $scope.lastNagiosStart; $scope.popupContents.parents = ""; $scope.popupContents.children = ""; $scope.popupContents.services = null; } else { $scope.popupContents.alias = getObjAttr(d, ["objectJSON", "alias"], "unknown"); $scope.popupContents.address = getObjAttr(d, ["objectJSON", "address"], "unknown"); $scope.popupContents.state = getObjAttr(d, ["statusJSON", "status"], "pending"); $scope.popupContents.duration = getStateDuration(d); $scope.popupContents.lastcheck = getStateTime(getObjAttr(d, ["statusJSON", "last_check"], 0)); $scope.popupContents.lastchange = getStateTime(getObjAttr(d, ["statusJSON", "last_state_change"], 0)); $scope.popupContents.parents = getParentHosts(d); $scope.popupContents.children = getChildHosts(d); $scope.popupContents.services = getServiceSummary(d); } }; // Update the map var updateMap = function(source, reparent) { reparent = reparent || false; switch($scope.layout) { case layouts.UserSupplied.index: updateUserSuppliedMap(source); break; case layouts.DepthLayers.index: case layouts.DepthLayersVertical.index: case layouts.CollapsedTree.index: case layouts.CollapsedTreeVertical.index: case layouts.BalancedTree.index: case layouts.BalancedTreeVertical.index: case layouts.CircularBalloon.index: $scope.updateDuration = 500; updateTreeMap(source); break; case layouts.CircularMarkup.index: $scope.updateDuration = 750; updatePartitionMap(source, reparent); break; case layouts.Force.index: updateForceMap(source); break; } }; // Update all descendants of a node when collapsing the node var updateDescendantsOnCollapse = function(root, x, y, member) { // Default member to _children member = member || "_children"; if(root.hasOwnProperty(member) && root[member] != null) { root[member].forEach(function(e, i, a) { e.x = x; e.dx = 0; updateDescendantsOnCollapse(e, x, y, "children"); }); } }; // Update all descendants of a node when expanding the node var updateDescendantsOnExpand = function(root, x, y, member) { // Default member to _children member = member || "_children"; if(root.hasOwnProperty(member) && root[member] != null) { root[member].forEach(function(e, i, a) { e.saveArc.x = x; e.saveArc.dx = 0; e.saveArc.y = y; e.saveArc.dy = 0; e.saveLabel.x = x; e.saveLabel.dx = 0; e.saveLabel.y = y; e.saveLabel.dy = 0; updateDescendantsOnExpand(e, x, y, "children"); }); } }; // Update the layout information for nodes which are/were // children of collapsed nodes var updateToggledNodes = function(root, updater) { if(root.collapsed) { if(root.depth == 0) { updater(root, 0, 0); } else { updater(root, root.x + root.dx / 2, root.y + root.dy / 2); } } else if(root.hasOwnProperty("children")) { root.children.forEach(function(e, i, a) { updateToggledNodes(e, updater); }); } }; // The on-click function for partition maps var onClickPartition = function(d) { var evt = d3.event; // If something else (like a pan) is occurring, // ignore the click if(d3.event.defaultPrevented) return; // Hide the popup $scope.displayPopup = false; $scope.$apply("displayPopup"); if(evt.shiftKey) { // Record the new root $scope.root = d.hostInfo.name; $scope.$apply('root'); // A shift-click indicates a reparenting // of the tree if(d.collapsed) { // If the node click is collapsed, // expand it so the tree will have some // depth after reparenting toggleNode(d); } // Collapse the root node for good animation toggleNode($scope.hostTree); updateMap($scope.hostTree, true); // Waiting until the updating is done... setTimeout(function() { // Re-expand the root node so the // reparenting will occur correctly toggleNode($scope.hostTree); // Reparent the tree and redisplay the map reparentTree(d); updateMap($scope.hostTree, true); }, $scope.updateDuration + 50); } else { // A click indicates collapsing or // expanding the node toggleNode(d); updateMap($scope.hostTree); } }; // Recalculate the values of the partition var recalculatePartitionValues = function(node) { if(node.hasOwnProperty("children") && node.children != null) { node.children.forEach(function(e) { recalculatePartitionValues(e); }); node.value = node.children.reduce(function(a, b) { return a + b.value; }, 0); } else { node.value = getPartitionNodeValue(node); } }; // Recalculate the layout of the partition var recalculatePartitionLayout = function(node, index) { index = index || 0; if(node.depth > 0) { if(index == 0) { node.x = node.parent.x; } else { node.x = node.parent.children[index - 1].x + node.parent.children[index - 1].dx; } node.dx = (node.value / node.parent.value) * node.parent.dx } if(node.hasOwnProperty("children") && node.children != null) { node.children.forEach(function(e, i) { recalculatePartitionLayout(e, i); }); } }; // Text filter for labels var textFilter = function(d) { return d.collapsed ? "url(#circular-markup-text-collapsed)" : "url(#circular-markup-text)"; } var addPartitionMapTextGroupContents = function(d, node) { var selection = d3.select(node); // Append the label if($scope.showText) { selection.append("text") .each(function(d) { setTextAttrs(d, this); }) .style({ "fill-opacity": 1e-6, fill: "white", filter: function(d) { return textFilter(d); } }) .text(function(d) { return d.hostInfo.objectJSON.name; }); } // Display the node icon if it has one if($scope.showIcons) { var image = d.hostInfo.objectJSON.icon_image; if (image != "" && image != undefined) { var iconInfo = d.hostInfo.iconInfo; selection.append("image") .attr({ "xlink:href": $scope.iconurl + image, width: iconInfo.width, height: iconInfo.height, x: -(iconInfo.width / 2), y: -((iconInfo.height + layouts.CircularMarkup.textPadding + $scope.fontSize) / 2), transform: function() { var rotateAngle = (d.x + d.dx / 2) * 180 / Math.PI + layouts.CircularBalloon.rotation; return "rotate(" + -rotateAngle + ")"; } }) .style({ filter: function() { return getGlowFilter(d); } }); } } }; // Update the map for partition displays var updatePartitionMap = function(source, reparent) { // The svg element that holds it all var mapsvg = d3.select("svg#map g#container"); // The data for the map var mapdata = $scope.partition.nodes(source); if(reparent) { if($scope.hostTree.collapsed) { // If this is a reparent operation and // we're in the collapse phase, shrink // the root node to nothing $scope.hostTree.x = 0; $scope.hostTree.dx = 0; $scope.hostTree.y = 0; $scope.hostTree.dy = 0; } else { // Calculate the total value of the 1st level // children to determine whether we have // the bug below var value = $scope.hostTree.children.reduce(function(a, b) { return a + b.value; }, 0); if(value == 2 * $scope.hostTree.value) { // This appears to be a bug in the // d3 library where the sum of the // values of the children of the root // node is twice what it should be. // Work around the bug by manually // adjusting the values. recalculatePartitionValues($scope.hostTree); recalculatePartitionLayout($scope.hostTree); } } } // Update the data for the paths var path = mapsvg .select("g#paths") .selectAll("path") .data(mapdata, function(d) { return d.id || (d.id = ++$scope.nodeID); }); // Update the data for the labels var labelGroup = mapsvg .selectAll("g.label") .data(mapdata, function(d) { return d.id || (d.id = ++$scope.nodeID); }); // Traverse the data, artificially setting the layout //for collapsed children updateToggledNodes($scope.hostTree, updateDescendantsOnCollapse); var pathEnter = path.enter() .append("path") .attr({ d: function(d) { return $scope.arc({x: 0, dx: 0, y: d.y, dy: d.dy}); } }) .style({ "fill-opacity": 1e-6, "stroke-opacity": 1e-6, stroke: "#fff", fill: function(d) { var hostStatus = "pending"; if(d.hasOwnProperty("hostInfo") && d.hostInfo.hasOwnProperty("statusJSON")) { hostStatus = d.hostInfo.statusJSON.status; } return getNodeFill(hostStatus, false); } }) .on("click", function(d) { onClickPartition(d); }) .each(function(d) { // Traverse each node, saving a pointer // to the node in the hostList to // facilitate updating later if(d.hasOwnProperty("hostInfo")) { if(!d.hostInfo.hasOwnProperty("g")) { d.hostInfo.g = new Array; } d.hostInfo.g.push(this); } }); if ($scope.showPopups) { pathEnter .on("mouseover", function(d, i) { if($scope.showPopups && d.hasOwnProperty("hostInfo")) { displayPopup(d); } }) .on("mouseout", function(d, i) { $scope.displayPopup = false; $scope.$apply("displayPopup"); }); } labelGroup.enter() .append("g") .attr({ class: "label", transform: function(d) { return "translate(" + $scope.arc.centroid({x: 0, dx: 1e-6, y: d.y, dy: d.dy}) + ")"; } }) .each(function(d) { addPartitionMapTextGroupContents(d, this); }); // Update paths on changes path.transition() .duration($scope.updateDuration) .style({ "fill-opacity": 1, "stroke-opacity": 1, fill: function(d) { var hostStatus = "pending"; if(d.hasOwnProperty("hostInfo") && d.hostInfo.hasOwnProperty("statusJSON")) { hostStatus = d.hostInfo.statusJSON.status; } return getNodeFill(hostStatus, false); } }) .attrTween("d", arcTween); // Update label groups on change labelGroup .transition() .duration($scope.updateDuration) .attrTween("transform", labelGroupTween); if($scope.showText) { labelGroup .selectAll("text") .style({ "fill-opacity": 1, filter: function(d) { return textFilter(d); } }) .each(function(d) { setTextAttrs(d, this); }); } if($scope.showIcons) { labelGroup .selectAll("image") .attr({ transform: function(d) { var rotateAngle = (d.x + d.dx / 2) * 180 / Math.PI + layouts.CircularBalloon.rotation; return "rotate(" + -rotateAngle + ")"; } }); } // Remove paths when necessary path.exit() .transition() .duration($scope.updateDuration) .style({ "fill-opacity": 1e-6, "stroke-opacity": 1e-6 }) .attrTween("d", arcTween) .remove(); // Remove labels when necessary if($scope.showText) { var labelGroupExit = labelGroup.exit(); labelGroupExit.each(function(d) { var group = d3.select(this); group.select("text") .transition() .duration($scope.updateDuration / 2) .style({ "fill-opacity": 1e-6 }); group.select("image") .transition() .duration($scope.updateDuration) .style({ "fill-opacity": 1e-6 }); }) .transition() .duration($scope.updateDuration) .attrTween("transform", labelGroupTween) .remove(); } }; // Traverse the tree, building a list of nodes at each depth var updateDepthList = function(node) { if($scope.depthList[node.depth] == null) { $scope.depthList[node.depth] = new Array; } $scope.depthList[node.depth].push(node); if(node.hasOwnProperty("children") && node.children != null) { node.children.forEach(function(e) { updateDepthList(e); }); } }; // Calculate the layout for the collapsed tree var calculateCollapsedTreeLayout = function(root) { // First get the list of nodes at each depth $scope.depthList = new Array; updateDepthList(root); // Then determine the widest layer var maxWidth = $scope.depthList.reduce(function(a, b) { return a > b.length ? a : b.length; }, 0); // Determine the spacing of nodes based on the max width var treeSize = getTreeSize(); var spacing = treeSize[0] / maxWidth; // Re-calculate the layout based on the above $scope.depthList.forEach(function(layer, depth) { layer.forEach(function(node, index) { // Calculate the location index: the // "index distance" from the center node var locationIndex = (index - (layer.length - 1) / 2); node.x = (treeSize[0] / 2) + (locationIndex * spacing); }); }); }; // The on-click function for trees var onClickTree = function(d) { var evt = d3.event; var updateNode = d; // If something else (like a pan) is occurring, // ignore the click if(d3.event.defaultPrevented) return; // Hide the popup $scope.displayPopup = false; $scope.$apply("displayPopup"); if(evt.shiftKey) { // Record the new root $scope.root = d.hostInfo.name; $scope.$apply('root'); switch($scope.layout) { case layouts.DepthLayers.index: case layouts.DepthLayersVertical.index: // Expand the children of the focal point $scope.focalPoint.children.forEach(function(e) { if(e.collapsed) { toggleNode(e); } }); // If the focal point is not the root node, // restore all children of it's parent if(!($scope.focalPoint === $scope.hostTree)) { $scope.focalPoint.parent.children = $scope.focalPoint.parent._children; delete $scope.focalPoint.parent._children; $scope.focalPoint.parent.collapsed = false; } break; default: if(d.collapsed) { // If the node click is collapsed, // expand it so the tree will have // some depth after reparenting toggleNode(d); } break; } reparentTree(d); } else { switch($scope.layout) { case layouts.DepthLayers.index: case layouts.DepthLayersVertical.index: if((d === $scope.focalPoint) || !(d.hasOwnProperty("children") || d.hasOwnProperty("_children"))) { // Nothing to see here, move on return; } // Restore all the children of the current focal // point and it's parent (if it is not the root // of the tree) $scope.focalPoint.children.forEach(function(e) { if(e.collapsed) { toggleNode(e); } }); if(!($scope.focalPoint === $scope.hostTree)) { $scope.focalPoint.parent.children = $scope.focalPoint.parent._children; $scope.focalPoint.parent._children = null; $scope.focalPoint.parent.collapsed = false; } // Set the new focal point $scope.focalPoint = d; updateNode = (d === $scope.hostTree) ? d : d.parent; break; default: toggleNode(d); break; } } updateMap(updateNode); }; // Add a node group to the tree map var addTreeMapNodeGroupContents = function(d, node) { var selection = d3.select(node); // Display the circle if the node has no icon or // icons are suppressed if(!$scope.showIcons || d.hostInfo.objectJSON.icon_image == "") { selection.append("circle") .attr({ r: 1e-6 }); } // Display the node icon if it has one if($scope.showIcons) { var image = d.hostInfo.objectJSON.icon_image; if (image != "" && image != undefined) { var iconInfo = d.hostInfo.iconInfo; var rotateAngle = null; if ($scope.layout == layouts.CircularBalloon.index) { rotateAngle = d.x + layouts.CircularBalloon.rotation; } selection.append("image") .attr({ "xlink:href": $scope.iconurl + image, width: iconInfo.width, height: iconInfo.height, x: -(iconInfo.width / 2), y: -(iconInfo.height / 2), transform: function() { return "rotate(" + -rotateAngle + ")"; } }) .style({ filter: function() { return getGlowFilter(d); } }); } } // Label the nodes with their host names if($scope.showText) { selection.append("text") .each(function(d) { setTextAttrs(d, this); }) .style({ "fill-opacity": 1e-6 }) .text(function(d) { return d.hostInfo.objectJSON.name; }); } // Register event handlers for showing the popups if($scope.showPopups) { selection .on("mouseover", function(d, i) { if(d.hasOwnProperty("hostInfo")) { displayPopup(d); } }) .on("mouseout", function(d, i) { $scope.displayPopup = false; $scope.$apply("displayPopup"); }); } }; // Update the tree map var updateTreeMap = function(source) { var textAttrs; // The svg element that holds it all var mapsvg = d3.select("svg#map g#container"); // Build the nodes from the data var nodes; switch($scope.layout) { case layouts.DepthLayers.index: case layouts.DepthLayersVertical.index: // If this is a depth layer layout, first update the // tree based on the current focused node, updateDepthLayerTree(); // then build the nodes from the data var root = ($scope.focalPoint === $scope.hostTree) ? $scope.hostTree : $scope.focalPoint.parent; nodes = $scope.tree.nodes(root).reverse(); break; case layouts.CollapsedTree.index: case layouts.CollapsedTreeVertical.index: // If this is a collapsed tree layout, // first build the nodes from the data, nodes = $scope.tree.nodes($scope.hostTree).reverse(); // then re-calculate the positions of the nodes calculateCollapsedTreeLayout($scope.hostTree); break; default: nodes = $scope.tree.nodes($scope.hostTree).reverse(); break; } // ...and the links from the nodes var links = $scope.tree.links(nodes); // Create the groups to contain the nodes var node = mapsvg.selectAll(".node") .data(nodes, function(d) { return d.id || (d.id = ++$scope.nodeID); }); if($scope.showLinks) { // Create the paths for the links var link = mapsvg .select("g#links") .selectAll(".link") .data(links, function(d) { return d.target.id; }); // Enter any new links at the parent's // previous position. link.enter() .append("path") .attr({ class: "link", d: function(d) { var o = { x: (source.hasOwnProperty("xOld") ? source.xOld : source.x) * $scope.zoom.scale(), y: (source.hasOwnProperty("yOld") ? source.yOld : source.y) * $scope.zoom.scale() }; return $scope.diagonal({source: o, target: o}); } }) .transition() .duration($scope.updateDuration) .attr({ d: $scope.diagonal }); // Transition links to their new position. link.transition() .duration($scope.updateDuration) .attr({ d: $scope.diagonal }); // Transition exiting nodes to the parent's // new position. link.exit().transition() .duration($scope.updateDuration) .attr({ d: function(d) { var o = { x: source.x * $scope.zoom.scale(), y: source.y * $scope.zoom.scale() }; return $scope.diagonal({source: o, target: o}); } }) .remove(); } // Enter any new nodes at the parent's // previous position. var nodeEnter = node.enter() .append("g") .attr({ class: "node", transform: function(d) { return getNodeTransform(source); } }) .on("click", function(d) { onClickTree(d); }) .each(function(d) { // Traverse each node, saving a pointer to // the node in the hostList to facilitate // updating later if(d.hasOwnProperty("hostInfo")) { if(!d.hostInfo.hasOwnProperty("g")) { d.hostInfo.g = new Array; } d.hostInfo.g.push(this); } addTreeMapNodeGroupContents(d, this); }); // Move the nodes to their final destination var nodeUpdate = node.transition() .duration($scope.updateDuration) .attr({ transform: function(d) { return getNodeTransform(d); } }); // Update the node's circle size nodeUpdate.select("circle") .attr({ r: function(d) { var serviceCount = 0; if(d.hasOwnProperty("hostInfo") && d.hostInfo.hasOwnProperty("serviceCount")) { serviceCount = d.hostInfo.serviceCount; } return $scope.nodeScale(serviceCount); } }) .style({ stroke: function(d) { var hostStatus = "pending"; if(d.hasOwnProperty("hostInfo") && d.hostInfo.hasOwnProperty("statusJSON")) { hostStatus = d.hostInfo.statusJSON.status; } return getNodeStroke(hostStatus, d.collapsed); }, fill: function(d) { var hostStatus = "pending"; if(d.hasOwnProperty("hostInfo") && d.hostInfo.hasOwnProperty("statusJSON")) { hostStatus = d.hostInfo.statusJSON.status; } return getNodeFill(hostStatus, false); }, }); // Update the images' filters nodeUpdate.select("image") .style({ filter: function(d) { return getGlowFilter(d); } }); // Update the text's opacity nodeUpdate.select("text") .each(function(d) { setTextAttrs(d, this); }) .style({ "fill-opacity": 1, filter: function(d) { return getTextFilter(d); }, stroke: function(d) { return getTextStrokeColor(d); } }); // Transition exiting nodes to the parent's // new position. var nodeExit = node.exit().transition() .duration($scope.updateDuration) .attr({ transform: function(d) { return getNodeTransform(source); } }) .remove(); nodeExit.select("circle") .attr({ r: 1e-6 }); nodeExit.select("text") .style({ "fill-opacity": 1e-6 }); // Update all nodes associated with the source if(source.hasOwnProperty("hostInfo") && source.hostInfo.hasOwnProperty("g")) { source.hostInfo.g.forEach(function(e, i, a) { updateNode(e); }); } // Save the old positions for the next transition. nodes.forEach(function(e) { e.xOld = e.x; e.yOld = e.y; }); }; // Update the tree for the depth layer layout var updateDepthLayerTree = function() { // In a depth layer layout, the focal point node is the // center of the universe; show only it, it's children // and it's parent (if the focal point node is not the // root node). if(!($scope.focalPoint === $scope.hostTree)) { // For all cases except where the focal point is the // root node make the focal point the only child of // it's parent $scope.focalPoint.parent._children = $scope.focalPoint.parent.children; $scope.focalPoint.parent.children = new Array; $scope.focalPoint.parent.children.push($scope.focalPoint); $scope.focalPoint.parent.collapsed = true; } // Collapse all the children of the focal point if($scope.focalPoint.hasOwnProperty("children") && $scope.focalPoint.children != null) { $scope.focalPoint.children.forEach(function(e) { if(!e.collapsed && e.hasOwnProperty("children") && (e.children.length > 0)) { toggleNode(e); } }); } }; var addUserSuppliedNodeGroupContents = function(d, node) { var selection = d3.select(node); // Display the circle if the node has no icon or // icons are suppressed if(!$scope.showIcons || d.hostInfo.objectJSON.icon_image == "") { selection.append("circle") .attr({ r: 1e-6 }); } // Display the node icon if it has one if($scope.showIcons) { var image = d.hostInfo.objectJSON.icon_image; if (image != "" && image != undefined) { var iconInfo = d.hostInfo.iconInfo selection.append("image") .attr({ "xlink:href": $scope.iconurl + image, width: iconInfo.width, height: iconInfo.height, x: -(iconInfo.width / 2), y: -(iconInfo.height / 2), }) .style({ filter: function() { return getGlowFilter(d); } }); } } // Label the nodes with their host names if($scope.showText) { selection.append("text") .each(function(d) { setTextAttrs(d, this); }) .text(function(d) { return d.hostInfo.objectJSON.name; }); } // Register event handlers for showing the popups if($scope.showPopups) { selection .on("mouseover", function(d, i) { if(d.hasOwnProperty("hostInfo")) { displayPopup(d); } }) .on("mouseout", function(d, i) { $scope.displayPopup = false; $scope.$apply("displayPopup"); }); } }; // Update the map that uses configuration-specified // coordinates var updateUserSuppliedMap = function(source) { // Update the scales calculateUserSuppliedDimensions(); userSuppliedLayout.xScale .domain([userSuppliedLayout.dimensions.upperLeft.x, userSuppliedLayout.dimensions.lowerRight.x]); userSuppliedLayout.yScale .domain([userSuppliedLayout.dimensions.upperLeft.y, userSuppliedLayout.dimensions.lowerRight.y]); // The svg element that holds it all var mapsvg = d3.select("svg#map g#container"); // Convert the host list into an array var mapdata = new Array; for(host in $scope.hostList) { if(host != null) { var tmp = new Object; tmp.hostInfo = $scope.hostList[host]; mapdata.push(tmp); } } // Update the data for the nodes var node = mapsvg .selectAll("g.node") .data(mapdata); var nodeEnter = node.enter() .append("g") .attr({ class: "node", transform: function(d) { return getNodeTransform(d); } }) .each(function(d) { // Traverse each node, saving a pointer // to the node in the hostList to // facilitate updating later if(d.hasOwnProperty("hostInfo")) { if(!d.hostInfo.hasOwnProperty("g")) { d.hostInfo.g = new Array; } d.hostInfo.g.push(this); } addUserSuppliedNodeGroupContents(d, this); }); }; // Tick function for force layout var onForceTick = function(source) { if($scope.showLinks) { forceLayout.link .attr({ x1: function(d) { return $scope.xZoomScale(d.source.x); }, y1: function(d) { return $scope.yZoomScale(d.source.y); }, x2: function(d) { return $scope.xZoomScale(d.target.x); }, y2: function(d) { return $scope.yZoomScale(d.target.y); } }); } forceLayout.node .attr({ transform: function(d) { return "translate(" + $scope.xZoomScale(d.x) + ", " + $scope.yZoomScale(d.y) + ")"; } }); }; // Flatten the map var flattenMap = function(root) { var nodes = [], i = 0; function recurse(node, depth) { if(node.children) node.children.forEach(function(e) { recurse(e, depth + 1); }); if(!node.id) node.id = ++i; node.depth = depth; nodes.push(node); } recurse(root, 0); return nodes; }; // Handle a click on a node in the force tree var onClickForce = function(d) { // Hide the popup $scope.displayPopup = false; $scope.$apply("displayPopup"); // Note: reparenting the tree is not implemented // because the map doesn't appear any different // after reparenting. However, reparenting would // affect what is collapsed/expanded when an // interior node is click, so it eventually may // make sense. toggleNode(d); updateMap(d); }; // Add the components to the force map node group var addForceMapNodeGroupContents = function(d, node) { var selection = d3.select(node); if(!$scope.showIcons || d.hostInfo.objectJSON.icon_image == "") { selection.append("circle") .attr({ r: $scope.minRadius }); } // Display the node icon if it has one if ($scope.showIcons) { var image = d.hostInfo.objectJSON.icon_image; if (image != "" && image != undefined) { var iconInfo = d.hostInfo.iconInfo; var rotateAngle = null; if ($scope.layout == layouts.CircularBalloon.index) { rotateAngle = d.x + layouts.CircularBalloon.rotation; } selection.append("image") .attr({ "xlink:href": $scope.iconurl + image, width: iconInfo.width, height: iconInfo.height, x: -(iconInfo.width / 2), y: -(iconInfo.height / 2), transform: function() { return "rotate(" + -rotateAngle + ")"; } }) .style({ filter: function() { return getGlowFilter(d); } }); } } if ($scope.showText) { selection.append("text") .each(function(d) { setTextAttrs(d, this); }) .text(function(d) { return d.hostInfo.objectJSON.name; }) .style({ filter: function(d) { return getTextFilter(d); }, stroke: function(d) { return getTextStrokeColor(d); } }); } if ($scope.showPopups) { selection .on("click", function(d) { onClickForce(d); }) .on("mouseover", function(d) { if($scope.showPopups) { if(d.hasOwnProperty("hostInfo")) { displayPopup(d); } } }) .on("mouseout", function(d) { $scope.displayPopup = false; $scope.$apply("displayPopup"); }); } }; // Update the force map var updateForceMap = function(source) { // How long must we wait var duration = 750; // The svg element that holds it all var mapsvg = d3.select("svg#map g#container"); // Build the nodes from the data var nodes = flattenMap($scope.hostTree); // ...and the links from the nodes var links = d3.layout.tree().links(nodes); // Calculate the force parameters var maxDepth = nodes.reduce(function(a, b) { return a > b.depth ? a : b.depth; }, 0); var diameter = Math.min($scope.svgHeight - 2 * layouts.Force.outsidePadding, $scope.svgWidth - 2 * layouts.Force.outsidePadding); var distance = diameter / (maxDepth * 2); var charge = -30 * (Math.pow(distance, 1.2) / 20); // Restart the force layout. $scope.force .linkDistance(distance) .charge(charge) .nodes(nodes) .links(links) .start(); if($scope.showLinks) { // Create the lines for the links forceLayout.link = mapsvg.select("g#links") .selectAll(".link") .data(links, function(d) { return d.target.id; }); // Create new links forceLayout.link.enter() .append("line") .attr({ class: "link", x1: function(d) { return $scope.xZoomScale(d.source.x); }, y1: function(d) { return $scope.yZoomScale(d.source.y); }, x2: function(d) { return $scope.xZoomScale(d.target.x); }, y2: function(d) { return $scope.yZoomScale(d.target.y); } }); // Remove any old links. forceLayout.link.exit().remove(); } // Create the nodes from the data forceLayout.node = mapsvg.selectAll("g.node") .data(nodes, function(d) { return d.id; }); // Exit any old nodes. forceLayout.node.exit().remove(); // Create any new nodes var nodeEnter = forceLayout.node.enter() .append("g") .attr({ class: "node", transform: function(d) { return "translate(" + $scope.xZoomScale(d.x) + ", " + $scope.yZoomScale(d.y) + ")"; } }) .each(function(d) { // Traverse each node, saving a pointer // to the node in the hostList to // facilitate updating later if(d.hasOwnProperty("hostInfo")) { if(!d.hostInfo.hasOwnProperty("g")) { d.hostInfo.g = new Array; } d.hostInfo.g.push(this); } addForceMapNodeGroupContents(d, this); }) .call($scope.force.drag); // Update existing nodes forceLayout.node .select("circle") .transition() .duration(duration) .attr({ r: function(d) { return $scope.nodeScale(getServiceCount(d)); } }) .style({ stroke: function(d) { return getNodeStroke(getHostStatus(d), d.collapsed); }, fill: function(d) { return getNodeFill(getHostStatus(d), false); } }); forceLayout.node .select("text") .style({ filter: function(d) { return getTextFilter(d); }, stroke: function(d) { return getTextStrokeColor(d); } }); }; // Create the value function var getPartitionNodeValue = function(d) { if(d.hasOwnProperty("hostInfo") && d.hostInfo.hasOwnProperty("serviceCount")) { return d.hostInfo.serviceCount == 0 ? 1 : d.hostInfo.serviceCount; } else { return 1; } }; // Calculate the dimensions for the user supplied layout var calculateUserSuppliedDimensions = function() { switch ($scope.dimensions) { case "auto": // Create a temporary array with pointers // to the object JSON data ojdata = new Array; for(var host in $scope.hostList) { if(host != null) { ojdata.push($scope.hostList[host].objectJSON); } } // Determine dimensions based on included objects userSuppliedLayout.dimensions.upperLeft.x = ojdata[0].x_2d; userSuppliedLayout.dimensions.upperLeft.x = ojdata.reduce(function(a, b) { return a < b.x_2d ? a : b.x_2d; }); userSuppliedLayout.dimensions.upperLeft.y = ojdata[0].y_2d; userSuppliedLayout.dimensions.upperLeft.y = ojdata.reduce(function(a, b) { return a < b.y_2d ? a : b.y_2d; }); userSuppliedLayout.dimensions.lowerRight.x = ojdata[0].x_2d; userSuppliedLayout.dimensions.lowerRight.x = ojdata.reduce(function(a, b) { return a > b.x_2d ? a : b.x_2d; }); userSuppliedLayout.dimensions.lowerRight.y = ojdata[0].y_2d; userSuppliedLayout.dimensions.lowerRight.y = ojdata.reduce(function(a, b) { return a > b.y_2d ? a : b.y_2d; }); break; case "fixed": userSuppliedLayout.dimensions.upperLeft.x = 0; userSuppliedLayout.dimensions.upperLeft.y = 0; userSuppliedLayout.dimensions.lowerRight.x = $scope.svgWidth; userSuppliedLayout.dimensions.lowerRight.y = $scope.svgHeight; break; case "user": userSuppliedLayout.dimensions.upperLeft.x = $scope.ulx; userSuppliedLayout.dimensions.upperLeft.y = $scope.uly; userSuppliedLayout.dimensions.lowerRight.x = $scope.lrx; userSuppliedLayout.dimensions.lowerRight.y = $scope.lry; break; } }; // What to do when the resize handle is dragged var onResizeDrag = function() { // Get the drag event var event = d3.event; // Resize the div $scope.svgWidth = event.x; $scope.svgHeight = event.y; // Propagate changes to parent scope (so, for example, // menu icon is redrown immediately). Note that it // doesn't seem to matter what we apply, so the // empty string is applied to decouple this directive // from it's parent's scope. $scope.$parent.$apply(""); updateOnResize(this); }; var updateOnResize = function(resizeHandle) { d3.select("div#mapsvg") .style({ height: function() { return $scope.svgHeight + "px"; }, width: function() { return $scope.svgWidth + "px"; } }) $scope.diameter = Math.min($scope.svgHeight, $scope.svgWidth); // Update the scales switch($scope.layout) { case layouts.UserSupplied.index: switch($scope.dimensions) { case "auto": userSuppliedLayout.xScale.range([0 + layouts.UserSupplied.padding.left, $scope.svgWidth - layouts.UserSupplied.padding.right]); userSuppliedLayout.yScale.range([0 + layouts.UserSupplied.padding.top, $scope.svgHeight - layouts.UserSupplied.padding.bottom]); break; case "fixed": userSuppliedLayout.dimensions.lowerRight.x = $scope.svgWidth; userSuppliedLayout.dimensions.lowerRight.y = $scope.svgHeight; // no break; case "user": userSuppliedLayout.xScale.range([0, $scope.svgWidth]); userSuppliedLayout.yScale.range([0, $scope.svgHeight]); break; } break; } // Resize the svg d3.select("svg#map") .style({ height: $scope.svgHeight, width: $scope.svgWidth }) // Update the container transform d3.select("svg#map g#container") .attr({ transform: function() { return getContainerTransform(); } }); // Update the appropriate layout switch($scope.layout) { case layouts.DepthLayers.index: case layouts.DepthLayersVertical.index: case layouts.CollapsedTree.index: case layouts.CollapsedTreeVertical.index: case layouts.BalancedTree.index: case layouts.BalancedTreeVertical.index: case layouts.CircularBalloon.index: // Update the tree size $scope.tree.size(getTreeSize()) break; case layouts.CircularMarkup.index: // Update the partition size var radius = $scope.diameter / 2 - layouts.CircularMarkup.padding; var exponent = layouts.CircularMarkup.radialExponent; $scope.partition.size([2 * Math.PI, Math.pow(radius, exponent)]); break; case layouts.Force.index: $scope.force.size([$scope.svgWidth - 2 * layouts.Force.outsidePadding, $scope.svgHeight - 2 * layouts.Force.outsidePadding]); break; } // Move the resize handle if($scope.allowResize) { d3.select(resizeHandle) .attr({ transform: function() { x = $scope.svgWidth - ($scope.handleWidth + $scope.handlePadding); y = $scope.svgHeight - ($scope.handleHeight + $scope.handlePadding); return "translate(" + x + ", " + y + ")"; } }); } // Update the contents switch($scope.layout) { case layouts.UserSupplied.index: d3.selectAll("g.node circle") .attr({ transform: function(d) { return getNodeTransform(d); } }); d3.selectAll("g.node text") .each(function(d) { setTextAttrs(d, this); }); break; case layouts.DepthLayers.index: case layouts.DepthLayersVertical.index: case layouts.CollapsedTree.index: case layouts.CollapsedTreeVertical.index: case layouts.BalancedTree.index: case layouts.BalancedTreeVertical.index: case layouts.CircularBalloon.index: $scope.updateDuration = 0; updateTreeMap($scope.hostTree); break; case layouts.CircularMarkup.index: $scope.updateDuration = 0; updatePartitionMap($scope.hostTree); break; case layouts.Force.index: updateForceMap($scope.hostTree); break; } }; // Set up the resize function setupResize = function() { // Create the drag behavior var drag = d3.behavior.drag() .origin(function() { return { x: $scope.svgWidth, y: $scope.svgHeight }; }) .on("dragstart", function() { // silence other listeners d3.event.sourceEvent.stopPropagation(); }) .on("drag", onResizeDrag); // Create the resize handle d3.select("svg#map") .append("g") .attr({ id: "resize-handle", transform: function() { x = $scope.svgWidth - ($scope.handleWidth + $scope.handlePadding); y = $scope.svgHeight - ($scope.handleHeight + $scope.handlePadding); return "translate(" + x + ", " + y + ")"; } }) .call(drag) .append("path") .attr({ d: function() { return "M 0 " + $scope.handleHeight + " L " + $scope.handleWidth + " " + $scope.handleHeight + " L " + $scope.handleWidth + " " + 0 + " L " + 0 + " " + $scope.handleHeight; }, stroke: "black", fill: "black" }); }; // Get the node container transform getContainerTransform = function() { switch($scope.layout) { case layouts.UserSupplied.index: case layouts.Force.index: return null; break; case layouts.DepthLayers.index: return "translate(0, " + layouts.DepthLayers.topPadding + ")"; break; case layouts.DepthLayersVertical.index: return "translate(" + layouts.DepthLayersVertical.leftPadding + ", 0)"; break; case layouts.CollapsedTree.index: return "translate(0, " + layouts.CollapsedTree.topPadding + ")"; break; case layouts.CollapsedTreeVertical.index: return "translate(" + layouts.CollapsedTreeVertical.leftPadding + ", 0)"; break; case layouts.BalancedTree.index: return "translate(0, " + layouts.BalancedTree.topPadding + ")"; break; case layouts.BalancedTreeVertical.index: return "translate(" + layouts.BalancedTreeVertical.leftPadding + ", 0)"; break; case layouts.CircularBalloon.index: case layouts.CircularMarkup.index: var zoomTranslate = $scope.zoom.translate(); var zoomScale = $scope.zoom.scale(); var translate = [zoomTranslate[0] + ($scope.svgWidth / 2) * zoomScale, zoomTranslate[1] + ($scope.svgHeight / 2) * zoomScale]; return "transform", "translate(" + translate + ") scale(" + zoomScale + ")"; break; default: return null; break; } }; // Display the map var displayMap = function() { displayMapDone = false; // Update the scales switch($scope.layout) { case layouts.UserSupplied.index: switch($scope.dimensions) { case "auto": userSuppliedLayout.xScale .range([0 + layouts.UserSupplied.padding.left, $scope.svgWidth - layouts.UserSupplied.padding.right]); userSuppliedLayout.yScale .range([0 + layouts.UserSupplied.padding.top, $scope.svgHeight - layouts.UserSupplied.padding.bottom]); break; case "fixed": case "user": userSuppliedLayout.xScale .range([0, $scope.svgWidth]); userSuppliedLayout.yScale .range([0, $scope.svgHeight]); break; } break; } // Resize the svg d3.select("svg#map") .style({ height: $scope.svgHeight, width: $scope.svgWidth }); var container = d3.select("g#container"); // Build the appropriate layout switch($scope.layout) { case layouts.DepthLayers.index: case layouts.DepthLayersVertical.index: case layouts.CollapsedTree.index: case layouts.CollapsedTreeVertical.index: case layouts.BalancedTree.index: case layouts.BalancedTreeVertical.index: case layouts.CircularBalloon.index: // Append a group for the links container.append("g") .attr({ id: "links" }); // Build the tree var treeSize = getTreeSize(); $scope.tree = d3.layout.tree() .size(treeSize) .separation(function(a, b) { switch($scope.layout) { case layouts.DepthLayers.index: case layouts.DepthLayersVertical.index: case layouts.CollapsedTree.index: case layouts.CollapsedTreeVertical.index: case layouts.BalancedTree.index: case layouts.BalancedTreeVertical.index: return a.parent == b.parent ? 1 : 2; break; case layouts.CircularBalloon.index: var d = a.depth > 0 ? a.depth : b.depth, sep; if (d <= 0) d = 1; sep = (a.parent == b.parent ? 1 : 2) / d; return sep; break; } }); break; case layouts.CircularMarkup.index: // Append a group for the links container.append("g") .attr({ id: "paths" }); // Build the partition var radius = $scope.diameter / 2 - layouts.CircularMarkup.padding; var exponent = layouts.CircularMarkup.radialExponent; $scope.partition = d3.layout.partition() // .sort(cmpHostName) .size([2 * Math.PI, Math.pow(radius, exponent)]) .value(getPartitionNodeValue); break; case layouts.Force.index: // Append a group for the links container.append("g") .attr({ id: "links" }); // Build the layout $scope.force = d3.layout.force() .size([$scope.svgWidth - 2 * layouts.Force.outsidePadding, $scope.svgHeight - 2 * layouts.Force.outsidePadding]) .on("tick", onForceTick); break; } // Create the diagonal that will be used to // connect the nodes switch($scope.layout) { case layouts.DepthLayers.index: case layouts.CollapsedTree.index: case layouts.BalancedTree.index: $scope.diagonal = d3.svg.diagonal() .projection(function(d) { return [$scope.xZoomScale(d.x), $scope.yZoomScale(d.y)]; }); break; case layouts.DepthLayersVertical.index: case layouts.CollapsedTreeVertical.index: case layouts.BalancedTreeVertical.index: $scope.diagonal = d3.svg.diagonal() .projection(function(d) { return [$scope.xZoomScale(d.y), $scope.yZoomScale(d.x)]; }); break; case layouts.CircularBalloon.index: $scope.diagonal = d3.svg.diagonal.radial() .projection(function(d) { var angle = 0; if(!isNaN(d.x)) { angle = d.x + layouts.CircularBalloon.rotation + 90; } return [d.y * $scope.zoom.scale(), ((angle / 180) * Math.PI)]; }); break; } // Create the arc this will be used to display the nodes switch($scope.layout) { case layouts.CircularMarkup.index: $scope.arc = d3.svg.arc() .startAngle(function(d) { return d.x; }) .endAngle(function(d) { return d.x + d.dx; }) .innerRadius(function(d) { return Math.pow(d.y, (1 / exponent)); }) .outerRadius(function(d) { return Math.pow(d.y + d.dy, (1 / exponent)); }); break; } // Set the focal point to the root $scope.focalPoint = $scope.hostTree; // Signal the fact that displayMap() is done displayMapDone = true; }; // Activities that take place only on // directive instantiation var onDirectiveInstantiation = function() { // Create the zoom behavior $scope.xZoomScale = d3.scale.linear(); $scope.yZoomScale = d3.scale.linear(); $scope.zoom = d3.behavior.zoom() .scaleExtent([1 / $scope.maxzoom, $scope.maxzoom]) .x($scope.xZoomScale) .y($scope.yZoomScale) .on("zoomstart", onZoomStart) .on("zoom", onZoom); // Set up the div containing the map and // attach the zoom behavior to the it d3.select("div#mapsvg") .style({ "z-index": $scope.mapZIndex, height: function() { return $scope.svgHeight + "px"; }, width: function() { return $scope.svgWidth + "px"; } }) .call($scope.zoom); // Set up the resize function if($scope.allowResize) { setupResize(); } // Create a container group d3.select("svg#map") .append("g") .attr({ id: "container", transform: function() { return getContainerTransform(); } }); // Create scale to size nodes based on // number of services $scope.nodeScale = d3.scale.linear() .domain([0, $scope.maxRadiusCount]) .range([$scope.minRadius, $scope.maxRadius]) .clamp(true); }; onDirectiveInstantiation(); } }; }); nagios-4.3.4/html/js/map-form.js000066400000000000000000000030051314764422400164430ustar00rootroot00000000000000angular.module("mapApp") .controller("mapFormCtrl", function($scope, $modalInstance, $http, nagiosProcessName, params) { $scope.params = params; $scope.hostlist = []; $scope.nodelist = []; $scope.apply = function () { $modalInstance.close($scope.params); }; $scope.cancel = function () { $modalInstance.dismiss('cancel'); }; $scope.showDimensions = function() { return $scope.params.layout == 0; }; $scope.showCoordinates = function() { return $scope.params.layout == 0 && $scope.params.dimensions == "user"; }; $scope.showTimeperiod = function() { switch ($scope.params.reporttype) { case "": return false; break; case "hosts": return $scope.params.host != ""; break; case "services": return $scope.params.host != "" && $scope.params.service != ""; break; } }; $scope.disableApply = function() { return $scope.hostlist.length == 0; } var getHostList = function() { var url = $scope.params.cgiurl + "/objectjson.cgi?query=hostlist"; $http.get(url, { withCredentials: true}) .success(function(results) { $scope.hostlist = results.data.hostlist; $scope.nodelist = []; $scope.nodelist.push(nagiosProcessName); for (var i = 0; i < $scope.hostlist.length; i++) { $scope.nodelist.push($scope.hostlist[i]); } }) .error(function(err) { $scope.nodelist = []; console.log(err); }); }; $scope.onBlurCgiurl = function(evt) { getHostList(); }; getHostList(); }); nagios-4.3.4/html/js/map.js000066400000000000000000000116761314764422400155170ustar00rootroot00000000000000angular.module("mapApp", ["ui.bootstrap", "ui.utils", "nagiosDecorations", "nagiosTime"]) .constant("nagiosProcessName", "Nagios Process") // Layout options .constant("layouts", { UserSupplied: { index: 0, textAlignment: "below", padding: { top: 25, right: 25, bottom: 25, left: 25, }, textPadding: { above: 4, right: 4, left: 4, below: 11 }, dimensionType: "fixed" }, DepthLayers: { index: 1, topPadding: 100, bottomPadding: 100, dyText: 4 }, CollapsedTree: { index: 2, topPadding: 100, bottomPadding: 100, dyText: 4 }, BalancedTree: { index: 3, topPadding: 100, bottomPadding: 100, dyText: 4 }, Circular: { index: 4 }, CircularMarkup: { index: 5, radialExponent: 1.2, padding: 20, textPadding: 4 }, CircularBalloon: { index: 6, outsidePadding: 60, rotation: -90, textPadding: 4, dyText: ".31em" }, BalancedTreeVertical: { index: 7, leftPadding: 100, rightPadding: 100, dxText: 4, dyText: 3 }, CollapsedTreeVertical: { index: 8, leftPadding: 100, rightPadding: 100, dxText: 4, dyText: 3 }, DepthLayersVertical: { index: 9, leftPadding: 100, rightPadding: 100, dxText: 4, dyText: 3 }, Force: { index: 10, outsidePadding: 60, textPadding: 4 } }) .config(function($locationProvider) { $locationProvider.html5Mode({ enabled: true, requireBase: false }); }) .controller("mapCtrl", function($scope, $location, $modal, $http, nagiosTimeService, nagiosProcessName, layouts, $window) { $scope.search = $location.search(); // URL parameters $scope.params = { cgiurl: $scope.search.cgiurl ? $scope.search.cgiurl : $location.absUrl().replace(/map\.php.*$/, "cgi-bin/"), layout: map_layout, dimensions: $scope.search.dimensions ? $scope.search.dimensions : "", ulx: $scope.search.ulx ? parseInt($scope.search.ulx) : 0, uly: $scope.search.uly ? parseInt($scope.search.uly) : 0, lrx: $scope.search.lrx ? parseInt($scope.search.lrx) : 0, lry: $scope.search.lry ? parseInt($scope.search.lry) : 0, root: $scope.search.root ? $scope.search.root : nagiosProcessName, maxzoom: $scope.search.maxzoom ? parseInt($scope.search.maxzoom) : 10, nolinks: $scope.search.nolinks ? true : false, notext: $scope.search.notext ? true : false, nopopups: $scope.search.nopopups ? true : false, nomenu: $scope.search.nomenu ? true : false, noresize: $scope.search.noresize ? true : false, noicons: $scope.search.noicons ? true : false, iconurl: $scope.search.iconurl ? $scope.search.iconurl : $location.absUrl().replace(/map\.php.*$/, "images/logos/"), }; var rightPadding = 1; var bottomPadding = 4; $scope.svgWidth = $window.innerWidth - rightPadding; $scope.svgHeight = $window.innerHeight - bottomPadding; // Application state variables $scope.formDisplayed = false; $scope.reload = 0; // Decoration-related variables $scope.lastUpdate = "none"; // Determine whether we believe we have sufficient information to // build the map. If we don't have a valid URL for the JSON CGIs // we won't know that until we try to fetch the list of hosts, so // we can't know that now. $scope.canBuildMap = function() { document.body.className = ""; if ($scope.params.layout == layouts.UserSupplied.index) { switch ($scope.params.dimensions) { case "fixed": case "auto": document.body.className = "hasBgImage"; return true; break; case "user": if ($scope.params.ulx >= $scope.params.lrx || $scope.params.uly >= $scope.params.lry) { return false; } else { document.body.className = "hasBgImage"; return true; } break; default: return false; break; } } else { return true; } }; angular.element($window).bind("resize", function() { $scope.svgWidth = $window.innerWidth - rightPadding; $scope.svgHeight = $window.innerHeight - bottomPadding; $scope.$apply("svgWidth"); $scope.$apply("svgHeight"); }); $scope.displayForm = function(size) { $scope.formDisplayed = true; var modalInstance = $modal.open({ templateUrl: 'map-form.html', controller: 'mapFormCtrl', size: size, resolve: { params: function () { return $scope.params; } } }); modalInstance.result.then(function(params) { $scope.formDisplayed = false; $scope.params = params; $scope.reload++; }, function(reason) { $scope.formDisplayed = false; }); } // Style the menu button $scope.menuButtonStyle = function() { return { left: ($scope.svgWidth - 30) + "px", top: "5px" }; }; $scope.infoBoxTitle = function() { if ($scope.params.root == nagiosProcessName) { return "Network Map for All Hosts"; } else { return "Network Map for Host " + $scope.params.root; } }; if (!$scope.canBuildMap()) { $scope.displayForm(); } }) nagios-4.3.4/html/js/nag_funcs.js000066400000000000000000000210361314764422400166740ustar00rootroot00000000000000/***************************************************************************** * Filename: nag_funcs.js * Description: contains objects and functions used in the Nagios(R) Core(SM) * website. * Requires: jquery, nag_funcs.css * Contents: oreo, vidbox * License: This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. *****************************************************************************/ /* -------------------------------------------------------------------------- * Object: oreo * Description: An object to get and set cookies * Arguments: optional parameters: * { domain:"mydomain.com", path:"some/path" } * --------------------------------------------------------------------------*/ oreo = function(parms) { this.parms = parms || {}; this.cookies = {}; this.init(); } /* -------------------------------------------------------------------------- * Object: oreo * Function: init * Description: Gets and stores current document cookies * Arguments: none * --------------------------------------------------------------------------*/ oreo.prototype.init = function() { var i, cookie, name, value, list = new Array(); list = document.cookie.split(";"); i = list.length; while (i--) { cookie = list[i]; cookie = cookie.split("="); name = decodeURIComponent(cookie[0].replace(/^ (.*)/, "$1")); value = decodeURIComponent(cookie[1]); this.cookies[name] = value; } } /* -------------------------------------------------------------------------- * Object: oreo * Function: get * Description: Gets the value of a cookie * Arguments: Name of the cookie * Returns: The value of the cookie, null * --------------------------------------------------------------------------*/ oreo.prototype.get = function(name) { if (!name || !this.cookies[name]) return null; if (typeof this.cookies[name] == "undefined") return null; return this.cookies[name]; } /* -------------------------------------------------------------------------- * Object: oreo * Function: set * Description: Sets a cookie and adds or removes it from this.cookies * Arguments: { name:"name", value:"value" [, expires:"exp-value", * domain:"domain.com", path:"some/path"] } * Notes: parms.name and parms.value are required. The other parms.xxx * entries are optional. * * parms.expires must be a number as follows: * -1 = Never expire * 0 = Expire it now * 1 - ??? = Number of seconds until it expires * * Passing conflicting arguments for value and expires: * Value Expires Result * ------------- ---------- -------------------------- * "some string" 0 Expire / remove it * "" -1 or > 0 Sets an empty cookie * "" unset Sets an empty cookie * null 0 Expire / remove it * null unset Expire / remove it * null -1 or > 0 Sets an empty cookie * unset any Expire / remove it * * parms.domain and/or parms.path will override domain and/or * path in the constructor. * * Returns: Nothing * --------------------------------------------------------------------------*/ oreo.prototype.set = function(parms) { var cookie, name, value, exp, dom, path, dt = null; if (!parms || !parms.name) return; name = parms.name; value = parms.value; exp = parms.expires; dom = parms.domain || this.parms.domain || null; path = parms.path || this.parms.path || null; if (typeof value == "undefined") { value = ""; exp = 0; } else if (value == null) { if (typeof exp != "number" || (typeof exp == "number" && exp == 0)) { exp = 0; value = ""; } } else if (typeof exp == "number" && exp == 0) { value == ""; } if (typeof exp == "number") { dt = new Date(); if (exp < 0) dt.setTime(dt.getTime() + 315360000 * 1000); else if (exp > 0) dt.setTime(dt.getTime() + exp * 1000); else dt.setTime(0); dt = dt.toUTCString(); } if (exp == 0) delete this.cookies[name]; else this.cookies[name] = value; cookie = encodeURIComponent(name) + "=" + encodeURIComponent(value); if (dt) cookie += "; expires=" + dt; if (dom) cookie += "; domain=" + encodeURIComponent(dom); if (path) cookie += "; path=" + encodeURIComponent(path); document.cookie = cookie; } /* -------------------------------------------------------------------------- * Object: vidbox * Description: A video box for demo vids on the core website * Arguments: Takes an optional "args" object which can have one or more * of the following properties: * args.pos - vertical (u=upper,l=lower,c=center) and * horizontal (l=left,r=right,c=center) * args.text - Text to display below the video * args.vidid - Video ID for determining if the video box * should not be created * --------------------------------------------------------------------------*/ vidbox = function(args) { this.args = args || {}; this.tab = null; this.box = null; this.frame = null; this.cancel = null; this.tab = null; this.tabClose = null; this.vidbox = null; this.txtbox = null; this.showing = false; this.pos = args.pos || "lr"; this.vidurl = args.vidurl || ""; this.text = args.text || ""; this.vidid = args.vidid || null; this.cookie = null; this.init(); } vidbox.prototype.init = function() { var cls1 = "vidboxContainer vidbox_" + this.pos, cls2 = "vidboxTab vidboxTab_" + this.pos, This = this, embed, txt; if (this.vidid) { this.cookie = new oreo(); txt = this.cookie.get(this.vidid); if (txt == "no") return; } this.box = $("
    ", { 'class':cls1 }).appendTo($('body')); this.frame = $("
    ", { 'class':"vidboxFrame" }).appendTo($(this.box)); if (this.vidid) { this.cancel = $("
    Never show this again
    "). appendTo($(this.frame)); $(this.cancel).click(function(){This.cancelBox();}); } this.vidbox = $("
    ", { 'class':"vidFrame" }).appendTo($(this.frame)); this.txtbox = $("
    ", { 'class':"textFrame" }).appendTo($(this.frame)); this.tab = $("
    ", { 'class':cls2 }).text("Page Tour").appendTo($('body')); $(this.tab).click(function(){This.toggleFrame();}); this.tabClose = $("
    ", { class:"vidboxTabClose", text:'x' } ); this.tabClose.appendTo($(this.tab)); embed = $("'); } } // Get the daemon status JSON. function getCoreStatus() { setCoreStatusHTML('passiveonly', 'Checking process status...'); $.get('/statusjson.cgi?query=programstatus', function(d) { d = d && d.data && d.data.programstatus || false; if (d && d.nagios_pid) { var pid = d.nagios_pid; var daemon = d.daemon_mode ? 'Daemon' : 'Process'; setCoreStatusHTML('enabled', daemon + ' running with PID ' + pid); } else { setCoreStatusHTML('disabled', 'Not running'); } }).fail(function() { setCoreStatusHTML('disabled', 'Unable to get process status'); }); } function setCoreStatusHTML(image, text) { $('#core-status').html(' ' + text); }
    Nagios® Core
    Version
    August 24, 2017
    Warning: Automatic Update Checks are Disabled!
    Disabling update checks presents a possible security risk. Visit nagios.org to check for updates manually or enable update checks in your Nagios config file.
    A new version of Nagios Core is available!
    Visit nagios.org to download Nagios .

    Latest News

    Don't Miss...

    Copyright © 2010- Nagios Core Development Team and Community Contributors. Copyright © 1999-2009 Ethan Galstad. See the THANKS file for more information on contributors.
    Nagios Core is licensed under the GNU General Public License and is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE WARRANTY OF DESIGN, MERCHANTABILITY, AND FITNESS FOR A PARTICULAR PURPOSE. Nagios, Nagios Core and the Nagios logo are trademarks, servicemarks, registered trademarks or registered servicemarks owned by Nagios Enterprises, LLC. Use of the Nagios marks is governed by the trademark use restrictions.
    SourceForge.net Logo
    nagios-4.3.4/html/map-directive.html000066400000000000000000000037371314764422400174060ustar00rootroot00000000000000
    nagios-4.3.4/html/map-form.html000066400000000000000000000073601314764422400163670ustar00rootroot00000000000000
    nagios-4.3.4/html/map-links.html000066400000000000000000000012071314764422400165360ustar00rootroot00000000000000 nagios-4.3.4/html/map-popup.html000066400000000000000000000032731314764422400165660ustar00rootroot00000000000000
    nagios-4.3.4/html/map.php000066400000000000000000000102631314764422400152450ustar00rootroot00000000000000 \n"; echo "\t\t\tbody.hasBgImage { background: url('$img');\n"; echo "\t\t\n"; } $layout = 6; if (isset($cfg["default_statusmap_layout"])) { $layout = $cfg["default_statusmap_layout"]; if (is_numeric($layout)) $layout = $layout + 0; else $layout = -1; if ($layout > 10 || $layout < 0) $layout = 6; } /* This allows a user supplied layout */ if ( filter_input(INPUT_GET, 'layout', FILTER_VALIDATE_INT) === 0 || filter_input(INPUT_GET, 'layout', FILTER_VALIDATE_INT, array( "options" => array("min_range"=>1, "max_range"=>10) ) ) ) { $layout = $_GET['layout']; } if ($layout == 4) $layout = 6; ?> Nagios Map >
    nagios-4.3.4/html/robots.txt000066400000000000000000000000321314764422400160210ustar00rootroot00000000000000User-agent: * Disallow: / nagios-4.3.4/html/side.php000066400000000000000000000140611314764422400154140ustar00rootroot00000000000000 Nagios Core nagios-4.3.4/html/spin/000077500000000000000000000000001314764422400147265ustar00rootroot00000000000000nagios-4.3.4/html/spin/spin.js000066400000000000000000000234521314764422400162430ustar00rootroot00000000000000/** * Copyright (c) 2011-2014 Felix Gnass * Licensed under the MIT license */ (function(root, factory) { /* CommonJS */ if (typeof exports == 'object') module.exports = factory() /* AMD module */ else if (typeof define == 'function' && define.amd) define(factory) /* Browser global */ else root.Spinner = factory() } (this, function() { "use strict"; var prefixes = ['webkit', 'Moz', 'ms', 'O'] /* Vendor prefixes */ , animations = {} /* Animation rules keyed by their name */ , useCssAnimations /* Whether to use CSS animations or setTimeout */ /** * Utility function to create elements. If no tag name is given, * a DIV is created. Optionally properties can be passed. */ function createEl(tag, prop) { var el = document.createElement(tag || 'div') , n for(n in prop) el[n] = prop[n] return el } /** * Appends children and returns the parent. */ function ins(parent /* child1, child2, ...*/) { for (var i=1, n=arguments.length; i>1) + 'px' }) } for (; i < o.lines; i++) { seg = css(createEl(), { position: 'absolute', top: 1+~(o.width/2) + 'px', transform: o.hwaccel ? 'translate3d(0,0,0)' : '', opacity: o.opacity, animation: useCssAnimations && addAnimation(o.opacity, o.trail, start + i * o.direction, o.lines) + ' ' + 1/o.speed + 's linear infinite' }) if (o.shadow) ins(seg, css(fill('#000', '0 0 4px ' + '#000'), {top: 2+'px'})) ins(el, ins(seg, fill(getColor(o.color, i), '0 0 1px rgba(0,0,0,.1)'))) } return el }, /** * Internal method that adjusts the opacity of a single line. * Will be overwritten in VML fallback mode below. */ opacity: function(el, i, val) { if (i < el.childNodes.length) el.childNodes[i].style.opacity = val } }) function initVML() { /* Utility function to create a VML tag */ function vml(tag, attr) { return createEl('<' + tag + ' xmlns="urn:schemas-microsoft.com:vml" class="spin-vml">', attr) } // No CSS transforms but VML support, add a CSS rule for VML elements: sheet.addRule('.spin-vml', 'behavior:url(#default#VML)') Spinner.prototype.lines = function(el, o) { var r = o.length+o.width , s = 2*r function grp() { return css( vml('group', { coordsize: s + ' ' + s, coordorigin: -r + ' ' + -r }), { width: s, height: s } ) } var margin = -(o.width+o.length)*2 + 'px' , g = css(grp(), {position: 'absolute', top: margin, left: margin}) , i function seg(i, dx, filter) { ins(g, ins(css(grp(), {rotation: 360 / o.lines * i + 'deg', left: ~~dx}), ins(css(vml('roundrect', {arcsize: o.corners}), { width: r, height: o.width, left: o.radius, top: -o.width>>1, filter: filter }), vml('fill', {color: getColor(o.color, i), opacity: o.opacity}), vml('stroke', {opacity: 0}) // transparent stroke to fix color bleeding upon opacity change ) ) ) } if (o.shadow) for (i = 1; i <= o.lines; i++) seg(i, -2, 'progid:DXImageTransform.Microsoft.Blur(pixelradius=2,makeshadow=1,shadowopacity=.3)') for (i = 1; i <= o.lines; i++) seg(i) return ins(el, g) } Spinner.prototype.opacity = function(el, i, val, o) { var c = el.firstChild o = o.shadow && o.lines || 0 if (c && i+o < c.childNodes.length) { c = c.childNodes[i+o]; c = c && c.firstChild; c = c && c.firstChild if (c) c.opacity = val } } } var probe = css(createEl('group'), {behavior: 'url(#default#VML)'}) if (!vendor(probe, 'transform') && probe.adj) initVML() else useCssAnimations = vendor(probe, 'animation') return Spinner })); nagios-4.3.4/html/spin/spin.min.js000066400000000000000000000100571314764422400170220ustar00rootroot00000000000000//fgnass.github.com/spin.js#v2.0.1 !function(a,b){"object"==typeof exports?module.exports=b():"function"==typeof define&&define.amd?define(b):a.Spinner=b()}(this,function(){"use strict";function a(a,b){var c,d=document.createElement(a||"div");for(c in b)d[c]=b[c];return d}function b(a){for(var b=1,c=arguments.length;c>b;b++)a.appendChild(arguments[b]);return a}function c(a,b,c,d){var e=["opacity",b,~~(100*a),c,d].join("-"),f=.01+c/d*100,g=Math.max(1-(1-a)/b*(100-f),a),h=j.substring(0,j.indexOf("Animation")).toLowerCase(),i=h&&"-"+h+"-"||"";return l[e]||(m.insertRule("@"+i+"keyframes "+e+"{0%{opacity:"+g+"}"+f+"%{opacity:"+a+"}"+(f+.01)+"%{opacity:1}"+(f+b)%100+"%{opacity:"+a+"}100%{opacity:"+g+"}}",m.cssRules.length),l[e]=1),e}function d(a,b){var c,d,e=a.style;for(b=b.charAt(0).toUpperCase()+b.slice(1),d=0;d',c)}m.addRule(".spin-vml","behavior:url(#default#VML)"),h.prototype.lines=function(a,d){function f(){return e(c("group",{coordsize:k+" "+k,coordorigin:-j+" "+-j}),{width:k,height:k})}function h(a,h,i){b(m,b(e(f(),{rotation:360/d.lines*a+"deg",left:~~h}),b(e(c("roundrect",{arcsize:d.corners}),{width:j,height:d.width,left:d.radius,top:-d.width>>1,filter:i}),c("fill",{color:g(d.color,a),opacity:d.opacity}),c("stroke",{opacity:0}))))}var i,j=d.length+d.width,k=2*j,l=2*-(d.width+d.length)+"px",m=e(f(),{position:"absolute",top:l,left:l});if(d.shadow)for(i=1;i<=d.lines;i++)h(i,-2,"progid:DXImageTransform.Microsoft.Blur(pixelradius=2,makeshadow=1,shadowopacity=.3)");for(i=1;i<=d.lines;i++)h(i);return b(a,m)},h.prototype.opacity=function(a,b,c,d){var e=a.firstChild;d=d.shadow&&d.lines||0,e&&b+d>1)+"px"})}for(var i,k=0,l=(f.lines-1)*(1-f.direction)/2;k-header.ssi -footer.ssi Some examples of CGI-specific header/footer file names are shown below: tac-header.ssi tac-footer.ssi status-header.ssi status-footer.ssi avail-header.ssi avail-footer.ssi notifications-header.ssi notifications-footer.ssi nagios-4.3.4/html/stylesheets/000077500000000000000000000000001314764422400163315ustar00rootroot00000000000000nagios-4.3.4/html/stylesheets/avail.css000066400000000000000000000054211314764422400201410ustar00rootroot00000000000000 .avail { background-color: white; color: black; font-size: 10pt; } .reportRange { text-align: center; font-weight: bold; font-size: 10pt; } .reportDuration { text-align: center; } .reportTime { text-align: center; } .dataTitle { text-align: center; font-weight: bold; font-size: 12pt; } TABLE.data { font-size: 10pt; background-color: white; padding: 2px;border-collapse:separate; } /* TH.data { font-size: 10pt; background-color: white; text-align: left; background-color: #999797; color: #DCE5C1; } */ .dataOdd { background-color: #DBDBDB; } .dataEven { background-color: #C4C2C2; } .optionBoxTitle { text-align: center; font-weight: bold; font-size: 10pt; } .optionBox { font-size: 10pt; background-color: #EEEEF4; padding: 2px; } .hostUP { text-align: left; background-color: #33FF00; font-weight: bold; } .hostDOWN { text-align: left; background-color: #F83838; font-weight: bold; } .hostUNREACHABLE { text-align: left; background-color: #F83838; font-weight: bold; } .serviceOK { text-align: left; background-color: #33FF00; font-weight: bold; } .serviceWARNING { text-align: left; background-color: #FFFF00; font-weight: bold; } .serviceUNKNOWN { text-align: left; background-color: #FF9900; font-weight: bold; } .serviceCRITICAL { text-align: left; background-color: #F83838; font-weight: bold; } .optBox { font-size: 10pt; font-weight: bold; } .optBoxItem { font-weight: bold; color: red; } .helpfulHint { text-align: left; font-style: italic; text-align: center; } .dateSelectTitle { text-align: center; font-weight: bold; font-size: 12pt; } .dateSelectSubTitle { text-align: left; font-weight: bold; font-size: 10pt; } .dateSelectItem { text-align: left; } .reportSelectTip { text-align: left; font-style: italic; } .reportSelectTitle { text-align: center; font-weight: bold; font-size: 12pt; } .reportSelectSubTitle { text-align: right; font-size: 10pt; } .reportSelectItem { text-align: left; } TABLE.logEntries { background-color: white; padding: 3px; } TH.logEntries { font-size: 10pt; background-color: white; text-align: left; background-color: #999797; color: #DCE5C1; } .logEntriesEven { background-color: white; text-align: left; background-color: #C4C2C2; color: black; } .logEntriesOdd { background-color: white; text-align: left; background-color: #DBDBDB; color: black; } .logEntriesINDETERMINATE { background-color: #ACACAC; } .logEntriesOK { background-color: #33FF00; } .logEntriesUNKNOWN { background-color: #FF9900; } .logEntriesWARNING { background-color: #FFFF00; } .logEntriesCRITICAL { background-color: #F83838; } .logEntriesUP { background-color: #33FF00; } .logEntriesDOWN { background-color: #F83838; } .logEntriesUNREACHABLE { background-color: #F83838; } nagios-4.3.4/html/stylesheets/checksanity.css000066400000000000000000000017571314764422400213620ustar00rootroot00000000000000 .extinfo { font-size: 10pt; } .Title { font-size: large; text-align: center; font-weight: bold; } .SectionTitle { font-size: 12pt; text-align: center; font-weight: bold; } .DynamicData { font-size: 10pt; background-color: white; padding: 2px; } .StaticData { font-size: 10pt; background-color: white; padding: 2px; } .TableHeader { font-size: 10pt; background-color: #999797; color: #DCE5C1; text-align: left; font-weight: bold; } .Item { font-size: 10pt; text-align: left; background-color: #C4C2C2; font-weight: bold; } .DataSource { font-size: 10pt; text-align: left; background-color: #C4C2C2; } .Number { font-size: 10pt; text-align: left; background-color: #C4C2C2; } .Value { font-size: 10pt; text-align: left; background-color: #C4C2C2; font-weight: bold; } .ValueOk { font-size: 10pt; text-align: left; background-color: #33FF00; font-weight: bold; } .ValueError { font-size: 10pt; text-align: left; background-color: #F83838; font-weight: bold; } nagios-4.3.4/html/stylesheets/cmd.css000066400000000000000000000011341314764422400176050ustar00rootroot00000000000000 .cmd { } .cmdType { font-size: 10pt; font-weight: bold; text-align: center; color: red; } .commandDescription { text-align: center; background-color: #DBDBDB; padding: 5px; } .descriptionTitle { font-size: 10pt; text-align: center; font-weight: bold; } .optBox { text-align: left; padding: 5px; background-color: #C4C2C2; } .optBoxTitle { font-size: 10pt; text-align: center; font-weight: bold; } .optBoxItem { font-size: 10pt; text-align: left; background-color: #C4C2C2; } .optBoxRequiredItem { font-size: 10pt; text-align: left; color: red; background-color: #C4C2C2; } nagios-4.3.4/html/stylesheets/common.css000066400000000000000000000137261314764422400203440ustar00rootroot00000000000000 /***************** common to all pages, moved to this stylesheet ********************/ /* default font size for all elements */ * {font-size:8pt;} body { font-family: verdana,arial,serif; font-weight: normal; } /* most other link color scheme blue/light blue */ a:link,a:visited { text-decoration: none; color: #40529b; /* blue */ /* color: #DEE7C6; pale yellow */ } a:hover,a:active { text-decoration: underline; /* color: #3f5bcd; gold */ color: #8391cd; /*dark blue */ /*color: #8391cd; */ } table {border-collapse:collapse;} th { font-size: 10pt; text-align: left; background-color: #999797; } .infoBox { border: 1px solid #AAA; padding: 2px; font-size:8pt; margin-bottom:3px;} .linkBox { padding: 3px; font-size:8pt; border: 1px solid #AAA;} .infoBoxTitle { font-size: 10pt; font-weight: bold; } .infoBoxTitle { font-size: 10pt; font-weight: bold; } .infoBoxBadProcStatus { color: red; } a.homepageURL:hover { color: red; } /* feedback messages */ .errorMessage { text-align: center; color: red; font-weight: bold; font-size: 12pt; } .errorDescription { text-align: center; font-weight: bold; font-size: 12pt; } .warningMessage { text-align: center; color: red; font-weight: bold; font-size: 10pt; } .infoMessage { text-align: center; color: red; font-weight: bold; } /* nav and option boxes on several pages */ .navBoxTitle { font-size: 10pt; font-weight: bold; } .navBoxItem { font-size: 8pt; font-weight: bold; color: red; } .navBoxDate { font-size: 8pt; font-weight: bold; } .navBoxFile { font-size: 8pt; font-weight: bold; text-align: center; } /* option boxes */ .optBox { font-size: 10pt; font-weight: bold; } .optBoxItem { font-size: 8pt; font-weight: bold; color: red; } .optBoxTitle { font-weight: bold; font-size: 10pt; } .optBoxValue { font-size: 8pt; font-style: italic; } /* *********navbar frame specific styles ********************* */ /* navbar */ body.navbar { background-color: black; color: white; } /* navbar links body.navbar a:link,a:visited { text-decoration: none; color: #DEE7C6; pale yellow } body.navbar a:hover,a:active { text-decoration: underline; color: #3f5bcd; gold } */ .navbarlogo { margin: 0 0 10px 0; } .navsection { margin: 5px 0 10px 0; /*color: #AAA; */ } .navsectiontitle { font-size: 9pt; font-weight: bold; border:1px solid #AAA; padding: 2px; text-align:center; } div.navsectionlinks { margin: 3px 0 0 0; } ul.navsectionlinks { margin: 0px; padding: 0px; list-style: none; } ul.navsectionlinks li { } /* main nav links */ ul.navsectionlinks li a:link,ul.navsectionlinks li a:visited { /*color: #DEE7C6; */ font-weight: bold; font-size: 8pt; text-decoration: none; padding: 0 0 0 15px; background: transparent url(../images/greendot.gif) no-repeat scroll 0 0; color: #DEE7C6; /* pale yellow */ } ul.navsectionlinks li a:hover ,ul.navsectionlinks li a:active{ /*color: #8391cd;*/ color:#FFC47F; /* this one was working before */ background: transparent url(../images/orangedot.gif) no-repeat scroll 0 0; /* color: #3f5bcd; gold */ } ul.navsectionlinks li ul { margin: 0px; padding: 0 0 0 30px; } ul.navsectionlinks li ul li { } /* sub links on main nav */ ul.navsectionlinks li ul li a:link,ul.navsectionlinks li ul li a:visited { /* color: #DEE7C6; */ background: none; padding: 0; font-weight: normal; color: #DEE7C6; /* pale yellow */ } ul.navsectionlinks li ul li a:hover,ul.navsectionlinks li ul li a:active { background: none; color:#FFC47F; } ul.navsectionlinks li ul li ul { margin: 0px; padding: 0 0 0 15px; } div.navsectionheader { padding: 0; margin: 0; } div.navsectionheader ul { margin: 0; padding: 0; list-style: none; } div.navsectionheader ul li { font-size: 9pt; font-weight: bold; padding: 0 0 0 15px; } div.navsectionheader ul li ul li { font-weight: normal; } .navbarsearch { margin: 5px 0 0 0; } .navbarsearch fieldset { border: none; } .navbarsearch fieldset legend { font-size: 8pt; } .navbarsearch input{ /* font-size: 8pt; */ color: black; background-color: white; } /* **************** main page *********************** */ #splashpage{ text-align: center; } #mainbrandsplash{ font-size: 12pt; font-weight: bold; margin: 0 0 35px 0; } #maincopy{ margin: 0 0 15px 0; } #currentversioninfo{ font-size: 12pt; } #currentversioninfo .product{ font-size: 14pt; font-weight: bold; } #currentversioninfo .version{ font-size: 14pt; font-weight: bold; } #currentversioninfo .releasedate{ font-size: 11pt; margin: 5px 0 0 0; } #currentversioninfo .checkforupdates{ font-size: 11pt; font-weight: bold; } #currentversioninfo .whatsnew{ font-size: 11pt; font-weight: bold; margin: 50px 0 0 0; } #updateversioninfo{ margin: 15px auto 35px auto; width: 400px; } .updatechecksdisabled{ background-color: #FF9F9F; border: 1px solid red; padding: 10px; } .updatechecksdisabled div.warningmessage{ font-weight: bold; } #updateversioninfo div.submessage{ clear: left; } .updateavailable{ background-color: #9FD4FF; border: 1px solid blue; padding: 10px; } .updateavailable div.updatemessage{ font-size: 12pt; font-weight: bold; } #splashpage #mainfooter{ /*margin: 100px 0 0 0;*/ margin: auto; width: 800px; clear: both; font-size: 8pt; } #splashpage #mainfooter .disclaimer{ /*width: 80%;*/ margin: auto; } #splashpage #mainfooter .logos{ margin: 15px 0 0 0; } a img { border: none; } #splashboxes { /*border: 1px solid blue;*/ clear:both; width: 800px; height:300px; margin-left: auto; margin-right:auto; line-height:1.2em; /* added for better X-browser/OS viewing */ } #topsplashbox { height:150px; } #bottomsplashbox { height:150px; } .splashbox { padding: 5px; margin: 5px; border: 1px solid #AAAAAA; float: left; text-align: left; width:375px; } .splashbox h2{ margin: 0px; font-size: 12pt; } .splashbox ul{ margin: 0; padding: 5px 5px 5px 15px; } .splashbox ul li{ clear: both; } #splashbox1 { } #splashbox2 { } nagios-4.3.4/html/stylesheets/config.css000066400000000000000000000010431314764422400203060ustar00rootroot00000000000000 .config { } .dataTitle { text-align: center; font-weight: bold; font-size: 12pt; } TABLE.data { background-color: white; padding: 2px; border-collapse:separate;} TH.data { background-color: white; text-align: left; background-color: #999797; } .dataOdd { background-color: #DBDBDB; } .dataEven { background-color: #C4C2C2; } .reportSelectTitle { text-align: center; font-weight: bold; font-size: 12pt; } .reportSelectSubTitle { text-align: left; font-weight: bold; font-size: 10pt; } .reportSelectItem { text-align: left; } nagios-4.3.4/html/stylesheets/extinfo.css000066400000000000000000000122321314764422400205170ustar00rootroot00000000000000 .extinfo { } DIV.dataTitle { text-align: center; font-weight: bold; font-size: 12pt; } DIV.data { text-align: center; font-size: 12pt; } DIV.perfTypeTitle { text-align: right; font-weight: bold; font-size: 10pt; } /* TABLE.data { font-size: 10pt; background-color: white; padding: 2px; border-collapse:separate;} TH.data { font-size: 10pt; text-align: left; background-color: #999797; } */ .dataOdd { font-size: 10pt; background-color: #DBDBDB; } .dataEven { font-size: 10pt; background-color: #C4C2C2; } .commandTitle { text-align: center; font-weight: bold; font-size: 12pt; } TABLE.command { font-size: 10pt; background-color: #DBDBDB; padding: 3px; } .command { font-size: 10pt; padding: 2px; } .commentTitle { text-align: center; font-weight: bold; font-size: 12pt; } DIV.commentNav { font-size: 10pt; text-align: center; } A.commentNav { font-size: 10pt; } TABLE.comment { font-size: 10pt; background-color: white; padding: 2px; border-collapse:separate;} TH.comment { font-size: 10pt; text-align: left; background-color: #999797; } .commentOdd { font-size: 9pt; background-color: #DBDBDB; } .commentEven { font-size: 9pt; background-color: #C4C2C2; } DIV.comment,A.comment { font-size: 10pt; background-color: white; text-align: center; } .downtimeTitle { text-align: center; font-weight: bold; font-size: 12pt; } DIV.downtimeNav { font-size: 10pt; text-align: center; } A.downtimeNav { font-size: 10pt; } TABLE.downtime { font-size: 10pt; background-color: white; padding: 2px; border-collapse:separate;} TH.downtime { font-size: 10pt; text-align: left; background-color: #999797; } .downtimeOdd { font-size: 9pt; background-color: #DBDBDB; } .downtimeEven { font-size: 9pt; background-color: #C4C2C2; } .notificationsENABLED { font-size: 10pt; text-align: left; background-color: #33FF00; font-weight: bold; } .notificationsDISABLED { font-size: 10pt; text-align: left; background-color: #F83838; font-weight: bold; } .checksENABLED { font-size: 10pt; text-align: left; background-color: #33FF00; font-weight: bold; } .checksDISABLED { font-size: 10pt; text-align: left; background-color: #F83838; font-weight: bold; } .eventhandlersENABLED { font-size: 10pt; text-align: left; background-color: #33FF00; font-weight: bold; } .eventhandlersDISABLED { font-size: 10pt; text-align: left; background-color: #F83838; font-weight: bold; } .flapdetectionENABLED { font-size: 10pt; text-align: left; background-color: #33FF00; font-weight: bold; } .flapdetectionDISABLED { font-size: 10pt; text-align: left; background-color: #F83838; font-weight: bold; } .notflapping { font-size: 10pt; text-align: left; background-color: #33FF00; font-weight: bold; float: left; } .flapping { font-size: 10pt; text-align: left; background-color: #F83838; font-weight: bold; float: left; } .downtimeACTIVE { font-size: 10pt; text-align: left; background-color: #F83838; font-weight: bold; float: left; } .downtimeINACTIVE { font-size: 10pt; text-align: left; background-color: #33FF00; font-weight: bold; float: left; } .processOK { font-size: 10pt; background-color: #33FF00; font-weight: bold; } .processUNKNOWN { font-size: 10pt; background-color: #FF9900; font-weight: bold; } .processWARNING { font-size: 10pt; background-color: #FFFF00; font-weight: bold; } .processCRITICAL { font-size: 10pt; background-color: #F83838; font-weight: bold; } .modeACTIVE { font-size: 10pt; background-color: #33FF00; font-weight: bold; } .modeSTANDBY { font-size: 10pt; background-color: #FFFF00; font-weight: bold; } .hostUP { font-size: 10pt; text-align: left; background-color: #33FF00; font-weight: bold; float: left; } .hostDOWN { font-size: 10pt; text-align: left; background-color: #F83838; font-weight: bold; float: left; } .hostUNREACHABLE { font-size: 10pt; text-align: left; background-color: #F83838; font-weight: bold; float: left; } .serviceOK { font-size: 10pt; text-align: left; background-color: #33FF00; font-weight: bold; float: left; } .serviceWARNING { font-size: 10pt; text-align: left; background-color: #FFFF00; font-weight: bold; float: left; } .serviceUNKNOWN { font-size: 10pt; text-align: left; background-color: #FF9900; font-weight: bold; float: left; } .serviceCRITICAL { font-size: 10pt; text-align: left; background-color: #F83838; font-weight: bold; float: left; } .commandPanel { background-color: white; } .commentPanel { background-color: white; } .stateInfoPanel { background-color: white; } .stateStatisticsPanel { background-color: white; } .stateInfoTable1 { font-size: 10pt; background-color: #DBDBDB; } .stateInfoTable2 { font-size: 10pt; background-color: #C4C2C2; } .dataVar { font-size: 10pt; } .dataVal { font-size: 10pt; } .queueTitle { text-align: center; font-weight: bold; font-size: 12pt; } TABLE.queue { font-size: 10pt; background-color: white; padding: 2px; border-collapse:separate;} TH.queue { font-size: 10pt; text-align: left; background-color: #999797; } .queueOdd { font-size: 9pt; background-color: #DBDBDB; } .queueEven { font-size: 9pt; background-color: #C4C2C2; } .queueENABLED { font-size: 9pt; background-color: #33FF00; } .queueDISABLED { font-size: 9pt; background-color: #F83838; } nagios-4.3.4/html/stylesheets/histogram.css000066400000000000000000000007711314764422400210450ustar00rootroot00000000000000.histogram { } .dataTitle { text-align: center; font-weight: bold; font-size: 12pt; } .reportRange { text-align: center; font-weight: bold; font-size: 10pt; } .reportDuration { text-align: center; } .reportTime { text-align: center; } .reportSelectTitle { text-align: center; font-weight: bold; font-size: 12pt; } .reportSelectSubTitle { text-align: right; font-size: 10pt; } .reportSelectItem { text-align: left; } .helpfulHint { text-align: left; font-style: italic; text-align: center; } nagios-4.3.4/html/stylesheets/histogramgraph.css000066400000000000000000000035731314764422400220720ustar00rootroot00000000000000/* General text style */ text { font-family: sans-serif; font-size: 11px; } /* Colors for text representing states */ text.up { fill: rgb(0, 128, 0); } text.down { fill: rgb(255, 0, 0); } text.unreachable { fill: rgb(128, 0, 0); } text.ok { fill: rgb(0, 128, 0); } text.warning { fill: rgb(176, 178, 20); } text.unknown { fill: rgb(255, 100, 25); } text.critical { fill: rgb(255, 0, 0); } /* Colors for text representing states */ path.up { stroke: rgb(0, 128, 0); } path.down { stroke: rgb(255, 0, 0); } path.unreachable { stroke: rgb(128, 0, 0); } path.ok { stroke: rgb(0, 128, 0); } path.warning { stroke: rgb(176, 178, 20); } path.unknown { stroke: rgb(255, 100, 25); } path.critical { stroke: rgb(255, 0, 0); } /* Class to hide elements */ .hidden { display: none; } /* Trend SVG style */ div#histogramsvg { position: absolute; z-index: 10; left: 0; top: 0; } /* Center header text */ g#header text, g#yaxis-label text { text-anchor: middle; } /* Anchor the y-axis text to the end of the text */ g#xaxis text, g#yaxis text { text-anchor: end; } /* Draw grid lines as dashed lines */ g#xaxis line, g#yaxis line { stroke-width: 1; stroke: #c0c0c0; stroke-dasharray: 2,4; pointer-events: none; } /* Hide the axes path */ g#xaxis path, g#yaxis path { display: none; } /* Styles for data lines */ g#grid path { fill: none; stroke-width: 1; } /* Styles for grid spinner */ div#gridspinner { position: absolute; top: 74px; left: 355px; height: 50px; width: 50px; z-index: 40; } /* Styles for the summary table */ g.summary .label { text-anchor: left; } g.summary .value { text-anchor: end; } g.summary line { stroke-width: 1; stroke: black; } /* Styles for menu button */ div#menubutton { position: absolute; top: 5px; left: 871px; height: 25px; width: 22px; z-index: 40; } div#menubutton button { padding: 0px; border: none; background-color: white; } nagios-4.3.4/html/stylesheets/history.css000066400000000000000000000002621314764422400205440ustar00rootroot00000000000000 .history {} .dataTitle { text-align: center; font-weight: bold; font-size: 12pt; } .logEntries { } .dateTimeBreak { font-size: 10pt; font-weight: bold; color: red; } nagios-4.3.4/html/stylesheets/jsonquery.css000066400000000000000000000006721314764422400211070ustar00rootroot00000000000000body, html { margin: 0; padding: 0; } #wrap { width: 750px; left: calc(50% - 375px); background: #ddd; position: absolute; text-align: center; } #options { width: 290px; float: left; background: #bbb; padding-left: 5px; padding-right: 5px; text-align: left; } #results { width: 440px; float: right; padding-left: 5px; padding-right: 5px; text-align: left; } #results p.error { color: red; } .required { color: red; } nagios-4.3.4/html/stylesheets/map-directive.css000066400000000000000000000026411314764422400215770ustar00rootroot00000000000000.hidden { display: none; } /* Styles for the spinner div */ div#spinner { position: absolute; top: 0; left: 0; z-index: 40; } /* Styles for the map div */ div#mapsvg { position: absolute; border-style: solid; border-color: #777777; border-width: 1px; width: 600px; height: 600px; } /* Styles for map elements */ .link { fill: none; stroke: #cccccc; stroke-width: 1.5px; } .node circle { fill: #ffffff; stroke: #cccccc; stroke-width: 2px; } .node { font-family: sans-serif; } /* Styles for state popups */ div#popup { font-family: sans-serif; font-size: 11px; position: absolute; width: auto; height: auto; padding: 3px; border: 1px solid black; background-color: #ffffcc; pointer-events: none; } div#popup td { vertical-align: top; } div#popup .popup-label { text-align: right; } div#popup .popup-value { font-weight: bold; } /* Colors for text representing states */ .up { color: rgb(0, 128, 0); } .down { color: rgb(255, 0, 0); } .unreachable { color: rgb(128, 0, 0); } .ok { color: rgb(0, 128, 0); } .warning { color: rgb(176, 178, 20); } .unknown { color: rgb(255, 100, 25); } .critical { color: rgb(255, 0, 0); } .pending { color: #ccc; } /* Styles for labels in partition displays */ g.label { pointer-events: none; } /* Styles for menu button */ div#menubutton { position: absolute; z-index: 40; } div#menubutton button { padding: 0px; border: none; background-color: white; } nagios-4.3.4/html/stylesheets/map.css000066400000000000000000000010021314764422400176110ustar00rootroot00000000000000/* Styles for the body as whole */ body { margin: 0; } /* Styles for the map header div */ div#header-container { position: absolute; top: 1px; left: 1px; width: 320px; z-index: 30; } /* Container for the map svg */ div#map-container { position: absolute; width: 100%; height: 100%; } /* Class to remove shadow from bootstrap buttons */ .btn-noshadow:focus, .btn-noshadow:active { outline: none; -webkit-box-shadow: none !important; -moz-box-shadow: none !important; box-shadow: none !important; } nagios-4.3.4/html/stylesheets/ministatus.css000066400000000000000000000066651314764422400212600ustar00rootroot00000000000000 .status {} .filter { background-color: #DBDBDB; } .filterTitle { font-size: 10pt; font-weight: bold; background-color: #DBDBDB; } .filterName { background-color: #DBDBDB; } .filterValue { background-color: #DBDBDB; } .statusTitle { text-align: center; font-weight: bold; font-size: 12pt; } .statusSort { } TABLE.status { background-color: white; padding: 2px; } TH.status { font-size: 10pt; text-align: left; background-color: #999797; } DIV.status { font-size: 10pt; text-align: center; } .statusOdd { background-color: #DBDBDB; } .statusEven { background-color: #C4C2C2; } .statusPENDING { background-color: #ACACAC; } .statusOK { background-color: #33FF00; } .statusRECOVERY { background-color: #33FF00; } .statusUNKNOWN { background-color: #FF9900; } .statusWARNING { background-color: #FFFF00; } .statusCRITICAL { background-color: #F83838; } .statusHOSTPENDING { background-color: #ACACAC; } .statusHOSTUP { background-color: #33FF00; } .statusHOSTDOWN { background-color: #F83838; } .statusHOSTUNREACHABLE { background-color: #F83838; } .statusBGUNKNOWN { background-color: #FFDA9F; } .statusBGWARNING { background-color: #FEFFC1; } .statusBGCRITICAL { background-color: #FFBBBB; } .statusBGDOWN { background-color: #FFBBBB; } .statusBGUNREACHABLE { background-color: #FFBBBB; } DIV.serviceTotals { text-align: center; font-weight: bold; font-size: 10pt; } TABLE.serviceTotals { font-size: 10pt; background-color: white; padding: 2px; } TH.serviceTotals,A.serviceTotals { font-size: 10pt; text-align: center; background-color: #999797; } TD.serviceTotals { text-align: center; background-color: #e9e9e9; } .serviceTotalsOK { text-align: center; background-color: #33FF00; } .serviceTotalsWARNING { text-align: center; background-color: #FFFF00; font-weight: bold; } .serviceTotalsUNKNOWN { text-align: center; background-color: #FF9900; font-weight: bold; } .serviceTotalsCRITICAL { text-align: center; background-color: #F83838; font-weight: bold; } .serviceTotalsPENDING { text-align: center; background-color: #ACACAC; } .serviceTotalsPROBLEMS { text-align: center; background-color: orange; font-weight: bold; } DIV.hostTotals { text-align: center; font-weight: bold; font-size: 10pt; } TABLE.hostTotals { font-size: 10pt; background-color: white; padding: 2px; } TH.hostTotals,A.hostTotals { font-size: 10pt; text-align: center; background-color: #999797; } TD.hostTotals { text-align: center; background-color: #e9e9e9; } .hostTotalsUP { text-align: center; background-color: #33FF00; } .hostTotalsDOWN { text-align: center; background-color: #F83838; font-weight: bold; } .hostTotalsUNREACHABLE { text-align: center; background-color: #F83838; font-weight: bold; } .hostTotalsPENDING { text-align: center; background-color: #ACACAC; } .hostTotalsPROBLEMS { text-align: center; background-color: orange; font-weight: bold; } .miniStatusPENDING { background-color: #ACACAC; text-align: center; } .miniStatusOK { background-color: #33FF00; text-align: center; } .miniStatusUNKNOWN { background-color: #FF9900; text-align: center; } .miniStatusWARNING { background-color: #FFFF00; text-align: center; } .miniStatusCRITICAL { background-color: #F83838; text-align: center; } .miniStatusUP { background-color: #33FF00; text-align: center; } .miniStatusDOWN { background-color: #F83838; text-align: center; } .miniStatusUNREACHABLE { background-color: #F83838; text-align: center; } nagios-4.3.4/html/stylesheets/nag_funcs.css000066400000000000000000000034701314764422400210120ustar00rootroot00000000000000/* vidbox */ div.vidboxContainer { position: fixed; background: transparent; z-index: 100; } div.vidbox_ul { left:10px; top: 10px } div.vidbox_ur { right: 10px; top:10px; } div.vidbox_ll { left:10px; bottom:10px; } div.vidbox_lr { right:10px; bottom:10px; } .vidboxTab { border: 1px solid black; height: 20px; width: 130px; font: bold italic 15px serif; position: fixed; z-index: 110; text-align: center; background: #660000; color: #f0f0f0; cursor: pointer; border-top-left-radius: 20px; border-top-right-radius: 20px; } .vidboxTabClose { /* height:9px; */ width:12px; border:1px solid white; font: bold 13px sans-serif; line-height: 10px; margin: 3px 0 0 10px; vertical-align: top; padding-bottom: 3px; display: none; } .vidboxTab_ul { left: -55px; top:70px; border-radius: 20px 20px 0px 0px; transform:rotate(90deg); height: 30px; line-height: 25px !important; } .vidboxTab_ur { right:-55px; top:70px; border-radius: 20px 20px 0px 0px; transform:rotate(270deg); height: 30px; line-height: 25px !important; } .vidboxTab_ll { left:-55px; bottom:70px; border-radius: 20px 20px 0px 0px; transform:rotate(90deg); height: 30px; line-height: 25px !important; } .vidboxTab_lr { right:-55px; bottom:70px; border-radius: 20px 20px 0px 0px; transform:rotate(270deg); height: 30px; line-height: 25px !important; } .vidboxFrame { background-color:#303030; color:white; border: 1px solid black; display:none; text-align: center; } .vidboxCancel { float:right; cursor: pointer; padding:5px 20px 0 0; color: #ccccff; } .vidFrame { width:600px; } .vidboxIframe { margin-top:10px; } .textFrame { margin: 10px; } .textFrame a:link, .textFrame a:visited { color: #ccccff; } .textFrame a:hover, .textFrame a:active { text-decoration: underline; color: #eeeeff; } nagios-4.3.4/html/stylesheets/notifications.css000066400000000000000000000021541314764422400217160ustar00rootroot00000000000000 .notifications { } .dataTitle { text-align: center; font-weight: bold; font-size: 12pt; } TABLE.notifications { font-size: 10pt; background-color: white; padding: 5px; border-collapse:separate; } TH.notifications { font-size: 10pt; text-align: left; background-color: #999797; } .notificationsOdd { background-color: #DBDBDB; } .notificationsEven { background-color: #C4C2C2; } .notificationsOK { background-color: #33FF00; } .notificationsUNKNOWN { background-color: #FF9900; } .notificationsWARNING { background-color: #FFFF00; } .notificationsCRITICAL { background-color: #F83838; } .notificationsACKNOWLEDGEMENT { background-color: #AAAAAA; } .notificationsCUSTOM { background-color: #778899; } .notificationsDOWNTIME { background-color: #07C7C7; } .notificationsHOSTUP { background-color: #33FF00; } .notificationsHOSTDOWN { background-color: #F83838; } .notificationsHOSTUNREACHABLE { background-color: #F83838; } .notificationsHOSTACKNOWLEDGEMENT { background-color: #AAAAAA; } .notificationsHOSTCUSTOM { background-color: #778899; } .notificationsHOSTDOWNTIME { background-color: #07C7C7; } nagios-4.3.4/html/stylesheets/outages.css000066400000000000000000000013351314764422400205140ustar00rootroot00000000000000 .outages { } .itemTotalsTitle { text-align: center; } .dataTitle { text-align: center; font-weight: bold; font-size: 12pt; } TABLE.data { font-size: 10pt; background-color: white; padding: 2px; border-collapse:separate;} TH.data { font-size: 10pt; text-align: left; background-color: #999797; } .dataOdd { font-size: 10pt; background-color: #DBDBDB; } .dataEven { font-size: 10pt; background-color: #C4C2C2; } .hostUP { font-size: 10pt; text-align: left; background-color: #33FF00; font-weight: bold; } .hostDOWN { font-size: 10pt; text-align: left; background-color: #F83838; font-weight: bold; } .hostUNREACHABLE { font-size: 10pt; text-align: left; background-color: #F83838; font-weight: bold; } nagios-4.3.4/html/stylesheets/showlog.css000066400000000000000000000001511314764422400205220ustar00rootroot00000000000000 .showlog { } .logEntries { } .dateTimeBreak { font-size: 10pt; font-weight: bold; color: red; } nagios-4.3.4/html/stylesheets/status.css000066400000000000000000000133751314764422400203770ustar00rootroot00000000000000 .status { background-color: white; color: black;} /* classes to replace deprecated inline styles */ .headertable{border:0; width:100%; } table.filter {border:1px solid #AAA; padding:2px;} .filterTitle { font-size: 10pt; font-weight: bold; padding:0 2px; } td.filter {padding:0 3px;} /* .filter { background-color: #DBDBDB; } .filterName { background-color: #DBDBDB; } .filterValue { background-color: #DBDBDB; } */ .itemTotalsTitle { text-align: center; clear:both;} .statusTitle { text-align: center; font-weight: bold; font-size: 12pt; } .statusSort { } table.status { background-color: white; padding: 2px; border-collapse:separate;} /* border-collapse:separate; */ /* table.status tr td {border:1px solid white;} */ table.pageTitle {margin-bottom:3px;} th.status { font-size: 10pt; text-align: left; background-color: #999797; } div.status { font-size: 10pt; text-align: center; } .statusOdd { background-color: #DBDBDB; } .statusEven { background-color: #C4C2C2; } /* CSS styles won't inherit correctly as long as there are nested tables */ /* .statusPENDING { background-color: #ACACAC; } */ /* .statusOK { background-color: #33FF00; } */ .statusRECOVERY { background-color: #33FF00; } .statusUNKNOWN { background-color: #FF9900; } .statusWARNING { background-color: #FFFF00; } /* .statusCRITICAL { background-color: #F83838; } */ .statusHOSTPENDING,.statusPENDING { background-color: #ACACAC; } .statusHOSTUP,.statusOK { background-color: #33FF00; } .statusHOSTDOWN,.statusCRITICAL { background-color: #F83838; } .statusHOSTDOWNACK { background-color: #F83838; } .statusHOSTDOWNSCHED { background-color: #F83838; } .statusHOSTUNREACHABLE { background-color: #F83838; } .statusHOSTUNREACHABLEACK { background-color: #F83838; } .statusHOSTUNREACHABLESCHED { background-color: #F83838; } .statusBGUNKNOWN { background-color: #FFDA9F; } .statusBGUNKNOWNACK { background-color: #FFDA9F; } .statusBGUNKNOWNSCHED { background-color: #FFDA9F; } .statusBGWARNING { background-color: #FEFFC1; } .statusBGWARNINGACK { background-color: #FEFFC1; } .statusBGWARNINGSCHED { background-color: #FEFFC1; } .statusBGCRITICAL { background-color: #FFBBBB; } .statusBGCRITICALACK { background-color: #FFBBBB; } .statusBGCRITICALSCHED { background-color: #FFBBBB;} .statusBGDOWN { background-color: #FFBBBB; } .statusBGDOWNACK { background-color: #FFBBBB; } .statusBGDOWNSCHED { background-color: #FFBBBB; } .statusBGUNREACHABLE { background-color: #FFBBBB; } .statusBGUNREACHABLEACK { background-color: #FFBBBB; } .statusBGUNREACHABLESCHED { background-color: #FFBBBB; } div.serviceTotals,div.hostTotals { text-align: center; font-weight: bold; font-size: 10pt; } table.serviceTotals, table.hostTotals { font-size: 10pt; padding: 2px; margin-bottom:3px;border-collapse:separate;} th.serviceTotals,th.hostTotals{ font-size: 10pt; text-align: center; background-color: #999797; } th.serviceTotals a:hover,th.hostTotals a:hover {color: #FFC47F;} /* removed styles */ td.serviceTotals,td.hostTotals,td.hostTotals { text-align: center; background-color: #e9e9e9; } .serviceTotalsOK { text-align: center; background-color: #33FF00; } .serviceTotalsWARNING { text-align: center; background-color: #FFFF00; font-weight: bold; } .serviceTotalsUNKNOWN { text-align: center; background-color: #FF9900; font-weight: bold; } .serviceTotalsCRITICAL { text-align: center; background-color: #F83838; font-weight: bold; } .serviceTotalsPENDING { text-align: center; background-color: #ACACAC; } .serviceTotalsPROBLEMS { text-align: center; background-color: orange; font-weight: bold; } /* div.hostTotals { text-align: center; font-weight: bold; font-size: 10pt; } table.hostTotals { font-size: 10pt; background-color: white; padding: 2px; border:1px solid #AAA; border-collapse:collapse;} th.hostTotals,a.hostTotals { font-size: 10pt; text-align: center; background-color: #999797; } td.hostTotals { text-align: center; background-color: #e9e9e9; } */ .hostTotalsUP { text-align: center; background-color: #33FF00; } .hostTotalsDOWN { text-align: center; background-color: #F83838; font-weight: bold; } .hostTotalsUNREACHABLE { text-align: center; background-color: orange; font-weight: bold; } .hostTotalsPENDING { text-align: center; background-color: #ACACAC; } .hostTotalsPROBLEMS { text-align: center; background-color: orange; font-weight: bold; } .miniStatusPENDING { background-color: #ACACAC; text-align: center; } .miniStatusOK { background-color: #33FF00; text-align: center; } .miniStatusUNKNOWN { background-color: #FF9900; text-align: center; } .miniStatusWARNING { background-color: #FFFF00; text-align: center; } .miniStatusCRITICAL { background-color: #F83838; text-align: center; } .miniStatusUP { background-color: #33FF00; text-align: center; } .miniStatusDOWN { background-color: #F83838; text-align: center; } .miniStatusUNREACHABLE { background-color: #F83838; text-align: center; } .hostImportantProblem { text-align: left; background-color: #ff0000; color: black; text-decoration: blink; } .hostUnimportantProblem { text-align: left; background-color: #ffcccc; color: black; } .serviceImportantProblem { text-align: left; background-color: #ff0000; color: black; text-decoration: blink; } .serviceUnimportantProblem { text-align: left; background-color: #ffcccc; color: black; } /* page number styles, added 2/01/2012 -MG */ #top_page_numbers {float:right;} #result_limit {display:inline;} .pagenumber { display: block; float:left; border: 1px solid #AAAAAA; padding: 0 2px 0 2px; margin: 1px;text-align:center; height:15px; } a.pagenumber:hover,a.pagenumber:active { background-color: #EFEFEF;text-decoration:none;} .current_page { color: #AAA; } #inner_numbers { clear:right;} #pagelimit,#bottom_page_numbers {margin-bottom:1em;} nagios-4.3.4/html/stylesheets/statusmap.css000066400000000000000000000002431314764422400210630ustar00rootroot00000000000000 .statusmap {} .imageInfo { font-weight: bold; text-align: center; } .zoomTitle { font-size: 12pt; font-weight: bold; } .popupText { font-weight: bold; } nagios-4.3.4/html/stylesheets/summary.css000066400000000000000000000034671314764422400205520ustar00rootroot00000000000000 .summary { } .reportRange { text-align: center; font-weight: bold; font-size: 10pt; } .reportDuration { text-align: center; } .reportTime { text-align: center; } .reportDataEven { background-color: #B4B5CC; padding: 2px; } .reportDataOdd { background-color: #CDCEE9; padding: 2px; } .dataTitle { text-align: center; font-weight: bold; font-size: 12pt; } .dataSubTitle { text-align: center; font-weight: bold; font-size: 10pt; } TABLE.data { font-size: 10pt; background-color: white; padding: 2px; border-collapse:separate;} TH.data { font-size: 10pt; text-align: left; background-color: #999797; } .dataOdd { font-size: 9pt; background-color: #DBDBDB; } .dataEven { font-size: 9pt; background-color: #C4C2C2; } .hostUP { font-size: 9pt; text-align: left; background-color: #33FF00; } .hostDOWN { font-size: 9pt; text-align: left; background-color: #F83838; } .hostUNREACHABLE { font-size: 9pt; text-align: left; background-color: #F83838; } .serviceOK { font-size: 9pt; text-align: left; background-color: #33FF00; } .serviceWARNING { font-size: 9pt; text-align: left; background-color: #FFFF00; } .serviceUNKNOWN { font-size: 9pt; text-align: left; background-color: #FF9900; } .serviceCRITICAL { font-size: 9pt; text-align: left; background-color: #F83838; } .helpfulHint { text-align: left; font-style: italic; text-align: center; } .dateSelectTitle { text-align: center; font-weight: bold; font-size: 12pt; } .dateSelectSubTitle { text-align: left; font-weight: bold; font-size: 10pt; } .dateSelectItem { text-align: left; } .reportSelectTip { text-align: left; font-style: italic; } .reportSelectTitle { text-align: center; font-weight: bold; font-size: 12pt; } .reportSelectSubTitle { text-align: right; font-size: 10pt; } .reportSelectItem { text-align: left; } nagios-4.3.4/html/stylesheets/tac.css000066400000000000000000000160201314764422400176110ustar00rootroot00000000000000 .tac { background-color: black; background: black; color: white; background-color: black; margin:10px;} .infoBoxBadProcStatus { color: red; } body.tac a,a:visited { color: black; } body.tac a:active,a:hover: {text-decoration:underline;} body.tac table.infoBox {background-color:#C4C2C2;color:black;} .title { text-align: left; font-weight: bold; font-size: large; background-color: black; color: white; } .titleItem { text-align: left; font-weight: bold; background-color: black; color: white; } .infoBoxBadProcStatus { text-align: left; font-weight: bold; background-color: #C4C2C2; color: red; } .healthTitle { text-align: left; font-weight: bold; font-size: 10pt; background-color: #999797; color: black; } .healthBox { text-align: left; font-weight: bold; background-color: #C4C2C2; color: white; } .healthItem { text-align: left; font-weight: bold; font-size: 10pt; background-color: #C4C2C2; color: black; } .healthBar { text-align: left; font-weight: bold; background-color: gray; color: white; } .perfTitle { text-align: left; font-weight: bold; font-size: 10pt; background-color: #999797; color: black; text-decoration: none; } .perfBox { text-align: left; font-weight: bold; background-color: #C4C2C2; color: white; } .perfItem { text-align: left; font-weight: bold; font-size: 10pt; background-color: #C4C2C2; color: black; text-decoration: none; } .perfValue { text-align: left; font-size: 10pt; background-color: #C4C2C2; color: black; text-decoration: none; } .featureTitle { text-align: left; font-weight: bold; font-size: 10pt; background-color: #999797; color: black; } .featureHeader { text-align: center; font-weight: bold; font-size: 10pt; background-color: #C4C2C2; color: black; } .featureEnabled { text-align: center; font-weight: bold; font-size: 10pt; background-color: #ccffcc; color: #8f8f8f; } .featureDisabled { text-align: center; font-weight: bold; font-size: 10pt; background-color: #ffcccc; color: #b3b3b3; } .featureEnabledFlapDetection { text-align: center; font-weight: bold; font-size: 10pt; background-color: #ccffcc; color: #8f8f8f; } .featureDisabledFlapDetection { text-align: center; font-weight: bold; font-size: 10pt; background-color: #ffcccc; color: #b3b3b3; } .featureItemEnabledServiceFlapDetection { text-align: left; background-color: #ccffcc; color: black; } .featureItemDisabledServiceFlapDetection { text-align: left; background-color: #ff0000; color: black; } .featureItemEnabledHostFlapDetection { text-align: left; background-color: #ccffcc; color: black; } .featureItemDisabledHostFlapDetection { text-align: left; background-color: #ff0000; color: black; } .featureItemServicesNotFlapping { text-align: left; background-color: #ccffcc; color: black; } .featureItemServicesFlapping { text-align: left; background-color: #ff0000; color: black; } .featureItemHostsNotFlapping { text-align: left; background-color: #ccffcc; color: black; } .featureItemHostsFlapping { text-align: left; background-color: #ff0000; color: black; } .featureEnabledNotifications { text-align: center; font-weight: bold; font-size: 10pt; background-color: #ccffcc; color: #8f8f8f; } .featureDisabledNotifications { text-align: center; font-weight: bold; font-size: 10pt; background-color: #ffcccc; color: #b3b3b3; } .featureItemEnabledServiceNotifications { text-align: left; background-color: #ccffcc; color: black; } .featureItemDisabledServiceNotifications { text-align: left; background-color: #ff0000; color: black; } .featureItemEnabledHostNotifications { text-align: left; background-color: #ccffcc; color: black; } .featureItemDisabledHostNotifications { text-align: left; background-color: #ff0000; color: black; } .featureEnabledHandlers { text-align: center; font-weight: bold; font-size: 10pt; background-color: #ccffcc; color: #8f8f8f; } .featureDisabledHandlers { text-align: center; font-weight: bold; font-size: 10pt; background-color: #ffcccc; color: #b3b3b3; } .featureItemEnabledServiceHandlers { text-align: left; background-color: #ccffcc; color: black; } .featureItemDisabledServiceHandlers { text-align: left; background-color: #ff0000; color: black; } .featureItemEnabledHostHandlers { text-align: left; background-color: #ccffcc; color: black; } .featureItemDisabledHostHandlers { text-align: left; background-color: #ff0000; color: black; } .featureEnabledActiveChecks { text-align: center; font-weight: bold; font-size: 10pt; background-color: #ccffcc; color: #8f8f8f; } .featureDisabledActiveChecks { text-align: center; font-weight: bold; font-size: 10pt; background-color: #ffcccc; color: #b3b3b3; } .featureItemEnabledActiveServiceChecks { text-align: left; background-color: #ccffcc; color: black; } .featureItemDisabledActiveServiceChecks { text-align: left; background-color: #ff0000; color: black; } .featureItemEnabledActiveHostChecks { text-align: left; background-color: #ccffcc; color: black; } .featureItemDisabledActiveHostChecks { text-align: left; background-color: #ff0000; color: black; } .featureEnabledPassiveChecks { text-align: center; font-weight: bold; font-size: 10pt; background-color: #ccffcc; color: #8f8f8f; } .featureDisabledPassiveChecks { text-align: center; font-weight: bold; font-size: 10pt; background-color: #ffcccc; color: #b3b3b3; } .featureItemEnabledPassiveServiceChecks { text-align: left; background-color: #ccffcc; color: black; } .featureItemDisabledPassiveServiceChecks { text-align: left; background-color: #ff0000; color: black; } .featureItemEnabledPassiveHostChecks { text-align: left; background-color: #ccffcc; color: black; } .featureItemDisabledPassiveHostChecks { text-align: left; background-color: #ff0000; color: black; } .outageTitle { text-align: left; font-weight: bold; font-size: 10pt; background-color: #999797; color: black; } .outageHeader { text-align: center; font-weight: bold; font-size: 10pt; background-color: #C4C2C2; color: black; text-decoration: none; } .outageImportantProblem { text-align: left; background-color: #ff0000; color: black; } .outageUnimportantProblem { text-align: left; background-color: #ffcccc; color: black; } .hostTitle { text-align: left; font-weight: bold; font-size: 10pt; background-color: #999797; color: black; } .hostHeader { text-align: center; font-weight: bold; font-size: 10pt; background-color: #C4C2C2; color: black; text-decoration: none; } .hostImportantProblem { text-align: left; background-color: #ff0000; color: black; } .hostUnimportantProblem { text-align: left; background-color: #ffcccc; color: black; } .serviceTitle { text-align: left; font-weight: bold; font-size: 10pt; background-color: #999797; color: black; } .serviceHeader { text-align: center; font-weight: bold; font-size: 10pt; background-color: #C4C2C2; color: black; text-decoration: none; } .serviceImportantProblem { text-align: left; background-color: #ff0000; color: black; } .serviceUnimportantProblem { text-align: left; background-color: #ffcccc; color: black; } nagios-4.3.4/html/stylesheets/trends.css000066400000000000000000000010421314764422400203370ustar00rootroot00000000000000 .trends { } .dataTitle { text-align: center; font-weight: bold; font-size: 12pt; } .reportRange { text-align: center; font-weight: bold; font-size: 10pt; } .reportDuration { text-align: center; } .reportTime { text-align: center; } .reportSelectTitle { text-align: center; font-weight: bold; font-size: 12pt; } .reportSelectSubTitle { text-align: right; font-size: 10pt; } .reportSelectItem { text-align: left; } .helpfulHint { text-align: left; font-style: italic; text-align: center; } .popupText { font-weight: bold; } nagios-4.3.4/html/stylesheets/trendsgraph.css000066400000000000000000000035551314764422400213740ustar00rootroot00000000000000/* General text style */ text { font-family: sans-serif; font-size: 11px; } /* Colors for text representing states */ text.Up { fill: rgb(0, 128, 0); } text.Down { fill: rgb(255, 0, 0); } text.Unreachable { fill: rgb(128, 0, 0); } text.Ok { fill: rgb(0, 128, 0); } text.Warning { fill: rgb(176, 178, 20); } text.Unknown { fill: rgb(255, 100, 25); } text.Critical { fill: rgb(255, 0, 0); } text.Indeterminate { fill: rgb(0, 0, 0); } /* Class to hide elements */ .hidden { display: none; } /* Trend SVG style */ div#trendsvg { position: absolute; z-index: 10; left: 0; top: 0; } /* Center header text */ g#header text { text-anchor: middle; } /* Anchor the y-axis text to the end of the text */ text.yaxis { text-anchor: end; } /* Draw grid lines as dashed lines */ line.vLine, line.hLine { stroke-width: 1; stroke: black; stroke-dasharray: 2,2; pointer-events: none; } /* Styles for state popups */ div#popup { font-family: sans-serif; font-size: 11px; position: absolute; width: auto; height: auto; padding: 3px; border: 1px solid black; background-color: #ffffcc; pointer-events: none; z-index: 20; } div#popup #popup-state { font-weight: bold; text-decoration: underline; } div#popup .field-name { font-weight: bold; } div#popup #popup-start, div#popup #popup-end, div#popup #popup-duration, div#popup #popup-info { font-style: italic; } /* Styles for grid spinner */ div#gridspinner { position: absolute; top: 74px; left: 355px; height: 50px; width: 50px; z-index: 40; } /* Styles for availability spinner */ div#availabilityspinner { position: absolute; top: 74px; left: 735px; height: 50px; width: 50px; z-index: 40; } /* Styles for menu button */ div#menubutton { position: absolute; top: 5px; left: 871px; height: 25px; width: 22px; z-index: 40; } div#menubutton button { padding: 0px; border: none; background-color: white; } nagios-4.3.4/html/trends-form.html000066400000000000000000000102251314764422400171030ustar00rootroot00000000000000
    nagios-4.3.4/html/trends-graph.html000066400000000000000000000102401314764422400172360ustar00rootroot00000000000000
    State History for Service '{{service}}' on Host '{{host}}' State History for Host '{{host}}' {{startTime | date:'EEE MMM dd HH:mm:ss yyyy'}} to {{endTime | date:'EEE MMM dd HH:mm:ss yyyy'}} Up : ({{availabilityStates.up.percentageTime * 100 | number: 3}}%) {{availabilityStates.up.totalTime * 1000 | duration}} Down : ({{availabilityStates.down.percentageTime * 100 | number: 3}}%) {{availabilityStates.down.totalTime * 1000 | duration}} Unreachable : ({{availabilityStates.unreachable.percentageTime * 100 | number: 3}}%) {{availabilityStates.unreachable.totalTime * 1000 | duration}} Indeterminate : ({{availabilityStates.nodata.percentageTime * 100 | number: 3}}%) {{availabilityStates.nodata.totalTime * 1000 | duration}} Ok : ({{availabilityStates.ok.percentageTime * 100 | number: 3}}%) {{availabilityStates.ok.totalTime * 1000 | duration}} Warning : ({{availabilityStates.warning.percentageTime * 100 | number: 3}}%) {{availabilityStates.warning.totalTime * 1000 | duration}} Unknown : ({{availabilityStates.unknown.percentageTime * 100 | number: 3}}%) {{availabilityStates.unknown.totalTime * 1000 | duration}} Critical : ({{availabilityStates.critical.percentageTime * 100 | number: 3}}%) {{availabilityStates.critical.totalTime * 1000 | duration}} Indeterminate : ({{availabilityStates.nodata.percentageTime * 100 | number: 3}}%) {{availabilityStates.nodata.totalTime * 1000 | duration}}
    nagios-4.3.4/html/trends-host-yaxis.html000066400000000000000000000015241314764422400202520ustar00rootroot00000000000000 Up Down Unreachable Indeterminate nagios-4.3.4/html/trends-links.html000066400000000000000000000070021314764422400172570ustar00rootroot00000000000000 nagios-4.3.4/html/trends-service-yaxis.html000066400000000000000000000020511314764422400207310ustar00rootroot00000000000000 Ok Warning Unknown Critical Indeterminate nagios-4.3.4/html/trends.html000066400000000000000000000056561314764422400161560ustar00rootroot00000000000000 Nagios Trends
    nagios-4.3.4/include/000077500000000000000000000000001314764422400144345ustar00rootroot00000000000000nagios-4.3.4/include/.gitignore000066400000000000000000000000401314764422400164160ustar00rootroot00000000000000locations.h config.h snprintf.h nagios-4.3.4/include/Makefile000066400000000000000000000002771314764422400161020ustar00rootroot00000000000000############################### # Makefile for Include Files # ############################### clean: rm -f *~ distclean: clean rm -f config.h locations.h snprintf.h devclean: distclean nagios-4.3.4/include/archivejson.h000066400000000000000000000137441314764422400171310ustar00rootroot00000000000000/************************************************************************** * * ARCHIVEJSON.H - Nagios CGI for returning JSON-formatted archive data * * Copyright (c) 2013 Nagios Enterprises, LLC * Last Modified: 04-13-2013 * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *************************************************************************/ #ifndef ARCHIVEJSON_H_INCLUDED #define ARCHIVEJSON_H_INCLUDED /* Structure containing CGI query string options and values */ typedef struct archive_json_cgi_data_struct { /* Format options for JSON output */ unsigned format_options; /* Query being requested */ int query; /* Index of starting object returned for list requests */ int start; /* Number of objects returned for list requests */ int count; /* Type(s) of object to be queried (host and/or service) */ unsigned object_types; /* Type of object to be queried (host and/or service) */ int object_type; /* State types to include in query results */ unsigned state_types; /* Host states to include in query results */ unsigned host_states; /* Service states to include in query results */ unsigned service_states; /* Host notification types to include in query results */ unsigned host_notification_types; /* Service notification types to include in query results */ unsigned service_notification_types; /* strftime format string for time_t values */ char * strftime_format; /* Name of host whose children should be returned if parenthost is specified */ char * parent_host_name; /* Use the parent host field or search all hosts*/ int use_parent_host; /* Host whose children should be returned if use_parent_host is non-zero */ host * parent_host; /* Name of host whose parents should be returned if childhost is specified */ char * child_host_name; /* Use the child host field or search all hosts*/ int use_child_host; /* Host whose parents should be returned if use_child_host is non-zero */ host * child_host; /* Name of host for which details should be returned */ char * host_name; /* Host whose host name is host_name */ host * host; /* Name of hostgroup for which details should be returned */ char * hostgroup_name; /* Hostgroup whose name is hostgroup_name */ hostgroup * hostgroup; /* Name of servicegroup for which details should be returned */ char * servicegroup_name; /* Servicegroup whose name is servicegroup_name */ servicegroup * servicegroup; /* Name of service for which details should be returned */ char * service_description; /* Service whose host name is host_name and whose description is service_description*/ service * service; /* Name of contact for which details should be returned */ char * contact_name; /* Contact whose contact name is contact_name */ contact * contact; /* Name of contactgroup for which details should be returned */ char * contactgroup_name; /* Contactgroup whose name is contactgroup_name */ contactgroup * contactgroup; /* Notification method */ char * notification_method; /* Report timeperiod name */ char * timeperiod_name; /* Timeperiod whose name is timeperiod_name */ timeperiod *timeperiod; /* Assumed initial host state */ int assumed_initial_host_state; /* Assumed initial service state */ int assumed_initial_service_state; /* Assume initial state for host(s) or service(s) */ int assume_initial_state; /* Assume states are retained */ int assume_state_retention; /* Assume states during Nagios downtime */ int assume_states_during_nagios_downtime; /* Start time */ time_t start_time; /* End time */ time_t end_time; /* Number of backtrack archives to read */ int backtracked_archives; } archive_json_cgi_data; /* Object Type Information */ #define ARCHIVE_QUERY_INVALID 0 #define ARCHIVE_QUERY_HELP 1 #define ARCHIVE_QUERY_ALERTCOUNT 2 #define ARCHIVE_QUERY_ALERTLIST 3 #define ARCHIVE_QUERY_NOTIFICATIONCOUNT 4 #define ARCHIVE_QUERY_NOTIFICATIONLIST 5 #define ARCHIVE_QUERY_STATECHANGELIST 6 #define ARCHIVE_QUERY_AVAILABILITY 7 extern json_object *json_archive_alertcount(unsigned, time_t, time_t, int, char *, char *, int, host *, int, host *, hostgroup *, servicegroup *, contact *, contactgroup *, unsigned, unsigned, unsigned, au_log *); extern json_object *json_archive_alertlist(unsigned, int, int, time_t, time_t, int, char *, char *, int, host *, int, host *, hostgroup *, servicegroup *, contact *, contactgroup *, unsigned, unsigned, unsigned, au_log *); extern void json_archive_alert_details(json_object *, unsigned, time_t, au_log_alert *); extern json_object * json_archive_notificationcount(unsigned, time_t, time_t, int, char *, char *, int, host *, int, host *, hostgroup *, servicegroup *, char *, contactgroup *, unsigned, unsigned, char *, au_log *); extern json_object * json_archive_notificationlist(unsigned, int, int, time_t, time_t, int, char *, char *, int, host *, int, host *, hostgroup *, servicegroup *, char *, contactgroup *, unsigned, unsigned, char *, au_log *); extern void json_archive_notification_details(json_object *, unsigned, time_t, au_log_notification *); extern json_object *json_archive_statechangelist(unsigned, int, int, time_t, time_t, int, char *, char *, int, int, unsigned, au_log *); extern json_object *json_archive_availability(unsigned, time_t, time_t, time_t, int, char *, char *, hostgroup *, servicegroup *, timeperiod *, int, int, int, int, int, unsigned, au_log *); #endif nagios-4.3.4/include/archiveutils.h000066400000000000000000000233431314764422400173140ustar00rootroot00000000000000/************************************************************************** * * ARCHIVEUTILS.H - Utility information for Nagios CGI that read archives * * Copyright (c) 2013 Nagios Enterprises, LLC * Last Modified: 06-30-2013 * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *************************************************************************/ #ifndef ARCHIVEUTILS_H_INCLUDED #define ARCHIVEUTILS_H_INCLUDED #include "../include/jsonutils.h" /* Archive utilities object types */ #define AU_OBJTYPE_NONE 0 #define AU_OBJTYPE_HOST (1<<0) #define AU_OBJTYPE_SERVICE (1<<1) #define AU_OBJTYPE_HOSTGROUP (1<<2) #define AU_OBJTYPE_SERVICEGROUP (1<<3) #define AU_OBJTYPE_ALL (AU_OBJTYPE_HOST | AU_OBJTYPE_SERVICE) /* Archive utilities state types */ #define AU_STATETYPE_HARD (1<<0) #define AU_STATETYPE_SOFT (1<<1) #define AU_STATETYPE_NO_DATA (1<<2) #define AU_STATETYPE_ALL (AU_STATETYPE_HARD | AU_STATETYPE_SOFT) /* Archive utilities states */ #define AU_STATE_NO_DATA 0 #define AU_STATE_HOST_UP (1<<0) #define AU_STATE_HOST_DOWN (1<<1) #define AU_STATE_HOST_UNREACHABLE (1<<2) #define AU_STATE_SERVICE_OK (1<<3) #define AU_STATE_SERVICE_WARNING (1<<4) #define AU_STATE_SERVICE_CRITICAL (1<<5) #define AU_STATE_SERVICE_UNKNOWN (1<<6) #define AU_STATE_PROGRAM_START (1<<7) /* Nagios program start */ #define AU_STATE_PROGRAM_END (1<<8) /* Nagios program end */ #define AU_STATE_DOWNTIME_START (1<<9) /* Downtime start */ #define AU_STATE_DOWNTIME_END (1<<10) /* Downtime end */ #define AU_STATE_CURRENT_STATE (1<<11) /* Host or service current state */ #define AU_STATE_HOST_ALL (AU_STATE_HOST_UP | \ AU_STATE_HOST_DOWN | \ AU_STATE_HOST_UNREACHABLE) #define AU_STATE_SERVICE_ALL (AU_STATE_SERVICE_OK | \ AU_STATE_SERVICE_WARNING | \ AU_STATE_SERVICE_CRITICAL | \ AU_STATE_SERVICE_UNKNOWN) #define AU_STATE_ALL (AU_STATE_HOST_ALL | AU_STATE_SERVICE_ALL) /* Archive utilities log types */ #define AU_LOGTYPE_ALERT (1<<0) #define AU_LOGTYPE_STATE_INITIAL (1<<1) #define AU_LOGTYPE_STATE_CURRENT (1<<2) #define AU_LOGTYPE_NOTIFICATION (1<<3) #define AU_LOGTYPE_DOWNTIME (1<<4) #define AU_LOGTYPE_NAGIOS (1<<5) #define AU_LOGTYPE_STATE (AU_LOGTYPE_STATE_INITIAL | \ AU_LOGTYPE_STATE_CURRENT) #define AU_LOGTYPE_ALL (AU_LOGTYPE_ALERT | \ AU_LOGTYPE_STATE | \ AU_LOGTYPE_NOTIFICATION | \ AU_LOGTYPE_DOWNTIME | \ AU_LOGTYPE_NAGIOS) /* Archive utilities notification types */ #define AU_NOTIFICATION_NO_DATA 0 #define AU_NOTIFICATION_HOST_DOWN (1<<0) #define AU_NOTIFICATION_HOST_UNREACHABLE (1<<1) #define AU_NOTIFICATION_HOST_RECOVERY (1<<2) #define AU_NOTIFICATION_HOST_CUSTOM (1<<3) #define AU_NOTIFICATION_HOST_ACK (1<<4) #define AU_NOTIFICATION_HOST_FLAPPING_START (1<<5) #define AU_NOTIFICATION_HOST_FLAPPING_STOP (1<<6) #define AU_NOTIFICATION_SERVICE_CRITICAL (1<<7) #define AU_NOTIFICATION_SERVICE_WARNING (1<<8) #define AU_NOTIFICATION_SERVICE_RECOVERY (1<<9) #define AU_NOTIFICATION_SERVICE_CUSTOM (1<<10) #define AU_NOTIFICATION_SERVICE_ACK (1<<11) #define AU_NOTIFICATION_SERVICE_FLAPPING_START (1<<12) #define AU_NOTIFICATION_SERVICE_FLAPPING_STOP (1<<13) #define AU_NOTIFICATION_SERVICE_UNKNOWN (1<<14) #define AU_NOTIFICATION_HOST_ALL (AU_NOTIFICATION_HOST_DOWN | \ AU_NOTIFICATION_HOST_UNREACHABLE | \ AU_NOTIFICATION_HOST_RECOVERY | \ AU_NOTIFICATION_HOST_CUSTOM | \ AU_NOTIFICATION_HOST_ACK | \ AU_NOTIFICATION_HOST_FLAPPING_START | \ AU_NOTIFICATION_HOST_FLAPPING_STOP) #define AU_NOTIFICATION_SERVICE_ALL (AU_NOTIFICATION_SERVICE_CRITICAL | \ AU_NOTIFICATION_SERVICE_WARNING | \ AU_NOTIFICATION_SERVICE_RECOVERY | \ AU_NOTIFICATION_SERVICE_CUSTOM | \ AU_NOTIFICATION_SERVICE_ACK | \ AU_NOTIFICATION_SERVICE_FLAPPING_START | \ AU_NOTIFICATION_SERVICE_FLAPPING_STOP | \ AU_NOTIFICATION_SERVICE_UNKNOWN) #define AU_NOTFICATION_ALL (AU_NOTFICATION_HOST_ALL | \ AU_NOTIFICATION_SERVICE_ALL) typedef struct au_array_struct { char *label; int size; int count; void **members; int new; } au_array; typedef struct au_node_struct { void *data; struct au_node_struct *next; } au_node; typedef struct au_linked_list_struct { char *label; au_node *head; au_node *last_new; } au_linked_list; struct au_log_entry_struct; /* au_availability keeps the availability information for a given host or service */ typedef struct au_availability_struct { unsigned long time_up; unsigned long time_down; unsigned long time_unreachable; unsigned long time_ok; unsigned long time_warning; unsigned long time_unknown; unsigned long time_critical; unsigned long scheduled_time_up; unsigned long scheduled_time_down; unsigned long scheduled_time_unreachable; unsigned long scheduled_time_ok; unsigned long scheduled_time_warning; unsigned long scheduled_time_unknown; unsigned long scheduled_time_critical; unsigned long scheduled_time_indeterminate; unsigned long time_indeterminate_nodata; unsigned long time_indeterminate_notrunning; } au_availability; /* au_host keeps information about a single host and all log entries that pertain to that host, including global events such as Nagios starts and stops */ typedef struct au_host_struct { char *name; host *hostp; au_linked_list *log_entries; au_availability *availability; } au_host; /* au_service keeps information about a single service and all log entries that pertain to that service, including global events such as Nagios starts and stops */ typedef struct au_service_struct { char *host_name; char *description; service *servicep; au_linked_list *log_entries; au_availability *availability; } au_service; typedef struct au_contact_struct { char *name; contact *contactp; } au_contact; /* au_log_alert keeps information about alert and state type logs */ typedef struct au_log_alert_struct { int obj_type; /* AU_OBJTYPE_HOST or AU_OBJTYPE_SERVICE */ void *object; /* au_host or au_service */ int state_type; /* hard, soft, or no data */ int state; /* any host or service state, or no data */ char *plugin_output; } au_log_alert; /* au_log_notification keeps information about notification logs */ typedef struct au_log_notification_struct { int obj_type; /* AU_OBJTYPE_HOST or AU_OBJTYPE_SERVICE */ void *object; /* au_host or au_service */ au_contact *contact; /* notification contact */ int notification_type; char *method; char *message; /* informational method */ } au_log_notification; /* au_log_downtime keeps information about downtime logs */ typedef struct au_log_downtime_struct { int obj_type; /* AU_OBJTYPE_HOST or AU_OBJTYPE_SERVICE */ void *object; /* au_host or au_service */ int downtime_type; /* AU_STATE_DOWNTIME_START or AU_STATE_DOWNTIME_END */ } au_log_downtime; /* au_log_nagios keeps information about Nagios starts and stops */ typedef struct au_log_nagios_struct { int type; /* AU_STATE_NAGIOS_START or AU_STATE_NAGIOS_STOP */ char *description; } au_log_nagios; /* au_log_entry keeps information about each log entry */ typedef struct au_log_entry_struct { time_t timestamp; int entry_type; /* AU_LOGTYPE_* */ void *entry; /* au_log_alert *, au_log_notification *, au_log_downtime *, or au_log_nagios * */ } au_log_entry; typedef struct au_log_struct { au_array *host_subjects; /* hosts to parse when specified in the query */ au_array *service_subjects; /* services to parse when specified in the query */ au_linked_list *entry_list; /* linked list of log entries */ au_array *hosts; /* list of hosts and their log entries discovered during parsing */ au_array *services; /* list of services and the log entries discovered during parsing */ au_array *contacts; /* list of contacts associated with notification logs */ } au_log; /* External functions */ extern au_log *au_init_log(void); extern int read_archived_data(time_t, time_t, int, unsigned, unsigned, unsigned, au_log *, time_t *); extern int au_cmp_log_entries(const void *, const void *); extern void au_free_log(au_log *); extern au_node *au_list_add_node(au_linked_list *, void *, int(*)(const void *, const void *)); extern int au_add_alert_or_state_log(au_log *, time_t, int, int, void *, int, int, char *); extern au_log_alert *au_create_alert_or_state_log(int, void *, int, int, char *); extern void au_free_alert_log(au_log_alert *); extern au_host *au_add_host(au_array *, char *); extern au_host *au_find_host(au_array *, char *); extern au_service *au_add_service(au_array *, char *, char *); extern au_service *au_find_service(au_array *, char *, char *); extern au_array *au_init_array(char *); extern void au_free_array(au_array *, void(*)(void *)); extern int au_array_append_member(au_array *, void *); /* External variables */ extern const string_value_mapping svm_au_object_types[]; extern const string_value_mapping svm_au_state_types[]; extern const string_value_mapping svm_au_states[]; extern const string_value_mapping svm_au_log_types[]; extern const string_value_mapping svm_au_notification_types[]; #endif nagios-4.3.4/include/broker.h000066400000000000000000000245161314764422400161010ustar00rootroot00000000000000/***************************************************************************** * * BROKER.H - Event broker includes for Nagios * * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #ifndef NAGIOS_BROKER_H_INCLUDED #define NAGIOS_BROKER_H_INCLUDED #include "nagios.h" /*************** EVENT BROKER OPTIONS *****************/ #define BROKER_NOTHING 0 #define BROKER_EVERYTHING 1048575 #define BROKER_PROGRAM_STATE 1 /* DONE */ #define BROKER_TIMED_EVENTS 2 /* DONE */ #define BROKER_SERVICE_CHECKS 4 /* DONE */ #define BROKER_HOST_CHECKS 8 /* DONE */ #define BROKER_EVENT_HANDLERS 16 /* DONE */ #define BROKER_LOGGED_DATA 32 /* DONE */ #define BROKER_NOTIFICATIONS 64 /* DONE */ #define BROKER_FLAPPING_DATA 128 /* DONE */ #define BROKER_COMMENT_DATA 256 /* DONE */ #define BROKER_DOWNTIME_DATA 512 /* DONE */ #define BROKER_SYSTEM_COMMANDS 1024 /* DONE */ #define BROKER_OCP_DATA_UNUSED 2048 /* reusable */ #define BROKER_STATUS_DATA 4096 /* DONE */ #define BROKER_ADAPTIVE_DATA 8192 /* DONE */ #define BROKER_EXTERNALCOMMAND_DATA 16384 /* DONE */ #define BROKER_RETENTION_DATA 32768 /* DONE */ #define BROKER_ACKNOWLEDGEMENT_DATA 65536 #define BROKER_STATECHANGE_DATA 131072 #define BROKER_RESERVED18 262144 #define BROKER_RESERVED19 524288 /****** EVENT TYPES ************************/ #define NEBTYPE_NONE 0 #define NEBTYPE_HELLO 1 #define NEBTYPE_GOODBYE 2 #define NEBTYPE_INFO 3 #define NEBTYPE_PROCESS_START 100 #define NEBTYPE_PROCESS_DAEMONIZE 101 #define NEBTYPE_PROCESS_RESTART 102 #define NEBTYPE_PROCESS_SHUTDOWN 103 #define NEBTYPE_PROCESS_PRELAUNCH 104 /* before objects are read or verified */ #define NEBTYPE_PROCESS_EVENTLOOPSTART 105 #define NEBTYPE_PROCESS_EVENTLOOPEND 106 #define NEBTYPE_TIMEDEVENT_ADD 200 #define NEBTYPE_TIMEDEVENT_REMOVE 201 #define NEBTYPE_TIMEDEVENT_EXECUTE 202 #define NEBTYPE_TIMEDEVENT_DELAY 203 /* NOT IMPLEMENTED */ #define NEBTYPE_TIMEDEVENT_SKIP 204 /* NOT IMPLEMENTED */ #define NEBTYPE_TIMEDEVENT_SLEEP 205 #define NEBTYPE_TIMEDEVENT_END 206 #define NEBTYPE_LOG_DATA 300 #define NEBTYPE_LOG_ROTATION 301 #define NEBTYPE_SYSTEM_COMMAND_START 400 #define NEBTYPE_SYSTEM_COMMAND_END 401 #define NEBTYPE_EVENTHANDLER_START 500 #define NEBTYPE_EVENTHANDLER_END 501 #define NEBTYPE_NOTIFICATION_START 600 #define NEBTYPE_NOTIFICATION_END 601 #define NEBTYPE_CONTACTNOTIFICATION_START 602 #define NEBTYPE_CONTACTNOTIFICATION_END 603 #define NEBTYPE_CONTACTNOTIFICATIONMETHOD_START 604 #define NEBTYPE_CONTACTNOTIFICATIONMETHOD_END 605 #define NEBTYPE_SERVICECHECK_INITIATE 700 #define NEBTYPE_SERVICECHECK_PROCESSED 701 #define NEBTYPE_SERVICECHECK_RAW_START 702 /* NOT IMPLEMENTED */ #define NEBTYPE_SERVICECHECK_RAW_END 703 /* NOT IMPLEMENTED */ #define NEBTYPE_SERVICECHECK_ASYNC_PRECHECK 704 #define NEBTYPE_HOSTCHECK_INITIATE 800 /* a check of the route to the host has been initiated */ #define NEBTYPE_HOSTCHECK_PROCESSED 801 /* the processed/final result of a host check */ #define NEBTYPE_HOSTCHECK_RAW_START 802 /* the start of a "raw" host check */ #define NEBTYPE_HOSTCHECK_RAW_END 803 /* a finished "raw" host check */ #define NEBTYPE_HOSTCHECK_ASYNC_PRECHECK 804 #define NEBTYPE_HOSTCHECK_SYNC_PRECHECK 805 #define NEBTYPE_COMMENT_ADD 900 #define NEBTYPE_COMMENT_DELETE 901 #define NEBTYPE_COMMENT_LOAD 902 #define NEBTYPE_FLAPPING_START 1000 #define NEBTYPE_FLAPPING_STOP 1001 #define NEBTYPE_DOWNTIME_ADD 1100 #define NEBTYPE_DOWNTIME_DELETE 1101 #define NEBTYPE_DOWNTIME_LOAD 1102 #define NEBTYPE_DOWNTIME_START 1103 #define NEBTYPE_DOWNTIME_STOP 1104 #define NEBTYPE_PROGRAMSTATUS_UPDATE 1200 #define NEBTYPE_HOSTSTATUS_UPDATE 1201 #define NEBTYPE_SERVICESTATUS_UPDATE 1202 #define NEBTYPE_CONTACTSTATUS_UPDATE 1203 #define NEBTYPE_ADAPTIVEPROGRAM_UPDATE 1300 #define NEBTYPE_ADAPTIVEHOST_UPDATE 1301 #define NEBTYPE_ADAPTIVESERVICE_UPDATE 1302 #define NEBTYPE_ADAPTIVECONTACT_UPDATE 1303 #define NEBTYPE_EXTERNALCOMMAND_START 1400 #define NEBTYPE_EXTERNALCOMMAND_END 1401 #define NEBTYPE_AGGREGATEDSTATUS_STARTDUMP 1500 #define NEBTYPE_AGGREGATEDSTATUS_ENDDUMP 1501 #define NEBTYPE_RETENTIONDATA_STARTLOAD 1600 #define NEBTYPE_RETENTIONDATA_ENDLOAD 1601 #define NEBTYPE_RETENTIONDATA_STARTSAVE 1602 #define NEBTYPE_RETENTIONDATA_ENDSAVE 1603 #define NEBTYPE_ACKNOWLEDGEMENT_ADD 1700 #define NEBTYPE_ACKNOWLEDGEMENT_REMOVE 1701 /* NOT IMPLEMENTED */ #define NEBTYPE_ACKNOWLEDGEMENT_LOAD 1702 /* NOT IMPLEMENTED */ #define NEBTYPE_STATECHANGE_START 1800 /* NOT IMPLEMENTED */ #define NEBTYPE_STATECHANGE_END 1801 /****** EVENT FLAGS ************************/ #define NEBFLAG_NONE 0 #define NEBFLAG_PROCESS_INITIATED 1 /* event was initiated by Nagios process */ #define NEBFLAG_USER_INITIATED 2 /* event was initiated by a user request */ #define NEBFLAG_MODULE_INITIATED 3 /* event was initiated by an event broker module */ /****** EVENT ATTRIBUTES *******************/ #define NEBATTR_NONE 0 #define NEBATTR_SHUTDOWN_NORMAL 1 #define NEBATTR_SHUTDOWN_ABNORMAL 2 #define NEBATTR_RESTART_NORMAL 4 #define NEBATTR_RESTART_ABNORMAL 8 #define NEBATTR_FLAPPING_STOP_NORMAL 1 #define NEBATTR_FLAPPING_STOP_DISABLED 2 /* flapping stopped because flap detection was disabled */ #define NEBATTR_DOWNTIME_STOP_NORMAL 1 #define NEBATTR_DOWNTIME_STOP_CANCELLED 2 /****** EVENT BROKER FUNCTIONS *************/ #ifdef USE_EVENT_BROKER NAGIOS_BEGIN_DECL struct timeval get_broker_timestamp(struct timeval *); void broker_program_state(int, int, int, struct timeval *); void broker_timed_event(int, int, int, timed_event *, struct timeval *); void broker_log_data(int, int, int, char *, unsigned long, time_t, struct timeval *); int broker_event_handler(int, int, int, int, void *, int, int, struct timeval, struct timeval, double, int, int, int, char *, char *, char *, struct timeval *); void broker_system_command(int, int, int, struct timeval, struct timeval, double, int, int, int, char *, char *, struct timeval *); int broker_host_check(int, int, int, host *, int, int, int, struct timeval, struct timeval, char *, double, double, int, int, int, char *, char *, char *, char *, struct timeval *, check_result *); int broker_service_check(int, int, int, service *, int, struct timeval, struct timeval, char *, double, double, int, int, int, char *, struct timeval *, check_result *); void broker_comment_data(int, int, int, int, int, char *, char *, time_t, char *, char *, int, int, int, time_t, unsigned long, struct timeval *); void broker_downtime_data(int, int, int, int, char *, char *, time_t, char *, char *, time_t, time_t, int, unsigned long, unsigned long, unsigned long, struct timeval *); void broker_flapping_data(int, int, int, int, void *, double, double, double, struct timeval *); void broker_program_status(int, int, int, struct timeval *); void broker_host_status(int, int, int, host *, struct timeval *); void broker_service_status(int, int, int, service *, struct timeval *); void broker_contact_status(int, int, int, contact *, struct timeval *); int broker_notification_data(int, int, int, int, int, struct timeval, struct timeval, void *, char *, char *, int, int, struct timeval *); int broker_contact_notification_data(int, int, int, int, int, struct timeval, struct timeval, void *, contact *, char *, char *, int, struct timeval *); int broker_contact_notification_method_data(int, int, int, int, int, struct timeval, struct timeval, void *, contact *, char *, char *, char *, int, struct timeval *); void broker_adaptive_program_data(int, int, int, int, unsigned long, unsigned long, unsigned long, unsigned long, struct timeval *); void broker_adaptive_host_data(int, int, int, host *, int, unsigned long, unsigned long, struct timeval *); void broker_adaptive_service_data(int, int, int, service *, int, unsigned long, unsigned long, struct timeval *); void broker_adaptive_contact_data(int, int, int, contact *, int, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, struct timeval *); void broker_external_command(int, int, int, int, time_t, char *, char *, struct timeval *); void broker_aggregated_status_data(int, int, int, struct timeval *); void broker_retention_data(int, int, int, struct timeval *); void broker_acknowledgement_data(int, int, int, int, void *, char *, char *, int, int, int, struct timeval *); void broker_statechange_data(int, int, int, int, void *, int, int, int, int, struct timeval *); NAGIOS_END_DECL #endif #endif nagios-4.3.4/include/cgiauth.h000066400000000000000000000044021314764422400162310ustar00rootroot00000000000000/***************************************************************************** * * CGIAUTH.H - Authorization utilities header file * * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #ifndef NAGIOS_CGIAUTH_H_INCLUDED #define NAGIOS_CGIAUTH_H_INCLUDED #include "common.h" #include "objects.h" NAGIOS_BEGIN_DECL typedef struct authdata_struct { char *username; int authorized_for_all_hosts; int authorized_for_all_host_commands; int authorized_for_all_services; int authorized_for_all_service_commands; int authorized_for_system_information; int authorized_for_system_commands; int authorized_for_configuration_information; int authorized_for_read_only; int authenticated; } authdata; int get_authentication_information(authdata *); /* gets current authentication information */ int is_authorized_for_host(host *, authdata *); int is_authorized_for_service(service *, authdata *); int is_authorized_for_all_hosts(authdata *); int is_authorized_for_all_services(authdata *); int is_authorized_for_system_information(authdata *); int is_authorized_for_system_commands(authdata *); int is_authorized_for_host_commands(host *, authdata *); int is_authorized_for_service_commands(service *, authdata *); int is_authorized_for_hostgroup(hostgroup *, authdata *); int is_authorized_for_servicegroup(servicegroup *, authdata *); int is_authorized_for_hostgroup_commands(hostgroup *, authdata *); int is_authorized_for_servicegroup_commands(servicegroup *, authdata *); int is_authorized_for_configuration_information(authdata *); int is_authorized_for_read_only(authdata *); NAGIOS_END_DECL #endif nagios-4.3.4/include/cgiutils.h000066400000000000000000000420521314764422400164330ustar00rootroot00000000000000/************************************************************************ * * CGIUTILS.H - Header file for common CGI functions * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ************************************************************************/ #ifndef NAGIOS_CGIUTILS_H_INCLUDED #define NAGIOS_CGIUTILS_H_INCLUDED #include "lib/libnagios.h" #include "logging.h" #include "objects.h" #include "cgiauth.h" NAGIOS_BEGIN_DECL /**************************** CGI REFRESH RATE ******************************/ #define DEFAULT_REFRESH_RATE 60 /* 60 second refresh rate for CGIs */ /******************************* CGI NAMES **********************************/ #define STATUS_CGI "status.cgi" #ifdef LEGACY_GRAPHICAL_CGIS #define STATUSMAP_CGI "statusmap.cgi" #else #define STATUSMAP_CGI "../map.php" #define LEGACY_STATUSMAP_CGI "statusmap.cgi" #endif #define STATUSWORLD_CGI "statuswrl.cgi" #define COMMAND_CGI "cmd.cgi" #define EXTINFO_CGI "extinfo.cgi" #define SHOWLOG_CGI "showlog.cgi" #define NOTIFICATIONS_CGI "notifications.cgi" #define HISTORY_CGI "history.cgi" #define CONFIG_CGI "config.cgi" #define OUTAGES_CGI "outages.cgi" #ifdef LEGACY_GRAPHICAL_CGIS #define TRENDS_CGI "trends.cgi" #else #define TRENDS_CGI "../trends.html" #define LEGACY_TRENDS_CGI "trends.cgi" #endif #define AVAIL_CGI "avail.cgi" #define TAC_CGI "tac.cgi" #define STATUSWML_CGI "statuswml.cgi" #define TRACEROUTE_CGI "traceroute.cgi" #ifdef LEGACY_GRAPHICAL_CGIS #define HISTOGRAM_CGI "histogram.cgi" #else #define HISTOGRAM_CGI "../histogram.html" #define LEGACY_HISTOGRAM_CGI "histogram.cgi" #endif #define CHECKSANITY_CGI "checksanity.cgi" #define MINISTATUS_CGI "ministatus.cgi" #define SUMMARY_CGI "summary.cgi" /**************************** STYLE SHEET NAMES ******************************/ #define COMMON_CSS "common.css" #define SHOWLOG_CSS "showlog.css" #define STATUS_CSS "status.css" #define STATUSMAP_CSS "statusmap.css" #define COMMAND_CSS "cmd.css" #define EXTINFO_CSS "extinfo.css" #define NOTIFICATIONS_CSS "notifications.css" #define HISTORY_CSS "history.css" #define CONFIG_CSS "config.css" #define OUTAGES_CSS "outages.css" #define TRENDS_CSS "trends.css" #define AVAIL_CSS "avail.css" #define TAC_CSS "tac.css" #define HISTOGRAM_CSS "histogram.css" #define CHECKSANITY_CSS "checksanity.css" #define MINISTATUS_CSS "ministatus.css" #define SUMMARY_CSS "summary.css" #define NAGFUNCS_CSS "nag_funcs.css" /********************************* JAVASCRIPT INCLUDES **********************/ #define JQUERY_JS "jquery-1.7.1.min.js" #define NAGFUNCS_JS "nag_funcs.js" /********************************* ICONS ************************************/ #define STATUS_ICON_WIDTH 20 #define STATUS_ICON_HEIGHT 20 #define INFO_ICON "info.png" #define INFO_ICON_ALT "Informational Message" #define START_ICON "start.gif" #define START_ICON_ALT "Program Start" #define STOP_ICON "stop.gif" #define STOP_ICON_ALT "Program End" #define RESTART_ICON "restart.gif" #define RESTART_ICON_ALT "Program Restart" #define OK_ICON "recovery.png" #define OK_ICON_ALT "Service Ok" #define CRITICAL_ICON "critical.png" #define CRITICAL_ICON_ALT "Service Critical" #define WARNING_ICON "warning.png" #define WARNING_ICON_ALT "Service Warning" #define UNKNOWN_ICON "unknown.png" #define UNKNOWN_ICON_ALT "Service Unknown" #define NOTIFICATION_ICON "notify.gif" #define NOTIFICATION_ICON_ALT "Service Notification" #define LOG_ROTATION_ICON "logrotate.png" #define LOG_ROTATION_ICON_ALT "Log Rotation" #define EXTERNAL_COMMAND_ICON "command.png" #define EXTERNAL_COMMAND_ICON_ALT "External Command" #define STATUS_DETAIL_ICON "status2.gif" #define STATUS_OVERVIEW_ICON "status.gif" #define STATUSMAP_ICON "status3.gif" #define STATUSWORLD_ICON "status4.gif" #define EXTINFO_ICON "extinfo.gif" #define HISTORY_ICON "history.gif" #define CONTACTGROUP_ICON "contactgroup.gif" #define TRENDS_ICON "trends.gif" #define DISABLED_ICON "disabled.gif" #define ENABLED_ICON "enabled.gif" #define PASSIVE_ONLY_ICON "passiveonly.gif" #define NOTIFICATIONS_DISABLED_ICON "ndisabled.gif" #define ACKNOWLEDGEMENT_ICON "ack.gif" #define REMOVE_ACKNOWLEDGEMENT_ICON "noack.gif" #define COMMENT_ICON "comment.gif" #define DELETE_ICON "delete.gif" #define DELAY_ICON "delay.gif" #define DOWNTIME_ICON "downtime.gif" #define PASSIVE_ICON "passiveonly.gif" #define RIGHT_ARROW_ICON "right.gif" #define LEFT_ARROW_ICON "left.gif" #define UP_ARROW_ICON "up.gif" #define DOWN_ARROW_ICON "down.gif" #define FLAPPING_ICON "flapping.gif" #define SCHEDULED_DOWNTIME_ICON "downtime.gif" #define EMPTY_ICON "empty.gif" #define ACTIVE_ICON "active.gif" #define ACTIVE_ICON_ALT "Active Mode" #define STANDBY_ICON "standby.gif" #define STANDBY_ICON_ALT "Standby Mode" #define HOST_DOWN_ICON "critical.png" #define HOST_DOWN_ICON_ALT "Host Down" #define HOST_UNREACHABLE_ICON "critical.png" #define HOST_UNREACHABLE_ICON_ALT "Host Unreachable" #define HOST_UP_ICON "recovery.png" #define HOST_UP_ICON_ALT "Host Up" #define HOST_NOTIFICATION_ICON "notify.gif" #define HOST_NOTIFICATION_ICON_ALT "Host Notification" #define SERVICE_EVENT_ICON "serviceevent.gif" #define SERVICE_EVENT_ICON_ALT "Service Event Handler" #define HOST_EVENT_ICON "hostevent.gif" #define HOST_EVENT_ICON_ALT "Host Event Handler" #define THERM_OK_IMAGE "thermok.png" #define THERM_WARNING_IMAGE "thermwarn.png" #define THERM_CRITICAL_IMAGE "thermcrit.png" #define CONFIGURATION_ICON "config.gif" #define NOTES_ICON "notes.gif" #define ACTION_ICON "action.gif" #define DETAIL_ICON "detail.gif" #define PARENT_TRAVERSAL_ICON "parentup.gif" #define TAC_DISABLED_ICON "tacdisabled.png" #define TAC_ENABLED_ICON "tacenabled.png" #define ZOOM1_ICON "zoom1.gif" #define ZOOM2_ICON "zoom2.gif" #define CONTEXT_HELP_ICON1 "contexthelp1.gif" #define CONTEXT_HELP_ICON2 "contexthelp2.gif" #define SPLUNK_SMALL_WHITE_ICON "splunk1.gif" #define SPLUNK_SMALL_BLACK_ICON "splunk2.gif" #define FIRST_PAGE_ICON "b_first2.png" #define LAST_PAGE_ICON "b_last2.png" #define NEXT_PAGE_ICON "b_next2.png" #define PREVIOUS_PAGE_ICON "b_prev2.png" /********************* EXTENDED INFO CGI DISPLAY TYPES *********************/ #define DISPLAY_PROCESS_INFO 0 #define DISPLAY_HOST_INFO 1 #define DISPLAY_SERVICE_INFO 2 #define DISPLAY_COMMENTS 3 #define DISPLAY_PERFORMANCE 4 #define DISPLAY_HOSTGROUP_INFO 5 #define DISPLAY_DOWNTIME 6 #define DISPLAY_SCHEDULING_QUEUE 7 #define DISPLAY_SERVICEGROUP_INFO 8 /************************ COMMAND CGI COMMAND MODES *************************/ #define CMDMODE_NONE 0 #define CMDMODE_REQUEST 1 #define CMDMODE_COMMIT 2 /******************** HOST AND SERVICE NOTIFICATION TYPES ******************/ #define NOTIFICATION_ALL 0 /* all service and host notifications */ #define NOTIFICATION_SERVICE_ALL 1 /* all types of service notifications */ #define NOTIFICATION_HOST_ALL 2 /* all types of host notifications */ #define NOTIFICATION_SERVICE_WARNING 4 #define NOTIFICATION_SERVICE_UNKNOWN 8 #define NOTIFICATION_SERVICE_CRITICAL 16 #define NOTIFICATION_SERVICE_RECOVERY 32 #define NOTIFICATION_HOST_DOWN 64 #define NOTIFICATION_HOST_UNREACHABLE 128 #define NOTIFICATION_HOST_RECOVERY 256 #define NOTIFICATION_SERVICE_ACK 512 #define NOTIFICATION_HOST_ACK 1024 #define NOTIFICATION_SERVICE_FLAP 2048 #define NOTIFICATION_HOST_FLAP 4096 #define NOTIFICATION_SERVICE_CUSTOM 8192 #define NOTIFICATION_HOST_CUSTOM 16384 #define NOTIFICATION_SERVICE_DOWNTIME 32768 #define NOTIFICATION_HOST_DOWNTIME 65536 /********************** HOST AND SERVICE ALERT TYPES **********************/ #define HISTORY_ALL 0 /* all service and host alert */ #define HISTORY_SERVICE_ALL 1 /* all types of service alerts */ #define HISTORY_HOST_ALL 2 /* all types of host alerts */ #define HISTORY_SERVICE_WARNING 4 #define HISTORY_SERVICE_UNKNOWN 8 #define HISTORY_SERVICE_CRITICAL 16 #define HISTORY_SERVICE_RECOVERY 32 #define HISTORY_HOST_DOWN 64 #define HISTORY_HOST_UNREACHABLE 128 #define HISTORY_HOST_RECOVERY 256 /****************************** SORT TYPES *******************************/ #define SORT_NONE 0 #define SORT_ASCENDING 1 #define SORT_DESCENDING 2 /***************************** SORT OPTIONS ******************************/ #define SORT_NOTHING 0 #define SORT_HOSTNAME 1 #define SORT_SERVICENAME 2 #define SORT_SERVICESTATUS 3 #define SORT_LASTCHECKTIME 4 #define SORT_CURRENTATTEMPT 5 #define SORT_STATEDURATION 6 #define SORT_NEXTCHECKTIME 7 #define SORT_HOSTSTATUS 8 #define SORT_HOSTURGENCY 9 /****************** HOST AND SERVICE FILTER PROPERTIES *******************/ #define HOST_SCHEDULED_DOWNTIME 1 #define HOST_NO_SCHEDULED_DOWNTIME 2 #define HOST_STATE_ACKNOWLEDGED 4 #define HOST_STATE_UNACKNOWLEDGED 8 #define HOST_CHECKS_DISABLED 16 #define HOST_CHECKS_ENABLED 32 #define HOST_EVENT_HANDLER_DISABLED 64 #define HOST_EVENT_HANDLER_ENABLED 128 #define HOST_FLAP_DETECTION_DISABLED 256 #define HOST_FLAP_DETECTION_ENABLED 512 #define HOST_IS_FLAPPING 1024 #define HOST_IS_NOT_FLAPPING 2048 #define HOST_NOTIFICATIONS_DISABLED 4096 #define HOST_NOTIFICATIONS_ENABLED 8192 #define HOST_PASSIVE_CHECKS_DISABLED 16384 #define HOST_PASSIVE_CHECKS_ENABLED 32768 #define HOST_PASSIVE_CHECK 65536 #define HOST_ACTIVE_CHECK 131072 #define HOST_HARD_STATE 262144 #define HOST_SOFT_STATE 524288 #define SERVICE_SCHEDULED_DOWNTIME 1 #define SERVICE_NO_SCHEDULED_DOWNTIME 2 #define SERVICE_STATE_ACKNOWLEDGED 4 #define SERVICE_STATE_UNACKNOWLEDGED 8 #define SERVICE_CHECKS_DISABLED 16 #define SERVICE_CHECKS_ENABLED 32 #define SERVICE_EVENT_HANDLER_DISABLED 64 #define SERVICE_EVENT_HANDLER_ENABLED 128 #define SERVICE_FLAP_DETECTION_ENABLED 256 #define SERVICE_FLAP_DETECTION_DISABLED 512 #define SERVICE_IS_FLAPPING 1024 #define SERVICE_IS_NOT_FLAPPING 2048 #define SERVICE_NOTIFICATIONS_DISABLED 4096 #define SERVICE_NOTIFICATIONS_ENABLED 8192 #define SERVICE_PASSIVE_CHECKS_DISABLED 16384 #define SERVICE_PASSIVE_CHECKS_ENABLED 32768 #define SERVICE_PASSIVE_CHECK 65536 #define SERVICE_ACTIVE_CHECK 131072 #define SERVICE_HARD_STATE 262144 #define SERVICE_SOFT_STATE 524288 /****************************** SSI TYPES ********************************/ #define SSI_HEADER 0 #define SSI_FOOTER 1 /************************ CONTEXT-SENSITIVE HELP *************************/ #define CONTEXTHELP_STATUS_DETAIL "A1" #define CONTEXTHELP_STATUS_HGOVERVIEW "A2" #define CONTEXTHELP_STATUS_HGSUMMARY "A3" #define CONTEXTHELP_STATUS_HGGRID "A4" #define CONTEXTHELP_STATUS_SVCPROBLEMS "A5" #define CONTEXTHELP_STATUS_HOST_DETAIL "A6" #define CONTEXTHELP_STATUS_HOSTPROBLEMS "A7" #define CONTEXTHELP_STATUS_SGOVERVIEW "A8" #define CONTEXTHELP_STATUS_SGSUMMARY "A9" #define CONTEXTHELP_STATUS_SGGRID "A10" #define CONTEXTHELP_TAC "B1" #define CONTEXTHELP_MAP "C1" #define CONTEXTHELP_LOG "D1" #define CONTEXTHELP_HISTORY "E1" #define CONTEXTHELP_NOTIFICATIONS "F1" #define CONTEXTHELP_TRENDS_MENU1 "G1" #define CONTEXTHELP_TRENDS_MENU2 "G2" #define CONTEXTHELP_TRENDS_MENU3 "G3" #define CONTEXTHELP_TRENDS_MENU4 "G4" #define CONTEXTHELP_TRENDS_HOST "G5" #define CONTEXTHELP_TRENDS_SERVICE "G6" #define CONTEXTHELP_AVAIL_MENU1 "H1" #define CONTEXTHELP_AVAIL_MENU2 "H2" #define CONTEXTHELP_AVAIL_MENU3 "H3" #define CONTEXTHELP_AVAIL_MENU4 "H4" #define CONTEXTHELP_AVAIL_MENU5 "H5" #define CONTEXTHELP_AVAIL_HOSTGROUP "H6" #define CONTEXTHELP_AVAIL_HOST "H7" #define CONTEXTHELP_AVAIL_SERVICE "H8" #define CONTEXTHELP_AVAIL_SERVICEGROUP "H9" #define CONTEXTHELP_EXT_HOST "I1" #define CONTEXTHELP_EXT_SERVICE "I2" #define CONTEXTHELP_EXT_HOSTGROUP "I3" #define CONTEXTHELP_EXT_PROCESS "I4" #define CONTEXTHELP_EXT_PERFORMANCE "I5" #define CONTEXTHELP_EXT_COMMENTS "I6" #define CONTEXTHELP_EXT_DOWNTIME "I7" #define CONTEXTHELP_EXT_QUEUE "I8" #define CONTEXTHELP_EXT_SERVICEGROUP "I9" #define CONTEXTHELP_CMD_INPUT "J1" #define CONTEXTHELP_CMD_COMMIT "J2" #define CONTEXTHELP_OUTAGES "K1" #define CONTEXTHELP_CONFIG_MENU "L1" #define CONTEXTHELP_CONFIG_HOSTS "L2" #define CONTEXTHELP_CONFIG_HOSTDEPENDENCIES "L3" #define CONTEXTHELP_CONFIG_HOSTESCALATIONS "L4" #define CONTEXTHELP_CONFIG_HOSTGROUPS "L5" #define CONTEXTHELP_CONFIG_HOSTGROUPESCALATIONS "L6" #define CONTEXTHELP_CONFIG_SERVICES "L7" #define CONTEXTHELP_CONFIG_SERVICEDEPENDENCIES "L8" #define CONTEXTHELP_CONFIG_SERVICEESCALATIONS "L9" #define CONTEXTHELP_CONFIG_CONTACTS "L10" #define CONTEXTHELP_CONFIG_CONTACTGROUPS "L11" #define CONTEXTHELP_CONFIG_TIMEPERIODS "L12" #define CONTEXTHELP_CONFIG_COMMANDS "L13" #define CONTEXTHELP_CONFIG_HOSTEXTINFO "L14" #define CONTEXTHELP_CONFIG_SERVICEEXTINFO "L15" #define CONTEXTHELP_CONFIG_SERVICEGROUPS "L16" #define CONTEXTHELP_HISTOGRAM_MENU1 "M1" #define CONTEXTHELP_HISTOGRAM_MENU2 "M2" #define CONTEXTHELP_HISTOGRAM_MENU3 "M3" #define CONTEXTHELP_HISTOGRAM_MENU4 "M4" #define CONTEXTHELP_HISTOGRAM_HOST "M5" #define CONTEXTHELP_HISTOGRAM_SERVICE "M6" #define CONTEXTHELP_SUMMARY_MENU "N1" #define CONTEXTHELP_SUMMARY_RECENT_ALERTS "N2" #define CONTEXTHELP_SUMMARY_ALERT_TOTALS "N3" #define CONTEXTHELP_SUMMARY_HOSTGROUP_ALERT_TOTALS "N4" #define CONTEXTHELP_SUMMARY_HOST_ALERT_TOTALS "N5" #define CONTEXTHELP_SUMMARY_SERVICE_ALERT_TOTALS "N6" #define CONTEXTHELP_SUMMARY_ALERT_PRODUCERS "N7" #define CONTEXTHELP_SUMMARY_SERVICEGROUP_ALERT_TOTALS "N8" /************************** LIFO RETURN CODES ****************************/ #define LIFO_OK 0 #define LIFO_ERROR_MEMORY 1 #define LIFO_ERROR_FILE 2 #define LIFO_ERROR_DATA 3 /*************************** DATA STRUCTURES *****************************/ /* LIFO data structure */ typedef struct lifo_struct { char *data; struct lifo_struct *next; } lifo; /******************************** FUNCTIONS *******************************/ void reset_cgi_vars(void); void cgi_init(void (*doc_header)(int), void (*doc_footer)(void), int object_options, int status_options); void free_memory(void); const char *get_cgi_config_location(void); /* gets location of the CGI config file to read */ const char *get_cmd_file_location(void); /* gets location of external command file to write to */ int read_cgi_config_file(const char *); int read_main_config_file(const char *); int read_all_object_configuration_data(const char *, int); int read_all_status_data(const char *, int); char *unescape_newlines(char *); void sanitize_plugin_output(char *); /* strips HTML and bad characters from plugin output */ void strip_html_brackets(char *); /* strips > and < from string */ void get_time_string(time_t *, char *, int, int); /* gets a date/time string */ void get_interval_time_string(double, char *, int); /* gets a time string for an interval of time */ const char *url_encode(const char *); /* encodes a string in proper URL format */ char *html_encode(char *, int); /* encodes a string in HTML format (for what the user sees) */ char *escape_string(const char *); /* escape string for html form usage */ void get_log_archive_to_use(int, char *, int); /* determines the name of the log archive to use */ void determine_log_rotation_times(int); int determine_archive_to_use_from_time(time_t); void print_extra_hostgroup_url(char *, char *); void print_extra_servicegroup_url(char *, char *); void display_info_table(const char *, int, authdata *); void display_nav_table(char *, int); void display_splunk_host_url(host *); void display_splunk_service_url(service *); void display_splunk_generic_url(char *, int); void strip_splunk_query_terms(char *); void include_ssi_files(const char *, int); /* include user-defined SSI footers/headers */ void include_ssi_file(const char *); /* include user-defined SSI footer/header */ void cgi_config_file_error(const char *); void main_config_file_error(const char *); void object_data_error(void); void status_data_error(void); void display_context_help(const char *); /* displays context-sensitive help window */ int read_file_into_lifo(char *); /* LIFO functions */ void free_lifo_memory(void); int push_lifo(char *); char *pop_lifo(void); NAGIOS_END_DECL #endif nagios-4.3.4/include/comments.h000066400000000000000000000120601314764422400164310ustar00rootroot00000000000000/***************************************************************************** * * COMMENTS.H - Header file for comment functions * * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #ifndef NAGIOS_COMMENTS_H_INCLUDED #define NAGIOS_COMMENTS_H_INCLUDED #include "common.h" #include "objects.h" /**************************** COMMENT SOURCES ******************************/ #define COMMENTSOURCE_INTERNAL 0 #define COMMENTSOURCE_EXTERNAL 1 /***************************** COMMENT TYPES *******************************/ #define HOST_COMMENT 1 #define SERVICE_COMMENT 2 /****************************** ENTRY TYPES ********************************/ #define USER_COMMENT 1 #define DOWNTIME_COMMENT 2 #define FLAPPING_COMMENT 3 #define ACKNOWLEDGEMENT_COMMENT 4 /*************************** CHAINED HASH LIMITS ***************************/ #define COMMENT_HASHSLOTS 1024 /**************************** DATA STRUCTURES ******************************/ NAGIOS_BEGIN_DECL /* COMMENT structure */ typedef struct nagios_comment { int comment_type; int entry_type; unsigned long comment_id; int source; int persistent; time_t entry_time; int expires; time_t expire_time; char *host_name; char *service_description; char *author; char *comment_data; struct nagios_comment *next; struct nagios_comment *nexthash; } nagios_comment; extern struct nagios_comment *comment_list; #ifndef NSCGI int initialize_comment_data(void); /* initializes comment data */ int add_new_comment(int, int, char *, char *, time_t, char *, char *, int, int, int, time_t, unsigned long *); /* adds a new host or service comment */ int add_new_host_comment(int, char *, time_t, char *, char *, int, int, int, time_t, unsigned long *); /* adds a new host comment */ int add_new_service_comment(int, char *, char *, time_t, char *, char *, int, int, int, time_t, unsigned long *); /* adds a new service comment */ int delete_comment(int, unsigned long); /* deletes a host or service comment */ int delete_host_comment(unsigned long); /* deletes a host comment */ int delete_service_comment(unsigned long); /* deletes a service comment */ int delete_all_comments(int, char *, char *); /* deletes all comments for a particular host or service */ int delete_all_host_comments(char *); /* deletes all comments for a specific host */ int delete_host_acknowledgement_comments(struct host *); /* deletes all non-persistent ack comments for a specific host */ int delete_all_service_comments(char *, char *); /* deletes all comments for a specific service */ int delete_service_acknowledgement_comments(struct service *); /* deletes all non-persistent ack comments for a specific service */ int check_for_expired_comment(unsigned long); /* expires a comment */ #endif struct nagios_comment *find_comment(unsigned long, int); /* finds a specific comment */ struct nagios_comment *find_service_comment(unsigned long); /* finds a specific service comment */ struct nagios_comment *find_host_comment(unsigned long); /* finds a specific host comment */ struct nagios_comment *get_first_comment_by_host(char *); struct nagios_comment *get_next_comment_by_host(char *, struct nagios_comment *); int number_of_host_comments(char *); /* returns the number of comments associated with a particular host */ int number_of_service_comments(char *, char *); /* returns the number of comments associated with a particular service */ int add_comment(int, int, char *, char *, time_t, char *, char *, unsigned long, int, int, time_t, int); /* adds a comment (host or service) */ int sort_comments(void); int add_host_comment(int, char *, time_t, char *, char *, unsigned long, int, int, time_t, int); /* adds a host comment */ int add_service_comment(int, char *, char *, time_t, char *, char *, unsigned long, int, int, time_t, int); /* adds a service comment */ int add_comment_to_hashlist(struct nagios_comment *); void free_comment_data(void); /* frees memory allocated to the comment list */ NAGIOS_BEGIN_DECL #endif nagios-4.3.4/include/common.h000066400000000000000000000460701314764422400161040ustar00rootroot00000000000000/************************************************************************ * * Nagios Common Header File * Written By: Ethan Galstad (egalstad@nagios.org) * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ************************************************************************/ #ifndef NAGIOS_COMMON_H_INCLUDED #define NAGIOS_COMMON_H_INCLUDED #include "shared.h" #define PROGRAM_VERSION "4.3.4" #define PROGRAM_MODIFICATION_DATE "2017-08-24" NAGIOS_BEGIN_DECL /*************************************************************/ /************** SHARED GLOBAL VARIABLES **********************/ /*************************************************************/ extern int date_format; extern int interval_length; extern char *illegal_output_chars; extern char illegal_output_char_map[256]; extern int log_rotation_method; extern int check_external_commands; /* set this if you're going to add a ton of comments at once */ extern int defer_comment_sorting; extern unsigned long next_downtime_id; extern char *object_cache_file; extern char *status_file; extern time_t program_start; extern int nagios_pid; extern int daemon_mode; extern time_t last_log_rotation; extern int process_performance_data; extern int enable_flap_detection; extern int enable_notifications; extern int execute_service_checks; extern int accept_passive_service_checks; extern int execute_host_checks; extern int accept_passive_host_checks; extern int enable_event_handlers; extern int obsess_over_services; extern int obsess_over_hosts; extern int enable_timing_point; extern char *config_file_dir; extern char *website_url; #ifdef HAVE_TZNAME #ifdef CYGWIN extern char *_tzname[2] __declspec(dllimport); #else extern char *tzname[2]; #endif #endif NAGIOS_END_DECL /* Experimental performance tweaks - use with caution */ #undef USE_MEMORY_PERFORMANCE_TWEAKS /****************** OBJECT STATES ********************/ #define STATE_OK 0 #define STATE_WARNING 1 #define STATE_CRITICAL 2 #define STATE_UNKNOWN 3 #define STATE_UP 0 #define STATE_DOWN 1 #define STATE_UNREACHABLE 2 /* for legacy reasons */ #define HOST_UP STATE_UP #define HOST_DOWN STATE_DOWN #define HOST_UNREACHABLE STATE_UNREACHABLE /***************************** COMMANDS *********************************/ #define CMD_NONE 0 #define CMD_ADD_HOST_COMMENT 1 #define CMD_DEL_HOST_COMMENT 2 #define CMD_ADD_SVC_COMMENT 3 #define CMD_DEL_SVC_COMMENT 4 #define CMD_ENABLE_SVC_CHECK 5 #define CMD_DISABLE_SVC_CHECK 6 #define CMD_SCHEDULE_SVC_CHECK 7 #define CMD_DELAY_SVC_NOTIFICATION 9 #define CMD_DELAY_HOST_NOTIFICATION 10 #define CMD_DISABLE_NOTIFICATIONS 11 #define CMD_ENABLE_NOTIFICATIONS 12 #define CMD_RESTART_PROCESS 13 #define CMD_SHUTDOWN_PROCESS 14 #define CMD_ENABLE_HOST_SVC_CHECKS 15 #define CMD_DISABLE_HOST_SVC_CHECKS 16 #define CMD_SCHEDULE_HOST_SVC_CHECKS 17 #define CMD_DELAY_HOST_SVC_NOTIFICATIONS 19 /* currently unimplemented */ #define CMD_DEL_ALL_HOST_COMMENTS 20 #define CMD_DEL_ALL_SVC_COMMENTS 21 #define CMD_ENABLE_SVC_NOTIFICATIONS 22 #define CMD_DISABLE_SVC_NOTIFICATIONS 23 #define CMD_ENABLE_HOST_NOTIFICATIONS 24 #define CMD_DISABLE_HOST_NOTIFICATIONS 25 #define CMD_ENABLE_ALL_NOTIFICATIONS_BEYOND_HOST 26 #define CMD_DISABLE_ALL_NOTIFICATIONS_BEYOND_HOST 27 #define CMD_ENABLE_HOST_SVC_NOTIFICATIONS 28 #define CMD_DISABLE_HOST_SVC_NOTIFICATIONS 29 #define CMD_PROCESS_SERVICE_CHECK_RESULT 30 #define CMD_SAVE_STATE_INFORMATION 31 #define CMD_READ_STATE_INFORMATION 32 #define CMD_ACKNOWLEDGE_HOST_PROBLEM 33 #define CMD_ACKNOWLEDGE_SVC_PROBLEM 34 #define CMD_START_EXECUTING_SVC_CHECKS 35 #define CMD_STOP_EXECUTING_SVC_CHECKS 36 #define CMD_START_ACCEPTING_PASSIVE_SVC_CHECKS 37 #define CMD_STOP_ACCEPTING_PASSIVE_SVC_CHECKS 38 #define CMD_ENABLE_PASSIVE_SVC_CHECKS 39 #define CMD_DISABLE_PASSIVE_SVC_CHECKS 40 #define CMD_ENABLE_EVENT_HANDLERS 41 #define CMD_DISABLE_EVENT_HANDLERS 42 #define CMD_ENABLE_HOST_EVENT_HANDLER 43 #define CMD_DISABLE_HOST_EVENT_HANDLER 44 #define CMD_ENABLE_SVC_EVENT_HANDLER 45 #define CMD_DISABLE_SVC_EVENT_HANDLER 46 #define CMD_ENABLE_HOST_CHECK 47 #define CMD_DISABLE_HOST_CHECK 48 #define CMD_START_OBSESSING_OVER_SVC_CHECKS 49 #define CMD_STOP_OBSESSING_OVER_SVC_CHECKS 50 #define CMD_REMOVE_HOST_ACKNOWLEDGEMENT 51 #define CMD_REMOVE_SVC_ACKNOWLEDGEMENT 52 #define CMD_SCHEDULE_FORCED_HOST_SVC_CHECKS 53 #define CMD_SCHEDULE_FORCED_SVC_CHECK 54 #define CMD_SCHEDULE_HOST_DOWNTIME 55 #define CMD_SCHEDULE_SVC_DOWNTIME 56 #define CMD_ENABLE_HOST_FLAP_DETECTION 57 #define CMD_DISABLE_HOST_FLAP_DETECTION 58 #define CMD_ENABLE_SVC_FLAP_DETECTION 59 #define CMD_DISABLE_SVC_FLAP_DETECTION 60 #define CMD_ENABLE_FLAP_DETECTION 61 #define CMD_DISABLE_FLAP_DETECTION 62 #define CMD_ENABLE_HOSTGROUP_SVC_NOTIFICATIONS 63 #define CMD_DISABLE_HOSTGROUP_SVC_NOTIFICATIONS 64 #define CMD_ENABLE_HOSTGROUP_HOST_NOTIFICATIONS 65 #define CMD_DISABLE_HOSTGROUP_HOST_NOTIFICATIONS 66 #define CMD_ENABLE_HOSTGROUP_SVC_CHECKS 67 #define CMD_DISABLE_HOSTGROUP_SVC_CHECKS 68 /* commands 69-77 are unimplemented */ #define CMD_UNIMPLEMENTED_69 69 #define CMD_UNIMPLEMENTED_70 70 #define CMD_UNIMPLEMENTED_71 71 #define CMD_UNIMPLEMENTED_72 72 #define CMD_UNIMPLEMENTED_73 73 #define CMD_UNIMPLEMENTED_74 74 #define CMD_UNIMPLEMENTED_75 75 #define CMD_UNIMPLEMENTED_76 76 #define CMD_UNIMPLEMENTED_77 77 #define CMD_DEL_HOST_DOWNTIME 78 #define CMD_DEL_SVC_DOWNTIME 79 #define CMD_ENABLE_PERFORMANCE_DATA 82 #define CMD_DISABLE_PERFORMANCE_DATA 83 #define CMD_SCHEDULE_HOSTGROUP_HOST_DOWNTIME 84 #define CMD_SCHEDULE_HOSTGROUP_SVC_DOWNTIME 85 #define CMD_SCHEDULE_HOST_SVC_DOWNTIME 86 /* new commands in Nagios 2.x found below... */ #define CMD_PROCESS_HOST_CHECK_RESULT 87 #define CMD_START_EXECUTING_HOST_CHECKS 88 #define CMD_STOP_EXECUTING_HOST_CHECKS 89 #define CMD_START_ACCEPTING_PASSIVE_HOST_CHECKS 90 #define CMD_STOP_ACCEPTING_PASSIVE_HOST_CHECKS 91 #define CMD_ENABLE_PASSIVE_HOST_CHECKS 92 #define CMD_DISABLE_PASSIVE_HOST_CHECKS 93 #define CMD_START_OBSESSING_OVER_HOST_CHECKS 94 #define CMD_STOP_OBSESSING_OVER_HOST_CHECKS 95 #define CMD_SCHEDULE_HOST_CHECK 96 #define CMD_SCHEDULE_FORCED_HOST_CHECK 98 #define CMD_START_OBSESSING_OVER_SVC 99 #define CMD_STOP_OBSESSING_OVER_SVC 100 #define CMD_START_OBSESSING_OVER_HOST 101 #define CMD_STOP_OBSESSING_OVER_HOST 102 #define CMD_ENABLE_HOSTGROUP_HOST_CHECKS 103 #define CMD_DISABLE_HOSTGROUP_HOST_CHECKS 104 #define CMD_ENABLE_HOSTGROUP_PASSIVE_SVC_CHECKS 105 #define CMD_DISABLE_HOSTGROUP_PASSIVE_SVC_CHECKS 106 #define CMD_ENABLE_HOSTGROUP_PASSIVE_HOST_CHECKS 107 #define CMD_DISABLE_HOSTGROUP_PASSIVE_HOST_CHECKS 108 #define CMD_ENABLE_SERVICEGROUP_SVC_NOTIFICATIONS 109 #define CMD_DISABLE_SERVICEGROUP_SVC_NOTIFICATIONS 110 #define CMD_ENABLE_SERVICEGROUP_HOST_NOTIFICATIONS 111 #define CMD_DISABLE_SERVICEGROUP_HOST_NOTIFICATIONS 112 #define CMD_ENABLE_SERVICEGROUP_SVC_CHECKS 113 #define CMD_DISABLE_SERVICEGROUP_SVC_CHECKS 114 #define CMD_ENABLE_SERVICEGROUP_HOST_CHECKS 115 #define CMD_DISABLE_SERVICEGROUP_HOST_CHECKS 116 #define CMD_ENABLE_SERVICEGROUP_PASSIVE_SVC_CHECKS 117 #define CMD_DISABLE_SERVICEGROUP_PASSIVE_SVC_CHECKS 118 #define CMD_ENABLE_SERVICEGROUP_PASSIVE_HOST_CHECKS 119 #define CMD_DISABLE_SERVICEGROUP_PASSIVE_HOST_CHECKS 120 #define CMD_SCHEDULE_SERVICEGROUP_HOST_DOWNTIME 121 #define CMD_SCHEDULE_SERVICEGROUP_SVC_DOWNTIME 122 #define CMD_CHANGE_GLOBAL_HOST_EVENT_HANDLER 123 #define CMD_CHANGE_GLOBAL_SVC_EVENT_HANDLER 124 #define CMD_CHANGE_HOST_EVENT_HANDLER 125 #define CMD_CHANGE_SVC_EVENT_HANDLER 126 #define CMD_CHANGE_HOST_CHECK_COMMAND 127 #define CMD_CHANGE_SVC_CHECK_COMMAND 128 #define CMD_CHANGE_NORMAL_HOST_CHECK_INTERVAL 129 #define CMD_CHANGE_NORMAL_SVC_CHECK_INTERVAL 130 #define CMD_CHANGE_RETRY_SVC_CHECK_INTERVAL 131 #define CMD_CHANGE_MAX_HOST_CHECK_ATTEMPTS 132 #define CMD_CHANGE_MAX_SVC_CHECK_ATTEMPTS 133 #define CMD_SCHEDULE_AND_PROPAGATE_TRIGGERED_HOST_DOWNTIME 134 #define CMD_ENABLE_HOST_AND_CHILD_NOTIFICATIONS 135 #define CMD_DISABLE_HOST_AND_CHILD_NOTIFICATIONS 136 #define CMD_SCHEDULE_AND_PROPAGATE_HOST_DOWNTIME 137 #define CMD_ENABLE_SERVICE_FRESHNESS_CHECKS 138 #define CMD_DISABLE_SERVICE_FRESHNESS_CHECKS 139 #define CMD_ENABLE_HOST_FRESHNESS_CHECKS 140 #define CMD_DISABLE_HOST_FRESHNESS_CHECKS 141 #define CMD_SET_HOST_NOTIFICATION_NUMBER 142 #define CMD_SET_SVC_NOTIFICATION_NUMBER 143 /* new commands in Nagios 3.x found below... */ #define CMD_CHANGE_HOST_CHECK_TIMEPERIOD 144 #define CMD_CHANGE_SVC_CHECK_TIMEPERIOD 145 #define CMD_PROCESS_FILE 146 #define CMD_CHANGE_CUSTOM_HOST_VAR 147 #define CMD_CHANGE_CUSTOM_SVC_VAR 148 #define CMD_CHANGE_CUSTOM_CONTACT_VAR 149 #define CMD_ENABLE_CONTACT_HOST_NOTIFICATIONS 150 #define CMD_DISABLE_CONTACT_HOST_NOTIFICATIONS 151 #define CMD_ENABLE_CONTACT_SVC_NOTIFICATIONS 152 #define CMD_DISABLE_CONTACT_SVC_NOTIFICATIONS 153 #define CMD_ENABLE_CONTACTGROUP_HOST_NOTIFICATIONS 154 #define CMD_DISABLE_CONTACTGROUP_HOST_NOTIFICATIONS 155 #define CMD_ENABLE_CONTACTGROUP_SVC_NOTIFICATIONS 156 #define CMD_DISABLE_CONTACTGROUP_SVC_NOTIFICATIONS 157 #define CMD_CHANGE_RETRY_HOST_CHECK_INTERVAL 158 #define CMD_SEND_CUSTOM_HOST_NOTIFICATION 159 #define CMD_SEND_CUSTOM_SVC_NOTIFICATION 160 #define CMD_CHANGE_HOST_NOTIFICATION_TIMEPERIOD 161 #define CMD_CHANGE_SVC_NOTIFICATION_TIMEPERIOD 162 #define CMD_CHANGE_CONTACT_HOST_NOTIFICATION_TIMEPERIOD 163 #define CMD_CHANGE_CONTACT_SVC_NOTIFICATION_TIMEPERIOD 164 #define CMD_CHANGE_HOST_MODATTR 165 #define CMD_CHANGE_SVC_MODATTR 166 #define CMD_CHANGE_CONTACT_MODATTR 167 #define CMD_CHANGE_CONTACT_MODHATTR 168 #define CMD_CHANGE_CONTACT_MODSATTR 169 #define CMD_DEL_DOWNTIME_BY_HOST_NAME 170 #define CMD_DEL_DOWNTIME_BY_HOSTGROUP_NAME 171 #define CMD_DEL_DOWNTIME_BY_START_TIME_COMMENT 172 /* new commands in Nagios 4.x found below... */ #define CMD_CLEAR_HOST_FLAPPING_STATE 173 #define CMD_CLEAR_SVC_FLAPPING_STATE 174 /* custom command introduced in Nagios 3.x */ #define CMD_CUSTOM_COMMAND 999 /**************************** COMMAND ERRORS *****************************/ #define CMD_ERROR_OK 0 /* No errors encountered */ #define CMD_ERROR_UNKNOWN_COMMAND 1 /* Unknown/unsupported command */ #define CMD_ERROR_MALFORMED_COMMAND 2 /* Command malformed/missing timestamp? */ #define CMD_ERROR_INTERNAL_ERROR 3 /* Internal error */ #define CMD_ERROR_FAILURE 4 /* Command routine failed */ extern const char *cmd_error_strerror(int error_code); /**************************** CHECK TYPES ********************************/ #define CHECK_TYPE_ACTIVE 0 #define CHECK_TYPE_PASSIVE 1 #define CHECK_TYPE_PARENT 2 /* (active) check for the benefit of dependent objects */ #define CHECK_TYPE_FILE 3 /* from spool files (yuck) */ #define CHECK_TYPE_OTHER 4 /* for modules to use */ /************* LEGACY (deprecated) CHECK TYPES ***************************/ #define SERVICE_CHECK_ACTIVE CHECK_TYPE_ACTIVE #define SERVICE_CHECK_PASSIVE CHECK_TYPE_PASSIVE #define HOST_CHECK_ACTIVE CHECK_TYPE_ACTIVE #define HOST_CHECK_PASSIVE CHECK_TYPE_PASSIVE /************************ SERVICE STATE TYPES ****************************/ #define SOFT_STATE 0 #define HARD_STATE 1 /************************* SCHEDULED DOWNTIME TYPES **********************/ #define SERVICE_DOWNTIME 1 /* service downtime */ #define HOST_DOWNTIME 2 /* host downtime */ #define ANY_DOWNTIME 3 /* host or service downtime */ /************************** NOTIFICATION OPTIONS *************************/ #define NOTIFICATION_OPTION_NONE 0 #define NOTIFICATION_OPTION_BROADCAST 1 #define NOTIFICATION_OPTION_FORCED 2 #define NOTIFICATION_OPTION_INCREMENT 4 /************************** ACKNOWLEDGEMENT TYPES ************************/ #define HOST_ACKNOWLEDGEMENT 0 #define SERVICE_ACKNOWLEDGEMENT 1 #define ACKNOWLEDGEMENT_NONE 0 #define ACKNOWLEDGEMENT_NORMAL 1 #define ACKNOWLEDGEMENT_STICKY 2 /**************************** DEPENDENCY TYPES ***************************/ #define NOTIFICATION_DEPENDENCY 1 #define EXECUTION_DEPENDENCY 2 /********************** HOST/SERVICE CHECK OPTIONS ***********************/ #define CHECK_OPTION_NONE 0 /* no check options */ #define CHECK_OPTION_FORCE_EXECUTION 1 /* force execution of a check (ignores disabled services/hosts, invalid timeperiods) */ #define CHECK_OPTION_FRESHNESS_CHECK 2 /* this is a freshness check */ #define CHECK_OPTION_ORPHAN_CHECK 4 /* this is an orphan check */ #define CHECK_OPTION_DEPENDENCY_CHECK 8 /* dependency check. different scheduling rules apply */ /**************************** PROGRAM MODES ******************************/ #define STANDBY_MODE 0 #define ACTIVE_MODE 1 /************************** LOG ROTATION MODES ***************************/ #define LOG_ROTATION_NONE 0 #define LOG_ROTATION_HOURLY 1 #define LOG_ROTATION_DAILY 2 #define LOG_ROTATION_WEEKLY 3 #define LOG_ROTATION_MONTHLY 4 /***************************** LOG VERSIONS ******************************/ #define LOG_VERSION_1 "1.0" #define LOG_VERSION_2 "2.0" /*************************** CHECK STATISTICS ****************************/ #define ACTIVE_SCHEDULED_SERVICE_CHECK_STATS 0 #define ACTIVE_ONDEMAND_SERVICE_CHECK_STATS 1 #define PASSIVE_SERVICE_CHECK_STATS 2 #define ACTIVE_SCHEDULED_HOST_CHECK_STATS 3 #define ACTIVE_ONDEMAND_HOST_CHECK_STATS 4 #define PASSIVE_HOST_CHECK_STATS 5 #define ACTIVE_CACHED_HOST_CHECK_STATS 6 #define ACTIVE_CACHED_SERVICE_CHECK_STATS 7 #define EXTERNAL_COMMAND_STATS 8 #define PARALLEL_HOST_CHECK_STATS 9 #define SERIAL_HOST_CHECK_STATS 10 #define MAX_CHECK_STATS_TYPES 11 /****************** HOST CONFIG FILE READING OPTIONS ********************/ #define READ_HOSTS 1 #define READ_HOSTGROUPS 2 #define READ_CONTACTS 4 #define READ_CONTACTGROUPS 8 #define READ_SERVICES 16 #define READ_COMMANDS 32 #define READ_TIMEPERIODS 64 #define READ_SERVICEESCALATIONS 128 #define READ_HOSTGROUPESCALATIONS 256 /* no longer implemented */ #define READ_SERVICEDEPENDENCIES 512 #define READ_HOSTDEPENDENCIES 1024 #define READ_HOSTESCALATIONS 2048 #define READ_HOSTEXTINFO 4096 #define READ_SERVICEEXTINFO 8192 #define READ_SERVICEGROUPS 16384 #define READ_ALL_OBJECT_DATA READ_HOSTS | READ_HOSTGROUPS | READ_CONTACTS | READ_CONTACTGROUPS | READ_SERVICES | READ_COMMANDS | READ_TIMEPERIODS | READ_SERVICEESCALATIONS | READ_SERVICEDEPENDENCIES | READ_HOSTDEPENDENCIES | READ_HOSTESCALATIONS | READ_HOSTEXTINFO | READ_SERVICEEXTINFO | READ_SERVICEGROUPS /************************** DATE/TIME TYPES *****************************/ #define LONG_DATE_TIME 0 #define SHORT_DATE_TIME 1 #define SHORT_DATE 2 #define SHORT_TIME 3 #define HTTP_DATE_TIME 4 /* time formatted for use in HTTP headers */ /**************************** DATE FORMATS ******************************/ #define DATE_FORMAT_US 0 /* U.S. (MM-DD-YYYY HH:MM:SS) */ #define DATE_FORMAT_EURO 1 /* European (DD-MM-YYYY HH:MM:SS) */ #define DATE_FORMAT_ISO8601 2 /* ISO8601 (YYYY-MM-DD HH:MM:SS) */ #define DATE_FORMAT_STRICT_ISO8601 3 /* ISO8601 (YYYY-MM-DDTHH:MM:SS) */ /************************** MISC DEFINITIONS ****************************/ #define MAX_FILENAME_LENGTH 256 /* max length of path/filename that Nagios will process */ #define MAX_INPUT_BUFFER 1024 /* size in bytes of max. input buffer (for reading files, misc stuff) */ #define MAX_COMMAND_BUFFER 8192 /* max length of raw or processed command line */ #define MAX_EXTERNAL_COMMAND_LENGTH 8192 /* max length of an external command */ #define MAX_DATETIME_LENGTH 48 /************************* MODIFIED ATTRIBUTES **************************/ #define MODATTR_NONE 0 #define MODATTR_NOTIFICATIONS_ENABLED 1 #define MODATTR_ACTIVE_CHECKS_ENABLED 2 #define MODATTR_PASSIVE_CHECKS_ENABLED 4 #define MODATTR_EVENT_HANDLER_ENABLED 8 #define MODATTR_FLAP_DETECTION_ENABLED 16 #define MODATTR_FAILURE_PREDICTION_ENABLED 32 #define MODATTR_PERFORMANCE_DATA_ENABLED 64 #define MODATTR_OBSESSIVE_HANDLER_ENABLED 128 #define MODATTR_EVENT_HANDLER_COMMAND 256 #define MODATTR_CHECK_COMMAND 512 #define MODATTR_NORMAL_CHECK_INTERVAL 1024 #define MODATTR_RETRY_CHECK_INTERVAL 2048 #define MODATTR_MAX_CHECK_ATTEMPTS 4096 #define MODATTR_FRESHNESS_CHECKS_ENABLED 8192 #define MODATTR_CHECK_TIMEPERIOD 16384 #define MODATTR_CUSTOM_VARIABLE 32768 #define MODATTR_NOTIFICATION_TIMEPERIOD 65536 #endif /* NAGIOS_COMMON_H_INCLUDED */ nagios-4.3.4/include/config.h.in000066400000000000000000000151721314764422400164650ustar00rootroot00000000000000/************************************************************************ * * Nagios Config Header File * Written By: Ethan Galstad (egalstad@nagios.org) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ************************************************************************/ /***** NAGIOS STUFF *****/ #define DEFAULT_NAGIOS_USER nagios #define DEFAULT_NAGIOS_GROUP nagios /* stop gcc from bitching about implicit asprintf declarations */ #define _GNU_SOURCE 1 /* Event broker integration */ #undef USE_EVENT_BROKER /* commands used by CGIs */ #undef TRACEROUTE_COMMAND #undef PING_COMMAND #undef PING_PACKETS_FIRST /* Debugging options */ /* function entry and exit */ #undef DEBUG0 /* general info messages */ #undef DEBUG1 /* warning messages */ #undef DEBUG2 /* service and host checks, other events */ #undef DEBUG3 /* service and host notifications */ #undef DEBUG4 /* SQL queries (defunct) */ #undef DEBUG5 /* I/O implementations */ #undef USE_XSDDEFAULT #undef USE_XCDDEFAULT #undef USE_XRDDEFAULT #undef USE_XODTEMPLATE #undef USE_XPDDEFAULT #undef USE_XDDDEFAULT /***** CGI COMPILE OPTIONS *****/ /* should we compile and use the statusmap CGI? */ #undef USE_STATUSMAP /* should we compile and use the statuswrl CGI? */ #undef USE_STATUSWRL /* should we compile and use the trends CGI? */ #undef USE_TRENDS /* should we compile and use the histogram CGI? */ #undef USE_HISTOGRAM /***** FUNCTION DEFINITIONS *****/ #undef HAVE_SETENV #undef HAVE_UNSETENV #undef HAVE_SOCKET #undef HAVE_STRDUP #undef HAVE_STRSTR #undef HAVE_STRTOUL #undef HAVE_INITGROUPS #undef HAVE_GETLOADAVG #undef HAVE_GDIMAGECREATETRUECOLOR #undef HAVE_SIGACTION /***** ASPRINTF() AND FRIENDS *****/ #undef HAVE_VSNPRINTF #undef HAVE_SNPRINTF #undef HAVE_ASPRINTF #undef HAVE_VASPRINTF #undef HAVE_C99_VSNPRINTF #undef HAVE_VA_COPY #undef HAVE___VA_COPY /***** MISC DEFINITIONS *****/ #undef USE_NANOSLEEP #undef STDC_HEADERS #undef HAVE_TM_ZONE #undef HAVE_TZNAME #undef USE_PROC #define SOCKET_SIZE_TYPE "" #define GETGROUPS_T "" #define RETSIGTYPE "" /***** HEADER FILES *****/ #include #include /* needed for the time_t structures we use later... */ /* this include must come before sys/resource.h or we can have problems on some OSes */ #undef TIME_WITH_SYS_TIME #undef HAVE_SYS_TIME_H #if TIME_WITH_SYS_TIME #include #include #else #if HAVE_SYS_TIME_H #include #else #include #endif #endif #undef HAVE_SYS_RESOURCE_H #ifdef HAVE_SYS_RESOURCE_H #include #endif #undef HAVE_LIMITS_H #ifdef HAVE_LIMITS_H #include #endif #undef HAVE_PWD_H #ifdef HAVE_PWD_H #include "config_pwd.h" #endif #undef HAVE_GRP_H #ifdef HAVE_GRP_H #include #endif #undef HAVE_STRINGS_H #ifdef HAVE_STRINGS_H #include #endif #undef HAVE_STRING_H #ifdef HAVE_STRINGS_H #include #endif #undef HAVE_UNISTD_H #ifdef HAVE_UNISTD_H #include #endif #undef HAVE_SYSLOG_H #ifdef HAVE_SYSLOG_H #include #endif #undef HAVE_SIGNAL_H #ifdef HAVE_SIGNAL_H #include #endif #undef HAVE_SYS_STAT_H #ifdef HAVE_SYS_STAT_H #include #endif #undef HAVE_SYS_MMAN_H #ifdef HAVE_SYS_MMAN_H #include #endif #undef HAVE_FCNTL_H #ifdef HAVE_FCNTL_H #include #endif #undef HAVE_STDARG_H #ifdef HAVE_STDARG_H #include #endif /* Another Solarisism: getloadavg() lives in , not , * so include the former if it exists. This may be true on other systems, or * this function may be missing altogether (see: * https://www.gnu.org/software/gnulib/manual/html_node/getloadavg.html). */ #undef HAVE_SYS_LOADAVG_H #ifdef HAVE_SYS_LOADAVG_H #include #endif #undef HAVE_SYS_TYPES_H #ifdef HAVE_SYS_TYPES_H #include #endif #undef HAVE_SYS_WAIT_H #ifdef HAVE_SYS_WAIT_H #include #endif #undef HAVE_ERRNO_H #ifdef HAVE_ERRNO_H #include #endif #undef HAVE_SYS_TIMEB_H #if HAVE_SYS_TIMEB_H #include #endif #undef HAVE_SYS_IPC_H #ifdef HAVE_SYS_IPC_H #include #endif #undef HAVE_SYS_MSG_H #ifdef HAVE_SYS_MSG_H #include #endif #undef HAVE_MATH_H #ifdef HAVE_MATH_H #include #endif #undef HAVE_CTYPE_H #ifdef HAVE_CTYPE_H #include #endif #undef HAVE_DIRENT_H #ifdef HAVE_DIRENT_H #include #endif #undef HAVE_REGEX_H #ifdef HAVE_REGEX_H #include #undef HAVE_SYS_SOCKET_H #ifdef HAVE_SYS_SOCKET_H #include #endif #undef HAVE_SOCKET #ifdef HAVE_SOCKET_H #include #endif #undef HAVE_NETINET_IN_H #ifdef HAVE_NETINET_IN_H #include #endif #undef HAVE_ARPA_INET_H #ifdef HAVE_ARPA_INET_H #include #endif #undef HAVE_NETDB_H #ifdef HAVE_NETDB_H #include #endif #undef HAVE_LIBGEN_H #ifdef HAVE_LIBGEN_H #include #endif #undef HAVE_SYS_UN_H #ifdef HAVE_SYS_UN_H #include #endif #undef HAVE_SYS_POLL_H #ifdef HAVE_SYS_POLL_H #include #endif #undef HAVE_GETOPT_H #ifdef HAVE_GETOPT_H #include #endif #undef HAVE_LINUX_MODULE_H #ifdef HAVE_LINUX_MODULE_H #include #endif #undef HAVE_LOCALE_H #ifdef HAVE_LOCALE_H #include #endif #undef HAVE_WCHAR_H #ifdef HAVE_WCHAR_H #include #endif #undef HAVE_SYS_PRCTL_H #ifdef HAVE_SYS_PRCTL_H #include #endif /* configure script should allow user to override ltdl choice, but this will do for now... */ #undef USE_LTDL #undef HAVE_LTDL_H #ifdef HAVE_LTDL_H #define USE_LTDL #endif #ifdef USE_LTDL #include #else #undef HAVE_DLFCN_H #ifdef HAVE_DLFCN_H #include #endif #endif /* moved to end to prevent AIX compiler warnings */ #ifndef RTLD_GLOBAL #define RTLD_GLOBAL 0 #endif #ifndef RTLD_NOW #define RTLD_NOW 0 #endif /***** MARO DEFINITIONS *****/ /* this needs to come after all system include files, so we don't accidentally attempt to redefine it */ #ifndef WEXITSTATUS # define WEXITSTATUS(stat_val) ((unsigned)(stat_val) >> 8) #endif #ifndef WIFEXITED # define WIFEXITED(stat_val) (((stat_val) & 255) == 0) #endif #endif nagios-4.3.4/include/config_pwd.h000066400000000000000000000012131314764422400167210ustar00rootroot00000000000000#ifndef NAGIOS_CONFIG_PWD_H_INCLUDED #define NAGIOS_CONFIG_PWD_H_INCLUDED /** * @file include/config_pwd.h * A wrapper header to let us conditionally define and then undefine * __XOPEN_OR_POSIX to suppress the conflicting 'struct comment' declaration on * Solaris. We can't do this in config.h.in since the undef will be commented * out when config.h is generated. */ #if defined(__sun) && defined(__SVR4) && !defined(__XOPEN_OR_POSIX) #define __XOPEN_OR_POSIX #define NEED_TO_UNDEF__XOPEN_OR_POSIX #endif #include #if defined(NEED_TO_UNDEF__XOPEN_OR_POSIX) #undef __XOPEN_OR_POSIX #undef NEED_TO_UNDEF__XOPEN_OR_POSIX #endif #endif nagios-4.3.4/include/defaults.h000066400000000000000000000172471314764422400164270ustar00rootroot00000000000000#ifndef NAGIOS_DEFAULTS_H_INCLUDED #define NAGIOS_DEFAULTS_H_INCLUDED /******************* DEFAULT VALUES *******************/ #define DEFAULT_LOG_LEVEL 1 /* log all events to main log file */ #define DEFAULT_USE_SYSLOG 1 /* log events to syslog? 1=yes, 0=no */ #define DEFAULT_SYSLOG_LEVEL 2 /* log only severe events to syslog */ #define DEFAULT_NOTIFICATION_LOGGING 1 /* log notification events? 1=yes, 0=no */ #define DEFAULT_INTER_CHECK_DELAY 5.0 /* seconds between initial service check scheduling */ #define DEFAULT_INTERLEAVE_FACTOR 1 /* default interleave to use when scheduling checks */ #define DEFAULT_RETRY_INTERVAL 30 /* services are retried in 30 seconds if they're not OK */ #define DEFAULT_CHECK_REAPER_INTERVAL 10 /* interval in seconds to reap host and service check results */ #define DEFAULT_MAX_REAPER_TIME 30 /* maximum number of seconds to spend reaping service checks before we break out for a while */ #define DEFAULT_MAX_CHECK_RESULT_AGE 3600 /* maximum number of seconds that a check result file is considered to be valid */ #define DEFAULT_MAX_PARALLEL_SERVICE_CHECKS 0 /* maximum number of service checks we can have running at any given time (0=unlimited) */ #define DEFAULT_RETENTION_UPDATE_INTERVAL 60 /* minutes between auto-save of retention data */ #define DEFAULT_RETENTION_SCHEDULING_HORIZON 900 /* max seconds between program restarts that we will preserve scheduling information */ #define DEFAULT_STATUS_UPDATE_INTERVAL 60 /* seconds between aggregated status data updates */ #define DEFAULT_FRESHNESS_CHECK_INTERVAL 60 /* seconds between service result freshness checks */ #define DEFAULT_AUTO_RESCHEDULING_INTERVAL 30 /* seconds between host and service check rescheduling events */ #define DEFAULT_AUTO_RESCHEDULING_WINDOW 180 /* window of time (in seconds) for which we should reschedule host and service checks */ #define DEFAULT_ORPHAN_CHECK_INTERVAL 60 /* seconds between checks for orphaned hosts and services */ #define DEFAULT_INTERVAL_LENGTH 60 /* seconds per interval unit for check scheduling */ #define DEFAULT_NOTIFICATION_TIMEOUT 30 /* max time in seconds to wait for notification commands to complete */ #define DEFAULT_EVENT_HANDLER_TIMEOUT 30 /* max time in seconds to wait for event handler commands to complete */ #define DEFAULT_HOST_CHECK_TIMEOUT 30 /* max time in seconds to wait for host check commands to complete */ #define DEFAULT_SERVICE_CHECK_TIMEOUT 60 /* max time in seconds to wait for service check commands to complete */ #define DEFAULT_OCSP_TIMEOUT 15 /* max time in seconds to wait for obsessive compulsive processing commands to complete */ #define DEFAULT_OCHP_TIMEOUT 15 /* max time in seconds to wait for obsessive compulsive processing commands to complete */ #define DEFAULT_PERFDATA_TIMEOUT 5 /* max time in seconds to wait for performance data commands to complete */ #define DEFAULT_TIME_CHANGE_THRESHOLD 900 /* compensate for time changes of more than 15 minutes */ #define DEFAULT_LOG_HOST_RETRIES 0 /* don't log host retries */ #define DEFAULT_LOG_SERVICE_RETRIES 0 /* don't log service retries */ #define DEFAULT_LOG_EVENT_HANDLERS 1 /* log event handlers */ #define DEFAULT_LOG_INITIAL_STATES 0 /* don't log initial service and host states */ #define DEFAULT_LOG_CURRENT_STATES 1 /* log current service and host states after rotating log */ #define DEFAULT_LOG_EXTERNAL_COMMANDS 1 /* log external commands */ #define DEFAULT_LOG_PASSIVE_CHECKS 1 /* log passive service checks */ #define DEFAULT_DEBUG_LEVEL 0 /* don't log any debugging information */ #define DEFAULT_DEBUG_VERBOSITY 1 #define DEFAULT_MAX_DEBUG_FILE_SIZE 1000000 /* max size of debug log */ #define DEFAULT_AGGRESSIVE_HOST_CHECKING 0 /* don't use "aggressive" host checking */ #define DEFAULT_CHECK_EXTERNAL_COMMANDS 1 /* check for external commands */ #define DEFAULT_CHECK_ORPHANED_SERVICES 1 /* check for orphaned services */ #define DEFAULT_CHECK_ORPHANED_HOSTS 1 /* check for orphaned hosts */ #define DEFAULT_ENABLE_FLAP_DETECTION 0 /* don't enable flap detection */ #define DEFAULT_PROCESS_PERFORMANCE_DATA 0 /* don't process performance data */ #define DEFAULT_CHECK_SERVICE_FRESHNESS 1 /* check service result freshness */ #define DEFAULT_CHECK_HOST_FRESHNESS 0 /* don't check host result freshness */ #define DEFAULT_AUTO_RESCHEDULE_CHECKS 0 /* don't auto-reschedule host and service checks */ #define DEFAULT_TRANSLATE_PASSIVE_HOST_CHECKS 0 /* should we translate DOWN/UNREACHABLE passive host checks? */ #define DEFAULT_PASSIVE_HOST_CHECKS_SOFT 0 /* passive host checks are treated as HARD by default */ #define DEFAULT_LOW_SERVICE_FLAP_THRESHOLD 20.0 /* low threshold for detection of service flapping */ #define DEFAULT_HIGH_SERVICE_FLAP_THRESHOLD 30.0 /* high threshold for detection of service flapping */ #define DEFAULT_LOW_HOST_FLAP_THRESHOLD 20.0 /* low threshold for detection of host flapping */ #define DEFAULT_HIGH_HOST_FLAP_THRESHOLD 30.0 /* high threshold for detection of host flapping */ #define DEFAULT_HOST_CHECK_SPREAD 30 /* max minutes to schedule all initial host checks */ #define DEFAULT_SERVICE_CHECK_SPREAD 30 /* max minutes to schedule all initial service checks */ #define DEFAULT_CACHED_HOST_CHECK_HORIZON 15 /* max age in seconds that cached host checks can be used */ #define DEFAULT_CACHED_SERVICE_CHECK_HORIZON 15 /* max age in seconds that cached service checks can be used */ #define DEFAULT_ENABLE_PREDICTIVE_HOST_DEPENDENCY_CHECKS 1 /* should we use predictive host dependency checks? */ #define DEFAULT_ENABLE_PREDICTIVE_SERVICE_DEPENDENCY_CHECKS 1 /* should we use predictive service dependency checks? */ #define DEFAULT_USE_LARGE_INSTALLATION_TWEAKS 0 /* don't use tweaks for large Nagios installations */ #define DEFAULT_ADDITIONAL_FRESHNESS_LATENCY 15 /* seconds to be added to freshness thresholds when automatically calculated by Nagios */ #define DEFAULT_CHECK_FOR_UPDATES 1 /* should we check for new Nagios releases? */ #define DEFAULT_BARE_UPDATE_CHECK 0 /* report current version and new installs */ #define MINIMUM_UPDATE_CHECK_INTERVAL 60*60*22 /* 22 hours minimum between checks - please be kind to our servers! */ #define BASE_UPDATE_CHECK_INTERVAL 60*60*22 /* 22 hours base interval */ #define UPDATE_CHECK_INTERVAL_WOBBLE 60*60*4 /* 4 hour wobble on top of base interval */ #define BASE_UPDATE_CHECK_RETRY_INTERVAL 60*60*1 /* 1 hour base retry interval */ #define UPDATE_CHECK_RETRY_INTERVAL_WOBBLE 60*60*3 /* 3 hour wobble on top of base retry interval */ #define DEFAULT_ALLOW_EMPTY_HOSTGROUP_ASSIGNMENT 2 /* Allow assigning to empty hostgroups by default, but warn about it */ #define DEFAULT_HOST_PERFDATA_FILE_TEMPLATE "[HOSTPERFDATA]\t$TIMET$\t$HOSTNAME$\t$HOSTEXECUTIONTIME$\t$HOSTOUTPUT$\t$HOSTPERFDATA$" #define DEFAULT_SERVICE_PERFDATA_FILE_TEMPLATE "[SERVICEPERFDATA]\t$TIMET$\t$HOSTNAME$\t$SERVICEDESC$\t$SERVICEEXECUTIONTIME$\t$SERVICELATENCY$\t$SERVICEOUTPUT$\t$SERVICEPERFDATA$" #define DEFAULT_HOST_PERFDATA_PROCESS_EMPTY_RESULTS 1 #define DEFAULT_SERVICE_PERFDATA_PROCESS_EMPTY_RESULTS 1 #endif /* NAGIOS_DEFAULTS_H_INCLUDED */ nagios-4.3.4/include/downtime.h000066400000000000000000000103201314764422400164270ustar00rootroot00000000000000/***************************************************************************** * * DOWNTIME.H - Header file for scheduled downtime functions * * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #ifndef NAGIOS_DOWNTIME_H_INCLUDED #define NAGIOS_DOWNTIME_H_INCLUDED #include "common.h" #include "objects.h" #ifndef NSCGI #include "nagios.h" #endif NAGIOS_BEGIN_DECL /* SCHEDULED_DOWNTIME_ENTRY structure */ typedef struct scheduled_downtime { int type; char *host_name; char *service_description; time_t entry_time; time_t start_time; time_t flex_downtime_start; /* Time the flexible downtime started */ time_t end_time; int fixed; unsigned long triggered_by; unsigned long duration; unsigned long downtime_id; int is_in_effect; int start_notification_sent; char *author; char *comment; unsigned long comment_id; #ifndef NSCGI int start_flex_downtime; int incremented_pending_downtime; #endif struct scheduled_downtime *next; #ifndef NSCGI struct timed_event *start_event, *stop_event; #endif struct scheduled_downtime *prev; } scheduled_downtime; extern struct scheduled_downtime *scheduled_downtime_list; int initialize_downtime_data(void); /* initializes scheduled downtime data */ int cleanup_downtime_data(void); /* cleans up scheduled downtime data */ #ifndef NSCGI int add_new_downtime(int, char *, char *, time_t, char *, char *, time_t, time_t, int, unsigned long, unsigned long, unsigned long *, int, int); int add_new_host_downtime(char *, time_t, char *, char *, time_t, time_t, int, unsigned long, unsigned long, unsigned long *, int, int); int add_new_service_downtime(char *, char *, time_t, char *, char *, time_t, time_t, int, unsigned long, unsigned long, unsigned long *, int, int); int delete_host_downtime(unsigned long); int delete_service_downtime(unsigned long); int delete_downtime(int, unsigned long); int schedule_downtime(int, char *, char *, time_t, char *, char *, time_t, time_t, int, unsigned long, unsigned long, unsigned long *); int unschedule_downtime(int, unsigned long); int register_downtime(int, unsigned long); int handle_scheduled_downtime(struct scheduled_downtime *); int handle_scheduled_downtime_by_id(unsigned long); int check_pending_flex_host_downtime(struct host *); int check_pending_flex_service_downtime(struct service *); int is_host_in_pending_flex_downtime(struct host *); int is_service_in_pending_flex_downtime(struct service *); int check_for_expired_downtime(void); #endif int add_host_downtime(char *, time_t, char *, char *, time_t, time_t, time_t, int, unsigned long, unsigned long, unsigned long, int, int); int add_service_downtime(char *, char *, time_t, char *, char *, time_t, time_t, time_t, int, unsigned long, unsigned long, unsigned long, int, int); /* If you are going to be adding a lot of downtime in sequence, set defer_downtime_sorting to 1 before you start and then call sort_downtime afterwards. Things will go MUCH faster. */ extern int defer_downtime_sorting; int add_downtime(int, char *, char *, time_t, char *, char *, time_t, time_t, time_t, int, unsigned long, unsigned long, unsigned long, int, int); int sort_downtime(void); struct scheduled_downtime *find_downtime(int, unsigned long); struct scheduled_downtime *find_host_downtime(unsigned long); struct scheduled_downtime *find_service_downtime(unsigned long); void free_downtime_data(void); /* frees memory allocated to scheduled downtime list */ int delete_downtime_by_hostname_service_description_start_time_comment(char *, char *, time_t, char *); NAGIOS_END_DECL #endif nagios-4.3.4/include/getcgi.h000066400000000000000000000020161314764422400160460ustar00rootroot00000000000000/****************************************************** * * GETCGI.H - Nagios CGI Input Routine Include File * * *****************************************************/ #include "lib/lnag-utils.h" NAGIOS_BEGIN_DECL #define ACCEPT_LANGUAGE_Q_DELIMITER ";q=" /* information for a single language in the variable HTTP_ACCEPT_LANGUAGE sent by the browser */ typedef struct accept_language_struct { char * language; char * locality; double q; } accept_language; /* information for all languages in the variable HTTP_ACCEPT_LANGUAGE sent by the browser */ typedef struct accept_languages_struct { int count; accept_language ** languages; } accept_languages; char **getcgivars(void); void free_cgivars(char **); void unescape_cgi_input(char *); void sanitize_cgi_input(char **); unsigned char hex_to_char(char *); void process_language( char *); accept_languages * parse_accept_languages( char *); int compare_accept_languages( const void *, const void *); void free_accept_languages( accept_languages *); NAGIOS_END_DECL nagios-4.3.4/include/jsonutils.h000066400000000000000000000215461314764422400166470ustar00rootroot00000000000000/************************************************************************** * * JSONUTILS.H - Utility information for Nagios CGI for that return * JSON-formatted data * * Copyright (c) 2013 Nagios Enterprises, LLC * Last Modified: 04-13-2013 * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *************************************************************************/ #ifndef NAGIOS_JSONUTILS_H_INCLUDED #define NAGIOS_JSONUTILS_H_INCLUDED /* JSON object definitions */ #define JSON_TYPE_INVALID 0 #define JSON_TYPE_OBJECT 1 #define JSON_TYPE_ARRAY 2 #define JSON_TYPE_INTEGER 3 #define JSON_TYPE_REAL 4 #define JSON_TYPE_TIME_T 5 #define JSON_TYPE_STRING 6 #define JSON_TYPE_BOOLEAN 7 #define JSON_TYPE_DURATION 8 struct json_object_struct; typedef struct json_object_member_struct { char *key; unsigned type; union { long long integer; unsigned long long unsigned_integer; time_t time; double real; char * string; unsigned boolean; struct json_object_struct *object; } value; } json_object_member; typedef struct json_object_struct { unsigned member_count; json_object_member **members; } json_object; typedef json_object json_array; /* Mapping from CGI query string option to value */ typedef struct string_value_mapping_struct { char *string; /* String to map from */ unsigned value; /* Value to map to */ char *description; /* Description of the meaning of the string/value */ } string_value_mapping; typedef struct option_help_struct { const char * name; /* name used in query */ const char * label; /* short label for name */ const char * type; /* option type */ /* If the type is of the form nagios:/, value values for this option will be obtained by sending the query 'http:///.cgi?objecttype=' */ const char * required[25]; /* optiontypes required for */ const char * optional[25]; /* optiontypes optional for */ const char * depends_on; /* valid values dependent on other option */ const char * description; /* longer description */ const string_value_mapping * valid_values; /* list of valid values */ } option_help; /* String escaping structures */ typedef struct json_escape_pair_struct { const wchar_t *from; const wchar_t *to; } json_escape_pair; typedef struct json_escape_struct { const int count; const json_escape_pair *pairs; } json_escape; /* Output Format Version */ #define OUTPUT_FORMAT_VERSION 0 /* Result Types */ #define RESULT_SUCCESS 0 #define RESULT_MEMORY_ALLOCATION_ERROR 1 #define RESULT_FILE_OPEN_READ_ERROR 2 #define RESULT_OPTION_INVALID 3 #define RESULT_OPTION_MISSING 4 #define RESULT_OPTION_VALUE_MISSING 5 #define RESULT_OPTION_VALUE_INVALID 6 #define RESULT_OPTION_IGNORED 7 /* Boolean Values - Used when selecting true, false, or both */ #define BOOLEAN_TRUE 1 #define BOOLEAN_FALSE 2 #define BOOLEAN_EITHER (BOOLEAN_TRUE | BOOLEAN_FALSE) /* Formatting Options */ #define JSON_FORMAT_WHITESPACE (1<<0) #define JSON_FORMAT_ENUMERATE (1<<1) #define JSON_FORMAT_BITMASK (1<<2) #define JSON_FORMAT_DURATION (1<<3) #if 0 #define JSON_FORMAT_DATETIME (1<<3) #define JSON_FORMAT_DATE (1<<4) #define JSON_FORMAT_TIME (1<<5) #endif /* Possible Query Statuses */ #define QUERY_STATUS_ALPHA 0 #define QUERY_STATUS_BETA 1 #define QUERY_STATUS_RELEASED 2 #define QUERY_STATUS_DEPRECATED 3 extern const string_value_mapping svm_format_options[]; extern const string_value_mapping svm_host_statuses[]; extern const string_value_mapping svm_host_states[]; extern const string_value_mapping svm_service_statuses[]; extern const string_value_mapping svm_service_states[]; extern const string_value_mapping svm_check_options[]; extern const string_value_mapping svm_host_check_types[]; extern const string_value_mapping svm_service_check_types[]; extern const string_value_mapping svm_state_types[]; extern const string_value_mapping svm_acknowledgement_types[]; extern const string_value_mapping svm_comment_types[]; extern const string_value_mapping svm_comment_entry_types[]; extern const string_value_mapping svm_downtime_types[]; extern const string_value_mapping parent_host_extras[]; extern const string_value_mapping child_host_extras[]; extern const string_value_mapping parent_service_extras[]; extern const string_value_mapping child_service_extras[]; #ifdef JSON_NAGIOS_4X extern const string_value_mapping svm_option_types[]; #endif extern const char *dayofweek[]; extern const char *month[]; extern json_object *json_new_object(void); extern void json_free_object(json_object *, int); extern json_array *json_new_array(void); extern void json_free_member(json_object_member *, int); extern void json_object_append_object(json_object *, char *, json_object *); extern void json_object_append_array(json_object *, char *, json_array *); extern void json_object_append_integer(json_object *, char *, int); extern void json_object_append_real(json_object *, char *, double); extern void json_object_append_time(json_object *, char *, unsigned long); extern void json_object_append_time_t(json_object *, char *, time_t); extern void json_set_time_t(json_object_member *, time_t); extern void json_object_append_string(json_object *, char *, const json_escape *, char *, ...); extern void json_object_append_boolean(json_object *, char *, int); extern void json_array_append_object(json_array *, json_object *); extern void json_array_append_array(json_array *, json_array *); extern void json_array_append_integer(json_array *, int); extern void json_array_append_real(json_array *, double); extern void json_array_append_time(json_array *, unsigned long); extern void json_array_append_time_t(json_array *, time_t); extern void json_array_append_string(json_array *, const json_escape *, char *, ...); extern void json_array_append_boolean(json_array *, int); extern void json_object_append_duration(json_object *, char *, unsigned long); extern void json_array_append_duration(json_object *, unsigned long); extern json_object_member *json_get_object_member(json_object *, char *); extern json_object_member *json_get_array_member(json_object *, char *); extern void json_object_print(json_object *, int, int, char *, unsigned); extern void json_array_print(json_array *, int, int, char *, unsigned); extern void json_member_print(json_object_member *, int, int, char *, unsigned); extern json_object *json_result(time_t, char *, char *, int, time_t, authdata *, int, char *, ...); extern json_object *json_help(option_help *); extern int passes_start_and_count_limits(int, int, int, int); extern void indentf(int, int, char *, ...); extern void json_string(int, int, char *, char *); extern void json_boolean(int, int, char *, int); extern void json_int(int, int, char *, int); extern void json_unsigned(int, int, char *, unsigned long long); extern void json_float(int, int, char *, double); extern void json_time(int, int, char *, unsigned long); extern void json_time_t(int, int, char *, time_t, char *); extern void json_duration(int, int, char *, unsigned long, int); extern void json_enumeration(json_object *, unsigned, char *, int, const string_value_mapping *); extern void json_bitmask(json_object *, unsigned, char *, int, const string_value_mapping *); extern int parse_bitmask_cgivar(char *, char *, int, json_object *, time_t, authdata *, char *, char *, const string_value_mapping *, unsigned *); extern int parse_enumeration_cgivar(char *, char *, int, json_object *, time_t, authdata *, char *, char *, const string_value_mapping *, int *); extern int parse_string_cgivar(char *, char *, int, json_object *, time_t, authdata *, char *, char *, char **); extern int parse_time_cgivar(char *, char *, int, json_object *, time_t, authdata *, char *, char *, time_t *); extern int parse_boolean_cgivar(char *, char *, int, json_object *, time_t, authdata *, char *, char *, int *); extern int parse_int_cgivar(char *, char *, int, json_object *, time_t, authdata *, char *, char *, int *); extern int get_query_status(const int[][2], int); extern char *svm_get_string_from_value(int, const string_value_mapping *); extern char *svm_get_description_from_value(int, const string_value_mapping *); extern time_t compile_time(const char *, const char *); extern char *json_escape_string(const char *, const json_escape *); #endif nagios-4.3.4/include/locations.h.in000066400000000000000000000042051314764422400172060ustar00rootroot00000000000000/************************************************************************ * * Nagios Locations Header File * Written By: Ethan Galstad (egalstad@nagios.org) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ************************************************************************/ #define DEFAULT_TEMP_FILE "@localstatedir@/tempfile" #define DEFAULT_TEMP_PATH "/tmp" #define DEFAULT_CHECK_RESULT_PATH "@localstatedir@/spool/checkresults" #define DEFAULT_STATUS_FILE "@localstatedir@/status.dat" #define DEFAULT_LOG_FILE "@localstatedir@/nagios.log" #define DEFAULT_LOG_ARCHIVE_PATH "@localstatedir@/archives/" #define DEFAULT_DEBUG_FILE "@localstatedir@/nagios.debug" #define DEFAULT_COMMENT_FILE "@localstatedir@/comments.dat" #define DEFAULT_DOWNTIME_FILE "@localstatedir@/downtime.dat" #define DEFAULT_RETENTION_FILE "@localstatedir@/retention.dat" #define DEFAULT_COMMAND_FILE "@localstatedir@/rw/nagios.cmd" #define DEFAULT_QUERY_SOCKET "@localstatedir@/rw/nagios.qh" #define DEFAULT_CONFIG_FILE "@sysconfdir@/nagios.cfg" #define DEFAULT_PHYSICAL_HTML_PATH "@datadir@" #define DEFAULT_URL_HTML_PATH "@htmurl@" #define DEFAULT_PHYSICAL_CGIBIN_PATH "@sbindir@" #define DEFAULT_URL_CGIBIN_PATH "@cgiurl@" #define DEFAULT_CGI_CONFIG_FILE "@sysconfdir@/cgi.cfg" #define DEFAULT_LOCK_FILE "@lockfile@" #define DEFAULT_OBJECT_CACHE_FILE "@localstatedir@/objects.cache" #define DEFAULT_PRECACHED_OBJECT_FILE "@localstatedir@/objects.precache" #define DEFAULT_EVENT_BROKER_FILE "@localstatedir@/broker.socket" nagios-4.3.4/include/logging.h000066400000000000000000000061421314764422400162360ustar00rootroot00000000000000#ifndef NAGIOS_LOGGING_H_INCLUDED #define NAGIOS_LOGGING_H_INCLUDED #include "objects.h" /******************* LOGGING TYPES ********************/ #define NSLOG_RUNTIME_ERROR 1 #define NSLOG_RUNTIME_WARNING 2 #define NSLOG_VERIFICATION_ERROR 4 #define NSLOG_VERIFICATION_WARNING 8 #define NSLOG_CONFIG_ERROR 16 #define NSLOG_CONFIG_WARNING 32 #define NSLOG_PROCESS_INFO 64 #define NSLOG_EVENT_HANDLER 128 /*#define NSLOG_NOTIFICATION 256*/ /* NOT USED ANYMORE - CAN BE REUSED */ #define NSLOG_EXTERNAL_COMMAND 512 #define NSLOG_HOST_UP 1024 #define NSLOG_HOST_DOWN 2048 #define NSLOG_HOST_UNREACHABLE 4096 #define NSLOG_SERVICE_OK 8192 #define NSLOG_SERVICE_UNKNOWN 16384 #define NSLOG_SERVICE_WARNING 32768 #define NSLOG_SERVICE_CRITICAL 65536 #define NSLOG_PASSIVE_CHECK 131072 #define NSLOG_INFO_MESSAGE 262144 #define NSLOG_HOST_NOTIFICATION 524288 #define NSLOG_SERVICE_NOTIFICATION 1048576 /***************** DEBUGGING LEVELS *******************/ #define DEBUGL_ALL -1 #define DEBUGL_NONE 0 #define DEBUGL_FUNCTIONS 1 #define DEBUGL_CONFIG 2 #define DEBUGL_PROCESS 4 #define DEBUGL_STATUSDATA 4 #define DEBUGL_RETENTIONDATA 4 #define DEBUGL_EVENTS 8 #define DEBUGL_CHECKS 16 #define DEBUGL_FLAPPING 16 #define DEBUGL_EVENTHANDLERS 16 #define DEBUGL_PERFDATA 16 #define DEBUGL_NOTIFICATIONS 32 #define DEBUGL_EVENTBROKER 64 #define DEBUGL_EXTERNALCOMMANDS 128 #define DEBUGL_COMMANDS 256 #define DEBUGL_DOWNTIME 512 #define DEBUGL_COMMENTS 1024 #define DEBUGL_MACROS 2048 #define DEBUGL_IPC 4096 #define DEBUGL_SCHEDULING 8192 #define DEBUGV_BASIC 0 #define DEBUGV_MORE 1 #define DEBUGV_MOST 2 NAGIOS_BEGIN_DECL /**** Logging Functions ****/ void logit(int, int, const char *, ...) __attribute__((__format__(__printf__, 3, 4))); int log_debug_info(int, int, const char *, ...) __attribute__((__format__(__printf__, 3, 4))); #ifndef NSCGI int write_to_all_logs(char *, unsigned long); /* writes a string to main log file and syslog facility */ int write_to_log(char *, unsigned long, time_t *); /* write a string to the main log file */ int write_to_syslog(char *, unsigned long); /* write a string to the syslog facility */ int log_service_event(service *); /* logs a service event */ int log_host_event(host *); /* logs a host event */ int log_host_states(int, time_t *); /* logs initial/current host states */ int log_service_states(int, time_t *); /* logs initial/current service states */ int rotate_log_file(time_t); /* rotates the main log file */ int write_log_file_info(time_t *); /* records log file/version info */ int open_debug_log(void); int close_debug_log(void); int close_log_file(void); int fix_log_file_owner(uid_t uid, gid_t gid); #endif /* !NSCGI */ NAGIOS_END_DECL #endif nagios-4.3.4/include/macros.h000066400000000000000000000317601314764422400161000ustar00rootroot00000000000000/************************************************************************ * * MACROS.H - Common macro functions * Written By: Ethan Galstad (egalstad@nagios.org) * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ************************************************************************/ #ifndef NAGIOS_MACROS_H_INCLUDED #define NAGIOS_MACROS_H_INCLUDED #include "common.h" #include "objects.h" /****************** LENGTH LIMITATIONS ****************/ #define MAX_COMMAND_ARGUMENTS 32 /* maximum number of $ARGx$ macros */ /****************** MACRO DEFINITIONS *****************/ #define MACRO_ENV_VAR_PREFIX "NAGIOS_" #define MAX_USER_MACROS 256 /* maximum number of $USERx$ macros */ #define MACRO_X_COUNT 159 /* size of macro_x[] array */ NAGIOS_BEGIN_DECL struct nagios_macros { char *x[MACRO_X_COUNT]; char *argv[MAX_COMMAND_ARGUMENTS]; char *contactaddress[MAX_CONTACT_ADDRESSES]; char *ondemand; host *host_ptr; hostgroup *hostgroup_ptr; service *service_ptr; servicegroup *servicegroup_ptr; contact *contact_ptr; contactgroup *contactgroup_ptr; customvariablesmember *custom_host_vars; customvariablesmember *custom_service_vars; customvariablesmember *custom_contact_vars; }; typedef struct nagios_macros nagios_macros; #define MACRO_HOSTNAME 0 #define MACRO_HOSTALIAS 1 #define MACRO_HOSTADDRESS 2 #define MACRO_SERVICEDESC 3 #define MACRO_SERVICESTATE 4 #define MACRO_SERVICESTATEID 5 #define MACRO_SERVICEATTEMPT 6 #define MACRO_LONGDATETIME 7 #define MACRO_SHORTDATETIME 8 #define MACRO_DATE 9 #define MACRO_TIME 10 #define MACRO_TIMET 11 #define MACRO_LASTHOSTCHECK 12 #define MACRO_LASTSERVICECHECK 13 #define MACRO_LASTHOSTSTATECHANGE 14 #define MACRO_LASTSERVICESTATECHANGE 15 #define MACRO_HOSTOUTPUT 16 #define MACRO_SERVICEOUTPUT 17 #define MACRO_HOSTPERFDATA 18 #define MACRO_SERVICEPERFDATA 19 #define MACRO_CONTACTNAME 20 #define MACRO_CONTACTALIAS 21 #define MACRO_CONTACTEMAIL 22 #define MACRO_CONTACTPAGER 23 #define MACRO_ADMINEMAIL 24 #define MACRO_ADMINPAGER 25 #define MACRO_HOSTSTATE 26 #define MACRO_HOSTSTATEID 27 #define MACRO_HOSTATTEMPT 28 #define MACRO_NOTIFICATIONTYPE 29 #define MACRO_NOTIFICATIONNUMBER 30 /* deprecated - see HOSTNOTIFICATIONNUMBER and SERVICENOTIFICATIONNUMBER macros */ #define MACRO_HOSTEXECUTIONTIME 31 #define MACRO_SERVICEEXECUTIONTIME 32 #define MACRO_HOSTLATENCY 33 #define MACRO_SERVICELATENCY 34 #define MACRO_HOSTDURATION 35 #define MACRO_SERVICEDURATION 36 #define MACRO_HOSTDURATIONSEC 37 #define MACRO_SERVICEDURATIONSEC 38 #define MACRO_HOSTDOWNTIME 39 #define MACRO_SERVICEDOWNTIME 40 #define MACRO_HOSTSTATETYPE 41 #define MACRO_SERVICESTATETYPE 42 #define MACRO_HOSTPERCENTCHANGE 43 #define MACRO_SERVICEPERCENTCHANGE 44 #define MACRO_HOSTGROUPNAME 45 #define MACRO_HOSTGROUPALIAS 46 #define MACRO_SERVICEGROUPNAME 47 #define MACRO_SERVICEGROUPALIAS 48 #define MACRO_HOSTACKAUTHOR 49 #define MACRO_HOSTACKCOMMENT 50 #define MACRO_SERVICEACKAUTHOR 51 #define MACRO_SERVICEACKCOMMENT 52 #define MACRO_LASTSERVICEOK 53 #define MACRO_LASTSERVICEWARNING 54 #define MACRO_LASTSERVICEUNKNOWN 55 #define MACRO_LASTSERVICECRITICAL 56 #define MACRO_LASTHOSTUP 57 #define MACRO_LASTHOSTDOWN 58 #define MACRO_LASTHOSTUNREACHABLE 59 #define MACRO_SERVICECHECKCOMMAND 60 #define MACRO_HOSTCHECKCOMMAND 61 #define MACRO_MAINCONFIGFILE 62 #define MACRO_STATUSDATAFILE 63 #define MACRO_HOSTDISPLAYNAME 64 #define MACRO_SERVICEDISPLAYNAME 65 #define MACRO_RETENTIONDATAFILE 66 #define MACRO_OBJECTCACHEFILE 67 #define MACRO_TEMPFILE 68 #define MACRO_LOGFILE 69 #define MACRO_RESOURCEFILE 70 #define MACRO_COMMANDFILE 71 #define MACRO_HOSTPERFDATAFILE 72 #define MACRO_SERVICEPERFDATAFILE 73 #define MACRO_HOSTACTIONURL 74 #define MACRO_HOSTNOTESURL 75 #define MACRO_HOSTNOTES 76 #define MACRO_SERVICEACTIONURL 77 #define MACRO_SERVICENOTESURL 78 #define MACRO_SERVICENOTES 79 #define MACRO_TOTALHOSTSUP 80 #define MACRO_TOTALHOSTSDOWN 81 #define MACRO_TOTALHOSTSUNREACHABLE 82 #define MACRO_TOTALHOSTSDOWNUNHANDLED 83 #define MACRO_TOTALHOSTSUNREACHABLEUNHANDLED 84 #define MACRO_TOTALHOSTPROBLEMS 85 #define MACRO_TOTALHOSTPROBLEMSUNHANDLED 86 #define MACRO_TOTALSERVICESOK 87 #define MACRO_TOTALSERVICESWARNING 88 #define MACRO_TOTALSERVICESCRITICAL 89 #define MACRO_TOTALSERVICESUNKNOWN 90 #define MACRO_TOTALSERVICESWARNINGUNHANDLED 91 #define MACRO_TOTALSERVICESCRITICALUNHANDLED 92 #define MACRO_TOTALSERVICESUNKNOWNUNHANDLED 93 #define MACRO_TOTALSERVICEPROBLEMS 94 #define MACRO_TOTALSERVICEPROBLEMSUNHANDLED 95 #define MACRO_PROCESSSTARTTIME 96 #define MACRO_HOSTCHECKTYPE 97 #define MACRO_SERVICECHECKTYPE 98 #define MACRO_LONGHOSTOUTPUT 99 #define MACRO_LONGSERVICEOUTPUT 100 #define MACRO_TEMPPATH 101 #define MACRO_HOSTNOTIFICATIONNUMBER 102 #define MACRO_SERVICENOTIFICATIONNUMBER 103 #define MACRO_HOSTNOTIFICATIONID 104 #define MACRO_SERVICENOTIFICATIONID 105 #define MACRO_HOSTEVENTID 106 #define MACRO_LASTHOSTEVENTID 107 #define MACRO_SERVICEEVENTID 108 #define MACRO_LASTSERVICEEVENTID 109 #define MACRO_HOSTGROUPNAMES 110 #define MACRO_SERVICEGROUPNAMES 111 #define MACRO_HOSTACKAUTHORNAME 112 #define MACRO_HOSTACKAUTHORALIAS 113 #define MACRO_SERVICEACKAUTHORNAME 114 #define MACRO_SERVICEACKAUTHORALIAS 115 #define MACRO_MAXHOSTATTEMPTS 116 #define MACRO_MAXSERVICEATTEMPTS 117 #define MACRO_SERVICEISVOLATILE 118 #define MACRO_TOTALHOSTSERVICES 119 #define MACRO_TOTALHOSTSERVICESOK 120 #define MACRO_TOTALHOSTSERVICESWARNING 121 #define MACRO_TOTALHOSTSERVICESUNKNOWN 122 #define MACRO_TOTALHOSTSERVICESCRITICAL 123 #define MACRO_HOSTGROUPNOTES 124 #define MACRO_HOSTGROUPNOTESURL 125 #define MACRO_HOSTGROUPACTIONURL 126 #define MACRO_SERVICEGROUPNOTES 127 #define MACRO_SERVICEGROUPNOTESURL 128 #define MACRO_SERVICEGROUPACTIONURL 129 #define MACRO_HOSTGROUPMEMBERS 130 #define MACRO_SERVICEGROUPMEMBERS 131 #define MACRO_CONTACTGROUPNAME 132 #define MACRO_CONTACTGROUPALIAS 133 #define MACRO_CONTACTGROUPMEMBERS 134 #define MACRO_CONTACTGROUPNAMES 135 #define MACRO_NOTIFICATIONRECIPIENTS 136 #define MACRO_NOTIFICATIONISESCALATED 137 #define MACRO_NOTIFICATIONAUTHOR 138 #define MACRO_NOTIFICATIONAUTHORNAME 139 #define MACRO_NOTIFICATIONAUTHORALIAS 140 #define MACRO_NOTIFICATIONCOMMENT 141 #define MACRO_EVENTSTARTTIME 142 #define MACRO_HOSTPROBLEMID 143 #define MACRO_LASTHOSTPROBLEMID 144 #define MACRO_SERVICEPROBLEMID 145 #define MACRO_LASTSERVICEPROBLEMID 146 #define MACRO_ISVALIDTIME 147 #define MACRO_NEXTVALIDTIME 148 #define MACRO_LASTHOSTSTATE 149 #define MACRO_LASTHOSTSTATEID 150 #define MACRO_LASTSERVICESTATE 151 #define MACRO_LASTSERVICESTATEID 152 #define MACRO_HOSTIMPORTANCE 153 #define MACRO_SERVICEIMPORTANCE 154 #define MACRO_HOSTANDSERVICESIMPORTANCE 155 #define MACRO_HOSTGROUPMEMBERADDRESSES 156 #define MACRO_HOSTINFOURL 157 #define MACRO_SERVICEINFOURL 158 /************* MACRO CLEANING OPTIONS *****************/ #define STRIP_ILLEGAL_MACRO_CHARS 1 #define ESCAPE_MACRO_CHARS 2 #define URL_ENCODE_MACRO_CHARS 4 /****************** MACRO FUNCTIONS ******************/ nagios_macros *get_global_macros(void); /* * Replace macros with their actual values * This function modifies the global_macros struct and is thus * not thread-safe. */ int process_macros(char *, char **, int); /* thread-safe version of the above */ int process_macros_r(nagios_macros *mac, char *, char **, int); /* cleans macros characters before insertion into output string */ char *clean_macro_chars(char *, int); /* * These functions updates **macros with the values from * their respective object type. */ int grab_service_macros(service *); int grab_host_macros(host *); int grab_servicegroup_macros(servicegroup *); int grab_hostgroup_macros(hostgroup *); int grab_contact_macros(contact *); int grab_macro_value(char *, char **, int *, int *); int grab_macrox_value(int, char *, char *, char **, int *); int grab_custom_macro_value(char *, char *, char *, char **); int grab_datetime_macro(int, char *, char *, char **); int grab_standard_host_macro(int, host *, char **, int *); int grab_standard_hostgroup_macro(int, hostgroup *, char **); int grab_standard_service_macro(int, service *, char **, int *); int grab_standard_servicegroup_macro(int, servicegroup *, char **); int grab_standard_contact_macro(int, contact *, char **); int grab_contact_address_macro(int, contact *, char **); int grab_standard_contactgroup_macro(int, contactgroup *, char **); int grab_custom_object_macro(char *, customvariablesmember *, char **); /* thread-safe version of the above */ int grab_service_macros_r(nagios_macros *mac, service *); int grab_host_macros_r(nagios_macros *mac, host *); int grab_servicegroup_macros_r(nagios_macros *mac, servicegroup *); int grab_hostgroup_macros_r(nagios_macros *mac, hostgroup *); int grab_contact_macros_r(nagios_macros *mac, contact *); int grab_argv_macros_r(nagios_macros *mac, char *check_command); int grab_macro_value_r(nagios_macros *mac, char *, char **, int *, int *); int grab_macrox_value_r(nagios_macros *mac, int, char *, char *, char **, int *); int grab_custom_macro_value_r(nagios_macros *mac, char *, char *, char *, char **); int grab_datetime_macro_r(nagios_macros *mac, int, char *, char *, char **); int grab_standard_host_macro_r(nagios_macros *mac, int, host *, char **, int *); int grab_standard_hostgroup_macro_r(nagios_macros *mac, int, hostgroup *, char **); int grab_standard_service_macro_r(nagios_macros *mac, int, service *, char **, int *); int grab_standard_servicegroup_macro_r(nagios_macros *mac, int, servicegroup *, char **); int grab_standard_contact_macro_r(nagios_macros *mac, int, contact *, char **); int grab_custom_object_macro_r(nagios_macros *mac, char *, customvariablesmember *, char **); char *get_url_encoded_string(char *); /* URL encode a string */ int init_macros(void); int init_macrox_names(void); int free_macrox_names(void); extern void copy_constant_macros(char **dest); /* clear macros */ int clear_argv_macros(void); int clear_volatile_macros(void); int clear_host_macros(void); int clear_service_macros(void); int clear_hostgroup_macros(void); int clear_servicegroup_macros(void); int clear_contact_macros(void); int clear_contactgroup_macros(void); int clear_summary_macros(void); /* thread-safe version of the above */ int clear_argv_macros_r(nagios_macros *mac); int clear_volatile_macros_r(nagios_macros *mac); int clear_host_macros_r(nagios_macros *mac); int clear_service_macros_r(nagios_macros *mac); int clear_hostgroup_macros_r(nagios_macros *mac); int clear_servicegroup_macros_r(nagios_macros *mac); int clear_contact_macros_r(nagios_macros *mac); int clear_contactgroup_macros_r(nagios_macros *mac); int clear_summary_macros_r(nagios_macros *mac); int clear_datetime_macros_r(nagios_macros *mac); #ifndef NSCGI int set_all_macro_environment_vars(int); int set_macrox_environment_vars(int); int set_argv_macro_environment_vars(int); int set_custom_macro_environment_vars(int); int set_contact_address_environment_vars(int); int set_macro_environment_var(char *, char *, int); /* thread-safe version of the above */ int set_all_macro_environment_vars_r(nagios_macros *mac, int); int set_macrox_environment_vars_r(nagios_macros *mac, int); int set_argv_macro_environment_vars_r(nagios_macros *mac, int); int set_custom_macro_environment_vars_r(nagios_macros *mac, int); int set_contact_address_environment_vars_r(nagios_macros *mac, int); #endif NAGIOS_END_DECL #endif nagios-4.3.4/include/nagios.h000066400000000000000000001135661314764422400161010ustar00rootroot00000000000000/************************************************************************ * * Nagios Main Header File * Written By: Ethan Galstad (egalstad@nagios.org) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ************************************************************************/ #ifndef NAGIOS_NAGIOS_H_INCLUDED #define NAGIOS_NAGIOS_H_INCLUDED #ifndef NSCORE # define NSCORE #endif #include "defaults.h" #include "common.h" #include "logging.h" #include "locations.h" #include "objects.h" #include "macros.h" /* * global variables only used in the core. Reducing this list would be * a Good Thing(tm). */ extern char *nagios_binary_path; extern char *config_file; extern char *command_file; extern char *temp_file; extern char *temp_path; extern char *check_result_path; extern char *lock_file; extern char *object_precache_file; extern unsigned int nofile_limit, nproc_limit, max_apps; extern int num_check_workers; extern char *qh_socket_path; extern char *nagios_user; extern char *nagios_group; extern char *macro_user[MAX_USER_MACROS]; extern char *ocsp_command; extern char *ochp_command; extern command *ocsp_command_ptr; extern command *ochp_command_ptr; extern int ocsp_timeout; extern int ochp_timeout; extern char *global_host_event_handler; extern char *global_service_event_handler; extern command *global_host_event_handler_ptr; extern command *global_service_event_handler_ptr; extern char *illegal_object_chars; extern int use_regexp_matches; extern int use_true_regexp_matching; extern int use_syslog; extern char *log_file; extern char *log_archive_path; extern int log_notifications; extern int log_service_retries; extern int log_host_retries; extern int log_event_handlers; extern int log_external_commands; extern int log_passive_checks; extern unsigned long logging_options; extern unsigned long syslog_options; extern int service_check_timeout; extern int service_check_timeout_state; extern int host_check_timeout; extern int event_handler_timeout; extern int notification_timeout; extern int log_initial_states; extern int log_current_states; extern int daemon_dumps_core; extern int sig_id; extern int caught_signal; extern int verify_config; extern int test_scheduling; extern int precache_objects; extern int use_precached_objects; extern int service_inter_check_delay_method; extern int host_inter_check_delay_method; extern int service_interleave_factor_method; extern int max_host_check_spread; extern int max_service_check_spread; extern sched_info scheduling_info; extern int max_parallel_service_checks; extern int check_reaper_interval; extern int max_check_reaper_time; extern int service_freshness_check_interval; extern int host_freshness_check_interval; extern int auto_rescheduling_interval; extern int auto_rescheduling_window; extern int check_orphaned_services; extern int check_orphaned_hosts; extern int check_service_freshness; extern int check_host_freshness; extern int auto_reschedule_checks; extern int additional_freshness_latency; extern int check_for_updates; extern int bare_update_check; extern time_t last_update_check; extern unsigned long update_uid; extern int update_available; extern char *last_program_version; extern char *new_program_version; extern int use_aggressive_host_checking; extern time_t cached_host_check_horizon; extern time_t cached_service_check_horizon; extern int enable_predictive_host_dependency_checks; extern int enable_predictive_service_dependency_checks; extern int soft_state_dependencies; extern int retain_state_information; extern int retention_update_interval; extern int use_retained_program_state; extern int use_retained_scheduling_info; extern int retention_scheduling_horizon; extern char *retention_file; extern unsigned long retained_host_attribute_mask; extern unsigned long retained_service_attribute_mask; extern unsigned long retained_contact_host_attribute_mask; extern unsigned long retained_contact_service_attribute_mask; extern unsigned long retained_process_host_attribute_mask; extern unsigned long retained_process_service_attribute_mask; extern int translate_passive_host_checks; extern int passive_host_checks_are_soft; extern int status_update_interval; extern char *retention_file; extern int time_change_threshold; extern unsigned long event_broker_options; extern double low_service_flap_threshold; extern double high_service_flap_threshold; extern double low_host_flap_threshold; extern double high_host_flap_threshold; extern int use_large_installation_tweaks; extern int enable_environment_macros; extern int free_child_process_memory; extern int child_processes_fork_twice; extern char *use_timezone; extern time_t max_check_result_file_age; extern char *debug_file; extern int debug_level; extern int debug_verbosity; extern unsigned long max_debug_file_size; extern int allow_empty_hostgroup_assignment; extern int host_down_disable_service_checks; extern time_t last_program_stop; extern time_t event_start; extern int sigshutdown, sigrestart; extern int currently_running_service_checks; extern int currently_running_host_checks; extern unsigned long next_event_id; extern unsigned long next_problem_id; extern unsigned long next_comment_id; extern unsigned long next_notification_id; extern unsigned long modified_process_attributes; extern unsigned long modified_host_process_attributes; extern unsigned long modified_service_process_attributes; extern squeue_t *nagios_squeue; extern iobroker_set *nagios_iobs; extern struct check_stats check_statistics[MAX_CHECK_STATS_TYPES]; /*** perfdata variables ***/ extern int perfdata_timeout; extern char *host_perfdata_command; extern char *service_perfdata_command; extern char *host_perfdata_file_template; extern char *service_perfdata_file_template; extern char *host_perfdata_file; extern char *service_perfdata_file; extern int host_perfdata_file_append; extern int service_perfdata_file_append; extern int host_perfdata_file_pipe; extern int service_perfdata_file_pipe; extern unsigned long host_perfdata_file_processing_interval; extern unsigned long service_perfdata_file_processing_interval; extern char *host_perfdata_file_processing_command; extern char *service_perfdata_file_processing_command; extern int host_perfdata_process_empty_results; extern int service_perfdata_process_empty_results; /*** end perfdata variables */ extern struct notify_list *notification_list; extern struct check_engine nagios_check_engine; /* * Everything we need to keep system load in check. * Don't use this from modules. */ struct load_control { time_t last_check; /* last time we checked the real load */ time_t last_change; /* last time we changed settings */ time_t check_interval; /* seconds between load checks */ double load[3]; /* system load, as reported by getloadavg() */ float backoff_limit; /* limit we must reach before we back off */ float rampup_limit; /* limit we must reach before we ramp back up */ unsigned int backoff_change; /* backoff by this much */ unsigned int rampup_change; /* ramp up by this much */ unsigned int changes; /* number of times we've changed settings */ unsigned int jobs_max; /* upper setting for jobs_limit */ unsigned int jobs_limit; /* current limit */ unsigned int jobs_min; /* lower setting for jobs_limit */ unsigned int jobs_running; /* jobs currently running */ unsigned int nproc_limit; /* rlimit for user processes */ unsigned int nofile_limit; /* rlimit for open files */ unsigned int options; /* various option flags */ }; extern struct load_control loadctl; /* options for load control */ #define LOADCTL_ENABLED (1 << 0) /************* MISC LENGTH/SIZE DEFINITIONS ***********/ /* NOTE: Plugin length is artificially capped at 8k to prevent runaway plugins from returning MBs/GBs of data back to Nagios. If you increase the 8k cap by modifying this value, make sure you also increase the value of MAX_EXTERNAL_COMMAND_LENGTH in common.h to allow for passive checks results received through the external command file. EG 10/19/07 */ #define MAX_PLUGIN_OUTPUT_LENGTH 8192 /* max length of plugin output (including perf data) */ /******************* STATE LOGGING TYPES **************/ #define INITIAL_STATES 1 #define CURRENT_STATES 2 /************ SERVICE DEPENDENCY VALUES ***************/ #define DEPENDENCIES_OK 0 #define DEPENDENCIES_FAILED 1 /*********** ROUTE CHECK PROPAGATION TYPES ************/ #define PROPAGATE_TO_PARENT_HOSTS 1 #define PROPAGATE_TO_CHILD_HOSTS 2 /****************** FLAPPING TYPES ********************/ #define HOST_FLAPPING 0 #define SERVICE_FLAPPING 1 /**************** NOTIFICATION TYPES ******************/ #define HOST_NOTIFICATION 0 #define SERVICE_NOTIFICATION 1 /************* NOTIFICATION REASON TYPES ***************/ #define NOTIFICATION_NORMAL 0 #define NOTIFICATION_ACKNOWLEDGEMENT 1 #define NOTIFICATION_FLAPPINGSTART 2 #define NOTIFICATION_FLAPPINGSTOP 3 #define NOTIFICATION_FLAPPINGDISABLED 4 #define NOTIFICATION_DOWNTIMESTART 5 #define NOTIFICATION_DOWNTIMEEND 6 #define NOTIFICATION_DOWNTIMECANCELLED 7 #define NOTIFICATION_CUSTOM 8 /**************** EVENT HANDLER TYPES *****************/ #define HOST_EVENTHANDLER 0 #define SERVICE_EVENTHANDLER 1 #define GLOBAL_HOST_EVENTHANDLER 2 #define GLOBAL_SERVICE_EVENTHANDLER 3 /***************** STATE CHANGE TYPES *****************/ #define HOST_STATECHANGE 0 #define SERVICE_STATECHANGE 1 /***************** OBJECT CHECK TYPES *****************/ #define SERVICE_CHECK 0 #define HOST_CHECK 1 /******************* EVENT TYPES **********************/ #define EVENT_SERVICE_CHECK 0 /* active service check */ #define EVENT_COMMAND_CHECK 1 /* external command check */ #define EVENT_LOG_ROTATION 2 /* log file rotation */ #define EVENT_PROGRAM_SHUTDOWN 3 /* program shutdown */ #define EVENT_PROGRAM_RESTART 4 /* program restart */ #define EVENT_CHECK_REAPER 5 /* reaps results from host and service checks */ #define EVENT_ORPHAN_CHECK 6 /* checks for orphaned hosts and services */ #define EVENT_RETENTION_SAVE 7 /* save (dump) retention data */ #define EVENT_STATUS_SAVE 8 /* save (dump) status data */ #define EVENT_SCHEDULED_DOWNTIME 9 /* scheduled host or service downtime */ #define EVENT_SFRESHNESS_CHECK 10 /* checks service result "freshness" */ #define EVENT_EXPIRE_DOWNTIME 11 /* checks for (and removes) expired scheduled downtime */ #define EVENT_HOST_CHECK 12 /* active host check */ #define EVENT_HFRESHNESS_CHECK 13 /* checks host result "freshness" */ #define EVENT_RESCHEDULE_CHECKS 14 /* adjust scheduling of host and service checks */ #define EVENT_EXPIRE_COMMENT 15 /* removes expired comments */ #define EVENT_CHECK_PROGRAM_UPDATE 16 /* checks for new version of Nagios */ #define EVENT_SLEEP 98 /* asynchronous sleep event that occurs when event queues are empty */ #define EVENT_USER_FUNCTION 99 /* USER-defined function (modules) */ /* * VERSIONFIX: Make EVENT_SLEEP and EVENT_USER_FUNCTION appear * linearly in order. */ #define EVENT_TYPE_STR(type) ( \ type == EVENT_SERVICE_CHECK ? "SERVICE_CHECK" : \ type == EVENT_COMMAND_CHECK ? "COMMAND_CHECK" : \ type == EVENT_LOG_ROTATION ? "LOG_ROTATION" : \ type == EVENT_PROGRAM_SHUTDOWN ? "PROGRAM_SHUTDOWN" : \ type == EVENT_PROGRAM_RESTART ? "PROGRAM_RESTART" : \ type == EVENT_CHECK_REAPER ? "CHECK_REAPER" : \ type == EVENT_ORPHAN_CHECK ? "ORPHAN_CHECK" : \ type == EVENT_RETENTION_SAVE ? "RETENTION_SAVE" : \ type == EVENT_STATUS_SAVE ? "STATUS_SAVE" : \ type == EVENT_SCHEDULED_DOWNTIME ? "SCHEDULED_DOWNTIME" : \ type == EVENT_SFRESHNESS_CHECK ? "SFRESHNESS_CHECK" : \ type == EVENT_EXPIRE_DOWNTIME ? "EXPIRE_DOWNTIME" : \ type == EVENT_HOST_CHECK ? "HOST_CHECK" : \ type == EVENT_HFRESHNESS_CHECK ? "HFRESHNESS_CHECK" : \ type == EVENT_RESCHEDULE_CHECKS ? "RESCHEDULE_CHECKS" : \ type == EVENT_EXPIRE_COMMENT ? "EXPIRE_COMMENT" : \ type == EVENT_CHECK_PROGRAM_UPDATE ? "CHECK_PROGRAM_UPDATE" : \ type == EVENT_SLEEP ? "SLEEP" : \ type == EVENT_USER_FUNCTION ? "USER_FUNCTION" : \ "UNKNOWN" \ ) /******* INTER-CHECK DELAY CALCULATION TYPES **********/ #define ICD_NONE 0 /* no inter-check delay */ #define ICD_DUMB 1 /* dumb delay of 1 second */ #define ICD_SMART 2 /* smart delay */ #define ICD_USER 3 /* user-specified delay */ /******* INTERLEAVE FACTOR CALCULATION TYPES **********/ #define ILF_USER 0 /* user-specified interleave factor */ #define ILF_SMART 1 /* smart interleave */ /************ SCHEDULED DOWNTIME TYPES ****************/ #define ACTIVE_DOWNTIME 0 /* active downtime - currently in effect */ #define PENDING_DOWNTIME 1 /* pending downtime - scheduled for the future */ NAGIOS_BEGIN_DECL /* useful for hosts and services to determine time 'til next check */ #define normal_check_window(o) ((time_t)(o->check_interval * interval_length)) #define retry_check_window(o) ((time_t)(o->retry_interval * interval_length)) #define check_window(o) \ ((o->current_state && o->state_type == SOFT_STATE) ? \ retry_check_window(o) : \ normal_check_window(o)) /** Nerd subscription type */ struct nerd_subscription { int sd; struct nerd_channel *chan; char *format; /* requested format (macro string) for this subscription */ }; /******************** FUNCTIONS **********************/ extern int set_loadctl_options(char *opts, unsigned int len); /* silly helpers useful pretty much all over the place */ extern const char *service_state_name(int state); extern const char *host_state_name(int state); extern const char *state_type_name(int state_type); extern const char *check_type_name(int check_type); extern const char *check_result_source(check_result *cr); /*** Nagios Event Radio Dispatcher functions ***/ extern int nerd_init(void); extern int nerd_mkchan(const char *name, const char *description, int (*handler)(int, void *), unsigned int callbacks); extern int nerd_cancel_subscriber(int sd); extern int nerd_get_channel_id(const char *chan_name); extern objectlist *nerd_get_subscriptions(int chan_id); extern int nerd_broadcast(unsigned int chan_id, void *buf, unsigned int len); /*** Query Handler functions, types and macros*/ typedef int (*qh_handler)(int, char *, unsigned int); extern int dump_event_stats(int sd); /* return codes for query_handlers() */ #define QH_OK 0 /* keep listening */ #define QH_CLOSE 1 /* we should close the socket */ #define QH_INVALID 2 /* invalid query. Log and close */ #define QH_TAKEOVER 3 /* handler will take full control. de-register but don't close */ extern int qh_init(const char *path); extern void qh_deinit(const char *path); extern int qh_register_handler(const char *name, const char *description, unsigned int options, qh_handler handler); extern const char *qh_strerror(int code); /**** Configuration Functions ****/ int read_main_config_file(char *); /* reads the main config file (nagios.cfg) */ int read_resource_file(char *); /* processes macros in resource file */ int read_all_object_data(char *); /* reads all object config data */ /**** Setup Functions ****/ int pre_flight_check(void); /* try and verify the configuration data */ int pre_flight_object_check(int *, int *); /* verify object relationships and settings */ int pre_flight_circular_check(int *, int *); /* detects circular dependencies and paths */ void init_timing_loop(void); /* setup the initial scheduling queue */ void setup_sighandler(void); /* trap signals */ void reset_sighandler(void); /* reset signals to default action */ extern void handle_sigxfsz(int); /* handle SIGXFSZ */ int daemon_init(void); /* switches to daemon mode */ int drop_privileges(char *, char *); /* drops privileges before startup */ void display_scheduling_info(void); /* displays service check scheduling information */ void init_main_cfg_vars(int); /* Initialize the non-shared main configuration variables */ /**** Event Queue Functions ****/ int init_event_queue(void); /* creates the queue nagios_squeue */ timed_event *schedule_new_event(int, int, time_t, int, unsigned long, void *, int, void *, void *, int); /* schedules a new timed event */ void reschedule_event(squeue_t *sq, timed_event *event); /* reschedules an event */ void add_event(squeue_t *sq, timed_event *event); /* adds an event to the execution queue */ void remove_event(squeue_t *sq, timed_event *event); /* remove an event from the execution queue */ int event_execution_loop(void); /* main monitoring/event handler loop */ int handle_timed_event(timed_event *); /* top level handler for timed events */ void adjust_check_scheduling(void); /* auto-adjusts scheduling of host and service checks */ void compensate_for_system_time_change(unsigned long, unsigned long); /* attempts to compensate for a change in the system time */ void adjust_timestamp_for_time_change(time_t, time_t, unsigned long, time_t *); /* adjusts a timestamp variable for a system time change */ /**** IPC Functions ****/ int process_check_result_queue(char *); int process_check_result_file(char *); int process_check_result(check_result *); int delete_check_result_file(char *); int init_check_result(check_result *); int free_check_result(check_result *); /* frees memory associated with a host/service check result */ int parse_check_output(char *, char **, char **, char **, int, int); int open_command_file(void); /* creates the external command file as a named pipe (FIFO) and opens it for reading */ int close_command_file(void); /* closes and deletes the external command file (FIFO) */ /**** Monitoring/Event Handler Functions ****/ int check_service_parents(service *svc); /* checks service parents */ int check_service_dependencies(service *, int); /* checks service dependencies */ int check_host_dependencies(host *, int); /* checks host dependencies */ void check_for_orphaned_services(void); /* checks for orphaned services */ void check_for_orphaned_hosts(void); /* checks for orphaned hosts */ void check_service_result_freshness(void); /* checks the "freshness" of service check results */ int is_service_result_fresh(service *, time_t, int); /* determines if a service's check results are fresh */ void check_host_result_freshness(void); /* checks the "freshness" of host check results */ int is_host_result_fresh(host *, time_t, int); /* determines if a host's check results are fresh */ int my_system(char *, int, int *, double *, char **, int); /* executes a command via popen(), but also protects against timeouts */ int my_system_r(nagios_macros *mac, char *, int, int *, double *, char **, int); /* thread-safe version of the above */ /**** Flap Detection Functions ****/ void check_for_service_flapping(service *, int, int); /* determines whether or not a service is "flapping" between states */ void check_for_host_flapping(host *, int, int, int); /* determines whether or not a host is "flapping" between states */ void set_service_flap(service *, double, double, double, int); /* handles a service that is flapping */ void clear_service_flap(service *, double, double, double, int); /* handles a service that has stopped flapping */ void set_host_flap(host *, double, double, double, int); /* handles a host that is flapping */ void clear_host_flap(host *, double, double, double, int); /* handles a host that has stopped flapping */ void enable_flap_detection_routines(void); /* enables flap detection on a program-wide basis */ void disable_flap_detection_routines(void); /* disables flap detection on a program-wide basis */ void enable_host_flap_detection(host *); /* enables flap detection for a particular host */ void disable_host_flap_detection(host *); /* disables flap detection for a particular host */ void enable_service_flap_detection(service *); /* enables flap detection for a particular service */ void disable_service_flap_detection(service *); /* disables flap detection for a particular service */ void handle_host_flap_detection_disabled(host *); /* handles the details when flap detection is disabled globally or on a per-host basis */ void handle_service_flap_detection_disabled(service *); /* handles the details when flap detection is disabled globally or on a per-service basis */ /**** Route/Host Check Functions ****/ int check_host_check_viability(host *, int, int *, time_t *); int adjust_host_check_attempt(host *, int); int determine_host_reachability(host *); int process_host_check_result(host *, int, char *, int, int, int, unsigned long); int perform_on_demand_host_check(host *, int *, int, int, unsigned long); int execute_sync_host_check(host *); int run_scheduled_host_check(host *, int, double); int run_async_host_check(host *, int, double, int, int, int *, time_t *); int handle_async_host_check_result(host *, check_result *); /**** Service Check Functions ****/ int check_service_check_viability(service *, int, int *, time_t *); int run_scheduled_service_check(service *, int, double); int run_async_service_check(service *, int, double, int, int, int *, time_t *); int handle_async_service_check_result(service *, check_result *); /**** Event Handler Functions ****/ int handle_host_state(host *); /* top level host state handler */ /**** Common Check Functions *****/ int reap_check_results(void); /**** Check Statistics Functions ****/ int init_check_stats(void); int update_check_stats(int, time_t); int generate_check_stats(void); /**** Event Handler Functions ****/ int obsessive_compulsive_service_check_processor(service *); /* distributed monitoring craziness... */ int obsessive_compulsive_host_check_processor(host *); /* distributed monitoring craziness... */ int handle_service_event(service *); /* top level service event logic */ int run_service_event_handler(nagios_macros *mac, service *); /* runs the event handler for a specific service */ int run_global_service_event_handler(nagios_macros *mac, service *); /* runs the global service event handler */ int handle_host_event(host *); /* top level host event logic */ int run_host_event_handler(nagios_macros *mac, host *); /* runs the event handler for a specific host */ int run_global_host_event_handler(nagios_macros *mac, host *); /* runs the global host event handler */ /**** Notification Functions ****/ const char *notification_reason_name(unsigned int reason_type); int check_service_notification_viability(service *, int, int); /* checks viability of notifying all contacts about a service */ int is_valid_escalation_for_service_notification(service *, serviceescalation *, int); /* checks if an escalation entry is valid for a particular service notification */ int should_service_notification_be_escalated(service *); /* checks if a service notification should be escalated */ int service_notification(service *, int, char *, char *, int); /* notify all contacts about a service (problem or recovery) */ int check_contact_service_notification_viability(contact *, service *, int, int); /* checks viability of notifying a contact about a service */ int notify_contact_of_service(nagios_macros *mac, contact *, service *, int, char *, char *, int, int); /* notify a single contact about a service */ int check_host_notification_viability(host *, int, int); /* checks viability of notifying all contacts about a host */ int is_valid_escalation_for_host_notification(host *, hostescalation *, int); /* checks if an escalation entry is valid for a particular host notification */ int should_host_notification_be_escalated(host *); /* checks if a host notification should be escalated */ int host_notification(host *, int, char *, char *, int); /* notify all contacts about a host (problem or recovery) */ int check_contact_host_notification_viability(contact *, host *, int, int); /* checks viability of notifying a contact about a host */ int notify_contact_of_host(nagios_macros *mac, contact *, host *, int, char *, char *, int, int); /* notify a single contact about a host */ int create_notification_list_from_host(nagios_macros *mac, host *,int,int *,int); /* given a host, create list of contacts to be notified (remove duplicates) */ int create_notification_list_from_service(nagios_macros *mac, service *,int,int *,int); /* given a service, create list of contacts to be notified (remove duplicates) */ int add_notification(nagios_macros *mac, contact *); /* adds a notification instance */ notification *find_notification(contact *); /* finds a notification object */ time_t get_next_host_notification_time(host *, time_t); /* calculates nex acceptable re-notification time for a host */ time_t get_next_service_notification_time(service *, time_t); /* calculates nex acceptable re-notification time for a service */ /**** Cleanup Functions ****/ void cleanup(void); /* cleanup after ourselves (before quitting or restarting) */ void free_memory(nagios_macros *mac); /* free memory allocated to all linked lists in memory */ int reset_variables(void); /* reset all global variables */ void free_notification_list(void); /* frees all memory allocated to the notification list */ /**** Miscellaneous Functions ****/ void sighandler(int); /* handles signals */ void my_system_sighandler(int); /* handles timeouts when executing commands via my_system() */ char *get_next_string_from_buf(char *buf, int *start_index, int bufsize); int compare_strings(char *, char *); /* compares two strings for equality */ char *escape_newlines(char *); /** * Unescapes newlines and backslashes in a check result output string read from * a source that uses newlines as a delimiter (e.g., files in the checkresults * spool dir, or the command pipe). * @note: There is an unescape_newlines() in cgi/cgiutils.c that unescapes more * than '\\' and '\n' in place. Since this function is specifically intended * for processing escaped plugin output, we'll use a more specific name to * avoid confusion and conflicts. * @param rawbuf Input string tp unescape. * @return An unescaped copy of rawbuf in a newly allocated string, or NULL if * rawbuf is NULL or no memory could be allocated for the new string. */ char *unescape_check_result_output(const char *rawbuf); int contains_illegal_object_chars(char *); /* tests whether or not an object name (host, service, etc.) contains illegal characters */ int my_rename(char *, char *); /* renames a file - works across filesystems */ int my_fcopy(char *, char *); /* copies a file - works across filesystems */ int my_fdcopy(char *, char *, int); /* copies a named source to an already opened destination file */ /* thread-safe version of get_raw_command_line_r() */ extern int get_raw_command_line_r(nagios_macros *mac, command *, char *, char **, int); /* * given a raw command line, determine the actual command to run * Manipulates global_macros.argv and is thus not threadsafe */ extern int get_raw_command_line(command *, char *, char **, int); int check_time_against_period(time_t, timeperiod *); /* check to see if a specific time is covered by a time period */ int is_daterange_single_day(daterange *); time_t calculate_time_from_weekday_of_month(int, int, int, int); /* calculates midnight time of specific (3rd, last, etc.) weekday of a particular month */ time_t calculate_time_from_day_of_month(int, int, int); /* calculates midnight time of specific (1st, last, etc.) day of a particular month */ void get_next_valid_time(time_t, time_t *, timeperiod *); /* get the next valid time in a time period */ time_t get_next_log_rotation_time(void); /* determine the next time to schedule a log rotation */ int dbuf_init(dbuf *, int); int dbuf_free(dbuf *); int dbuf_strcat(dbuf *, const char *); int set_environment_var(char *, char *, int); /* sets/clears and environment variable */ int check_for_nagios_updates(int, int); /* checks to see if new version of Nagios are available */ int query_update_api(void); /* checks to see if new version of Nagios are available */ /**** External Command Functions ****/ int process_external_command1(char *); /* top-level external command processor */ int process_external_command2(int, time_t, char *); /* process an external command */ int process_external_commands_from_file(char *, int); /* process external commands in a file */ int process_host_command(int, time_t, char *); /* process an external host command */ int process_hostgroup_command(int, time_t, char *); /* process an external hostgroup command */ int process_service_command(int, time_t, char *); /* process an external service command */ int process_servicegroup_command(int, time_t, char *); /* process an external servicegroup command */ int process_contact_command(int, time_t, char *); /* process an external contact command */ int process_contactgroup_command(int, time_t, char *); /* process an external contactgroup command */ /**** External Command Implementations ****/ int cmd_add_comment(int, time_t, char *); /* add a service or host comment */ int cmd_delete_comment(int, char *); /* delete a service or host comment */ int cmd_delete_all_comments(int, char *); /* delete all comments associated with a host or service */ int cmd_delay_notification(int, char *); /* delay a service or host notification */ int cmd_schedule_check(int, char *); /* schedule an immediate or delayed host check */ int cmd_schedule_host_service_checks(int, char *, int); /* schedule an immediate or delayed checks of all services on a host */ int cmd_signal_process(int, char *); /* schedules a program shutdown or restart */ int cmd_process_service_check_result(int, time_t, char *); /* processes a passive service check */ int cmd_process_host_check_result(int, time_t, char *); /* processes a passive host check */ int cmd_acknowledge_problem(int, char *); /* acknowledges a host or service problem */ int cmd_remove_acknowledgement(int, char *); /* removes a host or service acknowledgement */ int cmd_schedule_downtime(int, time_t, char *); /* schedules host or service downtime */ int cmd_delete_downtime(int, char *); /* cancels active/pending host or service scheduled downtime */ int cmd_change_object_int_var(int, char *); /* changes host/svc (int) variable */ int cmd_change_object_char_var(int, char *); /* changes host/svc (char) variable */ int cmd_change_object_custom_var(int, char *); /* changes host/svc custom variable */ int cmd_process_external_commands_from_file(int, char *); /* process external commands from a file */ int cmd_delete_downtime_by_start_time_comment(int, char *); int cmd_delete_downtime_by_host_name(int, char *); int cmd_delete_downtime_by_hostgroup_name(int, char *); int process_passive_service_check(time_t, char *, char *, int, char *); int process_passive_host_check(time_t, char *, int, char *); /**** Internal Command Implementations ****/ void disable_service_checks(service *); /* disables a service check */ void enable_service_checks(service *); /* enables a service check */ void schedule_service_check(service *, time_t, int); /* schedules an immediate or delayed service check */ void schedule_host_check(host *, time_t, int); /* schedules an immediate or delayed host check */ void enable_all_notifications(void); /* enables notifications on a program-wide basis */ void disable_all_notifications(void); /* disables notifications on a program-wide basis */ void enable_service_notifications(service *); /* enables service notifications */ void disable_service_notifications(service *); /* disables service notifications */ void enable_host_notifications(host *); /* enables host notifications */ void disable_host_notifications(host *); /* disables host notifications */ void enable_and_propagate_notifications(host *, int, int, int, int); /* enables notifications for all hosts and services beyond a given host */ void disable_and_propagate_notifications(host *, int, int, int, int); /* disables notifications for all hosts and services beyond a given host */ void schedule_and_propagate_downtime(host *, time_t, char *, char *, time_t, time_t, int, unsigned long, unsigned long); /* schedules downtime for all hosts beyond a given host */ void acknowledge_host_problem(host *, char *, char *, int, int, int); /* acknowledges a host problem */ void acknowledge_service_problem(service *, char *, char *, int, int, int); /* acknowledges a service problem */ void remove_host_acknowledgement(host *); /* removes a host acknowledgement */ void remove_service_acknowledgement(service *); /* removes a service acknowledgement */ void start_executing_service_checks(void); /* starts executing service checks */ void stop_executing_service_checks(void); /* stops executing service checks */ void start_accepting_passive_service_checks(void); /* starts accepting passive service check results */ void stop_accepting_passive_service_checks(void); /* stops accepting passive service check results */ void enable_passive_service_checks(service *); /* enables passive service checks for a particular service */ void disable_passive_service_checks(service *); /* disables passive service checks for a particular service */ void start_using_event_handlers(void); /* enables event handlers on a program-wide basis */ void stop_using_event_handlers(void); /* disables event handlers on a program-wide basis */ void enable_service_event_handler(service *); /* enables the event handler for a particular service */ void disable_service_event_handler(service *); /* disables the event handler for a particular service */ void enable_host_event_handler(host *); /* enables the event handler for a particular host */ void disable_host_event_handler(host *); /* disables the event handler for a particular host */ void enable_host_checks(host *); /* enables checks of a particular host */ void disable_host_checks(host *); /* disables checks of a particular host */ void start_obsessing_over_service_checks(void); /* start obsessing about service check results */ void stop_obsessing_over_service_checks(void); /* stop obsessing about service check results */ void start_obsessing_over_host_checks(void); /* start obsessing about host check results */ void stop_obsessing_over_host_checks(void); /* stop obsessing about host check results */ void enable_service_freshness_checks(void); /* enable service freshness checks */ void disable_service_freshness_checks(void); /* disable service freshness checks */ void enable_host_freshness_checks(void); /* enable host freshness checks */ void disable_host_freshness_checks(void); /* disable host freshness checks */ void enable_performance_data(void); /* enables processing of performance data on a program-wide basis */ void disable_performance_data(void); /* disables processing of performance data on a program-wide basis */ void start_executing_host_checks(void); /* starts executing host checks */ void stop_executing_host_checks(void); /* stops executing host checks */ void start_accepting_passive_host_checks(void); /* starts accepting passive host check results */ void stop_accepting_passive_host_checks(void); /* stops accepting passive host check results */ void enable_passive_host_checks(host *); /* enables passive host checks for a particular host */ void disable_passive_host_checks(host *); /* disables passive host checks for a particular host */ void start_obsessing_over_service(service *); /* start obsessing about specific service check results */ void stop_obsessing_over_service(service *); /* stop obsessing about specific service check results */ void start_obsessing_over_host(host *); /* start obsessing about specific host check results */ void stop_obsessing_over_host(host *); /* stop obsessing about specific host check results */ void set_host_notification_number(host *, int); /* sets current notification number for a specific host */ void set_service_notification_number(service *, int); /* sets current notification number for a specific service */ void enable_contact_host_notifications(contact *); /* enables host notifications for a specific contact */ void disable_contact_host_notifications(contact *); /* disables host notifications for a specific contact */ void enable_contact_service_notifications(contact *); /* enables service notifications for a specific contact */ void disable_contact_service_notifications(contact *); /* disables service notifications for a specific contact */ void clear_host_flapping_state(host *); /* clears the flapping state for a specific host */ void clear_service_flapping_state(service *); /* clears the flapping state for a specific service */ int launch_command_file_worker(void); int shutdown_command_file_worker(void); char *get_program_version(void); char *get_program_modification_date(void); NAGIOS_END_DECL #endif nagios-4.3.4/include/nebcallbacks.h000066400000000000000000000056111314764422400172140ustar00rootroot00000000000000/***************************************************************************** * * NEBCALLBACKS.H - Include file for event broker modules * * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #ifndef NAGIOS_NEBCALLBACKS_H_INCLUDED #define NAGIOS_NEBCALLBACKS_H_INCLUDED #include "nebmodules.h" /***** CALLBACK TYPES *****/ #define NEBCALLBACK_NUMITEMS 26 /* total number of callback types we have */ #define NEBCALLBACK_PROCESS_DATA 0 #define NEBCALLBACK_TIMED_EVENT_DATA 1 #define NEBCALLBACK_LOG_DATA 2 #define NEBCALLBACK_SYSTEM_COMMAND_DATA 3 #define NEBCALLBACK_EVENT_HANDLER_DATA 4 #define NEBCALLBACK_NOTIFICATION_DATA 5 #define NEBCALLBACK_SERVICE_CHECK_DATA 6 #define NEBCALLBACK_HOST_CHECK_DATA 7 #define NEBCALLBACK_COMMENT_DATA 8 #define NEBCALLBACK_DOWNTIME_DATA 9 #define NEBCALLBACK_FLAPPING_DATA 10 #define NEBCALLBACK_PROGRAM_STATUS_DATA 11 #define NEBCALLBACK_HOST_STATUS_DATA 12 #define NEBCALLBACK_SERVICE_STATUS_DATA 13 #define NEBCALLBACK_ADAPTIVE_PROGRAM_DATA 14 #define NEBCALLBACK_ADAPTIVE_HOST_DATA 15 #define NEBCALLBACK_ADAPTIVE_SERVICE_DATA 16 #define NEBCALLBACK_EXTERNAL_COMMAND_DATA 17 #define NEBCALLBACK_AGGREGATED_STATUS_DATA 18 #define NEBCALLBACK_RETENTION_DATA 19 #define NEBCALLBACK_CONTACT_NOTIFICATION_DATA 20 #define NEBCALLBACK_CONTACT_NOTIFICATION_METHOD_DATA 21 #define NEBCALLBACK_ACKNOWLEDGEMENT_DATA 22 #define NEBCALLBACK_STATE_CHANGE_DATA 23 #define NEBCALLBACK_CONTACT_STATUS_DATA 24 #define NEBCALLBACK_ADAPTIVE_CONTACT_DATA 25 #define nebcallback_flag(x) (1 << (x)) /***** CALLBACK FUNCTIONS *****/ NAGIOS_BEGIN_DECL int neb_register_callback(int callback_type, void *mod_handle, int priority, int (*callback_func)(int, void *)); int neb_deregister_callback(int callback_type, int (*callback_func)(int, void *)); int neb_deregister_module_callbacks(nebmodule *); NAGIOS_END_DECL #endif nagios-4.3.4/include/neberrors.h000066400000000000000000000042061314764422400166100ustar00rootroot00000000000000/***************************************************************************** * * NEBERRORS.H - Event broker errors * * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #ifndef NAGIOS_NEBERRORS_H_INCLUDED #define NAGIOS_NEBERRORS_H_INCLUDED /***** GENERIC DEFINES *****/ #define NEB_OK 0 #define NEB_ERROR -1 #define NEB_TRUE 1 #define NEB_FALSE 0 /***** GENERIC ERRORS *****/ #define NEBERROR_NOMEM 100 /* memory could not be allocated */ /***** CALLBACK ERRORS *****/ #define NEBERROR_NOCALLBACKFUNC 200 /* no callback function was specified */ #define NEBERROR_NOCALLBACKLIST 201 /* callback list not initialized */ #define NEBERROR_CALLBACKBOUNDS 202 /* callback type was out of bounds */ #define NEBERROR_CALLBACKNOTFOUND 203 /* the callback could not be found */ #define NEBERROR_NOMODULEHANDLE 204 /* no module handle specified */ #define NEBERROR_BADMODULEHANDLE 205 /* bad module handle */ #define NEBERROR_CALLBACKOVERRIDE 206 /* module wants to override default Nagios handling of event */ #define NEBERROR_CALLBACKCANCEL 207 /* module wants to cancel callbacks to other modules */ /***** MODULE ERRORS *****/ #define NEBERROR_NOMODULE 300 /* no module was specified */ /***** MODULE INFO ERRORS *****/ #define NEBERROR_MODINFOBOUNDS 400 /* module info index was out of bounds */ #endif nagios-4.3.4/include/nebmods.h000066400000000000000000000033661314764422400162440ustar00rootroot00000000000000/***************************************************************************** * * NEBMODS.H - Include file for event broker modules * * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #ifndef NAGIOS_NEBMODS_H_INCLUDED #define NAGIOS_NEBMODS_H_INCLUDED #include "nebcallbacks.h" #include "nebmodules.h" NAGIOS_BEGIN_DECL /***** MODULE STRUCTURES *****/ /* NEB module callback list struct */ typedef struct nebcallback_struct { void *callback_func; void *module_handle; int priority; struct nebcallback_struct *next; } nebcallback; /***** MODULE FUNCTIONS *****/ int neb_init_modules(void); int neb_deinit_modules(void); int neb_load_all_modules(void); int neb_load_module(nebmodule *); int neb_free_module_list(void); int neb_unload_all_modules(int, int); int neb_unload_module(nebmodule *, int, int); int neb_add_module(char *, char *, int); int neb_add_core_module(nebmodule *mod); /***** CALLBACK FUNCTIONS *****/ int neb_init_callback_list(void); int neb_free_callback_list(void); int neb_make_callbacks(int, void *); NAGIOS_END_DECL #endif nagios-4.3.4/include/nebmodules.h000066400000000000000000000055431314764422400167510ustar00rootroot00000000000000/***************************************************************************** * * NEBMODULES.H - Include file for event broker modules * * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #ifndef NAGIOS_NEBMODULES_H_INCLUDED #define NAGIOS_NEBMODULES_H_INCLUDED #include "common.h" NAGIOS_BEGIN_DECL /***** MODULE VERSION INFORMATION *****/ #define NEB_API_VERSION(x) int __neb_api_version = x; #define CURRENT_NEB_API_VERSION 4 /***** MODULE INFORMATION *****/ #define NEBMODULE_MODINFO_NUMITEMS 6 #define NEBMODULE_MODINFO_TITLE 0 #define NEBMODULE_MODINFO_AUTHOR 1 #define NEBMODULE_MODINFO_COPYRIGHT 2 #define NEBMODULE_MODINFO_VERSION 3 #define NEBMODULE_MODINFO_LICENSE 4 #define NEBMODULE_MODINFO_DESC 5 /***** MODULE LOAD/UNLOAD OPTIONS *****/ #define NEBMODULE_NORMAL_LOAD 0 /* module is being loaded normally */ #define NEBMODULE_REQUEST_UNLOAD 0 /* request module to unload (but don't force it) */ #define NEBMODULE_FORCE_UNLOAD 1 /* force module to unload */ /***** MODULES UNLOAD REASONS *****/ #define NEBMODULE_NEB_SHUTDOWN 1 /* event broker is shutting down */ #define NEBMODULE_NEB_RESTART 2 /* event broker is restarting */ #define NEBMODULE_ERROR_NO_INIT 3 /* _module_init() function was not found in module */ #define NEBMODULE_ERROR_BAD_INIT 4 /* _module_init() function returned a bad code */ #define NEBMODULE_ERROR_API_VERSION 5 /* module version is incompatible with current api */ /***** MODULE STRUCTURES *****/ /* NEB module structure */ typedef struct nebmodule_struct { char *filename; char *dl_file; /* the file we actually loaded */ char *args; char *info[NEBMODULE_MODINFO_NUMITEMS]; int should_be_loaded; int is_currently_loaded; int core_module; #ifdef USE_LTDL lt_dlhandle module_handle; lt_ptr init_func; lt_ptr deinit_func; #else void *module_handle; void *init_func; void *deinit_func; #endif struct nebmodule_struct *next; } nebmodule; /***** MODULE FUNCTIONS *****/ int neb_set_module_info(void *, int, char *); NAGIOS_END_DECL #endif nagios-4.3.4/include/nebstructs.h000066400000000000000000000326031314764422400170050ustar00rootroot00000000000000/***************************************************************************** * * NEBSTRUCTS.H - Event broker includes for Nagios * * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #ifndef NAGIOS_NEBSTRUCTS_H_INCLUDED #define NAGIOS_NEBSTRUCTS_H_INCLUDED #include "common.h" #include "objects.h" #include "nagios.h" NAGIOS_BEGIN_DECL /****** STRUCTURES *************************/ /* process data structure */ typedef struct nebstruct_process_struct { int type; int flags; int attr; struct timeval timestamp; } nebstruct_process_data; /* timed event data structure */ typedef struct nebstruct_timed_event_struct { int type; int flags; int attr; struct timeval timestamp; int event_type; int recurring; time_t run_time; void *event_data; void *event_ptr; } nebstruct_timed_event_data; /* log data structure */ typedef struct nebstruct_log_struct { int type; int flags; int attr; struct timeval timestamp; time_t entry_time; int data_type; char *data; } nebstruct_log_data; /* system command structure */ typedef struct nebstruct_system_command_struct { int type; int flags; int attr; struct timeval timestamp; struct timeval start_time; struct timeval end_time; int timeout; char *command_line; int early_timeout; double execution_time; int return_code; char *output; } nebstruct_system_command_data; /* event handler structure */ typedef struct nebstruct_event_handler_struct { int type; int flags; int attr; struct timeval timestamp; int eventhandler_type; char *host_name; char *service_description; int state_type; int state; int timeout; char *command_name; char *command_args; char *command_line; struct timeval start_time; struct timeval end_time; int early_timeout; double execution_time; int return_code; char *output; void *object_ptr; } nebstruct_event_handler_data; /* host check structure */ typedef struct nebstruct_host_check_struct { int type; int flags; int attr; struct timeval timestamp; char *host_name; int current_attempt; int check_type; int max_attempts; int state_type; int state; int timeout; char *command_name; char *command_args; char *command_line; struct timeval start_time; struct timeval end_time; int early_timeout; double execution_time; double latency; int return_code; char *output; char *long_output; char *perf_data; check_result *check_result_ptr; void *object_ptr; } nebstruct_host_check_data; /* service check structure */ typedef struct nebstruct_service_check_struct { int type; int flags; int attr; struct timeval timestamp; char *host_name; char *service_description; int check_type; int current_attempt; int max_attempts; int state_type; int state; int timeout; char *command_name; char *command_args; char *command_line; struct timeval start_time; struct timeval end_time; int early_timeout; double execution_time; double latency; int return_code; char *output; char *long_output; char *perf_data; check_result *check_result_ptr; void *object_ptr; } nebstruct_service_check_data; /* comment data structure */ typedef struct nebstruct_comment_struct { int type; int flags; int attr; struct timeval timestamp; int comment_type; char *host_name; char *service_description; time_t entry_time; char *author_name; char *comment_data; int persistent; int source; int entry_type; int expires; time_t expire_time; unsigned long comment_id; void *object_ptr; /* not implemented yet */ } nebstruct_comment_data; /* downtime data structure */ typedef struct nebstruct_downtime_struct { int type; int flags; int attr; struct timeval timestamp; int downtime_type; char *host_name; char *service_description; time_t entry_time; char *author_name; char *comment_data; time_t start_time; time_t end_time; int fixed; unsigned long duration; unsigned long triggered_by; unsigned long downtime_id; void *object_ptr; /* not implemented yet */ } nebstruct_downtime_data; /* flapping data structure */ typedef struct nebstruct_flapping_struct { int type; int flags; int attr; struct timeval timestamp; int flapping_type; char *host_name; char *service_description; double percent_change; double high_threshold; double low_threshold; unsigned long comment_id; void *object_ptr; } nebstruct_flapping_data; /* program status structure */ typedef struct nebstruct_program_status_struct { int type; int flags; int attr; struct timeval timestamp; time_t program_start; int pid; int daemon_mode; time_t last_log_rotation; int notifications_enabled; int active_service_checks_enabled; int passive_service_checks_enabled; int active_host_checks_enabled; int passive_host_checks_enabled; int event_handlers_enabled; int flap_detection_enabled; int process_performance_data; int obsess_over_hosts; int obsess_over_services; unsigned long modified_host_attributes; unsigned long modified_service_attributes; char *global_host_event_handler; char *global_service_event_handler; } nebstruct_program_status_data; /* host status structure */ typedef struct nebstruct_host_status_struct { int type; int flags; int attr; struct timeval timestamp; void *object_ptr; } nebstruct_host_status_data; /* service status structure */ typedef struct nebstruct_service_status_struct { int type; int flags; int attr; struct timeval timestamp; void *object_ptr; } nebstruct_service_status_data; /* contact status structure */ typedef struct nebstruct_contact_status_struct { int type; int flags; int attr; struct timeval timestamp; void *object_ptr; } nebstruct_contact_status_data; /* notification data structure */ typedef struct nebstruct_notification_struct { int type; int flags; int attr; struct timeval timestamp; int notification_type; struct timeval start_time; struct timeval end_time; char *host_name; char *service_description; int reason_type; int state; char *output; char *ack_author; char *ack_data; int escalated; int contacts_notified; void *object_ptr; } nebstruct_notification_data; /* contact notification data structure */ typedef struct nebstruct_contact_notification_struct { int type; int flags; int attr; struct timeval timestamp; int notification_type; struct timeval start_time; struct timeval end_time; char *host_name; char *service_description; char *contact_name; int reason_type; int state; char *output; char *ack_author; char *ack_data; int escalated; void *object_ptr; void *contact_ptr; } nebstruct_contact_notification_data; /* contact notification method data structure */ typedef struct nebstruct_contact_notification_method_struct { int type; int flags; int attr; struct timeval timestamp; int notification_type; struct timeval start_time; struct timeval end_time; char *host_name; char *service_description; char *contact_name; char *command_name; char *command_args; int reason_type; int state; char *output; char *ack_author; char *ack_data; int escalated; void *object_ptr; void *contact_ptr; } nebstruct_contact_notification_method_data; /* adaptive program data structure */ typedef struct nebstruct_adaptive_program_data_struct { int type; int flags; int attr; struct timeval timestamp; int command_type; unsigned long modified_host_attribute; unsigned long modified_host_attributes; unsigned long modified_service_attribute; unsigned long modified_service_attributes; } nebstruct_adaptive_program_data; /* adaptive host data structure */ typedef struct nebstruct_adaptive_host_data_struct { int type; int flags; int attr; struct timeval timestamp; int command_type; unsigned long modified_attribute; unsigned long modified_attributes; void *object_ptr; } nebstruct_adaptive_host_data; /* adaptive service data structure */ typedef struct nebstruct_adaptive_service_data_struct { int type; int flags; int attr; struct timeval timestamp; int command_type; unsigned long modified_attribute; unsigned long modified_attributes; void *object_ptr; } nebstruct_adaptive_service_data; /* adaptive contact data structure */ typedef struct nebstruct_adaptive_contact_data_struct { int type; int flags; int attr; struct timeval timestamp; int command_type; unsigned long modified_attribute; unsigned long modified_attributes; unsigned long modified_host_attribute; unsigned long modified_host_attributes; unsigned long modified_service_attribute; unsigned long modified_service_attributes; void *object_ptr; } nebstruct_adaptive_contact_data; /* external command data structure */ typedef struct nebstruct_external_command_struct { int type; int flags; int attr; struct timeval timestamp; int command_type; time_t entry_time; char *command_string; char *command_args; } nebstruct_external_command_data; /* aggregated status data structure */ typedef struct nebstruct_aggregated_status_struct { int type; int flags; int attr; struct timeval timestamp; } nebstruct_aggregated_status_data; /* retention data structure */ typedef struct nebstruct_retention_struct { int type; int flags; int attr; struct timeval timestamp; } nebstruct_retention_data; /* acknowledgement structure */ typedef struct nebstruct_acknowledgement_struct { int type; int flags; int attr; struct timeval timestamp; int acknowledgement_type; char *host_name; char *service_description; int state; char *author_name; char *comment_data; int is_sticky; int persistent_comment; int notify_contacts; void *object_ptr; } nebstruct_acknowledgement_data; /* state change structure */ typedef struct nebstruct_statechange_struct { int type; int flags; int attr; struct timeval timestamp; int statechange_type; char *host_name; char *service_description; int state; int state_type; int current_attempt; int max_attempts; char *output; void *object_ptr; char *longoutput; } nebstruct_statechange_data; NAGIOS_END_DECL #endif nagios-4.3.4/include/netutils.h000066400000000000000000000005071314764422400164560ustar00rootroot00000000000000#ifndef NAGIOS_NETUGILS_H_INCLUDED #define NAGIOS_NETUGILS_H_INCLUDED #include "common.h" NAGIOS_BEGIN_DECL int my_tcp_connect(const char *host_name, int port, int *sd, int timeout); int my_sendall(int s, const char *buf, int *len, int timeout); int my_recvall(int s, char *buf, int *len, int timeout); NAGIOS_END_DECL #endif nagios-4.3.4/include/objectjson.h000066400000000000000000000317541314764422400167570ustar00rootroot00000000000000/************************************************************************** * * OBJECTJSON.H - Nagios CGI for returning JSON-formatted object data * * Copyright (c) 2013 Nagios Enterprises, LLC * Last Modified: 04-13-2013 * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *************************************************************************/ #ifndef NAGIOS_OBJECTJSON_H_INCLUDED #define NAGIOS_OBJECTJSON_H_INCLUDED /* Structure containing CGI query string options and values */ typedef struct object_json_cgi_data_struct { /* Format options for JSON output */ unsigned format_options; /* Query being requested */ int query; /* Index of starting object returned for list requests */ int start; /* Number of objects returned for list requests */ int count; /* Return details for each entity in a list request */ int details; /* strftime format string for time_t values */ char * strftime_format; /* Name of host whose children should be returned if parenthost is specified */ char * parent_host_name; /* Use the parent host field or search all hosts */ int use_parent_host; /* Host whose children should be returned if use_parent_host is non-zero */ host * parent_host; /* Name of host whose parents should be returned if childhost is specified */ char * child_host_name; /* Use the child host field or search all hosts */ int use_child_host; /* Host whose parents should be returned if use_child_host is non-zero */ host * child_host; /* Name of host for which details should be returned */ char * host_name; /* Host whose host name is host_name */ host * host; /* Name of host whose hostgroup should be returned if hostgroupmember is specified */ char * hostgroup_member_name; /* Host whose hostgroup should be returned if hostgroup_member_name is specified */ host * hostgroup_member; /* Name of hostgroup for which details should be returned */ char * hostgroup_name; /* Hostgroup whose name is hostgroup_name */ hostgroup * hostgroup; /* Name of servicegroup for which details should be returned */ char * servicegroup_name; /* Servicegroup whose name is servicegroup_name */ servicegroup * servicegroup; /* Name of service for which details should be returned */ char * service_description; /* Service whose host name is host_name and whose description is service_description*/ service * service; /* Name of host for which servicegroup should be returned if servicegroupmemberhost and servicegroupmemberservice are specified */ char * servicegroup_member_host_name; /* Name of service for which servicegroup should be returned if servicegroupmemberhost and servicegroupmemberservice are specified */ char * servicegroup_member_service_description; /* Service whose servicegroup should be returned if servicegroup_member_host_name and servicegroup_member_service_description are specified */ service * servicegroup_member; /* Name of service whose children should be returned if parentservice is specified */ char * parent_service_name; /* Name of service whose parents should be returned if childservice is specified */ char * child_service_name; /* Name of contactgroup for which details should be returned */ char * contactgroup_name; /* Contactgroup whose name is contactgroup_name */ contactgroup * contactgroup; /* Name of contact for which details should be returned */ char * contact_name; /* Contact whose contact name is contact_name */ contact * contact; /* Name of contact whose contactgroup should be returned if contactgroupmember is specified */ char * contactgroup_member_name; /* Contact whose contactgroup should be returned if contactgroup_member_name is specified */ contact * contactgroup_member; /* Name of timeperiod for which details should be returned */ char * timeperiod_name; /* Timeperiod whose timeperiod name is timeperiod_name */ timeperiod *timeperiod; /* Name of check timeperiod for which details should be returned */ char * check_timeperiod_name; /* Timeperiod whose timeperiod name is check_timeperiod_name */ timeperiod *check_timeperiod; /* Name of host notification timeperiod for which details should be returned */ char * host_notification_timeperiod_name; /* Timeperiod whose timeperiod name is host_notification_timeperiod_name */ timeperiod *host_notification_timeperiod; /* Name of service notification timeperiod for which details should be returned */ char * service_notification_timeperiod_name; /* Timeperiod whose timeperiod name is service_notification_timeperiod_name */ timeperiod *service_notification_timeperiod; /* Name of command for which details should be returned */ char * command_name; /* Command whose command name is command_name */ command * command; /* Name of check command to be used as a selector */ char * check_command_name; /* Command whose command name is check_command_name */ command * check_command; /* Name of event handler to be used as a selector */ char * event_handler_name; /* Command whose command name is event_handler_name */ command * event_handler; /* Name of master host to be used as a selector for dependencies */ char * master_host_name; /* Host whose host name is master_host_name */ host * master_host; /* Name of master hostgroup to be used as a selector for dependencies */ char * master_hostgroup_name; /* Host whose hostgroup name is master_hostgroup_name */ hostgroup * master_hostgroup; /* Name of master service to be used as a selector for dependencies */ char * master_service_description; /* Service whose service name is master_service_description */ service * master_service; /* Name of master servicegroup to be used as a selector for dependencies */ char * master_servicegroup_name; /* Service whose servicegroup name is master_servicegroup_name */ servicegroup * master_servicegroup; /* Name of dependent host to be used as a selector for dependencies */ char * dependent_host_name; /* Host whose host name is dependent_host_name */ host * dependent_host; /* Name of dependent hostgroup to be used as a selector for dependencies */ char * dependent_hostgroup_name; /* Host whose hostgroup name is dependent_hostgroup_name */ hostgroup * dependent_hostgroup; /* Name of dependent service to be used as a selector for dependencies */ char * dependent_service_description; /* Service whose service name is dependent_service_description */ service * dependent_service; /* Name of dependent servicegroup to be used as a selector for dependencies */ char * dependent_servicegroup_name; /* Service whose servicegroup name is dependent_servicegroup_name */ servicegroup * dependent_servicegroup; } object_json_cgi_data; /* Object Type Information */ #define OBJECT_QUERY_INVALID 0 #define OBJECT_QUERY_HOSTCOUNT 1 #define OBJECT_QUERY_HOSTLIST 2 #define OBJECT_QUERY_HOST 3 #define OBJECT_QUERY_HOSTGROUPCOUNT 4 #define OBJECT_QUERY_HOSTGROUPLIST 5 #define OBJECT_QUERY_HOSTGROUP 6 #define OBJECT_QUERY_SERVICECOUNT 7 #define OBJECT_QUERY_SERVICELIST 8 #define OBJECT_QUERY_SERVICE 9 #define OBJECT_QUERY_SERVICEGROUPCOUNT 10 #define OBJECT_QUERY_SERVICEGROUPLIST 11 #define OBJECT_QUERY_SERVICEGROUP 12 #define OBJECT_QUERY_CONTACTCOUNT 13 #define OBJECT_QUERY_CONTACTLIST 14 #define OBJECT_QUERY_CONTACT 15 #define OBJECT_QUERY_CONTACTGROUPCOUNT 16 #define OBJECT_QUERY_CONTACTGROUPLIST 17 #define OBJECT_QUERY_CONTACTGROUP 18 #define OBJECT_QUERY_TIMEPERIODCOUNT 19 #define OBJECT_QUERY_TIMEPERIODLIST 20 #define OBJECT_QUERY_TIMEPERIOD 21 #define OBJECT_QUERY_COMMANDCOUNT 22 #define OBJECT_QUERY_COMMANDLIST 23 #define OBJECT_QUERY_COMMAND 24 #define OBJECT_QUERY_SERVICEDEPENDENCYCOUNT 25 #define OBJECT_QUERY_SERVICEDEPENDENCYLIST 26 #define OBJECT_QUERY_SERVICEESCALATIONCOUNT 27 #define OBJECT_QUERY_SERVICEESCALATIONLIST 28 #define OBJECT_QUERY_HOSTDEPENDENCYCOUNT 29 #define OBJECT_QUERY_HOSTDEPENDENCYLIST 30 #define OBJECT_QUERY_HOSTESCALATIONCOUNT 31 #define OBJECT_QUERY_HOSTESCALATIONLIST 32 #define OBJECT_QUERY_HELP 33 extern json_object * json_object_custom_variables(struct customvariablesmember *); extern json_object *json_object_hostcount(int, host *, int, host *, hostgroup *, contact *, contactgroup *, timeperiod *, timeperiod *, command *, command *); extern json_object *json_object_hostlist(unsigned, int, int, int, int, host *, int, host *, hostgroup *, contact *, contactgroup *, timeperiod *, timeperiod *, command *, command *); extern json_object *json_object_host(unsigned, host *); extern void json_object_host_details(json_object *, unsigned, host *); extern json_object *json_object_hostgroupcount(unsigned, host *); extern json_object *json_object_hostgrouplist(unsigned, int, int, int, host *); extern json_object *json_object_hostgroup(unsigned, hostgroup *); extern void json_object_hostgroup_details(json_object *, unsigned, hostgroup *); extern json_object *json_object_servicecount(host *, int, host *, int, host *, hostgroup *, servicegroup *, contact *, char *, char *, char *, contactgroup *, timeperiod *, timeperiod *, command *, command *); extern json_object *json_object_servicelist(unsigned, int, int, int, host *, int, host *, int, host *, hostgroup *, servicegroup *, contact *, char *, char *, char *, contactgroup *, timeperiod *, timeperiod *, command *, command *); extern json_object *json_object_service(unsigned, service *); extern void json_object_service_details(json_object *, unsigned, service *); extern json_object *json_object_servicegroupcount(service *); extern json_object *json_object_servicegrouplist(unsigned, int, int, int, service *); extern json_object *json_object_servicegroup(unsigned, servicegroup *); extern void json_object_servicegroup_details(json_object *, unsigned, servicegroup *); extern json_object *json_object_contactcount(contactgroup *, timeperiod *, timeperiod *); extern json_object *json_object_contactlist(unsigned, int, int, int, contactgroup *, timeperiod *, timeperiod *); extern json_object *json_object_contact(unsigned, contact *); extern void json_object_contact_details(json_object *, unsigned, contact *); extern json_object *json_object_contactgroupcount(contact *); extern json_object *json_object_contactgrouplist(unsigned, int, int, int, contact *); extern json_object *json_object_contactgroup(unsigned, contactgroup *); extern void json_object_contactgroup_details(json_object *, unsigned, contactgroup *); extern json_object *json_object_timeperiodcount(void); extern json_object *json_object_timeperiodlist(unsigned, int, int, int); extern json_object *json_object_timeperiod(unsigned, timeperiod *); extern void json_object_timeperiod_details(json_object *, unsigned, timeperiod *); extern void json_object_timerange(json_array *, unsigned, timerange *); extern json_object *json_object_daterange(unsigned, daterange *, int); extern json_object *json_object_commandcount(void); extern json_object *json_object_commandlist(unsigned, int, int, int); extern json_object *json_object_command(unsigned, command *); extern void json_object_command_details(json_object *, unsigned, command *); extern json_object *json_object_servicedependencycount(host *, hostgroup *, char *, servicegroup *, host *, hostgroup *, char *, servicegroup *); extern json_object *json_object_servicedependencylist(unsigned, int, int, host *, hostgroup *, char *, servicegroup *, host *, hostgroup *, char *, servicegroup *); extern void json_object_servicedependency_details(json_object *, unsigned, servicedependency *); extern json_object *json_object_serviceescalationcount(host *, char *, hostgroup *, servicegroup *, contact *, contactgroup *); extern json_object *json_object_serviceescalationlist(unsigned, int, int, host *, char *, hostgroup *, servicegroup *, contact *, contactgroup *); extern void json_object_serviceescalation_details(json_object *, unsigned, serviceescalation *); extern json_object *json_object_hostdependencycount(host *, hostgroup *, host *, hostgroup *); extern json_object *json_object_hostdependencylist(unsigned, int, int, host *, hostgroup *, host *, hostgroup *); extern void json_object_hostdependency_details(json_object *, unsigned, hostdependency *); extern json_object *json_object_hostescalationcount(host *, hostgroup *, contact *, contactgroup *); extern json_object *json_object_hostescalationlist(unsigned, int, int, host *, hostgroup *, contact *, contactgroup *); extern void json_object_hostescalation_details(json_object *, unsigned, hostescalation *); #endif nagios-4.3.4/include/objects.h000066400000000000000000001042121314764422400162360ustar00rootroot00000000000000/***************************************************************************** * * OBJECTS.H - Header file for object addition/search functions * * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #ifndef NAGIOS_OBJECTS_H_INCLUDED #define NAGIOS_OBJECTS_H_INCLUDED #include "common.h" NAGIOS_BEGIN_DECL /*************** CURRENT OBJECT REVISION **************/ #define CURRENT_OBJECT_STRUCTURE_VERSION 403 /* increment when changes are made to data structures... */ /* Nagios 3 starts at 300, Nagios 4 at 400, etc. */ /***************** OBJECT SIZE LIMITS *****************/ #define MAX_STATE_HISTORY_ENTRIES 21 /* max number of old states to keep track of for flap detection */ #define MAX_CONTACT_ADDRESSES 6 /* max number of custom addresses a contact can have */ /***************** SKIP LISTS ****************/ #define NUM_OBJECT_SKIPLISTS 12 #define NUM_HASHED_OBJECT_TYPES 8 #define HOST_SKIPLIST 0 #define SERVICE_SKIPLIST 1 #define COMMAND_SKIPLIST 2 #define TIMEPERIOD_SKIPLIST 3 #define CONTACT_SKIPLIST 4 #define CONTACTGROUP_SKIPLIST 5 #define HOSTGROUP_SKIPLIST 6 #define SERVICEGROUP_SKIPLIST 7 #define HOSTDEPENDENCY_SKIPLIST 8 #define SERVICEDEPENDENCY_SKIPLIST 9 #define HOSTESCALATION_SKIPLIST 10 #define SERVICEESCALATION_SKIPLIST 11 /***************** DATE RANGE TYPES *******************/ #define DATERANGE_CALENDAR_DATE 0 /* 2008-12-25 */ #define DATERANGE_MONTH_DATE 1 /* july 4 (specific month) */ #define DATERANGE_MONTH_DAY 2 /* day 21 (generic month) */ #define DATERANGE_MONTH_WEEK_DAY 3 /* 3rd thursday (specific month) */ #define DATERANGE_WEEK_DAY 4 /* 3rd thursday (generic month) */ #define DATERANGE_TYPES 5 /* * flags for notification_options, flapping_options and other similar * flags. They overlap (hosts and services), so we can't use enum's. */ #define OPT_NOTHING 0 /* no options selected */ #define OPT_ALL (~0) /* everything selected, so all bits set */ #define OPT_DOWN (1 << HOST_DOWN) #define OPT_UP (1 << HOST_UP) #define OPT_UNREACHABLE (1 << HOST_UNREACHABLE) #define OPT_OK (1 << STATE_OK) #define OPT_WARNING (1 << STATE_WARNING) #define OPT_CRITICAL (1 << STATE_CRITICAL) #define OPT_UNKNOWN (1 << STATE_UNKNOWN) #define OPT_RECOVERY OPT_OK /* and now the "unreal" states... */ #define OPT_PENDING (1 << 10) #define OPT_FLAPPING (1 << 11) #define OPT_DOWNTIME (1 << 12) #define OPT_DISABLED (1 << 15) /* will denote disabled checks some day */ /* macros useful with both hosts and services */ #define flag_set(c, flag) ((c) |= (flag)) #define flag_get(c, flag) (unsigned int)((c) & (flag)) #define flag_isset(c, flag) (flag_get((c), (flag)) == (unsigned int)(flag)) #define flag_unset(c, flag) (c &= ~(flag)) #define should_stalk(o) flag_isset(o->stalking_options, 1 << o->current_state) #define should_flap_detect(o) flag_isset(o->flap_detection_options, 1 << o->current_state) #define should_notify(o) flag_isset(o->notification_options, 1 << o->current_state) #define add_notified_on(o, f) (o->notified_on |= (1 << f)) /* Event-related macros */ #define NUDGE_MIN 5 #define NUDGE_MAX 17 /****************** DATA STRUCTURES *******************/ /* @todo Remove typedef's of non-opaque types in Nagios 5 */ typedef struct host host; typedef struct service service; typedef struct contact contact; /* TIMED_EVENT structure */ typedef struct timed_event { int event_type; time_t run_time; int recurring; unsigned long event_interval; int compensate_for_time_change; void *timing_func; void *event_data; void *event_args; int event_options; unsigned int priority; /* 0 is auto, 1 is highest. n+1 < n */ struct squeue_event *sq_event; } timed_event; /* NOTIFY_LIST structure */ typedef struct notify_list { struct contact *contact; struct notify_list *next; } notification; /* * *name can be "Nagios Core", "Merlin", "mod_gearman" or "DNX", fe. * source_name gets passed the 'source' pointer from check_result * and must return a non-free()'able string useful for printing what * we need to determine exactly where the check was received from, * such as "mod_gearman worker@10.11.12.13", or "Nagios Core command * file worker" (for passive checks submitted locally), which will be * stashed with hosts and services and used as the "CHECKSOURCE" macro. */ struct check_engine { char *name; /* "Nagios Core", "Merlin", "Mod Gearman" fe */ const char *(*source_name)( const void *); void (*clean_result)(void *); }; /* CHECK_RESULT structure */ typedef struct check_result { int object_check_type; /* is this a service or a host check? */ char *host_name; /* host name */ char *service_description; /* service description */ int check_type; /* was this an active or passive service check? */ int check_options; int scheduled_check; /* was this a scheduled or an on-demand check? */ int reschedule_check; /* should we reschedule the next check */ char *output_file; /* what file is the output stored in? */ FILE *output_file_fp; double latency; struct timeval start_time; /* time the service check was initiated */ struct timeval finish_time; /* time the service check was completed */ int early_timeout; /* did the service check timeout? */ int exited_ok; /* did the plugin check return okay? */ int return_code; /* plugin return code */ char *output; /* plugin output */ struct rusage rusage; /* resource usage by this check */ struct check_engine *engine; /* where did we get this check from? */ const void *source; /* engine handles this */ } check_result; /* SCHED_INFO structure */ typedef struct sched_info { int total_services; int total_scheduled_services; int total_hosts; int total_scheduled_hosts; double average_services_per_host; double average_scheduled_services_per_host; unsigned long service_check_interval_total; unsigned long host_check_interval_total; double average_service_execution_time; double average_service_check_interval; double average_host_check_interval; double average_service_inter_check_delay; double average_host_inter_check_delay; double service_inter_check_delay; double host_inter_check_delay; int service_interleave_factor; int max_service_check_spread; int max_host_check_spread; time_t first_service_check; time_t last_service_check; time_t first_host_check; time_t last_host_check; } sched_info; /* DBUF structure - dynamic string storage */ typedef struct dbuf { char *buf; unsigned long used_size; unsigned long allocated_size; unsigned long chunk_size; } dbuf; #define CHECK_STATS_BUCKETS 15 /* used for tracking host and service check statistics */ typedef struct check_stats { int current_bucket; int bucket[CHECK_STATS_BUCKETS]; int overflow_bucket; int minute_stats[3]; time_t last_update; } check_stats; /* OBJECT LIST STRUCTURE */ typedef struct objectlist { void *object_ptr; struct objectlist *next; } objectlist; /* TIMERANGE structure */ typedef struct timerange { unsigned long range_start; unsigned long range_end; struct timerange *next; } timerange; /* DATERANGE structure */ typedef struct daterange { int type; int syear; /* start year */ int smon; /* start month */ int smday; /* start day of month (may 3rd, last day in feb) */ int swday; /* start day of week (thursday) */ int swday_offset; /* start weekday offset (3rd thursday, last monday in jan) */ int eyear; int emon; int emday; int ewday; int ewday_offset; int skip_interval; struct timerange *times; struct daterange *next; } daterange; /* TIMEPERIODEXCLUSION structure */ typedef struct timeperiodexclusion { char *timeperiod_name; struct timeperiod *timeperiod_ptr; struct timeperiodexclusion *next; } timeperiodexclusion; /* TIMEPERIOD structure */ typedef struct timeperiod { unsigned int id; char *name; char *alias; struct timerange *days[7]; struct daterange *exceptions[DATERANGE_TYPES]; struct timeperiodexclusion *exclusions; struct timeperiod *next; } timeperiod; /* CONTACTSMEMBER structure */ typedef struct contactsmember { char *contact_name; struct contact *contact_ptr; struct contactsmember *next; } contactsmember; /* CONTACTGROUP structure */ typedef struct contactgroup { unsigned int id; char *group_name; char *alias; struct contactsmember *members; struct contactgroup *next; } contactgroup; /* CONTACTGROUPSMEMBER structure */ typedef struct contactgroupsmember { char *group_name; struct contactgroup *group_ptr; struct contactgroupsmember *next; } contactgroupsmember; /* CUSTOMVARIABLESMEMBER structure */ typedef struct customvariablesmember { char *variable_name; char *variable_value; int has_been_modified; struct customvariablesmember *next; } customvariablesmember; /* COMMAND structure */ typedef struct command { unsigned int id; char *name; char *command_line; struct command *next; } command; /* COMMANDSMEMBER structure */ typedef struct commandsmember { char *command; struct command *command_ptr; struct commandsmember *next; } commandsmember; /* CONTACT structure */ struct contact { unsigned int id; char *name; char *alias; char *email; char *pager; char *address[MAX_CONTACT_ADDRESSES]; struct commandsmember *host_notification_commands; struct commandsmember *service_notification_commands; unsigned int host_notification_options; unsigned int service_notification_options; unsigned int minimum_value; char *host_notification_period; char *service_notification_period; int host_notifications_enabled; int service_notifications_enabled; int can_submit_commands; int retain_status_information; int retain_nonstatus_information; struct customvariablesmember *custom_variables; #ifndef NSCGI time_t last_host_notification; time_t last_service_notification; unsigned long modified_attributes; unsigned long modified_host_attributes; unsigned long modified_service_attributes; #endif struct timeperiod *host_notification_period_ptr; struct timeperiod *service_notification_period_ptr; struct objectlist *contactgroups_ptr; struct contact *next; }; /* SERVICESMEMBER structure */ typedef struct servicesmember { char *host_name; char *service_description; struct service *service_ptr; struct servicesmember *next; } servicesmember; /* HOSTSMEMBER structure */ typedef struct hostsmember { char *host_name; struct host *host_ptr; struct hostsmember *next; } hostsmember; /* HOSTGROUP structure */ typedef struct hostgroup { unsigned int id; char *group_name; char *alias; struct hostsmember *members; char *notes; char *notes_url; char *action_url; struct hostgroup *next; } hostgroup; /* HOST structure */ struct host { unsigned int id; char *name; char *display_name; char *alias; char *address; struct hostsmember *parent_hosts; struct hostsmember *child_hosts; struct servicesmember *services; char *check_command; int initial_state; double check_interval; double retry_interval; int max_attempts; char *event_handler; struct contactgroupsmember *contact_groups; struct contactsmember *contacts; double notification_interval; double first_notification_delay; unsigned int notification_options; unsigned int hourly_value; char *notification_period; char *check_period; int flap_detection_enabled; double low_flap_threshold; double high_flap_threshold; int flap_detection_options; unsigned int stalking_options; int check_freshness; int freshness_threshold; int process_performance_data; int checks_enabled; const char *check_source; int accept_passive_checks; int event_handler_enabled; int retain_status_information; int retain_nonstatus_information; int obsess; char *notes; char *notes_url; char *action_url; char *icon_image; char *icon_image_alt; char *statusmap_image; /* used by lots of graphing tools */ /* #ifdef NSCGI */ /* * these are kept in ancillary storage for the daemon and * thrown out as soon as we've created the object cache. * The CGI's still attach them though, since they are the * only users of this utter crap. */ char *vrml_image; int have_2d_coords; int x_2d; int y_2d; int have_3d_coords; double x_3d; double y_3d; double z_3d; int should_be_drawn; /* #endif */ customvariablesmember *custom_variables; #ifndef NSCGI int problem_has_been_acknowledged; int acknowledgement_type; int check_type; int current_state; int last_state; int last_hard_state; char *plugin_output; char *long_plugin_output; char *perf_data; int state_type; int current_attempt; unsigned long current_event_id; unsigned long last_event_id; unsigned long current_problem_id; unsigned long last_problem_id; double latency; double execution_time; int is_executing; int check_options; int notifications_enabled; time_t last_notification; time_t next_notification; time_t next_check; int should_be_scheduled; time_t last_check; time_t last_state_change; time_t last_hard_state_change; time_t last_time_up; time_t last_time_down; time_t last_time_unreachable; int has_been_checked; int is_being_freshened; int notified_on; int current_notification_number; int no_more_notifications; unsigned long current_notification_id; int check_flapping_recovery_notification; int scheduled_downtime_depth; int pending_flex_downtime; int state_history[MAX_STATE_HISTORY_ENTRIES]; /* flap detection */ int state_history_index; time_t last_state_history_update; int is_flapping; unsigned long flapping_comment_id; double percent_state_change; int total_services; unsigned long total_service_check_interval; unsigned long modified_attributes; #endif struct command *event_handler_ptr; struct command *check_command_ptr; struct timeperiod *check_period_ptr; struct timeperiod *notification_period_ptr; struct objectlist *hostgroups_ptr; /* objects we depend upon */ struct objectlist *exec_deps, *notify_deps; struct objectlist *escalation_list; struct host *next; struct timed_event *next_check_event; }; /* SERVICEGROUP structure */ typedef struct servicegroup { unsigned int id; char *group_name; char *alias; struct servicesmember *members; char *notes; char *notes_url; char *action_url; struct servicegroup *next; } servicegroup; /* SERVICE structure */ struct service { unsigned int id; char *host_name; char *description; char *display_name; struct servicesmember *parents; struct servicesmember *children; char *check_command; char *event_handler; int initial_state; double check_interval; double retry_interval; int max_attempts; int parallelize; struct contactgroupsmember *contact_groups; struct contactsmember *contacts; double notification_interval; double first_notification_delay; unsigned int notification_options; unsigned int stalking_options; unsigned int hourly_value; int is_volatile; char *notification_period; char *check_period; int flap_detection_enabled; double low_flap_threshold; double high_flap_threshold; unsigned int flap_detection_options; int process_performance_data; int check_freshness; int freshness_threshold; int accept_passive_checks; int event_handler_enabled; int checks_enabled; const char *check_source; int retain_status_information; int retain_nonstatus_information; int notifications_enabled; int obsess; char *notes; char *notes_url; char *action_url; char *icon_image; char *icon_image_alt; struct customvariablesmember *custom_variables; #ifndef NSCGI int problem_has_been_acknowledged; int acknowledgement_type; int host_problem_at_last_check; int check_type; int current_state; int last_state; int last_hard_state; char *plugin_output; char *long_plugin_output; char *perf_data; int state_type; time_t next_check; int should_be_scheduled; time_t last_check; int current_attempt; unsigned long current_event_id; unsigned long last_event_id; unsigned long current_problem_id; unsigned long last_problem_id; time_t last_notification; time_t next_notification; int no_more_notifications; int check_flapping_recovery_notification; time_t last_state_change; time_t last_hard_state_change; time_t last_time_ok; time_t last_time_warning; time_t last_time_unknown; time_t last_time_critical; int has_been_checked; int is_being_freshened; unsigned int notified_on; int current_notification_number; unsigned long current_notification_id; double latency; double execution_time; int is_executing; int check_options; int scheduled_downtime_depth; int pending_flex_downtime; int state_history[MAX_STATE_HISTORY_ENTRIES]; /* flap detection */ int state_history_index; int is_flapping; unsigned long flapping_comment_id; double percent_state_change; unsigned long modified_attributes; #endif struct host *host_ptr; struct command *event_handler_ptr; char *event_handler_args; struct command *check_command_ptr; char *check_command_args; struct timeperiod *check_period_ptr; struct timeperiod *notification_period_ptr; struct objectlist *servicegroups_ptr; struct objectlist *exec_deps, *notify_deps; struct objectlist *escalation_list; struct service *next; struct timed_event *next_check_event; }; /* SERVICE ESCALATION structure */ typedef struct serviceescalation { unsigned int id; char *host_name; char *description; int first_notification; int last_notification; double notification_interval; char *escalation_period; int escalation_options; struct contactgroupsmember *contact_groups; struct contactsmember *contacts; struct service *service_ptr; struct timeperiod *escalation_period_ptr; } serviceescalation; /* SERVICE DEPENDENCY structure */ typedef struct servicedependency { unsigned int id; int dependency_type; char *dependent_host_name; char *dependent_service_description; char *host_name; char *service_description; char *dependency_period; int inherits_parent; int failure_options; struct service *master_service_ptr; struct service *dependent_service_ptr; struct timeperiod *dependency_period_ptr; } servicedependency; /* HOST ESCALATION structure */ typedef struct hostescalation { unsigned int id; char *host_name; int first_notification; int last_notification; double notification_interval; char *escalation_period; int escalation_options; struct contactgroupsmember *contact_groups; struct contactsmember *contacts; struct host *host_ptr; struct timeperiod *escalation_period_ptr; } hostescalation; /* HOST DEPENDENCY structure */ typedef struct hostdependency { unsigned int id; int dependency_type; char *dependent_host_name; char *host_name; char *dependency_period; int inherits_parent; int failure_options; struct host *master_host_ptr; struct host *dependent_host_ptr; struct timeperiod *dependency_period_ptr; } hostdependency; extern struct command *command_list; extern struct timeperiod *timeperiod_list; extern struct host *host_list; extern struct service *service_list; extern struct contact *contact_list; extern struct hostgroup *hostgroup_list; extern struct servicegroup *servicegroup_list; extern struct contactgroup *contactgroup_list; extern struct hostescalation *hostescalation_list; extern struct serviceescalation *serviceescalation_list; extern struct command **command_ary; extern struct timeperiod **timeperiod_ary; extern struct host **host_ary; extern struct service **service_ary; extern struct contact **contact_ary; extern struct hostgroup **hostgroup_ary; extern struct servicegroup **servicegroup_ary; extern struct contactgroup **contactgroup_ary; extern struct hostescalation **hostescalation_ary; extern struct hostdependency **hostdependency_ary; extern struct serviceescalation **serviceescalation_ary; extern struct servicedependency **servicedependency_ary; /********************* FUNCTIONS **********************/ /**** Top-level input functions ****/ int read_object_config_data(const char *, int); /* reads all external configuration data of specific types */ /**** Object Creation Functions ****/ struct contact *add_contact(char *name, char *alias, char *email, char *pager, char **addresses, char *svc_notification_period, char *host_notification_period, int service_notification_options, int host_notification_options, int service_notifications_enabled, int host_notifications_enabled, int can_submit_commands, int retain_status_information, int retain_nonstatus_information, unsigned int minimum_value); struct commandsmember *add_service_notification_command_to_contact(contact *, char *); /* adds a service notification command to a contact definition */ struct commandsmember *add_host_notification_command_to_contact(contact *, char *); /* adds a host notification command to a contact definition */ struct customvariablesmember *add_custom_variable_to_contact(contact *, char *, char *); /* adds a custom variable to a service definition */ struct host *add_host(char *name, char *display_name, char *alias, char *address, char *check_period, int initial_state, double check_interval, double retry_interval, int max_attempts, int notification_options, double notification_interval, double first_notification_delay, char *notification_period, int notifications_enabled, char *check_command, int checks_enabled, int accept_passive_checks, char *event_handler, int event_handler_enabled, int flap_detection_enabled, double low_flap_threshold, double high_flap_threshold, int flap_detection_options, int stalking_options, int process_perfdata, int check_freshness, int freshness_threshold, char *notes, char *notes_url, char *action_url, char *icon_image, char *icon_image_alt, char *vrml_image, char *statusmap_image, int x_2d, int y_2d, int have_2d_coords, double x_3d, double y_3d, double z_3d, int have_3d_coords, int should_be_drawn, int retain_status_information, int retain_nonstatus_information, int obsess_over_host, unsigned int hourly_value); struct hostsmember *add_parent_host_to_host(host *, char *); /* adds a parent host to a host definition */ struct servicesmember *add_parent_service_to_service(service *, char *host_name, char *description); struct hostsmember *add_child_link_to_host(host *, host *); /* adds a child host to a host definition */ struct servicesmember *add_child_link_to_service(service *, service *); /* adds a child host to a host definition */ struct contactgroupsmember *add_contactgroup_to_host(host *, char *); /* adds a contactgroup to a host definition */ struct contactsmember *add_contact_to_host(host *, char *); /* adds a contact to a host definition */ struct customvariablesmember *add_custom_variable_to_host(host *, char *, char *); /* adds a custom variable to a host definition */ struct timeperiod *add_timeperiod(char *, char *); /* adds a timeperiod definition */ struct timeperiodexclusion *add_exclusion_to_timeperiod(timeperiod *, char *); /* adds an exclusion to a timeperiod */ struct timerange *add_timerange_to_timeperiod(timeperiod *, int, unsigned long, unsigned long); /* adds a timerange to a timeperiod definition */ struct daterange *add_exception_to_timeperiod(timeperiod *, int, int, int, int, int, int, int, int, int, int, int, int); struct timerange *add_timerange_to_daterange(daterange *, unsigned long, unsigned long); struct hostgroup *add_hostgroup(char *, char *, char *, char *, char *); /* adds a hostgroup definition */ struct hostsmember *add_host_to_hostgroup(hostgroup *, char *); /* adds a host to a hostgroup definition */ struct servicegroup *add_servicegroup(char *, char *, char *, char *, char *); /* adds a servicegroup definition */ struct servicesmember *add_service_to_servicegroup(servicegroup *, char *, char *); /* adds a service to a servicegroup definition */ struct contactgroup *add_contactgroup(char *, char *); /* adds a contactgroup definition */ struct contactsmember *add_contact_to_contactgroup(contactgroup *, char *); /* adds a contact to a contact group definition */ struct command *add_command(char *, char *); /* adds a command definition */ struct service *add_service(char *host_name, char *description, char *display_name, char *check_period, int initial_state, int max_attempts, int parallelize, int accept_passive_checks, double check_interval, double retry_interval, double notification_interval, double first_notification_delay, char *notification_period, int notification_options, int notifications_enabled, int is_volatile, char *event_handler, int event_handler_enabled, char *check_command, int checks_enabled, int flap_detection_enabled, double low_flap_threshold, double high_flap_threshold, int flap_detection_options, int stalking_options, int process_perfdata, int check_freshness, int freshness_threshold, char *notes, char *notes_url, char *action_url, char *icon_image, char *icon_image_alt, int retain_status_information, int retain_nonstatus_information, int obsess_over_service, unsigned int hourly_value); struct contactgroupsmember *add_contactgroup_to_service(service *, char *); /* adds a contact group to a service definition */ struct contactsmember *add_contact_to_service(service *, char *); /* adds a contact to a host definition */ struct serviceescalation *add_serviceescalation(char *host_name, char *description, int first_notification, int last_notification, double notification_interval, char *escalation_period, int escalation_options); struct contactgroupsmember *add_contactgroup_to_serviceescalation(serviceescalation *, char *); /* adds a contact group to a service escalation definition */ struct contactsmember *add_contact_to_serviceescalation(serviceescalation *, char *); /* adds a contact to a service escalation definition */ struct customvariablesmember *add_custom_variable_to_service(service *, char *, char *); /* adds a custom variable to a service definition */ struct servicedependency *add_service_dependency(char *dependent_host_name, char *dependent_service_description, char *host_name, char *service_description, int dependency_type, int inherits_parent, int failure_options, char *dependency_period); struct hostdependency *add_host_dependency(char *dependent_host_name, char *host_name, int dependency_type, int inherits_parent, int failure_options, char *dependency_period); struct hostescalation *add_hostescalation(char *host_name, int first_notification, int last_notification, double notification_interval, char *escalation_period, int escalation_options); struct contactsmember *add_contact_to_hostescalation(hostescalation *, char *); /* adds a contact to a host escalation definition */ struct contactgroupsmember *add_contactgroup_to_hostescalation(hostescalation *, char *); /* adds a contact group to a host escalation definition */ struct contactsmember *add_contact_to_object(contactsmember **, char *); /* adds a contact to an object */ struct customvariablesmember *add_custom_variable_to_object(customvariablesmember **, char *, char *); /* adds a custom variable to an object */ struct servicesmember *add_service_link_to_host(host *, service *); int skiplist_compare_text(const char *val1a, const char *val1b, const char *val2a, const char *val2b); int get_host_count(void); int get_service_count(void); int create_object_tables(unsigned int *); /**** Object Search Functions ****/ struct timeperiod *find_timeperiod(const char *); struct host *find_host(const char *); struct hostgroup *find_hostgroup(const char *); struct servicegroup *find_servicegroup(const char *); struct contact *find_contact(const char *); struct contactgroup *find_contactgroup(const char *); struct command *find_command(const char *); struct service *find_service(const char *, const char *); #define OBJECTLIST_DUPE 1 int add_object_to_objectlist(struct objectlist **, void *); int prepend_object_to_objectlist(struct objectlist **, void *); int prepend_unique_object_to_objectlist(struct objectlist **, void *, size_t size); int free_objectlist(objectlist **); /**** Object Query Functions ****/ unsigned int host_services_value(struct host *h); int is_host_immediate_child_of_host(struct host *, struct host *); /* checks if a host is an immediate child of another host */ int is_host_primary_immediate_child_of_host(struct host *, struct host *); /* checks if a host is an immediate child (and primary child) of another host */ int is_host_immediate_parent_of_host(struct host *, struct host *); /* checks if a host is an immediate child of another host */ int is_host_member_of_hostgroup(struct hostgroup *, struct host *); /* tests whether or not a host is a member of a specific hostgroup */ int is_host_member_of_servicegroup(struct servicegroup *, struct host *); /* tests whether or not a service is a member of a specific servicegroup */ int is_service_member_of_servicegroup(struct servicegroup *, struct service *); /* tests whether or not a service is a member of a specific servicegroup */ int is_contact_member_of_contactgroup(struct contactgroup *, struct contact *); /* tests whether or not a contact is a member of a specific contact group */ int is_contact_for_host(struct host *, struct contact *); /* tests whether or not a contact is a contact member for a specific host */ int is_contactgroup_for_host(struct host *, struct contactgroup *); /* tests whether a contact group is a contract group for a specific host */ int is_escalated_contact_for_host(struct host *, struct contact *); /* checks whether or not a contact is an escalated contact for a specific host */ int is_contact_for_host_escalation(hostescalation *, contact *); /* tests whether a contact is an contact for a particular host escalation */ int is_contactgroup_for_host_escalation(hostescalation *, contactgroup *); /* tests whether a contactgroup is a contactgroup for a particular host escalation */ int is_contact_for_service(struct service *, struct contact *); /* tests whether or not a contact is a contact member for a specific service */ int is_contactgroup_for_service(struct service *, struct contactgroup *); /* tests whether a contact group is a contract group for a specific service */ int is_escalated_contact_for_host(struct host *, struct contact *); /* checks whether or not a contact is an escalated contact for a specific host */ int is_escalated_contact_for_service(struct service *, struct contact *); /* checks whether or not a contact is an escalated contact for a specific service */ int is_contact_for_service_escalation(serviceescalation *, contact *); /* tests whether a contact is an contact for a particular service escalation */ int is_contactgroup_for_service_escalation(serviceescalation *, contactgroup *); /* tests whether a contactgroup is a contactgroup for a particular service escalation */ int number_of_immediate_child_hosts(struct host *); /* counts the number of immediate child hosts for a particular host */ int number_of_total_child_hosts(struct host *); /* counts the number of total child hosts for a particular host */ int number_of_immediate_parent_hosts(struct host *); /* counts the number of immediate parents hosts for a particular host */ #ifndef NSCGI void fcache_contactlist(FILE *fp, const char *prefix, struct contactsmember *list); void fcache_contactgrouplist(FILE *fp, const char *prefix, struct contactgroupsmember *list); void fcache_hostlist(FILE *fp, const char *prefix, struct hostsmember *list); void fcache_customvars(FILE *fp, struct customvariablesmember *cvlist); void fcache_timeperiod(FILE *fp, struct timeperiod *temp_timeperiod); void fcache_command(FILE *fp, struct command *temp_command); void fcache_contactgroup(FILE *fp, struct contactgroup *temp_contactgroup); void fcache_hostgroup(FILE *fp, struct hostgroup *temp_hostgroup); void fcache_servicegroup(FILE *fp, struct servicegroup *temp_servicegroup); void fcache_contact(FILE *fp, struct contact *temp_contact); void fcache_host(FILE *fp, struct host *temp_host); void fcache_service(FILE *fp, struct service *temp_service); void fcache_servicedependency(FILE *fp, struct servicedependency *temp_servicedependency); void fcache_serviceescalation(FILE *fp, struct serviceescalation *temp_serviceescalation); void fcache_hostdependency(FILE *fp, struct hostdependency *temp_hostdependency); void fcache_hostescalation(FILE *fp, struct hostescalation *temp_hostescalation); int fcache_objects(char *cache_file); #endif /**** Object Cleanup Functions ****/ int free_object_data(void); /* frees all allocated memory for the object definitions */ NAGIOS_END_DECL #endif nagios-4.3.4/include/perfdata.h000066400000000000000000000025421314764422400163760ustar00rootroot00000000000000/***************************************************************************** * * PERFDATA.H - Include file for performance data routines * * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #ifndef NAGIOS_PERFDATA_H_INCLUDED #define NAGIOS_PERFDATA_H_INCLUDED #include "common.h" #include "objects.h" NAGIOS_BEGIN_DECL int initialize_performance_data(const char *); /* initializes performance data */ int cleanup_performance_data(void); /* cleans up performance data */ int update_host_performance_data(host *); /* updates host performance data */ int update_service_performance_data(service *); /* updates service performance data */ NAGIOS_END_DECL #endif nagios-4.3.4/include/shared.h000066400000000000000000000034441314764422400160600ustar00rootroot00000000000000#ifndef NAGIOS_SHARED_H_INCLUDED #define NAGIOS_SHARED_H_INCLUDED #include #include "lib/libnagios.h" NAGIOS_BEGIN_DECL /* mmapfile structure - used for reading files via mmap() */ typedef struct mmapfile_struct { char *path; int mode; int fd; unsigned long file_size; unsigned long current_position; unsigned long current_line; void *mmap_buf; } mmapfile; /* official count of first-class objects */ struct object_count { unsigned int commands; unsigned int timeperiods; unsigned int hosts; unsigned int hostescalations; unsigned int hostdependencies; unsigned int services; unsigned int serviceescalations; unsigned int servicedependencies; unsigned int contacts; unsigned int contactgroups; unsigned int hostgroups; unsigned int servicegroups; }; extern struct object_count num_objects; extern void init_shared_cfg_vars(int); extern void timing_point(const char *fmt, ...); /* print a message and the time since the first message */ extern char *my_strtok(char *buffer, const char *tokens); extern char *my_strsep(char **stringp, const char *delim); extern mmapfile *mmap_fopen(const char *filename); extern int mmap_fclose(mmapfile *temp_mmapfile); extern char *mmap_fgets(mmapfile *temp_mmapfile); extern char *mmap_fgets_multiline(mmapfile * temp_mmapfile); extern void strip(char *buffer); extern int hashfunc(const char *name1, const char *name2, int hashslots); extern int compare_hashdata(const char *val1a, const char *val1b, const char *val2a, const char *val2b); extern void get_datetime_string(time_t *raw_time, char *buffer, int buffer_length, int type); extern void get_time_breakdown(unsigned long raw_time, int *days, int *hours, int *minutes, int *seconds); NAGIOS_END_DECL #endif nagios-4.3.4/include/sretention.h000066400000000000000000000022571314764422400170050ustar00rootroot00000000000000/***************************************************************************** * * SRETENTION.H - Header for state retention routines * * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #include "common.h" NAGIOS_BEGIN_DECL int initialize_retention_data(const char *); int cleanup_retention_data(void); int save_state_information(int); /* saves all host and state information */ int read_initial_state_information(void); /* reads in initial host and state information */ NAGIOS_END_DECL nagios-4.3.4/include/statusdata.h000066400000000000000000000144651314764422400167740ustar00rootroot00000000000000/***************************************************************************** * * STATUSDATA.H - Header for external status data routines * * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #ifndef NAGIOS_STATUSDATA_H_INCLUDED #define NAGIOS_STATUSDATA_H_INCLUDED #include "common.h" #include "objects.h" #ifdef NSCGI #define READ_PROGRAM_STATUS 1 #define READ_HOST_STATUS 2 #define READ_SERVICE_STATUS 4 #define READ_CONTACT_STATUS 8 #define READ_ALL_STATUS_DATA READ_PROGRAM_STATUS | READ_HOST_STATUS | READ_SERVICE_STATUS | READ_CONTACT_STATUS /*************************** CHAINED HASH LIMITS ***************************/ #define SERVICESTATUS_HASHSLOTS 1024 #define HOSTSTATUS_HASHSLOTS 1024 /**************************** DATA STRUCTURES ******************************/ NAGIOS_BEGIN_DECL /* HOST STATUS structure */ typedef struct hoststatus_struct { char *host_name; char *plugin_output; char *long_plugin_output; char *perf_data; int status; time_t last_update; int has_been_checked; int should_be_scheduled; int current_attempt; int max_attempts; time_t last_check; time_t next_check; int check_options; int check_type; time_t last_state_change; time_t last_hard_state_change; int last_hard_state; time_t last_time_up; time_t last_time_down; time_t last_time_unreachable; int state_type; time_t last_notification; time_t next_notification; int no_more_notifications; int notifications_enabled; int problem_has_been_acknowledged; int acknowledgement_type; int current_notification_number; int accept_passive_checks; int event_handler_enabled; int checks_enabled; int flap_detection_enabled; int is_flapping; double percent_state_change; double latency; double execution_time; int scheduled_downtime_depth; int process_performance_data; int obsess; struct hoststatus_struct *next; struct hoststatus_struct *nexthash; } hoststatus; /* SERVICE STATUS structure */ typedef struct servicestatus_struct { char *host_name; char *description; char *plugin_output; char *long_plugin_output; char *perf_data; int max_attempts; int current_attempt; int status; time_t last_update; int has_been_checked; int should_be_scheduled; time_t last_check; time_t next_check; int check_options; int check_type; int checks_enabled; time_t last_state_change; time_t last_hard_state_change; int last_hard_state; time_t last_time_ok; time_t last_time_warning; time_t last_time_unknown; time_t last_time_critical; int state_type; time_t last_notification; time_t next_notification; int no_more_notifications; int notifications_enabled; int problem_has_been_acknowledged; int acknowledgement_type; int current_notification_number; int accept_passive_checks; int event_handler_enabled; int flap_detection_enabled; int is_flapping; double percent_state_change; double latency; double execution_time; int scheduled_downtime_depth; int process_performance_data; int obsess; struct servicestatus_struct *next; struct servicestatus_struct *nexthash; } servicestatus; /*************************** SERVICE STATES ***************************/ #define SERVICE_PENDING 1 #define SERVICE_OK 2 #define SERVICE_WARNING 4 #define SERVICE_UNKNOWN 8 #define SERVICE_CRITICAL 16 /**************************** HOST STATES ****************************/ #define HOST_PENDING 1 #define SD_HOST_UP 2 #define SD_HOST_DOWN 4 #define SD_HOST_UNREACHABLE 8 /* Convert the (historically ordered) host states into a notion of "urgency". This is defined as, in ascending order: SD_HOST_UP (business as usual) HOST_PENDING (waiting for - supposedly first - check result) SD_HOST_UNREACHABLE (a problem, but likely not its cause) SD_HOST_DOWN (look here!!) The exact values are irrelevant, so I try to make the conversion as CPU-efficient as possible: */ #define HOST_URGENCY(hs) ((hs)|(((hs)&0x5)<<1)) /**************************** FUNCTIONS ******************************/ int read_status_data(const char *, int); /* reads all status data */ int add_host_status(hoststatus *); /* adds a host status entry to the list in memory */ int add_service_status(servicestatus *); /* adds a service status entry to the list in memory */ int add_hoststatus_to_hashlist(hoststatus *); int add_servicestatus_to_hashlist(servicestatus *); servicestatus *find_servicestatus(char *, char *); /* finds status information for a specific service */ hoststatus *find_hoststatus(char *); /* finds status information for a specific host */ int get_servicestatus_count(char *, int); /* gets total number of services of a certain type for a specific host */ void free_status_data(void); /* free all memory allocated to status data */ #endif #ifndef NSCGI int initialize_status_data(const char *); /* initializes status data at program start */ int update_all_status_data(void); /* updates all status data */ int cleanup_status_data(int); /* cleans up status data at program termination */ int update_program_status(int); /* updates program status data */ int update_host_status(host *, int); /* updates host status data */ int update_service_status(service *, int); /* updates service status data */ int update_contact_status(contact *, int); /* updates contact status data */ #endif NAGIOS_END_DECL #endif nagios-4.3.4/include/statusjson.h000066400000000000000000000266571314764422400170420ustar00rootroot00000000000000/************************************************************************** * * STATUSJSON.H - Nagios CGI for returning JSON-formatted status data * * Copyright (c) 2013 Nagios Enterprises, LLC * Last Modified: 04-13-2013 * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *************************************************************************/ #ifndef NAGIOS_STATUSJSON_H_INCLUDED #define NAGIOS_STATUSJSON_H_INCLUDED /* Structure containing CGI query string options and values */ typedef struct status_json_cgi_data_struct { /* Format options for JSON output */ unsigned format_options; /* Query being requested */ int query; /* Index of starting object returned for list requests */ int start; /* Number of objects returned for list requests */ int count; /* Return details for each entity in a list request */ int details; /* strftime format string for time_t values */ char * strftime_format; /* Name of host whose children should be returned if parenthost is specified */ char * parent_host_name; /* Use the parent host field or search all hosts*/ int use_parent_host; /* Host whose children should be returned if use_parent_host is non-zero */ host * parent_host; /* Name of host whose parents should be returned if childhost is specified */ char * child_host_name; /* Use the child host field or search all hosts*/ int use_child_host; /* Host whose parents should be returned if use_child_host is non-zero */ host * child_host; /* Name of host for which details should be returned */ char * host_name; /* Host whose host name is host_name */ host * host; /* The host status selector values */ unsigned host_statuses; /* Name of hostgroup for which details should be returned */ char * hostgroup_name; /* Hostgroup whose name is hostgroup_name */ hostgroup * hostgroup; /* Name of servicegroup for which details should be returned */ char * servicegroup_name; /* Servicegroup whose name is servicegroup_name */ servicegroup * servicegroup; /* Name of service for which details should be returned */ char * service_description; /* Service whose host name is host_name and whose description is service_description*/ service * service; /* The service status selector values */ unsigned service_statuses; /* Name of service whose children should be returned if parentservice is specified */ char * parent_service_name; /* Name of service whose parents should be returned if childservice is specified */ char * child_service_name; /* Name of contactgroup for which details should be returned */ char * contactgroup_name; /* Contactgroup whose name is contactgroup_name */ contactgroup * contactgroup; /* Name of contact for which details should be returned */ char * contact_name; /* Contact whose contact name is contact_name */ contact * contact; /* Name of check timeperiod for which details should be returned */ char * check_timeperiod_name; /* Timeperiod whose timeperiod name is check_timeperiod_name */ timeperiod *check_timeperiod; /* Name of host notification timeperiod for which details should be returned */ char * host_notification_timeperiod_name; /* Timeperiod whose timeperiod name is host_notification_timeperiod_name */ timeperiod *host_notification_timeperiod; /* Name of service notification timeperiod for which details should be returned */ char * service_notification_timeperiod_name; /* Timeperiod whose timeperiod name is service_notification_timeperiod_name */ timeperiod *service_notification_timeperiod; /* Name of check command to be used as a selector */ char * check_command_name; /* Command whose command name is check_command_name */ command * check_command; /* Name of event handle to be used as a selector */ char * event_handler_name; /* Command whose command name is event_handler_name */ command * event_handler; /* Type(s) of comments to include in comment count and list results */ unsigned comment_types; /* Entry type(s) of comments to include in comment count and list results */ unsigned entry_types; /* Persistence(s) of comments to include in comment count and list results */ unsigned persistence; /* Whether comments that are expiring, non-expiring, or both are included in comment count and list results */ unsigned expiring; /* ID of comment for which details should be returned */ int comment_id; /* Comment whose id is comment_id */ nagios_comment *comment; /* ID of downtime for which details should be returned */ int downtime_id; /* Downtime whose id is downtime_id */ scheduled_downtime * downtime; /* Start time for time-based queries */ time_t start_time; /* End time for time-based queries */ time_t end_time; /* Field on which to base time for hostcount and hostlist queries */ int host_time_field; /* Field on which to base time for servicecount and servicelist queries */ int service_time_field; /* Field on which to base time for commentcount and commentlist queries */ int comment_time_field; /* Field on which to base time for downtimecount and downtimelist queries */ int downtime_time_field; /* Object type to use for downtimecount and downtimelist queries */ unsigned downtime_object_types; /* Downtime type to use for downtimecount and downtimelist queries */ unsigned downtime_types; /* Whether downtimes that are triggered, non-triggered, or both are included in downtime count and list results */ unsigned triggered; /* ID of a triggering downtime */ int triggered_by; /* Whether downtimes that are or are not in effect or both are included in downtime count and list results */ unsigned in_effect; } status_json_cgi_data; /* Status Type Information */ #define STATUS_QUERY_INVALID 0 #define STATUS_QUERY_HOSTCOUNT 1 #define STATUS_QUERY_HOSTLIST 2 #define STATUS_QUERY_HOST 3 #define STATUS_QUERY_SERVICECOUNT 4 #define STATUS_QUERY_SERVICELIST 5 #define STATUS_QUERY_SERVICE 6 #if 0 #define STATUS_QUERY_CONTACTCOUNT 7 #define STATUS_QUERY_CONTACTLIST 8 #define STATUS_QUERY_CONTACT 9 #endif #define STATUS_QUERY_COMMENTCOUNT 10 #define STATUS_QUERY_COMMENTLIST 11 #define STATUS_QUERY_COMMENT 12 #define STATUS_QUERY_DOWNTIMECOUNT 13 #define STATUS_QUERY_DOWNTIMELIST 14 #define STATUS_QUERY_DOWNTIME 16 #define STATUS_QUERY_PROGRAMSTATUS 17 #define STATUS_QUERY_PERFORMANCEDATA 18 #define STATUS_QUERY_HELP 19 /* Status Time Fields */ #define STATUS_TIME_INVALID 0 #define STATUS_TIME_LAST_UPDATE 1 /* host, service */ #define STATUS_TIME_LAST_CHECK 2 /* host, service */ #define STATUS_TIME_NEXT_CHECK 3 /* host, service */ #define STATUS_TIME_LAST_STATE_CHANGE 4 /* host, service */ #define STATUS_TIME_LAST_HARD_STATE_CHANGE 5 /* host, service */ #define STATUS_TIME_LAST_TIME_UP 6 /* host */ #define STATUS_TIME_LAST_TIME_DOWN 7 /* host */ #define STATUS_TIME_LAST_TIME_UNREACHABLE 8 /* host */ #define STATUS_TIME_LAST_TIME_OK 9 /* service */ #define STATUS_TIME_LAST_TIME_WARNING 10 /* service */ #define STATUS_TIME_LAST_TIME_CRITICAL 11 /* service */ #define STATUS_TIME_LAST_TIME_UNKNOWN 12 /* service */ #define STATUS_TIME_LAST_NOTIFICATION 13 /* host, service */ #define STATUS_TIME_NEXT_NOTIFICATION 14 /* host, service */ #define STATUS_TIME_ENTRY_TIME 15 /* comment, downtime */ #define STATUS_TIME_EXPIRE_TIME 16 /* comment */ #define STATUS_TIME_START_TIME 17 /* downtime */ #define STATUS_TIME_FLEX_DOWNTIME_START 18 /* downtime */ #define STATUS_TIME_END_TIME 19 /* downtime */ /* Comment Types */ #define COMMENT_TYPE_HOST 1 #define COMMENT_TYPE_SERVICE 2 #define COMMENT_TYPE_ALL (COMMENT_TYPE_HOST | COMMENT_TYPE_SERVICE) /* Comment Entry Types */ #define COMMENT_ENTRY_USER 1 #define COMMENT_ENTRY_DOWNTIME 2 #define COMMENT_ENTRY_FLAPPING 4 #define COMMENT_ENTRY_ACKNOWLEDGEMENT 8 #define COMMENT_ENTRY_ALL (COMMENT_ENTRY_USER |\ COMMENT_ENTRY_DOWNTIME |\ COMMENT_ENTRY_FLAPPING |\ COMMENT_ENTRY_ACKNOWLEDGEMENT) /* Downtime Object Types */ #define DOWNTIME_OBJECT_TYPE_HOST 1 #define DOWNTIME_OBJECT_TYPE_SERVICE 2 #define DOWNTIME_OBJECT_TYPE_ALL (DOWNTIME_OBJECT_TYPE_HOST |\ DOWNTIME_OBJECT_TYPE_SERVICE) /* Downtime Types */ #define DOWNTIME_TYPE_FIXED 1 #define DOWNTIME_TYPE_FLEXIBLE 2 #define DOWNTIME_TYPE_ALL (DOWNTIME_TYPE_FIXED | DOWNTIME_TYPE_FLEXIBLE) extern json_object *json_status_hostcount(unsigned, int, host *, int, host *, hostgroup *, int, contact *, int, time_t, time_t, contactgroup *, timeperiod *, timeperiod *, command *, command *); extern json_object *json_status_hostlist(unsigned, int, int, int, int, host *, int, host *, hostgroup *, int, contact *, int, time_t, time_t, contactgroup *, timeperiod *, timeperiod *, command *, command *); extern json_object *json_status_host(unsigned, host *, hoststatus *); extern void json_status_host_details(json_object *, unsigned, host *, hoststatus *); extern json_object *json_status_servicecount(unsigned, host *, int, host *, int, host *, hostgroup *, servicegroup *, int, int, contact *, int, time_t, time_t, char *, char *, char *, contactgroup *, timeperiod *, timeperiod *, command *, command *); extern json_object *json_status_servicelist(unsigned, int, int, int, host *, int, host *, int, host *, hostgroup *, servicegroup *, int, int, contact *, int, time_t, time_t, char *, char *, char *, contactgroup *, timeperiod *, timeperiod *, command *, command *); extern json_object *json_status_service(unsigned, service *, servicestatus *); extern void json_status_service_details(json_object *, unsigned, service *, servicestatus *); #if 0 extern void json_status_contactlist(unsigned, unsigned, unsigned, unsigned, unsigned, contactgroup *); extern void json_status_contactlist(unsigned, unsigned, unsigned, unsigned, unsigned, contactgroup *); extern void json_status_contact(unsigned, unsigned, contact *); extern void json_status_contact_details(unsigned, unsigned, contact *); #endif extern json_object *json_status_commentcount(unsigned, int, time_t, time_t, unsigned, unsigned, unsigned, unsigned, char *, char *); extern json_object *json_status_commentlist(unsigned, int, int, int, int, time_t, time_t, unsigned, unsigned, unsigned, unsigned, char *, char *); extern json_object *json_status_comment(unsigned, nagios_comment *); extern void json_status_comment_details(json_object *, unsigned, nagios_comment *); extern json_object *json_status_downtimecount(unsigned, int, time_t, time_t, unsigned, unsigned, unsigned, int, unsigned, char *, char *); extern json_object *json_status_downtimelist(unsigned, int, int, int, int, time_t, time_t, unsigned, unsigned, unsigned, int, unsigned, char *, char *); extern json_object *json_status_downtime(unsigned, scheduled_downtime *); extern void json_status_downtime_details(json_object *, unsigned, scheduled_downtime *); extern json_object *json_status_program(unsigned); extern json_object *json_status_performance(void); #endif nagios-4.3.4/include/workers.h000066400000000000000000000036111314764422400163020ustar00rootroot00000000000000#ifndef INCLUDE_WORKERS_H_INCLUDED #define INCLUDE_WORKERS_H_INCLUDED #include "lib/libnagios.h" #include "lib/worker.h" #include "nagios.h" /* for check_result definition */ /* different jobtypes. We add more as needed */ #define WPJOB_CHECK 0 #define WPJOB_NOTIFY 1 #define WPJOB_OCSP 2 #define WPJOB_OCHP 3 #define WPJOB_GLOBAL_SVC_EVTHANDLER 4 #define WPJOB_SVC_EVTHANDLER 5 #define WPJOB_GLOBAL_HOST_EVTHANDLER 6 #define WPJOB_HOST_EVTHANDLER 7 #define WPJOB_CALLBACK 8 #define WPJOB_HOST_PERFDATA 9 #define WPJOB_SVC_PERFDATA 10 #define WPROC_FORCE (1 << 0) NAGIOS_BEGIN_DECL; typedef struct wproc_result { unsigned int job_id; unsigned int type; time_t timeout; struct timeval start; struct timeval stop; struct timeval runtime; char *command; char *outstd; char *outerr; char *error_msg; int wait_status; int error_code; int exited_ok; int early_timeout; struct kvvec *response; struct rusage rusage; } wproc_result; extern unsigned int wproc_num_workers_spawned; extern unsigned int wproc_num_workers_online; extern unsigned int wproc_num_workers_desired; extern void wproc_reap(int jobs, int msecs); extern int wproc_can_spawn(struct load_control *lc); extern void free_worker_memory(int flags); extern int workers_alive(void); extern int init_workers(int desired_workers); extern int wproc_run_check(check_result *cr, char *cmd, nagios_macros *mac); extern int wproc_notify(char *cname, char *hname, char *sdesc, char *cmd, nagios_macros *mac); extern int wproc_run(int job_type, char *cmd, int timeout, nagios_macros *mac); extern int wproc_run_service_job(int jtype, int timeout, service *svc, char *cmd, nagios_macros *mac); extern int wproc_run_host_job(int jtype, int timeout, host *hst, char *cmd, nagios_macros *mac); extern int wproc_run_callback(char *cmt, int timeout, void (*cb)(struct wproc_result *, void *, int), void *data, nagios_macros *mac); NAGIOS_END_DECL; #endif nagios-4.3.4/indent-all.sh000077500000000000000000000001151314764422400153740ustar00rootroot00000000000000#!/bin/sh for f in `find . -type f -name "*.[c]"`; do ./indent.sh $f done nagios-4.3.4/indent.sh000077500000000000000000000002411314764422400146260ustar00rootroot00000000000000#!/bin/sh ARTISTIC_STYLE_OPTIONS=/dev/null export ARTISTIC_STYLE_OPTIONS astyle --style=banner --indent=tab --unpad-paren --pad-oper --suffix=.pre-indent "$@" nagios-4.3.4/install-sh000077500000000000000000000133551314764422400150240ustar00rootroot00000000000000#! /bin/sh # # install - install a program, script, or datafile # This comes from X11R5 (mit/util/scripts/install.sh). # # Copyright 1991 by the Massachusetts Institute of Technology # # Permission to use, copy, modify, distribute, and sell this software and its # documentation for any purpose is hereby granted without fee, provided that # the above copyright notice appear in all copies and that both that # copyright notice and this permission notice appear in supporting # documentation, and that the name of M.I.T. not be used in advertising or # publicity pertaining to distribution of the software without specific, # written prior permission. M.I.T. makes no representations about the # suitability of this software for any purpose. It is provided "as is" # without express or implied warranty. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. It can only install one file at a time, a restriction # shared with many OS's install programs. # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit="${DOITPROG-}" # put in absolute paths if you don't have them in your path; or use env. vars. mvprog="${MVPROG-mv}" cpprog="${CPPROG-cp}" chmodprog="${CHMODPROG-chmod}" chownprog="${CHOWNPROG-chown}" chgrpprog="${CHGRPPROG-chgrp}" stripprog="${STRIPPROG-strip}" rmprog="${RMPROG-rm}" mkdirprog="${MKDIRPROG-mkdir}" transformbasename="" transform_arg="" instcmd="$mvprog" chmodcmd="$chmodprog 0755" chowncmd="" chgrpcmd="" stripcmd="" rmcmd="$rmprog -f" mvcmd="$mvprog" src="" dst="" dir_arg="" while [ x"$1" != x ]; do case $1 in -c) instcmd="$cpprog" shift continue;; -d) dir_arg=true shift continue;; -m) chmodcmd="$chmodprog $2" shift shift continue;; -o) chowncmd="$chownprog $2" shift shift continue;; -g) chgrpcmd="$chgrpprog $2" shift shift continue;; -s) stripcmd="$stripprog" shift continue;; -b) shift # ADDED 10/20/07 EG # This script doesn't understand how to make backups, so make this a noop in case the option is used echo "!!! WARNING !!! This install-sh script doesn't understand how to make backups (-b option), so none will be made" continue;; -t=*) transformarg=`echo $1 | sed 's/-t=//'` shift continue;; -b=*) transformbasename=`echo $1 | sed 's/-b=//'` shift continue;; *) if [ x"$src" = x ] then src=$1 else # this colon is to work around a 386BSD /bin/sh bug : dst=$1 fi shift continue;; esac done if [ x"$src" = x ] then echo "install: no input file specified" exit 1 else true fi if [ x"$dir_arg" != x ]; then dst=$src src="" if [ -d $dst ]; then instcmd=: else instcmd=mkdir fi else # Waiting for this to be detected by the "$instcmd $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if [ -f $src -o -d $src ] then true else echo "install: $src does not exist" exit 1 fi if [ x"$dst" = x ] then echo "install: no destination specified" exit 1 else true fi # If destination is a directory, append the input filename; if your system # does not like double slashes in filenames, you may need to add some logic if [ -d $dst ] then dst="$dst"/`basename $src` else true fi fi ## this sed command emulates the dirname command dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` # Make sure that the destination directory exists. # this part is taken from Noah Friedman's mkinstalldirs script # Skip lots of stat calls in the usual case. if [ ! -d "$dstdir" ]; then defaultIFS=' ' IFS="${IFS-${defaultIFS}}" oIFS="${IFS}" # Some sh's can't handle IFS=/ for some reason. IFS='%' set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` IFS="${oIFS}" pathcomp='' while [ $# -ne 0 ] ; do pathcomp="${pathcomp}${1}" shift if [ ! -d "${pathcomp}" ] ; then $mkdirprog "${pathcomp}" else true fi pathcomp="${pathcomp}/" done fi if [ x"$dir_arg" != x ] then $doit $instcmd $dst && if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi else # If we're going to rename the final executable, determine the name now. if [ x"$transformarg" = x ] then dstfile=`basename $dst` else dstfile=`basename $dst $transformbasename | sed $transformarg`$transformbasename fi # don't allow the sed command to completely eliminate the filename if [ x"$dstfile" = x ] then dstfile=`basename $dst` else true fi # Make a temp file name in the proper directory. dsttmp=$dstdir/#inst.$$# # Move or copy the file name to the temp name $doit $instcmd $src $dsttmp && trap "rm -f ${dsttmp}" 0 && # and set any options; do chmod last to preserve setuid bits # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $instcmd $src $dsttmp" command. if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && # Now rename the file to the real destination. $doit $rmcmd -f $dstdir/$dstfile && $doit $mvcmd $dsttmp $dstdir/$dstfile fi && exit 0 nagios-4.3.4/lib/000077500000000000000000000000001314764422400135575ustar00rootroot00000000000000nagios-4.3.4/lib/.gitignore000066400000000000000000000002201314764422400155410ustar00rootroot00000000000000test-squeue test-kvvec test-iocache test-iobroker test-bitmap test-dkhash test-runcmd test-fanout test-nsutils wproc iobroker.h snprintf.h core nagios-4.3.4/lib/Makefile.in000066400000000000000000000037771314764422400156420ustar00rootroot00000000000000CC = @CC@ COV_CFLAGS = -ggdb3 -O0 -ftest-coverage -fprofile-arcs -pg LDFLAGS = CFLAGS ?= -Wall @CFLAGS@ ALL_CFLAGS = $(CFLAGS) @DEFS@ LIBNAME = libnagios.a all: $(LIBNAME) SOCKETLIBS=@SOCKETLIBS@ SNPRINTF_O=@SNPRINTF_O@ TESTED_SRC_C := squeue.c kvvec.c iocache.c iobroker.c bitmap.c dkhash.c runcmd.c TESTED_SRC_C += nsutils.c fanout.c SRC_C := $(TESTED_SRC_C) pqueue.c worker.c skiplist.c nsock.c SRC_C += nspath.c SRC_O := $(patsubst %.c,%.o,$(SRC_C)) $(SNPRINTF_O) TESTS := $(patsubst %.c,test-%,$(TESTED_SRC_C)) test: $(TESTS) @for t in $(TESTS); do echo $$t:; ./$$t || exit 1; echo; done test-squeue: pqueue.o test-squeue.o t-utils.o $(CC) $(ALL_CFLAGS) $(LDFLAGS) $^ -o $@ test-iocache: t-utils.o test-iocache.o $(CC) $(ALL_CFLAGS) $(SOCKETLIBS) $^ -o $@ test-iobroker: t-utils.o test-iobroker.o $(CC) $(ALL_CFLAGS) $(SOCKETLIBS) $^ -o $@ %.o: %.c %.h Makefile lnag-utils.h $(CC) $(ALL_CFLAGS) -c $< -o $@ test-%.o: test-%.c %.c %.h Makefile $(CC) $(ALL_CFLAGS) -c $< -o $@ test-%: t-utils.o test-%.o $(CC) $(ALL_CFLAGS) $^ -o $@ $(LIBNAME): $(SRC_O) $(AR) cr $@ $^ wproc: wproc.o $(LIBNAME) $(CC) $(ALL_CFLAGS) $(ALL_LDFLAGS) $^ -o $@ coverage: @$(MAKE) -s --no-print-directory clean @$(MAKE) --no-print-directory cov-build @$(MAKE) --no-print-directory cov-report cov-build: $(MAKE) CFLAGS='$(COV_CFLAGS)' LDFLAGS='$(COV_CFLAGS)' test cov-report: @{ for f in $(TESTS) pqueue; do \ gcov -b -p $$f.c >/dev/null; \ done; } @rm -f *.h.gcov test-*.c.gcov @echo "--- untested functions:" | tee -a untested @grep '^function .* called 0' *.c.gcov \ | sed -e 's/function \([^ ]*\) called 0.*/\1/' \ | sed -e 's/\.c\.gcov:/\.c:/' | tee -a untested distclean: clean rm -f Makefile iobroker.h clean: clean-test clean-coverage rm -f core.* *.o *~ wproc *.a clean-test: clean-coverage rm -f $(TESTS) clean-coverage: rm -f untested *.gcov *.gcda *.gcno gmon.out .PHONY: clean clean-test clean-coverage coverage # stop make from removing intermediary files, as ours aren't really # intermediary .SECONDARY: nagios-4.3.4/lib/bitmap.c000066400000000000000000000137031314764422400152030ustar00rootroot00000000000000#include #include "bitmap.h" #include #include #include #ifndef CHAR_BIT # define CHAR_BIT 8 #endif typedef unsigned int bmap; #define MAPSIZE (sizeof(bmap) * CHAR_BIT) #define MAPMASK (MAPSIZE - 1) /* bits - 1, so 63 for 64-bit machines */ #define SHIFTOUT (MAPSIZE == 64 ? 6 : 5) /* log2(bits) */ struct bitmap { bmap *vector; unsigned long alloc; }; void bitmap_clear(bitmap *bm) { if (bm) memset(bm->vector, 0, bm->alloc * sizeof(bmap)); } int bitmap_resize(bitmap *bm, unsigned long size) { unsigned long ralloc; bmap *nvec; if (!bm) return -1; /* be tight on space */ ralloc = (size >> SHIFTOUT) + !!(size & MAPMASK); if (!bm->vector) { bm->vector = calloc(1, ralloc * sizeof(bmap)); if (!bm->vector) return -1; bm->alloc = ralloc; return 0; } nvec = realloc(bm->vector, ralloc * sizeof(bmap)); if (!nvec) { return -1; } bm->vector = nvec; bm->alloc = ralloc; return 0; } static bitmap *bitmap_init(bitmap *bm, unsigned long size) { int ret; if (!bm) return NULL; ret = bitmap_resize(bm, size); if (ret < 0) return NULL; return bm; } bitmap *bitmap_create(unsigned long size) { bitmap *bm; if (!(bm = calloc(1, sizeof(bitmap)))) return NULL; if (bitmap_init(bm, size) == bm) return bm; free(bm); return NULL; } void bitmap_destroy(bitmap *bm) { if (!bm) return; if (bm->vector) free(bm->vector); free(bm); } bitmap *bitmap_copy(const bitmap *bm) { bitmap *ret; if (!bm) return NULL; ret = bitmap_create(bitmap_cardinality(bm)); if (!ret) return NULL; memcpy(ret->vector, bm->vector, bitmap_size(bm)); return ret; } static inline unsigned int l_bits(bmap map) { unsigned int i, tot_bits = 0; /* * bits per byte. A 16k entry table would be slightly faster * on most archs but a damn sight uglier on all of them */ const unsigned char bpb[256] = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8, }; for (i = 0; i < sizeof(bmap); i++) { const unsigned char ch = (map >> (i * CHAR_BIT)) & 0xff; const unsigned char cbits = bpb[ch]; tot_bits += cbits; } return tot_bits; } int bitmap_set(bitmap *bm, unsigned long pos) { const bmap l = pos >> SHIFTOUT; const unsigned int bit = pos & MAPMASK; if (!bm) return 0; if (l > bm->alloc) return -1; bm->vector[l] |= (1 << bit); return 0; } int bitmap_isset(const bitmap *bm, unsigned long pos) { const bmap l = pos >> SHIFTOUT; const int bit = pos & MAPMASK; int set; if (!bm || l > bm->alloc) return 0; set = !!(bm->vector[l] & (1 << bit)); return set; } int bitmap_unset(bitmap *bm, unsigned long pos) { const bmap l = pos >> SHIFTOUT; const int bit = pos & MAPMASK; const int val = bitmap_isset(bm, pos); bm->vector[l] &= ~(1 << bit); return val; } unsigned long bitmap_cardinality(const bitmap *bm) { if (!bm) return 0; return bm->alloc * MAPSIZE; } /* * count set bits in alloc * (mapsize / 8) ops */ unsigned long bitmap_count_set_bits(const bitmap *bm) { unsigned long i, set_bits = 0; if (!bm) return 0; for (i = 0; i < bm->alloc; i++) { set_bits += l_bits(bm->vector[i]); } return set_bits; } unsigned long bitmap_count_unset_bits(const bitmap *bm) { return bitmap_cardinality(bm) - bitmap_count_set_bits(bm); } #define BITMAP_MATH(a, b) \ unsigned int i; \ bitmap *bm; \ /* a->alloc has to be smallest */ \ if (a->alloc > b->alloc) { \ const bitmap *temp = b; \ b = a; \ a = temp; \ } \ bm = bitmap_create(bitmap_cardinality(b)); \ if (!bm) \ return NULL; \ for (i = 0; i < a->alloc; i++) bitmap *bitmap_intersect(const bitmap *a, const bitmap *b) { BITMAP_MATH(a, b) { bm->vector[i] = a->vector[i] & b->vector[i]; } return bm; } bitmap *bitmap_union(const bitmap *a, const bitmap *b) { if(!a) return bitmap_copy(b); if(!b) return bitmap_copy(a); do { BITMAP_MATH(a, b) { bm->vector[i] = a->vector[i] | b->vector[i]; } return bm; } while(0); } bitmap *bitmap_unite(bitmap *res, const bitmap *addme) { unsigned int i; if(!addme || !res) return res; if (bitmap_size(addme) > bitmap_size(res)) { bitmap_resize(res, bitmap_size(addme)); } for (i = 0; i < addme->alloc; i++) { res->vector[i] |= addme->vector[i]; } return res; } /* * set difference gets everything in A that isn't also in B. A is the * numerator, so if it's larger we must include any overflow in the * resulting set. */ bitmap *bitmap_diff(const bitmap *a, const bitmap *b) { const bitmap *a_ = a, *b_ = b; BITMAP_MATH(a, b) { bm->vector[i] = a->vector[i] & ~(b->vector[i]); } if (a_->alloc > b_->alloc) { memcpy(&bm->vector[i], &b->vector[i], (b->alloc - a->alloc) * MAPSIZE); } return bm; } /* * symmetric set difference lists all items only present in one set */ bitmap *bitmap_symdiff(const bitmap *a, const bitmap *b) { BITMAP_MATH(a, b) { bm->vector[i] = (a->vector[i] | b->vector[i]) ^ (a->vector[i] & b->vector[i]); } if (b->alloc > a->alloc) { memcpy(&bm->vector[i], &b->vector[i], (b->alloc - a->alloc) * MAPSIZE); } return bm; } #define min(a, b) (a > b ? b : a) int bitmap_cmp(const bitmap *a, const bitmap *b) { int ret; ret = memcmp(a->vector, b->vector, min(a->alloc, b->alloc) * MAPSIZE); if (ret || a->alloc == b->alloc) { return ret; } if (a->alloc > b->alloc) return 1; return -1; } nagios-4.3.4/lib/bitmap.h000066400000000000000000000110751314764422400152100ustar00rootroot00000000000000#ifndef LIBNAGIOS_bitmap_h__ #define LIBNAGIOS_bitmap_h__ /** * @file bitmap.h * @brief Bit map API * * The bitmap api is useful for running set operations on objects * indexed by unsigned integers. * @{ */ struct bitmap; typedef struct bitmap bitmap; /** * Resize a bitmap * If the bitmap is made smaller, data will silently be lost. * * @param bm The bitmap to resize * @param size The new desired size of the bitmap * @return 0 on success, -1 on errors. */ extern int bitmap_resize(bitmap *bm, unsigned long size); /** * Create a bitmaptor of size 'size' * @param size Desired storage capacity * @return A bitmap pointer on success, NULL on errors */ extern bitmap *bitmap_create(unsigned long size); /** * Destroy a bitmaptor by freeing all the memory it uses * @param bm The bitmaptor to destroy */ extern void bitmap_destroy(bitmap *bm); /** * Copy a bitmaptor * @param bm The bitmaptor to copy * @return Pointer to an identical bitmap on success, NULL on errors */ extern bitmap *bitmap_copy(const bitmap *bm); /** * Set a bit in the map * @param bm The bitmaptor to operate on * @param pos Position of the bit to set * @return 0 on success, -1 on errors */ extern int bitmap_set(bitmap *bm, unsigned long pos); /** * Check if a particular bit is set in the map * @param bm The bitmaptor to check * @param pos Position of the bit to check * @return 1 if set, otherwise 0 */ extern int bitmap_isset(const bitmap *bm, unsigned long pos); /** * Unset a particular bit in the map * @param bm The bitmaptor to operate on * @param pos Position of the bit to unset */ extern int bitmap_unset(bitmap *bm, unsigned long pos); /** * Obtain cardinality (max number of elements) of the bitmaptor * @param bm The bitmaptor to check * @return The cardinality of the bitmaptor */ extern unsigned long bitmap_cardinality(const bitmap *bm); #define bitmap_size bitmap_cardinality /** * Count set bits in map. Completed in O(n/8) time. * @param bm The bitmaptor to count bits in * @return The number of set bits */ extern unsigned long bitmap_count_set_bits(const bitmap *bm); /** * Count unset bits in map. Completed in O(n/8) time. * @param bm The bitmaptor to count bits in * @return The number of set bits */ extern unsigned long bitmap_count_unset_bits(const bitmap *bm); /** * Unset all bits in a bitmap * @param bm The bitmap to clear */ extern void bitmap_clear(bitmap *bm); /** * Calculate intersection of two bitmaps * The intersection is defined as all bits that are members of * both A and B. It's equivalent to bitwise AND. * This function completes in O(n/sizeof(long)) operations. * @param a The first bitmaptor * @param b The second bitmaptor * @return NULL on errors; A newly created bitmaptor on success. */ extern bitmap *bitmap_intersect(const bitmap *a, const bitmap *b); /** * Calculate union of two bitmaps * The union is defined as all bits that are members of * A or B or both A and B. It's equivalent to bitwise OR. * This function completes in O(n/sizeof(long)) operations. * @param a The first bitmaptor * @param b The second bitmaptor * @return NULL on errors; A newly created bitmaptor on success. */ extern bitmap *bitmap_union(const bitmap *a, const bitmap *b); /** * Calculate union of two bitmaps and store result in one of them * @param res The first bitmap * @param addme The bitmap to unite to the first bitmap * @return NULL on errors, res on success */ extern bitmap *bitmap_unite(bitmap *res, const bitmap *addme); /** * Calculate set difference between two bitmaps * The set difference of A / B is defined as all members of A * that isn't members of B. Note that parameter ordering matters * for this function. * This function completes in O(n/sizeof(long)) operations. * @param a The first bitmaptor (numerator) * @param b The first bitmaptor (denominator) * @return NULL on errors; A newly created bitmaptor on success. */ extern bitmap *bitmap_diff(const bitmap *a, const bitmap *b); /** * Calculate symmetric difference between two bitmaps * The symmetric difference between A and B is the set that * contains all elements in either set but not in both. * This function completes in O(n/sizeof(long)) operations. * @param a The first bitmaptor * @param b The second bitmaptor */ extern bitmap *bitmap_symdiff(const bitmap *a, const bitmap *b); /** * Compare two bitmaps for equality * @param a The first bitmaptor * @param b The other bitmaptor * @return Similar to memcmp(), with tiebreaks determined by cardinality */ extern int bitmap_cmp(const bitmap *a, const bitmap *b); /** @} */ #endif /* LIBNAGIOS_bitmap_h__ */ nagios-4.3.4/lib/dkhash.c000066400000000000000000000117101314764422400151650ustar00rootroot00000000000000#include #include #include "dkhash.h" #include "lnag-utils.h" #include "nsutils.h" typedef struct dkhash_bucket { const char *key; const char *key2; void *data; struct dkhash_bucket *next; } dkhash_bucket; struct dkhash_table { dkhash_bucket **buckets; unsigned int num_buckets; unsigned int added, removed; unsigned int entries; unsigned int max_entries; unsigned int collisions; }; /* struct data access functions */ unsigned int dkhash_collisions(dkhash_table *t) { return t ? t->collisions : 0; } unsigned int dkhash_num_entries(dkhash_table *t) { return t ? t->entries : 0; } unsigned int dkhash_num_entries_max(dkhash_table *t) { return t ? t->max_entries : 0; } unsigned int dkhash_num_entries_added(dkhash_table *t) { return t ? t->added : 0; } unsigned int dkhash_num_entries_removed(dkhash_table *t) { return t ? t->removed : 0; } unsigned int dkhash_table_size(dkhash_table *t) { return t ? t->num_buckets : 0; } /* * polynomial conversion ignoring overflows. * Pretty standard hash, once based on Ozan Yigit's sdbm() hash * but later modified for Nagios to produce better results on our * typical data. */ #define PRIME 509 static inline unsigned int hash(register const char *k) { register unsigned int h = 0x123; /* magic */ while (*k) h = *k++ + PRIME * h; return h; } static inline unsigned int dkhash_slot(dkhash_table *t, const char *k1, const char *k2) { register unsigned int h; h = hash(k1); if (k2) h ^= hash(k2); return h % t->num_buckets; } static dkhash_bucket *dkhash_get_bucket(dkhash_table *t, const char *key, unsigned int slot) { dkhash_bucket *bkt; for (bkt = t->buckets[slot]; bkt; bkt = bkt->next) { if (!strcmp(key, bkt->key)) return bkt; } return NULL; } static dkhash_bucket *dkhash_get_bucket2(dkhash_table *t, const char *k1, const char *k2, unsigned int slot) { dkhash_bucket *bkt; for (bkt = t->buckets[slot]; bkt; bkt = bkt->next) { if (!strcmp(k1, bkt->key) && bkt->key2 && !strcmp(k2, bkt->key2)) return bkt; } return NULL; } int dkhash_insert(dkhash_table *t, const char *k1, const char *k2, void *data) { unsigned int slot; dkhash_bucket *bkt; if (!t || !k1) return DKHASH_EINVAL; slot = dkhash_slot(t, k1, k2); bkt = k2 ? dkhash_get_bucket2(t, k1, k2, slot) : dkhash_get_bucket(t, k1, slot); if (bkt) return DKHASH_EDUPE; if (!(bkt = malloc(sizeof(*bkt)))) return DKHASH_ENOMEM; if (t->buckets[slot]) t->collisions++; /* "soft" collision */ t->added++; bkt->data = data; bkt->key = k1; bkt->key2 = k2; bkt->next = t->buckets[slot]; t->buckets[slot] = bkt; if (++t->entries > t->max_entries) t->max_entries = t->entries; return DKHASH_OK; } void *dkhash_get(dkhash_table *t, const char *k1, const char *k2) { dkhash_bucket *bkt; unsigned int slot; if (!t || !k1) return NULL; slot = dkhash_slot(t, k1, k2); bkt = k2 ? dkhash_get_bucket2(t, k1, k2, slot) : dkhash_get_bucket(t, k1, slot); return bkt ? bkt->data : NULL; } dkhash_table *dkhash_create(unsigned int size) { double ratio; unsigned int sz; dkhash_table *t; if (!size) return NULL; if(!(t = calloc(1, sizeof(*t)))) return NULL; sz = rup2pof2(size); ratio = (double)sz / (double)size; if (ratio < 1.4) sz = rup2pof2(sz + 1); if (!(t->buckets = calloc(sz, sizeof(dkhash_bucket *)))) { free(t); return NULL; } t->num_buckets = sz; return t; } int dkhash_destroy(dkhash_table *t) { unsigned int i; if (!t) return DKHASH_EINVAL; for (i = 0; i < t->num_buckets; i++) { dkhash_bucket *b, *next; for (b = t->buckets[i]; b; b = next) { next = b->next; free(b); } } free(t->buckets); free(t); return DKHASH_OK; } static inline void *dkhash_destroy_bucket(dkhash_bucket *bkt) { void *data; data = bkt->data; free(bkt); return data; } void *dkhash_remove(dkhash_table *t, const char *k1, const char *k2) { unsigned int slot; dkhash_bucket *bkt, *prev; if (!t || !k1) return NULL; slot = dkhash_slot(t, k1, k2); if (!(bkt = t->buckets[slot])) return NULL; for (prev = bkt; bkt; prev = bkt, bkt = bkt->next) { if (strcmp(k1, bkt->key)) continue; if ((!k2 && !bkt->key2) || !strcmp(k2, bkt->key2)) { if (prev == bkt) { /* first entry deleted */ t->buckets[slot] = bkt->next; } else { prev->next = bkt->next; } t->entries--; t->removed++; return dkhash_destroy_bucket(bkt); } } return NULL; } void dkhash_walk_data(dkhash_table *t, int (*walker)(void *)) { dkhash_bucket *bkt, *prev; unsigned int i; if (!t->entries) return; for (i = 0; i < t->num_buckets; i++) { int depth = 0; dkhash_bucket *next; prev = t->buckets[i]; for (bkt = t->buckets[i]; bkt; bkt = next) { next = bkt->next; if (walker(bkt->data) != DKHASH_WALK_REMOVE) { /* only update prev if we don't remove current */ prev = bkt; depth++; continue; } t->removed++; t->entries--; dkhash_destroy_bucket(bkt); if (depth) { prev->next = next; } else { t->buckets[i] = next; } } } } nagios-4.3.4/lib/dkhash.h000066400000000000000000000104061314764422400151730ustar00rootroot00000000000000#ifndef LIBNAGIOS_DKHASH_H_INCLUDED #define LIBNAGIOS_DKHASH_H_INCLUDED #include /** * @file dkhash.h * @brief Dual-key hash functions for Nagios * * Having a dual-key hash function is pretty unusual, but since so * much data in Nagios pertains to services (which are uniquely * identified based on both host_name and service_description), it * makes sense here. * * @{ */ /** return flags usable from the callback function of dkhash_walk_data() */ #define DKHASH_WALK_REMOVE 1 /**< Remove the most recently visited object */ #define DKHASH_WALK_STOP 2 /**< Cause walking to stop */ /** return values for dkhash_insert() */ #define DKHASH_OK 0 /**< Success */ #define DKHASH_EDUPE (-EPERM) /**< duplicate insert attempted */ #define DKHASH_EPERM (-EPERM) /**< duplicate insert attempted */ #define DKHASH_EINVAL (-EINVAL) /**< Invalid parameters passed */ #define DKHASH_ENOMEM (-ENOMEM) /**< Memory allocation failed */ struct dkhash_table; /** opaque type */ typedef struct dkhash_table dkhash_table; /** * Create a dual-keyed hash-table of the given size * Note that it's generally useful to make the table 25-30% larger * than the number of items you intend to store, and also note that * the 'size' arguments gets rounded up to the nearest power of 2. * @param size The desired size of the hash-table. */ extern dkhash_table *dkhash_create(unsigned int size); /** * Destroy a dual-keyed hash table * @param t The table to destroy * @return 0 on success, -1 on errors */ extern int dkhash_destroy(dkhash_table *t); /** * Fetch the data associated with a particular key * @param t The table to get the data from * @param k1 The first key * @param k2 The second key * @return The data on success, NULL on errors or if data isn't found */ extern void *dkhash_get(dkhash_table *t, const char *k1, const char *k2); /** * Insert a new entry into the hash table * @param t The hash table * @param k1 The first key * @param k2 The second key (may be null) * @param data The data to insert * @return 0 on success, < 0 on errors */ extern int dkhash_insert(dkhash_table *t, const char *k1, const char *k2, void *data); /** * Remove data from the hash table * Note that this does not free() the pointer to the data stored in the * table. It just destroys containers for that data in the hash table. * @param t The hash table * @param k1 The first key * @param k2 The second key * @return The removed data on success, or NULL on errors */ extern void *dkhash_remove(dkhash_table *t, const char *k1, const char *k2); /** * Call a function once for each item in the hash-table * The callback function can return DKHASH_WALK_{REMOVE,STOP} or any * OR'ed combination thereof to control the walking procedure, and * should return 0 on the normal case. * @param t The hash table * @param walker The callback function to send the data to */ extern void dkhash_walk_data(dkhash_table *t, int (*walker)(void *data)); /** * Get number of collisions in hash table * Many collisions is a sign of a too small hash table or * poor hash-function. * @param t The hash table to report on * @return The total number of collisions (not duplicates) from inserts */ extern unsigned int dkhash_collisions(dkhash_table *t); /** * Get number of items in the hash table * @param t The hash table * @return Number of items currently in the hash-table */ extern unsigned int dkhash_num_entries(dkhash_table *t); /** * Get max number of items stored in the hash table * @param t The hash table * @return Max number of items stored in hash-table */ extern unsigned int dkhash_num_entries_max(dkhash_table *t); /** * Get number of entries added to hash table * Note that some of them may have been removed. * @param t The hash table * @return The number of items added to the table */ extern unsigned int dkhash_num_entries_added(dkhash_table *t); /** * Get number of removed items from hash table * @param t The hash table * @return Number of items removed from hash table */ extern unsigned int dkhash_num_entries_removed(dkhash_table *t); /** * Get actual table size (in number of buckets) * @param t The hash table * @return Number of bucket-slots in hash table */ extern unsigned int dkhash_table_size(dkhash_table *t); /** @} */ #endif /* LIBNAGIOS_DKHASH_H_INCLUDED */ nagios-4.3.4/lib/fanout.c000066400000000000000000000042131314764422400152170ustar00rootroot00000000000000#include #include "fanout.h" struct fanout_entry { unsigned long key; void *data; struct fanout_entry *next; }; struct fanout_table { unsigned long alloc; struct fanout_entry **entries; }; fanout_table *fanout_create(unsigned long size) { fanout_table *t = calloc(1, sizeof(*t)); if (!t) return NULL; t->entries = calloc(size, sizeof(struct fanout_entry *)); if (!t->entries) { free(t); return NULL; } t->alloc = size; return t; } void fanout_destroy(fanout_table *t, void (*destructor)(void *)) { unsigned long i; struct fanout_entry **entries, *next; if (!t || !t->entries || !t->alloc) return; /* protect against destructors calling fanout_remove() */ entries = t->entries; t->entries = NULL; for (i = 0; i < t->alloc; i++) { struct fanout_entry *entry; for (entry = entries[i]; entry; entry = next) { void *data = entry->data; next = entry->next; free(entry); if (destructor) { destructor(data); } } } free(entries); free(t); } int fanout_add(struct fanout_table *t, unsigned long key, void *data) { struct fanout_entry *entry; if (!t || !t->entries || !t->alloc || !data) return -1; entry = calloc(1, sizeof(*entry)); if (!entry) return -1; entry->key = key; entry->data = data; entry->next = t->entries[key % t->alloc]; t->entries[key % t->alloc] = entry; return 0; } void *fanout_get(fanout_table *t, unsigned long key) { struct fanout_entry *entry; unsigned long slot; if (!t || !t->entries || !t->alloc) return NULL; slot = key % t->alloc; for (entry = t->entries[slot]; entry; entry = entry->next) { if (entry->key == key) return entry->data; } return NULL; } void *fanout_remove(fanout_table *t, unsigned long key) { struct fanout_entry *entry, *next, *prev = NULL; unsigned long slot; if (!t || !t->entries || !t->alloc) return NULL; slot = key % t->alloc; for (entry = t->entries[slot]; entry; prev = entry, entry = next) { next = entry->next; if (entry->key == key) { void *data = entry->data; if (prev) { prev->next = entry->next; } else { t->entries[slot] = entry->next; } free(entry); return data; } } return NULL; } nagios-4.3.4/lib/fanout.h000066400000000000000000000043051314764422400152260ustar00rootroot00000000000000#ifndef LIBNAGIOS_FANOUT_H_INCLUDED #define LIBNAGIOS_FANOUT_H_INCLUDED #include "lnag-utils.h" /** * @file fanout.h * @brief Simple fanout table implementation * * Fanouts are useful to hold short-lived integer-indexed data where * the keyspan between smallest and largest key can be too large and * change too often for it to be practical to maintain a growing array. * If you think of it as a hash-table optimized for unsigned longs you've * got the right idea. * * @{ */ NAGIOS_BEGIN_DECL /** Primary (opaque) type for this api */ typedef struct fanout_table fanout_table; /** * Create a fanout table * @param[in] size The size of the table. Preferably a power of 2 * @return Pointer to a newly created table */ extern fanout_table *fanout_create(unsigned long size); /** * Destroy a fanout table, with optional destructor. * This function will iterate over all the entries in the fanout * table and remove them, one by one. If 'destructor' is not NULL, * it will be called on each and every object in the table. Note that * 'free' is a valid destructor. * * @param[in] t The fanout table to destroy * @param[in] destructor Function to call on data pointers in table */ extern void fanout_destroy(fanout_table *t, void (*destructor)(void *)); /** * Return a pointer from the fanout table t * * @param[in] t table to fetch from * @param[in] key key to fetch * @return NULL on errors; Pointer to data on success */ extern void *fanout_get(fanout_table *t, unsigned long key); /** * Add an entry to the fanout table. * Note that we don't check if the key is unique. If it isn't, * fanout_remove() will remove the latest added first. * * @param[in] t fanout table to add to * @param[in] key Key for this entry * @param[in] data Data to add. Must not be NULL * @return 0 on success, -1 on errors */ extern int fanout_add(fanout_table *t, unsigned long key, void *data); /** * Remove an entry from the fanout table and return its data. * * @param[in] t fanout table to look in * @param[in] key The key whose data we should locate * @return Pointer to the data stored on success; NULL on errors */ extern void *fanout_remove(fanout_table *t, unsigned long key); NAGIOS_END_DECL /** @} */ #endif nagios-4.3.4/lib/iobroker.c000066400000000000000000000221231314764422400155370ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include #include "iobroker.h" #ifdef IOBROKER_USES_EPOLL #include /* these were added later */ #ifndef EPOLLRDHUP # define EPOLLRDHUP 0 #endif #ifndef EPOLLONESHOT # define EPOLLONESHOT 0 #endif #elif !defined(IOBROKER_USES_SELECT) #include #else #include #endif #if defined(IOBROKER_USES_EPOLL) && defined(IOBROKER_USES_POLL) # error "iobroker can't use both epoll() and poll()" #elif defined(IOBROKER_USES_EPOLL) && defined(IOBROKER_USES_SELECT) # error "iobroker can't use both epoll() and select()" #elif defined(IOBROKER_USEES_POLL) && defined(IOBROKER_USES_SELECT) # error "iobroker can't use both poll() and select()" #endif typedef struct { int fd; /* the file descriptor */ int events; /* events the caller is interested in */ int (*handler)(int, int, void *); /* where we send data */ void *arg; /* the argument we send to the input handler */ } iobroker_fd; struct iobroker_set { iobroker_fd **iobroker_fds; int max_fds; /* max number of sockets we can accept */ int num_fds; /* number of sockets we're currently brokering for */ #ifdef IOBROKER_USES_EPOLL int epfd; struct epoll_event *ep_events; #elif !defined(IOBROKER_USES_SELECT) struct pollfd *pfd; #endif }; static struct { int code; const char *string; } iobroker_errors[] = { { IOBROKER_SUCCESS, "Success" }, { IOBROKER_ENOSET, "IOB set is NULL" }, { IOBROKER_ENOINIT, "IOB set not initialized" }, }; static const char *iobroker_unknown_error = "unknown error"; #ifndef ARRAY_SIZE # define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0])) #endif const char *iobroker_strerror(int error) { if (error == IOBROKER_ELIB) return strerror(errno); error = (~error) + 1; if (error < 0) { return iobroker_unknown_error; } if (error >= (int)ARRAY_SIZE(iobroker_errors)) return strerror(error); return iobroker_errors[error].string; } int iobroker_max_usable_fds(void) { #if defined(RLIMIT_NOFILE) struct rlimit rlim; getrlimit(RLIMIT_NOFILE, &rlim); return (unsigned long)rlim.rlim_cur; #elif defined(_SC_OPEN_MAX) return (unsigned long)sysconf(_SC_OPEN_MAX); #elif defined(OPEN_MAX) return (unsigned long)OPEN_MAX; #elif defined(_POSIX_OPEN_MAX) return (unsigned long)_POSIX_OPEN_MAX; #else /* * No sysconf macros, no rlimit and no hopefully-sane * defaults so we just guess. This might be completely * wrong and could cause segfaults */ return 256UL; #endif } int iobroker_get_max_fds(iobroker_set *iobs) { if (!iobs) return IOBROKER_ENOSET; return iobs->max_fds; } int iobroker_get_num_fds(iobroker_set *iobs) { if (!iobs) return IOBROKER_ENOSET; return iobs->num_fds; } struct iobroker_set *iobroker_create(void) { iobroker_set *iobs = NULL; iobs = calloc(1, sizeof(*iobs)); if (!iobs) { goto error_out; } iobs->max_fds = iobroker_max_usable_fds(); iobs->iobroker_fds = calloc(iobs->max_fds, sizeof(iobroker_fd *)); if (!iobs->iobroker_fds) { goto error_out; } #ifdef IOBROKER_USES_EPOLL { int flags; iobs->ep_events = calloc(iobs->max_fds, sizeof(struct epoll_event)); if (!iobs->ep_events) { goto error_out; } iobs->epfd = epoll_create(iobs->max_fds); if (iobs->epfd < 0) { goto error_out; } flags = fcntl(iobs->epfd, F_GETFD); flags |= FD_CLOEXEC; fcntl(iobs->epfd, F_SETFD, flags); } #elif !defined(IOBROKER_USES_SELECT) iobs->pfd = calloc(iobs->max_fds, sizeof(struct pollfd)); if (!iobs->pfd) goto error_out; #endif return iobs; error_out: if (iobs) { #ifdef IOBROKER_USES_EPOLL close(iobs->epfd); if (iobs->ep_events) free(iobs->ep_events); #endif if (iobs->iobroker_fds) free(iobs->iobroker_fds); free(iobs); } return NULL; } static int reg_one(iobroker_set *iobs, int fd, int events, void *arg, int (*handler)(int, int, void *)) { iobroker_fd *s; if (!iobs) { return IOBROKER_ENOSET; } if (fd < 0 || fd >= iobs->max_fds) return IOBROKER_EINVAL; /* * Re-registering a socket is an error, as multiple input * handlers for a single socket makes no sense at all */ if (iobs->iobroker_fds[fd] != NULL) return IOBROKER_EALREADY; #ifdef IOBROKER_USES_EPOLL { struct epoll_event ev; ev.events = events; ev.data.ptr = arg; ev.data.fd = fd; if (epoll_ctl(iobs->epfd, EPOLL_CTL_ADD, fd, &ev) < 0) { return IOBROKER_ELIB; } } #endif s = calloc(1, sizeof(iobroker_fd)); s->handler = handler; s->fd = fd; s->arg = arg; s->events = events; iobs->iobroker_fds[fd] = s; iobs->num_fds++; return 0; } int iobroker_register(iobroker_set *iobs, int fd, void *arg, int (*handler)(int, int, void *)) { #ifdef IOBROKER_USES_EPOLL return reg_one(iobs, fd, EPOLLIN | EPOLLRDHUP, arg, handler); #else return reg_one(iobs, fd, POLLIN, arg, handler); #endif } int iobroker_register_out(iobroker_set *iobs, int fd, void *arg, int (*handler)(int, int, void *)) { #ifdef IOBROKER_USES_EPOLL return reg_one(iobs, fd, EPOLLOUT, arg, handler); #else return reg_one(iobs, fd, POLLOUT, arg, handler); #endif } int iobroker_is_registered(iobroker_set *iobs, int fd) { if (!iobs || fd < 0 || fd > iobs->max_fds || !iobs->iobroker_fds[fd]) return 0; return iobs->iobroker_fds[fd]->fd == fd; } int iobroker_unregister(iobroker_set *iobs, int fd) { if (!iobs) return IOBROKER_ENOSET; if (!iobs->iobroker_fds) return IOBROKER_ENOINIT; if (fd < 0 || fd >= iobs->max_fds || !iobs->iobroker_fds[fd]) return IOBROKER_EINVAL; free(iobs->iobroker_fds[fd]); iobs->iobroker_fds[fd] = NULL; if (iobs->num_fds > 0) iobs->num_fds--; #ifdef IOBROKER_USES_EPOLL { /* * This needs to be set for linux <= 2.6.9 even though * it's ignored even then. */ struct epoll_event ev; return epoll_ctl(iobs->epfd, EPOLL_CTL_DEL, fd, &ev); } #endif return 0; } int iobroker_deregister(iobroker_set *iobs, int fd) { return iobroker_unregister(iobs, fd); } int iobroker_close(iobroker_set *iobs, int fd) { int result; result = iobroker_unregister(iobs, fd); (void)close(fd); return result; } void iobroker_destroy(iobroker_set *iobs, int flags) { int i; int (*dereg)(iobroker_set *, int) = iobroker_unregister; if (!iobs) return; if (flags & IOBROKER_CLOSE_SOCKETS) { dereg = iobroker_close; } #ifdef IOBROKER_USES_EPOLL if (iobs->epfd >= 0) close(iobs->epfd); #elif !defined(IOBROKER_USES_SELECT) if (iobs->pfd) free(iobs->pfd); #endif if (!iobs->iobroker_fds) return; for (i = 0; i < iobs->max_fds; i++) { if (iobs->iobroker_fds[i] == NULL) continue; dereg(iobs, i); } free(iobs->iobroker_fds); iobs->iobroker_fds = NULL; #ifdef IOBROKER_USES_EPOLL free(iobs->ep_events); close(iobs->epfd); #endif free(iobs); } int iobroker_poll(iobroker_set *iobs, int timeout) { int i, nfds, ret = 0; if (!iobs) return IOBROKER_ENOSET; if (!iobs->num_fds) return IOBROKER_ENOINIT; #if defined(IOBROKER_USES_EPOLL) nfds = epoll_wait(iobs->epfd, iobs->ep_events, iobs->num_fds, timeout); if (nfds < 0) { return IOBROKER_ELIB; } for (i = 0; i < nfds; i++) { int fd; iobroker_fd *s = NULL; fd = iobs->ep_events[i].data.fd; if (fd < 0 || fd > iobs->max_fds) { continue; } s = iobs->iobroker_fds[fd]; if (s) { s->handler(fd, iobs->ep_events[i].events, s->arg); ret++; } } #elif defined(IOBROKER_USES_SELECT) /* * select() is the (last) fallback, as it's the least * efficient by quite a huge margin, so it has to be * specified specially (in CFLAGS) and should only be * used if epoll() or poll() doesn't work properly. */ { fd_set read_fds; int num_fds = 0; struct timeval tv; FD_ZERO(&read_fds); for (i = 0; i < iobs->max_fds; i++) { if (!iobs->iobroker_fds[i]) continue; num_fds++; FD_SET(iobs->iobroker_fds[i]->fd, &read_fds); if (num_fds == iobs->num_fds) break; } if (timeout >= 0) { tv.tv_sec = timeout / 1000; tv.tv_usec = (timeout % 1000) * 1000; nfds = select(iobs->max_fds, &read_fds, NULL, NULL, &tv); } else { /* timeout of -1 means poll indefinitely */ nfds = select(iobs->max_fds, &read_fds, NULL, NULL, NULL); } if (nfds < 0) { return IOBROKER_ELIB; } num_fds = 0; for (i = 0; i < iobs->max_fds; i++) { if (!iobs->iobroker_fds[i]) continue; if (FD_ISSET(iobs->iobroker_fds[i]->fd, &read_fds)) { iobroker_fd *s = iobs->iobroker_fds[i]; if (!s) { /* this should be logged somehow */ continue; } s->handler(s->fd, POLLIN, s->arg); ret++; } } } #else /* * poll(2) is an acceptable fallback if level-triggered epoll() * isn't available. */ { int p = 0; for (i = 0; i < iobs->max_fds; i++) { if (!iobs->iobroker_fds[i]) continue; iobs->pfd[p].fd = iobs->iobroker_fds[i]->fd; iobs->pfd[p].events = POLLIN; p++; } nfds = poll(iobs->pfd, p, timeout); if (nfds < 0) { return IOBROKER_ELIB; } for (i = 0; i < p; i++) { iobroker_fd *s; if (iobs->pfd[i].revents == 0) { continue; } s = iobs->iobroker_fds[iobs->pfd[i].fd]; if (!s) { /* this should be logged somehow */ continue; } s->handler(s->fd, (int)iobs->pfd[i].revents, s->arg); ret++; } } #endif return ret; } nagios-4.3.4/lib/iobroker.h.in000066400000000000000000000131361314764422400161550ustar00rootroot00000000000000#ifndef LIBNAGIOS_iobroker_h__ #define LIBNAGIOS_iobroker_h__ /** * @file iobroker.h * @brief I/O broker library function declarations * * The I/O broker library handles multiplexing between hundreds or * thousands of sockets with a few simple calls. It's designed to * be as lightweight as possible so as to not cause memory bloat, * and is therefore highly suitable for use by processes that are * fork()-intensive. * * @{ */ #undef IOBROKER_USES_EPOLL #undef IOBROKER_USES_POLL #undef IOBROKER_USES_SELECT #if (_POSIX_C_SOURCE - 0) >= 200112L #include # define IOBROKER_POLLIN POLLIN # define IOBROKER_POLLPRI POLLPRI # define IOBROKER_POLLOUT POLLOUT # define IOBROKER_POLLERR POLLERR # define IOBROKER_POLLHUP POLLHUP # define IOBROKER_POLLNVAL POLLNVAL #else # define IOBROKER_POLLIN 0x001 /* there is data to read */ # define IOBROKER_POLLPRI 0x002 /* there is urgent data to read */ # define IOBROKER_POLLOUT 0x004 /* writing now will not block */ # define IOBROKER_POLLERR 0x008 /* error condition */ # define IOBROKER_POLLHUP 0x010 /* hung up */ # define IOBROKER_POLLNVAL 0x020 /* invalid polling request */ #endif /** return codes */ #define IOBROKER_SUCCESS 0 #define IOBROKER_ENOSET (-1) #define IOBROKER_ENOINIT (-2) #define IOBROKER_ELIB (-3) #define IOBROKER_EALREADY (-EALREADY) #define IOBROKER_EINVAL (-EINVAL) /** Flags for iobroker_destroy() */ #define IOBROKER_CLOSE_SOCKETS 1 /* Opaque type. Callers needn't worry about this */ struct iobroker_set; typedef struct iobroker_set iobroker_set; /** * Get a string describing the error in the last iobroker call. * The returned string must not be free()'d. * @param error The error code * @return A string describing the meaning of the error code */ extern const char *iobroker_strerror(int error); /** * Create a new socket set * @return An iobroker_set on success. NULL on errors. */ extern iobroker_set *iobroker_create(void); /** * Published utility function used to determine the max number of * file descriptors this process can keep open at any one time. * @return Max number of filedescriptors we can keep open */ extern int iobroker_max_usable_fds(void); /** * Register a socket for input polling with the broker. * * @param iobs The socket set to add the socket to. * @param sd The socket descriptor to add * @param arg Argument passed to input handler on available input * @param handler The callback function to call when input is available * * @return 0 on succes. < 0 on errors. */ extern int iobroker_register(iobroker_set *iobs, int sd, void *arg, int (*handler)(int, int, void *)); /** * Register a socket for output polling with the broker * @note There's no guarantee that *ALL* data is writable just * because the socket won't block you completely. * * @param iobs The socket set to add the socket to. * @param sd The socket descriptor to add * @param arg Argument passed to output handler on ready-to-write * @param handler The function to call when output won't block * * @return 0 on success. < 0 on errors */ extern int iobroker_register_out(iobroker_set *iobs, int sd, void *arg, int (*handler)(int, int, void *)); /** * Check if a particular filedescriptor is registered with the iobroker set * @param[in] iobs The iobroker set the filedescriptor should be member of * @param[in] fd The filedescriptor to check for * @return 1 if the filedescriptor is registered and 0 otherwise */ extern int iobroker_is_registered(iobroker_set *iobs, int fd); /** * Getter function for number of file descriptors registered in * the set specified. * @param iobs The io broker set to query * @return Number of file descriptors registered in the set */ extern int iobroker_get_num_fds(iobroker_set *iobs); /** * Getter function for the maximum amount of file descriptors this * set can handle. * @param iobs The io broker set to query * @return Max file descriptor capacity for the set */ extern int iobroker_get_max_fds(iobroker_set *iobs); /** * Unregister a socket for input polling with the broker. * * @param iobs The socket set to remove the socket from * @param sd The socket descriptor to remove * @return 0 on succes. < 0 on errors. */ extern int iobroker_unregister(iobroker_set *iobs, int sd); /** * Deregister a socket for input polling with the broker * (this is identical to iobroker_unregister()) * @param iobs The socket set to remove the socket from * @param sd The socket descriptor to remove * @return 0 on success. < 0 on errors. */ extern int iobroker_deregister(iobroker_set *iobs, int sd); /** * Unregister and close(2) a socket registered for input with the * broker. This is a convenience function which exists only to avoid * doing multiple calls when read() returns 0, as closed sockets must * always be removed from the socket set to avoid consuming tons of * cpu power from iterating "too fast" over the file descriptors. * * @param iobs The socket set to remove the socket from * @param sd The socket descriptor to remove and close * @return 0 on success. < 0 on errors */ extern int iobroker_close(iobroker_set *iobs, int sd); /** * Destroy a socket set as created by iobroker_create * @param iobs The socket set to destroy * @param flags If set, close(2) all registered sockets */ extern void iobroker_destroy(iobroker_set *iobs, int flags); /** * Wait for input on any of the registered sockets. * @param iobs The socket set to wait for. * @param timeout Timeout in milliseconds. -1 is "wait indefinitely" * @return -1 on errors, or number of filedescriptors with input */ extern int iobroker_poll(iobroker_set *iobs, int timeout); #endif /* INCLUDE_iobroker_h__ */ /** @} */ nagios-4.3.4/lib/iocache.c000066400000000000000000000121271314764422400153210ustar00rootroot00000000000000#include "iocache.h" #include #include #include #include struct iocache { char *ioc_buf; /* the data */ unsigned long ioc_offset; /* where we're reading in the buffer */ unsigned long ioc_buflen; /* the amount of data read into the buffer */ unsigned long ioc_bufsize; /* size of the buffer */ }; void iocache_destroy(iocache *ioc) { if (!ioc) return; if (ioc->ioc_buf) free(ioc->ioc_buf); free(ioc); } /** * Attempts to move data from the end to the beginning * of the ioc_buf, expelling old data to make more room * for new reads. */ static inline void iocache_move_data(iocache *ioc) { unsigned long available; if (!ioc->ioc_offset) return; /* nothing to do */ /* if we're fully read, we only have to reset the counters */ if (ioc->ioc_buflen <= ioc->ioc_offset) { iocache_reset(ioc); return; } available = ioc->ioc_buflen - ioc->ioc_offset; memmove(ioc->ioc_buf, ioc->ioc_buf + ioc->ioc_offset, available); ioc->ioc_offset = 0; ioc->ioc_buflen = available; } void iocache_reset(iocache *ioc) { if (ioc) ioc->ioc_offset = ioc->ioc_buflen = 0; } int iocache_resize(iocache *ioc, unsigned long new_size) { char *buf; if (!ioc) return -1; iocache_move_data(ioc); buf = realloc(ioc->ioc_buf, new_size); if (!buf) return -1; ioc->ioc_buf = buf; ioc->ioc_bufsize = new_size; return 0; } int iocache_grow(iocache *ioc, unsigned long increment) { return iocache_resize(ioc, iocache_size(ioc) + increment); } unsigned long iocache_size(iocache *ioc) { return ioc ? ioc->ioc_bufsize : 0; } unsigned long iocache_capacity(iocache *ioc) { if (!ioc || !ioc->ioc_buf || !ioc->ioc_bufsize) return 0; iocache_move_data(ioc); return ioc->ioc_bufsize - ioc->ioc_buflen; } unsigned long iocache_available(iocache *ioc) { if (!ioc || !ioc->ioc_buf || !ioc->ioc_bufsize || !ioc->ioc_buflen) return 0; return ioc->ioc_buflen - ioc->ioc_offset; } char *iocache_use_size(iocache *ioc, unsigned long size) { char *ret; if (!ioc || !ioc->ioc_buf) return NULL; if (ioc->ioc_bufsize < size || iocache_available(ioc) < size) return NULL; ret = ioc->ioc_buf + ioc->ioc_offset; ioc->ioc_offset += size; return ret; } int iocache_unuse_size(iocache *ioc, unsigned long size) { if (!ioc || !ioc->ioc_buf) return -1; if (size > ioc->ioc_offset) return -1; ioc->ioc_offset -= size; return 0; } char *iocache_use_delim(iocache *ioc, const char *delim, size_t delim_len, unsigned long *size) { char *ptr = NULL; char *buf; unsigned long remains; if (!ioc || !ioc->ioc_buf || !ioc->ioc_bufsize || !ioc->ioc_buflen) return NULL; *size = 0; if (ioc->ioc_offset >= ioc->ioc_buflen) { iocache_move_data(ioc); return NULL; } buf = &ioc->ioc_buf[ioc->ioc_offset]; remains = iocache_available(ioc); while (remains >= delim_len) { unsigned long jump; ptr = memchr(buf, *delim, remains - (delim_len - 1)); if (!ptr) { return NULL; } if (delim_len == 1 || !memcmp(ptr, delim, delim_len)) { unsigned long ioc_start; ioc_start = (unsigned long)ioc->ioc_buf + ioc->ioc_offset; *size = (unsigned long)ptr - ioc_start; /* make sure we use up all of the delimiter as well */ return iocache_use_size(ioc, delim_len + *size); } jump = 1 + (unsigned long)ptr - (unsigned long)buf; remains -= jump; buf += jump; } return NULL; } iocache *iocache_create(unsigned long size) { iocache *ioc; ioc = calloc(1, sizeof(*ioc)); if (ioc && size) { ioc->ioc_buf = calloc(1, size); if (!ioc->ioc_buf) { free(ioc); return NULL; } ioc->ioc_bufsize = size; } return ioc; } int iocache_read(iocache *ioc, int fd) { int to_read, bytes_read; if (!ioc || !ioc->ioc_buf || fd < 0) return -1; /* we make sure we've got as much room as possible */ iocache_move_data(ioc); /* calculate the size we should read */ to_read = ioc->ioc_bufsize - ioc->ioc_buflen; bytes_read = read(fd, ioc->ioc_buf + ioc->ioc_buflen, to_read); if (bytes_read > 0) { ioc->ioc_buflen += bytes_read; } return bytes_read; } int iocache_add(iocache *ioc, char *buf, unsigned int len) { if (!ioc || iocache_capacity(ioc) < len) return -1; memcpy(ioc->ioc_buf + ioc->ioc_offset, buf, len); ioc->ioc_buflen += len; return ioc->ioc_buflen - ioc->ioc_offset; } /* * Three cases to handle: * - buf has data, iocache doesn't. * - iocache has data, buf doesn't. * - both buf and iocache has data. */ int iocache_sendto(iocache *ioc, int fd, char *buf, unsigned int len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen) { int sent; errno = 0; if (!ioc) return -1; if (!ioc->ioc_buflen && !len) return 0; if (ioc->ioc_buf && iocache_available(ioc)) { if (buf && len) { /* copy buf and len to iocache buffer to use just one write */ if (iocache_capacity(ioc) < len) { if (iocache_grow(ioc, iocache_size(ioc)) < 0) return -1; } if (iocache_add(ioc, buf, len) < 0) return -1; } buf = ioc->ioc_buf; len = iocache_available(ioc); } sent = sendto(fd, buf, len, flags, dest_addr, addrlen); if (sent < 1) return -errno; if (iocache_available(ioc)) iocache_use_size(ioc, sent); return sent; } nagios-4.3.4/lib/iocache.h000066400000000000000000000136421314764422400153310ustar00rootroot00000000000000#ifndef LIBNAGIOS_IOCACHE_H_INCLUDED #define LIBNAGIOS_IOCACHE_H_INCLUDED #include #include #include /** * @file iocache.h * @brief I/O cache function declarations * * The I/O cache library is useful for reading large chunks of data * from sockets and utilizing parts of that data based on either * size or a magic delimiter. * * @{ */ /** opaque type for iocache operations */ struct iocache; typedef struct iocache iocache; /** * Destroys an iocache object, freeing all memory allocated to it. * @param ioc The iocache object to destroy */ extern void iocache_destroy(iocache *ioc); /** * Resets an iocache struct, discarding all data in it without free()'ing * any memory. * * @param[in] ioc The iocache struct to reset */ extern void iocache_reset(iocache *ioc); /** * Resizes the buffer in an io cache * @param ioc The io cache to resize * @param new_size The new size of the io cache * @return 0 on success, -1 on errors */ extern int iocache_resize(iocache *ioc, unsigned long new_size); /** * Grows an iocache object * This uses iocache_resize() internally * @param[in] ioc The iocache to grow * @param[in] increment How much to increase it * @return 0 on success, -1 on errors */ extern int iocache_grow(iocache *ioc, unsigned long increment); /** * Returns the total size of the io cache * @param[in] ioc The iocache to inspect * @return The size of the io cache. If ioc is null, 0 is returned */ extern unsigned long iocache_size(iocache *ioc); /** * Returns remaining read capacity of the io cache * @param ioc The io cache to operate on * @return The number of bytes available to read */ extern unsigned long iocache_capacity(iocache *ioc); /** * Return the amount of unread but stored data in the io cache * @param ioc The io cache to operate on * @return Number of bytes available to read */ extern unsigned long iocache_available(iocache *ioc); /** * Use a chunk of data from iocache based on size. The caller * must take care not to write beyond the end of the requested * buffer, or Bad Things(tm) will happen. * * @param ioc The io cache we should use data from * @param size The size of the data we want returned * @return NULL on errors (insufficient data, fe). pointer on success */ extern char *iocache_use_size(iocache *ioc, unsigned long size); /** * Use a chunk of data from iocache based on delimiter. The * caller must take care not to write beyond the end of the * requested buffer, if any is returned, or Bad Things(tm) will * happen. * * @param ioc The io cache to use data from * @param delim The delimiter * @param delim_len Length of the delimiter * @param size Length of the returned buffer * @return NULL on errors (delimiter not found, insufficient data). pointer on success */ extern char *iocache_use_delim(iocache *ioc, const char *delim, size_t delim_len, unsigned long *size); /** * Forget that a specified number of bytes have been used. * @param ioc The io cache that you want to un-use data in * @param size The number of bytes you want to forget you've seen * @return -1 if there was an error, 0 otherwise. */ extern int iocache_unuse_size(iocache *ioc, unsigned long size); /** * Creates the iocache object, initializing it with the given size * @param size Initial size of the iocache buffer * @return Pointer to a valid iocache object */ extern iocache *iocache_create(unsigned long size); /** * Read data into the iocache buffer * @param ioc The io cache we should read into * @param fd The filedescriptor we should read from * @return The number of bytes read on success. < 0 on errors */ extern int iocache_read(iocache *ioc, int fd); /** * Add data to the iocache buffer * The data is copied, so it can safely be taken from the stack in a * function that returns before the data is used. * If the io cache is too small to hold the data, -1 will be returned. * * @param[in] ioc The io cache to add to * @param[in] buf Pointer to the data we should add * @param[in] len Length (in bytes) of data pointed to by buf * @return iocache_available(ioc) on success, -1 on errors */ extern int iocache_add(iocache *ioc, char *buf, unsigned int len); /** * Like sendto(), but sends all cached data prior to the requested * * @param[in] ioc The iocache to send, or cache data in * @param[in] fd The file descriptor to send to * @param[in] buf Pointer to the data to send * @param[in] len Length (in bytes) of data to send * @param[in] flags Flags passed to sendto(2) * @param[in] dest_addr Destination address * @param[in] addrlen size (in bytes) of dest_addr * @return bytes sent on success, -ERRNO on errors */ extern int iocache_sendto(iocache *ioc, int fd, char *buf, unsigned int len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen); /** * Like send(2), but sends all cached data prior to the requested * This function uses iocache_sendto() internally, but can only be * used on connected sockets or open()'ed files. * * @param[in] ioc The iocache to send, or cache data in * @param[in] fd The file descriptor to send to * @param[in] buf Pointer to the data to send * @param[in] len Length (in bytes) of data to send * @param[in] flags Flags passed to sendto(2) * @return bytes sent on success, -ERRNO on errors */ static inline int iocache_send(iocache *ioc, int fd, char *buf, unsigned int len, int flags) { return iocache_sendto(ioc, fd, buf, len, flags, NULL, 0); } /** * Like write(2), but sends all cached data prior to the requested * This function uses iocache_send() internally. * * @param[in] ioc The iocache to send, or cache data in * @param[in] fd The file descriptor to send to * @param[in] buf Pointer to the data to send * @param[in] len Length (in bytes) of data to send * @return bytes sent on success, -ERRNO on errors */ static inline int iocache_write(iocache *ioc, int fd, char *buf, unsigned int len) { return iocache_send(ioc, fd, buf, len, 0); } #endif /* INCLUDE_iocache_h__ */ /** @} */ nagios-4.3.4/lib/kvvec.c000066400000000000000000000160741314764422400150510ustar00rootroot00000000000000/* * key+value vector library * * Small and simple, but pretty helpful when parsing configurations * from random formats into something a program can easily make sense * of. * * The main type (struct kvvec *) should possibly be opaque since * all callers should use the kvvec_foreach() variable to trudge * around in the key/value vector. */ #include #include #include "kvvec.h" struct kvvec *kvvec_init(struct kvvec *kvv, int hint) { if (!kvv) return NULL; kvv->kv_pairs = 0; if (kvv->kv_alloc < hint && kvvec_resize(kvv, hint) < 0) return NULL; return kvv; } struct kvvec *kvvec_create(int hint) { struct kvvec *kvv = calloc(1, sizeof(*kvv)); if (kvv && !kvvec_init(kvv, hint)) { free(kvv); return NULL; } return kvv; } int kvvec_resize(struct kvvec *kvv, int hint) { struct key_value *kv; if (!kvv) return -1; if (hint <= kvv->kv_alloc) return 0; kv = realloc(kvv->kv, sizeof(struct key_value) * hint); if (!kv) return -1; memset(&kv[kvv->kv_alloc], 0, (hint - kvv->kv_alloc) * sizeof(*kv)); kvv->kv = kv; kvv->kv_alloc = hint; return 0; } int kvvec_grow(struct kvvec *kvv, int hint) { if (!kvv) return -1; /* grow reasonably when we don't have a hint */ if (!hint) hint = (kvv->kv_alloc / 3) + 15; return kvvec_resize(kvv, kvv->kv_alloc + hint); } int kvvec_addkv_wlen(struct kvvec *kvv, const char *key, int keylen, const char *value, int valuelen) { struct key_value *kv; if (!kvv || !key) return -1; if (kvv->kv_pairs >= kvv->kv_alloc - 1) { if (kvvec_grow(kvv, 0)) return -1; } kv = &kvv->kv[kvv->kv_pairs++]; kv->key = (char *)key; kv->key_len = keylen; kv->value = (char *)value; kv->value_len = valuelen; if (!keylen) { kv->key_len = strlen(key); } if (value) { if (!valuelen) { kv->value_len = strlen(value); } } else { kv->value_len = 0; kv->value = '\0'; } kvv->kvv_sorted = 0; return 0; } static int kv_compare(const void *a_, const void *b_) { const struct key_value *a = (const struct key_value *)a_; const struct key_value *b = (const struct key_value *)b_; int ret = 0; ret = strcmp(a->key, b->key); if (ret) return ret; if (!a->value && !b->value) { return 0; } if (a->value && !b->value) return -1; if (!a->value && b->value) return 1; return strcmp(a->value, b->value); } int kvvec_sort(struct kvvec *kvv) { qsort(kvv->kv, kvv->kv_pairs, sizeof(struct key_value), kv_compare); kvv->kvv_sorted = 1; return 0; } int kvvec_foreach(struct kvvec *kvv, void *arg, int (*callback)(struct key_value *,void *)) { int i; if (!kvv) return 0; for (i = 0; i < kvv->kv_pairs; i++) { callback(&kvv->kv[i], arg); } return 0; } void kvvec_free_kvpairs(struct kvvec *kvv, int flags) { int i; if (flags == KVVEC_FREE_ALL) { for (i = 0; i < kvv->kv_pairs; i++) { free(kvv->kv[i].key); free(kvv->kv[i].value); } } else if (flags == KVVEC_FREE_KEYS) { for (i = 0; i < kvv->kv_pairs; i++) { free(kvv->kv[i].key); } } else if (flags == KVVEC_FREE_VALUES) { for (i = 0; i < kvv->kv_pairs; i++) { free(kvv->kv[i].value); } } kvv->kv_pairs = 0; } int kvvec_destroy(struct kvvec *kvv, int flags) { kvvec_free_kvpairs(kvv, flags); free(kvv->kv); free(kvv); return 0; } /* * Caller can tell us to over-allocate the buffer if he/she wants * to put extra stuff at the end of it. */ struct kvvec_buf *kvvec2buf(struct kvvec *kvv, char kv_sep, char pair_sep, int overalloc) { struct kvvec_buf *kvvb; int i; unsigned long len = 0; if (!kvv) return NULL; kvvb = malloc(sizeof(struct kvvec_buf)); if (!kvvb) return NULL; /* overalloc + (kv_sep_size * kv_pairs) + (pair_sep_size * kv_pairs) */ kvvb->bufsize = overalloc + (kvv->kv_pairs * 2); for (i = 0; i < kvv->kv_pairs; i++) { struct key_value *kv = &kvv->kv[i]; kvvb->bufsize += kv->key_len + kv->value_len; } kvvb->buf = malloc(kvvb->bufsize); if (!kvvb->buf) { free(kvvb); return NULL; } for (i = 0; i < kvv->kv_pairs; i++) { struct key_value *kv = &kvv->kv[i]; memcpy(kvvb->buf + len, kv->key, kv->key_len); len += kv->key_len; kvvb->buf[len++] = kv_sep; if (kv->value_len) { memcpy(kvvb->buf + len, kv->value, kv->value_len); len += kv->value_len; } kvvb->buf[len++] = pair_sep; } memset(kvvb->buf + len, 0, kvvb->bufsize - len); kvvb->buflen = len; return kvvb; } unsigned int kvvec_capacity(struct kvvec *kvv) { if (!kvv) return 0; return kvv->kv_alloc - kvv->kv_pairs; } /* * Converts a buffer of random bytes to a key/value vector. * This requires a fairly rigid format in the input data to be of * much use, but it's nifty for ipc where only computers are * involved, and it will parse the kvvec2buf() produce nicely. */ int buf2kvvec_prealloc(struct kvvec *kvv, char *str, unsigned int len, const char kvsep, const char pair_sep, int flags) { unsigned int num_pairs = 0, i, offset = 0; if (!str || !len || !kvv) return -1; /* first we count the number of key/value pairs */ while (offset < len) { const char *ptr; /* keys can't start with nul bytes */ if (*(str + offset)) { num_pairs++; } ptr = memchr(str + offset, pair_sep, len - offset); ptr++; if (!ptr) break; offset += (unsigned long)ptr - ((unsigned long)str + offset); } if (!num_pairs) { return 0; } /* make sure the key/value vector is large enough */ if (!(flags & KVVEC_APPEND)) { kvvec_init(kvv, num_pairs); } else if (kvvec_capacity(kvv) < num_pairs && kvvec_resize(kvv, num_pairs) < 0) { return -1; } offset = 0; for (i = 0; i < num_pairs; i++) { struct key_value *kv; char *key_end_ptr, *kv_end_ptr; /* keys can't begin with nul bytes */ if (offset && str[offset] == '\0') { return kvv->kv_pairs; } key_end_ptr = memchr(str + offset, kvsep, len - offset); if (!key_end_ptr) { break; } kv_end_ptr = memchr(key_end_ptr + 1, pair_sep, len - ((unsigned long)key_end_ptr - (unsigned long)str)); if (!kv_end_ptr) { if (i != num_pairs - 1) break; /* last pair doesn't need a pair separator */ kv_end_ptr = str + len; } kv = &kvv->kv[kvv->kv_pairs++]; kv->key_len = (unsigned long)key_end_ptr - ((unsigned long)str + offset); if (flags & KVVEC_COPY) { kv->key = malloc(kv->key_len + 1); memcpy(kv->key, str + offset, kv->key_len); } else { kv->key = str + offset; } kv->key[kv->key_len] = 0; offset += kv->key_len + 1; if (str[offset] == pair_sep) { kv->value_len = 0; if (flags & KVVEC_COPY) { kv->value = strdup(""); } else { kv->value = (char *)""; } } else { kv->value_len = (unsigned long)kv_end_ptr - ((unsigned long)str + offset); if (flags & KVVEC_COPY) { kv->value = malloc(kv->value_len + 1); memcpy(kv->value, str + offset, kv->value_len); } else { kv->value = str + offset; } kv->value[kv->value_len] = 0; } offset += kv->value_len + 1; } return i; } struct kvvec *buf2kvvec(char *str, unsigned int len, const char kvsep, const char pair_sep, int flags) { struct kvvec *kvv; kvv = kvvec_create(len / 20); if (!kvv) return NULL; if (buf2kvvec_prealloc(kvv, str, len, kvsep, pair_sep, flags) >= 0) return kvv; free(kvv); return NULL; } nagios-4.3.4/lib/kvvec.h000066400000000000000000000165501314764422400150550ustar00rootroot00000000000000#ifndef LIBNAGIOS_KVVEC_H_INCLUDED #define LIBNAGIOS_KVVEC_H_INCLUDED /** * @file kvvec.h * @brief Key/value vector library function and type declarations * * The kvvec library is nifty as either a configuration meta-format * or for IPC purposes. Take a look at the buf2kvvec() and kvvec2buf() * pair of functions for the latter. * @{ */ /** * key/value pair * One of the two major components of the kvvec api */ struct key_value { char *key; /**< The key */ char *value; /**< The value */ int key_len; /**< Length of key */ int value_len; /**< Length of value */ }; /** * key/value vector buffer. Actually just a buffer, but one that gets * used as return value and internal tracker for kvvec2buf() */ struct kvvec_buf { char *buf; /**< The buffer */ unsigned long buflen; /**< Length of buffer */ unsigned long bufsize; /**< Size of buffer (includes overalloc) */ }; /** * key/value vector struct * This is the main component of the kvvec library * @note This should be made opaque, with a kvvec_foreach() using a * callback to iterate over key/value pairs. */ struct kvvec { struct key_value *kv; /**< The key/value array */ int kv_alloc; /**< Allocated size of key/value array */ int kv_pairs; /**< Number of key/value pairs */ int kvv_sorted; /**< Determines if this kvvec has been sorted */ }; /** Portable initializer for stack-allocated key/value vectors */ #define KVVEC_INITIALIZER { NULL, 0, 0, 0 } /** Parameters for kvvec_destroy() */ #define KVVEC_FREE_KEYS 1 /**< Free keys when destroying a kv vector */ #define KVVEC_FREE_VALUES 2 /**< Free values when destroying a kv vector */ /** Free both keys and values when destroying a kv vector */ #define KVVEC_FREE_ALL (KVVEC_FREE_KEYS | KVVEC_FREE_VALUES) #define KVVEC_ASSIGN 0 /**< Assign from buf in buf2kvvec_prealloc() */ #define KVVEC_COPY 1 /**< Copy from buf in buf2kvvec_prealloc() */ #define KVVEC_APPEND 2 /**< Don't reset kvvec in buf2kvvec_prealloc() */ /** * Initialize a previously allocated key/value vector * * @param kvv The key/value vector to initialize * @param hint Number of key/value pairs we expect to store * @return Pointer to a struct kvvec, properly initialized */ extern struct kvvec *kvvec_init(struct kvvec *kvv, int hint); /** * Create a key/value vector * * @param hint Number of key/value pairs we expect to store * @return Pointer to a struct kvvec, properly initialized */ extern struct kvvec *kvvec_create(int hint); /** * Resize a key/value vector * Used by kvvec_grow(). If size is smaller than the current number of * used key/value slots, -1 is returned. * * @param[in] kvv The key/value vector to resize * @param[in] size The size to grow to * @return 0 on success, < 0 on errors */ extern int kvvec_resize(struct kvvec *kvv, int size); /** * Grow a key/value vector. * Used internally as needed by the kvvec api. If 'hint' is zero, the * key/value capacity is increased by a third of the current capacity * plus a small constant number. This uses kvvec_resize() internally. * * @param kvv The key/value vector to grow * @param hint The amount of key/value slots we should grow by * @return 0 on success, < 0 on errors */ extern int kvvec_grow(struct kvvec *kvv, int hint); /** * Return remaining storage capacity of key/value vector * @param[in] kvv The key/value vector to check * @return Number of key/value pairs that can be stored without growing */ extern unsigned int kvvec_capacity(struct kvvec *kvv); /** * Sort a key/value vector alphabetically by key name * @param kvv The key/value vector to sort * @return 0 */ extern int kvvec_sort(struct kvvec *kvv); /** * Add a key/value pair to an existing key/value vector, with * lengths of strings already calculated * @param kvv The key/value vector to add this key/value pair to * @param key The key * @param keylen Length of the key * @param value The value * @param valuelen Length of the value * @return 0 on success, < 0 on errors */ extern int kvvec_addkv_wlen(struct kvvec *kvv, const char *key, int keylen, const char *value, int valuelen); /** * Shortcut to kvvec_addkv_wlen() when lengths aren't known * @param kvv The key/value vector to add this key/value pair to * @param key The key * @param value The value * @return 0 on success, < 0 on errors */ #define kvvec_addkv(kvv, key, value) kvvec_addkv_wlen(kvv, key, 0, value, 0) /** * Walk each key/value pair in a key/value vector, sending them * as arguments to a callback function. The callback function has * no control over the iteration process and must not delete or * modify the key/value vector it's operating on. * @param kvv The key/value vector to walk * @param arg Extra argument to the callback function * @param callback Callback function * @return 0 on success, < 0 on errors */ extern int kvvec_foreach(struct kvvec *kvv, void *arg, int (*callback)(struct key_value *, void *)); /** * Destroy a key/value vector * @param kvv The key/value vector to destroy * @param flags or'ed combination of KVVEC_FREE_{KEYS,VALUES}, or KVVEC_FREE_ALL * @return 0 on success, < 0 on errors */ extern int kvvec_destroy(struct kvvec *kvv, int flags); /** * Free key/value pairs associated with a key/value vector * @param kvv The key/value vector to operate on * @param flags flags or'ed combination of KVVEC_FREE_{KEYS,VALUES}, or KVVEC_FREE_ALL */ void kvvec_free_kvpairs(struct kvvec *kvv, int flags); /** * Create a linear buffer of all the key/value pairs and * return it as a kvvec_buf. The caller must free() all * pointers in the returned kvvec_buf * (FIXME: add kvvec_buf_destroy(), or move this and its counterpart * out of the kvvec api into a separate one) * * @param kvv The key/value vector to convert * @param kv_sep Character separating keys and their values * @param pair_sep Character separating key/value pairs * @param overalloc Integer determining how much extra data we should * allocate. The overallocated memory is filled with * nul bytes. * @return A pointer to a newly created kvvec_buf structure */ extern struct kvvec_buf *kvvec2buf(struct kvvec *kvv, char kv_sep, char pair_sep, int overalloc); /** * Create a key/value vector from a pre-parsed buffer. Immensely * useful for ipc in combination with kvvec2buf(). * * @param str The buffer to convert to a key/value vector * @param len Length of buffer to convert * @param kvsep Character separating key and value * @param pair_sep Character separating key/value pairs * @param flags bitmask. See KVVEC_{ASSIGN,COPY,APPEND} for values * @return The created key/value vector */ extern struct kvvec *buf2kvvec(char *str, unsigned int len, const char kvsep, const char pair_sep, int flags); /** * Parse a buffer into the pre-allocated key/value vector. Immensely * useful for ipc in combination with kvvec2buf(). * * @param kvv A pre-allocated key/value vector to populate * @param str The buffer to convert to a key/value vector * @param len Length of buffer to convert * @param kvsep Character separating key and value * @param pair_sep Character separating key/value pairs * @param flags bitmask. See KVVEC_{ASSIGN,COPY,APPEND} for values * @return The number of pairs in the created key/value vector */ extern int buf2kvvec_prealloc(struct kvvec *kvv, char *str, unsigned int len, const char kvsep, const char pair_sep, int flags); /** @} */ #endif /* INCLUDE_kvvec_h__ */ nagios-4.3.4/lib/libnagios.h000066400000000000000000000010661314764422400157020ustar00rootroot00000000000000#ifndef LIBNAGIOS_LIBNAGIOS_H_INCLUDED #define LIBNAGIOS_LIBNAGIOS_H_INCLUDED /** * @file libnagios.h * * @brief Include this for all public parts of libnagios to be accessible */ #include "lnag-utils.h" #include "fanout.h" #include "nsutils.h" #include "pqueue.h" #include "squeue.h" #include "kvvec.h" #include "iobroker.h" #include "iocache.h" #include "runcmd.h" #include "bitmap.h" #include "dkhash.h" #include "worker.h" #include "skiplist.h" #include "nsock.h" #include "nspath.h" #include "snprintf.h" #include "nwrite.h" #endif /* LIB_libnagios_h__ */ nagios-4.3.4/lib/lnag-utils.h000066400000000000000000000067411314764422400160170ustar00rootroot00000000000000#ifndef LIBNAGIOS_LNAG_UTILS_H_INCLUDED #define LIBNAGIOS_LNAG_UTILS_H_INCLUDED #include /* for sysconf() */ #include /* for rand() */ /** * @file lnag-utils.h * @brief libnagios helper and compatibility macros that lack a "real" home. * * This is the home of random macros that must be present for compilation * to succeed but are missing on some platforms. * * @{ */ #define NAGIOS_MKVERSION(a, b, c) \ (((a) * 10000) + ((b) * 100) + (c)) #ifdef __cplusplus /** C++ compatibility macro that avoids confusing indentation programs */ # define NAGIOS_BEGIN_DECL extern "C" { /** * Use at end of header file declarations to obtain C++ compatibility * ... without confusing indentation programs */ # define NAGIOS_END_DECL } #else /** C++ compatibility macro that avoids confusing indentation programs */ # define NAGIOS_BEGIN_DECL /* nothing */ /** C++ compatibility macro that avoid confusing indentation programs */ # define NAGIOS_END_DECL /* more of nothing */ #endif #ifndef NODOXY /* doxy comments are useless here */ # ifndef __GNUC__ # define GCC_VERSION 0 # define __attribute__(x) /* nothing */ # else # ifdef __GNUC_PATCHLEVEL__ # define GCC_VERSION NAGIOS_MKVERSION(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__) # else # define GCC_VERSION NAGIOS_MKVERSION(__GNUC__, __GNUC_MINOR__, 0) # endif /* __GNUC_PATCHLEVEL__ */ # endif /* __GNUC__ */ #endif /* NODOXY */ #if GCC_VERSION >= NAGIOS_MKVERSION(4, 5, 0) # define NAGIOS_DEPRECATED(version, hint) \ __attribute__((deprecated("This function will be removed in Nagios v" #version ". Please use " #hint " instead"))) #else /** Macro for alerting module authors to function deprecation */ # define NAGIOS_DEPRECATED(version, hint) \ __attribute__((deprecated)) #endif /* * These macros are widely used throughout Nagios */ #define OK 0 /**< Indicates successful function call in Nagios */ #define ERROR -2 /**< Non-successful function call in Nagios */ #ifdef FALSE #undef FALSE #endif #define FALSE 0 /**< Not true */ #ifdef TRUE #undef TRUE #endif #define TRUE (!FALSE) /**< Not false */ /** Useful macro to safely avoid double-free memory corruption */ #define my_free(ptr) do { if(ptr) { free(ptr); ptr = NULL; } } while(0) #ifndef ARRAY_SIZE /** Useful for iterating over all elements in a static array */ # define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0])) #endif #ifndef veclen /** useful for iterating over all elements in a static array */ # define veclen ARRAY_SIZE #endif #ifndef offsetof /** standard offsetof macro */ # define offsetof(t, f) ((unsigned long)&((t *)0)->f) #endif /** character map initialization for .bss-allocated char maps */ #define CHAR_MAP_INIT(k) { \ k, k, k, k, k, k, k, k, k, k, k, k, k, k, k, k, \ k, k, k, k, k, k, k, k, k, k, k, k, k, k, k, k, \ k, k, k, k, k, k, k, k, k, k, k, k, k, k, k, k, \ k, k, k, k, k, k, k, k, k, k, k, k, k, k, k, k, \ k, k, k, k, k, k, k, k, k, k, k, k, k, k, k, k, \ k, k, k, k, k, k, k, k, k, k, k, k, k, k, k, k, \ k, k, k, k, k, k, k, k, k, k, k, k, k, k, k, k, \ k, k, k, k, k, k, k, k, k, k, k, k, k, k, k, k, \ k, k, k, k, k, k, k, k, k, k, k, k, k, k, k, k, \ k, k, k, k, k, k, k, k, k, k, k, k, k, k, k, k, \ k, k, k, k, k, k, k, k, k, k, k, k, k, k, k, k, \ k, k, k, k, k, k, k, k, k, k, k, k, k, k, k, k, \ k, k, k, k, k, k, k, k, k, k, k, k, k, k, k, k, \ k, k, k, k, k, k, k, k, k, k, k, k, k, k, k, k, \ k, k, k, k, k, k, k, k, k, k, k, k, k, k, k, k, \ k, k, k, k, k, k, k, k, k, k, k, k, k, k, k, k, \ } /** @} */ #endif nagios-4.3.4/lib/nsock.c000066400000000000000000000064041314764422400150440ustar00rootroot00000000000000#define _GNU_SOURCE 1 #include #include #include #include #include #include #include #include #include #include "snprintf.h" #include "lnag-utils.h" #include "nsock.h" #include const char *nsock_strerror(int code) { switch (code) { case NSOCK_EBIND: return "bind() failed"; case NSOCK_ELISTEN: return "listen() failed"; case NSOCK_ESOCKET: return "socket() failed"; case NSOCK_EUNLINK: return "unlink() failed"; case NSOCK_ECONNECT: return "connect() failed"; case NSOCK_EFCNTL: return "fcntl() failed"; case NSOCK_EINVAL: return "Invalid arguments"; } return "Unknown error"; } int nsock_unix(const char *path, unsigned int flags) { static int listen_backlog = INT_MAX; struct sockaddr_un saun; struct sockaddr *sa; int sock = 0, mode; socklen_t slen; if(!path) return NSOCK_EINVAL; if(flags & NSOCK_TCP) mode = SOCK_STREAM; else if(flags & NSOCK_UDP) mode = SOCK_DGRAM; else return NSOCK_EINVAL; if((sock = socket(AF_UNIX, mode, 0)) < 0) { return NSOCK_ESOCKET; } /* set up the sockaddr_un struct and the socklen_t */ sa = (struct sockaddr *)&saun; memset(&saun, 0, sizeof(saun)); saun.sun_family = AF_UNIX; slen = strlen(path); memcpy(&saun.sun_path, path, slen); slen += offsetof(struct sockaddr_un, sun_path); /* unlink if we're supposed to, but not if we're connecting */ if(flags & NSOCK_UNLINK && !(flags & NSOCK_CONNECT)) { if(unlink(path) < 0 && errno != ENOENT) return NSOCK_EUNLINK; } if(flags & NSOCK_CONNECT) { if(connect(sock, sa, slen) < 0) { close(sock); return NSOCK_ECONNECT; } return sock; } else { if(bind(sock, sa, slen) < 0) { close(sock); return NSOCK_EBIND; } } if(!(flags & NSOCK_BLOCK) && fcntl(sock, F_SETFL, O_NONBLOCK) < 0) return NSOCK_EFCNTL; if(flags & NSOCK_UDP) return sock; /* Default the backlog number on listen() to INT_MAX. If INT_MAX fails, * try using SOMAXCONN (usually 127) and if that fails, return an error */ for (;;) { if (listen(sock, listen_backlog)) { if (listen_backlog == SOMAXCONN) { close(sock); return NSOCK_ELISTEN; } else listen_backlog = SOMAXCONN; } break; } return sock; } static inline int nsock_vprintf(int sd, const char *fmt, va_list ap, int plus) { va_list ap_dup; char stack_buf[4096]; int len; va_copy(ap_dup, ap); len = vsnprintf(stack_buf, sizeof(stack_buf), fmt, ap_dup); va_end(ap_dup); if (len < 0) return len; if (len < sizeof(stack_buf)) { stack_buf[len] = 0; if (plus) ++len; /* Include the nul byte if requested. */ return write(sd, stack_buf, len); } else { char *heap_buf = NULL; len = vasprintf(&heap_buf, fmt, ap); if (len < 0) return len; if (plus) ++len; /* Include the nul byte if requested. */ len = write(sd, heap_buf, len); free(heap_buf); return len; } } int nsock_printf_nul(int sd, const char *fmt, ...) { va_list ap; int ret; va_start(ap, fmt); ret = nsock_vprintf(sd, fmt, ap, 1); va_end(ap); return ret; } int nsock_printf(int sd, const char *fmt, ...) { va_list ap; int ret; va_start(ap, fmt); ret = nsock_vprintf(sd, fmt, ap, 0); va_end(ap); return ret; } nagios-4.3.4/lib/nsock.h000066400000000000000000000053361314764422400150540ustar00rootroot00000000000000#ifndef LIBNAGIOS_NSOCK_H_INCLUDED #define LIBNAGIOS_NSOCK_H_INCLUDED #include /** * @file nsock.h * @brief Nagios socket helper library * * This is a pretty stupid library, but since so many addons and * now Nagios core itself makes use of sockets, we might as well * have some simple wrappers for it that handle the most common * cases. * * @{ */ #define NSOCK_EBIND (-1) /**< failed to bind() */ #define NSOCK_ELISTEN (-2) /**< failed to listen() */ #define NSOCK_ESOCKET (-3) /**< failed to socket() */ #define NSOCK_EUNLINK (-4) /**< failed to unlink() */ #define NSOCK_ECONNECT (-5) /**< failed to connect() */ #define NSOCK_EFCNTL (-6) /**< failed to fcntl() */ #define NSOCK_EINVAL (-EINVAL) /**< -22, normally */ /* flags for the various create calls */ #define NSOCK_TCP (1 << 0) /**< use tcp mode */ #define NSOCK_UDP (1 << 1) /**< use udp mode */ #define NSOCK_UNLINK (1 << 2) /**< unlink existing path (only nsock_unix) */ #define NSOCK_REUSE (1 << 2) /**< reuse existing address */ #define NSOCK_CONNECT (1 << 3) /**< connect rather than create */ #define NSOCK_BLOCK (1 << 4) /**< socket should be in blocking mode */ /** * Grab an error string relating to nsock_unix() * @param code The error code return by the nsock library * @return An error string describing the error */ extern const char *nsock_strerror(int code); /** * Create or connect to a unix socket * To control permissions on sockets when NSOCK_LISTEN is specified, * callers will have to modify their umask() before (and possibly * after) the nsock_unix() call. * * @param path The path to connect to or create * @param flags Various options controlling the mode of the socket * @return An NSOCK_E macro on errors, the created socket on succes */ extern int nsock_unix(const char *path, unsigned int flags); /** * Write a nul-terminated message to the socket pointed to by sd. * This isn't quite the same as dprintf(), which doesn't include * the terminating nul byte. * @note This function may block, so poll(2) for writability * @param sd The socket to write to * @param fmt The format string * @return Whatever write() returns */ extern int nsock_printf_nul(int sd, const char *fmt, ...) __attribute__((__format__(__printf__, 2, 3))); /** * Write a printf()-formatted string to the socket pointed to by sd. * This is identical to dprintf(), which is unfortunately GNU only. * @note This function may block, so poll(2) for writability * @param sd The socket to write to * @param fmt The format string * @return Whatever write() returns */ extern int nsock_printf(int sd, const char *fmt, ...) __attribute__((__format__(__printf__, 2, 3))); /** @} */ #endif /* LIBNAGIOS_NSOCK_H_INCLUDED */ nagios-4.3.4/lib/nspath.c000066400000000000000000000107751314764422400152320ustar00rootroot00000000000000#define _GNU_SOURCE 1 #include #include #include #include #include #include #include #include #include "nspath.h" #ifndef PATH_MAX # define PATH_MAX 4096 #endif #define PCOMP_IGNORE (1 << 0) /* marks negated or ignored components */ #define PCOMP_ALLOC (1 << 1) /* future used for symlink resolutions */ /* path component struct */ struct pcomp { char *str; /* file- or directoryname */ unsigned int len; /* length of this component */ int flags; }; static inline int path_components(const char *path) { char *slash; int comps = 1; if (!path) return 0; for (slash = strchr(path, '/'); slash; slash = strchr(slash + 1, '/')) comps++; return comps; } static char *pcomp_construct(struct pcomp *pcomp, int comps) { int i, plen = 0, offset = 0; char *path; for (i = 0; i < comps; i++) { if(pcomp[i].flags & PCOMP_IGNORE) continue; plen += pcomp[i].len + 1; } path = malloc(plen + 2); for (i = 0; i < comps; i++) { if(pcomp[i].flags & PCOMP_IGNORE) continue; memcpy(path + offset, pcomp[i].str, pcomp[i].len); offset += pcomp[i].len; if (i < comps - 1) path[offset++] = '/'; } path[offset] = 0; return path; } /* * Converts "foo/bar/.././lala.txt" to "foo/lala.txt". * "../../../../../bar/../foo/" becomes "/foo/" */ char *nspath_normalize(const char *orig_path) { struct pcomp *pcomp = NULL; int comps, i = 0, m, depth = 0, have_slash = 0; char *path, *rpath, *p, *slash; if (!orig_path || !*orig_path) return NULL; rpath = strdup(orig_path); comps = path_components(rpath); pcomp = calloc(comps, sizeof(struct pcomp)); if (pcomp == NULL) return NULL; p = pcomp[0].str = rpath; for (; p; p = slash, i++) { slash = strchr(p, '/'); if (slash) { have_slash = 1; *slash = 0; slash++; } pcomp[i].len = strlen(p); pcomp[i].str = p; if (*p == '.') { if (p[1] == 0) { /* dot-slash is always just ignored */ pcomp[i].flags |= PCOMP_IGNORE; continue; } if ((*orig_path == '/' || depth) && p[1] == '.' && p[2] == 0) { /* dot-dot-slash negates the previous non-negated component */ pcomp[i].flags |= PCOMP_IGNORE; for(m = 0; depth && m <= i; m++) { if (pcomp[i - m].flags & PCOMP_IGNORE) { continue; } pcomp[i - m].flags |= PCOMP_IGNORE; depth--; break; /* we only remove one level at most */ } continue; } } /* convert multiple slashes to one */ if (i && !*p) { pcomp[i].flags |= PCOMP_IGNORE; continue; } depth++; } /* * If we back up all the way to the root we need to add a slash * as the first path component. */ if (have_slash && depth == 1) { pcomp[0].flags &= ~(PCOMP_IGNORE); pcomp[0].str[0] = 0; pcomp[0].len = 0; } path = pcomp_construct(pcomp, comps); free(rpath); free(pcomp); return path; } char *nspath_absolute(const char *rel_path, const char *base) { char cwd[PATH_MAX]; int len; char *path = NULL, *normpath; if (*rel_path == '/') return nspath_normalize(rel_path); if (!base) { if (getcwd(cwd, sizeof(cwd)) == NULL) return NULL; base = cwd; } len = asprintf(&path, "%s/%s", base, rel_path); if (len <= 0) { if (path) free(path); return NULL; } normpath = nspath_normalize(path); free(path); return normpath; } char *nspath_real(const char *rel_path, const char *base) { char *abspath, *ret; if (!(abspath = nspath_absolute(rel_path, base))) return NULL; ret = realpath(abspath, NULL); free(abspath); return ret; } /* we must take care not to destroy the original buffer here */ char *nspath_absolute_dirname(const char *path, const char *base) { char *buf, *ret; if (!(buf = nspath_absolute(path, base))) return NULL; ret = strdup(dirname(buf)); free(buf); return ret; } int nspath_mkdir_p(const char *orig_path, mode_t mode, int options) { char *sep, *path; int ret = 0, mkdir_start = 0; if (!orig_path) { errno = EFAULT; return -1; } sep = path = strdup(orig_path); if (!sep) return -1; for (;;) { struct stat st; if ((sep = strchr(sep + 1, '/'))) { *sep = 0; /* nul-terminate path */ } else if (options & NSPATH_MKDIR_SKIP_LAST) { break; } /* stat() our way up the tree and start mkdir() on ENOENT */ if (!mkdir_start && (ret = stat(path, &st)) < 0) { if (errno != ENOENT) { break; } mkdir_start = 1; } if (mkdir_start && (ret = mkdir(path, mode)) < 0) { break; } /* end of path or trailing slash? */ if (!sep || !sep[1]) break; *sep = '/'; } free(path); return ret; } nagios-4.3.4/lib/nspath.h000066400000000000000000000063111314764422400152260ustar00rootroot00000000000000#ifndef LIBNAGIOS_NSPATH_H_INCLUDED #define LIBNAGIOS_NSPATH_H_INCLUDED #ifndef _GNU_SOURCE # ifndef NODOXY # define _GNU_SOURCE 1 # endif #endif #include #include #include "snprintf.h" /** * @file nspath.h * @brief path handling functions * * This library handles path normalization and resolution. It's nifty * if you want to turn relative paths into absolute ones, or if you * want to make insane ones sane, but without chdir()'ing your way * around the filesystem. * * @{ */ /** * Normalize a path * By "normalize", we mean that we convert dot-slash and dot-dot-slash * embedded components into a legible continuous string of characters. * Leading and trailing slashes are kept exactly as they are in input, * but with sequences of slashes reduced to a single one. * * "foo/bar/.././lala.txt" becomes "foo/lala.txt" * "../../../../bar/../foo/" becomes "/foo/" * "////foo////././bar" becomes "/foo/bar" * @param orig_path The path to normalize * @return A newly allocated string containing the normalized path */ extern char *nspath_normalize(const char *orig_path); /** * Make the "base"-relative path "rel_path" absolute. * Turns the relative path "rel_path" into an absolute path and * resolves it as if we were currently in "base". If "base" is * NULL, the current working directory is used. If "base" is not * null, it should be an absolute path for the result to make * sense. * * @param rel_path The relative path to convert * @param base The base directory (if NULL, we use current working dir) * @return A newly allocated string containing the absolute path */ extern char *nspath_absolute(const char *rel_path, const char *base); /** * Canonicalize the "base"-relative path "rel_path". * errno gets properly set in case of errors. * @param rel_path The path to transform * @param base The base we should operate relative to * @return Newly allocated canonical path on succes, NULL on errors */ extern char *nspath_real(const char *rel_path, const char *base); /** * Get absolute dirname of "path", relative to "base" * @param path Full path to target object (file or subdir) * @param base The base directory (if NULL, we use current working dir) * @return NULL on errors, allocated absolute directory name on success */ extern char *nspath_absolute_dirname(const char *path, const char *base); /** * Recursively create a directory, just like mkdir_p would. * @note This function *will* taint errno with ENOENT if any path * component has to be created. * @note If "path" has a trailing slash, NSPATH_MKDIR_SKIP_LAST * won't have any effect. That's considered a feature, since the * option is designed so one can send a file-path to the function * and have it create the directory structure for it. * @param path Path to create, in normalized form * @param mode Filemode (same as mkdir() takes) * @param options Options flag. See NSPATH_MKDIR_* for or-able options * @return 0 on success, -1 on errors and errno will hold error code * from either stat() or mkdir(). */ extern int nspath_mkdir_p(const char *path, mode_t mode, int options); /** Don't mkdir() last element of path when calling nspath_mkdir_p() */ #define NSPATH_MKDIR_SKIP_LAST (1 << 0) /** @} */ #endif nagios-4.3.4/lib/nsutils.c000066400000000000000000000037171314764422400154340ustar00rootroot00000000000000#include "lnag-utils.h" #include "nsutils.h" #include #include #include #if defined(hpux) || defined(__hpux) || defined(_hpux) # include #endif /* * By doing this in two steps we can at least get * the function to be somewhat coherent, even * with this disgusting nest of #ifdefs. */ #ifndef _SC_NPROCESSORS_ONLN # ifdef _SC_NPROC_ONLN # define _SC_NPROCESSORS_ONLN _SC_NPROC_ONLN # elif defined _SC_CRAY_NCPU # define _SC_NPROCESSORS_ONLN _SC_CRAY_NCPU # endif #endif int real_online_cpus(void) { #ifdef _SC_NPROCESSORS_ONLN long ncpus; if ((ncpus = (long)sysconf(_SC_NPROCESSORS_ONLN)) > 0) return (int)ncpus; #elif defined(hpux) || defined(__hpux) || defined(_hpux) struct pst_dynamic psd; if (!pstat_getdynamic(&psd, sizeof(psd), (size_t)1, 0)) return (int)psd.psd_proc_cnt; #endif return 0; } int online_cpus(void) { int ncpus = real_online_cpus(); return ncpus > 0 ? ncpus : 1; } int tv_delta_msec(const struct timeval *start, const struct timeval *stop) { int msecs; unsigned long usecs = 0; msecs = (stop->tv_sec - start->tv_sec) * 1000; if (stop->tv_usec < start->tv_usec) { msecs -= 1000; usecs += 1000000; } usecs += stop->tv_usec - start->tv_usec; msecs += (usecs / 1000); return msecs; } float tv_delta_f(const struct timeval *start, const struct timeval *stop) { #define DIVIDER 1000000 float ret; time_t usecs, stop_usec; ret = stop->tv_sec - start->tv_sec; stop_usec = stop->tv_usec; if (stop_usec < start->tv_usec) { ret -= 1.0; stop_usec += DIVIDER; } usecs = stop_usec - start->tv_usec; ret += (float)((float)usecs / DIVIDER); return ret; } #define MKSTR_BUFS 256 /* should be plenty */ const char *mkstr(const char *fmt, ...) { static char buf[MKSTR_BUFS][32]; /* 8k statically on the stack */ static int slot = 0; char *ret; va_list ap; va_start(ap, fmt); ret = buf[slot++ % MKSTR_BUFS]; vsnprintf(ret, sizeof(buf[0]), fmt, ap); va_end(ap); return ret; } nagios-4.3.4/lib/nsutils.h000066400000000000000000000062331314764422400154350ustar00rootroot00000000000000#ifndef LIBNAGIOS_NSUTILS_H_INCLUDED #define LIBNAGIOS_NSUTILS_H_INCLUDED #include #include /** * @file nsutils.h * @brief Non-Standard (or Nagios) utility functions and macros. * * This is where we house all helpers and macros that fall outside * the "standard-ish" norm. The prefixes "nsu_" and NSU_ are * reserved for this purpose, so we avoid clashing with other * applications that may have similarly-acting functions with * identical names. * * The functions already here lack the nsu_ prefix for backwards * compatibility reasons. It's possible we'll have to fix that * some day, but let's leave that for later. * * @{ */ /** Macro for dynamically increasing vector lengths */ #define alloc_nr(x) (((x)+16)*3/2) /** * Check if a number is a power of 2 * @param x The number to check * @return 1 if the number is a power of 2, 0 if it's not */ static inline int nsu_ispow2(unsigned int x) { return x > 1 ? !(x & (x - 1)) : 0; } /** * Round up to a power of 2 * Yes, this is the most cryptic function name in all of Nagios, but I * like it, so shush. * @param r The number to round up * @return r, rounded up to the nearest power of 2. */ static inline unsigned int rup2pof2(unsigned int r) { r--; if (!r) return 2; r |= r >> 1; r |= r >> 2; r |= r >> 4; r |= r >> 8; r |= r >> 16; return r + 1; } /** * Grab a random unsigned int in the range between low and high. * Note that the PRNG has to be seeded prior to calling this. * @param low The lower bound, inclusive * @param high The higher bound, inclusive * @return An unsigned integer in the mathematical range [low, high] */ static inline unsigned int ranged_urand(unsigned int low, unsigned int high) { return low + (rand() * (1.0 / (RAND_MAX + 1.0)) * (high - low)); } /** * Get number of online cpus * @return Active cpu cores detected on success. 0 on failure. */ extern int real_online_cpus(void); /** * Wrapper for real_online_cpus(), returning 1 in case we can't * detect any active cpus. * @return Number of active cpu cores on success. 1 on failure. */ extern int online_cpus(void); /** * Create a short-lived string in stack-allocated memory * The number and size of strings is limited (currently to 256 strings of * 32 bytes each), so beware and use this sensibly. Intended for * number-to-string conversion and other short strings. * @note The returned string must *not* be free()'d! * @param[in] fmt The format string * @return A pointer to the formatted string on success. Undefined on errors */ extern const char *mkstr(const char *fmt, ...) __attribute__((__format__(__printf__, 1, 2))); /** * Calculate the millisecond delta between two timeval structs * @param[in] start The start time * @param[in] stop The stop time * @return The millisecond delta between the two structs */ extern int tv_delta_msec(const struct timeval *start, const struct timeval *stop); /** * Get timeval delta as seconds * @param start The start time * @param stop The stop time * @return time difference in fractions of seconds */ extern float tv_delta_f(const struct timeval *start, const struct timeval *stop); /** @} */ #endif /* LIBNAGIOS_NSUTILS_H_INCLUDED */ nagios-4.3.4/lib/nwrite.h000066400000000000000000000024171314764422400152440ustar00rootroot00000000000000#ifndef LIBNAGIOS_NWRITE_H_INCLUDED #define LIBNAGIOS_NWRITE_H_INCLUDED /** * @file nwrite.h * @brief Functions that properly handle incomplete write()'s * * Some functions simply use write() to send data through a socket. * These calls are sometimes interrupted, especially in the case of * an overly large buffer. Even though the write() _could_ finish, * the incomplete write is treated as an error. The functions here * properly handle those cases. * * @{ */ /** * Send data through a socket * This function will send data through a socket and return * the number of bytes written. * @param sock The socket to write to * @param data The data to write * @param lth The length of the data * @param sent The number of bytes written (can be NULL) * @return The number of bytes written or -1 if error */ static inline ssize_t nwrite(int fd, const void *buf, size_t count, ssize_t *written) { ssize_t out, tot = 0; if (!buf || count == 0) return 0; while (tot < count) { out = write(fd, buf + tot, count - tot); if (out > 0) tot += out; else if(errno == EAGAIN || errno == EINTR) continue; else { if (written) *written = tot; return out; } } if (written) *written = tot; return tot; } /** @} */ #endif /* LIBNAGIOS_NWRITE_H_INCLUDED */ nagios-4.3.4/lib/pqueue.c000066400000000000000000000127041314764422400152330ustar00rootroot00000000000000/* * Copyright 2010 Volkan Yazıcı * Copyright 2006-2010 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy * of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ #include #include #include #include "pqueue.h" #define left(i) (unsigned long)((i) << 1) #define right(i) (unsigned long)(((i) << 1) + 1) #define parent(i) (unsigned long)((i) >> 1) pqueue_t * pqueue_init(unsigned int n, pqueue_cmp_pri_f cmppri, pqueue_get_pri_f getpri, pqueue_set_pri_f setpri, pqueue_get_pos_f getpos, pqueue_set_pos_f setpos) { pqueue_t *q; if (!(q = calloc(1, sizeof(pqueue_t)))) { return NULL; } /* Need to allocate n+1 elements since element 0 isn't used. */ if (!(q->d = calloc(n + 1, sizeof(void *)))) { free(q); return NULL; } q->size = 1; q->avail = q->step = (n + 1); /* see comment above about n+1 */ q->cmppri = cmppri; q->setpri = setpri; q->getpri = getpri; q->getpos = getpos; q->setpos = setpos; return q; } void pqueue_free(pqueue_t *q) { free(q->d); free(q); } unsigned int pqueue_size(pqueue_t *q) { /* queue element 0 exists but doesn't count since it isn't used. */ return (q->size - 1); } static void bubble_up(pqueue_t *q, unsigned int i) { unsigned int parent_node; void *moving_node = q->d[i]; pqueue_pri_t moving_pri = q->getpri(moving_node); for (parent_node = parent(i); ((i > 1) && q->cmppri(q->getpri(q->d[parent_node]), moving_pri)); i = parent_node, parent_node = parent(i)) { q->d[i] = q->d[parent_node]; q->setpos(q->d[i], i); } q->d[i] = moving_node; q->setpos(moving_node, i); } static unsigned int maxchild(pqueue_t *q, unsigned int i) { unsigned int child_node = left(i); if (child_node >= q->size) { return 0; } if ((child_node + 1) < q->size && q->cmppri(q->getpri(q->d[child_node]), q->getpri(q->d[child_node + 1]))) { child_node++; /* use right child instead of left */ } return child_node; } static void percolate_down(pqueue_t *q, unsigned int i) { unsigned int child_node; void *moving_node = q->d[i]; pqueue_pri_t moving_pri = q->getpri(moving_node); while ((child_node = maxchild(q, i)) && q->cmppri(moving_pri, q->getpri(q->d[child_node]))) { q->d[i] = q->d[child_node]; q->setpos(q->d[i], i); i = child_node; } q->d[i] = moving_node; q->setpos(moving_node, i); } int pqueue_insert(pqueue_t *q, void *d) { void *tmp; unsigned int i; unsigned int newsize; if (!q) { return 1; } /* allocate more memory if necessary */ if (q->size >= q->avail) { newsize = q->size + q->step; if (!(tmp = realloc(q->d, sizeof(void *) * newsize))) { return 1; } q->d = tmp; q->avail = newsize; } /* insert item */ i = q->size++; q->d[i] = d; bubble_up(q, i); return 0; } void pqueue_change_priority(pqueue_t *q, pqueue_pri_t new_pri, void *d) { unsigned int posn; pqueue_pri_t old_pri = q->getpri(d); q->setpri(d, new_pri); posn = q->getpos(d); if (q->cmppri(old_pri, new_pri)) { bubble_up(q, posn); } else { percolate_down(q, posn); } } int pqueue_remove(pqueue_t *q, void *d) { unsigned int posn = q->getpos(d); q->d[posn] = q->d[--q->size]; if (q->cmppri(q->getpri(d), q->getpri(q->d[posn]))) { bubble_up(q, posn); } else { percolate_down(q, posn); } return 0; } void * pqueue_pop(pqueue_t *q) { void *head; if (!q || q->size == 1) { return NULL; } head = q->d[1]; q->d[1] = q->d[--q->size]; percolate_down(q, 1); return head; } void * pqueue_peek(pqueue_t *q) { if (!q || q->size == 1) { return NULL; } return q->d[1]; } #if 0 void pqueue_dump(pqueue_t *q, FILE *out, pqueue_print_entry_f print) { int i; fprintf(out, "posn\tleft\tright\tparent\tmaxchild\t...\n"); for (i = 1; i < q->size ; i++) { fprintf(out, "%d\t%d\t%d\t%d\t%ul\t", i, left(i), right(i), parent(i), (unsigned int)maxchild(q, i)); print(out, q->d[i]); } } static void set_pos(void *d, unsigned int val) { /* do nothing */ } static void set_pri(void *d, pqueue_pri_t pri) { /* do nothing */ } void pqueue_print(pqueue_t *q, FILE *out, pqueue_print_entry_f print) { pqueue_t *dup; void *e; dup = pqueue_init(q->size, q->cmppri, q->getpri, set_pri, q->getpos, set_pos); dup->size = q->size; dup->avail = q->avail; dup->step = q->step; memcpy(dup->d, q->d, (q->size * sizeof(void *))); while ((e = pqueue_pop(dup))) { print(out, e); } pqueue_free(dup); } #endif static int subtree_is_valid(pqueue_t *q, int pos) { if (left(pos) < q->size) { /* has a left child */ if (q->cmppri(q->getpri(q->d[pos]), q->getpri(q->d[left(pos)]))) { return 0; } if (!subtree_is_valid(q, left(pos))) { return 0; } } if (right(pos) < q->size) { /* has a right child */ if (q->cmppri(q->getpri(q->d[pos]), q->getpri(q->d[right(pos)]))) { return 0; } if (!subtree_is_valid(q, right(pos))) { return 0; } } return 1; } int pqueue_is_valid(pqueue_t *q) { return subtree_is_valid(q, 1); } nagios-4.3.4/lib/pqueue.h000066400000000000000000000122541314764422400152400ustar00rootroot00000000000000/* * Copyright 2010 Volkan Yazıcı * Copyright 2006-2010 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ #ifndef LIBNAGIOS_PQUEUE_H_INCLUDED #define LIBNAGIOS_PQUEUE_H_INCLUDED #include /** * @file pqueue.h * @brief Priority Queue function declarations * * This priority queue library was originally written by Volkan Yazici * . It was lated adapted for Nagios by * Andreas Ericsson . Changes compared to the original * version are pretty much limited to changing pqueue_pri_t to be * an unsigned long long instead of a double, since ULL comparisons * are 107 times faster on my 64-bit laptop. * * @{ */ /** priority data type (used to be double, but ull is 107 times faster) */ typedef unsigned long long pqueue_pri_t; /** callback functions to get/set/compare the priority of an element */ typedef pqueue_pri_t (*pqueue_get_pri_f)(void *a); typedef void (*pqueue_set_pri_f)(void *a, pqueue_pri_t pri); typedef int (*pqueue_cmp_pri_f)(pqueue_pri_t next, pqueue_pri_t curr); /** callback functions to get/set the position of an element */ typedef unsigned int (*pqueue_get_pos_f)(void *a); typedef void (*pqueue_set_pos_f)(void *a, unsigned int pos); /** debug callback function to print a entry */ typedef void (*pqueue_print_entry_f)(FILE *out, void *a); /** the priority queue handle */ typedef struct pqueue_t { unsigned int size; /**< number of elements in this queue */ unsigned int avail; /**< slots available in this queue */ unsigned int step; /**< growth stepping setting */ pqueue_cmp_pri_f cmppri; /**< callback to compare nodes */ pqueue_get_pri_f getpri; /**< callback to get priority of a node */ pqueue_set_pri_f setpri; /**< callback to set priority of a node */ pqueue_get_pos_f getpos; /**< callback to get position of a node */ pqueue_set_pos_f setpos; /**< callback to set position of a node */ void **d; /**< The actual queue in binary heap form */ } pqueue_t; /** * initialize the queue * * @param n the initial estimate of the number of queue items for which memory * should be preallocated * @param cmppri The callback function to run to compare two elements * This callback should return 0 for 'lower' and non-zero * for 'higher', or vice versa if reverse priority is desired * @param setpri the callback function to run to assign a score to an element * @param getpri the callback function to run to set a score to an element * @param getpos the callback function to get the current element's position * @param setpos the callback function to set the current element's position * * @return the handle or NULL for insufficent memory */ pqueue_t * pqueue_init(unsigned int n, pqueue_cmp_pri_f cmppri, pqueue_get_pri_f getpri, pqueue_set_pri_f setpri, pqueue_get_pos_f getpos, pqueue_set_pos_f setpos); /** * free all memory used by the queue * @param q the queue */ void pqueue_free(pqueue_t *q); /** * return the size of the queue. * @param q the queue */ unsigned int pqueue_size(pqueue_t *q); /** * insert an item into the queue. * @param q the queue * @param d the item * @return 0 on success */ int pqueue_insert(pqueue_t *q, void *d); /** * move an existing entry to a different priority * @param q the queue * @param new_pri the new priority * @param d the entry */ void pqueue_change_priority(pqueue_t *q, pqueue_pri_t new_pri, void *d); /** * pop the highest-ranking item from the queue. * @param q the queue * @return NULL on error, otherwise the entry */ void *pqueue_pop(pqueue_t *q); /** * remove an item from the queue. * @param q the queue * @param d the entry * @return 0 on success */ int pqueue_remove(pqueue_t *q, void *d); /** * access highest-ranking item without removing it. * @param q the queue * @return NULL on error, otherwise the entry */ void *pqueue_peek(pqueue_t *q); /** * print the queue * @internal * DEBUG function only * @param q the queue * @param out the output handle * @param the callback function to print the entry */ void pqueue_print(pqueue_t *q, FILE *out, pqueue_print_entry_f print); /** * dump the queue and it's internal structure * @internal * debug function only * @param q the queue * @param out the output handle * @param the callback function to print the entry */ void pqueue_dump(pqueue_t *q, FILE *out, pqueue_print_entry_f print); /** * checks that the pq is in the right order, etc * @internal * debug function only * @param q the queue */ int pqueue_is_valid(pqueue_t *q); #endif /** @} */ nagios-4.3.4/lib/runcmd.c000066400000000000000000000360141314764422400152170ustar00rootroot00000000000000/* * A simple interface to executing programs from other programs, using an * optimized and safer popen()-like implementation. It is considered safer in * that no shell needs to be spawned for simple commands, and the environment * passed to the execve()'d program is essentially empty. * * This code is based on popen.c, which in turn was taken from * "Advanced Programming in the UNIX Environment" by W. Richard Stevens. * * Care has been taken to make sure the functions are async-safe. The exception * is runcmd_init() which multithreaded applications or plugins must call in a * non-reentrant manner before calling any other runcmd function. */ #define NAGIOSPLUG_API_C 1 /* includes **/ #include #include #include #include #include #include #include #include #include "runcmd.h" /** macros **/ #ifndef WEXITSTATUS # define WEXITSTATUS(stat_val) ((unsigned)(stat_val) >> 8) #endif #ifndef WIFEXITED # define WIFEXITED(stat_val) (((stat_val) & 255) == 0) #endif /* Determine whether we have setenv()/unsetenv() (see setenv(3) on Linux) */ #if _BSD_SOURCE || _POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600 # define HAVE_SETENV #endif /* * This variable must be global, since there's no way the caller * can forcibly slay a dead or ungainly running program otherwise. * * The check for initialized values and allocation is not atomic, and can * potentially occur in any number of threads simultaneously. * * Multithreaded apps and plugins must initialize it (via runcmd_init()) * in an async safe manner before calling any other runcmd function. */ static pid_t *pids = NULL; /* If OPEN_MAX isn't defined, we try the sysconf syscall first. * If that fails, we fall back to an educated guess which is accurate * on Linux and some other systems. There's no guarantee that our guess is * adequate and the program will die with SIGSEGV if it isn't and the * upper boundary is breached. */ #ifdef OPEN_MAX # define maxfd OPEN_MAX #else # ifndef _SC_OPEN_MAX /* sysconf macro unavailable, so guess */ # define maxfd 256 # else static int maxfd = 0; # endif /* _SC_OPEN_MAX */ #endif /* OPEN_MAX */ const char *runcmd_strerror(int code) { switch (code) { case RUNCMD_EFD: return "pipe() or open() failed"; case RUNCMD_EALLOC: return "memory allocation failed"; case RUNCMD_ECMD: return "command too complicated"; case RUNCMD_EFORK: return "failed to fork()"; case RUNCMD_EINVAL: return "invalid parameters"; case RUNCMD_EWAIT: return "wait() failed"; } return "unknown"; } /* yield the pid belonging to a particular file descriptor */ pid_t runcmd_pid(int fd) { if(!pids || fd >= maxfd || fd < 0) return 0; return pids[fd]; } /* * Simple command parser which is still tolerably accurate for our * simple needs. It might serve as a useful example on how to program * a state-machine though. * * It's up to the caller to handle output redirection, job control, * conditional statements, variable substitution, nested commands and * function execution. We do mark such occasions with the return code * though, which is to be interpreted as a bitfield with potentially * multiple flags set. */ #define STATE_NONE 0 #define STATE_WHITE (1 << 0) #define STATE_INARG (1 << 1) #define STATE_INSQ (1 << 2) #define STATE_INDQ (1 << 3) #define STATE_SPECIAL (1 << 4) #define STATE_BSLASH (1 << 5) #define in_quotes (state & (STATE_INSQ | STATE_INDQ)) #define is_state(s) (state == s) #define set_state(s) (state = s) #define have_state(s) ((state & s) == s) #define add_state(s) (state |= s) #define del_state(s) (state &= ~s) #define add_ret(r) (ret |= r) int runcmd_cmd2strv(const char *str, int *out_argc, char **out_argv) { int arg = 0; int a = 0; unsigned int i; int state; int ret = 0; size_t len; char *argz; set_state(STATE_NONE); if (!str || !*str || !out_argc || !out_argv) return RUNCMD_EINVAL; len = strlen(str); argz = malloc(len + 1); if (!argz) return RUNCMD_EALLOC; /* Point argv[0] at the parsed argument string argz so we don't leak. */ out_argv[0] = argz; out_argv[1] = NULL; for (i = 0; i < len; i++) { const char *p = &str[i]; switch (*p) { case 0: if (arg == 0) free(out_argv[0]); out_argv[arg] = NULL; *out_argc = arg; return ret; case ' ': case '\t': case '\r': case '\n': if (is_state(STATE_INARG)) { set_state(STATE_NONE); argz[a++] = 0; continue; } if (!in_quotes) continue; break; case '\\': /* single-quoted strings never interpolate backslashes */ if (have_state(STATE_INSQ) || have_state(STATE_BSLASH)) { break; } /* * double-quoted strings let backslashes escape * a few, but not all, shell specials */ if (have_state(STATE_INDQ)) { const char next = str[i + 1]; switch (next) { case '"': case '\\': case '$': case '`': add_state(STATE_BSLASH); continue; } break; } /* * unquoted strings remove unescaped backslashes, * but backslashes escape anything and everything */ i++; break; case '\'': if (have_state(STATE_INDQ)) break; if (have_state(STATE_INSQ)) { del_state(STATE_INSQ); continue; } /* * quotes can come inside arguments or * at the start of them */ if (is_state(STATE_NONE) || is_state(STATE_INARG)) { if (is_state(STATE_NONE)) { /* starting a new argument */ out_argv[arg++] = &argz[a]; } set_state(STATE_INSQ | STATE_INARG); continue; } case '"': if (have_state(STATE_INSQ)) break; if (have_state(STATE_INDQ)) { del_state(STATE_INDQ); continue; } if (is_state(STATE_NONE) || is_state(STATE_INARG)) { if (is_state(STATE_NONE)) { out_argv[arg++] = &argz[a]; } set_state(STATE_INDQ | STATE_INARG); continue; } break; case '|': case '<': case '>': if (!in_quotes) { add_ret(RUNCMD_HAS_REDIR); } break; case '&': case ';': if (!in_quotes) { set_state(STATE_SPECIAL); add_ret(RUNCMD_HAS_JOBCONTROL); } break; case '`': if (!have_state(STATE_INSQ) && !have_state(STATE_BSLASH)) { add_ret(RUNCMD_HAS_SUBCOMMAND); } break; case '(': case ')': if (!in_quotes) { add_ret(RUNCMD_HAS_PAREN); } break; case '$': if (!have_state(STATE_INSQ) && !have_state(STATE_BSLASH)) { if (p[1] == '(') add_ret(RUNCMD_HAS_SUBCOMMAND); else add_ret(RUNCMD_HAS_SHVAR); } break; case '*': case '?': if (!in_quotes) { add_ret(RUNCMD_HAS_WILDCARD); } break; default: break; } /* here, we're limited to escaped backslashes, so remove STATE_BSLASH */ del_state(STATE_BSLASH); if (is_state(STATE_NONE)) { set_state(STATE_INARG); out_argv[arg++] = &argz[a]; } /* by default we simply copy the byte */ argz[a++] = str[i]; } /* make sure we nul-terminate the last argument */ argz[a++] = 0; if (have_state(STATE_INSQ)) add_ret(RUNCMD_HAS_UBSQ); if (have_state(STATE_INDQ)) add_ret(RUNCMD_HAS_UBDQ); out_argv[arg] = NULL; *out_argc = arg; return ret; } /* This function is NOT async-safe. It is exported so multithreaded * plugins (or other apps) can call it prior to running any commands * through this API and thus achieve async-safeness throughout the API. */ void runcmd_init(void) { #if defined(RLIMIT_NOFILE) if (!maxfd) { struct rlimit rlim; getrlimit(RLIMIT_NOFILE, &rlim); maxfd = rlim.rlim_cur; } #elif !defined(OPEN_MAX) && !defined(IOV_MAX) && defined(_SC_OPEN_MAX) if(!maxfd) { if((maxfd = sysconf(_SC_OPEN_MAX)) < 0) { /* possibly log or emit a warning here, since there's no * guarantee that our guess at maxfd will be adequate */ maxfd = 256; } } #endif if (!pids) pids = calloc(maxfd, sizeof(pid_t)); } static int runcmd_setenv(const char *name, const char *value); int update_environment(char *name, char *value, int set); /* Start running a command */ int runcmd_open(const char *cmd, int *pfd, int *pfderr, char **env, void (*iobreg)(int, int, void *), void *iobregarg) { char **argv = NULL; int argc = 0; int cmd2strv_errors; size_t cmdlen; pid_t pid; int i = 0; if(!pids) runcmd_init(); /* We can't do anything without a command, or FD arrays. */ if (!cmd || !*cmd || !pfd || !pfderr) return RUNCMD_EINVAL; cmdlen = strlen(cmd); argv = calloc((cmdlen / 2) + 5, sizeof(char *)); if (!argv) return RUNCMD_EALLOC; cmd2strv_errors = runcmd_cmd2strv(cmd, &argc, argv); if (cmd2strv_errors == RUNCMD_EALLOC) { /* We couldn't allocate the parsed argument array. */ free(argv); return RUNCMD_EALLOC; } if (cmd2strv_errors) { /* Run complex commands via the shell. */ free(argv[0]); argv[0] = "/bin/sh"; argv[1] = "-c"; argv[2] = strdup(cmd); if (!argv[2]) { free(argv); return RUNCMD_EALLOC; } argv[3] = NULL; } if (pipe(pfd) < 0) { free(!cmd2strv_errors ? argv[0] : argv[2]); free(argv); return RUNCMD_EFD; } if (pipe(pfderr) < 0) { free(!cmd2strv_errors ? argv[0] : argv[2]); free(argv); close(pfd[0]); close(pfd[1]); return RUNCMD_EFD; } if (iobreg) iobreg(pfd[0], pfderr[0], iobregarg); pid = fork(); if (pid < 0) { free(!cmd2strv_errors ? argv[0] : argv[2]); free(argv); close(pfd[0]); close(pfd[1]); close(pfderr[0]); close(pfderr[1]); return RUNCMD_EFORK; /* errno set by the failing function */ } /* Child runs excevp() and _exit(). */ if (pid == 0) { int exit_status = EXIT_SUCCESS; /* To preserve errno when _exit()ing. */ /* Make our children their own process group leaders so they are killable * by their parent (word of the day: filicide / prolicide). */ if (setpgid(getpid(), getpid()) == -1) { exit_status = errno; fprintf(stderr, "setpgid(...) errno %d: %s\n", errno, strerror(errno)); goto child_error_exit; } close (pfd[0]); if (pfd[1] != STDOUT_FILENO) { if (dup2(pfd[1], STDOUT_FILENO) == -1) { exit_status = errno; fprintf(stderr, "dup2(pfd[1], STDOUT_FILENO) errno %d: %s\n", errno, strerror(errno)); goto child_error_exit; } close(pfd[1]); } close (pfderr[0]); if (pfderr[1] != STDERR_FILENO) { if (dup2(pfderr[1], STDERR_FILENO) == -1) { exit_status = errno; fprintf(stderr, "dup2(pfderr[1], STDERR_FILENO) errno %d: %s\n", errno, strerror(errno)); goto child_error_exit; } close(pfderr[1]); } /* Close all descriptors in pids[], the child shouldn't see these. */ for (i = 0; i < maxfd; i++) { if (pids[i] > 0) close(i); } /* Export the environment. */ if (env) { for (; env[0] && env[1]; env += 2) { if (runcmd_setenv(env[0], env[1]) == -1) { exit_status = errno; fprintf(stderr, "runcmd_setenv(%s, ...) errno %d: %s\n", env[0], errno, strerror(errno) ); goto child_error_exit; } } } /* Add VAR=value arguments from simple commands to the environment. */ i = 0; if (!cmd2strv_errors) { char *ev; for (; i < argc && (ev = strchr(argv[i], '=')); ++i) { if (*ev) *ev++ = '\0'; if (runcmd_setenv(argv[i], ev) == -1) { exit_status = errno; fprintf(stderr, "runcmd_setenv(%s, ev) errno %d: %s\n", argv[i], errno, strerror(errno) ); goto child_error_exit; } } if (i == argc) { exit_status = EXIT_FAILURE; fprintf(stderr, "No command after variables.\n"); goto child_error_exit; } } execvp(argv[i], argv + i); exit_status = errno; fprintf(stderr, "execvp(%s, ...) failed. errno is %d: %s\n", argv[i], errno, strerror(errno)); child_error_exit: /* Free argv memory before exiting so valgrind doesn't see it as a leak. */ free(!cmd2strv_errors ? argv[0] : argv[2]); free(argv); _exit(exit_status); } /* parent picks up execution here */ /* * close childs file descriptors in our address space and * release the memory we used that won't get passed to the * caller. */ close(pfd[1]); close(pfderr[1]); free(!cmd2strv_errors ? argv[0] : argv[2]); free(argv); /* tag our file's entry in the pid-list and return it */ pids[pfd[0]] = pid; return pfd[0]; } int runcmd_close(int fd) { int status; pid_t pid; /* make sure this fd was opened by runcmd_open() */ if(fd < 0 || fd > maxfd || !pids || (pid = pids[fd]) == 0) return RUNCMD_EINVAL; pids[fd] = 0; if (close(fd) == -1) return -1; /* EINTR is ok (sort of), everything else is bad */ while (waitpid(pid, &status, 0) < 0) if (errno != EINTR) return RUNCMD_EWAIT; /* return child's termination status */ return (WIFEXITED(status)) ? WEXITSTATUS(status) : -1; } int runcmd_try_close(int fd, int *status, int sig) { pid_t pid; int result; /* make sure this fd was opened by popen() */ if(fd < 0 || fd > maxfd || !pids || !pids[fd]) return RUNCMD_EINVAL; pid = pids[fd]; while((result = waitpid(pid, status, WNOHANG)) != pid) { if(!result) return 0; if(result == -1) { switch(errno) { case EINTR: continue; case EINVAL: return -1; case ECHILD: if(sig) { result = kill(pid, sig); sig = 0; continue; } else return -1; } /* switch */ } } pids[fd] = 0; close(fd); return result; } /** * Sets an environment variable. * This is for runcmd_open() to set the child environment. * @param naem Variable name to set. * @param value Value to set. * @return 0 on success, -1 on error with errno set to: EINVAL if name is NULL; * or the value set by setenv() or asprintf()/putenv(). * @note If setenv() is unavailable (e.g. Solaris), a "name=vale" string is * allocated to pass to putenv(), which is retained by the environment. This * 'leaked' memory will be on the heap at program exit. */ static int runcmd_setenv(const char *name, const char *value) { #ifndef HAVE_SETENV char *env_string = NULL; #endif /* We won't mess with null variable names or values. */ if (!name || !value) { errno = EINVAL; return -1; } errno = 0; #ifdef HAVE_SETENV return setenv(name, value, 1); #else /* For Solaris and systems that don't have setenv(). * This will leak memory, but in a "controlled" way, since the memory * should be freed when the child process exits. */ if (asprintf(&env_string, "%s=%s", name, value) == -1) return -1; if (!env_string) { errno = ENOMEM; return -1; } return putenv(env_string); #endif } /* sets or unsets an environment variable */ int update_environment(char *name, char *value, int set) { #ifndef HAVE_SETENV char *env_string = NULL; #endif /* we won't mess with null variable names */ if(name == NULL) return -1; /* set the environment variable */ if(set == 1) { #ifdef HAVE_SETENV setenv(name, (value == NULL) ? "" : value, 1); #else /* needed for Solaris and systems that don't have setenv() */ /* this will leak memory, but in a "controlled" way, since lost memory should be freed when the child process exits */ asprintf(&env_string, "%s=%s", name, (value == NULL) ? "" : value); if(env_string) putenv(env_string); #endif } /* clear the variable */ else { #ifdef HAVE_UNSETENV unsetenv(name); #endif } return 0; } /** * This will free pids if non-null * Useful for external applications that rely on libnagios to * keep a lid on potential memory leaks */ void runcmd_free_pids(void) { if (pids) free(pids); } nagios-4.3.4/lib/runcmd.h000066400000000000000000000110611314764422400152170ustar00rootroot00000000000000#ifndef NDO_LIBNAGIOS_RUNCMD_H_INCLUDED #define NDO_LIBNAGIOS_RUNCMD_H_INCLUDED #include /** * @file runcmd.h * @brief runcmd library function declarations * * A simple interface to executing programs from other programs, using an * optimized and safer popen()-like implementation. It is considered safer in * that no shell needs to be spawned for simple commands, and the environment * passed to the execve()'d program is essentially empty. * * This code is based on popen.c, which in turn was taken from * "Advanced Programming in the UNIX Environment" by W. Richard Stevens. * * Care has been taken to make sure the functions are async-safe. The exception * is runcmd_init() which multithreaded applications or plugins must call in a * non-reentrant manner before calling any other runcmd function. * * @note This is inherited from the nagiosplugins project, although * it might need refactoring for performance later. * @{ */ /** Return code bitflags for runcmd_cmd2strv() */ #define RUNCMD_HAS_REDIR (1 << 0) /**< I/O redirection */ #define RUNCMD_HAS_SUBCOMMAND (1 << 1) /**< subcommands present */ #define RUNCMD_HAS_PAREN (1 << 2) /**< parentheses present in command */ #define RUNCMD_HAS_JOBCONTROL (1 << 3) /**< job control stuff present */ #define RUNCMD_HAS_UBSQ (1 << 4) /**< unbalanced single quotes */ #define RUNCMD_HAS_UBDQ (1 << 5) /**< unbalanced double quotes */ #define RUNCMD_HAS_WILDCARD (1 << 6) /**< wildcards present */ #define RUNCMD_HAS_SHVAR (1 << 7) /**< shell variables present */ #define RUNCMD_EFD (-1) /**< Failed to pipe() or open() */ #define RUNCMD_EALLOC (-2) /**< Failed to alloc */ #define RUNCMD_ECMD (-3) /**< Bad command */ #define RUNCMD_EFORK (-4) /**< Failed to fork() */ #define RUNCMD_EINVAL (-5) /**< Invalid parameters */ #define RUNCMD_EWAIT (-6) /**< Failed to wait() */ /** * Initialize the runcmd library. * * Only multi-threaded programs that might launch the first external * program from multiple threads simultaneously need to bother with * this, and they must ensure this is called at least once in a non-reentrant * manner before calling any other runcmd function. */ extern void runcmd_init(void); /** * Return pid of a command with a specific file descriptor * @param[in] fd stdout filedescriptor of the child to get pid from * @return pid of the child, or 0 on errors */ extern pid_t runcmd_pid(int fd); /** * Return explanation of which system call or operation failed * @param code Error code returned by a library function * @return A non-free()'able string explaining where the error occurred */ extern const char *runcmd_strerror(int code); /** * Start a command from a command string * @param[in] cmd The command to launch * @param[out] pfd Child's stdout filedescriptor * @param[out] pfderr Child's stderr filedescriptor * @param[in] env Currently ignored for portability * @param[in] iobreg The callback function to register the iobrokers for the read ends of the pipe * @param[in] iobregarg The "arg" value to pass to iobroker_register() */ extern int runcmd_open(const char *cmd, int *pfd, int *pfderr, char **env, void (*iobreg)(int, int, void *), void *iobregarg) __attribute__((__nonnull__(1, 2, 3, 5, 6))); /** * Close a command and return its exit status * @note Don't use this. It's a retarded way to reap children suitable * only for launching a one-shot program. * * @param[in] fd The child's stdout filedescriptor * @return exit-status of the child, or -1 in case of errors */ extern int runcmd_close(int fd); /** * Convert a string to a vector of arguments like a shell would * @note This might have bugs and is only tested to behave similar * to how /bin/sh does things. For csh or other non bash-ish shells * there are no guarantees. * @note The out_argv array has to be large enough to hold all strings * found in the command. * @param[in] str The string to convert to an argument vector * @param[out] out_argc The number of arguments found * @param[out] out_argv The argument vector * @return 0 on (great) success, or a bitmask of failure-codes * representing f.e. unclosed quotes, job control or output redirection. * See the RUNCMD_HAS_* and their ilk to find out about the flag. */ extern int runcmd_cmd2strv(const char *str, int *out_argc, char **out_argv); /** * If you're using libnagios to execute a remote command, the * static pid_t pids is not freed after runcmd_open * You can call this function when you're sure pids is no longer * in use, to keep down memory leaks */ extern void runcmd_free_pids(void); /** @} */ /* INCLUDE_runcmd_h__ */ #endif nagios-4.3.4/lib/skiplist.c000066400000000000000000000315521314764422400155730ustar00rootroot00000000000000/************************************************************************ * * SKIPLIST.C - Skiplist functions for use in Nagios event/object lists * * * Notes: * * These function implement a slightly modified skiplist from that * described by William Pugh (ftp://ftp.cs.umd.edu/pub/skipLists/skiplists.pdf). * The structures and function were modified to allow the list to act * like a priority queue for the Nagios event list/queue(s). Multiple nodes with * the same key value are allowed on the list to accomodate multiple events * occurring at the same (second) point in time. Implemented peek() and pop() * functions to allow for quick event queue processing, and a method to delete * a specific list item, based on its pointer, rather than its data value. Again, * this is useful for the Nagios event queue. * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ************************************************************************/ #include #include #include "skiplist.h" typedef struct skiplistnode_struct { void *data; struct skiplistnode_struct *forward[1]; /* this must be the last element of the struct, as we allocate # of elements during runtime*/ } skiplistnode; struct skiplist_struct { int current_level; int max_levels; float level_probability; unsigned long items; int allow_duplicates; int append_duplicates; int (*compare_function)(void *, void *); skiplistnode *head; }; unsigned long skiplist_num_items(skiplist *list) { return list ? list->items : 0; } static skiplistnode *skiplist_new_node(skiplist *list, int node_levels) { skiplistnode *newnode = NULL; register int x = 0; if(list == NULL) return NULL; if(node_levels < 0 || node_levels > list->max_levels) return NULL; /* allocate memory for node + variable number of level pointers */ if((newnode = (skiplistnode *)malloc(sizeof(skiplistnode) + (node_levels * sizeof(skiplistnode *))))) { /* initialize forward pointers */ for(x = 0; x < node_levels; x++) newnode->forward[x] = NULL; /* initialize data pointer */ newnode->data = NULL; } return newnode; } skiplist *skiplist_new(int max_levels, float level_probability, int allow_duplicates, int append_duplicates, int (*compare_function)(void *, void *)) { skiplist *newlist = NULL; /* alloc memory for new list structure */ if((newlist = (skiplist *)malloc(sizeof(skiplist)))) { /* initialize levels, etc. */ newlist->current_level = 0; newlist->max_levels = max_levels; newlist->level_probability = level_probability; newlist->allow_duplicates = allow_duplicates; newlist->append_duplicates = append_duplicates; newlist->items = 0; newlist->compare_function = compare_function; /* initialize head node */ newlist->head = skiplist_new_node(newlist, max_levels); } return newlist; } static int skiplist_random_level(skiplist *list) { int level = 0; float r = 0.0; if(list == NULL) return -1; for(level = 0; level < list->max_levels; level++) { r = ((float)rand() / (float)RAND_MAX); if(r > list->level_probability) break; } return (level >= list->max_levels) ? list->max_levels - 1 : level; } int skiplist_insert(skiplist *list, void *data) { skiplistnode **update = NULL; skiplistnode *thisnode = NULL; skiplistnode *nextnode = NULL; skiplistnode *newnode = NULL; int level = 0; int x = 0; if(list == NULL || data == NULL) { return SKIPLIST_ERROR_ARGS; } /* check to make sure we don't have duplicates */ /* NOTE: this could made be more efficient */ if(list->allow_duplicates == FALSE) { if(skiplist_find_first(list, data, NULL)) return SKIPLIST_ERROR_DUPLICATE; } /* initialize update vector */ if((update = (skiplistnode **)malloc(sizeof(skiplistnode *) * list->max_levels)) == NULL) { return SKIPLIST_ERROR_MEMORY; } for(x = 0; x < list->max_levels; x++) update[x] = NULL; /* find proper position for insert, remember pointers with an update vector */ thisnode = list->head; for(level = list->current_level; level >= 0; level--) { while((nextnode = thisnode->forward[level])) { if(list->append_duplicates == TRUE) { if(list->compare_function(nextnode->data, data) > 0) break; } else { if(list->compare_function(nextnode->data, data) >= 0) break; } thisnode = nextnode; } update[level] = thisnode; } /* get a random level the new node should be inserted at */ level = skiplist_random_level(list); /* we're adding a new level... */ if(level > list->current_level) { /*printf("NEW LEVEL!\n");*/ list->current_level++; level = list->current_level; update[level] = list->head; } /* create a new node */ if((newnode = skiplist_new_node(list, level)) == NULL) { /*printf("NODE ERROR\n");*/ free(update); return SKIPLIST_ERROR_MEMORY; } newnode->data = data; /* update pointers to insert node at proper location */ do { thisnode = update[level]; newnode->forward[level] = thisnode->forward[level]; thisnode->forward[level] = newnode; } while(--level >= 0); /* update counters */ list->items++; /* free memory */ free(update); return SKIPLIST_OK; } int skiplist_empty(skiplist *list) { skiplistnode *this = NULL; skiplistnode *next = NULL; int level = 0; if(list == NULL) return ERROR; /* free all list nodes (but not header) */ for(this = list->head->forward[0]; this != NULL; this = next) { next = this->forward[0]; free(this); } /* reset level pointers */ for(level = list->current_level; level >= 0; level--) list->head->forward[level] = NULL; /* reset list level */ list->current_level = 0; /* reset items */ list->items = 0; return OK; } int skiplist_free(skiplist **list) { skiplistnode *this = NULL; skiplistnode *next = NULL; if(list == NULL) return ERROR; if(*list == NULL) return OK; /* free header and all list nodes */ for(this = (*list)->head; this != NULL; this = next) { next = this->forward[0]; free(this); } /* free list structure */ free(*list); *list = NULL; return OK; } /* get first item in list */ void *skiplist_peek(skiplist *list) { if(list == NULL) return NULL; /* return first item */ return list->head->forward[0]->data; } /* get/remove first item in list */ void *skiplist_pop(skiplist *list) { skiplistnode *thisnode = NULL; void *data = NULL; int level = 0; if(list == NULL) return NULL; /* get first item */ thisnode = list->head->forward[0]; if(thisnode == NULL) return NULL; /* get data for first item */ data = thisnode->data; /* remove first item from queue - update forward links from head to first node */ for(level = 0; level <= list->current_level; level++) { if(list->head->forward[level] == thisnode) list->head->forward[level] = thisnode->forward[level]; } /* free deleted node */ free(thisnode); /* adjust items */ list->items--; return data; } /* get first item in list */ void *skiplist_get_first(skiplist *list, void **node_ptr) { skiplistnode *thisnode = NULL; if(list == NULL) return NULL; /* get first node */ thisnode = list->head->forward[0]; /* return pointer to node */ if(node_ptr) *node_ptr = (void *)thisnode; if(thisnode) return thisnode->data; else return NULL; } /* get next item in list */ void *skiplist_get_next(void **node_ptr) { skiplistnode *thisnode = NULL; skiplistnode *nextnode = NULL; if(node_ptr == NULL || *node_ptr == NULL) return NULL; thisnode = (skiplistnode *)(*node_ptr); nextnode = thisnode->forward[0]; *node_ptr = (void *)nextnode; if(nextnode) return nextnode->data; else return NULL; } /* first first item in list */ void *skiplist_find_first(skiplist *list, void *data, void **node_ptr) { skiplistnode *thisnode = NULL; skiplistnode *nextnode = NULL; int level = 0; if(list == NULL || data == NULL) return NULL; thisnode = list->head; for(level = list->current_level; level >= 0; level--) { while((nextnode = thisnode->forward[level])) { if(list->compare_function(nextnode->data, data) >= 0) break; thisnode = nextnode; } } /* we found it! */ if(nextnode && list->compare_function(nextnode->data, data) == 0) { if(node_ptr) *node_ptr = (void *)nextnode; return nextnode->data; } else { if(node_ptr) *node_ptr = NULL; } return NULL; } /* find next match */ void *skiplist_find_next(skiplist *list, void *data, void **node_ptr) { skiplistnode *thisnode = NULL; skiplistnode *nextnode = NULL; if(list == NULL || data == NULL || node_ptr == NULL) return NULL; if(*node_ptr == NULL) return NULL; thisnode = (skiplistnode *)(*node_ptr); nextnode = thisnode->forward[0]; if(nextnode) { if(list->compare_function(nextnode->data, data) == 0) { *node_ptr = (void *)nextnode; return nextnode->data; } } *node_ptr = NULL; return NULL; } /* delete first matching item from list */ int skiplist_delete_first(skiplist *list, void *data) { skiplistnode **update = NULL; skiplistnode *thisnode = NULL; skiplistnode *nextnode = NULL; int level = 0; int top_level = 0; int deleted = FALSE; int x = 0; if(list == NULL || data == NULL) return ERROR; /* initialize update vector */ if((update = (skiplistnode **)malloc(sizeof(skiplistnode *) * list->max_levels)) == NULL) return ERROR; for(x = 0; x < list->max_levels; x++) update[x] = NULL; /* find location in list */ thisnode = list->head; for(top_level = level = list->current_level; level >= 0; level--) { while((nextnode = thisnode->forward[level])) { if(list->compare_function(nextnode->data, data) >= 0) break; thisnode = nextnode; } update[level] = thisnode; } /* we found a match! */ if(list->compare_function(nextnode->data, data) == 0) { /* adjust level pointers to bypass (soon to be) removed node */ for(level = 0; level <= top_level; level++) { thisnode = update[level]; if(thisnode->forward[level] != nextnode) break; thisnode->forward[level] = nextnode->forward[level]; } /* free node memory */ free(nextnode); /* adjust top/current level of list is necessary */ while(list->head->forward[top_level] == NULL && top_level > 0) top_level--; list->current_level = top_level; /* adjust items */ list->items--; deleted = TRUE; } /* free memory */ free(update); return deleted; } /* delete all matching items from list */ int skiplist_delete(skiplist *list, void *data) { int deleted = 0; int total_deleted = 0; /* NOTE: there is a more efficient way to do this... */ while((deleted = skiplist_delete_first(list, data)) == 1) total_deleted++; return total_deleted; } /* delete specific node from list */ int skiplist_delete_node(skiplist *list, void *node_ptr) { void *data = NULL; skiplistnode **update = NULL; skiplistnode *thenode = NULL; skiplistnode *thisnode = NULL; skiplistnode *nextnode = NULL; int level = 0; int top_level = 0; int deleted = FALSE; int x = 0; if(list == NULL || node_ptr == NULL) return ERROR; /* we'll need the data from the node to first find the node */ thenode = (skiplistnode *)node_ptr; data = thenode->data; /* initialize update vector */ if((update = (skiplistnode **)malloc(sizeof(skiplistnode *) * list->max_levels)) == NULL) return ERROR; for(x = 0; x < list->max_levels; x++) update[x] = NULL; /* find location in list */ thisnode = list->head; for(top_level = level = list->current_level; level >= 0; level--) { while((nextnode = thisnode->forward[level])) { /* next node would be too far */ if(list->compare_function(nextnode->data, data) > 0) break; /* this is the exact node we want */ if(list->compare_function(nextnode->data, data) == 0 && nextnode == thenode) break; thisnode = nextnode; } update[level] = thisnode; } /* we found a match! (value + pointers match) */ if(nextnode && list->compare_function(nextnode->data, data) == 0 && nextnode == thenode) { /* adjust level pointers to bypass (soon to be) removed node */ for(level = 0; level <= top_level; level++) { thisnode = update[level]; if(thisnode->forward[level] != nextnode) break; thisnode->forward[level] = nextnode->forward[level]; } /* free node memory */ free(nextnode); /* adjust top/current level of list is necessary */ while(list->head->forward[top_level] == NULL && top_level > 0) top_level--; list->current_level = top_level; /* adjust items */ list->items--; deleted = TRUE; } /* free memory */ free(update); return deleted; } nagios-4.3.4/lib/skiplist.h000066400000000000000000000120151314764422400155710ustar00rootroot00000000000000/************************************************************************ * * SKIPLIST.H - Skiplist data structures and functions * * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ************************************************************************/ #ifndef LIBNAGIOS_SKIPLIST_H_INCLUDED #define LIBNAGIOS_SKIPLIST_H_INCLUDED #include "lnag-utils.h" /** * @file skiplist.h * @brief Skiplist library functions * * http://en.wikipedia.org/wiki/Skiplist * * @{ */ #define SKIPLIST_OK 0 /**< A ok */ #define SKIPLIST_ERROR_ARGS 1 /**< Bad arguments */ #define SKIPLIST_ERROR_MEMORY 2 /**< Memory error */ #define SKIPLIST_ERROR_DUPLICATE 3 /**< Trying to insert non-unique item */ NAGIOS_BEGIN_DECL struct skiplist_struct; typedef struct skiplist_struct skiplist; /** * Return number of items currently in the skiplist * @param list The list to investigate * @return number of items in list */ unsigned long skiplist_num_items(skiplist *list); /** * Create a new skiplist * @param max_levels Number of "ups" we have. * This Should be kept close to lg2 of the number of items to store. * @param level_probability Ignored * @param allow_duplicates Allow duplicates in this list * @param append_duplicates Append rather than prepend duplicates * @param compare_function Comparison function for data entries * @return pointer to a new skiplist on success, NULL on errors */ skiplist *skiplist_new(int max_levels, float level_probability, int allow_duplicates, int append_duplicates, int (*compare_function)(void *, void *)); /** * Insert an item into a skiplist * @param list The list to insert to * @param data The data to insert * @return SKIPLIST_OK on success, or an error code */ int skiplist_insert(skiplist *list, void *data); /** * Empty the skiplist of all data * @param list The list to empty * @return ERROR on failures. OK on success */ int skiplist_empty(skiplist *list); /** * Free all nodes (but not all data) in a skiplist * This is similar to skiplist_empty(), but also free()'s the head node * @param list The list to free * @return OK on success, ERROR on failures */ int skiplist_free(skiplist **list); /** * Get the first item in the skiplist * @param list The list to peek into * @return The first item, or NULL if there is none */ void *skiplist_peek(skiplist *list); /** * Pop the first item from the skiplist * @param list The list to pop from */ void *skiplist_pop(skiplist *list); /** * Get first node of skiplist * @param list The list to search * @param[out] node_ptr State variable for skiplist_get_next() * @return The data-item of the first node on success, NULL on errors */ void *skiplist_get_first(skiplist *list, void **node_ptr); /** * Get next item from node_ptr * @param[out] node_ptr State variable primed from an earlier call to * skiplist_get_first() or skiplist_get_next() * @return The next data-item matching node_ptr on success, NULL on errors */ void *skiplist_get_next(void **node_ptr); /** * Find first entry in skiplist matching data * @param list The list to search * @param data Comparison object used to search * @param[out] node_ptr State variable for future lookups with * skiplist_find_next() * @return The first found data-item, of NULL if none could be found */ void *skiplist_find_first(skiplist *list, void *data, void **node_ptr); /** * Find next entry in skiplist matching data * @param list The list to search * @param data The data to compare against * @param[out] node_ptr State var primed from earlier call to * skiplist_find_next() or skiplist_find_first() * @return The next found data-item, or NULL if none could be found */ void *skiplist_find_next(skiplist *list, void *data, void **node_ptr); /** * Delete all items matching 'data' from skiplist * @param list The list to delete from * @param data Comparison object used to find the real node * @return OK on success, ERROR on errors */ int skiplist_delete(skiplist *list, void *data); /** * Delete first item matching 'data' from skiplist * @param list The list to delete from * @param data Comparison object used to search the list * @return OK on success, ERROR on errors. */ int skiplist_delete_first(skiplist *list, void *data); /** * Delete a particular node from the skiplist * @param list The list to search * @param node_ptr The node to delete * @return OK on success, ERROR on errors. */ int skiplist_delete_node(skiplist *list, void *node_ptr); NAGIOS_END_DECL /* @} */ #endif nagios-4.3.4/lib/snprintf.c000066400000000000000000001043461314764422400155760ustar00rootroot00000000000000/* * NOTE: If you change this file, please merge it into rsync, samba, etc. */ /* * Copyright Patrick Powell 1995 * This code is based on code written by Patrick Powell (papowell@astart.com) * It may be used for any purpose as long as this notice remains intact * on all source code distributions */ /************************************************************** * Original: * Patrick Powell Tue Apr 11 09:48:21 PDT 1995 * A bombproof version of doprnt (dopr) included. * Sigh. This sort of thing is always nasty do deal with. Note that * the version here does not include floating point... * * snprintf() is used instead of sprintf() as it does limit checks * for string length. This covers a nasty loophole. * * The other functions are there to prevent NULL pointers from * causing nast effects. * * More Recently: * Brandon Long 9/15/96 for mutt 0.43 * This was ugly. It is still ugly. I opted out of floating point * numbers, but the formatter understands just about everything * from the normal C string format, at least as far as I can tell from * the Solaris 2.5 printf(3S) man page. * * Brandon Long 10/22/97 for mutt 0.87.1 * Ok, added some minimal floating point support, which means this * probably requires libm on most operating systems. Don't yet * support the exponent (e,E) and sigfig (g,G). Also, fmtint() * was pretty badly broken, it just wasn't being exercised in ways * which showed it, so that's been fixed. Also, formated the code * to mutt conventions, and removed dead code left over from the * original. Also, there is now a builtin-test, just compile with: * gcc -DTEST_SNPRINTF -o snprintf snprintf.c -lm * and run snprintf for results. * * Thomas Roessler 01/27/98 for mutt 0.89i * The PGP code was using unsigned hexadecimal formats. * Unfortunately, unsigned formats simply didn't work. * * Michael Elkins 03/05/98 for mutt 0.90.8 * The original code assumed that both snprintf() and vsnprintf() were * missing. Some systems only have snprintf() but not vsnprintf(), so * the code is now broken down under HAVE_SNPRINTF and HAVE_VSNPRINTF. * * Andrew Tridgell (tridge@samba.org) Oct 1998 * fixed handling of %.0f * added test for HAVE_LONG_DOUBLE * * tridge@samba.org, idra@samba.org, April 2001 * got rid of fcvt code (twas buggy and made testing harder) * added C99 semantics * * date: 2002/12/19 19:56:31; author: herb; state: Exp; lines: +2 -0 * actually print args for %g and %e * * date: 2002/06/03 13:37:52; author: jmcd; state: Exp; lines: +8 -0 * Since includes.h isn't included here, VA_COPY has to be defined here. I don't * see any include file that is guaranteed to be here, so I'm defining it * locally. Fixes AIX and Solaris builds. * * date: 2002/06/03 03:07:24; author: tridge; state: Exp; lines: +5 -13 * put the ifdef for HAVE_VA_COPY in one place rather than in lots of * functions * * date: 2002/05/17 14:51:22; author: jmcd; state: Exp; lines: +21 -4 * Fix usage of va_list passed as an arg. Use __va_copy before using it * when it exists. * * date: 2002/04/16 22:38:04; author: idra; state: Exp; lines: +20 -14 * Fix incorrect zpadlen handling in fmtfp. * Thanks to Ollie Oldham for spotting it. * few mods to make it easier to compile the tests. * added the "Ollie" test to the floating point ones. * * Martin Pool (mbp@samba.org) April 2003 * Remove NO_CONFIG_H so that the test case can be built within a source * tree with less trouble. * Remove unnecessary SAFE_FREE() definition. * * Martin Pool (mbp@samba.org) May 2003 * Put in a prototype for dummy_snprintf() to quiet compiler warnings. * * Move #endif to make sure VA_COPY, LDOUBLE, etc are defined even * if the C library has some snprintf functions already. * * Darren Tucker (dtucker@zip.com.au) 2005 * Fix bug allowing read overruns of the source string with "%.*s" * Usually harmless unless the read runs outside the process' allocation * (eg if your malloc does guard pages) in which case it will segfault. * From OpenSSH. Also added test for same. * * Simo Sorce (idra@samba.org) Jan 2006 * * Add support for position independent parameters * fix fmtstr now it conforms to sprintf wrt min.max * **************************************************************/ #ifndef NO_CONFIG_H /* 02/28/2006 EG changed path to config.h to match Nagios distro */ #include "../include/config.h" #else #define NULL 0 #endif #ifdef TEST_SNPRINTF /* need math library headers for testing */ /* In test mode, we pretend that this system doesn't have any snprintf * functions, regardless of what config.h says. */ # undef HAVE_SNPRINTF # undef HAVE_VSNPRINTF # undef HAVE_C99_VSNPRINTF # undef HAVE_ASPRINTF # undef HAVE_VASPRINTF # include #endif /* TEST_SNPRINTF */ #ifdef HAVE_STRING_H #include #endif #ifdef HAVE_STRINGS_H #include #endif #ifdef HAVE_CTYPE_H #include #endif #include #include #ifdef HAVE_STDLIB_H #include #endif #if defined(HAVE_SNPRINTF) && defined(HAVE_VSNPRINTF) && defined(HAVE_C99_VSNPRINTF) /* only include stdio.h if we are not re-defining snprintf or vsnprintf */ #include /* make the compiler happy with an empty file */ void dummy_snprintf(void); void dummy_snprintf(void) {} #endif /* HAVE_SNPRINTF, etc */ #ifdef HAVE_LONG_DOUBLE #define LDOUBLE long double #else #define LDOUBLE double #endif #ifdef HAVE_LONG_LONG #define LLONG long long #else #define LLONG long #endif #ifndef VA_COPY #ifdef HAVE_VA_COPY #define VA_COPY(dest, src) va_copy(dest, src) #else #ifdef HAVE___VA_COPY #define VA_COPY(dest, src) __va_copy(dest, src) #else #define VA_COPY(dest, src) (dest) = (src) #endif #endif /* * dopr(): poor man's version of doprintf */ /* format read states */ #define DP_S_DEFAULT 0 #define DP_S_FLAGS 1 #define DP_S_MIN 2 #define DP_S_DOT 3 #define DP_S_MAX 4 #define DP_S_MOD 5 #define DP_S_CONV 6 #define DP_S_DONE 7 /* format flags - Bits */ #define DP_F_MINUS (1 << 0) #define DP_F_PLUS (1 << 1) #define DP_F_SPACE (1 << 2) #define DP_F_NUM (1 << 3) #define DP_F_ZERO (1 << 4) #define DP_F_UP (1 << 5) #define DP_F_UNSIGNED (1 << 6) /* Conversion Flags */ #define DP_C_CHAR 1 #define DP_C_SHORT 2 #define DP_C_LONG 3 #define DP_C_LDOUBLE 4 #define DP_C_LLONG 5 /* Chunk types */ #define CNK_FMT_STR 0 #define CNK_INT 1 #define CNK_OCTAL 2 #define CNK_UINT 3 #define CNK_HEX 4 #define CNK_FLOAT 5 #define CNK_CHAR 6 #define CNK_STRING 7 #define CNK_PTR 8 #define CNK_NUM 9 #define CNK_PRCNT 10 #define char_to_int(p) ((p)- '0') #ifndef MAX #define MAX(p,q) (((p) >= (q)) ? (p) : (q)) #endif /* yes this really must be a ||. Don't muck with this (tridge) */ #if !defined(HAVE_VSNPRINTF) || !defined(HAVE_C99_VSNPRINTF) struct pr_chunk { int type; /* chunk type */ int num; /* parameter number */ int min; int max; int flags; int cflags; int start; int len; LLONG value; LDOUBLE fvalue; char *strvalue; void *pnum; struct pr_chunk *min_star; struct pr_chunk *max_star; struct pr_chunk *next; }; struct pr_chunk_x { struct pr_chunk **chunks; int num; }; static size_t dopr(char *buffer, size_t maxlen, const char *format, va_list args_in); static void fmtstr(char *buffer, size_t *currlen, size_t maxlen, char *value, int flags, int min, int max); static void fmtint(char *buffer, size_t *currlen, size_t maxlen, long value, int base, int min, int max, int flags); static void fmtfp(char *buffer, size_t *currlen, size_t maxlen, LDOUBLE fvalue, int min, int max, int flags); static void dopr_outch(char *buffer, size_t *currlen, size_t maxlen, char c); static struct pr_chunk *new_chunk(void); static int add_cnk_list_entry(struct pr_chunk_x **list, int max_num, struct pr_chunk *chunk); static size_t dopr(char *buffer, size_t maxlen, const char *format, va_list args_in) { char ch; int state; int pflag; int pnum; int pfirst; size_t currlen; va_list args; const char *base; struct pr_chunk *chunks = NULL; struct pr_chunk *cnk = NULL; struct pr_chunk_x *clist = NULL; int max_pos; size_t ret = -1; VA_COPY(args, args_in); state = DP_S_DEFAULT; pfirst = 1; pflag = 0; pnum = 0; max_pos = 0; base = format; ch = *format++; /* retrieve the string structure as chunks */ while(state != DP_S_DONE) { if(ch == '\0') state = DP_S_DONE; switch(state) { case DP_S_DEFAULT: if(cnk) { cnk->next = new_chunk(); cnk = cnk->next; } else { cnk = new_chunk(); } if(!cnk) goto done; if(!chunks) chunks = cnk; if(ch == '%') { state = DP_S_FLAGS; ch = *format++; } else { cnk->type = CNK_FMT_STR; cnk->start = format - base - 1; while((ch != '\0') && (ch != '%')) ch = *format++; cnk->len = format - base - cnk->start - 1; } break; case DP_S_FLAGS: switch(ch) { case '-': cnk->flags |= DP_F_MINUS; ch = *format++; break; case '+': cnk->flags |= DP_F_PLUS; ch = *format++; break; case ' ': cnk->flags |= DP_F_SPACE; ch = *format++; break; case '#': cnk->flags |= DP_F_NUM; ch = *format++; break; case '0': cnk->flags |= DP_F_ZERO; ch = *format++; break; case 'I': /* internationalization not supported yet */ ch = *format++; break; default: state = DP_S_MIN; break; } break; case DP_S_MIN: if(isdigit((unsigned char)ch)) { cnk->min = 10 * cnk->min + char_to_int(ch); ch = *format++; } else if(ch == '$') { if(!pfirst && !pflag) { /* parameters must be all positioned or none */ goto done; } if(pfirst) { pfirst = 0; pflag = 1; } if(cnk->min == 0) /* what ?? */ goto done; cnk->num = cnk->min; cnk->min = 0; ch = *format++; } else if(ch == '*') { if(pfirst) pfirst = 0; cnk->min_star = new_chunk(); if(!cnk->min_star) /* out of memory :-( */ goto done; cnk->min_star->type = CNK_INT; if(pflag) { int num; ch = *format++; if(!isdigit((unsigned char)ch)) { /* parameters must be all positioned or none */ goto done; } for(num = 0; isdigit((unsigned char)ch); ch = *format++) { num = 10 * num + char_to_int(ch); } cnk->min_star->num = num; if(ch != '$') /* what ?? */ goto done; } else { cnk->min_star->num = ++pnum; } max_pos = add_cnk_list_entry(&clist, max_pos, cnk->min_star); if(max_pos == 0) /* out of memory :-( */ goto done; ch = *format++; state = DP_S_DOT; } else { if(pfirst) pfirst = 0; state = DP_S_DOT; } break; case DP_S_DOT: if(ch == '.') { state = DP_S_MAX; ch = *format++; } else { state = DP_S_MOD; } break; case DP_S_MAX: if(isdigit((unsigned char)ch)) { if(cnk->max < 0) cnk->max = 0; cnk->max = 10 * cnk->max + char_to_int(ch); ch = *format++; } else if(ch == '$') { if(!pfirst && !pflag) { /* parameters must be all positioned or none */ goto done; } if(cnk->max <= 0) /* what ?? */ goto done; cnk->num = cnk->max; cnk->max = -1; ch = *format++; } else if(ch == '*') { cnk->max_star = new_chunk(); if(!cnk->max_star) /* out of memory :-( */ goto done; cnk->max_star->type = CNK_INT; if(pflag) { int num; ch = *format++; if(!isdigit((unsigned char)ch)) { /* parameters must be all positioned or none */ goto done; } for(num = 0; isdigit((unsigned char)ch); ch = *format++) { num = 10 * num + char_to_int(ch); } cnk->max_star->num = num; if(ch != '$') /* what ?? */ goto done; } else { cnk->max_star->num = ++pnum; } max_pos = add_cnk_list_entry(&clist, max_pos, cnk->max_star); if(max_pos == 0) /* out of memory :-( */ goto done; ch = *format++; state = DP_S_MOD; } else { state = DP_S_MOD; } break; case DP_S_MOD: switch(ch) { case 'h': cnk->cflags = DP_C_SHORT; ch = *format++; if(ch == 'h') { cnk->cflags = DP_C_CHAR; ch = *format++; } break; case 'l': cnk->cflags = DP_C_LONG; ch = *format++; if(ch == 'l') { /* It's a long long */ cnk->cflags = DP_C_LLONG; ch = *format++; } break; case 'L': cnk->cflags = DP_C_LDOUBLE; ch = *format++; break; default: break; } state = DP_S_CONV; break; case DP_S_CONV: if(cnk->num == 0) cnk->num = ++pnum; max_pos = add_cnk_list_entry(&clist, max_pos, cnk); if(max_pos == 0) /* out of memory :-( */ goto done; switch(ch) { case 'd': case 'i': cnk->type = CNK_INT; break; case 'o': cnk->type = CNK_OCTAL; cnk->flags |= DP_F_UNSIGNED; break; case 'u': cnk->type = CNK_UINT; cnk->flags |= DP_F_UNSIGNED; break; case 'X': cnk->flags |= DP_F_UP; case 'x': cnk->type = CNK_HEX; cnk->flags |= DP_F_UNSIGNED; break; case 'A': /* hex float not supported yet */ case 'E': case 'G': case 'F': cnk->flags |= DP_F_UP; case 'a': /* hex float not supported yet */ case 'e': case 'f': case 'g': cnk->type = CNK_FLOAT; break; case 'c': cnk->type = CNK_CHAR; break; case 's': cnk->type = CNK_STRING; break; case 'p': cnk->type = CNK_PTR; break; case 'n': cnk->type = CNK_NUM; break; case '%': cnk->type = CNK_PRCNT; break; default: /* Unknown, bail out*/ goto done; } ch = *format++; state = DP_S_DEFAULT; break; case DP_S_DONE: break; default: /* hmm? */ break; /* some picky compilers need this */ } } /* retrieve the format arguments */ for(pnum = 0; pnum < max_pos; pnum++) { int i; if(clist[pnum].num == 0) { /* ignoring a parameter should not be permitted * all parameters must be matched at least once * BUT seem some system ignore this rule ... * at least my glibc based system does --SSS */ #ifdef DEBUG_SNPRINTF printf("parameter at position %d not used\n", pnum + 1); #endif /* eat the parameter */ va_arg(args, int); continue; } for(i = 1; i < clist[pnum].num; i++) { if(clist[pnum].chunks[0]->type != clist[pnum].chunks[i]->type) { /* nooo noo no! * all the references to a parameter * must be of the same type */ goto done; } } cnk = clist[pnum].chunks[0]; switch(cnk->type) { case CNK_INT: if(cnk->cflags == DP_C_SHORT) cnk->value = va_arg(args, int); else if(cnk->cflags == DP_C_LONG) cnk->value = va_arg(args, long int); else if(cnk->cflags == DP_C_LLONG) cnk->value = va_arg(args, LLONG); else cnk->value = va_arg(args, int); for(i = 1; i < clist[pnum].num; i++) { clist[pnum].chunks[i]->value = cnk->value; } break; case CNK_OCTAL: case CNK_UINT: case CNK_HEX: if(cnk->cflags == DP_C_SHORT) cnk->value = va_arg(args, unsigned int); else if(cnk->cflags == DP_C_LONG) cnk->value = (long)va_arg(args, unsigned long int); else if(cnk->cflags == DP_C_LLONG) cnk->value = (LLONG)va_arg(args, unsigned LLONG); else cnk->value = (long)va_arg(args, unsigned int); for(i = 1; i < clist[pnum].num; i++) { clist[pnum].chunks[i]->value = cnk->value; } break; case CNK_FLOAT: if(cnk->cflags == DP_C_LDOUBLE) cnk->fvalue = va_arg(args, LDOUBLE); else cnk->fvalue = va_arg(args, double); for(i = 1; i < clist[pnum].num; i++) { clist[pnum].chunks[i]->fvalue = cnk->fvalue; } break; case CNK_CHAR: cnk->value = va_arg(args, int); for(i = 1; i < clist[pnum].num; i++) { clist[pnum].chunks[i]->value = cnk->value; } break; case CNK_STRING: cnk->strvalue = va_arg(args, char *); if(!cnk->strvalue) cnk->strvalue = "(NULL)"; for(i = 1; i < clist[pnum].num; i++) { clist[pnum].chunks[i]->strvalue = cnk->strvalue; } break; case CNK_PTR: cnk->strvalue = va_arg(args, void *); for(i = 1; i < clist[pnum].num; i++) { clist[pnum].chunks[i]->strvalue = cnk->strvalue; } break; case CNK_NUM: if(cnk->cflags == DP_C_CHAR) cnk->pnum = va_arg(args, char *); else if(cnk->cflags == DP_C_SHORT) cnk->pnum = va_arg(args, short int *); else if(cnk->cflags == DP_C_LONG) cnk->pnum = va_arg(args, long int *); else if(cnk->cflags == DP_C_LLONG) cnk->pnum = va_arg(args, LLONG *); else cnk->pnum = va_arg(args, int *); for(i = 1; i < clist[pnum].num; i++) { clist[pnum].chunks[i]->pnum = cnk->pnum; } break; case CNK_PRCNT: break; default: /* what ?? */ goto done; } } /* print out the actual string from chunks */ currlen = 0; cnk = chunks; while(cnk) { int len, min, max; if(cnk->min_star) min = cnk->min_star->value; else min = cnk->min; if(cnk->max_star) max = cnk->max_star->value; else max = cnk->max; switch(cnk->type) { case CNK_FMT_STR: if(maxlen != 0 && maxlen > currlen) { if(maxlen > (currlen + cnk->len)) len = cnk->len; else len = maxlen - currlen; memcpy(&(buffer[currlen]), &(base[cnk->start]), len); } currlen += cnk->len; break; case CNK_INT: case CNK_UINT: fmtint(buffer, &currlen, maxlen, cnk->value, 10, min, max, cnk->flags); break; case CNK_OCTAL: fmtint(buffer, &currlen, maxlen, cnk->value, 8, min, max, cnk->flags); break; case CNK_HEX: fmtint(buffer, &currlen, maxlen, cnk->value, 16, min, max, cnk->flags); break; case CNK_FLOAT: fmtfp(buffer, &currlen, maxlen, cnk->fvalue, min, max, cnk->flags); break; case CNK_CHAR: dopr_outch(buffer, &currlen, maxlen, cnk->value); break; case CNK_STRING: if(max == -1) { max = strlen(cnk->strvalue); } fmtstr(buffer, &currlen, maxlen, cnk->strvalue, cnk->flags, min, max); break; case CNK_PTR: fmtint(buffer, &currlen, maxlen, (long)(cnk->strvalue), 16, min, max, cnk->flags); break; case CNK_NUM: if(cnk->cflags == DP_C_CHAR) *((char *)(cnk->pnum)) = (char)currlen; else if(cnk->cflags == DP_C_SHORT) *((short int *)(cnk->pnum)) = (short int)currlen; else if(cnk->cflags == DP_C_LONG) *((long int *)(cnk->pnum)) = (long int)currlen; else if(cnk->cflags == DP_C_LLONG) *((LLONG *)(cnk->pnum)) = (LLONG)currlen; else *((int *)(cnk->pnum)) = (int)currlen; break; case CNK_PRCNT: dopr_outch(buffer, &currlen, maxlen, '%'); break; default: /* what ?? */ goto done; } cnk = cnk->next; } if(maxlen != 0) { if(currlen < maxlen - 1) buffer[currlen] = '\0'; else if(maxlen > 0) buffer[maxlen - 1] = '\0'; } ret = currlen; done: while(chunks) { cnk = chunks->next; free(chunks); chunks = cnk; } if(clist) { for(pnum = 0; pnum < max_pos; pnum++) { if(clist[pnum].chunks) free(clist[pnum].chunks); } free(clist); } return ret; } static void fmtstr(char *buffer, size_t *currlen, size_t maxlen, char *value, int flags, int min, int max) { int padlen, strln; /* amount to pad */ int cnt = 0; #ifdef DEBUG_SNPRINTF printf("fmtstr min=%d max=%d s=[%s]\n", min, max, value); #endif if(value == 0) { value = ""; } for(strln = 0; strln < max && value[strln]; ++strln); /* strlen */ padlen = min - strln; if(padlen < 0) padlen = 0; if(flags & DP_F_MINUS) padlen = -padlen; /* Left Justify */ while(padlen > 0) { dopr_outch(buffer, currlen, maxlen, ' '); --padlen; } while(*value && (cnt < max)) { dopr_outch(buffer, currlen, maxlen, *value++); ++cnt; } while(padlen < 0) { dopr_outch(buffer, currlen, maxlen, ' '); ++padlen; } } /* Have to handle DP_F_NUM (ie 0x and 0 alternates) */ static void fmtint(char *buffer, size_t *currlen, size_t maxlen, long value, int base, int min, int max, int flags) { int signvalue = 0; unsigned long uvalue; char convert[20]; int place = 0; int spadlen = 0; /* amount to space pad */ int zpadlen = 0; /* amount to zero pad */ int caps = 0; if(max < 0) max = 0; uvalue = value; if(!(flags & DP_F_UNSIGNED)) { if(value < 0) { signvalue = '-'; uvalue = -value; } else { if(flags & DP_F_PLUS) /* Do a sign (+/i) */ signvalue = '+'; else if(flags & DP_F_SPACE) signvalue = ' '; } } if(flags & DP_F_UP) caps = 1; /* Should characters be upper case? */ do { convert[place++] = (caps ? "0123456789ABCDEF" : "0123456789abcdef") [uvalue % (unsigned)base ]; uvalue = (uvalue / (unsigned)base); } while(uvalue && (place < 20)); if(place == 20) place--; convert[place] = 0; zpadlen = max - place; spadlen = min - MAX(max, place) - (signvalue ? 1 : 0); if(zpadlen < 0) zpadlen = 0; if(spadlen < 0) spadlen = 0; if(flags & DP_F_ZERO) { zpadlen = MAX(zpadlen, spadlen); spadlen = 0; } if(flags & DP_F_MINUS) spadlen = -spadlen; /* Left Justify */ #ifdef DEBUG_SNPRINTF printf("zpad: %d, spad: %d, min: %d, max: %d, place: %d\n", zpadlen, spadlen, min, max, place); #endif /* Spaces */ while(spadlen > 0) { dopr_outch(buffer, currlen, maxlen, ' '); --spadlen; } /* Sign */ if(signvalue) dopr_outch(buffer, currlen, maxlen, signvalue); /* Zeros */ if(zpadlen > 0) { while(zpadlen > 0) { dopr_outch(buffer, currlen, maxlen, '0'); --zpadlen; } } /* Digits */ while(place > 0) dopr_outch(buffer, currlen, maxlen, convert[--place]); /* Left Justified spaces */ while(spadlen < 0) { dopr_outch(buffer, currlen, maxlen, ' '); ++spadlen; } } static LDOUBLE abs_val(LDOUBLE value) { LDOUBLE result = value; if(value < 0) result = -value; return result; } static LDOUBLE POW10(int exp) { LDOUBLE result = 1; while(exp) { result *= 10; exp--; } return result; } static LLONG ROUND(LDOUBLE value) { LLONG intpart; intpart = (LLONG)value; value = value - intpart; if(value >= 0.5) intpart++; return intpart; } /* a replacement for modf that doesn't need the math library. Should be portable, but slow */ static double my_modf(double x0, double *iptr) { int i; long l; double x = x0; double f = 1.0; for(i = 0; i < 100; i++) { l = (long)x; if(l <= (x + 1) && l >= (x - 1)) break; x *= 0.1; f *= 10.0; } if(i == 100) { /* yikes! the number is beyond what we can handle. What do we do? */ (*iptr) = 0; return 0; } if(i != 0) { double i2; double ret; ret = my_modf(x0 - l * f, &i2); (*iptr) = l * f + i2; return ret; } (*iptr) = l; return x - (*iptr); } static void fmtfp(char *buffer, size_t *currlen, size_t maxlen, LDOUBLE fvalue, int min, int max, int flags) { int signvalue = 0; double ufvalue; char iconvert[311]; char fconvert[311]; int iplace = 0; int fplace = 0; int padlen = 0; /* amount to pad */ int zpadlen = 0; int caps = 0; int idx; double intpart; double fracpart; double temp; /* * AIX manpage says the default is 0, but Solaris says the default * is 6, and sprintf on AIX defaults to 6 */ if(max < 0) max = 6; ufvalue = abs_val(fvalue); if(fvalue < 0) { signvalue = '-'; } else { if(flags & DP_F_PLUS) { /* Do a sign (+/i) */ signvalue = '+'; } else { if(flags & DP_F_SPACE) signvalue = ' '; } } #if 0 if(flags & DP_F_UP) caps = 1; /* Should characters be upper case? */ #endif #if 0 if(max == 0) ufvalue += 0.5; /* if max = 0 we must round */ #endif /* * Sorry, we only support 9 digits past the decimal because of our * conversion method */ if(max > 9) max = 9; /* We "cheat" by converting the fractional part to integer by * multiplying by a factor of 10 */ temp = ufvalue; my_modf(temp, &intpart); fracpart = ROUND((POW10(max)) * (ufvalue - intpart)); if(fracpart >= POW10(max)) { intpart++; fracpart -= POW10(max); } /* Convert integer part */ do { temp = intpart * 0.1; my_modf(temp, &intpart); idx = (int)((temp - intpart + 0.05) * 10.0); /* idx = (int) (((double)(temp*0.1) -intpart +0.05) *10.0); */ /* printf ("%llf, %f, %x\n", temp, intpart, idx); */ iconvert[iplace++] = (caps ? "0123456789ABCDEF" : "0123456789abcdef")[idx]; } while(intpart && (iplace < 311)); if(iplace == 311) iplace--; iconvert[iplace] = 0; /* Convert fractional part */ if(fracpart) { do { temp = fracpart * 0.1; my_modf(temp, &fracpart); idx = (int)((temp - fracpart + 0.05) * 10.0); /* idx = (int) ((((temp/10) -fracpart) +0.05) *10); */ /* printf ("%lf, %lf, %ld\n", temp, fracpart, idx ); */ fconvert[fplace++] = (caps ? "0123456789ABCDEF" : "0123456789abcdef")[idx]; } while(fracpart && (fplace < 311)); if(fplace == 311) fplace--; } fconvert[fplace] = 0; /* -1 for decimal point, another -1 if we are printing a sign */ padlen = min - iplace - max - 1 - ((signvalue) ? 1 : 0); zpadlen = max - fplace; if(zpadlen < 0) zpadlen = 0; if(padlen < 0) padlen = 0; if(flags & DP_F_MINUS) padlen = -padlen; /* Left Justify */ if((flags & DP_F_ZERO) && (padlen > 0)) { if(signvalue) { dopr_outch(buffer, currlen, maxlen, signvalue); --padlen; signvalue = 0; } while(padlen > 0) { dopr_outch(buffer, currlen, maxlen, '0'); --padlen; } } while(padlen > 0) { dopr_outch(buffer, currlen, maxlen, ' '); --padlen; } if(signvalue) dopr_outch(buffer, currlen, maxlen, signvalue); while(iplace > 0) dopr_outch(buffer, currlen, maxlen, iconvert[--iplace]); #ifdef DEBUG_SNPRINTF printf("fmtfp: fplace=%d zpadlen=%d\n", fplace, zpadlen); #endif /* * Decimal point. This should probably use locale to find the correct * char to print out. */ if(max > 0) { dopr_outch(buffer, currlen, maxlen, '.'); while(zpadlen > 0) { dopr_outch(buffer, currlen, maxlen, '0'); --zpadlen; } while(fplace > 0) dopr_outch(buffer, currlen, maxlen, fconvert[--fplace]); } while(padlen < 0) { dopr_outch(buffer, currlen, maxlen, ' '); ++padlen; } } static void dopr_outch(char *buffer, size_t *currlen, size_t maxlen, char c) { if(*currlen < maxlen) { buffer[(*currlen)] = c; } (*currlen)++; } static struct pr_chunk *new_chunk(void) { struct pr_chunk *new_c = (struct pr_chunk *)malloc(sizeof(struct pr_chunk)); if(!new_c) return NULL; new_c->type = 0; new_c->num = 0; new_c->min = 0; new_c->min_star = NULL; new_c->max = -1; new_c->max_star = NULL; new_c->flags = 0; new_c->cflags = 0; new_c->start = 0; new_c->len = 0; new_c->value = 0; new_c->fvalue = 0; new_c->strvalue = NULL; new_c->pnum = NULL; new_c->next = NULL; return new_c; } static int add_cnk_list_entry(struct pr_chunk_x **list, int max_num, struct pr_chunk *chunk) { struct pr_chunk_x *l; struct pr_chunk **c; int max; int cnum; int i, pos; if(chunk->num > max_num) { max = chunk->num; if(*list == NULL) { l = (struct pr_chunk_x *)malloc(sizeof(struct pr_chunk_x) * max); pos = 0; } else { l = (struct pr_chunk_x *)realloc(*list, sizeof(struct pr_chunk_x) * max); pos = max_num; } if(l == NULL) { for(i = 0; i < max; i++) { if((*list)[i].chunks) free((*list)[i].chunks); } return 0; } for(i = pos; i < max; i++) { l[i].chunks = NULL; l[i].num = 0; } } else { l = *list; max = max_num; } i = chunk->num - 1; cnum = l[i].num + 1; if(l[i].chunks == NULL) { c = (struct pr_chunk **)malloc(sizeof(struct pr_chunk *) * cnum); } else { c = (struct pr_chunk **)realloc(l[i].chunks, sizeof(struct pr_chunk *) * cnum); } if(c == NULL) { for(i = 0; i < max; i++) { if(l[i].chunks) free(l[i].chunks); } return 0; } c[l[i].num] = chunk; l[i].chunks = c; l[i].num = cnum; *list = l; return max; } int smb_vsnprintf(char *str, size_t count, const char *fmt, va_list args) { return dopr(str, count, fmt, args); } #define vsnprintf smb_vsnprintf #endif /* yes this really must be a ||. Don't muck with this (tridge) * * The logic for these two is that we need our own definition if the * OS *either* has no definition of *sprintf, or if it does have one * that doesn't work properly according to the autoconf test. */ #if !defined(HAVE_SNPRINTF) || !defined(HAVE_C99_VSNPRINTF) int smb_snprintf(char *str, size_t count, const char *fmt, ...) { size_t ret; va_list ap; va_start(ap, fmt); ret = vsnprintf(str, count, fmt, ap); va_end(ap); return ret; } #define snprintf smb_snprintf #endif #endif #ifndef HAVE_VASPRINTF int vasprintf(char **ptr, const char *format, va_list ap) { int ret; va_list ap2; VA_COPY(ap2, ap); ret = vsnprintf(NULL, 0, format, ap2); if(ret <= 0) return ret; (*ptr) = (char *)malloc(ret + 1); if(!*ptr) return -1; VA_COPY(ap2, ap); ret = vsnprintf(*ptr, ret + 1, format, ap2); return ret; } #endif #ifndef HAVE_ASPRINTF int asprintf(char **ptr, const char *format, ...) { va_list ap; int ret; *ptr = NULL; va_start(ap, format); ret = vasprintf(ptr, format, ap); va_end(ap); return ret; } #endif #ifdef TEST_SNPRINTF int sprintf(char *str, const char *fmt, ...); int main(void) { char buf1[1024]; char buf2[1024]; char *buf3; char *fp_fmt[] = { "%1.1f", "%-1.5f", "%1.5f", "%123.9f", "%10.5f", "% 10.5f", "%+22.9f", "%+4.9f", "%01.3f", "%4f", "%3.1f", "%3.2f", "%.0f", "%f", "%-8.8f", "%-9.9f", NULL }; double fp_nums[] = { 6442452944.1234, -1.5, 134.21, 91340.2, 341.1234, 203.9, 0.96, 0.996, 0.9996, 1.996, 4.136, 5.030201, 0.00205, /* END LIST */ 0 }; char *int_fmt[] = { "%-1.5d", "%1.5d", "%123.9d", "%5.5d", "%10.5d", "% 10.5d", "%+22.33d", "%01.3d", "%4d", "%d", NULL }; long int_nums[] = { -1, 134, 91340, 341, 0203, 0, 1234567890}; char *str_fmt[] = { "%10.5s", "%-10.5s", "%5.10s", "%-5.10s", "%10.1s", "%0.10s", "%10.0s", "%1.10s", "%s", "%.1s", "%.10s", "%10s", NULL }; char *str_vals[] = {"hello", "a", "", "a longer string", NULL}; int x, y; int fail = 0; int num = 0; int l1, l2; printf("Testing snprintf format codes against system sprintf...\n"); for(x = 0; fp_fmt[x] ; x++) { for(y = 0; fp_nums[y] != 0 ; y++) { buf1[0] = buf2[0] = '\0'; l1 = snprintf(NULL, 0, fp_fmt[x], fp_nums[y]); l2 = snprintf(buf1, sizeof(buf1), fp_fmt[x], fp_nums[y]); sprintf(buf2, fp_fmt[x], fp_nums[y]); buf1[1023] = buf1[1023] = '\0'; if(strcmp(buf1, buf2) || (l1 != l2)) { printf("snprintf doesn't match Format: %s\n\tsnprintf(%d) = [%s]\n\t sprintf(%d) = [%s]\n", fp_fmt[x], l1, buf1, l2, buf2); fail++; } num++; } } for(x = 0; int_fmt[x] ; x++) { for(y = 0; int_nums[y] != 0 ; y++) { buf1[0] = buf2[0] = '\0'; l1 = snprintf(NULL, 0, int_fmt[x], int_nums[y]); l2 = snprintf(buf1, sizeof(buf1), int_fmt[x], int_nums[y]); sprintf(buf2, int_fmt[x], int_nums[y]); buf1[1023] = buf1[1023] = '\0'; if(strcmp(buf1, buf2) || (l1 != l2)) { printf("snprintf doesn't match Format: %s\n\tsnprintf(%d) = [%s]\n\t sprintf(%d) = [%s]\n", int_fmt[x], l1, buf1, l2, buf2); fail++; } num++; } } for(x = 0; str_fmt[x] ; x++) { for(y = 0; str_vals[y] != 0 ; y++) { buf1[0] = buf2[0] = '\0'; l1 = snprintf(NULL, 0, str_fmt[x], str_vals[y]); l2 = snprintf(buf1, sizeof(buf1), str_fmt[x], str_vals[y]); sprintf(buf2, str_fmt[x], str_vals[y]); buf1[1023] = buf1[1023] = '\0'; if(strcmp(buf1, buf2) || (l1 != l2)) { printf("snprintf doesn't match Format: %s\n\tsnprintf(%d) = [%s]\n\t sprintf(%d) = [%s]\n", str_fmt[x], l1, buf1, l2, buf2); fail++; } num++; } } #define BUFSZ 2048 buf1[0] = buf2[0] = '\0'; if((buf3 = malloc(BUFSZ)) == NULL) { fail++; } else { num++; memset(buf3, 'a', BUFSZ); snprintf(buf1, sizeof(buf1), "%.*s", 1, buf3); buf1[1023] = '\0'; if(strcmp(buf1, "a") != 0) { printf("length limit buf1 '%s' expected 'a'\n", buf1); fail++; } } buf1[0] = buf2[0] = '\0'; l1 = snprintf(buf1, sizeof(buf1), "%4$*1$d %2$s %3$*1$.*1$f", 3, "pos test", 12.3456, 9); l2 = sprintf(buf2, "%4$*1$d %2$s %3$*1$.*1$f", 3, "pos test", 12.3456, 9); buf1[1023] = buf1[1023] = '\0'; if(strcmp(buf1, buf2) || (l1 != l2)) { printf("snprintf doesn't match Format: %s\n\tsnprintf(%d) = [%s]\n\t sprintf(%d) = [%s]\n", "%4$*1$d %2$s %3$*1$.*1$f", l1, buf1, l2, buf2); fail++; } buf1[0] = buf2[0] = '\0'; l1 = snprintf(buf1, sizeof(buf1), "%4$*4$d %2$s %3$*4$.*4$f", 3, "pos test", 12.3456, 9); l2 = sprintf(buf2, "%4$*4$d %2$s %3$*4$.*4$f", 3, "pos test", 12.3456, 9); buf1[1023] = buf1[1023] = '\0'; if(strcmp(buf1, buf2)) { printf("snprintf doesn't match Format: %s\n\tsnprintf(%d) = [%s]\n\t sprintf(%d) = [%s]\n", "%4$*1$d %2$s %3$*1$.*1$f", l1, buf1, l2, buf2); fail++; } #if 0 buf1[0] = buf2[0] = '\0'; l1 = snprintf(buf1, sizeof(buf1), "%lld", (LLONG)1234567890); l2 = sprintf(buf2, "%lld", (LLONG)1234567890); buf1[1023] = buf1[1023] = '\0'; if(strcmp(buf1, buf2)) { printf("snprintf doesn't match Format: %s\n\tsnprintf(%d) = [%s]\n\t sprintf(%d) = [%s]\n", "%lld", l1, buf1, l2, buf2); fail++; } buf1[0] = buf2[0] = '\0'; l1 = snprintf(buf1, sizeof(buf1), "%Lf", (LDOUBLE)890.1234567890123); l2 = sprintf(buf2, "%Lf", (LDOUBLE)890.1234567890123); buf1[1023] = buf1[1023] = '\0'; if(strcmp(buf1, buf2)) { printf("snprintf doesn't match Format: %s\n\tsnprintf(%d) = [%s]\n\t sprintf(%d) = [%s]\n", "%Lf", l1, buf1, l2, buf2); fail++; } #endif printf("%d tests failed out of %d.\n", fail, num); printf("seeing how many digits we support\n"); { double v0 = 0.12345678901234567890123456789012345678901; for(x = 0; x < 100; x++) { double p = pow(10, x); double r = v0 * p; snprintf(buf1, sizeof(buf1), "%1.1f", r); sprintf(buf2, "%1.1f", r); if(strcmp(buf1, buf2)) { printf("we seem to support %d digits\n", x - 1); break; } } } return 0; } #endif /* TEST_SNPRINTF */ nagios-4.3.4/lib/snprintf.h.in000066400000000000000000000001761314764422400162040ustar00rootroot00000000000000/* -*- C -*- */ #ifndef LIBNAGIOS_snprintf_h__ #define LIBNAGIOS_snprintf_h__ #undef HAVE_SNPRINTF #undef NEED_VA_LIST #endif nagios-4.3.4/lib/squeue.c000066400000000000000000000126161314764422400152400ustar00rootroot00000000000000/** * @file squeue.c * @brief pqeue wrapper library * * This library wraps the libpqueue library and handles the boring * parts for all manner of events that want to use it, while hiding * the implementation details of the pqueue's binary heap from the * callers. * * peek() is O(1) * add(), pop() and remove() are O(lg n), although remove() is * impossible unless caller maintains the pointer to the scheduled * event. */ #include #include #include #include #include #include "squeue.h" #include "pqueue.h" struct squeue_event { unsigned int pos; pqueue_pri_t pri; struct timeval when; void *data; }; /* * 21 bits has enough data for systems that can have the usec * field of a struct timeval move into the 1-second range, but * not enough to let them to (far) beyond 2. If the system libs * are too buggy, we really can't save it. * This little twiddling operation lets us use dates beyond * 2038 on 64-bit systems, while retaining the fast priority * comparisons. */ #define SQ_BITS 21 static pqueue_pri_t evt_compute_pri(struct timeval *tv) { pqueue_pri_t ret; /* keep weird compilers on 32-bit systems from doing wrong */ if(sizeof(pqueue_pri_t) < 8) { ret = tv->tv_sec; ret += !!tv->tv_usec; } else { ret = tv->tv_sec; ret <<= SQ_BITS; ret |= tv->tv_usec & ((1 << SQ_BITS) - 1); } return ret; } static int sq_cmp_pri(pqueue_pri_t next, pqueue_pri_t cur) { return next > cur; } static unsigned long long sq_get_pri(void *a) { return ((squeue_event *)a)->pri; } static void sq_set_pri(void *a, pqueue_pri_t pri) { ((squeue_event *)a)->pri = pri; } static unsigned int sq_get_pos(void *a) { return ((squeue_event *)a)->pos; } static void sq_set_pos(void *a, unsigned int pos) { ((squeue_event *)a)->pos = pos; } const struct timeval *squeue_event_runtime(squeue_event *evt) { if (evt) return &evt->when; return NULL; } void *squeue_event_data(squeue_event *evt) { if (evt) return evt->data; return NULL; } squeue_t *squeue_create(unsigned int horizon) { if (!horizon) horizon = 127; /* makes pqueue allocate 128 elements */ return pqueue_init(horizon, sq_cmp_pri, sq_get_pri, sq_set_pri, sq_get_pos, sq_set_pos); } squeue_event *squeue_add_tv(squeue_t *q, struct timeval *tv, void *data) { squeue_event *evt; if (!q) return NULL; evt = calloc(1, sizeof(*evt)); if (!evt) return NULL; /* we can't schedule events in the past */ if (tv->tv_sec < time(NULL)) tv->tv_sec = time(NULL); evt->when.tv_sec = tv->tv_sec; if (sizeof(evt->when.tv_sec) > 4) { /* * Only use bottom sizeof(pqueue_pri_t)-SQ_BITS bits on * 64-bit systems, or we may get entries at the head * of the queue are actually scheduled to run several * hundred thousand years from now. */ evt->when.tv_sec &= (1ULL << ((sizeof(pqueue_pri_t) * 8) - SQ_BITS)) - 1; } evt->when.tv_usec = tv->tv_usec; evt->data = data; evt->pri = evt_compute_pri(&evt->when); if (!pqueue_insert(q, evt)) return evt; free(evt); return NULL; } squeue_event *squeue_add(squeue_t *q, time_t when, void *data) { struct timeval tv; /* * we fetch real microseconds first, so events with same * timestamp get different priorities for FIFO ordering. */ gettimeofday(&tv, NULL); tv.tv_sec = when; return squeue_add_tv(q, &tv, data); } squeue_event *squeue_add_usec(squeue_t *q, time_t when, time_t usec, void *data) { struct timeval tv; tv.tv_sec = when; tv.tv_usec = usec; assert(usec < 1000000); return squeue_add_tv(q, &tv, data); } squeue_event *squeue_add_msec(squeue_t *q, time_t when, time_t msec, void *data) { return squeue_add_usec(q, when, msec * 1000, data); } void squeue_change_priority_tv(squeue_t *q, squeue_event *evt, struct timeval *tv) { if (!q || !evt || !tv) return; evt->when.tv_sec = tv->tv_sec; if (sizeof(evt->when.tv_sec) > 4) { /* Only use bottom sizeof(pqueue_pri_t)-SQ_BITS bits on 64-bit systems, * or we may get entries at the head of the queue are actually * scheduled to run several hundred thousand years from now. */ evt->when.tv_sec &= (1ULL << ((sizeof(pqueue_pri_t) * 8) - SQ_BITS)) - 1; } evt->when.tv_usec = tv->tv_usec; pqueue_change_priority(q, evt_compute_pri(&evt->when), evt); } void *squeue_peek(squeue_t *q) { squeue_event *evt = pqueue_peek(q); if (evt) return evt->data; return NULL; } void *squeue_pop(squeue_t *q) { squeue_event *evt; void *ptr = NULL; evt = pqueue_pop(q); if (evt) { ptr = evt->data; free(evt); } return ptr; } int squeue_remove(squeue_t *q, squeue_event *evt) { int ret; if (!q || !evt) return -1; ret = pqueue_remove(q, evt); if (evt) free(evt); return ret; } void squeue_destroy(squeue_t *q, int flags) { unsigned int i; if (!q || pqueue_size(q) < 1) return; /* * Using two separate loops is a lot faster than * doing 1 cmp+branch for every queued item */ if (flags & SQUEUE_FREE_DATA) { for (i = 0; i < pqueue_size(q); i++) { free(((squeue_event *)q->d[i + 1])->data); free(q->d[i + 1]); } } else { for (i = 0; i < pqueue_size(q); i++) { free(q->d[i + 1]); } } pqueue_free(q); } unsigned int squeue_size(squeue_t *q) { if (!q) return 0; return pqueue_size(q); } int squeue_evt_when_is_after(squeue_event *evt, struct timeval *reftime) { if(!evt) return -1; if((reftime->tv_sec > evt->when.tv_sec) || ((reftime->tv_sec == evt->when.tv_sec) && (reftime->tv_usec > evt->when.tv_usec))) { return 1; } return 0; } nagios-4.3.4/lib/squeue.h000066400000000000000000000127401314764422400152430ustar00rootroot00000000000000#ifndef LIBNAGIOS_SQUEUE_H_INCLUDED #define LIBNAGIOS_SQUEUE_H_INCLUDED #include #include #include "pqueue.h" /** * @file squeue.h * @brief Scheduling queue function declarations * * This library is based on the pqueue api, which implements a * priority queue based on a binary heap, providing O(lg n) times * for insert() and remove(), and O(1) time for peek(). * @note There is no "find". Callers must maintain pointers to their * scheduled events if they wish to be able to remove them. * * @{ */ /* * All opaque types here. * The pqueue library can be useful on its own though, so we * don't block that from user view. */ typedef pqueue_t squeue_t; struct squeue_event; typedef struct squeue_event squeue_event; /** * Options for squeue_destroy()'s flag parameter */ #define SQUEUE_FREE_DATA (1 << 0) /** Call free() on all data pointers */ /** * Get the scheduled runtime of this event * @param[in] evt The event to get runtime of * @return struct timeval on success, NULL on errors */ extern const struct timeval *squeue_event_runtime(squeue_event *evt); /** * Get data of an squeue_event struct * @param[in] evt The event to operate on * @return The data object pointed to by the event */ extern void *squeue_event_data(squeue_event *evt); /** * Creates a scheduling queue optimized for handling events within * the given timeframe. Callers should take care to create a queue * of a decent but not overly large size, as too small or too large * a queue will impact performance negatively. A queue can hold any * number of events. A good value for "horizon" would be the max * seconds into the future one expects to schedule things, although * with few scheduled items in that timeframe you'd be better off * using a more narrow horizon. * * @param size Hint about how large this queue will get * @return A pointer to a scheduling queue */ extern squeue_t *squeue_create(unsigned int size); /** * Destroys a scheduling queue completely * @param[in] q The doomed queue * @param[in] flags Flags determining the the level of destruction */ extern void squeue_destroy(squeue_t *q, int flags); /** * Enqueue an event with microsecond precision. * It's up to the caller to keep the event pointer in case he/she * wants to remove the event from the queue later. * * @param q The scheduling queue to add to * @param tv When this event should occur * @param data Pointer to any kind of data * @return The complete scheduled event */ extern squeue_event *squeue_add_tv(squeue_t *q, struct timeval *tv, void *data); /** * Adds an event to the scheduling queue. * See notes for squeue_add_tv() for details * * @param q The scheduling queue to add to * @param when The unix timestamp when this event is to occur * @param data Pointer to any kind of data * @return The complete scheduled event */ extern squeue_event *squeue_add(squeue_t *q, time_t when, void *data); /** * Adds an event to the scheduling queue with millisecond precision * See notes on squeue_add_tv() for details * * @param[in] q The scheduling queue to add to * @param[in] when Unix timestamp when this event should occur * @param[in] usec Millisecond of above this event should occur * @param[in] data Pointer to any kind of data * @return NULL on errors. squeue_event pointer on success */ extern squeue_event *squeue_add_usec(squeue_t *q, time_t when, time_t usec, void *data); /** * Adds an event to the scheduling queue with millisecond precision * See notes on squeue_add_tv() for details * * @param[in] q The scheduling queue to add to * @param[in] when Unix timestamp when this event should occur * @param[in] msec Millisecond of above this event should occur * @param[in] data Pointer to any kind of data * @return NULL on errors. squeue_event pointer on success */ extern squeue_event *squeue_add_msec(squeue_t *q, time_t when, time_t msec, void *data); /** * Change an event's priority to a new time. * * @param q The scheduling queue holding the event. * @param evt The event to reschedule. * @param tv When the event should be rescheduled to. */ extern void squeue_change_priority_tv(squeue_t *q, squeue_event *evt, struct timeval *tv); /** * Returns the data of the next scheduled event from the scheduling * queue without removing it from the queue. * * @param q The scheduling queue to peek into */ extern void *squeue_peek(squeue_t *q); /** * Pops the next scheduled event from the scheduling queue and * returns the data for it. * This is equivalent to squeue_peek() + squeue_pop() * @note This causes the squeue_event to be free()'d. * * @param q The scheduling queue to pop from */ extern void *squeue_pop(squeue_t *q); /** * Removes the given event from the scheduling queue * @note This causes the associated squeue_event() to be free()'d. * @param[in] q The scheduling queue to remove from * @param[in] evt The event to remove */ extern int squeue_remove(squeue_t *q, squeue_event *evt); /** * Returns the number of events in the scheduling queue. This * function never fails. * * @param[in] q The scheduling queue to inspect * @return number of events in the inspected queue */ extern unsigned int squeue_size(squeue_t *q); /** * Returns true if passed timeval is after the time for the event * * @param[in] evt The queue event to inspect * @param[in] reftime The reference time to compare to the queue event time * @return 1 if reftime > event time, 0 otherwise */ extern int squeue_evt_when_is_after(squeue_event *evt, struct timeval *reftime); #endif /** @} */ nagios-4.3.4/lib/t-utils.c000066400000000000000000000056351314764422400153350ustar00rootroot00000000000000#include "t-utils.h" const char *cyan = "", *red = "", *green = "", *yellow = "", *reset = ""; uint passed, failed, t_verbose = 0; static uint t_depth; static const char *indent_str = " "; /* can't be used when a or b has side-effects, but we don't care here */ #define max(a, b) (a > b ? a : b) #define min(a, b) (a < b ? a : b) #define delta(a, b) ((max(a, b) - (min(a, b)))) void t_reset(void) { passed = failed = 0; } void t_set_colors(int force) { if (force == 1 || isatty(fileno(stdout))) { cyan = CLR_CYAN; red = CLR_RED; yellow = CLR_YELLOW; green = CLR_GREEN; reset = CLR_RESET; } } static void t_indent(uint depth) { uint i; for (i = 0; i < depth; i++) { printf("%s", indent_str); } } void t_start(const char *fmt, ...) { va_list ap; t_indent(t_depth++); va_start(ap, fmt); printf("%s### ", cyan); vfprintf(stdout, fmt, ap); printf("%s\n", reset); va_end(ap); } int t_end(void) { if (t_depth) t_depth--; if (!t_depth || failed) { t_indent(t_depth); printf("Test results: %s%u passed%s, %s%u failed%s\n", green, passed, reset, failed ? red : "", failed, failed ? reset : ""); } return failed ? EXIT_FAILURE : EXIT_SUCCESS; } static int t_okv(int success, const char *fmt, va_list ap) { passed += !!success; failed += !success; if (fmt && (!success || t_verbose || (t_verbose = !!getenv("TEST_VERBOSE")))) { t_indent(t_depth); if (success) { printf("%sPASS%s ", green, reset); } else { printf("%sFAIL%s ", red, reset); } vfprintf(stdout, fmt, ap); putchar('\n'); } return success; } int t_ok(int success, const char *fmt, ...) { va_list ap; if (fmt) { va_start(ap, fmt); t_okv(success, fmt, ap); va_end(ap); } else t_okv(success, NULL, NULL); return success; } void t_pass(const char *fmt, ...) { va_list ap; va_start(ap, fmt); t_okv(TEST_PASS, fmt, ap); va_end(ap); } void t_fail(const char *fmt, ...) { va_list ap; va_start(ap, fmt); t_okv(TEST_FAIL, fmt, ap); va_end(ap); } void t_diag(const char *fmt, ...) { if (fmt) { va_list ap; t_indent(t_depth + 1); va_start(ap, fmt); vfprintf(stdout, fmt, ap); va_end(ap); putchar('\n'); } } int ok_int(int a, int b, const char *name) { if (a == b) { t_pass("%s", name); return TEST_PASS; } t_fail("%s", name); t_diag("%d != %d. delta: %d", a, b, delta(a, b)); return TEST_FAIL; } int ok_uint(uint a, uint b, const char *name) { if (a == b) { t_pass("%s", name); return TEST_PASS; } t_fail("%s", name); t_diag("%u != %u. delta: %u", a, b, delta(a, b)); return TEST_FAIL; } int ok_str(const char *a, const char *b, const char *name) { if ((!a && !b) || (a && b && !strcmp(a, b))) { t_pass("%s", name); return TEST_PASS; } t_fail("%s", name); t_diag("'%s' != '%s'", a, b); return TEST_FAIL; } void __attribute__((__noreturn__)) crash(const char *fmt, ...) { va_list ap; va_start(ap, fmt); vfprintf(stderr, fmt, ap); va_end(ap); fputc('\n', stderr); exit(1); } nagios-4.3.4/lib/t-utils.h000066400000000000000000000041101314764422400153250ustar00rootroot00000000000000#ifndef NAGIOS_T_UTILS_H_INCLUDED #define NAGIOS_T_UTILS_H_INCLUDED #include #include #include #include #include #ifndef ARRAY_SIZE # define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0])) #endif #define TEST_PASS 1 #define TEST_FAIL 0 #define CLR_RESET "\033[m" #define CLR_BOLD "\033[1m" #define CLR_RED "\033[31m" #define CLR_GREEN "\033[32m" #define CLR_BROWN "\033[33m" #define CLR_YELLOW "\033[33m\033[1m" #define CLR_BLUE "\033[34m" #define CLR_MAGENTA "\033[35m" #define CLR_CYAN "\033[36m" #define CLR_BG_RED "\033[41m" #define CLR_BRIGHT_RED "\033[31m\033[1m" #define CLR_BRIGHT_GREEN "\033[32m\033[1m" #define CLR_BRIGHT_BLUE "\033[34m\033[1m" #define CLR_BRIGHT_MAGENTA "\033[35m\033[1m" #define CLR_BRIGHT_CYAN "\033[36m\033[1m" extern const char *red, *green, *yellow, *cyan, *reset; extern unsigned int passed, failed, t_verbose; #define CHECKPOINT() \ do { \ fprintf(stderr, "ALIVE @ %s:%s:%d\n", __FILE__, __func__, __LINE__); \ } while(0) #define t_assert(expr) \ extern void t_set_colors(int force); extern void t_start(const char *fmt, ...) __attribute__((__format__(__printf__, 1, 2))); extern void t_pass(const char *fmt, ...) __attribute__((__format__(__printf__, 1, 2))); extern void t_fail(const char *fmt, ...) __attribute__((__format__(__printf__, 1, 2))); extern void t_diag(const char *fmt, ...) __attribute__((__format__(__printf__, 1, 2))); extern int t_ok(int success, const char *fmt, ...) __attribute__((__format__(__printf__, 2, 3))); #define test t_ok #define t_req(expr) \ if (!(expr)) \ crash("No further testing is possible: " #expr " @%s:%d", __FILE__, __LINE__) extern int ok_int(int a, int b, const char *name); extern int ok_uint(unsigned int a, unsigned int b, const char *name); extern int ok_str(const char *a, const char *b, const char *name); extern int t_end(void); extern void t_reset(void); extern void crash(const char *fmt, ...) __attribute__((__format__(__printf__, 1, 2), __noreturn__)); #endif nagios-4.3.4/lib/test-bitmap.c000066400000000000000000000062571314764422400161660ustar00rootroot00000000000000#include "t-utils.h" #include "lnag-utils.h" #include "bitmap.c" #define PRIME 2089 int main(int argc, char **argv) { bitmap *a = NULL, *b, *r_union, *r_diff, *r_symdiff, *r_intersect; unsigned int i; int sa[] = { 2, 3, 4, 1783, 1784, 1785 }; int sb[] = { 1, 2, 3, 1784, 1785, 1786, 1790, 1791, 1792 }; t_set_colors(0); t_start("bitmap tests"); /* * intersect: 2, 3, 1784, 1785 * union: 1, 2, 3, 4, 1783, 1784, 1785, 1786, 1790, 1791, 1792 * diff A/B: 4, 1783 * diff B/A: 1, 1786, 1790, 1791, 1792 * symdiff: 1, 1783, 1786, 1790, 1791, 1792 */ ok_int(bitmap_count_set_bits(a), 0, "counting set bits in null vector a"); ok_int(bitmap_count_unset_bits(a), 0, "counting unset bits in null vector a"); a = bitmap_create(PRIME); b = bitmap_create(PRIME); ok_int(bitmap_count_set_bits(b), 0, "counting set bits in empty vector b"); ok_int(bitmap_count_unset_bits(b), bitmap_cardinality(b), "counting unset bits in empty vector b"); t_set_colors(0); ok_int(bitmap_cardinality(a) > PRIME, 1, "bitmap cardinality test"); for (i = 0; i < veclen(sa); i++) { bitmap_set(a, sa[i]); } ok_int(bitmap_count_set_bits(a), veclen(sa), "counting set bits for a"); for (i = 0; i < veclen(sb); i++) { ok_int(0, bitmap_isset(b, sb[i]), "checking unset bit"); bitmap_set(b, sb[i]); if (!ok_int(1, bitmap_isset(b, sb[i]), "set and isset should work")) printf("sb[i]: %d\n", sb[i]); } if (!ok_int(bitmap_count_set_bits(b), veclen(sb), "counting set bits for b")) { for (i = 0; i < PRIME; i++) { if (bitmap_isset(b, i)) { ; } } } r_union = bitmap_union(a, b); ok_int(bitmap_count_set_bits(r_union), 11, "bitmap union sets the right amount of bits"); for (i = 0; i < veclen(sa); i++) { ok_int(1, bitmap_isset(r_union, sa[i]), "union should have bits from a"); } for (i = 0; i < veclen(sb); i++) { ok_int(1, bitmap_isset(r_union, sb[i]), "union should have bits from b"); } r_diff = bitmap_diff(a, b); ok_int(bitmap_count_set_bits(r_diff), 2, "diff must set right amount of bits"); r_symdiff = bitmap_symdiff(a, b); ok_int(bitmap_count_set_bits(r_symdiff), 7, "symdiff must set right amount of bits"); r_intersect = bitmap_intersect(a, b); ok_int(bitmap_count_set_bits(r_intersect), 4, "intersect must set right amount of bits"); for (i = 0; i < veclen(sa); i++) { if (bitmap_isset(a, sa[i]) && bitmap_isset(b, sa[i])) { ok_int(bitmap_isset(r_intersect, sa[i]), 1, "intersect must have bits in both"); } else { ok_int(bitmap_isset(r_intersect, sa[i]), 0, "Intersect must not have bits in only one or none"); } } ok_int(bitmap_count_unset_bits(NULL), 0, "There are no unset bits in a NULL bitmap"); ok_int(bitmap_count_set_bits(NULL), 0, "No set bits in a NULL map"); bitmap_set(a, 0); ok_int(bitmap_isset(a, 0), 1, "bitmap_set()"); bitmap_unset(a, 0); ok_int(bitmap_isset(a, 0), 0, "bitmap_unset()"); bitmap_set(a, 0); bitmap_clear(a); ok_int(bitmap_isset(a, 0), 0, "bitmap_clear()"); ok_int(bitmap_count_unset_bits(a), bitmap_cardinality(a), "bitmap_clear() must clear all"); ok_int(bitmap_count_set_bits(a), 0, "bitmap_clear() must clear all (part 2)"); t_end(); return 0; } nagios-4.3.4/lib/test-dkhash.c000066400000000000000000000115131314764422400161430ustar00rootroot00000000000000#include #include #include #include "dkhash.c" #include "t-utils.h" static struct { char *k1, *k2; } keys[] = { { "nisse", "banan" }, { "foo", "bar" }, { "kalle", "penslar" }, { "hello", "world" }, { "test", "fnurg" }, { "barsk", "nitfol" }, { "andreas", "regerar" }, { "Nagios", "rules" }, }; static int removed; static struct test_data { int x, i, j; } del; unsigned int dkhash_count_entries(dkhash_table *table) { unsigned int i, count = 0; for (i = 0; i < table->num_buckets; i++) { dkhash_bucket *bkt; for (bkt = table->buckets[i]; bkt; bkt = bkt->next) count++; } return count; } int dkhash_check_table(dkhash_table *t) { return t ? t->entries - dkhash_count_entries(t) : 0; } void dkhash_debug_print_table(dkhash_table *t, const char *name, int force) { int delta = dkhash_check_table(t); unsigned int count; if (!delta && !force) return; count = dkhash_count_entries(t); printf("debug data for dkhash table '%s'\n", name); printf(" entries: %u; counted: %u; delta: %d\n", t->entries, count, delta); printf(" added: %u; removed: %u; delta: %d\n", t->added, t->removed, t->added - t->removed); } #define dkhash_debug_table(t, force) dkhash_debug_print_table(t, #t, force) static struct test_data *ddup(int x, int i, int j) { struct test_data *d; d = malloc(sizeof(*d)); d->x = x; d->i = i; d->j = j; return d; } struct dkhash_check { uint entries, count, max, added, removed; int ent_delta, addrm_delta; }; static int del_matching(void *data) { struct test_data *d = (struct test_data *)data; if (!memcmp(d, &del, sizeof(del))) { removed++; return DKHASH_WALK_REMOVE; } return 0; } int main(int argc, char **argv) { dkhash_table *tx, *t; unsigned int x; int ret, r2; struct test_data s; char *p1, *p2; char *strs[10]; char tmp[32]; t_set_colors(0); t_start("dkhash basic test"); t = dkhash_create(512); p1 = strdup("a not-so secret value"); dkhash_insert(t, "nisse", NULL, p1); ok_int(dkhash_num_entries_max(t), 1, "Added one entry, so that's max"); ok_int(dkhash_num_entries_added(t), 1, "Added one entry, so one added"); ok_int(dkhash_table_size(t), 512, "Table must be sized properly"); ok_int(dkhash_collisions(t), 0, "One entry, so zero collisions"); p2 = dkhash_get(t, "nisse", NULL); test(p1 == p2, "get should get what insert set"); dkhash_insert(t, "kalle", "bananas", p1); p2 = dkhash_get(t, "kalle", "bezinga"); test(p1 != p2, "we should never get the wrong key"); ok_int(2, dkhash_num_entries(t), "should be 2 entries after 2 inserts"); p2 = dkhash_remove(t, "kalle", "bezinga"); ok_int(2, dkhash_num_entries(t), "should be 2 entries after 2 inserts and 1 failed remove"); ok_int(0, dkhash_num_entries_removed(t), "should be 0 removed entries after failed remove"); p2 = dkhash_remove(t, "kalle", "bananas"); test(p1 == p2, "dkhash_remove() should return removed data"); ok_int(dkhash_num_entries(t), 1, "should be 1 entries after 2 inserts and 1 successful remove"); p2 = dkhash_remove(t, "nisse", NULL); test(p1 == p2, "dkhash_remove() should return removed data"); ret = t_end(); t_reset(); /* lots of tests below, so we shut up while they're running */ t_verbose = 0; t_start("dkhash_walk_data() test"); memset(&s, 0, sizeof(s)); /* first we set up the dkhash-tables */ tx = dkhash_create(16); for (x = 0; x < ARRAY_SIZE(keys); x++) { dkhash_insert(tx, keys[x].k1, NULL, ddup(x, 0, 0)); dkhash_insert(tx, keys[x].k2, NULL, ddup(x, 0, 0)); dkhash_insert(tx, keys[x].k1, keys[x].k2, ddup(x, 0, 0)); s.x += 3; ok_int(s.x, dkhash_num_entries(tx), "x table adding"); } ok_int(s.x, dkhash_num_entries(tx), "x table done adding"); for (x = 0; x < ARRAY_SIZE(keys); x++) { del.x = x; del.i = del.j = 0; ok_int(s.x, dkhash_num_entries(tx), "x table pre-delete"); s.x -= 3; dkhash_walk_data(tx, del_matching); ok_int(s.x, dkhash_num_entries(tx), "x table post-delete"); } test(0 == dkhash_num_entries(tx), "x table post all ops"); test(0 == dkhash_check_table(tx), "x table consistency post all ops"); dkhash_debug_table(tx, 0); r2 = t_end(); ret = r2 ? r2 : ret; t_reset(); for(x = 0; x < 10; x++) { sprintf(tmp, "string %d", x); strs[x] = strdup(tmp); } t_start("dkhash single bucket add remove forward"); t = dkhash_create(1); for(x = 0; x < 10; x++) { dkhash_insert(t, strs[x], NULL, strs[x]); } for(x = 0; x < 10; x++) { p1 = strs[x]; p2 = dkhash_remove(t, p1, NULL); test(p1 == p2, "remove should return a value"); } r2 = t_end(); ret = r2 ? r2 : ret; t_reset(); t_start("dkhash single bucket add remove backward"); t = dkhash_create(1); for(x = 0; x < 10; x++) { dkhash_insert(t, strs[x], NULL, strs[x]); } for(x = 9; x; x--) { p1 = strs[x]; p2 = dkhash_remove(t, p1, NULL); test(p1 == p2, "remove should return a value"); } dkhash_destroy(t); r2 = t_end(); return r2 ? r2 : ret; } nagios-4.3.4/lib/test-fanout.c000066400000000000000000000046031314764422400161770ustar00rootroot00000000000000#define _GNU_SOURCE 1 #include #include "fanout.c" #include "t-utils.h" struct tcase { unsigned long key; unsigned long value; }; static int destroyed; static void destructor(void *ptr) { destroyed++; } static void run_tests(int ntests, int fo_size) { struct tcase *tc; unsigned long last_ptr, *ptr; int i, added = 0, removed = 0; fanout_table *fo; last_ptr = ntests; fo = fanout_create(fo_size); tc = calloc(ntests, sizeof(*tc)); for (i = 0; i < ntests; i++) { tc[i].value = i; if (!fanout_add(fo, tc[i].key, &tc[i].value)) added++; } ok_int(added, ntests, "Adding stuff must work"); while ((ptr = (unsigned long *)fanout_remove(fo, 0))) { ok_int((int)*ptr, (int)last_ptr - 1, "Removing a bunch of them"); removed++; last_ptr = *ptr; } ok_int(added, removed, "Removing should work as well as adding"); fanout_destroy(fo, destructor); ok_int(destroyed, 0, "Expected no entries in destructor"); fo = fanout_create(fo_size); for (i = 0; i < ntests; i++) { tc[i].value = i; if (!fanout_add(fo, tc[i].key, &tc[i].value)) added++; } fanout_destroy(fo, destructor); ok_int(destroyed, ntests, "Expected ntest entries in destructor"); destroyed = 0; free(tc); } struct test_data { unsigned long key; char *name; }; static fanout_table *fot; static void pdest(void *arg_) { struct test_data *td = (struct test_data *)arg_; fanout_remove(fot, td->key); free(td->name); free(td); destroyed++; } int main(int argc, char **argv) { unsigned long k; t_set_colors(0); t_start("fanout tests"); struct test_data *td; run_tests(10, 64); run_tests(512, 64); run_tests(64, 64); run_tests(511, 17); destroyed = 0; fot = fanout_create(512); ok_int(fanout_remove(fot, 12398) == NULL, 1, "remove on empty table must yield NULL"); ok_int(fanout_get(fot, 123887987) == NULL, 1, "get on empty table must yield NULL"); for (k = 0; k < 16385; k++) { struct test_data *tdata = calloc(1, sizeof(*td)); tdata->key = k; asprintf(&tdata->name, "%lu", k); fanout_add(fot, k, tdata); } td = fanout_get(fot, k - 1); ok_int(td != NULL, 1, "get must get what add inserts"); ok_int(fanout_remove(fot, k + 1) == NULL, 1, "remove on non-inserted key must yield NULL"); ok_int(fanout_get(fot, k + 1) == NULL, 1, "get on non-inserted must yield NULL"); fanout_destroy(fot, pdest); ok_int((int)destroyed, (int)k, "destroy counter while free()'ing"); return t_end(); } nagios-4.3.4/lib/test-iobroker.c000066400000000000000000000111331314764422400165130ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include #include #include "iobroker.c" #include "t-utils.h" static iobroker_set *iobs; static char *msg[] = { "Welcome to the echo service!\n", "test msg nr 2", "random piece of string\nwith\nlots\nof\nnewlines\n\n\n\n\0", "another totally random message\n", "and this one's from emma. She's alright, really", NULL, }; static int echo_service(int fd, int events, void *arg) { char buf[1024]; int len; len = read(fd, buf, sizeof(buf)); if (len < 0) { perror("read"); iobroker_close(iobs, fd); ok_int(iobroker_is_registered(iobs, fd), 0, "Closing must deregister"); return 0; } /* zero read means we're disconnected */ if (!len) { iobroker_close(iobs, fd); ok_int(iobroker_is_registered(iobs, fd), 0, "Closing must deregister"); return 0; } write(fd, buf, len); return 0; } static int connected_handler(int fd, int events, void *arg) { int *counter = (int *)arg; int i; i = *counter; if (events == IOBROKER_POLLIN) { char buf[1024]; int len = read(fd, buf, sizeof(buf)); buf[len] = 0; test(len == (int)strlen(msg[i]), "len match for message %d", i); test(!memcmp(buf, msg[i], len), "data match for message %d", i); } i++; if (i < 0 || i >= (int)ARRAY_SIZE(msg)) { fprintf(stderr, "i = %d in connected_handler(). What's up with that?\n", i); return 0; } if (!msg[i]) { iobroker_close(iobs, fd); return 0; } write(fd, msg[i], strlen(msg[i])); *counter = i; return 0; } static int listen_handler(int fd, int events, void *arg) { int sock; struct sockaddr_in sain; socklen_t addrlen; if (!arg || arg != iobs) { printf("Argument passing seems to fail spectacularly\n"); } addrlen = sizeof(sain); //printf("listen_handler(%d, %d, %p) called\n", fd, events, arg); sock = accept(fd, (struct sockaddr *)&sain, &addrlen); if (sock < 0) { perror("accept"); return -1; } write(sock, msg[0], strlen(msg[0])); iobroker_register(iobs, sock, iobs, echo_service); ok_int(iobroker_is_registered(iobs, sock), 1, "is_registered must be true"); return 0; } void sighandler(int sig) { /* test failed */ t_fail("Caught signal %d", sig); exit(t_end()); } #define NUM_PROCS 500 static int proc_counter[NUM_PROCS]; static int conn_spam(struct sockaddr_in *sain) { int i; #ifdef HAVE_SIGACTION struct sigaction sig_action; sig_action.sa_sigaction = NULL; sig_action.sa_handler = SIG_IGN; sigemptyset(&sig_action.sa_mask); sig_action.sa_flags = 0; sigaction(SIGPIPE, &sig_action, NULL); sig_action.sa_handler = sighandler; sigfillset(&sig_action.sa_mask); sig_action.sa_flags = SA_NODEFER|SA_RESTART; sigaction(SIGQUIT, &sig_action, NULL); sigaction(SIGINT, &sig_action, NULL); #else /* HAVE_SIGACTION */ signal(SIGALRM, sighandler); signal(SIGINT, sighandler); signal(SIGPIPE, SIG_IGN); #endif /* HAVE_SIGACTION */ alarm(20); for (i = 0; i < NUM_PROCS; i++) { int fd, sockopt = 1; fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); (void)setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &sockopt, sizeof(sockopt)); proc_counter[i] = 0; iobroker_register(iobs, fd, (void *)&proc_counter[i], connected_handler); if (connect(fd, (struct sockaddr *)sain, sizeof(*sain))) { perror("connect"); } iobroker_poll(iobs, -1); } return 0; } int main(int argc, char **argv) { int listen_fd, flags, sockopt = 1; struct sockaddr_in sain; int error; const char *err_msg; t_set_colors(0); t_start("iobroker ipc test"); error = iobroker_get_max_fds(NULL); ok_int(error, IOBROKER_ENOSET, "test errors when passing null"); err_msg = iobroker_strerror(error); test(err_msg && !strcmp(err_msg, iobroker_errors[(~error) + 1].string), "iobroker_strerror() returns the right string"); iobs = iobroker_create(); error = iobroker_get_max_fds(iobs); test(iobs && error >= 0, "max fd's for real iobroker set must be > 0"); listen_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); flags = fcntl(listen_fd, F_GETFD); flags |= FD_CLOEXEC; fcntl(listen_fd, F_SETFD, flags); (void)setsockopt(listen_fd, SOL_SOCKET, SO_REUSEADDR, &sockopt, sizeof(sockopt)); memset(&sain, 0, sizeof(sain)); sain.sin_port = ntohs(9123); sain.sin_family = AF_INET; bind(listen_fd, (struct sockaddr *)&sain, sizeof(sain)); listen(listen_fd, 128); iobroker_register(iobs, listen_fd, iobs, listen_handler); if (argc == 1) conn_spam(&sain); for (;;) { iobroker_poll(iobs, -1); if (iobroker_get_num_fds(iobs) <= 1) { break; } } iobroker_close(iobs, listen_fd); iobroker_destroy(iobs, 0); t_end(); return 0; } nagios-4.3.4/lib/test-iocache.c000066400000000000000000000053301314764422400162740ustar00rootroot00000000000000#include #include #include "iocache.c" #include "t-utils.h" struct strcode { char *str; unsigned int len; }; #define ADDSTR(str) { str, sizeof(str) - 1 } static int test_delimiter(const char *delim, unsigned int delim_len) { struct strcode sc[] = { ADDSTR("Charlie Chaplin"), ADDSTR("Madonna Something something"), ADDSTR("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla turpis augue, laoreet eleifend ultricies et, tincidunt non felis. Suspendisse vitae accumsan dolor. Vivamus posuere venenatis dictum. Integer hendrerit est eget turpis scelerisque porttitor. Donec ullamcorper sodales purus, sed bibendum odio porttitor sit amet. Donec pretium sem ac sapien iaculis feugiat. Quisque commodo consequat quam, ac cursus est sodales euismod. Sed nec massa felis, sit amet varius dui. Morbi fermentum varius tellus, eget tempus felis imperdiet quis. Praesent congue auctor ligula, a tempor ipsum malesuada at. Proin pharetra tempor adipiscing. Aenean egestas tellus vitae arcu sagittis non ultrices turpis cursus."), ADDSTR("Emma Blomqvist"), ADDSTR("Random message"), ADDSTR("Random\0message\0with\0nuls\0embedded"), { NULL, 0, }, }; int i; iocache *ioc; ioc = iocache_create(512 * 1024); if (!test(ioc != NULL, "iocache_create must work")) crash("can't test with no available memory"); for (i = 0; sc[i].str; i++) { memcpy(&ioc->ioc_buf[ioc->ioc_buflen], sc[i].str, sc[i].len); ioc->ioc_buflen += sc[i].len; memcpy(ioc->ioc_buf + ioc->ioc_buflen, delim, delim_len); ioc->ioc_buflen += delim_len; } for (i = 0; sc[i].str; i++) { char *ptr; unsigned long len; int error = 0; ptr = iocache_use_delim(ioc, delim, delim_len, &len); t_req(ptr != NULL); if (!ptr) { printf("Null pointer. What weird shit is this??\n"); exit(1); } test(len == sc[i].len, "len check, string %d, delim_len %d", i, delim_len); test(!memcmp(ptr, sc[i].str, len), "memcmp() check, string %d, delim_len %d", i, delim_len); if (error) { printf("delim_len: %d. i: %d; len: %lu; sc[i].len: %d\n", delim_len, i, len, sc[i].len); printf("sc[i].str: %s\n", sc[i].str); printf("ptr : %s\n", ptr); printf("strlen(sc[i].str): %lu\n", (unsigned long)strlen(sc[i].str)); printf("strlen(ptr) : %lu\n", (unsigned long)strlen(ptr)); exit(1); } } iocache_destroy(ioc); return 0; } int main(int argc, char **argv) { unsigned int i; struct strcode sc[] = { ADDSTR("\n"), ADDSTR("\0\0"), ADDSTR("XXXxXXX"), ADDSTR("LALALALALALALAKALASBALLE\n"), }; t_set_colors(0); t_start("iocache_use_delim() test"); for (i = 0; i < ARRAY_SIZE(sc); i++) { t_start("Testing delimiter of len %d", sc[i].len); test_delimiter(sc[i].str, sc[i].len); t_end(); } return t_end(); } nagios-4.3.4/lib/test-kvvec.c000066400000000000000000000075711314764422400160300ustar00rootroot00000000000000#include #include #include #include #include "kvvec.c" #include "t-utils.h" static int walking_steps, walks; static int walker(struct key_value *kv, void *discard) { static struct kvvec *vec = (void *)1; static int step; walking_steps++; if (vec != discard) { walks++; vec = (struct kvvec *)discard; step = 0; } if (discard && vec) { t_ok(!kv_compare(&vec->kv[step], kv), "step %d on walk %d", step, walks); } step++; return 0; } #define KVSEP '=' #define PAIRSEP '\0' #define OVERALLOC 2 static const char *test_data[] = { "lala=trudeldudel", "foo=bar", "LOTS AND LOTS OF CAPS WITH SPACES=weird", "key=value", "something-random=pre-determined luls", "string=with\nnewlines\n\n\nand\nlots\nof\nthem\ntoo\n", "tabs= this and that and three in a row", NULL, }; static const char *pair_term_missing[] = { "foo=bar;lul=bar;haha=lulu", "foo=bar;lul=bar;haha=lulu;", "hobbit=palace;gandalf=wizard1", "hobbit=palace;gandalf=wizard1;", "0=0;1=1;2=2;3=3;4=4", "0=0;1=1;2=2;3=3;4=4;", NULL, }; static void add_vars(struct kvvec *kvv, const char **ary, int len) { int i; for (i = 0; i < len && ary[i]; i++) { char *arg = strdup(test_data[i]); char *eq = strchr(arg, '='); if (eq) { *eq++ = 0; } kvvec_addkv(kvv, strdup(arg), eq ? strdup(eq) : NULL); free(arg); } } int main(int argc, char **argv) { int i, j; struct kvvec *kvv, *kvv2, *kvv3; struct kvvec_buf *kvvb, *kvvb2; struct kvvec k = KVVEC_INITIALIZER; t_set_colors(0); t_start("key/value vector tests"); kvv = kvvec_create(1); ok_int(kvvec_capacity(kvv), 1, "capacity of one should be guaranteed"); kvv2 = kvvec_create(1); kvv3 = kvvec_create(1); add_vars(kvv, test_data, 1239819); add_vars(kvv, (const char **)argv + 1, argc - 1); kvvec_sort(kvv); kvvec_foreach(kvv, NULL, walker); /* kvvec2buf -> buf2kvvec -> kvvec2buf -> buf2kvvec conversion */ kvvb = kvvec2buf(kvv, KVSEP, PAIRSEP, OVERALLOC); kvv3 = buf2kvvec(kvvb->buf, kvvb->buflen, KVSEP, PAIRSEP, KVVEC_COPY); kvvb2 = kvvec2buf(kvv3, KVSEP, PAIRSEP, OVERALLOC); buf2kvvec_prealloc(kvv2, kvvb->buf, kvvb->buflen, KVSEP, PAIRSEP, KVVEC_ASSIGN); kvvec_foreach(kvv2, kvv, walker); kvvb = kvvec2buf(kvv, KVSEP, PAIRSEP, OVERALLOC); test(kvv->kv_pairs == kvv2->kv_pairs, "pairs should be identical"); for (i = 0; i < kvv->kv_pairs; i++) { struct key_value *kv1, *kv2; kv1 = &kvv->kv[i]; if (i >= kvv2->kv_pairs) { t_fail("missing var %d in kvv2", i); printf("[%s=%s] (%d+%d)\n", kv1->key, kv1->value, kv1->key_len, kv1->value_len); continue; } kv2 = &kvv2->kv[i]; if (!test(!kv_compare(kv1, kv2), "kv pair %d must match", i)) { printf("%d failed: [%s=%s] (%d+%d) != [%s=%s (%d+%d)]\n", i, kv1->key, kv1->value, kv1->key_len, kv1->value_len, kv2->key, kv2->value, kv2->key_len, kv2->value_len); } } test(kvvb2->buflen == kvvb->buflen, "buflens must match"); test(kvvb2->bufsize == kvvb->bufsize, "bufsizes must match"); if (kvvb2->buflen == kvvb->buflen && kvvb2->bufsize == kvvb->bufsize && !memcmp(kvvb2->buf, kvvb->buf, kvvb->bufsize)) { t_pass("kvvec -> buf -> kvvec conversion works flawlessly"); } else { t_fail("kvvec -> buf -> kvvec conversion failed :'("); } free(kvvb->buf); free(kvvb); free(kvvb2->buf); free(kvvb2); kvvec_destroy(kvv, 1); kvvec_destroy(kvv3, KVVEC_FREE_ALL); for (j = 0; pair_term_missing[j]; j++) { buf2kvvec_prealloc(&k, strdup(pair_term_missing[j]), strlen(pair_term_missing[j]), '=', ';', KVVEC_COPY); for (i = 0; i < k.kv_pairs; i++) { struct key_value *kv = &k.kv[i]; test(kv->key_len == kv->value_len, "%d.%d; key_len=%d; value_len=%d (%s = %s)", j, i, kv->key_len, kv->value_len, kv->key, kv->value); test(kv->value_len == (int)strlen(kv->value), "%d.%d; kv->value_len(%d) == strlen(%s)(%d)", j, i, kv->value_len, kv->value, (int)strlen(kv->value)); } } t_end(); return 0; } nagios-4.3.4/lib/test-nsutils.c000066400000000000000000000017721314764422400164100ustar00rootroot00000000000000#define _GNU_SOURCE #include #include "nsutils.c" #include "t-utils.h" #include #include int main(int argc, char **argv) { struct timeval start, stop; float f_delta; int msec_delta; char *s1; const char *s2; t_set_colors(0); t_verbose = 1; t_start("tv_delta tests"); stop.tv_sec = start.tv_sec = time(NULL); stop.tv_usec = 2500; start.tv_usec = 0; msec_delta = tv_delta_msec(&start, &stop); t_ok(msec_delta == 2, "tv_delta_msec()"); f_delta = tv_delta_f(&start, &stop) * 1000; t_ok((double)f_delta == (double)2.5, "tv_delta_f() * 1000 is %.2f and should be 2.5", f_delta); gettimeofday(&start, NULL); memcpy(&stop, &start, sizeof(start)); stop.tv_sec += 100; asprintf(&s1, "arg varg foo %d", 12); s2 = mkstr("arg varg foo %d", 12); ok_str(s1, s2, "mkstr() must build proper strings"); if (real_online_cpus() > 0) { t_pass("%d online cpus detected", real_online_cpus()); } else { t_fail("Can't determine the number of online cpus"); } return t_end(); } nagios-4.3.4/lib/test-runcmd.c000066400000000000000000000125201314764422400161700ustar00rootroot00000000000000#define _GNU_SOURCE #include "runcmd.c" #include "t-utils.h" #include #define BUF_SIZE 1024 #if defined(__sun) && defined(__SVR4) /* Assume we have GNU echo from OpenCSW at this location on Solaris. */ #define ECHO_COMMAND "/opt/csw/gnu/echo" #else /* Otherwise we'll try to get away with a default. This is GNU echo on Leenooks. */ #define ECHO_COMMAND "/bin/echo" #endif struct { char *input; char *output; } cases[] = { {"test0\\", "test0"}, {"te\\st1", "test1"}, {"te\\\\st2", "te\\st2"}, {"te\\\\\\st3", "te\\st3"}, {"te\\\\\\\\st4", "te\\\\st4"}, {"\"te\\st5\"", "te\\st5"}, {"\"te\\\\st6\"", "te\\st6"}, {"\"te\\\\\\st7\"", "te\\\\st7"}, {"\"te\\\\\\\\st8\"", "te\\\\st8"}, {"'te\\st9'", "te\\st9"}, {"'te\\\\st10'", "te\\\\st10"}, {"'te\\\\\\st11'", "te\\\\\\st11"}, {"'te\\\\\\\\st12'", "te\\\\\\\\st12"}, {"\\'te\\\\st13", "'te\\st13"}, {"'test14\"'", "test14\""}, {"\"\\\\test\"", "\\test"}, {NULL, NULL}, }; struct { int ret; char *cmd; } anomaly[] = { { RUNCMD_HAS_REDIR, "cat lala | grep foo" }, { 0, "cat lala \\| grep foo" }, { RUNCMD_HAS_REDIR, "cat lala > foo" }, { 0, "cat lala \\> foo" }, { RUNCMD_HAS_REDIR, "cat lala >> foo" }, { 0, "cat lala \\>\\> foo" }, { RUNCMD_HAS_REDIR, "something < bar" }, { 0, "something \\< bar" }, { RUNCMD_HAS_JOBCONTROL, "foo && bar" }, { 0, "foo \\&\\& bar" }, { RUNCMD_HAS_JOBCONTROL, "foo & bar" }, { 0, "foo \\& bar" }, { RUNCMD_HAS_JOBCONTROL, "lala foo ; bar" }, { 0, "lala 'foo; bar'" }, { RUNCMD_HAS_SUBCOMMAND, "foo \"`extcmd1`\"" }, { 0, "foo \"\\`extcmd1\\`\"" }, { RUNCMD_HAS_SUBCOMMAND, "foo `extcmd2`" }, { 0, "foo \\`extcmd2\\`" }, { RUNCMD_HAS_SUBCOMMAND, "foo \"$(extcmd3)\"" }, { 0, "foo \\$\\(extcmd3\\)" }, { RUNCMD_HAS_SUBCOMMAND | RUNCMD_HAS_PAREN, "foo $(extcmd4" }, { 0, "foo \\$\\(extcmd4\\)" }, { RUNCMD_HAS_UBDQ, "foo\" bar" }, { 0, "foo\\\" bar" }, { RUNCMD_HAS_UBSQ, "foo' bar" }, { 0, "foo\\' bar" }, { RUNCMD_HAS_WILDCARD, "ls -l /tmp/*" }, { 0, "ls -l /tmp/\\*" }, { RUNCMD_HAS_WILDCARD, "ls -l /dev/tty?" }, { 0, "ls -l /dev/tty\\?" }, { RUNCMD_HAS_SHVAR, "echo $foo" }, { 0, "echo \\$foo" }, { RUNCMD_HAS_PAREN, "\\$(hoopla booyaka" }, { 0, "\\$\\(hoopla booyaka" }, { RUNCMD_HAS_JOBCONTROL, "a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a&a"}, { 0, "a\\&a\\&a\\&a\\&a\\&a\\&a\\&a\\&a\\&a\\&a\\&a\\&a\\&a\\&a\\&a\\&a\\&a\\&a\\&a\\&a\\&a\\&a"}, { 0, NULL}, }; struct { int ret; char *cmd; int argc_exp; char *argv_exp[10]; } parse_case[] = { { 0, "foo bar nisse", 3, { "foo", "bar", "nisse", NULL }}, { 0, "foo\\ bar nisse", 2, { "foo bar", "nisse", NULL }}, { 0, "\"\\\\foo\"", 1, { "\\foo", NULL }}, { 0, "\"\\1bs in dq\"", 1, { "\\1bs in dq", NULL }}, { 0, "\"\\\\2bs in dq\"", 1, { "\\2bs in dq", NULL }}, { 0, "\"\\\\\\3bs in dq\"", 1, { "\\\\3bs in dq", NULL }}, { 0, "\"\\\\\\\\4bs in dq\"", 1, { "\\\\4bs in dq", NULL }}, { 0, "\\ \t \\\t \\ ", 3, { " ", "\t", " ", NULL }}, { 0, "\\$foo walla wonga", 3, { "$foo", "walla", "wonga", NULL }}, { 0, "\"\\$bar is\" very wide open", 4, { "$bar is", "very", "wide", "open", NULL }}, { 0, "VAR=VAL some command", 3, { "VAR=VAL", "some", "command", NULL}}, { RUNCMD_HAS_SHVAR, "VAR=VAL some use of $VAR", 5, { "VAR=VAL", "some", "use", "of", "$VAR", NULL}}, { RUNCMD_HAS_SHVAR, "VAR=$VAL some use of $VAR", 5, { "VAR=$VAL", "some", "use", "of", "$VAR", NULL}}, { RUNCMD_HAS_SHVAR | RUNCMD_HAS_WILDCARD, "VAR=\"$VAL\" a wilder\\ command*", 3, { "VAR=$VAL", "a", "wilder command*", NULL}}, { 0, NULL, 0, { NULL, NULL, NULL }}, }; /* We need an iobreg callback to pass to runcmd_open(). */ static void stub_iobreg(int fdout, int fderr, void *arg) { } int main(int argc, char **argv) { int ret, r2; runcmd_init(); t_set_colors(0); t_start("exec output comparison"); { int i; char *out = calloc(1, BUF_SIZE); for (i = 0; cases[i].input != NULL; i++) { memset(out, 0, BUF_SIZE); int pfd[2] = {-1, -1}, pfderr[2] = {-1, -1}; /* We need a stub iobregarg since runcmd_open()'s prototype * declares it attribute non-null. */ int stub_iobregarg = 0; int fd; char *cmd; asprintf(&cmd, ECHO_COMMAND " -n %s", cases[i].input); fd = runcmd_open(cmd, pfd, pfderr, NULL, stub_iobreg, &stub_iobregarg); free(cmd); read(pfd[0], out, BUF_SIZE); ok_str(cases[i].output, out, "Echoing a command should give expected output"); close(pfd[0]); close(pfderr[0]); close(fd); } free(out); } ret = t_end(); t_reset(); t_start("anomaly detection"); { int i; for (i = 0; anomaly[i].cmd; i++) { int out_argc; char *out_argv[256]; int result = runcmd_cmd2strv(anomaly[i].cmd, &out_argc, out_argv); ok_int(result, anomaly[i].ret, anomaly[i].cmd); if (out_argv[0]) free(out_argv[0]); } } r2 = t_end(); ret = r2 ? r2 : ret; t_reset(); t_start("argument splitting"); { int i; for (i = 0; parse_case[i].cmd; i++) { int x, out_argc; char *out_argv[256]; int result = runcmd_cmd2strv(parse_case[i].cmd, &out_argc, out_argv); /*out_argv[out_argc] = NULL;*//* This must be NULL terminated already. */ ok_int(result, parse_case[i].ret, parse_case[i].cmd); ok_int(out_argc, parse_case[i].argc_exp, parse_case[i].cmd); for (x = 0; x < parse_case[x].argc_exp && out_argv[x]; x++) { ok_str(parse_case[i].argv_exp[x], out_argv[x], "argv comparison test"); } if (out_argv[0]) free(out_argv[0]); } } r2 = t_end(); return r2 ? r2 : ret; } nagios-4.3.4/lib/test-squeue.c000066400000000000000000000105421314764422400162110ustar00rootroot00000000000000/* * we include the c source file to get at the opaque types and * api functions */ #include #include #include #include #include #include #include #include "squeue.c" #include "t-utils.h" static void squeue_foreach(squeue_t *q, int (*walker)(squeue_event *, void *), void *arg) { squeue_t *dup; void *e, *dup_d; dup = squeue_create(q->size); dup_d = dup->d; memcpy(dup, q, sizeof(*q)); dup->d = dup_d; memcpy(dup->d, q->d, (q->size * sizeof(void *))); while ((e = pqueue_pop(dup))) { walker(e, arg); } squeue_destroy(dup, 0); } #define t(expr, args...) \ do { \ if ((expr)) { \ t_pass(#expr); \ } else { \ t_fail(#expr " @%s:%d", __FILE__, __LINE__); \ } \ } while(0) typedef struct sq_test_event { unsigned long id; squeue_event *evt; } sq_test_event; static time_t sq_high = 0; static int sq_walker(squeue_event *evt, void *arg) { static int walks = 0; walks++; t(sq_high <= evt->when.tv_sec, "sq_high: %lu; evt->when: %lu\n", sq_high, evt->when.tv_sec); sq_high = (unsigned long)evt->when.tv_sec; return 0; } #define EVT_ARY 65101 static int sq_test_random(squeue_t *sq) { unsigned long size, i; unsigned long long numbers[EVT_ARY], *d, max = 0; struct timeval now; size = squeue_size(sq); now.tv_sec = time(NULL); srand((int)now.tv_sec); for (i = 0; i < EVT_ARY; i++) { now.tv_usec = (time_t)rand(); squeue_add_tv(sq, &now, &numbers[i]); numbers[i] = evt_compute_pri(&now); t(squeue_size(sq) == i + 1 + size); } t(pqueue_is_valid(sq)); /* * make sure we pop events in increasing "priority", * since we calculate priority based on time and later * is lower prio */ for (i = 0; i < EVT_ARY; i++) { d = (unsigned long long *)squeue_pop(sq); t(max <= *d, "popping randoms. i: %lu; delta: %lld; max: %llu; *d: %llu\n", i, max - *d, max, *d); max = *d; t(squeue_size(sq) == size + (EVT_ARY - i - 1)); } t(pqueue_is_valid(sq)); return 0; } int main(int argc, char **argv) { squeue_t *sq; struct timeval tv; sq_test_event a, b, c, d, *x; t_set_colors(0); t_start("squeue tests"); a.id = 1; b.id = 2; c.id = 3; d.id = 4; gettimeofday(&tv, NULL); /* Order in is a, b, c, d, but we should get b, c, d, a out. */ srand(tv.tv_usec ^ tv.tv_sec); t((sq = squeue_create(1024)) != NULL); t(squeue_size(sq) == 0); /* we fill and empty the squeue completely once before testing */ sq_test_random(sq); t(squeue_size(sq) == 0, "Size should be 0 after first sq_test_random"); t((a.evt = squeue_add(sq, time(NULL) + 9, &a)) != NULL); t(squeue_size(sq) == 1); t((b.evt = squeue_add(sq, time(NULL) + 3, &b)) != NULL); t(squeue_size(sq) == 2); t((c.evt = squeue_add_msec(sq, time(NULL) + 5, 0, &c)) != NULL); t(squeue_size(sq) == 3); t((d.evt = squeue_add_usec(sq, time(NULL) + 5, 1, &d)) != NULL); t(squeue_size(sq) == 4); /* add and remove lots. remainder should be what we have above */ sq_test_random(sq); /* testing squeue_peek() */ t((x = (sq_test_event *)squeue_peek(sq)) != NULL); t(x == &b, "x: %p; a: %p; b: %p; c: %p; d: %p\n", x, &a, &b, &c, &d); t(x->id == b.id); t(squeue_size(sq) == 4); /* testing squeue_remove() and re-add */ t(squeue_remove(sq, b.evt) == 0); t(squeue_size(sq) == 3); t((x = squeue_peek(sq)) != NULL); t(x == &c); t((b.evt = squeue_add(sq, time(NULL) + 3, &b)) != NULL); t(squeue_size(sq) == 4); /* peek should now give us the &b event (again) */ t((x = squeue_peek(sq)) != NULL); if (x != &b) { printf("about to fail pretty fucking hard...\n"); printf("ea: %p; &b: %p; &c: %p; ed: %p; x: %p\n", &a, &b, &c, &d, x); } t(x == &b); t(x->id == b.id); t(squeue_size(sq) == 4); /* testing squeue_pop(), lifo manner */ t((x = squeue_pop(sq)) != NULL); t(squeue_size(sq) == 3, "squeue_size(sq) = %d\n", squeue_size(sq)); t(x == &b, "x: %p; &b: %p\n", x, &b); t(x->id == b.id, "x->id: %lu; d.id: %lu\n", x->id, d.id); /* Test squeue_pop() */ t((x = squeue_pop(sq)) != NULL); t(squeue_size(sq) == 2); t(x == &c, "x->id: %lu; c.id: %lu\n", x->id, c.id); t(x->id == c.id, "x->id: %lu; c.id: %lu\n", x->id, c.id); /* this should fail gracefully (-1 return from squeue_remove()) */ t(squeue_remove(NULL, NULL) == -1); t(squeue_remove(NULL, a.evt) == -1); squeue_foreach(sq, sq_walker, NULL); /* clean up to prevent false valgrind positives */ squeue_destroy(sq, 0); return t_end(); } nagios-4.3.4/lib/worker.c000066400000000000000000000515671314764422400152520ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include #include "libnagios.h" #define MSG_DELIM "\1\0\0" /**< message limiter - note this ends up being \1\0\0\0 on the wire as "" strings null-terminate */ #define MSG_DELIM_LEN (sizeof(MSG_DELIM)) /**< message delimiter length - 4, not 3 */ #define PAIR_SEP 0 /**< pair separator for buf2kvvec() and kvvec2buf() */ #define KV_SEP '=' /**< key/value separator for buf2kvvec() and kvvec2buf() */ struct execution_information { squeue_event *sq_event; pid_t pid; int state; struct timeval start; struct timeval stop; float runtime; struct rusage rusage; }; static iobroker_set *iobs; static squeue_t *sq; static unsigned int started, running_jobs, timeouts, reapable; static int master_sd; static int parent_pid; static fanout_table *ptab; static void exit_worker(int code, const char *msg) { child_process *cp; int discard; #ifdef HAVE_SIGACTION struct sigaction sig_action; #endif if (msg) { perror(msg); } /* * We must kill our children, so let's embark on that * large scale filicide. Each process should be in a * process group of its own, so we can signal not only * the plugin but also all of its children. */ #ifdef HAVE_SIGACTION sig_action.sa_sigaction = NULL; sig_action.sa_handler = SIG_IGN; sigemptyset(&sig_action.sa_mask); sig_action.sa_flags = 0; sigaction(SIGTERM, &sig_action, NULL); sigaction(SIGSEGV, &sig_action, NULL); #else signal(SIGTERM, SIG_IGN); signal(SIGSEGV, SIG_IGN); #endif kill(0, SIGTERM); while (waitpid(-1, &discard, WNOHANG) > 0) ; /* do nothing */ sleep(1); while ((cp = (child_process *)squeue_pop(sq))) { /* kill all processes in the child's process group */ (void)kill(-cp->ei->pid, SIGKILL); } sleep(1); while (waitpid(-1, &discard, WNOHANG) > 0) ; /* do nothing */ exit(code); } /* * write a log message to master. * Note that this will break if we change delimiters someday, * but avoids doing several extra malloc()+free() for this * pretty simple case. */ __attribute__((__format__(__printf__, 1, 2))) static void wlog(const char *fmt, ...) { #define LOG_KEY_LEN 4 static char lmsg[8192] = "log="; int len; va_list ap; va_start(ap, fmt); len = vsnprintf(lmsg + LOG_KEY_LEN, sizeof(lmsg) - LOG_KEY_LEN - MSG_DELIM_LEN, fmt, ap); va_end(ap); if (len < 0) { /* We can't send what we can't print. */ return; } len += LOG_KEY_LEN; /* log= */ if (len > sizeof(lmsg) - MSG_DELIM_LEN - 1) { /* A truncated log is better than no log or buffer overflows. */ len = sizeof(lmsg) - MSG_DELIM_LEN - 1; } /* Add the kv pair separator and the message delimiter. */ lmsg[len] = 0; len++; memcpy(lmsg + len, MSG_DELIM, MSG_DELIM_LEN); len += MSG_DELIM_LEN; if (write(master_sd, lmsg, len) < 0 && errno == EPIPE) { /* Master has died or abandoned us, so exit. */ exit_worker(1, "Failed to write() to master"); } } __attribute__((__format__(__printf__, 3, 4))) static void job_error(child_process *cp, struct kvvec *kvv, const char *fmt, ...) { char msg[4096]; int len; va_list ap; va_start(ap, fmt); len = vsnprintf(msg, sizeof(msg), fmt, ap); va_end(ap); if (len < 0) { /* We can't send what we can't print. */ kvvec_destroy(kvv, 0); return; } if (len > sizeof(msg) - 1) { /* A truncated log is better than no log or buffer overflows. */ len = sizeof(msg) - 1; } msg[len] = 0; if (cp) { kvvec_addkv(kvv, "job_id", mkstr("%d", cp->id)); } kvvec_addkv_wlen(kvv, "error_msg", 9, msg, len); if (worker_send_kvvec(master_sd, kvv) < 0 && errno == EPIPE) { /* Master has died or abandoned us, so exit. */ exit_worker(1, "Failed to send job error key/value vector to master"); } kvvec_destroy(kvv, 0); } struct kvvec_buf *build_kvvec_buf(struct kvvec *kvv) { struct kvvec_buf *kvvb; /* * key=value, separated by PAIR_SEP and messages * delimited by MSG_DELIM */ kvvb = kvvec2buf(kvv, KV_SEP, PAIR_SEP, MSG_DELIM_LEN); if (!kvvb) { return NULL; } memcpy(kvvb->buf + (kvvb->bufsize - MSG_DELIM_LEN), MSG_DELIM, MSG_DELIM_LEN); return kvvb; } int worker_send_kvvec(int sd, struct kvvec *kvv) { int ret; struct kvvec_buf *kvvb; kvvb = build_kvvec_buf(kvv); if (!kvvb) return -1; /* bufsize, not buflen, as it gets us the delimiter */ /* ret = write(sd, kvvb->buf, kvvb->bufsize); */ ret = nwrite(sd, kvvb->buf, kvvb->bufsize,NULL); free(kvvb->buf); free(kvvb); return ret; } int send_kvvec(int sd, struct kvvec *kvv) { return worker_send_kvvec(sd, kvv); } char *worker_ioc2msg(iocache *ioc, unsigned long *size, int flags) { return iocache_use_delim(ioc, MSG_DELIM, MSG_DELIM_LEN, size); } int worker_buf2kvvec_prealloc(struct kvvec *kvv, char *buf, unsigned long len, int kvv_flags) { return buf2kvvec_prealloc(kvv, buf, len, KV_SEP, PAIR_SEP, kvv_flags); } #define kvvec_add_long(kvv, key, value) \ do { \ const char *buf = mkstr("%ld", value); \ kvvec_addkv_wlen(kvv, key, sizeof(key) - 1, buf, strlen(buf)); \ } while (0) #define kvvec_add_tv(kvv, key, value) \ do { \ const char *buf = mkstr("%ld.%06ld", value.tv_sec, value.tv_usec); \ kvvec_addkv_wlen(kvv, key, sizeof(key) - 1, buf, strlen(buf)); \ } while (0) /* forward declaration */ static void gather_output(child_process *cp, iobuf *io, int final); static void destroy_job(child_process *cp) { /* * we must remove the job's timeout ticker, * or we'll end up accessing an already free()'d * pointer, or the pointer to a different child. */ squeue_remove(sq, cp->ei->sq_event); running_jobs--; fanout_remove(ptab, cp->ei->pid); if (cp->outstd.buf) { free(cp->outstd.buf); cp->outstd.buf = NULL; } if (cp->outerr.buf) { free(cp->outerr.buf); cp->outerr.buf = NULL; } if(NULL != cp->env) kvvec_destroy(cp->env, KVVEC_FREE_ALL); kvvec_destroy(cp->request, KVVEC_FREE_ALL); free(cp->cmd); free(cp->ei); free(cp); } #define strip_nul_bytes(io) \ do { \ char *nul; \ if (!io.buf || !*io.buf) \ io.len = 0; \ else if ((nul = memchr(io.buf, 0, io.len))) { \ io.len = (unsigned long)nul - (unsigned long)io.buf; \ } \ } while (0) int finish_job(child_process *cp, int reason) { static struct kvvec resp = KVVEC_INITIALIZER; struct rusage *ru = &cp->ei->rusage; int i, ret; /* get rid of still open filedescriptors */ if (cp->outstd.fd != -1) { gather_output(cp, &cp->outstd, 1); iobroker_close(iobs, cp->outstd.fd); } if (cp->outerr.fd != -1) { gather_output(cp, &cp->outerr, 1); iobroker_close(iobs, cp->outerr.fd); } /* Make sure network-supplied data doesn't contain nul bytes */ strip_nul_bytes(cp->outstd); strip_nul_bytes(cp->outerr); /* how many key/value pairs do we need? */ if (kvvec_init(&resp, 12 + cp->request->kv_pairs) == NULL) { /* what the hell do we do now? */ exit_worker(1, "Failed to init response key/value vector"); } gettimeofday(&cp->ei->stop, NULL); if (running_jobs != squeue_size(sq)) { wlog("running_jobs(%d) != squeue_size(sq) (%d)\n", running_jobs, squeue_size(sq)); wlog("started: %d; running: %d; finished: %d\n", started, running_jobs, started - running_jobs); } cp->ei->runtime = tv_delta_f(&cp->ei->start, &cp->ei->stop); /* * Now build the return message. * First comes the request, minus environment variables */ for (i = 0; i < cp->request->kv_pairs; i++) { struct key_value *kv = &cp->request->kv[i]; /* skip environment macros */ if (kv->key_len == 3 && !strcmp(kv->key, "env")) { continue; } kvvec_addkv_wlen(&resp, kv->key, kv->key_len, kv->value, kv->value_len); } kvvec_addkv(&resp, "wait_status", mkstr("%d", cp->ret)); kvvec_add_tv(&resp, "start", cp->ei->start); kvvec_add_tv(&resp, "stop", cp->ei->stop); kvvec_addkv(&resp, "runtime", mkstr("%f", cp->ei->runtime)); if (!reason) { /* child exited nicely (or with a signal, so check wait_status) */ kvvec_addkv(&resp, "exited_ok", "1"); kvvec_add_tv(&resp, "ru_utime", ru->ru_utime); kvvec_add_tv(&resp, "ru_stime", ru->ru_stime); kvvec_add_long(&resp, "ru_minflt", ru->ru_minflt); kvvec_add_long(&resp, "ru_majflt", ru->ru_majflt); kvvec_add_long(&resp, "ru_inblock", ru->ru_inblock); kvvec_add_long(&resp, "ru_oublock", ru->ru_oublock); } else { /* some error happened */ kvvec_addkv(&resp, "exited_ok", "0"); kvvec_addkv(&resp, "error_code", mkstr("%d", reason)); } kvvec_addkv_wlen(&resp, "outerr", 6, cp->outerr.buf, cp->outerr.len); kvvec_addkv_wlen(&resp, "outstd", 6, cp->outstd.buf, cp->outstd.len); ret = worker_send_kvvec(master_sd, &resp); if (ret < 0 && errno == EPIPE) exit_worker(1, "Failed to send kvvec struct to master"); return 0; } static int check_completion(child_process *cp, int flags) { int result, status; if (!cp || !cp->ei->pid) { return 0; } /* * we mustn't let EINTR interrupt us, since it could well * be a SIGCHLD from the properly exiting process doing it */ do { errno = 0; result = wait4(cp->ei->pid, &status, flags, &cp->ei->rusage); } while (result < 0 && errno == EINTR); if (result == cp->ei->pid || (result < 0 && errno == ECHILD)) { cp->ret = status; finish_job(cp, 0); destroy_job(cp); return 0; } if (!result) return -1; return -errno; } /* * "What can the harvest hope for, if not for the care * of the Reaper Man?" * -- Terry Pratchett, Reaper Man * * We end up here no matter if the job is stale (ie, the child is * stuck in uninterruptable sleep) or if it's the first time we try * to kill it. * A job is considered reaped once we reap our direct child, in * which case init will become parent of our grandchildren. * It's also considered fully reaped if kill() results in ESRCH or * EPERM, or if wait()ing for the process group results in ECHILD. */ static void kill_job(child_process *cp, int reason) { int ret, status, reaped = 0; int pid = cp ? cp->ei->pid : 0; /* * first attempt at reaping, so see if we just failed to * notice that things were going wrong her */ if (reason == ETIME && !check_completion(cp, WNOHANG)) { timeouts++; wlog("job %d with pid %d reaped at timeout. timeouts=%u; started=%u", cp->id, pid, timeouts, started); return; } /* brutal but efficient */ if (kill(-cp->ei->pid, SIGKILL) < 0) { if (errno == ESRCH) { reaped = 1; } else { wlog("kill(-%ld, SIGKILL) failed: %s\n", (long)cp->ei->pid, strerror(errno)); } } /* * we must iterate at least once, in case kill() returns * ESRCH when there's zombies */ do { ret = waitpid(cp->ei->pid, &status, WNOHANG); if (ret < 0 && errno == EINTR) continue; if (ret == cp->ei->pid || (ret < 0 && errno == ECHILD)) { reaped = 1; break; } if (!ret) { struct timeval tv; gettimeofday(&tv, NULL); /* * stale process (signal may not have been delivered, or * the child can be stuck in uninterruptible sleep). We * can't hang around forever, so just reschedule a new * reap attempt later. */ if (reason == ESTALE) { wlog("tv.tv_sec is currently %llu", (unsigned long long)tv.tv_sec); tv.tv_sec += 5; wlog("Failed to reap child with pid %ld. Next attempt @ %llu.%lu", (long)cp->ei->pid, (unsigned long long)tv.tv_sec, (unsigned long)tv.tv_usec); } else { tv.tv_usec = 250000; if (tv.tv_usec > 1000000) { tv.tv_usec -= 1000000; tv.tv_sec += 1; } cp->ei->state = ESTALE; finish_job(cp, reason); } squeue_remove(sq, cp->ei->sq_event); cp->ei->sq_event = squeue_add_tv(sq, &tv, cp); return; } } while (!reaped); if (cp->ei->state != ESTALE) finish_job(cp, reason); else wlog("job %d (pid=%ld): Dormant child reaped", cp->id, (long)cp->ei->pid); destroy_job(cp); } static void gather_output(child_process *cp, iobuf *io, int final) { int retry = 5; for (;;) { char buf[4096]; int rd; rd = read(io->fd, buf, sizeof(buf)); if (rd < 0) { if (errno == EAGAIN && !final) break; if (errno == EINTR || errno == EAGAIN) { char buf[1024]; if (--retry == 0) { sprintf(buf, "job %d (pid=%ld): Failed to read(): %s", cp->id, (long)cp->ei->pid, strerror(errno)); break; } sprintf(buf, "job %d (pid=%ld): read() returned error %d", cp->id, (long)cp->ei->pid, errno); syslog(LOG_NOTICE, "%s", buf); sleep(1); continue; } if (!final && errno != EAGAIN) wlog("job %d (pid=%ld): Failed to read(): %s", cp->id, (long)cp->ei->pid, strerror(errno)); } if (rd > 0) { /* we read some data */ io->buf = realloc(io->buf, rd + io->len + 1); memcpy(&io->buf[io->len], buf, rd); io->len += rd; io->buf[io->len] = '\0'; } /* * Close down on bad, zero and final reads (we don't get * EAGAIN, so all errors are really unfixable) */ if (rd <= 0 || final) { iobroker_close(iobs, io->fd); io->fd = -1; if (!final) check_completion(cp, WNOHANG); break; } break; } } static int stderr_handler(int fd, int events, void *cp_) { child_process *cp = (child_process *)cp_; gather_output(cp, &cp->outerr, 0); return 0; } static int stdout_handler(int fd, int events, void *cp_) { child_process *cp = (child_process *)cp_; gather_output(cp, &cp->outstd, 0); return 0; } static void sigchld_handler(int sig) { reapable++; } static void reap_jobs(void) { int reaped = 0; do { int pid, status; struct rusage ru; pid = wait3(&status, WNOHANG, &ru); if (pid > 0) { struct child_process *cp; reapable--; if (!(cp = fanout_get(ptab, pid))) { /* we reaped a lost child. Odd that */ continue; } cp->ret = status; memcpy(&cp->ei->rusage, &ru, sizeof(ru)); reaped++; if (cp->ei->state != ESTALE) finish_job(cp, cp->ei->state); destroy_job(cp); } else if (!pid || (pid < 0 && errno == ECHILD)) { reapable = 0; } } while (reapable); } void cmd_iobroker_register(int fdout, int fderr, void *arg) { /* We must never block, even if plugins issue '_exit()' */ fcntl(fdout, F_SETFL, O_NONBLOCK); fcntl(fderr, F_SETFL, O_NONBLOCK); if( iobroker_register(iobs, fdout, arg, stdout_handler) < 0) { wlog("Failed to register iobroker for stdout"); } if( iobroker_register(iobs, fderr, arg, stderr_handler) < 0) { wlog("Failed to register iobroker for stderr"); } } char **env_from_kvvec(struct kvvec *kvv_env) { int i; char **env; if(NULL == kvv_env) return NULL; env = calloc(kvv_env->kv_pairs*2+1, sizeof(char *)); for (i = 0; i < kvv_env->kv_pairs; i++) { struct key_value *kv = &kvv_env->kv[i]; env[i*2] = kv->key; env[i*2+1] = kv->value; } env[i*2] = NULL; return env; } int start_cmd(child_process *cp) { int pfd[2] = {-1, -1}, pfderr[2] = {-1, -1}; char **env = env_from_kvvec(cp->env); cp->outstd.fd = runcmd_open(cp->cmd, pfd, pfderr, env, cmd_iobroker_register, cp); my_free(env); if (cp->outstd.fd < 0) { return -1; } cp->outerr.fd = pfderr[0]; cp->ei->pid = runcmd_pid(cp->outstd.fd); /* no pid means we somehow failed */ if (!cp->ei->pid) { return -1; } fanout_add(ptab, cp->ei->pid, cp); return 0; } static iocache *ioc; static child_process *parse_command_kvvec(struct kvvec *kvv) { int i; child_process *cp; /* get this command's struct and insert it at the top of the list */ cp = calloc(1, sizeof(*cp)); if (!cp) { wlog("Failed to calloc() a child_process struct"); return NULL; } cp->ei = calloc(1, sizeof(*cp->ei)); if (!cp->ei) { wlog("Failed to calloc() a execution_information struct"); return NULL; } /* * we must copy from the vector, since it points to data * found in the iocache where we read the command, which will * be overwritten when we receive one next */ for (i = 0; i < kvv->kv_pairs; i++) { struct key_value *kv = &kvv->kv[i]; char *key = kv->key; char *value = kv->value; char *endptr; if (!strcmp(key, "command")) { cp->cmd = strdup(value); continue; } if (!strcmp(key, "job_id")) { cp->id = (unsigned int)strtoul(value, &endptr, 0); continue; } if (!strcmp(key, "timeout")) { cp->timeout = (unsigned int)strtoul(value, &endptr, 0); continue; } if (!strcmp(key, "env")) { cp->env = buf2kvvec(value, strlen(value), '=', '\n', KVVEC_COPY); continue; } } /* jobs without a timeout get a default of 60 seconds. */ if (!cp->timeout) { cp->timeout = 60; } return cp; } static void spawn_job(struct kvvec *kvv, int(*cb)(child_process *)) { int result; child_process *cp; if (!kvv) { wlog("Received NULL command key/value vector. Bug in iocache.c or kvvec.c?"); return; } cp = parse_command_kvvec(kvv); if (!cp) { job_error(NULL, kvv, "Failed to parse worker-command"); return; } if (!cp->cmd) { job_error(cp, kvv, "Failed to parse commandline. Ignoring job %u", cp->id); return; } gettimeofday(&cp->ei->start, NULL); cp->request = kvv; cp->ei->sq_event = squeue_add(sq, cp->timeout + time(NULL), cp); started++; running_jobs++; result = cb(cp); if (result < 0) { job_error(cp, kvv, "Failed to start child: %s: %s", runcmd_strerror(result), strerror(errno)); squeue_remove(sq, cp->ei->sq_event); running_jobs--; return; } } static int receive_command(int sd, int events, void *arg) { int ioc_ret; char *buf; unsigned long size; if (!ioc) { ioc = iocache_create(512 * 1024); } ioc_ret = iocache_read(ioc, sd); /* master closed the connection, so we exit */ if (ioc_ret == 0) { iobroker_close(iobs, sd); exit_worker(0, NULL); } if (ioc_ret < 0) { /* XXX: handle this somehow */ } #if 0 /* debug-volley */ buf = iocache_use_size(ioc, ioc_ret); write(master_sd, buf, ioc_ret); return 0; #endif /* * now loop over all inbound messages in the iocache. * Since KV_TERMINATOR is a nul-byte, they're separated by 3 nuls */ while ((buf = iocache_use_delim(ioc, MSG_DELIM, MSG_DELIM_LEN, &size))) { struct kvvec *kvv; /* we must copy vars here, as we preserve them for the response */ kvv = buf2kvvec(buf, (unsigned int)size, KV_SEP, PAIR_SEP, KVVEC_COPY); if (kvv) spawn_job(kvv, arg); } return 0; } int worker_set_sockopts(int sd, int bufsize) { int ret; ret = fcntl(sd, F_SETFD, FD_CLOEXEC); ret |= fcntl(sd, F_SETFL, O_NONBLOCK); if (!bufsize) return ret; ret |= setsockopt(sd, SOL_SOCKET, SO_SNDBUF, &bufsize, sizeof(int)); ret |= setsockopt(sd, SOL_SOCKET, SO_RCVBUF, &bufsize, sizeof(int)); return ret; } /* XXX: deprecated */ int set_socket_options(int sd, int bufsize) { return worker_set_sockopts(sd, bufsize); } void enter_worker(int sd, int (*cb)(child_process*)) { #ifdef HAVE_SIGACTION struct sigaction sig_action; #endif /* created with socketpair(), usually */ master_sd = sd; parent_pid = getppid(); (void)chdir("/tmp"); (void)chdir("nagios-workers"); ptab = fanout_create(4096); if (setpgid(0, 0)) { /* XXX: handle error somehow, or maybe just ignore it */ } /* we need to catch child signals to mark jobs as reapable */ #ifdef HAVE_SIGACTION sig_action.sa_sigaction = NULL; sig_action.sa_handler = sigchld_handler; sigfillset(&sig_action.sa_mask); sig_action.sa_flags=SA_NOCLDSTOP; sigaction(SIGCHLD, &sig_action, NULL); #else signal(SIGCHLD, sigchld_handler); #endif fcntl(fileno(stdout), F_SETFD, FD_CLOEXEC); fcntl(fileno(stderr), F_SETFD, FD_CLOEXEC); fcntl(master_sd, F_SETFD, FD_CLOEXEC); iobs = iobroker_create(); if (!iobs) { /* XXX: handle this a bit better */ exit_worker(EXIT_FAILURE, "Worker failed to create io broker socket set"); } /* * Create a modest scheduling queue that will be * more than enough for our needs */ sq = squeue_create(1024); worker_set_sockopts(master_sd, 256 * 1024); iobroker_register(iobs, master_sd, cb, receive_command); while (iobroker_get_num_fds(iobs) > 0) { int poll_time = -1; /* check for timed out jobs */ while (running_jobs) { child_process *cp; struct timeval now, tmo; /* stop when scheduling queue is empty */ cp = (child_process *)squeue_peek(sq); if (!cp) break; tmo.tv_usec = cp->ei->start.tv_usec; tmo.tv_sec = cp->ei->start.tv_sec + cp->timeout; gettimeofday(&now, NULL); poll_time = tv_delta_msec(&now, &tmo); /* * A little extra takes care of rounding errors and * ensures we never kill a job before it times out. * 5 milliseconds is enough to take care of that. */ poll_time += 5; if (poll_time > 0) break; if (cp->ei->state == ESTALE) { if(cp->ei->sq_event && squeue_evt_when_is_after(cp->ei->sq_event, &now)) { /* If the state is already stale, there is a already a job to kill the child on the queue so don't add another one here. */ kill_job(cp, ESTALE); } } else { /* this job timed out, so kill it */ wlog("job %d (pid=%ld) timed out. Killing it", cp->id, (long)cp->ei->pid); kill_job(cp, ETIME); } } iobroker_poll(iobs, poll_time); if (reapable) reap_jobs(); } /* we exit when the master shuts us down */ exit(EXIT_SUCCESS); } int spawn_named_helper(char *path, char **argv) { int ret, pid; pid = fork(); if (pid < 0) { return -1; } /* parent leaves early */ if (pid) return pid; ret = execvp(path, argv); /* if execvp() fails, there's really nothing we can do */ exit(ret); } int spawn_helper(char **argv) { return spawn_named_helper(argv[0], argv); } nagios-4.3.4/lib/worker.h000066400000000000000000000077741314764422400152600ustar00rootroot00000000000000#ifndef LIBNAGIOS_WORKER_H_INCLUDED #define LIBNAGIOS_WORKER_H_INCLUDED #include #include #include #include #include #include #include #include "libnagios.h" /** * @file worker.h * @brief Worker implementation along with various helpers * * This code isn't really in the "library" category, but it's tucked * in here to provide a good resource for writing remote workers and * as an example on how to use the API's found here. */ #ifndef ETIME #define ETIME ETIMEDOUT #endif typedef struct iobuf { int fd; unsigned int len; char *buf; } iobuf; typedef struct execution_information execution_information; typedef struct child_process { unsigned int id, timeout; char *cmd; struct kvvec *env; int ret; struct kvvec *request; iobuf outstd; iobuf outerr; execution_information *ei; } child_process; /** * Callback for enter_worker that simply runs a command */ extern int start_cmd(child_process *cp); /** * Spawn a helper with a specific process name * The first entry in the argv parameter will be the name of the * new process, unless the process changes the name itself. * @param path The path to the executable (can be $PATH relative) * @param argv Argument vector for the helper to spawn */ extern int spawn_named_helper(char *path, char **argv); /** * Spawn any random helper process. Uses spawn_named_helper() * @param argv The (NULL-sentinel-terminated) argument vector * @return 0 on success, < 0 on errors */ extern int spawn_helper(char **argv); /** * To be called when a child_process has completed to ship the result to nagios * @param cp The child_process that describes the job * @param reason 0 if everything was OK, 1 if the job was unable to run * @return 0 on success, non-zero otherwise */ extern int finish_job(child_process *cp, int reason); /** * Start to poll the socket and call the callback when there are new tasks * @param sd A socket descriptor to poll * @param cb The callback to call upon completion */ extern void enter_worker(int sd, int (*cb)(child_process*)); /** * Build a buffer from a key/value vector buffer. * The resulting kvvec-buffer is suitable for sending between * worker and master in either direction, as it has all the * right delimiters in all the right places. * @param kvv The key/value vector to build the buffer from * @return NULL on errors, a newly allocated kvvec buffer on success */ extern struct kvvec_buf *build_kvvec_buf(struct kvvec *kvv); /** * Send a key/value vector as a bytestream through a socket * @param[in] sd The socket descriptor to send to * @param kvv The key/value vector to send * @return The number of bytes sent, or -1 on errors */ extern int worker_send_kvvec(int sd, struct kvvec *kvv); /** @deprecated Use worker_send_kvvec() instead */ extern int send_kvvec(int sd, struct kvvec *kvv) NAGIOS_DEPRECATED(4.1.0, "worker_send_kvvec()"); /** * Grab a worker message from an iocache buffer * @param[in] ioc The io cache * @param[out] size Out buffer for buffer length * @param[in] flags Currently unused * @return A buffer from the iocache on succes; NULL on errors */ extern char *worker_ioc2msg(iocache *ioc, unsigned long *size, int flags); /** * Parse a worker message to a preallocated key/value vector * * @param[in] kvv Key/value vector to fill * @param[in] buf The buffer to parse * @param[in] len Length of 'buf' * @param[in] kvv_flags Flags for buf2kvvec() * @return 0 on success, < 0 on errors */ extern int worker_buf2kvvec_prealloc(struct kvvec *kvv, char *buf, unsigned long len, int kvv_flags); /** * Set some common socket options * @param[in] sd The socket to set options for * @param[in] bufsize Size to set send and receive buffers to * @return 0 on success. < 0 on errors */ extern int worker_set_sockopts(int sd, int bufsize); /** @deprecated Use worker_set_sockopts() instead */ extern int set_socket_options(int sd, int bufsize) NAGIOS_DEPRECATED(4.1.0, "worker_set_sockopts()"); #endif /* INCLUDE_worker_h__ */ nagios-4.3.4/lib/wproc.c000066400000000000000000000136511314764422400150630ustar00rootroot00000000000000/* * Simple test-program to try multiplexing running other programs * through the worker process layer. */ #include #include #include #include #include #include #include #include #include #include #include #include "worker.h" typedef struct simple_worker { int pid, sd; unsigned int job_index; iocache *ioc; } simple_worker; /* we can't handle packets larger than 64MiB */ #define MAX_IOCACHE_SIZE (64 * 1024 * 1024) static int sigreceived; static iobroker_set *iobs; static simple_worker *spawn_worker(void (*init_func)(void *), void *init_arg) { int sv[2]; int pid; if (socketpair(AF_UNIX, SOCK_STREAM, 0, sv) < 0) return NULL; pid = fork(); if (pid < 0) { close(sv[0]); close(sv[1]); return NULL; } /* parent leaves the child */ if (pid) { simple_worker *worker = calloc(1, sizeof(simple_worker)); close(sv[1]); if (!worker) { kill(SIGKILL, pid); close(sv[0]); return NULL; } worker->sd = sv[0]; worker->pid = pid; worker->ioc = iocache_create(1 * 1024 * 1024); return worker; } /* child closes parent's end of socket and gets busy */ close(sv[0]); if (init_func) { init_func(init_arg); } enter_worker(sv[1], start_cmd); /* not reached, ever */ exit(EXIT_FAILURE); } static void die(const char *msg) { perror(msg); exit(EXIT_FAILURE); } static void sighandler(int sig) { sigreceived = sig; printf("%d: caught sig %d\n", getpid(), sig); } static void child_exited(int sig) { struct rusage ru; int status, result; result = wait3(&status, 0, &ru); printf("wait3() status: %d; return %d: %s\n", status, result, strerror(errno)); if (WIFEXITED(status)) { printf("Child with pid %d exited normally\n", result); } if (WIFSIGNALED(status)) { printf("Child caught signal %d\n", WTERMSIG(status)); printf("Child did%s produce a core dump\n", WCOREDUMP(status) ? "" : " not"); } exit(1); } static int print_input(int sd, int events, void *wp_) { int ret, pkt = 0; simple_worker *wp = (simple_worker *)wp_; struct kvvec kvv = KVVEC_INITIALIZER; char *buf; unsigned long tot_bytes = 0, size; /* * if some command filled the buffer, we grow it and read some * more until we hit the limit * @todo Define a limit :p */ size = iocache_size(wp->ioc); if (!iocache_capacity(wp->ioc)) { if (iocache_size(wp->ioc) < MAX_IOCACHE_SIZE) { /* double the size */ iocache_grow(wp->ioc, iocache_size(wp->ioc)); printf("Growing iocache for worker %d. sizes old/new %lu/%lu\n", wp->pid, size, iocache_size(wp->ioc)); } else { printf("iocache_size() for worker %d is already at max\n", wp->pid); } } ret = iocache_read(wp->ioc, sd); if (!ret) { printf("Worker with pid %d seems to have crashed. Exiting\n", wp->pid); exit(1); } if (ret < 0) { printf("iocache_read() from worker %d returned %d: %m\n", wp->pid, ret); return 0; } printf("read %d bytes from worker with pid %d::\n", ret, wp->pid); while ((buf = worker_ioc2msg(wp->ioc, &size, 0))) { int i, ret; tot_bytes += size; ret = worker_buf2kvvec_prealloc(&kvv, buf, (unsigned int)size, KVVEC_ASSIGN); if (!ret < 0) { printf("main: Failed to parse buffer of size %lu to key/value vector\n", size); continue; } for (i = 0; i < kvv.kv_pairs; i++) { struct key_value *kv = &kvv.kv[i]; if (!i && memcmp(kv->key, buf, kv->key_len)) { printf("### kv[0]->key doesn't match buf. error in kvvec?\n"); } printf("main: %2d.%02d: %s=%s\n", pkt, i, kv->key, kv->value); } pkt++; } printf("iocache: available: %lu; size: %lu; capacity: %lu\n", iocache_available(wp->ioc), iocache_size(wp->ioc), iocache_capacity(wp->ioc)); printf("Got %d packets in %ld bytes (ret: %d)\n", pkt, tot_bytes, ret); return 0; } #define NWPS 3 static simple_worker *wps[NWPS]; static int wp_index; static int send_command(int sd, int events, void *discard) { char buf[8192]; int ret; simple_worker *wp; struct kvvec *kvv; ret = read(sd, buf, sizeof(buf)); if (ret == 0) { iobroker_close(iobs, sd); return 0; } if (ret < 0) { printf("main: Failed to read() from fd %d: %s", sd, strerror(errno)); } /* this happens when we're reading from stdin */ buf[--ret] = 0; kvv = kvvec_create(5); wp = wps[wp_index++ % NWPS]; kvvec_addkv(kvv, "job_id", (char *)mkstr("%d", wp->job_index++)); kvvec_addkv_wlen(kvv, "command", sizeof("command") - 1, buf, ret); kvvec_addkv(kvv, "timeout", (char *)mkstr("%d", 10)); printf("Sending kvvec with %d pairs to worker %d\n", kvv->kv_pairs, wp->pid); worker_send_kvvec(wp->sd, kvv); kvvec_destroy(kvv, 0); return 0; } void print_some_crap(void *arg) { char *str = (char *)arg; printf("%d: Argument passed: %s\n", getpid(), str); } int main(int argc, char **argv) { simple_worker *wp; int i; #ifdef HAVE_SIGACTION struct sigaction sig_action; sig_action.sa_sigaction = NULL; sigfillset(&sig_action.sa_mask); sig_action.sa_flags=SA_NOCLDSTOP; sig_action.sa_handler = child_exited; sigaction(SIGCHLD, &sig_action, NULL); sig_action.sa_flags = SA_NODEFER|SA_RESTART; sig_action.sa_handler = sighandler; sigfillset(&sig_action.sa_mask); sigaction(SIGINT, &sig_action, NULL); sigaction(SIGPIPE, &sig_action, NULL); #else /* HAVE_SIGACTION */ signal(SIGINT, sighandler); signal(SIGPIPE, sighandler); signal(SIGCHLD, child_exited); #endif /* HAVE_SIGACTION */ iobs = iobroker_create(); if (!iobs) die("Failed to create io broker set"); for (i = 0; i < NWPS; i++) { wp = spawn_worker(print_some_crap, "lalala"); if (!wp) { die("Failed to spawn worker(s)\n"); } wps[i] = wp; printf("Registering worker sd %d with io broker\n", wp->sd); iobroker_register(iobs, wp->sd, wp, print_input); } iobroker_register(iobs, fileno(stdin), NULL, send_command); /* get to work */ while (!sigreceived && iobroker_get_num_fds(iobs)) { iobroker_poll(iobs, -1); } for (i = 0; i < NWPS; i++) { kill(wps[i]->pid, SIGKILL); } return 0; } nagios-4.3.4/make-tarball000077500000000000000000000007151314764422400152760ustar00rootroot00000000000000#! /bin/sh if [ "x$1" = "x" ] then echo "Usage: $0 " exit 1 fi if test -e Makefile; then make distclean fi autoconf # Update version number and modification date in code ./update-version $1 PWDSAVE=`pwd` PACKAGE=nagios pushd .. if [ ! -d $PACKAGE-$1 ]; then ln -s `basename $PWDSAVE` $PACKAGE-$1 fi tar zhcvf $PACKAGE-$1.tar.gz --exclude RCS --exclude CVS --exclude build-* --exclude *~ --exclude .\#* $PACKAGE-$1 #rm $PACKAGE-$1 popd nagios-4.3.4/mkpackage000077500000000000000000000014621314764422400146650ustar00rootroot00000000000000#! /bin/sh if [ "z$1" = "z" ] ; then echo You must specify an architecture to build for! exit 1 fi case "$1" in solaris) LD_RUN_PATH=/usr/lib:/usr/local/lib autoreconf PATH=.:..:$PATH configure --with-cgiurl=/nagios/cgi-bin \ --with-htmurl=/nagios \ --with-lockfile=/var/run/nagios.pid \ --with-nagios-user=nagios \ --with-nagios-grp=nagios \ --with-command-user=nagios \ --with-command-grp=www \ --prefix=/usr/local \ --exec-prefix=/usr/local/sbin \ --bindir=/usr/local/sbin \ --sbindir=/usr/local/lib/nagios/cgi \ --libexecdir=/usr/local/lib/nagios/plugins \ --datadir=/usr/local/share/nagios \ --sysconfdir=/etc/nagios \ --localstatedir=/var/log/nagios \ --with-mail=/usr/bin/mailx make pkgclean make all make pkgset ;; *) echo Platform $1 is not currently supported exit 1 ;; esac exit 0nagios-4.3.4/module/000077500000000000000000000000001314764422400142765ustar00rootroot00000000000000nagios-4.3.4/module/.gitignore000066400000000000000000000000111314764422400162560ustar00rootroot00000000000000Makefile nagios-4.3.4/module/Makefile.in000066400000000000000000000012641314764422400163460ustar00rootroot00000000000000################################### # Makefile for NEB examples # ################################### # Source code directories SRC_INCLUDE=../include CC=@CC@ MOD_CFLAGS=@MOD_CFLAGS@ CFLAGS=@CFLAGS@ @DEFS@ MOD_LDFLAGS=@MOD_LDFLAGS@ LDFLAGS=@LDFLAGS@ LIBS=@LIBS@ prefix=@prefix@ exec_prefix=@exec_prefix@ BINDIR=@bindir@ INSTALL=@INSTALL@ INSTALL_OPTS=@INSTALL_OPTS@ COMMAND_OPTS=@COMMAND_OPTS@ STRIP=@STRIP@ CP=@CP@ all: helloworld.o helloworld.o: helloworld.c $(CC) -I.. $(MOD_CFLAGS) $(CFLAGS) -o helloworld.o helloworld.c $(MOD_LDFLAGS) $(LDFLAGS) $(LIBS) clean: rm -f helloworld.o rm -f core *.o rm -f *~ *.*~ distclean: clean rm -f Makefile devclean: distclean install: nagios-4.3.4/module/helloworld.c000066400000000000000000000115771314764422400166300ustar00rootroot00000000000000/***************************************************************************** * * HELLOWORLD.C - Example of a simple NEB module * * Copyright (c) 2003-2007 Ethan Galstad (https://www.nagios.org) * * Description: * * This is an example of a very basic module. It does nothing useful other * than logging some messages to the main Nagios log file when it is initialized * (loaded), when it is closed (unloaded), and when aggregated status updates * occur. I would not call that too useful, but hopefully it will serve as a * very basic example of how to write a NEB module... * * Instructions: * * Compile with the following command: * * gcc -shared -o helloworld.o helloworld.c * *****************************************************************************/ /* include (minimum required) event broker header files */ #include "../include/nebmodules.h" #include "../include/nebcallbacks.h" /* include other event broker header files that we need for our work */ #include "../include/nebstructs.h" #include "../include/broker.h" /* include some Nagios stuff as well */ #include "../include/config.h" #include "../include/common.h" #include "../include/nagios.h" /* specify event broker API version (required) */ NEB_API_VERSION(CURRENT_NEB_API_VERSION); void *helloworld_module_handle = NULL; void helloworld_reminder_message(char *); int helloworld_handle_data(int, void *); /* this function gets called when the module is loaded by the event broker */ int nebmodule_init(int flags, char *args, nebmodule *handle) { char temp_buffer[1024]; time_t current_time; unsigned long interval; /* save our handle */ helloworld_module_handle = handle; /* set some info - this is completely optional, as Nagios doesn't do anything with this data */ neb_set_module_info(helloworld_module_handle, NEBMODULE_MODINFO_TITLE, "helloworld"); neb_set_module_info(helloworld_module_handle, NEBMODULE_MODINFO_AUTHOR, "Ethan Galstad"); neb_set_module_info(helloworld_module_handle, NEBMODULE_MODINFO_TITLE, "Copyright (c) 2003-2007 Ethan Galstad"); neb_set_module_info(helloworld_module_handle, NEBMODULE_MODINFO_VERSION, "noversion"); neb_set_module_info(helloworld_module_handle, NEBMODULE_MODINFO_LICENSE, "GPL v2"); neb_set_module_info(helloworld_module_handle, NEBMODULE_MODINFO_DESC, "A simple example to get you started with Nagios Event Broker (NEB) modules."); /* log module info to the Nagios log file */ write_to_all_logs("helloworld: Copyright (c) 2003-2007 Ethan Galstad (egalstad@nagios.org)", NSLOG_INFO_MESSAGE); /* log a message to the Nagios log file */ snprintf(temp_buffer, sizeof(temp_buffer) - 1, "helloworld: Hello world!\n"); temp_buffer[sizeof(temp_buffer) - 1] = '\x0'; write_to_all_logs(temp_buffer, NSLOG_INFO_MESSAGE); /* log a reminder message every 15 minutes (how's that for annoying? :-)) */ time(¤t_time); interval = 900; schedule_new_event(EVENT_USER_FUNCTION, TRUE, current_time + interval, TRUE, interval, NULL, TRUE, (void *)helloworld_reminder_message, "How about you?", 0); /* register to be notified of certain events... */ neb_register_callback(NEBCALLBACK_AGGREGATED_STATUS_DATA, helloworld_module_handle, 0, helloworld_handle_data); return 0; } /* this function gets called when the module is unloaded by the event broker */ int nebmodule_deinit(int flags, int reason) { char temp_buffer[1024]; /* deregister for all events we previously registered for... */ neb_deregister_callback(NEBCALLBACK_AGGREGATED_STATUS_DATA, helloworld_handle_data); /* log a message to the Nagios log file */ snprintf(temp_buffer, sizeof(temp_buffer) - 1, "helloworld: Goodbye world!\n"); temp_buffer[sizeof(temp_buffer) - 1] = '\x0'; write_to_all_logs(temp_buffer, NSLOG_INFO_MESSAGE); return 0; } /* gets called every X minutes by an event in the scheduling queue */ void helloworld_reminder_message(char *message) { char temp_buffer[1024]; /* log a message to the Nagios log file */ snprintf(temp_buffer, sizeof(temp_buffer) - 1, "helloworld: I'm still here! %s", message); temp_buffer[sizeof(temp_buffer) - 1] = '\x0'; write_to_all_logs(temp_buffer, NSLOG_INFO_MESSAGE); return; } /* handle data from Nagios daemon */ int helloworld_handle_data(int event_type, void *data) { nebstruct_aggregated_status_data *agsdata = NULL; char temp_buffer[1024]; /* what type of event/data do we have? */ switch(event_type) { case NEBCALLBACK_AGGREGATED_STATUS_DATA: /* an aggregated status data dump just started or ended... */ if((agsdata = (nebstruct_aggregated_status_data *)data)) { /* log a message to the Nagios log file */ snprintf(temp_buffer, sizeof(temp_buffer) - 1, "helloworld: An aggregated status update just %s.", (agsdata->type == NEBTYPE_AGGREGATEDSTATUS_STARTDUMP) ? "started" : "finished"); temp_buffer[sizeof(temp_buffer) - 1] = '\x0'; write_to_all_logs(temp_buffer, NSLOG_INFO_MESSAGE); } break; default: break; } return 0; } nagios-4.3.4/nagios.spec000066400000000000000000000215501314764422400151500ustar00rootroot00000000000000# Upstream: Ethan Galstad # Modified version from original dag spec ### FIXME: TODO: Add sysv script based on template. (remove cmd-file on start-up) %define logmsg logger -t %{name}/rpm %define logdir %{_localstatedir}/log/nagios # Setup some debugging options in case we build with --with debug %if %{defined _with_debug} %define mycflags -O0 -pg -ggdb3 %else %define mycflags %{nil} %endif # Allow newer compiler to suppress warnings %if 0%{?el6} %define myXcflags -Wno-unused-result %else %define myXcflags %{nil} %endif Summary: Open Source host, service and network monitoring program Name: nagios Version: 4.3.4 Release: 2%{?dist} License: GPL Group: Applications/System URL: https://www.nagios.org/ Packager: Daniel Wittenberg Vendor: Nagios Enterprises (https://www.nagios.org) Source0: http://dl.sf.net/nagios/nagios-%{version}.tar.gz BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root BuildRequires: gd-devel > 1.8 BuildRequires: zlib-devel BuildRequires: libpng-devel BuildRequires: libjpeg-devel BuildRequires: doxygen BuildRequires: gperf Obsoletes: nagios-www <= %{version} Requires: httpd,php %description Nagios is an application, system and network monitoring application. It can escalate problems by email, pager or any other medium. It is also useful for incident or SLA reporting. Nagios is written in C and is designed as a background process, intermittently running checks on various services that you specify. The actual service checks are performed by separate "plugin" programs which return the status of the checks to Nagios. The plugins are located in the nagios-plugins package. %package devel Summary: Header files, libraries and development documentation for %{name} Group: Development/Libraries Requires: %{name} = %{version}-%{release} %description devel This package contains the header files, static libraries and development documentation for %{name}. If you are a NEB-module author or wish to write addons for Nagios using Nagios' own API's, you should install this package. %package contrib Summary: Files from the contrib directory Group: Development/Utils Requires: %{name} = %{version}-%{release} %description contrib This package contains all the files from the contrib directory %prep %setup # /usr/local/nagios is hardcoded in many places %{__perl} -pi.orig -e 's|/usr/local/nagios/var/rw|%{_localstatedir}/nagios/rw|g;' contrib/eventhandlers/submit_check_result %build CFLAGS="%{mycflags} %{myXcflags}" LDFLAGS="$CFLAGS" %configure \ --datadir="%{_datadir}/nagios" \ --libexecdir="%{_libdir}/nagios/plugins" \ --localstatedir="%{_localstatedir}/nagios" \ --with-checkresult-dir="%{_localstatedir}/nagios/spool/checkresults" \ --sbindir="%{_libdir}/nagios/cgi" \ --sysconfdir="%{_sysconfdir}/nagios" \ --with-cgiurl="/nagios/cgi-bin" \ --with-command-user="apache" \ --with-command-group="apache" \ --with-gd-lib="%{_libdir}" \ --with-gd-inc="%{_includedir}" \ --with-htmurl="/nagios" \ --with-init-dir="%{_initrddir}" \ --with-lockfile="%{_localstatedir}/nagios/nagios.pid" \ --with-mail="/bin/mail" \ --with-nagios-user="nagios" \ --with-nagios-group="nagios" \ --with-perlcache \ --with-template-objects \ --with-template-extinfo \ --enable-event-broker find . -type f -name Makefile -exec /usr/bin/perl -p -i -e "s/-mtune=generic/-march=nocona/g" Makefile {} \; -print %{__make} %{?_smp_mflags} all ### Build our documentation %{__make} dox ### Apparently contrib does not obey configure ! %{__make} %{?_smp_mflags} -C contrib %install export PATH=%{_bindir}:/bin:\$PATH %{__rm} -rf %{buildroot} %{__make} install-unstripped install-init install-commandmode install-config \ DESTDIR="%{buildroot}" \ INSTALL_OPTS="" \ COMMAND_OPTS="" \ INIT_OPTS="" %{__install} -d -m 0755 %{buildroot}%{_includedir}/nagios/ %{__install} -p -m 0644 include/*.h %{buildroot}%{_includedir}/nagios/ %{__mkdir} -p -m 0755 %{buildroot}/%{_includedir}/nagios/lib %{__install} -m 0644 lib/*.h %{buildroot}/%{_includedir}/nagios/lib %{__install} -Dp -m 0644 sample-config/httpd.conf %{buildroot}%{_sysconfdir}/httpd/conf.d/nagios.conf ### FIX log-paths %{__perl} -pi -e ' s|log_file.*|log_file=%{logdir}/nagios.log|; s|log_archive_path=.*|log_archive_path=%{logdir}/archives|; s|debug_file=.*|debug_file=%{logdir}/nagios.debug|; ' %{buildroot}%{_sysconfdir}/nagios/nagios.cfg ### make logdirs %{__mkdir_p} %{buildroot}%{logdir}/ %{__mkdir_p} %{buildroot}%{logdir}/archives/ ### Install logos %{__mkdir_p} %{buildroot}%{_datadir}/nagios/images/logos ### Install documentation %{__mkdir_p} %{buildroot}%{_datadir}/nagios/documentation %{__cp} -a Documentation/html/* %{buildroot}%{_datadir}/nagios/documentation # Put the new RC script in place %{__install} -m 0755 daemon-init %{buildroot}/%{_initrddir}/nagios %{__install} -d -m 0755 %{buildroot}/%{_sysconfdir}/sysconfig/ %{__install} -m 0644 nagios.sysconfig %{buildroot}/%{_sysconfdir}/sysconfig/nagios ### Apparently contrib wants to do embedded-perl stuff as well and does not obey configure ! %{__make} install -C contrib \ DESTDIR="%{buildroot}" \ INSTALL_OPTS="" ### Install libnagios %{__install} -m 0644 lib/libnagios.a %{buildroot}%{_libdir}/libnagios.a %{__install} -d -m 0755 %{buildroot}%{_libdir}/nagios/plugins/eventhandlers/ %{__cp} -afpv contrib/eventhandlers/* %{buildroot}%{_libdir}/nagios/plugins/eventhandlers/ %{__mv} contrib/README contrib/README.contrib CGI=`find contrib/ -name '*.cgi' -type f |sed s/'contrib\/'//g` CGI=`for i in $CGI; do echo -n "$i|"; done |sed s/\|$//` find %{buildroot}/%{_libdir}/nagios/cgi -type f -print | sed s!'%{buildroot}'!!g | egrep -ve "($CGI)" > cgi.files find %{buildroot}/%{_libdir}/nagios/cgi -type f -print | sed s!'%{buildroot}'!!g | egrep "($CGI)" > contrib.files %pre if ! /usr/bin/id nagios &>/dev/null; then /usr/sbin/useradd -r -d %{logdir} -s /bin/sh -c "nagios" nagios || \ %logmsg "Unexpected error adding user \"nagios\". Aborting installation." fi if ! /usr/bin/getent group nagiocmd &>/dev/null; then /usr/sbin/groupadd nagiocmd &>/dev/null || \ %logmsg "Unexpected error adding group \"nagiocmd\". Aborting installation." fi %post /sbin/chkconfig --add nagios if /usr/bin/id apache &>/dev/null; then if ! /usr/bin/id -Gn apache 2>/dev/null | grep -q nagios ; then /usr/sbin/usermod -a -G nagios,nagiocmd apache &>/dev/null fi else %logmsg "User \"apache\" does not exist and is not added to group \"nagios\". Sending commands to Nagios from the command CGI is not possible." fi %preun if [ $1 -eq 0 ]; then /sbin/service nagios stop &>/dev/null || : /sbin/chkconfig --del nagios fi %postun # This could be bad if files are left with this uid/gid and then get owned by a new user #if [ $1 -eq 0 ]; then # /usr/sbin/userdel nagios || %logmsg "User \"nagios\" could not be deleted." # /usr/sbin/groupdel nagios || %logmsg "Group \"nagios\" could not be deleted." #fi /sbin/service nagios condrestart &>/dev/null || : %clean %{__rm} -rf %{buildroot} %files -f cgi.files %defattr(-, root, root, 0755) %doc Changelog INSTALLING LEGAL LICENSE README THANKS UPGRADING %attr(0644,root,root) %config(noreplace) %{_sysconfdir}/httpd/conf.d/nagios.conf %attr(0644,root,root) %config(noreplace) %{_sysconfdir}/sysconfig/nagios %attr(0755,root,root) %config %{_initrddir}/nagios %attr(0755,root,root) %{_bindir}/nagios %attr(0755,root,root) %{_bindir}/nagiostats %attr(0755,root,root) %{_libdir}/nagios/plugins/ %attr(0755,root,root) %{_datadir}/nagios/ %attr(0755,nagios,nagios) %dir %{_sysconfdir}/nagios/ %attr(0644,nagios,nagios) %config(noreplace) %{_sysconfdir}/nagios/*.cfg %attr(0755,nagios,nagios) %{_sysconfdir}/nagios/objects/ %attr(0644,nagios,nagios) %config(noreplace) %{_sysconfdir}/nagios/objects/*.cfg %attr(0755,nagios,nagios) %dir %{_localstatedir}/nagios/ %attr(0755,nagios,nagios) %{_localstatedir}/nagios/ %attr(0755,nagios,nagios) %{logdir}/ %attr(0755,nagios,apache) %{_localstatedir}/nagios/rw/ %attr(0644,root,root) %{_libdir}/libnagios.a %files devel %attr(0755,root,root) %{_includedir}/nagios/ %files contrib -f contrib.files %doc contrib/README.contrib %attr(0755,root,root) %{_bindir}/convertcfg %attr(0755,root,root) %{_libdir}/nagios/plugins/eventhandlers/ %changelog * Fri Nov 15 2013 Eric Stanley 4.0.1-1 - Corrected permissions on plugins directory (bug #494 - patch by Karsten Weiss) - Corrected doc directive (bug #494 - patch by Karsten Weiss) - Added configuration directive for *.cfg files (bug #494 - patch by Karsten Weiss) * Wed Sep 18 2013 Daniel Wittenberg 4.0.0rc2-1 - Fix find command - Florin Andrei, bug #489 - Remove compiler warning option that breaks older builds, bug #488 * Fri Mar 15 2013 Daniel Wittenberg 3.99.96-1 - Major updates for version 4.0 - New spec file, new RC script, new sysconfig nagios-4.3.4/nagios.sysconfig000066400000000000000000000003641314764422400162220ustar00rootroot00000000000000# Setup some basic values for startup # Do you want to use the ramdisk USE_RAMDISK=0 # How big (in MB) should the ramdisk be RAMDISK_SIZE=256 # Ramdisk Location RAMDISK_DIR="/var/nagios/ramcache" # Should the process be niced NICELEVEL=-15 nagios-4.3.4/openrc-init.in000066400000000000000000000036661314764422400156030ustar00rootroot00000000000000#!/sbin/openrc-run # This is a custom variable, and has the following default value if a # specific config file is not defined by the user. : ${NAGIOS_CONFIG:="@sysconfdir@/nagios.cfg"} # These two facilitate the bindir variable substitution below. prefix=@prefix@ exec_prefix=@exec_prefix@ # The rest are OpenRC variables. extra_commands="checkconfig" extra_started_commands="reload" # We put "--daemon" in command_args and not command_args_background # because the latter interacts weirdly with the config file argument. command="@bindir@/nagios" command_args="--daemon ${NAGIOS_CONFIG}" pidfile="@lockfile@" depend(){ # Most daemons don't really *need* the network; they're happy with # the loopback interface. However, nagios might start generating # "EVERYTHING IS DOWN" alerts if it starts before the real live # network comes up. need net use logger after mysql postgresql } reload(){ checkconfig || return $? ebegin "Reloading configuration" start-stop-daemon --signal HUP --pidfile "${pidfile}" eend $? } checkconfig(){ ebegin "Verifying config files" # Save the output in case verification fails and errors are printed. OUTPUT=$( ${command} --verify-config "${NAGIOS_CONFIG}" ) # Save the exit code from the verification so that `echo` doesn't # clobber it. Then, if verification failed, show its # output. Otherwise, succeed quietly. local exit_code=$? [ $exit_code -ne 0 ] && echo "${OUTPUT}" >&2 eend $exit_code } start_pre() { # Without this, the "start" action will appear to succeed even if # the config file contains errors, and the daemon fails to start. # Another approach would be to wait for the PID file to appear, but # this is fast enough and feels cleaner. checkconfig || return $? } stop_pre() { # If this is a restart, check to make sure the user's config # isn't busted before we stop the running daemon. if [ "${RC_CMD}" = "restart" ] ; then checkconfig || return $? fi } nagios-4.3.4/pkginfo.in000066400000000000000000000003221314764422400147730ustar00rootroot00000000000000PKG="nagios" VERSION="@VERSION@" NAME="Nagios @VERSION@" CLASSES="none" CATEGORY="utility" VENDOR="www.nagios.org" EMAIL="nagios-users@lists.sourceforge.net" ISTATES="S s 1 2 3" RSTATES="S s 1 2 3" BASEDIR="/" nagios-4.3.4/sample-config/000077500000000000000000000000001314764422400155355ustar00rootroot00000000000000nagios-4.3.4/sample-config/.gitignore000066400000000000000000000000211314764422400175160ustar00rootroot00000000000000*.cfg httpd.conf nagios-4.3.4/sample-config/README000066400000000000000000000017251314764422400164220ustar00rootroot00000000000000========================= SAMPLE CONFIG FILE README ========================= This directory contains *sample* configuration files for Nagios. You should read the HTML documentation for information on customizing these config files to suit your needs. A description of the sample config files and subdirectories contained here follows: CONTENTS: --------- cgi.cfg - This is a sample CGI config file nagios.cfg - This is a sample main config file resource.cfg - This is a sample resource config file, used for defining custom macros, storing sensitive data, etc. httpd.conf - This file contains sample snippets that you'll need to include in your Apache web server config file if you want to use the web interface. template-object/ - This directory contains sample object config files. You'll need to define object config files like these before you can actually start to monitor anything. nagios-4.3.4/sample-config/cgi.cfg.in000066400000000000000000000312651314764422400173740ustar00rootroot00000000000000################################################################# # # CGI.CFG - Sample CGI Configuration File for Nagios @VERSION@ # # ################################################################# # MAIN CONFIGURATION FILE # This tells the CGIs where to find your main configuration file. # The CGIs will read the main and host config files for any other # data they might need. main_config_file=@sysconfdir@/nagios.cfg # PHYSICAL HTML PATH # This is the path where the HTML files for Nagios reside. This # value is used to locate the logo images needed by the statusmap # and statuswrl CGIs. physical_html_path=@datadir@ # URL HTML PATH # This is the path portion of the URL that corresponds to the # physical location of the Nagios HTML files (as defined above). # This value is used by the CGIs to locate the online documentation # and graphics. If you access the Nagios pages with an URL like # http://www.myhost.com/nagios, this value should be '/nagios' # (without the quotes). url_html_path=@htmurl@ # CONTEXT-SENSITIVE HELP # This option determines whether or not a context-sensitive # help icon will be displayed for most of the CGIs. # Values: 0 = disables context-sensitive help # 1 = enables context-sensitive help show_context_help=0 # PENDING STATES OPTION # This option determines what states should be displayed in the web # interface for hosts/services that have not yet been checked. # Values: 0 = leave hosts/services that have not been check yet in their original state # 1 = mark hosts/services that have not been checked yet as PENDING use_pending_states=1 # AUTHENTICATION USAGE # This option controls whether or not the CGIs will use any # authentication when displaying host and service information, as # well as committing commands to Nagios for processing. # # Read the HTML documentation to learn how the authorization works! # # NOTE: It is a really *bad* idea to disable authorization, unless # you plan on removing the command CGI (cmd.cgi)! Failure to do # so will leave you wide open to kiddies messing with Nagios and # possibly hitting you with a denial of service attack by filling up # your drive by continuously writing to your command file! # # Setting this value to 0 will cause the CGIs to *not* use # authentication (bad idea), while any other value will make them # use the authentication functions (the default). use_authentication=1 # x509 CERT AUTHENTICATION # When enabled, this option allows you to use x509 cert (SSL) # authentication in the CGIs. This is an advanced option and should # not be enabled unless you know what you're doing. use_ssl_authentication=0 # DEFAULT USER # Setting this variable will define a default user name that can # access pages without authentication. This allows people within a # secure domain (i.e., behind a firewall) to see the current status # without authenticating. You may want to use this to avoid basic # authentication if you are not using a secure server since basic # authentication transmits passwords in the clear. # # Important: Do not define a default username unless you are # running a secure web server and are sure that everyone who has # access to the CGIs has been authenticated in some manner! If you # define this variable, anyone who has not authenticated to the web # server will inherit all rights you assign to this user! #default_user_name=guest # SYSTEM/PROCESS INFORMATION ACCESS # This option is a comma-delimited list of all usernames that # have access to viewing the Nagios process information as # provided by the Extended Information CGI (extinfo.cgi). By # default, *no one* has access to this unless you choose to # not use authorization. You may use an asterisk (*) to # authorize any user who has authenticated to the web server. authorized_for_system_information=nagiosadmin # CONFIGURATION INFORMATION ACCESS # This option is a comma-delimited list of all usernames that # can view ALL configuration information (hosts, commands, etc). # By default, users can only view configuration information # for the hosts and services they are contacts for. You may use # an asterisk (*) to authorize any user who has authenticated # to the web server. authorized_for_configuration_information=nagiosadmin # SYSTEM/PROCESS COMMAND ACCESS # This option is a comma-delimited list of all usernames that # can issue shutdown and restart commands to Nagios via the # command CGI (cmd.cgi). Users in this list can also change # the program mode to active or standby. By default, *no one* # has access to this unless you choose to not use authorization. # You may use an asterisk (*) to authorize any user who has # authenticated to the web server. authorized_for_system_commands=nagiosadmin # GLOBAL HOST/SERVICE VIEW ACCESS # These two options are comma-delimited lists of all usernames that # can view information for all hosts and services that are being # monitored. By default, users can only view information # for hosts or services that they are contacts for (unless you # you choose to not use authorization). You may use an asterisk (*) # to authorize any user who has authenticated to the web server. authorized_for_all_services=nagiosadmin authorized_for_all_hosts=nagiosadmin # GLOBAL HOST/SERVICE COMMAND ACCESS # These two options are comma-delimited lists of all usernames that # can issue host or service related commands via the command # CGI (cmd.cgi) for all hosts and services that are being monitored. # By default, users can only issue commands for hosts or services # that they are contacts for (unless you you choose to not use # authorization). You may use an asterisk (*) to authorize any # user who has authenticated to the web server. authorized_for_all_service_commands=nagiosadmin authorized_for_all_host_commands=nagiosadmin # READ-ONLY USERS # A comma-delimited list of usernames that have read-only rights in # the CGIs. This will block any service or host commands normally shown # on the extinfo CGI pages. It will also block comments from being shown # to read-only users. #authorized_for_read_only=user1,user2 # STATUSMAP BACKGROUND IMAGE # This option allows you to specify an image to be used as a # background in the statusmap CGI. It is assumed that the image # resides in the HTML images path (i.e. /usr/local/nagios/share/images). # This path is automatically determined by appending "/images" # to the path specified by the 'physical_html_path' directive. # Note: The image file may be in GIF, PNG, JPEG, or GD2 format. # However, I recommend that you convert your image to GD2 format # (uncompressed) but ONLY IF YOU WILL USE THE LEGACY MAP EXCLUSIVELY, # as this will cause less CPU load when the CGI generates the image. #statusmap_background_image=smbackground.gd2 # STATUSMAP TRANSPARENCY INDEX COLOR # These options set the r,g,b values of the background color used the statusmap CGI, # so normal browsers that can't show real png transparency set the desired color as # a background color instead (to make it look pretty). # Defaults to white: (R,G,B) = (255,255,255). #color_transparency_index_r=255 #color_transparency_index_g=255 #color_transparency_index_b=255 # DEFAULT STATUSMAP LAYOUT METHOD # This option allows you to specify the default layout method # the statusmap CGI should use for drawing hosts. If you do # not use this option, the default for the legacy map is to use # user-defined coordinates and the default for the new map is "6" # (Circular Balloon). # Valid options for the legacy map are as follows: # 0 = User-defined coordinates # 1 = Depth layers # 2 = Collapsed tree # 3 = Balanced tree # 4 = Circular # 5 = Circular (Marked Up) # Valid options for the new map are as follows: # 0 = User-defined coordinates # 1 = Depth Layers (Horizontal) # 2 = Collapsed tree (Horizontal) # 3 = Balanced tree (Horizontal) # 4 = DON'T USE # 5 = Circular Markup # 6 = Circular Balloon # 7 = Balanced tree (Vertical) # 8 = Collapsed tree (Vertical) # 9 = Depth Layers (Vertical) # 10 = Force Map #default_statusmap_layout=6 # DEFAULT STATUSWRL LAYOUT METHOD # This option allows you to specify the default layout method # the statuswrl (VRML) CGI should use for drawing hosts. If you # do not use this option, the default is to use user-defined # coordinates. Valid options are as follows: # 0 = User-defined coordinates # 2 = Collapsed tree # 3 = Balanced tree # 4 = Circular default_statuswrl_layout=4 # STATUSWRL INCLUDE # This option allows you to include your own objects in the # generated VRML world. It is assumed that the file # resides in the HTML path (i.e. /usr/local/nagios/share). #statuswrl_include=myworld.wrl # PING SYNTAX # This option determines what syntax should be used when # attempting to ping a host from the WAP interface (using # the statuswml CGI. You must include the full path to # the ping binary, along with all required options. The # $HOSTADDRESS$ macro is substituted with the address of # the host before the command is executed. # Please note that the syntax for the ping binary is # notorious for being different on virtually ever *NIX # OS and distribution, so you may have to tweak this to # work on your system. ping_syntax=/bin/ping -n -U -c 5 $HOSTADDRESS$ # REFRESH RATE # This option allows you to specify the refresh rate in seconds # of various CGIs (status, statusmap, extinfo, and outages). refresh_rate=90 # DEFAULT PAGE LIMIT # This option allows you to specify the default number of results # displayed on the status.cgi. This number can be adjusted from # within the UI after the initial page load. Setting this to 0 # will show all results. result_limit=100 # ESCAPE HTML TAGS # This option determines whether HTML tags in host and service # status output is escaped in the web interface. If enabled, # your plugin output will not be able to contain clickable links. escape_html_tags=1 # SOUND OPTIONS # These options allow you to specify an optional audio file # that should be played in your browser window when there are # problems on the network. The audio files are used only in # the status CGI. Only the sound for the most critical problem # will be played. Order of importance (higher to lower) is as # follows: unreachable hosts, down hosts, critical services, # warning services, and unknown services. If there are no # visible problems, the sound file optionally specified by # 'normal_sound' variable will be played. # # # = # # Note: All audio files must be placed in the /media subdirectory # under the HTML path (i.e. /usr/local/nagios/share/media/). #host_unreachable_sound=hostdown.wav #host_down_sound=hostdown.wav #service_critical_sound=critical.wav #service_warning_sound=warning.wav #service_unknown_sound=warning.wav #normal_sound=noproblem.wav # URL TARGET FRAMES # These options determine the target frames in which notes and # action URLs will open. action_url_target=_blank notes_url_target=_blank # LOCK AUTHOR NAMES OPTION # This option determines whether users can change the author name # when submitting comments, scheduling downtime. If disabled, the # author names will be locked into their contact name, as defined in Nagios. # Values: 0 = allow editing author names # 1 = lock author names (disallow editing) lock_author_names=1 # SPLUNK INTEGRATION OPTIONS # These options allow you to enable integration with Splunk # in the web interface. If enabled, you'll be presented with # "Splunk It" links in various places in the CGIs (log file, # alert history, host/service detail, etc). Useful if you're # trying to research why a particular problem occurred. # For more information on Splunk, visit http://www.splunk.com/ # This option determines whether the Splunk integration is enabled # Values: 0 = disable Splunk integration # 1 = enable Splunk integration #enable_splunk_integration=1 # This option should be the URL used to access your instance of Splunk #splunk_url=http://127.0.0.1:8000/ # NAVIGATION BAR SEARCH OPTIONS # The following options allow to configure the navbar search. Default # is to search for hostnames. With enabled navbar_search_for_addresses, # the navbar search queries IP addresses as well. It's also possible # to enable search for aliases by setting navbar_search_for_aliases=1. navbar_search_for_addresses=1 navbar_search_for_aliases=1 # DEFAULTS FOR CHECKBOXES FOR ACKNOWLEDGEMENTS # Enabling ack_no_sticky will default the "Sticky Acknowledgement" to # be unchecked. # Enabling ack_no_send will default the "Send Notification" to # be unchecked. #ack_no_sticky=0 #ack_no_send=0 # SHOW ONLY HARD STATES IS TACTICAL OVERVIEW # This option controls whether only HARD states are counted on the # Tactical Overview, or if both HARD and SOFT states are counted. # Set to 1 to show only HARD states. Defaults to 0 (HARD+SOFT). #tac_cgi_hard_only=0 nagios-4.3.4/sample-config/httpd.conf.in000066400000000000000000000030571314764422400201410ustar00rootroot00000000000000# SAMPLE CONFIG SNIPPETS FOR APACHE WEB SERVER # # This file contains examples of entries that need # to be incorporated into your Apache web server # configuration file. Customize the paths, etc. as # needed to fit your system. ScriptAlias @cgiurl@ "@sbindir@" # SSLRequireSSL Options ExecCGI AllowOverride None = 2.3> Require all granted # Require host 127.0.0.1 AuthName "Nagios Access" AuthType Basic AuthUserFile @sysconfdir@/htpasswd.users Require valid-user Order allow,deny Allow from all # Order deny,allow # Deny from all # Allow from 127.0.0.1 AuthName "Nagios Access" AuthType Basic AuthUserFile @sysconfdir@/htpasswd.users Require valid-user Alias @htmurl@ "@datadir@" # SSLRequireSSL Options None AllowOverride None = 2.3> Require all granted # Require host 127.0.0.1 AuthName "Nagios Access" AuthType Basic AuthUserFile @sysconfdir@/htpasswd.users Require valid-user Order allow,deny Allow from all # Order deny,allow # Deny from all # Allow from 127.0.0.1 AuthName "Nagios Access" AuthType Basic AuthUserFile @sysconfdir@/htpasswd.users Require valid-user nagios-4.3.4/sample-config/mrtg.cfg.in000066400000000000000000000154431314764422400176030ustar00rootroot00000000000000################################################################### # MRTG Graphs: Nagios @VERSION@ Statistics # # You can add the following entries to your MRTG config file to # begin graphing several Nagios statistics which can be useful for # debugging and trending purposes. The nagiostats binary (which is # included as part of the Nagios distribution) is used to generate # the data. ################################################################### # Service Latency and Execution Time Target[nagios-a]: `@bindir@/nagiostats --mrtg --data=AVGACTSVCLAT,AVGACTSVCEXT,PROGRUNTIME,NAGIOSVERPID` MaxBytes[nagios-a]: 100000 Title[nagios-a]: Average Service Check Latency and Execution Time PageTop[nagios-a]:

    Average Service Check Latency and Execution Time

    Options[nagios-a]: growright,gauge,nopercent YLegend[nagios-a]: Milliseconds ShortLegend[nagios-a]:   LegendI[nagios-a]:  Latency: LegendO[nagios-a]:  Execution Time: Legend1[nagios-a]: Latency Legend2[nagios-a]: Execution Time Legend3[nagios-a]: Maximal 5 Minute Latency Legend4[nagios-a]: Maximal 5 Minute Execution Time # Service Percent State Change Target[nagios-b]: `@bindir@/nagiostats --mrtg --data=AVGACTSVCPSC,AVGPSVSVCPSC,PROGRUNTIME,NAGIOSVERPID` MaxBytes[nagios-b]: 100 Title[nagios-b]: Average Service State Change PageTop[nagios-b]:

    Average Service State Change

    Options[nagios-b]: growright,gauge,nopercent YLegend[nagios-b]: Percent ShortLegend[nagios-b]:   LegendI[nagios-b]:  Active Check % Change: LegendO[nagios-b]:  Passive Check % Change: Legend1[nagios-b]: State Change Legend2[nagios-b]: State Change Legend3[nagios-b]: Maximal 5 Minute State Change Legend4[nagios-b]: Maximal 5 Minute State Change # Host Latency and Execution Time Target[nagios-c]: `@bindir@/nagiostats --mrtg --data=AVGACTHSTLAT,AVGACTHSTEXT,PROGRUNTIME,NAGIOSVERPID` MaxBytes[nagios-c]: 100000 Title[nagios-c]: Average Host Check Latency and Execution Time PageTop[nagios-c]:

    Average Host Check Latency and Execution Time

    Options[nagios-c]: growright,gauge,nopercent YLegend[nagios-c]: Milliseconds ShortLegend[nagios-c]:   LegendI[nagios-c]:  Latency: LegendO[nagios-c]:  Execution Time: Legend1[nagios-c]: Latency Legend2[nagios-c]: Execution Time Legend3[nagios-c]: Maximal 5 Minute Latency Legend4[nagios-c]: Maximal 5 Minute Execution Time # Host Percent State Change Target[nagios-d]: `@bindir@/nagiostats --mrtg --data=AVGACTHSTPSC,AVGPSVHSTPSC,PROGRUNTIME,NAGIOSVERPID` MaxBytes[nagios-d]: 100 Title[nagios-d]: Average Host State Change PageTop[nagios-d]:

    Average Host State Change

    Options[nagios-d]: growright,gauge,nopercent YLegend[nagios-d]: Percent ShortLegend[nagios-d]:   LegendI[nagios-d]:  Active Check % Change: LegendO[nagios-d]:  Passive Check % Change: Legend1[nagios-d]: State Change Legend2[nagios-d]: State Change Legend3[nagios-d]: Maximal 5 Minute State Change Legend4[nagios-d]: Maximal 5 Minute State Change # Hosts/Services Actively Checked Target[nagios-e]: `@bindir@/nagiostats --mrtg --data=NUMHSTACTCHK5M,NUMSVCACTCHK5M,PROGRUNTIME,NAGIOSVERPID` MaxBytes[nagios-e]: 7000 Title[nagios-e]: Hosts/Services Actively Checked PageTop[nagios-e]:

    Hosts/Services Actively Checked

    Options[nagios-e]: growright,gauge,nopercent YLegend[nagios-e]: Total ShortLegend[nagios-e]:   LegendI[nagios-e]:  Hosts: LegendO[nagios-e]:  Services: # Hosts/Services Passively Checked Target[nagios-f]: `@bindir@/nagiostats --mrtg --data=NUMHSTPSVCHK5M,NUMSVCPSVCHK5M,PROGRUNTIME,NAGIOSVERPID` MaxBytes[nagios-f]: 7000 Title[nagios-f]: Hosts/Services Passively Checked PageTop[nagios-f]:

    Hosts/Services Passively Checked

    Options[nagios-f]: growright,gauge,nopercent YLegend[nagios-f]: Total ShortLegend[nagios-f]:   LegendI[nagios-f]:  Hosts: LegendO[nagios-f]:  Services: # Used/Avail External Command Buffers Target[nagios-g]: `@bindir@/nagiostats --mrtg --data=TOTCMDBUF,USEDCMDBUF,PROGRUNTIME,NAGIOSVERPID` MaxBytes[nagios-g]: 7000 Title[nagios-g]: External Command Buffers PageTop[nagios-g]:

    External Command Buffers

    Options[nagios-g]: growright,gauge,nopercent YLegend[nagios-g]: Buffers ShortLegend[nagios-g]:   LegendI[nagios-g]:  Total: LegendO[nagios-g]:  Used: # Active Host Checks Target[nagios-i]: `@bindir@/nagiostats --mrtg --data=NUMSACTHSTCHECKS5M,NUMOACTHSTCHECKS5M,PROGRUNTIME,NAGIOSVERPID` MaxBytes[nagios-i]: 7000 Title[nagios-i]: Active Host Checks PageTop[nagios-i]:

    Active Host Checks

    Options[nagios-i]: growright,gauge,nopercent YLegend[nagios-i]: Checks ShortLegend[nagios-i]:   LegendI[nagios-i]:  Scheduled Checks: LegendO[nagios-i]:  On-Demand Checks: # Active Service Checks Target[nagios-j]: `@bindir@/nagiostats --mrtg --data=NUMSACTSVCCHECKS5M,NUMOACTSVCCHECKS5M,PROGRUNTIME,NAGIOSVERPID` MaxBytes[nagios-j]: 7000 Title[nagios-j]: Active Service Checks PageTop[nagios-j]:

    Active Service Checks

    Options[nagios-j]: growright,gauge,nopercent YLegend[nagios-j]: Checks ShortLegend[nagios-j]:   LegendI[nagios-j]:  Scheduled Checks: LegendO[nagios-j]:  On-Demand Checks: # Passive Host/Service Checks Target[nagios-k]: `@bindir@/nagiostats --mrtg --data=NUMPSVHSTCHECKS5M,NUMPSVSVCCHECKS5M,PROGRUNTIME,NAGIOSVERPID` MaxBytes[nagios-k]: 7000 Title[nagios-k]: Passive Host/Service Checks PageTop[nagios-k]:

    Passive Host/Service Checks

    Options[nagios-k]: growright,gauge,nopercent YLegend[nagios-k]: Checks ShortLegend[nagios-k]:   LegendI[nagios-k]:  Host Checks: LegendO[nagios-k]:  Service Checks: # Cached Host/Service Checks Target[nagios-l]: `@bindir@/nagiostats --mrtg --data=NUMCACHEDHSTCHECKS5M,NUMCACHEDSVCCHECKS5M,PROGRUNTIME,NAGIOSVERPID` MaxBytes[nagios-l]: 7000 Title[nagios-l]: Cached Host/Service Checks PageTop[nagios-l]:

    Cached Host/Service Checks

    Options[nagios-l]: growright,gauge,nopercent YLegend[nagios-l]: Checks ShortLegend[nagios-l]:   LegendI[nagios-l]:  Host Checks: LegendO[nagios-l]:  Service Checks: # External Commands Target[nagios-m]: `@bindir@/nagiostats --mrtg --data=NUMEXTCMDS5M,0,PROGRUNTIME,NAGIOSVERPID` MaxBytes[nagios-m]: 7000 Title[nagios-m]: External Commands PageTop[nagios-m]:

    External Commands

    Options[nagios-m]: growright,gauge,nopercent YLegend[nagios-m]: Commands ShortLegend[nagios-m]:   LegendI[nagios-m]:  Commands: LegendO[nagios-m]:   # Parallel/Service Host Checks Target[nagios-n]: `@bindir@/nagiostats --mrtg --data=NUMPARHSTCHECKS5M,NUMSERHSTCHECKS5M,PROGRUNTIME,NAGIOSVERPID` MaxBytes[nagios-n]: 7000 Title[nagios-n]: Parallel/Serial Host Checks PageTop[nagios-n]:

    Parallel/Serial Host Checks

    Options[nagios-n]: growright,gauge,nopercent YLegend[nagios-n]: Checks ShortLegend[nagios-n]:   LegendI[nagios-n]:  Parallel Checks: LegendO[nagios-n]:  Serial Checks: nagios-4.3.4/sample-config/nagios.cfg.in000066400000000000000000001271301314764422400201070ustar00rootroot00000000000000############################################################################## # # NAGIOS.CFG - Sample Main Config File for Nagios @VERSION@ # # Read the documentation for more information on this configuration # file. I've provided some comments here, but things may not be so # clear without further explanation. # # ############################################################################## # LOG FILE # This is the main log file where service and host events are logged # for historical purposes. This should be the first option specified # in the config file!!! log_file=@localstatedir@/nagios.log # OBJECT CONFIGURATION FILE(S) # These are the object configuration files in which you define hosts, # host groups, contacts, contact groups, services, etc. # You can split your object definitions across several config files # if you wish (as shown below), or keep them all in a single config file. # You can specify individual object config files as shown below: cfg_file=@sysconfdir@/objects/commands.cfg cfg_file=@sysconfdir@/objects/contacts.cfg cfg_file=@sysconfdir@/objects/timeperiods.cfg cfg_file=@sysconfdir@/objects/templates.cfg # Definitions for monitoring the local (Linux) host cfg_file=@sysconfdir@/objects/localhost.cfg # Definitions for monitoring a Windows machine #cfg_file=@sysconfdir@/objects/windows.cfg # Definitions for monitoring a router/switch #cfg_file=@sysconfdir@/objects/switch.cfg # Definitions for monitoring a network printer #cfg_file=@sysconfdir@/objects/printer.cfg # You can also tell Nagios to process all config files (with a .cfg # extension) in a particular directory by using the cfg_dir # directive as shown below: #cfg_dir=@sysconfdir@/servers #cfg_dir=@sysconfdir@/printers #cfg_dir=@sysconfdir@/switches #cfg_dir=@sysconfdir@/routers # OBJECT CACHE FILE # This option determines where object definitions are cached when # Nagios starts/restarts. The CGIs read object definitions from # this cache file (rather than looking at the object config files # directly) in order to prevent inconsistencies that can occur # when the config files are modified after Nagios starts. object_cache_file=@localstatedir@/objects.cache # PRE-CACHED OBJECT FILE # This options determines the location of the precached object file. # If you run Nagios with the -p command line option, it will preprocess # your object configuration file(s) and write the cached config to this # file. You can then start Nagios with the -u option to have it read # object definitions from this precached file, rather than the standard # object configuration files (see the cfg_file and cfg_dir options above). # Using a precached object file can speed up the time needed to (re)start # the Nagios process if you've got a large and/or complex configuration. # Read the documentation section on optimizing Nagios to find our more # about how this feature works. precached_object_file=@localstatedir@/objects.precache # RESOURCE FILE # This is an optional resource file that contains $USERx$ macro # definitions. Multiple resource files can be specified by using # multiple resource_file definitions. The CGIs will not attempt to # read the contents of resource files, so information that is # considered to be sensitive (usernames, passwords, etc) can be # defined as macros in this file and restrictive permissions (600) # can be placed on this file. resource_file=@sysconfdir@/resource.cfg # STATUS FILE # This is where the current status of all monitored services and # hosts is stored. Its contents are read and processed by the CGIs. # The contents of the status file are deleted every time Nagios # restarts. status_file=@localstatedir@/status.dat # STATUS FILE UPDATE INTERVAL # This option determines the frequency (in seconds) that # Nagios will periodically dump program, host, and # service status data. status_update_interval=10 # NAGIOS USER # This determines the effective user that Nagios should run as. # You can either supply a username or a UID. nagios_user=@nagios_user@ # NAGIOS GROUP # This determines the effective group that Nagios should run as. # You can either supply a group name or a GID. nagios_group=@nagios_grp@ # EXTERNAL COMMAND OPTION # This option allows you to specify whether or not Nagios should check # for external commands (in the command file defined below). By default # Nagios will *not* check for external commands, just to be on the # cautious side. If you want to be able to use the CGI command interface # you will have to enable this. # Values: 0 = disable commands, 1 = enable commands check_external_commands=1 # EXTERNAL COMMAND FILE # This is the file that Nagios checks for external command requests. # It is also where the command CGI will write commands that are submitted # by users, so it must be writeable by the user that the web server # is running as (usually 'nobody'). Permissions should be set at the # directory level instead of on the file, as the file is deleted every # time its contents are processed. command_file=@localstatedir@/rw/nagios.cmd # QUERY HANDLER INTERFACE # This is the socket that is created for the Query Handler interface #query_socket=@localstatedir@/rw/nagios.qh # LOCK FILE # This is the lockfile that Nagios will use to store its PID number # in when it is running in daemon mode. lock_file=@lockfile@ # TEMP FILE # This is a temporary file that is used as scratch space when Nagios # updates the status log, cleans the comment file, etc. This file # is created, used, and deleted throughout the time that Nagios is # running. temp_file=@localstatedir@/nagios.tmp # TEMP PATH # This is path where Nagios can create temp files for service and # host check results, etc. temp_path=@TMPDIR@ # EVENT BROKER OPTIONS # Controls what (if any) data gets sent to the event broker. # Values: 0 = Broker nothing # -1 = Broker everything # = See documentation event_broker_options=-1 # EVENT BROKER MODULE(S) # This directive is used to specify an event broker module that should # by loaded by Nagios at startup. Use multiple directives if you want # to load more than one module. Arguments that should be passed to # the module at startup are separated from the module path by a space. # #!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! # WARNING !!! WARNING !!! WARNING !!! WARNING !!! WARNING !!! WARNING #!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! # # Do NOT overwrite modules while they are being used by Nagios or Nagios # will crash in a fiery display of SEGFAULT glory. This is a bug/limitation # either in dlopen(), the kernel, and/or the filesystem. And maybe Nagios... # # The correct/safe way of updating a module is by using one of these methods: # 1. Shutdown Nagios, replace the module file, restart Nagios # 2. Delete the original module file, move the new module file into place, restart Nagios # # Example: # # broker_module= [moduleargs] #broker_module=/somewhere/module1.o #broker_module=/somewhere/module2.o arg1 arg2=3 debug=0 # LOG ROTATION METHOD # This is the log rotation method that Nagios should use to rotate # the main log file. Values are as follows.. # n = None - don't rotate the log # h = Hourly rotation (top of the hour) # d = Daily rotation (midnight every day) # w = Weekly rotation (midnight on Saturday evening) # m = Monthly rotation (midnight last day of month) log_rotation_method=d # LOG ARCHIVE PATH # This is the directory where archived (rotated) log files should be # placed (assuming you've chosen to do log rotation). log_archive_path=@localstatedir@/archives # LOGGING OPTIONS # If you want messages logged to the syslog facility, as well as the # Nagios log file set this option to 1. If not, set it to 0. use_syslog=1 # NOTIFICATION LOGGING OPTION # If you don't want notifications to be logged, set this value to 0. # If notifications should be logged, set the value to 1. log_notifications=1 # SERVICE RETRY LOGGING OPTION # If you don't want service check retries to be logged, set this value # to 0. If retries should be logged, set the value to 1. log_service_retries=1 # HOST RETRY LOGGING OPTION # If you don't want host check retries to be logged, set this value to # 0. If retries should be logged, set the value to 1. log_host_retries=1 # EVENT HANDLER LOGGING OPTION # If you don't want host and service event handlers to be logged, set # this value to 0. If event handlers should be logged, set the value # to 1. log_event_handlers=1 # INITIAL STATES LOGGING OPTION # If you want Nagios to log all initial host and service states to # the main log file (the first time the service or host is checked) # you can enable this option by setting this value to 1. If you # are not using an external application that does long term state # statistics reporting, you do not need to enable this option. In # this case, set the value to 0. log_initial_states=0 # CURRENT STATES LOGGING OPTION # If you don't want Nagios to log all current host and service states # after log has been rotated to the main log file, you can disable this # option by setting this value to 0. Default value is 1. log_current_states=1 # EXTERNAL COMMANDS LOGGING OPTION # If you don't want Nagios to log external commands, set this value # to 0. If external commands should be logged, set this value to 1. # Note: This option does not include logging of passive service # checks - see the option below for controlling whether or not # passive checks are logged. log_external_commands=1 # PASSIVE CHECKS LOGGING OPTION # If you don't want Nagios to log passive host and service checks, set # this value to 0. If passive checks should be logged, set # this value to 1. log_passive_checks=1 # GLOBAL HOST AND SERVICE EVENT HANDLERS # These options allow you to specify a host and service event handler # command that is to be run for every host or service state change. # The global event handler is executed immediately prior to the event # handler that you have optionally specified in each host or # service definition. The command argument is the short name of a # command definition that you define in your host configuration file. # Read the HTML docs for more information. #global_host_event_handler=somecommand #global_service_event_handler=somecommand # SERVICE INTER-CHECK DELAY METHOD # This is the method that Nagios should use when initially # "spreading out" service checks when it starts monitoring. The # default is to use smart delay calculation, which will try to # space all service checks out evenly to minimize CPU load. # Using the dumb setting will cause all checks to be scheduled # at the same time (with no delay between them)! This is not a # good thing for production, but is useful when testing the # parallelization functionality. # n = None - don't use any delay between checks # d = Use a "dumb" delay of 1 second between checks # s = Use "smart" inter-check delay calculation # x.xx = Use an inter-check delay of x.xx seconds service_inter_check_delay_method=s # MAXIMUM SERVICE CHECK SPREAD # This variable determines the timeframe (in minutes) from the # program start time that an initial check of all services should # be completed. Default is 30 minutes. max_service_check_spread=30 # SERVICE CHECK INTERLEAVE FACTOR # This variable determines how service checks are interleaved. # Interleaving the service checks allows for a more even # distribution of service checks and reduced load on remote # hosts. Setting this value to 1 is equivalent to how versions # of Nagios previous to 0.0.5 did service checks. Set this # value to s (smart) for automatic calculation of the interleave # factor unless you have a specific reason to change it. # s = Use "smart" interleave factor calculation # x = Use an interleave factor of x, where x is a # number greater than or equal to 1. service_interleave_factor=s # HOST INTER-CHECK DELAY METHOD # This is the method that Nagios should use when initially # "spreading out" host checks when it starts monitoring. The # default is to use smart delay calculation, which will try to # space all host checks out evenly to minimize CPU load. # Using the dumb setting will cause all checks to be scheduled # at the same time (with no delay between them)! # n = None - don't use any delay between checks # d = Use a "dumb" delay of 1 second between checks # s = Use "smart" inter-check delay calculation # x.xx = Use an inter-check delay of x.xx seconds host_inter_check_delay_method=s # MAXIMUM HOST CHECK SPREAD # This variable determines the timeframe (in minutes) from the # program start time that an initial check of all hosts should # be completed. Default is 30 minutes. max_host_check_spread=30 # MAXIMUM CONCURRENT SERVICE CHECKS # This option allows you to specify the maximum number of # service checks that can be run in parallel at any given time. # Specifying a value of 1 for this variable essentially prevents # any service checks from being parallelized. A value of 0 # will not restrict the number of concurrent checks that are # being executed. max_concurrent_checks=0 # HOST AND SERVICE CHECK REAPER FREQUENCY # This is the frequency (in seconds!) that Nagios will process # the results of host and service checks. check_result_reaper_frequency=10 # MAX CHECK RESULT REAPER TIME # This is the max amount of time (in seconds) that a single # check result reaper event will be allowed to run before # returning control back to Nagios so it can perform other # duties. max_check_result_reaper_time=30 # CHECK RESULT PATH # This is directory where Nagios stores the results of host and # service checks that have not yet been processed. # # Note: Make sure that only one instance of Nagios has access # to this directory! check_result_path=@CHECKRESULTDIR@ # MAX CHECK RESULT FILE AGE # This option determines the maximum age (in seconds) which check # result files are considered to be valid. Files older than this # threshold will be mercilessly deleted without further processing. max_check_result_file_age=3600 # CACHED HOST CHECK HORIZON # This option determines the maximum amount of time (in seconds) # that the state of a previous host check is considered current. # Cached host states (from host checks that were performed more # recently that the timeframe specified by this value) can immensely # improve performance in regards to the host check logic. # Too high of a value for this option may result in inaccurate host # states being used by Nagios, while a lower value may result in a # performance hit for host checks. Use a value of 0 to disable host # check caching. cached_host_check_horizon=15 # CACHED SERVICE CHECK HORIZON # This option determines the maximum amount of time (in seconds) # that the state of a previous service check is considered current. # Cached service states (from service checks that were performed more # recently that the timeframe specified by this value) can immensely # improve performance in regards to predictive dependency checks. # Use a value of 0 to disable service check caching. cached_service_check_horizon=15 # ENABLE PREDICTIVE HOST DEPENDENCY CHECKS # This option determines whether or not Nagios will attempt to execute # checks of hosts when it predicts that future dependency logic test # may be needed. These predictive checks can help ensure that your # host dependency logic works well. # Values: # 0 = Disable predictive checks # 1 = Enable predictive checks (default) enable_predictive_host_dependency_checks=1 # ENABLE PREDICTIVE SERVICE DEPENDENCY CHECKS # This option determines whether or not Nagios will attempt to execute # checks of service when it predicts that future dependency logic test # may be needed. These predictive checks can help ensure that your # service dependency logic works well. # Values: # 0 = Disable predictive checks # 1 = Enable predictive checks (default) enable_predictive_service_dependency_checks=1 # SOFT STATE DEPENDENCIES # This option determines whether or not Nagios will use soft state # information when checking host and service dependencies. Normally # Nagios will only use the latest hard host or service state when # checking dependencies. If you want it to use the latest state (regardless # of whether its a soft or hard state type), enable this option. # Values: # 0 = Don't use soft state dependencies (default) # 1 = Use soft state dependencies soft_state_dependencies=0 # TIME CHANGE ADJUSTMENT THRESHOLDS # These options determine when Nagios will react to detected changes # in system time (either forward or backwards). #time_change_threshold=900 # AUTO-RESCHEDULING OPTION # This option determines whether or not Nagios will attempt to # automatically reschedule active host and service checks to # "smooth" them out over time. This can help balance the load on # the monitoring server. # WARNING: THIS IS AN EXPERIMENTAL FEATURE - IT CAN DEGRADE # PERFORMANCE, RATHER THAN INCREASE IT, IF USED IMPROPERLY auto_reschedule_checks=0 # AUTO-RESCHEDULING INTERVAL # This option determines how often (in seconds) Nagios will # attempt to automatically reschedule checks. This option only # has an effect if the auto_reschedule_checks option is enabled. # Default is 30 seconds. # WARNING: THIS IS AN EXPERIMENTAL FEATURE - IT CAN DEGRADE # PERFORMANCE, RATHER THAN INCREASE IT, IF USED IMPROPERLY auto_rescheduling_interval=30 # AUTO-RESCHEDULING WINDOW # This option determines the "window" of time (in seconds) that # Nagios will look at when automatically rescheduling checks. # Only host and service checks that occur in the next X seconds # (determined by this variable) will be rescheduled. This option # only has an effect if the auto_reschedule_checks option is # enabled. Default is 180 seconds (3 minutes). # WARNING: THIS IS AN EXPERIMENTAL FEATURE - IT CAN DEGRADE # PERFORMANCE, RATHER THAN INCREASE IT, IF USED IMPROPERLY auto_rescheduling_window=180 # TIMEOUT VALUES # These options control how much time Nagios will allow various # types of commands to execute before killing them off. Options # are available for controlling maximum time allotted for # service checks, host checks, event handlers, notifications, the # ocsp command, and performance data commands. All values are in # seconds. service_check_timeout=60 host_check_timeout=30 event_handler_timeout=30 notification_timeout=30 ocsp_timeout=5 perfdata_timeout=5 # RETAIN STATE INFORMATION # This setting determines whether or not Nagios will save state # information for services and hosts before it shuts down. Upon # startup Nagios will reload all saved service and host state # information before starting to monitor. This is useful for # maintaining long-term data on state statistics, etc, but will # slow Nagios down a bit when it (re)starts. Since its only # a one-time penalty, I think its well worth the additional # startup delay. retain_state_information=1 # STATE RETENTION FILE # This is the file that Nagios should use to store host and # service state information before it shuts down. The state # information in this file is also read immediately prior to # starting to monitor the network when Nagios is restarted. # This file is used only if the retain_state_information # variable is set to 1. state_retention_file=@localstatedir@/retention.dat # RETENTION DATA UPDATE INTERVAL # This setting determines how often (in minutes) that Nagios # will automatically save retention data during normal operation. # If you set this value to 0, Nagios will not save retention # data at regular interval, but it will still save retention # data before shutting down or restarting. If you have disabled # state retention, this option has no effect. retention_update_interval=60 # USE RETAINED PROGRAM STATE # This setting determines whether or not Nagios will set # program status variables based on the values saved in the # retention file. If you want to use retained program status # information, set this value to 1. If not, set this value # to 0. use_retained_program_state=1 # USE RETAINED SCHEDULING INFO # This setting determines whether or not Nagios will retain # the scheduling info (next check time) for hosts and services # based on the values saved in the retention file. If you # If you want to use retained scheduling info, set this # value to 1. If not, set this value to 0. use_retained_scheduling_info=1 # RETAINED ATTRIBUTE MASKS (ADVANCED FEATURE) # The following variables are used to specify specific host and # service attributes that should *not* be retained by Nagios during # program restarts. # # The values of the masks are bitwise ANDs of values specified # by the "MODATTR_" definitions found in include/common.h. # For example, if you do not want the current enabled/disabled state # of flap detection and event handlers for hosts to be retained, you # would use a value of 24 for the host attribute mask... # MODATTR_EVENT_HANDLER_ENABLED (8) + MODATTR_FLAP_DETECTION_ENABLED (16) = 24 # This mask determines what host attributes are not retained retained_host_attribute_mask=0 # This mask determines what service attributes are not retained retained_service_attribute_mask=0 # These two masks determine what process attributes are not retained. # There are two masks, because some process attributes have host and service # options. For example, you can disable active host checks, but leave active # service checks enabled. retained_process_host_attribute_mask=0 retained_process_service_attribute_mask=0 # These two masks determine what contact attributes are not retained. # There are two masks, because some contact attributes have host and # service options. For example, you can disable host notifications for # a contact, but leave service notifications enabled for them. retained_contact_host_attribute_mask=0 retained_contact_service_attribute_mask=0 # INTERVAL LENGTH # This is the seconds per unit interval as used in the # host/contact/service configuration files. Setting this to 60 means # that each interval is one minute long (60 seconds). Other settings # have not been tested much, so your mileage is likely to vary... interval_length=60 # CHECK FOR UPDATES # This option determines whether Nagios will automatically check to # see if new updates (releases) are available. It is recommend that you # enable this option to ensure that you stay on top of the latest critical # patches to Nagios. Nagios is critical to you - make sure you keep it in # good shape. Nagios will check once a day for new updates. Data collected # by Nagios Enterprises from the update check is processed in accordance # with our privacy policy - see https://api.nagios.org for details. check_for_updates=1 # BARE UPDATE CHECK # This option determines what data Nagios will send to api.nagios.org when # it checks for updates. By default, Nagios will send information on the # current version of Nagios you have installed, as well as an indicator as # to whether this was a new installation or not. Nagios Enterprises uses # this data to determine the number of users running specific version of # Nagios. Enable this option if you do not want this information to be sent. bare_update_check=0 # AGGRESSIVE HOST CHECKING OPTION # If you don't want to turn on aggressive host checking features, set # this value to 0 (the default). Otherwise set this value to 1 to # enable the aggressive check option. Read the docs for more info # on what aggressive host check is or check out the source code in # base/checks.c use_aggressive_host_checking=0 # SERVICE CHECK EXECUTION OPTION # This determines whether or not Nagios will actively execute # service checks when it initially starts. If this option is # disabled, checks are not actively made, but Nagios can still # receive and process passive check results that come in. Unless # you're implementing redundant hosts or have a special need for # disabling the execution of service checks, leave this enabled! # Values: 1 = enable checks, 0 = disable checks execute_service_checks=1 # PASSIVE SERVICE CHECK ACCEPTANCE OPTION # This determines whether or not Nagios will accept passive # service checks results when it initially (re)starts. # Values: 1 = accept passive checks, 0 = reject passive checks accept_passive_service_checks=1 # HOST CHECK EXECUTION OPTION # This determines whether or not Nagios will actively execute # host checks when it initially starts. If this option is # disabled, checks are not actively made, but Nagios can still # receive and process passive check results that come in. Unless # you're implementing redundant hosts or have a special need for # disabling the execution of host checks, leave this enabled! # Values: 1 = enable checks, 0 = disable checks execute_host_checks=1 # PASSIVE HOST CHECK ACCEPTANCE OPTION # This determines whether or not Nagios will accept passive # host checks results when it initially (re)starts. # Values: 1 = accept passive checks, 0 = reject passive checks accept_passive_host_checks=1 # NOTIFICATIONS OPTION # This determines whether or not Nagios will sent out any host or # service notifications when it is initially (re)started. # Values: 1 = enable notifications, 0 = disable notifications enable_notifications=1 # EVENT HANDLER USE OPTION # This determines whether or not Nagios will run any host or # service event handlers when it is initially (re)started. Unless # you're implementing redundant hosts, leave this option enabled. # Values: 1 = enable event handlers, 0 = disable event handlers enable_event_handlers=1 # PROCESS PERFORMANCE DATA OPTION # This determines whether or not Nagios will process performance # data returned from service and host checks. If this option is # enabled, host performance data will be processed using the # host_perfdata_command (defined below) and service performance # data will be processed using the service_perfdata_command (also # defined below). Read the HTML docs for more information on # performance data. # Values: 1 = process performance data, 0 = do not process performance data process_performance_data=0 # HOST AND SERVICE PERFORMANCE DATA PROCESSING COMMANDS # These commands are run after every host and service check is # performed. These commands are executed only if the # enable_performance_data option (above) is set to 1. The command # argument is the short name of a command definition that you # define in your host configuration file. Read the HTML docs for # more information on performance data. #host_perfdata_command=process-host-perfdata #service_perfdata_command=process-service-perfdata # HOST AND SERVICE PERFORMANCE DATA FILES # These files are used to store host and service performance data. # Performance data is only written to these files if the # enable_performance_data option (above) is set to 1. #host_perfdata_file=@localstatedir@/host-perfdata #service_perfdata_file=@localstatedir@/service-perfdata # HOST AND SERVICE PERFORMANCE DATA FILE TEMPLATES # These options determine what data is written (and how) to the # performance data files. The templates may contain macros, special # characters (\t for tab, \r for carriage return, \n for newline) # and plain text. A newline is automatically added after each write # to the performance data file. Some examples of what you can do are # shown below. #host_perfdata_file_template=[HOSTPERFDATA]\t$TIMET$\t$HOSTNAME$\t$HOSTEXECUTIONTIME$\t$HOSTOUTPUT$\t$HOSTPERFDATA$ #service_perfdata_file_template=[SERVICEPERFDATA]\t$TIMET$\t$HOSTNAME$\t$SERVICEDESC$\t$SERVICEEXECUTIONTIME$\t$SERVICELATENCY$\t$SERVICEOUTPUT$\t$SERVICEPERFDATA$ # HOST AND SERVICE PERFORMANCE DATA FILE MODES # This option determines whether or not the host and service # performance data files are opened in write ("w") or append ("a") # mode. If you want to use named pipes, you should use the special # pipe ("p") mode which avoid blocking at startup, otherwise you will # likely want the default append ("a") mode. #host_perfdata_file_mode=a #service_perfdata_file_mode=a # HOST AND SERVICE PERFORMANCE DATA FILE PROCESSING INTERVAL # These options determine how often (in seconds) the host and service # performance data files are processed using the commands defined # below. A value of 0 indicates the files should not be periodically # processed. #host_perfdata_file_processing_interval=0 #service_perfdata_file_processing_interval=0 # HOST AND SERVICE PERFORMANCE DATA FILE PROCESSING COMMANDS # These commands are used to periodically process the host and # service performance data files. The interval at which the # processing occurs is determined by the options above. #host_perfdata_file_processing_command=process-host-perfdata-file #service_perfdata_file_processing_command=process-service-perfdata-file # HOST AND SERVICE PERFORMANCE DATA PROCESS EMPTY RESULTS # These options determine wether the core will process empty perfdata # results or not. This is needed for distributed monitoring, and intentionally # turned on by default. # If you don't require empty perfdata - saving some cpu cycles # on unwanted macro calculation - you can turn that off. Be careful! # Values: 1 = enable, 0 = disable #host_perfdata_process_empty_results=1 #service_perfdata_process_empty_results=1 # OBSESS OVER SERVICE CHECKS OPTION # This determines whether or not Nagios will obsess over service # checks and run the ocsp_command defined below. Unless you're # planning on implementing distributed monitoring, do not enable # this option. Read the HTML docs for more information on # implementing distributed monitoring. # Values: 1 = obsess over services, 0 = do not obsess (default) obsess_over_services=0 # OBSESSIVE COMPULSIVE SERVICE PROCESSOR COMMAND # This is the command that is run for every service check that is # processed by Nagios. This command is executed only if the # obsess_over_services option (above) is set to 1. The command # argument is the short name of a command definition that you # define in your host configuration file. Read the HTML docs for # more information on implementing distributed monitoring. #ocsp_command=somecommand # OBSESS OVER HOST CHECKS OPTION # This determines whether or not Nagios will obsess over host # checks and run the ochp_command defined below. Unless you're # planning on implementing distributed monitoring, do not enable # this option. Read the HTML docs for more information on # implementing distributed monitoring. # Values: 1 = obsess over hosts, 0 = do not obsess (default) obsess_over_hosts=0 # OBSESSIVE COMPULSIVE HOST PROCESSOR COMMAND # This is the command that is run for every host check that is # processed by Nagios. This command is executed only if the # obsess_over_hosts option (above) is set to 1. The command # argument is the short name of a command definition that you # define in your host configuration file. Read the HTML docs for # more information on implementing distributed monitoring. #ochp_command=somecommand # TRANSLATE PASSIVE HOST CHECKS OPTION # This determines whether or not Nagios will translate # DOWN/UNREACHABLE passive host check results into their proper # state for this instance of Nagios. This option is useful # if you have distributed or failover monitoring setup. In # these cases your other Nagios servers probably have a different # "view" of the network, with regards to the parent/child relationship # of hosts. If a distributed monitoring server thinks a host # is DOWN, it may actually be UNREACHABLE from the point of # this Nagios instance. Enabling this option will tell Nagios # to translate any DOWN or UNREACHABLE host states it receives # passively into the correct state from the view of this server. # Values: 1 = perform translation, 0 = do not translate (default) translate_passive_host_checks=0 # PASSIVE HOST CHECKS ARE SOFT OPTION # This determines whether or not Nagios will treat passive host # checks as being HARD or SOFT. By default, a passive host check # result will put a host into a HARD state type. This can be changed # by enabling this option. # Values: 0 = passive checks are HARD, 1 = passive checks are SOFT passive_host_checks_are_soft=0 # ORPHANED HOST/SERVICE CHECK OPTIONS # These options determine whether or not Nagios will periodically # check for orphaned host service checks. Since service checks are # not rescheduled until the results of their previous execution # instance are processed, there exists a possibility that some # checks may never get rescheduled. A similar situation exists for # host checks, although the exact scheduling details differ a bit # from service checks. Orphaned checks seem to be a rare # problem and should not happen under normal circumstances. # If you have problems with service checks never getting # rescheduled, make sure you have orphaned service checks enabled. # Values: 1 = enable checks, 0 = disable checks check_for_orphaned_services=1 check_for_orphaned_hosts=1 # SERVICE FRESHNESS CHECK OPTION # This option determines whether or not Nagios will periodically # check the "freshness" of service results. Enabling this option # is useful for ensuring passive checks are received in a timely # manner. # Values: 1 = enabled freshness checking, 0 = disable freshness checking check_service_freshness=1 # SERVICE FRESHNESS CHECK INTERVAL # This setting determines how often (in seconds) Nagios will # check the "freshness" of service check results. If you have # disabled service freshness checking, this option has no effect. service_freshness_check_interval=60 # SERVICE CHECK TIMEOUT STATE # This setting determines the state Nagios will report when a # service check times out - that is does not respond within # service_check_timeout seconds. This can be useful if a # machine is running at too high a load and you do not want # to consider a failed service check to be critical (the default). # Valid settings are: # c - Critical (default) # u - Unknown # w - Warning # o - OK service_check_timeout_state=c # HOST FRESHNESS CHECK OPTION # This option determines whether or not Nagios will periodically # check the "freshness" of host results. Enabling this option # is useful for ensuring passive checks are received in a timely # manner. # Values: 1 = enabled freshness checking, 0 = disable freshness checking check_host_freshness=0 # HOST FRESHNESS CHECK INTERVAL # This setting determines how often (in seconds) Nagios will # check the "freshness" of host check results. If you have # disabled host freshness checking, this option has no effect. host_freshness_check_interval=60 # ADDITIONAL FRESHNESS THRESHOLD LATENCY # This setting determines the number of seconds that Nagios # will add to any host and service freshness thresholds that # it calculates (those not explicitly specified by the user). additional_freshness_latency=15 # FLAP DETECTION OPTION # This option determines whether or not Nagios will try # and detect hosts and services that are "flapping". # Flapping occurs when a host or service changes between # states too frequently. When Nagios detects that a # host or service is flapping, it will temporarily suppress # notifications for that host/service until it stops # flapping. Flap detection is very experimental, so read # the HTML documentation before enabling this feature! # Values: 1 = enable flap detection # 0 = disable flap detection (default) enable_flap_detection=1 # FLAP DETECTION THRESHOLDS FOR HOSTS AND SERVICES # Read the HTML documentation on flap detection for # an explanation of what this option does. This option # has no effect if flap detection is disabled. low_service_flap_threshold=5.0 high_service_flap_threshold=20.0 low_host_flap_threshold=5.0 high_host_flap_threshold=20.0 # DATE FORMAT OPTION # This option determines how short dates are displayed. Valid options # include: # us (MM-DD-YYYY HH:MM:SS) # euro (DD-MM-YYYY HH:MM:SS) # iso8601 (YYYY-MM-DD HH:MM:SS) # strict-iso8601 (YYYY-MM-DDTHH:MM:SS) # date_format=us # TIMEZONE OFFSET # This option is used to override the default timezone that this # instance of Nagios runs in. If not specified, Nagios will use # the system configured timezone. # # NOTE: In order to display the correct timezone in the CGIs, you # will also need to alter the Apache directives for the CGI path # to include your timezone. Example: # # # SetEnv TZ "Australia/Brisbane" # ... # #use_timezone=US/Mountain #use_timezone=Australia/Brisbane # ILLEGAL OBJECT NAME CHARACTERS # This option allows you to specify illegal characters that cannot # be used in host names, service descriptions, or names of other # object types. illegal_object_name_chars=`~!$%^&*|'"<>?,()= # ILLEGAL MACRO OUTPUT CHARACTERS # This option allows you to specify illegal characters that are # stripped from macros before being used in notifications, event # handlers, etc. This DOES NOT affect macros used in service or # host check commands. # The following macros are stripped of the characters you specify: # $HOSTOUTPUT$ # $LONGHOSTOUTPUT$ # $HOSTPERFDATA$ # $HOSTACKAUTHOR$ # $HOSTACKCOMMENT$ # $SERVICEOUTPUT$ # $LONGSERVICEOUTPUT$ # $SERVICEPERFDATA$ # $SERVICEACKAUTHOR$ # $SERVICEACKCOMMENT$ illegal_macro_output_chars=`~$&|'"<> # REGULAR EXPRESSION MATCHING # This option controls whether or not regular expression matching # takes place in the object config files. Regular expression # matching is used to match host, hostgroup, service, and service # group names/descriptions in some fields of various object types. # Values: 1 = enable regexp matching, 0 = disable regexp matching use_regexp_matching=0 # "TRUE" REGULAR EXPRESSION MATCHING # This option controls whether or not "true" regular expression # matching takes place in the object config files. This option # only has an effect if regular expression matching is enabled # (see above). If this option is DISABLED, regular expression # matching only occurs if a string contains wildcard characters # (* and ?). If the option is ENABLED, regexp matching occurs # all the time (which can be annoying). # Values: 1 = enable true matching, 0 = disable true matching use_true_regexp_matching=0 # ADMINISTRATOR EMAIL/PAGER ADDRESSES # The email and pager address of a global administrator (likely you). # Nagios never uses these values itself, but you can access them by # using the $ADMINEMAIL$ and $ADMINPAGER$ macros in your notification # commands. admin_email=@nagios_user@@localhost admin_pager=page@nagios_user@@localhost # DAEMON CORE DUMP OPTION # This option determines whether or not Nagios is allowed to create # a core dump when it runs as a daemon. Note that it is generally # considered bad form to allow this, but it may be useful for # debugging purposes. Enabling this option doesn't guarantee that # a core file will be produced, but that's just life... # Values: 1 - Allow core dumps # 0 - Do not allow core dumps (default) daemon_dumps_core=0 # LARGE INSTALLATION TWEAKS OPTION # This option determines whether or not Nagios will take some shortcuts # which can save on memory and CPU usage in large Nagios installations. # Read the documentation for more information on the benefits/tradeoffs # of enabling this option. # Values: 1 - Enabled tweaks # 0 - Disable tweaks (default) use_large_installation_tweaks=0 # ENABLE ENVIRONMENT MACROS # This option determines whether or not Nagios will make all standard # macros available as environment variables when host/service checks # and system commands (event handlers, notifications, etc.) are # executed. # Enabling this is a very bad idea for anything but very small setups, # as it means plugins, notification scripts and eventhandlers may run # out of environment space. It will also cause a significant increase # in CPU- and memory usage and drastically reduce the number of checks # you can run. # Values: 1 - Enable environment variable macros # 0 - Disable environment variable macros (default) enable_environment_macros=0 # CHILD PROCESS MEMORY OPTION # This option determines whether or not Nagios will free memory in # child processes (processed used to execute system commands and host/ # service checks). If you specify a value here, it will override # program defaults. # Value: 1 - Free memory in child processes # 0 - Do not free memory in child processes #free_child_process_memory=1 # CHILD PROCESS FORKING BEHAVIOR # This option determines how Nagios will fork child processes # (used to execute system commands and host/service checks). Normally # child processes are fork()ed twice, which provides a very high level # of isolation from problems. Fork()ing once is probably enough and will # save a great deal on CPU usage (in large installs), so you might # want to consider using this. If you specify a value here, it will # program defaults. # Value: 1 - Child processes fork() twice # 0 - Child processes fork() just once #child_processes_fork_twice=1 # DEBUG LEVEL # This option determines how much (if any) debugging information will # be written to the debug file. OR values together to log multiple # types of information. # Values: # -1 = Everything # 0 = Nothing # 1 = Functions # 2 = Configuration # 4 = Process information # 8 = Scheduled events # 16 = Host/service checks # 32 = Notifications # 64 = Event broker # 128 = External commands # 256 = Commands # 512 = Scheduled downtime # 1024 = Comments # 2048 = Macros debug_level=0 # DEBUG VERBOSITY # This option determines how verbose the debug log out will be. # Values: 0 = Brief output # 1 = More detailed # 2 = Very detailed debug_verbosity=1 # DEBUG FILE # This option determines where Nagios should write debugging information. debug_file=@localstatedir@/nagios.debug # MAX DEBUG FILE SIZE # This option determines the maximum size (in bytes) of the debug file. If # the file grows larger than this size, it will be renamed with a .old # extension. If a file already exists with a .old extension it will # automatically be deleted. This helps ensure your disk space usage doesn't # get out of control when debugging Nagios. max_debug_file_size=1000000 # Should we allow hostgroups to have no hosts, we default this to off since # that was the old behavior allow_empty_hostgroup_assignment=0 # Normally worker count is dynamically allocated based on 1.5 * number of cpu's # with a minimum of 4 workers. This value will override the defaults #check_workers=3 # DISABLE SERVICE CHECKS WHEN HOST DOWN # This option will disable all service checks if the host is not in an UP state # # While desirable in some environments, enabling this value can distort report # values as the expected quantity of checks will not have been performed #host_down_disable_service_checks=0 # EXPERIMENTAL load controlling options # To get current defaults based on your system issue a command to # the query handler. Please note that this is an experimental feature # and not meant for production use. Used incorrectly it can induce # enormous latency. # #core loadctl # jobs_max - The maximum amount of jobs to run at one time # jobs_min - The minimum amount of jobs to run at one time # jobs_limit - The maximum amount of jobs the current load lets us run # backoff_limit - The minimum backoff_change # backoff_change - # of jobs to remove from jobs_limit when backing off # rampup_limit - Minimum rampup_change # rampup_change - # of jobs to add to jobs_limit when ramping up # NOTE: The backoff_limit and rampup_limit are NOT used by anything currently, # so if your system is under load nothing will actively modify the jobs # even if you have these options enabled, they are for external # connector information only. However, if you change the jobs_max or # jobs_min manually here or through the query handler interface that # WILL affect your system #loadctl_options=jobs_max=100;backoff_limit=10;rampup_change=5 nagios-4.3.4/sample-config/resource.cfg.in000066400000000000000000000024121314764422400204510ustar00rootroot00000000000000########################################################################### # # RESOURCE.CFG - Sample Resource File for Nagios @VERSION@ # # # You can define $USERx$ macros in this file, which can in turn be used # in command definitions in your host config file(s). $USERx$ macros are # useful for storing sensitive information such as usernames, passwords, # etc. They are also handy for specifying the path to plugins and # event handlers - if you decide to move the plugins or event handlers to # a different directory in the future, you can just update one or two # $USERx$ macros, instead of modifying a lot of command definitions. # # The CGIs will not attempt to read the contents of resource files, so # you can set restrictive permissions (600 or 660) on them. # # Nagios supports up to 32 $USERx$ macros ($USER1$ through $USER32$) # # Resource files may also be used to store configuration directives for # external data sources like MySQL... # ########################################################################### # Sets $USER1$ to be the path to the plugins $USER1$=@libexecdir@ # Sets $USER2$ to be the path to event handlers #$USER2$=@libexecdir@/eventhandlers # Store some usernames and passwords (hidden from the CGIs) #$USER3$=someuser #$USER4$=somepassword nagios-4.3.4/sample-config/template-object/000077500000000000000000000000001314764422400206145ustar00rootroot00000000000000nagios-4.3.4/sample-config/template-object/README000066400000000000000000000011501314764422400214710ustar00rootroot00000000000000================================ SAMPLE OBJECT CONFIG FILE README ================================ This directory contains sample object definition config files. Sample config files have a .cfg extension. Ignore any files with a .in extension, as they are templates used to generate the sample config files. Please note that you can keep all of your object definitions in a single file if you wish. You may also split them up into multiple config files, as is done here. Read the 'Quickstart Installation Guide' in the HTML documentation for instructions on how to install and use these sample config files. nagios-4.3.4/sample-config/template-object/commands.cfg.in000066400000000000000000000170041314764422400235050ustar00rootroot00000000000000############################################################################### # COMMANDS.CFG - SAMPLE COMMAND DEFINITIONS FOR NAGIOS @VERSION@ # # # NOTES: This config file provides you with some example command definitions # that you can reference in host, service, and contact definitions. # # You don't need to keep commands in a separate file from your other # object definitions. This has been done just to make things easier to # understand. # ############################################################################### ################################################################################ # # SAMPLE NOTIFICATION COMMANDS # # These are some example notification commands. They may or may not work on # your system without modification. As an example, some systems will require # you to use "/usr/bin/mailx" instead of "/usr/bin/mail" in the commands below. # ################################################################################ # 'notify-host-by-email' command definition define command{ command_name notify-host-by-email command_line /usr/bin/printf "%b" "***** Nagios *****\n\nNotification Type: $NOTIFICATIONTYPE$\nHost: $HOSTNAME$\nState: $HOSTSTATE$\nAddress: $HOSTADDRESS$\nInfo: $HOSTOUTPUT$\n\nDate/Time: $LONGDATETIME$\n" | @MAIL_PROG@ -s "** $NOTIFICATIONTYPE$ Host Alert: $HOSTNAME$ is $HOSTSTATE$ **" $CONTACTEMAIL$ } # 'notify-service-by-email' command definition define command{ command_name notify-service-by-email command_line /usr/bin/printf "%b" "***** Nagios *****\n\nNotification Type: $NOTIFICATIONTYPE$\n\nService: $SERVICEDESC$\nHost: $HOSTALIAS$\nAddress: $HOSTADDRESS$\nState: $SERVICESTATE$\n\nDate/Time: $LONGDATETIME$\n\nAdditional Info:\n\n$SERVICEOUTPUT$\n" | @MAIL_PROG@ -s "** $NOTIFICATIONTYPE$ Service Alert: $HOSTALIAS$/$SERVICEDESC$ is $SERVICESTATE$ **" $CONTACTEMAIL$ } ################################################################################ # # SAMPLE HOST CHECK COMMANDS # ################################################################################ # This command checks to see if a host is "alive" by pinging it # The check must result in a 100% packet loss or 5 second (5000ms) round trip # average time to produce a critical error. # Note: Five ICMP echo packets are sent (determined by the '-p 5' argument) # 'check-host-alive' command definition define command{ command_name check-host-alive command_line $USER1$/check_ping -H $HOSTADDRESS$ -w 3000.0,80% -c 5000.0,100% -p 5 } ################################################################################ # # SAMPLE SERVICE CHECK COMMANDS # # These are some example service check commands. They may or may not work on # your system, as they must be modified for your plugins. See the HTML # documentation on the plugins for examples of how to configure command definitions. # # NOTE: The following 'check_local_...' functions are designed to monitor # various metrics on the host that Nagios is running on (i.e. this one). ################################################################################ # 'check_local_disk' command definition define command{ command_name check_local_disk command_line $USER1$/check_disk -w $ARG1$ -c $ARG2$ -p $ARG3$ } # 'check_local_load' command definition define command{ command_name check_local_load command_line $USER1$/check_load -w $ARG1$ -c $ARG2$ } # 'check_local_procs' command definition define command{ command_name check_local_procs command_line $USER1$/check_procs -w $ARG1$ -c $ARG2$ -s $ARG3$ } # 'check_local_users' command definition define command{ command_name check_local_users command_line $USER1$/check_users -w $ARG1$ -c $ARG2$ } # 'check_local_swap' command definition define command{ command_name check_local_swap command_line $USER1$/check_swap -w $ARG1$ -c $ARG2$ } # 'check_local_mrtgtraf' command definition define command{ command_name check_local_mrtgtraf command_line $USER1$/check_mrtgtraf -F $ARG1$ -a $ARG2$ -w $ARG3$ -c $ARG4$ -e $ARG5$ } ################################################################################ # NOTE: The following 'check_...' commands are used to monitor services on # both local and remote hosts. ################################################################################ # 'check_ftp' command definition define command{ command_name check_ftp command_line $USER1$/check_ftp -H $HOSTADDRESS$ $ARG1$ } # 'check_hpjd' command definition define command{ command_name check_hpjd command_line $USER1$/check_hpjd -H $HOSTADDRESS$ $ARG1$ } # 'check_snmp' command definition define command{ command_name check_snmp command_line $USER1$/check_snmp -H $HOSTADDRESS$ $ARG1$ } # 'check_http' command definition define command{ command_name check_http command_line $USER1$/check_http -I $HOSTADDRESS$ $ARG1$ } # 'check_ssh' command definition define command{ command_name check_ssh command_line $USER1$/check_ssh $ARG1$ $HOSTADDRESS$ } # 'check_dhcp' command definition define command{ command_name check_dhcp command_line $USER1$/check_dhcp $ARG1$ } # 'check_ping' command definition define command{ command_name check_ping command_line $USER1$/check_ping -H $HOSTADDRESS$ -w $ARG1$ -c $ARG2$ -p 5 } # 'check_pop' command definition define command{ command_name check_pop command_line $USER1$/check_pop -H $HOSTADDRESS$ $ARG1$ } # 'check_imap' command definition define command{ command_name check_imap command_line $USER1$/check_imap -H $HOSTADDRESS$ $ARG1$ } # 'check_smtp' command definition define command{ command_name check_smtp command_line $USER1$/check_smtp -H $HOSTADDRESS$ $ARG1$ } # 'check_tcp' command definition define command{ command_name check_tcp command_line $USER1$/check_tcp -H $HOSTADDRESS$ -p $ARG1$ $ARG2$ } # 'check_udp' command definition define command{ command_name check_udp command_line $USER1$/check_udp -H $HOSTADDRESS$ -p $ARG1$ $ARG2$ } # 'check_nt' command definition define command{ command_name check_nt command_line $USER1$/check_nt -H $HOSTADDRESS$ -p 12489 -v $ARG1$ $ARG2$ } ################################################################################ # # SAMPLE PERFORMANCE DATA COMMANDS # # These are sample performance data commands that can be used to send performance # data output to two text files (one for hosts, another for services). If you # plan on simply writing performance data out to a file, consider using the # host_perfdata_file and service_perfdata_file options in the main config file. # ################################################################################ # 'process-host-perfdata' command definition define command{ command_name process-host-perfdata command_line /usr/bin/printf "%b" "$LASTHOSTCHECK$\t$HOSTNAME$\t$HOSTSTATE$\t$HOSTATTEMPT$\t$HOSTSTATETYPE$\t$HOSTEXECUTIONTIME$\t$HOSTOUTPUT$\t$HOSTPERFDATA$\n" >> @localstatedir@/host-perfdata.out } # 'process-service-perfdata' command definition define command{ command_name process-service-perfdata command_line /usr/bin/printf "%b" "$LASTSERVICECHECK$\t$HOSTNAME$\t$SERVICEDESC$\t$SERVICESTATE$\t$SERVICEATTEMPT$\t$SERVICESTATETYPE$\t$SERVICEEXECUTIONTIME$\t$SERVICELATENCY$\t$SERVICEOUTPUT$\t$SERVICEPERFDATA$\n" >> @localstatedir@/service-perfdata.out } nagios-4.3.4/sample-config/template-object/contacts.cfg.in000066400000000000000000000041411314764422400235200ustar00rootroot00000000000000############################################################################### # CONTACTS.CFG - SAMPLE CONTACT/CONTACTGROUP DEFINITIONS # # # NOTES: This config file provides you with some example contact and contact # group definitions that you can reference in host and service # definitions. # # You don't need to keep these definitions in a separate file from your # other object definitions. This has been done just to make things # easier to understand. # ############################################################################### ############################################################################### ############################################################################### # # CONTACTS # ############################################################################### ############################################################################### # Just one contact defined by default - the Nagios admin (that's you) # This contact definition inherits a lot of default values from the 'generic-contact' # template which is defined elsewhere. define contact{ contact_name nagiosadmin ; Short name of user use generic-contact ; Inherit default values from generic-contact template (defined above) alias Nagios Admin ; Full name of user email @nagios_user@@localhost ; <<***** CHANGE THIS TO YOUR EMAIL ADDRESS ****** } ############################################################################### ############################################################################### # # CONTACT GROUPS # ############################################################################### ############################################################################### # We only have one contact in this simple configuration file, so there is # no need to create more than one contact group. define contactgroup{ contactgroup_name admins alias Nagios Administrators members nagiosadmin } nagios-4.3.4/sample-config/template-object/localhost.cfg.in000066400000000000000000000124031314764422400236720ustar00rootroot00000000000000############################################################################### # LOCALHOST.CFG - SAMPLE OBJECT CONFIG FILE FOR MONITORING THIS MACHINE # # # NOTE: This config file is intended to serve as an *extremely* simple # example of how you can create configuration entries to monitor # the local (Linux) machine. # ############################################################################### ############################################################################### ############################################################################### # # HOST DEFINITION # ############################################################################### ############################################################################### # Define a host for the local machine define host{ use linux-server ; Name of host template to use ; This host definition will inherit all variables that are defined ; in (or inherited by) the linux-server host template definition. host_name localhost alias localhost address 127.0.0.1 } ############################################################################### ############################################################################### # # HOST GROUP DEFINITION # ############################################################################### ############################################################################### # Define an optional hostgroup for Linux machines define hostgroup{ hostgroup_name linux-servers ; The name of the hostgroup alias Linux Servers ; Long name of the group members localhost ; Comma separated list of hosts that belong to this group } ############################################################################### ############################################################################### # # SERVICE DEFINITIONS # ############################################################################### ############################################################################### # Define a service to "ping" the local machine define service{ use local-service ; Name of service template to use host_name localhost service_description PING check_command check_ping!100.0,20%!500.0,60% } # Define a service to check the disk space of the root partition # on the local machine. Warning if < 20% free, critical if # < 10% free space on partition. define service{ use local-service ; Name of service template to use host_name localhost service_description Root Partition check_command check_local_disk!20%!10%!/ } # Define a service to check the number of currently logged in # users on the local machine. Warning if > 20 users, critical # if > 50 users. define service{ use local-service ; Name of service template to use host_name localhost service_description Current Users check_command check_local_users!20!50 } # Define a service to check the number of currently running procs # on the local machine. Warning if > 250 processes, critical if # > 400 processes. define service{ use local-service ; Name of service template to use host_name localhost service_description Total Processes check_command check_local_procs!250!400!RSZDT } # Define a service to check the load on the local machine. define service{ use local-service ; Name of service template to use host_name localhost service_description Current Load check_command check_local_load!5.0,4.0,3.0!10.0,6.0,4.0 } # Define a service to check the swap usage the local machine. # Critical if less than 10% of swap is free, warning if less than 20% is free define service{ use local-service ; Name of service template to use host_name localhost service_description Swap Usage check_command check_local_swap!20!10 } # Define a service to check SSH on the local machine. # Disable notifications for this service by default, as not all users may have SSH enabled. define service{ use local-service ; Name of service template to use host_name localhost service_description SSH check_command check_ssh notifications_enabled 0 } # Define a service to check HTTP on the local machine. # Disable notifications for this service by default, as not all users may have HTTP enabled. define service{ use local-service ; Name of service template to use host_name localhost service_description HTTP check_command check_http notifications_enabled 0 } nagios-4.3.4/sample-config/template-object/printer.cfg.in000066400000000000000000000057751314764422400234030ustar00rootroot00000000000000############################################################################### # PRINTER.CFG - SAMPLE CONFIG FILE FOR MONITORING A NETWORK PRINTER # # # NOTES: This config file assumes that you are using the sample configuration # files that get installed with the Nagios quickstart guide. # ############################################################################### ############################################################################### ############################################################################### # # HOST DEFINITIONS # ############################################################################### ############################################################################### # Define a host for the printer we'll be monitoring # Change the host_name, alias, and address to fit your situation define host{ use generic-printer ; Inherit default values from a template host_name hplj2605dn ; The name we're giving to this printer alias HP LaserJet 2605dn ; A longer name associated with the printer address 192.168.1.30 ; IP address of the printer hostgroups network-printers ; Host groups this printer is associated with } ############################################################################### ############################################################################### # # HOST GROUP DEFINITIONS # ############################################################################### ############################################################################### # A hostgroup for network printers define hostgroup{ hostgroup_name network-printers ; The name of the hostgroup alias Network Printers ; Long name of the group } ############################################################################### ############################################################################### # # SERVICE DEFINITIONS # ############################################################################### ############################################################################### # Create a service for monitoring the status of the printer # Change the host_name to match the name of the host you defined above # If the printer has an SNMP community string other than "public", change the check_command directive to reflect that define service{ use generic-service ; Inherit values from a template host_name hplj2605dn ; The name of the host the service is associated with service_description Printer Status ; The service description check_command check_hpjd!-C public ; The command used to monitor the service check_interval 10 ; Check the service every 10 minutes under normal conditions retry_interval 1 ; Re-check the service every minute until its final/hard state is determined } # Create a service for "pinging" the printer occasionally. Useful for monitoring RTA, packet loss, etc. define service{ use generic-service host_name hplj2605dn service_description PING check_command check_ping!3000.0,80%!5000.0,100% check_interval 10 retry_interval 1 } nagios-4.3.4/sample-config/template-object/switch.cfg.in000066400000000000000000000062641314764422400232130ustar00rootroot00000000000000############################################################################### # SWITCH.CFG - SAMPLE CONFIG FILE FOR MONITORING A SWITCH # # # NOTES: This config file assumes that you are using the sample configuration # files that get installed with the Nagios quickstart guide. # ############################################################################### ############################################################################### ############################################################################### # # HOST DEFINITIONS # ############################################################################### ############################################################################### # Define the switch that we'll be monitoring define host{ use generic-switch ; Inherit default values from a template host_name linksys-srw224p ; The name we're giving to this switch alias Linksys SRW224P Switch ; A longer name associated with the switch address 192.168.1.253 ; IP address of the switch hostgroups switches ; Host groups this switch is associated with } ############################################################################### ############################################################################### # # HOST GROUP DEFINITIONS # ############################################################################### ############################################################################### # Create a new hostgroup for switches define hostgroup{ hostgroup_name switches ; The name of the hostgroup alias Network Switches ; Long name of the group } ############################################################################### ############################################################################### # # SERVICE DEFINITIONS # ############################################################################### ############################################################################### # Create a service to PING to switch define service{ use generic-service ; Inherit values from a template host_name linksys-srw224p ; The name of the host the service is associated with service_description PING ; The service description check_command check_ping!200.0,20%!600.0,60% ; The command used to monitor the service check_interval 5 ; Check the service every 5 minutes under normal conditions retry_interval 1 ; Re-check the service every minute until its final/hard state is determined } # Monitor uptime via SNMP define service{ use generic-service ; Inherit values from a template host_name linksys-srw224p service_description Uptime check_command check_snmp!-C public -o sysUpTime.0 } # Monitor Port 1 status via SNMP define service{ use generic-service ; Inherit values from a template host_name linksys-srw224p service_description Port 1 Link Status check_command check_snmp!-C public -o ifOperStatus.1 -r 1 -m RFC1213-MIB } # Monitor bandwidth via MRTG logs define service{ use generic-service ; Inherit values from a template host_name linksys-srw224p service_description Port 1 Bandwidth Usage check_command check_local_mrtgtraf!/var/lib/mrtg/192.168.1.253_1.log!AVG!1000000,1000000!5000000,5000000!10 } nagios-4.3.4/sample-config/template-object/templates.cfg.in000066400000000000000000000245431314764422400237100ustar00rootroot00000000000000############################################################################### # TEMPLATES.CFG - SAMPLE OBJECT TEMPLATES # # # NOTES: This config file provides you with some example object definition # templates that are refered by other host, service, contact, etc. # definitions in other config files. # # You don't need to keep these definitions in a separate file from your # other object definitions. This has been done just to make things # easier to understand. # ############################################################################### ############################################################################### ############################################################################### # # CONTACT TEMPLATES # ############################################################################### ############################################################################### # Generic contact definition template - This is NOT a real contact, just a template! define contact{ name generic-contact ; The name of this contact template service_notification_period 24x7 ; service notifications can be sent anytime host_notification_period 24x7 ; host notifications can be sent anytime service_notification_options w,u,c,r,f,s ; send notifications for all service states, flapping events, and scheduled downtime events host_notification_options d,u,r,f,s ; send notifications for all host states, flapping events, and scheduled downtime events service_notification_commands notify-service-by-email ; send service notifications via email host_notification_commands notify-host-by-email ; send host notifications via email register 0 ; DONT REGISTER THIS DEFINITION - ITS NOT A REAL CONTACT, JUST A TEMPLATE! } ############################################################################### ############################################################################### # # HOST TEMPLATES # ############################################################################### ############################################################################### # Generic host definition template - This is NOT a real host, just a template! define host{ name generic-host ; The name of this host template notifications_enabled 1 ; Host notifications are enabled event_handler_enabled 1 ; Host event handler is enabled flap_detection_enabled 1 ; Flap detection is enabled process_perf_data 1 ; Process performance data retain_status_information 1 ; Retain status information across program restarts retain_nonstatus_information 1 ; Retain non-status information across program restarts notification_period 24x7 ; Send host notifications at any time register 0 ; DONT REGISTER THIS DEFINITION - ITS NOT A REAL HOST, JUST A TEMPLATE! } # Linux host definition template - This is NOT a real host, just a template! define host{ name linux-server ; The name of this host template use generic-host ; This template inherits other values from the generic-host template check_period 24x7 ; By default, Linux hosts are checked round the clock check_interval 5 ; Actively check the host every 5 minutes retry_interval 1 ; Schedule host check retries at 1 minute intervals max_check_attempts 10 ; Check each Linux host 10 times (max) check_command check-host-alive ; Default command to check Linux hosts notification_period workhours ; Linux admins hate to be woken up, so we only notify during the day ; Note that the notification_period variable is being overridden from ; the value that is inherited from the generic-host template! notification_interval 120 ; Resend notifications every 2 hours notification_options d,u,r ; Only send notifications for specific host states contact_groups admins ; Notifications get sent to the admins by default register 0 ; DONT REGISTER THIS DEFINITION - ITS NOT A REAL HOST, JUST A TEMPLATE! } # Windows host definition template - This is NOT a real host, just a template! define host{ name windows-server ; The name of this host template use generic-host ; Inherit default values from the generic-host template check_period 24x7 ; By default, Windows servers are monitored round the clock check_interval 5 ; Actively check the server every 5 minutes retry_interval 1 ; Schedule host check retries at 1 minute intervals max_check_attempts 10 ; Check each server 10 times (max) check_command check-host-alive ; Default command to check if servers are "alive" notification_period 24x7 ; Send notification out at any time - day or night notification_interval 30 ; Resend notifications every 30 minutes notification_options d,r ; Only send notifications for specific host states contact_groups admins ; Notifications get sent to the admins by default hostgroups windows-servers ; Host groups that Windows servers should be a member of register 0 ; DONT REGISTER THIS - ITS JUST A TEMPLATE } # We define a generic printer template that can be used for most printers we monitor define host{ name generic-printer ; The name of this host template use generic-host ; Inherit default values from the generic-host template check_period 24x7 ; By default, printers are monitored round the clock check_interval 5 ; Actively check the printer every 5 minutes retry_interval 1 ; Schedule host check retries at 1 minute intervals max_check_attempts 10 ; Check each printer 10 times (max) check_command check-host-alive ; Default command to check if printers are "alive" notification_period workhours ; Printers are only used during the workday notification_interval 30 ; Resend notifications every 30 minutes notification_options d,r ; Only send notifications for specific host states contact_groups admins ; Notifications get sent to the admins by default register 0 ; DONT REGISTER THIS - ITS JUST A TEMPLATE } # Define a template for switches that we can reuse define host{ name generic-switch ; The name of this host template use generic-host ; Inherit default values from the generic-host template check_period 24x7 ; By default, switches are monitored round the clock check_interval 5 ; Switches are checked every 5 minutes retry_interval 1 ; Schedule host check retries at 1 minute intervals max_check_attempts 10 ; Check each switch 10 times (max) check_command check-host-alive ; Default command to check if routers are "alive" notification_period 24x7 ; Send notifications at any time notification_interval 30 ; Resend notifications every 30 minutes notification_options d,r ; Only send notifications for specific host states contact_groups admins ; Notifications get sent to the admins by default register 0 ; DONT REGISTER THIS - ITS JUST A TEMPLATE } ############################################################################### ############################################################################### # # SERVICE TEMPLATES # ############################################################################### ############################################################################### # Generic service definition template - This is NOT a real service, just a template! define service{ name generic-service ; The 'name' of this service template active_checks_enabled 1 ; Active service checks are enabled passive_checks_enabled 1 ; Passive service checks are enabled/accepted parallelize_check 1 ; Active service checks should be parallelized (disabling this can lead to major performance problems) obsess_over_service 1 ; We should obsess over this service (if necessary) check_freshness 0 ; Default is to NOT check service 'freshness' notifications_enabled 1 ; Service notifications are enabled event_handler_enabled 1 ; Service event handler is enabled flap_detection_enabled 1 ; Flap detection is enabled process_perf_data 1 ; Process performance data retain_status_information 1 ; Retain status information across program restarts retain_nonstatus_information 1 ; Retain non-status information across program restarts is_volatile 0 ; The service is not volatile check_period 24x7 ; The service can be checked at any time of the day max_check_attempts 3 ; Re-check the service up to 3 times in order to determine its final (hard) state check_interval 10 ; Check the service every 10 minutes under normal conditions retry_interval 2 ; Re-check the service every two minutes until a hard state can be determined contact_groups admins ; Notifications get sent out to everyone in the 'admins' group notification_options w,u,c,r ; Send notifications about warning, unknown, critical, and recovery events notification_interval 60 ; Re-notify about service problems every hour notification_period 24x7 ; Notifications can be sent out at any time register 0 ; DONT REGISTER THIS DEFINITION - ITS NOT A REAL SERVICE, JUST A TEMPLATE! } # Local service definition template - This is NOT a real service, just a template! define service{ name local-service ; The name of this service template use generic-service ; Inherit default values from the generic-service definition max_check_attempts 4 ; Re-check the service up to 4 times in order to determine its final (hard) state check_interval 5 ; Check the service every 5 minutes under normal conditions retry_interval 1 ; Re-check the service every minute until a hard state can be determined register 0 ; DONT REGISTER THIS DEFINITION - ITS NOT A REAL SERVICE, JUST A TEMPLATE! } nagios-4.3.4/sample-config/template-object/timeperiods.cfg.in000066400000000000000000000061521314764422400242320ustar00rootroot00000000000000############################################################################### # TIMEPERIODS.CFG - SAMPLE TIMEPERIOD DEFINITIONS # # # NOTES: This config file provides you with some example timeperiod definitions # that you can reference in host, service, contact, and dependency # definitions. # # You don't need to keep timeperiods in a separate file from your other # object definitions. This has been done just to make things easier to # understand. # ############################################################################### ############################################################################### ############################################################################### # # TIME PERIODS # ############################################################################### ############################################################################### # This defines a timeperiod where all times are valid for checks, # notifications, etc. The classic "24x7" support nightmare. :-) define timeperiod{ timeperiod_name 24x7 alias 24 Hours A Day, 7 Days A Week sunday 00:00-24:00 monday 00:00-24:00 tuesday 00:00-24:00 wednesday 00:00-24:00 thursday 00:00-24:00 friday 00:00-24:00 saturday 00:00-24:00 } # 'workhours' timeperiod definition define timeperiod{ timeperiod_name workhours alias Normal Work Hours monday 09:00-17:00 tuesday 09:00-17:00 wednesday 09:00-17:00 thursday 09:00-17:00 friday 09:00-17:00 } # 'none' timeperiod definition define timeperiod{ timeperiod_name none alias No Time Is A Good Time } # Some U.S. holidays # Note: The timeranges for each holiday are meant to *exclude* the holidays from being # treated as a valid time for notifications, etc. You probably don't want your pager # going off on New Year's. Although your employer might... :-) define timeperiod{ name us-holidays timeperiod_name us-holidays alias U.S. Holidays january 1 00:00-00:00 ; New Years monday -1 may 00:00-00:00 ; Memorial Day (last Monday in May) july 4 00:00-00:00 ; Independence Day monday 1 september 00:00-00:00 ; Labor Day (first Monday in September) thursday 4 november 00:00-00:00 ; Thanksgiving (4th Thursday in November) december 25 00:00-00:00 ; Christmas } # This defines a modified "24x7" timeperiod that covers every day of the # year, except for U.S. holidays (defined in the timeperiod above). define timeperiod{ timeperiod_name 24x7_sans_holidays alias 24x7 Sans Holidays use us-holidays ; Get holiday exceptions from other timeperiod sunday 00:00-24:00 monday 00:00-24:00 tuesday 00:00-24:00 wednesday 00:00-24:00 thursday 00:00-24:00 friday 00:00-24:00 saturday 00:00-24:00 } nagios-4.3.4/sample-config/template-object/windows.cfg.in000066400000000000000000000076271314764422400234100ustar00rootroot00000000000000############################################################################### # WINDOWS.CFG - SAMPLE CONFIG FILE FOR MONITORING A WINDOWS MACHINE # # # NOTES: This config file assumes that you are using the sample configuration # files that get installed with the Nagios quickstart guide. # ############################################################################### ############################################################################### ############################################################################### # # HOST DEFINITIONS # ############################################################################### ############################################################################### # Define a host for the Windows machine we'll be monitoring # Change the host_name, alias, and address to fit your situation define host{ use windows-server ; Inherit default values from a template host_name winserver ; The name we're giving to this host alias My Windows Server ; A longer name associated with the host address 192.168.1.2 ; IP address of the host } ############################################################################### ############################################################################### # # HOST GROUP DEFINITIONS # ############################################################################### ############################################################################### # Define a hostgroup for Windows machines # All hosts that use the windows-server template will automatically be a member of this group define hostgroup{ hostgroup_name windows-servers ; The name of the hostgroup alias Windows Servers ; Long name of the group } ############################################################################### ############################################################################### # # SERVICE DEFINITIONS # ############################################################################### ############################################################################### # Create a service for monitoring the version of NSCLient++ that is installed # Change the host_name to match the name of the host you defined above define service{ use generic-service host_name winserver service_description NSClient++ Version check_command check_nt!CLIENTVERSION } # Create a service for monitoring the uptime of the server # Change the host_name to match the name of the host you defined above define service{ use generic-service host_name winserver service_description Uptime check_command check_nt!UPTIME } # Create a service for monitoring CPU load # Change the host_name to match the name of the host you defined above define service{ use generic-service host_name winserver service_description CPU Load check_command check_nt!CPULOAD!-l 5,80,90 } # Create a service for monitoring memory usage # Change the host_name to match the name of the host you defined above define service{ use generic-service host_name winserver service_description Memory Usage check_command check_nt!MEMUSE!-w 80 -c 90 } # Create a service for monitoring C:\ disk usage # Change the host_name to match the name of the host you defined above define service{ use generic-service host_name winserver service_description C:\ Drive Space check_command check_nt!USEDDISKSPACE!-l c -w 80 -c 90 } # Create a service for monitoring the W3SVC service # Change the host_name to match the name of the host you defined above define service{ use generic-service host_name winserver service_description W3SVC check_command check_nt!SERVICESTATE!-d SHOWALL -l W3SVC } # Create a service for monitoring the Explorer.exe process # Change the host_name to match the name of the host you defined above define service{ use generic-service host_name winserver service_description Explorer check_command check_nt!PROCSTATE!-d SHOWALL -l Explorer.exe } nagios-4.3.4/subst.in000077500000000000000000000024041314764422400145040ustar00rootroot00000000000000#!/usr/bin/perl -w my ${exec_prefix}; my ${prefix}; my ${datarootdir}; ${prefix}="@prefix@"; ${exec_prefix}="@exec_prefix@"; ${datarootdir}="@datarootdir@"; while ($f = shift @ARGV) { if (-x "/bin/mktemp") { $TEMP = `/bin/mktemp $f.$$.XXXXXX`; die 'Cannot make temporary file $TEMP' if($?); chomp $TEMP; } else { $XXXXXX = rand; $TEMP = "$f.$$.$XXXXXX"; } open(IN,"<$f.in"); open(OUT,">$TEMP") || die 'Cannot make temporary file $TEMP'; while () { s|\@nagios_user\@|@nagios_user@|g; s|\@nagios_grp\@|@nagios_grp@|g; s|\@lockfile\@|@lockfile@|g; s|\@libexecdir\@|@libexecdir@|g; # put all --with-vars before directories s|\@localstatedir\@|@localstatedir@|g; s|\@sysconfdir\@|@sysconfdir@|g; s|\@TMPDIR\@|@TMPDIR@|g; s|\@CHECKRESULTDIR\@|@CHECKRESULTDIR@|g; s|\@datadir\@|@datadir@|g; s|\@datarootdir\@|@datarootdir@|g; s|\@sbindir\@|@sbindir@|g; s|\@bindir\@|@bindir@|g; s|\@htmurl\@|@htmurl@|g; s|\@cgiurl\@|@cgiurl@|g; s|\@MAIL_PROG\@|@MAIL_PROG@|g; s|\@VERSION\@|@VERSION@|g; s|\$\{exec_prefix\}|@exec_prefix@|g; # must be next to last s|\$\{prefix\}|@prefix@|g; # must be last print OUT $_; } close IN; close OUT; if ((! -e $f) || (`diff $f $TEMP`)) { `mv $TEMP $f`; } else { unlink $TEMP; } } nagios-4.3.4/t-tap/000077500000000000000000000000001314764422400140365ustar00rootroot00000000000000nagios-4.3.4/t-tap/.gitignore000066400000000000000000000002251314764422400160250ustar00rootroot00000000000000test_events test_logging test_checks test_macros test_nagios_config test_timeperiods test_xsddefault test_commands test_downtime test_strtoul *.dSYM nagios-4.3.4/t-tap/Makefile.in000066400000000000000000000076571314764422400161220ustar00rootroot00000000000000# Makefile for Nagios tests using libtap # Source code directories SRC_COMMON=../common SRC_INCLUDE=../include SRC_XDATA=../xdata SRC_BASE=../base SRC_CGI=../cgi SRC_COMMON=../common SRC_LIB=../lib CC=@CC@ CFLAGS=@CFLAGS@ @DEFS@ -DNSCORE -I../include -I../tap/src -I.. TESTS = test_logging TESTS += test_events TESTS += test_checks TESTS += test_commands TESTS += test_downtime TESTS += test_nagios_config TESTS += test_timeperiods TESTS += test_macros XSD_OBJS = $(SRC_CGI)/statusdata-cgi.o $(SRC_CGI)/xstatusdata-cgi.o XSD_OBJS += $(SRC_CGI)/objects-cgi.o $(SRC_CGI)/xobjects-cgi.o XSD_OBJS += $(SRC_CGI)/comments-cgi.o $(SRC_CGI)/downtime-cgi.o XSD_OBJS += $(SRC_CGI)/cgiutils.o ../common/shared.o TP_OBJS = $(SRC_BASE)/utils.o $(SRC_BASE)/config.o $(SRC_BASE)/macros-base.o TP_OBJS += $(SRC_BASE)/objects-base.o $(SRC_BASE)/xobjects-base.o TP_OBJS += ../common/shared.o CFG_OBJS = $(TP_OBJS) CFG_OBJS += $(SRC_BASE)/comments-base.o $(SRC_BASE)/xcomments-base.o CFG_OBJS += $(SRC_BASE)/downtime-base.o $(SRC_BASE)/xdowntime-base.o CFG_OBJS += $(SRC_BASE)/retention-base.o $(SRC_BASE)/xretention-base.o LDFLAGS=@LDFLAGS@ LIBS=@LIBS@ ../lib/libnagios.a prefix=@prefix@ exec_prefix=@exec_prefix@ LOGDIR=@localstatedir@ CFGDIR=@sysconfdir@ BINDIR=@bindir@ CGIDIR=@sbindir@ HTMLDIR=@datarootdir@ INSTALL=@INSTALL@ INSTALL_OPTS=@INSTALL_OPTS@ COMMAND_OPTS=@COMMAND_OPTS@ STRIP=@STRIP@ CGIURL=@cgiurl@ HTMURL=@htmurl@ MATHLIBS=-lm PERLLIBS=@PERLLIBS@ PERLXSI_O=@PERLXSI_O@ SOCKETLIBS=@SOCKETLIBS@ BROKERLIBS=@BROKERLIBS@ BROKER_LDFLAGS=@BROKER_LDFLAGS@ CP=@CP@ # Extra base code BASEEXTRALIBS=@BASEEXTRALIBS@ TAPOBJ=../tap/src/tap.o $(SNPRINTF_O) all: $(TESTS) ########## TESTS ########## test_logging: test_logging.o $(SRC_BASE)/logging.o $(TAPOBJ) $(SRC_COMMON)/shared.o $(SRC_BASE)/objects-base.o $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) $(LIBS) test_events: test_events.o $(SRC_BASE)/events.o $(TAPOBJ) $(SRC_BASE)/utils.o $(SRC_COMMON)/shared.o $(SRC_BASE)/objects-base.o $(SRC_BASE)/checks.o $(SRC_LIB)/squeue.o $(SRC_LIB)/nsutils.o $(SRC_LIB)/kvvec.o $(SRC_LIB)/dkhash.o $(SRC_LIB)/pqueue.o $(SRC_BASE)/config.o $(SRC_LIB)/nspath.o $(SRC_BASE)/macros-base.o $(SRC_XDATA)/xodtemplate.o $(SRC_LIB)/bitmap.o $(SRC_LIB)/skiplist.o $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) $(MATHLIBS) test_checks: test_checks.o $(SRC_BASE)/checks.o $(TAPOBJ) $(SRC_BASE)/utils.o $(SRC_COMMON)/shared.o $(SRC_BASE)/objects-base.o $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) $(MATHLIBS) $(LIBS) test_commands: test_commands.o $(SRC_COMMON)/shared.o $(TAPOBJ) $(CC) $(CFLAGS) -o $@ $^ $(LIBS) test_downtime: test_downtime.o $(SRC_BASE)/downtime-base.o $(SRC_BASE)/utils.o $(SRC_COMMON)/shared.o $(SRC_BASE)/config.o $(SRC_BASE)/objects-base.o $(SRC_BASE)/macros-base.o $(SRC_XDATA)/xodtemplate.o $(TAPOBJ) $(CC) $(CFLAGS) -o $@ $^ $(LIBS) $(MATHLIBS) test_freshness: test_freshness.o $(SRC_BASE)/freshness.o $(TAPOBJ) $(CC) $(CFLAGS) -o $@ $^ test_nagios_config: test_nagios_config.o $(TAPOBJ) $(SRC_BASE)/utils.o $(SRC_BASE)/config.o $(SRC_XDATA)/xrddefault.o $(SRC_BASE)/comments-base.o $(SRC_BASE)/downtime-base.o $(SRC_COMMON)/shared.o $(SRC_BASE)/objects-base.o $(SRC_XDATA)/xcddefault.o $(SRC_XDATA)/xodtemplate.o $(SRC_BASE)/macros-base.o $(CC) $(CFLAGS) -o $@ $^ $(BROKER_LDFLAGS) $(LDFLAGS) $(MATHLIBS) $(SOCKETLIBS) $(BROKERLIBS) $(LIBS) test_timeperiods: test_timeperiods.o $(TP_OBJS) $(TAPOBJ) $(CC) $(CFLAGS) -o $@ $^ $(BROKER_LDFLAGS) $(LDFLAGS) $(MATHLIBS) $(SOCKETLIBS) $(BROKERLIBS) $(LIBS) test_macros: test_macros.o $(TP_OBJS) $(TAPOBJ) $(CC) $(CFLAGS) -o $@ $^ $(BROKER_LDFLAGS) $(LDFLAGS) $(MATHLIBS) $(SOCKETLIBS) $(LIBS) test_xsddefault: test_xsddefault.o $(XSD_OBJS) $(TAPOBJ) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) test: $(TESTS) HARNESS_PERL=./test_each.t perl -MTest::Harness -e '$$Test::Harness::switches=""; runtests(map { "./$$_" } @ARGV)' $(TESTS) clean: rm -f core core.* *.o gmon.out $(TESTS) rm -f *~ *.*~ distclean: clean rm -f perlxsi.c rm -f Makefile devclean: distclean nagios-4.3.4/t-tap/smallconfig/000077500000000000000000000000001314764422400163345ustar00rootroot00000000000000nagios-4.3.4/t-tap/smallconfig/minimal.cfg000066400000000000000000000117061314764422400204500ustar00rootroot00000000000000define host { host_name host1 alias host1 test address 192.168.1.1 max_check_attempts 2 check_period none contacts nagiosadmin notification_interval 60 notification_period none hostgroups hostgroup1 } define host { host_name hostveryrecent alias hostveryrecent test address 192.168.1.1 max_check_attempts 2 check_period none contacts nagiosadmin notification_interval 60 notification_period none hostgroups hostgroup1 } define hostgroup { hostgroup_name hostgroup1 } define hostgroup { hostgroup_name hostgroup2 } define service { host_name host1 service_description Dummy service check_command check_me max_check_attempts 3 check_interval 32 retry_interval 1 check_period none notification_interval 60 notification_period none contacts nagiosadmin } define service { host_name host1 service_description Dummy service2 check_command check_me max_check_attempts 3 check_interval 32 retry_interval 1 check_period none notification_interval 60 notification_period none contacts nagiosadmin } define service { host_name host1 service_description Uses important check command check_command check_me!with some parameters max_check_attempts 5 check_interval 15 retry_interval 1 check_period none notification_interval 65 notification_period none contacts nagiosadmin use service-distributed } define service { name service-distributed check_command !set_to_stale register 0 } define command { command_name set_to_stale command_line /usr/local/nagios/libexec/set_to_stale } define command { command_name check_me command_line /usr/local/nagios/libexec/check_me } define command { command_name with_continuation_lines command_line $USER1$/check_foo one\ two } define command { command_name multiple_continuation_lines_with_spaces_intermingled command_line \ check_nrpe_arg!30!\ check_fs_ping!/mnt/account-p,/mnt/prepro-p,/mnt/webapp-ssl,/mnt/rollout-p } define timeperiod { timeperiod_name none alias Nothing } define timeperiod { timeperiod_name 24x7 alias 24x7 base on weekdays monday 00:00-24:00 tuesday 00:00-24:00 wednesday 00:00-24:00 thursday 00:00-24:00 friday 00:00-24:00 saturday 00:00-24:00 sunday 00:00-24:00 } define timeperiod { timeperiod_name sunday_only alias Avoid time clock change hours sunday 00:00-01:15,03:15-22:00 } define timeperiod { timeperiod_name weekly_complex alias Complex weekly timeperiods monday 01:15-23:15 tuesday 01:15-23:15 wednesday 01:15-23:15 thursday 01:15-23:15 friday 01:15-23:15 saturday 00:00-22:00,23:00-24:00 sunday 00:00-09:45,14:15-24:00 } define timeperiod{ timeperiod_name Test_exclude alias Test for exclude timeperiod tuesday -1 - monday 1 16:30-24:00 exclude myexclude } define timeperiod{ timeperiod_name myexclude alias myexclude april 1 - august 16 00:00-24:00 saturday -1 - monday 1 16:00-24:00 } define timeperiod{ timeperiod_name Test_exclude2 alias Test2 for exclude timeperiod tuesday 2 16:30-24:00 exclude myexclude2 } define timeperiod{ timeperiod_name myexclude2 alias myexclude2 tuesday 00:00-23:58 } define timeperiod{ timeperiod_name Test_exclude3 alias Test3 for exclude timeperiod tuesday 2 16:30-24:00 exclude myexclude3 } define timeperiod{ timeperiod_name myexclude3 alias myexclude3 april 1 - august 16 00:00-24:00 } define timeperiod{ timeperiod_name Test_exclude4 alias Test for exclude timeperiod tuesday -1 - monday 1 16:30-24:00 exclude myexclude4 } define timeperiod{ timeperiod_name myexclude4 alias myexclude4 april 1 - august 16 00:00-24:00 } define timeperiod{ timeperiod_name exclude_always alias exclude_always monday 00:00-24:00 exclude 24x7 } define contact { contact_name nagiosadmin host_notifications_enabled 0 service_notifications_enabled 0 host_notification_period none service_notification_period none host_notification_options d,u,f,r,s service_notification_options w,u,c,r,f,s host_notification_commands notify-none service_notification_commands notify-none } define command { command_name notify-none command_line /usr/local/nagios/notifications/notify-none } define contact { contact_name second host_notifications_enabled 0 service_notifications_enabled 0 host_notification_period none service_notification_period none host_notification_options d,u,f,r,s service_notification_options w,u,c,r,f,s host_notification_commands notify-none service_notification_commands notify-none } define contactgroup { contactgroup_name causetestfailure alias This causes a test failure by having a comma separated list before the empty contactgroup members nagiosadmin,second } define contactgroup { contactgroup_name empty alias No members defined - this should pass validation } nagios-4.3.4/t-tap/smallconfig/nagios.cfg000066400000000000000000000054631314764422400203050ustar00rootroot00000000000000log_file=smallconfig/nagios.log cfg_file=minimal.cfg object_cache_file=smallconfig/objects.cache precached_object_file=smallconfig/objects.precache resource_file=smallconfig/resource.cfg status_file=smallconfig/status.dat status_update_interval=10 nagios_user=nagios nagios_group=nagios check_external_commands=1 command_file=smallconfig/nagios.cmd lock_file=smallconfig/nagios.lock temp_file=smallconfig/nagios.tmp temp_path=smallconfig event_broker_options=-1 log_rotation_method=d log_archive_path=smallconfig use_syslog=1 log_notifications=1 log_service_retries=1 log_host_retries=1 log_event_handlers=1 log_initial_states=0 log_external_commands=1 log_passive_checks=1 service_inter_check_delay_method=s max_service_check_spread=30 service_interleave_factor=s host_inter_check_delay_method=s max_host_check_spread=30 max_concurrent_checks=0 check_result_reaper_frequency=10 max_check_result_reaper_time=30 check_result_path=smallconfig max_check_result_file_age=3600 cached_host_check_horizon=15 cached_service_check_horizon=15 enable_predictive_host_dependency_checks=1 enable_predictive_service_dependency_checks=1 soft_state_dependencies=0 auto_reschedule_checks=0 auto_rescheduling_interval=30 auto_rescheduling_window=180 service_check_timeout=60 host_check_timeout=30 event_handler_timeout=30 notification_timeout=30 ocsp_timeout=5 perfdata_timeout=5 retain_state_information=1 state_retention_file=smallconfig/retention.dat retention_update_interval=60 use_retained_program_state=1 use_retained_scheduling_info=1 retained_host_attribute_mask=0 retained_service_attribute_mask=0 retained_process_host_attribute_mask=0 retained_process_service_attribute_mask=0 retained_contact_host_attribute_mask=0 retained_contact_service_attribute_mask=0 interval_length=60 check_for_updates=1 bare_update_check=0 use_aggressive_host_checking=0 execute_service_checks=1 accept_passive_service_checks=1 execute_host_checks=1 accept_passive_host_checks=1 enable_notifications=1 enable_event_handlers=1 process_performance_data=0 obsess_over_services=0 obsess_over_hosts=0 translate_passive_host_checks=0 passive_host_checks_are_soft=0 check_for_orphaned_services=1 check_for_orphaned_hosts=1 check_service_freshness=1 service_freshness_check_interval=60 check_host_freshness=0 host_freshness_check_interval=60 additional_freshness_latency=15 enable_flap_detection=1 low_service_flap_threshold=5.0 high_service_flap_threshold=20.0 low_host_flap_threshold=5.0 high_host_flap_threshold=20.0 date_format=us illegal_object_name_chars=`~!$%^&*|'"<>?,()= illegal_macro_output_chars=`~$&|'"<> use_regexp_matching=0 use_true_regexp_matching=0 admin_email=nagios@localhost admin_pager=pagenagios@localhost daemon_dumps_core=0 use_large_installation_tweaks=0 enable_environment_macros=1 debug_level=0 debug_verbosity=1 debug_file=smallconfig/nagios.debug max_debug_file_size=1000000 nagios-4.3.4/t-tap/smallconfig/resource.cfg000066400000000000000000000000141314764422400206370ustar00rootroot00000000000000#Empty file nagios-4.3.4/t-tap/smallconfig/retention.dat000066400000000000000000000117071314764422400210430ustar00rootroot00000000000000######################################## # NAGIOS STATE RETENTION FILE # # This is a test retention.dat file ######################################## info { created=1264459160 version=3.2.0 last_update_check=0 update_available=0 last_version=3.0.6 new_version= } program { modified_host_attributes=0 modified_service_attributes=0 enable_notifications=1 active_service_checks_enabled=1 passive_service_checks_enabled=1 active_host_checks_enabled=1 passive_host_checks_enabled=1 enable_event_handlers=1 obsess_over_services=0 obsess_over_hosts=0 check_service_freshness=1 check_host_freshness=1 enable_flap_detection=1 process_performance_data=1 global_host_event_handler= global_service_event_handler= next_comment_id=100420 next_downtime_id=100183 next_event_id=1288 next_problem_id=218 next_notification_id=13494 } host { host_name=host1 modified_attributes=1 check_command=check_host!-H $HOSTADDRESS$ -w 3000.0,80% -c 5000.0,100% -p 1 check_period=24x7 notification_period=24x7 event_handler= has_been_checked=1 check_execution_time=10.030 check_latency=0.000 check_type=0 current_state=1 last_state=2 last_hard_state=2 last_event_id=1204 current_event_id=1275 current_problem_id=41 last_problem_id=0 plugin_output=PING CRITICAL - Packet loss = 100% long_plugin_output= performance_data=rta=5000.000000ms;3000.000000;5000.000000;0.000000 pl=100%;80;100;0 last_check=1264456433 next_check=1264456444 check_options=0 current_attempt=1 max_attempts=2 normal_check_interval=0.000000 retry_check_interval=0.000000 state_type=1 last_state_change=1264456444 last_hard_state_change=1264456444 last_time_up=1247509815 last_time_down=1264456444 last_time_unreachable=1264456432 notified_on_down=1 notified_on_unreachable=1 last_notification=0 current_notification_number=52 current_notification_id=13392 notifications_enabled=1 problem_has_been_acknowledged=0 acknowledgement_type=0 active_checks_enabled=1 passive_checks_enabled=1 event_handler_enabled=0 flap_detection_enabled=1 process_performance_data=1 obsess_over_host=0 is_flapping=1 percent_state_change=29.87 check_flapping_recovery_notification=1 state_history=1,1,1,1,2,2,1,2,2,1,1,1,1,1,1,1,2,2,2,2,1 } host { host_name=doesnotexist modified_attributes=1 check_command=check_host!-H $HOSTADDRESS$ -w 3000.0,80% -c 5000.0,100% -p 1 check_period=24x7 notification_period=24x7 event_handler= has_been_checked=1 check_execution_time=10.030 check_latency=0.000 check_type=0 current_state=1 last_state=2 last_hard_state=2 last_event_id=1204 current_event_id=1275 current_problem_id=41 last_problem_id=0 plugin_output=PING CRITICAL - Packet loss = 100% long_plugin_output= performance_data=rta=5000.000000ms;3000.000000;5000.000000;0.000000 pl=100%;80;100;0 last_check=1264456433 next_check=1264456444 check_options=0 current_attempt=1 max_attempts=2 normal_check_interval=0.000000 retry_check_interval=0.000000 state_type=1 last_state_change=1264456444 last_hard_state_change=1264456444 last_time_up=1247509815 last_time_down=1264456444 last_time_unreachable=1264456432 notified_on_down=1 notified_on_unreachable=1 last_notification=0 current_notification_number=52 current_notification_id=13392 notifications_enabled=1 problem_has_been_acknowledged=0 acknowledgement_type=0 active_checks_enabled=1 passive_checks_enabled=1 event_handler_enabled=0 flap_detection_enabled=1 process_performance_data=1 obsess_over_host=0 is_flapping=1 percent_state_change=29.87 check_flapping_recovery_notification=1 state_history=1,1,1,1,2,2,1,2,2,1,1,1,1,1,1,1,2,2,2,2,1 } hostcomment { host_name=host1 entry_type=3 comment_id=418 source=0 persistent=1 entry_time=1264451960 expires=0 expire_time=0 author=(Nagios Process) comment_data=Notifications for this host are being suppressed because it was detected as having been flapping between different states (34.5% change > 20.0% threshold). When the host state stabilizes and the flapping stops, notifications will be re-enabled. } servicecomment { host_name=host1 service_description=Dummy service entry_type=3 comment_id=419 source=0 persistent=1 entry_time=1264451960 expires=0 expire_time=0 author=(Nagios Process) comment_data=Notifications for this service are being suppressed because it was detected as having been flapping between different states (40.3% change >= 20.0% threshold). When the service state stabilizes and the flapping stops, notifications will be re-enabled. } servicecomment { host_name=host1 service_description=Dummy service entry_type=3 comment_id=420 source=0 persistent=0 entry_time=1264451960 expires=0 expire_time=0 author=(Nagios Process) comment_data=This is a non-persistent comment, to check is read correctly } hostdowntime { host_name=host1 downtime_id=1102 entry_time=1280488503 start_time=1980913033 end_time=2980913033 triggered_by=0 fixed=1 duration=7 author=dferguson comment=Test host downtime } servicedowntime { host_name=host1 service_description=Dummy service downtime_id=1110 entry_time=1280913033 start_time=1980913033 end_time=1980913041 triggered_by=0 fixed=1 duration=8 author=dferguson comment=Test service downtime } nagios-4.3.4/t-tap/stub_broker.c000066400000000000000000000060711314764422400165270ustar00rootroot00000000000000/* Stub file for routines from broker.c */ void broker_downtime_data(int type, int flags, int attr, int downtime_type, char *host_name, char *svc_description, time_t entry_time, char *author_name, char *comment_data, time_t start_time, time_t end_time, int fixed, unsigned long triggered_by, unsigned long duration, unsigned long downtime_id, struct timeval *timestamp) {} void broker_adaptive_host_data(int type, int flags, int attr, host *hst, int command_type, unsigned long modattr, unsigned long modattrs, struct timeval *timestamp) {} void broker_adaptive_program_data(int type, int flags, int attr, int command_type, unsigned long modhattr, unsigned long modhattrs, unsigned long modsattr, unsigned long modsattrs, struct timeval *timestamp) {} void broker_adaptive_service_data(int type, int flags, int attr, service *svc, int command_type, unsigned long modattr, unsigned long modattrs, struct timeval *timestamp) {} void broker_adaptive_contact_data(int type, int flags, int attr, contact *cntct, int command_type, unsigned long modattr, unsigned long modattrs, unsigned long modhattr, unsigned long modhattrs, unsigned long modsattr, unsigned long modsattrs, struct timeval *timestamp) {} void broker_external_command(int type, int flags, int attr, int command_type, time_t entry_time, char *command_string, char *command_args, struct timeval *timestamp) {} void broker_acknowledgement_data(int type, int flags, int attr, int acknowledgement_type, void *data, char *ack_author, char *ack_data, int subtype, int notify_contacts, int persistent_comment, struct timeval *timestamp) {} int broker_host_check(int type, int flags, int attr, host *hst, int check_type, int state, int state_type, struct timeval start_time, struct timeval end_time, char *cmd, double latency, double exectime, int timeout, int early_timeout, int retcode, char *cmdline, char *output, char *long_output, char *perfdata, struct timeval *timestamp, check_result *cr) { return OK; } int broker_service_check(int type, int flags, int attr, service *svc, int check_type, struct timeval start_time, struct timeval end_time, char *cmd, double latency, double exectime, int timeout, int early_timeout, int retcode, char *cmdline, struct timeval *timestamp, check_result *cr) { return OK; } void broker_program_state(int type, int flags, int attr, struct timeval *timestamp) {} void broker_system_command(int type, int flags, int attr, struct timeval start_time, struct timeval end_time, double exectime, int timeout, int early_timeout, int retcode, char *cmd, char *output, struct timeval *timestamp) {} void broker_log_data(int type, int flags, int attr, char *data, unsigned long data_type, time_t entry_time, struct timeval *timestamp) {} void broker_comment_data(int type, int flags, int attr, int comment_type, int entry_type, char *host_name, char *svc_description, time_t entry_time, char *author_name, char *comment_data, int persistent, int source, int expires, time_t expire_time, unsigned long comment_id, struct timeval *timestamp) {} void broker_timed_event(int type, int flags, int attr, timed_event *event, struct timeval *timestamp) {} nagios-4.3.4/t-tap/stub_checks.c000066400000000000000000000014241314764422400165000ustar00rootroot00000000000000void schedule_host_check(host *hst, time_t check_time, int options) {} void schedule_service_check(service *svc, time_t check_time, int options) {} int handle_async_host_check_result(host *temp_host, check_result *queued_check_result) { return OK; } int handle_async_service_check_result(service *temp_service, check_result *queued_check_result) { return OK; } #ifndef TEST_EVENTS_C int run_scheduled_service_check(service *svc, int check_options, double latency) { return OK; } #endif int reap_check_results(void) { return OK; } void check_for_orphaned_services(void) {} void check_service_result_freshness(void) {} int run_scheduled_host_check(host *hst, int check_options, double latency) { return OK; } void check_host_result_freshness(void) {} void check_for_orphaned_hosts(void) {} nagios-4.3.4/t-tap/stub_commands.c000066400000000000000000000001321314764422400170340ustar00rootroot00000000000000/* Stub file for routines from commands.c */ int close_command_file(void) { return OK; } nagios-4.3.4/t-tap/stub_comments.c000066400000000000000000000021271314764422400170660ustar00rootroot00000000000000/* Stub file for comments.c */ int delete_service_comment(unsigned long comment_id) {} int delete_host_comment(unsigned long comment_id) {} int add_new_comment(int type, int entry_type, char *host_name, char *svc_description, time_t entry_time, char *author_name, char *comment_data, int persistent, int source, int expires, time_t expire_time, unsigned long *comment_id) {} int delete_service_acknowledgement_comments(service *svc) {} int delete_host_acknowledgement_comments(host *hst) {} int add_new_service_comment(int entry_type, char *host_name, char *svc_description, time_t entry_time, char *author_name, char *comment_data, int persistent, int source, int expires, time_t expire_time, unsigned long *comment_id) {} int add_new_host_comment(int entry_type, char *host_name, time_t entry_time, char *author_name, char *comment_data, int persistent, int source, int expires, time_t expire_time, unsigned long *comment_id) {} int delete_all_comments(int type, char *host_name, char *svc_description) {} void free_comment_data(void) {} int check_for_expired_comment(unsigned long comment_id) { return OK; } nagios-4.3.4/t-tap/stub_downtime.c000066400000000000000000000012061314764422400170640ustar00rootroot00000000000000/* Stub for common/downtime.c */ unsigned long next_downtime_id = 0; int schedule_downtime(int type, char *host_name, char *service_description, time_t entry_time, char *author, char *comment_data, time_t start_time, time_t end_time, int fixed, unsigned long triggered_by, unsigned long duration, unsigned long *new_downtime_id) {} int unschedule_downtime(int type, unsigned long downtime_id) {} int check_pending_flex_host_downtime(host *hst) {} int check_pending_flex_service_downtime(service *svc) { return OK; } int handle_scheduled_downtime_by_id(unsigned long downtime_id) { return OK; } int check_for_expired_downtime(void) { return OK; } nagios-4.3.4/t-tap/stub_events.c000066400000000000000000000006041314764422400165430ustar00rootroot00000000000000/* Stub for base/events.c */ timed_event *schedule_new_event(int event_type, int high_priority, time_t run_time, int recurring, unsigned long event_interval, void *timing_func, int compensate_for_time_change, void *event_data, void *event_args, int event_options) { return NULL; } void add_event(squeue_t *sq, timed_event *event) {} void remove_event(squeue_t *sq, timed_event *event) {} nagios-4.3.4/t-tap/stub_flapping.c000066400000000000000000000010121314764422400170310ustar00rootroot00000000000000/* Stub for base/flapping.c */ void check_for_host_flapping(host *hst, int update, int actual_check, int allow_flapstart_notification) {} void check_for_service_flapping(service *svc, int update, int allow_flapstart_notification) {} void disable_service_flap_detection(service *svc) {} void disable_host_flap_detection(host *hst) {} void disable_flap_detection_routines(void) {} void enable_flap_detection_routines(void) {} void enable_service_flap_detection(service *svc) {} void enable_host_flap_detection(host *hst) {} nagios-4.3.4/t-tap/stub_iobroker.c000066400000000000000000000003341314764422400170530ustar00rootroot00000000000000/* Stub functions for lib/iobroker.c */ int iobroker_get_num_fds(iobroker_set *iobs) { return 1; } int iobroker_poll(iobroker_set *iobs, int timeout) { return 0; } const char *iobroker_strerror(int error) { return ""; } nagios-4.3.4/t-tap/stub_logging.c000066400000000000000000000017741314764422400166760ustar00rootroot00000000000000/* Stub for base/logging.c */ int write_to_all_logs(char *buffer, unsigned long data_type) {} int log_host_event(host *hst) { return OK; } int log_service_event(service *svc) { return OK; } void logit(int data_type, int display, const char *fmt, ...) {} int fix_log_file_owner(uid_t uid, gid_t gid) { return 0; } int close_log_file(void) { return 0; } #ifndef TEST_CHECKS_C int log_debug_info(int level, int verbosity, const char *fmt, ...) { va_list ap; char *buffer = NULL; struct timeval now; struct tm tmnow; if(!(debug_level == DEBUGL_ALL || (level & debug_level))) return OK; if(verbosity > debug_verbosity) return OK; gettimeofday(&now, NULL); localtime_r(&(now.tv_sec), &tmnow); va_start(ap, fmt); vasprintf(&buffer, fmt, ap); printf("[%04d-%02d-%02d %02d:%02d:%02d.%06d] %s", tmnow.tm_year+1900, tmnow.tm_mon+1, tmnow.tm_mday, tmnow.tm_hour, tmnow.tm_min, tmnow.tm_sec, now.tv_usec, buffer); free(buffer); va_end(ap); } #endif int rotate_log_file(time_t rotation_time) { return OK; } nagios-4.3.4/t-tap/stub_macros.c000066400000000000000000000013341314764422400165240ustar00rootroot00000000000000/* Stub file for routines from macros.c */ char *macro_user[MAX_USER_MACROS]; int init_macros(void) { return OK; } int grab_host_macros_r(nagios_macros *mac, host *hst) { return OK; } int grab_service_macros_r(nagios_macros *mac, service *svc) { return OK; } int process_macros_r(nagios_macros *mac, char *input_buffer, char **output_buffer, int options) { return OK; } int clear_volatile_macros_r(nagios_macros *mac) { return OK; } int clear_host_macros_r(nagios_macros *mac) { return OK; } int free_macrox_names(void) { return OK; } nagios_macros *get_global_macros(void) { return NULL; } int clear_argv_macros_r(nagios_macros *mac) { return OK; } int set_all_macro_environment_vars_r(nagios_macros *mac, int set) { return OK; } nagios-4.3.4/t-tap/stub_nebmods.c000066400000000000000000000005141314764422400166660ustar00rootroot00000000000000/* Stub file for routines from nebmods.c */ int neb_free_callback_list(void) { return OK; } int neb_unload_all_modules(int flags, int reason) { return OK; } int neb_free_module_list(void) { return OK; } int neb_deinit_modules(void) { return OK; } int neb_add_module(char *filename, char *args, int should_be_loaded) { return OK; } nagios-4.3.4/t-tap/stub_netutils.c000066400000000000000000000004331314764422400171060ustar00rootroot00000000000000/* Stub file for routines from netutils.c */ int my_tcp_connect(const char *host_name, int port, int *sd, int timeout) { return OK; } int my_sendall(int s, const char *buf, int *len, int timeout) { return OK; } int my_recvall(int s, char *buf, int *len, int timeout) { return OK; } nagios-4.3.4/t-tap/stub_notifications.c000066400000000000000000000006511314764422400201120ustar00rootroot00000000000000/* Stub for base/notifications.c */ int service_notification(service *svc, int type, char *not_author, char *not_data, int options) {} int host_notification(host *hst, int type, char *not_author, char *not_data, int options) {} time_t get_next_host_notification_time(host *temp_host, time_t time_t1) { return (time_t)0; } time_t get_next_service_notification_time(service *temp_service, time_t time_t1) { return (time_t)0; } nagios-4.3.4/t-tap/stub_nsock.c000066400000000000000000000012141314764422400163520ustar00rootroot00000000000000/* Stub functions for lib/nsock.c */ static inline int nsock_vprintf(int sd, const char *fmt, va_list ap, int plus) { char buf[4096]; int len; /* -2 to accommodate vsnprintf()'s which don't include nul on overflow */ len = vsnprintf(buf, sizeof(buf) - 2, fmt, ap); if (len < 0) return len; buf[len] = 0; return len; } int nsock_printf_nul(int sd, const char *fmt, ...) { va_list ap; int ret; va_start(ap, fmt); ret = nsock_vprintf(sd, fmt, ap, 1); va_end(ap); return ret; } int nsock_printf(int sd, const char *fmt, ...) { va_list ap; int ret; va_start(ap, fmt); ret = nsock_vprintf(sd, fmt, ap, 0); va_end(ap); return ret; } nagios-4.3.4/t-tap/stub_objects.c000066400000000000000000000013321314764422400166670ustar00rootroot00000000000000/* Stub file for common/objects.c */ service *find_service(const char *host_name, const char *svc_desc) { return NULL; } host *find_host(const char *name) { return NULL; } hostgroup *find_hostgroup(const char *name) { return NULL; } contactgroup *find_contactgroup(const char *name) { return NULL; } servicegroup *find_servicegroup(const char *name) { return NULL; } contact *find_contact(const char *name) { return NULL; } command *find_command(const char *name) { return NULL; } timeperiod *find_timeperiod(const char *name) { return NULL; } int prepend_object_to_objectlist(objectlist **list, void *object_ptr) { return OK; } int free_objectlist(objectlist **temp_list) { return OK; } int free_object_data(void) { return OK; } nagios-4.3.4/t-tap/stub_perfdata.c000066400000000000000000000001601314764422400170220ustar00rootroot00000000000000int update_host_performance_data(host *hst) {} int update_service_performance_data(service *svc) { return OK; } nagios-4.3.4/t-tap/stub_sehandlers.c000066400000000000000000000003441314764422400173700ustar00rootroot00000000000000int obsessive_compulsive_host_check_processor(host *hst) {} int obsessive_compulsive_service_check_processor(service *svc) { return OK; } int handle_host_event(host *hst) {} int handle_service_event(service *svc) { return OK; } nagios-4.3.4/t-tap/stub_shared.c000066400000000000000000000001711314764422400165040ustar00rootroot00000000000000/* Stub for common/shared.c */ void get_datetime_string(time_t * raw_time, char *buffer, int buffer_length, int type) {} nagios-4.3.4/t-tap/stub_sretention.c000066400000000000000000000001301314764422400174230ustar00rootroot00000000000000int read_initial_state_information(void) {} int save_state_information(int autosave) {} nagios-4.3.4/t-tap/stub_statusdata.c000066400000000000000000000006141314764422400174150ustar00rootroot00000000000000/* Stub for common/statusdata.c */ int update_service_status(service *svc, int aggregated_dump) {} int update_host_status(host *hst, int aggregated_dump) { return OK; } #if !(defined(TEST_CHECKS_C) || defined(TEST_EVENTS_C)) int update_program_status(int aggregated_dump) {} #endif int update_contact_status(contact *cntct, int aggregated_dump) {} int update_all_status_data(void) { return OK; } nagios-4.3.4/t-tap/stub_utils.c000066400000000000000000000004401314764422400163750ustar00rootroot00000000000000/* Stub for base/utils.c */ void get_next_valid_time(time_t pref_time, time_t *valid_time, timeperiod *tperiod) {} int update_check_stats(int check_type, time_t check_time) {} int check_time_against_period(time_t test_time, timeperiod *tperiod) {} void free_memory(nagios_macros *mac) {} nagios-4.3.4/t-tap/stub_workers.c000066400000000000000000000003421314764422400167320ustar00rootroot00000000000000/* Stub file for routines from macros.c */ int wproc_run_check(check_result *cr, char *cmd, nagios_macros *mac) { return OK; } int wproc_can_spawn(struct load_control *lc) { return 1; } void wproc_reap(int jobs, int msecs) {} nagios-4.3.4/t-tap/stub_xdddefault.c000066400000000000000000000014361314764422400173670ustar00rootroot00000000000000/* Stub file for xdata/xddefault.c */ int xdddefault_add_new_host_downtime(char *host_name, time_t entry_time, char *author, char *comment, time_t start_time, time_t end_time, int fixed, unsigned long triggered_by, unsigned long duration, unsigned long *downtime_id) {} int xdddefault_add_new_service_downtime(char *host_name, char *service_description, time_t entry_time, char *author, char *comment, time_t start_time, time_t end_time, int fixed, unsigned long triggered_by, unsigned long duration, unsigned long *downtime_id) {} int xdddefault_cleanup_downtime_data(char *main_config_file) {} int xdddefault_delete_service_downtime(unsigned long downtime_id) {} int xdddefault_delete_host_downtime(unsigned long downtime_id) {} int xdddefault_initialize_downtime_data(char *main_config_file) {} nagios-4.3.4/t-tap/stub_xodtemplate.c000066400000000000000000000002141314764422400175620ustar00rootroot00000000000000/* Stub file for routines from xodtemplate.c */ int xodtemplate_read_config_data(const char *main_config_file, int options) { return OK; } nagios-4.3.4/t-tap/test-stubs.c000066400000000000000000000200011314764422400163100ustar00rootroot00000000000000#ifndef NAGIOS_TEST_STUBS__ #define NAGIOS_TEST_STUBS__ #include "macros.h" /* Loads of variables + stubbed functions */ char *config_file = "etc/nagios.cfg"; int test_scheduling; time_t program_start; time_t event_start; int sigshutdown = FALSE; int sigrestart = FALSE; int interval_length = 60; int service_inter_check_delay_method; int host_inter_check_delay_method; int service_interleave_factor_method; int max_host_check_spread; int max_service_check_spread; int command_check_interval; int check_reaper_interval; int service_freshness_check_interval; int host_freshness_check_interval; int auto_rescheduling_interval; int host_freshness_check_interval; int auto_rescheduling_interval; int auto_rescheduling_window; int check_external_commands; int check_orphaned_services; int check_orphaned_hosts; int check_service_freshness; int check_host_freshness; int auto_reschedule_checks; int retain_state_information; int retention_update_interval; int max_parallel_service_checks; int currently_running_service_checks; int status_update_interval; int log_rotation_method; int service_check_timeout; int execute_service_checks = 1; int execute_host_checks; int child_processes_fork_twice; int time_change_threshold; host *host_list; service *service_list; int check_for_expired_comment(unsigned long temp_long) {} void broker_timed_event(int int1, int int2, int int3, timed_event *timed_event1, struct timeval *timeval1) {} int check_for_expired_downtime(void) {} int check_for_nagios_updates(int int1, int int2) {} time_t get_next_service_notification_time(service *temp_service, time_t time_t1) {} int save_state_information(int int1) {} int check_for_external_commands(void) {} int check_time_against_period(time_t time_t1, timeperiod *timeperiod) {} time_t get_next_log_rotation_time(void) {} int handle_scheduled_downtime_by_id(unsigned long long1) {} #ifndef TEST_LOGGING int log_host_event(host *hst) {} int log_service_event_flag = 0; int log_service_event(service *svc) { log_service_event_flag++; } int rotate_log_file(time_t time_t1) {} void logit(int int1, int int2, const char *fmt, ...) {} #endif time_t get_next_host_notification_time(host *temp_host, time_t time_t1) {} void get_next_valid_time(time_t time_t1, time_t *time_t2, timeperiod *temp_timeperiod) {} char *log_file = "var/nagios.log"; char *temp_file = ""; char *log_archive_path = "var"; host *host_list = NULL; service *service_list = NULL; int use_syslog = 0; int log_service_retries; int log_initial_states; unsigned long logging_options = NSLOG_PROCESS_INFO; unsigned long syslog_options; int verify_config; int test_scheduling; time_t last_log_rotation; int log_rotation_method; int daemon_mode = TRUE; char *debug_file = ""; int debug_level; int debug_verbosity; unsigned long max_debug_file_size; int grab_host_macros_r(nagios_macros *mac, host *hst) {} int grab_service_macros_r(nagios_macros *mac, service *svc) {} void broker_log_data(int a, int b, int c, char *d, unsigned long e, time_t f, struct timeval *g) {} int clear_volatile_macros_r(nagios_macros *mac) {} int clear_service_macros_r(nagios_macros *mac) {} int clear_host_macros_r(nagios_macros *mac) {} int process_macros(char *a, char **b, int c) {} int process_macros_r(nagios_macros *mac, char *a, char **b, int c) {} int update_host_status(host *hst, int aggregated_dump) {} int update_service_status(service *svc, int aggregated_dump) {} int update_all_status_data(void) {} char *check_result_path = NULL; int process_check_result_queue(char *dirname) {} service * find_service(char *host_name, char *svc_desc) {} int delete_check_result_file(char *fname) {} int free_check_result(check_result *info) {} host * find_host(char *name) {} int max_check_reaper_time = DEFAULT_MAX_REAPER_TIME; check_result *read_check_result(void) {} int broker_service_check(int type, int flags, int attr, service *svc, int check_type, struct timeval start_time, struct timeval end_time, char *cmd, double latency, double exectime, int timeout, int early_timeout, int retcode, char *cmdline, struct timeval *timestamp) {} int get_raw_command_line(command *a, char *b, char **c, int d) {} int get_raw_command_line_r(nagios_macros *mac, command *a, char *b, char **c, int d) {} char *temp_path; int dbuf_init(dbuf *db, int chunk_size) {} int update_check_stats(int check_type, time_t check_time) {} int set_all_macro_environment_vars_r(nagios_macros *mac, int set) {} int close_command_file(void) {} void reset_sighandler(void) {} unsigned long max_debug_file_size = DEFAULT_MAX_DEBUG_FILE_SIZE; int host_check_timeout = DEFAULT_HOST_CHECK_TIMEOUT; int broker_host_check(int type, int flags, int attr, host *hst, int check_type, int state, int state_type, struct timeval start_time, struct timeval end_time, char *cmd, double latency, double exectime, int timeout, int early_timeout, int retcode, char *cmdline, char *output, char *long_output, char *perfdata, struct timeval *timestamp) {} char *escape_newlines(char *rawbuf) {} int dbuf_strcat(dbuf *db, char *buf) {} int dbuf_free(dbuf *db) {} unsigned long next_event_id = 0L; unsigned long next_problem_id = 0L; int free_child_process_memory = -1; void free_memory(nagios_macros *mac) {} int accept_passive_service_checks = TRUE; int log_passive_checks = TRUE; int use_aggressive_host_checking = FALSE; int handle_service_event(service *svc) {} unsigned long cached_host_check_horizon = DEFAULT_CACHED_HOST_CHECK_HORIZON; void check_for_service_flapping(service *svc, int update, int allow_flapstart_notification) {} void check_for_host_flapping(host *hst, int update, int actual_check, int allow_flapstart_notification) {} int service_notification(service *svc, int type, char *not_author, char *not_data, int options) {} int obsess_over_services = FALSE; int obsessive_compulsive_service_check_processor(service *svc) {} int host_notification(host *hst, int type, char *not_author, char *not_data, int options) {} int enable_predictive_service_dependency_checks = DEFAULT_ENABLE_PREDICTIVE_SERVICE_DEPENDENCY_CHECKS; servicedependency *get_first_servicedependency_by_dependent_service(char *host_name, char *svc_description, void **ptr) {} servicedependency *get_next_servicedependency_by_dependent_service(char *host_name, char *svc_description, void **ptr) {} int add_object_to_objectlist(objectlist **list, void *object_ptr) {} int check_pending_flex_service_downtime(service *svc) {} int compare_strings(char *val1a, char *val2a) {} int update_service_performance_data(service *svc) {} int free_objectlist(objectlist **temp_list) {} unsigned long cached_service_check_horizon = DEFAULT_CACHED_SERVICE_CHECK_HORIZON; timed_event *event_list_low = NULL; timed_event *event_list_low_tail = NULL; void remove_event(timed_event *event, timed_event **event_list, timed_event **event_list_tail) {} void reschedule_event(timed_event *event, timed_event **event_list, timed_event **event_list_tail) {} int process_passive_service_check(time_t check_time, char *host_name, char *svc_description, int return_code, char *output) {} int soft_state_dependencies = FALSE; int additional_freshness_latency = DEFAULT_ADDITIONAL_FRESHNESS_LATENCY; hostdependency *get_first_hostdependency_by_dependent_host(char *host_name, void **ptr) { /* Return NULL so check_host_dependencies returns back */ return NULL; } hostdependency *get_next_hostdependency_by_dependent_host(char *host_name, void **ptr) {} int currently_running_host_checks = 0; int my_system_r(nagios_macros *mac, char *cmd, int timeout, int *early_timeout, double *exectime, char **output, int max_output_length) {} int accept_passive_host_checks = TRUE; int passive_host_checks_are_soft = DEFAULT_PASSIVE_HOST_CHECKS_SOFT; int translate_passive_host_checks = DEFAULT_TRANSLATE_PASSIVE_HOST_CHECKS; int enable_predictive_host_dependency_checks = DEFAULT_ENABLE_PREDICTIVE_HOST_DEPENDENCY_CHECKS; #endif nagios-4.3.4/t-tap/test_checks.c000066400000000000000000000400571314764422400165070ustar00rootroot00000000000000/***************************************************************************** * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * *****************************************************************************/ #define TEST_CHECKS_C #define NSCORE 1 #include "config.h" #include "comments.h" #include "common.h" #include "statusdata.h" #include "downtime.h" #include "macros.h" #include "nagios.h" #include "broker.h" #include "perfdata.h" #include "../lib/lnag-utils.h" #include "tap.h" #include "stub_sehandlers.c" #include "stub_comments.c" #include "stub_perfdata.c" #include "stub_downtime.c" #include "stub_notifications.c" #include "stub_logging.c" #include "stub_broker.c" #include "stub_macros.c" #include "stub_workers.c" #include "stub_events.c" #include "stub_statusdata.c" #include "stub_flapping.c" #include "stub_nebmods.c" #include "stub_netutils.c" #include "stub_commands.c" #include "stub_xodtemplate.c" int date_format; /* Test specific functions + variables */ service *svc1 = NULL, *svc2 = NULL; host *host1 = NULL; int found_log_rechecking_host_when_service_wobbles = 0; int found_log_run_async_host_check = 0; check_result *tmp_check_result; void setup_check_result(int check_type) { struct timeval start_time, finish_time; start_time.tv_sec = 1234567890L; start_time.tv_usec = 0L; finish_time.tv_sec = 1234567891L; finish_time.tv_usec = 0L; tmp_check_result = (check_result *)malloc(sizeof(check_result)); tmp_check_result->check_type = check_type; tmp_check_result->check_options = 0; tmp_check_result->scheduled_check = TRUE; tmp_check_result->reschedule_check = TRUE; tmp_check_result->exited_ok = TRUE; tmp_check_result->return_code = 0; tmp_check_result->output = strdup("Fake result"); tmp_check_result->latency = 0.6969; tmp_check_result->start_time = start_time; tmp_check_result->finish_time = finish_time; } int c = 0; int update_program_status(int aggregated_dump) { c++; /* printf ("# In the update_program_status hook: %d\n", c); */ /* Set this to break out of event_execution_loop */ if(c > 10) { sigshutdown = TRUE; c = 0; } } int log_debug_info(int level, int verbosity, const char *fmt, ...) { va_list ap; char *buffer = NULL; va_start(ap, fmt); /* vprintf( fmt, ap ); */ vasprintf(&buffer, fmt, ap); if(strcmp(buffer, "Service wobbled between non-OK states, so we'll recheck the host state...\n") == 0) { found_log_rechecking_host_when_service_wobbles++; } if(strcmp(buffer, "run_async_host_check()\n") == 0) { found_log_run_async_host_check++; } free(buffer); va_end(ap); } void setup_objects(time_t time) { timed_event *new_event = NULL; enable_predictive_service_dependency_checks = FALSE; host1 = (host *)calloc(1, sizeof(host)); host1->name = strdup("Host1"); host1->address = strdup("127.0.0.1"); host1->retry_interval = 1; host1->check_interval = 5; host1->check_options = 0; host1->state_type = SOFT_STATE; host1->current_state = HOST_DOWN; host1->has_been_checked = TRUE; host1->last_check = time; host1->next_check = time; /* First service is a normal one */ svc1 = (service *)calloc(1, sizeof(service)); svc1->host_name = strdup("Host1"); svc1->host_ptr = host1; svc1->description = strdup("Normal service"); svc1->check_options = 0; svc1->next_check = time; svc1->state_type = SOFT_STATE; svc1->current_state = STATE_CRITICAL; svc1->retry_interval = 1; svc1->check_interval = 5; svc1->current_attempt = 1; svc1->max_attempts = 4; svc1->last_state_change = 0; svc1->last_state_change = 0; svc1->last_check = (time_t)1234560000; svc1->host_problem_at_last_check = FALSE; svc1->plugin_output = strdup("Initial state"); svc1->last_hard_state_change = (time_t)1111111111; svc1->accept_passive_checks = 1; /* Second service .... to be configured! */ svc2 = (service *)calloc(1, sizeof(service)); svc2->host_name = strdup("Host1"); svc2->description = strdup("To be nudged"); svc2->check_options = 0; svc2->next_check = time; svc2->state_type = SOFT_STATE; svc2->current_state = STATE_OK; svc2->retry_interval = 1; svc2->check_interval = 5; } void run_service_check_tests(int check_type, time_t when) { /* Test to confirm that if a service is warning, the notified_on_critical is reset */ tmp_check_result = (check_result *)calloc(1, sizeof(check_result)); tmp_check_result->host_name = strdup("host1"); tmp_check_result->service_description = strdup("Normal service"); tmp_check_result->object_check_type = SERVICE_CHECK; tmp_check_result->check_type = check_type; tmp_check_result->check_options = 0; tmp_check_result->scheduled_check = TRUE; tmp_check_result->reschedule_check = TRUE; tmp_check_result->latency = 0.666; tmp_check_result->start_time.tv_sec = 1234567890; tmp_check_result->start_time.tv_usec = 56565; tmp_check_result->finish_time.tv_sec = 1234567899; tmp_check_result->finish_time.tv_usec = 45454; tmp_check_result->early_timeout = 0; tmp_check_result->exited_ok = TRUE; tmp_check_result->return_code = 1; tmp_check_result->output = strdup("Warning - check notified_on_critical reset"); setup_objects(when); svc1->last_state = STATE_CRITICAL; svc1->notification_options = OPT_CRITICAL; svc1->current_notification_number = 999; svc1->last_notification = (time_t)11111; svc1->next_notification = (time_t)22222; svc1->no_more_notifications = TRUE; handle_async_service_check_result(svc1, tmp_check_result); /* This has been taken out because it is not required ok( svc1->notified_on_critical==FALSE, "notified_on_critical reset" ); */ ok(svc1->last_notification == (time_t)0, "last notification reset due to state change"); ok(svc1->next_notification == (time_t)0, "next notification reset due to state change"); ok(svc1->no_more_notifications == FALSE, "no_more_notifications reset due to state change"); ok(svc1->current_notification_number == 999, "notification number NOT reset"); /* Test case: service that transitions from OK to CRITICAL (where its host is set to DOWN) will get set to a hard state even though check attempts = 1 of 4 */ setup_objects((time_t) 1234567800L); host1->current_state = HOST_DOWN; svc1->current_state = STATE_OK; svc1->state_type = HARD_STATE; setup_check_result(check_type); tmp_check_result->return_code = STATE_CRITICAL; tmp_check_result->output = strdup("CRITICAL failure"); handle_async_service_check_result(svc1, tmp_check_result); ok(svc1->last_hard_state_change == (time_t)1234567890, "Got last_hard_state_change time=%lu", svc1->last_hard_state_change); ok(svc1->last_state_change == svc1->last_hard_state_change, "Got same last_state_change"); ok(svc1->last_hard_state == 2, "Should save the last hard state as critical for next time"); ok(svc1->host_problem_at_last_check == TRUE, "Got host_problem_at_last_check set to TRUE due to host failure - this needs to be saved otherwise extra alerts raised in subsequent runs"); ok(svc1->state_type == HARD_STATE, "This should be a HARD state since the host is in a failure state"); ok(svc1->current_attempt == 1, "Previous status was OK, so this failure should show current_attempt=1") || diag("Current attempt=%d", svc1->current_attempt); /* Test case: OK -> WARNING 1/4 -> ack -> WARNING 2/4 -> OK transition Tests that the ack is left for 2/4 */ setup_objects(when); host1->current_state = HOST_UP; host1->max_attempts = 4; svc1->last_state = STATE_OK; svc1->last_hard_state = STATE_OK; svc1->current_state = STATE_OK; svc1->state_type = SOFT_STATE; setup_check_result(check_type); tmp_check_result->return_code = STATE_WARNING; tmp_check_result->output = strdup("WARNING failure"); handle_async_service_check_result(svc1, tmp_check_result); ok(svc1->last_notification == (time_t)0, "last notification reset due to state change"); ok(svc1->next_notification == (time_t)0, "next notification reset due to state change"); ok(svc1->no_more_notifications == FALSE, "no_more_notifications reset due to state change"); ok(svc1->current_notification_number == 0, "notification number reset"); ok(svc1->acknowledgement_type == ACKNOWLEDGEMENT_NONE, "No acks"); svc1->acknowledgement_type = ACKNOWLEDGEMENT_NORMAL; setup_check_result(check_type); tmp_check_result->return_code = STATE_WARNING; tmp_check_result->output = strdup("WARNING failure"); handle_async_service_check_result(svc1, tmp_check_result); ok(svc1->acknowledgement_type == ACKNOWLEDGEMENT_NORMAL, "Ack left"); setup_check_result(check_type); tmp_check_result->return_code = STATE_OK; tmp_check_result->output = strdup("Back to OK"); handle_async_service_check_result(svc1, tmp_check_result); ok(svc1->acknowledgement_type == ACKNOWLEDGEMENT_NONE, "Ack reset to none"); /* Test case: OK -> WARNING 1/4 -> ack -> WARNING 2/4 -> WARNING 3/4 -> WARNING 4/4 -> WARNING 4/4 -> OK transition Tests that the ack is not removed on hard state change */ setup_objects(when); host1->current_state = HOST_UP; host1->max_attempts = 4; svc1->last_state = STATE_OK; svc1->last_hard_state = STATE_OK; svc1->current_state = STATE_OK; svc1->state_type = SOFT_STATE; svc1->current_attempt = 1; setup_check_result(check_type); tmp_check_result->return_code = STATE_OK; tmp_check_result->output = strdup("Reset to OK"); handle_async_service_check_result(svc1, tmp_check_result); ok(svc1->current_attempt == 1, "Current attempt is 1") || diag("Current attempt now: %d", svc1->current_attempt); setup_check_result(check_type); tmp_check_result->return_code = STATE_WARNING; tmp_check_result->output = strdup("WARNING failure 1"); handle_async_service_check_result(svc1, tmp_check_result); ok(svc1->state_type == SOFT_STATE, "Soft state"); ok(svc1->acknowledgement_type == ACKNOWLEDGEMENT_NONE, "No acks - testing transition to hard warning state"); svc1->acknowledgement_type = ACKNOWLEDGEMENT_NORMAL; ok(svc1->current_attempt == 1, "Current attempt is 1") || diag("Current attempt now: %d", svc1->current_attempt); setup_check_result(check_type); tmp_check_result->return_code = STATE_WARNING; tmp_check_result->output = strdup("WARNING failure 2"); handle_async_service_check_result(svc1, tmp_check_result); ok(svc1->state_type == SOFT_STATE, "Soft state"); ok(svc1->acknowledgement_type == ACKNOWLEDGEMENT_NORMAL, "Ack left"); ok(svc1->current_attempt == 2, "Current attempt is 2") || diag("Current attempt now: %d", svc1->current_attempt); setup_check_result(check_type); tmp_check_result->return_code = STATE_WARNING; tmp_check_result->output = strdup("WARNING failure 3"); handle_async_service_check_result(svc1, tmp_check_result); ok(svc1->state_type == SOFT_STATE, "Soft state"); ok(svc1->acknowledgement_type == ACKNOWLEDGEMENT_NORMAL, "Ack left"); ok(svc1->current_attempt == 3, "Current attempt is 3") || diag("Current attempt now: %d", svc1->current_attempt); setup_check_result(check_type); tmp_check_result->return_code = STATE_WARNING; tmp_check_result->output = strdup("WARNING failure 4"); handle_async_service_check_result(svc1, tmp_check_result); ok(svc1->state_type == HARD_STATE, "Hard state"); ok(svc1->acknowledgement_type == ACKNOWLEDGEMENT_NORMAL, "Ack left on hard failure"); ok(svc1->current_attempt == 4, "Current attempt is 4") || diag("Current attempt now: %d", svc1->current_attempt); setup_check_result(check_type); tmp_check_result->return_code = STATE_OK; tmp_check_result->output = strdup("Back to OK"); handle_async_service_check_result(svc1, tmp_check_result); ok(svc1->acknowledgement_type == ACKNOWLEDGEMENT_NONE, "Ack removed"); /* Test case: OK -> WARNING 1/1 -> ack -> WARNING -> OK transition Tests that the ack is not removed on 2nd warning, but is on OK */ setup_objects(when); host1->current_state = HOST_UP; host1->max_attempts = 4; svc1->last_state = STATE_OK; svc1->last_hard_state = STATE_OK; svc1->current_state = STATE_OK; svc1->state_type = SOFT_STATE; svc1->current_attempt = 1; svc1->max_attempts = 2; setup_check_result(check_type); tmp_check_result->return_code = STATE_WARNING; tmp_check_result->output = strdup("WARNING failure 1"); handle_async_service_check_result(svc1, tmp_check_result); ok(svc1->acknowledgement_type == ACKNOWLEDGEMENT_NONE, "No acks - testing transition to immediate hard then OK"); svc1->acknowledgement_type = ACKNOWLEDGEMENT_NORMAL; setup_check_result(check_type); tmp_check_result->return_code = STATE_WARNING; tmp_check_result->output = strdup("WARNING failure 2"); handle_async_service_check_result(svc1, tmp_check_result); ok(svc1->acknowledgement_type == ACKNOWLEDGEMENT_NORMAL, "Ack left"); setup_check_result(check_type); tmp_check_result->return_code = STATE_OK; tmp_check_result->output = strdup("Back to OK"); handle_async_service_check_result(svc1, tmp_check_result); ok(svc1->acknowledgement_type == ACKNOWLEDGEMENT_NONE, "Ack removed"); /* Test case: UP -> DOWN 1/4 -> ack -> DOWN 2/4 -> DOWN 3/4 -> DOWN 4/4 -> UP transition Tests that the ack is not removed on 2nd DOWN, but is on UP */ setup_objects(when); host1->current_state = HOST_UP; host1->last_state = HOST_UP; host1->last_hard_state = HOST_UP; host1->state_type = SOFT_STATE; host1->current_attempt = 1; host1->max_attempts = 4; host1->acknowledgement_type = ACKNOWLEDGEMENT_NONE; host1->plugin_output = strdup(""); host1->long_plugin_output = strdup(""); host1->perf_data = strdup(""); host1->check_command = strdup("Dummy command required"); host1->accept_passive_checks = TRUE; passive_host_checks_are_soft = TRUE; setup_check_result(check_type); tmp_check_result->return_code = STATE_CRITICAL; tmp_check_result->output = strdup("DOWN failure 2"); tmp_check_result->check_type = HOST_CHECK_PASSIVE; handle_async_host_check_result(host1, tmp_check_result); ok(host1->acknowledgement_type == ACKNOWLEDGEMENT_NONE, "No ack set"); ok(host1->current_attempt == 2, "Attempts right (not sure why this goes into 2 and not 1)") || diag("current_attempt=%d", host1->current_attempt); ok(strcmp(host1->plugin_output, "DOWN failure 2") == 0, "output set") || diag("plugin_output=%s", host1->plugin_output); host1->acknowledgement_type = ACKNOWLEDGEMENT_NORMAL; tmp_check_result->output = strdup("DOWN failure 3"); handle_async_host_check_result(host1, tmp_check_result); ok(host1->acknowledgement_type == ACKNOWLEDGEMENT_NORMAL, "Ack should be retained as in soft state"); ok(host1->current_attempt == 3, "Attempts incremented") || diag("current_attempt=%d", host1->current_attempt); ok(strcmp(host1->plugin_output, "DOWN failure 3") == 0, "output set") || diag("plugin_output=%s", host1->plugin_output); tmp_check_result->output = strdup("DOWN failure 4"); handle_async_host_check_result(host1, tmp_check_result); ok(host1->acknowledgement_type == ACKNOWLEDGEMENT_NORMAL, "Ack should be retained as in soft state"); ok(host1->current_attempt == 4, "Attempts incremented") || diag("current_attempt=%d", host1->current_attempt); ok(strcmp(host1->plugin_output, "DOWN failure 4") == 0, "output set") || diag("plugin_output=%s", host1->plugin_output); tmp_check_result->return_code = STATE_OK; tmp_check_result->output = strdup("UP again"); handle_async_host_check_result(host1, tmp_check_result); ok(host1->acknowledgement_type == ACKNOWLEDGEMENT_NONE, "Ack reset due to state change"); ok(host1->current_attempt == 1, "Attempts reset") || diag("current_attempt=%d", host1->current_attempt); ok(strcmp(host1->plugin_output, "UP again") == 0, "output set") || diag("plugin_output=%s", host1->plugin_output); } int main(int argc, char **argv) { time_t now = 0L; accept_passive_host_checks = TRUE; accept_passive_service_checks = TRUE; plan_tests(92); time(&now); run_service_check_tests(SERVICE_CHECK_ACTIVE, now); run_service_check_tests(SERVICE_CHECK_PASSIVE, now); return exit_status(); } nagios-4.3.4/t-tap/test_commands.c000066400000000000000000000214241314764422400170450ustar00rootroot00000000000000/***************************************************************************** * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * *****************************************************************************/ #define NSCORE 1 #include "config.h" #include "common.h" #include "nagios.h" #include "../base/commands.c" #include "stub_broker.c" #include "stub_comments.c" #include "stub_objects.c" #include "stub_statusdata.c" #include "stub_notifications.c" #include "stub_events.c" #include "stub_downtime.c" #include "stub_flapping.c" #include "stub_logging.c" #include "stub_utils.c" #include "stub_sretention.c" #include "stub_checks.c" #include "stub_macros.c" #include "tap.h" char *temp_path; int date_format; host *host_list; service *service_list; int accept_passive_service_checks; int check_host_freshness; int check_service_freshness; int check_external_commands; unsigned long modified_host_process_attributes; unsigned long modified_service_process_attributes; int enable_notifications; int obsess_over_hosts; int obsess_over_services; int execute_service_checks; int enable_event_handlers; int accept_passive_host_checks; int accept_passive_service_checks; int process_performance_data; int execute_host_checks; int execute_service_checks; char *global_service_event_handler; command *global_service_event_handler_ptr; char *global_host_event_handler; command *global_host_event_handler_ptr; char *command_file = NULL; iobroker_set *nagios_iobs = NULL; int sigrestart = FALSE; int debug_level = 0; int debug_verbosity = 0; /* Catch lower calls through these stubs */ time_t test_start_time = 0L; char *test_hostname; char *test_servicename; char *test_comment = NULL; int deleted = 1; scheduled_downtime *find_host_downtime_by_name(char *hostname) {} scheduled_downtime *find_host_service_downtime_by_name(char *hostname, char *service_description) {} int delete_downtime_by_start_time_comment(time_t start_time, char *comment) { test_start_time = start_time; test_comment = comment; return deleted; } int delete_downtime_by_hostname_service_description_start_time_comment(char *hostname, char *service_description, time_t start_time, char *comment) { test_hostname = hostname; test_servicename = service_description; test_start_time = start_time; test_comment = comment; return deleted; } void reset_vars() { test_start_time = 0L; test_hostname = NULL; test_servicename = NULL; test_comment = NULL; } hostgroup *temp_hostgroup = NULL; int main() { time_t now = 0L; plan_tests(62); ok(test_start_time == 0L, "Start time is empty"); ok(test_comment == NULL, "And test_comment is blank"); ok(cmd_delete_downtime_by_start_time_comment(1, "1234567890;This is a comment") == OK, "cmd_delete_downtime_by_start_time_comment"); ok(test_start_time == 1234567890L, "Start time called correctly"); ok(strcmp(test_comment, "This is a comment") == 0, "comment set correctly"); ok(cmd_delete_downtime_by_start_time_comment(1, "") == ERROR, "cmd_delete_downtime_by_start_time_comment errors if no args sent"); ok(cmd_delete_downtime_by_start_time_comment(1, "1234;Comment;") == OK, "cmd_delete_downtime_by_start_time_comment"); ok(test_start_time == 1234, "Silly start time parsed but will get rejected lower down"); ok(strcmp(test_comment, "Comment;") == 0, "Comment with ; will get dropped: '%s' <--- not sure if this should be true or not", test_comment); ok(cmd_delete_downtime_by_start_time_comment(1, "1234;Comment with \n in it;") == OK, "cmd_delete_downtime_by_start_time_comment"); ok(strcmp(test_comment, "Comment with ") == 0, "Comment truncated at \\n") || diag("comment=%s", test_comment); ok(cmd_delete_downtime_by_start_time_comment(1, ";") == ERROR, "cmd_delete_downtime_by_start_time_comment error due to no args"); test_start_time = 0L; test_comment = "somethingelse"; ok(cmd_delete_downtime_by_start_time_comment(1, "badtime") == ERROR, "cmd_delete_downtime_by_start_time_comment error due to bad time value"); ok(cmd_delete_downtime_by_start_time_comment(1, "123badtime;comment") == OK, "cmd_delete_downtime_by_start_time_comment"); ok(test_start_time == 123L, "Partly bad start time is parsed, but that's an input problem"); ok(strcmp(test_comment, "comment") == 0, "Comment"); ok(cmd_delete_downtime_by_start_time_comment(1, ";commentonly") == OK, "cmd_delete_downtime_by_start_time_comment"); ok(test_start_time == 0L, "No start time, but comment is set"); ok(strcmp(test_comment, "commentonly") == 0, "Comment"); deleted = 0; ok(cmd_delete_downtime_by_start_time_comment(1, ";commentonly") == ERROR, "Got an error here because no items deleted"); /* Test deletion of downtimes by name */ ok(cmd_delete_downtime_by_host_name(1, "") == ERROR, "cmd_delete_downtime_by_start_time_comment - errors if no args set"); ok(cmd_delete_downtime_by_host_name(1, ";svc;1234567890;Some comment") == ERROR, "cmd_delete_downtime_by_start_time_comment - errors if no host name set"); reset_vars(); ok(cmd_delete_downtime_by_host_name(1, "host1") == ERROR, "cmd_delete_downtime_by_start_time_comment - errors if no host name set"); ok(test_start_time == 0, "start time right"); ok(strcmp(test_hostname, "host1") == 0, "hostname right"); ok(test_servicename == NULL, "servicename right"); ok(test_comment == NULL, "comment right"); reset_vars(); ok(cmd_delete_downtime_by_host_name(1, "host1;svc1;;") == ERROR, "cmd_delete_downtime_by_start_time_comment - errors if no host name set"); ok(test_start_time == 0, "start time right"); ok(strcmp(test_hostname, "host1") == 0, "hostname right"); ok(strcmp(test_servicename, "svc1") == 0, "servicename right"); ok(test_comment == NULL, "comment right") || diag("comment=%s", test_comment); reset_vars(); ok(cmd_delete_downtime_by_host_name(1, "host1;svc1") == ERROR, "cmd_delete_downtime_by_start_time_comment - errors if no host name set"); ok(test_start_time == 0, "start time right"); ok(strcmp(test_hostname, "host1") == 0, "hostname right"); ok(strcmp(test_servicename, "svc1") == 0, "servicename right"); ok(test_comment == NULL, "comment right") || diag("comment=%s", test_comment); reset_vars(); ok(cmd_delete_downtime_by_host_name(1, "host1;svc1;1234567;") == ERROR, "cmd_delete_downtime_by_start_time_comment - errors if no host name set"); ok(test_start_time == 1234567L, "start time right"); ok(strcmp(test_hostname, "host1") == 0, "hostname right"); ok(strcmp(test_servicename, "svc1") == 0, "servicename right"); ok(test_comment == NULL, "comment right") || diag("comment=%s", test_comment); reset_vars(); ok(cmd_delete_downtime_by_host_name(1, "host1;svc1;12345678") == ERROR, "cmd_delete_downtime_by_start_time_comment - errors if no host name set"); ok(test_start_time == 12345678L, "start time right"); ok(strcmp(test_hostname, "host1") == 0, "hostname right"); ok(strcmp(test_servicename, "svc1") == 0, "servicename right"); ok(test_comment == NULL, "comment right") || diag("comment=%s", test_comment); reset_vars(); ok(cmd_delete_downtime_by_host_name(1, "host1;;12345678;comment too") == ERROR, "cmd_delete_downtime_by_start_time_comment - errors if no host name set"); ok(test_start_time == 12345678, "start time right"); ok(strcmp(test_hostname, "host1") == 0, "hostname right"); ok(test_servicename == NULL, "servicename right") || diag("servicename=%s", test_servicename); ok(strcmp(test_comment, "comment too") == 0, "comment right") || diag("comment=%s", test_comment); reset_vars(); ok(cmd_delete_downtime_by_host_name(1, "host1;;12345678;") == ERROR, "cmd_delete_downtime_by_start_time_comment - errors if no host name set"); ok(test_start_time == 12345678, "start time right"); ok(strcmp(test_hostname, "host1") == 0, "hostname right"); ok(test_servicename == NULL, "servicename right") || diag("servicename=%s", test_servicename); ok(test_comment == NULL, "comment right") || diag("comment=%s", test_comment); reset_vars(); ok(cmd_delete_downtime_by_host_name(1, "host1;;;comment") == ERROR, "cmd_delete_downtime_by_start_time_comment - errors if no host name set"); ok(test_start_time == 0L, "start time right"); ok(strcmp(test_hostname, "host1") == 0, "hostname right"); ok(test_servicename == NULL, "servicename right") || diag("servicename=%s", test_servicename); ok(strcmp(test_comment, "comment") == 0, "comment right") || diag("comment=%s", test_comment); return exit_status(); } nagios-4.3.4/t-tap/test_downtime.c000066400000000000000000000226461314764422400171010ustar00rootroot00000000000000/***************************************************************************** * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * *****************************************************************************/ #define NSCORE 1 #include "config.h" #include "common.h" #include "nagios.h" #include "downtime.h" #include "stub_broker.c" #include "stub_comments.c" #include "stub_statusdata.c" #include "stub_notifications.c" #include "stub_events.c" #include "stub_logging.c" #include "stub_nebmods.c" #include "stub_netutils.c" #include "stub_commands.c" #include "stub_checks.c" #include "tap.h" timed_event *event_list_high = NULL; timed_event *event_list_high_tail = NULL; extern scheduled_downtime *scheduled_downtime_list; int main(int argc, char **argv) { time_t now = 0L; time_t temp_start_time = 1234567890L; time_t temp_end_time = 2134567890L; unsigned long downtime_id = 0L; scheduled_downtime *temp_downtime; int i = 0; char *main_config_file = "../t/etc/nagios-test-downtime.cfg"; /* Initialize configuration variables */ init_main_cfg_vars(1); init_shared_cfg_vars(1); /* Read the configuration */ read_main_config_file(main_config_file); read_object_config_data(main_config_file, READ_ALL_OBJECT_DATA); pre_flight_check(); initialize_downtime_data(); plan_tests(38); time(&now); next_downtime_id = 1L; schedule_downtime(HOST_DOWNTIME, "host1", NULL, temp_start_time, "user", "test comment", temp_start_time, temp_end_time, 1, 0, 0, &downtime_id); ok(downtime_id == 1L, "Got host1 downtime: %lu", downtime_id); schedule_downtime(HOST_DOWNTIME, "host2", NULL, temp_start_time, "user", "test comment", temp_start_time, temp_end_time, 1, 0, 0, &downtime_id); ok(downtime_id == 2L, "Got host2 downtime: %lu", downtime_id); schedule_downtime(HOST_DOWNTIME, "host3", NULL, temp_start_time, "user", "diff comment", temp_start_time, temp_end_time, 1, 0, 0, &downtime_id); ok(downtime_id == 3L, "Got host3 downtime: %lu", downtime_id); schedule_downtime(HOST_DOWNTIME, "host4", NULL, temp_start_time, "user", "test comment", temp_start_time + 1, temp_end_time, 1, 0, 0, &downtime_id); ok(downtime_id == 4L, "Got host4 downtime: %lu", downtime_id); schedule_downtime(SERVICE_DOWNTIME, "host1", "svc", temp_start_time, "user", "svc comment", temp_start_time, temp_end_time, 1, 0, 0, &downtime_id); ok(downtime_id == 5L, "Got host1::svc downtime: %lu", downtime_id); schedule_downtime(SERVICE_DOWNTIME, "host2", "svc", temp_start_time, "user", "diff comment", temp_start_time, temp_end_time, 1, 0, 0, &downtime_id); ok(downtime_id == 6L, "Got host2::svc downtime: %lu", downtime_id); schedule_downtime(SERVICE_DOWNTIME, "host3", "svc", temp_start_time, "user", "svc comment", temp_start_time + 1, temp_end_time, 1, 0, 0, &downtime_id); ok(downtime_id == 7L, "Got host3::svc downtime: %lu", downtime_id); schedule_downtime(SERVICE_DOWNTIME, "host4", "svc", temp_start_time, "user", "uniq comment", temp_start_time, temp_end_time, 1, 0, 0, &downtime_id); ok(downtime_id == 8L, "Got host4::svc downtime: %lu", downtime_id); for(temp_downtime = scheduled_downtime_list, i = 0; temp_downtime != NULL; temp_downtime = temp_downtime->next, i++) {} ok(i == 8, "Got 8 downtimes: %d", i); i = delete_downtime_by_hostname_service_description_start_time_comment(NULL, NULL, 0, NULL); ok(i == 0, "No deletions") || diag("%d", i); i = delete_downtime_by_hostname_service_description_start_time_comment(NULL, NULL, 0, NULL); ok(i == 0, "No deletions"); i = delete_downtime_by_hostname_service_description_start_time_comment(NULL, NULL, temp_start_time, "test comment"); ok(i == 2, "Deleted 2 downtimes"); for(temp_downtime = scheduled_downtime_list, i = 0; temp_downtime != NULL; temp_downtime = temp_downtime->next, i++) {} ok(i == 6, "Got 6 downtimes left: %d", i); i = delete_downtime_by_hostname_service_description_start_time_comment(NULL, NULL, temp_start_time + 200, "test comment"); ok(i == 0, "Nothing matched, so 0 downtimes deleted"); i = delete_downtime_by_hostname_service_description_start_time_comment(NULL, NULL, temp_start_time + 1, NULL); ok(i == 2, "Deleted 2 by start_time only: %d", i); i = delete_downtime_by_hostname_service_description_start_time_comment(NULL, NULL, 0, "uniq comment"); ok(i == 1, "Deleted 1 by unique comment: %d", i); for(temp_downtime = scheduled_downtime_list, i = 0; temp_downtime != NULL; temp_downtime = temp_downtime->next, i++) { printf("# downtime id: %d\n", temp_downtime->downtime_id); } ok(i == 3, "Got 3 downtimes left: %d", i); unschedule_downtime(HOST_DOWNTIME, 3); unschedule_downtime(SERVICE_DOWNTIME, 5); unschedule_downtime(SERVICE_DOWNTIME, 6); for(temp_downtime = scheduled_downtime_list, i = 0; temp_downtime != NULL; temp_downtime = temp_downtime->next, i++) {} ok(i == 0, "No downtimes left"); /* Set all downtimes up again */ schedule_downtime(HOST_DOWNTIME, "host1", NULL, temp_start_time, "user", "test comment", temp_start_time, temp_end_time, 1, 0, 0, &downtime_id); ok(downtime_id == 9L, "Got host1 downtime: %lu", downtime_id); schedule_downtime(HOST_DOWNTIME, "host2", NULL, temp_start_time, "user", "test comment", temp_start_time, temp_end_time, 1, 0, 0, &downtime_id); ok(downtime_id == 10L, "Got host2 downtime: %lu", downtime_id); schedule_downtime(HOST_DOWNTIME, "host3", NULL, temp_start_time, "user", "diff comment", temp_start_time + 1, temp_end_time, 1, 0, 0, &downtime_id); ok(downtime_id == 11L, "Got host3 downtime: %lu", downtime_id); schedule_downtime(HOST_DOWNTIME, "host4", NULL, temp_start_time, "user", "test comment", temp_start_time + 1, temp_end_time, 1, 0, 0, &downtime_id); ok(downtime_id == 12L, "Got host4 downtime: %lu", downtime_id); schedule_downtime(SERVICE_DOWNTIME, "host1", "svc", temp_start_time, "user", "svc comment", temp_start_time, temp_end_time, 1, 0, 0, &downtime_id); ok(downtime_id == 13L, "Got host1::svc downtime: %lu", downtime_id); schedule_downtime(SERVICE_DOWNTIME, "host2", "svc", temp_start_time, "user", "diff comment", temp_start_time, temp_end_time, 1, 0, 0, &downtime_id); ok(downtime_id == 14L, "Got host2::svc downtime: %lu", downtime_id); schedule_downtime(SERVICE_DOWNTIME, "host3", "svc", temp_start_time, "user", "svc comment", temp_start_time, temp_end_time, 1, 0, 0, &downtime_id); ok(downtime_id == 15L, "Got host3::svc downtime: %lu", downtime_id); schedule_downtime(SERVICE_DOWNTIME, "host4", "svc", temp_start_time, "user", "uniq comment", temp_start_time, temp_end_time, 1, 0, 0, &downtime_id); ok(downtime_id == 16L, "Got host4::svc downtime: %lu", downtime_id); schedule_downtime(SERVICE_DOWNTIME, "host1", "svc2", temp_start_time, "user", "svc2 comment", temp_start_time, temp_end_time, 1, 0, 0, &downtime_id); ok(downtime_id == 17L, "Got host1::svc2 downtime: %lu", downtime_id); schedule_downtime(SERVICE_DOWNTIME, "host2", "svc2", temp_start_time, "user", "test comment", temp_start_time, temp_end_time, 1, 0, 0, &downtime_id); ok(downtime_id == 18L, "Got host2::svc2 downtime: %lu", downtime_id); schedule_downtime(SERVICE_DOWNTIME, "host3", "svc2", temp_start_time, "user", "svc2 comment", temp_start_time + 1, temp_end_time, 1, 0, 0, &downtime_id); ok(downtime_id == 19L, "Got host3::svc2 downtime: %lu", downtime_id); schedule_downtime(SERVICE_DOWNTIME, "host4", "svc2", temp_start_time, "user", "test comment", temp_start_time, temp_end_time, 1, 0, 0, &downtime_id); ok(downtime_id == 20L, "Got host4::svc2 downtime: %lu", downtime_id); i = delete_downtime_by_hostname_service_description_start_time_comment("host2", NULL, 0, "test comment"); ok(i == 2, "Deleted 2"); i = delete_downtime_by_hostname_service_description_start_time_comment("host1", "svc", 0, NULL); ok(i == 1, "Deleted 1") || diag("Actually deleted: %d", i); i = delete_downtime_by_hostname_service_description_start_time_comment("host3", NULL, temp_start_time + 1, NULL); ok(i == 2, "Deleted 2"); i = delete_downtime_by_hostname_service_description_start_time_comment(NULL, "svc2", 0, NULL); ok(i == 2, "Deleted 2") || diag("Actually deleted: %d", i); i = delete_downtime_by_hostname_service_description_start_time_comment("host4", NULL, 0, "test comment"); ok(i == 1, "Deleted 1") || diag("Actually deleted: %d", i); i = delete_downtime_by_hostname_service_description_start_time_comment("host4", NULL, 0, "svc comment"); ok(i == 0, "Deleted 0") || diag("Actually deleted: %d", i); for(temp_downtime = scheduled_downtime_list, i = 0; temp_downtime != NULL; temp_downtime = temp_downtime->next, i++) { printf("# downtime id: %d\n", temp_downtime->downtime_id); } ok(i == 4, "Got 4 downtimes left: %d", i); unschedule_downtime(HOST_DOWNTIME, 9); unschedule_downtime(SERVICE_DOWNTIME, 14); unschedule_downtime(SERVICE_DOWNTIME, 15); unschedule_downtime(SERVICE_DOWNTIME, 16); for(temp_downtime = scheduled_downtime_list, i = 0; temp_downtime != NULL; temp_downtime = temp_downtime->next, i++) {} ok(i == 0, "No downtimes left") || diag("Left: %d", i); return exit_status(); } nagios-4.3.4/t-tap/test_each.t000077500000000000000000000002731314764422400161670ustar00rootroot00000000000000#!/usr/bin/perl use Test::More; $_ = shift @ARGV or die "Must specify a file"; if (! -e "$_") { plan skip_all => "$_ not compiled - please install tap library to test"; } system "./$_"; nagios-4.3.4/t-tap/test_events.c000066400000000000000000000242461314764422400165550ustar00rootroot00000000000000/***************************************************************************** * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * *****************************************************************************/ #define TEST_EVENTS_C #define NSCORE 1 #include "config.h" #include "common.h" #include "downtime.h" #include "comments.h" #include "statusdata.h" #include "nagios.h" #include "broker.h" #include "sretention.h" #include "tap.h" #include "stub_logging.c" #include "stub_broker.c" #include "stub_sretention.c" #include "stub_statusdata.c" #include "stub_downtime.c" #include "stub_comments.c" #include "stub_notifications.c" #include "stub_workers.c" #include "stub_nebmods.c" #include "stub_netutils.c" #include "stub_commands.c" #include "stub_flapping.c" #include "stub_sehandlers.c" #include "stub_perfdata.c" #include "stub_nsock.c" #include "stub_iobroker.c" int perform_scheduled_host_check(host *temp_host, int int1, double double1) { time_t now = 0L; time(&now); temp_host->last_check = now; } #if 0 int run_scheduled_service_check(service *service1, int int1, double double1) { currently_running_service_checks++; time_t now = 0L; time(&now); service1->last_check = now; /* printf("Currently running service checks: %d\n", currently_running_service_checks); */ } #endif int c = 0; int update_program_status(int aggregated_dump) { c++; /* printf ("# In the update_program_status hook: %d\n", c); */ /* Set this to break out of event_execution_loop */ if(c > 10) { sigshutdown = TRUE; c = 0; } } /* Test variables */ service *svc1 = NULL, *svc2 = NULL, *svc3 = NULL; host *host1 = NULL; void test_event_process_svc1_results(void *args) { check_result *tmp_check_result = (check_result *)args; service *svc = find_service(tmp_check_result->host_name, tmp_check_result->service_description); handle_async_service_check_result(svc, tmp_check_result); } void setup_events(time_t time) { timed_event *new_event = NULL; /* First service is a normal one */ svc1 = find_service("host1", "Normal service"); svc1->check_options = 0; svc1->next_check = time; svc1->state_type = SOFT_STATE; svc1->current_state = STATE_OK; svc1->retry_interval = 1; svc1->check_interval = 5; new_event = (timed_event *)malloc(sizeof(timed_event)); new_event->event_type = EVENT_SERVICE_CHECK; new_event->event_data = (void *)svc1; new_event->event_args = (void *)NULL; new_event->event_options = 0; new_event->priority = 0; new_event->run_time = svc1->next_check; new_event->recurring = FALSE; new_event->event_interval = 0L; new_event->timing_func = NULL; new_event->compensate_for_time_change = TRUE; new_event->sq_event = NULL; reschedule_event(nagios_squeue, new_event); /* Second service is one that will get nudged forward */ svc2 = find_service("host1", "To be nudged"); svc2->check_options = 0; svc2->next_check = time; svc2->state_type = SOFT_STATE; svc2->current_state = STATE_OK; svc2->retry_interval = 1; svc2->check_interval = 5; new_event = (timed_event *)malloc(sizeof(timed_event)); new_event->event_type = EVENT_SERVICE_CHECK; new_event->event_data = (void *)svc2; new_event->event_args = (void *)NULL; new_event->event_options = 0; new_event->priority = 0; new_event->run_time = svc2->next_check; new_event->recurring = FALSE; new_event->event_interval = 0L; new_event->timing_func = NULL; new_event->compensate_for_time_change = TRUE; new_event->sq_event = NULL; reschedule_event(nagios_squeue, new_event); } setup_svc1_result_events(time_t time) { timed_event *new_event = NULL; check_result *tmp_check_result = NULL; /* Results for first check */ tmp_check_result = (check_result *)calloc(1, sizeof(check_result)); tmp_check_result->host_name = strdup("host1"); tmp_check_result->service_description = strdup("Normal service"); tmp_check_result->object_check_type = SERVICE_CHECK; tmp_check_result->check_type = SERVICE_CHECK_ACTIVE; tmp_check_result->check_options = 0; tmp_check_result->scheduled_check = TRUE; tmp_check_result->reschedule_check = FALSE; tmp_check_result->latency = 0.666; tmp_check_result->start_time.tv_sec = time; tmp_check_result->start_time.tv_usec = 500000; tmp_check_result->finish_time.tv_sec = time + 4; tmp_check_result->finish_time.tv_usec = 0; tmp_check_result->early_timeout = 0; tmp_check_result->exited_ok = TRUE; tmp_check_result->return_code = 0; tmp_check_result->output = strdup("OK - Everything Hunky Dorey"); /* Event to process those results */ new_event = (timed_event *)malloc(sizeof(timed_event)); new_event->event_type = EVENT_USER_FUNCTION; new_event->event_data = (void *)test_event_process_svc1_results; new_event->event_args = (void *)tmp_check_result; new_event->event_options = 0; new_event->priority = 0; new_event->run_time = tmp_check_result->finish_time.tv_sec; new_event->recurring = FALSE; new_event->event_interval = 0L; new_event->timing_func = NULL; new_event->compensate_for_time_change = TRUE; new_event->sq_event = NULL; reschedule_event(nagios_squeue, new_event); } void setup_events_with_host(time_t time) { timed_event *new_event = NULL; /* First service is a normal one */ svc3 = find_service("host1", "Normal service 2"); svc3->check_options = 0; svc3->next_check = time; svc3->state_type = SOFT_STATE; svc3->current_state = STATE_OK; svc3->retry_interval = 1; svc3->check_interval = 5; new_event = (timed_event *)malloc(sizeof(timed_event)); new_event->event_type = EVENT_SERVICE_CHECK; new_event->event_data = (void *)svc3; new_event->event_args = (void *)NULL; new_event->event_options = 0; new_event->priority = 0; new_event->run_time = svc3->next_check; new_event->recurring = FALSE; new_event->event_interval = 0L; new_event->timing_func = NULL; new_event->compensate_for_time_change = TRUE; new_event->sq_event = NULL; reschedule_event(nagios_squeue, new_event); host1 = find_host("host1"); host1->retry_interval = 1; host1->check_interval = 5; host1->check_options = 0; host1->next_check = time; host1->state_type = SOFT_STATE; host1->current_state = STATE_OK; host1->is_executing = 0; new_event = (timed_event *)malloc(sizeof(timed_event)); new_event->event_type = EVENT_HOST_CHECK; new_event->event_data = (void *)host1; new_event->event_args = (void *)NULL; new_event->event_options = 0; new_event->priority = 0; new_event->run_time = host1->next_check; new_event->recurring = FALSE; new_event->event_interval = 0L; new_event->timing_func = NULL; new_event->compensate_for_time_change = TRUE; new_event->sq_event = NULL; reschedule_event(nagios_squeue, new_event); } int main(int argc, char **argv) { int result; time_t now = 0L; char *main_config_file = "../t/etc/nagios-test-events.cfg"; /* Initialize configuration variables */ init_main_cfg_vars(1); init_shared_cfg_vars(1); /* Read the configuration */ read_main_config_file(main_config_file); read_object_config_data(main_config_file, READ_ALL_OBJECT_DATA); pre_flight_check(); plan_tests(11); interval_length = 60; nagios_squeue = squeue_create(4096); ok(nagios_squeue != NULL, "Created nagios squeue"); execute_service_checks = 1; currently_running_service_checks = 0; max_parallel_service_checks = 1; time(&now); setup_events(now); setup_svc1_result_events(now); printf("# Running execution loop - may take some time...\n"); event_execution_loop(); ok(svc1->last_check == now, "svc1 has not had its next check time changed") || diag("last_check = now: %ld", svc1->last_check - now); ok(svc2->next_check > now + NUDGE_MIN && svc2->next_check < now + NUDGE_MAX, "svc2 has been nudged") || diag("Nudge amount: %ld\n", svc2->next_check - now); sigshutdown = FALSE; currently_running_service_checks = 0; max_parallel_service_checks = 2; time(&now); setup_events(now); printf("# Running execution loop - may take some time...\n"); event_execution_loop(); ok(svc1->next_check == now, "svc1 has not had its next check time changed") || diag("next_check - now: %ld", svc1->next_check - now); ok(svc2->next_check == now, "svc2 also has not changed, because can execute") || diag("Nudge amount: %ld\n", svc2->next_check - now); /* This test should have both services moved forward due to not executing any service checks */ /* Will make svc2 move forward by a retry_interval amount */ execute_service_checks = 0; sigshutdown = FALSE; currently_running_service_checks = 0; max_parallel_service_checks = 2; time(&now); setup_events(now); svc2->current_state = STATE_CRITICAL; printf("# Running execution loop - may take some time...\n"); event_execution_loop(); ok(svc1->next_check == now + 300, "svc1 rescheduled ahead - normal interval") || diag("next_check - now: %ld", svc1->next_check - now); ok(svc2->next_check == now + 60, "svc2 rescheduled ahead - retry interval") || diag("next_check - now: %ld", svc2->next_check - now); /* Checking that a host check immediately following a service check * correctly checks the host */ squeue_destroy(nagios_squeue, 0); nagios_squeue = squeue_create(4096); sigshutdown = FALSE; currently_running_service_checks = 0; max_parallel_service_checks = 2; execute_service_checks = 0; execute_host_checks = 1; time(&now); setup_events_with_host(now); printf("# Running execution loop - may take some time...\n"); event_execution_loop(); ok(host1->last_check - now <= 2, "host1 was checked (within 2 seconds tolerance)") || diag("last_check - now: %ld", host1->last_check - now); ok(svc3->last_check == 0, "svc3 was skipped"); ok(host1->next_check == now, "host1 rescheduled ahead - normal interval") || diag("next_check - now: %ld", host1->next_check - now); ok(svc3->next_check == now + 300, "svc3 rescheduled ahead - normal interval"); return exit_status(); } nagios-4.3.4/t-tap/test_logging.c000066400000000000000000000076641314764422400167040ustar00rootroot00000000000000/***************************************************************************** * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * *****************************************************************************/ #define NSCORE 1 #include "config.h" #include "nagios.h" #include "objects.h" #include "tap.h" #include "stub_broker.c" #include "stub_xodtemplate.c" #define TEST_LOGGING 1 int date_format; char *log_file = NULL; int verify_config = FALSE; int test_scheduling = FALSE; int debug_level = DEFAULT_DEBUG_LEVEL; char *debug_file; int debug_verbosity = DEFAULT_DEBUG_VERBOSITY; unsigned long max_debug_file_size = DEFAULT_MAX_DEBUG_FILE_SIZE; int use_syslog = DEFAULT_USE_SYSLOG; unsigned long syslog_options = 0; unsigned long logging_options = 0; int log_initial_states = DEFAULT_LOG_INITIAL_STATES; char *log_archive_path = "var"; int log_current_states = DEFAULT_LOG_CURRENT_STATES; int log_service_retries = DEFAULT_LOG_SERVICE_RETRIES; int use_large_installation_tweaks = DEFAULT_USE_LARGE_INSTALLATION_TWEAKS; char *saved_source; char *saved_dest; int my_rename(char *source, char *dest) { char *temp = "renamefailure"; saved_source = strdup(source); saved_dest = strdup(dest); if(strcmp(source, "renamefailure") == 0) { return ERROR; } return rename(source, dest); } void update_program_status() {} int main(int argc, char **argv) { time_t rotation_time; struct stat stat_info, stat_new; char *log_filename_localtime = NULL; char *temp_command = NULL; struct tm *t; plan_tests(14); rotation_time = (time_t)1242949698; t = localtime(&rotation_time); asprintf(&log_filename_localtime, "var/nagios-%02d-%02d-%d-%02d.log", t->tm_mon + 1, t->tm_mday, t->tm_year + 1900, t->tm_hour); log_rotation_method = 5; ok(rotate_log_file(rotation_time) == ERROR, "Got error for a bad log_rotation_method"); log_file = "renamefailure"; log_rotation_method = LOG_ROTATION_HOURLY; ok(rotate_log_file(rotation_time) == ERROR, "Got an error with rename"); ok(strcmp(saved_dest, log_filename_localtime) == 0, "Got an hourly rotation"); unlink(log_file); log_file = "var/nagios.log"; log_rotation_method = LOG_ROTATION_HOURLY; ok(system("cp var/nagios.log.dummy var/nagios.log") == 0, "Copied in dummy nagios.log for archiving"); ok(rotate_log_file(rotation_time) == OK, "Log rotation should work happily"); system("diff var/nagios.log var/nagios.log.expected > var/nagios.log.diff"); ok(system("diff var/nagios.log.diff var/nagios.log.diff.expected > /dev/null") == 0, "Got correct contents of nagios.log"); unlink("var/nagios.log.diff"); asprintf(&temp_command, "diff var/nagios.log.dummy %s", log_filename_localtime); ok(system(temp_command) == 0, "nagios log archived correctly"); unlink(log_filename_localtime); ok(system("chmod 777 var/nagios.log") == 0, "Changed mode of nagios.log"); ok(stat("var/nagios.log", &stat_info) == 0, "Got stat info for log file"); ok(rotate_log_file(rotation_time) == OK, "Log rotate to check if mode is retained"); ok(stat(log_filename_localtime, &stat_new) == 0, "Got new stat info for archived log file"); ok(stat_info.st_mode == stat_new.st_mode, "Mode for archived file same as original log file"); ok(stat("var/nagios.log", &stat_new) == 0, "Got new stat info for new log file"); ok(stat_info.st_mode == stat_new.st_mode, "Mode for new log file kept same as original log file"); unlink(log_filename_localtime); return exit_status(); } nagios-4.3.4/t-tap/test_macros.c000066400000000000000000000155641314764422400165400ustar00rootroot00000000000000/***************************************************************************** * * test_macros.c - Test macro expansion and escaping * * Program: Nagios Core Testing * License: GPL * * First Written: 2013-05-21 * * Description: * * Tests expansion of macros and escaping. * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #include #include #include "../include/objects.h" #include "../include/nagios.h" #include "tap.h" #include "stub_downtime.c" #include "stub_comments.c" /*****************************************************************************/ /* Dummy functions */ /*****************************************************************************/ void logit(int data_type, int display, const char *fmt, ...) { } int my_sendall(int s, char *buf, int *len, int timeout) { return 0; } int log_debug_info(int level, int verbosity, const char *fmt, ...) { return 0; } int neb_free_callback_list(void) { return 0; } int neb_deinit_modules(void) { return 0; } void broker_program_state(int type, int flags, int attr, struct timeval *timestamp) { } int neb_unload_all_modules(int flags, int reason) { return 0; } int neb_add_module(char *filename, char *args, int should_be_loaded) { return 0; } void broker_system_command(int type, int flags, int attr, struct timeval start_time, struct timeval end_time, double exectime, int timeout, int early_timeout, int retcode, char *cmd, char *output, struct timeval *timestamp) { } timed_event *schedule_new_event(int event_type, int high_priority, time_t run_time, int recurring, unsigned long event_interval, void *timing_func, int compensate_for_time_change, void *event_data, void *event_args, int event_options) { return NULL ; } int my_tcp_connect(char *host_name, int port, int *sd, int timeout) { return 0; } int my_recvall(int s, char *buf, int *len, int timeout) { return 0; } int neb_free_module_list(void) { return 0; } int close_command_file(void) { return 0; } int close_log_file(void) { return 0; } int fix_log_file_owner(uid_t uid, gid_t gid) { return 0; } int handle_async_service_check_result(service *temp_service, check_result *queued_check_result) { return 0; } int handle_async_host_check_result(host *temp_host, check_result *queued_check_result) { return 0; } /*****************************************************************************/ /* Local test environment */ /*****************************************************************************/ host test_host = { .name = "name'&%", .address = "address'&%", .notes_url = "notes_url'&%($HOSTNOTES$)", .notes = "notes'&%($HOSTACTIONURL$)", .action_url = "action_url'&%", .plugin_output = "name'&%" }; /*****************************************************************************/ /* Helper functions */ /*****************************************************************************/ void init_environment() { char *p; my_free(illegal_output_chars); illegal_output_chars = strdup("'&"); /* For this tests, remove ' and & */ /* This is a part of preflight check, which we can't run */ for (p = illegal_output_chars; *p; p++) { illegal_output_char_map[(int) *p] = 1; } } nagios_macros *setup_macro_object(void) { nagios_macros *mac = (nagios_macros *) calloc(1, sizeof(nagios_macros)); grab_host_macros_r(mac, &test_host); return mac; } #define RUN_MACRO_TEST(_STR, _EXPECT, _OPTS) \ do { \ if( OK == process_macros_r(mac, (_STR), &output, _OPTS ) ) {\ ok( 0 == strcmp( output, _EXPECT ), "'%s': '%s' == '%s'", (_STR), output, (_EXPECT) ); \ } else { \ fail( "process_macros_r returns ERROR for " _STR ); \ } \ } while(0) /*****************************************************************************/ /* Tests */ /*****************************************************************************/ void test_escaping(nagios_macros *mac) { char *output; /* Nothing should be changed... options == 0 */ RUN_MACRO_TEST( "$HOSTNAME$ '&%", "name'&% '&%", 0); /* Nothing should be changed... HOSTNAME doesn't accept STRIP_ILLEGAL_MACRO_CHARS */ RUN_MACRO_TEST( "$HOSTNAME$ '&%", "name'&% '&%", STRIP_ILLEGAL_MACRO_CHARS); /* ' and & should be stripped from the macro, according to * init_environment(), but not from the initial string */ RUN_MACRO_TEST( "$HOSTOUTPUT$ '&%", "name% '&%", STRIP_ILLEGAL_MACRO_CHARS); /* ESCAPE_MACRO_CHARS doesn't seem to do anything... exist always in pair * with STRIP_ILLEGAL_MACRO_CHARS */ RUN_MACRO_TEST( "$HOSTOUTPUT$ '&%", "name'&% '&%", ESCAPE_MACRO_CHARS); RUN_MACRO_TEST( "$HOSTOUTPUT$ '&%", "name% '&%", STRIP_ILLEGAL_MACRO_CHARS | ESCAPE_MACRO_CHARS); /* $HOSTNAME$ should be url-encoded, but not the tailing chars */ RUN_MACRO_TEST( "$HOSTNAME$ '&%", "name%27%26%25 '&%", URL_ENCODE_MACRO_CHARS); /* The notes in the notesurl should be url-encoded, no more encoding should * exist */ RUN_MACRO_TEST( "$HOSTNOTESURL$ '&%", "notes_url'&%(notes%27%26%25%28action_url%27%26%25%29) '&%", 0); /* '& in the source string shouldn't be removed, because HOSTNOTESURL * doesn't accept STRIP_ILLEGAL_MACRO_CHARS, as in the url. the macros * included in the string should be url-encoded, and therefore not contain & * and ' */ RUN_MACRO_TEST( "$HOSTNOTESURL$ '&%", "notes_url'&%(notes%27%26%25%28action_url%27%26%25%29) '&%", STRIP_ILLEGAL_MACRO_CHARS); /* This should double-encode some chars ($HOSTNOTESURL$ should contain * url-encoded chars, and should itself be url-encoded */ RUN_MACRO_TEST( "$HOSTNOTESURL$ '&%", "notes_url%27%26%25%28notes%2527%2526%2525%2528action_url%2527%2526%2525%2529%29 '&%", URL_ENCODE_MACRO_CHARS); } /*****************************************************************************/ /* Main function */ /*****************************************************************************/ int main(void) { nagios_macros *mac; plan_tests(9); reset_variables(); init_environment(); init_macros(); mac = setup_macro_object(); test_escaping(mac); cleanup(); free(mac); return exit_status(); } nagios-4.3.4/t-tap/test_nagios_config.c000066400000000000000000000101401314764422400200420ustar00rootroot00000000000000/***************************************************************************** * * test_nagios_config.c - Test configuration loading * * Program: Nagios Core Testing * License: GPL * * First Written: 10-08-2009, based on nagios.c * * Description: * * Tests Nagios configuration loading * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #include "../include/config.h" #include "../include/common.h" #include "../include/objects.h" #include "../include/comments.h" #include "../include/downtime.h" #include "../include/statusdata.h" #include "../include/macros.h" #include "../include/nagios.h" #include "../include/sretention.h" #include "../include/perfdata.h" #include "../include/broker.h" #include "../include/nebmods.h" #include "../include/nebmodules.h" #include "tap.h" #include "stub_events.c" #include "stub_logging.c" #include "stub_commands.c" #include "stub_checks.c" #include "stub_nebmods.c" #include "stub_netutils.c" #include "stub_broker.c" #include "stub_statusdata.c" #include "stub_flapping.c" #include "stub_notifications.c" int main(int argc, char **argv) { int result; int error = FALSE; char *buffer = NULL; int display_license = FALSE; int display_help = FALSE; int c = 0; struct tm *tm; time_t now; char datestring[256]; host *temp_host = NULL; hostgroup *temp_hostgroup = NULL; hostsmember *temp_member = NULL; plan_tests(14); /* reset program variables */ reset_variables(); printf("Reading configuration data...\n"); config_file = strdup("smallconfig/nagios.cfg"); /* read in the configuration files (main config file, resource and object config files) */ result = read_main_config_file(config_file); ok(result == OK, "Read main configuration file okay - if fails, use nagios -v to check"); result = read_all_object_data(config_file); ok(result == OK, "Read all object config files"); result = pre_flight_check(); ok(result == OK, "Preflight check okay"); initialize_downtime_data(); for(temp_hostgroup = hostgroup_list; temp_hostgroup != NULL; temp_hostgroup = temp_hostgroup->next) { c++; //printf("Hostgroup=%s\n", temp_hostgroup->group_name); } ok(c == 2, "Found all hostgroups"); temp_hostgroup = find_hostgroup("hostgroup1"); for(temp_member = temp_hostgroup->members; temp_member != NULL; temp_member = temp_member->next) { //printf("host pointer=%d\n", temp_member->host_ptr); } temp_hostgroup = find_hostgroup("hostgroup2"); for(temp_member = temp_hostgroup->members; temp_member != NULL; temp_member = temp_member->next) { //printf("host pointer=%d\n", temp_member->host_ptr); } temp_host = find_host("host1"); ok(temp_host->current_state == 0, "State is assumed OK on initial load"); // xrddefault_retention_file = strdup("smallconfig/retention.dat"); ok(xrddefault_read_state_information() == OK, "Reading retention data"); ok(temp_host->current_state == 1, "State changed due to retention file settings"); ok(find_host_comment(418) != NULL, "Found host comment id 418"); ok(find_service_comment(419) != NULL, "Found service comment id 419"); ok(find_service_comment(420) == NULL, "Did not find service comment id 420 as not persistent"); ok(find_host_comment(1234567888) == NULL, "No such host comment"); ok(find_host_downtime(1102) != NULL, "Found host downtime id 1102"); ok(find_service_downtime(1110) != NULL, "Found service downtime 1110"); ok(find_host_downtime(1234567888) == NULL, "No such host downtime"); cleanup(); my_free(config_file); return exit_status(); } nagios-4.3.4/t-tap/test_timeperiods.c000066400000000000000000000327401314764422400175730ustar00rootroot00000000000000/***************************************************************************** * * test_timeperiod.c - Test timeperiod * * Program: Nagios Core Testing * License: GPL * * First Written: 10-08-2009, based on nagios.c * * Description: * * Tests Nagios configuration loading * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #include "../include/config.h" #include "../include/common.h" #include "../include/objects.h" #include "../include/comments.h" #include "../include/downtime.h" #include "../include/statusdata.h" #include "../include/macros.h" #include "../include/nagios.h" #include "../include/sretention.h" #include "../include/perfdata.h" #include "../include/broker.h" #include "../include/nebmods.h" #include "../include/nebmodules.h" #include "tap.h" #include "stub_downtime.c" /* Dummy functions */ void logit(int data_type, int display, const char *fmt, ...) {} int my_sendall(int s, char *buf, int *len, int timeout) { return 0; } void free_comment_data(void) {} int write_to_log(char *buffer, unsigned long data_type, time_t *timestamp) { return 0; } int log_debug_info(int level, int verbosity, const char *fmt, ...) { return 0; } int neb_free_callback_list(void) { return 0; } void broker_program_status(int type, int flags, int attr, struct timeval *timestamp) {} int neb_deinit_modules(void) { return 0; } void broker_program_state(int type, int flags, int attr, struct timeval *timestamp) {} void broker_comment_data(int type, int flags, int attr, int comment_type, int entry_type, char *host_name, char *svc_description, time_t entry_time, char *author_name, char *comment_data, int persistent, int source, int expires, time_t expire_time, unsigned long comment_id, struct timeval *timestamp) {} int neb_unload_all_modules(int flags, int reason) { return 0; } int neb_add_module(char *filename, char *args, int should_be_loaded) { return 0; } void broker_system_command(int type, int flags, int attr, struct timeval start_time, struct timeval end_time, double exectime, int timeout, int early_timeout, int retcode, char *cmd, char *output, struct timeval *timestamp) {} timed_event *schedule_new_event(int event_type, int high_priority, time_t run_time, int recurring, unsigned long event_interval, void *timing_func, int compensate_for_time_change, void *event_data, void *event_args, int event_options) { return NULL; } int my_tcp_connect(char *host_name, int port, int *sd, int timeout) { return 0; } int my_recvall(int s, char *buf, int *len, int timeout) { return 0; } int neb_free_module_list(void) { return 0; } int close_command_file(void) { return 0; } int close_log_file(void) { return 0; } int fix_log_file_owner(uid_t uid, gid_t gid) { return 0; } int handle_async_service_check_result(service *temp_service, check_result *queued_check_result) { return 0; } int handle_async_host_check_result(host *temp_host, check_result *queued_check_result) { return 0; } int main(int argc, char **argv) { int result; int c = 0; time_t current_time; time_t test_time; time_t saved_test_time; time_t next_valid_time = 0L; time_t chosen_valid_time = 0L; timeperiod *temp_timeperiod = NULL; int is_valid_time = 0; int iterations = 1000; plan_tests(6046); /* reset program variables */ reset_variables(); printf("Reading configuration data...\n"); config_file = strdup("smallconfig/nagios.cfg"); /* read in the configuration files (main config file, resource and object config files) */ result = read_main_config_file(config_file); ok(result == OK, "Read main configuration file okay - if fails, use nagios -v to check"); result = read_all_object_data(config_file); ok(result == OK, "Read all object config files"); result = pre_flight_check(); ok(result == OK, "Preflight check okay"); time(¤t_time); test_time = current_time; saved_test_time = current_time; temp_timeperiod = find_timeperiod("none"); is_valid_time = check_time_against_period(test_time, temp_timeperiod); ok(is_valid_time == ERROR, "No valid time because time period is empty"); get_next_valid_time(current_time, &next_valid_time, temp_timeperiod); ok(current_time == next_valid_time, "There is no valid time due to timeperiod"); temp_timeperiod = find_timeperiod("24x7"); is_valid_time = check_time_against_period(test_time, temp_timeperiod); ok(is_valid_time == OK, "Fine because 24x7"); get_next_valid_time(current_time, &next_valid_time, temp_timeperiod); ok((next_valid_time - current_time) <= 2, "Next valid time should be the current_time, but with a 2 second tolerance"); /* 2009-10-25 is the day when clocks go back an hour in Europe. Bug happens during 23:00 to 00:00 */ /* This is 23:01:01 */ saved_test_time = 1256511661; saved_test_time = saved_test_time - (24 * 60 * 60); putenv("TZ=UTC"); tzset(); test_time = saved_test_time; c = 0; while(c < iterations) { is_valid_time = check_time_against_period(test_time, temp_timeperiod); ok(is_valid_time == OK, "Always OK for 24x7 with TZ=UTC, time_t=%lu", test_time); chosen_valid_time = 0L; _get_next_valid_time(test_time, &chosen_valid_time, temp_timeperiod); ok(test_time == chosen_valid_time, "get_next_valid_time always returns same time"); test_time += 1800; c++; } putenv("TZ=Europe/London"); tzset(); test_time = saved_test_time; c = 0; while(c < iterations) { is_valid_time = check_time_against_period(test_time, temp_timeperiod); ok(is_valid_time == OK, "Always OK for 24x7 with TZ=Europe/London, time_t=%lu", test_time); _get_next_valid_time(test_time, &chosen_valid_time, temp_timeperiod); ok(test_time == chosen_valid_time, "get_next_valid_time always returns same time, time_t=%lu", test_time); test_time += 1800; c++; } /* 2009-11-01 is the day when clocks go back an hour in America. Bug happens during 23:00 to 00:00 */ /* This is 23:01:01 */ saved_test_time = 1256511661; saved_test_time = saved_test_time - (24 * 60 * 60); putenv("TZ=America/New_York"); tzset(); test_time = saved_test_time; c = 0; while(c < iterations) { is_valid_time = check_time_against_period(test_time, temp_timeperiod); ok(is_valid_time == OK, "Always OK for 24x7 with TZ=America/New_York, time_t=%lu", test_time); _get_next_valid_time(test_time, &chosen_valid_time, temp_timeperiod); ok(test_time == chosen_valid_time, "get_next_valid_time always returns same time, time_t=%lu", test_time); test_time += 1800; c++; } /* Tests around clock change going back for TZ=Europe/London. 1256511661 = Sun Oct 25 23:01:01 2009 */ /* A little trip to Paris*/ putenv("TZ=Europe/Paris"); tzset(); /* Timeperiod exclude tests, from Jean Gabes */ temp_timeperiod = find_timeperiod("Test_exclude"); ok(temp_timeperiod != NULL, "Testing Exclude timeperiod"); test_time = 1278939600; //mon jul 12 15:00:00 is_valid_time = check_time_against_period(test_time, temp_timeperiod); ok(is_valid_time == ERROR, "12 Jul 2010 15:00:00 should not be valid"); _get_next_valid_time(test_time, &chosen_valid_time, temp_timeperiod); ok(chosen_valid_time == 1288103400, "Next valid time should be Tue Oct 26 16:30:00 2010, was %s", ctime(&chosen_valid_time)); temp_timeperiod = find_timeperiod("Test_exclude2"); ok(temp_timeperiod != NULL, "Testing Exclude timeperiod 2"); test_time = 1278939600; //mon jul 12 15:00:00 is_valid_time = check_time_against_period(test_time, temp_timeperiod); ok(is_valid_time == ERROR, "12 Jul 2010 15:00:00 should not be valid"); _get_next_valid_time(test_time, &chosen_valid_time, temp_timeperiod); ok(chosen_valid_time == 1279058340, "Next valid time should be Tue Jul 13 23:59:00 2010, was %s", ctime(&chosen_valid_time)); temp_timeperiod = find_timeperiod("Test_exclude3"); ok(temp_timeperiod != NULL, "Testing Exclude timeperiod 3"); test_time = 1278939600; //mon jul 12 15:00:00 is_valid_time = check_time_against_period(test_time, temp_timeperiod); ok(is_valid_time == ERROR, "12 Jul 2010 15:00:00 should not be valid"); _get_next_valid_time(test_time, &chosen_valid_time, temp_timeperiod); ok(chosen_valid_time == 1284474600, "Next valid time should be Tue Sep 14 16:30:00 2010, was %s", ctime(&chosen_valid_time)); temp_timeperiod = find_timeperiod("Test_exclude4"); ok(temp_timeperiod != NULL, "Testing Exclude timeperiod 4"); test_time = 1278939600; //mon jul 12 15:00:00 is_valid_time = check_time_against_period(test_time, temp_timeperiod); ok(is_valid_time == ERROR, "12 Jul 2010 15:00:00 should not be valid"); _get_next_valid_time(test_time, &chosen_valid_time, temp_timeperiod); ok(chosen_valid_time == 1283265000, "Next valid time should be Tue Aug 31 16:30:00 2010, was %s", ctime(&chosen_valid_time)); temp_timeperiod = find_timeperiod("exclude_always"); ok(temp_timeperiod != NULL, "Testing exclude always"); test_time = 1278939600; //mon jul 12 15:00:00 is_valid_time = check_time_against_period(test_time, temp_timeperiod); ok(is_valid_time == ERROR, "12 Jul 2010 15:00:00 should not be valid"); _get_next_valid_time(test_time, &chosen_valid_time, temp_timeperiod); ok(chosen_valid_time == test_time, "There should be no next valid time, was %s", ctime(&chosen_valid_time)); /* Back to New york */ putenv("TZ=America/New_York"); tzset(); temp_timeperiod = find_timeperiod("sunday_only"); ok(temp_timeperiod != NULL, "Testing Sunday 00:00-01:15,03:15-22:00"); putenv("TZ=Europe/London"); tzset(); test_time = 1256421000; is_valid_time = check_time_against_period(test_time, temp_timeperiod); ok(is_valid_time == ERROR, "Sat Oct 24 22:50:00 2009 - false"); _get_next_valid_time(test_time, &chosen_valid_time, temp_timeperiod); ok(chosen_valid_time == 1256425200, "Next valid time=Sun Oct 25 00:00:00 2009"); test_time = 1256421661; is_valid_time = check_time_against_period(test_time, temp_timeperiod); ok(is_valid_time == ERROR, "Sat Oct 24 23:01:01 2009 - false"); _get_next_valid_time(test_time, &chosen_valid_time, temp_timeperiod); ok(chosen_valid_time == 1256425200, "Next valid time=Sun Oct 25 00:00:00 2009"); test_time = 1256425400; is_valid_time = check_time_against_period(test_time, temp_timeperiod); ok(is_valid_time == OK, "Sun Oct 25 00:03:20 2009 - true"); _get_next_valid_time(test_time, &chosen_valid_time, temp_timeperiod); ok(chosen_valid_time == test_time, "Next valid time=Sun Oct 25 00:03:20 2009"); test_time = 1256429700; is_valid_time = check_time_against_period(test_time, temp_timeperiod); ok(is_valid_time == OK, "Sun Oct 25 01:15:00 2009 - true"); _get_next_valid_time(test_time, &chosen_valid_time, temp_timeperiod); ok(chosen_valid_time == test_time, "Next valid time=Sun Oct 25 01:15:00 2009"); test_time = 1256430400; is_valid_time = check_time_against_period(test_time, temp_timeperiod); ok(is_valid_time == ERROR, "Sun Oct 25 01:26:40 2009 - false"); _get_next_valid_time(test_time, &chosen_valid_time, temp_timeperiod); ok(chosen_valid_time == 1256440500, "Next valid time should be Sun Oct 25 03:15:00 2009, was %s", ctime(&chosen_valid_time)); test_time = 1256440500; is_valid_time = check_time_against_period(test_time, temp_timeperiod); ok(is_valid_time == OK, "Sun Oct 25 03:15:00 2009 - true"); _get_next_valid_time(test_time, &chosen_valid_time, temp_timeperiod); ok(chosen_valid_time == test_time, "Next valid time=Sun Oct 25 03:15:00 2009"); test_time = 1256500000; is_valid_time = check_time_against_period(test_time, temp_timeperiod); ok(is_valid_time == OK, "Sun Oct 25 19:46:40 2009 - true"); _get_next_valid_time(test_time, &chosen_valid_time, temp_timeperiod); ok(chosen_valid_time == 1256500000, "Next valid time=Sun Oct 25 19:46:40 2009"); test_time = 1256508000; is_valid_time = check_time_against_period(test_time, temp_timeperiod); ok(is_valid_time == OK, "Sun Oct 25 22:00:00 2009 - true"); _get_next_valid_time(test_time, &chosen_valid_time, temp_timeperiod); ok(chosen_valid_time == 1256508000, "Next valid time=Sun Oct 25 22:00:00 2009"); test_time = 1256508001; is_valid_time = check_time_against_period(test_time, temp_timeperiod); ok(is_valid_time == ERROR, "Sun Oct 25 22:00:01 2009 - false"); _get_next_valid_time(test_time, &chosen_valid_time, temp_timeperiod); ok(chosen_valid_time == 1257033600, "Next valid time=Sun Nov 1 00:00:00 2009"); test_time = 1256513000; is_valid_time = check_time_against_period(test_time, temp_timeperiod); ok(is_valid_time == ERROR, "Sun Oct 25 23:23:20 2009 - false"); _get_next_valid_time(test_time, &chosen_valid_time, temp_timeperiod); ok(chosen_valid_time == 1257033600, "Next valid time=Sun Nov 1 00:00:00 2009"); temp_timeperiod = find_timeperiod("weekly_complex"); ok(temp_timeperiod != NULL, "Testing complex weekly timeperiod definition"); putenv("TZ=America/New_York"); tzset(); test_time = 1268109420; is_valid_time = check_time_against_period(test_time, temp_timeperiod); ok(is_valid_time == ERROR, "Mon Mar 8 23:37:00 2010 - false"); _get_next_valid_time(test_time, &chosen_valid_time, temp_timeperiod); ok(chosen_valid_time == 1268115300, "Next valid time=Tue Mar 9 01:15:00 2010"); cleanup(); my_free(config_file); return exit_status(); } nagios-4.3.4/t-tap/test_xsddefault.c000066400000000000000000000052721314764422400174120ustar00rootroot00000000000000/***************************************************************************** * * test_xsddefault.c - Test configuration loading * * Program: Nagios Core Testing * License: GPL * * First Written: 06-01-2010, based on test_nagios_config.c * * Description: * * Tests Nagios status file reading * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ /* Need these to get CGI mode */ #undef NSCORE #define NSCGI 1 #include "../include/config.h" #include "../include/common.h" #include "../include/locations.h" #include "../include/statusdata.h" #include "../include/comments.h" #include "../include/downtime.h" #include "../include/macros.h" #include "../include/skiplist.h" #include "tap.h" extern nagios_comment *comment_list; extern scheduled_downtime *scheduled_downtime_list; int main(int argc, char **argv) { int result; int c; int last_id; time_t last_time; nagios_comment *temp_comment; scheduled_downtime *temp_downtime; plan_tests(7); chdir("../t"); ok(system("cat var/status.dat > var/status-generated.dat") == 0, "New status.dat file"); ok(system("bin/generate_downtimes 10 >> var/status-generated.dat") == 0, "Generated 10 downtimes"); result = xsddefault_read_status_data("etc/cgi-with-generated-status.cfg", 0); ok(result == OK, "Read cgi status data okay"); temp_comment = comment_list; last_id = 0; c = 0; result = OK; while(temp_comment != NULL) { c++; if(temp_comment->comment_id <= last_id) { result = ERROR; break; } last_id = temp_comment->comment_id; temp_comment = temp_comment->next; } ok(c == 12, "Got %d comments - expected 12", c); ok(result == OK, "All comments in order"); temp_downtime = scheduled_downtime_list; last_time = 0; c = 0; result = OK; while(temp_downtime != NULL) { c++; if(temp_downtime->start_time < last_time) { result = ERROR; break; } last_time = temp_downtime->start_time; temp_downtime = temp_downtime->next; } ok(c == 20, "Got %d downtimes - expected 20", c); ok(result == OK, "All downtimes in order"); return exit_status(); } nagios-4.3.4/t-tap/var/000077500000000000000000000000001314764422400146265ustar00rootroot00000000000000nagios-4.3.4/t-tap/var/.gitignore000066400000000000000000000000141314764422400166110ustar00rootroot00000000000000nagios*.log nagios-4.3.4/t-tap/var/nagios.log.diff.expected000066400000000000000000000001121314764422400213120ustar00rootroot000000000000000a1,2 > [1242949698] LOG ROTATION: HOURLY > [1242949698] LOG VERSION: 2.0 nagios-4.3.4/t-tap/var/nagios.log.dummy000066400000000000000000000000621314764422400177410ustar00rootroot00000000000000This is a dummy nagios.log file. Will be archived nagios-4.3.4/t-tap/var/nagios.log.expected000066400000000000000000000001001314764422400204000ustar00rootroot00000000000000[1242949698] LOG ROTATION: HOURLY [1242949698] LOG VERSION: 2.0 nagios-4.3.4/t/000077500000000000000000000000001314764422400132545ustar00rootroot00000000000000nagios-4.3.4/t/610cgistatus.t000066400000000000000000000034141314764422400157000ustar00rootroot00000000000000#!/usr/bin/perl # # Checks for status.cgi use warnings; use strict; use Test::More; use FindBin qw($Bin); chdir $Bin or die "Cannot chdir"; my $topdir = "$Bin/.."; my $cgi_dir = "$topdir/cgi"; my $cgi = "$cgi_dir/status.cgi"; my $output; plan tests => 9; my $numhosts; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg REMOTE_USER=nagiosadmin REQUEST_METHOD=GET QUERY_STRING=host=all $cgi`; like( $output, '/status.cgi\?host=all&sorttype=1&sortoption=1/', "Host value should be set to all if host=all passed in" ); # Bit of a hacky way to count number of hosts $numhosts = grep /title=/, split("\n", $output); ok( $numhosts > 1, "Got $numhosts hosts, which is more than 1"); $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg REMOTE_USER=nagiosadmin REQUEST_METHOD=GET QUERY_STRING=host=host1 $cgi`; like( $output, '/status.cgi\?host=host1&sorttype=1&sortoption=1/', "Host value should be set to specific host if passed in" ); like( $output, '/1 Matching Services/', "Found the one host" ); $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg REMOTE_USER=nagiosadmin REQUEST_METHOD=GET QUERY_STRING=host= $cgi`; like( $output, '/status.cgi\?host=&sorttype=1&sortoption=1/', "Host value kept as blank if set to blank" ); like( $output, '/0 Matching Services/', "Got no hosts because looking for a blank name" ); $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg REMOTE_USER=nagiosadmin REQUEST_METHOD=GET $cgi`; like( $output, '/status.cgi\?host=all&sorttype=1&sortoption=1/', "Host value should be set to all if nothing set initially" ); $_ = grep /title=/, split("\n", $output); is( $_, $numhosts, "Same number of hosts" ); $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg REMOTE_USER=second REQUEST_METHOD=GET QUERY_STRING=host=all $cgi`; like( $output, '/1 Matching Services/', "Got 1 service, as permission only allows one host"); nagios-4.3.4/t/611cgistatus-hosturgencies.t000066400000000000000000000022431314764422400205600ustar00rootroot00000000000000#!/usr/bin/perl # # Checks for status.cgi use warnings; use strict; use Test::More; use FindBin qw($Bin); chdir $Bin or die "Cannot chdir"; my $topdir = "$Bin/.."; my $cgi_dir = "$topdir/cgi"; my $cgi = "$cgi_dir/status.cgi"; my $output; plan tests => 3; my $numhosts; # Host list sorted by name $output = `NAGIOS_CGI_CONFIG=etc/cgi-hosturgencies.cfg REMOTE_USER=nagiosadmin REQUEST_METHOD=GET QUERY_STRING='hostgroup=all&style=hostdetail' $cgi`; like( $output, '/>host1<.*>host2<.*>host3<.*>host4host4<.*>host1<.*>host2<.*>host3host2<.*>host3<.*>host4<.*>host1 1 ) } grep /\.cgi$/, readdir DIR; closedir DIR; # Remove these two because the output is different my @todos = qw(statuswml.cgi statuswrl.cgi); TODO: { local $TODO = "Output is different for these CGIs"; foreach my $cgi (@todos) { delete $cgis{$cgi}; # my $output = `NAGIOS_CGI_CONFIG=etc/cgi.nonexistent REQUEST_METHOD=GET $cgi_dir/$cgi`; # like( $output, "/Error: Could not open CGI config file 'etc/cgi.nonexistent' for reading/", "Found error for $cgi" ); } } plan tests => scalar keys %cgis; foreach my $cgi (sort keys %cgis) { my $output = `NAGIOS_CGI_CONFIG=etc/cgi.nonexistent REQUEST_METHOD=GET $cgi_dir/$cgi`; like( $output, "/Error: Could not open CGI config file 'etc/cgi.nonexistent' for reading/", "Found error for $cgi" ); } nagios-4.3.4/t/616cginotification.t000066400000000000000000000025221314764422400170500ustar00rootroot00000000000000#!/usr/bin/perl # # Checks for notifications.cgi use warnings; use strict; use Test::More; use FindBin qw($Bin); chdir $Bin or die "Cannot chdir"; my $topdir = "$Bin/.."; my $cgi_dir = "$topdir/cgi"; my $notifications_cgi = "$cgi_dir/notifications.cgi"; my $output; plan tests => 5; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg REQUEST_METHOD=GET $notifications_cgi`; like( $output, "//", "Host value set to all if nothing set" ); $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg REQUEST_METHOD=GET QUERY_STRING=host=all $notifications_cgi`; like( $output, "//", "Host value set to all if host=all set" ); $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg REQUEST_METHOD=GET QUERY_STRING=host=hostA $notifications_cgi`; like( $output, "//", "Host value set to host in query string" ); $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg REQUEST_METHOD=GET QUERY_STRING=contact=all $notifications_cgi`; like( $output, "//", "Contact value set to all from query string" ); $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg REQUEST_METHOD=GET QUERY_STRING=contact=fred $notifications_cgi`; like( $output, "//", "Contact value set to fred from query string" ); nagios-4.3.4/t/617statuswml.t000066400000000000000000000026231314764422400157450ustar00rootroot00000000000000#!/usr/bin/perl # # Checks for statuswml.cgi use warnings; use strict; use Test::More; # Useful for diagnostics, but not part of a core perl install #use Test::LongString; use FindBin qw($Bin); chdir $Bin or die "Cannot chdir"; my $topdir = "$Bin/.."; my $cgi_dir = "$topdir/cgi"; my $statuswml = "$cgi_dir/statuswml.cgi"; my $output; my $expected; plan tests => 5; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg REQUEST_METHOD=GET QUERY_STRING="ping=127.0.0.1%3Becho+this+should+not+get+here" $statuswml`; unlike( $output, "/this should not get here/", "Check that security error does not exist" ); like( $output, qr%

    Invalid host name/ip

    % ); $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg REQUEST_METHOD=GET QUERY_STRING="traceroute=127.0.0.1%3Becho+this+should+not+get+here" $statuswml`; unlike( $output, "/this should not get here/", "Check that security error does not exist" ); like( $output, qr%

    Invalid host name/ip

    % ); $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg REQUEST_METHOD=GET QUERY_STRING="ping=127.0.0.1" $statuswml`; like( $output, qr%Results For Ping Of 127.0.0.1:
    %, "Works correctly for valid address for ping" ); # Don't run this test below, because it actually invokes traceroute #$output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg REQUEST_METHOD=GET QUERY_STRING="traceroute=127.0.0.1" $statuswml`; #like( $output, qr%Results For Traceroute To 127.0.0.1:
    %, "... and traceroute" ); nagios-4.3.4/t/618cgisecurity.t000066400000000000000000000017171314764422400162400ustar00rootroot00000000000000#!/usr/bin/perl # # Check that you CGI security errors are fixed use warnings; use strict; use Test::More; use FindBin qw($Bin); chdir $Bin or die "Cannot chdir"; my $topdir = "$Bin/.."; my $cgi_dir = "$topdir/cgi"; plan 'no_plan'; my $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg REQUEST_METHOD=GET QUERY_STRING="layer=' style=xss:expression(alert('XSS')) '" $cgi_dir/statusmap.cgi`; unlike( $output, qr/' style=xss:expression\(alert\('XSS'\)\) '/, "XSS injection not passed straight through" ); # Is this correct? Nothing weird happens anyway, so let's assume so like( $output, qr/' style=xss:expression(alert('XSS')) '/, "Expected escaping of quotes" ) || diag $output; $output = `REMOTE_USER=nagiosadmin NAGIOS_CGI_CONFIG=etc/cgi.cfg REQUEST_METHOD=GET QUERY_STRING="type=command&expand=" $cgi_dir/config.cgi`; unlike( $output, qr//, "XSS injection not passed through" ) || diag ($output); nagios-4.3.4/t/622extinfo-local.t000066400000000000000000000014161314764422400164410ustar00rootroot00000000000000#!/usr/bin/perl # # Local Checks for extinfo.cgi use warnings; use strict; use Test::More; use FindBin qw($Bin); chdir $Bin or die "Cannot chdir"; my $topdir = "$Bin/.."; my $cgi_dir = "$topdir/cgi"; my $extinfo_cgi = "$cgi_dir/extinfo.cgi"; my $output; my $remote_user = "REMOTE_USER=nagiosadmin"; plan tests => 2; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg REQUEST_METHOD=GET $remote_user $extinfo_cgi`; like( $output, "/Process Information/", "extinfo.cgi without params show the process information" ); $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg REQUEST_METHOD=GET $remote_user QUERY_STRING='&type=1&host=host1' $extinfo_cgi`; like( $output, "/Schedule downtime for all services on this host/", "extinfo.cgi allows us to set downtime for a host and all of his services" ); nagios-4.3.4/t/623cmd-local.t000066400000000000000000002011561314764422400155340ustar00rootroot00000000000000#!/usr/bin/perl # # Local Checks for cmd.cgi use warnings; use strict; use Test::More qw(no_plan); use FindBin qw($Bin); chdir $Bin or die "Cannot chdir"; my $topdir = "$Bin/.."; my $cgi_dir = "$topdir/cgi"; my $local_cgi = "$cgi_dir/cmd.cgi"; my $output; my $cmd_typ = ''; my $remote_user = 'REMOTE_USER=nagiosadmin'; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET $local_cgi`; like( $output, "/

    Error: No command was specified

    /", "$local_cgi without params shows an error" ); # Run many tests against commands which are not supportet by cmd.cgi for (8, 18, 19, 31, 32, 53, 54, 69..77, 97, 98, 103..108, 115..120, 123..158, 161..169 ){ $cmd_typ=$_; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; unlike( $output, "/You are requesting to execute an unknown command. Shame on you!/", "$local_cgi with cmd_typ=$cmd_typ results in an error" ); } # Tests against command type '1' $cmd_typ=1; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to add a host comment/", "$local_cgi with cmd_typ=$cmd_typ shows host comment form" ); like( $output, "/Host Name:/", "$local_cgi with cmd_typ=$cmd_typ requires Host Name in form" ); like( $output, "/Author \\(Your Name\\):/", "$local_cgi with cmd_typ=$cmd_typ requires Author Name in form" ); like( $output, "/Comment:/", "$local_cgi with cmd_typ=$cmd_typ requires Comment in form" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '2' $cmd_typ=2; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to delete a host comment/", "$local_cgi with cmd_typ=$cmd_typ shows host comment form" ); like( $output, "/Comment ID:/", "$local_cgi with cmd_typ=$cmd_typ requires Comment ID field" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '3' $cmd_typ=3; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to add a service comment/", "$local_cgi with cmd_typ=$cmd_typ shows service comment form" ); like( $output, "/Host Name:/", "$local_cgi with cmd_typ=$cmd_typ requires Host Name in form" ); like( $output, "/Service:/", "$local_cgi with cmd_typ=$cmd_typ requires Service in form" ); like( $output, "/Author \\(Your Name\\):/", "$local_cgi with cmd_typ=$cmd_typ requires Author Name in form" ); like( $output, "/Comment:/", "$local_cgi with cmd_typ=$cmd_typ requires Comment in form" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '4' $cmd_typ=4; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to delete a service comment/", "$local_cgi with cmd_typ=$cmd_typ shows service comment delete form" ); like( $output, "/Comment ID:/", "$local_cgi with cmd_typ=$cmd_typ requires Comment ID field" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '5' $cmd_typ=5; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to enable active checks of a particular service/", "$local_cgi with cmd_typ=$cmd_typ shows enable active service checks form" ); like( $output, "/Host Name:/", "$local_cgi with cmd_typ=$cmd_typ requires Host Name in form" ); like( $output, "/Service:/", "$local_cgi with cmd_typ=$cmd_typ requires Service in form" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '6' $cmd_typ=6; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to disable active checks of a particular service/", "$local_cgi with cmd_typ=$cmd_typ shows disable active service checks form" ); like( $output, "/Host Name:/", "$local_cgi with cmd_typ=$cmd_typ requires Host Name in form" ); like( $output, "/Service:/", "$local_cgi with cmd_typ=$cmd_typ requires Service in form" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '7' $cmd_typ=7; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to schedule a service check/", "$local_cgi with cmd_typ=$cmd_typ shows request service check form" ); like( $output, "/Host Name:/", "$local_cgi with cmd_typ=$cmd_typ requires Host Name in form" ); like( $output, "/Service:/", "$local_cgi with cmd_typ=$cmd_typ requires Service in form" ); like( $output, "/Check Time:/", "$local_cgi with cmd_typ=$cmd_typ requires Check Time in form" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '9' $cmd_typ=9; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to delay a service notification/", "$local_cgi with cmd_typ=$cmd_typ shows request to delay service notification" ); like( $output, "/Host Name:/", "$local_cgi with cmd_typ=$cmd_typ requires Host Name in form" ); like( $output, "/Service:/", "$local_cgi with cmd_typ=$cmd_typ requires Service in form" ); like( $output, "/Notification Delay \\(minutes from now\\):/", "$local_cgi with cmd_typ=$cmd_typ requires Notification Delay form" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '10' $cmd_typ=10; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to delay a host notification/", "$local_cgi with cmd_typ=$cmd_typ shows request to delay host notification" ); like( $output, "/Host Name:/", "$local_cgi with cmd_typ=$cmd_typ requires Host Name in form" ); like( $output, "/Notification Delay \\(minutes from now\\):/", "$local_cgi with cmd_typ=$cmd_typ requires Notification Delay form" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '11' $cmd_typ=11; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to disable notification/", "$local_cgi with cmd_typ=$cmd_typ shows request to disable notification" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '12' $cmd_typ=12; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to enable notification/", "$local_cgi with cmd_typ=$cmd_typ shows request to enable notification" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '13' $cmd_typ=13; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to restart the Nagios process/", "$local_cgi with cmd_typ=$cmd_typ shows request to restart Nagios" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '14' $cmd_typ=14; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to shutdown the Nagios process/", "$local_cgi with cmd_typ=$cmd_typ shows request to shutdown Nagios" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '15' $cmd_typ=15; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to enable active checks of all services on a host/", "$local_cgi with cmd_typ=$cmd_typ shows request to enable active checks of all services on a host" ); like( $output, "/Host Name:/", "$local_cgi with cmd_typ=$cmd_typ requires Host Name in form" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '16' $cmd_typ=16; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to disable active checks of all services on a host/", "$local_cgi with cmd_typ=$cmd_typ shows request to disable active checks of all services on a host" ); like( $output, "/Host Name:/", "$local_cgi with cmd_typ=$cmd_typ requires Host Name in form" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '17' $cmd_typ=17; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to schedule a check of all services for a host/", "$local_cgi with cmd_typ=$cmd_typ shows request check all services on a host" ); like( $output, "/Host Name:/", "$local_cgi with cmd_typ=$cmd_typ requires Host Name in form" ); like( $output, "/Check Time:/", "$local_cgi with cmd_typ=$cmd_typ requires Check Time in form" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '20' $cmd_typ=20; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to delete all comments for a host/", "$local_cgi with cmd_typ=$cmd_typ shows request to delete all comments for a host" ); like( $output, "/Host Name:/", "$local_cgi with cmd_typ=$cmd_typ requires Host Name in form" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '21' $cmd_typ=21; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to delete all comments for a service/", "$local_cgi with cmd_typ=$cmd_typ shows request to delete all comments for a service" ); like( $output, "/Host Name:/", "$local_cgi with cmd_typ=$cmd_typ requires Host Name in form" ); like( $output, "/Service:/", "$local_cgi with cmd_typ=$cmd_typ requires Service in form" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '22' $cmd_typ=22; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to enable notifications for a service/", "$local_cgi with cmd_typ=$cmd_typ shows request to enable notifications for a service" ); like( $output, "/Host Name:/", "$local_cgi with cmd_typ=$cmd_typ requires Host Name in form" ); like( $output, "/Service:/", "$local_cgi with cmd_typ=$cmd_typ requires Service in form" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '23' $cmd_typ=23; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to disable notifications for a service/", "$local_cgi with cmd_typ=$cmd_typ shows request to disable notifications for a service" ); like( $output, "/Host Name:/", "$local_cgi with cmd_typ=$cmd_typ requires Host Name in form" ); like( $output, "/Service:/", "$local_cgi with cmd_typ=$cmd_typ requires Service in form" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '24' $cmd_typ=24; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to enable notifications for a host/", "$local_cgi with cmd_typ=$cmd_typ shows request to enable notifications for a host" ); like( $output, "/Host Name:/", "$local_cgi with cmd_typ=$cmd_typ requires Host Name in form" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '25' $cmd_typ=25; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to disable notifications for a host/", "$local_cgi with cmd_typ=$cmd_typ shows request to disable notifications for a host" ); like( $output, "/Host Name:/", "$local_cgi with cmd_typ=$cmd_typ requires Host Name in form" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '26' $cmd_typ=26; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to enable notifications for all hosts and services beyond a host/", "$local_cgi with cmd_typ=$cmd_typ shows request to enable notifications for all hosts and services beyond a host" ); like( $output, "/Host Name:/", "$local_cgi with cmd_typ=$cmd_typ requires Host Name in form" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '27' $cmd_typ=27; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to disable notifications for all hosts and services beyond a host/", "$local_cgi with cmd_typ=$cmd_typ shows request to disable notifications for all hosts and services beyond a host" ); like( $output, "/Host Name:/", "$local_cgi with cmd_typ=$cmd_typ requires Host Name in form" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '28' $cmd_typ=28; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to enable notifications for all services on a host/", "$local_cgi with cmd_typ=$cmd_typ shows request to enable notifications for all services on a host" ); like( $output, "/Host Name:/", "$local_cgi with cmd_typ=$cmd_typ requires Host Name in form" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '29' $cmd_typ=29; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to disable notifications for all services on a host/", "$local_cgi with cmd_typ=$cmd_typ shows request to disable notifications for all services on a host" ); like( $output, "/Host Name:/", "$local_cgi with cmd_typ=$cmd_typ requires Host Name in form" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '30' $cmd_typ=30; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to submit a passive check result for a particular service/", "$local_cgi with cmd_typ=$cmd_typ shows request to submit passive check result for a particular service" ); like( $output, "/Host Name:/", "$local_cgi with cmd_typ=$cmd_typ requires Host Name in form" ); like( $output, "/Service:/", "$local_cgi with cmd_typ=$cmd_typ requires Service in form" ); like( $output, "/Check Result:/", "$local_cgi with cmd_typ=$cmd_typ requires Check Result in form" ); like( $output, "/Check Output:/", "$local_cgi with cmd_typ=$cmd_typ requires Check Output in form" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '33' $cmd_typ=33; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to acknowledge a host problem/", "$local_cgi with cmd_typ=$cmd_typ shows request to acknowledge a host problem" ); like( $output, "/Host Name:/", "$local_cgi with cmd_typ=$cmd_typ requires Host Name in form" ); like( $output, "/Author \\(Your Name\\):/", "$local_cgi with cmd_typ=$cmd_typ requires Author in form" ); like( $output, "/Comment:/", "$local_cgi with cmd_typ=$cmd_typ requires Comment in form" ); like( $output, "/Sticky Acknowledgement:/", "$local_cgi with cmd_typ=$cmd_typ allows Sticky Acknowledge in form" ); like( $output, "/Send Notification:/", "$local_cgi with cmd_typ=$cmd_typ allows to send notification in form" ); like( $output, "/Persistent Comment:/", "$local_cgi with cmd_typ=$cmd_typ allows to set Persistent Comment in form" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '34' $cmd_typ=34; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to acknowledge a service problem/", "$local_cgi with cmd_typ=$cmd_typ shows request to acknowledge a service problem" ); like( $output, "/Host Name:/", "$local_cgi with cmd_typ=$cmd_typ requires Host Name in form" ); like( $output, "/Service:/", "$local_cgi with cmd_typ=$cmd_typ requires Service in form" ); like( $output, "/Author \\(Your Name\\):/", "$local_cgi with cmd_typ=$cmd_typ requires Author in form" ); like( $output, "/Comment:/", "$local_cgi with cmd_typ=$cmd_typ requires Comment in form" ); like( $output, "/Sticky Acknowledgement:/", "$local_cgi with cmd_typ=$cmd_typ allows Sticky Acknowledge in form" ); like( $output, "/Send Notification:/", "$local_cgi with cmd_typ=$cmd_typ allows to send notification in form" ); like( $output, "/Persistent Comment:/", "$local_cgi with cmd_typ=$cmd_typ allows to set Persistent Comment in form" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '35' $cmd_typ=35; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to start executing active service checks/", "$local_cgi with cmd_typ=$cmd_typ shows request to start executing system wide active service checks" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '36' $cmd_typ=36; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to stop executing active service checks/", "$local_cgi with cmd_typ=$cmd_typ shows request to stop executing system wide active service checks" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '37' $cmd_typ=37; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to start accepting passive service checks/", "$local_cgi with cmd_typ=$cmd_typ shows request to start accepting executing system wide passive service checks" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '38' $cmd_typ=38; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to stop accepting passive service checks/", "$local_cgi with cmd_typ=$cmd_typ shows request to stop accepting system wide passive service checks" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '39' $cmd_typ=39; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to start accepting passive service checks for a particular service/", "$local_cgi with cmd_typ=$cmd_typ shows request to start accepting passive service checks for a particular service" ); like( $output, "/Host Name:/", "$local_cgi with cmd_typ=$cmd_typ requires Host Name in form" ); like( $output, "/Service:/", "$local_cgi with cmd_typ=$cmd_typ requires Service in form" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '40' $cmd_typ=40; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to stop accepting passive service checks for a particular service/", "$local_cgi with cmd_typ=$cmd_typ shows request to stop accepting passive service checks for a particular service" ); like( $output, "/Host Name:/", "$local_cgi with cmd_typ=$cmd_typ requires Host Name in form" ); like( $output, "/Service:/", "$local_cgi with cmd_typ=$cmd_typ requires Service in form" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '41' $cmd_typ=41; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to enable event handlers/", "$local_cgi with cmd_typ=$cmd_typ shows request to enable system wide event handlers" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '42' $cmd_typ=42; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to disable event handlers/", "$local_cgi with cmd_typ=$cmd_typ shows request to disable system wide event handlers" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '43' $cmd_typ=43; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to enable the event handler for a particular host/", "$local_cgi with cmd_typ=$cmd_typ shows request to enable event handler of a particular host" ); like( $output, "/Host Name:/", "$local_cgi with cmd_typ=$cmd_typ requires Host Name in form" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '44' $cmd_typ=44; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to disable the event handler for a particular host/", "$local_cgi with cmd_typ=$cmd_typ shows request to disable event handler of a particular host" ); like( $output, "/Host Name:/", "$local_cgi with cmd_typ=$cmd_typ requires Host Name in form" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '45' $cmd_typ=45; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to enable the event handler for a particular service/", "$local_cgi with cmd_typ=$cmd_typ shows request to enable event handler of a particular service" ); like( $output, "/Host Name:/", "$local_cgi with cmd_typ=$cmd_typ requires Host Name in form" ); like( $output, "/Service:/", "$local_cgi with cmd_typ=$cmd_typ requires Service in form" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '46' $cmd_typ=46; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to disable the event handler for a particular service/", "$local_cgi with cmd_typ=$cmd_typ shows request to disable event handler of a particular service" ); like( $output, "/Host Name:/", "$local_cgi with cmd_typ=$cmd_typ requires Host Name in form" ); like( $output, "/Service:/", "$local_cgi with cmd_typ=$cmd_typ requires Service Name in form" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '47' $cmd_typ=47; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to enable active checks of a particular host/", "$local_cgi with cmd_typ=$cmd_typ shows request to enable active checks of a particular host" ); like( $output, "/Host Name:/", "$local_cgi with cmd_typ=$cmd_typ requires Host Name in form" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '48' $cmd_typ=48; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to disable active checks of a particular host/", "$local_cgi with cmd_typ=$cmd_typ shows request to disable active checks of a particular host" ); like( $output, "/Host Name:/", "$local_cgi with cmd_typ=$cmd_typ requires Host Name in form" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '49' $cmd_typ=49; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to start obsessing over service checks/", "$local_cgi with cmd_typ=$cmd_typ shows request to start obsessing over service checks" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '50' $cmd_typ=50; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to stop obsessing over service checks/", "$local_cgi with cmd_typ=$cmd_typ shows request to stop obsessing over service checks" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '51' $cmd_typ=51; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to remove a host acknowledgement/", "$local_cgi with cmd_typ=$cmd_typ shows request to remove a host acknowledgement" ); like( $output, "/Host Name:/", "$local_cgi with cmd_typ=$cmd_typ requires Host Name in form" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '52' $cmd_typ=52; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to remove a service acknowledgement/", "$local_cgi with cmd_typ=$cmd_typ shows request to remove a service acknowledgement" ); like( $output, "/Host Name:/", "$local_cgi with cmd_typ=$cmd_typ requires Host Name in form" ); like( $output, "/Service:/", "$local_cgi with cmd_typ=$cmd_typ requires Service in form" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '55' $cmd_typ=55; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to schedule downtime for a particular host/", "$local_cgi with cmd_typ=$cmd_typ shows request to schedule downtime for a particular Host" ); like( $output, "/Host Name:/", "$local_cgi with cmd_typ=$cmd_typ requires Host Name in form" ); like( $output, "/Author \\(Your Name\\):/", "$local_cgi with cmd_typ=$cmd_typ requires Author Name in form" ); like( $output, "/Comment:/", "$local_cgi with cmd_typ=$cmd_typ requires Comment in form" ); like( $output, "/Start Time:/", "$local_cgi with cmd_typ=$cmd_typ requires Start Time in form" ); like( $output, "/End Time:/", "$local_cgi with cmd_typ=$cmd_typ requires End Time in form" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '56' $cmd_typ=56; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to schedule downtime for a particular service/", "$local_cgi with cmd_typ=$cmd_typ shows request to schedule downtime for a particular Service" ); like( $output, "/Host Name:/", "$local_cgi with cmd_typ=$cmd_typ requires Host Name in form" ); like( $output, "/Service:/", "$local_cgi with cmd_typ=$cmd_typ requires Service in form" ); like( $output, "/Author \\(Your Name\\):/", "$local_cgi with cmd_typ=$cmd_typ requires Author Name in form" ); like( $output, "/Comment:/", "$local_cgi with cmd_typ=$cmd_typ requires Comment in form" ); like( $output, "/Start Time:/", "$local_cgi with cmd_typ=$cmd_typ requires Start Time in form" ); like( $output, "/End Time:/", "$local_cgi with cmd_typ=$cmd_typ requires End Time in form" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '57' $cmd_typ=57; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to enable flap detection for a particular host/", "$local_cgi with cmd_typ=$cmd_typ shows request to enable flap detection for a particular host" ); like( $output, "/Host Name:/", "$local_cgi with cmd_typ=$cmd_typ requires Host Name in form" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '58' $cmd_typ=58; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to disable flap detection for a particular host/", "$local_cgi with cmd_typ=$cmd_typ shows request to disable flap detection for a particular host" ); like( $output, "/Host Name:/", "$local_cgi with cmd_typ=$cmd_typ requires Host Name in form" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '59' $cmd_typ=59; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to enable flap detection for a particular service/", "$local_cgi with cmd_typ=$cmd_typ shows request to enable flap detection for a particular service" ); like( $output, "/Host Name:/", "$local_cgi with cmd_typ=$cmd_typ requires Host Name in form" ); like( $output, "/Service:/", "$local_cgi with cmd_typ=$cmd_typ requires Service in form" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '60' $cmd_typ=60; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to disable flap detection for a particular service/", "$local_cgi with cmd_typ=$cmd_typ shows request to disable flap detection for a particular service" ); like( $output, "/Host Name:/", "$local_cgi with cmd_typ=$cmd_typ requires Host Name in form" ); like( $output, "/Service:/", "$local_cgi with cmd_typ=$cmd_typ requires Service in form" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '61' $cmd_typ=61; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to enable flap detection for hosts and services/", "$local_cgi with cmd_typ=$cmd_typ shows request to enable flap detection for hosts and services" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '62' $cmd_typ=62; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to disable flap detection for hosts and services/", "$local_cgi with cmd_typ=$cmd_typ shows request to disable flap detection for hosts and services" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '63' $cmd_typ=63; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to enable notifications for all services in a particular hostgroup/", "$local_cgi with cmd_typ=$cmd_typ shows request to enable notifications for all services in a particular hostgroup" ); like( $output, "/Hostgroup Name:/", "$local_cgi with cmd_typ=$cmd_typ requires Hostgroup Name in form" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '64' $cmd_typ=64; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to disable notifications for all services in a particular hostgroup/", "$local_cgi with cmd_typ=$cmd_typ shows request to disable notifications for all services in a particular hostgroup" ); like( $output, "/Hostgroup Name:/", "$local_cgi with cmd_typ=$cmd_typ requires Hostgroup Name in form" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '65' $cmd_typ=65; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to enable notifications for all hosts in a particular hostgroup/", "$local_cgi with cmd_typ=$cmd_typ shows request to enable notifications for all hosts in a particular hostgroup" ); like( $output, "/Hostgroup Name:/", "$local_cgi with cmd_typ=$cmd_typ requires Hostgroup Name in form" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '66' $cmd_typ=66; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to disable notifications for all hosts in a particular hostgroup/", "$local_cgi with cmd_typ=$cmd_typ shows request to disable notifications for all hosts in a particular hostgroup" ); like( $output, "/Hostgroup Name:/", "$local_cgi with cmd_typ=$cmd_typ requires Hostgroup Name in form" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '67' $cmd_typ=67; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to enable active checks of all services in a particular hostgroup/", "$local_cgi with cmd_typ=$cmd_typ shows request to enable active checks of all services in a particular hostgroup" ); like( $output, "/Hostgroup Name:/", "$local_cgi with cmd_typ=$cmd_typ requires Hostgroup Name in form" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '68' $cmd_typ=68; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to disable active checks of all services in a particular hostgroup/", "$local_cgi with cmd_typ=$cmd_typ shows request to disable active checks of all services in a particular hostgroup" ); like( $output, "/Hostgroup Name:/", "$local_cgi with cmd_typ=$cmd_typ requires Hostgroup Name in form" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '78' $cmd_typ=78; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to cancel scheduled downtime for a particular host/", "$local_cgi with cmd_typ=$cmd_typ shows request to cancel scheduled downtime for a particular host" ); like( $output, "/Scheduled Downtime ID:/", "$local_cgi with cmd_typ=$cmd_typ requires Scheduled Downtime ID in form" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '79' $cmd_typ=79; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to cancel scheduled downtime for a particular service/", "$local_cgi with cmd_typ=$cmd_typ shows request to cancel scheduled downtime for a particular service" ); like( $output, "/Scheduled Downtime ID:/", "$local_cgi with cmd_typ=$cmd_typ requires Scheduled Downtime ID in form" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '82' $cmd_typ=82; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to enable performance data processing for hosts and services/", "$local_cgi with cmd_typ=$cmd_typ shows request to enable performance data processing for hosts and services" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '83' $cmd_typ=83; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to disable performance data processing for hosts and services/", "$local_cgi with cmd_typ=$cmd_typ shows request to disable performance data processing for hosts and services" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '84' $cmd_typ=84; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to schedule downtime for all hosts in a particular hostgroup/", "$local_cgi with cmd_typ=$cmd_typ shows request to schedule downtime for all hosts in a particular hostgroup" ); like( $output, "/Hostgroup Name:/", "$local_cgi with cmd_typ=$cmd_typ requires Hostgroup Name in form" ); like( $output, "/Author \\(Your Name\\):/", "$local_cgi with cmd_typ=$cmd_typ requires Author Name in form" ); like( $output, "/Comment:/", "$local_cgi with cmd_typ=$cmd_typ requires Comment in form" ); like( $output, "/Start Time:/", "$local_cgi with cmd_typ=$cmd_typ requires Start Time in form" ); like( $output, "/End Time:/", "$local_cgi with cmd_typ=$cmd_typ requires End Time in form" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '85' $cmd_typ=85; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to schedule downtime for all services in a particular hostgroup/", "$local_cgi with cmd_typ=$cmd_typ shows request to schedule downtime for all services in a particular hostgroup" ); like( $output, "/Hostgroup Name:/", "$local_cgi with cmd_typ=$cmd_typ requires Hostgroup Name in form" ); like( $output, "/Author \\(Your Name\\):/", "$local_cgi with cmd_typ=$cmd_typ requires Author Name in form" ); like( $output, "/Comment:/", "$local_cgi with cmd_typ=$cmd_typ requires Comment in form" ); like( $output, "/Start Time:/", "$local_cgi with cmd_typ=$cmd_typ requires Start Time in form" ); like( $output, "/End Time:/", "$local_cgi with cmd_typ=$cmd_typ requires End Time in form" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '86' $cmd_typ=86; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to schedule downtime for all services for a particular host/", "$local_cgi with cmd_typ=$cmd_typ shows request to schedule downtime for all services for a particular host" ); like( $output, "/Host Name:/", "$local_cgi with cmd_typ=$cmd_typ requires Host Name in form" ); like( $output, "/Author \\(Your Name\\):/", "$local_cgi with cmd_typ=$cmd_typ requires Author Name in form" ); like( $output, "/Comment:/", "$local_cgi with cmd_typ=$cmd_typ requires Comment in form" ); like( $output, "/Start Time:/", "$local_cgi with cmd_typ=$cmd_typ requires Start Time in form" ); like( $output, "/End Time:/", "$local_cgi with cmd_typ=$cmd_typ requires End Time in form" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '87' $cmd_typ=87; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to submit a passive check result for a particular host/", "$local_cgi with cmd_typ=$cmd_typ shows request to submit a passive check result for a particular host" ); like( $output, "/Host Name:/", "$local_cgi with cmd_typ=$cmd_typ requires Host Name in form" ); like( $output, "/Check Result:/", "$local_cgi with cmd_typ=$cmd_typ requires Check Result in form" ); like( $output, "/Check Output:/", "$local_cgi with cmd_typ=$cmd_typ requires Check Output in form" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '88' $cmd_typ=88; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to start executing host checks/", "$local_cgi with cmd_typ=$cmd_typ shows request to start executing host checks" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '89' $cmd_typ=89; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to stop executing host checks/", "$local_cgi with cmd_typ=$cmd_typ shows request to stop executing host checks" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '90' $cmd_typ=90; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to start accepting passive host checks/", "$local_cgi with cmd_typ=$cmd_typ shows request to start accepting passive host checks" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '91' $cmd_typ=91; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to stop accepting passive host checks/", "$local_cgi with cmd_typ=$cmd_typ shows request to stop accepting passive host checks" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '92' $cmd_typ=92; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to start accepting passive checks for a particular host/", "$local_cgi with cmd_typ=$cmd_typ shows request to start accepting passive checks for a particular host" ); like( $output, "/Host Name:/", "$local_cgi with cmd_typ=$cmd_typ requires Host Name in form" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '93' $cmd_typ=93; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to stop accepting passive checks for a particular host/", "$local_cgi with cmd_typ=$cmd_typ shows request to stop accepting passive checks for a particular host" ); like( $output, "/Host Name:/", "$local_cgi with cmd_typ=$cmd_typ requires Host Name in form" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '94' $cmd_typ=94; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to start obsessing over host checks/", "$local_cgi with cmd_typ=$cmd_typ shows request to start obsessing over host checks" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '95' $cmd_typ=95; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to stop obsessing over host checks/", "$local_cgi with cmd_typ=$cmd_typ shows request to stop obsessing over host checks" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '96' $cmd_typ=96; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to schedule a host check/", "$local_cgi with cmd_typ=$cmd_typ shows request to schedule a host check" ); like( $output, "/Host Name:/", "$local_cgi with cmd_typ=$cmd_typ requires Host Name in form" ); like( $output, "/Check Time:/", "$local_cgi with cmd_typ=$cmd_typ requires Check Time in form" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '99' $cmd_typ=99; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to start obsessing over a particular service/", "$local_cgi with cmd_typ=$cmd_typ shows request to start obsessing over a particular service" ); like( $output, "/Host Name:/", "$local_cgi with cmd_typ=$cmd_typ requires Host Name in form" ); like( $output, "/Service:/", "$local_cgi with cmd_typ=$cmd_typ requires Service in form" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '100' $cmd_typ=100; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to stop obsessing over a particular service/", "$local_cgi with cmd_typ=$cmd_typ shows request to stop obsessing over a particular service" ); like( $output, "/Host Name:/", "$local_cgi with cmd_typ=$cmd_typ requires Host Name in form" ); like( $output, "/Service:/", "$local_cgi with cmd_typ=$cmd_typ requires Service in form" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '101' $cmd_typ=101; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to start obsessing over a particular host/", "$local_cgi with cmd_typ=$cmd_typ shows request to start obsessing over a particular host" ); like( $output, "/Host Name:/", "$local_cgi with cmd_typ=$cmd_typ requires Host Name in form" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '102' $cmd_typ=102; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to stop obsessing over a particular host/", "$local_cgi with cmd_typ=$cmd_typ shows request to stop obsessing over a particular host" ); like( $output, "/Host Name:/", "$local_cgi with cmd_typ=$cmd_typ requires Host Name in form" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '109' $cmd_typ=109; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to enable notifications for all services in a particular servicegroup/", "$local_cgi with cmd_typ=$cmd_typ shows request to enable notifications for all services in a particular servicegroup" ); like( $output, "/Servicegroup Name:/", "$local_cgi with cmd_typ=$cmd_typ requires Servicegroup Name in form" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '110' $cmd_typ=110; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to disable notifications for all services in a particular servicegroup/", "$local_cgi with cmd_typ=$cmd_typ shows request to disable notifications for all services in a particular servicegroup" ); like( $output, "/Servicegroup Name:/", "$local_cgi with cmd_typ=$cmd_typ requires Servicegroup Name in form" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '111' $cmd_typ=111; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to enable notifications for all hosts in a particular servicegroup/", "$local_cgi with cmd_typ=$cmd_typ shows request to enable notifications for all hosts in a particular servicegroup" ); like( $output, "/Servicegroup Name:/", "$local_cgi with cmd_typ=$cmd_typ requires Servicegroup Name in form" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '112' $cmd_typ=112; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to disable notifications for all hosts in a particular servicegroup/", "$local_cgi with cmd_typ=$cmd_typ shows request to disable notifications for all hosts in a particular servicegroup" ); like( $output, "/Servicegroup Name:/", "$local_cgi with cmd_typ=$cmd_typ requires Servicegroup Name in form" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '113' $cmd_typ=113; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to enable active checks of all services in a particular servicegroup/", "$local_cgi with cmd_typ=$cmd_typ shows request to enable active checks of all services in a particular servicegroup" ); like( $output, "/Servicegroup Name:/", "$local_cgi with cmd_typ=$cmd_typ requires Servicegroup Name in form" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '114' $cmd_typ=114; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to disable active checks of all services in a particular servicegroup/", "$local_cgi with cmd_typ=$cmd_typ shows request to disable active checks of all services in a particular servicegroup" ); like( $output, "/Servicegroup Name:/", "$local_cgi with cmd_typ=$cmd_typ requires Servicegroup Name in form" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '121' $cmd_typ=121; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to schedule downtime for all hosts in a particular servicegroup/", "$local_cgi with cmd_typ=$cmd_typ shows request to schedule downtime for all hosts in a particular servicegroup" ); like( $output, "/Servicegroup Name:/", "$local_cgi with cmd_typ=$cmd_typ requires Servicegroup Name in form" ); like( $output, "/Start Time:/", "$local_cgi with cmd_typ=$cmd_typ requires Start Time in form" ); like( $output, "/End Time:/", "$local_cgi with cmd_typ=$cmd_typ requires End Time in form" ); like( $output, "/Author \\(Your Name\\):/", "$local_cgi with cmd_typ=$cmd_typ requires Author Name in form" ); like( $output, "/Comment:/", "$local_cgi with cmd_typ=$cmd_typ requires Comment in form" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '122' $cmd_typ=122; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to schedule downtime for all services in a particular servicegroup/", "$local_cgi with cmd_typ=$cmd_typ shows request to schedule downtime for all services in a particular servicegroup" ); like( $output, "/Servicegroup Name:/", "$local_cgi with cmd_typ=$cmd_typ requires Servicegroup Name in form" ); like( $output, "/Start Time:/", "$local_cgi with cmd_typ=$cmd_typ requires Start Time in form" ); like( $output, "/End Time:/", "$local_cgi with cmd_typ=$cmd_typ requires End Time in form" ); like( $output, "/Author \\(Your Name\\):/", "$local_cgi with cmd_typ=$cmd_typ requires Author Name in form" ); like( $output, "/Comment:/", "$local_cgi with cmd_typ=$cmd_typ requires Comment in form" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '159' $cmd_typ=159; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to send a custom host notification/", "$local_cgi with cmd_typ=$cmd_typ shows request to send a custom host notification" ); like( $output, "/Host Name:/", "$local_cgi with cmd_typ=$cmd_typ requires Host Name in form" ); like( $output, "/Author \\(Your Name\\):/", "$local_cgi with cmd_typ=$cmd_typ requires Author Name in form" ); like( $output, "/Comment:/", "$local_cgi with cmd_typ=$cmd_typ requires Comment in form" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); # Tests against command type '160' $cmd_typ=160; $output = `NAGIOS_CGI_CONFIG=etc/cgi.cfg $remote_user REQUEST_METHOD=GET QUERY_STRING='cmd_typ=$cmd_typ' $local_cgi`; like( $output, "/You are requesting to send a custom service notification/", "$local_cgi with cmd_typ=$cmd_typ shows request to send a custom service notification" ); like( $output, "/Host Name:/", "$local_cgi with cmd_typ=$cmd_typ requires Host Name in form" ); like( $output, "/Service:/", "$local_cgi with cmd_typ=$cmd_typ requires Service in form" ); like( $output, "/Author \\(Your Name\\):/", "$local_cgi with cmd_typ=$cmd_typ requires Author Name in form" ); like( $output, "/Comment:/", "$local_cgi with cmd_typ=$cmd_typ requires Comment in form" ); unlike( $output, "/Sorry, but no information is available for this command./", "$local_cgi with cmd_typ=$cmd_typ has a command description" ); nagios-4.3.4/t/660status-downtimes-comments.t000066400000000000000000000037011314764422400210530ustar00rootroot00000000000000#!/usr/bin/perl # # Checks for status.cgi, with large number of comments and downtimes use warnings; use strict; use Test::More; use FindBin qw($Bin); chdir $Bin or die "Cannot chdir"; my $topdir = "$Bin/.."; my $cgi_dir = "$topdir/cgi"; my $status_cgi = "$cgi_dir/status.cgi"; my $extinfo_cgi = "$cgi_dir/extinfo.cgi"; my $status_dat = "$Bin/var/status.dat"; my $generated = "$Bin/var/status-generated.dat"; my $generator = "$Bin/bin/generate_downtimes"; my $output; my $expected; my $iteration = 1; my $iterations_max = shift @ARGV || 5; my $copies; plan tests => 3 * $iterations_max; while($iteration <= $iterations_max) { $copies = (10)**($iteration); is( system("cat $status_dat > $generated"), 0, "New status.dat file" ); is( system("$generator $copies >> $generated"), 0, "Generated $copies downtimes"); my $num_comments = $copies + 1; my $start = time; $output = `NAGIOS_CGI_CONFIG=etc/cgi-with-generated-status.cfg REQUEST_METHOD=GET REMOTE_USER=nagiosadmin QUERY_STRING="host=host1" $status_cgi`; my $duration = time-$start; like( $output, "/This service has $num_comments comments associated with it/", "Found $num_comments comments in HTML output from status.dat. Took $duration seconds" ); # This test is invalid - the comments displayed are in the order they are read # As the test status.dat generator is in a random order, the output will also be in the same # random order # Check that the comments ids are sorted #$output = `NAGIOS_CGI_CONFIG=etc/cgi-with-generated-status.cfg REQUEST_METHOD=GET REMOTE_USER=nagiosadmin QUERY_STRING="type=2&host=host1&service=Dummy+service" $extinfo_cgi`; #check_decrementing_comment_ids(); $iteration++; } sub check_decrementing_comment_ids { my $last_id; my @ids = $output =~ m/
    /g; while ($_ = shift @ids) { unless (defined $last_id && $last_id > $_) { fail("Comment ids out of order"); return; } $last_id = $_; } ok( "All ids in order" ); } nagios-4.3.4/t/705nagiostats.t000066400000000000000000000025071314764422400160550ustar00rootroot00000000000000#!/usr/bin/perl # # Checks nagiostats use warnings; use strict; use Test::More; use FindBin qw($Bin); chdir $Bin or die "Cannot chdir"; my $topdir = "$Bin/.."; my $nagiostats = "$topdir/base/nagiostats"; my $etc = "$Bin/etc"; my $var = "$Bin/var"; plan tests => 10; my $output = `$nagiostats -c "$etc/nagios-does-not-exist.cfg"`; isnt( $?, 0, "Bad return code with no config file" ); like( $output, "/Error processing config file/", "No config file" ); $output = `$nagiostats -c "$etc/nagios-no-status.cfg"`; isnt( $?, 0, "Bad return code with no status file" ); like( $output, "/Error reading status file '.*var/status.dat.no.such.file': No such file or directory/", "No config file" ); $output = `$nagiostats -c "$etc/nagios-no-status.cfg" -m -d NUMHSTUP`; isnt( $?, 0, "Bad return code with no status file in MRTG mode" ); like( $output, "/^0\$/", "No UP host when no status file" ); $output = `$nagiostats -c "$etc/nagios-with-generated-status.cfg" -m -d NUMHOSTS`; is( $?, 0, "Bad return code with implied status file in MRTG mode" ); unlike( $output, "/^0\$/", "Implied generated status file contains host(s)" ); $output = `$nagiostats -s "$var/status-generated.dat" -m -d NUMHOSTS`; is( $?, 0, "Bad return code with explicit status file in MRTG mode" ); unlike( $output, "/^0\$/", "Explicit generated status file contains host(s)" ); nagios-4.3.4/t/900-configparsing.t000066400000000000000000000020101314764422400165710ustar00rootroot00000000000000#!/usr/bin/perl # # Taking a known nagios configuration directory, will check that the objects.cache is as expected use warnings; use strict; use Test::More; use FindBin qw($Bin); chdir $Bin or die "Cannot chdir"; my $topdir = "$Bin/.."; my $nagios = "$topdir/base/nagios"; my $etc = "$Bin/etc"; my $precache = "$Bin/var/objects.precache"; plan tests => 2; my $output = `$nagios -v "$etc/nagios.cfg"`; if ($? == 0) { pass("Nagios validated test configuration successfully"); } else { fail("Nagios validation failed:\n$output"); } system("$nagios -vp '$etc/nagios.cfg' > /dev/null") == 0 or die "Cannot create precached objects file"; system("grep -v 'Created:' $precache > '$precache.generated'"); my $diff = "diff -u $precache.expected $precache.generated"; my @output = `$diff`; if ($? == 0) { pass( "Nagios precached objects file matches expected" ); } else { fail( "Nagios precached objects discrepancy!!!\nTest with: $diff\nCopy with: cp $precache.generated $precache.expected" ); print "#$_" foreach @output; } nagios-4.3.4/t/910-noservice.t000066400000000000000000000007201314764422400157440ustar00rootroot00000000000000#!/usr/bin/perl # # Check that no service gives the correct message use warnings; use strict; use Test::More; use FindBin qw($Bin); chdir $Bin or die "Cannot chdir"; my $topdir = "$Bin/.."; my $nagios = "$topdir/base/nagios"; my $etc = "$Bin/etc"; my $precache = "$Bin/var/objects.precache"; plan tests => 1; my $output = `$nagios -v "$etc/nagios-no-service.cfg"`; like( $output, "/Error: There are no services defined!/", "Correct error for no services" ); nagios-4.3.4/t/920-nocontactgroup.t000066400000000000000000000010371314764422400170170ustar00rootroot00000000000000#!/usr/bin/perl # # Check that no contactgroup gives the correct message use warnings; use strict; use Test::More qw(no_plan); use FindBin qw($Bin); chdir $Bin or die "Cannot chdir"; my $topdir = "$Bin/.."; my $nagios = "$topdir/base/nagios"; my $etc = "$Bin/etc"; my $precache = "$Bin/var/objects.precache"; my $output = `$nagios -v "$etc/nagios-no-contactgroup.cfg"`; like( $output, "/Error: Could not find any contactgroup matching 'nonexistentone'/", "Correct error for no contactgroup" ); isnt($?, 0, "And get return code error" ); nagios-4.3.4/t/930-emptygroups.t000066400000000000000000000011741314764422400163530ustar00rootroot00000000000000#!/usr/bin/perl # # Check that empty host/service groups pass verification. # Likely error on non-patched version: # "Error: Host 'r' specified in host group 'generic-pc' is not defined anywhere!" use warnings; use strict; use Test::More; use FindBin qw($Bin); chdir $Bin or die "Cannot chdir"; my $topdir = "$Bin/.."; my $nagios = "$topdir/base/nagios"; my $etc = "$Bin/etc"; plan tests => 1; my @output = `$nagios -v "$etc/nagios-empty-groups.cfg"`; if ($? == 0) { pass("Nagios validated empty host/service-group successfully"); } else { @output = grep(/^Error: .+$/g, @output); fail("Nagios validation failed:\n@output"); } nagios-4.3.4/t/Makefile.in000066400000000000000000000001251314764422400153170ustar00rootroot00000000000000# Makefile for Nagios tests using perl all: test: prove *.t clean: distclean: nagios-4.3.4/t/bin/000077500000000000000000000000001314764422400140245ustar00rootroot00000000000000nagios-4.3.4/t/bin/generate_downtimes000077500000000000000000000035171314764422400176430ustar00rootroot00000000000000#!/usr/bin/perl # Prints to stdout lots of host and service downtimes use warnings; use strict; my $max_iterations = shift @ARGV || 1000; my $hostname = "host1"; my $servicename = "Dummy service"; my $servicecomment_id_start=1024; my $servicecomment_ids = {}; my $downtime_id = 2596; my $starttime = 1920000000; my $downtime_template = <{ $id }; $servicecomment_ids->{ $id } = 1; return $id; } nagios-4.3.4/t/etc/000077500000000000000000000000001314764422400140275ustar00rootroot00000000000000nagios-4.3.4/t/etc/cgi-hosturgencies.cfg000066400000000000000000000013101314764422400201250ustar00rootroot00000000000000main_config_file=etc/nagios-hosturgencies.cfg physical_html_path=/usr/local/nagios/share url_html_path=/nagios show_context_help=0 use_pending_states=1 use_authentication=1 use_ssl_authentication=0 authorized_for_system_information=nagiosadmin authorized_for_configuration_information=nagiosadmin authorized_for_system_commands=nagiosadmin authorized_for_all_services=nagiosadmin authorized_for_all_hosts=nagiosadmin authorized_for_all_service_commands=nagiosadmin authorized_for_all_host_commands=nagiosadmin default_statusmap_layout=5 default_statuswrl_layout=4 ping_syntax=echo -n -U -c 5 $HOSTADDRESS$ refresh_rate=90 escape_html_tags=1 action_url_target=_blank notes_url_target=_blank lock_author_names=1 nagios-4.3.4/t/etc/cgi-with-generated-status.cfg000066400000000000000000000013201314764422400214740ustar00rootroot00000000000000main_config_file=etc/nagios-with-generated-status.cfg physical_html_path=/usr/local/nagios/share url_html_path=/nagios show_context_help=0 use_pending_states=1 use_authentication=1 use_ssl_authentication=0 authorized_for_system_information=nagiosadmin authorized_for_configuration_information=nagiosadmin authorized_for_system_commands=nagiosadmin authorized_for_all_services=nagiosadmin authorized_for_all_hosts=nagiosadmin authorized_for_all_service_commands=nagiosadmin authorized_for_all_host_commands=nagiosadmin default_statusmap_layout=5 default_statuswrl_layout=4 ping_syntax=echo -n -U -c 5 $HOSTADDRESS$ refresh_rate=90 escape_html_tags=1 action_url_target=_blank notes_url_target=_blank lock_author_names=1 nagios-4.3.4/t/etc/cgi.cfg000066400000000000000000000012721314764422400152540ustar00rootroot00000000000000main_config_file=etc/nagios.cfg physical_html_path=/usr/local/nagios/share url_html_path=/nagios show_context_help=0 use_pending_states=1 use_authentication=1 use_ssl_authentication=0 authorized_for_system_information=nagiosadmin authorized_for_configuration_information=nagiosadmin authorized_for_system_commands=nagiosadmin authorized_for_all_services=nagiosadmin authorized_for_all_hosts=nagiosadmin authorized_for_all_service_commands=nagiosadmin authorized_for_all_host_commands=nagiosadmin default_statusmap_layout=5 default_statuswrl_layout=4 ping_syntax=echo -n -U -c 5 $HOSTADDRESS$ refresh_rate=90 escape_html_tags=1 action_url_target=_blank notes_url_target=_blank lock_author_names=1 nagios-4.3.4/t/etc/empty-groups-error.cfg000066400000000000000000000016451314764422400203200ustar00rootroot00000000000000define command{ command_name dummy command_line /bin/true } define timeperiod{ timeperiod_name never alias Never } define contact{ contact_name dude host_notification_period never host_notification_commands dummy service_notification_period never service_notification_commands dummy } define host{ host_name fake alias Fake address 127.0.0.1 check_command dummy check_period never max_check_attempts 5 contacts dude } define service{ name dummy-service service_description Dummy Service check_command dummy check_period never max_check_attempts 5 notification_period never contacts dude host_name fake } define hostgroup{ hostgroup_name generic-pc alias Generic PCs } define host{ name generic-host hostgroups generic-pc check_command dummy check_period never max_check_attempts 5 contacts dude register 0 } nagios-4.3.4/t/etc/hosturgencies.cfg000066400000000000000000000017651314764422400174030ustar00rootroot00000000000000define host { host_name host1 alias host1 test address 192.168.1.1 max_check_attempts 2 check_period none contacts nagiosadmin notification_interval 60 notification_period none } define host { host_name host2 alias host2 test address 192.168.2.2 max_check_attempts 2 check_period none contacts nagiosadmin notification_interval 60 notification_period none } define host { host_name host3 alias host3 test address 192.168.3.3 max_check_attempts 2 check_period none contacts nagiosadmin notification_interval 60 notification_period none } define host { host_name host4 alias host4 test address 192.168.4.4 max_check_attempts 2 check_period none contacts nagiosadmin notification_interval 60 notification_period none } define service { host_name host1,host2,host3,host4 service_description Dummy service check_command check_me max_check_attempts 3 check_interval 32 retry_interval 1 check_period none notification_interval 60 notification_period none contacts nagiosadmin } nagios-4.3.4/t/etc/minimal.cfg000066400000000000000000000100521314764422400161340ustar00rootroot00000000000000define host { host_name host1 alias host1 test address 192.168.1.1 max_check_attempts 2 check_period none contacts nagiosadmin notification_interval 60 notification_period none } define host { host_name host2 alias host2 test address 192.168.2.2 max_check_attempts 2 check_period none contacts nagiosadmin notification_interval 60 notification_period none } define host { host_name host3 alias host3 test address 192.168.2.3 max_check_attempts 2 check_period none contacts nagiosadmin notification_interval 60 notification_period none hostgroups +hosts-with-master-service } define hostgroup { hostgroup_name hosts-with-master-service alias Hosts running a master service } define service { host_name host1 service_description Dummy service check_command check_me max_check_attempts 3 check_interval 32 retry_interval 1 check_period none notification_interval 60 notification_period none contacts nagiosadmin } define service { host_name host1,host2 service_description Uses important check command check_command check_me!with some parameters max_check_attempts 5 check_interval 15 retry_interval 1 check_period none notification_interval 65 notification_period none contacts nagiosadmin use service-distributed } define service { name service-distributed check_command !set_to_stale register 0 } define service { hostgroup_name hosts-with-master-service service_description master-service check_command check_me!master service max_check_attempts 5 check_interval 15 retry_interval 1 check_period none notification_interval 65 notification_period none contacts nagiosadmin } define service { host_name host3 service_description dependent-service check_command check_me!dependent service max_check_attempts 5 check_interval 15 retry_interval 1 check_period none notification_interval 65 notification_period none contacts nagiosadmin servicegroups +services-depending-on-master-service } define servicegroup { servicegroup_name services-depending-on-master-service alias Servicegroup for services depending on a "master" service on the same host } define command { command_name set_to_stale command_line /usr/local/nagios/libexec/set_to_stale } define command { command_name check_me command_line /usr/local/nagios/libexec/check_me } define command { command_name with_continuation_lines command_line $USER1$/check_foo one\ two } define command { command_name multiple_continuation_lines_with_spaces_intermingled command_line \ check_nrpe_arg!30!\ check_fs_ping!/mnt/account-p,/mnt/prepro-p,/mnt/webapp-ssl,/mnt/rollout-p } define timeperiod { timeperiod_name none alias Nothing } define contact { contact_name nagiosadmin host_notifications_enabled 0 service_notifications_enabled 0 host_notification_period none service_notification_period none host_notification_options d,u,f,r,s service_notification_options w,u,c,r,f,s host_notification_commands notify-none service_notification_commands notify-none } define command { command_name notify-none command_line /usr/local/nagios/notifications/notify-none } define contact { contact_name second host_notifications_enabled 0 service_notifications_enabled 0 host_notification_period none service_notification_period none host_notification_options d,u,f,r,s service_notification_options w,u,c,r,f,s host_notification_commands notify-none service_notification_commands notify-none } define contactgroup { contactgroup_name causetestfailure alias This causes a test failure by having a comma separated list before the empty contactgroup members nagiosadmin,second } define contactgroup { contactgroup_name empty alias No members defined - this should pass validation } define serviceescalation { host_name * service_description *,!Dummy service } define servicedependency { service_description master-service dependent_servicegroup_name services-depending-on-master-service execution_failure_criteria n notification_failure_criteria c,u } nagios-4.3.4/t/etc/nagios-empty-groups.cfg000066400000000000000000000053651314764422400204520ustar00rootroot00000000000000log_file=../var/nagios.log cfg_file=empty-groups-error.cfg object_cache_file=../var/objects.cache precached_object_file=../var/objects.precache resource_file=resource.cfg status_file=../var/status.dat status_update_interval=10 nagios_user=nagios nagios_group=nagios check_external_commands=1 command_file=../var/rw/nagios.cmd lock_file=../var/nagios.lock temp_file=../var/nagios.tmp temp_path=/tmp event_broker_options=-1 log_rotation_method=d log_archive_path=var/archives use_syslog=1 log_notifications=1 log_service_retries=1 log_host_retries=1 log_event_handlers=1 log_initial_states=0 log_external_commands=1 log_passive_checks=1 service_inter_check_delay_method=s max_service_check_spread=30 service_interleave_factor=s host_inter_check_delay_method=s max_host_check_spread=30 max_concurrent_checks=0 check_result_reaper_frequency=10 max_check_result_reaper_time=30 check_result_path=/tmp max_check_result_file_age=3600 cached_host_check_horizon=15 cached_service_check_horizon=15 enable_predictive_host_dependency_checks=1 enable_predictive_service_dependency_checks=1 soft_state_dependencies=0 auto_reschedule_checks=0 auto_rescheduling_interval=30 auto_rescheduling_window=180 service_check_timeout=60 host_check_timeout=30 event_handler_timeout=30 notification_timeout=30 ocsp_timeout=5 perfdata_timeout=5 retain_state_information=1 state_retention_file=var/retention.dat retention_update_interval=60 use_retained_program_state=1 use_retained_scheduling_info=1 retained_host_attribute_mask=0 retained_service_attribute_mask=0 retained_process_host_attribute_mask=0 retained_process_service_attribute_mask=0 retained_contact_host_attribute_mask=0 retained_contact_service_attribute_mask=0 interval_length=60 check_for_updates=1 bare_update_check=0 use_aggressive_host_checking=0 execute_service_checks=1 accept_passive_service_checks=1 execute_host_checks=1 accept_passive_host_checks=1 enable_notifications=1 enable_event_handlers=1 process_performance_data=0 obsess_over_services=0 obsess_over_hosts=0 translate_passive_host_checks=0 passive_host_checks_are_soft=0 check_for_orphaned_services=1 check_for_orphaned_hosts=1 check_service_freshness=1 service_freshness_check_interval=60 check_host_freshness=0 host_freshness_check_interval=60 additional_freshness_latency=15 enable_flap_detection=1 low_service_flap_threshold=5.0 high_service_flap_threshold=20.0 low_host_flap_threshold=5.0 high_host_flap_threshold=20.0 date_format=us illegal_object_name_chars=`~!$%^&*|'"<>?,()= illegal_macro_output_chars=`~$&|'"<> use_regexp_matching=0 use_true_regexp_matching=0 admin_email=nagios@localhost admin_pager=pagenagios@localhost daemon_dumps_core=0 use_large_installation_tweaks=0 enable_environment_macros=1 debug_level=0 debug_verbosity=1 debug_file=var/nagios.debug max_debug_file_size=1000000 nagios-4.3.4/t/etc/nagios-hosturgencies.cfg000066400000000000000000000054351314764422400206570ustar00rootroot00000000000000log_file=../var/nagios.log cfg_file=hosturgencies.cfg object_cache_file=../var/objects.cache.hosturgencies precached_object_file=../var/objects.precache.hosturgencies resource_file=resource.cfg status_file=../var/status-hosturgencies.dat status_update_interval=10 nagios_user=nagios nagios_group=nagios check_external_commands=1 command_file=../var/rw/nagios.cmd lock_file=../var/nagios.lock temp_file=../var/nagios.tmp temp_path=/tmp event_broker_options=-1 log_rotation_method=d log_archive_path=var/archives use_syslog=1 log_notifications=1 log_service_retries=1 log_host_retries=1 log_event_handlers=1 log_initial_states=0 log_external_commands=1 log_passive_checks=1 service_inter_check_delay_method=s max_service_check_spread=30 service_interleave_factor=s host_inter_check_delay_method=s max_host_check_spread=30 max_concurrent_checks=0 check_result_reaper_frequency=10 max_check_result_reaper_time=30 check_result_path=/tmp max_check_result_file_age=3600 cached_host_check_horizon=15 cached_service_check_horizon=15 enable_predictive_host_dependency_checks=1 enable_predictive_service_dependency_checks=1 soft_state_dependencies=0 auto_reschedule_checks=0 auto_rescheduling_interval=30 auto_rescheduling_window=180 service_check_timeout=60 host_check_timeout=30 event_handler_timeout=30 notification_timeout=30 ocsp_timeout=5 perfdata_timeout=5 retain_state_information=1 state_retention_file=../var/retention.dat retention_update_interval=60 use_retained_program_state=1 use_retained_scheduling_info=1 retained_host_attribute_mask=0 retained_service_attribute_mask=0 retained_process_host_attribute_mask=0 retained_process_service_attribute_mask=0 retained_contact_host_attribute_mask=0 retained_contact_service_attribute_mask=0 interval_length=60 check_for_updates=1 bare_update_check=0 use_aggressive_host_checking=0 execute_service_checks=1 accept_passive_service_checks=1 execute_host_checks=1 accept_passive_host_checks=1 enable_notifications=1 enable_event_handlers=1 process_performance_data=0 obsess_over_services=0 obsess_over_hosts=0 translate_passive_host_checks=0 passive_host_checks_are_soft=0 check_for_orphaned_services=1 check_for_orphaned_hosts=1 check_service_freshness=1 service_freshness_check_interval=60 check_host_freshness=0 host_freshness_check_interval=60 additional_freshness_latency=15 enable_flap_detection=1 low_service_flap_threshold=5.0 high_service_flap_threshold=20.0 low_host_flap_threshold=5.0 high_host_flap_threshold=20.0 date_format=us illegal_object_name_chars=`~!$%^&*|'"<>?,()= illegal_macro_output_chars=`~$&|'"<> use_regexp_matching=0 use_true_regexp_matching=0 admin_email=nagios@localhost admin_pager=pagenagios@localhost daemon_dumps_core=0 use_large_installation_tweaks=0 enable_environment_macros=1 debug_level=0 debug_verbosity=1 debug_file=var/nagios.debug max_debug_file_size=1000000 nagios-4.3.4/t/etc/nagios-no-contactgroup.cfg000066400000000000000000000055311314764422400211140ustar00rootroot00000000000000log_file=/tmp/nagios.log cfg_file=no-contactgroup-error.cfg object_cache_file=../var/objects.cache precached_object_file=../var/objects.precache resource_file=resource.cfg status_file=../var/status.dat status_update_interval=10 nagios_user=nagios nagios_group=nagios check_external_commands=1 command_file=/usr/local/nagios/var/rw/nagios.cmd lock_file=/usr/local/nagios/var/nagios.lock temp_file=/usr/local/nagios/var/nagios.tmp temp_path=/tmp event_broker_options=-1 log_rotation_method=d log_archive_path=/usr/local/nagios/var/archives use_syslog=1 log_notifications=1 log_service_retries=1 log_host_retries=1 log_event_handlers=1 log_initial_states=0 log_external_commands=1 log_passive_checks=1 service_inter_check_delay_method=s max_service_check_spread=30 service_interleave_factor=s host_inter_check_delay_method=s max_host_check_spread=30 max_concurrent_checks=0 check_result_reaper_frequency=10 max_check_result_reaper_time=30 check_result_path=/tmp max_check_result_file_age=3600 cached_host_check_horizon=15 cached_service_check_horizon=15 enable_predictive_host_dependency_checks=1 enable_predictive_service_dependency_checks=1 soft_state_dependencies=0 auto_reschedule_checks=0 auto_rescheduling_interval=30 auto_rescheduling_window=180 service_check_timeout=60 host_check_timeout=30 event_handler_timeout=30 notification_timeout=30 ocsp_timeout=5 perfdata_timeout=5 retain_state_information=1 state_retention_file=/usr/local/nagios/var/retention.dat retention_update_interval=60 use_retained_program_state=1 use_retained_scheduling_info=1 retained_host_attribute_mask=0 retained_service_attribute_mask=0 retained_process_host_attribute_mask=0 retained_process_service_attribute_mask=0 retained_contact_host_attribute_mask=0 retained_contact_service_attribute_mask=0 interval_length=60 check_for_updates=1 bare_update_check=0 use_aggressive_host_checking=0 execute_service_checks=1 accept_passive_service_checks=1 execute_host_checks=1 accept_passive_host_checks=1 enable_notifications=1 enable_event_handlers=1 process_performance_data=0 obsess_over_services=0 obsess_over_hosts=0 translate_passive_host_checks=0 passive_host_checks_are_soft=0 check_for_orphaned_services=1 check_for_orphaned_hosts=1 check_service_freshness=1 service_freshness_check_interval=60 check_host_freshness=0 host_freshness_check_interval=60 additional_freshness_latency=15 enable_flap_detection=1 low_service_flap_threshold=5.0 high_service_flap_threshold=20.0 low_host_flap_threshold=5.0 high_host_flap_threshold=20.0 date_format=us illegal_object_name_chars=`~!$%^&*|'"<>?,()= illegal_macro_output_chars=`~$&|'"<> use_regexp_matching=0 use_true_regexp_matching=0 admin_email=nagios@localhost admin_pager=pagenagios@localhost daemon_dumps_core=0 use_large_installation_tweaks=0 enable_environment_macros=1 debug_level=0 debug_verbosity=1 debug_file=/usr/local/nagios/var/nagios.debug max_debug_file_size=1000000 nagios-4.3.4/t/etc/nagios-no-service.cfg000066400000000000000000000054131314764422400200430ustar00rootroot00000000000000log_file=../var/nagios.log cfg_file=no-service-error.cfg object_cache_file=../var/objects.cache precached_object_file=../var/objects.precache resource_file=resource.cfg status_file=../var/status.dat status_update_interval=10 nagios_user=nagios nagios_group=nagios check_external_commands=1 command_file=../var/rw/nagios.cmd lock_file=../var/nagios.lock temp_file=../var/nagios.tmp temp_path=/tmp event_broker_options=-1 log_rotation_method=d log_archive_path=../var/archives use_syslog=1 log_notifications=1 log_service_retries=1 log_host_retries=1 log_event_handlers=1 log_initial_states=0 log_external_commands=1 log_passive_checks=1 service_inter_check_delay_method=s max_service_check_spread=30 service_interleave_factor=s host_inter_check_delay_method=s max_host_check_spread=30 max_concurrent_checks=0 check_result_reaper_frequency=10 max_check_result_reaper_time=30 check_result_path=/tmp max_check_result_file_age=3600 cached_host_check_horizon=15 cached_service_check_horizon=15 enable_predictive_host_dependency_checks=1 enable_predictive_service_dependency_checks=1 soft_state_dependencies=0 auto_reschedule_checks=0 auto_rescheduling_interval=30 auto_rescheduling_window=180 service_check_timeout=60 host_check_timeout=30 event_handler_timeout=30 notification_timeout=30 ocsp_timeout=5 perfdata_timeout=5 retain_state_information=1 state_retention_file=../var/retention.dat retention_update_interval=60 use_retained_program_state=1 use_retained_scheduling_info=1 retained_host_attribute_mask=0 retained_service_attribute_mask=0 retained_process_host_attribute_mask=0 retained_process_service_attribute_mask=0 retained_contact_host_attribute_mask=0 retained_contact_service_attribute_mask=0 interval_length=60 check_for_updates=1 bare_update_check=0 use_aggressive_host_checking=0 execute_service_checks=1 accept_passive_service_checks=1 execute_host_checks=1 accept_passive_host_checks=1 enable_notifications=1 enable_event_handlers=1 process_performance_data=0 obsess_over_services=0 obsess_over_hosts=0 translate_passive_host_checks=0 passive_host_checks_are_soft=0 check_for_orphaned_services=1 check_for_orphaned_hosts=1 check_service_freshness=1 service_freshness_check_interval=60 check_host_freshness=0 host_freshness_check_interval=60 additional_freshness_latency=15 enable_flap_detection=1 low_service_flap_threshold=5.0 high_service_flap_threshold=20.0 low_host_flap_threshold=5.0 high_host_flap_threshold=20.0 date_format=us illegal_object_name_chars=`~!$%^&*|'"<>?,()= illegal_macro_output_chars=`~$&|'"<> use_regexp_matching=0 use_true_regexp_matching=0 admin_email=nagios@localhost admin_pager=pagenagios@localhost daemon_dumps_core=0 use_large_installation_tweaks=0 enable_environment_macros=1 debug_level=0 debug_verbosity=1 debug_file=/usr/local/nagios/var/nagios.debug max_debug_file_size=1000000 nagios-4.3.4/t/etc/nagios-no-status.cfg000066400000000000000000000053671314764422400177360ustar00rootroot00000000000000log_file=../var/nagios.log cfg_file=minimal.cfg object_cache_file=../var/objects.cache precached_object_file=../var/objects.precache resource_file=resource.cfg status_file=../var/status.dat.no.such.file status_update_interval=10 nagios_user=nagios nagios_group=nagios check_external_commands=1 command_file=../var/rw/nagios.cmd lock_file=../var/nagios.lock temp_file=../var/nagios.tmp temp_path=/tmp event_broker_options=-1 log_rotation_method=d log_archive_path=var/archives use_syslog=1 log_notifications=1 log_service_retries=1 log_host_retries=1 log_event_handlers=1 log_initial_states=0 log_external_commands=1 log_passive_checks=1 service_inter_check_delay_method=s max_service_check_spread=30 service_interleave_factor=s host_inter_check_delay_method=s max_host_check_spread=30 max_concurrent_checks=0 check_result_reaper_frequency=10 max_check_result_reaper_time=30 check_result_path=/tmp max_check_result_file_age=3600 cached_host_check_horizon=15 cached_service_check_horizon=15 enable_predictive_host_dependency_checks=1 enable_predictive_service_dependency_checks=1 soft_state_dependencies=0 auto_reschedule_checks=0 auto_rescheduling_interval=30 auto_rescheduling_window=180 service_check_timeout=60 host_check_timeout=30 event_handler_timeout=30 notification_timeout=30 ocsp_timeout=5 perfdata_timeout=5 retain_state_information=1 state_retention_file=var/retention.dat retention_update_interval=60 use_retained_program_state=1 use_retained_scheduling_info=1 retained_host_attribute_mask=0 retained_service_attribute_mask=0 retained_process_host_attribute_mask=0 retained_process_service_attribute_mask=0 retained_contact_host_attribute_mask=0 retained_contact_service_attribute_mask=0 interval_length=60 check_for_updates=1 bare_update_check=0 use_aggressive_host_checking=0 execute_service_checks=1 accept_passive_service_checks=1 execute_host_checks=1 accept_passive_host_checks=1 enable_notifications=1 enable_event_handlers=1 process_performance_data=0 obsess_over_services=0 obsess_over_hosts=0 translate_passive_host_checks=0 passive_host_checks_are_soft=0 check_for_orphaned_services=1 check_for_orphaned_hosts=1 check_service_freshness=1 service_freshness_check_interval=60 check_host_freshness=0 host_freshness_check_interval=60 additional_freshness_latency=15 enable_flap_detection=1 low_service_flap_threshold=5.0 high_service_flap_threshold=20.0 low_host_flap_threshold=5.0 high_host_flap_threshold=20.0 date_format=us illegal_object_name_chars=`~!$%^&*|'"<>?,()= illegal_macro_output_chars=`~$&|'"<> use_regexp_matching=0 use_true_regexp_matching=0 admin_email=nagios@localhost admin_pager=pagenagios@localhost daemon_dumps_core=0 use_large_installation_tweaks=0 enable_environment_macros=1 debug_level=0 debug_verbosity=1 debug_file=var/nagios.debug max_debug_file_size=1000000 nagios-4.3.4/t/etc/nagios-test-downtime.cfg000066400000000000000000000052431314764422400205750ustar00rootroot00000000000000log_file=nagios.log cfg_file=test_downtime.cfg object_cache_file=objects.cache precached_object_file=objects.precache resource_file=resource.cfg status_file=status.dat status_update_interval=10 nagios_user=nagios nagios_group=nagios check_external_commands=1 command_file=nagios.cmd lock_file=nagios.lock temp_file=nagios.tmp temp_path=. event_broker_options=-1 log_rotation_method=d log_archive_path=. use_syslog=1 log_notifications=1 log_service_retries=1 log_host_retries=1 log_event_handlers=1 log_initial_states=0 log_external_commands=1 log_passive_checks=1 service_inter_check_delay_method=s max_service_check_spread=30 service_interleave_factor=s host_inter_check_delay_method=s max_host_check_spread=30 max_concurrent_checks=0 check_result_reaper_frequency=10 max_check_result_reaper_time=30 check_result_path=. max_check_result_file_age=3600 cached_host_check_horizon=15 cached_service_check_horizon=15 enable_predictive_host_dependency_checks=1 enable_predictive_service_dependency_checks=1 soft_state_dependencies=0 auto_reschedule_checks=0 auto_rescheduling_interval=30 auto_rescheduling_window=180 service_check_timeout=60 host_check_timeout=30 event_handler_timeout=30 notification_timeout=30 ocsp_timeout=5 perfdata_timeout=5 retain_state_information=1 state_retention_file=retention.dat retention_update_interval=60 use_retained_program_state=1 use_retained_scheduling_info=1 retained_host_attribute_mask=0 retained_service_attribute_mask=0 retained_process_host_attribute_mask=0 retained_process_service_attribute_mask=0 retained_contact_host_attribute_mask=0 retained_contact_service_attribute_mask=0 interval_length=60 check_for_updates=1 bare_update_check=0 use_aggressive_host_checking=0 execute_service_checks=1 accept_passive_service_checks=1 execute_host_checks=1 accept_passive_host_checks=1 enable_notifications=1 enable_event_handlers=1 process_performance_data=0 obsess_over_services=0 obsess_over_hosts=0 translate_passive_host_checks=0 passive_host_checks_are_soft=0 check_for_orphaned_services=1 check_for_orphaned_hosts=1 check_service_freshness=1 service_freshness_check_interval=60 check_host_freshness=0 host_freshness_check_interval=60 additional_freshness_latency=15 enable_flap_detection=1 low_service_flap_threshold=5.0 high_service_flap_threshold=20.0 low_host_flap_threshold=5.0 high_host_flap_threshold=20.0 date_format=us illegal_object_name_chars=`~!$%^&*|'"<>?,()= illegal_macro_output_chars=`~$&|'"<> use_regexp_matching=0 use_true_regexp_matching=0 admin_email=nagios@localhost admin_pager=pagenagios@localhost daemon_dumps_core=0 use_large_installation_tweaks=0 enable_environment_macros=1 debug_level=0 debug_verbosity=1 debug_file=nagios.debug max_debug_file_size=1000000 nagios-4.3.4/t/etc/nagios-test-events.cfg000066400000000000000000000052411314764422400202510ustar00rootroot00000000000000log_file=nagios.log cfg_file=test_events.cfg object_cache_file=objects.cache precached_object_file=objects.precache resource_file=resource.cfg status_file=status.dat status_update_interval=10 nagios_user=nagios nagios_group=nagios check_external_commands=1 command_file=nagios.cmd lock_file=nagios.lock temp_file=nagios.tmp temp_path=. event_broker_options=-1 log_rotation_method=d log_archive_path=. use_syslog=1 log_notifications=1 log_service_retries=1 log_host_retries=1 log_event_handlers=1 log_initial_states=0 log_external_commands=1 log_passive_checks=1 service_inter_check_delay_method=s max_service_check_spread=30 service_interleave_factor=s host_inter_check_delay_method=s max_host_check_spread=30 max_concurrent_checks=0 check_result_reaper_frequency=10 max_check_result_reaper_time=30 check_result_path=. max_check_result_file_age=3600 cached_host_check_horizon=15 cached_service_check_horizon=15 enable_predictive_host_dependency_checks=1 enable_predictive_service_dependency_checks=1 soft_state_dependencies=0 auto_reschedule_checks=0 auto_rescheduling_interval=30 auto_rescheduling_window=180 service_check_timeout=60 host_check_timeout=30 event_handler_timeout=30 notification_timeout=30 ocsp_timeout=5 perfdata_timeout=5 retain_state_information=1 state_retention_file=retention.dat retention_update_interval=60 use_retained_program_state=1 use_retained_scheduling_info=1 retained_host_attribute_mask=0 retained_service_attribute_mask=0 retained_process_host_attribute_mask=0 retained_process_service_attribute_mask=0 retained_contact_host_attribute_mask=0 retained_contact_service_attribute_mask=0 interval_length=60 check_for_updates=1 bare_update_check=0 use_aggressive_host_checking=0 execute_service_checks=1 accept_passive_service_checks=1 execute_host_checks=1 accept_passive_host_checks=1 enable_notifications=1 enable_event_handlers=1 process_performance_data=0 obsess_over_services=0 obsess_over_hosts=0 translate_passive_host_checks=0 passive_host_checks_are_soft=0 check_for_orphaned_services=1 check_for_orphaned_hosts=1 check_service_freshness=1 service_freshness_check_interval=60 check_host_freshness=0 host_freshness_check_interval=60 additional_freshness_latency=15 enable_flap_detection=1 low_service_flap_threshold=5.0 high_service_flap_threshold=20.0 low_host_flap_threshold=5.0 high_host_flap_threshold=20.0 date_format=us illegal_object_name_chars=`~!$%^&*|'"<>?,()= illegal_macro_output_chars=`~$&|'"<> use_regexp_matching=0 use_true_regexp_matching=0 admin_email=nagios@localhost admin_pager=pagenagios@localhost daemon_dumps_core=0 use_large_installation_tweaks=0 enable_environment_macros=1 debug_level=0 debug_verbosity=1 debug_file=nagios.debug max_debug_file_size=1000000 nagios-4.3.4/t/etc/nagios-with-generated-status.cfg000066400000000000000000000053671314764422400222310ustar00rootroot00000000000000log_file=../var/nagios.log cfg_file=minimal.cfg object_cache_file=../var/objects.cache precached_object_file=../var/objects.precache resource_file=resource.cfg status_file=../var/status-generated.dat status_update_interval=10 nagios_user=nagios nagios_group=nagios check_external_commands=1 command_file=../var/rw/nagios.cmd lock_file=../var/nagios.lock temp_file=../var/nagios.tmp temp_path=/tmp event_broker_options=-1 log_rotation_method=d log_archive_path=../var/archives use_syslog=1 log_notifications=1 log_service_retries=1 log_host_retries=1 log_event_handlers=1 log_initial_states=0 log_external_commands=1 log_passive_checks=1 service_inter_check_delay_method=s max_service_check_spread=30 service_interleave_factor=s host_inter_check_delay_method=s max_host_check_spread=30 max_concurrent_checks=0 check_result_reaper_frequency=10 max_check_result_reaper_time=30 check_result_path=/tmp max_check_result_file_age=3600 cached_host_check_horizon=15 cached_service_check_horizon=15 enable_predictive_host_dependency_checks=1 enable_predictive_service_dependency_checks=1 soft_state_dependencies=0 auto_reschedule_checks=0 auto_rescheduling_interval=30 auto_rescheduling_window=180 service_check_timeout=60 host_check_timeout=30 event_handler_timeout=30 notification_timeout=30 ocsp_timeout=5 perfdata_timeout=5 retain_state_information=1 state_retention_file=var/retention.dat retention_update_interval=60 use_retained_program_state=1 use_retained_scheduling_info=1 retained_host_attribute_mask=0 retained_service_attribute_mask=0 retained_process_host_attribute_mask=0 retained_process_service_attribute_mask=0 retained_contact_host_attribute_mask=0 retained_contact_service_attribute_mask=0 interval_length=60 check_for_updates=1 bare_update_check=0 use_aggressive_host_checking=0 execute_service_checks=1 accept_passive_service_checks=1 execute_host_checks=1 accept_passive_host_checks=1 enable_notifications=1 enable_event_handlers=1 process_performance_data=0 obsess_over_services=0 obsess_over_hosts=0 translate_passive_host_checks=0 passive_host_checks_are_soft=0 check_for_orphaned_services=1 check_for_orphaned_hosts=1 check_service_freshness=1 service_freshness_check_interval=60 check_host_freshness=0 host_freshness_check_interval=60 additional_freshness_latency=15 enable_flap_detection=1 low_service_flap_threshold=5.0 high_service_flap_threshold=20.0 low_host_flap_threshold=5.0 high_host_flap_threshold=20.0 date_format=us illegal_object_name_chars=`~!$%^&*|'"<>?,()= illegal_macro_output_chars=`~$&|'"<> use_regexp_matching=0 use_true_regexp_matching=0 admin_email=nagios@localhost admin_pager=pagenagios@localhost daemon_dumps_core=0 use_large_installation_tweaks=0 enable_environment_macros=1 debug_level=0 debug_verbosity=1 debug_file=var/nagios.debug max_debug_file_size=1000000 nagios-4.3.4/t/etc/nagios.cfg000066400000000000000000000054101314764422400157700ustar00rootroot00000000000000log_file=../var/nagios.log cfg_file=minimal.cfg object_cache_file=../var/objects.cache precached_object_file=../var/objects.precache resource_file=resource.cfg status_file=../var/status.dat status_update_interval=10 nagios_user=nagios nagios_group=nagios check_external_commands=1 command_file=../var/rw/nagios.cmd lock_file=../var/nagios.lock temp_file=../var/nagios.tmp temp_path=/tmp event_broker_options=-1 log_rotation_method=d log_archive_path=../var/archives use_syslog=1 log_notifications=1 log_service_retries=1 log_host_retries=1 log_event_handlers=1 log_initial_states=0 log_external_commands=1 log_passive_checks=1 service_inter_check_delay_method=s max_service_check_spread=30 service_interleave_factor=s host_inter_check_delay_method=s max_host_check_spread=30 max_concurrent_checks=0 check_result_reaper_frequency=10 max_check_result_reaper_time=30 check_result_path=../var/spool/checkresults max_check_result_file_age=3600 cached_host_check_horizon=15 cached_service_check_horizon=15 enable_predictive_host_dependency_checks=1 enable_predictive_service_dependency_checks=1 soft_state_dependencies=0 auto_reschedule_checks=0 auto_rescheduling_interval=30 auto_rescheduling_window=180 service_check_timeout=60 host_check_timeout=30 event_handler_timeout=30 notification_timeout=30 ocsp_timeout=5 perfdata_timeout=5 retain_state_information=1 state_retention_file=../var/retention.dat retention_update_interval=60 use_retained_program_state=1 use_retained_scheduling_info=1 retained_host_attribute_mask=0 retained_service_attribute_mask=0 retained_process_host_attribute_mask=0 retained_process_service_attribute_mask=0 retained_contact_host_attribute_mask=0 retained_contact_service_attribute_mask=0 interval_length=60 check_for_updates=1 bare_update_check=0 use_aggressive_host_checking=0 execute_service_checks=1 accept_passive_service_checks=1 execute_host_checks=1 accept_passive_host_checks=1 enable_notifications=1 enable_event_handlers=1 process_performance_data=0 obsess_over_services=0 obsess_over_hosts=0 translate_passive_host_checks=0 passive_host_checks_are_soft=0 check_for_orphaned_services=1 check_for_orphaned_hosts=1 check_service_freshness=1 service_freshness_check_interval=60 check_host_freshness=0 host_freshness_check_interval=60 additional_freshness_latency=15 enable_flap_detection=1 low_service_flap_threshold=5.0 high_service_flap_threshold=20.0 low_host_flap_threshold=5.0 high_host_flap_threshold=20.0 date_format=us illegal_object_name_chars=`~!$%^&*|'"<>?,()= illegal_macro_output_chars=`~$&|'"<> use_regexp_matching=0 use_true_regexp_matching=0 admin_email=nagios@localhost admin_pager=pagenagios@localhost daemon_dumps_core=0 use_large_installation_tweaks=0 enable_environment_macros=1 debug_level=0 debug_verbosity=1 debug_file=../var/nagios.debug max_debug_file_size=1000000 nagios-4.3.4/t/etc/no-contactgroup-error.cfg000066400000000000000000000052731314764422400207700ustar00rootroot00000000000000define host { host_name host1 alias host1 test address 192.168.1.1 max_check_attempts 2 check_period none contacts nagiosadmin notification_interval 60 notification_period none } define host { host_name host2 alias host2 test address 192.168.2.2 max_check_attempts 2 check_period none contacts nagiosadmin notification_interval 60 notification_period none } define service { host_name host1 service_description Dummy service check_command check_me max_check_attempts 3 check_interval 32 retry_interval 1 check_period none notification_interval 60 notification_period none contacts nagiosadmin } define service { host_name host1,host2 service_description Uses important check command check_command check_me!with some parameters max_check_attempts 5 check_interval 15 retry_interval 1 check_period none notification_interval 65 notification_period none contacts nagiosadmin use service-distributed } define service { name service-distributed check_command !set_to_stale register 0 } define command { command_name set_to_stale command_line /usr/local/nagios/libexec/set_to_stale } define command { command_name check_me command_line /usr/local/nagios/libexec/check_me } define command { command_name with_continuation_lines command_line $USER1$/check_foo one\ two } define command { command_name multiple_continuation_lines_with_spaces_intermingled command_line \ check_nrpe_arg!30!\ check_fs_ping!/mnt/account-p,/mnt/prepro-p,/mnt/webapp-ssl,/mnt/rollout-p } define timeperiod { timeperiod_name none alias Nothing } define contact { contact_name nagiosadmin host_notifications_enabled 0 service_notifications_enabled 0 host_notification_period none service_notification_period none host_notification_options d,u,f,r,s service_notification_options w,u,c,r,f,s host_notification_commands notify-none service_notification_commands notify-none contact_groups nonexistentone } define command { command_name notify-none command_line /usr/local/nagios/notifications/notify-none } define contact { contact_name second host_notifications_enabled 0 service_notifications_enabled 0 host_notification_period none service_notification_period none host_notification_options d,u,f,r,s service_notification_options w,u,c,r,f,s host_notification_commands notify-none service_notification_commands notify-none } define contactgroup { contactgroup_name causetestfailure alias This causes a test failure by having a comma separated list before the empty contactgroup members nagiosadmin,second } define contactgroup { contactgroup_name empty alias No members defined - this should pass validation } define serviceescalation { host_name * service_description *,!Dummy service } nagios-4.3.4/t/etc/no-service-error.cfg000066400000000000000000000025651314764422400177210ustar00rootroot00000000000000define host { host_name host1 alias host1 test address 192.168.1.1 max_check_attempts 2 check_period none contacts nagiosadmin notification_interval 60 notification_period none } define command { command_name check_me command_line /usr/local/nagios/libexec/check_me } define timeperiod { timeperiod_name none alias Nothing } define contact { contact_name nagiosadmin host_notifications_enabled 0 service_notifications_enabled 0 host_notification_period none service_notification_period none host_notification_options d,u,f,r,s service_notification_options w,u,c,r,f,s host_notification_commands notify-none service_notification_commands notify-none } define command { command_name notify-none command_line /usr/local/nagios/notifications/notify-none } define contact { contact_name second host_notifications_enabled 0 service_notifications_enabled 0 host_notification_period none service_notification_period none host_notification_options d,u,f,r,s service_notification_options w,u,c,r,f,s host_notification_commands notify-none service_notification_commands notify-none } define contactgroup { contactgroup_name causetestfailure alias This causes a test failure by having a comma separated list before the empty contactgroup members nagiosadmin,second } define contactgroup { contactgroup_name empty alias No members defined - this should pass validation } nagios-4.3.4/t/etc/resource.cfg000066400000000000000000000000001314764422400163250ustar00rootroot00000000000000nagios-4.3.4/t/etc/test_downtime.cfg000066400000000000000000000044061314764422400174010ustar00rootroot00000000000000define host { host_name host1 alias host1 test address 127.0.0.1 max_check_attempts 2 check_period 24x7 check_interval 5 retry_interval 1 check_command check_me contacts nagiosadmin notification_interval 60 notification_period none } define host { host_name host2 alias host2 test address 127.0.0.1 max_check_attempts 2 check_period 24x7 check_interval 5 retry_interval 1 check_command check_me contacts nagiosadmin notification_interval 60 notification_period none } define host { host_name host3 alias host3 test address 127.0.0.1 max_check_attempts 2 check_period 24x7 check_interval 5 retry_interval 1 check_command check_me contacts nagiosadmin notification_interval 60 notification_period none } define host { host_name host4 alias host4 test address 127.0.0.1 max_check_attempts 2 check_period 24x7 check_interval 5 retry_interval 1 check_command check_me contacts nagiosadmin notification_interval 60 notification_period none } define service { host_name host1,host2,host3,host4 service_description svc check_command check_me max_check_attempts 3 check_interval 32 retry_interval 1 check_period 24x7 notification_interval 60 notification_period none contacts nagiosadmin } define service { host_name host1,host2,host3,host4 service_description svc2 check_command check_me max_check_attempts 3 check_interval 32 retry_interval 1 check_period 24x7 notification_interval 60 notification_period none contacts nagiosadmin } define command { command_name check_me command_line /usr/local/nagios/libexec/check_me } define timeperiod { timeperiod_name none alias Nothing } define timeperiod { timeperiod_name 24x7 alias 24x7 base on weekdays monday 00:00-24:00 tuesday 00:00-24:00 wednesday 00:00-24:00 thursday 00:00-24:00 friday 00:00-24:00 saturday 00:00-24:00 sunday 00:00-24:00 } define contact { contact_name nagiosadmin host_notifications_enabled 0 service_notifications_enabled 0 host_notification_period none service_notification_period none host_notification_options d,u,f,r,s service_notification_options w,u,c,r,f,s host_notification_commands notify-none service_notification_commands notify-none } define command { command_name notify-none command_line /usr/local/nagios/notifications/notify-none } nagios-4.3.4/t/etc/test_events.cfg000066400000000000000000000034161314764422400170570ustar00rootroot00000000000000define host { host_name host1 alias host1 test address 127.0.0.1 max_check_attempts 2 check_period 24x7 check_interval 5 retry_interval 1 check_command check_me contacts nagiosadmin notification_interval 60 notification_period none } define service { host_name host1 service_description Normal service check_command check_me max_check_attempts 3 check_interval 32 retry_interval 1 check_period 24x7 notification_interval 60 notification_period none contacts nagiosadmin } define service { host_name host1 service_description Normal service 2 check_command check_me max_check_attempts 3 check_interval 32 retry_interval 1 check_period 24x7 notification_interval 60 notification_period none contacts nagiosadmin } define service { host_name host1 service_description To be nudged check_command check_me max_check_attempts 2 check_interval 32 retry_interval 1 check_period 24x7 notification_interval 60 notification_period none contacts nagiosadmin } define command { command_name check_me command_line /usr/local/nagios/libexec/check_me } define timeperiod { timeperiod_name none alias Nothing } define timeperiod { timeperiod_name 24x7 alias 24x7 base on weekdays monday 00:00-24:00 tuesday 00:00-24:00 wednesday 00:00-24:00 thursday 00:00-24:00 friday 00:00-24:00 saturday 00:00-24:00 sunday 00:00-24:00 } define contact { contact_name nagiosadmin host_notifications_enabled 0 service_notifications_enabled 0 host_notification_period none service_notification_period none host_notification_options d,u,f,r,s service_notification_options w,u,c,r,f,s host_notification_commands notify-none service_notification_commands notify-none } define command { command_name notify-none command_line /usr/local/nagios/notifications/notify-none } nagios-4.3.4/t/var/000077500000000000000000000000001314764422400140445ustar00rootroot00000000000000nagios-4.3.4/t/var/.gitignore000066400000000000000000000000471314764422400160350ustar00rootroot00000000000000objects.precache* status-generated.dat nagios-4.3.4/t/var/nagios.log000066400000000000000000000000001314764422400160150ustar00rootroot00000000000000nagios-4.3.4/t/var/objects.cache000066400000000000000000000113211314764422400164600ustar00rootroot00000000000000######################################## # NAGIOS OBJECT CACHE FILE # # THIS FILE IS AUTOMATICALLY GENERATED # BY NAGIOS. DO NOT MODIFY THIS FILE! # # Created: Thu May 14 23:56:31 2009 ######################################## define timeperiod { timeperiod_name none alias Nothing } define command { command_name check_me command_line /usr/local/nagios/libexec/check_me } define command { command_name notify-none command_line /usr/local/nagios/notifications/notify-none } define contactgroup { contactgroup_name causetestfailure alias This causes a test failure by having a comma separated list before the empty contactgroup members second,nagiosadmin } define contactgroup { contactgroup_name normalhostcontactgroup alias This contact group is assigned to a host normally members second } define contactgroup { contactgroup_name empty alias No members defined - this should pass validation } define contact { contact_name nagiosadmin service_notification_period none host_notification_period none service_notification_options w,u,c,r,f,s host_notification_options d,u,r,f,s service_notification_commands notify-none host_notification_commands notify-none host_notifications_enabled 0 service_notifications_enabled 0 can_submit_commands 1 retain_status_information 1 retain_nonstatus_information 1 } define contact { contact_name second service_notification_period none host_notification_period none service_notification_options w,u,c,r,f,s host_notification_options d,u,r,f,s service_notification_commands notify-none host_notification_commands notify-none host_notifications_enabled 0 service_notifications_enabled 0 can_submit_commands 1 retain_status_information 1 retain_nonstatus_information 1 } define host { host_name host1 alias host1 test address 192.168.1.1 check_period none contacts nagiosadmin contact_groups normalhostcontactgroup notification_period none initial_state o check_interval 5.000000 retry_interval 1.000000 max_check_attempts 2 active_checks_enabled 1 passive_checks_enabled 1 obsess_over_host 1 event_handler_enabled 1 low_flap_threshold 0.000000 high_flap_threshold 0.000000 flap_detection_enabled 1 flap_detection_options o,d,u freshness_threshold 0 check_freshness 0 notification_options d,u,r,f,s notifications_enabled 1 notification_interval 60.000000 first_notification_delay 0.000000 stalking_options n process_perf_data 1 retain_status_information 1 retain_nonstatus_information 1 } define host { host_name host2 alias host2 test address 192.168.1.2 check_period none contacts nagiosadmin notification_period none initial_state o check_interval 5.000000 retry_interval 1.000000 max_check_attempts 2 active_checks_enabled 1 passive_checks_enabled 1 obsess_over_host 1 event_handler_enabled 1 low_flap_threshold 0.000000 high_flap_threshold 0.000000 flap_detection_enabled 1 flap_detection_options o,d,u freshness_threshold 0 check_freshness 0 notification_options d,u,r,f,s notifications_enabled 1 notification_interval 60.000000 first_notification_delay 0.000000 stalking_options n process_perf_data 1 retain_status_information 1 retain_nonstatus_information 1 } define service { host_name host1 service_description Dummy service check_period none check_command check_me contacts nagiosadmin contact_groups normalhostcontactgroup notification_period none initial_state o check_interval 32.000000 retry_interval 1.000000 max_check_attempts 3 is_volatile 0 parallelize_check 1 active_checks_enabled 1 passive_checks_enabled 1 obsess_over_service 1 event_handler_enabled 1 low_flap_threshold 0.000000 high_flap_threshold 0.000000 flap_detection_enabled 1 flap_detection_options o,w,u,c freshness_threshold 0 check_freshness 0 notification_options u,w,c,r,f,s notifications_enabled 1 notification_interval 60.000000 first_notification_delay 0.000000 stalking_options n process_perf_data 1 retain_status_information 1 retain_nonstatus_information 1 } define service { host_name host2 service_description Dummy service check_period none check_command check_me contacts nagiosadmin notification_period none initial_state o check_interval 32.000000 retry_interval 1.000000 max_check_attempts 3 is_volatile 0 parallelize_check 1 active_checks_enabled 1 passive_checks_enabled 1 obsess_over_service 1 event_handler_enabled 1 low_flap_threshold 0.000000 high_flap_threshold 0.000000 flap_detection_enabled 1 flap_detection_options o,w,u,c freshness_threshold 0 check_freshness 0 notification_options u,w,c,r,f,s notifications_enabled 1 notification_interval 60.000000 first_notification_delay 0.000000 stalking_options n process_perf_data 1 retain_status_information 1 retain_nonstatus_information 1 } nagios-4.3.4/t/var/objects.cache.hosturgencies000066400000000000000000000226771314764422400213610ustar00rootroot00000000000000######################################## # NAGIOS OBJECT CACHE FILE # # THIS FILE IS AUTOMATICALLY GENERATED # BY NAGIOS. DO NOT MODIFY THIS FILE! # # Created: Mon Mar 21 20:09:19 2011 ######################################## define timeperiod { timeperiod_name 24x7 alias 24x7 base on weekdays sunday 00:00-24:00 monday 00:00-24:00 tuesday 00:00-24:00 wednesday 00:00-24:00 thursday 00:00-24:00 friday 00:00-24:00 saturday 00:00-24:00 } define timeperiod { timeperiod_name Test_exclude alias Test for exclude timeperiod tuesday -1 - monday 1 16:30-24:00 exclude myexclude } define timeperiod { timeperiod_name Test_exclude2 alias Test2 for exclude timeperiod tuesday 2 16:30-24:00 exclude myexclude2 } define timeperiod { timeperiod_name Test_exclude3 alias Test3 for exclude timeperiod tuesday 2 16:30-24:00 exclude myexclude3 } define timeperiod { timeperiod_name Test_exclude4 alias Test for exclude timeperiod tuesday -1 - monday 1 16:30-24:00 exclude myexclude4 } define timeperiod { timeperiod_name myexclude alias myexclude april 1 - august 16 00:00-24:00 saturday -1 - monday 1 16:00-24:00 } define timeperiod { timeperiod_name myexclude2 alias myexclude2 tuesday 00:00-23:58 } define timeperiod { timeperiod_name myexclude3 alias myexclude3 april 1 - august 16 00:00-24:00 } define timeperiod { timeperiod_name myexclude4 alias myexclude4 april 1 - august 16 00:00-24:00 } define timeperiod { timeperiod_name none alias Nothing } define timeperiod { timeperiod_name sunday_only alias Avoid time clock change hours sunday 00:00-01:15,03:15-22:00 } define timeperiod { timeperiod_name weekly_complex alias Complex weekly timeperiods sunday 00:00-09:45,14:15-24:00 monday 01:15-23:15 tuesday 01:15-23:15 wednesday 01:15-23:15 thursday 01:15-23:15 friday 01:15-23:15 saturday 00:00-22:00,23:00-24:00 } define command { command_name check_me command_line /usr/local/nagios/libexec/check_me } define command { command_name multiple_continuation_lines_with_spaces_intermingled command_line check_nrpe_arg!30!check_fs_ping!/mnt/account-p,/mnt/prepro-p,/mnt/webapp-ssl,/mnt/rollout-p } define command { command_name notify-none command_line /usr/local/nagios/notifications/notify-none } define command { command_name set_to_stale command_line /usr/local/nagios/libexec/set_to_stale } define command { command_name with_continuation_lines command_line $USER1$/check_foo onetwo } define contactgroup { contactgroup_name causetestfailure alias This causes a test failure by having a comma separated list before the empty contactgroup members second,nagiosadmin } define contactgroup { contactgroup_name empty alias No members defined - this should pass validation } define hostgroup { hostgroup_name hostgroup1 members host1,hostveryrecent } define hostgroup { hostgroup_name hostgroup2 } define contact { contact_name nagiosadmin service_notification_period none host_notification_period none service_notification_options w,u,c,r,f,s host_notification_options d,u,r,f,s service_notification_commands notify-none host_notification_commands notify-none host_notifications_enabled 0 service_notifications_enabled 0 can_submit_commands 1 retain_status_information 1 retain_nonstatus_information 1 } define contact { contact_name second service_notification_period none host_notification_period none service_notification_options w,u,c,r,f,s host_notification_options d,u,r,f,s service_notification_commands notify-none host_notification_commands notify-none host_notifications_enabled 0 service_notifications_enabled 0 can_submit_commands 1 retain_status_information 1 retain_nonstatus_information 1 } define host { host_name host1 alias host1 test address 192.168.1.1 check_period none contacts nagiosadmin notification_period none initial_state o check_interval 5.000000 retry_interval 1.000000 max_check_attempts 2 active_checks_enabled 1 passive_checks_enabled 1 obsess_over_host 1 event_handler_enabled 1 low_flap_threshold 0.000000 high_flap_threshold 0.000000 flap_detection_enabled 1 flap_detection_options o,d,u freshness_threshold 0 check_freshness 0 notification_options d,u,r,f,s notifications_enabled 1 notification_interval 60.000000 first_notification_delay 0.000000 stalking_options n process_perf_data 1 retain_status_information 1 retain_nonstatus_information 1 } define host { host_name host2 alias host2 test address 192.168.1.1 check_period none contacts nagiosadmin notification_period none initial_state o check_interval 5.000000 retry_interval 1.000000 max_check_attempts 2 active_checks_enabled 1 passive_checks_enabled 1 obsess_over_host 1 event_handler_enabled 1 low_flap_threshold 0.000000 high_flap_threshold 0.000000 flap_detection_enabled 1 flap_detection_options o,d,u freshness_threshold 0 check_freshness 0 notification_options d,u,r,f,s notifications_enabled 1 notification_interval 60.000000 first_notification_delay 0.000000 stalking_options n process_perf_data 1 retain_status_information 1 retain_nonstatus_information 1 } define host { host_name host3 alias host3 test address 192.168.1.1 check_period none contacts nagiosadmin notification_period none initial_state o check_interval 5.000000 retry_interval 1.000000 max_check_attempts 2 active_checks_enabled 1 passive_checks_enabled 1 obsess_over_host 1 event_handler_enabled 1 low_flap_threshold 0.000000 high_flap_threshold 0.000000 flap_detection_enabled 1 flap_detection_options o,d,u freshness_threshold 0 check_freshness 0 notification_options d,u,r,f,s notifications_enabled 1 notification_interval 60.000000 first_notification_delay 0.000000 stalking_options n process_perf_data 1 retain_status_information 1 retain_nonstatus_information 1 } define host { host_name host4 alias host1 test address 192.168.1.1 check_period none contacts nagiosadmin notification_period none initial_state o check_interval 5.000000 retry_interval 1.000000 max_check_attempts 2 active_checks_enabled 1 passive_checks_enabled 1 obsess_over_host 1 event_handler_enabled 1 low_flap_threshold 0.000000 high_flap_threshold 0.000000 flap_detection_enabled 1 flap_detection_options o,d,u freshness_threshold 0 check_freshness 0 notification_options d,u,r,f,s notifications_enabled 1 notification_interval 60.000000 first_notification_delay 0.000000 stalking_options n process_perf_data 1 retain_status_information 1 retain_nonstatus_information 1 } define host { host_name hostveryrecent alias hostveryrecent test address 192.168.1.1 check_period none contacts nagiosadmin notification_period none initial_state o check_interval 5.000000 retry_interval 1.000000 max_check_attempts 2 active_checks_enabled 1 passive_checks_enabled 1 obsess_over_host 1 event_handler_enabled 1 low_flap_threshold 0.000000 high_flap_threshold 0.000000 flap_detection_enabled 1 flap_detection_options o,d,u freshness_threshold 0 check_freshness 0 notification_options d,u,r,f,s notifications_enabled 1 notification_interval 60.000000 first_notification_delay 0.000000 stalking_options n process_perf_data 1 retain_status_information 1 retain_nonstatus_information 1 } define service { host_name host1 service_description Dummy service check_period none check_command check_me contacts nagiosadmin notification_period none initial_state o check_interval 32.000000 retry_interval 1.000000 max_check_attempts 3 is_volatile 0 parallelize_check 1 active_checks_enabled 1 passive_checks_enabled 1 obsess_over_service 1 event_handler_enabled 1 low_flap_threshold 0.000000 high_flap_threshold 0.000000 flap_detection_enabled 1 flap_detection_options o,w,u,c freshness_threshold 0 check_freshness 0 notification_options u,w,c,r,f,s notifications_enabled 1 notification_interval 60.000000 first_notification_delay 0.000000 stalking_options n process_perf_data 1 retain_status_information 1 retain_nonstatus_information 1 } define service { host_name host1 service_description Dummy service2 check_period none check_command check_me contacts nagiosadmin notification_period none initial_state o check_interval 32.000000 retry_interval 1.000000 max_check_attempts 3 is_volatile 0 parallelize_check 1 active_checks_enabled 1 passive_checks_enabled 1 obsess_over_service 1 event_handler_enabled 1 low_flap_threshold 0.000000 high_flap_threshold 0.000000 flap_detection_enabled 1 flap_detection_options o,w,u,c freshness_threshold 0 check_freshness 0 notification_options u,w,c,r,f,s notifications_enabled 1 notification_interval 60.000000 first_notification_delay 0.000000 stalking_options n process_perf_data 1 retain_status_information 1 retain_nonstatus_information 1 } define service { host_name host1 service_description Uses important check command check_period none check_command set_to_stale contacts nagiosadmin notification_period none initial_state o check_interval 15.000000 retry_interval 1.000000 max_check_attempts 5 is_volatile 0 parallelize_check 1 active_checks_enabled 1 passive_checks_enabled 1 obsess_over_service 1 event_handler_enabled 1 low_flap_threshold 0.000000 high_flap_threshold 0.000000 flap_detection_enabled 1 flap_detection_options o,w,u,c freshness_threshold 0 check_freshness 0 notification_options u,w,c,r,f,s notifications_enabled 1 notification_interval 65.000000 first_notification_delay 0.000000 stalking_options n process_perf_data 1 retain_status_information 1 retain_nonstatus_information 1 } nagios-4.3.4/t/var/objects.precache.expected000066400000000000000000000224771314764422400210050ustar00rootroot00000000000000######################################## # NAGIOS OBJECT CACHE FILE # # THIS FILE IS AUTOMATICALLY GENERATED # BY NAGIOS. DO NOT MODIFY THIS FILE! # ######################################## define timeperiod { timeperiod_name none alias Nothing } define command { command_name check_me command_line /usr/local/nagios/libexec/check_me } define command { command_name multiple_continuation_lines_with_spaces_intermingled command_line check_nrpe_arg!30!check_fs_ping!/mnt/account-p,/mnt/prepro-p,/mnt/webapp-ssl,/mnt/rollout-p } define command { command_name notify-none command_line /usr/local/nagios/notifications/notify-none } define command { command_name set_to_stale command_line /usr/local/nagios/libexec/set_to_stale } define command { command_name with_continuation_lines command_line $USER1$/check_foo onetwo } define contactgroup { contactgroup_name causetestfailure alias This causes a test failure by having a comma separated list before the empty contactgroup members second,nagiosadmin } define contactgroup { contactgroup_name empty alias No members defined - this should pass validation } define hostgroup { hostgroup_name hosts-with-master-service alias Hosts running a master service members host3 } define servicegroup { servicegroup_name services-depending-on-master-service alias Servicegroup for services depending on a "master" service on the same host members host3,dependent-service } define contact { contact_name nagiosadmin alias nagiosadmin service_notification_period none host_notification_period none service_notification_options r,w,u,c,f,s host_notification_options r,d,u,f,s service_notification_commands notify-none host_notification_commands notify-none minimum_value 1 host_notifications_enabled 0 service_notifications_enabled 0 can_submit_commands 1 retain_status_information 1 retain_nonstatus_information 1 } define contact { contact_name second alias second service_notification_period none host_notification_period none service_notification_options r,w,u,c,f,s host_notification_options r,d,u,f,s service_notification_commands notify-none host_notification_commands notify-none minimum_value 1 host_notifications_enabled 0 service_notifications_enabled 0 can_submit_commands 1 retain_status_information 1 retain_nonstatus_information 1 } define host { host_name host1 alias host1 test address 192.168.1.1 check_period none contacts nagiosadmin notification_period none initial_state o hourly_value 3 check_interval 5.000000 retry_interval 1.000000 max_check_attempts 2 active_checks_enabled 1 passive_checks_enabled 1 obsess 1 event_handler_enabled 1 low_flap_threshold 0.000000 high_flap_threshold 0.000000 flap_detection_enabled 1 flap_detection_options a freshness_threshold 0 check_freshness 0 notification_options a notifications_enabled 1 notification_interval 60.000000 first_notification_delay 0.000000 stalking_options n process_perf_data 1 retain_status_information 1 retain_nonstatus_information 1 } define host { host_name host2 alias host2 test address 192.168.2.2 check_period none contacts nagiosadmin notification_period none initial_state o hourly_value 2 check_interval 5.000000 retry_interval 1.000000 max_check_attempts 2 active_checks_enabled 1 passive_checks_enabled 1 obsess 1 event_handler_enabled 1 low_flap_threshold 0.000000 high_flap_threshold 0.000000 flap_detection_enabled 1 flap_detection_options a freshness_threshold 0 check_freshness 0 notification_options a notifications_enabled 1 notification_interval 60.000000 first_notification_delay 0.000000 stalking_options n process_perf_data 1 retain_status_information 1 retain_nonstatus_information 1 } define host { host_name host3 alias host3 test address 192.168.2.3 check_period none contacts nagiosadmin notification_period none initial_state o hourly_value 3 check_interval 5.000000 retry_interval 1.000000 max_check_attempts 2 active_checks_enabled 1 passive_checks_enabled 1 obsess 1 event_handler_enabled 1 low_flap_threshold 0.000000 high_flap_threshold 0.000000 flap_detection_enabled 1 flap_detection_options a freshness_threshold 0 check_freshness 0 notification_options a notifications_enabled 1 notification_interval 60.000000 first_notification_delay 0.000000 stalking_options n process_perf_data 1 retain_status_information 1 retain_nonstatus_information 1 } define service { host_name host1 service_description Dummy service check_period none check_command check_me contacts nagiosadmin notification_period none initial_state o hourly_value 1 check_interval 32.000000 retry_interval 1.000000 max_check_attempts 3 is_volatile 0 parallelize_check 1 active_checks_enabled 1 passive_checks_enabled 1 obsess 1 event_handler_enabled 1 low_flap_threshold 0.000000 high_flap_threshold 0.000000 flap_detection_enabled 1 flap_detection_options a freshness_threshold 0 check_freshness 0 notification_options a notifications_enabled 1 notification_interval 60.000000 first_notification_delay 0.000000 stalking_options n process_perf_data 1 retain_status_information 1 retain_nonstatus_information 1 } define service { host_name host1 service_description Uses important check command check_period none check_command set_to_stale contacts nagiosadmin notification_period none initial_state o hourly_value 1 check_interval 15.000000 retry_interval 1.000000 max_check_attempts 5 is_volatile 0 parallelize_check 1 active_checks_enabled 1 passive_checks_enabled 1 obsess 1 event_handler_enabled 1 low_flap_threshold 0.000000 high_flap_threshold 0.000000 flap_detection_enabled 1 flap_detection_options a freshness_threshold 0 check_freshness 0 notification_options a notifications_enabled 1 notification_interval 65.000000 first_notification_delay 0.000000 stalking_options n process_perf_data 1 retain_status_information 1 retain_nonstatus_information 1 } define service { host_name host2 service_description Uses important check command check_period none check_command set_to_stale contacts nagiosadmin notification_period none initial_state o hourly_value 1 check_interval 15.000000 retry_interval 1.000000 max_check_attempts 5 is_volatile 0 parallelize_check 1 active_checks_enabled 1 passive_checks_enabled 1 obsess 1 event_handler_enabled 1 low_flap_threshold 0.000000 high_flap_threshold 0.000000 flap_detection_enabled 1 flap_detection_options a freshness_threshold 0 check_freshness 0 notification_options a notifications_enabled 1 notification_interval 65.000000 first_notification_delay 0.000000 stalking_options n process_perf_data 1 retain_status_information 1 retain_nonstatus_information 1 } define service { host_name host3 service_description dependent-service check_period none check_command check_me!dependent service contacts nagiosadmin notification_period none initial_state o hourly_value 1 check_interval 15.000000 retry_interval 1.000000 max_check_attempts 5 is_volatile 0 parallelize_check 1 active_checks_enabled 1 passive_checks_enabled 1 obsess 1 event_handler_enabled 1 low_flap_threshold 0.000000 high_flap_threshold 0.000000 flap_detection_enabled 1 flap_detection_options a freshness_threshold 0 check_freshness 0 notification_options a notifications_enabled 1 notification_interval 65.000000 first_notification_delay 0.000000 stalking_options n process_perf_data 1 retain_status_information 1 retain_nonstatus_information 1 } define service { host_name host3 service_description master-service check_period none check_command check_me!master service contacts nagiosadmin notification_period none initial_state o hourly_value 1 check_interval 15.000000 retry_interval 1.000000 max_check_attempts 5 is_volatile 0 parallelize_check 1 active_checks_enabled 1 passive_checks_enabled 1 obsess 1 event_handler_enabled 1 low_flap_threshold 0.000000 high_flap_threshold 0.000000 flap_detection_enabled 1 flap_detection_options a freshness_threshold 0 check_freshness 0 notification_options a notifications_enabled 1 notification_interval 65.000000 first_notification_delay 0.000000 stalking_options n process_perf_data 1 retain_status_information 1 retain_nonstatus_information 1 } define servicedependency { host_name host3 service_description master-service dependent_host_name host3 dependent_service_description dependent-service inherits_parent 0 notification_failure_options u,c } define serviceescalation { host_name host1 service_description Uses important check command first_notification -2 last_notification -2 notification_interval 65.000000 escalation_period none escalation_options a contacts nagiosadmin } define serviceescalation { host_name host2 service_description Uses important check command first_notification -2 last_notification -2 notification_interval 65.000000 escalation_period none escalation_options a contacts nagiosadmin } define serviceescalation { host_name host3 service_description dependent-service first_notification -2 last_notification -2 notification_interval 65.000000 escalation_period none escalation_options a contacts nagiosadmin } define serviceescalation { host_name host3 service_description master-service first_notification -2 last_notification -2 notification_interval 65.000000 escalation_period none escalation_options a contacts nagiosadmin } nagios-4.3.4/t/var/spool/000077500000000000000000000000001314764422400152005ustar00rootroot00000000000000nagios-4.3.4/t/var/spool/checkresults/000077500000000000000000000000001314764422400176775ustar00rootroot00000000000000nagios-4.3.4/t/var/spool/checkresults/.gitignore000066400000000000000000000000021314764422400216570ustar00rootroot00000000000000* nagios-4.3.4/t/var/status-hosturgencies.dat000066400000000000000000000273321314764422400207500ustar00rootroot00000000000000######################################## # NAGIOS STATUS FILE # # THIS FILE IS AUTOMATICALLY GENERATED # BY NAGIOS. DO NOT MODIFY THIS FILE! ######################################## info { created=1242341791 version=3.1.0 last_update_check=1242341791 update_available=1 last_version=3.1.0 new_version=3.0.6 } programstatus { modified_host_attributes=0 modified_service_attributes=0 nagios_pid=48451 daemon_mode=0 program_start=1242341791 last_log_rotation=0 enable_notifications=1 active_service_checks_enabled=1 passive_service_checks_enabled=1 active_host_checks_enabled=1 passive_host_checks_enabled=1 enable_event_handlers=1 obsess_over_services=0 obsess_over_hosts=0 check_service_freshness=1 check_host_freshness=0 enable_flap_detection=1 process_performance_data=0 global_host_event_handler= global_service_event_handler= next_comment_id=1 next_downtime_id=1 next_event_id=1 next_problem_id=0 next_notification_id=1 active_scheduled_host_check_stats=0,0,0 active_ondemand_host_check_stats=0,0,0 passive_host_check_stats=0,0,0 active_scheduled_service_check_stats=0,0,0 active_ondemand_service_check_stats=0,0,0 passive_service_check_stats=0,0,0 cached_host_check_stats=0,0,0 cached_service_check_stats=0,0,0 external_command_stats=0,0,0 parallel_host_check_stats=0,0,0 serial_host_check_stats=0,0,0 } hoststatus { host_name=host1 modified_attributes=0 check_command= check_period=none notification_period=none check_interval=5.000000 retry_interval=1.000000 event_handler= has_been_checked=1 should_be_scheduled=0 check_execution_time=0.000 check_latency=0.000 check_type=0 current_state=0 last_hard_state=0 last_event_id=0 current_event_id=0 current_problem_id=0 last_problem_id=0 plugin_output= long_plugin_output= performance_data= last_check=0 next_check=0 check_options=0 current_attempt=1 max_attempts=2 current_event_id=0 last_event_id=0 state_type=1 last_state_change=0 last_hard_state_change=0 last_time_up=0 last_time_down=0 last_time_unreachable=0 last_notification=0 next_notification=0 no_more_notifications=0 current_notification_number=0 current_notification_id=0 notifications_enabled=1 problem_has_been_acknowledged=0 acknowledgement_type=0 active_checks_enabled=1 passive_checks_enabled=1 event_handler_enabled=1 flap_detection_enabled=1 process_performance_data=1 obsess_over_host=1 last_update=1242341791 is_flapping=0 percent_state_change=0.00 scheduled_downtime_depth=0 } hoststatus { host_name=host2 modified_attributes=0 check_command= check_period=none notification_period=none check_interval=5.000000 retry_interval=1.000000 event_handler= has_been_checked=1 should_be_scheduled=0 check_execution_time=0.000 check_latency=0.000 check_type=0 current_state=1 last_hard_state=0 last_event_id=0 current_event_id=0 current_problem_id=0 last_problem_id=0 plugin_output= long_plugin_output= performance_data= last_check=0 next_check=0 check_options=0 current_attempt=1 max_attempts=2 current_event_id=0 last_event_id=0 state_type=1 last_state_change=0 last_hard_state_change=0 last_time_up=0 last_time_down=0 last_time_unreachable=0 last_notification=0 next_notification=0 no_more_notifications=0 current_notification_number=0 current_notification_id=0 notifications_enabled=1 problem_has_been_acknowledged=0 acknowledgement_type=0 active_checks_enabled=1 passive_checks_enabled=1 event_handler_enabled=1 flap_detection_enabled=1 process_performance_data=1 obsess_over_host=1 last_update=1242341791 is_flapping=0 percent_state_change=0.00 scheduled_downtime_depth=0 } hoststatus { host_name=host3 modified_attributes=0 check_command= check_period=none notification_period=none check_interval=5.000000 retry_interval=1.000000 event_handler= has_been_checked=1 should_be_scheduled=0 check_execution_time=0.000 check_latency=0.000 check_type=0 current_state=2 last_hard_state=0 last_event_id=0 current_event_id=0 current_problem_id=0 last_problem_id=0 plugin_output= long_plugin_output= performance_data= last_check=0 next_check=0 check_options=0 current_attempt=1 max_attempts=2 current_event_id=0 last_event_id=0 state_type=1 last_state_change=0 last_hard_state_change=0 last_time_up=0 last_time_down=0 last_time_unreachable=0 last_notification=0 next_notification=0 no_more_notifications=0 current_notification_number=0 current_notification_id=0 notifications_enabled=1 problem_has_been_acknowledged=0 acknowledgement_type=0 active_checks_enabled=1 passive_checks_enabled=1 event_handler_enabled=1 flap_detection_enabled=1 process_performance_data=1 obsess_over_host=1 last_update=1242341791 is_flapping=0 percent_state_change=0.00 scheduled_downtime_depth=0 } hoststatus { host_name=host4 modified_attributes=0 check_command= check_period=none notification_period=none check_interval=5.000000 retry_interval=1.000000 event_handler= has_been_checked=0 should_be_scheduled=0 check_execution_time=0.000 check_latency=0.000 check_type=0 current_state=0 last_hard_state=0 last_event_id=0 current_event_id=0 current_problem_id=0 last_problem_id=0 plugin_output= long_plugin_output= performance_data= last_check=0 next_check=0 check_options=0 current_attempt=1 max_attempts=2 current_event_id=0 last_event_id=0 state_type=1 last_state_change=0 last_hard_state_change=0 last_time_up=0 last_time_down=0 last_time_unreachable=0 last_notification=0 next_notification=0 no_more_notifications=0 current_notification_number=0 current_notification_id=0 notifications_enabled=1 problem_has_been_acknowledged=0 acknowledgement_type=0 active_checks_enabled=1 passive_checks_enabled=1 event_handler_enabled=1 flap_detection_enabled=1 process_performance_data=1 obsess_over_host=1 last_update=1242341791 is_flapping=0 percent_state_change=0.00 scheduled_downtime_depth=0 } servicestatus { host_name=host1 service_description=Dummy service modified_attributes=0 check_command=check_me check_period=none notification_period=none check_interval=32.000000 retry_interval=1.000000 event_handler= has_been_checked=0 should_be_scheduled=0 check_execution_time=0.000 check_latency=0.000 check_type=0 current_state=0 last_hard_state=0 last_event_id=0 current_event_id=0 current_problem_id=0 last_problem_id=0 current_attempt=1 max_attempts=3 current_event_id=0 last_event_id=0 state_type=1 last_state_change=0 last_hard_state_change=0 last_time_ok=0 last_time_warning=0 last_time_unknown=0 last_time_critical=0 plugin_output= long_plugin_output= performance_data= last_check=0 next_check=0 check_options=0 current_notification_number=0 current_notification_id=0 last_notification=0 next_notification=0 no_more_notifications=0 notifications_enabled=1 active_checks_enabled=1 passive_checks_enabled=1 event_handler_enabled=1 problem_has_been_acknowledged=0 acknowledgement_type=0 flap_detection_enabled=1 process_performance_data=1 obsess_over_service=1 last_update=1242341791 is_flapping=0 percent_state_change=0.00 scheduled_downtime_depth=0 } servicestatus { host_name=host2 service_description=Dummy service modified_attributes=0 check_command=check_me check_period=none notification_period=none check_interval=32.000000 retry_interval=1.000000 event_handler= has_been_checked=0 should_be_scheduled=0 check_execution_time=0.000 check_latency=0.000 check_type=0 current_state=0 last_hard_state=0 last_event_id=0 current_event_id=0 current_problem_id=0 last_problem_id=0 current_attempt=1 max_attempts=3 current_event_id=0 last_event_id=0 state_type=1 last_state_change=0 last_hard_state_change=0 last_time_ok=0 last_time_warning=0 last_time_unknown=0 last_time_critical=0 plugin_output= long_plugin_output= performance_data= last_check=0 next_check=0 check_options=0 current_notification_number=0 current_notification_id=0 last_notification=0 next_notification=0 no_more_notifications=0 notifications_enabled=1 active_checks_enabled=1 passive_checks_enabled=1 event_handler_enabled=1 problem_has_been_acknowledged=0 acknowledgement_type=0 flap_detection_enabled=1 process_performance_data=1 obsess_over_service=1 last_update=1242341791 is_flapping=0 percent_state_change=0.00 scheduled_downtime_depth=0 } servicestatus { host_name=host3 service_description=Dummy service modified_attributes=0 check_command=check_me check_period=none notification_period=none check_interval=32.000000 retry_interval=1.000000 event_handler= has_been_checked=0 should_be_scheduled=0 check_execution_time=0.000 check_latency=0.000 check_type=0 current_state=0 last_hard_state=0 last_event_id=0 current_event_id=0 current_problem_id=0 last_problem_id=0 current_attempt=1 max_attempts=3 current_event_id=0 last_event_id=0 state_type=1 last_state_change=0 last_hard_state_change=0 last_time_ok=0 last_time_warning=0 last_time_unknown=0 last_time_critical=0 plugin_output= long_plugin_output= performance_data= last_check=0 next_check=0 check_options=0 current_notification_number=0 current_notification_id=0 last_notification=0 next_notification=0 no_more_notifications=0 notifications_enabled=1 active_checks_enabled=1 passive_checks_enabled=1 event_handler_enabled=1 problem_has_been_acknowledged=0 acknowledgement_type=0 flap_detection_enabled=1 process_performance_data=1 obsess_over_service=1 last_update=1242341791 is_flapping=0 percent_state_change=0.00 scheduled_downtime_depth=0 } servicestatus { host_name=host4 service_description=Dummy service modified_attributes=0 check_command=check_me check_period=none notification_period=none check_interval=32.000000 retry_interval=1.000000 event_handler= has_been_checked=0 should_be_scheduled=0 check_execution_time=0.000 check_latency=0.000 check_type=0 current_state=0 last_hard_state=0 last_event_id=0 current_event_id=0 current_problem_id=0 last_problem_id=0 current_attempt=1 max_attempts=3 current_event_id=0 last_event_id=0 state_type=1 last_state_change=0 last_hard_state_change=0 last_time_ok=0 last_time_warning=0 last_time_unknown=0 last_time_critical=0 plugin_output= long_plugin_output= performance_data= last_check=0 next_check=0 check_options=0 current_notification_number=0 current_notification_id=0 last_notification=0 next_notification=0 no_more_notifications=0 notifications_enabled=1 active_checks_enabled=1 passive_checks_enabled=1 event_handler_enabled=1 problem_has_been_acknowledged=0 acknowledgement_type=0 flap_detection_enabled=1 process_performance_data=1 obsess_over_service=1 last_update=1242341791 is_flapping=0 percent_state_change=0.00 scheduled_downtime_depth=0 } contactstatus { contact_name=nagiosadmin modified_attributes=0 modified_host_attributes=0 modified_service_attributes=0 host_notification_period=none service_notification_period=none last_host_notification=0 last_service_notification=0 host_notifications_enabled=0 service_notifications_enabled=0 } contactstatus { contact_name=second modified_attributes=0 modified_host_attributes=0 modified_service_attributes=0 host_notification_period=none service_notification_period=none last_host_notification=0 last_service_notification=0 host_notifications_enabled=0 service_notifications_enabled=0 } hostcomment { host_name=host1 entry_type=1 comment_id=1 source=1 persistent=1 entry_time=1253110703 expires=0 expire_time=0 author=Nagios Admin comment_data=Test Comment } servicecomment { host_name=host1 service_description=Dummy service entry_type=1 comment_id=2 source=1 persistent=1 entry_time=1253108952 expires=0 expire_time=0 author=Nagios Admin comment_data=Test Comment } nagios-4.3.4/t/var/status.dat000066400000000000000000000161341314764422400160660ustar00rootroot00000000000000######################################## # NAGIOS STATUS FILE # # THIS FILE IS AUTOMATICALLY GENERATED # BY NAGIOS. DO NOT MODIFY THIS FILE! ######################################## info { created=1242341791 version=3.1.0 last_update_check=1242341791 update_available=1 last_version=3.1.0 new_version=3.0.6 } programstatus { modified_host_attributes=0 modified_service_attributes=0 nagios_pid=48451 daemon_mode=0 program_start=1242341791 last_log_rotation=0 enable_notifications=1 active_service_checks_enabled=1 passive_service_checks_enabled=1 active_host_checks_enabled=1 passive_host_checks_enabled=1 enable_event_handlers=1 obsess_over_services=0 obsess_over_hosts=0 check_service_freshness=1 check_host_freshness=0 enable_flap_detection=1 process_performance_data=0 global_host_event_handler= global_service_event_handler= next_comment_id=1 next_downtime_id=1 next_event_id=1 next_problem_id=0 next_notification_id=1 active_scheduled_host_check_stats=0,0,0 active_ondemand_host_check_stats=0,0,0 passive_host_check_stats=0,0,0 active_scheduled_service_check_stats=0,0,0 active_ondemand_service_check_stats=0,0,0 passive_service_check_stats=0,0,0 cached_host_check_stats=0,0,0 cached_service_check_stats=0,0,0 external_command_stats=0,0,0 parallel_host_check_stats=0,0,0 serial_host_check_stats=0,0,0 } hoststatus { host_name=host1 modified_attributes=0 check_command= check_period=none notification_period=none check_interval=5.000000 retry_interval=1.000000 event_handler= has_been_checked=0 should_be_scheduled=0 check_execution_time=0.000 check_latency=0.000 check_type=0 current_state=0 last_hard_state=0 last_event_id=0 current_event_id=0 current_problem_id=0 last_problem_id=0 plugin_output= long_plugin_output= performance_data= last_check=0 next_check=0 check_options=0 current_attempt=1 max_attempts=2 current_event_id=0 last_event_id=0 state_type=1 last_state_change=0 last_hard_state_change=0 last_time_up=0 last_time_down=0 last_time_unreachable=0 last_notification=0 next_notification=0 no_more_notifications=0 current_notification_number=0 current_notification_id=0 notifications_enabled=1 problem_has_been_acknowledged=0 acknowledgement_type=0 active_checks_enabled=1 passive_checks_enabled=1 event_handler_enabled=1 flap_detection_enabled=1 process_performance_data=1 obsess_over_host=1 last_update=1242341791 is_flapping=0 percent_state_change=0.00 scheduled_downtime_depth=0 } hoststatus { host_name=host2 modified_attributes=0 check_command= check_period=none notification_period=none check_interval=5.000000 retry_interval=1.000000 event_handler= has_been_checked=0 should_be_scheduled=0 check_execution_time=0.000 check_latency=0.000 check_type=0 current_state=0 last_hard_state=0 last_event_id=0 current_event_id=0 current_problem_id=0 last_problem_id=0 plugin_output= long_plugin_output= performance_data= last_check=0 next_check=0 check_options=0 current_attempt=1 max_attempts=2 current_event_id=0 last_event_id=0 state_type=1 last_state_change=0 last_hard_state_change=0 last_time_up=0 last_time_down=0 last_time_unreachable=0 last_notification=0 next_notification=0 no_more_notifications=0 current_notification_number=0 current_notification_id=0 notifications_enabled=1 problem_has_been_acknowledged=0 acknowledgement_type=0 active_checks_enabled=1 passive_checks_enabled=1 event_handler_enabled=1 flap_detection_enabled=1 process_performance_data=1 obsess_over_host=1 last_update=1242341791 is_flapping=0 percent_state_change=0.00 scheduled_downtime_depth=0 } servicestatus { host_name=host1 service_description=Dummy service modified_attributes=0 check_command=check_me check_period=none notification_period=none check_interval=32.000000 retry_interval=1.000000 event_handler= has_been_checked=0 should_be_scheduled=0 check_execution_time=0.000 check_latency=0.000 check_type=0 current_state=0 last_hard_state=0 last_event_id=0 current_event_id=0 current_problem_id=0 last_problem_id=0 current_attempt=1 max_attempts=3 current_event_id=0 last_event_id=0 state_type=1 last_state_change=0 last_hard_state_change=0 last_time_ok=0 last_time_warning=0 last_time_unknown=0 last_time_critical=0 plugin_output= long_plugin_output= performance_data= last_check=0 next_check=0 check_options=0 current_notification_number=0 current_notification_id=0 last_notification=0 next_notification=0 no_more_notifications=0 notifications_enabled=1 active_checks_enabled=1 passive_checks_enabled=1 event_handler_enabled=1 problem_has_been_acknowledged=0 acknowledgement_type=0 flap_detection_enabled=1 process_performance_data=1 obsess_over_service=1 last_update=1242341791 is_flapping=0 percent_state_change=0.00 scheduled_downtime_depth=0 } servicestatus { host_name=host2 service_description=Dummy service modified_attributes=0 check_command=check_me check_period=none notification_period=none check_interval=32.000000 retry_interval=1.000000 event_handler= has_been_checked=0 should_be_scheduled=0 check_execution_time=0.000 check_latency=0.000 check_type=0 current_state=0 last_hard_state=0 last_event_id=0 current_event_id=0 current_problem_id=0 last_problem_id=0 current_attempt=1 max_attempts=3 current_event_id=0 last_event_id=0 state_type=1 last_state_change=0 last_hard_state_change=0 last_time_ok=0 last_time_warning=0 last_time_unknown=0 last_time_critical=0 plugin_output= long_plugin_output= performance_data= last_check=0 next_check=0 check_options=0 current_notification_number=0 current_notification_id=0 last_notification=0 next_notification=0 no_more_notifications=0 notifications_enabled=1 active_checks_enabled=1 passive_checks_enabled=1 event_handler_enabled=1 problem_has_been_acknowledged=0 acknowledgement_type=0 flap_detection_enabled=1 process_performance_data=1 obsess_over_service=1 last_update=1242341791 is_flapping=0 percent_state_change=0.00 scheduled_downtime_depth=0 } contactstatus { contact_name=nagiosadmin modified_attributes=0 modified_host_attributes=0 modified_service_attributes=0 host_notification_period=none service_notification_period=none last_host_notification=0 last_service_notification=0 host_notifications_enabled=0 service_notifications_enabled=0 } contactstatus { contact_name=second modified_attributes=0 modified_host_attributes=0 modified_service_attributes=0 host_notification_period=none service_notification_period=none last_host_notification=0 last_service_notification=0 host_notifications_enabled=0 service_notifications_enabled=0 } hostcomment { host_name=host1 entry_type=1 comment_id=1 source=1 persistent=1 entry_time=1253110703 expires=0 expire_time=0 author=Nagios Admin comment_data=Test Comment } servicecomment { host_name=host1 service_description=Dummy service entry_type=1 comment_id=2 source=1 persistent=1 entry_time=1253108952 expires=0 expire_time=0 author=Nagios Admin comment_data=Test Comment } nagios-4.3.4/tap/000077500000000000000000000000001314764422400135755ustar00rootroot00000000000000nagios-4.3.4/tap/.gitignore000066400000000000000000000000101314764422400155540ustar00rootroot00000000000000libtool nagios-4.3.4/tap/INSTALL000066400000000000000000000001751314764422400146310ustar00rootroot00000000000000Quick Installation ./configure make make check make install Run "configure --help" for additional options. nagios-4.3.4/tap/Makefile.am000066400000000000000000000000651314764422400156320ustar00rootroot00000000000000SUBDIRS = src SUBDIRS += tests prove: prove -v -r nagios-4.3.4/tap/Makefile.in000066400000000000000000000434121314764422400156460ustar00rootroot00000000000000# Makefile.in generated by automake 1.9.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = . am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(top_srcdir)/configure INSTALL compile \ config.guess config.sub depcomp install-sh ltmain.sh missing subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno configure.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-exec-recursive install-info-recursive \ install-recursive installcheck-recursive installdirs-recursive \ pdf-recursive ps-recursive uninstall-info-recursive \ uninstall-recursive ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ { test ! -d $(distdir) \ || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -fr $(distdir); }; } DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best distuninstallcheck_listfiles = find . -type f -print distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ SUBDIRS = src tests all: all-recursive .SUFFIXES: am--refresh: @: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign '; \ cd $(srcdir) && $(AUTOMAKE) --foreign \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --foreign Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: $(am__configure_deps) cd $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool uninstall-info-am: # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @set fnord $$MAKEFLAGS; amf=$$2; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" mostlyclean-recursive clean-recursive distclean-recursive \ maintainer-clean-recursive: @set fnord $$MAKEFLAGS; amf=$$2; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) $(am__remove_distdir) mkdir $(distdir) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(mkdir_p) "$(distdir)/$$subdir" \ || exit 1; \ distdir=`$(am__cd) $(distdir) && pwd`; \ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ (cd $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$top_distdir" \ distdir="$$distdir/$$subdir" \ distdir) \ || exit 1; \ fi; \ done -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(SHELL) $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r $(distdir) dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 $(am__remove_distdir) dist-tarZ: distdir tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__remove_distdir) dist-shar: distdir shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__remove_distdir) dist dist-all: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir); chmod a+w $(distdir) mkdir $(distdir)/_build mkdir $(distdir)/_inst chmod a-w $(distdir) dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && cd $(distdir)/_build \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(DISTCHECK_CONFIGURE_FLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck $(am__remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e '1{h;s/./=/g;p;x;}' -e '$${p;x;}' distuninstallcheck: @cd $(distuninstallcheck_dir) \ && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-libtool \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive info: info-recursive info-am: install-data-am: install-exec-am: install-info: install-info-recursive install-man: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-info-am uninstall-info: uninstall-info-recursive .PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am am--refresh check \ check-am clean clean-generic clean-libtool clean-recursive \ ctags ctags-recursive dist dist-all dist-bzip2 dist-gzip \ dist-shar dist-tarZ dist-zip distcheck distclean \ distclean-generic distclean-libtool distclean-recursive \ distclean-tags distcleancheck distdir distuninstallcheck dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-exec install-exec-am \ install-info install-info-am install-man install-strip \ installcheck installcheck-am installdirs installdirs-am \ maintainer-clean maintainer-clean-generic \ maintainer-clean-recursive mostlyclean mostlyclean-generic \ mostlyclean-libtool mostlyclean-recursive pdf pdf-am ps ps-am \ tags tags-recursive uninstall uninstall-am uninstall-info-am prove: prove -v -r # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: nagios-4.3.4/tap/README000066400000000000000000000006041314764422400144550ustar00rootroot00000000000000NAME tap -- write tests that implement the Test Anything Protocol SYNOPSIS #include DESCRIPTION The tap library provides functions for writing test scripts that produce output consistent with the Test Anything Protocol. A test harness that parses this protocol can run these tests and produce useful reports indi- cating their success or failure. nagios-4.3.4/tap/README.nagios000066400000000000000000000002221314764422400157300ustar00rootroot00000000000000This package has been included from http://jc.ngo.org.uk/trac-bin/trac.cgi/wiki/LibTap into the Nagios distribution for testing Nagios functions nagios-4.3.4/tap/aclocal.m4000066400000000000000000007467731314764422400154650ustar00rootroot00000000000000# generated automatically by aclocal 1.9.3 -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 # Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. # -*- Autoconf -*- # Copyright (C) 2002, 2003 Free Software Foundation, Inc. # Generated from amversion.in; do not edit by hand. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version="1.9"]) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION so it can be traced. # This function is AC_REQUIREd by AC_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.9.3])]) # AM_AUX_DIR_EXPAND # Copyright (C) 2001, 2003 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to # `$srcdir', `$srcdir/..', or `$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is `.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997, 2000, 2001, 2003, 2004 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # serial 6 # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ(2.52)dnl ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE]) AC_SUBST([$1_FALSE]) if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # serial 7 -*- Autoconf -*- # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004 # Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # There are a few dirty hacks below to avoid letting `AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "GCJ", or "OBJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl ifelse([$1], CC, [depcc="$CC" am_compiler_list=], [$1], CXX, [depcc="$CXX" am_compiler_list=], [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf case $depmode in nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; none) break ;; esac # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. if depmode=$depmode \ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE(dependency-tracking, [ --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH]) ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004 # Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. #serial 2 # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [for mf in $CONFIG_FILES; do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # So let's grep whole file. if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each `.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Do all the work for Automake. -*- Autoconf -*- # This macro actually does too much some checks are only needed if # your package does certain things. But this isn't really a big deal. # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 # Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # serial 11 # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.58])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl # test to see if srcdir already configured if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) AM_MISSING_PROG(AUTOCONF, autoconf) AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) AM_MISSING_PROG(AUTOHEADER, autoheader) AM_MISSING_PROG(MAKEINFO, makeinfo) AM_PROG_INSTALL_SH AM_PROG_INSTALL_STRIP AC_REQUIRE([AM_PROG_MKDIR_P])dnl # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES(CC)], [define([AC_PROG_CC], defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES(CXX)], [define([AC_PROG_CXX], defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl ]) ]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $1 | $1:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count]) # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. # Copyright (C) 2001, 2003 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl install_sh=${install_sh-"$am_aux_dir/install-sh"} AC_SUBST(install_sh)]) # -*- Autoconf -*- # Copyright (C) 2003 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # serial 1 # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # serial 2 # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo done .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # We grep out `Entering directory' and `Leaving directory' # messages which can occur if `w' ends up in MAKEFLAGS. # In particular we don't look at `^make:' because GNU make might # be invoked under some other name (usually "gmake"), in which # case it prints its new name instead of `make'. if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then am__include=include am__quote= _am_result=GNU fi # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then am__include=.include am__quote="\"" _am_result=BSD fi fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # -*- Autoconf -*- # Copyright (C) 1997, 1999, 2000, 2001, 2003 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # serial 3 # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it supports --run. # If it does, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= AC_MSG_WARN([`missing' script is too old or missing]) fi ]) # AM_PROG_MKDIR_P # --------------- # Check whether `mkdir -p' is supported, fallback to mkinstalldirs otherwise. # Copyright (C) 2003, 2004 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # Automake 1.8 used `mkdir -m 0755 -p --' to ensure that directories # created by `make install' are always world readable, even if the # installer happens to have an overly restrictive umask (e.g. 077). # This was a mistake. There are at least two reasons why we must not # use `-m 0755': # - it causes special bits like SGID to be ignored, # - it may be too restrictive (some setups expect 775 directories). # # Do not use -m 0755 and let people choose whatever they expect by # setting umask. # # We cannot accept any implementation of `mkdir' that recognizes `-p'. # Some implementations (such as Solaris 8's) are not thread-safe: if a # parallel make tries to run `mkdir -p a/b' and `mkdir -p a/c' # concurrently, both version can detect that a/ is missing, but only # one can create it and the other will error out. Consequently we # restrict ourselves to GNU make (using the --version option ensures # this.) AC_DEFUN([AM_PROG_MKDIR_P], [if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then # We used to keeping the `.' as first argument, in order to # allow $(mkdir_p) to be used without argument. As in # $(mkdir_p) $(somedir) # where $(somedir) is conditionally defined. However this is wrong # for two reasons: # 1. if the package is installed by a user who cannot write `.' # make install will fail, # 2. the above comment should most certainly read # $(mkdir_p) $(DESTDIR)$(somedir) # so it does not work when $(somedir) is undefined and # $(DESTDIR) is not. # To support the latter case, we have to write # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir), # so the `.' trick is pointless. mkdir_p='mkdir -p --' else # On NextStep and OpenStep, the `mkdir' command does not # recognize any option. It will interpret all options as # directories to create, and then abort because `.' already # exists. for d in ./-p ./--version; do test -d $d && rmdir $d done # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists. if test -f "$ac_aux_dir/mkinstalldirs"; then mkdir_p='$(mkinstalldirs)' else mkdir_p='$(install_sh) -d' fi fi AC_SUBST([mkdir_p])]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # serial 2 # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # ------------------------------ # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), 1)]) # _AM_SET_OPTIONS(OPTIONS) # ---------------------------------- # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # # Check to make sure that the build environment is sane. # # Copyright (C) 1996, 1997, 2000, 2001, 2003 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # serial 3 # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Just in case sleep 1 echo timestamp > conftest.file # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t $srcdir/configure conftest.file` fi rm -f conftest.file if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT(yes)]) # AM_PROG_INSTALL_STRIP # Copyright (C) 2001, 2003 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # One issue with vendor `install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in `make install-strip', and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be `maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # serial 1 # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of `v7', `ustar', or `pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. AM_MISSING_PROG([AMTAR], [tar]) m4_if([$1], [v7], [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'], [m4_case([$1], [ustar],, [pax],, [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' _am_tools=${am_cv_prog_tar_$1-$_am_tools} # Do not fold the above two line into one, because Tru64 sh and # Solaris sh will not grok spaces in the rhs of `-'. for _am_tool in $_am_tools do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR # libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # serial 47 AC_PROG_LIBTOOL # AC_PROVIDE_IFELSE(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED) # ----------------------------------------------------------- # If this macro is not defined by Autoconf, define it here. m4_ifdef([AC_PROVIDE_IFELSE], [], [m4_define([AC_PROVIDE_IFELSE], [m4_ifdef([AC_PROVIDE_$1], [$2], [$3])])]) # AC_PROG_LIBTOOL # --------------- AC_DEFUN([AC_PROG_LIBTOOL], [AC_REQUIRE([_AC_PROG_LIBTOOL])dnl dnl If AC_PROG_CXX has already been expanded, run AC_LIBTOOL_CXX dnl immediately, otherwise, hook it in at the end of AC_PROG_CXX. AC_PROVIDE_IFELSE([AC_PROG_CXX], [AC_LIBTOOL_CXX], [define([AC_PROG_CXX], defn([AC_PROG_CXX])[AC_LIBTOOL_CXX ])]) dnl And a similar setup for Fortran 77 support AC_PROVIDE_IFELSE([AC_PROG_F77], [AC_LIBTOOL_F77], [define([AC_PROG_F77], defn([AC_PROG_F77])[AC_LIBTOOL_F77 ])]) dnl Quote A][M_PROG_GCJ so that aclocal doesn't bring it in needlessly. dnl If either AC_PROG_GCJ or A][M_PROG_GCJ have already been expanded, run dnl AC_LIBTOOL_GCJ immediately, otherwise, hook it in at the end of both. AC_PROVIDE_IFELSE([AC_PROG_GCJ], [AC_LIBTOOL_GCJ], [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], [AC_LIBTOOL_GCJ], [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ], [AC_LIBTOOL_GCJ], [ifdef([AC_PROG_GCJ], [define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[AC_LIBTOOL_GCJ])]) ifdef([A][M_PROG_GCJ], [define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[AC_LIBTOOL_GCJ])]) ifdef([LT_AC_PROG_GCJ], [define([LT_AC_PROG_GCJ], defn([LT_AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])])]) ])])# AC_PROG_LIBTOOL # _AC_PROG_LIBTOOL # ---------------- AC_DEFUN([_AC_PROG_LIBTOOL], [AC_REQUIRE([AC_LIBTOOL_SETUP])dnl AC_BEFORE([$0],[AC_LIBTOOL_CXX])dnl AC_BEFORE([$0],[AC_LIBTOOL_F77])dnl AC_BEFORE([$0],[AC_LIBTOOL_GCJ])dnl # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' AC_SUBST(LIBTOOL)dnl # Prevent multiple expansion define([AC_PROG_LIBTOOL], []) ])# _AC_PROG_LIBTOOL # AC_LIBTOOL_SETUP # ---------------- AC_DEFUN([AC_LIBTOOL_SETUP], [AC_PREREQ(2.50)dnl AC_REQUIRE([AC_ENABLE_SHARED])dnl AC_REQUIRE([AC_ENABLE_STATIC])dnl AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_PROG_LD])dnl AC_REQUIRE([AC_PROG_LD_RELOAD_FLAG])dnl AC_REQUIRE([AC_PROG_NM])dnl AC_REQUIRE([AC_PROG_LN_S])dnl AC_REQUIRE([AC_DEPLIBS_CHECK_METHOD])dnl # Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers! AC_REQUIRE([AC_OBJEXT])dnl AC_REQUIRE([AC_EXEEXT])dnl dnl AC_LIBTOOL_SYS_MAX_CMD_LEN AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE AC_LIBTOOL_OBJDIR AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl _LT_AC_PROG_ECHO_BACKSLASH case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. Xsed='sed -e s/^X//' [sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g'] # Same as above, but do not quote variable references. [double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g'] # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' # Constants: rm="rm -f" # Global variables: default_ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except M$VC, # which needs '.lib'). libext=a ltmain="$ac_aux_dir/ltmain.sh" ofile="$default_ofile" with_gnu_ld="$lt_cv_prog_gnu_ld" AC_CHECK_TOOL(AR, ar, false) AC_CHECK_TOOL(RANLIB, ranlib, :) AC_CHECK_TOOL(STRIP, strip, :) old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$AR" && AR=ar test -z "$AR_FLAGS" && AR_FLAGS=cru test -z "$AS" && AS=as test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$DLLTOOL" && DLLTOOL=dlltool test -z "$LD" && LD=ld test -z "$LN_S" && LN_S="ln -s" test -z "$MAGIC_CMD" && MAGIC_CMD=file test -z "$NM" && NM=nm test -z "$SED" && SED=sed test -z "$OBJDUMP" && OBJDUMP=objdump test -z "$RANLIB" && RANLIB=: test -z "$STRIP" && STRIP=: test -z "$ac_objext" && ac_objext=o # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="\$RANLIB -t \$oldlib~$old_postinstall_cmds" ;; *) old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" fi cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` # Only perform the check for file, if the check method requires it case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then AC_PATH_MAGIC fi ;; esac AC_PROVIDE_IFELSE([AC_LIBTOOL_DLOPEN], enable_dlopen=yes, enable_dlopen=no) AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], enable_win32_dll=yes, enable_win32_dll=no) AC_ARG_ENABLE([libtool-lock], [AC_HELP_STRING([--disable-libtool-lock], [avoid locking (might break parallel builds)])]) test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes AC_ARG_WITH([pic], [AC_HELP_STRING([--with-pic], [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], [pic_mode="$withval"], [pic_mode=default]) test -z "$pic_mode" && pic_mode=default # Use C for the default configuration in the libtool script tagname= AC_LIBTOOL_LANG_C_CONFIG _LT_AC_TAGCONFIG ])# AC_LIBTOOL_SETUP # _LT_AC_SYS_COMPILER # ------------------- AC_DEFUN([_LT_AC_SYS_COMPILER], [AC_REQUIRE([AC_PROG_CC])dnl # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # Allow CC to be a program name with arguments. compiler=$CC ])# _LT_AC_SYS_COMPILER # _LT_AC_SYS_LIBPATH_AIX # ---------------------- # Links a minimal program and checks the executable # for the system default hardcoded library path. In most cases, # this is /usr/lib:/lib, but when the MPI compilers are used # the location of the communication and MPI libs are included too. # If we don't find anything, use the default library path according # to the aix ld manual. AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX], [AC_LINK_IFELSE(AC_LANG_PROGRAM,[ aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'`; fi],[]) if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi ])# _LT_AC_SYS_LIBPATH_AIX # _LT_AC_SHELL_INIT(ARG) # ---------------------- AC_DEFUN([_LT_AC_SHELL_INIT], [ifdef([AC_DIVERSION_NOTICE], [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)], [AC_DIVERT_PUSH(NOTICE)]) $1 AC_DIVERT_POP ])# _LT_AC_SHELL_INIT # _LT_AC_PROG_ECHO_BACKSLASH # -------------------------- # Add some code to the start of the generated configure script which # will find an echo command which doesn't interpret backslashes. AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH], [_LT_AC_SHELL_INIT([ # Check that we are running under the correct shell. SHELL=${CONFIG_SHELL-/bin/sh} case X$ECHO in X*--fallback-echo) # Remove one level of quotation (which was required for Make). ECHO=`echo "$ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','` ;; esac echo=${ECHO-echo} if test "X[$]1" = X--no-reexec; then # Discard the --no-reexec flag, and continue. shift elif test "X[$]1" = X--fallback-echo; then # Avoid inline document here, it may be left over : elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then # Yippee, $echo works! : else # Restart under the correct shell. exec $SHELL "[$]0" --no-reexec ${1+"[$]@"} fi if test "X[$]1" = X--fallback-echo; then # used as fallback echo shift cat </dev/null 2>&1 && unset CDPATH if test -z "$ECHO"; then if test "X${echo_test_string+set}" != Xset; then # find a string as large as possible, as long as the shell can cope with it for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... if (echo_test_string="`eval $cmd`") 2>/dev/null && echo_test_string="`eval $cmd`" && (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null then break fi done fi if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then : else # The Solaris, AIX, and Digital Unix default echo programs unquote # backslashes. This makes it impossible to quote backslashes using # echo "$something" | sed 's/\\/\\\\/g' # # So, first we look for a working echo in the user's PATH. lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for dir in $PATH /usr/ucb; do IFS="$lt_save_ifs" if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then echo="$dir/echo" break fi done IFS="$lt_save_ifs" if test "X$echo" = Xecho; then # We didn't find a better echo, so look for alternatives. if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then # This shell has a builtin print -r that does the trick. echo='print -r' elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && test "X$CONFIG_SHELL" != X/bin/ksh; then # If we have ksh, try running configure again with it. ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} export ORIGINAL_CONFIG_SHELL CONFIG_SHELL=/bin/ksh export CONFIG_SHELL exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"} else # Try using printf. echo='printf %s\n' if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then # Cool, printf works : elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && test "X$echo_testing_string" = 'X\t' && echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL export CONFIG_SHELL SHELL="$CONFIG_SHELL" export SHELL echo="$CONFIG_SHELL [$]0 --fallback-echo" elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && test "X$echo_testing_string" = 'X\t' && echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then echo="$CONFIG_SHELL [$]0 --fallback-echo" else # maybe with a smaller string... prev=: for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null then break fi prev="$cmd" done if test "$prev" != 'sed 50q "[$]0"'; then echo_test_string=`eval $prev` export echo_test_string exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"} else # Oops. We lost completely, so just stick with echo. echo=echo fi fi fi fi fi fi # Copy echo and quote the copy suitably for passing to libtool from # the Makefile, instead of quoting the original, which is used later. ECHO=$echo if test "X$ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo" fi AC_SUBST(ECHO) ])])# _LT_AC_PROG_ECHO_BACKSLASH # _LT_AC_LOCK # ----------- AC_DEFUN([_LT_AC_LOCK], [AC_ARG_ENABLE([libtool-lock], [AC_HELP_STRING([--disable-libtool-lock], [avoid locking (might break parallel builds)])]) test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '[#]line __oline__ "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case "`/usr/bin/file conftest.o`" in *32-bit*) case $host in x86_64-*linux*) LD="${LD-ld} -m elf_i386" ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, [AC_LANG_PUSH(C) AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) AC_LANG_POP]) if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], [*-*-cygwin* | *-*-mingw* | *-*-pw32*) AC_CHECK_TOOL(DLLTOOL, dlltool, false) AC_CHECK_TOOL(AS, as, false) AC_CHECK_TOOL(OBJDUMP, objdump, false) ;; ]) esac need_locks="$enable_libtool_lock" ])# _LT_AC_LOCK # AC_LIBTOOL_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------------------- # Check whether the given compiler option works AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [AC_REQUIRE([LT_AC_PROG_SED]) AC_CACHE_CHECK([$1], [$2], [$2=no ifelse([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$3" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings if test ! -s conftest.err; then $2=yes fi fi $rm conftest* ]) if test x"[$]$2" = xyes; then ifelse([$5], , :, [$5]) else ifelse([$6], , :, [$6]) fi ])# AC_LIBTOOL_COMPILER_OPTION # AC_LIBTOOL_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [ACTION-SUCCESS], [ACTION-FAILURE]) # ------------------------------------------------------------ # Check whether the given compiler option works AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], [AC_CACHE_CHECK([$1], [$2], [$2=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $3" printf "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&AS_MESSAGE_LOG_FD else $2=yes fi fi $rm conftest* LDFLAGS="$save_LDFLAGS" ]) if test x"[$]$2" = xyes; then ifelse([$4], , :, [$4]) else ifelse([$5], , :, [$5]) fi ])# AC_LIBTOOL_LINKER_OPTION # AC_LIBTOOL_SYS_MAX_CMD_LEN # -------------------------- AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [# find the maximum length of command line arguments AC_MSG_CHECKING([the maximum length of command line arguments]) AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not preemptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* ) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for *BSD fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` ;; *) # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} while (test "X"`$SHELL [$]0 --fallback-echo "X$teststring" 2>/dev/null` \ = "XX$teststring") >/dev/null 2>&1 && new_result=`expr "X$teststring" : ".*" 2>&1` && lt_cv_sys_max_cmd_len=$new_result && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done teststring= # Add a significant safety factor because C++ compilers can tack on massive # amounts of additional arguments before passing them to the linker. # It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` ;; esac ]) if test -n $lt_cv_sys_max_cmd_len ; then AC_MSG_RESULT($lt_cv_sys_max_cmd_len) else AC_MSG_RESULT(none) fi ])# AC_LIBTOOL_SYS_MAX_CMD_LEN # _LT_AC_CHECK_DLFCN # -------------------- AC_DEFUN([_LT_AC_CHECK_DLFCN], [AC_CHECK_HEADERS(dlfcn.h)dnl ])# _LT_AC_CHECK_DLFCN # _LT_AC_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, # ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) # ------------------------------------------------------------------ AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF], [AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl if test "$cross_compiling" = yes; then : [$4] else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif #ifdef __cplusplus extern "C" void exit (int); #endif void fnord() { int i=42;} int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; /* dlclose (self); */ } exit (status); }] EOF if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) $1 ;; x$lt_dlneed_uscore) $2 ;; x$lt_unknown|x*) $3 ;; esac else : # compilation failed $3 fi fi rm -fr conftest* ])# _LT_AC_TRY_DLOPEN_SELF # AC_LIBTOOL_DLOPEN_SELF # ------------------- AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ]) ;; *) AC_CHECK_FUNC([shl_load], [lt_cv_dlopen="shl_load"], [AC_CHECK_LIB([dld], [shl_load], [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld"], [AC_CHECK_FUNC([dlopen], [lt_cv_dlopen="dlopen"], [AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], [AC_CHECK_LIB([svld], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], [AC_CHECK_LIB([dld], [dld_link], [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld"]) ]) ]) ]) ]) ]) ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" AC_CACHE_CHECK([whether a program can dlopen itself], lt_cv_dlopen_self, [dnl _LT_AC_TRY_DLOPEN_SELF( lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) ]) if test "x$lt_cv_dlopen_self" = xyes; then LDFLAGS="$LDFLAGS $link_static_flag" AC_CACHE_CHECK([whether a statically linked program can dlopen itself], lt_cv_dlopen_self_static, [dnl _LT_AC_TRY_DLOPEN_SELF( lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) ]) fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi ])# AC_LIBTOOL_DLOPEN_SELF # AC_LIBTOOL_PROG_CC_C_O([TAGNAME]) # --------------------------------- # Check to see if options -c and -o are simultaneously supported by compiler AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O], [AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)], [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no $rm -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings if test ! -s out/conftest.err; then _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes fi fi chmod u+w . $rm conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files $rm out/* && rmdir out cd .. rmdir conftest $rm conftest* ]) ])# AC_LIBTOOL_PROG_CC_C_O # AC_LIBTOOL_SYS_HARD_LINK_LOCKS([TAGNAME]) # ----------------------------------------- # Check to see if we can do hard links to lock some files if needed AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_REQUIRE([_LT_AC_LOCK])dnl hard_links="nottested" if test "$_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user AC_MSG_CHECKING([if we can lock with hard links]) hard_links=yes $rm conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no AC_MSG_RESULT([$hard_links]) if test "$hard_links" = no; then AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) need_locks=warn fi else need_locks=no fi ])# AC_LIBTOOL_SYS_HARD_LINK_LOCKS # AC_LIBTOOL_OBJDIR # ----------------- AC_DEFUN([AC_LIBTOOL_OBJDIR], [AC_CACHE_CHECK([for objdir], [lt_cv_objdir], [rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null]) objdir=$lt_cv_objdir ])# AC_LIBTOOL_OBJDIR # AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH([TAGNAME]) # ---------------------------------------------- # Check hardcoding attributes. AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_MSG_CHECKING([how to hardcode library paths into programs]) _LT_AC_TAGVAR(hardcode_action, $1)= if test -n "$_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)" || \ test -n "$_LT_AC_TAGVAR(runpath_var, $1)" || \ test "X$_LT_AC_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then # We can hardcode non-existant directories. if test "$_LT_AC_TAGVAR(hardcode_direct, $1)" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)" != no && test "$_LT_AC_TAGVAR(hardcode_minus_L, $1)" != no; then # Linking always hardcodes the temporary library directory. _LT_AC_TAGVAR(hardcode_action, $1)=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. _LT_AC_TAGVAR(hardcode_action, $1)=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. _LT_AC_TAGVAR(hardcode_action, $1)=unsupported fi AC_MSG_RESULT([$_LT_AC_TAGVAR(hardcode_action, $1)]) if test "$_LT_AC_TAGVAR(hardcode_action, $1)" = relink; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi ])# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH # AC_LIBTOOL_SYS_LIB_STRIP # ------------------------ AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP], [striplib= old_striplib= AC_MSG_CHECKING([whether stripping libraries is possible]) if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" AC_MSG_RESULT([yes]) else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi ;; *) AC_MSG_RESULT([no]) ;; esac fi ])# AC_LIBTOOL_SYS_LIB_STRIP # AC_LIBTOOL_SYS_DYNAMIC_LINKER # ----------------------------- # PORTME Fill in your ld.so characteristics AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_MSG_CHECKING([dynamic linker characteristics]) library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" if test "$GCC" = yes; then sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix4* | aix5*) version_type=linux need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[[01]] | aix4.[[01]].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[[45]]*) version_type=linux need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$host_os in yes,cygwin* | yes,mingw* | yes,pw32*) library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $rm \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" ;; mingw*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | [grep ';[c-zC-Z]:/' >/dev/null]; then # It is most probably a Windows format PATH printed by # mingw gcc, but we are running on Cygwin. Gcc prints its search # path with ; separators, and with drive letters. We can handle the # drive letters (cygwin fileutils understands them), so leave them, # especially as we might pass files found there to a mingw objdump, # which wouldn't understand a cygwinified path. Ahh. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac ;; *) library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' ;; esac dynamic_linker='Win32 ld.exe' # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. if test "$GCC" = yes; then sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` else sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' fi sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd1*) dynamic_linker=no ;; kfreebsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='GNU ld.so' ;; freebsd*) objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; *) # from 3.2 on shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case "$host_cpu" in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555. postinstall_cmds='chmod 555 $lib' ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be Linux ELF. linux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`$SED -e 's/[:,\t]/ /g;s/=[^=]*$//;s/=[^= ]* / /g' /etc/ld.so.conf | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; knetbsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='GNU ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; nto-qnx*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; openbsd*) version_type=sunos need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[[89]] | openbsd2.[[89]].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; sco3.2v5*) version_type=osf soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH ;; solaris*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no export_dynamic_flag_spec='${wl}-Blargedynsym' runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac AC_MSG_RESULT([$dynamic_linker]) test "$dynamic_linker" = no && can_build_shared=no ])# AC_LIBTOOL_SYS_DYNAMIC_LINKER # _LT_AC_TAGCONFIG # ---------------- AC_DEFUN([_LT_AC_TAGCONFIG], [AC_ARG_WITH([tags], [AC_HELP_STRING([--with-tags@<:@=TAGS@:>@], [include additional configurations @<:@automatic@:>@])], [tagnames="$withval"]) if test -f "$ltmain" && test -n "$tagnames"; then if test ! -f "${ofile}"; then AC_MSG_WARN([output file `$ofile' does not exist]) fi if test -z "$LTCC"; then eval "`$SHELL ${ofile} --config | grep '^LTCC='`" if test -z "$LTCC"; then AC_MSG_WARN([output file `$ofile' does not look like a libtool script]) else AC_MSG_WARN([using `LTCC=$LTCC', extracted from `$ofile']) fi fi # Extract list of available tagged configurations in $ofile. # Note that this assumes the entire list is on one line. available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'` lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for tagname in $tagnames; do IFS="$lt_save_ifs" # Check whether tagname contains only valid characters case `$echo "X$tagname" | $Xsed -e 's:[[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]]::g'` in "") ;; *) AC_MSG_ERROR([invalid tag name: $tagname]) ;; esac if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null then AC_MSG_ERROR([tag name \"$tagname\" already exists]) fi # Update the list of available tags. if test -n "$tagname"; then echo appending configuration tag \"$tagname\" to $ofile case $tagname in CXX) if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then AC_LIBTOOL_LANG_CXX_CONFIG else tagname="" fi ;; F77) if test -n "$F77" && test "X$F77" != "Xno"; then AC_LIBTOOL_LANG_F77_CONFIG else tagname="" fi ;; GCJ) if test -n "$GCJ" && test "X$GCJ" != "Xno"; then AC_LIBTOOL_LANG_GCJ_CONFIG else tagname="" fi ;; RC) AC_LIBTOOL_LANG_RC_CONFIG ;; *) AC_MSG_ERROR([Unsupported tag name: $tagname]) ;; esac # Append the new tag name to the list of available tags. if test -n "$tagname" ; then available_tags="$available_tags $tagname" fi fi done IFS="$lt_save_ifs" # Now substitute the updated list of available tags. if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then mv "${ofile}T" "$ofile" chmod +x "$ofile" else rm -f "${ofile}T" AC_MSG_ERROR([unable to update list of available tagged configurations.]) fi fi ])# _LT_AC_TAGCONFIG # AC_LIBTOOL_DLOPEN # ----------------- # enable checks for dlopen support AC_DEFUN([AC_LIBTOOL_DLOPEN], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP]) ])# AC_LIBTOOL_DLOPEN # AC_LIBTOOL_WIN32_DLL # -------------------- # declare package support for building win32 dll's AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_BEFORE([$0], [AC_LIBTOOL_SETUP]) ])# AC_LIBTOOL_WIN32_DLL # AC_ENABLE_SHARED([DEFAULT]) # --------------------------- # implement the --enable-shared flag # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. AC_DEFUN([AC_ENABLE_SHARED], [define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl AC_ARG_ENABLE([shared], [AC_HELP_STRING([--enable-shared@<:@=PKGS@:>@], [build shared libraries @<:@default=]AC_ENABLE_SHARED_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_shared=]AC_ENABLE_SHARED_DEFAULT) ])# AC_ENABLE_SHARED # AC_DISABLE_SHARED # ----------------- #- set the default shared flag to --disable-shared AC_DEFUN([AC_DISABLE_SHARED], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl AC_ENABLE_SHARED(no) ])# AC_DISABLE_SHARED # AC_ENABLE_STATIC([DEFAULT]) # --------------------------- # implement the --enable-static flag # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. AC_DEFUN([AC_ENABLE_STATIC], [define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl AC_ARG_ENABLE([static], [AC_HELP_STRING([--enable-static@<:@=PKGS@:>@], [build static libraries @<:@default=]AC_ENABLE_STATIC_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_static=]AC_ENABLE_STATIC_DEFAULT) ])# AC_ENABLE_STATIC # AC_DISABLE_STATIC # ----------------- # set the default static flag to --disable-static AC_DEFUN([AC_DISABLE_STATIC], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl AC_ENABLE_STATIC(no) ])# AC_DISABLE_STATIC # AC_ENABLE_FAST_INSTALL([DEFAULT]) # --------------------------------- # implement the --enable-fast-install flag # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. AC_DEFUN([AC_ENABLE_FAST_INSTALL], [define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl AC_ARG_ENABLE([fast-install], [AC_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], [optimize for fast installation @<:@default=]AC_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_fast_install=]AC_ENABLE_FAST_INSTALL_DEFAULT) ])# AC_ENABLE_FAST_INSTALL # AC_DISABLE_FAST_INSTALL # ----------------------- # set the default to --disable-fast-install AC_DEFUN([AC_DISABLE_FAST_INSTALL], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl AC_ENABLE_FAST_INSTALL(no) ])# AC_DISABLE_FAST_INSTALL # AC_LIBTOOL_PICMODE([MODE]) # -------------------------- # implement the --with-pic flag # MODE is either `yes' or `no'. If omitted, it defaults to `both'. AC_DEFUN([AC_LIBTOOL_PICMODE], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl pic_mode=ifelse($#,1,$1,default) ])# AC_LIBTOOL_PICMODE # AC_PROG_EGREP # ------------- # This is predefined starting with Autoconf 2.54, so this conditional # definition can be removed once we require Autoconf 2.54 or later. m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP], [AC_CACHE_CHECK([for egrep], [ac_cv_prog_egrep], [if echo a | (grep -E '(a|b)') >/dev/null 2>&1 then ac_cv_prog_egrep='grep -E' else ac_cv_prog_egrep='egrep' fi]) EGREP=$ac_cv_prog_egrep AC_SUBST([EGREP]) ])]) # AC_PATH_TOOL_PREFIX # ------------------- # find a file program which can recognise shared library AC_DEFUN([AC_PATH_TOOL_PREFIX], [AC_REQUIRE([AC_PROG_EGREP])dnl AC_MSG_CHECKING([for $1]) AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, [case $MAGIC_CMD in [[\\/*] | ?:[\\/]*]) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR dnl $ac_dummy forces splitting on constant user-supplied paths. dnl POSIX.2 word splitting is done only on the output of word expansions, dnl not every word. This closes a longstanding sh security hole. ac_dummy="ifelse([$2], , $PATH, [$2])" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$1; then lt_cv_path_MAGIC_CMD="$ac_dir/$1" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac]) MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then AC_MSG_RESULT($MAGIC_CMD) else AC_MSG_RESULT(no) fi ])# AC_PATH_TOOL_PREFIX # AC_PATH_MAGIC # ------------- # find a file program which can recognise a shared library AC_DEFUN([AC_PATH_MAGIC], [AC_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then AC_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) else MAGIC_CMD=: fi fi ])# AC_PATH_MAGIC # AC_PROG_LD # ---------- # find the pathname to the GNU or non-GNU linker AC_DEFUN([AC_PROG_LD], [AC_ARG_WITH([gnu-ld], [AC_HELP_STRING([--with-gnu-ld], [assume the C compiler uses GNU ld @<:@default=no@:>@])], [test "$withval" = no || with_gnu_ld=yes], [with_gnu_ld=no]) AC_REQUIRE([LT_AC_PROG_SED])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by $CC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]]* | ?:[[\\/]]*) re_direlt='/[[^/]][[^/]]*/\.\./' # Canonicalize the pathname of ld ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL(lt_cv_path_LD, [if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some GNU ld's only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD)/i[[3-9]]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; gnu*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case "$host_cpu" in ia64*) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'] lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be Linux ELF. linux*) lt_cv_deplibs_check_method=pass_all ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; nto-qnx*) lt_cv_deplibs_check_method=unknown ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; sco3.2v5*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; esac ;; sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; esac ]) file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown ])# AC_DEPLIBS_CHECK_METHOD # AC_PROG_NM # ---------- # find the pathname to a BSD-compatible name lister AC_DEFUN([AC_PROG_NM], [AC_CACHE_CHECK([for BSD-compatible nm], lt_cv_path_NM, [if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/${ac_tool_prefix}nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac esac fi done IFS="$lt_save_ifs" test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm fi]) NM="$lt_cv_path_NM" ])# AC_PROG_NM # AC_CHECK_LIBM # ------------- # check for math library AC_DEFUN([AC_CHECK_LIBM], [AC_REQUIRE([AC_CANONICAL_HOST])dnl LIBM= case $host in *-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*) # These system don't have libm, or don't need it ;; *-ncr-sysv4.3*) AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") ;; *) AC_CHECK_LIB(m, cos, LIBM="-lm") ;; esac ])# AC_CHECK_LIBM # AC_LIBLTDL_CONVENIENCE([DIRECTORY]) # ----------------------------------- # sets LIBLTDL to the link flags for the libltdl convenience library and # LTDLINCL to the include flags for the libltdl header and adds # --enable-ltdl-convenience to the configure arguments. Note that LIBLTDL # and LTDLINCL are not AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If # DIRECTORY is not provided, it is assumed to be `libltdl'. LIBLTDL will # be prefixed with '${top_builddir}/' and LTDLINCL will be prefixed with # '${top_srcdir}/' (note the single quotes!). If your package is not # flat and you're not using automake, define top_builddir and # top_srcdir appropriately in the Makefiles. AC_DEFUN([AC_LIBLTDL_CONVENIENCE], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl case $enable_ltdl_convenience in no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;; "") enable_ltdl_convenience=yes ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;; esac LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdlc.la LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) # For backwards non-gettext consistent compatibility... INCLTDL="$LTDLINCL" ])# AC_LIBLTDL_CONVENIENCE # AC_LIBLTDL_INSTALLABLE([DIRECTORY]) # ----------------------------------- # sets LIBLTDL to the link flags for the libltdl installable library and # LTDLINCL to the include flags for the libltdl header and adds # --enable-ltdl-install to the configure arguments. Note that LIBLTDL # and LTDLINCL are not AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If # DIRECTORY is not provided and an installed libltdl is not found, it is # assumed to be `libltdl'. LIBLTDL will be prefixed with '${top_builddir}/' # and LTDLINCL will be prefixed with '${top_srcdir}/' (note the single # quotes!). If your package is not flat and you're not using automake, # define top_builddir and top_srcdir appropriately in the Makefiles. # In the future, this macro may have to be called after AC_PROG_LIBTOOL. AC_DEFUN([AC_LIBLTDL_INSTALLABLE], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl AC_CHECK_LIB(ltdl, lt_dlinit, [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no], [if test x"$enable_ltdl_install" = xno; then AC_MSG_WARN([libltdl not installed, but installation disabled]) else enable_ltdl_install=yes fi ]) if test x"$enable_ltdl_install" = x"yes"; then ac_configure_args="$ac_configure_args --enable-ltdl-install" LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdl.la LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) else ac_configure_args="$ac_configure_args --enable-ltdl-install=no" LIBLTDL="-lltdl" LTDLINCL= fi # For backwards non-gettext consistent compatibility... INCLTDL="$LTDLINCL" ])# AC_LIBLTDL_INSTALLABLE # AC_LIBTOOL_CXX # -------------- # enable support for C++ libraries AC_DEFUN([AC_LIBTOOL_CXX], [AC_REQUIRE([_LT_AC_LANG_CXX]) ])# AC_LIBTOOL_CXX # _LT_AC_LANG_CXX # --------------- AC_DEFUN([_LT_AC_LANG_CXX], [AC_REQUIRE([AC_PROG_CXX]) AC_REQUIRE([_LT_AC_PROG_CXXCPP]) _LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}CXX]) ])# _LT_AC_LANG_CXX # _LT_AC_PROG_CXXCPP # --------------- AC_DEFUN([_LT_AC_PROG_CXXCPP], [ AC_REQUIRE([AC_PROG_CXX]) if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then AC_PROG_CXXCPP fi ])# _LT_AC_PROG_CXXCPP # AC_LIBTOOL_F77 # -------------- # enable support for Fortran 77 libraries AC_DEFUN([AC_LIBTOOL_F77], [AC_REQUIRE([_LT_AC_LANG_F77]) ])# AC_LIBTOOL_F77 # _LT_AC_LANG_F77 # --------------- AC_DEFUN([_LT_AC_LANG_F77], [AC_REQUIRE([AC_PROG_F77]) _LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}F77]) ])# _LT_AC_LANG_F77 # AC_LIBTOOL_GCJ # -------------- # enable support for GCJ libraries AC_DEFUN([AC_LIBTOOL_GCJ], [AC_REQUIRE([_LT_AC_LANG_GCJ]) ])# AC_LIBTOOL_GCJ # _LT_AC_LANG_GCJ # --------------- AC_DEFUN([_LT_AC_LANG_GCJ], [AC_PROVIDE_IFELSE([AC_PROG_GCJ],[], [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],[], [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ],[], [ifdef([AC_PROG_GCJ],[AC_REQUIRE([AC_PROG_GCJ])], [ifdef([A][M_PROG_GCJ],[AC_REQUIRE([A][M_PROG_GCJ])], [AC_REQUIRE([A][C_PROG_GCJ_OR_A][M_PROG_GCJ])])])])])]) _LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}GCJ]) ])# _LT_AC_LANG_GCJ # AC_LIBTOOL_RC # -------------- # enable support for Windows resource files AC_DEFUN([AC_LIBTOOL_RC], [AC_REQUIRE([LT_AC_PROG_RC]) _LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}RC]) ])# AC_LIBTOOL_RC # AC_LIBTOOL_LANG_C_CONFIG # ------------------------ # Ensure that the configuration vars for the C compiler are # suitably defined. Those variables are subsequently used by # AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG], [_LT_AC_LANG_C_CONFIG]) AC_DEFUN([_LT_AC_LANG_C_CONFIG], [lt_save_CC="$CC" AC_LANG_PUSH(C) # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o _LT_AC_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;\n" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}\n' _LT_AC_SYS_COMPILER # # Check for any special shared library compilation flags. # _LT_AC_TAGVAR(lt_prog_cc_shlib, $1)= if test "$GCC" = no; then case $host_os in sco3.2v5*) _LT_AC_TAGVAR(lt_prog_cc_shlib, $1)='-belf' ;; esac fi if test -n "$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)"; then AC_MSG_WARN([`$CC' requires `$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)' to build shared libraries]) if echo "$old_CC $old_CFLAGS " | grep "[[ ]]$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)[[ ]]" >/dev/null; then : else AC_MSG_WARN([add `$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)' to the CC or CFLAGS env variable and reconfigure]) _LT_AC_TAGVAR(lt_cv_prog_cc_can_build_shared, $1)=no fi fi # # Check to make sure the static flag actually works. # AC_LIBTOOL_LINKER_OPTION([if $compiler static flag $_LT_AC_TAGVAR(lt_prog_compiler_static, $1) works], _LT_AC_TAGVAR(lt_prog_compiler_static_works, $1), $_LT_AC_TAGVAR(lt_prog_compiler_static, $1), [], [_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=]) AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1) AC_LIBTOOL_PROG_COMPILER_PIC($1) AC_LIBTOOL_PROG_CC_C_O($1) AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) AC_LIBTOOL_PROG_LD_SHLIBS($1) AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) AC_LIBTOOL_SYS_LIB_STRIP AC_LIBTOOL_DLOPEN_SELF($1) # Report which librarie types wil actually be built AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case "$host_os" in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix4* | aix5*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) AC_LIBTOOL_CONFIG($1) AC_LANG_POP CC="$lt_save_CC" ])# AC_LIBTOOL_LANG_C_CONFIG # AC_LIBTOOL_LANG_CXX_CONFIG # -------------------------- # Ensure that the configuration vars for the C compiler are # suitably defined. Those variables are subsequently used by # AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG], [_LT_AC_LANG_CXX_CONFIG(CXX)]) AC_DEFUN([_LT_AC_LANG_CXX_CONFIG], [AC_LANG_PUSH(C++) AC_REQUIRE([AC_PROG_CXX]) AC_REQUIRE([_LT_AC_PROG_CXXCPP]) _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no _LT_AC_TAGVAR(allow_undefined_flag, $1)= _LT_AC_TAGVAR(always_export_symbols, $1)=no _LT_AC_TAGVAR(archive_expsym_cmds, $1)= _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= _LT_AC_TAGVAR(hardcode_minus_L, $1)=no _LT_AC_TAGVAR(hardcode_automatic, $1)=no _LT_AC_TAGVAR(module_cmds, $1)= _LT_AC_TAGVAR(module_expsym_cmds, $1)= _LT_AC_TAGVAR(link_all_deplibs, $1)=unknown _LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_AC_TAGVAR(no_undefined_flag, $1)= _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Dependencies to place before and after the object being linked: _LT_AC_TAGVAR(predep_objects, $1)= _LT_AC_TAGVAR(postdep_objects, $1)= _LT_AC_TAGVAR(predeps, $1)= _LT_AC_TAGVAR(postdeps, $1)= _LT_AC_TAGVAR(compiler_lib_search_path, $1)= # Source file extension for C++ test sources. ac_ext=cc # Object file extension for compiled C++ test sources. objext=o _LT_AC_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;\n" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[]) { return(0); }\n' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_AC_SYS_COMPILER # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} compiler=$CC _LT_AC_TAGVAR(compiler, $1)=$CC cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` # We don't want -fno-exception wen compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' else _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration AC_PROG_LD # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | \ grep 'no-whole-archive' > /dev/null; then _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) _LT_AC_TAGVAR(ld_shlibs, $1)=yes case $host_os in aix3*) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; aix4* | aix5*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_AC_TAGVAR(archive_cmds, $1)='' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_AC_TAGVAR(link_all_deplibs, $1)=yes if test "$GXX" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 _LT_AC_TAGVAR(hardcode_direct, $1)=yes else # We have old collect2 _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= fi esac shared_flag='-shared' else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. _LT_AC_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an empty executable. _LT_AC_SYS_LIBPATH_AIX _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an empty executable. _LT_AC_SYS_LIBPATH_AIX _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' # -bexpall does not export symbols beginning with underscore (_) _LT_AC_TAGVAR(always_export_symbols, $1)=yes # Exported symbols can be pulled into shared objects from archives _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=' ' _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds it's shared libraries. _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac ;; cygwin* | mingw* | pw32*) # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_AC_TAGVAR(always_export_symbols, $1)=no _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' else _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; darwin* | rhapsody*) case "$host_os" in rhapsody* | darwin1.[[012]]) _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}suppress' ;; *) # Darwin 1.3 on if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' else case ${MACOSX_DEPLOYMENT_TARGET} in 10.[[012]]) _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}dynamic_lookup' ;; esac fi ;; esac _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_automatic, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='' _LT_AC_TAGVAR(link_all_deplibs, $1)=yes if test "$GXX" = yes ; then lt_int_apple_cc_single_mod=no output_verbose_link_cmd='echo' if $CC -dumpspecs 2>&1 | $EGREP 'single_module' >/dev/null ; then lt_int_apple_cc_single_mod=yes fi if test "X$lt_int_apple_cc_single_mod" = Xyes ; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' else _LT_AC_TAGVAR(archive_cmds, $1)='$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' fi _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's if test "X$lt_int_apple_cc_single_mod" = Xyes ; then _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' else _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' fi _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' else case "$cc_basename" in xlc*) output_verbose_link_cmd='echo' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ;; *) _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac fi ;; dgux*) case $cc_basename in ec++) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; ghcx) # Green Hills C++ Compiler # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac ;; freebsd[12]*) # C++ shared libraries reported to be fairly broken before switch to ELF _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; freebsd-elf*) _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no ;; freebsd* | kfreebsd*-gnu) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions _LT_AC_TAGVAR(ld_shlibs, $1)=yes ;; gnu*) ;; hpux9*) _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; aCC) _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "[-]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes; then _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then case "$host_cpu" in hppa*64*) _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: ;; ia64*) _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' ;; *) _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; esac fi case "$host_cpu" in hppa*64*) _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; ia64*) _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. ;; *) _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; aCC) case "$host_cpu" in hppa*64*|ia64*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' ;; *) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case "$host_cpu" in ia64*|hppa*64*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' ;; *) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; irix5* | irix6*) case $cc_basename in CC) # SGI C++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' else _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib' fi fi _LT_AC_TAGVAR(link_all_deplibs, $1)=yes ;; esac _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: ;; linux*) case $cc_basename in KCC) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath,$libdir' _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; cxx) # Compaq C++ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; esac ;; lynxos*) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; m88k*) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; mvs*) case $cc_basename in cxx) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; openbsd2*) # C++ shared libraries are fairly broken _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; openbsd*) _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd='echo' ;; osf3*) case $cc_basename in KCC) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; RCC) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; cxx) _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' else # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; osf4* | osf5*) case $cc_basename in KCC) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using # the KAI C++ compiler. _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; RCC) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; cxx) _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry $objdir/so_locations -o $lib~ $rm $lib.exp' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' else # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; sco*) _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no case $cc_basename in CC) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac ;; sunos4*) case $cc_basename in CC) # Sun C++ 4.x # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; lcc) # Lucid # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac ;; solaris*) case $cc_basename in CC) # Sun C++ 4.2, 5.x and Centerline C++ _LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -nolib -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -nolib ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The C++ compiler is used as linker so we must use $wl # flag to pass the commands to the underlying system # linker. # Supported since Solaris 2.6 (maybe 2.5.1?) _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac _LT_AC_TAGVAR(link_all_deplibs, $1)=yes # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep "\-[[LR]]"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; gcx) # Green Hills C++ Compiler _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' if $CC --version | grep -v '^2\.7' > /dev/null; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" fi _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' fi ;; esac ;; sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7*) _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no ;; tandem*) case $cc_basename in NCC) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_AC_TAGVAR(GCC, $1)="$GXX" _LT_AC_TAGVAR(LD, $1)="$LD" AC_LIBTOOL_POSTDEP_PREDEP($1) AC_LIBTOOL_PROG_COMPILER_PIC($1) AC_LIBTOOL_PROG_CC_C_O($1) AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) AC_LIBTOOL_PROG_LD_SHLIBS($1) AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) AC_LIBTOOL_SYS_LIB_STRIP AC_LIBTOOL_DLOPEN_SELF($1) AC_LIBTOOL_CONFIG($1) AC_LANG_POP CC=$lt_save_CC LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ldcxx=$with_gnu_ld with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld ])# AC_LIBTOOL_LANG_CXX_CONFIG # AC_LIBTOOL_POSTDEP_PREDEP([TAGNAME]) # ------------------------ # Figure out "hidden" library dependencies from verbose # compiler output when linking a shared library. # Parse the compiler output and extract the necessary # objects, libraries and library flags. AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP],[ dnl we can't use the lt_simple_compile_test_code here, dnl because it contains code intended for an executable, dnl not a library. It's possible we should let each dnl tag define a new lt_????_link_test_code variable, dnl but it's only used here... ifelse([$1],[],[cat > conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext <> "$cfgfile" ifelse([$1], [], [#! $SHELL # `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) # NOTE: Changes made to this file will be lost: look at ltmain.sh. # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 # Free Software Foundation, Inc. # # This file is part of GNU Libtool: # Originally by Gordon Matzigkeit , 1996 # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # A sed program that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. Xsed="$SED -e s/^X//" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # The names of the tagged configurations supported by this script. available_tags= # ### BEGIN LIBTOOL CONFIG], [# ### BEGIN LIBTOOL TAG CONFIG: $tagname]) # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$_LT_AC_TAGVAR(archive_cmds_need_lc, $1) # Whether or not to disallow shared libs when runtime libs are static allow_libtool_libs_with_static_runtimes=$_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1) # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # The host system. host_alias=$host_alias host=$host # An echo program that does not interpret backslashes. echo=$lt_echo # The archiver. AR=$lt_AR AR_FLAGS=$lt_AR_FLAGS # A C compiler. LTCC=$lt_LTCC # A language-specific compiler. CC=$lt_[]_LT_AC_TAGVAR(compiler, $1) # Is the compiler the GNU C compiler? with_gcc=$_LT_AC_TAGVAR(GCC, $1) # An ERE matcher. EGREP=$lt_EGREP # The linker used to build libraries. LD=$lt_[]_LT_AC_TAGVAR(LD, $1) # Whether we need hard or soft links. LN_S=$lt_LN_S # A BSD-compatible nm program. NM=$lt_NM # A symbol stripping program STRIP=$lt_STRIP # Used to examine libraries when file_magic_cmd begins "file" MAGIC_CMD=$MAGIC_CMD # Used on cygwin: DLL creation program. DLLTOOL="$DLLTOOL" # Used on cygwin: object dumper. OBJDUMP="$OBJDUMP" # Used on cygwin: assembler. AS="$AS" # The name of the directory that contains temporary libtool files. objdir=$objdir # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # How to pass a linker flag through the compiler. wl=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) # Object file suffix (normally "o"). objext="$ac_objext" # Old archive suffix (normally "a"). libext="$libext" # Shared library suffix (normally ".so"). shrext_cmds='$shrext_cmds' # Executable file suffix (normally ""). exeext="$exeext" # Additional compiler flags for building library objects. pic_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) pic_mode=$pic_mode # What is the maximum length of a command? max_cmd_len=$lt_cv_sys_max_cmd_len # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_[]_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1) # Must we lock files when doing compilation ? need_locks=$lt_need_locks # Do we need the lib prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Compiler flag to prevent dynamic linking. link_static_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_static, $1) # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_[]_LT_AC_TAGVAR(export_dynamic_flag_spec, $1) # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_[]_LT_AC_TAGVAR(whole_archive_flag_spec, $1) # Compiler flag to generate thread-safe objects. thread_safe_flag_spec=$lt_[]_LT_AC_TAGVAR(thread_safe_flag_spec, $1) # Library versioning type. version_type=$version_type # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME. library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Commands used to build and install an old-style archive. RANLIB=$lt_RANLIB old_archive_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_cmds, $1) old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_new_cmds, $1) # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) # Commands used to build and install a shared archive. archive_cmds=$lt_[]_LT_AC_TAGVAR(archive_cmds, $1) archive_expsym_cmds=$lt_[]_LT_AC_TAGVAR(archive_expsym_cmds, $1) postinstall_cmds=$lt_postinstall_cmds postuninstall_cmds=$lt_postuninstall_cmds # Commands used to build a loadable module (assumed same as above if empty) module_cmds=$lt_[]_LT_AC_TAGVAR(module_cmds, $1) module_expsym_cmds=$lt_[]_LT_AC_TAGVAR(module_expsym_cmds, $1) # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # Dependencies to place before the objects being linked to create a # shared library. predep_objects=$lt_[]_LT_AC_TAGVAR(predep_objects, $1) # Dependencies to place after the objects being linked to create a # shared library. postdep_objects=$lt_[]_LT_AC_TAGVAR(postdep_objects, $1) # Dependencies to place before the objects being linked to create a # shared library. predeps=$lt_[]_LT_AC_TAGVAR(predeps, $1) # Dependencies to place after the objects being linked to create a # shared library. postdeps=$lt_[]_LT_AC_TAGVAR(postdeps, $1) # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_[]_LT_AC_TAGVAR(compiler_lib_search_path, $1) # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method == file_magic. file_magic_cmd=$lt_file_magic_cmd # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_[]_LT_AC_TAGVAR(allow_undefined_flag, $1) # Flag that forces no undefined symbols. no_undefined_flag=$lt_[]_LT_AC_TAGVAR(no_undefined_flag, $1) # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # Same as above, but a single script fragment to be evaled but not shown. finish_eval=$lt_finish_eval # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # This is the shared library runtime path variable. runpath_var=$runpath_var # This is the shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # How to hardcode a shared library path into an executable. hardcode_action=$_LT_AC_TAGVAR(hardcode_action, $1) # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist. hardcode_libdir_flag_spec=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) # If ld is used when linking, flag to hardcode \$libdir into # a binary during linking. This must work even if \$libdir does # not exist. hardcode_libdir_flag_spec_ld=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1) # Whether we need a single -rpath flag with a separated argument. hardcode_libdir_separator=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_separator, $1) # Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the # resulting binary. hardcode_direct=$_LT_AC_TAGVAR(hardcode_direct, $1) # Set to yes if using the -LDIR flag during linking hardcodes DIR into the # resulting binary. hardcode_minus_L=$_LT_AC_TAGVAR(hardcode_minus_L, $1) # Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into # the resulting binary. hardcode_shlibpath_var=$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1) # Set to yes if building a shared library automatically hardcodes DIR into the library # and all subsequent libraries and executables linked against it. hardcode_automatic=$_LT_AC_TAGVAR(hardcode_automatic, $1) # Variables whose values should be saved in libtool wrapper scripts and # restored at relink time. variables_saved_for_relink="$variables_saved_for_relink" # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$_LT_AC_TAGVAR(link_all_deplibs, $1) # Compile-time system search path for libraries sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Fix the shell variable \$srcfile for the compiler. fix_srcfile_path="$_LT_AC_TAGVAR(fix_srcfile_path, $1)" # Set to yes if exported symbols are required. always_export_symbols=$_LT_AC_TAGVAR(always_export_symbols, $1) # The commands to list exported symbols. export_symbols_cmds=$lt_[]_LT_AC_TAGVAR(export_symbols_cmds, $1) # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_[]_LT_AC_TAGVAR(exclude_expsyms, $1) # Symbols that must always be exported. include_expsyms=$lt_[]_LT_AC_TAGVAR(include_expsyms, $1) ifelse([$1],[], [# ### END LIBTOOL CONFIG], [# ### END LIBTOOL TAG CONFIG: $tagname]) __EOF__ ifelse([$1],[], [ case $host_os in aix3*) cat <<\EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi EOF ;; esac # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1) mv -f "$cfgfile" "$ofile" || \ (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ]) else # If there is no Makefile yet, we rely on a make rule to execute # `config.status --recheck' to rerun these tests and create the # libtool script then. ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` if test -f "$ltmain_in"; then test -f Makefile && make "$ltmain" fi fi ])# AC_LIBTOOL_CONFIG # AC_LIBTOOL_PROG_COMPILER_NO_RTTI([TAGNAME]) # ------------------------------------------- AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= if test "$GCC" = yes; then _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' AC_LIBTOOL_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], lt_cv_prog_compiler_rtti_exceptions, [-fno-rtti -fno-exceptions], [], [_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) fi ])# AC_LIBTOOL_PROG_COMPILER_NO_RTTI # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE # --------------------------------- AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([AC_PROG_NM]) AC_REQUIRE([AC_OBJEXT]) # Check for command to grab the raw symbol name followed by C symbol from nm. AC_MSG_CHECKING([command to parse $NM output from $compiler object]) AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], [ # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[[BCDEGRST]]' # Regexp to match symbols that can be accessed directly from C. sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' # Transform the above into a raw symbol and a C symbol. symxfrm='\1 \2\3 \3' # Transform an extracted symbol line into a proper C declaration lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" # Define system-specific variables. case $host_os in aix*) symcode='[[BCDT]]' ;; cygwin* | mingw* | pw32*) symcode='[[ABCDGISTW]]' ;; hpux*) # Its linker distinguishes data from code symbols if test "$host_cpu" = ia64; then symcode='[[ABCDEGRST]]' fi lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" ;; linux*) if test "$host_cpu" = ia64; then symcode='[[ABCDGIRSTW]]' lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" fi ;; irix* | nonstopux*) symcode='[[BCDEGRST]]' ;; osf*) symcode='[[BCDEGQRST]]' ;; solaris* | sysv5*) symcode='[[BDRT]]' ;; sysv4) symcode='[[DFNSTU]]' ;; esac # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[[ABCDGIRSTW]]' ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Write the raw and C identifiers. lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*\($ac_symprfx\)$sympat$opt_cr$/$symxfrm/p'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext < $nlist) && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if grep ' nm_test_var$' "$nlist" >/dev/null; then if grep ' nm_test_func$' "$nlist" >/dev/null; then cat < conftest.$ac_ext #ifdef __cplusplus extern "C" { #endif EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext' cat <> conftest.$ac_ext #if defined (__STDC__) && __STDC__ # define lt_ptr_t void * #else # define lt_ptr_t char * # define const #endif /* The mapping between symbol names and symbols. */ const struct { const char *name; lt_ptr_t address; } lt_preloaded_symbols[[]] = { EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext cat <<\EOF >> conftest.$ac_ext {0, (lt_ptr_t) 0} }; #ifdef __cplusplus } #endif EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_save_LIBS="$LIBS" lt_save_CFLAGS="$CFLAGS" LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS="$lt_save_LIBS" CFLAGS="$lt_save_CFLAGS" else echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD fi else echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD cat conftest.$ac_ext >&5 fi rm -f conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done ]) if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then AC_MSG_RESULT(failed) else AC_MSG_RESULT(ok) fi ]) # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE # AC_LIBTOOL_PROG_COMPILER_PIC([TAGNAME]) # --------------------------------------- AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC], [_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)= _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= _LT_AC_TAGVAR(lt_prog_compiler_static, $1)= AC_MSG_CHECKING([for $compiler option to produce PIC]) ifelse([$1],[CXX],[ # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | os2* | pw32*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= ;; sysv4*MP*) if test -d /usr/nec; then _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; hpux*) # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case "$host_cpu" in hppa*64*|ia64*) ;; *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac else case $host_os in aix4* | aix5*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68) # Green Hills C++ Compiler # _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; darwin*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files case "$cc_basename" in xlc*) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon' _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ;; esac ;; dgux*) case $cc_basename in ec++) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; ghcx) # Green Hills C++ Compiler _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; freebsd* | kfreebsd*-gnu) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" if test "$host_cpu" != ia64; then _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' fi ;; aCC) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" case "$host_cpu" in hppa*64*|ia64*) # +Z the default ;; *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac ;; *) ;; esac ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux*) case $cc_basename in KCC) # KAI C++ Compiler _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; icpc) # Intel C++ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; cxx) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' ;; *) ;; esac ;; netbsd*) ;; osf3* | osf4* | osf5*) case $cc_basename in KCC) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' ;; RCC) # Rational C++ 2.4.1 _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; cxx) # Digital/Compaq C++ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) ;; esac ;; psos*) ;; sco*) case $cc_basename in CC) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; *) ;; esac ;; solaris*) case $cc_basename in CC) # Sun C++ 4.2, 5.x and Centerline C++ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; gcx) # Green Hills C++ Compiler _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC) # Sun C++ 4.x _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; lcc) # Lucid _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; tandem*) case $cc_basename in NCC) # NonStop-UX NCC 3.20 _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; *) ;; esac ;; unixware*) ;; vxworks*) ;; *) _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ], [ if test "$GCC" = yes; then _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no enable_shared=no ;; sysv4*MP*) if test -d /usr/nec; then _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; hpux*) # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case "$host_cpu" in hppa*64*|ia64*) # +Z the default ;; *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; darwin*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files case "$cc_basename" in xlc*) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon' _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ;; esac ;; mingw* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case "$host_cpu" in hppa*64*|ia64*) # +Z the default ;; *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC (with -KPIC) is the default. _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; newsos6) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; linux*) case $CC in icc* | ecc*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; ccc*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All Alpha code is PIC. _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; esac ;; osf3* | osf4* | osf5*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All OSF/1 code is PIC. _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; sco3.2v5*) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kpic' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-dn' ;; solaris*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sunos4*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; uts4*) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *) _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ]) AC_MSG_RESULT([$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)]) # # Check to make sure the PIC flag actually works. # if test -n "$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)"; then AC_LIBTOOL_COMPILER_OPTION([if $compiler PIC flag $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) works], _LT_AC_TAGVAR(lt_prog_compiler_pic_works, $1), [$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])], [], [case $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) in "" | " "*) ;; *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)" ;; esac], [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) fi case "$host_os" in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= ;; *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])" ;; esac ]) # AC_LIBTOOL_PROG_LD_SHLIBS([TAGNAME]) # ------------------------------------ # See if the linker supports building shared libraries. AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) ifelse([$1],[CXX],[ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' case $host_os in aix4* | aix5*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm if $NM -V 2>&1 | grep 'GNU' > /dev/null; then _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' else _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) _LT_AC_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" ;; cygwin* | mingw*) _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGS]] /s/.* \([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols' ;; *) _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac ],[ runpath_var= _LT_AC_TAGVAR(allow_undefined_flag, $1)= _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no _LT_AC_TAGVAR(archive_cmds, $1)= _LT_AC_TAGVAR(archive_expsym_cmds, $1)= _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)= _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1)= _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= _LT_AC_TAGVAR(thread_safe_flag_spec, $1)= _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_minus_L, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_AC_TAGVAR(link_all_deplibs, $1)=unknown _LT_AC_TAGVAR(hardcode_automatic, $1)=no _LT_AC_TAGVAR(module_cmds, $1)= _LT_AC_TAGVAR(module_expsym_cmds, $1)= _LT_AC_TAGVAR(always_export_symbols, $1)=no _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list _LT_AC_TAGVAR(include_expsyms, $1)= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. _LT_AC_TAGVAR(exclude_expsyms, $1)="_GLOBAL_OFFSET_TABLE_" # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; openbsd*) with_gnu_ld=no ;; esac _LT_AC_TAGVAR(ld_shlibs, $1)=yes if test "$with_gnu_ld" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # See if GNU ld supports shared libraries. case $host_os in aix3* | aix4* | aix5*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then _LT_AC_TAGVAR(ld_shlibs, $1)=no cat <&2 *** Warning: the GNU linker, at least up to release 2.9.1, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to modify your PATH *** so that a non-GNU linker is found, and then restart. EOF fi ;; amigaos*) _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Samuel A. Falvo II reports # that the semantics of dynamic libraries on AmigaOS, at least up # to version 4, is to share data among multiple programs linked # with the same dynamic library. Since this doesn't match the # behavior of shared libraries on other platforms, we can't use # them. _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; beos*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; cygwin* | mingw* | pw32*) # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_AC_TAGVAR(always_export_symbols, $1)=no _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGS]] /s/.* \([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols' if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' else ld_shlibs=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris* | sysv5*) if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then _LT_AC_TAGVAR(ld_shlibs, $1)=no cat <&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. EOF elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; sunos4*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; linux*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then tmp_archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_AC_TAGVAR(archive_cmds, $1)="$tmp_archive_cmds" supports_anon_versioning=no case `$LD -v 2>/dev/null` in *\ [01].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac if test $supports_anon_versioning = yes; then _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ $echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' else _LT_AC_TAGVAR(archive_expsym_cmds, $1)="$tmp_archive_cmds" fi else _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; esac if test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = yes; then runpath_var=LD_RUN_PATH _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= fi fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_AC_TAGVAR(always_export_symbols, $1)=yes _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes if test "$GCC" = yes && test -z "$link_static_flag"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported fi ;; aix4* | aix5*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm if $NM -V 2>&1 | grep 'GNU' > /dev/null; then _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' else _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_AC_TAGVAR(archive_cmds, $1)='' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_AC_TAGVAR(link_all_deplibs, $1)=yes if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 _LT_AC_TAGVAR(hardcode_direct, $1)=yes else # We have old collect2 _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= fi esac shared_flag='-shared' else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. _LT_AC_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an empty executable. _LT_AC_SYS_LIBPATH_AIX _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an empty executable. _LT_AC_SYS_LIBPATH_AIX _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' # -bexpall does not export symbols beginning with underscore (_) _LT_AC_TAGVAR(always_export_symbols, $1)=yes # Exported symbols can be pulled into shared objects from archives _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=' ' _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds it's shared libraries. _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # see comment about different semantics on the GNU ld section _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; bsdi[[45]]*) _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic ;; cygwin* | mingw* | pw32*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_AC_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='true' # FIXME: Should let the user specify the lib program. _LT_AC_TAGVAR(old_archive_cmds, $1)='lib /OUT:$oldlib$oldobjs$old_deplibs' fix_srcfile_path='`cygpath -w "$srcfile"`' _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; darwin* | rhapsody*) case "$host_os" in rhapsody* | darwin1.[[012]]) _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}suppress' ;; *) # Darwin 1.3 on if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' else case ${MACOSX_DEPLOYMENT_TARGET} in 10.[[012]]) _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}dynamic_lookup' ;; esac fi ;; esac _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_automatic, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='' _LT_AC_TAGVAR(link_all_deplibs, $1)=yes if test "$GCC" = yes ; then output_verbose_link_cmd='echo' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' else case "$cc_basename" in xlc*) output_verbose_link_cmd='echo' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ;; *) _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac fi ;; dgux*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; freebsd1*) _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | kfreebsd*-gnu) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; hpux9*) if test "$GCC" = yes; then _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: _LT_AC_TAGVAR(hardcode_direct, $1)=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; hpux10* | hpux11*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then case "$host_cpu" in hppa*64*|ia64*) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case "$host_cpu" in hppa*64*|ia64*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' ;; *) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' ;; esac fi if test "$with_gnu_ld" = no; then case "$host_cpu" in hppa*64*) _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; ia64*) _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_direct, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes ;; *) _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir' fi _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: _LT_AC_TAGVAR(link_all_deplibs, $1)=yes ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; newsos6) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; openbsd*) _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' else case $host_os in openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' ;; *) _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' ;; esac fi ;; os2*) _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_AC_TAGVAR(archive_cmds, $1)='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' fi _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' else _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' # Both c and cxx compiler support -rpath directly _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' fi _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: ;; sco3.2v5*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ;; solaris*) _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text' if test "$GCC" = yes; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' else _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' fi _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # Supported since Solaris 2.6 (maybe 2.5.1?) _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; esac _LT_AC_TAGVAR(link_all_deplibs, $1)=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4) case $host_vendor in sni) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_direct, $1)=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' _LT_AC_TAGVAR(hardcode_direct, $1)=no ;; motorola) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4.3*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes _LT_AC_TAGVAR(ld_shlibs, $1)=yes fi ;; sysv4.2uw2*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_direct, $1)=yes _LT_AC_TAGVAR(hardcode_minus_L, $1)=no _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no hardcode_runpath_var=yes runpath_var=LD_RUN_PATH ;; sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7*) _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z ${wl}text' if test "$GCC" = yes; then _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' fi runpath_var='LD_RUN_PATH' _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv5*) _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text' # $CC -shared without GNU ld will not create a library from C++ # object files and a static libstdc++, better avoid it by now _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' ;; uts4*) _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac fi ]) AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi # # Do we need to explicitly link libc? # case "x$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)" in x|xyes) # Assume -lc should be added _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $_LT_AC_TAGVAR(archive_cmds, $1) in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. AC_MSG_CHECKING([whether -lc should be explicitly linked in]) $rm conftest* printf "$lt_simple_compile_test_code" > conftest.$ac_ext if AC_TRY_EVAL(ac_compile) 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$_LT_AC_TAGVAR(allow_undefined_flag, $1) _LT_AC_TAGVAR(allow_undefined_flag, $1)= if AC_TRY_EVAL(_LT_AC_TAGVAR(archive_cmds, $1) 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) then _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no else _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes fi _LT_AC_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $rm conftest* AC_MSG_RESULT([$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)]) ;; esac fi ;; esac ])# AC_LIBTOOL_PROG_LD_SHLIBS # _LT_AC_FILE_LTDLL_C # ------------------- # Be careful that the start marker always follows a newline. AC_DEFUN([_LT_AC_FILE_LTDLL_C], [ # /* ltdll.c starts here */ # #define WIN32_LEAN_AND_MEAN # #include # #undef WIN32_LEAN_AND_MEAN # #include # # #ifndef __CYGWIN__ # # ifdef __CYGWIN32__ # # define __CYGWIN__ __CYGWIN32__ # # endif # #endif # # #ifdef __cplusplus # extern "C" { # #endif # BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved); # #ifdef __cplusplus # } # #endif # # #ifdef __CYGWIN__ # #include # DECLARE_CYGWIN_DLL( DllMain ); # #endif # HINSTANCE __hDllInstance_base; # # BOOL APIENTRY # DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved) # { # __hDllInstance_base = hInst; # return TRUE; # } # /* ltdll.c ends here */ ])# _LT_AC_FILE_LTDLL_C # _LT_AC_TAGVAR(VARNAME, [TAGNAME]) # --------------------------------- AC_DEFUN([_LT_AC_TAGVAR], [ifelse([$2], [], [$1], [$1_$2])]) # old names AC_DEFUN([AM_PROG_LIBTOOL], [AC_PROG_LIBTOOL]) AC_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) AC_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) AC_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) AC_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) AC_DEFUN([AM_PROG_LD], [AC_PROG_LD]) AC_DEFUN([AM_PROG_NM], [AC_PROG_NM]) # This is just to silence aclocal about the macro not being used ifelse([AC_DISABLE_FAST_INSTALL]) AC_DEFUN([LT_AC_PROG_GCJ], [AC_CHECK_TOOL(GCJ, gcj, no) test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" AC_SUBST(GCJFLAGS) ]) AC_DEFUN([LT_AC_PROG_RC], [AC_CHECK_TOOL(RC, windres, no) ]) # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_SED. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # # LT_AC_PROG_SED # -------------- # Check for a fully-functional sed program, that truncates # as few characters as possible. Prefer GNU sed if found. AC_DEFUN([LT_AC_PROG_SED], [AC_MSG_CHECKING([for a sed that does not truncate output]) AC_CACHE_VAL(lt_cv_path_SED, [# Loop through the user's path and test for sed and gsed. # Then use that list of sed's as ones to test for truncation. as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for lt_ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" fi done done done lt_ac_max=0 lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do test ! -f $lt_ac_sed && break cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in # Check for GNU sed and select it if it is found. if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then lt_cv_path_SED=$lt_ac_sed break fi while true; do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo >>conftest.nl $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break cmp -s conftest.out conftest.nl || break # 10000 chars as input seems more than enough test $lt_ac_count -gt 10 && break lt_ac_count=`expr $lt_ac_count + 1` if test $lt_ac_count -gt $lt_ac_max; then lt_ac_max=$lt_ac_count lt_cv_path_SED=$lt_ac_sed fi done done ]) SED=$lt_cv_path_SED AC_MSG_RESULT([$SED]) ]) nagios-4.3.4/tap/compile000077500000000000000000000071571314764422400151650ustar00rootroot00000000000000#! /bin/sh # Wrapper for compilers which do not understand `-c -o'. scriptversion=2004-10-12.08 # Copyright (C) 1999, 2000, 2003, 2004 Free Software Foundation, Inc. # Written by Tom Tromey . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . case $1 in '') echo "$0: No command. Try \`$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: compile [--help] [--version] PROGRAM [ARGS] Wrapper for compilers which do not understand `-c -o'. Remove `-o dest.o' from ARGS, run PROGRAM with the remaining arguments, and rename the output as expected. If you are trying to build a whole package this is not the right script to run: please start by reading the file `INSTALL'. Report bugs to . EOF exit 0 ;; -v | --v*) echo "compile $scriptversion" exit 0 ;; esac ofile= cfile= eat= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as `compile cc -o foo foo.c'. # So we strip `-o arg' only if arg is an object. eat=1 case $2 in *.o | *.obj) ofile=$2 ;; *) set x "$@" -o "$2" shift ;; esac ;; *.c) cfile=$1 set x "$@" "$1" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -z "$ofile" || test -z "$cfile"; then # If no `-o' option was seen then we might have been invoked from a # pattern rule where we don't need one. That is ok -- this is a # normal compilation that the losing compiler can handle. If no # `.c' file was seen then we are probably linking. That is also # ok. exec "$@" fi # Name of file we expect compiler to create. cofile=`echo "$cfile" | sed -e 's|^.*/||' -e 's/\.c$/.o/'` # Create the lock directory. # Note: use `[/.-]' here to ensure that we don't use the same name # that we are using for the .o file. Also, base the name on the expected # object file name, since that is what matters with a parallel build. lockdir=`echo "$cofile" | sed -e 's|[/.-]|_|g'`.d while true; do if mkdir "$lockdir" >/dev/null 2>&1; then break fi sleep 1 done # FIXME: race condition here if user kills between mkdir and trap. trap "rmdir '$lockdir'; exit 1" 1 2 15 # Run the compile. "$@" ret=$? if test -f "$cofile"; then mv "$cofile" "$ofile" elif test -f "${cofile}bj"; then mv "${cofile}bj" "$ofile" fi rmdir "$lockdir" exit $ret # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: nagios-4.3.4/tap/config.guess000077500000000000000000001220651314764422400161230ustar00rootroot00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003 Free Software Foundation, Inc. timestamp='2003-07-02' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Per Bothner . # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # The plan is that this can be called by configure scripts if you # don't specify an explicit build system type. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit 0 ;; --version | -v ) echo "$version" ; exit 0 ;; --help | --h* | -h ) echo "$usage"; exit 0 ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d -q "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep __ELF__ >/dev/null then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit 0 ;; amiga:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; arc:OpenBSD:*:*) echo mipsel-unknown-openbsd${UNAME_RELEASE} exit 0 ;; hp300:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mac68k:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; macppc:OpenBSD:*:*) echo powerpc-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mvme68k:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mvme88k:OpenBSD:*:*) echo m88k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mvmeppc:OpenBSD:*:*) echo powerpc-unknown-openbsd${UNAME_RELEASE} exit 0 ;; pmax:OpenBSD:*:*) echo mipsel-unknown-openbsd${UNAME_RELEASE} exit 0 ;; sgi:OpenBSD:*:*) echo mipseb-unknown-openbsd${UNAME_RELEASE} exit 0 ;; sun3:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; wgrisc:OpenBSD:*:*) echo mipsel-unknown-openbsd${UNAME_RELEASE} exit 0 ;; *:OpenBSD:*:*) echo ${UNAME_MACHINE}-unknown-openbsd${UNAME_RELEASE} exit 0 ;; alpha:OSF1:*:*) if test $UNAME_RELEASE = "V4.0"; then UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` fi # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` exit 0 ;; Alpha*:OpenVMS:*:*) echo alpha-hp-vms exit 0 ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit 0 ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit 0 ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit 0;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit 0 ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit 0 ;; *:OS/390:*:*) echo i370-ibm-openedition exit 0 ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit 0;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit 0;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit 0 ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit 0 ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit 0 ;; DRS?6000:UNIX_SV:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7 && exit 0 ;; esac ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; i86pc:SunOS:5.*:*) echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit 0 ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit 0 ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit 0 ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit 0 ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit 0 ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit 0 ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit 0 ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit 0 ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit 0 ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit 0 ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit 0 ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit 0 ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit 0 ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit 0 ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit 0 ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c \ && $dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ && exit 0 echo mips-mips-riscos${UNAME_RELEASE} exit 0 ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit 0 ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit 0 ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit 0 ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit 0 ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit 0 ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit 0 ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit 0 ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit 0 ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit 0 ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit 0 ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit 0 ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit 0 ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit 0 ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit 0 ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit 0 ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0 echo rs6000-ibm-aix3.2.5 elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit 0 ;; *:AIX:*:[45]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit 0 ;; *:AIX:*:*) echo rs6000-ibm-aix exit 0 ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit 0 ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit 0 ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit 0 ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit 0 ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit 0 ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit 0 ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then # avoid double evaluation of $set_cc_for_build test -n "$CC_FOR_BUILD" || eval $set_cc_for_build if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E -) | grep __LP64__ >/dev/null then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit 0 ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit 0 ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0 echo unknown-hitachi-hiuxwe2 exit 0 ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit 0 ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit 0 ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit 0 ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit 0 ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit 0 ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit 0 ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit 0 ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit 0 ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit 0 ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit 0 ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit 0 ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit 0 ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; *:UNICOS/mp:*:*) echo nv1-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit 0 ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit 0 ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit 0 ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit 0 ;; *:FreeBSD:*:*|*:GNU/FreeBSD:*:*) # Determine whether the default compiler uses glibc. eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include #if __GLIBC__ >= 2 LIBC=gnu #else LIBC= #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` # GNU/FreeBSD systems have a "k" prefix to indicate we are using # FreeBSD's kernel, but not the complete OS. case ${LIBC} in gnu) kernel_only='k' ;; esac echo ${UNAME_MACHINE}-unknown-${kernel_only}freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`${LIBC:+-$LIBC} exit 0 ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit 0 ;; i*:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit 0 ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit 0 ;; x86:Interix*:[34]*) echo i586-pc-interix${UNAME_RELEASE}|sed -e 's/\..*//' exit 0 ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit 0 ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit 0 ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit 0 ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit 0 ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; *:GNU:*:*) echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit 0 ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit 0 ;; arm*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; cris:Linux:*:*) echo cris-axis-linux-gnu exit 0 ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; mips:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips #undef mipsel #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mipsel #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0 ;; mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips64 #undef mips64el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mips64el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips64 #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0 ;; ppc:Linux:*:*) echo powerpc-unknown-linux-gnu exit 0 ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-gnu exit 0 ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} exit 0 ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-gnu ;; PA8*) echo hppa2.0-unknown-linux-gnu ;; *) echo hppa-unknown-linux-gnu ;; esac exit 0 ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-gnu exit 0 ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit 0 ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; x86_64:Linux:*:*) echo x86_64-unknown-linux-gnu exit 0 ;; i*86:Linux:*:*) # The BFD linker knows what the default object file format is, so # first see if it will tell us. cd to the root directory to prevent # problems with other programs or directories called `ld' in the path. # Set LC_ALL=C to ensure ld outputs messages in English. ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ | sed -ne '/supported targets:/!d s/[ ][ ]*/ /g s/.*supported targets: *// s/ .*// p'` case "$ld_supported_targets" in elf32-i386) TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" ;; a.out-i386-linux) echo "${UNAME_MACHINE}-pc-linux-gnuaout" exit 0 ;; coff-i386) echo "${UNAME_MACHINE}-pc-linux-gnucoff" exit 0 ;; "") # Either a pre-BFD a.out linker (linux-gnuoldld) or # one that does not give us useful --help. echo "${UNAME_MACHINE}-pc-linux-gnuoldld" exit 0 ;; esac # Determine whether the default compiler is a.out or elf eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include #ifdef __ELF__ # ifdef __GLIBC__ # if __GLIBC__ >= 2 LIBC=gnu # else LIBC=gnulibc1 # endif # else LIBC=gnulibc1 # endif #else #ifdef __INTEL_COMPILER LIBC=gnu #else LIBC=gnuaout #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` test x"${LIBC}" != x && echo "${UNAME_MACHINE}-pc-linux-${LIBC}" && exit 0 test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0 ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit 0 ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit 0 ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit 0 ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit 0 ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit 0 ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit 0 ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit 0 ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit 0 ;; i*86:*:5:[78]*) case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit 0 ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit 0 ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i386. echo i386-pc-msdosdjgpp exit 0 ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit 0 ;; paragon:*:*:*) echo i860-intel-osf1 exit 0 ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit 0 ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit 0 ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit 0 ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit 0 ;; M68*:*:R3V[567]*:*) test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; 3[34]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && echo i486-ncr-sysv4.3${OS_REL} && exit 0 /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && echo i486-ncr-sysv4 && exit 0 ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit 0 ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit 0 ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit 0 ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit 0 ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit 0 ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit 0 ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit 0 ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit 0 ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit 0 ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit 0 ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit 0 ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit 0 ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit 0 ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit 0 ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit 0 ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit 0 ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit 0 ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit 0 ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit 0 ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit 0 ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit 0 ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit 0 ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit 0 ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit 0 ;; *:Darwin:*:*) case `uname -p` in *86) UNAME_PROCESSOR=i686 ;; powerpc) UNAME_PROCESSOR=powerpc ;; esac echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit 0 ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit 0 ;; *:QNX:*:4*) echo i386-pc-qnx exit 0 ;; NSR-[DGKLNPTVW]:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit 0 ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit 0 ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit 0 ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit 0 ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit 0 ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit 0 ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit 0 ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit 0 ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit 0 ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit 0 ;; *:ITS:*:*) echo pdp10-unknown-its exit 0 ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit 0 ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && $dummy && exit 0 # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit 0 ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit 0 ;; c34*) echo c34-convex-bsd exit 0 ;; c38*) echo c38-convex-bsd exit 0 ;; c4*) echo c4-convex-bsd exit 0 ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: nagios-4.3.4/tap/config.sub000077500000000000000000000731531314764422400155710ustar00rootroot00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003 Free Software Foundation, Inc. timestamp='2003-07-04' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software # can handle that machine. It does not imply ALL GNU software can. # # This file is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit 0 ;; --version | -v ) echo "$version" ; exit 0 ;; --help | --h* | -h ) echo "$usage"; exit 0 ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit 0;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | kfreebsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis) os= basic_machine=$1 ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | i370 | i860 | i960 | ia64 \ | ip2k \ | m32r | m68000 | m68k | m88k | mcore \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64vr | mips64vrel \ | mips64orion | mips64orionel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | msp430 \ | ns16k | ns32k \ | openrisc | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ | pyramid \ | sh | sh[1234] | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv9 | sparcv9b \ | strongarm \ | tahoe | thumb | tic4x | tic80 | tron \ | v850 | v850e \ | we32k \ | x86 | xscale | xstormy16 | xtensa \ | z8k) basic_machine=$basic_machine-unknown ;; m6811 | m68hc11 | m6812 | m68hc12) # Motorola 68HC11/12. basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | amd64-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* \ | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ | clipper-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* \ | m32r-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | mcore-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64vr-* | mips64vrel-* \ | mips64orion-* | mips64orionel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ | msp430-* \ | none-* | np1-* | nv1-* | ns16k-* | ns32k-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ | pyramid-* \ | romp-* | rs6000-* \ | sh-* | sh[1234]-* | sh[23]e-* | sh[34]eb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \ | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \ | tahoe-* | thumb-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tron-* \ | v850-* | v850e-* | vax-* \ | we32k-* \ | x86-* | x86_64-* | xps100-* | xscale-* | xstormy16-* \ | xtensa-* \ | ymp-* \ | z8k-*) ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; c90) basic_machine=c90-cray os=-unicos ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; crds | unos) basic_machine=m68k-crds ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; # I'm not sure what "Sysv32" means. Should this be sysv3.2? i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; mmix*) basic_machine=mmix-knuth os=-mmixware ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; mvs) basic_machine=i370-ibm os=-mvs ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; nv1) basic_machine=nv1-cray os=-unicosmp ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; or32 | or32-*) basic_machine=or32-unknown os=-coff ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc) basic_machine=powerpc-unknown ;; ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tic54x | c54x*) basic_machine=tic54x-unknown os=-coff ;; tic55x | c55x*) basic_machine=tic55x-unknown os=-coff ;; tic6x | c6x*) basic_machine=tic6x-unknown os=-coff ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xps | xps100) basic_machine=xps100-honeywell ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh3 | sh4 | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sh64) basic_machine=sh64-unknown ;; sparc | sparcv9 | sparcv9b) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -netbsd* | -openbsd* | -kfreebsd* | -freebsd* | -riscix* \ | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* \ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -kaos*) os=-kaos ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 # This also exists in the configure program, but was not the # default. # os=-sunos4 ;; m68*-cisco) os=-aout ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-ibm) os=-aix ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -ptx*) vendor=sequent ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: nagios-4.3.4/tap/configure000077500000000000000000025005551314764422400155200ustar00rootroot00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.59 for tap 1.01. # # Copyright (C) 2003 Free Software Foundation, Inc. # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then set -o posix fi DUALCASE=1; export DUALCASE # for MKS sh # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # Work around bugs in pre-3.0 UWIN ksh. $as_unset ENV MAIL MAILPATH PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. for as_var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else $as_unset $as_var fi done # Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi # Name of the executable. as_me=`$as_basename "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)$' \| \ . : '\(.\)' 2>/dev/null || echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } /^X\/\(\/\/\)$/{ s//\1/; q; } /^X\/\(\/\).*/{ s//\1/; q; } s/.*/./; q'` # PATH needs CR, and LINENO needs CR and PATH. # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" || { # Find who we are. Look in the path if we contain no path at all # relative or not. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2 { (exit 1); exit 1; }; } fi case $CONFIG_SHELL in '') as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for as_base in sh bash ksh sh5; do case $as_dir in /*) if ("$as_dir/$as_base" -c ' as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } CONFIG_SHELL=$as_dir/$as_base export CONFIG_SHELL exec "$CONFIG_SHELL" "$0" ${1+"$@"} fi;; esac done done ;; esac # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line before each line; the second 'sed' does the real # work. The second script uses 'N' to pair each line-number line # with the numbered line, and appends trailing '-' during # substitution so that $LINENO is not a special case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) sed '=' <$as_myself | sed ' N s,$,-, : loop s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, t loop s,-$,, s,^['$as_cr_digits']*\n,, ' >$as_me.lineno && chmod +x $as_me.lineno || { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 { (exit 1); exit 1; }; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensible to this). . ./$as_me.lineno # Exit status is that of the last command. exit } case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in *c*,-n*) ECHO_N= ECHO_C=' ' ECHO_T=' ' ;; *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; *) ECHO_N= ECHO_C='\c' ECHO_T= ;; esac if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file echo >conf$$.file if ln -s conf$$.file conf$$ 2>/dev/null; then # We could just check for DJGPP; but this test a) works b) is more generic # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). if test -f conf$$.exe; then # Don't use ln at all; we don't have any links as_ln_s='cp -p' else as_ln_s='ln -s' fi elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.file if mkdir -p . 2>/dev/null; then as_mkdir_p=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_executable_p="test -f" # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" # IFS # We need space, tab and new line, in precisely that order. as_nl=' ' IFS=" $as_nl" # CDPATH. $as_unset CDPATH # Check that we are running under the correct shell. SHELL=${CONFIG_SHELL-/bin/sh} case X$ECHO in X*--fallback-echo) # Remove one level of quotation (which was required for Make). ECHO=`echo "$ECHO" | sed 's,\\\\\$\\$0,'$0','` ;; esac echo=${ECHO-echo} if test "X$1" = X--no-reexec; then # Discard the --no-reexec flag, and continue. shift elif test "X$1" = X--fallback-echo; then # Avoid inline document here, it may be left over : elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then # Yippee, $echo works! : else # Restart under the correct shell. exec $SHELL "$0" --no-reexec ${1+"$@"} fi if test "X$1" = X--fallback-echo; then # used as fallback echo shift cat </dev/null 2>&1 && unset CDPATH if test -z "$ECHO"; then if test "X${echo_test_string+set}" != Xset; then # find a string as large as possible, as long as the shell can cope with it for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... if (echo_test_string="`eval $cmd`") 2>/dev/null && echo_test_string="`eval $cmd`" && (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null then break fi done fi if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then : else # The Solaris, AIX, and Digital Unix default echo programs unquote # backslashes. This makes it impossible to quote backslashes using # echo "$something" | sed 's/\\/\\\\/g' # # So, first we look for a working echo in the user's PATH. lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for dir in $PATH /usr/ucb; do IFS="$lt_save_ifs" if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then echo="$dir/echo" break fi done IFS="$lt_save_ifs" if test "X$echo" = Xecho; then # We didn't find a better echo, so look for alternatives. if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then # This shell has a builtin print -r that does the trick. echo='print -r' elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && test "X$CONFIG_SHELL" != X/bin/ksh; then # If we have ksh, try running configure again with it. ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} export ORIGINAL_CONFIG_SHELL CONFIG_SHELL=/bin/ksh export CONFIG_SHELL exec $CONFIG_SHELL "$0" --no-reexec ${1+"$@"} else # Try using printf. echo='printf %s\n' if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then # Cool, printf works : elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && test "X$echo_testing_string" = 'X\t' && echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL export CONFIG_SHELL SHELL="$CONFIG_SHELL" export SHELL echo="$CONFIG_SHELL $0 --fallback-echo" elif echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && test "X$echo_testing_string" = 'X\t' && echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then echo="$CONFIG_SHELL $0 --fallback-echo" else # maybe with a smaller string... prev=: for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null then break fi prev="$cmd" done if test "$prev" != 'sed 50q "$0"'; then echo_test_string=`eval $prev` export echo_test_string exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "$0" ${1+"$@"} else # Oops. We lost completely, so just stick with echo. echo=echo fi fi fi fi fi fi # Copy echo and quote the copy suitably for passing to libtool from # the Makefile, instead of quoting the original, which is used later. ECHO=$echo if test "X$ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo" fi tagnames=${tagnames+${tagnames},}CXX tagnames=${tagnames+${tagnames},}F77 # Name of the host. # hostname on some systems (SVR3.2, Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` exec 6>&1 # # Initializations. # ac_default_prefix=/usr/local ac_config_libobj_dir=. cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= SHELL=${CONFIG_SHELL-/bin/sh} # Maximum number of lines to put in a shell here document. # This variable seems obsolete. It should probably be removed, and # only ac_max_sed_lines should be used. : ${ac_max_here_lines=38} # Identity of this package. PACKAGE_NAME='tap' PACKAGE_TARNAME='tap' PACKAGE_VERSION='1.01' PACKAGE_STRING='tap 1.01' PACKAGE_BUGREPORT='' ac_unique_file="src/tap.c" # Factoring default headers for most tests. ac_includes_default="\ #include #if HAVE_SYS_TYPES_H # include #endif #if HAVE_SYS_STAT_H # include #endif #if STDC_HEADERS # include # include #else # if HAVE_STDLIB_H # include # endif #endif #if HAVE_STRING_H # if !STDC_HEADERS && HAVE_MEMORY_H # include # endif # include #endif #if HAVE_STRINGS_H # include #endif #if HAVE_INTTYPES_H # include #else # if HAVE_STDINT_H # include # endif #endif #if HAVE_UNISTD_H # include #endif" ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE build build_cpu build_vendor build_os host host_cpu host_vendor host_os EGREP LN_S ECHO AR ac_ct_AR RANLIB ac_ct_RANLIB CPP CXX CXXFLAGS ac_ct_CXX CXXDEPMODE am__fastdepCXX_TRUE am__fastdepCXX_FALSE CXXCPP F77 FFLAGS ac_ct_F77 LIBTOOL LIBOBJS LTLIBOBJS' ac_subst_files='' # Initialize some variables set by options. ac_init_help= ac_init_version=false # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datadir='${prefix}/share' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' libdir='${exec_prefix}/lib' includedir='${prefix}/include' oldincludedir='/usr/include' infodir='${prefix}/info' mandir='${prefix}/man' ac_prev= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval "$ac_prev=\$ac_option" ac_prev= continue fi ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'` # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_option in -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad | --data | --dat | --da) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ | --da=*) datadir=$ac_optarg ;; -disable-* | --disable-*) ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/-/_/g'` eval "enable_$ac_feature=no" ;; -enable-* | --enable-*) ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/-/_/g'` case $ac_option in *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; *) ac_optarg=yes ;; esac eval "enable_$ac_feature='$ac_optarg'" ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst \ | --locals | --local | --loca | --loc | --lo) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* \ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package| sed 's/-/_/g'` case $ac_option in *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; *) ac_optarg=yes ;; esac eval "with_$ac_package='$ac_optarg'" ;; -without-* | --without-*) ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package | sed 's/-/_/g'` eval "with_$ac_package=no" ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) { echo "$as_me: error: unrecognized option: $ac_option Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; } ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 { (exit 1); exit 1; }; } ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` eval "$ac_envvar='$ac_optarg'" export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` { echo "$as_me: error: missing argument to $ac_option" >&2 { (exit 1); exit 1; }; } fi # Be sure to have absolute paths. for ac_var in exec_prefix prefix do eval ac_val=$`echo $ac_var` case $ac_val in [\\/$]* | ?:[\\/]* | NONE | '' ) ;; *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 { (exit 1); exit 1; }; };; esac done # Be sure to have absolute paths. for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \ localstatedir libdir includedir oldincludedir infodir mandir do eval ac_val=$`echo $ac_var` case $ac_val in [\\/$]* | ?:[\\/]* ) ;; *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 { (exit 1); exit 1; }; };; esac done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used." >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then its parent. ac_confdir=`(dirname "$0") 2>/dev/null || $as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$0" : 'X\(//\)[^/]' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$0" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` srcdir=$ac_confdir if test ! -r $srcdir/$ac_unique_file; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r $srcdir/$ac_unique_file; then if test "$ac_srcdir_defaulted" = yes; then { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2 { (exit 1); exit 1; }; } else { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 { (exit 1); exit 1; }; } fi fi (cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null || { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2 { (exit 1); exit 1; }; } srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'` ac_env_build_alias_set=${build_alias+set} ac_env_build_alias_value=$build_alias ac_cv_env_build_alias_set=${build_alias+set} ac_cv_env_build_alias_value=$build_alias ac_env_host_alias_set=${host_alias+set} ac_env_host_alias_value=$host_alias ac_cv_env_host_alias_set=${host_alias+set} ac_cv_env_host_alias_value=$host_alias ac_env_target_alias_set=${target_alias+set} ac_env_target_alias_value=$target_alias ac_cv_env_target_alias_set=${target_alias+set} ac_cv_env_target_alias_value=$target_alias ac_env_CC_set=${CC+set} ac_env_CC_value=$CC ac_cv_env_CC_set=${CC+set} ac_cv_env_CC_value=$CC ac_env_CFLAGS_set=${CFLAGS+set} ac_env_CFLAGS_value=$CFLAGS ac_cv_env_CFLAGS_set=${CFLAGS+set} ac_cv_env_CFLAGS_value=$CFLAGS ac_env_LDFLAGS_set=${LDFLAGS+set} ac_env_LDFLAGS_value=$LDFLAGS ac_cv_env_LDFLAGS_set=${LDFLAGS+set} ac_cv_env_LDFLAGS_value=$LDFLAGS ac_env_CPPFLAGS_set=${CPPFLAGS+set} ac_env_CPPFLAGS_value=$CPPFLAGS ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set} ac_cv_env_CPPFLAGS_value=$CPPFLAGS ac_env_CPP_set=${CPP+set} ac_env_CPP_value=$CPP ac_cv_env_CPP_set=${CPP+set} ac_cv_env_CPP_value=$CPP ac_env_CXX_set=${CXX+set} ac_env_CXX_value=$CXX ac_cv_env_CXX_set=${CXX+set} ac_cv_env_CXX_value=$CXX ac_env_CXXFLAGS_set=${CXXFLAGS+set} ac_env_CXXFLAGS_value=$CXXFLAGS ac_cv_env_CXXFLAGS_set=${CXXFLAGS+set} ac_cv_env_CXXFLAGS_value=$CXXFLAGS ac_env_CXXCPP_set=${CXXCPP+set} ac_env_CXXCPP_value=$CXXCPP ac_cv_env_CXXCPP_set=${CXXCPP+set} ac_cv_env_CXXCPP_value=$CXXCPP ac_env_F77_set=${F77+set} ac_env_F77_value=$F77 ac_cv_env_F77_set=${F77+set} ac_cv_env_F77_value=$F77 ac_env_FFLAGS_set=${FFLAGS+set} ac_env_FFLAGS_value=$FFLAGS ac_cv_env_FFLAGS_set=${FFLAGS+set} ac_cv_env_FFLAGS_value=$FFLAGS # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures tap 1.01 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] _ACEOF cat <<_ACEOF Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --datadir=DIR read-only architecture-independent data [PREFIX/share] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --infodir=DIR info documentation [PREFIX/info] --mandir=DIR man documentation [PREFIX/man] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of tap 1.01:";; esac cat <<\_ACEOF Optional Features: --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors --enable-shared[=PKGS] build shared libraries [default=yes] --enable-static[=PKGS] build static libraries [default=yes] --enable-fast-install[=PKGS] optimize for fast installation [default=yes] --disable-libtool-lock avoid locking (might break parallel builds) Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-pic try to use only PIC/non-PIC objects [default=use both] --with-tags[=TAGS] include additional configurations [automatic] Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory CPPFLAGS C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor CXX C++ compiler command CXXFLAGS C++ compiler flags CXXCPP C++ preprocessor F77 Fortran 77 compiler command FFLAGS Fortran 77 compiler flags Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. _ACEOF fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. ac_popdir=`pwd` for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d $ac_dir || continue ac_builddir=. if test "$ac_dir" != .; then ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A "../" for each directory in $ac_dir_suffix. ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` else ac_dir_suffix= ac_top_builddir= fi case $srcdir in .) # No --srcdir option. We are building in place. ac_srcdir=. if test -z "$ac_top_builddir"; then ac_top_srcdir=. else ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` fi ;; [\\/]* | ?:[\\/]* ) # Absolute path. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ;; *) # Relative path. ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_builddir$srcdir ;; esac # Do not use `cd foo && pwd` to compute absolute paths, because # the directories may not exist. case `pwd` in .) ac_abs_builddir="$ac_dir";; *) case "$ac_dir" in .) ac_abs_builddir=`pwd`;; [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; *) ac_abs_builddir=`pwd`/"$ac_dir";; esac;; esac case $ac_abs_builddir in .) ac_abs_top_builddir=${ac_top_builddir}.;; *) case ${ac_top_builddir}. in .) ac_abs_top_builddir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; esac;; esac case $ac_abs_builddir in .) ac_abs_srcdir=$ac_srcdir;; *) case $ac_srcdir in .) ac_abs_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; esac;; esac case $ac_abs_builddir in .) ac_abs_top_srcdir=$ac_top_srcdir;; *) case $ac_top_srcdir in .) ac_abs_top_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; esac;; esac cd $ac_dir # Check for guested configure; otherwise get Cygnus style configure. if test -f $ac_srcdir/configure.gnu; then echo $SHELL $ac_srcdir/configure.gnu --help=recursive elif test -f $ac_srcdir/configure; then echo $SHELL $ac_srcdir/configure --help=recursive elif test -f $ac_srcdir/configure.ac || test -f $ac_srcdir/configure.in; then echo $ac_configure --help else echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi cd $ac_popdir done fi test -n "$ac_init_help" && exit 0 if $ac_init_version; then cat <<\_ACEOF tap configure 1.01 generated by GNU Autoconf 2.59 Copyright (C) 2003 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit 0 fi exec 5>config.log cat >&5 <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by tap $as_me 1.01, which was generated by GNU Autoconf 2.59. Invocation command line was $ $0 $@ _ACEOF { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` hostinfo = `(hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. echo "PATH: $as_dir" done } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_sep= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; 2) ac_configure_args1="$ac_configure_args1 '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" # Get rid of the leading space. ac_sep=" " ;; esac done done $as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } $as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Be sure not to use single quotes in there, as some shells, # such as our DU 5.0 friend, will then `close' the trap. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo cat <<\_ASBOX ## ---------------- ## ## Cache variables. ## ## ---------------- ## _ASBOX echo # The following way of writing the cache mishandles newlines in values, { (set) 2>&1 | case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in *ac_space=\ *) sed -n \ "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" ;; *) sed -n \ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" ;; esac; } echo cat <<\_ASBOX ## ----------------- ## ## Output variables. ## ## ----------------- ## _ASBOX echo for ac_var in $ac_subst_vars do eval ac_val=$`echo $ac_var` echo "$ac_var='"'"'$ac_val'"'"'" done | sort echo if test -n "$ac_subst_files"; then cat <<\_ASBOX ## ------------- ## ## Output files. ## ## ------------- ## _ASBOX echo for ac_var in $ac_subst_files do eval ac_val=$`echo $ac_var` echo "$ac_var='"'"'$ac_val'"'"'" done | sort echo fi if test -s confdefs.h; then cat <<\_ASBOX ## ----------- ## ## confdefs.h. ## ## ----------- ## _ASBOX echo sed "/^$/d" confdefs.h | sort echo fi test "$ac_signal" != 0 && echo "$as_me: caught signal $ac_signal" echo "$as_me: exit $exit_status" } >&5 rm -f core *.core && rm -rf conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -rf conftest* confdefs.h # AIX cpp loses on an empty file, so make sure it contains at least a newline. echo >confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer explicitly selected file to automatically selected ones. if test -z "$CONFIG_SITE"; then if test "x$prefix" != xNONE; then CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" else CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi fi for ac_site_file in $CONFIG_SITE; do if test -r "$ac_site_file"; then { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special # files actually), so we avoid doing that. if test -f "$cache_file"; then { echo "$as_me:$LINENO: loading cache $cache_file" >&5 echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . $cache_file;; *) . ./$cache_file;; esac fi else { echo "$as_me:$LINENO: creating cache $cache_file" >&5 echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in `(set) 2>&1 | sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val="\$ac_cv_env_${ac_var}_value" eval ac_new_val="\$ac_env_${ac_var}_value" case $ac_old_set,$ac_new_set in set,) { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 echo "$as_me: former value: $ac_old_val" >&2;} { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 echo "$as_me: current value: $ac_new_val" >&2;} ac_cache_corrupted=: fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 echo "$as_me: error: changes in the environment can compromise the build" >&2;} { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} { (exit 1); exit 1; }; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu am__api_version="1.9" ac_aux_dir= for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do if test -f $ac_dir/install-sh; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f $ac_dir/install.sh; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f $ac_dir/shtool; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5 echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;} { (exit 1); exit 1; }; } fi ac_config_guess="$SHELL $ac_aux_dir/config.guess" ac_config_sub="$SHELL $ac_aux_dir/config.sub" ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 if test -z "$INSTALL"; then if test "${ac_cv_path_install+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in ./ | .// | /cC/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi done done ;; esac done fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. We don't cache a # path for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the path is relative. INSTALL=$ac_install_sh fi fi echo "$as_me:$LINENO: result: $INSTALL" >&5 echo "${ECHO_T}$INSTALL" >&6 # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' echo "$as_me:$LINENO: checking whether build environment is sane" >&5 echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6 # Just in case sleep 1 echo timestamp > conftest.file # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t $srcdir/configure conftest.file` fi rm -f conftest.file if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". { { echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken alias in your environment" >&5 echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken alias in your environment" >&2;} { (exit 1); exit 1; }; } fi test "$2" = conftest.file ) then # Ok. : else { { echo "$as_me:$LINENO: error: newly created file is older than distributed files! Check your system clock" >&5 echo "$as_me: error: newly created file is older than distributed files! Check your system clock" >&2;} { (exit 1); exit 1; }; } fi echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 test "$program_prefix" != NONE && program_transform_name="s,^,$program_prefix,;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s,\$,$program_suffix,;$program_transform_name" # Double any \ or $. echo might interpret backslashes. # By default was `s,x,x', remove it if useless. cat <<\_ACEOF >conftest.sed s/[\\$]/&&/g;s/;s,x,x,$// _ACEOF program_transform_name=`echo $program_transform_name | sed -f conftest.sed` rm conftest.sed # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= { echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5 echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} fi if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then # We used to keeping the `.' as first argument, in order to # allow $(mkdir_p) to be used without argument. As in # $(mkdir_p) $(somedir) # where $(somedir) is conditionally defined. However this is wrong # for two reasons: # 1. if the package is installed by a user who cannot write `.' # make install will fail, # 2. the above comment should most certainly read # $(mkdir_p) $(DESTDIR)$(somedir) # so it does not work when $(somedir) is undefined and # $(DESTDIR) is not. # To support the latter case, we have to write # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir), # so the `.' trick is pointless. mkdir_p='mkdir -p --' else # On NextStep and OpenStep, the `mkdir' command does not # recognize any option. It will interpret all options as # directories to create, and then abort because `.' already # exists. for d in ./-p ./--version; do test -d $d && rmdir $d done # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists. if test -f "$ac_aux_dir/mkinstalldirs"; then mkdir_p='$(mkinstalldirs)' else mkdir_p='$(install_sh) -d' fi fi for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_AWK+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then echo "$as_me:$LINENO: result: $AWK" >&5 echo "${ECHO_T}$AWK" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$AWK" && break done echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6 set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'` if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.make <<\_ACEOF all: @echo 'ac_maketemp="$(MAKE)"' _ACEOF # GNU make sometimes prints "make[1]: Entering...", which would confuse us. eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=` if test -n "$ac_maketemp"; then eval ac_cv_prog_make_${ac_make}_set=yes else eval ac_cv_prog_make_${ac_make}_set=no fi rm -f conftest.make fi if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 SET_MAKE= else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null # test to see if srcdir already configured if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5 echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;} { (exit 1); exit 1; }; } fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='tap' VERSION='1.01' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} install_sh=${install_sh-"$am_aux_dir/install-sh"} # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_STRIP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then echo "$as_me:$LINENO: result: $STRIP" >&5 echo "${ECHO_T}$STRIP" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":" fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 echo "${ECHO_T}$ac_ct_STRIP" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi STRIP=$ac_ct_STRIP else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. AMTAR=${AMTAR-"${am_missing_run}tar"} am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi CC=$ac_ct_CC else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="cc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi CC=$ac_ct_CC else CC="$ac_cv_prog_CC" fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$ac_ct_CC" && break done CC=$ac_ct_CC fi fi test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&5 echo "$as_me: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } # Provide some information about the compiler. echo "$as_me:$LINENO:" \ "checking for C compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` { (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 (eval $ac_compiler --version &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 (eval $ac_compiler -v &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 (eval $ac_compiler -V &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6 ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5 (eval $ac_link_default) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # Find the output, starting from the most likely. This scheme is # not robust to junk in `.', hence go to wildcards (a.*) only as a last # resort. # Be careful to initialize this variable, since it used to be cached. # Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile. ac_cv_exeext= # b.out is created by i960 compilers. for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;; conftest.$ac_ext ) # This is the source file. ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` # FIXME: I believe we export ac_cv_exeext for Libtool, # but it would be cool to find out if it's true. Does anybody # maintain Libtool? --akim. export ac_cv_exeext break;; * ) break;; esac done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { echo "$as_me:$LINENO: error: C compiler cannot create executables See \`config.log' for more details." >&5 echo "$as_me: error: C compiler cannot create executables See \`config.log' for more details." >&2;} { (exit 77); exit 77; }; } fi ac_exeext=$ac_cv_exeext echo "$as_me:$LINENO: result: $ac_file" >&5 echo "${ECHO_T}$ac_file" >&6 # Check the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. echo "$as_me:$LINENO: checking whether the C compiler works" >&5 echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6 # FIXME: These cross compiler hacks should be removed for Autoconf 3.0 # If not cross compiling, check that we can run a simple program. if test "$cross_compiling" != yes; then if { ac_try='./$ac_file' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { echo "$as_me:$LINENO: error: cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." >&5 echo "$as_me: error: cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi fi fi echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 rm -f a.out a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save # Check the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6 echo "$as_me:$LINENO: result: $cross_compiling" >&5 echo "${ECHO_T}$cross_compiling" >&6 echo "$as_me:$LINENO: checking for suffix of executables" >&5 echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6 if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` export ac_cv_exeext break;; * ) break;; esac done else { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f conftest$ac_cv_exeext echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 echo "${ECHO_T}$ac_cv_exeext" >&6 rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT echo "$as_me:$LINENO: checking for suffix of object files" >&5 echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6 if test "${ac_cv_objext+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute suffix of object files: cannot compile See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 echo "${ECHO_T}$ac_cv_objext" >&6 OBJEXT=$ac_cv_objext ac_objext=$OBJEXT echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6 if test "${ac_cv_c_compiler_gnu+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_compiler_gnu=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_compiler_gnu=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6 GCC=`test $ac_compiler_gnu = yes && echo yes` ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS CFLAGS="-g" echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6 if test "${ac_cv_prog_cc_g+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_prog_cc_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_prog_cc_g=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 echo "${ECHO_T}$ac_cv_prog_cc_g" >&6 if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5 echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6 if test "${ac_cv_prog_cc_stdc+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_prog_cc_stdc=no ac_save_CC=$CC cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std1 is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std1. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF # Don't try gcc -ansi; that turns off useful extensions and # breaks some systems' header files. # AIX -qlanglvl=ansi # Ultrix and OSF/1 -std1 # HP-UX 10.20 and later -Ae # HP-UX older versions -Aa -D_HPUX_SOURCE # SVR4 -Xc -D__EXTENSIONS__ for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_prog_cc_stdc=$ac_arg break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext done rm -f conftest.$ac_ext conftest.$ac_objext CC=$ac_save_CC fi case "x$ac_cv_prog_cc_stdc" in x|xno) echo "$as_me:$LINENO: result: none needed" >&5 echo "${ECHO_T}none needed" >&6 ;; *) echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5 echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6 CC="$CC $ac_cv_prog_cc_stdc" ;; esac # Some people use a C++ compiler to compile C. Since we use `exit', # in C++ we need to declare it. In case someone uses the same compiler # for both compiling C and C++ we need to have the C++ compiler decide # the declaration of exit, since it's the most demanding environment. cat >conftest.$ac_ext <<_ACEOF #ifndef __cplusplus choke me #endif _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then for ac_declaration in \ '' \ 'extern "C" void std::exit (int) throw (); using std::exit;' \ 'extern "C" void std::exit (int); using std::exit;' \ 'extern "C" void exit (int) throw ();' \ 'extern "C" void exit (int);' \ 'void exit (int);' do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_declaration #include int main () { exit (42); ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 continue fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_declaration int main () { exit (42); ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done rm -f conftest* if test -n "$ac_declaration"; then echo '#ifdef __cplusplus' >>confdefs.h echo $ac_declaration >>confdefs.h echo '#endif' >>confdefs.h fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo done .PHONY: am__doit END # If we don't find an include directive, just comment out the code. echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5 echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6 am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # We grep out `Entering directory' and `Leaving directory' # messages which can occur if `w' ends up in MAKEFLAGS. # In particular we don't look at `^make:' because GNU make might # be invoked under some other name (usually "gmake"), in which # case it prints its new name instead of `make'. if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then am__include=include am__quote= _am_result=GNU fi # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then am__include=.include am__quote="\"" _am_result=BSD fi fi echo "$as_me:$LINENO: result: $_am_result" >&5 echo "${ECHO_T}$_am_result" >&6 rm -f confinc confmf # Check whether --enable-dependency-tracking or --disable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then enableval="$enable_dependency_tracking" fi; if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi depcc="$CC" am_compiler_list= echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6 if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf case $depmode in nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; none) break ;; esac # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. if depmode=$depmode \ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5 echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6 CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi # Check whether --enable-shared or --disable-shared was given. if test "${enable_shared+set}" = set; then enableval="$enable_shared" p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac else enable_shared=yes fi; # Check whether --enable-static or --disable-static was given. if test "${enable_static+set}" = set; then enableval="$enable_static" p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac else enable_static=yes fi; # Check whether --enable-fast-install or --disable-fast-install was given. if test "${enable_fast_install+set}" = set; then enableval="$enable_fast_install" p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac else enable_fast_install=yes fi; # Make sure we can run config.sub. $ac_config_sub sun4 >/dev/null 2>&1 || { { echo "$as_me:$LINENO: error: cannot run $ac_config_sub" >&5 echo "$as_me: error: cannot run $ac_config_sub" >&2;} { (exit 1); exit 1; }; } echo "$as_me:$LINENO: checking build system type" >&5 echo $ECHO_N "checking build system type... $ECHO_C" >&6 if test "${ac_cv_build+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_build_alias=$build_alias test -z "$ac_cv_build_alias" && ac_cv_build_alias=`$ac_config_guess` test -z "$ac_cv_build_alias" && { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5 echo "$as_me: error: cannot guess build type; you must specify one" >&2;} { (exit 1); exit 1; }; } ac_cv_build=`$ac_config_sub $ac_cv_build_alias` || { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_build_alias failed" >&5 echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed" >&2;} { (exit 1); exit 1; }; } fi echo "$as_me:$LINENO: result: $ac_cv_build" >&5 echo "${ECHO_T}$ac_cv_build" >&6 build=$ac_cv_build build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` echo "$as_me:$LINENO: checking host system type" >&5 echo $ECHO_N "checking host system type... $ECHO_C" >&6 if test "${ac_cv_host+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_host_alias=$host_alias test -z "$ac_cv_host_alias" && ac_cv_host_alias=$ac_cv_build_alias ac_cv_host=`$ac_config_sub $ac_cv_host_alias` || { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_host_alias failed" >&5 echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;} { (exit 1); exit 1; }; } fi echo "$as_me:$LINENO: result: $ac_cv_host" >&5 echo "${ECHO_T}$ac_cv_host" >&6 host=$ac_cv_host host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` host_vendor=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` echo "$as_me:$LINENO: checking for a sed that does not truncate output" >&5 echo $ECHO_N "checking for a sed that does not truncate output... $ECHO_C" >&6 if test "${lt_cv_path_SED+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # Loop through the user's path and test for sed and gsed. # Then use that list of sed's as ones to test for truncation. as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for lt_ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" fi done done done lt_ac_max=0 lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do test ! -f $lt_ac_sed && break cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in # Check for GNU sed and select it if it is found. if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then lt_cv_path_SED=$lt_ac_sed break fi while true; do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo >>conftest.nl $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break cmp -s conftest.out conftest.nl || break # 10000 chars as input seems more than enough test $lt_ac_count -gt 10 && break lt_ac_count=`expr $lt_ac_count + 1` if test $lt_ac_count -gt $lt_ac_max; then lt_ac_max=$lt_ac_count lt_cv_path_SED=$lt_ac_sed fi done done fi SED=$lt_cv_path_SED echo "$as_me:$LINENO: result: $SED" >&5 echo "${ECHO_T}$SED" >&6 echo "$as_me:$LINENO: checking for egrep" >&5 echo $ECHO_N "checking for egrep... $ECHO_C" >&6 if test "${ac_cv_prog_egrep+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if echo a | (grep -E '(a|b)') >/dev/null 2>&1 then ac_cv_prog_egrep='grep -E' else ac_cv_prog_egrep='egrep' fi fi echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5 echo "${ECHO_T}$ac_cv_prog_egrep" >&6 EGREP=$ac_cv_prog_egrep # Check whether --with-gnu-ld or --without-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then withval="$with_gnu_ld" test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi; ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. echo "$as_me:$LINENO: checking for ld used by $CC" >&5 echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6 case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then echo "$as_me:$LINENO: checking for GNU ld" >&5 echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6 else echo "$as_me:$LINENO: checking for non-GNU ld" >&5 echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6 fi if test "${lt_cv_path_LD+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some GNU ld's only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 echo "${ECHO_T}$LD" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} { (exit 1); exit 1; }; } echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6 if test "${lt_cv_prog_gnu_ld+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # I'd rather use --version here, but apparently some GNU ld's only accept -v. case `$LD -v 2>&1 &5 echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6 with_gnu_ld=$lt_cv_prog_gnu_ld echo "$as_me:$LINENO: checking for $LD option to reload object files" >&5 echo $ECHO_N "checking for $LD option to reload object files... $ECHO_C" >&6 if test "${lt_cv_ld_reload_flag+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_ld_reload_flag='-r' fi echo "$as_me:$LINENO: result: $lt_cv_ld_reload_flag" >&5 echo "${ECHO_T}$lt_cv_ld_reload_flag" >&6 reload_flag=$lt_cv_ld_reload_flag case $reload_flag in "" | " "*) ;; *) reload_flag=" $reload_flag" ;; esac reload_cmds='$LD$reload_flag -o $output$reload_objs' case $host_os in darwin*) if test "$GCC" = yes; then reload_cmds='$CC -nostdlib ${wl}-r -o $output$reload_objs' else reload_cmds='$LD$reload_flag -o $output$reload_objs' fi ;; esac echo "$as_me:$LINENO: checking for BSD-compatible nm" >&5 echo $ECHO_N "checking for BSD-compatible nm... $ECHO_C" >&6 if test "${lt_cv_path_NM+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/${ac_tool_prefix}nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac esac fi done IFS="$lt_save_ifs" test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm fi fi echo "$as_me:$LINENO: result: $lt_cv_path_NM" >&5 echo "${ECHO_T}$lt_cv_path_NM" >&6 NM="$lt_cv_path_NM" echo "$as_me:$LINENO: checking whether ln -s works" >&5 echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6 LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 else echo "$as_me:$LINENO: result: no, using $LN_S" >&5 echo "${ECHO_T}no, using $LN_S" >&6 fi echo "$as_me:$LINENO: checking how to recognise dependent libraries" >&5 echo $ECHO_N "checking how to recognise dependent libraries... $ECHO_C" >&6 if test "${lt_cv_deplibs_check_method+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. # `unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path # which responds to the $file_magic_cmd with a given extended regex. # If you have `file' or equivalent on your system and you're not sure # whether `pass_all' will *always* work, you probably want this one. case $host_os in aix4* | aix5*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi[45]*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' lt_cv_file_magic_cmd='/usr/bin/file -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; cygwin*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump'. lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | kfreebsd*-gnu) if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD)/i[3-9]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; gnu*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case "$host_cpu" in ia64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]' lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be Linux ELF. linux*) lt_cv_deplibs_check_method=pass_all ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; nto-qnx*) lt_cv_deplibs_check_method=unknown ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; sco3.2v5*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; esac ;; sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; esac fi echo "$as_me:$LINENO: result: $lt_cv_deplibs_check_method" >&5 echo "${ECHO_T}$lt_cv_deplibs_check_method" >&6 file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # Allow CC to be a program name with arguments. compiler=$CC # Check whether --enable-libtool-lock or --disable-libtool-lock was given. if test "${enable_libtool_lock+set}" = set; then enableval="$enable_libtool_lock" fi; test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '#line 3657 "configure"' > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then case "`/usr/bin/file conftest.o`" in *32-bit*) case $host in x86_64-*linux*) LD="${LD-ld} -m elf_i386" ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" echo "$as_me:$LINENO: checking whether the C compiler needs -belf" >&5 echo $ECHO_N "checking whether the C compiler needs -belf... $ECHO_C" >&6 if test "${lt_cv_cc_needs_belf+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then lt_cv_cc_needs_belf=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 lt_cv_cc_needs_belf=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi echo "$as_me:$LINENO: result: $lt_cv_cc_needs_belf" >&5 echo "${ECHO_T}$lt_cv_cc_needs_belf" >&6 if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; esac need_locks="$enable_libtool_lock" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6 # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if test "${ac_cv_prog_CPP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether non-existent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi echo "$as_me:$LINENO: result: $CPP" >&5 echo "${ECHO_T}$CPP" >&6 ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether non-existent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." >&5 echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu echo "$as_me:$LINENO: checking for ANSI C header files" >&5 echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6 if test "${ac_cv_header_stdc+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_header_stdc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_header_stdc=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); exit (0); } _ACEOF rm -f conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_header_stdc=no fi rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi fi echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 echo "${ECHO_T}$ac_cv_header_stdc" >&6 if test $ac_cv_header_stdc = yes; then cat >>confdefs.h <<\_ACEOF #define STDC_HEADERS 1 _ACEOF fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then eval "$as_ac_Header=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_Header=no" fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in dlfcn.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if eval "test \"\${$as_ac_Header+set}\" = set"; then echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 else # Is the header compilable? echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 # Is the header present? echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ------------------------------ ## ## Report this to the tap lists. ## ## ------------------------------ ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 fi if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done ac_ext=cc ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -n "$ac_tool_prefix"; then for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CXX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then echo "$as_me:$LINENO: result: $CXX" >&5 echo "${ECHO_T}$CXX" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5 echo "${ECHO_T}$ac_ct_CXX" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$ac_ct_CXX" && break done test -n "$ac_ct_CXX" || ac_ct_CXX="g++" CXX=$ac_ct_CXX fi # Provide some information about the compiler. echo "$as_me:$LINENO:" \ "checking for C++ compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` { (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 (eval $ac_compiler --version &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 (eval $ac_compiler -v &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 (eval $ac_compiler -V &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5 echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6 if test "${ac_cv_cxx_compiler_gnu+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_compiler_gnu=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_compiler_gnu=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5 echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6 GXX=`test $ac_compiler_gnu = yes && echo yes` ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS CXXFLAGS="-g" echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5 echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6 if test "${ac_cv_prog_cxx_g+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_prog_cxx_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_prog_cxx_g=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5 echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6 if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi for ac_declaration in \ '' \ 'extern "C" void std::exit (int) throw (); using std::exit;' \ 'extern "C" void std::exit (int); using std::exit;' \ 'extern "C" void exit (int) throw ();' \ 'extern "C" void exit (int);' \ 'void exit (int);' do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_declaration #include int main () { exit (42); ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 continue fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_declaration int main () { exit (42); ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext done rm -f conftest* if test -n "$ac_declaration"; then echo '#ifdef __cplusplus' >>confdefs.h echo $ac_declaration >>confdefs.h echo '#endif' >>confdefs.h fi ac_ext=cc ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu depcc="$CXX" am_compiler_list= echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6 if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf case $depmode in nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; none) break ;; esac # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. if depmode=$depmode \ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi echo "$as_me:$LINENO: result: $am_cv_CXX_dependencies_compiler_type" >&5 echo "${ECHO_T}$am_cv_CXX_dependencies_compiler_type" >&6 CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then ac_ext=cc ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5 echo $ECHO_N "checking how to run the C++ preprocessor... $ECHO_C" >&6 if test -z "$CXXCPP"; then if test "${ac_cv_prog_CXXCPP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # Double quotes because CXXCPP needs to be expanded for CXXCPP in "$CXX -E" "/lib/cpp" do ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_cxx_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether non-existent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_cxx_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then break fi done ac_cv_prog_CXXCPP=$CXXCPP fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi echo "$as_me:$LINENO: result: $CXXCPP" >&5 echo "${ECHO_T}$CXXCPP" >&6 ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_cxx_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether non-existent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_cxx_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { echo "$as_me:$LINENO: error: C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details." >&5 echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi ac_ext=cc ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu fi ac_ext=f ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_f77_compiler_gnu if test -n "$ac_tool_prefix"; then for ac_prog in g77 f77 xlf frt pgf77 fort77 fl32 af77 f90 xlf90 pgf90 epcf90 f95 fort xlf95 ifc efc pgf95 lf95 gfortran do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_F77+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$F77"; then ac_cv_prog_F77="$F77" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_F77="$ac_tool_prefix$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi F77=$ac_cv_prog_F77 if test -n "$F77"; then echo "$as_me:$LINENO: result: $F77" >&5 echo "${ECHO_T}$F77" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$F77" && break done fi if test -z "$F77"; then ac_ct_F77=$F77 for ac_prog in g77 f77 xlf frt pgf77 fort77 fl32 af77 f90 xlf90 pgf90 epcf90 f95 fort xlf95 ifc efc pgf95 lf95 gfortran do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_F77+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_F77"; then ac_cv_prog_ac_ct_F77="$ac_ct_F77" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_F77="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi ac_ct_F77=$ac_cv_prog_ac_ct_F77 if test -n "$ac_ct_F77"; then echo "$as_me:$LINENO: result: $ac_ct_F77" >&5 echo "${ECHO_T}$ac_ct_F77" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$ac_ct_F77" && break done F77=$ac_ct_F77 fi # Provide some information about the compiler. echo "$as_me:5236:" \ "checking for Fortran 77 compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` { (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 (eval $ac_compiler --version &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 (eval $ac_compiler -v &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 (eval $ac_compiler -V &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } rm -f a.out # If we don't use `.F' as extension, the preprocessor is not run on the # input file. (Note that this only needs to work for GNU compilers.) ac_save_ext=$ac_ext ac_ext=F echo "$as_me:$LINENO: checking whether we are using the GNU Fortran 77 compiler" >&5 echo $ECHO_N "checking whether we are using the GNU Fortran 77 compiler... $ECHO_C" >&6 if test "${ac_cv_f77_compiler_gnu+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF program main #ifndef __GNUC__ choke me #endif end _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_f77_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_compiler_gnu=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_compiler_gnu=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_f77_compiler_gnu=$ac_compiler_gnu fi echo "$as_me:$LINENO: result: $ac_cv_f77_compiler_gnu" >&5 echo "${ECHO_T}$ac_cv_f77_compiler_gnu" >&6 ac_ext=$ac_save_ext ac_test_FFLAGS=${FFLAGS+set} ac_save_FFLAGS=$FFLAGS FFLAGS= echo "$as_me:$LINENO: checking whether $F77 accepts -g" >&5 echo $ECHO_N "checking whether $F77 accepts -g... $ECHO_C" >&6 if test "${ac_cv_prog_f77_g+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else FFLAGS=-g cat >conftest.$ac_ext <<_ACEOF program main end _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_f77_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_prog_f77_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_prog_f77_g=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_prog_f77_g" >&5 echo "${ECHO_T}$ac_cv_prog_f77_g" >&6 if test "$ac_test_FFLAGS" = set; then FFLAGS=$ac_save_FFLAGS elif test $ac_cv_prog_f77_g = yes; then if test "x$ac_cv_f77_compiler_gnu" = xyes; then FFLAGS="-g -O2" else FFLAGS="-g" fi else if test "x$ac_cv_f77_compiler_gnu" = xyes; then FFLAGS="-O2" else FFLAGS= fi fi G77=`test $ac_compiler_gnu = yes && echo yes` ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers! # find the maximum length of command line arguments echo "$as_me:$LINENO: checking the maximum length of command line arguments" >&5 echo $ECHO_N "checking the maximum length of command line arguments... $ECHO_C" >&6 if test "${lt_cv_sys_max_cmd_len+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not preemptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* ) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for *BSD fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` ;; *) # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} while (test "X"`$SHELL $0 --fallback-echo "X$teststring" 2>/dev/null` \ = "XX$teststring") >/dev/null 2>&1 && new_result=`expr "X$teststring" : ".*" 2>&1` && lt_cv_sys_max_cmd_len=$new_result && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done teststring= # Add a significant safety factor because C++ compilers can tack on massive # amounts of additional arguments before passing them to the linker. # It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` ;; esac fi if test -n $lt_cv_sys_max_cmd_len ; then echo "$as_me:$LINENO: result: $lt_cv_sys_max_cmd_len" >&5 echo "${ECHO_T}$lt_cv_sys_max_cmd_len" >&6 else echo "$as_me:$LINENO: result: none" >&5 echo "${ECHO_T}none" >&6 fi # Check for command to grab the raw symbol name followed by C symbol from nm. echo "$as_me:$LINENO: checking command to parse $NM output from $compiler object" >&5 echo $ECHO_N "checking command to parse $NM output from $compiler object... $ECHO_C" >&6 if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[BCDEGRST]' # Regexp to match symbols that can be accessed directly from C. sympat='\([_A-Za-z][_A-Za-z0-9]*\)' # Transform the above into a raw symbol and a C symbol. symxfrm='\1 \2\3 \3' # Transform an extracted symbol line into a proper C declaration lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" # Define system-specific variables. case $host_os in aix*) symcode='[BCDT]' ;; cygwin* | mingw* | pw32*) symcode='[ABCDGISTW]' ;; hpux*) # Its linker distinguishes data from code symbols if test "$host_cpu" = ia64; then symcode='[ABCDEGRST]' fi lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" ;; linux*) if test "$host_cpu" = ia64; then symcode='[ABCDGIRSTW]' lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" fi ;; irix* | nonstopux*) symcode='[BCDEGRST]' ;; osf*) symcode='[BCDEGQRST]' ;; solaris* | sysv5*) symcode='[BDRT]' ;; sysv4) symcode='[DFNSTU]' ;; esac # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[ABCDGIRSTW]' ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Write the raw and C identifiers. lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*\($ac_symprfx\)$sympat$opt_cr$/$symxfrm/p'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # Now try to grab the symbols. nlist=conftest.nm if { (eval echo "$as_me:$LINENO: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\"") >&5 (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if grep ' nm_test_var$' "$nlist" >/dev/null; then if grep ' nm_test_func$' "$nlist" >/dev/null; then cat < conftest.$ac_ext #ifdef __cplusplus extern "C" { #endif EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext' cat <> conftest.$ac_ext #if defined (__STDC__) && __STDC__ # define lt_ptr_t void * #else # define lt_ptr_t char * # define const #endif /* The mapping between symbol names and symbols. */ const struct { const char *name; lt_ptr_t address; } lt_preloaded_symbols[] = { EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext cat <<\EOF >> conftest.$ac_ext {0, (lt_ptr_t) 0} }; #ifdef __cplusplus } #endif EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_save_LIBS="$LIBS" lt_save_CFLAGS="$CFLAGS" LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS="$lt_save_LIBS" CFLAGS="$lt_save_CFLAGS" else echo "cannot find nm_test_func in $nlist" >&5 fi else echo "cannot find nm_test_var in $nlist" >&5 fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 fi else echo "$progname: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -f conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done fi if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then echo "$as_me:$LINENO: result: failed" >&5 echo "${ECHO_T}failed" >&6 else echo "$as_me:$LINENO: result: ok" >&5 echo "${ECHO_T}ok" >&6 fi echo "$as_me:$LINENO: checking for objdir" >&5 echo $ECHO_N "checking for objdir... $ECHO_C" >&6 if test "${lt_cv_objdir+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null fi echo "$as_me:$LINENO: result: $lt_cv_objdir" >&5 echo "${ECHO_T}$lt_cv_objdir" >&6 objdir=$lt_cv_objdir case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. Xsed='sed -e s/^X//' sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' # Constants: rm="rm -f" # Global variables: default_ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except M$VC, # which needs '.lib'). libext=a ltmain="$ac_aux_dir/ltmain.sh" ofile="$default_ofile" with_gnu_ld="$lt_cv_prog_gnu_ld" if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. set dummy ${ac_tool_prefix}ar; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_AR+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="${ac_tool_prefix}ar" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then echo "$as_me:$LINENO: result: $AR" >&5 echo "${ECHO_T}$AR" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$ac_cv_prog_AR"; then ac_ct_AR=$AR # Extract the first word of "ar", so it can be a program name with args. set dummy ar; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_AR+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="ar" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done test -z "$ac_cv_prog_ac_ct_AR" && ac_cv_prog_ac_ct_AR="false" fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then echo "$as_me:$LINENO: result: $ac_ct_AR" >&5 echo "${ECHO_T}$ac_ct_AR" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi AR=$ac_ct_AR else AR="$ac_cv_prog_AR" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_RANLIB+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then echo "$as_me:$LINENO: result: $RANLIB" >&5 echo "${ECHO_T}$RANLIB" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":" fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 echo "${ECHO_T}$ac_ct_RANLIB" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi RANLIB=$ac_ct_RANLIB else RANLIB="$ac_cv_prog_RANLIB" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_STRIP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then echo "$as_me:$LINENO: result: $STRIP" >&5 echo "${ECHO_T}$STRIP" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":" fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 echo "${ECHO_T}$ac_ct_STRIP" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi STRIP=$ac_ct_STRIP else STRIP="$ac_cv_prog_STRIP" fi old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$AR" && AR=ar test -z "$AR_FLAGS" && AR_FLAGS=cru test -z "$AS" && AS=as test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$DLLTOOL" && DLLTOOL=dlltool test -z "$LD" && LD=ld test -z "$LN_S" && LN_S="ln -s" test -z "$MAGIC_CMD" && MAGIC_CMD=file test -z "$NM" && NM=nm test -z "$SED" && SED=sed test -z "$OBJDUMP" && OBJDUMP=objdump test -z "$RANLIB" && RANLIB=: test -z "$STRIP" && STRIP=: test -z "$ac_objext" && ac_objext=o # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="\$RANLIB -t \$oldlib~$old_postinstall_cmds" ;; *) old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" fi cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` # Only perform the check for file, if the check method requires it case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then echo "$as_me:$LINENO: checking for ${ac_tool_prefix}file" >&5 echo $ECHO_N "checking for ${ac_tool_prefix}file... $ECHO_C" >&6 if test "${lt_cv_path_MAGIC_CMD+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/${ac_tool_prefix}file; then lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 echo "${ECHO_T}$MAGIC_CMD" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then echo "$as_me:$LINENO: checking for file" >&5 echo $ECHO_N "checking for file... $ECHO_C" >&6 if test "${lt_cv_path_MAGIC_CMD+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/file; then lt_cv_path_MAGIC_CMD="$ac_dir/file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 echo "${ECHO_T}$MAGIC_CMD" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi else MAGIC_CMD=: fi fi fi ;; esac enable_dlopen=no enable_win32_dll=no # Check whether --enable-libtool-lock or --disable-libtool-lock was given. if test "${enable_libtool_lock+set}" = set; then enableval="$enable_libtool_lock" fi; test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Check whether --with-pic or --without-pic was given. if test "${with_pic+set}" = set; then withval="$with_pic" pic_mode="$withval" else pic_mode=default fi; test -z "$pic_mode" && pic_mode=default # Use C for the default configuration in the libtool script tagname= lt_save_CC="$CC" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o objext=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;\n" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}\n' # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # Allow CC to be a program name with arguments. compiler=$CC # # Check for any special shared library compilation flags. # lt_prog_cc_shlib= if test "$GCC" = no; then case $host_os in sco3.2v5*) lt_prog_cc_shlib='-belf' ;; esac fi if test -n "$lt_prog_cc_shlib"; then { echo "$as_me:$LINENO: WARNING: \`$CC' requires \`$lt_prog_cc_shlib' to build shared libraries" >&5 echo "$as_me: WARNING: \`$CC' requires \`$lt_prog_cc_shlib' to build shared libraries" >&2;} if echo "$old_CC $old_CFLAGS " | grep "[ ]$lt_prog_cc_shlib[ ]" >/dev/null; then : else { echo "$as_me:$LINENO: WARNING: add \`$lt_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure" >&5 echo "$as_me: WARNING: add \`$lt_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure" >&2;} lt_cv_prog_cc_can_build_shared=no fi fi # # Check to make sure the static flag actually works. # echo "$as_me:$LINENO: checking if $compiler static flag $lt_prog_compiler_static works" >&5 echo $ECHO_N "checking if $compiler static flag $lt_prog_compiler_static works... $ECHO_C" >&6 if test "${lt_prog_compiler_static_works+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_prog_compiler_static_works=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_prog_compiler_static" printf "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 else lt_prog_compiler_static_works=yes fi fi $rm conftest* LDFLAGS="$save_LDFLAGS" fi echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works" >&5 echo "${ECHO_T}$lt_prog_compiler_static_works" >&6 if test x"$lt_prog_compiler_static_works" = xyes; then : else lt_prog_compiler_static= fi lt_prog_compiler_no_builtin_flag= if test "$GCC" = yes; then lt_prog_compiler_no_builtin_flag=' -fno-builtin' echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6 if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:6293: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:6297: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings if test ! -s conftest.err; then lt_cv_prog_compiler_rtti_exceptions=yes fi fi $rm conftest* fi echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6 if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" else : fi fi lt_prog_compiler_wl= lt_prog_compiler_pic= lt_prog_compiler_static= echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 if test "$GCC" = yes; then lt_prog_compiler_wl='-Wl,' lt_prog_compiler_static='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' fi ;; amigaos*) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' ;; beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared=no enable_shared=no ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic=-Kconform_pic fi ;; hpux*) # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case "$host_cpu" in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic='-fPIC' ;; esac ;; *) lt_prog_compiler_pic='-fPIC' ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' else lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' fi ;; darwin*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files case "$cc_basename" in xlc*) lt_prog_compiler_pic='-qnocommon' lt_prog_compiler_wl='-Wl,' ;; esac ;; mingw* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case "$host_cpu" in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static='-non_shared' ;; newsos6) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; linux*) case $CC in icc* | ecc*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-static' ;; ccc*) lt_prog_compiler_wl='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static='-non_shared' ;; esac ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static='-non_shared' ;; sco3.2v5*) lt_prog_compiler_pic='-Kpic' lt_prog_compiler_static='-dn' ;; solaris*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; sunos4*) lt_prog_compiler_wl='-Qoption ld ' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then lt_prog_compiler_pic='-Kconform_pic' lt_prog_compiler_static='-Bstatic' fi ;; uts4*) lt_prog_compiler_pic='-pic' lt_prog_compiler_static='-Bstatic' ;; *) lt_prog_compiler_can_build_shared=no ;; esac fi echo "$as_me:$LINENO: result: $lt_prog_compiler_pic" >&5 echo "${ECHO_T}$lt_prog_compiler_pic" >&6 # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic works... $ECHO_C" >&6 if test "${lt_prog_compiler_pic_works+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:6536: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:6540: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings if test ! -s conftest.err; then lt_prog_compiler_pic_works=yes fi fi $rm conftest* fi echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works" >&5 echo "${ECHO_T}$lt_prog_compiler_pic_works" >&6 if test x"$lt_prog_compiler_pic_works" = xyes; then case $lt_prog_compiler_pic in "" | " "*) ;; *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; esac else lt_prog_compiler_pic= lt_prog_compiler_can_build_shared=no fi fi case "$host_os" in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic= ;; *) lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" ;; esac echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 if test "${lt_cv_prog_compiler_c_o+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_prog_compiler_c_o=no $rm -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:6596: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:6600: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings if test ! -s out/conftest.err; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . $rm conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files $rm out/* && rmdir out cd .. rmdir conftest $rm conftest* fi echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5 echo "${ECHO_T}$lt_cv_prog_compiler_c_o" >&6 hard_links="nottested" if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6 hard_links=yes $rm conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no echo "$as_me:$LINENO: result: $hard_links" >&5 echo "${ECHO_T}$hard_links" >&6 if test "$hard_links" = no; then { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 runpath_var= allow_undefined_flag= enable_shared_with_static_runtimes=no archive_cmds= archive_expsym_cmds= old_archive_From_new_cmds= old_archive_from_expsyms_cmds= export_dynamic_flag_spec= whole_archive_flag_spec= thread_safe_flag_spec= hardcode_libdir_flag_spec= hardcode_libdir_flag_spec_ld= hardcode_libdir_separator= hardcode_direct=no hardcode_minus_L=no hardcode_shlibpath_var=unsupported link_all_deplibs=unknown hardcode_automatic=no module_cmds= module_expsym_cmds= always_export_symbols=no export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. exclude_expsyms="_GLOBAL_OFFSET_TABLE_" # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs=yes if test "$with_gnu_ld" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # See if GNU ld supports shared libraries. case $host_os in aix3* | aix4* | aix5*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no cat <&2 *** Warning: the GNU linker, at least up to release 2.9.1, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to modify your PATH *** so that a non-GNU linker is found, and then restart. EOF fi ;; amigaos*) archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes # Samuel A. Falvo II reports # that the semantics of dynamic libraries on AmigaOS, at least up # to version 4, is to share data among multiple programs linked # with the same dynamic library. Since this doesn't match the # behavior of shared libraries on other platforms, we can't use # them. ld_shlibs=no ;; beos*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then allow_undefined_flag=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs=no fi ;; cygwin* | mingw* | pw32*) # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' allow_undefined_flag=unsupported always_export_symbols=no enable_shared_with_static_runtimes=yes export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' else ld_shlibs=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris* | sysv5*) if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then ld_shlibs=no cat <&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. EOF elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; sunos4*) archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct=yes hardcode_shlibpath_var=no ;; linux*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then tmp_archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_cmds="$tmp_archive_cmds" supports_anon_versioning=no case `$LD -v 2>/dev/null` in *\ 01.* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac if test $supports_anon_versioning = yes; then archive_expsym_cmds='$echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ $echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' else archive_expsym_cmds="$tmp_archive_cmds" fi else ld_shlibs=no fi ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac if test "$ld_shlibs" = yes; then runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir' export_dynamic_flag_spec='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec= fi fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag=unsupported always_export_symbols=yes archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test "$GCC" = yes && test -z "$link_static_flag"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix4* | aix5*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm if $NM -V 2>&1 | grep 'GNU' > /dev/null; then export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix5*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds='' hardcode_direct=yes hardcode_libdir_separator=':' link_all_deplibs=yes if test "$GCC" = yes; then case $host_os in aix4.012|aix4.012.*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 hardcode_direct=yes else # We have old collect2 hardcode_direct=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi esac shared_flag='-shared' else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag='-berok' # Determine the default libpath from the value encoded in an empty executable. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'`; fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag="-z nodefs" archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an empty executable. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'`; fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag=' ${wl}-bernotok' allow_undefined_flag=' ${wl}-berok' # -bexpall does not export symbols beginning with underscore (_) always_export_symbols=yes # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec=' ' archive_cmds_need_lc=yes # This is similar to how AIX traditionally builds it's shared libraries. archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes # see comment about different semantics on the GNU ld section ld_shlibs=no ;; bsdi[45]*) export_dynamic_flag_spec=-rdynamic ;; cygwin* | mingw* | pw32*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_From_new_cmds='true' # FIXME: Should let the user specify the lib program. old_archive_cmds='lib /OUT:$oldlib$oldobjs$old_deplibs' fix_srcfile_path='`cygpath -w "$srcfile"`' enable_shared_with_static_runtimes=yes ;; darwin* | rhapsody*) case "$host_os" in rhapsody* | darwin1.[012]) allow_undefined_flag='${wl}-undefined ${wl}suppress' ;; *) # Darwin 1.3 on if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then allow_undefined_flag='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' else case ${MACOSX_DEPLOYMENT_TARGET} in 10.[012]) allow_undefined_flag='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) allow_undefined_flag='${wl}-undefined ${wl}dynamic_lookup' ;; esac fi ;; esac archive_cmds_need_lc=no hardcode_direct=no hardcode_automatic=yes hardcode_shlibpath_var=unsupported whole_archive_flag_spec='' link_all_deplibs=yes if test "$GCC" = yes ; then output_verbose_link_cmd='echo' archive_cmds='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' module_cmds='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' module_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' else case "$cc_basename" in xlc*) output_verbose_link_cmd='echo' archive_cmds='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' module_cmds='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' module_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ;; *) ld_shlibs=no ;; esac fi ;; dgux*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; freebsd1*) ld_shlibs=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | kfreebsd*-gnu) archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; hpux9*) if test "$GCC" = yes; then archive_cmds='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else archive_cmds='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes export_dynamic_flag_spec='${wl}-E' ;; hpux10* | hpux11*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then case "$host_cpu" in hppa*64*|ia64*) archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case "$host_cpu" in hppa*64*|ia64*) archive_cmds='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' ;; *) archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' ;; esac fi if test "$with_gnu_ld" = no; then case "$host_cpu" in hppa*64*) hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_flag_spec_ld='+b $libdir' hardcode_libdir_separator=: hardcode_direct=no hardcode_shlibpath_var=no ;; ia64*) hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=no hardcode_shlibpath_var=no # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; *) hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_ld='-rpath $libdir' fi hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: link_all_deplibs=yes ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; newsos6) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: hardcode_shlibpath_var=no ;; openbsd*) hardcode_direct=yes hardcode_shlibpath_var=no if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' else case $host_os in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-R$libdir' ;; *) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; esac fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' old_archive_From_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' fi hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi hardcode_libdir_separator=: ;; sco3.2v5*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no export_dynamic_flag_spec='${wl}-Bexport' runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ;; solaris*) no_undefined_flag=' -z text' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' else archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' fi hardcode_libdir_flag_spec='-R$libdir' hardcode_shlibpath_var=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # Supported since Solaris 2.6 (maybe 2.5.1?) whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;; esac link_all_deplibs=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; sysv4) case $host_vendor in sni) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds='$CC -r -o $output$reload_objs' hardcode_direct=no ;; motorola) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var=no ;; sysv4.3*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no export_dynamic_flag_spec='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs=yes fi ;; sysv4.2uw2*) archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_minus_L=no hardcode_shlibpath_var=no hardcode_runpath_var=yes runpath_var=LD_RUN_PATH ;; sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) no_undefined_flag='${wl}-z ${wl}text' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' fi runpath_var='LD_RUN_PATH' hardcode_shlibpath_var=no ;; sysv5*) no_undefined_flag=' -z text' # $CC -shared without GNU ld will not create a library from C++ # object files and a static libstdc++, better avoid it by now archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' hardcode_libdir_flag_spec= hardcode_shlibpath_var=no runpath_var='LD_RUN_PATH' ;; uts4*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; *) ld_shlibs=no ;; esac fi echo "$as_me:$LINENO: result: $ld_shlibs" >&5 echo "${ECHO_T}$ld_shlibs" >&6 test "$ld_shlibs" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc" in x|xyes) # Assume -lc should be added archive_cmds_need_lc=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 $rm conftest* printf "$lt_simple_compile_test_code" > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag allow_undefined_flag= if { (eval echo "$as_me:$LINENO: \"$archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 (eval $archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } then archive_cmds_need_lc=no else archive_cmds_need_lc=yes fi allow_undefined_flag=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $rm conftest* echo "$as_me:$LINENO: result: $archive_cmds_need_lc" >&5 echo "${ECHO_T}$archive_cmds_need_lc" >&6 ;; esac fi ;; esac echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" if test "$GCC" = yes; then sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix4* | aix5*) version_type=linux need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$host_os in yes,cygwin* | yes,mingw* | yes,pw32*) library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $rm \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" ;; mingw*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH printed by # mingw gcc, but we are running on Cygwin. Gcc prints its search # path with ; separators, and with drive letters. We can handle the # drive letters (cygwin fileutils understands them), so leave them, # especially as we might pass files found there to a mingw objdump, # which wouldn't understand a cygwinified path. Ahh. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/./-/g'`${versuffix}${shared_ext}' ;; esac ;; *) library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' ;; esac dynamic_linker='Win32 ld.exe' # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. if test "$GCC" = yes; then sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` else sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' fi sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd1*) dynamic_linker=no ;; kfreebsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='GNU ld.so' ;; freebsd*) objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2*) shlibpath_overrides_runpath=yes ;; freebsd3.01* | freebsdelf3.01*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; *) # from 3.2 on shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case "$host_cpu" in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555. postinstall_cmds='chmod 555 $lib' ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be Linux ELF. linux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`$SED -e 's/:,\t/ /g;s/=^=*$//;s/=^= * / /g' /etc/ld.so.conf | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; knetbsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='GNU ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; nto-qnx*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; openbsd*) version_type=sunos need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; sco3.2v5*) version_type=osf soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH ;; solaris*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no export_dynamic_flag_spec='${wl}-Blargedynsym' runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac echo "$as_me:$LINENO: result: $dynamic_linker" >&5 echo "${ECHO_T}$dynamic_linker" >&6 test "$dynamic_linker" = no && can_build_shared=no echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 hardcode_action= if test -n "$hardcode_libdir_flag_spec" || \ test -n "$runpath_var" || \ test "X$hardcode_automatic" = "Xyes" ; then # We can hardcode non-existant directories. if test "$hardcode_direct" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, )" != no && test "$hardcode_minus_L" != no; then # Linking always hardcodes the temporary library directory. hardcode_action=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action=unsupported fi echo "$as_me:$LINENO: result: $hardcode_action" >&5 echo "${ECHO_T}$hardcode_action" >&6 if test "$hardcode_action" = relink; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi striplib= old_striplib= echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6 if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi ;; *) echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 ;; esac fi if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 if test "${ac_cv_lib_dl_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dlopen (); int main () { dlopen (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_dl_dlopen=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_dl_dlopen=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 if test $ac_cv_lib_dl_dlopen = yes; then lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes fi ;; *) echo "$as_me:$LINENO: checking for shl_load" >&5 echo $ECHO_N "checking for shl_load... $ECHO_C" >&6 if test "${ac_cv_func_shl_load+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define shl_load to an innocuous variant, in case declares shl_load. For example, HP-UX 11i declares gettimeofday. */ #define shl_load innocuous_shl_load /* System header to define __stub macros and hopefully few prototypes, which can conflict with char shl_load (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef shl_load /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char shl_load (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_shl_load) || defined (__stub___shl_load) choke me #else char (*f) () = shl_load; #endif #ifdef __cplusplus } #endif int main () { return f != shl_load; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_shl_load=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_shl_load=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5 echo "${ECHO_T}$ac_cv_func_shl_load" >&6 if test $ac_cv_func_shl_load = yes; then lt_cv_dlopen="shl_load" else echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5 echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6 if test "${ac_cv_lib_dld_shl_load+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char shl_load (); int main () { shl_load (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_dld_shl_load=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_dld_shl_load=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6 if test $ac_cv_lib_dld_shl_load = yes; then lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld" else echo "$as_me:$LINENO: checking for dlopen" >&5 echo $ECHO_N "checking for dlopen... $ECHO_C" >&6 if test "${ac_cv_func_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define dlopen to an innocuous variant, in case declares dlopen. For example, HP-UX 11i declares gettimeofday. */ #define dlopen innocuous_dlopen /* System header to define __stub macros and hopefully few prototypes, which can conflict with char dlopen (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef dlopen /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dlopen (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_dlopen) || defined (__stub___dlopen) choke me #else char (*f) () = dlopen; #endif #ifdef __cplusplus } #endif int main () { return f != dlopen; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_dlopen=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_dlopen=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5 echo "${ECHO_T}$ac_cv_func_dlopen" >&6 if test $ac_cv_func_dlopen = yes; then lt_cv_dlopen="dlopen" else echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 if test "${ac_cv_lib_dl_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dlopen (); int main () { dlopen (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_dl_dlopen=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_dl_dlopen=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 if test $ac_cv_lib_dl_dlopen = yes; then lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5 echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6 if test "${ac_cv_lib_svld_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dlopen (); int main () { dlopen (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_svld_dlopen=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_svld_dlopen=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5 echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6 if test $ac_cv_lib_svld_dlopen = yes; then lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" else echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5 echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6 if test "${ac_cv_lib_dld_dld_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dld_link (); int main () { dld_link (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_dld_dld_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_dld_dld_link=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5 echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6 if test $ac_cv_lib_dld_dld_link = yes; then lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld" fi fi fi fi fi fi ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5 echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6 if test "${lt_cv_dlopen_self+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif #ifdef __cplusplus extern "C" void exit (int); #endif void fnord() { int i=42;} int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; /* dlclose (self); */ } exit (status); } EOF if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; x$lt_unknown|x*) lt_cv_dlopen_self=no ;; esac else : # compilation failed lt_cv_dlopen_self=no fi fi rm -fr conftest* fi echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5 echo "${ECHO_T}$lt_cv_dlopen_self" >&6 if test "x$lt_cv_dlopen_self" = xyes; then LDFLAGS="$LDFLAGS $link_static_flag" echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5 echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6 if test "${lt_cv_dlopen_self_static+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self_static=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif #ifdef __cplusplus extern "C" void exit (int); #endif void fnord() { int i=42;} int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; /* dlclose (self); */ } exit (status); } EOF if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_unknown|x*) lt_cv_dlopen_self_static=no ;; esac else : # compilation failed lt_cv_dlopen_self_static=no fi fi rm -fr conftest* fi echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5 echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6 fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi # Report which librarie types wil actually be built echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6 echo "$as_me:$LINENO: result: $can_build_shared" >&5 echo "${ECHO_T}$can_build_shared" >&6 echo "$as_me:$LINENO: checking whether to build shared libraries" >&5 echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6 test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case "$host_os" in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix4* | aix5*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac echo "$as_me:$LINENO: result: $enable_shared" >&5 echo "${ECHO_T}$enable_shared" >&6 echo "$as_me:$LINENO: checking whether to build static libraries" >&5 echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6 # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes echo "$as_me:$LINENO: result: $enable_static" >&5 echo "${ECHO_T}$enable_static" >&6 # The else clause should only fire when bootstrapping the # libtool distribution, otherwise you forgot to ship ltmain.sh # with your package, and you will get complaints that there are # no rules to generate ltmain.sh. if test -f "$ltmain"; then # See if we are running on zsh, and set the options which allow our commands through # without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi # Now quote all the things that may contain metacharacters while being # careful not to overquote the AC_SUBSTed values. We take copies of the # variables and quote the copies for generation of the libtool script. for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ SED SHELL STRIP \ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ deplibs_check_method reload_flag reload_cmds need_locks \ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ old_postinstall_cmds old_postuninstall_cmds \ compiler \ CC \ LD \ lt_prog_compiler_wl \ lt_prog_compiler_pic \ lt_prog_compiler_static \ lt_prog_compiler_no_builtin_flag \ export_dynamic_flag_spec \ thread_safe_flag_spec \ whole_archive_flag_spec \ enable_shared_with_static_runtimes \ old_archive_cmds \ old_archive_from_new_cmds \ predep_objects \ postdep_objects \ predeps \ postdeps \ compiler_lib_search_path \ archive_cmds \ archive_expsym_cmds \ postinstall_cmds \ postuninstall_cmds \ old_archive_from_expsyms_cmds \ allow_undefined_flag \ no_undefined_flag \ export_symbols_cmds \ hardcode_libdir_flag_spec \ hardcode_libdir_flag_spec_ld \ hardcode_libdir_separator \ hardcode_automatic \ module_cmds \ module_expsym_cmds \ lt_cv_prog_compiler_c_o \ exclude_expsyms \ include_expsyms; do case $var in old_archive_cmds | \ old_archive_from_new_cmds | \ archive_cmds | \ archive_expsym_cmds | \ module_cmds | \ module_expsym_cmds | \ old_archive_from_expsyms_cmds | \ export_symbols_cmds | \ extract_expsyms_cmds | reload_cmds | finish_cmds | \ postinstall_cmds | postuninstall_cmds | \ old_postinstall_cmds | old_postuninstall_cmds | \ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) # Double-quote double-evaled strings. eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" ;; *) eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" ;; esac done case $lt_echo in *'\$0 --fallback-echo"') lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` ;; esac cfgfile="${ofile}T" trap "$rm \"$cfgfile\"; exit 1" 1 2 15 $rm -f "$cfgfile" { echo "$as_me:$LINENO: creating $ofile" >&5 echo "$as_me: creating $ofile" >&6;} cat <<__EOF__ >> "$cfgfile" #! $SHELL # `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) # NOTE: Changes made to this file will be lost: look at ltmain.sh. # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 # Free Software Foundation, Inc. # # This file is part of GNU Libtool: # Originally by Gordon Matzigkeit , 1996 # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # A sed program that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. Xsed="$SED -e s/^X//" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # The names of the tagged configurations supported by this script. available_tags= # ### BEGIN LIBTOOL CONFIG # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc # Whether or not to disallow shared libs when runtime libs are static allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # The host system. host_alias=$host_alias host=$host # An echo program that does not interpret backslashes. echo=$lt_echo # The archiver. AR=$lt_AR AR_FLAGS=$lt_AR_FLAGS # A C compiler. LTCC=$lt_LTCC # A language-specific compiler. CC=$lt_compiler # Is the compiler the GNU C compiler? with_gcc=$GCC # An ERE matcher. EGREP=$lt_EGREP # The linker used to build libraries. LD=$lt_LD # Whether we need hard or soft links. LN_S=$lt_LN_S # A BSD-compatible nm program. NM=$lt_NM # A symbol stripping program STRIP=$lt_STRIP # Used to examine libraries when file_magic_cmd begins "file" MAGIC_CMD=$MAGIC_CMD # Used on cygwin: DLL creation program. DLLTOOL="$DLLTOOL" # Used on cygwin: object dumper. OBJDUMP="$OBJDUMP" # Used on cygwin: assembler. AS="$AS" # The name of the directory that contains temporary libtool files. objdir=$objdir # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl # Object file suffix (normally "o"). objext="$ac_objext" # Old archive suffix (normally "a"). libext="$libext" # Shared library suffix (normally ".so"). shrext_cmds='$shrext_cmds' # Executable file suffix (normally ""). exeext="$exeext" # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic pic_mode=$pic_mode # What is the maximum length of a command? max_cmd_len=$lt_cv_sys_max_cmd_len # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o # Must we lock files when doing compilation ? need_locks=$lt_need_locks # Do we need the lib prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec # Compiler flag to generate thread-safe objects. thread_safe_flag_spec=$lt_thread_safe_flag_spec # Library versioning type. version_type=$version_type # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME. library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Commands used to build and install an old-style archive. RANLIB=$lt_RANLIB old_archive_cmds=$lt_old_archive_cmds old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds # Commands used to build and install a shared archive. archive_cmds=$lt_archive_cmds archive_expsym_cmds=$lt_archive_expsym_cmds postinstall_cmds=$lt_postinstall_cmds postuninstall_cmds=$lt_postuninstall_cmds # Commands used to build a loadable module (assumed same as above if empty) module_cmds=$lt_module_cmds module_expsym_cmds=$lt_module_expsym_cmds # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # Dependencies to place before the objects being linked to create a # shared library. predep_objects=$lt_predep_objects # Dependencies to place after the objects being linked to create a # shared library. postdep_objects=$lt_postdep_objects # Dependencies to place before the objects being linked to create a # shared library. predeps=$lt_predeps # Dependencies to place after the objects being linked to create a # shared library. postdeps=$lt_postdeps # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method == file_magic. file_magic_cmd=$lt_file_magic_cmd # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag # Flag that forces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # Same as above, but a single script fragment to be evaled but not shown. finish_eval=$lt_finish_eval # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # This is the shared library runtime path variable. runpath_var=$runpath_var # This is the shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist. hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec # If ld is used when linking, flag to hardcode \$libdir into # a binary during linking. This must work even if \$libdir does # not exist. hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld # Whether we need a single -rpath flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator # Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the # resulting binary. hardcode_direct=$hardcode_direct # Set to yes if using the -LDIR flag during linking hardcodes DIR into the # resulting binary. hardcode_minus_L=$hardcode_minus_L # Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into # the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var # Set to yes if building a shared library automatically hardcodes DIR into the library # and all subsequent libraries and executables linked against it. hardcode_automatic=$hardcode_automatic # Variables whose values should be saved in libtool wrapper scripts and # restored at relink time. variables_saved_for_relink="$variables_saved_for_relink" # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs # Compile-time system search path for libraries sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Fix the shell variable \$srcfile for the compiler. fix_srcfile_path="$fix_srcfile_path" # Set to yes if exported symbols are required. always_export_symbols=$always_export_symbols # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms # Symbols that must always be exported. include_expsyms=$lt_include_expsyms # ### END LIBTOOL CONFIG __EOF__ case $host_os in aix3*) cat <<\EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi EOF ;; esac # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1) mv -f "$cfgfile" "$ofile" || \ (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" else # If there is no Makefile yet, we rely on a make rule to execute # `config.status --recheck' to rerun these tests and create the # libtool script then. ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` if test -f "$ltmain_in"; then test -f Makefile && make "$ltmain" fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC="$lt_save_CC" # Check whether --with-tags or --without-tags was given. if test "${with_tags+set}" = set; then withval="$with_tags" tagnames="$withval" fi; if test -f "$ltmain" && test -n "$tagnames"; then if test ! -f "${ofile}"; then { echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not exist" >&5 echo "$as_me: WARNING: output file \`$ofile' does not exist" >&2;} fi if test -z "$LTCC"; then eval "`$SHELL ${ofile} --config | grep '^LTCC='`" if test -z "$LTCC"; then { echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not look like a libtool script" >&5 echo "$as_me: WARNING: output file \`$ofile' does not look like a libtool script" >&2;} else { echo "$as_me:$LINENO: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&5 echo "$as_me: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&2;} fi fi # Extract list of available tagged configurations in $ofile. # Note that this assumes the entire list is on one line. available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'` lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for tagname in $tagnames; do IFS="$lt_save_ifs" # Check whether tagname contains only valid characters case `$echo "X$tagname" | $Xsed -e 's:[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]::g'` in "") ;; *) { { echo "$as_me:$LINENO: error: invalid tag name: $tagname" >&5 echo "$as_me: error: invalid tag name: $tagname" >&2;} { (exit 1); exit 1; }; } ;; esac if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null then { { echo "$as_me:$LINENO: error: tag name \"$tagname\" already exists" >&5 echo "$as_me: error: tag name \"$tagname\" already exists" >&2;} { (exit 1); exit 1; }; } fi # Update the list of available tags. if test -n "$tagname"; then echo appending configuration tag \"$tagname\" to $ofile case $tagname in CXX) if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then ac_ext=cc ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu archive_cmds_need_lc_CXX=no allow_undefined_flag_CXX= always_export_symbols_CXX=no archive_expsym_cmds_CXX= export_dynamic_flag_spec_CXX= hardcode_direct_CXX=no hardcode_libdir_flag_spec_CXX= hardcode_libdir_flag_spec_ld_CXX= hardcode_libdir_separator_CXX= hardcode_minus_L_CXX=no hardcode_automatic_CXX=no module_cmds_CXX= module_expsym_cmds_CXX= link_all_deplibs_CXX=unknown old_archive_cmds_CXX=$old_archive_cmds no_undefined_flag_CXX= whole_archive_flag_spec_CXX= enable_shared_with_static_runtimes_CXX=no # Dependencies to place before and after the object being linked: predep_objects_CXX= postdep_objects_CXX= predeps_CXX= postdeps_CXX= compiler_lib_search_path_CXX= # Source file extension for C++ test sources. ac_ext=cc # Object file extension for compiled C++ test sources. objext=o objext_CXX=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;\n" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *) { return(0); }\n' # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # Allow CC to be a program name with arguments. compiler=$CC # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} compiler=$CC compiler_CXX=$CC cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` # We don't want -fno-exception wen compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' else lt_prog_compiler_no_builtin_flag_CXX= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration # Check whether --with-gnu-ld or --without-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then withval="$with_gnu_ld" test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi; ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. echo "$as_me:$LINENO: checking for ld used by $CC" >&5 echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6 case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then echo "$as_me:$LINENO: checking for GNU ld" >&5 echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6 else echo "$as_me:$LINENO: checking for non-GNU ld" >&5 echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6 fi if test "${lt_cv_path_LD+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some GNU ld's only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 echo "${ECHO_T}$LD" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} { (exit 1); exit 1; }; } echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6 if test "${lt_cv_prog_gnu_ld+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # I'd rather use --version here, but apparently some GNU ld's only accept -v. case `$LD -v 2>&1 &5 echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6 with_gnu_ld=$lt_cv_prog_gnu_ld # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | \ grep 'no-whole-archive' > /dev/null; then whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec_CXX= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 ld_shlibs_CXX=yes case $host_os in aix3*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aix4* | aix5*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix5*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds_CXX='' hardcode_direct_CXX=yes hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes if test "$GXX" = yes; then case $host_os in aix4.012|aix4.012.*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 hardcode_direct_CXX=yes else # We have old collect2 hardcode_direct_CXX=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L_CXX=yes hardcode_libdir_flag_spec_CXX='-L$libdir' hardcode_libdir_separator_CXX= fi esac shared_flag='-shared' else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols_CXX=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag_CXX='-berok' # Determine the default libpath from the value encoded in an empty executable. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'`; fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds_CXX="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag_CXX="-z nodefs" archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an empty executable. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'`; fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag_CXX=' ${wl}-bernotok' allow_undefined_flag_CXX=' ${wl}-berok' # -bexpall does not export symbols beginning with underscore (_) always_export_symbols_CXX=yes # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec_CXX=' ' archive_cmds_need_lc_CXX=yes # This is similar to how AIX traditionally builds it's shared libraries. archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; cygwin* | mingw* | pw32*) # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec_CXX='-L$libdir' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=no enable_shared_with_static_runtimes_CXX=yes if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' else ld_shlibs_CXX=no fi ;; darwin* | rhapsody*) case "$host_os" in rhapsody* | darwin1.[012]) allow_undefined_flag_CXX='${wl}-undefined ${wl}suppress' ;; *) # Darwin 1.3 on if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then allow_undefined_flag_CXX='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' else case ${MACOSX_DEPLOYMENT_TARGET} in 10.[012]) allow_undefined_flag_CXX='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) allow_undefined_flag_CXX='${wl}-undefined ${wl}dynamic_lookup' ;; esac fi ;; esac archive_cmds_need_lc_CXX=no hardcode_direct_CXX=no hardcode_automatic_CXX=yes hardcode_shlibpath_var_CXX=unsupported whole_archive_flag_spec_CXX='' link_all_deplibs_CXX=yes if test "$GXX" = yes ; then lt_int_apple_cc_single_mod=no output_verbose_link_cmd='echo' if $CC -dumpspecs 2>&1 | $EGREP 'single_module' >/dev/null ; then lt_int_apple_cc_single_mod=yes fi if test "X$lt_int_apple_cc_single_mod" = Xyes ; then archive_cmds_CXX='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' else archive_cmds_CXX='$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring' fi module_cmds_CXX='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's if test "X$lt_int_apple_cc_single_mod" = Xyes ; then archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' else archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' fi module_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' else case "$cc_basename" in xlc*) output_verbose_link_cmd='echo' archive_cmds_CXX='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' module_cmds_CXX='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' module_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ;; *) ld_shlibs_CXX=no ;; esac fi ;; dgux*) case $cc_basename in ec++) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; ghcx) # Green Hills C++ Compiler # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; freebsd12*) # C++ shared libraries reported to be fairly broken before switch to ELF ld_shlibs_CXX=no ;; freebsd-elf*) archive_cmds_need_lc_CXX=no ;; freebsd* | kfreebsd*-gnu) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions ld_shlibs_CXX=yes ;; gnu*) ;; hpux9*) hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' hardcode_libdir_separator_CXX=: export_dynamic_flag_spec_CXX='${wl}-E' hardcode_direct_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC) archive_cmds_CXX='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes; then archive_cmds_CXX='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then case "$host_cpu" in hppa*64*) hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' hardcode_libdir_flag_spec_ld_CXX='+b $libdir' hardcode_libdir_separator_CXX=: ;; ia64*) hardcode_libdir_flag_spec_CXX='-L$libdir' ;; *) hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' hardcode_libdir_separator_CXX=: export_dynamic_flag_spec_CXX='${wl}-E' ;; esac fi case "$host_cpu" in hppa*64*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no ;; ia64*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. ;; *) hardcode_direct_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC) case "$host_cpu" in hppa*64*|ia64*) archive_cmds_CXX='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' ;; *) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case "$host_cpu" in ia64*|hppa*64*) archive_cmds_CXX='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs' ;; *) archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; irix5* | irix6*) case $cc_basename in CC) # SGI C++ archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' else archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib' fi fi link_all_deplibs_CXX=yes ;; esac hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: ;; linux*) case $cc_basename in KCC) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' hardcode_libdir_flag_spec_CXX='${wl}--rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; esac archive_cmds_need_lc_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; cxx) # Compaq C++ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec_CXX='-rpath $libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; esac ;; lynxos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; m88k*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; mvs*) case $cc_basename in cxx) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; openbsd2*) # C++ shared libraries are fairly broken ld_shlibs_CXX=no ;; openbsd*) hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' export_dynamic_flag_spec_CXX='${wl}-E' whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd='echo' ;; osf3*) case $cc_basename in KCC) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' hardcode_libdir_separator_CXX=: # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; RCC) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; cxx) allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; osf4* | osf5*) case $cc_basename in KCC) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' hardcode_libdir_separator_CXX=: # Archives containing C++ object files must be created using # the KAI C++ compiler. old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; RCC) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; cxx) allow_undefined_flag_CXX=' -expect_unresolved \*' archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry $objdir/so_locations -o $lib~ $rm $lib.exp' hardcode_libdir_flag_spec_CXX='-rpath $libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; sco*) archive_cmds_need_lc_CXX=no case $cc_basename in CC) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; sunos4*) case $cc_basename in CC) # Sun C++ 4.x # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; lcc) # Lucid # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; solaris*) case $cc_basename in CC) # Sun C++ 4.2, 5.x and Centerline C++ no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G${allow_undefined_flag} -nolib -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -nolib ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_shlibpath_var_CXX=no case $host_os in solaris2.0-5 | solaris2.0-5.*) ;; *) # The C++ compiler is used as linker so we must use $wl # flag to pass the commands to the underlying system # linker. # Supported since Solaris 2.6 (maybe 2.5.1?) whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac link_all_deplibs_CXX=yes # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep "\-[LR]"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; gcx) # Green Hills C++ Compiler archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then no_undefined_flag_CXX=' ${wl}-z ${wl}defs' if $CC --version | grep -v '^2\.7' > /dev/null; then archive_cmds_CXX='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" fi hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' fi ;; esac ;; sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) archive_cmds_need_lc_CXX=no ;; tandem*) case $cc_basename in NCC) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5 echo "${ECHO_T}$ld_shlibs_CXX" >&6 test "$ld_shlibs_CXX" = no && can_build_shared=no GCC_CXX="$GXX" LD_CXX="$LD" cat > conftest.$ac_ext <&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no # The `*' in the case matches for architectures that use `case' in # $output_verbose_cmd can trigger glob expansion during the loop # eval without this substitution. output_verbose_link_cmd="`$echo \"X$output_verbose_link_cmd\" | $Xsed -e \"$no_glob_subst\"`" for p in `eval $output_verbose_link_cmd`; do case $p in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" \ || test $p = "-R"; then prev=$p continue else prev= fi if test "$pre_test_object_deps_done" = no; then case $p in -L* | -R*) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$compiler_lib_search_path_CXX"; then compiler_lib_search_path_CXX="${prev}${p}" else compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$postdeps_CXX"; then postdeps_CXX="${prev}${p}" else postdeps_CXX="${postdeps_CXX} ${prev}${p}" fi fi ;; *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$predep_objects_CXX"; then predep_objects_CXX="$p" else predep_objects_CXX="$predep_objects_CXX $p" fi else if test -z "$postdep_objects_CXX"; then postdep_objects_CXX="$p" else postdep_objects_CXX="$postdep_objects_CXX $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling CXX test program" fi $rm -f confest.$objext case " $postdeps_CXX " in *" -lc "*) archive_cmds_need_lc_CXX=no ;; esac lt_prog_compiler_wl_CXX= lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX= echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' fi ;; amigaos*) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' ;; beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | os2* | pw32*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_CXX='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_CXX='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all lt_prog_compiler_pic_CXX= ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_CXX=-Kconform_pic fi ;; hpux*) # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case "$host_cpu" in hppa*64*|ia64*) ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac else case $host_os in aix4* | aix5*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' else lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68) # Green Hills C++ Compiler # _LT_AC_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; darwin*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files case "$cc_basename" in xlc*) lt_prog_compiler_pic_CXX='-qnocommon' lt_prog_compiler_wl_CXX='-Wl,' ;; esac ;; dgux*) case $cc_basename in ec++) lt_prog_compiler_pic_CXX='-KPIC' ;; ghcx) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; freebsd* | kfreebsd*-gnu) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" if test "$host_cpu" != ia64; then lt_prog_compiler_pic_CXX='+Z' fi ;; aCC) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive" case "$host_cpu" in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_CXX='+Z' ;; esac ;; *) ;; esac ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux*) case $cc_basename in KCC) # KAI C++ Compiler lt_prog_compiler_wl_CXX='--backend -Wl,' lt_prog_compiler_pic_CXX='-fPIC' ;; icpc) # Intel C++ lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-static' ;; cxx) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; *) ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx) lt_prog_compiler_pic_CXX='-W c,exportall' ;; *) ;; esac ;; netbsd*) ;; osf3* | osf4* | osf5*) case $cc_basename in KCC) lt_prog_compiler_wl_CXX='--backend -Wl,' ;; RCC) # Rational C++ 2.4.1 lt_prog_compiler_pic_CXX='-pic' ;; cxx) # Digital/Compaq C++ lt_prog_compiler_wl_CXX='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; *) ;; esac ;; psos*) ;; sco*) case $cc_basename in CC) lt_prog_compiler_pic_CXX='-fPIC' ;; *) ;; esac ;; solaris*) case $cc_basename in CC) # Sun C++ 4.2, 5.x and Centerline C++ lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; gcx) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC) # Sun C++ 4.x lt_prog_compiler_pic_CXX='-pic' lt_prog_compiler_static_CXX='-Bstatic' ;; lcc) # Lucid lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; tandem*) case $cc_basename in NCC) # NonStop-UX NCC 3.20 lt_prog_compiler_pic_CXX='-KPIC' ;; *) ;; esac ;; unixware*) ;; vxworks*) ;; *) lt_prog_compiler_can_build_shared_CXX=no ;; esac fi echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_CXX" >&5 echo "${ECHO_T}$lt_prog_compiler_pic_CXX" >&6 # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_CXX"; then echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... $ECHO_C" >&6 if test "${lt_prog_compiler_pic_works_CXX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_prog_compiler_pic_works_CXX=no ac_outfile=conftest.$ac_objext printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:11072: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:11076: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings if test ! -s conftest.err; then lt_prog_compiler_pic_works_CXX=yes fi fi $rm conftest* fi echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_CXX" >&5 echo "${ECHO_T}$lt_prog_compiler_pic_works_CXX" >&6 if test x"$lt_prog_compiler_pic_works_CXX" = xyes; then case $lt_prog_compiler_pic_CXX in "" | " "*) ;; *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; esac else lt_prog_compiler_pic_CXX= lt_prog_compiler_can_build_shared_CXX=no fi fi case "$host_os" in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_CXX= ;; *) lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" ;; esac echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 if test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_prog_compiler_c_o_CXX=no $rm -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:11132: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:11136: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings if test ! -s out/conftest.err; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . $rm conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files $rm out/* && rmdir out cd .. rmdir conftest $rm conftest* fi echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_CXX" >&5 echo "${ECHO_T}$lt_cv_prog_compiler_c_o_CXX" >&6 hard_links="nottested" if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6 hard_links=yes $rm conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no echo "$as_me:$LINENO: result: $hard_links" >&5 echo "${ECHO_T}$hard_links" >&6 if test "$hard_links" = no; then { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' case $host_os in aix4* | aix5*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm if $NM -V 2>&1 | grep 'GNU' > /dev/null; then export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) export_symbols_cmds_CXX="$ltdll_cmds" ;; cygwin* | mingw*) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5 echo "${ECHO_T}$ld_shlibs_CXX" >&6 test "$ld_shlibs_CXX" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc_CXX" in x|xyes) # Assume -lc should be added archive_cmds_need_lc_CXX=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds_CXX in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 $rm conftest* printf "$lt_simple_compile_test_code" > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_CXX compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_CXX allow_undefined_flag_CXX= if { (eval echo "$as_me:$LINENO: \"$archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 (eval $archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } then archive_cmds_need_lc_CXX=no else archive_cmds_need_lc_CXX=yes fi allow_undefined_flag_CXX=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $rm conftest* echo "$as_me:$LINENO: result: $archive_cmds_need_lc_CXX" >&5 echo "${ECHO_T}$archive_cmds_need_lc_CXX" >&6 ;; esac fi ;; esac echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" if test "$GCC" = yes; then sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix4* | aix5*) version_type=linux need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$host_os in yes,cygwin* | yes,mingw* | yes,pw32*) library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $rm \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" ;; mingw*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH printed by # mingw gcc, but we are running on Cygwin. Gcc prints its search # path with ; separators, and with drive letters. We can handle the # drive letters (cygwin fileutils understands them), so leave them, # especially as we might pass files found there to a mingw objdump, # which wouldn't understand a cygwinified path. Ahh. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/./-/g'`${versuffix}${shared_ext}' ;; esac ;; *) library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' ;; esac dynamic_linker='Win32 ld.exe' # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. if test "$GCC" = yes; then sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` else sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' fi sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd1*) dynamic_linker=no ;; kfreebsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='GNU ld.so' ;; freebsd*) objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2*) shlibpath_overrides_runpath=yes ;; freebsd3.01* | freebsdelf3.01*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; *) # from 3.2 on shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case "$host_cpu" in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555. postinstall_cmds='chmod 555 $lib' ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be Linux ELF. linux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`$SED -e 's/:,\t/ /g;s/=^=*$//;s/=^= * / /g' /etc/ld.so.conf | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; knetbsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='GNU ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; nto-qnx*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; openbsd*) version_type=sunos need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; sco3.2v5*) version_type=osf soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH ;; solaris*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no export_dynamic_flag_spec='${wl}-Blargedynsym' runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac echo "$as_me:$LINENO: result: $dynamic_linker" >&5 echo "${ECHO_T}$dynamic_linker" >&6 test "$dynamic_linker" = no && can_build_shared=no echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 hardcode_action_CXX= if test -n "$hardcode_libdir_flag_spec_CXX" || \ test -n "$runpath_var_CXX" || \ test "X$hardcode_automatic_CXX" = "Xyes" ; then # We can hardcode non-existant directories. if test "$hardcode_direct_CXX" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, CXX)" != no && test "$hardcode_minus_L_CXX" != no; then # Linking always hardcodes the temporary library directory. hardcode_action_CXX=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action_CXX=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action_CXX=unsupported fi echo "$as_me:$LINENO: result: $hardcode_action_CXX" >&5 echo "${ECHO_T}$hardcode_action_CXX" >&6 if test "$hardcode_action_CXX" = relink; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi striplib= old_striplib= echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6 if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi ;; *) echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 ;; esac fi if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 if test "${ac_cv_lib_dl_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dlopen (); int main () { dlopen (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_dl_dlopen=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_dl_dlopen=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 if test $ac_cv_lib_dl_dlopen = yes; then lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes fi ;; *) echo "$as_me:$LINENO: checking for shl_load" >&5 echo $ECHO_N "checking for shl_load... $ECHO_C" >&6 if test "${ac_cv_func_shl_load+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define shl_load to an innocuous variant, in case declares shl_load. For example, HP-UX 11i declares gettimeofday. */ #define shl_load innocuous_shl_load /* System header to define __stub macros and hopefully few prototypes, which can conflict with char shl_load (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef shl_load /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char shl_load (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_shl_load) || defined (__stub___shl_load) choke me #else char (*f) () = shl_load; #endif #ifdef __cplusplus } #endif int main () { return f != shl_load; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_shl_load=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_shl_load=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5 echo "${ECHO_T}$ac_cv_func_shl_load" >&6 if test $ac_cv_func_shl_load = yes; then lt_cv_dlopen="shl_load" else echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5 echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6 if test "${ac_cv_lib_dld_shl_load+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char shl_load (); int main () { shl_load (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_dld_shl_load=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_dld_shl_load=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6 if test $ac_cv_lib_dld_shl_load = yes; then lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld" else echo "$as_me:$LINENO: checking for dlopen" >&5 echo $ECHO_N "checking for dlopen... $ECHO_C" >&6 if test "${ac_cv_func_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define dlopen to an innocuous variant, in case declares dlopen. For example, HP-UX 11i declares gettimeofday. */ #define dlopen innocuous_dlopen /* System header to define __stub macros and hopefully few prototypes, which can conflict with char dlopen (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef dlopen /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dlopen (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_dlopen) || defined (__stub___dlopen) choke me #else char (*f) () = dlopen; #endif #ifdef __cplusplus } #endif int main () { return f != dlopen; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_dlopen=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_dlopen=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5 echo "${ECHO_T}$ac_cv_func_dlopen" >&6 if test $ac_cv_func_dlopen = yes; then lt_cv_dlopen="dlopen" else echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 if test "${ac_cv_lib_dl_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dlopen (); int main () { dlopen (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_dl_dlopen=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_dl_dlopen=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 if test $ac_cv_lib_dl_dlopen = yes; then lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5 echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6 if test "${ac_cv_lib_svld_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dlopen (); int main () { dlopen (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_svld_dlopen=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_svld_dlopen=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5 echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6 if test $ac_cv_lib_svld_dlopen = yes; then lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" else echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5 echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6 if test "${ac_cv_lib_dld_dld_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dld_link (); int main () { dld_link (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_dld_dld_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_dld_dld_link=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5 echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6 if test $ac_cv_lib_dld_dld_link = yes; then lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld" fi fi fi fi fi fi ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5 echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6 if test "${lt_cv_dlopen_self+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif #ifdef __cplusplus extern "C" void exit (int); #endif void fnord() { int i=42;} int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; /* dlclose (self); */ } exit (status); } EOF if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; x$lt_unknown|x*) lt_cv_dlopen_self=no ;; esac else : # compilation failed lt_cv_dlopen_self=no fi fi rm -fr conftest* fi echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5 echo "${ECHO_T}$lt_cv_dlopen_self" >&6 if test "x$lt_cv_dlopen_self" = xyes; then LDFLAGS="$LDFLAGS $link_static_flag" echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5 echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6 if test "${lt_cv_dlopen_self_static+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self_static=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif #ifdef __cplusplus extern "C" void exit (int); #endif void fnord() { int i=42;} int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; /* dlclose (self); */ } exit (status); } EOF if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_unknown|x*) lt_cv_dlopen_self_static=no ;; esac else : # compilation failed lt_cv_dlopen_self_static=no fi fi rm -fr conftest* fi echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5 echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6 fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi # The else clause should only fire when bootstrapping the # libtool distribution, otherwise you forgot to ship ltmain.sh # with your package, and you will get complaints that there are # no rules to generate ltmain.sh. if test -f "$ltmain"; then # See if we are running on zsh, and set the options which allow our commands through # without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi # Now quote all the things that may contain metacharacters while being # careful not to overquote the AC_SUBSTed values. We take copies of the # variables and quote the copies for generation of the libtool script. for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ SED SHELL STRIP \ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ deplibs_check_method reload_flag reload_cmds need_locks \ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ old_postinstall_cmds old_postuninstall_cmds \ compiler_CXX \ CC_CXX \ LD_CXX \ lt_prog_compiler_wl_CXX \ lt_prog_compiler_pic_CXX \ lt_prog_compiler_static_CXX \ lt_prog_compiler_no_builtin_flag_CXX \ export_dynamic_flag_spec_CXX \ thread_safe_flag_spec_CXX \ whole_archive_flag_spec_CXX \ enable_shared_with_static_runtimes_CXX \ old_archive_cmds_CXX \ old_archive_from_new_cmds_CXX \ predep_objects_CXX \ postdep_objects_CXX \ predeps_CXX \ postdeps_CXX \ compiler_lib_search_path_CXX \ archive_cmds_CXX \ archive_expsym_cmds_CXX \ postinstall_cmds_CXX \ postuninstall_cmds_CXX \ old_archive_from_expsyms_cmds_CXX \ allow_undefined_flag_CXX \ no_undefined_flag_CXX \ export_symbols_cmds_CXX \ hardcode_libdir_flag_spec_CXX \ hardcode_libdir_flag_spec_ld_CXX \ hardcode_libdir_separator_CXX \ hardcode_automatic_CXX \ module_cmds_CXX \ module_expsym_cmds_CXX \ lt_cv_prog_compiler_c_o_CXX \ exclude_expsyms_CXX \ include_expsyms_CXX; do case $var in old_archive_cmds_CXX | \ old_archive_from_new_cmds_CXX | \ archive_cmds_CXX | \ archive_expsym_cmds_CXX | \ module_cmds_CXX | \ module_expsym_cmds_CXX | \ old_archive_from_expsyms_cmds_CXX | \ export_symbols_cmds_CXX | \ extract_expsyms_cmds | reload_cmds | finish_cmds | \ postinstall_cmds | postuninstall_cmds | \ old_postinstall_cmds | old_postuninstall_cmds | \ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) # Double-quote double-evaled strings. eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" ;; *) eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" ;; esac done case $lt_echo in *'\$0 --fallback-echo"') lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` ;; esac cfgfile="$ofile" cat <<__EOF__ >> "$cfgfile" # ### BEGIN LIBTOOL TAG CONFIG: $tagname # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_CXX # Whether or not to disallow shared libs when runtime libs are static allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # The host system. host_alias=$host_alias host=$host # An echo program that does not interpret backslashes. echo=$lt_echo # The archiver. AR=$lt_AR AR_FLAGS=$lt_AR_FLAGS # A C compiler. LTCC=$lt_LTCC # A language-specific compiler. CC=$lt_compiler_CXX # Is the compiler the GNU C compiler? with_gcc=$GCC_CXX # An ERE matcher. EGREP=$lt_EGREP # The linker used to build libraries. LD=$lt_LD_CXX # Whether we need hard or soft links. LN_S=$lt_LN_S # A BSD-compatible nm program. NM=$lt_NM # A symbol stripping program STRIP=$lt_STRIP # Used to examine libraries when file_magic_cmd begins "file" MAGIC_CMD=$MAGIC_CMD # Used on cygwin: DLL creation program. DLLTOOL="$DLLTOOL" # Used on cygwin: object dumper. OBJDUMP="$OBJDUMP" # Used on cygwin: assembler. AS="$AS" # The name of the directory that contains temporary libtool files. objdir=$objdir # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_CXX # Object file suffix (normally "o"). objext="$ac_objext" # Old archive suffix (normally "a"). libext="$libext" # Shared library suffix (normally ".so"). shrext_cmds='$shrext_cmds' # Executable file suffix (normally ""). exeext="$exeext" # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_CXX pic_mode=$pic_mode # What is the maximum length of a command? max_cmd_len=$lt_cv_sys_max_cmd_len # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX # Must we lock files when doing compilation ? need_locks=$lt_need_locks # Do we need the lib prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_CXX # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX # Compiler flag to generate thread-safe objects. thread_safe_flag_spec=$lt_thread_safe_flag_spec_CXX # Library versioning type. version_type=$version_type # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME. library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Commands used to build and install an old-style archive. RANLIB=$lt_RANLIB old_archive_cmds=$lt_old_archive_cmds_CXX old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX # Commands used to build and install a shared archive. archive_cmds=$lt_archive_cmds_CXX archive_expsym_cmds=$lt_archive_expsym_cmds_CXX postinstall_cmds=$lt_postinstall_cmds postuninstall_cmds=$lt_postuninstall_cmds # Commands used to build a loadable module (assumed same as above if empty) module_cmds=$lt_module_cmds_CXX module_expsym_cmds=$lt_module_expsym_cmds_CXX # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # Dependencies to place before the objects being linked to create a # shared library. predep_objects=$lt_predep_objects_CXX # Dependencies to place after the objects being linked to create a # shared library. postdep_objects=$lt_postdep_objects_CXX # Dependencies to place before the objects being linked to create a # shared library. predeps=$lt_predeps_CXX # Dependencies to place after the objects being linked to create a # shared library. postdeps=$lt_postdeps_CXX # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_CXX # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method == file_magic. file_magic_cmd=$lt_file_magic_cmd # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_CXX # Flag that forces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_CXX # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # Same as above, but a single script fragment to be evaled but not shown. finish_eval=$lt_finish_eval # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # This is the shared library runtime path variable. runpath_var=$runpath_var # This is the shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_CXX # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist. hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX # If ld is used when linking, flag to hardcode \$libdir into # a binary during linking. This must work even if \$libdir does # not exist. hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_CXX # Whether we need a single -rpath flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX # Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the # resulting binary. hardcode_direct=$hardcode_direct_CXX # Set to yes if using the -LDIR flag during linking hardcodes DIR into the # resulting binary. hardcode_minus_L=$hardcode_minus_L_CXX # Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into # the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX # Set to yes if building a shared library automatically hardcodes DIR into the library # and all subsequent libraries and executables linked against it. hardcode_automatic=$hardcode_automatic_CXX # Variables whose values should be saved in libtool wrapper scripts and # restored at relink time. variables_saved_for_relink="$variables_saved_for_relink" # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_CXX # Compile-time system search path for libraries sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Fix the shell variable \$srcfile for the compiler. fix_srcfile_path="$fix_srcfile_path_CXX" # Set to yes if exported symbols are required. always_export_symbols=$always_export_symbols_CXX # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_CXX # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_CXX # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_CXX # ### END LIBTOOL TAG CONFIG: $tagname __EOF__ else # If there is no Makefile yet, we rely on a make rule to execute # `config.status --recheck' to rerun these tests and create the # libtool script then. ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` if test -f "$ltmain_in"; then test -f Makefile && make "$ltmain" fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC=$lt_save_CC LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ldcxx=$with_gnu_ld with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld else tagname="" fi ;; F77) if test -n "$F77" && test "X$F77" != "Xno"; then ac_ext=f ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_f77_compiler_gnu archive_cmds_need_lc_F77=no allow_undefined_flag_F77= always_export_symbols_F77=no archive_expsym_cmds_F77= export_dynamic_flag_spec_F77= hardcode_direct_F77=no hardcode_libdir_flag_spec_F77= hardcode_libdir_flag_spec_ld_F77= hardcode_libdir_separator_F77= hardcode_minus_L_F77=no hardcode_automatic_F77=no module_cmds_F77= module_expsym_cmds_F77= link_all_deplibs_F77=unknown old_archive_cmds_F77=$old_archive_cmds no_undefined_flag_F77= whole_archive_flag_spec_F77= enable_shared_with_static_runtimes_F77=no # Source file extension for f77 test sources. ac_ext=f # Object file extension for compiled f77 test sources. objext=o objext_F77=$objext # Code to be used in simple compile tests lt_simple_compile_test_code=" subroutine t\n return\n end\n" # Code to be used in simple link tests lt_simple_link_test_code=" program t\n end\n" # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # Allow CC to be a program name with arguments. compiler=$CC # Allow CC to be a program name with arguments. lt_save_CC="$CC" CC=${F77-"f77"} compiler=$CC compiler_F77=$CC cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'` echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6 echo "$as_me:$LINENO: result: $can_build_shared" >&5 echo "${ECHO_T}$can_build_shared" >&6 echo "$as_me:$LINENO: checking whether to build shared libraries" >&5 echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6 test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case "$host_os" in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix4* | aix5*) test "$enable_shared" = yes && enable_static=no ;; esac echo "$as_me:$LINENO: result: $enable_shared" >&5 echo "${ECHO_T}$enable_shared" >&6 echo "$as_me:$LINENO: checking whether to build static libraries" >&5 echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6 # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes echo "$as_me:$LINENO: result: $enable_static" >&5 echo "${ECHO_T}$enable_static" >&6 test "$ld_shlibs_F77" = no && can_build_shared=no GCC_F77="$G77" LD_F77="$LD" lt_prog_compiler_wl_F77= lt_prog_compiler_pic_F77= lt_prog_compiler_static_F77= echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 if test "$GCC" = yes; then lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_static_F77='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_F77='-Bstatic' fi ;; amigaos*) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic_F77='-m68020 -resident32 -malways-restore-a4' ;; beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_F77='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_F77='-fno-common' ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared_F77=no enable_shared=no ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_F77=-Kconform_pic fi ;; hpux*) # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case "$host_cpu" in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_F77='-fPIC' ;; esac ;; *) lt_prog_compiler_pic_F77='-fPIC' ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl_F77='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_F77='-Bstatic' else lt_prog_compiler_static_F77='-bnso -bI:/lib/syscalls.exp' fi ;; darwin*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files case "$cc_basename" in xlc*) lt_prog_compiler_pic_F77='-qnocommon' lt_prog_compiler_wl_F77='-Wl,' ;; esac ;; mingw* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_F77='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl_F77='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case "$host_cpu" in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_F77='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static_F77='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl_F77='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static_F77='-non_shared' ;; newsos6) lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' ;; linux*) case $CC in icc* | ecc*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-static' ;; ccc*) lt_prog_compiler_wl_F77='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static_F77='-non_shared' ;; esac ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl_F77='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static_F77='-non_shared' ;; sco3.2v5*) lt_prog_compiler_pic_F77='-Kpic' lt_prog_compiler_static_F77='-dn' ;; solaris*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' ;; sunos4*) lt_prog_compiler_wl_F77='-Qoption ld ' lt_prog_compiler_pic_F77='-PIC' lt_prog_compiler_static_F77='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then lt_prog_compiler_pic_F77='-Kconform_pic' lt_prog_compiler_static_F77='-Bstatic' fi ;; uts4*) lt_prog_compiler_pic_F77='-pic' lt_prog_compiler_static_F77='-Bstatic' ;; *) lt_prog_compiler_can_build_shared_F77=no ;; esac fi echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_F77" >&5 echo "${ECHO_T}$lt_prog_compiler_pic_F77" >&6 # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_F77"; then echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works" >&5 echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works... $ECHO_C" >&6 if test "${lt_prog_compiler_pic_works_F77+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_prog_compiler_pic_works_F77=no ac_outfile=conftest.$ac_objext printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_F77" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:13428: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:13432: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings if test ! -s conftest.err; then lt_prog_compiler_pic_works_F77=yes fi fi $rm conftest* fi echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_F77" >&5 echo "${ECHO_T}$lt_prog_compiler_pic_works_F77" >&6 if test x"$lt_prog_compiler_pic_works_F77" = xyes; then case $lt_prog_compiler_pic_F77 in "" | " "*) ;; *) lt_prog_compiler_pic_F77=" $lt_prog_compiler_pic_F77" ;; esac else lt_prog_compiler_pic_F77= lt_prog_compiler_can_build_shared_F77=no fi fi case "$host_os" in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_F77= ;; *) lt_prog_compiler_pic_F77="$lt_prog_compiler_pic_F77" ;; esac echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 if test "${lt_cv_prog_compiler_c_o_F77+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_prog_compiler_c_o_F77=no $rm -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:13488: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:13492: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings if test ! -s out/conftest.err; then lt_cv_prog_compiler_c_o_F77=yes fi fi chmod u+w . $rm conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files $rm out/* && rmdir out cd .. rmdir conftest $rm conftest* fi echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_F77" >&5 echo "${ECHO_T}$lt_cv_prog_compiler_c_o_F77" >&6 hard_links="nottested" if test "$lt_cv_prog_compiler_c_o_F77" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6 hard_links=yes $rm conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no echo "$as_me:$LINENO: result: $hard_links" >&5 echo "${ECHO_T}$hard_links" >&6 if test "$hard_links" = no; then { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 runpath_var= allow_undefined_flag_F77= enable_shared_with_static_runtimes_F77=no archive_cmds_F77= archive_expsym_cmds_F77= old_archive_From_new_cmds_F77= old_archive_from_expsyms_cmds_F77= export_dynamic_flag_spec_F77= whole_archive_flag_spec_F77= thread_safe_flag_spec_F77= hardcode_libdir_flag_spec_F77= hardcode_libdir_flag_spec_ld_F77= hardcode_libdir_separator_F77= hardcode_direct_F77=no hardcode_minus_L_F77=no hardcode_shlibpath_var_F77=unsupported link_all_deplibs_F77=unknown hardcode_automatic_F77=no module_cmds_F77= module_expsym_cmds_F77= always_export_symbols_F77=no export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms_F77= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. exclude_expsyms_F77="_GLOBAL_OFFSET_TABLE_" # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs_F77=yes if test "$with_gnu_ld" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # See if GNU ld supports shared libraries. case $host_os in aix3* | aix4* | aix5*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs_F77=no cat <&2 *** Warning: the GNU linker, at least up to release 2.9.1, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to modify your PATH *** so that a non-GNU linker is found, and then restart. EOF fi ;; amigaos*) archive_cmds_F77='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_minus_L_F77=yes # Samuel A. Falvo II reports # that the semantics of dynamic libraries on AmigaOS, at least up # to version 4, is to share data among multiple programs linked # with the same dynamic library. Since this doesn't match the # behavior of shared libraries on other platforms, we can't use # them. ld_shlibs_F77=no ;; beos*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then allow_undefined_flag_F77=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds_F77='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs_F77=no fi ;; cygwin* | mingw* | pw32*) # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, F77) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec_F77='-L$libdir' allow_undefined_flag_F77=unsupported always_export_symbols_F77=no enable_shared_with_static_runtimes_F77=yes export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds_F77='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' else ld_shlibs=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds_F77='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris* | sysv5*) if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then ld_shlibs_F77=no cat <&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. EOF elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs_F77=no fi ;; sunos4*) archive_cmds_F77='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct_F77=yes hardcode_shlibpath_var_F77=no ;; linux*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then tmp_archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_cmds_F77="$tmp_archive_cmds" supports_anon_versioning=no case `$LD -v 2>/dev/null` in *\ 01.* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac if test $supports_anon_versioning = yes; then archive_expsym_cmds_F77='$echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ $echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' else archive_expsym_cmds_F77="$tmp_archive_cmds" fi else ld_shlibs_F77=no fi ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs_F77=no fi ;; esac if test "$ld_shlibs_F77" = yes; then runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec_F77='${wl}--rpath ${wl}$libdir' export_dynamic_flag_spec_F77='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then whole_archive_flag_spec_F77="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec_F77= fi fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag_F77=unsupported always_export_symbols_F77=yes archive_expsym_cmds_F77='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L_F77=yes if test "$GCC" = yes && test -z "$link_static_flag"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct_F77=unsupported fi ;; aix4* | aix5*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm if $NM -V 2>&1 | grep 'GNU' > /dev/null; then export_symbols_cmds_F77='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_F77='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix5*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds_F77='' hardcode_direct_F77=yes hardcode_libdir_separator_F77=':' link_all_deplibs_F77=yes if test "$GCC" = yes; then case $host_os in aix4.012|aix4.012.*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 hardcode_direct_F77=yes else # We have old collect2 hardcode_direct_F77=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L_F77=yes hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_libdir_separator_F77= fi esac shared_flag='-shared' else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols_F77=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag_F77='-berok' # Determine the default libpath from the value encoded in an empty executable. cat >conftest.$ac_ext <<_ACEOF program main end _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_f77_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'`; fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds_F77="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec_F77='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag_F77="-z nodefs" archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an empty executable. cat >conftest.$ac_ext <<_ACEOF program main end _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_f77_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'`; fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag_F77=' ${wl}-bernotok' allow_undefined_flag_F77=' ${wl}-berok' # -bexpall does not export symbols beginning with underscore (_) always_export_symbols_F77=yes # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec_F77=' ' archive_cmds_need_lc_F77=yes # This is similar to how AIX traditionally builds it's shared libraries. archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) archive_cmds_F77='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_minus_L_F77=yes # see comment about different semantics on the GNU ld section ld_shlibs_F77=no ;; bsdi[45]*) export_dynamic_flag_spec_F77=-rdynamic ;; cygwin* | mingw* | pw32*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec_F77=' ' allow_undefined_flag_F77=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds_F77='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_From_new_cmds_F77='true' # FIXME: Should let the user specify the lib program. old_archive_cmds_F77='lib /OUT:$oldlib$oldobjs$old_deplibs' fix_srcfile_path='`cygpath -w "$srcfile"`' enable_shared_with_static_runtimes_F77=yes ;; darwin* | rhapsody*) case "$host_os" in rhapsody* | darwin1.[012]) allow_undefined_flag_F77='${wl}-undefined ${wl}suppress' ;; *) # Darwin 1.3 on if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then allow_undefined_flag_F77='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' else case ${MACOSX_DEPLOYMENT_TARGET} in 10.[012]) allow_undefined_flag_F77='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) allow_undefined_flag_F77='${wl}-undefined ${wl}dynamic_lookup' ;; esac fi ;; esac archive_cmds_need_lc_F77=no hardcode_direct_F77=no hardcode_automatic_F77=yes hardcode_shlibpath_var_F77=unsupported whole_archive_flag_spec_F77='' link_all_deplibs_F77=yes if test "$GCC" = yes ; then output_verbose_link_cmd='echo' archive_cmds_F77='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' module_cmds_F77='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' module_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' else case "$cc_basename" in xlc*) output_verbose_link_cmd='echo' archive_cmds_F77='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' module_cmds_F77='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' module_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ;; *) ld_shlibs_F77=no ;; esac fi ;; dgux*) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_shlibpath_var_F77=no ;; freebsd1*) ld_shlibs_F77=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec_F77='-R$libdir' hardcode_direct_F77=yes hardcode_shlibpath_var_F77=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2*) archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_F77=yes hardcode_minus_L_F77=yes hardcode_shlibpath_var_F77=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | kfreebsd*-gnu) archive_cmds_F77='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec_F77='-R$libdir' hardcode_direct_F77=yes hardcode_shlibpath_var_F77=no ;; hpux9*) if test "$GCC" = yes; then archive_cmds_F77='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else archive_cmds_F77='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' hardcode_libdir_separator_F77=: hardcode_direct_F77=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_F77=yes export_dynamic_flag_spec_F77='${wl}-E' ;; hpux10* | hpux11*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then case "$host_cpu" in hppa*64*|ia64*) archive_cmds_F77='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_F77='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case "$host_cpu" in hppa*64*|ia64*) archive_cmds_F77='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' ;; *) archive_cmds_F77='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' ;; esac fi if test "$with_gnu_ld" = no; then case "$host_cpu" in hppa*64*) hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' hardcode_libdir_flag_spec_ld_F77='+b $libdir' hardcode_libdir_separator_F77=: hardcode_direct_F77=no hardcode_shlibpath_var_F77=no ;; ia64*) hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_direct_F77=no hardcode_shlibpath_var_F77=no # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_F77=yes ;; *) hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' hardcode_libdir_separator_F77=: hardcode_direct_F77=yes export_dynamic_flag_spec_F77='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_F77=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else archive_cmds_F77='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_ld_F77='-rpath $libdir' fi hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_F77=: link_all_deplibs_F77=yes ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds_F77='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec_F77='-R$libdir' hardcode_direct_F77=yes hardcode_shlibpath_var_F77=no ;; newsos6) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_F77=yes hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_F77=: hardcode_shlibpath_var_F77=no ;; openbsd*) hardcode_direct_F77=yes hardcode_shlibpath_var_F77=no if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' export_dynamic_flag_spec_F77='${wl}-E' else case $host_os in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_F77='-R$libdir' ;; *) archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' ;; esac fi ;; os2*) hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_minus_L_F77=yes allow_undefined_flag_F77=unsupported archive_cmds_F77='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' old_archive_From_new_cmds_F77='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else allow_undefined_flag_F77=' -expect_unresolved \*' archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' fi hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_F77=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' else allow_undefined_flag_F77=' -expect_unresolved \*' archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds_F77='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec_F77='-rpath $libdir' fi hardcode_libdir_separator_F77=: ;; sco3.2v5*) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var_F77=no export_dynamic_flag_spec_F77='${wl}-Bexport' runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ;; solaris*) no_undefined_flag_F77=' -z text' if test "$GCC" = yes; then archive_cmds_F77='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' else archive_cmds_F77='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' fi hardcode_libdir_flag_spec_F77='-R$libdir' hardcode_shlibpath_var_F77=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # Supported since Solaris 2.6 (maybe 2.5.1?) whole_archive_flag_spec_F77='-z allextract$convenience -z defaultextract' ;; esac link_all_deplibs_F77=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds_F77='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_F77='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_direct_F77=yes hardcode_minus_L_F77=yes hardcode_shlibpath_var_F77=no ;; sysv4) case $host_vendor in sni) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_F77=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds_F77='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds_F77='$CC -r -o $output$reload_objs' hardcode_direct_F77=no ;; motorola) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_F77=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var_F77=no ;; sysv4.3*) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var_F77=no export_dynamic_flag_spec_F77='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var_F77=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs_F77=yes fi ;; sysv4.2uw2*) archive_cmds_F77='$LD -G -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_F77=yes hardcode_minus_L_F77=no hardcode_shlibpath_var_F77=no hardcode_runpath_var=yes runpath_var=LD_RUN_PATH ;; sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) no_undefined_flag_F77='${wl}-z ${wl}text' if test "$GCC" = yes; then archive_cmds_F77='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_F77='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' fi runpath_var='LD_RUN_PATH' hardcode_shlibpath_var_F77=no ;; sysv5*) no_undefined_flag_F77=' -z text' # $CC -shared without GNU ld will not create a library from C++ # object files and a static libstdc++, better avoid it by now archive_cmds_F77='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' hardcode_libdir_flag_spec_F77= hardcode_shlibpath_var_F77=no runpath_var='LD_RUN_PATH' ;; uts4*) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_shlibpath_var_F77=no ;; *) ld_shlibs_F77=no ;; esac fi echo "$as_me:$LINENO: result: $ld_shlibs_F77" >&5 echo "${ECHO_T}$ld_shlibs_F77" >&6 test "$ld_shlibs_F77" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc_F77" in x|xyes) # Assume -lc should be added archive_cmds_need_lc_F77=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds_F77 in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 $rm conftest* printf "$lt_simple_compile_test_code" > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_F77 compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_F77 allow_undefined_flag_F77= if { (eval echo "$as_me:$LINENO: \"$archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 (eval $archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } then archive_cmds_need_lc_F77=no else archive_cmds_need_lc_F77=yes fi allow_undefined_flag_F77=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $rm conftest* echo "$as_me:$LINENO: result: $archive_cmds_need_lc_F77" >&5 echo "${ECHO_T}$archive_cmds_need_lc_F77" >&6 ;; esac fi ;; esac echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" if test "$GCC" = yes; then sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix4* | aix5*) version_type=linux need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$host_os in yes,cygwin* | yes,mingw* | yes,pw32*) library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $rm \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" ;; mingw*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH printed by # mingw gcc, but we are running on Cygwin. Gcc prints its search # path with ; separators, and with drive letters. We can handle the # drive letters (cygwin fileutils understands them), so leave them, # especially as we might pass files found there to a mingw objdump, # which wouldn't understand a cygwinified path. Ahh. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/./-/g'`${versuffix}${shared_ext}' ;; esac ;; *) library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' ;; esac dynamic_linker='Win32 ld.exe' # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. if test "$GCC" = yes; then sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` else sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' fi sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd1*) dynamic_linker=no ;; kfreebsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='GNU ld.so' ;; freebsd*) objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2*) shlibpath_overrides_runpath=yes ;; freebsd3.01* | freebsdelf3.01*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; *) # from 3.2 on shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case "$host_cpu" in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555. postinstall_cmds='chmod 555 $lib' ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be Linux ELF. linux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`$SED -e 's/:,\t/ /g;s/=^=*$//;s/=^= * / /g' /etc/ld.so.conf | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; knetbsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='GNU ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; nto-qnx*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; openbsd*) version_type=sunos need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; sco3.2v5*) version_type=osf soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH ;; solaris*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no export_dynamic_flag_spec='${wl}-Blargedynsym' runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac echo "$as_me:$LINENO: result: $dynamic_linker" >&5 echo "${ECHO_T}$dynamic_linker" >&6 test "$dynamic_linker" = no && can_build_shared=no echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 hardcode_action_F77= if test -n "$hardcode_libdir_flag_spec_F77" || \ test -n "$runpath_var_F77" || \ test "X$hardcode_automatic_F77" = "Xyes" ; then # We can hardcode non-existant directories. if test "$hardcode_direct_F77" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, F77)" != no && test "$hardcode_minus_L_F77" != no; then # Linking always hardcodes the temporary library directory. hardcode_action_F77=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action_F77=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action_F77=unsupported fi echo "$as_me:$LINENO: result: $hardcode_action_F77" >&5 echo "${ECHO_T}$hardcode_action_F77" >&6 if test "$hardcode_action_F77" = relink; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi striplib= old_striplib= echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6 if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi ;; *) echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 ;; esac fi # The else clause should only fire when bootstrapping the # libtool distribution, otherwise you forgot to ship ltmain.sh # with your package, and you will get complaints that there are # no rules to generate ltmain.sh. if test -f "$ltmain"; then # See if we are running on zsh, and set the options which allow our commands through # without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi # Now quote all the things that may contain metacharacters while being # careful not to overquote the AC_SUBSTed values. We take copies of the # variables and quote the copies for generation of the libtool script. for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ SED SHELL STRIP \ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ deplibs_check_method reload_flag reload_cmds need_locks \ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ old_postinstall_cmds old_postuninstall_cmds \ compiler_F77 \ CC_F77 \ LD_F77 \ lt_prog_compiler_wl_F77 \ lt_prog_compiler_pic_F77 \ lt_prog_compiler_static_F77 \ lt_prog_compiler_no_builtin_flag_F77 \ export_dynamic_flag_spec_F77 \ thread_safe_flag_spec_F77 \ whole_archive_flag_spec_F77 \ enable_shared_with_static_runtimes_F77 \ old_archive_cmds_F77 \ old_archive_from_new_cmds_F77 \ predep_objects_F77 \ postdep_objects_F77 \ predeps_F77 \ postdeps_F77 \ compiler_lib_search_path_F77 \ archive_cmds_F77 \ archive_expsym_cmds_F77 \ postinstall_cmds_F77 \ postuninstall_cmds_F77 \ old_archive_from_expsyms_cmds_F77 \ allow_undefined_flag_F77 \ no_undefined_flag_F77 \ export_symbols_cmds_F77 \ hardcode_libdir_flag_spec_F77 \ hardcode_libdir_flag_spec_ld_F77 \ hardcode_libdir_separator_F77 \ hardcode_automatic_F77 \ module_cmds_F77 \ module_expsym_cmds_F77 \ lt_cv_prog_compiler_c_o_F77 \ exclude_expsyms_F77 \ include_expsyms_F77; do case $var in old_archive_cmds_F77 | \ old_archive_from_new_cmds_F77 | \ archive_cmds_F77 | \ archive_expsym_cmds_F77 | \ module_cmds_F77 | \ module_expsym_cmds_F77 | \ old_archive_from_expsyms_cmds_F77 | \ export_symbols_cmds_F77 | \ extract_expsyms_cmds | reload_cmds | finish_cmds | \ postinstall_cmds | postuninstall_cmds | \ old_postinstall_cmds | old_postuninstall_cmds | \ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) # Double-quote double-evaled strings. eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" ;; *) eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" ;; esac done case $lt_echo in *'\$0 --fallback-echo"') lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` ;; esac cfgfile="$ofile" cat <<__EOF__ >> "$cfgfile" # ### BEGIN LIBTOOL TAG CONFIG: $tagname # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_F77 # Whether or not to disallow shared libs when runtime libs are static allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_F77 # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # The host system. host_alias=$host_alias host=$host # An echo program that does not interpret backslashes. echo=$lt_echo # The archiver. AR=$lt_AR AR_FLAGS=$lt_AR_FLAGS # A C compiler. LTCC=$lt_LTCC # A language-specific compiler. CC=$lt_compiler_F77 # Is the compiler the GNU C compiler? with_gcc=$GCC_F77 # An ERE matcher. EGREP=$lt_EGREP # The linker used to build libraries. LD=$lt_LD_F77 # Whether we need hard or soft links. LN_S=$lt_LN_S # A BSD-compatible nm program. NM=$lt_NM # A symbol stripping program STRIP=$lt_STRIP # Used to examine libraries when file_magic_cmd begins "file" MAGIC_CMD=$MAGIC_CMD # Used on cygwin: DLL creation program. DLLTOOL="$DLLTOOL" # Used on cygwin: object dumper. OBJDUMP="$OBJDUMP" # Used on cygwin: assembler. AS="$AS" # The name of the directory that contains temporary libtool files. objdir=$objdir # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_F77 # Object file suffix (normally "o"). objext="$ac_objext" # Old archive suffix (normally "a"). libext="$libext" # Shared library suffix (normally ".so"). shrext_cmds='$shrext_cmds' # Executable file suffix (normally ""). exeext="$exeext" # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_F77 pic_mode=$pic_mode # What is the maximum length of a command? max_cmd_len=$lt_cv_sys_max_cmd_len # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_F77 # Must we lock files when doing compilation ? need_locks=$lt_need_locks # Do we need the lib prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_F77 # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_F77 # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_F77 # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_F77 # Compiler flag to generate thread-safe objects. thread_safe_flag_spec=$lt_thread_safe_flag_spec_F77 # Library versioning type. version_type=$version_type # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME. library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Commands used to build and install an old-style archive. RANLIB=$lt_RANLIB old_archive_cmds=$lt_old_archive_cmds_F77 old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_F77 # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_F77 # Commands used to build and install a shared archive. archive_cmds=$lt_archive_cmds_F77 archive_expsym_cmds=$lt_archive_expsym_cmds_F77 postinstall_cmds=$lt_postinstall_cmds postuninstall_cmds=$lt_postuninstall_cmds # Commands used to build a loadable module (assumed same as above if empty) module_cmds=$lt_module_cmds_F77 module_expsym_cmds=$lt_module_expsym_cmds_F77 # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # Dependencies to place before the objects being linked to create a # shared library. predep_objects=$lt_predep_objects_F77 # Dependencies to place after the objects being linked to create a # shared library. postdep_objects=$lt_postdep_objects_F77 # Dependencies to place before the objects being linked to create a # shared library. predeps=$lt_predeps_F77 # Dependencies to place after the objects being linked to create a # shared library. postdeps=$lt_postdeps_F77 # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_F77 # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method == file_magic. file_magic_cmd=$lt_file_magic_cmd # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_F77 # Flag that forces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_F77 # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # Same as above, but a single script fragment to be evaled but not shown. finish_eval=$lt_finish_eval # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # This is the shared library runtime path variable. runpath_var=$runpath_var # This is the shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_F77 # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist. hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_F77 # If ld is used when linking, flag to hardcode \$libdir into # a binary during linking. This must work even if \$libdir does # not exist. hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_F77 # Whether we need a single -rpath flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_F77 # Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the # resulting binary. hardcode_direct=$hardcode_direct_F77 # Set to yes if using the -LDIR flag during linking hardcodes DIR into the # resulting binary. hardcode_minus_L=$hardcode_minus_L_F77 # Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into # the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_F77 # Set to yes if building a shared library automatically hardcodes DIR into the library # and all subsequent libraries and executables linked against it. hardcode_automatic=$hardcode_automatic_F77 # Variables whose values should be saved in libtool wrapper scripts and # restored at relink time. variables_saved_for_relink="$variables_saved_for_relink" # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_F77 # Compile-time system search path for libraries sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Fix the shell variable \$srcfile for the compiler. fix_srcfile_path="$fix_srcfile_path_F77" # Set to yes if exported symbols are required. always_export_symbols=$always_export_symbols_F77 # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_F77 # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_F77 # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_F77 # ### END LIBTOOL TAG CONFIG: $tagname __EOF__ else # If there is no Makefile yet, we rely on a make rule to execute # `config.status --recheck' to rerun these tests and create the # libtool script then. ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` if test -f "$ltmain_in"; then test -f Makefile && make "$ltmain" fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC="$lt_save_CC" else tagname="" fi ;; GCJ) if test -n "$GCJ" && test "X$GCJ" != "Xno"; then # Source file extension for Java test sources. ac_ext=java # Object file extension for compiled Java test sources. objext=o objext_GCJ=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="class foo {}\n" # Code to be used in simple link tests lt_simple_link_test_code='public class conftest { public static void main(String argv) {}; }\n' # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # Allow CC to be a program name with arguments. compiler=$CC # Allow CC to be a program name with arguments. lt_save_CC="$CC" CC=${GCJ-"gcj"} compiler=$CC compiler_GCJ=$CC # GCJ did not exist at the time GCC didn't implicitly link libc in. archive_cmds_need_lc_GCJ=no lt_prog_compiler_no_builtin_flag_GCJ= if test "$GCC" = yes; then lt_prog_compiler_no_builtin_flag_GCJ=' -fno-builtin' echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6 if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:15523: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:15527: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings if test ! -s conftest.err; then lt_cv_prog_compiler_rtti_exceptions=yes fi fi $rm conftest* fi echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6 if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then lt_prog_compiler_no_builtin_flag_GCJ="$lt_prog_compiler_no_builtin_flag_GCJ -fno-rtti -fno-exceptions" else : fi fi lt_prog_compiler_wl_GCJ= lt_prog_compiler_pic_GCJ= lt_prog_compiler_static_GCJ= echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 if test "$GCC" = yes; then lt_prog_compiler_wl_GCJ='-Wl,' lt_prog_compiler_static_GCJ='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_GCJ='-Bstatic' fi ;; amigaos*) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic_GCJ='-m68020 -resident32 -malways-restore-a4' ;; beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_GCJ='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_GCJ='-fno-common' ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared_GCJ=no enable_shared=no ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_GCJ=-Kconform_pic fi ;; hpux*) # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case "$host_cpu" in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_GCJ='-fPIC' ;; esac ;; *) lt_prog_compiler_pic_GCJ='-fPIC' ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl_GCJ='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_GCJ='-Bstatic' else lt_prog_compiler_static_GCJ='-bnso -bI:/lib/syscalls.exp' fi ;; darwin*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files case "$cc_basename" in xlc*) lt_prog_compiler_pic_GCJ='-qnocommon' lt_prog_compiler_wl_GCJ='-Wl,' ;; esac ;; mingw* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_GCJ='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl_GCJ='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case "$host_cpu" in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_GCJ='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static_GCJ='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl_GCJ='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static_GCJ='-non_shared' ;; newsos6) lt_prog_compiler_pic_GCJ='-KPIC' lt_prog_compiler_static_GCJ='-Bstatic' ;; linux*) case $CC in icc* | ecc*) lt_prog_compiler_wl_GCJ='-Wl,' lt_prog_compiler_pic_GCJ='-KPIC' lt_prog_compiler_static_GCJ='-static' ;; ccc*) lt_prog_compiler_wl_GCJ='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static_GCJ='-non_shared' ;; esac ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl_GCJ='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static_GCJ='-non_shared' ;; sco3.2v5*) lt_prog_compiler_pic_GCJ='-Kpic' lt_prog_compiler_static_GCJ='-dn' ;; solaris*) lt_prog_compiler_wl_GCJ='-Wl,' lt_prog_compiler_pic_GCJ='-KPIC' lt_prog_compiler_static_GCJ='-Bstatic' ;; sunos4*) lt_prog_compiler_wl_GCJ='-Qoption ld ' lt_prog_compiler_pic_GCJ='-PIC' lt_prog_compiler_static_GCJ='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) lt_prog_compiler_wl_GCJ='-Wl,' lt_prog_compiler_pic_GCJ='-KPIC' lt_prog_compiler_static_GCJ='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then lt_prog_compiler_pic_GCJ='-Kconform_pic' lt_prog_compiler_static_GCJ='-Bstatic' fi ;; uts4*) lt_prog_compiler_pic_GCJ='-pic' lt_prog_compiler_static_GCJ='-Bstatic' ;; *) lt_prog_compiler_can_build_shared_GCJ=no ;; esac fi echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_GCJ" >&5 echo "${ECHO_T}$lt_prog_compiler_pic_GCJ" >&6 # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_GCJ"; then echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works" >&5 echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works... $ECHO_C" >&6 if test "${lt_prog_compiler_pic_works_GCJ+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_prog_compiler_pic_works_GCJ=no ac_outfile=conftest.$ac_objext printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_GCJ" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:15766: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:15770: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings if test ! -s conftest.err; then lt_prog_compiler_pic_works_GCJ=yes fi fi $rm conftest* fi echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_GCJ" >&5 echo "${ECHO_T}$lt_prog_compiler_pic_works_GCJ" >&6 if test x"$lt_prog_compiler_pic_works_GCJ" = xyes; then case $lt_prog_compiler_pic_GCJ in "" | " "*) ;; *) lt_prog_compiler_pic_GCJ=" $lt_prog_compiler_pic_GCJ" ;; esac else lt_prog_compiler_pic_GCJ= lt_prog_compiler_can_build_shared_GCJ=no fi fi case "$host_os" in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_GCJ= ;; *) lt_prog_compiler_pic_GCJ="$lt_prog_compiler_pic_GCJ" ;; esac echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 if test "${lt_cv_prog_compiler_c_o_GCJ+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lt_cv_prog_compiler_c_o_GCJ=no $rm -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out printf "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:15826: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:15830: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings if test ! -s out/conftest.err; then lt_cv_prog_compiler_c_o_GCJ=yes fi fi chmod u+w . $rm conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files $rm out/* && rmdir out cd .. rmdir conftest $rm conftest* fi echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_GCJ" >&5 echo "${ECHO_T}$lt_cv_prog_compiler_c_o_GCJ" >&6 hard_links="nottested" if test "$lt_cv_prog_compiler_c_o_GCJ" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6 hard_links=yes $rm conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no echo "$as_me:$LINENO: result: $hard_links" >&5 echo "${ECHO_T}$hard_links" >&6 if test "$hard_links" = no; then { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6 runpath_var= allow_undefined_flag_GCJ= enable_shared_with_static_runtimes_GCJ=no archive_cmds_GCJ= archive_expsym_cmds_GCJ= old_archive_From_new_cmds_GCJ= old_archive_from_expsyms_cmds_GCJ= export_dynamic_flag_spec_GCJ= whole_archive_flag_spec_GCJ= thread_safe_flag_spec_GCJ= hardcode_libdir_flag_spec_GCJ= hardcode_libdir_flag_spec_ld_GCJ= hardcode_libdir_separator_GCJ= hardcode_direct_GCJ=no hardcode_minus_L_GCJ=no hardcode_shlibpath_var_GCJ=unsupported link_all_deplibs_GCJ=unknown hardcode_automatic_GCJ=no module_cmds_GCJ= module_expsym_cmds_GCJ= always_export_symbols_GCJ=no export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms_GCJ= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. exclude_expsyms_GCJ="_GLOBAL_OFFSET_TABLE_" # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs_GCJ=yes if test "$with_gnu_ld" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # See if GNU ld supports shared libraries. case $host_os in aix3* | aix4* | aix5*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs_GCJ=no cat <&2 *** Warning: the GNU linker, at least up to release 2.9.1, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to modify your PATH *** so that a non-GNU linker is found, and then restart. EOF fi ;; amigaos*) archive_cmds_GCJ='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_minus_L_GCJ=yes # Samuel A. Falvo II reports # that the semantics of dynamic libraries on AmigaOS, at least up # to version 4, is to share data among multiple programs linked # with the same dynamic library. Since this doesn't match the # behavior of shared libraries on other platforms, we can't use # them. ld_shlibs_GCJ=no ;; beos*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then allow_undefined_flag_GCJ=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds_GCJ='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs_GCJ=no fi ;; cygwin* | mingw* | pw32*) # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, GCJ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec_GCJ='-L$libdir' allow_undefined_flag_GCJ=unsupported always_export_symbols_GCJ=no enable_shared_with_static_runtimes_GCJ=yes export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols' if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds_GCJ='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib' else ld_shlibs=no fi ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds_GCJ='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris* | sysv5*) if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then ld_shlibs_GCJ=no cat <&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. EOF elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs_GCJ=no fi ;; sunos4*) archive_cmds_GCJ='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct_GCJ=yes hardcode_shlibpath_var_GCJ=no ;; linux*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then tmp_archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_cmds_GCJ="$tmp_archive_cmds" supports_anon_versioning=no case `$LD -v 2>/dev/null` in *\ 01.* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac if test $supports_anon_versioning = yes; then archive_expsym_cmds_GCJ='$echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ $echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' else archive_expsym_cmds_GCJ="$tmp_archive_cmds" fi else ld_shlibs_GCJ=no fi ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs_GCJ=no fi ;; esac if test "$ld_shlibs_GCJ" = yes; then runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec_GCJ='${wl}--rpath ${wl}$libdir' export_dynamic_flag_spec_GCJ='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then whole_archive_flag_spec_GCJ="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec_GCJ= fi fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag_GCJ=unsupported always_export_symbols_GCJ=yes archive_expsym_cmds_GCJ='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L_GCJ=yes if test "$GCC" = yes && test -z "$link_static_flag"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct_GCJ=unsupported fi ;; aix4* | aix5*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm if $NM -V 2>&1 | grep 'GNU' > /dev/null; then export_symbols_cmds_GCJ='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_GCJ='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix5*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds_GCJ='' hardcode_direct_GCJ=yes hardcode_libdir_separator_GCJ=':' link_all_deplibs_GCJ=yes if test "$GCC" = yes; then case $host_os in aix4.012|aix4.012.*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 hardcode_direct_GCJ=yes else # We have old collect2 hardcode_direct_GCJ=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L_GCJ=yes hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_libdir_separator_GCJ= fi esac shared_flag='-shared' else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols_GCJ=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag_GCJ='-berok' # Determine the default libpath from the value encoded in an empty executable. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'`; fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds_GCJ="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec_GCJ='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag_GCJ="-z nodefs" archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an empty executable. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` # Check for a 64-bit object if we didn't find anything. if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'`; fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag_GCJ=' ${wl}-bernotok' allow_undefined_flag_GCJ=' ${wl}-berok' # -bexpall does not export symbols beginning with underscore (_) always_export_symbols_GCJ=yes # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec_GCJ=' ' archive_cmds_need_lc_GCJ=yes # This is similar to how AIX traditionally builds it's shared libraries. archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) archive_cmds_GCJ='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_minus_L_GCJ=yes # see comment about different semantics on the GNU ld section ld_shlibs_GCJ=no ;; bsdi[45]*) export_dynamic_flag_spec_GCJ=-rdynamic ;; cygwin* | mingw* | pw32*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec_GCJ=' ' allow_undefined_flag_GCJ=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds_GCJ='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_From_new_cmds_GCJ='true' # FIXME: Should let the user specify the lib program. old_archive_cmds_GCJ='lib /OUT:$oldlib$oldobjs$old_deplibs' fix_srcfile_path='`cygpath -w "$srcfile"`' enable_shared_with_static_runtimes_GCJ=yes ;; darwin* | rhapsody*) case "$host_os" in rhapsody* | darwin1.[012]) allow_undefined_flag_GCJ='${wl}-undefined ${wl}suppress' ;; *) # Darwin 1.3 on if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then allow_undefined_flag_GCJ='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' else case ${MACOSX_DEPLOYMENT_TARGET} in 10.[012]) allow_undefined_flag_GCJ='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) allow_undefined_flag_GCJ='${wl}-undefined ${wl}dynamic_lookup' ;; esac fi ;; esac archive_cmds_need_lc_GCJ=no hardcode_direct_GCJ=no hardcode_automatic_GCJ=yes hardcode_shlibpath_var_GCJ=unsupported whole_archive_flag_spec_GCJ='' link_all_deplibs_GCJ=yes if test "$GCC" = yes ; then output_verbose_link_cmd='echo' archive_cmds_GCJ='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring' module_cmds_GCJ='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' module_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' else case "$cc_basename" in xlc*) output_verbose_link_cmd='echo' archive_cmds_GCJ='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring' module_cmds_GCJ='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' module_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' ;; *) ld_shlibs_GCJ=no ;; esac fi ;; dgux*) archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_shlibpath_var_GCJ=no ;; freebsd1*) ld_shlibs_GCJ=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec_GCJ='-R$libdir' hardcode_direct_GCJ=yes hardcode_shlibpath_var_GCJ=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2*) archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_GCJ=yes hardcode_minus_L_GCJ=yes hardcode_shlibpath_var_GCJ=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | kfreebsd*-gnu) archive_cmds_GCJ='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec_GCJ='-R$libdir' hardcode_direct_GCJ=yes hardcode_shlibpath_var_GCJ=no ;; hpux9*) if test "$GCC" = yes; then archive_cmds_GCJ='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else archive_cmds_GCJ='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' hardcode_libdir_separator_GCJ=: hardcode_direct_GCJ=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_GCJ=yes export_dynamic_flag_spec_GCJ='${wl}-E' ;; hpux10* | hpux11*) if test "$GCC" = yes -a "$with_gnu_ld" = no; then case "$host_cpu" in hppa*64*|ia64*) archive_cmds_GCJ='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_GCJ='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case "$host_cpu" in hppa*64*|ia64*) archive_cmds_GCJ='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags' ;; *) archive_cmds_GCJ='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' ;; esac fi if test "$with_gnu_ld" = no; then case "$host_cpu" in hppa*64*) hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' hardcode_libdir_flag_spec_ld_GCJ='+b $libdir' hardcode_libdir_separator_GCJ=: hardcode_direct_GCJ=no hardcode_shlibpath_var_GCJ=no ;; ia64*) hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_direct_GCJ=no hardcode_shlibpath_var_GCJ=no # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_GCJ=yes ;; *) hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' hardcode_libdir_separator_GCJ=: hardcode_direct_GCJ=yes export_dynamic_flag_spec_GCJ='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_GCJ=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else archive_cmds_GCJ='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_ld_GCJ='-rpath $libdir' fi hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_GCJ=: link_all_deplibs_GCJ=yes ;; netbsd*) if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds_GCJ='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec_GCJ='-R$libdir' hardcode_direct_GCJ=yes hardcode_shlibpath_var_GCJ=no ;; newsos6) archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_GCJ=yes hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_GCJ=: hardcode_shlibpath_var_GCJ=no ;; openbsd*) hardcode_direct_GCJ=yes hardcode_shlibpath_var_GCJ=no if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir' export_dynamic_flag_spec_GCJ='${wl}-E' else case $host_os in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_GCJ='-R$libdir' ;; *) archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir' ;; esac fi ;; os2*) hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_minus_L_GCJ=yes allow_undefined_flag_GCJ=unsupported archive_cmds_GCJ='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' old_archive_From_new_cmds_GCJ='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag_GCJ=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_GCJ='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else allow_undefined_flag_GCJ=' -expect_unresolved \*' archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' fi hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_GCJ=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag_GCJ=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_GCJ='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' else allow_undefined_flag_GCJ=' -expect_unresolved \*' archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds_GCJ='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec_GCJ='-rpath $libdir' fi hardcode_libdir_separator_GCJ=: ;; sco3.2v5*) archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var_GCJ=no export_dynamic_flag_spec_GCJ='${wl}-Bexport' runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ;; solaris*) no_undefined_flag_GCJ=' -z text' if test "$GCC" = yes; then archive_cmds_GCJ='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' else archive_cmds_GCJ='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' fi hardcode_libdir_flag_spec_GCJ='-R$libdir' hardcode_shlibpath_var_GCJ=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # Supported since Solaris 2.6 (maybe 2.5.1?) whole_archive_flag_spec_GCJ='-z allextract$convenience -z defaultextract' ;; esac link_all_deplibs_GCJ=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds_GCJ='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_GCJ='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_direct_GCJ=yes hardcode_minus_L_GCJ=yes hardcode_shlibpath_var_GCJ=no ;; sysv4) case $host_vendor in sni) archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_GCJ=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds_GCJ='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds_GCJ='$CC -r -o $output$reload_objs' hardcode_direct_GCJ=no ;; motorola) archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_GCJ=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var_GCJ=no ;; sysv4.3*) archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var_GCJ=no export_dynamic_flag_spec_GCJ='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var_GCJ=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs_GCJ=yes fi ;; sysv4.2uw2*) archive_cmds_GCJ='$LD -G -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_GCJ=yes hardcode_minus_L_GCJ=no hardcode_shlibpath_var_GCJ=no hardcode_runpath_var=yes runpath_var=LD_RUN_PATH ;; sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) no_undefined_flag_GCJ='${wl}-z ${wl}text' if test "$GCC" = yes; then archive_cmds_GCJ='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_GCJ='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' fi runpath_var='LD_RUN_PATH' hardcode_shlibpath_var_GCJ=no ;; sysv5*) no_undefined_flag_GCJ=' -z text' # $CC -shared without GNU ld will not create a library from C++ # object files and a static libstdc++, better avoid it by now archive_cmds_GCJ='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' hardcode_libdir_flag_spec_GCJ= hardcode_shlibpath_var_GCJ=no runpath_var='LD_RUN_PATH' ;; uts4*) archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_GCJ='-L$libdir' hardcode_shlibpath_var_GCJ=no ;; *) ld_shlibs_GCJ=no ;; esac fi echo "$as_me:$LINENO: result: $ld_shlibs_GCJ" >&5 echo "${ECHO_T}$ld_shlibs_GCJ" >&6 test "$ld_shlibs_GCJ" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc_GCJ" in x|xyes) # Assume -lc should be added archive_cmds_need_lc_GCJ=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds_GCJ in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 $rm conftest* printf "$lt_simple_compile_test_code" > conftest.$ac_ext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_GCJ compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_GCJ allow_undefined_flag_GCJ= if { (eval echo "$as_me:$LINENO: \"$archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 (eval $archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } then archive_cmds_need_lc_GCJ=no else archive_cmds_need_lc_GCJ=yes fi allow_undefined_flag_GCJ=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $rm conftest* echo "$as_me:$LINENO: result: $archive_cmds_need_lc_GCJ" >&5 echo "${ECHO_T}$archive_cmds_need_lc_GCJ" >&6 ;; esac fi ;; esac echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" if test "$GCC" = yes; then sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix4* | aix5*) version_type=linux need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$host_os in yes,cygwin* | yes,mingw* | yes,pw32*) library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $rm \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" ;; mingw*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH printed by # mingw gcc, but we are running on Cygwin. Gcc prints its search # path with ; separators, and with drive letters. We can handle the # drive letters (cygwin fileutils understands them), so leave them, # especially as we might pass files found there to a mingw objdump, # which wouldn't understand a cygwinified path. Ahh. sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/./-/g'`${versuffix}${shared_ext}' ;; esac ;; *) library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' ;; esac dynamic_linker='Win32 ld.exe' # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='$(test .$module = .yes && echo .so || echo .dylib)' # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same. if test "$GCC" = yes; then sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"` else sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib' fi sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd1*) dynamic_linker=no ;; kfreebsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='GNU ld.so' ;; freebsd*) objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2*) shlibpath_overrides_runpath=yes ;; freebsd3.01* | freebsdelf3.01*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; *) # from 3.2 on shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; esac ;; gnu*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case "$host_cpu" in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555. postinstall_cmds='chmod 555 $lib' ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be Linux ELF. linux*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then lt_ld_extra=`$SED -e 's/:,\t/ /g;s/=^=*$//;s/=^= * / /g' /etc/ld.so.conf | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; knetbsd*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='GNU ld.so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; nto-qnx*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; openbsd*) version_type=sunos need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; sco3.2v5*) version_type=osf soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH ;; solaris*) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no export_dynamic_flag_spec='${wl}-Blargedynsym' runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; uts4*) version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac echo "$as_me:$LINENO: result: $dynamic_linker" >&5 echo "${ECHO_T}$dynamic_linker" >&6 test "$dynamic_linker" = no && can_build_shared=no echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 hardcode_action_GCJ= if test -n "$hardcode_libdir_flag_spec_GCJ" || \ test -n "$runpath_var_GCJ" || \ test "X$hardcode_automatic_GCJ" = "Xyes" ; then # We can hardcode non-existant directories. if test "$hardcode_direct_GCJ" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, GCJ)" != no && test "$hardcode_minus_L_GCJ" != no; then # Linking always hardcodes the temporary library directory. hardcode_action_GCJ=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action_GCJ=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action_GCJ=unsupported fi echo "$as_me:$LINENO: result: $hardcode_action_GCJ" >&5 echo "${ECHO_T}$hardcode_action_GCJ" >&6 if test "$hardcode_action_GCJ" = relink; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi striplib= old_striplib= echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6 if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi ;; *) echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 ;; esac fi if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 if test "${ac_cv_lib_dl_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dlopen (); int main () { dlopen (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_dl_dlopen=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_dl_dlopen=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 if test $ac_cv_lib_dl_dlopen = yes; then lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes fi ;; *) echo "$as_me:$LINENO: checking for shl_load" >&5 echo $ECHO_N "checking for shl_load... $ECHO_C" >&6 if test "${ac_cv_func_shl_load+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define shl_load to an innocuous variant, in case declares shl_load. For example, HP-UX 11i declares gettimeofday. */ #define shl_load innocuous_shl_load /* System header to define __stub macros and hopefully few prototypes, which can conflict with char shl_load (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef shl_load /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char shl_load (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_shl_load) || defined (__stub___shl_load) choke me #else char (*f) () = shl_load; #endif #ifdef __cplusplus } #endif int main () { return f != shl_load; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_shl_load=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_shl_load=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5 echo "${ECHO_T}$ac_cv_func_shl_load" >&6 if test $ac_cv_func_shl_load = yes; then lt_cv_dlopen="shl_load" else echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5 echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6 if test "${ac_cv_lib_dld_shl_load+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char shl_load (); int main () { shl_load (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_dld_shl_load=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_dld_shl_load=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6 if test $ac_cv_lib_dld_shl_load = yes; then lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld" else echo "$as_me:$LINENO: checking for dlopen" >&5 echo $ECHO_N "checking for dlopen... $ECHO_C" >&6 if test "${ac_cv_func_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define dlopen to an innocuous variant, in case declares dlopen. For example, HP-UX 11i declares gettimeofday. */ #define dlopen innocuous_dlopen /* System header to define __stub macros and hopefully few prototypes, which can conflict with char dlopen (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef dlopen /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dlopen (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_dlopen) || defined (__stub___dlopen) choke me #else char (*f) () = dlopen; #endif #ifdef __cplusplus } #endif int main () { return f != dlopen; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func_dlopen=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_dlopen=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5 echo "${ECHO_T}$ac_cv_func_dlopen" >&6 if test $ac_cv_func_dlopen = yes; then lt_cv_dlopen="dlopen" else echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 if test "${ac_cv_lib_dl_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dlopen (); int main () { dlopen (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_dl_dlopen=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_dl_dlopen=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 if test $ac_cv_lib_dl_dlopen = yes; then lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5 echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6 if test "${ac_cv_lib_svld_dlopen+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dlopen (); int main () { dlopen (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_svld_dlopen=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_svld_dlopen=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5 echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6 if test $ac_cv_lib_svld_dlopen = yes; then lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" else echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5 echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6 if test "${ac_cv_lib_dld_dld_link+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dld_link (); int main () { dld_link (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_dld_dld_link=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_dld_dld_link=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5 echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6 if test $ac_cv_lib_dld_dld_link = yes; then lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld" fi fi fi fi fi fi ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5 echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6 if test "${lt_cv_dlopen_self+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif #ifdef __cplusplus extern "C" void exit (int); #endif void fnord() { int i=42;} int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; /* dlclose (self); */ } exit (status); } EOF if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; x$lt_unknown|x*) lt_cv_dlopen_self=no ;; esac else : # compilation failed lt_cv_dlopen_self=no fi fi rm -fr conftest* fi echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5 echo "${ECHO_T}$lt_cv_dlopen_self" >&6 if test "x$lt_cv_dlopen_self" = xyes; then LDFLAGS="$LDFLAGS $link_static_flag" echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5 echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6 if test "${lt_cv_dlopen_self_static+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self_static=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext < #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif #ifdef __cplusplus extern "C" void exit (int); #endif void fnord() { int i=42;} int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; /* dlclose (self); */ } exit (status); } EOF if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_unknown|x*) lt_cv_dlopen_self_static=no ;; esac else : # compilation failed lt_cv_dlopen_self_static=no fi fi rm -fr conftest* fi echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5 echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6 fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi # The else clause should only fire when bootstrapping the # libtool distribution, otherwise you forgot to ship ltmain.sh # with your package, and you will get complaints that there are # no rules to generate ltmain.sh. if test -f "$ltmain"; then # See if we are running on zsh, and set the options which allow our commands through # without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi # Now quote all the things that may contain metacharacters while being # careful not to overquote the AC_SUBSTed values. We take copies of the # variables and quote the copies for generation of the libtool script. for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ SED SHELL STRIP \ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ deplibs_check_method reload_flag reload_cmds need_locks \ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ old_postinstall_cmds old_postuninstall_cmds \ compiler_GCJ \ CC_GCJ \ LD_GCJ \ lt_prog_compiler_wl_GCJ \ lt_prog_compiler_pic_GCJ \ lt_prog_compiler_static_GCJ \ lt_prog_compiler_no_builtin_flag_GCJ \ export_dynamic_flag_spec_GCJ \ thread_safe_flag_spec_GCJ \ whole_archive_flag_spec_GCJ \ enable_shared_with_static_runtimes_GCJ \ old_archive_cmds_GCJ \ old_archive_from_new_cmds_GCJ \ predep_objects_GCJ \ postdep_objects_GCJ \ predeps_GCJ \ postdeps_GCJ \ compiler_lib_search_path_GCJ \ archive_cmds_GCJ \ archive_expsym_cmds_GCJ \ postinstall_cmds_GCJ \ postuninstall_cmds_GCJ \ old_archive_from_expsyms_cmds_GCJ \ allow_undefined_flag_GCJ \ no_undefined_flag_GCJ \ export_symbols_cmds_GCJ \ hardcode_libdir_flag_spec_GCJ \ hardcode_libdir_flag_spec_ld_GCJ \ hardcode_libdir_separator_GCJ \ hardcode_automatic_GCJ \ module_cmds_GCJ \ module_expsym_cmds_GCJ \ lt_cv_prog_compiler_c_o_GCJ \ exclude_expsyms_GCJ \ include_expsyms_GCJ; do case $var in old_archive_cmds_GCJ | \ old_archive_from_new_cmds_GCJ | \ archive_cmds_GCJ | \ archive_expsym_cmds_GCJ | \ module_cmds_GCJ | \ module_expsym_cmds_GCJ | \ old_archive_from_expsyms_cmds_GCJ | \ export_symbols_cmds_GCJ | \ extract_expsyms_cmds | reload_cmds | finish_cmds | \ postinstall_cmds | postuninstall_cmds | \ old_postinstall_cmds | old_postuninstall_cmds | \ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) # Double-quote double-evaled strings. eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" ;; *) eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" ;; esac done case $lt_echo in *'\$0 --fallback-echo"') lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` ;; esac cfgfile="$ofile" cat <<__EOF__ >> "$cfgfile" # ### BEGIN LIBTOOL TAG CONFIG: $tagname # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_GCJ # Whether or not to disallow shared libs when runtime libs are static allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_GCJ # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # The host system. host_alias=$host_alias host=$host # An echo program that does not interpret backslashes. echo=$lt_echo # The archiver. AR=$lt_AR AR_FLAGS=$lt_AR_FLAGS # A C compiler. LTCC=$lt_LTCC # A language-specific compiler. CC=$lt_compiler_GCJ # Is the compiler the GNU C compiler? with_gcc=$GCC_GCJ # An ERE matcher. EGREP=$lt_EGREP # The linker used to build libraries. LD=$lt_LD_GCJ # Whether we need hard or soft links. LN_S=$lt_LN_S # A BSD-compatible nm program. NM=$lt_NM # A symbol stripping program STRIP=$lt_STRIP # Used to examine libraries when file_magic_cmd begins "file" MAGIC_CMD=$MAGIC_CMD # Used on cygwin: DLL creation program. DLLTOOL="$DLLTOOL" # Used on cygwin: object dumper. OBJDUMP="$OBJDUMP" # Used on cygwin: assembler. AS="$AS" # The name of the directory that contains temporary libtool files. objdir=$objdir # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_GCJ # Object file suffix (normally "o"). objext="$ac_objext" # Old archive suffix (normally "a"). libext="$libext" # Shared library suffix (normally ".so"). shrext_cmds='$shrext_cmds' # Executable file suffix (normally ""). exeext="$exeext" # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_GCJ pic_mode=$pic_mode # What is the maximum length of a command? max_cmd_len=$lt_cv_sys_max_cmd_len # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_GCJ # Must we lock files when doing compilation ? need_locks=$lt_need_locks # Do we need the lib prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_GCJ # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_GCJ # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_GCJ # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_GCJ # Compiler flag to generate thread-safe objects. thread_safe_flag_spec=$lt_thread_safe_flag_spec_GCJ # Library versioning type. version_type=$version_type # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME. library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Commands used to build and install an old-style archive. RANLIB=$lt_RANLIB old_archive_cmds=$lt_old_archive_cmds_GCJ old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_GCJ # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_GCJ # Commands used to build and install a shared archive. archive_cmds=$lt_archive_cmds_GCJ archive_expsym_cmds=$lt_archive_expsym_cmds_GCJ postinstall_cmds=$lt_postinstall_cmds postuninstall_cmds=$lt_postuninstall_cmds # Commands used to build a loadable module (assumed same as above if empty) module_cmds=$lt_module_cmds_GCJ module_expsym_cmds=$lt_module_expsym_cmds_GCJ # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # Dependencies to place before the objects being linked to create a # shared library. predep_objects=$lt_predep_objects_GCJ # Dependencies to place after the objects being linked to create a # shared library. postdep_objects=$lt_postdep_objects_GCJ # Dependencies to place before the objects being linked to create a # shared library. predeps=$lt_predeps_GCJ # Dependencies to place after the objects being linked to create a # shared library. postdeps=$lt_postdeps_GCJ # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_GCJ # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method == file_magic. file_magic_cmd=$lt_file_magic_cmd # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_GCJ # Flag that forces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_GCJ # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # Same as above, but a single script fragment to be evaled but not shown. finish_eval=$lt_finish_eval # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # This is the shared library runtime path variable. runpath_var=$runpath_var # This is the shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_GCJ # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist. hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_GCJ # If ld is used when linking, flag to hardcode \$libdir into # a binary during linking. This must work even if \$libdir does # not exist. hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_GCJ # Whether we need a single -rpath flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_GCJ # Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the # resulting binary. hardcode_direct=$hardcode_direct_GCJ # Set to yes if using the -LDIR flag during linking hardcodes DIR into the # resulting binary. hardcode_minus_L=$hardcode_minus_L_GCJ # Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into # the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_GCJ # Set to yes if building a shared library automatically hardcodes DIR into the library # and all subsequent libraries and executables linked against it. hardcode_automatic=$hardcode_automatic_GCJ # Variables whose values should be saved in libtool wrapper scripts and # restored at relink time. variables_saved_for_relink="$variables_saved_for_relink" # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_GCJ # Compile-time system search path for libraries sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Fix the shell variable \$srcfile for the compiler. fix_srcfile_path="$fix_srcfile_path_GCJ" # Set to yes if exported symbols are required. always_export_symbols=$always_export_symbols_GCJ # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_GCJ # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_GCJ # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_GCJ # ### END LIBTOOL TAG CONFIG: $tagname __EOF__ else # If there is no Makefile yet, we rely on a make rule to execute # `config.status --recheck' to rerun these tests and create the # libtool script then. ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` if test -f "$ltmain_in"; then test -f Makefile && make "$ltmain" fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC="$lt_save_CC" else tagname="" fi ;; RC) # Source file extension for RC test sources. ac_ext=rc # Object file extension for compiled RC test sources. objext=o objext_RC=$objext # Code to be used in simple compile tests lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }\n' # Code to be used in simple link tests lt_simple_link_test_code="$lt_simple_compile_test_code" # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # Allow CC to be a program name with arguments. compiler=$CC # Allow CC to be a program name with arguments. lt_save_CC="$CC" CC=${RC-"windres"} compiler=$CC compiler_RC=$CC lt_cv_prog_compiler_c_o_RC=yes # The else clause should only fire when bootstrapping the # libtool distribution, otherwise you forgot to ship ltmain.sh # with your package, and you will get complaints that there are # no rules to generate ltmain.sh. if test -f "$ltmain"; then # See if we are running on zsh, and set the options which allow our commands through # without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi # Now quote all the things that may contain metacharacters while being # careful not to overquote the AC_SUBSTed values. We take copies of the # variables and quote the copies for generation of the libtool script. for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM \ SED SHELL STRIP \ libname_spec library_names_spec soname_spec extract_expsyms_cmds \ old_striplib striplib file_magic_cmd finish_cmds finish_eval \ deplibs_check_method reload_flag reload_cmds need_locks \ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ old_postinstall_cmds old_postuninstall_cmds \ compiler_RC \ CC_RC \ LD_RC \ lt_prog_compiler_wl_RC \ lt_prog_compiler_pic_RC \ lt_prog_compiler_static_RC \ lt_prog_compiler_no_builtin_flag_RC \ export_dynamic_flag_spec_RC \ thread_safe_flag_spec_RC \ whole_archive_flag_spec_RC \ enable_shared_with_static_runtimes_RC \ old_archive_cmds_RC \ old_archive_from_new_cmds_RC \ predep_objects_RC \ postdep_objects_RC \ predeps_RC \ postdeps_RC \ compiler_lib_search_path_RC \ archive_cmds_RC \ archive_expsym_cmds_RC \ postinstall_cmds_RC \ postuninstall_cmds_RC \ old_archive_from_expsyms_cmds_RC \ allow_undefined_flag_RC \ no_undefined_flag_RC \ export_symbols_cmds_RC \ hardcode_libdir_flag_spec_RC \ hardcode_libdir_flag_spec_ld_RC \ hardcode_libdir_separator_RC \ hardcode_automatic_RC \ module_cmds_RC \ module_expsym_cmds_RC \ lt_cv_prog_compiler_c_o_RC \ exclude_expsyms_RC \ include_expsyms_RC; do case $var in old_archive_cmds_RC | \ old_archive_from_new_cmds_RC | \ archive_cmds_RC | \ archive_expsym_cmds_RC | \ module_cmds_RC | \ module_expsym_cmds_RC | \ old_archive_from_expsyms_cmds_RC | \ export_symbols_cmds_RC | \ extract_expsyms_cmds | reload_cmds | finish_cmds | \ postinstall_cmds | postuninstall_cmds | \ old_postinstall_cmds | old_postuninstall_cmds | \ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) # Double-quote double-evaled strings. eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" ;; *) eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" ;; esac done case $lt_echo in *'\$0 --fallback-echo"') lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` ;; esac cfgfile="$ofile" cat <<__EOF__ >> "$cfgfile" # ### BEGIN LIBTOOL TAG CONFIG: $tagname # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_RC # Whether or not to disallow shared libs when runtime libs are static allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_RC # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # The host system. host_alias=$host_alias host=$host # An echo program that does not interpret backslashes. echo=$lt_echo # The archiver. AR=$lt_AR AR_FLAGS=$lt_AR_FLAGS # A C compiler. LTCC=$lt_LTCC # A language-specific compiler. CC=$lt_compiler_RC # Is the compiler the GNU C compiler? with_gcc=$GCC_RC # An ERE matcher. EGREP=$lt_EGREP # The linker used to build libraries. LD=$lt_LD_RC # Whether we need hard or soft links. LN_S=$lt_LN_S # A BSD-compatible nm program. NM=$lt_NM # A symbol stripping program STRIP=$lt_STRIP # Used to examine libraries when file_magic_cmd begins "file" MAGIC_CMD=$MAGIC_CMD # Used on cygwin: DLL creation program. DLLTOOL="$DLLTOOL" # Used on cygwin: object dumper. OBJDUMP="$OBJDUMP" # Used on cygwin: assembler. AS="$AS" # The name of the directory that contains temporary libtool files. objdir=$objdir # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_RC # Object file suffix (normally "o"). objext="$ac_objext" # Old archive suffix (normally "a"). libext="$libext" # Shared library suffix (normally ".so"). shrext_cmds='$shrext_cmds' # Executable file suffix (normally ""). exeext="$exeext" # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_RC pic_mode=$pic_mode # What is the maximum length of a command? max_cmd_len=$lt_cv_sys_max_cmd_len # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_RC # Must we lock files when doing compilation ? need_locks=$lt_need_locks # Do we need the lib prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_RC # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_RC # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_RC # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_RC # Compiler flag to generate thread-safe objects. thread_safe_flag_spec=$lt_thread_safe_flag_spec_RC # Library versioning type. version_type=$version_type # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME. library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Commands used to build and install an old-style archive. RANLIB=$lt_RANLIB old_archive_cmds=$lt_old_archive_cmds_RC old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_RC # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_RC # Commands used to build and install a shared archive. archive_cmds=$lt_archive_cmds_RC archive_expsym_cmds=$lt_archive_expsym_cmds_RC postinstall_cmds=$lt_postinstall_cmds postuninstall_cmds=$lt_postuninstall_cmds # Commands used to build a loadable module (assumed same as above if empty) module_cmds=$lt_module_cmds_RC module_expsym_cmds=$lt_module_expsym_cmds_RC # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # Dependencies to place before the objects being linked to create a # shared library. predep_objects=$lt_predep_objects_RC # Dependencies to place after the objects being linked to create a # shared library. postdep_objects=$lt_postdep_objects_RC # Dependencies to place before the objects being linked to create a # shared library. predeps=$lt_predeps_RC # Dependencies to place after the objects being linked to create a # shared library. postdeps=$lt_postdeps_RC # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_RC # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method == file_magic. file_magic_cmd=$lt_file_magic_cmd # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_RC # Flag that forces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_RC # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # Same as above, but a single script fragment to be evaled but not shown. finish_eval=$lt_finish_eval # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # This is the shared library runtime path variable. runpath_var=$runpath_var # This is the shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_RC # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist. hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_RC # If ld is used when linking, flag to hardcode \$libdir into # a binary during linking. This must work even if \$libdir does # not exist. hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_RC # Whether we need a single -rpath flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_RC # Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the # resulting binary. hardcode_direct=$hardcode_direct_RC # Set to yes if using the -LDIR flag during linking hardcodes DIR into the # resulting binary. hardcode_minus_L=$hardcode_minus_L_RC # Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into # the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_RC # Set to yes if building a shared library automatically hardcodes DIR into the library # and all subsequent libraries and executables linked against it. hardcode_automatic=$hardcode_automatic_RC # Variables whose values should be saved in libtool wrapper scripts and # restored at relink time. variables_saved_for_relink="$variables_saved_for_relink" # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_RC # Compile-time system search path for libraries sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Fix the shell variable \$srcfile for the compiler. fix_srcfile_path="$fix_srcfile_path_RC" # Set to yes if exported symbols are required. always_export_symbols=$always_export_symbols_RC # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_RC # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_RC # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_RC # ### END LIBTOOL TAG CONFIG: $tagname __EOF__ else # If there is no Makefile yet, we rely on a make rule to execute # `config.status --recheck' to rerun these tests and create the # libtool script then. ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` if test -f "$ltmain_in"; then test -f Makefile && make "$ltmain" fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC="$lt_save_CC" ;; *) { { echo "$as_me:$LINENO: error: Unsupported tag name: $tagname" >&5 echo "$as_me: error: Unsupported tag name: $tagname" >&2;} { (exit 1); exit 1; }; } ;; esac # Append the new tag name to the list of available tags. if test -n "$tagname" ; then available_tags="$available_tags $tagname" fi fi done IFS="$lt_save_ifs" # Now substitute the updated list of available tags. if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then mv "${ofile}T" "$ofile" chmod +x "$ofile" else rm -f "${ofile}T" { { echo "$as_me:$LINENO: error: unable to update list of available tagged configurations." >&5 echo "$as_me: error: unable to update list of available tagged configurations." >&2;} { (exit 1); exit 1; }; } fi fi # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' # Prevent multiple expansion # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 if test -z "$INSTALL"; then if test "${ac_cv_path_install+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in ./ | .// | /cC/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi done done ;; esac done fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. We don't cache a # path for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the path is relative. INSTALL=$ac_install_sh fi fi echo "$as_me:$LINENO: result: $INSTALL" >&5 echo "${ECHO_T}$INSTALL" >&6 # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' # Checks for libraries case "$host" in *-*-*freebsd4*) LDFLAGS="$LDFLAGS -pthread" HAVE_LIBPTHREAD=1 ;; *) echo "$as_me:$LINENO: checking for main in -lpthread" >&5 echo $ECHO_N "checking for main in -lpthread... $ECHO_C" >&6 if test "${ac_cv_lib_pthread_main+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthread $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { main (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_pthread_main=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_pthread_main=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_pthread_main" >&5 echo "${ECHO_T}$ac_cv_lib_pthread_main" >&6 if test $ac_cv_lib_pthread_main = yes; then cat >>confdefs.h <<_ACEOF #define HAVE_LIBPTHREAD 1 _ACEOF LIBS="-lpthread $LIBS" fi ;; esac # Checks for header files echo "$as_me:$LINENO: checking for ANSI C header files" >&5 echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6 if test "${ac_cv_header_stdc+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_header_stdc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_header_stdc=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); exit (0); } _ACEOF rm -f conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_header_stdc=no fi rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi fi echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 echo "${ECHO_T}$ac_cv_header_stdc" >&6 if test $ac_cv_header_stdc = yes; then cat >>confdefs.h <<\_ACEOF #define STDC_HEADERS 1 _ACEOF fi for ac_header in stdlib.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if eval "test \"\${$as_ac_Header+set}\" = set"; then echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 else # Is the header compilable? echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 # Is the header present? echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ------------------------------ ## ## Report this to the tap lists. ## ## ------------------------------ ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 fi if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in pthread.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if eval "test \"\${$as_ac_Header+set}\" = set"; then echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 else # Is the header compilable? echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 # Is the header present? echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ------------------------------ ## ## Report this to the tap lists. ## ## ------------------------------ ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 fi if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done # Checks for typedefs, structures, and compiler characteristics. echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5 echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6 if test "${ac_cv_c_const+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { /* FIXME: Include the comments suggested by Paul. */ #ifndef __cplusplus /* Ultrix mips cc rejects this. */ typedef int charset[2]; const charset x; /* SunOS 4.1.1 cc rejects this. */ char const *const *ccp; char **p; /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; /* AIX XL C 1.02.0.0 rejects this. It does not let you subtract one const X* pointer from another in an arm of an if-expression whose if-part is not a constant expression */ const char *g = "string"; ccp = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ ++ccp; p = (char**) ccp; ccp = (char const *const *) p; { /* SCO 3.2v4 cc rejects this. */ char *t; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; } { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ int x[] = {25, 17}; const int *foo = &x[0]; ++foo; } { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ typedef const int *iptr; iptr p = 0; ++p; } { /* AIX XL C 1.02.0.0 rejects this saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; }; struct s *b; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; } #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_c_const=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_c_const=no fi rm -f conftest.err conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5 echo "${ECHO_T}$ac_cv_c_const" >&6 if test $ac_cv_c_const = no; then cat >>confdefs.h <<\_ACEOF #define const _ACEOF fi # Checks for library functions. for ac_func in vprintf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` echo "$as_me:$LINENO: checking for $ac_func" >&5 echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 if eval "test \"\${$as_ac_var+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define $ac_func to an innocuous variant, in case declares $ac_func. For example, HP-UX 11i declares gettimeofday. */ #define $ac_func innocuous_$ac_func /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $ac_func /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_$ac_func) || defined (__stub___$ac_func) choke me #else char (*f) () = $ac_func; #endif #ifdef __cplusplus } #endif int main () { return f != $ac_func; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF echo "$as_me:$LINENO: checking for _doprnt" >&5 echo $ECHO_N "checking for _doprnt... $ECHO_C" >&6 if test "${ac_cv_func__doprnt+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define _doprnt to an innocuous variant, in case declares _doprnt. For example, HP-UX 11i declares gettimeofday. */ #define _doprnt innocuous__doprnt /* System header to define __stub macros and hopefully few prototypes, which can conflict with char _doprnt (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef _doprnt /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char _doprnt (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub__doprnt) || defined (__stub____doprnt) choke me #else char (*f) () = _doprnt; #endif #ifdef __cplusplus } #endif int main () { return f != _doprnt; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func__doprnt=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func__doprnt=no fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_func__doprnt" >&5 echo "${ECHO_T}$ac_cv_func__doprnt" >&6 if test $ac_cv_func__doprnt = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_DOPRNT 1 _ACEOF fi fi done for ac_func in atexit do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` echo "$as_me:$LINENO: checking for $ac_func" >&5 echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 if eval "test \"\${$as_ac_var+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define $ac_func to an innocuous variant, in case declares $ac_func. For example, HP-UX 11i declares gettimeofday. */ #define $ac_func innocuous_$ac_func /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $ac_func /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_$ac_func) || defined (__stub___$ac_func) choke me #else char (*f) () = $ac_func; #endif #ifdef __cplusplus } #endif int main () { return f != $ac_func; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -f conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done ac_config_files="$ac_config_files Makefile src/Makefile tests/Makefile tests/diag/Makefile tests/fail/Makefile tests/ok/Makefile tests/ok/ok-hash/Makefile tests/ok/ok-numeric/Makefile tests/ok/ok/Makefile tests/pass/Makefile tests/plan/Makefile tests/plan/no-tests/Makefile tests/plan/no_plan/Makefile tests/plan/not-enough-tests/Makefile tests/plan/sane/Makefile tests/plan/skip_all/Makefile tests/plan/too-many-plans/Makefile tests/plan/too-many-tests/Makefile tests/skip/Makefile tests/todo/Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, don't put newlines in cache variables' values. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. { (set) 2>&1 | case `(ac_space=' '; set | grep ac_space) 2>&1` in *ac_space=\ *) # `set' does not quote correctly, so add quotes (double-quote # substitution turns \\\\ into \\, and sed turns \\ into \). sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n \ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" ;; esac; } | sed ' t clear : clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ : end' >>confcache if diff $cache_file confcache >/dev/null 2>&1; then :; else if test -w $cache_file; then test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" cat confcache >$cache_file else echo "not updating unwritable cache $cache_file" fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # VPATH may cause trouble with some makes, so we remove $(srcdir), # ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=/{ s/:*\$(srcdir):*/:/; s/:*\${srcdir}:*/:/; s/:*@srcdir@:*/:/; s/^\([^=]*=[ ]*\):*/\1/; s/:*$//; s/^[^=]*=[ ]*$//; }' fi # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then we branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. cat >confdef2opt.sed <<\_ACEOF t clear : clear s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\),-D\1=\2,g t quote s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\),-D\1=\2,g t quote d : quote s,[ `~#$^&*(){}\\|;'"<>?],\\&,g s,\[,\\&,g s,\],\\&,g s,\$,$$,g p _ACEOF # We use echo to avoid assuming a particular line-breaking character. # The extra dot is to prevent the shell from consuming trailing # line-breaks from the sub-command output. A line-break within # single-quotes doesn't work because, if this script is created in a # platform that uses two characters for line-breaks (e.g., DOS), tr # would break. ac_LF_and_DOT=`echo; echo .` DEFS=`sed -n -f confdef2opt.sed confdefs.h | tr "$ac_LF_and_DOT" ' .'` rm -f confdef2opt.sed ac_libobjs= ac_ltlibobjs= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_i=`echo "$ac_i" | sed 's/\$U\././;s/\.o$//;s/\.obj$//'` # 2. Add them. ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext" ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi : ${CONFIG_STATUS=./config.status} ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 echo "$as_me: creating $CONFIG_STATUS" >&6;} cat >$CONFIG_STATUS <<_ACEOF #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then set -o posix fi DUALCASE=1; export DUALCASE # for MKS sh # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # Work around bugs in pre-3.0 UWIN ksh. $as_unset ENV MAIL MAILPATH PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. for as_var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else $as_unset $as_var fi done # Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi # Name of the executable. as_me=`$as_basename "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)$' \| \ . : '\(.\)' 2>/dev/null || echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } /^X\/\(\/\/\)$/{ s//\1/; q; } /^X\/\(\/\).*/{ s//\1/; q; } s/.*/./; q'` # PATH needs CR, and LINENO needs CR and PATH. # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" || { # Find who we are. Look in the path if we contain no path at all # relative or not. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5 echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;} { (exit 1); exit 1; }; } fi case $CONFIG_SHELL in '') as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for as_base in sh bash ksh sh5; do case $as_dir in /*) if ("$as_dir/$as_base" -c ' as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } CONFIG_SHELL=$as_dir/$as_base export CONFIG_SHELL exec "$CONFIG_SHELL" "$0" ${1+"$@"} fi;; esac done done ;; esac # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line before each line; the second 'sed' does the real # work. The second script uses 'N' to pair each line-number line # with the numbered line, and appends trailing '-' during # substitution so that $LINENO is not a special case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) sed '=' <$as_myself | sed ' N s,$,-, : loop s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, t loop s,-$,, s,^['$as_cr_digits']*\n,, ' >$as_me.lineno && chmod +x $as_me.lineno || { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5 echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;} { (exit 1); exit 1; }; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensible to this). . ./$as_me.lineno # Exit status is that of the last command. exit } case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in *c*,-n*) ECHO_N= ECHO_C=' ' ECHO_T=' ' ;; *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; *) ECHO_N= ECHO_C='\c' ECHO_T= ;; esac if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file echo >conf$$.file if ln -s conf$$.file conf$$ 2>/dev/null; then # We could just check for DJGPP; but this test a) works b) is more generic # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). if test -f conf$$.exe; then # Don't use ln at all; we don't have any links as_ln_s='cp -p' else as_ln_s='ln -s' fi elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.file if mkdir -p . 2>/dev/null; then as_mkdir_p=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_executable_p="test -f" # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" # IFS # We need space, tab and new line, in precisely that order. as_nl=' ' IFS=" $as_nl" # CDPATH. $as_unset CDPATH exec 6>&1 # Open the log real soon, to keep \$[0] and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. Logging --version etc. is OK. exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX } >&5 cat >&5 <<_CSEOF This file was extended by tap $as_me 1.01, which was generated by GNU Autoconf 2.59. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ _CSEOF echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5 echo >&5 _ACEOF # Files that config.status was made for. if test -n "$ac_config_files"; then echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS fi if test -n "$ac_config_headers"; then echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS fi if test -n "$ac_config_links"; then echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS fi if test -n "$ac_config_commands"; then echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS fi cat >>$CONFIG_STATUS <<\_ACEOF ac_cs_usage="\ \`$as_me' instantiates files from templates according to the current configuration. Usage: $0 [OPTIONS] [FILE]... -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Configuration commands: $config_commands Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_cs_version="\\ tap config.status 1.01 configured by $0, generated by GNU Autoconf 2.59, with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" Copyright (C) 2003 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." srcdir=$srcdir INSTALL="$INSTALL" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # If no file are specified by the user, then we need to provide default # value. By we need to know if files were specified by the user. ac_need_defaults=: while test $# != 0 do case $1 in --*=*) ac_option=`expr "x$1" : 'x\([^=]*\)='` ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'` ac_shift=: ;; -*) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; *) # This is not an option, so the user has probably given explicit # arguments. ac_option=$1 ac_need_defaults=false;; esac case $ac_option in # Handling of the options. _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --vers* | -V ) echo "$ac_cs_version"; exit 0 ;; --he | --h) # Conflict between --help and --header { { echo "$as_me:$LINENO: error: ambiguous option: $1 Try \`$0 --help' for more information." >&5 echo "$as_me: error: ambiguous option: $1 Try \`$0 --help' for more information." >&2;} { (exit 1); exit 1; }; };; --help | --hel | -h ) echo "$ac_cs_usage"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift CONFIG_FILES="$CONFIG_FILES $ac_optarg" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" ac_need_defaults=false;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1 Try \`$0 --help' for more information." >&5 echo "$as_me: error: unrecognized option: $1 Try \`$0 --help' for more information." >&2;} { (exit 1); exit 1; }; } ;; *) ac_config_targets="$ac_config_targets $1" ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF if \$ac_cs_recheck; then echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF # # INIT-COMMANDS section. # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF for ac_config_target in $ac_config_targets do case "$ac_config_target" in # Handling of arguments. "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; "src/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "tests/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;; "tests/diag/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/diag/Makefile" ;; "tests/fail/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/fail/Makefile" ;; "tests/ok/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/ok/Makefile" ;; "tests/ok/ok-hash/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/ok/ok-hash/Makefile" ;; "tests/ok/ok-numeric/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/ok/ok-numeric/Makefile" ;; "tests/ok/ok/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/ok/ok/Makefile" ;; "tests/pass/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/pass/Makefile" ;; "tests/plan/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/plan/Makefile" ;; "tests/plan/no-tests/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/plan/no-tests/Makefile" ;; "tests/plan/no_plan/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/plan/no_plan/Makefile" ;; "tests/plan/not-enough-tests/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/plan/not-enough-tests/Makefile" ;; "tests/plan/sane/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/plan/sane/Makefile" ;; "tests/plan/skip_all/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/plan/skip_all/Makefile" ;; "tests/plan/too-many-plans/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/plan/too-many-plans/Makefile" ;; "tests/plan/too-many-tests/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/plan/too-many-tests/Makefile" ;; "tests/skip/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/skip/Makefile" ;; "tests/todo/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/todo/Makefile" ;; "depfiles" ) CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 echo "$as_me: error: invalid argument: $ac_config_target" >&2;} { (exit 1); exit 1; }; };; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason to put it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Create a temporary directory, and hook for its removal unless debugging. $debug || { trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 trap '{ (exit 1); exit 1; }' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" } || { tmp=./confstat$$-$RANDOM (umask 077 && mkdir $tmp) } || { echo "$me: cannot create a temporary directory in ." >&2 { (exit 1); exit 1; } } _ACEOF cat >>$CONFIG_STATUS <<_ACEOF # # CONFIG_FILES section. # # No need to generate the scripts if there are no CONFIG_FILES. # This happens for instance when ./config.status config.h if test -n "\$CONFIG_FILES"; then # Protect against being on the right side of a sed subst in config.status. sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g; s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF s,@SHELL@,$SHELL,;t t s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t s,@exec_prefix@,$exec_prefix,;t t s,@prefix@,$prefix,;t t s,@program_transform_name@,$program_transform_name,;t t s,@bindir@,$bindir,;t t s,@sbindir@,$sbindir,;t t s,@libexecdir@,$libexecdir,;t t s,@datadir@,$datadir,;t t s,@sysconfdir@,$sysconfdir,;t t s,@sharedstatedir@,$sharedstatedir,;t t s,@localstatedir@,$localstatedir,;t t s,@libdir@,$libdir,;t t s,@includedir@,$includedir,;t t s,@oldincludedir@,$oldincludedir,;t t s,@infodir@,$infodir,;t t s,@mandir@,$mandir,;t t s,@build_alias@,$build_alias,;t t s,@host_alias@,$host_alias,;t t s,@target_alias@,$target_alias,;t t s,@DEFS@,$DEFS,;t t s,@ECHO_C@,$ECHO_C,;t t s,@ECHO_N@,$ECHO_N,;t t s,@ECHO_T@,$ECHO_T,;t t s,@LIBS@,$LIBS,;t t s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t s,@INSTALL_DATA@,$INSTALL_DATA,;t t s,@CYGPATH_W@,$CYGPATH_W,;t t s,@PACKAGE@,$PACKAGE,;t t s,@VERSION@,$VERSION,;t t s,@ACLOCAL@,$ACLOCAL,;t t s,@AUTOCONF@,$AUTOCONF,;t t s,@AUTOMAKE@,$AUTOMAKE,;t t s,@AUTOHEADER@,$AUTOHEADER,;t t s,@MAKEINFO@,$MAKEINFO,;t t s,@install_sh@,$install_sh,;t t s,@STRIP@,$STRIP,;t t s,@ac_ct_STRIP@,$ac_ct_STRIP,;t t s,@INSTALL_STRIP_PROGRAM@,$INSTALL_STRIP_PROGRAM,;t t s,@mkdir_p@,$mkdir_p,;t t s,@AWK@,$AWK,;t t s,@SET_MAKE@,$SET_MAKE,;t t s,@am__leading_dot@,$am__leading_dot,;t t s,@AMTAR@,$AMTAR,;t t s,@am__tar@,$am__tar,;t t s,@am__untar@,$am__untar,;t t s,@CC@,$CC,;t t s,@CFLAGS@,$CFLAGS,;t t s,@LDFLAGS@,$LDFLAGS,;t t s,@CPPFLAGS@,$CPPFLAGS,;t t s,@ac_ct_CC@,$ac_ct_CC,;t t s,@EXEEXT@,$EXEEXT,;t t s,@OBJEXT@,$OBJEXT,;t t s,@DEPDIR@,$DEPDIR,;t t s,@am__include@,$am__include,;t t s,@am__quote@,$am__quote,;t t s,@AMDEP_TRUE@,$AMDEP_TRUE,;t t s,@AMDEP_FALSE@,$AMDEP_FALSE,;t t s,@AMDEPBACKSLASH@,$AMDEPBACKSLASH,;t t s,@CCDEPMODE@,$CCDEPMODE,;t t s,@am__fastdepCC_TRUE@,$am__fastdepCC_TRUE,;t t s,@am__fastdepCC_FALSE@,$am__fastdepCC_FALSE,;t t s,@build@,$build,;t t s,@build_cpu@,$build_cpu,;t t s,@build_vendor@,$build_vendor,;t t s,@build_os@,$build_os,;t t s,@host@,$host,;t t s,@host_cpu@,$host_cpu,;t t s,@host_vendor@,$host_vendor,;t t s,@host_os@,$host_os,;t t s,@EGREP@,$EGREP,;t t s,@LN_S@,$LN_S,;t t s,@ECHO@,$ECHO,;t t s,@AR@,$AR,;t t s,@ac_ct_AR@,$ac_ct_AR,;t t s,@RANLIB@,$RANLIB,;t t s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t s,@CPP@,$CPP,;t t s,@CXX@,$CXX,;t t s,@CXXFLAGS@,$CXXFLAGS,;t t s,@ac_ct_CXX@,$ac_ct_CXX,;t t s,@CXXDEPMODE@,$CXXDEPMODE,;t t s,@am__fastdepCXX_TRUE@,$am__fastdepCXX_TRUE,;t t s,@am__fastdepCXX_FALSE@,$am__fastdepCXX_FALSE,;t t s,@CXXCPP@,$CXXCPP,;t t s,@F77@,$F77,;t t s,@FFLAGS@,$FFLAGS,;t t s,@ac_ct_F77@,$ac_ct_F77,;t t s,@LIBTOOL@,$LIBTOOL,;t t s,@LIBOBJS@,$LIBOBJS,;t t s,@LTLIBOBJS@,$LTLIBOBJS,;t t CEOF _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # Split the substitutions into bite-sized pieces for seds with # small command number limits, like on Digital OSF/1 and HP-UX. ac_max_sed_lines=48 ac_sed_frag=1 # Number of current file. ac_beg=1 # First line for current file. ac_end=$ac_max_sed_lines # Line after last line for current file. ac_more_lines=: ac_sed_cmds= while $ac_more_lines; do if test $ac_beg -gt 1; then sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag else sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag fi if test ! -s $tmp/subs.frag; then ac_more_lines=false else # The purpose of the label and of the branching condition is to # speed up the sed processing (if there are no `@' at all, there # is no need to browse any of the substitutions). # These are the two extra sed commands mentioned above. (echo ':t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed if test -z "$ac_sed_cmds"; then ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" else ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" fi ac_sed_frag=`expr $ac_sed_frag + 1` ac_beg=$ac_end ac_end=`expr $ac_end + $ac_max_sed_lines` fi done if test -z "$ac_sed_cmds"; then ac_sed_cmds=cat fi fi # test -n "$CONFIG_FILES" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". case $ac_file in - | *:- | *:-:* ) # input from stdin cat >$tmp/stdin ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; * ) ac_file_in=$ac_file.in ;; esac # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. ac_dir=`(dirname "$ac_file") 2>/dev/null || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` { if $as_mkdir_p; then mkdir -p "$ac_dir" else as_dir="$ac_dir" as_dirs= while test ! -d "$as_dir"; do as_dirs="$as_dir $as_dirs" as_dir=`(dirname "$as_dir") 2>/dev/null || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` done test ! -n "$as_dirs" || mkdir $as_dirs fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} { (exit 1); exit 1; }; }; } ac_builddir=. if test "$ac_dir" != .; then ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A "../" for each directory in $ac_dir_suffix. ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` else ac_dir_suffix= ac_top_builddir= fi case $srcdir in .) # No --srcdir option. We are building in place. ac_srcdir=. if test -z "$ac_top_builddir"; then ac_top_srcdir=. else ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` fi ;; [\\/]* | ?:[\\/]* ) # Absolute path. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ;; *) # Relative path. ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_builddir$srcdir ;; esac # Do not use `cd foo && pwd` to compute absolute paths, because # the directories may not exist. case `pwd` in .) ac_abs_builddir="$ac_dir";; *) case "$ac_dir" in .) ac_abs_builddir=`pwd`;; [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; *) ac_abs_builddir=`pwd`/"$ac_dir";; esac;; esac case $ac_abs_builddir in .) ac_abs_top_builddir=${ac_top_builddir}.;; *) case ${ac_top_builddir}. in .) ac_abs_top_builddir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; esac;; esac case $ac_abs_builddir in .) ac_abs_srcdir=$ac_srcdir;; *) case $ac_srcdir in .) ac_abs_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; esac;; esac case $ac_abs_builddir in .) ac_abs_top_srcdir=$ac_top_srcdir;; *) case $ac_top_srcdir in .) ac_abs_top_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; esac;; esac case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_builddir$INSTALL ;; esac if test x"$ac_file" != x-; then { echo "$as_me:$LINENO: creating $ac_file" >&5 echo "$as_me: creating $ac_file" >&6;} rm -f "$ac_file" fi # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ if test x"$ac_file" = x-; then configure_input= else configure_input="$ac_file. " fi configure_input=$configure_input"Generated from `echo $ac_file_in | sed 's,.*/,,'` by configure." # First look for the input files in the build tree, otherwise in the # src tree. ac_file_inputs=`IFS=: for f in $ac_file_in; do case $f in -) echo $tmp/stdin ;; [\\/$]*) # Absolute (can't be DOS-style, as IFS=:) test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } echo "$f";; *) # Relative if test -f "$f"; then # Build tree echo "$f" elif test -f "$srcdir/$f"; then # Source tree echo "$srcdir/$f" else # /dev/null tree { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } fi;; esac done` || { (exit 1); exit 1; } _ACEOF cat >>$CONFIG_STATUS <<_ACEOF sed "$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s,@configure_input@,$configure_input,;t t s,@srcdir@,$ac_srcdir,;t t s,@abs_srcdir@,$ac_abs_srcdir,;t t s,@top_srcdir@,$ac_top_srcdir,;t t s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t s,@builddir@,$ac_builddir,;t t s,@abs_builddir@,$ac_abs_builddir,;t t s,@top_builddir@,$ac_top_builddir,;t t s,@abs_top_builddir@,$ac_abs_top_builddir,;t t s,@INSTALL@,$ac_INSTALL,;t t " $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out rm -f $tmp/stdin if test x"$ac_file" != x-; then mv $tmp/out $ac_file else cat $tmp/out rm -f $tmp/out fi done _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # # CONFIG_COMMANDS section. # for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue ac_dest=`echo "$ac_file" | sed 's,:.*,,'` ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_dir=`(dirname "$ac_dest") 2>/dev/null || $as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_dest" : 'X\(//\)[^/]' \| \ X"$ac_dest" : 'X\(//\)$' \| \ X"$ac_dest" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$ac_dest" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` { if $as_mkdir_p; then mkdir -p "$ac_dir" else as_dir="$ac_dir" as_dirs= while test ! -d "$as_dir"; do as_dirs="$as_dir $as_dirs" as_dir=`(dirname "$as_dir") 2>/dev/null || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` done test ! -n "$as_dirs" || mkdir $as_dirs fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} { (exit 1); exit 1; }; }; } ac_builddir=. if test "$ac_dir" != .; then ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A "../" for each directory in $ac_dir_suffix. ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` else ac_dir_suffix= ac_top_builddir= fi case $srcdir in .) # No --srcdir option. We are building in place. ac_srcdir=. if test -z "$ac_top_builddir"; then ac_top_srcdir=. else ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` fi ;; [\\/]* | ?:[\\/]* ) # Absolute path. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ;; *) # Relative path. ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_builddir$srcdir ;; esac # Do not use `cd foo && pwd` to compute absolute paths, because # the directories may not exist. case `pwd` in .) ac_abs_builddir="$ac_dir";; *) case "$ac_dir" in .) ac_abs_builddir=`pwd`;; [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; *) ac_abs_builddir=`pwd`/"$ac_dir";; esac;; esac case $ac_abs_builddir in .) ac_abs_top_builddir=${ac_top_builddir}.;; *) case ${ac_top_builddir}. in .) ac_abs_top_builddir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; esac;; esac case $ac_abs_builddir in .) ac_abs_srcdir=$ac_srcdir;; *) case $ac_srcdir in .) ac_abs_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; esac;; esac case $ac_abs_builddir in .) ac_abs_top_srcdir=$ac_top_srcdir;; *) case $ac_top_srcdir in .) ac_abs_top_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; esac;; esac { echo "$as_me:$LINENO: executing $ac_dest commands" >&5 echo "$as_me: executing $ac_dest commands" >&6;} case $ac_dest in depfiles ) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # So let's grep whole file. if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then dirpart=`(dirname "$mf") 2>/dev/null || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`(dirname "$file") 2>/dev/null || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` { if $as_mkdir_p; then mkdir -p $dirpart/$fdir else as_dir=$dirpart/$fdir as_dirs= while test ! -d "$as_dir"; do as_dirs="$as_dir $as_dirs" as_dir=`(dirname "$as_dir") 2>/dev/null || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` done test ! -n "$as_dirs" || mkdir $as_dirs fi || { { echo "$as_me:$LINENO: error: cannot create directory $dirpart/$fdir" >&5 echo "$as_me: error: cannot create directory $dirpart/$fdir" >&2;} { (exit 1); exit 1; }; }; } # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done ;; esac done _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF { (exit 0); exit 0; } _ACEOF chmod +x $CONFIG_STATUS ac_clean_files=$ac_clean_files_save # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || { (exit 1); exit 1; } fi nagios-4.3.4/tap/configure.in000066400000000000000000000020761314764422400161130ustar00rootroot00000000000000AC_INIT(tap, 1.01) AC_CONFIG_SRCDIR(src/tap.c) AM_INIT_AUTOMAKE([foreign]) AC_PROG_CC AC_PROG_LIBTOOL AC_PROG_INSTALL # Checks for libraries case "$host" in *-*-*freebsd4*) LDFLAGS="$LDFLAGS -pthread" HAVE_LIBPTHREAD=1 ;; *) AC_CHECK_LIB(pthread, main) ;; esac # Checks for header files AC_HEADER_STDC AC_CHECK_HEADERS([stdlib.h]) AC_CHECK_HEADERS([pthread.h]) # Checks for typedefs, structures, and compiler characteristics. AC_C_CONST # Checks for library functions. AC_FUNC_VPRINTF AC_CHECK_FUNCS([atexit]) AC_CONFIG_FILES([Makefile src/Makefile tests/Makefile tests/diag/Makefile tests/fail/Makefile tests/ok/Makefile tests/ok/ok-hash/Makefile tests/ok/ok-numeric/Makefile tests/ok/ok/Makefile tests/pass/Makefile tests/plan/Makefile tests/plan/no-tests/Makefile tests/plan/no_plan/Makefile tests/plan/not-enough-tests/Makefile tests/plan/sane/Makefile tests/plan/skip_all/Makefile tests/plan/too-many-plans/Makefile tests/plan/too-many-tests/Makefile tests/skip/Makefile tests/todo/Makefile ]) AC_OUTPUT nagios-4.3.4/tap/depcomp000077500000000000000000000355461314764422400151670ustar00rootroot00000000000000#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2004-05-31.23 # Copyright (C) 1999, 2000, 2003, 2004 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try \`$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by `PROGRAMS ARGS'. object Object file output by `PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputting dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit 0 ;; -v | --v*) echo "depcomp $scriptversion" exit 0 ;; esac if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ## The second -e expression handles DOS-style file names with drive letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the `deleted header file' problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. tr ' ' ' ' < "$tmpdepfile" | ## Some versions of gcc put a space before the `:'. On the theory ## that the space means something, we add a space to the output as ## well. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like `#:fec' to the end of the # dependency line. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ tr ' ' ' ' >> $depfile echo >> $depfile # The second pass generates a dummy entry for each header file. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> $depfile else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts `$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'` tmpdepfile="$stripped.u" if test "$libtool" = yes; then "$@" -Wc,-M else "$@" -M fi stat=$? if test -f "$tmpdepfile"; then : else stripped=`echo "$stripped" | sed 's,^.*/,,'` tmpdepfile="$stripped.u" fi if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi if test -f "$tmpdepfile"; then outname="$stripped.o" # Each line is of the form `foo.o: dependent.h'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile" sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; icc) # Intel's C compiler understands `-MD -MF file'. However on # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c # ICC 7.0 will fill foo.d with something like # foo.o: sub/foo.c # foo.o: sub/foo.h # which is wrong. We want: # sub/foo.o: sub/foo.c # sub/foo.o: sub/foo.h # sub/foo.c: # sub/foo.h: # ICC 7.1 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using \ : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in `foo.d' instead, so we check for that too. # Subdirectories are respected. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then # Dependencies are output in .lo.d with libtool 1.4. # With libtool 1.5 they are output both in $dir.libs/$base.o.d # and in $dir.libs/$base.o.d and $dir$base.o.d. We process the # latter, because the former will be cleaned when $dir.libs is # erased. tmpdepfile1="$dir.libs/$base.lo.d" tmpdepfile2="$dir$base.o.d" tmpdepfile3="$dir.libs/$base.d" "$@" -Wc,-MD else tmpdepfile1="$dir$base.o.d" tmpdepfile2="$dir$base.d" tmpdepfile3="$dir$base.d" "$@" -MD fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi if test -f "$tmpdepfile1"; then tmpdepfile="$tmpdepfile1" elif test -f "$tmpdepfile2"; then tmpdepfile="$tmpdepfile2" else tmpdepfile="$tmpdepfile3" fi if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" # That's a tab and a space in the []. sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for `:' # in the target name. This is to cope with DOS-style filenames: # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. "$@" $dashmflag | sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" tr ' ' ' ' < "$tmpdepfile" | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # X makedepend shift cleared=no for arg in "$@"; do case $cleared in no) set ""; shift cleared=yes ;; esac case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix="`echo $object | sed 's/^.*\././'`" touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" sed '1,2d' "$tmpdepfile" | tr ' ' ' ' | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E | sed -n '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o, # because we must use -o when running libtool. "$@" || exit $? IFS=" " for arg do case "$arg" in "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" echo " " >> "$depfile" . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: nagios-4.3.4/tap/install-sh000077500000000000000000000220111314764422400155750ustar00rootroot00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2004-10-22.00 # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. It can only install one file at a time, a restriction # shared with many OS's install programs. # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit="${DOITPROG-}" # put in absolute paths if you don't have them in your path; or use env. vars. mvprog="${MVPROG-mv}" cpprog="${CPPROG-cp}" chmodprog="${CHMODPROG-chmod}" chownprog="${CHOWNPROG-chown}" chgrpprog="${CHGRPPROG-chgrp}" stripprog="${STRIPPROG-strip}" rmprog="${RMPROG-rm}" mkdirprog="${MKDIRPROG-mkdir}" chmodcmd="$chmodprog 0755" chowncmd= chgrpcmd= stripcmd= rmcmd="$rmprog -f" mvcmd="$mvprog" src= dst= dir_arg= dstarg= no_target_directory= usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: -c (ignored) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. --help display this help and exit. --version display version info and exit. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test -n "$1"; do case $1 in -c) shift continue;; -d) dir_arg=true shift continue;; -g) chgrpcmd="$chgrpprog $2" shift shift continue;; --help) echo "$usage"; exit 0;; -m) chmodcmd="$chmodprog $2" shift shift continue;; -o) chowncmd="$chownprog $2" shift shift continue;; -s) stripcmd=$stripprog shift continue;; -t) dstarg=$2 shift shift continue;; -T) no_target_directory=true shift continue;; --version) echo "$0 $scriptversion"; exit 0;; *) # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. test -n "$dir_arg$dstarg" && break # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dstarg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dstarg" shift # fnord fi shift # arg dstarg=$arg done break;; esac done if test -z "$1"; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call `install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi for src do # Protect names starting with `-'. case $src in -*) src=./$src ;; esac if test -n "$dir_arg"; then dst=$src src= if test -d "$dst"; then mkdircmd=: chmodcmd= else mkdircmd=$mkdirprog fi else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dstarg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dstarg # Protect names starting with `-'. case $dst in -*) dst=./$dst ;; esac # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dstarg: Is a directory" >&2 exit 1 fi dst=$dst/`basename "$src"` fi fi # This sed command emulates the dirname command. dstdir=`echo "$dst" | sed -e 's,/*$,,;s,[^/]*$,,;s,/*$,,;s,^$,.,'` # Make sure that the destination directory exists. # Skip lots of stat calls in the usual case. if test ! -d "$dstdir"; then defaultIFS=' ' IFS="${IFS-$defaultIFS}" oIFS=$IFS # Some sh's can't handle IFS=/ for some reason. IFS='%' set x `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'` shift IFS=$oIFS pathcomp= while test $# -ne 0 ; do pathcomp=$pathcomp$1 shift if test ! -d "$pathcomp"; then $mkdirprog "$pathcomp" # mkdir can fail with a `File exist' error in case several # install-sh are creating the directory concurrently. This # is OK. test -d "$pathcomp" || exit fi pathcomp=$pathcomp/ done fi if test -n "$dir_arg"; then $doit $mkdircmd "$dst" \ && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \ && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \ && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \ && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; } else dstfile=`basename "$dst"` # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 trap '(exit $?); exit' 1 2 13 15 # Copy the file name to the temp name. $doit $cpprog "$src" "$dsttmp" && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \ && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \ && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \ && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } && # Now rename the file to the real destination. { $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \ || { # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { if test -f "$dstdir/$dstfile"; then $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \ || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \ || { echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2 (exit 1); exit } else : fi } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dstdir/$dstfile" } } fi || { (exit 1); exit; } done # The final little trick to "correctly" pass the exit status to the exit trap. { (exit 0); exit } # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: nagios-4.3.4/tap/ltmain.sh000066400000000000000000005465631314764422400154400ustar00rootroot00000000000000# ltmain.sh - Provide generalized library-building support services. # NOTE: Changing this file will not affect anything until you rerun configure. # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004 # Free Software Foundation, Inc. # Originally by Gordon Matzigkeit , 1996 # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. basename="s,^.*/,,g" # Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh # is ksh but when the shell is invoked as "sh" and the current value of # the _XPG environment variable is not equal to 1 (one), the special # positional parameter $0, within a function call, is the name of the # function. progpath="$0" # The name of this program: progname=`echo "$progpath" | $SED $basename` modename="$progname" # Global variables: EXIT_SUCCESS=0 EXIT_FAILURE=1 PROGRAM=ltmain.sh PACKAGE=libtool VERSION=1.5.10 TIMESTAMP=" (1.1220.2.130 2004/09/19 12:13:49)" # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi # Check that we have a working $echo. if test "X$1" = X--no-reexec; then # Discard the --no-reexec flag, and continue. shift elif test "X$1" = X--fallback-echo; then # Avoid inline document here, it may be left over : elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then # Yippee, $echo works! : else # Restart under the correct shell, and then maybe $echo will work. exec $SHELL "$progpath" --no-reexec ${1+"$@"} fi if test "X$1" = X--fallback-echo; then # used as fallback echo shift cat <&2 $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 exit $EXIT_FAILURE fi # Global variables. mode=$default_mode nonopt= prev= prevopt= run= show="$echo" show_help= execute_dlfiles= lo2o="s/\\.lo\$/.${objext}/" o2lo="s/\\.${objext}\$/.lo/" ##################################### # Shell function definitions: # This seems to be the best place for them # func_win32_libid arg # return the library type of file 'arg' # # Need a lot of goo to handle *both* DLLs and import libs # Has to be a shell function in order to 'eat' the argument # that is supplied when $file_magic_command is called. func_win32_libid () { win32_libid_type="unknown" win32_fileres=`file -L $1 2>/dev/null` case $win32_fileres in *ar\ archive\ import\ library*) # definitely import win32_libid_type="x86 archive import" ;; *ar\ archive*) # could be an import, or static if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | \ $EGREP -e 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then win32_nmres=`eval $NM -f posix -A $1 | \ sed -n -e '1,100{/ I /{x;/import/!{s/^/import/;h;p;};x;};}'` if test "X$win32_nmres" = "Ximport" ; then win32_libid_type="x86 archive import" else win32_libid_type="x86 archive static" fi fi ;; *DLL*) win32_libid_type="x86 DLL" ;; *executable*) # but shell scripts are "executable" too... case $win32_fileres in *MS\ Windows\ PE\ Intel*) win32_libid_type="x86 DLL" ;; esac ;; esac $echo $win32_libid_type } # func_infer_tag arg # Infer tagged configuration to use if any are available and # if one wasn't chosen via the "--tag" command line option. # Only attempt this if the compiler in the base compile # command doesn't match the default compiler. # arg is usually of the form 'gcc ...' func_infer_tag () { if test -n "$available_tags" && test -z "$tagname"; then CC_quoted= for arg in $CC; do case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") arg="\"$arg\"" ;; esac CC_quoted="$CC_quoted $arg" done case $@ in # Blanks in the command may have been stripped by the calling shell, # but not from the CC environment variable when configure was run. " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) ;; # Blanks at the start of $base_compile will cause this to fail # if we don't check for them as well. *) for z in $available_tags; do if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then # Evaluate the configuration. eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" CC_quoted= for arg in $CC; do # Double-quote args containing other shell metacharacters. case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") arg="\"$arg\"" ;; esac CC_quoted="$CC_quoted $arg" done case "$@ " in " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) # The compiler in the base compile command matches # the one in the tagged configuration. # Assume this is the tagged configuration we want. tagname=$z break ;; esac fi done # If $tagname still isn't set, then no tagged configuration # was found and let the user know that the "--tag" command # line option must be used. if test -z "$tagname"; then $echo "$modename: unable to infer tagged configuration" $echo "$modename: specify a tag with \`--tag'" 1>&2 exit $EXIT_FAILURE # else # $echo "$modename: using $tagname tagged configuration" fi ;; esac fi } # func_extract_archives gentop oldlib ... func_extract_archives () { my_gentop="$1"; shift my_oldlibs=${1+"$@"} my_oldobjs="" my_xlib="" my_xabs="" my_xdir="" my_status="" $show "${rm}r $my_gentop" $run ${rm}r "$my_gentop" $show "$mkdir $my_gentop" $run $mkdir "$my_gentop" my_status=$? if test "$my_status" -ne 0 && test ! -d "$my_gentop"; then exit $my_status fi for my_xlib in $my_oldlibs; do # Extract the objects. case $my_xlib in [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; *) my_xabs=`pwd`"/$my_xlib" ;; esac my_xlib=`$echo "X$my_xlib" | $Xsed -e 's%^.*/%%'` my_xdir="$my_gentop/$my_xlib" $show "${rm}r $my_xdir" $run ${rm}r "$my_xdir" $show "$mkdir $my_xdir" $run $mkdir "$my_xdir" status=$? if test "$status" -ne 0 && test ! -d "$my_xdir"; then exit $status fi case $host in *-darwin*) $show "Extracting $my_xabs" # Do not bother doing anything if just a dry run if test -z "$run"; then darwin_orig_dir=`pwd` cd $my_xdir || exit $? darwin_archive=$my_xabs darwin_curdir=`pwd` darwin_base_archive=`basename $darwin_archive` darwin_arches=`lipo -info "$darwin_archive" 2>/dev/null | $EGREP Architectures 2>/dev/null` if test -n "$darwin_arches"; then darwin_arches=`echo "$darwin_arches" | $SED -e 's/.*are://'` darwin_arch= $show "$darwin_base_archive has multiple architectures $darwin_arches" for darwin_arch in $darwin_arches ; do mkdir -p "unfat-$$/${darwin_base_archive}-${darwin_arch}" lipo -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" # Remove the table of contents from the thin files. $AR -d "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" __.SYMDEF 2>/dev/null || true $AR -d "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" __.SYMDEF\ SORTED 2>/dev/null || true cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" $AR -xo "${darwin_base_archive}" rm "${darwin_base_archive}" cd "$darwin_curdir" done # $darwin_arches ## Okay now we have a bunch of thin objects, gotta fatten them up :) darwin_filelist=`find unfat-$$ -type f | xargs basename | sort -u | $NL2SP` darwin_file= darwin_files= for darwin_file in $darwin_filelist; do darwin_files=`find unfat-$$ -name $darwin_file -print | $NL2SP` lipo -create -output "$darwin_file" $darwin_files done # $darwin_filelist rm -rf unfat-$$ cd "$darwin_orig_dir" else cd $darwin_orig_dir (cd $my_xdir && $AR x $my_xabs) || exit $? fi # $darwin_arches fi # $run ;; *) # We will extract separately just the conflicting names and we will # no longer touch any unique names. It is faster to leave these # extract automatically by $AR in one run. $show "(cd $my_xdir && $AR x $my_xabs)" $run eval "(cd \$my_xdir && $AR x \$my_xabs)" || exit $? if ($AR t "$my_xabs" | sort | sort -uc >/dev/null 2>&1); then : else $echo "$modename: warning: object name conflicts; renaming object files" 1>&2 $echo "$modename: warning: to ensure that they will not overwrite" 1>&2 $AR t "$my_xabs" | sort | uniq -cd | while read -r count name do i=1 while test "$i" -le "$count" do # Put our $i before any first dot (extension) # Never overwrite any file name_to="$name" while test "X$name_to" = "X$name" || test -f "$my_xdir/$name_to" do name_to=`$echo "X$name_to" | $Xsed -e "s/\([^.]*\)/\1-$i/"` done $show "(cd $my_xdir && $AR xN $i $my_xabs '$name' && $mv '$name' '$name_to')" $run eval "(cd \$my_xdir && $AR xN $i \$my_xabs '$name' && $mv '$name' '$name_to')" || exit $? i=`expr $i + 1` done done fi ;; esac my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP` done func_extract_archives_result="$my_oldobjs" } # End of Shell function definitions ##################################### # Darwin sucks eval std_shrext=\"$shrext_cmds\" # Parse our command line options once, thoroughly. while test "$#" -gt 0 do arg="$1" shift case $arg in -*=*) optarg=`$echo "X$arg" | $Xsed -e 's/[-_a-zA-Z0-9]*=//'` ;; *) optarg= ;; esac # If the previous option needs an argument, assign it. if test -n "$prev"; then case $prev in execute_dlfiles) execute_dlfiles="$execute_dlfiles $arg" ;; tag) tagname="$arg" preserve_args="${preserve_args}=$arg" # Check whether tagname contains only valid characters case $tagname in *[!-_A-Za-z0-9,/]*) $echo "$progname: invalid tag name: $tagname" 1>&2 exit $EXIT_FAILURE ;; esac case $tagname in CC) # Don't test for the "default" C tag, as we know, it's there, but # not specially marked. ;; *) if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "$progpath" > /dev/null; then taglist="$taglist $tagname" # Evaluate the configuration. eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$tagname'$/,/^# ### END LIBTOOL TAG CONFIG: '$tagname'$/p' < $progpath`" else $echo "$progname: ignoring unknown tag $tagname" 1>&2 fi ;; esac ;; *) eval "$prev=\$arg" ;; esac prev= prevopt= continue fi # Have we seen a non-optional argument yet? case $arg in --help) show_help=yes ;; --version) $echo "$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP" $echo $echo "Copyright (C) 2003 Free Software Foundation, Inc." $echo "This is free software; see the source for copying conditions. There is NO" $echo "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." exit $EXIT_SUCCESS ;; --config) ${SED} -e '1,/^# ### BEGIN LIBTOOL CONFIG/d' -e '/^# ### END LIBTOOL CONFIG/,$d' $progpath # Now print the configurations for the tags. for tagname in $taglist; do ${SED} -n -e "/^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$/,/^# ### END LIBTOOL TAG CONFIG: $tagname$/p" < "$progpath" done exit $EXIT_SUCCESS ;; --debug) $echo "$progname: enabling shell trace mode" set -x preserve_args="$preserve_args $arg" ;; --dry-run | -n) run=: ;; --features) $echo "host: $host" if test "$build_libtool_libs" = yes; then $echo "enable shared libraries" else $echo "disable shared libraries" fi if test "$build_old_libs" = yes; then $echo "enable static libraries" else $echo "disable static libraries" fi exit $EXIT_SUCCESS ;; --finish) mode="finish" ;; --mode) prevopt="--mode" prev=mode ;; --mode=*) mode="$optarg" ;; --preserve-dup-deps) duplicate_deps="yes" ;; --quiet | --silent) show=: preserve_args="$preserve_args $arg" ;; --tag) prevopt="--tag" prev=tag ;; --tag=*) set tag "$optarg" ${1+"$@"} shift prev=tag preserve_args="$preserve_args --tag" ;; -dlopen) prevopt="-dlopen" prev=execute_dlfiles ;; -*) $echo "$modename: unrecognized option \`$arg'" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE ;; *) nonopt="$arg" break ;; esac done if test -n "$prevopt"; then $echo "$modename: option \`$prevopt' requires an argument" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi # If this variable is set in any of the actions, the command in it # will be execed at the end. This prevents here-documents from being # left over by shells. exec_cmd= if test -z "$show_help"; then # Infer the operation mode. if test -z "$mode"; then $echo "*** Warning: inferring the mode of operation is deprecated." 1>&2 $echo "*** Future versions of Libtool will require -mode=MODE be specified." 1>&2 case $nonopt in *cc | cc* | *++ | gcc* | *-gcc* | g++* | xlc*) mode=link for arg do case $arg in -c) mode=compile break ;; esac done ;; *db | *dbx | *strace | *truss) mode=execute ;; *install*|cp|mv) mode=install ;; *rm) mode=uninstall ;; *) # If we have no mode, but dlfiles were specified, then do execute mode. test -n "$execute_dlfiles" && mode=execute # Just use the default operation mode. if test -z "$mode"; then if test -n "$nonopt"; then $echo "$modename: warning: cannot infer operation mode from \`$nonopt'" 1>&2 else $echo "$modename: warning: cannot infer operation mode without MODE-ARGS" 1>&2 fi fi ;; esac fi # Only execute mode is allowed to have -dlopen flags. if test -n "$execute_dlfiles" && test "$mode" != execute; then $echo "$modename: unrecognized option \`-dlopen'" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi # Change the help message to a mode-specific one. generic_help="$help" help="Try \`$modename --help --mode=$mode' for more information." # These modes are in order of execution frequency so that they run quickly. case $mode in # libtool compile mode compile) modename="$modename: compile" # Get the compilation command and the source file. base_compile= srcfile="$nonopt" # always keep a non-empty value in "srcfile" suppress_opt=yes suppress_output= arg_mode=normal libobj= later= for arg do case "$arg_mode" in arg ) # do not "continue". Instead, add this to base_compile lastarg="$arg" arg_mode=normal ;; target ) libobj="$arg" arg_mode=normal continue ;; normal ) # Accept any command-line options. case $arg in -o) if test -n "$libobj" ; then $echo "$modename: you cannot specify \`-o' more than once" 1>&2 exit $EXIT_FAILURE fi arg_mode=target continue ;; -static | -prefer-pic | -prefer-non-pic) later="$later $arg" continue ;; -no-suppress) suppress_opt=no continue ;; -Xcompiler) arg_mode=arg # the next one goes into the "base_compile" arg list continue # The current "srcfile" will either be retained or ;; # replaced later. I would guess that would be a bug. -Wc,*) args=`$echo "X$arg" | $Xsed -e "s/^-Wc,//"` lastarg= save_ifs="$IFS"; IFS=',' for arg in $args; do IFS="$save_ifs" # Double-quote args containing other shell metacharacters. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") arg="\"$arg\"" ;; esac lastarg="$lastarg $arg" done IFS="$save_ifs" lastarg=`$echo "X$lastarg" | $Xsed -e "s/^ //"` # Add the arguments to base_compile. base_compile="$base_compile $lastarg" continue ;; * ) # Accept the current argument as the source file. # The previous "srcfile" becomes the current argument. # lastarg="$srcfile" srcfile="$arg" ;; esac # case $arg ;; esac # case $arg_mode # Aesthetically quote the previous argument. lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"` case $lastarg in # Double-quote args containing other shell metacharacters. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") lastarg="\"$lastarg\"" ;; esac base_compile="$base_compile $lastarg" done # for arg case $arg_mode in arg) $echo "$modename: you must specify an argument for -Xcompile" exit $EXIT_FAILURE ;; target) $echo "$modename: you must specify a target with \`-o'" 1>&2 exit $EXIT_FAILURE ;; *) # Get the name of the library object. [ -z "$libobj" ] && libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'` ;; esac # Recognize several different file suffixes. # If the user specifies -o file.o, it is replaced with file.lo xform='[cCFSifmso]' case $libobj in *.ada) xform=ada ;; *.adb) xform=adb ;; *.ads) xform=ads ;; *.asm) xform=asm ;; *.c++) xform=c++ ;; *.cc) xform=cc ;; *.ii) xform=ii ;; *.class) xform=class ;; *.cpp) xform=cpp ;; *.cxx) xform=cxx ;; *.f90) xform=f90 ;; *.for) xform=for ;; *.java) xform=java ;; esac libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"` case $libobj in *.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;; *) $echo "$modename: cannot determine name of library object from \`$libobj'" 1>&2 exit $EXIT_FAILURE ;; esac func_infer_tag $base_compile for arg in $later; do case $arg in -static) build_old_libs=yes continue ;; -prefer-pic) pic_mode=yes continue ;; -prefer-non-pic) pic_mode=no continue ;; esac done objname=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'` if test "X$xdir" = "X$obj"; then xdir= else xdir=$xdir/ fi lobj=${xdir}$objdir/$objname if test -z "$base_compile"; then $echo "$modename: you must specify a compilation command" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi # Delete any leftover library objects. if test "$build_old_libs" = yes; then removelist="$obj $lobj $libobj ${libobj}T" else removelist="$lobj $libobj ${libobj}T" fi $run $rm $removelist trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15 # On Cygwin there's no "real" PIC flag so we must build both object types case $host_os in cygwin* | mingw* | pw32* | os2*) pic_mode=default ;; esac if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then # non-PIC code in shared libraries is not supported pic_mode=default fi # Calculate the filename of the output object if compiler does # not support -o with -c if test "$compiler_c_o" = no; then output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext} lockfile="$output_obj.lock" removelist="$removelist $output_obj $lockfile" trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15 else output_obj= need_locks=no lockfile= fi # Lock this critical section if it is needed # We use this script file to make the link, it avoids creating a new file if test "$need_locks" = yes; then until $run ln "$progpath" "$lockfile" 2>/dev/null; do $show "Waiting for $lockfile to be removed" sleep 2 done elif test "$need_locks" = warn; then if test -f "$lockfile"; then $echo "\ *** ERROR, $lockfile exists and contains: `cat $lockfile 2>/dev/null` This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $run $rm $removelist exit $EXIT_FAILURE fi $echo $srcfile > "$lockfile" fi if test -n "$fix_srcfile_path"; then eval srcfile=\"$fix_srcfile_path\" fi $run $rm "$libobj" "${libobj}T" # Create a libtool object file (analogous to a ".la" file), # but don't create it if we're doing a dry run. test -z "$run" && cat > ${libobj}T </dev/null`" != "X$srcfile"; then $echo "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $run $rm $removelist exit $EXIT_FAILURE fi # Just move the object if needed, then go on to compile the next one if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then $show "$mv $output_obj $lobj" if $run $mv $output_obj $lobj; then : else error=$? $run $rm $removelist exit $error fi fi # Append the name of the PIC object to the libtool object file. test -z "$run" && cat >> ${libobj}T <> ${libobj}T </dev/null`" != "X$srcfile"; then $echo "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $run $rm $removelist exit $EXIT_FAILURE fi # Just move the object if needed if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then $show "$mv $output_obj $obj" if $run $mv $output_obj $obj; then : else error=$? $run $rm $removelist exit $error fi fi # Append the name of the non-PIC object the libtool object file. # Only append if the libtool object file exists. test -z "$run" && cat >> ${libobj}T <> ${libobj}T <&2 fi if test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi else if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi fi build_libtool_libs=no build_old_libs=yes prefer_static_libs=yes break ;; esac done # See if our shared archives depend on static archives. test -n "$old_archive_from_new_cmds" && build_old_libs=yes # Go through the arguments, transforming them on the way. while test "$#" -gt 0; do arg="$1" shift case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") qarg=\"`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`\" ### testsuite: skip nested quoting test ;; *) qarg=$arg ;; esac libtool_args="$libtool_args $qarg" # If the previous option needs an argument, assign it. if test -n "$prev"; then case $prev in output) compile_command="$compile_command @OUTPUT@" finalize_command="$finalize_command @OUTPUT@" ;; esac case $prev in dlfiles|dlprefiles) if test "$preload" = no; then # Add the symbol object into the linking commands. compile_command="$compile_command @SYMFILE@" finalize_command="$finalize_command @SYMFILE@" preload=yes fi case $arg in *.la | *.lo) ;; # We handle these cases below. force) if test "$dlself" = no; then dlself=needless export_dynamic=yes fi prev= continue ;; self) if test "$prev" = dlprefiles; then dlself=yes elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then dlself=yes else dlself=needless export_dynamic=yes fi prev= continue ;; *) if test "$prev" = dlfiles; then dlfiles="$dlfiles $arg" else dlprefiles="$dlprefiles $arg" fi prev= continue ;; esac ;; expsyms) export_symbols="$arg" if test ! -f "$arg"; then $echo "$modename: symbol file \`$arg' does not exist" exit $EXIT_FAILURE fi prev= continue ;; expsyms_regex) export_symbols_regex="$arg" prev= continue ;; inst_prefix) inst_prefix_dir="$arg" prev= continue ;; precious_regex) precious_files_regex="$arg" prev= continue ;; release) release="-$arg" prev= continue ;; objectlist) if test -f "$arg"; then save_arg=$arg moreargs= for fil in `cat $save_arg` do # moreargs="$moreargs $fil" arg=$fil # A libtool-controlled object. # Check to see that this really is a libtool object. if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then pic_object= non_pic_object= # Read the .lo file # If there is no directory component, then add one. case $arg in */* | *\\*) . $arg ;; *) . ./$arg ;; esac if test -z "$pic_object" || \ test -z "$non_pic_object" || test "$pic_object" = none && \ test "$non_pic_object" = none; then $echo "$modename: cannot find name of object for \`$arg'" 1>&2 exit $EXIT_FAILURE fi # Extract subdirectory from the argument. xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` if test "X$xdir" = "X$arg"; then xdir= else xdir="$xdir/" fi if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then dlfiles="$dlfiles $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. dlprefiles="$dlprefiles $pic_object" prev= fi # A PIC object. libobjs="$libobjs $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object non_pic_objects="$non_pic_objects $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi fi else # Only an error if not doing a dry-run. if test -z "$run"; then $echo "$modename: \`$arg' is not a valid libtool object" 1>&2 exit $EXIT_FAILURE else # Dry-run case. # Extract subdirectory from the argument. xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` if test "X$xdir" = "X$arg"; then xdir= else xdir="$xdir/" fi pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"` non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"` libobjs="$libobjs $pic_object" non_pic_objects="$non_pic_objects $non_pic_object" fi fi done else $echo "$modename: link input file \`$save_arg' does not exist" exit $EXIT_FAILURE fi arg=$save_arg prev= continue ;; rpath | xrpath) # We need an absolute path. case $arg in [\\/]* | [A-Za-z]:[\\/]*) ;; *) $echo "$modename: only absolute run-paths are allowed" 1>&2 exit $EXIT_FAILURE ;; esac if test "$prev" = rpath; then case "$rpath " in *" $arg "*) ;; *) rpath="$rpath $arg" ;; esac else case "$xrpath " in *" $arg "*) ;; *) xrpath="$xrpath $arg" ;; esac fi prev= continue ;; xcompiler) compiler_flags="$compiler_flags $qarg" prev= compile_command="$compile_command $qarg" finalize_command="$finalize_command $qarg" continue ;; xlinker) linker_flags="$linker_flags $qarg" compiler_flags="$compiler_flags $wl$qarg" prev= compile_command="$compile_command $wl$qarg" finalize_command="$finalize_command $wl$qarg" continue ;; xcclinker) linker_flags="$linker_flags $qarg" compiler_flags="$compiler_flags $qarg" prev= compile_command="$compile_command $qarg" finalize_command="$finalize_command $qarg" continue ;; shrext) shrext_cmds="$arg" prev= continue ;; *) eval "$prev=\"\$arg\"" prev= continue ;; esac fi # test -n "$prev" prevarg="$arg" case $arg in -all-static) if test -n "$link_static_flag"; then compile_command="$compile_command $link_static_flag" finalize_command="$finalize_command $link_static_flag" fi continue ;; -allow-undefined) # FIXME: remove this flag sometime in the future. $echo "$modename: \`-allow-undefined' is deprecated because it is the default" 1>&2 continue ;; -avoid-version) avoid_version=yes continue ;; -dlopen) prev=dlfiles continue ;; -dlpreopen) prev=dlprefiles continue ;; -export-dynamic) export_dynamic=yes continue ;; -export-symbols | -export-symbols-regex) if test -n "$export_symbols" || test -n "$export_symbols_regex"; then $echo "$modename: more than one -exported-symbols argument is not allowed" exit $EXIT_FAILURE fi if test "X$arg" = "X-export-symbols"; then prev=expsyms else prev=expsyms_regex fi continue ;; -inst-prefix-dir) prev=inst_prefix continue ;; # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* # so, if we see these flags be careful not to treat them like -L -L[A-Z][A-Z]*:*) case $with_gcc/$host in no/*-*-irix* | /*-*-irix*) compile_command="$compile_command $arg" finalize_command="$finalize_command $arg" ;; esac continue ;; -L*) dir=`$echo "X$arg" | $Xsed -e 's/^-L//'` # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) absdir=`cd "$dir" && pwd` if test -z "$absdir"; then $echo "$modename: cannot determine absolute directory name of \`$dir'" 1>&2 exit $EXIT_FAILURE fi dir="$absdir" ;; esac case "$deplibs " in *" -L$dir "*) ;; *) deplibs="$deplibs -L$dir" lib_search_path="$lib_search_path $dir" ;; esac case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) case :$dllsearchpath: in *":$dir:"*) ;; *) dllsearchpath="$dllsearchpath:$dir";; esac ;; esac continue ;; -l*) if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then case $host in *-*-cygwin* | *-*-pw32* | *-*-beos*) # These systems don't actually have a C or math library (as such) continue ;; *-*-mingw* | *-*-os2*) # These systems don't actually have a C library (as such) test "X$arg" = "X-lc" && continue ;; *-*-openbsd* | *-*-freebsd*) # Do not include libc due to us having libc/libc_r. test "X$arg" = "X-lc" && continue ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C and math libraries are in the System framework deplibs="$deplibs -framework System" continue esac elif test "X$arg" = "X-lc_r"; then case $host in *-*-openbsd* | *-*-freebsd4*) # Do not include libc_r directly, use -pthread flag. continue ;; esac fi deplibs="$deplibs $arg" continue ;; -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe) deplibs="$deplibs $arg" continue ;; -module) module=yes case $host in *-*-freebsd*) # Do not build the useless static library build_old_libs=no ;; esac continue ;; # gcc -m* arguments should be passed to the linker via $compiler_flags # in order to pass architecture information to the linker # (e.g. 32 vs 64-bit). This may also be accomplished via -Wl,-mfoo # but this is not reliable with gcc because gcc may use -mfoo to # select a different linker, different libraries, etc, while # -Wl,-mfoo simply passes -mfoo to the linker. -m*) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") arg="\"$arg\"" ;; esac compile_command="$compile_command $arg" finalize_command="$finalize_command $arg" if test "$with_gcc" = "yes" ; then compiler_flags="$compiler_flags $arg" fi continue ;; -shrext) prev=shrext continue ;; -no-fast-install) fast_install=no continue ;; -no-install) case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) # The PATH hackery in wrapper scripts is required on Windows # in order for the loader to find any dlls it needs. $echo "$modename: warning: \`-no-install' is ignored for $host" 1>&2 $echo "$modename: warning: assuming \`-no-fast-install' instead" 1>&2 fast_install=no ;; *) no_install=yes ;; esac continue ;; -no-undefined) allow_undefined=no continue ;; -objectlist) prev=objectlist continue ;; -o) prev=output ;; -precious-files-regex) prev=precious_regex continue ;; -release) prev=release continue ;; -rpath) prev=rpath continue ;; -R) prev=xrpath continue ;; -R*) dir=`$echo "X$arg" | $Xsed -e 's/^-R//'` # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) $echo "$modename: only absolute run-paths are allowed" 1>&2 exit $EXIT_FAILURE ;; esac case "$xrpath " in *" $dir "*) ;; *) xrpath="$xrpath $dir" ;; esac continue ;; -static) # The effects of -static are defined in a previous loop. # We used to do the same as -all-static on platforms that # didn't have a PIC flag, but the assumption that the effects # would be equivalent was wrong. It would break on at least # Digital Unix and AIX. continue ;; -thread-safe) thread_safe=yes continue ;; -version-info) prev=vinfo continue ;; -version-number) prev=vinfo vinfo_number=yes continue ;; -Wc,*) args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wc,//'` arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" case $flag in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") flag="\"$flag\"" ;; esac arg="$arg $wl$flag" compiler_flags="$compiler_flags $flag" done IFS="$save_ifs" arg=`$echo "X$arg" | $Xsed -e "s/^ //"` ;; -Wl,*) args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wl,//'` arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" case $flag in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") flag="\"$flag\"" ;; esac arg="$arg $wl$flag" compiler_flags="$compiler_flags $wl$flag" linker_flags="$linker_flags $flag" done IFS="$save_ifs" arg=`$echo "X$arg" | $Xsed -e "s/^ //"` ;; -Xcompiler) prev=xcompiler continue ;; -Xlinker) prev=xlinker continue ;; -XCClinker) prev=xcclinker continue ;; # Some other compiler flag. -* | +*) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") arg="\"$arg\"" ;; esac ;; *.$objext) # A standard object. objs="$objs $arg" ;; *.lo) # A libtool-controlled object. # Check to see that this really is a libtool object. if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then pic_object= non_pic_object= # Read the .lo file # If there is no directory component, then add one. case $arg in */* | *\\*) . $arg ;; *) . ./$arg ;; esac if test -z "$pic_object" || \ test -z "$non_pic_object" || test "$pic_object" = none && \ test "$non_pic_object" = none; then $echo "$modename: cannot find name of object for \`$arg'" 1>&2 exit $EXIT_FAILURE fi # Extract subdirectory from the argument. xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` if test "X$xdir" = "X$arg"; then xdir= else xdir="$xdir/" fi if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then dlfiles="$dlfiles $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. dlprefiles="$dlprefiles $pic_object" prev= fi # A PIC object. libobjs="$libobjs $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object non_pic_objects="$non_pic_objects $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi fi else # Only an error if not doing a dry-run. if test -z "$run"; then $echo "$modename: \`$arg' is not a valid libtool object" 1>&2 exit $EXIT_FAILURE else # Dry-run case. # Extract subdirectory from the argument. xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` if test "X$xdir" = "X$arg"; then xdir= else xdir="$xdir/" fi pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"` non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"` libobjs="$libobjs $pic_object" non_pic_objects="$non_pic_objects $non_pic_object" fi fi ;; *.$libext) # An archive. deplibs="$deplibs $arg" old_deplibs="$old_deplibs $arg" continue ;; *.la) # A libtool-controlled library. if test "$prev" = dlfiles; then # This library was specified with -dlopen. dlfiles="$dlfiles $arg" prev= elif test "$prev" = dlprefiles; then # The library was specified with -dlpreopen. dlprefiles="$dlprefiles $arg" prev= else deplibs="$deplibs $arg" fi continue ;; # Some other compiler argument. *) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") arg="\"$arg\"" ;; esac ;; esac # arg # Now actually substitute the argument into the commands. if test -n "$arg"; then compile_command="$compile_command $arg" finalize_command="$finalize_command $arg" fi done # argument parsing loop if test -n "$prev"; then $echo "$modename: the \`$prevarg' option requires an argument" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then eval arg=\"$export_dynamic_flag_spec\" compile_command="$compile_command $arg" finalize_command="$finalize_command $arg" fi oldlibs= # calculate the name of the file, without its directory outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'` libobjs_save="$libobjs" if test -n "$shlibpath_var"; then # get the directories listed in $shlibpath_var eval shlib_search_path=\`\$echo \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\` else shlib_search_path= fi eval sys_lib_search_path=\"$sys_lib_search_path_spec\" eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'` if test "X$output_objdir" = "X$output"; then output_objdir="$objdir" else output_objdir="$output_objdir/$objdir" fi # Create the object directory. if test ! -d "$output_objdir"; then $show "$mkdir $output_objdir" $run $mkdir $output_objdir status=$? if test "$status" -ne 0 && test ! -d "$output_objdir"; then exit $status fi fi # Determine the type of output case $output in "") $echo "$modename: you must specify an output file" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE ;; *.$libext) linkmode=oldlib ;; *.lo | *.$objext) linkmode=obj ;; *.la) linkmode=lib ;; *) linkmode=prog ;; # Anything else should be a program. esac case $host in *cygwin* | *mingw* | *pw32*) # don't eliminate duplications in $postdeps and $predeps duplicate_compiler_generated_deps=yes ;; *) duplicate_compiler_generated_deps=$duplicate_deps ;; esac specialdeplibs= libs= # Find all interdependent deplibs by searching for libraries # that are linked more than once (e.g. -la -lb -la) for deplib in $deplibs; do if test "X$duplicate_deps" = "Xyes" ; then case "$libs " in *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; esac fi libs="$libs $deplib" done if test "$linkmode" = lib; then libs="$predeps $libs $compiler_lib_search_path $postdeps" # Compute libraries that are listed more than once in $predeps # $postdeps and mark them as special (i.e., whose duplicates are # not to be eliminated). pre_post_deps= if test "X$duplicate_compiler_generated_deps" = "Xyes" ; then for pre_post_dep in $predeps $postdeps; do case "$pre_post_deps " in *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;; esac pre_post_deps="$pre_post_deps $pre_post_dep" done fi pre_post_deps= fi deplibs= newdependency_libs= newlib_search_path= need_relink=no # whether we're linking any uninstalled libtool libraries notinst_deplibs= # not-installed libtool libraries notinst_path= # paths that contain not-installed libtool libraries case $linkmode in lib) passes="conv link" for file in $dlfiles $dlprefiles; do case $file in *.la) ;; *) $echo "$modename: libraries can \`-dlopen' only libtool libraries: $file" 1>&2 exit $EXIT_FAILURE ;; esac done ;; prog) compile_deplibs= finalize_deplibs= alldeplibs=no newdlfiles= newdlprefiles= passes="conv scan dlopen dlpreopen link" ;; *) passes="conv" ;; esac for pass in $passes; do if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan"; then libs="$deplibs" deplibs= fi if test "$linkmode" = prog; then case $pass in dlopen) libs="$dlfiles" ;; dlpreopen) libs="$dlprefiles" ;; link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; esac fi if test "$pass" = dlopen; then # Collect dlpreopened libraries save_deplibs="$deplibs" deplibs= fi for deplib in $libs; do lib= found=no case $deplib in -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue ;; -l*) if test "$linkmode" != lib && test "$linkmode" != prog; then $echo "$modename: warning: \`-l' is ignored for archives/objects" 1>&2 continue fi if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi name=`$echo "X$deplib" | $Xsed -e 's/^-l//'` for searchdir in $newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path; do for search_ext in .la $std_shrext .so .a; do # Search the libtool library lib="$searchdir/lib${name}${search_ext}" if test -f "$lib"; then if test "$search_ext" = ".la"; then found=yes else found=no fi break 2 fi done done if test "$found" != yes; then # deplib doesn't seem to be a libtool library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue else # deplib is a libtool library # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, # We need to do some special things here, and not later. if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $deplib "*) if (${SED} -e '2q' $lib | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then library_names= old_library= case $lib in */* | *\\*) . $lib ;; *) . ./$lib ;; esac for l in $old_library $library_names; do ll="$l" done if test "X$ll" = "X$old_library" ; then # only static version available found=no ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` test "X$ladir" = "X$lib" && ladir="." lib=$ladir/$old_library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue fi fi ;; *) ;; esac fi fi ;; # -l -L*) case $linkmode in lib) deplibs="$deplib $deplibs" test "$pass" = conv && continue newdependency_libs="$deplib $newdependency_libs" newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` ;; prog) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi if test "$pass" = scan; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` ;; *) $echo "$modename: warning: \`-L' is ignored for archives/objects" 1>&2 ;; esac # linkmode continue ;; # -L -R*) if test "$pass" = link; then dir=`$echo "X$deplib" | $Xsed -e 's/^-R//'` # Make sure the xrpath contains only unique directories. case "$xrpath " in *" $dir "*) ;; *) xrpath="$xrpath $dir" ;; esac fi deplibs="$deplib $deplibs" continue ;; *.la) lib="$deplib" ;; *.$libext) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi case $linkmode in lib) valid_a_lib=no case $deplibs_check_method in match_pattern*) set dummy $deplibs_check_method match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"` if eval $echo \"$deplib\" 2>/dev/null \ | $SED 10q \ | $EGREP "$match_pattern_regex" > /dev/null; then valid_a_lib=yes fi ;; pass_all) valid_a_lib=yes ;; esac if test "$valid_a_lib" != yes; then $echo $echo "*** Warning: Trying to link with static lib archive $deplib." $echo "*** I have the capability to make that library automatically link in when" $echo "*** you link to this library. But I can only do this if you have a" $echo "*** shared version of the library, which you do not appear to have" $echo "*** because the file extensions .$libext of this argument makes me believe" $echo "*** that it is just a static archive that I should not used here." else $echo $echo "*** Warning: Linking the shared library $output against the" $echo "*** static library $deplib is not portable!" deplibs="$deplib $deplibs" fi continue ;; prog) if test "$pass" != link; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi continue ;; esac # linkmode ;; # *.$libext *.lo | *.$objext) if test "$pass" = conv; then deplibs="$deplib $deplibs" elif test "$linkmode" = prog; then if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlopen support or we're linking statically, # we need to preload. newdlprefiles="$newdlprefiles $deplib" compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else newdlfiles="$newdlfiles $deplib" fi fi continue ;; %DEPLIBS%) alldeplibs=yes continue ;; esac # case $deplib if test "$found" = yes || test -f "$lib"; then : else $echo "$modename: cannot find the library \`$lib'" 1>&2 exit $EXIT_FAILURE fi # Check to see that this really is a libtool archive. if (${SED} -e '2q' $lib | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : else $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 exit $EXIT_FAILURE fi ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` test "X$ladir" = "X$lib" && ladir="." dlname= dlopen= dlpreopen= libdir= library_names= old_library= # If the library was installed with an old release of libtool, # it will not redefine variables installed, or shouldnotlink installed=yes shouldnotlink=no # Read the .la file case $lib in */* | *\\*) . $lib ;; *) . ./$lib ;; esac if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan" || { test "$linkmode" != prog && test "$linkmode" != lib; }; then test -n "$dlopen" && dlfiles="$dlfiles $dlopen" test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen" fi if test "$pass" = conv; then # Only check for convenience libraries deplibs="$lib $deplibs" if test -z "$libdir"; then if test -z "$old_library"; then $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 exit $EXIT_FAILURE fi # It is a libtool convenience library, so add in its objects. convenience="$convenience $ladir/$objdir/$old_library" old_convenience="$old_convenience $ladir/$objdir/$old_library" tmp_libs= for deplib in $dependency_libs; do deplibs="$deplib $deplibs" if test "X$duplicate_deps" = "Xyes" ; then case "$tmp_libs " in *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; esac fi tmp_libs="$tmp_libs $deplib" done elif test "$linkmode" != prog && test "$linkmode" != lib; then $echo "$modename: \`$lib' is not a convenience library" 1>&2 exit $EXIT_FAILURE fi continue fi # $pass = conv # Get the name of the library we link against. linklib= for l in $old_library $library_names; do linklib="$l" done if test -z "$linklib"; then $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 exit $EXIT_FAILURE fi # This library was specified with -dlopen. if test "$pass" = dlopen; then if test -z "$libdir"; then $echo "$modename: cannot -dlopen a convenience library: \`$lib'" 1>&2 exit $EXIT_FAILURE fi if test -z "$dlname" || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlname, no dlopen support or we're linking # statically, we need to preload. We also need to preload any # dependent libraries so libltdl's deplib preloader doesn't # bomb out in the load deplibs phase. dlprefiles="$dlprefiles $lib $dependency_libs" else newdlfiles="$newdlfiles $lib" fi continue fi # $pass = dlopen # We need an absolute path. case $ladir in [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; *) abs_ladir=`cd "$ladir" && pwd` if test -z "$abs_ladir"; then $echo "$modename: warning: cannot determine absolute directory name of \`$ladir'" 1>&2 $echo "$modename: passing it literally to the linker, although it might fail" 1>&2 abs_ladir="$ladir" fi ;; esac laname=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` # Find the relevant object directory and library name. if test "X$installed" = Xyes; then if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then $echo "$modename: warning: library \`$lib' was moved." 1>&2 dir="$ladir" absdir="$abs_ladir" libdir="$abs_ladir" else dir="$libdir" absdir="$libdir" fi else if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then dir="$ladir" absdir="$abs_ladir" # Remove this search path later notinst_path="$notinst_path $abs_ladir" else dir="$ladir/$objdir" absdir="$abs_ladir/$objdir" # Remove this search path later notinst_path="$notinst_path $abs_ladir" fi fi # $installed = yes name=`$echo "X$laname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` # This library was specified with -dlpreopen. if test "$pass" = dlpreopen; then if test -z "$libdir"; then $echo "$modename: cannot -dlpreopen a convenience library: \`$lib'" 1>&2 exit $EXIT_FAILURE fi # Prefer using a static library (so that no silly _DYNAMIC symbols # are required to link). if test -n "$old_library"; then newdlprefiles="$newdlprefiles $dir/$old_library" # Otherwise, use the dlname, so that lt_dlopen finds it. elif test -n "$dlname"; then newdlprefiles="$newdlprefiles $dir/$dlname" else newdlprefiles="$newdlprefiles $dir/$linklib" fi fi # $pass = dlpreopen if test -z "$libdir"; then # Link the convenience library if test "$linkmode" = lib; then deplibs="$dir/$old_library $deplibs" elif test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$dir/$old_library $compile_deplibs" finalize_deplibs="$dir/$old_library $finalize_deplibs" else deplibs="$lib $deplibs" # used for prog,scan pass fi continue fi if test "$linkmode" = prog && test "$pass" != link; then newlib_search_path="$newlib_search_path $ladir" deplibs="$lib $deplibs" linkalldeplibs=no if test "$link_all_deplibs" != no || test -z "$library_names" || test "$build_libtool_libs" = no; then linkalldeplibs=yes fi tmp_libs= for deplib in $dependency_libs; do case $deplib in -L*) newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`;; ### testsuite: skip nested quoting test esac # Need to link against all dependency_libs? if test "$linkalldeplibs" = yes; then deplibs="$deplib $deplibs" else # Need to hardcode shared library paths # or/and link against static libraries newdependency_libs="$deplib $newdependency_libs" fi if test "X$duplicate_deps" = "Xyes" ; then case "$tmp_libs " in *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; esac fi tmp_libs="$tmp_libs $deplib" done # for deplib continue fi # $linkmode = prog... if test "$linkmode,$pass" = "prog,link"; then if test -n "$library_names" && { test "$prefer_static_libs" = no || test -z "$old_library"; }; then # We need to hardcode the library path if test -n "$shlibpath_var"; then # Make sure the rpath contains only unique directories. case "$temp_rpath " in *" $dir "*) ;; *" $absdir "*) ;; *) temp_rpath="$temp_rpath $dir" ;; esac fi # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) compile_rpath="$compile_rpath $absdir" esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) finalize_rpath="$finalize_rpath $libdir" esac ;; esac fi # $linkmode,$pass = prog,link... if test "$alldeplibs" = yes && { test "$deplibs_check_method" = pass_all || { test "$build_libtool_libs" = yes && test -n "$library_names"; }; }; then # We only need to search for static libraries continue fi fi link_static=no # Whether the deplib will be linked statically if test -n "$library_names" && { test "$prefer_static_libs" = no || test -z "$old_library"; }; then if test "$installed" = no; then notinst_deplibs="$notinst_deplibs $lib" need_relink=yes fi # This is a shared library # Warn about portability, can't link against -module's on # some systems (darwin) if test "$shouldnotlink" = yes && test "$pass" = link ; then $echo if test "$linkmode" = prog; then $echo "*** Warning: Linking the executable $output against the loadable module" else $echo "*** Warning: Linking the shared library $output against the loadable module" fi $echo "*** $linklib is not portable!" fi if test "$linkmode" = lib && test "$hardcode_into_libs" = yes; then # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) compile_rpath="$compile_rpath $absdir" esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) finalize_rpath="$finalize_rpath $libdir" esac ;; esac fi if test -n "$old_archive_from_expsyms_cmds"; then # figure out the soname set dummy $library_names realname="$2" shift; shift libname=`eval \\$echo \"$libname_spec\"` # use dlname if we got it. it's perfectly good, no? if test -n "$dlname"; then soname="$dlname" elif test -n "$soname_spec"; then # bleh windows case $host in *cygwin* | mingw*) major=`expr $current - $age` versuffix="-$major" ;; esac eval soname=\"$soname_spec\" else soname="$realname" fi # Make a new name for the extract_expsyms_cmds to use soroot="$soname" soname=`$echo $soroot | ${SED} -e 's/^.*\///'` newlib="libimp-`$echo $soname | ${SED} 's/^lib//;s/\.dll$//'`.a" # If the library has no export list, then create one now if test -f "$output_objdir/$soname-def"; then : else $show "extracting exported symbol list from \`$soname'" save_ifs="$IFS"; IFS='~' cmds=$extract_expsyms_cmds for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" fi # Create $newlib if test -f "$output_objdir/$newlib"; then :; else $show "generating import library for \`$soname'" save_ifs="$IFS"; IFS='~' cmds=$old_archive_from_expsyms_cmds for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" fi # make sure the library variables are pointing to the new library dir=$output_objdir linklib=$newlib fi # test -n "$old_archive_from_expsyms_cmds" if test "$linkmode" = prog || test "$mode" != relink; then add_shlibpath= add_dir= add= lib_linked=yes case $hardcode_action in immediate | unsupported) if test "$hardcode_direct" = no; then add="$dir/$linklib" case $host in *-*-sco3.2v5* ) add_dir="-L$dir" ;; *-*-darwin* ) # if the lib is a module then we can not link against # it, someone is ignoring the new warnings I added if /usr/bin/file -L $add 2> /dev/null | $EGREP "bundle" >/dev/null ; then $echo "** Warning, lib $linklib is a module, not a shared library" if test -z "$old_library" ; then $echo $echo "** And there doesn't seem to be a static archive available" $echo "** The link will probably fail, sorry" else add="$dir/$old_library" fi fi esac elif test "$hardcode_minus_L" = no; then case $host in *-*-sunos*) add_shlibpath="$dir" ;; esac add_dir="-L$dir" add="-l$name" elif test "$hardcode_shlibpath_var" = no; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; relink) if test "$hardcode_direct" = yes; then add="$dir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$dir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case "$libdir" in [\\/]*) add_dir="$add_dir -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; *) lib_linked=no ;; esac if test "$lib_linked" != yes; then $echo "$modename: configuration error: unsupported hardcode properties" exit $EXIT_FAILURE fi if test -n "$add_shlibpath"; then case :$compile_shlibpath: in *":$add_shlibpath:"*) ;; *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;; esac fi if test "$linkmode" = prog; then test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" test -n "$add" && compile_deplibs="$add $compile_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" if test "$hardcode_direct" != yes && \ test "$hardcode_minus_L" != yes && \ test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; esac fi fi fi if test "$linkmode" = prog || test "$mode" = relink; then add_shlibpath= add_dir= add= # Finalize command for both is simple: just hardcode it. if test "$hardcode_direct" = yes; then add="$libdir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$libdir" add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; esac add="-l$name" elif test "$hardcode_automatic" = yes; then if test -n "$inst_prefix_dir" && test -f "$inst_prefix_dir$libdir/$linklib" ; then add="$inst_prefix_dir$libdir/$linklib" else add="$libdir/$linklib" fi else # We cannot seem to hardcode it, guess we'll fake it. add_dir="-L$libdir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case "$libdir" in [\\/]*) add_dir="$add_dir -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" fi if test "$linkmode" = prog; then test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" test -n "$add" && finalize_deplibs="$add $finalize_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" fi fi elif test "$linkmode" = prog; then # Here we assume that one of hardcode_direct or hardcode_minus_L # is not unsupported. This is valid on all known static and # shared platforms. if test "$hardcode_direct" != unsupported; then test -n "$old_library" && linklib="$old_library" compile_deplibs="$dir/$linklib $compile_deplibs" finalize_deplibs="$dir/$linklib $finalize_deplibs" else compile_deplibs="-l$name -L$dir $compile_deplibs" finalize_deplibs="-l$name -L$dir $finalize_deplibs" fi elif test "$build_libtool_libs" = yes; then # Not a shared library if test "$deplibs_check_method" != pass_all; then # We're trying link a shared library against a static one # but the system doesn't support it. # Just print a warning and add the library to dependency_libs so # that the program can be linked against the static library. $echo $echo "*** Warning: This system can not link to static lib archive $lib." $echo "*** I have the capability to make that library automatically link in when" $echo "*** you link to this library. But I can only do this if you have a" $echo "*** shared version of the library, which you do not appear to have." if test "$module" = yes; then $echo "*** But as you try to build a module library, libtool will still create " $echo "*** a static module, that should work as long as the dlopening application" $echo "*** is linked with the -dlopen flag to resolve symbols at runtime." if test -z "$global_symbol_pipe"; then $echo $echo "*** However, this would only work if libtool was able to extract symbol" $echo "*** lists from a program, using \`nm' or equivalent, but libtool could" $echo "*** not find such a program. So, this module is probably useless." $echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi else convenience="$convenience $dir/$old_library" old_convenience="$old_convenience $dir/$old_library" deplibs="$dir/$old_library $deplibs" link_static=yes fi fi # link shared/static library? if test "$linkmode" = lib; then if test -n "$dependency_libs" && { test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes || test "$link_static" = yes; }; then # Extract -R from dependency_libs temp_deplibs= for libdir in $dependency_libs; do case $libdir in -R*) temp_xrpath=`$echo "X$libdir" | $Xsed -e 's/^-R//'` case " $xrpath " in *" $temp_xrpath "*) ;; *) xrpath="$xrpath $temp_xrpath";; esac;; *) temp_deplibs="$temp_deplibs $libdir";; esac done dependency_libs="$temp_deplibs" fi newlib_search_path="$newlib_search_path $absdir" # Link against this library test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" # ... and its dependency_libs tmp_libs= for deplib in $dependency_libs; do newdependency_libs="$deplib $newdependency_libs" if test "X$duplicate_deps" = "Xyes" ; then case "$tmp_libs " in *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; esac fi tmp_libs="$tmp_libs $deplib" done if test "$link_all_deplibs" != no; then # Add the search paths of all dependency libraries for deplib in $dependency_libs; do case $deplib in -L*) path="$deplib" ;; *.la) dir=`$echo "X$deplib" | $Xsed -e 's%/[^/]*$%%'` test "X$dir" = "X$deplib" && dir="." # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; *) absdir=`cd "$dir" && pwd` if test -z "$absdir"; then $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2 absdir="$dir" fi ;; esac if grep "^installed=no" $deplib > /dev/null; then path="$absdir/$objdir" else eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` if test -z "$libdir"; then $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 exit $EXIT_FAILURE fi if test "$absdir" != "$libdir"; then $echo "$modename: warning: \`$deplib' seems to be moved" 1>&2 fi path="$absdir" fi depdepl= case $host in *-*-darwin*) # we do not want to link against static libs, # but need to link against shared eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` if test -n "$deplibrary_names" ; then for tmp in $deplibrary_names ; do depdepl=$tmp done if test -f "$path/$depdepl" ; then depdepl="$path/$depdepl" fi # do not add paths which are already there case " $newlib_search_path " in *" $path "*) ;; *) newlib_search_path="$newlib_search_path $path";; esac fi path="" ;; *) path="-L$path" ;; esac ;; -l*) case $host in *-*-darwin*) # Again, we only want to link against shared libraries eval tmp_libs=`$echo "X$deplib" | $Xsed -e "s,^\-l,,"` for tmp in $newlib_search_path ; do if test -f "$tmp/lib$tmp_libs.dylib" ; then eval depdepl="$tmp/lib$tmp_libs.dylib" break fi done path="" ;; *) continue ;; esac ;; *) continue ;; esac case " $deplibs " in *" $depdepl "*) ;; *) deplibs="$depdepl $deplibs" ;; esac case " $deplibs " in *" $path "*) ;; *) deplibs="$deplibs $path" ;; esac done fi # link_all_deplibs != no fi # linkmode = lib done # for deplib in $libs dependency_libs="$newdependency_libs" if test "$pass" = dlpreopen; then # Link the dlpreopened libraries before other libraries for deplib in $save_deplibs; do deplibs="$deplib $deplibs" done fi if test "$pass" != dlopen; then if test "$pass" != conv; then # Make sure lib_search_path contains only unique directories. lib_search_path= for dir in $newlib_search_path; do case "$lib_search_path " in *" $dir "*) ;; *) lib_search_path="$lib_search_path $dir" ;; esac done newlib_search_path= fi if test "$linkmode,$pass" != "prog,link"; then vars="deplibs" else vars="compile_deplibs finalize_deplibs" fi for var in $vars dependency_libs; do # Add libraries to $var in reverse order eval tmp_libs=\"\$$var\" new_libs= for deplib in $tmp_libs; do # FIXME: Pedantically, this is the right thing to do, so # that some nasty dependency loop isn't accidentally # broken: #new_libs="$deplib $new_libs" # Pragmatically, this seems to cause very few problems in # practice: case $deplib in -L*) new_libs="$deplib $new_libs" ;; -R*) ;; *) # And here is the reason: when a library appears more # than once as an explicit dependence of a library, or # is implicitly linked in more than once by the # compiler, it is considered special, and multiple # occurrences thereof are not removed. Compare this # with having the same library being listed as a # dependency of multiple other libraries: in this case, # we know (pedantically, we assume) the library does not # need to be listed more than once, so we keep only the # last copy. This is not always right, but it is rare # enough that we require users that really mean to play # such unportable linking tricks to link the library # using -Wl,-lname, so that libtool does not consider it # for duplicate removal. case " $specialdeplibs " in *" $deplib "*) new_libs="$deplib $new_libs" ;; *) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$deplib $new_libs" ;; esac ;; esac ;; esac done tmp_libs= for deplib in $new_libs; do case $deplib in -L*) case " $tmp_libs " in *" $deplib "*) ;; *) tmp_libs="$tmp_libs $deplib" ;; esac ;; *) tmp_libs="$tmp_libs $deplib" ;; esac done eval $var=\"$tmp_libs\" done # for var fi # Last step: remove runtime libs from dependency_libs # (they stay in deplibs) tmp_libs= for i in $dependency_libs ; do case " $predeps $postdeps $compiler_lib_search_path " in *" $i "*) i="" ;; esac if test -n "$i" ; then tmp_libs="$tmp_libs $i" fi done dependency_libs=$tmp_libs done # for pass if test "$linkmode" = prog; then dlfiles="$newdlfiles" dlprefiles="$newdlprefiles" fi case $linkmode in oldlib) if test -n "$deplibs"; then $echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2 fi if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then $echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2 fi if test -n "$rpath"; then $echo "$modename: warning: \`-rpath' is ignored for archives" 1>&2 fi if test -n "$xrpath"; then $echo "$modename: warning: \`-R' is ignored for archives" 1>&2 fi if test -n "$vinfo"; then $echo "$modename: warning: \`-version-info/-version-number' is ignored for archives" 1>&2 fi if test -n "$release"; then $echo "$modename: warning: \`-release' is ignored for archives" 1>&2 fi if test -n "$export_symbols" || test -n "$export_symbols_regex"; then $echo "$modename: warning: \`-export-symbols' is ignored for archives" 1>&2 fi # Now set the variables for building old libraries. build_libtool_libs=no oldlibs="$output" objs="$objs$old_deplibs" ;; lib) # Make sure we only generate libraries of the form `libNAME.la'. case $outputname in lib*) name=`$echo "X$outputname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" ;; *) if test "$module" = no; then $echo "$modename: libtool library \`$output' must begin with \`lib'" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi if test "$need_lib_prefix" != no; then # Add the "lib" prefix for modules if required name=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" else libname=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` fi ;; esac if test -n "$objs"; then if test "$deplibs_check_method" != pass_all; then $echo "$modename: cannot build libtool library \`$output' from non-libtool objects on this host:$objs" 2>&1 exit $EXIT_FAILURE else $echo $echo "*** Warning: Linking the shared library $output against the non-libtool" $echo "*** objects $objs is not portable!" libobjs="$libobjs $objs" fi fi if test "$dlself" != no; then $echo "$modename: warning: \`-dlopen self' is ignored for libtool libraries" 1>&2 fi set dummy $rpath if test "$#" -gt 2; then $echo "$modename: warning: ignoring multiple \`-rpath's for a libtool library" 1>&2 fi install_libdir="$2" oldlibs= if test -z "$rpath"; then if test "$build_libtool_libs" = yes; then # Building a libtool convenience library. # Some compilers have problems with a `.al' extension so # convenience libraries should have the same extension an # archive normally would. oldlibs="$output_objdir/$libname.$libext $oldlibs" build_libtool_libs=convenience build_old_libs=yes fi if test -n "$vinfo"; then $echo "$modename: warning: \`-version-info/-version-number' is ignored for convenience libraries" 1>&2 fi if test -n "$release"; then $echo "$modename: warning: \`-release' is ignored for convenience libraries" 1>&2 fi else # Parse the version information argument. save_ifs="$IFS"; IFS=':' set dummy $vinfo 0 0 0 IFS="$save_ifs" if test -n "$8"; then $echo "$modename: too many parameters to \`-version-info'" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi # convert absolute version numbers to libtool ages # this retains compatibility with .la files and attempts # to make the code below a bit more comprehensible case $vinfo_number in yes) number_major="$2" number_minor="$3" number_revision="$4" # # There are really only two kinds -- those that # use the current revision as the major version # and those that subtract age and use age as # a minor version. But, then there is irix # which has an extra 1 added just for fun # case $version_type in darwin|linux|osf|windows) current=`expr $number_major + $number_minor` age="$number_minor" revision="$number_revision" ;; freebsd-aout|freebsd-elf|sunos) current="$number_major" revision="$number_minor" age="0" ;; irix|nonstopux) current=`expr $number_major + $number_minor - 1` age="$number_minor" revision="$number_minor" ;; esac ;; no) current="$2" revision="$3" age="$4" ;; esac # Check that each of the things are valid numbers. case $current in 0 | [1-9] | [1-9][0-9] | [1-9][0-9][0-9]) ;; *) $echo "$modename: CURRENT \`$current' is not a nonnegative integer" 1>&2 $echo "$modename: \`$vinfo' is not valid version information" 1>&2 exit $EXIT_FAILURE ;; esac case $revision in 0 | [1-9] | [1-9][0-9] | [1-9][0-9][0-9]) ;; *) $echo "$modename: REVISION \`$revision' is not a nonnegative integer" 1>&2 $echo "$modename: \`$vinfo' is not valid version information" 1>&2 exit $EXIT_FAILURE ;; esac case $age in 0 | [1-9] | [1-9][0-9] | [1-9][0-9][0-9]) ;; *) $echo "$modename: AGE \`$age' is not a nonnegative integer" 1>&2 $echo "$modename: \`$vinfo' is not valid version information" 1>&2 exit $EXIT_FAILURE ;; esac if test "$age" -gt "$current"; then $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2 $echo "$modename: \`$vinfo' is not valid version information" 1>&2 exit $EXIT_FAILURE fi # Calculate the version variables. major= versuffix= verstring= case $version_type in none) ;; darwin) # Like Linux, but with the current version available in # verstring for coding it into the library header major=.`expr $current - $age` versuffix="$major.$age.$revision" # Darwin ld doesn't like 0 for these options... minor_current=`expr $current + 1` verstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" ;; freebsd-aout) major=".$current" versuffix=".$current.$revision"; ;; freebsd-elf) major=".$current" versuffix=".$current"; ;; irix | nonstopux) major=`expr $current - $age + 1` case $version_type in nonstopux) verstring_prefix=nonstopux ;; *) verstring_prefix=sgi ;; esac verstring="$verstring_prefix$major.$revision" # Add in all the interfaces that we are compatible with. loop=$revision while test "$loop" -ne 0; do iface=`expr $revision - $loop` loop=`expr $loop - 1` verstring="$verstring_prefix$major.$iface:$verstring" done # Before this point, $major must not contain `.'. major=.$major versuffix="$major.$revision" ;; linux) major=.`expr $current - $age` versuffix="$major.$age.$revision" ;; osf) major=.`expr $current - $age` versuffix=".$current.$age.$revision" verstring="$current.$age.$revision" # Add in all the interfaces that we are compatible with. loop=$age while test "$loop" -ne 0; do iface=`expr $current - $loop` loop=`expr $loop - 1` verstring="$verstring:${iface}.0" done # Make executables depend on our current version. verstring="$verstring:${current}.0" ;; sunos) major=".$current" versuffix=".$current.$revision" ;; windows) # Use '-' rather than '.', since we only want one # extension on DOS 8.3 filesystems. major=`expr $current - $age` versuffix="-$major" ;; *) $echo "$modename: unknown library version type \`$version_type'" 1>&2 $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 exit $EXIT_FAILURE ;; esac # Clear the version info if we defaulted, and they specified a release. if test -z "$vinfo" && test -n "$release"; then major= case $version_type in darwin) # we can't check for "0.0" in archive_cmds due to quoting # problems, so we reset it completely verstring= ;; *) verstring="0.0" ;; esac if test "$need_version" = no; then versuffix= else versuffix=".0.0" fi fi # Remove version info from name if versioning should be avoided if test "$avoid_version" = yes && test "$need_version" = no; then major= versuffix= verstring="" fi # Check to see if the archive will have undefined symbols. if test "$allow_undefined" = yes; then if test "$allow_undefined_flag" = unsupported; then $echo "$modename: warning: undefined symbols not allowed in $host shared libraries" 1>&2 build_libtool_libs=no build_old_libs=yes fi else # Don't allow undefined symbols. allow_undefined_flag="$no_undefined_flag" fi fi if test "$mode" != relink; then # Remove our outputs, but don't remove object files since they # may have been created when compiling PIC objects. removelist= tempremovelist=`$echo "$output_objdir/*"` for p in $tempremovelist; do case $p in *.$objext) ;; $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) if test "X$precious_files_regex" != "X"; then if echo $p | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 then continue fi fi removelist="$removelist $p" ;; *) ;; esac done if test -n "$removelist"; then $show "${rm}r $removelist" $run ${rm}r $removelist fi fi # Now set the variables for building old libraries. if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then oldlibs="$oldlibs $output_objdir/$libname.$libext" # Transform .lo files to .o files. oldobjs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP` fi # Eliminate all temporary directories. for path in $notinst_path; do lib_search_path=`$echo "$lib_search_path " | ${SED} -e 's% $path % %g'` deplibs=`$echo "$deplibs " | ${SED} -e 's% -L$path % %g'` dependency_libs=`$echo "$dependency_libs " | ${SED} -e 's% -L$path % %g'` done if test -n "$xrpath"; then # If the user specified any rpath flags, then add them. temp_xrpath= for libdir in $xrpath; do temp_xrpath="$temp_xrpath -R$libdir" case "$finalize_rpath " in *" $libdir "*) ;; *) finalize_rpath="$finalize_rpath $libdir" ;; esac done if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then dependency_libs="$temp_xrpath $dependency_libs" fi fi # Make sure dlfiles contains only unique files that won't be dlpreopened old_dlfiles="$dlfiles" dlfiles= for lib in $old_dlfiles; do case " $dlprefiles $dlfiles " in *" $lib "*) ;; *) dlfiles="$dlfiles $lib" ;; esac done # Make sure dlprefiles contains only unique files old_dlprefiles="$dlprefiles" dlprefiles= for lib in $old_dlprefiles; do case "$dlprefiles " in *" $lib "*) ;; *) dlprefiles="$dlprefiles $lib" ;; esac done if test "$build_libtool_libs" = yes; then if test -n "$rpath"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos*) # these systems don't actually have a c library (as such)! ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C library is in the System framework deplibs="$deplibs -framework System" ;; *-*-netbsd*) # Don't link with libc until the a.out ld.so is fixed. ;; *-*-openbsd* | *-*-freebsd*) # Do not include libc due to us having libc/libc_r. test "X$arg" = "X-lc" && continue ;; *) # Add libc to deplibs on all other systems if necessary. if test "$build_libtool_need_lc" = "yes"; then deplibs="$deplibs -lc" fi ;; esac fi # Transform deplibs into only deplibs that can be linked in shared. name_save=$name libname_save=$libname release_save=$release versuffix_save=$versuffix major_save=$major # I'm not sure if I'm treating the release correctly. I think # release should show up in the -l (ie -lgmp5) so we don't want to # add it in twice. Is that correct? release="" versuffix="" major="" newdeplibs= droppeddeps=no case $deplibs_check_method in pass_all) # Don't check for shared/static. Everything works. # This might be a little naive. We might want to check # whether the library exists or not. But this is on # osf3 & osf4 and I'm not really sure... Just # implementing what was already the behavior. newdeplibs=$deplibs ;; test_compile) # This code stresses the "libraries are programs" paradigm to its # limits. Maybe even breaks it. We compile a program, linking it # against the deplibs as a proxy for the library. Then we can check # whether they linked in statically or dynamically with ldd. $rm conftest.c cat > conftest.c </dev/null` for potent_lib in $potential_libs; do # Follow soft links. if ls -lLd "$potent_lib" 2>/dev/null \ | grep " -> " >/dev/null; then continue fi # The statement above tries to avoid entering an # endless loop below, in case of cyclic links. # We might still enter an endless loop, since a link # loop can be closed while we follow links, # but so what? potlib="$potent_lib" while test -h "$potlib" 2>/dev/null; do potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` case $potliblink in [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; *) potlib=`$echo "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";; esac done if eval $file_magic_cmd \"\$potlib\" 2>/dev/null \ | ${SED} 10q \ | $EGREP "$file_magic_regex" > /dev/null; then newdeplibs="$newdeplibs $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes $echo $echo "*** Warning: linker path does not have real file for library $a_deplib." $echo "*** I have the capability to make that library automatically link in when" $echo "*** you link to this library. But I can only do this if you have a" $echo "*** shared version of the library, which you do not appear to have" $echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $echo "*** with $libname but no candidates were found. (...for file magic test)" else $echo "*** with $libname and none of the candidates passed a file format test" $echo "*** using a file magic. Last file checked: $potlib" fi fi else # Add a -L argument. newdeplibs="$newdeplibs $a_deplib" fi done # Gone through all deplibs. ;; match_pattern*) set dummy $deplibs_check_method match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"` for a_deplib in $deplibs; do name="`expr $a_deplib : '-l\(.*\)'`" # If $name is empty we are operating on a -L argument. if test -n "$name" && test "$name" != "0"; then if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $a_deplib "*) newdeplibs="$newdeplibs $a_deplib" a_deplib="" ;; esac fi if test -n "$a_deplib" ; then libname=`eval \\$echo \"$libname_spec\"` for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do potential_libs=`ls $i/$libname[.-]* 2>/dev/null` for potent_lib in $potential_libs; do potlib="$potent_lib" # see symlink-check above in file_magic test if eval $echo \"$potent_lib\" 2>/dev/null \ | ${SED} 10q \ | $EGREP "$match_pattern_regex" > /dev/null; then newdeplibs="$newdeplibs $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes $echo $echo "*** Warning: linker path does not have real file for library $a_deplib." $echo "*** I have the capability to make that library automatically link in when" $echo "*** you link to this library. But I can only do this if you have a" $echo "*** shared version of the library, which you do not appear to have" $echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $echo "*** with $libname but no candidates were found. (...for regex pattern test)" else $echo "*** with $libname and none of the candidates passed a file format test" $echo "*** using a regex pattern. Last file checked: $potlib" fi fi else # Add a -L argument. newdeplibs="$newdeplibs $a_deplib" fi done # Gone through all deplibs. ;; none | unknown | *) newdeplibs="" tmp_deplibs=`$echo "X $deplibs" | $Xsed -e 's/ -lc$//' \ -e 's/ -[LR][^ ]*//g'` if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then for i in $predeps $postdeps ; do # can't use Xsed below, because $i might contain '/' tmp_deplibs=`$echo "X $tmp_deplibs" | ${SED} -e "1s,^X,," -e "s,$i,,"` done fi if $echo "X $tmp_deplibs" | $Xsed -e 's/[ ]//g' \ | grep . >/dev/null; then $echo if test "X$deplibs_check_method" = "Xnone"; then $echo "*** Warning: inter-library dependencies are not supported in this platform." else $echo "*** Warning: inter-library dependencies are not known to be supported." fi $echo "*** All declared inter-library dependencies are being dropped." droppeddeps=yes fi ;; esac versuffix=$versuffix_save major=$major_save release=$release_save libname=$libname_save name=$name_save case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library is the System framework newdeplibs=`$echo "X $newdeplibs" | $Xsed -e 's/ -lc / -framework System /'` ;; esac if test "$droppeddeps" = yes; then if test "$module" = yes; then $echo $echo "*** Warning: libtool could not satisfy all declared inter-library" $echo "*** dependencies of module $libname. Therefore, libtool will create" $echo "*** a static module, that should work as long as the dlopening" $echo "*** application is linked with the -dlopen flag." if test -z "$global_symbol_pipe"; then $echo $echo "*** However, this would only work if libtool was able to extract symbol" $echo "*** lists from a program, using \`nm' or equivalent, but libtool could" $echo "*** not find such a program. So, this module is probably useless." $echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi else $echo "*** The inter-library dependencies that have been dropped here will be" $echo "*** automatically added whenever a program is linked with this library" $echo "*** or is declared to -dlopen it." if test "$allow_undefined" = no; then $echo $echo "*** Since this library must not contain undefined symbols," $echo "*** because either the platform does not support them or" $echo "*** it was explicitly requested with -no-undefined," $echo "*** libtool will only create a static version of it." if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi fi fi # Done checking deplibs! deplibs=$newdeplibs fi # All the library-specific variables (install_libdir is set above). library_names= old_library= dlname= # Test again, we may have decided not to build it any more if test "$build_libtool_libs" = yes; then if test "$hardcode_into_libs" = yes; then # Hardcode the library paths hardcode_libdirs= dep_rpath= rpath="$finalize_rpath" test "$mode" != relink && rpath="$compile_rpath$rpath" for libdir in $rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" dep_rpath="$dep_rpath $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) perm_rpath="$perm_rpath $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" if test -n "$hardcode_libdir_flag_spec_ld"; then eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\" else eval dep_rpath=\"$hardcode_libdir_flag_spec\" fi fi if test -n "$runpath_var" && test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do rpath="$rpath$dir:" done eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" fi test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" fi shlibpath="$finalize_shlibpath" test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath" if test -n "$shlibpath"; then eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" fi # Get the real and link names of the library. eval shared_ext=\"$shrext_cmds\" eval library_names=\"$library_names_spec\" set dummy $library_names realname="$2" shift; shift if test -n "$soname_spec"; then eval soname=\"$soname_spec\" else soname="$realname" fi if test -z "$dlname"; then dlname=$soname fi lib="$output_objdir/$realname" for link do linknames="$linknames $link" done # Use standard objects if they are pic test -z "$pic_flag" && libobjs=`$echo "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` # Prepare the list of exported symbols if test -z "$export_symbols"; then if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then $show "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $run $rm $export_symbols cmds=$export_symbols_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" if len=`expr "X$cmd" : ".*"` && test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then $show "$cmd" $run eval "$cmd" || exit $? skipped_export=false else # The command line is too long to execute in one step. $show "using reloadable object file for export list..." skipped_export=: fi done IFS="$save_ifs" if test -n "$export_symbols_regex"; then $show "$EGREP -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\"" $run eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' $show "$mv \"${export_symbols}T\" \"$export_symbols\"" $run eval '$mv "${export_symbols}T" "$export_symbols"' fi fi fi if test -n "$export_symbols" && test -n "$include_expsyms"; then $run eval '$echo "X$include_expsyms" | $SP2NL >> "$export_symbols"' fi tmp_deplibs= for test_deplib in $deplibs; do case " $convenience " in *" $test_deplib "*) ;; *) tmp_deplibs="$tmp_deplibs $test_deplib" ;; esac done deplibs="$tmp_deplibs" if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then save_libobjs=$libobjs eval libobjs=\"\$libobjs $whole_archive_flag_spec\" else gentop="$output_objdir/${outputname}x" generated="$generated $gentop" func_extract_archives $gentop $convenience libobjs="$libobjs $func_extract_archives_result" fi fi if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then eval flag=\"$thread_safe_flag_spec\" linker_flags="$linker_flags $flag" fi # Make a backup of the uninstalled library when relinking if test "$mode" = relink; then $run eval '(cd $output_objdir && $rm ${realname}U && $mv $realname ${realname}U)' || exit $? fi # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then eval test_cmds=\"$module_expsym_cmds\" cmds=$module_expsym_cmds else eval test_cmds=\"$module_cmds\" cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then eval test_cmds=\"$archive_expsym_cmds\" cmds=$archive_expsym_cmds else eval test_cmds=\"$archive_cmds\" cmds=$archive_cmds fi fi if test "X$skipped_export" != "X:" && len=`expr "X$test_cmds" : ".*"` && test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then : else # The command line is too long to link in one step, link piecewise. $echo "creating reloadable object files..." # Save the value of $output and $libobjs because we want to # use them later. If we have whole_archive_flag_spec, we # want to use save_libobjs as it was before # whole_archive_flag_spec was expanded, because we can't # assume the linker understands whole_archive_flag_spec. # This may have to be revisited, in case too many # convenience libraries get linked in and end up exceeding # the spec. if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then save_libobjs=$libobjs fi save_output=$output # Clear the reloadable object creation command queue and # initialize k to one. test_cmds= concat_cmds= objlist= delfiles= last_robj= k=1 output=$output_objdir/$save_output-${k}.$objext # Loop over the list of objects to be linked. for obj in $save_libobjs do eval test_cmds=\"$reload_cmds $objlist $last_robj\" if test "X$objlist" = X || { len=`expr "X$test_cmds" : ".*"` && test "$len" -le "$max_cmd_len"; }; then objlist="$objlist $obj" else # The command $test_cmds is almost too long, add a # command to the queue. if test "$k" -eq 1 ; then # The first file doesn't have a previous command to add. eval concat_cmds=\"$reload_cmds $objlist $last_robj\" else # All subsequent reloadable object files will link in # the last one created. eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj\" fi last_robj=$output_objdir/$save_output-${k}.$objext k=`expr $k + 1` output=$output_objdir/$save_output-${k}.$objext objlist=$obj len=1 fi done # Handle the remaining objects by creating one last # reloadable object file. All subsequent reloadable object # files will link in the last one created. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\" if ${skipped_export-false}; then $show "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $run $rm $export_symbols libobjs=$output # Append the command to create the export file. eval concat_cmds=\"\$concat_cmds~$export_symbols_cmds\" fi # Set up a command to remove the reloadale object files # after they are used. i=0 while test "$i" -lt "$k" do i=`expr $i + 1` delfiles="$delfiles $output_objdir/$save_output-${i}.$objext" done $echo "creating a temporary reloadable object file: $output" # Loop through the commands generated above and execute them. save_ifs="$IFS"; IFS='~' for cmd in $concat_cmds; do IFS="$save_ifs" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" libobjs=$output # Restore the value of output. output=$save_output if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then eval libobjs=\"\$libobjs $whole_archive_flag_spec\" fi # Expand the library linking commands again to reset the # value of $libobjs for piecewise linking. # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then cmds=$module_expsym_cmds else cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then cmds=$archive_expsym_cmds else cmds=$archive_cmds fi fi # Append the command to remove the reloadable object files # to the just-reset $cmds. eval cmds=\"\$cmds~\$rm $delfiles\" fi save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" # Restore the uninstalled library and exit if test "$mode" = relink; then $run eval '(cd $output_objdir && $rm ${realname}T && $mv $realname ${realname}T && $mv "$realname"U $realname)' || exit $? exit $EXIT_SUCCESS fi # Create links to the real library. for linkname in $linknames; do if test "$realname" != "$linkname"; then $show "(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)" $run eval '(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)' || exit $? fi done # If -module or -export-dynamic was specified, set the dlname. if test "$module" = yes || test "$export_dynamic" = yes; then # On all known operating systems, these are identical. dlname="$soname" fi fi ;; obj) if test -n "$deplibs"; then $echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2 fi if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then $echo "$modename: warning: \`-dlopen' is ignored for objects" 1>&2 fi if test -n "$rpath"; then $echo "$modename: warning: \`-rpath' is ignored for objects" 1>&2 fi if test -n "$xrpath"; then $echo "$modename: warning: \`-R' is ignored for objects" 1>&2 fi if test -n "$vinfo"; then $echo "$modename: warning: \`-version-info' is ignored for objects" 1>&2 fi if test -n "$release"; then $echo "$modename: warning: \`-release' is ignored for objects" 1>&2 fi case $output in *.lo) if test -n "$objs$old_deplibs"; then $echo "$modename: cannot build library object \`$output' from non-libtool objects" 1>&2 exit $EXIT_FAILURE fi libobj="$output" obj=`$echo "X$output" | $Xsed -e "$lo2o"` ;; *) libobj= obj="$output" ;; esac # Delete the old objects. $run $rm $obj $libobj # Objects from convenience libraries. This assumes # single-version convenience libraries. Whenever we create # different ones for PIC/non-PIC, this we'll have to duplicate # the extraction. reload_conv_objs= gentop= # reload_cmds runs $LD directly, so let us get rid of # -Wl from whole_archive_flag_spec wl= if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then eval reload_conv_objs=\"\$reload_objs $whole_archive_flag_spec\" else gentop="$output_objdir/${obj}x" generated="$generated $gentop" func_extract_archives $gentop $convenience reload_conv_objs="$reload_objs $func_extract_archives_result" fi fi # Create the old-style object. reload_objs="$objs$old_deplibs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test output="$obj" cmds=$reload_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" # Exit if we aren't doing a library object file. if test -z "$libobj"; then if test -n "$gentop"; then $show "${rm}r $gentop" $run ${rm}r $gentop fi exit $EXIT_SUCCESS fi if test "$build_libtool_libs" != yes; then if test -n "$gentop"; then $show "${rm}r $gentop" $run ${rm}r $gentop fi # Create an invalid libtool object if no PIC, so that we don't # accidentally link it into a program. # $show "echo timestamp > $libobj" # $run eval "echo timestamp > $libobj" || exit $? exit $EXIT_SUCCESS fi if test -n "$pic_flag" || test "$pic_mode" != default; then # Only do commands if we really have different PIC objects. reload_objs="$libobjs $reload_conv_objs" output="$libobj" cmds=$reload_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" fi if test -n "$gentop"; then $show "${rm}r $gentop" $run ${rm}r $gentop fi exit $EXIT_SUCCESS ;; prog) case $host in *cygwin*) output=`$echo $output | ${SED} -e 's,.exe$,,;s,$,.exe,'` ;; esac if test -n "$vinfo"; then $echo "$modename: warning: \`-version-info' is ignored for programs" 1>&2 fi if test -n "$release"; then $echo "$modename: warning: \`-release' is ignored for programs" 1>&2 fi if test "$preload" = yes; then if test "$dlopen_support" = unknown && test "$dlopen_self" = unknown && test "$dlopen_self_static" = unknown; then $echo "$modename: warning: \`AC_LIBTOOL_DLOPEN' not used. Assuming no dlopen support." fi fi case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library is the System framework compile_deplibs=`$echo "X $compile_deplibs" | $Xsed -e 's/ -lc / -framework System /'` finalize_deplibs=`$echo "X $finalize_deplibs" | $Xsed -e 's/ -lc / -framework System /'` ;; esac case $host in *darwin*) # Don't allow lazy linking, it breaks C++ global constructors if test "$tagname" = CXX ; then compile_command="$compile_command ${wl}-bind_at_load" finalize_command="$finalize_command ${wl}-bind_at_load" fi ;; esac compile_command="$compile_command $compile_deplibs" finalize_command="$finalize_command $finalize_deplibs" if test -n "$rpath$xrpath"; then # If the user specified any rpath flags, then add them. for libdir in $rpath $xrpath; do # This is the magic to use -rpath. case "$finalize_rpath " in *" $libdir "*) ;; *) finalize_rpath="$finalize_rpath $libdir" ;; esac done fi # Now hardcode the library paths rpath= hardcode_libdirs= for libdir in $compile_rpath $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" rpath="$rpath $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) perm_rpath="$perm_rpath $libdir" ;; esac fi case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) case :$dllsearchpath: in *":$libdir:"*) ;; *) dllsearchpath="$dllsearchpath:$libdir";; esac ;; esac done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi compile_rpath="$rpath" rpath= hardcode_libdirs= for libdir in $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" rpath="$rpath $flag" fi elif test -n "$runpath_var"; then case "$finalize_perm_rpath " in *" $libdir "*) ;; *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi finalize_rpath="$rpath" if test -n "$libobjs" && test "$build_old_libs" = yes; then # Transform all the library objects into standard objects. compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` fi dlsyms= if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then if test -n "$NM" && test -n "$global_symbol_pipe"; then dlsyms="${outputname}S.c" else $echo "$modename: not configured to extract global symbols from dlpreopened files" 1>&2 fi fi if test -n "$dlsyms"; then case $dlsyms in "") ;; *.c) # Discover the nlist of each of the dlfiles. nlist="$output_objdir/${outputname}.nm" $show "$rm $nlist ${nlist}S ${nlist}T" $run $rm "$nlist" "${nlist}S" "${nlist}T" # Parse the name list into a source file. $show "creating $output_objdir/$dlsyms" test -z "$run" && $echo > "$output_objdir/$dlsyms" "\ /* $dlsyms - symbol resolution table for \`$outputname' dlsym emulation. */ /* Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP */ #ifdef __cplusplus extern \"C\" { #endif /* Prevent the only kind of declaration conflicts we can make. */ #define lt_preloaded_symbols some_other_symbol /* External symbol declarations for the compiler. */\ " if test "$dlself" = yes; then $show "generating symbol list for \`$output'" test -z "$run" && $echo ': @PROGRAM@ ' > "$nlist" # Add our own program objects to the symbol list. progfiles=`$echo "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` for arg in $progfiles; do $show "extracting global C symbols from \`$arg'" $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" done if test -n "$exclude_expsyms"; then $run eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' $run eval '$mv "$nlist"T "$nlist"' fi if test -n "$export_symbols_regex"; then $run eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' $run eval '$mv "$nlist"T "$nlist"' fi # Prepare the list of exported symbols if test -z "$export_symbols"; then export_symbols="$output_objdir/$output.exp" $run $rm $export_symbols $run eval "${SED} -n -e '/^: @PROGRAM@$/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' else $run eval "${SED} -e 's/\([][.*^$]\)/\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$output.exp"' $run eval 'grep -f "$output_objdir/$output.exp" < "$nlist" > "$nlist"T' $run eval 'mv "$nlist"T "$nlist"' fi fi for arg in $dlprefiles; do $show "extracting global C symbols from \`$arg'" name=`$echo "$arg" | ${SED} -e 's%^.*/%%'` $run eval '$echo ": $name " >> "$nlist"' $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" done if test -z "$run"; then # Make sure we have at least an empty file. test -f "$nlist" || : > "$nlist" if test -n "$exclude_expsyms"; then $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T $mv "$nlist"T "$nlist" fi # Try sorting and uniquifying the output. if grep -v "^: " < "$nlist" | if sort -k 3 /dev/null 2>&1; then sort -k 3 else sort +2 fi | uniq > "$nlist"S; then : else grep -v "^: " < "$nlist" > "$nlist"S fi if test -f "$nlist"S; then eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$dlsyms"' else $echo '/* NONE */' >> "$output_objdir/$dlsyms" fi $echo >> "$output_objdir/$dlsyms" "\ #undef lt_preloaded_symbols #if defined (__STDC__) && __STDC__ # define lt_ptr void * #else # define lt_ptr char * # define const #endif /* The mapping between symbol names and symbols. */ const struct { const char *name; lt_ptr address; } lt_preloaded_symbols[] = {\ " eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$dlsyms" $echo >> "$output_objdir/$dlsyms" "\ {0, (lt_ptr) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt_preloaded_symbols; } #endif #ifdef __cplusplus } #endif\ " fi pic_flag_for_symtable= case $host in # compiling the symbol table file with pic_flag works around # a FreeBSD bug that causes programs to crash when -lm is # linked before any other PIC object. But we must not use # pic_flag when linking with -static. The problem exists in # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) case "$compile_command " in *" -static "*) ;; *) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND";; esac;; *-*-hpux*) case "$compile_command " in *" -static "*) ;; *) pic_flag_for_symtable=" $pic_flag";; esac esac # Now compile the dynamic symbol file. $show "(cd $output_objdir && $LTCC -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")" $run eval '(cd $output_objdir && $LTCC -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $? # Clean up the generated files. $show "$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T" $run $rm "$output_objdir/$dlsyms" "$nlist" "${nlist}S" "${nlist}T" # Transform the symbol file into the correct name. compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"` finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"` ;; *-*-freebsd*) # FreeBSD doesn't need this... ;; *) $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2 exit $EXIT_FAILURE ;; esac else # We keep going just in case the user didn't refer to # lt_preloaded_symbols. The linker will fail if global_symbol_pipe # really was required. # Nullify the symbol file. compile_command=`$echo "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"` finalize_command=`$echo "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"` fi if test "$need_relink" = no || test "$build_libtool_libs" != yes; then # Replace the output file specification. compile_command=`$echo "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` link_command="$compile_command$compile_rpath" # We have no uninstalled library dependencies, so finalize right now. $show "$link_command" $run eval "$link_command" status=$? # Delete the generated files. if test -n "$dlsyms"; then $show "$rm $output_objdir/${outputname}S.${objext}" $run $rm "$output_objdir/${outputname}S.${objext}" fi exit $status fi if test -n "$shlibpath_var"; then # We should set the shlibpath_var rpath= for dir in $temp_rpath; do case $dir in [\\/]* | [A-Za-z]:[\\/]*) # Absolute path. rpath="$rpath$dir:" ;; *) # Relative path: add a thisdir entry. rpath="$rpath\$thisdir/$dir:" ;; esac done temp_rpath="$rpath" fi if test -n "$compile_shlibpath$finalize_shlibpath"; then compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" fi if test -n "$finalize_shlibpath"; then finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" fi compile_var= finalize_var= if test -n "$runpath_var"; then if test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do rpath="$rpath$dir:" done compile_var="$runpath_var=\"$rpath\$$runpath_var\" " fi if test -n "$finalize_perm_rpath"; then # We should set the runpath_var. rpath= for dir in $finalize_perm_rpath; do rpath="$rpath$dir:" done finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " fi fi if test "$no_install" = yes; then # We don't need to create a wrapper script. link_command="$compile_var$compile_command$compile_rpath" # Replace the output file specification. link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` # Delete the old output file. $run $rm $output # Link the executable and exit $show "$link_command" $run eval "$link_command" || exit $? exit $EXIT_SUCCESS fi if test "$hardcode_action" = relink; then # Fast installation is not supported link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" $echo "$modename: warning: this platform does not like uninstalled shared libraries" 1>&2 $echo "$modename: \`$output' will be relinked during installation" 1>&2 else if test "$fast_install" != no; then link_command="$finalize_var$compile_command$finalize_rpath" if test "$fast_install" = yes; then relink_command=`$echo "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'` else # fast_install is set to needless relink_command= fi else link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" fi fi # Replace the output file specification. link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` # Delete the old output files. $run $rm $output $output_objdir/$outputname $output_objdir/lt-$outputname $show "$link_command" $run eval "$link_command" || exit $? # Now create the wrapper script. $show "creating $output" # Quote the relink command for shipping. if test -n "$relink_command"; then # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"` relink_command="$var=\"$var_value\"; export $var; $relink_command" fi done relink_command="(cd `pwd`; $relink_command)" relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"` fi # Quote $echo for shipping. if test "X$echo" = "X$SHELL $progpath --fallback-echo"; then case $progpath in [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";; *) qecho="$SHELL `pwd`/$progpath --fallback-echo";; esac qecho=`$echo "X$qecho" | $Xsed -e "$sed_quote_subst"` else qecho=`$echo "X$echo" | $Xsed -e "$sed_quote_subst"` fi # Only actually do things if our run command is non-null. if test -z "$run"; then # win32 will think the script is a binary if it has # a .exe suffix, so we strip it off here. case $output in *.exe) output=`$echo $output|${SED} 's,.exe$,,'` ;; esac # test for cygwin because mv fails w/o .exe extensions case $host in *cygwin*) exeext=.exe outputname=`$echo $outputname|${SED} 's,.exe$,,'` ;; *) exeext= ;; esac case $host in *cygwin* | *mingw* ) cwrappersource=`$echo ${objdir}/lt-${output}.c` cwrapper=`$echo ${output}.exe` $rm $cwrappersource $cwrapper trap "$rm $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 cat > $cwrappersource <> $cwrappersource<<"EOF" #include #include #include #include #include #include #if defined(PATH_MAX) # define LT_PATHMAX PATH_MAX #elif defined(MAXPATHLEN) # define LT_PATHMAX MAXPATHLEN #else # define LT_PATHMAX 1024 #endif #ifndef DIR_SEPARATOR #define DIR_SEPARATOR '/' #endif #if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ defined (__OS2__) #define HAVE_DOS_BASED_FILE_SYSTEM #ifndef DIR_SEPARATOR_2 #define DIR_SEPARATOR_2 '\\' #endif #endif #ifndef DIR_SEPARATOR_2 # define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) #else /* DIR_SEPARATOR_2 */ # define IS_DIR_SEPARATOR(ch) \ (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) #endif /* DIR_SEPARATOR_2 */ #define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) #define XFREE(stale) do { \ if (stale) { free ((void *) stale); stale = 0; } \ } while (0) const char *program_name = NULL; void * xmalloc (size_t num); char * xstrdup (const char *string); char * basename (const char *name); char * fnqualify(const char *path); char * strendzap(char *str, const char *pat); void lt_fatal (const char *message, ...); int main (int argc, char *argv[]) { char **newargz; int i; program_name = (char *) xstrdup ((char *) basename (argv[0])); newargz = XMALLOC(char *, argc+2); EOF cat >> $cwrappersource <> $cwrappersource <<"EOF" newargz[1] = fnqualify(argv[0]); /* we know the script has the same name, without the .exe */ /* so make sure newargz[1] doesn't end in .exe */ strendzap(newargz[1],".exe"); for (i = 1; i < argc; i++) newargz[i+1] = xstrdup(argv[i]); newargz[argc+1] = NULL; EOF cat >> $cwrappersource <> $cwrappersource <<"EOF" } void * xmalloc (size_t num) { void * p = (void *) malloc (num); if (!p) lt_fatal ("Memory exhausted"); return p; } char * xstrdup (const char *string) { return string ? strcpy ((char *) xmalloc (strlen (string) + 1), string) : NULL ; } char * basename (const char *name) { const char *base; #if defined (HAVE_DOS_BASED_FILE_SYSTEM) /* Skip over the disk name in MSDOS pathnames. */ if (isalpha (name[0]) && name[1] == ':') name += 2; #endif for (base = name; *name; name++) if (IS_DIR_SEPARATOR (*name)) base = name + 1; return (char *) base; } char * fnqualify(const char *path) { size_t size; char *p; char tmp[LT_PATHMAX + 1]; assert(path != NULL); /* Is it qualified already? */ #if defined (HAVE_DOS_BASED_FILE_SYSTEM) if (isalpha (path[0]) && path[1] == ':') return xstrdup (path); #endif if (IS_DIR_SEPARATOR (path[0])) return xstrdup (path); /* prepend the current directory */ /* doesn't handle '~' */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal ("getcwd failed"); size = strlen(tmp) + 1 + strlen(path) + 1; /* +2 for '/' and '\0' */ p = XMALLOC(char, size); sprintf(p, "%s%c%s", tmp, DIR_SEPARATOR, path); return p; } char * strendzap(char *str, const char *pat) { size_t len, patlen; assert(str != NULL); assert(pat != NULL); len = strlen(str); patlen = strlen(pat); if (patlen <= len) { str += len - patlen; if (strcmp(str, pat) == 0) *str = '\0'; } return str; } static void lt_error_core (int exit_status, const char * mode, const char * message, va_list ap) { fprintf (stderr, "%s: %s: ", program_name, mode); vfprintf (stderr, message, ap); fprintf (stderr, ".\n"); if (exit_status >= 0) exit (exit_status); } void lt_fatal (const char *message, ...) { va_list ap; va_start (ap, message); lt_error_core (EXIT_FAILURE, "FATAL", message, ap); va_end (ap); } EOF # we should really use a build-platform specific compiler # here, but OTOH, the wrappers (shell script and this C one) # are only useful if you want to execute the "real" binary. # Since the "real" binary is built for $host, then this # wrapper might as well be built for $host, too. $run $LTCC -s -o $cwrapper $cwrappersource ;; esac $rm $output trap "$rm $output; exit $EXIT_FAILURE" 1 2 15 $echo > $output "\ #! $SHELL # $output - temporary wrapper script for $objdir/$outputname # Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP # # The $output program cannot be directly executed until all the libtool # libraries that it depends on are installed. # # This wrapper script should never be moved out of the build directory. # If it is, it will not operate correctly. # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. Xsed='${SED} -e 1s/^X//' sed_quote_subst='$sed_quote_subst' # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH relink_command=\"$relink_command\" # This environment variable determines our operation mode. if test \"\$libtool_install_magic\" = \"$magic\"; then # install mode needs the following variable: notinst_deplibs='$notinst_deplibs' else # When we are sourced in execute mode, \$file and \$echo are already set. if test \"\$libtool_execute_magic\" != \"$magic\"; then echo=\"$qecho\" file=\"\$0\" # Make sure echo works. if test \"X\$1\" = X--no-reexec; then # Discard the --no-reexec flag, and continue. shift elif test \"X\`(\$echo '\t') 2>/dev/null\`\" = 'X\t'; then # Yippee, \$echo works! : else # Restart under the correct shell, and then maybe \$echo will work. exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"} fi fi\ " $echo >> $output "\ # Find the directory that this script lives in. thisdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\` test \"x\$thisdir\" = \"x\$file\" && thisdir=. # Follow symbolic links until we get to the real thisdir. file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\` while test -n \"\$file\"; do destdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\` # If there was a directory component, then change thisdir. if test \"x\$destdir\" != \"x\$file\"; then case \"\$destdir\" in [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; *) thisdir=\"\$thisdir/\$destdir\" ;; esac fi file=\`\$echo \"X\$file\" | \$Xsed -e 's%^.*/%%'\` file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\` done # Try to get the absolute directory name. absdir=\`cd \"\$thisdir\" && pwd\` test -n \"\$absdir\" && thisdir=\"\$absdir\" " if test "$fast_install" = yes; then $echo >> $output "\ program=lt-'$outputname'$exeext progdir=\"\$thisdir/$objdir\" if test ! -f \"\$progdir/\$program\" || \\ { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ test \"X\$file\" != \"X\$progdir/\$program\"; }; then file=\"\$\$-\$program\" if test ! -d \"\$progdir\"; then $mkdir \"\$progdir\" else $rm \"\$progdir/\$file\" fi" $echo >> $output "\ # relink executable if necessary if test -n \"\$relink_command\"; then if relink_command_output=\`eval \$relink_command 2>&1\`; then : else $echo \"\$relink_command_output\" >&2 $rm \"\$progdir/\$file\" exit $EXIT_FAILURE fi fi $mv \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || { $rm \"\$progdir/\$program\"; $mv \"\$progdir/\$file\" \"\$progdir/\$program\"; } $rm \"\$progdir/\$file\" fi" else $echo >> $output "\ program='$outputname' progdir=\"\$thisdir/$objdir\" " fi $echo >> $output "\ if test -f \"\$progdir/\$program\"; then" # Export our shlibpath_var if we have one. if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then $echo >> $output "\ # Add our own library path to $shlibpath_var $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" # Some systems cannot cope with colon-terminated $shlibpath_var # The second colon is a workaround for a bug in BeOS R4 sed $shlibpath_var=\`\$echo \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\` export $shlibpath_var " fi # fixup the dll searchpath if we need to. if test -n "$dllsearchpath"; then $echo >> $output "\ # Add the dll search path components to the executable PATH PATH=$dllsearchpath:\$PATH " fi $echo >> $output "\ if test \"\$libtool_execute_magic\" != \"$magic\"; then # Run the actual program with our arguments. " case $host in # Backslashes separate directories on plain windows *-*-mingw | *-*-os2*) $echo >> $output "\ exec \$progdir\\\\\$program \${1+\"\$@\"} " ;; *) $echo >> $output "\ exec \$progdir/\$program \${1+\"\$@\"} " ;; esac $echo >> $output "\ \$echo \"\$0: cannot exec \$program \${1+\"\$@\"}\" exit $EXIT_FAILURE fi else # The program doesn't exist. \$echo \"\$0: error: \$progdir/\$program does not exist\" 1>&2 \$echo \"This script is just a wrapper for \$program.\" 1>&2 $echo \"See the $PACKAGE documentation for more information.\" 1>&2 exit $EXIT_FAILURE fi fi\ " chmod +x $output fi exit $EXIT_SUCCESS ;; esac # See if we need to build an old-fashioned archive. for oldlib in $oldlibs; do if test "$build_libtool_libs" = convenience; then oldobjs="$libobjs_save" addlibs="$convenience" build_libtool_libs=no else if test "$build_libtool_libs" = module; then oldobjs="$libobjs_save" build_libtool_libs=no else oldobjs="$old_deplibs $non_pic_objects" fi addlibs="$old_convenience" fi if test -n "$addlibs"; then gentop="$output_objdir/${outputname}x" generated="$generated $gentop" func_extract_archives $gentop $addlibs oldobjs="$oldobjs $func_extract_archives_result" fi # Do each command in the archive commands. if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then cmds=$old_archive_from_new_cmds else eval cmds=\"$old_archive_cmds\" if len=`expr "X$cmds" : ".*"` && test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then cmds=$old_archive_cmds else # the command line is too long to link in one step, link in parts $echo "using piecewise archive linking..." save_RANLIB=$RANLIB RANLIB=: objlist= concat_cmds= save_oldobjs=$oldobjs # GNU ar 2.10+ was changed to match POSIX; thus no paths are # encoded into archives. This makes 'ar r' malfunction in # this piecewise linking case whenever conflicting object # names appear in distinct ar calls; check, warn and compensate. if (for obj in $save_oldobjs do $echo "X$obj" | $Xsed -e 's%^.*/%%' done | sort | sort -uc >/dev/null 2>&1); then : else $echo "$modename: warning: object name conflicts; overriding AR_FLAGS to 'cq'" 1>&2 $echo "$modename: warning: to ensure that POSIX-compatible ar will work" 1>&2 AR_FLAGS=cq fi # Is there a better way of finding the last object in the list? for obj in $save_oldobjs do last_oldobj=$obj done for obj in $save_oldobjs do oldobjs="$objlist $obj" objlist="$objlist $obj" eval test_cmds=\"$old_archive_cmds\" if len=`expr "X$test_cmds" : ".*"` && test "$len" -le "$max_cmd_len"; then : else # the above command should be used before it gets too long oldobjs=$objlist if test "$obj" = "$last_oldobj" ; then RANLIB=$save_RANLIB fi test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" objlist= fi done RANLIB=$save_RANLIB oldobjs=$objlist if test "X$oldobjs" = "X" ; then eval cmds=\"\$concat_cmds\" else eval cmds=\"\$concat_cmds~\$old_archive_cmds\" fi fi fi save_ifs="$IFS"; IFS='~' for cmd in $cmds; do eval cmd=\"$cmd\" IFS="$save_ifs" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" done if test -n "$generated"; then $show "${rm}r$generated" $run ${rm}r$generated fi # Now create the libtool archive. case $output in *.la) old_library= test "$build_old_libs" = yes && old_library="$libname.$libext" $show "creating $output" # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"` relink_command="$var=\"$var_value\"; export $var; $relink_command" fi done # Quote the link command for shipping. relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"` if test "$hardcode_automatic" = yes ; then relink_command= fi # Only create the output if not a dry run. if test -z "$run"; then for installed in no yes; do if test "$installed" = yes; then if test -z "$install_libdir"; then break fi output="$output_objdir/$outputname"i # Replace all uninstalled libtool libraries with the installed ones newdependency_libs= for deplib in $dependency_libs; do case $deplib in *.la) name=`$echo "X$deplib" | $Xsed -e 's%^.*/%%'` eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` if test -z "$libdir"; then $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 exit $EXIT_FAILURE fi newdependency_libs="$newdependency_libs $libdir/$name" ;; *) newdependency_libs="$newdependency_libs $deplib" ;; esac done dependency_libs="$newdependency_libs" newdlfiles= for lib in $dlfiles; do name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` if test -z "$libdir"; then $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 exit $EXIT_FAILURE fi newdlfiles="$newdlfiles $libdir/$name" done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` if test -z "$libdir"; then $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 exit $EXIT_FAILURE fi newdlprefiles="$newdlprefiles $libdir/$name" done dlprefiles="$newdlprefiles" else newdlfiles= for lib in $dlfiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac newdlfiles="$newdlfiles $abs" done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac newdlprefiles="$newdlprefiles $abs" done dlprefiles="$newdlprefiles" fi $rm $output # place dlname in correct position for cygwin tdlname=$dlname case $host,$output,$installed,$module,$dlname in *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;; esac $echo > $output "\ # $outputname - a libtool library file # Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP # # Please DO NOT delete this file! # It is necessary for linking the library. # The name that we can dlopen(3). dlname='$tdlname' # Names of this library. library_names='$library_names' # The name of the static archive. old_library='$old_library' # Libraries that this one depends upon. dependency_libs='$dependency_libs' # Version information for $libname. current=$current age=$age revision=$revision # Is this an already installed library? installed=$installed # Should we warn about portability when linking against -modules? shouldnotlink=$module # Files to dlopen/dlpreopen dlopen='$dlfiles' dlpreopen='$dlprefiles' # Directory that this library needs to be installed in: libdir='$install_libdir'" if test "$installed" = no && test "$need_relink" = yes; then $echo >> $output "\ relink_command=\"$relink_command\"" fi done fi # Do a symbolic link so that the libtool archive can be found in # LD_LIBRARY_PATH before the program is installed. $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)" $run eval '(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)' || exit $? ;; esac exit $EXIT_SUCCESS ;; # libtool install mode install) modename="$modename: install" # There may be an optional sh(1) argument at the beginning of # install_prog (especially on Windows NT). if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || # Allow the use of GNU shtool's install command. $echo "X$nonopt" | $Xsed | grep shtool > /dev/null; then # Aesthetically quote it. arg=`$echo "X$nonopt" | $Xsed -e "$sed_quote_subst"` case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) arg="\"$arg\"" ;; esac install_prog="$arg " arg="$1" shift else install_prog= arg="$nonopt" fi # The real first argument should be the name of the installation program. # Aesthetically quote it. arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) arg="\"$arg\"" ;; esac install_prog="$install_prog$arg" # We need to accept at least all the BSD install flags. dest= files= opts= prev= install_type= isdir=no stripme= for arg do if test -n "$dest"; then files="$files $dest" dest="$arg" continue fi case $arg in -d) isdir=yes ;; -f) prev="-f" ;; -g) prev="-g" ;; -m) prev="-m" ;; -o) prev="-o" ;; -s) stripme=" -s" continue ;; -*) ;; *) # If the previous option needed an argument, then skip it. if test -n "$prev"; then prev= else dest="$arg" continue fi ;; esac # Aesthetically quote the argument. arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` case $arg in *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) arg="\"$arg\"" ;; esac install_prog="$install_prog $arg" done if test -z "$install_prog"; then $echo "$modename: you must specify an install program" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi if test -n "$prev"; then $echo "$modename: the \`$prev' option requires an argument" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi if test -z "$files"; then if test -z "$dest"; then $echo "$modename: no file or destination specified" 1>&2 else $echo "$modename: you must specify a destination" 1>&2 fi $echo "$help" 1>&2 exit $EXIT_FAILURE fi # Strip any trailing slash from the destination. dest=`$echo "X$dest" | $Xsed -e 's%/$%%'` # Check to see that the destination is a directory. test -d "$dest" && isdir=yes if test "$isdir" = yes; then destdir="$dest" destname= else destdir=`$echo "X$dest" | $Xsed -e 's%/[^/]*$%%'` test "X$destdir" = "X$dest" && destdir=. destname=`$echo "X$dest" | $Xsed -e 's%^.*/%%'` # Not a directory, so check to see that there is only one file specified. set dummy $files if test "$#" -gt 2; then $echo "$modename: \`$dest' is not a directory" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi fi case $destdir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) for file in $files; do case $file in *.lo) ;; *) $echo "$modename: \`$destdir' must be an absolute directory name" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE ;; esac done ;; esac # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" staticlibs= future_libdirs= current_libdirs= for file in $files; do # Do each installation. case $file in *.$libext) # Do the static libraries later. staticlibs="$staticlibs $file" ;; *.la) # Check to see that this really is a libtool archive. if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : else $echo "$modename: \`$file' is not a valid libtool archive" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi library_names= old_library= relink_command= # If there is no directory component, then add one. case $file in */* | *\\*) . $file ;; *) . ./$file ;; esac # Add the libdir to current_libdirs if it is the destination. if test "X$destdir" = "X$libdir"; then case "$current_libdirs " in *" $libdir "*) ;; *) current_libdirs="$current_libdirs $libdir" ;; esac else # Note the libdir as a future libdir. case "$future_libdirs " in *" $libdir "*) ;; *) future_libdirs="$future_libdirs $libdir" ;; esac fi dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/ test "X$dir" = "X$file/" && dir= dir="$dir$objdir" if test -n "$relink_command"; then # Determine the prefix the user has applied to our future dir. inst_prefix_dir=`$echo "$destdir" | $SED "s%$libdir\$%%"` # Don't allow the user to place us outside of our expected # location b/c this prevents finding dependent libraries that # are installed to the same prefix. # At present, this check doesn't affect windows .dll's that # are installed into $libdir/../bin (currently, that works fine) # but it's something to keep an eye on. if test "$inst_prefix_dir" = "$destdir"; then $echo "$modename: error: cannot install \`$file' to a directory not ending in $libdir" 1>&2 exit $EXIT_FAILURE fi if test -n "$inst_prefix_dir"; then # Stick the inst_prefix_dir data into the link command. relink_command=`$echo "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` else relink_command=`$echo "$relink_command" | $SED "s%@inst_prefix_dir@%%"` fi $echo "$modename: warning: relinking \`$file'" 1>&2 $show "$relink_command" if $run eval "$relink_command"; then : else $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 exit $EXIT_FAILURE fi fi # See the names of the shared library. set dummy $library_names if test -n "$2"; then realname="$2" shift shift srcname="$realname" test -n "$relink_command" && srcname="$realname"T # Install the shared library and build the symlinks. $show "$install_prog $dir/$srcname $destdir/$realname" $run eval "$install_prog $dir/$srcname $destdir/$realname" || exit $? if test -n "$stripme" && test -n "$striplib"; then $show "$striplib $destdir/$realname" $run eval "$striplib $destdir/$realname" || exit $? fi if test "$#" -gt 0; then # Delete the old symlinks, and create new ones. for linkname do if test "$linkname" != "$realname"; then $show "(cd $destdir && $rm $linkname && $LN_S $realname $linkname)" $run eval "(cd $destdir && $rm $linkname && $LN_S $realname $linkname)" fi done fi # Do each command in the postinstall commands. lib="$destdir/$realname" cmds=$postinstall_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" fi # Install the pseudo-library for information purposes. case $host in *-*-freebsd*) # Do not install the useless pseudo-library ;; *) name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` instname="$dir/$name"i $show "$install_prog $instname $destdir/$name" $run eval "$install_prog $instname $destdir/$name" || exit $? ;; esac # Maybe install the static library, too. test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library" ;; *.lo) # Install (i.e. copy) a libtool object. # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` destfile="$destdir/$destfile" fi # Deduce the name of the destination old-style object file. case $destfile in *.lo) staticdest=`$echo "X$destfile" | $Xsed -e "$lo2o"` ;; *.$objext) staticdest="$destfile" destfile= ;; *) $echo "$modename: cannot copy a libtool object to \`$destfile'" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE ;; esac # Install the libtool object if requested. if test -n "$destfile"; then $show "$install_prog $file $destfile" $run eval "$install_prog $file $destfile" || exit $? fi # Install the old object if enabled. if test "$build_old_libs" = yes; then # Deduce the name of the old-style object file. staticobj=`$echo "X$file" | $Xsed -e "$lo2o"` $show "$install_prog $staticobj $staticdest" $run eval "$install_prog \$staticobj \$staticdest" || exit $? fi exit $EXIT_SUCCESS ;; *) # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` destfile="$destdir/$destfile" fi # If the file is missing, and there is a .exe on the end, strip it # because it is most likely a libtool script we actually want to # install stripped_ext="" case $file in *.exe) if test ! -f "$file"; then file=`$echo $file|${SED} 's,.exe$,,'` stripped_ext=".exe" fi ;; esac # Do a test to see if this is really a libtool program. case $host in *cygwin*|*mingw*) wrapper=`$echo $file | ${SED} -e 's,.exe$,,'` ;; *) wrapper=$file ;; esac if (${SED} -e '4q' $wrapper | grep "^# Generated by .*$PACKAGE")>/dev/null 2>&1; then notinst_deplibs= relink_command= # To insure that "foo" is sourced, and not "foo.exe", # finesse the cygwin/MSYS system by explicitly sourcing "foo." # which disallows the automatic-append-.exe behavior. case $build in *cygwin* | *mingw*) wrapperdot=${wrapper}. ;; *) wrapperdot=${wrapper} ;; esac # If there is no directory component, then add one. case $file in */* | *\\*) . ${wrapperdot} ;; *) . ./${wrapperdot} ;; esac # Check the variables that should have been set. if test -z "$notinst_deplibs"; then $echo "$modename: invalid libtool wrapper script \`$wrapper'" 1>&2 exit $EXIT_FAILURE fi finalize=yes for lib in $notinst_deplibs; do # Check to see that each library is installed. libdir= if test -f "$lib"; then # If there is no directory component, then add one. case $lib in */* | *\\*) . $lib ;; *) . ./$lib ;; esac fi libfile="$libdir/"`$echo "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test if test -n "$libdir" && test ! -f "$libfile"; then $echo "$modename: warning: \`$lib' has not been installed in \`$libdir'" 1>&2 finalize=no fi done relink_command= # To insure that "foo" is sourced, and not "foo.exe", # finesse the cygwin/MSYS system by explicitly sourcing "foo." # which disallows the automatic-append-.exe behavior. case $build in *cygwin* | *mingw*) wrapperdot=${wrapper}. ;; *) wrapperdot=${wrapper} ;; esac # If there is no directory component, then add one. case $file in */* | *\\*) . ${wrapperdot} ;; *) . ./${wrapperdot} ;; esac outputname= if test "$fast_install" = no && test -n "$relink_command"; then if test "$finalize" = yes && test -z "$run"; then tmpdir="/tmp" test -n "$TMPDIR" && tmpdir="$TMPDIR" tmpdir="$tmpdir/libtool-$$" save_umask=`umask` umask 0077 if $mkdir "$tmpdir"; then umask $save_umask else umask $save_umask $echo "$modename: error: cannot create temporary directory \`$tmpdir'" 1>&2 continue fi file=`$echo "X$file$stripped_ext" | $Xsed -e 's%^.*/%%'` outputname="$tmpdir/$file" # Replace the output file specification. relink_command=`$echo "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'` $show "$relink_command" if $run eval "$relink_command"; then : else $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 ${rm}r "$tmpdir" continue fi file="$outputname" else $echo "$modename: warning: cannot relink \`$file'" 1>&2 fi else # Install the binary that we compiled earlier. file=`$echo "X$file$stripped_ext" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"` fi fi # remove .exe since cygwin /usr/bin/install will append another # one anyways case $install_prog,$host in */usr/bin/install*,*cygwin*) case $file:$destfile in *.exe:*.exe) # this is ok ;; *.exe:*) destfile=$destfile.exe ;; *:*.exe) destfile=`$echo $destfile | ${SED} -e 's,.exe$,,'` ;; esac ;; esac $show "$install_prog$stripme $file $destfile" $run eval "$install_prog\$stripme \$file \$destfile" || exit $? test -n "$outputname" && ${rm}r "$tmpdir" ;; esac done for file in $staticlibs; do name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` # Set up the ranlib parameters. oldlib="$destdir/$name" $show "$install_prog $file $oldlib" $run eval "$install_prog \$file \$oldlib" || exit $? if test -n "$stripme" && test -n "$old_striplib"; then $show "$old_striplib $oldlib" $run eval "$old_striplib $oldlib" || exit $? fi # Do each command in the postinstall commands. cmds=$old_postinstall_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || exit $? done IFS="$save_ifs" done if test -n "$future_libdirs"; then $echo "$modename: warning: remember to run \`$progname --finish$future_libdirs'" 1>&2 fi if test -n "$current_libdirs"; then # Maybe just do a dry run. test -n "$run" && current_libdirs=" -n$current_libdirs" exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' else exit $EXIT_SUCCESS fi ;; # libtool finish mode finish) modename="$modename: finish" libdirs="$nonopt" admincmds= if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then for dir do libdirs="$libdirs $dir" done for libdir in $libdirs; do if test -n "$finish_cmds"; then # Do each command in the finish commands. cmds=$finish_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" || admincmds="$admincmds $cmd" done IFS="$save_ifs" fi if test -n "$finish_eval"; then # Do the single finish_eval. eval cmds=\"$finish_eval\" $run eval "$cmds" || admincmds="$admincmds $cmds" fi done fi # Exit here if they wanted silent mode. test "$show" = : && exit $EXIT_SUCCESS $echo "----------------------------------------------------------------------" $echo "Libraries have been installed in:" for libdir in $libdirs; do $echo " $libdir" done $echo $echo "If you ever happen to want to link against installed libraries" $echo "in a given directory, LIBDIR, you must either use libtool, and" $echo "specify the full pathname of the library, or use the \`-LLIBDIR'" $echo "flag during linking and do at least one of the following:" if test -n "$shlibpath_var"; then $echo " - add LIBDIR to the \`$shlibpath_var' environment variable" $echo " during execution" fi if test -n "$runpath_var"; then $echo " - add LIBDIR to the \`$runpath_var' environment variable" $echo " during linking" fi if test -n "$hardcode_libdir_flag_spec"; then libdir=LIBDIR eval flag=\"$hardcode_libdir_flag_spec\" $echo " - use the \`$flag' linker flag" fi if test -n "$admincmds"; then $echo " - have your system administrator run these commands:$admincmds" fi if test -f /etc/ld.so.conf; then $echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" fi $echo $echo "See any operating system documentation about shared libraries for" $echo "more information, such as the ld(1) and ld.so(8) manual pages." $echo "----------------------------------------------------------------------" exit $EXIT_SUCCESS ;; # libtool execute mode execute) modename="$modename: execute" # The first argument is the command name. cmd="$nonopt" if test -z "$cmd"; then $echo "$modename: you must specify a COMMAND" 1>&2 $echo "$help" exit $EXIT_FAILURE fi # Handle -dlopen flags immediately. for file in $execute_dlfiles; do if test ! -f "$file"; then $echo "$modename: \`$file' is not a file" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi dir= case $file in *.la) # Check to see that this really is a libtool archive. if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : else $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi # Read the libtool library. dlname= library_names= # If there is no directory component, then add one. case $file in */* | *\\*) . $file ;; *) . ./$file ;; esac # Skip this library if it cannot be dlopened. if test -z "$dlname"; then # Warn if it was a shared library. test -n "$library_names" && $echo "$modename: warning: \`$file' was not linked with \`-export-dynamic'" continue fi dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` test "X$dir" = "X$file" && dir=. if test -f "$dir/$objdir/$dlname"; then dir="$dir/$objdir" else $echo "$modename: cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 1>&2 exit $EXIT_FAILURE fi ;; *.lo) # Just add the directory containing the .lo file. dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` test "X$dir" = "X$file" && dir=. ;; *) $echo "$modename: warning \`-dlopen' is ignored for non-libtool libraries and objects" 1>&2 continue ;; esac # Get the absolute pathname. absdir=`cd "$dir" && pwd` test -n "$absdir" && dir="$absdir" # Now add the directory to shlibpath_var. if eval "test -z \"\$$shlibpath_var\""; then eval "$shlibpath_var=\"\$dir\"" else eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" fi done # This variable tells wrapper scripts just to set shlibpath_var # rather than running their programs. libtool_execute_magic="$magic" # Check if any of the arguments is a wrapper script. args= for file do case $file in -*) ;; *) # Do a test to see if this is really a libtool program. if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then # If there is no directory component, then add one. case $file in */* | *\\*) . $file ;; *) . ./$file ;; esac # Transform arg to wrapped name. file="$progdir/$program" fi ;; esac # Quote arguments (to preserve shell metacharacters). file=`$echo "X$file" | $Xsed -e "$sed_quote_subst"` args="$args \"$file\"" done if test -z "$run"; then if test -n "$shlibpath_var"; then # Export the shlibpath_var. eval "export $shlibpath_var" fi # Restore saved environment variables if test "${save_LC_ALL+set}" = set; then LC_ALL="$save_LC_ALL"; export LC_ALL fi if test "${save_LANG+set}" = set; then LANG="$save_LANG"; export LANG fi # Now prepare to actually exec the command. exec_cmd="\$cmd$args" else # Display what would be done. if test -n "$shlibpath_var"; then eval "\$echo \"\$shlibpath_var=\$$shlibpath_var\"" $echo "export $shlibpath_var" fi $echo "$cmd$args" exit $EXIT_SUCCESS fi ;; # libtool clean and uninstall mode clean | uninstall) modename="$modename: $mode" rm="$nonopt" files= rmforce= exit_status=0 # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" for arg do case $arg in -f) rm="$rm $arg"; rmforce=yes ;; -*) rm="$rm $arg" ;; *) files="$files $arg" ;; esac done if test -z "$rm"; then $echo "$modename: you must specify an RM program" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE fi rmdirs= origobjdir="$objdir" for file in $files; do dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` if test "X$dir" = "X$file"; then dir=. objdir="$origobjdir" else objdir="$dir/$origobjdir" fi name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` test "$mode" = uninstall && objdir="$dir" # Remember objdir for removal later, being careful to avoid duplicates if test "$mode" = clean; then case " $rmdirs " in *" $objdir "*) ;; *) rmdirs="$rmdirs $objdir" ;; esac fi # Don't error if the file doesn't exist and rm -f was used. if (test -L "$file") >/dev/null 2>&1 \ || (test -h "$file") >/dev/null 2>&1 \ || test -f "$file"; then : elif test -d "$file"; then exit_status=1 continue elif test "$rmforce" = yes; then continue fi rmfiles="$file" case $name in *.la) # Possibly a libtool archive, so verify it. if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then . $dir/$name # Delete the libtool libraries and symlinks. for n in $library_names; do rmfiles="$rmfiles $objdir/$n" done test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library" test "$mode" = clean && rmfiles="$rmfiles $objdir/$name $objdir/${name}i" if test "$mode" = uninstall; then if test -n "$library_names"; then # Do each command in the postuninstall commands. cmds=$postuninstall_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" if test "$?" -ne 0 && test "$rmforce" != yes; then exit_status=1 fi done IFS="$save_ifs" fi if test -n "$old_library"; then # Do each command in the old_postuninstall commands. cmds=$old_postuninstall_cmds save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $show "$cmd" $run eval "$cmd" if test "$?" -ne 0 && test "$rmforce" != yes; then exit_status=1 fi done IFS="$save_ifs" fi # FIXME: should reinstall the best remaining shared library. fi fi ;; *.lo) # Possibly a libtool object, so verify it. if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then # Read the .lo file . $dir/$name # Add PIC object to the list of files to remove. if test -n "$pic_object" \ && test "$pic_object" != none; then rmfiles="$rmfiles $dir/$pic_object" fi # Add non-PIC object to the list of files to remove. if test -n "$non_pic_object" \ && test "$non_pic_object" != none; then rmfiles="$rmfiles $dir/$non_pic_object" fi fi ;; *) if test "$mode" = clean ; then noexename=$name case $file in *.exe) file=`$echo $file|${SED} 's,.exe$,,'` noexename=`$echo $name|${SED} 's,.exe$,,'` # $file with .exe has already been added to rmfiles, # add $file without .exe rmfiles="$rmfiles $file" ;; esac # Do a test to see if this is a libtool program. if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then relink_command= . $dir/$noexename # note $name still contains .exe if it was in $file originally # as does the version of $file that was added into $rmfiles rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}" if test "$fast_install" = yes && test -n "$relink_command"; then rmfiles="$rmfiles $objdir/lt-$name" fi if test "X$noexename" != "X$name" ; then rmfiles="$rmfiles $objdir/lt-${noexename}.c" fi fi fi ;; esac $show "$rm $rmfiles" $run $rm $rmfiles || exit_status=1 done objdir="$origobjdir" # Try to remove the ${objdir}s in the directories where we deleted files for dir in $rmdirs; do if test -d "$dir"; then $show "rmdir $dir" $run rmdir $dir >/dev/null 2>&1 fi done exit $exit_status ;; "") $echo "$modename: you must specify a MODE" 1>&2 $echo "$generic_help" 1>&2 exit $EXIT_FAILURE ;; esac if test -z "$exec_cmd"; then $echo "$modename: invalid operation mode \`$mode'" 1>&2 $echo "$generic_help" 1>&2 exit $EXIT_FAILURE fi fi # test -z "$show_help" if test -n "$exec_cmd"; then eval exec $exec_cmd exit $EXIT_FAILURE fi # We need to display help for each of the modes. case $mode in "") $echo \ "Usage: $modename [OPTION]... [MODE-ARG]... Provide generalized library-building support services. --config show all configuration variables --debug enable verbose shell tracing -n, --dry-run display commands without modifying any files --features display basic configuration information and exit --finish same as \`--mode=finish' --help display this help message and exit --mode=MODE use operation mode MODE [default=inferred from MODE-ARGS] --quiet same as \`--silent' --silent don't print informational messages --tag=TAG use configuration variables from tag TAG --version print version information MODE must be one of the following: clean remove files from the build directory compile compile a source file into a libtool object execute automatically set library path, then run a program finish complete the installation of libtool libraries install install libraries or executables link create a library or an executable uninstall remove libraries from an installed directory MODE-ARGS vary depending on the MODE. Try \`$modename --help --mode=MODE' for a more detailed description of MODE. Report bugs to ." exit $EXIT_SUCCESS ;; clean) $echo \ "Usage: $modename [OPTION]... --mode=clean RM [RM-OPTION]... FILE... Remove files from the build directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, object or program, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; compile) $echo \ "Usage: $modename [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE Compile a source file into a libtool library object. This mode accepts the following additional options: -o OUTPUT-FILE set the output file name to OUTPUT-FILE -prefer-pic try to building PIC objects only -prefer-non-pic try to building non-PIC objects only -static always build a \`.o' file suitable for static linking COMPILE-COMMAND is a command to be used in creating a \`standard' object file from the given SOURCEFILE. The output file name is determined by removing the directory component from SOURCEFILE, then substituting the C source code suffix \`.c' with the library object suffix, \`.lo'." ;; execute) $echo \ "Usage: $modename [OPTION]... --mode=execute COMMAND [ARGS]... Automatically set library path, then run a program. This mode accepts the following additional options: -dlopen FILE add the directory containing FILE to the library path This mode sets the library path environment variable according to \`-dlopen' flags. If any of the ARGS are libtool executable wrappers, then they are translated into their corresponding uninstalled binary, and any of their required library directories are added to the library path. Then, COMMAND is executed, with ARGS as arguments." ;; finish) $echo \ "Usage: $modename [OPTION]... --mode=finish [LIBDIR]... Complete the installation of libtool libraries. Each LIBDIR is a directory that contains libtool libraries. The commands that this mode executes may require superuser privileges. Use the \`--dry-run' option if you just want to see what would be executed." ;; install) $echo \ "Usage: $modename [OPTION]... --mode=install INSTALL-COMMAND... Install executables or libraries. INSTALL-COMMAND is the installation command. The first component should be either the \`install' or \`cp' program. The rest of the components are interpreted as arguments to that command (only BSD-compatible install options are recognized)." ;; link) $echo \ "Usage: $modename [OPTION]... --mode=link LINK-COMMAND... Link object files or libraries together to form another library, or to create an executable program. LINK-COMMAND is a command using the C compiler that you would use to create a program from several object files. The following components of LINK-COMMAND are treated specially: -all-static do not do any dynamic linking at all -avoid-version do not add a version suffix if possible -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) -export-symbols SYMFILE try to export only the symbols listed in SYMFILE -export-symbols-regex REGEX try to export only the symbols matching REGEX -LLIBDIR search LIBDIR for required installed libraries -lNAME OUTPUT-FILE requires the installed library libNAME -module build a library that can dlopened -no-fast-install disable the fast-install mode -no-install link a not-installable executable -no-undefined declare that a library does not refer to external symbols -o OUTPUT-FILE create OUTPUT-FILE from the specified objects -objectlist FILE Use a list of object files found in FILE to specify objects -precious-files-regex REGEX don't remove output files matching REGEX -release RELEASE specify package release information -rpath LIBDIR the created library will eventually be installed in LIBDIR -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries -static do not do any dynamic linking of libtool libraries -version-info CURRENT[:REVISION[:AGE]] specify library version info [each variable defaults to 0] All other options (arguments beginning with \`-') are ignored. Every other argument is treated as a filename. Files ending in \`.la' are treated as uninstalled libtool libraries, other files are standard or library object files. If the OUTPUT-FILE ends in \`.la', then a libtool library is created, only library objects (\`.lo' files) may be specified, and \`-rpath' is required, except when creating a convenience library. If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created using \`ar' and \`ranlib', or on Windows using \`lib'. If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file is created, otherwise an executable program is created." ;; uninstall) $echo \ "Usage: $modename [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... Remove libraries from an installation directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; *) $echo "$modename: invalid operation mode \`$mode'" 1>&2 $echo "$help" 1>&2 exit $EXIT_FAILURE ;; esac $echo $echo "Try \`$modename --help' for more information about other modes." exit $EXIT_SUCCESS # The TAGs below are defined such that we never get into a situation # in which we disable both kinds of libraries. Given conflicting # choices, we go for a static library, that is the most portable, # since we can't tell whether shared libraries were disabled because # the user asked for that or because the platform doesn't support # them. This is particularly important on AIX, because we don't # support having both static and shared libraries enabled at the same # time on that platform, so we default to a shared-only configuration. # If a disable-shared tag is given, we'll fallback to a static-only # configuration. But we'll never go from static-only to shared-only. # ### BEGIN LIBTOOL TAG CONFIG: disable-shared build_libtool_libs=no build_old_libs=yes # ### END LIBTOOL TAG CONFIG: disable-shared # ### BEGIN LIBTOOL TAG CONFIG: disable-static build_old_libs=`case $build_libtool_libs in yes) $echo no;; *) $echo yes;; esac` # ### END LIBTOOL TAG CONFIG: disable-static # Local Variables: # mode:shell-script # sh-indentation:2 # End: nagios-4.3.4/tap/missing000077500000000000000000000245331314764422400152030ustar00rootroot00000000000000#! /bin/sh # Common stub for a few missing GNU programs while installing. scriptversion=2004-09-07.08 # Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004 # Free Software Foundation, Inc. # Originally by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try \`$0 --help' for more information" exit 1 fi run=: # In the cases where this matters, `missing' is being run in the # srcdir already. if test -f configure.ac; then configure_ac=configure.ac else configure_ac=configure.in fi msg="missing on your system" case "$1" in --run) # Try to run requested program, and just exit if it succeeds. run= shift "$@" && exit 0 # Exit code 63 means version mismatch. This often happens # when the user try to use an ancient version of a tool on # a file that requires a minimum version. In this case we # we should proceed has if the program had been absent, or # if --run hadn't been passed. if test $? = 63; then run=: msg="probably too old" fi ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an error status if there is no known handling for PROGRAM. Options: -h, --help display this help and exit -v, --version output version information and exit --run try to run the given command, and emulate it if it fails Supported PROGRAM values: aclocal touch file \`aclocal.m4' autoconf touch file \`configure' autoheader touch file \`config.h.in' automake touch all \`Makefile.in' files bison create \`y.tab.[ch]', if possible, from existing .[ch] flex create \`lex.yy.c', if possible, from existing .c help2man touch the output file lex create \`lex.yy.c', if possible, from existing .c makeinfo touch the output file tar try tar, gnutar, gtar, then tar without non-portable flags yacc create \`y.tab.[ch]', if possible, from existing .[ch] Send bug reports to ." exit 0 ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit 0 ;; -*) echo 1>&2 "$0: Unknown \`$1' option" echo 1>&2 "Try \`$0 --help' for more information" exit 1 ;; esac # Now exit if we have it, but it failed. Also exit now if we # don't have it and --version was passed (most likely to detect # the program). case "$1" in lex|yacc) # Not GNU programs, they don't have --version. ;; tar) if test -n "$run"; then echo 1>&2 "ERROR: \`tar' requires --run" exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then exit 1 fi ;; *) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then # Could not run --version or --help. This is probably someone # running `$TOOL --version' or `$TOOL --help' to check whether # $TOOL exists and not knowing $TOOL uses missing. exit 1 fi ;; esac # If it does not exist, or fails to run (possibly an outdated version), # try to emulate it. case "$1" in aclocal*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." touch aclocal.m4 ;; autoconf) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." touch configure ;; autoheader) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acconfig.h' or \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` test -z "$files" && files="config.h" touch_files= for f in $files; do case "$f" in *:*) touch_files="$touch_files "`echo "$f" | sed -e 's/^[^:]*://' -e 's/:.*//'`;; *) touch_files="$touch_files $f.in";; esac done touch $touch_files ;; automake*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." find . -type f -name Makefile.am -print | sed 's/\.am$/.in/' | while read f; do touch "$f"; done ;; autom4te) echo 1>&2 "\ WARNING: \`$1' is needed, but is $msg. You might have modified some files without having the proper tools for further handling them. You can get \`$1' as part of \`Autoconf' from any GNU archive site." file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'` test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo "#! /bin/sh" echo "# Created by GNU Automake missing as a replacement of" echo "# $ $@" echo "exit 0" chmod +x $file exit 1 fi ;; bison|yacc) echo 1>&2 "\ WARNING: \`$1' $msg. You should only need it if you modified a \`.y' file. You may need the \`Bison' package in order for those modifications to take effect. You can get \`Bison' from any GNU archive site." rm -f y.tab.c y.tab.h if [ $# -ne 1 ]; then eval LASTARG="\${$#}" case "$LASTARG" in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" y.tab.h fi ;; esac fi if [ ! -f y.tab.h ]; then echo >y.tab.h fi if [ ! -f y.tab.c ]; then echo 'main() { return 0; }' >y.tab.c fi ;; lex|flex) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.l' file. You may need the \`Flex' package in order for those modifications to take effect. You can get \`Flex' from any GNU archive site." rm -f lex.yy.c if [ $# -ne 1 ]; then eval LASTARG="\${$#}" case "$LASTARG" in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" lex.yy.c fi ;; esac fi if [ ! -f lex.yy.c ]; then echo 'main() { return 0; }' >lex.yy.c fi ;; help2man) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a dependency of a manual page. You may need the \`Help2man' package in order for those modifications to take effect. You can get \`Help2man' from any GNU archive site." file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` if test -z "$file"; then file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'` fi if [ -f "$file" ]; then touch $file else test -z "$file" || exec >$file echo ".ab help2man is required to generate this page" exit 1 fi ;; makeinfo) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.texi' or \`.texinfo' file, or any other file indirectly affecting the aspect of the manual. The spurious call might also be the consequence of using a buggy \`make' (AIX, DU, IRIX). You might want to install the \`Texinfo' package or the \`GNU make' package. Grab either from any GNU archive site." file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` if test -z "$file"; then file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file` fi touch $file ;; tar) shift # We have already tried tar in the generic part. # Look for gnutar/gtar before invocation to avoid ugly error # messages. if (gnutar --version > /dev/null 2>&1); then gnutar "$@" && exit 0 fi if (gtar --version > /dev/null 2>&1); then gtar "$@" && exit 0 fi firstarg="$1" if shift; then case "$firstarg" in *o*) firstarg=`echo "$firstarg" | sed s/o//` tar "$firstarg" "$@" && exit 0 ;; esac case "$firstarg" in *h*) firstarg=`echo "$firstarg" | sed s/h//` tar "$firstarg" "$@" && exit 0 ;; esac fi echo 1>&2 "\ WARNING: I can't seem to be able to run \`tar' with the given arguments. You may want to install GNU tar or Free paxutils, or check the command line arguments." exit 1 ;; *) echo 1>&2 "\ WARNING: \`$1' is needed, and is $msg. You might have modified some files without having the proper tools for further handling them. Check the \`README' file, it often tells you about the needed prerequisites for installing this package. You may also peek at any GNU archive site, in case some other package would contain this missing \`$1' program." exit 1 ;; esac exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: nagios-4.3.4/tap/src/000077500000000000000000000000001314764422400143645ustar00rootroot00000000000000nagios-4.3.4/tap/src/Makefile.am000066400000000000000000000002001314764422400164100ustar00rootroot00000000000000lib_LTLIBRARIES = libtap.la libtap_la_SOURCES = tap.c tap.h man_MANS = tap.3 EXTRA_DIST = $(man_MANS) include_HEADERS = tap.h nagios-4.3.4/tap/src/Makefile.in000066400000000000000000000405021314764422400164320ustar00rootroot00000000000000# Makefile.in generated by automake 1.9.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SOURCES = $(libtap_la_SOURCES) srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = .. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = src DIST_COMMON = $(include_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(man3dir)" \ "$(DESTDIR)$(includedir)" libLTLIBRARIES_INSTALL = $(INSTALL) LTLIBRARIES = $(lib_LTLIBRARIES) libtap_la_LIBADD = am_libtap_la_OBJECTS = tap.lo libtap_la_OBJECTS = $(am_libtap_la_OBJECTS) DEFAULT_INCLUDES = -I. -I$(srcdir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = $(libtap_la_SOURCES) DIST_SOURCES = $(libtap_la_SOURCES) man3dir = $(mandir)/man3 NROFF = nroff MANS = $(man_MANS) includeHEADERS_INSTALL = $(INSTALL_HEADER) HEADERS = $(include_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ lib_LTLIBRARIES = libtap.la libtap_la_SOURCES = tap.c tap.h man_MANS = tap.3 EXTRA_DIST = $(man_MANS) include_HEADERS = tap.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(libdir)" || $(mkdir_p) "$(DESTDIR)$(libdir)" @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ if test -f $$p; then \ f=$(am__strip_dir) \ echo " $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(libdir)/$$f"; \ else :; fi; \ done uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @set -x; list='$(lib_LTLIBRARIES)'; for p in $$list; do \ p=$(am__strip_dir) \ echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$p'"; \ $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$p"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libtap.la: $(libtap_la_OBJECTS) $(libtap_la_DEPENDENCIES) $(LINK) -rpath $(libdir) $(libtap_la_LDFLAGS) $(libtap_la_OBJECTS) $(libtap_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tap.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool uninstall-info-am: install-man3: $(man3_MANS) $(man_MANS) @$(NORMAL_INSTALL) test -z "$(man3dir)" || $(mkdir_p) "$(DESTDIR)$(man3dir)" @list='$(man3_MANS) $(dist_man3_MANS) $(nodist_man3_MANS)'; \ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ for i in $$l2; do \ case "$$i" in \ *.3*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ else file=$$i; fi; \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ case "$$ext" in \ 3*) ;; \ *) ext='3' ;; \ esac; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed -e 's/^.*\///'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man3dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man3dir)/$$inst"; \ done uninstall-man3: @$(NORMAL_UNINSTALL) @list='$(man3_MANS) $(dist_man3_MANS) $(nodist_man3_MANS)'; \ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ for i in $$l2; do \ case "$$i" in \ *.3*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ case "$$ext" in \ 3*) ;; \ *) ext='3' ;; \ esac; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed -e 's/^.*\///'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " rm -f '$(DESTDIR)$(man3dir)/$$inst'"; \ rm -f "$(DESTDIR)$(man3dir)/$$inst"; \ done install-includeHEADERS: $(include_HEADERS) @$(NORMAL_INSTALL) test -z "$(includedir)" || $(mkdir_p) "$(DESTDIR)$(includedir)" @list='$(include_HEADERS)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ f=$(am__strip_dir) \ echo " $(includeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(includedir)/$$f'"; \ $(includeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(includedir)/$$f"; \ done uninstall-includeHEADERS: @$(NORMAL_UNINSTALL) @list='$(include_HEADERS)'; for p in $$list; do \ f=$(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(includedir)/$$f'"; \ rm -f "$(DESTDIR)$(includedir)/$$f"; \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(MANS) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(man3dir)" "$(DESTDIR)$(includedir)"; do \ test -z "$$dir" || $(mkdir_p) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-libtool distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-includeHEADERS install-man install-exec-am: install-libLTLIBRARIES install-info: install-info-am install-man: install-man3 installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-includeHEADERS uninstall-info-am \ uninstall-libLTLIBRARIES uninstall-man uninstall-man: uninstall-man3 .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libLTLIBRARIES clean-libtool ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-exec \ install-exec-am install-includeHEADERS install-info \ install-info-am install-libLTLIBRARIES install-man \ install-man3 install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \ uninstall-am uninstall-includeHEADERS uninstall-info-am \ uninstall-libLTLIBRARIES uninstall-man uninstall-man3 # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: nagios-4.3.4/tap/src/tap.3000066400000000000000000000232401314764422400152350ustar00rootroot00000000000000.Dd December 20, 2004 .Os .Dt TAP 3 .Sh NAME .Nm tap .Nd write tests that implement the Test Anything Protocol .Sh SYNOPSIS .In tap.h .Sh DESCRIPTION The .Nm library provides functions for writing test scripts that produce output consistent with the Test Anything Protocol. A test harness that parses this protocol can run these tests and produce useful reports indicating their success or failure. .Ss PRINTF STRINGS In the descriptions that follow, for any function that takes as the last two parameters .Dq Fa char * , Fa ... it can be assumed that the .Fa char * is a .Fn printf -like format string, and the optional arguments are values to be placed in that string. .Ss TEST PLANS .Bl -tag -width indent .It Xo .Ft int .Fn plan_tests "unsigned int" .Xc .It Xo .Ft int .Fn plan_no_plan "void" .Xc .It Xo .Ft int .Fn plan_skip_all "char *" "..." .Xc .El .Pp You must first specify a test plan. This indicates how many tests you intend to run, and allows the test harness to notice if any tests were missed, or if the test program exited prematurely. .Pp To do this, use .Fn plan_tests , which always returns 0. The function will cause your program to exit prematurely if you specify 0 tests. .Pp In some situations you may not know how many tests you will be running, or you are developing your test program, and do not want to update the .Fn plan_tests parameter every time you make a change. For those situations use .Fn plan_no_plan . It returns 0, and indicates to the test harness that an indeterminate number of tests will be run. .Pp Both .Fn plan_tests and .Fn plan_no_plan will cause your test program to exit prematurely with a diagnostic message if they are called more than once. .Pp If your test program detects at run time that some required functionality is missing (for example, it relies on a database connection which is not present, or a particular configuration option that has not been included in the running kernel) use .Fn plan_skip_all , passing as parameters a string to display indicating the reason for skipping the tests. .Ss SIMPLE TESTS .Bl -tag -width indent .It Xo .Ft unsigned int .Fn ok "expression" "char *" "..." .Xc .It Xo .Ft unsigned int .Fn ok1 "expression" .Xc .It Xo .Ft unsigned int .Fn pass "char *" "..." .Xc .It Xo .Ft unsigned int .Fn fail "char *" "..." .Xc .El .Pp Tests are implemented as expressions checked by calls to the .Fn ok and .Fn ok1 macros. In both cases .Fa expression should evaluate to true if the test succeeded. .Pp .Fn ok allows you to specify a name, or comment, describing the test which will be included in the output. .Fn ok1 is for those times when the expression to be tested is self explanatory and does not need an associated comment. In those cases the test expression becomes the comment. .Pp These four calls are equivalent: .Bd -literal -offset indent int i = 5; ok(i == 5, "i equals 5"); /* Overly verbose */ ok(i == 5, "i equals %d", i); /* Just to demonstrate printf-like behaviour of the test name */ ok(i == 5, "i == 5"); /* Needless repetition */ ok1(i == 5); /* Just right */ .Ed .Pp It is good practice to ensure that the test name describes the meaning behind the test rather than what you are testing. Viz .Bd -literal -offset indent ok(db != NULL, "db is not NULL"); /* Not bad, but */ ok(db != NULL, "Database conn. succeeded"); /* this is better */ .Ed .Pp .Fn ok and .Fn ok1 return 1 if the expression evaluated to true, and 0 if it evaluated to false. This lets you chain calls from .Fn ok to .Fn diag to only produce diagnostic output if the test failed. For example, this code will include diagnostic information about why the database connection failed, but only if the test failed. .Bd -literal -offset indent ok(db != NULL, "Database conn. succeeded") || diag("Database error code: %d", dberrno); .Ed .Pp You also have .Fn pass and .Fn fail . From the Test::More documentation: .Bd -literal -offset indent Sometimes you just want to say that the tests have passed. Usually the case is you've got some complicated condition that is difficult to wedge into an ok(). In this case, you can simply use pass() (to declare the test ok) or fail (for not ok). Use these very, very, very sparingly. .Ed .Pp These are synonyms for ok(1, ...) and ok(0, ...). .Ss SKIPPING TESTS .Bl -tag -width indent .It Xo .Ft int .Fn skip "unsigned int" "char *" "..." .Xc .It Xo .Fn skip_start "expression" "unsigned int" "char *" "..." .Xc .It Xo .Sy skip_end .Xc .El .Pp Sets of tests can be skipped. Ordinarily you would do this because the test can't be run in this particular testing environment. .Pp For example, suppose some tests should be run as root. If the test is not being run as root then the tests should be skipped. In this implementation, skipped tests are flagged as being ok, with a special message indicating that they were skipped. It is your responsibility to ensure that the number of tests skipped (the first parameter to .Fn skip ) is correct for the number of tests to skip. .Pp One way of implementing this is with a .Dq do { } while(0); loop, or an .Dq if( ) { } else { } construct, to ensure that there are no additional side effects from the skipped tests. .Bd -literal -offset indent if(getuid() != 0) { skip(1, "because test only works as root"); } else { ok(do_something_as_root() == 0, "Did something as root"); } .Ed .Pp Two macros are provided to assist with this. The previous example could be re-written as follows. .Bd -literal -offset indent skip_start(getuid() != 0, 1, "because test only works as root"); ok(do_something_as_root() == 0, "Did something as root"); skip_end; /* It's a macro, no parentheses */ .Ed .Ss MARKING TESTS AS Dq TODO .Bl -tag -width indent .It Xo .Ft void .Fn todo_start "char *" "..." .Xc .It Xo .Ft void .Fn todo_end "void" .Xc .El .Pp Sets of tests can be flagged as being .Dq TODO . These are tests that you expect to fail, probably because you haven't fixed a bug, or finished a new feature yet. These tests will still be run, but with additional output that indicates that they are expected to fail. Should a test start to succeed unexpectedly, tools like .Xr prove 1 will indicate this, and you can move the test out of the todo block. This is much more useful than simply commenting out (or .Dq #ifdef 0 ... #endif ) the tests. .Bd -literal -offset indent todo_start("dwim() not returning true yet"); ok(dwim(), "Did what the user wanted"); todo_end(); .Ed .Pp Should .Fn dwim ever start succeeding you will know about it as soon as you run the tests. Note that .Em unlike the .Fn skip_* family, additional code between .Fn todo_start and .Fn todo_end .Em is executed. .Ss SKIP vs. TODO From the Test::More documentation; .Bd -literal -offset indent If it's something the user might not be able to do, use SKIP. This includes optional modules that aren't installed, running under an OS that doesn't have some feature (like fork() or symlinks), or maybe you need an Internet connection and one isn't available. If it's something the programmer hasn't done yet, use TODO. This is for any code you haven't written yet, or bugs you have yet to fix, but want to put tests in your testing script (always a good idea). .Ed .Ss DIAGNOSTIC OUTPUT .Bl -tag -width indent .It Xo .Fr unsigned int .Fn diag "char *" "..." .Xc .El .Pp If your tests need to produce diagnostic output, use .Fn diag . It ensures that the output will not be considered by the TAP test harness. .Fn diag adds the necessary trailing .Dq \en for you. .Bd -literal -offset indent diag("Expected return code 0, got return code %d", rcode); .Ed .Pp .Fn diag always returns 0. .Ss EXIT STATUS .Bl -tag -width indent .It Xo .Fr int .Fn exit_status void .Xc .El .Pp For maximum compatability your test program should return a particular exit code. This is calculated by .Fn exit_status so it is sufficient to always return from .Fn main with either .Dq return exit_status(); or .Dq exit(exit_status()); as appropriate. .Sh EXAMPLES The .Pa tests directory in the source distribution contains numerous tests of .Nm functionality, written using .Nm . Examine them for examples of how to construct test suites. .Sh COMPATABILITY .Nm strives to be compatible with the Perl Test::More and Test::Harness modules. The test suite verifies that .Nm is bug-for-bug compatible with their behaviour. This is why some functions which would more naturally return nothing return constant values. .Pp If the .Lb libpthread is found at compile time, .Nm .Em should be thread safe. Indications to the contrary (and test cases that expose incorrect behaviour) are very welcome. .Sh SEE ALSO .Xr Test::More 1 , .Xr Test::Harness 1 , .Xr prove 1 .Sh STANDARDS .Nm requires a .St -isoC-99 compiler. Some of the .Nm functionality is implemented as variadic macros, and that functionality was not formally codified until C99. Patches to use .Nm with earlier compilers that have their own implementation of variadic macros will be gratefully received. .Sh HISTORY .Nm was written to help improve the quality and coverage of the FreeBSD regression test suite, and released in the hope that others find it a useful tool to help improve the quality of their code. .Sh AUTHORS .An "Nik Clayton" Aq nik@ngo.org.uk , .Aq nik@FreeBSD.org .Pp .Nm would not exist without the efforts of .An "Michael G Schwern" Aq schqern@pobox.com , .An "Andy Lester" Aq andy@petdance.com , and the countless others who have worked on the Perl QA programme. .Sh BUGS Ideally, running the tests would have no side effects on the behaviour of the application you are testing. However, it is not always possible to avoid them. The following side effects of using .Nm are known. .Bl -bullet -offset indent .It stdout is set to unbuffered mode after calling any of the .Fn plan_* functions. .El nagios-4.3.4/tap/src/tap.c000066400000000000000000000205641314764422400153230ustar00rootroot00000000000000/*- * Copyright (c) 2004 Nik Clayton * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #include #include #include #include #include "tap.h" static int no_plan = 0; static int skip_all = 0; static int have_plan = 0; static unsigned int test_count = 0; /* Number of tests that have been run */ static unsigned int e_tests = 0; /* Expected number of tests to run */ static unsigned int failures = 0; /* Number of tests that failed */ static char *todo_msg = NULL; static char *todo_msg_fixed = "libtap malloc issue"; static int todo = 0; static int test_died = 0; /* Encapsulate the pthread code in a conditional. In the absence of libpthread the code does nothing */ /* Ton: Remove LIBPTHREAD as locking occurs */ #ifdef HAVE_LIBPTHREAD_REMOVED #include static pthread_mutex_t M = PTHREAD_MUTEX_INITIALIZER; # define LOCK pthread_mutex_lock(&M); # define UNLOCK pthread_mutex_unlock(&M); #else # define LOCK # define UNLOCK #endif static void _expected_tests(unsigned int); static void _tap_init(void); static void _cleanup(void); /* * Generate a test result. * * ok -- boolean, indicates whether or not the test passed. * test_name -- the name of the test, may be NULL * test_comment -- a comment to print afterwards, may be NULL */ unsigned int _gen_result(int ok, const char *func, char *file, unsigned int line, char *test_name, ...) { va_list ap; char *local_test_name = NULL; char *c; int name_is_digits; LOCK; test_count++; /* Start by taking the test name and performing any printf() expansions on it */ if(test_name != NULL) { va_start(ap, test_name); vasprintf(&local_test_name, test_name, ap); va_end(ap); /* Make sure the test name contains more than digits and spaces. Emit an error message and exit if it does */ if(local_test_name) { name_is_digits = 1; for(c = local_test_name; *c != '\0'; c++) { if(!isdigit(*c) && !isspace(*c)) { name_is_digits = 0; break; } } if(name_is_digits) { diag(" You named your test '%s'. You shouldn't use numbers for your test names.", local_test_name); diag(" Very confusing."); } } } if(!ok) { printf("not "); failures++; } printf("ok %d", test_count); if(test_name != NULL) { printf(" - "); /* Print the test name, escaping any '#' characters it might contain */ if(local_test_name != NULL) { flockfile(stdout); for(c = local_test_name; *c != '\0'; c++) { if(*c == '#') fputc('\\', stdout); fputc((int)*c, stdout); } funlockfile(stdout); } else { /* vasprintf() failed, use a fixed message */ printf("%s", todo_msg_fixed); } } /* If we're in a todo_start() block then flag the test as being TODO. todo_msg should contain the message to print at this point. If it's NULL then asprintf() failed, and we should use the fixed message. This is not counted as a failure, so decrement the counter if the test failed. */ if(todo) { printf(" # TODO %s", todo_msg ? todo_msg : todo_msg_fixed); if(!ok) failures--; } printf("\n"); if(!ok) diag(" Failed %stest (%s:%s() at line %d)", todo ? "(TODO) " : "", file, func, line); free(local_test_name); UNLOCK; /* We only care (when testing) that ok is positive, but here we specifically only want to return 1 or 0 */ return ok ? 1 : 0; } /* * Initialise the TAP library. Will only do so once, however many times it's * called. */ void _tap_init(void) { static int run_once = 0; LOCK; if(!run_once) { atexit(_cleanup); /* stdout needs to be unbuffered so that the output appears in the same place relative to stderr output as it does with Test::Harness */ setbuf(stdout, 0); run_once = 1; } UNLOCK; } /* * Note that there's no plan. */ int plan_no_plan(void) { LOCK; _tap_init(); if(have_plan != 0) { fprintf(stderr, "You tried to plan twice!\n"); test_died = 1; UNLOCK; exit(255); } have_plan = 1; no_plan = 1; UNLOCK; return 0; } /* * Note that the plan is to skip all tests */ int plan_skip_all(char *reason) { LOCK; _tap_init(); skip_all = 1; printf("1..0"); if(reason != NULL) printf(" # Skip %s", reason); printf("\n"); UNLOCK; exit(0); } /* * Note the number of tests that will be run. */ int plan_tests(unsigned int tests) { LOCK; _tap_init(); if(have_plan != 0) { fprintf(stderr, "You tried to plan twice!\n"); test_died = 1; UNLOCK; exit(255); } if(tests == 0) { fprintf(stderr, "You said to run 0 tests! You've got to run something.\n"); test_died = 1; UNLOCK; exit(255); } have_plan = 1; _expected_tests(tests); UNLOCK; return 0; } unsigned int diag(char *fmt, ...) { va_list ap; LOCK; fputs("# ", stderr); va_start(ap, fmt); vfprintf(stderr, fmt, ap); va_end(ap); fputs("\n", stderr); UNLOCK; return 0; } void _expected_tests(unsigned int tests) { LOCK; printf("1..%d\n", tests); e_tests = tests; UNLOCK; } int skip(unsigned int n, char *fmt, ...) { va_list ap; char *skip_msg; LOCK; va_start(ap, fmt); asprintf(&skip_msg, fmt, ap); va_end(ap); while(n-- > 0) { test_count++; printf("ok %d # skip %s\n", test_count, skip_msg != NULL ? skip_msg : "libtap():malloc() failed"); } free(skip_msg); UNLOCK; return 1; } void todo_start(char *fmt, ...) { va_list ap; LOCK; va_start(ap, fmt); vasprintf(&todo_msg, fmt, ap); va_end(ap); todo = 1; UNLOCK; } void todo_end(void) { LOCK; todo = 0; free(todo_msg); UNLOCK; } int exit_status(void) { int r; LOCK; /* If there's no plan, just return the number of failures */ if(no_plan || !have_plan) { UNLOCK; return failures; } /* Ran too many tests? Return the number of tests that were run that shouldn't have been */ if(e_tests < test_count) { r = test_count - e_tests; UNLOCK; return r; } /* Return the number of tests that failed + the number of tests that weren't run */ r = failures + e_tests - test_count; UNLOCK; return r; } /* * Cleanup at the end of the run, produce any final output that might be * required. */ void _cleanup(void) { LOCK; /* If plan_no_plan() wasn't called, and we don't have a plan, and we're not skipping everything, then something happened before we could produce any output */ if(!no_plan && !have_plan && !skip_all) { diag("Looks like your test died before it could output anything."); UNLOCK; return; } if(test_died) { diag("Looks like your test died just after %d.", test_count); UNLOCK; return; } /* No plan provided, but now we know how many tests were run, and can print the header at the end */ if(!skip_all && (no_plan || !have_plan)) { printf("1..%d\n", test_count); } if((have_plan && !no_plan) && e_tests < test_count) { diag("Looks like you planned %d tests but ran %d extra.", e_tests, test_count - e_tests); UNLOCK; return; } if((have_plan || !no_plan) && e_tests > test_count) { diag("Looks like you planned %d tests but only ran %d.", e_tests, test_count); UNLOCK; return; } if(failures) diag("Looks like you failed %d tests of %d.", failures, test_count); UNLOCK; } nagios-4.3.4/tap/src/tap.h000066400000000000000000000061741314764422400153310ustar00rootroot00000000000000/*- * Copyright (c) 2004 Nik Clayton * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ /* '## __VA_ARGS__' is a gcc'ism. C99 doesn't allow the token pasting and requires the caller to add the final comma if they've omitted the optional arguments */ #ifdef __GNUC__ # define ok(e, test, ...) ((e) ? \ _gen_result(1, __func__, __FILE__, __LINE__, \ test, ## __VA_ARGS__) : \ _gen_result(0, __func__, __FILE__, __LINE__, \ test, ## __VA_ARGS__)) # define ok1(e) ((e) ? \ _gen_result(1, __func__, __FILE__, __LINE__, "%s", #e) : \ _gen_result(0, __func__, __FILE__, __LINE__, "%s", #e)) # define pass(test, ...) ok(1, test, ## __VA_ARGS__); # define fail(test, ...) ok(0, test, ## __VA_ARGS__); # define skip_start(test, n, fmt, ...) \ do { \ if((test)) { \ skip(n, fmt, ## __VA_ARGS__); \ continue; \ } #elif __STDC_VERSION__ >= 199901L /* __GNUC__ */ # define ok(e, ...) ((e) ? \ _gen_result(1, __func__, __FILE__, __LINE__, \ __VA_ARGS__) : \ _gen_result(0, __func__, __FILE__, __LINE__, \ __VA_ARGS__)) # define ok1(e) ((e) ? \ _gen_result(1, __func__, __FILE__, __LINE__, "%s", #e) : \ _gen_result(0, __func__, __FILE__, __LINE__, "%s", #e)) # define pass(...) ok(1, __VA_ARGS__); # define fail(...) ok(0, __VA_ARGS__); # define skip_start(test, n, ...) \ do { \ if((test)) { \ skip(n, __VA_ARGS__); \ continue; \ } #else /* __STDC_VERSION__ */ # error "Needs gcc or C99 compiler for variadic macros." #endif /* __STDC_VERSION__ */ # define skip_end } while(0); unsigned int _gen_result(int, const char *, char *, unsigned int, char *, ...); int plan_no_plan(void); int plan_skip_all(char *); int plan_tests(unsigned int); unsigned int diag(char *, ...); int skip(unsigned int, char *, ...); void todo_start(char *, ...); void todo_end(void); int exit_status(void); nagios-4.3.4/tap/tests/000077500000000000000000000000001314764422400147375ustar00rootroot00000000000000nagios-4.3.4/tap/tests/Makefile.am000066400000000000000000000001461314764422400167740ustar00rootroot00000000000000SUBDIRS= diag SUBDIRS+= fail SUBDIRS+= ok SUBDIRS+= pass SUBDIRS+= plan SUBDIRS+= skip SUBDIRS+= todo nagios-4.3.4/tap/tests/Makefile.in000066400000000000000000000325541314764422400170150ustar00rootroot00000000000000# Makefile.in generated by automake 1.9.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = .. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = tests DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-exec-recursive install-info-recursive \ install-recursive installcheck-recursive installdirs-recursive \ pdf-recursive ps-recursive uninstall-info-recursive \ uninstall-recursive ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ SUBDIRS = diag fail ok pass plan skip todo all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --foreign tests/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool uninstall-info-am: # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @set fnord $$MAKEFLAGS; amf=$$2; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" mostlyclean-recursive clean-recursive distclean-recursive \ maintainer-clean-recursive: @set fnord $$MAKEFLAGS; amf=$$2; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(mkdir_p) "$(distdir)/$$subdir" \ || exit 1; \ distdir=`$(am__cd) $(distdir) && pwd`; \ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ (cd $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$top_distdir" \ distdir="$$distdir/$$subdir" \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-libtool \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive info: info-recursive info-am: install-data-am: install-exec-am: install-info: install-info-recursive install-man: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-info-am uninstall-info: uninstall-info-recursive .PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \ clean clean-generic clean-libtool clean-recursive ctags \ ctags-recursive distclean distclean-generic distclean-libtool \ distclean-recursive distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-exec install-exec-am install-info \ install-info-am install-man install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic maintainer-clean-recursive \ mostlyclean mostlyclean-generic mostlyclean-libtool \ mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: nagios-4.3.4/tap/tests/README000066400000000000000000000010011314764422400156070ustar00rootroot00000000000000Most of the tests follow the same pattern. * test.pl that uses Test::More, and demonstrates whatever functionality that we're trying to test. This is the reference code. * test.c, which tests the libtap reimplementation of the same functionality. * test.t, which compiles the .c program, runs both test scripts, and then diffs their output to make sure it's identical. Right now, test.t is identical in every directory. This sucks somewhat. It should either be a symlink to a common script nagios-4.3.4/tap/tests/diag/000077500000000000000000000000001314764422400156435ustar00rootroot00000000000000nagios-4.3.4/tap/tests/diag/Makefile.am000066400000000000000000000003461314764422400177020ustar00rootroot00000000000000 TESTS = test.t TESTS_ENVIRONMENT = $(SHELL) EXTRA_DIST = $(TESTS) test.pl check_PROGRAMS = test test_CFLAGS = -g -I../../src test_LDFLAGS = -L../../src test_LDADD = -ltap CLEANFILES = test.o test.c.out test.pl.out nagios-4.3.4/tap/tests/diag/Makefile.in000066400000000000000000000404151314764422400177140ustar00rootroot00000000000000# Makefile.in generated by automake 1.9.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SOURCES = test.c srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../.. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) subdir = tests/diag DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = test_SOURCES = test.c test_OBJECTS = test-test.$(OBJEXT) test_DEPENDENCIES = DEFAULT_INCLUDES = -I. -I$(srcdir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = test.c DIST_SOURCES = test.c ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ TESTS = test.t TESTS_ENVIRONMENT = $(SHELL) EXTRA_DIST = $(TESTS) test.pl test_CFLAGS = -g -I../../src test_LDFLAGS = -L../../src test_LDADD = -ltap CLEANFILES = test.o test.c.out test.pl.out all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/diag/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --foreign tests/diag/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; for p in $$list; do \ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ echo " rm -f $$p $$f"; \ rm -f $$p $$f ; \ done test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) @rm -f test$(EXEEXT) $(LINK) $(test_LDFLAGS) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< test-test.o: test.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_CFLAGS) $(CFLAGS) -MT test-test.o -MD -MP -MF "$(DEPDIR)/test-test.Tpo" -c -o test-test.o `test -f 'test.c' || echo '$(srcdir)/'`test.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/test-test.Tpo" "$(DEPDIR)/test-test.Po"; else rm -f "$(DEPDIR)/test-test.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test.c' object='test-test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_CFLAGS) $(CFLAGS) -c -o test-test.o `test -f 'test.c' || echo '$(srcdir)/'`test.c test-test.obj: test.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_CFLAGS) $(CFLAGS) -MT test-test.obj -MD -MP -MF "$(DEPDIR)/test-test.Tpo" -c -o test-test.obj `if test -f 'test.c'; then $(CYGPATH_W) 'test.c'; else $(CYGPATH_W) '$(srcdir)/test.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/test-test.Tpo" "$(DEPDIR)/test-test.Po"; else rm -f "$(DEPDIR)/test-test.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test.c' object='test-test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_CFLAGS) $(CFLAGS) -c -o test-test.obj `if test -f 'test.c'; then $(CYGPATH_W) 'test.c'; else $(CYGPATH_W) '$(srcdir)/test.c'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool uninstall-info-am: ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags check-TESTS: $(TESTS) @failed=0; all=0; xfail=0; xpass=0; skip=0; \ srcdir=$(srcdir); export srcdir; \ list='$(TESTS)'; \ if test -n "$$list"; then \ for tst in $$list; do \ if test -f ./$$tst; then dir=./; \ elif test -f $$tst; then dir=; \ else dir="$(srcdir)/"; fi; \ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *" $$tst "*) \ xpass=`expr $$xpass + 1`; \ failed=`expr $$failed + 1`; \ echo "XPASS: $$tst"; \ ;; \ *) \ echo "PASS: $$tst"; \ ;; \ esac; \ elif test $$? -ne 77; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *" $$tst "*) \ xfail=`expr $$xfail + 1`; \ echo "XFAIL: $$tst"; \ ;; \ *) \ failed=`expr $$failed + 1`; \ echo "FAIL: $$tst"; \ ;; \ esac; \ else \ skip=`expr $$skip + 1`; \ echo "SKIP: $$tst"; \ fi; \ done; \ if test "$$failed" -eq 0; then \ if test "$$xfail" -eq 0; then \ banner="All $$all tests passed"; \ else \ banner="All $$all tests behaved as expected ($$xfail expected failures)"; \ fi; \ else \ if test "$$xpass" -eq 0; then \ banner="$$failed of $$all tests failed"; \ else \ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \ fi; \ fi; \ dashes="$$banner"; \ skipped=""; \ if test "$$skip" -ne 0; then \ skipped="($$skip tests were not run)"; \ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$skipped"; \ fi; \ report=""; \ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ report="Please report to $(PACKAGE_BUGREPORT)"; \ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$report"; \ fi; \ dashes=`echo "$$dashes" | sed s/./=/g`; \ echo "$$dashes"; \ echo "$$banner"; \ test -z "$$skipped" || echo "$$skipped"; \ test -z "$$report" || echo "$$report"; \ echo "$$dashes"; \ test "$$failed" -eq 0; \ else :; fi distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-libtool distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-info-am .PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool ctags \ distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-exec install-exec-am install-info \ install-info-am install-man install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: nagios-4.3.4/tap/tests/diag/test.c000066400000000000000000000032651314764422400167740ustar00rootroot00000000000000/*- * Copyright (c) 2004 Nik Clayton * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #include #include "tap.h" int main(int argc, char *argv[]) { unsigned int rc = 0; plan_tests(2); rc = diag("A diagnostic message"); diag("Returned: %d", rc); /* Make sure the failure is passed through */ ok(1, "test 1") || diag("ok() failed, and shouldn't"); ok(0, "test 2") || diag("ok() passed, and shouldn't"); return exit_status(); } nagios-4.3.4/tap/tests/diag/test.pl000066400000000000000000000004041314764422400171550ustar00rootroot00000000000000#!/usr/bin/perl use warnings; use strict; use Test::More; my $rc = 0; plan tests => 2; $rc = diag("A diagnostic message"); diag("Returned: $rc"); ok(1, 'test 1') or diag "ok() failed, and shouldn't"; ok(0, 'test 2') or diag "ok() passed, and shouldn't"; nagios-4.3.4/tap/tests/diag/test.t000066400000000000000000000011021314764422400170010ustar00rootroot00000000000000#!/bin/sh cd `dirname $0` echo '1..2' make 2>&1 > /dev/null perl ./test.pl 2>&1 | sed -e 's/# Failed test \(.*\)/# Failed test ()/' > test.pl.out perlstatus=$? ./test 2>&1 | sed -e 's/# Failed test \(.*\)/# Failed test ()/' > test.c.out cstatus=$? diff -u test.pl.out test.c.out if [ $? -eq 0 ]; then echo 'ok 1 - output is identical' else echo 'not ok 1 - output is identical' fi if [ $perlstatus -eq $cstatus ]; then echo 'ok 2 - status code' else echo 'not ok 2 - status code' echo "# perlstatus = $perlstatus" echo "# cstatus = $cstatus" fi nagios-4.3.4/tap/tests/fail/000077500000000000000000000000001314764422400156525ustar00rootroot00000000000000nagios-4.3.4/tap/tests/fail/Makefile.am000066400000000000000000000003461314764422400177110ustar00rootroot00000000000000 TESTS = test.t TESTS_ENVIRONMENT = $(SHELL) EXTRA_DIST = $(TESTS) test.pl check_PROGRAMS = test test_CFLAGS = -g -I../../src test_LDFLAGS = -L../../src test_LDADD = -ltap CLEANFILES = test.o test.c.out test.pl.out nagios-4.3.4/tap/tests/fail/Makefile.in000066400000000000000000000404151314764422400177230ustar00rootroot00000000000000# Makefile.in generated by automake 1.9.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SOURCES = test.c srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../.. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) subdir = tests/fail DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = test_SOURCES = test.c test_OBJECTS = test-test.$(OBJEXT) test_DEPENDENCIES = DEFAULT_INCLUDES = -I. -I$(srcdir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = test.c DIST_SOURCES = test.c ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ TESTS = test.t TESTS_ENVIRONMENT = $(SHELL) EXTRA_DIST = $(TESTS) test.pl test_CFLAGS = -g -I../../src test_LDFLAGS = -L../../src test_LDADD = -ltap CLEANFILES = test.o test.c.out test.pl.out all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/fail/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --foreign tests/fail/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; for p in $$list; do \ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ echo " rm -f $$p $$f"; \ rm -f $$p $$f ; \ done test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) @rm -f test$(EXEEXT) $(LINK) $(test_LDFLAGS) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< test-test.o: test.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_CFLAGS) $(CFLAGS) -MT test-test.o -MD -MP -MF "$(DEPDIR)/test-test.Tpo" -c -o test-test.o `test -f 'test.c' || echo '$(srcdir)/'`test.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/test-test.Tpo" "$(DEPDIR)/test-test.Po"; else rm -f "$(DEPDIR)/test-test.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test.c' object='test-test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_CFLAGS) $(CFLAGS) -c -o test-test.o `test -f 'test.c' || echo '$(srcdir)/'`test.c test-test.obj: test.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_CFLAGS) $(CFLAGS) -MT test-test.obj -MD -MP -MF "$(DEPDIR)/test-test.Tpo" -c -o test-test.obj `if test -f 'test.c'; then $(CYGPATH_W) 'test.c'; else $(CYGPATH_W) '$(srcdir)/test.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/test-test.Tpo" "$(DEPDIR)/test-test.Po"; else rm -f "$(DEPDIR)/test-test.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test.c' object='test-test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_CFLAGS) $(CFLAGS) -c -o test-test.obj `if test -f 'test.c'; then $(CYGPATH_W) 'test.c'; else $(CYGPATH_W) '$(srcdir)/test.c'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool uninstall-info-am: ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags check-TESTS: $(TESTS) @failed=0; all=0; xfail=0; xpass=0; skip=0; \ srcdir=$(srcdir); export srcdir; \ list='$(TESTS)'; \ if test -n "$$list"; then \ for tst in $$list; do \ if test -f ./$$tst; then dir=./; \ elif test -f $$tst; then dir=; \ else dir="$(srcdir)/"; fi; \ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *" $$tst "*) \ xpass=`expr $$xpass + 1`; \ failed=`expr $$failed + 1`; \ echo "XPASS: $$tst"; \ ;; \ *) \ echo "PASS: $$tst"; \ ;; \ esac; \ elif test $$? -ne 77; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *" $$tst "*) \ xfail=`expr $$xfail + 1`; \ echo "XFAIL: $$tst"; \ ;; \ *) \ failed=`expr $$failed + 1`; \ echo "FAIL: $$tst"; \ ;; \ esac; \ else \ skip=`expr $$skip + 1`; \ echo "SKIP: $$tst"; \ fi; \ done; \ if test "$$failed" -eq 0; then \ if test "$$xfail" -eq 0; then \ banner="All $$all tests passed"; \ else \ banner="All $$all tests behaved as expected ($$xfail expected failures)"; \ fi; \ else \ if test "$$xpass" -eq 0; then \ banner="$$failed of $$all tests failed"; \ else \ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \ fi; \ fi; \ dashes="$$banner"; \ skipped=""; \ if test "$$skip" -ne 0; then \ skipped="($$skip tests were not run)"; \ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$skipped"; \ fi; \ report=""; \ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ report="Please report to $(PACKAGE_BUGREPORT)"; \ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$report"; \ fi; \ dashes=`echo "$$dashes" | sed s/./=/g`; \ echo "$$dashes"; \ echo "$$banner"; \ test -z "$$skipped" || echo "$$skipped"; \ test -z "$$report" || echo "$$report"; \ echo "$$dashes"; \ test "$$failed" -eq 0; \ else :; fi distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-libtool distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-info-am .PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool ctags \ distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-exec install-exec-am install-info \ install-info-am install-man install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: nagios-4.3.4/tap/tests/fail/test.c000066400000000000000000000031751314764422400170030ustar00rootroot00000000000000/*- * Copyright (c) 2004 Nik Clayton * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #include #include "tap.h" int main(int argc, char *argv[]) { unsigned int rc = 0; rc = plan_tests(2); diag("Returned: %d", rc); rc = fail("test to fail"); diag("Returned: %d", rc); rc = fail("test to fail %s", "with extra string"); diag("Returned: %d", rc); return exit_status(); } nagios-4.3.4/tap/tests/fail/test.pl000066400000000000000000000004041314764422400171640ustar00rootroot00000000000000#!/usr/bin/perl use warnings; use strict; use Test::More; my $rc = 0; $rc = plan tests => 2; diag("Returned: " . sprintf('%d', $rc)); $rc = fail('test to fail'); diag("Returned: $rc"); $rc = fail('test to fail with extra string'); diag("Returned: $rc"); nagios-4.3.4/tap/tests/fail/test.t000066400000000000000000000011021314764422400170100ustar00rootroot00000000000000#!/bin/sh cd `dirname $0` echo '1..2' make 2>&1 > /dev/null perl ./test.pl 2>&1 | sed -e 's/# Failed test \(.*\)/# Failed test ()/' > test.pl.out perlstatus=$? ./test 2>&1 | sed -e 's/# Failed test \(.*\)/# Failed test ()/' > test.c.out cstatus=$? diff -u test.pl.out test.c.out if [ $? -eq 0 ]; then echo 'ok 1 - output is identical' else echo 'not ok 1 - output is identical' fi if [ $perlstatus -eq $cstatus ]; then echo 'ok 2 - status code' else echo 'not ok 2 - status code' echo "# perlstatus = $perlstatus" echo "# cstatus = $cstatus" fi nagios-4.3.4/tap/tests/ok/000077500000000000000000000000001314764422400153505ustar00rootroot00000000000000nagios-4.3.4/tap/tests/ok/Makefile.am000066400000000000000000000000671314764422400174070ustar00rootroot00000000000000SUBDIRS = ok SUBDIRS += ok-hash SUBDIRS += ok-numeric nagios-4.3.4/tap/tests/ok/Makefile.in000066400000000000000000000325461314764422400174270ustar00rootroot00000000000000# Makefile.in generated by automake 1.9.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../.. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = tests/ok DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-exec-recursive install-info-recursive \ install-recursive installcheck-recursive installdirs-recursive \ pdf-recursive ps-recursive uninstall-info-recursive \ uninstall-recursive ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ SUBDIRS = ok ok-hash ok-numeric all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/ok/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --foreign tests/ok/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool uninstall-info-am: # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @set fnord $$MAKEFLAGS; amf=$$2; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" mostlyclean-recursive clean-recursive distclean-recursive \ maintainer-clean-recursive: @set fnord $$MAKEFLAGS; amf=$$2; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(mkdir_p) "$(distdir)/$$subdir" \ || exit 1; \ distdir=`$(am__cd) $(distdir) && pwd`; \ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ (cd $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$top_distdir" \ distdir="$$distdir/$$subdir" \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-libtool \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive info: info-recursive info-am: install-data-am: install-exec-am: install-info: install-info-recursive install-man: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-info-am uninstall-info: uninstall-info-recursive .PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \ clean clean-generic clean-libtool clean-recursive ctags \ ctags-recursive distclean distclean-generic distclean-libtool \ distclean-recursive distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-exec install-exec-am install-info \ install-info-am install-man install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic maintainer-clean-recursive \ mostlyclean mostlyclean-generic mostlyclean-libtool \ mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: nagios-4.3.4/tap/tests/ok/ok-hash/000077500000000000000000000000001314764422400167025ustar00rootroot00000000000000nagios-4.3.4/tap/tests/ok/ok-hash/Makefile.am000066400000000000000000000003541314764422400207400ustar00rootroot00000000000000 TESTS = test.t TESTS_ENVIRONMENT = $(SHELL) EXTRA_DIST = $(TESTS) test.pl check_PROGRAMS = test test_CFLAGS = -g -I../../../src test_LDFLAGS = -L../../../src test_LDADD = -ltap CLEANFILES = test.o test.c.out test.pl.out nagios-4.3.4/tap/tests/ok/ok-hash/Makefile.in000066400000000000000000000404501314764422400207520ustar00rootroot00000000000000# Makefile.in generated by automake 1.9.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SOURCES = test.c srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../../.. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) subdir = tests/ok/ok-hash DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = test_SOURCES = test.c test_OBJECTS = test-test.$(OBJEXT) test_DEPENDENCIES = DEFAULT_INCLUDES = -I. -I$(srcdir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = test.c DIST_SOURCES = test.c ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ TESTS = test.t TESTS_ENVIRONMENT = $(SHELL) EXTRA_DIST = $(TESTS) test.pl test_CFLAGS = -g -I../../../src test_LDFLAGS = -L../../../src test_LDADD = -ltap CLEANFILES = test.o test.c.out test.pl.out all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/ok/ok-hash/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --foreign tests/ok/ok-hash/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; for p in $$list; do \ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ echo " rm -f $$p $$f"; \ rm -f $$p $$f ; \ done test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) @rm -f test$(EXEEXT) $(LINK) $(test_LDFLAGS) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< test-test.o: test.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_CFLAGS) $(CFLAGS) -MT test-test.o -MD -MP -MF "$(DEPDIR)/test-test.Tpo" -c -o test-test.o `test -f 'test.c' || echo '$(srcdir)/'`test.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/test-test.Tpo" "$(DEPDIR)/test-test.Po"; else rm -f "$(DEPDIR)/test-test.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test.c' object='test-test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_CFLAGS) $(CFLAGS) -c -o test-test.o `test -f 'test.c' || echo '$(srcdir)/'`test.c test-test.obj: test.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_CFLAGS) $(CFLAGS) -MT test-test.obj -MD -MP -MF "$(DEPDIR)/test-test.Tpo" -c -o test-test.obj `if test -f 'test.c'; then $(CYGPATH_W) 'test.c'; else $(CYGPATH_W) '$(srcdir)/test.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/test-test.Tpo" "$(DEPDIR)/test-test.Po"; else rm -f "$(DEPDIR)/test-test.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test.c' object='test-test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_CFLAGS) $(CFLAGS) -c -o test-test.obj `if test -f 'test.c'; then $(CYGPATH_W) 'test.c'; else $(CYGPATH_W) '$(srcdir)/test.c'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool uninstall-info-am: ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags check-TESTS: $(TESTS) @failed=0; all=0; xfail=0; xpass=0; skip=0; \ srcdir=$(srcdir); export srcdir; \ list='$(TESTS)'; \ if test -n "$$list"; then \ for tst in $$list; do \ if test -f ./$$tst; then dir=./; \ elif test -f $$tst; then dir=; \ else dir="$(srcdir)/"; fi; \ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *" $$tst "*) \ xpass=`expr $$xpass + 1`; \ failed=`expr $$failed + 1`; \ echo "XPASS: $$tst"; \ ;; \ *) \ echo "PASS: $$tst"; \ ;; \ esac; \ elif test $$? -ne 77; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *" $$tst "*) \ xfail=`expr $$xfail + 1`; \ echo "XFAIL: $$tst"; \ ;; \ *) \ failed=`expr $$failed + 1`; \ echo "FAIL: $$tst"; \ ;; \ esac; \ else \ skip=`expr $$skip + 1`; \ echo "SKIP: $$tst"; \ fi; \ done; \ if test "$$failed" -eq 0; then \ if test "$$xfail" -eq 0; then \ banner="All $$all tests passed"; \ else \ banner="All $$all tests behaved as expected ($$xfail expected failures)"; \ fi; \ else \ if test "$$xpass" -eq 0; then \ banner="$$failed of $$all tests failed"; \ else \ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \ fi; \ fi; \ dashes="$$banner"; \ skipped=""; \ if test "$$skip" -ne 0; then \ skipped="($$skip tests were not run)"; \ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$skipped"; \ fi; \ report=""; \ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ report="Please report to $(PACKAGE_BUGREPORT)"; \ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$report"; \ fi; \ dashes=`echo "$$dashes" | sed s/./=/g`; \ echo "$$dashes"; \ echo "$$banner"; \ test -z "$$skipped" || echo "$$skipped"; \ test -z "$$report" || echo "$$report"; \ echo "$$dashes"; \ test "$$failed" -eq 0; \ else :; fi distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-libtool distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-info-am .PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool ctags \ distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-exec install-exec-am install-info \ install-info-am install-man install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: nagios-4.3.4/tap/tests/ok/ok-hash/test.c000066400000000000000000000034061314764422400200300ustar00rootroot00000000000000/*- * Copyright (c) 2004 Nik Clayton * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #include #include "tap.h" int main(int argc, char *argv[]) { unsigned int rc = 0; rc = plan_tests(4); diag("Returned: %d", rc); rc = ok(1, "Test with no hash"); diag("Returned: %d", rc); rc = ok(1, "Test with one # hash"); diag("Returned: %d", rc); rc = ok(1, "Test with # two # hashes"); diag("Returned: %d", rc); rc = ok(1, "Test with ## back to back hashes"); diag("Returned: %d", rc); return exit_status(); } nagios-4.3.4/tap/tests/ok/ok-hash/test.pl000066400000000000000000000006141314764422400202170ustar00rootroot00000000000000#!/usr/bin/perl use warnings; use strict; use Test::More; my $rc = 0; $rc = plan tests => 4; diag("Returned: " . sprintf("%d", $rc)); $rc = ok(1, 'Test with no hash'); diag("Returned: $rc"); $rc = ok(1, 'Test with one # hash'); diag("Returned: $rc"); $rc = ok(1, 'Test with # two # hashes'); diag("Returned: $rc"); $rc = ok(1, 'Test with ## back to back hashes'); diag("Returned: $rc"); nagios-4.3.4/tap/tests/ok/ok-hash/test.t000066400000000000000000000011021314764422400200400ustar00rootroot00000000000000#!/bin/sh cd `dirname $0` echo '1..2' make 2>&1 > /dev/null perl ./test.pl 2>&1 | sed -e 's/# Failed test \(.*\)/# Failed test ()/' > test.pl.out perlstatus=$? ./test 2>&1 | sed -e 's/# Failed test \(.*\)/# Failed test ()/' > test.c.out cstatus=$? diff -u test.pl.out test.c.out if [ $? -eq 0 ]; then echo 'ok 1 - output is identical' else echo 'not ok 1 - output is identical' fi if [ $perlstatus -eq $cstatus ]; then echo 'ok 2 - status code' else echo 'not ok 2 - status code' echo "# perlstatus = $perlstatus" echo "# cstatus = $cstatus" fi nagios-4.3.4/tap/tests/ok/ok-numeric/000077500000000000000000000000001314764422400174215ustar00rootroot00000000000000nagios-4.3.4/tap/tests/ok/ok-numeric/Makefile.am000066400000000000000000000003541314764422400214570ustar00rootroot00000000000000 TESTS = test.t TESTS_ENVIRONMENT = $(SHELL) EXTRA_DIST = $(TESTS) test.pl check_PROGRAMS = test test_CFLAGS = -g -I../../../src test_LDFLAGS = -L../../../src test_LDADD = -ltap CLEANFILES = test.o test.c.out test.pl.out nagios-4.3.4/tap/tests/ok/ok-numeric/Makefile.in000066400000000000000000000404611314764422400214730ustar00rootroot00000000000000# Makefile.in generated by automake 1.9.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SOURCES = test.c srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../../.. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) subdir = tests/ok/ok-numeric DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = test_SOURCES = test.c test_OBJECTS = test-test.$(OBJEXT) test_DEPENDENCIES = DEFAULT_INCLUDES = -I. -I$(srcdir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = test.c DIST_SOURCES = test.c ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ TESTS = test.t TESTS_ENVIRONMENT = $(SHELL) EXTRA_DIST = $(TESTS) test.pl test_CFLAGS = -g -I../../../src test_LDFLAGS = -L../../../src test_LDADD = -ltap CLEANFILES = test.o test.c.out test.pl.out all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/ok/ok-numeric/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --foreign tests/ok/ok-numeric/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; for p in $$list; do \ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ echo " rm -f $$p $$f"; \ rm -f $$p $$f ; \ done test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) @rm -f test$(EXEEXT) $(LINK) $(test_LDFLAGS) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< test-test.o: test.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_CFLAGS) $(CFLAGS) -MT test-test.o -MD -MP -MF "$(DEPDIR)/test-test.Tpo" -c -o test-test.o `test -f 'test.c' || echo '$(srcdir)/'`test.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/test-test.Tpo" "$(DEPDIR)/test-test.Po"; else rm -f "$(DEPDIR)/test-test.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test.c' object='test-test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_CFLAGS) $(CFLAGS) -c -o test-test.o `test -f 'test.c' || echo '$(srcdir)/'`test.c test-test.obj: test.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_CFLAGS) $(CFLAGS) -MT test-test.obj -MD -MP -MF "$(DEPDIR)/test-test.Tpo" -c -o test-test.obj `if test -f 'test.c'; then $(CYGPATH_W) 'test.c'; else $(CYGPATH_W) '$(srcdir)/test.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/test-test.Tpo" "$(DEPDIR)/test-test.Po"; else rm -f "$(DEPDIR)/test-test.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test.c' object='test-test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_CFLAGS) $(CFLAGS) -c -o test-test.obj `if test -f 'test.c'; then $(CYGPATH_W) 'test.c'; else $(CYGPATH_W) '$(srcdir)/test.c'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool uninstall-info-am: ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags check-TESTS: $(TESTS) @failed=0; all=0; xfail=0; xpass=0; skip=0; \ srcdir=$(srcdir); export srcdir; \ list='$(TESTS)'; \ if test -n "$$list"; then \ for tst in $$list; do \ if test -f ./$$tst; then dir=./; \ elif test -f $$tst; then dir=; \ else dir="$(srcdir)/"; fi; \ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *" $$tst "*) \ xpass=`expr $$xpass + 1`; \ failed=`expr $$failed + 1`; \ echo "XPASS: $$tst"; \ ;; \ *) \ echo "PASS: $$tst"; \ ;; \ esac; \ elif test $$? -ne 77; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *" $$tst "*) \ xfail=`expr $$xfail + 1`; \ echo "XFAIL: $$tst"; \ ;; \ *) \ failed=`expr $$failed + 1`; \ echo "FAIL: $$tst"; \ ;; \ esac; \ else \ skip=`expr $$skip + 1`; \ echo "SKIP: $$tst"; \ fi; \ done; \ if test "$$failed" -eq 0; then \ if test "$$xfail" -eq 0; then \ banner="All $$all tests passed"; \ else \ banner="All $$all tests behaved as expected ($$xfail expected failures)"; \ fi; \ else \ if test "$$xpass" -eq 0; then \ banner="$$failed of $$all tests failed"; \ else \ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \ fi; \ fi; \ dashes="$$banner"; \ skipped=""; \ if test "$$skip" -ne 0; then \ skipped="($$skip tests were not run)"; \ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$skipped"; \ fi; \ report=""; \ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ report="Please report to $(PACKAGE_BUGREPORT)"; \ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$report"; \ fi; \ dashes=`echo "$$dashes" | sed s/./=/g`; \ echo "$$dashes"; \ echo "$$banner"; \ test -z "$$skipped" || echo "$$skipped"; \ test -z "$$report" || echo "$$report"; \ echo "$$dashes"; \ test "$$failed" -eq 0; \ else :; fi distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-libtool distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-info-am .PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool ctags \ distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-exec install-exec-am install-info \ install-info-am install-man install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: nagios-4.3.4/tap/tests/ok/ok-numeric/test.c000066400000000000000000000032211314764422400205420ustar00rootroot00000000000000/*- * Copyright (c) 2004 Nik Clayton * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #include #include "tap.h" int main(int argc, char *argv[]) { unsigned int rc = 0; rc = plan_tests(3); diag("Returned: %d", rc); rc = ok(1, "First test"); diag("Returned: %d", rc); rc = ok(1, "1"); diag("Returned: %d", rc); rc = ok(1, "Third test"); diag("Returned: %d", rc); return exit_status(); } nagios-4.3.4/tap/tests/ok/ok-numeric/test.pl000066400000000000000000000004331314764422400207350ustar00rootroot00000000000000#!/usr/bin/perl use warnings; use strict; use Test::More; my $rc = 0; $rc = plan tests => 3; diag("Returned: " . sprintf("%d", $rc)); $rc = ok(1, 'First test'); diag("Returned: $rc"); $rc = ok(1, '1'); diag("Returned: $rc"); $rc = ok(1, 'Third test'); diag("Returned: $rc"); nagios-4.3.4/tap/tests/ok/ok-numeric/test.t000066400000000000000000000011021314764422400205570ustar00rootroot00000000000000#!/bin/sh cd `dirname $0` echo '1..2' make 2>&1 > /dev/null perl ./test.pl 2>&1 | sed -e 's/# Failed test \(.*\)/# Failed test ()/' > test.pl.out perlstatus=$? ./test 2>&1 | sed -e 's/# Failed test \(.*\)/# Failed test ()/' > test.c.out cstatus=$? diff -u test.pl.out test.c.out if [ $? -eq 0 ]; then echo 'ok 1 - output is identical' else echo 'not ok 1 - output is identical' fi if [ $perlstatus -eq $cstatus ]; then echo 'ok 2 - status code' else echo 'not ok 2 - status code' echo "# perlstatus = $perlstatus" echo "# cstatus = $cstatus" fi nagios-4.3.4/tap/tests/ok/ok/000077500000000000000000000000001314764422400157615ustar00rootroot00000000000000nagios-4.3.4/tap/tests/ok/ok/Makefile.am000066400000000000000000000003541314764422400200170ustar00rootroot00000000000000 TESTS = test.t TESTS_ENVIRONMENT = $(SHELL) EXTRA_DIST = $(TESTS) test.pl check_PROGRAMS = test test_CFLAGS = -g -I../../../src test_LDFLAGS = -L../../../src test_LDADD = -ltap CLEANFILES = test.o test.c.out test.pl.out nagios-4.3.4/tap/tests/ok/ok/Makefile.in000066400000000000000000000404311314764422400200300ustar00rootroot00000000000000# Makefile.in generated by automake 1.9.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SOURCES = test.c srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../../.. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) subdir = tests/ok/ok DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = test_SOURCES = test.c test_OBJECTS = test-test.$(OBJEXT) test_DEPENDENCIES = DEFAULT_INCLUDES = -I. -I$(srcdir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = test.c DIST_SOURCES = test.c ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ TESTS = test.t TESTS_ENVIRONMENT = $(SHELL) EXTRA_DIST = $(TESTS) test.pl test_CFLAGS = -g -I../../../src test_LDFLAGS = -L../../../src test_LDADD = -ltap CLEANFILES = test.o test.c.out test.pl.out all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/ok/ok/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --foreign tests/ok/ok/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; for p in $$list; do \ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ echo " rm -f $$p $$f"; \ rm -f $$p $$f ; \ done test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) @rm -f test$(EXEEXT) $(LINK) $(test_LDFLAGS) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< test-test.o: test.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_CFLAGS) $(CFLAGS) -MT test-test.o -MD -MP -MF "$(DEPDIR)/test-test.Tpo" -c -o test-test.o `test -f 'test.c' || echo '$(srcdir)/'`test.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/test-test.Tpo" "$(DEPDIR)/test-test.Po"; else rm -f "$(DEPDIR)/test-test.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test.c' object='test-test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_CFLAGS) $(CFLAGS) -c -o test-test.o `test -f 'test.c' || echo '$(srcdir)/'`test.c test-test.obj: test.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_CFLAGS) $(CFLAGS) -MT test-test.obj -MD -MP -MF "$(DEPDIR)/test-test.Tpo" -c -o test-test.obj `if test -f 'test.c'; then $(CYGPATH_W) 'test.c'; else $(CYGPATH_W) '$(srcdir)/test.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/test-test.Tpo" "$(DEPDIR)/test-test.Po"; else rm -f "$(DEPDIR)/test-test.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test.c' object='test-test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_CFLAGS) $(CFLAGS) -c -o test-test.obj `if test -f 'test.c'; then $(CYGPATH_W) 'test.c'; else $(CYGPATH_W) '$(srcdir)/test.c'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool uninstall-info-am: ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags check-TESTS: $(TESTS) @failed=0; all=0; xfail=0; xpass=0; skip=0; \ srcdir=$(srcdir); export srcdir; \ list='$(TESTS)'; \ if test -n "$$list"; then \ for tst in $$list; do \ if test -f ./$$tst; then dir=./; \ elif test -f $$tst; then dir=; \ else dir="$(srcdir)/"; fi; \ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *" $$tst "*) \ xpass=`expr $$xpass + 1`; \ failed=`expr $$failed + 1`; \ echo "XPASS: $$tst"; \ ;; \ *) \ echo "PASS: $$tst"; \ ;; \ esac; \ elif test $$? -ne 77; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *" $$tst "*) \ xfail=`expr $$xfail + 1`; \ echo "XFAIL: $$tst"; \ ;; \ *) \ failed=`expr $$failed + 1`; \ echo "FAIL: $$tst"; \ ;; \ esac; \ else \ skip=`expr $$skip + 1`; \ echo "SKIP: $$tst"; \ fi; \ done; \ if test "$$failed" -eq 0; then \ if test "$$xfail" -eq 0; then \ banner="All $$all tests passed"; \ else \ banner="All $$all tests behaved as expected ($$xfail expected failures)"; \ fi; \ else \ if test "$$xpass" -eq 0; then \ banner="$$failed of $$all tests failed"; \ else \ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \ fi; \ fi; \ dashes="$$banner"; \ skipped=""; \ if test "$$skip" -ne 0; then \ skipped="($$skip tests were not run)"; \ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$skipped"; \ fi; \ report=""; \ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ report="Please report to $(PACKAGE_BUGREPORT)"; \ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$report"; \ fi; \ dashes=`echo "$$dashes" | sed s/./=/g`; \ echo "$$dashes"; \ echo "$$banner"; \ test -z "$$skipped" || echo "$$skipped"; \ test -z "$$report" || echo "$$report"; \ echo "$$dashes"; \ test "$$failed" -eq 0; \ else :; fi distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-libtool distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-info-am .PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool ctags \ distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-exec install-exec-am install-info \ install-info-am install-man install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: nagios-4.3.4/tap/tests/ok/ok/test.c000066400000000000000000000034131314764422400171050ustar00rootroot00000000000000/*- * Copyright (c) 2004 Nik Clayton * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #include #include "tap.h" int main(int argc, char *argv[]) { unsigned int rc = 0; rc = plan_tests(5); diag("Returned: %d", rc); rc = ok(1 == 1, "1 equals 1"); diag("Returned: %d", rc); rc = ok(1 == 1, "1 equals %d", 1); diag("Returned: %d", rc); rc = ok1(1 == 1); diag("Returned: %d", rc); rc = ok(1 == 2, "1 equals 2"); diag("Returned: %d", rc); rc = ok1(1 == 2); diag("Returned: %d", rc); return exit_status(); } nagios-4.3.4/tap/tests/ok/ok/test.pl000066400000000000000000000011031314764422400172700ustar00rootroot00000000000000#!/usr/bin/perl use warnings; use strict; use Test::More; my $rc = 0; $rc = plan tests => 5; diag("Returned: " . sprintf("%d", $rc)); $rc = ok(1 == 1, '1 equals 1'); # Test ok() passes when it should diag("Returned: $rc"); $rc = ok(1 == 1, '1 equals 1'); # Used for %d testing in test.c diag("Returned: $rc"); $rc = ok(1 == 1, '1 == 1'); # Test ok1() passes when it should diag("Returned: $rc"); $rc = ok(1 == 2, '1 equals 2'); # Test ok() fails when it should diag("Returned: $rc"); $rc = ok(1 == 2, '1 == 2'); # Test ok1() fails when it should diag("Returned: $rc"); nagios-4.3.4/tap/tests/ok/ok/test.t000066400000000000000000000011021314764422400171170ustar00rootroot00000000000000#!/bin/sh cd `dirname $0` echo '1..2' make 2>&1 > /dev/null perl ./test.pl 2>&1 | sed -e 's/# Failed test \(.*\)/# Failed test ()/' > test.pl.out perlstatus=$? ./test 2>&1 | sed -e 's/# Failed test \(.*\)/# Failed test ()/' > test.c.out cstatus=$? diff -u test.pl.out test.c.out if [ $? -eq 0 ]; then echo 'ok 1 - output is identical' else echo 'not ok 1 - output is identical' fi if [ $perlstatus -eq $cstatus ]; then echo 'ok 2 - status code' else echo 'not ok 2 - status code' echo "# perlstatus = $perlstatus" echo "# cstatus = $cstatus" fi nagios-4.3.4/tap/tests/pass/000077500000000000000000000000001314764422400157055ustar00rootroot00000000000000nagios-4.3.4/tap/tests/pass/Makefile.am000066400000000000000000000003461314764422400177440ustar00rootroot00000000000000 TESTS = test.t TESTS_ENVIRONMENT = $(SHELL) EXTRA_DIST = $(TESTS) test.pl check_PROGRAMS = test test_CFLAGS = -g -I../../src test_LDFLAGS = -L../../src test_LDADD = -ltap CLEANFILES = test.o test.c.out test.pl.out nagios-4.3.4/tap/tests/pass/Makefile.in000066400000000000000000000404151314764422400177560ustar00rootroot00000000000000# Makefile.in generated by automake 1.9.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SOURCES = test.c srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../.. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) subdir = tests/pass DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = test_SOURCES = test.c test_OBJECTS = test-test.$(OBJEXT) test_DEPENDENCIES = DEFAULT_INCLUDES = -I. -I$(srcdir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = test.c DIST_SOURCES = test.c ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ TESTS = test.t TESTS_ENVIRONMENT = $(SHELL) EXTRA_DIST = $(TESTS) test.pl test_CFLAGS = -g -I../../src test_LDFLAGS = -L../../src test_LDADD = -ltap CLEANFILES = test.o test.c.out test.pl.out all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/pass/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --foreign tests/pass/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; for p in $$list; do \ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ echo " rm -f $$p $$f"; \ rm -f $$p $$f ; \ done test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) @rm -f test$(EXEEXT) $(LINK) $(test_LDFLAGS) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< test-test.o: test.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_CFLAGS) $(CFLAGS) -MT test-test.o -MD -MP -MF "$(DEPDIR)/test-test.Tpo" -c -o test-test.o `test -f 'test.c' || echo '$(srcdir)/'`test.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/test-test.Tpo" "$(DEPDIR)/test-test.Po"; else rm -f "$(DEPDIR)/test-test.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test.c' object='test-test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_CFLAGS) $(CFLAGS) -c -o test-test.o `test -f 'test.c' || echo '$(srcdir)/'`test.c test-test.obj: test.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_CFLAGS) $(CFLAGS) -MT test-test.obj -MD -MP -MF "$(DEPDIR)/test-test.Tpo" -c -o test-test.obj `if test -f 'test.c'; then $(CYGPATH_W) 'test.c'; else $(CYGPATH_W) '$(srcdir)/test.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/test-test.Tpo" "$(DEPDIR)/test-test.Po"; else rm -f "$(DEPDIR)/test-test.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test.c' object='test-test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_CFLAGS) $(CFLAGS) -c -o test-test.obj `if test -f 'test.c'; then $(CYGPATH_W) 'test.c'; else $(CYGPATH_W) '$(srcdir)/test.c'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool uninstall-info-am: ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags check-TESTS: $(TESTS) @failed=0; all=0; xfail=0; xpass=0; skip=0; \ srcdir=$(srcdir); export srcdir; \ list='$(TESTS)'; \ if test -n "$$list"; then \ for tst in $$list; do \ if test -f ./$$tst; then dir=./; \ elif test -f $$tst; then dir=; \ else dir="$(srcdir)/"; fi; \ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *" $$tst "*) \ xpass=`expr $$xpass + 1`; \ failed=`expr $$failed + 1`; \ echo "XPASS: $$tst"; \ ;; \ *) \ echo "PASS: $$tst"; \ ;; \ esac; \ elif test $$? -ne 77; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *" $$tst "*) \ xfail=`expr $$xfail + 1`; \ echo "XFAIL: $$tst"; \ ;; \ *) \ failed=`expr $$failed + 1`; \ echo "FAIL: $$tst"; \ ;; \ esac; \ else \ skip=`expr $$skip + 1`; \ echo "SKIP: $$tst"; \ fi; \ done; \ if test "$$failed" -eq 0; then \ if test "$$xfail" -eq 0; then \ banner="All $$all tests passed"; \ else \ banner="All $$all tests behaved as expected ($$xfail expected failures)"; \ fi; \ else \ if test "$$xpass" -eq 0; then \ banner="$$failed of $$all tests failed"; \ else \ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \ fi; \ fi; \ dashes="$$banner"; \ skipped=""; \ if test "$$skip" -ne 0; then \ skipped="($$skip tests were not run)"; \ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$skipped"; \ fi; \ report=""; \ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ report="Please report to $(PACKAGE_BUGREPORT)"; \ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$report"; \ fi; \ dashes=`echo "$$dashes" | sed s/./=/g`; \ echo "$$dashes"; \ echo "$$banner"; \ test -z "$$skipped" || echo "$$skipped"; \ test -z "$$report" || echo "$$report"; \ echo "$$dashes"; \ test "$$failed" -eq 0; \ else :; fi distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-libtool distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-info-am .PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool ctags \ distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-exec install-exec-am install-info \ install-info-am install-man install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: nagios-4.3.4/tap/tests/pass/test.c000066400000000000000000000031751314764422400170360ustar00rootroot00000000000000/*- * Copyright (c) 2004 Nik Clayton * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #include #include "tap.h" int main(int argc, char *argv[]) { unsigned int rc = 0; rc = plan_tests(2); diag("Returned: %d", rc); rc = pass("test to pass"); diag("Returned: %d", rc); rc = pass("test to pass %s", "with extra string"); diag("Returned: %d", rc); return exit_status(); } nagios-4.3.4/tap/tests/pass/test.pl000066400000000000000000000004041314764422400172170ustar00rootroot00000000000000#!/usr/bin/perl use warnings; use strict; use Test::More; my $rc = 0; $rc = plan tests => 2; diag("Returned: " . sprintf('%d', $rc)); $rc = pass('test to pass'); diag("Returned: $rc"); $rc = pass('test to pass with extra string'); diag("Returned: $rc"); nagios-4.3.4/tap/tests/pass/test.t000066400000000000000000000011021314764422400170430ustar00rootroot00000000000000#!/bin/sh cd `dirname $0` echo '1..2' make 2>&1 > /dev/null perl ./test.pl 2>&1 | sed -e 's/# Failed test \(.*\)/# Failed test ()/' > test.pl.out perlstatus=$? ./test 2>&1 | sed -e 's/# Failed test \(.*\)/# Failed test ()/' > test.c.out cstatus=$? diff -u test.pl.out test.c.out if [ $? -eq 0 ]; then echo 'ok 1 - output is identical' else echo 'not ok 1 - output is identical' fi if [ $perlstatus -eq $cstatus ]; then echo 'ok 2 - status code' else echo 'not ok 2 - status code' echo "# perlstatus = $perlstatus" echo "# cstatus = $cstatus" fi nagios-4.3.4/tap/tests/plan/000077500000000000000000000000001314764422400156715ustar00rootroot00000000000000nagios-4.3.4/tap/tests/plan/Makefile.am000066400000000000000000000002331314764422400177230ustar00rootroot00000000000000SUBDIRS = no-tests SUBDIRS += no_plan SUBDIRS += not-enough-tests SUBDIRS += too-many-plans SUBDIRS += too-many-tests SUBDIRS += sane SUBDIRS += skip_all nagios-4.3.4/tap/tests/plan/Makefile.in000066400000000000000000000326471314764422400177520ustar00rootroot00000000000000# Makefile.in generated by automake 1.9.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../.. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = tests/plan DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-exec-recursive install-info-recursive \ install-recursive installcheck-recursive installdirs-recursive \ pdf-recursive ps-recursive uninstall-info-recursive \ uninstall-recursive ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ SUBDIRS = no-tests no_plan not-enough-tests too-many-plans \ too-many-tests sane skip_all all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/plan/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --foreign tests/plan/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool uninstall-info-am: # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @set fnord $$MAKEFLAGS; amf=$$2; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" mostlyclean-recursive clean-recursive distclean-recursive \ maintainer-clean-recursive: @set fnord $$MAKEFLAGS; amf=$$2; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(mkdir_p) "$(distdir)/$$subdir" \ || exit 1; \ distdir=`$(am__cd) $(distdir) && pwd`; \ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ (cd $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$top_distdir" \ distdir="$$distdir/$$subdir" \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-libtool \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive info: info-recursive info-am: install-data-am: install-exec-am: install-info: install-info-recursive install-man: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-info-am uninstall-info: uninstall-info-recursive .PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \ clean clean-generic clean-libtool clean-recursive ctags \ ctags-recursive distclean distclean-generic distclean-libtool \ distclean-recursive distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-exec install-exec-am install-info \ install-info-am install-man install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic maintainer-clean-recursive \ mostlyclean mostlyclean-generic mostlyclean-libtool \ mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: nagios-4.3.4/tap/tests/plan/no-tests/000077500000000000000000000000001314764422400174455ustar00rootroot00000000000000nagios-4.3.4/tap/tests/plan/no-tests/Makefile.am000066400000000000000000000003541314764422400215030ustar00rootroot00000000000000 TESTS = test.t TESTS_ENVIRONMENT = $(SHELL) EXTRA_DIST = $(TESTS) test.pl check_PROGRAMS = test test_CFLAGS = -g -I../../../src test_LDFLAGS = -L../../../src test_LDADD = -ltap CLEANFILES = test.o test.c.out test.pl.out nagios-4.3.4/tap/tests/plan/no-tests/Makefile.in000066400000000000000000000404611314764422400215170ustar00rootroot00000000000000# Makefile.in generated by automake 1.9.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SOURCES = test.c srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../../.. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) subdir = tests/plan/no-tests DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = test_SOURCES = test.c test_OBJECTS = test-test.$(OBJEXT) test_DEPENDENCIES = DEFAULT_INCLUDES = -I. -I$(srcdir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = test.c DIST_SOURCES = test.c ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ TESTS = test.t TESTS_ENVIRONMENT = $(SHELL) EXTRA_DIST = $(TESTS) test.pl test_CFLAGS = -g -I../../../src test_LDFLAGS = -L../../../src test_LDADD = -ltap CLEANFILES = test.o test.c.out test.pl.out all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/plan/no-tests/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --foreign tests/plan/no-tests/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; for p in $$list; do \ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ echo " rm -f $$p $$f"; \ rm -f $$p $$f ; \ done test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) @rm -f test$(EXEEXT) $(LINK) $(test_LDFLAGS) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< test-test.o: test.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_CFLAGS) $(CFLAGS) -MT test-test.o -MD -MP -MF "$(DEPDIR)/test-test.Tpo" -c -o test-test.o `test -f 'test.c' || echo '$(srcdir)/'`test.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/test-test.Tpo" "$(DEPDIR)/test-test.Po"; else rm -f "$(DEPDIR)/test-test.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test.c' object='test-test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_CFLAGS) $(CFLAGS) -c -o test-test.o `test -f 'test.c' || echo '$(srcdir)/'`test.c test-test.obj: test.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_CFLAGS) $(CFLAGS) -MT test-test.obj -MD -MP -MF "$(DEPDIR)/test-test.Tpo" -c -o test-test.obj `if test -f 'test.c'; then $(CYGPATH_W) 'test.c'; else $(CYGPATH_W) '$(srcdir)/test.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/test-test.Tpo" "$(DEPDIR)/test-test.Po"; else rm -f "$(DEPDIR)/test-test.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test.c' object='test-test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_CFLAGS) $(CFLAGS) -c -o test-test.obj `if test -f 'test.c'; then $(CYGPATH_W) 'test.c'; else $(CYGPATH_W) '$(srcdir)/test.c'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool uninstall-info-am: ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags check-TESTS: $(TESTS) @failed=0; all=0; xfail=0; xpass=0; skip=0; \ srcdir=$(srcdir); export srcdir; \ list='$(TESTS)'; \ if test -n "$$list"; then \ for tst in $$list; do \ if test -f ./$$tst; then dir=./; \ elif test -f $$tst; then dir=; \ else dir="$(srcdir)/"; fi; \ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *" $$tst "*) \ xpass=`expr $$xpass + 1`; \ failed=`expr $$failed + 1`; \ echo "XPASS: $$tst"; \ ;; \ *) \ echo "PASS: $$tst"; \ ;; \ esac; \ elif test $$? -ne 77; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *" $$tst "*) \ xfail=`expr $$xfail + 1`; \ echo "XFAIL: $$tst"; \ ;; \ *) \ failed=`expr $$failed + 1`; \ echo "FAIL: $$tst"; \ ;; \ esac; \ else \ skip=`expr $$skip + 1`; \ echo "SKIP: $$tst"; \ fi; \ done; \ if test "$$failed" -eq 0; then \ if test "$$xfail" -eq 0; then \ banner="All $$all tests passed"; \ else \ banner="All $$all tests behaved as expected ($$xfail expected failures)"; \ fi; \ else \ if test "$$xpass" -eq 0; then \ banner="$$failed of $$all tests failed"; \ else \ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \ fi; \ fi; \ dashes="$$banner"; \ skipped=""; \ if test "$$skip" -ne 0; then \ skipped="($$skip tests were not run)"; \ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$skipped"; \ fi; \ report=""; \ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ report="Please report to $(PACKAGE_BUGREPORT)"; \ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$report"; \ fi; \ dashes=`echo "$$dashes" | sed s/./=/g`; \ echo "$$dashes"; \ echo "$$banner"; \ test -z "$$skipped" || echo "$$skipped"; \ test -z "$$report" || echo "$$report"; \ echo "$$dashes"; \ test "$$failed" -eq 0; \ else :; fi distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-libtool distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-info-am .PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool ctags \ distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-exec install-exec-am install-info \ install-info-am install-man install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: nagios-4.3.4/tap/tests/plan/no-tests/test.c000066400000000000000000000030441314764422400205710ustar00rootroot00000000000000/*- * Copyright (c) 2004 Nik Clayton * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #include #include "tap.h" int main(int argc, char *argv[]) { unsigned int rc = 0; rc = plan_tests(0); diag("Returned: %d", rc); rc = ok(1, NULL); diag("Returned: %d", rc); return exit_status(); } nagios-4.3.4/tap/tests/plan/no-tests/test.pl000066400000000000000000000002571314764422400207650ustar00rootroot00000000000000#!/usr/bin/perl use warnings; use strict; use Test::More; my $rc = 0; $rc = plan tests => 0; diag("Returned: " . sprintf("%d", $rc)); $rc = ok(1); diag("Returned: $rc"); nagios-4.3.4/tap/tests/plan/no-tests/test.t000066400000000000000000000011021314764422400206030ustar00rootroot00000000000000#!/bin/sh cd `dirname $0` echo '1..2' make 2>&1 > /dev/null perl ./test.pl 2>&1 | sed -e 's/# Failed test \(.*\)/# Failed test ()/' > test.pl.out perlstatus=$? ./test 2>&1 | sed -e 's/# Failed test \(.*\)/# Failed test ()/' > test.c.out cstatus=$? diff -u test.pl.out test.c.out if [ $? -eq 0 ]; then echo 'ok 1 - output is identical' else echo 'not ok 1 - output is identical' fi if [ $perlstatus -eq $cstatus ]; then echo 'ok 2 - status code' else echo 'not ok 2 - status code' echo "# perlstatus = $perlstatus" echo "# cstatus = $cstatus" fi nagios-4.3.4/tap/tests/plan/no_plan/000077500000000000000000000000001314764422400173175ustar00rootroot00000000000000nagios-4.3.4/tap/tests/plan/no_plan/Makefile.am000066400000000000000000000003541314764422400213550ustar00rootroot00000000000000 TESTS = test.t TESTS_ENVIRONMENT = $(SHELL) EXTRA_DIST = $(TESTS) test.pl check_PROGRAMS = test test_CFLAGS = -g -I../../../src test_LDFLAGS = -L../../../src test_LDADD = -ltap CLEANFILES = test.o test.c.out test.pl.out nagios-4.3.4/tap/tests/plan/no_plan/Makefile.in000066400000000000000000000404561314764422400213750ustar00rootroot00000000000000# Makefile.in generated by automake 1.9.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SOURCES = test.c srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../../.. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) subdir = tests/plan/no_plan DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = test_SOURCES = test.c test_OBJECTS = test-test.$(OBJEXT) test_DEPENDENCIES = DEFAULT_INCLUDES = -I. -I$(srcdir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = test.c DIST_SOURCES = test.c ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ TESTS = test.t TESTS_ENVIRONMENT = $(SHELL) EXTRA_DIST = $(TESTS) test.pl test_CFLAGS = -g -I../../../src test_LDFLAGS = -L../../../src test_LDADD = -ltap CLEANFILES = test.o test.c.out test.pl.out all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/plan/no_plan/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --foreign tests/plan/no_plan/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; for p in $$list; do \ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ echo " rm -f $$p $$f"; \ rm -f $$p $$f ; \ done test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) @rm -f test$(EXEEXT) $(LINK) $(test_LDFLAGS) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< test-test.o: test.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_CFLAGS) $(CFLAGS) -MT test-test.o -MD -MP -MF "$(DEPDIR)/test-test.Tpo" -c -o test-test.o `test -f 'test.c' || echo '$(srcdir)/'`test.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/test-test.Tpo" "$(DEPDIR)/test-test.Po"; else rm -f "$(DEPDIR)/test-test.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test.c' object='test-test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_CFLAGS) $(CFLAGS) -c -o test-test.o `test -f 'test.c' || echo '$(srcdir)/'`test.c test-test.obj: test.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_CFLAGS) $(CFLAGS) -MT test-test.obj -MD -MP -MF "$(DEPDIR)/test-test.Tpo" -c -o test-test.obj `if test -f 'test.c'; then $(CYGPATH_W) 'test.c'; else $(CYGPATH_W) '$(srcdir)/test.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/test-test.Tpo" "$(DEPDIR)/test-test.Po"; else rm -f "$(DEPDIR)/test-test.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test.c' object='test-test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_CFLAGS) $(CFLAGS) -c -o test-test.obj `if test -f 'test.c'; then $(CYGPATH_W) 'test.c'; else $(CYGPATH_W) '$(srcdir)/test.c'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool uninstall-info-am: ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags check-TESTS: $(TESTS) @failed=0; all=0; xfail=0; xpass=0; skip=0; \ srcdir=$(srcdir); export srcdir; \ list='$(TESTS)'; \ if test -n "$$list"; then \ for tst in $$list; do \ if test -f ./$$tst; then dir=./; \ elif test -f $$tst; then dir=; \ else dir="$(srcdir)/"; fi; \ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *" $$tst "*) \ xpass=`expr $$xpass + 1`; \ failed=`expr $$failed + 1`; \ echo "XPASS: $$tst"; \ ;; \ *) \ echo "PASS: $$tst"; \ ;; \ esac; \ elif test $$? -ne 77; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *" $$tst "*) \ xfail=`expr $$xfail + 1`; \ echo "XFAIL: $$tst"; \ ;; \ *) \ failed=`expr $$failed + 1`; \ echo "FAIL: $$tst"; \ ;; \ esac; \ else \ skip=`expr $$skip + 1`; \ echo "SKIP: $$tst"; \ fi; \ done; \ if test "$$failed" -eq 0; then \ if test "$$xfail" -eq 0; then \ banner="All $$all tests passed"; \ else \ banner="All $$all tests behaved as expected ($$xfail expected failures)"; \ fi; \ else \ if test "$$xpass" -eq 0; then \ banner="$$failed of $$all tests failed"; \ else \ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \ fi; \ fi; \ dashes="$$banner"; \ skipped=""; \ if test "$$skip" -ne 0; then \ skipped="($$skip tests were not run)"; \ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$skipped"; \ fi; \ report=""; \ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ report="Please report to $(PACKAGE_BUGREPORT)"; \ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$report"; \ fi; \ dashes=`echo "$$dashes" | sed s/./=/g`; \ echo "$$dashes"; \ echo "$$banner"; \ test -z "$$skipped" || echo "$$skipped"; \ test -z "$$report" || echo "$$report"; \ echo "$$dashes"; \ test "$$failed" -eq 0; \ else :; fi distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-libtool distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-info-am .PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool ctags \ distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-exec install-exec-am install-info \ install-info-am install-man install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: nagios-4.3.4/tap/tests/plan/no_plan/test.c000066400000000000000000000030451314764422400204440ustar00rootroot00000000000000/*- * Copyright (c) 2004 Nik Clayton * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #include #include "tap.h" int main(int argc, char *argv[]) { unsigned int rc = 0; rc = plan_no_plan(); diag("Returned: %d", rc); rc = ok(1, NULL); diag("Returned: %d", rc); return exit_status(); } nagios-4.3.4/tap/tests/plan/no_plan/test.pl000066400000000000000000000002601314764422400206310ustar00rootroot00000000000000#!/usr/bin/perl use warnings; use strict; my $rc = 0; use Test::More; $rc = plan qw(no_plan); diag("Returned: " . sprintf("%d", $rc)); $rc = ok(1); diag("Returned: $rc"); nagios-4.3.4/tap/tests/plan/no_plan/test.t000066400000000000000000000011021314764422400204550ustar00rootroot00000000000000#!/bin/sh cd `dirname $0` echo '1..2' make 2>&1 > /dev/null perl ./test.pl 2>&1 | sed -e 's/# Failed test \(.*\)/# Failed test ()/' > test.pl.out perlstatus=$? ./test 2>&1 | sed -e 's/# Failed test \(.*\)/# Failed test ()/' > test.c.out cstatus=$? diff -u test.pl.out test.c.out if [ $? -eq 0 ]; then echo 'ok 1 - output is identical' else echo 'not ok 1 - output is identical' fi if [ $perlstatus -eq $cstatus ]; then echo 'ok 2 - status code' else echo 'not ok 2 - status code' echo "# perlstatus = $perlstatus" echo "# cstatus = $cstatus" fi nagios-4.3.4/tap/tests/plan/not-enough-tests/000077500000000000000000000000001314764422400211145ustar00rootroot00000000000000nagios-4.3.4/tap/tests/plan/not-enough-tests/Makefile.am000066400000000000000000000003541314764422400231520ustar00rootroot00000000000000 TESTS = test.t TESTS_ENVIRONMENT = $(SHELL) EXTRA_DIST = $(TESTS) test.pl check_PROGRAMS = test test_CFLAGS = -g -I../../../src test_LDFLAGS = -L../../../src test_LDADD = -ltap CLEANFILES = test.o test.c.out test.pl.out nagios-4.3.4/tap/tests/plan/not-enough-tests/Makefile.in000066400000000000000000000405111314764422400231620ustar00rootroot00000000000000# Makefile.in generated by automake 1.9.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SOURCES = test.c srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../../.. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) subdir = tests/plan/not-enough-tests DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = test_SOURCES = test.c test_OBJECTS = test-test.$(OBJEXT) test_DEPENDENCIES = DEFAULT_INCLUDES = -I. -I$(srcdir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = test.c DIST_SOURCES = test.c ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ TESTS = test.t TESTS_ENVIRONMENT = $(SHELL) EXTRA_DIST = $(TESTS) test.pl test_CFLAGS = -g -I../../../src test_LDFLAGS = -L../../../src test_LDADD = -ltap CLEANFILES = test.o test.c.out test.pl.out all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/plan/not-enough-tests/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --foreign tests/plan/not-enough-tests/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; for p in $$list; do \ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ echo " rm -f $$p $$f"; \ rm -f $$p $$f ; \ done test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) @rm -f test$(EXEEXT) $(LINK) $(test_LDFLAGS) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< test-test.o: test.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_CFLAGS) $(CFLAGS) -MT test-test.o -MD -MP -MF "$(DEPDIR)/test-test.Tpo" -c -o test-test.o `test -f 'test.c' || echo '$(srcdir)/'`test.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/test-test.Tpo" "$(DEPDIR)/test-test.Po"; else rm -f "$(DEPDIR)/test-test.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test.c' object='test-test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_CFLAGS) $(CFLAGS) -c -o test-test.o `test -f 'test.c' || echo '$(srcdir)/'`test.c test-test.obj: test.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_CFLAGS) $(CFLAGS) -MT test-test.obj -MD -MP -MF "$(DEPDIR)/test-test.Tpo" -c -o test-test.obj `if test -f 'test.c'; then $(CYGPATH_W) 'test.c'; else $(CYGPATH_W) '$(srcdir)/test.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/test-test.Tpo" "$(DEPDIR)/test-test.Po"; else rm -f "$(DEPDIR)/test-test.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test.c' object='test-test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_CFLAGS) $(CFLAGS) -c -o test-test.obj `if test -f 'test.c'; then $(CYGPATH_W) 'test.c'; else $(CYGPATH_W) '$(srcdir)/test.c'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool uninstall-info-am: ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags check-TESTS: $(TESTS) @failed=0; all=0; xfail=0; xpass=0; skip=0; \ srcdir=$(srcdir); export srcdir; \ list='$(TESTS)'; \ if test -n "$$list"; then \ for tst in $$list; do \ if test -f ./$$tst; then dir=./; \ elif test -f $$tst; then dir=; \ else dir="$(srcdir)/"; fi; \ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *" $$tst "*) \ xpass=`expr $$xpass + 1`; \ failed=`expr $$failed + 1`; \ echo "XPASS: $$tst"; \ ;; \ *) \ echo "PASS: $$tst"; \ ;; \ esac; \ elif test $$? -ne 77; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *" $$tst "*) \ xfail=`expr $$xfail + 1`; \ echo "XFAIL: $$tst"; \ ;; \ *) \ failed=`expr $$failed + 1`; \ echo "FAIL: $$tst"; \ ;; \ esac; \ else \ skip=`expr $$skip + 1`; \ echo "SKIP: $$tst"; \ fi; \ done; \ if test "$$failed" -eq 0; then \ if test "$$xfail" -eq 0; then \ banner="All $$all tests passed"; \ else \ banner="All $$all tests behaved as expected ($$xfail expected failures)"; \ fi; \ else \ if test "$$xpass" -eq 0; then \ banner="$$failed of $$all tests failed"; \ else \ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \ fi; \ fi; \ dashes="$$banner"; \ skipped=""; \ if test "$$skip" -ne 0; then \ skipped="($$skip tests were not run)"; \ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$skipped"; \ fi; \ report=""; \ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ report="Please report to $(PACKAGE_BUGREPORT)"; \ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$report"; \ fi; \ dashes=`echo "$$dashes" | sed s/./=/g`; \ echo "$$dashes"; \ echo "$$banner"; \ test -z "$$skipped" || echo "$$skipped"; \ test -z "$$report" || echo "$$report"; \ echo "$$dashes"; \ test "$$failed" -eq 0; \ else :; fi distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-libtool distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-info-am .PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool ctags \ distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-exec install-exec-am install-info \ install-info-am install-man install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: nagios-4.3.4/tap/tests/plan/not-enough-tests/test.c000066400000000000000000000032021314764422400222340ustar00rootroot00000000000000/*- * Copyright (c) 2004 Nik Clayton * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #include #include "tap.h" int main(int argc, char *argv[]) { unsigned int rc = 0; rc = plan_tests(1); diag("Returned: %d", rc); rc = ok(1, NULL); diag("Returned: %d", rc); rc = ok(1, NULL); diag("Returned: %d", rc); rc = ok(1, NULL); diag("Returned: %d", rc); return exit_status(); } nagios-4.3.4/tap/tests/plan/not-enough-tests/test.pl000066400000000000000000000003711314764422400224310ustar00rootroot00000000000000#!/usr/bin/perl use warnings; use strict; use Test::More; my $rc = 0; $rc = plan tests => 1; diag("Returned: " . sprintf("%d", $rc)); $rc = ok(1); diag("Returned: $rc"); $rc = ok(1); diag("Returned: $rc"); $rc = ok(1); diag("Returned: $rc"); nagios-4.3.4/tap/tests/plan/not-enough-tests/test.t000066400000000000000000000011021314764422400222520ustar00rootroot00000000000000#!/bin/sh cd `dirname $0` echo '1..2' make 2>&1 > /dev/null perl ./test.pl 2>&1 | sed -e 's/# Failed test \(.*\)/# Failed test ()/' > test.pl.out perlstatus=$? ./test 2>&1 | sed -e 's/# Failed test \(.*\)/# Failed test ()/' > test.c.out cstatus=$? diff -u test.pl.out test.c.out if [ $? -eq 0 ]; then echo 'ok 1 - output is identical' else echo 'not ok 1 - output is identical' fi if [ $perlstatus -eq $cstatus ]; then echo 'ok 2 - status code' else echo 'not ok 2 - status code' echo "# perlstatus = $perlstatus" echo "# cstatus = $cstatus" fi nagios-4.3.4/tap/tests/plan/sane/000077500000000000000000000000001314764422400166175ustar00rootroot00000000000000nagios-4.3.4/tap/tests/plan/sane/Makefile.am000066400000000000000000000003541314764422400206550ustar00rootroot00000000000000 TESTS = test.t TESTS_ENVIRONMENT = $(SHELL) EXTRA_DIST = $(TESTS) test.pl check_PROGRAMS = test test_CFLAGS = -g -I../../../src test_LDFLAGS = -L../../../src test_LDADD = -ltap CLEANFILES = test.o test.c.out test.pl.out nagios-4.3.4/tap/tests/plan/sane/Makefile.in000066400000000000000000000404451314764422400206730ustar00rootroot00000000000000# Makefile.in generated by automake 1.9.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SOURCES = test.c srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../../.. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) subdir = tests/plan/sane DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = test_SOURCES = test.c test_OBJECTS = test-test.$(OBJEXT) test_DEPENDENCIES = DEFAULT_INCLUDES = -I. -I$(srcdir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = test.c DIST_SOURCES = test.c ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ TESTS = test.t TESTS_ENVIRONMENT = $(SHELL) EXTRA_DIST = $(TESTS) test.pl test_CFLAGS = -g -I../../../src test_LDFLAGS = -L../../../src test_LDADD = -ltap CLEANFILES = test.o test.c.out test.pl.out all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/plan/sane/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --foreign tests/plan/sane/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; for p in $$list; do \ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ echo " rm -f $$p $$f"; \ rm -f $$p $$f ; \ done test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) @rm -f test$(EXEEXT) $(LINK) $(test_LDFLAGS) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< test-test.o: test.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_CFLAGS) $(CFLAGS) -MT test-test.o -MD -MP -MF "$(DEPDIR)/test-test.Tpo" -c -o test-test.o `test -f 'test.c' || echo '$(srcdir)/'`test.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/test-test.Tpo" "$(DEPDIR)/test-test.Po"; else rm -f "$(DEPDIR)/test-test.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test.c' object='test-test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_CFLAGS) $(CFLAGS) -c -o test-test.o `test -f 'test.c' || echo '$(srcdir)/'`test.c test-test.obj: test.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_CFLAGS) $(CFLAGS) -MT test-test.obj -MD -MP -MF "$(DEPDIR)/test-test.Tpo" -c -o test-test.obj `if test -f 'test.c'; then $(CYGPATH_W) 'test.c'; else $(CYGPATH_W) '$(srcdir)/test.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/test-test.Tpo" "$(DEPDIR)/test-test.Po"; else rm -f "$(DEPDIR)/test-test.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test.c' object='test-test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_CFLAGS) $(CFLAGS) -c -o test-test.obj `if test -f 'test.c'; then $(CYGPATH_W) 'test.c'; else $(CYGPATH_W) '$(srcdir)/test.c'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool uninstall-info-am: ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags check-TESTS: $(TESTS) @failed=0; all=0; xfail=0; xpass=0; skip=0; \ srcdir=$(srcdir); export srcdir; \ list='$(TESTS)'; \ if test -n "$$list"; then \ for tst in $$list; do \ if test -f ./$$tst; then dir=./; \ elif test -f $$tst; then dir=; \ else dir="$(srcdir)/"; fi; \ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *" $$tst "*) \ xpass=`expr $$xpass + 1`; \ failed=`expr $$failed + 1`; \ echo "XPASS: $$tst"; \ ;; \ *) \ echo "PASS: $$tst"; \ ;; \ esac; \ elif test $$? -ne 77; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *" $$tst "*) \ xfail=`expr $$xfail + 1`; \ echo "XFAIL: $$tst"; \ ;; \ *) \ failed=`expr $$failed + 1`; \ echo "FAIL: $$tst"; \ ;; \ esac; \ else \ skip=`expr $$skip + 1`; \ echo "SKIP: $$tst"; \ fi; \ done; \ if test "$$failed" -eq 0; then \ if test "$$xfail" -eq 0; then \ banner="All $$all tests passed"; \ else \ banner="All $$all tests behaved as expected ($$xfail expected failures)"; \ fi; \ else \ if test "$$xpass" -eq 0; then \ banner="$$failed of $$all tests failed"; \ else \ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \ fi; \ fi; \ dashes="$$banner"; \ skipped=""; \ if test "$$skip" -ne 0; then \ skipped="($$skip tests were not run)"; \ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$skipped"; \ fi; \ report=""; \ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ report="Please report to $(PACKAGE_BUGREPORT)"; \ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$report"; \ fi; \ dashes=`echo "$$dashes" | sed s/./=/g`; \ echo "$$dashes"; \ echo "$$banner"; \ test -z "$$skipped" || echo "$$skipped"; \ test -z "$$report" || echo "$$report"; \ echo "$$dashes"; \ test "$$failed" -eq 0; \ else :; fi distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-libtool distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-info-am .PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool ctags \ distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-exec install-exec-am install-info \ install-info-am install-man install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: nagios-4.3.4/tap/tests/plan/sane/test.c000066400000000000000000000030441314764422400177430ustar00rootroot00000000000000/*- * Copyright (c) 2004 Nik Clayton * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #include #include "tap.h" int main(int argc, char *argv[]) { unsigned int rc = 0; rc = plan_tests(1); diag("Returned: %d", rc); rc = ok(1, NULL); diag("Returned: %d", rc); return exit_status(); } nagios-4.3.4/tap/tests/plan/sane/test.pl000066400000000000000000000002571314764422400201370ustar00rootroot00000000000000#!/usr/bin/perl use warnings; use strict; use Test::More; my $rc = 0; $rc = plan tests => 1; diag("Returned: " . sprintf("%d", $rc)); $rc = ok(1); diag("Returned: $rc"); nagios-4.3.4/tap/tests/plan/sane/test.t000066400000000000000000000011021314764422400177550ustar00rootroot00000000000000#!/bin/sh cd `dirname $0` echo '1..2' make 2>&1 > /dev/null perl ./test.pl 2>&1 | sed -e 's/# Failed test \(.*\)/# Failed test ()/' > test.pl.out perlstatus=$? ./test 2>&1 | sed -e 's/# Failed test \(.*\)/# Failed test ()/' > test.c.out cstatus=$? diff -u test.pl.out test.c.out if [ $? -eq 0 ]; then echo 'ok 1 - output is identical' else echo 'not ok 1 - output is identical' fi if [ $perlstatus -eq $cstatus ]; then echo 'ok 2 - status code' else echo 'not ok 2 - status code' echo "# perlstatus = $perlstatus" echo "# cstatus = $cstatus" fi nagios-4.3.4/tap/tests/plan/skip_all/000077500000000000000000000000001314764422400174675ustar00rootroot00000000000000nagios-4.3.4/tap/tests/plan/skip_all/Makefile.am000066400000000000000000000003541314764422400215250ustar00rootroot00000000000000 TESTS = test.t TESTS_ENVIRONMENT = $(SHELL) EXTRA_DIST = $(TESTS) test.pl check_PROGRAMS = test test_CFLAGS = -g -I../../../src test_LDFLAGS = -L../../../src test_LDADD = -ltap CLEANFILES = test.o test.c.out test.pl.out nagios-4.3.4/tap/tests/plan/skip_all/Makefile.in000066400000000000000000000404611314764422400215410ustar00rootroot00000000000000# Makefile.in generated by automake 1.9.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SOURCES = test.c srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../../.. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) subdir = tests/plan/skip_all DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = test_SOURCES = test.c test_OBJECTS = test-test.$(OBJEXT) test_DEPENDENCIES = DEFAULT_INCLUDES = -I. -I$(srcdir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = test.c DIST_SOURCES = test.c ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ TESTS = test.t TESTS_ENVIRONMENT = $(SHELL) EXTRA_DIST = $(TESTS) test.pl test_CFLAGS = -g -I../../../src test_LDFLAGS = -L../../../src test_LDADD = -ltap CLEANFILES = test.o test.c.out test.pl.out all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/plan/skip_all/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --foreign tests/plan/skip_all/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; for p in $$list; do \ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ echo " rm -f $$p $$f"; \ rm -f $$p $$f ; \ done test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) @rm -f test$(EXEEXT) $(LINK) $(test_LDFLAGS) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< test-test.o: test.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_CFLAGS) $(CFLAGS) -MT test-test.o -MD -MP -MF "$(DEPDIR)/test-test.Tpo" -c -o test-test.o `test -f 'test.c' || echo '$(srcdir)/'`test.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/test-test.Tpo" "$(DEPDIR)/test-test.Po"; else rm -f "$(DEPDIR)/test-test.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test.c' object='test-test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_CFLAGS) $(CFLAGS) -c -o test-test.o `test -f 'test.c' || echo '$(srcdir)/'`test.c test-test.obj: test.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_CFLAGS) $(CFLAGS) -MT test-test.obj -MD -MP -MF "$(DEPDIR)/test-test.Tpo" -c -o test-test.obj `if test -f 'test.c'; then $(CYGPATH_W) 'test.c'; else $(CYGPATH_W) '$(srcdir)/test.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/test-test.Tpo" "$(DEPDIR)/test-test.Po"; else rm -f "$(DEPDIR)/test-test.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test.c' object='test-test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_CFLAGS) $(CFLAGS) -c -o test-test.obj `if test -f 'test.c'; then $(CYGPATH_W) 'test.c'; else $(CYGPATH_W) '$(srcdir)/test.c'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool uninstall-info-am: ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags check-TESTS: $(TESTS) @failed=0; all=0; xfail=0; xpass=0; skip=0; \ srcdir=$(srcdir); export srcdir; \ list='$(TESTS)'; \ if test -n "$$list"; then \ for tst in $$list; do \ if test -f ./$$tst; then dir=./; \ elif test -f $$tst; then dir=; \ else dir="$(srcdir)/"; fi; \ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *" $$tst "*) \ xpass=`expr $$xpass + 1`; \ failed=`expr $$failed + 1`; \ echo "XPASS: $$tst"; \ ;; \ *) \ echo "PASS: $$tst"; \ ;; \ esac; \ elif test $$? -ne 77; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *" $$tst "*) \ xfail=`expr $$xfail + 1`; \ echo "XFAIL: $$tst"; \ ;; \ *) \ failed=`expr $$failed + 1`; \ echo "FAIL: $$tst"; \ ;; \ esac; \ else \ skip=`expr $$skip + 1`; \ echo "SKIP: $$tst"; \ fi; \ done; \ if test "$$failed" -eq 0; then \ if test "$$xfail" -eq 0; then \ banner="All $$all tests passed"; \ else \ banner="All $$all tests behaved as expected ($$xfail expected failures)"; \ fi; \ else \ if test "$$xpass" -eq 0; then \ banner="$$failed of $$all tests failed"; \ else \ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \ fi; \ fi; \ dashes="$$banner"; \ skipped=""; \ if test "$$skip" -ne 0; then \ skipped="($$skip tests were not run)"; \ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$skipped"; \ fi; \ report=""; \ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ report="Please report to $(PACKAGE_BUGREPORT)"; \ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$report"; \ fi; \ dashes=`echo "$$dashes" | sed s/./=/g`; \ echo "$$dashes"; \ echo "$$banner"; \ test -z "$$skipped" || echo "$$skipped"; \ test -z "$$report" || echo "$$report"; \ echo "$$dashes"; \ test "$$failed" -eq 0; \ else :; fi distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-libtool distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-info-am .PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool ctags \ distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-exec install-exec-am install-info \ install-info-am install-man install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: nagios-4.3.4/tap/tests/plan/skip_all/test.c000066400000000000000000000027631314764422400206220ustar00rootroot00000000000000/*- * Copyright (c) 2004 Nik Clayton * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #include "tap.h" int main(int argc, char *argv[]) { unsigned int rc = 0; rc = plan_skip_all("No good reason"); diag("Returned: %d", rc); return exit_status(); } nagios-4.3.4/tap/tests/plan/skip_all/test.pl000066400000000000000000000002341314764422400210020ustar00rootroot00000000000000#!/usr/bin/perl use warnings; use strict; use Test::More; my $rc = 0; $rc = plan skip_all => "No good reason"; diag("Returned: " . sprintf("%d", $rc)); nagios-4.3.4/tap/tests/plan/skip_all/test.t000066400000000000000000000011021314764422400206250ustar00rootroot00000000000000#!/bin/sh cd `dirname $0` echo '1..2' make 2>&1 > /dev/null perl ./test.pl 2>&1 | sed -e 's/# Failed test \(.*\)/# Failed test ()/' > test.pl.out perlstatus=$? ./test 2>&1 | sed -e 's/# Failed test \(.*\)/# Failed test ()/' > test.c.out cstatus=$? diff -u test.pl.out test.c.out if [ $? -eq 0 ]; then echo 'ok 1 - output is identical' else echo 'not ok 1 - output is identical' fi if [ $perlstatus -eq $cstatus ]; then echo 'ok 2 - status code' else echo 'not ok 2 - status code' echo "# perlstatus = $perlstatus" echo "# cstatus = $cstatus" fi nagios-4.3.4/tap/tests/plan/too-many-plans/000077500000000000000000000000001314764422400205475ustar00rootroot00000000000000nagios-4.3.4/tap/tests/plan/too-many-plans/Makefile.am000066400000000000000000000003541314764422400226050ustar00rootroot00000000000000 TESTS = test.t TESTS_ENVIRONMENT = $(SHELL) EXTRA_DIST = $(TESTS) test.pl check_PROGRAMS = test test_CFLAGS = -g -I../../../src test_LDFLAGS = -L../../../src test_LDADD = -ltap CLEANFILES = test.o test.c.out test.pl.out nagios-4.3.4/tap/tests/plan/too-many-plans/Makefile.in000066400000000000000000000405031314764422400226160ustar00rootroot00000000000000# Makefile.in generated by automake 1.9.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SOURCES = test.c srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../../.. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) subdir = tests/plan/too-many-plans DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = test_SOURCES = test.c test_OBJECTS = test-test.$(OBJEXT) test_DEPENDENCIES = DEFAULT_INCLUDES = -I. -I$(srcdir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = test.c DIST_SOURCES = test.c ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ TESTS = test.t TESTS_ENVIRONMENT = $(SHELL) EXTRA_DIST = $(TESTS) test.pl test_CFLAGS = -g -I../../../src test_LDFLAGS = -L../../../src test_LDADD = -ltap CLEANFILES = test.o test.c.out test.pl.out all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/plan/too-many-plans/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --foreign tests/plan/too-many-plans/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; for p in $$list; do \ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ echo " rm -f $$p $$f"; \ rm -f $$p $$f ; \ done test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) @rm -f test$(EXEEXT) $(LINK) $(test_LDFLAGS) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< test-test.o: test.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_CFLAGS) $(CFLAGS) -MT test-test.o -MD -MP -MF "$(DEPDIR)/test-test.Tpo" -c -o test-test.o `test -f 'test.c' || echo '$(srcdir)/'`test.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/test-test.Tpo" "$(DEPDIR)/test-test.Po"; else rm -f "$(DEPDIR)/test-test.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test.c' object='test-test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_CFLAGS) $(CFLAGS) -c -o test-test.o `test -f 'test.c' || echo '$(srcdir)/'`test.c test-test.obj: test.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_CFLAGS) $(CFLAGS) -MT test-test.obj -MD -MP -MF "$(DEPDIR)/test-test.Tpo" -c -o test-test.obj `if test -f 'test.c'; then $(CYGPATH_W) 'test.c'; else $(CYGPATH_W) '$(srcdir)/test.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/test-test.Tpo" "$(DEPDIR)/test-test.Po"; else rm -f "$(DEPDIR)/test-test.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test.c' object='test-test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_CFLAGS) $(CFLAGS) -c -o test-test.obj `if test -f 'test.c'; then $(CYGPATH_W) 'test.c'; else $(CYGPATH_W) '$(srcdir)/test.c'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool uninstall-info-am: ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags check-TESTS: $(TESTS) @failed=0; all=0; xfail=0; xpass=0; skip=0; \ srcdir=$(srcdir); export srcdir; \ list='$(TESTS)'; \ if test -n "$$list"; then \ for tst in $$list; do \ if test -f ./$$tst; then dir=./; \ elif test -f $$tst; then dir=; \ else dir="$(srcdir)/"; fi; \ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *" $$tst "*) \ xpass=`expr $$xpass + 1`; \ failed=`expr $$failed + 1`; \ echo "XPASS: $$tst"; \ ;; \ *) \ echo "PASS: $$tst"; \ ;; \ esac; \ elif test $$? -ne 77; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *" $$tst "*) \ xfail=`expr $$xfail + 1`; \ echo "XFAIL: $$tst"; \ ;; \ *) \ failed=`expr $$failed + 1`; \ echo "FAIL: $$tst"; \ ;; \ esac; \ else \ skip=`expr $$skip + 1`; \ echo "SKIP: $$tst"; \ fi; \ done; \ if test "$$failed" -eq 0; then \ if test "$$xfail" -eq 0; then \ banner="All $$all tests passed"; \ else \ banner="All $$all tests behaved as expected ($$xfail expected failures)"; \ fi; \ else \ if test "$$xpass" -eq 0; then \ banner="$$failed of $$all tests failed"; \ else \ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \ fi; \ fi; \ dashes="$$banner"; \ skipped=""; \ if test "$$skip" -ne 0; then \ skipped="($$skip tests were not run)"; \ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$skipped"; \ fi; \ report=""; \ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ report="Please report to $(PACKAGE_BUGREPORT)"; \ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$report"; \ fi; \ dashes=`echo "$$dashes" | sed s/./=/g`; \ echo "$$dashes"; \ echo "$$banner"; \ test -z "$$skipped" || echo "$$skipped"; \ test -z "$$report" || echo "$$report"; \ echo "$$dashes"; \ test "$$failed" -eq 0; \ else :; fi distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-libtool distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-info-am .PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool ctags \ distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-exec install-exec-am install-info \ install-info-am install-man install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: nagios-4.3.4/tap/tests/plan/too-many-plans/test.c000066400000000000000000000032041314764422400216710ustar00rootroot00000000000000/*- * Copyright (c) 2004 Nik Clayton * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #include #include "tap.h" int main(int argc, char *argv[]) { unsigned int rc = 0; rc = plan_tests(1); diag("Returned: %d", rc); rc = ok(1, NULL); diag("Returned: %d", rc); rc = plan_tests(1); diag("Returned: %d", rc); rc = ok(0, NULL); diag("Returned: %d", rc); return exit_status(); } nagios-4.3.4/tap/tests/plan/too-many-plans/test.pl000066400000000000000000000004031314764422400220600ustar00rootroot00000000000000#!/usr/bin/perl use warnings; use strict; use Test::More; my $rc = 0; $rc = plan tests => 1; diag("Returned: " . sprintf("%d", $rc)); $rc = ok(1); diag("Returned: $rc"); $rc = plan tests => 1; diag("Returned: $rc"); $rc = ok(0); diag("Returned: $rc"); nagios-4.3.4/tap/tests/plan/too-many-plans/test.t000066400000000000000000000010101314764422400217030ustar00rootroot00000000000000#!/bin/sh cd `dirname $0` echo '1..2' make 2>&1 > /dev/null perl ./test.pl 2>&1 | sed -e 's/twice!.*$/twice!/' > test.pl.out perlstatus=$? ./test 2>&1 | sed -e 's/twice!.*$/twice!/' > test.c.out cstatus=$? diff -u test.pl.out test.c.out if [ $? -eq 0 ]; then echo 'ok 1 - output is identical' else echo 'not ok 1 - output is identical' fi if [ $perlstatus -eq $cstatus ]; then echo 'ok 2 - status code' else echo 'not ok 2 - status code' echo "# perlstatus = $perlstatus" echo "# cstatus = $cstatus" fi nagios-4.3.4/tap/tests/plan/too-many-tests/000077500000000000000000000000001314764422400205745ustar00rootroot00000000000000nagios-4.3.4/tap/tests/plan/too-many-tests/Makefile.am000066400000000000000000000003541314764422400226320ustar00rootroot00000000000000 TESTS = test.t TESTS_ENVIRONMENT = $(SHELL) EXTRA_DIST = $(TESTS) test.pl check_PROGRAMS = test test_CFLAGS = -g -I../../../src test_LDFLAGS = -L../../../src test_LDADD = -ltap CLEANFILES = test.o test.c.out test.pl.out nagios-4.3.4/tap/tests/plan/too-many-tests/Makefile.in000066400000000000000000000405031314764422400226430ustar00rootroot00000000000000# Makefile.in generated by automake 1.9.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SOURCES = test.c srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../../.. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) subdir = tests/plan/too-many-tests DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = test_SOURCES = test.c test_OBJECTS = test-test.$(OBJEXT) test_DEPENDENCIES = DEFAULT_INCLUDES = -I. -I$(srcdir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = test.c DIST_SOURCES = test.c ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ TESTS = test.t TESTS_ENVIRONMENT = $(SHELL) EXTRA_DIST = $(TESTS) test.pl test_CFLAGS = -g -I../../../src test_LDFLAGS = -L../../../src test_LDADD = -ltap CLEANFILES = test.o test.c.out test.pl.out all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/plan/too-many-tests/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --foreign tests/plan/too-many-tests/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; for p in $$list; do \ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ echo " rm -f $$p $$f"; \ rm -f $$p $$f ; \ done test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) @rm -f test$(EXEEXT) $(LINK) $(test_LDFLAGS) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< test-test.o: test.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_CFLAGS) $(CFLAGS) -MT test-test.o -MD -MP -MF "$(DEPDIR)/test-test.Tpo" -c -o test-test.o `test -f 'test.c' || echo '$(srcdir)/'`test.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/test-test.Tpo" "$(DEPDIR)/test-test.Po"; else rm -f "$(DEPDIR)/test-test.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test.c' object='test-test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_CFLAGS) $(CFLAGS) -c -o test-test.o `test -f 'test.c' || echo '$(srcdir)/'`test.c test-test.obj: test.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_CFLAGS) $(CFLAGS) -MT test-test.obj -MD -MP -MF "$(DEPDIR)/test-test.Tpo" -c -o test-test.obj `if test -f 'test.c'; then $(CYGPATH_W) 'test.c'; else $(CYGPATH_W) '$(srcdir)/test.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/test-test.Tpo" "$(DEPDIR)/test-test.Po"; else rm -f "$(DEPDIR)/test-test.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test.c' object='test-test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_CFLAGS) $(CFLAGS) -c -o test-test.obj `if test -f 'test.c'; then $(CYGPATH_W) 'test.c'; else $(CYGPATH_W) '$(srcdir)/test.c'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool uninstall-info-am: ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags check-TESTS: $(TESTS) @failed=0; all=0; xfail=0; xpass=0; skip=0; \ srcdir=$(srcdir); export srcdir; \ list='$(TESTS)'; \ if test -n "$$list"; then \ for tst in $$list; do \ if test -f ./$$tst; then dir=./; \ elif test -f $$tst; then dir=; \ else dir="$(srcdir)/"; fi; \ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *" $$tst "*) \ xpass=`expr $$xpass + 1`; \ failed=`expr $$failed + 1`; \ echo "XPASS: $$tst"; \ ;; \ *) \ echo "PASS: $$tst"; \ ;; \ esac; \ elif test $$? -ne 77; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *" $$tst "*) \ xfail=`expr $$xfail + 1`; \ echo "XFAIL: $$tst"; \ ;; \ *) \ failed=`expr $$failed + 1`; \ echo "FAIL: $$tst"; \ ;; \ esac; \ else \ skip=`expr $$skip + 1`; \ echo "SKIP: $$tst"; \ fi; \ done; \ if test "$$failed" -eq 0; then \ if test "$$xfail" -eq 0; then \ banner="All $$all tests passed"; \ else \ banner="All $$all tests behaved as expected ($$xfail expected failures)"; \ fi; \ else \ if test "$$xpass" -eq 0; then \ banner="$$failed of $$all tests failed"; \ else \ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \ fi; \ fi; \ dashes="$$banner"; \ skipped=""; \ if test "$$skip" -ne 0; then \ skipped="($$skip tests were not run)"; \ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$skipped"; \ fi; \ report=""; \ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ report="Please report to $(PACKAGE_BUGREPORT)"; \ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$report"; \ fi; \ dashes=`echo "$$dashes" | sed s/./=/g`; \ echo "$$dashes"; \ echo "$$banner"; \ test -z "$$skipped" || echo "$$skipped"; \ test -z "$$report" || echo "$$report"; \ echo "$$dashes"; \ test "$$failed" -eq 0; \ else :; fi distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-libtool distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-info-am .PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool ctags \ distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-exec install-exec-am install-info \ install-info-am install-man install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: nagios-4.3.4/tap/tests/plan/too-many-tests/test.c000066400000000000000000000031231314764422400217160ustar00rootroot00000000000000/*- * Copyright (c) 2004 Nik Clayton * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #include #include "tap.h" int main(int argc, char *argv[]) { unsigned int rc = 0; rc = plan_tests(5); diag("Returned: %d", rc); rc = ok(1, NULL); diag("Returned: %d", rc); rc = ok(0, NULL); diag("Returned: %d", rc); return exit_status(); } nagios-4.3.4/tap/tests/plan/too-many-tests/test.pl000066400000000000000000000003241314764422400221070ustar00rootroot00000000000000#!/usr/bin/perl use warnings; use strict; use Test::More; my $rc = 0; $rc = plan tests => 5; diag("Returned: " . sprintf("%d", $rc)); $rc = ok(1); diag("Returned: $rc"); $rc = ok(0); diag("Returned: $rc"); nagios-4.3.4/tap/tests/plan/too-many-tests/test.t000066400000000000000000000011021314764422400217320ustar00rootroot00000000000000#!/bin/sh cd `dirname $0` echo '1..2' make 2>&1 > /dev/null perl ./test.pl 2>&1 | sed -e 's/# Failed test \(.*\)/# Failed test ()/' > test.pl.out perlstatus=$? ./test 2>&1 | sed -e 's/# Failed test \(.*\)/# Failed test ()/' > test.c.out cstatus=$? diff -u test.pl.out test.c.out if [ $? -eq 0 ]; then echo 'ok 1 - output is identical' else echo 'not ok 1 - output is identical' fi if [ $perlstatus -eq $cstatus ]; then echo 'ok 2 - status code' else echo 'not ok 2 - status code' echo "# perlstatus = $perlstatus" echo "# cstatus = $cstatus" fi nagios-4.3.4/tap/tests/skip/000077500000000000000000000000001314764422400157055ustar00rootroot00000000000000nagios-4.3.4/tap/tests/skip/Makefile.am000066400000000000000000000003461314764422400177440ustar00rootroot00000000000000 TESTS = test.t TESTS_ENVIRONMENT = $(SHELL) EXTRA_DIST = $(TESTS) test.pl check_PROGRAMS = test test_CFLAGS = -g -I../../src test_LDFLAGS = -L../../src test_LDADD = -ltap CLEANFILES = test.o test.c.out test.pl.out nagios-4.3.4/tap/tests/skip/Makefile.in000066400000000000000000000404151314764422400177560ustar00rootroot00000000000000# Makefile.in generated by automake 1.9.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SOURCES = test.c srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../.. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) subdir = tests/skip DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = test_SOURCES = test.c test_OBJECTS = test-test.$(OBJEXT) test_DEPENDENCIES = DEFAULT_INCLUDES = -I. -I$(srcdir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = test.c DIST_SOURCES = test.c ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ TESTS = test.t TESTS_ENVIRONMENT = $(SHELL) EXTRA_DIST = $(TESTS) test.pl test_CFLAGS = -g -I../../src test_LDFLAGS = -L../../src test_LDADD = -ltap CLEANFILES = test.o test.c.out test.pl.out all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/skip/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --foreign tests/skip/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; for p in $$list; do \ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ echo " rm -f $$p $$f"; \ rm -f $$p $$f ; \ done test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) @rm -f test$(EXEEXT) $(LINK) $(test_LDFLAGS) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< test-test.o: test.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_CFLAGS) $(CFLAGS) -MT test-test.o -MD -MP -MF "$(DEPDIR)/test-test.Tpo" -c -o test-test.o `test -f 'test.c' || echo '$(srcdir)/'`test.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/test-test.Tpo" "$(DEPDIR)/test-test.Po"; else rm -f "$(DEPDIR)/test-test.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test.c' object='test-test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_CFLAGS) $(CFLAGS) -c -o test-test.o `test -f 'test.c' || echo '$(srcdir)/'`test.c test-test.obj: test.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_CFLAGS) $(CFLAGS) -MT test-test.obj -MD -MP -MF "$(DEPDIR)/test-test.Tpo" -c -o test-test.obj `if test -f 'test.c'; then $(CYGPATH_W) 'test.c'; else $(CYGPATH_W) '$(srcdir)/test.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/test-test.Tpo" "$(DEPDIR)/test-test.Po"; else rm -f "$(DEPDIR)/test-test.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test.c' object='test-test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_CFLAGS) $(CFLAGS) -c -o test-test.obj `if test -f 'test.c'; then $(CYGPATH_W) 'test.c'; else $(CYGPATH_W) '$(srcdir)/test.c'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool uninstall-info-am: ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags check-TESTS: $(TESTS) @failed=0; all=0; xfail=0; xpass=0; skip=0; \ srcdir=$(srcdir); export srcdir; \ list='$(TESTS)'; \ if test -n "$$list"; then \ for tst in $$list; do \ if test -f ./$$tst; then dir=./; \ elif test -f $$tst; then dir=; \ else dir="$(srcdir)/"; fi; \ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *" $$tst "*) \ xpass=`expr $$xpass + 1`; \ failed=`expr $$failed + 1`; \ echo "XPASS: $$tst"; \ ;; \ *) \ echo "PASS: $$tst"; \ ;; \ esac; \ elif test $$? -ne 77; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *" $$tst "*) \ xfail=`expr $$xfail + 1`; \ echo "XFAIL: $$tst"; \ ;; \ *) \ failed=`expr $$failed + 1`; \ echo "FAIL: $$tst"; \ ;; \ esac; \ else \ skip=`expr $$skip + 1`; \ echo "SKIP: $$tst"; \ fi; \ done; \ if test "$$failed" -eq 0; then \ if test "$$xfail" -eq 0; then \ banner="All $$all tests passed"; \ else \ banner="All $$all tests behaved as expected ($$xfail expected failures)"; \ fi; \ else \ if test "$$xpass" -eq 0; then \ banner="$$failed of $$all tests failed"; \ else \ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \ fi; \ fi; \ dashes="$$banner"; \ skipped=""; \ if test "$$skip" -ne 0; then \ skipped="($$skip tests were not run)"; \ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$skipped"; \ fi; \ report=""; \ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ report="Please report to $(PACKAGE_BUGREPORT)"; \ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$report"; \ fi; \ dashes=`echo "$$dashes" | sed s/./=/g`; \ echo "$$dashes"; \ echo "$$banner"; \ test -z "$$skipped" || echo "$$skipped"; \ test -z "$$report" || echo "$$report"; \ echo "$$dashes"; \ test "$$failed" -eq 0; \ else :; fi distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-libtool distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-info-am .PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool ctags \ distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-exec install-exec-am install-info \ install-info-am install-man install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: nagios-4.3.4/tap/tests/skip/test.c000066400000000000000000000040341314764422400170310ustar00rootroot00000000000000/*- * Copyright (c) 2004 Nik Clayton * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #include #include "tap.h" int main(int argc, char *argv[]) { unsigned int rc = 0; unsigned int side_effect = 0; rc = plan_tests(4); diag("Returned: %d", rc); rc = ok(1 == 1, "1 equals 1"); /* Should always work */ diag("Returned: %d", rc); do { if(1) { rc = skip(1, "Testing skipping"); continue; } side_effect++; ok(side_effect == 1, "side_effect checked out"); } while(0); diag("Returned: %d", rc); skip_start(1 == 1, 1, "Testing skipping #2"); side_effect++; rc = ok(side_effect == 1, "side_effect checked out"); diag("Returned: %d", rc); skip_end; rc = ok(side_effect == 0, "side_effect is %d", side_effect); diag("Returned: %d", rc); return exit_status(); } nagios-4.3.4/tap/tests/skip/test.pl000066400000000000000000000013131314764422400172170ustar00rootroot00000000000000#!/usr/bin/perl use warnings; use strict; use Test::More; my $rc = 0; $rc = plan tests => 4; diag("Returned: " . sprintf("%d", $rc)); my $side_effect = 0; # Check whether skipping has side effects $rc = ok(1 == 1, '1 equals 1'); # Test ok() passes when it should diag("Returned: $rc"); # Start skipping SKIP: { $rc = skip "Testing skipping", 1; $side_effect++; $rc = ok($side_effect == 1, '$side_effect checked out'); } diag("Returned: $rc"); SKIP: { $rc = skip "Testing skipping #2", 1; diag("Returned: $rc"); $side_effect++; $rc = ok($side_effect == 1, '$side_effect checked out'); diag("Returned: $rc"); } $rc = ok($side_effect == 0, "side_effect is $side_effect"); diag("Returned: $rc"); nagios-4.3.4/tap/tests/skip/test.t000066400000000000000000000011021314764422400170430ustar00rootroot00000000000000#!/bin/sh cd `dirname $0` echo '1..2' make 2>&1 > /dev/null perl ./test.pl 2>&1 | sed -e 's/# Failed test \(.*\)/# Failed test ()/' > test.pl.out perlstatus=$? ./test 2>&1 | sed -e 's/# Failed test \(.*\)/# Failed test ()/' > test.c.out cstatus=$? diff -u test.pl.out test.c.out if [ $? -eq 0 ]; then echo 'ok 1 - output is identical' else echo 'not ok 1 - output is identical' fi if [ $perlstatus -eq $cstatus ]; then echo 'ok 2 - status code' else echo 'not ok 2 - status code' echo "# perlstatus = $perlstatus" echo "# cstatus = $cstatus" fi nagios-4.3.4/tap/tests/todo/000077500000000000000000000000001314764422400157045ustar00rootroot00000000000000nagios-4.3.4/tap/tests/todo/Makefile.am000066400000000000000000000003461314764422400177430ustar00rootroot00000000000000 TESTS = test.t TESTS_ENVIRONMENT = $(SHELL) EXTRA_DIST = $(TESTS) test.pl check_PROGRAMS = test test_CFLAGS = -g -I../../src test_LDFLAGS = -L../../src test_LDADD = -ltap CLEANFILES = test.o test.c.out test.pl.out nagios-4.3.4/tap/tests/todo/Makefile.in000066400000000000000000000404151314764422400177550ustar00rootroot00000000000000# Makefile.in generated by automake 1.9.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ SOURCES = test.c srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../.. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = test$(EXEEXT) subdir = tests/todo DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = test_SOURCES = test.c test_OBJECTS = test-test.$(OBJEXT) test_DEPENDENCIES = DEFAULT_INCLUDES = -I. -I$(srcdir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = test.c DIST_SOURCES = test.c ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_F77 = @ac_ct_F77@ ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ TESTS = test.t TESTS_ENVIRONMENT = $(SHELL) EXTRA_DIST = $(TESTS) test.pl test_CFLAGS = -g -I../../src test_LDFLAGS = -L../../src test_LDADD = -ltap CLEANFILES = test.o test.c.out test.pl.out all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/todo/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --foreign tests/todo/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; for p in $$list; do \ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ echo " rm -f $$p $$f"; \ rm -f $$p $$f ; \ done test$(EXEEXT): $(test_OBJECTS) $(test_DEPENDENCIES) @rm -f test$(EXEEXT) $(LINK) $(test_LDFLAGS) $(test_OBJECTS) $(test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-test.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< test-test.o: test.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_CFLAGS) $(CFLAGS) -MT test-test.o -MD -MP -MF "$(DEPDIR)/test-test.Tpo" -c -o test-test.o `test -f 'test.c' || echo '$(srcdir)/'`test.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/test-test.Tpo" "$(DEPDIR)/test-test.Po"; else rm -f "$(DEPDIR)/test-test.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test.c' object='test-test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_CFLAGS) $(CFLAGS) -c -o test-test.o `test -f 'test.c' || echo '$(srcdir)/'`test.c test-test.obj: test.c @am__fastdepCC_TRUE@ if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_CFLAGS) $(CFLAGS) -MT test-test.obj -MD -MP -MF "$(DEPDIR)/test-test.Tpo" -c -o test-test.obj `if test -f 'test.c'; then $(CYGPATH_W) 'test.c'; else $(CYGPATH_W) '$(srcdir)/test.c'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/test-test.Tpo" "$(DEPDIR)/test-test.Po"; else rm -f "$(DEPDIR)/test-test.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test.c' object='test-test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_CFLAGS) $(CFLAGS) -c -o test-test.obj `if test -f 'test.c'; then $(CYGPATH_W) 'test.c'; else $(CYGPATH_W) '$(srcdir)/test.c'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool uninstall-info-am: ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags check-TESTS: $(TESTS) @failed=0; all=0; xfail=0; xpass=0; skip=0; \ srcdir=$(srcdir); export srcdir; \ list='$(TESTS)'; \ if test -n "$$list"; then \ for tst in $$list; do \ if test -f ./$$tst; then dir=./; \ elif test -f $$tst; then dir=; \ else dir="$(srcdir)/"; fi; \ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *" $$tst "*) \ xpass=`expr $$xpass + 1`; \ failed=`expr $$failed + 1`; \ echo "XPASS: $$tst"; \ ;; \ *) \ echo "PASS: $$tst"; \ ;; \ esac; \ elif test $$? -ne 77; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *" $$tst "*) \ xfail=`expr $$xfail + 1`; \ echo "XFAIL: $$tst"; \ ;; \ *) \ failed=`expr $$failed + 1`; \ echo "FAIL: $$tst"; \ ;; \ esac; \ else \ skip=`expr $$skip + 1`; \ echo "SKIP: $$tst"; \ fi; \ done; \ if test "$$failed" -eq 0; then \ if test "$$xfail" -eq 0; then \ banner="All $$all tests passed"; \ else \ banner="All $$all tests behaved as expected ($$xfail expected failures)"; \ fi; \ else \ if test "$$xpass" -eq 0; then \ banner="$$failed of $$all tests failed"; \ else \ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \ fi; \ fi; \ dashes="$$banner"; \ skipped=""; \ if test "$$skip" -ne 0; then \ skipped="($$skip tests were not run)"; \ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$skipped"; \ fi; \ report=""; \ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ report="Please report to $(PACKAGE_BUGREPORT)"; \ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$report"; \ fi; \ dashes=`echo "$$dashes" | sed s/./=/g`; \ echo "$$dashes"; \ echo "$$banner"; \ test -z "$$skipped" || echo "$$skipped"; \ test -z "$$report" || echo "$$report"; \ echo "$$dashes"; \ test "$$failed" -eq 0; \ else :; fi distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-checkPROGRAMS clean-generic clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-libtool distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-info-am .PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool ctags \ distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-exec install-exec-am install-info \ install-info-am install-man install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: nagios-4.3.4/tap/tests/todo/test.c000066400000000000000000000041771314764422400170400ustar00rootroot00000000000000/*- * Copyright (c) 2004 Nik Clayton * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #include #include "tap.h" int main(int argc, char *argv[]) { unsigned int rc = 0; unsigned int side_effect = 0; rc = plan_tests(5); diag("Returned: %d", rc); rc = ok(1 == 1, "1 equals 1"); /* Should always work */ diag("Returned: %d", rc); todo_start("For testing purposes"); side_effect++; /* This test should fail */ rc = ok(side_effect == 0, "side_effect checked out"); diag("Returned: %d", rc); /* This test should unexpectedly succeed */ rc = ok(side_effect == 1, "side_effect checked out"); diag("Returned: %d", rc); todo_end(); todo_start("Testing printf() %s in todo_start()", "expansion"); rc = ok(0, "dummy test"); diag("Returned: %d", rc); todo_end(); rc = ok(side_effect == 1, "side_effect is %d", side_effect); diag("Returned: %d", rc); return exit_status(); } nagios-4.3.4/tap/tests/todo/test.pl000066400000000000000000000014571314764422400172270ustar00rootroot00000000000000#!/usr/bin/perl use warnings; use strict; use Test::More; my $rc = 0; $rc = plan tests => 5; diag("Returned: " . sprintf("%d", $rc)); my $side_effect = 0; # Check whether TODO has side effects $rc = ok(1 == 1, '1 equals 1'); # Test ok() passes when it should diag("Returned: $rc"); # Start TODO tests TODO: { local $TODO = 'For testing purposes'; $side_effect++; # This test should fail $rc = ok($side_effect == 0, 'side_effect checked out'); diag("Returned: $rc"); # This test should unexpectedly succeed $rc = ok($side_effect == 1, 'side_effect checked out'); diag("Returned: $rc"); } TODO: { local $TODO = 'Testing printf() expansion in todo_start()'; $rc = ok(0, 'dummy test'); diag("Returned: $rc"); } $rc = ok($side_effect == 1, "side_effect is $side_effect"); diag("Returned: $rc"); nagios-4.3.4/tap/tests/todo/test.t000066400000000000000000000011361314764422400170510ustar00rootroot00000000000000#!/bin/sh cd `dirname $0` echo '1..2' make 2>&1 > /dev/null perl ./test.pl 2>&1 | sed -e 's/# Failed (TODO) test \(.*\)/# Failed (TODO) test ()/' > test.pl.out perlstatus=$? ./test 2>&1 | sed -e 's/# Failed (TODO) test \(.*\)/# Failed (TODO) test ()/' > test.c.out cstatus=$? diff -u test.pl.out test.c.out if [ $? -eq 0 ]; then echo 'ok 1 - output is identical' else echo 'not ok 1 - output is identical' fi if [ $perlstatus -eq $cstatus ]; then echo 'ok 2 - status code' else echo 'not ok 2 - status code' echo "# perlstatus = $perlstatus" echo "# cstatus = $cstatus" fi nagios-4.3.4/test/000077500000000000000000000000001314764422400137705ustar00rootroot00000000000000nagios-4.3.4/test/test-downtime.pl000077500000000000000000001556411314764422400171470ustar00rootroot00000000000000#!/usr/bin/perl -w # Script to test downtime in Nagios with and without restarts use English; use Getopt::Long; use Algorithm::Permute; my $testPaused = 0; my @SLEEPTICKS = ( "-", "\\", "|", "/", "-", "\\", "|", "/"); my $USESLEEPTICKS = 0; my $maxStatusLevel = 3; sub statusString { my $level = shift; my $message = shift; return if( $level > $maxStatusLevel); return sprintf( " %s %s", humanTime( time), $message); } # Read the contents of a .dat file such as status.dat or retention.dat sub readDatFile { my $file = shift; # Read the entire file into a variable my $oldrs = $RS; $RS = undef; open( FILE, "$file") || die "Unable to open $file for reading"; my $contents = ; close( FILE) || die "Unable to close $file"; $RS = $oldrs; # Strip comment and blank lines $contents =~ s/#.*\n//g; $contents =~ s/^\s*\n//g; $contents =~ s/\n\s*\n/\n/g; # Break into sections my @sections = split( /}\n/, $contents); my %contents; # Parse each section for( my $x = 0; $x < @sections; $x++) { my @lines = split( /\n/, $sections[ $x]); # Get the section type chomp $lines[ 0]; $lines[ 0] =~ s/^\s*//g; $lines[ 0] =~ s/\s+{\s*$//g; # Create a hash of the remaining lines my $href = {}; for( my $y = 1; $y < @lines; $y++) { next if( $lines[ $y] =~ /^\s*$/); chomp( $lines[ $y]); $lines[ $y] =~ s/^\s*//; $lines[ $y] =~ s/\s*$//; die "Unknown format for line: " . $lines[ $y] unless( $lines[ $y] =~ /^([^=]+)=(.*)$/); my( $key, $value) = ( $1, $2); $href->{ $key} = $value; } # Enter stuff into the contents hash if( $lines[ 0] =~ /^(info|program|programstatus)$/) { $contents{ $lines[ 0]} = $href; } elsif( $lines[ 0] =~ /^(contact|contactstatus|host|hoststatus|service|servicecomment|servicedowntime|servicestatus)$/) { $contents{ $lines[ 0]} = [] unless( exists( $contents{ $lines[ 0]})); push( @{ $contents{ $lines[ 0]}}, $href); } else { die "Unanticipated section encountered: " . $lines[ 0]; } } return \%contents; } # Read the contents of the objects.cache file sub readObjectCache { my $file = shift; # Read the entire file into a variable my $oldrs = $RS; $RS = undef; open( FILE, "$file") || die "Unable to open $file for reading"; my $contents = ; close( FILE) || die "Unable to close $file"; $RS = $oldrs; # Strip comment and blank lines $contents =~ s/#.*\n//g; $contents =~ s/^\s*\n//g; $contents =~ s/\n\s*\n/\n/g; # Break into sections my @sections = split( /}\n/, $contents); my %contents; # Parse each definition for( my $x = 0; $x < @sections; $x++) { my @lines = split( /\n/, $sections[ $x]); # Get the definition type chomp $lines[ 0]; my $definitionType = undef; if( $lines[ 0] =~ /define\s+(\S+)\s*{/) { $definitionType = $1; } die "Unknown definition line: " . $lines[ 0] if( !defined( $definitionType)); # Create a hash of the remaining lines my $href = {}; for( my $y = 1; $y < @lines; $y++) { chomp( $lines[ $y]); next if( $lines[ $y] =~ /^\s*$/); die "Unknown format for line: " . $lines[ $y] unless( $lines[ $y] =~ /^\s*(\S+)\s+(.*)\s*$/); my( $key, $value) = ( $1, $2); $href->{ $key} = $value; } # Enter stuff into the contents hash $contents{ $definitionType} = [] unless( exists( $contents{ $definitionType})); push( @{ $contents{ $definitionType}}, $href); } return \%contents; } # Read the contents of the nagios.cfg file. # NOTE: This function does not recursively read the contents of configuration # files specified in the cfg_file and cfg_dir directives. sub readCfgFile { my $file = shift; my %cfg; open( FILE, "$file") || die "Unable to open $file for reading"; while( ) { chomp; next if( /^\s*#/); next if( /^\s*$/); if( /^([^=]+)\s*=\s*(.*)$/) { my( $key, $value) = ( $1, $2); if( $key =~ /cfg_file|cfg_dir/) { $cfg{ $key} = [] unless( exists( $cfg{ $key})); push( @{ $cfg{ $key}}, $value); } else { die "Parameter $key already exists" if( exists( $cfg{ $key})); $cfg{ $key} = $value; } } else { die "Unknown formatting for line: $_"; } } return \%cfg; } # Send a command to Nagios to schedule downtime sub scheduleDowntime { my $service = shift; my $start = shift; my $end = shift; my $fixed = shift; my $duration = shift; my $comment = shift; my $cmd = sprintf( "%s;%s;%s;%lu;%lu;%d;%u;%u;%s;%s", "SCHEDULE_SVC_DOWNTIME", $service->{ "host_name"}, $service->{ "service_description"}, $start, $end, $fixed, 0, $duration, "Downtime Testing", $comment); my $cmdfile = "/usr/local/nagios/var/rw/nagios.cmd"; open( CMD, ">$cmdfile") || die "Cannot open $cmdfile for writing"; print CMD sprintf( "[%lu] %s\n", time, $cmd); close( CMD) || die "Unable to close $cmdfile"; sleep 1; } # Send a command to Nagios to delete downtime sub deleteDowntime { my $id = shift; my $cfg = shift; my $service = shift; # There is a bug in Nagios that currently causes Nagios to crash when # deleting a downtime. Instead of deleting the downtime, we'll just # have to wait until it ends. my $datfile = readDatFile( $cfg->{ "status_file"}); my $downtimes = findServiceDowntimes( $datfile, $service); while( scalar( @$downtimes) > 0) { sleep 1; $datfile = readDatFile( $cfg->{ "status_file"}); $downtimes = findServiceDowntimes( $datfile, $service); } return; my $cmd = sprintf( "%s;%u", "DEL_SVC_DOWNTIME", $id); my $cmdfile = "/usr/local/nagios/var/rw/nagios.cmd"; open( CMD, ">$cmdfile") || die "Cannot open $cmdfile for writing"; print CMD sprintf( "[%lu] %s\n", time, $cmd); close( CMD) || die "Unable to close $cmdfile"; } # Send a command to Nagios to process passive service check results sub sendPassiveResults { my $service = shift; my $returnCode = shift; my $pluginOutput = shift; my $cmd = sprintf( "%s;%s;%s;%u;%s", "PROCESS_SERVICE_CHECK_RESULT", $service->{ "host_name"}, $service->{ "service_description"}, $returnCode, $pluginOutput); my $cmdfile = "/usr/local/nagios/var/rw/nagios.cmd"; open( CMD, ">$cmdfile") || die "Cannot open $cmdfile for writing"; print CMD sprintf( "[%lu] %s\n", time, $cmd); close( CMD) || die "Unable to close $cmdfile"; } # Determine the amount of time to discover a service failure above # the normal check results reaper frequency sub maxDiscoveryTime { my $cfg = shift; my $service = shift; my $versionMajor = shift; my $maxDiscoveryTime = 0; if( $service->{ "active_checks_enabled"}) { $maxDiscoveryTime += ( $service->{ "check_interval"} * $cfg->{ "interval_length"}); $maxDiscoveryTime += ((( $service->{ "retry_interval"} + ( $versionMajor < 4 ? $cfg->{ "check_result_reaper_frequency"} : 0)) * $cfg->{ "interval_length"}) * ( $service->{ "max_check_attempts"} - 1)); } return $maxDiscoveryTime; } # Return information about a particular service recorded in a .dat file sub findServiceStatus { my $datfile = shift; my $service = shift; my $found; if( exists( $datfile->{ "servicestatus"})) { for( my $x = 0; $x < @{ $datfile->{ "servicestatus"}}; $x++) { if(( $datfile->{ "servicestatus"}->[ $x]->{ "host_name"} eq $service->{ "host_name"}) && ( $datfile->{ "servicestatus"}->[ $x]->{ "service_description"} eq $service->{ "service_description"})) { return $datfile->{ "servicestatus"}->[ $x]; } } } return \$found; } sub findServiceNextCheck { my $cfg = shift; my $service = shift; my $datfile = readDatFile( $cfg->{ "status_file"}); my $serviceStatus = findServiceStatus( $datfile, $service); return $serviceStatus->{ "next_check"}; } # Return information about downtimes for a particular service recorded in a # .dat file sub findServiceDowntimes { my $datfile = shift; my $service = shift; my @found; if( exists( $datfile->{ "servicedowntime"})) { for( my $x = 0; $x < @{ $datfile->{ "servicedowntime"}}; $x++) { if(( $datfile->{ "servicedowntime"}->[ $x]->{ "host_name"} eq $service->{ "host_name"}) && ( $datfile->{ "servicedowntime"}->[ $x]->{ "service_description"} eq $service->{ "service_description"})) { push( @found, $datfile->{ "servicedowntime"}->[ $x]); } } } return \@found; } # Fine a particular service in a config (.cfg) file or the objects cache. sub findService { my $cfgfile = shift; my $host = shift; my $service = shift; if( exists( $cfgfile->{ "service"})) { for( my $x = 0; $x < @{ $cfgfile->{ "service"}}; $x++) { if(( $cfgfile->{ "service"}->[ $x]->{ "host_name"} eq $host) && ( $cfgfile->{ "service"}->[ $x]->{ "service_description"} eq $service)) { return $cfgfile->{ "service"}->[ $x]; } } } return undef; } # Sleep for a given amount of time displaying a message while sleeping sub noisySleep { my $length = shift; my $message = shift; print $message; print " " if( $USESLEEPTICKS); for( my $x = 0; $x < $length; $x++) { if( $USESLEEPTICKS) { printf( "\b%s", $SLEEPTICKS[ $x % scalar( @SLEEPTICKS)]); } else { print "."; } sleep 1; } print "\b " if( $USESLEEPTICKS); print "\n"; } # Sleep until a given time displaying a message while sleeping sub noisySleepUntilTime { my $time = shift; my $message = shift; print $message; print " " if( $USESLEEPTICKS); while( time < $time) { if( $USESLEEPTICKS) { printf( "\b%s", $SLEEPTICKS[ time % scalar( @SLEEPTICKS)]); } else { print "."; } sleep 1; } print "\b " if( $USESLEEPTICKS); print "\n"; } # Sleep until a specified file is updated, displaying a message while sleeping sub noisySleepUntilFileUpdate { my $file = shift; # File whose mtime should be watched my $after = shift; # Time after which file must be updated my $maxtime = shift; # Maximum number of seconds after $after to wait my $message = shift; # Message to display print $message; print " " if( $USESLEEPTICKS); while(( ! -f $file) && ( time < ( $after + $maxtime))) { if( $USESLEEPTICKS) { printf( "\b%s", $SLEEPTICKS[ time % scalar( @SLEEPTICKS)]); } else { print "."; } sleep 1; } my ( $dev, $ino, $mode, $nlink, $uid, $gid, $rdev, $size, $atime, $mtime, $ctime, $blksize, $blocks) = stat( $file); while(( $mtime <= $after) && ( time < ( $after + $maxtime))) { if( $USESLEEPTICKS) { printf( "\b%s", $SLEEPTICKS[ time % scalar( @SLEEPTICKS)]); } else { print "."; } sleep 1; ( $dev, $ino, $mode, $nlink, $uid, $gid, $rdev, $size, $atime, $mtime, $ctime, $blksize, $blocks) = stat( $file); } print "\b " if( $USESLEEPTICKS); print "\n"; if( time >= ( $after + $maxtime)) { die "Maximum time exceeded waiting for $file to update\n"; } } # Verify that a downtime is recorded correctly in a .dat file sub verifyDowntime { my $service = shift; my $cfg = shift; my $downtimeFixed = shift; my $downtimeStart = shift; my $downtimeEnd = shift; my $downtimeDuration = shift; # Grab the status data print statusString( 2, "Reading status data.\n"); my $datfile = readDatFile( $cfg->{ "status_file"}); # Find the downtimes print statusString( 2, "Looking for downtimes.\n"); my $downtimes = findServiceDowntimes( $datfile, $service); # Check to see if we found the correct number of downtimes (1) print statusString( 2, "Verifying the downtime.\n"); if( scalar( @$downtimes) != 1) { print STDERR "Incorrect number of downtimes found: " . scalar( @downtimes) . ".\n"; return 0; } # Verify that the aspects of the downtime match if( $downtimes->[ 0]->{ "fixed"} != $downtimeFixed) { print STDERR sprintf( "Downtime type incorrect: should be %s, is %s.\n", ( $downtimes->[ 0]->{ "fixed"} ? "Fixed" : "Flexible"), ( $downtimeFixed ? "Fixed" : "Flexible")); return 0; } if( $downtimes->[ 0]->{ "start_time"} != $downtimeStart) { print STDERR sprintf( "Downtime start time incorrect: should be %lu, is %lu.\n", $downtimes->[ 0]->{ "start_time"}, $downtimeStart); return 0; } if( $downtimes->[ 0]->{ "end_time"} != $downtimeEnd) { print STDERR sprintf( "Downtime end time incorrect: should be %lu, is %lu.\n", $downtimes->[ 0]->{ "end_time"}, $downtimeEnd); return 0; } if( ! $downtimeFixed && ( $downtimes->[ 0]->{ "duration"} != $downtimeDuration)) { print STDERR sprintf( "Downtime duration incorrect: should be %lu, is %lu.\n", $downtimes->[ 0]->{ "duration"}, $downtimeDuration); return 0; } return 1; } sub recoverService { my $service = shift; my $cfg = shift; my $message = shift; my $nagiosRunning = shift; my $versionMajor = shift; print statusString( 1, sprintf( "%s\n", $message)); if( $service->{ "active_checks_enabled"}) { if(( $service->{ "host_name"} eq "localhost") && ( $service->{ "service_description"} eq "HTTP")) { system( "/sbin/service httpd start"); } elsif(( $service->{ "host_name"} eq "localhost") && ( $service->{ "service_description"} eq "SSH")) { system( "/sbin/service sshd start"); } else { die sprintf( "Don't know how to start service %s:%s", $service->{ "host_name"}, $service->{ "service_description"}); } } else { die "Nagios is not running" unless( $nagiosRunning); sendPassiveResults( $service, 0, "OK - Everything Okey Dokey"); } # If Nagios is running, sleep so an undetected recovery doesn't # interfere with future operations if( $nagiosRunning) { if( $service->{ "active_checks_enabled"}) { my $nextCheck = findServiceNextCheck( $cfg, $service); noisySleepUntilTime( $nextCheck, statusString( 2, sprintf( "Waiting for next check to run at %s", humanTime( $nextCheck)))); } if( $versionMajor < 4) { noisySleep( $cfg->{ "check_result_reaper_frequency"} + 2, statusString( 2, "Waiting for check results reaper to run")); } noisySleepUntilFileUpdate( $cfg->{ "status_file"}, time, $cfg->{ "status_update_interval"} * $cfg->{ "StatusUpdateIntervalMultiplier"}, statusString( 2, "Waiting for status to update")); } return 1; } sub failService { my $service = shift; my $cfg = shift; my $schedule = shift; my $downtimeStart = shift; my $nagiosRunning = shift; my $versionMajor = shift; # downtimeEndCheckIncrement is how much time we're going to add before the # DowntimeEndCheck event due to a service check being delayed after the # service fail command is sent. my $downtimeEndCheckIncrement = 0; print statusString( 1, "Sending service failure.\n"); if( $service->{ "active_checks_enabled"}) { if(( $service->{ "host_name"} eq "localhost") && ( $service->{ "service_description"} eq "HTTP")) { system( "/sbin/service httpd stop"); } elsif(( $service->{ "host_name"} eq "localhost") && ( $service->{ "service_description"} eq "SSH")) { system( "/sbin/service sshd stop"); } else { die sprintf( "Don't know how to stop service %s:%s", $service->{ "host_name"}, $service->{ "service_description"}); } } else { die "Nagios is not running" unless( $nagiosRunning); sendPassiveResults( $service, 2, "CRITICAL - Danger Will Robinson"); } if( $nagiosRunning) { if( $service->{ "active_checks_enabled"}) { my $nextCheck = findServiceNextCheck( $cfg, $service); $downtimeEndCheckIncrement = $nextCheck - time - maxDiscoveryTime( $cfg, $service, $versionMajor); $downtimeEndCheckIncrement = 0 if( $downtimeEndCheckIncrement < 0); noisySleepUntilTime( $nextCheck, statusString( 2, sprintf( "Waiting for next check to run at %s", humanTime( $nextCheck)))); } if( $versionMajor < 4) { noisySleep( $cfg->{ "check_result_reaper_frequency"} + 2, statusString( 2, "Waiting for check results reaper to run")); } noisySleepUntilFileUpdate( $cfg->{ "status_file"}, time, $cfg->{ "status_update_interval"} * $cfg->{ "StatusUpdateIntervalMultiplier"}, statusString( 2, "Waiting for status to update")); if( time < $downtimeStart + $schedule->{ "DowntimeEnd"}) { # We have not passed the end of the downtime waiting for # a check that would trigger a downtime print statusString( 2, "Verifying that flexible downtime is in effect.\n"); my $datfile = readDatFile( $cfg->{ "status_file"}); my $downtimes = findServiceDowntimes( $datfile, $service); if( scalar( @$downtimes) != 1) { print STDERR "Incorrect number of downtimes found: " . scalar( @$downtimes) . "\n"; return ( -1, undef); } if( ! $downtimes->[ 0]->{ "is_in_effect"}) { print STDERR "Downtime is not in effect\n"; return ( -1, undef); } print statusString( 2, sprintf( "The flexible downtime was triggered at %s.\n", humanTime( $downtimes->[ 0]->{ "flex_downtime_start"}))); return ( $downtimeEndCheckIncrement, $downtimes->[ 0]); } else { return ( $downtimeEndCheckIncrement, undef); } } else { return ( 0, undef); } } sub checkStateAfterNagiosRestart { my $cfg = shift; my $service = shift; my $schedule = shift; my $downtimeStart = shift; my $downtimeFixed = shift; my $downtimeAfterServiceFail = shift; my $downtimesAtNagiosStop = shift; # If a flexible downtime was triggered and completed before the # Nagios restart, we have nothing to do. my $durationEndBeforeNagiosStop = ( ! $downtimeFixed && ( $schedule->{ "ServiceFail"} > 0) && ( $schedule->{ "NagiosStop"} > 0) && ( ref( $downtimeAfterServiceFail) eq "HASH") && ( $downtimeAfterServiceFail->{ "flex_downtime_start"} > 0) && ( $downtimeAfterServiceFail->{ "flex_downtime_start"} + $schedule->{ "DowntimeDuration"} < $schedule->{ "NagiosStart"} + $downtimeStart)); print statusString( 3, sprintf( "Downtime duration %s before Nagios was restarted\n", ( $durationEndBeforeNagiosStop ? "ended" : "did not end"))); return 0 if ( $durationEndBeforeNagiosStop); # If the service failed AND recovered while Nagios was down, a flexible # downtime would never be trigged. my $serviceCycleWhileNagiosDown = ( ! $downtimeFixed && ( $schedule->{ "ServiceFail"} > 0) && ( $schedule->{ "NagiosStop"} > 0) && ( $schedule->{ "NagiosStop"} < $schedule->{ "ServiceFail"}) && ( $schedule->{ "ServiceRecover"} < $schedule->{ "NagiosStart"})); print statusString( 3, sprintf( "Service %s while Nagios was down\n", ( $serviceCycleWhileNagiosDown ? "cycled" : "did not cycle"))); return 0 if( $serviceCycleWhileNagiosDown); # downtimeEndCheckIncrement is how much time we're going to add before the # DowntimeEndCheck event due to the downtime not being triggered until # after a Nagios restart, if that even happens my $downtimeEndCheckIncrement = 0; # Determine whether the Nagios restart occurred after the end of the # downtime. my $nagiosRestartAfterDowntimeEnd = ( $schedule->{ "NagiosStart"} > $schedule->{ "DowntimeEnd"}); # Use the above information and the schedule to determine whether a # flexible downtime should have been triggered or should yet be triggered. my $downtimeTriggeredBeforeNagiosStop = 0; my $downtimeTriggeredAfterNagiosStart = 0; if( ! $downtimeFixed) { if(( $schedule->{ "ServiceFail"} > 0) && ( $schedule->{ "ServiceFail"} < $schedule->{ "NagiosStop"})) { $downtimeTriggeredBeforeNagiosStop = 1; print statusString( 3, "Downtime should have been triggered " . "before Nagios stopped\n"); } else { print statusString( 3, "Downtime would not have been triggered " . "before Nagios stopped\n"); } if( ! $nagiosRestartAfterDowntimeEnd && ( $schedule->{ "ServiceFail"} > 0 ) && ( $schedule->{ "NagiosStop"} < $schedule->{ "ServiceFail"}) && ( $schedule->{ "ServiceFail"} < $schedule->{ "NagiosStart"})) { $downtimeTriggeredAfterNagiosStart = 1; print statusString( 3, "Downtime should be triggered after " . "Nagios start\n"); } else { print statusString( 3, "Downtime would not be triggered after " . "Nagios start\n"); } } # If the downtime should have been triggered, but was not detected prior # to the Nagios stop, wait for it to be detected. if( $downtimeTriggeredAfterNagiosStart) { if( $service->{ "active_checks_enabled"}) { my $nextCheck = findServiceNextCheck( $cfg, $service); $downtimeEndCheckIncrement = ( $nextCheck - time) + ( $schedule->{ "NagiosStart"} - $schedule->{ "ServiceFail"}); noisySleepUntilTime( $nextCheck, statusString( 1, sprintf( "Waiting for next check to run at %s", humanTime( $nextCheck)))); } if( time > $downtimeStart + $schedule->{ "DowntimeEnd"}) { # We passed the end of the downtime waiting for a check that # would trigger a downtime print statusString( 2, "Downtime ended while waiting for next check.\n"); return 0; } } # Next determine whether the downtime should still exist my $downtimeShouldExist = 0; if( $downtimeFixed) { if( time < $downtimeStart + $schedule->{ "DowntimeEnd"}) { # If the downtime is fixed and we have not reached the # downtime end, it should still exists so check it below $downtimeShouldExist = 1; } } else { if( ! $downtimeTriggeredBeforeNagiosStop && ! $downtimeTriggeredAfterNagiosStart) { if( time < $downtimeStart + $schedule->{ "DowntimeEnd"}) { # If the downtime is flexible, it was never triggered # and we have not reached the downtime end, it should # still exist so check it below print statusString( 2, "We have not reached the downtime " . "end, so it should still exist.\n"); $downtimeShouldExist = 1; } } else { # In this case the downtime is flexible and should have been # triggered. print statusString( 3, sprintf( "There were %d downtime(s) when Nagios stopped.\n", scalar( @$downtimesAtNagiosStop))); if( scalar( @$downtimesAtNagiosStop) == 1) { print statusString( 3, sprintf( "The flex downtime start for the downtime " . "existing when\nNagios stopped was %s\n", humanTime( $downtimesAtNagiosStop->[ 0]->{ "flex_downtime_start"}))); } if(( scalar( @$downtimesAtNagiosStop) == 1) && ( $downtimesAtNagiosStop->[ 0]->{ "flex_downtime_start"} > 0)) { print statusString( 2, "The downtime was triggered before Nagios stopped.\n"); if( time < ( $downtimesAtNagiosStop->[ 0]->{ "flex_downtime_start"} + $downtimesAtNagiosStop->[ 0]->{ "duration"})) { # If the trigger was detected before Nagios was stopped and # we are still in the flexible downtime, it should exist print statusString( 2, "We have not reached the duration " . "end; it should still exist.\n"); $downtimeShouldExist = 1; } else { print statusString( 2, "We have reached the duration " . "end; it should not exist.\n"); } } elsif( time < ( $downtimeStart + $schedule->{ "NagiosStart"} + $schedule->{ "DowntimeDuration"})) { # If the downtime was not triggered until after Nagios restarted # and we have not reached the duration end, it should still # exist so check it below print statusString( 2, "We have not reached the duration " . "end; it should still exist.\n"); $downtimeShouldExist = 1; } } } # If the downtime should exist, verify the downtime is back. If it should # not exist, verification that the downtime is gone happens at the # DowntimeEndCheck event. if( $downtimeShouldExist) { print statusString( 1, "Verifying downtime after Nagios restart.\n"); if( !verifyDowntime( $service, $cfg, $downtimeFixed, $downtimeStart, $downtimeStart + ( $schedule->{ "DowntimeEnd"} - $schedule->{ "DowntimeStart"}), $schedule->{ "DowntimeDuration"})) { return -1; } } else { print statusString( 1, "The downtime should have ended; it will be checked later.\n"); } return $downtimeEndCheckIncrement; } # Perform the check of a downtime sequence sub checkDowntime { my $testComment = shift; my $service = shift; my $cfg = shift; my $downtimeFixed = shift; my $schedule = shift; my $versionMajor = shift; my $startTime = time; my $datfile; my $nagiosRunning = 1; my $downtimesAtNagiosStop; my $downtimeAfterServiceFail; my $downtimeEndCheckIncrement = 0; print "$testComment\n"; # Verify parameters die "No downtime start specified" unless( exists( $schedule->{ "DowntimeStart"})); die "No downtime end specified" unless( $schedule->{ "DowntimeEnd"} >= 0); die "No downtime duration specified" unless( $downtimeFixed || $schedule->{ "DowntimeDuration"} >= 0); # Determine the amount of time to discover a service failure above # the normal check results reaper frequency my $maxDiscoveryTime = maxDiscoveryTime( $cfg, $service, $versionMajor); # Create an events list my @events; my $eventTime; # Figure out the time for the check at the end of the downtime if( ! $downtimeFixed && $schedule->{ "ServiceFail"} > 0) { if( $schedule->{ "NagiosStart"} > $schedule->{ "ServiceFail"} + $schedule->{ "DowntimeDuration"} + $maxDiscoveryTime) { $eventTime = $schedule->{ "NagiosStart"} + 1; } else { $eventTime = $schedule->{ "ServiceFail"} + $schedule->{ "DowntimeDuration"}; if( $service->{ "active_checks_enabled"}) { $eventTime += $maxDiscoveryTime; } } } else { if( $schedule->{ "NagiosStart"} > ( $schedule->{ "DowntimeEnd"} - $schedule->{ "DowntimeStart"})) { $eventTime = $schedule->{ "NagiosStart"} + 1; } else { $eventTime = ( $schedule->{ "DowntimeEnd"} - $schedule->{ "DowntimeStart"}); } } push( @events, { "time" => $eventTime + $cfg->{ "status_update_interval"}, "type" => "DowntimeEndCheck"}); # Add the Nagios stop and start events if they're in the permutation if( $schedule->{ "NagiosStop"} > 0) { push( @events, { "time" => $schedule->{ "NagiosStop"}, "type" => "NagiosStop"}); if( $schedule->{ "NagiosStart"} > 0) { push( @events, { "time" => $schedule->{ "NagiosStart"}, "type" => "NagiosStart"}); } else { die "No Nagios restart time specified"; } } # Add the service failure and recover events if they're in the permutation if( $schedule->{ "ServiceFail"} > 0) { push( @events, { "time" => $schedule->{ "ServiceFail"}, "type" => "ServiceFail"}); if( $schedule->{ "ServiceRecover"} > 0) { push( @events, { "time" => $schedule->{ "ServiceRecover"}, "type" => "ServiceRecover"}); } else { die "No service recovery time specified"; } } # Sort the events in chronological order my @sortedEvents = sort { $a->{ "time"} <=> $b->{ "time"}} @events; # Make sure the service starts in a good state if( ! recoverService( $service, $cfg, "Making sure the service is in a good state.", $nagiosRunning, $versionMajor)) { return -1; } # Cancel all current downtimes print statusString( 1, "Deleting current downtimes: "); $datfile = readDatFile( $cfg->{ "status_file"}); $downtimes = findServiceDowntimes( $datfile, $service); for( my $x = 0; $x < @$downtimes; $x++) { print ", " if( $x > 0); print $downtimes->[ $x]->{ "downtime_id"}; deleteDowntime( $downtimes->[ $x]->{ "downtime_id"}, $cfg, $service); } print "\n"; # Schedule the downtime my $downtimeStart = time + $schedule->{ "DowntimeStart"}; if( $downtimeFixed) { print statusString( 1, sprintf( "Scheduling fixed downtime\n\t\tfrom %s to %s.\n", humanTime( $downtimeStart), humanTime( $downtimeStart + ( $schedule->{ "DowntimeEnd"} - $schedule->{ "DowntimeStart"})))); } else { print statusString( 1, sprintf( "Scheduling flexible downtime of " . "%d seconds\n\t\tfrom %s to %s.\n", $schedule->{ "DowntimeDuration"}, humanTime( $downtimeStart), humanTime( $downtimeStart + ( $schedule->{ "DowntimeEnd"} - $schedule->{ "DowntimeStart"})))); } scheduleDowntime( $service, $downtimeStart, $downtimeStart + ( $schedule->{ "DowntimeEnd"} - $schedule->{ "DowntimeStart"}), $downtimeFixed, $schedule->{ "DowntimeDuration"}, $testComment); # Wait for the status file to update noisySleepUntilFileUpdate( $cfg->{ "status_file"}, time, $cfg->{ "status_update_interval"} * $cfg->{ "StatusUpdateIntervalMultiplier"}, statusString( 2, "Waiting for status to update")); # Verify the downtime if( !verifyDowntime( $service, $cfg, $downtimeFixed, $downtimeStart, $downtimeStart + ( $schedule->{ "DowntimeEnd"} - $schedule->{ "DowntimeStart"}), $schedule->{ "DowntimeDuration"})) { return -1; } # Enter the event loop my $eventIndex = 0; while( $eventIndex < @sortedEvents) { # Sleep until the next event is to to be executed if( time < ( $downtimeStart + $sortedEvents[ $eventIndex]->{ "time"})) { my $message = statusString( 1, sprintf( "Waiting for %s event at %s", $sortedEvents[ $eventIndex]->{ "type"}, humanTime( $downtimeStart + $sortedEvents[ $eventIndex]->{ "time"}))); noisySleepUntilTime(( $downtimeStart + $sortedEvents[ $eventIndex]->{ "time"}), $message); } # Verify the downtime is gone at the end of the check if( $sortedEvents[ $eventIndex]->{ "type"} eq "DowntimeEndCheck") { noisySleepUntilFileUpdate( $cfg->{ "status_file"}, time, $cfg->{ "status_update_interval"} * $cfg->{ "StatusUpdateIntervalMultiplier"}, statusString( 2, "Waiting for status to update")); # Grab the status data again print statusString( 2, "Rereading status data.\n"); $datfile = readDatFile( $cfg->{ "status_file"}); # Find the downtimes print statusString( 2, "Looking for downtimes again.\n"); $downtimes = findServiceDowntimes( $datfile, $service); print statusString( 1, "Verifying the downtime has ended.\n"); if( scalar( @$downtimes) > 0) { for( my $y = 0; $y < @$downtimes; $y++) { if( $downtimes->[ $y]->{ "is_in_effect"}) { print STDERR "Downtime still exists.\n"; return -1; } } } } # Restart Nagios elsif( $sortedEvents[ $eventIndex]->{ "type"} eq "NagiosStart") { print statusString( 1, "Starting Nagios.\n"); system( "/sbin/service nagios start"); system( "/bin/chgrp nagcmd /usr/local/nagios/var/rw/nagios.cmd"); # Wait for the status file to update noisySleepUntilFileUpdate( $cfg->{ "status_file"}, time, $cfg->{ "status_update_interval"} * $cfg->{ "StatusUpdateIntervalMultiplier"}, statusString( 2, "Waiting for status to update")); # Check the status of things after the Nagios restart $downtimeEndCheckIncrement = checkStateAfterNagiosRestart( $cfg, $service, $schedule, $downtimeStart, $downtimeFixed, $downtimeAfterServiceFail, $downtimesAtNagiosStop); if( $downtimeEndCheckIncrement < 0) { return -1; } elsif( $downtimeEndCheckIncrement > 0) { print statusString( 3, sprintf( "Extending the DowntimeEndCheck time by %d " . "seconds\n", $downtimeEndCheckIncrement)); $sortedEvents[ @sortedEvents - 1]->{ "time"} += $downtimeEndCheckIncrement; } $nagiosRunning = 1; } # Stop Nagios elsif( $sortedEvents[ $eventIndex]->{ "type"} eq "NagiosStop") { $datfile = readDatFile( $cfg->{ "status_file"}); $downtimesAtNagiosStop = findServiceDowntimes( $datfile, $service); print statusString( 3, sprintf( "There are %d downtime(s) just before stopping Nagios.\n", scalar( @$downtimesAtNagiosStop))); print statusString( 1, "Stopping Nagios.\n"); system( "/sbin/service nagios stop"); $nagiosRunning = 0; } # Cause the service to fail elsif( $sortedEvents[ $eventIndex]->{ "type"} eq "ServiceFail") { ( $downtimeEndCheckIncrement, $downtimeAfterServiceFail) = failService( $service, $cfg, $schedule, $downtimeStart, $nagiosRunning, $versionMajor); if( $downtimeEndCheckIncrement < 0) { return -1; } elsif( $downtimeEndCheckIncrement > 0) { print statusString( 3, sprintf( "Extending the DowntimeEndCheck time by %d " . "seconds\n", $downtimeEndCheckIncrement)); $sortedEvents[ @sortedEvents - 1]->{ "time"} += $downtimeEndCheckIncrement; } } # Cause the service to recover elsif( $sortedEvents[ $eventIndex]->{ "type"} eq "ServiceRecover") { if( !recoverService( $service, $cfg, "Sending service recovery.", $nagiosRunning, $versionMajor)) { return -1; } } # Something is dreadfully wrong else { die "Unhandled event type: " . $sortedEvents[ $eventIndex]->{ "type"}; } $eventIndex++; } return( time - $startTime); } # Determine whether a event permutation is valid sub isValidEventPermutation { my $permutation = shift; my $activeChecks = shift; # Create a hash of the events with the event name as the key and the order # as the value. my %permutation; for( my $x = 0; $x < @$permutation; $x++) { $permutation{ $permutation->[ $x]} = $x; } # The downtime cannot be created after it ends if( exists( $permutation{ "DowntimeEnd"}) && exists( $permutation{ "EntryTime"}) && ( $permutation{ "DowntimeEnd"} < $permutation{ "EntryTime"})) { return 0; } # The downtime cannot end before it starts if( exists( $permutation{ "DowntimeEnd"}) && exists( $permutation{ "DowntimeStart"}) && ( $permutation{ "DowntimeEnd"} < $permutation{ "DowntimeStart"})) { return 0; } # The service cannot recover before it fails if( exists( $permutation{ "ServiceFail"}) && exists( $permutation{ "ServiceRecover"}) && ( $permutation{ "ServiceRecover"} < $permutation{ "ServiceFail"})) { return 0; } # Nagios cannot be restarted before it is initially stopped if( exists( $permutation{ "NagiosStop"}) && exists( $permutation{ "NagiosStart"}) && ( $permutation{ "NagiosStart"} < $permutation{ "NagiosStop"})) { return 0; } # It doesn't make sense to test when a service failure occurs after the # end of the downtime if( exists( $permutation{ "ServiceFail"}) && exists( $permutation{ "DowntimeEnd"}) && ( $permutation{ "ServiceFail"} > $permutation{ "DowntimeEnd"})) { return 0; } # It doesn't make sense to test when a service failure occurs before the # downtime is created if( exists( $permutation{ "ServiceFail"}) && exists( $permutation{ "EntryTime"}) && ( $permutation{ "ServiceFail"} < $permutation{ "EntryTime"})) { return 0; } # It doesn't make sense to test when a service failure occurs before the # downtime starts if( exists( $permutation{ "ServiceFail"}) && exists( $permutation{ "DowntimeStart"}) && ( $permutation{ "ServiceFail"} < $permutation{ "DowntimeStart"})) { return 0; } # It doesn't make sense to test when a Nagios shutdown occurs after the # end of the downtime if( exists( $permutation{ "NagiosStop"}) && exists( $permutation{ "DowntimeEnd"}) && ( $permutation{ "NagiosStop"} > $permutation{ "DowntimeEnd"})) { return 0; } # A downtime cannot be created when Nagios is shutdown and it doesn't # make sense to test when Nagios is shutdown and restarted before the # downtime is created if( exists( $permutation{ "NagiosStop"}) && exists( $permutation{ "EntryTime"}) && ( $permutation{ "NagiosStop"} < $permutation{ "EntryTime"})) { return 0; } # It doesn't make sense for the duration to be so short it ends before # any real testing occurs if( exists( $permutation{ "DurationEnd"}) && ( $permutation{ "DurationEnd"} < 1)) { return 0; } # The following only applies to passive checks unless( $activeChecks) { # A passive service failure cannot be sent to Nagios when it is not # running if( exists( $permutation{ "ServiceFail"}) && exists( $permutation{ "NagiosStop"}) && exists( $permutation{ "NagiosStart"}) && ( $permutation{ "ServiceFail"} > $permutation{ "NagiosStop"}) && ( $permutation{ "ServiceFail"} < $permutation{ "NagiosStart"})) { return 0; } # A passive service recovery cannot be sent to Nagios when it is not # running if( exists( $permutation{ "ServiceRecover"}) && exists( $permutation{ "NagiosStop"}) && exists( $permutation{ "NagiosStart"}) && ( $permutation{ "ServiceRecover"} > $permutation{ "NagiosStop"}) && ( $permutation{ "ServiceRecover"} < $permutation{ "NagiosStart"})) { return 0; } } return 1; } # Display a time in human-readable format sub humanTime { my $epoch = shift; my $longFormat = 0; $longFormat = shift if( @_); my ( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime( $epoch); if( $longFormat) { return sprintf( "%04d-%02d-%02d %02d:%02d:%02d", $year+1900, $mon+1, $mday, $hour, $min, $sec); } else { return sprintf( "%02d:%02d:%02d", $hour, $min, $sec); } } # Display a time duration in human-readable format sub humanDuration { my $duration = shift; my $wordyFormat = 0; $wordyFormat = shift if( @_); my ( $durationLeft, $hours, $minutes, $seconds); $durationLeft = $duration; $hours = int( $durationLeft / ( 60 * 60)); $durationLeft -= $hours * 60 * 60; $minutes = int( $durationLeft / 60); $durationLeft -= $minutes * 60; $seconds = $durationLeft; if( $wordyFormat) { if( $hours > 0) { return sprintf( "%d hour%s, %d minute%s, %d second%s", $hours, ( $hours == 1 ? "" : "s"), $minutes, ( $minutes == 1 ? "" : "s"), $seconds, ( $seconds == 1 ? "" : "s")); } elsif( $minutes > 0) { return sprintf( "%d minute%s, %d second%s", $minutes, ( $minutes == 1 ? "" : "s"), $seconds, ( $seconds == 1 ? "" : "s")); } else { return sprintf( "%d second%s", $duration, ( $duration == 1 ? "" : "s")); } } else { return sprintf( "%02d:%02d:%02d (%ds)", $hours, $minutes, $seconds, $duration); } } # Schedule a downtime series' event times sub scheduleDowntimePermutation { my $service = shift; my $cfg = shift; my $permutation = shift; my $versionMajor = shift; # Initialize times my %schedule; $schedule{ "DowntimeStart"} = -1; $schedule{ "DowntimeEnd"} = -1; $schedule{ "DowntimeDuration"} = -1; $schedule{ "NagiosStop"} = -1; $schedule{ "NagiosStart"} = -1; $schedule{ "ServiceFail"} = -1; $schedule{ "ServiceRecover"} = -1; # Determine the amount of time to discover a service failure above # the normal check results reaper frequency my $maxDiscoveryTime = maxDiscoveryTime( $cfg, $service, $versionMajor); # Get the current time, to be used for all future times my $currentTime = time; # Last event time my $lastEventTime; if( $permutation->[ 0] eq "EntryTime") { $schedule{ "DowntimeStart"} = 10; $lastEventTime = $schedule{ "DowntimeStart"}; } elsif( $permutation->[ 0] eq "DowntimeStart") { $schedule{ "DowntimeStart"} = -10; $lastEventTime = $schedule{ "DowntimeStart"} + ( $versionMajor < 4 ? $cfg->{ "check_result_reaper_frequency"} : 0) + 2 ; } else { die "Unsupported permutation order: " . $permutation->[ 0] . " => " . $permutation->[ 1]; } print join( " => ", @$permutation) . "\n"; printf( " Downtime Start: %s\n", $schedule{ "DowntimeStart"}); # Iterate through the remaining events, determining the time for each for( my $x = 0; $x < @$permutation; $x++) { if( $permutation->[ $x] eq "DowntimeEnd") { $schedule{ "DowntimeEnd"} = $lastEventTime + ( $cfg->{ "status_update_interval"} * $cfg->{ "StatusUpdateIntervalMultiplier"}); $lastEventTime = $schedule{ "DowntimeEnd"}; printf( " Downtime End: %s\n", $schedule{ "DowntimeEnd"}); } elsif( $permutation->[ $x] eq "DowntimeStart") { ; # Do nothing - Downtime Start was determined earlier } elsif( $permutation->[ $x] eq "DurationEnd") { $schedule{ "DowntimeDuration"} = ( $lastEventTime - $schedule{ "DowntimeStart"}) + ( $cfg->{ "status_update_interval"} * $cfg->{ "StatusUpdateIntervalMultiplier"} + $maxDiscoveryTime); $lastEventTime = $schedule{ "DowntimeDuration"} + $schedule{ "DowntimeStart"}; printf( " Duration: %d\n", $schedule{ "DowntimeDuration"}); } elsif( $permutation->[ $x] eq "EntryTime") { ; # Do nothing } elsif( $permutation->[ $x] eq "NagiosStop") { $schedule{ "NagiosStop"} = $lastEventTime + ( $cfg->{ "status_update_interval"} * $cfg->{ "StatusUpdateIntervalMultiplier"}); $lastEventTime = $schedule{ "NagiosStop"}; printf( " Nagios Stop: %s\n", $schedule{ "NagiosStop"}); } elsif( $permutation->[ $x] eq "NagiosStart") { $schedule{ "NagiosStart"} = $lastEventTime + ( $cfg->{ "status_update_interval"} * $cfg->{ "StatusUpdateIntervalMultiplier"}); $lastEventTime = $schedule{ "NagiosStart"}; printf( " Nagios Start: %s\n", $schedule{ "NagiosStart"}); } elsif( $permutation->[ $x] eq "ServiceFail") { $schedule{ "ServiceFail"} = $lastEventTime + ( $cfg->{ "status_update_interval"} * $cfg->{ "StatusUpdateIntervalMultiplier"}); $lastEventTime = $schedule{ "ServiceFail"} + ( $versionMajor < 4 ? $cfg->{ "check_result_reaper_frequency"} : 0) + $maxDiscoveryTime; printf( " Service Fail: %s\n", $schedule{ "ServiceFail"}); } elsif( $permutation->[ $x] eq "ServiceRecover") { $schedule{ "ServiceRecover"} = $lastEventTime + ( $cfg->{ "status_update_interval"} * $cfg->{ "StatusUpdateIntervalMultiplier"}); $lastEventTime = $schedule{ "ServiceRecover"} + ( $versionMajor < 4 ? $cfg->{ "check_result_reaper_frequency"} : 0) + $maxDiscoveryTime; printf( " Service Recover: %s\n", $schedule{ "ServiceRecover"}); } else { die "Unhandled event type: " . $permutation->[ $x]; } } return \%schedule; } # Generate a list of valid permutations for fixed downtime events sub fixedDowntimeTestPermutations { my $service = shift; my @allPermutations; my @noRestart = ( "EntryTime", "DowntimeStart", "DowntimeEnd"); my $iteratorNoRestart= Algorithm::Permute->new ( \@noRestart); while (my @perm1 = $iteratorNoRestart->next) { if( isValidEventPermutation( \@perm1, $service->{ "active_checks_enabled"})) { # print "(@perm1)\n"; push( @allPermutations, \@perm1); } } my @withRestart = ( "EntryTime", "DowntimeStart", "NagiosStop", "NagiosStart", "DowntimeEnd"); my $iteratorWithRestart = Algorithm::Permute->new ( \@withRestart); while (my @perm2 = $iteratorWithRestart->next) { if( isValidEventPermutation( \@perm2, $service->{ "active_checks_enabled"})) { # print "(@perm2)\n"; push( @allPermutations, \@perm2); } } return \@allPermutations; } # Generate a list of valid permutations for flexible downtime events sub flexibleDowntimeTestPermutations { my $service = shift; my @allPermutations; my @noRestartOrTrigger = ( "EntryTime", "DowntimeStart", "DurationEnd", "DowntimeEnd"); my $iteratorNoRestartOrTrigger = Algorithm::Permute->new ( \@noRestartOrTrigger ); while (my @perm1 = $iteratorNoRestartOrTrigger->next) { if( isValidEventPermutation( \@perm1, $service->{ "active_checks_enabled"})) { push( @allPermutations, \@perm1); } } my @noRestart = ( "EntryTime", "DowntimeStart", "DurationEnd", "DowntimeEnd", "ServiceFail", "ServiceRecover"); my $iteratorNoRestart = Algorithm::Permute->new ( \@noRestart ); while (my @perm2 = $iteratorNoRestart->next) { if( isValidEventPermutation( \@perm2, $service->{ "active_checks_enabled"})) { push( @allPermutations, \@perm2); } } my @noTrigger = ( "EntryTime", "DowntimeStart", "DurationEnd", "DowntimeEnd", "NagiosStop", "NagiosStart"); my $iteratorNoTrigger = Algorithm::Permute->new ( \@noTrigger ); while (my @perm3 = $iteratorNoTrigger->next) { if( isValidEventPermutation( \@perm3, $service->{ "active_checks_enabled"})) { push( @allPermutations, \@perm3); } } my @allEvents = ( "EntryTime", "DowntimeStart", "DurationEnd", "DowntimeEnd", "NagiosStop", "NagiosStart", "ServiceFail", "ServiceRecover"); my $iteratorAllEventns = Algorithm::Permute->new ( \@allEvents ); while (my @perm4 = $iteratorAllEventns->next) { if( isValidEventPermutation( \@perm4, $service->{ "active_checks_enabled"})) { push( @allPermutations, \@perm4); } } return \@allPermutations; } # This function verifies the global Nagios configuration sub verifyConfig { my $cfg = shift; my $versionMajor = shift; # Verify the status update interval if( $cfg->{ "status_update_interval"} < 5) { print STDERR sprintf( "status_update_interval (%d) is too short\n", $cfg->{ "status_update_interval"}); return 0; } if( $cfg->{ "status_update_interval"} >= 10) { print sprintf( "The status_update_interval (%d) is long. " . "It should optimally be 5 seconds.\n", $cfg->{ "status_update_interval"}); print "Press ENTER to continue..."; ; } if( $versionMajor < 4) { # Verify the check_result_reaper_frequency if( $cfg->{ "check_result_reaper_frequency"} < 5) { print STDERR sprintf( "check_result_reaper_frequency (%d) is too " . "short\n", $cfg->{ "check_result_reaper_frequency"}); return 0; } if( $cfg->{ "check_result_reaper_frequency"} >= 10) { print sprintf( "The check_result_reaper_frequency (%d) is long. " . "It should optimally be 5 seconds.\n", $cfg->{ "check_result_reaper_frequency"}); print "Press ENTER to continue..."; ; } } return 1; } sub verifyService { my $cfg = shift; my $hostName = shift; my $serviceDescription = shift; # Make sure there is an appropriately configured service before we # start testing. my $objects = readObjectCache( $cfg->{ "object_cache_file"}); my $service = findService( $objects, $hostName, $serviceDescription); if( !defined( $service)) { print STDERR sprintf( "No service found for host '%s' and " . "service description '%s'.\n", $hostName, $serviceDescription); return undef; } if( !( $service->{ "active_checks_enabled"} || $service->{ "passive_checks_enabled"})) { print STDERR sprintf( "Either active or passive checks must be " . "enabled for %s:%s\n", $hostName, $serviceDescription); return undef; } if( $service->{ "notifications_enabled"}) { print STDERR sprintf( "Notifications must not be enabled for %s:%s\n", $hostName, $serviceDescription); return undef; } if( $service->{ "flap_detection_enabled"}) { print STDERR sprintf( "Flap detection must not be enabled for %s:%s\n", $hostName, $serviceDescription); return undef; } if( $service->{ "process_perf_data"}) { print STDERR sprintf( "Performance data processing must not be " . "enabled for %s:%s\n", $hostName, $serviceDescription); return undef; } if( $service->{ "active_checks_enabled"}) { if( $service->{ "max_check_attempts"} > 1) { print sprintf( "The max_check_attempts (%d) is high. " . "It should optimally be 1.\n", $cfg->{ "max_check_attempts"}); print "Press ENTER to continue..."; ; } if( $service->{ "check_interval"} > 1) { print sprintf( "The normal_check_interval (%d) is long. " . "It should optimally be 1 minute.\n", $cfg->{ "normal_interval"}); print "Press ENTER to continue..."; ; } if(( $service->{ "max_check_attempts"} > 1) && ( $service->{ "retry_interval"} > 1)) { print sprintf( "The retry_check_interval (%d) is long. " . "It should optimally be 1 minute.\n", $cfg->{ "retry_interval"}); print "Press ENTER to continue..."; ; } } else { if( $service->{ "check_freshness"}) { print STDERR sprintf( "check_freshness must not be enabled " . "for %s:%s\n", $hostName, $serviceDescription); return undef; } if( $service->{ "max_check_attempts"} != 1) { print STDERR sprintf( "max_check_attempts must be 1 for %s:%s\n", $hostName, $serviceDescription); return undef; } } return $service; } sub getVersion { my $cfg = shift; my $status = readDatFile( $cfg->{ "status_file"}); my @versionparts = split( /\./, $status->{ "info"}->{ "version"}); my %version; $version{ "major"} = $versionparts[ 0]; $version{ "minor"} = $versionparts[ 1]; $version{ "micro"} = $versionparts[ 2]; return \%version; } sub isInArray { my $string = shift; my $array = shift; for( my $x = 0; $x < @$array; $x++) { return 1 if( $array->[ $x] eq $string); } return 0; } # This is the SIGUSR1 handler - it sets a flag that causes the test to # pause. sub pauseTest { $testPaused = 1; } sub usage { my $cmd = shift; print < --service-description [--single-run ] [--no-fixed-tests] [--no-flexible-tests] [--skip-logged ] [--help|-?] Where: --host-name specifies the name of the host whose service is to be used for the downtime check. --service-description specifies the name of the service to be used for the downtime check. --single-run indicates that the single specified test is to be run. must be of the form "(Fixed|Flexible) downtime: " is a comma and space separated list of the following events: EntryTime, DowntimeStart, [NagiosStop, NagiosStart,] [ServiceFail, ServiceRecover,] DurationEnd, DowntimeEnd. The events within the brackets are optional, but if one of the pair is used, both must be used. Hint: the format of is the same as is displayed at the beginning of each downtime check when --single-run is not specified. --no-fixed-tests indicates that no fixed tests should be run. This option is ignored is --single-run is specified. --no-flexible-tests indicates that no flexible tests should be run. This option is ignored is --single-run is specified. --skip-logged indicates that any tests logged in should be skipped. This is useful for start over where you left off if the test had been aborted prematurely. --help|-? displays this help message. EOU } # Host and service to be used for testing my $hostName = "localhost"; my $serviceDescription = "Downtime Test"; my $singleRun = undef; my $logFile = undef; my $noFixedTests = 0; my $noFlexibleTests = 0; my $showUsage = 0; $result = GetOptions ( "host-name=s" => \$hostName, "service-description=s" => \$serviceDescription, "single-run=s" => \$singleRun, "no-fixed-tests" => \$noFixedTests, "no-flexible-tests" => \$noFlexibleTests, "skip-logged=s" => \$logFile, "help|?" => \$showUsage); die "Error processing command line options" unless( $result); if( $showUsage) { usage( $PROGRAM_NAME); exit( 0); } # Install signal handle to enable test pausing $SIG{ "USR1"} = "pauseTest"; # Make sure we're running as root if( $EUID != 0) { print STDERR "This script must be run as root.\n"; exit 1; } # Make sure Nagios is running my $status = `/sbin/service nagios status`; if( $status !~ /nagios \(pid( \d+)+\) is running.../) { print STDERR "Nagios must be running in order to run this test.\n"; exit 1; } # Read the Nagios configuration my $cfg = readCfgFile( "/usr/local/nagios/etc/nagios.cfg"); exit 1 unless( defined( $cfg)); # Get the version my $version = getVersion( $cfg); printf( "Nagios version is %d.%d.%d\n", $version->{ "major"}, $version->{ "minor"}, $version->{ "micro"}); # Verify the global configuration unless( verifyConfig( $cfg, $version->{ "major"}) > 0) { exit 1; } $cfg->{ "StatusUpdateIntervalMultiplier"} = 4; # Verify the service configuration my $service = verifyService( $cfg, $hostName, $serviceDescription); exit 1 unless( defined( $service)); # Enable autoflush on STDOUT so updates occur my $old_fh = select(STDOUT); $| = 1; select($old_fh); my $activeChecks = 0; my $permutationTime = 0; my $elapsedTime = 0; my $schedule; my $comment; #my @testPerm = ( "DowntimeStart", "DurationEnd", "EntryTime", "ServiceFail", "NagiosStop", "DowntimeEnd", "NagiosStart", "ServiceRecover"); #my $testSchedule = scheduleDowntimePermutation( $service, $cfg, \@testPerm, # $version->{ "major"}); #my $testComment = join( ", ", @testPerm); #checkDowntime( "Flexible downtime: $testComment", $service, $cfg, 0, # $testSchedule, $version->{ "major"}); #exit( 0); if( defined( $singleRun)) { if( $singleRun =~ /^(Fixed|Flexible) downtime: (.*)/) { my $downtimeType = $1; my @singleRunPerm = split( /, /, $2); my $fixed = (( $singleRun =~ /^Fixed/) ? 1 : 0); my $testSchedule = scheduleDowntimePermutation( $service, $cfg, \@singleRunPerm, $version->{ "major"}); my $testComment = join( ", ", @singleRunPerm); checkDowntime( "$downtimeType downtime: $testComment", $service, $cfg, $fixed, $testSchedule, $version->{ "major"}); exit 0; } else { die "Unrecognized single run format: $singleRun"; } } else { my @skipTests = (); if( defined( $logFile)) { open( LOG, "$logFile") || die "Unable to open log file $logFile for reading"; while( ) { chomp; push( @skipTests, $_) if( /^(Fixed|Flexible) downtime: /); } close( LOG) || die "Unable to close $logFile"; } my $lastTriedPermutation = -1; unless( $noFixedTests) { my $fixedDowntimeTests = fixedDowntimeTestPermutations( $service); for( my $x = 0; $x < @$fixedDowntimeTests; $x++) { if( $testPaused) { print "Testing paused as requested.\n"; print "Press ENTER to continue..."; ; $testPaused = 0; } $comment = join( ", ", @{ $fixedDowntimeTests->[ $x]}); unless( isInArray( "Fixed downtime: $comment", \@skipTests)) { printf( "Fixed Test %d of %d\n", $x + 1, scalar( @$fixedDowntimeTests)); $schedule = scheduleDowntimePermutation( $service, $cfg, $fixedDowntimeTests->[ $x], $version->{ "major"}); $permutationTime = checkDowntime( "Fixed downtime: $comment", $service, $cfg, 1, $schedule, $version->{ "major"}); if( $permutationTime == -1) { if( $lastTriedPermutation != $x) { print "Downtime test failed: retrying\n"; $lastTriedPermutation = $x; $x--; } else { die "Downtime test failed after retry\n"; } } else { $lastTriedPermutation = $x; $elapsedTime += $permutationTime; printf( "Last test time: %s\n", humanDuration( $permutationTime)); printf( "Elapsed time thus far: %s\n", humanDuration( $elapsedTime)); } } else { $lastTriedPermutation = $x; printf( "Skipping fixed downtime: %s\n", $comment); } } } $lastTriedPermutation = -1; unless( $noFlexibleTests) { my $flexibleDowntimeTests = flexibleDowntimeTestPermutations( $service); for( my $y = 0; $y < @$flexibleDowntimeTests; $y++) { if( $testPaused) { print "Testing paused as requested.\n"; print "Press ENTER to continue..."; ; $testPaused = 0; } $comment = join( ", ", @{ $flexibleDowntimeTests->[ $y]}); unless( isInArray( "Flexible downtime: $comment", \@skipTests)) { printf( "Flexible Test %d of %d\n", $y + 1, scalar( @$flexibleDowntimeTests)); $schedule = scheduleDowntimePermutation( $service, $cfg, $flexibleDowntimeTests->[ $y], $version->{ "major"}); $permutationTime = checkDowntime( "Flexible downtime: $comment", $service, $cfg, 0, $schedule, $version->{ "major"}); if( $permutationTime == -1) { if( $lastTriedPermutation != $y) { print "Downtime test failed: retrying\n"; $lastTriedPermutation = $y; $y--; } else { die "Downtime test failed after retry\n"; } } else { $lastTriedPermutation = $y; $elapsedTime += $permutationTime; printf( "Last test time: %s\n", humanDuration( $permutationTime)); printf( "Elapsed time thus far: %s\n", humanDuration( $elapsedTime)); } } else { $lastTriedPermutation = $y; printf( "Skipping flexible downtime: %s\n", $comment); } } } } nagios-4.3.4/update-version000077500000000000000000000051001314764422400157000ustar00rootroot00000000000000#!/bin/sh # Get date (two formats) if [ -n "$2" ]; then LONGDATE=`date -d "$2" "+%B %d, %Y"` SHORTDATE=`date -d "$2" "+%Y-%m-%d"` YEAR=`date -d "$2" "+%Y"` else LONGDATE=`date "+%B %d, %Y"` SHORTDATE=`date "+%Y-%m-%d"` YEAR=`date "+%Y"` fi # Current version number CURRENTVERSION=4.3.4 # Last date LASTDATE=2017-08-24 if [ "x$1" = "x" ] then echo "Usage: $0 [revision date]" echo "" echo "Run this script with the name of the new version (i.e \"2.0b1\") to" echo "update version number and modification date in files." echo "Use the \"newdate\" argument if you want to keep the current version" echo "number and just update the modification date." echo "" echo "Current version=$CURRENTVERSION" echo "Current Modification date=$LASTDATE" echo "" exit 1 fi # Keep track of last version, as it is needed to update quickstart guide pages lastversion=$CURRENTVERSION # What's the new version number (if any)? newversion=$1 if [ "x$newversion" = "xnewdate" ] then # No new version number, just a new version date newversion=$CURRENTVERSION fi # Update version number and release date in main PHP page perl -i -p -e "s/this_year = '.*';/this_year = '$YEAR';/;" html/index.php.in perl -i -p -e "s/this_year = '.*';/this_year = '$YEAR';/;" html/main.php perl -i -p -e "s/releasedate\">.*<\//releasedate\">$LONGDATE<\//;" html/main.php perl -i -p -e "s/this_version = '.*';/this_version = '$newversion';/;" html/main.php perl -i -p -e "s/this_version = '.*';/this_version = '$newversion';/;" html/side.php # Update version number and release date in common code perl -i -p -e "s/PROGRAM_VERSION \".*\"/PROGRAM_VERSION \"$newversion\"/;" include/common.h perl -i -p -e "s/MODIFICATION_DATE \".*\"/MODIFICATION_DATE \"$SHORTDATE\"/;" include/common.h # Update version number and release date in configure script and configure.in perl -i -p -e "s/PKG_VERSION=.*/PKG_VERSION=\"$newversion\"/;" configure perl -i -p -e "s/PKG_REL_DATE=.*\"/PKG_REL_DATE=\"$SHORTDATE\"/;" configure perl -i -p -e "s/PKG_VERSION=.*/PKG_VERSION=\"$newversion\"/;" configure.ac perl -i -p -e "s/PKG_REL_DATE=.*\"/PKG_REL_DATE=\"$SHORTDATE\"/;" configure.ac # Update RPM spec file with version number perl -i -p -e "s/Version: .*/Version: $newversion/;" nagios.spec # Update the doxygen docs perl -i -p -e "s/^PROJECT_NUMBER = .*/PROJECT_NUMBER = $newversion/;" doxy.conf # Update this file with version number and last date perl -i -p -e "s/^CURRENTVERSION=.*/CURRENTVERSION=$newversion/;" update-version perl -i -p -e "s/^LASTDATE=.*/LASTDATE=$SHORTDATE/;" update-version nagios-4.3.4/worker/000077500000000000000000000000001314764422400143225ustar00rootroot00000000000000nagios-4.3.4/worker/Makefile.in000066400000000000000000000012451314764422400163710ustar00rootroot00000000000000################################### # Makefile for NEB examples # ################################### # Source code directories SRC_PING_WORKER=./ping default: @echo "Please supply a command line argument (i.e. 'make all'). Other targets are:" @echo " ping-worker" @echo " clean distclean" @echo " install-all install-ping" ping-worker: cd $(SRC_PING_WORKER) && $(MAKE) all all: cd $(SRC_PING_WORKER) && $(MAKE) all clean: cd $(SRC_PING_WORKER) && $(MAKE) $@ rm -f *~ *.*~ distclean: clean cd $(SRC_PING_WORKER) && $(MAKE) $@ rm -f Makefile devclean: distclean install-ping: cd $(SRC_PING_WORKER) && $(MAKE) install install-all: install-ping nagios-4.3.4/worker/ping/000077500000000000000000000000001314764422400152575ustar00rootroot00000000000000nagios-4.3.4/worker/ping/.gitignore000066400000000000000000000000141314764422400172420ustar00rootroot00000000000000worker-ping nagios-4.3.4/worker/ping/Makefile.in000066400000000000000000000020271314764422400173250ustar00rootroot00000000000000################################### # Makefile for NEB examples # ################################### # Source code directories SRC_LIB=@srcdir@/lib SRC_INCLUDE=@srcdir@/include CC=@CC@ WORKER_CFLAGS=@WORKER_CFLAGS@ CFLAGS=@CFLAGS@ @DEFS@ WORKER_LDFLAGS=@WORKER_LDFLAGS@ LDFLAGS=@LDFLAGS@ LIBS=@LIBS@ prefix=@prefix@ exec_prefix=@exec_prefix@ BINDIR=@bindir@ INSTALL=@INSTALL@ INSTALL_OPTS=@INSTALL_OPTS@ COMMAND_OPTS=@COMMAND_OPTS@ STRIP=@STRIP@ CP=@CP@ all: worker-ping worker-ping: worker-ping.c $(CC) -I.. $(WORKER_CFLAGS) $(CFLAGS) -o worker-ping worker-ping.c $(WORKER_LDFLAGS) $(LDFLAGS) $(LIBS) clean: rm -f worker-ping worker-ping.o rm -f core *.o rm -f *~ *.*~ distclean: clean rm -f Makefile devclean: distclean install: $(MAKE) install-basic $(MAKE) strip-post-install install-unstripped: $(MAKE) install-basic install-basic: $(INSTALL) -m 775 $(INSTALL_OPTS) -d $(DESTDIR)$(BINDIR) $(INSTALL) -m 774 $(INSTALL_OPTS) worker-ping $(DESTDIR)$(BINDIR) strip-post-install: $(STRIP) $(DESTDIR)$(BINDIR)/worker-ping nagios-4.3.4/worker/ping/worker-ping.c000066400000000000000000000277141314764422400177020ustar00rootroot00000000000000/****************************************************************************** * * worker-ping.c - Nagios Core 4 worker to handle ping checke * * Program: Nagios Core * License: GPL * * First Written: 01-03-2013 (start of development) * * Description: * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #include "config.h" #include "workers.h" /* Local macro definitions */ #define PING_WORKER_VERSION "0.2" #define PING_WORKER_MODIFICATION_DATE "02-Feb-13" #define PW_OK 0 #define PW_ERROR 1 /* Local function declarations */ int daemon_init( void); int drop_privileges( char *, char *); void print_license( void); void print_usage( char *); void print_version( void); void parse_worker_command_line( int, char **, char **, int *, char **, char **, char **); static int worker( const char *); /* Everything starts here */ main( int argc, char **argv, char **env) { int daemon_mode = FALSE; char *worker_socket; char *worker_user = ( char *)0; char *worker_group = ( char *)0; if( FALSE == daemon_mode) { printf( "Greetings from the ping worker.\n"); } parse_worker_command_line( argc, argv, env, &daemon_mode, &worker_socket, &worker_user, &worker_group); if( FALSE == daemon_mode) { print_version(); printf( "Worker socket is %s.\n", worker_socket); } /* drop privileges */ if( drop_privileges( worker_user, worker_group) == PW_ERROR) { fprintf( stderr, "Failed to drop privileges. Aborting.\n"); exit( 1); } if( TRUE == daemon_mode) { if( daemon_init() == ERROR) { fprintf( stderr, "Bailing out due to failure to daemonize. (PID=%d)\n", ( int)getpid()); exit( 1); } } /* Enter the worker code */ if( worker( worker_socket)) { exit( 1); } } void parse_worker_command_line( int argc, char **argv, char **env, int *daemon_mode, char **worker_socket, char **worker_user, char **worker_group) { int c = 0; int display_usage = FALSE; int display_license = FALSE; #ifdef HAVE_GETOPT_H int option_index = 0; static struct option long_options[] = { { "help", no_argument, 0, 'h'}, { "version", no_argument, 0, 'V'}, { "license", no_argument, 0, 'V'}, { "daemon", no_argument, 0, 'd'}, { "worker", required_argument, 0, 'W'}, { "user", required_argument, 0, 'u'}, { "group", required_argument, 0, 'g'}, { 0, 0, 0, 0} }; #define getopt( argc, argv, o) getopt_long( argc, argv, o, long_options, &option_index) #endif /* get all command line arguments */ while( 1) { c = getopt( argc, argv, "+:hVdW:u:g:"); if( -1 == c || EOF == c) break; switch( c) { case '?': /* usage */ case 'h': display_usage = TRUE; break; case 'V': /* version */ display_license = TRUE; break; case 'd': /* daemon mode */ *daemon_mode = TRUE; break; case 'W': *worker_socket = optarg; break; case 'u': *worker_user = optarg; break; case 'g': *worker_group = optarg; break; case ':': printf( "Missing argument for command line option '%c'.\n\n", optopt); print_usage( argv[ 0]); exit( 1); break; default: printf( "Unknown command line option '%c'.\n\n", c); print_usage( argv[ 0]); exit( 1); break; } } if( TRUE == display_license) { print_version(); print_license(); exit( 0); } if( TRUE == display_usage) { print_usage( argv[ 0]); exit( 0); } } void print_license( void) { printf( "\nThis program is free software; you can redistribute it and/or modify\n"); printf( "it under the terms of the GNU General Public License version 2 as\n"); printf( "published by the Free Software Foundation.\n\n"); printf( "This program is distributed in the hope that it will be useful,\n"); printf( "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"); printf( "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"); printf( "GNU General Public License for more details.\n\n"); printf( "You should have received a copy of the GNU General Public License\n"); printf( "along with this program; if not, write to the Free Software\n"); printf( "Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\n\n"); } void print_usage( char *program_name) { printf( "\nUsage: %s [-?|-h|--help] [-V|--version] [-d]\n", program_name); printf( " -W /path/to/socket -u user -g group\n"); printf( "\n"); printf( "Options:\n"); printf( "\n"); printf( " -d, --daemon Starts the ping worker in daemon mode,\n"); printf( " instead of as a foreground process\n"); printf( " -W, --worker /path/to/socket Act as a worker for an already running daemon\n"); printf( " -u, --user user Drop privileges to the specified user\n"); printf( " -g, --group group Drop privileges to the specified user\n"); printf( "\n"); printf( "Visit the Nagios website at https://www.nagios.org/ for bug fixes, new\n"); printf( "releases, online documentation, FAQs, information on subscribing to\n"); printf( "the mailing lists, and commercial support options for Nagios.\n"); printf( "\n"); } void print_version( void) { printf( "\nNagios Core 4 Ping Worker %s\n", PING_WORKER_VERSION); printf( "Copyright (c) 2013-present Nagios Core Development Team\n"); printf( " and Community Contributors\n"); printf( "Last Modified: %s\n", PING_WORKER_MODIFICATION_DATE); printf( "License: GPL\n"); printf( "Website: https://www.nagios.org\n"); } static int worker( const char *path) { int sd, ret; char response[128]; /*set_loadctl_defaults();*/ sd = nsock_unix( path, NSOCK_TCP | NSOCK_CONNECT); if( sd < 0) { printf( "Failed to connect to query socket '%s': %s: %s\n", path, nsock_strerror( sd), strerror( errno)); return 1; } ret = nsock_printf_nul( sd, "@wproc register name=Core Ping Worker %d;pid=%d;plugin=check_ping", getpid(), getpid()); if( ret < 0) { printf( "Failed to register as worker.\n"); return 1; } ret = read( sd, response, 3); if( ret != 3) { printf( "Failed to read response from wproc manager\n"); return 1; } if( memcmp( response, "OK", 3)) { read( sd, response + 3, sizeof(response) - 4); response[ sizeof( response) - 2] = 0; printf( "Failed to register with wproc manager: %s\n", response); return 1; } enter_worker( sd, start_cmd); return 0; } int drop_privileges( char *user, char *group) { uid_t uid = -1; gid_t gid = -1; struct group *grp = NULL; struct passwd *pw = NULL; int result = PW_OK; /* only drop privileges if we're running as root, so we don't interfere with being debugged while running as some random user */ if( getuid() != 0) { return PW_OK; } /* set effective group ID */ if( NULL != group) { /* see if this is a group name */ if( strspn( group, "0123456789") < strlen( group)) { grp = ( struct group *)getgrnam( group); if( NULL != grp) { gid = ( gid_t)(grp->gr_gid); } else { fprintf( stderr, "Warning: Could not get group entry for '%s'\n", group); } } /* else we were passed the GID */ else { gid = ( gid_t)atoi( group); } /* set effective group ID if other than current EGID */ if( gid != getegid()) { if( setgid( gid) == -1) { fprintf( stderr, "Warning: Could not set effective GID=%d\n", ( int)gid); result = PW_ERROR; } } } /* set effective user ID */ if( NULL != user) { /* see if this is a user name */ if( strspn( user, "0123456789") < strlen( user)) { pw = ( struct passwd *)getpwnam( user); if( NULL != pw) { uid = ( uid_t)(pw->pw_uid); } else { fprintf( stderr, "Warning: Could not get passwd entry for '%s'\n", user); } } /* else we were passed the UID */ else { uid = ( uid_t)atoi( user); } #ifdef HAVE_INITGROUPS if( uid != geteuid()) { /* initialize supplementary groups */ if( initgroups( user, gid) == -1) { if( EPERM == errno) { fprintf( stderr, "Warning: Unable to change supplementary " "groups using initgroups() -- I hope you know what " "you're doing\n"); } else { fprintf( stderr, "Warning: Possibly root user failed " "dropping privileges with initgroups()\n"); return PW_ERROR; } } } #endif if( setuid( uid) == -1) { fprintf( stderr, "Warning: Could not set effective UID=%d\n", ( int)uid); result = PW_ERROR; } } return result; } int daemon_init( void) { pid_t pid = -1; int pidno = 0; int lockfile = 0; int val = 0; char buf[256]; struct flock lock; char *homedir = NULL; #ifdef RLIMIT_CORE struct rlimit limit; #endif /* change working directory. scuttle home if we're dumping core */ homedir = getenv( "HOME"); #ifdef DAEMON_DUMPS_CORE if( NULL != homedir) { chdir( homedir); } else { #endif chdir( "/"); #ifdef DAEMON_DUMPS_CORE } #endif umask( S_IWGRP | S_IWOTH); /* close existing stdin, stdout, stderr */ close( 0); close( 1); close( 2); /* THIS HAS TO BE DONE TO AVOID PROBLEMS WITH STDERR BEING REDIRECTED TO SERVICE MESSAGE PIPE! */ /* re-open stdin, stdout, stderr with known values */ open( "/dev/null", O_RDONLY); open( "/dev/null", O_WRONLY); open( "/dev/null", O_WRONLY); #ifdef USE_LOCKFILE lockfile = open( lock_file, O_RDWR | O_CREAT, S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH); if( lockfile < 0) { logit( NSLOG_RUNTIME_ERROR, TRUE, "Failed to obtain lock on file %s: %s\n", lock_file, strerror(errno)); logit( NSLOG_PROCESS_INFO | NSLOG_RUNTIME_ERROR, TRUE, "Bailing out due to errors encountered while attempting to daemonize... (PID=%d)", (int)getpid()); exit( 1); } /* see if we can read the contents of the lockfile */ if(( val = read( lockfile, buf, ( size_t)10)) < 0) { logit(NSLOG_RUNTIME_ERROR, TRUE, "Lockfile exists but cannot be read"); exit( 1); } /* we read something - check the PID */ if( val > 0) { if(( val = sscanf( buf, "%d", &pidno)) < 1) { logit( NSLOG_RUNTIME_ERROR, TRUE, "Lockfile '%s' does not contain a valid PID (%s)", lock_file, buf); exit( 1); } } /* check for SIGHUP */ if( val == 1 && ( pid = ( pid_t)pidno) == getpid()) { close( lockfile); return OK; } #endif /* exit on errors... */ if(( pid = fork()) < 0) { return( PW_ERROR); } /* parent process goes away.. */ else if((int)pid != 0) { exit( 0); } /* child continues... */ /* child becomes session leader... */ setsid(); #ifdef USE_LOCKFILE /* place a file lock on the lock file */ lock.l_type = F_WRLCK; lock.l_start = 0; lock.l_whence = SEEK_SET; lock.l_len = 0; if( fcntl( lockfile, F_SETLK, &lock) < 0) { if( EACCES == errno || EAGAIN == errno) { fcntl( lockfile, F_GETLK, &lock); logit( NSLOG_RUNTIME_ERROR, TRUE, "Lockfile '%s' looks like its already held by another instance of Nagios (PID %d). Bailing out...", lock_file, (int)lock.l_pid); } else { logit(NSLOG_RUNTIME_ERROR, TRUE, "Cannot lock lockfile '%s': %s. Bailing out...", lock_file, strerror(errno)); } exit( 1); } #endif /* prevent daemon from dumping a core file... */ #if defined( RLIMIT_CORE) && defined( DAEMON_DUMPS_CORE) getrlimit( RLIMIT_CORE, &limit); limit.rlim_cur = 0; setrlimit( RLIMIT_CORE, &limit); #endif #ifdef USE_LOCKFILE /* write PID to lockfile... */ lseek( lockfile, 0, SEEK_SET); ftruncate( lockfile, 0); sprintf( buf, "%d\n", ( int)getpid()); write( lockfile, buf, strlen( buf)); /* make sure lock file stays open while program is executing... */ val = fcntl( lockfile, F_GETFD, 0); val |= FD_CLOEXEC; fcntl( lockfile, F_SETFD, val); #endif return PW_OK; } nagios-4.3.4/xdata/000077500000000000000000000000001314764422400141125ustar00rootroot00000000000000nagios-4.3.4/xdata/.gitignore000066400000000000000000000000151314764422400160760ustar00rootroot00000000000000Makefile *.o nagios-4.3.4/xdata/Makefile.in000066400000000000000000000002471314764422400161620ustar00rootroot00000000000000############################ # Makefile for Nagios # ############################ clean: rm -f *.o rm -f *~ distclean: clean rm -f Makefile devclean: distclean nagios-4.3.4/xdata/xcddefault.c000066400000000000000000000071531314764422400164070ustar00rootroot00000000000000/***************************************************************************** * * XCDDEFAULT.C - Default external comment data routines for Nagios * * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ /*********** COMMON HEADER FILES ***********/ #include "../include/config.h" #include "../include/common.h" #include "../include/locations.h" #include "../include/comments.h" #include "../include/macros.h" #include "../include/objects.h" #include "../include/nagios.h" #include "xcddefault.h" /******************************************************************/ /************ COMMENT INITIALIZATION/CLEANUP FUNCTIONS ************/ /******************************************************************/ /* initialize comment data */ int xcddefault_initialize_comment_data(void) { nagios_comment *temp_comment = NULL; /* find the new starting index for comment id if its missing*/ if(next_comment_id == 0L) { for(temp_comment = comment_list; temp_comment != NULL; temp_comment = temp_comment->next) { if(temp_comment->comment_id >= next_comment_id) next_comment_id = temp_comment->comment_id + 1; } } /* initialize next comment id if necessary */ if(next_comment_id == 0L) next_comment_id = 1; return OK; } /******************************************************************/ /***************** DEFAULT DATA OUTPUT FUNCTIONS ******************/ /******************************************************************/ /* adds a new host comment */ int xcddefault_add_new_host_comment(int entry_type, char *host_name, time_t entry_time, char *author_name, char *comment_data, int persistent, int source, int expires, time_t expire_time, unsigned long *comment_id) { /* find the next valid comment id */ while(find_host_comment(next_comment_id) != NULL) next_comment_id++; /* add comment to list in memory */ add_host_comment(entry_type, host_name, entry_time, author_name, comment_data, next_comment_id, persistent, expires, expire_time, source); /* return the id for the comment we are about to add (this happens in the main code) */ if(comment_id != NULL) *comment_id = next_comment_id; /* increment the comment id */ next_comment_id++; return OK; } /* adds a new service comment */ int xcddefault_add_new_service_comment(int entry_type, char *host_name, char *svc_description, time_t entry_time, char *author_name, char *comment_data, int persistent, int source, int expires, time_t expire_time, unsigned long *comment_id) { /* find the next valid comment id */ while(find_service_comment(next_comment_id) != NULL) next_comment_id++; /* add comment to list in memory */ add_service_comment(entry_type, host_name, svc_description, entry_time, author_name, comment_data, next_comment_id, persistent, expires, expire_time, source); /* return the id for the comment we are about to add (this happens in the main code) */ if(comment_id != NULL) *comment_id = next_comment_id; /* increment the comment id */ next_comment_id++; return OK; } nagios-4.3.4/xdata/xcddefault.h000066400000000000000000000023411314764422400164060ustar00rootroot00000000000000/***************************************************************************** * * XCDDEFAULT.H - Header file for default comment data routines * * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #ifndef NAGIOS_XCDDEFAULT_H_INCLUDED #define NAGIOS_XCDDEFAULT_H_INCLUDED int xcddefault_initialize_comment_data(void); int xcddefault_add_new_host_comment(int, char *, time_t, char *, char *, int, int, int, time_t, unsigned long *); int xcddefault_add_new_service_comment(int, char *, char *, time_t, char *, char *, int, int, int, time_t, unsigned long *); #endif nagios-4.3.4/xdata/xodtemplate.c000066400000000000000000013720071314764422400166160ustar00rootroot00000000000000/***************************************************************************** * * XODTEMPLATE.C - Template-based object configuration data input routines * * * Description: * * Routines for parsing and resolving template-based object definitions. * Basic steps involved in this in the daemon are as follows: * * 1) Read * 2) Resolve * 3) Duplicate * 4) Recombobulate * 5) Cache * 7) Register * 8) Cleanup * * The steps involved for the CGIs differ a bit, since they read the cached * definitions which are already resolved, recombobulated and duplicated. In * otherwords, they've already been "flattened"... * * 1) Read * 2) Register * 3) Cleanup * * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ /*********** COMMON HEADER FILES ***********/ #include "../include/config.h" #include "../include/common.h" #include "../include/objects.h" #include "../include/locations.h" #include "../include/macros.h" /**** CORE OR CGI SPECIFIC HEADER FILES ****/ #ifdef NSCORE #include "../include/nagios.h" #endif #ifdef NSCGI #include "../include/cgiutils.h" #endif /**** DATA INPUT-SPECIFIC HEADER FILES ****/ #include "xodtemplate.h" #define XOD_NEW 0 /* not seen */ #define XOD_SEEN 1 /* seen, but not yet loopy */ #define XOD_LOOPY 2 /* loopy */ #define XOD_OK 3 /* not loopy */ xodtemplate_timeperiod *xodtemplate_timeperiod_list = NULL; xodtemplate_command *xodtemplate_command_list = NULL; xodtemplate_contactgroup *xodtemplate_contactgroup_list = NULL; xodtemplate_hostgroup *xodtemplate_hostgroup_list = NULL; xodtemplate_servicegroup *xodtemplate_servicegroup_list = NULL; xodtemplate_servicedependency *xodtemplate_servicedependency_list = NULL; xodtemplate_serviceescalation *xodtemplate_serviceescalation_list = NULL; xodtemplate_contact *xodtemplate_contact_list = NULL; xodtemplate_host *xodtemplate_host_list = NULL; xodtemplate_service *xodtemplate_service_list = NULL; xodtemplate_hostdependency *xodtemplate_hostdependency_list = NULL; xodtemplate_hostescalation *xodtemplate_hostescalation_list = NULL; xodtemplate_hostextinfo *xodtemplate_hostextinfo_list = NULL; xodtemplate_serviceextinfo *xodtemplate_serviceextinfo_list = NULL; xodtemplate_timeperiod *xodtemplate_timeperiod_list_tail = NULL; xodtemplate_command *xodtemplate_command_list_tail = NULL; xodtemplate_contactgroup *xodtemplate_contactgroup_list_tail = NULL; xodtemplate_hostgroup *xodtemplate_hostgroup_list_tail = NULL; xodtemplate_servicegroup *xodtemplate_servicegroup_list_tail = NULL; xodtemplate_servicedependency *xodtemplate_servicedependency_list_tail = NULL; xodtemplate_serviceescalation *xodtemplate_serviceescalation_list_tail = NULL; xodtemplate_contact *xodtemplate_contact_list_tail = NULL; xodtemplate_host *xodtemplate_host_list_tail = NULL; xodtemplate_service *xodtemplate_service_list_tail = NULL; xodtemplate_hostdependency *xodtemplate_hostdependency_list_tail = NULL; xodtemplate_hostescalation *xodtemplate_hostescalation_list_tail = NULL; xodtemplate_hostextinfo *xodtemplate_hostextinfo_list_tail = NULL; xodtemplate_serviceextinfo *xodtemplate_serviceextinfo_list_tail = NULL; skiplist *xobject_template_skiplists[NUM_XOBJECT_SKIPLISTS]; skiplist *xobject_skiplists[NUM_XOBJECT_SKIPLISTS]; void *xodtemplate_current_object = NULL; int xodtemplate_current_object_type = XODTEMPLATE_NONE; int xodtemplate_current_config_file = 0; char **xodtemplate_config_files = NULL; int presorted_objects = FALSE; /* xodtemplate id / object counter */ static struct object_count xodcount; /* reusable bitmaps for expanding objects */ static bitmap *host_map = NULL, *contact_map = NULL; static bitmap *service_map = NULL, *parent_map = NULL; /* These variables are defined in base/utils.c, but as CGIs do not need these we just fake the values for this file */ #ifdef NSCGI #define use_precached_objects TRUE #define use_regexp_matches FALSE #define use_true_regexp_matching FALSE #define test_scheduling FALSE #endif /* * simple inheritance macros. o = object, t = template, v = variable * Note that these can be used for inter-object inheritance as well, * so long as the variable names are identical. */ #define xod_inherit(o, t, v) \ do { \ if(o->have_##v == FALSE && t->have_##v == TRUE) { \ o->v = t->v; \ o->have_##v = TRUE; \ } \ } while(0) #define xod_inherit_str_nohave(o, t, v) \ do { \ if(o->v == NULL && t->v != NULL) { \ o->v = (char *)strdup(t->v); \ } \ } while(0) #define xod_inherit_str(o, t, v) \ do { \ if(o->have_##v == FALSE && t->have_##v == TRUE) { \ xod_inherit_str_nohave(o, t, v); \ o->have_##v = TRUE; \ } \ } while(0) /* returns the name of a numbered config file */ static const char *xodtemplate_config_file_name(int cfgfile) { if(cfgfile <= xodtemplate_current_config_file) return xodtemplate_config_files[cfgfile - 1]; return "?"; } /******************************************************************/ /************* TOP-LEVEL CONFIG DATA INPUT FUNCTION ***************/ /******************************************************************/ #ifndef NSCGI static void xodtemplate_free_template_skiplists(void) { int x = 0; for(x = 0; x < NUM_XOBJECT_SKIPLISTS; x++) { skiplist_free(&xobject_template_skiplists[x]); } } #endif /* process all config files - both core and CGIs pass in name of main config file */ int xodtemplate_read_config_data(const char *main_config_file, int options) { #ifdef NSCORE char *cfgfile = NULL; char *config_base_dir = NULL; char *input = NULL; char *var = NULL; char *val = NULL; double runtime[11]; mmapfile *thefile = NULL; #endif struct timeval tv[12]; int result = OK; if(main_config_file == NULL) { #ifdef NSCORE printf("Error: No main config file passed to object routines!\n"); #endif return ERROR; } timing_point("Reading config data from '%s'\n", main_config_file); /* initialize variables */ xodtemplate_timeperiod_list = NULL; xodtemplate_command_list = NULL; xodtemplate_contactgroup_list = NULL; xodtemplate_hostgroup_list = NULL; xodtemplate_servicegroup_list = NULL; xodtemplate_servicedependency_list = NULL; xodtemplate_serviceescalation_list = NULL; xodtemplate_contact_list = NULL; xodtemplate_host_list = NULL; xodtemplate_service_list = NULL; xodtemplate_hostdependency_list = NULL; xodtemplate_hostescalation_list = NULL; xodtemplate_hostextinfo_list = NULL; xodtemplate_serviceextinfo_list = NULL; /* initialize skiplists */ xodtemplate_init_xobject_skiplists(); xodtemplate_current_object = NULL; xodtemplate_current_object_type = XODTEMPLATE_NONE; /* allocate memory for 256 config files (increased dynamically) */ xodtemplate_current_config_file = 0; xodtemplate_config_files = (char **)malloc(256 * sizeof(char *)); if(xodtemplate_config_files == NULL) { #ifdef NSCORE printf("Unable to allocate memory!\n"); #endif return ERROR; } /* are the objects we're reading already pre-sorted? */ presorted_objects = FALSE; #ifdef NSCORE presorted_objects = (use_precached_objects == TRUE) ? TRUE : FALSE; #endif #ifdef NSCORE if(test_scheduling == TRUE) gettimeofday(&tv[0], NULL); /* only process the precached object file as long as we're not regenerating it and we're not verifying the config */ if(use_precached_objects == TRUE) result = xodtemplate_process_config_file(object_precache_file, options); /* process object config files normally... */ else { /* determine the directory of the main config file */ if((cfgfile = (char *)strdup(main_config_file)) == NULL) { my_free(xodtemplate_config_files); printf("Unable to allocate memory!\n"); return ERROR; } config_base_dir = (char *)strdup(dirname(cfgfile)); my_free(cfgfile); /* open the main config file for reading (we need to find all the config files to read) */ if((thefile = mmap_fopen(main_config_file)) == NULL) { my_free(config_base_dir); my_free(xodtemplate_config_files); printf("Unable to open main config file '%s'\n", main_config_file); return ERROR; } /* daemon reads all config files/dirs specified in the main config file */ /* read in all lines from the main config file */ while(1) { /* free memory */ my_free(input); /* get the next line */ if((input = mmap_fgets_multiline(thefile)) == NULL) break; /* strip input */ strip(input); /* skip blank lines and comments */ if(input[0] == '#' || input[0] == ';' || input[0] == '\x0') continue; if((var = strtok(input, "=")) == NULL) continue; if((val = strtok(NULL, "\n")) == NULL) continue; /* process a single config file */ if(!strcmp(var, "xodtemplate_config_file") || !strcmp(var, "cfg_file")) { if(config_base_dir != NULL && val[0] != '/') { asprintf(&cfgfile, "%s/%s", config_base_dir, val); } else cfgfile = strdup(val); /* process the config file... */ result = xodtemplate_process_config_file(cfgfile, options); my_free(cfgfile); /* if there was an error processing the config file, break out of loop */ if(result == ERROR) break; } /* process all files in a config directory */ else if(!strcmp(var, "xodtemplate_config_dir") || !strcmp(var, "cfg_dir")) { if(config_base_dir != NULL && val[0] != '/') { asprintf(&cfgfile, "%s/%s", config_base_dir, val); } else cfgfile = strdup(val); /* strip trailing / if necessary */ if(cfgfile != NULL && cfgfile[strlen(cfgfile) - 1] == '/') cfgfile[strlen(cfgfile) - 1] = '\x0'; /* process the config directory... */ result = xodtemplate_process_config_dir(cfgfile, options); my_free(cfgfile); /* if there was an error processing the config file, break out of loop */ if(result == ERROR) break; } } /* free memory and close the file */ my_free(config_base_dir); my_free(input); mmap_fclose(thefile); } if(test_scheduling == TRUE) gettimeofday(&tv[1], NULL); #endif #ifdef NSCGI /* CGIs process only one file - the cached objects file */ result = xodtemplate_process_config_file(object_cache_file, options); #endif timing_point("Done parsing config files\n"); #ifdef NSCORE /* only perform intensive operations if we're not using the precached object file */ if(use_precached_objects == FALSE) { /* resolve objects definitions */ if(result == OK) result = xodtemplate_resolve_objects(); timing_point("Done resolving objects\n"); /* these are no longer needed */ xodtemplate_free_template_skiplists(); if(test_scheduling == TRUE) gettimeofday(&tv[2], NULL); /* cleanup some additive inheritance stuff... */ xodtemplate_clean_additive_strings(); } #endif /* do the meat and potatoes stuff... */ host_map = bitmap_create(xodcount.hosts); contact_map = bitmap_create(xodcount.contacts); if(!host_map || !contact_map) { logit(NSLOG_RUNTIME_ERROR, TRUE, "Error: Failed to create bitmaps for resolving objects\n"); return ERROR; } if(result == OK) result = xodtemplate_recombobulate_contactgroups(); if(test_scheduling == TRUE) gettimeofday(&tv[3], NULL); timing_point("Done recombobulating contactgroups\n"); if(result == OK) result = xodtemplate_recombobulate_hostgroups(); if(test_scheduling == TRUE) gettimeofday(&tv[4], NULL); timing_point("Done recombobulating hostgroups\n"); #ifndef NSCGI if(use_precached_objects == FALSE) { if(result == OK) result = xodtemplate_duplicate_services(); if(test_scheduling == TRUE) gettimeofday(&tv[5], NULL); timing_point("Created %u services (dupes possible)\n", xodcount.services); } #endif /* now we have an accurate service count */ service_map = bitmap_create(xodcount.services); if(!service_map) { logit(NSLOG_CONFIG_ERROR, TRUE, "Failed to create service map\n"); return ERROR; } if(result == OK) result = xodtemplate_recombobulate_servicegroups(); if(test_scheduling == TRUE) gettimeofday(&tv[6], NULL); timing_point("Done recombobulating servicegroups\n"); #ifndef NSCGI if(use_precached_objects == FALSE) { if(result == OK) result = xodtemplate_duplicate_objects(); if(test_scheduling == TRUE) gettimeofday(&tv[7], NULL); /* NOTE: some missing defaults (notification options, etc.) are also applied here */ if(result == OK) result = xodtemplate_inherit_object_properties(); timing_point("Done propagating inherited object properties\n"); if(test_scheduling == TRUE) gettimeofday(&tv[8], NULL); } #endif if(test_scheduling == TRUE) gettimeofday(&tv[9], NULL); /* register objects */ /* Commented out because functions above (xodtemplate_duplicate_objects in this particular case) return an error without printing any error messages, so nothing will say what was wrong. */ /* if(result == OK) */ result |= xodtemplate_register_objects(); if(test_scheduling == TRUE) gettimeofday(&tv[10], NULL); /* cleanup */ xodtemplate_free_memory(); #ifdef NSCORE if(test_scheduling == TRUE) { gettimeofday(&tv[11], NULL); runtime[0] = (double)((double)(tv[1].tv_sec - tv[0].tv_sec) + (double)((tv[1].tv_usec - tv[0].tv_usec) / 1000.0) / 1000.0); if(use_precached_objects == FALSE) { runtime[1] = (double)((double)(tv[2].tv_sec - tv[1].tv_sec) + (double)((tv[2].tv_usec - tv[1].tv_usec) / 1000.0) / 1000.0); runtime[2] = (double)((double)(tv[3].tv_sec - tv[2].tv_sec) + (double)((tv[3].tv_usec - tv[2].tv_usec) / 1000.0) / 1000.0); runtime[3] = (double)((double)(tv[4].tv_sec - tv[3].tv_sec) + (double)((tv[4].tv_usec - tv[3].tv_usec) / 1000.0) / 1000.0); runtime[4] = (double)((double)(tv[5].tv_sec - tv[4].tv_sec) + (double)((tv[5].tv_usec - tv[4].tv_usec) / 1000.0) / 1000.0); runtime[5] = (double)((double)(tv[6].tv_sec - tv[5].tv_sec) + (double)((tv[6].tv_usec - tv[5].tv_usec) / 1000.0) / 1000.0); runtime[6] = (double)((double)(tv[7].tv_sec - tv[6].tv_sec) + (double)((tv[7].tv_usec - tv[6].tv_usec) / 1000.0) / 1000.0); runtime[7] = (double)((double)(tv[8].tv_sec - tv[7].tv_sec) + (double)((tv[8].tv_usec - tv[7].tv_usec) / 1000.0) / 1000.0); runtime[8] = (double)((double)(tv[10].tv_sec - tv[9].tv_sec) + (double)((tv[10].tv_usec - tv[9].tv_usec) / 1000.0) / 1000.0); } else { runtime[1] = 0.0; runtime[2] = 0.0; runtime[3] = 0.0; runtime[4] = 0.0; runtime[5] = 0.0; runtime[6] = 0.0; runtime[7] = 0.0; runtime[8] = (double)((double)(tv[10].tv_sec - tv[1].tv_sec) + (double)((tv[10].tv_usec - tv[1].tv_usec) / 1000.0) / 1000.0); } runtime[9] = (double)((double)(tv[11].tv_sec - tv[10].tv_sec) + (double)((tv[11].tv_usec - tv[10].tv_usec) / 1000.0) / 1000.0); runtime[10] = (double)((double)(tv[11].tv_sec - tv[0].tv_sec) + (double)((tv[11].tv_usec - tv[0].tv_usec) / 1000.0) / 1000.0); printf("Timing information on object configuration processing is listed\n"); printf("below. You can use this information to see if precaching your\n"); printf("object configuration would be useful.\n\n"); printf("Object Config Source: %s\n\n", (use_precached_objects == TRUE) ? "Pre-cached config file" : "Config files (uncached)"); printf("OBJECT CONFIG PROCESSING TIMES (* = Potential for precache savings with -u option)\n"); printf("----------------------------------\n"); printf("Read: %.6lf sec\n", runtime[0]); printf("Resolve: %.6lf sec *\n", runtime[1]); printf("Recomb Contactgroups: %.6lf sec *\n", runtime[2]); printf("Recomb Hostgroups: %.6lf sec *\n", runtime[3]); printf("Dup Services: %.6lf sec *\n", runtime[4]); printf("Recomb Servicegroups: %.6lf sec *\n", runtime[5]); printf("Duplicate: %.6lf sec *\n", runtime[6]); printf("Inherit: %.6lf sec *\n", runtime[7]); printf("Register: %.6lf sec\n", runtime[8]); printf("Free: %.6lf sec\n", runtime[9]); printf(" ============\n"); printf("TOTAL: %.6lf sec ", runtime[10]); if(use_precached_objects == FALSE) printf("* = %.6lf sec (%.2f%%) estimated savings", (runtime[10] - runtime[9] - runtime[8] - runtime[0]) / 4, ((runtime[10] - runtime[9] - runtime[8] - runtime[0]) / runtime[10]) * 25.0); printf("\n"); printf("\n\n"); } #endif bitmap_destroy(contact_map); bitmap_destroy(host_map); bitmap_destroy(service_map); return result; } /* process all files in a specific config directory */ int xodtemplate_process_config_dir(char *dirname, int options) { char file[MAX_FILENAME_LENGTH]; DIR *dirp = NULL; struct dirent *dirfile = NULL; int result = OK; register int x = 0; struct stat stat_buf; #ifdef NSCORE if(verify_config >= 2) printf("Processing object config directory '%s'...\n", dirname); #endif /* open the directory for reading */ dirp = opendir(dirname); if(dirp == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not open config directory '%s' for reading.\n", dirname); return ERROR; } /* process all files in the directory... */ while((dirfile = readdir(dirp)) != NULL) { /* skip hidden files and directories, and current and parent dir */ if(dirfile->d_name[0] == '.') continue; /* create /path/to/file */ snprintf(file, sizeof(file), "%s/%s", dirname, dirfile->d_name); file[sizeof(file) - 1] = '\x0'; /* process this if it's a non-hidden config file... */ if(stat(file, &stat_buf) == -1) { logit(NSLOG_RUNTIME_ERROR, TRUE, "Error: Could not open config directory member '%s' for reading.\n", file); closedir(dirp); return ERROR; } switch(stat_buf.st_mode & S_IFMT) { case S_IFREG: x = strlen(dirfile->d_name); if(x <= 4 || strcmp(dirfile->d_name + (x - 4), ".cfg")) break; /* process the config file */ result = xodtemplate_process_config_file(file, options); if(result == ERROR) { closedir(dirp); return ERROR; } break; case S_IFDIR: /* recurse into subdirectories... */ result = xodtemplate_process_config_dir(file, options); if(result == ERROR) { closedir(dirp); return ERROR; } break; default: /* everything else we ignore */ break; } } closedir(dirp); return result; } /* process data in a specific config file */ int xodtemplate_process_config_file(char *filename, int options) { mmapfile *thefile = NULL; char *input = NULL; register int in_definition = FALSE; register int current_line = 0; int result = OK; register int x = 0; register int y = 0; char *ptr = NULL; #ifdef NSCORE if(verify_config >= 2) printf("Processing object config file '%s'...\n", filename); #endif /* save config file name */ xodtemplate_config_files[xodtemplate_current_config_file++] = (char *)strdup(filename); /* reallocate memory for config files */ if(!(xodtemplate_current_config_file % 256)) { xodtemplate_config_files = (char **)realloc(xodtemplate_config_files, (xodtemplate_current_config_file + 256) * sizeof(char *)); if(xodtemplate_config_files == NULL) return ERROR; } /* open the config file for reading */ if((thefile = mmap_fopen(filename)) == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Cannot open config file '%s' for reading: %s\n", filename, strerror(errno)); return ERROR; } /* read in all lines from the config file */ while(1) { /* free memory */ my_free(input); /* read the next line */ if((input = mmap_fgets_multiline(thefile)) == NULL) break; current_line = thefile->current_line; /* grab data before comment delimiter - faster than a strtok() and strncpy()... */ for(x = 0; input[x] != '\x0'; x++) { if(input[x] == ';') { if(x == 0) break; else if(input[x - 1] != '\\') break; } } input[x] = '\x0'; /* strip input */ strip(input); /* skip empty lines */ if(input[0] == '\x0' || input[0] == '#') continue; /* this is the start of an object definition */ if(strstr(input, "define") == input) { /* get the type of object we're defining... */ for(x = 6; input[x] != '\x0'; x++) if(input[x] != ' ' && input[x] != '\t') break; for(y = 0; input[x] != '\x0'; x++) { if(input[x] == ' ' || input[x] == '\t' || input[x] == '{') break; else input[y++] = input[x]; } input[y] = '\x0'; /* make sure an object type is specified... */ if(input[0] == '\x0') { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: No object type specified in file '%s' on line %d.\n", filename, current_line); result = ERROR; break; } /* check validity of object type */ if( strcmp(input, "timeperiod") && strcmp(input, "command") && strcmp(input, "contact") && strcmp(input, "contactgroup") && strcmp(input, "host") && strcmp(input, "hostgroup") && strcmp(input, "servicegroup") && strcmp(input, "service") && strcmp(input, "servicedependency") && strcmp(input, "serviceescalation") && strcmp(input, "hostgroupescalation") && strcmp(input, "hostdependency") && strcmp(input, "hostescalation")) { if ( strcmp(input, "hostextinfo") && strcmp(input, "serviceextinfo")) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Invalid object definition type '%s' in file '%s' on line %d.\n", input, filename, current_line); result = ERROR; break; } logit(NSLOG_CONFIG_WARNING, TRUE, "WARNING: Extinfo objects are deprecated and will be removed in future versions\n"); } /* we're already in an object definition... */ if(in_definition == TRUE) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Unexpected start of object definition in file '%s' on line %d. Make sure you close preceding objects before starting a new one.\n", filename, current_line); result = ERROR; break; } /* start a new definition */ if(xodtemplate_begin_object_definition(input, options, xodtemplate_current_config_file, current_line) == ERROR) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not add object definition in file '%s' on line %d.\n", filename, current_line); result = ERROR; break; } in_definition = TRUE; } /* we're currently inside an object definition */ else if(in_definition == TRUE) { /* this is the close of an object definition */ if(!strcmp(input, "}")) { in_definition = FALSE; /* close out current definition */ if(xodtemplate_end_object_definition(options) == ERROR) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not complete object definition in file '%s' on line %d. Have you named all your objects?\n", filename, current_line); result = ERROR; break; } } /* this is a directive inside an object definition */ else { /* add directive to object definition */ if(xodtemplate_add_object_property(input, options) == ERROR) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not add object property in file '%s' on line %d.\n", filename, current_line); result = ERROR; break; } } } /* include another file */ else if(strstr(input, "include_file=") == input) { ptr = strtok(input, "="); ptr = strtok(NULL, "\n"); if(ptr != NULL) { result = xodtemplate_process_config_file(ptr, options); if(result == ERROR) break; } } /* include a directory */ else if(strstr(input, "include_dir") == input) { ptr = strtok(input, "="); ptr = strtok(NULL, "\n"); if(ptr != NULL) { result = xodtemplate_process_config_dir(ptr, options); if(result == ERROR) break; } } /* unexpected token or statement */ else { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Unexpected token or statement in file '%s' on line %d.\n", filename, current_line); result = ERROR; break; } } /* free memory and close file */ my_free(input); mmap_fclose(thefile); /* whoops - EOF while we were in the middle of an object definition... */ if(in_definition == TRUE && result == OK) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Unexpected EOF in file '%s' on line %d - check for a missing closing bracket.\n", filename, current_line); result = ERROR; } return result; } /******************************************************************/ /***************** OBJECT DEFINITION FUNCTIONS ********************/ /******************************************************************/ /* * all objects start the same way, so we can get rid of quite * a lot of code with this struct-offset-insensitive macro */ #define xod_begin_def(type) \ do { \ new_##type = (xodtemplate_##type *)calloc(1, sizeof(*new_##type)); \ if (new_##type == NULL) \ return ERROR; \ new_##type->register_object=TRUE; \ new_##type->_config_file=cfgfile; \ new_##type->_start_line=start_line; \ \ /* precached object files are already sorted, so add to tail */ \ if(presorted_objects==TRUE){ \ \ if(xodtemplate_##type##_list==NULL){ \ xodtemplate_##type##_list=new_##type; \ xodtemplate_##type##_list_tail=xodtemplate_##type##_list; \ } else { \ xodtemplate_##type##_list_tail->next=new_##type; \ xodtemplate_##type##_list_tail=new_##type; \ } \ \ /* update current object pointer */ \ xodtemplate_current_object=xodtemplate_##type##_list_tail; \ } else { \ /* add new object to head of list in memory */ \ new_##type->next=xodtemplate_##type##_list; \ xodtemplate_##type##_list=new_##type; \ \ /* update current object pointer */ \ xodtemplate_current_object=xodtemplate_##type##_list; \ } \ } while (0) /* starts a new object definition */ int xodtemplate_begin_object_definition(char *input, int options, int cfgfile, int start_line) { int result = OK; xodtemplate_timeperiod *new_timeperiod = NULL; xodtemplate_command *new_command = NULL; xodtemplate_contactgroup *new_contactgroup = NULL; xodtemplate_hostgroup *new_hostgroup = NULL; xodtemplate_servicegroup *new_servicegroup = NULL; xodtemplate_servicedependency *new_servicedependency = NULL; xodtemplate_serviceescalation *new_serviceescalation = NULL; xodtemplate_contact *new_contact = NULL; xodtemplate_host *new_host = NULL; xodtemplate_service *new_service = NULL; xodtemplate_hostdependency *new_hostdependency = NULL; xodtemplate_hostescalation *new_hostescalation = NULL; xodtemplate_hostextinfo *new_hostextinfo = NULL; xodtemplate_serviceextinfo *new_serviceextinfo = NULL; if(!strcmp(input, "service")) xodtemplate_current_object_type = XODTEMPLATE_SERVICE; else if(!strcmp(input, "host")) xodtemplate_current_object_type = XODTEMPLATE_HOST; else if(!strcmp(input, "command")) xodtemplate_current_object_type = XODTEMPLATE_COMMAND; else if(!strcmp(input, "contact")) xodtemplate_current_object_type = XODTEMPLATE_CONTACT; else if(!strcmp(input, "contactgroup")) xodtemplate_current_object_type = XODTEMPLATE_CONTACTGROUP; else if(!strcmp(input, "hostgroup")) xodtemplate_current_object_type = XODTEMPLATE_HOSTGROUP; else if(!strcmp(input, "servicegroup")) xodtemplate_current_object_type = XODTEMPLATE_SERVICEGROUP; else if(!strcmp(input, "timeperiod")) xodtemplate_current_object_type = XODTEMPLATE_TIMEPERIOD; else if(!strcmp(input, "servicedependency")) xodtemplate_current_object_type = XODTEMPLATE_SERVICEDEPENDENCY; else if(!strcmp(input, "serviceescalation")) xodtemplate_current_object_type = XODTEMPLATE_SERVICEESCALATION; else if(!strcmp(input, "hostdependency")) xodtemplate_current_object_type = XODTEMPLATE_HOSTDEPENDENCY; else if(!strcmp(input, "hostescalation")) xodtemplate_current_object_type = XODTEMPLATE_HOSTESCALATION; else if(!strcmp(input, "hostextinfo")) xodtemplate_current_object_type = XODTEMPLATE_HOSTEXTINFO; else if(!strcmp(input, "serviceextinfo")) xodtemplate_current_object_type = XODTEMPLATE_SERVICEEXTINFO; else return ERROR; /* check to see if we should process this type of object */ switch(xodtemplate_current_object_type) { case XODTEMPLATE_TIMEPERIOD: if(!(options & READ_TIMEPERIODS)) return OK; break; case XODTEMPLATE_COMMAND: if(!(options & READ_COMMANDS)) return OK; break; case XODTEMPLATE_CONTACT: if(!(options & READ_CONTACTS)) return OK; break; case XODTEMPLATE_CONTACTGROUP: if(!(options & READ_CONTACTGROUPS)) return OK; break; case XODTEMPLATE_HOST: if(!(options & READ_HOSTS)) return OK; break; case XODTEMPLATE_HOSTGROUP: if(!(options & READ_HOSTGROUPS)) return OK; break; case XODTEMPLATE_SERVICEGROUP: if(!(options & READ_SERVICEGROUPS)) return OK; break; case XODTEMPLATE_SERVICE: if(!(options & READ_SERVICES)) return OK; break; case XODTEMPLATE_SERVICEDEPENDENCY: if(!(options & READ_SERVICEDEPENDENCIES)) return OK; break; case XODTEMPLATE_SERVICEESCALATION: if(!(options & READ_SERVICEESCALATIONS)) return OK; break; case XODTEMPLATE_HOSTDEPENDENCY: if(!(options & READ_HOSTDEPENDENCIES)) return OK; break; case XODTEMPLATE_HOSTESCALATION: if(!(options & READ_HOSTESCALATIONS)) return OK; break; case XODTEMPLATE_HOSTEXTINFO: if(!(options & READ_HOSTEXTINFO)) return OK; break; case XODTEMPLATE_SERVICEEXTINFO: if(!(options & READ_SERVICEEXTINFO)) return OK; break; default: return ERROR; break; } /* add a new (blank) object */ switch(xodtemplate_current_object_type) { case XODTEMPLATE_TIMEPERIOD: xod_begin_def(timeperiod); break; case XODTEMPLATE_COMMAND: xod_begin_def(command); break; case XODTEMPLATE_CONTACTGROUP: xod_begin_def(contactgroup); break; case XODTEMPLATE_HOSTGROUP: xod_begin_def(hostgroup); break; case XODTEMPLATE_SERVICEGROUP: xod_begin_def(servicegroup); break; case XODTEMPLATE_SERVICEDEPENDENCY: xod_begin_def(servicedependency); break; case XODTEMPLATE_SERVICEESCALATION: xod_begin_def(serviceescalation); new_serviceescalation->first_notification = -2; new_serviceescalation->last_notification = -2; break; case XODTEMPLATE_CONTACT: xod_begin_def(contact); new_contact->minimum_value = 0; new_contact->host_notifications_enabled = TRUE; new_contact->service_notifications_enabled = TRUE; new_contact->can_submit_commands = TRUE; new_contact->retain_status_information = TRUE; new_contact->retain_nonstatus_information = TRUE; break; case XODTEMPLATE_HOST: xod_begin_def(host); new_host->hourly_value = 0; new_host->check_interval = 5.0; new_host->retry_interval = 1.0; new_host->active_checks_enabled = TRUE; new_host->passive_checks_enabled = TRUE; new_host->obsess = TRUE; new_host->max_check_attempts = -2; new_host->event_handler_enabled = TRUE; new_host->flap_detection_enabled = TRUE; new_host->flap_detection_options = OPT_ALL; new_host->notifications_enabled = TRUE; new_host->notification_interval = 30.0; new_host->process_perf_data = TRUE; new_host->x_2d = -1; new_host->y_2d = -1; new_host->retain_status_information = TRUE; new_host->retain_nonstatus_information = TRUE; break; case XODTEMPLATE_SERVICE: xod_begin_def(service); new_service->hourly_value = 0; new_service->initial_state = STATE_OK; new_service->max_check_attempts = -2; new_service->check_interval = 5.0; new_service->retry_interval = 1.0; new_service->active_checks_enabled = TRUE; new_service->passive_checks_enabled = TRUE; new_service->parallelize_check = TRUE; new_service->obsess = TRUE; new_service->event_handler_enabled = TRUE; new_service->flap_detection_enabled = TRUE; new_service->flap_detection_options = OPT_ALL; new_service->notifications_enabled = TRUE; new_service->notification_interval = 30.0; new_service->process_perf_data = TRUE; new_service->retain_status_information = TRUE; new_service->retain_nonstatus_information = TRUE; /* true service, so is not from host group */ new_service->is_from_hostgroup = 0; break; case XODTEMPLATE_HOSTDEPENDENCY: xod_begin_def(hostdependency); break; case XODTEMPLATE_HOSTESCALATION: xod_begin_def(hostescalation); new_hostescalation->first_notification = -2; new_hostescalation->last_notification = -2; break; case XODTEMPLATE_HOSTEXTINFO: xod_begin_def(hostextinfo); new_hostextinfo->x_2d = -1; new_hostextinfo->y_2d = -1; break; case XODTEMPLATE_SERVICEEXTINFO: xod_begin_def(serviceextinfo); break; default: return ERROR; break; } return result; } #undef xod_begin_def /* we don't need this anymore */ static const char *xodtemplate_type_name(unsigned int id) { static const char *otype_name[] = { "NONE", "timeperiod", "command", "contact", "contactgroup", "host", "hostgroup", "service", "servicedependency", "serviceescalation", "hostescalation", "hostdependency", "hostextinfo", "serviceextinfo", "servicegroup" }; if (id > ARRAY_SIZE(otype_name)) return otype_name[0]; return otype_name[id]; } static void xodtemplate_obsoleted(const char *var, int start_line) { logit(NSLOG_CONFIG_WARNING, TRUE, "Warning: %s is obsoleted and no longer has any effect in %s type objects (config file '%s', starting at line %d)\n", var, xodtemplate_type_name(xodtemplate_current_object_type), xodtemplate_config_file_name(xodtemplate_current_config_file), start_line); } /* adds a property to an object definition */ int xodtemplate_add_object_property(char *input, int options) { int result = OK; char *variable = NULL; char *value = NULL; char *temp_ptr = NULL; char *customvarname = NULL; char *customvarvalue = NULL; xodtemplate_timeperiod *temp_timeperiod = NULL; xodtemplate_command *temp_command = NULL; xodtemplate_contactgroup *temp_contactgroup = NULL; xodtemplate_hostgroup *temp_hostgroup = NULL; xodtemplate_servicegroup *temp_servicegroup = NULL; xodtemplate_servicedependency *temp_servicedependency = NULL; xodtemplate_serviceescalation *temp_serviceescalation = NULL; xodtemplate_contact *temp_contact = NULL; xodtemplate_host *temp_host = NULL; xodtemplate_service *temp_service = NULL; xodtemplate_hostdependency *temp_hostdependency = NULL; xodtemplate_hostescalation *temp_hostescalation = NULL; xodtemplate_hostextinfo *temp_hostextinfo = NULL; xodtemplate_serviceextinfo *temp_serviceextinfo = NULL; int x, lth, force_skiplists = FALSE; /* should some object definitions be added to skiplists immediately? */ #ifdef NSCORE if(use_precached_objects == TRUE) force_skiplists = TRUE; #else force_skiplists = TRUE; #endif /* check to see if we should process this type of object */ switch(xodtemplate_current_object_type) { case XODTEMPLATE_TIMEPERIOD: if(!(options & READ_TIMEPERIODS)) return OK; break; case XODTEMPLATE_COMMAND: if(!(options & READ_COMMANDS)) return OK; break; case XODTEMPLATE_CONTACT: if(!(options & READ_CONTACTS)) return OK; break; case XODTEMPLATE_CONTACTGROUP: if(!(options & READ_CONTACTGROUPS)) return OK; break; case XODTEMPLATE_HOST: if(!(options & READ_HOSTS)) return OK; break; case XODTEMPLATE_HOSTGROUP: if(!(options & READ_HOSTGROUPS)) return OK; break; case XODTEMPLATE_SERVICEGROUP: if(!(options & READ_SERVICEGROUPS)) return OK; break; case XODTEMPLATE_SERVICE: if(!(options & READ_SERVICES)) return OK; break; case XODTEMPLATE_SERVICEDEPENDENCY: if(!(options & READ_SERVICEDEPENDENCIES)) return OK; break; case XODTEMPLATE_SERVICEESCALATION: if(!(options & READ_SERVICEESCALATIONS)) return OK; break; case XODTEMPLATE_HOSTDEPENDENCY: if(!(options & READ_HOSTDEPENDENCIES)) return OK; break; case XODTEMPLATE_HOSTESCALATION: if(!(options & READ_HOSTESCALATIONS)) return OK; break; case XODTEMPLATE_HOSTEXTINFO: if(!(options & READ_HOSTEXTINFO)) return OK; break; case XODTEMPLATE_SERVICEEXTINFO: if(!(options & READ_SERVICEEXTINFO)) return OK; break; default: return ERROR; break; } /* get variable name */ variable = input; lth = strlen(variable); /* trim at first whitespace occurrence */ for(x = 0; variable[x] != '\x0'; x++) { if(variable[x] == ' ' || variable[x] == '\t') { variable[x] = 0; break; } } /* get variable value */ if (x == lth) value = ""; else value = input + x + 1; while (*value == ' ' || *value == '\t') value++; /* now strip trailing spaces */ strip(value); switch(xodtemplate_current_object_type) { case XODTEMPLATE_TIMEPERIOD: temp_timeperiod = (xodtemplate_timeperiod *)xodtemplate_current_object; if(!strcmp(variable, "use")) { if((temp_timeperiod->template = (char *)strdup(value)) == NULL) result = ERROR; } else if(!strcmp(variable, "name")) { if((temp_timeperiod->name = (char *)strdup(value)) == NULL) result = ERROR; if(result == OK) { /* add timeperiod to template skiplist for fast searches */ result = skiplist_insert(xobject_template_skiplists[TIMEPERIOD_SKIPLIST], (void *)temp_timeperiod); switch(result) { case SKIPLIST_ERROR_DUPLICATE: logit(NSLOG_CONFIG_WARNING, TRUE, "Warning: Duplicate definition found for timeperiod '%s' (config file '%s', starting on line %d)\n", value, xodtemplate_config_file_name(temp_timeperiod->_config_file), temp_timeperiod->_start_line); result = ERROR; break; case SKIPLIST_OK: result = OK; break; default: result = ERROR; break; } } } else if(!strcmp(variable, "timeperiod_name")) { if((temp_timeperiod->timeperiod_name = (char *)strdup(value)) == NULL) result = ERROR; if(result == OK) { /* add timeperiod to template skiplist for fast searches */ result = skiplist_insert(xobject_skiplists[TIMEPERIOD_SKIPLIST], (void *)temp_timeperiod); switch(result) { case SKIPLIST_ERROR_DUPLICATE: logit(NSLOG_CONFIG_WARNING, TRUE, "Warning: Duplicate definition found for timeperiod '%s' (config file '%s', starting on line %d)\n", value, xodtemplate_config_file_name(temp_timeperiod->_config_file), temp_timeperiod->_start_line); result = ERROR; break; case SKIPLIST_OK: result = OK; break; default: result = ERROR; break; } } } else if(!strcmp(variable, "alias")) { if((temp_timeperiod->alias = (char *)strdup(value)) == NULL) result = ERROR; } else if(!strcmp(variable, "exclude")) { if((temp_timeperiod->exclusions = (char *)strdup(value)) == NULL) result = ERROR; } else if(!strcmp(variable, "register")) temp_timeperiod->register_object = (atoi(value) > 0) ? TRUE : FALSE; else if(xodtemplate_parse_timeperiod_directive(temp_timeperiod, variable, value) == OK) result = OK; else { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Invalid timeperiod object directive '%s'.\n", variable); return ERROR; } break; case XODTEMPLATE_COMMAND: temp_command = (xodtemplate_command *)xodtemplate_current_object; if(!strcmp(variable, "use")) { if((temp_command->template = (char *)strdup(value)) == NULL) result = ERROR; } else if(!strcmp(variable, "name")) { if((temp_command->name = (char *)strdup(value)) == NULL) result = ERROR; if(result == OK) { /* add command to template skiplist for fast searches */ result = skiplist_insert(xobject_template_skiplists[COMMAND_SKIPLIST], (void *)temp_command); switch(result) { case SKIPLIST_ERROR_DUPLICATE: logit(NSLOG_CONFIG_WARNING, TRUE, "Warning: Duplicate definition found for command '%s' (config file '%s', starting on line %d)\n", value, xodtemplate_config_file_name(temp_command->_config_file), temp_command->_start_line); result = ERROR; break; case SKIPLIST_OK: result = OK; break; default: result = ERROR; break; } } } else if(!strcmp(variable, "command_name")) { if((temp_command->command_name = (char *)strdup(value)) == NULL) result = ERROR; if(result == OK) { /* add command to template skiplist for fast searches */ result = skiplist_insert(xobject_skiplists[COMMAND_SKIPLIST], (void *)temp_command); switch(result) { case SKIPLIST_ERROR_DUPLICATE: logit(NSLOG_CONFIG_WARNING, TRUE, "Warning: Duplicate definition found for command '%s' (config file '%s', starting on line %d)\n", value, xodtemplate_config_file_name(temp_command->_config_file), temp_command->_start_line); result = ERROR; break; case SKIPLIST_OK: result = OK; break; default: result = ERROR; break; } } } else if(!strcmp(variable, "command_line")) { if((temp_command->command_line = (char *)strdup(value)) == NULL) result = ERROR; } else if(!strcmp(variable, "register")) temp_command->register_object = (atoi(value) > 0) ? TRUE : FALSE; else { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Invalid command object directive '%s'.\n", variable); return ERROR; } break; case XODTEMPLATE_CONTACTGROUP: temp_contactgroup = (xodtemplate_contactgroup *)xodtemplate_current_object; if(!strcmp(variable, "use")) { if((temp_contactgroup->template = (char *)strdup(value)) == NULL) result = ERROR; } else if(!strcmp(variable, "name")) { if((temp_contactgroup->name = (char *)strdup(value)) == NULL) result = ERROR; if(result == OK) { /* add contactgroup to template skiplist for fast searches */ result = skiplist_insert(xobject_template_skiplists[CONTACTGROUP_SKIPLIST], (void *)temp_contactgroup); switch(result) { case SKIPLIST_ERROR_DUPLICATE: logit(NSLOG_CONFIG_WARNING, TRUE, "Warning: Duplicate definition found for contactgroup '%s' (config file '%s', starting on line %d)\n", value, xodtemplate_config_file_name(temp_contactgroup->_config_file), temp_contactgroup->_start_line); result = ERROR; break; case SKIPLIST_OK: result = OK; break; default: result = ERROR; break; } } } else if(!strcmp(variable, "contactgroup_name")) { if((temp_contactgroup->contactgroup_name = (char *)strdup(value)) == NULL) result = ERROR; if(result == OK) { /* add contactgroup to template skiplist for fast searches */ result = skiplist_insert(xobject_skiplists[CONTACTGROUP_SKIPLIST], (void *)temp_contactgroup); switch(result) { case SKIPLIST_ERROR_DUPLICATE: logit(NSLOG_CONFIG_WARNING, TRUE, "Warning: Duplicate definition found for contactgroup '%s' (config file '%s', starting on line %d)\n", value, xodtemplate_config_file_name(temp_contactgroup->_config_file), temp_contactgroup->_start_line); result = ERROR; break; case SKIPLIST_OK: result = OK; break; default: result = ERROR; break; } } } else if(!strcmp(variable, "alias")) { if((temp_contactgroup->alias = (char *)strdup(value)) == NULL) result = ERROR; } else if(!strcmp(variable, "members")) { if(strcmp(value, XODTEMPLATE_NULL)) { if(temp_contactgroup->members == NULL) temp_contactgroup->members = (char *)strdup(value); else { temp_contactgroup->members = (char *)realloc(temp_contactgroup->members, strlen(temp_contactgroup->members) + strlen(value) + 2); if(temp_contactgroup->members != NULL) { strcat(temp_contactgroup->members, ","); strcat(temp_contactgroup->members, value); } } if(temp_contactgroup->members == NULL) result = ERROR; } temp_contactgroup->have_members = TRUE; } else if(!strcmp(variable, "contactgroup_members")) { if(strcmp(value, XODTEMPLATE_NULL)) { if(temp_contactgroup->contactgroup_members == NULL) temp_contactgroup->contactgroup_members = (char *)strdup(value); else { temp_contactgroup->contactgroup_members = (char *)realloc(temp_contactgroup->contactgroup_members, strlen(temp_contactgroup->contactgroup_members) + strlen(value) + 2); if(temp_contactgroup->contactgroup_members != NULL) { strcat(temp_contactgroup->contactgroup_members, ","); strcat(temp_contactgroup->contactgroup_members, value); } } if(temp_contactgroup->contactgroup_members == NULL) result = ERROR; } temp_contactgroup->have_contactgroup_members = TRUE; } else if(!strcmp(variable, "register")) temp_contactgroup->register_object = (atoi(value) > 0) ? TRUE : FALSE; else { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Invalid contactgroup object directive '%s'.\n", variable); return ERROR; } break; case XODTEMPLATE_HOSTGROUP: temp_hostgroup = (xodtemplate_hostgroup *)xodtemplate_current_object; if(!strcmp(variable, "use")) { if((temp_hostgroup->template = (char *)strdup(value)) == NULL) result = ERROR; } else if(!strcmp(variable, "name")) { if((temp_hostgroup->name = (char *)strdup(value)) == NULL) result = ERROR; if(result == OK) { /* add hostgroup to template skiplist for fast searches */ result = skiplist_insert(xobject_template_skiplists[HOSTGROUP_SKIPLIST], (void *)temp_hostgroup); switch(result) { case SKIPLIST_ERROR_DUPLICATE: logit(NSLOG_CONFIG_WARNING, TRUE, "Warning: Duplicate definition found for hostgroup '%s' (config file '%s', starting on line %d)\n", value, xodtemplate_config_file_name(temp_hostgroup->_config_file), temp_hostgroup->_start_line); result = ERROR; break; case SKIPLIST_OK: result = OK; break; default: result = ERROR; break; } } } else if(!strcmp(variable, "hostgroup_name")) { if((temp_hostgroup->hostgroup_name = (char *)strdup(value)) == NULL) result = ERROR; if(result == OK) { /* add hostgroup to template skiplist for fast searches */ result = skiplist_insert(xobject_skiplists[HOSTGROUP_SKIPLIST], (void *)temp_hostgroup); switch(result) { case SKIPLIST_ERROR_DUPLICATE: logit(NSLOG_CONFIG_WARNING, TRUE, "Warning: Duplicate definition found for hostgroup '%s' (config file '%s', starting on line %d)\n", value, xodtemplate_config_file_name(temp_hostgroup->_config_file), temp_hostgroup->_start_line); result = ERROR; break; case SKIPLIST_OK: result = OK; break; default: result = ERROR; break; } } } else if(!strcmp(variable, "alias")) { if((temp_hostgroup->alias = (char *)strdup(value)) == NULL) result = ERROR; } else if(!strcmp(variable, "members")) { if(strcmp(value, XODTEMPLATE_NULL)) { if(temp_hostgroup->members == NULL) temp_hostgroup->members = (char *)strdup(value); else { temp_hostgroup->members = (char *)realloc(temp_hostgroup->members, strlen(temp_hostgroup->members) + strlen(value) + 2); if(temp_hostgroup->members != NULL) { strcat(temp_hostgroup->members, ","); strcat(temp_hostgroup->members, value); } } if(temp_hostgroup->members == NULL) result = ERROR; } temp_hostgroup->have_members = TRUE; } else if(!strcmp(variable, "hostgroup_members")) { if(strcmp(value, XODTEMPLATE_NULL)) { if(temp_hostgroup->hostgroup_members == NULL) temp_hostgroup->hostgroup_members = (char *)strdup(value); else { temp_hostgroup->hostgroup_members = (char *)realloc(temp_hostgroup->hostgroup_members, strlen(temp_hostgroup->hostgroup_members) + strlen(value) + 2); if(temp_hostgroup->hostgroup_members != NULL) { strcat(temp_hostgroup->hostgroup_members, ","); strcat(temp_hostgroup->hostgroup_members, value); } } if(temp_hostgroup->hostgroup_members == NULL) result = ERROR; } temp_hostgroup->have_hostgroup_members = TRUE; } else if(!strcmp(variable, "notes")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_hostgroup->notes = (char *)strdup(value)) == NULL) result = ERROR; } temp_hostgroup->have_notes = TRUE; } else if(!strcmp(variable, "notes_url")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_hostgroup->notes_url = (char *)strdup(value)) == NULL) result = ERROR; } temp_hostgroup->have_notes_url = TRUE; } else if(!strcmp(variable, "action_url")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_hostgroup->action_url = (char *)strdup(value)) == NULL) result = ERROR; } temp_hostgroup->have_action_url = TRUE; } else if(!strcmp(variable, "register")) temp_hostgroup->register_object = (atoi(value) > 0) ? TRUE : FALSE; else { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Invalid hostgroup object directive '%s'.\n", variable); return ERROR; } break; case XODTEMPLATE_SERVICEGROUP: temp_servicegroup = (xodtemplate_servicegroup *)xodtemplate_current_object; if(!strcmp(variable, "use")) { if((temp_servicegroup->template = (char *)strdup(value)) == NULL) result = ERROR; } else if(!strcmp(variable, "name")) { if((temp_servicegroup->name = (char *)strdup(value)) == NULL) result = ERROR; if(result == OK) { /* add servicegroup to template skiplist for fast searches */ result = skiplist_insert(xobject_template_skiplists[SERVICEGROUP_SKIPLIST], (void *)temp_servicegroup); switch(result) { case SKIPLIST_ERROR_DUPLICATE: logit(NSLOG_CONFIG_WARNING, TRUE, "Warning: Duplicate definition found for servicegroup '%s' (config file '%s', starting on line %d)\n", value, xodtemplate_config_file_name(temp_servicegroup->_config_file), temp_servicegroup->_start_line); result = ERROR; break; case SKIPLIST_OK: result = OK; break; default: result = ERROR; break; } } } else if(!strcmp(variable, "servicegroup_name")) { if((temp_servicegroup->servicegroup_name = (char *)strdup(value)) == NULL) result = ERROR; if(result == OK) { /* add servicegroup to template skiplist for fast searches */ result = skiplist_insert(xobject_skiplists[SERVICEGROUP_SKIPLIST], (void *)temp_servicegroup); switch(result) { case SKIPLIST_ERROR_DUPLICATE: logit(NSLOG_CONFIG_WARNING, TRUE, "Warning: Duplicate definition found for servicegroup '%s' (config file '%s', starting on line %d)\n", value, xodtemplate_config_file_name(temp_servicegroup->_config_file), temp_servicegroup->_start_line); result = ERROR; break; case SKIPLIST_OK: result = OK; break; default: result = ERROR; break; } } } else if(!strcmp(variable, "alias")) { if((temp_servicegroup->alias = (char *)strdup(value)) == NULL) result = ERROR; } else if(!strcmp(variable, "members")) { if(strcmp(value, XODTEMPLATE_NULL)) { if(temp_servicegroup->members == NULL) temp_servicegroup->members = (char *)strdup(value); else { temp_servicegroup->members = (char *)realloc(temp_servicegroup->members, strlen(temp_servicegroup->members) + strlen(value) + 2); if(temp_servicegroup->members != NULL) { strcat(temp_servicegroup->members, ","); strcat(temp_servicegroup->members, value); } } if(temp_servicegroup->members == NULL) result = ERROR; } temp_servicegroup->have_members = TRUE; } else if(!strcmp(variable, "servicegroup_members")) { if(strcmp(value, XODTEMPLATE_NULL)) { if(temp_servicegroup->servicegroup_members == NULL) temp_servicegroup->servicegroup_members = (char *)strdup(value); else { temp_servicegroup->servicegroup_members = (char *)realloc(temp_servicegroup->servicegroup_members, strlen(temp_servicegroup->servicegroup_members) + strlen(value) + 2); if(temp_servicegroup->servicegroup_members != NULL) { strcat(temp_servicegroup->servicegroup_members, ","); strcat(temp_servicegroup->servicegroup_members, value); } } if(temp_servicegroup->servicegroup_members == NULL) result = ERROR; } temp_servicegroup->have_servicegroup_members = TRUE; } else if(!strcmp(variable, "notes")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_servicegroup->notes = (char *)strdup(value)) == NULL) result = ERROR; } temp_servicegroup->have_notes = TRUE; } else if(!strcmp(variable, "notes_url")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_servicegroup->notes_url = (char *)strdup(value)) == NULL) result = ERROR; } temp_servicegroup->have_notes_url = TRUE; } else if(!strcmp(variable, "action_url")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_servicegroup->action_url = (char *)strdup(value)) == NULL) result = ERROR; } temp_servicegroup->have_action_url = TRUE; } else if(!strcmp(variable, "register")) temp_servicegroup->register_object = (atoi(value) > 0) ? TRUE : FALSE; else { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Invalid servicegroup object directive '%s'.\n", variable); return ERROR; } break; case XODTEMPLATE_SERVICEDEPENDENCY: temp_servicedependency = (xodtemplate_servicedependency *)xodtemplate_current_object; if(!strcmp(variable, "use")) { if((temp_servicedependency->template = (char *)strdup(value)) == NULL) result = ERROR; } else if(!strcmp(variable, "name")) { if((temp_servicedependency->name = (char *)strdup(value)) == NULL) result = ERROR; if(result == OK) { /* add dependency to template skiplist for fast searches */ result = skiplist_insert(xobject_template_skiplists[SERVICEDEPENDENCY_SKIPLIST], (void *)temp_servicedependency); switch(result) { case SKIPLIST_ERROR_DUPLICATE: logit(NSLOG_CONFIG_WARNING, TRUE, "Warning: Duplicate definition found for service dependency '%s' (config file '%s', starting on line %d)\n", value, xodtemplate_config_file_name(temp_servicedependency->_config_file), temp_servicedependency->_start_line); result = ERROR; break; case SKIPLIST_OK: result = OK; break; default: result = ERROR; break; } } } else if(!strcmp(variable, "servicegroup") || !strcmp(variable, "servicegroups") || !strcmp(variable, "servicegroup_name")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_servicedependency->servicegroup_name = (char *)strdup(value)) == NULL) result = ERROR; } temp_servicedependency->have_servicegroup_name = TRUE; } else if(!strcmp(variable, "hostgroup") || !strcmp(variable, "hostgroups") || !strcmp(variable, "hostgroup_name")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_servicedependency->hostgroup_name = (char *)strdup(value)) == NULL) result = ERROR; } temp_servicedependency->have_hostgroup_name = TRUE; } else if(!strcmp(variable, "host") || !strcmp(variable, "host_name") || !strcmp(variable, "master_host") || !strcmp(variable, "master_host_name")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_servicedependency->host_name = (char *)strdup(value)) == NULL) result = ERROR; } temp_servicedependency->have_host_name = TRUE; } else if(!strcmp(variable, "description") || !strcmp(variable, "service_description") || !strcmp(variable, "master_description") || !strcmp(variable, "master_service_description")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_servicedependency->service_description = (char *)strdup(value)) == NULL) result = ERROR; } temp_servicedependency->have_service_description = TRUE; } else if(!strcmp(variable, "dependent_servicegroup") || !strcmp(variable, "dependent_servicegroups") || !strcmp(variable, "dependent_servicegroup_name")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_servicedependency->dependent_servicegroup_name = (char *)strdup(value)) == NULL) result = ERROR; } temp_servicedependency->have_dependent_servicegroup_name = TRUE; } else if(!strcmp(variable, "dependent_hostgroup") || !strcmp(variable, "dependent_hostgroups") || !strcmp(variable, "dependent_hostgroup_name")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_servicedependency->dependent_hostgroup_name = (char *)strdup(value)) == NULL) result = ERROR; } temp_servicedependency->have_dependent_hostgroup_name = TRUE; } else if(!strcmp(variable, "dependent_host") || !strcmp(variable, "dependent_host_name")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_servicedependency->dependent_host_name = (char *)strdup(value)) == NULL) result = ERROR; } temp_servicedependency->have_dependent_host_name = TRUE; } else if(!strcmp(variable, "dependent_description") || !strcmp(variable, "dependent_service_description")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_servicedependency->dependent_service_description = (char *)strdup(value)) == NULL) result = ERROR; } temp_servicedependency->have_dependent_service_description = TRUE; } else if(!strcmp(variable, "dependency_period")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_servicedependency->dependency_period = (char *)strdup(value)) == NULL) result = ERROR; } temp_servicedependency->have_dependency_period = TRUE; } else if(!strcmp(variable, "inherits_parent")) { temp_servicedependency->inherits_parent = (atoi(value) > 0) ? TRUE : FALSE; temp_servicedependency->have_inherits_parent = TRUE; } else if(!strcmp(variable, "execution_failure_options") || !strcmp(variable, "execution_failure_criteria")) { temp_servicedependency->have_execution_failure_options = TRUE; for(temp_ptr = strtok(value, ", "); temp_ptr; temp_ptr = strtok(NULL, ", ")) { if(!strcmp(temp_ptr, "o") || !strcmp(temp_ptr, "ok")) flag_set(temp_servicedependency->execution_failure_options, OPT_OK); else if(!strcmp(temp_ptr, "u") || !strcmp(temp_ptr, "unknown")) flag_set(temp_servicedependency->execution_failure_options, OPT_UNKNOWN); else if(!strcmp(temp_ptr, "w") || !strcmp(temp_ptr, "warning")) flag_set(temp_servicedependency->execution_failure_options, OPT_WARNING); else if(!strcmp(temp_ptr, "c") || !strcmp(temp_ptr, "critical")) flag_set(temp_servicedependency->execution_failure_options, OPT_CRITICAL); else if(!strcmp(temp_ptr, "p") || !strcmp(temp_ptr, "pending")) flag_set(temp_servicedependency->execution_failure_options, OPT_PENDING); else if(!strcmp(temp_ptr, "n") || !strcmp(temp_ptr, "none")) { temp_servicedependency->execution_failure_options = OPT_NOTHING; temp_servicedependency->have_execution_failure_options = FALSE; } else if(!strcmp(temp_ptr, "a") || !strcmp(temp_ptr, "all")) { temp_servicedependency->execution_failure_options = OPT_ALL; } else { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Invalid execution dependency option '%s' in servicedependency definition.\n", temp_ptr); return ERROR; } } } else if(!strcmp(variable, "notification_failure_options") || !strcmp(variable, "notification_failure_criteria")) { temp_servicedependency->have_notification_failure_options = TRUE; for(temp_ptr = strtok(value, ", "); temp_ptr; temp_ptr = strtok(NULL, ", ")) { if(!strcmp(temp_ptr, "o") || !strcmp(temp_ptr, "ok")) flag_set(temp_servicedependency->notification_failure_options, OPT_OK); else if(!strcmp(temp_ptr, "u") || !strcmp(temp_ptr, "unknown")) flag_set(temp_servicedependency->notification_failure_options, OPT_UNKNOWN); else if(!strcmp(temp_ptr, "w") || !strcmp(temp_ptr, "warning")) flag_set(temp_servicedependency->notification_failure_options, OPT_WARNING); else if(!strcmp(temp_ptr, "c") || !strcmp(temp_ptr, "critical")) flag_set(temp_servicedependency->notification_failure_options, OPT_CRITICAL); else if(!strcmp(temp_ptr, "p") || !strcmp(temp_ptr, "pending")) flag_set(temp_servicedependency->notification_failure_options, OPT_PENDING); else if(!strcmp(temp_ptr, "n") || !strcmp(temp_ptr, "none")) { temp_servicedependency->notification_failure_options = OPT_NOTHING; temp_servicedependency->have_notification_failure_options = FALSE; } else if(!strcmp(temp_ptr, "a") || !strcmp(temp_ptr, "all")) { temp_servicedependency->notification_failure_options = OPT_ALL; } else { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Invalid notification dependency option '%s' in servicedependency definition.\n", temp_ptr); return ERROR; } } } else if(!strcmp(variable, "register")) temp_servicedependency->register_object = (atoi(value) > 0) ? TRUE : FALSE; else { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Invalid servicedependency object directive '%s'.\n", variable); return ERROR; } break; case XODTEMPLATE_SERVICEESCALATION: temp_serviceescalation = (xodtemplate_serviceescalation *)xodtemplate_current_object; if(!strcmp(variable, "use")) { if((temp_serviceescalation->template = (char *)strdup(value)) == NULL) result = ERROR; } else if(!strcmp(variable, "name")) { if((temp_serviceescalation->name = (char *)strdup(value)) == NULL) result = ERROR; if(result == OK) { /* add escalation to template skiplist for fast searches */ result = skiplist_insert(xobject_template_skiplists[SERVICEESCALATION_SKIPLIST], (void *)temp_serviceescalation); switch(result) { case SKIPLIST_ERROR_DUPLICATE: logit(NSLOG_CONFIG_WARNING, TRUE, "Warning: Duplicate definition found for service escalation '%s' (config file '%s', starting on line %d)\n", value, xodtemplate_config_file_name(temp_serviceescalation->_config_file), temp_serviceescalation->_start_line); result = ERROR; break; case SKIPLIST_OK: result = OK; break; default: result = ERROR; break; } } } else if(!strcmp(variable, "host") || !strcmp(variable, "host_name")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_serviceescalation->host_name = (char *)strdup(value)) == NULL) result = ERROR; } temp_serviceescalation->have_host_name = TRUE; } else if(!strcmp(variable, "description") || !strcmp(variable, "service_description")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_serviceescalation->service_description = (char *)strdup(value)) == NULL) result = ERROR; } temp_serviceescalation->have_service_description = TRUE; } else if(!strcmp(variable, "servicegroup") || !strcmp(variable, "servicegroups") || !strcmp(variable, "servicegroup_name")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_serviceescalation->servicegroup_name = (char *)strdup(value)) == NULL) result = ERROR; } temp_serviceescalation->have_servicegroup_name = TRUE; } else if(!strcmp(variable, "hostgroup") || !strcmp(variable, "hostgroups") || !strcmp(variable, "hostgroup_name")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_serviceescalation->hostgroup_name = (char *)strdup(value)) == NULL) result = ERROR; } temp_serviceescalation->have_hostgroup_name = TRUE; } else if(!strcmp(variable, "contact_groups")) { if (*value == '\0') { logit(NSLOG_CONFIG_WARNING, TRUE, "Error: Empty value for contact_groups (config file '%s', starting on line %d)\n", xodtemplate_config_file_name(temp_serviceescalation->_config_file), temp_serviceescalation->_start_line); result = ERROR; break; } if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_serviceescalation->contact_groups = (char *)strdup(value)) == NULL) result = ERROR; } temp_serviceescalation->have_contact_groups = TRUE; } else if(!strcmp(variable, "contacts")) { if (*value == '\0') { logit(NSLOG_CONFIG_WARNING, TRUE, "Error: Empty value for contacts (config file '%s', starting on line %d)\n", xodtemplate_config_file_name(temp_serviceescalation->_config_file), temp_serviceescalation->_start_line); result = ERROR; break; } if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_serviceescalation->contacts = (char *)strdup(value)) == NULL) result = ERROR; } temp_serviceescalation->have_contacts = TRUE; } else if(!strcmp(variable, "escalation_period")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_serviceescalation->escalation_period = (char *)strdup(value)) == NULL) result = ERROR; } temp_serviceescalation->have_escalation_period = TRUE; } else if(!strcmp(variable, "first_notification")) { temp_serviceescalation->first_notification = atoi(value); temp_serviceescalation->have_first_notification = TRUE; } else if(!strcmp(variable, "last_notification")) { temp_serviceescalation->last_notification = atoi(value); temp_serviceescalation->have_last_notification = TRUE; } else if(!strcmp(variable, "notification_interval")) { temp_serviceescalation->notification_interval = strtod(value, NULL); temp_serviceescalation->have_notification_interval = TRUE; } else if(!strcmp(variable, "escalation_options")) { for(temp_ptr = strtok(value, ", "); temp_ptr; temp_ptr = strtok(NULL, ", ")) { if(!strcmp(temp_ptr, "w") || !strcmp(temp_ptr, "warning")) flag_set(temp_serviceescalation->escalation_options, OPT_WARNING); else if(!strcmp(temp_ptr, "u") || !strcmp(temp_ptr, "unknown")) flag_set(temp_serviceescalation->escalation_options, OPT_UNKNOWN); else if(!strcmp(temp_ptr, "c") || !strcmp(temp_ptr, "critical")) flag_set(temp_serviceescalation->escalation_options, OPT_CRITICAL); else if(!strcmp(temp_ptr, "r") || !strcmp(temp_ptr, "recovery")) flag_set(temp_serviceescalation->escalation_options, OPT_RECOVERY); else if(!strcmp(temp_ptr, "n") || !strcmp(temp_ptr, "none")) { temp_serviceescalation->escalation_options = OPT_NOTHING; } else if(!strcmp(temp_ptr, "a") || !strcmp(temp_ptr, "all")) { temp_serviceescalation->escalation_options = OPT_ALL; } else { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Invalid escalation option '%s' in serviceescalation definition.\n", temp_ptr); return ERROR; } } temp_serviceescalation->have_escalation_options = TRUE; } else if(!strcmp(variable, "register")) temp_serviceescalation->register_object = (atoi(value) > 0) ? TRUE : FALSE; else { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Invalid serviceescalation object directive '%s'.\n", variable); return ERROR; } break; case XODTEMPLATE_CONTACT: temp_contact = (xodtemplate_contact *)xodtemplate_current_object; if(!strcmp(variable, "use")) { if((temp_contact->template = (char *)strdup(value)) == NULL) result = ERROR; } else if(!strcmp(variable, "name")) { if((temp_contact->name = (char *)strdup(value)) == NULL) result = ERROR; if(result == OK) { /* add contact to template skiplist for fast searches */ result = skiplist_insert(xobject_template_skiplists[CONTACT_SKIPLIST], (void *)temp_contact); switch(result) { case SKIPLIST_ERROR_DUPLICATE: logit(NSLOG_CONFIG_WARNING, TRUE, "Warning: Duplicate definition found for contact '%s' (config file '%s', starting on line %d)\n", value, xodtemplate_config_file_name(temp_contact->_config_file), temp_contact->_start_line); result = ERROR; break; case SKIPLIST_OK: result = OK; break; default: result = ERROR; break; } } } else if(!strcmp(variable, "contact_name")) { if((temp_contact->contact_name = (char *)strdup(value)) == NULL) result = ERROR; if(result == OK) { /* add contact to template skiplist for fast searches */ result = skiplist_insert(xobject_skiplists[CONTACT_SKIPLIST], (void *)temp_contact); switch(result) { case SKIPLIST_ERROR_DUPLICATE: logit(NSLOG_CONFIG_WARNING, TRUE, "Warning: Duplicate definition found for contact '%s' (config file '%s', starting on line %d)\n", value, xodtemplate_config_file_name(temp_contact->_config_file), temp_contact->_start_line); result = ERROR; break; case SKIPLIST_OK: result = OK; break; default: result = ERROR; break; } } temp_contact->id = xodcount.contacts++; } else if(!strcmp(variable, "alias")) { if((temp_contact->alias = (char *)strdup(value)) == NULL) result = ERROR; } else if(!strcmp(variable, "contact_groups") || !strcmp(variable, "contactgroups")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_contact->contact_groups = (char *)strdup(value)) == NULL) result = ERROR; } temp_contact->have_contact_groups = TRUE; } else if(!strcmp(variable, "email")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_contact->email = (char *)strdup(value)) == NULL) result = ERROR; } temp_contact->have_email = TRUE; } else if(!strcmp(variable, "pager")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_contact->pager = (char *)strdup(value)) == NULL) result = ERROR; } temp_contact->have_pager = TRUE; } else if(strstr(variable, "address") == variable) { x = atoi(variable + 7); if(x < 1 || x > MAX_XODTEMPLATE_CONTACT_ADDRESSES) result = ERROR; else if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_contact->address[x - 1] = (char *)strdup(value)) == NULL) result = ERROR; } if(result == OK) temp_contact->have_address[x - 1] = TRUE; } else if(!strcmp(variable, "host_notification_period")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_contact->host_notification_period = (char *)strdup(value)) == NULL) result = ERROR; } temp_contact->have_host_notification_period = TRUE; } else if(!strcmp(variable, "host_notification_commands")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_contact->host_notification_commands = (char *)strdup(value)) == NULL) result = ERROR; } temp_contact->have_host_notification_commands = TRUE; } else if(!strcmp(variable, "service_notification_period")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_contact->service_notification_period = (char *)strdup(value)) == NULL) result = ERROR; } temp_contact->have_service_notification_period = TRUE; } else if(!strcmp(variable, "service_notification_commands")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_contact->service_notification_commands = (char *)strdup(value)) == NULL) result = ERROR; } temp_contact->have_service_notification_commands = TRUE; } else if(!strcmp(variable, "host_notification_options")) { for(temp_ptr = strtok(value, ", "); temp_ptr; temp_ptr = strtok(NULL, ", ")) { if(!strcmp(temp_ptr, "d") || !strcmp(temp_ptr, "down")) flag_set(temp_contact->host_notification_options, OPT_DOWN); else if(!strcmp(temp_ptr, "u") || !strcmp(temp_ptr, "unreachable")) flag_set(temp_contact->host_notification_options, OPT_UNREACHABLE); else if(!strcmp(temp_ptr, "r") || !strcmp(temp_ptr, "recovery")) flag_set(temp_contact->host_notification_options, OPT_RECOVERY); else if(!strcmp(temp_ptr, "f") || !strcmp(temp_ptr, "flapping")) flag_set(temp_contact->host_notification_options, OPT_FLAPPING); else if(!strcmp(temp_ptr, "s") || !strcmp(temp_ptr, "downtime")) flag_set(temp_contact->host_notification_options, OPT_DOWNTIME); else if(!strcmp(temp_ptr, "n") || !strcmp(temp_ptr, "none")) { temp_contact->host_notification_options = OPT_NOTHING; } else if(!strcmp(temp_ptr, "a") || !strcmp(temp_ptr, "all")) { temp_contact->host_notification_options = OPT_ALL; } else { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Invalid host notification option '%s' in contact definition.\n", temp_ptr); return ERROR; } } temp_contact->have_host_notification_options = TRUE; } else if(!strcmp(variable, "service_notification_options")) { for(temp_ptr = strtok(value, ", "); temp_ptr; temp_ptr = strtok(NULL, ", ")) { if(!strcmp(temp_ptr, "u") || !strcmp(temp_ptr, "unknown")) flag_set(temp_contact->service_notification_options, OPT_UNKNOWN); else if(!strcmp(temp_ptr, "w") || !strcmp(temp_ptr, "warning")) flag_set(temp_contact->service_notification_options, OPT_WARNING); else if(!strcmp(temp_ptr, "c") || !strcmp(temp_ptr, "critical")) flag_set(temp_contact->service_notification_options, OPT_CRITICAL); else if(!strcmp(temp_ptr, "r") || !strcmp(temp_ptr, "recovery")) flag_set(temp_contact->service_notification_options, OPT_RECOVERY); else if(!strcmp(temp_ptr, "f") || !strcmp(temp_ptr, "flapping")) flag_set(temp_contact->service_notification_options, OPT_FLAPPING); else if(!strcmp(temp_ptr, "s") || !strcmp(temp_ptr, "downtime")) flag_set(temp_contact->service_notification_options, OPT_DOWNTIME); else if(!strcmp(temp_ptr, "n") || !strcmp(temp_ptr, "none")) { temp_contact->service_notification_options = OPT_NOTHING; } else if(!strcmp(temp_ptr, "a") || !strcmp(temp_ptr, "all")) { temp_contact->service_notification_options = OPT_ALL; } else { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Invalid service notification option '%s' in contact definition.\n", temp_ptr); return ERROR; } } temp_contact->have_service_notification_options = TRUE; } else if(!strcmp(variable, "host_notifications_enabled")) { temp_contact->host_notifications_enabled = (atoi(value) > 0) ? TRUE : FALSE; temp_contact->have_host_notifications_enabled = TRUE; } else if(!strcmp(variable, "service_notifications_enabled")) { temp_contact->service_notifications_enabled = (atoi(value) > 0) ? TRUE : FALSE; temp_contact->have_service_notifications_enabled = TRUE; } else if(!strcmp(variable, "can_submit_commands")) { temp_contact->can_submit_commands = (atoi(value) > 0) ? TRUE : FALSE; temp_contact->have_can_submit_commands = TRUE; } else if(!strcmp(variable, "retain_status_information")) { temp_contact->retain_status_information = (atoi(value) > 0) ? TRUE : FALSE; temp_contact->have_retain_status_information = TRUE; } else if(!strcmp(variable, "retain_nonstatus_information")) { temp_contact->retain_nonstatus_information = (atoi(value) > 0) ? TRUE : FALSE; temp_contact->have_retain_nonstatus_information = TRUE; } else if(!strcmp(variable, "minimum_importance") || !strcmp(variable, "minimum_value")) { if(!strcmp(variable, "minimum_value")) { logit(NSLOG_CONFIG_WARNING, TRUE, "WARNING: The minimum_value attribute is deprecated and will be removed in future versions. Please use minimum_importance instead.\n"); } temp_contact->minimum_value = strtoul(value, NULL, 10); temp_contact->have_minimum_value = TRUE; } else if(!strcmp(variable, "register")) temp_contact->register_object = (atoi(value) > 0) ? TRUE : FALSE; else if(variable[0] == '_') { /* get the variable name */ customvarname = (char *)strdup(variable + 1); /* make sure we have a variable name */ if(customvarname == NULL || !strcmp(customvarname, "")) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Null custom variable name.\n"); my_free(customvarname); return ERROR; } /* get the variable value */ if(*value && strcmp(value, XODTEMPLATE_NULL)) customvarvalue = (char *)strdup(value); else customvarvalue = NULL; /* add the custom variable */ if(xodtemplate_add_custom_variable_to_contact(temp_contact, customvarname, customvarvalue) == NULL) { my_free(customvarname); my_free(customvarvalue); return ERROR; } /* free memory */ my_free(customvarname); my_free(customvarvalue); } else { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Invalid contact object directive '%s'.\n", variable); return ERROR; } break; case XODTEMPLATE_HOST: temp_host = (xodtemplate_host *)xodtemplate_current_object; if(!strcmp(variable, "use")) { if((temp_host->template = (char *)strdup(value)) == NULL) result = ERROR; } else if(!strcmp(variable, "name")) { if((temp_host->name = (char *)strdup(value)) == NULL) result = ERROR; if(result == OK) { /* add host to template skiplist for fast searches */ result = skiplist_insert(xobject_template_skiplists[HOST_SKIPLIST], (void *)temp_host); switch(result) { case SKIPLIST_ERROR_DUPLICATE: logit(NSLOG_CONFIG_WARNING, TRUE, "Warning: Duplicate definition found for host '%s' (config file '%s', starting on line %d)\n", value, xodtemplate_config_file_name(temp_host->_config_file), temp_host->_start_line); result = ERROR; break; case SKIPLIST_OK: result = OK; break; default: result = ERROR; break; } } } else if(!strcmp(variable, "host_name")) { if((temp_host->host_name = (char *)strdup(value)) == NULL) result = ERROR; if(result == OK) { /* add host to template skiplist for fast searches */ result = skiplist_insert(xobject_skiplists[HOST_SKIPLIST], (void *)temp_host); switch(result) { case SKIPLIST_ERROR_DUPLICATE: logit(NSLOG_CONFIG_WARNING, TRUE, "Warning: Duplicate definition found for host '%s' (config file '%s', starting on line %d)\n", value, xodtemplate_config_file_name(temp_host->_config_file), temp_host->_start_line); result = ERROR; break; case SKIPLIST_OK: result = OK; break; default: result = ERROR; break; } } temp_host->id = xodcount.hosts++; } else if(!strcmp(variable, "display_name")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_host->display_name = (char *)strdup(value)) == NULL) result = ERROR; } temp_host->have_display_name = TRUE; } else if(!strcmp(variable, "alias")) { if((temp_host->alias = (char *)strdup(value)) == NULL) result = ERROR; } else if(!strcmp(variable, "address")) { if((temp_host->address = (char *)strdup(value)) == NULL) result = ERROR; } else if(!strcmp(variable, "parents")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_host->parents = (char *)strdup(value)) == NULL) result = ERROR; } temp_host->have_parents = TRUE; } else if(!strcmp(variable, "host_groups") || !strcmp(variable, "hostgroups")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_host->host_groups = (char *)strdup(value)) == NULL) result = ERROR; } temp_host->have_host_groups = TRUE; } else if(!strcmp(variable, "contact_groups")) { if (*value == '\0') { logit(NSLOG_CONFIG_WARNING, TRUE, "Error: Empty value for contact_groups (config file '%s', starting on line %d)\n", xodtemplate_config_file_name(temp_host->_config_file), temp_host->_start_line); result = ERROR; break; } if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_host->contact_groups = (char *)strdup(value)) == NULL) result = ERROR; } temp_host->have_contact_groups = TRUE; } else if(!strcmp(variable, "contacts")) { if (*value == '\0') { logit(NSLOG_CONFIG_WARNING, TRUE, "Error: Empty value for contacts (config file '%s', starting on line %d)\n", xodtemplate_config_file_name(temp_host->_config_file), temp_host->_start_line); result = ERROR; break; } if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_host->contacts = (char *)strdup(value)) == NULL) result = ERROR; } temp_host->have_contacts = TRUE; } else if(!strcmp(variable, "notification_period")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_host->notification_period = (char *)strdup(value)) == NULL) result = ERROR; } temp_host->have_notification_period = TRUE; } else if(!strcmp(variable, "check_command")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_host->check_command = (char *)strdup(value)) == NULL) result = ERROR; } temp_host->have_check_command = TRUE; } else if(!strcmp(variable, "check_period")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_host->check_period = (char *)strdup(value)) == NULL) result = ERROR; } temp_host->have_check_period = TRUE; } else if(!strcmp(variable, "event_handler")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_host->event_handler = (char *)strdup(value)) == NULL) result = ERROR; } temp_host->have_event_handler = TRUE; } else if(!strcmp(variable, "failure_prediction_options")) { xodtemplate_obsoleted(variable, temp_host->_start_line); } else if(!strcmp(variable, "notes")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_host->notes = (char *)strdup(value)) == NULL) result = ERROR; } temp_host->have_notes = TRUE; } else if(!strcmp(variable, "notes_url")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_host->notes_url = (char *)strdup(value)) == NULL) result = ERROR; } temp_host->have_notes_url = TRUE; } else if(!strcmp(variable, "action_url")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_host->action_url = (char *)strdup(value)) == NULL) result = ERROR; } temp_host->have_action_url = TRUE; } else if(!strcmp(variable, "icon_image")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_host->icon_image = (char *)strdup(value)) == NULL) result = ERROR; } temp_host->have_icon_image = TRUE; } else if(!strcmp(variable, "icon_image_alt")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_host->icon_image_alt = (char *)strdup(value)) == NULL) result = ERROR; } temp_host->have_icon_image_alt = TRUE; } else if(!strcmp(variable, "vrml_image")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_host->vrml_image = (char *)strdup(value)) == NULL) result = ERROR; } temp_host->have_vrml_image = TRUE; } else if(!strcmp(variable, "gd2_image") || !strcmp(variable, "statusmap_image")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_host->statusmap_image = (char *)strdup(value)) == NULL) result = ERROR; } temp_host->have_statusmap_image = TRUE; } else if(!strcmp(variable, "initial_state")) { if(!strcmp(value, "o") || !strcmp(value, "up")) temp_host->initial_state = 0; /* HOST_UP */ else if(!strcmp(value, "d") || !strcmp(value, "down")) temp_host->initial_state = 1; /* HOST_DOWN */ else if(!strcmp(value, "u") || !strcmp(value, "unreachable")) temp_host->initial_state = 2; /* HOST_UNREACHABLE */ else { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Invalid initial state '%s' in host definition.\n", value); result = ERROR; } temp_host->have_initial_state = TRUE; } else if(!strcmp(variable, "check_interval") || !strcmp(variable, "normal_check_interval")) { if(!strcmp(variable, "normal_check_interval")) logit(NSLOG_CONFIG_WARNING, TRUE, "WARNING: The normal_check_interval attribute is deprecated and will be removed in future versions. Please use check_interval instead.\n"); temp_host->check_interval = strtod(value, NULL); temp_host->have_check_interval = TRUE; } else if(!strcmp(variable, "retry_interval") || !strcmp(variable, "retry_check_interval")) { if(!strcmp(variable, "retry_check_interval")) logit(NSLOG_CONFIG_WARNING, TRUE, "WARNING: The retry_check_interval attribute is deprecated and will be removed in future versions. Please use retry_interval instead.\n"); temp_host->retry_interval = strtod(value, NULL); temp_host->have_retry_interval = TRUE; } else if(!strcmp(variable, "importance") || !strcmp(variable, "hourly_value")) { if(!strcmp(variable, "hourly_value")) { logit(NSLOG_CONFIG_WARNING, TRUE, "WARNING: The hourly_value attribute is deprecated and will be removed in future versions. Please use importance instead.\n"); } temp_host->hourly_value = (unsigned int)strtoul(value, NULL, 10); temp_host->have_hourly_value = 1; } else if(!strcmp(variable, "max_check_attempts")) { temp_host->max_check_attempts = atoi(value); temp_host->have_max_check_attempts = TRUE; } else if(!strcmp(variable, "checks_enabled") || !strcmp(variable, "active_checks_enabled")) { temp_host->active_checks_enabled = (atoi(value) > 0) ? TRUE : FALSE; temp_host->have_active_checks_enabled = TRUE; } else if(!strcmp(variable, "passive_checks_enabled")) { temp_host->passive_checks_enabled = (atoi(value) > 0) ? TRUE : FALSE; temp_host->have_passive_checks_enabled = TRUE; } else if(!strcmp(variable, "event_handler_enabled")) { temp_host->event_handler_enabled = (atoi(value) > 0) ? TRUE : FALSE; temp_host->have_event_handler_enabled = TRUE; } else if(!strcmp(variable, "check_freshness")) { temp_host->check_freshness = (atoi(value) > 0) ? TRUE : FALSE; temp_host->have_check_freshness = TRUE; } else if(!strcmp(variable, "freshness_threshold")) { temp_host->freshness_threshold = atoi(value); temp_host->have_freshness_threshold = TRUE; } else if(!strcmp(variable, "low_flap_threshold")) { temp_host->low_flap_threshold = strtod(value, NULL); temp_host->have_low_flap_threshold = TRUE; } else if(!strcmp(variable, "high_flap_threshold")) { temp_host->high_flap_threshold = strtod(value, NULL); temp_host->have_high_flap_threshold = TRUE; } else if(!strcmp(variable, "flap_detection_enabled")) { temp_host->flap_detection_enabled = (atoi(value) > 0) ? TRUE : FALSE; temp_host->have_flap_detection_enabled = TRUE; } else if(!strcmp(variable, "flap_detection_options")) { /* user is specifying something, so discard defaults... */ temp_host->flap_detection_options = OPT_NOTHING; for(temp_ptr = strtok(value, ", "); temp_ptr; temp_ptr = strtok(NULL, ", ")) { if(!strcmp(temp_ptr, "o") || !strcmp(temp_ptr, "up")) flag_set(temp_host->flap_detection_options, OPT_UP); else if(!strcmp(temp_ptr, "d") || !strcmp(temp_ptr, "down")) flag_set(temp_host->flap_detection_options, OPT_DOWN); else if(!strcmp(temp_ptr, "u") || !strcmp(temp_ptr, "unreachable")) flag_set(temp_host->flap_detection_options, OPT_UNREACHABLE); else if(!strcmp(temp_ptr, "n") || !strcmp(temp_ptr, "none")) { temp_host->flap_detection_options = OPT_NOTHING; } else if(!strcmp(temp_ptr, "a") || !strcmp(temp_ptr, "all")) { temp_host->flap_detection_options = OPT_ALL; } else { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Invalid flap detection option '%s' in host definition.\n", temp_ptr); result = ERROR; } } temp_host->have_flap_detection_options = TRUE; } else if(!strcmp(variable, "notification_options")) { for(temp_ptr = strtok(value, ", "); temp_ptr; temp_ptr = strtok(NULL, ", ")) { if(!strcmp(temp_ptr, "d") || !strcmp(temp_ptr, "down")) flag_set(temp_host->notification_options, OPT_DOWN); else if(!strcmp(temp_ptr, "u") || !strcmp(temp_ptr, "unreachable")) flag_set(temp_host->notification_options, OPT_UNREACHABLE); else if(!strcmp(temp_ptr, "r") || !strcmp(temp_ptr, "recovery")) flag_set(temp_host->notification_options, OPT_RECOVERY); else if(!strcmp(temp_ptr, "f") || !strcmp(temp_ptr, "flapping")) flag_set(temp_host->notification_options, OPT_FLAPPING); else if(!strcmp(temp_ptr, "s") || !strcmp(temp_ptr, "downtime")) flag_set(temp_host->notification_options, OPT_DOWNTIME); else if(!strcmp(temp_ptr, "n") || !strcmp(temp_ptr, "none")) { temp_host->notification_options = OPT_NOTHING; } else if(!strcmp(temp_ptr, "a") || !strcmp(temp_ptr, "all")) { temp_host->notification_options = OPT_ALL; } else { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Invalid notification option '%s' in host definition.\n", temp_ptr); result = ERROR; } } temp_host->have_notification_options = TRUE; } else if(!strcmp(variable, "notifications_enabled")) { temp_host->notifications_enabled = (atoi(value) > 0) ? TRUE : FALSE; temp_host->have_notifications_enabled = TRUE; } else if(!strcmp(variable, "notification_interval")) { temp_host->notification_interval = strtod(value, NULL); temp_host->have_notification_interval = TRUE; } else if(!strcmp(variable, "first_notification_delay")) { temp_host->first_notification_delay = strtod(value, NULL); temp_host->have_first_notification_delay = TRUE; } else if(!strcmp(variable, "stalking_options")) { for(temp_ptr = strtok(value, ", "); temp_ptr; temp_ptr = strtok(NULL, ", ")) { if(!strcmp(temp_ptr, "o") || !strcmp(temp_ptr, "up")) flag_set(temp_host->stalking_options, OPT_UP); else if(!strcmp(temp_ptr, "d") || !strcmp(temp_ptr, "down")) flag_set(temp_host->stalking_options, OPT_DOWN); else if(!strcmp(temp_ptr, "u") || !strcmp(temp_ptr, "unreachable")) flag_set(temp_host->stalking_options, OPT_UNREACHABLE); else if(!strcmp(temp_ptr, "n") || !strcmp(temp_ptr, "none")) { temp_host->stalking_options = OPT_NOTHING; } else if(!strcmp(temp_ptr, "a") || !strcmp(temp_ptr, "all")) { temp_host->stalking_options = OPT_ALL; } else { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Invalid stalking option '%s' in host definition.\n", temp_ptr); result = ERROR; } } temp_host->have_stalking_options = TRUE; } else if(!strcmp(variable, "process_perf_data")) { temp_host->process_perf_data = (atoi(value) > 0) ? TRUE : FALSE; temp_host->have_process_perf_data = TRUE; } else if(!strcmp(variable, "failure_prediction_enabled")) { xodtemplate_obsoleted(variable, temp_host->_start_line); } else if(!strcmp(variable, "2d_coords")) { if((temp_ptr = strtok(value, ", ")) == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Invalid 2d_coords value '%s' in host definition.\n", temp_ptr); return ERROR; } temp_host->x_2d = atoi(temp_ptr); if((temp_ptr = strtok(NULL, ", ")) == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Invalid 2d_coords value '%s' in host definition.\n", temp_ptr); return ERROR; } temp_host->y_2d = atoi(temp_ptr); temp_host->have_2d_coords = TRUE; } else if(!strcmp(variable, "3d_coords")) { if((temp_ptr = strtok(value, ", ")) == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Invalid 3d_coords value '%s' in host definition.\n", temp_ptr); return ERROR; } temp_host->x_3d = strtod(temp_ptr, NULL); if((temp_ptr = strtok(NULL, ", ")) == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Invalid 3d_coords value '%s' in host definition.\n", temp_ptr); return ERROR; } temp_host->y_3d = strtod(temp_ptr, NULL); if((temp_ptr = strtok(NULL, ", ")) == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Invalid 3d_coords value '%s' in host definition.\n", temp_ptr); return ERROR; } temp_host->z_3d = strtod(temp_ptr, NULL); temp_host->have_3d_coords = TRUE; } else if(!strcmp(variable, "obsess_over_host") || !strcmp(variable, "obsess")) { temp_host->obsess = (atoi(value) > 0) ? TRUE : FALSE; temp_host->have_obsess = TRUE; } else if(!strcmp(variable, "retain_status_information")) { temp_host->retain_status_information = (atoi(value) > 0) ? TRUE : FALSE; temp_host->have_retain_status_information = TRUE; } else if(!strcmp(variable, "retain_nonstatus_information")) { temp_host->retain_nonstatus_information = (atoi(value) > 0) ? TRUE : FALSE; temp_host->have_retain_nonstatus_information = TRUE; } else if(!strcmp(variable, "register")) temp_host->register_object = (atoi(value) > 0) ? TRUE : FALSE; else if(variable[0] == '_') { /* get the variable name */ customvarname = (char *)strdup(variable + 1); /* make sure we have a variable name */ if(customvarname == NULL || !strcmp(customvarname, "")) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Null custom variable name.\n"); my_free(customvarname); return ERROR; } /* get the variable value */ customvarvalue = NULL; if(*value && strcmp(value, XODTEMPLATE_NULL)) customvarvalue = (char *)strdup(value); /* add the custom variable */ if(xodtemplate_add_custom_variable_to_host(temp_host, customvarname, customvarvalue) == NULL) { my_free(customvarname); my_free(customvarvalue); return ERROR; } /* free memory */ my_free(customvarname); my_free(customvarvalue); } else { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Invalid host object directive '%s'.\n", variable); return ERROR; } break; case XODTEMPLATE_SERVICE: temp_service = (xodtemplate_service *)xodtemplate_current_object; if(!strcmp(variable, "use")) { if((temp_service->template = (char *)strdup(value)) == NULL) result = ERROR; } else if(!strcmp(variable, "name")) { if((temp_service->name = (char *)strdup(value)) == NULL) result = ERROR; if(result == OK) { /* add service to template skiplist for fast searches */ result = skiplist_insert(xobject_template_skiplists[SERVICE_SKIPLIST], (void *)temp_service); switch(result) { case SKIPLIST_ERROR_DUPLICATE: logit(NSLOG_CONFIG_WARNING, TRUE, "Warning: Duplicate definition found for service '%s' (config file '%s', starting on line %d)\n", value, xodtemplate_config_file_name(temp_service->_config_file), temp_service->_start_line); result = ERROR; break; case SKIPLIST_OK: result = OK; break; default: result = ERROR; break; } } } else if(!strcmp(variable, "host") || !strcmp(variable, "hosts") || !strcmp(variable, "host_name")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_service->host_name = (char *)strdup(value)) == NULL) result = ERROR; } temp_service->have_host_name = TRUE; /* NOTE: services are added to the skiplist in xodtemplate_duplicate_services(), except if daemon is using precached config */ if(result == OK && force_skiplists == TRUE && temp_service->host_name != NULL && temp_service->service_description != NULL) { /* add service to template skiplist for fast searches */ result = skiplist_insert(xobject_skiplists[SERVICE_SKIPLIST], (void *)temp_service); switch(result) { case SKIPLIST_ERROR_DUPLICATE: logit(NSLOG_CONFIG_WARNING, TRUE, "Warning: Duplicate definition found for service '%s' (config file '%s', starting on line %d)\n", value, xodtemplate_config_file_name(temp_service->_config_file), temp_service->_start_line); result = ERROR; break; case SKIPLIST_OK: result = OK; temp_service->id = xodcount.services++; break; default: result = ERROR; break; } } } else if(!strcmp(variable, "service_description") || !strcmp(variable, "description")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_service->service_description = (char *)strdup(value)) == NULL) result = ERROR; } temp_service->have_service_description = TRUE; /* NOTE: services are added to the skiplist in xodtemplate_duplicate_services(), except if daemon is using precached config */ if(result == OK && force_skiplists == TRUE && temp_service->host_name != NULL && temp_service->service_description != NULL) { /* add service to template skiplist for fast searches */ result = skiplist_insert(xobject_skiplists[SERVICE_SKIPLIST], (void *)temp_service); switch(result) { case SKIPLIST_ERROR_DUPLICATE: logit(NSLOG_CONFIG_WARNING, TRUE, "Warning: Duplicate definition found for service '%s' (config file '%s', starting on line %d)\n", value, xodtemplate_config_file_name(temp_service->_config_file), temp_service->_start_line); result = ERROR; break; case SKIPLIST_OK: result = OK; temp_service->id = xodcount.services++; break; default: result = ERROR; break; } } } else if(!strcmp(variable, "display_name")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_service->display_name = (char *)strdup(value)) == NULL) result = ERROR; } temp_service->have_display_name = TRUE; } else if(!strcmp(variable, "parents")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_service->parents = (char *)strdup(value)) == NULL) result = ERROR; } temp_service->have_parents = TRUE; } else if(!strcmp(variable, "hostgroup") || !strcmp(variable, "hostgroups") || !strcmp(variable, "hostgroup_name")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_service->hostgroup_name = (char *)strdup(value)) == NULL) result = ERROR; } temp_service->have_hostgroup_name = TRUE; } else if(!strcmp(variable, "service_groups") || !strcmp(variable, "servicegroups")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_service->service_groups = (char *)strdup(value)) == NULL) result = ERROR; } temp_service->have_service_groups = TRUE; } else if(!strcmp(variable, "check_command")) { if(strcmp(value, XODTEMPLATE_NULL)) { if(value[0] == '!') { temp_service->have_important_check_command = TRUE; temp_ptr = value + 1; } else temp_ptr = value; if((temp_service->check_command = (char *)strdup(temp_ptr)) == NULL) result = ERROR; } temp_service->have_check_command = TRUE; } else if(!strcmp(variable, "check_period")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_service->check_period = (char *)strdup(value)) == NULL) result = ERROR; } temp_service->have_check_period = TRUE; } else if(!strcmp(variable, "event_handler")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_service->event_handler = (char *)strdup(value)) == NULL) result = ERROR; } temp_service->have_event_handler = TRUE; } else if(!strcmp(variable, "notification_period")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_service->notification_period = (char *)strdup(value)) == NULL) result = ERROR; } temp_service->have_notification_period = TRUE; } else if(!strcmp(variable, "contact_groups")) { if (*value == '\0') { logit(NSLOG_CONFIG_WARNING, TRUE, "Error: Empty value for contact_groups (config file '%s', starting on line %d)\n", xodtemplate_config_file_name(temp_service->_config_file), temp_service->_start_line); result = ERROR; break; } if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_service->contact_groups = (char *)strdup(value)) == NULL) result = ERROR; } temp_service->have_contact_groups = TRUE; } else if(!strcmp(variable, "contacts")) { if (*value == '\0') { logit(NSLOG_CONFIG_WARNING, TRUE, "Error: Empty value for contacts (config file '%s', starting on line %d)\n", xodtemplate_config_file_name(temp_service->_config_file), temp_service->_start_line); result = ERROR; break; } if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_service->contacts = (char *)strdup(value)) == NULL) result = ERROR; } temp_service->have_contacts = TRUE; } else if(!strcmp(variable, "failure_prediction_options")) { xodtemplate_obsoleted(variable, temp_service->_start_line); } else if(!strcmp(variable, "notes")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_service->notes = (char *)strdup(value)) == NULL) result = ERROR; } temp_service->have_notes = TRUE; } else if(!strcmp(variable, "notes_url")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_service->notes_url = (char *)strdup(value)) == NULL) result = ERROR; } temp_service->have_notes_url = TRUE; } else if(!strcmp(variable, "action_url")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_service->action_url = (char *)strdup(value)) == NULL) result = ERROR; } temp_service->have_action_url = TRUE; } else if(!strcmp(variable, "icon_image")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_service->icon_image = (char *)strdup(value)) == NULL) result = ERROR; } temp_service->have_icon_image = TRUE; } else if(!strcmp(variable, "icon_image_alt")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_service->icon_image_alt = (char *)strdup(value)) == NULL) result = ERROR; } temp_service->have_icon_image_alt = TRUE; } else if(!strcmp(variable, "initial_state")) { if(!strcmp(value, "o") || !strcmp(value, "ok")) temp_service->initial_state = STATE_OK; else if(!strcmp(value, "w") || !strcmp(value, "warning")) temp_service->initial_state = STATE_WARNING; else if(!strcmp(value, "u") || !strcmp(value, "unknown")) temp_service->initial_state = STATE_UNKNOWN; else if(!strcmp(value, "c") || !strcmp(value, "critical")) temp_service->initial_state = STATE_CRITICAL; else { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Invalid initial state '%s' in service definition.\n", value); result = ERROR; } temp_service->have_initial_state = TRUE; } else if(!strcmp(variable, "importance") || !strcmp(variable, "hourly_value")) { if(!strcmp(variable, "hourly_value")) { logit(NSLOG_CONFIG_WARNING, TRUE, "WARNING: The hourly_value attribute is deprecated and will be removed in future versions. Please use importance instead.\n"); } temp_service->hourly_value = (unsigned int)strtoul(value, NULL, 10); temp_service->have_hourly_value = 1; } else if(!strcmp(variable, "max_check_attempts")) { temp_service->max_check_attempts = atoi(value); temp_service->have_max_check_attempts = TRUE; } else if(!strcmp(variable, "check_interval") || !strcmp(variable, "normal_check_interval")) { if(!strcmp(variable, "normal_check_interval")) logit(NSLOG_CONFIG_WARNING, TRUE, "WARNING: The normal_check_interval attribute is deprecated and will be removed in future versions. Please use check_interval instead.\n"); temp_service->check_interval = strtod(value, NULL); temp_service->have_check_interval = TRUE; } else if(!strcmp(variable, "retry_interval") || !strcmp(variable, "retry_check_interval")) { if(!strcmp(variable, "retry_check_interval")) logit(NSLOG_CONFIG_WARNING, TRUE, "WARNING: The retry_check_interval attribute is deprecated and will be removed in future versions. Please use retry_interval instead.\n"); temp_service->retry_interval = strtod(value, NULL); temp_service->have_retry_interval = TRUE; } else if(!strcmp(variable, "active_checks_enabled")) { temp_service->active_checks_enabled = (atoi(value) > 0) ? TRUE : FALSE; temp_service->have_active_checks_enabled = TRUE; } else if(!strcmp(variable, "passive_checks_enabled")) { temp_service->passive_checks_enabled = (atoi(value) > 0) ? TRUE : FALSE; temp_service->have_passive_checks_enabled = TRUE; } else if(!strcmp(variable, "parallelize_check")) { temp_service->parallelize_check = atoi(value); temp_service->have_parallelize_check = TRUE; } else if(!strcmp(variable, "is_volatile")) { temp_service->is_volatile = (atoi(value) > 0) ? TRUE : FALSE; temp_service->have_is_volatile = TRUE; } else if(!strcmp(variable, "obsess_over_service") || !strcmp(variable, "obsess")) { temp_service->obsess = (atoi(value) > 0) ? TRUE : FALSE; temp_service->have_obsess = TRUE; } else if(!strcmp(variable, "event_handler_enabled")) { temp_service->event_handler_enabled = (atoi(value) > 0) ? TRUE : FALSE; temp_service->have_event_handler_enabled = TRUE; } else if(!strcmp(variable, "check_freshness")) { temp_service->check_freshness = (atoi(value) > 0) ? TRUE : FALSE; temp_service->have_check_freshness = TRUE; } else if(!strcmp(variable, "freshness_threshold")) { temp_service->freshness_threshold = atoi(value); temp_service->have_freshness_threshold = TRUE; } else if(!strcmp(variable, "low_flap_threshold")) { temp_service->low_flap_threshold = strtod(value, NULL); temp_service->have_low_flap_threshold = TRUE; } else if(!strcmp(variable, "high_flap_threshold")) { temp_service->high_flap_threshold = strtod(value, NULL); temp_service->have_high_flap_threshold = TRUE; } else if(!strcmp(variable, "flap_detection_enabled")) { temp_service->flap_detection_enabled = (atoi(value) > 0) ? TRUE : FALSE; temp_service->have_flap_detection_enabled = TRUE; } else if(!strcmp(variable, "flap_detection_options")) { /* user is specifying something, so discard defaults... */ temp_service->flap_detection_options = OPT_NOTHING; for(temp_ptr = strtok(value, ", "); temp_ptr; temp_ptr = strtok(NULL, ", ")) { if(!strcmp(temp_ptr, "o") || !strcmp(temp_ptr, "ok")) flag_set(temp_service->flap_detection_options, OPT_OK); else if(!strcmp(temp_ptr, "w") || !strcmp(temp_ptr, "warning")) flag_set(temp_service->flap_detection_options, OPT_WARNING); else if(!strcmp(temp_ptr, "u") || !strcmp(temp_ptr, "unknown")) flag_set(temp_service->flap_detection_options, OPT_UNKNOWN); else if(!strcmp(temp_ptr, "c") || !strcmp(temp_ptr, "critical")) flag_set(temp_service->flap_detection_options, OPT_CRITICAL); else if(!strcmp(temp_ptr, "n") || !strcmp(temp_ptr, "none")) { temp_service->flap_detection_options = OPT_NOTHING; } else if(!strcmp(temp_ptr, "a") || !strcmp(temp_ptr, "all")) { temp_service->flap_detection_options = OPT_ALL; } else { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Invalid flap detection option '%s' in service definition.\n", temp_ptr); return ERROR; } } temp_service->have_flap_detection_options = TRUE; } else if(!strcmp(variable, "notification_options")) { for(temp_ptr = strtok(value, ", "); temp_ptr; temp_ptr = strtok(NULL, ", ")) { if(!strcmp(temp_ptr, "u") || !strcmp(temp_ptr, "unknown")) flag_set(temp_service->notification_options, OPT_UNKNOWN); else if(!strcmp(temp_ptr, "w") || !strcmp(temp_ptr, "warning")) flag_set(temp_service->notification_options, OPT_WARNING); else if(!strcmp(temp_ptr, "c") || !strcmp(temp_ptr, "critical")) flag_set(temp_service->notification_options, OPT_CRITICAL); else if(!strcmp(temp_ptr, "r") || !strcmp(temp_ptr, "recovery")) flag_set(temp_service->notification_options, OPT_RECOVERY); else if(!strcmp(temp_ptr, "f") || !strcmp(temp_ptr, "flapping")) flag_set(temp_service->notification_options, OPT_FLAPPING); else if(!strcmp(temp_ptr, "s") || !strcmp(temp_ptr, "downtime")) flag_set(temp_service->notification_options, OPT_DOWNTIME); else if(!strcmp(temp_ptr, "n") || !strcmp(temp_ptr, "none")) { temp_service->notification_options = OPT_NOTHING; } else if(!strcmp(temp_ptr, "a") || !strcmp(temp_ptr, "all")) { temp_service->notification_options = OPT_ALL; } else { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Invalid notification option '%s' in service definition.\n", temp_ptr); return ERROR; } } temp_service->have_notification_options = TRUE; } else if(!strcmp(variable, "notifications_enabled")) { temp_service->notifications_enabled = (atoi(value) > 0) ? TRUE : FALSE; temp_service->have_notifications_enabled = TRUE; } else if(!strcmp(variable, "notification_interval")) { temp_service->notification_interval = strtod(value, NULL); temp_service->have_notification_interval = TRUE; } else if(!strcmp(variable, "first_notification_delay")) { temp_service->first_notification_delay = strtod(value, NULL); temp_service->have_first_notification_delay = TRUE; } else if(!strcmp(variable, "stalking_options")) { for(temp_ptr = strtok(value, ", "); temp_ptr; temp_ptr = strtok(NULL, ", ")) { if(!strcmp(temp_ptr, "o") || !strcmp(temp_ptr, "ok")) flag_set(temp_service->stalking_options, OPT_OK); else if(!strcmp(temp_ptr, "w") || !strcmp(temp_ptr, "warning")) flag_set(temp_service->stalking_options, OPT_WARNING); else if(!strcmp(temp_ptr, "u") || !strcmp(temp_ptr, "unknown")) flag_set(temp_service->stalking_options, OPT_UNKNOWN); else if(!strcmp(temp_ptr, "c") || !strcmp(temp_ptr, "critical")) flag_set(temp_service->stalking_options, OPT_CRITICAL); else if(!strcmp(temp_ptr, "n") || !strcmp(temp_ptr, "none")) { temp_service->stalking_options = OPT_NOTHING; } else if(!strcmp(temp_ptr, "a") || !strcmp(temp_ptr, "all")) { temp_service->stalking_options = OPT_ALL; } else { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Invalid stalking option '%s' in service definition.\n", temp_ptr); return ERROR; } } temp_service->have_stalking_options = TRUE; } else if(!strcmp(variable, "process_perf_data")) { temp_service->process_perf_data = (atoi(value) > 0) ? TRUE : FALSE; temp_service->have_process_perf_data = TRUE; } else if(!strcmp(variable, "failure_prediction_enabled")) { xodtemplate_obsoleted(variable, temp_service->_start_line); } else if(!strcmp(variable, "retain_status_information")) { temp_service->retain_status_information = (atoi(value) > 0) ? TRUE : FALSE; temp_service->have_retain_status_information = TRUE; } else if(!strcmp(variable, "retain_nonstatus_information")) { temp_service->retain_nonstatus_information = (atoi(value) > 0) ? TRUE : FALSE; temp_service->have_retain_nonstatus_information = TRUE; } else if(!strcmp(variable, "register")) temp_service->register_object = (atoi(value) > 0) ? TRUE : FALSE; else if(variable[0] == '_') { /* get the variable name */ customvarname = (char *)strdup(variable + 1); /* make sure we have a variable name */ if(customvarname == NULL || !strcmp(customvarname, "")) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Null custom variable name.\n"); my_free(customvarname); return ERROR; } /* get the variable value */ if(*value && strcmp(value, XODTEMPLATE_NULL)) customvarvalue = (char *)strdup(value); else customvarvalue = NULL; /* add the custom variable */ if(xodtemplate_add_custom_variable_to_service(temp_service, customvarname, customvarvalue) == NULL) { my_free(customvarname); my_free(customvarvalue); return ERROR; } /* free memory */ my_free(customvarname); my_free(customvarvalue); } else { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Invalid service object directive '%s'.\n", variable); return ERROR; } break; case XODTEMPLATE_HOSTDEPENDENCY: temp_hostdependency = (xodtemplate_hostdependency *)xodtemplate_current_object; if(!strcmp(variable, "use")) { if((temp_hostdependency->template = (char *)strdup(value)) == NULL) result = ERROR; } else if(!strcmp(variable, "name")) { if((temp_hostdependency->name = (char *)strdup(value)) == NULL) result = ERROR; if(result == OK) { /* add dependency to template skiplist for fast searches */ result = skiplist_insert(xobject_template_skiplists[HOSTDEPENDENCY_SKIPLIST], (void *)temp_hostdependency); switch(result) { case SKIPLIST_ERROR_DUPLICATE: logit(NSLOG_CONFIG_WARNING, TRUE, "Warning: Duplicate definition found for host dependency '%s' (config file '%s', starting on line %d)\n", value, xodtemplate_config_file_name(temp_hostdependency->_config_file), temp_hostdependency->_start_line); result = ERROR; break; case SKIPLIST_OK: result = OK; break; default: result = ERROR; break; } } } else if(!strcmp(variable, "hostgroup") || !strcmp(variable, "hostgroups") || !strcmp(variable, "hostgroup_name")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_hostdependency->hostgroup_name = (char *)strdup(value)) == NULL) result = ERROR; } temp_hostdependency->have_hostgroup_name = TRUE; } else if(!strcmp(variable, "host") || !strcmp(variable, "host_name") || !strcmp(variable, "master_host") || !strcmp(variable, "master_host_name")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_hostdependency->host_name = (char *)strdup(value)) == NULL) result = ERROR; } temp_hostdependency->have_host_name = TRUE; } else if(!strcmp(variable, "dependent_hostgroup") || !strcmp(variable, "dependent_hostgroups") || !strcmp(variable, "dependent_hostgroup_name")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_hostdependency->dependent_hostgroup_name = (char *)strdup(value)) == NULL) result = ERROR; } temp_hostdependency->have_dependent_hostgroup_name = TRUE; } else if(!strcmp(variable, "dependent_host") || !strcmp(variable, "dependent_host_name")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_hostdependency->dependent_host_name = (char *)strdup(value)) == NULL) result = ERROR; } temp_hostdependency->have_dependent_host_name = TRUE; } else if(!strcmp(variable, "dependency_period")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_hostdependency->dependency_period = (char *)strdup(value)) == NULL) result = ERROR; } temp_hostdependency->have_dependency_period = TRUE; } else if(!strcmp(variable, "inherits_parent")) { temp_hostdependency->inherits_parent = (atoi(value) > 0) ? TRUE : FALSE; temp_hostdependency->have_inherits_parent = TRUE; } else if(!strcmp(variable, "notification_failure_options") || !strcmp(variable, "notification_failure_criteria")) { temp_hostdependency->have_notification_failure_options = TRUE; for(temp_ptr = strtok(value, ", "); temp_ptr; temp_ptr = strtok(NULL, ", ")) { if(!strcmp(temp_ptr, "o") || !strcmp(temp_ptr, "up")) flag_set(temp_hostdependency->notification_failure_options, OPT_UP); else if(!strcmp(temp_ptr, "d") || !strcmp(temp_ptr, "down")) flag_set(temp_hostdependency->notification_failure_options, OPT_DOWN); else if(!strcmp(temp_ptr, "u") || !strcmp(temp_ptr, "unreachable")) flag_set(temp_hostdependency->notification_failure_options, OPT_UNREACHABLE); else if(!strcmp(temp_ptr, "p") || !strcmp(temp_ptr, "pending")) flag_set(temp_hostdependency->notification_failure_options, OPT_PENDING); else if(!strcmp(temp_ptr, "n") || !strcmp(temp_ptr, "none")) { temp_hostdependency->notification_failure_options = OPT_NOTHING; temp_hostdependency->have_notification_failure_options = FALSE; } else if(!strcmp(temp_ptr, "a") || !strcmp(temp_ptr, "all")) { temp_hostdependency->notification_failure_options = OPT_ALL; } else { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Invalid notification dependency option '%s' in hostdependency definition.\n", temp_ptr); return ERROR; } } } else if(!strcmp(variable, "execution_failure_options") || !strcmp(variable, "execution_failure_criteria")) { for(temp_ptr = strtok(value, ", "); temp_ptr; temp_ptr = strtok(NULL, ", ")) { if(!strcmp(temp_ptr, "o") || !strcmp(temp_ptr, "up")) flag_set(temp_hostdependency->execution_failure_options, OPT_UP); else if(!strcmp(temp_ptr, "d") || !strcmp(temp_ptr, "down")) flag_set(temp_hostdependency->execution_failure_options, OPT_DOWN); else if(!strcmp(temp_ptr, "u") || !strcmp(temp_ptr, "unreachable")) flag_set(temp_hostdependency->execution_failure_options, OPT_UNREACHABLE); else if(!strcmp(temp_ptr, "p") || !strcmp(temp_ptr, "pending")) flag_set(temp_hostdependency->execution_failure_options, OPT_PENDING); else if(!strcmp(temp_ptr, "n") || !strcmp(temp_ptr, "none")) { temp_hostdependency->execution_failure_options = OPT_NOTHING; } else if(!strcmp(temp_ptr, "a") || !strcmp(temp_ptr, "all")) { temp_hostdependency->execution_failure_options = OPT_ALL; } else { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Invalid execution dependency option '%s' in hostdependency definition.\n", temp_ptr); return ERROR; } } temp_hostdependency->have_execution_failure_options = TRUE; } else if(!strcmp(variable, "register")) temp_hostdependency->register_object = (atoi(value) > 0) ? TRUE : FALSE; else { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Invalid hostdependency object directive '%s'.\n", variable); return ERROR; } break; case XODTEMPLATE_HOSTESCALATION: temp_hostescalation = (xodtemplate_hostescalation *)xodtemplate_current_object; if(!strcmp(variable, "use")) { if((temp_hostescalation->template = (char *)strdup(value)) == NULL) result = ERROR; } else if(!strcmp(variable, "name")) { if((temp_hostescalation->name = (char *)strdup(value)) == NULL) result = ERROR; if(result == OK) { /* add escalation to template skiplist for fast searches */ result = skiplist_insert(xobject_template_skiplists[HOSTESCALATION_SKIPLIST], (void *)temp_hostescalation); switch(result) { case SKIPLIST_ERROR_DUPLICATE: logit(NSLOG_CONFIG_WARNING, TRUE, "Warning: Duplicate definition found for host escalation '%s' (config file '%s', starting on line %d)\n", value, xodtemplate_config_file_name(temp_hostescalation->_config_file), temp_hostescalation->_start_line); result = ERROR; break; case SKIPLIST_OK: result = OK; break; default: result = ERROR; break; } } } else if(!strcmp(variable, "hostgroup") || !strcmp(variable, "hostgroups") || !strcmp(variable, "hostgroup_name")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_hostescalation->hostgroup_name = (char *)strdup(value)) == NULL) result = ERROR; } temp_hostescalation->have_hostgroup_name = TRUE; } else if(!strcmp(variable, "host") || !strcmp(variable, "host_name")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_hostescalation->host_name = (char *)strdup(value)) == NULL) result = ERROR; } temp_hostescalation->have_host_name = TRUE; } else if(!strcmp(variable, "contact_groups")) { if (*value == '\0') { logit(NSLOG_CONFIG_WARNING, TRUE, "Error: Empty value for contact_groups (config file '%s', starting on line %d)\n", xodtemplate_config_file_name(temp_hostescalation->_config_file), temp_hostescalation->_start_line); result = ERROR; break; } if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_hostescalation->contact_groups = (char *)strdup(value)) == NULL) result = ERROR; } temp_hostescalation->have_contact_groups = TRUE; } else if(!strcmp(variable, "contacts")) { if (*value == '\0') { logit(NSLOG_CONFIG_WARNING, TRUE, "Error: Empty value for contacts (config file '%s', starting on line %d)\n", xodtemplate_config_file_name(temp_hostescalation->_config_file), temp_hostescalation->_start_line); result = ERROR; break; } if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_hostescalation->contacts = (char *)strdup(value)) == NULL) result = ERROR; } temp_hostescalation->have_contacts = TRUE; } else if(!strcmp(variable, "escalation_period")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_hostescalation->escalation_period = (char *)strdup(value)) == NULL) result = ERROR; } temp_hostescalation->have_escalation_period = TRUE; } else if(!strcmp(variable, "first_notification")) { temp_hostescalation->first_notification = atoi(value); temp_hostescalation->have_first_notification = TRUE; } else if(!strcmp(variable, "last_notification")) { temp_hostescalation->last_notification = atoi(value); temp_hostescalation->have_last_notification = TRUE; } else if(!strcmp(variable, "notification_interval")) { temp_hostescalation->notification_interval = strtod(value, NULL); temp_hostescalation->have_notification_interval = TRUE; } else if(!strcmp(variable, "escalation_options")) { for(temp_ptr = strtok(value, ", "); temp_ptr; temp_ptr = strtok(NULL, ", ")) { if(!strcmp(temp_ptr, "d") || !strcmp(temp_ptr, "down")) flag_set(temp_hostescalation->escalation_options, OPT_DOWN); else if(!strcmp(temp_ptr, "u") || !strcmp(temp_ptr, "unreachable")) flag_set(temp_hostescalation->escalation_options, OPT_UNREACHABLE); else if(!strcmp(temp_ptr, "r") || !strcmp(temp_ptr, "recovery")) flag_set(temp_hostescalation->escalation_options, OPT_RECOVERY); else if(!strcmp(temp_ptr, "n") || !strcmp(temp_ptr, "none")) { temp_hostescalation->escalation_options = OPT_NOTHING; } else if(!strcmp(temp_ptr, "a") || !strcmp(temp_ptr, "all")) { temp_hostescalation->escalation_options = OPT_ALL; } else { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Invalid escalation option '%s' in hostescalation definition.\n", temp_ptr); return ERROR; } } temp_hostescalation->have_escalation_options = TRUE; } else if(!strcmp(variable, "register")) temp_hostescalation->register_object = (atoi(value) > 0) ? TRUE : FALSE; else { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Invalid hostescalation object directive '%s'.\n", variable); return ERROR; } break; case XODTEMPLATE_HOSTEXTINFO: temp_hostextinfo = xodtemplate_hostextinfo_list; if(!strcmp(variable, "use")) { if((temp_hostextinfo->template = (char *)strdup(value)) == NULL) result = ERROR; } else if(!strcmp(variable, "name")) { if((temp_hostextinfo->name = (char *)strdup(value)) == NULL) result = ERROR; if(result == OK) { /* add to template skiplist for fast searches */ result = skiplist_insert(xobject_template_skiplists[HOSTEXTINFO_SKIPLIST], (void *)temp_hostextinfo); switch(result) { case SKIPLIST_ERROR_DUPLICATE: logit(NSLOG_CONFIG_WARNING, TRUE, "Warning: Duplicate definition found for extended host info '%s' (config file '%s', starting on line %d)\n", value, xodtemplate_config_file_name(temp_hostextinfo->_config_file), temp_hostextinfo->_start_line); result = ERROR; break; case SKIPLIST_OK: result = OK; break; default: result = ERROR; break; } } } else if(!strcmp(variable, "host_name")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_hostextinfo->host_name = (char *)strdup(value)) == NULL) result = ERROR; } temp_hostextinfo->have_host_name = TRUE; } else if(!strcmp(variable, "hostgroup") || !strcmp(variable, "hostgroup_name")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_hostextinfo->hostgroup_name = (char *)strdup(value)) == NULL) result = ERROR; } temp_hostextinfo->have_hostgroup_name = TRUE; } else if(!strcmp(variable, "notes")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_hostextinfo->notes = (char *)strdup(value)) == NULL) result = ERROR; } temp_hostextinfo->have_notes = TRUE; } else if(!strcmp(variable, "notes_url")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_hostextinfo->notes_url = (char *)strdup(value)) == NULL) result = ERROR; } temp_hostextinfo->have_notes_url = TRUE; } else if(!strcmp(variable, "action_url")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_hostextinfo->action_url = (char *)strdup(value)) == NULL) result = ERROR; } temp_hostextinfo->have_action_url = TRUE; } else if(!strcmp(variable, "icon_image")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_hostextinfo->icon_image = (char *)strdup(value)) == NULL) result = ERROR; } temp_hostextinfo->have_icon_image = TRUE; } else if(!strcmp(variable, "icon_image_alt")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_hostextinfo->icon_image_alt = (char *)strdup(value)) == NULL) result = ERROR; } temp_hostextinfo->have_icon_image_alt = TRUE; } else if(!strcmp(variable, "vrml_image")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_hostextinfo->vrml_image = (char *)strdup(value)) == NULL) result = ERROR; } temp_hostextinfo->have_vrml_image = TRUE; } else if(!strcmp(variable, "gd2_image") || !strcmp(variable, "statusmap_image")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_hostextinfo->statusmap_image = (char *)strdup(value)) == NULL) result = ERROR; } temp_hostextinfo->have_statusmap_image = TRUE; } else if(!strcmp(variable, "2d_coords")) { temp_ptr = strtok(value, ", "); if(temp_ptr == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Invalid 2d_coords value '%s' in extended host info definition.\n", temp_ptr); return ERROR; } temp_hostextinfo->x_2d = atoi(temp_ptr); temp_ptr = strtok(NULL, ", "); if(temp_ptr == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Invalid 2d_coords value '%s' in extended host info definition.\n", temp_ptr); return ERROR; } temp_hostextinfo->y_2d = atoi(temp_ptr); temp_hostextinfo->have_2d_coords = TRUE; } else if(!strcmp(variable, "3d_coords")) { temp_ptr = strtok(value, ", "); if(temp_ptr == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Invalid 3d_coords value '%s' in extended host info definition.\n", temp_ptr); return ERROR; } temp_hostextinfo->x_3d = strtod(temp_ptr, NULL); temp_ptr = strtok(NULL, ", "); if(temp_ptr == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Invalid 3d_coords value '%s' in extended host info definition.\n", temp_ptr); return ERROR; } temp_hostextinfo->y_3d = strtod(temp_ptr, NULL); temp_ptr = strtok(NULL, ", "); if(temp_ptr == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Invalid 3d_coords value '%s' in extended host info definition.\n", temp_ptr); return ERROR; } temp_hostextinfo->z_3d = strtod(temp_ptr, NULL); temp_hostextinfo->have_3d_coords = TRUE; } else if(!strcmp(variable, "register")) temp_hostextinfo->register_object = (atoi(value) > 0) ? TRUE : FALSE; else { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Invalid hostextinfo object directive '%s'.\n", variable); return ERROR; } break; case XODTEMPLATE_SERVICEEXTINFO: temp_serviceextinfo = xodtemplate_serviceextinfo_list; if(!strcmp(variable, "use")) { if((temp_serviceextinfo->template = (char *)strdup(value)) == NULL) result = ERROR; } else if(!strcmp(variable, "name")) { if((temp_serviceextinfo->name = (char *)strdup(value)) == NULL) result = ERROR; if(result == OK) { /* add to template skiplist for fast searches */ result = skiplist_insert(xobject_template_skiplists[SERVICEEXTINFO_SKIPLIST], (void *)temp_serviceextinfo); switch(result) { case SKIPLIST_ERROR_DUPLICATE: logit(NSLOG_CONFIG_WARNING, TRUE, "Warning: Duplicate definition found for extended service info '%s' (config file '%s', starting on line %d)\n", value, xodtemplate_config_file_name(temp_serviceextinfo->_config_file), temp_serviceextinfo->_start_line); result = ERROR; break; case SKIPLIST_OK: result = OK; break; default: result = ERROR; break; } } } else if(!strcmp(variable, "host_name")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_serviceextinfo->host_name = (char *)strdup(value)) == NULL) result = ERROR; } temp_serviceextinfo->have_host_name = TRUE; } else if(!strcmp(variable, "hostgroup") || !strcmp(variable, "hostgroup_name")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_serviceextinfo->hostgroup_name = (char *)strdup(value)) == NULL) result = ERROR; } temp_serviceextinfo->have_hostgroup_name = TRUE; } else if(!strcmp(variable, "service_description")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_serviceextinfo->service_description = (char *)strdup(value)) == NULL) result = ERROR; } temp_serviceextinfo->have_service_description = TRUE; } else if(!strcmp(variable, "notes")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_serviceextinfo->notes = (char *)strdup(value)) == NULL) result = ERROR; } temp_serviceextinfo->have_notes = TRUE; } else if(!strcmp(variable, "notes_url")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_serviceextinfo->notes_url = (char *)strdup(value)) == NULL) result = ERROR; } temp_serviceextinfo->have_notes_url = TRUE; } else if(!strcmp(variable, "action_url")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_serviceextinfo->action_url = (char *)strdup(value)) == NULL) result = ERROR; } temp_serviceextinfo->have_action_url = TRUE; } else if(!strcmp(variable, "icon_image")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_serviceextinfo->icon_image = (char *)strdup(value)) == NULL) result = ERROR; } temp_serviceextinfo->have_icon_image = TRUE; } else if(!strcmp(variable, "icon_image_alt")) { if(strcmp(value, XODTEMPLATE_NULL)) { if((temp_serviceextinfo->icon_image_alt = (char *)strdup(value)) == NULL) result = ERROR; } temp_serviceextinfo->have_icon_image_alt = TRUE; } else if(!strcmp(variable, "register")) temp_serviceextinfo->register_object = (atoi(value) > 0) ? TRUE : FALSE; else { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Invalid serviceextinfo object directive '%s'.\n", variable); return ERROR; } break; default: return ERROR; break; } return result; } #define xod_check_complete(otype) \ do { \ xodtemplate_##otype *o = (xodtemplate_##otype *)xodtemplate_current_object; \ if (o->register_object && !o->otype##_name && !o->name) { \ return ERROR; \ } \ } while(0) /* completes an object definition */ int xodtemplate_end_object_definition(int options) { int result = OK; switch(xodtemplate_current_object_type) { case XODTEMPLATE_HOSTESCALATION: xodcount.hostescalations += !!use_precached_objects; break; case XODTEMPLATE_SERVICEESCALATION: xodcount.serviceescalations += !!use_precached_objects; break; case XODTEMPLATE_TIMEPERIOD: xod_check_complete(timeperiod); break; case XODTEMPLATE_COMMAND: xod_check_complete(command); break; case XODTEMPLATE_CONTACT: xod_check_complete(contact); break; case XODTEMPLATE_CONTACTGROUP: xod_check_complete(contactgroup); break; case XODTEMPLATE_HOST: xod_check_complete(host); break; case XODTEMPLATE_HOSTGROUP: xod_check_complete(hostgroup); break; case XODTEMPLATE_SERVICEGROUP: xod_check_complete(servicegroup); break; } xodtemplate_current_object = NULL; xodtemplate_current_object_type = XODTEMPLATE_NONE; return result; } /* adds a custom variable to a host */ xodtemplate_customvariablesmember *xodtemplate_add_custom_variable_to_host(xodtemplate_host *hst, char *varname, char *varvalue) { return xodtemplate_add_custom_variable_to_object(&hst->custom_variables, varname, varvalue); } /* adds a custom variable to a service */ xodtemplate_customvariablesmember *xodtemplate_add_custom_variable_to_service(xodtemplate_service *svc, char *varname, char *varvalue) { return xodtemplate_add_custom_variable_to_object(&svc->custom_variables, varname, varvalue); } /* adds a custom variable to a contact */ xodtemplate_customvariablesmember *xodtemplate_add_custom_variable_to_contact(xodtemplate_contact *cntct, char *varname, char *varvalue) { return xodtemplate_add_custom_variable_to_object(&cntct->custom_variables, varname, varvalue); } /* adds a custom variable to an object */ xodtemplate_customvariablesmember *xodtemplate_add_custom_variable_to_object(xodtemplate_customvariablesmember **object_ptr, char *varname, char *varvalue) { xodtemplate_customvariablesmember *new_customvariablesmember = NULL; register int x = 0; /* make sure we have the data we need */ if(object_ptr == NULL) return NULL; if(varname == NULL || !strcmp(varname, "")) return NULL; /* allocate memory for a new member */ if((new_customvariablesmember = malloc(sizeof(xodtemplate_customvariablesmember))) == NULL) return NULL; if((new_customvariablesmember->variable_name = (char *)strdup(varname)) == NULL) { my_free(new_customvariablesmember); return NULL; } if(varvalue && *varvalue) { if((new_customvariablesmember->variable_value = (char *)strdup(varvalue)) == NULL) { my_free(new_customvariablesmember->variable_name); my_free(new_customvariablesmember); return NULL; } } else new_customvariablesmember->variable_value = NULL; /* convert varname to all uppercase (saves CPU time during macro functions) */ for(x = 0; new_customvariablesmember->variable_name[x] != '\x0'; x++) new_customvariablesmember->variable_name[x] = toupper(new_customvariablesmember->variable_name[x]); /* add the new member to the head of the member list */ new_customvariablesmember->next = *object_ptr; *object_ptr = new_customvariablesmember; return new_customvariablesmember; } /* parses a timeperiod directive... :-) */ int xodtemplate_parse_timeperiod_directive(xodtemplate_timeperiod *tperiod, char *var, char *val) { char *input = NULL; char temp_buffer[5][MAX_INPUT_BUFFER] = {"", "", "", "", ""}; int items = 0; int result = OK; int syear = 0; int smon = 0; int smday = 0; int swday = 0; int swday_offset = 0; int eyear = 0; int emon = 0; int emday = 0; int ewday = 0; int ewday_offset = 0; int skip_interval = 0; /* make sure we've got the reqs */ if(tperiod == NULL || var == NULL || val == NULL) return ERROR; /* we'll need the full (unsplit) input later */ if((input = (char *)malloc(strlen(var) + strlen(val) + 2)) == NULL) return ERROR; strcpy(input, var); strcat(input, " "); strcat(input, val); if(0) return OK; /* calendar dates */ else if((items = sscanf(input, "%4d-%2d-%2d - %4d-%2d-%2d / %d %[0-9:, -]", &syear, &smon, &smday, &eyear, &emon, &emday, &skip_interval, temp_buffer[0])) == 8) { /* add timerange exception */ if(xodtemplate_add_exception_to_timeperiod(tperiod, DATERANGE_CALENDAR_DATE, syear, smon - 1, smday, 0, 0, eyear, emon - 1, emday, 0, 0, skip_interval, temp_buffer[0]) == NULL) result = ERROR; } else if((items = sscanf(input, "%4d-%2d-%2d / %d %[0-9:, -]", &syear, &smon, &smday, &skip_interval, temp_buffer[0])) == 5) { eyear = syear; emon = smon; emday = smday; /* add timerange exception */ if(xodtemplate_add_exception_to_timeperiod(tperiod, DATERANGE_CALENDAR_DATE, syear, smon - 1, smday, 0, 0, eyear, emon - 1, emday, 0, 0, skip_interval, temp_buffer[0]) == NULL) result = ERROR; } else if((items = sscanf(input, "%4d-%2d-%2d - %4d-%2d-%2d %[0-9:, -]", &syear, &smon, &smday, &eyear, &emon, &emday, temp_buffer[0])) == 7) { /* add timerange exception */ if(xodtemplate_add_exception_to_timeperiod(tperiod, DATERANGE_CALENDAR_DATE, syear, smon - 1, smday, 0, 0, eyear, emon - 1, emday, 0, 0, 0, temp_buffer[0]) == NULL) result = ERROR; } else if((items = sscanf(input, "%4d-%2d-%2d %[0-9:, -]", &syear, &smon, &smday, temp_buffer[0])) == 4) { eyear = syear; emon = smon; emday = smday; /* add timerange exception */ if(xodtemplate_add_exception_to_timeperiod(tperiod, DATERANGE_CALENDAR_DATE, syear, smon - 1, smday, 0, 0, eyear, emon - 1, emday, 0, 0, 0, temp_buffer[0]) == NULL) result = ERROR; } /* other types... */ else if((items = sscanf(input, "%[a-z] %d %[a-z] - %[a-z] %d %[a-z] / %d %[0-9:, -]", temp_buffer[0], &swday_offset, temp_buffer[1], temp_buffer[2], &ewday_offset, temp_buffer[3], &skip_interval, temp_buffer[4])) == 8) { /* wednesday 1 january - thursday 2 july / 3 */ if((result = xodtemplate_get_weekday_from_string(temp_buffer[0], &swday)) == OK && (result = xodtemplate_get_month_from_string(temp_buffer[1], &smon)) == OK && (result = xodtemplate_get_weekday_from_string(temp_buffer[2], &ewday)) == OK && (result = xodtemplate_get_month_from_string(temp_buffer[3], &emon)) == OK) { /* add timeperiod exception */ if(xodtemplate_add_exception_to_timeperiod(tperiod, DATERANGE_MONTH_WEEK_DAY, 0, smon, 0, swday, swday_offset, 0, emon, 0, ewday, ewday_offset, skip_interval, temp_buffer[4]) == NULL) result = ERROR; } } else if((items = sscanf(input, "%[a-z] %d - %[a-z] %d / %d %[0-9:, -]", temp_buffer[0], &smday, temp_buffer[1], &emday, &skip_interval, temp_buffer[2])) == 6) { /* february 1 - march 15 / 3 */ /* monday 2 - thursday 3 / 2 */ /* day 4 - day 6 / 2 */ if((result = xodtemplate_get_weekday_from_string(temp_buffer[0], &swday)) == OK && (result = xodtemplate_get_weekday_from_string(temp_buffer[1], &ewday)) == OK) { /* monday 2 - thursday 3 / 2 */ swday_offset = smday; ewday_offset = emday; /* add timeperiod exception */ if(xodtemplate_add_exception_to_timeperiod(tperiod, DATERANGE_WEEK_DAY, 0, 0, 0, swday, swday_offset, 0, 0, 0, ewday, ewday_offset, skip_interval, temp_buffer[2]) == NULL) result = ERROR; } else if((result = xodtemplate_get_month_from_string(temp_buffer[0], &smon)) == OK && (result = xodtemplate_get_month_from_string(temp_buffer[1], &emon)) == OK) { /* february 1 - march 15 / 3 */ /* add timeperiod exception */ if(xodtemplate_add_exception_to_timeperiod(tperiod, DATERANGE_MONTH_DATE, 0, smon, smday, 0, 0, 0, emon, emday, 0, 0, skip_interval, temp_buffer[2]) == NULL) result = ERROR; } else if(!strcmp(temp_buffer[0], "day") && !strcmp(temp_buffer[1], "day")) { /* day 4 - 6 / 2 */ /* add timeperiod exception */ result = OK; if(xodtemplate_add_exception_to_timeperiod(tperiod, DATERANGE_MONTH_DAY, 0, 0, smday, 0, 0, 0, 0, emday, 0, 0, skip_interval, temp_buffer[2]) == NULL) result = ERROR; } } else if((items = sscanf(input, "%[a-z] %d - %d / %d %[0-9:, -]", temp_buffer[0], &smday, &emday, &skip_interval, temp_buffer[1])) == 5) { /* february 1 - 15 / 3 */ /* monday 2 - 3 / 2 */ /* day 1 - 25 / 4 */ if((result = xodtemplate_get_weekday_from_string(temp_buffer[0], &swday)) == OK) { /* thursday 2 - 4 */ swday_offset = smday; ewday = swday; ewday_offset = emday; /* add timeperiod exception */ if(xodtemplate_add_exception_to_timeperiod(tperiod, DATERANGE_WEEK_DAY, 0, 0, 0, swday, swday_offset, 0, 0, 0, ewday, ewday_offset, skip_interval, temp_buffer[1]) == NULL) result = ERROR; } else if((result = xodtemplate_get_month_from_string(temp_buffer[0], &smon)) == OK) { /* february 3 - 5 */ emon = smon; /* add timeperiod exception */ if(xodtemplate_add_exception_to_timeperiod(tperiod, DATERANGE_MONTH_DATE, 0, smon, smday, 0, 0, 0, emon, emday, 0, 0, skip_interval, temp_buffer[1]) == NULL) result = ERROR; } else if(!strcmp(temp_buffer[0], "day")) { /* day 1 - 4 */ /* add timeperiod exception */ result = OK; if(xodtemplate_add_exception_to_timeperiod(tperiod, DATERANGE_MONTH_DAY, 0, 0, smday, 0, 0, 0, 0, emday, 0, 0, skip_interval, temp_buffer[1]) == NULL) result = ERROR; } } else if((items = sscanf(input, "%[a-z] %d %[a-z] - %[a-z] %d %[a-z] %[0-9:, -]", temp_buffer[0], &swday_offset, temp_buffer[1], temp_buffer[2], &ewday_offset, temp_buffer[3], temp_buffer[4])) == 7) { /* wednesday 1 january - thursday 2 july */ if((result = xodtemplate_get_weekday_from_string(temp_buffer[0], &swday)) == OK && (result = xodtemplate_get_month_from_string(temp_buffer[1], &smon)) == OK && (result = xodtemplate_get_weekday_from_string(temp_buffer[2], &ewday)) == OK && (result = xodtemplate_get_month_from_string(temp_buffer[3], &emon)) == OK) { /* add timeperiod exception */ if(xodtemplate_add_exception_to_timeperiod(tperiod, DATERANGE_MONTH_WEEK_DAY, 0, smon, 0, swday, swday_offset, 0, emon, 0, ewday, ewday_offset, 0, temp_buffer[4]) == NULL) result = ERROR; } } else if((items = sscanf(input, "%[a-z] %d - %d %[0-9:, -]", temp_buffer[0], &smday, &emday, temp_buffer[1])) == 4) { /* february 3 - 5 */ /* thursday 2 - 4 */ /* day 1 - 4 */ if((result = xodtemplate_get_weekday_from_string(temp_buffer[0], &swday)) == OK) { /* thursday 2 - 4 */ swday_offset = smday; ewday = swday; ewday_offset = emday; /* add timeperiod exception */ if(xodtemplate_add_exception_to_timeperiod(tperiod, DATERANGE_WEEK_DAY, 0, 0, 0, swday, swday_offset, 0, 0, 0, ewday, ewday_offset, 0, temp_buffer[1]) == NULL) result = ERROR; } else if((result = xodtemplate_get_month_from_string(temp_buffer[0], &smon)) == OK) { /* february 3 - 5 */ emon = smon; /* add timeperiod exception */ if(xodtemplate_add_exception_to_timeperiod(tperiod, DATERANGE_MONTH_DATE, 0, smon, smday, 0, 0, 0, emon, emday, 0, 0, 0, temp_buffer[1]) == NULL) result = ERROR; } else if(!strcmp(temp_buffer[0], "day")) { /* day 1 - 4 */ /* add timeperiod exception */ result = OK; if(xodtemplate_add_exception_to_timeperiod(tperiod, DATERANGE_MONTH_DAY, 0, 0, smday, 0, 0, 0, 0, emday, 0, 0, 0, temp_buffer[1]) == NULL) result = ERROR; } } else if((items = sscanf(input, "%[a-z] %d - %[a-z] %d %[0-9:, -]", temp_buffer[0], &smday, temp_buffer[1], &emday, temp_buffer[2])) == 5) { /* february 1 - march 15 */ /* monday 2 - thursday 3 */ /* day 1 - day 5 */ if((result = xodtemplate_get_weekday_from_string(temp_buffer[0], &swday)) == OK && (result = xodtemplate_get_weekday_from_string(temp_buffer[1], &ewday)) == OK) { /* monday 2 - thursday 3 */ swday_offset = smday; ewday_offset = emday; /* add timeperiod exception */ if(xodtemplate_add_exception_to_timeperiod(tperiod, DATERANGE_WEEK_DAY, 0, 0, 0, swday, swday_offset, 0, 0, 0, ewday, ewday_offset, 0, temp_buffer[2]) == NULL) result = ERROR; } else if((result = xodtemplate_get_month_from_string(temp_buffer[0], &smon)) == OK && (result = xodtemplate_get_month_from_string(temp_buffer[1], &emon)) == OK) { /* february 1 - march 15 */ /* add timeperiod exception */ if(xodtemplate_add_exception_to_timeperiod(tperiod, DATERANGE_MONTH_DATE, 0, smon, smday, 0, 0, 0, emon, emday, 0, 0, 0, temp_buffer[2]) == NULL) result = ERROR; } else if(!strcmp(temp_buffer[0], "day") && !strcmp(temp_buffer[1], "day")) { /* day 1 - day 5 */ /* add timeperiod exception */ result = OK; if(xodtemplate_add_exception_to_timeperiod(tperiod, DATERANGE_MONTH_DAY, 0, 0, smday, 0, 0, 0, 0, emday, 0, 0, 0, temp_buffer[2]) == NULL) result = ERROR; } } else if((items = sscanf(input, "%[a-z] %d%*[ \t]%[0-9:, -]", temp_buffer[0], &smday, temp_buffer[1])) == 3) { /* february 3 */ /* thursday 2 */ /* day 1 */ if((result = xodtemplate_get_weekday_from_string(temp_buffer[0], &swday)) == OK) { /* thursday 2 */ swday_offset = smday; ewday = swday; ewday_offset = swday_offset; /* add timeperiod exception */ if(xodtemplate_add_exception_to_timeperiod(tperiod, DATERANGE_WEEK_DAY, 0, 0, 0, swday, swday_offset, 0, 0, 0, ewday, ewday_offset, 0, temp_buffer[1]) == NULL) result = ERROR; } else if((result = xodtemplate_get_month_from_string(temp_buffer[0], &smon)) == OK) { /* february 3 */ emon = smon; emday = smday; /* add timeperiod exception */ if(xodtemplate_add_exception_to_timeperiod(tperiod, DATERANGE_MONTH_DATE, 0, smon, smday, 0, 0, 0, emon, emday, 0, 0, 0, temp_buffer[1]) == NULL) result = ERROR; } else if(!strcmp(temp_buffer[0], "day")) { /* day 1 */ emday = smday; /* add timeperiod exception */ result = OK; if(xodtemplate_add_exception_to_timeperiod(tperiod, DATERANGE_MONTH_DAY, 0, 0, smday, 0, 0, 0, 0, emday, 0, 0, 0, temp_buffer[1]) == NULL) result = ERROR; } } else if((items = sscanf(input, "%[a-z] %d %[a-z] %[0-9:, -]", temp_buffer[0], &swday_offset, temp_buffer[1], temp_buffer[2])) == 4) { /* thursday 3 february */ if((result = xodtemplate_get_weekday_from_string(temp_buffer[0], &swday)) == OK && (result = xodtemplate_get_month_from_string(temp_buffer[1], &smon)) == OK) { emon = smon; ewday = swday; ewday_offset = swday_offset; /* add timeperiod exception */ if(xodtemplate_add_exception_to_timeperiod(tperiod, DATERANGE_MONTH_WEEK_DAY, 0, smon, 0, swday, swday_offset, 0, emon, 0, ewday, ewday_offset, 0, temp_buffer[2]) == NULL) result = ERROR; } } else if((items = sscanf(input, "%[a-z] %[0-9:, -]", temp_buffer[0], temp_buffer[1])) == 2) { /* monday */ if((result = xodtemplate_get_weekday_from_string(temp_buffer[0], &swday)) == OK) { /* add normal weekday timerange */ if((tperiod->timeranges[swday] = (char *)strdup(temp_buffer[1])) == NULL) result = ERROR; } } else result = ERROR; #ifdef NSCORE if(result == ERROR) { printf("Error: Could not parse timeperiod directive '%s'!\n", input); } #endif /* free memory */ my_free(input); return result; } /* add a new exception to a timeperiod */ xodtemplate_daterange *xodtemplate_add_exception_to_timeperiod(xodtemplate_timeperiod *period, int type, int syear, int smon, int smday, int swday, int swday_offset, int eyear, int emon, int emday, int ewday, int ewday_offset, int skip_interval, char *timeranges) { xodtemplate_daterange *new_daterange = NULL; /* make sure we have the data we need */ if(period == NULL || timeranges == NULL) return NULL; /* allocate memory for the date range range */ if((new_daterange = malloc(sizeof(xodtemplate_daterange))) == NULL) return NULL; new_daterange->next = NULL; new_daterange->type = type; new_daterange->syear = syear; new_daterange->smon = smon; new_daterange->smday = smday; new_daterange->swday = swday; new_daterange->swday_offset = swday_offset; new_daterange->eyear = eyear; new_daterange->emon = emon; new_daterange->emday = emday; new_daterange->ewday = ewday; new_daterange->ewday_offset = ewday_offset; new_daterange->skip_interval = skip_interval; new_daterange->timeranges = (char *)strdup(timeranges); /* add the new date range to the head of the range list for this exception type */ new_daterange->next = period->exceptions[type]; period->exceptions[type] = new_daterange; return new_daterange; } int xodtemplate_get_month_from_string(char *str, int *month) { const char *months[12] = {"january", "february", "march", "april", "may", "june", "july", "august", "september", "october", "november", "december"}; int x = 0; if(str == NULL || month == NULL) return ERROR; for(x = 0; x < 12; x++) { if(!strcmp(str, months[x])) { *month = x; return OK; } } return ERROR; } int xodtemplate_get_weekday_from_string(char *str, int *weekday) { const char *days[7] = {"sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday"}; int x = 0; if(str == NULL || weekday == NULL) return ERROR; for(x = 0; x < 7; x++) { if(!strcmp(str, days[x])) { *weekday = x; return OK; } } return ERROR; } /******************************************************************/ /***************** OBJECT DUPLICATION FUNCTIONS *******************/ /******************************************************************/ #ifdef NSCORE /* duplicates service definitions */ int xodtemplate_duplicate_services(void) { int result = OK; xodtemplate_service *temp_service = NULL; xodcount.services = 0; /****** DUPLICATE SERVICE DEFINITIONS WITH ONE OR MORE HOSTGROUP AND/OR HOST NAMES ******/ for(temp_service = xodtemplate_service_list; temp_service != NULL; temp_service = temp_service->next) { objectlist *hlist = NULL, *list = NULL, *glist = NULL, *next; xodtemplate_hostgroup fake_hg; /* clear for each round */ bitmap_clear(host_map); /* skip services that shouldn't be registered */ if(temp_service->register_object == FALSE) continue; /* bail out on service definitions without enough data */ if((temp_service->hostgroup_name == NULL && temp_service->host_name == NULL) || temp_service->service_description == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Service has no hosts and/or service_description (config file '%s', starting on line %d)\n", xodtemplate_config_file_name(temp_service->_config_file), temp_service->_start_line); return ERROR; } if(temp_service->hostgroup_name != NULL) { if(xodtemplate_expand_hostgroups(&glist, host_map, temp_service->hostgroup_name, temp_service->_config_file, temp_service->_start_line) == ERROR) { return ERROR; } /* no longer needed */ my_free(temp_service->hostgroup_name); /* empty result is only bad if allow_empty_hostgroup_assignment is off */ if(!glist && !bitmap_count_set_bits(host_map)) { if(!allow_empty_hostgroup_assignment) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not expand hostgroups and/or hosts specified in service (config file '%s', starting on line %d)\n", xodtemplate_config_file_name(temp_service->_config_file), temp_service->_start_line); return ERROR; } else if (allow_empty_hostgroup_assignment == 2) { logit(NSLOG_CONFIG_WARNING, TRUE, "Warning: Could not expand hostgroups and/or hosts specified in service (config file '%s', starting on line %d)\n", xodtemplate_config_file_name(temp_service->_config_file), temp_service->_start_line); } } } /* now find direct hosts */ if(temp_service->host_name) { if (xodtemplate_expand_hosts(&hlist, host_map, temp_service->host_name, temp_service->_config_file, temp_service->_start_line) != OK) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Failed to expand host list '%s' for service '%s' (%s:%d)\n", temp_service->host_name, temp_service->service_description, xodtemplate_config_file_name(temp_service->_config_file), temp_service->_start_line); return ERROR; } /* we don't need this anymore now that we have the hlist */ my_free(temp_service->host_name); } /* * host_map now contains all rejected hosts * group_map contains all rejected hostgroups * hlist contains all hosts we're directly assigned to. * glist contains all hostgroups we're assigned to. * We ignore hostgroups we're assigned to that are also rejected. * We do a dirty trick here and prepend a fake hostgroup * to the hostgroup list so we can use the same loop for * the rest of the code. */ fake_hg.hostgroup_name = "!!FAKE HOSTGROUP"; fake_hg.member_list = hlist; prepend_object_to_objectlist(&glist, &fake_hg); for(list = glist; list; list = next) { xodtemplate_hostgroup *hg = (xodtemplate_hostgroup *)list->object_ptr; next = list->next; free(list); /* we don't free this list */ for(hlist = hg->member_list; hlist; hlist = hlist->next) { xodtemplate_host *h = (xodtemplate_host *)hlist->object_ptr; /* ignore this host if it's rejected */ if(bitmap_isset(host_map, h->id)) continue; /* * reject more copies of this host. This happens * if the service is assigned to multiple hostgroups * where the same host is part of more than one of * them */ bitmap_set(host_map, h->id); /* if this is the last duplication, use the existing entry */ if(!next && !hlist->next) { temp_service->id = xodcount.services++; temp_service->host_name = h->host_name; } else { /* duplicate service definition */ result = xodtemplate_duplicate_service(temp_service, h->host_name, hg != &fake_hg); } } free_objectlist(&fake_hg.member_list); } } /***************************************/ /* SKIPLIST STUFF FOR FAST SORT/SEARCH */ /***************************************/ /* First loop for single host service definition*/ for(temp_service = xodtemplate_service_list; temp_service != NULL; temp_service = temp_service->next) { /* skip services that shouldn't be registered */ if(temp_service->register_object == FALSE) continue; /* skip service definitions without enough data */ if(temp_service->host_name == NULL || temp_service->service_description == NULL) continue; if(temp_service->is_from_hostgroup) { continue; } result = skiplist_insert(xobject_skiplists[SERVICE_SKIPLIST], (void *)temp_service); switch(result) { case SKIPLIST_ERROR_DUPLICATE: logit(NSLOG_CONFIG_WARNING, TRUE, "Warning: Duplicate definition found for service '%s' on host '%s' (config file '%s', starting on line %d)\n", temp_service->service_description, temp_service->host_name, xodtemplate_config_file_name(temp_service->_config_file), temp_service->_start_line); result = ERROR; break; case SKIPLIST_OK: result = OK; break; default: result = ERROR; break; } } /* second loop for host group service definition*/ /* add services to skiplist for fast searches */ for(temp_service = xodtemplate_service_list; temp_service != NULL; temp_service = temp_service->next) { /* skip services that shouldn't be registered */ if(temp_service->register_object == FALSE) continue; /* skip service definitions without enough data */ if(temp_service->host_name == NULL || temp_service->service_description == NULL) continue; if(!temp_service->is_from_hostgroup) { continue; } temp_service->is_from_hostgroup = 0; result = skiplist_insert(xobject_skiplists[SERVICE_SKIPLIST], (void *)temp_service); switch(result) { case SKIPLIST_ERROR_DUPLICATE: logit(NSLOG_CONFIG_WARNING, TRUE, "Warning: Duplicate definition found for service '%s' on host '%s' (config file '%s', starting on line %d)\n", temp_service->service_description, temp_service->host_name, xodtemplate_config_file_name(temp_service->_config_file), temp_service->_start_line); result = ERROR; break; case SKIPLIST_OK: result = OK; break; default: result = ERROR; break; } } return OK; } /** * Create an objectlist of services from whatever someone put into a * servicedescription. Rules go like this: * NOT servicegroup: * If we have host_name and service_description, we do a simple * lookup. * If we have host_name and/or hostgroup_name and service_description, * we do multiple lookups and concatenate the results. * If we have host_name/hostgroup_name and service_description, we do multiple * simple lookups and concatenate the results. */ static int xodtemplate_create_service_list(objectlist **ret, bitmap *reject_map, char *host_name, char *hostgroup_name, char *servicegroup_name, char *service_description, int _config_file, int _start_line) { objectlist *hlist = NULL, *hglist = NULL, *slist = NULL, *sglist = NULL; objectlist *glist, *gnext, *list, *next; /* iterators */ xodtemplate_hostgroup fake_hg; bitmap *in; /* * if we have a service_description, we need host_name * or host_group name */ if(service_description && !host_name && !hostgroup_name) return ERROR; /* * if we have host_name or a hostgroup_name we also need * service_description */ if((host_name || hostgroup_name) && !service_description) return ERROR; /* we'll need these */ bitmap_clear(host_map); if (!(in = bitmap_create(xodcount.services))) return ERROR; /* * all services in the accepted servicegroups can be added, except * if they're also in service_map, in which case they're also * in rejected servicegroups and must NOT be added */ if(servicegroup_name && xodtemplate_expand_servicegroups(&sglist, reject_map, servicegroup_name, _config_file, _start_line) != OK) return ERROR; for(glist = sglist; glist; glist = gnext) { xodtemplate_servicegroup *sg = (xodtemplate_servicegroup *)glist->object_ptr; gnext = glist->next; free(glist); /* free it as we go along */ for(list = sg->member_list; list; list = list->next) { xodtemplate_service *s = (xodtemplate_service *)list->object_ptr; /* rejected or already added */ if(bitmap_isset(in, s->id) || bitmap_isset(reject_map, s->id)) continue; bitmap_set(in, s->id); if(prepend_object_to_objectlist(ret, s) != OK) { free_objectlist(&gnext); return ERROR; } } } /* * get the lists we'll need, with reject markers included. * We have to get both hostlist and hostgroup list at once * to get the full reject markers. */ if(host_name && xodtemplate_expand_hosts(&hlist, host_map, host_name, _config_file, _start_line) != OK) return ERROR; if(hostgroup_name && xodtemplate_expand_hostgroups(&hglist, host_map, hostgroup_name, _config_file, _start_line) != OK) { free_objectlist(&hlist); return ERROR; } /* * if hlist isn't NULL, we add a fake hostgroup to the mix so we * can get away with a single loop, but we must always set its * memberlist so we can safely call free_objectlist() on it. */ fake_hg.member_list = hlist; if(hlist) { if(prepend_object_to_objectlist(&hglist, &fake_hg) != OK) { free_objectlist(&hlist); free_objectlist(&hglist); bitmap_destroy(in); return ERROR; } } for(glist = hglist; glist; glist = gnext) { xodtemplate_hostgroup *hg = (xodtemplate_hostgroup *)glist->object_ptr; gnext = glist->next; free(glist); for(hlist = hg->member_list; hlist; hlist = hlist->next) { xodtemplate_host *h = (xodtemplate_host *)hlist->object_ptr; if(bitmap_isset(host_map, h->id)) continue; /* expand services and add them all, unless they're rejected */ slist = NULL; if(xodtemplate_expand_services(&slist, reject_map, h->host_name, service_description, _config_file, _start_line) != OK) { free_objectlist(&gnext); bitmap_destroy(in); return ERROR; } for(list = slist; list; list = next) { xodtemplate_service *s = (xodtemplate_service *)list->object_ptr; next = list->next; free(list); if(bitmap_isset(in, s->id) || bitmap_isset(reject_map, s->id)) continue; bitmap_set(in, s->id); if(prepend_object_to_objectlist(ret, s) != OK) { free_objectlist(&next); free_objectlist(&gnext); free_objectlist(&fake_hg.member_list); bitmap_destroy(in); return ERROR; } } } } bitmap_destroy(in); free_objectlist(&fake_hg.member_list); return OK; } /* duplicates object definitions */ int xodtemplate_duplicate_objects(void) { int result = OK; xodtemplate_hostescalation *temp_hostescalation = NULL; xodtemplate_serviceescalation *temp_serviceescalation = NULL; xodtemplate_hostextinfo *next_he = NULL, *temp_hostextinfo = NULL; xodtemplate_serviceextinfo *next_se = NULL, *temp_serviceextinfo = NULL; objectlist *master_hostlist, *master_servicelist; objectlist *list, *next; /*************************************/ /* SERVICES ARE DUPLICATED ELSEWHERE */ /*************************************/ /* duplicate host escalations */ for(temp_hostescalation = xodtemplate_hostescalation_list; temp_hostescalation != NULL; temp_hostescalation = temp_hostescalation->next) { /* skip host escalation definitions without enough data */ if(temp_hostescalation->hostgroup_name == NULL && temp_hostescalation->host_name == NULL) continue; /* get list of hosts */ master_hostlist = xodtemplate_expand_hostgroups_and_hosts(temp_hostescalation->hostgroup_name, temp_hostescalation->host_name, temp_hostescalation->_config_file, temp_hostescalation->_start_line); if(master_hostlist == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not expand hostgroups and/or hosts specified in host escalation (config file '%s', starting on line %d)\n", xodtemplate_config_file_name(temp_hostescalation->_config_file), temp_hostescalation->_start_line); return ERROR; } /* add a copy of the hostescalation for every host in the hostgroup/host name list */ for(list = master_hostlist; list; list = next) { xodtemplate_host *h = (xodtemplate_host *)list->object_ptr; next = list->next; free(list); xodcount.hostescalations++; /* if this is the last duplication, use the existing entry */ if(!next) { my_free(temp_hostescalation->name); my_free(temp_hostescalation->template); my_free(temp_hostescalation->host_name); my_free(temp_hostescalation->hostgroup_name); temp_hostescalation->host_name = h->host_name; continue; } /* duplicate hostescalation definition */ result = xodtemplate_duplicate_hostescalation(temp_hostescalation, h->host_name); /* exit on error */ if(result == ERROR) { free_objectlist(&next); return ERROR; } } } timing_point("Created %u hostescalations (dupes possible)\n", xodcount.hostescalations); /* duplicate service escalations */ for(temp_serviceescalation = xodtemplate_serviceescalation_list; temp_serviceescalation != NULL; temp_serviceescalation = temp_serviceescalation->next) { /* skip serviceescalations without enough data */ if(temp_serviceescalation->servicegroup_name == NULL && temp_serviceescalation->service_description == NULL && (temp_serviceescalation->host_name == NULL || temp_serviceescalation->hostgroup_name == NULL)) continue; if(temp_serviceescalation->register_object == FALSE) continue; bitmap_clear(service_map); master_servicelist = NULL; /* get list of services */ if(xodtemplate_create_service_list(&master_servicelist, service_map, temp_serviceescalation->host_name, temp_serviceescalation->hostgroup_name, temp_serviceescalation->servicegroup_name, temp_serviceescalation->service_description, temp_serviceescalation->_config_file, temp_serviceescalation->_start_line) != OK) return ERROR; /* we won't need these anymore */ my_free(temp_serviceescalation->host_name); my_free(temp_serviceescalation->hostgroup_name); my_free(temp_serviceescalation->service_description); my_free(temp_serviceescalation->servicegroup_name); /* duplicate service escalation entries */ for(list = master_servicelist; list; list = next) { xodtemplate_service *s = (xodtemplate_service *)list->object_ptr; next = list->next; free(list); if(bitmap_isset(service_map, s->id)) continue; xodcount.serviceescalations++; /* if this is the last duplication, use the existing entry */ if(!next) { temp_serviceescalation->host_name = s->host_name; temp_serviceescalation->service_description = s->service_description; continue; } /* duplicate service escalation definition */ result = xodtemplate_duplicate_serviceescalation(temp_serviceescalation, s->host_name, s->service_description); /* exit on error */ if(result == ERROR) { free_objectlist(&next); return ERROR; } } } timing_point("Created %u serviceescalations (dupes possible)\n", xodcount.serviceescalations); /****** DUPLICATE HOSTEXTINFO DEFINITIONS WITH ONE OR MORE HOSTGROUP AND/OR HOST NAMES ******/ for(temp_hostextinfo = xodtemplate_hostextinfo_list; temp_hostextinfo != NULL; temp_hostextinfo = next_he) { next_he = temp_hostextinfo->next; /* skip definitions without enough data */ if(temp_hostextinfo->hostgroup_name == NULL && temp_hostextinfo->host_name == NULL) continue; /* get list of hosts */ master_hostlist = xodtemplate_expand_hostgroups_and_hosts(temp_hostextinfo->hostgroup_name, temp_hostextinfo->host_name, temp_hostextinfo->_config_file, temp_hostextinfo->_start_line); if(master_hostlist == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not expand hostgroups and/or hosts specified in extended host info (config file '%s', starting on line %d)\n", xodtemplate_config_file_name(temp_hostextinfo->_config_file), temp_hostextinfo->_start_line); return ERROR; } /* merge this extinfo with every host in the hostgroup/host name list */ for(list = master_hostlist; list; list = next) { xodtemplate_host *h = (xodtemplate_host *)list->object_ptr; next = list->next; free(list); /* merge it. we ignore errors here */ xodtemplate_merge_host_extinfo_object(h, temp_hostextinfo); } /* might as well kill it off early */ my_free(temp_hostextinfo->template); my_free(temp_hostextinfo->name); my_free(temp_hostextinfo->notes); my_free(temp_hostextinfo->host_name); my_free(temp_hostextinfo->hostgroup_name); my_free(temp_hostextinfo->notes_url); my_free(temp_hostextinfo->action_url); my_free(temp_hostextinfo->icon_image); my_free(temp_hostextinfo->vrml_image); my_free(temp_hostextinfo->statusmap_image); my_free(temp_hostextinfo); } timing_point("Done merging hostextinfo\n"); /****** DUPLICATE SERVICEEXTINFO DEFINITIONS WITH ONE OR MORE HOSTGROUP AND/OR HOST NAMES ******/ for(temp_serviceextinfo = xodtemplate_serviceextinfo_list; temp_serviceextinfo != NULL; temp_serviceextinfo = next_se) { next_se = temp_serviceextinfo->next; /* skip definitions without enough data */ if(temp_serviceextinfo->service_description == NULL || (temp_serviceextinfo->hostgroup_name == NULL && temp_serviceextinfo->host_name == NULL)) continue; bitmap_clear(service_map); master_servicelist = NULL; /* get list of services */ if(xodtemplate_create_service_list(&master_servicelist, service_map, temp_serviceextinfo->host_name, temp_serviceextinfo->hostgroup_name, NULL, temp_serviceextinfo->service_description, temp_serviceextinfo->_config_file, temp_serviceextinfo->_start_line) != OK) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not expand services specified in extended service info (config file '%s', starting on line %d)\n", xodtemplate_config_file_name(temp_serviceextinfo->_config_file), temp_serviceextinfo->_start_line); return ERROR; } /* merge this serviceextinfo with every service in the list */ for(list = master_servicelist; list; list = next) { xodtemplate_service *s = (xodtemplate_service *)list->object_ptr; next = list->next; free(list); if(bitmap_isset(service_map, s->id)) continue; xodtemplate_merge_service_extinfo_object(s, temp_serviceextinfo); } /* now we're done, so we might as well kill it off */ my_free(temp_serviceextinfo->template); my_free(temp_serviceextinfo->name); my_free(temp_serviceextinfo->host_name); my_free(temp_serviceextinfo->hostgroup_name); my_free(temp_serviceextinfo->service_description); my_free(temp_serviceextinfo->notes); my_free(temp_serviceextinfo->notes_url); my_free(temp_serviceextinfo->action_url); my_free(temp_serviceextinfo->icon_image); my_free(temp_serviceextinfo->icon_image_alt); my_free(temp_serviceextinfo); } timing_point("Done merging serviceextinfo\n"); return OK; } /* duplicates a service definition (with a new host name) */ int xodtemplate_duplicate_service(xodtemplate_service *temp_service, char *host_name, int from_hg) { xodtemplate_service *new_service = NULL; int error = FALSE; /* allocate zero'd out memory for a new service definition */ new_service = (xodtemplate_service *)calloc(1, sizeof(xodtemplate_service)); if(new_service == NULL) return ERROR; /* copy the entire thing and override what we have to */ memcpy(new_service, temp_service, sizeof(*new_service)); new_service->is_copy = TRUE; new_service->id = xodcount.services++; new_service->host_name = host_name; /* tag service apply on host group */ new_service->is_from_hostgroup = from_hg; /* allocate memory for and copy string members of service definition (host name provided, DO NOT duplicate hostgroup member!)*/ if(temp_service->service_groups != NULL && (new_service->service_groups = (char *)strdup(temp_service->service_groups)) == NULL) error = TRUE; if(temp_service->contact_groups != NULL && (new_service->contact_groups = (char *)strdup(temp_service->contact_groups)) == NULL) error = TRUE; if(temp_service->contacts != NULL && (new_service->contacts = (char *)strdup(temp_service->contacts)) == NULL) error = TRUE; if(error == TRUE) { my_free(new_service->service_groups); my_free(new_service->contact_groups); my_free(new_service->contacts); my_free(new_service); return ERROR; } /* add new service to head of list in memory */ new_service->next = xodtemplate_service_list; xodtemplate_service_list = new_service; return OK; } /* duplicates a host escalation definition (with a new host name) */ int xodtemplate_duplicate_hostescalation(xodtemplate_hostescalation *temp_hostescalation, char *host_name) { xodtemplate_hostescalation *new_hostescalation = NULL; int error = FALSE; /* allocate zero'd out memory for a new host escalation definition */ new_hostescalation = (xodtemplate_hostescalation *)calloc(1, sizeof(xodtemplate_hostescalation)); if(new_hostescalation == NULL) return ERROR; memcpy(new_hostescalation, temp_hostescalation, sizeof(*new_hostescalation)); new_hostescalation->is_copy = TRUE; new_hostescalation->host_name = host_name; if(temp_hostescalation->contact_groups != NULL && (new_hostescalation->contact_groups = (char *)strdup(temp_hostescalation->contact_groups)) == NULL) error = TRUE; if(temp_hostescalation->contacts != NULL && (new_hostescalation->contacts = (char *)strdup(temp_hostescalation->contacts)) == NULL) error = TRUE; if(error == TRUE) { my_free(new_hostescalation->contact_groups); my_free(new_hostescalation->contacts); my_free(new_hostescalation); return ERROR; } /* add new hostescalation to head of list in memory */ new_hostescalation->next = xodtemplate_hostescalation_list; xodtemplate_hostescalation_list = new_hostescalation; return OK; } /* duplicates a service escalation definition (with a new host name and/or service description) */ int xodtemplate_duplicate_serviceescalation(xodtemplate_serviceescalation *temp_serviceescalation, char *host_name, char *svc_description) { xodtemplate_serviceescalation *new_serviceescalation = NULL; int error = FALSE; /* allocate zero'd out memory for a new service escalation definition */ new_serviceescalation = (xodtemplate_serviceescalation *)calloc(1, sizeof(xodtemplate_serviceescalation)); if(new_serviceescalation == NULL) return ERROR; memcpy(new_serviceescalation, temp_serviceescalation, sizeof(*new_serviceescalation)); new_serviceescalation->is_copy = TRUE; new_serviceescalation->host_name = host_name; new_serviceescalation->service_description = svc_description; if(temp_serviceescalation->contact_groups != NULL && (new_serviceescalation->contact_groups = (char *)strdup(temp_serviceescalation->contact_groups)) == NULL) error = TRUE; if(temp_serviceescalation->contacts != NULL && (new_serviceescalation->contacts = (char *)strdup(temp_serviceescalation->contacts)) == NULL) error = TRUE; if(error == TRUE) { my_free(new_serviceescalation->contact_groups); my_free(new_serviceescalation->contacts); my_free(new_serviceescalation); return ERROR; } /* add new serviceescalation to head of list in memory */ new_serviceescalation->next = xodtemplate_serviceescalation_list; xodtemplate_serviceescalation_list = new_serviceescalation; return OK; } /******************************************************************/ /***************** OBJECT RESOLUTION FUNCTIONS ********************/ /******************************************************************/ /* inherit object properties */ /* some missing defaults (notification options, etc.) are also applied here */ int xodtemplate_inherit_object_properties(void) { xodtemplate_host *temp_host = NULL; xodtemplate_service *temp_service = NULL; xodtemplate_serviceescalation *temp_serviceescalation = NULL; xodtemplate_hostescalation *temp_hostescalation = NULL; /* fill in missing defaults for hosts... */ for(temp_host = xodtemplate_host_list; temp_host != NULL; temp_host = temp_host->next) { /* if notification options are missing, assume all */ if(temp_host->have_notification_options == FALSE) { temp_host->notification_options = OPT_ALL; temp_host->have_notification_options = TRUE; } } /* services inherit some properties from their associated host... */ for(temp_service = xodtemplate_service_list; temp_service != NULL; temp_service = temp_service->next) { /* find the host */ if((temp_host = xodtemplate_find_real_host(temp_service->host_name)) == NULL) continue; /* * if the service has no contacts specified, it will inherit * them from the host */ if(temp_service->have_contact_groups == FALSE && temp_service->have_contacts == FALSE) { xod_inherit_str(temp_service, temp_host, contact_groups); xod_inherit_str(temp_service, temp_host, contacts); } /* services inherit notification interval from host if not already specified */ xod_inherit(temp_service, temp_host, notification_interval); /* services inherit notification period from host if not already specified */ xod_inherit_str(temp_service, temp_host, notification_period); /* if notification options are missing, assume all */ if(temp_service->have_notification_options == FALSE) { temp_service->notification_options = OPT_ALL; temp_service->have_notification_options = TRUE; } } /* service escalations inherit some properties from their associated service... */ for(temp_serviceescalation = xodtemplate_serviceescalation_list; temp_serviceescalation != NULL; temp_serviceescalation = temp_serviceescalation->next) { /* find the service */ if((temp_service = xodtemplate_find_real_service(temp_serviceescalation->host_name, temp_serviceescalation->service_description)) == NULL) continue; /* SPECIAL RULE 10/04/07 - additive inheritance from service's contactgroup(s) */ if(temp_serviceescalation->contact_groups != NULL && temp_serviceescalation->contact_groups[0] == '+') xodtemplate_get_inherited_string(&temp_service->have_contact_groups, &temp_service->contact_groups, &temp_serviceescalation->have_contact_groups, &temp_serviceescalation->contact_groups); /* SPECIAL RULE 10/04/07 - additive inheritance from service's contact(s) */ if(temp_serviceescalation->contacts != NULL && temp_serviceescalation->contacts[0] == '+') xodtemplate_get_inherited_string(&temp_service->have_contacts, &temp_service->contacts, &temp_serviceescalation->have_contacts, &temp_serviceescalation->contacts); /* service escalations inherit contacts from service if none are specified */ if(temp_serviceescalation->have_contact_groups == FALSE && temp_serviceescalation->have_contacts == FALSE) { xod_inherit_str(temp_serviceescalation, temp_service, contact_groups); xod_inherit_str(temp_serviceescalation, temp_service, contacts); } /* service escalations inherit notification interval from service if not already defined */ xod_inherit(temp_serviceescalation, temp_service, notification_interval); /* service escalations inherit escalation period from service if not already defined */ if(temp_serviceescalation->have_escalation_period == FALSE && temp_service->have_notification_period == TRUE && temp_service->notification_period != NULL) { temp_serviceescalation->escalation_period = (char *)strdup(temp_service->notification_period); temp_serviceescalation->have_escalation_period = TRUE; } /* if escalation options are missing, assume all */ if(temp_serviceescalation->have_escalation_options == FALSE) { temp_serviceescalation->escalation_options = OPT_ALL; temp_serviceescalation->have_escalation_options = TRUE; } /* 03/05/08 clear additive string chars - not done in xodtemplate_clean_additive_strings() anymore */ xodtemplate_clean_additive_string(&temp_serviceescalation->contact_groups); xodtemplate_clean_additive_string(&temp_serviceescalation->contacts); } /* host escalations inherit some properties from their associated host... */ for(temp_hostescalation = xodtemplate_hostescalation_list; temp_hostescalation != NULL; temp_hostescalation = temp_hostescalation->next) { /* find the host */ if((temp_host = xodtemplate_find_real_host(temp_hostescalation->host_name)) == NULL) continue; /* SPECIAL RULE 10/04/07 - additive inheritance from host's contactgroup(s) */ if(temp_hostescalation->contact_groups != NULL && temp_hostescalation->contact_groups[0] == '+') xodtemplate_get_inherited_string(&temp_host->have_contact_groups, &temp_host->contact_groups, &temp_hostescalation->have_contact_groups, &temp_hostescalation->contact_groups); /* SPECIAL RULE 10/04/07 - additive inheritance from host's contact(s) */ if(temp_hostescalation->contacts != NULL && temp_hostescalation->contacts[0] == '+') xodtemplate_get_inherited_string(&temp_host->have_contacts, &temp_host->contacts, &temp_hostescalation->have_contacts, &temp_hostescalation->contacts); /* host escalations inherit contacts from host if none are specified */ if(temp_hostescalation->have_contact_groups == FALSE && temp_hostescalation->have_contacts == FALSE) { xod_inherit_str(temp_hostescalation, temp_host, contact_groups); xod_inherit_str(temp_hostescalation, temp_host, contacts); } /* host escalations inherit notification interval from host if not already defined */ xod_inherit(temp_hostescalation, temp_host, notification_interval); /* host escalations inherit escalation period from host if not already defined */ if(temp_hostescalation->have_escalation_period == FALSE && temp_host->have_notification_period == TRUE && temp_host->notification_period != NULL) { temp_hostescalation->escalation_period = (char *)strdup(temp_host->notification_period); temp_hostescalation->have_escalation_period = TRUE; } /* if escalation options are missing, assume all */ if(temp_hostescalation->have_escalation_options == FALSE) { temp_hostescalation->escalation_options = OPT_ALL; temp_hostescalation->have_escalation_options = TRUE; } /* 03/05/08 clear additive string chars - not done in xodtemplate_clean_additive_strings() anymore */ xodtemplate_clean_additive_string(&temp_hostescalation->contact_groups); xodtemplate_clean_additive_string(&temp_hostescalation->contacts); } return OK; } #endif /******************************************************************/ /***************** OBJECT RESOLUTION FUNCTIONS ********************/ /******************************************************************/ static int xodtemplate_register_and_destroy_hostescalation(void *he_) { xodtemplate_hostescalation *he = (xodtemplate_hostescalation *)he_; int result; result = xodtemplate_register_hostescalation(he); if(he->is_copy == FALSE) { my_free(he->escalation_period); } my_free(he->contact_groups); my_free(he->contacts); my_free(he); return result; } static int xodtemplate_register_and_destroy_serviceescalation(void *se_) { xodtemplate_serviceescalation *se = (xodtemplate_serviceescalation *)se_; int result; result = xodtemplate_register_serviceescalation(se); if(se->is_copy == FALSE) my_free(se->escalation_period); my_free(se->contact_groups); my_free(se->contacts); my_free(se); return result; } #ifndef NSCGI static int xodtemplate_register_and_destroy_hostdependency(void *hd_) { xodtemplate_hostdependency *temp_hostdependency = (xodtemplate_hostdependency *)hd_; objectlist *master_hostlist = NULL, *dependent_hostlist = NULL; objectlist *list, *next, *l2; /* skip host dependencies without enough data */ if(temp_hostdependency->hostgroup_name == NULL && temp_hostdependency->dependent_hostgroup_name == NULL && temp_hostdependency->host_name == NULL && temp_hostdependency->dependent_host_name == NULL) return OK; /* get list of master host names */ master_hostlist = xodtemplate_expand_hostgroups_and_hosts(temp_hostdependency->hostgroup_name, temp_hostdependency->host_name, temp_hostdependency->_config_file, temp_hostdependency->_start_line); if(master_hostlist == NULL && allow_empty_hostgroup_assignment==0) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not expand master hostgroups and/or hosts specified in host dependency (config file '%s', starting on line %d)\n", xodtemplate_config_file_name(temp_hostdependency->_config_file), temp_hostdependency->_start_line); return ERROR; } /* get list of dependent host names */ dependent_hostlist = xodtemplate_expand_hostgroups_and_hosts(temp_hostdependency->dependent_hostgroup_name, temp_hostdependency->dependent_host_name, temp_hostdependency->_config_file, temp_hostdependency->_start_line); if(dependent_hostlist == NULL && allow_empty_hostgroup_assignment==0) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not expand dependent hostgroups (%s) and/or hosts (%s) specified in host dependency (config file '%s', starting on line %d)\n", temp_hostdependency->dependent_hostgroup_name, temp_hostdependency->dependent_host_name, xodtemplate_config_file_name(temp_hostdependency->_config_file), temp_hostdependency->_start_line); free_objectlist(&master_hostlist); return ERROR; } my_free(temp_hostdependency->name); my_free(temp_hostdependency->template); my_free(temp_hostdependency->host_name); my_free(temp_hostdependency->hostgroup_name); my_free(temp_hostdependency->dependent_host_name); my_free(temp_hostdependency->dependent_hostgroup_name); /* duplicate the dependency definitions */ for(list = master_hostlist; list; list = next) { xodtemplate_host *master = (xodtemplate_host *)list->object_ptr; next = list->next; free(list); for(l2 = dependent_hostlist; l2; l2 = l2->next) { xodtemplate_host *child = (xodtemplate_host *)l2->object_ptr; temp_hostdependency->host_name = master->host_name; temp_hostdependency->dependent_host_name = child->host_name; if(xodtemplate_register_hostdependency(temp_hostdependency) != OK) { /* exit on error */ free_objectlist(&dependent_hostlist); free_objectlist(&next); return ERROR; } } } free_objectlist(&dependent_hostlist); my_free(temp_hostdependency->dependency_period); my_free(temp_hostdependency); return OK; } static int xodtemplate_register_and_destroy_servicedependency(void *sd_) { objectlist *parents = NULL, *plist, *pnext; objectlist *children = NULL, *clist; xodtemplate_servicedependency *temp_servicedependency = (xodtemplate_servicedependency *)sd_; int same_host = FALSE, children_first = FALSE, pret = OK, cret = OK; char *hname, *sdesc, *dhname, *dsdesc; hname = temp_servicedependency->host_name; sdesc = temp_servicedependency->service_description; dhname = temp_servicedependency->dependent_host_name; dsdesc = temp_servicedependency->dependent_service_description; my_free(temp_servicedependency->name); my_free(temp_servicedependency->template); /* skip templates, but free them first */ if(temp_servicedependency->register_object == 0) { my_free(temp_servicedependency->host_name); my_free(temp_servicedependency->service_description); my_free(temp_servicedependency->hostgroup_name); my_free(temp_servicedependency->dependent_host_name); my_free(temp_servicedependency->dependent_service_description); my_free(temp_servicedependency->dependent_hostgroup_name); return OK; } if(!temp_servicedependency->host_name && !temp_servicedependency->hostgroup_name && !temp_servicedependency->servicegroup_name) { /* * parent service is in exact. We must take children first * and build parent chain from same-host deps there */ children_first = TRUE; same_host = TRUE; } /* take care of same-host dependencies */ if(!temp_servicedependency->dependent_host_name && !temp_servicedependency->dependent_hostgroup_name) { if (!temp_servicedependency->dependent_servicegroup_name) { if (children_first || !temp_servicedependency->dependent_service_description) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Impossible service dependency definition\n (config file '%s', starting at line '%d')", xodtemplate_config_file_name(temp_servicedependency->_config_file), temp_servicedependency->_start_line); return ERROR; } same_host = TRUE; } } parents = children = NULL; bitmap_clear(parent_map); bitmap_clear(service_map); /* create the two object lists */ if(!children_first) { pret = xodtemplate_create_service_list(&parents, parent_map, temp_servicedependency->host_name, temp_servicedependency->hostgroup_name, temp_servicedependency->servicegroup_name, temp_servicedependency->service_description, temp_servicedependency->_config_file, temp_servicedependency->_start_line); if (!same_host) cret = xodtemplate_create_service_list(&children, service_map, temp_servicedependency->dependent_host_name, temp_servicedependency->dependent_hostgroup_name, temp_servicedependency->dependent_servicegroup_name, temp_servicedependency->dependent_service_description, temp_servicedependency->_config_file, temp_servicedependency->_start_line); } else { /* * NOTE: we flip the variables here to avoid duplicating * the entire loop down below */ cret = xodtemplate_create_service_list(&parents, parent_map, temp_servicedependency->dependent_host_name, temp_servicedependency->dependent_hostgroup_name, temp_servicedependency->dependent_servicegroup_name, temp_servicedependency->dependent_service_description, temp_servicedependency->_config_file, temp_servicedependency->_start_line); dsdesc = temp_servicedependency->service_description; sdesc = temp_servicedependency->dependent_service_description; } /* now log errors and bail out if we failed to get members */ if(pret != OK) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not expand master service(s) (config file '%s', starting at line %d)\n", xodtemplate_config_file_name(temp_servicedependency->_config_file), temp_servicedependency->_start_line); } if(cret != OK) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not expand dependent service(s) (at config file '%s', starting on line %d)\n", xodtemplate_config_file_name(temp_servicedependency->_config_file), temp_servicedependency->_start_line); } if(cret != OK || pret != OK) return ERROR; /* * every service in "children" depends on every service in * "parents", so just loop twice and create them all. */ for(plist = parents; plist; plist = pnext) { xodtemplate_service *p = (xodtemplate_service *)plist->object_ptr; pnext = plist->next; free(plist); /* free it as we go along */ if(bitmap_isset(parent_map, p->id)) continue; bitmap_set(parent_map, p->id); bitmap_clear(service_map); /* * if this is a same-host dependency, we must expand * dependent_service_description for the host we're * currently looking at */ if(same_host) { children = NULL; if(xodtemplate_expand_services(&children, service_map, p->host_name, dsdesc, temp_servicedependency->_config_file, temp_servicedependency->_start_line) != OK) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Failed to expand same-host servicedependency services (config file '%s', starting at line %d)\n", xodtemplate_config_file_name(temp_servicedependency->_config_file), temp_servicedependency->_start_line); return ERROR; } } for(clist = children; clist; clist = clist->next) { xodtemplate_service *c = (xodtemplate_service *)clist->object_ptr; if(bitmap_isset(service_map, c->id)) continue; bitmap_set(service_map, c->id); /* now register, but flip the states again if necessary */ if(children_first) { xodtemplate_service *tmp = p; p = c; c = tmp; } temp_servicedependency->host_name = p->host_name; temp_servicedependency->service_description = p->service_description; temp_servicedependency->dependent_host_name = c->host_name; temp_servicedependency->dependent_service_description = c->service_description; if(xodtemplate_register_servicedependency(temp_servicedependency) != OK) { logit(NSLOG_VERIFICATION_WARNING, TRUE, "Error: Failed to register servicedependency from '%s;%s' to '%s;%s' (config file '%s', starting at line %d)\n", p->host_name, p->service_description, c->host_name, c->service_description, xodtemplate_config_file_name(temp_servicedependency->_config_file), temp_servicedependency->_start_line); return ERROR; } } if(same_host == TRUE) free_objectlist(&children); } if(same_host == FALSE) free_objectlist(&children); my_free(hname); my_free(sdesc); my_free(dhname); my_free(dsdesc); my_free(temp_servicedependency->hostgroup_name); my_free(temp_servicedependency->servicegroup_name); my_free(temp_servicedependency->dependent_hostgroup_name); my_free(temp_servicedependency->dependent_servicegroup_name); my_free(temp_servicedependency->dependency_period); my_free(temp_servicedependency); return OK; } /* resolves object definitions */ int xodtemplate_resolve_objects(void) { xodtemplate_timeperiod *temp_timeperiod = NULL; xodtemplate_command *temp_command = NULL; xodtemplate_contactgroup *temp_contactgroup = NULL; xodtemplate_hostgroup *temp_hostgroup = NULL; xodtemplate_servicegroup *temp_servicegroup = NULL; xodtemplate_servicedependency *temp_servicedependency = NULL; xodtemplate_serviceescalation *temp_serviceescalation = NULL; xodtemplate_contact *temp_contact = NULL; xodtemplate_host *temp_host = NULL; xodtemplate_service *temp_service = NULL; xodtemplate_hostdependency *temp_hostdependency = NULL; xodtemplate_hostescalation *temp_hostescalation = NULL; xodtemplate_hostextinfo *temp_hostextinfo = NULL; xodtemplate_serviceextinfo *temp_serviceextinfo = NULL; /* resolve all timeperiod objects */ for(temp_timeperiod = xodtemplate_timeperiod_list; temp_timeperiod != NULL; temp_timeperiod = temp_timeperiod->next) { if(xodtemplate_resolve_timeperiod(temp_timeperiod) == ERROR) return ERROR; } /* resolve all command objects */ for(temp_command = xodtemplate_command_list; temp_command != NULL; temp_command = temp_command->next) { if(xodtemplate_resolve_command(temp_command) == ERROR) return ERROR; } /* resolve all contactgroup objects */ for(temp_contactgroup = xodtemplate_contactgroup_list; temp_contactgroup != NULL; temp_contactgroup = temp_contactgroup->next) { if(xodtemplate_resolve_contactgroup(temp_contactgroup) == ERROR) return ERROR; } /* resolve all hostgroup objects */ for(temp_hostgroup = xodtemplate_hostgroup_list; temp_hostgroup != NULL; temp_hostgroup = temp_hostgroup->next) { if(xodtemplate_resolve_hostgroup(temp_hostgroup) == ERROR) return ERROR; } /* resolve all servicegroup objects */ for(temp_servicegroup = xodtemplate_servicegroup_list; temp_servicegroup != NULL; temp_servicegroup = temp_servicegroup->next) { if(xodtemplate_resolve_servicegroup(temp_servicegroup) == ERROR) return ERROR; } /* resolve all servicedependency objects */ for(temp_servicedependency = xodtemplate_servicedependency_list; temp_servicedependency != NULL; temp_servicedependency = temp_servicedependency->next) { if(xodtemplate_resolve_servicedependency(temp_servicedependency) == ERROR) return ERROR; } /* resolve all serviceescalation objects */ for(temp_serviceescalation = xodtemplate_serviceescalation_list; temp_serviceescalation != NULL; temp_serviceescalation = temp_serviceescalation->next) { if(xodtemplate_resolve_serviceescalation(temp_serviceescalation) == ERROR) return ERROR; } /* resolve all contact objects */ for(temp_contact = xodtemplate_contact_list; temp_contact != NULL; temp_contact = temp_contact->next) { if(xodtemplate_resolve_contact(temp_contact) == ERROR) return ERROR; } /* resolve all host objects */ for(temp_host = xodtemplate_host_list; temp_host != NULL; temp_host = temp_host->next) { if(xodtemplate_resolve_host(temp_host) == ERROR) return ERROR; } /* resolve all service objects */ for(temp_service = xodtemplate_service_list; temp_service != NULL; temp_service = temp_service->next) { if(xodtemplate_resolve_service(temp_service) == ERROR) return ERROR; } /* resolve all hostdependency objects */ for(temp_hostdependency = xodtemplate_hostdependency_list; temp_hostdependency != NULL; temp_hostdependency = temp_hostdependency->next) { if(xodtemplate_resolve_hostdependency(temp_hostdependency) == ERROR) return ERROR; } /* resolve all hostescalation objects */ for(temp_hostescalation = xodtemplate_hostescalation_list; temp_hostescalation != NULL; temp_hostescalation = temp_hostescalation->next) { if(xodtemplate_resolve_hostescalation(temp_hostescalation) == ERROR) return ERROR; } /* resolve all hostextinfo objects */ for(temp_hostextinfo = xodtemplate_hostextinfo_list; temp_hostextinfo != NULL; temp_hostextinfo = temp_hostextinfo->next) { if(xodtemplate_resolve_hostextinfo(temp_hostextinfo) == ERROR) return ERROR; } /* resolve all serviceextinfo objects */ for(temp_serviceextinfo = xodtemplate_serviceextinfo_list; temp_serviceextinfo != NULL; temp_serviceextinfo = temp_serviceextinfo->next) { if(xodtemplate_resolve_serviceextinfo(temp_serviceextinfo) == ERROR) return ERROR; } return OK; } /* resolves a timeperiod object */ int xodtemplate_resolve_timeperiod(xodtemplate_timeperiod *this_timeperiod) { char *temp_ptr = NULL; char *template_names = NULL; char *template_name_ptr = NULL; xodtemplate_daterange *template_daterange = NULL; xodtemplate_daterange *this_daterange = NULL; xodtemplate_daterange *new_daterange = NULL; xodtemplate_timeperiod *template_timeperiod = NULL; int x; /* return if this timeperiod has already been resolved */ if(this_timeperiod->has_been_resolved == TRUE) return OK; /* set the resolved flag */ this_timeperiod->has_been_resolved = TRUE; /* return if we have no template */ if(this_timeperiod->template == NULL) return OK; if((template_names = (char *)strdup(this_timeperiod->template)) == NULL) return ERROR; /* apply all templates */ template_name_ptr = template_names; for(temp_ptr = my_strsep(&template_name_ptr, ","); temp_ptr != NULL; temp_ptr = my_strsep(&template_name_ptr, ",")) { template_timeperiod = xodtemplate_find_timeperiod(temp_ptr); if(template_timeperiod == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Template '%s' specified in timeperiod definition could not be not found (config file '%s', starting on line %d)\n", temp_ptr, xodtemplate_config_file_name(this_timeperiod->_config_file), this_timeperiod->_start_line); my_free(template_names); return ERROR; } /* resolve the template timeperiod... */ xodtemplate_resolve_timeperiod(template_timeperiod); /* apply missing properties from template timeperiod... */ xod_inherit_str_nohave(this_timeperiod, template_timeperiod, timeperiod_name); xod_inherit_str_nohave(this_timeperiod, template_timeperiod, alias); xod_inherit_str_nohave(this_timeperiod, template_timeperiod, exclusions); for(x = 0; x < 7; x++) xod_inherit_str_nohave(this_timeperiod, template_timeperiod, timeranges[x]); /* daterange exceptions require more work to apply missing ranges... */ for(x = 0; x < DATERANGE_TYPES; x++) { for(template_daterange = template_timeperiod->exceptions[x]; template_daterange != NULL; template_daterange = template_daterange->next) { /* see if this same daterange already exists in the timeperiod */ for(this_daterange = this_timeperiod->exceptions[x]; this_daterange != NULL; this_daterange = this_daterange->next) { if((this_daterange->type == template_daterange->type) && (this_daterange->syear == template_daterange->syear) && (this_daterange->smon == template_daterange->smon) && (this_daterange->smday == template_daterange->smday) && (this_daterange->swday == template_daterange->swday) && (this_daterange->swday_offset == template_daterange->swday_offset) && (this_daterange->eyear == template_daterange->eyear) && (this_daterange->emon == template_daterange->emon) && (this_daterange->emday == template_daterange->emday) && (this_daterange->ewday == template_daterange->ewday) && (this_daterange->ewday_offset == template_daterange->ewday_offset) && (this_daterange->skip_interval == template_daterange->skip_interval)) break; } /* this daterange already exists in the timeperiod, so don't inherit it */ if(this_daterange != NULL) continue; /* inherit the daterange from the template */ if((new_daterange = (xodtemplate_daterange *)malloc(sizeof(xodtemplate_daterange))) == NULL) continue; new_daterange->type = template_daterange->type; new_daterange->syear = template_daterange->syear; new_daterange->smon = template_daterange->smon; new_daterange->smday = template_daterange->smday; new_daterange->swday = template_daterange->swday; new_daterange->swday_offset = template_daterange->swday_offset; new_daterange->eyear = template_daterange->eyear; new_daterange->emon = template_daterange->emon; new_daterange->emday = template_daterange->emday; new_daterange->ewday = template_daterange->ewday; new_daterange->ewday_offset = template_daterange->ewday_offset; new_daterange->skip_interval = template_daterange->skip_interval; new_daterange->timeranges = NULL; if(template_daterange->timeranges != NULL) new_daterange->timeranges = (char *)strdup(template_daterange->timeranges); /* add new daterange to head of list (should it be added to the end instead?) */ new_daterange->next = this_timeperiod->exceptions[x]; this_timeperiod->exceptions[x] = new_daterange; } } } my_free(template_names); return OK; } /* resolves a command object */ int xodtemplate_resolve_command(xodtemplate_command *this_command) { char *temp_ptr = NULL; char *template_names = NULL; char *template_name_ptr = NULL; xodtemplate_command *template_command = NULL; /* return if this command has already been resolved */ if(this_command->has_been_resolved == TRUE) return OK; /* set the resolved flag */ this_command->has_been_resolved = TRUE; /* return if we have no template */ if(this_command->template == NULL) return OK; if((template_names = (char *)strdup(this_command->template)) == NULL) return ERROR; /* apply all templates */ template_name_ptr = template_names; for(temp_ptr = my_strsep(&template_name_ptr, ","); temp_ptr != NULL; temp_ptr = my_strsep(&template_name_ptr, ",")) { template_command = xodtemplate_find_command(temp_ptr); if(template_command == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Template '%s' specified in command definition could not be not found (config file '%s', starting on line %d)\n", temp_ptr, xodtemplate_config_file_name(this_command->_config_file), this_command->_start_line); my_free(template_names); return ERROR; } /* resolve the template command... */ xodtemplate_resolve_command(template_command); /* apply missing properties from template command... */ xod_inherit_str_nohave(this_command, template_command, command_name); xod_inherit_str_nohave(this_command, template_command, command_line); } my_free(template_names); return OK; } /* resolves a contactgroup object */ int xodtemplate_resolve_contactgroup(xodtemplate_contactgroup *this_contactgroup) { char *temp_ptr = NULL; char *template_names = NULL; char *template_name_ptr = NULL; xodtemplate_contactgroup *template_contactgroup = NULL; /* return if this contactgroup has already been resolved */ if(this_contactgroup->has_been_resolved == TRUE) return OK; /* set the resolved flag */ this_contactgroup->has_been_resolved = TRUE; /* return if we have no template */ if(this_contactgroup->template == NULL) return OK; if((template_names = (char *)strdup(this_contactgroup->template)) == NULL) return ERROR; /* apply all templates */ template_name_ptr = template_names; for(temp_ptr = my_strsep(&template_name_ptr, ","); temp_ptr != NULL; temp_ptr = my_strsep(&template_name_ptr, ",")) { template_contactgroup = xodtemplate_find_contactgroup(temp_ptr); if(template_contactgroup == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Template '%s' specified in contactgroup definition could not be not found (config file '%s', starting on line %d)\n", temp_ptr, xodtemplate_config_file_name(this_contactgroup->_config_file), this_contactgroup->_start_line); my_free(template_names); return ERROR; } /* resolve the template contactgroup... */ xodtemplate_resolve_contactgroup(template_contactgroup); /* apply missing properties from template contactgroup... */ xod_inherit_str_nohave(this_contactgroup, template_contactgroup, contactgroup_name); xod_inherit_str_nohave(this_contactgroup, template_contactgroup, alias); xodtemplate_get_inherited_string(&template_contactgroup->have_members, &template_contactgroup->members, &this_contactgroup->have_members, &this_contactgroup->members); xodtemplate_get_inherited_string(&template_contactgroup->have_contactgroup_members, &template_contactgroup->contactgroup_members, &this_contactgroup->have_contactgroup_members, &this_contactgroup->contactgroup_members); } my_free(template_names); return OK; } /* resolves a hostgroup object */ int xodtemplate_resolve_hostgroup(xodtemplate_hostgroup *this_hostgroup) { char *temp_ptr = NULL; char *template_names = NULL; char *template_name_ptr = NULL; xodtemplate_hostgroup *template_hostgroup = NULL; /* return if this hostgroup has already been resolved */ if(this_hostgroup->has_been_resolved == TRUE) return OK; /* set the resolved flag */ this_hostgroup->has_been_resolved = TRUE; /* return if we have no template */ if(this_hostgroup->template == NULL) return OK; if((template_names = (char *)strdup(this_hostgroup->template)) == NULL) return ERROR; /* apply all templates */ template_name_ptr = template_names; for(temp_ptr = my_strsep(&template_name_ptr, ","); temp_ptr != NULL; temp_ptr = my_strsep(&template_name_ptr, ",")) { template_hostgroup = xodtemplate_find_hostgroup(temp_ptr); if(template_hostgroup == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Template '%s' specified in hostgroup definition could not be not found (config file '%s', starting on line %d)\n", temp_ptr, xodtemplate_config_file_name(this_hostgroup->_config_file), this_hostgroup->_start_line); my_free(template_names); return ERROR; } /* resolve the template hostgroup... */ xodtemplate_resolve_hostgroup(template_hostgroup); /* apply missing properties from template hostgroup... */ xod_inherit_str_nohave(this_hostgroup, template_hostgroup, hostgroup_name); xod_inherit_str_nohave(this_hostgroup, template_hostgroup, alias); xodtemplate_get_inherited_string(&template_hostgroup->have_members, &template_hostgroup->members, &this_hostgroup->have_members, &this_hostgroup->members); xodtemplate_get_inherited_string(&template_hostgroup->have_hostgroup_members, &template_hostgroup->hostgroup_members, &this_hostgroup->have_hostgroup_members, &this_hostgroup->hostgroup_members); xod_inherit_str(this_hostgroup, template_hostgroup, notes); xod_inherit_str(this_hostgroup, template_hostgroup, notes_url); xod_inherit_str(this_hostgroup, template_hostgroup, action_url); } my_free(template_names); return OK; } /* resolves a servicegroup object */ int xodtemplate_resolve_servicegroup(xodtemplate_servicegroup *this_servicegroup) { char *temp_ptr = NULL; char *template_names = NULL; char *template_name_ptr = NULL; xodtemplate_servicegroup *template_servicegroup = NULL; /* return if this servicegroup has already been resolved */ if(this_servicegroup->has_been_resolved == TRUE) return OK; /* set the resolved flag */ this_servicegroup->has_been_resolved = TRUE; /* return if we have no template */ if(this_servicegroup->template == NULL) return OK; if((template_names = (char *)strdup(this_servicegroup->template)) == NULL) return ERROR; /* apply all templates */ template_name_ptr = template_names; for(temp_ptr = my_strsep(&template_name_ptr, ","); temp_ptr != NULL; temp_ptr = my_strsep(&template_name_ptr, ",")) { template_servicegroup = xodtemplate_find_servicegroup(temp_ptr); if(template_servicegroup == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Template '%s' specified in servicegroup definition could not be not found (config file '%s', starting on line %d)\n", temp_ptr, xodtemplate_config_file_name(this_servicegroup->_config_file), this_servicegroup->_start_line); my_free(template_names); return ERROR; } /* resolve the template servicegroup... */ xodtemplate_resolve_servicegroup(template_servicegroup); /* apply missing properties from template servicegroup... */ xod_inherit_str_nohave(this_servicegroup, template_servicegroup, servicegroup_name); xod_inherit_str_nohave(this_servicegroup, template_servicegroup, alias); xodtemplate_get_inherited_string(&template_servicegroup->have_members, &template_servicegroup->members, &this_servicegroup->have_members, &this_servicegroup->members); xodtemplate_get_inherited_string(&template_servicegroup->have_servicegroup_members, &template_servicegroup->servicegroup_members, &this_servicegroup->have_servicegroup_members, &this_servicegroup->servicegroup_members); xod_inherit_str(this_servicegroup, template_servicegroup, notes); xod_inherit_str(this_servicegroup, template_servicegroup, notes_url); xod_inherit_str(this_servicegroup, template_servicegroup, action_url); } my_free(template_names); return OK; } /* resolves a servicedependency object */ int xodtemplate_resolve_servicedependency(xodtemplate_servicedependency *this_servicedependency) { char *temp_ptr = NULL; char *template_names = NULL; char *template_name_ptr = NULL; xodtemplate_servicedependency *template_servicedependency = NULL; /* return if this servicedependency has already been resolved */ if(this_servicedependency->has_been_resolved == TRUE) return OK; /* set the resolved flag */ this_servicedependency->has_been_resolved = TRUE; /* return if we have no template */ if(this_servicedependency->template == NULL) return OK; if((template_names = (char *)strdup(this_servicedependency->template)) == NULL) return ERROR; /* apply all templates */ template_name_ptr = template_names; for(temp_ptr = my_strsep(&template_name_ptr, ","); temp_ptr != NULL; temp_ptr = my_strsep(&template_name_ptr, ",")) { template_servicedependency = xodtemplate_find_servicedependency(temp_ptr); if(template_servicedependency == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Template '%s' specified in service dependency definition could not be not found (config file '%s', starting on line %d)\n", temp_ptr, xodtemplate_config_file_name(this_servicedependency->_config_file), this_servicedependency->_start_line); my_free(template_names); return ERROR; } /* resolve the template servicedependency... */ xodtemplate_resolve_servicedependency(template_servicedependency); /* apply missing properties from template servicedependency... */ xodtemplate_get_inherited_string(&template_servicedependency->have_servicegroup_name, &template_servicedependency->servicegroup_name, &this_servicedependency->have_servicegroup_name, &this_servicedependency->servicegroup_name); xodtemplate_get_inherited_string(&template_servicedependency->have_hostgroup_name, &template_servicedependency->hostgroup_name, &this_servicedependency->have_hostgroup_name, &this_servicedependency->hostgroup_name); xodtemplate_get_inherited_string(&template_servicedependency->have_host_name, &template_servicedependency->host_name, &this_servicedependency->have_host_name, &this_servicedependency->host_name); xodtemplate_get_inherited_string(&template_servicedependency->have_service_description, &template_servicedependency->service_description, &this_servicedependency->have_service_description, &this_servicedependency->service_description); xodtemplate_get_inherited_string(&template_servicedependency->have_dependent_servicegroup_name, &template_servicedependency->dependent_servicegroup_name, &this_servicedependency->have_dependent_servicegroup_name, &this_servicedependency->dependent_servicegroup_name); xodtemplate_get_inherited_string(&template_servicedependency->have_dependent_hostgroup_name, &template_servicedependency->dependent_hostgroup_name, &this_servicedependency->have_dependent_hostgroup_name, &this_servicedependency->dependent_hostgroup_name); xodtemplate_get_inherited_string(&template_servicedependency->have_dependent_host_name, &template_servicedependency->dependent_host_name, &this_servicedependency->have_dependent_host_name, &this_servicedependency->dependent_host_name); xodtemplate_get_inherited_string(&template_servicedependency->have_dependent_service_description, &template_servicedependency->dependent_service_description, &this_servicedependency->have_dependent_service_description, &this_servicedependency->dependent_service_description); if(this_servicedependency->have_dependency_period == FALSE && template_servicedependency->have_dependency_period == TRUE) { if(this_servicedependency->dependency_period == NULL && template_servicedependency->dependency_period != NULL) this_servicedependency->dependency_period = (char *)strdup(template_servicedependency->dependency_period); this_servicedependency->have_dependency_period = TRUE; } if(this_servicedependency->have_inherits_parent == FALSE && template_servicedependency->have_inherits_parent == TRUE) { this_servicedependency->inherits_parent = template_servicedependency->inherits_parent; this_servicedependency->have_inherits_parent = TRUE; } if(this_servicedependency->have_execution_failure_options == FALSE && template_servicedependency->have_execution_failure_options == TRUE) { this_servicedependency->execution_failure_options = template_servicedependency->execution_failure_options; this_servicedependency->have_execution_failure_options = TRUE; } if(this_servicedependency->have_notification_failure_options == FALSE && template_servicedependency->have_notification_failure_options == TRUE) { this_servicedependency->notification_failure_options = template_servicedependency->notification_failure_options; this_servicedependency->have_notification_failure_options = TRUE; } } my_free(template_names); return OK; } /* resolves a serviceescalation object */ int xodtemplate_resolve_serviceescalation(xodtemplate_serviceescalation *this_serviceescalation) { char *temp_ptr = NULL; char *template_names = NULL; char *template_name_ptr = NULL; xodtemplate_serviceescalation *template_serviceescalation = NULL; /* return if this serviceescalation has already been resolved */ if(this_serviceescalation->has_been_resolved == TRUE) return OK; /* set the resolved flag */ this_serviceescalation->has_been_resolved = TRUE; /* return if we have no template */ if(this_serviceescalation->template == NULL) return OK; if((template_names = (char *)strdup(this_serviceescalation->template)) == NULL) return ERROR; /* apply all templates */ template_name_ptr = template_names; for(temp_ptr = my_strsep(&template_name_ptr, ","); temp_ptr != NULL; temp_ptr = my_strsep(&template_name_ptr, ",")) { template_serviceescalation = xodtemplate_find_serviceescalation(temp_ptr); if(template_serviceescalation == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Template '%s' specified in service escalation definition could not be not found (config file '%s', starting on line %d)\n", temp_ptr, xodtemplate_config_file_name(this_serviceescalation->_config_file), this_serviceescalation->_start_line); my_free(template_names); return ERROR; } /* resolve the template serviceescalation... */ xodtemplate_resolve_serviceescalation(template_serviceescalation); /* apply missing properties from template serviceescalation... */ xodtemplate_get_inherited_string(&template_serviceescalation->have_servicegroup_name, &template_serviceescalation->servicegroup_name, &this_serviceescalation->have_servicegroup_name, &this_serviceescalation->servicegroup_name); xodtemplate_get_inherited_string(&template_serviceescalation->have_hostgroup_name, &template_serviceescalation->hostgroup_name, &this_serviceescalation->have_hostgroup_name, &this_serviceescalation->hostgroup_name); xodtemplate_get_inherited_string(&template_serviceescalation->have_host_name, &template_serviceescalation->host_name, &this_serviceescalation->have_host_name, &this_serviceescalation->host_name); xodtemplate_get_inherited_string(&template_serviceescalation->have_service_description, &template_serviceescalation->service_description, &this_serviceescalation->have_service_description, &this_serviceescalation->service_description); xodtemplate_get_inherited_string(&template_serviceescalation->have_contact_groups, &template_serviceescalation->contact_groups, &this_serviceescalation->have_contact_groups, &this_serviceescalation->contact_groups); xodtemplate_get_inherited_string(&template_serviceescalation->have_contacts, &template_serviceescalation->contacts, &this_serviceescalation->have_contacts, &this_serviceescalation->contacts); if(this_serviceescalation->have_escalation_period == FALSE && template_serviceescalation->have_escalation_period == TRUE) { if(this_serviceescalation->escalation_period == NULL && template_serviceescalation->escalation_period != NULL) this_serviceescalation->escalation_period = (char *)strdup(template_serviceescalation->escalation_period); this_serviceescalation->have_escalation_period = TRUE; } if(this_serviceescalation->have_first_notification == FALSE && template_serviceescalation->have_first_notification == TRUE) { this_serviceescalation->first_notification = template_serviceescalation->first_notification; this_serviceescalation->have_first_notification = TRUE; } if(this_serviceescalation->have_last_notification == FALSE && template_serviceescalation->have_last_notification == TRUE) { this_serviceescalation->last_notification = template_serviceescalation->last_notification; this_serviceescalation->have_last_notification = TRUE; } if(this_serviceescalation->have_notification_interval == FALSE && template_serviceescalation->have_notification_interval == TRUE) { this_serviceescalation->notification_interval = template_serviceescalation->notification_interval; this_serviceescalation->have_notification_interval = TRUE; } if(this_serviceescalation->have_escalation_options == FALSE && template_serviceescalation->have_escalation_options == TRUE) { this_serviceescalation->escalation_options = template_serviceescalation->escalation_options; this_serviceescalation->have_escalation_options = TRUE; } } my_free(template_names); return OK; } /* resolves a contact object */ int xodtemplate_resolve_contact(xodtemplate_contact *this_contact) { char *temp_ptr = NULL; char *template_names = NULL; char *template_name_ptr = NULL; xodtemplate_contact *template_contact = NULL; xodtemplate_customvariablesmember *this_customvariablesmember = NULL; xodtemplate_customvariablesmember *temp_customvariablesmember = NULL; int x; /* return if this contact has already been resolved */ if(this_contact->has_been_resolved == TRUE) return OK; /* set the resolved flag */ this_contact->has_been_resolved = TRUE; /* return if we have no template */ if(this_contact->template == NULL) return OK; if((template_names = (char *)strdup(this_contact->template)) == NULL) return ERROR; /* apply all templates */ template_name_ptr = template_names; for(temp_ptr = my_strsep(&template_name_ptr, ","); temp_ptr != NULL; temp_ptr = my_strsep(&template_name_ptr, ",")) { template_contact = xodtemplate_find_contact(temp_ptr); if(template_contact == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Template '%s' specified in contact definition could not be not found (config file '%s', starting on line %d)\n", temp_ptr, xodtemplate_config_file_name(this_contact->_config_file), this_contact->_start_line); my_free(template_names); return ERROR; } /* resolve the template contact... */ xodtemplate_resolve_contact(template_contact); /* apply missing properties from template contact... */ xod_inherit_str_nohave(this_contact, template_contact, contact_name); xod_inherit_str_nohave(this_contact, template_contact, alias); xod_inherit_str(this_contact, template_contact, email); xod_inherit_str(this_contact, template_contact, pager); for(x = 0; x < MAX_XODTEMPLATE_CONTACT_ADDRESSES; x++) xod_inherit_str(this_contact, template_contact, address[x]); xodtemplate_get_inherited_string(&template_contact->have_contact_groups, &template_contact->contact_groups, &this_contact->have_contact_groups, &this_contact->contact_groups); xodtemplate_get_inherited_string(&template_contact->have_host_notification_commands, &template_contact->host_notification_commands, &this_contact->have_host_notification_commands, &this_contact->host_notification_commands); xodtemplate_get_inherited_string(&template_contact->have_service_notification_commands, &template_contact->service_notification_commands, &this_contact->have_service_notification_commands, &this_contact->service_notification_commands); xod_inherit_str(this_contact, template_contact, host_notification_period); xod_inherit_str(this_contact, template_contact, service_notification_period); xod_inherit(this_contact, template_contact, host_notification_options); xod_inherit(this_contact, template_contact, service_notification_options); xod_inherit(this_contact, template_contact, host_notifications_enabled); xod_inherit(this_contact, template_contact, service_notifications_enabled); xod_inherit(this_contact, template_contact, can_submit_commands); xod_inherit(this_contact, template_contact, retain_status_information); xod_inherit(this_contact, template_contact, retain_nonstatus_information); xod_inherit(this_contact, template_contact, minimum_value); /* apply missing custom variables from template contact... */ for(temp_customvariablesmember = template_contact->custom_variables; temp_customvariablesmember != NULL; temp_customvariablesmember = temp_customvariablesmember->next) { /* see if this host has a variable by the same name */ for(this_customvariablesmember = this_contact->custom_variables; this_customvariablesmember != NULL; this_customvariablesmember = this_customvariablesmember->next) { if(!strcmp(temp_customvariablesmember->variable_name, this_customvariablesmember->variable_name)) break; } /* we didn't find the same variable name, so add a new custom variable */ if(this_customvariablesmember == NULL) xodtemplate_add_custom_variable_to_contact(this_contact, temp_customvariablesmember->variable_name, temp_customvariablesmember->variable_value); } } my_free(template_names); return OK; } /* resolves a host object */ int xodtemplate_resolve_host(xodtemplate_host *this_host) { char *temp_ptr = NULL; char *template_names = NULL; char *template_name_ptr = NULL; xodtemplate_host *template_host = NULL; xodtemplate_customvariablesmember *this_customvariablesmember = NULL; xodtemplate_customvariablesmember *temp_customvariablesmember = NULL; /* return if this host has already been resolved */ if(this_host->has_been_resolved == TRUE) return OK; /* set the resolved flag */ this_host->has_been_resolved = TRUE; /* return if we have no template */ if(this_host->template == NULL) return OK; if((template_names = (char *)strdup(this_host->template)) == NULL) return ERROR; /* apply all templates */ template_name_ptr = template_names; for(temp_ptr = my_strsep(&template_name_ptr, ","); temp_ptr != NULL; temp_ptr = my_strsep(&template_name_ptr, ",")) { template_host = xodtemplate_find_host(temp_ptr); if(template_host == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Template '%s' specified in host definition could not be not found (config file '%s', starting on line %d)\n", temp_ptr, xodtemplate_config_file_name(this_host->_config_file), this_host->_start_line); my_free(template_names); return ERROR; } /* resolve the template host... */ xodtemplate_resolve_host(template_host); /* apply missing properties from template host... */ xod_inherit_str_nohave(this_host, template_host, host_name); xod_inherit_str(this_host, template_host, display_name); xod_inherit_str_nohave(this_host, template_host, alias); xod_inherit_str_nohave(this_host, template_host, address); xodtemplate_get_inherited_string(&template_host->have_parents, &template_host->parents, &this_host->have_parents, &this_host->parents); xodtemplate_get_inherited_string(&template_host->have_host_groups, &template_host->host_groups, &this_host->have_host_groups, &this_host->host_groups); xodtemplate_get_inherited_string(&template_host->have_contact_groups, &template_host->contact_groups, &this_host->have_contact_groups, &this_host->contact_groups); xodtemplate_get_inherited_string(&template_host->have_contacts, &template_host->contacts, &this_host->have_contacts, &this_host->contacts); xod_inherit_str(this_host, template_host, check_command); xod_inherit_str(this_host, template_host, check_period); xod_inherit_str(this_host, template_host, event_handler); xod_inherit_str(this_host, template_host, notification_period); xod_inherit_str(this_host, template_host, notes); xod_inherit_str(this_host, template_host, notes_url); xod_inherit_str(this_host, template_host, action_url); xod_inherit_str(this_host, template_host, icon_image); xod_inherit_str(this_host, template_host, icon_image_alt); xod_inherit_str(this_host, template_host, vrml_image); xod_inherit_str(this_host, template_host, statusmap_image); xod_inherit(this_host, template_host, initial_state); xod_inherit(this_host, template_host, check_interval); xod_inherit(this_host, template_host, retry_interval); xod_inherit(this_host, template_host, max_check_attempts); xod_inherit(this_host, template_host, active_checks_enabled); xod_inherit(this_host, template_host, passive_checks_enabled); xod_inherit(this_host, template_host, obsess); xod_inherit(this_host, template_host, event_handler_enabled); xod_inherit(this_host, template_host, check_freshness); xod_inherit(this_host, template_host, freshness_threshold); xod_inherit(this_host, template_host, low_flap_threshold); xod_inherit(this_host, template_host, high_flap_threshold); xod_inherit(this_host, template_host, flap_detection_enabled); xod_inherit(this_host, template_host, flap_detection_options); xod_inherit(this_host, template_host, notification_options); xod_inherit(this_host, template_host, notifications_enabled); xod_inherit(this_host, template_host, notification_interval); xod_inherit(this_host, template_host, first_notification_delay); xod_inherit(this_host, template_host, stalking_options); xod_inherit(this_host, template_host, process_perf_data); xod_inherit(this_host, template_host, hourly_value); if(this_host->have_2d_coords == FALSE && template_host->have_2d_coords == TRUE) { this_host->x_2d = template_host->x_2d; this_host->y_2d = template_host->y_2d; this_host->have_2d_coords = TRUE; } if(this_host->have_3d_coords == FALSE && template_host->have_3d_coords == TRUE) { this_host->x_3d = template_host->x_3d; this_host->y_3d = template_host->y_3d; this_host->z_3d = template_host->z_3d; this_host->have_3d_coords = TRUE; } xod_inherit(this_host, template_host, retain_status_information); xod_inherit(this_host, template_host, retain_nonstatus_information); /* apply missing custom variables from template host... */ for(temp_customvariablesmember = template_host->custom_variables; temp_customvariablesmember != NULL; temp_customvariablesmember = temp_customvariablesmember->next) { /* see if this host has a variable by the same name */ for(this_customvariablesmember = this_host->custom_variables; this_customvariablesmember != NULL; this_customvariablesmember = this_customvariablesmember->next) { if(!strcmp(temp_customvariablesmember->variable_name, this_customvariablesmember->variable_name)) break; } /* we didn't find the same variable name, so add a new custom variable */ if(this_customvariablesmember == NULL) xodtemplate_add_custom_variable_to_host(this_host, temp_customvariablesmember->variable_name, temp_customvariablesmember->variable_value); } } my_free(template_names); return OK; } /* resolves a service object */ int xodtemplate_resolve_service(xodtemplate_service *this_service) { char *temp_ptr = NULL; char *template_names = NULL; char *template_name_ptr = NULL; xodtemplate_service *template_service = NULL; xodtemplate_customvariablesmember *this_customvariablesmember = NULL; xodtemplate_customvariablesmember *temp_customvariablesmember = NULL; /* return if this service has already been resolved */ if(this_service->has_been_resolved == TRUE) return OK; /* set the resolved flag */ this_service->has_been_resolved = TRUE; /* return if we have no template */ if(this_service->template == NULL) return OK; if((template_names = (char *)strdup(this_service->template)) == NULL) return ERROR; /* apply all templates */ template_name_ptr = template_names; for(temp_ptr = my_strsep(&template_name_ptr, ","); temp_ptr != NULL; temp_ptr = my_strsep(&template_name_ptr, ",")) { template_service = xodtemplate_find_service(temp_ptr); if(template_service == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Template '%s' specified in service definition could not be not found (config file '%s', starting on line %d)\n", temp_ptr, xodtemplate_config_file_name(this_service->_config_file), this_service->_start_line); my_free(template_names); return ERROR; } /* resolve the template service... */ xodtemplate_resolve_service(template_service); /* apply missing properties from template service... */ xod_inherit_str(this_service, template_service, service_description); xod_inherit_str(this_service, template_service, display_name); xodtemplate_get_inherited_string(&template_service->have_parents, &template_service->parents, &this_service->have_parents, &this_service->parents); xodtemplate_get_inherited_string(&template_service->have_host_name, &template_service->host_name, &this_service->have_host_name, &this_service->host_name); xodtemplate_get_inherited_string(&template_service->have_hostgroup_name, &template_service->hostgroup_name, &this_service->have_hostgroup_name, &this_service->hostgroup_name); xodtemplate_get_inherited_string(&template_service->have_service_groups, &template_service->service_groups, &this_service->have_service_groups, &this_service->service_groups); xodtemplate_get_inherited_string(&template_service->have_contact_groups, &template_service->contact_groups, &this_service->have_contact_groups, &this_service->contact_groups); xodtemplate_get_inherited_string(&template_service->have_contacts, &template_service->contacts, &this_service->have_contacts, &this_service->contacts); if(template_service->have_check_command == TRUE) { if(template_service->have_important_check_command == TRUE) { my_free(this_service->check_command); this_service->have_check_command = FALSE; } } xod_inherit_str(this_service, template_service, check_command); xod_inherit_str(this_service, template_service, check_period); xod_inherit_str(this_service, template_service, event_handler); xod_inherit_str(this_service, template_service, notification_period); xod_inherit_str(this_service, template_service, notes); xod_inherit_str(this_service, template_service, notes_url); xod_inherit_str(this_service, template_service, action_url); xod_inherit_str(this_service, template_service, icon_image); xod_inherit_str(this_service, template_service, icon_image_alt); xod_inherit(this_service, template_service, initial_state); xod_inherit(this_service, template_service, max_check_attempts); xod_inherit(this_service, template_service, check_interval); xod_inherit(this_service, template_service, retry_interval); xod_inherit(this_service, template_service, active_checks_enabled); xod_inherit(this_service, template_service, passive_checks_enabled); xod_inherit(this_service, template_service, parallelize_check); xod_inherit(this_service, template_service, is_volatile); xod_inherit(this_service, template_service, obsess); xod_inherit(this_service, template_service, event_handler_enabled); xod_inherit(this_service, template_service, check_freshness); xod_inherit(this_service, template_service, freshness_threshold); xod_inherit(this_service, template_service, low_flap_threshold); xod_inherit(this_service, template_service, high_flap_threshold); xod_inherit(this_service, template_service, flap_detection_enabled); xod_inherit(this_service, template_service, flap_detection_options); xod_inherit(this_service, template_service, notification_options); xod_inherit(this_service, template_service, notifications_enabled); xod_inherit(this_service, template_service, notification_interval); xod_inherit(this_service, template_service, first_notification_delay); xod_inherit(this_service, template_service, stalking_options); xod_inherit(this_service, template_service, process_perf_data); xod_inherit(this_service, template_service, retain_status_information); xod_inherit(this_service, template_service, retain_nonstatus_information); xod_inherit(this_service, template_service, hourly_value); /* apply missing custom variables from template service... */ for(temp_customvariablesmember = template_service->custom_variables; temp_customvariablesmember != NULL; temp_customvariablesmember = temp_customvariablesmember->next) { /* see if this host has a variable by the same name */ for(this_customvariablesmember = this_service->custom_variables; this_customvariablesmember != NULL; this_customvariablesmember = this_customvariablesmember->next) { if(!strcmp(temp_customvariablesmember->variable_name, this_customvariablesmember->variable_name)) break; } /* we didn't find the same variable name, so add a new custom variable */ if(this_customvariablesmember == NULL) xodtemplate_add_custom_variable_to_service(this_service, temp_customvariablesmember->variable_name, temp_customvariablesmember->variable_value); } } my_free(template_names); return OK; } /* resolves a hostdependency object */ int xodtemplate_resolve_hostdependency(xodtemplate_hostdependency *this_hostdependency) { char *temp_ptr = NULL; char *template_names = NULL; char *template_name_ptr = NULL; xodtemplate_hostdependency *template_hostdependency = NULL; /* return if this hostdependency has already been resolved */ if(this_hostdependency->has_been_resolved == TRUE) return OK; /* set the resolved flag */ this_hostdependency->has_been_resolved = TRUE; /* return if we have no template */ if(this_hostdependency->template == NULL) return OK; if((template_names = (char *)strdup(this_hostdependency->template)) == NULL) return ERROR; /* apply all templates */ template_name_ptr = template_names; for(temp_ptr = my_strsep(&template_name_ptr, ","); temp_ptr != NULL; temp_ptr = my_strsep(&template_name_ptr, ",")) { template_hostdependency = xodtemplate_find_hostdependency(temp_ptr); if(template_hostdependency == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Template '%s' specified in host dependency definition could not be not found (config file '%s', starting on line %d)\n", temp_ptr, xodtemplate_config_file_name(this_hostdependency->_config_file), this_hostdependency->_start_line); my_free(template_names); return ERROR; } /* resolve the template hostdependency... */ xodtemplate_resolve_hostdependency(template_hostdependency); /* apply missing properties from template hostdependency... */ xodtemplate_get_inherited_string(&template_hostdependency->have_host_name, &template_hostdependency->host_name, &this_hostdependency->have_host_name, &this_hostdependency->host_name); xodtemplate_get_inherited_string(&template_hostdependency->have_dependent_host_name, &template_hostdependency->dependent_host_name, &this_hostdependency->have_dependent_host_name, &this_hostdependency->dependent_host_name); xodtemplate_get_inherited_string(&template_hostdependency->have_hostgroup_name, &template_hostdependency->hostgroup_name, &this_hostdependency->have_hostgroup_name, &this_hostdependency->hostgroup_name); xodtemplate_get_inherited_string(&template_hostdependency->have_dependent_hostgroup_name, &template_hostdependency->dependent_hostgroup_name, &this_hostdependency->have_dependent_hostgroup_name, &this_hostdependency->dependent_hostgroup_name); xod_inherit_str(this_hostdependency, template_hostdependency, dependency_period); xod_inherit(this_hostdependency, template_hostdependency, inherits_parent); xod_inherit(this_hostdependency, template_hostdependency, execution_failure_options); xod_inherit(this_hostdependency, template_hostdependency, notification_failure_options); } my_free(template_names); return OK; } /* resolves a hostescalation object */ int xodtemplate_resolve_hostescalation(xodtemplate_hostescalation *this_hostescalation) { char *temp_ptr = NULL; char *template_names = NULL; char *template_name_ptr = NULL; xodtemplate_hostescalation *template_hostescalation = NULL; /* return if this hostescalation has already been resolved */ if(this_hostescalation->has_been_resolved == TRUE) return OK; /* set the resolved flag */ this_hostescalation->has_been_resolved = TRUE; /* return if we have no template */ if(this_hostescalation->template == NULL) return OK; if((template_names = (char *)strdup(this_hostescalation->template)) == NULL) return ERROR; /* apply all templates */ template_name_ptr = template_names; for(temp_ptr = my_strsep(&template_name_ptr, ","); temp_ptr != NULL; temp_ptr = my_strsep(&template_name_ptr, ",")) { template_hostescalation = xodtemplate_find_hostescalation(temp_ptr); if(template_hostescalation == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Template '%s' specified in host escalation definition could not be not found (config file '%s', starting on line %d)\n", temp_ptr, xodtemplate_config_file_name(this_hostescalation->_config_file), this_hostescalation->_start_line); my_free(template_names); return ERROR; } /* resolve the template hostescalation... */ xodtemplate_resolve_hostescalation(template_hostescalation); /* apply missing properties from template hostescalation... */ xodtemplate_get_inherited_string(&template_hostescalation->have_host_name, &template_hostescalation->host_name, &this_hostescalation->have_host_name, &this_hostescalation->host_name); xodtemplate_get_inherited_string(&template_hostescalation->have_hostgroup_name, &template_hostescalation->hostgroup_name, &this_hostescalation->have_hostgroup_name, &this_hostescalation->hostgroup_name); xodtemplate_get_inherited_string(&template_hostescalation->have_contact_groups, &template_hostescalation->contact_groups, &this_hostescalation->have_contact_groups, &this_hostescalation->contact_groups); xodtemplate_get_inherited_string(&template_hostescalation->have_contacts, &template_hostescalation->contacts, &this_hostescalation->have_contacts, &this_hostescalation->contacts); xod_inherit_str(this_hostescalation, template_hostescalation, escalation_period); xod_inherit(this_hostescalation, template_hostescalation, first_notification); xod_inherit(this_hostescalation, template_hostescalation, last_notification); xod_inherit(this_hostescalation, template_hostescalation, notification_interval); xod_inherit(this_hostescalation, template_hostescalation, escalation_options); } my_free(template_names); return OK; } /* resolves a hostextinfo object */ int xodtemplate_resolve_hostextinfo(xodtemplate_hostextinfo *this_hostextinfo) { char *temp_ptr = NULL; char *template_names = NULL; char *template_name_ptr = NULL; xodtemplate_hostextinfo *template_hostextinfo = NULL; /* return if this object has already been resolved */ if(this_hostextinfo->has_been_resolved == TRUE) return OK; /* set the resolved flag */ this_hostextinfo->has_been_resolved = TRUE; /* return if we have no template */ if(this_hostextinfo->template == NULL) return OK; if((template_names = (char *)strdup(this_hostextinfo->template)) == NULL) return ERROR; /* apply all templates */ template_name_ptr = template_names; for(temp_ptr = my_strsep(&template_name_ptr, ","); temp_ptr != NULL; temp_ptr = my_strsep(&template_name_ptr, ",")) { template_hostextinfo = xodtemplate_find_hostextinfo(temp_ptr); if(template_hostextinfo == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Template '%s' specified in extended host info definition could not be not found (config file '%s', starting on line %d)\n", temp_ptr, xodtemplate_config_file_name(this_hostextinfo->_config_file), this_hostextinfo->_start_line); my_free(template_names); return ERROR; } /* resolve the template hostextinfo... */ xodtemplate_resolve_hostextinfo(template_hostextinfo); /* apply missing properties from template hostextinfo... */ xod_inherit_str(this_hostextinfo, template_hostextinfo, host_name); xod_inherit_str(this_hostextinfo, template_hostextinfo, hostgroup_name); xod_inherit_str(this_hostextinfo, template_hostextinfo, notes); xod_inherit_str(this_hostextinfo, template_hostextinfo, notes_url); xod_inherit_str(this_hostextinfo, template_hostextinfo, action_url); xod_inherit_str(this_hostextinfo, template_hostextinfo, icon_image); xod_inherit_str(this_hostextinfo, template_hostextinfo, icon_image_alt); xod_inherit_str(this_hostextinfo, template_hostextinfo, vrml_image); xod_inherit_str(this_hostextinfo, template_hostextinfo, statusmap_image); if(this_hostextinfo->have_2d_coords == FALSE && template_hostextinfo->have_2d_coords == TRUE) { this_hostextinfo->x_2d = template_hostextinfo->x_2d; this_hostextinfo->y_2d = template_hostextinfo->y_2d; this_hostextinfo->have_2d_coords = TRUE; } if(this_hostextinfo->have_3d_coords == FALSE && template_hostextinfo->have_3d_coords == TRUE) { this_hostextinfo->x_3d = template_hostextinfo->x_3d; this_hostextinfo->y_3d = template_hostextinfo->y_3d; this_hostextinfo->z_3d = template_hostextinfo->z_3d; this_hostextinfo->have_3d_coords = TRUE; } } my_free(template_names); return OK; } /* resolves a serviceextinfo object */ int xodtemplate_resolve_serviceextinfo(xodtemplate_serviceextinfo *this_serviceextinfo) { char *temp_ptr = NULL; char *template_names = NULL; char *template_name_ptr = NULL; xodtemplate_serviceextinfo *template_serviceextinfo = NULL; /* return if this object has already been resolved */ if(this_serviceextinfo->has_been_resolved == TRUE) return OK; /* set the resolved flag */ this_serviceextinfo->has_been_resolved = TRUE; /* return if we have no template */ if(this_serviceextinfo->template == NULL) return OK; if((template_names = (char *)strdup(this_serviceextinfo->template)) == NULL) return ERROR; /* apply all templates */ template_name_ptr = template_names; for(temp_ptr = my_strsep(&template_name_ptr, ","); temp_ptr != NULL; temp_ptr = my_strsep(&template_name_ptr, ",")) { template_serviceextinfo = xodtemplate_find_serviceextinfo(temp_ptr); if(template_serviceextinfo == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Template '%s' specified in extended service info definition could not be not found (config file '%s', starting on line %d)\n", temp_ptr, xodtemplate_config_file_name(this_serviceextinfo->_config_file), this_serviceextinfo->_start_line); my_free(template_names); return ERROR; } /* resolve the template serviceextinfo... */ xodtemplate_resolve_serviceextinfo(template_serviceextinfo); /* apply missing properties from template serviceextinfo... */ xod_inherit_str(this_serviceextinfo, template_serviceextinfo, host_name); xod_inherit_str(this_serviceextinfo, template_serviceextinfo, hostgroup_name); xod_inherit_str(this_serviceextinfo, template_serviceextinfo, service_description); xod_inherit_str(this_serviceextinfo, template_serviceextinfo, notes); xod_inherit_str(this_serviceextinfo, template_serviceextinfo, notes_url); xod_inherit_str(this_serviceextinfo, template_serviceextinfo, action_url); xod_inherit_str(this_serviceextinfo, template_serviceextinfo, icon_image); xod_inherit_str(this_serviceextinfo, template_serviceextinfo, icon_image_alt); } my_free(template_names); return OK; } #endif /******************************************************************/ /*************** OBJECT RECOMBOBULATION FUNCTIONS *****************/ /******************************************************************/ /* * note: The cast to xodtemplate_host works for all objects because 'id' * is the first item of host, service and contact structs, and C * guarantees that the first member is always the same as the one listed * in the struct definition. */ static int _xodtemplate_add_group_member(objectlist **list, bitmap *in, bitmap *reject, void *obj) { xodtemplate_host *h = (xodtemplate_host *)obj; if(!list || !obj) return ERROR; if(bitmap_isset(in, h->id) || bitmap_isset(reject, h->id)) return OK; bitmap_set(in, h->id); return prepend_object_to_objectlist(list, obj); } #define xodtemplate_add_group_member(g, m) \ _xodtemplate_add_group_member(&g->member_list, g->member_map, g->reject_map, m) #define xodtemplate_add_servicegroup_member xodtemplate_add_group_member #define xodtemplate_add_contactgroup_member xodtemplate_add_group_member #define xodtemplate_add_hostgroup_member xodtemplate_add_group_member /* recombobulates contactgroup definitions */ static int xodtemplate_recombobulate_contactgroup_subgroups(xodtemplate_contactgroup *temp_contactgroup) { objectlist *mlist, *glist; if(temp_contactgroup == NULL) return ERROR; /* if this one's already handled somehow, we return early */ if(temp_contactgroup->loop_status != XOD_NEW) return temp_contactgroup->loop_status; /* mark it as seen */ temp_contactgroup->loop_status = XOD_SEEN; /* resolve included groups' members and add them to ours */ for(glist = temp_contactgroup->group_list; glist; glist = glist->next) { int result; xodtemplate_contactgroup *inc = (xodtemplate_contactgroup *)glist->object_ptr; result = xodtemplate_recombobulate_contactgroup_subgroups(inc); if(result != XOD_OK) { if(result == ERROR) return ERROR; logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Contactgroups '%s' and '%s' are part of a contactgroup_members include loop\n", temp_contactgroup->contactgroup_name, inc->contactgroup_name); inc->loop_status = XOD_LOOPY; temp_contactgroup->loop_status = XOD_LOOPY; break; } for(mlist = inc->member_list; mlist; mlist = mlist->next) { xodtemplate_contact *c = (xodtemplate_contact *)mlist->object_ptr; if(xodtemplate_add_contactgroup_member(temp_contactgroup, c) != OK) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Failed to add '%s' as a subgroup member contact of contactgroup '%s' from contactgroup '%s'\n", c->contact_name, temp_contactgroup->contactgroup_name, inc->contactgroup_name); return ERROR; } } } if(temp_contactgroup->loop_status == XOD_SEEN) temp_contactgroup->loop_status = XOD_OK; return temp_contactgroup->loop_status; } int xodtemplate_recombobulate_contactgroups(void) { xodtemplate_contact *temp_contact = NULL; xodtemplate_contactgroup *temp_contactgroup = NULL; char *contactgroup_names = NULL; char *temp_ptr = NULL; /* expand members of all contactgroups - this could be done in xodtemplate_register_contactgroup(), but we can save the CGIs some work if we do it here */ for(temp_contactgroup = xodtemplate_contactgroup_list; temp_contactgroup; temp_contactgroup = temp_contactgroup->next) { objectlist *next, *list, *accept = NULL; /* * If the contactgroup has no accept or reject list and no group * members we don't need the bitmaps for it. bitmap_isset() * will return 0 when passed a NULL map, so we can safely use * that to add any items from the object list later */ if(temp_contactgroup->members == NULL && temp_contactgroup->contactgroup_members == NULL) continue; if(!(temp_contactgroup->member_map = bitmap_create(xodcount.contacts))) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not create contactgroup bitmap\n"); return ERROR; } if(temp_contactgroup->contactgroup_members) { xodtemplate_contactgroup *cg; char *ptr, *next_ptr; for(next_ptr = ptr = temp_contactgroup->contactgroup_members; next_ptr; ptr = next_ptr + 1) { next_ptr = strchr(ptr, ','); if(next_ptr) *next_ptr = 0; while(*ptr == ' ' || *ptr == '\t') ptr++; strip(ptr); if(!(cg = xodtemplate_find_real_contactgroup(ptr))) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not find member group '%s' specified in contactgroup '%s' (config file '%s', starting on line %d)\n", ptr, temp_contactgroup->contactgroup_name, xodtemplate_config_file_name(temp_contactgroup->_config_file), temp_contactgroup->_start_line); return ERROR; } add_object_to_objectlist(&temp_contactgroup->group_list, cg); } my_free(temp_contactgroup->contactgroup_members); } /* move on if we have no members */ if(temp_contactgroup->members == NULL) continue; /* we might need this */ if(!use_precached_objects && !(temp_contactgroup->reject_map = bitmap_create(xodcount.contacts))) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not create reject map for contactgroup '%s'", temp_contactgroup->contactgroup_name); return ERROR; } /* get list of contacts in the contactgroup */ if(xodtemplate_expand_contacts(&accept, temp_contactgroup->reject_map, temp_contactgroup->members, temp_contactgroup->_config_file, temp_contactgroup->_start_line) != OK) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Failed to expand contacts for contactgroup '%s' (config file '%s', starting at line %d)\n", temp_contactgroup->contactgroup_name, xodtemplate_config_file_name(temp_contactgroup->_config_file), temp_contactgroup->_start_line); return ERROR; } my_free(temp_contactgroup->members); for(list = accept; list; list = next) { temp_contact = (xodtemplate_contact *)list->object_ptr; next = list->next; free(list); xodtemplate_add_contactgroup_member(temp_contactgroup, temp_contact); } } /* if we're using precached objects we can bail out now */ if(use_precached_objects) return OK; /* process all contacts with contactgroups directives */ for(temp_contact = xodtemplate_contact_list; temp_contact != NULL; temp_contact = temp_contact->next) { /* skip contacts without contactgroup directives or contact names */ if(temp_contact->contact_groups == NULL || temp_contact->contact_name == NULL) continue; /* preprocess the contactgroup list, to change "grp1,grp2,grp3,!grp2" into "grp1,grp3" */ if((contactgroup_names = xodtemplate_process_contactgroup_names(temp_contact->contact_groups, temp_contact->_config_file, temp_contact->_start_line)) == NULL) { logit(NSLOG_RUNTIME_ERROR, TRUE, "Error: Failed to process contactgroups for contact '%s' (config file '%s', starting at line %d)\n", temp_contact->contact_name, xodtemplate_config_file_name(temp_contact->_config_file), temp_contact->_start_line); return ERROR; } /* process the list of contactgroups */ for(temp_ptr = strtok(contactgroup_names, ","); temp_ptr; temp_ptr = strtok(NULL, ",")) { /* strip trailing spaces */ strip(temp_ptr); /* find the contactgroup */ temp_contactgroup = xodtemplate_find_real_contactgroup(temp_ptr); if(temp_contactgroup == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not find contactgroup '%s' specified in contact '%s' definition (config file '%s', starting on line %d)\n", temp_ptr, temp_contact->contact_name, xodtemplate_config_file_name(temp_contact->_config_file), temp_contact->_start_line); my_free(contactgroup_names); return ERROR; } if(!temp_contactgroup->member_map && !(temp_contactgroup->member_map = bitmap_create(xodcount.contacts))) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Failed to create member map for contactgroup '%s'\n", temp_contactgroup->contactgroup_name); return ERROR; } /* add this contact to the contactgroup members directive */ xodtemplate_add_contactgroup_member(temp_contactgroup, temp_contact); } /* free memory */ my_free(contactgroup_names); } /* expand subgroup membership recursively */ for(temp_contactgroup = xodtemplate_contactgroup_list; temp_contactgroup; temp_contactgroup = temp_contactgroup->next) { if(xodtemplate_recombobulate_contactgroup_subgroups(temp_contactgroup) != XOD_OK) return ERROR; /* rejects are no longer necessary */ bitmap_destroy(temp_contactgroup->reject_map); /* make sure we don't recursively add subgroup members again */ free_objectlist(&temp_contactgroup->group_list); } return OK; } static int xodtemplate_recombobulate_hostgroup_subgroups(xodtemplate_hostgroup *temp_hostgroup) { objectlist *mlist, *glist; if(temp_hostgroup == NULL) return ERROR; /* if this one's already handled somehow, we return early */ if(temp_hostgroup->loop_status != XOD_NEW) return temp_hostgroup->loop_status; /* mark this one as seen */ temp_hostgroup->loop_status = XOD_SEEN; /* resolve included groups' members and add them to ours */ for(glist = temp_hostgroup->group_list; glist; glist = glist->next) { int result; xodtemplate_hostgroup *inc = (xodtemplate_hostgroup *)glist->object_ptr; result = xodtemplate_recombobulate_hostgroup_subgroups(inc); if(result != XOD_OK) { if(result == ERROR) return ERROR; logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Hostgroups '%s' and '%s' part of a hostgroup_members include loop\n", temp_hostgroup->hostgroup_name, inc->hostgroup_name); inc->loop_status = XOD_LOOPY; temp_hostgroup->loop_status = XOD_LOOPY; break; } for(mlist = inc->member_list; mlist; mlist = mlist->next) { xodtemplate_host *h = (xodtemplate_host *)mlist->object_ptr; if (xodtemplate_add_hostgroup_member(temp_hostgroup, mlist->object_ptr) != OK) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Failed to add '%s' as a subgroup member host of hostgroup '%s' from hostgroup '%s'\n", h->host_name, temp_hostgroup->hostgroup_name, inc->hostgroup_name); return ERROR; } } } if(temp_hostgroup->loop_status == XOD_SEEN) temp_hostgroup->loop_status = XOD_OK; return temp_hostgroup->loop_status; } /* recombobulates hostgroup definitions */ int xodtemplate_recombobulate_hostgroups(void) { xodtemplate_host *temp_host = NULL; xodtemplate_hostgroup *temp_hostgroup = NULL; char *hostgroup_names = NULL; char *ptr, *next_ptr, *temp_ptr = NULL; /* expand members of all hostgroups - this could be done in xodtemplate_register_hostgroup(), but we can save the CGIs some work if we do it here */ for(temp_hostgroup = xodtemplate_hostgroup_list; temp_hostgroup; temp_hostgroup = temp_hostgroup->next) { objectlist *next, *list, *accept = NULL; /* * if the hostgroup has no accept or reject list and no group * members we don't need the bitmaps for it. bitmap_isset() * will return 0 when passed a NULL map, so we can safely use * that to add any items from the object list later. */ if(temp_hostgroup->members == NULL && temp_hostgroup->hostgroup_members == NULL) continue; /* we'll need the member_map */ if (!(temp_hostgroup->member_map = bitmap_create(xodcount.hosts))) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not create member map for hostgroup '%s'\n", temp_hostgroup->hostgroup_name); return ERROR; } /* resolve groups into a group-list */ for(next_ptr = ptr = temp_hostgroup->hostgroup_members; next_ptr; ptr = next_ptr + 1) { xodtemplate_hostgroup *hg; next_ptr = strchr(ptr, ','); if(next_ptr) *next_ptr = 0; while(*ptr == ' ' || *ptr == '\t') ptr++; strip(ptr); if (!(hg = xodtemplate_find_real_hostgroup(ptr))) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not find member group '%s' specified in hostgroup '%s' (config file '%s', starting on line %d)\n", ptr, temp_hostgroup->hostgroup_name, xodtemplate_config_file_name(temp_hostgroup->_config_file), temp_hostgroup->_start_line); return ERROR; } add_object_to_objectlist(&temp_hostgroup->group_list, hg); } /* move on if we have no members */ if(temp_hostgroup->members == NULL) continue; /* we might need this */ if(!use_precached_objects && !(temp_hostgroup->reject_map = bitmap_create(xodcount.hosts))) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not create reject map for hostgroup '%s'\n", temp_hostgroup->hostgroup_name); return ERROR; } /* get list of hosts in the hostgroup */ if (xodtemplate_expand_hosts(&accept, temp_hostgroup->reject_map, temp_hostgroup->members, temp_hostgroup->_config_file, temp_hostgroup->_start_line) == ERROR) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not expand members specified in hostgroup (config file '%s', starting on line %d)\n", xodtemplate_config_file_name(temp_hostgroup->_config_file), temp_hostgroup->_start_line); return ERROR; } if (!accept && !bitmap_count_set_bits(temp_hostgroup->reject_map)) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not expand members specified in hostgroup (config file '%s', starting on line %d)\n", xodtemplate_config_file_name(temp_hostgroup->_config_file), temp_hostgroup->_start_line); return ERROR; } my_free(temp_hostgroup->members); for (list = accept; list; list = next) { temp_host = (xodtemplate_host *)list->object_ptr; next = list->next; free(list); xodtemplate_add_hostgroup_member(temp_hostgroup, temp_host); } } /* if we're using precached objects we can bail out now */ if(use_precached_objects) return OK; /* process all hosts that have hostgroup directives */ for(temp_host = xodtemplate_host_list; temp_host != NULL; temp_host = temp_host->next) { /* skip hosts without hostgroup directives or host names */ if(temp_host->host_groups == NULL || temp_host->host_name == NULL) continue; /* skip hosts that shouldn't be registered */ if(temp_host->register_object == FALSE) continue; /* preprocess the hostgroup list, to change "grp1,grp2,grp3,!grp2" into "grp1,grp3" */ /* 10/18/07 EG an empty return value means an error occured */ if((hostgroup_names = xodtemplate_process_hostgroup_names(temp_host->host_groups, temp_host->_config_file, temp_host->_start_line)) == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Failed to process hostgroup names for host '%s' (config file '%s', starting at line %d)\n", temp_host->host_name, xodtemplate_config_file_name(temp_host->_config_file), temp_host->_start_line); return ERROR; } /* process the list of hostgroups */ for(temp_ptr = strtok(hostgroup_names, ","); temp_ptr; temp_ptr = strtok(NULL, ",")) { /* strip trailing spaces */ strip(temp_ptr); /* find the hostgroup */ temp_hostgroup = xodtemplate_find_real_hostgroup(temp_ptr); if(temp_hostgroup == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not find hostgroup '%s' specified in host '%s' definition (config file '%s', starting on line %d)\n", temp_ptr, temp_host->host_name, xodtemplate_config_file_name(temp_host->_config_file), temp_host->_start_line); my_free(hostgroup_names); return ERROR; } if(!temp_hostgroup->member_map && !(temp_hostgroup->member_map = bitmap_create(xodcount.hosts))) { logit(NSLOG_CONFIG_ERROR, TRUE, "Failed to create bitmap to join host '%s' to group '%s'\n", temp_host->host_name, temp_hostgroup->hostgroup_name); return ERROR; } /* add ourselves to the hostgroup member list */ xodtemplate_add_hostgroup_member(temp_hostgroup, temp_host); } /* free memory */ my_free(hostgroup_names); } /* expand subgroup membership recursively */ for(temp_hostgroup = xodtemplate_hostgroup_list; temp_hostgroup; temp_hostgroup = temp_hostgroup->next) { if(xodtemplate_recombobulate_hostgroup_subgroups(temp_hostgroup) != XOD_OK) { return ERROR; } /* rejects are no longer necessary */ bitmap_destroy(temp_hostgroup->reject_map); /* make sure we don't recursively add subgroup members again */ free_objectlist(&temp_hostgroup->group_list); } return OK; } static int xodtemplate_recombobulate_servicegroup_subgroups(xodtemplate_servicegroup *temp_servicegroup) { objectlist *mlist, *glist; if(temp_servicegroup == NULL) return ERROR; if(temp_servicegroup->loop_status != XOD_NEW) return temp_servicegroup->loop_status; /* mark this as seen */ temp_servicegroup->loop_status = XOD_SEEN; for(glist = temp_servicegroup->group_list; glist; glist = glist->next) { int result; xodtemplate_servicegroup *inc = (xodtemplate_servicegroup *)glist->object_ptr; result = xodtemplate_recombobulate_servicegroup_subgroups(inc); if(result != XOD_OK) { if(result == ERROR) return ERROR; logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Servicegroups '%s' and '%s' are part of a servicegroup_members include loop\n", temp_servicegroup->servicegroup_name, inc->servicegroup_name); inc->loop_status = XOD_LOOPY; temp_servicegroup->loop_status = XOD_LOOPY; break; } for(mlist = inc->member_list; mlist; mlist = mlist->next) { xodtemplate_service *s = (xodtemplate_service *)mlist->object_ptr; if(xodtemplate_add_servicegroup_member(temp_servicegroup, s) != OK) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Failed to add service '%s' on host '%s' as a subgroup member of servicegroup '%s' from servicegroup '%s'\n", s->host_name, s->service_description, temp_servicegroup->servicegroup_name, inc->servicegroup_name); return ERROR; } } } if(temp_servicegroup->loop_status == XOD_SEEN) temp_servicegroup->loop_status = XOD_OK; return temp_servicegroup->loop_status; } /* recombobulates servicegroup definitions */ /***** THIS NEEDS TO BE CALLED AFTER OBJECTS (SERVICES) ARE RESOLVED AND DUPLICATED *****/ int xodtemplate_recombobulate_servicegroups(void) { xodtemplate_service *temp_service = NULL; xodtemplate_servicegroup *temp_servicegroup = NULL; char *servicegroup_names = NULL; char *temp_ptr; /* * expand servicegroup members. We need this to get the rejected ones * before we add members from the servicelist. */ for(temp_servicegroup = xodtemplate_servicegroup_list; temp_servicegroup; temp_servicegroup = temp_servicegroup->next) { objectlist *list, *next, *accept = NULL; if(temp_servicegroup->members == NULL && temp_servicegroup->servicegroup_members == NULL) continue; /* we'll need the member map */ if(!(temp_servicegroup->member_map = bitmap_create(xodcount.services))) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not create member map for servicegroup '%s'\n", temp_servicegroup->servicegroup_name); return ERROR; } /* resolve groups into a group-list */ if(temp_servicegroup->servicegroup_members) { xodtemplate_servicegroup *sg; char *ptr, *next_ptr = NULL; for(ptr = temp_servicegroup->servicegroup_members; ptr; ptr = next_ptr + 1) { next_ptr = strchr(ptr, ','); if(next_ptr) *next_ptr = 0; strip(ptr); if(!(sg = xodtemplate_find_real_servicegroup(ptr))) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not find member group '%s' specified in servicegroup '%s' (config file '%s', starting on line %d)\n", ptr, temp_servicegroup->servicegroup_name, xodtemplate_config_file_name(temp_servicegroup->_config_file), temp_servicegroup->_start_line); return ERROR; } add_object_to_objectlist(&temp_servicegroup->group_list, sg); if(!next_ptr) break; } my_free(temp_servicegroup->servicegroup_members); } /* move on if we have no members */ if(temp_servicegroup->members == NULL) continue; /* we might need this */ if(!use_precached_objects && !(temp_servicegroup->reject_map = bitmap_create(xodcount.services))) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not create reject map for hostgroup '%s'\n", temp_servicegroup->servicegroup_name); return ERROR; } /* get list of service members in the servicegroup */ xodtemplate_expand_services(&accept, temp_servicegroup->reject_map, NULL, temp_servicegroup->members, temp_servicegroup->_config_file, temp_servicegroup->_start_line); if(!accept && !bitmap_count_set_bits(temp_servicegroup->reject_map)) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not expand members specified in servicegroup '%s' (config file '%s', starting at line %d)\n", temp_servicegroup->servicegroup_name, xodtemplate_config_file_name(temp_servicegroup->_config_file), temp_servicegroup->_start_line); return ERROR; } /* we don't need this anymore */ my_free(temp_servicegroup->members); for(list = accept; list; list = next) { xodtemplate_service *s = (xodtemplate_service *)list->object_ptr; next = list->next; free(list); xodtemplate_add_servicegroup_member(temp_servicegroup, s); } } /* if we're using precached objects we can bail out now */ if(use_precached_objects == TRUE) return OK; /* Add services from 'servicegroups' directive */ for(temp_service = xodtemplate_service_list; temp_service != NULL; temp_service = temp_service->next) { /* skip services without servicegroup directives or service names */ if(temp_service->service_groups == NULL || temp_service->host_name == NULL || temp_service->service_description == NULL) continue; /* skip services that shouldn't be registered */ if(temp_service->register_object == FALSE) continue; /* preprocess the servicegroup list, to change "grp1,grp2,grp3,!grp2" into "grp1,grp3" */ /* 10/19/07 EG an empty return value means an error occured */ if((servicegroup_names = xodtemplate_process_servicegroup_names(temp_service->service_groups, temp_service->_config_file, temp_service->_start_line)) == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Failed to process servicegroup names for service '%s' on host '%s' (config file '%s', starting at line %d)\n", temp_service->service_description, temp_service->host_name, xodtemplate_config_file_name(temp_service->_config_file), temp_service->_start_line); return ERROR; } /* process the list of servicegroups */ for(temp_ptr = strtok(servicegroup_names, ","); temp_ptr; temp_ptr = strtok(NULL, ",")) { /* strip trailing spaces */ strip(temp_ptr); /* find the servicegroup */ temp_servicegroup = xodtemplate_find_real_servicegroup(temp_ptr); if(temp_servicegroup == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not find servicegroup '%s' specified in service '%s' on host '%s' definition (config file '%s', starting on line %d)\n", temp_ptr, temp_service->service_description, temp_service->host_name, xodtemplate_config_file_name(temp_service->_config_file), temp_service->_start_line); my_free(servicegroup_names); return ERROR; } if(!temp_servicegroup->member_map && !(temp_servicegroup->member_map = bitmap_create(xodcount.services))) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Failed to create member map for service group %s\n", temp_servicegroup->servicegroup_name); return ERROR; } /* add ourselves as members to the group */ xodtemplate_add_servicegroup_member(temp_servicegroup, temp_service); } /* free servicegroup names */ my_free(servicegroup_names); } /* expand subgroup membership recursively */ for(temp_servicegroup = xodtemplate_servicegroup_list; temp_servicegroup; temp_servicegroup = temp_servicegroup->next) { if(xodtemplate_recombobulate_servicegroup_subgroups(temp_servicegroup) != XOD_OK) { return ERROR; } /* rejects are no longer necessary */ bitmap_destroy(temp_servicegroup->reject_map); /* make sure we don't recursively add subgroup members again */ free_objectlist(&temp_servicegroup->group_list); } return OK; } /******************************************************************/ /******************* OBJECT SEARCH FUNCTIONS **********************/ /******************************************************************/ #ifdef NSCORE /* finds a specific timeperiod object */ xodtemplate_timeperiod *xodtemplate_find_timeperiod(char *name) { xodtemplate_timeperiod temp_timeperiod; if(name == NULL) return NULL; temp_timeperiod.name = name; return skiplist_find_first(xobject_template_skiplists[TIMEPERIOD_SKIPLIST], &temp_timeperiod, NULL); } /* finds a specific command object */ xodtemplate_command *xodtemplate_find_command(char *name) { xodtemplate_command temp_command; if(name == NULL) return NULL; temp_command.name = name; return skiplist_find_first(xobject_template_skiplists[COMMAND_SKIPLIST], &temp_command, NULL); } #endif /* finds a specific contactgroup object */ xodtemplate_contactgroup *xodtemplate_find_contactgroup(char *name) { xodtemplate_contactgroup temp_contactgroup; if(name == NULL) return NULL; temp_contactgroup.name = name; return skiplist_find_first(xobject_template_skiplists[CONTACTGROUP_SKIPLIST], &temp_contactgroup, NULL); } /* finds a specific contactgroup object by its REAL name, not its TEMPLATE name */ xodtemplate_contactgroup *xodtemplate_find_real_contactgroup(char *name) { xodtemplate_contactgroup temp_contactgroup; if(name == NULL) return NULL; temp_contactgroup.contactgroup_name = name; return skiplist_find_first(xobject_skiplists[CONTACTGROUP_SKIPLIST], &temp_contactgroup, NULL); } /* finds a specific hostgroup object */ xodtemplate_hostgroup *xodtemplate_find_hostgroup(char *name) { xodtemplate_hostgroup temp_hostgroup; if(name == NULL) return NULL; temp_hostgroup.name = name; return skiplist_find_first(xobject_template_skiplists[HOSTGROUP_SKIPLIST], &temp_hostgroup, NULL); } /* finds a specific hostgroup object by its REAL name, not its TEMPLATE name */ xodtemplate_hostgroup *xodtemplate_find_real_hostgroup(char *name) { xodtemplate_hostgroup temp_hostgroup; if(name == NULL) return NULL; temp_hostgroup.hostgroup_name = name; return skiplist_find_first(xobject_skiplists[HOSTGROUP_SKIPLIST], &temp_hostgroup, NULL); } /* finds a specific servicegroup object */ xodtemplate_servicegroup *xodtemplate_find_servicegroup(char *name) { xodtemplate_servicegroup temp_servicegroup; if(name == NULL) return NULL; temp_servicegroup.name = name; return skiplist_find_first(xobject_template_skiplists[SERVICEGROUP_SKIPLIST], &temp_servicegroup, NULL); } /* finds a specific servicegroup object by its REAL name, not its TEMPLATE name */ xodtemplate_servicegroup *xodtemplate_find_real_servicegroup(char *name) { xodtemplate_servicegroup temp_servicegroup; if(name == NULL) return NULL; temp_servicegroup.servicegroup_name = name; return skiplist_find_first(xobject_skiplists[SERVICEGROUP_SKIPLIST], &temp_servicegroup, NULL); } /* finds a specific servicedependency object */ xodtemplate_servicedependency *xodtemplate_find_servicedependency(char *name) { xodtemplate_servicedependency temp_servicedependency; if(name == NULL) return NULL; temp_servicedependency.name = name; return skiplist_find_first(xobject_template_skiplists[SERVICEDEPENDENCY_SKIPLIST], &temp_servicedependency, NULL); } /* finds a specific serviceescalation object */ xodtemplate_serviceescalation *xodtemplate_find_serviceescalation(char *name) { xodtemplate_serviceescalation temp_serviceescalation; if(name == NULL) return NULL; temp_serviceescalation.name = name; return skiplist_find_first(xobject_template_skiplists[SERVICEESCALATION_SKIPLIST], &temp_serviceescalation, NULL); } /* finds a specific contact object */ xodtemplate_contact *xodtemplate_find_contact(char *name) { xodtemplate_contact temp_contact; if(name == NULL) return NULL; temp_contact.name = name; return skiplist_find_first(xobject_template_skiplists[CONTACT_SKIPLIST], &temp_contact, NULL); } /* finds a specific contact object by its REAL name, not its TEMPLATE name */ xodtemplate_contact *xodtemplate_find_real_contact(char *name) { xodtemplate_contact temp_contact; if(name == NULL) return NULL; temp_contact.contact_name = name; return skiplist_find_first(xobject_skiplists[CONTACT_SKIPLIST], &temp_contact, NULL); } /* finds a specific host object */ xodtemplate_host *xodtemplate_find_host(char *name) { xodtemplate_host temp_host; if(name == NULL) return NULL; temp_host.name = name; return skiplist_find_first(xobject_template_skiplists[HOST_SKIPLIST], &temp_host, NULL); } /* finds a specific host object by its REAL name, not its TEMPLATE name */ xodtemplate_host *xodtemplate_find_real_host(char *name) { xodtemplate_host temp_host; if(name == NULL) return NULL; temp_host.host_name = name; return skiplist_find_first(xobject_skiplists[HOST_SKIPLIST], &temp_host, NULL); } /* finds a specific hostdependency object */ xodtemplate_hostdependency *xodtemplate_find_hostdependency(char *name) { xodtemplate_hostdependency temp_hostdependency; if(name == NULL) return NULL; temp_hostdependency.name = name; return skiplist_find_first(xobject_template_skiplists[HOSTDEPENDENCY_SKIPLIST], &temp_hostdependency, NULL); } /* finds a specific hostescalation object */ xodtemplate_hostescalation *xodtemplate_find_hostescalation(char *name) { xodtemplate_hostescalation temp_hostescalation; if(name == NULL) return NULL; temp_hostescalation.name = name; return skiplist_find_first(xobject_template_skiplists[HOSTESCALATION_SKIPLIST], &temp_hostescalation, NULL); } /* finds a specific hostextinfo object */ xodtemplate_hostextinfo *xodtemplate_find_hostextinfo(char *name) { xodtemplate_hostextinfo temp_hostextinfo; if(name == NULL) return NULL; temp_hostextinfo.name = name; return skiplist_find_first(xobject_template_skiplists[HOSTEXTINFO_SKIPLIST], &temp_hostextinfo, NULL); } /* finds a specific serviceextinfo object */ xodtemplate_serviceextinfo *xodtemplate_find_serviceextinfo(char *name) { xodtemplate_serviceextinfo temp_serviceextinfo; if(name == NULL) return NULL; temp_serviceextinfo.name = name; return skiplist_find_first(xobject_template_skiplists[SERVICEEXTINFO_SKIPLIST], &temp_serviceextinfo, NULL); } /* finds a specific service object */ xodtemplate_service *xodtemplate_find_service(char *name) { xodtemplate_service temp_service; if(name == NULL) return NULL; temp_service.name = name; return skiplist_find_first(xobject_template_skiplists[SERVICE_SKIPLIST], &temp_service, NULL); } /* finds a specific service object by its REAL name, not its TEMPLATE name */ xodtemplate_service *xodtemplate_find_real_service(char *host_name, char *service_description) { xodtemplate_service temp_service; if(host_name == NULL || service_description == NULL) return NULL; temp_service.host_name = host_name; temp_service.service_description = service_description; return skiplist_find_first(xobject_skiplists[SERVICE_SKIPLIST], &temp_service, NULL); } /******************************************************************/ /**************** OBJECT REGISTRATION FUNCTIONS *******************/ /******************************************************************/ static int xodtemplate_register_contactgroup_members(xodtemplate_contactgroup *this_contactgroup) { objectlist *list; struct contactgroup *cg; int num_regs = 0; if (!this_contactgroup->register_object) return 0; cg = find_contactgroup(this_contactgroup->contactgroup_name); for(list = this_contactgroup->member_list; list; list = list->next) { xodtemplate_contact *c = (xodtemplate_contact *)list->object_ptr; if (!add_contact_to_contactgroup(cg, c->contact_name)) { logit(NSLOG_CONFIG_ERROR, TRUE, "Bad member of contactgroup '%s' (config file '%s', starting on line %d)\n", cg->group_name, xodtemplate_config_file_name(this_contactgroup->_config_file), this_contactgroup->_start_line); return -1; } num_regs++; } return num_regs; } static int xodtemplate_register_hostgroup_members(xodtemplate_hostgroup *this_hostgroup) { objectlist *list; struct hostgroup *hg; int num_regs = 0; if (!this_hostgroup->register_object) return 0; hg = find_hostgroup(this_hostgroup->hostgroup_name); for(list = this_hostgroup->member_list; list; list = list->next) { xodtemplate_host *h = (xodtemplate_host *)list->object_ptr; if (!add_host_to_hostgroup(hg, h->host_name)) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Bad member of hostgroup '%s' (config file '%s', starting on line %d)\n", hg->group_name, xodtemplate_config_file_name(this_hostgroup->_config_file), this_hostgroup->_start_line); return -1; } num_regs++; } return num_regs; } static int xodtemplate_register_servicegroup_members(xodtemplate_servicegroup *this_servicegroup) { objectlist *list, *next; struct servicegroup *sg; int num_regs = 0; if (!this_servicegroup->register_object) return 0; sg = find_servicegroup(this_servicegroup->servicegroup_name); for(list = this_servicegroup->member_list; list; list = next) { xodtemplate_service *s = (xodtemplate_service *)list->object_ptr; next = list->next; if (!add_service_to_servicegroup(sg, s->host_name, s->service_description)) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Bad member of servicegroup '%s' (config file '%s', starting on line %d)\n", sg->group_name, xodtemplate_config_file_name(this_servicegroup->_config_file), this_servicegroup->_start_line); return -1; } num_regs++; } return num_regs; } /* * registers object definitions * The order goes like this: * Timeperiods * Commands * Contactgroups * Hostgroups * Servicegroups * Contacts * Hosts * Services * Servicedependencies * Serviceescalations * Hostdependencies * Hostescalations * * Why are contactgroups done before contacts? A reasonable assumption * would be that contacts should be flattened and added to the checked * objects directly rather than forcing us to fiddle with that crap * during runtime. */ int xodtemplate_register_objects(void) { unsigned int i; int mcount; xodtemplate_timeperiod *temp_timeperiod = NULL; xodtemplate_command *temp_command = NULL; xodtemplate_contactgroup *temp_contactgroup = NULL; xodtemplate_hostgroup *temp_hostgroup = NULL; xodtemplate_servicegroup *temp_servicegroup = NULL; xodtemplate_contact *temp_contact = NULL; xodtemplate_host *temp_host = NULL; xodtemplate_service *temp_service = NULL; void *ptr = NULL; xodtemplate_hostdependency *hd, *next_hd; xodtemplate_hostescalation *he, *next_he; xodtemplate_servicedependency *sd, *next_sd; xodtemplate_serviceescalation *se, *next_se; unsigned int ocount[NUM_OBJECT_SKIPLISTS]; unsigned int tot_members = 0; for (i = 0; i < ARRAY_SIZE(ocount); i++) { ocount[i] = (unsigned int)skiplist_num_items(xobject_skiplists[i]); } /* dependencies are handled specially */ ocount[SERVICEDEPENDENCY_SKIPLIST] = 0; ocount[HOSTDEPENDENCY_SKIPLIST] = 0; ocount[HOSTESCALATION_SKIPLIST] = xodcount.hostescalations; ocount[SERVICEESCALATION_SKIPLIST] = xodcount.serviceescalations; if (create_object_tables(ocount) != OK) { logit(NSLOG_CONFIG_ERROR, TRUE, "Failed to create object tables\n"); return ERROR; } /* register timeperiods */ ptr = NULL; for(temp_timeperiod = (xodtemplate_timeperiod *)skiplist_get_first(xobject_skiplists[TIMEPERIOD_SKIPLIST], &ptr); temp_timeperiod != NULL; temp_timeperiod = (xodtemplate_timeperiod *)skiplist_get_next(&ptr)) { if(xodtemplate_register_timeperiod(temp_timeperiod) == ERROR) return ERROR; } timing_point("%u timeperiods registered\n", num_objects.timeperiods); /* register commands */ ptr = NULL; for(temp_command = (xodtemplate_command *)skiplist_get_first(xobject_skiplists[COMMAND_SKIPLIST], &ptr); temp_command != NULL; temp_command = (xodtemplate_command *)skiplist_get_next(&ptr)) { if(xodtemplate_register_command(temp_command) == ERROR) return ERROR; } timing_point("%u commands registered\n", num_objects.commands); /* register contactgroups */ ptr = NULL; for(temp_contactgroup = (xodtemplate_contactgroup *)skiplist_get_first(xobject_skiplists[CONTACTGROUP_SKIPLIST], &ptr); temp_contactgroup != NULL; temp_contactgroup = (xodtemplate_contactgroup *)skiplist_get_next(&ptr)) { if(xodtemplate_register_contactgroup(temp_contactgroup) == ERROR) return ERROR; } timing_point("%u contactgroups registered\n", num_objects.contactgroups); /* register hostgroups */ ptr = NULL; for(temp_hostgroup = (xodtemplate_hostgroup *)skiplist_get_first(xobject_skiplists[HOSTGROUP_SKIPLIST], &ptr); temp_hostgroup != NULL; temp_hostgroup = (xodtemplate_hostgroup *)skiplist_get_next(&ptr)) { if(xodtemplate_register_hostgroup(temp_hostgroup) == ERROR) return ERROR; } timing_point("%u hostgroups registered\n", num_objects.hostgroups); /* register servicegroups */ ptr = NULL; for(temp_servicegroup = (xodtemplate_servicegroup *)skiplist_get_first(xobject_skiplists[SERVICEGROUP_SKIPLIST], &ptr); temp_servicegroup != NULL; temp_servicegroup = (xodtemplate_servicegroup *)skiplist_get_next(&ptr)) { if(xodtemplate_register_servicegroup(temp_servicegroup) == ERROR) return ERROR; } timing_point("%u servicegroups registered\n", num_objects.servicegroups); /* register contacts */ ptr = NULL; for(temp_contact = (xodtemplate_contact *)skiplist_get_first(xobject_skiplists[CONTACT_SKIPLIST], &ptr); temp_contact != NULL; temp_contact = (xodtemplate_contact *)skiplist_get_next(&ptr)) { if(xodtemplate_register_contact(temp_contact) == ERROR) return ERROR; } timing_point("%u contacts registered\n", num_objects.contacts); /* register hosts */ ptr = NULL; for(temp_host = (xodtemplate_host *)skiplist_get_first(xobject_skiplists[HOST_SKIPLIST], &ptr); temp_host != NULL; temp_host = (xodtemplate_host *)skiplist_get_next(&ptr)) { if(xodtemplate_register_host(temp_host) == ERROR) return ERROR; } timing_point("%u hosts registered\n", num_objects.hosts); /* register services */ ptr = NULL; for(temp_service = (xodtemplate_service *)skiplist_get_first(xobject_skiplists[SERVICE_SKIPLIST], &ptr); temp_service != NULL; temp_service = (xodtemplate_service *)skiplist_get_next(&ptr)) { if(xodtemplate_register_service(temp_service) == ERROR) return ERROR; } timing_point("%u services registered\n", num_objects.services); /* groups and objects are registered, so join them up */ /* register contactgroup members */ ptr = NULL; tot_members = 0; for(temp_contactgroup = (xodtemplate_contactgroup *)skiplist_get_first(xobject_skiplists[CONTACTGROUP_SKIPLIST], &ptr); temp_contactgroup != NULL; temp_contactgroup = (xodtemplate_contactgroup *)skiplist_get_next(&ptr)) { if((mcount = xodtemplate_register_contactgroup_members(temp_contactgroup)) < 0) return ERROR; tot_members += mcount; } timing_point("%u contactgroup memberships registered\n", tot_members); /* register hostgroup members */ ptr = NULL; tot_members = 0; for(temp_hostgroup = (xodtemplate_hostgroup *)skiplist_get_first(xobject_skiplists[HOSTGROUP_SKIPLIST], &ptr); temp_hostgroup != NULL; temp_hostgroup = (xodtemplate_hostgroup *)skiplist_get_next(&ptr)) { if((mcount = xodtemplate_register_hostgroup_members(temp_hostgroup)) < 0) return ERROR; tot_members += mcount; } timing_point("%u hostgroup memberships registered\n", tot_members); /* register servicegroup members */ ptr = NULL; tot_members = 0; for(temp_servicegroup = (xodtemplate_servicegroup *)skiplist_get_first(xobject_skiplists[SERVICEGROUP_SKIPLIST], &ptr); temp_servicegroup != NULL; temp_servicegroup = (xodtemplate_servicegroup *)skiplist_get_next(&ptr)) { if((mcount = xodtemplate_register_servicegroup_members(temp_servicegroup)) < 0) return ERROR; tot_members += mcount; } timing_point("%u servicegroup memberships registered\n", tot_members); /* * These aren't in skiplists at all, but it's safe to destroy * them as we go along, since all dupes are at the head of the list */ if(xodtemplate_servicedependency_list) { parent_map = bitmap_create(xodcount.services); if(!parent_map) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Failed to create parent bitmap for service dependencies\n"); return ERROR; } for(sd = xodtemplate_servicedependency_list; sd; sd = next_sd) { next_sd = sd->next; #ifdef NSCGI if(xodtemplate_register_servicedependency(sd) == ERROR) return ERROR; #else if(xodtemplate_register_and_destroy_servicedependency(sd) == ERROR) return ERROR; #endif } bitmap_destroy(parent_map); parent_map = NULL; } timing_point("%u unique / %u total servicedependencies registered\n", num_objects.servicedependencies, xodcount.servicedependencies); for(se = xodtemplate_serviceescalation_list; se; se = next_se) { next_se = se->next; if(xodtemplate_register_and_destroy_serviceescalation(se) == ERROR) return ERROR; } timing_point("%u serviceescalations registered\n", num_objects.serviceescalations); for(hd = xodtemplate_hostdependency_list; hd; hd = next_hd) { next_hd = hd->next; #ifdef NSCGI if(xodtemplate_register_hostdependency(hd) == ERROR) return ERROR; #else if(xodtemplate_register_and_destroy_hostdependency(hd) == ERROR) return ERROR; #endif } timing_point("%u unique / %u total hostdependencies registered\n", num_objects.hostdependencies, xodcount.hostdependencies); for(he = xodtemplate_hostescalation_list; he; he = next_he) { next_he = he->next; if(xodtemplate_register_and_destroy_hostescalation(he) == ERROR) return ERROR; } timing_point("%u hostescalations registered\n", num_objects.hostescalations); return OK; } /* registers a timeperiod definition */ int xodtemplate_register_timeperiod(xodtemplate_timeperiod *this_timeperiod) { xodtemplate_daterange *temp_daterange = NULL; timeperiod *new_timeperiod = NULL; daterange *new_daterange = NULL; timerange *new_timerange = NULL; timeperiodexclusion *new_timeperiodexclusion = NULL; int day = 0; int range = 0; int x = 0; char *day_range_ptr = NULL; char *day_range_start_buffer = NULL; char *temp_ptr = NULL; unsigned long range_start_time = 0L; unsigned long range_end_time = 0L; /* bail out if we shouldn't register this object */ if(this_timeperiod->register_object == FALSE) return OK; /* add the timeperiod */ new_timeperiod = add_timeperiod(this_timeperiod->timeperiod_name, this_timeperiod->alias); /* return with an error if we couldn't add the timeperiod */ if(new_timeperiod == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not register timeperiod (config file '%s', starting on line %d)\n", xodtemplate_config_file_name(this_timeperiod->_config_file), this_timeperiod->_start_line); return ERROR; } /* add all exceptions to timeperiod */ for(x = 0; x < DATERANGE_TYPES; x++) { for(temp_daterange = this_timeperiod->exceptions[x]; temp_daterange != NULL; temp_daterange = temp_daterange->next) { /* skip null entries */ if(temp_daterange->timeranges == NULL || !strcmp(temp_daterange->timeranges, XODTEMPLATE_NULL)) continue; /* add new exception to timeperiod */ new_daterange = add_exception_to_timeperiod(new_timeperiod, temp_daterange->type, temp_daterange->syear, temp_daterange->smon, temp_daterange->smday, temp_daterange->swday, temp_daterange->swday_offset, temp_daterange->eyear, temp_daterange->emon, temp_daterange->emday, temp_daterange->ewday, temp_daterange->ewday_offset, temp_daterange->skip_interval); if(new_daterange == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not add date exception to timeperiod (config file '%s', starting on line %d)\n", xodtemplate_config_file_name(this_timeperiod->_config_file), this_timeperiod->_start_line); return ERROR; } /* add timeranges to exception */ day_range_ptr = temp_daterange->timeranges; range = 0; for(day_range_start_buffer = my_strsep(&day_range_ptr, ", "); day_range_start_buffer != NULL; day_range_start_buffer = my_strsep(&day_range_ptr, ", ")) { range++; /* get time ranges */ if(xodtemplate_get_time_ranges(day_range_start_buffer, &range_start_time, &range_end_time) == ERROR) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not parse timerange #%d of timeperiod (config file '%s', starting on line %d)\n", range, xodtemplate_config_file_name(this_timeperiod->_config_file), this_timeperiod->_start_line); return ERROR; } /* add the new time range to the date range */ new_timerange = add_timerange_to_daterange(new_daterange, range_start_time, range_end_time); if(new_timerange == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not add timerange #%d to timeperiod (config file '%s', starting on line %d)\n", range, xodtemplate_config_file_name(this_timeperiod->_config_file), this_timeperiod->_start_line); return ERROR; } } } } /* add all necessary timeranges to timeperiod */ for(day = 0; day < 7; day++) { /* skip null entries */ if(this_timeperiod->timeranges[day] == NULL || !strcmp(this_timeperiod->timeranges[day], XODTEMPLATE_NULL)) continue; day_range_ptr = this_timeperiod->timeranges[day]; range = 0; for(day_range_start_buffer = my_strsep(&day_range_ptr, ", "); day_range_start_buffer != NULL; day_range_start_buffer = my_strsep(&day_range_ptr, ", ")) { range++; /* get time ranges */ if(xodtemplate_get_time_ranges(day_range_start_buffer, &range_start_time, &range_end_time) == ERROR) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not parse timerange #%d for day %d of timeperiod (config file '%s', starting on line %d)\n", range, day, xodtemplate_config_file_name(this_timeperiod->_config_file), this_timeperiod->_start_line); return ERROR; } /* add the new time range to the time period */ new_timerange = add_timerange_to_timeperiod(new_timeperiod, day, range_start_time, range_end_time); if(new_timerange == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not add timerange #%d for day %d to timeperiod (config file '%s', starting on line %d)\n", range, day, xodtemplate_config_file_name(this_timeperiod->_config_file), this_timeperiod->_start_line); return ERROR; } } } /* add timeperiod exclusions */ if(this_timeperiod->exclusions) { for(temp_ptr = strtok(this_timeperiod->exclusions, ","); temp_ptr != NULL; temp_ptr = strtok(NULL, ",")) { strip(temp_ptr); new_timeperiodexclusion = add_exclusion_to_timeperiod(new_timeperiod, temp_ptr); if(new_timeperiodexclusion == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not add excluded timeperiod '%s' to timeperiod (config file '%s', starting on line %d)\n", temp_ptr, xodtemplate_config_file_name(this_timeperiod->_config_file), this_timeperiod->_start_line); return ERROR; } } } return OK; } /* parses timerange string into start and end minutes */ int xodtemplate_get_time_ranges(char *buf, unsigned long *range_start, unsigned long *range_end) { char *range_ptr = NULL; char *range_buffer = NULL; char *time_ptr = NULL; char *time_buffer = NULL; int hours = 0; int minutes = 0; if(buf == NULL || range_start == NULL || range_end == NULL) return ERROR; range_ptr = buf; range_buffer = my_strsep(&range_ptr, "-"); if(range_buffer == NULL) return ERROR; time_ptr = range_buffer; time_buffer = my_strsep(&time_ptr, ":"); if(time_buffer == NULL) return ERROR; hours = atoi(time_buffer); time_buffer = my_strsep(&time_ptr, ":"); if(time_buffer == NULL) return ERROR; minutes = atoi(time_buffer); /* calculate the range start time in seconds */ *range_start = (unsigned long)((minutes * 60) + (hours * 60 * 60)); range_buffer = my_strsep(&range_ptr, "-"); if(range_buffer == NULL) return ERROR; time_ptr = range_buffer; time_buffer = my_strsep(&time_ptr, ":"); if(time_buffer == NULL) return ERROR; hours = atoi(time_buffer); time_buffer = my_strsep(&time_ptr, ":"); if(time_buffer == NULL) return ERROR; minutes = atoi(time_buffer); /* calculate the range end time in seconds */ *range_end = (unsigned long)((minutes * 60) + (hours * 3600)); return OK; } /* registers a command definition */ int xodtemplate_register_command(xodtemplate_command *this_command) { command *new_command = NULL; /* bail out if we shouldn't register this object */ if(this_command->register_object == FALSE) return OK; /* add the command */ new_command = add_command(this_command->command_name, this_command->command_line); /* return with an error if we couldn't add the command */ if(new_command == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not register command (config file '%s', starting on line %d)\n", xodtemplate_config_file_name(this_command->_config_file), this_command->_start_line); return ERROR; } return OK; } /* registers a contactgroup definition */ int xodtemplate_register_contactgroup(xodtemplate_contactgroup *this_contactgroup) { contactgroup *new_contactgroup = NULL; /* bail out if we shouldn't register this object */ if(this_contactgroup->register_object == FALSE) return OK; /* add the contact group */ new_contactgroup = add_contactgroup(this_contactgroup->contactgroup_name, this_contactgroup->alias); /* return with an error if we couldn't add the contactgroup */ if(new_contactgroup == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not register contactgroup (config file '%s', starting on line %d)\n", xodtemplate_config_file_name(this_contactgroup->_config_file), this_contactgroup->_start_line); return ERROR; } return OK; } /* registers a hostgroup definition */ int xodtemplate_register_hostgroup(xodtemplate_hostgroup *this_hostgroup) { hostgroup *new_hostgroup = NULL; /* bail out if we shouldn't register this object */ if(this_hostgroup->register_object == FALSE) return OK; /* add the host group */ new_hostgroup = add_hostgroup(this_hostgroup->hostgroup_name, this_hostgroup->alias, this_hostgroup->notes, this_hostgroup->notes_url, this_hostgroup->action_url); /* return with an error if we couldn't add the hostgroup */ if(new_hostgroup == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not register hostgroup (config file '%s', starting on line %d)\n", xodtemplate_config_file_name(this_hostgroup->_config_file), this_hostgroup->_start_line); return ERROR; } return OK; } /* registers a servicegroup definition */ int xodtemplate_register_servicegroup(xodtemplate_servicegroup *this_servicegroup) { servicegroup *new_servicegroup = NULL; /* bail out if we shouldn't register this object */ if(this_servicegroup->register_object == FALSE) return OK; /* add the service group */ new_servicegroup = add_servicegroup(this_servicegroup->servicegroup_name, this_servicegroup->alias, this_servicegroup->notes, this_servicegroup->notes_url, this_servicegroup->action_url); /* return with an error if we couldn't add the servicegroup */ if(new_servicegroup == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not register servicegroup (config file '%s', starting on line %d)\n", xodtemplate_config_file_name(this_servicegroup->_config_file), this_servicegroup->_start_line); return ERROR; } return OK; } /* registers a servicedependency definition */ int xodtemplate_register_servicedependency(xodtemplate_servicedependency *this_servicedependency) { servicedependency *new_servicedependency = NULL; /* bail out if we shouldn't register this object */ if(this_servicedependency->register_object == FALSE) return OK; /* throw a warning on servicedeps that have no options */ if(this_servicedependency->have_notification_failure_options == FALSE && this_servicedependency->have_execution_failure_options == FALSE) { logit(NSLOG_CONFIG_WARNING, TRUE, "Warning: Ignoring lame service dependency (config file '%s', line %d)\n", xodtemplate_config_file_name(this_servicedependency->_config_file), this_servicedependency->_start_line); return OK; } /* add the servicedependency */ if(this_servicedependency->have_execution_failure_options == TRUE) { xodcount.servicedependencies++; new_servicedependency = add_service_dependency(this_servicedependency->dependent_host_name, this_servicedependency->dependent_service_description, this_servicedependency->host_name, this_servicedependency->service_description, EXECUTION_DEPENDENCY, this_servicedependency->inherits_parent, this_servicedependency->execution_failure_options, this_servicedependency->dependency_period); /* return with an error if we couldn't add the servicedependency */ if(new_servicedependency == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not register service execution dependency (config file '%s', starting on line %d)\n", xodtemplate_config_file_name(this_servicedependency->_config_file), this_servicedependency->_start_line); return ERROR; } } if(this_servicedependency->have_notification_failure_options == TRUE) { xodcount.servicedependencies++; new_servicedependency = add_service_dependency(this_servicedependency->dependent_host_name, this_servicedependency->dependent_service_description, this_servicedependency->host_name, this_servicedependency->service_description, NOTIFICATION_DEPENDENCY, this_servicedependency->inherits_parent, this_servicedependency->notification_failure_options, this_servicedependency->dependency_period); /* return with an error if we couldn't add the servicedependency */ if(new_servicedependency == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not register service notification dependency (config file '%s', starting on line %d)\n", xodtemplate_config_file_name(this_servicedependency->_config_file), this_servicedependency->_start_line); return ERROR; } } return OK; } /* registers a serviceescalation definition */ int xodtemplate_register_serviceescalation(xodtemplate_serviceescalation *this_serviceescalation) { serviceescalation *new_serviceescalation = NULL; contactsmember *new_contactsmember = NULL; contactgroupsmember *new_contactgroupsmember = NULL; char *contact_name = NULL; char *contact_group = NULL; /* bail out if we shouldn't register this object */ if(this_serviceescalation->register_object == FALSE) return OK; /* default options if none specified */ if(this_serviceescalation->have_escalation_options == FALSE) { this_serviceescalation->escalation_options = OPT_ALL; } /* add the serviceescalation */ new_serviceescalation = add_serviceescalation(this_serviceescalation->host_name, this_serviceescalation->service_description, this_serviceescalation->first_notification, this_serviceescalation->last_notification, this_serviceescalation->notification_interval, this_serviceescalation->escalation_period, this_serviceescalation->escalation_options); /* return with an error if we couldn't add the serviceescalation */ if(new_serviceescalation == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not register service escalation (config file '%s', starting on line %d)\n", xodtemplate_config_file_name(this_serviceescalation->_config_file), this_serviceescalation->_start_line); return ERROR; } /* add the contact groups */ if(this_serviceescalation->contact_groups != NULL) { for(contact_group = strtok(this_serviceescalation->contact_groups, ","); contact_group != NULL; contact_group = strtok(NULL, ",")) { strip(contact_group); new_contactgroupsmember = add_contactgroup_to_serviceescalation(new_serviceescalation, contact_group); if(new_contactgroupsmember == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not add contactgroup '%s' to service escalation (config file '%s', starting on line %d)\n", contact_group, xodtemplate_config_file_name(this_serviceescalation->_config_file), this_serviceescalation->_start_line); return ERROR; } } } /* add the contacts */ if(this_serviceescalation->contacts != NULL) { for(contact_name = strtok(this_serviceescalation->contacts, ","); contact_name != NULL; contact_name = strtok(NULL, ",")) { strip(contact_name); new_contactsmember = add_contact_to_serviceescalation(new_serviceescalation, contact_name); if(new_contactsmember == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not add contact '%s' to service escalation (config file '%s', starting on line %d)\n", contact_name, xodtemplate_config_file_name(this_serviceescalation->_config_file), this_serviceescalation->_start_line); return ERROR; } } } return OK; } /* registers a contact definition */ int xodtemplate_register_contact(xodtemplate_contact *this_contact) { contact *new_contact = NULL; char *command_name = NULL; commandsmember *new_commandsmember = NULL; xodtemplate_customvariablesmember *temp_customvariablesmember = NULL; /* bail out if we shouldn't register this object */ if(this_contact->register_object == FALSE) return OK; /* add the contact */ new_contact = add_contact(this_contact->contact_name, this_contact->alias, this_contact->email, this_contact->pager, this_contact->address, this_contact->service_notification_period, this_contact->host_notification_period, this_contact->service_notification_options, this_contact->host_notification_options, this_contact->host_notifications_enabled, this_contact->service_notifications_enabled, this_contact->can_submit_commands, this_contact->retain_status_information, this_contact->retain_nonstatus_information, this_contact->minimum_value); /* return with an error if we couldn't add the contact */ if(new_contact == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not register contact (config file '%s', starting on line %d)\n", xodtemplate_config_file_name(this_contact->_config_file), this_contact->_start_line); return ERROR; } /* add all the host notification commands */ if(this_contact->host_notification_commands != NULL) { for(command_name = strtok(this_contact->host_notification_commands, ", "); command_name != NULL; command_name = strtok(NULL, ", ")) { new_commandsmember = add_host_notification_command_to_contact(new_contact, command_name); if(new_commandsmember == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not add host notification command '%s' to contact (config file '%s', starting on line %d)\n", command_name, xodtemplate_config_file_name(this_contact->_config_file), this_contact->_start_line); return ERROR; } } } /* add all the service notification commands */ if(this_contact->service_notification_commands != NULL) { for(command_name = strtok(this_contact->service_notification_commands, ", "); command_name != NULL; command_name = strtok(NULL, ", ")) { new_commandsmember = add_service_notification_command_to_contact(new_contact, command_name); if(new_commandsmember == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not add service notification command '%s' to contact (config file '%s', starting on line %d)\n", command_name, xodtemplate_config_file_name(this_contact->_config_file), this_contact->_start_line); return ERROR; } } } /* add all custom variables */ for(temp_customvariablesmember = this_contact->custom_variables; temp_customvariablesmember != NULL; temp_customvariablesmember = temp_customvariablesmember->next) { if((add_custom_variable_to_contact(new_contact, temp_customvariablesmember->variable_name, temp_customvariablesmember->variable_value)) == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not custom variable to contact (config file '%s', starting on line %d)\n", xodtemplate_config_file_name(this_contact->_config_file), this_contact->_start_line); return ERROR; } } return OK; } /* registers a host definition */ int xodtemplate_register_host(xodtemplate_host *this_host) { host *new_host = NULL; char *parent_host = NULL; hostsmember *new_hostsmember = NULL; contactsmember *new_contactsmember = NULL; contactgroupsmember *new_contactgroupsmember = NULL; char *contact_name = NULL; char *contact_group = NULL; xodtemplate_customvariablesmember *temp_customvariablesmember = NULL; /* bail out if we shouldn't register this object */ if(this_host->register_object == FALSE) return OK; /* add the host definition */ new_host = add_host(this_host->host_name, this_host->display_name, this_host->alias, this_host->address, this_host->check_period, this_host->initial_state, this_host->check_interval, this_host->retry_interval, this_host->max_check_attempts, this_host->notification_options, this_host->notification_interval, this_host->first_notification_delay, this_host->notification_period, this_host->notifications_enabled, this_host->check_command, this_host->active_checks_enabled, this_host->passive_checks_enabled, this_host->event_handler, this_host->event_handler_enabled, this_host->flap_detection_enabled, this_host->low_flap_threshold, this_host->high_flap_threshold, this_host->flap_detection_options, this_host->stalking_options, this_host->process_perf_data, this_host->check_freshness, this_host->freshness_threshold, this_host->notes, this_host->notes_url, this_host->action_url, this_host->icon_image, this_host->icon_image_alt, this_host->vrml_image, this_host->statusmap_image, this_host->x_2d, this_host->y_2d, this_host->have_2d_coords, this_host->x_3d, this_host->y_3d, this_host->z_3d, this_host->have_3d_coords, TRUE, this_host->retain_status_information, this_host->retain_nonstatus_information, this_host->obsess, this_host->hourly_value); /* return with an error if we couldn't add the host */ if(new_host == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not register host (config file '%s', starting on line %d)\n", xodtemplate_config_file_name(this_host->_config_file), this_host->_start_line); return ERROR; } /* add the parent hosts */ if(this_host->parents != NULL) { for(parent_host = strtok(this_host->parents, ","); parent_host != NULL; parent_host = strtok(NULL, ",")) { strip(parent_host); new_hostsmember = add_parent_host_to_host(new_host, parent_host); if(new_hostsmember == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not add parent host '%s' to host (config file '%s', starting on line %d)\n", parent_host, xodtemplate_config_file_name(this_host->_config_file), this_host->_start_line); return ERROR; } } } /* add all contact groups to the host */ if(this_host->contact_groups != NULL) { for(contact_group = strtok(this_host->contact_groups, ","); contact_group != NULL; contact_group = strtok(NULL, ",")) { strip(contact_group); new_contactgroupsmember = add_contactgroup_to_host(new_host, contact_group); if(new_contactgroupsmember == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not add contactgroup '%s' to host (config file '%s', starting on line %d)\n", contact_group, xodtemplate_config_file_name(this_host->_config_file), this_host->_start_line); return ERROR; } } } /* add all contacts to the host */ if(this_host->contacts != NULL) { for(contact_name = strtok(this_host->contacts, ","); contact_name != NULL; contact_name = strtok(NULL, ",")) { strip(contact_name); new_contactsmember = add_contact_to_host(new_host, contact_name); if(new_contactsmember == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not add contact '%s' to host (config file '%s', starting on line %d)\n", contact_name, xodtemplate_config_file_name(this_host->_config_file), this_host->_start_line); return ERROR; } } } /* add all custom variables */ for(temp_customvariablesmember = this_host->custom_variables; temp_customvariablesmember != NULL; temp_customvariablesmember = temp_customvariablesmember->next) { if((add_custom_variable_to_host(new_host, temp_customvariablesmember->variable_name, temp_customvariablesmember->variable_value)) == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not custom variable to host (config file '%s', starting on line %d)\n", xodtemplate_config_file_name(this_host->_config_file), this_host->_start_line); return ERROR; } } return OK; } /* registers a service definition */ int xodtemplate_register_service(xodtemplate_service *this_service) { service *new_service = NULL; contactsmember *new_contactsmember = NULL; contactgroupsmember *new_contactgroupsmember = NULL; char *contact_name = NULL; char *contact_group = NULL; xodtemplate_customvariablesmember *temp_customvariablesmember = NULL; /* bail out if we shouldn't register this object */ if(this_service->register_object == FALSE) return OK; /* add the service */ new_service = add_service(this_service->host_name, this_service->service_description, this_service->display_name, this_service->check_period, this_service->initial_state, this_service->max_check_attempts, this_service->parallelize_check, this_service->passive_checks_enabled, this_service->check_interval, this_service->retry_interval, this_service->notification_interval, this_service->first_notification_delay, this_service->notification_period, this_service->notification_options, this_service->notifications_enabled, this_service->is_volatile, this_service->event_handler, this_service->event_handler_enabled, this_service->check_command, this_service->active_checks_enabled, this_service->flap_detection_enabled, this_service->low_flap_threshold, this_service->high_flap_threshold, this_service->flap_detection_options, this_service->stalking_options, this_service->process_perf_data, this_service->check_freshness, this_service->freshness_threshold, this_service->notes, this_service->notes_url, this_service->action_url, this_service->icon_image, this_service->icon_image_alt, this_service->retain_status_information, this_service->retain_nonstatus_information, this_service->obsess, this_service->hourly_value); /* return with an error if we couldn't add the service */ if(new_service == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not register service (config file '%s', starting on line %d)\n", xodtemplate_config_file_name(this_service->_config_file), this_service->_start_line); return ERROR; } /* add all service parents */ if(this_service->parents != NULL) { servicesmember *new_servicesmember; char *comma = strchr(this_service->parents, ','); if(!comma) { /* same-host single-service parent */ new_servicesmember = add_parent_service_to_service(new_service, new_service->host_name, this_service->parents); if(new_servicesmember == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not add same-host service parent '%s' to service (config file '%s', starting on line %d)\n", this_service->parents, xodtemplate_config_file_name(this_service->_config_file), this_service->_start_line); return ERROR; } } else { /* Multiple parents, so let's do this the hard way */ objectlist *list = NULL, *next; bitmap_clear(service_map); if(xodtemplate_expand_services(&list, service_map, NULL, this_service->parents, this_service->_config_file, this_service->_start_line) != OK) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Failed to expand service parents (config file '%s', starting at line %d)\n", xodtemplate_config_file_name(this_service->_config_file), this_service->_start_line); return ERROR; } for(; list; list = next) { xodtemplate_service *parent = (xodtemplate_service *)list->object_ptr; next = list->next; free(list); new_servicesmember = add_parent_service_to_service(new_service, parent->host_name, parent->service_description); if(new_servicesmember == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not add service '%s' on host '%s' as parent to service '%s' on host '%s' (config file '%s', starting on line %d)\n", parent->host_name, parent->service_description, new_service->host_name, new_service->description, xodtemplate_config_file_name(this_service->_config_file), this_service->_start_line); free_objectlist(&next); return ERROR; } } } } /* add all contact groups to the service */ if(this_service->contact_groups != NULL) { for(contact_group = strtok(this_service->contact_groups, ","); contact_group != NULL; contact_group = strtok(NULL, ",")) { strip(contact_group); new_contactgroupsmember = add_contactgroup_to_service(new_service, contact_group); if(new_contactgroupsmember == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not add contactgroup '%s' to service (config file '%s', starting on line %d)\n", contact_group, xodtemplate_config_file_name(this_service->_config_file), this_service->_start_line); return ERROR; } } } /* add all the contacts to the service */ if(this_service->contacts != NULL) { for(contact_name = strtok(this_service->contacts, ","); contact_name != NULL; contact_name = strtok(NULL, ",")) { /* add this contact to the service definition */ strip(contact_name); new_contactsmember = add_contact_to_service(new_service, contact_name); /* stop adding contacts if we ran into an error */ if(new_contactsmember == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not add contact '%s' to service (config file '%s', starting on line %d)\n", contact_name, xodtemplate_config_file_name(this_service->_config_file), this_service->_start_line); return ERROR; } } } /* add all custom variables */ for(temp_customvariablesmember = this_service->custom_variables; temp_customvariablesmember != NULL; temp_customvariablesmember = temp_customvariablesmember->next) { if((add_custom_variable_to_service(new_service, temp_customvariablesmember->variable_name, temp_customvariablesmember->variable_value)) == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not custom variable to service (config file '%s', starting on line %d)\n", xodtemplate_config_file_name(this_service->_config_file), this_service->_start_line); return ERROR; } } return OK; } /* registers a hostdependency definition */ int xodtemplate_register_hostdependency(xodtemplate_hostdependency *this_hostdependency) { hostdependency *new_hostdependency = NULL; /* bail out if we shouldn't register this object */ if(this_hostdependency->register_object == FALSE) return OK; /* add the host execution dependency */ if(this_hostdependency->have_execution_failure_options == TRUE) { xodcount.hostdependencies++; new_hostdependency = add_host_dependency(this_hostdependency->dependent_host_name, this_hostdependency->host_name, EXECUTION_DEPENDENCY, this_hostdependency->inherits_parent, this_hostdependency->execution_failure_options, this_hostdependency->dependency_period); /* return with an error if we couldn't add the hostdependency */ if(new_hostdependency == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not register host execution dependency (config file '%s', starting on line %d)\n", xodtemplate_config_file_name(this_hostdependency->_config_file), this_hostdependency->_start_line); return ERROR; } } /* add the host notification dependency */ if(this_hostdependency->have_notification_failure_options == TRUE) { xodcount.hostdependencies++; new_hostdependency = add_host_dependency(this_hostdependency->dependent_host_name, this_hostdependency->host_name, NOTIFICATION_DEPENDENCY, this_hostdependency->inherits_parent, this_hostdependency->notification_failure_options, this_hostdependency->dependency_period); /* return with an error if we couldn't add the hostdependency */ if(new_hostdependency == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not register host notification dependency (config file '%s', starting on line %d)\n", xodtemplate_config_file_name(this_hostdependency->_config_file), this_hostdependency->_start_line); return ERROR; } } return OK; } /* registers a hostescalation definition */ int xodtemplate_register_hostescalation(xodtemplate_hostescalation *this_hostescalation) { hostescalation *new_hostescalation = NULL; contactsmember *new_contactsmember = NULL; contactgroupsmember *new_contactgroupsmember = NULL; char *contact_name = NULL; char *contact_group = NULL; /* bail out if we shouldn't register this object */ if(this_hostescalation->register_object == FALSE) return OK; /* default options if none specified */ if(this_hostescalation->have_escalation_options == FALSE) { this_hostescalation->escalation_options = OPT_ALL; } /* add the hostescalation */ new_hostescalation = add_hostescalation(this_hostescalation->host_name, this_hostescalation->first_notification, this_hostescalation->last_notification, this_hostescalation->notification_interval, this_hostescalation->escalation_period, this_hostescalation->escalation_options); /* return with an error if we couldn't add the hostescalation */ if(new_hostescalation == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not register host escalation (config file '%s', starting on line %d)\n", xodtemplate_config_file_name(this_hostescalation->_config_file), this_hostescalation->_start_line); return ERROR; } /* add all contact groups */ if(this_hostescalation->contact_groups != NULL) { for(contact_group = strtok(this_hostescalation->contact_groups, ","); contact_group != NULL; contact_group = strtok(NULL, ",")) { strip(contact_group); new_contactgroupsmember = add_contactgroup_to_hostescalation(new_hostescalation, contact_group); if(new_contactgroupsmember == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not add contactgroup '%s' to host escalation (config file '%s', starting on line %d)\n", contact_group, xodtemplate_config_file_name(this_hostescalation->_config_file), this_hostescalation->_start_line); return ERROR; } } } /* add the contacts */ if(this_hostescalation->contacts != NULL) { for(contact_name = strtok(this_hostescalation->contacts, ","); contact_name != NULL; contact_name = strtok(NULL, ",")) { strip(contact_name); new_contactsmember = add_contact_to_hostescalation(new_hostescalation, contact_name); if(new_contactsmember == NULL) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not add contact '%s' to host escalation (config file '%s', starting on line %d)\n", contact_name, xodtemplate_config_file_name(this_hostescalation->_config_file), this_hostescalation->_start_line); return ERROR; } } } return OK; } /******************************************************************/ /*********************** MERGE FUNCTIONS **************************/ /******************************************************************/ #ifdef NSCORE /* merges a service extinfo definition */ int xodtemplate_merge_service_extinfo_object(xodtemplate_service *this_service, xodtemplate_serviceextinfo *this_serviceextinfo) { if(this_service == NULL || this_serviceextinfo == NULL) return ERROR; if(this_service->notes == NULL && this_serviceextinfo->notes != NULL) this_service->notes = strdup(this_serviceextinfo->notes); if(this_service->notes_url == NULL && this_serviceextinfo->notes_url != NULL) this_service->notes_url = strdup(this_serviceextinfo->notes_url); if(this_service->action_url == NULL && this_serviceextinfo->action_url != NULL) this_service->action_url = strdup(this_serviceextinfo->action_url); if(this_service->icon_image == NULL && this_serviceextinfo->icon_image != NULL) this_service->icon_image = strdup(this_serviceextinfo->icon_image); if(this_service->icon_image_alt == NULL && this_serviceextinfo->icon_image_alt != NULL) this_service->icon_image_alt = strdup(this_serviceextinfo->icon_image_alt); return OK; } /* merges a host extinfo definition */ int xodtemplate_merge_host_extinfo_object(xodtemplate_host *this_host, xodtemplate_hostextinfo *this_hostextinfo) { if(this_host == NULL || this_hostextinfo == NULL) return ERROR; if(this_host->notes == NULL && this_hostextinfo->notes != NULL) this_host->notes = strdup(this_hostextinfo->notes); if(this_host->notes_url == NULL && this_hostextinfo->notes_url != NULL) this_host->notes_url = strdup(this_hostextinfo->notes_url); if(this_host->action_url == NULL && this_hostextinfo->action_url != NULL) this_host->action_url = strdup(this_hostextinfo->action_url); if(this_host->icon_image == NULL && this_hostextinfo->icon_image != NULL) this_host->icon_image = strdup(this_hostextinfo->icon_image); if(this_host->icon_image_alt == NULL && this_hostextinfo->icon_image_alt != NULL) this_host->icon_image_alt = strdup(this_hostextinfo->icon_image_alt); if(this_host->vrml_image == NULL && this_hostextinfo->vrml_image != NULL) this_host->vrml_image = strdup(this_hostextinfo->vrml_image); if(this_host->statusmap_image == NULL && this_hostextinfo->statusmap_image != NULL) this_host->statusmap_image = strdup(this_hostextinfo->statusmap_image); if(this_host->have_2d_coords == FALSE && this_hostextinfo->have_2d_coords == TRUE) { this_host->x_2d = this_hostextinfo->x_2d; this_host->y_2d = this_hostextinfo->y_2d; this_host->have_2d_coords = TRUE; } if(this_host->have_3d_coords == FALSE && this_hostextinfo->have_3d_coords == TRUE) { this_host->x_3d = this_hostextinfo->x_3d; this_host->y_3d = this_hostextinfo->y_3d; this_host->z_3d = this_hostextinfo->z_3d; this_host->have_3d_coords = TRUE; } return OK; } #endif /******************************************************************/ /******************** SKIPLIST FUNCTIONS **************************/ /******************************************************************/ int xodtemplate_init_xobject_skiplists(void) { int x = 0; for(x = 0; x < NUM_XOBJECT_SKIPLISTS; x++) { xobject_template_skiplists[x] = NULL; xobject_skiplists[x] = NULL; } xobject_template_skiplists[HOST_SKIPLIST] = skiplist_new(16, 0.5, FALSE, FALSE, xodtemplate_skiplist_compare_host_template); xobject_template_skiplists[SERVICE_SKIPLIST] = skiplist_new(16, 0.5, FALSE, FALSE, xodtemplate_skiplist_compare_service_template); xobject_template_skiplists[COMMAND_SKIPLIST] = skiplist_new(10, 0.5, FALSE, FALSE, xodtemplate_skiplist_compare_command_template); xobject_template_skiplists[TIMEPERIOD_SKIPLIST] = skiplist_new(10, 0.5, FALSE, FALSE, xodtemplate_skiplist_compare_timeperiod_template); xobject_template_skiplists[CONTACT_SKIPLIST] = skiplist_new(10, 0.5, FALSE, FALSE, xodtemplate_skiplist_compare_contact_template); xobject_template_skiplists[CONTACTGROUP_SKIPLIST] = skiplist_new(10, 0.5, FALSE, FALSE, xodtemplate_skiplist_compare_contactgroup_template); xobject_template_skiplists[HOSTGROUP_SKIPLIST] = skiplist_new(10, 0.5, FALSE, FALSE, xodtemplate_skiplist_compare_hostgroup_template); xobject_template_skiplists[SERVICEGROUP_SKIPLIST] = skiplist_new(10, 0.5, FALSE, FALSE, xodtemplate_skiplist_compare_servicegroup_template); xobject_template_skiplists[HOSTDEPENDENCY_SKIPLIST] = skiplist_new(16, 0.5, FALSE, FALSE, xodtemplate_skiplist_compare_hostdependency_template); xobject_template_skiplists[SERVICEDEPENDENCY_SKIPLIST] = skiplist_new(16, 0.5, FALSE, FALSE, xodtemplate_skiplist_compare_servicedependency_template); xobject_template_skiplists[HOSTESCALATION_SKIPLIST] = skiplist_new(16, 0.5, FALSE, FALSE, xodtemplate_skiplist_compare_hostescalation_template); xobject_template_skiplists[SERVICEESCALATION_SKIPLIST] = skiplist_new(16, 0.5, FALSE, FALSE, xodtemplate_skiplist_compare_serviceescalation_template); xobject_template_skiplists[HOSTEXTINFO_SKIPLIST] = skiplist_new(16, 0.5, FALSE, FALSE, xodtemplate_skiplist_compare_hostextinfo_template); xobject_template_skiplists[SERVICEEXTINFO_SKIPLIST] = skiplist_new(16, 0.5, FALSE, FALSE, xodtemplate_skiplist_compare_serviceextinfo_template); xobject_skiplists[HOST_SKIPLIST] = skiplist_new(16, 0.5, FALSE, FALSE, xodtemplate_skiplist_compare_host); xobject_skiplists[SERVICE_SKIPLIST] = skiplist_new(16, 0.5, FALSE, FALSE, xodtemplate_skiplist_compare_service); xobject_skiplists[COMMAND_SKIPLIST] = skiplist_new(16, 0.5, FALSE, FALSE, xodtemplate_skiplist_compare_command); xobject_skiplists[TIMEPERIOD_SKIPLIST] = skiplist_new(16, 0.5, FALSE, FALSE, xodtemplate_skiplist_compare_timeperiod); xobject_skiplists[CONTACT_SKIPLIST] = skiplist_new(10, 0.5, FALSE, FALSE, xodtemplate_skiplist_compare_contact); xobject_skiplists[CONTACTGROUP_SKIPLIST] = skiplist_new(10, 0.5, FALSE, FALSE, xodtemplate_skiplist_compare_contactgroup); xobject_skiplists[HOSTGROUP_SKIPLIST] = skiplist_new(10, 0.5, FALSE, FALSE, xodtemplate_skiplist_compare_hostgroup); xobject_skiplists[SERVICEGROUP_SKIPLIST] = skiplist_new(10, 0.5, FALSE, FALSE, xodtemplate_skiplist_compare_servicegroup); /* * host and service extinfo, dependencies, and escalations don't * need to be sorted, so we avoid creating skiplists for them. */ return OK; } int xodtemplate_free_xobject_skiplists(void) { int x = 0; for(x = 0; x < NUM_XOBJECT_SKIPLISTS; x++) { skiplist_free(&xobject_template_skiplists[x]); skiplist_free(&xobject_skiplists[x]); } return OK; } int xodtemplate_skiplist_compare_host_template(void *a, void *b) { xodtemplate_host *oa = NULL; xodtemplate_host *ob = NULL; oa = (xodtemplate_host *)a; ob = (xodtemplate_host *)b; if(oa == NULL && ob == NULL) return 0; if(oa == NULL) return 1; if(ob == NULL) return -1; return skiplist_compare_text(oa->name, NULL, ob->name, NULL); } int xodtemplate_skiplist_compare_host(void *a, void *b) { xodtemplate_host *oa = NULL; xodtemplate_host *ob = NULL; oa = (xodtemplate_host *)a; ob = (xodtemplate_host *)b; if(oa == NULL && ob == NULL) return 0; if(oa == NULL) return 1; if(ob == NULL) return -1; return skiplist_compare_text(oa->host_name, NULL, ob->host_name, NULL); } int xodtemplate_skiplist_compare_service_template(void *a, void *b) { xodtemplate_service *oa = NULL; xodtemplate_service *ob = NULL; oa = (xodtemplate_service *)a; ob = (xodtemplate_service *)b; if(oa == NULL && ob == NULL) return 0; if(oa == NULL) return 1; if(ob == NULL) return -1; return skiplist_compare_text(oa->name, NULL, ob->name, NULL); } int xodtemplate_skiplist_compare_service(void *a, void *b) { xodtemplate_service *oa = NULL; xodtemplate_service *ob = NULL; oa = (xodtemplate_service *)a; ob = (xodtemplate_service *)b; if(oa == NULL && ob == NULL) return 0; if(oa == NULL) return 1; if(ob == NULL) return -1; return skiplist_compare_text(oa->host_name, oa->service_description, ob->host_name, ob->service_description); } int xodtemplate_skiplist_compare_timeperiod_template(void *a, void *b) { xodtemplate_timeperiod *oa = NULL; xodtemplate_timeperiod *ob = NULL; oa = (xodtemplate_timeperiod *)a; ob = (xodtemplate_timeperiod *)b; if(oa == NULL && ob == NULL) return 0; if(oa == NULL) return 1; if(ob == NULL) return -1; return skiplist_compare_text(oa->name, NULL, ob->name, NULL); } int xodtemplate_skiplist_compare_timeperiod(void *a, void *b) { xodtemplate_timeperiod *oa = NULL; xodtemplate_timeperiod *ob = NULL; oa = (xodtemplate_timeperiod *)a; ob = (xodtemplate_timeperiod *)b; if(oa == NULL && ob == NULL) return 0; if(oa == NULL) return 1; if(ob == NULL) return -1; return skiplist_compare_text(oa->timeperiod_name, NULL, ob->timeperiod_name, NULL); } int xodtemplate_skiplist_compare_command_template(void *a, void *b) { xodtemplate_command *oa = NULL; xodtemplate_command *ob = NULL; oa = (xodtemplate_command *)a; ob = (xodtemplate_command *)b; if(oa == NULL && ob == NULL) return 0; if(oa == NULL) return 1; if(ob == NULL) return -1; return skiplist_compare_text(oa->name, NULL, ob->name, NULL); } int xodtemplate_skiplist_compare_command(void *a, void *b) { xodtemplate_command *oa = NULL; xodtemplate_command *ob = NULL; oa = (xodtemplate_command *)a; ob = (xodtemplate_command *)b; if(oa == NULL && ob == NULL) return 0; if(oa == NULL) return 1; if(ob == NULL) return -1; return skiplist_compare_text(oa->command_name, NULL, ob->command_name, NULL); } int xodtemplate_skiplist_compare_contact_template(void *a, void *b) { xodtemplate_contact *oa = NULL; xodtemplate_contact *ob = NULL; oa = (xodtemplate_contact *)a; ob = (xodtemplate_contact *)b; if(oa == NULL && ob == NULL) return 0; if(oa == NULL) return 1; if(ob == NULL) return -1; return skiplist_compare_text(oa->name, NULL, ob->name, NULL); } int xodtemplate_skiplist_compare_contact(void *a, void *b) { xodtemplate_contact *oa = NULL; xodtemplate_contact *ob = NULL; oa = (xodtemplate_contact *)a; ob = (xodtemplate_contact *)b; if(oa == NULL && ob == NULL) return 0; if(oa == NULL) return 1; if(ob == NULL) return -1; return skiplist_compare_text(oa->contact_name, NULL, ob->contact_name, NULL); } int xodtemplate_skiplist_compare_contactgroup_template(void *a, void *b) { xodtemplate_contactgroup *oa = NULL; xodtemplate_contactgroup *ob = NULL; oa = (xodtemplate_contactgroup *)a; ob = (xodtemplate_contactgroup *)b; if(oa == NULL && ob == NULL) return 0; if(oa == NULL) return 1; if(ob == NULL) return -1; return skiplist_compare_text(oa->name, NULL, ob->name, NULL); } int xodtemplate_skiplist_compare_contactgroup(void *a, void *b) { xodtemplate_contactgroup *oa = NULL; xodtemplate_contactgroup *ob = NULL; oa = (xodtemplate_contactgroup *)a; ob = (xodtemplate_contactgroup *)b; if(oa == NULL && ob == NULL) return 0; if(oa == NULL) return 1; if(ob == NULL) return -1; return skiplist_compare_text(oa->contactgroup_name, NULL, ob->contactgroup_name, NULL); } int xodtemplate_skiplist_compare_hostgroup_template(void *a, void *b) { xodtemplate_hostgroup *oa = NULL; xodtemplate_hostgroup *ob = NULL; oa = (xodtemplate_hostgroup *)a; ob = (xodtemplate_hostgroup *)b; if(oa == NULL && ob == NULL) return 0; if(oa == NULL) return 1; if(ob == NULL) return -1; return skiplist_compare_text(oa->name, NULL, ob->name, NULL); } int xodtemplate_skiplist_compare_hostgroup(void *a, void *b) { xodtemplate_hostgroup *oa = NULL; xodtemplate_hostgroup *ob = NULL; oa = (xodtemplate_hostgroup *)a; ob = (xodtemplate_hostgroup *)b; if(oa == NULL && ob == NULL) return 0; if(oa == NULL) return 1; if(ob == NULL) return -1; return skiplist_compare_text(oa->hostgroup_name, NULL, ob->hostgroup_name, NULL); } int xodtemplate_skiplist_compare_servicegroup_template(void *a, void *b) { xodtemplate_servicegroup *oa = NULL; xodtemplate_servicegroup *ob = NULL; oa = (xodtemplate_servicegroup *)a; ob = (xodtemplate_servicegroup *)b; if(oa == NULL && ob == NULL) return 0; if(oa == NULL) return 1; if(ob == NULL) return -1; return skiplist_compare_text(oa->name, NULL, ob->name, NULL); } int xodtemplate_skiplist_compare_servicegroup(void *a, void *b) { xodtemplate_servicegroup *oa = NULL; xodtemplate_servicegroup *ob = NULL; oa = (xodtemplate_servicegroup *)a; ob = (xodtemplate_servicegroup *)b; if(oa == NULL && ob == NULL) return 0; if(oa == NULL) return 1; if(ob == NULL) return -1; return skiplist_compare_text(oa->servicegroup_name, NULL, ob->servicegroup_name, NULL); } int xodtemplate_skiplist_compare_hostdependency_template(void *a, void *b) { xodtemplate_hostdependency *oa = NULL; xodtemplate_hostdependency *ob = NULL; oa = (xodtemplate_hostdependency *)a; ob = (xodtemplate_hostdependency *)b; if(oa == NULL && ob == NULL) return 0; if(oa == NULL) return 1; if(ob == NULL) return -1; return skiplist_compare_text(oa->name, NULL, ob->name, NULL); } int xodtemplate_skiplist_compare_hostdependency(void *a, void *b) { xodtemplate_hostdependency *oa = NULL; xodtemplate_hostdependency *ob = NULL; oa = (xodtemplate_hostdependency *)a; ob = (xodtemplate_hostdependency *)b; if(oa == NULL && ob == NULL) return 0; if(oa == NULL) return 1; if(ob == NULL) return -1; return skiplist_compare_text(oa->dependent_host_name, NULL, ob->dependent_host_name, NULL); } int xodtemplate_skiplist_compare_servicedependency_template(void *a, void *b) { xodtemplate_servicedependency *oa = NULL; xodtemplate_servicedependency *ob = NULL; oa = (xodtemplate_servicedependency *)a; ob = (xodtemplate_servicedependency *)b; if(oa == NULL && ob == NULL) return 0; if(oa == NULL) return 1; if(ob == NULL) return -1; return skiplist_compare_text(oa->name, NULL, ob->name, NULL); } int xodtemplate_skiplist_compare_servicedependency(void *a, void *b) { xodtemplate_servicedependency *oa = NULL; xodtemplate_servicedependency *ob = NULL; oa = (xodtemplate_servicedependency *)a; ob = (xodtemplate_servicedependency *)b; if(oa == NULL && ob == NULL) return 0; if(oa == NULL) return 1; if(ob == NULL) return -1; return skiplist_compare_text(oa->dependent_host_name, oa->dependent_service_description, ob->dependent_host_name, ob->dependent_service_description); } int xodtemplate_skiplist_compare_hostescalation_template(void *a, void *b) { xodtemplate_hostescalation *oa = NULL; xodtemplate_hostescalation *ob = NULL; oa = (xodtemplate_hostescalation *)a; ob = (xodtemplate_hostescalation *)b; if(oa == NULL && ob == NULL) return 0; if(oa == NULL) return 1; if(ob == NULL) return -1; return skiplist_compare_text(oa->name, NULL, ob->name, NULL); } int xodtemplate_skiplist_compare_hostescalation(void *a, void *b) { xodtemplate_hostescalation *oa = NULL; xodtemplate_hostescalation *ob = NULL; oa = (xodtemplate_hostescalation *)a; ob = (xodtemplate_hostescalation *)b; if(oa == NULL && ob == NULL) return 0; if(oa == NULL) return 1; if(ob == NULL) return -1; return skiplist_compare_text(oa->host_name, NULL, ob->host_name, NULL); } int xodtemplate_skiplist_compare_serviceescalation_template(void *a, void *b) { xodtemplate_serviceescalation *oa = NULL; xodtemplate_serviceescalation *ob = NULL; oa = (xodtemplate_serviceescalation *)a; ob = (xodtemplate_serviceescalation *)b; if(oa == NULL && ob == NULL) return 0; if(oa == NULL) return 1; if(ob == NULL) return -1; return skiplist_compare_text(oa->name, NULL, ob->name, NULL); } int xodtemplate_skiplist_compare_serviceescalation(void *a, void *b) { xodtemplate_serviceescalation *oa = NULL; xodtemplate_serviceescalation *ob = NULL; oa = (xodtemplate_serviceescalation *)a; ob = (xodtemplate_serviceescalation *)b; if(oa == NULL && ob == NULL) return 0; if(oa == NULL) return 1; if(ob == NULL) return -1; return skiplist_compare_text(oa->host_name, oa->service_description, ob->host_name, ob->service_description); } int xodtemplate_skiplist_compare_hostextinfo_template(void *a, void *b) { xodtemplate_hostextinfo *oa = NULL; xodtemplate_hostextinfo *ob = NULL; oa = (xodtemplate_hostextinfo *)a; ob = (xodtemplate_hostextinfo *)b; if(oa == NULL && ob == NULL) return 0; if(oa == NULL) return 1; if(ob == NULL) return -1; return skiplist_compare_text(oa->name, NULL, ob->name, NULL); } int xodtemplate_skiplist_compare_serviceextinfo_template(void *a, void *b) { xodtemplate_serviceextinfo *oa = NULL; xodtemplate_serviceextinfo *ob = NULL; oa = (xodtemplate_serviceextinfo *)a; ob = (xodtemplate_serviceextinfo *)b; if(oa == NULL && ob == NULL) return 0; if(oa == NULL) return 1; if(ob == NULL) return -1; return skiplist_compare_text(oa->name, NULL, ob->name, NULL); } /******************************************************************/ /********************** CLEANUP FUNCTIONS *************************/ /******************************************************************/ /* frees memory */ int xodtemplate_free_memory(void) { xodtemplate_timeperiod *this_timeperiod = NULL; xodtemplate_timeperiod *next_timeperiod = NULL; xodtemplate_daterange *this_daterange = NULL; xodtemplate_daterange *next_daterange = NULL; xodtemplate_command *this_command = NULL; xodtemplate_command *next_command = NULL; xodtemplate_contactgroup *this_contactgroup = NULL; xodtemplate_contactgroup *next_contactgroup = NULL; xodtemplate_hostgroup *this_hostgroup = NULL; xodtemplate_hostgroup *next_hostgroup = NULL; xodtemplate_servicegroup *this_servicegroup = NULL; xodtemplate_servicegroup *next_servicegroup = NULL; xodtemplate_contact *this_contact = NULL; xodtemplate_contact *next_contact = NULL; xodtemplate_host *this_host = NULL; xodtemplate_host *next_host = NULL; xodtemplate_service *this_service = NULL; xodtemplate_service *next_service = NULL; xodtemplate_customvariablesmember *this_customvariablesmember = NULL; xodtemplate_customvariablesmember *next_customvariablesmember = NULL; register int x = 0; /* free memory allocated to timeperiod list */ for(this_timeperiod = xodtemplate_timeperiod_list; this_timeperiod != NULL; this_timeperiod = next_timeperiod) { next_timeperiod = this_timeperiod->next; my_free(this_timeperiod->template); my_free(this_timeperiod->name); if (!this_timeperiod->register_object) { my_free(this_timeperiod->timeperiod_name); my_free(this_timeperiod->alias); } for(x = 0; x < 7; x++) my_free(this_timeperiod->timeranges[x]); for(x = 0; x < DATERANGE_TYPES; x++) { for(this_daterange = this_timeperiod->exceptions[x]; this_daterange != NULL; this_daterange = next_daterange) { next_daterange = this_daterange->next; my_free(this_daterange->timeranges); my_free(this_daterange); } } my_free(this_timeperiod->exclusions); my_free(this_timeperiod); } xodtemplate_timeperiod_list = NULL; xodtemplate_timeperiod_list_tail = NULL; /* free memory allocated to command list */ for(this_command = xodtemplate_command_list; this_command != NULL; this_command = next_command) { next_command = this_command->next; my_free(this_command->template); my_free(this_command->name); if (!this_command->register_object) { my_free(this_command->command_name); my_free(this_command->command_line); } my_free(this_command); } xodtemplate_command_list = NULL; xodtemplate_command_list_tail = NULL; /* free memory allocated to contactgroup list */ for(this_contactgroup = xodtemplate_contactgroup_list; this_contactgroup != NULL; this_contactgroup = next_contactgroup) { next_contactgroup = this_contactgroup->next; my_free(this_contactgroup->template); my_free(this_contactgroup->name); my_free(this_contactgroup->members); my_free(this_contactgroup->contactgroup_members); bitmap_destroy(this_contactgroup->member_map); free_objectlist(&this_contactgroup->member_list); free_objectlist(&this_contactgroup->group_list); if (!this_contactgroup->register_object) { my_free(this_contactgroup->contactgroup_name); my_free(this_contactgroup->alias); } my_free(this_contactgroup); } xodtemplate_contactgroup_list = NULL; xodtemplate_contactgroup_list_tail = NULL; /* free memory allocated to hostgroup list */ for(this_hostgroup = xodtemplate_hostgroup_list; this_hostgroup != NULL; this_hostgroup = next_hostgroup) { next_hostgroup = this_hostgroup->next; my_free(this_hostgroup->template); my_free(this_hostgroup->name); my_free(this_hostgroup->members); my_free(this_hostgroup->hostgroup_members); bitmap_destroy(this_hostgroup->member_map); free_objectlist(&this_hostgroup->member_list); free_objectlist(&this_hostgroup->group_list); if (!this_hostgroup->register_object) { my_free(this_hostgroup->hostgroup_name); my_free(this_hostgroup->alias); my_free(this_hostgroup->notes); my_free(this_hostgroup->notes_url); my_free(this_hostgroup->action_url); } my_free(this_hostgroup); } xodtemplate_hostgroup_list = NULL; xodtemplate_hostgroup_list_tail = NULL; /* free memory allocated to servicegroup list */ for(this_servicegroup = xodtemplate_servicegroup_list; this_servicegroup != NULL; this_servicegroup = next_servicegroup) { next_servicegroup = this_servicegroup->next; my_free(this_servicegroup->members); my_free(this_servicegroup->servicegroup_members); bitmap_destroy(this_servicegroup->member_map); free_objectlist(&this_servicegroup->member_list); free_objectlist(&this_servicegroup->group_list); my_free(this_servicegroup->template); my_free(this_servicegroup->name); if (!this_servicegroup->register_object) { my_free(this_servicegroup->servicegroup_name); my_free(this_servicegroup->alias); my_free(this_servicegroup->notes); my_free(this_servicegroup->notes_url); my_free(this_servicegroup->action_url); } my_free(this_servicegroup); } xodtemplate_servicegroup_list = NULL; xodtemplate_servicegroup_list_tail = NULL; /* free memory allocated to contact list */ for(this_contact = xodtemplate_contact_list; this_contact != NULL; this_contact = next_contact) { next_contact = this_contact->next; /* free custom variables */ this_customvariablesmember = this_contact->custom_variables; while(this_customvariablesmember != NULL) { next_customvariablesmember = this_customvariablesmember->next; my_free(this_customvariablesmember->variable_name); my_free(this_customvariablesmember->variable_value); my_free(this_customvariablesmember); this_customvariablesmember = next_customvariablesmember; } my_free(this_contact->template); my_free(this_contact->name); my_free(this_contact->contact_groups); my_free(this_contact->service_notification_period); my_free(this_contact->service_notification_commands); my_free(this_contact->host_notification_period); my_free(this_contact->host_notification_commands); if (!this_contact->register_object) { my_free(this_contact->contact_name); my_free(this_contact->alias); my_free(this_contact->email); my_free(this_contact->pager); for (x = 0; x < MAX_XODTEMPLATE_CONTACT_ADDRESSES; x++) my_free(this_contact->address[x]); } my_free(this_contact); } xodtemplate_contact_list = NULL; xodtemplate_contact_list_tail = NULL; /* free memory allocated to host list */ for(this_host = xodtemplate_host_list; this_host != NULL; this_host = next_host) { next_host = this_host->next; /* free custom variables */ this_customvariablesmember = this_host->custom_variables; while(this_customvariablesmember != NULL) { next_customvariablesmember = this_customvariablesmember->next; my_free(this_customvariablesmember->variable_name); my_free(this_customvariablesmember->variable_value); my_free(this_customvariablesmember); this_customvariablesmember = next_customvariablesmember; } my_free(this_host->template); my_free(this_host->name); my_free(this_host->parents); my_free(this_host->host_groups); my_free(this_host->check_period); my_free(this_host->contact_groups); my_free(this_host->contacts); my_free(this_host->notification_period); if (!this_host->register_object) { my_free(this_host->host_name); my_free(this_host->alias); my_free(this_host->display_name); my_free(this_host->address); my_free(this_host->check_command); my_free(this_host->event_handler); my_free(this_host->notes); my_free(this_host->notes_url); my_free(this_host->action_url); my_free(this_host->icon_image); my_free(this_host->icon_image_alt); my_free(this_host->statusmap_image); my_free(this_host->vrml_image); } my_free(this_host); } xodtemplate_host_list = NULL; xodtemplate_host_list_tail = NULL; /* free memory allocated to service list */ for(this_service = xodtemplate_service_list; this_service != NULL; this_service = next_service) { next_service = this_service->next; my_free(this_service->contact_groups); my_free(this_service->contacts); my_free(this_service->service_groups); if(this_service->is_copy == FALSE || !this_service->register_object) { /* free custom variables */ this_customvariablesmember = this_service->custom_variables; while(this_customvariablesmember != NULL) { next_customvariablesmember = this_customvariablesmember->next; my_free(this_customvariablesmember->variable_name); my_free(this_customvariablesmember->variable_value); my_free(this_customvariablesmember); this_customvariablesmember = next_customvariablesmember; } my_free(this_service->template); my_free(this_service->name); my_free(this_service->parents); my_free(this_service->display_name); my_free(this_service->check_command); my_free(this_service->check_period); my_free(this_service->event_handler); my_free(this_service->notification_period); my_free(this_service->notes); my_free(this_service->notes_url); my_free(this_service->action_url); my_free(this_service->icon_image); my_free(this_service->icon_image_alt); my_free(this_service->hostgroup_name); my_free(this_service->service_description); } my_free(this_service); } xodtemplate_service_list = NULL; xodtemplate_service_list_tail = NULL; /* * extinfo objects are free()'d while they're parsed, as are * dependencies and escalations */ xodtemplate_hostextinfo_list = NULL; xodtemplate_hostextinfo_list_tail = NULL; xodtemplate_serviceextinfo_list = NULL; xodtemplate_serviceextinfo_list_tail = NULL; /* free memory for the config file names */ for(x = 0; x < xodtemplate_current_config_file; x++) my_free(xodtemplate_config_files[x]); my_free(xodtemplate_config_files); xodtemplate_current_config_file = 0; /* free skiplists */ xodtemplate_free_xobject_skiplists(); return OK; } /* adds a member to a list */ int xodtemplate_add_member_to_memberlist(xodtemplate_memberlist **list, char *name1, char *name2) { xodtemplate_memberlist *temp_item = NULL; xodtemplate_memberlist *new_item = NULL; int error = FALSE; if(list == NULL) return ERROR; if(name1 == NULL) return ERROR; /* skip this member if its already in the list */ for(temp_item = *list; temp_item; temp_item = temp_item->next) { if(!strcmp(temp_item->name1, name1)) { if(temp_item->name2 == NULL) { if(name2 == NULL) break; } else if(name2 != NULL && !strcmp(temp_item->name2, name2)) break; } } if(temp_item) return OK; /* allocate zero'd out memory for a new list item */ if((new_item = (xodtemplate_memberlist *)calloc(1, sizeof(xodtemplate_memberlist))) == NULL) return ERROR; /* save the member name(s) */ if(name1) { if((new_item->name1 = (char *)strdup(name1)) == NULL) error = TRUE; } if(name2) { if((new_item->name2 = (char *)strdup(name2)) == NULL) error = TRUE; } if(error == TRUE) { my_free(new_item->name1); my_free(new_item->name2); my_free(new_item); return ERROR; } /* add new item to head of list */ new_item->next = *list; *list = new_item; return OK; } /* frees memory allocated to a temporary member list */ int xodtemplate_free_memberlist(xodtemplate_memberlist **temp_list) { xodtemplate_memberlist *this_memberlist = NULL; xodtemplate_memberlist *next_memberlist = NULL; /* free memory allocated to member name list */ for(this_memberlist = *temp_list; this_memberlist != NULL; this_memberlist = next_memberlist) { next_memberlist = this_memberlist->next; my_free(this_memberlist->name1); my_free(this_memberlist->name2); my_free(this_memberlist); } *temp_list = NULL; return OK; } /* remove an entry from the member list */ void xodtemplate_remove_memberlist_item(xodtemplate_memberlist *item, xodtemplate_memberlist **list) { xodtemplate_memberlist *temp_item = NULL; if(item == NULL || list == NULL) return; if(*list == NULL) return; if(*list == item) *list = item->next; else { for(temp_item = *list; temp_item != NULL; temp_item = temp_item->next) { if(temp_item->next == item) { temp_item->next = item->next; break; } } } my_free(item->name1); my_free(item->name2); my_free(item); return; } /******************************************************************/ /********************** UTILITY FUNCTIONS *************************/ /******************************************************************/ /* expands contacts */ int xodtemplate_expand_contacts(objectlist **ret, bitmap *reject_map, char *contacts, int _config_file, int _start_line) { char *contact_names = NULL; char *temp_ptr = NULL; xodtemplate_contact *temp_contact = NULL; regex_t preg; int found_match = TRUE; int reject_item = FALSE; int use_regexp = FALSE; if(ret == NULL || contacts == NULL) return ERROR; *ret = NULL; if((contact_names = (char *)strdup(contacts)) == NULL) return ERROR; /* expand each contact name */ for(temp_ptr = strtok(contact_names, ","); temp_ptr; temp_ptr = strtok(NULL, ",")) { found_match = FALSE; reject_item = FALSE; /* strip trailing spaces */ strip(temp_ptr); /* should we use regular expression matching? */ if(use_regexp_matches == TRUE && (use_true_regexp_matching == TRUE || strstr(temp_ptr, "*") || strstr(temp_ptr, "?") || strstr(temp_ptr, "+") || strstr(temp_ptr, "\\."))) use_regexp = TRUE; /* use regular expression matching */ if(use_regexp == TRUE) { /* compile regular expression */ if(regcomp(&preg, temp_ptr, REG_EXTENDED)) { my_free(contact_names); return ERROR; } /* test match against all contacts */ for(temp_contact = xodtemplate_contact_list; temp_contact != NULL; temp_contact = temp_contact->next) { if(temp_contact->contact_name == NULL) continue; /* skip this contact if it did not match the expression */ if(regexec(&preg, temp_contact->contact_name, 0, NULL, 0)) continue; found_match = TRUE; /* dont' add contacts that shouldn't be registered */ if(temp_contact->register_object == FALSE) continue; /* add contact to list */ add_object_to_objectlist(ret, temp_contact); } /* free memory allocated to compiled regexp */ regfree(&preg); } /* use standard matching... */ else { /* return a list of all contacts */ if(!strcmp(temp_ptr, "*")) { found_match = TRUE; for(temp_contact = xodtemplate_contact_list; temp_contact != NULL; temp_contact = temp_contact->next) { if(temp_contact->contact_name == NULL) continue; /* dont' add contacts that shouldn't be registered */ if(temp_contact->register_object == FALSE) continue; /* add contact to list */ add_object_to_objectlist(ret, temp_contact); } } /* else this is just a single contact... */ else { /* this contact should be excluded (rejected) */ if(temp_ptr[0] == '!') { reject_item = TRUE; temp_ptr++; } /* find the contact */ temp_contact = xodtemplate_find_real_contact(temp_ptr); if(temp_contact != NULL) { found_match = TRUE; /* add contact to list */ if(reject_item) { bitmap_set(reject_map, temp_contact->id); } else { add_object_to_objectlist(ret, temp_contact); } } } } if(found_match == FALSE) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not find any contact matching '%s' (config file '%s', starting on line %d)\n", temp_ptr, xodtemplate_config_file_name(_config_file), _start_line); break; } } /* free memory */ my_free(contact_names); if(found_match == FALSE) return ERROR; return OK; } #ifdef NSCORE /* * expands a comma-delimited list of hostgroups and/or hosts to * an objectlist of hosts. This cannot be called until hostgroups * have been recombobulated. */ objectlist *xodtemplate_expand_hostgroups_and_hosts(char *hostgroups, char *hosts, int _config_file, int _start_line) { objectlist *ret = NULL, *glist = NULL, *hlist, *list = NULL, *next; bitmap *reject; int result; reject = bitmap_create(xodcount.hosts); if(!reject) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Unable to create reject map for expanding hosts and hostgroups\n"); return NULL; } /* * process host names first. If they're explicitly added we must obey */ if(hosts != NULL) { /* expand hosts */ result = xodtemplate_expand_hosts(&ret, reject, hosts, _config_file, _start_line); if(result != OK) { free_objectlist(&glist); free_objectlist(&ret); bitmap_destroy(reject); return NULL; } } /* process list of hostgroups... */ if(hostgroups != NULL) { /* expand host */ result = xodtemplate_expand_hostgroups(&glist, reject, hostgroups, _config_file, _start_line); if(result != OK) { logit(NSLOG_CONFIG_ERROR, TRUE, "Failed to expand hostgroups '%s' to something sensible\n", hostgroups); free_objectlist(&glist); bitmap_destroy(reject); return NULL; } } /* * add hostgroup hosts to ret, taking care not to add any that are * in the rejected list */ for(list = glist; list; list = next) { xodtemplate_hostgroup *hg = (xodtemplate_hostgroup *)list->object_ptr; next = list->next; free(list); /* free it as we go along */ for(hlist = hg->member_list; hlist; hlist = hlist->next) { xodtemplate_host *h = (xodtemplate_host *)hlist->object_ptr; if(bitmap_isset(reject, h->id)) continue; add_object_to_objectlist(&ret, h); } } bitmap_destroy(reject); return ret; } #endif /* * expands hostgroups. * list will be populated with all selected hostgroups on success * and set to NULL on errors. * reject_map marks rejected *hosts* from rejected hostgroups * This can only be called after hostgroups are recombobulated. * returns ERROR on error and OK on success. */ int xodtemplate_expand_hostgroups(objectlist **list, bitmap *reject_map, char *hostgroups, int _config_file, int _start_line) { char *hostgroup_names = NULL; char *temp_ptr = NULL; xodtemplate_hostgroup *temp_hostgroup = NULL; regex_t preg; int found_match = TRUE; int reject_item = FALSE; int use_regexp = FALSE; if(list == NULL || hostgroups == NULL) return ERROR; *list = NULL; /* allocate memory for hostgroup name list */ if((hostgroup_names = (char *)strdup(hostgroups)) == NULL) return ERROR; for(temp_ptr = strtok(hostgroup_names, ","); temp_ptr; temp_ptr = strtok(NULL, ",")) { found_match = FALSE; reject_item = FALSE; /* strip trailing spaces */ strip(temp_ptr); /* should we use regular expression matching? */ if(use_regexp_matches == TRUE && (use_true_regexp_matching == TRUE || strstr(temp_ptr, "*") || strstr(temp_ptr, "?") || strstr(temp_ptr, "+") || strstr(temp_ptr, "\\."))) use_regexp = TRUE; else use_regexp = FALSE; /* use regular expression matching */ if(use_regexp == TRUE) { /* compile regular expression */ if(regcomp(&preg, temp_ptr, REG_EXTENDED)) { my_free(hostgroup_names); return ERROR; } /* test match against all hostgroup names */ for(temp_hostgroup = xodtemplate_hostgroup_list; temp_hostgroup != NULL; temp_hostgroup = temp_hostgroup->next) { if(temp_hostgroup->hostgroup_name == NULL) continue; /* skip this hostgroup if it did not match the expression */ if(regexec(&preg, temp_hostgroup->hostgroup_name, 0, NULL, 0)) continue; found_match = TRUE; /* dont' add hostgroups that shouldn't be registered */ if(temp_hostgroup->register_object == FALSE) continue; add_object_to_objectlist(list, temp_hostgroup); } /* free memory allocated to compiled regexp */ regfree(&preg); } /* use standard matching... */ else { /* return a list of all hostgroups */ if(!strcmp(temp_ptr, "*")) { found_match = TRUE; for(temp_hostgroup = xodtemplate_hostgroup_list; temp_hostgroup != NULL; temp_hostgroup = temp_hostgroup->next) { /* dont' add hostgroups that shouldn't be registered */ if(temp_hostgroup->register_object == FALSE) continue; /* add hostgroup to list */ add_object_to_objectlist(list, temp_hostgroup); } } /* else this is just a single hostgroup... */ else { /* this hostgroup should be excluded (rejected) */ if(temp_ptr[0] == '!') { reject_item = TRUE; temp_ptr++; } /* find the hostgroup */ temp_hostgroup = xodtemplate_find_real_hostgroup(temp_ptr); if(temp_hostgroup != NULL) { found_match = TRUE; if(reject_item) { bitmap_unite(reject_map, temp_hostgroup->member_map); } else { /* add hostgroup members to proper list */ add_object_to_objectlist(list, temp_hostgroup); } } } } if(found_match == FALSE) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not find any hostgroup matching '%s' (config file '%s', starting on line %d)\n", temp_ptr, xodtemplate_config_file_name(_config_file), _start_line); break; } } /* free memory */ my_free(hostgroup_names); if(found_match == FALSE) return ERROR; return OK; } /* expands hosts */ int xodtemplate_expand_hosts(objectlist **list, bitmap *reject_map, char *hosts, int _config_file, int _start_line) { char *temp_ptr = NULL; xodtemplate_host *temp_host = NULL; regex_t preg; int found_match = TRUE; int reject_item = FALSE; int use_regexp = FALSE; if(list == NULL || hosts == NULL) return ERROR; /* expand each host name */ for(temp_ptr = strtok(hosts, ","); temp_ptr; temp_ptr = strtok(NULL, ",")) { found_match = FALSE; reject_item = FALSE; /* strip trailing spaces */ strip(temp_ptr); /* should we use regular expression matching? */ if(use_regexp_matches == TRUE && (use_true_regexp_matching == TRUE || strstr(temp_ptr, "*") || strstr(temp_ptr, "?") || strstr(temp_ptr, "+") || strstr(temp_ptr, "\\."))) use_regexp = TRUE; /* use regular expression matching */ if(use_regexp == TRUE) { /* compile regular expression */ if(regcomp(&preg, temp_ptr, REG_EXTENDED)) { return ERROR; } /* test match against all hosts */ for(temp_host = xodtemplate_host_list; temp_host != NULL; temp_host = temp_host->next) { if(temp_host->host_name == NULL) continue; /* skip this host if it did not match the expression */ if(regexec(&preg, temp_host->host_name, 0, NULL, 0)) continue; found_match = TRUE; /* dont' add hosts that shouldn't be registered */ if(temp_host->register_object == FALSE) continue; /* add host to list */ add_object_to_objectlist(list, temp_host); } /* free memory allocated to compiled regexp */ regfree(&preg); } /* use standard matching... */ else { /* return a list of all hosts */ if(!strcmp(temp_ptr, "*")) { found_match = TRUE; for(temp_host = xodtemplate_host_list; temp_host != NULL; temp_host = temp_host->next) { if(temp_host->host_name == NULL) continue; /* dont' add hosts that shouldn't be registered */ if(temp_host->register_object == FALSE) continue; /* add host to list */ add_object_to_objectlist(list, temp_host); } } /* else this is just a single host... */ else { /* this host should be excluded (rejected) */ if(temp_ptr[0] == '!') { reject_item = TRUE; temp_ptr++; } /* find the host */ temp_host = xodtemplate_find_real_host(temp_ptr); if(temp_host != NULL) { found_match = TRUE; /* add host to list */ if(!reject_item) { add_object_to_objectlist(list, temp_host); } else { bitmap_set(reject_map, temp_host->id); } } } } if(found_match == FALSE) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not find any host matching '%s' (config file '%s', starting on line %d)\n", temp_ptr, xodtemplate_config_file_name(_config_file), _start_line); break; } } if(found_match == FALSE) return ERROR; return OK; } /* * expands servicegroups. * list will hold all selected servicegroups. * reject will map services from all rejected servicegroups * This can only be called after servicegroups are recombobulated. */ int xodtemplate_expand_servicegroups(objectlist **list, bitmap *reject, char *servicegroups, int _config_file, int _start_line) { xodtemplate_servicegroup *temp_servicegroup = NULL; regex_t preg; char *servicegroup_names = NULL; char *temp_ptr = NULL; int found_match = TRUE; int reject_item = FALSE; int use_regexp = FALSE; if(list == NULL) return ERROR; if(servicegroups == NULL) return OK; /* allocate memory for servicegroup name list */ if((servicegroup_names = (char *)strdup(servicegroups)) == NULL) return ERROR; /* expand each servicegroup */ for(temp_ptr = strtok(servicegroup_names, ","); temp_ptr; temp_ptr = strtok(NULL, ",")) { found_match = FALSE; reject_item = FALSE; /* strip trailing spaces */ strip(temp_ptr); /* should we use regular expression matching? */ if(use_regexp_matches == TRUE && (use_true_regexp_matching == TRUE || strstr(temp_ptr, "*") || strstr(temp_ptr, "?") || strstr(temp_ptr, "+") || strstr(temp_ptr, "\\."))) use_regexp = TRUE; else use_regexp = FALSE; /* use regular expression matching */ if(use_regexp == TRUE) { /* compile regular expression */ if(regcomp(&preg, temp_ptr, REG_EXTENDED)) { my_free(servicegroup_names); return ERROR; } /* test match against all servicegroup names */ for(temp_servicegroup = xodtemplate_servicegroup_list; temp_servicegroup != NULL; temp_servicegroup = temp_servicegroup->next) { if(temp_servicegroup->servicegroup_name == NULL) continue; /* skip this servicegroup if it did not match the expression */ if(regexec(&preg, temp_servicegroup->servicegroup_name, 0, NULL, 0)) continue; found_match = TRUE; /* dont' add servicegroups that shouldn't be registered */ if(temp_servicegroup->register_object == FALSE) continue; /* add servicegroup to list */ add_object_to_objectlist(list, temp_servicegroup); } /* free memory allocated to compiled regexp */ regfree(&preg); } /* use standard matching... */ else { /* return a list of all servicegroups */ if(!strcmp(temp_ptr, "*")) { found_match = TRUE; for(temp_servicegroup = xodtemplate_servicegroup_list; temp_servicegroup != NULL; temp_servicegroup = temp_servicegroup->next) { /* dont' add servicegroups that shouldn't be registered */ if(temp_servicegroup->register_object == FALSE) continue; /* add servicegroup to list */ prepend_object_to_objectlist(list, temp_servicegroup); } } /* else this is just a single servicegroup... */ else { /* this servicegroup should be excluded (rejected) */ if(temp_ptr[0] == '!') { reject_item = TRUE; temp_ptr++; } /* find the servicegroup */ if((temp_servicegroup = xodtemplate_find_real_servicegroup(temp_ptr)) != NULL) { found_match = TRUE; /* add servicegroup members to list */ if(reject_item) bitmap_unite(reject, temp_servicegroup->member_map); else add_object_to_objectlist(list, temp_servicegroup); } } } /* we didn't find a matching servicegroup */ if(found_match == FALSE) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not find any servicegroup matching '%s' (config file '%s', starting on line %d)\n", temp_ptr, xodtemplate_config_file_name(_config_file), _start_line); break; } } /* free memory */ my_free(servicegroup_names); if(found_match == FALSE) return ERROR; return OK; } /* expands services (host name is not expanded) */ int xodtemplate_expand_services(objectlist **list, bitmap *reject_map, char *host_name, char *services, int _config_file, int _start_line) { char *service_names = NULL; char *temp_ptr = NULL; xodtemplate_service *temp_service = NULL; #ifndef NSCGI regex_t preg; regex_t preg2; int use_regexp_host = FALSE; int use_regexp_service = FALSE; #endif int found_match = TRUE; int reject_item = FALSE; if(list == NULL) return ERROR; /* * One-step recursion for convenience. * Useful for servicegroups' "members" directive */ if(host_name == NULL && services != NULL) { char *scopy, *next_p, *p1, *p2; if (!(scopy = strdup(services))) return ERROR; for(next_p = p1 = scopy; next_p; p1 = next_p + 1) { p2 = strchr(p1, ','); if (!p2) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Service description missing from list '%s' (config file '%s', starting at line %d)\n", services, xodtemplate_config_file_name(_config_file), _start_line); free(scopy); return ERROR; } *p2 = 0; while(!*p2 || *p2 == ' ' || *p2 == '\t') p2++; while(*p1 == ',' || *p1 == ' ' || *p1 == '\t') p1++; next_p = strchr(p2 + 1, ','); if(next_p) *next_p = 0; strip(p1); strip(p2); /* now we have arguments we can handle safely, so do that */ if(xodtemplate_expand_services(list, reject_map, p1, p2, _config_file, _start_line) != OK) { free(scopy); return ERROR; } } free(scopy); } if(host_name == NULL || services == NULL) return OK; #ifndef NSCGI /* should we use regular expression matching for the host name? */ if(use_regexp_matches == TRUE && (use_true_regexp_matching == TRUE || strstr(host_name, "*") || strstr(host_name, "?") || strstr(host_name, "+") || strstr(host_name, "\\."))) use_regexp_host = TRUE; /* compile regular expression for host name */ if(use_regexp_host == TRUE) { if(regcomp(&preg2, host_name, REG_EXTENDED)) return ERROR; } #endif if((service_names = (char *)strdup(services)) == NULL) { #ifndef NSCGI if(use_regexp_host == TRUE) regfree(&preg2); #endif return ERROR; } /* expand each service description */ for(temp_ptr = strtok(service_names, ","); temp_ptr; temp_ptr = strtok(NULL, ",")) { found_match = FALSE; reject_item = FALSE; /* strip trailing spaces */ strip(temp_ptr); #ifndef NSCGI /* should we use regular expression matching for the service description? */ if(use_regexp_matches == TRUE && (use_true_regexp_matching == TRUE || strstr(temp_ptr, "*") || strstr(temp_ptr, "?") || strstr(temp_ptr, "+") || strstr(temp_ptr, "\\."))) use_regexp_service = TRUE; else use_regexp_service = FALSE; /* compile regular expression for service description */ if(use_regexp_service == TRUE) { if(regcomp(&preg, temp_ptr, REG_EXTENDED)) { if(use_regexp_host == TRUE) regfree(&preg2); my_free(service_names); return ERROR; } } /* use regular expression matching */ if(use_regexp_host == TRUE || use_regexp_service == TRUE) { /* test match against all services */ for(temp_service = xodtemplate_service_list; temp_service != NULL; temp_service = temp_service->next) { if(temp_service->host_name == NULL || temp_service->service_description == NULL) continue; /* skip this service if it doesn't match the host name expression */ if(use_regexp_host == TRUE) { if(regexec(&preg2, temp_service->host_name, 0, NULL, 0)) continue; } else { if(strcmp(temp_service->host_name, host_name)) continue; } /* skip this service if it doesn't match the service description expression */ if(use_regexp_service == TRUE) { if(regexec(&preg, temp_service->service_description, 0, NULL, 0)) continue; } else { if(strcmp(temp_service->service_description, temp_ptr)) continue; } found_match = TRUE; /* dont' add services that shouldn't be registered */ if(temp_service->register_object == FALSE) continue; /* add service to the list */ add_object_to_objectlist(list, temp_service); } /* free memory allocated to compiled regexp */ if(use_regexp_service == TRUE) regfree(&preg); } /* use standard matching... */ else if(!strcmp(temp_ptr, "*")) { /* return a list of all services on the host */ found_match = TRUE; for(temp_service = xodtemplate_service_list; temp_service != NULL; temp_service = temp_service->next) { if(temp_service->host_name == NULL || temp_service->service_description == NULL) continue; if(strcmp(temp_service->host_name, host_name)) continue; /* dont' add services that shouldn't be registered */ if(temp_service->register_object == FALSE) continue; /* add service to the list */ add_object_to_objectlist(list, temp_service); } } /* else this is just a single service... */ else { /* this service should be excluded (rejected) */ if(temp_ptr[0] == '!') { reject_item = TRUE; temp_ptr++; } #endif /* find the service */ if((temp_service = xodtemplate_find_real_service(host_name, temp_ptr)) != NULL) { found_match = TRUE; if(reject_item == TRUE) bitmap_set(reject_map, temp_service->id); else add_object_to_objectlist(list, temp_service); } #ifndef NSCGI } #endif /* we didn't find a match */ if(found_match == FALSE && reject_item == FALSE) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not find a service matching host name '%s' and description '%s' (config file '%s', starting on line %d)\n", host_name, temp_ptr, xodtemplate_config_file_name(_config_file), _start_line); break; } } #ifndef NSCGI if(use_regexp_host == TRUE) regfree(&preg2); my_free(service_names); #endif if(found_match == FALSE && reject_item == FALSE) return ERROR; return OK; } /* returns a comma-delimited list of hostgroup names */ char * xodtemplate_process_hostgroup_names(char *hostgroups, int _config_file, int _start_line) { xodtemplate_memberlist *temp_list = NULL; xodtemplate_memberlist *reject_list = NULL; xodtemplate_memberlist *list_ptr = NULL; xodtemplate_memberlist *reject_ptr = NULL; xodtemplate_memberlist *this_list = NULL; char *buf = NULL; int result = OK; /* process list of hostgroups... */ if(hostgroups != NULL) { /* split group names into two lists */ result = xodtemplate_get_hostgroup_names(&temp_list, &reject_list, hostgroups, _config_file, _start_line); if(result != OK) { xodtemplate_free_memberlist(&temp_list); xodtemplate_free_memberlist(&reject_list); return NULL; } /* remove rejects (if any) from the list (no duplicate entries exist in either list) */ for(reject_ptr = reject_list; reject_ptr != NULL; reject_ptr = reject_ptr->next) { for(list_ptr = temp_list; list_ptr != NULL; list_ptr = list_ptr->next) { if(!strcmp(reject_ptr->name1, list_ptr->name1)) { xodtemplate_remove_memberlist_item(list_ptr, &temp_list); break; } } } xodtemplate_free_memberlist(&reject_list); reject_list = NULL; } /* generate the list of group members */ for(this_list = temp_list; this_list != NULL; this_list = this_list->next) { if(buf == NULL) { buf = (char *)malloc(strlen(this_list->name1) + 1); strcpy(buf, this_list->name1); } else { buf = (char *)realloc(buf, strlen(buf) + strlen(this_list->name1) + 2); strcat(buf, ","); strcat(buf, this_list->name1); } } xodtemplate_free_memberlist(&temp_list); return buf; } /* return a list of hostgroup names */ int xodtemplate_get_hostgroup_names(xodtemplate_memberlist **list, xodtemplate_memberlist **reject_list, char *hostgroups, int _config_file, int _start_line) { char *hostgroup_names = NULL; char *temp_ptr = NULL; xodtemplate_hostgroup *temp_hostgroup = NULL; regex_t preg; int found_match = TRUE; int reject_item = FALSE; int use_regexp = FALSE; if(list == NULL || hostgroups == NULL) return ERROR; /* allocate memory for hostgroup name list */ if((hostgroup_names = (char *)strdup(hostgroups)) == NULL) return ERROR; for(temp_ptr = strtok(hostgroup_names, ","); temp_ptr; temp_ptr = strtok(NULL, ",")) { found_match = FALSE; reject_item = FALSE; /* strip trailing spaces */ strip(temp_ptr); /* should we use regular expression matching? */ if(use_regexp_matches == TRUE && (use_true_regexp_matching == TRUE || strstr(temp_ptr, "*") || strstr(temp_ptr, "?") || strstr(temp_ptr, "+") || strstr(temp_ptr, "\\."))) use_regexp = TRUE; else use_regexp = FALSE; /* use regular expression matching */ if(use_regexp == TRUE) { /* compile regular expression */ if(regcomp(&preg, temp_ptr, REG_EXTENDED)) { my_free(hostgroup_names); return ERROR; } /* test match against all hostgroup names */ for(temp_hostgroup = xodtemplate_hostgroup_list; temp_hostgroup != NULL; temp_hostgroup = temp_hostgroup->next) { if(temp_hostgroup->hostgroup_name == NULL) continue; /* skip this hostgroup if it did not match the expression */ if(regexec(&preg, temp_hostgroup->hostgroup_name, 0, NULL, 0)) continue; found_match = TRUE; /* dont' add hostgroups that shouldn't be registered */ if(temp_hostgroup->register_object == FALSE) continue; /* add hostgroup to list */ xodtemplate_add_member_to_memberlist(list, temp_hostgroup->hostgroup_name, NULL); } /* free memory allocated to compiled regexp */ regfree(&preg); } /* use standard matching... */ else { /* return a list of all hostgroups */ if(!strcmp(temp_ptr, "*")) { found_match = TRUE; for(temp_hostgroup = xodtemplate_hostgroup_list; temp_hostgroup != NULL; temp_hostgroup = temp_hostgroup->next) { /* dont' add hostgroups that shouldn't be registered */ if(temp_hostgroup->register_object == FALSE) continue; /* add hostgroup to list */ xodtemplate_add_member_to_memberlist(list, temp_hostgroup->hostgroup_name, NULL); } } /* else this is just a single hostgroup... */ else { /* this hostgroup should be excluded (rejected) */ if(temp_ptr[0] == '!') { reject_item = TRUE; temp_ptr++; } /* find the hostgroup */ temp_hostgroup = xodtemplate_find_real_hostgroup(temp_ptr); if(temp_hostgroup != NULL) { found_match = TRUE; /* add hostgroup to proper list */ xodtemplate_add_member_to_memberlist((reject_item == TRUE) ? reject_list : list, temp_hostgroup->hostgroup_name, NULL); } } } if(found_match == FALSE) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not find any hostgroup matching '%s' (config file '%s', starting on line %d)\n", temp_ptr, xodtemplate_config_file_name(_config_file), _start_line); break; } } /* free memory */ my_free(hostgroup_names); if(found_match == FALSE) return ERROR; return OK; } /* returns a comma-delimited list of contactgroup names */ char * xodtemplate_process_contactgroup_names(char *contactgroups, int _config_file, int _start_line) { xodtemplate_memberlist *temp_list = NULL; xodtemplate_memberlist *reject_list = NULL; xodtemplate_memberlist *list_ptr = NULL; xodtemplate_memberlist *reject_ptr = NULL; xodtemplate_memberlist *this_list = NULL; char *buf = NULL; int result = OK; /* process list of contactgroups... */ if(contactgroups != NULL) { /* split group names into two lists */ result = xodtemplate_get_contactgroup_names(&temp_list, &reject_list, contactgroups, _config_file, _start_line); if(result != OK) { xodtemplate_free_memberlist(&temp_list); xodtemplate_free_memberlist(&reject_list); return NULL; } /* remove rejects (if any) from the list (no duplicate entries exist in either list) */ for(reject_ptr = reject_list; reject_ptr != NULL; reject_ptr = reject_ptr->next) { for(list_ptr = temp_list; list_ptr != NULL; list_ptr = list_ptr->next) { if(!strcmp(reject_ptr->name1, list_ptr->name1)) { xodtemplate_remove_memberlist_item(list_ptr, &temp_list); break; } } } xodtemplate_free_memberlist(&reject_list); reject_list = NULL; } /* generate the list of group members */ for(this_list = temp_list; this_list != NULL; this_list = this_list->next) { if(buf == NULL) { buf = (char *)malloc(strlen(this_list->name1) + 1); strcpy(buf, this_list->name1); } else { buf = (char *)realloc(buf, strlen(buf) + strlen(this_list->name1) + 2); strcat(buf, ","); strcat(buf, this_list->name1); } } xodtemplate_free_memberlist(&temp_list); return buf; } /* return a list of contactgroup names */ int xodtemplate_get_contactgroup_names(xodtemplate_memberlist **list, xodtemplate_memberlist **reject_list, char *contactgroups, int _config_file, int _start_line) { char *contactgroup_names = NULL; char *temp_ptr = NULL; xodtemplate_contactgroup *temp_contactgroup = NULL; regex_t preg; int found_match = TRUE; int reject_item = FALSE; int use_regexp = FALSE; if(list == NULL || contactgroups == NULL) return ERROR; /* allocate memory for contactgroup name list */ if((contactgroup_names = (char *)strdup(contactgroups)) == NULL) return ERROR; for(temp_ptr = strtok(contactgroup_names, ","); temp_ptr; temp_ptr = strtok(NULL, ",")) { found_match = FALSE; reject_item = FALSE; /* strip trailing spaces */ strip(temp_ptr); /* should we use regular expression matching? */ if(use_regexp_matches == TRUE && (use_true_regexp_matching == TRUE || strstr(temp_ptr, "*") || strstr(temp_ptr, "?") || strstr(temp_ptr, "+") || strstr(temp_ptr, "\\."))) use_regexp = TRUE; else use_regexp = FALSE; /* use regular expression matching */ if(use_regexp == TRUE) { /* compile regular expression */ if(regcomp(&preg, temp_ptr, REG_EXTENDED)) { my_free(contactgroup_names); return ERROR; } /* test match against all contactgroup names */ for(temp_contactgroup = xodtemplate_contactgroup_list; temp_contactgroup != NULL; temp_contactgroup = temp_contactgroup->next) { if(temp_contactgroup->contactgroup_name == NULL) continue; /* skip this contactgroup if it did not match the expression */ if(regexec(&preg, temp_contactgroup->contactgroup_name, 0, NULL, 0)) continue; found_match = TRUE; /* dont' add contactgroups that shouldn't be registered */ if(temp_contactgroup->register_object == FALSE) continue; /* add contactgroup to list */ xodtemplate_add_member_to_memberlist(list, temp_contactgroup->contactgroup_name, NULL); } /* free memory allocated to compiled regexp */ regfree(&preg); } /* use standard matching... */ else { /* return a list of all contactgroups */ if(!strcmp(temp_ptr, "*")) { found_match = TRUE; for(temp_contactgroup = xodtemplate_contactgroup_list; temp_contactgroup != NULL; temp_contactgroup = temp_contactgroup->next) { /* dont' add contactgroups that shouldn't be registered */ if(temp_contactgroup->register_object == FALSE) continue; /* add contactgroup to list */ xodtemplate_add_member_to_memberlist(list, temp_contactgroup->contactgroup_name, NULL); } } /* else this is just a single contactgroup... */ else { /* this contactgroup should be excluded (rejected) */ if(temp_ptr[0] == '!') { reject_item = TRUE; temp_ptr++; } /* find the contactgroup */ temp_contactgroup = xodtemplate_find_real_contactgroup(temp_ptr); if(temp_contactgroup != NULL) { found_match = TRUE; /* add contactgroup members to proper list */ xodtemplate_add_member_to_memberlist((reject_item == TRUE) ? reject_list : list, temp_contactgroup->contactgroup_name, NULL); } } } if(found_match == FALSE) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not find any contactgroup matching '%s' (config file '%s', starting on line %d)\n", temp_ptr, xodtemplate_config_file_name(_config_file), _start_line); break; } } /* free memory */ my_free(contactgroup_names); if(found_match == FALSE) return ERROR; return OK; } /* returns a comma-delimited list of servicegroup names */ char * xodtemplate_process_servicegroup_names(char *servicegroups, int _config_file, int _start_line) { xodtemplate_memberlist *temp_list = NULL; xodtemplate_memberlist *reject_list = NULL; xodtemplate_memberlist *list_ptr = NULL; xodtemplate_memberlist *reject_ptr = NULL; xodtemplate_memberlist *this_list = NULL; char *buf = NULL; int result = OK; /* process list of servicegroups... */ if(servicegroups != NULL) { /* split group names into two lists */ result = xodtemplate_get_servicegroup_names(&temp_list, &reject_list, servicegroups, _config_file, _start_line); if(result != OK) { xodtemplate_free_memberlist(&temp_list); xodtemplate_free_memberlist(&reject_list); return NULL; } /* remove rejects (if any) from the list (no duplicate entries exist in either list) */ for(reject_ptr = reject_list; reject_ptr != NULL; reject_ptr = reject_ptr->next) { for(list_ptr = temp_list; list_ptr != NULL; list_ptr = list_ptr->next) { if(!strcmp(reject_ptr->name1, list_ptr->name1)) { xodtemplate_remove_memberlist_item(list_ptr, &temp_list); break; } } } xodtemplate_free_memberlist(&reject_list); reject_list = NULL; } /* generate the list of group members */ for(this_list = temp_list; this_list != NULL; this_list = this_list->next) { if(buf == NULL) { buf = (char *)malloc(strlen(this_list->name1) + 1); strcpy(buf, this_list->name1); } else { buf = (char *)realloc(buf, strlen(buf) + strlen(this_list->name1) + 2); strcat(buf, ","); strcat(buf, this_list->name1); } } xodtemplate_free_memberlist(&temp_list); return buf; } /* return a list of servicegroup names */ int xodtemplate_get_servicegroup_names(xodtemplate_memberlist **list, xodtemplate_memberlist **reject_list, char *servicegroups, int _config_file, int _start_line) { char *servicegroup_names = NULL; char *temp_ptr = NULL; xodtemplate_servicegroup *temp_servicegroup = NULL; regex_t preg; int found_match = TRUE; int reject_item = FALSE; int use_regexp = FALSE; if(list == NULL || servicegroups == NULL) return ERROR; /* allocate memory for servicegroup name list */ if((servicegroup_names = (char *)strdup(servicegroups)) == NULL) return ERROR; for(temp_ptr = strtok(servicegroup_names, ","); temp_ptr; temp_ptr = strtok(NULL, ",")) { found_match = FALSE; reject_item = FALSE; /* strip trailing spaces */ strip(temp_ptr); /* should we use regular expression matching? */ if(use_regexp_matches == TRUE && (use_true_regexp_matching == TRUE || strstr(temp_ptr, "*") || strstr(temp_ptr, "?") || strstr(temp_ptr, "+") || strstr(temp_ptr, "\\."))) use_regexp = TRUE; else use_regexp = FALSE; /* use regular expression matching */ if(use_regexp == TRUE) { /* compile regular expression */ if(regcomp(&preg, temp_ptr, REG_EXTENDED)) { my_free(servicegroup_names); return ERROR; } /* test match against all servicegroup names */ for(temp_servicegroup = xodtemplate_servicegroup_list; temp_servicegroup != NULL; temp_servicegroup = temp_servicegroup->next) { if(temp_servicegroup->servicegroup_name == NULL) continue; /* skip this servicegroup if it did not match the expression */ if(regexec(&preg, temp_servicegroup->servicegroup_name, 0, NULL, 0)) continue; found_match = TRUE; /* dont' add servicegroups that shouldn't be registered */ if(temp_servicegroup->register_object == FALSE) continue; /* add servicegroup to list */ xodtemplate_add_member_to_memberlist(list, temp_servicegroup->servicegroup_name, NULL); } /* free memory allocated to compiled regexp */ regfree(&preg); } /* use standard matching... */ else { /* return a list of all servicegroups */ if(!strcmp(temp_ptr, "*")) { found_match = TRUE; for(temp_servicegroup = xodtemplate_servicegroup_list; temp_servicegroup != NULL; temp_servicegroup = temp_servicegroup->next) { /* dont' add servicegroups that shouldn't be registered */ if(temp_servicegroup->register_object == FALSE) continue; /* add servicegroup to list */ xodtemplate_add_member_to_memberlist(list, temp_servicegroup->servicegroup_name, NULL); } } /* else this is just a single servicegroup... */ else { /* this servicegroup should be excluded (rejected) */ if(temp_ptr[0] == '!') { reject_item = TRUE; temp_ptr++; } /* find the servicegroup */ temp_servicegroup = xodtemplate_find_real_servicegroup(temp_ptr); if(temp_servicegroup != NULL) { found_match = TRUE; /* add servicegroup members to proper list */ xodtemplate_add_member_to_memberlist((reject_item == TRUE) ? reject_list : list, temp_servicegroup->servicegroup_name, NULL); } } } if(found_match == FALSE) { logit(NSLOG_CONFIG_ERROR, TRUE, "Error: Could not find any servicegroup matching '%s' (config file '%s', starting on line %d)\n", temp_ptr, xodtemplate_config_file_name(_config_file), _start_line); break; } } /* free memory */ my_free(servicegroup_names); if(found_match == FALSE) return ERROR; return OK; } #ifndef NSCGI /******************************************************************/ /****************** ADDITIVE INHERITANCE STUFF ********************/ /******************************************************************/ /* determines the value of an inherited string */ int xodtemplate_get_inherited_string(char *have_template_value, char **template_value, char *have_this_value, char **this_value) { char *buf = NULL; /* template has a value we should use */ if(*have_template_value == TRUE) { /* template has a non-NULL value */ if(*template_value != NULL) { /* we have no value... */ if(*this_value == NULL) { /* use the template value only if we need a value - otherwise stay NULL */ if(*have_this_value == FALSE) { /* NOTE: leave leading + sign if present, as it needed during object resolution and will get stripped later */ *this_value = (char *)strdup(*template_value); } } /* we already have a value... */ else { /* our value should be added to the template value */ if(*this_value[0] == '+') { if((buf = (char *)malloc(strlen(*template_value) + strlen(*this_value) + 1))) { strcpy(buf, *template_value); strcat(buf, ","); strcat(buf, *this_value + 1); my_free(*this_value); *this_value = buf; } } /* otherwise our value overrides/replaces the template value */ } } /* template has a NULL value.... */ *have_this_value = TRUE; } return OK; } /* removes leading + sign from various directives */ int xodtemplate_clean_additive_string(char **str) { char *buf = NULL; /* remove the additive symbol if present */ if(*str != NULL && *str[0] == '+') { buf = (char *)strdup(*str + 1); my_free(*str); *str = buf; } return OK; } /* cleans strings which may contain additive inheritance directives */ /* NOTE: this must be done after objects are resolved */ int xodtemplate_clean_additive_strings(void) { xodtemplate_contactgroup *temp_contactgroup = NULL; xodtemplate_hostgroup *temp_hostgroup = NULL; xodtemplate_servicegroup *temp_servicegroup = NULL; xodtemplate_servicedependency *temp_servicedependency = NULL; xodtemplate_serviceescalation *temp_serviceescalation = NULL; xodtemplate_contact *temp_contact = NULL; xodtemplate_host *temp_host = NULL; xodtemplate_service *temp_service = NULL; xodtemplate_hostdependency *temp_hostdependency = NULL; xodtemplate_hostescalation *temp_hostescalation = NULL; /* resolve all contactgroup objects */ for(temp_contactgroup = xodtemplate_contactgroup_list; temp_contactgroup != NULL; temp_contactgroup = temp_contactgroup->next) { xodtemplate_clean_additive_string(&temp_contactgroup->members); xodtemplate_clean_additive_string(&temp_contactgroup->contactgroup_members); } /* resolve all hostgroup objects */ for(temp_hostgroup = xodtemplate_hostgroup_list; temp_hostgroup != NULL; temp_hostgroup = temp_hostgroup->next) { xodtemplate_clean_additive_string(&temp_hostgroup->members); xodtemplate_clean_additive_string(&temp_hostgroup->hostgroup_members); } /* resolve all servicegroup objects */ for(temp_servicegroup = xodtemplate_servicegroup_list; temp_servicegroup != NULL; temp_servicegroup = temp_servicegroup->next) { xodtemplate_clean_additive_string(&temp_servicegroup->members); xodtemplate_clean_additive_string(&temp_servicegroup->servicegroup_members); } /* resolve all servicedependency objects */ for(temp_servicedependency = xodtemplate_servicedependency_list; temp_servicedependency != NULL; temp_servicedependency = temp_servicedependency->next) { xodtemplate_clean_additive_string(&temp_servicedependency->servicegroup_name); xodtemplate_clean_additive_string(&temp_servicedependency->hostgroup_name); xodtemplate_clean_additive_string(&temp_servicedependency->host_name); xodtemplate_clean_additive_string(&temp_servicedependency->service_description); xodtemplate_clean_additive_string(&temp_servicedependency->dependent_servicegroup_name); xodtemplate_clean_additive_string(&temp_servicedependency->dependent_hostgroup_name); xodtemplate_clean_additive_string(&temp_servicedependency->dependent_host_name); xodtemplate_clean_additive_string(&temp_servicedependency->dependent_service_description); } /* resolve all serviceescalation objects */ for(temp_serviceescalation = xodtemplate_serviceescalation_list; temp_serviceescalation != NULL; temp_serviceescalation = temp_serviceescalation->next) { /* 03/05/08 some vars are now handled in xodtemplate_inherit_object_properties() */ /* xodtemplate_clean_additive_string(&temp_serviceescalation->contact_groups); xodtemplate_clean_additive_string(&temp_serviceescalation->contacts); */ xodtemplate_clean_additive_string(&temp_serviceescalation->servicegroup_name); xodtemplate_clean_additive_string(&temp_serviceescalation->hostgroup_name); xodtemplate_clean_additive_string(&temp_serviceescalation->host_name); xodtemplate_clean_additive_string(&temp_serviceescalation->service_description); } /* resolve all contact objects */ for(temp_contact = xodtemplate_contact_list; temp_contact != NULL; temp_contact = temp_contact->next) { xodtemplate_clean_additive_string(&temp_contact->contact_groups); xodtemplate_clean_additive_string(&temp_contact->host_notification_commands); xodtemplate_clean_additive_string(&temp_contact->service_notification_commands); } /* clean all host objects */ for(temp_host = xodtemplate_host_list; temp_host != NULL; temp_host = temp_host->next) { xodtemplate_clean_additive_string(&temp_host->contact_groups); xodtemplate_clean_additive_string(&temp_host->contacts); xodtemplate_clean_additive_string(&temp_host->parents); xodtemplate_clean_additive_string(&temp_host->host_groups); } /* clean all service objects */ for(temp_service = xodtemplate_service_list; temp_service != NULL; temp_service = temp_service->next) { xodtemplate_clean_additive_string(&temp_service->contact_groups); xodtemplate_clean_additive_string(&temp_service->contacts); xodtemplate_clean_additive_string(&temp_service->host_name); xodtemplate_clean_additive_string(&temp_service->hostgroup_name); xodtemplate_clean_additive_string(&temp_service->service_groups); } /* resolve all hostdependency objects */ for(temp_hostdependency = xodtemplate_hostdependency_list; temp_hostdependency != NULL; temp_hostdependency = temp_hostdependency->next) { xodtemplate_clean_additive_string(&temp_hostdependency->host_name); xodtemplate_clean_additive_string(&temp_hostdependency->dependent_host_name); xodtemplate_clean_additive_string(&temp_hostdependency->hostgroup_name); xodtemplate_clean_additive_string(&temp_hostdependency->dependent_hostgroup_name); } /* resolve all hostescalation objects */ for(temp_hostescalation = xodtemplate_hostescalation_list; temp_hostescalation != NULL; temp_hostescalation = temp_hostescalation->next) { /* 03/05/08 some vars are now handled in xodtemplate_inherit_object_properties() */ /* xodtemplate_clean_additive_string(&temp_hostescalation->contact_groups); xodtemplate_clean_additive_string(&temp_hostescalation->contacts); */ xodtemplate_clean_additive_string(&temp_hostescalation->host_name); xodtemplate_clean_additive_string(&temp_hostescalation->hostgroup_name); } return OK; } #endif nagios-4.3.4/xdata/xodtemplate.h000066400000000000000000000742071314764422400166230ustar00rootroot00000000000000/***************************************************************************** * * XODTEMPLATE.H - Template-based object configuration data header file * * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #ifndef NAGIOS_XODTEMPLATE_H_INCLUDED #define NAGIOS_XODTEMPLATE_H_INCLUDED /*********** GENERAL DEFINITIONS ************/ #define XODTEMPLATE_NULL "null" #define MAX_XODTEMPLATE_INPUT_BUFFER 1024 #define MAX_XODTEMPLATE_CONTACT_ADDRESSES 6 #define XODTEMPLATE_NONE 0 #define XODTEMPLATE_TIMEPERIOD 1 #define XODTEMPLATE_COMMAND 2 #define XODTEMPLATE_CONTACT 3 #define XODTEMPLATE_CONTACTGROUP 4 #define XODTEMPLATE_HOST 5 #define XODTEMPLATE_HOSTGROUP 6 #define XODTEMPLATE_SERVICE 7 #define XODTEMPLATE_SERVICEDEPENDENCY 8 #define XODTEMPLATE_SERVICEESCALATION 9 #define XODTEMPLATE_HOSTESCALATION 10 #define XODTEMPLATE_HOSTDEPENDENCY 11 #define XODTEMPLATE_HOSTEXTINFO 12 #define XODTEMPLATE_SERVICEEXTINFO 13 #define XODTEMPLATE_SERVICEGROUP 14 /***************** SKIP LISTS ****************/ #define HOSTEXTINFO_SKIPLIST (NUM_OBJECT_SKIPLISTS) #define SERVICEEXTINFO_SKIPLIST (NUM_OBJECT_SKIPLISTS + 1) #define NUM_XOBJECT_SKIPLISTS (NUM_OBJECT_SKIPLISTS + 2) /********** STRUCTURE DEFINITIONS **********/ /* CUSTOMVARIABLESMEMBER structure */ typedef struct xodtemplate_customvariablesmember_struct { char *variable_name; char *variable_value; struct xodtemplate_customvariablesmember_struct *next; } xodtemplate_customvariablesmember; /* DATERANGE structure */ typedef struct xodtemplate_daterange_struct { int type; int syear; /* start year */ int smon; /* start month */ int smday; /* start day of month (may 3rd, last day in feb) */ int swday; /* start day of week (thursday) */ int swday_offset; /* start weekday offset (3rd thursday, last monday in jan) */ int eyear; int emon; int emday; int ewday; int ewday_offset; int skip_interval; char *timeranges; struct xodtemplate_daterange_struct *next; } xodtemplate_daterange; /* TIMEPERIOD TEMPLATE STRUCTURE */ typedef struct xodtemplate_timeperiod_struct { char *template; char *name; int _config_file; int _start_line; char *timeperiod_name; char *alias; char *timeranges[7]; xodtemplate_daterange *exceptions[DATERANGE_TYPES]; char *exclusions; unsigned has_been_resolved : 1; unsigned register_object : 1; struct xodtemplate_timeperiod_struct *next; } xodtemplate_timeperiod; /* COMMAND TEMPLATE STRUCTURE */ typedef struct xodtemplate_command_struct { char *template; char *name; int _config_file; int _start_line; char *command_name; char *command_line; unsigned has_been_resolved : 1; unsigned register_object : 1; struct xodtemplate_command_struct *next; } xodtemplate_command; /* CONTACT TEMPLATE STRUCTURE */ typedef struct xodtemplate_contact_struct { unsigned int id; char *template; char *name; int _config_file; int _start_line; char *contact_name; char *alias; char *contact_groups; char *email; char *pager; char *address[MAX_XODTEMPLATE_CONTACT_ADDRESSES]; char *host_notification_period; char *host_notification_commands; int host_notification_options; char *service_notification_period; char *service_notification_commands; int service_notification_options; int host_notifications_enabled; int service_notifications_enabled; int can_submit_commands; int retain_status_information; int retain_nonstatus_information; unsigned int minimum_value; xodtemplate_customvariablesmember *custom_variables; char have_contact_groups; char have_email; char have_pager; char have_address[MAX_XODTEMPLATE_CONTACT_ADDRESSES]; char have_host_notification_period; char have_host_notification_commands; char have_service_notification_period; char have_service_notification_commands; char have_host_notification_options; char have_service_notification_options; char have_host_notifications_enabled; char have_service_notifications_enabled; char have_can_submit_commands; char have_retain_status_information; char have_retain_nonstatus_information; unsigned have_minimum_value : 1; unsigned has_been_resolved : 1; unsigned register_object : 1; struct xodtemplate_contact_struct *next; } xodtemplate_contact; /* CONTACTGROUP TEMPLATE STRUCTURE */ typedef struct xodtemplate_contactgroup_struct { char *template; char *name; int _config_file; int _start_line; char *contactgroup_name; char *alias; char *members; char *contactgroup_members; objectlist *member_list; objectlist *group_list; bitmap *member_map; bitmap *reject_map; int loop_status; char have_members; char have_contactgroup_members; unsigned has_been_resolved : 1; unsigned register_object : 1; struct xodtemplate_contactgroup_struct *next; } xodtemplate_contactgroup; /* HOST TEMPLATE STRUCTURE */ typedef struct xodtemplate_host_struct { unsigned int id; char *template; char *name; int _config_file; int _start_line; char *host_name; char *display_name; char *alias; char *address; char *parents; char *host_groups; char *check_command; char *check_period; unsigned int hourly_value; int initial_state; double check_interval; double retry_interval; int max_check_attempts; int active_checks_enabled; int passive_checks_enabled; int obsess; char *event_handler; int event_handler_enabled; int check_freshness; int freshness_threshold; float low_flap_threshold; float high_flap_threshold; int flap_detection_enabled; int flap_detection_options; char *contact_groups; char *contacts; int notification_options; int notifications_enabled; char *notification_period; double notification_interval; double first_notification_delay; int stalking_options; int process_perf_data; char *notes; char *notes_url; char *action_url; char *icon_image; char *icon_image_alt; char *vrml_image; char *statusmap_image; int x_2d; int y_2d; double x_3d; double y_3d; double z_3d; int retain_status_information; int retain_nonstatus_information; xodtemplate_customvariablesmember *custom_variables; /* these can't be bitfields */ char have_host_groups; char have_contact_groups; char have_contacts; char have_parents; unsigned have_display_name : 1; unsigned have_check_command : 1; unsigned have_check_period : 1; unsigned have_event_handler : 1; unsigned have_notification_period : 1; unsigned have_notes : 1; unsigned have_notes_url : 1; unsigned have_action_url : 1; unsigned have_icon_image : 1; unsigned have_icon_image_alt : 1; unsigned have_vrml_image : 1; unsigned have_statusmap_image : 1; unsigned have_initial_state : 1; unsigned have_check_interval : 1; unsigned have_retry_interval : 1; unsigned have_max_check_attempts : 1; unsigned have_active_checks_enabled : 1; unsigned have_passive_checks_enabled : 1; unsigned have_obsess : 1; unsigned have_event_handler_enabled : 1; unsigned have_check_freshness : 1; unsigned have_freshness_threshold : 1; unsigned have_low_flap_threshold : 1; unsigned have_high_flap_threshold : 1; unsigned have_flap_detection_enabled : 1; unsigned have_flap_detection_options : 1; unsigned have_notification_options : 1; unsigned have_notifications_enabled : 1; unsigned have_notification_interval : 1; unsigned have_first_notification_delay : 1; unsigned have_stalking_options : 1; unsigned have_process_perf_data : 1; unsigned have_2d_coords : 1; unsigned have_3d_coords : 1; unsigned have_retain_status_information : 1; unsigned have_retain_nonstatus_information : 1; unsigned have_hourly_value : 1; unsigned has_been_resolved : 1; unsigned register_object : 1; struct xodtemplate_host_struct *next; } xodtemplate_host; /* HOSTGROUP TEMPLATE STRUCTURE */ typedef struct xodtemplate_hostgroup_struct { char *template; char *name; int _config_file; int _start_line; char *hostgroup_name; char *alias; char *members; char *hostgroup_members; char *notes; char *notes_url; char *action_url; objectlist *member_list; objectlist *group_list; bitmap *member_map; bitmap *reject_map; int loop_status; char have_members; char have_hostgroup_members; char have_notes; char have_notes_url; char have_action_url; unsigned has_been_resolved : 1; unsigned register_object : 1; struct xodtemplate_hostgroup_struct *next; } xodtemplate_hostgroup; /* SERVICE TEMPLATE STRUCTURE */ typedef struct xodtemplate_service_struct { unsigned int id; char *template; char *name; int _config_file; int _start_line; char *host_name; char *service_description; char *display_name; char *parents; char *hostgroup_name; char *service_groups; char *check_command; int initial_state; int max_check_attempts; double check_interval; double retry_interval; char *check_period; unsigned int hourly_value; int active_checks_enabled; int passive_checks_enabled; int parallelize_check; int is_volatile; int obsess; char *event_handler; int event_handler_enabled; int check_freshness; int freshness_threshold; double low_flap_threshold; double high_flap_threshold; int flap_detection_enabled; int flap_detection_options; int notification_options; int notifications_enabled; char *notification_period; double notification_interval; double first_notification_delay; char *contact_groups; char *contacts; int stalking_options; int process_perf_data; char *notes; char *notes_url; char *action_url; char *icon_image; char *icon_image_alt; int retain_status_information; int retain_nonstatus_information; xodtemplate_customvariablesmember *custom_variables; /* these can't be bitfields */ char have_parents; char have_contact_groups; char have_contacts; char have_host_name; char have_hostgroup_name; char have_service_groups; unsigned have_service_description : 1; unsigned have_display_name : 1; unsigned have_check_command : 1; unsigned have_important_check_command : 1; unsigned have_check_period : 1; unsigned have_event_handler : 1; unsigned have_notification_period : 1; unsigned have_notes : 1; unsigned have_notes_url : 1; unsigned have_action_url : 1; unsigned have_icon_image : 1; unsigned have_icon_image_alt : 1; unsigned have_initial_state : 1; unsigned have_max_check_attempts : 1; unsigned have_check_interval : 1; unsigned have_retry_interval : 1; unsigned have_active_checks_enabled : 1; unsigned have_passive_checks_enabled : 1; unsigned have_parallelize_check : 1; unsigned have_is_volatile : 1; unsigned have_obsess : 1; unsigned have_event_handler_enabled : 1; unsigned have_check_freshness : 1; unsigned have_freshness_threshold : 1; unsigned have_low_flap_threshold : 1; unsigned have_high_flap_threshold : 1; unsigned have_flap_detection_enabled : 1; unsigned have_flap_detection_options : 1; unsigned have_notification_options : 1; unsigned have_notifications_enabled : 1; unsigned have_notification_dependencies : 1; unsigned have_notification_interval : 1; unsigned have_first_notification_delay : 1; unsigned have_stalking_options : 1; unsigned have_process_perf_data : 1; unsigned have_retain_status_information : 1; unsigned have_retain_nonstatus_information : 1; unsigned have_hourly_value : 1; unsigned is_from_hostgroup : 1; unsigned is_copy : 1; unsigned has_been_resolved : 1; unsigned register_object : 1; struct xodtemplate_service_struct *next; } xodtemplate_service; /* SERVICEGROUP TEMPLATE STRUCTURE */ typedef struct xodtemplate_servicegroup_struct { char *template; char *name; int _config_file; int _start_line; char *servicegroup_name; char *alias; char *members; char *servicegroup_members; char *notes; char *notes_url; char *action_url; objectlist *member_list; objectlist *group_list; bitmap *member_map; bitmap *reject_map; int loop_status; char have_members; char have_servicegroup_members; char have_notes; char have_notes_url; char have_action_url; unsigned has_been_resolved : 1; unsigned register_object : 1; struct xodtemplate_servicegroup_struct *next; } xodtemplate_servicegroup; /* SERVICEDEPENDENCY TEMPLATE STRUCTURE */ typedef struct xodtemplate_servicedependency_struct { char *template; char *name; int _config_file; int _start_line; char *host_name; char *service_description; char *dependent_host_name; char *dependent_service_description; char *servicegroup_name; char *hostgroup_name; char *dependent_servicegroup_name; char *dependent_hostgroup_name; char *dependency_period; int inherits_parent; int notification_failure_options; int execution_failure_options; char have_host_name; char have_service_description; char have_dependent_host_name; char have_dependent_service_description; char have_servicegroup_name; char have_hostgroup_name; char have_dependent_servicegroup_name; char have_dependent_hostgroup_name; char have_dependency_period; char have_inherits_parent; char have_notification_failure_options; char have_execution_failure_options; unsigned is_copy : 1; unsigned has_been_resolved : 1; unsigned register_object : 1; struct xodtemplate_servicedependency_struct *next; } xodtemplate_servicedependency; /* SERVICEESCALATION TEMPLATE STRUCTURE */ typedef struct xodtemplate_serviceescalation_struct { char *template; char *name; int _config_file; int _start_line; char *host_name; char *service_description; char *servicegroup_name; char *hostgroup_name; int first_notification; int last_notification; double notification_interval; char *escalation_period; int escalation_options; char *contact_groups; char *contacts; char have_host_name; char have_service_description; char have_servicegroup_name; char have_hostgroup_name; char have_escalation_period; char have_contact_groups; char have_contacts; char have_first_notification; char have_last_notification; char have_notification_interval; char have_escalation_options; unsigned is_copy : 1; unsigned has_been_resolved : 1; unsigned register_object : 1; struct xodtemplate_serviceescalation_struct *next; } xodtemplate_serviceescalation; /* HOSTDEPENDENCY TEMPLATE STRUCTURE */ typedef struct xodtemplate_hostdependency_struct { char *template; char *name; int _config_file; int _start_line; char *host_name; char *dependent_host_name; char *hostgroup_name; char *dependent_hostgroup_name; char *dependency_period; int inherits_parent; int notification_failure_options; int execution_failure_options; char have_host_name; char have_dependent_host_name; char have_hostgroup_name; char have_dependent_hostgroup_name; char have_dependency_period; char have_inherits_parent; char have_notification_failure_options; char have_execution_failure_options; unsigned is_copy : 1; unsigned has_been_resolved : 1; unsigned register_object : 1; struct xodtemplate_hostdependency_struct *next; } xodtemplate_hostdependency; /* HOSTESCALATION TEMPLATE STRUCTURE */ typedef struct xodtemplate_hostescalation_struct { unsigned int id; char *template; char *name; int _config_file; int _start_line; char *host_name; char *hostgroup_name; int first_notification; int last_notification; double notification_interval; char *escalation_period; int escalation_options; char *contact_groups; char *contacts; char have_host_name; char have_hostgroup_name; char have_escalation_period; char have_contact_groups; char have_contacts; char have_first_notification; char have_last_notification; char have_notification_interval; char have_escalation_options; unsigned is_copy : 1; unsigned has_been_resolved : 1; unsigned register_object : 1; struct xodtemplate_hostescalation_struct *next; } xodtemplate_hostescalation; /* HOSTEXTINFO TEMPLATE STRUCTURE */ typedef struct xodtemplate_hostextinfo_struct { char *template; char *name; int _config_file; int _start_line; char *host_name; char *hostgroup_name; char *notes; char *notes_url; char *action_url; char *icon_image; char *icon_image_alt; char *vrml_image; char *statusmap_image; int x_2d; int y_2d; double x_3d; double y_3d; double z_3d; char have_host_name; char have_hostgroup_name; char have_notes; char have_notes_url; char have_action_url; char have_icon_image; char have_icon_image_alt; char have_vrml_image; char have_statusmap_image; char have_2d_coords; char have_3d_coords; unsigned has_been_resolved : 1; unsigned register_object : 1; struct xodtemplate_hostextinfo_struct *next; } xodtemplate_hostextinfo; /* SERVICEEXTINFO TEMPLATE STRUCTURE */ typedef struct xodtemplate_serviceextinfo_struct { char *template; char *name; int _config_file; int _start_line; char *host_name; char *hostgroup_name; char *service_description; char *notes; char *notes_url; char *action_url; char *icon_image; char *icon_image_alt; char have_host_name; char have_hostgroup_name; char have_service_description; char have_notes; char have_notes_url; char have_action_url; char have_icon_image; char have_icon_image_alt; unsigned has_been_resolved : 1; unsigned register_object : 1; struct xodtemplate_serviceextinfo_struct *next; } xodtemplate_serviceextinfo; /* CONTACT LIST STRUCTURE */ typedef struct xodtemplate_contactlist_struct { char *contact_name; struct xodtemplate_contactlist_struct *next; } xodtemplate_contactlist; /* HOST LIST STRUCTURE */ typedef struct xodtemplate_hostlist_struct { char *host_name; struct xodtemplate_hostlist_struct *next; } xodtemplate_hostlist; /* SERVICE LIST STRUCTURE */ typedef struct xodtemplate_servicelist_struct { char *host_name; char *service_description; struct xodtemplate_servicelist_struct *next; } xodtemplate_servicelist; /* MEMBER LIST STRUCTURE */ typedef struct xodtemplate_memberlist_struct { char *name1; char *name2; struct xodtemplate_memberlist_struct *next; } xodtemplate_memberlist; /***** CHAINED HASH DATA STRUCTURES ******/ typedef struct xodtemplate_service_cursor_struct { int xodtemplate_service_iterator; xodtemplate_service *current_xodtemplate_service; } xodtemplate_service_cursor; /********* FUNCTION DEFINITIONS **********/ int xodtemplate_read_config_data(const char *, int); /* top-level routine processes all config files */ int xodtemplate_process_config_file(char *, int); /* process data in a specific config file */ int xodtemplate_process_config_dir(char *, int); /* process all files in a specific config directory */ int xodtemplate_expand_services(objectlist **, bitmap *, char *, char *, int, int); int xodtemplate_expand_contactgroups(objectlist **, bitmap *, char *, int, int); int xodtemplate_expand_contacts(objectlist **, bitmap *, char *, int, int); objectlist *xodtemplate_expand_hostgroups_and_hosts(char *, char *, int, int); int xodtemplate_expand_hostgroups(objectlist **, bitmap *, char *, int, int); int xodtemplate_expand_hosts(objectlist **list, bitmap *reject_map, char *, int, int); int xodtemplate_expand_servicegroups(objectlist **, bitmap *, char *, int, int); char *xodtemplate_process_contactgroup_names(char *, int, int); int xodtemplate_get_contactgroup_names(xodtemplate_memberlist **, xodtemplate_memberlist **, char *, int, int); char *xodtemplate_process_hostgroup_names(char *, int, int); int xodtemplate_get_hostgroup_names(xodtemplate_memberlist **, xodtemplate_memberlist **, char *, int, int); char *xodtemplate_process_servicegroup_names(char *, int, int); int xodtemplate_get_servicegroup_names(xodtemplate_memberlist **, xodtemplate_memberlist **, char *, int, int); int xodtemplate_add_member_to_memberlist(xodtemplate_memberlist **, char *, char *); int xodtemplate_free_memberlist(xodtemplate_memberlist **); void xodtemplate_remove_memberlist_item(xodtemplate_memberlist *, xodtemplate_memberlist **); int xodtemplate_begin_object_definition(char *, int, int, int); int xodtemplate_add_object_property(char *, int); int xodtemplate_end_object_definition(int); int xodtemplate_parse_timeperiod_directive(xodtemplate_timeperiod *, char *, char *); xodtemplate_daterange *xodtemplate_add_exception_to_timeperiod(xodtemplate_timeperiod *, int, int, int, int, int, int, int, int, int, int, int, int, char *); int xodtemplate_get_month_from_string(char *, int *); int xodtemplate_get_weekday_from_string(char *, int *); xodtemplate_customvariablesmember *xodtemplate_add_custom_variable_to_host(xodtemplate_host *, char *, char *); xodtemplate_customvariablesmember *xodtemplate_add_custom_variable_to_service(xodtemplate_service *, char *, char *); xodtemplate_customvariablesmember *xodtemplate_add_custom_variable_to_contact(xodtemplate_contact *, char *, char *); xodtemplate_customvariablesmember *xodtemplate_add_custom_variable_to_object(xodtemplate_customvariablesmember **, char *, char *); int xodtemplate_register_objects(void); int xodtemplate_free_memory(void); #ifdef NSCORE int xodtemplate_duplicate_objects(void); int xodtemplate_duplicate_services(void); int xodtemplate_inherit_object_properties(void); int xodtemplate_resolve_objects(void); int xodtemplate_cache_objects(char *); int xodtemplate_duplicate_service(xodtemplate_service *, char *, int); int xodtemplate_duplicate_hostescalation(xodtemplate_hostescalation *, char *); int xodtemplate_duplicate_serviceescalation(xodtemplate_serviceescalation *, char *, char *); int xodtemplate_duplicate_hostdependency(xodtemplate_hostdependency *, char *, char *); int xodtemplate_duplicate_servicedependency(xodtemplate_servicedependency *, char *, char *, char *, char *); int xodtemplate_duplicate_hostextinfo(xodtemplate_hostextinfo *, char *); int xodtemplate_duplicate_serviceextinfo(xodtemplate_serviceextinfo *, char *); #endif int xodtemplate_recombobulate_contactgroups(void); int xodtemplate_recombobulate_hostgroups(void); int xodtemplate_recombobulate_servicegroups(void); #ifdef NSCORE int xodtemplate_resolve_timeperiod(xodtemplate_timeperiod *); int xodtemplate_resolve_command(xodtemplate_command *); int xodtemplate_resolve_contactgroup(xodtemplate_contactgroup *); int xodtemplate_resolve_hostgroup(xodtemplate_hostgroup *); int xodtemplate_resolve_servicegroup(xodtemplate_servicegroup *); int xodtemplate_resolve_servicedependency(xodtemplate_servicedependency *); int xodtemplate_resolve_serviceescalation(xodtemplate_serviceescalation *); int xodtemplate_resolve_contact(xodtemplate_contact *); int xodtemplate_resolve_host(xodtemplate_host *); int xodtemplate_resolve_service(xodtemplate_service *); int xodtemplate_resolve_hostdependency(xodtemplate_hostdependency *); int xodtemplate_resolve_hostescalation(xodtemplate_hostescalation *); int xodtemplate_resolve_hostextinfo(xodtemplate_hostextinfo *); int xodtemplate_resolve_serviceextinfo(xodtemplate_serviceextinfo *); int xodtemplate_merge_extinfo_ojects(void); int xodtemplate_merge_host_extinfo_object(xodtemplate_host *, xodtemplate_hostextinfo *); int xodtemplate_merge_service_extinfo_object(xodtemplate_service *, xodtemplate_serviceextinfo *); #endif xodtemplate_timeperiod *xodtemplate_find_timeperiod(char *); xodtemplate_command *xodtemplate_find_command(char *); xodtemplate_contactgroup *xodtemplate_find_contactgroup(char *); xodtemplate_contactgroup *xodtemplate_find_real_contactgroup(char *); xodtemplate_hostgroup *xodtemplate_find_hostgroup(char *); xodtemplate_hostgroup *xodtemplate_find_real_hostgroup(char *); xodtemplate_servicegroup *xodtemplate_find_servicegroup(char *); xodtemplate_servicegroup *xodtemplate_find_real_servicegroup(char *); xodtemplate_servicedependency *xodtemplate_find_servicedependency(char *); xodtemplate_serviceescalation *xodtemplate_find_serviceescalation(char *); xodtemplate_contact *xodtemplate_find_contact(char *); xodtemplate_contact *xodtemplate_find_real_contact(char *); xodtemplate_host *xodtemplate_find_host(char *); xodtemplate_host *xodtemplate_find_real_host(char *); xodtemplate_service *xodtemplate_find_service(char *); xodtemplate_service *xodtemplate_find_real_service(char *, char *); xodtemplate_hostdependency *xodtemplate_find_hostdependency(char *); xodtemplate_hostescalation *xodtemplate_find_hostescalation(char *); xodtemplate_hostextinfo *xodtemplate_find_hostextinfo(char *); xodtemplate_serviceextinfo *xodtemplate_find_serviceextinfo(char *); int xodtemplate_get_inherited_string(char *, char **, char *, char **); int xodtemplate_clean_additive_string(char **); int xodtemplate_clean_additive_strings(void); int xodtemplate_register_timeperiod(xodtemplate_timeperiod *); int xodtemplate_get_time_ranges(char *, unsigned long *, unsigned long *); int xodtemplate_register_command(xodtemplate_command *); int xodtemplate_register_contactgroup(xodtemplate_contactgroup *); int xodtemplate_register_hostgroup(xodtemplate_hostgroup *); int xodtemplate_register_servicegroup(xodtemplate_servicegroup *); int xodtemplate_register_servicedependency(xodtemplate_servicedependency *); int xodtemplate_register_serviceescalation(xodtemplate_serviceescalation *); int xodtemplate_register_contact(xodtemplate_contact *); int xodtemplate_register_host(xodtemplate_host *); int xodtemplate_register_service(xodtemplate_service *); int xodtemplate_register_hostdependency(xodtemplate_hostdependency *); int xodtemplate_register_hostescalation(xodtemplate_hostescalation *); int xodtemplate_init_xobject_skiplists(void); int xodtemplate_free_xobject_skiplists(void); int xodtemplate_skiplist_compare_host_template(void *a, void *b); int xodtemplate_skiplist_compare_service_template(void *a, void *b); int xodtemplate_skiplist_compare_command_template(void *a, void *b); int xodtemplate_skiplist_compare_timeperiod_template(void *a, void *b); int xodtemplate_skiplist_compare_contact_template(void *a, void *b); int xodtemplate_skiplist_compare_contactgroup_template(void *a, void *b); int xodtemplate_skiplist_compare_hostgroup_template(void *a, void *b); int xodtemplate_skiplist_compare_servicegroup_template(void *a, void *b); int xodtemplate_skiplist_compare_hostdependency_template(void *a, void *b); int xodtemplate_skiplist_compare_servicedependency_template(void *a, void *b); int xodtemplate_skiplist_compare_hostescalation_template(void *a, void *b); int xodtemplate_skiplist_compare_serviceescalation_template(void *a, void *b); int xodtemplate_skiplist_compare_hostextinfo_template(void *a, void *b); int xodtemplate_skiplist_compare_serviceextinfo_template(void *a, void *b); int xodtemplate_skiplist_compare_host(void *a, void *b); int xodtemplate_skiplist_compare_service(void *a, void *b); int xodtemplate_skiplist_compare_contact(void *a, void *b); int xodtemplate_skiplist_compare_contactgroup(void *a, void *b); int xodtemplate_skiplist_compare_hostgroup(void *a, void *b); int xodtemplate_skiplist_compare_servicegroup(void *a, void *b); int xodtemplate_skiplist_compare_command(void *a, void *b); int xodtemplate_skiplist_compare_timeperiod(void *a, void *b); int xodtemplate_skiplist_compare_hostdependency(void *a, void *b); int xodtemplate_skiplist_compare_servicedependency(void *a, void *b); int xodtemplate_skiplist_compare_hostescalation(void *a, void *b); int xodtemplate_skiplist_compare_serviceescalation(void *a, void *b); #endif nagios-4.3.4/xdata/xpddefault.c000066400000000000000000000527561314764422400164350ustar00rootroot00000000000000/***************************************************************************** * * XPDDEFAULT.C - Default performance data routines * * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ /*********** COMMON HEADER FILES ***********/ #include "../include/config.h" #include "../include/common.h" #include "../include/objects.h" #include "../include/macros.h" #include "../include/nagios.h" #include "../include/workers.h" #include "xpddefault.h" static command *host_perfdata_command_ptr = NULL; static command *service_perfdata_command_ptr = NULL; static command *host_perfdata_file_processing_command_ptr = NULL; static command *service_perfdata_file_processing_command_ptr = NULL; static FILE *host_perfdata_fp = NULL; static FILE *service_perfdata_fp = NULL; static int host_perfdata_fd = -1; static int service_perfdata_fd = -1; /******************************************************************/ /************** INITIALIZATION & CLEANUP FUNCTIONS ****************/ /******************************************************************/ /* initializes performance data */ int xpddefault_initialize_performance_data(const char *cfgfile) { char *buffer = NULL; char *temp_buffer = NULL; char *temp_command_name = NULL; command *temp_command = NULL; time_t current_time; nagios_macros *mac; mac = get_global_macros(); time(¤t_time); /* reset vars */ host_perfdata_command_ptr = NULL; service_perfdata_command_ptr = NULL; host_perfdata_file_processing_command_ptr = NULL; service_perfdata_file_processing_command_ptr = NULL; /* make sure we have some templates defined */ if(host_perfdata_file_template == NULL) host_perfdata_file_template = (char *)strdup(DEFAULT_HOST_PERFDATA_FILE_TEMPLATE); if(service_perfdata_file_template == NULL) service_perfdata_file_template = (char *)strdup(DEFAULT_SERVICE_PERFDATA_FILE_TEMPLATE); /* process special chars in templates */ xpddefault_preprocess_file_templates(host_perfdata_file_template); xpddefault_preprocess_file_templates(service_perfdata_file_template); /* open the performance data files */ xpddefault_open_host_perfdata_file(); xpddefault_open_service_perfdata_file(); /* verify that performance data commands are valid */ if(host_perfdata_command != NULL) { temp_buffer = (char *)strdup(host_perfdata_command); /* get the command name, leave any arguments behind */ temp_command_name = my_strtok(temp_buffer, "!"); if((temp_command = find_command(temp_command_name)) == NULL) { logit(NSLOG_RUNTIME_WARNING, TRUE, "Warning: Host performance command '%s' was not found - host performance data will not be processed!\n", temp_command_name); my_free(host_perfdata_command); } my_free(temp_buffer); /* save the command pointer for later */ host_perfdata_command_ptr = temp_command; } if(service_perfdata_command != NULL) { temp_buffer = (char *)strdup(service_perfdata_command); /* get the command name, leave any arguments behind */ temp_command_name = my_strtok(temp_buffer, "!"); if((temp_command = find_command(temp_command_name)) == NULL) { logit(NSLOG_RUNTIME_WARNING, TRUE, "Warning: Service performance command '%s' was not found - service performance data will not be processed!\n", temp_command_name); my_free(service_perfdata_command); } /* free memory */ my_free(temp_buffer); /* save the command pointer for later */ service_perfdata_command_ptr = temp_command; } if(host_perfdata_file_processing_command != NULL) { temp_buffer = (char *)strdup(host_perfdata_file_processing_command); /* get the command name, leave any arguments behind */ temp_command_name = my_strtok(temp_buffer, "!"); if((temp_command = find_command(temp_command_name)) == NULL) { logit(NSLOG_RUNTIME_WARNING, TRUE, "Warning: Host performance file processing command '%s' was not found - host performance data file will not be processed!\n", temp_command_name); my_free(host_perfdata_file_processing_command); } /* free memory */ my_free(temp_buffer); /* save the command pointer for later */ host_perfdata_file_processing_command_ptr = temp_command; } if(service_perfdata_file_processing_command != NULL) { temp_buffer = (char *)strdup(service_perfdata_file_processing_command); /* get the command name, leave any arguments behind */ temp_command_name = my_strtok(temp_buffer, "!"); if((temp_command = find_command(temp_command_name)) == NULL) { logit(NSLOG_RUNTIME_WARNING, TRUE, "Warning: Service performance file processing command '%s' was not found - service performance data file will not be processed!\n", temp_command_name); my_free(service_perfdata_file_processing_command); } /* save the command pointer for later */ service_perfdata_file_processing_command_ptr = temp_command; } /* periodically process the host perfdata file */ if(host_perfdata_file_processing_interval > 0 && host_perfdata_file_processing_command != NULL) schedule_new_event(EVENT_USER_FUNCTION, TRUE, current_time + host_perfdata_file_processing_interval, TRUE, host_perfdata_file_processing_interval, NULL, TRUE, (void *)xpddefault_process_host_perfdata_file, NULL, 0); /* periodically process the service perfdata file */ if(service_perfdata_file_processing_interval > 0 && service_perfdata_file_processing_command != NULL) schedule_new_event(EVENT_USER_FUNCTION, TRUE, current_time + service_perfdata_file_processing_interval, TRUE, service_perfdata_file_processing_interval, NULL, TRUE, (void *)xpddefault_process_service_perfdata_file, NULL, 0); /* save the host perf data file macro */ my_free(mac->x[MACRO_HOSTPERFDATAFILE]); if(host_perfdata_file != NULL) { if((mac->x[MACRO_HOSTPERFDATAFILE] = (char *)strdup(host_perfdata_file))) strip(mac->x[MACRO_HOSTPERFDATAFILE]); } /* save the service perf data file macro */ my_free(mac->x[MACRO_SERVICEPERFDATAFILE]); if(service_perfdata_file != NULL) { if((mac->x[MACRO_SERVICEPERFDATAFILE] = (char *)strdup(service_perfdata_file))) strip(mac->x[MACRO_SERVICEPERFDATAFILE]); } /* free memory */ my_free(temp_buffer); my_free(buffer); return OK; } /* cleans up performance data */ int xpddefault_cleanup_performance_data(void) { /* free memory */ my_free(host_perfdata_command); my_free(service_perfdata_command); my_free(host_perfdata_file_template); my_free(service_perfdata_file_template); my_free(host_perfdata_file); my_free(service_perfdata_file); my_free(host_perfdata_file_processing_command); my_free(service_perfdata_file_processing_command); /* close the files */ xpddefault_close_host_perfdata_file(); xpddefault_close_service_perfdata_file(); return OK; } /******************************************************************/ /****************** PERFORMANCE DATA FUNCTIONS ********************/ /******************************************************************/ /* updates service performance data */ int xpddefault_update_service_performance_data(service *svc) { nagios_macros mac; host *hst; /* * bail early if we've got nothing to do so we don't spend a lot * of time calculating macros that never get used * on distributed setups, empty perfdata results are required, so * only drop out if demanded via configs. */ if(service_perfdata_process_empty_results==FALSE){ if(!svc || !svc->perf_data || !*svc->perf_data) { return OK; } if((!service_perfdata_fp || !service_perfdata_file_template) && !service_perfdata_command) { return OK; } } /* * we know we've got some work to do, so grab the necessary * macros and get busy */ memset(&mac, 0, sizeof(mac)); hst = find_host(svc->host_name); grab_host_macros_r(&mac, hst); grab_service_macros_r(&mac, svc); grab_argv_macros_r(&mac, svc->check_command); /* run the performance data command */ xpddefault_run_service_performance_data_command(&mac, svc); /* update the performance data file */ xpddefault_update_service_performance_data_file(&mac, svc); /* get rid of used memory we won't need anymore */ clear_argv_macros_r(&mac); /* now free() it all */ clear_volatile_macros_r(&mac); return OK; } /* updates host performance data */ int xpddefault_update_host_performance_data(host *hst) { nagios_macros mac; /* * bail early if we've got nothing to do so we don't spend a lot * of time calculating macros that never get used * on distributed setups, empty perfdata results are required, so * only drop out if demanded via configs. */ if(host_perfdata_process_empty_results==FALSE){ if(!hst || !hst->perf_data || !*hst->perf_data) { return OK; } if((!host_perfdata_fp || !host_perfdata_file_template) && !host_perfdata_command) { return OK; } } /* set up macros and get to work */ memset(&mac, 0, sizeof(mac)); grab_host_macros_r(&mac, hst); grab_argv_macros_r(&mac, hst->check_command); /* run the performance data command */ xpddefault_run_host_performance_data_command(&mac, hst); /* no more commands to run, so we won't need this any more */ clear_argv_macros_r(&mac); /* update the performance data file */ xpddefault_update_host_performance_data_file(&mac, hst); /* free() all */ clear_volatile_macros_r(&mac); return OK; } /******************************************************************/ /************** PERFORMANCE DATA COMMAND FUNCTIONS ****************/ /******************************************************************/ /* runs the service performance data command */ int xpddefault_run_service_performance_data_command(nagios_macros *mac, service *svc) { char *raw_command_line = NULL; char *processed_command_line = NULL; int result = OK; int macro_options = STRIP_ILLEGAL_MACRO_CHARS | ESCAPE_MACRO_CHARS; log_debug_info(DEBUGL_FUNCTIONS, 0, "run_service_performance_data_command()\n"); if(svc == NULL) return ERROR; /* we don't have a command */ if(service_perfdata_command == NULL) return OK; /* get the raw command line */ get_raw_command_line_r(mac, service_perfdata_command_ptr, service_perfdata_command, &raw_command_line, macro_options); if(raw_command_line == NULL) return ERROR; log_debug_info(DEBUGL_PERFDATA, 2, "Raw service performance data command line: %s\n", raw_command_line); /* process any macros in the raw command line */ process_macros_r(mac, raw_command_line, &processed_command_line, macro_options); my_free(raw_command_line); if(processed_command_line == NULL) return ERROR; log_debug_info(DEBUGL_PERFDATA, 2, "Processed service performance data command line: %s\n", processed_command_line); /* run the command */ wproc_run(WPJOB_SVC_PERFDATA, processed_command_line, perfdata_timeout, NULL); /* free memory */ my_free(processed_command_line); return result; } /* runs the host performance data command */ int xpddefault_run_host_performance_data_command(nagios_macros *mac, host *hst) { char *raw_command_line = NULL; char *processed_command_line = NULL; int result = OK; int macro_options = STRIP_ILLEGAL_MACRO_CHARS | ESCAPE_MACRO_CHARS; log_debug_info(DEBUGL_FUNCTIONS, 0, "run_host_performance_data_command()\n"); if(hst == NULL) return ERROR; /* we don't have a command */ if(host_perfdata_command == NULL) return OK; /* get the raw command line */ get_raw_command_line_r(mac, host_perfdata_command_ptr, host_perfdata_command, &raw_command_line, macro_options); if(raw_command_line == NULL) return ERROR; log_debug_info(DEBUGL_PERFDATA, 2, "Raw host performance data command line: %s\n", raw_command_line); /* process any macros in the raw command line */ process_macros_r(mac, raw_command_line, &processed_command_line, macro_options); my_free(raw_command_line); if (!processed_command_line) return ERROR; log_debug_info(DEBUGL_PERFDATA, 2, "Processed host performance data command line: %s\n", processed_command_line); /* run the command */ wproc_run(WPJOB_HOST_PERFDATA, processed_command_line, perfdata_timeout, NULL); /* free memory */ my_free(processed_command_line); return result; } /******************************************************************/ /**************** FILE PERFORMANCE DATA FUNCTIONS *****************/ /******************************************************************/ /* open the host performance data file for writing */ int xpddefault_open_host_perfdata_file(void) { if(host_perfdata_file != NULL) { if(host_perfdata_file_pipe == TRUE) { /* must open read-write to avoid failure if the other end isn't ready yet */ host_perfdata_fd = open(host_perfdata_file, O_NONBLOCK | O_RDWR | O_CREAT, 0644); host_perfdata_fp = fdopen(host_perfdata_fd, "w"); } else host_perfdata_fp = fopen(host_perfdata_file, (host_perfdata_file_append == TRUE) ? "a" : "w"); if(host_perfdata_fp == NULL) { logit(NSLOG_RUNTIME_WARNING, TRUE, "Warning: File '%s' could not be opened - host performance data will not be written to file!\n", host_perfdata_file); return ERROR; } } return OK; } /* open the service performance data file for writing */ int xpddefault_open_service_perfdata_file(void) { if(service_perfdata_file != NULL) { if(service_perfdata_file_pipe == TRUE) { /* must open read-write to avoid failure if the other end isn't ready yet */ service_perfdata_fd = open(service_perfdata_file, O_NONBLOCK | O_RDWR); service_perfdata_fp = fdopen(service_perfdata_fd, "w"); } else service_perfdata_fp = fopen(service_perfdata_file, (service_perfdata_file_append == TRUE) ? "a" : "w"); if(service_perfdata_fp == NULL) { logit(NSLOG_RUNTIME_WARNING, TRUE, "Warning: File '%s' could not be opened - service performance data will not be written to file!\n", service_perfdata_file); return ERROR; } } return OK; } /* close the host performance data file */ int xpddefault_close_host_perfdata_file(void) { if(host_perfdata_fp != NULL) fclose(host_perfdata_fp); if(host_perfdata_fd >= 0) { close(host_perfdata_fd); host_perfdata_fd = -1; } return OK; } /* close the service performance data file */ int xpddefault_close_service_perfdata_file(void) { if(service_perfdata_fp != NULL) fclose(service_perfdata_fp); if(service_perfdata_fd >= 0) { close(service_perfdata_fd); service_perfdata_fd = -1; } return OK; } /* processes delimiter characters in templates */ int xpddefault_preprocess_file_templates(char *template) { char *tempbuf; unsigned int x, y; if(template == NULL) return OK; /* allocate temporary buffer */ tempbuf = (char *)malloc(strlen(template) + 1); if(tempbuf == NULL) return ERROR; strcpy(tempbuf, ""); for(x = 0, y = 0; x < strlen(template); x++, y++) { if(template[x] == '\\') { if(template[x + 1] == 't') { tempbuf[y] = '\t'; x++; } else if(template[x + 1] == 'r') { tempbuf[y] = '\r'; x++; } else if(template[x + 1] == 'n') { tempbuf[y] = '\n'; x++; } else tempbuf[y] = template[x]; } else tempbuf[y] = template[x]; } tempbuf[y] = '\x0'; strcpy(template, tempbuf); my_free(tempbuf); return OK; } /* updates service performance data file */ int xpddefault_update_service_performance_data_file(nagios_macros *mac, service *svc) { char *raw_output = NULL; char *processed_output = NULL; int result = OK; log_debug_info(DEBUGL_FUNCTIONS, 0, "update_service_performance_data_file()\n"); if(svc == NULL) return ERROR; /* we don't have a file to write to*/ if(service_perfdata_fp == NULL || service_perfdata_file_template == NULL) return OK; /* get the raw line to write */ raw_output = (char *)strdup(service_perfdata_file_template); log_debug_info(DEBUGL_PERFDATA, 2, "Raw service performance data file output: %s\n", raw_output); /* process any macros in the raw output line */ process_macros_r(mac, raw_output, &processed_output, 0); if(processed_output == NULL) return ERROR; log_debug_info(DEBUGL_PERFDATA, 2, "Processed service performance data file output: %s\n", processed_output); /* write to host performance data file */ fputs(processed_output, service_perfdata_fp); fputc('\n', service_perfdata_fp); fflush(service_perfdata_fp); /* free memory */ my_free(raw_output); my_free(processed_output); return result; } /* updates host performance data file */ int xpddefault_update_host_performance_data_file(nagios_macros *mac, host *hst) { char *raw_output = NULL; char *processed_output = NULL; int result = OK; log_debug_info(DEBUGL_FUNCTIONS, 0, "update_host_performance_data_file()\n"); if(hst == NULL) return ERROR; /* we don't have a host perfdata file */ if(host_perfdata_fp == NULL || host_perfdata_file_template == NULL) return OK; /* get the raw output */ raw_output = (char *)strdup(host_perfdata_file_template); log_debug_info(DEBUGL_PERFDATA, 2, "Raw host performance file output: %s\n", raw_output); /* process any macros in the raw output */ process_macros_r(mac, raw_output, &processed_output, 0); if(processed_output == NULL) return ERROR; log_debug_info(DEBUGL_PERFDATA, 2, "Processed host performance data file output: %s\n", processed_output); /* write to host performance data file */ fputs(processed_output, host_perfdata_fp); fputc('\n', host_perfdata_fp); fflush(host_perfdata_fp); /* free memory */ my_free(raw_output); my_free(processed_output); return result; } /* periodically process the host perf data file */ int xpddefault_process_host_perfdata_file(void) { char *raw_command_line = NULL; char *processed_command_line = NULL; int early_timeout = FALSE; double exectime = 0.0; int result = OK; int macro_options = STRIP_ILLEGAL_MACRO_CHARS | ESCAPE_MACRO_CHARS; nagios_macros mac; log_debug_info(DEBUGL_FUNCTIONS, 0, "process_host_perfdata_file()\n"); /* we don't have a command */ if(host_perfdata_file_processing_command == NULL) return OK; /* init macros */ memset(&mac, 0, sizeof(mac)); /* get the raw command line */ get_raw_command_line_r(&mac, host_perfdata_file_processing_command_ptr, host_perfdata_file_processing_command, &raw_command_line, macro_options); if(raw_command_line == NULL) { clear_volatile_macros_r(&mac); return ERROR; } log_debug_info(DEBUGL_PERFDATA, 2, "Raw host performance data file processing command line: %s\n", raw_command_line); /* process any macros in the raw command line */ process_macros_r(&mac, raw_command_line, &processed_command_line, macro_options); my_free(raw_command_line); if(processed_command_line == NULL) { clear_volatile_macros_r(&mac); return ERROR; } log_debug_info(DEBUGL_PERFDATA, 2, "Processed host performance data file processing command line: %s\n", processed_command_line); /* close the performance data file */ xpddefault_close_host_perfdata_file(); /* run the command */ my_system_r(&mac, processed_command_line, perfdata_timeout, &early_timeout, &exectime, NULL, 0); clear_volatile_macros_r(&mac); /* re-open the performance data file */ xpddefault_open_host_perfdata_file(); /* check to see if the command timed out */ if(early_timeout == TRUE) logit(NSLOG_RUNTIME_WARNING, TRUE, "Warning: Host performance data file processing command '%s' timed out after %d seconds\n", processed_command_line, perfdata_timeout); /* free memory */ my_free(processed_command_line); return result; } /* periodically process the service perf data file */ int xpddefault_process_service_perfdata_file(void) { char *raw_command_line = NULL; char *processed_command_line = NULL; int early_timeout = FALSE; double exectime = 0.0; int result = OK; int macro_options = STRIP_ILLEGAL_MACRO_CHARS | ESCAPE_MACRO_CHARS; nagios_macros mac; log_debug_info(DEBUGL_FUNCTIONS, 0, "process_service_perfdata_file()\n"); /* we don't have a command */ if(service_perfdata_file_processing_command == NULL) return OK; /* init macros */ memset(&mac, 0, sizeof(mac)); /* get the raw command line */ get_raw_command_line_r(&mac, service_perfdata_file_processing_command_ptr, service_perfdata_file_processing_command, &raw_command_line, macro_options); if(raw_command_line == NULL) { clear_volatile_macros_r(&mac); return ERROR; } log_debug_info(DEBUGL_PERFDATA, 2, "Raw service performance data file processing command line: %s\n", raw_command_line); /* process any macros in the raw command line */ process_macros_r(&mac, raw_command_line, &processed_command_line, macro_options); my_free(raw_command_line); if(processed_command_line == NULL) { clear_volatile_macros_r(&mac); return ERROR; } log_debug_info(DEBUGL_PERFDATA, 2, "Processed service performance data file processing command line: %s\n", processed_command_line); /* close the performance data file */ xpddefault_close_service_perfdata_file(); /* run the command */ my_system_r(&mac, processed_command_line, perfdata_timeout, &early_timeout, &exectime, NULL, 0); /* re-open the performance data file */ xpddefault_open_service_perfdata_file(); clear_volatile_macros_r(&mac); /* check to see if the command timed out */ if(early_timeout == TRUE) logit(NSLOG_RUNTIME_WARNING, TRUE, "Warning: Service performance data file processing command '%s' timed out after %d seconds\n", processed_command_line, perfdata_timeout); /* free memory */ my_free(processed_command_line); return result; } nagios-4.3.4/xdata/xpddefault.h000066400000000000000000000035471314764422400164340ustar00rootroot00000000000000/***************************************************************************** * * XPDDEFAULT.H - Include file for default performance data routines * * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #ifndef NAGIOS_XPDDEFAULT_H_INCLUDED #define NAGIOS_XPDDEFAULT_H_INCLUDED #include "../include/objects.h" int xpddefault_initialize_performance_data(const char *); int xpddefault_cleanup_performance_data(void); int xpddefault_update_service_performance_data(service *); int xpddefault_update_host_performance_data(host *); int xpddefault_run_service_performance_data_command(nagios_macros *mac, service *); int xpddefault_run_host_performance_data_command(nagios_macros *mac, host *); int xpddefault_update_service_performance_data_file(nagios_macros *mac, service *); int xpddefault_update_host_performance_data_file(nagios_macros *mac, host *); int xpddefault_preprocess_file_templates(char *); int xpddefault_open_host_perfdata_file(void); int xpddefault_open_service_perfdata_file(void); int xpddefault_close_host_perfdata_file(void); int xpddefault_close_service_perfdata_file(void); int xpddefault_process_host_perfdata_file(void); int xpddefault_process_service_perfdata_file(void); #endif nagios-4.3.4/xdata/xrddefault.c000066400000000000000000002162351314764422400164310ustar00rootroot00000000000000/***************************************************************************** * * XRDDEFAULT.C - Default external state retention routines for Nagios * * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ /*********** COMMON HEADER FILES ***********/ #include "../include/config.h" #include "../include/common.h" #include "../include/objects.h" #include "../include/statusdata.h" #include "../include/macros.h" #include "../include/nagios.h" #include "../include/sretention.h" #include "../include/comments.h" #include "../include/downtime.h" #include "xrddefault.h" /******************************************************************/ /********************* INIT/CLEANUP FUNCTIONS *********************/ /******************************************************************/ /* initialize retention data */ int xrddefault_initialize_retention_data(const char *cfgfile) { nagios_macros *mac; /* initialize locations if necessary */ if(retention_file == NULL) retention_file = (char *)strdup(DEFAULT_RETENTION_FILE); /* make sure we have everything */ if(retention_file == NULL) return ERROR; mac = get_global_macros(); /* save the retention file macro */ my_free(mac->x[MACRO_RETENTIONDATAFILE]); mac->x[MACRO_RETENTIONDATAFILE] = retention_file; if((mac->x[MACRO_RETENTIONDATAFILE] = (char *)strdup(retention_file))) strip(mac->x[MACRO_RETENTIONDATAFILE]); return OK; } /* cleanup retention data before terminating */ int xrddefault_cleanup_retention_data(void) { /* free memory */ my_free(retention_file); return OK; } /******************************************************************/ /**************** DEFAULT STATE OUTPUT FUNCTION *******************/ /******************************************************************/ int xrddefault_save_state_information(void) { char *tmp_file = NULL; customvariablesmember *temp_customvariablesmember = NULL; time_t current_time = 0L; int result = OK; FILE *fp = NULL; host *temp_host = NULL; service *temp_service = NULL; contact *temp_contact = NULL; nagios_comment *temp_comment = NULL; scheduled_downtime *temp_downtime = NULL; int x = 0; int fd = 0; unsigned long host_attribute_mask = 0L; unsigned long service_attribute_mask = 0L; unsigned long contact_attribute_mask = 0L; unsigned long contact_host_attribute_mask = 0L; unsigned long contact_service_attribute_mask = 0L; unsigned long process_host_attribute_mask = 0L; unsigned long process_service_attribute_mask = 0L; log_debug_info(DEBUGL_FUNCTIONS, 0, "xrddefault_save_state_information()\n"); /* make sure we have everything */ if(retention_file == NULL || temp_file == NULL) { logit(NSLOG_RUNTIME_ERROR, TRUE, "Error: We don't have the required file names to store retention data!\n"); return ERROR; } /* open a safe temp file for output */ asprintf(&tmp_file, "%sXXXXXX", temp_file); if(tmp_file == NULL) return ERROR; if((fd = mkstemp(tmp_file)) == -1) return ERROR; log_debug_info(DEBUGL_RETENTIONDATA, 2, "Writing retention data to temp file '%s'\n", tmp_file); fp = (FILE *)fdopen(fd, "w"); if(fp == NULL) { close(fd); unlink(tmp_file); logit(NSLOG_RUNTIME_ERROR, TRUE, "Error: Could not open temp state retention file '%s' for writing!\n", tmp_file); my_free(tmp_file); return ERROR; } /* what attributes should be masked out? */ /* NOTE: host/service/contact-specific values may be added in the future, but for now we only have global masks */ process_host_attribute_mask = retained_process_host_attribute_mask; process_service_attribute_mask = retained_process_service_attribute_mask; host_attribute_mask = retained_host_attribute_mask; service_attribute_mask = retained_service_attribute_mask; contact_host_attribute_mask = retained_contact_host_attribute_mask; contact_service_attribute_mask = retained_contact_service_attribute_mask; /* write version info to status file */ fprintf(fp, "########################################\n"); fprintf(fp, "# NAGIOS STATE RETENTION FILE\n"); fprintf(fp, "#\n"); fprintf(fp, "# THIS FILE IS AUTOMATICALLY GENERATED\n"); fprintf(fp, "# BY NAGIOS. DO NOT MODIFY THIS FILE!\n"); fprintf(fp, "########################################\n"); time(¤t_time); /* write file info */ fprintf(fp, "info {\n"); fprintf(fp, "created=%llu\n", (unsigned long long)current_time); fprintf(fp, "version=%s\n", PROGRAM_VERSION); fprintf(fp, "last_update_check=%llu\n", (unsigned long long)last_update_check); fprintf(fp, "update_available=%d\n", update_available); fprintf(fp, "update_uid=%lu\n", update_uid); fprintf(fp, "last_version=%s\n", (last_program_version == NULL) ? "" : last_program_version); fprintf(fp, "new_version=%s\n", (new_program_version == NULL) ? "" : new_program_version); fprintf(fp, "}\n"); /* save program state information */ fprintf(fp, "program {\n"); fprintf(fp, "modified_host_attributes=%lu\n", (modified_host_process_attributes & ~process_host_attribute_mask)); fprintf(fp, "modified_service_attributes=%lu\n", (modified_service_process_attributes & ~process_service_attribute_mask)); fprintf(fp, "enable_notifications=%d\n", enable_notifications); fprintf(fp, "active_service_checks_enabled=%d\n", execute_service_checks); fprintf(fp, "passive_service_checks_enabled=%d\n", accept_passive_service_checks); fprintf(fp, "active_host_checks_enabled=%d\n", execute_host_checks); fprintf(fp, "passive_host_checks_enabled=%d\n", accept_passive_host_checks); fprintf(fp, "enable_event_handlers=%d\n", enable_event_handlers); fprintf(fp, "obsess_over_services=%d\n", obsess_over_services); fprintf(fp, "obsess_over_hosts=%d\n", obsess_over_hosts); fprintf(fp, "check_service_freshness=%d\n", check_service_freshness); fprintf(fp, "check_host_freshness=%d\n", check_host_freshness); fprintf(fp, "enable_flap_detection=%d\n", enable_flap_detection); fprintf(fp, "process_performance_data=%d\n", process_performance_data); fprintf(fp, "global_host_event_handler=%s\n", (global_host_event_handler == NULL) ? "" : global_host_event_handler); fprintf(fp, "global_service_event_handler=%s\n", (global_service_event_handler == NULL) ? "" : global_service_event_handler); fprintf(fp, "next_comment_id=%lu\n", next_comment_id); fprintf(fp, "next_downtime_id=%lu\n", next_downtime_id); fprintf(fp, "next_event_id=%lu\n", next_event_id); fprintf(fp, "next_problem_id=%lu\n", next_problem_id); fprintf(fp, "next_notification_id=%lu\n", next_notification_id); fprintf(fp, "}\n"); /* save host state information */ for(temp_host = host_list; temp_host != NULL; temp_host = temp_host->next) { fprintf(fp, "host {\n"); fprintf(fp, "host_name=%s\n", temp_host->name); fprintf(fp, "modified_attributes=%lu\n", (temp_host->modified_attributes & ~host_attribute_mask)); fprintf(fp, "check_command=%s\n", (temp_host->check_command == NULL) ? "" : temp_host->check_command); fprintf(fp, "check_period=%s\n", (temp_host->check_period == NULL) ? "" : temp_host->check_period); fprintf(fp, "notification_period=%s\n", (temp_host->notification_period == NULL) ? "" : temp_host->notification_period); fprintf(fp, "event_handler=%s\n", (temp_host->event_handler == NULL) ? "" : temp_host->event_handler); fprintf(fp, "has_been_checked=%d\n", temp_host->has_been_checked); fprintf(fp, "check_execution_time=%.3f\n", temp_host->execution_time); fprintf(fp, "check_latency=%.3f\n", temp_host->latency); fprintf(fp, "check_type=%d\n", temp_host->check_type); fprintf(fp, "current_state=%d\n", temp_host->current_state); fprintf(fp, "last_state=%d\n", temp_host->last_state); fprintf(fp, "last_hard_state=%d\n", temp_host->last_hard_state); fprintf(fp, "last_event_id=%lu\n", temp_host->last_event_id); fprintf(fp, "current_event_id=%lu\n", temp_host->current_event_id); fprintf(fp, "current_problem_id=%lu\n", temp_host->current_problem_id); fprintf(fp, "last_problem_id=%lu\n", temp_host->last_problem_id); fprintf(fp, "plugin_output=%s\n", (temp_host->plugin_output == NULL) ? "" : temp_host->plugin_output); fprintf(fp, "long_plugin_output=%s\n", (temp_host->long_plugin_output == NULL) ? "" : temp_host->long_plugin_output); fprintf(fp, "performance_data=%s\n", (temp_host->perf_data == NULL) ? "" : temp_host->perf_data); fprintf(fp, "last_check=%llu\n", (unsigned long long)temp_host->last_check); fprintf(fp, "next_check=%llu\n", (unsigned long long)temp_host->next_check); fprintf(fp, "check_options=%d\n", temp_host->check_options); fprintf(fp, "current_attempt=%d\n", temp_host->current_attempt); fprintf(fp, "max_attempts=%d\n", temp_host->max_attempts); fprintf(fp, "check_interval=%f\n", temp_host->check_interval); fprintf(fp, "retry_interval=%f\n", temp_host->retry_interval); fprintf(fp, "state_type=%d\n", temp_host->state_type); fprintf(fp, "last_state_change=%llu\n", (unsigned long long)temp_host->last_state_change); fprintf(fp, "last_hard_state_change=%llu\n", (unsigned long long)temp_host->last_hard_state_change); fprintf(fp, "last_time_up=%llu\n", (unsigned long long)temp_host->last_time_up); fprintf(fp, "last_time_down=%llu\n", (unsigned long long)temp_host->last_time_down); fprintf(fp, "last_time_unreachable=%llu\n", (unsigned long long)temp_host->last_time_unreachable); fprintf(fp, "notified_on_down=%d\n", flag_isset(temp_host->notified_on, OPT_DOWN)); fprintf(fp, "notified_on_unreachable=%d\n", flag_isset(temp_host->notified_on, OPT_UNREACHABLE)); fprintf(fp, "last_notification=%llu\n", (unsigned long long)temp_host->last_notification); fprintf(fp, "current_notification_number=%d\n", temp_host->current_notification_number); fprintf(fp, "current_notification_id=%lu\n", temp_host->current_notification_id); fprintf(fp, "notifications_enabled=%d\n", temp_host->notifications_enabled); fprintf(fp, "problem_has_been_acknowledged=%d\n", temp_host->problem_has_been_acknowledged); fprintf(fp, "acknowledgement_type=%d\n", temp_host->acknowledgement_type); fprintf(fp, "active_checks_enabled=%d\n", temp_host->checks_enabled); fprintf(fp, "passive_checks_enabled=%d\n", temp_host->accept_passive_checks); fprintf(fp, "event_handler_enabled=%d\n", temp_host->event_handler_enabled); fprintf(fp, "flap_detection_enabled=%d\n", temp_host->flap_detection_enabled); fprintf(fp, "process_performance_data=%d\n", temp_host->process_performance_data); fprintf(fp, "obsess=%d\n", temp_host->obsess); fprintf(fp, "is_flapping=%d\n", temp_host->is_flapping); fprintf(fp, "percent_state_change=%.2f\n", temp_host->percent_state_change); fprintf(fp, "check_flapping_recovery_notification=%d\n", temp_host->check_flapping_recovery_notification); fprintf(fp, "state_history="); for(x = 0; x < MAX_STATE_HISTORY_ENTRIES; x++) fprintf(fp, "%s%d", (x > 0) ? "," : "", temp_host->state_history[(x + temp_host->state_history_index) % MAX_STATE_HISTORY_ENTRIES]); fprintf(fp, "\n"); /* custom variables */ for(temp_customvariablesmember = temp_host->custom_variables; temp_customvariablesmember != NULL; temp_customvariablesmember = temp_customvariablesmember->next) { if(temp_customvariablesmember->variable_name) fprintf(fp, "_%s=%d;%s\n", temp_customvariablesmember->variable_name, temp_customvariablesmember->has_been_modified, (temp_customvariablesmember->variable_value == NULL) ? "" : temp_customvariablesmember->variable_value); } fprintf(fp, "}\n"); } /* save service state information */ for(temp_service = service_list; temp_service != NULL; temp_service = temp_service->next) { fprintf(fp, "service {\n"); fprintf(fp, "host_name=%s\n", temp_service->host_name); fprintf(fp, "service_description=%s\n", temp_service->description); fprintf(fp, "modified_attributes=%lu\n", (temp_service->modified_attributes & ~service_attribute_mask)); fprintf(fp, "check_command=%s\n", (temp_service->check_command == NULL) ? "" : temp_service->check_command); fprintf(fp, "check_period=%s\n", (temp_service->check_period == NULL) ? "" : temp_service->check_period); fprintf(fp, "notification_period=%s\n", (temp_service->notification_period == NULL) ? "" : temp_service->notification_period); fprintf(fp, "event_handler=%s\n", (temp_service->event_handler == NULL) ? "" : temp_service->event_handler); fprintf(fp, "has_been_checked=%d\n", temp_service->has_been_checked); fprintf(fp, "check_execution_time=%.3f\n", temp_service->execution_time); fprintf(fp, "check_latency=%.3f\n", temp_service->latency); fprintf(fp, "check_type=%d\n", temp_service->check_type); fprintf(fp, "current_state=%d\n", temp_service->current_state); fprintf(fp, "last_state=%d\n", temp_service->last_state); fprintf(fp, "last_hard_state=%d\n", temp_service->last_hard_state); fprintf(fp, "last_event_id=%lu\n", temp_service->last_event_id); fprintf(fp, "current_event_id=%lu\n", temp_service->current_event_id); fprintf(fp, "current_problem_id=%lu\n", temp_service->current_problem_id); fprintf(fp, "last_problem_id=%lu\n", temp_service->last_problem_id); fprintf(fp, "current_attempt=%d\n", temp_service->current_attempt); fprintf(fp, "max_attempts=%d\n", temp_service->max_attempts); fprintf(fp, "check_interval=%f\n", temp_service->check_interval); fprintf(fp, "retry_interval=%f\n", temp_service->retry_interval); fprintf(fp, "state_type=%d\n", temp_service->state_type); fprintf(fp, "last_state_change=%llu\n", (unsigned long long)temp_service->last_state_change); fprintf(fp, "last_hard_state_change=%llu\n", (unsigned long long)temp_service->last_hard_state_change); fprintf(fp, "last_time_ok=%llu\n", (unsigned long long)temp_service->last_time_ok); fprintf(fp, "last_time_warning=%llu\n", (unsigned long long)temp_service->last_time_warning); fprintf(fp, "last_time_unknown=%llu\n", (unsigned long long)temp_service->last_time_unknown); fprintf(fp, "last_time_critical=%llu\n", (unsigned long long)temp_service->last_time_critical); fprintf(fp, "plugin_output=%s\n", (temp_service->plugin_output == NULL) ? "" : temp_service->plugin_output); fprintf(fp, "long_plugin_output=%s\n", (temp_service->long_plugin_output == NULL) ? "" : temp_service->long_plugin_output); fprintf(fp, "performance_data=%s\n", (temp_service->perf_data == NULL) ? "" : temp_service->perf_data); fprintf(fp, "last_check=%llu\n", (unsigned long long)temp_service->last_check); fprintf(fp, "next_check=%llu\n", (unsigned long long)temp_service->next_check); fprintf(fp, "check_options=%d\n", temp_service->check_options); fprintf(fp, "notified_on_unknown=%d\n", flag_isset(temp_service->notified_on, OPT_UNKNOWN)); fprintf(fp, "notified_on_warning=%d\n", flag_isset(temp_service->notified_on, OPT_WARNING)); fprintf(fp, "notified_on_critical=%d\n", flag_isset(temp_service->notified_on, OPT_CRITICAL)); fprintf(fp, "current_notification_number=%d\n", temp_service->current_notification_number); fprintf(fp, "current_notification_id=%lu\n", temp_service->current_notification_id); fprintf(fp, "last_notification=%llu\n", (unsigned long long)temp_service->last_notification); fprintf(fp, "notifications_enabled=%d\n", temp_service->notifications_enabled); fprintf(fp, "active_checks_enabled=%d\n", temp_service->checks_enabled); fprintf(fp, "passive_checks_enabled=%d\n", temp_service->accept_passive_checks); fprintf(fp, "event_handler_enabled=%d\n", temp_service->event_handler_enabled); fprintf(fp, "problem_has_been_acknowledged=%d\n", temp_service->problem_has_been_acknowledged); fprintf(fp, "acknowledgement_type=%d\n", temp_service->acknowledgement_type); fprintf(fp, "flap_detection_enabled=%d\n", temp_service->flap_detection_enabled); fprintf(fp, "process_performance_data=%d\n", temp_service->process_performance_data); fprintf(fp, "obsess=%d\n", temp_service->obsess); fprintf(fp, "is_flapping=%d\n", temp_service->is_flapping); fprintf(fp, "percent_state_change=%.2f\n", temp_service->percent_state_change); fprintf(fp, "check_flapping_recovery_notification=%d\n", temp_service->check_flapping_recovery_notification); fprintf(fp, "state_history="); for(x = 0; x < MAX_STATE_HISTORY_ENTRIES; x++) fprintf(fp, "%s%d", (x > 0) ? "," : "", temp_service->state_history[(x + temp_service->state_history_index) % MAX_STATE_HISTORY_ENTRIES]); fprintf(fp, "\n"); /* custom variables */ for(temp_customvariablesmember = temp_service->custom_variables; temp_customvariablesmember != NULL; temp_customvariablesmember = temp_customvariablesmember->next) { if(temp_customvariablesmember->variable_name) fprintf(fp, "_%s=%d;%s\n", temp_customvariablesmember->variable_name, temp_customvariablesmember->has_been_modified, (temp_customvariablesmember->variable_value == NULL) ? "" : temp_customvariablesmember->variable_value); } fprintf(fp, "}\n"); } /* save contact state information */ for(temp_contact = contact_list; temp_contact != NULL; temp_contact = temp_contact->next) { fprintf(fp, "contact {\n"); fprintf(fp, "contact_name=%s\n", temp_contact->name); fprintf(fp, "modified_attributes=%lu\n", (temp_contact->modified_attributes & ~contact_attribute_mask)); fprintf(fp, "modified_host_attributes=%lu\n", (temp_contact->modified_host_attributes & ~contact_host_attribute_mask)); fprintf(fp, "modified_service_attributes=%lu\n", (temp_contact->modified_service_attributes & ~contact_service_attribute_mask)); fprintf(fp, "host_notification_period=%s\n", (temp_contact->host_notification_period == NULL) ? "" : temp_contact->host_notification_period); fprintf(fp, "service_notification_period=%s\n", (temp_contact->service_notification_period == NULL) ? "" : temp_contact->service_notification_period); fprintf(fp, "last_host_notification=%llu\n", (unsigned long long)temp_contact->last_host_notification); fprintf(fp, "last_service_notification=%llu\n", (unsigned long long)temp_contact->last_service_notification); fprintf(fp, "host_notifications_enabled=%d\n", temp_contact->host_notifications_enabled); fprintf(fp, "service_notifications_enabled=%d\n", temp_contact->service_notifications_enabled); /* custom variables */ for(temp_customvariablesmember = temp_contact->custom_variables; temp_customvariablesmember != NULL; temp_customvariablesmember = temp_customvariablesmember->next) { if(temp_customvariablesmember->variable_name) fprintf(fp, "_%s=%d;%s\n", temp_customvariablesmember->variable_name, temp_customvariablesmember->has_been_modified, (temp_customvariablesmember->variable_value == NULL) ? "" : temp_customvariablesmember->variable_value); } fprintf(fp, "}\n"); } /* save all comments */ for(temp_comment = comment_list; temp_comment != NULL; temp_comment = temp_comment->next) { if(temp_comment->comment_type == HOST_COMMENT) fprintf(fp, "hostcomment {\n"); else fprintf(fp, "servicecomment {\n"); fprintf(fp, "host_name=%s\n", temp_comment->host_name); if(temp_comment->comment_type == SERVICE_COMMENT) fprintf(fp, "service_description=%s\n", temp_comment->service_description); fprintf(fp, "entry_type=%d\n", temp_comment->entry_type); fprintf(fp, "comment_id=%lu\n", temp_comment->comment_id); fprintf(fp, "source=%d\n", temp_comment->source); fprintf(fp, "persistent=%d\n", temp_comment->persistent); fprintf(fp, "entry_time=%llu\n", (unsigned long long)temp_comment->entry_time); fprintf(fp, "expires=%d\n", temp_comment->expires); fprintf(fp, "expire_time=%llu\n", (unsigned long long)temp_comment->expire_time); fprintf(fp, "author=%s\n", temp_comment->author); fprintf(fp, "comment_data=%s\n", temp_comment->comment_data); fprintf(fp, "}\n"); } /* save all downtime */ for(temp_downtime = scheduled_downtime_list; temp_downtime != NULL; temp_downtime = temp_downtime->next) { if(temp_downtime->type == HOST_DOWNTIME) fprintf(fp, "hostdowntime {\n"); else fprintf(fp, "servicedowntime {\n"); fprintf(fp, "host_name=%s\n", temp_downtime->host_name); if(temp_downtime->type == SERVICE_DOWNTIME) fprintf(fp, "service_description=%s\n", temp_downtime->service_description); fprintf(fp, "comment_id=%lu\n", temp_downtime->comment_id); fprintf(fp, "downtime_id=%lu\n", temp_downtime->downtime_id); fprintf(fp, "entry_time=%llu\n", (unsigned long long)temp_downtime->entry_time); fprintf(fp, "start_time=%llu\n", (unsigned long long)temp_downtime->start_time); fprintf(fp, "flex_downtime_start=%llu\n", (unsigned long long)temp_downtime->flex_downtime_start); fprintf(fp, "end_time=%llu\n", (unsigned long long)temp_downtime->end_time); fprintf(fp, "triggered_by=%lu\n", temp_downtime->triggered_by); fprintf(fp, "fixed=%d\n", temp_downtime->fixed); fprintf(fp, "duration=%lu\n", temp_downtime->duration); fprintf(fp, "is_in_effect=%d\n", temp_downtime->is_in_effect); fprintf(fp, "start_notification_sent=%d\n", temp_downtime->start_notification_sent); fprintf(fp, "author=%s\n", temp_downtime->author); fprintf(fp, "comment=%s\n", temp_downtime->comment); fprintf(fp, "}\n"); } fflush(fp); fsync(fd); result = fclose(fp); /* save/close was successful */ if(result == 0) { result = OK; /* move the temp file to the retention file (overwrite the old retention file) */ if(my_rename(tmp_file, retention_file)) { unlink(tmp_file); logit(NSLOG_RUNTIME_ERROR, TRUE, "Error: Unable to update retention file '%s': %s", retention_file, strerror(errno)); result = ERROR; } } /* a problem occurred saving the file */ else { result = ERROR; /* remove temp file and log an error */ unlink(tmp_file); logit(NSLOG_RUNTIME_ERROR, TRUE, "Error: Unable to save retention file: %s", strerror(errno)); } /* free memory */ my_free(tmp_file); return result; } /******************************************************************/ /***************** DEFAULT STATE INPUT FUNCTION *******************/ /******************************************************************/ int xrddefault_read_state_information(void) { char *input = NULL; char *inputbuf = NULL; char *temp_ptr = NULL; mmapfile *thefile; char *host_name = NULL; char *service_description = NULL; char *contact_name = NULL; char *author = NULL; char *comment_data = NULL; int data_type = XRDDEFAULT_NO_DATA; int x = 0; host *temp_host = NULL; service *temp_service = NULL; contact *temp_contact = NULL; command *temp_command = NULL; timeperiod *temp_timeperiod = NULL; customvariablesmember *temp_customvariablesmember = NULL; char *customvarname = NULL; char *var = NULL; char *val = NULL; char *tempval = NULL; char *ch = NULL; unsigned long comment_id = 0; int persistent = FALSE; int expires = FALSE; time_t expire_time = 0L; int entry_type = USER_COMMENT; int source = COMMENTSOURCE_INTERNAL; time_t entry_time = 0L; time_t creation_time; time_t current_time; int scheduling_info_is_ok = FALSE; unsigned long downtime_id = 0; time_t start_time = 0L; time_t flex_downtime_start = ( time_t)0; time_t end_time = 0L; int fixed = FALSE; unsigned long triggered_by = 0; unsigned long duration = 0L; unsigned long host_attribute_mask = 0L; unsigned long service_attribute_mask = 0L; unsigned long contact_attribute_mask = 0L; unsigned long contact_host_attribute_mask = 0L; unsigned long contact_service_attribute_mask = 0L; unsigned long process_host_attribute_mask = 0L; unsigned long process_service_attribute_mask = 0L; int remove_comment = FALSE; int ack = FALSE; int was_flapping = FALSE; int allow_flapstart_notification = TRUE; struct timeval tv[2]; double runtime[2]; int found_directive = FALSE; int is_in_effect = FALSE; int start_notification_sent = FALSE; log_debug_info(DEBUGL_FUNCTIONS, 0, "xrddefault_read_state_information() start\n"); /* make sure we have what we need */ if(retention_file == NULL) { logit(NSLOG_RUNTIME_ERROR, TRUE, "Error: We don't have a filename for retention data!\n"); return ERROR; } if(test_scheduling == TRUE) gettimeofday(&tv[0], NULL); /* open the retention file for reading */ if((thefile = mmap_fopen(retention_file)) == NULL) return ERROR; /* what attributes should be masked out? */ /* NOTE: host/service/contact-specific values may be added in the future, but for now we only have global masks */ process_host_attribute_mask = retained_process_host_attribute_mask; process_service_attribute_mask = retained_process_host_attribute_mask; host_attribute_mask = retained_host_attribute_mask; service_attribute_mask = retained_host_attribute_mask; contact_host_attribute_mask = retained_contact_host_attribute_mask; contact_service_attribute_mask = retained_contact_service_attribute_mask; /* Big speedup when reading retention.dat in bulk */ defer_downtime_sorting = 1; defer_comment_sorting = 1; /* read all lines in the retention file */ while(1) { /* free memory */ my_free(inputbuf); /* read the next line */ if((inputbuf = mmap_fgets(thefile)) == NULL) break; input = inputbuf; /* far better than strip()ing */ if(input[0] == '\t') input++; strip(input); if(!strcmp(input, "service {")) data_type = XRDDEFAULT_SERVICESTATUS_DATA; else if(!strcmp(input, "host {")) data_type = XRDDEFAULT_HOSTSTATUS_DATA; else if(!strcmp(input, "contact {")) data_type = XRDDEFAULT_CONTACTSTATUS_DATA; else if(!strcmp(input, "hostcomment {")) data_type = XRDDEFAULT_HOSTCOMMENT_DATA; else if(!strcmp(input, "servicecomment {")) data_type = XRDDEFAULT_SERVICECOMMENT_DATA; else if(!strcmp(input, "hostdowntime {")) data_type = XRDDEFAULT_HOSTDOWNTIME_DATA; else if(!strcmp(input, "servicedowntime {")) data_type = XRDDEFAULT_SERVICEDOWNTIME_DATA; else if(!strcmp(input, "info {")) data_type = XRDDEFAULT_INFO_DATA; else if(!strcmp(input, "program {")) data_type = XRDDEFAULT_PROGRAMSTATUS_DATA; else if(!strcmp(input, "}")) { switch(data_type) { case XRDDEFAULT_INFO_DATA: break; case XRDDEFAULT_PROGRAMSTATUS_DATA: /* adjust modified attributes if necessary */ if(use_retained_program_state == FALSE) { modified_host_process_attributes = MODATTR_NONE; modified_service_process_attributes = MODATTR_NONE; } break; case XRDDEFAULT_HOSTSTATUS_DATA: if(temp_host != NULL) { /* adjust modified attributes if necessary */ if(temp_host->retain_nonstatus_information == FALSE) temp_host->modified_attributes = MODATTR_NONE; /* adjust modified attributes if no custom variables have been changed */ if(temp_host->modified_attributes & MODATTR_CUSTOM_VARIABLE) { for(temp_customvariablesmember = temp_host->custom_variables; temp_customvariablesmember != NULL; temp_customvariablesmember = temp_customvariablesmember->next) { if(temp_customvariablesmember->has_been_modified == TRUE) break; } if(temp_customvariablesmember == NULL) temp_host->modified_attributes -= MODATTR_CUSTOM_VARIABLE; } /* calculate next possible notification time */ if(temp_host->current_state != HOST_UP && temp_host->last_notification != (time_t)0) temp_host->next_notification = get_next_host_notification_time(temp_host, temp_host->last_notification); /* ADDED 01/23/2009 adjust current check attempts if host in hard problem state (max attempts may have changed in config since restart) */ if(temp_host->current_state != HOST_UP && temp_host->state_type == HARD_STATE) temp_host->current_attempt = temp_host->max_attempts; /* ADDED 02/20/08 assume same flapping state if large install tweaks enabled */ if(use_large_installation_tweaks == TRUE) { temp_host->is_flapping = was_flapping; } /* else use normal startup flap detection logic */ else { /* host was flapping before program started */ /* 11/10/07 don't allow flapping notifications to go out */ if(was_flapping == TRUE) allow_flapstart_notification = FALSE; else /* flapstart notifications are okay */ allow_flapstart_notification = TRUE; /* check for flapping */ check_for_host_flapping(temp_host, FALSE, FALSE, allow_flapstart_notification); /* host was flapping before and isn't now, so clear recovery check variable if host isn't flapping now */ if(was_flapping == TRUE && temp_host->is_flapping == FALSE) temp_host->check_flapping_recovery_notification = FALSE; } /* handle new vars added in 2.x */ if(temp_host->last_hard_state_change == (time_t)0) temp_host->last_hard_state_change = temp_host->last_state_change; /* update host status */ update_host_status(temp_host, FALSE); } /* reset vars */ was_flapping = FALSE; allow_flapstart_notification = TRUE; my_free(host_name); host_name = NULL; temp_host = NULL; break; case XRDDEFAULT_SERVICESTATUS_DATA: if(temp_service != NULL) { /* adjust modified attributes if necessary */ if(temp_service->retain_nonstatus_information == FALSE) temp_service->modified_attributes = MODATTR_NONE; /* adjust modified attributes if no custom variables have been changed */ if(temp_service->modified_attributes & MODATTR_CUSTOM_VARIABLE) { for(temp_customvariablesmember = temp_service->custom_variables; temp_customvariablesmember != NULL; temp_customvariablesmember = temp_customvariablesmember->next) { if(temp_customvariablesmember->has_been_modified == TRUE) break; } if(temp_customvariablesmember == NULL) temp_service->modified_attributes -= MODATTR_CUSTOM_VARIABLE; } /* calculate next possible notification time */ if(temp_service->current_state != STATE_OK && temp_service->last_notification != (time_t)0) temp_service->next_notification = get_next_service_notification_time(temp_service, temp_service->last_notification); /* fix old vars */ if(temp_service->has_been_checked == FALSE && temp_service->state_type == SOFT_STATE) temp_service->state_type = HARD_STATE; /* ADDED 01/23/2009 adjust current check attempt if service is in hard problem state (max attempts may have changed in config since restart) */ if(temp_service->current_state != STATE_OK && temp_service->state_type == HARD_STATE) temp_service->current_attempt = temp_service->max_attempts; /* ADDED 02/20/08 assume same flapping state if large install tweaks enabled */ if(use_large_installation_tweaks == TRUE) { temp_service->is_flapping = was_flapping; } /* else use normal startup flap detection logic */ else { /* service was flapping before program started */ /* 11/10/07 don't allow flapping notifications to go out */ if(was_flapping == TRUE) allow_flapstart_notification = FALSE; else /* flapstart notifications are okay */ allow_flapstart_notification = TRUE; /* check for flapping */ check_for_service_flapping(temp_service, FALSE, allow_flapstart_notification); /* service was flapping before and isn't now, so clear recovery check variable if service isn't flapping now */ if(was_flapping == TRUE && temp_service->is_flapping == FALSE) temp_service->check_flapping_recovery_notification = FALSE; } /* handle new vars added in 2.x */ if(temp_service->last_hard_state_change == (time_t)0) temp_service->last_hard_state_change = temp_service->last_state_change; /* update service status */ update_service_status(temp_service, FALSE); } /* reset vars */ was_flapping = FALSE; allow_flapstart_notification = TRUE; my_free(host_name); my_free(service_description); temp_service = NULL; break; case XRDDEFAULT_CONTACTSTATUS_DATA: if(temp_contact != NULL) { /* adjust modified attributes if necessary */ if(temp_contact->retain_nonstatus_information == FALSE) temp_contact->modified_attributes = MODATTR_NONE; /* adjust modified attributes if no custom variables have been changed */ if(temp_contact->modified_attributes & MODATTR_CUSTOM_VARIABLE) { for(temp_customvariablesmember = temp_contact->custom_variables; temp_customvariablesmember != NULL; temp_customvariablesmember = temp_customvariablesmember->next) { if(temp_customvariablesmember->has_been_modified == TRUE) break; } if(temp_customvariablesmember == NULL) temp_contact->modified_attributes -= MODATTR_CUSTOM_VARIABLE; } /* update contact status */ update_contact_status(temp_contact, FALSE); } my_free(contact_name); temp_contact = NULL; break; case XRDDEFAULT_HOSTCOMMENT_DATA: case XRDDEFAULT_SERVICECOMMENT_DATA: /* add the comment */ add_comment((data_type == XRDDEFAULT_HOSTCOMMENT_DATA) ? HOST_COMMENT : SERVICE_COMMENT, entry_type, host_name, service_description, entry_time, author, comment_data, comment_id, persistent, expires, expire_time, source); /* delete the comment if necessary */ /* it seems a bit backwards to add and then immediately delete the comment, but its necessary to track comment deletions in the event broker */ remove_comment = FALSE; /* host no longer exists */ if((temp_host = find_host(host_name)) == NULL) remove_comment = TRUE; /* service no longer exists */ else if(data_type == XRDDEFAULT_SERVICECOMMENT_DATA && (temp_service = find_service(host_name, service_description)) == NULL) remove_comment = TRUE; /* acknowledgement comments get deleted if they're not persistent and the original problem is no longer acknowledged */ else if(entry_type == ACKNOWLEDGEMENT_COMMENT) { ack = FALSE; if(data_type == XRDDEFAULT_HOSTCOMMENT_DATA) ack = temp_host->problem_has_been_acknowledged; else ack = temp_service->problem_has_been_acknowledged; if(ack == FALSE && persistent == FALSE) remove_comment = TRUE; } /* non-persistent comments don't last past restarts UNLESS they're acks (see above) */ else if(persistent == FALSE && (sigrestart == FALSE || entry_type == DOWNTIME_COMMENT)) remove_comment = TRUE; if(remove_comment == TRUE) delete_comment((data_type == XRDDEFAULT_HOSTCOMMENT_DATA) ? HOST_COMMENT : SERVICE_COMMENT, comment_id); /* free temp memory */ my_free(host_name); my_free(service_description); my_free(author); my_free(comment_data); /* reset defaults */ entry_type = USER_COMMENT; comment_id = 0; source = COMMENTSOURCE_INTERNAL; persistent = FALSE; entry_time = 0L; expires = FALSE; expire_time = 0L; break; case XRDDEFAULT_HOSTDOWNTIME_DATA: case XRDDEFAULT_SERVICEDOWNTIME_DATA: /* add the downtime */ if(data_type == XRDDEFAULT_HOSTDOWNTIME_DATA) add_host_downtime(host_name, entry_time, author, comment_data, start_time, flex_downtime_start, end_time, fixed, triggered_by, duration, downtime_id, is_in_effect, start_notification_sent); else add_service_downtime(host_name, service_description, entry_time, author, comment_data, start_time, flex_downtime_start, end_time, fixed, triggered_by, duration, downtime_id, is_in_effect, start_notification_sent); /* must register the downtime with Nagios so it can schedule it, add comments, etc. */ register_downtime((data_type == XRDDEFAULT_HOSTDOWNTIME_DATA) ? HOST_DOWNTIME : SERVICE_DOWNTIME, downtime_id); /* free temp memory */ my_free(host_name); my_free(service_description); my_free(author); my_free(comment_data); /* reset defaults */ downtime_id = 0; entry_time = 0L; start_time = 0L; flex_downtime_start = ( time_t)0; end_time = 0L; fixed = FALSE; triggered_by = 0; duration = 0L; break; default: break; } data_type = XRDDEFAULT_NO_DATA; } else if(data_type != XRDDEFAULT_NO_DATA) { /* slightly faster than strtok () */ var = input; if((val = strchr(input, '=')) == NULL) continue; val[0] = '\x0'; val++; found_directive = TRUE; switch(data_type) { case XRDDEFAULT_INFO_DATA: if(!strcmp(var, "created")) { creation_time = strtoul(val, NULL, 10); time(¤t_time); if(current_time - creation_time < retention_scheduling_horizon) scheduling_info_is_ok = TRUE; else scheduling_info_is_ok = FALSE; last_program_stop = creation_time; } else if(!strcmp(var, "version")) { /* initialize last version in case we're reading a pre-3.1.0 retention file */ if(last_program_version == NULL) last_program_version = (char *)strdup(val); } else if(!strcmp(var, "last_update_check")) last_update_check = strtoul(val, NULL, 10); else if(!strcmp(var, "update_available")) update_available = atoi(val); else if(!strcmp(var, "update_uid")) update_uid = strtoul(val, NULL, 10); else if(!strcmp(var, "last_version")) { if(last_program_version) my_free(last_program_version); last_program_version = (char *)strdup(val); } else if(!strcmp(var, "new_version")) new_program_version = (char *)strdup(val); break; case XRDDEFAULT_PROGRAMSTATUS_DATA: if(!strcmp(var, "modified_host_attributes")) { modified_host_process_attributes = strtoul(val, NULL, 10); /* mask out attributes we don't want to retain */ modified_host_process_attributes &= ~process_host_attribute_mask; } else if(!strcmp(var, "modified_service_attributes")) { modified_service_process_attributes = strtoul(val, NULL, 10); /* mask out attributes we don't want to retain */ modified_service_process_attributes &= ~process_service_attribute_mask; } if(use_retained_program_state == TRUE) { if(!strcmp(var, "enable_notifications")) { if(modified_host_process_attributes & MODATTR_NOTIFICATIONS_ENABLED) enable_notifications = (atoi(val) > 0) ? TRUE : FALSE; } else if(!strcmp(var, "active_service_checks_enabled")) { if(modified_service_process_attributes & MODATTR_ACTIVE_CHECKS_ENABLED) execute_service_checks = (atoi(val) > 0) ? TRUE : FALSE; } else if(!strcmp(var, "passive_service_checks_enabled")) { if(modified_service_process_attributes & MODATTR_PASSIVE_CHECKS_ENABLED) accept_passive_service_checks = (atoi(val) > 0) ? TRUE : FALSE; } else if(!strcmp(var, "active_host_checks_enabled")) { if(modified_host_process_attributes & MODATTR_ACTIVE_CHECKS_ENABLED) execute_host_checks = (atoi(val) > 0) ? TRUE : FALSE; } else if(!strcmp(var, "passive_host_checks_enabled")) { if(modified_host_process_attributes & MODATTR_PASSIVE_CHECKS_ENABLED) accept_passive_host_checks = (atoi(val) > 0) ? TRUE : FALSE; } else if(!strcmp(var, "enable_event_handlers")) { if(modified_host_process_attributes & MODATTR_EVENT_HANDLER_ENABLED) enable_event_handlers = (atoi(val) > 0) ? TRUE : FALSE; } else if(!strcmp(var, "obsess_over_services")) { if(modified_service_process_attributes & MODATTR_OBSESSIVE_HANDLER_ENABLED) obsess_over_services = (atoi(val) > 0) ? TRUE : FALSE; } else if(!strcmp(var, "obsess_over_hosts")) { if(modified_host_process_attributes & MODATTR_OBSESSIVE_HANDLER_ENABLED) obsess_over_hosts = (atoi(val) > 0) ? TRUE : FALSE; } else if(!strcmp(var, "check_service_freshness")) { if(modified_service_process_attributes & MODATTR_FRESHNESS_CHECKS_ENABLED) check_service_freshness = (atoi(val) > 0) ? TRUE : FALSE; } else if(!strcmp(var, "check_host_freshness")) { if(modified_host_process_attributes & MODATTR_FRESHNESS_CHECKS_ENABLED) check_host_freshness = (atoi(val) > 0) ? TRUE : FALSE; } else if(!strcmp(var, "enable_flap_detection")) { if(modified_host_process_attributes & MODATTR_FLAP_DETECTION_ENABLED) enable_flap_detection = (atoi(val) > 0) ? TRUE : FALSE; } else if(!strcmp(var, "process_performance_data")) { if(modified_host_process_attributes & MODATTR_PERFORMANCE_DATA_ENABLED) process_performance_data = (atoi(val) > 0) ? TRUE : FALSE; } else if(!strcmp(var, "global_host_event_handler")) { if(modified_host_process_attributes & MODATTR_EVENT_HANDLER_COMMAND) { /* make sure the check command still exists... */ tempval = (char *)strdup(val); temp_ptr = my_strtok(tempval, "!"); temp_command = find_command(temp_ptr); temp_ptr = (char *)strdup(val); my_free(tempval); if(temp_command != NULL && temp_ptr != NULL) { my_free(global_host_event_handler); global_host_event_handler = temp_ptr; } } } else if(!strcmp(var, "global_service_event_handler")) { if(modified_service_process_attributes & MODATTR_EVENT_HANDLER_COMMAND) { /* make sure the check command still exists... */ tempval = (char *)strdup(val); temp_ptr = my_strtok(tempval, "!"); temp_command = find_command(temp_ptr); temp_ptr = (char *)strdup(val); my_free(tempval); if(temp_command != NULL && temp_ptr != NULL) { my_free(global_service_event_handler); global_service_event_handler = temp_ptr; } } } else if(!strcmp(var, "next_comment_id")) next_comment_id = strtoul(val, NULL, 10); else if(!strcmp(var, "next_downtime_id")) next_downtime_id = strtoul(val, NULL, 10); else if(!strcmp(var, "next_event_id")) next_event_id = strtoul(val, NULL, 10); else if(!strcmp(var, "next_problem_id")) next_problem_id = strtoul(val, NULL, 10); else if(!strcmp(var, "next_notification_id")) next_notification_id = strtoul(val, NULL, 10); } break; case XRDDEFAULT_HOSTSTATUS_DATA: if(temp_host == NULL) { if(!strcmp(var, "host_name")) { host_name = (char *)strdup(val); temp_host = find_host(host_name); } } else { if(!strcmp(var, "modified_attributes")) { temp_host->modified_attributes = strtoul(val, NULL, 10); /* mask out attributes we don't want to retain */ temp_host->modified_attributes &= ~host_attribute_mask; /* break out */ break; } if(temp_host->retain_status_information == TRUE) { if(!strcmp(var, "has_been_checked")) temp_host->has_been_checked = (atoi(val) > 0) ? TRUE : FALSE; else if(!strcmp(var, "check_execution_time")) temp_host->execution_time = strtod(val, NULL); else if(!strcmp(var, "check_latency")) temp_host->latency = strtod(val, NULL); else if(!strcmp(var, "check_type")) temp_host->check_type = atoi(val); else if(!strcmp(var, "current_state")) temp_host->current_state = atoi(val); else if(!strcmp(var, "last_state")) temp_host->last_state = atoi(val); else if(!strcmp(var, "last_hard_state")) temp_host->last_hard_state = atoi(val); else if(!strcmp(var, "plugin_output")) { my_free(temp_host->plugin_output); temp_host->plugin_output = (char *)strdup(val); } else if(!strcmp(var, "long_plugin_output")) { my_free(temp_host->long_plugin_output); temp_host->long_plugin_output = (char *)strdup(val); } else if(!strcmp(var, "performance_data")) { my_free(temp_host->perf_data); temp_host->perf_data = (char *)strdup(val); } else if(!strcmp(var, "last_check")) temp_host->last_check = strtoul(val, NULL, 10); else if(!strcmp(var, "next_check")) { if(use_retained_scheduling_info == TRUE && scheduling_info_is_ok == TRUE) temp_host->next_check = strtoul(val, NULL, 10); } else if(!strcmp(var, "check_options")) { if(use_retained_scheduling_info == TRUE && scheduling_info_is_ok == TRUE) temp_host->check_options = atoi(val); } else if(!strcmp(var, "current_attempt")) temp_host->current_attempt = atoi(val); else if(!strcmp(var, "current_event_id")) temp_host->current_event_id = strtoul(val, NULL, 10); else if(!strcmp(var, "last_event_id")) temp_host->last_event_id = strtoul(val, NULL, 10); else if(!strcmp(var, "current_problem_id")) temp_host->current_problem_id = strtoul(val, NULL, 10); else if(!strcmp(var, "last_problem_id")) temp_host->last_problem_id = strtoul(val, NULL, 10); else if(!strcmp(var, "state_type")) temp_host->state_type = atoi(val); else if(!strcmp(var, "last_state_change")) temp_host->last_state_change = strtoul(val, NULL, 10); else if(!strcmp(var, "last_hard_state_change")) temp_host->last_hard_state_change = strtoul(val, NULL, 10); else if(!strcmp(var, "last_time_up")) temp_host->last_time_up = strtoul(val, NULL, 10); else if(!strcmp(var, "last_time_down")) temp_host->last_time_down = strtoul(val, NULL, 10); else if(!strcmp(var, "last_time_unreachable")) temp_host->last_time_unreachable = strtoul(val, NULL, 10); else if(!strcmp(var, "notified_on_down")) temp_host->notified_on |= (atoi(val) > 0 ? OPT_DOWN : 0); else if(!strcmp(var, "notified_on_unreachable")) temp_host->notified_on |= (atoi(val) > 0 ? OPT_UNREACHABLE : 0); else if(!strcmp(var, "last_notification")) temp_host->last_notification = strtoul(val, NULL, 10); else if(!strcmp(var, "current_notification_number")) temp_host->current_notification_number = atoi(val); else if(!strcmp(var, "current_notification_id")) temp_host->current_notification_id = strtoul(val, NULL, 10); else if(!strcmp(var, "is_flapping")) was_flapping = atoi(val); else if(!strcmp(var, "percent_state_change")) temp_host->percent_state_change = strtod(val, NULL); else if(!strcmp(var, "check_flapping_recovery_notification")) temp_host->check_flapping_recovery_notification = atoi(val); else if(!strcmp(var, "state_history")) { temp_ptr = val; for(x = 0; x < MAX_STATE_HISTORY_ENTRIES; x++) { if((ch = my_strsep(&temp_ptr, ",")) != NULL) temp_host->state_history[x] = atoi(ch); else break; } temp_host->state_history_index = 0; } else found_directive = FALSE; } if(temp_host->retain_nonstatus_information == TRUE) { /* null-op speeds up logic */ if(found_directive == TRUE); else if(!strcmp(var, "problem_has_been_acknowledged")) temp_host->problem_has_been_acknowledged = (atoi(val) > 0) ? TRUE : FALSE; else if(!strcmp(var, "acknowledgement_type")) temp_host->acknowledgement_type = atoi(val); else if(!strcmp(var, "notifications_enabled")) { if(temp_host->modified_attributes & MODATTR_NOTIFICATIONS_ENABLED) temp_host->notifications_enabled = (atoi(val) > 0) ? TRUE : FALSE; } else if(!strcmp(var, "active_checks_enabled")) { if(temp_host->modified_attributes & MODATTR_ACTIVE_CHECKS_ENABLED) temp_host->checks_enabled = (atoi(val) > 0) ? TRUE : FALSE; } else if(!strcmp(var, "passive_checks_enabled")) { if(temp_host->modified_attributes & MODATTR_PASSIVE_CHECKS_ENABLED) temp_host->accept_passive_checks = (atoi(val) > 0) ? TRUE : FALSE; } else if(!strcmp(var, "event_handler_enabled")) { if(temp_host->modified_attributes & MODATTR_EVENT_HANDLER_ENABLED) temp_host->event_handler_enabled = (atoi(val) > 0) ? TRUE : FALSE; } else if(!strcmp(var, "flap_detection_enabled")) { if(temp_host->modified_attributes & MODATTR_FLAP_DETECTION_ENABLED) temp_host->flap_detection_enabled = (atoi(val) > 0) ? TRUE : FALSE; } else if(!strcmp(var, "process_performance_data")) { if(temp_host->modified_attributes & MODATTR_PERFORMANCE_DATA_ENABLED) temp_host->process_performance_data = (atoi(val) > 0) ? TRUE : FALSE; } else if(!strcmp(var, "obsess_over_host") || !strcmp(var, "obsess")) { if(temp_host->modified_attributes & MODATTR_OBSESSIVE_HANDLER_ENABLED) temp_host->obsess = (atoi(val) > 0) ? TRUE : FALSE; } else if(!strcmp(var, "check_command")) { if(temp_host->modified_attributes & MODATTR_CHECK_COMMAND) { /* make sure the check command still exists... */ tempval = (char *)strdup(val); temp_ptr = my_strtok(tempval, "!"); temp_command = find_command(temp_ptr); temp_ptr = (char *)strdup(val); my_free(tempval); if(temp_command != NULL && temp_ptr != NULL) { my_free(temp_host->check_command); temp_host->check_command = temp_ptr; } else temp_host->modified_attributes -= MODATTR_CHECK_COMMAND; } } else if(!strcmp(var, "check_period")) { if(temp_host->modified_attributes & MODATTR_CHECK_TIMEPERIOD) { /* make sure the timeperiod still exists... */ temp_timeperiod = find_timeperiod(val); temp_ptr = (char *)strdup(val); if(temp_timeperiod != NULL && temp_ptr != NULL) { my_free(temp_host->check_period); temp_host->check_period = temp_ptr; } else temp_host->modified_attributes -= MODATTR_CHECK_TIMEPERIOD; } } else if(!strcmp(var, "notification_period")) { if(temp_host->modified_attributes & MODATTR_NOTIFICATION_TIMEPERIOD) { /* make sure the timeperiod still exists... */ temp_timeperiod = find_timeperiod(val); temp_ptr = (char *)strdup(val); if(temp_timeperiod != NULL && temp_ptr != NULL) { my_free(temp_host->notification_period); temp_host->notification_period = temp_ptr; } else temp_host->modified_attributes -= MODATTR_NOTIFICATION_TIMEPERIOD; } } else if(!strcmp(var, "event_handler")) { if(temp_host->modified_attributes & MODATTR_EVENT_HANDLER_COMMAND) { /* make sure the check command still exists... */ tempval = (char *)strdup(val); temp_ptr = my_strtok(tempval, "!"); temp_command = find_command(temp_ptr); temp_ptr = (char *)strdup(val); my_free(tempval); if(temp_command != NULL && temp_ptr != NULL) { my_free(temp_host->event_handler); temp_host->event_handler = temp_ptr; } else temp_host->modified_attributes -= MODATTR_EVENT_HANDLER_COMMAND; } } else if(!strcmp(var, "check_interval")) { if(temp_host->modified_attributes & MODATTR_NORMAL_CHECK_INTERVAL && strtod(val, NULL) >= 0) temp_host->check_interval = strtod(val, NULL); } else if(!strcmp(var, "retry_interval")) { if(temp_host->modified_attributes & MODATTR_RETRY_CHECK_INTERVAL && strtod(val, NULL) >= 0) temp_host->retry_interval = strtod(val, NULL); } else if(!strcmp(var, "max_attempts")) { if(temp_host->modified_attributes & MODATTR_MAX_CHECK_ATTEMPTS && atoi(val) >= 1) { temp_host->max_attempts = atoi(val); /* adjust current attempt number if in a hard state */ if(temp_host->state_type == HARD_STATE && temp_host->current_state != HOST_UP && temp_host->current_attempt > 1) temp_host->current_attempt = temp_host->max_attempts; } } /* custom variables */ else if(var[0] == '_') { if(temp_host->modified_attributes & MODATTR_CUSTOM_VARIABLE) { /* get the variable name */ if((customvarname = (char *)strdup(var + 1))) { for(temp_customvariablesmember = temp_host->custom_variables; temp_customvariablesmember != NULL; temp_customvariablesmember = temp_customvariablesmember->next) { if(!strcmp(customvarname, temp_customvariablesmember->variable_name)) { if((x = atoi(val)) > 0 && strlen(val) > 3) { my_free(temp_customvariablesmember->variable_value); temp_customvariablesmember->variable_value = (char *)strdup(val + 2); temp_customvariablesmember->has_been_modified = (x > 0) ? TRUE : FALSE; } break; } } /* free memory */ my_free(customvarname); } } } } } break; case XRDDEFAULT_SERVICESTATUS_DATA: if(temp_service == NULL) { if(!strcmp(var, "host_name")) { host_name = (char *)strdup(val); /*temp_service=find_service(host_name,service_description);*/ /* break out */ break; } else if(!strcmp(var, "service_description")) { service_description = (char *)strdup(val); temp_service = find_service(host_name, service_description); /* break out */ break; } } else { if(!strcmp(var, "modified_attributes")) { temp_service->modified_attributes = strtoul(val, NULL, 10); /* mask out attributes we don't want to retain */ temp_service->modified_attributes &= ~service_attribute_mask; } if(temp_service->retain_status_information == TRUE) { if(!strcmp(var, "has_been_checked")) temp_service->has_been_checked = (atoi(val) > 0) ? TRUE : FALSE; else if(!strcmp(var, "check_execution_time")) temp_service->execution_time = strtod(val, NULL); else if(!strcmp(var, "check_latency")) temp_service->latency = strtod(val, NULL); else if(!strcmp(var, "check_type")) temp_service->check_type = atoi(val); else if(!strcmp(var, "current_state")) temp_service->current_state = atoi(val); else if(!strcmp(var, "last_state")) temp_service->last_state = atoi(val); else if(!strcmp(var, "last_hard_state")) temp_service->last_hard_state = atoi(val); else if(!strcmp(var, "current_attempt")) temp_service->current_attempt = atoi(val); else if(!strcmp(var, "current_event_id")) temp_service->current_event_id = strtoul(val, NULL, 10); else if(!strcmp(var, "last_event_id")) temp_service->last_event_id = strtoul(val, NULL, 10); else if(!strcmp(var, "current_problem_id")) temp_service->current_problem_id = strtoul(val, NULL, 10); else if(!strcmp(var, "last_problem_id")) temp_service->last_problem_id = strtoul(val, NULL, 10); else if(!strcmp(var, "state_type")) temp_service->state_type = atoi(val); else if(!strcmp(var, "last_state_change")) temp_service->last_state_change = strtoul(val, NULL, 10); else if(!strcmp(var, "last_hard_state_change")) temp_service->last_hard_state_change = strtoul(val, NULL, 10); else if(!strcmp(var, "last_time_ok")) temp_service->last_time_ok = strtoul(val, NULL, 10); else if(!strcmp(var, "last_time_warning")) temp_service->last_time_warning = strtoul(val, NULL, 10); else if(!strcmp(var, "last_time_unknown")) temp_service->last_time_unknown = strtoul(val, NULL, 10); else if(!strcmp(var, "last_time_critical")) temp_service->last_time_critical = strtoul(val, NULL, 10); else if(!strcmp(var, "plugin_output")) { my_free(temp_service->plugin_output); temp_service->plugin_output = (char *)strdup(val); } else if(!strcmp(var, "long_plugin_output")) { my_free(temp_service->long_plugin_output); temp_service->long_plugin_output = (char *)strdup(val); } else if(!strcmp(var, "performance_data")) { my_free(temp_service->perf_data); temp_service->perf_data = (char *)strdup(val); } else if(!strcmp(var, "last_check")) temp_service->last_check = strtoul(val, NULL, 10); else if(!strcmp(var, "next_check")) { if(use_retained_scheduling_info == TRUE && scheduling_info_is_ok == TRUE) temp_service->next_check = strtoul(val, NULL, 10); } else if(!strcmp(var, "check_options")) { if(use_retained_scheduling_info == TRUE && scheduling_info_is_ok == TRUE) temp_service->check_options = atoi(val); } else if(!strcmp(var, "notified_on_unknown")) temp_service->notified_on |= ((atoi(val) > 0) ? OPT_UNKNOWN : 0); else if(!strcmp(var, "notified_on_warning")) temp_service->notified_on |= ((atoi(val) > 0) ? OPT_WARNING : 0); else if(!strcmp(var, "notified_on_critical")) temp_service->notified_on |= ((atoi(val) > 0) ? OPT_CRITICAL : 0); else if(!strcmp(var, "current_notification_number")) temp_service->current_notification_number = atoi(val); else if(!strcmp(var, "current_notification_id")) temp_service->current_notification_id = strtoul(val, NULL, 10); else if(!strcmp(var, "last_notification")) temp_service->last_notification = strtoul(val, NULL, 10); else if(!strcmp(var, "is_flapping")) was_flapping = atoi(val); else if(!strcmp(var, "percent_state_change")) temp_service->percent_state_change = strtod(val, NULL); else if(!strcmp(var, "check_flapping_recovery_notification")) temp_service->check_flapping_recovery_notification = atoi(val); else if(!strcmp(var, "state_history")) { temp_ptr = val; for(x = 0; x < MAX_STATE_HISTORY_ENTRIES; x++) { if((ch = my_strsep(&temp_ptr, ",")) != NULL) temp_service->state_history[x] = atoi(ch); else break; } temp_service->state_history_index = 0; } else found_directive = FALSE; } if(temp_service->retain_nonstatus_information == TRUE) { /* null-op speeds up logic */ if(found_directive == TRUE); else if(!strcmp(var, "problem_has_been_acknowledged")) temp_service->problem_has_been_acknowledged = (atoi(val) > 0) ? TRUE : FALSE; else if(!strcmp(var, "acknowledgement_type")) temp_service->acknowledgement_type = atoi(val); else if(!strcmp(var, "notifications_enabled")) { if(temp_service->modified_attributes & MODATTR_NOTIFICATIONS_ENABLED) temp_service->notifications_enabled = (atoi(val) > 0) ? TRUE : FALSE; } else if(!strcmp(var, "active_checks_enabled")) { if(temp_service->modified_attributes & MODATTR_ACTIVE_CHECKS_ENABLED) temp_service->checks_enabled = (atoi(val) > 0) ? TRUE : FALSE; } else if(!strcmp(var, "passive_checks_enabled")) { if(temp_service->modified_attributes & MODATTR_PASSIVE_CHECKS_ENABLED) temp_service->accept_passive_checks = (atoi(val) > 0) ? TRUE : FALSE; } else if(!strcmp(var, "event_handler_enabled")) { if(temp_service->modified_attributes & MODATTR_EVENT_HANDLER_ENABLED) temp_service->event_handler_enabled = (atoi(val) > 0) ? TRUE : FALSE; } else if(!strcmp(var, "flap_detection_enabled")) { if(temp_service->modified_attributes & MODATTR_FLAP_DETECTION_ENABLED) temp_service->flap_detection_enabled = (atoi(val) > 0) ? TRUE : FALSE; } else if(!strcmp(var, "process_performance_data")) { if(temp_service->modified_attributes & MODATTR_PERFORMANCE_DATA_ENABLED) temp_service->process_performance_data = (atoi(val) > 0) ? TRUE : FALSE; } else if(!strcmp(var, "obsess_over_service") || !strcmp(var, "obsess")) { if(temp_service->modified_attributes & MODATTR_OBSESSIVE_HANDLER_ENABLED) temp_service->obsess = (atoi(val) > 0) ? TRUE : FALSE; } else if(!strcmp(var, "check_command")) { if(temp_service->modified_attributes & MODATTR_CHECK_COMMAND) { /* make sure the check command still exists... */ tempval = (char *)strdup(val); temp_ptr = my_strtok(tempval, "!"); temp_command = find_command(temp_ptr); temp_ptr = (char *)strdup(val); my_free(tempval); if(temp_command != NULL && temp_ptr != NULL) { my_free(temp_service->check_command); temp_service->check_command = temp_ptr; } else temp_service->modified_attributes -= MODATTR_CHECK_COMMAND; } } else if(!strcmp(var, "check_period")) { if(temp_service->modified_attributes & MODATTR_CHECK_TIMEPERIOD) { /* make sure the timeperiod still exists... */ temp_timeperiod = find_timeperiod(val); temp_ptr = (char *)strdup(val); if(temp_timeperiod != NULL && temp_ptr != NULL) { my_free(temp_service->check_period); temp_service->check_period = temp_ptr; } else temp_service->modified_attributes -= MODATTR_CHECK_TIMEPERIOD; } } else if(!strcmp(var, "notification_period")) { if(temp_service->modified_attributes & MODATTR_NOTIFICATION_TIMEPERIOD) { /* make sure the timeperiod still exists... */ temp_timeperiod = find_timeperiod(val); temp_ptr = (char *)strdup(val); if(temp_timeperiod != NULL && temp_ptr != NULL) { my_free(temp_service->notification_period); temp_service->notification_period = temp_ptr; } else temp_service->modified_attributes -= MODATTR_NOTIFICATION_TIMEPERIOD; } } else if(!strcmp(var, "event_handler")) { if(temp_service->modified_attributes & MODATTR_EVENT_HANDLER_COMMAND) { /* make sure the check command still exists... */ tempval = (char *)strdup(val); temp_ptr = my_strtok(tempval, "!"); temp_command = find_command(temp_ptr); temp_ptr = (char *)strdup(val); my_free(tempval); if(temp_command != NULL && temp_ptr != NULL) { my_free(temp_service->event_handler); temp_service->event_handler = temp_ptr; } else temp_service->modified_attributes -= MODATTR_EVENT_HANDLER_COMMAND; } } else if(!strcmp(var, "check_interval")) { if(temp_service->modified_attributes & MODATTR_NORMAL_CHECK_INTERVAL && strtod(val, NULL) >= 0) temp_service->check_interval = strtod(val, NULL); } else if(!strcmp(var, "retry_interval")) { if(temp_service->modified_attributes & MODATTR_RETRY_CHECK_INTERVAL && strtod(val, NULL) >= 0) temp_service->retry_interval = strtod(val, NULL); } else if(!strcmp(var, "max_attempts")) { if(temp_service->modified_attributes & MODATTR_MAX_CHECK_ATTEMPTS && atoi(val) >= 1) { temp_service->max_attempts = atoi(val); /* adjust current attempt number if in a hard state */ if(temp_service->state_type == HARD_STATE && temp_service->current_state != STATE_OK && temp_service->current_attempt > 1) temp_service->current_attempt = temp_service->max_attempts; } } /* custom variables */ else if(var[0] == '_') { if(temp_service->modified_attributes & MODATTR_CUSTOM_VARIABLE) { /* get the variable name */ if((customvarname = (char *)strdup(var + 1))) { for(temp_customvariablesmember = temp_service->custom_variables; temp_customvariablesmember != NULL; temp_customvariablesmember = temp_customvariablesmember->next) { if(!strcmp(customvarname, temp_customvariablesmember->variable_name)) { if((x = atoi(val)) > 0 && strlen(val) > 3) { my_free(temp_customvariablesmember->variable_value); temp_customvariablesmember->variable_value = (char *)strdup(val + 2); temp_customvariablesmember->has_been_modified = (x > 0) ? TRUE : FALSE; } break; } } /* free memory */ my_free(customvarname); } } } } } break; case XRDDEFAULT_CONTACTSTATUS_DATA: if(temp_contact == NULL) { if(!strcmp(var, "contact_name")) { contact_name = (char *)strdup(val); temp_contact = find_contact(contact_name); } } else { if(!strcmp(var, "modified_attributes")) { temp_contact->modified_attributes = strtoul(val, NULL, 10); /* mask out attributes we don't want to retain */ temp_contact->modified_attributes &= ~contact_attribute_mask; } else if(!strcmp(var, "modified_host_attributes")) { temp_contact->modified_host_attributes = strtoul(val, NULL, 10); /* mask out attributes we don't want to retain */ temp_contact->modified_host_attributes &= ~contact_host_attribute_mask; } else if(!strcmp(var, "modified_service_attributes")) { temp_contact->modified_service_attributes = strtoul(val, NULL, 10); /* mask out attributes we don't want to retain */ temp_contact->modified_service_attributes &= ~contact_service_attribute_mask; } else if(temp_contact->retain_status_information == TRUE) { if(!strcmp(var, "last_host_notification")) temp_contact->last_host_notification = strtoul(val, NULL, 10); else if(!strcmp(var, "last_service_notification")) temp_contact->last_service_notification = strtoul(val, NULL, 10); else found_directive = FALSE; } if(temp_contact->retain_nonstatus_information == TRUE) { /* null-op speeds up logic */ if(found_directive == TRUE); else if(!strcmp(var, "host_notification_period")) { if(temp_contact->modified_host_attributes & MODATTR_NOTIFICATION_TIMEPERIOD) { /* make sure the timeperiod still exists... */ temp_timeperiod = find_timeperiod(val); temp_ptr = (char *)strdup(val); if(temp_timeperiod != NULL && temp_ptr != NULL) { my_free(temp_contact->host_notification_period); temp_contact->host_notification_period = temp_ptr; } else temp_contact->modified_host_attributes -= MODATTR_NOTIFICATION_TIMEPERIOD; } } else if(!strcmp(var, "service_notification_period")) { if(temp_contact->modified_service_attributes & MODATTR_NOTIFICATION_TIMEPERIOD) { /* make sure the timeperiod still exists... */ temp_timeperiod = find_timeperiod(val); temp_ptr = (char *)strdup(val); if(temp_timeperiod != NULL && temp_ptr != NULL) { my_free(temp_contact->service_notification_period); temp_contact->service_notification_period = temp_ptr; } else temp_contact->modified_service_attributes -= MODATTR_NOTIFICATION_TIMEPERIOD; } } else if(!strcmp(var, "host_notifications_enabled")) { if(temp_contact->modified_host_attributes & MODATTR_NOTIFICATIONS_ENABLED) temp_contact->host_notifications_enabled = (atoi(val) > 0) ? TRUE : FALSE; } else if(!strcmp(var, "service_notifications_enabled")) { if(temp_contact->modified_service_attributes & MODATTR_NOTIFICATIONS_ENABLED) temp_contact->service_notifications_enabled = (atoi(val) > 0) ? TRUE : FALSE; } /* custom variables */ else if(var[0] == '_') { if(temp_contact->modified_attributes & MODATTR_CUSTOM_VARIABLE) { /* get the variable name */ if((customvarname = (char *)strdup(var + 1))) { for(temp_customvariablesmember = temp_contact->custom_variables; temp_customvariablesmember != NULL; temp_customvariablesmember = temp_customvariablesmember->next) { if(!strcmp(customvarname, temp_customvariablesmember->variable_name)) { if((x = atoi(val)) > 0 && strlen(val) > 3) { my_free(temp_customvariablesmember->variable_value); temp_customvariablesmember->variable_value = (char *)strdup(val + 2); temp_customvariablesmember->has_been_modified = (x > 0) ? TRUE : FALSE; } break; } } /* free memory */ my_free(customvarname); } } } } } break; case XRDDEFAULT_HOSTCOMMENT_DATA: case XRDDEFAULT_SERVICECOMMENT_DATA: if(!strcmp(var, "host_name")) host_name = (char *)strdup(val); else if(!strcmp(var, "service_description")) service_description = (char *)strdup(val); else if(!strcmp(var, "entry_type")) entry_type = atoi(val); else if(!strcmp(var, "comment_id")) comment_id = strtoul(val, NULL, 10); else if(!strcmp(var, "source")) source = atoi(val); else if(!strcmp(var, "persistent")) persistent = (atoi(val) > 0) ? TRUE : FALSE; else if(!strcmp(var, "entry_time")) entry_time = strtoul(val, NULL, 10); else if(!strcmp(var, "expires")) expires = (atoi(val) > 0) ? TRUE : FALSE; else if(!strcmp(var, "expire_time")) expire_time = strtoul(val, NULL, 10); else if(!strcmp(var, "author")) author = (char *)strdup(val); else if(!strcmp(var, "comment_data")) comment_data = (char *)strdup(val); break; case XRDDEFAULT_HOSTDOWNTIME_DATA: case XRDDEFAULT_SERVICEDOWNTIME_DATA: if(!strcmp(var, "host_name")) host_name = (char *)strdup(val); else if(!strcmp(var, "service_description")) service_description = (char *)strdup(val); else if(!strcmp(var, "downtime_id")) downtime_id = strtoul(val, NULL, 10); else if(!strcmp(var, "comment_id")) comment_id = strtoul(val, NULL, 10); else if(!strcmp(var, "entry_time")) entry_time = strtoul(val, NULL, 10); else if(!strcmp(var, "start_time")) start_time = strtoul(val, NULL, 10); else if(!strcmp(var, "flex_downtime_start")) flex_downtime_start = strtoul(val, NULL, 10); else if(!strcmp(var, "end_time")) end_time = strtoul(val, NULL, 10); else if(!strcmp(var, "fixed")) fixed = (atoi(val) > 0) ? TRUE : FALSE; else if(!strcmp(var, "triggered_by")) triggered_by = strtoul(val, NULL, 10); else if(!strcmp(var, "is_in_effect")) is_in_effect = (atoi(val) > 0) ? TRUE : FALSE; else if(!strcmp(var, "start_notification_sent")) start_notification_sent = (atoi(val) > 0) ? TRUE : FALSE; else if(!strcmp(var, "duration")) duration = strtoul(val, NULL, 10); else if(!strcmp(var, "author")) author = (char *)strdup(val); else if(!strcmp(var, "comment")) comment_data = (char *)strdup(val); break; default: break; } } } /* free memory and close the file */ my_free(inputbuf); mmap_fclose(thefile); if(sort_downtime() != OK) return ERROR; if(sort_comments() != OK) return ERROR; if(test_scheduling == TRUE) gettimeofday(&tv[1], NULL); if(test_scheduling == TRUE) { runtime[0] = (double)((double)(tv[1].tv_sec - tv[0].tv_sec) + (double)((tv[1].tv_usec - tv[0].tv_usec) / 1000.0) / 1000.0); runtime[1] = (double)((double)(tv[1].tv_sec - tv[0].tv_sec) + (double)((tv[1].tv_usec - tv[0].tv_usec) / 1000.0) / 1000.0); printf("RETENTION DATA TIMES\n"); printf("----------------------------------\n"); printf("Read and Process: %.6lf sec\n", runtime[0]); printf(" ============\n"); printf("TOTAL: %.6lf sec\n", runtime[1]); printf("\n\n"); } return OK; } nagios-4.3.4/xdata/xrddefault.h000066400000000000000000000032631314764422400164310ustar00rootroot00000000000000/***************************************************************************** * * XRDDEFAULT.H - Header file for default state retention routines * * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #ifndef NAGIOS_XRDDEFAULT_H_INCLUDED #define NAGIOS_XRDDEFAULT_H_INCLUDED #define XRDDEFAULT_NO_DATA 0 #define XRDDEFAULT_INFO_DATA 1 #define XRDDEFAULT_PROGRAMSTATUS_DATA 2 #define XRDDEFAULT_HOSTSTATUS_DATA 3 #define XRDDEFAULT_SERVICESTATUS_DATA 4 #define XRDDEFAULT_CONTACTSTATUS_DATA 5 #define XRDDEFAULT_HOSTCOMMENT_DATA 6 #define XRDDEFAULT_SERVICECOMMENT_DATA 7 #define XRDDEFAULT_HOSTDOWNTIME_DATA 8 #define XRDDEFAULT_SERVICEDOWNTIME_DATA 9 int xrddefault_initialize_retention_data(const char *); int xrddefault_cleanup_retention_data(void); int xrddefault_save_state_information(void); /* saves all host and service state information */ int xrddefault_read_state_information(void); /* reads in initial host and service state information */ #endif nagios-4.3.4/xdata/xsddefault.c000066400000000000000000001347511314764422400164340ustar00rootroot00000000000000/***************************************************************************** * * XSDDEFAULT.C - Default external status data input routines for Nagios * * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ /*********** COMMON HEADER FILES ***********/ #include "../include/config.h" #include "../include/common.h" #include "../include/locations.h" #include "../include/statusdata.h" #include "../include/comments.h" #include "../include/downtime.h" #include "../include/macros.h" #include "xsddefault.h" #ifdef NSCORE #include "../include/nagios.h" #endif #ifdef NSCGI #include "../include/cgiutils.h" time_t program_start; int daemon_mode; time_t last_log_rotation; int enable_notifications; int execute_service_checks; int accept_passive_service_checks; int execute_host_checks; int accept_passive_host_checks; int enable_event_handlers; int obsess_over_services; int obsess_over_hosts; int check_service_freshness; int check_host_freshness; int enable_flap_detection; int process_performance_data; int nagios_pid; int buffer_stats[1][3]; int program_stats[MAX_CHECK_STATS_TYPES][3]; #endif #ifdef NSCORE /******************************************************************/ /********************* INIT/CLEANUP FUNCTIONS *********************/ /******************************************************************/ /* initialize status data */ int xsddefault_initialize_status_data(const char *cfgfile) { nagios_macros *mac; /* initialize locations if necessary */ if(!status_file) status_file = (char *)strdup(DEFAULT_STATUS_FILE); /* make sure we have what we need */ if(status_file == NULL) return ERROR; mac = get_global_macros(); /* save the status file macro */ my_free(mac->x[MACRO_STATUSDATAFILE]); if((mac->x[MACRO_STATUSDATAFILE] = (char *)strdup(status_file))) strip(mac->x[MACRO_STATUSDATAFILE]); /* delete the old status log (it might not exist) */ if(status_file) unlink(status_file); return OK; } /* cleanup status data before terminating */ int xsddefault_cleanup_status_data(int delete_status_data) { /* delete the status log */ if(delete_status_data == TRUE && status_file) { if(unlink(status_file)) return ERROR; } /* free memory */ my_free(status_file); return OK; } /******************************************************************/ /****************** STATUS DATA OUTPUT FUNCTIONS ******************/ /******************************************************************/ /* write all status data to file */ int xsddefault_save_status_data(void) { char *tmp_log = NULL; customvariablesmember *temp_customvariablesmember = NULL; host *temp_host = NULL; service *temp_service = NULL; contact *temp_contact = NULL; nagios_comment *temp_comment = NULL; scheduled_downtime *temp_downtime = NULL; time_t current_time; int fd = 0; FILE *fp = NULL; int result = OK; log_debug_info(DEBUGL_FUNCTIONS, 0, "save_status_data()\n"); /* users may not want us to write status data */ if(!status_file || !strcmp(status_file, "/dev/null")) return OK; asprintf(&tmp_log, "%sXXXXXX", temp_file); if(tmp_log == NULL) return ERROR; log_debug_info(DEBUGL_STATUSDATA, 2, "Writing status data to temp file '%s'\n", tmp_log); if((fd = mkstemp(tmp_log)) == -1) { /* log an error */ logit(NSLOG_RUNTIME_ERROR, TRUE, "Error: Unable to create temp file '%s' for writing status data: %s\n", tmp_log, strerror(errno)); /* free memory */ my_free(tmp_log); return ERROR; } fp = (FILE *)fdopen(fd, "w"); if(fp == NULL) { close(fd); unlink(tmp_log); /* log an error */ logit(NSLOG_RUNTIME_ERROR, TRUE, "Error: Unable to open temp file '%s' for writing status data: %s\n", tmp_log, strerror(errno)); /* free memory */ my_free(tmp_log); return ERROR; } /* generate check statistics */ generate_check_stats(); /* write version info to status file */ fprintf(fp, "########################################\n"); fprintf(fp, "# NAGIOS STATUS FILE\n"); fprintf(fp, "#\n"); fprintf(fp, "# THIS FILE IS AUTOMATICALLY GENERATED\n"); fprintf(fp, "# BY NAGIOS. DO NOT MODIFY THIS FILE!\n"); fprintf(fp, "########################################\n\n"); time(¤t_time); /* write file info */ fprintf(fp, "info {\n"); fprintf(fp, "\tcreated=%llu\n", (unsigned long long)current_time); fprintf(fp, "\tversion=%s\n", PROGRAM_VERSION); fprintf(fp, "\tlast_update_check=%llu\n", (unsigned long long)last_update_check); fprintf(fp, "\tupdate_available=%d\n", update_available); fprintf(fp, "\tlast_version=%s\n", (last_program_version == NULL) ? "" : last_program_version); fprintf(fp, "\tnew_version=%s\n", (new_program_version == NULL) ? "" : new_program_version); fprintf(fp, "\t}\n\n"); /* save program status data */ fprintf(fp, "programstatus {\n"); fprintf(fp, "\tmodified_host_attributes=%lu\n", modified_host_process_attributes); fprintf(fp, "\tmodified_service_attributes=%lu\n", modified_service_process_attributes); fprintf(fp, "\tnagios_pid=%d\n", nagios_pid); fprintf(fp, "\tdaemon_mode=%d\n", daemon_mode); fprintf(fp, "\tprogram_start=%llu\n", (unsigned long long)program_start); fprintf(fp, "\tlast_log_rotation=%llu\n", (unsigned long long)last_log_rotation); fprintf(fp, "\tenable_notifications=%d\n", enable_notifications); fprintf(fp, "\tactive_service_checks_enabled=%d\n", execute_service_checks); fprintf(fp, "\tpassive_service_checks_enabled=%d\n", accept_passive_service_checks); fprintf(fp, "\tactive_host_checks_enabled=%d\n", execute_host_checks); fprintf(fp, "\tpassive_host_checks_enabled=%d\n", accept_passive_host_checks); fprintf(fp, "\tenable_event_handlers=%d\n", enable_event_handlers); fprintf(fp, "\tobsess_over_services=%d\n", obsess_over_services); fprintf(fp, "\tobsess_over_hosts=%d\n", obsess_over_hosts); fprintf(fp, "\tcheck_service_freshness=%d\n", check_service_freshness); fprintf(fp, "\tcheck_host_freshness=%d\n", check_host_freshness); fprintf(fp, "\tenable_flap_detection=%d\n", enable_flap_detection); fprintf(fp, "\tprocess_performance_data=%d\n", process_performance_data); fprintf(fp, "\tglobal_host_event_handler=%s\n", (global_host_event_handler == NULL) ? "" : global_host_event_handler); fprintf(fp, "\tglobal_service_event_handler=%s\n", (global_service_event_handler == NULL) ? "" : global_service_event_handler); fprintf(fp, "\tnext_comment_id=%lu\n", next_comment_id); fprintf(fp, "\tnext_downtime_id=%lu\n", next_downtime_id); fprintf(fp, "\tnext_event_id=%lu\n", next_event_id); fprintf(fp, "\tnext_problem_id=%lu\n", next_problem_id); fprintf(fp, "\tnext_notification_id=%lu\n", next_notification_id); fprintf(fp, "\tactive_scheduled_host_check_stats=%d,%d,%d\n", check_statistics[ACTIVE_SCHEDULED_HOST_CHECK_STATS].minute_stats[0], check_statistics[ACTIVE_SCHEDULED_HOST_CHECK_STATS].minute_stats[1], check_statistics[ACTIVE_SCHEDULED_HOST_CHECK_STATS].minute_stats[2]); fprintf(fp, "\tactive_ondemand_host_check_stats=%d,%d,%d\n", check_statistics[ACTIVE_ONDEMAND_HOST_CHECK_STATS].minute_stats[0], check_statistics[ACTIVE_ONDEMAND_HOST_CHECK_STATS].minute_stats[1], check_statistics[ACTIVE_ONDEMAND_HOST_CHECK_STATS].minute_stats[2]); fprintf(fp, "\tpassive_host_check_stats=%d,%d,%d\n", check_statistics[PASSIVE_HOST_CHECK_STATS].minute_stats[0], check_statistics[PASSIVE_HOST_CHECK_STATS].minute_stats[1], check_statistics[PASSIVE_HOST_CHECK_STATS].minute_stats[2]); fprintf(fp, "\tactive_scheduled_service_check_stats=%d,%d,%d\n", check_statistics[ACTIVE_SCHEDULED_SERVICE_CHECK_STATS].minute_stats[0], check_statistics[ACTIVE_SCHEDULED_SERVICE_CHECK_STATS].minute_stats[1], check_statistics[ACTIVE_SCHEDULED_SERVICE_CHECK_STATS].minute_stats[2]); fprintf(fp, "\tactive_ondemand_service_check_stats=%d,%d,%d\n", check_statistics[ACTIVE_ONDEMAND_SERVICE_CHECK_STATS].minute_stats[0], check_statistics[ACTIVE_ONDEMAND_SERVICE_CHECK_STATS].minute_stats[1], check_statistics[ACTIVE_ONDEMAND_SERVICE_CHECK_STATS].minute_stats[2]); fprintf(fp, "\tpassive_service_check_stats=%d,%d,%d\n", check_statistics[PASSIVE_SERVICE_CHECK_STATS].minute_stats[0], check_statistics[PASSIVE_SERVICE_CHECK_STATS].minute_stats[1], check_statistics[PASSIVE_SERVICE_CHECK_STATS].minute_stats[2]); fprintf(fp, "\tcached_host_check_stats=%d,%d,%d\n", check_statistics[ACTIVE_CACHED_HOST_CHECK_STATS].minute_stats[0], check_statistics[ACTIVE_CACHED_HOST_CHECK_STATS].minute_stats[1], check_statistics[ACTIVE_CACHED_HOST_CHECK_STATS].minute_stats[2]); fprintf(fp, "\tcached_service_check_stats=%d,%d,%d\n", check_statistics[ACTIVE_CACHED_SERVICE_CHECK_STATS].minute_stats[0], check_statistics[ACTIVE_CACHED_SERVICE_CHECK_STATS].minute_stats[1], check_statistics[ACTIVE_CACHED_SERVICE_CHECK_STATS].minute_stats[2]); fprintf(fp, "\texternal_command_stats=%d,%d,%d\n", check_statistics[EXTERNAL_COMMAND_STATS].minute_stats[0], check_statistics[EXTERNAL_COMMAND_STATS].minute_stats[1], check_statistics[EXTERNAL_COMMAND_STATS].minute_stats[2]); fprintf(fp, "\tparallel_host_check_stats=%d,%d,%d\n", check_statistics[PARALLEL_HOST_CHECK_STATS].minute_stats[0], check_statistics[PARALLEL_HOST_CHECK_STATS].minute_stats[1], check_statistics[PARALLEL_HOST_CHECK_STATS].minute_stats[2]); fprintf(fp, "\tserial_host_check_stats=%d,%d,%d\n", check_statistics[SERIAL_HOST_CHECK_STATS].minute_stats[0], check_statistics[SERIAL_HOST_CHECK_STATS].minute_stats[1], check_statistics[SERIAL_HOST_CHECK_STATS].minute_stats[2]); fprintf(fp, "\t}\n\n"); /* save host status data */ for(temp_host = host_list; temp_host != NULL; temp_host = temp_host->next) { fprintf(fp, "hoststatus {\n"); fprintf(fp, "\thost_name=%s\n", temp_host->name); fprintf(fp, "\tmodified_attributes=%lu\n", temp_host->modified_attributes); fprintf(fp, "\tcheck_command=%s\n", (temp_host->check_command == NULL) ? "" : temp_host->check_command); fprintf(fp, "\tcheck_period=%s\n", (temp_host->check_period == NULL) ? "" : temp_host->check_period); fprintf(fp, "\tnotification_period=%s\n", (temp_host->notification_period == NULL) ? "" : temp_host->notification_period); fprintf(fp, "\timportance=%u\n", temp_host->hourly_value); fprintf(fp, "\tcheck_interval=%f\n", temp_host->check_interval); fprintf(fp, "\tretry_interval=%f\n", temp_host->retry_interval); fprintf(fp, "\tevent_handler=%s\n", (temp_host->event_handler == NULL) ? "" : temp_host->event_handler); fprintf(fp, "\thas_been_checked=%d\n", temp_host->has_been_checked); fprintf(fp, "\tshould_be_scheduled=%d\n", temp_host->should_be_scheduled); fprintf(fp, "\tcheck_execution_time=%.3f\n", temp_host->execution_time); fprintf(fp, "\tcheck_latency=%.3f\n", temp_host->latency); fprintf(fp, "\tcheck_type=%d\n", temp_host->check_type); fprintf(fp, "\tcurrent_state=%d\n", temp_host->current_state); fprintf(fp, "\tlast_hard_state=%d\n", temp_host->last_hard_state); fprintf(fp, "\tlast_event_id=%lu\n", temp_host->last_event_id); fprintf(fp, "\tcurrent_event_id=%lu\n", temp_host->current_event_id); fprintf(fp, "\tcurrent_problem_id=%lu\n", temp_host->current_problem_id); fprintf(fp, "\tlast_problem_id=%lu\n", temp_host->last_problem_id); fprintf(fp, "\tplugin_output=%s\n", (temp_host->plugin_output == NULL) ? "" : temp_host->plugin_output); fprintf(fp, "\tlong_plugin_output=%s\n", (temp_host->long_plugin_output == NULL) ? "" : temp_host->long_plugin_output); fprintf(fp, "\tperformance_data=%s\n", (temp_host->perf_data == NULL) ? "" : temp_host->perf_data); fprintf(fp, "\tlast_check=%llu\n", (unsigned long long)temp_host->last_check); fprintf(fp, "\tnext_check=%llu\n", (unsigned long long)temp_host->next_check); fprintf(fp, "\tcheck_options=%d\n", temp_host->check_options); fprintf(fp, "\tcurrent_attempt=%d\n", temp_host->current_attempt); fprintf(fp, "\tmax_attempts=%d\n", temp_host->max_attempts); fprintf(fp, "\tstate_type=%d\n", temp_host->state_type); fprintf(fp, "\tlast_state_change=%llu\n", (unsigned long long)temp_host->last_state_change); fprintf(fp, "\tlast_hard_state_change=%llu\n", (unsigned long long)temp_host->last_hard_state_change); fprintf(fp, "\tlast_time_up=%llu\n", (unsigned long long)temp_host->last_time_up); fprintf(fp, "\tlast_time_down=%llu\n", (unsigned long long)temp_host->last_time_down); fprintf(fp, "\tlast_time_unreachable=%llu\n", (unsigned long long)temp_host->last_time_unreachable); fprintf(fp, "\tlast_notification=%llu\n", (unsigned long long)temp_host->last_notification); fprintf(fp, "\tnext_notification=%llu\n", (unsigned long long)temp_host->next_notification); fprintf(fp, "\tno_more_notifications=%d\n", temp_host->no_more_notifications); fprintf(fp, "\tcurrent_notification_number=%d\n", temp_host->current_notification_number); fprintf(fp, "\tcurrent_notification_id=%lu\n", temp_host->current_notification_id); fprintf(fp, "\tnotifications_enabled=%d\n", temp_host->notifications_enabled); fprintf(fp, "\tproblem_has_been_acknowledged=%d\n", temp_host->problem_has_been_acknowledged); fprintf(fp, "\tacknowledgement_type=%d\n", temp_host->acknowledgement_type); fprintf(fp, "\tactive_checks_enabled=%d\n", temp_host->checks_enabled); fprintf(fp, "\tpassive_checks_enabled=%d\n", temp_host->accept_passive_checks); fprintf(fp, "\tevent_handler_enabled=%d\n", temp_host->event_handler_enabled); fprintf(fp, "\tflap_detection_enabled=%d\n", temp_host->flap_detection_enabled); fprintf(fp, "\tprocess_performance_data=%d\n", temp_host->process_performance_data); fprintf(fp, "\tobsess=%d\n", temp_host->obsess); fprintf(fp, "\tlast_update=%llu\n", (unsigned long long)current_time); fprintf(fp, "\tis_flapping=%d\n", temp_host->is_flapping); fprintf(fp, "\tpercent_state_change=%.2f\n", temp_host->percent_state_change); fprintf(fp, "\tscheduled_downtime_depth=%d\n", temp_host->scheduled_downtime_depth); /* custom variables */ for(temp_customvariablesmember = temp_host->custom_variables; temp_customvariablesmember != NULL; temp_customvariablesmember = temp_customvariablesmember->next) { if(temp_customvariablesmember->variable_name) fprintf(fp, "\t_%s=%d;%s\n", temp_customvariablesmember->variable_name, temp_customvariablesmember->has_been_modified, (temp_customvariablesmember->variable_value == NULL) ? "" : temp_customvariablesmember->variable_value); } fprintf(fp, "\t}\n\n"); } /* save service status data */ for(temp_service = service_list; temp_service != NULL; temp_service = temp_service->next) { fprintf(fp, "servicestatus {\n"); fprintf(fp, "\thost_name=%s\n", temp_service->host_name); fprintf(fp, "\tservice_description=%s\n", temp_service->description); fprintf(fp, "\tmodified_attributes=%lu\n", temp_service->modified_attributes); fprintf(fp, "\tcheck_command=%s\n", (temp_service->check_command == NULL) ? "" : temp_service->check_command); fprintf(fp, "\tcheck_period=%s\n", (temp_service->check_period == NULL) ? "" : temp_service->check_period); fprintf(fp, "\tnotification_period=%s\n", (temp_service->notification_period == NULL) ? "" : temp_service->notification_period); fprintf(fp, "\timportance=%u\n", temp_service->hourly_value); fprintf(fp, "\tcheck_interval=%f\n", temp_service->check_interval); fprintf(fp, "\tretry_interval=%f\n", temp_service->retry_interval); fprintf(fp, "\tevent_handler=%s\n", (temp_service->event_handler == NULL) ? "" : temp_service->event_handler); fprintf(fp, "\thas_been_checked=%d\n", temp_service->has_been_checked); fprintf(fp, "\tshould_be_scheduled=%d\n", temp_service->should_be_scheduled); fprintf(fp, "\tcheck_execution_time=%.3f\n", temp_service->execution_time); fprintf(fp, "\tcheck_latency=%.3f\n", temp_service->latency); fprintf(fp, "\tcheck_type=%d\n", temp_service->check_type); fprintf(fp, "\tcurrent_state=%d\n", temp_service->current_state); fprintf(fp, "\tlast_hard_state=%d\n", temp_service->last_hard_state); fprintf(fp, "\tlast_event_id=%lu\n", temp_service->last_event_id); fprintf(fp, "\tcurrent_event_id=%lu\n", temp_service->current_event_id); fprintf(fp, "\tcurrent_problem_id=%lu\n", temp_service->current_problem_id); fprintf(fp, "\tlast_problem_id=%lu\n", temp_service->last_problem_id); fprintf(fp, "\tcurrent_attempt=%d\n", temp_service->current_attempt); fprintf(fp, "\tmax_attempts=%d\n", temp_service->max_attempts); fprintf(fp, "\tstate_type=%d\n", temp_service->state_type); fprintf(fp, "\tlast_state_change=%llu\n", (unsigned long long)temp_service->last_state_change); fprintf(fp, "\tlast_hard_state_change=%llu\n", (unsigned long long)temp_service->last_hard_state_change); fprintf(fp, "\tlast_time_ok=%llu\n", (unsigned long long)temp_service->last_time_ok); fprintf(fp, "\tlast_time_warning=%llu\n", (unsigned long long)temp_service->last_time_warning); fprintf(fp, "\tlast_time_unknown=%llu\n", (unsigned long long)temp_service->last_time_unknown); fprintf(fp, "\tlast_time_critical=%llu\n", (unsigned long long)temp_service->last_time_critical); fprintf(fp, "\tplugin_output=%s\n", (temp_service->plugin_output == NULL) ? "" : temp_service->plugin_output); fprintf(fp, "\tlong_plugin_output=%s\n", (temp_service->long_plugin_output == NULL) ? "" : temp_service->long_plugin_output); fprintf(fp, "\tperformance_data=%s\n", (temp_service->perf_data == NULL) ? "" : temp_service->perf_data); fprintf(fp, "\tlast_check=%llu\n", (unsigned long long)temp_service->last_check); fprintf(fp, "\tnext_check=%llu\n", (unsigned long long)temp_service->next_check); fprintf(fp, "\tcheck_options=%d\n", temp_service->check_options); fprintf(fp, "\tcurrent_notification_number=%d\n", temp_service->current_notification_number); fprintf(fp, "\tcurrent_notification_id=%lu\n", temp_service->current_notification_id); fprintf(fp, "\tlast_notification=%llu\n", (unsigned long long)temp_service->last_notification); fprintf(fp, "\tnext_notification=%llu\n", (unsigned long long)temp_service->next_notification); fprintf(fp, "\tno_more_notifications=%d\n", temp_service->no_more_notifications); fprintf(fp, "\tnotifications_enabled=%d\n", temp_service->notifications_enabled); fprintf(fp, "\tactive_checks_enabled=%d\n", temp_service->checks_enabled); fprintf(fp, "\tpassive_checks_enabled=%d\n", temp_service->accept_passive_checks); fprintf(fp, "\tevent_handler_enabled=%d\n", temp_service->event_handler_enabled); fprintf(fp, "\tproblem_has_been_acknowledged=%d\n", temp_service->problem_has_been_acknowledged); fprintf(fp, "\tacknowledgement_type=%d\n", temp_service->acknowledgement_type); fprintf(fp, "\tflap_detection_enabled=%d\n", temp_service->flap_detection_enabled); fprintf(fp, "\tprocess_performance_data=%d\n", temp_service->process_performance_data); fprintf(fp, "\tobsess=%d\n", temp_service->obsess); fprintf(fp, "\tlast_update=%llu\n", (unsigned long long)current_time); fprintf(fp, "\tis_flapping=%d\n", temp_service->is_flapping); fprintf(fp, "\tpercent_state_change=%.2f\n", temp_service->percent_state_change); fprintf(fp, "\tscheduled_downtime_depth=%d\n", temp_service->scheduled_downtime_depth); /* custom variables */ for(temp_customvariablesmember = temp_service->custom_variables; temp_customvariablesmember != NULL; temp_customvariablesmember = temp_customvariablesmember->next) { if(temp_customvariablesmember->variable_name) fprintf(fp, "\t_%s=%d;%s\n", temp_customvariablesmember->variable_name, temp_customvariablesmember->has_been_modified, (temp_customvariablesmember->variable_value == NULL) ? "" : temp_customvariablesmember->variable_value); } fprintf(fp, "\t}\n\n"); } /* save contact status data */ for(temp_contact = contact_list; temp_contact != NULL; temp_contact = temp_contact->next) { fprintf(fp, "contactstatus {\n"); fprintf(fp, "\tcontact_name=%s\n", temp_contact->name); fprintf(fp, "\tmodified_attributes=%lu\n", temp_contact->modified_attributes); fprintf(fp, "\tmodified_host_attributes=%lu\n", temp_contact->modified_host_attributes); fprintf(fp, "\tmodified_service_attributes=%lu\n", temp_contact->modified_service_attributes); fprintf(fp, "\thost_notification_period=%s\n", (temp_contact->host_notification_period == NULL) ? "" : temp_contact->host_notification_period); fprintf(fp, "\tservice_notification_period=%s\n", (temp_contact->service_notification_period == NULL) ? "" : temp_contact->service_notification_period); fprintf(fp, "\tlast_host_notification=%llu\n", (unsigned long long)temp_contact->last_host_notification); fprintf(fp, "\tlast_service_notification=%llu\n", (unsigned long long)temp_contact->last_service_notification); fprintf(fp, "\thost_notifications_enabled=%d\n", temp_contact->host_notifications_enabled); fprintf(fp, "\tservice_notifications_enabled=%d\n", temp_contact->service_notifications_enabled); /* custom variables */ for(temp_customvariablesmember = temp_contact->custom_variables; temp_customvariablesmember != NULL; temp_customvariablesmember = temp_customvariablesmember->next) { if(temp_customvariablesmember->variable_name) fprintf(fp, "\t_%s=%d;%s\n", temp_customvariablesmember->variable_name, temp_customvariablesmember->has_been_modified, (temp_customvariablesmember->variable_value == NULL) ? "" : temp_customvariablesmember->variable_value); } fprintf(fp, "\t}\n\n"); } /* save all comments */ for(temp_comment = comment_list; temp_comment != NULL; temp_comment = temp_comment->next) { if(temp_comment->comment_type == HOST_COMMENT) fprintf(fp, "hostcomment {\n"); else fprintf(fp, "servicecomment {\n"); fprintf(fp, "\thost_name=%s\n", temp_comment->host_name); if(temp_comment->comment_type == SERVICE_COMMENT) fprintf(fp, "\tservice_description=%s\n", temp_comment->service_description); fprintf(fp, "\tentry_type=%d\n", temp_comment->entry_type); fprintf(fp, "\tcomment_id=%lu\n", temp_comment->comment_id); fprintf(fp, "\tsource=%d\n", temp_comment->source); fprintf(fp, "\tpersistent=%d\n", temp_comment->persistent); fprintf(fp, "\tentry_time=%llu\n", (unsigned long long)temp_comment->entry_time); fprintf(fp, "\texpires=%d\n", temp_comment->expires); fprintf(fp, "\texpire_time=%llu\n", (unsigned long long)temp_comment->expire_time); fprintf(fp, "\tauthor=%s\n", temp_comment->author); fprintf(fp, "\tcomment_data=%s\n", temp_comment->comment_data); fprintf(fp, "\t}\n\n"); } /* save all downtime */ for(temp_downtime = scheduled_downtime_list; temp_downtime != NULL; temp_downtime = temp_downtime->next) { if(temp_downtime->type == HOST_DOWNTIME) fprintf(fp, "hostdowntime {\n"); else fprintf(fp, "servicedowntime {\n"); fprintf(fp, "\thost_name=%s\n", temp_downtime->host_name); if(temp_downtime->type == SERVICE_DOWNTIME) fprintf(fp, "\tservice_description=%s\n", temp_downtime->service_description); fprintf(fp, "\tdowntime_id=%lu\n", temp_downtime->downtime_id); fprintf(fp, "\tcomment_id=%lu\n", temp_downtime->comment_id); fprintf(fp, "\tentry_time=%llu\n", (unsigned long long)temp_downtime->entry_time); fprintf(fp, "\tstart_time=%llu\n", (unsigned long long)temp_downtime->start_time); fprintf(fp, "\tflex_downtime_start=%llu\n", (unsigned long long)temp_downtime->flex_downtime_start); fprintf(fp, "\tend_time=%llu\n", (unsigned long long)temp_downtime->end_time); fprintf(fp, "\ttriggered_by=%lu\n", temp_downtime->triggered_by); fprintf(fp, "\tfixed=%d\n", temp_downtime->fixed); fprintf(fp, "\tduration=%lu\n", temp_downtime->duration); fprintf(fp, "\tis_in_effect=%d\n", temp_downtime->is_in_effect); fprintf(fp, "\tstart_notification_sent=%d\n", temp_downtime->start_notification_sent); fprintf(fp, "\tauthor=%s\n", temp_downtime->author); fprintf(fp, "\tcomment=%s\n", temp_downtime->comment); fprintf(fp, "\t}\n\n"); } /* reset file permissions */ fchmod(fd, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH); /* flush the file to disk */ fflush(fp); /* fsync the file so that it is completely written out before moving it */ fsync(fd); /* close the temp file */ result = fclose(fp); /* save/close was successful */ if(result == 0) { result = OK; /* move the temp file to the status log (overwrite the old status log) */ if(my_rename(tmp_log, status_file)) { unlink(tmp_log); logit(NSLOG_RUNTIME_ERROR, TRUE, "Error: Unable to update status data file '%s': %s", status_file, strerror(errno)); result = ERROR; } } /* a problem occurred saving the file */ else { result = ERROR; /* remove temp file and log an error */ unlink(tmp_log); logit(NSLOG_RUNTIME_ERROR, TRUE, "Error: Unable to save status file: %s", strerror(errno)); } /* free memory */ my_free(tmp_log); return result; } #endif #ifdef NSCGI /******************************************************************/ /****************** DEFAULT DATA INPUT FUNCTIONS ******************/ /******************************************************************/ /* read all program, host, and service status information */ int xsddefault_read_status_data(const char *status_file_name, int options) { #ifdef NO_MMAP char input[MAX_PLUGIN_OUTPUT_LENGTH] = ""; FILE *fp = NULL; #else char *input = NULL; mmapfile *thefile = NULL; #endif int data_type = XSDDEFAULT_NO_DATA; hoststatus *temp_hoststatus = NULL; servicestatus *temp_servicestatus = NULL; char *var = NULL; char *val = NULL; char *ptr = NULL; /* comment and downtime vars */ unsigned long comment_id = 0; int persistent = FALSE; int expires = FALSE; time_t expire_time = 0L; int entry_type = USER_COMMENT; int source = COMMENTSOURCE_INTERNAL; time_t entry_time = 0L; char *host_name = NULL; char *service_description = NULL; char *author = NULL; char *comment_data = NULL; scheduled_downtime *temp_downtime; unsigned long downtime_id = 0; time_t start_time = 0L; time_t flex_downtime_start = 0L; time_t end_time = 0L; int fixed = FALSE; unsigned long triggered_by = 0; unsigned long duration = 0L; int x = 0; int is_in_effect = FALSE; int start_notification_sent = FALSE; /* initialize some vars */ for(x = 0; x < MAX_CHECK_STATS_TYPES; x++) { program_stats[x][0] = 0; program_stats[x][1] = 0; program_stats[x][2] = 0; } /* open the status file for reading */ #ifdef NO_MMAP if((fp = fopen(status_file_name, "r")) == NULL) return ERROR; #else if((thefile = mmap_fopen(status_file_name)) == NULL) return ERROR; #endif /* Big speedup when reading status.dat in bulk */ defer_downtime_sorting = 1; defer_comment_sorting = 1; /* read all lines in the status file */ while(1) { #ifdef NO_MMAP strcpy(input, ""); if(fgets(input, sizeof(input), fp) == NULL) break; #else /* free memory */ my_free(input); /* read the next line */ if((input = mmap_fgets(thefile)) == NULL) break; #endif strip(input); /* skip blank lines and comments */ if(input[0] == '#' || input[0] == '\x0') continue; else if(!strcmp(input, "info {")) data_type = XSDDEFAULT_INFO_DATA; else if(!strcmp(input, "programstatus {")) data_type = XSDDEFAULT_PROGRAMSTATUS_DATA; else if(!strcmp(input, "hoststatus {")) { data_type = XSDDEFAULT_HOSTSTATUS_DATA; temp_hoststatus = (hoststatus *)calloc(1, sizeof(hoststatus)); } else if(!strcmp(input, "servicestatus {")) { data_type = XSDDEFAULT_SERVICESTATUS_DATA; temp_servicestatus = (servicestatus *)calloc(1, sizeof(servicestatus)); } else if(!strcmp(input, "contactstatus {")) { data_type = XSDDEFAULT_CONTACTSTATUS_DATA; /* unimplemented */ } else if(!strcmp(input, "hostcomment {")) data_type = XSDDEFAULT_HOSTCOMMENT_DATA; else if(!strcmp(input, "servicecomment {")) data_type = XSDDEFAULT_SERVICECOMMENT_DATA; else if(!strcmp(input, "hostdowntime {")) data_type = XSDDEFAULT_HOSTDOWNTIME_DATA; else if(!strcmp(input, "servicedowntime {")) data_type = XSDDEFAULT_SERVICEDOWNTIME_DATA; else if(!strcmp(input, "}")) { switch(data_type) { case XSDDEFAULT_INFO_DATA: break; case XSDDEFAULT_PROGRAMSTATUS_DATA: break; case XSDDEFAULT_HOSTSTATUS_DATA: add_host_status(temp_hoststatus); temp_hoststatus = NULL; break; case XSDDEFAULT_SERVICESTATUS_DATA: add_service_status(temp_servicestatus); temp_servicestatus = NULL; break; case XSDDEFAULT_CONTACTSTATUS_DATA: /* unimplemented */ break; case XSDDEFAULT_HOSTCOMMENT_DATA: case XSDDEFAULT_SERVICECOMMENT_DATA: /* add the comment */ add_comment((data_type == XSDDEFAULT_HOSTCOMMENT_DATA) ? HOST_COMMENT : SERVICE_COMMENT, entry_type, host_name, service_description, entry_time, author, comment_data, comment_id, persistent, expires, expire_time, source); /* free temp memory */ my_free(host_name); my_free(service_description); my_free(author); my_free(comment_data); /* reset defaults */ entry_type = USER_COMMENT; comment_id = 0; source = COMMENTSOURCE_INTERNAL; persistent = FALSE; entry_time = 0L; expires = FALSE; expire_time = 0L; break; case XSDDEFAULT_HOSTDOWNTIME_DATA: case XSDDEFAULT_SERVICEDOWNTIME_DATA: /* add the downtime */ if(data_type == XSDDEFAULT_HOSTDOWNTIME_DATA) { add_host_downtime(host_name, entry_time, author, comment_data, start_time, flex_downtime_start, end_time, fixed, triggered_by, duration, downtime_id, is_in_effect, start_notification_sent); temp_downtime = find_downtime(HOST_DOWNTIME, downtime_id); } else { add_service_downtime(host_name, service_description, entry_time, author, comment_data, start_time, flex_downtime_start, end_time, fixed, triggered_by, duration, downtime_id, is_in_effect, start_notification_sent); temp_downtime = find_downtime(SERVICE_DOWNTIME, downtime_id); } if (temp_downtime) temp_downtime->comment_id = comment_id; /* free temp memory */ my_free(host_name); my_free(service_description); my_free(author); my_free(comment_data); /* reset defaults */ downtime_id = 0; comment_id = 0; entry_time = 0L; start_time = 0L; end_time = 0L; fixed = FALSE; triggered_by = 0; duration = 0L; is_in_effect = FALSE; start_notification_sent = FALSE; break; default: break; } data_type = XSDDEFAULT_NO_DATA; } else if(data_type != XSDDEFAULT_NO_DATA) { var = strtok(input, "="); val = strtok(NULL, "\n"); if(val == NULL) continue; switch(data_type) { case XSDDEFAULT_INFO_DATA: break; case XSDDEFAULT_PROGRAMSTATUS_DATA: /* NOTE: some vars are not read, as they are not used by the CGIs (modified attributes, event handler commands, etc.) */ if(!strcmp(var, "nagios_pid")) nagios_pid = atoi(val); else if(!strcmp(var, "daemon_mode")) daemon_mode = (atoi(val) > 0) ? TRUE : FALSE; else if(!strcmp(var, "program_start")) program_start = strtoul(val, NULL, 10); else if(!strcmp(var, "last_log_rotation")) last_log_rotation = strtoul(val, NULL, 10); else if(!strcmp(var, "enable_notifications")) enable_notifications = (atoi(val) > 0) ? TRUE : FALSE; else if(!strcmp(var, "active_service_checks_enabled")) execute_service_checks = (atoi(val) > 0) ? TRUE : FALSE; else if(!strcmp(var, "passive_service_checks_enabled")) accept_passive_service_checks = (atoi(val) > 0) ? TRUE : FALSE; else if(!strcmp(var, "active_host_checks_enabled")) execute_host_checks = (atoi(val) > 0) ? TRUE : FALSE; else if(!strcmp(var, "passive_host_checks_enabled")) accept_passive_host_checks = (atoi(val) > 0) ? TRUE : FALSE; else if(!strcmp(var, "enable_event_handlers")) enable_event_handlers = (atoi(val) > 0) ? TRUE : FALSE; else if(!strcmp(var, "obsess_over_services")) obsess_over_services = (atoi(val) > 0) ? TRUE : FALSE; else if(!strcmp(var, "obsess_over_hosts")) obsess_over_hosts = (atoi(val) > 0) ? TRUE : FALSE; else if(!strcmp(var, "check_service_freshness")) check_service_freshness = (atoi(val) > 0) ? TRUE : FALSE; else if(!strcmp(var, "check_host_freshness")) check_host_freshness = (atoi(val) > 0) ? TRUE : FALSE; else if(!strcmp(var, "enable_flap_detection")) enable_flap_detection = (atoi(val) > 0) ? TRUE : FALSE; else if(!strcmp(var, "process_performance_data")) process_performance_data = (atoi(val) > 0) ? TRUE : FALSE; else if(strstr(var, "_stats")) { x = -1; if(!strcmp(var, "active_scheduled_host_check_stats")) x = ACTIVE_SCHEDULED_HOST_CHECK_STATS; if(!strcmp(var, "active_ondemand_host_check_stats")) x = ACTIVE_ONDEMAND_HOST_CHECK_STATS; if(!strcmp(var, "passive_host_check_stats")) x = PASSIVE_HOST_CHECK_STATS; if(!strcmp(var, "active_scheduled_service_check_stats")) x = ACTIVE_SCHEDULED_SERVICE_CHECK_STATS; if(!strcmp(var, "active_ondemand_service_check_stats")) x = ACTIVE_ONDEMAND_SERVICE_CHECK_STATS; if(!strcmp(var, "passive_service_check_stats")) x = PASSIVE_SERVICE_CHECK_STATS; if(!strcmp(var, "cached_host_check_stats")) x = ACTIVE_CACHED_HOST_CHECK_STATS; if(!strcmp(var, "cached_service_check_stats")) x = ACTIVE_CACHED_SERVICE_CHECK_STATS; if(!strcmp(var, "external_command_stats")) x = EXTERNAL_COMMAND_STATS; if(!strcmp(var, "parallel_host_check_stats")) x = PARALLEL_HOST_CHECK_STATS; if(!strcmp(var, "serial_host_check_stats")) x = SERIAL_HOST_CHECK_STATS; if(x >= 0) { if((ptr = strtok(val, ","))) { program_stats[x][0] = atoi(ptr); if((ptr = strtok(NULL, ","))) { program_stats[x][1] = atoi(ptr); if((ptr = strtok(NULL, "\n"))) program_stats[x][2] = atoi(ptr); } } } } break; case XSDDEFAULT_HOSTSTATUS_DATA: /* NOTE: some vars are not read, as they are not used by the CGIs (modified attributes, event handler commands, etc.) */ if(temp_hoststatus != NULL) { if(!strcmp(var, "host_name")) temp_hoststatus->host_name = (char *)strdup(val); else if(!strcmp(var, "has_been_checked")) temp_hoststatus->has_been_checked = (atoi(val) > 0) ? TRUE : FALSE; else if(!strcmp(var, "should_be_scheduled")) temp_hoststatus->should_be_scheduled = (atoi(val) > 0) ? TRUE : FALSE; else if(!strcmp(var, "check_execution_time")) temp_hoststatus->execution_time = strtod(val, NULL); else if(!strcmp(var, "check_latency")) temp_hoststatus->latency = strtod(val, NULL); else if(!strcmp(var, "check_type")) temp_hoststatus->check_type = atoi(val); else if(!strcmp(var, "current_state")) temp_hoststatus->status = atoi(val); else if(!strcmp(var, "last_hard_state")) temp_hoststatus->last_hard_state = atoi(val); else if(!strcmp(var, "plugin_output")) { temp_hoststatus->plugin_output = (char *)strdup(val); unescape_newlines(temp_hoststatus->plugin_output); } else if(!strcmp(var, "long_plugin_output")) { temp_hoststatus->long_plugin_output = (char *)strdup(val); unescape_newlines(temp_hoststatus->long_plugin_output); } else if(!strcmp(var, "performance_data")) temp_hoststatus->perf_data = (char *)strdup(val); else if(!strcmp(var, "current_attempt")) temp_hoststatus->current_attempt = atoi(val); else if(!strcmp(var, "max_attempts")) temp_hoststatus->max_attempts = atoi(val); else if(!strcmp(var, "last_check")) temp_hoststatus->last_check = strtoul(val, NULL, 10); else if(!strcmp(var, "next_check")) temp_hoststatus->next_check = strtoul(val, NULL, 10); else if(!strcmp(var, "check_options")) temp_hoststatus->check_options = atoi(val); else if(!strcmp(var, "state_type")) temp_hoststatus->state_type = atoi(val); else if(!strcmp(var, "last_state_change")) temp_hoststatus->last_state_change = strtoul(val, NULL, 10); else if(!strcmp(var, "last_hard_state_change")) temp_hoststatus->last_hard_state_change = strtoul(val, NULL, 10); else if(!strcmp(var, "last_time_up")) temp_hoststatus->last_time_up = strtoul(val, NULL, 10); else if(!strcmp(var, "last_time_down")) temp_hoststatus->last_time_down = strtoul(val, NULL, 10); else if(!strcmp(var, "last_time_unreachable")) temp_hoststatus->last_time_unreachable = strtoul(val, NULL, 10); else if(!strcmp(var, "last_notification")) temp_hoststatus->last_notification = strtoul(val, NULL, 10); else if(!strcmp(var, "next_notification")) temp_hoststatus->next_notification = strtoul(val, NULL, 10); else if(!strcmp(var, "no_more_notifications")) temp_hoststatus->no_more_notifications = (atoi(val) > 0) ? TRUE : FALSE; else if(!strcmp(var, "current_notification_number")) temp_hoststatus->current_notification_number = atoi(val); else if(!strcmp(var, "notifications_enabled")) temp_hoststatus->notifications_enabled = (atoi(val) > 0) ? TRUE : FALSE; else if(!strcmp(var, "problem_has_been_acknowledged")) temp_hoststatus->problem_has_been_acknowledged = (atoi(val) > 0) ? TRUE : FALSE; else if(!strcmp(var, "acknowledgement_type")) temp_hoststatus->acknowledgement_type = atoi(val); else if(!strcmp(var, "active_checks_enabled")) temp_hoststatus->checks_enabled = (atoi(val) > 0) ? TRUE : FALSE; else if(!strcmp(var, "passive_checks_enabled")) temp_hoststatus->accept_passive_checks = (atoi(val) > 0) ? TRUE : FALSE; else if(!strcmp(var, "event_handler_enabled")) temp_hoststatus->event_handler_enabled = (atoi(val) > 0) ? TRUE : FALSE; else if(!strcmp(var, "flap_detection_enabled")) temp_hoststatus->flap_detection_enabled = (atoi(val) > 0) ? TRUE : FALSE; else if(!strcmp(var, "process_performance_data")) temp_hoststatus->process_performance_data = (atoi(val) > 0) ? TRUE : FALSE; else if(!strcmp(var, "obsess_over_host") || !strcmp(var, "obsess")) temp_hoststatus->obsess = (atoi(val) > 0) ? TRUE : FALSE; else if(!strcmp(var, "last_update")) temp_hoststatus->last_update = strtoul(val, NULL, 10); else if(!strcmp(var, "is_flapping")) temp_hoststatus->is_flapping = (atoi(val) > 0) ? TRUE : FALSE; else if(!strcmp(var, "percent_state_change")) temp_hoststatus->percent_state_change = strtod(val, NULL); else if(!strcmp(var, "scheduled_downtime_depth")) { temp_hoststatus->scheduled_downtime_depth = atoi(val); if (temp_hoststatus->scheduled_downtime_depth < 0) temp_hoststatus->scheduled_downtime_depth = 0; } } break; case XSDDEFAULT_SERVICESTATUS_DATA: /* NOTE: some vars are not read, as they are not used by the CGIs (modified attributes, event handler commands, etc.) */ if(temp_servicestatus != NULL) { if(!strcmp(var, "host_name")) temp_servicestatus->host_name = (char *)strdup(val); else if(!strcmp(var, "service_description")) temp_servicestatus->description = (char *)strdup(val); else if(!strcmp(var, "has_been_checked")) temp_servicestatus->has_been_checked = (atoi(val) > 0) ? TRUE : FALSE; else if(!strcmp(var, "should_be_scheduled")) temp_servicestatus->should_be_scheduled = (atoi(val) > 0) ? TRUE : FALSE; else if(!strcmp(var, "check_execution_time")) temp_servicestatus->execution_time = strtod(val, NULL); else if(!strcmp(var, "check_latency")) temp_servicestatus->latency = strtod(val, NULL); else if(!strcmp(var, "check_type")) temp_servicestatus->check_type = atoi(val); else if(!strcmp(var, "current_state")) temp_servicestatus->status = atoi(val); else if(!strcmp(var, "last_hard_state")) temp_servicestatus->last_hard_state = atoi(val); else if(!strcmp(var, "current_attempt")) temp_servicestatus->current_attempt = atoi(val); else if(!strcmp(var, "max_attempts")) temp_servicestatus->max_attempts = atoi(val); else if(!strcmp(var, "state_type")) temp_servicestatus->state_type = atoi(val); else if(!strcmp(var, "last_state_change")) temp_servicestatus->last_state_change = strtoul(val, NULL, 10); else if(!strcmp(var, "last_hard_state_change")) temp_servicestatus->last_hard_state_change = strtoul(val, NULL, 10); else if(!strcmp(var, "last_time_ok")) temp_servicestatus->last_time_ok = strtoul(val, NULL, 10); else if(!strcmp(var, "last_time_warning")) temp_servicestatus->last_time_warning = strtoul(val, NULL, 10); else if(!strcmp(var, "last_time_unknown")) temp_servicestatus->last_time_unknown = strtoul(val, NULL, 10); else if(!strcmp(var, "last_time_critical")) temp_servicestatus->last_time_critical = strtoul(val, NULL, 10); else if(!strcmp(var, "plugin_output")) { temp_servicestatus->plugin_output = (char *)strdup(val); unescape_newlines(temp_servicestatus->plugin_output); } else if(!strcmp(var, "long_plugin_output")) { temp_servicestatus->long_plugin_output = (char *)strdup(val); unescape_newlines(temp_servicestatus->long_plugin_output); } else if(!strcmp(var, "performance_data")) temp_servicestatus->perf_data = (char *)strdup(val); else if(!strcmp(var, "last_check")) temp_servicestatus->last_check = strtoul(val, NULL, 10); else if(!strcmp(var, "next_check")) temp_servicestatus->next_check = strtoul(val, NULL, 10); else if(!strcmp(var, "check_options")) temp_servicestatus->check_options = atoi(val); else if(!strcmp(var, "current_notification_number")) temp_servicestatus->current_notification_number = atoi(val); else if(!strcmp(var, "last_notification")) temp_servicestatus->last_notification = strtoul(val, NULL, 10); else if(!strcmp(var, "next_notification")) temp_servicestatus->next_notification = strtoul(val, NULL, 10); else if(!strcmp(var, "no_more_notifications")) temp_servicestatus->no_more_notifications = (atoi(val) > 0) ? TRUE : FALSE; else if(!strcmp(var, "notifications_enabled")) temp_servicestatus->notifications_enabled = (atoi(val) > 0) ? TRUE : FALSE; else if(!strcmp(var, "active_checks_enabled")) temp_servicestatus->checks_enabled = (atoi(val) > 0) ? TRUE : FALSE; else if(!strcmp(var, "passive_checks_enabled")) temp_servicestatus->accept_passive_checks = (atoi(val) > 0) ? TRUE : FALSE; else if(!strcmp(var, "event_handler_enabled")) temp_servicestatus->event_handler_enabled = (atoi(val) > 0) ? TRUE : FALSE; else if(!strcmp(var, "problem_has_been_acknowledged")) temp_servicestatus->problem_has_been_acknowledged = (atoi(val) > 0) ? TRUE : FALSE; else if(!strcmp(var, "acknowledgement_type")) temp_servicestatus->acknowledgement_type = atoi(val); else if(!strcmp(var, "flap_detection_enabled")) temp_servicestatus->flap_detection_enabled = (atoi(val) > 0) ? TRUE : FALSE; else if(!strcmp(var, "process_performance_data")) temp_servicestatus->process_performance_data = (atoi(val) > 0) ? TRUE : FALSE; else if(!strcmp(var, "obsess_over_service") || !strcmp(var, "obsess")) temp_servicestatus->obsess = (atoi(val) > 0) ? TRUE : FALSE; else if(!strcmp(var, "last_update")) temp_servicestatus->last_update = strtoul(val, NULL, 10); else if(!strcmp(var, "is_flapping")) temp_servicestatus->is_flapping = (atoi(val) > 0) ? TRUE : FALSE; else if(!strcmp(var, "percent_state_change")) temp_servicestatus->percent_state_change = strtod(val, NULL); else if(!strcmp(var, "scheduled_downtime_depth")) { temp_servicestatus->scheduled_downtime_depth = atoi(val); if (temp_servicestatus->scheduled_downtime_depth < 0) temp_servicestatus->scheduled_downtime_depth = 0; } } break; case XSDDEFAULT_CONTACTSTATUS_DATA: /* unimplemented */ break; case XSDDEFAULT_HOSTCOMMENT_DATA: case XSDDEFAULT_SERVICECOMMENT_DATA: if(!strcmp(var, "host_name")) host_name = (char *)strdup(val); else if(!strcmp(var, "service_description")) service_description = (char *)strdup(val); else if(!strcmp(var, "entry_type")) entry_type = atoi(val); else if(!strcmp(var, "comment_id")) comment_id = strtoul(val, NULL, 10); else if(!strcmp(var, "source")) source = atoi(val); else if(!strcmp(var, "persistent")) persistent = (atoi(val) > 0) ? TRUE : FALSE; else if(!strcmp(var, "entry_time")) entry_time = strtoul(val, NULL, 10); else if(!strcmp(var, "expires")) expires = (atoi(val) > 0) ? TRUE : FALSE; else if(!strcmp(var, "expire_time")) expire_time = strtoul(val, NULL, 10); else if(!strcmp(var, "author")) author = (char *)strdup(val); else if(!strcmp(var, "comment_data")) comment_data = (char *)strdup(val); break; case XSDDEFAULT_HOSTDOWNTIME_DATA: case XSDDEFAULT_SERVICEDOWNTIME_DATA: if(!strcmp(var, "host_name")) host_name = (char *)strdup(val); else if(!strcmp(var, "service_description")) service_description = (char *)strdup(val); else if(!strcmp(var, "downtime_id")) downtime_id = strtoul(val, NULL, 10); else if(!strcmp(var, "comment_id")) comment_id = strtoul(val, NULL, 10); else if(!strcmp(var, "entry_time")) entry_time = strtoul(val, NULL, 10); else if(!strcmp(var, "start_time")) start_time = strtoul(val, NULL, 10); else if(!strcmp(var, "flex_downtime_start")) flex_downtime_start = strtoul(val, NULL, 10); else if(!strcmp(var, "end_time")) end_time = strtoul(val, NULL, 10); else if(!strcmp(var, "fixed")) fixed = (atoi(val) > 0) ? TRUE : FALSE; else if(!strcmp(var, "triggered_by")) triggered_by = strtoul(val, NULL, 10); else if(!strcmp(var, "duration")) duration = strtoul(val, NULL, 10); else if(!strcmp(var, "is_in_effect")) is_in_effect = (atoi(val) > 0) ? TRUE : FALSE; else if(!strcmp(var, "start_notification_sent")) start_notification_sent = (atoi(val) > 0) ? TRUE : FALSE; else if(!strcmp(var, "author")) author = (char *)strdup(val); else if(!strcmp(var, "comment")) comment_data = (char *)strdup(val); break; default: break; } } } /* free memory and close the file */ #ifdef NO_MMAP fclose(fp); #else my_free(input); mmap_fclose(thefile); #endif if(sort_downtime() != OK) return ERROR; if(sort_comments() != OK) return ERROR; return OK; } #endif nagios-4.3.4/xdata/xsddefault.h000066400000000000000000000031301314764422400164230ustar00rootroot00000000000000/***************************************************************************** * * XSDDEFAULT.H - Header file for default status data routines * * * License: * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *****************************************************************************/ #ifndef NAGIOS_XSDDEFAULT_H_INCLUDED #define NAGIOS_XSDDEFAULT_H_INCLUDED #ifdef NSCORE int xsddefault_initialize_status_data(const char *); int xsddefault_cleanup_status_data(int); int xsddefault_save_status_data(void); #endif #ifdef NSCGI #define XSDDEFAULT_NO_DATA 0 #define XSDDEFAULT_INFO_DATA 1 #define XSDDEFAULT_PROGRAMSTATUS_DATA 2 #define XSDDEFAULT_HOSTSTATUS_DATA 3 #define XSDDEFAULT_SERVICESTATUS_DATA 4 #define XSDDEFAULT_CONTACTSTATUS_DATA 5 #define XSDDEFAULT_HOSTCOMMENT_DATA 6 #define XSDDEFAULT_SERVICECOMMENT_DATA 7 #define XSDDEFAULT_HOSTDOWNTIME_DATA 8 #define XSDDEFAULT_SERVICEDOWNTIME_DATA 9 int xsddefault_read_status_data(const char *, int); #endif #endif

    *Kƴc|EV[~虐s0!ZOZ_RpĿm'{L3$iGMP=؇1tp?2Wf⯡Z Fl u.I '{b$#$fvߛxAKY[{nNE$۟[eUA hǽ]RFj5{GChmZO иQS-Q0@(P,eꔞq(~Z }䕷IIIjǴMWǵ@%:Ɏ3MV-A{7 5sr:ˬ!u^d]{]bt3? [fC\RY20 5!ROoE- +QHNUi-t\pt[wz>+7v=v̿PK~PK y.F8angular-1.3.9/docs/examples/example-location-html5-mode/PKy.FEangular-1.3.9/docs/examples/example-location-html5-mode/addressBar.js]SN0 )L5T cL p8lYƄiS6rh`7+@ZPrU]{l嬬G9pnS,O[I 4pG F^ ;+G u@׫lf p~SbO?]!/ /Wv8, Rȷ7AyWaVdj4괜[$/<> MpnyG#i|EHXv)+ zi l0F.˖*N_'/eDRo p߅q| !Ĉ۪?1IB E;?3~oH ]Fla_ :),PKBPKy.F>angular-1.3.9/docs/examples/example-location-html5-mode/app.jseSM0WL݀dH^=RZ=(8RW4Bk!of<˦lRST,}BH&qXM uP C{?xz1!ad@x+WJHyzK,Cwa*Pmy:EI=?Qů|~dZ_GeYMsscg{뤇bp,?aSI7vmgG\TF] tp`B"B_ LQYɄۀ罎7HgquQ8rN.pE6fl+wuK-RU"rPK19T1bPKy.FIangular-1.3.9/docs/examples/example-location-html5-mode/index-jquery.htmln lJ Rcc|p'Vڕ ||38٘f62?8Z'aLΘBo_ON iJ3 kַ8 iȑl~__  ޯ vw"u!(0;ԕl8kѩgb.o=N4~*s1+in >8 p6ώ'' e8jU/aiHSC XD `ΚU ). kbIOojsQw$pO-VblCL[F*g z)Q2gvg`z_"4c2g;*0X0e]9kEu嬴HӰ PKPKy.FBangular-1.3.9/docs/examples/example-location-html5-mode/index.htmlTMo ﯠ`sTU0Ƴk h6;ӦId7o731 bNYpǁeaR;!&yBtM=,aukƻp~? Lfbt4!^Ÿ6q%EUg- m*S¸ iy}Ĺ G?=2wݫ 1r[q?V ]v#D&+9ҌNY')}Ol q4n[[I>m$ >!imv$"6IBgh0D334 񊤥pM3X杒 lx(œW!NS6L"FH(&aņZbJw`xQ[#%E.M;!ct`]k[jZRwCPKa\"`PKy.FEangular-1.3.9/docs/examples/example-location-html5-mode/manifest.jsonM10 E"L0]H8:䜯P_ J2Gkϡ0?pMʫaH[hGvi'-o%9X@R](m λOPKujwPKy.FEangular-1.3.9/docs/examples/example-location-html5-mode/protractor.jsN0@3$Kof \kI[ۢsEIPzz{݀%P[; ר=+v\8lY6OH:Ÿi}9na*¬-Y&I"=1*Ix'$5CK 1(%KYVm³1 ^ʢ ,ެȲan Kk^)# .[kF,YҀ&1.LtrD7)3 rV=SKZЗ 9\1K)$5C" al̮}hְpJ[t-2.OmtRT:~@˻ g7Aw7M$"7ԳXVBWPgsJdХTS ᅶ PKKTnPK y.F:angular-1.3.9/docs/examples/example-month-input-directive/PKy.FJangular-1.3.9/docs/examples/example-month-input-directive/index-debug.htmlTo0_q*d/0xB;8ζNu|ID};'|*Mv-BUL@ jPbtJ]ξ|L^>m),݋U `%ѮJj.շH[$Jxu렳e4/蕰鷎 pSAf8*ye,Sd犱} %Án+F4D߬3;n/q/ Y7NPx/.&21GPKNWPKy.FKangular-1.3.9/docs/examples/example-month-input-directive/index-jquery.htmlTn0+քۀ%EM)]!EQ"J)R$8 \;3KO+#ݦEXFPB 5 (rtZ]}=O^>m),?G2fT~ F#P\ "4 r9Tn:{+Q{Md 5FM&uVT^ދ4є*+[Voc6fo+Ur([GE~9y#uud4|hVށ^gm )̓cZ_!o|#, -QJ-WVy(z"s؇t\u lyW X_[a>pcBfxljujsda}~Ė_QKKI!iz]~?cp^f'TMd6<{/qhX\? gPKѪ&PKy.FDangular-1.3.9/docs/examples/example-month-input-directive/index.htmlTMo0 W0B$@l7ed_ء0lbkor/%i}3 HH|.Mv-BU̸_@ }3;PbtJ]ξ|>O^9),݋U `%ѮJj.շȳNw[-sY|W¦Mo+xNos0 @9:^=A7j[b5TFyEpgɩw,ޢҢc |h(JEk~joRWuSaW; ΑJ$Cc,Ȥ/l"c4U+ xbnj$}'qRQy2g`{,q-F=FD76T%Jqz/ю;ܓ2I-OXi#ūŔ?uLo='0>N(Ƞ'j}~9:E;.{42U8""Tה9S)48p;  uy5vl7*?䪍("4ǍQ\p|жxK\v~rC{ˀoR]4yݤJV=d rbIp>ҿRIOI7PK` PKy.FKangular-1.3.9/docs/examples/example-ng-model-cancel-update/index-debug.htmln S)k*¾DK{h1]ǵV6U/m-c7?XNGdڍF}# @շ9aR"F<>Wi&Ҙ w? BX*&ף{걛.h5Onv[(f{KJ6[yGKnd]e2; я/M1ߞKo h3h(9m"BTB5+7",ZXLtufv]$xB֞nH k% &PAz|]Ԋ,FjrVM؈i=s>FN_ \2%ۘ`:F\d\W!.!bAؘXMtPg+ǣ?9;އ# $ͧ߫Sǁ)PKLPKy.FLangular-1.3.9/docs/examples/example-ng-model-cancel-update/index-jquery.htmlSn0 +8@ۃm})Z`;+2%MA}f #$'Z~NGdF]+ @w+9aR"VcXdS` Q'AzhSlJIuUqQ?EɦeF?g+%0lzq2[񻜣bE?pv6g VdYi>,@vёP遢S Ҡ!dKY@14~@ 26fۜ] @6mn09&-C@L*PBYc`Q+g#0B[&jVL-/|8~p5|glFxqdVqjmYjĭsI"vVmL ^n _h.ij6VWNܜ#`H6І)%PKhlLŀN\d:^_4^DQq.9rP.]%b׻mƔ7 Xsw/M}{z su9&ͱ<PKoQPKy.FEangular-1.3.9/docs/examples/example-ng-model-cancel-update/index.htmln S)Sa_D=4I,]ǵV6U/m-˃aoz4n#ـQv 'P@NAGZ4&5yPQez4VV}ʦS䆣OnE]7QF[MqF(p`ٍl ܺ~B!VFR@Kn1Zq3y!@ <-Y?+"A% nfҋˀV72=[3p]. υg@$ͅ5 mq Q> >`Y.jEk#5sa&lŴӏˎ9Fgc+'/.ۘvm~~qyRfƫWbsOܖqwmacbW6]9؆&Nq7 8o>=!5|\ :6|HKPK$>|PKy.FHangular-1.3.9/docs/examples/example-ng-model-cancel-update/manifest.jsonA }Y*bЩ T7zL0 $\%둽N`Uųf@[,/DwTP PKFa\jPK y.F7angular-1.3.9/docs/examples/example-ngChange-directive/PKy.FGangular-1.3.9/docs/examples/example-ngChange-directive/index-debug.htmlSMo0 +hR:`iRjiP(j$$lCrslv D*˘d6ixFBKu&f+Ӂ֍@]r#" Jcn=Eu%ŷc{؉T-KxJl7xTLGe6MHut8inU ϮgO ̕4Z z>֗-=jm'ZJ]ƇSOྉ59b|vyȂnփIxwvT q[0ԁY,rJn+]c'EsAUvrc w#H3UN%KhN%ʄgz`Lү9{:]ns>[R1yOA+]xhXrkGHJro-K"ܝ.Et9<6&J`I4ࡕ9W[iMOouN;5tZL!pzJ 7!eE=@Ug<:/'37|x8I7Ϡ]LyB^/ jY\7FF]gsX7cX%F"]acV,q*#sQse%eS7#-aP:G1TƾPK'qPKy.FLangular-1.3.9/docs/examples/example-ngChange-directive/index-production.htmlSMo0 WpB$hmݥ@e_lbedr"% (~<>>Qrmx7J]в@1Hhҏ*:e?0[۠_S `A!ۊq.XvuDzu}qd?V>.׶<lBרx!vjaqGkI4sv}*9D-*;5O{=,@F6h`'XMϑY 2kBfH2LbZ&Jib^zwY[xܰxPKk^PKy.FAangular-1.3.9/docs/examples/example-ngChange-directive/index.htmlSn0 ^4 kqD ھ`;M@4P}NCA0.*յ{~S L5U*qMP3\d#^ˡAϏTp)yU+0D,$K'wȓ%3Ac˔q*q%uݰ'{yֈ'/8Dy]Q`;k*'ZMI .v(v2>i-)?6uPFOBf ^ |TZHyqSR,q!g܅[M4l\ȝx㐺neiaS=T3z-mO sLH2),I ~Wh>@kct\Gf' evC=ϧ:vÂQ/~MW(T'wsPKO9N,PKy.FDangular-1.3.9/docs/examples/example-ngChange-directive/manifest.json1 W cA Аi$QvPPжp! [Cp1î(-_u+ƶ\^x^PK _mPKy.FDangular-1.3.9/docs/examples/example-ngChange-directive/protractor.jsAN0 E=wI$#V\ Z(uJUŰ`Do\*, 0,{o;bOڧʘs3WcWM{#nHTm,Vd@q(1Pn+sa&|SwvRmࣁu=KP^pmL+9XbUp^ ;^">t^pz:_ln\p??p1"n궙|PK ;PK y.F1angular-1.3.9/docs/examples/example-ngController/PKy.F7angular-1.3.9/docs/examples/example-ngController/app.jsuj0~$CMh ^ Mo!aolY2߽-'l]m#S[*Iu 4X]$Q(Je@JR%VB~?HfĮ]JR,_x!7}τ`'Q40M hcL >T!aUKLz$Zkw pI]()v\4 %igJx).gÌy>?S:'-l6׈yah lѡu/2?4G=u(SjzT zkR; V_bȰJq-鄢aek-dQ:suEQӽV{6PKq(aPKy.FAangular-1.3.9/docs/examples/example-ngController/index-debug.html}SMo ﯘrJ^|c/mHUzI1 W?3@6QIJǼ7xꃍSyLDzqxo¬hP w߿ )Nl6|C{̃6+ٰ1sKS~5 ^r!m@- K/Ѣ"DHc_ZM3b(:QҌSrp=3ki};1L ЧXbj:dZ/0NSq1*W=͋8.ԟZR=?ߺ1|7̙<|ӎxթdUf?6O~\nvJ.Ǝo0>emj\%7JE-PK+s[PKy.FBangular-1.3.9/docs/examples/example-ngController/index-jquery.html}Sn WL9%*_K[RS/)jWwƐMmbY<ͼyջ1rJ2axo¤Ќ@X ؽ -|>PǣG ] %G1wOV'%+h;.6T`V80EVJw_?-bPҶ( _oMJSx0už{iGw7Rd,LyAk KqaZ^ܸٸf[P.@Dz8"DHn(??2bz/mz[nf (X^Ƅ2 .@ے)FAzzqҘaH{8o9}ˏgf w9֣wūF%lUSf/_NfPu:1U<%"wwPKelڮPKy.FFangular-1.3.9/docs/examples/example-ngController/index-production.html}SMo00>Cbs3dKJxflﶢ-cޛyƑohCv(M;I s:,CtzvIE3sy[c`x>9`rC9CqL1HH}5٦lBy\b\dD_U|\Żx{9ކIzX @wR>,,"7WὭlO. p~9QъRlXWgIVxs|gppA0!/[goŗ Pnn)R6p ?,ː@H&B oѱ )!鐑^a4&1<:ײ֍^1śNE5Yy >9{sىoj =ϗ,XO}L+F |HЛ{PKqHPKy.F;angular-1.3.9/docs/examples/example-ngController/index.html}SMO$!ϯI<}1z&&=`wmJɘ p4~u:ޫzk c~ۼaxgzhaƭI+f-n3S p<%::?_SpE s1٘aM}/OUwΤ~\Šd*&ONQUaz?wbangular-1.3.9/docs/examples/example-ngController/manifest.json51 0 Sz q(&%FĻU9)fp\- #sB؍&8CQSjO1l_T,hCu?PK$u`uPKy.F>angular-1.3.9/docs/examples/example-ngController/protractor.jsSj0)r2a ¶]n{mf驫ju-Ȱw!;jH"M@o[ تtw"a#v {e [0#K =T$-hqgDS;Ckg"4˒@e_g2쏄V z-(bvMX&f\#GSK#Fha,ɹ#=Q~+sƏl6t2 c! Y$R!qm*qB1Vmވ ۶˙Vp"tR/6MO[K)4zK?Υ?PKy'FPK y.F3angular-1.3.9/docs/examples/example-ngControllerAs/PKy.F9angular-1.3.9/docs/examples/example-ngControllerAs/app.jsMk0 b;PRV .u҃Iñ>9MF+Y+tK)Ea p̓4%VQhoR>-j%+ُH\x/u^ &^i $tztLJ#ܼRüIq<~W uit\sՄ=f3HɔQTrsѓ8eeQt&f#wqxGU< }#n\Ivvac3WXQ|tݶ܂Թ"i &\)ߌԷfaG׿0(K ~M b >J PKPa<PKy.FCangular-1.3.9/docs/examples/example-ngControllerAs/index-debug.htmlS0+:m,,c/mPzPYG]YЏdCc6+YєuJ6fX4өQ ):7)Y%}0/玐4UG9N y)9[?}YQ…^q")%t8{OX!4> VuvzB 1߽c(G={vr=Y09q/b#wK鹍 C61G%W:E[9ͲԹUgGfwˮɡNA0פz%-Ϗ:txK6LGz諍(Sn#/|uy-?_PK}kApPKy.FDangular-1.3.9/docs/examples/example-ngControllerAs/index-jquery.htmlS0+:mHOe e =u%UCHJ641Y{O3t 4~x tP@͘4 ;LHL>9X|5nz.Eo-OKgxTa2D,qDJz?ХEJݶ:i_+YhkVh(YV~<Bvbv[ Hm`+_0%Ք-ͼ k )k~Dۉu-J.NS~_ ދ>({cr5zHJQpj w.kEfph@īVHmaC2aG)+YgUbgm|>|[V*kV[v u|(MU 2//yԿ7\8=^|/5g[qCp>QV]C|F6ކY# ͕u6dN(u;<ؒ^ZK~/ ȂJ|x(3dS\K =a~ b ۭΚ?W9!rZ(~mLydv'+AaE,%Pkn!oBzc91GJsu X9eY\UgGp*]^Yzjޭd^-yԿ7\O#hN x>t#=[l$Zq~Zk䅟.OPKLPKy.F=angular-1.3.9/docs/examples/example-ngControllerAs/index.htmlS0 W>m,N,P(=hmƭc3B? ;ӓcaϑ`W7,/"$@8;RF6ʃS hx5::<Sp҇㌝dmS1ÖA/=8Lj}kSV\g`B3 6a~tt% g{;3 'щP2/; ؈.Tq{0CqtPNpa&73UZaiP+䒈[58OJ)ߋc"!OI`X۷[2dAׄ6H/m\`bq<ݾ9hݿPKybwPKy.F@angular-1.3.9/docs/examples/example-ngControllerAs/protractor.jsSN0)ݺD KJw`u]K31(H4˭we.@(+֐Z[X5Fyʄ 厫e ?¶,%xu=Tm A)܈5#Sˆe[x>g[xY`JVyz Efu3(L(GrDYquIdzSX=q%upNqݍa6d:YҵC9ra[Nie7lNJŦVbM7I( Zim\|T-|oPK xgMPK y.F5angular-1.3.9/docs/examples/example-ngList-directive/PK y.F>angular-1.3.9/docs/examples/example-ngList-directive-newlines/PKy.FNangular-1.3.9/docs/examples/example-ngList-directive-newlines/index-debug.html-PAn! +\**I{q61[?eKASv <Y0@'$ՆdS~oPvsvD f2_D2o ;Z>b1m:1j}1:Z_XV9[,])F98<}P$%y=~lyđ)[$)2e4 r_ 9U"_>8ꖹR@PK=i0PKy.FEangular-1.3.9/docs/examples/example-ngList-directive/index-debug.htmlSAN0$W\*qB'Y S{*BdgwfvH<}qeDz'E BV[޵ aLe:xR(^Ŵ[J -pEArwͭ*Jo2z]G$C2|)\ Ը)ch?215h&~R)5d(Gs N2oVr㬜3.|x!xgQ.sXCpc]hʑ>;geeҵtrtr8oO>w6ݹ %ėB]Ik~JPK}JsZPKy.FJangular-1.3.9/docs/examples/example-ngList-directive/index-production.htmlSMO!WLׅ/ư{161d]%jc߅a֦f͛VnZر%ҒH1t3ndЯD2i\x$ޅZB;>A'n䭳բ\>+'o cb-ܨ*ĘVȲa%ׇ35u$g $ޟ$3|رə-Y4TV[))8ehɔ~aaq~  RQJouG/,ZĘ/&0/A &B (q"g2 S|Iu>[ՀEAx0xDDE8;fᬼ-Xy+e PK 6|GPKy.F?angular-1.3.9/docs/examples/example-ngList-directive/index.htmlSN0+6Vqٹ *!qBcZ#?N"ٝO֎^`V0­9Q0!㲻H:5ܾ ;^ԍ:(N"3)( 9O5"P}d`} 1MEa}V~܃[wɉVf_Rһ1*p2o>KH,gݴM3ĻR@ Ge8*luYI8FĘcō;_tzR@`#r*/wcN? llN="R:6/,~?ܶO#s֗[/y_JY/PK[PKy.FBangular-1.3.9/docs/examples/example-ngList-directive/manifest.json5 ;S511n1~}z )U4 \&d:#V XTԂ*K(~?Gs׿Q1Ri#yPKLGdyPKy.FBangular-1.3.9/docs/examples/example-ngList-directive/protractor.jsJ0}P.UIIQ|wӈ]ₗ@_o2H쎁HMy VpT"ojlr0o|R-~.dXM,.FP ɏV3L|Fcac0Б(3Iv> 'c|>),S*&e?Pa㳲#MJY$s=K9Y YkgJfK΂ Lz.F@)p,qmk?RPKw PK y.F9angular-1.3.9/docs/examples/example-ngMessages-directive/PKy.FIangular-1.3.9/docs/examples/example-ngMessages-directive/index-debug.html}TMo0 Wp(l  ÀÎ Jrdk$|#eA6LBjV,-j$rѬjdPl\ ̻t?{ޡ/tyRv͘^%:9IUF]a4.E2,S9/&R@3b>0R*h:j8Mad>'׸.UŇXFl}l]M i}myTLUMd' Klk+c<Mn: &z٬U1Lvts ٞI3u!xztssWj+PZ:Qh+?.ϟ\8G"*07jpTzJuP#{o <=13$28*/9 0(Yku7;kHg/jJv! GNFzQfƻ !X .\D/꽇VwJ}0&"t'/PKܭPKy.FJangular-1.3.9/docs/examples/example-ngMessages-directive/index-jquery.htmlTMo0 Wp€l ÀÎ JrdmtfD=a0]Ъ^M[4$z4MǝP_7菎 z}W`^}!&=hE"Q>wMEʒƷM4CRZ[kI5knăv#خJjc8o ČWPZlP7k?rYpCG]H2.{j*$Km5 "CO{lJԌ92};5? =g=Hϒ̓3@NN;iw.ߺ\?P9QrH%i>njYF :a||=Z;=DPKGqPKy.FCangular-1.3.9/docs/examples/example-ngMessages-directive/index.html}TMo0 Wpl ÀÎ Irdm$|eA6LBjV,-j$rѬj2(l6GP]i=ЗB:l< 9:V ['޵5*ߘ}TUZjIh]B2,S9/(IR@3bn`)j4aӦ0lxk\IÀF_ >pW>4Wʶ#bӕ1SM?L>u]Mt?Y-fc:F=fa;2W9렆xx|d4g!IepU^raRQ*n4w֦ˑg/jJv! GNFqs3eHZu"zQ={6I#PK#PKy.FFangular-1.3.9/docs/examples/example-ngMessages-directive/manifest.json 0EѽUY +}PK1/PKy.FKangular-1.3.9/docs/examples/example-ngModel-getter-setter/index-jquery.html}RMO0 WVㄦnp~@֚SE;$U%'{xNsՇNaOkWpFW@۷+fBmz};sFr>,'УaLsx_0sH0ΨGOs](ZW:̪mB]Ix? M B?hFUyӜ.:㇀)0u - Шeƴkń4sUEnE뛼^"bD>}PK:JrPKy.FOangular-1.3.9/docs/examples/example-ngModel-getter-setter/index-production.htmlmRMO0 WF˄^YkLRMT zqb???PP7OJ@=a0tXx{5[Sbg%>a=4#| )&YdEoy{ոj1in"l?}PKkR_PKy.FDangular-1.3.9/docs/examples/example-ngModel-getter-setter/index.htmlmRN0 +LNph{E|@5Ey)uѮP%*9QG$y74Z 8FaPrv,'$^= Ldz!ԆSеG$ܲ+1ω`ɣQ]חǯϡXԠJ+ mt_}C.-3N^ߺ4 irtQW2cG? ̗;K!QgRT %ڰmL4ǰEv@yEVЗ|zXN) &KO0vA0mޕEq"R$>PKΛ>0-PKy.FGangular-1.3.9/docs/examples/example-ngModel-getter-setter/manifest.jsonM ὧY ZHNfN Dwor=&*%[ !VllWN,vUjN>'}R CiJWx?PKH\iPK y.FBangular-1.3.9/docs/examples/example-ngModelOptions-directive-blur/PKy.FHangular-1.3.9/docs/examples/example-ngModelOptions-directive-blur/app.jsE?k0whRc*_, ߽';Q'w%;woZx4"GItSR%)TdIޥ୥ S~i&Z9ҵmHO`J>sWUHk͎,; [dVcyZ Bk"98.'PK<`PKy.FSangular-1.3.9/docs/examples/example-ngModelOptions-directive-blur/index-jquery.html}RN0 +L488fH&Ŀc7 _S]4ޤC@ؤ֓XJ'UIcRi!o)O&^w"H'7h!i#Pmx\M<MlC>%.x.e.7ŬŶuU沱s"!= MM2P|sTg]GيqxVF؁*19cɍօ!G$N*&FCs;;k^WK7)e ?K^0XA{u;ĵV2m0QcOXHkɎ kd.EЎZלSИ~<&PKyyPKy.FWangular-1.3.9/docs/examples/example-ngModelOptions-directive-blur/index-production.htmluRn0 +BnPR/E{ks~,q$Hr/igٗEG/6zJ:~qè ԶtV fs۷Tz쟎zJ\0D~4e4C'W0_1٥ %%{}lG:Қ8-9P$ :{E޶ws;;-^N!!qquC{J돿R+{=sLǥJd U\t0L,0CNܕe֛J| p\Ï?[4XA wC7`[w}:^VY&%| iTb1msN<-%=);Dc PhV53_+Suƭ5%oxHޠ|-ielP+?BZvdILز'P֨=x%&7~PK0=`PKy.FOangular-1.3.9/docs/examples/example-ngModelOptions-directive-blur/manifest.json5A0 }E3ChLkĖJE83BlB<[B|tCn=T ߐj< 77Gl$eu۸Xg_O.XPK\"oPKy.FOangular-1.3.9/docs/examples/example-ngModelOptions-directive-blur/protractor.jsj0D  JK!%EdɕVvLɿWV&zf43O#xֻ [14أ%QϲֶѶ<B,1"ݪ?iu6@-4 :M71 ޣU%,ر hdNv"~@E"-I$W}D0)5wZ/هw=;cjPi &":'N[',[D^בPq H8ov]ʝ|C# 6؟Co&l_PK8hWPK y.FFangular-1.3.9/docs/examples/example-ngModelOptions-directive-debounce/PKy.FLangular-1.3.9/docs/examples/example-ngModelOptions-directive-debounce/app.js=K 0 D9P|JOQ0[!)wM,53'd$ }7A`b MR;<7">W3^L).<^vOv+~jp L(]biE?PKEPKy.FVangular-1.3.9/docs/examples/example-ngModelOptions-directive-debounce/index-debug.htmlmRMO zhތB/FoES:(B1wg`Mi21O_I(^_ ӌYp7=ES7WaDw ~nFd͈CX)e#*@R+M1Üm՗ ZN,zUJ1eXr%څ~SP ^{ &s?W^O2c\)R/%WoYd0MS!߉V[o+ߣ@3t+5b1`Mhו<%Ō#H%:oRq1Lrpmq(,ʇNUV7R)[-1ŀLmM?M4T[Ӗ>+y߳MJJuVSXq qC{Z񋷣ʼy`Fb0_3*Kp!xEZ|)CBc*=TwWq-^6`^ᯀH3.n7l7[g<>9HtMVmUTkղe_)c@2Kޅ^3A8BK\PKbhͅPKy.F[angular-1.3.9/docs/examples/example-ngModelOptions-directive-debounce/index-production.htmlmRn0 +X!@]T$[ۥ.ˬ, ^PKJ ->=>RmyIeNqo¬ 4ӰP ߿wׄP\8͒U\_^VllsP дdtGBKasp/PK.PKy.FPangular-1.3.9/docs/examples/example-ngModelOptions-directive-debounce/index.htmlmRN0 +L487I/n$JS`B;v3`T=ّG}0y6ypBrZ P@5N#f%ns 6;lBX* =mcۄ&Wz ʦRM1ØuݔZN`}2V66KfB6ŃBD(m.Nzʸ >&%Qa>4*1nwdɏqU"{L3*k/^Wyg >4<8k].lfdI ON/Y\-rlJVvȆ ۟PĨg / BKaspPKjPKy.FSangular-1.3.9/docs/examples/example-ngModelOptions-directive-debounce/manifest.jsonA0 }E3C(q&E*8c49T,#||.U[dY1uy#2u tmOhE{uq%Kl|5>|PKkw*guPK y.FKangular-1.3.9/docs/examples/example-ngModelOptions-directive-getter-setter/PKy.FQangular-1.3.9/docs/examples/example-ngModelOptions-directive-getter-setter/app.jsEP 0+ $ţv@) 71!3;@זG0Kx"8Y^4ŏzR<{=T?k\8Y<[cJ2r❑l T 7R=ĎbeYqRTIYw˒&v rv\:nJt-b*娩c5_PKMPKy.F[angular-1.3.9/docs/examples/example-ngModelOptions-directive-getter-setter/index-debug.htmlmRAN0OpprEU 7<ȱ-ǩZ!ή]HEZgg<;;Jc˜/g74=pOJ@m1k:-x{ 6;zA֓S0^b/؄c'Iu껪Bz k.c1ÒF%ڶ/ZN"`1!dwu$DZ\W[{b|N9LJ\Ve~43*.Ygjh6-d}\3pJdi?@w- =a#f`Ut|)CCNѻOআJ_K瑫 90i.Go-F%o2?|X ] L{M %2x4QhLlulY_uJ| %@$XN!bMMP7^)HN#q,?7PKA \pPKy.FUangular-1.3.9/docs/examples/example-ngModelOptions-directive-getter-setter/index.htmlmRN0 +LNph{ES b7|@֚.(Mԝ6!;P%*9{~݌aKD8I+Jhƾf$ѤI}}8dax6st5`~z #H6m 0լákK=+U F% Z5M[>gu&5-[abC٪k"!SL$yeў4O)8I+*̏ffFӞ3楬+ԦBh*ӄʇb\lD_Y`( O+#[LːY4~Mۻl1}Ob~.?PKZ:>PKy.FXangular-1.3.9/docs/examples/example-ngModelOptions-directive-getter-setter/manifest.jsonA0 }E3,%(qĠJ>@+[Z^ZBYr)w-+yC㫃cZϨ:y?PKjOizPK y.F6angular-1.3.9/docs/examples/example-ngValue-directive/PKy.FFangular-1.3.9/docs/examples/example-ngValue-directive/index-debug.htmlmS]0 } -, ܧkgc`>x8vpܒ>)nzK7,Hȶ|:N=B;[m$jwR`aķ_@4bz&+wڎ7&`͙,<'Y&A7 `C(2}D`:Q2p3FldHɃo&p\gnve`fwk´ڻٵا3C{$8:6yvpI5paz >>MQ}0?ܡ`&3P}x2S5u fɏ#MLKZ}@%Y,Q˅w*3nqA7Ƌ5鴨 Z%XU'i9D1j;*剠rѷdcO?;,Ko@?U`_{t@yViOq̴Gԑဒ~xbuz_#n2 0lek*ӢmQ O?E?K2HOxW{o⭺?Hgz$w:W1>TraPKro@PKy.FCangular-1.3.9/docs/examples/example-ngValue-directive/manifest.json; 0SMAlbIVG>j93oA &'G23FLڋ`fv 62hQ%\׌Ƭ|XPKu_lPKy.FCangular-1.3.9/docs/examples/example-ngValue-directive/protractor.js 0 {ܚWj`-:]r|7?` #Q<\܁fit0nxL9>L TS4+h$hZй~Z=uvIԳ! 2q[RT@Ƃ*Ku{F8c yX}g \[".5{grPK#ܳ=PK y.F5angular-1.3.9/docs/examples/example-ngView-directive/PKy.FCangular-1.3.9/docs/examples/example-ngView-directive/animations.cssMN09Y #Hi2k[4)Hy#h/u׵xdv3fӧ`՛W$32Kw-$_Q:=VY]d%RjO! eAV=_TKUʷ.C+'PKa-PKy.F>angular-1.3.9/docs/examples/example-ngView-directive/book.htmlI,RPH+)I-RNKMI*Rp)x s@J=SlAPKCVPKy.FAangular-1.3.9/docs/examples/example-ngView-directive/chapter.htmlI,RPH+)I-RNH,(I-KMI*R)rVLAVQX[LAR 1j \6 PK5SPKy.FEangular-1.3.9/docs/examples/example-ngView-directive/index-debug.htmlTQk0~ >N:k~oY2tYnuI؇>;Y C .O$}S 0T\'ֿ"AZ_Bgn'' +){< jЄylنpp Wp>M5Ξ{v.V {J15LQ9Q4re:;<{4U&85_Akiu1Z L]XWv5R@~Ոӄ:g3Oj">q(7!# cZN!#\9Q&; 1Oo9FCz4.jܦwX+=?<LY <`LPˋه5F1LQfV?ʪơ  E"U7fj i!4\yϙC]pF * :kSse44e>_'_G6nBЙ}Wr_`5>S~#ְ}b~7c{ 4O X}3*0CS͟gr >X{ǮS٫\[50 &*Ԍ3QFTץH}%Yeq:)5Wl) jИ4Z4 L ;v#r% :fb Oj_)}PlAx!= ^N!#\:Q&; 5OTo9F]:2CPXqajYnniV b#3;G-0^ 2^ j8h^ޭ}'5>0&_Ό/;PKBR\1(PKy.FJangular-1.3.9/docs/examples/example-ngView-directive/index-production.htmlTQo0~߯0R[Ī4 m059wnh㋳1F^ॹlVa葵呤`ᴀPG1Cv1TX^BkdepazCkH kenX{({0h-bNZAPmDr̻BnF#*rn\Zwhpk/)#m? Μ?I8S躆-$(/c^9jЄy4̆ppgp>#M=趱3픩.׶;Zbjƙ(#;jcWH+[4Yܩl /kteMpVkte΃ Zq>)`0tT-WNcIJ\NR-'ݨh&$.jܦwX+?KAvDa6Α7^ǖ8X[:(s| MI)șPK1^<cPKy.F?angular-1.3.9/docs/examples/example-ngView-directive/index.htmlTQk0~ #>N:k~oY2tYnuI؇;Y}N$}*9ZN uu˜l1S 7ןS>%;h;l0Gsq7GHm׬`u Q; gMC 1rF+yĻ(@5OH#(ȂW%/ _ ,E ;}1n?9yﯰroa 1m&6+y-\װ -N'd6+\BHnwlmvqj0 66)Ԅ3Q%}#!]Sg!sQ-;cЗ ]Do֦x.S7vZ\e+zKu T#N3-# R<ƾ܂#ώ+&j5 ƈrE5XMPB(8;CR+Џ~˱o:DNaAUCc/73V{w< 13F,b&YG(@/!H4?PK|PKy.FBangular-1.3.9/docs/examples/example-ngView-directive/protractor.js1O0bK4UV,tD'؀r. }j=7 `hI=S~S"GF^`,Of{هn#Vv]g2re w nzR1fDmAuKfJ?Jig?cw"̔#&_^gċΟDžlPKJAPKy.F>angular-1.3.9/docs/examples/example-ngView-directive/script.jsT=k0+DH`O]b:C@(KJ,*KABÎ#߽{1627\IBT7B75C<78B*TFܽs>j/ D^Uc + /10%[#<L[T T kYWkkPGcI[2IpW:K1 oZ40Z 4@,kEhpOp璠4/y^ҽapn dCYڵ|Xg<\YxS|iUk> ?nJ^'j纯˦1s+xd:EV L:Wr{>#{#d@t,:ĤPm2?PKy͆C}FPK y.F;angular-1.3.9/docs/examples/example-number-input-directive/PKy.FKangular-1.3.9/docs/examples/example-number-input-directive/index-debug.htmlSMo0ﯘV]$R;D= 8`;h;qҲ-P5d{͛ex{eɠd[/QQBs>(طW#vQ4VPʻf|~EyN {^e#4#VUQŠ/V*_Ib\{/d cNZGg\;hY]^7[d(gwZ+YO\Lz+rv-[ ;޽$f{gQyV%9^ၥ\LuM s@|!:LXiH DtV ₁W?W{襅Fp$w(%\$ĵĤ&浔Qᵋt-d1sǑvZWyXcw`eYX[&*܌W9,8G 2(Nǜ3^eq|k=B`('+|2i W˓wvMecMpV)t.=n0TkVٲCIA*9+>wi0R`zM@ux)BKGQ _:>3g` ><:%rκwDLESp eĚhBOܨ %] +pT!GP:y"3:IN?G/βf_"NR#7?EU1 o-~PK=PKy.FPangular-1.3.9/docs/examples/example-number-input-directive/index-production.html=o0w3a1PM$ h E;heC%Ԇ#)%uԋȣޝkWF3,I%zAEA~b?鵂 TYUv0kCΫ&vk\:YIE,B>B ɝӍsd8cLwPᠥvIӫiOMg.BK |Yq׮=T)Gsx5(X7~dfwZ+YB"4W|l~Q"+8f@G.O4Js I^J@uxnOy$а҂d-dԗ? o WoK !y|F1I&ȧtJ2>9FREF;t-c^N8kpǺy]P-c{_fn-d7_9_TY1YR35PKM%*PKy.FEangular-1.3.9/docs/examples/example-number-input-directive/index.htmlSn0+ք@$=5 Ks(S-1 >TJc.RR'i Hrfg5+GO hiS%mFE ^`߾^яEZA* ;Eg!mU{ū|7e?hKG`5/ʺεw{rII{tf}ry}o P6FV~>=*4W,&&[0@>R pIϢ4J0sK< JJ{ s@|!:Z#-lҗ>` 9~حK !@x6R -,{z4⯤~BA ~Ÿm,Pv}ݖ)O 1LL LiT{[^'VMVUuHĬkyJu;#0nK1M Gf%I D79k\%|X/@՛[5e>>Baqz3!-7HMq"+8D '*m,4PtzWB Q d^y{]fBel-1V7dʩ]1vQ ذaKLza a$HnXlATBixg8 '!?L &g-޷8'<:34ͅf/#5;Pdx]cޛ 7˪PK};PKy.FKangular-1.3.9/docs/examples/example-radio-input-directive/index-jquery.htmlSk0~_q'Pۤ`6ھa}(%q%OB}iSBa%}ߵqazYOj]1Th h6Xtq8\$7E?H0r#NFuOohv(OG)p5rWDwaޤm; -?U$PV,b*0-)C'N$S ?D &/ZlVS"/YT7F8XQX> piWHSp*rQP,ë PKMOPKy.FOangular-1.3.9/docs/examples/example-radio-input-directive/index-production.htmlSMk0ﯘw!HBhlZz(M/%="[FC>6ɣx~iTt ^J}pd>N@ƢݏTp)mup)Ԫb7h hXt2D~rI>~9`\\ީatyl\w݈fDa i*V%ݍP9[Ɛcq^MqkYH"1JaNN^nVyaD^!?":B`y`]ýV$׈CJCM\:OpZmz{jYV' 5cOQ DCt33I@+D~M>!#ot?|?~gx8gvlsUKƹt)P0{ẅoPK2ZmPKy.FCangular-1.3.9/docs/examples/example-text-input-directive/index.htmlTn0+ƄA%]%H^`$VA*I1{gHډ`H,Y,>oMU=%bR32H3K/ 뤯o7Gw^Q􃒐Gwz}vV6{ј7\nlS(G%lwXFl5eTM0T>]=`M;*^g hoR.wu2Q`p$ףҌ^F  (.ϝ;c[t?o2VXQ>_ۃXF?+_;'a@B7TəRG_;#\Vq-I+4AhhpwZcۚݱ"-`!Kžc3)2MZF ibDwޖq} TG37%g/^F_2Λ($EQxIn ߊ?PK,hx;PKy.FFangular-1.3.9/docs/examples/example-text-input-directive/manifest.jsonK н ] *k!1rfܓRlDXఱԌ5Y{.;lBW )y컠1RFZǹyPK)y_oPKy.FFangular-1.3.9/docs/examples/example-text-input-directive/protractor.jsj0 y aJOcpb%'ػqƚR: }>i#0z\7 ^%%US&mFW+: MXx OLy(x.)xӀ-ů/9<Ϛ}˜wgXݠyL_me>ku֢e"zsb|~~O۹6!ec?hmX\cnžPKoaPK y.F9angular-1.3.9/docs/examples/example-time-input-directive/PKy.FIangular-1.3.9/docs/examples/example-time-input-directive/index-debug.htmlTQo0~W U0^iڞ> l'sRD;ۤnI;wwN NU/(a6aށBzF' ۠dAtJpAZ!$RcRu,-DY–iih,|˳+_Wrfg<ҞPdp4-r8oc"RhGw' MQHǻP5E^x|:Z3Z&p5'kƃ*5Ww٥0 H/YjOe ,a$\za"gƠ48~\2!? g0k(p[)˦aKtNi)8;ϖϒF_ MCll]׀4H6Vb'>uֿ3QR^P;|8cZ¹ #qT'q]9ƞÃ!iRl,4y_3C2=d~PKu-/tPKy.FJangular-1.3.9/docs/examples/example-time-input-directive/index-jquery.htmlTo0~8,$@" L`,˶{i{`kI"M(S'Md}]K]mRm *˼J57 ڌ~-.leBN$F[Vݷhi( TVe*$!$zIE#h7g]^jJ[P댹Te+p4p? q5Z4Gnó MkMHF3 fE 8|:Z3Zo'p1'ki?h#AqK2cw,,cotZ#_֛Nؗm}R򋶤 J/ y.%U+y2d~vtz_jЌ Wgy結S}~Pf %+uOPK%3PKy.FNangular-1.3.9/docs/examples/example-time-input-directive/index-production.htmlTM0+ HjWPpi^jOL2 Hmbd)j+Ud潙InK N7\ yj%:`߾^'3 W;{.SjIK`{L-ʳHcKS7) e|J@6- LKfcI*v*kn,[YDj%rBR `MS0PE,:I NH!vHv4|=>h8h+ :M=1< B7iFhh՜~n/3V d0ݹ]KuVS]+tD kWZyq` jARG>x(e( D +@#yk#ڂ,Z-Ҭ`r:E&,l~4-)ȼ$5T-`!_6PF:{%|`h{8S~4&H" ڹ(nOO!j )]O2v"{_i{?FKɇg\WPKDSorPKy.FFangular-1.3.9/docs/examples/example-time-input-directive/manifest.jsonK н ] *k!1rfܓRlDXఱL5Y{.;lBW )y컠1RFZǹyPK[[_oPKy.FFangular-1.3.9/docs/examples/example-time-input-directive/protractor.jsQo0)NQ89cP$xb Mm}wI[hHDw^+k [4$潜kSkxjEXBzuUm},Yb]?"nwֵR.p(]t汮56ý( 1TC,9UuktP[`,]gE@TW7OaL]YC6>*6 n<:bE(Va.+,C\ >//s,H[ t\uV3.L9XF.+Vq;em{%Hc׵pڮ!w '#eܷ9㽈4. `A.}e;kz/Nx)6rUjƁGy>3,qU X9 D$$2Q4OWm#{ WvX >vDKoJ={QN_ggl)#M'0B0Ȥl(l;< DvJq}%3ȼP hR>^N_?)PKcyPK y.F8angular-1.3.9/docs/examples/example-url-input-directive/PKy.FHangular-1.3.9/docs/examples/example-url-input-directive/index-debug.htmlSMo0 W0B'l_VeXOzzPlq![Dw Qk+ HJr]:]V}SP @vH 7?|ԒU:Z0RZ+j0q?62&l;8["Q+;QBߤj gؙu5nsd ~X LOhvB_B>0ٸ ˻L #AɁhƘF#'x]rCygl7Wu6TWB7.@.chsR׍ޕFHTV56Ļ8ɂL Bg5J>|T1}7J50T;:M~q:Rm m٨R4^oUֈ!z=[~wUgo 0+smxPKa* PKy.FIangular-1.3.9/docs/examples/example-url-input-directive/index-jquery.htmlTn W̢+ՠT%ؗ(9U=Dͩʁd8vɦ*Yyo͌4ao%B (Dm p^~.=^.(Y_* %ȼ+N!mdgY>> 9D/"o\gxTR_czk )?3z6'5gr8e@T1(NcgY7Vsdm3YoAuq,> rRҭ):++q0hl(b=glkVI p@seE5HTuL"' %7_ρFAT&dND[Ĭ84`O`x+44Jx3q9h*L\KԂLI͘ؾBu-Oꩢ7NacyC6'Y*wTl[t:-@.j \N),Xw Y7|X}ޏ_PK OPKy.FMangular-1.3.9/docs/examples/example-url-input-directive/index-production.htmlT=o0+΄@D$A3heP$KR GR6$5M8X ЫzЛHM" E[x/f+"oK<ǃ%/{[%WTi;lB$KL;hr2"o\gxT1{1fT JggzyӾtIYf"lM{)Al4%=UrYoa(JgnYLD7PX,|c㠓eFV0& ATPlCWeuq.V⤐?׃H ΂*FPx x Ķ"`lbJp"BRU$"{K:).)=w SfLlL'2z8jv,lsNb3Kat{G/d?"^5'ɯ*! ]_r MoPKD<PKy.FBangular-1.3.9/docs/examples/example-url-input-directive/index.htmlSMo0 W0B',_VeXOCz*zPm5 KL QӬ[1'GR5v؛z![ɴeЪר٩0heyFt]{V7JyU#mtݣU&"R&tadWQ?V*dU6%]-QCu"v4z]"/p{!M8ú@1X r]gdS{ABCUunk4%苋x\PGd6,Vu2$;Cƛ R!15I)Iw6EW 58L,4F ;RsOG'OO7PKF PKy.FEangular-1.3.9/docs/examples/example-url-input-directive/manifest.jsonK 0 н(Yb#F#Rnt93o>!LT#RMl UB?QSA#V.)*/uZدR'aPKwO^nPKy.FEangular-1.3.9/docs/examples/example-url-input-directive/protractor.jsj0 y v`vu/$J*,Cw.tA?G=CAt1BEjn<ΆOoyCbٷ/}+tV U_°(#1Bt K3iP>үpKAH5̍CSW錳q!.,>+0!P [Jµcq굚'r\O4:@? /JpK PK;_bPK y.F9angular-1.3.9/docs/examples/example-week-input-directive/PKy.FIangular-1.3.9/docs/examples/example-week-input-directive/index-debug.htmlTk0~_qQI ll+eb]rӐIۦ3Nwwߝl(Mv ժd~%:gw (7¶r%Et*xw'F!p[^s\VKW"Ys({V֖9K4TCM| Kc]5M3x#gXIx߮F;kB;<>f=MtR @?G# -| \OstlG_npleD9J"vo}<;=5zq@9K~6,W~%?PKLCZPKy.FJangular-1.3.9/docs/examples/example-week-input-directive/index-jquery.htmlTk0~_qQI ll+eJb_rӐIۦ1Hwd'BvS#l%^Bݤ sEH*0 ڔq9J>?0񎗪n-/J-޷h6I( ܔ)\WVl>toD ˒8"dRhK -YbꆋN+z/%8:JUpWcŒrR ? m34׭vh5 1l) Xу-B PF|?Pɵ6(Qaʪ9y%ehpY#oe~`)(83K,N~qSe.Nh1z~O(S0"Ǖ]'' Rf|1)9wdoABA.EP5hٚ^w#_D4Q&_nπ_в-| lmMs 'tlC_lfs@m9{p<8츧%J+L?}n_PK-: -PKy.FNangular-1.3.9/docs/examples/example-week-input-directive/index-production.htmlTMo0 W0j$@l ˶ ð!Mʒ'M,}MI+׺raYrjY0T;e oqVXt:s:pI,= `%ĻDsI- VNc]w*b A81a%化h;|h;ÁtT<1( Z=B 7QF'0Z4xkd0/KNP{v ,Б4BO{E15 @l{B~Jb(cnT' ZXPJ^JMҗP Fɦ|6%?s_i{GRCF˶\A%mB6қ4H4=ȟx} ao#x$Tԡρ+GtlK_2l~O|aD>Dv@2:=%k%!e'(yG^~ OOPK`b4PKy.FCangular-1.3.9/docs/examples/example-week-input-directive/index.htmlTk0~_qQI $l+eb_rݐIJҦ3Nwwl>,M6 *pF0;P$ki[t}|s:pSuKzۤM璲Xy)osVi_Bi]{r0<])7o4y}Cֱ); ]MfZQ dV:|s}xA^w=)l) ZT=* g-|5hY` <"i/ [(}wΪ@cU܂ >X#j* x?T%eya5##Ā"|mJT.,h,pmTV$˳3$`6O9>dL?:R,\ %ۖ؀֮M`&Q8M遨}!MjWQ/hxD*v.?C'Y=FlHI-`atgGF_2N' }83?oѯGPKXPKy.FFangular-1.3.9/docs/examples/example-week-input-directive/manifest.jsonK0=fpR+d"!1CEd%r*]EzM[FN-5(qR"FzPK-aoPKy.FFangular-1.3.9/docs/examples/example-week-input-directive/protractor.jsQo0)NQ89PyXi{@<ɵ> sZ6yV֪56hH;9צf)aTҎ&|7;MHN8~P 1e.) (s Uw:KNd]yT=KCZGQⱇ{<Upo0.!gk ]psg7"jEQ,5\)YZ}@_L_2YS:-'=p4.uPeo#YMc[ʖ!J.+V5m},A /8F*kski6 -\NT֝'DEDD< ȨH+ H+C***""""495We01#!!:77Uʀmꦪq}~~W]w~߬U[<ij=+op};~omq]{Ffjmve732}rYűʄQ6rӲ;|i~ǟ4 -dH@wt˗_X΀xߴљCүcﺿ'Љqߙ9&ᖓVu.eT(c~Ny]<w ۷orYr@}βeyrlL%ihWcJ`[nݺk-1GӋeY>[gke@.>Ğj/-_K~ 6n9wJɪ]Tnl¤\=;8v͛-w 9sd``SC7=!ϱ7-N%28Z_+~eڰgO48cOdb3C?oMu8Qg3:~~"條ik8.μlxg4v}AFKjYbbb|r|rjq8*,W3t\f.xo$%%] ;% _%}N}߭`R r1-VHYV nJw=J`+M_Z$6a9\`hl\B@e6XSzwvJ6N6.qr]toCl5Xlcb#lзc\ݏx.B;BٰM нuѱ{FEgtl8aC> v`|9Y&qjM@jE/^c@luU{axul r? sw8k]ޚ/wΖW_8-=73vGh?miv9.Oϲ67,?1f˼}}naA?_&/(>v (|?C%&, fe)[16N'$Fq߷2sܖ~@˒RbKS?|_#vYlno,|v$n̻wd aARVZ&…2pg e,9(S߷3a^bzzCl\dŨ'|m۲$3j7|i4SoRW[K`kη9-NQ ^YdV ;NVkfݪ!9OeJL$ %)H]SQc(/a2{l0`_=>Pjw<5Xn\ϫ _"##՘W{I!s:ꎵ`üdz9ֻ$\u]zWy8wT_(@4ICxcSz6)2Rѹ5{7Qz*;[}nfߕ} -C{~ݬޱW1Ic5u1){|Liҧ}n i ^W5SK Iw?_oUN}3&Vsbj1K\iS|K*עG,柺8v@N5rmVo>sO`Ly𜃄QO eɻo櫵.n@z9dxn4>}43m@\\H}m۶5Flq1y],,栤ThlͻN㔸h&;bdxpFs 6|٣r92w{f9J' $""R;cFcz>١E|Vg"x0<̊5)4t=JpIُRPPG*5i0&r<g9q|ow l 8X͛G31l!"SS Moy|wm:E;5gL[KRdtЯ<`5d@,ySjH|qP _TWk:d.FX0t6.>BB8EC#Tvym;rZbc{qa>m-1bн }\;k1'3Ac]KCdL-}k_uf\ޚ孥Veg; d?aP.fuf*_ bC`{>#Kf0Gop,yOj(br雷&E#F N00Rfw0߽]a);!o[K7n\j_%ጄ4ɪdУC7}1 sG+ې#.o˅.Џj0̀q΄If< u48(Gn ])`]8PZx%>r*F[%)aj(鍜[eAֽ/T)?{ޙ31ocLJ`HnRaT3^dE ˳!8%o; zI yRc̀CvUs>{L#GȄa979q!g!W:ʒJ]9)8ڮ0=&\cÿϮ~tqQ0רEJvf8VDN/r+W#YH~ru@}YO>F zA\l8(`c!BC ?モ0#YsL~T?\&_/.gu)KuO'ЇsȎ4-"Az=Van ?>26!qkx6k 鐥p=ir#1(?jʐȏ 0}bpʶR/zc0@?F?t3=ۜRKvkQ30c@ƃ*[A7c!%UI@Ы2ėbF?x?ujo%O~󖔔(Ӷ+DZ]jڙwWz!MѿE/wq [˔q?T4?|&|)/j^sϓd +u yңEa814}mWsmʏyVJ=d#_ E?ta46>RdZ\CzQE7e\(wbDuZ㰌n;$XaE!GtTbKϒ+OccV)c3o Y7:eRohc a-d2bjSx 629|M] kHItcֶm =3y·Vx:\233$,L<"{HSi[*|X[ÿuGۭєrD_F9ß?R~s~dggG.ʼN_X%*|2c$|6N5h[I\^2eSZ ?E9"rD?cR5;;xߓ'YWL4^GM]nE֯Xo0{iE2 <-.lא^NZ瞾vVi\c#9P}a;M>& aMP#A\}>jn$KKY)95`LΒBMA8aMqc_2c5;0J=睯+Z>XhX]>k+p qu2 ܏B!!e:p^3;0}zo#ooO(5s!?QqQ98樼B9]|񀻖}O~M;[_bj6 -B]wֽ79KZJlbCy}8'FQ۳y>a{!-=25nZݽ凟 z@ϝ;'yyو!?n+,zїzL!^+n)?ӧ|[2C=_izl|m+BTx8r/֫zh7 ;qtzo3奧T\GDt4|MW刱50E0جW3|]t:}ݙ4rdƟ81ĥN;!cj6J@ LE@f؈}hwJ64/``ı|ܿI|qF**+UZS?av0?m(@oC=!q}GEY]&˱ׁ3{_S܆*2)͖0fc< 1it]^*_mHRYnQ[@f5?Nf%h=/?(z(ik~e_|0GX* 2ygֻ2?^/y{Z_Sp+@Qзk6U6Ϟo`z3sPsIA}@Ņ}f>Ǥ[|'x'?ȔWk}([m5 `̿m'fug AK,f}ʞ@MwvB7=kzǟDoO*E7Siu TF |> 8 i>B_qsB)ǙDN'w[-d`gY3e;onW UiyF&:ͬ|y澢gbKEϙ&Ӫ"l[F"ƬևMϥ߸:}nͶ#ž  k% S G$aƢ ƿĕl_tWCX[1?-/g_M}xx1$KbCXZMxW쩴(toAUeևfTKwSӱQݖ2MI33н X x=urЪqOzا5k>-?ir?p#t}|?;oAWT2F J0ĎS4<"vGFFOEɮ=,m&h3v53` o(sO(bfz%dYq򸈈(B&ڗg= Gpٵ7qrߝҷIըݯ=syY\ֺ~}W|7kP%GȾ[{I dhзAM]2ȕ3{/)r=^qq!P9Ep^DD4"JE[̝O<-+B thg@}sFN!|dU#UϰS`/ߙk>@A H7-vGn|!g):m`/<<|mنhUZسW]Kf2EWmT`cʦho`ۼy5zpymmx}TĭG"܂m qwؖ!["$i{8D֯V(A|mFz?t=灘- YZ>%b7}9{k˸o+mӧ|tnVjXc {XO@:뮼skƑ}oUsS~"*O_ϑSdr_9zsZts,=/YYҦq&|Yh:]ZKN|܌!Nqd3\wE 6䗌ݾeM8aGsD2eS"ɉڹESsd\5 }<4ֵ[PKgܑRb#3ds7SmϏqMSY\?z]ɇ/CنesD";MD]g³2Z#v&jFbrs ^l\8ѫ m2%^x/)q;IƉԃ?{om7U5a{*u:` .w `3>HxU+e? >C?{2JK+/*Q.?-\#u1CL'_q2> osQ/Q#7e$U>guNͲ#W\M( {=o-㟲v]Ž̏w8w^!sež<@_7 ^OّY.JMT߿ Yj>~V2 ?R8ԏȃ;/gU)&ZXujH8h/^<;DpCau~b6d:{+kӁSȡb}]{~b_Ftyg-.gUxR%FϐG5N)2oTN-Cg#&Ȑ N')_ϣ][ghP7{;x5z]@'ɃCa/]3G) AY ?3k\ͯ<-;f7 wu!06/>A{M{7xOz Z~#^VeR,z'J=7Wl\w?̏yOɛU/.% s"U\<>agxͲ<צp@}i&Em#޼\>c#WMr< Oˉ#yF 9|aǠO4.ޢ앳ysCw~$?qVɻcMAFBOG/}tY }Hg[ЫAv]wRx!Tl0B<;Tlx9\=|jg/lzgL+-?9$cn><-#o:d }zzO?=vu=ugmiHZ$?J~m{>| tExfLLR$ͮfx rxAt ĵbf׸xG_{~Iwd\Ssg ?l?jP#ax]qunlRBZNP=#OIN{=qeWo6##OmzGsR-s֭?2OC ^d0eȖ F1YY@N ^=5|3ǧ{{]֍oK; G쓜Eeħg}*:hN62Nr9\3<c_uxe̲>;6cyC=imεo,pV?*q|Z~c%}xa}bOz<g<8S|kn=@3o y.៟an| ` 7{*9PW޷C!SvVԋYK@U ` ߨ/Oծ|kA|Br/ <8{7F_ˀk2pVC8K<*mqlg2cM;?Gj#1q_8 =޹q&cb/벒KCwY ӧ ;`VUz9uk+k7K_fǾ8Ѭ-]_9{ˌ jC:ΞUZX{!z lHc4G;X H -445/<{}d8g4?WQ ?},XH/qjv~!pjPodUs1mc]ψ37ߤ}ȑ#kqvFiyX{}B&{\L۽E_-Rv>#|^ #Y,S]cÿаWss ?b\jX(|@ >eҮIκy'<;k7f *cɿŢt"SpfS`kߪj_<˻Mj.z!t6l> Y3}iV/w:귡.}r<3?$ɘ9ڂh_+q|؀jPGhIۍ~}Ii}mGLj  <NJ/ A/hl q䓽/&@7ggk'k S%7>O+`'{y~=CciگLĺK~e )?]bBpV;,>kx_clw+8y^ w5( /|J^/9Zt_x(5E`&a?cq&6¿1Zk-1c%[:j<#.f|2f:?"E.k 6/Ͼ#& n,Cܜ.INz"y'svBɄ\P_{CMPpU;I$Qyfjxq]93se2i yw5\x/Fv<~Vkq}GOkݤ_l}A/8qd -G^e ͳf7{q>e;2xFM5g5nB|u631V5A?\7Oݥx߇CҎA6gpk=8δeFwO38kUcA ekЍkL\`muy{ qWRU==7kR c8y(d<,=\gTwiwC5:<\;1a"U%^r7.CnIyu4z3\~sn{6Toݼ5>֥ vn79*hs |󲾥aCA+u{;#<,=J}}Q#XcGG3.xA x*`3)d9'\gc߀.OqQ PKO ,&}PK y.Fangular-1.3.9/docs/img/PKy.F*angular-1.3.9/docs/img/AngularJS-small.pngC PNG  IHDR_WM pHYsnGc5 IDAThY PTGߛaF`@AQ ^aEf8<ؠ*Fd]fSYh\]Sc%Ac]IpA$(j 9ky7<`0UVm]AǏ|^KKBB18dL2ie]#9ĉhmZkݻSA> Sys3iF akӱ T*瑑u]O-鈀|lJӕ**?VL]׮>ExTfHR[Y/ >??_%%]:S)4<hۏ" --d~R/૫KmnW=Iϵ BDpWa7cN>b^wN}Yݱ񀀀S~~~Is΍z0!ZV{*cxx)!!d޽1^ԇ!!!8𵯯"8[<64t'jd;0gOG Ԁw b#|pfҥ+,l#8Ng,禚+ݻwͤq0k^>T,BC_"|f07K_gg@wwG]ruu=^JJ-fsTCC}wOIIxĉjs+܆FC83677#!ˇyzz &{Lٳs돧\7 `gMfȑ# uM /X~Tibm7+==v%9˕s bYE)b\]~1'U~qT[ 1y^F,TF;\snnlll:KSbjkkgddhOOᡡF%ф6]:Vo]D4~~6j_j#4Ӹ ;Pў=#a'Ie/O~pb΍FoeT6ثׯ_y3cbbRS#څ wYƆ; mg4g\E;jj>t/pa-bIKy\\gii)KjqEIIq>y3M׻{J?i`$'LWSS96[̛Nq |3W|P2^/jI%جy{ Vv ;^m‚Jֆf+, NRb,^&ocF)=,_/zyy {NX77rʹzz%O:{̙;I ,ج)11%5+{oxIŋc?V6dnJc('nv>R||ƞߤF 6|tUrrrHܦMyyy[n2Z*.U,L6l-..^E*c7oNd:,0/:SYYY*iߪE?1Vp.#:{±;w~>0]f-t o$YgmE6ۜ2XkiZciytlyZ%ZRn`߾} Jipx.R5gl1S* ; 2Dv}!Qā `=\\\΃eb$(&Mɬ^8 *jZ .\P"cP=)ǔt# A8 x˘'Rce\h3fpFĘ$fg3Bjv.EDDFclwy$mڴ)ӀkcmF:uN^SIӰ`EEiWvxB6q\ɽ4gN/|0mPO{ՄϏ.9B@|&[萭˚ӢHed:J;:zDNXjS^;v%=,7qrRMsgICfbwL**x{ѣG\8t-@/NK]CQ~||ƒ%KXհa ~Mg9@^םt 4a}^}gMv<(>U{iKжvf>/X:Y6+ fvF+5UwA~Q2xi3bAY& eOPhnzp⥴7~<1v}FR 7C Lz6;u viL|fdEm A tE2HSXmG?r?ETzJs8B6q>na'U'iJ _(Iˇ޹Q](v_Bqtޥ}<~vZ]fblQWOYWL]쫔*˶Kmkν9_0>nk.FCdgފ&FlP9BE4-頮DBBMO|m#yĝTCE$7mE[k_5iD Oarض#s48Fgdw~ѣV F`۷ B#& Nh.fSi~ ԝ;6mo/WWWGkXY;ȲܼInsgגZmœK>/~vkaݻITByqWޕֈ6!'u>[1sUjvsh\~ғuN:-״#t d{?Qeڃԉ&#a4`%I;U~̹r=ɪHI_U'$Oǂm󷯓ߣw_b|6 q'$+1]Un|z{j(93g޳AxDĸYoILxĭ'KIkZ6M_EE|ߘz ;zϠ9afi>|2XA͍ձ#01OɉYxEIYyc˗\~yu6ãFn9nJa/@lŋazlv 7S {|ӢutN=ɭ[3ӷj.~PSR:㷒}oߞ-L]:))ݕSƕ Gxo8\8ѹ2aݰ062>ͭzqsul≨q˯I2K|lͪ7n-ߘиs{X"5]c)**zօ ߆=O=8u1W0#{pXghkUӫ:5BS/>٤r3G}ߎ֜Fݖ}{Fn m)˗Sl敾;U,vR+YV($mg[P?>-5O51cű.tLBE+Yq>s&JFCQjSR|7֖WQHuIm,v0?9~/޽{g㣛s }1[ nN}&%5U9}aՃ_9::DǿzŃ@ r,-_e@ȭ3¢yo{"Qq;nW4{=gk}XS-&)wweOyYz999<~[ ۖN:Ç ~u{ܥR%ONYڃC^\%SerFW^u\`uʵ?g|~TTTH2ɒM6\`[9BOGhjuagy< Xd\D0܇.v*]sw@۷o^LdڗY)sКo'r淴ؤ ȮOW~z95q^*DŽhc~4=KQќVH;+ f:rͩuyxY3,/=R64r2  eȓZH֥,I$|=R1ꕳ'}Вzꨠ` (enntÙ BEv/߼ Rwxi{dLIDKҔ/BoK'IL_-Gҏ gh\dϟd+-gӍ66/<4/:uwiŶ*)$YN~dڽn (y; 7Djij]hmbj2BW'Ѿ1ϯ%ZMOB[~Ϧߝp硣=-l)YlXFC {qrS?2Sc*weL\,@lOV\#_zC0m(3j&Džh{OWx蹶j.rkdmqi#dtb%YS}[N׭%.xǿf%,nelg?;H=+5o.ݩG^~~(SOO},lJ!G,FSPDi.TkJ6W < ?>~ħ8Q}EXQ'lZ;6236<53 ݘN/ǗX\a?FƀpLؕ.|CXG ĒE~0UfH.+ű)ÇqVMkJ;u.e~vPT0+Xe5(x$z9&Dt9R#M3 e8$-sIuҝ?3kLxw;#/^P!YrӧOk!ჸZ{dI  !'edL e#3,}BDa0nhgWPZjE^pZZYtw>IlMVi`XGØƌ#dg)߼y]Z0C([ҥK0֙;?Z[ZZYYyK\ig]IT:QGN n v~V).~깨sSYi%% /]|ѭ[ 44Kb~dl%! Z^+X?Abb_EsC,yoj!zCrz5gjʄ _E7lm5Żv0Lm8|TԵ ǏG p)򅓇Gk%.3{g\ &KZ$$fN7n SlݓcYia3ײF(dlTX~O$U^a:69iDߨ,G-o܆YuPYt[-Y_i~뺥ҙڃCϑ_E6`{{]i76ӺHUcnh9rK:IEUu/d^=r_|y,jXnݺ;7,!|s!l\!NՑ47^=[KGyy+rLn}zb=%٫`!V 7iJ kC6ܾs'TH#" CcσX9yqқ7Eb%ɪpnu95eW?c{`C~Smco222˽6 N0Fȏ֟?sm;DJzBf>P{r ?ٔ$볣p艍&3Կąc%?F^s# =%5גKI7:c:vv8D[߫]3󍣹.^p/-َ"F/%H̬5-_J3jɻ=@wZRTo;;<9+4ez+.=+OL&L3111~m 룺}z2Oe>~gͣGi,̒nͫWO([Ϛ?m aR>?`q]hʩc5mt. 'Ѻ|@fMo-DXQx##kq˰ ׯs`;,3x˺ԢLV? --hnbu$#XO~AG_.QZ{1,Mv6 3VI&֙'訩Q忎֕w:buqC uIVy)U7kFnu?PF ;5OII)46(݋@b8 rOrsEt)jkkӄiG{t_ۗ92eTi:[m`C;?/7W̙ԷoCd8"04QYJ͙TT@At{;;;_|9z ~DnG.{ʱa/; "⌼FqLvͅ>LE1]e[w }pH E""xт ݮd0t7kwHK[F?lPCKآq'3?ծ]'apjuby ;j6בqWZ R3ш!atHS ,צ],== &wc#G>WqK)XkCAȅ_؇రTrsI5Eհ_e2y:|$ |ԐIr Ufsihټ?2 (C3KD&upxBq8.w9@nGj$m`& oqQS3$'%.7#ͦ::4JV(LH댌AD{Ic~E ĎgU'׶;Աܙ/1}?WQweP`moQtGdRRȓnfX)})J@cZ X‚h Sٽ;Kϙ4ZZ*Q|-L ܠ+>̂ @p.9(+vt=%>M~('0i9uXhk%3U']4V Yc>y)awE䛸ZzS~A]<󞪣TE)NI8rD)ZN@>\~QI2#aMǀE: TUUחdNڣ KozJ~2G}!AIzThalMEE%H Q fE\X'| Vh\ QLmO™U54v"]&z;7/O0d-UJ0^^e YkDf~Fj8^0_‚gڋTh1&HF`{[[[YS ;X{˷WڲjPb1U`:lwCi8K"=jzy@_4<;6g5vYondD~Ȩ`UyYDsss[t}?:cTZEe}'0q-uaZI"Iz˯bg>'d\EDCC$lôxOy2 tQ44GDE= }PE:?7~q迾ȋ3D) ~&2˜ IAIa|-jg`G&LRW-Frq}|Kh^b+()}:'ve^\RH)Kl vfGcpҥf0ч*[pEEh@gϦ|---ϲ:c׷B77{g蔭uOI#Z5Ԁ\TVCeOpÍ=޺ؐ,-o___VYoΧ +ofA-\|WV1aP}#i͞6&r;ΞWX?l1!Z3Ć;=vW?bݩ[= ĐL]+A_7@Եdb|(nsq%nXY9ʫ^C7 b-z˱QO1w D >e L.hWqa?@:Z'+nuּн zP{oi ᩐi2InaQ)tfHt$N oGǭGM$4KugWaBz4{6BgqTKkjN8DݻKJ/~PPf`I癙p0>zFz= $ubCE!F$MFg CEL0nj5HX>L'޹֚(G91dwWj': A[ RP)EEY`MI˸nd$ t0s8NGZ3W^ %*L9 &ڻڜz pqBj 2L.&nxWޣG1$O:y_+nty5]c>bIԤbGmY*Y[[ʪ?p@z&Nੇޝ#=Aʻl?.c)5Ląю٥P&ڸE!GBO|SU/Kt r^hV@&RgەZu{H(?Y(8ܷah ivt4C!^9pKD}"rD*!}E_ﵰ/; 'B@W[j4$y=fʻOsQ[Gp^s = 635B6]A街;TV?d~ISFG"! Dv  Rf 2EuHmtv2.vTp zĝ#~ {yQT>~^^jFL7ym%;u,Tiq[6qBmN/ÖG^>! [ 9I+ٕQܽLGq ݖ I Ɣ9tc qPP))@ϠN"NvnBYܤJ-kzJF-,ѐ{l_e %u4ol |ZoS b2_J ߦ%orB@\%<IRڢ{c)RR'.h?ӏsX`߬JPll3vE0Jy b Yz5v"쵏O, m+/$\sۊ8lTP:I38X^m3LP?PA`"k#a.5[C&6.gmi gbS 5a-Z빯FɊ L.0KǮĪ\^)Skyx)Ǵ?KlUU%n|HJ 5}0#uo}|}oQĸUZ+&\;ߍppVnDm/2.f HS^S8=>5PFoSah%nWExG՞~]32>C+Ł.V̫f4ȂP ki5|yOzT.ֻ^3i\yL9av aIGKYa: o[}E '?}(+#w:D=t·.?kEWo-9I~m<2~w4geѰ#5nQ}Pyf5oWNz>_ݪjY I4WHFCáعw"z>ṺE EeB-L̴G{ lu*y&&ts3Yyys)*C;@;N\)'ʕ/tE3=K7X0g`W \3{/}3b⾀U+%[7êB3RlaX9᨜imgED~V|_)9U"8&:f*O;K' /?8%˂/hyM &D!|hij)I$V[XBjTp'wܖ·6!xˬbCbvb"jZ~^X]e|"Z@w}ziC97 me%tjW Ws'Jg-Qv.p.(ϏD^#3%/MMoti|LnZ_j%|Zi7kǼUǃjmjbwΕG^=ma|ߖϹ2&=&_ִڢ.@]H?t?g7.R2pdsZsSeaUbwS{N'w3׭MDօhUt31ɩ<+s GLWRXQ'\(dӶvȎ-=bЧnDam tp͆6sGw x ъ2g~{Mk"j/{P޸AN , ŕ)\T@VES~NA"ࢋí8⮔SVb>/%q;m ×v>lw*({'7rV>Z9JIHD|KsVJo:'z&mJm)L=;jwPjzKMQVKưc@9ݗ+TܗK,9S]5  dpxS\) ؔS"KUoz1|KRGőTBeywrY1U^.<LRxkl{ֵ9NIR nEEʭQ~/okoβs%T(BkL{z)\j`_Ss&6 9YDǓY#qQ&$xܽ?,(F;n} Ifݖf 2 kyzF/s7eߘ#e=u4Ԩ慯ZW2V)wSaϑ#=WqW\0$ 7f4 > 61LK{,mGAs~u%6vBV` 9b,CczA.iMW U3g3Cay3pրF*[ S1fo8UT BtlJ #GpǣV679<=r+Xx09a" ]TsC}?j S"OK+s':[#9/B^j(;Eh\ xy\x\ZO߻2҅֕uX#˭|ѷk2VMO Taf̭YFރK[OwNjM7.-A@&6Ϣas=sRBv^zx^jZGI8#qB֘4L}:\򏺊Juy+`1{̃^rBCbIBRP}fAl~ͩ|ˢ>SNnБBa?f(7+zeRr4u?P}"6KHJ.YiDOFFM4wK P/CFW aad߻|lr_)H7//w շR.._gҰiem2zVVfelmݲeOb~}HN\|H"B|)m ܂poEK-s:fa~!#`#=2B%ʵZ&qrC^p[Oܹ x% ܿ(U#/y+{N#j:3*KMhNčЙ3NĴ$' .Lg^_Hz^2$gCd'twTDpY"e[a81?[!7JtILL (`Y&~׀' H];z 5tZh `a !5]+|U*~T}t Kɵ C wzQbG u[)xHԓ'?FB[l},.Hv/T$~?H%\B0~Pй2:X-fП> kۊ[Z1臘a(o]a޻hw1b|qb/«޿:W$~2K'_Y7r;:*JKΥd#_ns$PSEJHĸ4;b ld*L,1߃k!v~5&i?*O):]¡Y*&Y !P5^m6Ă;1h[L{ĩFmˮ;=z?9BO¤(9ʯ?srIv4š)8 4ʰT 7##9`Ld`(e2g7 {b4xe{莠E,|%`0}3&i('uZ+Wigek]R}+¿CLAOtaK+<@n| e'KeKri-V{ 3 vrp(C=;0xpnj"/ 0>4`A0L[阘NA^@KI0{MP"m.} nBm4'@w Ie NM[:=!X:`H~zzθihQidh%żdaOxwb_ KN$!M1& )}H0'< ^#LpiDJ'y5}mʉC֭&EوBSRe^9-Uz|zwm:J 6K 7[wh4薓qk|H/ ߾UċZ@IR:hv0oYFuA‹!Cf EsD)p:(^/JN..8}DDDPSs>OC~VI5iWUvt~,ڏޞC{v`: :jD;w l,׈^}whBh?<Ǐ 1 aݖp`Q85TO3H纪[<=vJ֬S**/Ќ#@,? JKc/{ Y/XCw3ҫIdKw,c M\<=7:D5kSXhNllܛ5",fGGhXX 0KY*9y%ِܳ8-&35=eIHcuV%$P?C3`,lDBb@h^FcX̫W) ~}"V3 ڞ 2 Ž < 6ء$nBtJI٭9tb!-{#ƼH]'6<)ȥz!lgiQO7fOʈF ^5 MtrwmF/Cz;LR ROL%_LMTu8,+F` jڏ/(c 跺N&ItRu\jQKi^re`&<.[c> &݄-2m uIKZ[b6c6 . -..`r 69(eauD萶]3)KnL >-&wN4w6.~)'37=Nda SS,;(Nҡ׈3ݥ[7pp<ˉ($T_tֹ9;c*C$ (? D&3O"D #̘v1 >z {لH&0\%֜~Sn0 H߷Fhk$(34ؙVtjL}~>|PAНHzTpI"ry+Y. VzOˇ ̩ml,ڜڂ{b j(|lzV UU7+4  暚{~$ tlQO*Ny}x*QC!bŴEWevB)ihv AcQN2/'Xy,,M"+;n$ ?(mk[kDVxlZ?A`&Dl9R u PeTߦւVmR2T80  JfBNyHU#+k $z!" ^9%`ym!2omSxug}~X?vrO܌(*ǰ׏Cw}%Q~”XE7aY~ Gbxxq[PO7ν|T(յ"(#jc_~M]/λ c!vT xE%NXD sApDASJ34H4peeo$X%[虃@"ҦxB:|fPe1h&6צWB K0o<>(H3ީ+k~kў7T B 9 B Rе~oe`3Ȟ@U ZGQ((݄+8IfW?/oy3cU4Ж"ތSF&Cc}fh[: LL+Ě# G%  PVmPR ~TFXB@ $9(\U5{-Vd0cgr3 #5x*?qq}&h([syHFv w/} ಉd, Gi& !k2G۠~ȏ3TϹa^1=B \7/icU)Qt>aLdwغ~OsBÊTQg݆Tdٚҗrm| D[ ]+D{T; 4I|]h?x*cgT3w(bߠ04 •O0vuE#9}g,+\еp!i|/$—VOm~@͍ylD?A8iT',N50QϊL@ED~^1gH' (9a!}>%Yf >hP=~0J N]3yVR+a Q,i!CylxJ+h`#P`7㰪iDM&i("qx PrѠBK{]J,}9([ @ tլvS},1@2#@t  wBт(PܞKeISBW U#O PGLTtLx-Ğ9ϿVeW@ɱ k-vI8!$*9z%G<*!࿑V NpB:N$?n ۴M4~Nq UZ2ztծ([0QSVBdK01MsNY\Rׯ{ g,D7@$G2#yp_XGoQ“}¾ |X<&䰸(hUaEBYQ&}8CF~}s|x `ȑFWi /j * 0;B/4< @uO3P#xe /\|gT`L|P@W 7 mf!+r4wIQ5$)ʄQIx$c:ׄ?)(&PFA`]2C ,4>߾2.%HUyp'/A'Rl >n?{{3$l!i:ؽ܍Ni|]p讈C{H6L=,DbhYP̐J&>knIdClyǂ f" t,m+b̭}4*@ >XT\YYIgPhh{q$tdGLat A܅ty`":6Oy^~8L?0Fő8 D\1\@]; age]J~/L4RSSq-&CN$IJ^C7t@:!vp`R89Z4Bs-\] A-][=t}ދdVFOi$ c2Lh겣`F,wN&kV7ksW@% x@0 .bgz;8܂[H17'.-ܜ Ji4F('+<>p5HhHByw]Fx4؍kBh >\s=W@0,3q3{2.2jv0(¸cXr~X@\>._-&yUzt~ d8 )J-!u q:'8(HE$Z0¢)L{HB!9%VX+e-lfR&8qCjރ:C@1HH 4ދNE{0G@`td_@p7 !!=6Q9qT0JNS uzzI A7={# ~ 1<{ UCN_? { pB(F'NCZ1O wxե)oЫL0PCwYPgDnfAQhv 8az[mGN p*p ,ZR=oxܒ)@xਹ0>+m\`,6&x'7>` u S0ƭ ؀B .#mq~̒du ?d0ov;?X !^ a+22btV63lw_fFO$lǓT.(iZDa"J6':d-A<4 {} ɓޚpdyR>`@C! TbGK+tڗ`sc?2v:j U}5%p\πYN4U1@*(-;@c"%N Rf@¶~7ԁPHB3C-R`ڪ1,ᑘŊPR6'oiܮߔIA߷¬jH'&7d3DbBda_-Ğvn*"1^?|0[SKJ989jbHd]]:p%Fo1*J+5<H ԕŀ4MV"漢C~+rqgp\\Irԥ$VLHnY9o[ǜZwt|B}gTںR׀ŧml~@n+,B'sw<geLqS./DNsk2KfW6%T #œi^ y|nCǛ8]aS=:-Iqu:f*O7~ҺvNqmx,aSﴒ\_S$-DU5SYчH.F~?[ D\R{6:ߺ K6DѤүmL =a bZNx$0yH\<(ZˈTq\'MjLB0TPQn/5Tgܲh*nbgPWQ >q%dgֿP4 @8UQ>~#)eid(B/pt i^ R)KStw 0I\(2Lj7TV\G8ɿ˜ؠM A>FC[qpEt5G>c"W=8ssaXV0*0uWNщNU2Q='YFBq51ϏKDA5ZwYIP OWn<4 ǴȔeB5u{'u :>J ͐+/Fn¾+\:]_.5MK{6a1[gVmVʯ:\l fn#݋bSc/j?-M:Z8k[ex@H/kؼr6腹K YG3X3Ÿ[Ȫwv'_%-[FHt^ y;PVRz&awSQ}a:3D4.{ʊJIOm&{5T-V鿞rC^Evtͤ&ҥ Ƀ.s,dF7¼|Jp;#+`|CHɏS'wmQ (As3/hrT :M rG JPX?*w5ZiK`㝈{.yf h^QʛSLRx}6BJ}~v^q2[X3N+cvu**lkN1/併}#h}~7"8X뭻{G'n2_4 yƟഋٱ}Xâ4.\MXCm>5Ȩ[նGZ|h'CQtRӒQE؜{MKւ#eLsȫDWO;综X ;m@h۲R!$0#KBڿOC7aL>AfqfGu!$fl# Oɮ׻bI616$Hxi&ٔnST6c^hKJJp54U {R_tXbg1CϏmf#_l^V"71~#,/v@B$K-}e=DzkU*OフRGNٍxǐޢ^<YQ<I.[syJepNZ_hl-:oO:>i7:~@zpu}n\qfFKA鷱>TZs+p >)(՜xП1ߥ| zǮcqX$aL@V"N^msልJ_ᑿpjsc\wD꧱' C¼bt=G+z]zwJ(ElkCIjl7 dcуMbG98SlozZڂU?7饾1ZS%ylkf`ھru:u%=n^}$^,?CL}ܔw4޴pzTIpPK16VKtdӜ3^Ȱ 6n.G\qf>L0݄OgX -˟aaY<fjh|g%eףd&HIƇ`O6t4 ?{Z9B̡ ΤQOcXUm&cR>W 5i6x+jr*yz;aj/,֭o06]ʆY~xQQs.VڣdЄ ~]L |5~y,χaj݂:n]# +>S '=Ş#ɺv37evrot?<?vʗ? Zi{?gqqJ4G{vO3G.;F. ;h6ꫲ/eW(csG1|c ҉:QZP8 _9>Qy}vRVk׋HK =۸@&Dsn**D: OK-zMAfN_,ŒSEnnwlYL,3)]=euw^%0^QBh͵Τ i\u&tP=9*K.shr*IN# {9>hO~8gdgAy7cB%* 5F)uZ)F:4g~w>T\?Y:2N1Y}Əw}883dkHKs뵃gBWTiQR$9Sadv5+nS9y;ܙ͗/s'8+)!s f'÷<_57~)UϤCԟw>9ף"c[X_Ws}u(QY6iY/Le}<U7 q!)(3} h+88~d؎gP$x)V#cFy8)^oB)`tϓ['?W6]qcm}#|KW6!Ys1&+l|^}cG~a9~~?Ϋ+|2Xf [PAlqvp{hC-.O{;wby󌭘2޲fP >4Zű&#UeWOnڱڭx5; =.ڗ%3H%?2Qbue U,vvif(_*YأUI ⤓*zyi#5gzy7jD|_6Z9+O 2Y7>11;Fy"D{6l?g5atRyOK]MT¶9VT¥cŘw*dI:[:skLJDׯtR"˚ [DUckC}?cHznj(2ˀx5*Jez+G!uE#NJ_#-ǵ,'1eFi`x.DL7*zpc& ׶#oB]9զǐ)Z79vOiю8Fue'cs1+%Tl7e؆{euJxa/Ѷ/%kCfՄbonK'+-npR۲4wAGqv?혤k߷U>P2*\hszps|tm8T}L$Ώ 7>Ne%~" UpXill{FG--Z4dc9,ԧk6 $~yDNcs!=pEz!k?MxI 4*fx#$,)䐩Gŝ'~./¯@"L'3 x6mo.&룿>ȯvd-u0kͳ6;`pKG[x$TCDD+e }V>qt&έ:ZNib=gS ֿ^,$6Q`z7 A ~xHC~1\5^qAk)q%'54fp1T?ܲ`bST290djhh%nL:ĮR'g2ҟ!9#?RHfp*ı}dL+E~OYO/ڗf9M-QI fH`JCuF.;rZ7-"k6QApZ| w Rd(]_N۽Q)O]J;>>ǩa+VU/l7vŋ~롣D𳍆M$Eo/J|UJ 7MbYO 89- l`Lz s:4!J%~&'x g,bO3) 6OV Μ(cfEued@QpE*ۻ^Lp%n Mv[o04^q 3D$*zh̰V산gRжq8E)/O=l!Nu/IidG>ׅ x: :.b Q/ճx4ô* qݿ(Êmr9):4stq,t+GH]e0ɝKxz Ur ϱ?f6աXZ3Q̞dΆ\L?JǦOG''0QԬzc +)5R4e!1sN,jNX*[iCh9\ X[-ѯ.PLM/T[,݈b9?|8Ŵ%AjYhA55INybvV%c[3)Ԕl}:%:,RL#|ܦ"z8+>N9It5Ncπ&o`qtjAh[3w}SXRBABjyU\G)xy?CS["Rk0f܆>|\^`2D`0 LPT*!@]/GCyW4"@?BgY˸Ge Lq@ar&L#'J`t#A[y<2]/Yk}n!Ct.fexJ :o| D@ w' bR.%ZO" \|=mf$`#r:A}i)Nrm8I0ūp;{ wstp,'">ؙ pnTGY.? 1woԿLIC>ս@{ei\iO{8eV##s<Ok)+x'gOqyUc)֋ Td3y;]ڲ買FƂ<V^Yb6hv}X< j (8cf]$H!o$X@vk U#hK{ 菨F 79Y#kxra:R-iL&C$mNwr9 W>%G 4,Me4xVKr<3=R [z8NV)򺐒 b\j9)GxD57E=7 S7K%uWW> JP% +%m^ Lc'>r4uRܞI[[WOIO mp'.ֹLT[޷qlB)<1wlBi¡/y1>q$C_ctm-l. ܄C5ǖnO,/VC11,TJLr1,95ڏ绎w Qw+q.9 ţ,px~]E2&@0ۍg'`0ks0~?TqLV5*Eh*wǐJٔ8r,UZZ';?s̘]X,PSt?PLSn= 2?~e:`&t117[;3k,|Q%BBX%ZFc<'xE$>e)^j\wg_M:V2UV N}2`9 24ņ8mK4BIJ5IC _'O%%%oiߢ=Ţ17;;YZ'5% )D}}+ez݄a,/rT_&m) +EIm旝U/?nJB 6-_UjnDVhSq:1A>pNav5K7tn׿!2Y;muھ6YW܀TyOۇH~Ǻg-> * ȷyÿI7EeNalsj{T/rElD~ Pm`j*@zJS]0?|F'C&J?`:8sǸ#FMEǦ@3\h MaTBW/ӧʩV_Iw܉ [ؕN3m6"mCrE.xhЯ3^P<%_*3Y RRdžMw<W?9j߽Wq0,&|{Z|ff\^|7N~r_"fGL03b#[eMk_s&CSxCY3^5Wo<UŭEeC<f3U_iQeMvǠAXx ^w,WߋyFߐ\MK[ij]ZXVVևyXhDL*okdڞlT[ؘ xcP^yEQT_Pv= o3m[~1p^ѓGVV=?ٴhhh i8a/:zZ[[303QQEmM|V}rMPfVCRj*( A|/~?|.C&ǵNFq{zƷm%g/C/ ۵0T2m wDz ; #ˊɝ ᘑfƼG734g~)Tp+o[8FEA'{]s%cosfʥ߫ZSm6wko`aLTY_LLL<٬^ɐH=iXdd"ܮqBdJc8ʇu92ɖ2iɘuFlOͺɗei$% 8̨xy=}v琘!)OgSntzE|l P+OƊ _h>7sn%+}Xmu /M_w P*h}pFTc C"w_*T]~^]]1ݐJb(]``H mpVF kKKf~G UҡxjID> DaRP' jsM.]/q0O%w&qJ-OeTvf I=} E,}Sh-& ȭ-{b7MO#% 혈0 <:ۇUBd[Subo}666^GEETe&ƨ֏6,?E8-+Iye6T-g(M`Sg!nR"bw9pn7?D.**7׿o}aOmf7)`m:]LdM,DR ܅I"CmWH<wN`_ÌN}x x@7>㝪h9~r\XП©oސ=&xuyQ"Px6H#OnOx{^`U3ьOƳg?se#?[-//8-X'.~tvY3}{e xWFt jk߬dĔqμ<2{Rj2rO>Sk~ ̷GMcKoq&j+yY ,d6NG{I]T5yߏÑ=F@柮"{]w/Z ?NzVj93ďLJyVQd|n=R>ڼ@>pεAjuVXl,W$a$L33cfv9A)<ν⁽ٳ--cH޲8&R[|͛y3G ӵNw]Szi>4KYǏo'''k;VǗSuq8VwoIMyڜtIk{{&F=ja3vVB@R;?/wwa%!JՄ\MYz;9ؿ-EH{}Bbɧ! r"I,2N9uR|'NWk.4"GS.M e{I9j:2}[o4XA^ Мd W6)%E!; +kۦL_ACۺ8,-FP@F%D]ffarU)02ռ%@:3I?gi@S /.f[#WVRWh lP2,Y5Zὧ_ AR[bbbNIAqqyzd ڀ.Goe|}EBi, ΢[\]^`.DTmme 8Km11\E.d]ާc)`ǍRTT<ߍg`d1dK`ﲲި|dmz1*9O|X^1/Cs1{ XÜΎ]…:Xwry|C6BJ,䈭\+_/A:jT1Ѩ%k?߆g/v^R;1JHNDŽ_@$-tg@ C矏~|cpx[{4aN^< ?qxlE#NmddC%,[QQ13mR"-DĎBtw(BPTRZh9L- Ɔ;dDxy ssav7! PfƆ] QtK!q!NZZ[?ݚK'NV8 ONN!0%~nB"G}a'{;oU9Ej}Ŏ'#/;[brh|Uy9W]] FN~kx `^d3\q! }=q|(;FF!f~, WSW7Tp1vP&iBx|مVUUMADA~ԯVlP9- J` S"!v} kŁ7۞&, *0IyͰ Fh00uɻCjkk볝ȹoM)5b0hp^@wI,Niitc\ / +*G]ܑ K.N`E^AA0l5n)Ak>~^_17CB"i! qJD=#FVM#;Mo5$#cFr5q[݅Bӛw`E@d>3zag N4Psmio?Ljq{ Ux>Cźkƿ#U ]Z%#8"$#p> [p]ρy{>Pg6aml(Edq?R)>77xY >m#=>1__7"^vq֛Su. o !͹7 a?h(NN-!|($'@G|0~"d t_8< O߻st|ў׷^UŦ4go2FEyyV  * %סz_ɦjjjŽ+(-Af{k'<*ALL#Q⏻Нi9s...E^_ْvS@i߾h' Ο,)P\63+Pg+(L1g/G 8Em",.Zc곅d)M[VNh 122\CO)ʒj]^X"HҜe:6V3}_2 bnּif7Th/hqîa&633L IB)/E:_>PUZ U݀7+~:Prc\H ()adgx\?C%ɼkBSKӊ2" P!+kB<Љd)PMd=88p,Gn)Ax 3D9bHF+(x!R8R%gQ 0^LI iXx8߾d)2Ra@3ChǠR_|x[=7%%p9L®Smh8v-G^}_bO iŎ~#r;Rip?.Uޙ`ww)Ap3rހ< *s$$dT^i_f_O]# u|w46_vL |Ph?ΜdDd[2=ui%# i!m6o.\ͦS?.=v%җ s2W9|r!T9|k%s~ĄuAMC5F U\2K):[EjW1p*eLO&C!5N@Ӟx]({$+1:W#Kvz4k\ N$Ru !zJ,0&7ߞyl={ݍ(oo!HH (wrFlXnW=۴Xh^MC!7Tnׯ_?o %Yi~eB" j0Krxzxw55Ha)oD84/Ј=@؛n#(0Rw RAME s@*߼rۇ*>d*UURW ;9~=Bi0karCsxLsPsu9]G(R!A7D_w|_w ߛ'KJJl_CӴa$@XM2w G<6tB}$\h@x.F?|MK tW>Dj D-0u+D_h*κ>8l<]oud/~"PXTթRR̖ RPSQy'6M^,cl!--^R-Ry; {&[n߹ӱSgߚ=2Stᑛ!(Wg@Cd+"[=/j;`Ҡ&#Vxk rh恎d`@';ӧEcP\,߿(Z9PA,<6o/R&7/RjBή|ȑ@ȥJA?-BOV¢R>M$E3-- qPfjs0 f =s)%Uٔl٬h{ycSc?}>}B^2LgH&j% Mo͒3=7y!`B-oO0EEtZ@Cf…MJ:Hĝj%}{-N{kz\a7 9f{]eeo9U 0 =yWeSѣ nf}&WZ7$/1[s \u5*t Q!#a=0phrvq!r]%K0b"6&?űjѶ’RWq%u0Cu5|%M):(;?ӎފ<;mY5? >‰swC!s]Me4)n'\6.znef' l7֓` (Bim^6N콪+K^WX>]3^3cz%<;[GTT)tGv6.`CNK Y>Cs'>w|e=Ue"$c"vFYLA.q]Z%~XY!R":-/̥y^(ZfpŀVjvS^ r`eM~o;佃Zlm0k>WÚtTә8_C][NUDg _輩P_sf޲r赯QRC6Ӑou95/C0kvmقg r'405Qc@$ .t^U(^ @Mg}.w< 4XC#hf\c, ǁq:c=sV)|Or=fZKLkMF3]x_u)⌬{lMN,/O􎩄G-M;bsHZ:.-q;&2?}ܷNMp:xpN%:>`R5X'Zjהuӆש hPp7U뱷EN5i%v(z/19Fvjup:הJ@*VS$W׸ue{uK}e {6+33!iMJ;%uۛO ^=ok3{G5ꪻΘU zanjM 5*a a,M:ѸInٺ (^q)"6ݏb%uy+U t&j􀗏4y<ȓxiW\m&([Dd^W͇k#6e+F)>]= ɽElg!y2phx.@^MUE,cK:,Pg#FFƂ}SO n-ڔ/Ύ*ri%JzRlW{xbH@*BpAQ@ ^xBoDX*@QMS;*1Sje?{'yk΂]tB*<.u'ԟ*wdžuacѶԅSeﬡ.LqBc[ώ:U5E=+_q,4͈- v.}U{Jx5{s {c YLx|zOmul@&5gM:n}_gC^6]&V܇wnO SG1nE R93œ(415E罜l-'ZzlĈ0##I^Y]53J%Zw48"q~̦pol)ZDˠ9dOoezUɷa畼%Zûކ'(+K.8~*h.y.Tڮ54&捵 2 uautd^CLK`=W8>1,j@7bfbGZ[B<3_gh-(W6I wcSARry6ycGcZ0l0WUb/Kw!Gs<.U^9U8 vzYwxb Un7Ál=zJbPJS[Qc>WZT<[tvO8gKac1xT1x#Υ}B) ˡ#LwS"r; o:Ð[ ~Kubok+HM^t9Mq6{F.D-MIvk  J!ׯ8eAMdP@"ߝU_۾k<ˌcv]\`Ȭ`TLՎso;O5j O-i1DxM#Po(@cS&.3*0.Mņ^ȧ~'065y FC+PWm{w{ğg]vJiM?ۗ.몛0)gP)gn#iҏ,ʯ,,/fkyڐX1[{ Q?y\ypS̽jF: Y/~ȣ`yNJ%S3c2qϺ*ЊfDYz)S/P<#QkB~rN(t(WL|8 FLKr-#~r[q$I$ ^lS}{ ^Y&AsScl4bݎ/ ['͚tٺlM~C|3SZfCr'l}%Sr7t``Os'o nߠy1`,;Èf釢xibyc8ZyXEq,kh&'hgM~FN=7zy_*_v4hpM\$^vw34/D͐ gUƸ+1xZ 0Pÿh'eYR~ |ճٱHH7&_@?`&T gt )u'Gx+l վcG'oJdt;樖@YEw8p,vJ!h^khƐ<#^L@]: ܳZn sYXwz4zmkg0V{̬?{BeT?^.}^CDp7OM[S1=fRCa禼fRϻdss00VznY N>e3I)\1.[thq|q-.0#*ܿ D7~ i"m[CoЩ߆*=F|5/bC3v~83Sا_LQ4f ͅx' W `{T 63A {ҹg#ڍῗ($1MwC(XVbkvɌ)\NpRvM&J^aaE!Łq+$ۻzʎvW'Jت#~ũHd_}ڑRf ~0MLMoa[%o-p.Jχq  +?cÙ& )#_B? Lzڷ5W8 7v EE3_wm Y@t=L]y'uW⩸SߖR{b#L,&3 ]!@Z7&/cg h*{ۨΙ1ViEpꁱVCC\^.HA= a{ѫPq*ܪw/1)saMvH:/N}}8ei`А<̮=a`ƒс]qˋFx4;` [ OBk哛݄.?ޤBK$Y>7[p6ڇhA5I9/p4hhh2†xieOΈ]~#Wȏs@{dЊS@( *Ūrr3! ׌v6VOvv_y,mV:n ီqY4-(񥳳Ӳ aof=b&a9x3TW^yϒYxR&+O-=*fCR=Wz 3w9ma/X>wOՇP^m:Į Q,x1u-F[L+E(tŧa؎zz['Dž#~|G*EWYwOF'jϩ(/?% ӣ_MlXa+l=GNK[ -*_KPMgxn4*hm7.|nlQ^h2Cy М)I% |?0j64q<;ˢ.oKgſeIF `elB3Sݕ۬ h1bHwHBqeK}UtIٹ1ӄH |ʳJo3p W`6' )@`[2pRDet.ja"&޾EKt0ct9hpvD9@1i~]XV+=WTD%#.T ^z>kmkk s~l߿ַ)2g5PG=$s"$&{b͒tttu s 鏅8~RHB g =!&XP+ }܊ U;G\&=MD!QCیBHQ`R9`R xy0 *XYa;a'''H,PqSnaBsQJH|6 :lH")z|*)7Gv99lDEaI, HW]61Rx!Uhါ<ՠ]q Ac{[¼}Va-wj9Tp ef"=˯A ghf!`xAtdo=`wbQs*(Kɋ fr9^82dQĕ& Y `}M: &Cede ^ X-JȠtgΘe\P )aa'`[ ;"C)L_d't^ [Z*+)?Ufl_H Z*P!8_ n3!p01 ;>~DφPϑRgf6nr -#WHJVj&+(K$ -|@.y.?xMM7 w&E&n3mä%#&ǚEνd:II lc og=;2` iRtmM78^i}8TThʩ-ޅN>SnG0FCO+Q=)9+K_'FU11e5R6 Rp!JG[uuONI׭=ĦA<)L=)`SRLdԛ@?3_EVJVU|ha"Ƭ @An^ms:Ll`HAH'Lj.X C&jXsh@":++-xEcѵޏ< TtXA&C_MRpluj$J ²ȿ] 8uTdS n1 TvwYt )a aldyWL/^k6azJZ,qJg[i($ٰ[`sQǶu%=?`a7lmc4$,m[LW;-Y)X ?f3wXaRbGBˀHG;=Cܽ? n1A2 ˆR53[zT\~  M*2勇ޢd0>JZaKPS1/$FTu4/@i7KIZH[Xm&R8uk9i@߶~6 XsI_WgN`o%0 wPO@BpWéFQ҆I#PQZQg]ZvN ֿo?v㻵ǥY0ai`QYCkRJ5aQk` JoF}i_X(U-q"`/7/aD§jq)a9̖NnzED.DvZzEP|5'TrfI0W@=0L)a}yxLDas\:B7$;-} 3YO5/T2LQ +Fqy PR%SDf_^)9auQn,u"Lf@訦zk_M#nGG4 Y e3p5 M/1 Y(4`XUA'U{oaIJ,l"'C.ZH(4X:SeAA}\ 2S@ZvJ+GBbb,'VPt0?Zeģv' D.gH YvwW/V}c6;nb;E/AP"hg[Ooz'0˥]mS`wۏdp-2IW.IZG^{󴾫ъ[B`-n Pu#}ރL}qrMPa{e&xy"a׾~ ]Kt P_ X[g\OTpN \;-,`>LZG~rԡQC7aEv)M2,*Dy Qqk[>' RzIAY(A1o/g_4>jQ},Fꢫ^0=!WKXEP= GGFa Vj)`@'٫)#6*MfӃDOCg%4I)'K Gԍ*89|;#5){_ =q=@apv7`aTN{-L>:,m8}x+6C8˗˳mm)QwXBdY 9$) $iadgpGd m m=t9 >| Šx~uNCٓF4 { v dJ owQY4zp^UDoMw S.4{L֧8^Dy xJxyTD^4g4S;D MM$t -LGq9z@#6\u>2VU ~L_m3 Np+i0}Vx(@"cnߐ^i`䈍~F8yX[F>Kjl_c#*Ӂ45t#ly0(©Ci ;;] wfkj'M% R뜡561ɰgIHH%%/1Ϊ0d>?UY(P$1*xY#Eۚ>oi5}(l cA@Ib3=L!Ryzz}qIiZ{XD_]Dn`MɗTO>H/fpuO`۬㛙T>A;dqcv!HZ7"DzhKI|& "Emdrn.jെ\)c3v@۹a T(A55F>΃ATXoQ-y PT Ӹ7z6ض,ӆ 9lBB ԙ*zJebnӜnc}ޙ "$;hO!^Wˆ?KCft4Y7?k eKƳ0^wLéQ߇w[&@B2#E-8m@C(GR ow/h?A"":. lrXL^dWRtӔ-k].geB?J:!ZRi0CEYedPIV*+$T$$<9s;u%u\6SN|[:9)o~'A)ƛ] ,qf,{7wH" M&Qb^]Foy<#-Nōt ѳ>/~=pOTM=CgV~TaN]Aþ^?YvKkΜ1s6˾6Ыu9v" V^tZ-%7/V̚qۦ97u5oMP+P^BS{R#|[57ٝ>ID*so>RORRw_8^_Oyc܆UȉPfoV?SgU2p zh'+yx1Y2Pͳ9A_~(&5B~1,ӓ{sF?́Pww͛d1}JҷT6mT(/nd;]};cm Jg|(8mTǪنyˑk"nX~ahԒ=46y1R{ c.NmVw21" _Pu 8Mf'ӈ(`Z;TeϪU{^rG o+tʅzDl~9ͯo>[kx {zpfàRGk}|,;Z(W#kW^Z1abqM^'^1\bѢy=_O 66S =v GUs:Z wYx JDI~cx#-qônt~7uAT  9y-{l쯽\#a*9+GǧmVz>TaW]@7A=&:6ʳ+KG6Q4y(Cg5TګVcnCj 4%5p9M.!`Y!=c7lx~j=(u'D3܃f!G7>[E!|@KM2`Ї s\$0"\$uLׯ_q祔;9A;2OBS䝞r->mHTTtﻏln{k$ُ>t_4ؔWCޠg]f:p*#i"rٶ{_Gx Z6VÐ>%|'G]]|R(zOWmezle a7Ivђmud*g"l0U HOzEQ0'gmFp=dŢz{,ioRtVB>fdWC$}4un/o;rl<~>(xpNJoiў@7t9aH0uDO`#=>CѰ&3F˿%͖=otS=~UN?H4:ATk&ox>*31v>)4)|yhj;f4M3gvIs8 sR6˾\ɔv~-oW;qvoy%pvDuOHQٚmz䏛CT!ꁾ.͋@FQol!YPPsLYno/9SbvhyEÜZ+uXeqщN#Hq6G_q?˹,NE㳶i~ CV-_^eP<># . ؟Û|oEw*32&6V[1'lstosB֐K4o jUy <62xyQ(2[=YlūGUn@_4A@$.8 ӢA3'm+D0&QXrkӠ=狩 q+>JzZ^g(_W3ON[Gq͆&>;E]3OOkGl0[;<7\ ~,4'X'ˑc&ȶ .ݿJ+?d>A^U_~{쌽NN}"sǮZqm0&C䋅iz[gH ræ&DuY|iELa6ul~A#"È4XTêfOWvQ6ɔ@ ']@M6't}<)鏼E׽UWfP&:{~x$&8|bqO{xP|ݸ<`6?44'WQ_(7K'_A蕲2=<'-\+KBR$ϖΣ?!J>\B*xx_-ena[K&2Rfn8dmR.}]n5V~ꪙD]AZ@@y~Pr_2`5h)zpgcrSw}^*#i[•#/"gDNk v`_Ѫ dPX: KʾQD@kz dpʓJUNU󳈫W#FUF2SO{GWdժ+5!(084-nMIZe *$Hp2klylg,cn,4_jftBe񎞫N%T ma9. WpzE ]3c R=˵;@I_>D: rvʫҒXyVHO%PI (rMɝt2&f#r]3Sn C2l~s+y3}Ld#4N-~#O'@{togu5!S|7q'Dj^P\GKy4Adt+3n"22wHޡ*E"4n~\uMK>ϋF΋vѩeK|/K CWH 4h)uݯgqM}﬏k6S{?37ӫ3cnGTLL-j7\o|W:¼gV$9%NjtڪT(xP=sa_W];POr㠋ss#yYK^G8*=ޅ *};W|DA"I%K8g. >u[&D@{_dx?D_Se#% JnsFA$Jc2'~55|ksCoign*N`/P(3GIeq+37RK$&ޮG#߂?C]par;][/5oum.ΎBg5&5uqIc'|JbQͻ~/3ײ.Wf|"Ldobu?:сT,2~pa)4zp *HP_)(|ySK^EӕAXDd)^4*/ܹ.¦-X[u]+$KTF呅c9`wRz@ A<xݶMI B̘HÏ/ d9:D\o>bu"!q5"{w^Tg̵@1 vpJXi.]D"& R5Y1TnvI~l!'dmd"<(D2$*K8h(3DӀ{[ʞիނ=s\m(ph@xt*e0YbuU1J2Gn:sCXPe)Gm\DQathCjRC`dR#Y*]r"y;ozz'# =S&\w.Y]5=#Gs)G˛jwkBn歯n~56,޲]?j$TT!KV;-g|?U޼aL[#GrLۧnsQG JMǏnG~|#g15gsz ;7Fڃ|U >RH!$/͌E'{NI/^:g(V*wO/Z؛\|(|J>}jCx4 fϔyl?:6wӊk3V8o+~NZ#{! ߚ!n*MLxM􄪣F%<0-S2xׁ4Ԧ Q7Gh124@R7ЛL[H=PʅQIRNA|7s?2JtI~ aDh=GH3[YnU l)|㩭{@IQLLM+-/.kɍ}Wwe3+l^&OT&~As9 "EAXt;ql|st;%_VeYl8)c&@K z;cbj!U=ϒ>hӤaI4x3)"{[u=KHc..Cy0N9-RDԧ^RFK}\=hRk-:n}FK^hiC0*'2֛Rl9 Rostj >Fd8uW u%Ԃҗk,ɐ2:t^Ř8s~BB6YV Y?*iCԅm" S=X36z֠f' c"\Ç;5 T[ R=Ȏ"!;/yycDG6@ζX8E$Ɋ)bۺqK]Rݾ/ZIg*j'K4z8Fp耡CɅޏ˃_t/<_S4,#`*-AUgFwhOz/]![NKu1#MeǃȩHy{T6\Eg;YZvLg)&l+ze,K+nB<$rh_!4 O@8R ?.͟ ym.4xAr yTҾQGm '=ρ~VX20A#ht iq~I!" f"GM>;Ds~A~aq9%w3%U8j!9zhhV'NL $1'~#ٹnMrZ4hW\#5!H㩽(͌mOrB*LnAOxr "y,AyR} ('/ k8(6|O2e"hЭraBȁD#X%bA 'i^jE9!sV+F/\C}-15[H`zb己v~ ˜@U MEANp`)j_zőFG)'&c w~L\v[+:7VO@mff14t}~v83!c9q?y;o :Ɖ#|zOё#tE7軄ɐ$lQvp{G)eZ%[8*y윢dxf"kL2#'fưm:a`",t.D/.u3t%eGI%4nNɓcgȿiTfXsGeՈ%So<]Z&SnrٔE狾tS ʧ8 c& ?£ڊwչS.(nXoqZqYJT]=gU=ʄK RKݸCn錜^uY j6 Ǐ{߰'Šy0}g(w ﰵ5'p:h}(lWAܱ-!hDd?2pƾycHd ރCѺʳm.5'3)j\dmYv :B)i*QӘw)G?0hVD5]m$S?R S;7\8)*ty`ĺ<*7>p.E opһ|0mZT!D^#FKRZG/D#mR.vZwilrŊoDm\sZTڙz7V dz Fj,Z  A:Cxcbb͞gj "lk*B3t$,z] dV 4crژA ~\!3=QW@txGKH%=Vpv# Vlqn:S;gK}_(a¦Dc6GF-/!Lt" xB$QDmyqdVqB}Cɰ'SU)\]Um;Zk__M?},,z-t<]9 [>PllHu$hM\䂀ɧNo2w[jӺzuN={f!翍]XDX%YJD|d[sXu0 ";97Q bcv֭ եqsnsv+98?>un[?X?J@ĸ +PL>Om`lX]}X+ y( X8¹ofD#FT >_Mmgp̿'Q$p;/־ s;GYM͐Ir쇆/[u-"cclkux Siڝ J@T75Emm54ȯ qi2kNߓQ^3F`m̙@>AM[)ѕG"ebQP 5{-G# \VINC=WOn{:˒_/{c3ҋl1EuVE^kKI;a5瞧ğ3zw3Nv#.B4 ZD3Si,4s^]yKC1{= ߣY#'nu'2&[txODsġ)ދX[Wd9@n͓jm-ܪ)Rl%shIVFS376Ǹ, k ngVI9O"DL|;wT!p[l( A #J$2ХTZMʻ Bx~3=b?]2)Be&̎2ڷJRSR6+C΢ P,qmk"DDdL/r(v6/gn[4,W{ܞFtʍLB=Zˤ.vL PCa/!j SFwېOZnbLY#c"&8Yy!#ha; XUOȕؑa:~r-$~lCP[_2Y8*s~Q@00S^[k dݸ n". A,ooc۟ƞ~99 v'*e^ԌӛBۇ]S0DhOei 8EBYB~O75]C0O^J`h~Dp/5fZ7;wlQfF96lq6i̥'`dǏG\#f%*]}+JR{oyW{wQd%esW_WN֫c tjfdH[xiGђܧ.7ڛzݒ/1" o TqVpVc>!،9z G~QQF'mp;A]-4z>I38l1 D@:$.!L)F`f.~zkC Ȍ4W*_FLZ]$qIkZ;ᄝO E#5 btфg4+Ѝ*'Vxfd !`)qޤR6OP5X!#[/D)^0t;'{Vv0\O7=++-#u2Xf$b (v}VZ " y5]r,>:JdNǙwCd`a5< Ppemj*v:,pD4tf],.J[„vlFoW-KmZ r/hv%'!׺];&^+j_ʖX=TiDe:ˡ}p`f^vX6tq]C#kPie#v)U!V։? kޒڸ˗gU; V[N)L_z.La-W1+X\L@ÆԾu +i }۝*L$8^oêa]b̽cQ 8H46#ZY >~B,\(Laem# X04$'^o88y&%kqu*Q4MZ]ZR~<}gr?F/InЂ%/5)vjJk+X?a +0@,n$ 7̛yj>}BYwK,='l1"zERWiD FOoxЕcz@{4DbD1'0}+W'DXhʟpog,H]It8t:jqP^Cݭ1ӯ[R`b5_En݅IceyfkClrC 횿&8KgJ7!||LLPe/] 9(h_A.pjۖA8Px AV-NYsI-IZS.AZMv;e)GG zS8U\XXDZ)cmӨIV6a?fRؾ,* 'Dq=B$dbd$q0ϰOvRz,Ƣ+vMBSEB`Ÿج_eҥ(] r*]K4Vx|$[%:) QzĆ3j%uV DXVD:;4BeA$n\oAǏ~0\=BƧI걹B.dg)5&pk.X:sⳜ>b.=}}VUVh8sKY2y7ڄ@s]ӂ /H`%&tVe7A XЬ-5x,Z,t1^t ٧#y b2rw8 .R1a?:Qp߽b|/{4\b-Fiyh? 3%^ zq16sx+n])F12DByQsfviʎԣTҏ*<ɚ윜 Vk:P-$ *){ 1#r?6tɝpPm_^Se h2&AKCԲ X.k^"mY 9)z\Ԥ\3][eŬ"HOIJtBdG<|9.]aGϹܢ*].'e#3cr*>&ق>! 7OS֖So*~B5 _MuKO*X%8 N!vMg_;>nnݽz]Vbe?* 5AZrW_ 6zG-^7BAC(]kifz '2oKr]M{TⲇvyD,~$[(] ;-J6f7_b)Lİj3H< 2">EdPF=~Bq.=6A.9]OvuΚ^T`<˩b1BPJK~0kɒgCJՋmff]rX.#:&,%V{,#oR|v.@}34t;ՖKPȼi<[ ##is2hpa34RyNp? #c)ٗkyQo^+W mZE}յջ3O{㧖Z1 V̝$C%!YfMLtt3Z ZLxJ>iv j="D<3u/?LuK&j6u2Վϰ:t|qcxܺ»_6'3 >kR&gU]̏6g%\&|=um+ vPA?qޯ¨V@fjZMW+Uq;WCC) ݦ-9KNMZJ[=)U}}͈5%ܛBʴ%AØWw4F@5c.\e~uUM*:3!:4<I#THm:>  ̖y)wNE<:Wpgխg ~f*G3Xe;jR^j/@{AM880cTO9ՎeQc"aO/ݑ?hg@!!@|‚Á'Nd8{P )e-YsIАT^yGc*Ça.gy^Fh`A>Eyf mQR66Ϩ=^-|<E&cugC ^|6F7 Ni"UPd-Ƿ妵= L > h;H@TH=!Rvqˢ]N#mI?Ƈ/NTI&i4T5~Fu)>ntSE{(2FNoعIJHZq˗4Nlz뺮$5z(y=cYtBnvz>:a9t[JiϿq"CfϽ pl;;CYRbrlל9l7ԡ$(VN=_U*_zT$iw_>$ۋWsX%HiL-86]^@C]4;ċRʘ.J˾;|Udw2lUN>ҥošEWνק_~ NahE "׮]KvoaaQ- tWi*N]|qBѡ1P8@h(Oe3+ۆdǎG/O݋*=JY-P9;tM!#_% [2p.*ԻU4SY$o ;@?_Rԥ5YͿQ&z^ækUl?[eG?ZxMJ43H s]>^1p`i;=zvAc w[Q:`r%V٢&MlJt]iFiINg' 4o : 63.jIp>W +oig;zuOːIV|Y+5"ɖeD7@FM&ys$fި54ϋ U3k~zkj[ʽUO¾#.kU"/]t B7G>I5o]Mz e`ǎ TkrӦ՝f-|*1QjN8P/pNK`BÃW,i >! <[Hp?5ef:U^ڽ/_[T;kᣋ6,VX ~8:}N6Sn`k2KVV mCSJ>\"6tJ `Q8\ ŅxE )ꩡ~A'߫2wxSvNk?!BiMOSk"8s[\֟~u{eVr٦캝*p`貿^;zG]S^Wo~w繗&ڎr4xBa:?&,BĢv` ٜu\R{:̄B8^o.\[ i?{宺=1OHy)dek_[:ܸjwk ֏6Hpx?eNj2EMu O4 "!tX;>ѓT|] & 7%4V*TMWohǎOG|h6}N_`$W&fz:͑E9fiK̿G߸ ɺ+c[%]f5(3{SoF6,WY2~Z;lvoׯ%‡~-OQi &occ͐O: P.-z#Ĉ0?=i]O7+uGoJIo)-QN+OYqT-dGG_/>Go,՛ڪ<#XaW=X-L!BTVNx[QRt%) iqk"GKSKG(Bt[B直4I>3xsÓ\ͺg^8rAAϔC.JM4}4W'(yU?l|L5ؑcg¡ *z7ź6@#jROL`#|)uƇU;N{ CG׊ rՋ{@T@e!E@Vb9r̻ ;*#PcIщm0O6 8^ `,"KTg*k/^\R#ٔ㢫0~ܖWo&#i2rW>ӻtd֗Ԝ^U۳!%W؄(%ZӜzՇE,#+o %t¢6Ɓ%6A_'dh)Ek׎bQjSZ; QLU{]ѰrsY-DJDwәp|Cltm~pj=]nFmI?/*mar=o+cO W"Zf)!ƴh2!@ I͹9ˁՅCh((jDza3.[!LHwa]_Y6+3sikon;7zֹIo={ìfn? 凫On^DIwֵ?ZBy)IuUo@iWוCտg2/#khl[IWdDhЂ(kD!MaHJH4}?w]rc眙^>m\@$=7KLe=[$vn}eCi]A,uǢo` <4䀎f[ 6Fi:0ٶ³Tѿ"|6 !"5 Les I ,:u6V2t[ `)DmOo֔<|×ifoe;Y-l2>xɗTOw_k SEk `!jo/=#LLwAQ^%Y.&"O&`C Fx3Vd4qnK`TQP!H P] V塀i/ ;x ~i ǬunZs=2H/Qz"}jz!_Ȅe[AkKT03ق+i`)<~`|xݣ]܁+8#eIy/-w-dnRRDo6Zחӄnv} Y9f!TSSi:KI6XF.Ȥմhh㽥20hr{xf3 ?GW{Mr1c%=li ([҂)@}ȟKgDFBi߬dUG^y$~c2qAj ުҡN5v|dTY|rml(1 Ab"|ӷ\Mʉn*qtquEf_#3O~:|ҿ|&81W[\>0hgDShl[gLjJ AJ X ⑄W qDfdjV6[(|`TAh+86q벽f{$"c͕=|mqd ؂=M 9>z_ s̨3Č,mc j>ێu<_r 6脷sƶ9a3KA쩠nsŵ 8xF"WU yTi\Y&Hdb'.y 1$%X·a?]@tGLa;!A \T˅g*+u]p!/ j ,!;mҠXfݕ%'%=6ٟH8TMYfxEA-Q,7^QhsL Q=j >{}| Q e~.qKin4D˺bX 4FΫ`9*#ƾuK-Ι_a̯p-zg"3+Ľ$!;rhy{>[R0zwz%Ek f;U?䳡>I r:rӐ0>_Ϝp`mf<,-<@KD'0j-F#+ @d9+Fp;B0mPa2^ ذ{C DE5(瀏[ 7+L_\#DUU׌nHLi)0%-d6Yq:a؁z(##=[]62,btUC }g=쌗n^U`WOš m~hAB~66f`7ho)qF2 ,T) a%8!hޙ3÷n#2h^ӿ? ^@ˆ4ޢ.uRy<|K'7YnToG~FL@af;P[OSK; {ΰ71ӵz?sf MMJ;i׻Qvxr\ORN  ^J򒺫 ?#teLRr`"b{ksIcԌ4^"͈]p6'OX|ĤM?ʯ>XKe_ӡԨZ!{.y 4g;_qPoۦ-o 8NTJE+l*{']Ɨe_;1x(P2 drX)ZZ~FqJ5x}(]w1QRUVI2-=bts&W7Cc};vp8l +>[)#/mw/)I%N2N<څޯ8] /m Cš^ZVtoIm`s%N\f.|g\o{i*+6Հ\} CYQiUƘ\bKzR)U{b V%Y HDX;O.@&deBdfnǞȉ=Y/ ;KjsO^'kcߴgFGIT*_+qEyo:iTFoW__&(5*O^O ^Za~)0OZS6ʀeIY q0 yhjtG]Wnr%kPdBN`P7-e%#&P gyަ8ִ_ff"^ԩGGMWХ~MݝՌnwgvt[^E>VŇJd*fnF~$w7yjˎӿh9[.B|6+MJc#6­ٺAK:Bn/,c$2{ [ |CDE ,W *pVzcA#9`)+9(QN;&  #fV+:s f ^uK F08FDPjVk&^No1NXGy\A']Pۈ7eǎI~Er). םe*Q } )N0ĥr[`Zh`AupPI4%Uخ [gbʳ\GO함pSm͎y -i9%\W8wH _b+5n15u㩨,LY9ZnIv72Wbk7I[zE7U Gl73Oj$f:LRK^dB^qmL웳:9P^(3O8<^{0_T]p/ wlƲf91v-JM m^|˂ӀAo@8 9w+{_č3+'^( ް#R- {H@3ƒ`z4&SEԨ -Hxq"M@ w]F cֹ/@Mٽ(]$69O| B3Cak',,xp}oP h "7bIGԠ^q-@#L6PDƒM}ݕotf u;߀LNc6u ބWk<pyhd$%Q otV6l5swYv 6xRB6 -[ħpR^ $ X%p+-{m6=YÖD33Vc (Hh큖DRxI5Hv3oΠgl'_0 k[ S?.u]"a2jOc;.G#\_&K/ oI>^U 3yKZݙc}U/CnA]~ؾ&^saZ^wq * 4.?4ۙ2#Wʭ4 K\Sr} nG y5|mTmi7 zMbj AM0&S L k L 9QsHZބ?b# F;Et u -V s3…LW\#t u"cB*p%pJ)ȠLM]ai,Jݪ_k/ a!q(}C2qH<+20ٺ_lq Qwu ↧lj Pz[L&FzCD_qK Fl2= U 7l_0܁{p $~_@Lx,rtׯK%ե:-@-‹a8+lLj??PK(/dPKy.F(angular-1.3.9/docs/img/angular_parts.pngS&Ҁ m۶m۶m|ڶӶm=]yPWEdU\yG$@IA^ZJL8߰w; SZTTIZTH xYR mz x ;=-=#2,+22J,% BIXX\Xc{:sFM]sUN]Q O; ޴DţH)*Ah~BetbsNv*(湗(QKc"VL-P &fՄ8ѴjM+j/hgjhhfMKOD"P8'Pj ?Hc9ax׏b_#M7gl ,J 9&doa,5~a ȏ_-f1-lkk5ɖo뱡֢ȭ ' }|LsGt^ZE+X%l"~|/@- Ј0aOOt+$vg0p0G ـ(C( haPU"dRWbT40i2mwb~3m[@֮w^,웤%ma&(hG0ԛ.Y9Z(x!r| @EMI=R˵1}4]77V 8BoIw" E+$Й$8؈^03KbRunS㊣)}4QHAtCfq>p Ъr=#u]؇Kd 7 TF . l O,X '~ j ³_ H O hX,A^ D(h°GT(Ў+(py9O+`1$$9(P&_sėHב@bh$Љ1H1p<`0)$DO iR%,8QSiDccccG|0!$TT\ Tjh44JK 6b6VM<@A3"EE7sXpT13Fr,aAp̂uZtxUC>Ʀk,v02!%΅ԅܒ'l<Hؕtg*{+ &զ .)$3-(P?ۨ:)20 s%yyByəܙYނay)fjKbcaOh@, ybTe ucHѤ8H¨S\aq8$ՔUdƸWV}sR lӘ==j8`lm*e-y${N 5M)n?"uj|[F9-NƝ#L옿dc&i3/VIk$̷6Z,ǻZ3yRdKF-0G5_2s'gb $4Dlu QE^B5B+"B7,+PmP<"h(Jto(dudxj|4H((H~dHZ$@(]@F>@nC.Aēt$BrrbX^_[r#8N5:4325a1f@IqJIGHOK#/ׯ_2 +Pv@\5l+w*"p}@@rFHDK:SZG3haB72w*Swwnt:ylmΚ+6r3P P5G[~}|}~YDX6Ȃ<DžԄ _ 7*~C2Qdsboн,"OQF َhRpLq å-?^v9UaJ}ʟKKKqK9/G3宧C$ %* HC ]j9΄en%mwAJŧϼf6ˍaa(6eG_n*y=M.%ޢa`SR#h5U- Lv{М-Mgo$-f,ޕ p/mэo5f??sNƞۋ Ost# Γ\;1_楇N2T9Ӽ(. o1/Yom,_^8nW=oUOn&;E]f ]/n\,}tv7\u<~p/VYV<]%WFj;}*n*6y.z?D0zbpp|/OUiwwS{O>Rt r H&Y`g67 OTZ[꽉MnsG|;&HWF,ǷNO^rW]V e(98D9lll"l=F= ;F9F8A`c`61 w+~Bԕ0q1,5Ef#AOrh)(YĔl=)2KW60<9雒^49aHDOƘ#O4AqB m":!t?`= mλ$/,[M~LUF`1mK[Rֈ\Xwvu>g?IJ9}@Q|n{}#/SLc|ID 1 O7$f=J?^7~w#ZDDd2$GFPr{6#X0.É{hU>{ƐC﶑K-5=j)9q\iVwS6q0uVdZtR@olrpK)бmܪ6\om oe{VKֵKo@c$W}cb,cOָ_|s4gN\7/[ ˗h1zbTLnF܏*.ln)o`S-=ne2do.`HԆMXص?)7PCGlLz ^Eh"wrFNf`hl^!{)2; Ө鲉V0|/RN5@0<(S=αff+ʾ))#\mJU:W=(EDImk,Pg`x,v*{ۧJly5Ԝ]/wΞ_ Î֛ӧ'3-)X6xnC<"-O;98w.no/xNox^9_dsֳIy=xЁ_67 ;%=ׂw; !)w!؃ڇ'=uo;{ٻW-K婴W+o5H6}850q}?X9}H`yҀ?A_pg:qF`AhwH$3'MXԘ@[,n=t\htE<|F񁫇RV\-Փ!U*yyֵPaxddS7Ė5nyjpJQ+G 8 lj6"g:[ǕU5Y1;=Wtt6 W6p긧xwFo{/1WzU< Yea{ueK>j|O80rٻw16kqȦ[;^zL=?@#rA9-!Xd>lvl=oI=?>- jxu/!;46!Q=S,Tkp[%fɥfN 7#6M&[i x |^ֵx^3_:%..CHV-r HW&ǭyҦ&d;QfQh;2힞 '9NjOf=ؗr&lۭhNz|Y10f064A7+VHʠh+F8f UD(%;QuPh>VdD %WN.LL.PiҩI4t MUK]mh>AŸ2.Z5<D^rз^-\^ű* 0ub]V>=t=t§5A-[Ї!Y}f{ZS5}pk +rnX%N~x}t=:*:]FO1E:-&~ײaߢv\Ţga闉63`&™֝qb rV(]L ]]6HB83 l `Gmn+o~OjtU;k y=;Er򚤥K@(T)\`̾]{xuZ{x1-|6-/$%V:'dpQ-0411 : i8* ۘd#-2xUߋ^WE>oS~[ǭW}^MbۢfCR|I6f:M{xT#i:a'~lUmVytWkڻſȹt 87 6=|oewt>,wYz{YT8=XO%+ ]b{*?,r,I? RFǵw[\+k?}Z/o g>\čO~M^ZAC[}ZHPbyC]څ޾13:9yuIDg~ֺ=d FcP{H_S=!~e<}\}xnV{_x60'sI! 92! A9q+yI*8[$5!W_ #V>o0y^}+^ 9 AuZ+!9؁-y!6"{!>q81.(-7./Zַ9mxl4,;@F_^:^|;~GM @Y?A0vx0PT'D^hKu/aYA>Om kуZ&S+^ĸj9SAJM !S cqjx`!jaQM0^@#fa(q{i 8ݺ~hqDSAA<2*ҬR8!f IoY^hV>e!0%>Ը`!&M/yC*0n8sg8TǬ`'&18z^)/1&Oϟt/utO_}lVjt)(B^PO=1^H.YtXMx$Ir'ӒQ )puʿZ㙴*Go*>%n?鉾 NMf`XT?&3^1`FI'UtYmK/0A!Fpk\.!RNMp2oF-odRy̓t{6[Su_o?DsaM̅^~ OwlL?`:c-3╔x^)PyKi( Sjz[XN%΍6adF8k/9dߒ׃#.mv:KSmm.!ֱ>#zm1%H6mkL~բ4Z~I]9KRű Q$8[5~l6) &gUcڱYR>[/?L eooQϨLKMW2*B;k]LفoNً;h<*&CGYd̝kY".E!W]}5+.>tz`(B/UMc,c #(ߓQNePf n%$mu|dPpFu6 ,g2yC=R[KhZasx#lsH1YΆ̝ bfEԐaUy1v B\og6Q5w ɘt1ٱGujʘ,mPIJ6L Rl*{kqw)46u}p0Vux_9CK΢aw^1[__8??ZM%;ɶ9vC{|nfIOМOˎ/ik}fV 2oha8B-Zw1#QM嗒}9S`1maHY7"kS0Wxr㴜 thљe/8ј-Z)%#|MɤbͲjۚICnL}S3H6uo*ua35V?뮽d"TEhAH2\֬x)ᬌiyj٧% P4s0$h7ـNq87-mz@o˯2N&50i? E t,$5QG&1>JD$  .j䍚rX7tb3O4j#2Z6,'`U܋Iı!!q)yFDTTlgד~xpV H}" i6m`*W=X[~ vq\Uqa31Xsk#q0ILˤ!Г_0'ٱҕ"[)O"]-jlML HVonG!vzSaXL"(nk?QRgdY(MJ!zΤ&!)jqnw%e%nTSOz\.uɕFGMv%3ᮯ-`k~G;O#;JkSkC%1hebΈϮd;wMeߛEf9o96R~x:iZ l`8oI26-eIzjhGJ ,a }m|/N#/(rn/n,Ee RtϊbR[fp'5zpn8dTyl jb4ٗjxj~Cض!gLj6D0UXS/:{ǿfmwWz-lb& )f-RAXz}¤GK4+ɐ:a^C 7.XaЧt߰"Ω)ymjIdUq݊VaI7 ? Ky}mf[/Ҁ<.kjێz|z=WFF򍬒%b}Nw{dؖd覸(]ׄyHzuLJݾLMղK~ -dH^hO+ځrR/f+Ƒn;3g0p䖘ݧk7+,~ ` ͵w@>@`Ȳxd8AG 9߬ Jħ "+")RfE"EeA'A;|ruqR\ڙ?sIw{d$.}!9# A?kX,?"!&7>H15Jq}X~zD_>aDʹ`\w.~dӳ2 pE3 z1d,[:^Q8JH=Zq40/l\LCn_Vp va0qW `[ =*+/A'q\B 1)/ |/rTy/5]!mxEymIP$|D3Mb<<&BgIL!!Р;Qj9qŦwj6 ]s]Jт=_)DLĬ£`=5x3Z ];H>rԞ9Lon}Q|)'d8: Y7jcLqĴ"im;&GܙKM3rBc*?P@1 `iJV\'jh=Y]p`q^r3q5᷈Dy7%3[DBʰّ(UI3 [b0Bp/$9c:uAy%6*Ye9C+a2^$tFP=&Ac4I6<$b]T:^2-!d(ӺPYoLstTC̔Xc좣ho5/ '֩(ڄۑSk YUw߿3u-: {SEh|^k"@i?uq!DQeQ^6d^ߠY(Z!V1q*f2RW6I2rdOfQX.$ᚧv\tN%~Ecsؠբu@9X d&|ï{+$/ @FJo]+"tsA]IDJ>Lr|d?SJ:dGAGXNADO^N2&!+({FyvOzՏZpVϝ䠰ҝQ(W;nN 4\Uoe3WS:`XS/^ad>RpƵÝԻYΧО tTxDُ7nN@2pr\T:8~>sca蠹C Zֶ(jMnj:JlC66KzF%=;sb,kn_pgDvoUݶ$t7tȝŴimXүNRX!3m^:-N?ps\6Q:k>;!(@q&XB}RuDAx^?g. y#C Ae*UlR~D? R@BIǔ&w@ rl{ԧGk@4_&RҮ-->p}[0.Wwe3|5֖7(oGJXm%ztDQE6FdAm:wh];#এJV\} İLM',3Ŝ!2U:t zf`"-V򹖌oF;i~'/%6T)袕wm+י^6R丮ؿ">lF7twY)&Z,!J Za*gvahO۫u'm3]'Ӝ Pm.cj`ڢ XWit U=FX>+o%Kv,I#Ǧ+nRZ\a!avk'Ko{m&-0Z@"d3OnniՔ3 {"Kmj$&l}egs}B>M;yPƽ29=PSJG%:Erћu\/!B]D|V,0J7?!1>N CNh(}:"+E? |&=KcKv Cާ%;n_Q?-t{{cs`\ %^\CuBAH\v(41w ('`#郖RL</ *|xӨE DR_Q3wFOP>)iOfi,W:^4)JՕHj驾N?{}33 BApύ ɨI5c --!DH3Pd4W;"+ϋɐg~b:Fb%OOO?tu9^5C% p8͹;|m<0E15Eȅ4⟒EzD__0Yq^Ȁe}1I53P 05P3_qh lIqٞ L>\O8pzw鸨326Pp=s{r%Fp" ҷ"Ux#I]~-xZk Uvx2(*뜸=B B!\4ObG  ɀ$,,v$$ā XOP j94POY;`g)GƠ.0&XIrvL W2vXR&/'A5M ܈\kB-7}NK--keYA]WB'4/mo |4XيN%͑VPD]9z]WBDrrQ5.6!7pཁWw < o/ζC5}9;õ X {;hiT|O#p?1HqxUTXY!0~Iz%M}9v02҈ F3^$7EͿs^Nz: OCԵʂtXn_.\4Cb{% ߁{jFEѱ"("G¸ -YA6W=! )b(;a{^"=4rS1 ˋ֠X7e3+ΚB!Y{!7vW!0`P<%Ɔ~ sWvHk{4|sLjqT9VmXaYYq$RӠnC3&Ŏ\s!bP|]zHkSCU]ql'l z3:|,n{8P9RIΊy.qZFk{^mb .X#{~rӖ;!ə/Ctdӧq;¬rr[ ORJlm6&Mm%,\TsXȓąJ9?i~iGũ ҷ"N] 4o.˸0%;L-=#!a 'ލ*eQT! Jp+9]S ?l:ҬO|gOY]9ĺ-N= -]$JyI?ϟ,MQT ii-s@x0rE]Z/# -8YD7/GayrY˟dAgQ‹(d :6z$ 3x_F0}ʘ1VXO>;O 1>7(Ayi+zȂpX KZ9%Ʀ  򍻤1P݌FUшˏs7o~z;7Lթ]3S.X{DŽАYI/)Ta_BX9(718/2  _j݃N%pZ$t}$,&Sٱ ?%CT8善-((#ErV>2:*] Nq}}r2"?4E/ߩK'ԙ-ML DaeiܚAv+!ZJM4tKN1+1b<& On"|CAT'S豸.lcE.&vZ=%"B)-fw[KH=!M-2 qȭWcB@ME# BIO)~GScݵX接N@r֋422c-C!5󥀁C( gPt!5ab*ydqo 5Wt_or&((ĿZ/>WޞGX%?bW(*c.vbGgt4_1oB [t֊4Y 'hIpЏDs-mw*4->\JX3*j B01'FT5JI]RnZMD?;~B˶1 =0w5&ʲp%}Ɓb{i˶j*qjq%D@Clg\0Mn7`bu3,مzI/x1jlg!nbK+ݰN)@/#wr1EC mݵs]?G9Sקa54Ԓ;1~M_Px)MaD: sq7Ÿ'v&9{=TeTU_Xk86jqQHRT 7eF؝8#;̃0x6ʲQLoimH톒`-+=Fme"U:#lIm3Z;\gkL%&bDDx阡:t_@Ȅ!@Ш%dV()bX`w^$F @JO'ɜ "83qg"aqS`)<{-6i WD 2=nŢ)OW($(ł{!/*Ge$oC}xtXx:{>vs C~>jEqQ1 k%P5{nn+}Ɓ9ay/[4 Um0 66 Xs`[!5& GGs4)PHqBq_h_NPиe7B/Kc`|~ kAewҹ#3a7AP.j<4W8qPӎ&$6"`}oc=I Ʀ&x4XlaDU&w1,=- WqN g =Hո[w|Cj :s#p" Lia5}?+0hk-.aOvH\G;w :-" O ;iuR $: wJ}2 2d32ilWyAĢo9;ޟnc(& G#E4; Ѵ3|QSGI \i]T_{㠗,8o0lh6--g#hTm}B@XɧNqAd15v!2 YBu,s'pNtϣpLmoǑvXz#R[bK\PڑC%hfnF(`w"\6T3;'+ a hooޝjp{F&@hF q63Q`a' }2 9ߏ}6'cuq`D܌@O 4s;p6cHKnjݾt7Ձ#pN@t%G#^hE^G#p,<"hsP_\Ʈ$P'zE-sZfC 4wi8ixğ\AȤ{*>o罎R~~~~JJ]>΀&/j/J;|pd]Y膬3;|~TsCINp pO!Аħ`Fl]KeG%/A4h D4dfJTzUh)n LZ[IFp*5nqȕT86T2JF˙,)5ܶt+l*s8US_S(:4v$W~-h8SsHa b*Bf+92NW9D6Y;>FOmjPP^#AV^^ R wl_0p|]39IAtdNw+ނלXT ڍ= RL+2N@a""l'<>Ǿ"˛nq!ce"hE M/1Dh4N섋@lLƒ_&cs |JD#Wc{MI-ҦoT,.Yjːsz[ pxjM.%d(uQ\= Z1O^ۀzWȁ'"ׯQJv HF&}4' uHWV_ #xk&H0T= c|.;NGHpDh~=a=s+/A~*LcCՠ3B`3(R==0>ףjRѢ-Bȿr=|#[)`V"0N oɋ~ YQ\:!O)<*̸E^Wn/QMσS1*K3Brd!G"4Gc洩TjXwPWU3᳅0WmEUpZ[{TnyvRqa}W(/>@ <l:gAIҡ(-N.rEu`KDZO L_KGg4Is ltx\lV v M,‚uUf.JӕV$Fz=ޮT;;ޏ'Eװxw$5<$n%0?sEP2sERQh~K&Fя )!aR'H~RڥC8Ǡ#" 4!ñ3w9ޥI8w |Ombv8L&r4r!Q@hERwI`b AlCd4v^pG#@:G"Ҷ[Q-rJGĦ(tĸ:EƈuLvh"C+} jV԰{-x4^Sw>w;!`ݳ(%@ZťFgCx-E8FL8wYt;p +p{~N&A:P6kv؆BCqޡZ.'Z4B52"\%P4 ~hV@oѴTNg/Z\^*)uMp}(AC W{(\AtR3UBvq!J +E6Qaj9G*A :W& 7"*9j:am647U5Dqyh uA7h/mP-;2vv?j;&(cl+)@ŢR?cBCm'Yo~MMu^F=q)" k5:!s9IeSkÀK&/ۇ-봺.4>ʱ>@ fL誰4|^bMI!w&E$rD%= }f \"ûâT8;q"N }"%en}"&{U 2-ڈם o.ۀ#{<-eP&z-F[> )E,JDmI& pIv彃a$r)Mq`x[pC?_=9ܱh>'zg j {?[8zZ}цG+q  T.Àoޫ0V Sulk[C 48iMOzZ :d@`q/g-Mz<"Aa.p `'}HwV3HnGS˅b`;=O4 ZGpDK1x'zqGqK<Nv<8)CU8 yp~pDh7[xxy1^q>>G(A兽{Rc'1)( >[1H->eI=ʚQRVͦÉR?.GʀTHUԞ|˸:|&;[]PcPyŕM\{[Nã|"J-Δ-i|>R\[1kD#.-kN`Oy"O˒$O;e2!\+eEt?nwrѦ^;IdJ:]̸_wi)x-=ɐ Jn|%}銘t"JՎӏ]LJ\Š=ASc;b{eR;,x%=#<#d;pv,Yl[89ax0)klW_(C4i G|₸X_!!'6|IqeVF΅hIģؐ-xHm)%?MT, ߍ+xK_<HG%M?G?0OTG&ֺKT$s4*+b~xLU݌gt։=s& "Hx |!p1.1UXވ|2z")& kG\×jTf7c#GQ5!m'G#y8v~1c;oP7DE簧%)v ^?5Մ~,}0jI?ֆbh$}<֐'w>i'G='D{LZ`!:.~tk8fv8G6^n?ٔa98!t˃KDK6rwVGCJ&*TN"/]^eR!}jMpWьV-IiҼCJ BvBdj{MՇvmu!{Ms⩹7Gt Ie5i\ǩ*qhNùLٱM`{*Y|~&h&!qz{,v֒_1t]' wq:]¢K<\;dځI[+#N/3#0|jJ.LA尣,뎦xN/`l{Ì hnQ.A˙ \+m@jQ담p6s4}ЅeoFB{(+uKz .ӡ'5g٥U]<ԅuZ*TC{* MhWzaVc]|qOѤE3M$%"S]$jAe[q홟z Bf?z+@UUgꋵnl7c(tDg9l胇^{ L^~fɈضm.3t7 @Lވ.Ȋb4&,@P@Ad:l #Db,[5uNMSF}gZ@:]Y\7BuX~X '˰8Q|X,O5Hs.B "&Mݰ1sUG_:?Gît= Qnp2{0Nҝáj;Fi$gFc4|A`\D@X ̙M6GP(~AW5֟BtFY_ $iFK5D̄4~44j%HL斁|Cj3JvaKKe4̙=K΍ PDBwn]D!s]"9r$+y1q"%DЅNa%SJK /n5ԅ-ˇYE~#|; @>8Qc+o ^(&B*ҷ]0Cj JɭY}@#]Wqo'zʛ8sN.9fTvAY~-mE8`}I\ Y[3LiϦ܇\.’ H܅Ǽy~44uGw C¢7-9sjM'E.؍%dtÖ$ri8˘u>9ޱ.r oVY" "y8"3_C|'xaSQ=h~{ 9x MjxˆO2qb}MFu0{z/Kkl>\""#Ԙ gmr<83YwQ ϥ!THY?ȺH3{|4-OF8$΂=AAA8pZ[[-r;Hw2ԅuaDW$(.+ d[hC EYpP@-GbQ27!xBNG#e[;Qf r/T20Yy>7 1PT~Pݯy!!Y0Z06[93JFѳ&X_Ř"26( 6bFd| aEz|OP9Es64Sf)C=3}g46JzY8$iBj%VZ)8 * Ȭu=p\\K/=62RE\Z~ƗQ#o6H2#c!o u]N 0#Ki :x3--Eþ֭G~#>_ܶԩ38G"- "f}6墍gkpOQ <.H]vA(*{h8rfM(dqf8Q#_<|c{!<}(E ig>B6Q۷'Ufo8g㦧yx -D5'KE?4<߬S#e>u\\OZ$X((SF%j [w}p]Y%<;3-n#Xy8Ӻ ZHB֣n>!F?댋.j[D?5EDL:>kM~ u@?,A3d!lEG3㊕pUe Phɓ4{'GN|uh8m 16W⯻ Heז4dXڏd]U쉸ZY8->t,q"nZڒEx]?z3Zc+U2 G1"իMXn!'FCn_o& hIOO/W6lڴIk1f{**km4nT sPvGwz[ѡ-G-X^Ėq5RZ8vi>_ ~p:O\+Z#6NUqE\jYq+3t~ kY<wh_n$q.ogG[J<#?he~4}VNˌ]\: QSy (Zb>sKD Qr5詸Umaah].څ<<^E QFEv3TIWԆUci7+΋!zh;&%"')gŦ,ZLQQt(u#۫`TlE}FTTTs-@ $x,-\$~fUӒla]ڃ >O+a}ꐂcߎw}ZF^qVN9q_Ñvb<~)89j i8E?)j7>H<ń\ummj.\$Ga@k+*QEu!|Mj!foOETC-,@ba z]֔hnaG8\c༆P#*V5juo˵yeC&?򹺨H?unj6p);M̡58W:zF-GB@z{.h^݈[>CCytCMŊv SqǮwQTR~}lݺC )XX(]Yƚ[S V` |w -dc㧎Xx u;9 ~%'b8*VLGUGX]r"błM/󐘘i&fBoiuFZy6(: d,믿.0"q5]Y@6[X,|*{k6ZKHM݄h ^sZD$^A4}>|z.8]7#hA"7#d+' ]}Gƙ*},sм/`,%En716Ȏ7 {shv\ =ٰ:ϑrڸ*8~ 6^!~]L *z2m$+?quG@Mslϰ%b,P ˄-WXZ @]Ѝ;n9OImuލ}תS[G:Aa{H/ 2N <;/{TޝsǓ,-Njزo-> /rWIEpAyG=s$v|ĺvs1E{-&3Pg-DV ڰRi+)Bwj(Uσ9׾x1qxg%y3<;c"H^}1h|liژmz VrW7c_A)W[:hxv_nA>cħ:\&O^/w_u3a}o0b+tD_ ߽G\YBn)#.y?ϮÈ7_Ð6ES7˨ROv RŅF+V1la^[XyHc0V =s4;'^|fc7&79R[=jSHڮRa94|--/XFUZ~geQ~V!y^WFnF#Z~{myta]ǣ)TV]*⟴sCkBhKb3~|M@hY/= ؗ`Pۂ-+"r?Mٲe'$y){yrx_!X7I ;w$/5_3۱G7v+sI$_)O9$r> G 7Jڋ_uXw6\72y=R. )<ə4XUڿƌ,41bz'jÌ hpi] aM_QQ-=Es5#]].½@,oA6dtEOI5CnGy7~ؚQTr><С7gt?g?0;âpIVmكuhs>/Ӱ)/߫'nQy ^t?_Dۆ#h~d3@{] %1>,SQW@ʗƏ*zi{7"ڋL}|;*`梤G{rQ6_?s{4o `'r 5|[K+0QL<6~w"itwWmAƸWM]ʻlѥE/DV~5b]? '';NT:H2rJm„1nk`Qua}J(,*4ȣ0-wQ[3G͆Eփ*W@p;th6g23ՎwŒgD_ œ,~!:9ڐͯuY+f1-\@N\fWbLw^zܵk6}WDEl% έ jS/8 o7"dZ @pavWx Yޥ7p7+6nGI 3 -L2hgˠ 2^ ";:.R42q<75`wS.Zt@rLch,u-1Ӏ}T$o;|ջQWĩ`dZBc0=܁7! ReZjƌSR5\0@ =Bfèwj3Z!:NĄ917m<~ `;tm?9Ly+&$x8 gp¹LOfx%_Pi}MJL/ϖQx. ڳyyLs+neww$u1Wa(=g;LMLSLCRN'-uo:H|x9CI-Nm%}xCqԊR?9TV,{֕gϞLbŲ۷f..H9(l@ 0p-J7e` /ʆ*hy8ɛvICcF7J9e ;k@7}n]3 U* MKfbdU XlcAojG~j,Tk4% VKp(ZDВVhWX,r㋮0(ᥫ+ɺraŷeM"|(ى@t`gG0˒vdJH՛7ϩqiA T`7y׎9x$}#:2LPS8R %ia8 ;dYś4lH2n갞I4œ8jn2ECۡJu.Iy߬TTfM;#`UI fC+5/7s'b_w^^Vd[|Bx%HY31#胲5nwH#t!h6SSRk6-2.!Wk)ЕmH6Д? Rh1[B-8y2 J1޿2Avwi})գ.ɂh"S뎎ml 6因o8G%&%]_O3^ v.&QSDf!C/J?nB+=E,|k,hW1Vi_MMŒel=f=Uy҈h9!PZ 10+I 'ӿhpp"!Bq(Hk*쐯(նz:Z1TU<`PpI2%՗Ƕ=a ^a=drYN2$>T}2c:1#`Ɉk~?ޟjb`ԴLP0gu M-JXc)Rd\w8*[) @B.WP5M*^& a'D+N1bRҬ<_T.;|(h7sySW] ҁBUy">B2":N(LCibr9q 5o qboц#} D!SS2l{h $1d.oU(֚uH[SzM="?وF&#G])dhDh EO!s-n*o#(ߤCߎ l7iFټt/Bۂܠ vL[XiR`LqRkM%870LNԇm(>9 nC,q [Eq‡R>cKܢX?9% ^U4 AI„PcxݞPM]4%7ߏA #t`^ czPK\:}XkOnoNЉpQ(*̘ # (nh |&γ#"Rrj|w0H&^8KJf20L麭.ږx-v+vPֻ*f}smB ?"Ա}$:0Ci.,j2<=88@WHi!ELBjG`|<i4f0a?5S䛴'arHPLfҺ@g8ma$rwm;SV! br/a:(̈́'eb0{G}1}(Q/O3Cwv蒦O)X9;>R4ZÍ9eVfs 3?(f ""Xs;g1K^*k`ZTx7#qf ~@(/# @ y2/c.C?/AS}Nm7 䍕Q䡓넰!1ҸƉ(E6,?p9Іݾ}7i=àQoQ[2Qw?&ČX8d._5%eƙ01)ճCc2@]FR,f%̤~]|C?1MoL1N7@멑n}(\Ӄ&5X< 4W%.Ό.DNՃga ~ \ۋ]SD;kn"l}u F &1f[Fׄn4tg asD\d(ݿ;iŋ}i(=asӅ56Sbѣx?co ߐJn!KήsXq'I؁E&Nn V<~h2W2%рCgaDžK*Ĥhb EРDwKCGΘkx sp`Ϲ (P Wqf3޴љl:o[[YbJDV03Ձ{Q1ftƥgk)\"dgVyg ~k_ܕoxғboħ#3IDs ԙ!*EO?<< V)Bw]>6qne煗{FA#nPql n.qmTYl֛w6 , _YMTTO#qtaEFJ/)I>\|3m3HQ"-L*óX&C%cG=}w`܄0v#E&Ub'qkd,jZtwLuO@cmt?&!LjDa;roEG6{SP]yhx]`<(G5Ifa!`( \PYAӍr!=}x(!<z[0OqW!J={ς :]3Rb;8!&l03#H=FN>X0E -b$ht +EhJa $*@x?2!ܾ~UP,6ĝl5 -T&  y9iXs(e'((`.~φ56{IP99tkҀ.N V rDbK{V yYP}K"3SH7'R7U/_e߳=Aƚ7?h'pB")b#J ׁRSgf!ZG551TuiE? GCYƉm'fpJ^ R$'BX:|&>fƀ1_m4K3uŻ [#5oU‚J: Oflg#Y[{\E2 ׁ:Gs>3CvٛE|5EY!FʎWAs4/|-; U@WQoſ9-$Fݬԍ\ iͮ `"Ռ+U|)5o| 8+#BpeV͖,k&F5+KkvsO @G_o K"FꂶV󦚀  {6܌X V\㕇!f0xX4*\ !*hőj{>fһ"C-/ rM0F|>L'Y+l"/ޚDgjd U<=)d_w+o34ޅlR o*\g,Zq kK#><_8L@-v]4!Yҭ O:|8*RD+yc$ /=x,z_"ij0|D%o'۸r#Dۢ+='}`J.16yQ"N|t?39 }=9[ @X_HLyu*|zm蕚"8==}Q87wP?[NW5堪' `v, 9wcsD"8 ,ك-}y(`fr:PY!xJ?z;lT+r-c@ s6+w=;0`FpykE/Ey9GUu_8%{qy(7B{Mf5/NuƇ::j8GusX܁ qRr2yx^̻ZQ[Tfe ػ=No<1h CD Ǻ6G hD}qH7ay򯣀5.k.$# T G4-rVylXd&C+7F6[Hө2"f+؃U o9C"`gv;k!_D0^qB16DMp=7wr\˚GmXpXB2b42 ,Uj)6ibnr{L0uf&_~û\[HY>l=>tag^lA>]I~FtӇR6ր~5ͅ #Ln0]S;@;e֦-K[;~W 7ʘ7YG:a9Cc`Mjʻ:T፵eKb غOU:(5A|~-N AlOܘsB6sj9H! !⟯Q)yF/$4=O}\LJo;esse!VCDG@gL~5qlݏ8_ <>b9a;$VF ё-qq R.`D[A5V1/5z <)새 @ W\aӅ* eߡѓZduL`NeeelpeZ )G JdP*rVUp3$pF#CT/E㘇Dt7wdpM`JY%UPU_U w?IwVPvN.e[,<<8λۊ%uy>,0Ө}c&M~ݭ$kfYb|qw]ɖe tyM6r8 @_ ;ի@~:-zpb ף,Ş$%vʯ5i* VZ|-wncEI_b $H[-W~RqJ5 s]T$Ej2dfp\+%iq뀛=fӞa^BXZ65Uȵ 󜅫m%k[;oPj TP Xl_^vkxf{"=tм|`RO#Lvn( OrH^ָ#Qkwкmek\b2ќv<5WC tXxpe[Ķ$ghގ7Ig Zwv %C"^~j۹[-!0.Q}e{m! Etmdi5!M$_rKpd3Z':(܈ dWin_t )hۡF\?V]v254korr}tFNZz'|aAOVVuZc8?V%Շi#oij9u";aS~]_)&aMM2륒؊ i[ p4Shpl5$$g K7anaUԅԱ2))O#_^= >S+2R.븜!7_4#+OUrofjo/i j7T:랳W_ *7fD@DbPno9}O!byuf.[- ٌ >%/|$eE@T)},l$x }>,Mr?ycyȍy4&޵:h=o4?>h30kvg|=12ҧ#LYX<\O=Xs;ك=k.q}pD>繮c刿 W 4ESOЈ¥x X pmIUj@%ȃ,v)ݨ -!&e:0 vxւHuUwe2 K0"D :D̑*d,vT=ML*)})>"Ǫ H{jz hf _+֫U:5Aiv$8q=ܫ9d.H 1mh7ǑV$ˣRцr}ԘvN>qnGwlzC {Py8y!q]1TAtRn;  +$0VxU:MFڤU1nӦ^}qVeԗ!k#L)%\*A l•@=9!B@Ik*6d}TCyퟭprn7IuA~mT@HCk ]ȏ .;Pi? &Sm|\C7_J)m@gHpNzA6eM9q+ BK nX=fq]QFSշJ\NxվIIKDZ)zW܆j)nK8@`F~qZߴ7i ,іfKcvOn3]U_۴OPMP+g )$k}* 6#zb)-#''o-PQXf;U L(B N ̳×LGX5l~GiUCXn]X4on2MZ7Ceѡڃ;Icٶ M plˏ'۵G%օk.Iwc D|V&49uvw>YQ` !1.NIQe{V(b%h4M)0 Z?γ6(v;6YOZaq! _Ń2K}TL%yO8F5r^} ٔkH|x8ۘn0 C+Pӻ|2a\ [+g@ReHXkB*ٺzȦ7*H͂\bLij͖6hRhoLúAn7j8pt82 Qޒwtb;YJěܝRd_ q߶s)Qxcꖐ[2)#?' 2ۭ sb^B,ol fޮm62^w_<({7aكҦfψ t"~^Ujܘ[{%ΕO= Aq e23-Մ^wo#}7̀}Un|5| 4Ґ3 r[-.mϴ jcsMgW9FC3pCC):OuW33mnXoz}1ngtHsET=3Oⷭ͆H~5Ek?c_x>FO9x6뭆4ydȻ2F)eڹHO(oJkIgH2&%__|}X7mά\JȚMl (>| '=[' 4XS 92OSoS7 Pޟó 7FǔǝihВ. lEj$Z OuxΎm7^l;)ˆx>sltp<74/IVr"PPsj#5y4o[/;``i[IW| [mm3 m_B')wyf!ZYrVÐ4iP{c΍CÍ!a,v%OAe.DY-u+s+Ine7Q&g|3ޞO>B0b Wnt_R%E$]6֣B87ȽɃ[8"?ÅBԷNИX1KT C^)< =_n1b; SlbYx>}ք`N[yxxo5i-;Uzkc6[\~EbK{Q wKĝU'.}bH~nc1lH_!Iq*%_q pqS6)e9{&%\ڣ?kue仅B3DǮF)w,;;Q"If@jIXzѬ埘8Ik|. ('E3;S+J﮷tSe|_|L4,..Ŀ۫\}x n  PE?nݟŴ8E5٬%w 䣓A,}I- Om-27G H$ N NfWonW3ꬕO *Hܮ0Eݰ$ rՑ"'3vWޫqrƺp%qAmd-snq0nSUc[9ߪn$\4xo@Ėc39ozR /6>}~|_Q]6%$NdFs{js-,"s) ›ëbc26nLuep4S긱̵ hi+EXJÀxKaFM#Ai fjxυ^[|Bƶ)~YnjrMD96;" 2_иX5Bߘ"l)BPzH}AU ]?tQ|0|oj[=TW_?BB_j*Qro`$UEE?*>0@5~_Òb>QI֤<\v:]uaŢw#/Q~ކj9arY~(P kgOgݞ, #μ0O>69ԱB)LJZΑIʻۀ5R e a/)҅{ 17u?>/\5o%I'v;jYIoKA?YDn3]|hzhy}phscى}x-ϥ[pdw(k1>=|1͟i'xNkƖ[nvkM30ךcRӛgNc}ꖜ3 >Jc9An2ۭwex`ȦP\ˤLDw(+ YVspXzk;*QRܕzWnA(G?bOBg:ݬKiF^POk@W hC(CpcMm)}ec/ΒQ֧_ `=BMq)ZZ?ّebEvn!KieMZYe@]rMcړ":L /_a]9$Qːf0]dqG<%xFWf͐1OUmct~8E 'L_#Z` :e`r )kaH3/;s1V]cń#}H@~m9'Ϲ(S0pFr*g=QY'Yrl{E@L t2/fDYf@CZWBuFw34GEk.]w*{͋(l}u $@XaI"Qt 4 W.t%bC)cRCY l#$nh|^1@slN.i$2,* fπQ FϏ9Ɏ"+<;f7GxYtdv-f8!mr=ԃʲQ9hŦ,+Oʧ@.AۖHmqÖqg@l\(fH7sg`¨l(;/iJؽ'Wե8ru'V{蚧vENF"Z;tAER")@-l!d8I,rk9IA|ϭIa &`cjgHv0emEoӉcxGR/2ͳ`8]f$ۥT x {z?"dMR'bɏ#Z@Qs7Mn˒;'.wBfI%Vނ*qp?;8N-/>%A`BEjX1?G;( ?QvP$]BcvPSHz_oyV^ؿޣ3De2 v2\KёZQk[2܅-buc9hĔCG~ !X&jr:GWI+$5%j()a9Fn,V; Y-q<~ ޢ|vӻ IV_WI0_~%1 䏣l/ q)r+*^km#BGhv)#-+uoJH\hmWhCƼEt nPǗZߨ-9#_m#F!)rcFo,M_w[z_</,}gnhoc3s86.D?УrJO};H8B"mUZq}Wװ/7jOPbI2¯> zNrށ[L2 8h2wLAtHgtN!YMY Py*IfHrKcb;Id= '&7G7,d[ Y/}3Oq~?Ôݭ ,'= J; pHC-VmOc;KD ځaͅ]{#@-:)%4!;|& D,ʄuX^E]XMߍj $k͇u:|O`%Ӂszǯ۱dpr$t+E Z(i쟏_9qzMVl:HsH:@$fIiJh(""(}p G/eK()n,-^gi}ocP ,d,F.`;^PutOhVX#±TE,M犌TK֜@1/SvI:C9I }*' TqMYFWU6$?Ȼ5]tLw6zPBv޳WK:>hLʷ9/!s* T"3mi[pyȅ#mUK?s@!&7Xqɐ,uꐸ%kƻ x"eO 9bıvl3nme:P%Ճba Ʊ}a!mI?KFB2r%$1mwRa:AILz\t_B@P-BUzv+&$p{D$ yZۥa+ZNqriZ+$IF~.pcnGvk X!lg:Q)K)jsBr1Ҫcխ-G2*B@!PYUT: B@!PܬIUSuQ(j29p:q%?Npsdk"kEFb ˝O3f/@D_IщcNR=J戩é#hڬ1gҜ3\3\32[X 6']i"q-b+ ܙ4-M\Л_P  @rk_svASвMktrpqgIZn\vFSt87Q5#Zpf3|I-ԪX}-8▆+*5U-ٷrm"2-ӀX-FN,W%2X%V K|ABoNj8 jO8-\B"p$`p/2#ًpx g%Aةm s_H$HM݃V9 TJ:ʸ~#4H&YE-H0Zkj nnsLBT^j'0 e5X15PM"1H^e*%r=DvS"uPWlHo?/!wRzTXK!茫Bw<-%^xy.V;-\HOކېD3IHʿYcPyɘ\jspuέɖ6[4ѿ"c(P؎Ɠ\s0i)6B $H,> o yoO=bph  =ֆ2P_&E캱q~Xro"P&,fEA,~zfY'O AH^xC\ -s,Ạߤr͢?DԔ eVEӁdqk_OJh?[VcG/dUvwեT:V*xA 6oz>ahmcr݋jTxw;k̵hڰ1xD$p)4U2qm'sv|TߥusKjgˬ*)HZC?T $B" &oE.3uoAΑ&2Cm/V| ,[͆yYNXɨ;߀v?2(>>.3CT[+ۃlâEg6 w">!ӧBenMz7w>6V<"g9" cM4_4˦P4%wuNWgD6?CY^! w˔&j,m3&cLGfwΜ3'\2_ rS@&ɶin`;b1b&4aKEVgH{/_}q^\c?G4~>s +hKCks#,7ވ;E<,^,!"$tX~3!  #'kCTQ֞WLJXXTϑ5s ~5ӳiY>Ț8ښ3r 6i 4IAkW"F+=:d"g8f>tƨBV-!.y0>'kZTLLFoCչ]?w!1qr\كq mƄju"L l]6Hd=c3HXd %Kdϣz@LQ9W|Nۘ{nxUسޅY%B  AV+O"5}9Lb汐la VeYXl796Hl&(-18I a,V?ek>7ԒnIS^~6->KWV~|"^G\wжqGHD&Qi49ciǀXLXBktLd&M@'Oc;s<ԚEE]K>ZyF7%nR֟gr1Kg4vW0S$qؐ]XfNN$|Bc3w<8s 軸@",%f D%-4ǫlwoXyM=XZov^v_[* ,I0&nutn l*Y#:&~.dakms$V${x -y\2OrIg&pN,Ա =KT8 d*liZ9xGrGBY0Eݗ(J m Cu MIDATu!Yϴqɵ~vz^!2}_ڗ_uhJhKVyHs8@Ns@a+z W"3F'/BÂ"<X`8vFfojQw%6L#$^trkĮ)Vtm(O85Gq#N)$p-Vph&Pj'?DbjV"cU6曓Jױ -z@=-*̮̿D9>X$p:/'0GfQZPYD^eP Hkqt.s9#aW$ݜtڬlIapEe;5L\Z_"6oqcp6[LUqzyT_ًGT>B@}tn.Crh 2I࡯>>b#D'i|+im-h^UWÛvCwHj "mjYixBa4o#mbؕC5-k3H^:Ʃ򯏡i=ŵ_h&˞KmEv:XZƀzvYx݊"iv![9, ܏ upr'CHGgEz(?v>,q!@roo~#OBPƘ Kii싫q,Lyzf *ɠan5& H(+iRaҴ:z[†oh+`74c9N)<I+uhcw82+'iDIfY<$*CX4t,0zu1<*<`&ox Pqn8XQ0~R<V^„چ2~sk'Hj:wozgAՒF-ҋYEw3IC\1 =F_? wDwGAg[Eo-y[_8 4|-ijh6r[];aXZYɶ`:@Ks>jZ/\(Vh,Z:X8V@X)vᇍ-ۭ#8L=Z%{ ^0 \VS]o^vRLFx@%ϥB,6kgI8XyKA@FId б ]q9SކӨkGu]= 94:IЌ#l rW$4"~c#PLoH%Ʃ M @n %$ b\ԏWq8odgHI#j'ݙ֤c4i5=&1KmnÆ X{?:LvYk.g\݁ K'a7BpzarФhdqL^;Pl(/RIU4 ȿҢ@S9cUZ=O' -Jh.(D.PRR waͮY+rPo9b#Filu'@| F,,Xpvϼ}qɓ~}9'==k֯7 'va47CN'B (iiL:_{Q̛W 3gt(B" )GWCbϞ==J~zWgȢE#l۶ D|Pma_z^LXB ȑ#GNY?F@#$^k׮M7i8'KGLDQLXvx ~X-F`0 #䕆'mt-6PK#a&+vCCih49g}bZxF^ۥ,mLX@E-dҥŲe˰eׇAF@#0pBii)^l߾V!INNfy(-DH迳8F|V9mBB5;^0>=ʮtUYu޹ TR!C@wL"nb2 [Sz%o,CC&؇Tq!77P#cn7ZUbA@ZTYɼTվ^xtV5!Z]M###@d_-hV2cQZ~<䘤 3 B B.GDL$tWHuW]QZS#h#@㿪I#@d} F@#02UNF [h4&wh4&~YB# F4 UF@#mC%?IENDB`PKǍEPKy.F4angular-1.3.9/docs/img/angularjs-for-header-only.svg}VmOGvogg_N4R)UTU1[66ͯ3wg!Kس;;7w7l^Jw|R67ގΎR|\ߵ'IS]|*r^v[֋Mayy;W5\ԢC5UY188zuK1_u,;󕾔xw^`MBzT*2_ 5ƈ߲S9ofo?RsT/i.fdyr̥%DeXήaRdv3]y1 9R*b$r3[;6%n~5,-wr<jLP _u}{׳?o>RUdf.iSkQCht24Uj5N{S?e/&&]@HV{hRe5%\چ(A/vX!\e2v$:88eq:¼;a&r+puUE9"{-UdXxkubR0T6iFтۨ]c:pƞ7GKc_3N0RI 596]k_ї25#sgr.+kAceB"LbCJ4GvUB#{%𹗎 JIKrh݉]){wڑM00P G Y?Ugs^|;u.!!wa-]DWU4Ust0$6٩Qj026*MI*88hb)*ڤ4B9pW^ س0dհ׵r0< =>1ɢ[8rRs%Hޒb !g cHvA=p|xdZY'd}T}p 6BO~Vޞ0uÍ&`T6 -< B8B%, (D0?/D$܁r&7 9+4+,9'̚ [΅0F!%E~E]~kΣᘕ2Ffy1$UoQGq'bULpWAaz*q9Q5ƆylrMӕk k XǏUِHluu1a׫)9OQX(>8ȇv4='ī q:[STƯ?R~_A~X$Pd>GFwMJSsS(0]Ggf>_Ubŝ7BuثEn(a<<Mr߼?ݚ۽ qto+~~k=blB*?,Pp'Zw|ma} xm[iԯlw$3mZ y:RNbvH;GmH!Ex41ݶFqd`&_u O2@C\\fT\1M sŅC4FJnIAvqsH 3kgY|4~1^]F#i)Gsu82P1^Ȍtr Gs s$~8Z6y+*l~p$)nLrC?l5d2HYWIXru^V~xչ׿d~r튜3۽2 %Dn\lݽ{j%J\"J$A|v,bϿ(=GFg\©CkZ$ V &s!U-" $Uټw^%4jK'}q'P c[^?NڌiRuzriԞt}?Y4˥{:u&I]ɯVr!s/v֪MuFފe)TNs]6Sy0"j*Ql9<ؼ]L:F2UmS^#">nnj]^J0dȤD|liTNyȞ3aO' u[^_'.7C'-W~igtRM)΅""xI]@ )tBKB9#6',@,~/Ue%?ɠ!Q =q$DXc\2 JrKcW|i /qN9PHsP=r'M < Nz )@R3-?2si6uL7 Úik)KS|ҌcNXNAg?X\XL` _ qnv2 (4ohIMԽDem7'e6ҨCa'`G; ѳ"#j 3.}t}LT0 H_Uer]HDj:-b0RfXF#3x5LRrkm/%1b1rW-\6Z} j/J1l! lExRtxh@2*T,te\Wqǫ|xrWOn[lP"\s~Zr}n@YuߏZLƽ=D˴ir K.X\"D,ʋ.Uk%t ܌z3r4#y_[l|1Hl&{ g{I`9Awc KҿRϒe&%Nם{$*h۰fL-7;vﻍ:܎Ul"Gqi?D00Eʊ``>ĽIYt%Z)NEG;z/biOa:BdޙHf񾜭vOvmV3egE5'.SP|W- j~{ F'=̕\` #5 ҫш; Y4ِr%( ׻5 V C41yZRvF>{wF׳W}E;xrsܖ@@y}$)sxU3yQ ~sp &Qۀ 9'dE| uFs?ͣxi,yuI͵{RYV_Ơ+vT'k w^;Ցe/12hz h>O'~,5@A=3/EY%G$"I`ZQx7BGYs\EA%+5e hQuۨH@N)'L  Mu-z WEb.(G$U/YiEb: '"HrחfJMV+=:2 %^5G^~mDoY&H >Y9` fcu9aGy6OZ$,r$4&%a 8XZ͏ɫpb^cN[d1g< J`{bZ+c„?uBU2ĵpP~'hOY@[(G| 9*9ep Z7H:c@T7$5PUt_u+(Ly>j.׏$c@Uʋ_TL/0PI?8yR=JRh.唏At} {9xV+RsLJ{ agZZ H`({1/lf/,—8(b9BF-g x۲–Cv;eR/X1cxA> -M2@~[Ҳ-1o.ךLGji.!ǼKU=J!V<)0h(6̩!R g EJӟLߟw ;jkoLIJ3,&QcB5پwIX{#axz#%Bk0]6i'CPaP9'J_(Պ:k09rCB@GC}v F;;*|F3:MUNg.GFo?| ;[5B_}΍DR&C>RQbuDL/M 񪋨9;O^[2Mitr3)CUJd-gaJ2eob7[RA*D(͙ ! 64O B/~'kܽ->L&Vzjz"^xH"^ 00( Pb{ b(b]:vgrk<d_M\o,ԑ 粙o3]u`~hҩ])Uv*E|No(k-)8iP}^. _+!􅧛l`PC ÁOO?@?_;⭕mRaFF, !JTrn.aLTl[wCo.B*S}ߓ#Ic"P 9lA,}>dCg‚x3o4̨=s؋.4uuvQ~HV aBuKLY< kSyKfu3|PsJWE )+/rӊadYzt!6͕D$y> &?)"Aa3~6b=ɘ dT(Z\1XZsCF2nPRR\\NjςHg,f9*t7^_G#0*Y{L}&`/8TVÆ9ޙ O$"(p0A !My/&lYոEQz8oe!ږHE4Rq ߎ;hΙq >83pIaЋUpf8@ +ƿ.{!뗧 XN9z+g|4XYZzˢG!5G{y}sZIwtr5 >q a/똉sIC uqN<M0,%EEz҄F\`$ѕ:)StB~zh)mW&:>f\[31G'mK%Eڊ)ZEJώ0+uou ޜ't ]ӃsAz_KYN3BCEf-L,ږlB2@" SqljFM̰12?3ԉ{WWQBmj |ٞ˯,jР3q;eہ 7GѨ7"Š~Tϣ|~-P_·o7<^"٘Ls%(fYG>?}0R`0Dġ jn@E,5H3̙RKEvB$I 5jeԢFCAA.(֫$V-5#HcV)+ù'hP7E^ꕀfy$$r0=+N^d) (,$DL *|Z4Pj& ,]Xla۳rD/8 zI 2IC=$%dOg F#3(M6X '5>!? +8"0łտX! @XL8|ꌚ NF 9Uz>$BBˣ߲gܱ0|tv59]f"VXogs.L‰2#få3mh{GAKA.EU6G4o3?8j9i1-TW:cBCy~놽Ga=_}7rƖBe6@^MV#ݔ?TdN0n!TIyGs-{I2}9` C*cV@O< V).^^dŜ+O@B&"h\N<5(k:ݹTY:ύ`I63`ss{}(SvldJNI!NRz ׉ =Et$=(N VwLB&4TC8!?>J8J`Νs@W4R.RvY&Yރ !@ (㥇0X\S +2>PA7e@XBbIt3JFqu^h a!HA $Yؘa&.(lgGj5oe$I1*c#%i&<@7xLiszGb375&thw'@F'%PC; L ȌAHQG+؆BlA^oըjȡF/[6Wd.=@U& u#*G\H}^F$qxJApz4ͥS$NQS/g2DIL1CHm$''2џ@<KDчh&ЊM nkх32oV-$ڨ`+>T:]@d+byUn{H6 K?4~)zޚj6RJ]owTcB#:_0d?1"I0Uy88DEpXƒTN"\Q;YlN 9)c ^cuysyθ(g`>0RuA 24P,zؐ\rn<ȍ]*|קG^MG)z"+)t?ʕ:˫uOPEGE:mVOʩq#^s3RLygkc6E)Gvԃ(C !Z?6S\M($(.y}`JWD-'8L[f[y2ob=bP[qh[(<(8'QO)72>[R1/O~6l5OYA9Tb^h~iCK R1\ffwa`~+-;JX*)Rj :Hvq+g_m4}P]u/QZ8Ѧm!Xq\:KU򱪚2NcfƠ{fFcedcBsԱGgT@p8E`[kn;q#-FsۓCW{ dRO+}E41pʮ(9E$*^>^2 0{ˍXݙŞRR:0[Q+o((C^QgY arBz'Bn9TBDrD,XKh97iD ՛kG <e:6FpH} oMK6UrVJuJG˾yzW[Rpvݹ[g`@-]fݖpo||z&. Xj~[ ,f3|ҚfRXG"Z/jA@$e%n3b`qը8c)ܡ4b(7ա_<@~ Ċ|dыWKuLaO^Q |;Vo L/`Ueت|2aoS+O: )(wp~8K)'ڒ=ۊx&1c\v l7 +LytP-riI"htS^)PoxN=rh. A)񯃂$ RhGZ 5#$7U1G|m:L T$*{aOаs[=W$q td'κj׸MtjQ~Cyۖbt_?v4 nW Ϳ$XU{o]CT[N/weΨ(v4Fx,(虜^5,qGk"\NA&|ÍɧNoiZr]^hJctmT!9jzTtpȌ}hfJ?XȑNfs#2ow<lEoQ,<5%"`1Gnb KL y>c.vIm:^7YdϽ]=G$];# 珛^&2d&U p`VrDϭHubcr;*bb|bxOe-̕*::ÙnBo)gO1fIHU?1}xs}\,O)e,c/q3paZ;A1)&e8.Ve?>7u 8E3!2`-R!0A@mo6TQSz򎟤$YcLwHRY gѠzl}p/9'K*& G,]X Cͼz`d4R:)v/5jcL$S39[edR5{OI'^!ZdORzH|.@[IGzD5WNʑ֦3u$ÏbN"5 nGy1"6{tH2#3` }`QY ʊ`Y pۀۜ@#vU fE4i&YϱɅ".ʤq˅ TSo@p[(U^h޷:,k7;3,s.+tbiAq!UaX8/*mWEJN&2}< N,R^ܾpkl (aG?E:ܪm0jZ.!|aw_ qY:3u =[.o%st$+ګĐ ~hu;:57:4ěq%}ưFI2Du ?I̺ 3x쓕÷ KMY01)M:WdkM[Ф\R|m̕Ue:C >F=V)ivX4^%|*r0G|̎O߉+GCՌW(R}_A4)c/T2bxa^{[ƲİqC5xeQaۑl> nkxd]>Eba;6lRs$Ic@yvXԌgP&pХD>ؔzb{hC'u%8fYA*r[wtmWVC;n7RQ7;n4? n 4b^MS4%jfH"yOj^=l#ҧGioown{w {)YNPOmMtsn2ŷwwwt'Uu HSёk8wrvYܷ$Manq G+Mlayۿ'Cowس7~V?!BD+&4{y0JZy}_&HC'+ ~׫'[pʸcG v_kV*BEݪ܊@3頌xˍԉY@љ8UgԬ;0qY䘪 e:F ϊ^~\злm_叼L-3T}q} 9B>nAǍӇds/4 2:6D52QY&B,=kOE P澏x#Sr08C v;}M HPdB30*( '͵f󟌈ؾGss0ByʆV4hRrcnTlП IF|l}> sISCQCI* ـʂyu"o* A$%XM T]Lڹ1%hk;_ b 0}iÌ=ưWV(lMϥ4͆c\:L,+"Jvq_9k8K jMԹT#!R˫3V F|d |ݞ| ;'F٠$O7*: fASD;5%SmHRw֠uFJw҉?sۂjk}5^;VO}[S.>7}e}e W1I*%ɚ4|v}9ׅ`,ec}p>%B+~3`<>|2 ڽ)^-V><ͶyIkJoa.O7smqAn S&V79͚rXi4B!4f|&>Ι z}DZFJ~{{c(#a^SÐ}x[T|4Tl-ƴ谌e0"6<\F90mt2D!gFB(9$$6Kq Q!G#R~]:... Lb$6leD`дVS˵?JD$*.Я;o! S9!+E0P(}h.Km1'H 5l0 .>N694$1K\KK9\`pa P]Op&@En pL45@j.WJ]ex^TP-M'I?AT¤ T\x:I`)1'OPyƅq] _¾߮m ~ӗMyIJ#yQ87Ƴ x ohr-꿇G 1bQ+9 'z [v.cڱHKs.;0QjJQBas |_Aif݃8:,E }HEaě//j _iXG2ۨ4(XЏn `e.U@8%ȼ-T?'ޟ{*a4]pN',b|nBv XoNEVvQJ[V4$)>C&붕s'{H !kv;:->ڠ4Zف&ǔ~1R7ܝ|A][]`H 'f'grK(&4I h6lrƝ:]lX\_%s v7 aŠϫAԔW/NrgT@ț?&j%IO4`)6A$xS1312!|.z{eGH ALo[r H·Ќ`&$'(*NʘswHQ/5Kby] {4F7rᮿkfY:Dlc+P/:G"zK kwih ;곽ŮdonuVq3ә/c, =k0?"'%g}5 &I`c{ 7Ak #)dj-81Nu\w( &"r?r BuN[ NUPhj vhis tF.,11?mNRיhcPOf;€(Rq.^)$$0SY@B@Hϟ㰸XpŢcK>$߿c+^9(S47y!a9$T0z ЄxD l<_> Us~MRN@l9kh"MH{?u+' tLnD\]3O4KZAp䆰aK"@}NWVϑQm4Stڪ)E/2XY+LYUTg 1y=g7Z8BH6Dx' nGDS>3>觝f#0NU8r!55RHq 5Hh KěSUxwr'.Aq>t )40ݪ^KpSJCj{sz?6gM'mG$C @X96HEL5Ӽ\y:I<5{vtv3-^l-HD8R!Dr#c.Lb ÅQsIA޴he`$<wP!<:+Ʃ ި'\[U/ $Iylf͋(Ec@6YQ4eYXG۰m۶m;+vmlm56MҸQc;|?`e̚>'N}a#EQEīv9aF?;J, ۯg'-g'BTl"N_pZZ~hI .dY* /GN*4ӝ/*bCBxjT>5sOs}#cc{,0'V;ɊÅ,հZ4pxxU.+s,HI5 Q/+Ԫ~v8oK=g8+BFtt>բF#XI!Mҿ,.FbP[҄r(GŬۚl<=#OPΆ cURY 7-|l'^㗂_Ѭn;~o\ \ZŞ ^s!@ `a⇺Ns"N뱉 \{m YwVx|’IZJRԪq(R;Z)z ,?۟d:[%wbioJ˒b^Pr4ci@O!9FۤF%Tǧa/ coDs?;4czӋlt@?xLL>amP7Cl VA)U@[K\6 gc¯qt[ޅhh CEd*^t!PvS.FJ$"mk#G`Qs;FFP:}іׅkRQ!.;Mр%#0. 0nΧfo4Tgn!նY\xy6R*be$WR=ީ:$ses8 ]4< +M.)>j3gRoW(aߵ4cXUGLMSJ Q[fGrQUjXQ|p|gGTdOlJ&aVjP]Y`sC,`ߨ4$[|3ll_".J ] pbw]!i[kCKM(hG" :DFv/VyHq;B)+l|!tՑ!-?J91p@A!b ~is6eP@L+MpXxۂdlAu4CNԞFf ARؾԪ3ݝ)U_m b > roycޣ|d/cLxfq<n"3,VV> vs= hjP|\&7*Pnr  ^˄4TYnU_.%,Fcҧ @;~e%]`7!c3ޡ˿#rE%%+MYL[,#X"3AZ9Ƴ=},~C&,N5CjcjdLص X]2Pq@eb;6K:ُ69>AyN_y%lWc̉KK Ўqߞ9՞\nEP2o1jVK#);al= #| V\b"ޱw*N@%eanw&Q}WQ0kV?炍cfMe__.{bg?igJTسz)nLu:u w>߯HlVQ쵧xw"sWgy]a8@Fk#`c[Qg өtņ"  ޜXK)fE3M,&IϘJUHr^<ibUb[F_w ߣd׻1xL{g,`x*3f#Fsx9H~7*GPg1٢Cdw &g 5ؐnp` !mꏯս]D7=qaL;xs6o;-.۶& ׹_s{JG!qw\f7MejZ4i`$k$#]rXfj6)'iȷ[KtlR/r]a"'u A/U/\qO|4[v#{5%չXBg0>?7 ůu2qvQC璂(+^9CJʅFtg]F"JץE#~Uu@g3SƩ ݣ/xwG4:HZF w^ }(˳PvH~8w8)aFߘ@gb-ܧfH my=Q7AO`N#7퍊6sZaj<:i5|LV]kCnR8`i;y-|8.Qck_Zȳwe{$yqmml}TqGrQrvw_WgD=N۱Ĕ d:KM m9y $A&K#Bʮu}u>r_4vBbRl%"CVSd=TZseɃ'kéc uen?@ٻšm*ԼuoּR)O;l#kgК.^a-Kʋu3S(R$G= S(h.6TQDJۛ>`U F\ _ˣS =/Vk(^޸1I5ip18~Sw<2ԙ_H}jۻтjcIzmSi#Un^]SA߳+!Xa#h`i_bgxsɻ36cUm4 a䴂[g\ ɢeSۭ0{3pЩb9EUKnؼ!Ag&~-ogt,PRj! wlK)Nr.S1kKnXj#̧d^K/Z YKQ WPmxbt:F V5vu2|N563".Nͬr++{4)E&Jddrzdtw.'&࠮P_Q yh+ճ԰6ӑR3#؛fYEO 7# DT1ir(ctp'ejïЯlpʾAFoU [ h UCC5?]/$V%S j[M.{@nds?ZZ/yIc.D<0j 1׋*M_OЍ:ΑM6{2p},vMZ4TzVO"a=vT-@)h'5]BΑ6/x'P:Ī>\ |'/49o0Ml3i#]U W&{.7{pUYQ@"; d oUjt [?D=a9qBIPX%]S(5*SGcs23L<\pqVÆ{-tnof ЃH"TO:t> ^0goh0E f޲ E7 fC(`۱멲#Kf;]q(Ѿ7QrEnۍTU=(;B}:Ӷr\e7TQ3P~F͠xO.nU\nu'J ]܋j:`aIk!~8adtw'ί?x&vI6L↪DT\J>&cE/88[:cUY?*v,|>626IVq&$SMOoU\&8'1 x<4늡B8s+D XD ʸN'SĹ*V̐lyBt0ډ~!@-z!h&z^?: 8=jSLFi];%; ZrwRGv)2'= %Z=*#M1-9`t$G娝̓ 01B Xt|\.*XQ=$pÛ,I'0WPS/+rپӐWy~礕OF̓5m1]Й\ŏ, LS-խ#xgtzr]v {F8m;V4?/N?! յy2& M0#P& 0J'wG 6y9"^qLsǥ~݂a]Sjr`Zw K/J-q|)%тM f+UsBmt̷ ޱe߳-Yh/[xc 28cFM|p)tHnd*9lH Z;cG?hQ{$_Ո9J^X&;4K9K3K$Mɬ+y 23B^(Ɖ% km1yw@܃̶Q@C27ʄzt~-4PrnYSg{ag4B`Ez h _9 :ۄ1f39 4\ ?څI/&9# ׿ i`I)2y"=Iu1Y2+?Ӗh,5?n=ꛔB=7,4Z5XH젋)Ռq4}ǻY(y$qS*9V0߇X<\"003KR~ŘRVJ\L7@ 8y}h/C0^|H9Xa4l:7yrX/aD}/o繒+Z  }$Ps' 8xr6`4E~ *D S c6ҟ2{O괍}KT#W_$JIQDZ󸷯hϔjbPbgqC,=udFTaڬה5&F_ᓢ=E#tgcO[GUN?*Е6sM:/RY2R&KyqMqR~rsbt#@Nb`FfA!  !˒}5pkoD59Xzq2 [2wɟoçT=JjXTN_ ->'TV3)}նM(:Sڰ$*pe?llE:@Wn@p)$4rıFpL6_f^ b?1mێϪZrUR(&5g U+RvbL.GϷ8h.˟&|~;?7Y޷:nDE_S>"ɒt&Y:a޽*JÃ$~ei6?GMiq D1B {zz#:>s kt& ß(N;_ N"Xcăo: ЙS b> |y6fT\:,Sa.1h\rWf9m'=٠:f i'ah-muo @{Qјbl8R|&tX.ֵs׍C$(Y5}6;!q?Rů2MU!vYa|Caq2 9/:LRp1nZ!i~K3*':qj} Q7eKfC`?GßQ[h 2B4K&aίv9Ä=12?juMHHC"^:dJ }~-J>I<5/puxJ ճ&׮Lv%χbYAfCAKrCYkףjY}vȂXd8^M:kM{*:.i 7;i0FR$^doi^8S< R,Lr G\Lc[ަoG߹}]ŒRE՗SDʖ{!PK,ojvWÛ})|:]p32Rq8':eBQ5fMB&BrKޫb۹'4o^8a \AgBحzLisSE(F.1Hu%''=!{QH`Xze޸b_60l+-+~1wiUM7nNT`Y<Ӓ5m^ mj*f\==$",nS&/"t7dR!`ie5YM&涾7fpSM:Ӝ/ӠǙM3<gt<>H]>K{c ~`NUJOVI=ƨ w5lfg>.TGK?a|$źzNg:Zs`i3SUӺH f LX42їX]:D]_K^`:A@TYHJN]Dٵ?N>Xm]y.d "f ]^ZҧPr| ^MX_;ƛʉi8j\ϖ>kHKĖg?*h$~ ]y(8 Ưim : &F  AS؊*q%oJP} ca]kbDK AݨQ}|˞Qk26F![l̤JzpZYoπ0OKX<8'ZkR>4cgS`7xܤ ;w*_aT?JdoDx¡EkxrI) \țX(z(F1&vmo,lMwBZRߛX5{v7&+mEgTF/Z30]_КWn3'O)ɠ| OT䃺+H*+d\pYL-z&ܹoӉ?^RdwS@yҳ0@+UanyicJ~2}|4Fz +o-4a9ExQI=i5%>( pB`T@ W&Y"eת@n\. o[0O*]DJLp`9\**\1V.hpA] py,g9O|7v5vZ%zHC#*pi~/o%qc NoK]F~nLe9!E Lgw,pUkZЧm ݥ=gV@و0R4 3BsauvƢ'|Bϥ:`)yLcbB9!`)L*=!/(G@C).[8_j =Ԅ76cѩfwx]w6ݕk8J!~mɮIQvPݏ66f=C_^Il(SɇuE<4/dq* JS{3ހ,~xPmjPP1\\vyJjrR$$ȽB 썀)YJf#@%6ޠ}?ٻݼC' rrjh=cn%)&\Lbpװ*A`NW:v/bUR}Sޙi, ž%؅Gh6<ٴ}p{:ZdoK)eؒtb]I"B' ެN]On'&Yz3}֙M^uN(GX:ˊ<{ޭX: Xfڿz4RXBfc,۳OѨPZfJgx|koH5ӭ+VESNP_{o\$~MцPdXg ^Je)3D.(N-V*彏>A{"F\2@:FԋG% _,ϥRHm('I^.QǃLC}"c $+q9\lܑML2U/Kڡ˄_(h=&ǽDy^%pOm)p~dMzd~"!\1WH sN:'%\VTr\*Zލu̳V=†,׼i?@8r{ ~R\Pߊ[=P!Z([)NlK֜Ӛl(SIMqy1(+{侾 ի쑶|xW(}oVD7AQ5cj`E;@69JLɥfYq]]w< &낒9+Ǚޓ❠ӧD>+ fB\CrrȆ7N`)0҃IJxCA(U8D3$XpWvJu})_ :w7vq{80%'/vO )k0rg1S<7Lծ.1SBX#- azGU%P[ Zem*^ <[LSq6pMВnHw'DfvTb|qmPvL\gCBi68VUkסh6! Lj7)8!&8,_ BoxX%lz2StIe<`-g*%ˀlj.JRc~pχuϲ'o7zZ•k:g!)"B'Ʊ̘һqÚ0 1 ofb*ݲH k[aN=& qKb:s0cyKWѬvUkPVWey.@@]05NĂUvЮaqF"q٧p c!r]4@) \R8}k,2]F=??ĨVSƝUrs!mPYZ̻k&):˳AKla)BU:bG8L0_{ YDGKM%0DU}29vyhAA =dkpn$ k+jl7[Sϝx_q _P3` I4uCkʚAOܻg@] TH,~R?̄q{U ̴>ոnd4oQ {=ӡ g_#5+SZy6l#r0$HԲwjZL 45)+ƋZJ*r Z$7rj-:S+0)4Jp/[Jl>e248_etyދO (ν(W]^YRH̎g̔bW3b,Kj ͐,{%~/JXiT'XZg_;{{qp&߼jAQ&`f˖Ηv/$=oIaKQ1lyVOX殞C@¼u Dn%EvA?n9{V9t$f^<'KĂ[CR i"`,âvC74HwJ -(݂0Cww# ]  g?{·i>u3{Yq߿t9IҾ +3mc)?:B4_ぜV =n7M )XIc)f$F]|kms4lFPZ2II۶?Ygg7~axIE_NWO}HS7\P^>e0x'B{=zײ!M]Wzyw1kJffS .wr"F~o M܎]Ho/i ;˚.^s9J 0w2jQ tU=D1O̖HK\ r%rSR-P|Qi*S //QhLh<cL4D*Ȇ%M0K.bXl;\F.\NH;ţ{؞EFッ+j0OQf1:O%^ ﰁfuВNCܼKXKg=qQذ v'uWŻ/$߭GX^ǨJ}]\j(2!pzȄ;q/+w#cVRTʪu:Jל}ʊǏa]*؋!Ez27&sΚ@8 K5~DÁͩ%o0r!t@M6NHP&(",ӧBM|8QhAB7a,/Xq⏊wz-sEq'2Ec_|`̅Ҋ Ov)fܛN4Q; (ectBI^O'ѫhm6eIi@ 'ֻxh@,'I\l[gQ7S 20-i[C:DTa^E]gJ|AUYoZn ٥b,GQR\4>#?р皉ʻN f" HusܹWM<8VI|w4m^R&¶h!ApeTO'F.}2/7J-hx$k͚}(v#7;N,ö;Wt' o?|S&w;JQ*aVjc>Qr<&<(8|'t>\ )OgKsH‚MyB`T+cQ~ۓ7}6<q4`MGu!-_eOSEt-7J2莁F%dQ"dpJ-.Sut ջOwp|](Qgy\'X` ֋6z+ln,D!*?| Oa zs 5*f<?i,pyUB4b̫z9p':cws"hB<@}aTRiM }g8V l2#zF~( eeFAd+Z?=쥹TO|@ˍDM\NM_3O.ѓw/X{"4s|^B+  DvzsR1/%JJAV A>4nn'AV40}p'T1%89j6ooiLtnk`сR!rgnSZ,5΀ZjJgsw~ i"Hf"$˯H6iW+CxTSp3J4/x \;5r 'SxڇA jIo>(X ȑHדQ8vQ!6f*Ӵxژ+ǻejFGMvv]\f?Yk2ޫ{(=X`>ק>[ӗn_=$#[OGny* 2 sŎ5+z$uJVFC IcWr;f Rfk(g#"_;xޭ1KOv:06p7 F©%ݰb;MЂ1'*TD.CH9X ?#*"`$6X5đVx ne)b8MO]t'j}\s1~kl[yFJfÇ I`yZrV.gi!wdrm7%ρԊrm^'sȾlP rې'A{):_VjESb,ZFе2F={?%pB"-y -E^~z_aߘO?S@';m`+(aa>v*Jk"O;lC*C bHذiaj}=,P–Vٙ豽vu,}?83dG3F3eo H)?ά+~%&8@j/SiL0l8 풹d#8q _AF 78fO3J̅4a|f| /G{xgiYEv e\U fkKKUpCyYW꟎pMm-^uY}6L44pzr.lKgl9_,ǩPjJu`߸bY9[mu䀨SoEyyŜpe>D,WS/yi%c9a%cnؾ\w.ve$86w#EvPѦ)kyÝi|%{Х`7ضVVU~~trWנ{R3)Ao6fާԛO?iww5}. ^<>*Mٟ>ij,%.DF5ӉGY`?ޖ.3K)Ω8!p˿zј \>^jܮWrFO}ʞM6%M Mem˥fZ9nۣ3]ً %D668 3^:8w[{we"XiٗZte':&P_+Aqo?r'iP KQwTNmoàvUbWG'P[1]]UfR*$w+e:S-*r(C<sQGX%*%WNǙᱴ%% ٛb>in<_Gow+Ikm !8+ B#1TDpL2jId\2H`!<rtAq8a% r޳m1?#MLYw%9]wWs'WKr`-(ƹ7@LA(,~v=`6g#"Y(Ě! VF-FϡWC*u/d4 P5Є0z *\33ɋA2^u. _&#ۡ5焤' 'k#0c+oѲƃ#NX, -d'V=쟜" \sRE8ecYឭᱷ*=,FII6A͘|',tˏ< S (xTי3~˚GS/a\шtJnf@s DfCȳ~b<_Xyc16@?#"B=>PG0"Knr9{3˪tm y. gr vT5HΔ%5E^z+l؝:U!'-L𙑦X$7ׯwJ?4p/"BK9hl#OUVadi(/5@Sh{dcG?% KsݮŒ<s'Rt c|˭h7rʇy}p'Bgwr=~O?%g_6uI'jd`e s\,s,6n; Zsi#pKP#RK*q/3R<,b]΂c[RgdK-#H\)pb`tX`j0DR+z=*CsP(dt3Hv.bX"c|ϣU*76nJmsDH9)m1-18o5,q묢7h=h~4W; S$&Ӻ)It {jr“CWw%1;!P>o9Dfh,*<=";4 Vj1smP%₡JYҶI lm0;BၩGl/"gu̼v4X::_W`=+m/c6FRm"·}6݁ lO k%OLeCEָ>Q1А;r9{MOkJ>R"uN <Cv$} =l|@މtEO"q/+H3ӈ(ȺeXVh1 rO UoV@@hv%}ȶӤm2ږ/"0X9?'y?Pd*IP.D E+]GBp+[£sDYt-j_ߓGkؙ{ge)ƀG] (tn˸(aB{rLw`tӍ_jx _jj21$ )1tJMN-YL2΃V` +jl(K̪.|s{NEdwhm e+w%(#? sD@J$skqgp#D,:;C 1I- 9Mɂ,I!Vޔ@SN"o_vBu&\F. 9!ShmN4r z0@B37Ou"YPlqAMևA)7b少q4sy#wxEbM"b^Ҕ_tGia hn<񀾺/!}(IGQUhd7qqԼ4yCm[ԁ%d]}!AF8ںM@bx{2 1$?$Oq˪ފW<ămCu &Sl9ċ`U1GIIHjhE=R6a:f}&cyOߥ!6djO6 ^KP v oӯ;)E;{;";Ta'PFj$ܜ P+BTLqҵO~p cYaJi$Xl(>=DoAKѫpԆQ*t5Pul7?Y] >}Ef+XM}19D*q!RX}D'(!{ꔭuQ>WRcA\_YE{#$ghU}4\Icl70i^.EmPHNZ"knL8Pi Vz~n *25}{6,# gs̥8CU^A93imCO%zEq9yH=SU?~w G.=nsFbޏ6Բ1)dj/CiLEtí^Ӣ#0\2;1ĆSp Avg&"=~&R/ӿ&n1}&}9^"S&B-};`0{"24 N?"[lck+yRQ{UZx^5$c 1/S&j1tڱ#GIThEqAoN+/O-ͻֲ\}1t_[~!N~@d0ΟYbIns86 ^9DO-.|y^!h5,G^i\@:::DЊ~,y댲ĂA</F"BHu'$a6g@s_Zҟ\vNIncn {cHZ{3Csk'߄3fH)s6~:F7x~"LP%i2r*^z.BNn\D.XOق.#ޥU)rZ@Tv;<+T*)5"˳phuDzlײoJrbPŏCY­ig@,3?m>8 jfT$d>އ^tWx ^KgSs1z=gdasrs?-d[;E5s\slNin1vju_H'AM,4 (Nl͐Xho%LffƻF֏#5ԀF,%e+ ~ufDAQCкWcɗFs1JQV|4޶=0pP3V A>Eȇ ίҖF=+ܡwܞWY?$ ѧЪ];?A=e[|ؾШYPь0I8D5~r߀cGrb'k.`e' SQ>[ː"_D8 &RQB})_@qN`Z#K- תzj].xXԶ|Mn2;,P冘` :@]5&4,>Z= occ#r.JL>s0L4|M!uP kŤy G}2|WKI Wu: |pFZ+Wx'6JTLS8rɀQhd gwuK)X:%ICר4r84΅x@ڛ.0"{TLY:uܧ~%d20}FɔBGE#~"0iOT넮 s<k;*~B1ȼ iO ; EP Xvb:L qRmd&/<1>mƒXtY6OޖesI P>7.=Y$8U8QlER1)~ q*VikO]fh@$6ٰ`' Wb=a7ʛ mv)fz^IQu4+x?ɪ)n#D6$}J#]]e_3v闻 ޣSo^;\_ aЉ Ԁz{2<B ;m^qFI4{Ø;G2m#R^#3QAp?AoIھ8xZJ(l~%`v+RBp9*CjM'Xǒz;c.zd?E665A'wMzaerkdb@Mld>uE8Y;gK *99"k72;qK78\T+WVܠ aIw]uݸc|2ޠ9Ђ7Y漏hGe?=kt5^rfd| qT_ N)n6\ugȭ-~ 17\>;fd?Kuբṫ ߝXȯi$Xn.bߎd=Y(jJys'x>ˍ0f-G&rr|9WqU,iuk7+th/YN HǚU1kj6;;V3lU'R*\:k--^DY'U`Ur4nﳤtSY 㾴ǩw _ n"i_5_6C/v%te uXe-s/nWԊ&ZgYzD̀=φF=~gO\X[N2`I<0ˍYؾ[;'LCBAsdGQwI($CSn> G/o\ٰ zξ5,mON*|DhwCv"L&P!Y\EEAs(P/A>7vJЊLQI'oj\"}þ o֒6a.M\3'%`xpU7<5%]0R'psMZJäMr<"U5S8=Qfn @Jlf Iu9T܉4\ͯpol4aM/Iukޤreu85xz=.~t~ ntֳWȨX96bhQrXy3$,H& oR)p({~$/Vߍ 4x9Z9.9ṣgb~33:ݪ=%#5VtjnV֮yGU+x0+8d v+!*TnI?s)PQySz0Yi' mx"n4 IӧE:]Q\og~ 4iw[ȟ(~>A&qiV--/zw@IHoWx0*%V&_GQaa:IuLHLw {,bN%%saf^F[+=xm"_9SzH%vت*BL@V^9AƶofzDOR,⛴1k9HH}G>m laI ߱uGvIvب/:K^kFKB>Fd #;AAEC[A%3ÌvZ?SdFsBVR-Ή%KD4gJe>!s2+l<ήS̬tDØ =;+,W& \ X#V|xSi?G ٪|%?cc:}QSg`uE=AIH_ę:'eR?b_K!ϕӯ VC9"%gv/$wmtD2ӅQ No5fڧ,L]A?(3z)~H*ϗݨMʨ4EGܧs4N3 -nz#SأF>ιlx\AH\r͞Q}TX]ǞSʠH{?J4rظ܊d|ߵsKVG%ތ G*oq -5< U.@)YVSQ_Pu^r~eKG;HuNlHcoq a{?}a7WctA.ZfAbͮR6M&]`y4zz1Λ+D,TЫΜ? DczD}F] ib8'r~Z)?rOŸ"5WwJijf2=x߉h`_Vopf"=P*L6EV;rUn=D_:T.73{Gs%u~+ Kih~ ymbLD$B dM?)&Z7Xx+-_v6/ztuVw0`^\,cU3|۔FUpR ;Y9*l-)t(C*u.Hl4Eb\(QRUYi?wGE@:A&bN695m1ۗ7,ٻ`ov[3bo^2_?sNBڵjy{|/ ?^P5{YҌ@\ݼ]q S/,?iŏya)E\ -q=5+o!UşSb-h!J-s XS ,XYAU&r2DzXiei=;stOn*:y>`&`QNx.vj5#+=-=zyoͷTlXs9|ʠV~¨acM6q:vصŦ&lg~hfOr`Hb8;*a5yCW`T^̀Q#+j8+8;zI}n)˱92NUʙdLeFF~UWV>,ȕ?jZ%3Khyw؎zt9נ'P`ZKiWߨq5Q۰0D]H36|lyDg²s7Fo99=߉ݶ9'=wqOOns uuؖbk}(ݔ _( $ql6񷣈ߧ}lԫ_oiц|#HPο &X}Rf&خ㕭H%m .\͙abCCf~MmZ@}ϖiUO7P4jL[SbYr+J}ݵg+E4,M 5y0i=XnW+ 8n\Kj(H`~\-;ɏ)%T3~ |r8qM+W<8T) Vr ϟZƪ%uا #.}JKLJBkC7$9Fx_xoh}Lo :/Q5 UN? WX_>}7-!n#+ Ri15 3%4Y_:gcMB|wwJJm_ml8(rP7 9=&c^bEgVּ^Ī(V58z~/CVa ӯ$r5nNl!b^OeY謫+.eƬd:7=![A$ %Zaz}JRڡ^ݛ_-)I`yrJ(O%e]j͡=/9Uѵ9ѥmj?2IWS̜;y,epWӮ./o_4&HE?V0%V˶~HV"2tvߧґLi&I^բٕwB txren!QP&dْK9S*gi5q}mI<^o,#@zp"M*Kv,c.`R! 12[jz'mnd[cޢ_|Xh2s5NeMt\{osqS国М˅E B!+\į읰,u+:%󿝱zA:&??4~Ӹ/qPQxv#vw@(}?D\xsw)(XA{F"4ύ^zZ'|sk;&IK_qsak="?Ner$z41;EH6IR#n3@-ƏbI+;\i.a0_ Y!GGr/~mv̅›;&!vԣml0wP6LA#pk#O-SN[_3k%lR&<׿^˅]fo^j')"6h߮HKFF 94\9)pɷ,k}.y+WGk դ)ICYo ʫWw\oE QOC[DSxzGkǛkԩ#w7Kd[JN"/y?v{x@L]4h8=əg`*\cC+tnZ!&1!K̳THI?2X^iv "~f)m,ܒ|9 x7!h8BT}'ڧsW /N.Nz7m ^&Me?sDBy9ME ] cӰ/0򾻖+oT^7(cX+)BfIJw.;ٯ l}b\~w :n::>D; -g k"ȿIʗ4PN?1I3l ~59-̖b ]+ɂf*"МTF=B< t8<+@h I,I\wdC;\gXo؃S*?4OVa02.vLSet9Lw_"s3Ar(3rmCO UOU&ߴVIIi >/T]}?dͮJox}dQyV&aJ ßʳw1a3zia^ΤS9:FTBή-VY JOmEoVӟIXot|?ZHE3JrT]8"'NqyfFUGC)[[I!qz{M9)籴K6U6 1S歹X@`-5SW4ɰPN951LS^PM 3O Y_:R( @KK $ư!& ;πU"x LH!oCPndmʬD{=LjMkY}w2aF_o^o>!=F኿}ZuԴQhTda8+<`a7VgRtUĿJ.2ޛ^yK>Ծ,\ZQgaV.:`Ww ?F~ܫh-@^_w.G`0 J=l 5;WfN jLCDTV@TagF)C:pQ9E {%(Mf6˕2/PI8}Hfm!'(46 pϻfDm!勑N;rBelL/yJlAn@GN{2zr8Jd/w@G⏆OP^T M3%j7GY/ʲXPWthQ<+[G}p4Wչ;͙$0%3-7C)hߗߖİ _kyse#c$D:(:L4<1MZ58/4mB+''fCv|pSw \۳ R%X,KoI< w&ছlEo=3{E+"ۄ hDOqו5B|jqSExI+0u '=˖>0u +0?J֘ur;˧^er^sS\9G)Y]Us8 / AiXq\54=T~ݻ\@x U3!(}Qv5.@uM1oCm-([ƤE|C>  _ L[CS֕v ~ %D"ZC܅fRgv5ԓ"mK c%$T$AVzP:A9X@CBFqo$Tph!+x"=G҇rMq5 "DMh]&+VpPM?AZ$sKY\gLTA\ČL$56Gkϳ%>>)H. OM>xKqЇߋ BofH-ٝ Pz(=:l mƍb^uB-Fȶ.H7W\ . xo>sy>''4 @J@G@%5eZ$6f:& OD[% g*!|#!Z 4jm 1un(#6W1p]M%hPj^U3,Xmڎv`Ђl0>AN~E7儒Ƅ'8g],0HQIU! %`3p"0|Qh:LI*:DI:54iG.CS(m46+ }$ MlP( D "e9y$+[$l^IR)\ʰ&~(lxV$  ﵎VޕSQgVٳZ3o/))N!sL-l_Knۧ={y^(Īh(.jU5[‹( D+.1XJ5A';/$*j\D|߽ep(p拯o>M)4n28}ݤW\-lpfn憆lSdP}ƳǓ_VaĊmzrْ]X|g?k &Nˉ5/Nf ^Q';4l3fd#W(~AvzbŘyhl^Fv JgهO_^!(5!OiUX(X2Mkisɹׄ=vREɥD2GZ̷7-עɀ9?PIPɳG4W-~sכJc\t=r'?rj8gM%V}<k?qy񭮪M2l;su1sG@:tz&)k/}Џ1yWҼO9 FX6 g@;mD umsл*vӭv?}˰sZGeEBJ~ŶQైYc:놛gQkKc̾oGnb5ッ 6s,N 8t7j <]:zQhe uA䜹7@)fg?׀4W5]Sj+W*ZPKWo⫘hPKy.F5angular-1.3.9/docs/img/glyphicons-halflings-white.png͘?ԁGFkLr̲"θ^eduΊsV%W8$ɉu:(Cq:"|?z=^?~x=^L 89mk?;TM}O=5;MsԿy-L-Q(=CiViBߞ0&  0v)$m(1Nuu!dY0ܿYh=3j2rk (pC7#lH2:QW:|-.~= {գFL@"^=@%\fW[--PYm.K8NCS?s*\ShqTL7}e YiHImBo*kG/i؅ rq"w_n(zs}[ 06A;CI9oLr^݊|OL;O!疎浨~E $|<d-Lo{=+@0qxcMx*wUVB+v$p;Ɓb]ӏo\q:ze^K#81>w^`SyaI10~CKSZt:u7MwM $B.>dɭ=bqa\H09h}2$DxO4Y>\_|M b9<^/MY?2UJN[Rd0>z]P\ 'Å珆NbfS3#4@C!0hΐoI+):Js4cj5V( + 6QeNAB6w{T@Fb%?7鷐b2+VKڥͶzƯHtSr4&J9[k6L?'GY NES =/-GfiSyq"oUuEb]ѱ.\!8_Md p1D 8J"0=~lc.08uxs!%ʒͷ s@Y\zI?Bp(`+Y浗cRGӹokބ=5nx9&jT;j2gZi )2,g[/A9)٘W1g/l^EmSjK=-~ʆ'a;w>ӖBm6|>]<&ʧ.kn Gjz˸N1-Ɋ>=i'Cr3q&R&M_ZGSTg~祛};OepF2f>rc4zKŗڇ=i,;=2Aɷi DN?%%`>Y;2@h^W+ߗká|ЉVɿ\O֔/kYB]G>4x2(u[>UC{-* F-um|>ۯ:2 >ZK"Vg$kK1n\\65n΅ (Ȁr^SUKy//y4Pmv'jkJLN QKWk޾SޠDBnfpP>87F}.mB$!N vQ Nc/VhVfgp$*5ؠ/\ZȎ0y,Xw zu [2苎QkU%VGImܴXT:w܏,Yo,?vk(Ixڬt܎Xϵu] -:7>LWBvd}NQ< M`M [ P͌*3αa%%vVg%2qP0İB{toRi(qυ~|NWR=viq֑ڙHp~^@I m`>Rϱ}NVL^ 5L68Q-'fP+qޟs3 a/ #YiIٛ؉'95yHߣװ=& 6]=lid#1Z@r7E}f.!V?>d /@orE$˒m!_$u ܅c#暡 ܍}04fY{+t$ j86!:$cvn4[&Bfml!UΈHeL尧 V~9&ޤR}A`/g%t c *zJWOޭ̦^.QmHIMkoz<;g/nhj.[O/~7VH@|x;٤ɠ"7VER!'G.G]0sg:Һ Ep+}a9ؑxFDč%*nŝmoъ}Dž%ӿ]ͥG?://hK4\[?g:g:aX:mM#dOI|8=;ЎJI&z W' RaYz#zD_kxnI,7nmC}Cw63mϥt;xoהN!D5\PZ)[0ru'@$XLݘ}ɱ%j @{鲏2y 5,f(FQ|/;Ӫd^<J8ʏ(wZ^z ׾?bjdU@x/?HsOHd#ؑbzyvUKyw2z1 |DY{Qzr<^%Q*fIt88)% {qX(0%$,jE.[DPdXoWHH @|an'/=w:*6{WdEh1)ق/^>Cet1TTiH5"as:uN 1u%3djʟ a}ǡM,U s8/MJ%y]~R_dV: %Gcp#ڜ)Ѻ#|C%9)2zBoʟϯ]^6Jaj7?~ Eql{g텍m;iB? D4K|i} &Y>1}U19Vp 9GDvNb=Xi'6D쁪g_ScC7#qYt~%wwr.*U߹;ʧ.#ueG;HMo?’PL/植hlW-R2k!t5o"D$'<[eg>Gj{ip&=tw 6n&E4*8wM /JŜQJ+Iu|~oHuճx(Qi7Ƨczan QlcxC+Wl7%O2)%~G?6 Ce&e6Rs‹d.?BCR:E?)1\7[y^7Q&^ J70A1XaeB䵏d3UӇW·G uR%- &c~c6,pB%4J8"eq4"'.cx1w=$Ϯ@N[| sov/ڕ(ΕC42 D8Sj_s,]w.RF|+V-1xBxr=ʾAW- QZ${_~dJ'Șj[w%GcS޽wBG Fsj-e ͏GIMm7^5(Ќ< QNqC"f'7C-7)N\ڝV"-֏^9nxX`jy 6ؘbe"s o8~2hK.z5xaJAss9шqtߴ}e0wR'}/Ś.VZ>e&N0d'>eUot}'Zu _Qw_p'Ew_&$%ùC"a@WN+.+ZXk ױU_Q}"ԔIL]xwHqHXM34X")&kҒm[g "ZEuY/}۠V:f vqx3ZA:r=&/ ƕ\,8nlorvN, OxgFꭞWP;2}Un4Phʹ[  ˀTv2b=c(}F4+x䑔}a,nIDQb߷ K8R 4ګ὜p9)&:_ Z&q͹?x*&gG"*KTP?d:yRiG=.Q`JOTt;~favOBNr ;hkCZ< i{h?8~a0|,k|aqݓixjӄ%.",/i.ٹSӣQ䷨FIK-ȤP߳~檢 ۡC[eP-ru6~2Y D,xDZ%}7tѺ)5t/ЧQ^GXP4q6 3 ;^OT/)C 8t9-4HrxAi#_{k;~= ݘ#G]k0aD3PjvFVv=] O7G`kY?k#OGߜ_F t\_ WeF"!Gg^=Pޓ֮ћMR <1m|gdy_Mڪ_pP_HqMY"e$P `P; Y"RS׻_qpUk"3F^ZxsSJi:b5Q( YDw 4aQ rzsY9Gj\aB3F{P/:]j6Y+#+ um P<4v2̾Oqt>f!r2m9>>3fK Npp:E7WzܧSLxӒjF<9Av/48nd/gnЍ7HNSȂ:TMC܋D@@2B.!@~R\k:A#Ԍne4_>L5Zk;ݤ%)c34Zcdun[x6B~)9; s!'8tl6.`*<**JimW4j0_9LNtW%X) Yi=\4$`B_=AnX­zoaXŔ`=uȪ˃Jjo:mg۴q ң?+*JJUZ[b'kM<-O|￉7n8{p"b~X/ pl֛ m뎡$kʖ.ޯW>.s@ H3Qp휈-O쉒&YΛ]2ZlP/C-Tݬ9A үXDSvuN6PmA"1@CEkr6g2H^N3= 7B*&.P69lb/^̀Y%iN0 ' ?%a0.HO{f$. -#p,;5g3qKȍģIN+0aD &B @"J鼩.}xr˙7 #!ڶwDXR}"%!箿B}Gw7OvqAmXr&`yHȜF3Td"bbLLLM뒥L5^cU3ȫj)( u(=[3U&Cds2v^ 5UӪ0YV>k?Qgڬ~ގO|#~]jLIؐpʔ$9{ASbwѠ%q>kW5D[qYK E5j{j[wKi3Z'@^``f\I(aw@6l,G}tAnږ<_^i(=ՓtbYG>G#|2Q,:-c"/?+gKW>w[-w>WAR 9{SCB`î\ 1*E@APigRp߁DuU eVs+++%w|~` 롇tϨWx`᲍BvX{ݵ0ۦRQdHNV{qގHӮ6:uQylQP<s2J9Qi%s;;[%~Q&9ws{hoJo :o#nkEkӥ>3I, 8m)B"@9O;(2ڕ@>Rfp R%Q*D](w ̙4NsHoPփI= _rAa(S6nX}ayAP-*ʐ߼z= LvKUJ&66"SMIdnfg_~ײd ɉ-$>T!P(}:HctМ8eK%0ŵ]MӬw%5Lt\6+xN"qhAq_` J8Ŝ>8_.u:@7_|Lך`>{Cu9aܤTқF_Z=QQEO3y:eSgxͫ> Ϝ!lVPdjK)fq}m.PԪ1_$N@0v}u|r&R=W jJ9uu7O=Z;AHE^r CA@naWrեx6{,OFPRwn[]h}(=?['&Y]@< <#ȘfJhDZ\`HkYz_ـ8z _opH8fGSf.vzn^q$e![{=@yq'g$rd3˘q:<nK7)n2 0x<ƺw#WϪp*|a:}7q)c,IVzn/.0t,i@XM)D` 'HQڀ&*_sŖ/4\$xWJS dBE()8HXr%ENߌidNeGCnMeb{`nw~Qz J&b#bDA?*4Vs]N`Suۿ!l-`wȯ[0+gM>~"MfQ=OtwpߚB"nʴ^U:{m- .9 DžѺi2 {Zᬜ2(G'%8ūٰ :V]> Ľ߇F%2hO>`.1 ذP S&Gs+yyd!Wd.l㪺ubh2){,N`V#q{BGaȰ-#fx*Vy"J`*>F$Ub*FFFnp vV_:%c/r A x)ySR+myG'[I%0B Vn}֩,gU& 5^n}t@=izYSOe 5MbonNsx\KRͮ@Q'XjI0CHI-ύfEpJȧ~ M4r jY$if+7V5BCC"`"X\>i? |]S45 !K_æi깐0DdM[cO_IYw33J;l*7zNHQkT9ʡ+ʹM_HUw; X+C(D~B-4͐װ`g8ĵ0*KC!>o@y FDZL-r?S bgVD>2;+S} Ms ^ u } p\m{c jcUO mᮟ UdB~@h&[hr!#AA5ql$ sI]]:9MauQv# \Xv]U'YO4P@ѯA ?T5u<  7rP%ȷUT,aҒ =kӹ{Aklg^KnDtݎNG&Q+7my(? B-KK{BJm'(`Lz(ڊ{-pҊ*6i( ujBtEkNcl YUH8Ʈ:S>Ķ24@j4--e/x ]~vv8o0==2VhrO7, ^B8?;ٓ4(%఍l6JQH2E:qmXt횆@rPm{(blI` vç;fNIoN ֯XeΎTj[ k|WbΧ|w~][~1%ₘ-P^`l$ K30nzy@وCF·?WIg2FK" d<6o)lΧ^Np$Fp*VkWfJ(WC&ղ=ZH$DAy7+I"c"a!#2@|x/` H&YgEÑA(fuf_#.dOV!D G(tJQnm^@u{1r[_qd7HfI/ˋ%\8#W+%_NZbFowZ$=>ZRz+e%}ܦ] ߠJ%ܓ=M&aLoW ~>r,(>f4~!4v!u1+T%hbfs7(0i|?#X>yXq&н!bCAL7J \3 #C `YC+:mX\%"9rej3"MPm~n@iZl컸` *$Nhha++1[ 3~ fLuL|pHH-)EP`@Rㅹ 3. rȤNSYvqsIE[l9aئ|_aUnr_G˖լSD A9 1]mZ%AFxVșԒ/x29Ou9S"𪈿DdKTNvM|ס؛i. !M.\+ŕUr@ưvoAJVMw>wPDQl'(%â˘Ի|#wi#≶ݛmiby0AzT[Q<9а[@VP0=^g`w!KsY5v$ilG d{a`)HAﺇAS.baj06hW{dAu]{2G`ӏx93Xm\<@WF(s Vnnn6*y҇5(e+1T = &0}aQLRwȮ &KԤe ˛KC ϗzꏀ'( QxRV3AXM< Pj o N h9;!~zS|0?>YC-qtsQڠcQwB!V%5"" srDAx(Iz6*)|C`c~ԬA ,>A8`x2X~3` F<Ufb6 c5&ab3a0)%A&BCkwM H?7/`1aiyVPm2I6JM\a8.=|ORR !28 Lf v{{r ({8Tg 1umjƠDecJEh_Z̤~j;3 4jS{wtu9]D˙T٬)Z/v7zu'TJ9m?Qg!yJ;s II23?aj?\-VoY~̵ɔu,Vy.|y}U|4IEnf߼-ܝKID2]ipů EϾ5+{|d G[>]{(SZ쐏]-鱠o 5|5 _Z;ukt"uZl6|[fM3۷J1US+'kn;nuFi\_._4 O3T[;bxoSv!h4{p~hhTf/OJ69.hҖA4e)R4vI3 т9nt:}nTЧP15`~)OJcʳ{I)<4.;iHVjQ2i>f݃i(7͊oEUy&Qn/;j!p՛_m]KxYCOmi؍S$w:6 9ކݭu./zA*>J$ iA+16s"WR\=gk/};380. 0A1\C5S.bQQ嫛M9XX!+@`F(cx;8T+QnLn תGeiZЮԜGa*XkRml.}<*jdM$؞vdxы7l8|yUh=,LK#8rYM $)nDϑ͜w97wd»bGEA0 1gսΏ,+nO3-J6'>{2WQxb~?H#©ڛP%blօ7ÞW n|.@vφeELӎW~P_OkzlVޜnvI 6SiNL{3sl/#ϪVܰ;O(m2mY9_-UU扛 &#?Qc-$GU_CmR,T\ GbU]*/Ha ?X2՞J)iYA_ψ3e//$~?ՔBkY#q\)(R23SQ<1j5u2fͱܤ[#|֜9驸=_iVukY>XhY4"a ԗć6-46Eg#ۭi)7m^[2 qy(;]+:EOVV,ws2xv[}r GU ј~ pWU`J,(Hʤ ɊZA7u$^]FLU}SxѸ@L^S+NըuqUZ0ɴk`edx^u*8.:n3oEo_NU._S9N/ܲP|Z,YS*|dKJN6J|xkm2YOg+ AwESB&#UQ. W 'g{5*ඏ3W͵^&bޛsT!Jq̺S Pejp޾ZnM;OWڮRM&*aUWƓ(@F ?hhanX4ݙ6W1WxRJ^]F'rfG͈] pMooy>βky?Unq,aZx5X4Ugրҗ,@ GzK#,嬨;EXg .E<)~HCS2Rlnj]YS⨈?.ܓAN#Ary2DHP]erӋtTb' G?c؝ٴ?es0JJnӾ::9ߜqV'+rLjթd؟5v f$9++Kw>ۮ$7#}(o Z4u;={">g Ҋ7#gftc%x`j}G=6Wn@,@u{GL!E=I *M,q& :Yٛ4V-RψOM$mƄjuI93jXav\$dpf 0nc~*;#+ x_l U< S¢ճy;% cB/!\~-g{<'E)= ~Qutz*6Z vU[Q>B&ۗ@lM! i\ZOp^jyf4t$WU~T#tB0bQ-2O2T%HTE-^N(HqVr81S,ՄO4}YFuMo2PDݥgD)#vO~n5q% .^űD03npQµۻ*UeχD 9vjjP[߅} ; 4-9:JEEGVMv61ieΥe3RQI탭c7͑f:'dEН<3Ƽ2^ .DRo䴳vmL 1pOqiǹjC=/觹la afooHt??wߩ]5鲢tvꑹM6-õ5A4xa'ԺUa uF$rl\T݀Ưġ#2Gzs;&-pObKbqdBqɓE:;^+=`^ sc0[E':y,8[ QȕPWm%mF=׳<1 #k6\(U=j7 E>JW: 7r ~-A˾y'i ?: gԾ;X/oS_qŽGsX 1=$5P]~f2>z"Ӡb8ļej4s (8dX4WI~96Y'r9qwMJ-* H~MxjNMmzxK2zq #uk~ҥ:ƕKKc uNlۖ-F'T*B5aNq?'I,Kl ANZkݠj![?_k"tcIIw$J[g]J+m )BYAYuQf)_uօT9r L/RՕrN_V8~_NԶkae,d4X Qmͳ z~5|p1josǧOF9*Y4=~^Q*mťZS5Cz1 (2 UT2QGW/iʿ58|.I>E9z~߳rkOj?c ޾yZKsQ/IJ&oei@F?H'.1'^I|6: t8b4;91dK,qRw8v]K )*[ܤsE%LUqX5 *+Pt`FqC[=?oŖ! x9VˬJ:ε8g39V1G^ zR^w+9oގ~z\lzsQ-},Vk'|m,gu:"-Zge(,ڄj踠~0z2{6Uh!`YR&Ro$"XC2r414]O6etzYn(W؜-Cj5ZG2L6_>r g\ V1"!z gcq<[6Xeby(MڳKKW)=8~ڇ< v L Zi߂UqKY|}@ɿO=#|{]:@7WkᅡϽ*\,JvnP]0'ρLܧ˷VvbJ6j\>7/2Ȓ2u1H ِl>=EQL;('Mg5_,Jnjo!=ͨq9Zfܙ _`,J=9O]8ż: OqHSAX8r\ʫMxw Gl8,"QSƃ%+*2H`4*eܘ/bql;=I(T/oRh.Z]@cǺԿ+UtwO R24xBJ&mu&  zKh1۲$wZ9pv[fSm~ 8p<쇫b?dM pO:4]R٭Kҳ8Q?m_i'0|kG0dH,UIoqۦ&I{zU 'c66XtF%.tݵ/!:j#?ya/ O0ʏV 3SWkMF{-R\%3-W QXwuw)|.u8Ae g_Pqjev~:@x×)R%^)+d=xO)}iKĎöty.gQ] ), \*lݮةkx6sl_ux>m=I}WXn`QS|+mӀ]A;2jo7 4Ur8̋eh c i}֣@Y~jl g|Ens`[Y1L'5X&l?=\ ^޲2/~0Of}-2Ԑ}CLrǿ_Ej S'ha]g@7Jf fͣͽt1:i0&4ǩ-LNhifnEK;G0K<|:k,Ҿe86 7/Cl\.%^dS[!V$X^\n/6:δm7L+OjK&Ȧݲg/ĀFM8Ĕm`- lD+;LUaB~,%OM`:͢)Az3X~Y@?|U.5vtNVf k5E?u{}J~Cj,`<~,Hs7I%\tc'.ZŚz"C^0GOSQ3k'4=Q<NZYaȼ<ʜ[sr`x!g?`VZ|tGg7[6GTp CXT#&ѫTP0O<6p^zhuԺ} K>^b8 aa|'3lTÌٯO3]LGz.M,B|5 s"(:i[n: ǕXcKI W ۥ`=G.w>W2+,#B&!C*T4iþ}R{ ?L`'޸dɠ-gӐ !0%->JI&ʦSh(N:y hG_XȊY+#_ς7Sٟ7?Du|6?V ~͛k'ŪWyIY9㪗- Pvh+Vc:=zLwvcŌ/+lt=@a9ԾnEܶEumRxO}Om!\7^Gybhݎ-j&Tad`[*ػ_3{ +2:u=4J-@WJҭԧgХ_Jt(KɈrvcy<ݍp@A, ?0DpM/%( j'tm:MR+VfiЦndaiǖ;ĿpIpB}7809R vؓT^`1SR^zs} X9|>l䉞鸝8A0 yFM8[/2P/fƎ]\й:'J~ݹV6ii4^1Ͽ>6,5CI;eL#L\*ē,x$ڗxKxEHg)wN[^|. rTx=y.]ftm]RZ(c=A#Ol5vS^̵3C@g[:J :^W4h僕9pÏ܊p'@xj{PSkm?i&Y4es;vkxYΗIphV'`ߥeJ+g"p0ę呲uDjXR;՚4qS>_ T5V'g"aAND5hE>6.^w9mO\дnklqXРj\B8g,kg4FQS)566z±YNފa{<  #ι:NQs-I30t,4q?*k)>Wi:kO~zvjXfIHpbئ6eJ>5nP}h?dZ5(7R X 8 PڦcEzO3'^5YVZ_[aZ ouUkG T*dfu\vRn#@0Wߛ ra`BgSBbI<m-yԾT=םa%cY{u?r׎}r5+1_Ž&S2:Jɀl?>~<:u]O w@Oyz)JciZISƽUc_TTDnG!) m)DAh?Bk]z| η ӱ$ >z)GN0哰 @d, oOa 榏_=8 oS-q2`A]:qݚ.8Exhܖ( X!+<0JfbpJiN)R!1|ĭ?#DZ^=Euc?ڱ.rq;흩w Jt4X6iyF8$'D@֔9⻦Rw,;^oK7\E_v>bc3]y`Z."#g;+Ne*3& {N5IOV3gGQ.>XJ6EaS66YjÔj<2춋L?-޺ߪZ<۽PEE JӃNE)?XH ڊdRnmϧPVqg]f*q;uU{ݱV0zLrc .}Fg- 󌄮EףM^tceHE^XgK>S95wX2lgwYwS{A~3h 墙/']LnpRQX>ev{V8k%EJXE YZ35Y"E(Hx(IuLXwqAYIT _,L6xqn ,PIP~t\VaA1kе5M.zz uδw'jDߺʞ"IdLyʏT~7a] Ιko/XInGv*>wI8Yٮj/%qIե_~ ѱCg~zzlpB‚?\q t/YحuE83 =u2Y007oԼcŒO7@3ϜlJ8 &6۶s/R*Ȧ^7AB!СCs4B8`8K`/N:~,Wy3|=8:|Ԙyo|G9E_T{HYZ[`_9z{4 G-C.1 gO^h5Z/cnj-cb SN՞K52LN\rrs2sYb*X4FpZ y' ɏ랞-`JKy?6i3,<2M"?XӨXU7=jbgwӏ*6nyuNϳ^Fe^W}+!*FO{rq\YWZgH85ЛMJ1kG4zhƎē.9;'+rӞPrn]S"Þ1RYr09pqON72t{l ؒSIՒ <ب(6(+l4@kްZL4LfpR6.z-;8~Y_|-rwf!c{uO0U&sW_O>?Z߮cճn+zYDdQ8ĞiI\Be߸L:/_KA@{Mp fNE)~ć k#w12Ә†=Ku+$liu(U3&k:] qӸ&& |uCqO<7J>kCk7cAM)aj(#-M`Wk2-cZQTL? 3,xS\E`ZM=ӓmX+cxi.Wos<<%wi^1O 7|{!X71]O3)7<Bo˟WnsUGqt9=$H4C")b[@?( ŵP -R( N( r~dwĀevggG{7o+ih}3~na Uծ)R-6/6x3#8̅ ؘϥs+wy<AbAkۥiZ=ySNIUUf"5E-qFx`{OdPlyl_.Gw)tlXt*t>vѸp5 > V*>܃Z&fI%*coRغ;m,y &Â^-k4Dii-&H6[/g>P:E;g" dgruHs_Ɲ|{/3UKZ~bFh$wc۳_GvݎY#NYzvZ+"n0[e,`{__g6cbj92un))1%G1+ty,PrgnO&<.>w@_лI߹WѰޓli'oߵM *TaVЛ4}[MsD"R3|W.N68s0|Ni#; lٳ&.zt/Ҡ|?YȾ ꨵfK((A w |Vz"T0 -)Y‰I>5aZd;jYW!n+1pNH0Îi8l~86:ÊH6AyȘұgt WnYX Ζrlܩg݁|R6[N&o`#}R>OsC${+U`4k6bՎ/MLWH Hf9DYGtV+nh'-ŗC{}i3aMus e[s&W/8Rw-(^u"%Ђ˙{yh&j6q(1Q Eu P刵tRLo7&%Qs|Wfkg=unn [;lYG4wd ܹygck#?ʼn a_a-bYxP q^-+S`+ m&Gγn ͕W3W7k(a%`R7߽z0')-W'C-l^[qU6ġLB݀tt UWXX,R˯;_Qw ShG 8L-c`5ͫ0=[|Hm>QjJ:sP~bB2w݊_D(N=aP6;|ӥw;XY'|t*mᔃf9oO}mZKOvۨmڪgV~)½{|{Xᰡ1h*50V"m 0Er#4FN9ךÊ X_XNn`5p>YtFC{_ HN;6/M]f !2"F291E]c}6 *.vr+ \8XrÒ5 @b꾣{\Z̷^),)))w@>?gɦ|vڄ T uɒ2ԺO[w_ud[iRp>Gc}:%㐏J y.G73Ss,SA^Sz k纄j4riB!W1"i'7ftoMz ?fr3`oZJE+[45.bhTeyͺ,tت+l. 9sGxei\8w _+} 8N@_s|YpV}ڏC 5SM)rpu4c6&LP%s;xY>\tɋkzުaB!@5|r ww& U.veӭDTA0FK`NOjQx)߈u1pK4fei8GurdN4ڈu iCBC,fZ; Rja8L7c Ic5J8:|ne.7gh8&?G D5 F7Q(yHGN|- R'0wW0k;ޗ6v 4 } _N89(;J` Cgqqk-ySd#qi"eNĩ}/ɒdSIhJnP WQwa".kטaPJ8%R2ķ*j  ؍p-Ac&V86)#}z`$3y_~aN^в^|r<6Vx5ݧOm^viLI_ Z+k8f5ǵ'Q#7N6]2M}[T8VU.m}xߗ`X9gBorӶ&ݸy=. Z6VTkv8M_>Y2}ey?.>)ć̝{f/Gϝsp/l2 iU;9 [-U2J`Evkm"mN@j}>Xh$xՂ5 @Sa -Ԋ,Bhual+n9w 2l*D`͔*##,vү]B`P~87uԹAJ-76)~fKe='N:}=")aJHZ$" nLY=d˶+K&4ZҔ,.Y|PZL`Ʌl#I=+I6ޢ ~EKlO. wjq9ĝ >~[bz:1E;:>6kcgtճ蛟,lum6N"˓7k,-^tC{vSv†wogWZQ %O8:xD*eCKK ңK=ҫGҬqXYma'IK>ҵkg;|=շ{c˥'Ly FӢ$fz33<7Fo+a@7_ޢ7H{EeQ&.zuƽK3qq+w-z/bԈ -ZYovhܙU }o3 6-EjT懭bcok~_&z6nhRCo f2ؚ ַ)|~0ۙ{6,kp95*Uv͌G` ɣfع؅ J%3Ce4'arP 8)e\ ,!`DZ[2ښ?=I}utD; 1!8yJ7 u,_{z{C-x6pLݓqjԮ "Aͅ'0/Nl0 |ש.|M=*ȁ'WqAq,`^cô˧Ѣky=ܶא.Q]>m=!p 08}e07S_R`}dʄΤAJyORGe¥GVjl @a!(X:b܌Ub;"6~ő4g3edӯzԩR⤩W(B2Jة3"ۜz.-NoѦZ6ޢ#4uIЪmc%p ZnӻO@m |,7f<MpgdTާSS;~qx˞CFab$c8f_?6ޢNEhܔ!-!ml4-ė-zƗ/z>y~ˏbu1=Dۥkd=;eޢ ;E3eQ[SZL52E[trR -@qpk\[8boAf%)1r|SF"پa뒃Wg$X==ipiʛlL=G?a4؋GQ=46!!!JJ8zX?׶)@ԨAe~$ hp͆ٳ_VZXɦea`)>GJܥ mZ@үM6 ⲽBqNa061wz-V%!VͿaI0O L*% !l-1Gƞ܊p0G85ҳ"N/>ǚlx^Ndk-|(Lj}%+`A!SRޢ͏ۋiu ڸJ3"4sd (q9h`4 #GA&h}<y.7&%KwDw3d԰d0py^xO [|M܍"<.W[J@Y!ɹF+]Z{>e^cynqц S:׳J6JDtf2Zq4z.Tf*F<.VY6[~MgJpʼnA*?Ɛ@?sBaBPuoUf1&yQ%]BJ99ƙ*vn2=.ܕ= FUDI$t u<[NiepJZg +ޤ BYt$ ?w0H KAAb1;q. H97{F\XZ 5|[¢L+X3V@:.d,,f15MBcItt8I]1?"7f3˹8KBYj߯fEP؃(X3+1O22{CĖA0YпKRUU-0[Pf4̉$W0??Rוb_gbg{\t5D,J幈iʕ5핧LdJl8-WYpTuE-ձLv.}yݾYK=2X ݌0EB m2n"szvZιT5TvsS~dHdѸ(5A-.HO@` 4!y#A>ZU/Rh" h4ܸ\'nfK$ 'eݺm6HRbAx_jsl|;UL m .RSE߬Ԩun˜YCֹ&پ?F|1@$9=?1د,sG|?Ja^B 9>Ee| l?nZ~´ԆUD%)H ~8QsJV.dٱ{k98X$O\'sodfd @Meժ_nfP:r +Qd1V(GómVD7oןʬKTXҘ5UDzpH"`>!$Y|ه{_a-Ub }8wӠImđDDr%gc>ՑHz k0s]e 1/.e&ʼ퇅zOƐEE !^ýu8"t46 ]m\s6Zרo@jjj8,t 9DSn\ h4F;fd(gg-9vBMo(j.?|3'g:iӧC̭ݴv_T~5ֲ>Mؼ-q\|6kt0K+|ƪx%[%$ #*/%9 X$'V nw+gfG`=2^v;m-)+8 λ89juo-r4:N3 >Ό/}V^%qd^.*d.2pq q;f*TUǁV7qҷ[uS}cCz?9fɚm|ظ~uHtH+k+N&!D}9kAU*5 Qd_^sAS |8p er"J6bɅB/d}y6A/y?5M: s5Dʁ}md5k &c {v1wo?-fzI`pڹglFVWXBCVv:j oeVGtj|+yDƽ,jذn/2.}U(O;4qb]v\?C?gh_F%qН6]`{VM;V g' I֨ `)F=a0)^Ÿ 4SơGLV Ę j+eI)\B bS*ӣ?s)E wihR`|K5aPR7h0kTnlEuF%h*/ KEռlu#u/`>N)Pk!`OAɒgnR7 !X#|p A\woPYkCy[xoƷo>xU)|8wՏˋ b<^b])D&ԯm/?ugc,H0Vo" nҽN EqokS׵⟂="2/c,2YD?oLrP͈Zh'y!Wa;[xQdHX`Dh ;8Pڮr^\_<8}Qâ%6`AMHϣ~5/#$߼:Yic; ov3tIٽf# οߺmxnM}]ut4X؈Y/H:$ yY}ewetōd}o{".sUГk)f:_\ևΓ~oJoO_7Y|Ii\ENh<{>v.?k|f'hoc֨Qބ1tdܦ&x7ա/A=%鎺t{ $ZRAlLu_. na#<2{'ZH[cxDK@M%HlCaw@q^P%I4 ׍9 NS؟r5GjLmFp0&!F5o# 1~s9*wW* aHf|԰43\:Z[}!S]t&Ma?Jf#ٙO{G;fnbj|3L&UROq 5ϾKoOpǨ$dE4K+P5ܼ3~j`QDG'C< *՞㥯X.}PvM[Eﵯ?xL.(tR L|򬳧4fy7lڼFMI {r5&ӓ]@oo|XԵh\ ZΡӶke8A,[vټ_Ha8x>5K #PTܺ*7/_aIOaedb4yg6pmFeRݓ鐸uPkdkιVɛhӬk]!vcX/J @MΎ6>saԓKľz)As.qεҒS` pCAd!=IÎ"18?L>y/ӚӔ|~ƞ!#:S ̭DQa>-ReT$1,sݺh1b:*Xf;M7[x⨡j$SFzbG^~8RLsQ?,$+y :CM;4Ҥ``;~|>ń>^0"<ږZcĊVPV!)`>sJNF)uO,<@&1g ,fM4uxvq>#GK&RL/͞5>f|txX6;{$|ktL/ |>Vl_}3!:Gd 8A/{㹞ArF·GlH4Ry ܅KQ(=渇}Dv37=%E~nn ltn'I sH`}oY\Z6^n.vIvO *v$y6KU8)OS7Z0\\å51D`,&EV22S =_mC꾦'ZM0R<1bܫ+wԹ<,{0d6xz+r>(?ͦ)&=̺:GvZ[ TӴ|̩E4FiF9z\cOcdytsV?KlPr !*JLJjZj=)4PrjL>cFh=MRf%ßbnJ-r>` W{TQ56^< g F23\/O^)% p׋,6ta(QGG&(\Ic<=!8 QF?UgSvQ.KT jFť0s5߹h[N%)JR4_f.cHsLr6AǦqΗuvܜY_q}% y)`&;ܲɌ䣪QK4ŝ MȘ.kLr6o!527$}ʑ0᫬Yع 73eߒT1OaRݢig=悬sl'LK~DH@@O^wk/"@f,7ͨ͑+;>0=::J3W?@Fp̲Нn|3|rGgk0Mhe gC|ok˫<=^y#:@׭*dbȡ&|Cb] ]Aë7ށh=#5@xws l"8x“BҰ'O9QDo~y$'烤R)CV "u sH#2AQm!$4E0u$k }e+&TV8 ?ϨJԓV*6C}9bjY>ᇝ)6ASx sG!'@< [] a '#߅n\fS}'@ Ӊܾ/Evz'm{lW~Øu{3 +"G$ImGnl4@L~85M^N8IHR=F~ qͦMq7!ni8}ٲ^aY+n<\T"y j9RA 5pQtlsOc&ړ^$iV+ЀיS*mͧg+%[iKvqg994leU$'|9:mEE,v!oiYx1?^t88)^?b<'f:<{ݰ`mN$ ȼq@+i.6Sb=W&f(|x!S ULO˅񃨂p(]<($ 哿hvʡ4ơ t%%JwE@ C(َG<}dža%wv;mjމovfuާrJD?犓"& f.E0 pFp!,n 11敕lsMG;K'nHg LWh8H4v',"p0bLM/$@]ZZ5vB^1L&cNN=>M==V8*ƉN;^j^(t؆նAm%m^vו]mwp@:Xx ihWl. 'VQ.A҂/'A"`%@M|^3uV9=ȁ%нDʕ!Cɷ:_rq,;sb\ l%c 1 .2vERb#uRiZv{j^{_lW]O0H8Zo#.:+q be$m$dG˚cYW 5p ݧw:1lbOEd9m}Gr&';|K_ ٛ)d;оfre*w mEeO >ʼnm<W'^l(']3\ȳSp1Nat vU8k|;u;Ɏ[̵x8VT Ӓz[GG.;O2oL9tc~(l4ڶ)2`L 't e]Β-Ru;6F4-Z/E<0[h(~8L/n+S-n8IrqnNsCbDl ,xSF}1;95=?IwtEyJ ' jrub bI |"p O(ҫyR9ծ*Q8|n}JJ= I3ĈM(_U b!H{HԤcX5Cb+s1]@Abv(m+rW=3L$\mIɤIF΍WZߕ:ǥA'!Ai)r8%Օj1BՏ6"(Rx~BNlÄ>JݽWyM@YuO;Mbp? 5:zϨurZ'cb@c-Nv^Ixh`Yg6>Q5'b&ed>#&dB“~Uݽ_vk>ʉ CGjbi:FMJnyLu2K"79)ʠ]2h*ׄs:9 Hf}jfM? $aFjsH]~^$Zqgճ&[?nW^MI_,}.;P-aDG`x^}4*RoSU&Xp| UI_,g7C{*w1GZito "<_-T?¤^X(eP)dnu~F:DS-ǰ)&7F;pHj.dvW xƚu..z*s(c`/vKQb&6"ܰK[5?_ﴋ^EhQVJH>gߏ;g%nRL~_A S$tUj?)eeJ(|bF:Vtݚї~ G>/s 3ᩄg=KDeja&şr^'0>&7z/JiTX/B%^gr& F$?Qb6XFWWR'GTKlikF./s;5!WazQ2:Uω/`Imϡ+⧣yNUPK"w`PKy.F6angular-1.3.9/docs/img/guide/concepts-databinding2.pngtt$]N8mĚضmdbVĶ<~uoUOAoEy8 _$EA@@%`Jpc/yrWs,Z|p֐67034wu^ژ8X:qx@BOg+> 9E";G"6z&zf~X"""^GcSneQ~#1wvf`psswcs4c`b`df`fsu6pu"#jdhalagKY3 gC>-L%[t A_n`QTn;{G''`lo;W4s#3w] &^S?e5?ae)ㇵz ]UU/5M؁J1?YR/_ʁARPXR~`3~XWpu>5 ۟<2ND^{L+ֿm%!^ F,y~ lSj& .C#ҹ8Ig|ˑ(`3u0-Ď퍶?\"fup#45rB =_8`FFVG[Xrb[hLF$+ ^q*oS>xk0L KKnlbL).1BN4<:X <~X% dCN!pRdJO{9] NIXC1vJMc}`kX˥NUq!Rx,ኔ>f6&OZц+'${)n yebebC|%=xA6eVaO;ׇ5'|#G7*v]wK@. RIڄ 2N{Ce֚s&&CŪ"YA[Ee-t"Dod;K:mDsnґ;ق+&SsKXGY9 ҕˎqxpۖ;D_KϬL{W7%ba,l슯hU5 %nb2_j=X"dI\( Ok#&Yw=[o{~oZnt~QuX1߅ @LG>ػ~,Mq5t4h~YGMkլT;Xp"d1CA+B|(..QEG)*ZXk=Ye @T9I92RwKh ARJ4=~Z2>f;raI58=+R9~p"/1P8vG璱QKsbFϞIi9 &b mq﫽[,Ub=uD[!+KsI?BTxc-Y2 tʣ\Q1r }fgjàR9Pg | PZVRBtz0/CSFeclKÛ] Ѧ,&?=#:BCX1ls+,i//'fLC^2wHx|KM^ߛHD"8]N AϬ jrjjz{۩>pНE@ ;z&N#(j<&X[͇Strկ'Iwu n*Akp*p"!#C/D|gmm[>:i1=(}?{72734 qۗϏ H< Ero?ڠ1͝ U8 ۪rki>^}|j8;}5USS1~?3͊r9.&/mz4/>l8~YF]@[X"⌫@;'(8.R]wȐoj2%\T[~.S `@~Ȧ̈́ɬVk=Z3@Wdun3%;_|^+$6?愔8$>i*Bi`[hSDv*]HI _M+3Jj[[Ӧ|HX6?p>eCԩ_? 5.heԲ ONZ)8 P^U@r `&%^g\JP@Ä;9Д C<3 $/λƐ7tdb>Ձ&e??0XY"];Q~QcR(njptzP𷳒{EWGC{~`Ag9q>h\3b. 7U"nz6\ G)@?yg)DEC왘) t``TgG/n\<PȘT݃U4m7XT(g$U/ӛ *n!߸1oT az|7(M|KRkPJ*sep!LirPx: Rbik(ߒήtuf8~oݼ.U_ ^_`^b|Vm %oJ>ev(+_RZ .]{r aGvM!<I*ѯFGT]<䧺T5337k/(u+O `hM$oU%ɤq7_Yv+kTMgcIq\^#e<$J:\yksR u\vJsA4f_l5 -' 3ly-obQYOڭgcl A=U0jbιn_j_Z=1Nu˺.z S+=5YydddMŜ"S_$nUUHEY&3[R%")ח*̼/lc McmMMwcgvzM ҶjE36Y2rrx5h07]FmAp0p!|j҄lVBc*PrưCW3J˔_@ź}aRG2$j@W/mzT$}xv9$;kg%Wz r}$|ok>=> kq,骞ݑź~&UxѺz=t!ѫw$prC3<.b@ <{LQ˞T$0@(;n˻:FB?r{>tf D́"3i:T #>^\iWʡ*!lhJW۳kxDHD"Ў;;;i,v@kh)-vfUARo<ROy4SG$Oѥ,Pҏgm]{,^'#›'Q[O4`kg> &on5Wq~re%oK_efۖUjd}O g"2쩇Iہw]Q1{'=",ija ;X0ᮆ5P[6-EYaJrGqT Lwm|Rn2myF䢦)oL / ,hƠ~M R*8ðBihA6ܪBCkKe [bim&"99o#8Qp^ɹ27!}KY1קjdx&kr6p׎f68( rF3 lҗ3㠞\LN.]a:u<0Hk}ncgp`tj溞 99XO|D-[ڋݗBlHv=ܫ%(kw/ٲg&(q5C]\Tocz? Mi &\ܟ㮺@fOxOÝF`O8zj9LU֐GW{_z RN& "aϳy ፂļmN.1LA tvn7WJPY7URz(3M p/욝Gyk ̭?޽:en+]h7e|DI<Ɓ[azS~u;f*]";%*GkJuEv*xOi\&? ŏzG3J{k3djF{fٶB ;'dpW,?5g4W- [[$ү%37D6Y}([+ܠυę.U]q׾ΔYqMƱemm}K!{GmyqT5N3 4i^FRFgnfL]1[][c2bx6-~1z|V_bUG?G3cڎ'ya]~rםooRs?#(wabi5Z-L&,]kqS=&-gFXyF9ѳ (8Xs0n ?zUMx9 e<7[aJp͛t@s@}BvhqunoSyFuAȁRfE*_szGj.c9#A+vT \֞;cčJgq (cٷ]!d>d!D1ȋuf-ք!sÈ޻HJ4"Ĝ Wg1$/8PWP,3d:EbxK]iS;lZm/}8͹%,nt>)-8_<-/1L-,d~d1CYuҌM*) *44)('6dmL%f#I/$p,RuJQBZB P شVEңvH7+g,+l[L!TGuѵf(PW.b{~9-WgF@ 0vVTf Dj4VsHz,gb27FQxEy;[7mow3rڸ`zc.;' V >SIekIVWNJP/ɽJqnDKy-?]H47mbS(HT w;{r[R:Uc+I$=ۧ5iM(ăI1oXh icO"XeD*L;A bjU}u RL\u.7InhtOB56>%G1{*a ̰Gޗ&#a0a h@IQ_2HJ$Bݓr_+>YUy.Kng]8.?Ky%#*I\\8"Jd`tA@4@I2cV ~O3w'ok4(h25kJȒaEQ(g{* F8De IY~X9.>7+FK;VFԽ7W_J8(qEKWu;0 )1^9ch/cd~Pq{^d0 iRjA5L8}H04tƤ@aZCNbۜ/"B^9\~?pk8Yo״p0 U4umchR?6G#y}恶3{M:8R.4ȕ`c4{@0\E<7"; xp{=ݻ\>xnlusu%7[Ӱc$ƿ}t%fh1#ɼwc'%?XgsY\Js.k7F乧\sVKJ~ԈmatUXchaeFUP2Z9| *3U9p-:޷hնU`$ji NkWie<=O[f&3[^ټu/˝Gvm }X)Gqibcn&6X1lD/%HA,?WLUHZ}l.fJ!~. :mRk9P7LĿTݕ&dQ:f D>=y/Qy]Ag9u9IB dFE sUR@B:9&:!U4{;!7i87H&DJZS {ΖF">HB%@@lz'%F#x$9@ol9ugEOQB\I:e::=ɹcK<- )T*-94$% ɬ|50ӕCN1G`D,94hZ3 KfjyV~;~(R*P7nC6|xq@x@uYH8d2I*G= //jSnن92^Yo'GӔ# =M "œ|tM v' ʩ?%U`V87*y| .0GcgvH>=2*_]pGݴA P/"_6 ̚i[Y+SQiIA8r}ޙVNuPA\tu dtv~ЖI|Fd-! )WnF.޴-Vdg(2o*#\:|m=ÂFX7.k:7T/O'iӻx>E/qoC"_o0įZfh_u<B2U-nC#߉ɒbDX8[Ӿ!蟃^hEAD`Bz/O./Ƨ/Fz.GI/@vݍq)oݐXs-o1r[<8T+K:z=qݟ` "JX-ٵƗx)>.4GrQiȐƉ[: :pg 7{`%MW0OFx#":ҳeکqmVL%>_܈ ӑ'2wB4-dտY~Is)^pJ[mH~!H&jNI) \G&IbM mЏ$~^ݪ8[=iq&% 4A/O 7Fi$\"e)% =SI[`ÀT( )m%Ajؤ0Fa<̷SQIy袛 GV,qWN8uAuo5R*Z.?IWHņ \iCm_q1Lυ覙Gxt8,W^;ɪd/u 8Y~> n(eF-:Z^*,td T U]Kznۭ )ȂBQ7O֣l9^Y"i.HL 4ە$@8Z 2TUޫ|GԢsNwA_UY ͨ`֏׶_آ?ikfIx9GSNTDޅǃ['i]"Mq*k b^PN]㙼{I [[Șk궧Vj{jn( rrY0?a)5m*L$"W4}EӰjS qO&Q{vs'Q[hJ/$R{m3 ڸ0)ӣ:~ƴVf^`'no56mV9ɜ~820rspviW1Z]6 V f`p.EЦ`K~"yiͮriv-Vj/* ļgW`DR_!Qfp")R)Hx`L &&q%כʹ8 @QѣESr4v#y{hbe(a(\ښ6&ί4ѽRϰaR0#E1'l֍CmIJ"|PӁBg>P6Na7"LKo]!<;"gJ&DRXKkhݲÊ!,Oho_q[j,dcl{"~)|i*L 4\>0Tu!Î5_us b۲~DI_*Nos3F0MSa҅X!vuqGC`̧P1~9gHY@*0Eo`AէF= 7`T%rH@'A1'AԌz(9htE:ݙHʹ z[/| uz#..~h~2Y=8yRGFRRfzVTSjԘmNA!yEJS$u%EZ k EȧdCBMkWE:ND;v@35`af12`qʑ]֓Czy: @xȰ kI@hHڶ .D6ǃ^xśK9/6s2,UTv K\MC6[Msl`Π'4A7~e>+L`y+GUuX" 3lѤ7UƊ?D6ԤxZDwvۛȰ\DT oi ^{@bqôol'v[L;88>%EO;E.s}dK} BKuRPc{AZB]b6$1{1ofC#],wYM319Ggmw `%LW.'XoR(&{!; A3 S{@7W.[yEcGo >QX{E(=^!xS\@[d_cOxh@( @!ȼ_N*bDPӉ|@+BFBTJ4_S!!3>E48N]&>=0;Q`qO.z!Cs゛8o(B%ra|Hd.wrpօth ֏cMNL|HAұ 8{◊o(FBQRU VrRP2 n%e"]ZB9kMfrJIasMej3amXaM1Yj֓ YtwE%(okp~y~0vܹ[Ҡv}m*)`J%td•%l?o]p`Wp iqTJQ/AC+w8SGe90dtVDx2#PЄ)?Z[<]\ :HI@Ai9Wm~ʿwacyHN6Q?#5_/#kNW "Ro XY<Fp4өWx=>˫e#U9OG"2t9p p'k 1WΊxf:}I)֑;Nu~<a/oN&!Y$uրՇ=_8pAf?E,N+kksPd^t7ok6=FX}j-Ff*;_yDJvQ5Dvt@Viqqe,hw9\<| ^ĢseHfMsp9l@cCC!7o.E<\x9ڍua4(T̉,Sl-j'=]vCfh-׉ITOqb%Y@kdɕ\mjS}N@fd veT- &)Z}T'NN m^:\ˁ"X\r L"B9f|ȷ|oY&}l~ ٹSҮZ=TYr;S1. \j(%0s7~oÏv#cLrvZ8b>p̣Dfź]TFPJݴՓR!46.g\O*2̵ZSt!LQ~Z^ܓM0"giI/6_LB9\PMH[#hg1~ɵ9AϛA[0VQHYI[UV*%>a=?H 2/#r۩dv},$}[uj/SFI Е#XvG9`o$4ЯVS~qo=-s?0LҟnIJkKӵgѩYnh<, *Q|ԓ +4r;[ѱ{Y!uGSUijJ6ڊ 5bwސ{.` %jƃ u{fxpRyUqr(>ZS7oHuHɗgs wt3p Ԧar0}qiJArjڨۥ|c!Dlה8Xi0WӇ_ޅ׃pL2lMLM&cP,."0&WE%g0>0ukUCAӡ#IpӤD+l=[$&Nz(mޤk xlEBAlF0-bDz=:Ms()縌/R,V\G"n$%ƒ ]'?:&`2/ :kLj/,w>pݓEt`7`DnSX$gF)F/Lu5J491JaŐ0o7L]@g/ޝa|w-Z!N6W4%|JrqT4c!b2"}Zcs|{O "ښڳC\ˣԢ$]BR{6(-]90t$1=>^ 6kAX{(G0_?񚚇筜Oe0K^lGbwNjN7-8UQ ~jn#ib$ #}Ԡ% @yZjL?(W}Etlvouim!rVR>1p$<_?.uaUe9n ˜Mvn*_}\r A6L VGҀuJv,x^fܯ6,:"%47w,%TbAtbh. ++F;(JepXdgH^&V~\DȪ m.s ZQY:j0SlE`W:qr8oBsqv4c^!ǖHu&[i?2i*b9sڙj w6EdM!D PiprLTۅZNlFz-KhKhaaE_]}F h~_V[ݚ*{02[otdnjIVDw_|ϓ1nhGC&ɚw&ֺЌѸb tY%S!_? V㵀s.R•.{vbk@Fvg qSVP_wF FB.?l* WЭ|L~:@ }=;AԞ3g-܎EOc8!YN?_@r,jԨ1 q^s36xh86ن!LRU/); "dPB Oo[)U}x+^߿:2eX2P9+Oƶ3ZR6cb 3[|.z|u6ZmGjn%XUxȉ߂_6%bgt*K/1kS^&m-ѕ4K̥ׄ2VV_O9+7 󧲷w4Z/۝S>Uwek: S2SŎd{AF/Zo{4#FW0el`+dB%Ynx}o1Y/ᔘ3"<~<_/ɪzA(diweX8Bm+(0UhhG?L#H|S&w;eȠ/4p[I{}Gw킴Lwhh~B@JaCmR* {Ϲ]H$-]d b+/ҏig] 6}]f v#58j2C*{miDEnH yJvne,;V5^A'UB+i 㷇+^(LWR #m`^]J8gf; qq'Ɛ,Q6 @Ǽw6yy?H >[MMJKišޫÆg|;ȊV륂YW(2Ő;hE?őPo (,1_* CΊdt76@0;5cY#xMljd$ܦ⭛v-[ 㓒'ޡc)"X(a; %F#%q E|e*bm=Rt"DŲ|dJܯ%L} ÒݧP$\ڹFy{f~Z3&jJdP">#?wN΅nHE֖@j@P)H!gH9˒2TnP > gXRDmB>R޺CӾs,Ac+a;8wB Jac#ʖ1a5Օd2DC6iPkWT1Bܻ !~9{LXۛ?uX4 yBk:Ȣ6Gd&E>r _$#.ڴtE]>_t$Kf\ O=.,6t=\\J}_ U<6| #&oQjReC|Z1%(rH Xd aŒ %ڢtV IPKX}y)X(L̴'hP/i EݺʾeC]A ]~q^ʄM[džh\.U)6{#>u)2c~րDOVEJ muKk"N( 1 Zeq-I7 *|a2wJ:Ȥ Q⌛M'%ѣ!!#Ԯ fDa =Y=u Eu}Y4D/Y#v]J)*#SsZױiKK5lR{Fͧ]^ ғK'vHJdә ɿ7.QdH -<Dk帡=ze]9iag@b2Pkb+Y04rh,JHeг9dX 2aK% _>/ tl~fwTzg:kPWQS} HM/K m* $ "Y;zyrVu/8C@EWM rOKhT]=t#Tc~ o$+n]5A;/_3 Yv)o߷߄,CC]E 1 %o/VV" o%Lйu꠭"* "W EUYb5e/7, d$'_޿k#h}nRS?c'Ei%FjJKIy+ba>SӴk^Aii|ˢgoVV=`H$X$)e r9#lrAeB^0r8WW&,o=ie{loT7/؛W:zc';-٥r$ٴuo )'Y_[B5bm6 L+J], (\W #q^.PQ"4nY} Ԝlda)ƭ:U,]_D7qvN _Ĵ z`E\Uqk.hkmZ~L[6mփ2ryF[eȤx~Pe [kQ(0r +7`YlZ9ܩ]G|pt1طl}(zMkԴF<DCBcCb!"%@oB_⺢,mG%#W‰<Cc6?9>FE720 Ax $Z!f04SPaX|ܥ.ca_(b4-݃`1q^RBjо\]*%MQŒeyXȆXwrE 3>wl(3X!.uq~b=t@<F"PJ{x\K3!CJ4ErEi%+iaL쑡~Tx"&K#B /ZrK}-<6F CCaYW)<'Z.^Fqf&TV0$0 !50 b2˧t|Qu EŅ_8UMn_RA({_;B*|\XN׈X@E@Z*:1v#HI7yeʛsLQOJT2PU_wGJ: JuGqjHId|"WDR'/AMQԤ< 'ߖ X)PSx).O"Ǚl8|'WCGD O#F>PRĤfrfȔ/R,C@ l3rrDpkWrڝ^gbRhTEf =@L il?20+6[uH dwXaeÆq1(2 FiXׅKܺ"&lL%r+W,_YTJ*l߉>Us0[2t:_ڒ@6 =ލĞӊ_jOkcIL|ĶjBc0\;8e!k.L$$V_5G&UX:53+7CLz Zh6i_<6t1<6ڂx3wXQ>E 4X8ʓO)#/j$]i"T>/ΕQ.il ՖctiT=4OO"E5N2~9No%҂@B@(w@ntkti@{!_UOqG&JO(mhu0kL4 Zei1M\ x,@ u +IY99d } GWB,ӖX|Q`5eTf[u [SD YU>c-ھ6:ֈmA>=^G8˧o\ j§ef % 9r$SrqXw£)eҳp,o#I`e+[7]6{N*BI/2)饔!"NDg * E䋏S7hN1 Kf#P%ѫPZ%%W$YJESҰT"JKAJ]2}w#B3gq閍j)OÌ@lT^Лdmim)(DLn.e!Uh6ѐrm;إxkr\:hq&ԻBRNɔ\D Z9` ܍#gh]P-=?}Fc2褞; /ܼ%ϳ_;yZl Hܶթ}{B"={M?g` r]Ǐ%'N}o>|@?p$kÒe=4 DHh !Bng07Nf Eʷ4mR4MjK$ft]bnD%Cͮ9 HR'J 4?`+I#hL1&*Bq%TВ3S)GSr4gZczE;-i̷~?Mג06y_=hUm`!* ƶk(UKEʎ8_piVQq1 1c)Zv,&Y"t \FHmGDLW[J+OJMߴAƶ}ʴzB_~w3f2s şL_TF(g)чTsMbeJX#leJSΌ!vdsR?z.cT$DCZ rE˥~呪tR8ik+ Ed/Fz;`eOX_ѢUa~\LH(^8h1 ]xPz_L)4wwtA{ጙ\-AxL_>gn됕-w+;7l/#v1c8~݄ik~[(a}dr3[}t)lyl̰86*(9,(Q%l(ȉK-[b;۰L-Y\>d4@P!SvƆu JX'S3ʼn*}Nr"KH)_~MwW(Xgvo|" 7jh;wgK U~Οr&D]k'Y-$MV̝6\ʑ[ ^۽3_NMڭѺGM=F3{ ^ɤCv.u ֛ɑhQLC׮+440^uqU&JwR9ޡ_T:@ IH!E ,F$ $VDx咅EC IdJQ"F񦩣kW\(9M]ɭ5 !{=.~p ?M({XE<~C\C#)(Tm"Uq*MCRh+)yxTUW}\f Їw5$dt>%>OMR>)STPevVOmG 5rvwd=8b/3[|f |@n4lHW%$3:"&Q>`#SeEa}7Kr." vlUYZ =X6Mz=~3u.X CKNQ5"GLSU_ !~s9P,`H"G-G.^m5@˥12#_A JǐNƁ#)rq',ιiTQ7ZNVeaX=km i)ZW +ɉG č\IRRT"R#F\U,l*|n+ 9$'.VN&BzXK9(2&۱P^;\_uJ)bIU2 G)V^ i_'Ib"[ږ X1S[7;=|"vxTvX4X v[jϮ&yYXL2)g(R-rͣXLLSbIuhDBNȤ2 -%Y *xWs\;-Z[8P{wNAI!~.l$w!n/yo͛7wI3WR݇ڠ%u`ioTbλ͙¶iTj16е@]:n-ەm_ل >/|і:cl%K^ێ}.Z&K%zW睇k9=&^e k^7Rfw o~vt;' n(дfRF }$JxȈyQd(mmK,e,~%s7aAw"Re|Tl?5!`)㇚G?=NH-Q F@Tdl kՖ-թIݺ`-j A:rݾU =$,_fHYFxM7 2 exwE66 ZIMd,pTru +(F(!_c*Zi{.y٤;/~Arjƕ阔DLDv"sYx;2EiAŴe){c'9$?Gv, 8Aub %"#M% kJ́՗=~Ɩ9^81}L'M̳vɫ+O'?y*U)Vdi_I09p> `U'<*RXЂ9aXiqwU֮Z=W&2ä&zplnkieaA_D 'pHSf~l[!aaH qøk,qA's[]yyҩEqY#Gp,'v99[=啉lHgd5 fTAcTY%?y܂*-*Bsk@)D\Ӆs=(V"H >4FKY\yWΞ#<֬APbdD[ Wv9M_eˁYY E~!>{6K.exW 3.OGLhJ!_`O :b3ܵ -w`׋6.ZB?gG( QV30bEk ͈&_l0 e w×LѲ/Ჩ_>vJ>A"\˿~_Y'lСz ^>=S?()fysh5ļU+D :ժSH,U$&'AOcX|z:i1W5MNMUTcueQ(YGő|>b0C{3oS:DY8n{[[v"#ٽ:}mR**6Vj!E䵶lS0a|>>11u* mRɆۘXJN[+>5u5U!^ w*2[/eB69mȨp?.K}:Jfi-9 ؐ47u{01ۖ)o/1IPk^abUgi+G1kic5u{'U팙Mf*T/ud݂EH$TBKSF.e5f7@uǺ#i戒 xX1?XAͫEƎϡD yQQݮy S|+>=2gNn[Rq#,<{W|y 2Dx+ÊT9l ]kT_q]wm=7:E opc,󤥯 W1ջml;ٽjRY Tj-;nF5l<9-ߑڙdqAB?Gƌ`+T(5a=| wٜe=“y~{\-_]1 mQ}k8b|WyLI;~0ck w)>P. 4iڮ6,ȱֽA޿X*@e7m5Hq*#qs\ѕq\jc..^txxareSWMv>3oHd2rӦ6JMȬ/<|!LPYk<55})ͪ 4'"̊#暯npy2bO`eR бo36gK=Y&f8Hcq<.Xݣͼ(8ԘSGW.X'AzXu\ eo7wS2^E+ad$`A9 hԤsAGB(Bi|&:v6.u#(Ǔv62n77*E (Y[f!7\ۺY{B56s^?gK \VZq奷&L"HK9)Rں"¢Zo:SUk )kW(18qC0.ߧ}}>e`%EkE)RvcRQ'r2oPE%HnuHW&voج -g>3#4j;VsF$- /9\v{3}oUhnmh`ܐCu|n6y6{o!B <'bކ>/>O ? ϰXn La>E6lEʢĎumkRd"fF7}2bKǩA*R|#@x^Sa$~y!Fwɧj2Lɧ]=YB]cca7eG][PͺnDEڕlϙ>fJg?ow|^I)>9}%\UؘaAx`'t'JB ؈̷ۗcx2 TKLj䰤kAXCPyӞ/zz>7kBQ1Nzf*se+9㱰SA2Gvrky`\-)lf~0߾y%`k eʦ/`"c;byFي&%J߼H2X5T`ZHGJ CcE+\*ӼCB5>n1q)KC^=\usxXDbFJ}iڎju'F46Is[99)Qp<{A]уY%PBQ#" _J5KXjǐ56}6ߥ"u1&/8s땙Xq`sM^ܒX=QSk}_ޣf KaY[Imm|ml]wa٨;gܫ0AXXvKf*ڶm3''9H:E^ࣿ҇xݥ(9?|ߩδv:iެAta?tOSUhUwX$!iZ["ѩsTL;ww|+zzz6g-\c{ }!*}pf[wm1ו6>Y[a1bj!p[(\6<ϕ)1e2 }xC_f 䣎_K*fTǫbrJz]'Y8&BnWj!;WJ 3I@~ yQ$4\:wA»xUʋV}P<98߶+;P- jyC_K nFN RP@jZ G}x O= ʈ W@s@c8mTQ~뢴l XYTPż]1bǂuz%,^]0P`63i)2Z¨Y#qnOkfF\\.Yhֱ)xaQ] hTkF_R].]rչ2exvm |/Q}ĥV?)Kdn?\ nT3}m/'W?B1%:fSĨGZD# *n2DQ:5ؖ!ظ`4#P8#3sqېNݪD0}?pdysm޶\r*6;6)wfUqgo uoM'yIMl:%O<>Fᄝ9SuH pu swrIHp.yґ Ei*TeNjsz}lkUz6K_lK>+6a[Ӂ)RD&|غM+_;(*B.yN5>~JJ@iV(dh ľSN=V[(tmXф@O:o!P,5ja3{lo p>f8XPAIQXM $ {n.]#FM%ɠ2MBB:* +! k00-0G$@dD|%\BѠW:2ta*~eS3`U[ p?k)p瞜slM)OPJF-() ůAF{b>LA\[=+RPUf(#FL8(69R&XT1,sCV)0Hx191єv73hӡm?u9-laa&њ( ̵1m%gld ._4[9݊rLFǰN:5eB{21=Ivqw65nߨCXJPrr,-?O&^A2'U.|$QzyZRRPzkIdAVB2_$&hKOeѩ+(o[}zZ}/ ̈sRO}< S+hEfcρ $bE|A:u$3IaZ`cu`-Č6EK0S!`tjHX a  ۺ?-?'Fv+U cq|{PpsÇӭnM>pjݰYՊ st*䩣|]e~VSft3swYGH*mLF DHmSfI9L~ql?˶ %#QuP4} \C{ZTOwAɣ~ %D6@np:+G/]]JSKRѬq"fFlZz"/„N ˊaJ|P{N!PT؇6"C i+"3̵)ZU \. ˄GQ)c7~ŷ4Lﭡ4^L9i){mڲNuen=䦧ӯ[I VUVNzfldEi̡+Z=]4L[}QzǮ'߷o:~g ֋PdbFӚj:Gg|86ߍ4 f}Ӻ*=-<~_]0֢_{BH˓k%z(N`V{%f哐ڦ*WWlܿ -aĄ4/"!T7uR}߳(j`Fw(>ч6E\,7q'+mw榘a H;a"(8%il/޹gΧW*sv[*j yMf|mJ&wig ޖ= ڴq":m6]ۤQs Ffb|3/NRb wuwPmP]=}84={ v!]ZjիYbQvӪr껷yk>!lY[Jg[ߝӛ6)1~El)YԭOuIxٗI:'Lf.sk4~;+Qt )0Mx`8[r fx1к(2$g k>]vCGTJDcoXD拎"j._L_rG.\J5q>C1)~%e~@"qzr#cYnަ0gT%A=cgo{tRSǜWr+V)vvuIX8Wl`º|NLZZT ixMY !Yt k֣Q݄' Kɨa).\ѶNo'W[k4Z% wV dK!@)^Ej3 NYqYA)JgO7y1źQ)K5>#T(Cfb&0!0W'0EاQ7x糾^Ӳz}m>(㡅\Qii-`\+$u*cf@ZZ 7y}Dn}K?&4 ύ*4@mm`C q 33'ކF|=$|{i`#N^<0kH^%#{O] @ȧ%Cbi|Rj%2jTh60s0cˑ,oW8j_*O[U7A)oG'XwʐA ѶHTr9$0c29J}}ESmڹl{+ x / f!gj.vZ*sf )o\dxT.450VUT!/B9rlվ.I~jHKw`q>xm[$'MK?fKZQrG#d(rC)UkTTw5:|GRb2 &ՀA?c>4W;gl4)eHPpΌ6: n!О=3SP# ,c^/iX[AcC(ގ}a7ᡤ4Wsʈ1w-^]޽i*͟:@IDAT}{@R{;Nf  -?xqdSJy?-f26·?+kz$߹``+TN&˳~ZuqzР$r|4hEKesāw6!S5v{|;| zX30x^;Z^Lyo KQH `.m-ٻ-sG ͐_(9i=/1BNo~#Pnj#sH?pyg7g])\-J{mH92ftfxN4NoX/0_K$J-fV9W^>=vBCb(AG\*~@6sbBCۭ\&'-,-tQaaWc vpBolock]tiQ}䝻g yC 'hȿ NUJncOUS ի#0`̜Yː"eڢbj/2){ߴns]8,V[V3tWMh.r74-*̼3X`zg(J[!IsRK+d·3ulM|&{X߈+mtH%KNhs[|)@SduSA~KbβI=Vq|OvCR{CrU֘d8KP[4x-|f #F QN[v<'N2c2-A8!c)gVi2!h֢ʨkl_drDLg -)%ØC@ `xTsGrתd  lmD`tONNB8,d @m&]1PXlxea ]p!r.X^U]OAJVcpT^Ad6EMo4zdDA`|ψ=eGjf37照@MPOoe~tG<}[Y š GOa{lȅ9B.`#fxz+0j1yΨ^P [6S‘-sz5/T6šJ G<yRBy+@0 Oˆq"du\=%qAik6V,>`j!9^њ+.L),͠To[qX;xS5YҴ3f )`+RЫe(bymPǎ6ƑX71b޽bp5o㺃 @XOd96Kƚ|nыVl[ L':( 4f,i&#g/Z e"3ףzj73k+ȱ%y~3\H9z].wj0*DFǪ*ՈR:L]C |\o&޽+6B^פ7#StX8QdO p<zs@;bq7 [ 'X1yF:7b qpj ]#/pNc1FRS7gR kK!rxK!f2 o$H۾޷mQ{mg'X24检(qFxb>, S͠0xk/s5 85_4aS t}%uPw 8sM72'8,B3t7tm\ҝ?_{,ּRM>E,t-wM[3.N+ ,fAPqkm| Tj 8TQ3$мbq(1}Emig*i>tqm#>d@ەd*W-/(_oD>2oEQq=k7 nXDjG:ĜУht32=YKф@]@Y?S|a9[<3ѫY1b8,mplxHX$ҭ'V(A9$[5IdeW`}*:IK$O19HyVYq㜞y:phKkf_'\zևX'^cTGo L:?%c1&>.dy,9_7ϢH{usD*@WY0T:_YMQ Jz(#ԩ?&I%`lb]@ [gz5&g{~~LdL-<P|)P)1xBGB1KkKnڐY)p$bEC&bl&. 4؜yA%dzLZ85ޏM_\|Kw6QYشJrԲֈNT5t9y\Mb:'q!o3={ԝ|R(H)˓T2O3sߛgO?2e=kӚ]ؘ{i\v$ɐإe L#c7.wꃴ3%C&dcV py\@gº|!}J&xSkZRE;˩ A9u-p>&l5P3keO9ji`?偄·/Ӥ!aȅ 9iQp@+{C&oM>~cBy\xxC{O CDY*O/W/HVێ͕kU7޲u bu*0֭+U`~ dFzsO^ܻ'LF$%&<0|)#&gV \;O89ר|iEOBC(H/d'JMI#9ɿzuʞ;*-,j;ȼ6)`ARDg"\`iCM[4?~.7mWΊ3Wn]ϝ:OڦCs&%?ž5yXl!3֮_|)bբldvņaYQe8=-tru޿ƪ&H/zwo=,-륉cYZY'J 11e|hV;*5*h<\vl #c{kwC W֬eC52Uziݾų`rꜱҪ0~§^r*V)~ e&ʁ{q_͝2k,'}rB.P$,T諷_掕gpdi~-AҶ*V+:|TJ`ѩkŀa=th#K/6Q"f``fK6Ve:|&"Cϱ6QfE6?&8U^^VuNy \"#2mW#SiloAG&,j [Ei.wwh+\9ȼhj]V/s.`]zS?/yG[!#F&^Zyw.5aE\/'m }SՋqq3:߷l*fǮ'puwӟNsUNXZ2Qh֖}+s`V4d '9wv-p5>DOߝ^"ccyI{EiY(:ؒu![NQIa{L>ѧ,HQI75mNw/3 6<؏)J}vMe #[;';m!iU)|ӼZϊR࿺KNtZ1q?~*LOQ' 0ю*W@5~M~0Pĉ~\`i|9\\%TC̐[GE6unB K3zk߆F8V^Zy<.וav["@=_Q ]'֨Ϟ//xyF'^['¿ws 6=|g¸'ˁ]vm=5\t*eSEEn H}삎qw1PߜeiĪ { %`Gtt@[\N =NVx(6'AϹ-Ɔ_MUu.^=CN4n^WsvnLBt貶)TwVS,wF٪m1?è#RX̱02y(BYß`R!>JK *Ȉ#]ܝÇҜ1 Hs^׋cf&#~ 5_* Tl6eqH6ᩞ2Bf 1SeDk➙|cASFۚNBu㠨EP¡ %|wOqyϬř[g ^baT-,aTKe¸@dld¨VxH,Qrlܬv0jܘ0f8 8S2ak+MLq]T\3*O?Pd{Y5 7Ddˆ#ۥNqBBrsyLVEVV)A57AGylTy7{Ar<{j)j!H d^c!ךJemD[b/ڟ}f&+E&޷U:X|ei[Rh}*: +y?JĦ _pG/|dGu[^C ċ-u2؎'x1!F 22?.~>Gn53aPFAubXUE쓃MڕX>Ng;ԿUd?^thW5_yP̈_ #F :俁v0loyl?Y_)HmAB~`yqˁyYXf~-`3`@[@:B>oyF"oB u0;\..EM0}y?uByZs/-AF |Fg((F3m7A=I\R(:g_ە޽crZW4sm|&X>E2y1%M}W询Te4>rQ\dBI;/yIdx 8tMnֲP8 QKu2BjTY7cK@~8fd05ݬXBPe<5OIN%1%԰I-5)t3 qA?փP,N]h5qUǴlp3q7BYLD߈&LF<18kجHˮ0UЕ(aiP2q~ ` l@ #qG@N 5hwϙChcjcA|R?NT@aVSwOxsO˼nliI(Cא5jwYS]i Kzް%)q:."LU_~gLf@9gy? m?x01[S"2,k!aFm̚"de|s xI\FRB mH}{^H]b:e: 0bCtH&i mY6X+ Z2;E}lp(S `PwweOHA{ZC݆5{@׏իZLjhvin-lR'= W؎_ͯQu]Iw_qYWڲ|.iGu8ݧ\l- _a[Cl`vڞ^WUvB01qȸC(`VAb`V!8̑[QE1PbsM0sa׺*O_&֍U+Z9l AЀubUAwQx.vú?E }.x8A;W"H߇vNvJ{:3OeXqyY#wN^5霄B7C&`ӵл\n>h |j"SRG0ptY]+>CxVLd!gt-n+H?s6״nQ ~?}Yqkm9[w(QgHqxMcdŴ9߳p^~+QV5HbоЉCbX~լSس(\[;kL+_ч[ql; E<5 I$ūK0>C6KLD U,ސ+LB m4S)LdX*u#Ms+x,Fԡkkeu/uhE&cMjL3<} Ųy$s{O/_TB*CA儼c |U*9y Y 9Kd\[-dO8oa-&jJ#n=Q] YԳN{iiesՉ>ă}7qY9+>3BR݄wɤ {ؽ߻оeqwE<-yj"fDPdDq`*ǖrJQ!h+H;Ƣ6mx֩)5[d¤,eN&CUen,?rczΟx{몫$ph[]$EG @S(֑b/Ƒow|&|TS$J~&E%U <}m-c|][b0L1L+_y?U~?lumY{O6CUaMՋo8mA("ޱx|հi{g ~I~՗O]vtd(v6́sk/{P([5uJ=WOC-|>fL9+عAZ>3F.}nG7h^7 }3ak޲y?WQ뿔_^PK>Cw84@ c|< #pG'{;mМᠺf&70j1C;i(8 ? V;U_&CO/w13h?Tp.a1ˢq?C^XەTc4SD?G@rr ѓf؇Eէ)uR $@GTc@o` H6*ܼτ񹢮;9[73&̽ڱfX譩P㽁vlom-DGİaFe4Ehrkw9O"Q9mG{AKMG;kO;yq-Äh&5^  eu*0jw/Wktʪ Pu/xyfkH.:}zjRcAtT^ 8@U"_aUz6/{cW 9j\u(•A1WA>'\Lwr2L7-=QSW@[G~d%pdVh~7c}hѽEJy)w@;rQ IMd%j,W[B U,Ϟcٙ/W*ɏ #y}RuIM;eJ&BU]E{>sR? z6xCQEu4ҹoݹ<^XI3dQ»G7mj+sr}Z݆W/2N7 dIӶh-\_`ߥ&srQl37hA%+o8UQ^g6;Yj'$eΦwxߴo.}`ˋ&6hq*,Ro$o96.q MlF>[|* =uu$E~lA;ܿsͲ")8C*R?+˯:+mcqH,+5grqV(P3b񊼊7dm?/+U-6g,[>uW𞓼S.A+kKJk;yn u"y}?N^ZWp/QBhSYQP֒D;|oϼi#43#꣝(b G$yCʠ`ĒoW݋9H^~ h=>?*spzn7 _8n"W&Ck[K9}JFOžԛWUyk.ſMg@TDB\/4LOfRPR,΋؟ߺ=, G*V@Rb3 9Gfi{^0ڏ\'en[4h-̑0xAD4}0@Y8b3#QjtPb1|VY F *ύ"!{~k?(d:` $cjcq9*ܜ\4w(g38q3 %ehNs%t9:Q4 |߮(s}Q(I [\Uvl13SSP̈fF\tXCL0P`V](JLR GڕdP|?C6LB!% N1YWqX_x4דw2\S5 ,Rۨ}V]RT, Rfy#SxZ6 4$LjYMR§#8̌c2⾙At73RKTXs6e\ 921m@ ܮ8Wq砺FKOdge8\}&sm#o)b+k4$Hn]Sq=SfFlJjaCdO_+V/8汹P 3dF } P`L! >{.;8PJ)N+PJR%@]/\r@ vOfn͛Oe:'XaYi2f>*CE-(X&fPvy^SDtS.UBng|QZ ԝPAEy뜯 ر5L5< 63.--*ji^icR쿟HoIGɭsŦMD]hqbxE>z>ZL)_SxcIK<m?}Qb1Th)ؗ *Ue<7CE\ KeDɥa8{ n:m@El",TS)dhpxHV *%ZL)7/fɍ9ZI@3mN;z)mn5]Y@)j)HwgŸ- e̿Tj}H',J6D m7[\x:@úaސbhMGbyV޼P ՌzP!t /1yC5MNm_ qSDpsNfhBkѶӜisGבֿftٽS-M+L^n>#nie@PͼHo~* K`v/72TeW # y (G^ dgr!Tx v PMal$N+ܧ_"6lE*>؜'v)[JUM4J>PEȄO—r!]% .s݆!s eL7V+Jc A{zi,:ō`9A[{-^J1 gyFQP<&*鈀Bm^^>bA)|Ľ驙y# /D#:2^[NH]D9TrDEP0Vq*bd_t'Z7D}x,#ж<7|"˄J[kg狩3r4*UCHIb'$r4-e?|wtW9(OKYܼ\wlOOW"8HfJ&S D9Q"Z 7g^em{.0wT<޻ۍ>O_[%gҘ@Yǂ5b7X#J+P$R7d'T4KK?nm| qx!1 lց mps82rԌ[BXgLPXD*Bn;ǵfK!MkmEXYцkiH4-v.y4-Gղ`1؀n~hlP4So۱0A#0ܹy\xjf>@W 6ϐr$X| 7)!v12q{΢ɒ͂Tkƽ]~w}I˂?5 3F<9 bihFJ`j@ p-<M'~>flĸf¯W~h`_:jX#qvVyG:>TX#,s-XQr|6lq얼/yA>ѻ"aޥ/ⶫ[_^„uDm>EF'XPOөw,*n~hB֕{<:/CtmSe K @E [JӚW"_dHuHSX'd/&ȕQLw0N_x$9-ؙ]26fbStSXK-忈W_%* ~lo.dsD5d (>CJq@qoA7V  ljZGg{!s\f/qoQXw` NFuTe^t@FYnٷRtcf^R\9n^@"Ɨ lk3 י/37{+bo3¶R9^T [yĽe}nG/1ni* Y  1F֬ks5 ( CòVLճt^4~)bj#\>%,08@]X2eez%&迩7Zi 5a܉g69tmm'WG1 |9cpJO|tr6L!%2,Ayɰd-]".ql%dF%cgRAvm@疖 MUݺ/uJ!%^I Ntg9YJSp3|aZch6?yJAElmcU'9c|moh7ypS(s E[ Vp@EDBz7V覢>~hɡ,S8JD5CȾӅ;K݆9'8javO--Y=i#kW$o\ǜ8Zl5+ONL@It~y̻~^_*&|6 s 1vF$hXss]X Q5:~gҡH:uyuw\PQuXF<o)@`=ĘY#f>hਾ誧,%Smi5{I lPȫ L֔7F:)(ğ[+G\i*~yy@_@Z ڵp˦']lc0 wRKC0m5X/iOd6o;SÒO7cgր]P&QPP >:eekYYjZvG557WC˴TTCQHd5pQ;,{31:w4רw< Cd>{ff}!ŵfd:wɃ6&<0?&LXCVvq}W~̄d]8+OYN<+0Qpl2\ݛ@IDATg/(YWXukJD~-V6 ucе× P̀J *T;NT\C֬r L*bm` |I1dJLLsuru0IP_ߧulչ=c9=tɨӰVV=Zwi{щl `[)RRX."( !:}* q4)\W/g9puf^ 2MMGdXJK 75"ʊkMǙx/i~ ﭠvf^ PDX*E宊DdmPX[ySUJ1کLrK椤8b}}C/$Jh;T33?7U-vN@N^UV_B%!ȨBp1{?cNWa-OQHu=aL7uʡ' VY)֧N)9ѝgL6A7P\?xpΞD4iYv]Z(^SAe=v, d]Zs 'H*/ƺzV]? .7E}Ste]n:m۶mul۶m6:m{oc?dUsΪP;b{-3^zss4fs"'-W>?{T 1W>,R5`jƴl:[2gZ=XP$}ߪSL;<;OyBK/O6JM{M#GU]¹q^hzf,%^+'c'+4|LW)\ ZJB A2%߯!IgcRM9 I: 1yCURBS8gO%Omٗд Zz"IG}4cgT^jM8>YvY;M b0h>n5 vMEΧ~|iC:gf.u 6=>E]|}nB!AZN.nu"g©bZcq' ʂo܆*TMI#i)n9u蕺%6c;+\UΑBJJUk,ӑ"E5DkY gR 9= 9 z&aC%L`)]x:U_tj&$=Wa5%31N,UP! UM<мY3GLl>V'iz&!s:&{ L cZaR7,U?@چ wR$IUVPGn7[Xi[%ۿȺq#Q¿4)pw Ɛ2OڦCRL(2ވ\v!s2u*@n5w 0AAcWG5=I|B?FVQw %?*.ZbxFIgw wY5`Ȇ.Q D%rޮ kdJ K>0vS/K#7a5#^>kG ͳf7BOTde{qJ14ٙm3i.9,N#&3՚X]AbQ Ygv7} VNO=!t& Rb:g⪬R؀n(,@yfI][gMGml6@\xvN)gWA -N|[Vsk*D 5KD}@^ zl!)!X+ݔ{ޛF#qd*t~Bf6gYa׀C ے/L!=(yb{ d+4鑗ě^(S7BH-{#)նNQ0Y32+x 70}(H$ B׸w_ǻp%dA aY- _QI"ߧMt>S?xky >KD#X6&U<P؊/&`]"z:Y&RaP19/9p<b_2◎T?%VqP<~_;/N/PnVf"`ae>ٛOሯ/{N EfJˣ *FN`CUgr }`,{A3M$ZBG@ȋN7\ 0"A],ȧ@QBO<&3Cm{ХY _g~N016F҃#zhW^rOޖk2loQ?+_1!+k J݁k$/oa"$tzzZ 1KL {2L cx5c 5'Mlᆶ[0 ߺ{b1 rŵO>Ogs$ИVDgɣtD NVtuf:tp*Pns*Uqos*Ƣ f.>~Q' o O{\cm0CoϛTsP{NeKêN!oQp [9n0EDy}ϭyi/S4J ї8R7jET_Bgxp}o% 2mZ,gF-($EhNX9MćWAȏ_`"w&eAWϸ̅FMdd)F9ˋ5rm窢=um<4k=lbt,osMڪ!7J@vfR2S_KNFֵ gc+j!62L_b|/N@trz h .Fpqsmld 3%Jl 0)I ެe=!& a7sBURNKkgMC ζՊǀD !f踏"I 4S~S6GfjB|ĆEk:S`j)noQh W_78_;a78en@|W8Pm.i!+IIZd|TBT+Szg0zoc ;%5#Tmٚw<$-`M@` y9:5JS+Åi&:跽mk IM$G 'T}PS 5[e:!?1_قԤL۳ԂsP"ڍ(o#ϻw)f>.hZ:7Hz&,v|; 4ܸ8 G )Ś:vCqG` +}ZRv_vwfsҸp*QD= @urct(^T0V8L:[ȂQ*CqqHat)AbUR=K}JpHdz [/cXEסwXũF|3_ӯk!eJ X,+0Ƭ>ND[WdPUT?NBll&2q Rv!5a72dѪDzG;B'T}~/Mt*V >{R]֝ kl2&ߍ.- xW Rqv,+*i<`f9$Z v|,?nXFkR5Ì2Z`P 8CY_XRM=&H_ʓeM<Ϊe& xE=tV5X.!"M:8(($2M=C'#t .>@%-=$%inϗjWM%M*u4Wǣ9Bh t̽y"};.Gz}7}͙"a>.CB u YT&nf+埁y{ˆ]zB0 ĭpSlaߝq808{бLF BPF)A(Vꤡw {F<dA%{NMjj=y$t?7Z=}#G!̫$n+vp R%'L{W &p[8aޑI2B*DL4Zw7U~5 4q"jWpfCܰp$6u"/]Ѱ\.NRovHQ$R"9n֭S}>1z LM Fjԏda[Mi.pd_ j5z"1jߗJ&63TC?σ@: <%:!JWdrpGۍ+ 8([H[VZ_{ȹ Is3-"=йȔƖ;z Ao`Fz:ﻃkĐ}Lܩh_,#N NiQ/VZ<7Dޭ\^4Jcc-Ƶgˌ+k?z3KN? c*ڕv׿b$.Nz =KSat}E% Tq'4(\fEuͣ Gw gCuA&&0eʝ4ی\C/|oj/3$1m;R/>U="AO& C,5 Yӷ& s[m`֎ k-O=賔~"_`; ̵pY6V5猧8BB )~z= J;zTƀT-qUWcJqkg$L6GSE:Ol˧pھ! Pihx`Pqx>$qyFLOiig UF@G5觎3R3LOI4pr_*q"f bAWu1=_SƖ&4fh:6t {e`i`lrTo^!K7 cmz5ssɠ^׊`1} ^;;χ.F`~]@P(R+6R懁Դ尀ķH:HeuؗMk.cTm @c%3G/1$nML.H+Zm+̿ \7mbQ>E2lVX , 6 r| cjr+20kUDnL h\2e$uȳ|m~MvURezW'uirQ4~Q8?zDQ]@ˢe#n z^8n@y;xĚg5 ;%[J^O>qeafżH/ݴ|՞vܖ&Yojn(6 Soߍmo0M8F7h!gZcɞ(z>4'.>Y5!lv/t}yknBzLGl]V/hBz=V^+Kh=zb{]lR?M">;Y] ,An^VT!Ϡ1oV}I7Hd81iUȶQeV*f1H2V61|1 6-'żeJ &'>CBtBa2,p;s#Cl{%?:B :N.oֿ ?X("&gF]sjxmxhۚ8F^zF]f)/\`!"YaozM:텒e{֋Я{kn4F29ZmuA򶆄w"^Zq&h9. 3եq?&y޺eH2?D4rm[rn[7l`/p':1j&/Bf}/L±6\cx[| Gn8ֶ[ޏ{nˈ?IՒF@Qo$@$Dp۠TK2(`E|73|~#{L!tQ NaieZsOnHynZ'CfQ|t5 =V(BO^Sp%L TaБ8C+:l0FzHذ0^-ȚU٩ ޿X(0F$ٿZR\2O#0#vz ^޳uXs}.σA .N/ NXS<=NX ^;[C[OZn_9=UjƇP5lWKnz>G: BGta0מFCEq=Zd5/9:>94KJ}qXFhLsFjyTcFZ{R 6'm跙Gg !H%II˜2cAt[Gs@&H]RVҤK6,IR_# 2*8At5:]Qm9E18Q6#UY:FtU`p#!ToncS ~US/L kI 'K=2J﫵6]*MfDfㅩ QD?IUE`7)X>O[HR9{LRJ*04/)jyG33k>I-S><^2e{Zzه{aL08R(!ygO'}tzXTRR՝lX1#Bdrx1r  ;(XM*$`wa,kifu3ӿ^~dSf:PE)/}]{1C0+hqP(# ;6H%/lDnfڪߵY!1S9)q?(FPuTӈF6 :耵'Ǥ(-@wzgVPC97+CYb JB&^%"P单l[P@`&F_ RԝkĢz@U:vh}2R[BH]VVᥨ R 7mclD c>LQ' t60kQF 5SbiYe8 4{~5\Hym8Lqb& V9wAR6@DU&MV7'?v20pd%%d!>\:L{85 ndZ#/ǀU0 B{?baDbR |;R`Hx | :Cߗ<|{%*xpEu~;QMV.҇S˿|F>5DtQyaѲq@0:} (i˲W]?; aTV 1/\E= >umŊ9n(jf#XKL߬^&Q .NᚺX*_X//fm[|ᓿwB$tRWbomq aȐ`ݎ-5wLMNH_n9 ^+pEQB?o9_rNWTAҥT`0&q=Y'UwK6v]8}VyReQ5V:(ilr{, +%e -zeƶ7:޳:5h?cxv`ӲsTض4;AN%; _lN>msc"_5b-ߎdRkACLJaqD"ENV ^sj4rNAAбS˃;@?\Azq&ANp@5< }N̡<㈩uFgDFyWAT%@lX0=_&E#;.1H@%G5 \n1.|S RU-/8ӊ,:Ay DbBKۚ Xs|)TV c Xm {"vlևq m"fΚf|S)ePH烰`Q")\ێZmd$DabMpvm(fn7W~ xٟql<9n H|'T&_>j9Y(W:M`wX~ @)7/M(ieӒsm6h]HIeA@"+0%-0~0\yLC%3}# >zW *['<(+m^bf)_Fmm^8KK$d*9 N\zp9YT}nYΕ)b]4NƝ'Z].\uWǥ?-oCcp&DWQA,Xsw?qCl;vrʕf-54%A9pmg414֦BT}>zJOz>k&[X8rtz,C^QBxGkG/Ta+gjlL5&$b:P1q 7]6CZNm@a8yRv# ݡіQq9vfbqq/_ (iymUi$b*`@:LYoͤs_#ck Ц(m t7pj*mxvT c<%2ڥ5C:@LRge ق4xYѡ+JPuok/k)):Cb0 (L_`$Ya}5V"b(%($C@}{D,\{xx4 iʅs຅@ `T VCwH;),{㭀H${ȿMrϛ(5 UB ,|^AA/f<J!Bd ʀT{$ZF^b -mTf뒻}uL*KyZX-iiI5Gjxxg.9K3w.-P>$1_W={6_-<czL*?%g׹d=E,T0M+}־>D6LIz?23ZXL Ig7KeX&d+٘=8?p$xJt8/%!JF)-pva9M%՘ܝ3{C *#\&ɢA'OD!lTDY[::0|0J캶˼~?\$JV'vՌfˏFՏ8<K (@oJ*9TDH@g-ϩeU`p!gxp4g`SK1OfS*N~KӦlIhZsBҕ 4RtytqܲӇJxJ,< 9&W@GG=^?axnk:<6:C'l 6M͋cYlY]i֬j`#LY$iH2**t#OJI(9)ǩ,+3jASD2~˙n{=MưP!PmԾ!r>l^7D7ܭQ˛IhDW*:\'цpRZL?enyr߶W9op|uBF4n։|;g+VnL5 R'VW(b#>,._\k:ۙq贯i3 )Ɛ% [_i N_?n"rPg5e.Z9۔2gj(vwv@\ "@BEePg7z*];QZ2@^$6V&&K)R4Mm<"Jq1qZ#d07BP9U`{'k>',ā~6Q=;{m<&Ovm\WB,=c"7ݬ+@ڬNeu\HXFˏCYHx!n]M THE8vz~y/ӧƃ"WI씺<悈3'^1{0Q8X`6wk.)-2vRƘ0b!kQzKX(^t蠥#.چPݫGJ DŽ9Ok⺷ʐ}|4ĉUUP'& .򜉒_"4ax3j녠4 SUv[Wdd-4YrP)ӿt'ߠc-R(4|}1i!%=㱜oљlr.$3{7j9IT]ynY DOcqTbg+y]fꁵv] zXVT?WL /#kX|؏)kŴ&wb5& R-zQ4j^oJlP`!Amb}x6F3xt*ͩL5mֳX|k2'Dj]4({D}N83R ęǰlǦ,Kis_WO/I-'^&Y:o=;Dhv[zUi,vhgFz[]x$Ru< ժĤ XP@5NO&q_ 3yHF7= ԊesY:LG }4lłIz$W?A{/+TKsǽr1Dn%_UIDXm_;f2W<CD۸1]A50/wZ3E|n%sbzUҘAtz i;IIMƜOeC;яYQFnfͥgdoDnL_)ؤ4c#ہ22ӣqM{DB.t* FK}s%mdI4^m,&Qu"2)W'ZV׼ڨ⿅P}P11LŇuC0n$G~ 4YZp'75OknȬ)apFTcah$c*l'I462tj{TPg d\GǚE;:KݝEvR~%6$ 3eI.Һ"U.St8~ː6<` ^o Nۊ@a6ᑺ g7^n[ LZЦ,A|O!]W}aqLLu[+mk$ KA~H2Q 2\N#ybB" ޖWƫŽpz) QAs_@yܴ_+@!n b kplr8^z8~ʍ\0+3ɍfm# A RbzmAJ RJl UI* ;R9W`?5֞h*!ANxJ v-1]otwp"(NUiil۔ztV#2Pp&ݪ<V6}^ #X/J`5XRT5+ 4sN)v Yj|7ɾinqqR{q[STՉQ9wBuu$) A}S?}[6\3c!#a[3]3>7dn.z9"^I@^?7G;m}]hg[gҚTgB"9<|qviѭ*2q'hk=]CLYK.WDPQf`tyfXckgE@g"74gvb1uYMt@_JM"}O<<*la-a4V48U!RxBY޾XC5==ӫa;#';) UzJZF{ٟb3tț3雷^Sت$X4#^u!7ezʅ>r4J<;mCdT5{ yD>w ._]!;2r:1IF6˅V&[!O ɳzI ,fз ќxԮ '°@o۷{6Ph[I8;@l=iC<)Gv'*2V01FES$nj߼8MPaxC#0B[,kz&K4R:DE30Ψu շtHAz Sd@ibVŸ)$!TNo7w* RRoܲ"s N= Gn6 hFrBILr\7ϿR:TC/u?VއH:be#",r3u񃲼!>Yf;ͷV\BuXȊu%DbHFOYZlQf^DZ32HjaoL UE)Mυ=Cd2˿(48./? L_;~T%@2?˞#KZus0v}pE 6?FaD$^h7*(k;C3} S [A5jAq'kY< שXs6k:G&bo K΂fl讎:Ch+w0MzUh!X;IFx f3 wfq -wVu] !u_LM4jfQ EPu>"UZD"}4kyv7# +וhݑ)g˄6{1 vCa5@;:s{(tS5MTɛj3,AzzdЃ`<^y [2i ־pdb'X.^z={E- _jP2X$aR$(0p&KiĎ wKMԀ'seS y1՚S{8&G!T ^2Ǖu#sJ,](~AP3BSpsB:gNUc d[f#n>NG)^Hveh\g|`&am26 vryIh۠N-Y z%9zR_d 2Hc}LL SE8a[KS(r0-ahHN `ҥQ54ϔA>y9v &V~SE&Ŝ]\[M Gw#IaȨDSwHeK?Dj=[ nV%e8Jq}4c`ǁxхD|,2WYgqxIΖr<зhGL \gaҊD`__;* c-YrXOBTU6rաWbTbݫ`.=29F  Vȅ匛{;9#/q o4B=2©t8G\8M̆Cܐ @dž}^7Ԉ}۷ ڌs IQ>. b T&WD|Ro4Ȃ m{dי3MA.ع Ƈg0ڹP ExAgmr'c)]cOdFn"cC6d"6:# $AN fP$Sq-%ՄeYr[ΈvCOv(^_gTTǝ/ D;ϓLLm`w[5~^pO-$n?]Ϻ[z}_vt^:bNS<9,vWA[z,R5{L#Zҥy Wڷ8ǰWZRUm[613f[BWL0F0)^  泏/#:b4 t$;yxTlD%,XuHaJ]ۊDn?]Q vebC9aRS-ӫ!UJA]{Vj *ۼy6"`+BJ~Pq{~֋Uy,>.Ƙ:N gz^F1M1w[[Y{>Ai9[,7$R\5W(S ~@ۉ}}~d{o__!+x&pK˥b"Wr(>3):HG%)YD^~*f>5?P!zxfnWaF%9h~t]kMn{Fn ~_Aad=P<I`={zD+f@lJcoZqh %f5(>UYloi8^..'sT~ €MX~g O-ŷqShݓ\.8Ý6&zͱ9fut: "z@h D/[ַs*.QB'ې"~*d,^Wo}Y﫷ޜ/hY`˵i. Ma7stكʔ!R)ڌfJN{覄{G'u.1 CU0*fHev uJs׺˾JG+J|)q v4yP ?q@#} $G@0jpP=1Mv5ruu =ːc+&#OtorD~|9jiB(_/ .џwU|>h %Sp5mTU~ݻniis)j!l)?ͧjpSEz<ݦ1Ô Q}tZxnq7@?8eg6&c=%"9L$ h/:?$D,'7 T' ėɸe~>` ,ضYӆ(xW)Ӎh$On@xw1*Ŗ@7|rRBW]7hODBL.bZm'z O񐻽c4"jhw5jB$:TNͪ~yԮ fflz3xzӏC\B9noG ^D͖γ{DhP eAA/G3ć}\.ܕ |Ѱt.CO9+(:Ù~:>ЖhM_}:ŭ,У͹>Du@{4>0x{X<˗gEt*$:ߖZ%]/ͱNWNڭLV-[rHKxtid6IWjZ:N0X rP336 m: o訍δq1EJڛʽ\IWٙ|eZx%L!ggT^eaň>ИIQR=`:|)to*P`CB4P%b 'A;A )ͪ!Cg?.4t`4,U#5[[4='l倦uj2ɼI䠙|K@Bט}Q=+VtD,v ֛`5%W"d(Y̍R3֫85ꊰbװ녖u݅0(G w-ǜXՅ20쵳W8 6Z6 .UwT^ M̉}YE0!ZcSprD5_fݚJy;++NB1s"1Uw`Nwq_;EXc Ob`x ? wD;pB3̛@=;#,T#L,6xYRn3V]5i$%|\tI> e:/PpOBj8ޝ^l@B~LŋDf(tdH=k@όf[O,$vs ǜf/7.9.hvx6 >sIȂtE`p g"hTFYx7E{umڶ-Q!}`>>*JE2܇UeK9j{H#G$'y+ˣIvg|g}0QP|_&yO˧#ut(@tTPxx筹p׏':#u |,ɾ 4Tݜr8zbF$o"Mh&/o`/ 6aSʿByzGV[6=d=}>cd>5ڐjyQ'K!ѿCҵ܎ѣ&ηH/ݔ8ţOyY.BUoVS>\-9Jbgjǩ-if9/C/r:tŸes1dK?"]~|< %RakuGx*zsòe%BMAF㴼!-$@-jE kA3qͮy$lAZٞ(r/ '8"XÄI9pu3Sy$)"~q[C"a+TENjq辆r|vU^QAGhGƖ7SO~7#M.ԗXf8$Y^ l/hϙ }Q|1Xe042X[Z0BD@]cp=s@c@ˇxŢqR@4.ۛSwYv>:i=ku<}aN? rZ^E9.NNeJe{MQNP1,˚Ox:nPSVEѿ0sS&vٖzߜW59eA_s.Zꂷqu{ᇪ%m&ȧnb5_-T,UY:p7K[bDJnt}ج_HAjʖS˅0ŞgE(|!xKHPM/ 1m˭ q֋fԀl i;VB#5BѨMQ7 ag-6wfU״ԧ9q艛TJU˰FHlIb Qg 9Ϗ`ʅJCPџ4eO#sgdN8|߹ⅴ5m9eǛ#l<3PSj dvԂ?(ja|́羉ou) sT]0dO8ilLΥd=6Pޣ:15Y{ I!;v, KivΈ7,D:qX^XT,@g1tYkQ]q#(٦,A_ 7 H[`}F = FU]qw7z`M.;a*_t^~@5>3j]^j6J^ 5;Pu[F˛G_鿮33]"ܱ Y7C,tTCm~WSVC2NDs[T֐Dd}CVA>)omv8U~?L#S`~Gh/9AۛXrc|{ yŏUl뫸*Л,ps5Ǎhg;(7GJD6j%9$oJ|b6h]N?A] o6+-Hf,땧ܧ$ ȹa _B嶮VsPGQaCm Tsk?8BzD 4ЙW}#5xp;d%tr˖?xaS~Zs ?RA'nWX4v IXYET`~8F#γJ>/.DPeIsݖl32oUy Nj*{nu;6woX tJ|G*Dѽ!(>4"?F=>1%q⦬n"O,׵70)oꟅڼP{we%<,A:f3a8 4&sLŝ'yc݀ E"v?$uA ܭN?zn yRΨΐ˜(P*"Q?! !tiQ[J ¥Di*K{ mB~T{M"EP?+'2~Ņ1 0,q`Ču UQ"߅kgvȕPU9^zM*&d&<>% ^^7%^+$x}t{B8:n\%ݎ)&ֈ˴%;s_\)=$ C~$ y\l:9A_j ۶eY}I4dZxgf0|w&l% i hZIFa%Iڋ-{!xwT5J7K0e}}FK =i^ׇ'M/0;n;RW5_HAᨲ7 )۲jQx nkc@"kֶݩk 7<ů`I=LʐLFSЅVĦGvedHBMfQl^r֙ Slt=Ya+aZ4@fARgpT!푘 a/U_I;# 9sd1`GY5eZ >ǺY )qa-|zl]` xLDVx*ְErݏ7s5 B]UW]]0oݟ?d9{7{[ sY6\p'ZOe +*e.q}7m}O#Ϊ0 DԼ'ķ%濊FDa:t (&]靝IZt%;5m I,ݛ0t#2Vד_\U??Evn!]#B]3iHRD紁&D/ldwi'c{syG\cP|&HHM XolD$`Xs۫C9=.5J;T%2v7ζQYN= nfj]Nt/͕7pSF!0u9{w3fρ-s_K-bTh$wm7͂Q/DVs(;BͱÏ3]mAU:viJ~<7i2ΖZ0ZbLE}|Ȃ` ,Z5ˋ UQWo^?iCqYMT!M˭I:+ПBgJ܌?5NQRp\ UN~,ln5 c 2_0x/"j@0 {>ᗙ*F,VHjPk l5^ŏʩFa j]Ȱ0(G1-KQFXOa`GgW ~EaXqbY@c0̜] ,4J>8@RuKeB{hű09V1>MXqpB|TP@HVSS.5uBc[_n% W~Zsq>cB 45\&DGXZ咈sL˖JSSO#rХeZsOr]RHLtPBG2"D<% OE4oG@l:0ܝ:~˯c, +ÔPnQ NJ4.vE^#1^!L:ILqwLh/fx,y-'?b6\6Ų獋V[HΡ՚E|<6j2s<%JgWqvq6%'y` ΪCw}zB Goueap9lqLZ:>`''(/Q.ƙL&If# eә؜(>%>Tvp(3ZO3:gS gqї?AcF6?0h5ceHX̠Fb%+Tg˥HsFJ.BmH3!SgnIKx{RGv.7eӂa F}QНZz/FK>9%@F{xS?}U(0CٮEҽo "1يOTÏq >MGT :Áw bɬTZٻYy bŤ~'K+Lz~D=|{JݥƉ_v2-غuѶL( ǵ?U& =&e i0Qqqyxi=wM"-z m@ Nm`,I&'#+.sNg.&@IA aE b Wxȭɦb֛4d:E=%!ÃӢRrR#މ !?{Ab×^`XF NJHHzչ0xk;]:H X;亦3.v*fKmߛeH`,wxɺ:_P/d7!AP"'G,P%Tl7JDl4-Vyu])*&_bMF 8ϥw2:9Lz YL298dAvXw%@=Ԁ/k WC{D2)QT2I{\f qOxETfT9|"M]&&ZX{ (j4TipO6 }#CEڷ6'x$_,+j٧$ &B[IDV-O;I[Q9,5Hszwdڸ">c\uz9tN3{ʋ-E,*Νrc FU/"[:֡e> `-ƣ'N22=Wy<}Z!^$5/|_j*9([sLE388PtvLgf䵧_nJ (4a^Zq#,1ľdNw gάLdx, B|nUN؋ڇJ4|)?b;CZbڈƬȭtY  ({ ލag`l[i`~;EM0k*^oGKJl.Xmz|(D'_G%뚲6"jhQ-2FF/;psлNǤsw%cY##oQgAYL]}lD?Ԓ|ɮh9ӹ pHW$e3_Wekj3SFwP\`Z /AB=8 Ųz)we$-wdPPբ )jPVr7%%l1صZbdzPo:^E{ lׇr9;UC'fzR\8_h">cʮ^ik=[I) yIܴ7a7B4U9UqR̓xF1b ;})0w,/ث;gS=,7Ҿo<9eeբjp.Y$PaNMVw [\47KXu:N(_~?01>NDX^A7VWIgz6xꊧ@(%}}eU.E.PX9ga#j&GZH݈2 \VuAߌ,, !Wz YrsJzYbsŷ̦lG17 jT*_Z0\6P:]t^?yz8x 3G@xcK 3ڷ?ؗ>pqShL#pG-;}L'UyoC,ԫvg+//ip835V\u%#\櫑ʵnGKZ+Y b ,Ro?X\ spnqzj(qq1oWn˳rPp!N 2;Gpx`,yȔj`uO9cB-Qt_?"u/r׮o@O3ҢFI@_c<(0No:Ѐuj7@|dUU+n4X[AUP)^$"IvKc88DA6dF,I-1>S7T}W!g.U|fO3^kBp#.G;:uvahlض7lضͦqcƶ۶m;f͝?:ޛd):6~T,QUfY =W#%ڈ//=[~]W˗oNə"ىA,DO.elwpzϳ2kDnY4ω}ȓy4;'8ve;˹T>H17/?dN'KgD`]3&z\>NW(tQqٿ[F Ya s~cIյj|.ed3V <v7O%Wu=j'#y#v9 xSKKtf (3DDu8$s87Z*^7DYt9S#:A&ϑ6+c18R!րSx̵ћzz5I樎k71A'w]Kխ H*`]ޙe$SV9NLcSv:{Txxo cSjf_=yǤ?;qm:ԗwS̫Ǥ=1ȊC9c99}% rm[Ik2JQL.V3FG~}c}^̃=ygkk5=;2MwFsIt^"&#{wNa1Y,krIG3Fc2Bl' ɡ)sNd*6Fj"d V'X^C1eS M1c^؉ٽ~W߻K26' c"&Q le驷(0GhD -2DoL5+eF)d%̭mK9#qoqHHRF_DpՇ`a!02GpVP=BwSYGDYDjLyk6賐?Q'M 4ٮ֚&r.+;{3CLc([J=,S R–VC@F?)ܬ*]DxM$مY!PՇvXf=:%#S(AWGkwbDjn#D >P&FktO&"t)ڡ&z3Ov0Dx :kO] `M~L9vHVVipU^'ΫYCЪ)aJ%+}t:-/hsG-Z yd)y ! Ϫx$n3o}L.umcMo6CK"mωNv+ͪ6'\5Ls1~iIbSF{PTfXe"$%g C@`j[| ֦$aQ%12^wq#qS=iyp7{qE͵j`pWdye +\őv.?)3m.Y (|Fuɛ/iĺ`7(j yuO jLײ V՚MWpG!H@~Ǩ0ûɰI+Z.in&Lj:Y{<e<G1Y-B™l6yd @N0e7j=ĨwFBԒ&cFHF2rP)0k0f`_r#~k2%bUׯ/Ѱrk+)CH,0H[On&iGIA7pѴTzk?3XrDNh--}axf=X Vy aOH.RR,Ȏ"%!eBJ&8ţ'2 4۳0iVoSL#o(Cݸ?H6H e}`ӗ'D8 z8YkˏyI7R67aTNm\S5NTQ.M{QFx> EB;oAӚQtJѾE_)q)ծ:䟭rv$`1"pp? /~ οvp<-dF/eL*9S-\7XStlMU$Qg7H%LCT+[jwtVq<)~zPַG4}aMјNjīxAQWk"ȨHw_9BjT:Cc,k:{Wj- OoM03r'X*PI$\39Ѫ5+_OɱUp֋D7;~+g$tI!S&Pl:R\E\Uہ!v0eMݓ@\r`$ HNXʹw(LCS^[o|;DL]tacDwƟnR^4.g/l&J>$(khFH3J,RRcDAO(|+`HT'b4xq"uuomU%u4 *<&wy]SNxt6|s(yn]]}l{VH{}]x%6].2PQY ݍ̒"^쁆/F}"pPzdKxz}~*I$C Ljk#Zce0~Ro%* O%v%W6awrRz/H\c?-ƃYy!6VJ罫tdžZx%-l<: p0BWKt{k|ر!d`\k׭Gńe #BK3 :bvuo /sOR b?{&5d0˃D.@˻<53wMqW·"d0Tp l⍐,%R; _MM!L=zZm$Vl2R:A<E$(BҽA ix1 7kg|[;D~5dzrXͤ$"ܸ?(Gg B\=v8E&p^{]n8޶ќ-~5h%pbvg_;+Rm㌢p]D_N@uDܳk+YyCN ;ә@gziOe;KLJ"1݀35 ENj<׈Q'[&罖>o$S$f17ٝ+ SZtm-ɣxb&L f U_+򲂶Wc s]lfXwfsx]Nu,ۭ 2Gf=?v&6/Dԁ6Xq8mHFÒ?s|4꟢!^>&Tgo߾1d2. @n`Bc9&ߡ|)s/ t4i}"7&=bB\l~I͟2HBRUC\|5);;vDbA?K%KT$$OqIΨL1i}|IE&_X& ڈ~պQƲvK>[IQXt|m6CouG>%]]%jJ֓s жl P=t 4:-W^BziO/(Ht`4"Ekv}_Ua6L2˒=mh䭈Y.}9T;+{j]&8ɵ؊bbV>eY/W~w;xj:L٫L# N]p?bhU07{fY95S Tp)&;u6 ]hw?>%EN_y 'O-9O)l]dv-cv҃dcL"#+%B\.ug_ʁGP*e~C`B=-@ .m9Ջu_Ń=,<&GSB-ΐQs= /^sX+3pS5gbbmC-C"D_  ֟Ei2gZ.QC3oطm̽XΚ"J J;{`{KSK|5ٲɉ࿆|"K5fQlyf螾%S-Bhzg߈"*yB=69þXrlirt ^u{pra}j&p[W <w t>N⤂gMO"]-?ݪM^#7ȰR0Ix,aaM7OOfdPgxznF7 c;vAj"Q6mcNJS,.ʝKNWLz}e5R4Cw..";;E߿>o_ZZJx1=_˔_Z0)Q>W,>z ~W) -tכ~;ms7݉Ukν=~PH%&FWXɁ;BE>,MJj/)P`ɵn?b}j'V3EMȖ'W䩇ZG^i62+Dŕ8zOn͋alҐq-ª0G?=d.mw$'$^)ԗ6EYYrƗOE7 r4iWV " ];ߟJ 5iFGUxzSȁ煩tO$ ZvD-)*1lKڟn2M,9/" RuI9ڿK](p;xyQ\"M(J^ ,kJw,45H hZ#̙>P|1ǀd?$˹su@) %; q7fߎrӹKOP 6y><ǔ38CLL  ٮ&) H=u:Mã &;[t-e06Or2R1M( PGtR||ACC1? KKSR4z^Y㓓vb> Fw'XWNEbj(n:{Ѕ4Ez-v=< YU_-u:jk hAp%mXީ;낀.E%56Gyb/^+|L8^u靋/iANb۝ c JKaTChFܕ_(7wbm ɬ= /SE?xI=P?xC)c=§, <:(ϿE&3)(}hN^V*νOH.c6)(#׬ 5ɭ` &JDcKm ; ?j251m3a>8Mgl.g'QssȌLO4BK`˃dJb|80O lnmuXX88XWθ[6pQjPA҅XP tmMN4luI'Z*dt z:Ǹ %*8tUWK#氼?^:ߣ-0l.*HЅ6eY1g,`s)93++1g,v`g,Sdu$rP0@UG8 4 l{i}GtȅqYxZo$bD-{XfNPebM[ST1ڀ=ۻ/"xv;R†ު6G@:cQy9e_d[ǚyc jS|3łI9x'" +je_b*DNMs>3ztRO@#$ʡG+-'BzX V)wlv?#p]DBJjjsdj O+7]xqrtqL 䯄:3SxL>{GC lJnV,(N~]9O%+rC~LF`M5wHa Pr<#<~uFdg{/U@4.MLw#-$& ޞNaw9b^yp0"<2! ] H8#yu wr=hܿlЦm+*xH͔Q.:%N Q#xPe,4Z: s_nڦx#|TAIp<ZģHCm7s|A{W;rߔ:Vk֭2c9ʛ/kxxaE}'x\!e|䁛iM> dSb1ff-`xgs s[r~Ne  zϦH\ca[8/[gxuBGή%eӇogggt림OMaj N`1"$ /غm|olǷI=\.'BQrCBHbաhIp;(y#_~Y\7ӎ)RBM(HcD;<842 8"~'%bu?I q,Ovᾶ8wNGHҐƚ=^JPx?aq? 0"s?s~`.a8xAw3 (٭"HQO<#_:q rhF+;lNtS j^/$"Gkg3fhӔ !%2!MY_ꬔ"tt 0-T_=lq9;; Z?F@1j 'Fa֧f϶r}~^ݧrt ;kI`@lQG[U?BTv3#v{'32s_,Oї(!kU7Ţןvfu+(̸3i{M?JO^o=\"[Hvf/ ,faynK܎CazG/(vovpdX<3/? Kc}@=X|䷾;B۳Es ;Oz# w @Lx\8qãkm| ҞI0xeapPIp化̨28479)\ 889]'q{B8>O{[l?L OhR~wLr*MFu7~97ژy^]|XJI{1Nt~ad~ގRkdqAA»R\|J73Q xȀQ}RJZԖzXzq~+:')Gsy*9愅[m+I$TE<|wqa+>;qjpi.F8T"弑bHQ ƹnPR*$'H,1X>@ܹ*[z)}4wg]{`Q}3(sH$O-\:e?Td)y P]lx#ѯe^K2,_؟gUCUO%] ^U%muvXê)GWzNQ^E.É4QQ~uk:> Un'OnŌ_x3ԙ-ȃzz @B3ƃ>rwBŝx(ʣ>`0P해>aŪ>,$sɒҀ]]##^`~@;";cԨo߿QdhaG;KۮxZ"!8w v۷P(}:uWAJyoW#]B~'_@dkۛj2~JT5x+esSk֚x,cp*ORgJ<ߋ w:@]LyvޙCyn/}Y jV]Ꞧ0fHkz ޺tSOPUgy%~" XP@J*7PTyv&hH#)g*+1utۖ*.kM T٣LA4po<Z-Vm?D㢣U8oA#%^Ifh4~B&gko:07jF[aa](lll8NKƀV;Lߨ_a`[0waZLL(*k5 U;Lqfz0a.| @M[AA]DdBg0hrrr4/B9}fⵖyE~ܜq}`h2d&O:6HSӟ ㏞gg?c9IbZwJKNI9_jx Ocj Cij(ynUJO"%+kjUx/22' 9gb:Q(e JW+ DDPă@ޠR QCmg牄%}{' Gy2yd~O `{I%uGhմ '=1=,Y7MVܩ$ ؆[a<4d]9?Bfd3D?߯ՅS7D+eZkܮHGㅛ6.Sj6L]/HHC[%[500 ODL75} -M'k$?&?UZV)zDFcG 0~a0>ExȰR苀X̌Ӫ~1!FqC3bjbw}z!y= D~+I'Y?ZڑҮ+@PR7ez>;NFi% 6lג%EZB\^M)@me" X* l8^W!$M6>74|ٰ+ȳ5TJ!ů622_+49:o!r2U& m:~/]oa8{FK׳Fvhz`Xh !Ds3UT%}xqH %xGO!KeqSΈV_0!2;C c,.#EOO@XS2'zv İ(PKD Yde˼- 䎏d 1m-(Iyvկ|1聞H5S뎋H\,DB NzJ%Uf'eCkŇ 3y>$=u+.EmG#Bޔ1%Nw˅{Fmt9IblBQ8^X,DJNcX˷z_+Z]nNbeR%?&=@hpz6,#u^XVVm>le㲰> χ PI8>Y;Ql$'_MaиnKVCf|r!aaw lՙ [`4Gt!y7~Z'y3)0?>+j <7\uX8jES, O~7εTq2P ֆ0]UJnsόRֆ]coTZW۲(xz._ \ x OOra>7EU+ ayقd|45ԽPyџ{`'ך`k' J3M~S}iE#ڷ|v:Zz. ;)N&%'A\@ 'G n::8SwH}pbj,t;QFCcCj:y, "2ǜT\gt4R|]k I@le60(H% a<}!w+1 廏LNn= O_2 ?s_;D:Vy4]LD }Dl8]ςyAW.fq}m'>?Rm&tu_O'*)eRgR؊!{+uAY>؃|;D*|횱`߳c3<_8,.@uu7;-6xW.Uut28+̶Td<XEE>]"<ݝԘX`弬=+*W5+cWa{ i>@Dl6Y䞝 !CHEB ?ki+qSr)'9NxFk}tjEJs$Do?۵hW[Uǝ1$ +Um5c?:ٚPF2[=Afˉ{;T)j/iݓ(W1#7za?pM7 n~GԾH%)B-g$lNYhF2;6#f]om!xƨ"t,=QN=6MJໃAh_&kt8bzvVw3bά"3BvߴŸ W 6p롉&J}(u.uEY݄'lF]NRT @C6xzps?;R3Eb o6|H$_ ߎՋn?=1~4I8=v5g*uk˨%UfZe!h★Ff1ў2D7-ʾƥjM&r붤UFZ4agJ+,$= O )ٝ6<6y2?TI=D>N|:os| VUKz&8r૰_u]0gh_M;.#i[l:nf?)1S vjg6jx@yE8C,lmOրMڪC4C Q3_h6߸)J"UߛbXHk Sf[EEJȇanwXC PMYy$B?Ljzn)L/R5ŤzISt*ݬݗt+-n) BPVRu72 ;*- մG=޲rY5V`=H6o~J`ʨNqAgd%zCrk]Jr蟐>ԓ^/xEF7Cb{6Nt~J^n%_`B2Wٝk(wCZe֑7UW7;t)~rVDT/ ]?^a!XWS'r [IW￑ȯi1>-fK&X?q l^R0F'r$'d%b'lQE;? c&u4HQԽm9}Ǘs 3#COn m$1!I"aӮE_pv0C|N獏>|Ĥ/wŒa_fndD_8sgfoto/ FuE!6Ա 2`o`iRTEQC SӲ8ix|6oBZ*á߈Kh90^&F`evI,\oH ? ~Gt%cdͷG%@/ww1^y?FcZ\Hs$й(c굧F"tO~RK0-@b*Y8N UZu5/~v*"|=|r Dם&Tq$'KXkbLB=Z(eʖ!'I~}ec2tQKh(p*.kݗpr'|3GtqŅu)tXT7WvCI}SvR.BXU8By@% MV4đ_`Ċ獨[4l$#܄4UFKY[˙#BH7QwN'v%FpqJV%>%,઒{hzך.Aض3KR/b3)Ceu]C?}YP<tXTilXT[V^읽kbl9E9 T2 ^^rg*rU3&'!f7lxvAwtQq5A< wwww Nஃw=;f3鮮]u.&M,%;2_[ ֧g?TY\u|HX{; heo{-Ԇ]^Iv؏PO~\1*LYVgH8+E9ry<c$We3)^nFt#ublPm#; y4 V}1*#R~xncyApB7 unD-SUycmk-H;֥SHy8/5t|?:wHʮ=l HthW?8x%nฒXʺ]&mHFQ1jlDc j;MF1@.(Zb NHijYsX YAi-r?TQФ#Л' @޲D4Rd›ZRDC\D8մjlFv]^X Eڊ^DaL[+04ԽPu7uY@@Ge[ˡ$y"e^zb5{ ܇\~ ʝ<5- vw~O}{ȗX w->Η² wǒdSn dH{31bv}ETDDjctsyŦ]S҃'m;ҨC"eI !.C7%-UKA\̄K5?Vza/RyEgB*"Se„pI0˱M]5hēLt6gjL Y] Ӭ͆AHfI! "_T-"SՆԇ!TzPөׅ|-s$7T/hr:-ÄDmѐy+V:e1_ #񛲪X^ Q´4T6$ױ[C&5dL9c*@WGx`It^ i$wz |p=bDV'rYd)@P*X$̼lڠ~kc٘omԼ6ksoPE2 ӌ%?zeR{"/묔atQ;qR2!) |o)$XZ[G 9U_!\B{~oQSҷQv+vaw_O{.zB*_1&B")d_8D `R)X1gf|hbvm,T_Ŋdc0֜qg4S`z>ą$kPIs:k2Z{&K6_ FHv;Om:Ԩ0}=aax +:4x2`l^ ˸=ߧ%8pb3JQG̎KJ%Gϋ*Og+6Xm>7 aǧĿ:fVVBkZw(f괁zQIf{]UƷ/ۏWөo)Z'ƀ3u,z> QsUv(;MOF~ɔ&1Z4TlUTAfYc$'8Ce飫+5u+019aty{ڥ8uZo4qx)m!xrLAd7p $d91_"[w`{AW)Q_=R!rfSb9OUacɌUi@C*dZázȢ^(Ǥ-" 'l.v&kPCʝ}t;b[ WUIvt2ac8K96$$efSxJ\Eq֐'XR@bޔUĕmkSٞ\-{C+/(ˈ=X1[nuAR4`7kh6+=jt ڟX y?aCw 0%uiLO=3z0yfrmfD5FGG#l8Gg0V-],D7PIB,K\vs7^!,3NCfB+[<ݶXsTgJ 0M% @U-%a˛}ũDnگ%3@݋nd"T)քmlьSXplMw=]N6{W`AzKOI[WlHgķeήX.=ߙ+[}ҔQ.͜&iƝYC==f85C1xW <@GSjNыʨ&ވ#e_U?+{[/z}'H![^#0HtU'H{t 7.Q_8S;GyMP =JO"Ѵ?B+cg,ܸ @\94wȍ0q?L1l0r ir}^ |;"R@[ &zNb uvɘzNܷT 9Z_76 Po<7:Ѡ?4 `JOOmob);^njoXJ3jrAZSE'ꂃŌQ{ʪ& W}Vo9my2x'А ZކG7hwx]2H<%΢AAIShhIӟjadkwĄ?yѤyfGdkK4?XiDb><'ER Eϭ~"D3 Zł}QW,(6.ێs}I6vwz 7wXol7%uO] 垛/'s+<~;lRd/k||?q U(%@CZe?r}ʴcz` +=?h""*e!΂bnKcXC-l'-sV2y-Si-\/G\rڕ_j;D0Dcsdy,2KVlrcJ5ə C}Jav~5}9{ jk\=x?76ίO O~< .ykGD=2C~TTH)N3w-+kzmz~jc\s' @-Jy·#Cy^mA4FU5ҢO-P; 4N?F qil#)s |2N1 )~DRJ~1ET=QT0QiIqm7֗& ~Va=t'jp= rbXO?~ja,%ӎDyT|wܣ-`{`thٜ]rr%%fAS L_ٚ"/Aanjat~[N"GsK9x]!Ł 8Z[191 (A RIAYD6#̮*#Mr n!|bÞ(\bnG$N&2-|H/QG }8nQvoޘr~ bW7"x<-~,uPph9‚J뛲(M&tn |dovx2lza2?`a= '?iN ||A_g< .bpOe::xy` K$_w\Y19G:W9,pEN{__<p*29ԏwO+Yf-7@O8(@Eh]SL/gMwĔJ͗G&)l)$w_/=%%%^$Q_TTĨߙm<4ybqWWp磮²\E0077srJO{ ڰ0Lv λ;Y`#\L\DA)vǰ]wDbmקSMz{1JE"G7}BM.ߣy@qo!KXY6HuO$ ٿ7y$l#aX=*o1HeQ(#1bҌhʼn/iVM(Ԟ vHwZ[do22MmnoUGLHj槧0oU;2B䴔kzܕVcO|Ġ@ wݠIZL+YխTv ZD,l{.~;vϙAg inWX@vptM{mr>iJ3XauU/ݼD.oJZL_{CuG~½өZ5%%R$! o+LP# Ȗ)ݻtȜYS3ˣ3-Si]]bY_VT4@(x:q]XPgYhzhg*V$p"JXN)=:1.|ƕ(ZA2pGi|t@'*x#р?׀u!1d wqɚ0/ ArZIEgZ{%d!Eٍg"ן(x ]U<+Tn<'.t`F|jB beNm\D%r%Vaw Jbr&$_10yQҪ?vB&|{!aFWbNF҉21$rPMƏ/Ȫ*,%UG*\§oVlT3E sdГ $5C #_ux囍W֖%-YMU/A%699foCq$4>CL7gY JxG}#;;@15R$)nZjS@!U>74d,n-W@ dtXy܄(6p7:@yZؙғKMϖ.xm* αMq![&KLL2'u NgVWS9]X09҅F)5nדB2$.jߑ%91+ȓKiE9+IL :=T>"UX-Y &#W4(1"Mp4W'h 0!Mfd>G a*R4fݙB߮pOcɈQ!86jE#jƆTԺŗ9֙"s.FL0$୛i ?n\AߦM>GVZ^_dɴj<ㄒ?^PWz]ZTʱ.%6#! doGNL ;Um;΢*SH),0_\ ;$#`+bFSc+(TűfӋQM'|bምWIy &ˍt+|:9CچaV @]'Jۻn3 t 4YM$e3TTEU 0KȢظw˒m,F_("A6ukr+-5OeB43 Q)k $= YhdKБa#-sG2!b0=Kqݮ`͜@FE%,ECL•8<4z;Gij?El@ԑug Jj~ < Ë:OXak`:8(&nRmtaR)k!Ksi$ϽǑ3O)^#r̐ ׂKW>/5nJe 2sRVSPcvh-1!A髴ɱaSyq0zM% Py!=<+( nl2m8+MrޅR<& 9tJÏJfdiߎJC..be5oo5:~qJ5ؽٚݙQY LMJ6SbFz|Ibl.\&tfyXݎd(d%=lTtniea3EQ6UKn1j0$p!m>#%<=M5eTl$ժQ:2TP1'Jg$&@:T0|aiYvsXr>?~x;trTg&E_;mQN(_)y3b9E;X84bN V:U"\4e|8Kwe.צPAf 2j^P[UrDxUƶω88v`uWz/@g4Ƹnw!uDavE?z55Yxy6 bo{av2}"s TD2~kN ߴ+), @iR}=" 9S:A|_X8@P:xLi6~칝S=nG&X10AxЩz)(`RKÄ9] R]ZKfQ.xZa!^.; Ә2#Bp˵_.5 /8tΚ$U**lL-] 6L#+gN"\T'VT۱nuvfB7#![3< ύ٥8~0fs*,-hJ[㧾Aj6dr xyިLJ߯_g7?o$8bh>m^+*.Qn Lk0q .^Pl&v{!= |oaǙ!˂ۜ{ω7)g.:*Cj(iAg[HHZ!0doK A%,@_ 7:mLMRS㞊q V,㱾W M9&\Y:&EqEljrp2`HHؕ.bLU`pmCPO}b"ȷܻafV\b5 Y77XK*̤s3_>F/E58I8}#T3w5l7ŝC$: 8]IV<v0[we,62 ~t|xj)~,Cn{Y^@H&4#? NřʗDTnDRvdzw|:Z8-BngA 9vgZ!+-"[$LfqDZD.͐{Ʉ!aSpCt<_?GԜm,|f1(SB9S94јaQJE٠T؟prqA{|h=4dx.sHcemͥ:c6jωX< QO>(GZf`gr]{c`yṭW ٻu>˧#u|#{f>:la,Ϣ#gj=#7a<|t,m=qO:lNNI8ᐍJv(4%FqJ )P.@0x}jL&2g9Dkj7?7<0`r*s̍Pd!Q`] LeĤ2.͡@ ł +2h~'ac_`hß 4= HcNޮ ;zFPyƭH;34dDf;0L|lv.^)GC;V hǑ :G.᡿SN+PTdСJ_@¦^gm'b=Lv֐a(9ɥ=0#Xҋ-4Ohz:Y^(F({JR[e zrby!P8+W ׼p.Txj(M(F ёI}B$r0#t1ǵ35-=F9}bE0jMLGvV6o_Y2Z|lH2J| MqjXe&\Ď6V0]5Y7X7 I~a7tssd*vFJF@ZI -[9v<*/Z\'P.Wh+Ҹf·V]V6(9ٳӃc2z$gPꭓ]+0~oWXH y\"%BS/QtðZ=0dt?e]JJHCX*yl&k":p V_DG sW[G⿺XL)%cF ڲ۟4溊%LT]HD{(ܳ.fݔ)s|̧r<!n{zTov=:n9﹖T . +-V`m_mG3˽ɒu#x!/uw5ݩj:'q 1smn{N{q-{H߳Sn$?[~?ݿ$X4@ė}|r~X1SDǐ:Et>Gf>jNՋ٣l Ef uv[JbS{!] ;.}|`ozZXjEZ CFՏ'E$8-)pcQΒ+7Xly;cdCGSD ǒ(SI Vg}= eG!uGd(L sPZ@mBdSĤlIWt8oC-A(DpyT2.xU=d" 'OR%Iyہ(į̣Գ/ܱ>D݄ {1i  KYjy3|<]J@}=B (#Id3{0`Q(FkMfčݮl ZYgKڤ|W:n}cw _~eZ/rhLԊ郰Yׄw>Pǩ>|5nt{^'T;N3aΠ?(hNOЊd8@%hqޜc.MXϭ+T-g_n}*`qo^ZV[7&>=X-:X&A,uu <q{hpE~ ~X,HD:V=je/xV0© 7  < #Eៃ??\SF XlkVt1pGx_0H_ TE9k uM=՜V2a3W@H#ƭZwT߃1:߇P5 PKPKy.F9angular-1.3.9/docs/img/guide/concepts-module-injector.pngDP]׶QK@N. K<3Ȁ7p;^qc,+- (&*$F| HljOjoJ >A (.`][;DDKE֒Ӳs9 5X.֔N?,t z=&:/ɧ/}}Cw;=F0 |9u߷%aʊ xxxtq^9UVR\L$kDRG&42G+-fCGGGb+ödF#4A@ۈt gFT2˧M$}nyɒ-7 S~175wMϫ֢8glhhڢ<"Eى%>hk&ys399ym|w9-x]A3+lZc"}M0* /=}dTT9J)hv-36M`K++nmwr4`>aV)[.7]/5-ޮQI bR-+,!QTl /!-=Ȉw]Iv*`ҙXzAˢ'V$(lAj{>&f;Rq&>V>]l{1{\7hQ%prr6Gn*// "YʩTo" xŒQE|tqT+j_L[k3e__bKd\z *$ϲhLLf;kk7O]\ݴZwnq"ҘotsXܛf^nͻ.:7 a8̪8D>?@CC3kZRM݁-AB2.Vs'uۿ=?_mU&lZ0)I_a Rqt+&b>F^^TLXx]pܡι@x)dGtWXRj5!pA&%'N`df,lveLeZ0ol4 @&6f,Or233iGKeU~Sr2u(1bWl|D ,[Ojo7WzN1WqM-,ڲ} nfD}ZTl:5MnsK6z;`^&.l|9r>R"B:1eWؠ9K8㚆(:M.}`:Bnoo-f.//9l?x?&%3^y@,oHpT.e&]Ͽ#CkA} (,(GO&IozPL0\RJ4EEagμ-gz=M#}UiM5ݟ)惨Lw>G/c{W(+XRһ* 2p!lHj%\(Q7(+GBB"5jlt ~qnSB|WzG{$쬸e!D#ccio23n+<\o6;olf?< &il`IknnF]r͍JOL/6We Z)ަ yӹJR4*BOWsu6ZMΤ3e}__\d쬑yxy KR444rrr g!Ow2}KY  u"9;ٙ:(Ql<<>{R`AW}wg)=MδX~ŅPk566>{$;1O"ҔL*j$ˑ$jBOtsdh˯9~6,Z;hhh ^* >/O.ϡEX`VBDk=> ̮]JEʔYbTrr:ҹ]8(!|a' BD%$LH$ FTbbOw8^Ey+ G(pbr8~YC)B۵/xR cӵNUlO$75qd Dz\3,Sgj7_C  ҟo7?=pu5#MBN#]O{;ou ,VG(*)b> -VitAJeTV|[ A^{݊wd?ǫjjժ-{AbxBPD}QF5(4 @_5# 癳>Taq@q1 BFOdLؾO>*>&9YmZ5b gѿ =IK9L&~m >z&ndV*LZ|{d<_w3so~ Ę 3G/jL&k tU [GbX-==ۻ;Z/[{]]テgyN/I  tZ`kv ݨ~rwtt01g-2h"#{@6}AV&$,rA$юQYoN797'{٭+wjmSzM'۫+IVų'bO)6OVEEIq9y] +'cQUjhmŖJf4 7A '_SR٥m|k 8<| ;v% on^nՎIZZ:PMM-77#4*%%$#cY>^]#X5pցl}ST9)=]D_kB~>256G@͞*TZ j66|*tVJ} ɋ_M:Z.c !)_?}qHNfl`  E罾zB̔22۝a|q-rfU&nre`OngwRD̒((질&:8ɢWyT|Z;:iQԫ^FDyu\*}@tʸڷ~|uM&%v+4U9{r䁌^cQig>,Tz]*Կ#lG|0rFt/I{ke&joooؐԂ@`mk*Y6(y՗I G[ٌTrW& ⋈xgpgL9 .-Qxlt)̖533513qyp|ltA7nInGyR%bY$BrDTf MLO7yzA;](n+Q*VFovX]JˡK *b;Au4,zw$*6t9܂MUsTpƺ'3?ZszFG4 h]K۳G'?ciI;Ұ=X.CA3<44ߣ*ZT9p,e"tM\Q衕ˏDb x=4Rhf\?Elsk2Š 0M%\& ji0xI~n W xyM m\Duj$<ݐ,|iaa 3I&gg!O]TϰF&Xk2>RR5Z 5${s8'Qc6bD )30H&1pNjKR5">l}XG6Y[~{X۴IfbhedM(/|VDm4xdGnm~0&[bM= ^vdU'|b hl,J)|&w}us2Bb,w\p{qC RO:{iigO^GJ'xD0=ў~ qy}'$K j=(D#.jռ@vwuՄpNv;\u#G|li ox%.pOBJogTFmR̠D~1S#Ph5UBi@,vV2鎷jk+3)(8Z.:5&>wh,_c)1Vzuw=6h*`|2w#Rr@eSvϓ@f>;*krl:i"fJ[+dP˂uMuw5jO|MwVppq+ͧ@ԏJ< _<ݬT xiDiwF5KOi[-PA EJ@EC Z~SF##檺 Y`xH7}݊J'Q dl>OZϫ)BAVŤrE8Zı½ٴՎ8,:۵<}wJE5T IP)F'GT0`ɓ%DIafuCPe9DŽI]oۯj߷H$I(=-L::yYzGFvV"=z6| "뙟O_ <!KKPj,p:wNQBsTJp?\ 2LfNP(?6YKnhBRu>r?űHq@Te,T!PyvBAA}iޞ\[Лub=[sŲ9(^9 <|aKԆUvd] 0D(oNjb ^iMuZ)^|oy(hu|/c=I;O^ i]>@/5[koT9R?N.Z,vevGeA#IMi~XcJ\Tj?_?`v ‰N/.rvCjR;iQOb.;Ò/LAC)NH{99.5,."z59%#f"/ޘd6Pm7my?KC{|#6(w-J2 ]e%k$K:=di9R.?"~crPd=waShph01SWi?:=*>]JݽÿJLR$z8p4鼾> 54? PVWAZ4pub9= "c*NzDYb~69s  q]:R-qcsw.vkx1 b<%fBkuJWkk$[N(Cϫ~p1J-)EUX jAB`?]=f6Q}Y(2mf[4ѸS-s}$]PgEo'KȘ tE)BV["#vt]MzZKFUP|ySQ&ˆP!m駇Ho % w b["ωxCNٍȚDK^;tk((<[{1vllodŌ;G~/}:_Utpw:«:!xR!Jhujrj~fe29^-ԎtOpX$:?uO41\bA(p;®b.F(o$HPLcIeORߞ)2GΒZU{#}vVCPڳCpNU-wQ LYـUb=qf1OYXiOz?z59owUz1uIPSGg¯]dzr;˧> H"aiivPj:rvH|iֻl[-DbJDat1͚1Ho\pA:+z07|dv SJ{]YU訸u*^OoJ`Zg'}ޭ^F00G&ɸ_10Ü*]EYLZ İ<@pXB,/jRc1ܶ^h1O| F"⟂;8"_>ˆCX먨 l4Z/+oBE$|F99SZOz~ zZLJBwW uC|3 êaSIh47[/ʗb`cټl pml86لRanRi1S?{66q7W( `o*?FYOiP5QkJ'V.Ή*_J ɸzj7Ih"49jyoעǭU%!᫲پ]}]*2Y-x6ohJ /`п2 㤻'McD#uhHMgMǚ<%9:c^ۣCB,!_#BiУ;7q@zq3˦;Zi͋rDƗI^`쥵}Zy̹*,].CV3s_qz:͞v7P.uB<҈ғYͷVƸpٻćmhX·Ѣ?n$8=9fWddyV؞i@|w17>hT<ܺ~ +hԙ՜{[p@#5DZ6 UZˊ5 zP6#,|qʥ,n^.pAE"i%vs#h>d  I1juE[)=>y777!^נXk:kq(337,D>EiETVm3PO+DIne>QP sHolqSʆr}=7?ldAs 'F >H b$%%aԽGҤo0l6G mo5'+{n;J03}zVWALdhڟOщ<*GeooUo{}0yk%22246Z'R u9.uoVM pyZA$~&jGn< )uGAommW>:r$Lb w}FkRY‚ Gn0@充^HU"౅iiumI`@B?`=.рy$& \cev[A5 !tI@̶xF[o+P!!@Y4yII؈J]D`}[ |spp T_P +|\$2lNyp7)l򉑁oOO`}(8ܱuqEH;Bm S`ƨ@Ѭ7Ӹ?g/ٌtwLou?YF\{*A`Xw} @K69) "߾ɗivY؜ hQ%L,Gx;M] :H0`_i7sU0욟MflL8/GuQf@o("_c`Hvqf\.q}=VDvƲ]N/T4ݹxwwRo7i&ǧ=@7ʕAޯ͛7sŒ* iW7GE{{{M, 9xpnYڴ5KJJ*n t +Q#wkD{9i},X`FG* _mgVb.`9*10 (G| `>h~f:#*UWQDCY :bWٍPj8g{F}vK8áAR>ĭ@o߾ ' L~(J8: =/l@#~o$/#&R.EVMG ÀoNH(]1i zaV:dʠ늜 _ Lw/YXDZ[ n5Dv`[o? vwwv> !&&"RBcx)`gk7H$@YGȉ'Σi;`c A*bA|{KK`67!8^R4>CO@"me+-sy}}86S>UU'@c66KrZS vl J.@ܘ;t @sŵl -H(Ǚ{d$2>r Me++e\H?ޞ͸_%dH#$#hff8;XqrT*(*(埑ՂgpX20쬬5[rvbyH% 7ih( 4:MN~!=@k.9< ȑ"9Ŧ Z9=GၑԩՒKsUРM™swR_K=[hXk~k 'u;/- L:M̺\)c|T!W$L@p̟^rCs&MprΆi W& .woo]ae 81ww)S| )* >MG &~ K_POhooWZiHގn_jaz~ڴZm1SPT93?*6$VXg`t{C>" ΓT/߹q'A7xܷ?1s 8~#B,5BjxRoƐH]L p<<,, @[L4ZLBBTk%YHΌ$v]_1SQ1=0 ZSٳ+Dd5T'] ߝ:%Iq4r")O&~ȗdZa~ *7PaK0ǶptQ `th T7$\ aeqЩѩdH۳S~cڋ3:#Z[B2C~)i.>zeMϏ .\`ktW.8L `% bb;g0t:#E)γ,DYy%~ a lُO\ҿ&SC@ TXFbBVFCK¶@|!tE*9ˍVV%@ǧPЯPHaߐbAQk*倊M|9Oxd6ҙ O@ڿQ *(S㒅Vc.9#w557bidW%6w tf븪"_P6 YlmhAmζ?'Wr9d2.A< +_]+kaJFD- gmb+Ƒ.+㫳Ykyura7.YK sBx@۝ƫӓE mΖ9.6_FU8B}:tZ^Azt4B @}l̉0 bjjWXW|z\\feo ^iI"#hm;%8ow/f%>8o?Y}`!C"h_EnV#I2&YH Z nQT2xx|x!IWSx[x1Inv'{c/C<?=숢7'<Ɨ{_2"t,? bD/p9wf&]!5h'"9=_  (eS_Nm{% / b1>Q$ү)KN9=]j[;4GH`g8GkK|otM-3ЭLɌozq$v^e|ptCQ}}^wrrj>Oj_˫sR?r@0$@}w%9.7ҧ %g'ZK}u1uLx!\b;R1ge$)/=?;FF+6-$%薢luO¤nݷa -Nw"r>& gfN) Txjp|:Jv*7i] է!-9emiHY͏hF3Jʠ.Kmm|څ#Dˋvxbq\)<,Ĥ>+DΔC`>;*X n=y\܎*8zȅ-;A!RTb &=w=I/2{,.e_?9 7#/Ddt@m^=ˆo4mwa ٧-ig&ςY1`\ T( =F x[-O?TەEdP `j7-»pW cO]7g{ee柀Tn4Th3&ݝIoYƂa2vrR5/.dϬN~riR̎13QeCن[rT͒ZԬ-ut*~DwzNa5"mӋ yz{JT++Zy5F6ߕ4a 1v[14M>NVK:^PrݺMrⰏxr44!VV!V)ӷ8B| fU1Ѝy}0 |>)1/1F }ZPs$Bı2IHIZkyhi +~I31Kh]_\EA)7,LK:i|?ӣE/X_?`KRmYy}<0 8eȮQ:{Pgłm2 ,o-T+\2p`~J`2C䙒Ce O3VnصBMR]1L{~LL 7ڷ\reba)R귧O LD24wCxщ[o&NO&kfovoVwԐiiu<psZ ~YWg=Rަb}02^vf荙<\Na(Hr; \^7 v߅BTqWNQ㵹 JtJ1}w7 o>sks* +ą.A}m[<N>B~Wf d Ը Foϵ6LI斥$+tp_Y=bAJZz\ɵY_,9viϙ`ڿrh-䑄iq?[?홂?} }s, ,򜚚/ bԭl:p- ul]J7|Ifƈzj=݌7L^x'sp:ux<\r^VK;( }59-0 cWq]OC;O[N\t)\paP|,BK;+.~ D530}4ne&rϐw cd BMwǙ`zΜdel6UeTq$~~9!mmP,|rc[ġ@o1Bm- s//ˣz\\fbDy1ɡA[JH 3 r4{B>D0FZ7pbWom.{V6mp;%'@Tvv'!j7%ZXHxsr* {f2Tt`yڎ@{{vrEYԬowy)2-MstIXHB*|x {#ŒT*ž1_s4z#_)ҏT+ mI~'n~|^,4uZ&U0HH(*%11J tRHNЈŴ֝ffoxxp'gJ\QNՏON1ia@t<,*+_]+T*;YBVBf*MB!$${eGV!2꺮|qq>SDqO#g f;ū򠬌AZEM[|&P;ǀ˛lΒu1vb5#"zTuU4esuX`QNV`硐 \I/2s/~y==4Lb`qB8EOw8˳X蕧Kh&$%<{Bz~۵p"^j8/bN]7h[o~Z-ܼFkOH軲H`P-G9עKgKylPͿ1#kL2)Wts9>3q[1{ҟW;׷pk12q],GgWOpvg@;kx/GsߩԶs~U~jTvQ8N) Q]얼xT~[td8?Mo,TlT^ ck^+ۢWd J% jLgHUx Ί~.SX|lF5΂]vv[딖?SEC 2ShjLs z]+tu?ǁ+3%GwʫJ)l^HR:pH._`EmwOmJ]W-Gx BQ{}+6"T}߷XҰ_H>9{ţ)una ]W*7i H/KeT$3–%@Mw.ıO a (Po9$`RabjsnRӴ r)}õLMwQPQ}_-0h!?Uf|á/sI-*=LH-`w뇡Q5=J='J%uBi_t=ex&iOB_[^̝s<8Eu9v!=2?/B ~犊B6[Y_N,N<|vfJid,V^$_F~$L㯸&kb/Ӊ> ,LdCyv{lگ~\;0~g$1)U1~VJv-R(IӖ;3^IN ]\M"9,0ˎuWKfq9j:p+3UTÚ\R pkt7 V)1'm/IO[,xe)_Էb.p!Dc^jZ;x 9}l<D1efFn.tѲ)6+1|ݥμxKQo{=')nPΔ>;2)uuLz8)E+A&A g|,"8=)7P,d?U,{K;`y?ܯsLOtj5ɜ4TF@ʫO͟zUu6w߹:O>+|gA9{⽽79緮DDL]O;>9G|ǟZԬ\z"!,o͉rYY$b\Nq(  V6nͼd1F)S݌檴{{t2TَCX_*\ͯݏՙφ|q-^¥DOG*RJJW Bt,o\>pc;ʦ :ÁaAO}rw| .vOWh\jޮ=1xX1DIl.~ݶ[QcCE%aۥXlb8hUK+jV3"GMPYӤ^`f`htA/1)/7hE"Fx(0M\6:e:1I~'|?8Vq{amiතwcjjn[[g"UjZS Dl.ve*JpP!Q" HilJs#+b}C$w(aI|l8k-2Eiv [A?}* ~QruQ:[j?^N!bQ Z(n-t"L}=XN~[O34NV(۔@FƍԞb@nt`7-VIoSj땃ݻ4uEfX25^\Ȫ T_09R"+?Bo2x[/kkh69P~~'Ŏ,L&8Qxgnϟ~D6..T aRY{?)] mmZu&'q;,5^l2SaP!~"vqf=*3Uz/חCؚ4e,^=dm?8ӵMTRnBk{b 5U(}hP6Şj %d.nt'Ta@&LwWK+r3أV'cWZ7?wBbȩ[r dȅϻD'[^&Ln"[{7{FB/> a&Pq6tԴ>ve)&3GQJq>;'s4,+@1M W$JNl#sݷ h;P:O.X f|tI3g ~Je(A'%ŽZ varMI|?z8&G! ={O| ~sDhI\p X /;OÖ=bȨ+++KL[eAtTzn/}R:E&vj: }9;[zRՃ|kC->;g'2M4el"E.]/ &grhC륜 ) ;BA1d+?b-NLM 7x?rytmx(%hћ)B n~~ͮ 97h>Q@ `! &+#((ٖU\SnEd#ช*:w3\B=A kkڏ΂q`>G!vrPl17TZY]7VX$4@$Z!@Xcqqq 'Ӂwmfy0B(DboߙȽv߸\ W4B7,?w Naq7\p^C@&|ZkK;H@>R_-+N~me\&dSw} SyaG()deJ:0EOKCyػu`-JC.}MGJ`yZ)@ $O˱.;{چUi/\f'|'kmmYѯ_!'7cPybY4#B{fb_bIuޥ&yPGj.'~kmk!| \0sp僽3 QaJh wtvބYQFLDDJY#"ߤQu"I OMMט: .4F=<9&, sAM:QGG1gka%iȐsa5h`'/` l#=govĂVVFF4?gB^l/c%`E+֑+9H Elpn-ܺ<srl}5PtC2"*La(aJjmkh `6VʷȳD8ɣ:kkp!cM8xC3 uK8o&KXƆǢL=rU5V @N5bZ~MH\57K)%'G9Zt$1 AKCCՔh3a;l<6 m5zz>GaR`w5B\ r;vlC^9zE06 #2%ÑXϟ Ց$+(6YgZ7LB IA,=^}[`/1t?Yx0/#?y\Fإ.|HXYeFpC.1Nj%EwHFq9%0dЋZZ5˰1kA<N*`38Tg25 2j\=&r誆"Hrq)B7=%[*Q\x1YI(LRTq ]\\d}?X3kysO-S$/wiӞ." xC}?@ cͳgNN@W.ʇt %$,I%J] 6qFU$9Վ*v:VGH-n`S%7dI՘كtu6cq{.qeqo:vagULwĽ7xr0rg܅eҊW0["'A3!!W3~?k4x!K7T(t7䵍 3ӇAu'OI|[#>зc:-$ p;<Viat\2$6ǎ3ݵ?y-Q3pXiɃFvk_'{\2ccc#HM$s)lB f($kbv4G'qe='yxaN6 Pi"-ISU aWqf> Ƙ{4lD$ "*{1`;C뇙SP};a<7"̍7`f=pz8BZ3F[k~XL󨨧p bCI)ʒ &^c(:r}X$0sre]\zeċ槙M]n#Lcz"vçZH('%&*r,O֍΁eDɱELpAYNV"Շm=0WVUa.M !@1 95\.81 }Gܦw_:mvxӼ ,%e &Ex⨩;{%Rُc]ٗSZ:A3_DEF]h)`!WYN"U75Mk*+6R7RnVgEXNtT$ vIr?:W$>Մ^D{j5qU{-ư,b w@*Ɗ+:z$^"#"I~,+ւ2U}_P`W0 ȱ<aХ'p¶f,,vvytw*O?i:DE^XT`MyUxY1qNׅ86KTWܟ"$ヨ/8ao73׻ertDE%>hVr_ϲ{3M? mVzY )+`'H9ێ$J?KEVLF 6}kXPiSovٽQhnnF u%k3Ug澿-N;Mうb铓7ٸ{a6FXАniD7|0VJ_.GW)v]YC$aaaz~}˜^vߤ=eFrЇiD_?021T,T:}+PՈ05n^V]XO1 JmJ)us 4䞮+'6rRg37t1P ~oo!G+WߴG"A9G"|kV>!$U FOodef>M# `)/$Ŧ:bzbq*}"* +IGu5n󆏚@99}fd$/q:ƅԨq#Le+INR__.ۿt;ކ{,GgFc9CmKOېvRza)2['D?'QԂ`=J ;z(6 TTsss`Kmh3t FKt^H'LgO2p{yy'e|GCgǾ`OL3K'B%NXdP?DnDrr% լ M<) Z@=HAppp{p[r5$X :Dsa  x?xl3*ՕwelBO V }ެXCko:~6L`d_&&K!hK՟NעվHJJ96R/ HtE P QfO3P Sj\R&%,~෾ʇb*z0~g"Uu[%Zc8GZz|qι^ٝ&8VnvX -(8-󾽽< Gfg뭌u>H]#֜5[)fݜ=g|%׾%w! Րx 8gHč(6@ Oh]kNaOJz]TA,8󉬤/;q>?i uhHS2)ceN]q.zOqEB|e4@ͶbX'++`,w6 Wyy;O21!w(c`co'Wõ&:mV'h<֦lq.1A7De{ F?vXW=3-UslXI9Sϖy[_VUK؂v&%WfƠ (j4 }ch)-0;^Ndl]r( jPU_Z!a`6\$`S'DQFJGbQaƝJ*XOMr#<v?s`jdsnOGGFouhttrO[:oaD_rXg@GōBx+ZI/;FUvU,56gBC<i5O 6}cCPzhJڏ6DRN~NUqGG?rvaǿҢ_W@/ODas6ݏ6@.54<|mAXw_1*ęW? T5n-O띩Z.=qqZZ+b t G-Y*굼\5nrGEiТq>ϟ/M͂ /u 7'Al3:&Fwt*6rrȵ!,;"g!Aa_0^V[*)h;zwpN~58w0_ &]_zH>oy\ P^>y C^Dd򮅫*09#bcCkצ [y\`f|KB3AO3CP7I#ìz>| !,g*!k.)^u-'y+dGSijnv,"Y -֖y"VBj܇&T1N06`C 552t[c]]]k^Ρu "VW?hxyu+ǭ/=#i@bsgg{n777z7z;G3&...Ffff:@:'[gw:[' jdhalagKFC;g>b@O50w{&zƿCOFYwVhVao hdhX8SMs889*Yg EDe ,l>]V[DRP1('(0+8ʊؘ:eJ=eQG WcqG;Fm_wYZYߟ#{[;:Sh]RTH}\mF01S unnФ:գꎒPHA_>M$|sJ J~jlAS$$7AAA3#Fc EB`J1+^1&Z0$Z+@q!R7?!ZKꕵcp|`)ߤۈ690eȀ8fEE5-x**xؠd0HiΪ^䋣7yjpyH#k_Nv..X2r}'`20"Hiu~ {ֿ<kPƀF70"_BP",FMI=JǍ-&Jׇ'#IwZIk%2Ǎ2-EU= _xpEzpd+m&ǘُF?O]Mh_$Mr9l{UW`u|8[_TM شL-{s*?łQȂ$~>ep [# %[ +$fw<Ι,sJ7x; JJI."Wƣ>KO8_=('B 1a&`fC^(<2mg9Sܷ%Y Vb6r\l`€Œj Q8[\}&a&5%6_oscDJ>29˳,*FS!旘%u8gIJѝ 2AOQZ- WD(V!huDtq$.ɂ1H(rxf7LДjy_NdQOL:>pŴ38OKem5 Gh)+KHYC1AAcKb`}֎Gȱ&ٹa%²L y^&9= E|[h8xe (܌=#'m-CYG0Sז1B,gG'fXuk`Y8p˶G!.33ZՅUڳU[LL$ & $0$skA g+ZJumXHQ Y0uKk~:W^~a}YgjaQ\q%%Q +S)h4^ƬW0hy7 φ{?:,W\ GYGfy `nqo ҫ sFWt'Rkm‡-".s_lsT~Wi%x O{x- 7%s|gu;.vC>W>š)~/ ՖW>'s, +rP\J 8u؃h /(FC;G^ɂ_@KF#(H%Zt Tb]%gg^Zb NŸ@>t8TJ/{X|D`ú}_f[v{~,JG^ar-cƽ# $uauu/_  glҝeqIPPHo"V[=l)\SM_#۫8hr6LGT~.qٔWG,}Hy& ;M-4% `fO)3w ~n54]a{bh78[?RS(~\X%>aL\D /e/Ǧ@zޏr4Ճtgd[M 9 e@?%rmHM"qyӒV?OJX긋PLh3DZUf7;?. lySsC/,&ŏ˻^'Ճ_Fv`B{eƊF+vQ1vh*R3~L)&563R7H\@QC0\i{T VTfU&PP|(!"2k[ Jt5֡Ee_<\L-͙/pp|"嵛>A3 ~\lVt ӥ #hӷLAq ؗW/gY鹾:-)W',^BC W V/9+;ez*XjMYPSfuE>}MHY 4ɞU\EvVu[s),.ߵ/q%.F;D;~9׭H7'\ḭa(&n1ӭSCZ-GU6O*ɧz0!qy" OI)F_?Qش ۅ_cf]TpR2~G ۸nE@m5֋Zڃ%:^Smue2Gu@tt{4M-{u0nSu*E?bS#4>Ai gsڄ@,XV/X7>٫g4QAޒukjUL]&J3[Z^-̰ee+.]ƛx N٢͡IVrαSA"(:cޕ{i1dT\$>řq΁O["D ކO16ZaU$ńWkZGsR7ۯ;+ f3=%k8ǂAuQVLQCq5=A#_(-[FEgju#;!'Ul#Tux9(r_{ezZ7u ҉*Mpu'O $*Ŏ8Tۼsi7+*uJnE9 ۍ89(a6PӦ![UuK+-'tcnO.TWaEKCґ9$>t  âX7w~%e#oM8m.kݡQm9~pd< 0Y* sιiuySP$MºU^.3/t몈uQжKLur^8]Zoʗ?u´a@b >cyJ6)<$OiqXwJr 8Ls-mfPBjڣvϵ] nqϮעӌGzFnM'Ktc>3Fl6 9[.g> |ld,fWn8O 쨾^υqzШ/Zp^c\B u>o9UsK0? dQBT:D@&d1 p4^o}T]$&OS>mKeE3{@,[>L j-ϮKv("Y(D<5ldT*#F;QzB=T):˄\jٿL4Jx0Ja|(i@j-|sCkIWӅYlCܢ`i5sn(̂S$- , nq`!/85`W!EnwE@TL" p1j2ɓ,HoV?ywMTM`Nfƽr6d|o'׼3h4 ] g2C6cJ$Qhyea?rB c4*Bæ(0uu= 3甸,T֑հLpJvzDSLfiI3܍(5OċB39W|ο4Fj^$~!Y{.<r=}[[A W>qdځg!Awfq w V<$`q>;5Ŕ0B3*报(7&"T_LE5-:_< D&9e u6)~,b\+cl1 g`"|DñДC ˉPL Va )"xW ˣOxQ q.&da_Ȥ0=>iD>X\[GJ꤈ 5jy70G!v3le=ysKz菎=%4+(ua@0{EFabB$3g*M3q._@L7 l|H&:?_a ɞX ;pҞnFl ( sиJ,S1Мw)&hF= WAL'D$' n|gOr WLS(R T C&FrCt5ߩo8>q{?~p<@$ES1 STӿ+QTbQ:gJ{n&Ampg3.+"QJfUNAE7;nNl*W2,چچaj?:MŷMZ9Wt0wpY{Nle;|(c3Ƙj\hHBd F2-xPp\%qv 3<'<G@Nn#T́T@CXztQ8`8knC-\r2NVƳmM7@Y,_ȶÚ1#x;EvaK.C;ds'% !gyX~xR4L*b}fq{dcX<0s.v3h\m̋9G6>mxe糀+疁9Y:o+Z/IPtfV8=;0H 6S;Hp {m$Q=DQU#~^'}xx.\OHn~Jѩ SNrz *]QmR'%-"o=rW u(GP!J)S w/iDp!i|XBFGsv8Iu,.$pBypbJK*4^!ϪSdA{o18 `qJ#ŧ+L PZGrh?(Es6s."2FV^DxԞiY݃}3=Z8IS]͵!JF*㎶* üp^ZMj|ZJ0BQ1b!CT@.#BP# Ue@Asx9)hG-k">*SJ}- F\VMO qM(J<9# \7|}Yls] .P{mn!7V _*G%C ;zֲzz@ۃ$h?F//bO- XqKtw7cP0{xCG ؟UN#}rW & C~G*mVaGe::NUޮ'MMFSh&S$ EΜHEd .ޕ{&[} bWZzyAŕ)|n/.a(]W%oв!nSefcå_>Qp n>w.t7z~~G˝r|W1fPY͏zv Jlu Nʰ SZ~sB8Un.-p5J⣦X ]{*=u+*v&#E|,J7D%A~\Oq=֏J_0[B7ijFCvn+t^4?gZteηkhG!j՜Siyۦ:<.jiy|r}ɘW&vq_w8UE SF%]b/G"R$N_کcت< w=^-bo `*U$,b1vA`#?0:6N@i[ SdEa_8;mޅ~)Sc ֬(sZehSkFeAFzc } P'c*C%%0kMC~D\ +20qZl'VIBV|Ys L+(Iء ~22;^GU + gW! ]Vc3wF>c|?s랟$0s&zQ4~ ~FX ٙL5[ Ex@<ݛ.J(K;; AbQ9])\'cĉPiay?(6ZCܣw~|4umo85I;!7y\!wFk<:t:zd38S=$S&=?P/_ xq1nelΈdObNNa+gj|,\׶TȓnC}C]rDMA JH5\"*Y9=a T-*'Y1wOth߮^SAxyqly~T;mE m_DzirLR5uWy&QmM(Ast&iI)c!@15mE$bob}h<aw>ɧAR#]/EDZr j~xOK~p/9!5Ff~aEGRl" )%c, H<9Z~(WJK51rCx&FLme;gRsapKˇ $KHt3zL `׏2_PbRI5-7ׄWݮp)NBBObPn&ז| <`i5D`gbߝ[(uh2LJsz֋%˷0glB#Y'kmD٧p1"֞\]~B7w],\=l]>'R+F2|2(nw,o-Kc6%:2;BŽɎtҐlș1ͷ'Lތ -+_(`oOC,,o ZE%NDOADnS39S{ۼyLYU CpMUXàAJEj=(q:2DI2ܭ*} ~ ƫMnӗ˗ψx %0DZ=ܱyB擄 'P-s֢.o\^i8VZeA.[c)6=- Lhu*ZjJ!Z_e˕YOӭ1Ԗc(X?J$R]K̷VLb 99rK>/vhU}#fٞu:ITi'Cd`"*KuA=ߋ7U{+=/]kun\gAT5.Ck>~CG{!) H>R` 燥I\xa0vZ]8/ii,s`u۹ wI b >%aȠ rNeRAMnb7}~5o\G5aU(KhF鑱R\.qgp(irPXvdcK,:`v y% HSلtRDƫ ODc/O˨"1\)4I~Sn9f|[ )a{n8'a[ u$q¾̾t#/uřPa$ODK⩴URY%Y0'9@8NJ,{2@T5OBl5O۟&z V'Gy>=kd3[~~@[\LCY7=]]ki~UYL~b@}bIaUfVoCC nʱ#S볋G:-]JY4gWlߺ-@nH<BEeflMSvUizGo013SZ6na2pHp HT5r.0h6qF rW>JޡXuB^A6&>3H~O͙Ak 9[写ȁ=Ds.suX&I $E1,OZ-1wH*GJS s~G*%/,dhc- U =>*O,|#B] f6-WyvNU %A7te δ׉zu6&ުbזȼ,.NJY `[o=~S(ʬu$!He6!*$&4ؐg~{9!  ˣTC+y#T4\ tΧVS*5*%[XD9=9xmf# z{4WAB w|+ eD$9+H࡬> WP*MvJ6gHN; d$`{yHa}ni)1f6 +ZrHNh*ЬA[Zm+~FzӖKuvgQQCD`3JZ椭wܿM3RU(x+M s.鷍J¤'##}qkju21Hnjނcq9.仝Xg7"CW.\ Z Y 5f:7`sĐƒ̴4*KGҝk5w1쇳hcyXȧUۯ?p3;D,[K5K d-I߄phuM i)?_2BlfDiGz[GGC꧝rJi"^ vLL+[4e|C1.l@a;!D&6qUOgtsabzV Zxl9 \ٌ'X $}-Z -U2졲l:v2n,-%Oa6&j!ucG֎_IlYÍ.-2.Ox?F ;R=x1"*y8se! W'ohg?a ̧y'򜴢xR|9u[ 7n4Ǒs.gT_ksE~8΍,l' .o'QbPwys%|îb0?D8& W X~P2nWb{˹ܔO'f6^Q]ЃOVq+3uljvtߢOwz鑟WIEfOW~<{xl S,;v7+HRiyL'lopD ZA,q$!AGS`MK_Ѷ=V»k7I-K(2m$dh׵{STBW5?W!ljjG%P@iݾN_z܎vNS/%n]OkF>tT/[^O,.aߙV堰n^7UgYҜiiJS"C*iolϻl\fndPwJnsE@|7f`vh1D~7HpHGeLp!9eb}$z3{ q"g]/I_8Z0ZcI>H]\, hv>=9^ d9<MyiSBb2*l*+'A$$g,WWJ)t7y)Qbdi.W [p[LkJ P1XG݌O͠^\3F>) li?Dy#e:-4]d߲R3VǘBƍ.%($\e]֟z,@u_ D2Wި̓BO]9-'W5٢캭HLH 1[lWJ7nsrP.t}?wd‹l )峹Mp+mYxV}Che, jF ðAt?a EdʭgXUr͎v,,!t}JΏZPt&S>k:&AitYYhrgVOK6H:pϑ%% y}e;iY 쎊 W@ji$DÚ=9!mlؓ'+G4 ΍4lb 5 */EG/[X lK s7"D|XMB09̯y1bo`]ٲxTO$*g8wm=3 :CE/uZ]83w3aT6(Vlyݔ]:7ǢT;GtCYԂ^U'19;B 3g+C?;R՚ ԇ@٥o^T"?VVh>97y`gxT6Lr.W>+^ox|d0;Ca1 NR!\Ģ1!FA4Ɋp4eLwA|`̊Тs;IX@?AZ˷!#ӕAс5Nuev*3۴ /g(npWz7'mNe7Hƿa6"˪Lչl?/cvLߘ)xmɒ|VŕF8x:l_9q$.R>_Zvcu2}[PPN/[~}]a?>UaVm ?t ZK[&F H U'A調[G Qs;iU M߶ b.p!Cz8;\/! (jD{._ʏ=>p>Ka|=c7tΙ+ Hn#H]"+nU[DdLGE>;}cn Xg T:bM4ɍQk!+<)IQ`Pzn$"a#O v,N&:>ۏ\* D#KW!Y1YP3XV4xnv$[XƙD70P2B%=]󥹘D$yڇ;#B%8z!ee=_]~\$rحna0, &?sRqg5Z}fC}4Whzb=FW6GBQ #HKޠ]ZgvqbRF=& =A=n\2sD#GwI%kmbޡ[&*&(+gOr ȡm'j-tp2tT?z';tǤ2/A VUSV$R&}W҅!J3f)E]Cr%APu+HޤjSǑmIK-~|~,ZU 2,wy3uOky[fݳkD#!($`Xb)S(I_b^DTAVg.i! Sͱ N%( J0a%6]v5_ih`HH ZR& ѿ90$^y~oa@XoGTρBuyhn^̓b#Wz4ȍղs4#SC2#AHH+GCڵ!Pm!5YbE|ZR.rrñNKGj%(`Z/DL5^=2w9IQK$TKS"cmt!]UG8e#bc{K T" ^JP(FbqR$[a?>"RӲQJJJN͢PtL MCY&5HFﱼUgv|HjGPf=DLE߆ 49X G9hX5Q [#d\ S,rEJJewL"E$8G/2Nn2PP.b0ed}*E8(İ kB (t?#j4'%.^NF̓xrwD5-Q-,.NR_-3=1_Vs,!{!k,*l"`Ӓ * L6c5D#!@p7W {ԲBM9XԶAROZA=;Z FB1B/^/ы(5o"#2O"& r}Ew<@Ҙ*oOPQPe=L6~ BzX˼ulZp (&px\es H}[z`2sS/ ,߾s+^a<5PqZ~F|۰gZ=O>Uc: _hE牨{DWU} Y=#(8VQOG|~>EϢ1]簌>Ɂ&,&Ip0Y (԰<)Q"b&)Ou_Kǿ{tgWDj<|ɉ9ب Ug3:z*"ÓuVN"cS{Q˭;={ یmmb)}  {M K`QFBjTU01oS1q~L>)2}+S@K:|?!3$xԐRRfKV*w[;sD,bmZ;QUHr,^qԿ 2Q.u¿ ?hCREǴE.NÖ[:̅(22uhW Qݹ a-kYFT a/c"M߁}yM0A:"uu{'yNj4t`3d_Ø޿e-Զ+Ь#jB!G.M{:KV:]X jVb٭BƨC‚s* %_wr1$Ջg7/i;} &y}MPeT YvEP>ڸ6n EiFBb5{9r GwF;6`/`"W^ P*pj& އoX:{l:j˟F19[5 9abn/`ϼ&a=D&!T꾲XQݰ0i͉"!Aax֐JkbQT,|T?<{ġܹ獆lO!gsz6_@x%zulRv{Ukgc޼ **\W*=n[0: ׬jQfW-.\zC7Ir1ZVh5];3oaӞўt~ld(#5l&\;)>SyR5Sz]Pol@*Ry~SF oŀ: WW91fDkS\! 1wꠢУk] Ώe36.19DB#ZU^ٸm䥀Xx90!winȌxԅspvzˇvX]MzW}!WѧUݱ  W^on6/>"a到ήM9T49`-7u]ִ#Zr(?uNɠY;8N9]QVVj {6߼vVnh_GNUG5FEQDd*Ziqh[QbRޥs*Ht+4aQϰ]vfgwof4obF&i;ÿp E\x <ғKKn#sĤ r.}Jo25ĩ-KBK2rX Gr_5mzaZ|GL07;w?2wU/l!UkYXH.9EE4/nd.ڷ0+O0jϧg&s`:; CK[ o qbLrCaPIMM4oM-x;M+HDkB2OG7,5f.ϾQ3;Z밯c륱h)nCFŹo_m귞gd&3wn֡[oѽPæꠦ3Y~gH#"pFL"{@m8t7Nf699Y${R|Vz‹ۗ5?f):hdݫZB1qẈƥL]-\*А7# -:ܩ߰χ\Jp뺪P?/ [ݟ.a{8izF]c#]yo'_S#Kl䗋_AJH;}bƪcA]G(B5i] ICF8٣^5(¢ [ `KQ!DJ~x9PJ;-7'E3ȑ ɳ#4i]=n8}o5uWm>w(vazh4k`}c}EP.rP"O jԑha|J, U9oc`;+0#7o-FKm^nUëZB"20ai^/j]=s^r76Gm5aJ*XGZ\rkKx SLGi⒍0bpߡR[QwiG[P# ֢Z?ʻ8!3>!N/}OI"1Ӫ30M[PHlN7Yi ,i6t\mߠy?:=q#W!iN}41hx9%TK[Ò? 0 N糑7xn& LGkPC@P,k&R !QtQh: WO tfFq2deJU-81EJ,$@= L~~ ?ߙ&o^PRbKLu>D4r }QF (PQ]m:M:mG.}]lJբ%OZb2,6[b+߱tO@>ft͆+H_vw 5R1$\! JDDs5었{b_=O.{BҶոq6.H ,=(|ˇw^I 4)}2bC)%^iU[1Բ>FeЩ}鸝&Ru `s |6_xCߡbs>eyM"+;ZMD? rW1st +5lxBHFx%U' gQaXg@Z EL.9w6^W:%b1]$2K(EB!K-+ߒ\JiFw &w%0~-@~˷CDF +(}y I2R@^;J*}9% 0n8Ze2e)KnIɁ|F{+b8n'G+a`$kPa'Q!BބT"SDx͉Q' 25l`JXl +}BESg $As C>gf}x0!Y*\)d%aU0ȁiD")2UMecrI,;*SDQ@2BA){sCbÃXVr!T} B_O}WG 5!Tf%'$fQd_Aė$r l&_ 0qEF_dƞ/ʓB3OFP:'?*A C%zMVF@m2D ~͡ ĉe'FE#lnBS$AE?@DN's-|?`ìt">!HLYd,X(3TRg'w\AZHѺѦUȤ*K\A&(!`,:HC")ihN- [#ɂ" ?e0R tn"3=% mC ,-I$Rff&#_b ܁ɲ$#,l$}Ȍ=6}@ w^BUz$`ev V(Qlїx2O6(ҠdFAF;B9J pοm+|opD[BY}ȵ[221%Qk Ab) ρDܚX!{(DŽ)*]{>z>S t7, "iyvR\¨ e .[>rk"\5߬M/n]F͊4k!1E}2J( )(1&DJBQR9B@dd[f"JQcNDE:oF?  CG.>hxŒT%y)N@Թ5wPԄ8vdg=δ ˍQ8}elDBu ]y[9i|/B^4>z3"& FZnVF+^3kϩ|WnZfrfko_0Ha59(;|sMb)ΐ@P Bv2@@>GQ)"UՀ4%c#MGB=pj6ؽ>Gl:@P}ѲE@B|4ap.Q0ʶaFʮ׍ 1E"~ ,x!?*Fh}O[-bSЈ{<ɡy*3IϊO ~7~xRbsĒQQ](lgC2?Ő1^>V ~^kC̷ɉ*2_x}^=-\M,~ފ`V(#)ʰj{Wmܫe\83_8_(>} ' սkZIQ!^* :C:uŖ4ttZBu]=ؽkμ|¡a~YJL׋?PzC!9!ujyA$q, {Mf{mr?lUdf%;5y`ӰqEn0-2дvnv&K0sCzu߾ۗWow6 ZpkNIGw/5[v UC7AƴC8jė̘69c5cן sq63hhb 6.d4n`%!&Ry۹hEg_U _lg(wBIg7/jZ98 27ԶU .Z6n@@7Z:z{ LBE]C \f6.=m6Mwckg?jX:8fx-o6OONRPAæm;gh*ztp?riץܷΛd9CPH t0$?g,_޾jfeL5n؂:AmVͳ6?:cI![;йQϾ}g#kǾ=p QZٽFИAA'Jg0KSum]FHs2Yb(H F$>21|x XDCſw[VZ{Bb?a虘53s)O,o jms@SlRcxW12Dk׶^܂_#c gC=@v:Aea*DJK 7Ikt_wB3a뎰uot:&3BgXO04禧'ts`2mAwA-)M,m\{Jҕ]FrJ4nꊭN.9g"-n8sc'/'yfW_x_ml{;7xVƥW%VEĥ+okP#҈tq]35sM "~p3@s1G$N]%}iyrSOx+EI蛘G(Q1쌴 @>c,u"I4V<.0nbF[܊ B9T ze50k !KdhڏcaZuJs <#+4BԊ,PyC?7>FA(С/H On|,US=8u1Jȓ G99rE7 ~|N{&dM#?y@|vjю$S[WyUCDvָMǮ<y&RܻaM͛j@(= p1=[o]fz* %wV>/!g(֞0p?qvHWMg%FDrsӬ/a*ރ{:lںں;@Kzª?/;|A=wLgRgg u5%% I[ O%Z_J^"0ωQMy TgropL r (BF},%h>lWlL߆lG\:f%w\qf?fֹlz=)f=`n:U][Gl<qUsvtJ% P5rR7ohq/&,d7ƚ;cnB,1[MzXy'jZڢf۠M.v{~iscOzC/^#t/}2F>mSs/;)ϣ;#}ڪQp@ -_EUC42ra@ev6O>nl-2 c z:#w7X3F:Jpљ;kþ B_3?vjeS_}OC?[FAMPC}[L?xjAl.VnYzZmx9مFC|7 s m@;cj-CBGnjjc[2arpayϙإq#{)8۪QБ\Zݥ|r;%vwn;Di oRܬL6 4ŵTY}8|ִըmkGw[ /V|+5n9E^%%/!77/Tܷ16/V^Oy#>)/VxWg-;S.l$Č)Zq\&[ց 0Ȕy@)ʻ&*LJϟ9qY\҅TP:6\F\J.C~?Dwtlz#STU%QQ(LJ+/<^F s1m_uCu i7E+hxlYyHîf/v-$pL &Q:R99\}w(L9K._W^gG(Rj@/+QPVl^i2O*C 7-37Kl3&1`\*;Ѩ@ci4CWټ3fPi{ wAQK+/f*J +/*rM0]1PJרkt_C 1_`-;WL%7*J =zFvC G[w9JbU MS^=ŕt#JQڊYI!l*# ؗ :11*ρx2R}N"-HZW`E - C~Yb.ZɉL^Чֹ|/1*ɢkQQj0Iy BM-&DH4m\aW"uWY ѯC hً;d9gB~Ank31$'q4LJ=b(j%'%t&  X >ByxĴ͕y ٲ!*jy:)|wHÄp+H[EUAܺe~$? 8MMe_R`%,6[A"5{Z"yBq: arA`cO!,FNo!;t#.ϱ맏XlVK;SaVs'S:`35v O99VX( .e0%b#N+ :`Ts 7S&]47KoAg,^NF3&,X-f^oT{GQ {JRТ-Ҳ嵒 G|RkAL{a;857K;5?rCk\fQU}t.[[fo.ʢ<*CT%)&J_VHAW6gȁ? τ+.w6Tv] (tGke1޾F}M("@<h jnWqY|q$#E,sU 3dKaM'ouWOtl!Tۏ`2ʣW`piݛ{zOKLPHGMT'@0?CW QLdB^¹nõs-u¿\ֱ rpԤD(  >%$u;}%cQma?Aͫ(b q/obdfY4iߴJ8/35hIP-<{2w/ڪkdЩ RZ;uD"|Ugo:ܲsOi\c8]& G0|֒rr* 5 -Afj [AIQ 8k=)R8E4sUr|v[MMyiD6A'6Pq(l>4@[.<*4D0ra1\ɲCc (UV\-`b]acco?ZZq28tɷ]`@voXSWO}TOa$"1[Saie-޽ZĤ9$wt@8s@ }XV$VRاozT5?I6<Fjm&Å2ha^JŅ՘2|K%ҎfJ4u횬&6WO}0gϝ7׎1Vs9E_r6w#S׻3sE矽XݳNQ}c#ce]1f=q#h1Oٽd_3FOZ)r!,HFG$q= 0^ۏ\[Y/ L-rSWV\/*$PHYg }T #}ߝd9T&2%Noxd`y&y΋kHjd 4>`]Af'u:&&:aIm #B2#>+R2n(=ҾK %D+9|BHV]ze EB/ht֍P")ᕲK׫,pq=x&4HAWV\O][&6Ѿ) 6 3)Gtʹ+Gv''IJxWbORx!mM'e2|WJ2,qިe^`"8=KFYf#5XS]}:)~ωAVnO}wDҎoTt~{hĨ}?I>kѧ zAR׻*a ئ%P^Lmr84^\?d59q))Lstd=<35I&m۶msm۶m۶ӱ_?k}}TkV~1k%CH7&Z,Oڞph-<-.^.Oڳ|zKhH<OXY @0呵/UNi)h*^O鼲f}R493eb\TR2f  MeNrs:b73K>bgO 1gKMEj<,[g.aCUPeE2[DePBh^jj93,5P]4U^g0\ jzY šIaXe/6qU Y>vPɫ|>&Hqv H|w°HqBxKwC o E0y$vh?eOE+nX_CЋx|9sf`+؉Gʵ\5ޭ[ Zpn,kc:u+y̆=VIHЂ\`"% *C2pA|ǩ%YYӦMзt !2"!tO|cj,XhG@6),lqa6XG+Lڵ㞿ĥ/x4ck$xFf +\}@[PcSëF`, e);WAjjY*:c!@+R~i 7Uoo\8Ҫ>vT,߯S2>_?X&iK Zp#[ aF!]k09G+[3,;fM-KmxH[51:-pD^;m]6 A'geP*8AЁntV.Ea~. egvo ;az-OvzCgq ش"K5eyi8њ2[\wZYea }ݘNj*Y АU\QZIހynTQ^Tr$ߘ<&Emb7L(#=CHJZ6K&UYD@\3"*?v|5g9^h~8e*@%uwsCYr~2V ȥJ!E}ĴrMCDpIDUJhv}˘%cwr+&'gWQW*H秨WN !oo{Qq]z|nY\D4-5Qv-VȢTKT6Lt8c8wU+^erG )镂T|#w|;i%i:7%~y}4ښn'N2F ֹC VsҌmᩘE(U(8 2bƦo488<}]Zt WLtJjo~I7P3~?O꣠X3Q&;\H83m!vRe9 ԩ6N,$Qgu\hOk슒z*:J8y,""y#!P* ՜t!Q⥈ٛNhZRe~(Sn•14z[mjWP`RltR̦&LErαQS\Y ːӾMtsN%64CR1)ՍOƤ_6 ?꓿rNw/mG۸Ȣe#*-^. sh>3 G{^lyr'ϞvZvPrE2+ Zh`1!,N/6 7Mdxj ^썖5}Y<2|uO]D:UlhVC8 H!n͍*iz/ӊӄ{Ŝ-B&IQ!D*1:9VM[NP[d+րJiמ(9- '@"D/fg3] $2yݥٚ\4|ۖGӥ bO57 F:Q&]Aya6e[rjx-`7iڎ3\oVe SU wCCy1X7U"醖ЃH!{2Bpsfyƒ|tg$.pq"BS(6lܥePΎ ®E&75MfU+aP %C8$}L5<,Iʂsrf@S_ŠQ[ɋ/+k_/̩i>Ü̶ ވsw'ќ E?o w2\rm>pxnHo!ZnjՌHw6 rvPԓA ~o-HNb+_UPenӢUN )7҉Wm_an hKYLb >`gH\LY8籸l0f~qAih*'i}>ԩ`wjuXY=)/ $h'lu_c%Uux!E(ԍS9g^'Uɷx,ISqq g *^7Y< N~ :hӮSg2_q{߂5sp"VGv*cEsS.PXnY(8IH*HGثX,GD"4d(uxHZ=IFPTec *MqIj8 +=lAR KL6[9c\^U%%+]%c6ev7ue${#eoh 5]GM޳g-`U=0RbZ @u NcZ.IZZ'SVoKzW?*{f27Jp@9volFזT,ܛ1fA+Pw݆dG\h2 o+O=4CxnjϦ EƟieֿHD mZ iFWBD0qY084UJ"&~2{@f(H+xWsg|=co= 'K\{D=moe4Mp9ʮ0Md7|{ÇDR?z*miոX"<-f|29O\CUFraF@3Q;w'u|t 3&mhz:xxxoy+?={y/vE82!L*!= 6iC^ucSFq?c]MgS0^̈́AkG{vG p>jbm:, Fs'] +S irm-kyK.A/.rƵLezlj6|ǰb{ uω|2n،ڃ QQ`x}JF;$]DG˝%1'rHV:nO8Wvʄfr╭(9цvKA^3!doMʔ$Twkz|JcOtmpϟ*ܱ 㘢|*ϚXxck!G(be8iqXWA6iCŔ?(qkܒN]u+ )W1ZQ_ xAÝY;9[p"&aTfi}N)J"F5P߂3KӰ>9[ c+cSX?Dhڬ"i#n3j8;MIȸt]$(KG n hpGkԿy=Y>fPeq2zpԧŏ}ن㕨V8Yl4I+r!>ʼnWmsLc? HAMCB}:xRu@q>b%KVDBWWaC^M,LMCw=Ӭ{-~*à^K yE?(-[ 8 ybk[\CEHjTA ! Lsɽ"xm]טxQ$VfJ'9Nj=G|Dn^D/!NOמO[c[dDY,t0f_1ep #E"M%=/~xkJ߈6_k͵cEDSuٿ샯v_<_= ^.78( i2C6dawD /5kˑm7JbyawJ`9ׂl Tm/{0( DY۬8mex/?%6%cGe?KZ2`Qn4<:8: l”{``IsQD=n@#Ob2m4΀8\a^q|p?I7vmhʟb@͆(j!Y{w_}X hĔky| Eef4jT> A_6| rֺӋD.}$g6|k#rU~ ʫ5a) Mc!2y#wSZK}Q%$;Q'՞v/c8~-,_KӃ Lĝ*XEbN=u%O&z5! ltp]TLW:]`' ߪy Fa{s.K|h2‘ri.jCdEuxnx'̋6kKt"t~Ml%P>x  :32s~c FG!_hX82T2wOZ!z:sXo`xom|~DVǫRjhtg2.&}{} fݨjp9IPSAZ).p]FJ+'7nEALI 1NPC۩.d锌3BA/FNdǟޙ9KIO`ưB4+0-9}4\LUG$IRkD|uJ$X4nGz'@ɭa K KAcW909=||xu3Hl}!Y![z3uf"_e]ke۴OiQ w8_Rynr9v׭zHB0]hTaGÛ%P ,XPp`1{'օ7X)2A3 VUףEہQcaj:1m'HIhw'{r`U9.@^ "_bg::x0wZr%KiU7DC:RԖ?ww“NEr=-t ?f5nc2cҦiĆ1-1ЊWӬlB &vPq{q +H֬ʳ"-xi 25n1԰d8{F7s]{%#CRM'./J a7{;r IC!5g)fMh;tO K[meʤb* JY{7񌩩I}xZa^#aC cW,{ s $}h\zHoX#,&,$=kv5QڱrM<ń8ݿ|qg} X؀ uOe Fwxg 7BoAd\ z[`o;_Ǡ Ff,,m6NS-K{Vt&MgSʵXȏFu[7^+%gǠުCwuPbl^Rnַ{ %G Wɯl<׫uԷ31ˬ ȕstL-a/$\<ۯ/lTWWA;NfOsN]umU+ aH2.΁DbyBCP8?=A WL -ھO" E3clז={WB=K% G%]$7R"~7V, a~Y8)tlPC]7k\I遒H`(#m4}K)NWfNbD?=Hbc4ZDSI[Fƛ*Eү\P}Y"[>\r*$F" ,7S.06RYK&rц/'|6a}Ɍ7+K/,:WO9O"3l+kD|ʤ4#sld!\d#MwE# Cc " >@ !}xXqW̧&B_uRr~OETռh,t$M\c1f:.?vNKcˍx1#d/bvj-yªqHl"IB >/ԩ7̴++MLΨ% piE@}&- t7#͇/G+ "tg.} U]c*ƉSO%D_J6Ły^AKuG@X99_M?7Ţ`N)'WIHl4U5xkK]S Ƹ/:BZV;^P8UM^TLGĦ;;( C-.FO,aI1'7=:#V"(o12 KqNjBgjt ?Y/x‰S#NH2;OHk=fn/Nbd?WdGˈ|?2hD}1i+5_a='1Dv︖g}knt_<Hj=cޯ%<'BCpMR)$pidloT AК2U3*@?sp<9Q˶[pۥ NWYՓW1RLHxKR\<ݬǓ'TsB||'8d:hq WRQpI]їHYwk.NJ

    Jn0CM 1QNgJ-[ =(OcN _?}EgWB#czsϷ;u KJ;)t별=ߓS>QIO",7C?NmmO} `r_-jw3?0;]/coqwb4?\Km\ɾ>8C_c/$5/pIW~i]!:NFGۅ{8at{6_rlTϜO?7>83ٜsXƼv~ BĄ.VK-QrרqECn=LJf}F^t'ȊWuAjeÊU:VnVwF6jc-\*wr F |y$<˔D,`%(RHK*Yޫ[>|gӠ i?7F y둢n7L^t%dq {@gMpǽ(m/)בƒ3Ȭ1|!Et&;3bgws|]Nڲ{ɍgCSz=sQ6-Zzo߬%[o0 թT:9;l:k֒7+ ͈}pZr@4o . wJkLɞ3H= [[`E cm}1ϝ;'rzHzjޮrVVcbR&%jsky3g{pݷ+{=gzaC]t[0Ɏ6q*W(>fwL9?m֡,z>GAr(.'OWny%Ϣ%:JM{Ia飴B>xX5(rm~eru1V^쿅jR#yQSǯ@6t;aI+˺`.%gZq/ :3}1gX]^?;1-y0(` <|zi.] ̓߮}ssr_q4u\BF,+>OU+R⇳x C& o4~yǖo}S1ۍԞSk5r9nJWc&|90~C03s֝`hh^3PاF4]z1xV@f]~5ųW3H/pČu~'a CN#\Q ,Po`I19w h9{<:o3X;vvWݱ MOh6Z5@]h^7/g-q/v/S]{wګ*e w %O_*;ttfK~:rZNGDB}UBQszRlf't]XoAff%tSCGh鹈iGdz>$=$k`uRX!b+D;%?V˾!gL-+>}cC}Ng1'MƩ9W6Bss|!3fG>zan%*~ז׾>%</#6^-Mgbx0,h!l[֦;khk#yAyg\xA͗b>~^*_uM q\ܠToom>ÙT X`JMn*ơX\|Rh7sP/˿/Gש.iOڒ6X}_}bz&|NmQ8Qs4Ϳy&i7[=×oϊ1ڷgއ>ӑ=ju29K*&#H"CX߂= _}Ϛ ˚mڄf {pPVZ#'G@]58͚)oIF]/0H G2m-xmmH-OL6k IM1=-a L$KPȻjPnf>v>eS܎M]b;SN_,K)nH49MHƶɵͲ0 `bBDOJ;\PNf< !Ƙ0ԝ* goPO^{z=v Uu;M{ϿR'?/.kl|ujl_1EO D;=v1f«Wb_ 09U׵)+k==q 򣰄aokqӦX{kMyJyN|K<&Mz!lgӔY"LifV_F8鋜mrh;S-QXˎjR\uОi3/3*Z MVGa iL$h@ faMW-ܙbQF3nxITFVqZ w~ - 9{wSr'vn]}&eW6QW";?4oömV]:v3L5 b<-<&1Qi,ٞRZ9&z,sV4eczwnEb؁Z鿪5O 8ѪqPLbNr(^d1̟a|}#S[kFI++DJp@V:xm]<'o4g?Pԟ~JiodνsW*iRO]]%]{z?pe0S4מI 񡤖CIYm`م5\.x(Ї"1B*ʯ^{9Z0=[[892q]G.TOY_n>YThɘ?v{]mۛ7Ye}6I/MtPJ"" "AD@@De" "":UQ7h.='IӦ]=oS_sË8t9-I㌂iFjHy~'fc7) UXB,k}!ɱ1].2%3:N;c Ï'gu]d~uԕC}+3KlYm-WNa76f/ƗâG:فvfܤ8Ȩ<"}#Jr Ut<0]<jA>?]xۮ^mѹ"-[֩L)N$:&#nf v|.x0q"ME5Vk"m2_@OtȣwZsHtiܺ]JSfv%֫7sOD70, yBn z+3 rL+7GXL)Gɩ*zvmvdenMe!҇Su[z%/uzx}4h2`Fw*//f5(8IAY&< -n Ze]n!V}#W翓Wt-UlJ$&/4 /!UzW1D( )I&INvTZvUI9E~s[ Kh8 Qq"Z%oSɾkl$ pqbYb|jYg6/n_c;om?,4u=5ssb'nqςT3>ۖWzsމ{G}e_D?@v`hnȉĉNR@$Y^Z2GINuxdY9o~ ]*J6COjUCG;//LGzHT30^EjQMI׊` j0=k@.?ATB 7:v8‹ģߜn"5'R10pJ'FW~DO}鉏bV6lrk1)9vC2q+ xRMЦdu"6B '5#sir%f7mnW}+[ J)wg/eE=yD^h/S!i>]\}G6ȝ m|懇I6}聝ź tAA<Aŝ$W@Ia #A6}`r+f_#GI˝fG uguU{M<_`hOdz_T(z]剥A8M~&H}k7;dm@m.l޼/[s)mk<<ƿ.?ْ'N,ӏ. z&s)V3!o"&Y\N>X" t=b;, 1Nݩt~p0HZ /ZaͪAδP'in׌# oL^[__FE(3?{̕ye/=})B/?c#}z᝗OϹ RdgI8[C#ϋiBFî?Ş%@$*XW qj z秕m7sUs=.%%:Xq]Gd] lŷM+;h ,% xۛOzqC TJ-ºj:d֎@$d 7B Fz86Cyþ;%ܔm9_݅2~d?ErV'k6\h9n_V؆$``87fBiɇd#`ݯ7t版9Sg" au>9؛ (Pb3rr̯Ÿ n:PО7gmϊ9GO2i9jUIϤngvٰ3Ӄ^O3Oߞi'v$<؁4~[yiEbX}Xk5-=كWDY62{ WIrU J Kɥ@`/@@\7P,Ej ?[{rPi (Bprkvn^=-@[b$KJ[v x`^Cث q=4 }(V۹"\TM?Q:j[yTUGi]Z,|yz\к}N!+=ZcD=Ώ9O͝]Sq%aTN$@=p*l ) 6[bRb0tH87ЦEjV; =$ƲX~KӅ[_~C ȳP$=+|La'L0Zbwksq72Y&..ЩEe5i ?ӎaPx `:żLf^Lt{p`h նЧkN^gz{nx{q=3GݳuNmԥ;ގMjί+yFq*5vǽGG`WpD&59n~`5s0 1V+|, 'c=Ty9vA6C>X.ڃ,?|ͿѮ',\N"?,Zdcu-h&2*8OBs٣ug6p*9$hvcc:iNE3f `Ѭ@ba H0۵K˖\2HßdǢEbm-zU>Cn'|u_N_s5NWTgϕ4r>JR=䃃 `!/, P`;֘kKR!LNyf/B?",@Dn&rcR^(fhtGد |5 ]nߑT~VsӰ~Mi%x eg u C-]t+.M~@@cftuA&Rk'䕩_"{'?dѾџ/ϭYn( 25.:B$X&k&W$ )E2 F\Nj(vOwdA䅵s =LwETEo8Ce˗V <\6?V{"<`68['b&~>jS5Ui8{vD/j~&Lgr+Cl̃|=fAsFp"}J$ȩR c7ɋZRɱ\ٚCIԟ.$U>W~3fQ5T['ǩc5xuv!,6Ǥ'ԾDFG|~[,ᵏϹ:c*+Y25cw9fucXYA}8Lڄ$P, pt=v^TjnSZL%p^yyцmW巢7W,䠙iQZ*} &ca*T\yHmX= -x$F[zf!'ܞ 4c !::tGۺtJdл//>']ٵe׫}xցu+}lG&9n6rY^ն9[R!Φcv߼_岘 q]:$H=(8F#р ͒@<;߈Ε?:VQ+n1طWէP'e獓0P%އs9݇Zv&}h YufK21REkpFBEfGBKI HFdKg œvn^eY?ԟx:)JvC=G{$NHwꑇkj2LS JރNGΏ8<~=asNײ]5ˊXff}%Cԡ݀MKCݪ߼RsSfu˔~G`__]wĻE\n ih~vZPqm~#N=iVpL (dFڄxgcf;/Ԭ}kґr葹g^/,+ϔn.AkV!`z}g_VIYs̟U7C ~xR0z~\aյ]3 }j5[F#vCF#p7oNŲzˈj9 _@7PT\H4N>5M;^Ϙ}N/߿l1j@}6C^vXEORl||mR#٠` [tܘAp _vԽsZ] S8U+/ ZR6jqb UW,͉sAwin#.7H10c]M<#7K q w:dֻ)v1~X$q;1p`oJ Wt ]eSb+]Ck4.b!N}T>?f"8{h6K=k]9Gy_+ts #znx!A*m:eU828_U;&rxxj,*@"*[y{R峑.ۅr3by+5Ͳ__}ݷ_7~ )'T[3X Pyn@I]hq Գ*cʍ`96j, IA)I@B^X|>P($<ɶA'Adޙ/vl~ӎczF?`ҩ'l&gC>v&s  %R[0$_QL3!TJ SH^x0cg~G Z @$ݨ:{:3 `Rlc&?d~E_Xj~N/}TS]KJV̔W du9?z5Bϒ1~G]&0ykuKpý")aa'Ev!o@"BY10RL|Gr)Tq"yS/8+JIMn|h^}[ݗ~7y# ^ !|#Y~5!y >壈.RO\ 25صa T-)o.I AhܭvfVV.z\̖rWI!ަ>џܠj)ab޺/jvUfV`=,wúS& NڎfnYrPvDSq6AOvG4IDUƈKToH DclAjR؞$c'$)-F:L=!0]P"r˂@ #Q$+WXMMʛn|h\ǚ~|wڊڭ-x׿(sB(D? =iG48h-RXk{2)ZByBHhN%|i&RY[M#E-N_a8Η$7vAÆhy74͎K dnb=9Fb\m7U㪫*#.&WB} |~_Xs*Kk{>Z=T*533(xZ&eYtjRDӑ> gjQSRBL1VD7UQbزX4 QtQ f 2.u|6L+Vh"/T c*;"mvxV!MBjAVg\N TPiaLʬIteeIm^ {ylwZ8C?7zE'⾏#厏_# E~[>GLrs]]tQClYob |?S,&׃b^\)6[X|#Ud/Cf]ciR_jk66G2WDKm8֬&ɶn 0zhkn}bӡU̶AFywe˓p2=B/|DPSsgB4g3+LO?=OQZNH䓎|]M\I؏H25W-w"\9O'HrH=DP!" yL%hBV+!}k a3Y[ 9I |0|-\%G^E ojۡ|iDᦝjK5>+*%sbU&^8,y05 HMQ4+ۀ9i\$ biGRؠ4$ hV][K 7iq\tjrQxR_?u~?YAZf{WqWW. bhKdiβ>݈2smẁE9N;F֛xv[5 |R;gH̞N#l}6q?Cz7-vjwU+a"UCeCQkOcKO(%*r;#\`+`iJ>ltU$}lBR N ?=qy÷޴7'ֿ1EbBlrs ٤$J8Պ]1[EݛQ75ˉ-\f,≮zqf"+]r.f6 ][9(J >Eڱu s0/PD36Q@"4ވJ"8-\ "9-FgU ǫ^ڳ8T XgF[ Wr/[Z$]{#,W3WNKz=&9!A/N"2%CȜAOfѓgzF].@n m(zr]BFW;KX S:pHZ'@$xVXPy+FC DRZxm$PU>Yw^-{MWhԑt՝'#F:R&wM_UhDh-E53TxQ-Ҏ'KKpQ"RjZ"Ar#ҥlʥzN=oG;֐TqMKx)6MB)PPMT]IV ^f7>q 0nM{F.d}J4Rgٳz{0u1v|{(z9[OV7[i8 eV5yC6uȿ6 "L밋9@ fTe/*)dk* '6L29g}AעzJt+d<6Po9M#C>rA˾ؼemJ2ZVeüA䥲D5}Xؚ0ؼHё&;" Oqޱ vy\༵Q*( 7olxbS_&r)ҋFzo|[͊=;67Wq/\/QcU[&poܚo?ֹbgIt6pd.N"B'lٴIwgt\_.G;fARg=cpL\ c'A`,*0G0Wk GG?50QKqtpH#<&ux1/ uJHFKP D֜f=xmILuB"eW9;D7[T; bFqjNL6W@dPLfyʍ $.%g-e(:HR%e=&H:+("0 yX5yYj~ڣ,!FKGFKlM.ul lu 3+Sxz `6$WC6d }_ZC}!5d'-Bc?a+ Z*t>$_7@hN#({^cpy}`(la-`;:j){ֲHGq.ߵv[ql`KKs{}kZMmwu^cx~:EMw6ڑzGA\A+^ /gKRO^wR<D8͹RaـŃmaA_%ƯM S'VD_~O.0ta ד|RHUN)'wLHӵ4N''=lH:C7?1/?R$^2[ܙ Z^ogڛn3Imޔ<~xpk=k\fީBrwrq`⑽=`BR>}$[3(?d=l<:Pf~ kR+,@SB>>e'.v>[|F>I'05g%K?{)cGe^LlھOlpWhOyOanC, Lv`p-"3Aw,wիr-p a@?"eqSAAF/ q6T 3T?ӗO%nXF C ,äscm֕H#N*Ӻ/AsZP+I]@uti'Ft?W0܉i=3 AzاS3`V@L5!K؊=1B\ȼ7'*@8]"5Yy}E6KEhe tǤ;Мr41o('Ur3ԑ| xf?Xƚ_:ik95G+/ʔaV,7rȅ]mR[MmZM!z~أ9sz?gs='NX{C &,,u}Md0t>WW.ߝO<$MyN[Xhx/3(=)U'=H=jp& @y냻Qn Ya{*nX>n"smsí{Ukhy#x*z#Vn[\n9&)Xn>ٮ=-[k4+)l%VԊG W58i&Is$ǑRFzHM@zUH 8i C %mgo_%Xuv._VH"6bZKN"`USs&"^.jM/Eym CG6T91ǨO0*!%rΤ5D(b28`$E~YMsnP!Fn[TS,c*| d؆K*҃b.D/2֟=O9zhq=K/>zfn%;<ѩxݘ_DneGƵ,/smijgQ")L_խcx)V @ R9goWZ6L-bʅ\ z959B0]|X_5}\Ѿkһ^RIV-5u*胴)2XɴJo$y[WO5ҳJ瑂Z-[ez^7_QKd)}Sc.lZ  {]EnP{fCi-H/{c#ݯwRqo p_/I0Ѿ߈kP{2op в?P׮:wdvxOD"^:WHův+;wںu[0=Tع^ُؕ-3F8e;֮,_afK ;-pGdd8v=4zvxc\]~fK+SFD 2fbeY!8wNk^,=Žng4:f Bru6{@ms;6'+/kd2%Y*0]*YOƸr:Ebf)y Z龾EeN-5_ϊݫURK4-EZ\p1=]]j :Ca?6NU 3+nvS"( tTwa~ XAztї ؍`͸U{>bzTI7SB?k$ ǚ8(;P+K2\PLueZFjӦOӌJKǒmR:;#{&b8%[t_>,zq,ժY*9(f -HυEzSnթšZU=Y{ܛɒ륩n4KAC1ς"U/?e% Je#I5$S a[{^7!-Uw5}O3b Ԋ'A|F@~M?yG*'bUoScm1l,ؓZSo#ۯlA`f囶)}|Bk٠JؑgY<|wl)lY0IW35ZfKJr#}yT]>~:&u'l{ynIϽG2ѳ; gl'cgn'=tv;Wj5 *mcČ)k3 *%RN҂3TRkh^jَ%Jm6"eE۔۷( `ϫNkN*֬gAN{ٝG]$Bf9WӜukozդqsn۱ԱYq9>)֖If杄ro v3@Q2h0$8ֻ[`9ۣHgK}i^ٮE}3$!*Pa 8%>ͮrN(z-9Voڀ^"__JJΔK=oqt/-M ۥ%m[MNMWdZo )PuC IA]AP2Fw?C,aHf ٟs w`ح[{l /LUƒFHԧBGViPpԭ@[ ԗ3*oß 0C"܋6$P??wG 4{5Ϟ/B' `Kc-% npi9{{;7 ^a{IDsp7#濩F[&>X{AN=46oGX&M^FM׉_ȯgR~ jȡƍ,).,ǍT.[n8ndVE~G>FOѪU6\~4$;%P۔NRP#܉&-T-s]!w b,$S]@ H#O4"[\HFӉ\abփ]GǖiҮTjXaP$`l8ʁsf猑~cހ1Lm;NG;ڗ=r=zTpzyswOFwO>zkMI#/MZ5{쓇Y {{N޴wNoO0CjђSʑVᛞzBWfÙfxR@If3(܅nc\t]LNE(3 1uzh؉@Nk09Ԓ[U%0U:Š֫޽IM362ͦ;kv6[>~KTrn=GzvJ۽Xcך$˸X //оfkF4w*6uvГmZ|RbNUy *t6PjA"F+zH"4$k|%t @T͖! |$i}t#?)fuMZDU6Oh5:kWb,/NfJ.-$U0k ~"!uRrVDe+%*&5d'tj2oqAUЇ }ah6)66 LaCr&Zݢ69x5PZHOgO~vF=,=޼য়Do|z[zHU^t#3'7֛Xn͌X;+!BrVl ?J"s=K=+v]kuLiBBjaG@ѐN\33v%4{w4;O♡Ң壆C}#W0g[$=( Yx)"X4HJ2u\[Zg1qI5b9L0qjӥ;7t8;4ZLIeZw}ޏ5c>Lw26NZpg~݈A}iզA/4xMT۾z۴yPNm8$)(j v/'깴qkƏ"y{dNRB;W,M|olJ{{C_нJM졢H%]/81~?dcĺڈѤ-`ж U]v:F^N~jEgK9;!sTzLpΰ8q)=\!{WP$@E!62=Jxv s=Aah9A bصhR'G0t6 k|1?Uo۵۵4J?8X3m&17Փv>nu} g8[ [M%%ӱdj0S`:ZcP|V:{y`Zu\qfgX>]J.h>&#f^Gc@u4&k̏<;47MCۥ;-8ur\aef;c$hǗۂXW>JUyP^PŬh22y+<!UqiDoqG_CC52Eeq4@@CQeo>bq ي^H;i'ٰ&sI$OR :- &t#r[lhn"!6PfP|c 1-ȆǗMwS͙3Z\?lQT$"e;ht^wBjB`Ċi35c( <0U$ꌵ-L 12>^mR-ȴiOrmZUME<DIt9KY}7 `j*{HRd%M:\ k4ڱP_`K}d:6* Ainoc.+0lSY'!8u=nڏiXPU8zj$:1'6.SF%lZDE1BQA qWV` _v7mZU-LlSkJ`sj:F4[cHufUϣ2:D4ٮBJCbzjD$$PnCb$ \ZCԴ".vw) Hur#i<` `_&pg M욚}v*Zu,2$w\/fG; l)1Ʈ1Co>x!;. c48vƞP 6]X|ո0(I:fUgE5n ZRBϤʱnK)wq{u581@Ɖb4f $gK$ 1FךJ(0%38Bշ7o,ls۟Ȋi ՕW.h0:[*VJIq1aF5%62@..y4I&?;T[rP5Wj(\vrlS{؃:(9kyI9DZ=~.[RlʴU9 r#"'fwWwa}SՔC^_@Ť%CѕYś 3X2`VILBL+g#,f-Wօy]36[t@PVW/6Ɩ&#6λޢ`,( HXC zW8'9v!jg f-"W.ѧzorMd6>6PFH%ERAR3H >($ $ BPҁbUBr!HIq&EV% 3"LiT,lɳ)LKKV?ȑ $)m5 I5̾AFҘ8<(O>n"l똁(lJUh%Bs:BZ^t,aH[Ap ?_~ [75@fg\Ï|!; Vx$Ĥūs269YylNSIlNj;%-q`^ob-'RӔ-=}eٸ$kinz*owIoP m'./ NA*/. 8 |ka|vfOt9Pӌ46[`C/ιJmwCW"m' ]eBhìa,@G8&;}ijguk)wt>|da^7sBw֫R"G\{ K.Yʣ䘫CG! l`n/r%<-&cat#s])E΅11KU)0N qzp|) V-qs2VCڝ}oVdob  t4JO_H/0ql~ZHv'< J $7ֻyctɕ(^aQjI0R<+h9z8z ߺuOCm4S{WE^fAb̶6qyy /`+64Fϋي#W>yZᅥ=x /V(v R,ɈҡUEypo:c.ya-PofLH`O'ɿU||au&|iԩf+ "@٘ALµ=Znc֜ vS M+{8H2TMJ}x3eaڮw8\r T՞vY|8lsj#yTOz=D^;mkGI'a -vobx*8ꘀxhL'7[!5{}9s~i y6#?LJb=enOly8T6X(K9;a9DmRؗA&vꢱ ‰`PZU5_[sdg?o O}:YySy]M!_Ҕ6RD '>|ܯ2`R/lR9S(J;}=!5|pg/RyY@}ksGx,-!ƛT hɗAֹnKV5iF;p)<8{_}Y>|}7y|x&wЛY+UG͟Eo}uV~;7EYasHG cc][g:79e?睝m܅#4!NfQSeظUom!\1}|] k&WޤZ5+,J|?ްFE2V9tw 75|Eּٽvw. 6g3qOh o1x+SHdzHKaowmH\^Lf|s*wG>7j֞-DM7|W[C)\dӢeqjz 9pYPU@ m4^ Gpy[Lf^17^6Nv)O-~NH5DCpAsЖC?дgCfE7S[o\˜t& vޜXcz5Wj8+C~lNƪ:uhRksHONh>i$Gq(Z(˄bB(R}NP3)=ڌ%EJٺDobH\gaXVKiV:cU<`c{+S;O 2i$/]>t.?{j%q}EH-(;č`2fCu a-nH'ĬOROm{ }Ϝ'Cw)hM/o-4LV uK s|t% ݴVS켧OnDp #Ε<"kֽo/N'dmBHt %$l!׈l"{12Nw"./(#?nQgF yuN^ҩ>nթSUg?,XŠ&=z]ߓte?=w0XQq]lxɠ5dsڪ8#BJ;h :%ݱwMPٽf'.7Yp#9;+E):FüBFg?]P&ԭ7<S]1"@͏`r:2Ji@+A1O.9_}VY8b; Raj(90{_0NMfv̠w8?bhrdޝtJy.At?@9#BU|x.2 gCq WBwgB3&(/",? @\3Ú^y~]ʹ|*k1{Gs}$ |zP ||w4 O*/͓bBsUAPŋ߇ǫЎ7X/R z{+/QT T«#~1|z͕ ?HkAx:9;x|1 ##>*ďjCb[qCۋmګ?(C=j.+GB_ W Wq+ߊ\ Z*|Λ}Km ̏qA`7p$+ $pZ1 * (q%;r">kg 3WOq[$tݝr0"}^ရJkJ(\Bqm6 !cImH #sNHo4fՃGN ʉ~/&"\?3'hhwvWǏK=eSG;HC<_ˁF?:E⌡_c?_T7L ]TGcoߪ$?#ԬxLPِ\p,BA.=|*&R=x}}b/ j՝0 h88#4%JEe;SQѧ qs= [!s=;|Aw"2oF]"pQ\V˜<-F D{D˅BUWp\VL};̑_7iyvrk[|A.cVUPYYr )}7TOeeGzy&H&ʿL>"%r"ILqO|g:Χ</6f@Jt N f f8 d|B'=u5/!дiȓs_W[[ N.Jw49w_ Ǐo\B ~V߼Ou*bn"I#RQ]@tqI*q XivM}%{}@K L#)UPDu2T%ȋж." C )ǁsNhٹΜt?zҝ6~UBњ[.CBX`*:=W3 9rD~-ŕt\p-_h=vsE{bކeK(5f0ӂ3܆1,HYmZ{BBFF1lx3@s9HҴmÆ]-"I8c1JϏ:V}t>=6'֌7/෨Z$n=KpCnm,7JƠ4żukb9>kZ4n479!kȢQj#qJ?N ^> ޞ?S8M1Çm6Mqߔ2&Z~)H&4abQ3FYBF8+={PyJ);9K' 70[v$܂!KP>+' %yIK^;hƎ:MҲ{6m͵L[VzR,Qq斬!{z'{pܩ^`/HTVxANͶsl`R5jeeHRՊ =cM?~Fn,c9WpϽ%+Μ>[<^6!㼃vo>Ug= ,]? Cu R8f) 4I VJgF ļP\7ǠkL[^A\6\B_^>j*+9iR4""T9m/Щ1ݪK0* V!ɡi̴^I=R*i }k?u2Hm 5Y:| 8/N4(UaKDuTE*:d:\-6uZ& <*KNE.pj6iRi3"hC!BFy<baF$L \ 1{7ڴgCTY$$᣶6olx~v{lARg՟Θ:1mLC+;ڨ4`̴@|"|xڎx}.R;:Vf* = (t7>V50PYkHnaPքKxcQ hcdJ9SeK%6*dwmT?dlLK5Qg"mAZ]Wޔc9>/ lѡ x*y#z/l€% 'n>y}ocwv[Ds]>r(E ׵|eaBݏi%j%U!U$vG1PuXZƁjR+؟kKѫ|$=3HF,W4s;q|/g WFV6e? Z@UĴgPj 5uy[R|? NUf|X;Р1;"W$ny]ƜvۆSuIvTX%x(6M-m}}!׉s]И+ȫ,v;xnqawC:-%<H0qpTB).Pzjp1}ghy$>cnL(Mv%E;j[M[ىUvٲנ8V];kڜX*]8$稺߮TC!D~38f S4[>w{Iӝ1fAK&ǷJJF@ݐlhl'-| ~PVhQVEȡ lp2aY'P}e9p&w0J n٢>`XQgo~ Vʽw8XVkG7eO1)[Lƛ\xNQS-5 `;q9$YD?:+&RҘj|ݢd:&٣wUMiư-Iwf}[  n{0Bf7Kk\ؖ_ªQ@TS!nci>rS; I2霧a]+4O4辵FεZgs 7(drraNe\#e0R>/~'K,nӌ4{'CTLń~1KhTQI6ȋeG"m*;QHJM{fޠ/ş>ф5~ |3=dM|;s|Pq,ZW!J^#r8Aꝿ3䨢ѯ0,#$៵L"$~ fO8} TMnWmtC+XTN\㻝|b|^3KɸrG3CfVd 7 >a{x=YRd_n-6"*=,vZW6bH=zIcIeB/yx%+W/¥*>ݨyx1:>).e>1¥Fn־lj\)TKRe9X]k%X#6 `U$e]Lɤbtr$ &uv&pGyuú*>X}۽8~0)PBC4>.>7W."bO'~g飴iF]A⏔MebNI hDs겔`[ ک%+U*\QͰ&,F3NsxH BA_T` y"&xRB)Y/J(sF.eX_רfEcvƢyzy]@JHN`JkƞaL] 6;_\ .Ө ;ǝ.cלԽ)?2wD m-v_`.8! ,pTWw;<$Mwp@6t8~եELlz"3X6P/A`$؁M-p*[KKL;<͇4(mT{ĿVg8u5{<)@iB/g/O{̌?֋+sy׽c}Toe)#ke ;vtg;A!t n|jójПO[&s1VS&rd~͂D ɬ%WerYmGhq$x*-^gG12?ܿBw/oB$:=63lUJ{{+=9NE&).JEW ?TF'5489\x(Kz%RvW2̰4*?w֍~>fh0UzY]/lOG1O G꽞hh}knu2ƾ˰2ϣV@&.@CȱQP;n&,s/xdl % }K?S)ߎʠ7.q7@|^p7\#=Op,V+?SRE]\ 9v2Q {_ȟDL2.I L2O.o~7:8܄j(HjWʿif%M;2o0U"\R^\;<ՏG"or>3w#nzFoFOߋMdWe+Q+3gKx'ڷ҇ו@[26ۿ7^b\pcUwDPСm~] ¥>`IU;X&)7R952I7[zם"bdġ85zAvwO}hx%B:_i{DSz='Idܗ\[_M&Dwq]HN#y骜=doA]#Lj";vlA?>GxW%TMyOC?`~N<;y~g;b$4Cϧ3V|JO 尬vr8S ȱKI(|{=CHq6|淾e=(ݥ+\cZ3Z y}[}:^zTU+I=&*af7998 ZG35>ߓ:-G'N`m ͔6^q-b*^B/NUlF}ڌF6Xgxw9[TԈ.^D z5E&ƞ9&*p]!÷x:QRsY׆~ikQJ1 yKP3n4\+ƒQ_B-}_-yNpD^,$d=aѲ}`ʧ}M6F/ ;U!th!l6;FB[(QIݖ'c0bř'P5+~3#prD`Co&!xL ׆e 6UӺ}* [ Ӑц/wwgD!DעFߝQߝte`+h 'OZ8^6]a=wk\ x5d8>Ƀo'-5YHGXUT%o:Q1lo̢qb!¡Txtujs߾$uVj<V#ATc}ɩTjЭr LՀm;]4o~ 3uH5u>jT{i#3 &D'A.WC9d-Ij.kVٖiu Q 9+>k(H{- qb`)8H;*HBL#KOn˂ 6!R7Y*nհƉq&輝۟$rY)Z0mUy a6۔:5×cr]tl$VKWܢA = ;~z/yqÀtֿvy`4ء՞ 1/? hAIW o ᲻{z&L+.A\jA#{XowojҮO+q{^T.Vc=dkq5,cX+ō僾\L% 1p׺8x i *kRNnfV:5ұA*K ;f0+Qh6ӗWE牎r]Ł_nڒve&\20]q3&-ͺuni PxfbeHg,cѕ9Y$hT+跈 5k5o<̻ըe4t19pJTurNȪV/U9;Ʈ,I ;ꊞBk'#n  XqRϲ6Nzl,5vQuMF/t^o ߍ6"o 鶳XL_k#W&UQ˂ȢH|ԣ0{uV*}nJ}Ay ᣞL$.)Ipl18;aߍ..F (Eǵy%tM' =K>_ވ=ʓ>;%AF.VY05K˅XʢVZz\b\]y~xnD&Z**uHVO sCh& ޘ /kuќ,cq-U'[+9Lӱ*:y迧t-d9QYiİ`Қx\eCpp=g!SGGFͪ cEЉYZ sggJӷxjB-j@Ѐ 𵔍 `?S2|ؼ۞tsI|M_}w#-Ez"܁CIDO-M Sn k &`.<xBUi[l a{Uxʼn eۧ фpY੐SG/)G3-0y\z%إx< 롃=nqAkI U OtV{Aa"ƒL)8D9u30%/k16Jq[Dfܯgs6VGNE#kr oW: 5uj̀!1 *ثZ2;gk(qį$$6j4)ٶ)r";87pFBdl^xءz1[*U(mg\)AӭhUihSeJ)t>E:N8ӨUc\?4NK(h1gl+0SW!zBZ+:eG{s~RlJMK`^o$۬S蕕H:_#MJ HJ-ϋ$?^RJb#MO2܅ cw!`BB9J- ?~%iŸBR!X+n1@Lu#.m@Q$E,mr:5'i9~${P~iRW~kC;s&'َސjz*!@C@gxGt# )mu`8z+Ǝ.iQ4I_:yV*ߎ:e2,U/v8_b_"" O;At}]xh tpG ?&@3cSH zE19Qzrm)%L/':ढ़Utȋ<~yPbJaN fo,.HCSqn8S/A`ITҏ(L1,(T [ *3S8mJ8 |'.^tsi[Ss8ox@v2W2"f9% Sa?S>Hxrl*?0re/tk^?w$(Z>BB[ر؁!9; ;ԇ̠fZ.>-t'ĀPWq "$kc|\EV5ĉ߁RUeTKg?P9|gp-j?izqɊ'wY/<0D>5 gggVJ)p|K1C唓Hf/WX[θsmAuTAl.ϳS&4.؜S_RU}>[(:.tnǵTo$VD p.S- `..qj<N S6mPʱgu*GViyz?%ċm( ҜpuGM{>pp]>HCmHn] դBk*ɺ8Hvkn餅1Vh~{7pƒ8\+)V@-vũsFXRl% EsE(B y#فx€ ˏLm#I:d$GfC|~sP)q yxu7ί80^RW&WFSف7+p`*`\k"ђCwr&-q!`c,VS9AL (HֶP Z =_9 E>c Ljx#MyymT'ނF'Ncć܂ 7Յ[>0!W ϋ(~$20r=O? !2AFOzʡQ^'jw+ Ka]\f"U+;Au\#98 Co#)-tbh S(-VL$$/L~=Kռ_P*a3Ȉz!G g81NTs4&ũ7 VV-C?Hn$mc=f0BcZŅ(wwFԅI PNE _)_!|w#J2m8&&V[%TxRe%<6. % Nu`MTAM^/]X+ǫ~~r *p Dw+jDjvw򬭭w W wO7曫j'nHOYє9YšK`tУef_o Q [%1Hn4?`d k9~E!!ak{|_G5c}gLWjRsR.^Β z,Ɍjvlۤ"&ͥ֍G>rt02 QpFQrUOOmn_?=]VGwkꌣ 43oVMߗŧ}욬i":"i?S0'? 5&luQN'9j-w%~k؄Fe\lu>)}І!+zWsm/rhrljS-̵DZ Cը/5:L5H_ۢ"3ˌ7:I>:/Β Ĩ6}͒ω O:HozcŏL&HMm̬ȳm:::!tH!NN3p/P :PfQՍ9,ИӢa$_;5QiDD=ꃛ%g>B]2M_ Yn~Rz 7!TG:a I ""]j/=7PBAKҋq4y sjQahWe~u۵} 5Yd폷7TFG y䨪`ucWQtK8edqGt588yzCqEg 5uAgmɹaDmWu'x v޸yG@~& |'P|lcl`gd@0aV!WVV:fVבVFa8"g|zT46( A*rs?͈qC1eg#h7ET c#5ŝ0\=_ ]7C[zBB` fkESr#Mbh&HBf1O"}v~Hte7Wp ~|'07,QUG8$ ;vN)N % e@-q1֔Rє)HB_[H m`Iw28qj͍ln4B\9`pT>7d7ld7f|d}7\d#7nB77v}67z<7>"&x7&7V&}:7&K77{yo97[n71qr#0pcbP|dV6tP ۲7pե7>2Wd]o  !e1W2PLi3x3k ) #d>3 RWq:*T 7Qc2#2bN,pVk#4,ҝ:tbULY:!N󄵌\\! Os\[0X>mb}UG[G۟TCCvU8x4,P&Ԝ-f*wO"̪ws=BM-'sy[iC V)WTdќpvKhh }!*=apYz.S#>M6UѴ9mE՛ki6Ύ GuAIw6\h+fˤ34YtnCf. ߯؃?M /;׶w=S*~Wbj'x ]^+5|8=Ihˎ8߲ f9*ݻ+ +wuS|Bxؚ:\E3Y_(&5V?0IYDefp1/eplEE 5Z,~:M F\u'i2py & )ΫwmlYJXvՉl„ٰ1"_ ZV17r}1b]C(FC VAB|!9: vvSVRi'>%T!Ц@JO][ e,G#SCJrNE}.緸F8vCr221?-) @CV9p)WN|׀ 5 3RmYf^ɏ1Igh$(KÄ֢4&קHJ跌PBbguX~E\tbkb;5 *$)]x'tiL_Y!w_E/y⇪iDQƷLDǴV`WAOk{_){o~})pzFOW(Da._6ѻ)%dޏhOl)PL%wzK؆QLc5>{V0JO%W.o9Wm*uV% [9Djlzi,ᯒDDQĬ`QaYC@G&11h͔a9ޥ`(=_oOcF7J!?7?zMjTyj| U9/< #:5/)\?Ђku#[ u{_MXˬ1#Ȝ_=;W'D}Ir.'`0K]Wð: \57-QoZp&O&M[rm kprlfԶUOr|;15^hhG⊻c`NVUS@n_&raYtK̫վ|WnD\Lc~xQwtUXZ;봽PC|ˬ7;F#%0㾵c>}]PMyF5w*[wk@][I ?ˎ\mt(߳$*l@0_[:SWwMah6MfcmO@bm(4_@W?'^ ۫Wɝw_bZ{K\5yݬ\.>5[ڃQ}E2q)ng1sfyߏ|1uܿ}S3_`̊I5s:팅oĻey%{soUS~r4DܲTn)[7\Xƌ*c[=OFQSM+ kxwlޗ񥥌5>}ƽӟv6ϿᏠN.%ދ_@L/w"!Z)+x=&LoDQ2N%|};_eZEO523c=LKثw&O?uy})4_߈)ŔLOINH)Hro_[VV/{sz9ݔbŜœ99-Ɯ;䳘3<̒;%?,ļvo׋9ez s9eNBsr4X1'9];^T7_]n]F[-&j#R.K~V{bj_~VW.\I⿒rw%J+///~y˪//}9>_ӗleK屗G]z.wv9Re!}Oi_$ k2z 4lw7BcY8XdQB '4 T2N941gk2@oZFeugl`Xou̺zYNk!ˊ؝AQb6tv+eCYƆAua#!P0-cJmfd"v%)LeUeV;^e#rWc!JLsW&9l<=ʶȓLy| r9ZAUClæʓx7y<BĚGws+ɝr{{Er\& '!w{l`ي^gl+{=~%||({e|cL:5:o?  3pcWFv@aꫴP0XŔQqh[0OĶVx+'-"[\?Z[M*].C[+VU@饄CЯ6ǡ ~b(Uz*n "VL(}tas+hditx3[+V70WS!PaJWܻb.nO&O0}v oP,ʛ3zFMzǎև~d<ڻ{EQ~8ŠK.c.|'Rܧ4vqr7xƒ+|'gAUr ; زMN1dޔlՁUp*m=n?%K.W6 [Px޽`13]ҍк`]LCiLbEj΢ U3VdhEYr8Un\h"kII2ÛjKx FAO\| PXf;&6yL@喫U#1yLbȬͨوf5,A!,lZm٘%02|u>8})hPoQm1[2=z'=.kbXM_g(:y2u|$#LWIfWF,^M٫q\D۫¢qWExlfW#[[3~qOUr}f.wK2A P%&%7kJxڅHR d.?.&OnjP]7+:{3&^+.**|;Rfҁ^p֠JL%1®*e j :3wP¯yQnzT&SW}Ϯ&Y$L0}>)Iv%-~Uͤ@8YtFOy1j:9<Ƒކ xci鎘das\G$9ҧ fX'>>>O?Utd?YrJx e=|N/-ZtU>o{Mۘgu/|d_/JyšS iB7zrd;nOs_8Ѿڏ3לgx-{v=Dn:$~OO_y[K|o-xck#Iղc~ ?_ՠ@6 @ TWd=PM-Sdcåͮ:qr^U==֎jkyV؜Kl.A|efy!X]3 HfKh8bЭ1  p@}w6^60^[xk]vM0 Rn^Qqb'7+{8ttFJON?1Wyz.zv7('ΧڞSY砫JM'Ddaߍe@+f(vg^$yT+7n\~j)[k_r_cՏIF~^54v:ٟi'uf46!3WQȩ1F9 _o -.LiLċ}x:]1dN\&dX00DlJyEʮƐm+0+]1k*~Hf)s'<=~<7ѤA>ڇ 4U ag\cZcil" ¯ciNj[xj,8-N):` '8hQm4iC*& Py lsI{,(Cg𜀷~1:O2{|)`Co/\G<0-fanlߠ(y:mS_uĸ;7ya+^KK>k0xN-Ojn?L2x DMI-eT Xn1acBԴƸ+8e6.& 8)j5! M؇XW$v>|3KȲm"F#RqejM^{6%k:[ hbdgEB&f?,{f\nҍڏ}{\vQ?ε^\NһgM&~A0kl< *МMX,9juMQ$TA:%,["QLcjs&vpFQT֡2HJC WNHQ&CY $ MO#WZ-s̷?>{?=9w^EJ25^?'tz}طBXG?&HA#V& 1gyg*'v< jiR7gv@ ʓ,d([CP+F!`s\؉Z]Qs32I&Rq+Uv"4g9m#ѫpHBȁ]/.ߺt͓w/XvҤų2[qc38Q4 8^Gf{'g7pi~DҲv3sf4f ѡwPPtgEƲwA}Fle~# Jrn}Dw , 61ͻ36tPP YVn e"e:#5q& acu.ghHsj{|ZRuޏFHvL: q6 Hڼml̂NPo0{?P9w6'rz…4ܟb8gyL~/hw_}ղr۲+ꍳED{pN{s)~ 88u.xxTȍUkUqqIA~VyB{py/3흲Z*OٱpQ=(x#Dh0hc3uZ6+_ɰ&ɯ=߽<*',|6Qܶ陲m^<ꃷ@CPׅ]ˈƑl"(g>.[ۅCbyq#D ldiZR@ Nt Y6Jy!q6ߴkI%W؏c |; ZlA!E0VjRXv F )@@a7|6U[{d<Gۤ-: h/g5xv8if7۰>"VGÛ/?7X:3-7d@^$hj ١JtDœmvi9VL4M0E:mlY#Dp@IYhXЖZ zs_Dq=kNk@!;3v"Ӊ5==}r܅}|QH9ܚŗrW*wsb_N.P\k@F([ mU0QLut@, >Tlr?ϝܡSaƒ{e'__$]{ч-LD]IX0bj&h*9f%D2& Y/3MoAx8Ѯ?wmc0uIW9Y  '+a'#d( aΑĊDxDn4<+ڮ6m߱͸絟gΓ jʑ> E2r6 |9+gA?A,V "O7rm@6QtC2fXB8l%pl%@jN!RQIή7/ϳ  n*7éԷ?tɐkυ/υ͓6ؓ@DȫD6UO}u B/&pN`|RF"AC&d3izC;-/ u51yf]z SdLxLn͠Uyn &6.sBy6;#~sM |;*Zm|ƽ Ux09-mAX3f0FIXV㢠dcy ""ю4!;CDpHJ#0""@ М$nRX$DnNnnj^sE;!nHƧ2^S>hkAQ{>22`>Ԛ]O{YL&NN:fm̖{(\h-pXl]ĜcNc`Һ"=X7cRn CoWUDn;Fwdvdj 0` &s417'OS0*Ha?9|8˞u iښɭi=yZ'9Do quj죇 .\ lI ⩐B u07!"@z(E+X8\ziUGi׮xzUni`މ᭺^8jө^*`J['`;34hTL).P\-yS#шTbF('0J5ih14?$!̰9l~'gG-]R)yss{ \[`iǂHPOP1X{, "KdSljqLT YPwM5RK84zHGB"A G{3 ˏ]>kfƝ~q`>M.>}䃋5Wzޚ/Yz (?l1Lްp ~НDVj";DY7EWD-n3 Nrbr*`\& !d/=x!AׯgZ`1#PEmxgZ՝ς- k xUq#K\V禴 " iqyѫ3[Y[P|Ҍ>"L| X*; iشhot# !_ QwtRX(>iԀQ4O"ȟ|hDh3ydbuvb|3!9';p?#ΥN%cثIW>rLNFQ{8]?xU{;i{7ต YL}az[E~=oX2;mpg-*:=rL=p&.liSt餃褣NYD'=vzsDcsPdR Ca7ʃ[T=3ko\ 8JIR"Dbۍ7!wE!F^#Zje$ʢ_ u\p ҳK=;uqn=:ѳ7 ŷu4x ^X43%@Hύ΄υpcG^3a#o6(6@D{U/N]Ҿu6|t+ig. ͮ~X$W7ؿA3&`C*5VofETC$EʹiDQZw~A=䮵DjrDmI蹜 -C<\ShJNM8~d rAي)+"65׏j&x=hvpPC&S?*L?8U+-F x9#[s }6/M`uwٳ3zQ/6rܣ W<@ Qkӻ~uѰ TN&A쎜s"@F4m&"U97= c| +ļOri 0]45ճbWc6F(0W"E3kW"'O@}}㩟X훍K Xh[>XM!k*A7Xy!YW| sgS(8m5DU9}"օ03h Fb-8@tLSA,uQLG#8O|ÙgEF> W-ܦNfW A KzbUrՠG㰦Ě9B-d)aM(B |BxieΘd, GXUED=evbQ㮝)%5Q~wrEK6>O$ϺtV㟇-`yxdl@j";6=T_D)^@LڟQ9$xqd~P|b̬j๣!ۮs}$h[!ٖ7 3DK"DFK4eC?"q GaRq0dشCw%Xذ,SEN;x7_yb_QFX>D其SGLjvsJg*Z~GZ!R9K&b,i؁x59H"(bıFq$EWZiA$Ou}Еә#RXt~}:A{sPwӂ僿=X :bHwx F'U<E4>|2QnF86d_+ SjSI8b6!y4m?O۸+>[˳NJ^P@Joݝ`>g(|fNÑiblad]5!2r{ML3.>TA|roi&Lb`O7letpyY"\IH2nzv<d"KYȐ=?D}Z$ qhB^£cm1s;9aI@ ІPVtZONL]_VuZDUriGTk%*o5)wZԫPֻϿ$n L18t ,@dJA qQXd"yA,b Afu9W 8eK /Rj"cJum+z/_} rw5ݽp#ǎS`O19PmwD25 ]c@u Djy =Ռ="Sv02>Eɍ}((R@֊,3䊐Ԅ90㿀wޅwwEi^־ H&/=Ykyb˓ׯ? RihiOjř ̺Dj2|,|#h̺_&G~ IŒ]mt EsSYu-T;:`mhX7s<`NJi=WS-qI ?2wŷ]h`]JFG.ad4\9y)j3<:cG~}_|eخ1=fG_ڴr٥US|&g~mܴg9"֧͋ܞ?%Sԡ֮y^ӺWۻ;>NeIFId::J2O@##Mo"gO#B7T$ڄms:wi׶;_.mv딗ӥ}z~yS(sQwAXT1[K4^nFM\iGH欶(WR %u D2` Ԭvb`|6~=(AJ*08U NH7p)MPYo5pqmg'țW_xQBѮGM̼ E-moj>8ڭ]}/V]ڧ{Wyϭٰ-ٳ-og,_ Ʒc>T)_xkP9`l3|()ޑ)XpfN 8HL , a\*mN'HdXF T~e夞=}lӓ}};G>\4,к˝08 um/f|CM"<͡b>RWVb2Bۮ_j %g f r ɒZCYH@qc!Q c1 A֞Ę V~0?@ `FkRDq#ls`Чs:[ieWtG :y8YY6wbKCMoGm858E蛒_ )`fupӾOѲE}wF:y٣tfЫkA>m0Dk3,dPZrc2L;cS|I "uUFUTK|` D@]}QU(ϑB큍İ D!vʑ+}'+/((7,Zv芕 166=5 uh FbplFA]NNl$a|dGFJ\'SȊgY]z'x0XAN;ʇ 9;M^T=s/~ҧqϡl>ق%~[6O{Og WZHW"vڭO̟vgz.XCvcQH9Ō0&_T>,BA n႖ȐFNJpCʢhl$o زD][A6Fhm,1\;J{yL0sKa0&YP^%?<%Oګ!)qqprTc˞ NAJ__ީ_ NδEryۀy,>_a7U82]# B" np"hda j @x/9Spf '9a۹dseڙnyH_AqJ=t%8naHTz+˦N%zg%,gTDHAfccځ %F3]sT k9xƈNo{Ieşw;^Ro`Q^V47 =oyiUS_7 \tXhLc3^/>v^:4i/Z7iTߎ|^Mڭv:6 p.D3E*,6M؁B]iQ*X$R[q)wٌ8<І b[%C 5X6/A?2$i!M]{MPsN|=uLZD849VRck$y[z>v^RGv>Df:G>TN&s/@c;/>Af_g)/@i1BFC&-@[t#<@Bse0 \A1."`) yJ0C!Ah.J%s=?‡ ^ڴ\8iL۫mJӴ2)AV;7LE0.ŚEE;6ojNq0>¬L'S)g<i -VZY@;{h!k_; $yucH59NS&]@MSpRĝQI$5"*ɐ`j$-"e,3Pb{p(N71\@r!8EOsEmzawʏ/1j EW=F#x > }mrK/^ }ڱW+ӞLdE;b8,WݛJw {P2iMIDqqdvF Z] rtK!(<s orr+>~\ޭ{w+׵3C4!?"7@B\,nud"뜲 _ E:Yq`Q2{jg07ҐI&&QmH$h% 19֥={?۩YOt,-`I 9y'O5S'6𞁫wRǥ)v^]va_5mV&Iik}; V@g5D@bȧLܬy@#% jFdWgE'Gò,چΦcj+=9QLOT@XLo(r#!E{#MS fWU,G5 mafNv0;jY),IyaW+TO{ᓫw1ø{}ıuϿz}׃-{1_]>wx̬~j @锩 FT?Ժu둍+~#օ^ ?++ē%}(6iѤH3yTMb,Y5Û~/o\DKoy4k[7-!c}+ݷJ[vU{/?}pᦝV&>s0/&~ICiKo/aT޾~s}N㬎d`_Ή'sIJ[ΎpAD afKOS\BHa۩ܹK.=^fPһsRc\AJSxϥ>ėv/ h3h|!.ƟC8["OD$1RTuÉ)4,1zR4:(.(&PqG!t̔dU{J4&)ܳ!CBA?導;&EZL/YP? ӊW$ }R Hx`G~|ёWw)֯s⻡^g7H=Ma, ePe{aH472ih,m8#-]_-b|kZpmq4Y?ۍyɗMa>b|پ8&@;fAlC/?>>HX x:H|7~G1~HrP#)NT@NsDET 6xS Z zCS`[/[̉B`srC*r``VԍԠtK((AW(x3&falkg3lr$^ۺXF ]ٚE̗b`I;q#2Y96={;X57o붂 RWW{sM^AD޿!9^ 7 ^2>HC2DzPMC2š]l& BS ͇,;-sKY_\co&1~%pn7E;hӘI25AYPi3qukZְS:Akpgg"wvHVM284:\ug#'IX~G Z8z?~FݗoTĐy aM|=1)E! ʣ"iMTĎ%I'm,tH2KI"/揸*:%"t؅ہ TdEd$@"_Ia_U 2kII2# 'u."l>|cD$P!|T?XT?X{MOsqWzPS]eEZG.1xYlvԠHo۫9 KYWlfK3iYǴrq[@8iv)&q^QN2fDgDM-sjǯ핈G qX#eXKUI"A%/ALh8A?P %eQrJgjȡ5õ TRY,?;^y ⌃s=n}3<ڻnh?sցrqkjx |wbhI^|j'73/b>i joܠZ5MeDPe۩IKk%OJe!A^ˋ1 9õҤ]CᓤkvP+<ͯZ RQ1UT!BmTz/HKf!ڸo\.͛-Neam>[_a5W|b¡c㨭Puf E7c`t|0'f|:2d\\836N YeA$+_evz! yF 9>`)jPȍز,(ҭ#pDzI,.jGoleQHOn%"sl ڝHmdW 7,ܰ Ge EI<^t9Bn_{TJZR޸)Q`QɀJ]ΗƄ긹EAߴF_3_LjF¦Z:@t m[FPrKj^_!R63`; [1 >BU:(F2[:,9 S5aFX,rMMJXfmr?Vqgo{dK3oW.֮_Ӿb.9u4zmF<绅;w#6(h}뇏~pcPW_ ¦Dx@ APx&~mvAi&LizT_" G./'?|qߋ?/y:4>hjap輘hC;ofvA;I50N^hrY9\hE{x`X# O/hrpXiEq)$k4iTa Ã]Tsh *XVaoù &A8eEQ6576&S C8/T&sٸO|w-gDze/wGIm;`^,i/Kόn0s8! گ6=]G?ߤz!l]cAC|M0!n#(Pq+3af><$Tn:W ˤgF šn4XYڋqJh1:L1~N x_S-/@^>?qDnT}~Ud1pyxhzMD=A Nye|՟n|>1Z d|$>#k0jK"$JڒVJnD/wצּ]G^&5>:G\f3OI&  !U'/j e]#"~&`9Lq2$)]*"嶙8@鋡2CY< !`A?Q( /~Ot4׉ѲnҞRe9uԞVR]O #mݐ\I I I$:`D䈂,"Z&+n$-HAbQFA0V4Oe &pgӶjDٿ>|٘_x5c7 b5)%5]q&f)"zUz/ M S4$AhPeU= +2/J#t%0jZ_O9ҳwG{S(~,X^߻bYLUU]Y?ګGn^b/pr!յ\xvT[#). }TΣզs TܯȄQ;j5Qn+;WVD6Y[yK½f2j)CBHuliWLFEZU0U>6@F$Ss -5y'1(wns<׹uύ9"~{) Ȧ"~̻'O m54@XR(Dр7RWpN-ԃ*# ʓ3%:xS[|˲5{ȼLC6HM5rCx,P d(Z4i}%CO& {ݷZ&CM7-O6Hx& s%̉L_R>;??;G< P]lk>_TSf-#SmI-P3dtOG_TVjLAխ@ !/.Ў_W4k6=%NGНw;z/ʕ=:kzk)\4,٠W6"jupȷϝCe<{n]6_EUǗW.;hsrrrs;ل-[Vm<2DyߝT\n/GPǔٺ<?3g1 3c߷DY')IGDi"(I3cy<-& I*IGR!bTy^>hiWϳeT ^Q!VgKz>>F)x͍]ճ5 !x{ gelh$O-sfN-N=n9~JLD _;`թM%\fZ\JkOQX:V8:oJ}MW@!cp3#Dr }%hF{Fα];zޔtْ78y=oރd]@}=>\ $6rpz[ 6G0Jh鷆ˊ:xy. WX_AK$pEՃoo8|o9Z&t, n'_9)N'5NV1 Q,-G0:?1&FI:م(٬C"UJN}ԁSU=i‚zߜ[n?qgO,)g_9ikM!HTe$Rtfib= !<5XL`@}cʝ{zv:c1SI %l^T0O ձM)k }( L^d ulS _ƪ}mgs9 yV\ݿOՍ,z“3gʐ8S04*Dvũ^1e#qܳZ Χ)i?o^m~ ok].ž8>+QSbA=*>.nݢ-7^_1a1{Bf,$[4k׋p }&uizv)`9p9z%DMM}m'5I" f٠v" TN@<:j#0lW8*$qIAPDm#[ W>{R;5nܑ/Ehk|ɏ NR();xLZd0f~uؖsU/U~}1@>C< {7:^D {N]u]ر[e=g<YON[x\l CG ʳ-`^gẕ^F1O |̨^>Q |ƿE +Ώ'7<A\?/G<ЯMm/>-x,)q86^c<$gUF.A|L/Xp岇9j{80dWexȺ,ggono ~M؈g˘l@XػcXa]L.G2虃}vB/O$X;6*XKφ搄$X`ѢwnC?..K g}.~BW_8thKNqF(]ԜsBؘ#6we%!d\ %aҴ}SB2md6/xwQkc=sX;d-}Wv`j0>6!k's*'4t3/yG;{܉9FGɌ2cM^A Od% r@]#b@9Ne\u3h^q£։ 38صs2j0Yebl 0&zp׳њا ""3bCzKq@3D8^'=vdwv֒vt/ 6#[5=atfߛ7ʸƚ=EF(YN; {Q Gr3B1dˊm'2DbuAC1!hm/ƀ[M{C.ސMFӲ>rڴoR+++l/ݦz+pj݊7-;127F$HD[_^WqJ1CpjЋRfCSHj.7aRthtU΄/'G"]t%$"`bXMtO *s%;pK `-•|['罝ٴqZs@S{|bz bk._/,muUqk;?q\}G~:LvUJrTM0x݅h\xt;t44!GШX9yrf n72BN}Xls?8ܸ]h ~I$9qQrYޙB$` lx*ȵlw7jy>97iSӦ9xs4s|&釦  iKv𞫦Xe3&MERšj%F{i,,FG96YVbQ;Yi'H D $•A$Ď';6"T7{3.|.usŎu8w~} >WF۾f]umW_xj;VwhS<8G U6{L|FNY4I^~l?"+\Gse2&; +(`8YكNIeT̬!3_UǗ}a"ͥ*ynzX hh~}S;Ӽ dfd_H 7`Gh{Ey]Islg([[%l)X 5hkv]HIZ~a/=gL{%OkQߢOmaF_bzE7[SHHyai|l_uϾ/fKiv/w`*a\>]L?)u_(ġBLhRAhuUG=Β&C^ęZ#TIC[Z$@leMnnZdK`d_TL0/85ӣgq"'Q2(e&[޹ ]X *W/c?PVhlp* vDYs=$.K#>*B~V_<=^xh݋cJsI.gC~TpÖmUo .;!bt*ѫapB HzMpUQV2SAI%i2+$([;[T|c/=4Df~ Z6]vqzdOw/+hVg ٰMɳȵڋ R F*66:Xh]h)T SPwK,w<n&:Dl\C+j|8x-A?K,Zw_b7{+?r$wb}й`)d9pPSf'\&ಥN@]dtޔUZRV1k9-4/7dsM > q6CJ b=: DF9}TZFPPT‘`nʀHSe5s%:#3g٩{=Q3p'|jFVcYz|Td q~JDQǩ367PF|@viBchP0.;~ЌtQ()7̃e`e(4 5L(՟ pnKbVYK*  2Yiˌ-;(Zb#h 'ݸMy6J_Z, ׳W߹?{x|2”N^d/ɶM*|k\ 3. 8\=0Ō,x>d2XA5C]ҫY>¯7h:Y{VyԴ*prX<_Կ㚏D[eM#tc/{ a DTd#a@f(?nhDx`6pȠɖX䆅sG=G'6HPeRkC*dٱ_?R>77G=9o'[6Yot{US~հ{z25W8wJy&r2؇b.Bb(x )#o7jϗk⡅K' ji'jݟpzJ@S!-(Rkt8ѥwc퇵E M֊"'gjBc`ͪ1&sc0MD.fBՄq V1 *TLb|.T6V#VhImmyT2=kxYXj!-(Bi;i]HC-Ԕ t>¹R%o*!ؔT˦w9x.ɗo7ʌXDP1 Auܜ,鎥Sp3W+-Cylw̺qDXr_Z߹ o>mNOi/֜?~C&M;X>2(=*i~#RNRear>(pC3d|M|"`HX(H3{>3ȎzR14LŐmjUcAc_;}K h dHKvOLB*ꎋUM @?YK2 ie˙k,{Y.QQoa y\Pج^ҎaplbkZq@b K$- /F?۫W}gcfo0oGB[|?HQ֫n7èĵ"7,D{J;yY$MFq𫆶֤'mFK'0ɲ1mIgzTAȩ/(TPA{2UZL+7{;B(LrJ%x7(;e&/wn @f&BV`H cE/MJuYAs]=3|v =qx巕^V\]%|ȹ.{:56moIp<qNO`QB59ٓD*23+CoN)>I-KUCtU`O!w5 L%ڧ}`|(Z>I :I/E#$ Cepd$e◍X)A%6@B+`Wnd}Ib<7drbAcrԶ/j3ޕV7KZЗ^YbZ{TjV-p#;3r]e'0u)uV(L} ?Sm>xj cq3~ VCɆ 0iUcrh?x,M Z2/ 7<ď% W)q >퍴b6CWGhO~Q!D$ 0~_Wv݃!kHӨWH J2J6AGO9lD]aG8mR6FÁ ,.1 fo'ڻvvC \.0 C\o>t~6`fF %3de( 48}@:4#cKLƻZ"?eْ.iᣑ<;*Zou^is&nZW݈|'>~' k{ɑʹAKNrGn!;_I1G,(Zqc)tr?C~ TIdUGT 7hDWnG 1|}sozi# g օ+&NB:J0@vT0$G,v~<-7nWD:#1΃F(Lwe0m t`8–]Cܸ޸j!2 7" Z3UBK.QkVszs.{⾈KcD"O!dx$]8ya;",Ԗ z_ԋy;gb=0@uwr<6:kߕ_by cL _j@w1tPSUI.~>%W`5 +N&YWJMPHw[IRUFɂKH%&M̹n{\6j ޻0 n`Bjl4GuN톴7z`<{t*@)^O S-?5\r 8b up 9jso_6p#,i |e;K- K0!aᗙ67 V: h *=Ziv←cdڏQ``Eݕ$Qi>rC__bo>j^CvW?=ao?R3Z O`%y?A="i@pA' Ga;4 gEVŁZ;C9Iew|`FT]v^k9#GBݜjC&wQ]oE!`^`#f%&\{EdyEnoS>coҖ;#M-lsuQrgTk3`iyL%PrdZeqnؠҒ+d;KSI,PQ %8OBmylg]Eh+^:=(Oθgl|M152t^;~;ybr)u@~>"{$!.C C/2x`&kӯ_!il%'A]21HLb}.C:CUfQ="4U%){%;'F%H"-Ig4iAlb)Aym8B,m,y{mھe+L[zūN~S_Z:}=,,֑إ܈؆u<3 ]Ɋ "G3/kpAxJi= Xsdi߄Y5vy86kQA-~qDlƇ^WA0iAX֜ۄj^ lc3'ˆQ/$j0sO8r8ʼU=3zkeZfAΑ!kS+[[=1{LmmFULqRJT`HqF/ e_a'O{yiS7ƻZ%gߺ8߮Wg̶Cο?VWax!eL?s Sbic<;g9z1rW>G88Pwa[`< F;N Ǚ3uGTbkbV µ6uƸyCUwVoqdO7HzôN6vNxͩO};s^l$EO4x:~ԑ1H3bj0_~h9T- Ul$ ,_ ƊD؝3[_!T'6/="+x+]ԛf+ Ma8 !>U6MLV7ܿ6޿#8**)QtHuxcVtkN_C{i9xtRdMcvO +*oy(T}Df.*Fw2ra9u!Q?^~9v3xk~ud>0Kd!nU* ⪈p%dث3]ɭQ6FKtV'F; =+]ߥmYQ\ɚ otri`o%F]6.XGypG  ch:꨹8 H:GzCTy -rDZqzB.}y@dʥ=,2KNb| KHX툺_@r %&C.;xU(sնxS:LP({FyCt1#KbP=n eL"y^Zzg2{2){lmtó3ybiQu?qID2T Uun#|t;ל~qWjlaƴJ|q[ޝ$8L=sf&K\qNKu3-s 8n^4^aR3aRuf-pYD~'Ch `K "i͒AݯG Elm-JI&̒-p@(Uiea9T`@XvihT$v@ Y"׫ϾWqgnؾlan=77sU׾>iFպIeS>N7LmZ٤H]XS־KX.׈q)؛$瓸F/ ! a1j&񮡤tp3|e-< ']GPwQl7ghg'Uv9Ǚ*xL{ܤ%9C}bE`ձk Q?8@4YXp!9z[B"W&8b?!P^un%ͫ%;axP%'ƊreZ#{RK"Z,֧DcN裪_|ޛk?ut/cW3v3nVsA7mb\tu LTsTPr.D!˹D*h)@_js]I$6Aê z"8uB/#fra3Y+E'4װe%eO[4%b2&{p{a/$PMIt*hWb$R jtP Ɔr8FWHPX\AB%%9tO$i&x1#v(LdnGߵn \Aisbdu p95)8g&笸7ŜӤQUβ3 ʣI.r0)pn8gi4+*,XkNX\ׇ&0\B|׏O.۷zK=Q1p^Ɲ ,fhS'2D J^PMFW.i'U 0@QDa%EIAc ǝ,b?'*odgu{B IC/omu5D\X7(¢2K|aCqk N"ErO@!Zh|NXNȊB$:v[iw%E]7XD #\ ?y44} @|J6 k paypM9fz*]7Q9P#sPp!יIi +>(׾怘\-{.֣OV0eya7"Bߨ}@E")>ەLTD9RɇvA5e?A솈 3##,Eva/W@ӫmśn٦~^=u:@TEɨsW*Oȴh 6PB 0$"%jѼ. ()CȠ- ,% iyx>~2oɛs6&s2f1'G iqOLЖ>rm ;qpQFDbEHO]9YոQ*xi%bLn3Δ,gjڕO֜3ЯɬS37$gSgĐNJo֗Fvt(XFѓw=W Sgϑ=j8؇x+MQhQ2ِ\%!;'l7,H*T' ӏ)߱4FXD" y"܊H7LNUJ  Lp-(%bBt`$Ђ`!y£c=V=ͣ«GMh>cYZ'HG( LԞ8j]q}#e:I,{dl#ÌJ6M:#_o:cqrDf8+,Vl : " }QBw Ś ^g!(tR!9 Sq#`|/Oog=\(UN/|712sݶ0OǮ&EHKMiD2_:kp$ N+.9%Eq}e |BHz] "4JAT1d+qRR2@%˦8PEhartV2ϯk*A*6>Cv9EQjQ}7>wȈ.͒Z/zmWSߣ=nO߿[ڰu֒Bmw;m֓nҴLn"EJvmxtQ$՚Ýb-$C̟XAwao 7.ER|@ :uܘ^ܘbro;boU*KFD1덍)Ƹ1N!ZTLBRNaYw>DW7mׅ_h|ݱ?FshxU Tc7إ5;}l/vc_: c[+e||#?]=?׵7,Ȝ{d܅!cqM3CJ7}Y"͢O%Ћ'duWc7z>2ߥǭX'DlnlFwB"` xOߌczK~>&&a-C6Y'FX'2l M:}ۗUaW`rsc7Wdpe#& !.V̴ԍ,Yz=jHP4?w~x`9F!ˈ6kgY]ȣMe.!hz"TI:N%b50@9]0H;"(m(væ^օŽk֍5<`f{)U7xnYe<'dP ΏMըl (b}^h#LtYK"D?aO e{sK} 4Lh%кE1#%"s |tDO}#N_o޻`snvD_7O>]܋*~1aSSxhkS/%믺7Xon V #끞Dc% 3FM a2 7ru.E'dhPIt11yp" 6g||sKa:Zi.>XP80os{`sGԦ[ؒ3.Ϸe 1klEFU\6Up@#(p6p9$ʍ=Y@QDiCz\xߓ8(H!hadf!!p ~(@$FiS' IƖ^l]HBӋk()W_}5s֬s;h!b\D3L#(;j3=40O?A=nTbysQp=[_(ȹ!+'ȹgF KrQ-pq|9s#O@mgt).St;sn_T6\lߦ]^-GY:K)Hͷdes紃[ԡY~~4~yojgb0_q̛cWP4ŅK:|x]/b<Dz]Ӷī+ϫaEzvѯ{r==Xk[Q]PUCۡW;푲߷- 9+Z+̯h?v=[ylh$m]c~ծTѪuTԪuqYGR.X#%N+rc9:TƤ紑"g:&+Et[ucyi{02],/ڨ7LAoi-izHmA . `yoa[׍.[nl?0'w^?Fմ2}^H'Ѥu]f^.}RѕT|㸹,oѨr?j_yܟf$T_5&r%%:H6ƞSՍ^R@ P@pHBBo1E@ KeEŐEx]ٺZʖvoid +ڟՕlBoqB 7 j[؜Gwo" Jٖ/eYѢԒ]mږe)[de)[m [-Z)$M-Z E[/)[P5:"d.+JCJQ*Ui%*.pK@6lQIԛ,c7e޾RwH=0kR U 7O-j_C*Egy{ u_|u[o}'= Θk%SoR(+kѹMI/1'յ'aDUuwv=M<%U%IhgRf;_?K㉈{P9sJQ"_4z&*f=ʼ %G Ǟvb J!xQwi+[olnMm*ľ[EVo\p8 7# r&` $zX,O],]bBcEȺ@:IlHQ}uc3C6?f ba-f C|~UU*,%&뻭۶]'gG2 rQQU hpPG9AB]wVX`&I`0ԼKe7=.xE#ݾO̾㬾B_:*|Îa:/@'M /i"z'71*;P珕̱n7RRpDr}$W]a9neHpUb\(Ƙ^qkI7|Kz,#-o~*77׿oݔ _:D eYd8 lib2&HCΒ~( 5@vA#m҈[~kSx67P6.X[/URTq +@Є\F#7߇y áѣKlNw.-m0a "Qr;2BlkyqAW4oɌ!xHBzFϛ~{,dKF[u%D-~9o6P*G&Qxޢ/=K9~U]J;''mw֍hT螅:PLue2JR Bm)ˍYFq?Tڥ=]7h}4k1{0/)OWY-SAIM]j*NlԪ >J *][ 2 @޷D;ƂXJ `(귍.;IYT1ПOiwd@o;:P&WM&L Bôq%Ak'CGxDhMx6Q+ 4S/V7Jo16ڮ[BkyWv־ab7^?~b #Ç\>_u#6+E;~$~mz7mڸ!ϳݲ @j ~ۃs"m*{u(}ۺ2[䪡4%:b` <Ž'Yb6fo"@6^q2+qV^>mH,PK\ Hq ;mNlFӆk֮\=F{nxr]X:6cODzz_`FEcm1ªYu[ڼ1o^?◇# mk5m`Rm'Ꙛ GUTZƖ$3G-uJ"3!xH?\2c%}\.͐=*$AOw@ dԭa +8^("PEF 3y9[UBvhYX^zKj1 G9}؝79oϾݲ e!\5#Gi..MO/fč`FYl E,!I50x|Y&EBѻ1ΆOj$A$+f&mL$k.YTBL v0H HBP7"KSrź9*Xn _>쮱!_:?vX]M~3WZm5m\?U-!z*z!>R%z|,@ "X_Y4o}Ad">KsOZ\v_~ 4USFPxq0 s@9tX: ba0w 0cd)QP/i{;vJ=S_u*Ͳǝ&f l /2rۤW2hm8*)7m>,ݼp}8դOc..aRwK0!/ZsQi VLHGb,pWq[c#+S3z樣ø5}mqs?T3wC.hk4 R :L'/3j~A@y/=xS#`o\ctJ V֕j/(==͖{ shzC u&;X!8gnj!9gXuRbX~=1Y;X.w驁pCl9K)%g& 2 gavİA?&fwDgd 3V~Օc}!K}aE7S"eRP81 , hpQG %Lx\YsB Z!z0=Ł5y4]yc1߆h9:8M7Xbxd3z\?5v )ca&zO D;b42P;I[҂_\n4@tqce3742 u'Dbzx@ HV^|U[hYc0fڝ `wƙ&(cY7n%ir}1o3"0~cH#'XQ`PcqOˡ9p]0>?e׿_s5cfcy`HSg{/LaDAju%3㍲ qltCk]%\"4g@7MʟZ|87Ixk'$B6\X(HaRY?|~$F"=(aq@,zoYb]ߎf~1-nXPIObM: 4nywV{ `jC luᏎZDZRO`[dU)q MzCE72I< %W6hWxSțH}e}H%.W ₕb1V =0KB}GӰ2p%ZLP<{/%QVrO1`1E31ݢcPKRo c:h}`0H8(/&pC:(::H1 &;H)OXW݂Җ ˂6t$06$5 )hJJq["7TWћZX4I Rei=n;"uق +?p՜/lHyGe[** ՇIV1>gj~l˜a(/*ZV "["ـx0diGl#2L)6.ofȺ$n P+WE;9,/ހ(rS܉bDيO1Il4;5,- ;;Cmk~0}ѽ9=}ӦfNnߧv=g/ 3O!.qx0UD2H=ρVߍH۞8&'nyp_6.YX~mw塪U?G#+P\2'K}%O 2ԥFF 2GZ|n(45@d) X \k6}OnAh5@0ݴZK8k|.8F*fō #3"2#B`,% U(Ka; X($hm[֘M,Lp[W6PaEςj}h <^{fN=Q'\7* x2.,QXP؁)](*B Ed8%LKHf%c (ۼ[2nrHҿ=h6Xwywk1~Db%2% 0?|\+,HAaRDC@mQ{:lԷG G * Zl#[./Ǒ\ʅ d8__,kt?,BwN.LJߏf87|}8s.R9=Y:g/JP[$䔬h2 =V^X;f%!h \R5sl3ǺivA<1(|X@0#)㍋w`CX8:v%K4xMSTZX[sC@u1VƣcclQf׫+*qs2vS%U4Eʱѐ7轐HܱzsΟWw*"5/^{k{;lE+J8ްqrJ7#sI*u)(2Z zC >ېnLPP*hnG4ޙo?u͌Oz-W& gY G5R&d]hF# rK~,2˜^Q2o@o\I&WZS[LvOro(Ԃ6D:6$;LG4yC4TdW<4Q2y{=iGߠ%0Ulj/ٸ#w)˴OĊH&zV2ar%ADAʤBd6]8փ`C_Tð-LA4_߭Gtp=YG4-+EdDg@1RcrHL_7Ν/L"*oZs Erf3AeM: ~liN^][3 xLFMmTmz$J.D6咒CIIK')+$L))GWM}EhVhxLw5ȀEsB| >9P f̙9 D(M@Uw}z @!Ǭ^)BMUu"tmlм$3KDX = ?XN>WEJM d++/u "q RS71n@b.3%XB-fJ/\0appvXxd-O$G{iw譏CN::,aDJ| }vHޓbE,"6xN=7L쟐flػF08~e Jv1X>TP!RY;å#jwn(yDo )4pqL8N,.¼!CZ\\с>M^^xqհyWy Mգ.0Qw/w2w)}r^O獥,xp]${ŶWXlQ,9B4yaZH˴A-v? 띟-^8q<6wM\4"lò7}*=%CTF'k&wc.0 @o̦&b QL2v|ObF9&C%ٿ5a\7y\$1Q >u fr2P3Ppy@i< I.wyg{|Kglko*k^ N)`V2>4ZF``eX:਋+8mD`l-hٺ$i&(!$C_6c9UkaUAϵHe|R-!WgShqb9q [mDTn/t]wh|ye䔏֭%as=M+`ܸG-'S!&4poȣZB"έ7H+ȵi&cL%12 9%O |=هGb<^k3eyIDDɜAD* ()EQ3EL**9IR:STAKvn%9yD}|^>;k}^õֵ͎7yR5rktrtJAڛ A;\oOB>(^H='}"{Q {V\롯ށ4_᧋:')x~X)"qJBsp$C&E;_俖,}0o>- OҷO?_qxK ˓b08z&%ZY"kPA,!5_X@*ӲDMЄ.`uG+%j[6h/ZZ>2o:g? ֑ 9b77ƍMt/t/r$K{QE2F"WB / /k]#oӒ>wu@'~b䱬#fBI֑T tbqkhe8CD]rߖ $κ'wT)fLn2/-Zv*OY"zB,ZDD.5';`cs$ ! h]BM9[+HVf؏mUC-Ŗqe}zvt%Σܖo(j 1oXB;`)J c'cLxj~kMq[5`\SP0\..;K~]0ƶ1su 1q7xY_旱!%}HC12K8兘sj _2?p(]~My}~?i/}1Qj~ސDkxޗROwtX_ VePd*y$"6Iej˲˗D{g'ɲaPL*;YzA'XWUIO1|kROue$k!9 {G1,:ޏ+O%>] +/%KG%T+3{[B=c<]ac%ig-O,&h g+<#7(fA.iJ8aU 0[>1]Yy &NKJwHrvR?[҄zo޹s,H/5S$ֳnI pC.pֈP!0CV#\| Q9X:cWUniNvȔ$r (40N_\fN9,PbZw@$a>?ne% ZrCߝu8jW6enѧWD_|xu?_5A2QS=LÅaM'C'DTuNbV;EuKE\ d95hWWٻ"T'#ԉNi]]IɄ|@zZwB5mmݧQ^[92dԵ/T=ޯDZoߜȊEbD4=5=o[5dvEGǞz9Ø Xd5N30Dpĩ HAd5Wu&uHY$T B7fO@! )Pp$Ng}8 'u=oZkl#OdB]q'?NXʏy<=Fkm]4uXNs鼥iB]@SGIG:9g=1}D>,m5йK2y"!jI0> 2AYS:sM%W:@=4$TQ m,a JN `f;1oMYNb޷Bٲz˒m?W5l*,S2cɣ=Lsă1!lSuԂ`Aըj'R?e?;ZGib3v`AK*Qo!jj rm4 -~i:vS~)ٹ'~9m>O[(߳tf9˦S.)5Jb^0A%e"_h6[I6:܍ꪓTo6JGP4#ů谤-G. W9f~z雚'wy#uÞXJ}%Fj#!I3_%OB"\G̸LN2'g'EņN40\.t7d/_}闖1FmFa\7ΜO|C5?;7a,>t:`&'WK9PvNy%3!3VHUi+vN@:Og[iGO˘/Y.EDMbo64,; U2n8F$maW|-rr Mh dOj7˃fkldx"U7FM*,XHw>._;Y (eǂe& zR"9Z{|7BF'8浱Ǝb{ᢰ8~$WM3X_|tM2O{R!*DIJnpp2Tn}AgSւɂbf]<lKKz j5&<ûu>(<-} r1e1W_GO~ Udz'Ldh!;±.)?j4ɝ %mQxaє?`J@ĚRL ^+S5yam{rJD$hA{#!]N|54 oRC(^ePXa] ONBfH@# +va㒠Oߒ7qҤ׿ӯIvJ,*h>{F!0xAm8G=8Y rWzdH57wkm$+⑓˞HadI%~ZmV"H6Yv-yʅ Je?N)IԙϞ3ڇJpx^s `(9R٩3q(dSͪzOS% OH'V}jnf7yfMH@; nyR(T7Y@`GQI ~Y{s *"?۝~ nĮ̲mN/97^Y`5R?;eB'H^vbReX,]4ڡqbIBМ˅3w"2<&CHzwNr~cUZNo8!~Al]\`|ycӻoYryI)[|vg/hQxf8pQ%@g`ej]L ^z[Yq}7PQx*/d'cX*́|Ln4HE6sx/2=z$`d2l'\4sxzVheGZgQl߉z02~tcwn#nAӎWe xO#/ʗ[+–a5Mwoo|Ե˿}~S]۶kt m&3[~Ŗ:VFp :Nr]V_ N꫽}m׫·-:H]5}~VNݑv?׵d=F+"(<1Wi%NZfAAWK=EU}6E6f+[S;.ѭWeIKo!j xa|q[z_|?&{߮Se$ǴvV~G1[$>hはfji; )?IzW*񑾣߉|j0$|:]$|)+e,U?5DNߎ{w\"*{x׫EoCY_A\Q7PG_SeJ*CzĖ592?Oŧ?߮-l;O㧖__l+?Sh_|?ʏ!i7 '9~?Gu>.gwX:{?UmW',{m|Zm`iG3uϢi[ 柨&~gOZ&Gw**w7#k})I_)ۿ VE:uC~y < :>@}6Y˿'&K.?j |sBOY>ik?'xGm%<)?31ἄ~>VJwL_/ٯU|)ÑxG2#l}P@YC!//c\ Q>j"mT'te{hV[o_ߔ}A ŠGd e"GW#Đ)x.`1QAǂl!ɳg6foh3Jm W7G?o_6[┡#1f* A(z%CtE]쩔|ΝFq|&3#o&yt g(B:' D[J0x$vEt4.Z#udyƘzY7(F4xpGqŧOI М[nm}-:3 IJ?'GG-P3Yil~ tYϔ/pSHI^-Q,ω<{(i}F?riI]4 !T໫ a7'- 3S`hڣ2:Ru9ޟXˑXtȍ7I$(aa xz^h9p=I9~2.@[ |:K[?m9~DG0@nntV -+ypl?/ h|IX,iQ {M-ZjF$Q[+[!ٸi-0~o0q7 eC|gpddevy}gT'yMn@-)@>Ү_=(wHvvAC8"?O)Vkv}p?xBOM0w> ޘE݈N!$2/n3~I.o I,=dFDO+LA)̅_McS}bNS|2# &7 R'=w&rm 4s:b.SObbؤ,3oF擋#RzD9/}ϳw?`΃'eZݯR:1g?yO8뛓~:?MxD݇G[׾|ׯn6n3Ptre?:@^gW<>ɤQo0Ij'줳;at ~݁#.jg(!#S F…'._6$vw̖6oh(T r#: ˓t0tbiEzN|X0ș ,shWkHN"ř'KRfǭ䑽 ByeU}bSA7Eltز`îoH0NѤ&ǾH֙&us rb&KLs8M&Gٓ V$dh8Yl-IHpL}c&OVu' !'' X>xj%?H}ANzqʛqcՖK&SX ;XQ:s7 'lk:bLP4o%G_Uaٕ kF }hvNnqt " h#NWG\Q(UN4!/l^Qbr ؿlG4|A9g㟚׷gZjo%anqc&/lptYVV&ff& D -)Ii% W 1#ⵓ2#I5|[qE$T <t&4#(TC5Zm~SBI@| B(CbM=a aHjH|;Q KXQ&t=N!uzPMA3@hdv &f7A3b9d_t-]8h#O_߱ڼ̒YM8S-+iK r,don!#jdt 223t4sRotAQ5p guYJ'#( fU-xkTx2wjq0fZQ-aDzs" Fs =^xx:G!xm @}ιJ/ f%vAWp-e| $@<9ItHa y39Esg>,],UQvk_הyik#pχu1;`J{Nu5K$;KB }ܾlGZzz|7A*:<`[&?9w|_8uڏ,ZåB8 i#/&@Z *Yssmp 0sPru9I}}M# ɿik^d'w}zr]2/h92X鴿 堉J,'u7à_ Z#w < rU)dt|J"8Jֹ i&A/H "JE4ta د't $PH(%hvaq%'T0 J3*A  H"\IJ"րa-v,*!Vm 7*1DRcǻmضп-;k򀑯Na9t.JZo'QI;n75`CXCj5&$[G_֑V#(.M@qѥم:.JƒxPGNiRFO`/v` kl@I7JƉMO4J8KJ][%/=_>/0u/DE`mC;ܱ㾁ZveGa);WNkO]tq&H7>Xȷ:PzdCEW]@Z@±1S!FL`¶e!10SW{sbZHyMwpK[ Yn:bw3 FTm'3C526M>0=R޺FImQɂ ac',JDeRZT83ViKХ 癃`m2R/ Ԙ9Z@+?2ue<n6x;\zhb7|GKK]Os;nǦCe@v9r{NnF뎖Q+{%~QԩM-+NR_qi ~!`_w8. |TzjOI5%/cwW|E/>A7sT"&kxqr2hjйkTL,[?;}h2\(ahA 9P|V謒w0_࿷kጒn\uh|l*=6t [t ^68'>R(>;2,<&$aL&qjỖ|+Z \}AYm~ʙ+#pX.YM&dX~ Bz<܍Ne̝vxG,%T2B jJid/(6sȁIm@U I(~L\g L㵩;1M 4P~`NZ]8ΈY cR`RՃ_~R>nYmə^woy´U"R`82Pد; )c-7l^hr?n2gDRus/b%qO;9V9o _64U-ugPQ9aIX_'eKr "|SE홀rMl ܇ cZaVTI%B;1 c„Z|,uS>3w%P @3 nuo~X{ &;W_c71 ,K+:hUB;% vOO6ܯ1$xR oKb5"]`!m< RQ|87B&P?2)[~ؔ~?<š}YM%ΖËmlɖݼiMgΜ4 =/r2Ge NYI( ˙KL2sĖ}[K˹wdSWՃYWX$gWe+Vc3A2*FFTkXi[q)V7mJ(CG]n_LQ46߯/m489kzNϘE#W֦6ԧߠl +j@;:4IvRH x >=S$AH9`h$W 3^ =|xu]Lի{=c\ אPv.F{:<ϑVΔVOo!3=miF^Alous,QR;k#D9RZj *[qY~I-no+ >ua .* vDޠ*p@CQ%a INB" [P5|Ąxzw0g!6IMFR\[0˒4Y1nyҽq&>|!)6.N]'UwDSydӮ#`*(6;ZN*ώR>O==Nw}=}ASԕf]1Q1Y䱨ٙ9bw;IّQ FŲӚᢜ @m)faxQQfhi GgprݢȐ^mjݵ;f{usws9o'z,zoMr;Rqz)R.i]n.@:Cu[3,=NDi=cԈ y,GeCa)o Ӻqf??"պ>/G8s w t-Q%#quI *Y ޑvQe *w9Z|4tچCҢS S<XfgHԚ^<ʩjnoI]0b\$ًG1% (y#R @xa#Q8]5wFV.sWN3M<_.]&<CɏEM]'I$POh#Z :AFj*pX(,6T9Rr'Fqrz&Q1Mb[b-?\9qG2r y쉚>%>J2[nP,H@ VFǒ IZVh,qUR bNf=`L<D{<8JjsG;if4nr+lie%YdHB|$˻`) 9{G;3 <+E>]wc,!$^1eT|5^qPNlƱA+ZR U]Ǹ6N M=ޚQ0@EB#v7=/yvtdy'~\dQ~,x`x҂ `bpVh٥F;Ձft@ +h,`HHT g'bƩ Y0K}ifjKX4Cmea68zD>xno.^Ο{߮_{k}==ZYqؒ~{̺M^/$-u 9lHHQglp#5)t}$U|HQR,H"5EGŁ@ an)-\9s&ќ7Ly{qvQaf=8K-xD~r:*+ $HhFjc;IcJO.8ջ`Eѱ RMN1R!Q5ZF@-3H.] Ɖtԓ- =v)K[> -KN|l57x8ol5^{֛xMW18۬9xw[@-{E]ޤylzP|aäODsgrbXb$Ρo;NI;;u/r h-k&IimFtkP9_u{AwXQ[4ZV2轜;[hGaM"C賀/73ϣȣE9az_!`#G*1FR^n$aFi׳&ô uք4W0-@ֻY)l:M k ]F_p yx3eH }9 Vg\]ð/?Pͺbe +M{=^F:P 癀;>0g:cb ah)?Ks#3Z'hYS{Vex¼JL#L9lƛ\a%;ys c\H͑ \+>,4~ /@1r KSL[= #Q`r\sWalc.'ZhMR,$G1L,J q`>AI'OK O Wh)m|9g(E mNW?s _/q0~7h.+\_'tMQ[j1-p _R؃N.|8kRI`}}ט*fS~(pjrކ1)p# 5r5uX 09N4usj?}rM O0՘s^`i}Z{[CغwRwX*3]Kb(Tw0 3E [y)9|-K*U\pc tal"@m==#=:/le+XS4CAӠ>J my3KY5MSf0Eg Hs*|B(eGyWfLMT0d 10aJ53dztNʹO/!aC9^O8a^N8wp~Ĺ9Wk׍\?tٍuu^~£<>}t>lS>'\soP.}-;e{~}~tG-23;g|?[جcY~?#?;`̀ov8{gPΠArXNVλ908wM >=r̽{k4$gHC 98T7qhLըQFudtգkG}h1^cfj1yخc7m\w_>\Q|ѹ &|7q¤I&Y œ닯Ė*.979e<4SNsӲ-TWq|zfΨq{{f1k~tWξUU9̞\ysk0/|^O~b~]?Yචӂ v-ps~cI y,bx#./^d̒%-ѥ. _6Ghr,߷~g[Xiʼnl+nh^Y#+__W^^ysUުV5:UaՍUͫM=VzukV[]곫?Zfk X]кIO<؜mHݰ{͍l ϦM&l*4ӊM՛vm:Ȧ7M7d^ݣz@uauIEkU>T}O/W߬l9ds=6؜y)l^ͻ6|t?櫛om[t%~K-9[ LReіǶnٿa-oodw[oհmk֮[flu֒3.ںf붭{zt[?֫[omۜu ޶n۾mǶ}]~GMaҚuwjjN?坥;?y"O\UO?swϞzkOgԞ){Yvao{wmž}<ӷu9sF}uu}TMݵu{ӳvdzgo9`ԁ3^m|=W=yaóurީ~Q =sW+f:CZY E p_Kajڽ5ڽufRvoGYVn e4b6*s& 6U2W)gqb%~ T:e~&TJa0 q"CӠ 2 |; Ÿ/gM~/ <%u=qھ/ 2| gZ}AHRe~" <9 }3̀VZ1Lo}MPN!.k% ohFF\00#rh;`\1ήwwhyK1>2?&b!H;0H" }(P4Z#+Kr'C7=:= 1zK<>4#9^< J0v>X8ؑc3VzYl/{mgqVֲ'/-cNs[Nb7`<{ 퇀F`;Y6\.s<; |ϋ?ƨ~)SS11F3s9߫\MK)ޭ<<e;r@ܷY0pW֊9ȋ{0[}x b<3l tEnhuD,>q<zHT{;=7:g|\gA<Z_0%(#xxHv5؏> ?X>">Ox1/O|/g >3eټs<^a/#| _ʗGg[\b_/7"*k:D0xo&^[Vo5|Γuq?O)|?^E/uYq@<'!qX hI KeqT"Wq8!N)qZo7Yx[#8/>GcT|&.%R|oķ;A(.⊸*~į!-n-w],ZE*LPEbTLb8(JIqV\WMqW<OKV:*>J'WS%P R%T鬄)JET*QJ7%Z(JJ(JCRz+}J?%]P2,2@d+e Q*ÔP_< kTF+c";<Ț [^g+sX2Np)E2ALReR)S4fӕLNV*9\eQX-Şf ee@yXY,R+(K2QeBYRV+k:eA٨lReMٮ(;ZqeKy?bOyZٯ<)€9rH9+fAiT#ʋX-Rӌx-M$-M3O+8X 3dbL\Q^HM2'͜X9dj~֐5E&I)mUXU_X&m_nfZbL5ar۽@[m'VLV6qroJufJ0hvIņ2i=)z2HI AZT eSruv8]CaE&r&V.6Lcn|S=rUM.MPr>q,o`~_hzŬ3++'+响ôWhvB&VO.Y9mjQ jfmoWv| 3d,8hì{ǂv8n`(P-] l!T>WZS{U)}3'+oCe'}Wm-tvUmQj_~ wnS+'+Y+鯜qbөj1E[czXT,Sa*U+Gvt-Pӄ4MH:Xܮ&4@_yT[?/{dO'O]d 8[v ?$4URyWfP,0̢eFzD\hHY9je( gOZA'&16Vba\ll|.)vok5.vlS%ޥYm%[ϲf+.V.<AiqlJ8ZJlm팷o+9Vr[ lHՑ`#V6[ :mu$HՑh#VG\mu$h#VGUɶ/m_$۾H}bkU-)ڒb+9Vr[)Sm%j#VGT[:RmuHՑf#VG4[i:luHKQFҬuaT5܌k+.ZW\Xk]qֺb'.Vs#.VWJ&&4kbnNĥ%O*=k%;TbC%&gjtqbryhmA'Άq62.M?ŚjHڑ#EkG֎)Z;RvhHڑ)**UCTTTTTTTTU CҴҴd4n+ 8fNkCֆ4 iZҴ6imH]ӵkk}O՟=]}ttttttt Z)1C?C?C?C?C?C?C?C?C?C?C?C?C?S?S?SVVVVVVF{%fjgf"1t8Na "lwdB%P&$-y? aaxg8uibuTUS{?????????\v\(\ W2ȕW^xeW^xq2Zo{^ ~?A ~?̑93G~Ce;2G~N̑93G~????5~}1$1ۣ~rgq^=5V?ttU|AC> rz-fx`ӉxvwO=Hi׎nכb6Gm^ Dvw~۳uj0ñl].+,cvk6"}-6y1/Fhӷ ¦nDW/rGl6U9dՖzQlW(w1bQ^GXgeJz?-GʸmRDk탵46Yy9//|sjl"?}\Uh3y>^BkUhϲ_݉ruVjT{ulś_h2Kb.H4'E8>+mذ/v:kuwnVkױ^>rYVsWُh6rt~>'|:mI.Dk&ф}%g5"euph_$COcAU`PK3{Z~PKy.F[angular-1.3.9/docs/components/open-sans-fontface-1.0.4/fonts/Semibold/OpenSans-Semibold.svgy{$Wv>Eǻ 2c#tK*KI3/cki&;lD/*#H-s=,\WUo?|wx뗻o~Ͼ?g7~W/]/fw6_?c7/z| ȏfU6<[3Չ'w{y./~a7_͗K7귗f|ۯ_}7͇67ݽo 7PWo~ۓ_|E@7_qWO싛7oczWTۯxYB8p7?|ị߿~Ym6y䁯 ^qh+ w}o/~_wg7/xD8_}6S=^UvWfzTSz~LݾvSA.zsQ b6u[u?.\Wywu1ԗb\5U./a#|AjE9iT4}iX4&V{xzM{ȧw/z_%~e&aܗ1Sr\Y7CX;([);O떉zCm'Zo;^b]]pn?I"wm>[n㵺C\s_gG*gQ5ͦ;DniSU5B60T M=4jB*6ڊ_\/.3lQ\y]tVjhJz%ǩ)*zUWV8USOiM[ae=6NKEmyojv#m]_VvirዺwG!qz D~\f.sv|v7O2mF4A%4Ef0WuUޑos7C2nxQzWMfsT{ު2Yo^ k\ki$vz8\BBwz=8 ,jl?k* .d j|UiX`'GL0WWu5<9!Fr;l{Ӗu:=0wHUe<U?-PFd㰯X3?UWqҺ&nɝv 3Ӌ3lQ=me5w/%0ećQ+eJu?#OՒ@)bͪ%=ƛ~ۺ-0r]&n84{vkh$skҁˏ 6wFym[M ^x52bv̵Μk<0s=jV+%tuXJsI7su0;EodSY˵,7N.RKv/[$gar1V+dx0odwUjQ\#xGx3ls!P,NlzQofQgM`㞱Q!1/١&?p?ͮ}jaU .–s+IEkȩܱ}Pyipm64nиTz7lnix f J˹Tuw o19ߪ:ܔ=VBeB{lj2 GI* KU]fHlߡN F} BBtf Nj] @61t=#]hr(WAUDY(c N׎(D3o.[xa6/3072!%V1C`e:e&yzH1{@C&ź;5x=9Ҍu#26._xT:\;hͫ3b濼'=JOƫv;j\AAߘfl$Wˇۧ_kg'@'~`nԛjWA@i#aCs9G黙sq=]]vXglϏnb1Uc1'xZ\[4kX,| ژľ80P8NEiBeCÌ 0&~kHF& 'QM̷f^ If~[=:eQ8Nv=vEy, A] 6zƁ;I(gv{Z\bi@*`22d'$Rmx"Yɶ~ _R4*R%>HqnN`mfL|%ɶmmUwxᒟV_Y֓pvׂg%;ý 2zӇqk`W6BpIn\Rp$şP 6m dl~?߀ |h|N 2)ǐ,PRGsX>lpMآvk`J˞}88$ÏW"" |` OAyptG Wއ>Y`l$SX(9@crz9UOͰ@cgȥFA:0D uCcƒ1⃖+NnH@ Rm)n-̂w`bUˋîoa=jqbNżҰ5lV|`bW!PSzbur|9#Xx.шtdDOjPp vq6x#<釚Mgl]CFOIFԼb | M!XVLvN/f3ruܺ#D&ᛛb2`ߎ Ї7 qqϏؒ`z--ja'xD`˾p n&iYqv?lԳȐ9Q;1Ť U :iK \6 Q5Ep{.D~l:7 gp{X@& W/&[=:Hh s s#{bs18ԙ e#Jf#0pT녷yj2l֨X,y4CXg9!q<0i\'<`f@o8w#(]$^oxj#`wgI3NoL> bc(@pˮ҇o8p"f ;&7A )L uȚ$oI£VB+/{E}!p$8d룇_pT5}TVUBMaMU%GHr is`Jt &0ơH١LAwx;̞YG3D﹧q`BFC;Fj`o`RqXHuq@gǃ=Ԙ9ecvgwOlڦvo)70Ll0f9waD=1Acn" )*8s$RuF n"v-[+l7]Ԍ` ?JQ-{!8A_)5,WRn,`m; bwoV#\)D5AAQ9..b/ŎJ0Wheh'c+cQg ȎDj;3@7p[nNqbRbI*hWkhb-Q47X; 5;934’\q3}ls|GFk:d)0^ {I;*zuhT ]BD 卝'xt.=QxX$sk6 |Xc%N5ʥFxxD@e<`ÙmfO` }]@T I18!xGGjuI Ǥ kR( 8Xl$Q=bSv8w< 3_qi^Z JV1/ɴK]; np\{vL!^`&L*]$I'fj栓&mNšʂP# ABth*Cْycp vnDCd;/wg5-VP˰A+|Q}Lgd2/m끻&{  $tLAZ#@ѿP$q_|d2p*@eMԺWB̿_ fW 0d =U  I+ c D K2Ve8fY死5!g&K%P)wfRa"6$e;C^L\ףN *~'s̍]3{`2*׏13^ ptk,]ӑCȮA<Z%.Nj9O~q ڼG2݇afSπޝc54Uw$ D1l'gx~KG0ѪQ6=N`]{y 3%U>CG# F5V4ƾ9 TR)[e:"i&+]5rԭ!n*S8R@}8G4 * e^" *sŗ+5;L- \#>2ǘSvl4M4>JՂRkxJCB%n7M&J*S#aj ؋Ik|a8$B9'\;N%D:ʩ=#Kۚ/!({Պʼ"{uLm g`D1Nuv`Bv i0RC%>7Hz6]+?FɰLb?K´$9{rkf@GOU 8KH{Y`7S9b)-zߘ7 K"AY_xN )(8z[- өho|C jxmC1uKOkW=<[u뜓j\ D{ہ޹R4 /sîjk^ZQ8HtBu7ޭIjTO`1`ny_F~~Ox _ZqXnfZd2E%o($,dYI&۰R5U.HH ܞq0hXrH,O*nut@FlI؈tXbS)_lllp6k <(\*Jo8yl<&đH#4J}_* %e05 '[F3ҡ%($Bp``\V]`T4|-l)@? >JT7c2B \r7@hv(> lC#O+v}HgnBD<-UQx(?\}ItjuuiNуwd2/e`([%{|55NN4O }:G=c/ e-uS uL"0 #_DqGW6B'׭OL 43s@_= HOs^h>p;vY@iFnYY̢\ynAK=7dAk yeБ?`=)[.v ":XT0op5nDK$%0#G6<'uD e 1 V9L~S:0nE{B '>pZx\B5,u&!kw4=*-X!gYwGA.^ц<†A- #"eeh{.\)QEaoa%D-?[;cG*b0E~CEcPHxp ]G/QZl[7u+4N"']˝c"+7" ^o$] eI3 h"9Tи97U'%65.,#f#`:*ԓ%JhsѫJgYU.`ab *;%ŏ$Xy*?3bW+p,jm5~, 1pIjڷF _ޓ\>q=3C{G"%{~R1ԙihB?EҀ(a6 R*4cn]}AP!8\"5EJ<7G1t*{Kop4bbjihVg|܇^O,tjQ 8ܧ%Rg$dk4Ea+8BC %J< [g4ϴ>͑4oqbro!Ń:w<`8G/mp!\C'a!ؑ1WclF2DYXY"w<š)9#2ǶLD?0fLhM`sfpLueX[zO!*J,6KP=zEZ MԜvf8k}Lv~ 'q~QB9ç eSt"SM:nB/JpHR[ӷcd J/ldĽG^TJO8I-Z GБ(sT9yM iy`fʅWڀ\\`L~ I֍z2E q5|\v` < աp;j8DDثC)hwi:xGb>`iA8A,Hb/:nJ1O:G}"Scx_ݒaO8ك8SS6%ܓ_)cDAkeOqC`'L%++D(> a^bm^.hH]HUnbD(VE@ y% VeF02HM_m c0)6 .ɮa>u~ό+N!_ LQY9i:Z,oEP!>4a :Y~qçxx_S<%;Yd 'W٬s|Bbj@G!$rѼamsQ|3.iWE"c_= N]!mK /)kY2h$ 7dѴ &;V._[R3s]K!ZaM㛰5 X%le7[,0.sHvL3IHguڊe+{>.b ϙ;Q#CɮyiBPb"=R!hzRaKWaY֥fs_HDۘ/ d8@M_bT6ziqtʱF*rS1h9Z<Ķg%Ǭd\bJV2wy@̂(v-Z ikYqUwx8P;~yLI5;zdQlUaK7䰩YF=j΅i3&7cNєyqwg%s[BZRT*Fx^[h (?$Oc5WIkX&1 ֧&)eqoאRHrui  ZaMn$qE+9hlxvдդؠ7lY RA tIkbGMH.rꗫh0uF,zRk=y<%2!> Ѵ L1xd {:hP<|%@F֋-EW|0rtjXUm~; 09%WaJ2tH=[\9&FTp$ʘDC9V'⾸T p35㝿 u\^05QcE} 5}x.1D\3]q=SLbAp(.Or /t Y|P끓SMso"9(T[T_.;_Z{|e,&un+Qz(p_&aH-GCš,jS;Bg eGdz(}B]* <\2Xe䖃xQj.#Gf[)fr{a -:HK*h!&){]lWy$/'=ݳy󂚦 /}z'Sא/}Z xj|qd>y4u~Lh)Qvcٯe)3xm-3%2ҷ'޿~ Fr4#1%~:e׉Е\4zZmdДEejRVdySI[ۧU_8jln4@+8uO/v1i‚'(,=&ܿ}ԵۮM(%͞Qwm%>gCdZAX@vp&Žs9tH5,IU׶㧤^hϒ*6h '#Spjfs8=yK2 7/FCdQŭ0A<<>z=xZ =[A_,!XIqdLP'F2hJ#e*C F2gX<[|p%UT, d@J˝JspНkYapuM6Ӣ&g89x\+ޤ UZ+/IT[9w0XM>N~Kl%KA:L,TYMSZFAmNӧ)m ?IhzR)#{3g)2mlO0A{Aig"!x2W>:PmIǷ(" *Vٟk.7&E;%r/&4luO`} I'L\'g!8 O Ag)|1/ <7kh-ؿ%S6bLOG>Y!қ5*iuqu-_V7kZ?Z{IL<7k =& QfLAs0z1.$ZͼY">#U@>Uj7 Eńָ'?njudF7 ;-`Fۉa'rېL9Q+&f.+=|ږQ7(}}\=> ;Z+K- G:i=&[?ixb B̥8?5+e┒)euB/sM48Q fKS X]9ap]Pcht(śu~3Zqļ1 ߬FQ- U@:Oې\_G~ Zt:T a;/|5~Cd1 hzA'~Dg544*as-iOpG߮c)o6C9}Zދ~!a?-~rZ9ֺyՆ~!% x#!LkGSd5Mc3l>d3kf&t4ն4x4Є{=L4.Fhy'6nG枱"L arR00 PvJ9ShN8<@p::ךC n ρx @L(HޮC=3.K'Xr4NF"5S"Wg穵JJS|`++P6z$6ZО K?K8 "Jguz 4<8Wp)(rlPNăDS왣aѫj_YhZHqo94=: AvD+t"M;GǮI?U # A 6<]y=͢&R9D{&ゑ*FF9/r#Y.cAb7ǍS<8\N1-ԧI%^Ή1\pVՆHa#?J|mV}FLGC{L0hxCR|@& 2ÌI>xǒE6U5a.&2J/UV"+U_819p'!ޟMmc{ QzU" l+=m5c`M%K`U{<3 >'QGsSGPޓ Lzq~Mo{ؔ>\ sLN=,$ُ8 97L|`䇌EhsdiO,^4< vn'!nǰ9ąh8*z O'$rȟ^!G//~XpHְϑ[,!kz&7Ǥj}Ѱ#5W"DD@.#_;zZN˰Fm^D.UJB!L*)~g3ݞ?DڞҫJ em3m=qԠ|A*֞?ilɸ]!G2T N3N!҈6ߣ+ɓܜ=ZoI,g Y“sFldTvske"rn?D{ w%kO9aR]ڌO[)BL8NL~sh{H{#-m;ZBa`[h jpQo2ezV Öy19(ӂ8l(˩'3n% yɡf=4Hlvsnhk gՍk* y#Ǣqj"w׭b&Lz ׮H!mǧ͈lVV$a]IcjiRsVl ':j%'C B#>`Q.Ӽ7AmbNjؖr4vͩ8ER!Ra\a66yh3j&:A@K0 S s@q>}5'b_ O¶7_,rIr3DpR('qʐY2rHo$pVq@4䯄+APr<Ǜɗ*ѭAv}8S [o{֘;"YS(e"!pjϪdǨNl*]ƞmZ[[6.ΘzD4;כ?Bno3?;$Q_8cv%IEC`¥VMxXvɶx:8q^_L&()6U3ϠV]|5cM%SrDc^ O>Fv\<xDv!zD̄b&H=+F!m[~CJ T P#|xK/]|v; ^*֫ԶjF!+2:o `4dD0mG;-rraվ0rtzԄx(fGO8^0P9̸Y|@z˿o|1`Ei櫶ax c.%G5@ 7RI'w&xO{H$R#IrL͞O(iyi:I8}N)ZXZ=Lh^w~YSN f29H&[kM',w x778mm`'V|O>Yq|hy!^11ݚT@Nw5Fз$GuL4eF}nd(qHiʿ70ή8_ǙM'\ ßN› s`&2%U@,-@=Xr>g@V/(0ԕ3Qƒffq& ㎈:4K4{LC_ktS oO:[XO*K'.W5sox y `x/ϱU{ƞ"N cquq7 GGB0L:'md=irr jY4D hUc y jNg$( .݋%VS]"<"U~{l{Vo׫Žd]3tW{ϸ^Y+#;^@қBW<*fM5F<59nV}2a~>c ar6}Y{ub[UV$1 t/+la1߷r=,3Q%1@dÚs$>j)`mXRXZM7[>$&g2^ftlyD+DD{z= }4f!ڑO4ؗ51f^PlS[`6Gکks~.|P<{lN/G|A\z<۾㲚^:Gl lI {:Q~&U4Ϡcw)$`vnc N|gڂ\t$_K`Tpǡ JLH]FǙEy0{T 5&Qȁ8Ќ=_ pe+T2oнQR}ݮ|'qx*b)?۞iB<){6?*$s G+h>Mو ;e߷ď-8#ޚ]s'c>j y}m+W;xfUm{** aUK!OZ+H z]8-ȷJ cl9 Dר')Pl۵g%>,Fvڗ]O|TB n$ At)lgWT挡5g Ԫmj7w`VRtRxJtl l<+*l-#^ڙV-YO0YdcqS dMjqÇΈ.hQoRVѱ,EVḋ4XVBMߢaR./9 Aw2O|84MXIo[N d?! ɦ-mY]|ZKCGXu $?x|n)3#0r`` m=w!I_O!(D`pr:-9Q oi£o;Sg^qlw.9o%䥄 Le"cЮ\*Dc[Z g&&p(ᡩv!MO-㼉 zƓ{jOASOi:vS |6BS')H'%5R탷qD5V@a#'s.kPo`4(]AŤvN*'CmBKUۥ@WRCE;G3ʾgi`ЈoM/gd7:X~書#J5$y? LZ */#QG?jd N^^@2t T4'>1*] s:zdNӜ ˼F4US'"iې xI7  yjkFkkbTۄd4ԋʆЇE{&i8X^Í7v07yc=|m2Jے7lb/1d~6A70VcM< V.J %#,S5ri.#z=yd?{9e=ʭO;v `9+spӗhv2c(ptqZN&7 U:[܋ư9ꈷ$>GV [[K*k~m1m*i{ q>ϲ_,ފ4)% Q8^,Nc\:OAX]RTSgh"2N{}W@x*$&sM鵉h>.;[Ŋ׉vof,o?1Ztu*ci6<5MK<}tAiy,ޯqghՃ!p.G: _Z> Bp5ljغʟQ~ITf^*v轂i CN+)asۛxMٌo9/ =yEYt_]O#xqE@MOԡ))< xqҥ'3=p )0;iM!x]9P1ۉba,bվ'mү[u 3P2"Qvʈ%Jԋ*jRK K{%-1 *?Xig"2ēGȟ(OY*քPl9s2x?TNƃ>֒gZ vrgӘ~'ڀK})yt*[C)dܕѯ`џ? hعE[l=P(7}dSNmOi?OcN3"a%Amv,Aw).>#bX_+O5Bg8! T^ցM(Ҷ Eg2h0WO9I% _ej^,N]5QgZp "]-5;.'JNE|+D0H:ll}Da =KFLxu݇VV`OwPn ¡Vu 1:%U_Ptݲ k!vLSg=R=i:RdͰlڑtVl>:%H $ߟlx&J<:-~0\cQQFYa@K74ÔRzD3<"In<E=Wy&:FPUxha)*a|w-<pg_9: ;k蓨XA`;JȎmNπG^%}h3RRouV4ARv;ODS ˡ]9篾zTZڨ!`h,vКgyAI=UyB渖L㫅Qd;kp-gЪvXfX ~:ΰ>FNAZQ1'pͩE`##wJM `$9ک3Slօ 谡u"1F}8dN cj2{Z$ϣ3u>}dDi܁nqD sʬؠ_cg:K22+<3T0 Hf7P<ơ `qi;HQKKLtnjn5q@kU3RiPAܴ7H)Y VTbciNG c+P"2пRHlOY_*g G#["HѝelC@ .1u/%^IL|&fђ@Z&WSiEpq.)eğ iAr 5"uUmYQa~ሥ#ٕyw`QY$[  i2Ί/{nmX{(B<_kMx=Y`$%$3LLJd! nGwZJd_Md?Fa'ۢtlc|`oWdo'?]vefX܁n`ë`JTܵB0<ӍJ*+H" p/{m9;O +?0Ap F Ǒx9#ސxBӻ$`gG*,H?.(a?aLjv (]NLXgy4ߞ{PIc,?u;ǘ E(R=,FJ]p٫(I58FQ o&QŠNi`ֱ۰4U{֫Jτf|u&;dS>PFQffL$/0?$`s PU -J9C/?5H]N|bGAt#.0, h،w"l5Ks%ћ擔@0?MŊL£MnE9怿6g;]ːqi=i(fÀK|Vw'?:_ͿwΫ+plfGnwU3Aņ WJeHhWy0h^"̎e[Wq-j&t۵;;VK^G@H" Be?ČC-IxV$rSV HAtZ ˽6.@&YΏO7Ns(%8nݭ{\.F%=LgDz2K-1np$/l0yߎwȇM>7~J7)Gnm~E&m`Azkwg_ƥV|fo{^AиTb+Cp#i´\:˱2Q3'ޮ4JeI27&/t]g6Rs+=a#PgsVx@( g96 WOОO3OؿHCQ7yS3SǮd⹩@ˬN5ݤ I4!~C_i>WۘO/M] I `-]ml ֔ 蔋U%Gca\5V"FD,`ޞc9{ 2kL7z? ڿk`=(c;/٧ھ{4v]ۋ84%a{H'ᬕ{)ӡͷ> =]ː1<6:s,\93wEW'24yJ]4S'Zԯ։gwZǟYtUx,<_u͜1X3%^щHQta0x+Z\'|F􃦀qf-׿ޚWU4zh,L0fpʃj>lfXVZ%d;4MybK8RV@ (+Ȧ[)TUi kteVfA.F茳dwdTlXy]]%ǝ%Pj8XqP" Iii{JArfryɮ+JND(5 !GQ:5Ƕ\KLSW?'$ )fpwI&P()3悗"wHߞ̃i 9k=7P]C{ zDղ0GYÙ0e9$ؤ|~~ HthȈ'ʖS`7Y{ro+haʽ|_½ph4V e@Xhzs7Ĝ]a:ydx _aD=_@d^LPu*b~'|yRZ"hMNlP1͙1W% &4P!۳L'+D.•PN{>1e]9SH#q50p,N jBD5#_rA??wfrSIY U3GV˓ ) %OCLL, 7ؿCeOH$NatTPyHF32Xp2ָq@cߓW@ƝXBjJS-Q}IP G.<ްF#T C8 Na̿dKG*l?CN+S0AV;O\ CfU2nL+p 8K1#,Ɯ{0VZk!dd_+^-I3x*8sPAmv3 UvˡکEZNDq TARﻘ<QV5 Z44@`;NCU#Љ %A 67}ZuGRBIyDSFWL06(U#rԭ,9J9CH=-Q͈v@-zĨ˵fSl2;ZNGǨ#O"^uՀhH `tބ6hJO4*(/ YͧY+BVxMw1/#֑&tYY}Y;k=cxAcB]G-NJ(v 3?0vq|iY>)eM`Xaft`d,Jъ۶m'%6f-+^SBh "n18 ?VG?ц2=m+"<#Y:멖/CcSv^ Cʺ5 5=Fa*+sc ~lH:oƀ>}ѮBxp_Dӹ>x@،a7~0*'zxu쓖Z Xsݗ !+E`^|n>jJ謦4$%NH׆sdymR`f.-s%0jX|MF `^ҽu4D^ WqGp=GªQ܌x~n,;0PwIg$v?Q ͦNBy$fIF l5EƆuc<c]{FVlkcёFӐ#ZiL<"ϵ ihf kLR=C"$t%ɂ<<.q0Mk)l^GMdŪrP|Q0U7H QJ5l/ۃd:I@ZXfti3kۏ!&&\wL~zX dV?⸕|auP[t 1`$9աffPۖ#4ˏd.x; Z̖6%> ,4l1=  GZצ0KDQewpdb}^஡uDmǕ!dc\N"[7o;u*amAkdz0ǘLlRĮ[LMf26ѓw ErGnkMn#Zd3PB,3@IEhq4Uaܥ&+S:av0Ђ\?dHq C&5a;: 7_9lPڮ-W$14ɍ)&1?`Y](Q.g5ڮB+jyF'qT  /i$4UP_DZ0A‰O8 pTəQIG?tFP"U6DB|.HFyLTK$]&1EsX|=i :/GNqsJ/ $p4;PQkf²i)]h~3xBZ71nsKG8ߞ):Qbqd2d1G^Iǝ'pp Vf4c:+_rћ񮧚4m#HI5L'*ce 1b 02Iv2\PzΕܳlWJzI[*k$L NSo/(:?"6&LMZBߐyp"zɰ`$qԙ \ UB6-*mfpŢR 3'+q./럀5H& l:3ۿH[i\ j-O'0ȓh;Hœ`a JȸUN ŸR`ub jkei @ Xdc\$(wqņJC<3>IJqC#IFJnpLk#kc2VȐrGc*>M N9^!fmwx3 QmZQ9B`9m'­-)q# lAGG{F~nJO]rܼ|TA'38>H,`k8/(~O普>e^᭟ݾ} JOj4NW/\{ ר܌;+iLh%V1yZ \PF1bʶX6["[Ōxh\&Y^*e& W?1C@o8joM&?3VQ/z :lKsxf6)Qq_0,c` !S{2 Sj!t+ʴll[Sۀ &@Qٔu! =7WP"#22dMjffܭ< Dtp,ҨAfl)c.xA`VP <cT$5 'Q>@b [H;).Q0 h$/J*vR,c@Z@I/o vJ,8HS2_z{7UqRa׍FzH!1X)D},mu軄%겊!}GFq2)7Ќ~vPc [O|b(qʳ`8YnF5&{/pQ $=S LSoYm&b؉#pqBSp+^CC`8 }H$twti:IBK|( 2C3;\pkE\O3` n: :}` 7N4 @"Վ J(in;)˟zg B!,}໐=x FM[J?43> 8 ;!~m'uwO@lٞ!qG/imYOa|H笼(#`@uHǼ=P%#DPs7m5F.=aMM,=IpURmjH1RKmR,12Hf?xX3%~{Ì.!,ӭ n¸g*-9UJ:Hj[%NU" "Nj ==iL@씯 m nb Z0Sl"]Jk' p[0 'S1[ ˥Z$ K*’ 8L^oH/(< i%v $4EiBd#|5"v>]."% a(<t`|&^XA"\*f2lvn`*mƤG%,~s nB"kEr9{MƵ18xI76ڊ2+AB.eZR8GեB!9ޒ*1-!'K~q&3Mkuwa8}{zbEHwS881zK84QabEpQ| ;>? -zE>q6y% Ar%Jxxgё%z]CwT]ȑv۸衷jj7*3vpʩ4b# <ݢyDdןKtCPj\$XxLK]GaNWmoRGzm8 5yv4@$mw䌮6H}^u8xhNd@.o%%۬R.*Z@&pJ.K0ȳpݖc3/Wjb  ^t++^"DCL*f"Db2ADbdG"kf`v1O(f#X${HG32sQYS,#¨{ƻdFڃ.c W4O*PhI^CzeF%),bkL_5(#zF 1Lycz,FxY||2[n|!N b[:d*A >i]0$5.ceG,˸ ޑrK<mE.5X"̿؏*@2GU5J#l V.P"e"F$ydl0pn8 >3 fD& 5G]+D'Mu;$a`'1#~v4qyq 2^֋ 3 8YE7ƹ.cRIo(']h〧D68[ E0GaIG=ϡw.Je/sq;* A%Q;ؗ@SPz|9l.RɄݩC0eN Q44-6( @;}Sfc;}) (-(]$;Z{+]\B۸̹x cd®kP@k~-<ը?IOOeIYu?dup*qA l(]b!ʓTXu&2J.qpT\ xPX 0րISDhQ d@gs~<諚;${p9)w`9q+X&%by Wⵂ'|6ч~{;k<ڿ%aO;CZ?]t#z])m젪`4Ixy_@dzi O4`$\r7@VZ*nɝQua{9Nћ yT 2 (!Hp a&F Q ~WA}?P#'͜س9NOp*/~nW3)>-tUM)B=M,!bS$5 ^Lj$ HRa(ڪv;#<9QUQ1+y:\莁hL١Rι#[ QuKW9]Cg`O%u]r4cx1bc*\aCk]ͻ$<"g*_3Uh鰚D༥NbTı$B82ª]S1mcpFT$G >x38ժs}|"WJ Jw8$y$:= ;5bTW \R1ȪWyZj.c,>╄"x3oU k09~;s\M[)RrZ.]#TQ;"+h$0C-#ath!T[`skn] ȷ &5F)pef('42e9-7^Ú?lEYRnER4HH~ k !Z4LNʵvkŘ}lU R^#uό#( ՁaW\$Ul} "})pTAjLy쏕IU.G'_6G#6n^Ւ + d!ٔ >Ibp…Lx@tb8 a$[EZ-j3-p@+%sp"/eVt{dnȖJMu,d#剦 T-|HTH uYw e<ހ,;H /rU>یC=|=P8 fqP<sq4[Vw;IʽTT]jft>7[S16[o)·QFzn[{v1ӌC \<"PK{a59'#a79~ZBIKknMա'LMhY2̶2gEQf?|ǻEb~#0zyĘFYƞpO= v!i! D0TwGHb>_2_FABԍKy=SHΉdKK,Z`K@4&M(UqvGp\/K9zy}#.ct7.,IsW*[0kLq=uKKRD |8]XV#|#e}[TPxK1d'.(;>=,W`)Cfo=z⮳6m̥$3kkS,ZewEq7:b2<56{ ;t_TzlA˟,MSzS# Ѡsj[O׼ŪΨΉXljޅoyær /{zpI3ZS&JB`Ox+qI>L-JNJ8Niu&V%&/sO_1`36C'<< {n;(%+R8ci¤0QA`s q |(pxx y%9Cc-QURNܛ"q078 Yc Paz+SBUq(sRԎSє%㡺ةEBGTV;[a ځYBBvK{j1Nz3دpuN\_fHsA0X.GeֳK- Y2+MXI⯸ZzP+ 'O9̑xi܇$e BBA69Xs>OɆx$wYy ՐgqxcEU,wVRqdՃEMK'%bo0~PjT!;X:-|}@8Tҏ2؎z+e4:qUo/N2؝)~sx'Ucqk sIԖ !2~CIV`P#m焿_*Po=m-qm#2˹5vi>{fd!xA_ EA"L l!)-!- cGzniw8ev A"Yd#Iœ?*WZWmho(v0,+f34lBO7nS$ פIr G{4HX h(-m8XUe^ G7 k1B 5I*q!QU&"yƜ(|8 [13Zt`VlÀD9VPdSЈ1&p]!5koe3qEoӉtg: K5blOo-3Se|TqOoڨm6 bvsV "b8m̷&ywzgͱD:5`Y@S!!^p` jҼPtkqĢLFfJ66زx2e C',hZu5Y.9f58{[?̒pKA>G0w*vZcjP;#7 UÄSff d@ tDMK*IL4#YeHi'R+6?ST6W|q&:sHʀ j`]X:dY)8ۉ^sx2sX:֙Hxn^5ErK3IXtc K&x!i›鰋D1E@K KU `s̖(ҽz;f|68 kGkKx.7c8kt[3kLW1@8ǃ_q1+7$֑)p }Zw#LmF6ޜSX_,L63RʴW;$|xBEG^ #y ূKx\ C޾SM2^H!DvNO`[%f_ķ["ߌ\ȴ5Rˑ]\\"L7_ \)|AR/hz^6aÈh??X@)ʲh9 ;R͆[P«%q 1p̿zEPA܌b?%qXŁc),=UvVXsve y$!`;:1@eB„u5KN(gDsC:_w*XPIdTnxAn=C,0u=#s^9iDh!O+R/~T~yRv”Wt?ӱ˨2|e?4< 05 YL(Gqww[Xk=Do%L$ r^Dm'=$i jN $Gh_FQi!+y-Ne'c܇eDZ-rKZ*d51H!vqB,rH8Lq3b&QBY/jCBv*F[ "H ; {[ҏ$oSyA /5P Mpn"u-M03RC(RU*7rFv`]X "^x4thϚpFhRCp"ڐO *4YPqKS)\'s~C}XP3'NF^K`u$>9?- !|b]P5E |I#Չ "F=Jl:%wcJYps愃U &/.ŕH9y[L@;J?ˮb^֕}JS1vDBFf߁BR7X8~D~dN$,M1zU좖X;[gF\=#f"K[t=操dZ|3?;dD|8A~@k!&̈́m ,)a[vΔJY͐1Vt=">t jL㎂RD8O%x$%!KSB)ndݤ߫K%3Kd,KCU.n NgʗfXGS*sSupjM7isOc{`YF^eb28uj?̈́(jC,HZRC:$Ry Y+bĨ53>BB5[\.[!-@X]"@b]N&͗1so`4au# w&,g>*?R!B8rҪIN&@1ߠ &N(<2kF 1&@ d'b(MA'+] } DS2R QL_3C$k 2 6G1ChaG"K6y@8ЏQ %;e(cC $pSٱhܼdNI}l92lQlnf̠FO1:М!`Ljqy𮇄S&?fM̏ʎ;MhH5&M**8a@Je ':҇咬ľ`b?~&s<N{#!juHÙٲeV*yC(G+NaN7dZHdZ8|§aÞ?`C`vtfCi~)M6ƇXl|0,/dj6}p㝜Y 1U.@4q4ME0Mе C*V Ew FQ!"DEjO`$#w$$a3!Lh8xhx M9X`2Yep w pc)P\@NJlASPOs`ٝ#`@6RϜ xt$:=ťy nY߰NbWOXͭZsՠ7Yb |p02,i~ ]y _F^R#̛'/"k`D\Y-MUQ }c`XeE;ʮeAX2ZX((Rn b 6=t4SY 5?8fh@N@14΁z'!?&qbTN35*K.&P"VD)lF\5&(i:n=ǯ\eչ'sT,5sKMljX5Ta-gIk5ʦP+k5i߱7dل{ٶ_+?7X5幫r(Ţ;vKF\3ЬvbWfͰ?@YQԼSR1iT7Zl u*!{5> 51XR#e !Ɇ{QiйGC7 :uFDkaZ}lyqa"IX,Zj9-`SLKKr p 6#W+R`r-uǮ HjIDXܙci0j,. ggr x:Rgf)B,K0e8}'9IL`RKgxMfVUXfY LVT} $ix[TP QĿV/ԉUSA)Vb<"S#xC) oT&rw3Am'R5}}ѿ+p 晆} )j *zx f'BGbWMI[ۙa<>%rDQ|Юăx*?~N3p{=D2`>`Y$v?4P$N !)V1=cPUb1dX5E ɋ)*sT][#tϰ餘Cr(X%=3})f[*%b: C\nޘλ fwNv!h:/k1hy7.>r;IeЀsO5ƙ6fa.&whԃ!Nu;ȡ5cEUJt*,nO4Mq6@SEh ]@#AXjZ$Bsq 76rZʟ|{-H; c[B-WxSNPuYÞ7 [&WH-DS!\Z$/HJ Pӳ}:{㌭Acc}›Uvm o׃Hp{a\Odv:+XPI'h!Z 3lS#uOd")܌[R`32l73{قR`׎()E ;P%\ǰ)Z5`E ~82q]e̞iS SH8 Ɏ-QmXۭTN[qG_c~)~Ya\|s~lxGtIhg@5~eb¤Rf}dX%Iϖ| 5|<$^[=3\n  5scl0 kRA\{ SH)86Q| ojAC5u07kO.쯃(3GԌh,v}nYq;HLџ]ߢH0D_(A0jE >f{ y0g۬ӅQ5ML}c㷏vnFDd"O! YPY34@s @ә;UiA^ޭh=-/VK[xx.xɐn څ Z|؇ OLZSSh\1`Ur{o7vu/Jije:2fq}Dgox&"޺z-~!%lKb4&-9,][zg~y

    Ҙ̠'pk;M!ΤRKu葐D,Sn>켄-X$~P$~ڈ̙` .t-Y]YAhtKg(fn ت|Ssc)%2Ah~"Y_wHUܦ?^Aku+WӍiF O1KWt攽AMnH8: Sl˴W(R@7oт|V52bawX y ήrk嗙Y׌VpxwsVnh'q'. tBi8S_J4{qӔgk|)Ou1Z7 4(";Ni( d}zcWuxƯ5BY[O|p|ζ!O-FFN$P{+bܳQs35n!E8C:}k>oM6ڲe($_z!z\eSh !SPK24PKy.F7angular-1.3.9/docs/components/lunr.js-0.4.2/lunr.min.js[[sF~_\*B 1ٗ!Ҧ\NM23yiD6ŎA4hJVoݩ}KsuOETn:VZoWW[~JYDTYVG|5,E"&Jcuo? D*TL;m\3Aqo`Y6B-ZlKq~>07QnreZMʴh@dUQU$]kxl}5jQ|~;GI`CïW.Q>㳵O.aa;I-?ѹarC:l[KsYv[ZRl,O7TLQѺxŶ<])MUԈZlCzEk>Tq7(U8@n`Cs&x8xV8a뢢LPe@Ҫ qҤĎ`{o r}0 <]'t"c9&ɱ>xًl߾("? G:S|4b}wr8o02:ț=-!Mg˟(鱾=M+*7j͔Y[} ŋi3T(S\&&݋sdݔ4h1)yv[Xv#57.bU?T3Hl8 uq_I]2Wf(hj2*dU9j+!W$19[WY_5v`NȖ ?>O I%#&'W\Lᥬ8ȵ, ĠAJ)]43m\Pc>Hc(C&DI#=tG4Dxqg.:tpg^M`Xo&smۣ37$T(P4F ˠ>r}xlY|)ȃ;!ə=}=,ofr1GEf_re8K3C6e f6SM^Uĭ_FX/kx*KὝj ^Z@ +PwUQp'<@ *B ddwa3h?y]ͯ!J/{ӗgZSɄFm}#/G YfZwi=]5醞kB gOӲFJݾiPLj$[wRj\H1 kQP&WIs'=ޑlRrVEsD#J#ȦyĬꪾ^fxg@&H!1DM$& p֬j.c5#RQF vj-3m?,e/|<]fމFv96únLH9oiƸ'mR+ ח3&_[%=1)2qHwJ=n,xGo q]GU ͍4R6kKE Mr2q8Vі-s` }o#S"N&5M܁k l8Mp>Y;Fc4oSɼ\bXuأg385~TTs9qE{\qO85NJf2t[4M-~pwq8'4CyQ HЎIJ4 ?`4Oa!cH)wҼg<0׳D]hD hk |HpbefM~,TY O (0@/X<6yq0NnR*fcbd_iN{tޯLW<ݤp ߸.Vz]0sLOq)=palI8B ɯ>m2hV&97z1g[}xD{s0fƯF}K7"XIEoh]IU 11`\ƛ/S,2h`=ab1RQsp H$%rI+[;apcՠ}|0z#BGRRg_f4cs[ XcqZna@ h|:@K#|tcAl-!ҒS'D em2'jkhWh?dU(k %NXVw3hxt5!}a hE+mZ_K``]j,pvKQw[Z'W-%<:b'Iliu2ؾ w5T;gFX;FgcJp$#6mǙ3Xl,V:fT ¾ǭswGk{GwJf]~۠#t lOr7`ɭ6sڻm>E 㰏EBZ5B₎Qo<5|(YEUdU)'DФ;z|)}҄9GQmK@υ~h*^к %>Ǝ=?"]kEX"+^ Y'_)_WB?H\ OrI6!#%"5M S _?%twk75,3D+OiE+ULa"4\q̅He٤Dz5N00" YY#e1˜I+~K2WI+xZֱ_YJx&(s%#˅rn1ul&K<|ϒm':+Zh?Z X;p㙱:1xkuتV8Zp5d_vyO̮etos6ݩA+;pqF8/ڒ$ NY"*4YGNI*-N{-CtLLF=h~#uEAv+Tlg`ȟmmd& pLհ馚$7TbwhLrvl\ &p9 $bwctX,R}D[Mz΀){=\\HzE6DŽ geNi;>Qo@,Ӷh[yR;>shZ}c!޼MĿY:QuЇzŧhÄjLl.PK^; 7PKy.F5angular-1.3.9/docs/components/lunr.js-0.4.2/server.jsT0+H+;*x鲭J=QU= zA'UMjy~3u>u@dqLv|.S*Q<ԑ @l/R&[l}Uh.;ɻ+ذ/~3̦iQyN Im>"5n.OcyOT,~"ȐH):~ VO,Oڭ`I\ohW5's(}TS`(:|bc";2|i#{]n4i۞K0?K"Ns3Gױ4  #K/dT6ܬ;GPK.GS9PK y.F+angular-1.3.9/docs/components/marked-0.3.2/PKy.F3angular-1.3.9/docs/components/marked-0.3.2/index.jsO)IK(/*)VU(J-,,JPLM,NMQ״PK;N̻,*PK y.F/angular-1.3.9/docs/components/marked-0.3.2/lib/PKy.F8angular-1.3.9/docs/components/marked-0.3.2/lib/marked.js][wG~(9&HʲIvv&{OyiIDTnu))aO"uA(ЭAwUZɦФq|UZYrV$17Y1/j濲"7hzݳc|YN%ǡ>&A9'_Ux4: sL{9Lo*D^Vީݳiv[`W,9Iw^,s>,@Ҭ`fs90 ~ 8fX{v}j3Y, &fb8<'~2~Jdq~2JΚLl^j&$2`8Vo 7UzI=*{/R({ܻ'3HVA\8 ~2xbG̫iJ$@%"[-I t.:PJGz$(YRCxpx)|e'?Ql:`\4c-^hu1Ա[x.֮6 K@tV A'K7զe~)bSn&"ߤ1=M56 v&dSW͛tSoƛiS6E)VӥY|L EӪzY#Nwj>hKͯ<=ݼla/UX;n==sGpcGlBOt_Nf{T{m}!-^ ա@;7Y^,8AҶrE?dL5jn==a5/;GXW뚮Uk2nN1 ӕ->X(~nG|4٢̄>~e꣱ }*+!V2~& ;5 AOj>!{͏Y5[N9 >5ne19pSsbݧ7D4Zc(@R=)p=KxuV*<`?u^r:,h;\jcJzG#o|od"s.zlc8[_V3pjU1(j]κv&gSMG(SSVM-ҟ 4'ϭQYzܩkC-U٤R%6siMjsf|#_ )cs&Kיb`Kc(m̳'g "eJ~?59֯Gw҆R >O@n. LU9 *ʂ;+uo j0yM5Џ.oePg+[D>!ea鏴az"rW݁t1̝@rcs7l@ Ee*VPJX;|͉!}AZC4&Uw}oʗ[ٚʖqYvXʰVFD:=ɻg2G< 0Hp_+ųNk<ۏ8ṰܾMaeULK3@{+,"v0iYW7Yɺ(a} Y0G}`*_O'C:[)ja-7e"Z[CvyH|ƅ. uYU$,GF_LW[tkY˦džPᢗlJCWdqt2cq(g\4 _7W9 Eՙ:ÙO U6Gwz-O6XD+3ήo3;ABu$PKQ,MZV-'bH\Ċkѳ ҍW( ?)¼A"HXVHGG^țɛ5 n3d#eКq@j4 ߁w u<+%72:s䁠DX̌3/gSұ=f McƐ ,B9ML:%0A'1AMTlG I5\>"VJ!C@T5=m"%h ܟa.qzuo2:/'5tcҷe :' =7 >ޕ;',-l]dUtWqXC=A&+NaLĹpNmB.r1jli|IGA΂skqB$$8P - LQ;pOψٰMDd{y $ѓIÈzHa+yj>]p}. RWT&:hPrRWvsaE/4ܞݽo8p-1ΜOϕR-eiuD ޔs\-[3x搮qKt4qDŽ dz-b-cj+pϣ3̅Wi &Ixh#r@% N8l~'+d~Vu6ks7"&J>[u#M+>ذSٻ{q[_szz1#إp1?h\8|Zx׳TT0)e_qgtVfVIdSLd׾ Gp,4o]ᶘ \{CΊ]ysG]VB.7$u Wᨛ<^ Euɡ' 3(~9gKr*\Mj?d|Vf0gRsS S nŽ3T!0O3T <>b [B`{"+ Q 4#rݸZD ^ E|2ټ1{|C^Oʮ㗬[xrp̹l眨 [wvH M0.6IJ(!Qm (/Ö _^6v>*ETP/Vmki 0\DU*T' zgZ`8,;QaZ G}I\"et7$܊VH@ztRUfF+=K؎W!0w^UZ]bI{"(-Iޡ|$ń$\VoEV_êm9 mNQ¤Nr& $5ϐp-OPp~Ng߷iw%4`a#8k`0wQw8Pҵg,9s^[wcOuG1Kp,g#-Z'r۶1JkEmC22`Cx*T+*,j-!xo(XjNr H)Τ:i: oXմ+`g~?kEVYL :Qdq]yڏDf[ԒH.:}|wlj;@9Qr#>)K->z-N$a)Z)ѡRqq"WYdDU_=\X=XT^\E<\;R*nEv BxlD?:J9ߨ kp6 vJgZ~me؅ ݭvS#­@~ TtFy5قh+57PՋiWEl=ms`5`靡Tݍw!;fD2{T;vIMnwb7kyBtdM5k۰ 6nrJ9mȈ++hh$S,,R˘ą%?{7XHf ϫ7l*X.Aȳ=d=J( +6Eݮ\7I XAi5{ꇶG[yrw=w.s_kQyfӳo{1G[RXgW1s4ڇLPwB>c^=mUl1.j.l7-Ő/uKP2q+ޡnV~d%rݢp#_:Xfj̗KEcka0Sϑp% H/<Y.,@H~EhKMh.yHM>dgxo:P<ؠOM8(aӍfַ0R^ CKG#y2*InZ &k(l?լ.S/${^zMf~чd;eϕ:;OH* kmĪl 5gO &qӢt r= :WSفg`G%_BZ"9<bNKQphqQբ X9A 睺}c})4THP6Od@h[[-b& x?k[;kM{K:/RVU˪;wuSɣ:A(뎅A^ < #OR,('z~b,䊗*l=>?~-kLdcOw>TGj̻F{Baˈ[dЎ Y`fk™ _Qy2+90?^N?FCߕk`mgraQz! Ń!+ I2_p򱱱D.8Lb[`W7B¸hT~P XBtd=hwN*fk4 ䷌`GDT7 qmY<jZEzi_Cj&VMEdEǥ|P@ ̠}n ;fw4$8uijռ; 6Z$zX]9liGԐI׸sO塏'jdNp{8&έ~-ESnDvdđ:/7H _aBOت>P{|E/! {fR'i!$lG%e!HUy,wqRh!ݹ50~W!~r_ysYwkg1rH8;+:Amn}JW7-Cgbړzb>֝tYTN i"Cc"O;7v yWHln4j1C|>:OG!8xgB'R?x(ixk'ڷN벥KWe{>|OBWOW q3{EVx=Sxf´Q,]ˣҵx; U-:n9r&z8 >ɱҋ2{/c-Mn6LAʟcUg lq+oSS zvhuL2ރCIdB$#}GpLS(Y$>[ϊ6J>C=DrZ9Hg>A /vobأytZI h~x<id 'ƯI%Qfiӻ{FeWDj7, ,1Gԏ08͛11#BhEZZ(i*}Ntwfuxvx0D̵D}(@"1(Ԫ~Ee B8MUYۏUGe mG7JuINy:ə" n`{JY`/rZ8T{%1š~j6ɧ(֎m¡حT HXTzs1$hY Z֕c'/]ɾ2fW'se-!TDWx=R(I<)N8@D4,%]<+}-mz{7āG+NG-%eZկ#1z)(BxCb6qdq/6Nu!DmZ8pձ -KWqʶhY JGI8 x7/r8E%AXrGi4N%$uWdBΩxrNᝃ(+::"ڠa1ݫܶ"!Z1+'-Cғ" Yi޳ eVq0D=[* 1P>Ǵy5JQ]<1EM5nR湸Q!j5L,ˡL#0KLK0\F @+Ύc}Z*~x8'~1Xcqj vChoG)k;b9F]ٓ{PK3N @mPK y.F7angular-1.3.9/docs/components/open-sans-fontface-1.0.4/PKy.F@angular-1.3.9/docs/components/open-sans-fontface-1.0.4/README.md1 0.iwAMYm$oRxܻw 4WLjǪT!ܵ<<RhVV *1_&@"%BFHXaO,w7 r>i0!jCְQ7{~t6G#UO}*PK@hPKy.FAangular-1.3.9/docs/components/open-sans-fontface-1.0.4/bower.jsonUPKK1W=.6[SRAAo"%Nwc̶ͣe&c{$DB59qPkB^+ E߁0A.D^U&dChN\ɂS]]6MgVRmc= مɇhC`#qӕqn &5̍g٠#6OMӼS ĚUQ#gl!hor ^b5!ױ=y,50طNT6PtH>!9뺑1R KKh̶=e<iK~PKPK y.F=angular-1.3.9/docs/components/open-sans-fontface-1.0.4/fonts/PK y.FBangular-1.3.9/docs/components/open-sans-fontface-1.0.4/fonts/Bold/PKy.FSangular-1.3.9/docs/components/open-sans-fontface-1.0.4/fonts/Bold/OpenSans-Bold.eot̽y`TE7\u-kl$Y$4IbA   "K@E6#"" " "2zo"2: n8(BrN$2~'{N:,ggXY6)pv@4 ~^b>Eę^6ON6cSt&y>~l.:>mԯu_g|.p90߀C{/0 x?}9kx?M9ߠNa#%[g?ɳ'{c=xL^L/NS0;1x1ڤ)7L\0vbƳYK3#>}O253(w1ux?s^xStux%5wK~A K7S1~3q>=>97wGr3~Ƒ9oލS}y=?EQP_;~-ya2^Vw7c Ϛp>ahbX5;IC UÆQ2kbffUЂkĈv kYoz͚h6jbsyX`⬅lT<9x e,q6葞%1!^lyyy>y:]B݂^vfwT7 ;β/i'[J6y|ZC^#)wwqm7+d>}þc?O5W#5H_,9saeiΩ,F*owO;g]6|" }<''r{Ht-|YAEs =u <<;JKsWYqv:b0k0yx"/Ʒɋ8D^knxҥ.3m6Ƴ.RTI08|XqߑW3573u7zTcO2޴O>?CZI ^3EVW\?f)M*HǤig˲llݠ;{I+gX[P_e|}A_7__y}&˟yNYR9+1˙U5(kB֔7?eIVۂ1mcLd1?0&21{mS`2n؂110W26+4.2&G1Ջ11lfy[͕]{{ }~^4}I?N7jGM}~;>yُ>u6lYYij~쟟g{>>{Ϯlg>YςYԟxf̙3#Tw&L♸;X*[5ufd$ Mp\E5?WX=X"<Žrd>Nf9,21{ o PŬYV[ƮbzYj֟]Y: n`6uF* lhVưlcA^&`ewaƶl{=͞aϲ]l73{=T=f{>";^f}al._nbO<)_\,@'g7%Ty-u|,$F\b_΋+;y!8O^nek*s V;U+QYvd\Pshk]T^5H W^=_ʅӓ}j~Ϙ"U)jO=& jҾWMcczEPw;TX ԧZtE@7yr>UɫPuSMы1iĻ*0=Mb }=` _~q Owƭ}| η.[.[eUjj)Iwy2O\2Kbl"c-0w2rl_i~] ].۷ui$4ziXM^8= { mgB_ub*YTipﳃ#uUfOgTՆ篞/}Oo2%]Wh]PD&r84R׃IAX2W B\kxUk@e'Ê*bL ,wAߑw6eJK֘^|{,j{X(Um0RU;]Z+ cX}'̬D+KFsb ^i^%$:M./gZp 坋˺t $y<_^4f为: ^X_]S[5lMVv̝ƥi\V\"Z"oaPkP,4q\L7[ͽz4mQ7H() *׳PhAi9ޠMHv9U lBI)dq%%%\ LkIG ye+c$%=,VaQlǮq Ԯ{y0u BMR-=x4ӣbcKE}OLR,^x{=qfG}d-\3-zuQ=ў.K2 tjTZRYv[,+" 4rSCV~X~.%áWag^]>}D| m^7;agjR@ut95$NDM򀨱57T$dv3"K4k^sad!Sl>ީnf:sVIjfxUSbct-+ z|Gbdkuw$ow-풗_{_4=5k/ W}쿒ٿ/GO9ZI|qMayƷƓ;vˤfb0bz G7N* yxMBI! t.lMK/ 49vr( v&5Lv-rw9R CdXg*yUrR@r#i|sOJFNOs)Tҥ̝,)풝evg^~*XT2aBIpW4+?_~?W44^Z~y%MӢN0Uߙ?{}/c]J14T.sxZrTjLtq媕)mgR![$ M 9 njz[yok6L@~3+\$RvMma1v%Z+ˎZݖީeo)par{j3MnizkWi|+8%xjñFp," N?\1S>÷?*+qܮVT-y5gK=*&;|n}OjLC4ϩS o VI8ܘBI \hrԸ`xQ `i>\j+[`8s %A ȞL3ԿC eN$#le?Kd2 @.('9`l3KVna!tDk1N$~7p|쁺s+nLzZ+G͉C Oev}4q1> wIc;n+?x}.<䯷Џ(:8_tcD_gZm:OA`4F j"LZB4 ']S@+27q 5$DVQ ǑX.Ќog s~ӁKy]?9V5.vHvJ$ `o\8ٛHHD2IUv )Dw]L^G, { ] &hP}NՄF1ڲeXlì}e~HNs>}{ꍃ*,D46-U,d٢Nl .DJXrT~>Eyj~Pi~gx$o}{s /4qgE:"v3 9O ζk3qȍS-l}rEwܸa⾲K-i5{Z1b1l q;rC P#7'hC45)nǺ.$RbhVؿNW2YNRi~ i~GK0*`:%)\N)c>Pecy tBw@._3ްzmz[=ݦoNI?}e7cRSL\:vbzGŐ (}L2Vf%`[$9ZLG*]K^ iIZW i@ 3 $,c9izn<͐ Y"R̄,I&$ 'U hյKY7w镛+֘^ I:>kHMk =/FIH*Vd]ctq B^浺$I}*anJ7Q ޸ o@i`b!Y;U0ĵqÃj\˒4FI`qE\aeгtiqrg# Cb~P~3AiS'Gܩ-) # (wÆg;= >֌9Φ?׷\Ve)úk,iKOlRǂe>@;]] 34 HHRi0cHr1va4m6Ug`%\4i4cgY(N])Yd'tltx{Oӑ#8^Pb)>:5/p<| |-ɱ'ICsǃu؁ X?GMw1[ETԎgos_C տ7guΫסgyŤ#~U쮐84l&@L g2襙470ܔ! JI>NoN /!;fX8jLe=/d6rʼn'-4۬;w>Z^A/U~q3OiXm܏{?SEQ(5ZZq_C;sL,PӐ*1XtC]𯜻>EiooRj⾖o;Bp_x^ŭ54 pdLspsnBlדIPMvrPKMM9 a4'դZlojͱl{n'Zb{bN3;9 z򧿋{RR\6ccFOVF|O%>9dK򦤶uh4@PpT*`rETˏpEIyR>?ϋRd.p}s?HSϋ?-U̝[@No-?O6]وs ]$=Zyۄj$rHaD_x R/?OOM?I M(db',g2nbh;gDU"J/dpYC۸阄ߪ}ۀ4Fl!fL \ 8,ޡR0l1M5JjSq{htvz 0v!zja |h gAA.iʃO?/i Y$}GF}Mqق0" l#.Lk#oЁ ?'s=}߀VVɪ4"+X6n{_C|mV55PF\<¢S@'b"O{gU}·( )E0TT o7++/޻}FZ!5CݕE!(/L9?nmՓ/fX6^zf.5)}x};W.R(5 3#6W$8 4WDXE܊QE.HQ\"BqKTS`-fZm8j;D3[8N>lqq3;Wǎ\8~If隇wo?[\ SO=uⷺk={Obxa2-Gja gX2v L_i;y젛{C-hEhwr}r |)Xڎ@I(Zhfɱrn찠PTN'!KC!v'`$1TiSxy7}p /qƢ٦ SKE ߾/O=u6?$ /tBN TL{NaOHGTzJpք[- \H+N3-@ *Dv³Yx \[n4|*'o-8q)tPnc|xZ"s&a@QE*+ I :# K~ x;$r傇9/6dgb¬1U9&b::7ʣE M9xl{;1cܛ$K PؿDx2?F^tL,tX6w"7<ة'q@Y,܈A|[aSO#H W/(DhxV#aŖsE\VW^1z\Ĉыf(.\ z}81;NhZ63$@[;((!eL ā LXȸێsko'jz#7bnj={[x VJQM/0C rL.%CWĭm_,}CNܮ7㉗^lf!;߭_R_VuǮgޱ)  vsSf ;w'ݕcʰ``.G"09^0)Ɂ ֞4+b=d$:Nab&VトE *MSűOx'>x댣2]!'2zo{=gƱ.n;r4FxX^yD<ܺ58bSR@5mC$V ꕍݵ嫢.ڴ^oSiM1qOGw㞹d]S3GQ:i 8 zD Md['=DPA"ƕRͱ)iz50o mUE`\u_WfU˺a>pؕKn8ӵzt/iؾ넜uK[i#䝈C[D̍PmL"˄v0 QꆏKX3 rp23{&*;x} бk{ w_4}ѷWK/Iibܛ!;þ,i0C̐eQ,*@idHV-\k(x=m$x7G૥,]Q).0)MfF Db-0N+``c3{51e|Ӫ&b_f>c_F01/01\z$! X$l,vyc`W1*&8ke\j&_Nͽj1z>VvPa0l8>Y)c4^A"p6s [x6noQBPAGO4r/X1/vҐJ~ ;,J=I8X qi?I 0n&[E/c$'#gL*p`d9'+4fM2"#ˋlG@XꕳC;VtUׯX/gxv9O?YxUy30v9hi)}SP9F b[KM)(% Uļ!o  J =9DZf$r1lg@$cp'#l0̰ '#p/r3,i@X f->юFez!>BrZ (#V}^{˼~Xʙʷ!pk7q3[ieii+aÊ]=|**ލ+JV_9f̺ MzsT3ZXõ7I"ݑ|6G!mY8'Tq 'sKrd]3 4y![U9KiEggo\_/__12Mкx@VYk9;Kj"kx&8<I"u| < Y1 shثP TH;ۙhA7jVNY[DEY/}~Թ3W<=c={@A{ ɎsȢDXlR(X 5 g;v^nYn .>\`;1/E"]+J&8{A~jq5ɾig;\bq+IT%9җC!?XqT0CտǿI;o}<}vmN>cMV7OSK7;v=J|oU^-GȀ&^56rfXҗf Dr9,4e㐋O v ԢRM"ÃB^% l- R@Sh @e*]e Oy"Ŗ<]S/M^1~4yk2 nXv'17'f϶)zܻJ0[ErF́SBfE 8O@碀Մ -C@>I# I½6nczOf(C48XQbNR`յю0 >hѤƴ tz90#@w7fFOF0F*W@$QEZm hq A|l >#p\^&#:*<{-i&/}b|BOwn?bbE6-ǔ䵯K^\}Ð9(|bB J aAr˥#O 6 7 F^v8!5`C("KN3vŸJkIs%n'bBt`yu#GSz=tÊOSV2vfi.y=^N[_3l)">u10L-q)R0nCv5].T>J{c%`?Ўp8%!V'@RrPQTT<>ԡ܆X:T0pPȑa䧫 л ;Tkd"?NަQ:z\?%*ҭ"!!x:XJ{7bNR<)N= PɂWȾv`bW2>Mw fRݓ;[+ůCƱ :mޔHC~k2o>?! $({#R(d'W"}:z(}N_U- kE۔j8[Ii]ڏrs~)Y!أ%#(.ީLj.?,xDGXXC3z^}h^+b['b-J͠PPAp'O׬#^=U -}N-@!:J-+ >ԀA{s۸Vѹ"$%Ժ`'X% Y E(bijGș\`н}腡\C5"HoD7t" 0aR⾈6dk~׫cϝ]7欩gM:ē{MoYʟf~dW_oSVᳵ巟2}ј1⣹e͠=b( 2v& ^d3Z]پxjkvZs:3QlďZGh 6틛;mk;_EYo0̠vGf6$['6xnsHC - .'s2˱W)$ړ!$:rq"]d@F$Ud /O~YTK%;-RǕo^e:|ДnwDw3{Fcxwad [&¬ Dp—h/aI%cjsj[܅ ڊ}Wz=C=u~kTU#Q5KAlXx #$ISpS{VnO_%Mkw/o_Xp{)YWo0bZxςfݝu8#KլGQES?SާguKF>~};?ϫaֵ^ո Ԏ: rqaqOcxH`#&G*k !d#kF$R8#t%W1!YbDJG&IŚFm8W $h4$ITFCR vBG?,րH+ӗ4h(ez5mPd#y<YP&*,t31^#K}bio=g2eܑROWM {cܴ|Sr] Ⲱ.=kS$S_^s8OG7Liݺ^mKZW;?6EMc%Qc̍8ׯ7(2ПΝ:V}b"F[ͼ:4_hJ4_^_RޝDW_1>eQ*_q--pRr3qr\bn!@Ta247pؤ`0L6*`).) 9I0Hx1{JէJĿ@H9J V6ޢU[y%I^V.OW0%_074 *mJ8`ըRMۚj5)P/NT*IJ;& xTۀ"`*JQZˡʼnlEF Tbe0R*H;]]?D+'ݴ#nXS4E ~HXqa 3UX%LzFS5{9_C|)t?tXSNz_ 1Fn,E qZ"-hW۵ɁFDAdH1p}z)V⚬H60 n4 *aa#^0=U YDKW1" c`F :b=~yEhD;~M TSd;\nS)T=@X)?r3@fGی#YV5 >BG'v9:kwU[ t}.]0,~KЮ;A;@"d;.EM-#/"vhc|umG%E?$Frm_U$OATnJ8dEEI#g  n$Wy*4O bӕayMH{yFiDk5sM?63Eܼ=u#2D +ovWʖ}x'JKEM4. ~8.AGZ:?}ˠx ~..v1KEGx?{?kz1#/wݿyޡ:Ct^{bqj[+Vy'BA"68 mUd' $rS6GႻy0_d>i0J%Q!{#vb[NuW?4>ե$q=nRi#v .YJ@wW$C )RȷKN"qE@1H8EgpG32up _{3v<,ΆzXs{%xϰ&d#|%ds l|gc!Yk( l͎57dS6џx_zN G]$DDZ*hwT5ȨrW71nbJ5LB9Du$m@tm!lԆqdN]} l*jD)(y {=[o[*{{ey٫vd=JE+b:~Åd^P\$q_G:Pb<㩌[1k9ȇ[N=LaIbq"Wt} ~ vux6k1>;:Ȣ1|9$C)K|E\_׽nn|Qy֏ ţ`?"iqpR6s َzejh- #Q'B qYE_߼xQPi7D?K!㗌(- '3q:k ɤ{17,x*ONRk3&= 0fk|nn_AjN;QG5$6v=WV72  A9]v+"i>@y){aOE;fa9 N5//rq%;8\ {rW`-gu ۃK)|q_h_ %gOg6W\O4 $lOr?_- y&o3-oo(l5HNhQF R‹"t[CO4n E%D^=wr@OT%/M7eCr.$d ~= B砜W ֦/vO)Щ(Q^CVGwoعÛ =3u!@Y ()_†w!(Nꊡ nɎl#!ZdKE k2% vBeFlNKTs8`DBO|H#97ME ^džE 9.,]V%:yEN]bzd=F0 --C72-&SU(;B詌R'5$hB1+pz yQb{w2Dp5E?&ԆW3hj"<\{AU^kiAF31\U!S1_،.F\p` G{&{EKƋR7H â 3 g^u_Ac!/ 323Š3LVmҽ M1tQ8C7,K)DSM-9+Y/Mg=HWvM_qac;zOZ58G2+mZ(#.2,"*!Y₨9S&uTt {iZTLsFi]jLYhbgR#YTh_H0c*Ĵ4A,䠝$ ǏT_Q}"#wݔmBfMf|ԚWN3xYW^I׎LFϹuQ.^frMq Su,( i!|' J'UZ,?IDU-HԻFrcIɥ,7'@Q)^;BҏW<7)Йvoo^K\V~* 2;6{CRJap\N=2@>\XEWKĀb@SNeXA.w9;oޝn 2WܹcWZ#w唋V~ìom̈32%OﯿVԥKRD[rӒmxw]_a#B t.^'] Fj9GF{oNпnG;hGL"3+& ̋*}C4JBW)Ԧq ݓW>"?|"l[ƽd"b1(>=ٴ |5ȠZ_eπFu(D2n)=_5+gXFiOz[dꏶe6㪣ǤU?]@ixȴpށQYS3%='Z:4YDDI,XX ʲrYeEʺ97)[.IL2o=9ϱЏW"y T}ЁRw|2DK*(6C~Pz0t*RG ҃SFKIWE6ڂTo}d}:-OsvN[N{v7nFޭF-)m)R $Ee <!VvZ|# D45UnZ6C7Qjd\jHoIAH0? R)E#f5܉𝒏<4xXZ[l·Q%<+2bL?}AMZOphٕmCKQEgmoJ 9٣=ځOuV[ğ,W`S8IT|l9b|ݺ Bs7\1" 2JiSds0e GWŪar?cs@gtqq`FųL8b{7nI&W!0Z 8[dk^A0.)pZ5E@ [v eР.].R7Z {@>}*3^tSw|aYͿAg=|qfq}(_4mlwX~}%+=_so!0¼|3Y3U3AfgԭcRa'8ܜ#މy3E1y&bH!$oAv1p[1n#_#bž/>&N`Hb &A2ik3ahUf$t#8,ͪsDeFo1DqHcgϵ>F%vٍ-z/ ,G'NԟFAGþ0v3?͏#w1 8 l$ >b:$W $oT!~S=:"ސ;f}W%wq' ѩq\i#Xwd$˾r`%I#[ҝ"x7pln;'͹SWu|]̹zyhW7_ ,J1꛷3<@ߝ|Fsg3G={w"*=0}Xe#x i(Z q&ar쎇(r~qbq0V9A ]]{{=~U8$/@t_91.0iW [LI/F,( ;sA Qdi/l?JG&[-2[(1@0Ndh!8Xb+A|je(UP ρjJQŮe.ţ 9m% >&^C|\7޹>cݿ}̚?{`ƿ { $(T#^Cf,T:EALF!{ 9%8rLKj#6[CD(%U~__UuD=|#{\~ OۏknFևƒbͤ: Ej%5rqu $dɓ YKsGISHV%eFJ#%ui5嶵FiJ)6Y4OI}ꥮZذd--*e;U:ҟ8A׫ԁ֛|ކKhj"gXj"qxYv ۡsj ^? 5E.ω*1YEw5L3ǝ/N(^{Zy~mmSmMxDVZi+RvXnA[:wtF7_#mi-zo (OL+-4{9{K.ӅW:eZRT#L<=]0бN*#`9Jlˬ9:2,ӑf46y2I"C; H,?Y 6T+Q+ O HX)NCP9_0i/4/d5*P#V?CoPikxק?}NuKVM3gaW~ӟTwګOD/͙bqS4kZ\K@t BhKo(/*19P%?!#yq6J0i$Y"J]؜7쒳YГW?tnV Oџ_5Je=Ԑ *^bC7pyX}Sf1loK.tOW0JDQ[{61 tQŸ`FX}`&ziz /$\~ac] qݿqG_0w@uv/xڱ㻮|}P=7ɏX嗭ZPc/ZKF!g XF&Hy#6 )Z| HVG$-FrxkDaxjnVω䢚-B7,/pMw~79+xp]wiَ?UՕ)ۿw)[s%K~8q9\ri}<;^8jK'C}~UL[J؄[|ݜz> +o-s{}S^x0aFPS!5t޴21քn4ƪ;޲EE4q*QE#O}\~5\B7f\=k#Nݧ~gkzzH}G>;#uRcc[IJmE,BiUvA̛K!5akba ]''은̓m]YLisp|aɖCt 48CSeeg`#J*(wyy兗4B +Lxm%Wƻ;d7vP|ݷOs,?k:oECtfDة |Y6 '54kγV|ΕhF?lNv|tlEE047|"LSIvoAĔP.c_LL :.ymr+N!'%e,r]JXc >wPZ9/Q8ݽeSvƋ~#Ɨc*߾rYQGYYxU.{ўD|{jh9A_a". X%)+",)4RQ%^44`0cX[0_/`rH uhqC΃Ǫۜ׫di0gc_6]QVAzM 0^:u/>Xr-Tq2+bD00 bu42%[3i>0! qIf/ A”J ҅[uJyۃKk_=y5WȲC}$}QPZp#oe:{0CmW p U(QMb2mNa|^2}v3 =ytpǩxOM)+JqtId_Adz鋻o~ι^٬q θ gڏp͓1{pu{7=:ېO εփ2/k4ߖ%b=+z)nԖ?$FZP4"dN itV= !/R |~*q[6Y83J'4kٮW,o%U:\][`xصIwZeJ`.>O`pg{ ZZDgHe&i@hg ,v0 n$q2Hw|VD:^`l4_hsE`\{x O^}HWm?Ko{C*;w|C>>Vc/(>=ٰ|lRb[NE |ložҩ8UH ќh9sxlG1ɋ( ;wW/ZnտGYsr:v"ɱ@M3CNUoܺwU񜕏 BnDpݩ"yYԤx*dud-UI݁L, 9] n#U6aP7mRk#؏ן;ԛ>V9k/>Z 4lijN*\q ȾWED-|80CӒSoUd򄋆!#OYz%1Z1{΃(knUOlBa{_g̘3Euލxp&^a,^DIkfê&1AK>58=PUYzDml|ZM2:{FXK 촊j:ֶzDc6jC}4:$JRT- *v5Q 0Lzt+ )m(&S,dѸ$X +m#bY.4-a*x+)`v;]rc%NnjevF|٪m'udΔWtohѽn0~ɳ_G_-U3J۶ʲo&/v2 9ӊz@H:`&9͘IbT|婞 8듆{^;}mަ*՚Gjf+-[bO+ۋC&R(񗿨~r+WZ9λZr|.x`䓐I\.q7jaE":#`EI(av%h/]u zY+)iV(KbYb䁠Bzx$.s0#zo9zM܇USéE\q\2.GN?,ݰs,3a3lHbU2ׅ2WR ?he`!4Qkz"?>.*="(J}ك'y<iڂI0A,@@Q@0L~Bs`4h`SVQ>1|xKn_8u +?gs=Zc?tD]S}QkCu}RPY} a3 B; ~|E81aU|F5܀f,WLb Zjb蹰c)d7nB<>e}-YX^`{/0]=MwvvsY͙&}cד]My~m<w ;ީGIn4< !"8VXfcQT+ƦE[Pl­lL TFK3TѠO ңJ]y +`΍=luT,;aWR9ϊi}V.>6}&E]t^"'I#\0 ֌hH% DE>Gd9z>JuHO_je?ڐ Mk*^T6VNVs\<@Bo#1TX8u kT Y\yK  2Cn~AΜ6A[H4'SrԠezC*wQ٠SEНVnרG+o9ew| D rm4He 4:oKk&n2=(l #mvs#@>f bg] pG?*9G2Av(4G`-"@anM`lM^ä&@pJ~e:(+1ܮTEfF,dX1 [E{yX83FA`r ĕ2cl2Q9S6Wc@tߗ>= CeD{;VNQa?q nh)'._ Ey+jn6_M\/d\htdž(}eKoD>rA?5#PsS~#~F v&3ˈB[;_Ψd}>[׺_0\Sz^2X9ڥ4ߙcQ`@LwP82K_6DRKB&f(M&z/p]GoFAСOY6(5e'@|m֤rmSHh#{.Pip6L?_!_Gm}T yl'@W |?.RCUφU?s3?J 5c 檶{RUPb6`OKĬr֞Ya:&< ȉ7M(&}ˑ􇲨p.Bx@g!mSwJ7\`e4:-`ѫ,Z}v\pr"͉lvw]JX9yӓ.۷۾νbLf̥ΛY?'U;,\yeé;_){_AwU9+ Z,4pSH XV Z^V P RGOd_۞5~xƣ|t/TZa;Z=>.=$|nb=]9ǒ( `_R7ޮZ>߭wop'aa?0% Gnc[` a[B\: dq\E}=” B8<׃,Brr)Ɯ"L:|w,ڌ-o]s~F3{o\8冀3{EnGr EY}@խk_a/b#tȹlNT7rL;R\i|-% e(ؘ0 $U6TSՇ4P}^4x~iѡz;mYs+ܩcz{ ] -@> OcMlNŏy_,lqp-PE4,/+2Gc,s=p̸68lt\W;Z9{3m~$BFKDC2]3w6Q+ψ6E޺D/~ ;!%%vm}h0Jv*ZԞvGڴ輢vAAVqhOiY{]0Q!f8urΛQ#swncY O23g44-3>,;>-$Sas2( `z']aɜ;uƛ'>_U]uVܿn%UQ@'~Su+ix|Mo۩ g\1c .5w q3eCG־ѫn6˫1«nnJ~XCڬQMvSe- 6O5~e+A2_:FDb&! +.~*,biczTtkU׽ӦV߼Ew\0vMr_Gnv8~x:iƇlRI6H͒Y24[Ta~129w+ۏ?5{O[(vr|.24-0FO?[Ã״nR.M-bѧ`V'{ (:qxY:qũ -U5hqv/X*8nIΣo8; OK^iN':wD8k,Y7JbsmD]9eњQ0q^/eLJt7_SYbwو0&\Fߙ8vExߙLx:~-Fq|uf5%@KNJ_xXjtI͝D=7zaRW K_ $}eWƸG_L|ep4ʪ 'Wmծo ѷAOp_2.[6O!p̔it+gk۝OJ&ȥ-;6r/EŽ] ;vax!dE))4H EB\B2;ۂPO Dv 0wڒ:ۢ[?_[9sxy ,c`q; 61sBj@؄T}Z KMAYx3w/G( zN~ k+v1}iœi~a>j/QmUC}_wv_] "@8iĹlp`(-׼+Ac^8$"i$FptN #F@~])0Þ@AFŊ9P!ET] C"-+f !"r7 n?ݎX"GDۈ9rHSz "`P%%N6 yo$4Gb! C=q'`*2;KW Nz&9V"vsdy!DD>Eefi _w p`ڞys#o_DZhl8֜66UXvuc$H fxsۺ\Z.[Z/]J^W0v<\{\]T].:Q*&(?&k +1Y8MpO!s%\CTIy{ڝ' ԃ@®H{FYl\)փF*KH;9 !%F5+׶HA7ݾUY;XZ<߬޵U*;ׄ}`tsPkyi6}*'??X]N?7yIFM8Q;1L9Yy"je&aF^\hu!0H1-p΅ur2@^]Ok:-*T~-/.}R5zgϨiʷoޮ@defY(zHݭ Z%r\?-9z,բsD8#: FQ܀7p1{yNT^ y&!RVa6't"1t`h_sDΔMUJ_5lfj,ÝS>{>b:9A+}e*U4&A4-_.t3 7 3+*WBHq/1\si:R(Q&v1={mB\!?Hmea)( MaG^T[ASzb<5ȍi|[!L<IBL$iKN`g.WRW ]bUu!p+c6Ga۩TgLdӟS󶉯^=}"pNW6iO_ qѰitql\bkRF3:ؑ7 d*JsF'9Иg8cS2&YP0Po2_ڐ8# 1!@)/)WF-zl5퟿'S}v{]5M7?~o5i43z" mV4È!53AS&#cQbx;N:Wt\(!%͠mn{{Q?E;uQ]n ĺ^<ՏH@~ :ʦq@AU#J! }CK4R3fPR+:4!U2ra_0|%qm׍ 'Xa oJ._$;k>>,Ϧd-;5_MHM6io֏j'j:,J2! 8(DLQ"?HJFEpPOzD>5dtB=ZDkm<{A@;'gMJ%OFACQ1.x|nEr%e+v_dy,^vV֥E/?.0nm~z3T]0OP^;?Ǟqꆠ #y6LN7[djmX( u~2/ Q1whI69RkYrY?s]kѹ>Y=uPX]rg=s^{bE{1C;>1gHV$@lt\~MF)JC4IBpds%q$kvE3G8 1Q`(8Hvlz9A^ Ħqw-:z}*.n +BM==Z=5_+ZR\+*l׊~X2ֺfǣ_h!,IXHp{ZCQ K\vΕ riOgEhkvi<_jٺœ2tWlj8:c}b:J-VqpAbtEZջŵ q|* Z ho'Od^Wɤ N?UvINսqlG ^%~X6"^Ͼ>K{^v?bn+GӗEpYa~Uٯ`p3ӔOˋuyfɃS?7b*k-—.IN/`MWV}+~Ldƚ׳x ^1=h9@oZg mC~d/Ne!LbE}F+,$$+# 1t2dՌI <@nxK{✩%굄S'3S590*;ŵZFqR!X3ʇWO%s;%MIH^ ~@=$E^Hb,yFg8g\/M=ud8hb<@[Bqz<nqŐ+/28"YIA\MνA}fYcv5E$Wρq0{y$+zY褘5"bgFm# Q"bxIxkDNWXmYnP|1Q.mX\ہxİ-1gȤrmʋ_+,<K]Y/#jyw~VڼM>& 5@f;6w|谡5}~s]7ZPDhY-g*u}y|Y]j_p:ӾnL@y7,2@|(rSe[rL˱$$[K%cl Y3<6!9J ۄԹDe4g5_rD2b@Yv-QSWeo򘺵aEX j[.}l([v;m1|h9 Eqh IK,;[y8.M Nij])U>cq03M%92@w2&(.$FyZsY~=U? Z?TWߩ*USF0 lcl:Rs -dйUym=~{_C]1Vn jjP0Se`y0mޥXrcy2Xb|.|@>}sgs J/+Վ+lLkCaDOˀvu udz1˶ R1E!vz%  uᑨCk%m_kΌ vZyzawQ"Q'w&_1GxǞ&]Sݺ}תK+:veyF%tݞ{gɍkqk 6,;"2;ޣ3vw"q b+mv76;>lv,NC_{!Qmswfxv!ٷßUwiKfȉ~ v g7r&|jm(׎!e2 _?cQZ4뮛o{]}zpS7\z3ԑKbsq2Tvz[hʕ/ը?@sXusT۳cmpJo7jJkOkLR_Z޽]G1Z_{}GԔ?Pֹ7 Aj^>2:M3f4p_xݵk-ִ I**SP6 &X".4\M#Ra5\Dᨌ̢6\$_]e=m$9u ffAAqS1=LpǦb(?ZI ]3'7?GVܯ_h52|j^-h'gniG}[Ù/25dS60lIrHD]Γ#DA% *Γ,VHbJ A\NՁ32QD3w$L`.(C|uťϏ}P=ҵn)з&&Ac:5kEKLF 5E~Ip% LOh =%xGXD١8)@2@&0,8q}@C*ڂbm٢%z O^> E~8Y-f ԸEHu$c]C°u1׎ 9E[W/X֭2-Ʀ;{4<?& kiZt e,kL@[Z쀁FI;0}QsZrƍr3FJЖO->e3Mhب4Iv,t>ebb`XD!UZ2a[Ԡjnl[[(n㨊pk#.+IjMƔ ]1ޜ^e[=k/O0 &??ӱv&R/_KCS>]ӕOg8Qs`$F`ۆ3̓Qas&5Zj I䦆S۹<\c+gyy֣7x>]TaM( NomcÃ̓1嵃ixTy ْI2%h򥉥,]xDu\27vg̘:]׮|e:c۵kIR6$@>eيP^ ~l w1M׺xo~mJyld^F`olcS(^L ҡj\xOk;?T\h+En?ȫ$P#F Dp{ \5$&5kr TA𲄾// ^;WVN \3ҿZh?^exly97oJV ;猞վ'o;u NÛ{G3I_޿|Xr!GyJ=k tA \pi"06Y(_aJP%IgnUV8XHlS'C7N2 dy>HDY0 х[֌ ?Xo >#m'g.'7\&fa^XB(YCUBg>^PyPXnlW:+! `L;-]G!Q9BP@w:c$9>zC"&9~)Y~4Eɤu,7VANX5 xҀ1ɿj7'TѨ#7~`e6R!) u)AdtTTJu]Qh׎Gd䆓}UcgO܇)C qi>z&c6&`6m"DfZymWc3!+D D3ٵ(CqE =gI|l"+q—mfzdbEl8Y8׎dVeyW^O}|D] q[ zۗ.2lcހ^-qfD!%Uq Uqy)p~agDp) {7wڟWq hsF_, \wDNC( ۛ~,/`oB5C)ؑ1[k˰MY݆8? sCJbaOsΛq0YM+ bퟩ[帿V#}?ulA}|ÏN^3^珰[Skxtb !Y]fIMb-B19lʆ$0(@[0r;2|C'~\Xh 7unGD mjlX^7NEY5?lՀфzLe6NDXjx(^ xWmHlXjuE^[)9Fsp Ud|e)sb<̧!Pl 7>6bm@}nSEf2\nD#PМ Fֹb]ՔKfV&H0\ A$u1f-ih_Z]Y n\9[fd~e|<[Y3wh/T2Jtѣh@ Mڌνir`h`Qq|ɦDD\(SGzj 盙W;fk!za<^9c{~5+fǬcƃI(Z\YcU߫ד$F `m!Hl(~!cN+S[AL|*=U/}_ّ;䝥nGmo"d׶M@4Ŗl@;D3V cėd)qLjcj0'5Ic>@GάaVEqn ~l ]K-rj\ 6~7Ժ̳HމX.f=9砩FڈTvMmXm(iq.Y a S0R*RRWE,/}{[ ?7$K!C)D,D4F/#f `@oq&Q"\R%ˬN(XTwbu;hDSpDzEAEi:Ae"E"У[h-&qS0 7Tw&X. \"2"iWYGesVi! s+ Sx4*K"³ξ2'Yz@rR]4faRɜ\G7:< SbmпNQu(i?ߊy%T1̍ ,d7%'+jA|~a"v])c&lpeRRc°R@R,%M>ZH}x%ɖI;;:q!CR`^7z\4d*5o]W{WQ %EhWKOYlׯ雳zmz̾~t˿ݱ1٣XY/7 xU ݵ"k{=ȎuV)5(`\."1ִי'MNM9H+GY]PհmG ѓzУkM9d3kR i<(름u,+pOl͵ZV%O@m0]¤a/݊z}m_4m ίWs]Q{0߬D!3·eJ.3 LNH OH~VRbf'U RG'/ǧ8>oNodԻg47Qf;BOrကGI=tR=!B*rE0T<--Pc0&hik:WTpɂ(ߝ!ͳ;ڜ|:^c DÙyV{u֨:5wp`f)ž&;yϵS+Ǝdo呀"MHʤZ<^PRJ iT?eGD"dAUZJnxxO$zs zC}z͒Ytr'"YCĉ+3Oc3x2Ҏy' !` DdmUJx T] %IzBgUHyzFǡcprʭۼD򣑾ML r3vOҚ fi;v|lhF܈mIluCH{c'2$#(D#)RZPSJ+5u^}x\[:D,[Mw:Un+d bIXHc'~ JlaE 9htd H_d ːdY,٪t>+y4YglW1[hq\{OMؑ77ZC΄ }%+Q-f4> +([9VT"dZ+L%a| Rf(c9 O @3+7O~1dayWϚl~'UZrwgzDbOv[kr,{42L"b//b1f Ic95s,el< IWRmҿTChI %P&DER$© M3#l8M+MtVKVls Uxs^9S5 Md,ZWB?Ի0T(_qPJ +H]ޫ:;s,@~0.胂'r<,IM"9T.NEuj%?rES!:j4.I%^\7.hm39췂ƵbjS*LSZޱs 44"h7e$o] V<3֧9N1H,&SMSMkJ65p[ XmmVVw 6j30t)5^ϾzTNz'6#[sk_b@­kmːb*"-‡dg9f lP3oN778=>8fp[Q<Ȑ/ޣ_ZnRcrY F'ݱS_swz~zf㎇gD4~)B`F8`6Sb%SI+/bRgLI})! f ׺['?$Ĕ}W9kfL^>;ٺXB$_?,YςVƽ[ij`_ɽC릳7~m/x!㟏A qrH9T(EAE-w⬲D,q! ÂO0jAQd!g ˸#W<7{B7uoNݡz7Gw$ L2t3;!qs&8 h!cic9d11'I]U zNPRx"Cla$I\@rF >7,8#V$5K}cY>lb1b-gIXǎ|/nLny*]Ùs޵ 0/ZzQ_á)!.#\0{a8zCD08+F ۸D5"㉭Cl={-9՚#|4CMR<8p`c^aʬǏ` ?|qp9~n1sޫpZFoc/׎(>/ '42e2v܄Qs{Xv0 ه=i| N?f>Nqy;اnSN?+oHJ^hˆ^9Xa$qDK!y Ia2JqņqiԚCIǓѽTX(f?}81c[7K.PS20Z/~1_vڝ^S]C(wbo_KŠ|cǦ"a4x&^P|f쀘Cݻɘ!6H"7;: MSCx %֡- PF>uL@ްH1r[ӣt&Rtah!6%5 >r}Cq#MXNٹ э=lY1b|‡;ڻ",ѻ# SX<\ED޲ ko88?08#=0ZyTJ1l\^gCډsghȿ16GN^|Sxi%E=L"#?Q kA>.v|=5˶?\t3#vǿ0,9Y_yIɻީ7Y:@ N]c^xFؾ1O7P! Hx,| C|mJvL@eF?] JHڎ0#E@vA E_sLVG7R䎝\=_]{J.8ڊo(m p-ћX,mqÙ_Vr/L Tx`}ډX8NMkb&6j#PݴŻ݂\ȏIƋǠ 擯w|x@-#|Ḍ}}fGyJ m w/nN=?|+%?J~S㯔Hm$dI~5|k; }QV>Yv߫N>r>&NBSOoS(@褚ؼ}}'N~CmN hwľAk&gpIgB=8-si&rݟ>"aR3Z-D1̣HZ5ۻ5pE*s!E<odži[b˅DT|"x_zkk_d/Cg#ާX褼Q,3bzŚ$Ǐ΋x}QHvMxi ; DWqGI٣VL0}#fxܞ/hN0jК{bsf#USݝ8Idžήsyʻ?`쇺o'&?ě )+A;J4 /s\i!DR=$yUR^xglʿ,o3Pyy8yM|{(?SV䪿So4^߭U~)՞W~xQcX;wahVz~5ޣv߭ NSl< .x;7[~ZⷣVW]W*Gb+6l$IvJ% ( -`ĈX>(P?bdUn]`W*h7i `,8p$^\J8v /Jw|}>~7;Zf^af#iܸ|y}'WWZɎI='W|J3=YB#Ou?gA{4{f(\cNw7b/v;(-o7^퟉ini6`.P{sUo8 ,ߨh[_UY~Gb;Tǁ71Wmzӄ\?͐Cȟ"/ |=N r[s4EГ,_a"ڳu'YY+YY<_SBui)=)>%OeLE>2"r5Aw(О},<;EyУsOol4sYi$Wg:O,_aToY~שGI> qăK|Nl mS }2k[-gy{êX ˰[Z ROj9 S.( #7Ct%l؈ 3Hx(bhŘp *Tq€e9uP`uXyqpL6Q%Où9lplQN7f=7 ݊}3[پlb] ~W[vN$5qk:MU :&c"y75 SS Ir3N_$p f6'R70| 8$iuGs|g(T<<;6Z@';a' z;xDmI$톌KvU@W ECI#'FGN#1P\88uriٌ,ls4u::P"[IףV}`-q>Co{qS_{ρ^cx/@aradRd3橤$8&^-vE7/vaKPo%;ěXY%*0F2N%Nv7*lXm[Ѹo&-h\ɲPwwoOWкab{N@_O>yV[{fgtL,;irId>tx7sm.-+/5i˜kRnCohyp| 9Mg4@3֒H@WQy7pKSx4$Om{0*p,u &C69|% 7Sx"ϐ{ƅt 6RJ-!u9?V=+26)6d~6yhŽܓ nn ]x6S-imKMjK;qM6{~hok[?*??]Ҳ˷@/e~ݏ+ʌW 9QV<=zx6H6n`1|h3pFƢ'>⬻;gX<"ȱױwʿ vT w]ϲM@n"GVcls$e&>H$]H%ٱH 93X?=cSRQR_OD ky" {\LTkHiAa}.Spci${0 V[b͚ ‘Bcq˰QxtXjZԜ)p |306ekuMֻ!s2I'#tFβv%gKnlucRR3`n|ONӺ/v+o߾}޲Y؞gׁ`[зG[v#XOJ(Z $GrMQɹCAd"~Ȧ\H [KѧԶ:1ٙ;qOfO>n>;5n[WDxMX1}j7PpɌHj-l1$/Dql!#"3o27#H]H<D>/|%rnGZ(-|v.xDޓG={O(jXO|5`{؞{VOx.thv:w3=$v| ;/6, kc+ps; :sxIoP(=|}4EQda OքTFFeiGp@H-CxV><”]0Wcn 1wSNh% ІMFȍրCSmq zV ,]R]7hx[7.NJӯk fM"Lj8,Q;0I1iD~ Oj Va[NԊ}Q ?h#? Ms}!5(`b(gסFZ1O?e?nMٸmK9 0?--ض/8ں{G[2r%t˘(AfM".XV-Uc}݈SJ}ďz 2oPȌxrb '{]5qoJ/9=#Lh4n hiѡQwZ9\ôZ<(B^at0H)f[g0e _ NG1!{П#Jy<7GɬuECSZMRzZ=E^H žFPY7hVi08QXz QBP ;=sP(ڞ4!;H,Ac$Y%ܑ1{'DODXZS?EVa>B8 g;JQ>D5:3"C"MWE$emهZs" JwNpxoؿtDSeR擔$6U#O,ʘ>d Gr+iۑ냇?tQ7=7hձs/?{>bUuuUմimI -!:rC,b Bpl$,{Z`dphKvRJH:@bg!ZH*3'"Vb 3MnʎJ5!68V?s_\>۞G=*21-}"':{f+ #AC6[~DqzcotRs'XCEXA=xE, ++[UC T85n\&I n/}禖\bt0c7Hnt4DhbMB ZsV(  1Ոa:$(h{:i"kX.:wp랝Gyԟpd :d90RЕ |_~O9?W8A%_i=U_f$-}qLT'WiDj rFd#7I~6{o 2bx"&  hXguyE8jJk\rg[B"|3oL{@N @q)@enN2l t $4dΕY\@(liP`2 ޠM®|g =g ?Ri(ܕ#TTphkB9/gtB]X S֭WN -f@76~O 0_zkWn2q`V52 \qgnn btw#lyFԙT?l \f3 4mk?״+1*4>pKZƻWqJ+-[ckR|b7c_c٧U;$c? wU{~ߡ߭ 47<A'{ 2,AXpx VL=p9OsĖ<$doH3gkE(NJ+ƌQpeـ=X[ڽ%}Gف}}cU3y6b^Hb]':> kc?:#9aeOϛر[lWb+ȸ/Y/xBw{DnHo|×8%#œviP{=&:ƛggvfֵ`G6zns$ $3to38^rƑaYm݁cQ7Gݞsy"_!nciI?0JfRҭg7w +W1B˟B?kRw Or^edA򿗏_gQ>f\0ł@&'%'>X9"ΟiojW8Եyl)È7%\Sky4M\>LD=K0UA*n'k};sP!Z BeTL`MĈu@pv MgS|d}ـFmj}yqh[f_9w<n<8p~¿@x!cJon '*i}XԑD= Indk&vc+GUax3)o΋.P2e'c2|慾a9gE~,# dĩi{:Af#auE/T (%׮0 8bt3`׭G0:d1lhTnF lgXPKguX7$ـ7.B. R@0 pgemWJgsw A=z0'Xȸ7?xTY [3%ʉZ/B,#➌Kɕ7 Vf.BZs4c}ò~O#ވ#9X,C|[=7߀SJQ s#eoc|P)_;K-^$5c]uc K{޿{vmvU'𢼱|7K~ 㣊* ne^GMӮ}tKESt1^wB8E0Z^wxôx>*ϒ`;?]R~qib`˙1GFihaay L@[YxSMIi# HXKn-_3={CC@GW.b_3:K'v_|l屇ߑgoU(&( DPe푢 [ǫ\?CD/ixLw/JekIv= z(ohg«r}{G]$wPslr㌑]]bV!ē+@:%tN#34FDajVVA/l&?zF5O[6 c(Bs'<7MJ>V`lJT1QF(+6}pW*}$Qe}ƙBP#>bQC>CqTK[AݩGW[ Tr-bo{k];N-H{AlY39)N3e-i4g9bnEQ~~=r?EȪy좕>[cA.}:J:;tE r3Zyh*nܗIIFwd@;")o4[`3wZ}y\گyMƙ۷?;dĤꜗ' @㗽3ACvcNjN8#8)>[gx.ݾ+@hs'/ra{TO-Ti'/XPda cyZ&?ݿ'NfLIkh a7_Ko|[ i= #Rve1j=9Nܼ##7*>*$+F jCz zl_!#f 8~b VP{NsDr2r)z %xצcqyl rccy9bX^Ͼ]кS V :+82ayPp+hf6 hfuV"(JHs`%"&i`VIPq7@Z0mO橊_76;<_jz䘣0D5?vݭCj̩_8pt"҅%ȋaO? &I9j7j۬;'LTIR3#n?!`:Cl%pp {,|`$ b&ﰧKDhbh~$k+>²*[fi1qD[EKs/Oi8j"T;i;J.D=laB]0R>y )k 4?පz @ǬGr]$6ļiYy{G~߽rkx֔߷(>SDLs1e"i(1M豟-#ڵ@Z/BjEN=w!  1I%h|N616L10#"܈sJK;p+ y,C{AE.P!gľ'PIDln0pyqu;7;/onɺe _I~ZbоbߊO M`p>t lѥ"xC[|x#s]bH3W<1+_m HJP;NHnɽaDGFn꧳n/mdo8Bx}}96XU 3rm>lelxy5:ԍ~kc}[ qm 1-$Z7v08ŌϠ<;ve8"油L7u?yی.2aM7->l7=ŎF.M -R12O*I(̧_PWrrK`:t^ "{t؈4\hosh/x3ePv'bɌ\{jǽ;߇m{<>f'ڗ##ηP7<7-,4 }cI3 cPvb,l'UPF6%=i%kħ9)M JW4 _{ 'tS$=C~a/jԻSr6meezЕ?B"M|]wmqi OosȧhП/mp7Fs 0.#nD#b?"2eAW>tQ,fx۰:L1F0D>~OZHD ! (S rl[ (d_7i] L p԰@F ! Vr%&a.v?oWͷNn^1r򊩳Qq|cπI/=>eμeE{WVSΘZ LQ'8N\fNB@!>$ZSq` iBOm{D ыtpqFU!-O_K]G|A+*]߼B Dq'^?t~2nxnهpօo͗~+2ߦGʲ߆8c|E_K?< ʇ|| Ǣ߭4: 5n:w "zy?ו6^݀{gMWkǦ^%U'`ePpjS`ܣ[Ҵlҕpm5?6ȘeoDi0Sy#\@Zk RyzKG3[ՐNՎB.tA;j,U׵EQh֎Z6hGͷᚂfo5ŚC&YCӁkfE=f/)FgHؓ|&#TtqL {,`MZ/7MZMGk/!]%ᷝ&p`֤yн@Up=7㢼y̢WLyVhIpOy~IMK5b ȟhYKKTD~;˲y 14˴'cp {i+$8XtЮ3ƂyXИV~R|C cp?wJ__u`,:_4b)E_R߉S 1K8IYH։jH )}k?ב>1<#=~<|2*Cb> צ471ƵsjyU[dyyi*k`^),S11~۔滘s41yOss 4zҼkH6v )zy@쯫Tׂ/Xүݬ?a]+(E1Whޚ<0jBjo?em_k.j?綿\+|k9h 8J/?N%caF?/0nX#-ch.2h^9MLf0M6w"J.hnK~tQ["g!X:a<8iQww΢,m/.Q{l&9gV6m3Ғ?z` ^^Gk6q~Ig5 HGe^}٘/q1[̂/p Ҋ n¸kcf|MY7DWq7@p֊b%GNg:~g[n%iin{yBtFchRWv9/d\oZs?|c֊yϛ^b-pM3柀s!77pd`Bgx~}eڀ1zBi:(e6E ^w }x3lnZq<,as)ueD?4HJ1P(ڦRqSUGME٪?AJr+;5ط]59nMeBA봽JxA,0KЄ+{[=A?צ4iuY?Ixp.3RX 2eviAE[>2`9훎(F|0W?÷: { ۹cӞ6u~󱧼1/cq{n]80^owRAuRQOtqn #X{͛(,B\x4$E{{6Klv 6ˈ9$\[fi঱!OĔ }&9Qu_UFDE%G :u*ݨOGͣˢ+D/3D'&1LaLI̔1}FwmlXlѱlq*-)R<\O%bG~}%oOC;~;`KPPP03b##10'&$NI0Ļw&KlI|.Ӊ_&&J:t*ݤO'̓3G'ONInH^\kɧL)lNn˺Ӻb}-Ӷd;h;j;aTT԰~S'֤6Lݘژ7՞z<ӎ~iL7}{MOM>2<*}n-kӷ7LG>5eΪ?o迲_nǀ~`6PAt0o[|p ~|)g{d'ggf=:۞}4!!3dᐖ!dž?'7ggOnܾCrGV~W+G l+xхS /e谡i&kvq'ًR~#Vxmdȩ#g<=oyC SoxJcŧ3ǨQF5zcGO}19fϘcZ8M*),ck(\ָq9"n-CƯ|eϗ_,4!nm .N̜8ws<&MkҥUM>5Knrs7qSr|Mnf6r+*WWN?Ǵ[]UͫOoFꌁ3v8_SXf[͞ڸږ3ݼs֪_w9|^7S}\_YaG66o8 yAÂ.ܿkQEX콸t%Kʖ\r~i/}mYen)[.X~-NuW [mWv}wqO8*WZ]zwsםٶ6xk_ڏ~i\Oם_z{}_m6l8 omdžo7\1pco,ܸp㾍-ӦMK7=]z~G{=ֽqn߷q-klҴ[Nl|巭V=FnM:p밭[nuU[޺kǷom6m=ڶ۾ӶK=}{O^n߽#_lvF> K+om\߸qOcm|;;wv QlG9;sǽ;v8Ȏw;qq?sg;\i牝]}wkK.=?nݶݹqf>SM)}aʇ>7nlk_whsz4;m}wt"جǚ;رN=c_>v񱋏jzpV{kn9tc_<|Cy'~yrGOF?Sa'^yx=[mzH1֛Z x&l@494+G텸gW׫{2Խˎzj䧋5jн2+{JfjT&r fh`A?e/ Ƒ"bAIx)*q.}GEb)P8{{|ؠe {tgBӱ?4B=C&_ ZG—R1p?T!@6^'ax6E :kV6Pҝ]c/kc3iEF|IYK/Ohj/k0Ӵ1hiokohoN{iўUݣ>ZfHfMy,bZOi+[в/]ǘsG"OźhW40_s)`Ⱥö! ½XodXD&' L,cK`,%k),pɲX6 N`}}ņX>l l$kvAGl s>geh~}& F$8VV7UiUlal&bYz[;6_`߿-b-cVdl[>>>gNp6zmd]l3e-l+ƶFavn kb=a=Ч1D6ydOhCIfg͈}4;ʞgq_97m;{^7$;^fWku{fgw{};>d3,}>eK}þe߱9v.Og d_O.6v9X;8.[6^ ]~\y/C0>~pF^G| /cy)y9'I|2O7񩼂WiW||&h|y_E|1_—eW6~;| _|7f~7[Vo||770|? ~?ü?ŏQ ?Ɵ"')2_7-6;i!g)>_/Wk ǿy?/W~?_ w-Wt뺡tntwCԽ.U}u?zw!zO=TGQzc8=^'z[uizgYz}>Pֳ!zz^Շ"}>RA/G1z ,eKqz>^/'>I] Fx ~n^))&}7B;Wp֧֯3VKYu\}^m }H_5BSۡ=OGmT_ߢ/oW+;EXߩ}IK߬߭ߣ߫ߧoѷzCߩ߯w"Ca}OT߯?KE;Zur#UgOx<"E*T7R_HE"U3Z gezC.xLU1[ʽz4PZ&cK"rӃ|`jpF1FF:tMmpc&d%fz~l UDVΨijOL^y5=~Ib5R1,xaA*zYX BX#7,54Nﳪ7:3*A]wm<7_9 f[V%7SE&(7u E .aҍ N*0VT`AډoM3\TFk̬}mFF73vׄBs|yg nVN'kv#-a-%8x02K=`9ʻVk ʹ8PK%W_ PKy.FSangular-1.3.9/docs/components/open-sans-fontface-1.0.4/fonts/Bold/OpenSans-Bold.svgi{$WzEǻf!%Z,y$x]A;$}ωP( u]de .OY__Z{݋g{?_˿?Տ߬oW_]|k~7_ꫫw~g_ů"?U/_^|ޚ|N^~+ۗg//Wl?m߼7/{óokᇗ_?|j_~ow7͇Z)߽{N~W%y69zo_LO_|#S}w/goXg/^U=w~.^W_vjz׋>?/ڊ7wW?k ?>Q7v!6擟.Q}}մC OÀzl۟iS?띪iꢫ4tuL'-?;y:US74V{ vXM͘z6Wb\_G5~W,Ѯ1 E_~u76r7r6\WS',9ᓪ lXV}Uz\^LnW::r竆 c4UuW]sU5bаm3՛X?umTu׫Lݶ ChY$ȥVr:o[FA+;R z1}Fͻ\V$71}]fŲzǡULZo.z6_1iddf:X (\L*] U2&\ک0碉(f3mW%MxSX)&U^59iԟI~U{,?N*Q]@8>\L|mO,a\w&yךX 5zB"^uNiC6; 'U5[k'ĩbXWHJh θ fk`T%p?`{&mqjܛ CC?ܳ+=3`K6pHEslwq=A7^3mi9Ԗg܁Yd0x=dj[+ф GO^=zv@K賢׫S@qA$M?#gWb~2/-;ê|L|xL)߼|}J]63 QGkhwD/xl4lcW4 10қ;/2 00(NEיi=c;:0)d}a`$lz_~9srFB5c)Ա| NsuHZeW^BvNdaWrE|STҽ`z*R yF%! 5+Q^$䡚m$q j U4j^G ׸gQŕ-XW.U5cKmHm:?ɗ@QίMgG,=n 67̍<=. Yf!f/Ǒ!|"6$W Fk>cz_30AX߉hb5؄>$ Ykh][g%[ |`a9z?Ueҋބ[b@%OT/ ҰJP6¿\@6 7?ĚV2,0*/gqJ&i'lDuiwHYSz<)M"Aݛ7F\) Сr hxbc ZɂRP]]o ?7׋fmƸty$ƭC uRCq5 Ʀp kځqrդ!* bDC](p 'fTuovOmo;oԇH-FbFr{D Y_iw%C0d„oW yM0i@o *?CrO?_=f7Y;w"xT9`p#_Q^.J'ڍ !<7|`0)R9=hlwF'cQϞ0@ DKj"++2pc#8C3{ _!Pd2u"H{.85YE7eو\z*0FV)0ŮFK-hH )g:A܌M>ìoL^\FkRax2S$H1F1&$1bĹL"TMh0&rg ͱ]nbBh (t(* CW௧]mqt+!;r*ȑox@Vߎ^-5<:fϭH.M$Dw^@F5q$! Є(60DD HEBqfg {5uH8KgBGH$ƻryG!44ёtZ3it5WHt0vimk,v\%/Lj4%Qӄ!-+a iƧ䅰@b^ScA %>;&]p$\id_r[Dn"qP8-xXepMbuneZD؊-cv18ByԢ:cZ /Ia(*Qya`0 NaV-nu\!BLN̨Xdz %g+*y&JO-N6`l,ˀ#-ܗOvAe\CkFPC%zzSq)(hUj>-H?WR62r]DJ%iVciLXCDr]h4㊊t܏0x~?%ild!ΒadOȅpj C=dg>K𖑀ʹ^<$\f(8LhX.8HI egx"ilsQtM4Ftd%7 y8`s]ҳbQ,*a\D ١hhjt: ~(ΜsU>yDrK,0<fˣixox0i|*ӯx+MݛѴ]wN@DfPuz4c1] 㭱sbgr7(v_RBŐWyOOSzt<"MrgN4Y;0L@y2 GI.G6DR-Y\}v;MO8dmv݌lӏߏHPv]A048}>{o(Zݨq t4dfYȀa递55R4>[<#&0.b$1($ Ѯݨ}7Ra@9g ]{Ӄs3.a>9(.d"nITo `pLޣ 3}MVR%3FБq8]L񡃜 fiPaŢN .iJaiGTW&V/H+0Ht*eNGH$Fm](Baw ުC&23<\: bEe\D$BĸdQ4)@k^ _3e[w3UgƜd4I#r*B\cD+k#Z^1|aD* 5Ҙ +1k5Ѳ(O @iYT.dMX宰 cf>R VY nN2().ZQfS`SvH261XM&B~ƻHdl S$hT`;K\Ȩ؊y%t2N/cj!1,`jA|uKL,  ɘPlYJC{2ߒE840+oNb7!6秵ANդ .ٞ&N[ dBK*.ćXM7Jӯ!bh Q _秗Ґ6U I#fOT̳G̃sᱩ;!y2wyV&YO/ C"K<8{ DYo4dW>E^3vW@a2E",6b  '$|AYڻ+(ESdWho'! ]qGK#J\ƿjVTHlp% }\'K?jpqxM@(@"n͈T終Ydph)$. g_&;[DY= yFf6bZLҬFW>c_Sna iJ-01=0>v tTyE~1" c}_4I M>f:8ih }}9);D9}Nryn`m+F󞶈U8h,];?K]di/2ݥNSZ aLjpc_G%k=ǤDr4גv ƨćUq*Ay]C!BRn$1 ԉU R&VRl.Vh q^6'֐C,1<DntQ5 lʌ yaL)r[DSS${?hUjtÑ:2RI)FrT Gl ԈBLV~v!%_'m&7E nD#(x (7xms˒)*uN*U]<9?O>Sӳ/9w9X @zlkGp^2N7D QYsºUp-HSΞ)@QܞWZl Ol[eu)B`kO+&֐7/^r#$OH!%/.yGW#tXdݙ08E2x!*P 2m@)죤,7/b7tWb@Fk.ai}bcM7' E4pju6"+8)WU}0~R$f|DaqQӈ'I ud(BH:8g5őbhȮ1xvK<0c>a 1;x" 1.AE%XaƉ8a=.VVۨ2m1M̔A폰3xʂ~XD`D u@Z~O3%p g;qQ-bc7n_qҧDpXvH&4֝_'YMV3f놻_ ;->\ fOhe;,b@X_'O)W,w3qK4쵶ckq]5KG ,I^;/nkBfHQ$@Kv^LOΰQۘ͝񌐬egXXݖZ+oCΈuwGz mtVRp!qXXVpmS(x56'>y0<m@2=;5:6YDCB.]]͟,+%Asp;;YiFkhEIz-s:M#+'4_ QϾy)I-yO0)M= 5 `j7$td,'8O4 6+?C\D( 0M%T|L-Bnq e*8V_)Ϯ*y#P|5N_ޓ?Xk|%j+_T{w;YysʋgtC,Z` >Ųב}J-8B%F$ԣ7Le Ul();'ҨP>I ܆8|;%9$Q)FLCeh۰l)&v)K  41$0&f$#RJ:d4ҁbÒA>I /,0BH"Φf:0^4U^3؉;3Ewԩ$/P@GDIBlOfNd}z_(P_L͇ -(|G.F,| q-[I.0)jF.pލfh9zKQ?Õ5yÂE^*$GmI3Qd4 Iǚ>|/_r:,EB>ĈEgYo1znRPb`4Y梤MԤyidBAJ 5E2i]<2F\[y#~ *Mm}sen4: X(@$>1OBI딁 V.*q9j@RGb ,{ƯSRi.phbl#d}]V?;ft0LGXͤI WY^(x,ۮBWfŠL$*Di.8DG""\?M LFL80Cp)S8]`aK9\Y8؍E"]]?.P0qZF<5E2&1PDQphu/x 9Y/(yzk>5*:!UsE)9}.M"^_$[I(z!Nɺ6"ގr l~ A+gBǃjĄŌ&nDbV.I\QW?*hZRG̫>W+ZP.d]ƾ&\璉7Y;!6W8D'LA (LqRWU ~Cs.5d[ID_^REG< iLD19 (>-?Z#;ǶDD-f/Iv LuǗ~0A|B(DiyCi.>u~84R0lh|FЭ1TtGXED/W,J ^=<=0kOz1e-C>0?cc-`F KjNPwSO :Sb2p7bl8;0ZK3%Pf*ر"fvɆ^$q9 8+3ZB[u n0JPs ~!xȿujw[uRl *h~U43dpjFYbL5 >fsjHgFn,^c9g2ͰL@'0Y@<u0&Z9"F\qVP2HHN|y<Sǹ MX:*> =?{չË|Û`ʎO<2m~xv0^tzgҹۇOXr6 R bN(8вhARCHiRrՉB`4, 4ǐR]"pҎhP8I8 m2XF[[` > KMxT_l36 L[dλ0qGdwx;Õ$ɦr0F5_;yKG4\%E`<!1y.Qt1g"q/O0$l*b?.4nRhA_*jsQ}$f]ќ#o%`4R_m|(fSzAnG1w sM;EU7?B5 &w1?l~ 3x;v+~1op/c38۟3ͱ$`IB=6A[9mR}H/kiD. 0jY^BZ,@FUJG<(`1~rbZ[sɜKI@OwHmaϗǰBGݲX8ocx-V{mbCoK{eb6͏r#rr:)P8VùmPW~xֱxDmhQ5+"ROƞKu}x+;j泴FJ\`zt:mB0즎N,`zH9L^&^  pNM4 l$MW⧳ Pz XEDK(L})%-{7]T2\tg*-^G͞xJv\[td34_ú ^Ǟ~_Aae c~wW_W/@Dqv0O;Z1 f"Դm14]dUˑ*RqgbfgK 62l9}R;CT}xGK&ij'aysb|f+ثXXwMAx6>uzp9IK3[Zq@DH%8m% VX@"i;k(& l-䤼0m}5lpÄ+|A~#nI{$[(ܶFJo+R B2u؋nH/3|20S-)LR=MlUC;jC|$TjhQu5tVaQ`  1G 3g[S3jIXXBrVΕY+}>f뗔zK#k %}B*&-36l{BF|@s yekG?&=6x_R\peB֋]GꞍSvm?.@:J64:E5mC$GhizIEJɒSdQ:3"3%9PMk2j` nsQ dWY (ajhxF A $t'1!\ĹpM#_aIͲ'eQ\{'mW!5r"҆K]-;M< 5?aQRmNLTd CkɅE.!`@iD) #uDQIMt+0:b8 UI5& A]^itkMW\@ R:ke"<.Sq+dۊ|pI2fr~١0}OpE˟ O';?O vCʗK\f>l3GCʯ}oy}hdzQVw\b_h側@3#yDN<=<0B/cDQRzIe8kz\_(aLO/鮗K>QeD`{ KYFp*)1;t<_#\jYO ehSUjdfB竁ISёt񨝆n܈_GƢLD{b$z4P-}O=%qn+`JVpQ۫Drp X(r.qP,xq\m?W;z>> ON&4ؔ[0Cޚ d<؎yI:7U#^.U?c.=-lZڀ⃽ ˸K+gxe_M@d8PxVy.tk#dΗˀsʼ^.#E?=I~ZZ΂GΞ#9 o+,]g?jO N.":pq}!yv ?,/3&鬒hcrl#z6Չ8ƭӫZ~^H>8`*}R3Bl(ՇGѳ1i% '):;AUXRxpj -չ%jCfIBry>ԝFΛϧp tH,"Ù]Mq}f:r#{.0u,q"eDd.̃LJPN)4cŕ-kgg!W]?Ԩ9zp<|HS, d ꑴtab&>cd inkC/^p)hedYh.}nhiΏ3i Z/vWi ޮ#qGsX_󱄍o&+yV T.<]?E2sHb@4 {0ɉ>`;6z$}zaW 㣣l?K=8D.pgTn&9 gsZסx`$~t\WK=mR?̚hzJiQ&=}UٹJ =:pȎ<g+~z;6O\h1ٳ Uj=| fb*_Q~/鏂VmC{HXϒ 5A.!VZ O* Xυj=bj|j#Y>%IYI4-~0ւkI)-0K@ݯ |jĝ?¥Sii:^k}E<8diX^-`--JFT|Fu,QD"9PO&RB2 kTڞU%pe^@}ޘaOKVv7f0nm=9=Lnn&Ê)2AK|' A6n1˕G_&3C2F N4U4&ui?N}rQΉ?={#t^v 0͝""8:X<)NcTKXѨCCU==#Xmj (9#0j&Ϥ(P ҂K_(vdW* A8CI.a N_$AM*ZKfFf?0I/՟i-A/."k(kc@%89!"IH[-mz^?$Ao"òDe)"Lt- ~ϛ/$ jJ?P/6_p@tzm czB ^e+뼝K\m"h'%{i ^ڬ'9˾!qqׁ,(KC̀xMq(f8RGRB`IJ,!t+g p #_\SР_ >yN6I +ͮyŅ>s1L _N޹0}>l@F8- {x$1) p獐 o0a?1 W鞢{PE0S߸ P U]7;GBrk2< !BPzP6p{L|@ߗs8R]'(@^D)p蠠fA9](J\d,),+R0aJ;ݱ<ѽba$oZEl>~Lz>$7hszgFxT vcH}Tt^ 7]KLx{3eI˺N{BfY݋@ZBq*sglo= o uu~&2\$a?bAXDR{<׳%֔ p`xjJ,X"0Wҧi4Naxyњh]tFr'ZPQNVDmKam FYd=KcO̍(1MG$;v lN{K |,[ޮ9~ ~f5 &&!FN,+Pq*;t,op{' R^kv0T"c<=4 +I"hMzks9xS)ieiR  gP!z5Wdq*Ӛv5WP],Jdk6vVnl _a+ha=‰r=K,\-YNC(iCndFTc,={,u`('*{j >t挷 ~r@C @|<[]V0eZvΎf`Ad5l+Aa>{Et7KVSohfDQ0T9Sb&B^mSz?+*p(9/"E9"*B2E_9+^شov e鋰xta!X el'2y; 36ndq~<{?_MMQQTVI>H.BD˘Nb GMY[z(r|:R%jNx5)g$hSm ֫wQ8´#w0/T`=wsm{JtqhWDi]k|d=IOki}JK8\+iFzR!vf;l <١)+:Wòdyzמo<ʣxG, {oCarKBxlo)6-a*OzCSX.d; P:҄ߺ?w$,ŭbcRᐴGߡnP'E:^vyD[.O.;L`` xpGΙ" CF]Ay}KOt.9> \P۲z` YZi,:HBÊTξL=q ˇwPA(^L͖t&< K s dEߝX]k?Yf?) s _]Aç[%, PzGlٓG!pSIN$QC|#Iڇ ܏|HbF/<"GH>pOla~Z5%_"8lL荍J܁CVIF4[RuptpƆj$ BK`d8J%ƈ9hKB[ 8[HԢt}=%1ahPA`ٍ|&nlkKSd@ p,?G\RA0zDL8\Ao7[?ޣm%]vXnaYJU6#\NE ,5ϊj &+sicPT4 H0A:zܳͯuɾݺ7adTC" \o;>^WU΀b_#VX,S60Fv(w⺈b5K }ߕ;  :3<vGuEol#Ψ䑆t-tkr .S TwH "^G^ljcYLMte[ZjmX@>))b(^"l^q/:jX$mc؁?<`M\G C.d,Nь/&7I':vu _Z`DZ8fm߯"~5š߭hrISBz9>j^8QZ8wioC<{TSX'G_,2:O1J^o]b`V&7b $-n/ TGV}6E1C36,,*= 3wxȓs$F̱?cZLkR aoM/OBiE)pt~=zП $;qϿmϭhώ.MvMe{KNUǮ[ Nq.Ǡm Zg&r֕bn$'>c^JD])A<@a%K+vi7)p.:L .Gw'D9[ r$Vg|cF,ź[jґ¼\I+YHꅾ6e)"q> j߷%dlbRT pؓp=Z3.ܯ}@ ٕ-ub;њXr+0о}/_zO tr63z, p V-h5`0IBDŽ2S[&٘Ak:|MX K?(uҬˑ҅z= m{cFSROI1@Cl2JgjM ?zG3H iza~*d6~Ycgtv ܅\ N f4Lneݜt+7AHl_$/'!+K E .~O8K2628&0g<J (ͷrA,i|e5&d˺PY8(\YkI*E:Ap8siǽAy3,}9iǴ#Cϩx4"9ějKd+h${S$Edۃ2UjO,hzX9 x2ZX( dߛ5jf Vdr;K!8RS1䑎ɦkd饕wm͎B/8u3f۳pK)H.46F-MIG ["X^} 6DҖ&"KpR7<8%No99 Y摢}Ci3-< ,fAb:BDCZjF#SV٩qΦuSZ+17#uA9jL[n"leoo hL XvreΚ^ɜoxbϿ4Cz);Btz!l :RF Tytל\ux2'oWnr1` |:::\z쑆 .ĝMH}.uB2#Pd-Kʐe 0~Ό R'Kqr^дH0p^̩N:}e>زlfZ8$TQQٴi5Up?jOf9˄;"~"Hk됱Pp2\K4Hxo#R~DK ]qCj\[6Vy^7w;̅-[4?ĉ}UQR-?# p$jwEM-K68&/@#W|5G%W=-Jb+RnߑE}~z&TX3vW*u6 |O- 6'$ U [<[ҽtstɁ4<'pGgYXK`HY.T'J8pwKggMR*kl=𑄀JS؆lZr U ܡQ̩?unN7 8 Oh^2vOmH{r- "P7 "iw4` 'Wqn='j:ƭ)zYcRۻ4nl-k%c~qM;5[d5ֵP0հ4;.]EaK˰gގCR"Zf7r\Û,p],/ \.)_<,-a: @V\±-pa€(ŌkjsLg4L|h;r/MZr Ji&K}%Э&h,TR$d!9C4xBr#!>E-nϖP䵭.tXQ,YH&*o/VtBMu)a+">Bȕghz[}DQeg%,hQ x^+{'bkѨF9Ӓ f8,ͪ8M/-`lp/Xxn[ՃXd w~ v!(^=@a`4j~9J0,K :/TN0ˋ /K׊pܗJ3IAsmY@<{Fh`y̰'[A9y9U)'ck7<>a4N)gGeσ@c%!:7,i 7jݰ/R%hp5̃  d4<@X΅~4< {@ l]@7@Y3ehM"O'Qvꪙ0Anͼ]Eu ,A!nv Vc5X 9J pw%.VGgK ¹mrWMbn B'BJp9[47\s,Z!sɖkt駨 "҉ yXDfJjbAn7Kd*fʏ,]Kߕ<51> cv;VZɍF^0.j VI-JJ= !n,qۥ+ =\ajfr^U&*SCj}99Cb)1}]2K܇XSP ۛZӧ-ؽ0/Zwj$Df/M%mPoN:_.>k'Tґ˔5 OSSsۯdX;!<Ò9n3;6re~F?/.f331ĖZ-m$x>{ޑed@JL>~J^yzY⼸2c( '9˖5%A&6Y-dg:wk.tlCIg=߳Od:hCۏ7 S!7H>hu1EsXʧLB,tlNzsi KBQ1yEp2odse,ᱝ. qHHqasL^Wr/FBG"4AH򆺪 O_}!DI9 q:?`!e !'sw@ f1!`{4fAx݃;(P@ 37%"?+CбQѠꆪ --)&QxX) aDU۝ږ\hfʱ}ݤRIPh4Ҋ9Loo_bG CH!6ʦ0"qpDH⍗ S %ԄNȴ%ժq]QT9 54ŕ1ֻO(^egϕ#KiVwXE8#}TL{gB !({s.ѝ2F|?㹤 4!! UIR.%z9[d5m6 V2C~P`/?Ʈc+>1-bc4Q0֠u[lIgD/($r^.OEN^ tfQQi(mf#L Qx#J:ƞ@}W%<)EzHTTW[~.jzs<8X59$LdC#hp^_J0\F Y"k)Of6e/*\3-|D=GIšED'X!\Q~ӡ^>(ISqW|`]\Ad:nehKCfhFSHW:~ƙ4'4 6 9۸ 3Y8@$j 2 N.1wK+x0sû3PVXEA}8^%!QU82ԺYs .c!?$I%O;r`ָ av CJo.+1ʙzЖ^uSH5i\lY:R!@c>ah$H tSWf+tS0`ab|@#3QiUU{Ȳrf Ф3"_,MT~}m9q2sC)[] Z~Υ(&I3ȷZ +"?_P ەN"MO#6<4wb>_`8bIkc>u>DedP Xzg![2ZSn4-,H0aNDaPKS˴w Kπ$O\h| }Na3 ݡ|PGo| #~QL|{I{D)Є (x9Xl@^khm*Øb%ĉQ(NI ~V& ub 9BRxRI&EδHa ̏ȱH:> af֘N\7fT OJ|o%A uKVqIبy$3 <4x} AN{0'hy+]ekyz*ƈ Q~YT$rAkX[sa`.40a $m2 G&GAJF&oiyH- ms8W^ /mlGKCC03^2MX)7m#5U_矻E@@@-T+ɰR25lL|#5WEˎ%6{^BbJ$25X'1Y|gwᾡVn u$qDH2JN/{[M09XtSȣht T6~7[4ZA%)8#@*TFہkd/M}TMI(ør;^?; -ĴJz둳2d$Fh؜W ջͺ%țdC14Di(RuT BAA2rVSrbfOdXdSb`p)ۓaLCM xyu;(Ў RR*SP+vafwd)qz*0 !P@̊`Tq>H"nǧwT2;٬mjqahAWNq:T2U"DV=L.Ķ^0[ EQ3 @>C@lܦҁaxoky:?9O-a}he&XMR pHSF՚Y-6LZ HMü;NKI:p$,hGE},SFHT8,WؕH*@TmB>Q j%Y ];jP1QD K×SmP@AFf5a78V5dIN;a,ZLOX JX:N |$r%'M mb3r )X̪P}mJ^t0Qe𛈄yՕiY~A|_?Հ70V\,T ށ򯅞*/u@7%{#2FJ( 0䤂5f1¿t|7V_̊h9+_nF j=Gc~nmSuD g7fTmQn(tl,:N+E} w"HuNXRc8 ~oecX^m%IJL }ֈdz h} B]+`|+ \[]ϯduls .cnk.;zp͐9?  %r)zjcA#X@֭K5 3aKg1#:7;#ļ+HGl{UD#8 W#15𲋈#p9Ľ"P2hjOGIҘsb)>Kfo]KL`jv?zLj,#'0/78SJip_XF5S FnGa ].\)rLB`,LZ֭fErgzt`2rkH18*"P4G#i>45xCRx9Hߩj Ć9kV7h/rraC[~N Pukqh\r*ۓ8;jP`>(%Ms1M|/fU$C\ A;8C6\%_4աr'ғ́qgmUqߤxxI@TqMu$∖m֍#*% dtnfoQDf|O!wg' ["/VE+=fUKa@׵;@|(';GAQT>JQF Q9QwsɾwAW䥮3#w *Mfd'ao좍B"b~¿$Q,j_f{8C [dH 4&CQp|Ac\S?܎S8q(n3\X ao.q}] mU辞(Y*3^A8E/1:QS՞zS. es2dvNˑ0Id1ak$ǪLަ]16*mPrz@ ^0 v* &eU?[d,0b{]'܇5bfD /[]S#fwQFSmSߚ[) B ]i>@@&DoB214{ ?;oO"PX֘ y?T>Q[-kQŷ~N#.++?Bᤨb 3T08eK4ĉ݆C3; ]I a^\wFwAP:X +k.Eo(!jVDͽ<_teRA/VK1(0X@s1h))T kdub$+b!MQF `z>3QZd`=G &PB85l/t MѸH]3]&%jh={yLG١HK8al(!'b%"=>@r,pI#L-Tpc:V!$5߮bY.t+5SZ5)2w|#ӕA<;d%!](7q6o=B=½Pr"Pi{O-<N u~ ܑFmo'd 5Ns#o+iL(V6pC9>yl^3) ٺH]?1's%06Js3N<`Z^'#,'M~bSAZ'x:UK,1H2P>n۪kRw_}P i鍍95١^n@m#I o-wE,Lru*TX)w-JulI$|yN!X~ "1U4kCFrk d~f|1\6 +s 02AE$1p@j sG'5* ˆQOK T 7x#-sӨjo`1i:Ϙ{sV;ƀ ƑџJ<8݌/G`dWr#SVz6EHu  SY QѻQ(M(Ê֢"x,z+cE-–耠@aiY,7F릟[JLztj`R3,2F 4-і W!ΖΙ.X3|cAaz5VݯS/NHzzD=Ď$1}FG'34`G#1Ƞr0az}0E֌[DME r~L pc]4}vDPj:m `mK/UBEt]BOh_ebE ,U#\[h17>Ǟ-gDrU7Cn1ɵd&ꆇ<|14N>톙;ree8N] TpX`ӞAFR QM]ŭ@&+lpVP)JU{G0'e*.3SiߠȪ Obf ]3̈`]։:BbqZ PH3ʍ=\n`@ wݾ1@œ{Ђ)7= xjƣ8p[ >ǀ"?ysxCn%WFoȆ{d!Fdr.ɵ F憈;.eho&dyx Qsiilb3ي5š\`nMb΋օ6q&T6[2}"%6\ ,DRU6o$!@0I6-%ބY?AEIB0#,n3oc6('~0_sLFW3sbZ$16QkBM*1!$EߕL)MZIR?bֈIev^G=18SJf®v>&FxSʳ}9LS{wkc]X !8+Օaί4 a5%˚k @hvb6_ !r&s%NC$# `AË;De%%Ya"Nv B&+֠ Eq MZԋz}djl0| ny 1Ubڒjxu¥~}bǣW'$5;b&ua 0UY))QmكszTeAG_hcK)6m kl^[Ika@ gB4.5B|JNRĩR - k[D-Ð$o y+YSOa #mW H{$d8@`4ZB3I1#FȤoN n*:j1D2KX&BNWbgx|BDy6'oRĢG:<& Oisl`Dԡ tűxzn7&|sEfL;FcXVZZ+5=dxAE(fĒkP)4˂'IL##d W6;)6^F?ckޘBd JT NP2r8bPԕ;}Q_ "G)L {$>Z߂&w<݂;8H_Wiϴ5f-c6Ob5$Km:m=2+o-vBv mӯrMOԑ@}Lh#|r@:+1ZcF"E?շ p:<;dɴQ@YSE]ɈF"IH0l 1ƞcQ>G2&'M8 ӧ BaGLcѲT@4"Gȟu e)ܥSMqJ_\^Z/=]^>XDIN0&h9iYВ(na㧚&JM#pm13)JWy> ]lw9y寕6nNUNho1v%'{dT&z !i@-mN" E!Ć;$_(&8TBq2 ˞6M /8`'[[&)mJ,LJ4UxPFf!&ϵE4_j 6G(!mu0e1  $)Я M* ejۤk̸MX7.W"I6O'`Il&mk 0~S=^jJ,0TcIۻ T4NGXVv(q3gC-TlZ 0;/G>(B)@;!Cё91(m4_`CLMe{UBIe*]ѐG!x#a D:4ׯ n*j?L\pkp2TLzd5ȬpubjD:L}16AK&ߚ%iS8exd$weW ]K f鸪Nvh> sN{jX/xaTx̂/X 8 i7JohH @b94_ASJhf|<$Q ݳ7-@ 6dp+f/? ٢/L*<LdDE_9ĔE{W(v3c`dfU'#"FL|V78p6֔06^R,!mŞH cWY5%پlDݙU0xm }8imD )sh*eart-<r"((=tQ(oi),y0!?̓y<X j **IFU#-6Q6=0cpA$C^NɲA5vA`SC!Ub+r6(j脩cX1)@PUfFT_dy ~媂2-#W8%# 1`6+0: i銄XܺCEz2륷z-XZK'hv 6rĈkDy>!`aT$IT_aDITr= Ɔ`r2Y&6 dMew0%HQl O{R2g;cqR`O-1d񁧱RB{b l]KBhG[}KJ3 ƇY]Ɔ(YSPuKI/ 0y@&0!uB A'FB!ˣyT0XܐAmG֖ǓoVM#¡\0n_i/r%K R%C' 5q#wdwT d DO]X"=C?Fˑh{uF-bLQP1U˃sUx"[CY%\S~:ݯx,yް7,|`0!ZiGrz۶p`>PAk٬?B\s5"ZCHUj%j _%LH!ɕq@^WrT!& źs1 R^&Lּ]B:UWcjN"76ZVbbGO5s9]Xvt K؞Z%S<$!+h>͜s'qm0.(MYk9$ IaK| HT>nƤBiTPFMe,``uכ"z}v&G06.:͐/3H]ÆDO(twe©2n:ThB.P⾵(!.%/GIQuqiFGyǣ4䝻iY,BЬjs15OTFyq= M!cJ%;x58*n&ߩٲdKuV5U9 C|"ǀ Es;m(y1;L8 P~\`?}[`Mtd'ᖧ;)gQTxe m)KHz i* D7N 4C1 Fi iI,C`+1ĎASz4g8^ˬTY]|-<cW$Pʂ-Ɗq;~~edlRH4W -n)MfzDDleu}\Bڮgn.= lH-P)a u Mh {@$F׊r{5ߙ̢VX X%tyHy46an&bV1(:7% 6Ԉᩛ%FTsj~l/4h;o;B?RFI}t<\d,ॊԣdi;BF|4X."8qˬ?G9,ܶᏱ f0Pz(&`|cx*+:OKc,tK K&k6WwMaeŰ0 Daaz!ҵ|MwZ>k `(( ։ªp<^Gd*s.$d7| n)$rEw90EgE..^(= z[,ɪ mwC;ֲ0$dP>rVH]wٕw{{[~w̕fL +)GxO#K=;q]J7t@-;f&"'OƍnZ#gC:Z8FZ3r@%\A3P9tN/#0ܴc5 s<ص[@8ܛe#5̷;{sF$>-<>ȔÅrZzkW*e[mW&N_@\(xrEK3QӾ}3]&N9@n> &a5嵏c@UЃ[{:4F ::360\ul`e 4lH.36&SA4)蝧A: [hG jDzA,J%λz2e"rs,l{p=COd ,ϹzZt2&۴v.Y'HPN zQ2_\ND7O )ܧw~'<(u"FTBY%.Hs_=i h&huC5mۀ}~EhA +-Yz ";d5)LZ1z-2n`e:"\tw8CT$DR;9ہ'ݬZQW}8 5 tk6 _t@iBqI J$}v!rdőE4)+洱y9UÓTd%Saqͼ9`"Q&'˩uZ"Q.h9t8\5zzo +ۺh$G f6u^h(Pֺ"T=ᴾf=㒏NTN[xgeC}m'/: WLBI~9OO- **U(Nt,Z p ܶ0w8O.LHKH]kg,8W{71C[?~i4ቻƽG & z?j♯c"6{bi8`vΞNuŻ4B洒#&?jzHyt9C vFVO;nSG[WvE+5La P6NY&50W ]rpO4qԭRv} (,5T &-BB!ɡzO+'iBC'[Ҥt-,evR;l赯 ,+vu \11MFp]18kw`W@CfaodenveJwc^<Mjg %7tK fНXj4cXrc[M_#ڡb^QIGAۍRN]\ ;uB2"5-}¤FUđe#~쁡*pqXZd4],(q Ϩ->`)9*=ib? WC'l_:A1 {+  ƾB&TFLr*Lo=}6pKO?;[xH~!%9 2J);"cg:.Ly1./3(&CLvهmpVFGm'l[>UcźzxsouHYOl$l|]o̚BtI=?Ll5؄^cb_ gܯS-'<cKb#0/L\<"d닅1 УO6?J d򅩴7^DQYfpPnl{1`yA>s5 ;?#Н#P'HJB8_!SG|  BB$XiAwF(!'7GaMQPbȷ+wjUWib@@N" MTAVXEMV{R hsfn6;Ⱦtf[.v n5R* @R#7>iB*h4FXI*bN1NRb¶yf%h)kz@TP2CG *=H4M¨7(~qxoB0Eoݖ@ބs -`C=4[SH}TEjUƦI-<:z.OVPSGXdlb,>:JܩT}eO/KǤ˾QqUu}l=~^nM跎DSV TXW*9~CdJU r TCbuC9i}j]bfp@ 琴%vi׭i#s|7A6ΆQsR|* =} {ohb{J4KKq4czZ/bi>L–rZ~jRֆD"4 쐨z pXjx m%Ȟ^jDXXtի㠉+lM6j41Y6M5 Om(Thh&('1EL6' ` O-Ÿ́F4|!aIwL=iDi`FEJRѝĄxVobC*FuD9YCvSEim2@ڒMXZc yR#L5rR3;%-oݭiXhzv*OF $<q:S$v+@[R}pXI<-NVϘ qMX+©R)dhz#E)xUH?&q}}n:tTJbVLAmk?Ԝ^R뷄#]y~*:JWNUg^SRa t@ >w%$95Ky)n9/XYaLCR <""=mHL xzrm ,i7z%m…vPCDj YJ1cCWa^kE&M ̈́<46)8ܗ"J]O8Y`2+{Fjn RlYNL@ٌiOt@aA qwD6bF?=ͧdcL^fJtZ3f"9l0"CF-Uؚs0yo+*P[Q~ vK}rYE.oa+"ŗɲڢ*8ă*8$Y .X#>A&D-[&qZj͢*a" 5Zwt\t-Pwh9gzmFN5o@z9RTARImQD*wI# fv?l{sCvd9}(W!tk;(es=O 5|MJIT"w)k2mvj-H8-MSZ$`Llt@9f/t$ͺ\=o,3ʶA84]4}&_&fTf5&M\yaD >7A3'mW pCtg_( p$ |J `YfO@TNb-l zX ]PɊ$IdӊYCe^pJu.|MKa2pÕ֊0DUBQ$cT)=TNNt~I=|BA9tdspyGlCrOR(ШhxzZ$}Eax_'Йg~ٙWz-3 q6淓YmWA #QwIr{UtLf3@)-/Īp陀=f[p cFcQUecgIw'ϊ5 |AEtNfҼ;RѪ@`noFe]]*ܐ`˄$ U 33aaqud(Jdb^@|*Ov" $ҒI SX cUmo~(^Ӵ.-Ty4hfK~:9ѓ5͠Դ aj(%v;!a/J׀/ IgqT,ljVT&5 > ):4v޳KNF!3adipO,|cį+Ks%)iՐ_Aohw|sO }9͑2DQʓ{"S!E4 Ǘo4@ z;ՇbM ɃUe:9U (ak8ʈqiˑ`2uOݥ53JGj"lubYIG7T FlOѠkDn2A~}}t+H`]p./q`e/EDέtD#pzGuzy1 LPU.8ߞf^= м;Ru2(`n#aP[YFRݏ@?T i@[TzɝzoQZOAk.*r눦2v1\6F$'n0Q#쉋-|d ֦hGFA7R@l6E@Pp*yd$HG-b;¶& q[jwZ+]y FEJ۝>@ [9 ieISYpqϙ:`周 ~It/V+J ,F*x gj_[g3B)rdCWXd"cϕGv&c2= = {d SiR?N/F| $.TM̓$ǧώWv¥}L5N . *ŨA8b͒8{VL(m G 9&n^-DiK[%6ځBhfL'hzAQb-#:/))On{sHֿ[h`8rCKnWEn$U[%̭T'q^o7:D_o6Wy4wR%#cE؜ ~ -Sn*+גJ} =\3M;w{`㔆^ueJfSB2hek.Qel['+-uI&J[4qՎJ#}MaHMMhwc[2h#$ꘫT /jQ0lirkg/ut NrN]Sl!8!"8hcfvP1b7IR-UsEdOr@`ZǝO7ܹ1- }7t8}0 lJ7ҐbOv֠{8 8J%bgڋ`&DF$;Z›Q`w8VٓN@nT:ۦ 'p.IyBXI0.>=S#tt0Y) I++l"G8KbE|J 3=53n:R2ZxxکTw?lW[I[Dsg{$#Zƚ>ASef7NIc61yUDE Oh+OA9XuyOa.A Ԟ-Qn۹5U}d5䋣#(K]H_C ^-y2GLH~gO '_W>ۿWZjڜh7d-'X4MMipDpCK9yF`7Au<`*j4^r`3N.0wfP&<SN}ݱgTdp"Ctb\aŚPyLP(⃳{n!W|@R sfH_)ONٝ"@SJ:i[=$hT$ChP*XI)NbRRNZeNE+!FVT-#vbACp] OJ-JOVI"$DDY֥:BqC 7zlΚaQTcSb2[ */\'^5,,} lwOË ġ,!+ۨkW@f]Q/D2$P#yiD6w0FWO%Byil9Ll`"q,N)I"w#XΩiM *,ga>!㙭k[}i p;p%&2qN" .23@8C湐(U$Z MT$ɭ I8^f1;6H`]3<9aCjCvs¬s gUdSB&PGL*&c94% & 8͐E7՛!Dm#5E#kʺ}a<,KϠVݡ`*EoH.Aqx$\VKQe뮄MlA.1Ьc% 8 r)?=N"fCNzك%N/|eyh?tQCI G(/'cڢ9D`izssh\xJ:'ZXI>RzPXA jOyˢ~)4>pB%KpaD[b%S K-̒gwm "16|={Pz#f} (cPIb̙cTj*r5,d K/q]XRSh9!pT4AmɉϵAUC<3)!I(G~&162{ )Z((S&>a G-5\O sǨ0͔7m'>d:-/K*L:ɉ,78S빉+*V:Pg([4g CqVv™741=HM㤸(BCgy >;칅Bf;|g7FOKo D׌96'C^&Ҡa4EOaBpXa1V =Rٮ&MnҎG\d 'U sQV'.sUڧL+gJy'}a<[*WmLFTyTAzbi}` grɃ$1?XSۥC약-F,~wB ,h;a=iK1sjC7`` MF}f8Kp [X6˹NH-5uc)QP3bhذja5u*}hSP4 g<ǑrاtLC/ IVy .dY}9:)@`:'Sg:ĀW/ج˪40>/RA醤.*8<.S%H=,|) Ap;D@@@<`4WD ,jxRZԭDsA~E^ğX5M;_,z,.F]ktʿ]:)"2bAl capq'dlbk:ڢyM| BFMBg ]c‚ϑG_h-/;̄s!l+͸ۤh:plq@ kr3e镉Ln%oWNk?921A; u *KͼOI#SE++R%z8Ѹ)Ol}-&7fZI Ҫ,R 3JqpzKcL{X7B[tѓ\S~CcgMtO@kVb:GZybs=' 6VBb ϋ'tϝ3gF 80'oXx*u)xzIeΪR$6rQWl[]&GL ާ?,#^.!q8eJFY ~6eH%bR8}u$ FBbm r Dž<iъ;+$OwT; p)i /[. 7Co J[VoX ڲ mk)('oW6{sjDV6SAO`-~lUH`+8 Uz31()җW_jͰW4<7@?$ʈ`jOc$v%PZXПxk E ^l>s̳ͼhMϪ4mIk>U苜d>0W/v܂F g灣 '2BBPļ?\urojޢ@Ežy "Vf63^ 'nsM"h" BԼzJw2N0j̣dL}uɒ>jբ+f*(o(Mr<ih-,ͣѐQi(FasbBN,n Q[5>= \2 !bHFy`,3nf0BKm6A2A@މV=~!! U:DL €|XLKK+T(#hrp| G sl5'}e-dM l >+IW7!(pz0  @ yKxWa@ XSdCΡYO4sb^j3lO{_؂EEUXph`0K4LIuiǭ^aJY$| ϛ !oSƣŀ!Åp}$OZx a'u(GyNو $8`7R>DpFn!Ą'[UZ d%ls)ٜJX]h*ik Uholj;nO ~P?{Tr^In(]~*|SI\i))ܦr+[T0c?^}qH`K+V]WO!V Xn~:gSCDwtlS'c#sǦ),`  )Z*'!HoӮ>7F*Nm[K#dhoy5"yE.nܚx/B%tXH5 8M㞷Ѹ}np$=iMr?lak?I3gCwFD1GϘ 鳅'TnB >YĮ~Kj^oG'dj#Mg"̪~mջeU:- 2:wrEr?a32u$R;$ҫ~OG3'og=&&T@xM =j-g +̓\xW WJ~K\5=2{&m/S7sOoO=(z?'Y0OM|d\G>6I=T˔I[q_Ԅ)8^4TAIXz9%?Tsm2Te{b}jMNj&eTtS3߭~[rk{/RX/vZuo!S'W2WhKqlʜ=P*K39u!JO֧mQM6Mb/4%V볷6:;܀n)/آs 3WonwD)yV@)ϑzަyOw5daEM 56O7e_?va 1w }>c(/܂4I4-q4K O5#C`FoHw24]l˾Oeo!2N] zP]Kg?]g{>7 Z_@`ω;TZ&E#bB @۰ [!/0(@wz˨2H{c"#5R:ݐFlp73>H4(8" 3H*IQ?rr3MKqB]}#E z2G A>75I_>?sFqm\iî_T8cE$םNo7VT':=~ݹԩHD $$4lMץ MBQGIi LǤ5 K"4 OZDd{w`Ax=IاG=n% MNEP=׊U@y^KÚ gf_Vq_rOP '՟>,ٳ_/EgvrƦαY6p]O*BksBe&j#_ғ FTNY +^ċ1UC⿴/@38PPKsw dsZuلZ-V͡6QO`y"i ~H&+ߕ7N_ (Qr62S~g%Q/mK6(>_lƛp3cgѧߝK;r6~p Ja(3!ߝ. u]T)g]x-]G@nv\sj~Ae` a- bxQ/6P@av*qĻIp b$ގ k1%pU~Cn<gX@a:XcA56m6=.l֜3?So~8IzpGꉍ:n@$qQ1?[zfxIp Eo"1_W[[|7%xr8 6H'oo쐮_1O>&viIӛP) 7Qg]* kXP\pz{\?ۿn9_ݎT:nqk7y9׬nsr򉿐tO nP? ED;z!pT]AQפ آztӗ!{ǘ{%9d{dnisvS0ޮ,xn^NɚG=yzqr ib=&M"ot|rǯ5-NIQS-M `43)BZGO()N~H ~1liCiS UO}䘍 a͝ߦ{v-⑩nHۦ ? hwd 0!C!M۬v(fX';|iu2o^žx:3sȾcWvs!W[EOwPBf~=-HƟ9㼋 AK55sFw.w3N?f_ s1qӰ{@itSY)ۻÅh4}2UJD>7:L?][rUؠnrn6'F.@)~:~sPG/0YJ-~Ea@=,FB #gA\yjla$Ĥa tEx,g3Vly5ZZ,PwEŘveY)%4|7`Q*qid @l8n!0`);~K4-lvc1Y\O[1W'T<0)k ^de] Hu*8Og[%v9>(㣄(=urW£I ]?Y$O!LzPLEuW.X[y%)b1օ!?^K$;1:3+- LJ=5&+B|WmpeulC B5aځ1Su?Zjz;ڐa(ȚLνRu+'= VXoqȓw(,y_J[.$TNx̵a:D/֊s2ȝa1OQbV~dpu?pã8Q9 q4 sMA{!u\e:z|8E/!/EID1u/ԪVo.Yi/kmơ8Ƴ0 ַ[*MB-9*G[*ኧy5 GR'O5@ ZRS-I%Kv |ma^GN,/}] 1(bT NT:QK~XR)oj wn P$#Q0UD @bGԭvB<:hُ9ybu}ym+ j(tV$D,`ܚ!L6XtS@I3Ⓓ!vژ͵ƣˉۻ;Q[L,+LS+PmW lD4w0܉s#x  º a|< ZZu ]ea1q)Z<^[ v b/*vsQ႔=. juڵlva] ȱe 9 ^Ui9^s>! bq R=E*iGYs_)`|rTM-;NX& 6՜VEt* < BcC,G~= c -Ǚ J4Q0 |X}h_v4=,O:,A9bV$5=f'^6VFhDqvD)ZN21$*Uv%y`[Z승8K1Xy?׿ׇ>?|;%ʧl6t33W.1S y(,_@\]'w\$dbV =^Hhqğ>r%P C+l槮ƃ2#-lcpF#cKMQ4W.#ě eIgFmp A><]Q/ee +WF 1v<='O񒔖~ocԸd>zyQ@f_ϹL;d̸ zq| 4)ra8mY}sE:,*]eˊ\!XEpSO61_%-N74'.⑶xPwRo6zvvan $G<vZDDG+LR\g!ox MA-ȜG"V]ψ5HzB>h5/bt׽=> k[eZ}CHQ i1nlQ--*LR~>|z-/P01T.0kGP9R@q6BΉB\(^=ʑ|{zwHXr* (> ؟H}<)Њ&x~DF>#2օxXB=; y^q/ykx!?b|at$J*fO˜taEU 27z\zg̅=Ӭ\6e)'8t} . 8kF*Sց)FԮ#!;%6[`bKbĎY&L'v -w1 :IJG dSG @#&qh0T BE&&&^؍K4V69]OCʈw{~׉7-{4 qpǘZ`0Dט_,^6g@bV ?* 8k` NA[ș#}A8 ‡PG: kDx; z71F$t6qq?+G gēlsS+HↅWi3"☉ўVdl|1B0wֺZ{6Z녮 :mD„yK Ɂ 59]W!T\`Ҩ+95LNo"I:Y?0к4*,4aS}ަ訙=[C|s]5(7Ѧ2/ֻvJ}OA?{[Tp?z~n[UցN TQd%_qcY->8 {+-pKcd5J$]"Qn0]r$iҨT`bH1~x_·eNQ^]0 vS.=+9vrT_o -hQӶ;0`tx}kA5 ݞ[NݔF3UAAwP\"q:W$xCS& !O'$V6 wmT;d*k'U_}:LW0`^HkFOVR;yRKMQcX3:_xĻA_}hkwfknj™GzGÍEcO*ZI<=g4g'ǻXWk)0#|ڟ-ܣϛ$:t/#Z{sSsfNFǔBvG3,rO#DV~Xr 烘K_Qޢ]tпtbq3tu07˸**pƾQlP}@&$H¼oY PºӖ>bJr*,v)INߌ yYoC:xdkLJ:$1+/>ENa5x_M,l␅7 zyMQSm4 y>΃ Ӄt2z>;_*TJSUb0SxP]Kba,iRjr CEnv!?+Z{!+0J,])ڗ#&3ެi78 Pw-9hNGRsea-@up!(.Vq;aXvoUX~a V`> 2X]vn^߁7# ' -` 7ii>rfa*nqû~'@8 \aNUg$Ά҃7Sgj%KůATl o#[.ћRxq pzWthS$Yd'Gvu @2m8Q;%@zZާxKh6Z^/NڻOVj;XyܟRxZxa2dEh$8_ֲuvtRyg3E EGo8RѼ6@-laمjJ}\:-7n`rKc`i4*81j=e$KS[3NRd7sgNsI2ߓHv̅DųC[rlqTt ~p/ us6 Qh~`S"4o)xE TTi[϶[# Az;O2 $}Yr ܣ Xj %Z @W5}vp|;uB7U> a7J2(Bw:s_2toUt= P;#DJ3|RU~u7-}68≯=}U-5Pjruv˨l|REM ~TK ZUnց'b1bu7j6%#@7un-%Ɍf^e9[v{J̬-ɴHu_71|>ܝ6Ș#rHXq:*im xSbccrP}U]8bo<崘OS[ES,rOn٭d:gxo*(;%^3:ݳdDPj#4mJ;!8 D'@07}ڟ7S>x97iO3:^zbLiL*8Ml6Vq)5Z .עßϦsu-7w<+{H|43ؼmB+;˃>Esxvw}9\6CX.ATNLkdz#mG ω\˘ Yt" JذzZTVnɔ6:-2ɉ-Or6"DXp#RUBX2~9j12*EtB]yJy3.7KFQcNXvđt-"B`#6Z4R 9&bIԵ]Vzh|υ5T2[>&$`7BCC,$ 5'VjvbȪ3cI_MjZ۹4*c-Ŭ92w ?9hpى}9 ZY w6N,G Й>-ts'~cp ?VL7Vpfd3gI7!ÌgpW ^bơ4 A׶0~Y ( rA LϲS?T&x.3rz$e&91YB roEzB>!x}';ї~~?PKLV3 o PKy.FSangular-1.3.9/docs/components/open-sans-fontface-1.0.4/fonts/Bold/OpenSans-Bold.ttf̽y`TE7\u-kl$Y Ih&İ @!@DlFDD\QqDDFmZDP@tQFdq}QIdOL/V:uΩYqƘ X3EhM4ઁ?7hQ]溜Fa)1iQ-s|9)._,Y&0f=;Oݜpilh^7i|f/v״N<g:}꤆d|m: b~LkK?{ޔI?va0g /N35oOc[(!߅qdΟ_wq^OsdD-vlݼ߻2x\|742L*f KgϞh.OXKlΤaÇXȨ 9VDa&ff\-he̞q${sPc6GĢǺf/b.R¦᱔c-ZD.W4gxpټ$b́Ja KŒXg֍fYe眍|xnAASq/;3ɻ? X%ag3sˍMJfy|ZU^#&o;;qm7+bw v/}˾g?y>/k |4WjKYހsҜSYE&?%ow;gDFxГOObwM Z榅z2^y@O/x,wJÕ~׿=xnb pt:7` WR$WEJʥQtZY,D9+x'(|R}2d92|Y<__7wooooi.'},BeJrffedf Κ55O%Eoii6cLE)YVny.Ĕ3XF36cLgy}>)+Uiƴcz1nL bL cjjii9rEmڲeLKUK4!n.}>S_͟4ͧ|s~Vtógf8ts~6?秧>=OOӫ?iO{}৖3 g&{3Ug;x&Er&cMi]Y"ICnd3wvK=X"<Ž|vd>Nf9,21{ub7ŐQօRd]Yo9UzAza}Y?֟] KحlʆADɪ(VFCΎaul,Ƴzv l"ֲuv?{=-lΞbOgسl'̞g1il7{+r?v=k`S Jv{gk6SI:T&ϐ9l6v}lʳxy|l2aq7rG.`/׳-cx˖z>f IH#.O/L%׍gMxvs/@"FԩKƪ,Oj.5V5]*/WXJEC/V>:wlWu~uiߍM:u⃱cq=SQ|b\eqwi*e,EZhd-r:|bVkT9lUlD'i~ش]ncΞf&Et|RX_ 8i0ٸ;־AN^[-n:/zb~t[Tz$;:N1ёa|X;ynȨ4֭DŽ^[I4=x N,&@/M=i30kl -oD]ϴ]}C:}'cij}BWN>'7EM.F+zT.x(&A yt})B0@+!.E5abBUk&^; Y;嫛3ekM{.VNW=|OxuU[ ,+̥rNVJG_N03ka8ʒќ'Wj f+*';jBE݂I9;+嗳5^7U?tCSh 5G>sq)A3[AdX2>0wD"a@\9poaH=?JXE7aWeJC`0n79-Ըnɑ![*ݲ=#Mh6b2)1,56ԓc)v- w!Ol$bVJ=,PصX|5N|y-u_}?a˜}O|^RU[fzTSm)VHI }w'!H},kEN;#3vI&ZD/OJQ/.r<~߃qe/7X]=&vjؑ~0죪CC?|;_g߻_5u-f'v`4}LM n:旆҉I565*̱nZ,@r淞Sv CrzV4,d;m lv93=..HO.HPc/0=%([յ[yYГ;2$'^s#3u'y̼[Y׼o m{a__w~OS׀U<{~&{kݟ>fɭqԪUd|j:齶SLk&֧{/p~tT=8ߏ-t.9M_Y2PL3jg!b k`RdR.x#(0DFpB59@+-'4KP 4L;S2r @>͙7X;PJrwRkvŃ6Gcy!pSqĉ#_֬Hw}w\tqťU$6>jNF:T|kf_X kdd]ί وl"P)Hˈ9f|IfOZ>2Z( 9ÌZ&si!{J?R*$bSg^ޭo,ܟɛf r{{WT!νxwM#xv:zT=kkW\9߱`M<.=|N7~}g[iyq:3)Y`Џ-|YB9 <;6P8 J\b1P*K. 1'U4l3R6R?16zlZA2&vէjpߦ/?h.P3N)CXR K@Nj &UXUPr,Óވo|}S֯!J[@,Cuj RA!]2w\H -:6ä>aI)2G3 :c/YyilVlzцN4,yhbCc˪qv cΑӜq&!3R/e`(vln;mʋ\i%Rƒ̝=qҬ9$ ߌc*~#_|[t]Wa1XB2BNL9J"+X#P!؇2%eP+;8E2egXANSH*uF@Ԭs!Xjy}u2eZuV@r]q[ fp;'r𠿌 Qd}[4&P4icC ‹jvi z|ӫlkccX(Ƭ`iNp\ln24VnOnDǾ:eAIa64=SHSPr1Fj[Y@Sijǡ+TSMPPR0oF!//nREhtϪ׆G۱wނm7=geFm=~7v.=޿gurI{+N1FvdiƏ<ߺDK X27 xD(U\(ŮuqfJ據lcB$Az_I5X2TSh#tu]`&8g0V&4TW)ͿeK{Ne_3[`x0m4v̟5/|_yq┙S&ߑ{?ï6r_mkVZPW=| "3nKD;8LCx,WR?UTd*M ! Ds0{ %Dfjxl2 ZNGh. >J?ٰWIQ`@B1魺"<C<%IńSgJ<P}P_8CN[lL/_vp 5۩Y ҕdqˠTzi2y[~E@p˕51_Nnp[㤉巾ᎇG <_{vs+F,v+(tP JAxPЦ#:dB+fGNh[4!׌*kBFK@v =@g=VH B)UK V cDK0WbyDm1ʻ#SR*1+gk]Ҫ /-hX N= 38{8pL r zݫq:iWs|x n'2|.o#.G5w0(% OPhw/@Pػ.d0b\ yHzH¹&J"3ƛRW ,p/mpa'|xWf',%h22-Nq&J{=nP˝Hj/G<~:d]9PN2sfIOMqw̫>>i<ǯ;{S?'ϓg+N[1Ҥ]&6!yXxNpսw'e~m[@xbӱ}ii?86>9rq03i q,0,vMALS,\ZqG 4G"_7K _!ofZz}4xcʹkBG'!HRf>˹p7d~!URrj79I0, X^L8Ѡ #kgebنYn/?yʊiw?ݛ7/כoZbV̝w gj\ TB?M-CԦQ2Jb k2Do-'LSb"Wk!&Kl[ G<t*Og|̋5wFӛXjhlZ [A+XJ#E)hY@H](y1<$ñagoiN}~5>)6H x b}%;^,it#D<1:ۊ v:μ!7r3Nt;ʕtWu}u_`oqOIJai'ۑi^y`7nLXwS>=-3p!q"Cu*pҖJ L8=XℱPlM;Io- OrM*cؔ#0Ar םy>k&5H}tOw0B/c:5ѵ3Mk'"%,PM@cer4+&$ѶfbMH.L@}JG(=B% lwa=*i3kո%1h\L W=n빰2gs  Gġ &fR2d{|$'sgZ,IcS6G/@P vz@|rM_o0-JfVYoY\ﷱ.ȺX07C%b%53&EGe|i4SjJ$ArdDZi%{%ͷ!;,+jTc^ӗ_KXI!\ğpVo/P_A,Ԙ%f6% ALDY|SuW{ X҆K9|~#m|ֿ/vB7(;AD37gh^-浑ҀaƐ*Uc -li.TNiJ? y98aN`xQ O(E1z H*BVL7dix@cA;< 肙*T2 bN' JJ]:R_=MA3b1 I d1H,U 3 J`iVF{B-̋I'Nމg} lw[j U*t=RIqxޙ ݕPQ]՝R`$9fPOj8*R K#+Fjq:S|t\k_:yZc7OL$P;Y;fo65nm|u 7ѷ_ݪ^{@E;n%WݿWE|U쮐84l&@L g2襙4pǛJnJPA$g^7'h 3Z,U] 5vƞ29ĊmVx/W/U~i3OiT-܏{?SEQ(5ZZq_C;sL,PӐ*1XtCݠ𯂻%ؾEiOӦaowBf⾖oBp_x^ŭ54 pdLspsnBlגIPMvr@KMM9 f4'դZloj}ͱl{߁AwÙ gvr>Owh1-mƪv*Y8K|rMIm#h:.YUPr |`$\z羟)6ȹw:[7蟞RC9v# 3΋lhkElB` CLH)")-w絼*?wI?I7$%4"ٰqNY6d&v1Xg3ΈD0^%<SJO g4iuQ Q!Ui*C/!L͘& .qXC ab:Jkcw4 @6bBDV,4ՀS`φ h\&=g|7_&ߡ&&c%y=ٝe^gכ}ΛY&̛?it7^v-goVHc~ꩧLV|xt=ɓB[-\/ZPm@·X~%/6g UҐ9°MQ JC.7\.xCnalKv&v(zSUco" )@`Oם[ qyկO: 92;u2.@u_䏄}|X9X}HTݥ7oDSwMzF֣Z9X X4dr;E)R%vʋn^Cݺ|NQTJtd8r!z9鉾b.ՏCLZ AQđ ,?}!.%ވpL=0{pͣT^ M+]*'.>./xeA%es훻F}Ǟwp]p(&|L6>U2\6~o,@Qv`zoaZgd  xE1C@XCa[܉bRfا_ᛯL{-wݸm?Ҝ/s5D~ c m+A fl;+%?&MpRĠKE,߾}ԨĴ U&\B<(4nqxP,\L; cI5p;K 7F\g#ZϣcY=ax;//IbLg]5K)j[` 4{8Z0 `9 b(OK5Dc sLSj-V d+kp ejRk }]WFfo+efo Xcg#; !0DVZ&|dI8 k:.wzE. 5͡Z؂xA$xA`'D`o# v/6+p{ilZs_yMg#,L0l̶> \lsyaZ:i-bLmEPXL;2n,20!c"n?bhppQ'#{7H>A;^8 ` %7N] K[XĭzB'UDo/b+FwS?[;yzȮLc|.U$ 26UpѶw=EV{JISf FmdQA (1]N[I&  ȤqhvEoO Jw+ݎxwo3IdՆM;sY G8YQyHL xnY!;&љu 36'D,$opFPlϏ|5 P;%[fZhiފ`8y5~5kd uq;ٞ1RN'ᶭi"UWl_'vզ.ݷUBiƵG=݅{uM1 G%B3@4"3DdT6^m ,"AsW:Ja6nfvЧQհFv+¼+\FUYWq7_o1^2ۋf[\ֺr:_]гGY v&Wu_*MC!DB&bnj}eq_&ĵ XR7|\Q([Em,F9(X47WY}YdMnG`Gk@^s뷿lմo~_zIJ-dLą(Bd,dQY&2Hc 3mFjZDm/!K.~>l^lٳGK[6TL0X7i 338nqaGlG ͫ͞Fjr|0ہ}ļp<Ɠ$`1B"!Q]p \+wդp@K5 Q{d>`BBEͱ8쎍I@FxZp/o^b)q Qċbb:k5:@4"@W'fdRN<[yU>i_GVxnu.U߫Lkh)IפTi7AkNeX-OW,+)>N7O}C H=W?@?$11< {'! 1xՉs8דÇ, ~zuŗ\?)~J"0G<;qvB{@9rD\u;<.kg{zS& Lj1$,ZX")4('VJnt: k9Z"pbH7/ 0.=d$uس^Iy7r!Ͼl8h5?C]~Y)c4^A"p6s []Jx>noq|PNGo7r/X1 /vҐJ~ ;,J=I8X qi?I 0n&[E/c$'#gL*p`d9'+4fM2"#ˋlG@XꕳkZ[V3?aM_,{XjȼS 4`ᔾ[ `D@VӦĔВ*b^HaidvMwVцC%tz^QQ#-慨nX(v jR}C;ok>QOmY7G0]+;>F$r1lg@$cp'#l0̰ '#p/r3+,i@X f->юFez!>BrZ (#V}^{˽~Xʙʷ#pkgr㪲V^;uaM+u{dΈ x_YVjêsg7 Ӯ=x5~_sFuQ+w;`BIpW 6C! @R'3=S4@`9[4&#<ҷoXUߞ#MVy> kp?Hvx@%‚(c:q)e nxq pѠXpvG.[j7:톜EÅƞ/Rd.2ܵrdrù'NI맖T/XۅvyS%+) N%XC)}9 3G3\|›wHӷli[m٦>V`oUZqíD:%oyo#ԯ6X d H?J{oYN#?l6e }iƫ@$"!JA#QIA;Ԑh@-*hD+2<(䕼]pZ 4;v+  <]6A8EPt'Rle<Ҕ#oOS=6ōow ;^96eqһWvxv^Ψ~9aJP2A٤(G\0@paQ<z' tDRQ2I-j~{OD/>SQD ۖí/̭c` +ٶ#Y"@r2b&wI~ h!Tr&3.-=Q)y2_}UEc+Aw"Sd0DqZdJrN%x;)k @oDw,Nd&xIX\o=&^̭/<;=_qUźܰ>Wu^mhv+fiacܐ7S;sY3^NNL@nU$@DS"LmQY4gsEg՚В)IҡDJ7Ok6_sW?n|Ժ'}&9%*=?a)6V"Xume(D#hxD41^@D9LG@&MѤS-}6J0{GV@A[0Z')*dr(!툃*m(@/ᤗ"ɈJ$^YkI=1a >y'*t9Tj_ƎS cK:a= irHrE>a>1^Jx%Aɰ YҌ'tO#K蚃~!qntTCs;b\eIҹʒoZ1!z﫦cL}L#ḘL{+X(h2!ho$/eڲ 2ac8S4=61SBgs) B@`G*Wn^I۟]zMpm=b&:K* u ^zTN{XU]N_qAey+fYC7hdf^KػkXm]h;H]L1D\Dx.룘%R(Eg{Nx)ҦdX#sJ6IH"E1xbcBr2IJ1d1\&e0|QYd"P :}2ﶚ{[NѥhgA߄ "ѳv =tb|ۗ>];]_\oN4?ڡ W8Ůl,G8ِźa%yqF^Mp#޾O@AFvӗ:\LY)ix3*"s `r )Nx}@INӑ1|GAFB脜'nLpʈ'@H8^뢄"}5Q;mw_uX3W²!ٷ^]$/|]x?"o@u*t} :_֎uԮøH;=`iRO<`}eG*J-D-<tU.Ky6.>p+oi@ߟ~Jʜ|Dtx*EZz/cV($ &#fL4*:AANTrK R':&R/%%fѕq68Af\::۩}3NgS}w+o嶶+v6B[Cv>?q_xWkGZ+/9N(4P& ע."^l\ѹ"$Ժb'HXb"RKD4#LQ .r0R}ށ>HQY CۡF7e"nX gBr)q_D~?ձ|j.Ns\X{ۺ3'~IDF97(mI3>4k?ͩӿ;ٺo;Nx[12F1@W v9sS;|]/ 6xc.o_y};qN(6G?^#4vKZM[;_EYkיI;"̜-lɆNl܀/ 0AZ63]LOdcl3'SbI'9CItD;ȀI-^$!کJvk_>+hu\acl?+f.l?w;&+[ج|;6Mߠ?~;yoY'uBP{aAjcv ~ku zyM\t}}ډgR;l;Z%G*(,M %Yv /^*J*PY<վ HY]ٿՕ `zzꇡCX]%+C4pdFPF,BgBw[$x͈~'N4~-iwjw*(n\S}|}xM7;rӀ{Y>μng]g<E,:10>''>H[7"IwiQ^:ufpvԹVv KzLC0%RY !9_3" $ (-(z  uP:2)N*5j a$A &H j4bJ8Gߟ`DZ#G,s] "[I79a1h9^+6G . Qг(=ɂ?嵗Z4LmğF1mWCzeo?Cc<[di?NB;*Aj?Nhy2{&(ܙ/o +/rnUk"O5aO5u]/Z=>K{EeXiboLܲi/ g9(˥FAlv)sKsLM #+d6Op@*ҐSL#81 |:Dt`e1-jP^z+e!w )]ȽIYPicVB1ïFjפPĨHzuRIڴTi4T@SQڏ]-Nd+2j.cˆP)Fߡ<'x^P?]g{G?=H(BaEz@oLإ|a*a3bkh[Ρ}اFZⓖOOc"_CbD?WGpw5/Fj7waQ.XύױlF"ޮN4z$ R$GŒt{իM/dŲP`v'1X0 {sD]&]"]o{{ 5r0f  4+B{kJ>0ET "AEr-HX&J)2;gɲrί8Ƨy 9NWw17h0-FtBvHuATshnS/oh1^=5͎>hX1ȵWvf>Iix`JM{ y" A}yHZ*c  $U (jTNi |q,Q(D'׏9KlM:!jZМ{+%QJQ(],HdA(]< kڃpS8pJQ .o:SJ 07s [ fb5 ZD1EL t"֝HE>4E36Apۛ,ak=x-ִe%~HZ<}@x+WFySRA"_E"iFXhځF03_ m'& aIG|g\΢F1 ?IFκxob-.գIt ^_b',O#2r}ž.v²_uwq@\_$Kv#Q.j#2܇:0H+E(*aPЕ*JTO{0hy942jCk^ۛFy9nlA4#)"\-I9I8"+ɤZ{QnQA9M 9^2SQvѸc6\ggWg ;)/@ C(P&kRa? BvQE C$܄FB29) )dK@즅ʌ ؜ 8FpJd G0rn]ݙ ]Ër^? X*[ ^'iJt:M {~wqaZ*%[̇ oTw e$[m-MPvS%LJ%OioHЄ$cBBĴ1we IફLY.gE"ydz"~] R҂F=TǍfNc.~B$Ob.0F]\'SQAw=L+bM|4Mgk65qU8Obpc]vNb8aܵ sRrx|OINheS.^uuo)#Rf˔Cӹz|vmv>06;of &ݎwЎDg<0WLUf7 .ilW]$)A 6p'ۧ|H~2OD8ض'{dEcPp= }zi{J>5o=>!DٿA.hﱙ{l~ $y x] ,ƨ c/T1Yq`|P(=*"u*Gw@zT4DJW0pށQYS3%='Z:"" "M4E@EDDdYDł ]DDdDDZUu*bETU>yIrsA$eȼ<mj*td}2OwvN[z.{v'n&ޭ&-)m)RCIGrm-O5y1B2f,9"&T9'Thkf)@ܴm*oy[ըծW97rD9ވCz1`~%S(Fj+;%y i𰴀؄o KjyVe Q?cAMϑCXOhx9C˸QEmk4͕'Fn}gZx;VA3q`Ih Y,7FM*@(̆C3KnY)ԡl7mCɠ;*r󱯧anKa_\J:oED2БB,#jt2B:LưZj|p£v]3Q.!'kGKXNR_á[Gܪ?_~P-dA K5\8X$!T@)m* r&1pAXY;y(Qi96t '0^,Hx'~]l ")*F W!v p-C;!.P(2HaAݻ ҭ XQ+ A}Я_eF}n6lo ~~! | 7c ,NA\B6ݯ'=׿{g+^[/k_{4-?4%w*7A^fߨǵ7{KuGqixOzH[(䙚zX#ID Q Q}( ߵn`܎ME쇛|qy {>8տ"x M/TBkE3μUYЍto4w# >J[g6?w[c~47?x "p,JM[sCHIr}:(#ק1tH"HXWCH{6gt\E!wK4`OKӸtsGNIn}bR+c%K >Fraݥ;EnH7 =vO(is֍/[".[<̙s™ЮnX;[3<@]Ε|Fsg03G3{g"*=0}Xe#x i(Z q&ar쎇(r~qbqf-E!u5]]G{սU8$/@tbXk+K\Je&$NJr#WPAnnY}@⨺4V6WwS@%#V-D M'2R,iP>X5R2񷩄g@PS%bw2eaUޒPrv҄~g~^䊏?^ܛnaEx>b͟0́ZDlyTtw*h!3*"W ۠&#됽pKՂ K SAm9&p%k#"@ߩ_U};-s*%-UfjQ57~7ݬ~RuHDݠR+/wΨYaeMges#/nq'x-j9U #Me/1kxym9I| ۦ$WRǡv##&ˁ4J`,|o;:h i`Dɑ6X4HE'6^=Q~ܿ˝2-U)˨Qj&X]wGU#ǑT0XXU%V 3Ng5`uA% ҄q!7˜h럐Dxo輂8t /LF@Z &IH=9_cW$Op;lQ];}GƪSWVpO"5$9 h`V,xTYl )[璣i 824+QN]T16Q @'Xlsť7@/&ZE  _TW{`o|f1 v=>>?Wݯ9Kg.Yv=/޾ck;U8ǍQ{˖v%<-:QYg#:#~/0)Ѱ R~ 0HV; _(U)kchQ$Ir|a1"Q^0s@g(C%<-wW 3a_1wmoN7;ЗG61e۩.9k7xiǒ?s7^tG$l]ٙNP(# BLjN5;9$r:j!춡qb0{Y\8hmnwޫO,>ozNuO#pP`9d\U~:S66c[r #[<ާd%-yqG|/t| &ʀt*ΛZ+guĩ{oL}\/T~yώ+H#V@Ru[Qe5;$BZQ7BHMpmC؆6:){1 D-{' '40A[W!SG'._aG TiFA$tDY8R _Z^yE 6/PEj S,{KɕNo;Əx 3&^YYy02v*q=@֫ { 7o=-b>/"_/([u۹Q 1/n@\{קse)bOogDf'l[QL=5M1H!Tݛi$GDP"1%DXW=)a^/rv\+xSi'c@6\qҾ6XD.aϺ;V꾷Iq}wn'P7/_^_V/t_,taUfo`#gA:1^&|q|Gع;V @{, n Tcn?7̘$E,&W ~ d.Zyv)YVA4XbڗoVeBn:~= U ag:L|@X )L LLH\`틧h0R:t!"e~fV]m8zv2WNt0,Vx ?w>{G0yF iP땮!4\gw~@`LS%LldxLS{BO3\*^zb3|GkchkgȄnY7κOM*,Mjen:'"גAq7.l:pCarogM׭sFUiw>{Ppq}Ueqqz`ãOqz?n^k >l6)x-M'F>67aOTO+OehNrМ9 <xs]{\y޸+G vث¹K_9;X&!%7n]Է*XΪƻ!7n 4M{~VCn @T,jRV 4ijN*\q ȾWED-|80CӒK_Ut a&L]{ %1XQ{0w`ˎnVЪmFa{_gΜ;Uuލxp&^a"^BIkfê&1AK>58V=PUYzHmm|ZM2z{FXK 촊j:׵zDcvjG}4:$JNRT+ *v]5Q 0Lzt+ )m(&S,dѸ$X +m#bY-4-a*x+)`v;]r'NNGMjvF٦}])k.1 c<WZ飆a۰(}/Q zu V^jw>׽8Q2\9'!;7\gcn:ŠDtF$ QJ4^27,C6R٭PlZlA[3rBIg]`aF6LrH/SM9NQ?7hy\VbX~a Y6vPgZQB+dl+e̥ 6BhE~,}0e}TzDQOx>xUaBY"/$`i }b-yݺr{qkW}zZ~uѮ. E=_ܮC H)Cfk˼ٯšYj/j`d⣼ę(PhH3rs VDGaq"EQ?X2^%q'}n91Sp'Qh~Lh[qGdONI/ۄ =W: $X@*^ U n}No+6Ft/RGᛵSٕiS.l:uX\u?;X{ "F/~,XW^hl$}hgv0A"qbTê  koZEG{wMKh,xCCENqƢVMt[،[٘@&)$M9?g*=JAɟG+W3V'z4؈@[E͑Yv ®XYsP;yș89Cy%d;ح9މ4 7" ޵qU3hl]#M50 ~7e%59d &ˠ րXh ^rHo%q3XHP4UB0^'" <4æn{붕8F63`ʮApav=ھ:؀%#Cp>}V.>6}&E]t^"'I#\0 ֌hH% DEGd9>JuPO_hӿ1~107mx)R8Zj%#vriI<ړt σ˜?/ek띀,66=P](~g3/ݓ C16sV`1NXVeރ ~aτƹoX䋿\K ytw;|XqpҌc kr?։`,V 9hq}r ⹠YXMX :YI[qT* Wg۾GQ zsI0Uɧ6ZgrAF0./g 0 .WB A 5;sPWal!ҜLSC鍍qFeN@wZ9w^BJ|ogUT-e>!1 ug."2|Q#OBx Jje|lNج a䮝i Aªl>q&S&?^`=Ec  I\B[yi>ovq-2hoӢD`5#O»tcV\0-%퍧~ܳlS8R™`0Z0gܩW,yED~]XXKT7u!!3RoesoDQ6`<.C|A DU}hʑhtpKA1V]#x5:\JjD o;GUM^8rbU߼K|g0mz){|.td=` Ȑԍk9k%;@tVu^S]ʨ[r[託y_ZO6(p[40'Fa[dD$dnK [50kh<>krf%8TA? Cɶ%9ksk:c}dڷ,6]&U4GU C,A^v.0#d,-6b&ò 4Q*ڳγ|™1 D\ c *}@n]4|#0TiD!G0Noe@ᄈv&1fpapH[2fL&OH^ plhi"7\(;FD!+OD-1`6߈4 " 2"g\5Eߩ}矏7f6Ny ^Uw/vE whT:0X~ 0]1͆uc=z ~'r=CIzr"TsՇX}XCj*1,i]KFi@~= }c}n^;5s"|,\cv\U]v\>>s=~qci1-νV7ee݆JqrCnINX=3J'[9a7RxwhHEX!:Q߀'D_21QMb|!Cu`%ME[xUڪLl #ecW QTz'}0UQf]ذ[nz:5_酏$@ z*[5964[j,Rdyw6}h)D_ ezhW;J_ NY#Pgkk^7d&?C k?cxXɻ (:qCxY:qũ -U5hqv'X*ܒGpqv@Q@ 0Nt"pX.to̕r!O7=Nm|ⵣa6_ʎ}Ks#٧ 9)f;#;`LjM3wq2&3 "ytfZyM^s=̊ k&Jn3,{^0y̟7zo^/>񥮰=c>1r98!@H4qqr,hUdOok;v/ش o<_el_B.7#4%/66϶ *L/K[vl^sv"*BɊRD Rh4(ٱ M҅dv3 &U 8Tgf ށ* a5uE:a/ hWCs6h7YEY<~~'wlbԀn (-.#*6g&^P ŝD 2:HAA>T$ rW.A} #ℹ[+}^ګ!]tߊ:OD΁pҸ=sq'& F;[y[Ƽ8$ºD\<@c9))vH  {%+J>~@Qu @hL(ķ:G8&.3c勓'-xm#"e>#MC84a$Ҡ42 )C,y\%8eX͑9Y[keƂ7oTΟ:'|S1@ÁZd{1zYdž>X{K\ΗqcՍ +`7[n"piYlkY0v)yi\EԲvOm: ruQwܶF4kv +@f4Un?dαp1Q%&E6iw 3PR . eyrXއlD/#A$TrRKï\bU<p .TՃgmY UqD]>ɫ}aC;O[US`YO;nޔCV'74Fh3|d %F`PE{Epvօ8f"8"vu8Mgyt= 8|PP(o9Ԙ]_*>e~ ђeS_pgu׷7OjF"S-es"÷豳TDB29Gq4j9SMz(䥚HX,:ЉLM_bm9S6Uѫ$ո٫pN7?Ԇ5Vmz\!д-`\$l4 ά_ #ŽͥJDp = sg$0"I3H7yYPIlMU-0T 72 l[F25P [$w 1@."-:.Gʥ̯@Ī&!B"W0m vPשޟ:.|?'٧6^rH PR]zj1@^1xA'FsD ʠ/U.knnIo: kulxSQ(IIc0Wժ@U\>ggav$,pо HN@#den:z~שncЛps,c\d<_c~iM8d3T:%02?Z?f7u)ZNPaͤq"q_t6(pea6'o߲jbj1ݰOtfo舡vqȯÂ֪$CLB)%򓌄d[5dGSN6 @/e@4Z#' Ļhr&Kܤ\2jT@<Ǒi/jW^j[{KJF4ݒz~wzw]ZWx/[9u synڰ;gaTktEfֆR x8usDns &ia״J ];=S' ո9fu/[U3Vrnj9@2&'d &kn2LApd'f'O6W.dI# _?,K'Yۅ,9 d.QmMGAʇh4C`z U 6k?Go=q{Puh_9ehedHDZђZQqe۸VÚ6+?j@ eMB]ȈW\][*u^ߙzZƀk]+)/AYK1s''bw M"VMwVKZ{\ޠǧ%vbDKuLJɑtdtRA'̃nO ~$aBkgx/u"a69HR!-2tKйԯAx)UMo`X$#GᛰU~ے{vD_,@]sHޗ\m3ߵȘkucgKw\߆޺ es#|Wd{`jm'=qg}fޯ}%c\#t':)[5ѓl l|PE0v_.vd8w$]odS4mJ]byiFF"9%S}}cb~PALA.m ?[]M6T6t)6]";3KpltU7@'xDz|M7[ޑ\_=j7Ϝ|Ϟ4tvmotO=ҷ_s>-/f%O{o.]҆m _Z f,'95])V~Ddƚ3x ^1=hY@oZgLgoCg|h/Ne!LbE}F+,$$+# 1t2dՌI <@nxSgi'ꕄ9&7uZ5*zg(vk'%ЧCT f"K{{4Kjt'\Ds{H~')X"H9pϸyЁ&bG5Tye~!wl~5H5~sM7jHBhQ-ק*u}yly㚑_l_x*ԓSnL@y7,2@|(rSe[sL˱$$[K%cl Y3=6!9J ۄDeg5s\{%vDdĺWLUWnݺus㚡8ն]؎Q"9vb r@4 f XvpA]0DS}`f›[ se"dMP\HT-3b$ zU (bQXW}n]rn禪TMi%ksԒ=;ooyQnB v}vv!:|P$&\;Øw) gY rY6-fbǦY{ͬ3Ҳ1b_(%Ff¬=ͬA3A0!ط-\Z6 =JϢWwqU3.8y޽˾9ȑޣX}..ͫ ^#YU3r稵`Pdk-ԙğSl'mt+` (qrX4n@xPW/īZthZ Sepy]IE@b,^9C1<X]w?T3>jZ_8С_\d霂zםq:zmic6R}h_\iЮx60<v!B*X;x@\U.QsD8q/ݴCcz>0"<4jxDK̝}╵ ow*ͬT;ʾELTwg͟r\Qb{GbFU\oMmǶTWY}ܰKnN{3d{<#? > +p׆d$XI-jXʻvF6"\evWUWxA@ W>x_o';^;;^;;K!\/ }ۋ(N]z ޢ=qHf /@qZDr".d]B 'j*` ŵ#uxq >W>^>m6w\ @vڽjsA5:!@O?_8O{YBkW+{ָGȑ]~Q<7k{\׭"\i싚ҚdcS"Rz)J@𚄑Uދ_g+UuR76a?cT؋ӯܽ~#k+Zv_yMJ?q&c:~AW/ڂU{kZpI)gE{,t^lѦy).pTFfQ;.h> L6T^a 8J識vXDt&AEcB1]UvY$YUOVޫ32;sżEjZxWj>=A__zkؘ1;l`ؒJp' G23JA)T`'YhL)˭Ĕ`%$g MeT f$Il\n;0Pև $ >겋z{}-)7&&Aɣ:5kEKLF 5E~Ip% LOh =%xGXD١8)@2@&0 8q}@C*ڂbm+ cmQ>Eq$8Y-f ԸEpyOq`@0 sN3DyC? / lQ,ݢeu+?7\x>lx|?pJR̞v,;ntPqnsnr3C{:^8GeZvM{Ndy:L8A6ҴjXאk c#T).>cрq^rǍv3ϊFJЖO->e3͟dب}4Iv.r.>eb{b`XD!e:2a[Ԡj$n[[(np[#.)IjK Ɩ ]9ќʎ^e{ =ί̿ !aKL:w(eLYKwLTJ~ / 'M;uw7?_w~]{DͥcF V vm4JG͙L?#j+('w䗓6O]py6,ó.Y.xvAyxy6n78 ?}y0w+5Ɩ ApdK&ɗ&n;v9ї SfAr:_9Z}r_;$2Jу$*(! ;{b'k*ܞW HEI ZUp/9Y^Q| )CtF@7Ay~Wy5]0xjCܣ7*p3MJg%vL)rc5($i:gTS.S'xԂD9ᇯ>D95L5e0kя(J= ^b?o9["f0WS&"bpj>5rƏBbF 1DX<`NW55ĥ]/d̽ F_r]jG,^ֵ'^:Kr >rªqsfԔ!ݎ4=1P\06JQWHE"3.+ 1b#D`"k"Z͡8&3$ 686X=21"6(VoG&<4׫˯=:2W {Ⱥ .@w%xo%=@s˖L#k6bgWKG,%7QHIUBU\S}v v.DJ^]gU\#\7 ?#~m5P8Bv? j~>~7ۨ;'ƯPmc v$E 2lSquG㺣6NܠҢXزSfAg ¼XgV;m|M(mq}Op/[b,2OԖ ܓc{uvvijC_ `R~j x4kØ>Vl6b)lt;@\-l4I@X9i,^&2ps b `l0K#PH^ջU}kN7w͐+l짪!ZϋۮG|8%]y;U7oz,rp]ʚO EVɒdq>Y!Eo!|7aO$h)ü0VJakK(1dC~wGwzekʮZ_m9q'^YZKÚ) w ~)yX` KZ8@v`E/xK31jN48hj,|Ɇ-QB ;~1n덧m7_嚲î&Vi86]mKG ׉cᘢ"KeyTC9@̘sAp1`H5yy umq#>ngK#:5a`}G\EX$cR2#Жڈ$> > P &U(:5zqNحW_#+2j_Ps3&4u0u5H!H+v@ehe$$"$ 3ælH"Kc #ç:+ip{WΕeйp~Q~uۮFUՙz TeX֝hP /M7QfDƊŀ0qev1 _-/Yִ\}:I5՚cd<xXEW֋B1'|lr pc#Kw0xX$mV /esd#Z2u_::Kr)s2lʄ < d 4qW`гx.&8 5mM-OTB?8p}k9@sˌcկ0tk|\0k|./㣴JF[zMH~a^Aֹw`!Q].z uM"*7NO443+z(1PXO | ٗbʹ>5vY/Nj:xcϯpŬxbx7 Eˁ>cD6M±3iz5i^H5|Rњg obw]T;V|Y }rYu^%(J< X{)B ׃phce ᰂb1蟕VAIh?0)ӄ ظtQJRt- A?`UH];1 C?nOh,%4B N#/FŀPD@J^88̳Ę1jW;_u{ 5£kTF{Fc ,; %NE}"|.a0+b~#bG WLږ8{4=Ē 0 $$ܬ/L]1c19F$K5F?FS3H%I?Yrpp!!tf#,Zkvc^0ZjSJ0,Զ eEʌO$Nr4|I> M5$6"\F _kZKjGDqoxs bkUR.&d}qlÄH!^n Ja&b0fگQ6q,_?`|5~3*YfuBqqDS%#-R b-. PL17 *)2Bk1i^7ĺpH*| HerzR/]I@_a;U]bt9J1 {%*N䒾n.8 Qbkp4@H$V$7+gnT`i-zsW4)CV8~ƥ[v'Σ/QdoTpӽ܃WyF|Ve]5][YoDe eFRUn/4xDh W39 EQ` tSoF᠉Ef/z cI> qyȇ_u8KTN&1JIIJIaP?K4hI#>$[&E R"K0Ka˷E#hKx= rm>Ӑv mQ^e[U_E&q\Hn.>n_6wd~Eߘg#}#;_%W ڮzno\2@5ﮮTYD@v:O 7AfOVra@p<lrj@H)'G2]9 b킪m>rlmЃ]n!Ygޖ-XXOAa\%cY{2dk8**y+}"joSއAԘ{լ&׾p3ڟ]ej} L` M&0|,?*' ,χw7OHGO^nkwUx,n gYa_Wů[F e } (P=ϲOh;fGn Ю6 /+skxYCUJi*m|BP6`\: , /Uj5E]L譿ǿ΃*!/HٛfI ȅNȊd [4'V,B'FHz?aTItw@J;$8&U)-Pua"`0dn$)"V !]|D"ѣkKNG}׃qznB~Kȏ&61%d=Ik*ȳN sb5  #v|+S!\ x>_HIj5BM) jS܁x5qmmo6@Tay09T0%c!.T(9T*KDђK 5d'"~A-,C]Tfdu&lg]-lKR#ƉrU>5aGJsXh%X m:7|2jz# yYk+pOrM#%HG/P'-N"r\P}beK0Vã=[Xi|.WPrD$cVKP62 ցTgVn@bآ=čO\~Z%c}׊X0ieE_^$bP-,&rk+_XYtV,#a/T穆ђ11 iORM:&.HSt#NgGAcWq^}W,!Jn ~T /Vs.-ykbp'VꂛHo\׊*q0ҝ}K* X)<$iӂa0R8/%_x?_f4~xQρ봱tyK!a{MO>&C~}7|M#bS>Ib&I(RąH2 >,6Cki1RDچn?졭oHr~s6}S/XjVR˾|MO#^1vحƯsh?ުY^q;c]3kiiRېAED,1`Th c1c6H19)jzrL<ż`I?kk,xW+K҆'#U>RXovYp|gϼ͒p5;B2QG׎J =셪؛2%xKER<^e:c/)PؖiQ.Ql#hl=׎iwz2q5x? CE/ЮPoƆvD]#ƧO0ٮlhT0Y EL>NPRx"C_la$I\ rF >,8#V$5K}g X>|R cg6eU_ǎ|/nt^,SÙi3r>upǯZ{S_á%!Q.#\0{azKD08+F ۸$5뽣Kl={-?9Z|4KMR<8p`cʙ_aa1F[4$DſC`XW?Ø58-e{c6dzF͘o Y^'NL Ƙ7Ov?v.[X@)OO 7}_ORPk+H_&R#@0 ds%ߨ}.vs~l{ WaVc":[`AX|ümk92nѠax3{.5%|̚s풊jw#SOݢV(y;,zӖ {H8־B2d8敂3ދ ; <Ө"'{R pbo@A]4-6d`_q=kw޻{MMu>I1"a-~jf؇x/݇xb@=[bw.c& o,4M}?^ 1/XPÄee0!yWs 'u>K,W֓P#lOE`[ ^62qXw1b{:A dBff0.D7_҆ƨ7|FtktJDɷozxpwFГ3~LQ}B{6 hiEP)ŀ&bvyq Lɋ%^|X^|^a@16Z{9yNp{(D .7&!Zb |,۶_pWօ|d}E}?${>d#V@/G:vyQaz <@!C$ HE@8!b휀*ʌb'~5b+_>5`F3n$] <8mz;z!,pP:- c@):Z<ɣ7CXG0_}_z><:,p~vhİ]l:F4|UepEiwU.9[EsMf`kP.E /XDdn![Q|58G-qd*Eg=iuٜt$#DD1-B/l`(EJ22'u_nl[}pݝ3C oʞbvO8{dn`'x~ֽ`>I A9Uxȃ# y" t-q품$A Y/NLcO|e svk[X~4wc@;!A@k͙=h"bPO;qz + ]'dUwL.}/Wo޹{VyA-K^ַ75ڼw F,Muәk\aʳ!u5Y/87~jq'?]Ϡz/7.'^OzEEVfl ^ ",K8fIQ~_sرk_İgsO|@Y,7!RV;KNw^&_(ӍC^ꉢzXI򪤼b/>dY^fJgy}q巛PwQ~`ۻǭUStdY[S=-;!Ʋ2 ( -`ĈX>(P?bdU݄P EB|PQp` FRjox.%JxGpėӤ;.0+<~>w譓lŽn++G^ˊ䌞+v=ri%;sSԪwn6DC5 x.I89Ɖ/1͙YW ;Q"kܓ+Nr,_姹=TUy3DU{Pb1';˛ 1DsܖSOE4e40=*7uosUoR-/,K*1WecTsW9W]x-CMaӉ]lо `Ε x[E!b~w5S,?]3{ _ m2d4+>r,٢?ey쟾+Mw;h-4<&1~<.wnZ.''o߰7u_,C/MbdG1_?_& m?zHͬK/ggA16E+]>_fǷO֏o߾.1D։_O֥ݨM"6aZno!OEa'A#9z*I4MىGГ,_i,o,T,o^ ) spkG\чdOh'|O_Q)OvvI属8OY~ <?"oAD;n ;Hh1Q<ѹ 06 lKw+3][4t)O,?YRo*~&h޲Mo@>d+E;/6|}wl 3O-> q̃|Nl mS R} k-gyGêtX ˰[ ROn9 S.( #7Ct%n؈ 3Xx(bhŘp *Tq€dg9upPMټHwYqpL 6Q%Où =zpamFI7}9ptG('&qǫMU &cA#cx7=JSsJIr3N_,pS Q B>M\ 9Iq3*]Q}5Cv0ÓA=ݝB< $vCF%Iba+L&!$ʑ#ӧu0Nn1Nݴ<)r6# $/[]='HAn#hU_23YP&ftԛtyWz f/8khcXLDy29f:b.}Ŗ8"y>8ְF_߬ Cw#BENU[6۶}·hڷBv|mb٨b ^GF+khݱpl^$EOpն@]GMRZ64OÝy+JGO8~ys:~'Zd8JNS황- &<,UG;Ē%4n-(nd#k۞)J!!Kztɩ/=EMN[ozxB$6 1r&3^`q6]Bk{_khEn>k~n~OKNp?D+M/I,Bߢ;~`,&>dmӦ N\.Gޟ 78{ǏOVh-# 8F_"+2TH{>)!=O糞'M;RMXk #Z 艏8,lYY^Zػsޅ`r;*߅L.eAsgǦw7e#;1P ιo,t2@cX_iX'휋wO矂1+(z'<=JpI*b5ہ͠>gr|)q4=D-)fMcHiXM^a:,kj-bjNmw8RԄo XBaIF&T  H:a# Togvl}Ra [Ly[ίXөSftN{۷[^2Sl}}k7Js`n+_w_ X+AHnsI3 "9w(h\/t Zbc cɐb"Vg06'kN4|'g<[P=m못 30F . ̢^27#(-dDdMfuɱ IWŁD:PMٮ^E"Hgō?qd2(ng'$$o[W6,'E@BH;>sbsa Gi]2qt8ކA9yRDpW[@DRH lOăw"֨0n'kX?*#C#2 u4E#804܍HO҉!w X+L.ǫ1F ƚ+'A4MXyhæFEmO}> {5ai11D=;wVěk-˩N<­$fg'ߟMv%%hW Qq4"?$(܈m=dajE~Bm(t bwOXYqH]9~A BAM'Ȯ^'ٲߎȰn6e?YTgl[w>ǃVܜqÈfvhrXjIRJ[ MXD=س(*놧Fh}݅ESH*j-t2O#HPO =@ 2NюG"(¯z/p(6ӱvSQ1Y[^7a Zg:i '\@R!Z*bGKw8|M۳Ԗ`d5p}$;2frh R_G_ S&LI?Z(|- DR&ZL_*uV}V'7""\i(t!Ў R>lҡ6PL۰e|Ԓq_H.kΩ|r~|ƠȷR=Ά`4q%xłWmqJGk"Ǟ4E B\4& ry5 ';(_?rxhpȝ MN2u(-z0ؠҲGqDv wu**EL:Q"!!X{oP 2ȾZl"7fIIbs߹_-9CG8iG=)ZyO6dXÆOqó {C];Ͽs'WTWON{ڎO"sm, /˂9! ! 9 F’5D8^ a IdG!u \;dC$A{,_q %";xy"b5-0Tx^bӈP`\U=څ3yS芩c['Bz>~h[cOOub%_aThfOX(ANxnqTk"8țdēs*aH=Ar S֠M+%)%ԒK ,A-^ 3vd &?-@GK/+$A-Dbq~ph#JQX#>NҌLV)&򘱆=r{yGJGfaC C_?W\,6z8:K=)GJ'5> y8iLྵ $Jv;hTmn1{l&fK!:`S"\OtRؤ|CaZSc+:#oDP`R t?KKw`%! hD8ֱ|ROHNA~GX}l8 M]?KX[EK a ^#uW"192zU 7K_\Waa=;gC A%i7!OUwo;8s\NfMK/Si]oihڂuܩxxȗ۹y N<,)X 8xaй2 +3}À= LT_Bk s0 A @* }H-Q:BH&DC]@_~_~!T0ElzЂoj&tS`#w` VѮ\~&QWFhU/…`Ay~&``F7a}†jtOI "a&x<\@y߶6sMI۞;L>lULg}@sI^.΃t CȒg߷}ÊgQb#Ib#t.ؒ$ i;|f,u=[ c\`Ø1&NL¢7zf(?ܯ;>:һ,zp#C,㾸gذ;~SM,ii?sV&TL ~8`&y:,aX}, tZ Nn놴7|yюS2R2g/'.UL*'i&:@ F{2.%W*o%z(+؋ 2~ʿr1`;mi4[oLL Ns3=ؙo%Ts]Gwyce=o,2i}4ie[W'I?!J@T|j#6M bֱHu8)EQ=_ak|!FśAY 6{DrlbDQ3l1A{kj'fC23};RQ^5bpJV,UK6 |9t?yxS`]axbpMőȩ rI!a\{Ejpb[|ߖYptK8|ͷA-_$lk|[KR[6/Lڈx-ƀR a8B5Zb`hmgm/wTF<9έb:b '=`+]!1b#RF3Ei(^X #cښїv V,_*V棈0Ss,׬y횕+׬\q̛T/%nyI̙ZVlT<,sWMMY/_&a׍5,Os{޵'O\zrQ_WH.͋Y ܌nYc'H.73g{ 7Lx/M] sO{r ^21(jSrZ{u 6"AwDz,(bYʟof 5V2UB+퇮'$aT~w Vh`B u̖AOαaj3F*vCt]5.OXO^6Q9!HJϤkҘZf3 9G[о>nQh`/M܎ F@Muc!cʍ7BLJo#cSd}nB?Y>S}&:B# .R7rrۿQWbIU gH-꣮ K;X +)hE3օFT}RVO|—PS B[ Tr-bo{k];N-;H{AlY390)N3gf-m4I9aBAa~!sC0UȪy좕k>[cA.}9J;tE r3Zy%h*n܏AɈIFwd@;=#)o4[d3ozC%y|ƙ[<'tC& P㗼3CvcNnN8#8 >[Wx.d۾K@dߞʆYuY&,v{L+R'/XPda cuZ&?#NfL2Ikha7?K|[`i= #RX__a^鑙yΕc7>a=[P/M3?tHE{`+U$ӌg"L99錔n=SV sӤq[8.y!qqf9'j &XRtxt^yťŧ4rL̕Jwv<qBa"(3b߀V $T"a@sZ>ho7YdD$?-Zk5hJvoE{'Gotͅ&CNBbzsK"b:^MĨgb^-! .5hә'cTҕ6}TL|kj]Q\/$0##73Xa2[McC͌ 5| w5fca=c< > ]OPq čD.07DF2uE_=64AZ_0rm#a+ʍGfaGr !n3-N0 םlJzJOSK R^5H=a'hpUAHz3_lwB+l~3F%;oӿ8+[-?t"zcL/A8=qc̃_zhV`~Oi_qG볙%oî,6:C89j@8eR;!W?j!a0D C(ƒNQȱKl1*JIh>>#<@a8| E5RCpKL<͞ o/r˳ܼ45#PU=fu?eG_|l?u1ZEL9c>h53qF88!0r]:% 1<k Nނ10aK(>/go9Gq8uOp=i b=^ sLW~En&Ӎ1˼qY {7_jF*}}%;/ N+#+v*T;a'-:K~G 0xծgD5~@%=6mxn.4MK=+Vy2 tk զ-Ѹ[k9Х+j~m1EˡxxDF^1Jp\*ͣ.+f$j3L!\bvXϯi}|]1_lЎo5*j3{iL0'O͊z6^HS_Xa!-gf7~}֬_DTKo;MnY{[-SN-{ i){oEyqE/Yh[~ZՒ >mE=k 4m'|g?Eղ}I`wUe70bh,kO=pf\1Vqz]g󢱠1n3Z >H":Xth,XS~:-4JcN7YpDm;ѳ]!Ր=_C`. fӋJJʨtzgs$`_̮0ƄS׮m]sJtyIs?4ohvMy%Z [)̭V:(_C#te8nSqYENs| Y+m(n?uxF>o>|S4S6ʊ= z¡­x.Z?Ӊ?ُ5kGݾ=|&X(`h6#-Cw 0]uFk|o \3?tpJkY&wʘ7ch-(ox{\Z1w͹b o`I4 zhڂ*.hΚ0]( @uD;v- xwo\eh,'{hh6?!S<>PͲm`Xʹx i42cxpP>b<͙hsI}7FhGMTw Wа z[rCGMem(wmS)8) ֪bl|ֈFN#%QuZ[e7ormu^-^NXNL6p-h•^=p-h扠SFD4_:,$h<wbUвM`ĭu9h}ލx?[=5\1iO~\:];xS^L돘1x85=Fal7`.DJv y/LivOwh P:8S|7ц ,=B ?q.C⢽=}eZ;eD-7ҵpXe{'qbg: 8267b (py*ÕkJ*mt)DbugsS疭1}m,؋5$\[} Z6Xk3ݍ9K)1V:y5. pQFC+^!:~E"<%hߡQFu W K8Sevx9tqgpTqp;;ҜwHY;4^߮?ۍ!Fqa73=U$Kpn}݃{ XsA/JuW7[=~}w>C}|W7~U |94<={s^= >%T94-tW^QowXc/K{/ԧos~!bWѾ}'=YUԤۣމN},T;џD#ǔT̍YsG=1cy!olRآةb7g7ڸqYqqc{LJǗWύ_S"KpS…GAO꿭;?<;1$1&і8$8<*qVDGGRPR_(H*J*M4+iQҭIw&LڗԚlҫIH.J>|,T;ɟ$K#xdIRҘ*ٔWSN|SEomdzuuUi[mvvvwGiniiiӲ ƤMIMkL[1)mo=xi磊7MO9ϧadf藑14cTFEFuƼ2flh8A{|j^:]= k@1 8`Հ:\?>}ЀA4x%+>C =cC^ސ/4bI3Qe=/+nueM%J*yg螣G8 ~;c>?ֱ3v=cm{lc4Szw|lJٛc'o(*' p&*Vy5 s%jK Q]%Qo:і$gΚ]oux#U8U=T#S S-õ"&j3kj569Il1`304#a`|r~^Z7#E68w4"RT`](5L p-B (-RXv/< AA< 45ςh${jM>ƿ/#b裏/~ dѥm6^+G܁ m"Ozmvt+m;;7~^ݦ f61 hw7_^^a̧kwa__^^~콫]{[{TvvZ{O{c^! 7c惲*batiK@Kjv<>nVA`V(4XLdOf@6:CX%rYgp;_Ćl,XGQ:V!ưp34Uh5 zXYJVŦjVfձYF6asgwzoomk}"-aK2VJne۵j?ew@{-׳ l#d]nvma[65 #>vX3{aa>}g"c {\{bO0;kAì=ɎQ40=Îbϲisyvy`'){^eM;{eia`gGc }>g_/Wk }Ǿg<~f_Odkgup3ι"qhhsOŻqo}yAɃyxpHţy x ?OI<|^ yƇ3>cy)xx+D>OS|*O㕼Oռ3y-|6rDy_B/KR/7f[mv|_7|ow=^ovw>wx3a?G?[x+?Oc~?ǟ/ ~/+Uo;]~?39ɿ_o;=?'3//'_2w]әu]7tn-{螺M}t_O׻z{zz=Nzz?=Nz')Uzgz=Gyz^E0}>B/G}>FRL }N)<Я_'Vx xLoЧij+z>g}>SYڿ}^ F}ި/%ZI;K{D۬mѶjOM f}JEU \}N_o7;]=}M߮7;}.~}<GxL??]o[z~Dʲpn]JJnJ dgSiJUmɝS9~RܪE5JXrgϭR)Su Ι1f{k6zLwݚ WjsL R(`H< ]o{Ըn-525kD9!3;=*6~ΜJX] =V<0KasjfB~u(~,e4VUb(8$dc*ŝAL#+ͫlSU]ɯ[K:KkMfΩ*ZT+1uz>1 꼨g |TG^5]zHtP]BUiU(nI1UneAE2ӍKe.K,?zCmyujވ>)Qn ysα,iO_` $MP$n,36TI/[B ¤AT`n4ӅoM3]TFkʬcmFT0vĖ"sBEwH{@)nVM Thv#Ю'-ᅭE8x02[=`9ʻVvhEʹ8PK+X hPKy.FTangular-1.3.9/docs/components/open-sans-fontface-1.0.4/fonts/Bold/OpenSans-Bold.woffTzst&Oolvƶm۶mضmccƾ͜gU}*+"|_RQ6Hfy:[Q!ao[>LTNVOVN7zuYE:F?_oZG hC'|ۆ?ML93Fl+1wdjn3kh3coody]k4&Uo0ZfNnߜw9XB'9w9P:m~c}kon[c'1p xvĒv߾O+vi3p[y l5C=#=0hH$=tV8:},pm'w@l__=5miKyTn[DH:T{z!JdT)d m|)cR  ;A2uHI@|BŸ~Y]>`h^!>Xa}m b.KKQXD[_ :%N\'TTTQD ݐk \Tz\'gKXN/>c<`0"@pa߄BXIa%I` xMzX_q{ (w$f1MttosaByzzMc$d!\b7UIkKk͉ _֪,#mt+򽟒}œ8a:x5^i2گ?eBL/KoI: 6@;DOL@^5gW>> >QA?A @4 |Լ/=InR GJ&f 1!>bTq]F;fz'ƤI)qyVɿbڌ2ؑ>cM}ev6im':NdcJO)A>|2dk45Ӫ*Jrd,jzY EF+ԕKݑeA Xxevq%4jYv Cglq.˶2߻1֮#Wտ.}b哢 q;X+>kN' YI <. ?9NL?^m3Y9bi!Of"Ѯݖ>YNV!92gi\b$'sZ@u?ram$F\SSX}][:-mC zѕ u"(G CQ%,ͽ eק}笖t<~X"P4u`_̪&Fe +*b%XDQOޞVVy  "çf a"4Y^ i׶n^+YW' E*N2.,J ױ3wϧ S#Ϯ;1=Ca-+{[4W s3A]RХc<@ }6JqTE(>3*|Ft'ڤ}lh?*P.]5wPTUϜvl/'xxr`A$*C2BMGSe:;ه>uV]8r4r#>Q$95N,>P} MGx/q/TX_>0O12WIz.YT/cp!g YȸLvSVg؜{gWae^dU*ƶ{oZLO _Tmj`H&H *fEin Q^ L}F~'+tBzs"yä#Y/J'q~J Sg8f˪T @hH-#ۈh U6vx<9Fho_`2F[gZ\6O4\l*}h#Sg=> ք]#;~ 4d843E?7E9EމCu{ZcoEq5^_ H;[e?4\~ _:$ýi'Sz?VM?h{y?o`=Kg";gE2'9V09y$4m*_QB9T#g !.xBH)rdDM|+!]A{>Iβ/:PG|qZE9͟S0lx0 ܏ eM UFWP}YHt,4|,s{tl = G,C{+5N>E텽 2NF Z{2 C 2(rN" ȱV 8dl/E#0 R2q2Zj(Z|]vn (0B:bՆP[M&a]uRQ0fE;I'#8OGZC0ӄJj &4R,Ɖe9!AZlSH>`>`F>Pj3NO!,y-ZBK?8DW!*IC*ZZz9}>VrK3io\Y#xٝmٗdGJMeHK-INGiHb{&<&CE g@tG׶˲K{_"1YXBvi`\괻h/~Ojؽ(<0PYWQG0!ONX4 $!T"P"+D)DTFREdPj{@T{˽@E__sTD3n:),ef)=2/ʋ?mB}2?|,ònW $ቴ Hb׏?0&K a ~ gOjc+ pcXىrpu!]_3pqc4)$ a;S$0h ]4 bˋ޲kY|.s.Z%g3M@ ǿǼQJ p$^ 0:A>{:T{/_:L3?q.%SnxyقR7 GMHSvHT'O!h@ѽ5]9ʕ̏ /R c?Wv2qs0U|/,h\&.+rOFI4M,(~+z8|S& gA wQ+_D# aA $%KQfK_YeB. &PA?EL/&n ؛ {!7鯌qFu"A1A{̢~ FQ&Qy~=Ls!  ҲK:D\!ߥ{`p<+gԞ KUgGrԷ˴҃Cٕ=)W9d6x #`x[5G7)~p]BoQ\ejXmQ5vh!;˹-P]y2 ?1hE }3,IC Ap(THyEl0F1g)G/|>ۗh\B{ϯ8ny5;O׍$EcZ]?W~{;/v RȚQ 2"ن ~_g GVAmPSm*xRnnLT%u}%}Ud~;6/ϛ,'P.ۋ>S>-KψnZx>CP7⨗{DH$C)K]@kwl4 h&d(/x{|6c$sa8iE♄s-Om/0b%-0L!V 1)C;:XTژєCBOkuҊ%44}C>V{ ~TX|}[rLo`s2rmDKcW:rIx~|g`'].0cqdA'<2wV=?Y7tw=|No_Â#mj?L䞻@1в6;u-Jۛp`Qf$\yHlI|`X>6\,XQ{(3Ch{ !ݿDu'׺18% ~Zۙ;##c6(T_ a?Q#y an+ZZ%K)ڳcuK-SDkُ$ȼНuJXƆ6t B'QHԻlb72;SWc^·ψcJ]g !%- 3IG.ݧaqSbӊ~f91U}wIL|ʪ"h}"PGXbPn1ʫv(!ʇ Qy;?mU& Oq W%4elTQ[! Bau$m3I_\J\w:<L1#sm4ECr)*bV>|aOYb3UU\xt{e8U&3j^tur>2kSG3c>S))JƶsMr9Q'rF/3x8ILlhT_@ݘOp)//emڊT4f~dɀh08i_]i[J!vkZReWL~ FsrS*r8l=VǷǠ\PRv{{m$¼.yXH1b z#အOeM(Yx8V{p 4Ҏ#~CE)cw~Y]}`hSٕ>>e}s=R1H/Vd aEO6mM*ߟ/["Frt x"@NGڭK6aEL%îL NlImTָU1Swئ S`xIä= x,FC29 4 ŵܼ5) :߅-oׇcoݟO"\-᧒6>e]z)-2E>mm\elP E,rGwMS5 Iu6"XSiaR2ڃ+Kq. s$`yybQIU*C9~iIm'N Gndy?hٺDN{.tu/4TxH}h|yuh6[iz3wkEjH|Q+[yoT-}pD>6=4dCD螉,8JNP0*/]loR3~! O;c/}`=40}SQɺg񓊭DziJ}YGwόwČ- qHu6_ Bkq bjmPR?ܶ߫ԂKiRN9 JE58g<c&*tkqEr _9.y A'\+c`a5?=c{.:u -}c?ݑ{gpTT?D>mT.9<ԚGm'm=P:v<0%L>e 22h(du!hf0ODnZj mͷBMUH4la --Vc-tG-Ψ#eA_ X40wׅ.^B7 aB6C7UΊ,3š0r MvQ$zJc$_hEڷI{?$3ڵ vE ,^g$S7[hws~XB/`:DMPa]C| eI靸37~ȍ'H_i&8Xԙ7 ؊MzK )qUS?r^ ; 7)Erc8cbAvBb3_7ߕ׃x,[N//rXX= .x3֎ ]ŗ\?*7D9q}xĞOq3ݔZlm٢N4YyfIdRx6(bZC6 ZΡ< 1 WƱ*2g 7N'V)Uf/)KIJa~NkXx 4%E'qdCE<fso1a |vtT~Ԯf]h4!esi" ǗV)E5vOUmYl&VPwuf9fliåX&\S6Fo'"mb~ ̖@nGR]‘3adfݗ*͖<-&n;GFQbjVzCQ##w C12PqC %p)VD %\LaPIJTŒfվ6.b%"嚵"_4m>t)ڐH$2Ͼw,. 4TU h8$(Z _/ʋp0ؼ\5>Kt "%T*\Yl3A/&ԖxGNNP HE &s[:hg%/Li&s'PuЏS4ƒCE\yx`E$U1c|=ʼnvEe0y~{c8BDrs5YCsБ2fMI$A1oۋwlakV=5x@fB|c~&udEeh!-/zOO7wPeZ / :\Ui5:Z~Ytκ@ՉgaHIB28LO{01[bM:-O9H+Y?&"ZUM?~d$Ґ~ LPB.3;gb^J1e-&ݞ}[ ӟa5M!e=5sSD6mcK6*Kql3yPkMx㿌5<%{W=z覑K{v+'u g͟iZT*h6M\4:*;nKLI,iMv#"da>*QeT G泴'A"(%bGW)obe5=SϮΩlɩ^fA&uAP8t4^M۲ NUD*4 8,]j XȫxVi PCp:=oqü5ĺ2UIa$~TnHwr| @cWYU1sԙčʎb)ckMNHF3Q)@',GaaìR #q=BAqt1Ap~}Ȝmծi2?Ix+!v0܄WN>̗N)Eǐ‚]b߱t:=#F|L*ܤ*)dRM@uNv KpBCdVLOͻb_#{|ALr蟦 D* /꘳ GPhB17 `4QFX' 7)5#qXȑޏW`>ҿKyn_lZX8wNNfӓ-Yzݳ(!/ky6Y[g6VIʉsb{$3L!2:3qSƴ(UVӞgż0z5G^qLWԴs '5S+5ޟxrt;-čDb2ׯ ET1uʎlnwъ%;a "9Or^؎Mݟ1`` =oYٮ~_O;&0 K^Z`. ly}BPډz IwpL}C:X.wͪhP0VRNU3Lň6C@؏^E6P u,ʅޥ H'Ӭl9,MAيk'ą 9Eй}&5)葯|OL9aRD-Kt4 _d_Vyf[9>C~uuc7_kT {rDY%t -&@㐎'Zxbe%aV>  )=UU$:?PFhҥڰ #4'exLj ,|\#6cUלV^#qʓ1j Vw'o%3~$\Z.Ȉf3Ǖ.FƷ-+(\6s{}R"ES0R' UKCUu2`S 8.YbMqVKpl1݈Eixm*]6Ç 7Sl/9oL}h5KT,ba&v@#ȕ~J ^j*NimEV^ʛ,!XJH*ҡ9Ae|z C< lhqb ԩBaTԍgS"f>zSYL=ܮ+#SգR; 06jzSM]l9jYtaN?jXTaRQk4"$@Ѫ7/NJ1R&;|؇c8rغ0/OQRfd;־c^mϘ $$/ۗ=ӯӱcXoPNJQ-Åh!uӣAAKM{Je JκVb@c\FԗOF::o7TAD3$jYF}S z癖BE$|P<Ԥ~N>rFж_UPG T0ȡTY- iU~ˊ)oF+|@eN n\-@hr8;v8ux?p8M Qyu2bW(GEvw5p"r94s@YuDr  4: PR@Rn6E´ޤD|t&s: %;7{- 0O80c6>Z=| rQl$$PZAnR0\"CD2_0Q $J҇cŹĢXr{ /&Q똄M/d?o%ᜦn{FRŦS HF(7օ{0Ob2y5&@TJ*uHI\zծXhh8"zoɛWaZY{_"y* xŧN6%l{u) A뼙O9$^ j"gp`8k&82O(о6;ae^sdǾ|%žٵ~[_}b_t P(_nS_pdX&_V`:8'#~KX*BhmF]-Q#Y 85[ Yk܁6}h6קoU77B֧)#)[ tm:zO T Yiߞ)pz3z(ԚZi <+37j''kePDY_2 6sQ5wrpj*y"ܷKNLtFXiPe/ZG+.E왝>{ DL14r 8N)_C3 4 paTr{S\-!H4)uk),f9vlb S;뾗**33YUtgYTclOaF0N!«"Fz> %+5&uvclcPv+e8DFp rs΀lVS/|3vк5vL{IAy/:\Z5:[>b.ee_1۵]H17W Tרc+2Ʈ߯_13#.Sl8vL=ڱy\~J1k,P[E.M k+*#;ADJ'$BZX}H^y:l!cm2=(<jU 8Q K7У9 &.]8&<143<_qOow}p{YiV gGVR|l߄5ݢ#n개q~H &[V܎VKo~谑fsm& fG*Vnd d2Ρ ȁcɨ?Vb?wy4 v rf\ⶅ˕8 U;*xhjp66jKVaO ֯:W‹ζ'z᭑gηaĭG7b %S e0ԔRݓ Uu(tTI+R K1\CFi\4u7Ut}.x9~mF'<(C.LB®Y>%u684ѽnHK? ӴEfw(M;8cZ?nguC+}vN\+] D ful*lQO 1;x ݤWzldҥ3-I^UvYV>MG3W~TGK>hXTdeo"wzQ+{c-~J1 e_*5a0Pr%E P|yd6?RVJZ"Q34OY"'w: ǴL2y󧌤TT٨{OSaV=,#QCuXJAj$1BxK%ذ":wTa+^EXhƻ9C eVWn(\ .~|(6uudz􁰏ǀ9:T^ޫ9ז]sā9pHd<(krܨ Dw߆97Ax[>$uJuk Ǔ7q5q u&v̠qYE(k2=7:+=Ee OX\hX=Ma2@ v-222 5olӑ%AqE&BJMuLo|9mq%U_XI)t7)?7n H9G9?n)0UTM'fnE=bkp 5WU`Ʋp2=A+zBL\hFY‹ 1{%1 _@'cZW_z+[5~XyE,ǩ%j7 ,m զ&Q5iJu:Nt,ItV0:=طlE.UWA.K RNz)>zX;xoҨ}x@RL0Òٯ5Xf[ gD8qZ+Y(d{J0wڏh9п;;k& / :s\~Tf;(-|(QqLhLD;3A|"ר uzh8A=lv2[7TEڂ>~kڰ&Pf7.]oxE_x,x/,O(w<>>7l]~j妨ɘ(l')Xf\aZ$)X+o4$+mE+{|Fm=n te 92:oKf#q]|ȂLJ e폖>|P_ / > ;JTmkT'~|gjX o3R Hu`tW2E*V&ҸD2QyɞP:pI\1$%d*$2nkgnnSQ'g=FP}C=okX="ݷ;h|yn=M&R{YL c5_o7[1+FZj;H^1׌NwH[{^1wqwv^lٛ{;L>m͔64@BYGi3Ӂm264`gJk//}7AI;uLƑ9hIi{:\` 2`ŘPm!Ƙ3gY4#P:+ 6,h]ى$:kǡW5z@7_h=ZSw/ں fc-?u }95.( lhe|Ms-x7;w%LA ubʚLC54/S^ \-&9>\*G=4VNb|'tc\.B9cѺMJxK z|عg\|QP_ȅMwf% F_0u]|9GlxӒGv?[&uN|& VѶU:MVS|tD4oy͋7:'b:P6Ng\?QIftOeJ͖9I9<+?:i'?lO6;0~a8X_OeC_EŝgqD{%Ƙ3INS( iҨk39-N7{n'i+5thiL%,@h!ۗ,zwyоkb5@ xfFSq7w|&|*o$|KιhZAs872aS {L:gL;/p6c5!5]+i2J''A@3w mDTh .66A3djC"/ϰ1b1&%`;Kњ>LI1< >qx?-Kd&'\$ :luwm^ڿv>t2c'¼յpC>kݟFgS ûauB%?.HܨВ"mN>I*ܧa]OA9f0ڨsд(9Q'_Y;罬p%YHZ2.v#)s< X\r{ПO^VDz;K o$@" Oó.WSeUrL2lt Ytrz \t@5,%c̣zp\sMw4#ye ڻP9腱dFH^U0+~XI}N'MROԀK/[VpH*Y^z0aS5{NO~ZP tL b#43VA'{y7wIIgi9{K%聤D؄ܙhẅȩ@W73 YZiB,^@2PSv9)ҟfԪ EŒQGXALC͟J; EOooUSݧHzwQk*C~1^:ct ju'_C_3M[mUFÜN6<s'Wq+[*nJ^0އlPPKP Fk( --i(^ Z7?k0@I{/4W0=Xndh lq*\+W=r"[}XEw"bt W̛أsaѝn]+qgP\NM[5x^qM/b]$KJͧzJGtw%&Nۡi$}ڹeMGo+!%AbNzSYbxdp}V)vٽi&uU xwv5԰cQx:㵹=[dxè?$"MOzkiO5q:UFotյuk=>5S`1c3a^@xZgљdhſ|%cg<d['N>"zGpXO@]u\H6aǑjFMK|a4<̓bpw/q4Xڼ~Nj;X .\gݭD-FF,ZV投b:P-h\p3ˣʭD[7I~`pP;H8 1ȨZ#-qĥ?Cwbd\Ԣ=!HM#ERogQ-CjV{@p#ٵ+_=.mV~CL0>%xL)&,he*&_l>b.YQ ٦/Ѻ# g+jN|TDĠG hWDdf%GrgţRwc [W^rꂜ}umxj@qnJ| TT28{ip̜ d+<Ֆp\dl ̡/:y3O>t)K;:NJG*32ݣ}_ӱO C=uOcFv]x!iem?OudIԲ/mFi3 7"m@g>'ZXKȏ˃FX1/36++iQ0,ϊj9R)$X^NgO+yMUvhl>gʆm<%/辺\3V+}`UcgEZJ%,TwlzlI6ﰿ^94XjaG3ЩNlF޺vڵCkVz;Xi =Kp~-KhnQ2S +ɨ%Ω|.uw ->{Z b&{'r7Xc:U0Z 8'n.G]O=QPLUD"Ց^CA.63aC CоްXcG^pKgWN ܷ3~.W nOT35ҌzYaR4B"SiPZ*|l.Η>B'gl[ck{o{?⇋"Vsa`=I?w}n k'? +._a H2+ҝ`YwB#{zl YpaNw]Ҷ飤)k5.ܰr%z0ݠ?tGtC=lVm'pKUipJW/~Vxq_G*aͭȡKјvKehZԘ%je\,fxAo\P8$0վ`q&&2JzDJx+vcϪ_ϒfG|W.yGG~{zza/#Ҧv6_X}3fZ5M 1X&ShQœmEF^C*ɬuy%.@],6C|9/'IDX*W''jO k u8^'MrMsD9G &TJIs3s1U33`PR&+ ;f8D:q>)L+K s"%F<"L\E]ҟ,4{_~x#xhUc7'm?GyȱajYޣ 4xΣޤ)Ʌq^i1qm/)]Mvھ[qihɃD'p.MOy48f6Rj㤶W`L7xE21nAF_ M'7]ә?B)musoۭX"2-%>ңnBMGn|gq9ubfZp'S 7Tk=?=KU<{G5K^[90kJc9i/HGi0K+U[/_N1y3@t) TIfDY(ߥuTbiwߛ#<*&I57K-])&;R Ⱦ) """"""*. 7DETa/: ʪ2"4|ι7igJ@n¼5fFv]A%ЁM53/yhG%I_ Jϳ;RuY}+V.>&7Pݽf KYI(]mҕ@tgPewHL,IEBao2 uY>O[U$͑9=Β‘D!m ҿwsKJmӳO{ 4ȦFmϳ GrL|럪+ LHnJ͌<:i8y}\cI5hvc܃pZI e%6ao1<`'ق3. :t Fv%'R0p& -uG[%YE(v|¹\Qnz. e9m&#Y'?b(EnҚ1d۝oW[~|"ǗY6!?5U ozq!8.Ti p'-\iMF(HBH 즀^4{QΘ,DRxsj@*bZjzxTu]JVzL,x䀃[ p"d<VϜ2`] Le-Ye$"-c4vPytl#vkϜ~@?&Ih9粻@{!oBR>ǾO);8 2`X;.H1ϔYlfpiW8T0:yH.b$4$P2#vdD?<=N L2"Rl;T+ wm*EUFmը<} u7[T%PV%"/Tbg7HR^ "`EA̫mGL,Z_ #9sh#' @ 4kx4ҳ q6FѥVZlY?_w_+pv5(F6fE(m>8otI M` D& d1f [3˺9z.Sm?fj ت#h?2_?x㮪_} =bgZ0aY8Ol1*:ƀ%Wȥ0s@hz50xԩf|ai֨jECx- USH 9d4l j%N̛jFe22wiƵ.r.ϋ-q~Nv>&\McQǷ{ic-L{R}ٕP*+ǽb{gH!Mi>"Nb`c1QZ - EQldb%T(ӅU'G R1ߜw`V,PC$:g)fD-^dSrxu *d_ })Qf+QJ}suya]I_) ۞j2j;k-~{:nL&so7Vx4[0N?@fՁ2ȌgXVd]u $*mJWUjeX[L-J"GHUb Q+Y/;'wʝx?\N8a8$ < l]n}w{qrUUeUMmbwW|.1`X|Nf}[sڙe:?|kCyNZJ/XB{;ܨM=ڬIeڤijmkUIZ Ut(=`jzE+ 8¶xAEvk#5O߱19ch;%Ż~uY䣱Lb g!v҄Qfg@A[ď^?%l!lp>&^y&$HG/>D_gykt2%K>{Tv֯؞x=AX<4fac N`V %6ras2&)0$IpT;/hUd=FîZA|JyR;/ع8_ eNn>+`IaEՑ UNNʕtmݥ3T<<ңBub;.p]&'\ɮg=ҩ]g`At _-K)wcNv F 5Ǫ?g˝^q&2ŗ?`/9Y.N"JI;x]?.auސe8x~_2&I?ydM_=1ߴq_@]e疫sp  kbr8 v(x׉3ƀB+_2fiqA1 poiͅx ĔO |1GUauJsĩoǪ"0`CJ`0,=T3d\RM?^1G/b[%2%>!H@"^Ҏ}U+VZoy%~P[7﷠iX8ǭO͞8-X\C?*Np5 <_5$؇+o?K0ä L`vimc?ap//3ؐ-XMl}̲ۘG=k׼AtZQcˊ6Muzh|p0DZ{*<-юww&F $}c`:6f'Z`\ƇB*ٸ׳ !/) ^}>=cX1,K󺇵s3z#0,5.8(~9< gNSs LEvGN$LF'}5;ʮ<q`#y}*%4)=9kA"'~D4F L67~ C Y"G_"P14l 5%xJ>HrAIa$mI1d6[g;%ܻr%W-+bCBtp*_TE gVZu;-uGUЋgcp`0uOL&X'fkZ\9.G_;,p<2W@S0kraLBMr'²>b;q#-7lٮ|M\DIum.g_!^~yk.͆O mK6߆f^e|&mIr]bf/=4w#SNjgϟծwifǣ9]BE]iI:D_'vg?mKoD6̋Xѭ$l\<7<4|h8O3ժ-茏#آ%iOD=bI e0оp~8Zidi5&SEE7w C ޠY:G`mAޏD~L}g逫L*WubNs;DQ;:AR1Yip85nk,@':Ypj.3`™odsW(t_* =貯g/1vO)wK9l;7aR⾳Igbr[k5^s’5ޒ D=xf&cg;c=xgӠ\ /i'>'Q$yw} [vV96p+}ţla?D~/|݊41޹1"F"fC vAMq`G }V"}p.#PuM {݌"qd ws?\ ƌ%oH<0ųۯ!nK8PZP Qgȍ9Oe0.I$#Dd$ͧtnϯ깯+=g_켲't8 +.hF3]?`jWk%Ch1cަY̦B,iVH6-^ "6$q~Pa0ld@#%c׈TgޗANI_y_E'{</חٞDDJ{=M]ȝ^fmHI%_^GmQ(:)L*&5c7-kvZd- =E /ZmXohM4S+Xf7;@r֯mH=ku?HϦK*eu3@5z&;]>9񖨺7d1 8V-PE.,LLIdA&'~4_.Qr2_?LKI= _dxvva&-H qYDTCkFx%% 9Dfu'GA EaK3ky]_mmA1:h˸9o#IInxRUTC W C* ّl 4+^%HN>>?NKH+ImpՆp惼LI[6` ~t#G$?qYS ('E/ A)1ZYw Y;=}=T|CoNi,vQI&yXOP;!èA2'7A RG A$|N5eP} ܾL0 @ә gNI I ̆Ltue&]tsjҡ=}[] ; ɁiY/d]䙮 Bc~HjY?̮^^Agh:"U1ay,\u<_ٓZbuKc[y-gS:*]=W1uԶHXp6u*]| n]Nk:z_ e\v@eW'VjƯÖ+Jcr @||KZv:\n ^y!@:=&kpp(H\ qI]vHvLjZtD \+whxME,Ȯ28xh zU%, .I!0|˥΁q.vRk{Q2ٺt[Wd@źtNv?|y o_Ȉkrh2Ġ3it}*X+"/ jo9i\l,ڻ   h8q2%gn(/wQa4ӲrJ+Tw[e؇-nj [8 \ġwCZNQ+RؐəSVa*$Oܒ~,&3~un>P]Cf[%Sŝ[5޷~ | {+F-]9|r\#_!̗6'L{sgxj|]k w=z}mjI0+IeJ(uGm&> mqT"vznq9!3;H'k*/^~ŹNsObn_~!: WwS&/A?4kյ/Go۳px+v֛n,]3q@kcF17ςTHI۶-a*4˓^sz5Vf~Pz _*;=vC&C0qsKg+e<,מyvGsf /4,imǕRMVhτU3P5fL%9/hOsv&9M{3' ?o9Se܄)6Q2 _BSv<o!3;o^8`~mkS13#|jlݵ%Mg]~׋ŧMsF cg(?rU`=kY&b$5x&c2.fBvt4`1:Z}J> m{pwaN:iUxVEokmǚJtγ}97X׺BpTX_Eo*#iУKҌMӵB%r Pk#F%κY.O 5.d.@z?Fw7髤ˆ/WVŖ%~zn`M?wp. z7Ͼx(JM,-r9R+Y&@ )\m ui,,8ԈdPmjaL!"SBUόsIkR٩J`ktypyJ6RI*=]2qb)=VB2cUbz[?oӻ[̚UH-jӲy<86FYˤ1RUfIU^C\{'-z]FRkRؒ/?6^̹"pNs1b?K[]'˳YOmmY猫 Jܩg\y ɧ8I*jߡ}Cv.)sw޽1]eu7Nt*>pRRN s:gB]*B hOxe =;vkf; ڇWqa?!u:fH*}:-_PPcC׸#5=NzZu#~5}8Ȯ ZJfvWD~Owe5p]9&#R ĥj<*2F0zv~wܰn+Fu|j12t`.ӧy:+zߤ@z2[f] wZԪG;W`Tq/ _G6}T9vvuqy{ե`!UG s}ZwHRWit3ab8E6'XI 04_ FwjgAaB:mhW>]]`qÌfY}x7m][!QIS6LmqܩvqZKTR\ybMv٩ۭNjvɧSpN j6nWm]ߤҫfC`|~}'>+lYUw3KᶝDc6{oGh0R=:qf:&de'5Mvk?..kc:P RRM1NSaۄ  4ZTwԒY̫6[Sʂ+:sZ΋:HO$x M :KE.T|CdD%A Jxه ʭ"Fŋ^d AAr6):#\~_p#v"϶o{IzM1Lj )4"ӕT@xcnqNNbQÒR{98w}Yu(-`1H)` /<(f'_xEwy&<5&OJ5EUܛ~@C-Frѣ>袨\0aR{} t&F OZN 7b1Cm$ٔ)# Lm4:vZu-R۴ 5oY?Z*^6ޯ] ."Yl:>)Z`-ZT\a 0ug;T1S`ۣz`* R*&RQ16$TxOlR/ ggݒ726[Y뜫΢9c*;M˩Ը`TI*BQp-mʑlIeZF\3)W5U SWT^ԳLWef'^|>K>+rr|pҒ# ʼn}~=jӋ}xlx1"wV2)5ROf]H.h1?Dsa% P@mEgm[ 0(U!EAo7A! `/(c&*[;;50@4?(E)#>BW!75 DkP+\ɞuDg6p/@t6: a}0B]I썉|v1p(h +ff4ih+k1qS9w%jmOU_KM& 6uY0MlӀ&? S^]4ȹlh?MdψGTR) k]H>eVJ+{o.X.}7yDV-z^h^`/%';"d),%j*|@ȔwP u`Q( 󙢅|"Ӏ>:C[2íB5K Xc|ŠOՑ=uځ-)+bTפ٨  F(b.0հoRդ=U5 S\zd۷o+?crJ]nS{\;{9ySV^jǪ%#Rz޽nG1ƺw1`Xk_=U2,ao{ױw`'r*ozsy%xE94PnE4o4<02PF@+j,+Oi(M;0=@1gȜB{VUS%H.0O DZorD55nx=?;Pø046l敓7^*YKg(uJvFX-  ٫PvE4E ǥ4 'qr7 T ԟ@~ !EIԕEm]\8@a$ai|TjH⠰HR#eп/Z5#q% 9i|<ܞI75^Ikؔ.7pݟ^|f5WrDMODM@PxH-̀߀/CU,#դ]CUt>}P#q<`,!+*!u-/?X SF.D#zͥ׉=6ӴT>Okzm%_NCY^?9xlE*c'0T{aAaL"v%3a +#6,-%9';*oڡ/YT pQ̰:,VӏTO*4-"sĶߵb\f@t/Yw;w$E!d|ӛhQd2X :Ér`I=N\Y`X/  ޟ ޟ8EɆdٰ d__* VVb|`~![ka"胷ϫj8OhK . sZ'HBW ~[l|R HQg>O&V<2T D%r*Wf]^ZCsF42t6sR4KSZ4vYQaf!x4r}H`|#DFbNmn\B:#Vza;`֔y> v>u .&`=YĞ29&Wo9vX6Mn NJҳ|r@T_iV'D3.(a nedCl1ܢїgFԼ*6/оOn>KB[lafSMgCVtsn0r_+`PL !Lh2w^L5 { ,ӵ{`5nL }bN6"{n'?Mm<9h)g(؛5d`M*Qגq+H108IEǁXCd<>>1JD[` A0bmMXn&FGh6 ^a ' `u7)SZ q eINX+ d 8ӽ9!dg32ȁ/m4%P08@,<>Y8{^GbqM4za֞z3k`ӋF4%Ўi5UZ3h"i /bMoZüLP:ei.,q%LF;n$vAgs^JORs x.T hgݻMk'7m)>KY ⣧駴0㯅V?m[>uBuVԈijT8znCFoz|n[w5SI͡;Dm_e9,r-3^) z=!ۤR"o:Zʷդ3\aMGX^ 8L*gHLg1Fo XщTAg M!5ig |l~r""g8Ql"\:y-[^@#d*K VG}:@$DaPF^!ut M]X|S:}>8ei}0r5gL@YVܬf CƑK6!B"9hLT]6u4tO軤 ;7#RJ's,б ٰ?C:c$c05T)ܬZ5m<>1sUH f<!M(:?kWhK"IYp-B7-IN݁NJ=gskOH-t+jgoyVvh)\Cne6,l.xJ|lr{ eFA+OW?'#c߱uՓ A.O#t[ "F&Qf28q99of;79u0ؕ ܂2}Gog?:)r\/Ά:f mr>(58km"XDskDžhߵѢQT/990d-i rdn^0UJRANͶCsSQ#eVunjdkqiZ'"qj~"_ib"c:6s>[6)uF&x,T lz)]khai`2&|`UQwlw`H$#^!h\/ A @(@ːJ*0ʺy@RZP=RjjӖ _ዦ/iB# >A&}{ g /OoJyw"Z:'뾖ɔLI5}2aLf\beo^, |ɝ(?z|U i,,mSz,H[@UJAp ctу}v;gkjO qy-c31]s|Qʼn#J+N_aʛě.sѦF}#҇_dPOl_Ɇ}iιs~LMu Vq/LA" J19@\H"*ɂd4A /ih2HF%mQ}M6gu5bD^"?p gtiOHr݅y?0}f+}ޝeFy|te?{7g"zGw?'=ѿ;T[h]6^ϑUBy4/`0ٜq`]lqLH7 'p$"G2rK %!4jCyj&96œYY UsQ`tu,[KZ'ʭJ?M %L3(nz|7ֽu/ѽ]^Hvs'C9WMU'?xGO {ncf(ʤM('TݑLef's.\ +$?;aD1D WH[!~mF7k%Q gC4]a{imS,'4/vNɺ*LXG%)qҊ/"@G&,""Ң< zSJ ؙ&p**+KqkM~wm-ӯKݥNZ%ץh\uavqb2GSSx^ŕL/cM ah(f\Yqv5^ӃsbvAm\p#-^a{:gNXP.bT$ȰƏHcZ&?_g^Slw;wS=zs"ksD,1:A3%m $Z cWm) f# !hQjѣw>d\vxijӋzh=ܯqc/7IqdM'@Q*j͸܎ r;f۔Yu#nMnGu'턭ɪcdj!UL6AT)+cW, *r_CO"Kp9:썠vl,HsJ\@3lV^d2+xTӜJ^su]9w![PԐs;Tn?YjVj&kM UK3caĕ{w+9/8؊Z.QOj·J $5kQVҞY/fI5 pkכoiQ~Wz"-([A8ϱD?1ǂٮ. "b Ic9$9}ZE[OUѿJq'aZԙ׏\68E0UM 6}u^,QzH-z9J@n ':'n&:E.kmp\2NZ@ w\`U3Fzإՠq>iQ2}ധ"O8X \W)Jٽɏ8Îo;a7SH~?l^|l*Cq%)ō Ljh&+py[ʹl5PKp[ 4sF"fOΡYzU=9G}s~}BQg3|+9hÆ|7f [ 4Ϳ5;G9^7r 㶔I Y@n^8Ѭ2Ygccwo^NRדd1}Fft~M>!{YWm{Ju2>Ek;K2'G}m},ϔ6X>Ihd5bsu }*Kvdiս^q[G/J?џH<{ʸ[;fN*8^9|nq.`-pF|-\z/a ~Q s|@r|5hcmZ|*s#I <݉g Vaɥ"VJ0;Fd~6$d`TX˫7y|29m:'"7!@̭2>_3>52Bʀ&qNS0/"]9;劍U*@R Eσ ZKmRN8*FfՎf³>Vx,b>}!z *.]xd _68|D'>DZG]VsIxC1WG\qީ}s$ ߩx ;'q.d]MBs! ~8׍'ľ]Q\Kk{iyI g=}G4(S&M0c῿@AYJbkU&P(a6 h[3ECTьyQ,IάٕͶ31rHuGD#7qVi{S)pǧ+Ns#uf=Jo m)b*Vx߰ [sq{~_F;JfY0DN69P`> h.̒168F%s%!+跤.ӤI O*JS\irDiM{*ӢAjmJ_tSdQ rQI$DeXƱqMajBM6޴ˡi[-#HҎ'U>Ƀ^<ߏ8,.L-֮Ljl҅J.O$7c. -v&B;q i,l`f:)ɋ~Q/K\Jo-m2 QG*<}ӻ%e//놎2~+/޽ęlS~'حɝu}@p%" )AG|r졟S3­!\vNag vY;RUd-L$ؚTi^l'w&Y]Ñ;wj5'îOO~έ+u̘h:s\N\zCC- S87vP3 o[D:=*GRɚk1rӠ*,tEj7. ^)ł\ BKqbos!gEIm w6Tc#: ") A0mG$qnZv5up;_߲ qO:oSW7lnG*#QpvA9)pO$Glp~vI\'5ݥm)`zd!YnPfPyuaDg}7{< 2.FyÒ?ݎ'WLE|ii\U4g%ZJ(˝y85SLTa,FtjUaqg#^2ل\$#-"i0[mȜ3oLp-0sc S9|t>W`m`( UڴyN@ XPa%6lɦg'-8CO>-#17.=9 Ce̖\޼~)"!m(S;$PD5/ l,>b lWCVv% cYZ,>3+1V2# Qwȃev'ҝ<"om~I>5r_+Nk;< @b:N;o $8s Nd47=ʌWۓg7Ѵe!6GdIZ[_+"™s4H9e%N}r9fߡ-"8!,A Ru5\E*O~{;&b%Kd1وxKڭsytHhy-Wn7Tڍ (~V$ 5?;!$c}g{ߏ,܈p&klEQ_JG̙H\H\4{19@یX幌4.#})2Wooy{޿e\~BߠOEd7mIϝ8ILt sCzSƳ7[M9PzSU{.¶K8_.RH?}?E|_#coc#d6' Jo;fXDX?9RTh[ظ[Ţt_JE+@~^@ū+t69s :ַqQ <#}=oQ{Wjg".X߷!~,:<~!ȀFae8>fKbhc8av/5̥zr9¥["^364zp^1k^!za Saras2sp*fgkhȨa?v?֥|dɁo_v-w1ҷtYk%<]AGag'4t鬿ElmJwK 2B@'9PI\R-_!"^^[ @ VR8g< m K.z,d\z,/]$~YBN8vݐ^fCk6?(f|=l+=OߑͲV[U}&wy[澴V__ྴWKͦ%7x!5b x|e߿ O%37O!M;ԓiq1$+6d}z>dɯOU]} S.q?O$Ou߬_mܝX'M]Oj訊lS>HG:I$$MI@$C!@yD%"bQ8"z#ݝrwqˊ=ɭNAf]]Z:ԩkWծ{$ƋHA;B}`o$_b!$cbkh+1?_@?=D z:gg%Ȃ[FԘ$ M"<b^#:荐WW0AjKT,;%n$NR$SJ.EZ.f$7{R344[ݮJZW ?ѵ<42(*jdݲ+dٟޞo%\wԸyjW޾rꖂ#gɆC涼^z_sAfxOxy\#8;g/013qfHZ2{|Lu2z^7x&±?D F1|Lꗻq7ڏZ"z^蟡|X-fcu6Vc|mJwwEYFpG)[GkHgb}CvA~O,e6:>l4t {;w#q6c ubZ35z:?G#￷/IMqZ!=ϵ_#￸|j?_#C$bxBiJhDgc^KfKㅶKҏ:GǞ8.NI}fY+'An8b]Dq|>(NtO \FO;io|lQZxjD4^Yv_~r zϧ85zڞ8.~5~AUGo'A㏾9]㏲9ikհr t7~AzT[iqO!{fq &i!!B+ bScD'{gIT/ϦguzQG^ri;^/ t +]zU%Kt}@:D]/xҧSsp{[i D˙έ~*l%ק@}px}z_H|7, >YԂr춠+Ms쿕>_|<1k_z)|E+D_V[<鋴~oŶ.V+DB;6-JD^WP+A$-'!_Qf SRiu[Fx^brgN՘>EHv` 1IB2˦ qCUIqL \3g(Iz)I8 , b7yqj1p%EcI.Qhw7`-~v}CT&Nz?XsN{8M0Sd($}>7E~ ZI5uosNֻw%= Y€g*8_ZhOw~Gޭ;zt=kn#e¼?nr?pPV},8 )/`]y&%FZDw`3mL#]Kkn]?يM;Kd:_\-ÍEoU6#p^i1M>г!*D܂ Ʋ]?r0ٟŜ 2E0S 'M@ϨhDO#T>9ms*Bpr-'ĮowU3_ktEW WcB b&> 9TthJ}6\-|d6@7v j{E>OD79Ɖ'0О=V;,/S64I '(DZ#D:X,TWL"Hmg}[o=NYg5E92ژUtwi(ƮMqپ[sꦂ#! x՛Z=hIgV.dZF*N?_JqG} ɔ18,F\ I%WWW%sxz|vI--Be:xb ƙGbKÔ*ٌ $ Gb"g% 3åUݚ0INwQWA.$%hA ;X~7_5ڊm_\ou!)U]W+3z~_NP,#{\ar/13B\V(Ypp`:`O#f=Cc NP8@ 2U wm{\P ̵?= lUNP4F,$jƛ{^MìX\&ϜTQuZA#p2i?q4IksV}uZ:au =]}R]Ir[皞~{@r j}\6Jɇ'P7"y(#ӭI3 _xi?F+Fcʧp=>q*M$}~s ]v6M JY49`F^n4X@\-<)$lRR&cOb%_(ۡlon|opn7\%Wy}U<}t1{ yhYp8Cۨ4x障E|Բ ug< vQVl۞D / iEhI+Kʧd&ʞU= mmߔ ((N\J>g}!nHf7}DJNPg"/l7u1,* RQrSIƱDiH< T{Iwс`{<-VA,TЙ(!1DC"HuůJ*O;Ԧ%gp|#()p@Nj􈗴owj=ތx/5glX~|w9Ut(,T$>VݡC4 b:ؔ!<6*>_ۯ t#"3J1AxD7:cnxY;})/{!:~{1ڳ`[krg< )y3*s *er)V.H|Ґ'ު 5 5mL- >Ki%jYhzۇD;ءK|v="O OMs+UW;SFb*_َ`W md6wG(ty hQtW> *#T z<9r.if^P䶟 々M\VAtaܳv>rn[ s 3}A#?,3@" >HPNM49Nmw3,v07JLa(~ZBh9ʢ}mcԈ?/?g}K&4Шj:G$|}Szou aE㙴;]#ї#m'_୽wDt\;GdZ7*alO|$ل*&1‹>dʆ{0T(A$< MZ@ns&9Kׄ9u̳Y[}xD̫Oٱv!l? f.*.,w(Vj Dt}S޴)u[W@cR>XID`ao27`>&Gb\02vnY|&I OƥNK!'20&+:}dz\CM-eN6;ZBS>nAȧyeBP*C+L j^A \W%ugt s;1+Ͼ0+@Hx";nCy[ ˱p ݉yosA\<(8 յUѨW*e=1F[azFMzU epgn _6%v(3I!Td{Kqǰh/9rI$|q3<͓*XGJ ] yƹ WoABӞFjwU&)_ˏWv)r R5xxnpϟ:G$h'?>-1*h7V> w:v:;"h6yOP4)VO$#}k*#dnKoîaB~MS[1l D?]Xf4E»Ta@8WqYIvC1n!ôAF|F{`1+cc!s*03'*sVr9 q<g.B9Fh_YP,{#B9kkUTHqKܴV/r}ȫhMdiMtS݅oA6+_mᔑd@!XWގJa;&6E_g{H#@RUlwؖbYԲ8*) YKÍ6M!G?js>&"-G nC;vԡs\֯/ nPy Sړ'*?"D7gNmN?ofM>ggBUضD$)q{lG$fz4j?ȿ[8>aiNh0RU&2sRay89׫pXd~ .uG^xJɮEKJ C(2aRh|rMjq=ݗi#:zE]loe봺p$E PREP,Wئ{~p_i}UeduXC#gsQm+͗{h;[J wdtx@LQE7哠MV=* Qpr1e'ߧ/\ڢG|w"ǀ:V GM)&&„ tVE\i"ߝ8JDMfC*<^5ܯwuˁ:Nͮh%YYoQ|Vo#\5|'D.M\Ǐ jw}O4 4wr ͥCjhWsaw&sQeCvUKî&K[Qp-%r.բ0z00T$UnrזӍE,G(*Tan&7KL7Nf('e%bNhnʑ9Nn]vrA>8Mݫ>~D70ԒdKĥQC !jŤaܥh8 CSl=`Q7ꗈ,>dZyi$+JWƃ hRGEڃ8.:z'|F폒:QTGb wM؟!7]8볈ZLՔJed4vY;}b̓wES>1oQtF =jJ.8rq+_CHLEI(<]]E,F K ?Ŝ3gUM&LE1fqӈSk}uɅؓ܌c8]$ ҋJ9DAiJ wYoh9~ܠy2:v{Ξu7l/,>>>VȠؐx{cebc23*,F.G:b_MDMKr)< _-dy/gXy32g9b[3H8 `H;E v>x~2STulEa|ytoYv2MgST&SOlsԉLy:SӿyK[GvIBa{ypitOYQu7)QM1(V_z1d["o ͣ,e$wCvC!;9-5.gn6òȺ۠\q-?0wPaצ4~AZ7K[K ?%.@R7jZPk0%\Z dm}ziA2=5+e2){QuK׻IKk1$.u>WwZrK9^tt8f;?5~B0=cqi?`^| Z3 (ŠTb VGbZ ʢWq 1z6M+0{n)起<Ʃ뱵:03 jـeK;۳^t ze.D+3V§f:ATlsHM^z$cB3qQ57 yTCXI?-@ԕLFvÎky7[1G1C!U >C=_|0Vd}ټof6{m|n5^Kz}>ㅆ%m2'O7̐,We}}<3;N] E k,NȬH+ٯO΂^?+J&=XR6$ HBe!nzCJ {A ;T㽏z:2=L Hpq39&\'&9&u;DH X(rVLe*+H0B)~ d֒|r*Z;vDtr!y슠% \rĸXɴ飫äCօ'G0rnB_Qߡ$ML.!C i9|R|gEItK *K**.eb$!kId%ub0R{ޏϡ`rVTO3<ҮƈKxPQB5%f aQ& Zt!m^w>jubj Z]]=[~J(0j!4gKa*ǛjlrvjKxQ&6Y(h VIjj%2־Of#f{\%6;?54jio;cV]?444T4Ҳmlmm>ޡ|%V$/Om{}6sQ}1]w>+=F6?H%q3ݺڧSҺz >o-g d]a}:f\ڎasةmsP;7(ˤȶZA6x9\Niw{{?S3#jqswH ͪ j1zPrxrKvLR$_9jO53ul6z_App8RI.Į}ZPc z77޷"hLlEh~ž=nDYؒaҰ4z>߿& ?06WgsD֯ugaV ߑK  'F 6=5~{`}rO^MgZ¸ ՆY7.4nux38\LG Ҥ#0b8&I,c11TQaIHbP=..&}vmO*}yNNN6xIĶ_J{ĵ[>gO4 [χsQ*}x0PĨC[H6}SAL aF$:98qȱػ8CRBRs>ÞԼY>]+-]qn^8^,|lǙYyگ Y Q `| ts.I~P]@RpNQDs&w1LGBlAYIh}8У{^-jޚX^|~7nX]7M ?{)x߄jRLx?Jը2o D_a,@nAvtLr`kE/ } 7{?=!ҍ~A !%Bz8.ڐ *cCk(uFG u=Ceߗω;O@C|ՆZSWgՆY{7{ _}j?kiDs`cp'/k _ㄷ:x ?D{n;+'$lO5'l j Ècf(sfk-Pw /xwt1턼" Ӏ1?:uHe ^b@;HyK\mo$sq&@} H>`sO0s]7I(qJ\A$]a]!$]dF\r%)]r\r,]reN\A$]aMERˮz2OےӮҭWRۮ2/G`##p,bN>!GV>GnB3rL36ܝgt;g|3 I9=h޳z x9_2ȏd@QEGx"#%polhJQp ? nn n nn n a n a" a͋z( 2i};/<=I q[ռE/(ٝH;ۼA.c=O}̝T}$ p}vO0} /p |;=^A=J1HtόfIZX;c}0{eN }fNP=N NO{.>{!#@_^ J48z0[-^~>{1@ˠ_^ f0z㸗xvQ*0rlQ1bݣIItūwǐtzDK 1-u쬊ϱCtOO2p%C:T: ;VL1ƃHP8vڔlYI4u-R%$2oaGadNGU[B:+ vxzD;Q%ਝ .Pg/@֨bËTbүujG <56qhXY@_Xkz*B, B8Xp?V;r6="--C=Uat a5ƃz;j /ͭ"#\ՁeQ5+aΈK벡gkB^Jrqe,FpYg\D'6/66qCoB5L F_/߭'w.(+Z Fi1%jPm"Db+mU25)8 O<Lj\hS1KzVO7m +4+_xk91zl1d: yԳt㙫{~*$no_ttyIE=mKg{.JAEwxr$4k2z5""Ҧ#t<Vpɜ-~& ˜6Pٍ ki.kڞv6biR_NCvbR]ԙA^^eZ'86fu_ m@b^G!c.Lz-*w݆m'WpNLb\t\6ƽ M\ ]e~l=$[-EUIZ \Iy>ɭ nIk>dOmZG,:S#dI-tRGȫ8Lb( 0\q8 I0 \g!Zz+='@s20  ?g-eY~\SJE q)*q Ko?g4Gu=k3Ƕ OڟN~MOhc1x8<J%-运VM'b_-=I%Bмr^ q -hT(Qov>ZA9{nإvu(}fg=S[q8uOs3(P6 ㄺZgؗ2Ӯ 3n/mSe,5 tI[[#aK_&cuV\N)+5]dj,gF#ԸFMn9?aİS+^)xkGّs`^_SXg)ŤwۄWH77jn@}3?5Rq"J ⨈+v2=y\fwXs_Nw2iA~~82kCmQOA \}'saA٬fOǺg/b.X¦XbݛY9_"'>?:ҧ$Zhgg9b}Hai"ϯ#D>|j|r )x3s&V>cgyvwW^!"oWɷɫ5ZNy^K["o^V6M}þc?Kg>/k~P+~~A] ̃>0K#?.O˻qGF$&7H,|iAEt5sg <7I7ԗ>b b47 Py$/ʋq$/q G0teM! h)`h[%LC!^,MLnn?B !?G&-1E,`[حo7[c\?f)UKG'O2e&Aݠ{S&O螱&?ßwW{/?0<Ā? &fIY,wVJVFV~VIYS9CћlGѦGshRh[hGhkihFy|mbʝ,*֌G&w}~?T/Wiڴmz6զMSDt|kjͣ47;}>SOzϛ>k铦3M5=}q}(8Y3'O8<zs;sԹsڹgύ:7\sU纝\씳ώ9[wCV96' dS3K$#iW. /m6gkg1cq!\Yfܕ4R017Xcِ3yX!o !RbXo*U ʺAzvg=XO,XoZAl0$P6]͆Ce#!gG:6ex6R6 Jcwlme;l7q{={Lck` yv^f=zLr܋2K-a3yNv<- tT&_/s`OCl,^-ϕ9lܛ]nck r\!W.E*J$5by\͖]r_v;fȶA{k8u| cH 4pe]1֊ "/\Kx;7<DZ︛e1Y\V k6{Xxff.WYɴ8Vc+;Tt*&&xTɳ&>ẁ+lك=O\.;B:W KNSAgVtR"-' v^V-3Y,ZR84 '$B [cbqx%.^r4fX%6qKvfd-nm8*x.TC24,٩%|Rڐ`XKjNJ-)v5Kȷt8'^G3z['z{b Nq G8zHu|$gF}N:թψ̤rSKN9-=#j-9ibcx*'!%@'PE0^vҏYtznb.yӋp};ߡ_O'~Ow{_j^L2{c3SA&\TK=Gz-_M+UUwH]T06FLE5Tt6VNˤo1|+өP+EIUOCMsJTUn*UԘ"hTфjr`4d MG<>%5'%jV6ݒ%&7ƀ{ۓʎhT| 'fǒ++,W=8}|ݭ+i }"^֩;Y}\9C”U8 srCoog{Wͼ}nշVq)dXCJOr,;p3'wHuO~24yNһj_UԅdX 3o2|̃ ;hFX.iN*8hɖ 1\%._T-Z.ɒ0N͇f1,N- WN#J@!TGscWeeֱJj%HSRu@AK vD%_sW.g!zz: &P@)RwY`tD`/whm_My{N~4u+76{6R׿Ex=>W|MH$S&q=,}h{2yɓˬw7wAv.oHdor1l%ŀ%Ū锖XmksQeZ>Z>h㼨3;O3]ak\npgLLpubYQJT*ϑw_ Ͳ lg f{?y5}:5ڻ}q3e\3.ɵ`d'vgߨEr kaQ]x,iv.3V&кuEJ3VH,jXR<,#,bU1~~X/ ˠ$Wc|9be! sjennl9Bc4i;9nNJ>G?,ijjL*"Ʀgҳ%<,v>7sgH? UzH![/R$M)meTf,Jif6 jmtj&ZRpA I9|>O|Fr/7A_*3fKhCl4z14x\ ̖i57t{_C}͟+KR)l s4wڰ"X,yeRl]C|9X"Ԣ`C `[%E>]{1ɂPydjM8 Z<#Z KYBPץWnZ&de oْ"(Xjߘ>]__4QCo壗X^cJC+湽jsu=aز5[La ,f5$t{MB'h="4hzU) Mp78T)VR-VRlPlвbxjgQ7>N:9`AÅQ cET,X*p׬6h4 VH= @ْQxBgyUd^?zՇK%[3 4Tr #B:0rX>مs͛q\BxMw.>֍]qĉ!'^xE=uh*ȞdXYG-NP+dO 3ũI`Ha6!ZLvj=zT\ޤ.vR(APK( `SpN+ zje=?u݊^}Ω'W{RI۽Omqxcn$95*o>'X5ɁX*z &`CMwu590W^#d*@ikw!pQ'QmxfN-%Aj:%9i5N]N5s{/& V$ p5Z9DnLd姺 ږ3I$1m-v5FX\^x4>21 4-#(d8Ip4Eю+Xš$ѕNId_s2zN-v/([ nEliقCF[왅y/cs{wޭS+b\[u|)73`53kq5e![pL%A+?Waf nCѹXZFl٥ "/Ϙ|E588ob?"#75Ϩ䯑Hm3)`a;e}+wT z{zjɳ'mCc/O蕚`t#Dq,fZ $dUh8[A8C bm:Ӎ-%/ުNsCKb/i:{o>^#MW;0+xȵL$B*@[yЂ$_<)fI$uzaZH$gVmXEeEjfʜ37B8>%$:w""i@V4DiL$(P3 mTE k>7|2?7e~iw5?ڶlپwmoN0¯- 8IXD7<(>mÞG_aD1C MX4P)U `Kcϭxmޒ{oid #bbHXxzjw'۩\Oc- $ e2^;;L^^#-m"`0&', vBh7@ `6ʼ;x+p)gC6V@ЀCuyPNVĕL!5qbgIa-CU^:ԩc11t ت2$C#_wTh*Y6hּt>~}ӳ!aDȩ5/CɷT|J03 ;TtAxG `+/ c.جGql%{7-!Ay;qEf cj"+L2cyt9huH L7u25ѿĔ? zjklU( 넙hDD1Nvg Yp.oN0ZrGFK%`Capv.Kxj$Na#[:*wA`V-ѯ}fş=:6HQ?4p;!m'ID]ZTprkt+ R{\8c8-/X3OzKfk-;2%PJ6w_\n޺Y^VZv؋ vSN[ci{XUD6H0s$ `M ygc fwܧ\m1HjnSmt9ʞGl_gSq5'Ol^d3hv<j^/cXJdMwAWu95`I8;Yu{1Bj?F*2P ?zZ})c?#%J0w"u':1sjBCD$&B.REM[0X%7bG@WKju|a s}n?j/wY߳su_ulukt7pثN{V+Y僗k(|}?. `DH Cry~痕3ÆӀ)x;%D_B톾o96ӠsD`FNm1|3 ;pܠClª|Uȗ0Ɉ7.\኎"r A0*EB80 z;9e|zm}vp4_!r [?u/COGxw:Z<Ä̆=tMS&a}a]9E\PJRbѸz!eLøgNW2 +XB7gM0|iU2{B cU4'17#5c~f!U}z$4o7˒3@)Vs#*i`ON$N}`! 5# znnQH=9ӜmC:a2 @a`D98O koa!i}͇>u7t,;G/Nqͣ9[g̙#v0ҿÙH4َe N8Eq,&7xDUXƠ̈&gd' d:ʬdOHysJB`AQ47YQG@OԪcR +Ln=xޝzư>=*ƞ)}& +J>ֳe!ܼA*0푷R^D "yܥjW2]lHq`+ ՝ƹ!O,Aj0&@7̩]O@q)ABL)`q-xtS(⓵|03KiT4+{T {b%E+D`,fo ao3BDT$:87J m3g >~]۽M[ڎ{^9|͉i[;7䖱G.u~=5au'w)O 8j8#WNh Bj@7S)RK goN2HN/PUS!;_ȋצKOsP?_qUoD<-5N0m#ay:dzdbTՠah"b.:Uc`U0w 9}2 8ZٱV]#GeP~zdG棾toyjwFf)bF{5rտȝ~yaH=K:/h@\"r/"A`bxk d_SENd410 [\lIK:qJHLk(q:1h#>T;3 f0RӒ#gbOkrԚ`MEAq7s0/Ы lʁc6vqkn;"&!},5Z, 3uNiNCqɴ.Յ˞I)FӺ{Q3?Y% x8`b\lO~ >M$.@h/@X7E* (3@A_ Au{hװi5Mݣ{IeuG ۳s~N׎5kC] ;Q(&L`_m9ҰJ1’XLՄSTmZJ"kE$2B6LHYi1 (ٝncY]BPM$ a_vD"+DjVx&qk%񎅐˛/!KX VM5V’i ;* }zC+S\{;aC~Muʋq`~кR@[ '`HA-2y,1m0hRĠG .J!KW/4_AO1D^ D֟vQ@>(Ɏ $;TW`ao o:b&I0L@18SµzjS475J"r|z/T"ql\)aǜyDlGQ"Td$h^ye^[\RU n_ḋ l:u17mHsH-{u|uW#Gķg؅yJ=kӭ)  ۟[ }\w#Bw?&s@8023z_blrECnbÓN~!@)"!%K+(jBd$yYp+2?j>9+ :fb+(QH(p'%1(@I˵T P:jv=eeY0)@(sUOYȲG2.:yOg ZP$*%Z7oڛߧ>#_;~ /rly"XCzVl֋ x2czHB34qRSReXLNLb1g=f1cn2eAWH_Ik֭Ws|swl_ -& q{`o5硶AN g7{}o=L#?kl.g`w+/ υ^dO 0[<yT)>\Fqɽ! B$#,-2\1t.iI1{M&uiT#cF}b-B=o%Y(Xf U #y XBBIR11Bii(UYYfT;vܹ;pG}?}Ͻ:i`~ƿ{dXk>FN1pp aI5,TxdM?tL9L7ӒLyba+zL6$9I\ СHɊŊ$qE%RA,A5V KSeQ1]cKXXwgl4p'6UG}{ }} %dJPoY.BB6O, kɥ< p) 7q+*+[e5S֮ؼ9î`yoʲUV;k+BWL17ϛ;d$LGJ"ee!Dp8%n&u( T$!-T&;^'t */_} |,r'şׇ6!M 8NZ؊m <="VD>*䠥!0GyJkHC Mf*_B>(fYЏ)(DHYP nG D.j\7z[ա?ؿֵ\=ҫ9.ySJPUUTy1ΚZWkgW|ԫ{Q.)YyM9i:oP~U_^E:D+CĕG4$.=CcA&F^3dZvHC^k6d; MP+1GE9vut4qЩ(|ciƱBON$!iT]0uFsq0VI ftFY5]$?) lC RNPi;H(Gm jY5W'pM}{]ow?S{Lw~~יq͛1oF.Wt#woѿܳ'͓>jˆ;g_wJ?sLGsH<Ԃa@d­@ v_C kI 3tAgEм {޺my՜{[a7MQCL//cϸy#4Q?TMr> ʑ>/-Euk:!\#:֋Xhg e#%`h,_KiG @(4>PĿ;\`.(t]/m*EŢRI4dؓ /-İƦuP]j{d<EpB_q8wEb=ؾplF?eWozBvͨ}'OUݺtc ߿2i3܂)hS4P-4{ŗ$GN\IbnP%xHn( b$)p%P-F,$h6k܄ƏtG'2gq={Sl'<:n_}5Ծ9л<%y!Ȩ@",\eRԄ}B[qV8R8[4숣+m椔 :ddl(BMEΜvE4κH5r>Lԣ4\~@=kݴ%%|`s$S]% Ee;'%KuMGMRg6򤚽gUuN~Õ]owi@k*BQ8oB %%>(X&Shߠߩ:o\Gl-0ML KMG .jv@7i逇Ѽ (z[YbtN*VnXt=~ŪAvZ5vrQӆo|-TxiAcnWe\پ}^6~0SW>V"*[WeF=b6 3@L}~~&>Qu]_" +RXcHqK $"D @ )A5ؽ@d`GC5D{.Hzyq$2Iy{(_rR2OaK#qr+O"DJ;NlFV! W^ ^ٽͅ6/5[SϢiyߊ=O'إVE૭e%,HdDpX2baRY͘T x6 mdXpDvXmه -=xbo>VU; Ba!z/+;͔⌱+ѽ"\g%@Ցuψ5Ⱦ}%$2 X!{0s+ݫU b;FUg_j->z7[%HfcƉ5 l\fac;xW^ ut/IW~|/0«\&$S8%03̆ڇ`JYKLd JR:#bϬZ7wybXA=F+7޺oy7ͪG{TȿzJ+< w/}k><'NCnSC9X4" MƜ9liMG#7˙ o/j|(}_6G*E=3[a/1sm8pvg!t[D7$ 0µT 8M @BiM"'65w},}4|m&rzWνcB_/oCY?\{9gtfᘪ1U!o4bTOV<,5[:V,tWz:ÍrSl%؁6R|Zkh9I`5re˨h9ɖeG|L,d#'2<bbaL-ȋdc68@*NEZXy֒a-Op|2,5 u`n+iX{)?Dps}QNyL :7?ʗtlSN13q9Ecmʗ4RTk93RCxp9)n E>|#x YR(J(K% T4-{GIo*R)OrpJGyIƦGP('(-H,H )H%H +Z[n+ImwR.Mi~#S\_ce -!g4t 5ڔ/A1۔ӜmSNcn<&'ycr?=lg2V]ӏm`;SI'pW?vJ>SxBP9 +m342vob Er$0%Soq'T&v,bVذDq+HʡT K2#[ kbS\I8!];eٵGxp;L†gJ} LpJ'z; I}K#<;̻)$Ʀsdz Z_Y[9lOr93ٓ\䐈w_–yDry"?GbF_=N$c5A|tGЎ h6TK*^؄EfL&Rt81"sC'84Џw,- "iQU+z2/<~F Yٯ_"*n8F8/{'\R?E2R1"Z׈ԥIiu`{rוA8tBbTF--gB)jOsfJDu6:kWG6HTK2 O9$a8xl%47j?Xg |B_V&[GrEKsomIJ]\=xI7&?3ai~Ã5|e#֎vT[QڛTV ~: ^x :&4^1ѕK-GWGK8wJknp!H 25A,JF g%-DˋD V⧰j/YR JC;kԺ%hc>&DбT!e& m(߅\.a1-%39T^ZEpSw fIpf,pe~5)Hjc]8iU;I7zs6;;v߲5}zW _6ћƖT=cϤEϏ*:qs9Z;΋+uq9E8"B׶o`מ踷-_B?[o[˫sf~nCz?AM弖h9qZA{3#szXuFy%PC49, @vD3E9:\mi5jzXSݫ?}=C>DV_߫!ޞ|2M }$|rCTA C##F!Dmv(W}$AlqBbD> 1BBzwwKSI}7VSis9WSr{gmusuͤny/:i7Xoke;ûQ}at$tA5u {b['f~5 ?mYR4ZߜR4v$ĸ6A \k?V0ocGE9B4ψ.t|f W\Qo? ռ/_2{QNϷ:v>$~l τ6|Ǧ|\񜑭1G*s]6㗸h sM "f6;b2aX; /Kx2MkzKh 'G:ź"sw׭($cC / ޟe$%:r糼dPuEzwS?\ay#n;uuK?ݿR?AAgaxQ_'̨?ԯ Y};էq52c%z{(7oq-li6TGB%QEr|B̼Zk9F=s,F:~M}crL\wϢMI-oi|zcasj WY>1zGlEgXm${xX 4yO$%P#΃sZ^}{^Op^Ycôl=O)<8M^ٗƃ~-~PZ(((LҰ,Sqv?VHBE6,X%$2[rwYs"nH~OԳӱ5,.8:j $=lv XJ(r~HM0Aa 4mk )Gߕ(OtVmre+3'')gŐO7tZӫ04ސC"ҡy!,UV!|{FQS[' g6.N=N-G9`$ qyTND |R˼.a< ,|$uqΨdcL[6y)ΤL>V(mAnًrj fڷO> =?#+&Vr ΐo-rZ(&ޛwQ;rNr#͛_.P"aCIE󷦬:ڦY$f_q#muF#;S.| &GF/v1 b8bNnIDk?ID7vg[3+#a1ф-iZx vC#uPNAj3](?3Z_Ԝe4kz>R: 1N iS#CEjy>Mg<c2 _4{u WD`<_QdMxLZ0Q# 1EN%!+a #X@E5Ē 8S؅$D>A^̯맯*X&g4ݛ}lErA :9>Ub_AeЃ~_ޅ*ևxy(M o ?(o~ѫ]v<|{$&W3E2R8z4Q=.^T+JDR#Sōd.Y(-?l(6?fB8p4`+NdWѺOb _a\M$"č}G:]Ox9+Aל>e߾mIAR%QTY}t'}_!diB! aB@vEPD@@DDD`\@\ADd4(.ʇ(:1O{έN@~}R.:U{YZOx](ePxa@{ X[BHD#$Z_mt~)ơ/.|(N1MbIy6`?6s`uyح Xk;tb[S:Yx/.+ˍ潘hy=1o1|$}s]^"כSx.[&z̸޺8YKt3j"X2W3sd!?d˒Ԕ$Dt4s1()89EȀ# Q ^5TbR ( @`L:-‰ЄEazu嚡>]6aLqkf2h$g0ޗOTz\ClC nk.2+ $|D{@a Z[ir),ߛ=aj@|9|D<7cw%gven$6jW-۰CaRYN*0c%h)z^jg':?JSޖyawbM2p&<;gZiQ.~ \P?g]]%g(QPUVJpC`lnn{6OKdb#B4R&t>.'i͖vV|{Q4< %8-Ӓ˒<}{ͦ\w<XOw'Ca5:lʡliqj fKtA$ч!yxxMv.j@格 :UÆϢ-tȁ]/[{)  7v`[‘E/ƈl32)&_*+!tQ*B憎1(ꂏhP3`P1 ;h"2܈ûzDV$tӪ3({^((~nw8ȏ9GU"rQ[8RxC1պ<6 Qt(C C-,16} 0❩za}Fa=;:0wLuۈ1uۈ`n4&馣$Ί֨ݿG UW3:;l0{PL Ljis.n:3 V$4<γaYc6 %|t  \Q`0uGXZXQ13ՙCJ,!bdM؏N–c%*0%2J}w RJ:Ԏ BToc{d @;̋<;/'b//J#D8`su7xnM<o@T ȱ(=Q2P:852=+.jIf~Oʥvfj8`Tobd!DdF6: ḳ\0S%QQܭrJTzD0᮹3!4p7]"Q%%]+*v홙hhs]I\՟m2B_ي)϶`C,c;?n7u_av-H1,Wuj5 ?=pUf$;x݊g]jŜ=HnK.sֹl%4WހgA;q|V2EOC.{7q}y< ׇ?M".#Eȧ-AF>s (-FP@TN;^责*jLUX(yN6xD[1>GQ:IsE48#egO4|UTYJYQT6$ۈ]ݎE]% (@Mij !Qǎ~&ة/8+3-aC_Sww& *#R-ZHɆJEʵES!/Y(tiAޗ%@"'%)|!5(q=*<\Xek;S+|6/_pu*j+y`ZX`#JyeŒ%t L",>Qk_F~$zѬjw2j,D< )\"#QeNǪ @qJ]wwo lsn|pa\6k]HEP'j T4'13,5"(扶Q``Z{^†nG7X?fx-*dosDyT+rh(D`d&PB=JP0A[Ƣm|s|{Y%{N[^j3b Off~f/Gn̳vZU<`c*lt߸@~8C7mO9\F]bŕ灱ίwc܅L_|bt w^eف=3i6c;ND7MԽ!6x5J7cr,Ztlooe~ۈ~;Ϡ{mR ʅI%!B}EfGI?7$7A8;!^p۲(Ņ)ڨ7u@aʤ1Gm٢\ݧq 2r9;PJQTU)6D,t*} <E'V[/' 7od #!6#Ǔw\(Eݴ= IғAu+M dh^ߧzАŢ8np05w~(+*=,HP׆VIY#9ϋiZط/9deQpޒY*_(]7K] ;,?>f>BF:V >˧ĝ҂cb,~7yv:"MR> ^^s?2%v -}Xo#tcG5" f/@9ǛSW -CG9z=H>w`^r"CufZʼu$SS,;4A)RFeUfۭ& "ZQ'gBKea,y]\hG{WTlZv+.͛攋˕B>iMglO^/]ڑxFƘXc陁~4 }u#SbGz+]_ ҥ=JuPg'KbhZ O->|̅ K=!{[( ~p31Gu@ދ*? ~xሥw艊[` B+W/PվXQ.09Ś? 9D,T&%nsȤƊGFx+0`]&Z:&·Nݢ4.`}fBNsYANn{I-2?D{tCsi,3XDyxBF4L4bpiѼ 8,40j2ˤJvxwFBw6qN|zVҵOa1@c=ǂ^ەkҀxd,!2 !tzېoCPX|"J',y.'E:f? Iw;_fȄ_ A[ʔXDG)!#]d7 E?IW8QsfBT#l/m7Bz̀vfn'Z&D$劔ܯ.hڙ{O-7]밢xyCShu]S9ӧGyY/jS^9g ¸/6XŸɑ#;@ԣXLJDk%$5ɨMQGL&'#|zcbKژ~ᛡֳu&ZfËLN%`@ÌD5.e5'gtu2]"V96FG<#mrw+ܹ93T| PDmuV=QO͝!Rv8ݜ5s+E;su1VNr|~<.3~'.~\Ҧv1g!^5ӣpkϺ؀ t|Gͅ qq׍*=KXogAYvaM"^-pfal\Tw2Nvsb MA /f9d'A?y L%Xszw=0n⬊׊&$TxrƖPW?} Z V Ƹ~v8/꛴ǯ-EtS㤻>e\lÊO6k؍%y{_:Ip[vx_IqYu 36'goC-%Y$i|9_ozbD|A[pUb,@Q[aL, 6rbܱNST$2@M}jt_L+YW+5iL]yOcz&>#&&TI"TpR:R'7 -?v2՝ /'FuՖ!1\yF\9JLt߆ozRmOr729Lqx+0ܧnc OXLI{V~X΁-O0NoM$1Pmn;zH`sI#uNvýDM>+V[Y#XAY-ʴn9cfm*iF4#{]VwYƏܖ ?:Ԯό;ֽ>xgɲ>Z9iB7X̹_0\cQp{R\#C "[`TfVJPu`DǃUn?_AeGz=~-AA%@- ([ C,Mwy"ID*񧋩<.ݱ"R9;&<#aD L@VHe E\;ڇv=ۻT(f/?h`뱁-SD솑UC[EDyulΊW3n'(c'9Ac<4$pK HzqeaB 6gڡK/i |5GXLuGH- ?l'TrmGol'? Qu.Rf ㈠0QZ6ʉ+QJ:ч3! &tM*kEE%nt 'c۞x|:ϺyǮhh-6`1r{_{G?tWk9c<4uˀ-8 hK&rkDĄURYF42]:%c"'7:e]#GL7F z.qyg6.7rL.^yob6ՀlU&2O–HA9E,a>tꖳ |lB=cR9RGΉ{`.O үX,|WNnT:Qb׻jE\3mO%,GXȟ\lBZpȌŞGӋ_ 3c> Gf 0ix ABs&CKJQ?r?w)_j>}zg*UܿNYISG:8DZˌ@ O:H؁8Ñiȶ-+l*,j|^9QԾe>mvq5M56$, Zz&$Nl# L[4X-m*nlsHk8883>#*ҁCŊm<"l'Hy:A 9Y#ѐ1.r.D&ems/>3o?||vzx㺈#yWb"bz/^;=l's}>%ktOB A5SQZhz` @SYvlTn듕Rv'Ppf}HF_Z?g/EkO>rв>l=rP~mVqFk7)dy԰Hjp *%`7n): :4 ܶ]Qh0]qj7*Q&Fu%c &1ɯxalØш0 cK0'oQĬ3L 6ŁW3O/\ŋ0ptJH-(ְhpHMhVY}bhڲ{nC<}#"滖ծ ߘ3], W]#G /wyf8$(GȘeof)N\ȽJ3`!+c4&d:4'C.}~i~s%YgD9qǕ#{Uh'@d]"ҏ&ikܥhP)Ɯmo݅FN]Ai#WBY]qT v5I 7B;M;pmZXA[5`r*ml$'G %KOnU=_o4^e/74i7ii6عhYXenYZԞk׬l(0DR ʵ6kr\{Q0šQ1rႧQZ̍d8.g R' )yo>9IlQkI.лV-ǥj^CmЬ1?Ft35_T40+W 7~ȟ~w2̇kC&T@&]D(P8]mNI3r{k]Rԛ5"I ™A>%rVY+-%6DFw WzE@>nk5"v!WevJF}XTHF= a4!&`bFAUt#$;p`yiC^'un5'S e;8c3$&ԡ^]w&u+q;;uMKplظX.lM{UHFsrnU@WJۏ{?9eubm0h6Lᐌ! =fWtP($)+FF,q3pyΐ5D`, h8@u؏֩5"=##6xisBf(?2t)^A7ݧG_9-bS[P*Fwq=`gkM4 :`@` Lƶ}ϔZƞ=2vӑ`n}C;9&b-AWae@XQ\1QHfBX<*`ﲻeLޟN(Q1_Hc1k1hA"">}|N!btzzP8@=䨶ƙ|ϊ? bK6bt/|7Ax}Iߨ{~Xh}[ X z k[N鋤kS<6Ѻ;^Җ$YmġMG::ӇchB Cp``b2Y9܉BR& PZ,GS,S[D&%Q4l>1J>Z?ERvƍV+0K'K6q!2"M9H7# n-b$b9Lf1[S+r> hjp +M7(ˆzYO޳bw% O^ykqdj.?aLk ?hÓ<mrZI৴~ø>>'E*00KV,RJԪ&s?@EJFZl{x{ʹ[AѲn8 (ZLeP}FGNۇOhQ*h z?أ9,N"`-VuT*+%83~傸Q{Szv6aMsC!'=zS籏~@ǨW #A#Ax- q$I# p:$ QXg{`*ޫ}Uq:X{#%O'CZM )7PvPj13^MSSigtS9?-+`'ѰA`X(GFPĘ;A`g G A|Ibԃǁ ̩N)S&O"6<,hK MxD&N$|20d̠&N+Q1$`#z2ř^Pӗm1aTH= yFMTׅ\ C \H6À>tRzyWX+H?=1Jm=geù!Ji{EX,di+ # D@ XmШuhbJNA0 쓗:m$o*P* C3O 7le ߕڛʕ &~pxHo?hihOcFGc³%do헴]sȼןw5)1*혴a+X B;aU |9+PJz֧AQwE;tn:D.;P#Xh\t$PϓOA!r8e*2G![ʦ;1,6)~W}0~#:Y"`Sg@"2>zh.`cyR=47lZpM9x#_%2_Wp%FS$<;y;틩.B~E>b},)JmK164a.{xFw&wF>>z=ɈgĀ\D#h1#1О T@5`l3Kx=Yb|o}?/Wb J|EGjE̤jIWfC; <|do?fFweB{xVF Qr_?M b!H:lF0-lR)o⠱4]Dk #^EfJ9 pF隺OxK UɨiEc64`s{~'}y|°338ո/ZUGt ;LD&a )eH*t?JQ2VS,CU 'ZHvWW3GULZMm-g`q >9Q4~U-mR _su]U cw[bJqƝ}uւ~ PR~Y]%ogl6=FhQL-B`hxh,&dBZj:< 4evr]`" Efj zZ0خs X;e[<_/ͻoԴ~V0qߍϼ! &,[V}dKFWftM|8 U'epRБ؄$D|?e&qVoDRe M(Gqb2S[ H+޼g'YfO]~@ ۦ}OE񰁳t4y@=tNCߔ/>ӆc~rniz/ 5J×v22_CRfcJ 0\F,+ 67DG*E(O^'d,='mμ1<۰b$v,9YЊcawloi?uuuC})jGExXVȉ[<ȟQ؍ ޭޣ(æ?ywn.0"c\[j{D2 `" :ŷH[2*ё7>~0@C+);\Hn\ 3Eap?+aU2?2.vZC1١ENV Мv_qmxQt@$P #`CBED%iYٱL6!eT<zZm쬪ⲑy3:f̡gwܓ2W h =A}n̯od93/&I^d2C!)и@0?ȎѠjVN9X;Pxg,{$i!0|tPzS8_2ALhE뙤휂g%.<{rtuNL<k-O+{&P(y=gRtlG8xȆ$0:qv,@D$P.Tқ@4Hg xwd"(, Pl|fYI3@2a M[W"g)t5~SIP̠q $jB;0QDdޘAR^~XHo>v@| ijgQ k?R(-ji?pD;3Xܿw]hF19z'-0`Ƹqs{6j}i>XeV'VD Xj 7[)OmH@4鏃9A>B<*䈈U=kPJ)U!&!> 㖕 CXa_vKnN˨M /V8o䕀 xuc6D $[L J$ 3oٜ¾NF$ H{MEɼZo۱zekjX{p༴&s N@"s^%wۊ!&0s%(2@{c /ؠSy1:%˒/[_/;0~ڒπKJF"&e[.pgrJhu@w^t W5)-'c Bv,O|XhުMhʲi<}Bh?to?s ௴wb},΢'^%2ty3ɲC)b߉@Mpebeae J zQ:oDz7)[-{~6x.4: EAW}(Pj͌UsU3R E݂],$)_#QQ -0c&؊xx# H 5HZ=uE=7(ÐF9_ة5H,.wReԱ+v\ퟏKܰM<0c\;퟾O_7xIl2#Q1TE ,(P?*T,3I*M+w>-Q8i(=,8vYok57,uX> 0M0}q3%.ogd6,#&\ \U +ʙBXWАł,qE#nX+Ӕ1WTNl7j_%Bb%o:]f$=Ecy;m.}ֻQEktNצjL{QhuuAC5m"sHfyBtE'FrNh1I:/RM6zO<*`d]>R)\xrŧ^e욾׭ڨ "Gl}vK^+gVb.S@%@"lNruWdaߙt VQh ov3F6vsQ; Lԁ "Vơ͂䑌d kR7Q]-]UhI .]Zѓx-P´.nWܮhr3wT^ux(3'n0e&|E4&tmMwa ڷWϻ8}uo7 vżjg^w|"A{=vc bK=v+DkMZ zU@#]>Oyl`>tŽNL`4i{H^ɫ<kvHæ!B}.l |?rS[6V|nrXðμͥBwgͿF~s΍{%.h ̑/PoFXCbV."dY]eڛQa M0Dz^ꎄz{N2KӳP#),XhѼ~2CCR(L.(YbGa dB|\ h B;nTT(*E#:]x=#㯻KsXbsQqY7SeJbh@ˈ~ͼi]  ;? Vl2]}꫽i+Ϧ=DuF9R_^QtNM`&N(8v@ ˠfcE I aS%, dCc^dQ f.`ɣPk)C d EV:_OY}֚MG!]@L;Yfe>G\|V 6%N04 QB=Tȯ°E4DqGhM3Atil Gضqͬ:8^rS,K]VoC2h͌Աo;klv~k >޾RR3,}{T;xŘ` ʀg+2gwS0~Օӕ TxL0YF٫]F*./ctBOY!ɏXS0iG]R.J/XϬڛg~6xm$JfUSI%h]#WJAYaX~k]H3)dA48`ECBƂ4΂(*)h#H$}X&Z="$1"n%1"a!2w?hsA} ]Ŕ9s=&ֈ,m$SA| =d6 9@ 8%SbPl9a d0g*'KL" J( u И9c/؂mΨ0>QZItƈ(f;PP3o{#+F\ܨ3#-&QdCP,(:Fhpz=}Ht6xK*\wYP$Ĥ3 ArYwIXK-K/>.mZIJdbW_S>~XRGG=AS"r<4m.EvL#XM6t`5Ʋ4+UjBP99Hr: #rβ a,Ȅ @F,#ɕ@N+%iF՞lD=?JT략V(Y.i2r'E?'iٞQş"} | #.m|77 ج9,B {<܎H.&#&c B>$:B>~U>9(ALUGA{4<=veaɖD6Ϭk\/)Ѷ*^2~>0٣i<>{ΔOܓ&g8~9/C+]K^GnU ЩG5fXB]&LjV;2@a tdcJv@"?QD![o6V oA%yڗűwD, ?i? 5,qe(U9T#x LGD+wjF'I|Fi3-S6kYۨ}?bwZ3( :nBNhw> %)"F(z8TfѬ&TTd"Ca(ԅHuW \8LI2FD\VCRQEPߨ`Ќ @R]b2?!%@B\* -Eb W!Ѭ[enrXWZJАa,;6- W'ӗʎ @~Rv麰r '\?fx L#z%EI]D]i:@?ӟ.tHߑ&tiiK3,Hb~EhbAlmb63EӎFǽÔ  lO3vϲ 3 { HSpe7qgj'ַ3"y}Ct>ƀJk 96lUad$p (B%k os-XV1Qo0)%Sk6h9ūFRZOϿ fe)폪C'(\'iJP -SJܧ$e֫8 ׁ9?oS2=Jt:+Qe2P⧚ ¯LtD CBD(3i6rjnKfF5ŽYe˓Ĝ3 wQ;"dr0Lzn7g0(z0H[Y2rgLBP*LxGْDךU/9smw`zhqZJN672dS.l`R%)ŅuIڠyu/ƴ{sexec+ڋUi?iQ(lxi߸(4OЊsk1tA^"%bGs(mYȂΰBiqpJ]_҃tY'x ~oqk5ӘшQ oٝFã1$lK݉Mr5 KFhp&8qWHoХ=zeݜ>AXaMU|@Ҭobs_\jň}vwHZ f8ըfϭz 2ou1eLj4c@g|zeCrVz;.4OkD1.K𻋣51=Dc[SSP 2!`B"/:q/MÄC8]88SYyzzͻBEMe3v^[8iJ>]޺M;^ R͂"Ŏ[,PkQ&Qd S̵ #$FԺ2Sa8,N!9Q+EEAd>#=8hyգ(io|SlRv6O= :N ̌p_ˇW(f6_hir[=5P,,}X2zhyEl oTU$YVdT3=B- ༛bjcO[+ ;2DsE5eG/:oh1cؗ8?J7!?D1+-"*- `&1ԕM>؟oZҳ'A'#EeN!N:̾V; QNB)"'1d/"w|,C )WsHs|(|I_<~} QX>bdfutgTS>ebW={w³ɽ{uڝUWW.~xwA4oѴ<`.`L1?~ׂ4B:UX4aRXlGkD:xh`͔l z>]v%xs]$3?W8OQOgeQ<ݫ1ӛ GN=]n1+wذsoGWd#=Q)t֣[ C{bЅ҈'17Œǧy'b)TSk97sF`’q/(g~-aJ6:* mқP{V) Uv!“coARYFUz{9ԡGձRz Pkc̩|[aWΪk(\ϣzI ɹeg/^y}S+ }'VKL4??{+e޸q{'p%l_yѿ=G K@z&_ǣPoCԗ5֏\^:OhϑHIN=5a՝^gnO v7Lc^ϼaX)aN0-xC]aqLf KpECc2!*x>2D  Lf0 FK82&z mK{cv&7V<>SP WRf:ӧqbya+&VE-zaBN{D a9bUBp^>mઔ5B)+P Q[i[qDqO4:ڧϢYY;l:j\c+e/ЗXF۾( }DyG0*ͳF陕ڲtyۈ=R8"zGPLGrt#7OS mhoj"J*u0=aCjX6tDhkaNCvzļ>a2FPa:z{/z[tICn e}`P wWL-Ed,gNMet\u8Fo_.t=i ASx1dyp`л Pw+(z+2Jq_"UyK\^Y%M*󎲫s9lzCqeޡv\1OsȓeYJOBzt X7Nϙ#&4pzlulɖ>wd2:*撏:3'-״̷4ԏ(3nXw<.i3|y VӥWco6ϜRT_E5Ϛ1^? :3n֌n -O._ܭ[U˭8GRc.qa[QVbe^3ej)YKerk|TRAEUdQ(=nt DV(Xo/2jIBn9vV7`]' ŚmS[HUL/ NսphГKMqk#s&;OVY^c՚2ueݾĞ?6MQg`QH~ 3Ku- :0"¶Q듲h&ac@n'Ȟa&9AGڎ6oF Ejx"*W"H2clDt+FpG6@K =Lp3E"LHFt@eZrIry 'R%j4v]g-DZD*>L?Ľ |>>nKBIH$wFDn"H" "RTY"x"EQjZTF"n6~NfgΜy 1+ǤT,}gSc/_B/am#xjۼm{[;t^Y w]q+S[NYl#2 n<$TR7hBPQcL\FdH0̝ 5Tyh?xm Nj G8l 98p]Ld@ \zt;؀@%-|H`ؑbv@>+?sF۴Q[}QqWSEo eA_x[Ʋ:G`ިƹ# ~z]#0Ǥ+1Mx(*"4[ ' D(F Mb1h,䨢 %-vye\hNAES93E d%(is3Cf!>@I#,x)4V+mψ:^-<+izwg>R^c(EugjN2\ǹPlʂ :bOP Tç:s]`_s') q&6V[qzqtWqԱB<`Uu0܃lE7M_>$[+d0N#zI!AnmдlO辱y/Ol-gk;nhd\~px%JΔp|'\Ŭ'{m=kI+nXJ ޘ?!Јd(K/qBw44Ģ.aXgB'Z~@)mfi25MMct@Hض݄X]wPI*&9&6"vYe ojG|WTxkcOûGĚy[ȼAiTRCnjOF <@#-,47ژHI@P!I}|O ɲdQUbٗةIt`R{M|^1̔.Noiq`4"9Ҙ4E#iSA{(ˊ!gZi-_ȡ_ {2Z?S ~#al5O $߄IPK/At -@O5tퟙgcHP3 omO)Ԏ4 mgCCi, \WH\ xeVn#ºh`qW4r;U|؁ۃb2+(8l%y+@brRђ)P}%>V%'dɮBA$=@4%2v!m0bRv_#t_ռTӁ5G15:v^#&b &&3l@z!B僷mi#imX?2;Q6b!p|L8Ityݸc"/&]D59ndaE$48KH}b7Jh+ىG CdnF w>R=(6QyWq)$jjf#Oك}$XKX%"V=H4[0 AM'[¡Mc{/PdHery\u-))0^. C_% FdI B)v`B\QPV%O˦)kSgQGb$(@+& `&UD"Q@]E lRBXq;6@ Dfز&G@rZg,^^2V ALBdi B?~0%Y@XB])4{Ai 45^|,n"'Wzb1$*X "~\R"XTLŖ&kh60*o 쳲lʰZ7zqD-{>mVϪ{ZNR#K-ynĺ<8O:0 SF/|,SM'C|T쵈I⣏EY? FbSj1<,.Lx8pkEj' apDpRb ;BRSlxA^t%!Tb"  9.XɤĈɎԤUiȑB .桜W|xS/']"xd Bc̰VxW)O%Z?o901+ޭ|7iŋi%?DDHK%S$;>dۿ&rR L-΀lσ(Y(s:1S#ǯ- g cdߺ9ZJ GWZ";bӿ=ʌ~jE0E=MGNF.1pC%B`ЁuYKuqx(?wP,CtӁGSvM3ڍKTW\7dގ=h^#tu,u K@ NF%#U&h476TTA&/eBڷ;blHvz%EJ//:H!r`;%Aʏ2O.́&p&>`tim LkEGXd0lot'K{'6K 9̜3MiusS&m൭Q4l踴VtYt&EG2pxt-Xv_;HٻԉfI<hT/2/T.7 񋯍=Jm,X-161KH Ev0 I<I[MN@ Z`ܛ39&G?sFҲD,!`a"HV%eN)E4cyoAڨ@tǥeLbA>$A >Cp O]`x u{&'ii@j6/8/)Xطt,fS8^;fl1M]jAqT{iccs&\V_\ޯ45J|r`øTƨnk>궦bmEw3# cN2iʘV]))#gEA3DcS> #e$aR}@C|.{4b!ѿH@.x⺉c+FOv]8N/ԑ=/i_CACtA$%9PN1s/5!?t i&t7A OV '$]̺=2o9xp`-w.'X /~Ѱ#"MĹw#d*`rmG<&R4 s;;1?uŎsrgZR W3!r!)11ER1iI@L:A9\;I=+Ug $1C)RT#?dYwNxV{o&a0*3dĊAYtٔY"q̟\7τtUw'dq5]vMɦ˒Xq͝7=@.شeWMt3wLd~u|ݭ@}m_khִh,)Q^0<7xoR+ c44ݰMl`'qFȮzB8c8*p;TLIST|pqe뾏ʶ]T ՘.-J8nJNu CSPE6N j(h;|۹X;kV Wޏs4P.}'n5XQZ dUIrk@^h<ѝ l `@xJv bbfhnWh"쁾Z, }U k˫ZLkuיZ?sP gܯM`2c%՘ad]o T:'I0%$OҦ7; IgG!GIbHc#{]XgjzHeZ1BAa6XM,B ũlH)ڊ$m!jo'dyY-F^,#A$.Zˁq`w񰿶3oiijx;ꊨ#1ȅʚfȝ:ۙ_>'H]U"WHL #R8/גHMn<^K1Vá e@Qsf#h4qԋ(+t*YCRuB,HkĽi3+0|7~ўxKLi%qY8uΩo|8SExܘ|F %RY7w?؇E/e>_x[2L_fn8~:k wsgRJ?%F& SlLh tRX%`A9s,t9()"i$œ ~w/Z˨R}N͠l_wWc1/:' VZC> ]tvP[C?X R ST<7ۜjQ_e=/)+JKc '{߲]͓:}FǡͿ1~X5<ڒl*O(ެf}?hM4RX-o[GrJM6/xeF<@=<@{w>fAP`6illS*uAhf4=|g=" yQ| C}S=mbxgA:Jy@[͉~m"[>/6hx!hZSpCK'r<hR sd)0H{[fWmCmaL~3Qۿ!ATO(wjdmGĄOR<7bQ}h*h"KRZӊU:'"48v+ӏL 19ic%/qI(%%g؝ϋ=ʶ}ڀP V{V@ZJhԁf\ ?.:NMlb]0G. HHϤչ9!Gxki=Ϻ89ڄce5Mc+I+}t5_ ID(9]NhclIȜ\.Qa\W\F@<ώ q)(ׯ~yS+<ݡ5Cs. ^ :O~llo;}gl4m͋Z%ѐ?#:yR,oµʹIsu'/Z2/ `kk@%o]YaJW68;' wx/$Q{pDx?8=B}[ n-n{_љ">ޏ}0f>;ZO}h7%&⮄oX.gp HCc댼pk05ܑ(;pLAf G "N"#,p>5}.`C/g3hة[~q#5]C-d)U,h1$%gPC.t˚,~!y B~%aF@.r dgRO27Y׬KERǸ5`:x[-6r♚_m}c鼫 cNL.O݇\sPhιiRP(UPRa=W>q`;Ϭ2TEù, (l3;iICpD҄#8s.-G4:$=*Dz,Z@U?"DWs`E SM<.TۚLp[ZkBdHߌJj(z:k*}K1~Xr`7 @`m`9+z: ڂ0:u{M ´'CE_ݟ52FlӖYCmGA^%ʜo"NJUw^aOvL, B1d;~G9P*]x{QהFaM3 㜿O+yǟ&dWj~t|?G?z'j'wGa{NԎK]f#3ޚC&Vl'̂]p&`˶ oYӺumAh b~4qjF ○u۩o&_ߺ^CشQ_tŢA%F؉]wh#Q=d5[i{^#`Mo]>Cռnmp^+1Rw6׏ ܞ1&f:hzD md _o/x!>aG+C/%`;o?w'B[W?]bk[z?׶o](_׺QuYrkC=i:~ڵ?#uCteSI~Wlk_f"dYH˹yqw# ZCئ1L oq|Ok[iD!/">>38>?y>b#6sb2?C<~t녝*fW7Rn>O[?J5ogOxlO7=g?>Jߋɞ||S<>ٓO<Rɞ|>b4@c{Cf-jO4_n|}K s|=?q_CY,?۟}XǧY?^q|[?Z)؟oN^߳R{Dzʸ_6ujEIkT n% ^(R?`%j\vӿ ZvS9DP&A}OϾk3 8Jhm@mڕDvԵX,N,BQ 'lT(>(Ʃâ8B0p>Q$uEх;AuV1m:IJi ^xcݜ2eD<WU`/@^J"נ/:+KEn'Uhb׵|2~BzOoذc'бY(R~R|lve#,aj|ab[Nf& 0@ᣛ5n Y"+zc!SS?4 {8cQe `);b6".8"TdPN"6yz2Bv#u"s3^_g|&eGY9Wz4~'Yp{(o 4x!? >4~4ѕ%' 1?ڀ5dMy'CS_>>9)aX :t]bM@pJ"oեb;+}M_U&oxQ`K Ǣ_ïSouP~%#=̓\gy$ ba&[1Ea%[[aOPuX~,;cIvL؛WSJ㺫_%¦cک\L Lce CD2qTb b_iN.[7^^y_^ݡSszm筴䎽{Eqȩy.Zpn:vtn_28kboR7@ "X~}lpƽG BFyv3רAX:=BȾZݾ%tD)0hT֘65e+3ۯ|}:vüQnxG2YX3xH+/ճVPm;՝t;:lM&w(&YhITUjoQ@!V! 82;5v'D*VrP c3|o3;v;'?)j䑆^d{g-#ĪAn7gXcN!N ]t $1мgUUp&t' YE$f8wR?3H:!@Hn$}Sp1KT?u6"gqV@8-lV(ԎU%@$MI[m :Y#CP;&7dlHC$-V)`)bQ;b L6i/ 9C౸k/ܟ~_xiLLx?]WWsØ,WjW gxT3J+x_Մ%-! yv?8.|WN14j*!B:`MD@"Ca!͏M}@V7EǸV+Y2kHz)sRR'B X`4XIȤZ%*MPlgNJ%ˑ]':?m|4bVMGR6{\޶򢢞Sݵݺ4Jrf}PFzA+E:9LΟ87bqzfCQ2C ͩc]s#*gf {۰! ~l[{: ŦgU;&M~@;Z¹DqeȌdΒ\!.9:iS+FY)6bRh|q嵋[|Vd}Ta=%5ƃ<1тI12v)'IT] v-$ExNrS_{/*14Кn zI0C5cr6٣Si+o \Ž,ԱΕ8{ (GLu~A-UAX:tra@>#BSfdIˈywۦOEתKKk|㮽sgݎ/0_; }5Ux&zuRy7N=uu-7]/Quc"zШvQI|PeגUltV2iLBOj'\Oa2IҠIHڕ|#Y~Е[1(Ҫ2J߀TF@#ΚZi:@Ǒ*a@H 9%Lh;C7?qpY6|zvs12_'SPbIUw٤ױ,n0Iry6WM"%1p4yINq ߱0QP^xI0p`XהǰH4hM4r }='v,dhϣZ/&û>HB{Q td`IuA~`(Œ߆|BKgO ":#eBQS˖8t54[keE:HկgݹȠ Jૃo$t4NhYsg/{h[&^ߧ0 TeO3 A+ }/~OEx~Nq#q"FK0G~rU~AsPK?BN_3U!P~cŏJ#,, i4NK#%C),^Ȫ}0|q܂v}HqeAP" !i >ft^!nsz^ 4늲U9},s~ml;?aZV{3N3}=Uc/43J=bh|:gE8\.d҈]Fk(B)c$Q IUM^*}az &+nؘN"`el+d6+I6cH&a_ LUGuV2h"*&O7̙'_2K VjO6ombclyY_`E^Bc9D J̩sjPHD`Uq+H[e#L!{i.Kx 3gt F(')z4|Ң\dlMGR8iFO_pz=XĈ_1`±u7/:6T=6Tףʹ5-Od "\羰-CreRK8Lu!A~ ?n}k ]|%҄#( cDt^}~rK9,^/sͨ !iy 5`3 Q^"69=ly\rk#be'6&\a NJF!+fiCk.Y/WNZtYuYŊvSsG uWG^'>kWsso ܑYa([ * 5"QgQ'گkpr-_#"zjK$YTmW{%bMrZN7@?ugqN|^ ظ/Izrضh|!&~-SNR1־Bp;xZxXCVXdRX S-z 왧h9'n9mp[-3Z0]Zz 4kkQE'Zkk8t˳DZs:ۇ);n~F Ѻ%bH<޲qzݖ׭_],Yh^Dԕ'.*z*@Uq2@^uN2$Sfp?b Ù& R,lr]񪥅՜:w.g{W_z_P.#K6|T>jPܿcgudu:R<5lI V:9e'r&/٤Xc4EI݈dQ5|tN>}nxq+ƃi~{Q4m~Λa\cB7Ρ6%Z6[mIº2wު\8;%QO.-D5wuzE?v&br׃,Mb}䇺N?=5Q[?i#6w[=O[oc>]nϧgxR?̬nݓeZNWVhtƋB." ۱H'C4raCSdޒ=pcvc/CW`܂ׯ[o?&_:u =cRsL(PH KdyequJƋߙ)3-3@]2";&k8W83q>SYJోS//gՏOZrZbۊҠhx얉;PWw13_9b'AB#4GvoE|ӄh|4;x4ih*hJ۫x;ўe5&9ۮ适K uz UV_i…t 5z"DDDCmdjr,xd17*yɿh~=ʼne~[ĝfgڹB5'av1vKև@=+]%c݇k oZvOoI=2t]ȹy]e-١B+Z>X[6m/S׎i'm=P.U.iGY;p1{2_'VSk ?E7q2uR#wֽ͑lY^|,oFC ݊%($"RO&o./9{j2v#_BG4i>(+n+CLy_F@]R__ [Lyp~jgs+18?: F+'n>;piǒw]6MPwrIR Rp1әSMrv]v-:EM@Y\yOGl/}-S2; Gۭ>;;c(!>*6#C7_`S=cr,nxȇD gis~DC!)L$+ j hyarյ)ޢbf=>{i{@|q͗hR{%3dK,rngN|ZDmVճ5EdMSjTNL0%- nNd#aUw{; cB-ɖlA0KsB%9)QC~(a^m_psX[8eyOyiP_x x0RX,;*  eP(3I/S,݉&g\{Ȥ3 ?|sG)^!V$s@z&֒#3s/>١[XTWM}Ija~,.ۂKG-u\Rwie;2c*|=-A%9A AQ4B֧K5y5rZI(]tQ5em6۟&#>cEiu۷X}XrD5RvB<&F5k=I'Nļ(h\EmNqѬγh=CqI⴩N y9"d*sqbl7RĔXg< weit6W\f;1EFP#VT!bjL0"cKbo"O6`xSj|e#.5 : N(!*77߀'"W2__HBI"8̪4wnKO@3v$|A@Ek,h#7}W14*% ƻr[sF,Wt>6BF^? s̹s8naՅ '[dN\={nu+8!s5,Fx `qJCR?rLc5)AOe~"=N F)9 ~3Ďќ3X9Ht>k|%h,iz̻lF hS$>Em痊@,ռHd|]gћw1P7K1r%ÂJX0C(ȩS[V8<]W6%GY.N|]Wp횆 sIR< gSTnZfa"R/جK_xk C {qwUIwׯz]W6;qTQ;hkW mcoskߴ{pu U@ :3J<,zc 6xpP/HMZɩ.λJ(=@1<߁ڴ0-ơw_p{}<`|X| f>74z\l-ѹߞ3 9׍mZ KJv_m_Ց_hkTną[PFC B7i(=(1 a AdcܢAc\11N88Խ{W:uw9Uu+tNV>>){D>@g a_Q-wj$waߴV Gx :n띍@ߎgq," Gz$DN]b_wsP;mW%6WPT&#Zkkj|j4d2nlЂҾ-?zm9':0[;0#3#{> 31)n 1Gʖ9 4{'$1JǾV0t@m}ymQA+Wj[|(G^{v C=E /Ꮐd:tݡJ]E@o# 6* T@;(^,gi<*j4B:Ns~~WztA{Kzg~$(>Y_@?tR?}0Ņ ЉX_tj/Xxg@EG)kh_Pf̦#[ga6Ϩgf{L߿iîf>v@Uf_D]Գ3OuXE8s#|*:~ h>@7dKǣ7)wE>.12};gwK/7Q`(MvZφD{hBi-2;m+x33AX e@kI*H $?B/R<o-Z 4B"ȓp*| k )Zfq6(vJ cmf>Y'Kt\6 c$z0FLoC F-4OL9 c8Į'`6ȗ!˞J6 9(3TxsXxS9i0z/됦XJrϗA>A[`S//0?PxA^jŹB8 wq*yư:=+0򹅕SlzKZypZG`c]-MA`?<ZXPХ4V?ђonA66sظ91T sTE6JW@2WBY8iSO.b>1W?"`21uhaOXU1+ J U6u_{¼ԋՋ硐Kdg){f{ODyze f16[1DcǪo 1hb C߁ i@s&->z[wB}Ǚ?yG7Kű/<uW^Ry.Ή>:{~ Ui+ v3d68@<0?Av6^G\gv+:νpA'S֠>"v89b`o?Wt&fCH415/< 4`WFsW-U`\U(aly|Ӂ@&Ts:cPA[]{Rx>;vp`s!!CeXаaa}6"oDFQ9ȘI#Ft\2֨*GՍ:4Ԩ/%xЫ7BF54|tчGkWkj+5&Q].G-ѭmZu'utt7uD՗3o”ab’raKօ[ APCjfmc(7T g ||JNc4ȴݴTkj54]0]34oFMD"""s"ݑK"EnYy2BțƐ1c2fØ{Q$?oԐ(}ԸIQ)QQΨQFUDD5Ej"zԝc>;0:$^.bu>fZ̦X;.vulK;nP\fܖ%ƒhIYJ--[,KrrnUZeֵCֳʉ'L9r̄ v$T&%J8p1IՓN>5SOU?UM2'&=Bl:pjԳO|zO^3imӿ~=yky3g(SIq,LYif̛S7fif9gZ2=M<3˟̍+7oKߙ^/Yճ?G{F5n5eN</!{q;49rʹӞ={!oN!G朑s6m^0@_0w;;:  =o|=}(aqFqmIb9_@ւ{ f/dq 6m,pӦMw7mv˜-^J~}k/~6i3}޾ՠW['}mk_%ղw_Foߜ5MG+*/W^YyoyʷgUNUSѪ/Wݩj߫뿷!{{흴7eo^ޅ{Wݺba[Vv}ʹ֚,7ndsvܻeﹿp#ok(n(kаPé _7pQh h81qBcbcjcvcacYƝՍ G6~}&ԿiXSxӄĦԦ¦Mk5nt鳦n7=lV765l675OmNok.n.kмx7vwmKTK|KrKFK~-[ZvT4i9Y-[T <tpA?`-/VM5{&]|x~8/{aË mGzp*Tݩ5Ov6eIh\yކ7tF' B! C=A(n(sP4 m@^a "n>B W&h*7C(Z% 3TՋE% t@ 9$)ܬvIW BV.-kJ>\L+lNFH6E[]Yz-'Sh0<4 Ep_؏zx"=N3sf"(284M@Ѡ'8Yu|xh28MEO)a; '΂w'۟Es(7JWvtFz ^@+X Cװ UtC{;4Ղ5d-`'&O3: w(m'ާ< w.__i9s|Cσ2 )~+޽/@)ph)Z23ي—5pobp7_{@c'4Hxx ~3'4!x(cxuB1;euXoF^GH<GxE 8X-؊'xx/a3IN4<'8ĩW}~p~j, l7Tp6sq>.NvB]G?"T뮥xp`brex9^W7x3D_×F«EF o[Kx+~oïUC|%w]w7&o*Wu;u\ux?pnMpE >[{maz5| 'I>O3c| s<_ _M /5:?/gW| O w?=O| ?7܎=Lޢ&J"jC|ѐ.ğt%Nz@IzޤKdH'A 2Cዩ8}5Ft|AߜNhC4flj94QI|Z@E ԍ6"ZLKh)G[X9h/|pz "@Х. HtH7t }n/m 5uA7i%}Vѽ orZ.i==@h#mͪCr'=a8PEز.&Qet^jWDv府*Db||olؖewfQe\ VfK$pl* s@hE.k* .QE.v}'Q,WAMVۉ(3mn!(vC$oI.C$aqQߜfr'A4svg͙R&ڲJ|h;(%DH G$wJ:8;1$SRV**v ̥vgj o7~xHL+q%.Μr$[aZ'X&tTHwί#ITL)̺u KK.[U[5CjUH3g2stT3xחHof~:gu/+Ӥ.ol "-RLs w[gF3YjlrTmT6Hۊ򤸫#INX^iDL>`GH)Z|rݶR;T#1Q,%ktI9IJaZZiwcY.K9D7:0&F}lNW=i,EЎ 0@I)6ǏN}sLwX Km08IpybZm#OTRLwhDťS4"㕠+}mr5N-P:b,D-*&*B&dW(6KX(X,6U+6)_jw\R{;ϥ,b)DBMB{  SU#ixR"+JQ,z4R&\Pü1NXp9 njrLj`"1f׼Xp^\NM'צk뽵hz>,^Y/׬kkkku&ca2pE&c2F.cz 1v2Q(0%r \$Kee1ɲdYLr&f\I$lk65f,ce a12Yƈ1"d#Bƈ1"d#$AQ z[N뽪ztZ/NiX:KGGp7t:+BZ5kQƖmB.oRin4t>(PFi 7Һ8hU&.l:Y:.u\0q9L\0q9L\3~7s]\fofkfkfkfw감^W/"8W^q" \.C!]£yۣ9~4o{4o{4Ǐm溏rGsh9~4Ǐ?>{c8~ Ǐ1?pc8~ Ǐ?rXc9~,Ǐ|c9~,Ǐ?q88~Ǐq?y%q q\8.K`X.K`X8K`p| Ƿp| Ƿp| Ƿr|+Ƿr|+Ƿr|+Ƿr|+Ƿr|+Ƿr|+Ƿr|+Ƿr|oJ8RA+A+A+oJoJor|q|׉:$P&jUy).D3ӻ獱,I<Ǔ<x@ Tl/PQ@ Tl/P@,%K<Ǘ<x/y<_x9Y$%K<Ǘ<x/y<_x9s|,(Ǘ<x/y<??qK%_wEw%K<Ǘx/;/;,Vrd D"YpKYp{Q=z(6qEsE\`UwmB{J ٰa!XJ.QFNϗQ]#()I noEŰVlH#78OS{bR/QkN~Al^R+YbTb+i0wD'8K b@8hׄ=wIsRFqEΡ,-I~'[=U&Lb ofHg.lݱR^(rY ܎|G wKԯS[!}6|͏MMZV%[qZ̝,ޣC7P4Ql{G>)Ē:ewE$Vx[^( *]Ϸw&duAڌGSc`|ΒB*R -"W[`zc>.&28b\+[]Λ,{Vhrzj~7oUH}.`i)5N9"= A::"K^'p$90`$rHYZ~ q.Q (Qj8*p®pI"Yr,@Z "vg)pߎP{7ìPKۺXm62PKy.F_angular-1.3.9/docs/components/open-sans-fontface-1.0.4/fonts/BoldItalic/OpenSans-BoldItalic.svgi#WzNdQ$VZHxX 3dDW@e"Y[UV3,@YyϿ\}Ï~/\qW/.//~w~_8ꫯ~^ÿUeW?}b|/||?ŷ/ B~7/_^}ޚ|/O^^ūXݏaonwx{jV_ao嗿~s[V|'ᆲ՚_7W~MY__w^p% Kb%zo~_ПzG |_o_//|7߾but۳fj7/^^ow?g/u;~Cw\7|z1\o95;nW/{<瞌6}kW?WzX]߭f}0W8c ߶e56-?f[e#oU-˳qsYYY4nϺ65Wwg7}}l|6dګO<]}" tɀ\Sgk߲8TCu[/mPڕUm6ҭ[tîW]o:s=׷_[.fƫYW܅OgxΫuh}\on!gcW5-[ۇ9k]3 [7\=:ןUnnڳyO=k6]ח=k f#<˽k"NmHϛyu^ 1ў7ߝHy}?V\L|z`Z}`m9̼3#oqd vc_]Wu2lNj]խy׵~T뭙b3s=4h=V(= EGY41b-֫vĊ EӪ;ZTL=njMeX<զi/1źzdtVm{W/iK0K6/j<9Qs^y}[3.\n~X0?Uo4qo#۞kM΁O+Eݍ|yVoriFޞQ9[Ʈ%]݌?w]꫖q >wN*xʳU?~[ms-5PtA(VOT@K_v \xQxԶi] @6kY+L7P&XM3M,f>S1:Hi5Td QAu.XF+0Nu{p)OXvMyiNᇌ[rج6#jvgXOwj&zQ68ضmgjpY7ݰگlwχɈئE A;h QI֕cdlwy'xYGqSO^J|fΛ7*߲ 5*CA笺Of^tq0!`ֽ,B7:,.t;2E|R@npsǭj4au6Ǧ(u+ULzx:Kr֍rY쁟v!i2cG?HsS şѯz\b3fo*gvq4EI:-eFn2ZFc[G2Ra*2p \"?FO#arbDxOTM P*wH^8xY^G??]=A G7mQ cȴW}QIu%~g$?:+ % 2Qф`") s/\Xv`}e\s(ٕDa-aUdPF0hr:.WG#b'[,&o5e#΀k̛Uo.c0u   ^QOB^lIE24NvC!<8`QLKĩ~zl{@2B[? oμkzw/O?9zXo AIIn!gܨN/Vw"O'un;hF dqv}Wh[_t==tflOˣuź>ɛ_ i0 5bVꏢ7 +pAxXhaW^h Jim/U1/ʰ^~6h!QHr!U p>U " X׽"}ww QZFE8pUP6cϯa>OyFQ)5yYYZ.S7^-T5b]vY7VxXo11l3VO MG&I{agQ>BEClLJK5c0$_QEOԊXqI>TA[!\ni肯XXf 8:xYlE#۴,a66VAm>qИwųs!IRX }5`ՂC]uuGt+z5%?bW+;E'Y d?%shc"y6r7q9( [@u!ޞ'1XHX;nF 1y\*ea;+F[*[W ̅QI5Z\N{ ʀeMA&[wYVEHu8I5cXu 84}?`x>,)=S2KI˞$^t0j܅V/ &KÒw滍bq| <{ud]&&w0Hz͊8 Ff!5*+bA,^4=[^(TOM襱ě{q{[ē۝ tSLhK=ؕXR|^<.b6'GqsԦ(F> X2yaef@,OeE-p9-jl蝼ʧ6ILgޢ.7ȩvQ )ٍ>7G7}\`@ %(#K'a$_/i_l/|*~=A 5 A0| Hs +Z /Xl C':~6l!-|\0YȽB*.}Do]V}]&)U7[U*,uz"wu 16?f}&Vo jLj0B) b[&O:21er 0 a,WUA1EvZ`<ٍFߪP䁙N_$u>8ViAGtsZ/V!Bf$b'E!-b+I_ j( _ҽ$誊6 `塿[k AxcTAhB:%ōE&Rg V !vF{PQd/6L?F_Ec0m+6Fh> *ӂ3,~v湾i$ R]&kd57xE߀>zat>.n *@"HϳĤ7LUк +M&KOhuʣRCxDadpC,c{vܡL  `ꊥǽ2㧠30#ЍQ]G>i]GByG:~Kdx63hMʝanwd떭jqD.Ƕ6ڂRʓ_?"wCm7}.T>@Hqѐj{0AGH\J'DIQ Kha@yQg= v(9OL*NTA;!('PbSY/X; Ώ`bU')n34FsXb=k/L@F9{{qaR({OAM١`@߳/ )P=c1@N^M%43yP2 C1ֹ?~ -Rj柈8{<[ǿ>^RI k?ġugX{EQhD\̈́XMd(d󉟳# QUH#hb"vp3;ĐoLY^K#իLJo[ ȄM' <5͒(788@'g(ʖ}Y!٣ȀyG 榉K8$am[\pryN0<@:W#Mede5h R5p?3AlY0\Devq IK=QRBF$OZW#ɘ#rDiW^'Hg!v PCoskW+ 0YPHmKzB@btHVl'oZ㮠 &LCu(Y_b Ho;U(D([25cu$%`K԰Ef(e Zhc~E=$L0 IȅBR%5h~$z_x-$ 7%ø/W,nH$qgj _}Жf}Eh|o~Ԋ )Ϲ[ȋ&R3ߏwH *;N4#8ӻs ǡ@3Ό{"rz( ѳPiZvcnp~W$m 񎿷 `Mtw8JͰ]Z;=N/ً2pأ R8/.ΘsgU _3(W@vQfDr8 抿f:y.Bv V84'?CBCIXR&jb :jB.~&K#OXD[(48 aނɓuz>5e9#ISŰ8F Wj *' +QXS)Y~rL}5vLc~ЃeE*3LZu &Q'% %ŢQÒ4l6h->+Ƨ>!Dۅ p#JQ]ᬧ`fa"Ԡv j=>9 Wf/4jO\ Ħ#r V'&特m:Zs?, KNlF1؅C8 ;-[[˚EbʓO0x4ot:#9pxdE@te!ځ Vj@(ȃ0a,Ca<D)h"^H;+H93?)fʇҨ)cLĂSŠ+@1`vJ+MkҘ4AA EpXXmϰTRi&;)#w2S=+s$ӯ;EF< U\%Rx[8 jqpdGNV`]|7mr7ʟJp_<Pkl%&s*’Za@^*k.,ZI@ ($ cx.zVX-Mj\-x@IT=$2 u_֚q<ɉM#b$B!c7j"J {,L /2Aˀ6BJ}?9'*K*䷳zf./U@za`(,5qY}CHn vbY@4dcO,KCEb hsbߨӝ!Ӄ"9BLEq$UȯjI\?@he=aA=gDpN6ZV<*O̮`@I!% K'G](c2֌4x[f-HfIw(U{Y0FtBLB;*"K.~ŎɸtL*~ ޵)Cc ,X61,=Gi!ְҹD)"1邧p[3VwW @#F6CedX)Sn(&qp10'gcu/5AWlJe])B%h!Aq= ydQ!8܊kDWGYbc샩~q\e$Yq#rL0!)BIeLBCŶ "HTGz[ȢD+\t1[WH6v ktLd cM3)#7HBr وh#[Yw3+xD׈B`UX )1DL>hmB#uϿ7I ( ck[b?Ƴ4MѮX_jlHG"y!ԞWl~+)P1YWxpbq[ߑ3YX a N^˶&Z8LTG'tx!Sr@ҫ,Ul أQ?m;@t%H>zPO% 2<ರU MM…@fT/w"Si}-#Q(jhMIO[1:b {LqʸQ-SN,\U!,-aSov7,"zOZ]ݯ@#v *` q.jIմQz"D5K4qܞp$R6&O׬&B2 HjUJ<ʄZ'/ Z%j bLQ7-/}MLF +j$.fp$T#;@ڔ0p ]YG43s[n:qcO=nV-uad!`kE@(94R +6nPr"oMV B'Ʌ?dEg>[/NDXǚ8'^ĂPߓоLHIވ#=U+ޱY >D<&)b_s#pE o6 d4knQz9.W+g{c+Ҿg3?["Q DܧR*AOnVc ;@#@W~X$OaS\V$x#|Ki3nF:% Sϲഏ%nHj q9H -㇑wU^}u҄墦)l=bf k'Ѣֈ%7fqsoLVhy'W'0~)EUʚ7f` `xbf~zyk$4rՀ0BDRjY&)9CZEVV9/Ơ7C7ˎf0 ]"Nz ې+MuB9kW1"nH~kQ!Q#_)!H%(:m9FB, TcO*e%65x 7$KA*CYrńz?Z0sIfDUX𗜖Rgď76t"kWؒOruYEМԖe:;yʢþfɳ 3H_]%Tyam X8LʒltM0@IW_q =D5FPQ,﮺?}H5k̎rœ(*kpP8dpv P,7wD u8ҚsHC쏼 X` Yg]qB{W/jaFhB)I]0 ,Rse3;z-.pOY Ŏ-o0S5HmG dN˩Xr؈;iqWiA=|Wi M F'cp fV@X)D!!T%RTEn1 䗛~sAJ0@8-{B QBu|-P5 rBRK;-Y8B)*r?w"+Uפd 2K]9)3ux]40nX"ld l ÆX_&tdG\d֩JܴTf[y1Y0u>yg1Ud=TUv#PIO:&f.ړ*FWN&&8|j(p)W*x |KA.@5 0tXY$iOJ{=Ǧq>cE`XޏRiu[odHHFhwbe xC(7z)'z4ʽb\- (u0܁ b ID )tcf|K$.in?M ѵ)\{RXBp ,ʡ黲v:l Sl#%]9#O}%0ا@h޲KP.sJ~ u&1Q,T)⵶e<*ţ8ِT,E%'XP~U 9ő;Mo+ *,`&3Fb]ly3QSOO% f3ljXjаWr"27.+sB i]B$1fFik ,F|R80{8bǨezdGR.3JXޗ0~ 1T/2W} 7TsIɆt50xQhxaLLV`eqqz )2ƸzMxSNQŽIbKB^b牑O^3Ta_,h!C ۪"'c"Qb6w,qtEnCx?"}99=Jkr:N &Xu>bw.a&ASlE2!zE]@ Pk]>)8qQ@ .YWy zB u RñȜf+?"#wuKqb0O)v#w elC y >1<шr1WL{3g8Dc2KCTkVSo}qd'E ڃW_+oSW?"o?3Q uYWhzl`%0• \4|"?f O`}'gw?Es*bQZ ^0sG^ΰ'=c/X)A0MY?0N# &TALRlwit1% %1f5qj,Ij^`Ǭm,nЀ?A tIHT_:L^-g7:T\>~,5\j_!"MwVWY}yy b ʧ2ZC#@|8 L2Ihx}c ҠM$*< yyPՆfy_N$MɁ%(o`oUޙ@d>}fTgfxUP)٧Z"c$@w%qfo!sP0LotMƅW% ™&iM(##0r{C Eb3őZNJ|'>  Mi_&Wp.YH%RDWsuj~mf}夞_SJ&g$+[1l{AS5AWꪍ!Ӛ1"ބIniҠMlDߕ|2L1E]0֥@I5BdrƢy RNk2k=C p;\/'޺] 9>~gx{ÝR \BaDpŦM)Ưhڳ$偢f"y5Z2_]OH@{ER7E%Q 2,uK9UEp|fyO(!jb-MEmRl"v`uDC ko8NXN33H;Iaр'>4򔎖vC]n<x|\ ᇄg|Ʃa&`s`t0ђ^< 05H!W"-M}{$ ZZ M jP{lROgx٘6vFRzaƒ6y gX$Lp< %lm9{va=@ ow,Ԍdž3l%#7> _ iyO-ZArv}5iLβ KDkky:CZ_KXCFYĊ%D?Pa}M ;0 E`4dCp[f|d#k[/юg_ ?oFtۍw:S)UF|F4CL>mkaMMS >EB磠Cr?=zkO99q078ĵhZo3:(=q9T =ђ7n%>O}Ix-M ;2429ӠgSCSZov.wcwX\]<5^偊b nU 1͙)[c9D*ZFH&.9c_8,ar0)h5fPI2؏ꊘHIOvf;$[A7۫ꢷ_=1Z:B4'Ҟ.i2u œuEOll5w9RF^% Bo-gchAj؞8V{کAGS8d31~ 1jJuٺ9Hq9}+F́%ϕWΆz8,׃fcbA$u'W94͋Rx8q8>>^ {o-_+WSdTb@լگNgrYlHap-nqڊ,=pK~XnhRG'\r4COƀȱtd#<RЗЋ'dC[E\G%W h[vcH$g;@ {_zg~Z)FCKfcYC͓MŖ@3z` m&&l>Cm 4, rbS\I/'(V}?~:0/l n+%v[v. VWj&7U",:؋mzc}n5韅=JUO)?KgtDʳx:)5)XFϢYGpޙfZ; 9rCs4#վ͛I<Qb`yφB7,x6UnC tCy= rf# lvN%,0s+8.X"ZG8IUk36*Wm=uoGN\9':D j;̠БO53x?ş~s^~ݷ/_N`|Z4z6[[Xo3މ,X fc{Vo 5a`~2|fߗ#IWgWÄG |P՞5XSlO[cj2L,o?Y9\3ka"w?k?﷙y6feT@% 0d((c)R5P:T):QL 5dP4lAJ֬ǫp{ŒjFOC!!fiGj]EA.=x>$-/(DE*J/0yL}bm7T#w\Xqn^֞W4Idʕ@,58eO[<)u]?2GTﷄJUF;p5jҮUs3OkrujnŮ3"'cx 9i)')8$f!@3bâ|?IJ3_"h5Kڃ֪;kELf `l L -P`n%'r%1E'эbYBʦ$CA;C7wRvC;`Y>\ކȓf@3-2Ʉ(g1&w6v@)ܠkJuxXV7ǟ7uE#qϼE[OEv4u֨`Ÿ&V%,*XY`bz/ dq3j1l)ɛGP!C$3N^uWz˦Αq=kfVkJ,ǓtEqݬ5/pr?롕+#4ɜ):1\~5̛O8OIyљD774SThqV3r=L@ly HI!kQ$2kZLlK3g0<GǀK'TǪ6?$1SL@b:RY4$_GyyL)TDtTmp {Ly'ϖV [{qᭁn\?%n~F+N ՟-5 f S0[2aZ|FY^,&FaQ^ZfKp=ѻø@oJA`+ʠߑX#"%@1}Jg'Y[M,3PvDUXɅ:F;.^1JW@SĕK!0H(9O"MdC* CeL$OCc 6\1z wY̰M? [a-L, *1;=]7 Su3TǷږ\423YiL(afNYIϗ5k57>c Υ`<3+Vآv⦓(f`2d'fg+C80'yyyUPUf5hm@HTrc?2Ry(8yq܇fbBx*ef^8Ȅ>8 yK x,wAO|y{@YK,wZQ~EY\\GP`d0x@ v!., d6-&xVX\xp5`nͬ[q??s ;$sp ` 9*3bH^g0K̆ІZ[tOS@{ wʙf\%7(<ٓrHn\9RSrJ&}iΚiTX34f ə]{Pl6/? RDߏNNМm$ fv;RnԵZ4̯osGg*l1mcuf1 Ji~(gNG4rIJV&Ҥv$M^#.oܽmH|<ߊ!( }l 2Fp! f>&b=[@QIcLh*`B( "]cD+ "trY:,T}8ُt0zTA؃ 8tZQˀ4jҎ6 U(lQį+G(ع#Զ h۪!ZjMH<9R"ђX磻-. LO^ D `v esb?(%!,{Z֝k)ة 3''ƈhv"S%~;i7a$;S<P[vˋ6>T]ڲ/66 ڛxЫ0`T\'cg IQh&\X}R6G2 ~^O)&gWBu2<+9-K\:q8$λ"pJͺhgviK>Z>{$4 KZԄ"Ī&;e&zn:a{3[Oqv:BKOD^(RZ^` KCoet)T*J x շÙv6t sy>6 uv&İ(piG2yOrg}Aﭥ 댠MP Y"vݥO4)$P)[\AפWcv }qr, ϦcN JsDPչ\⋍߸{&MʽR&!2GT3Og($^0k?\"s :E+Sxe5.p[o3AA="Zf{QizNK i )8p l(0VD XlpĈ8hBvy$T~#;=bmlP;72'^ۣ R9~A>| BH}[!X:cǺkq7 |V)'<~KnVys'J-^5Џ:+g nc5?D_ܲv_A_ȷi|ZT'Ε_sei( &اEWi ָ}QjnFݻkHW5808A{^͕M!9*Q؛"Ԡ~5Smφ1}}LDR04ߣuJ1ȄYԿCXCnh:p$@o%JCWHclK|x7 X=,gկa5$wcuD~@%w[d7~ύxP#v ڗ>8zZ:tx-lk6.MAB$ai2Bnƌ#"/&K! .m6^jg! /ICN%#U%$h*`= ~NC L-P* CffԞf6A łme²?XR9qt!i]!ߙE"$ȧX}-5 ^+S0O$k㗽l6aVz,ˑǤNu&ɓދD4EQEF,CY$7ib=brd0 ٕ((=?vXzv/tAy:iߌjWos*@.jh$$J<Yhv4>A-c0 85VH, 5-?p9Yc|Q..'ax4;Ò1+| Uu@M3Ⱥq_!È8bBLZ3a؁)V:f2syņX34? 4!^iKgR>mV\Қ=bO#yfp>Kt*`zC4\S1NT&yG4[; iOv'h$ 6x&fDCP TQo63yST2`0)aCڜ)\%I4eqѻf=QpCHLDց8+Rbn$AGȺV4]VVZHv?C7xю̜Sذ.~|;jy U#r3>_dsV|?\94d<))v*䄐W mY-~O bW3ܭrI4ī!<#8J@戊ql.*AUB$!g_o5+7s/NX2ДL wۺ;V e{K\k D03j u)!PA):;e %CY ll,-IbU:y&xt)!`HF ;7 eqԖ鿋^a a54@v?֐ϟ\wMˋ 2Q2hp)XcWZmzYTד%f1W ̄CMJv V}S C#TR/Sl3+z,GJK,]-Bؽ hXĩT${>|Kk"l\`nfYf3n(/_y.9 '݄R޽GY^7ݛ`5(å+2w!;^wA+C0W-YBf} E!ҭC< zr0e5"[p*9~?Km|ܕa (M3^V*tU|ƥO~r7͵ߖcm4o j.o2Z ,R9DgϾ귥(QPr7嵬Ll-, 7Juf j˛&'B& Xz>TK}b&-Nx1wݤdS0=oqDhL+|.8sY.`XCl;I׎_o/R+&)3B4$<2ŕ>)(/)$Tf慸&rG M2#i.ER9CC,u+] T84`uu@3)RGݢ} ƃO>a :(rk*Ȱ¹eH5HXX;AΗzK&qV%,uYAMH.WnxK=śIژP3kyB# :)d UkcSd~ֵQ_d{<.IC""W`S pƭ $W܃&3 ‰"~`t,b"nR$Q➋'{Y,?Aݾ7YvFA{t8ob|M4l*DN$2)WVXd!JPq3OFsf7)]&Ժ7T$ 1MqDBmrol؁X{QZZ23[`b>nk-~VR˼qU:8F^/ c؋ (ݺGrd(&v9HA:H%o5O0ѵef}ށ.}C *,Ev/KmYk HƗ)oA?xJ>s'Sl Z/ @YZstb"C)(qPL`#:rxɯ<-YֈZoTMq=c \&?x>_[t$vS?.T# E\ Ntb8yn}\`;]؁aepi ܩkݰWsDو #~Afp0N g[|R{)Pt LJΐEʳyrg(RB6G\`܋A;O K$=Ac0Fd840$D?v0Hzh?\4c)N8ȴN !}%W89.ZbvMVϑd-KJƱ^8˪ħ!𕷾b˞Xq>́\mD! sJo\l \Z3Sh0UvV2 ;`gdv IbVXf9r4XTU 0z) ,zJsњ\xJF# DHM$7E3=f 9ڪ[ee 6S+D1T5gv22es5#P! \GJf&] «ZVo*kEyK k r PtU rξ." +Gl ϒ@17c2z;$m AµȓTY%wʝ- JpJM,PHxB}͐E,+_6Z3T' Gv!7M/ȏdb ϲ-r=_CQG:P3K[RZ$&pk/w#uxJ)#q`l>lwD#6-Q!( 0_!g>+C0/(%#DЧZbVtЭA{ F 6"oo 9@E&;%! 3]1]4hp$m +fsARI=J.9@űD+ 9 êTp1F{V@˹5wA78a"[E@*TiJuQ!WȤHsfZ_ -/*ri.4G^p73kY eD*5OnMB{,}e=pl^ ɦʸ&@>&]W gJi0cD})07U?;voY+.#J蹰K\$w&B@dW4 :8ыk=3|>2~G:#WKRB,HƅyE?3sHd"4d[IpN? h!$k%'#5Z{D#mv͜51FM\i_no34ԩZi}r' 07]oiG2dQ^z Q PE8k7!:wgquLK|m|\TȄy1F)xd@|7 LA)$Z/ﲺI+cJH:Sϳ$DpŖofHEx0XպӔ랙SE\m3@Te~+Mg-$8 T]hrmىh?DPV)m2~6vTe7~DÐF7,$֬DOŽ72I UzqywCDB>::"bO僕p|u^x(:,GPWUf`۳@Xgv}2Pjlz"ٰ[K)ẍ́c̙myi5,cSwg٧;a"#s*^ gIfLGmڙng`,@y6Nwn +KOMq(2nshd`v A7 2ka# @2yaHsi<<¼f=[!8?牛 8`4]P"Uvj±Љ!I Ҫ9wΟjlv7ؿyߍw+06% |y&Q^\DzMyAtjEd¶ i}9g<$(ʡ"(\Ja.Gݔꂊg4͞~Uo{=F5pbft.v:< ,O FN\5݀!O'~uL|*n0z[L7z|@D msHJWеPy< ! 'Ksṟȁ"rdd>ēq6Z@'a-lG-VTZ#curMHm .Hu2 %ٚp55Al7_k9,:`$Eјw6.z_}Ya)aRKv)p +e)yRƣp).@.\0+.$U(?%9D!H*=UQX]B曬̲HCNAѾ,$¡'D]aҝ\N%-rgf#TF!z3 H=XZ-HFW<.N N10!AXƂu"=^[|4Sq׌uzDT-'N$¡_pB8! [AG{C"ՙi|@ǽLjAp!,^v 1D> /Kv.~fB+D҈Vbs(t%Bؖ nhFfi<%G ]"؀ T\hi/Wa[ o%Ԗ39W{ Lޗ[r' ?zh~+\C Ĕ4ھT&r|2|}šNy)w*ElOkrx N?6kdMTc~_[ Y6?\ 9{ͮۧq~C]y~3:hsG YӸF>wa۳ֱ5֫@+S1H:3+1 @؈>kUwx3gæNbsJ)SoA)atd*uؐu4<&^y734hjMS(ӷ7laϻy0sX,)+t&ίmXAl4 Uòp?I?-0w刡\1 1,4 Y`EW'r=O~ĸ Nll)6̻T0C+G{K6/". |eNb5:aN)(=f\߾ mߋcI/Zplds@s һ4"q,az,v!4_4%)GL" ƱA?kqCyן> sNqJA^8)q uTLzƜbl;C6RHf*OS3{?xn^ B$ǧַ^d*o>~⾹@R%l'K Cā!⎾d"YNƕp/tyOٌ#l}bHȈYqdfgޑ\0ȵݻE1OHֆ^ېf&ˤ`vO#hȫIaUQV6*jN y"\ϲBE Zߖ>雾7E(rK^N==<]28I:2ɹ|7#a%G^s?!pR"0r}&5xđRGtj_t3E̒\@"PGr%}B> EX;JA0lPD4?-u#~>90?n *|bOl!_ +HZ0")CeԤ&LxwP TEdfL !Hzu,U?ͅ}l~s<$/$d6d&-S2/ס֎ynX1,󮉝/L'ч (ygt X/(!Srh)fe䑔 ܙH_{*E sx`#|d6 "A|R 6U,jqJcp1F=b2z"6:l!/.uqEGGmT2^g V -s8-p$^f6d dCJ  E~"'઀/xeRZ0ALLigm`K;U-~2\)ʿ28P>WQk4ܤǰ -K/]|2xsޒQ Gvg2J+ݞZ$ЮJ?q ʍe[ɭ#O萕VulĶTCcAaR,4T6ZȾpeH([m R\=>m=g yW;(-1򒧰xw1k䣁㑚Rc=OSt3NnKp1&>gNcE8,) l#( `b׼5pqSTUEmsAػ ojgUt^'@v%|~,ͮ,oQ򁹓MM0S@8|ųR<ǒ99YD E $rp:˘Es|&fT +l!d|͍6'11\FҔ5~/r+%3\feS5,Yy7P3 fqsE`CRőG̋HG8J͇ n:|Te")zS l=p ]8)18k{Kl  GBwXV2:SMW*~k7ND0M!-*(2 sիCxb2qd3tƽ2!Q6{TSύlm@ћ-Ƽy 7aֲ68ɣ@,1`\2)籌S[S|H\*B×5Gg$-5qi67/;C9vj<ޭm^" uNoIbMpQ! !a.QA(tM:igri%j[o5mt,ϕau&Y,j*{J&0n# x3G'{mse%wv"&'eAͱAxV#tVaJpWɉVțj'֨GctU %&s37T.71r'?zݵCaڜuX53U~쉉@J;i!IMH; $eCzIZ񬬗rL}].J5Q8'0HלFzh,,2D9'YWKƯPDD"sX"̀0tA,̡OL.[ke>S)H?@n=za1 :dF`lqRYD?~ 4L|\i+{ FH ́\|7 a8A&a.Q%ˤNa͖-nύIF9 fW)|(G8 P:pX vceNN6/|7XA*^8 "R'` vJn qOGp ϐ/]S&VRG]i6e!)r&,%)-I<ޚmttgzem^"vsN~( v!x$jmSy4U_dC8#'cz(_bm+cmaFL6 H35'b v| P*>m:wk.^9!gmusp_LL"∥c בM4"j[jl[*K8QK`?R#a][)m0M1NJ'=o_eSseOb~B_a"fad(XqxΔO8"xTRzs1,)KTtjRʒoE#G ҦN (1X}b@* D}bF0PCɦBHED+k52 &z(kFH;q&]C(-CCa)6ULc +XʥjKDL\_X@*ymaޯXV{0+oاO#OT;%b !gК ekC$yo1);.KhdkY*b1Aovxa^LX#XLXtŠN1BX6/u#dC9^1H{Q3f4_Xoއ9PRv' S#&'-}B%+STrB(g 8Q4]Lb!"H5eG:PDn V%iq !n6 1uN9vu'3`ʇW~>ԕ0YT8:n ?Sda0a`&:sԧ07n++(e[`4N⩁5twbH'2&2UQ:7V=ySXa>r/e0y fp׭2M0F+@'q@XXTPe,Q[Gf@ Sg)!sb[>`hI*6ޖr D 9)D첷b x,HZ"S~{HmHJ%u6"\ld.z(y"YSA5`{j:`ݪDaQбϤ<ví PoR|j Jدʈ>#w])%gf0V,ޘ*qyv//(nȠ P?)NFxbIACtSSde" 8RP[#\iCbihI\٭_m~L)*l'a(o`4 F97,Lhkrb 9Sw:Gˁ(4e0fw0"Xm5tOS" 1 z<%͇Ϯ 4E;yK¸I b?_eL*C|kr`ւ;ke}1Y(x,JE& zq'D^!!ކ;`_i"] #a($jra\(Fhf3Wֿі1W )7ܓ>1N۰O'ld: K(Lb)ഖ#A vsF;"V#)<4Psc8e|/b$;b\~)Э:.C0UFŲ72|3"No Xo<Ѣo&Ô"#,V8ķUd!3Rc.5|(?P rz `1çľp-eh;5,AwUVC0 4 MD  `;MxˉI 0"^4gindI\h5\U]8u*]kݠs-MΦ J8GIܓ0h}| Ur5G" OBUEZV0J5×/FL*.^M`*6$^.HbdQv*« Zw-L6pAkͳ8v&1D`X*mE\$ LSr!ck(~Y{U\rtp'ݦFIM̕*— I"ރܳs&?RRf@#*sh`E୷ld+w4HkWH,Hpf7愵ø J2p*pyPn"\lm/F[f%H(que*e@'=("dXUXX9b":gԄyVI5`8 q:~PmL`W 7KY]~"r9+t ޵&kۚc "V8|gNPwU͔Df`]xӣ m" 6laE¼q77NUTund0!_H|hB󎊬 QZU7/8*{ʘ9/6r+lЁ<D CG!:EXs|3kB !&O@EÁw7r ˎD] TlO )_>φ~wEv!ىM16'ˎ0K@bmoRf", A%XX¿@A7bAJZP]|qD -!]g&W fD?5VzܮÉ3«!v3g4Ԏ !EG(7GRq{|D9Vm\hG\C#qb F_2e[ H+^I0б<[b QZ; `_s)UĀ#@s_XFFa5SM͗o(9.9?,AJw)=-G "ѤLˀVL.?诺OۛI,DI/P `~")9OrxR<*jW DXw8D-cr@j\Y3Ln<^$Nj3B1f ބ˔#" )[W̛̫'veL~K9Vh_`X}t<#M*BqKs ֔Yl r '.CU`sYʠ>3 >.Ad+F_bb8PsѕUԐe@fBzF*[n&;K g>W'ȚX۰$:s\-eqj.܀)Dp$ғ<Շ/bU%Gɍ$n%62c'L# 4[Tp]Jt6Yׅd/3 /["&iD~@sH5i|A?5.ף = E&_GlAl"' H3Z^ Y`dw[O޺B],rk,' r+^K@/!Q^ʄA}Dsr/ɜqfZ52 iNbB\sU|e=꼊J "P'VOq JDbAͬ<0lHK`'eO- CB:lCч `qJk<2@,N`5v pL\ͣ"!"࿷hgtrs*JfS=JKG\jh 7o(_E$H] &ƍy M!,JGu@LLi@}Q(ADգGONJdUHamB]+~A>k_h(݁Rty^P}Hk @S }^!Ψ#0gM*$^ | :rj!j6 AA*]љCoۗ1Fݜ{sk^J?і Ђ_NBDhnMt_P=oƼ7usjF՛Vk6'f3 &v/DT_ܹM$&pFI}os P"ϋbd|NЇc WE7R+30wTxA4Fr mL<@_!-"-NZP+fvnS5"3gwJO`Nr]ޚkT,+7>HX+ըjEhDaЅaa ='teFٝܩjc Zb^ymR$L4oTR&:]Er&Ѵ͈ {r{*'f(<;8`dt ~wхx-D $^OrGT#F`5{G9~>J4, AEF4L|O:c$*eYh _BPQqV*;yؙ%;}Hj7JE|1<ʾIsOk~*+ܮ2kL.w’ #`|\/i$0_O?x|e߆m°Æщ 呓 u":Q BmeJ2/}9I[ΎvRRtL̹)8V&GW/6ZI9=?% ܈ bxBpVGzCx̙&9ۏ|pӢ G'LJgc Zl 5n8!Ί6ƽ~zv!4yIB3ljBLh OJf>tMA(.~1Hz êc}XK. a8md>+k V 0#i gxQqi_b'|_<"pUhr_Y'yZkhfgRߌho2[MG }G!"~?ZIsV<%7cύ!cQS}!x_K-z@X[qdIXN,[4BQp0FZJ/+>9L@d y=(6G""/^KAjpO QDZmU-=4g\ ji7m /Mr֒)U+6`~ g\BPlk90ȶFw,$)KQJ&Y'M5n*=h.N4M&cs&gڢ+2 w> 0kip8c48&,Bc^D3MNߝ@ZEg銹ݭ"`NU#x\8`@qsBeƊ9ޓ$O# u9S: U5f@NLk=R~K:L:Sإφ*sֺ$TzlyK5;>` G, ;$*cxLn>¨!ɂwn6RB3eterKz.Q p2<̎I#T[pRn3py[I-mH0o}ڱs@,VxQ0oG1J#DccQ:7n^55wJ2-n@.r^1>%\4dOK~g'Cd&U\8XwB[n OXH3En>WVY` lw0fyC&sk&;MYuo] qg}8ejjG? ؑBӍo~Qa/K w4wi?Jdž2`A^ń4vۮAnɡg@%zN$(VC^tfc̈́?VzN/:0^IY,Œ{R]IЄ4#$Y{ fK x ~qv@L Ws[&|?$1 99$e@s6 ZBMaQe ;}ڠ2Z`}0JOm..Q FN2_A>ԈhENp̤gd;*v’@ ѓL2k p)sG(2;j/(%ߵbLf$lP*oֽ༦ivU[M/#1 9`)lj5 ~ Y*j *P"jB}[t/Od[K()D1=TbM2\% 4XKnh";p8aH Uy!0EiSDΪr(}r'lkvud_$Ta}a$Ds=ğYkdv jmT 9Hw(`PuJȣ,c+eY=/͈۹iW1o"ײ更?9  b9>.x)7wZ|J`˧v R>Nnʾmguwfa9#\1ќ.4Rhk=@%Ep}Ƚr}QC(Tn@qWPP2uR&V<"޺,⪖̮yRPh`^O*[mT*}rv>e|s5b9'rZ⎒[}Hp.k`rqpzke +mGveӳKPNRa?S5sA=Aw.fۑ qHdNkIݕa]v68J& ijܨQ&{YYg@ ՊVĠŇh˶bԚ}׹liB#rnUߜ $Q4x Cے,vT22.i>iW:m.wjbV`cCd&"p NU('{] -;XP74HH!`Đ9ĵA$dt[wj}[dC r1?3 6!V%NFSe$ʂ(մ[T :d2M@,BN0$ 3',T%EO/dsFm)=^b̸ʧ E^RtT}"-2/}\6Я?qS(3$m#hq<zjRS ږ^VF:Hb4rVčC:up^VDĵ!\a՛Ę2K#%pk}Ltδ2Jm]mԍ U AZHba89e,¥A g_{Ą겘2,NzCPG۪!˰Ui>lKU[G(p7JI{BH'|dE-} &= i$I mq$0uի0YGD G'Zr43yw6u=Z y+ڃ0ȕ4.0с?a@(h8\aDQE0,08c&kFyƀ 'X,+|7G\S'#$C;8j\R#ƭo-MF[ ;βmf~E|}M\cr.G;}ޫ*,ke!JgײVÝ8FZ)bQ<۟ˏT03D\PCKCJkh{9R5RÌ^<ub^hNqD3ŷXgIx GPxGLhMLc-7˘1 JrEN@ߧLKٺ*곑'&H%^[?aYx&kH{]8£9R;q9@6pŇFJ?^G sϯQ4 V)5 Rߣ.1P=&1Aje_{dl7-$ O'~@w>4܂e r"m!/Q-es5m1qEZπF|C>Aϒ\23I/ x3['5@w!Gi;C)*ٔs D1N!q$}u@#ދqȝ `~Zߗ/EXZRO EN]^rm&5:yX~EpM/$`)_celir΁# {$<ntS~赞]f?g,;)Edlcǎc@^;^ZsIӇʉrpeL*11TO0.| ʯz %)s0J-%ySâ]JCѣV/ z 0b=*MO3xF`-:@L6rE3g31`!C5к^K $P;2r+=DH s^BtD/=2o04& Q#= &l>7Γl:g&fx:GI5x J \ 0ǁĴ$|>]Yiw$܄YGLˋ0ݮZ% RI h &ڧPc4sxΑ`l=-BZÖ\e{|HIIDjKkK#ɬm1b!4 Cy$ilw (՚uO !"gF7D;_GGBF}Km3'VŰy7{0O|~Ź˄f!IY؞b}^c<|DVŠtb0cd-az>b4p\-aDM|!k!1E1(k" 0J䯾l#h*=ѝ­:=D7} Gt$z֩CLd9kZXYq{h! C:I4QVc-X!O$ ɔLcP 8"©]Huq PڥN[kHDb(go; ?asyLdbY*5YX%?\cm d\hZ sWJ(g#NtsZ3F#Bg[@j$ 9c%5IªN =j":seg;|lйPۥ86̵cRCWz)DqUn#3xʮބuvD3h7 |+'#bL{lycMzOno'Um@40̍r肘TNxɸ  y8a>A\b5G- p_NxQR('قh$J% 8VA@iElkHXʊMتH&!dXU?=*%%m4ڪۧ嚬!`9d:XaWZꕕ]@Qu1W1M*25O;Ӊӧr^R?.q.Q|7הhXHJIp[uH8$u{$1u; @ΑnB"_plX{F~XuN׉<+-2|4_X2]7j\yS!faPS?hP% dX_)41!с%GO-z݆~bPZE,mZ2B8B洬QqQgIlVg1 oDBlA~=t Qj,U OVB L 0cMg>\'xPY$/}` VZrjP9cr6)i9è&aȟSCkgйێVD2ҮKFs;H2g0fQpX" =&%$ܓ,caVpyb/G*Y [|[TPn:_gB%),^լh/_9c]ˍ]DɹgZ'i{/,SyI*Cm`tN] @ɼh\̞ l'\^9 ə>&w2?ۯ nNj xvL P ^Ļ7 SaYf9qSSV*jtǬQa9…\2G5pz0ZkH.L13ğbn;+6 3L0%x֏]J<%Sv >;peUk:Wv?ͬ.GE~bU1EOjQmIAB4 %9&%CxWlǽ=%ա&:yͺrEXb0lV\d=6ز ~Q0Kxו#,A\~.Bk˪I3Q,7(E6 i*ZXm$kS7 fn6KVj`9s CGrܘ B "26t(V1=f#.#1t(s+/ǃ e)-gx/2Mdfz28˶f#۲Z}@1BLǠl(*/&3uTg5T:jۖO\":ٚV$7BЉXiU9n3scTFmLMa A&%&β:£\}VY] uF;٨Ú*P.ѻN ՙlW_ׂ]FW{n7Ŝ3/,AYXoS'p2?YxGN:H6W#C٤^q RT2u&=-MbAX#d ^PGύv(X9e4!֌%៵,׹T{!C F!:"\Xoo4$v vĭj~EѲRf7OFT,ÝS~0]6,Y`lRg.Y`,+7a$9|z4ފvfRJw'{!~!nn/mXWCiT7R暠èqAY<66:U7PL9Ö)dxG//#K2ohX=POVWiwb`hs>#ɍZzd&'^OMwx%coTƿ9'1Ia{-y6|:KCFva#)5(A/] &hi㉹*`&֥G+v-v #||W6<7*].PDGd9)!o%36C>Nxxm k*hc}%Xb&cWxA˭&9Y9e ڱ&݀R\s4/6@ < Al:v/ļp1 u"b~B,h6&+3=ie@fvUR$IBaXb=VQkm@4uQW2F?aD`Z 4"8Dwd K$=*pBR0icH '&tYj.ot&1.klH!׌LU@g3a'#AU>_| PX銞dh ,n(%$Z&C sfDY g^4eS 묁%9U$ ր:߳4Dډ-ł;H/4mm4ANYu@,\x_5W8߉ f¹2n'W\%- QICBߺ,<W2_/vj{ǬGF龆qZUm'd/xօpy11T#mMU;0+.1p꽓_TǼèqMb!@jVR^3z چ-^ IbcI*σBbk; g{qr.@_vJrӜjЕl2TH%,#<%}Yʢج^!;NbD(AW0qӼUD'^2IW(\؛_'pyUנqgiHOt٢`bٕk ڡ5cK@ xk5n13 xjhY EՃP2,ɪ&8&A3L )AFr,ka(+D8r9 G(rz|nLgp\#ElHzr]aYÛ[o"ML`c%&z,-g`P[y q曌50'2hAq6]2 -ɉD&5I09O"'pa jM=a]⸑|ڌBn}G4ZE)@ZhX/t#*6? B7.&> y ZD:KuGp|>X 7$a~q#zRo_UwؑP F@t3Wi͞_g{GЩØTkN@r0u;.,VI72rDT=/@OV2e? ;z~QUurb;6/(Qd_7N T>)O#s \aXp`K5e5z\$bܛ^dC_ j&zO5 :CB MG2 +[} fs!e- u*)//EԙqV&JPH(' K$znֳ%I-<W-66#ųR:4^5 jZ0+{{fH/0qk!f\#TfroNk9A7g.e٬!G+ ~_o7XdU$%Bڄjz=lr@Rwi'RCzL5Z݉2pB]]#@]EwwBHUy+xaQw4@0 yKt16*cSN'j\7+{BGPϕq1?='F§cxE~E4AExWhHM:$ a)i<ҩ n)A`9Mp)~ ;1k"o3Oā⏜75|:"Ǭq;ܚ2 st9aFKG#zqZK]bބY|b90h \r?f=0gipYu29iB8M/!':Jf)P1(r2O$2i e+uNOgeɪ (K*BE{ IR1++L1!E+&nh@qS,;;1 ݄ yš,٦)J*868)S8gJtwׁ(!H$OzO ls(_f<ʅ{Vqx{LA> oEvra F}Rc j˻,,iɱv8sTc ?$ 7~B~BQ|1m&U]ɱ͢:}fyڶn,>Ox J7e.'sD(췶<gvFscs S~dgWWmE}>qOC51%-J\L)-MxMepgGjޖ$s`]E b9hNaIӍHی\Y@F#Z-?iO`[5p=/5-XYr(;\ >FPRː jq 0=#BEpjL.TjŔ#CߔO?S!+9,/xm0V;dVg" M1a9TZq9nB=1Tޓw&XDbJAՎzQK1^3%/q}Ze8*YLeJ Oy8  +d/^_{Uy70AKOdnqڕ֫6gvb%M0Q38Y?𵫡јZ%4QgP΄G"arlk_sR;̾vŠgܧ%E9BZ! (M`73H.D3cC@v8}Մ%6k2?t-t wOXff_ h5ge;KF'0T0gJGE"Mxٗ/˕ơ(ܸ~O;%RXevqT Ǡxr%N^!\r ;̻+c;hz4CSY뽇~=Q5c6@b zN|!8*pgU^ys0PxAGmV <,Ii{BX*NuMXbyKmU'aB9~]ĜG&'&@4jF#z?7]osEO)y:۷FCDSlLݟ|/zZ]ӒryܛϮꡟZzvpåFt/ }*i^{e9BO.&5}}m O>o7 E^T~ES};Q4 o!^|biS`SW\3yEeGvjN> t=9kğTo]cQ?a|Ɨƅ+|ʔl>Kt5+W|ʷTƣZ[cpQ" a?s~4n9[M(:5EQϱ.WS(,Y0k[;!{~ʅ_.S/(n >vfe_koxV#&7d91m6sqG).'\}uDCl=)xy.E/ɘ/,0>/mF:W?u \+޿9%tsX7_s淾WϏ' |O|iS ]3bM\T((lo{3Zn;\}0Efٜd zlz< ˑpvE0@CyTP;=?xB/oz]"{(TS[u5p˧~yP2eC}j3%h`ݏte%611!Q Rlnq$ߟaql i_1>?WͯMїOfe=H,b ;_a2hض`B[حnez8h/$z68੶OàPl]p:KhBb3!>ȗUZa&F&3`r'Lz.?-m/ޗ(3wOH-_?#%fc'H_~wF̏ZE|9M٥CJƦ@i(V`s Mh9auxg~A@&hfq(P!7&#p `Azq"'-`S𗝳:_e dǕ Bs&0E#qjhSn}~YE6IlȮ{ǎ:|+O>mGN֣7sPۃ`&rx8íݿW7FP̈́y_/[~7ڿNwnS~YX+wnU7x{s#rUYMmp37;monlַdi,yC[D7K4zCNlBuQZg~QCҷ[UT>kvo|&t3SI)5NI '{ާ ףZ7r߬3Uy[5{/[n2qb;y<" Q*06:I^VVWc=[=T]ivydֆpxؾD}pDl}x2_[=Cy xU:1|'P6U)Ј &z~K @-~K[XQe5@ozW,h{IyKR8jռV=l[-O)G{P ֮FZȹ0z(Ih{W:Aɯy:_'F'n4힟 35S/Ƕ1䑱_jTnoTp tCxy*E9{Kq9sutڳwP]-Ssb225DOp7J8eMƼTvER;gy}eo/SK>?.-\:i"K j ܝYՇrc?tj(Zn..l9H\xuI?j8Ndy_no߃/ )Ⳳ:t74;B#rnG/[^tݖK=qӔ6T^Gsum"cO X8g{<’S6uVwJAoNbzgJPHuV+q‹ٞfmω$3.6%sˑ~o hϞmK&Mi`^~6SQu!E,v`_ -TU.)T޾ΰ;xڣcu]}|9dN."ӷPo7%l5Qo_NKN8u![:M@yrT:7 I; :޳ٕ*R#gUnan+| OtU;J[c{?G֛y=L7ߓ|<^\ 5dG[I00v F ء ~|;{7 eV.YJt6LhTO,O )CwWuhNGا('[k9 cݻg*\?N+ t{}y_oW0;=T:` L]%naG)ntM7 ҿ-HcDž 4 [#FvHa1)X$ReD# ʆXdҭ\׼8yZ/a`toz?P$ۤ$( pM|[ Ϭ]NN؞Iv@{5fOTӖ*wʝ8/:;gsp=Y7뜠/םy;FOX,Nm|krZ IB7g(t^µ/CUHlpNB19(?n73\}s:9esfVzsч>Lff|hty1]UJn}g9 ',aqqr\ _GA@ 2,9S+|b·6w ޣuO2a4|TS0\szD-3P⍻mBxkL9>Mx@;6~8{ٍeK6+|}ᝁc6\R2ŷT Is-GѣCd9Ts2mZٌ2biof (ח{yamΣ>qnʤ\g3WϷMz`h}[6^f~ !72^Feы_~Fv0-qƑe.{`xHnpۺeĕdK-S!aq3G`a*I*?~F NvQSڼ48ƲnAti|j XvYmfR0yŒ ];P𖬬nLuf8xt錱Dm.!<[۪3cZ{rN?>zrRlzHWfJ\-vDfi#u:{<@SD,ڦW^)ebF`Fd[#)\[O ?ݠ~[`vmv]{]xD(5M!@a{:o`6 #m|c &GObyQfX.[޾fn(ǎ~Uє8@gDf 9)M@GH]gWla&'yYRMihok¹4L ]L^d_f&tQcpB>$< ˻ys6jJ.PMK?@m%v$МLy8 "կ8dq&q]n"]A@ݓ@ ܣ&n^ ID/ 12^I8yr`šQih[%}$ o+4639FnM|14ɵ#dp=0IkF ~ߓhE{`[윽8W?EGu&̈|<9o.H6?G BtSUvo*UmA4-a2fB$tڦ[ fT3h4=77}E#pz,fO]\cܚ>n'BlU] ꈟ`{(n!INlTz66yo 9r|I1TT+=Sk#6,Rot4Fa1 0㛋g% Wi7'8ALͷiw,ɢxRJWFYoFs )Pg_7Ćɣ]ڼkӝwms@ Y P[սc:>CC'DrL,\O `0V@K2gCdY\?nSܣ+p=)@IK W@8-U4 a όB z7mmj=.k".]ߝPg|ԥ/σYj3{aXeq3-2n` ̠0s%'=}DzM ? <sr}]yBJ9=lrttA|br"кXf)k=jeVc/(<\Qw4;/s2^ Ҽ1He{Iò%\esngg7˪G|:AjpA6tK_A41>DGs>fpb@ٷ{ jQ.i'ԑ-Oqo<v~lr/]EEB3Hw"C@ds1#}%v&ԏQ"#/a8k?\ ф9pfI"pCh4b-/>:h-fJ#OSkn0,tfb #py#9啳0i-5 4rF/>IF9Jރx3Eu(wV1ϭ-2x4zճčJ!nלLpKbnq%mq Gt Jf^,o?W*!YzUI1K_02QRq(/8zrnӓFlw |(@ ,qF74T E4' /߄F2_H:- ^ öI¨S*0LﰽASOP2 Bn%qeˤ\9`nȽq,m/̈D߬Xx)Uara/cDrhmA^1wv>.Koe`0eğ`l|vsItFfY?!$(/x'0HtIzS%AMro՛@/Sb SY׻9+/D9m_2xe7G`8svӧ!]ΎV:+nb[)Ov5ç<`ب]Χ Jm؏"SnۭBPXO==es03j/p{54ྫྷɯen ` Q}XC?}?l?((ʭL. Z,bfSr tG4>NO6MUbf7AcW{,GŞxtgЗGao)p.}ygn5XXu.QK/1G&/Ihg_VOϹ6 'RבhH~Hiԅ-fpsы,jef&r([ת(#}w'vvN9l5kZᵋzํE Q[l_ƴ^P|+{$:u9Ecʴ&!ff(Zrݭ"q4ͫ9*Hho yBQ㱟/nܷĉ%()l)X}$f8kw  ؽ=VmoJ5+98p 4kzr˽>+;&J1YnuJk72z&Ne3]XZc+P3maacl;>D{ƨO%ʢ*gN $YJfL\UϚP)X~E<~ t%%nPq4U]! &ə`Vc~ޡ㭃!iԗwG* 0č˸vyC孪$se4q_gd k~F{NH{RӄA7cqzUS@UnA9sd̻>uLFQE޳^͘2QM0៿G|͈gO̞0\ ZuCf+ǢAQD]J%p,N\{Lwg|}As_߸x,JoYST;)ksd6o_.(q}B0 Y4F๩j傂B+<#4?xLM;'!krtg˨(S1YXQ9e~'F? ,u%əR^7п81S7G\  ԕy{{Sso=9,4OR^d&G@' *:mbEt45j?i,ƑO[5 Ӹ('%!fY>2(,gZ(&eYRF< RгoZŬko+I sQ[Lk̢[QXrDL d1X 6S5Œ[=#A~a&k魇}oHݭr18kd 8mkodq@8O.osdC)zO2#RYI#"{_yЁp4 yڝ"U#Oɧ}d|Y/+-#Jѯ)gIgYg_Nz` Or$x܏\~ˆ)isHKZ߸?DH;Q>5%0l6h +'fZ=i])D[ g "A9݅ffyH#ʋXơqD yJG^WtUlOGC:XX,k2{8/͛U[ ;d%b&~ 'b̧Ud ֘<EHmjy\lkG K MJƽP6bAo*7?b|)惛M5b\iFy_Xz"yC"~`W@ް ož ^JO)@W>\HU N3+Baܜ9(HD R*guNnC`1q45Òg+( * \B-a%/o>Og2ٻabSOr Sl']-*"w?d 5=yXKw-#'BK Ļ3&r [ϸ~%ĮLsq3u=<}HHOqtVhܱUFo6rs+=;\%gٔixfT#wB'K(*2XY0Nw0\9P䇗062〹]"?E؀{\Bl}M-ٓ+˛D'*9 *â$rdXvH<@ jO)m]~aK}1F(-+Ƈ\©&!b@mX f9%Ovje!?4drNQt^RvLXg|ORYy]@ъZؖoGhIP|*q6H{g_2pG!(s! OO>79o)_v=e |ے| pʧ)$ -Wůtg|p j;Ev#UKʁ+<{,s}eapKTq( Է@{Ssl* ,ˊX2hS{Ų8VLGȊ8`R$&=[uWw _N0k#F?Hgc|ͬߦml۱gq,~dZ{fw##mjD,w) K LLE6\q!L2ʏž_ 6;fy!263ZH# woz{)ޜ)yY˯"MyުYeiZ`™q;fM@k00)~߯е+RD^ܰw*/( lI50hQWK3#xadSBg*֊C_F6ģ߆ce[#St)H$*U+$:zcҫ ȳ>\eJ,%ibL5!#OF$P!X7L'OȯX)Aۈ5i%%yguJRq{~ׁ+;޳xJk+zDkY5D51Yw.x֊h#Y$kXS-ew\g9'~cj~[U$ڜȒP&-*gpF׶Lӕ)Mll]+?#*Npqs95cKj~]ί':ԢGpM:8|&wd_RXX#H5M>nr,$)]/M@|;/!ZsITVmڿh,*{L K!aq@>Vp ]- UNgqlɝ`4?P[v v7I^^SusC})*4JQҫ2r3}#λ55c+dftWRj!E9B4;æ;긌Wڔ, U;5 E,UY%&74X1W]2|!խX*ɥŻ[^8kc2h=V9ɺf$S2$.[i,S (C/VY`g` ,R"yсK47S禬/37)<+wMYdaȸrp Soԫ5 ƯYzb)^<503@m2wڡ_)'mV w{?ІUn(7>D^h/S-a}Fe#1bEh,B]y%){B~'T`yY5-ӜV:>EӄD~ ٍT^&CG:1 WKbZ % G9MKhׂ]O|ލlyF%MM*g@mU/1mR {$KӈR#ךĖz-1Fb2sGߩrr5ruKmj%I4+0[lw.,Nty6 ,''炖-iCJÝPwjۥ%jxuTʘΊf=Nlu3?@]4Qq!;U'b}|*=mQof}qׁ1k#c#Jd WM&#Qk rN(=0&caͲ ڿj_#S+kaP/o/N~_PK. ]! qPKy.F_angular-1.3.9/docs/components/open-sans-fontface-1.0.4/fonts/BoldItalic/OpenSans-BoldItalic.ttf̽y|U?|oU[ӝ& !I{XaMVM@DDDP@@wDEԪN@Et *2 ø2㊎B*՝Df~޿^vuս{9617 [;xOg5_>}Oo7/܄3#oz ɘ~]wͼ|us&n x\x?kNƬ?k0}N|C'/Nbj>{G f=3Nǭ/fl|^> s{~޷1gMmo38<{ut ƏΘeʜ7ݠ|%bq9S۟u '7[0~C2oƩ7lK9aD-vtݼz݀ z=f~jā7I$z/8*M;KcϞp.OXs>y-;IÇƑѵ6\1# 313.hA]KW|b}ɬjEsXoPc6Gnc݂ɳ t,ap,esq e,/?qIJ衝%b9*֗ aD9g""/D^#_G^yx^AAS,'3ggM}β>-b^y|RU^%&owk;uz.nyUWކ{{Y6{f .LAiBYךM?g,9]qyO~ZލOd\5 ˏɏapg| W2@Ox,OJŝt}pćx-ǟs{,^ }K y1=T^ y!i8qw.3o aB3WFS-XͲI$s&}߃ǡXIX̙n >S&/x@ ,)dn-|%*7KRtX:">~,69^bEߓ&R0y2xF5e,?RJSH Y@Q`beΊrgdedgϚ55?IV?{}z?>.%>>}>>ݎ>mw''ܙ22nx}b~OReKOѧӸH\m4EO7֬6ni:QsM~w|=p>|;3N?{ܨs;Wu۹΅YN9;옳ug>;lٜgc?y2PY&CҜY"I]wX3F_8`B.+u)XY,ڱl\<ցCBFʰ~+XgVɮb]XW ҳ;zj֋f} KX5l CD g#X- 9;ձ1l,Ƴ װIl2v[ֱV=v]lgOlϞaϱg4VvgKeܓȦz=n`kb6Sd˳y>Ζ!ynw'!]ʳx1lA2 iٻc "/\Kx;'<DZ︛e1Y(T:jq'u;OH?\_<<8"51u1A냓'4:R4 nL@'+'Ϝv$UO~-fJpEڈOQ]ۋ#]<=^VAs?NjNM&z;&h]p($9 *+.$A112-✫bjP,FWf xx>Xr\WUy@Si53/ BC>p_V c6{Xxff.WYɴ8Vc+;Tt*&&xTɳ&>ẁ+lك=O\.3–:W KLSAgV ҈"=' v^V-3^,VR84 '$B [cbqx%.^r4fX%6ȤLl#RN5$C cN-竖҆Z&8P;V4h|\r[oW|n'j^Jxeq4%[q謷'$Y˜G/J=SI'ψ^Ir$Ӑ.sZzFf)Zr TS T*OS?KAO١`'%/:>\}k N7w CN|>錄&1ԼNdBc3SA&\TK=Gz-_M+UUwH]T07FLE5Tt6VNˤo1|+өpU& D+4&꽟4TF5թ7Ԫ1E5Шh9TO i #) Дy0e27q|YJ|M s{ʊ=IIdeGhV| 'Vǒ++,W=8}|ݭ+i }"^֩;Y}\9C’U8 zςwyoR'xɰPU݇Yv^ݭgNؑ6dh/v9+?:wֿ .4gd:ɅvЊA+\ ӚTpВ-bJ\S8[.r\%aչ+b84`:]P*0n'Q\UYYurRt RiP҂qߋ+d==܆LHy`PS0KD`/whm7M y{N~4u+76{6R׿Ex=>W|MH$S&q=,}h{2yɓnx4YoLM`]xDLbJ-KU)-y>-dטʊ4d;|*yQ+kv],gfGָ+pyϘ"ffG+Q"??~=8_lE0.DkH֋fISf`teA)U*mP) ͂+6:CH\0Ck{7Mg{l~W  3͞ELwUN.|f˴xu=O1%?)͔va>HmLa8K^[Ɵw|_+A"jC?PC,2j1W^,_ ̤rϽ|>}.oQX1@zu|EC^&RZ,YSeXéx@Mh̲xbNwdz,:&9}kBawM9G=W.X!/󦽯%/>>FU9$֚*K+4}L/ahXũAe*5L5qM2]tb'>xʡ,c`)cxn;ZFFI,,d-aͪbB =IohnhBdJ+U+lq7`+Kn-aJ%uT5m?ʧw$u.?ɟ|/ykxl;>A/tpͨM"1펃$I & SEK-x zI=WrsxR+U[MT\j0 20N`x lI07&v5FXT^x4>21 4-#(d8Ip4Eю+xš$ѕAId`_cp2FN-v/([aEliقCF[y/cs{wޭS+ba\[u|)73`53ky5eXk8^ V$a}>֌mpxH2KjV]!BbLnGZL&z#6|YMl!F1SߜPC*!# ++a}fJ>2j.) ĚÎ)aKO#дBZ-A]{ " `**Ś >hn`%p&/]g5Lӳ*l#nZ!p{X~НJY{/A@.7IЂQ9RlHqLNfh qB3K3V/2hiw#!DrjA.ET\cBa8$ h{M ^;{lug{)yY 2xkڧf{Uߛ<Ңw|ϏWIsJ 7lW4|3/?wp}پ;*=o=5I}ѡOzpǧJk{2GGh`2o&=pe%! "AIHN7n,th~:I+}px}4O\Mw`U?kH6Hk4'L Ix2̒H|µDCw{DOaњm[tNݻ7l{WNq|YB>k @ O1zO!c1V8QLsx/*lrJA{G.[>nk\n]}K㑣 ]K1BaL#"2ff4.w}?ۼ}j_Ю;.ܪ7)y,y;?d. (-M{\?-t%)28295wN"Z0;f8&_p*9,8nkBG 1YXMqz;bi.$!Q^Kww`Rk%M$ >dD$v!0B.Qh$lGp'{[7\E.q8Df >pt#{ `G62OpWő'$>qd: sbrW]OWe,x5+\pcJ8x3ȴiO㡪/I c11t j2$C#_(vTh*y6h4 -k^a~Yԟ`LZǦMfiXߦ_I%a|ibH1qbep`FKX 6k$@v[ƇϐK8Z"XZc@/p,!͒ν)?N#WݔGA>XY ~폭ʜ:\AOvNddwN % wdn[9 :گ6gb@4A8}w`vqA4 6hPr7 kڧ?hVY1cxte}M'9r<1IҢ[u[@c\ `<ٓ© khb?dC `<-ϛ~WY -^R2? r6>ވ /.5 M熞0UD6H0k$ M ygs TwcOGb<$r,=3KFykLOQWټ~afZ#hD$x5ԼК/cXJd]wVu95h0AvJl:K H!5X LĿ>)OsV_؏c,I5[VCN@0qN @z ^zB}l\"&A0[%!Z:[P+9B:De(eN d"&o 7 Ǘ,?dkayM[rፋ9h| YZHN H@1mH0cX-pMd-lfWjf ( sG6Bq^gThx +&Tah7ܒZzn9>bf75}җgٹnXulukt7pثN^L6)rQS,XAȻZKi6bWl-IGd|BD׏JtAXm̹".4|͆U@H-A"4A lz<`Ui2T(ХW'F'S$&Gl~@uFSV j/&|ߊȷB&L#ۚΖO]$Ֆ쯗l><߂<],T,X`k>@:qi /ؔnx[WJ.o;|B~>FX&zKCË|AS# t,4yzug+ycDs I*DzHB `"\D*`aB "̤_WxOL啬J`ѩEr 4(NW'|>W/P#/ps+]p+J7^`92Lw3/+{5g;St/Kۉ`+ }Zsl½$yKbcF>C #(/ h~XAKŭB z -6ճ8G";[4t&|PA|D HwOސk >KzUu߬]?^]6p y/1X1a':%Qu` F탗^. L'V[i920#7Xt0>"FBon`6eaU^uȪA[{^njgM^}0Wk+C7 Em_0%A22 1WA{ iN"fBU%:g.C W眱۸㙃[ƗϨng GOq/˺['M.2t'~a%!2LlC%?u fzyAqPd&ŢsC˘sWϜdb-@VF7gM0|IU2{B cU4'17#5c~f!U}z$4o#6˒3@)Vs""*i`ON$N }`! 3# FnBnQbH=9ӜmC6a2dº -m'r2;q_CI7N?/|#wo|Xw9Ϗ:_=*ƞ)}& +J>ֳe!ܼA*0QR^D "EܥjW2]lHq`+(՝!O 5OFkeu?"M-sjWa\DFA i!e/"AGJ?+X\ ^[%Ē.d-)LiRZ.͊žDbD Fz.L'("΍s҂u[jLYG#F:/ߥ}m.vo?}"8so7}_sb֎ţM/.e쑋y_?oO eeX +oO-;<%ܷh}QٰW@&$w"7ޙ 5*A+xL1\/@b-1)P??$5WTz.'c8nyRJIW^S#k=AU}A4*-סY=U;[9{k}8x մZ;wtBG4xm3ZR@f!-o`H@etD@٢4 MYJaoykFT7~2])T]5: ^i0Q!lZRr" JA"GG)/ ÝܵGat[[ٺvMHXҠ&So0x\vsL< +!v 88qKy"Zcxb58Ʉx%qVf J>SB. >ך7yM5foSMޠinm!&'=(xh@ EBDq ,_10(i\2:E7fodPOB~1Qw"5LlD5rr@C14MDzw|"XŚB ?T3U]yXȜǂg.o3A 2)9\VdR A(c1 ->iD -6K/[N7~;7Z_vI该EL<s9hFd^fGhMَoF_4%PCV"̇|A'(,#*"RQ##QЈ 2Q\ L wѠ Ť"4̟dA?9q/bqF@M&ׁ1o2(@ޜNc ^JZHS!;_ȋצKOsP?_qUo.#&@t=h PY/+j5hZKm}}iM!klf"n\/_1ܩڳ$?`%-.'V 01@;ZD KC㡪;.@ŦcD䴦"6>SO LJ3#0-@:a$Pz\o!;]eqDݝyɀ^=V0\S鷃]spc]ݟq 9(De!ޣuBaPKZT̟֔O1 ZL[]]X왴bO?\M|3JW"ېj^ -a`vxPaiABuS"8.2t4yv V3qO=뺻WQ|ozױ=;{}/]s6ۥŎ"l"14Ն CH:H-- 1#, e\&R}" o+R",]+Ȥ&͖QfGΚ$HI DtK&j"I$  X$_!S31_+ᩥ u='{`ҭ|wB&xK$#6=.LZ`x8,"#2!P07l/QxdDBrhm=$8JX;KZ #'L> ZTXb"m0h2ĠG .J!KW/4q_AO1D] D՟vQ@^Ɏ %;TW`ao o:bw%.yJ ¼vI5H)׈7J2r|z/Z*ގ8QWJecMz^1ۑҢ?Zɕ2?4/q慸+($UŻ [xN|(¶SwZlCbCZmث 9"UeO<ȍ.uVY>nM?O8Wʥ_㺛qx̀(4QƏы- |s( {k̘tS :Oe>y d$.eqH}!!g5"SDX:Y$ 6[F3B2fAFp<)9efZZދH1CZVSU(:UE<{)⫓d|yO`N_ {y:l}3۟sP;Ybp)WɖW 5ȫGhfX`=/#<$$?H@'e1*2801J bzcbвn2eAWH_Ik֭Ws|sհwl_ -& q{`o5ȿ硶AN g7{}o=L#?kXlta3D|4BEzC'- Nu½ !̃TwpJ*-j.K! ۑebUWRi9=&xitE6,RMsdaF Ój0Y h 8~z1YrXn%!ÙłV 6lHr{C'\{Qg(PW>Dr͘XIA[ cS>`΄Ix 4lLQeUJjobz+|dW>P1x%+|"lb.غrǭܾlŖL]Pb zC)+*VmZ5f+6o^1aƴk\A2A\)DhLp+LNN34l[!`a5C[j=굦iC0عӀT xxT]c)mXgHgJ?hH b)6|!^i+D ARf3 Nmϴ.E?*iNbuu젪ՙg9%4=Am] AۀI^*mRh- T-Zs|_ w\<}< {w7qܼfzJg[o=y8={yPĿ;\`.(t_/m*EИŢRI4d ؓ /-ĴƦuP]j{T<8EB_q8wEr=ؾplF?eWozBvͨ}'OUݺtsތؿ2i3܂)HA)\GK#'uBb@6菊m<$7Dr H1x'P-F.X$hL5nc?:q£^׳z츞=)67щǍ>]wVhTTPvIu2)tj>!"8E0辵eq-^v;m椔R :dTl(BMEΜvE5κH5r>Lԣ4\~@=:R`n}ID/\a6TdWIiNɈy]CQӦ왻|k TH≭XUG(HYү_Wb/R pb$6SB3DrsQfb#VG3kd=mJH(4C (a!V`3ǻWM: {w? *߿d[|lJ>`NJk!!@<'NCnSC9X42 MƜ9liMG>Gm3-7=ךelsסX\gf@3ᥲ"p gN,`#!;X ((MIԤwF^UTGG<&i"w;&uZYpò>T?ϵs0NkSrA#FU,dsQ1n.wbL>h7Ŷi_h#-Zv]mW^lIK]{ǔC6j- -v Ԣ(6FjoKTzi ͋򰖲\$ Clyaܬ(|Fu;}w[9T(SrK'@e%G;1=(ޠ[4h_VvЭM;ǸLXƑHmi_RKSt@KA>3ñ搧$꺩f (U H:C-1JI$.(rS@[i:QZcJ24SPm*%aOB@|,PH )RH%( +Z[n+)mwR.MiǻF~V3<[B4*h&-K Pj' }~nC%yOx{'q`Nig OHJCYҢ6'imf5QX_M0,B H[$"R^Bd-dQ@%i OdŽւ b肎%yNQ-5)N.Ҥ}Y.˝Z#<Q%aͳY>cny]&|Sg8Zh~y>ҥQSH́Gs92gl_sM;͍qI.jH/f:"9k#`E.A)m=+2B`?Z RJA,6!G{=/)i=&6kP e##"+KKx|ZhTբ 'Ok`!5 e"OKIf,WOiJ"T {C~5b>uw2Z^ue:Qy˙0JړR@+{ Uǀ :*l (S$I8"^AF#zy)&OdȰ_]5rziMX6|b߱9d=g"A9<; o|CY,Ð}/]:{HeՀ7UQoa`cC]پxAvz*{Zhin{mm1iAf#E),bals:B(jU i=؋ .~J[.]@43ܾvN;X66lL+¾ZVlLР}ІR]%?d`N."vĩVSzʂϵ@ EXQu캋'*5Wv7zb:IfTTpΆbaߎ[vWOJ{#o v{$#0z^mk{ύvR/qO⹽}.kӾh(Zs q>3G<`9NCiY/c PK LKB1 LpJ3 ۛ& ǚsEJmWbfmd!DkIrD'"Qu" HW}mĺ"wWuog]|ǵj]/tX=nη?Ν;zC݆9sV3ߵ;4eTk@oihȜ Z7?:mѦ}1hv^Kk4r[}8h{q5=}RiX#<!TrJujvJ A;"y6ڎ5={՟^~!"+_ݯOo_l=>1j DŽB̡Zq#{H;G|B=$KGb6]qAbD>J1AB%)tk)t9G`+)Ia󽳶Qi纹ϺOJNfҊSm4"_L&d{dl_Ҙ+y--5kgC7"q= %QDAxF+ZT̂_h+Qv!i-HIO0dP$'C&JqkdndgBs$"ߎ7J;k%mcŴƞ!_n]xHտMV[<@ZmN~Dhm߮{g>ew fVa lڏv`-+ZƷ^oo~4v$ļ6A\k~\ac#g7r[T?#~!0Ŕz [z=}\q^͛Kf/^NԐD#_2ؔ/+3>XqKf4|_+BMnmSK*F.3q p\2ۅiZ{T3_e*DT`? (wnE5&Ibya/(q֑;%{/s@e|s}^sǎQy-|veq.ʃτ>6:V >xqhtNq^?:e 4Y>rX-c^A$ڍW7\kȼG$q}q}G5|a u3Z[4^AQ'k\?C~ظis=1]r,\^B{E7qܿ?=KZi#ŎԲxʳ}H|5/0OdxSaQv"]Ju4/\5s ү G^5_vNNHxp7˄~($*TLQ5u6QSgo!Y?8? b zӆxg}Le]K0_>^nbgT1Kf֒MYTgRU&MnxO + [E;Khs3'ɟDl{DEAg7쏈Q;~- ֻ(D;s'~Et9a(QŰas[KVmKVV,؀N|zeٌ8q6QvG^;ט т 1t@'W浟?NG۔V"՛:𳭕^}Uаh7k-l]b~~hAj3]>3z9ˠ9h|z4<62%(RI7-j^~VM1G'ӾqAcGQ ~EEtk`ւG- \:*B@9F[8*eEcKR7*NEafů. WLb)'[x3(rbU҆%RX79>⇌ؤ!cq*(W1~}]$e*1"{FnR#K(cpb^4b۩?fHh3Pڪ?`\s hnʏ0Tgx3ZbtoM#@Tk|Qbezګ0z=<#XǨ3E^޴@;:sl?i6M1".z5~ObdjQVCFSO"^Q+1Z^(OjdjQ5 "ԃ eQFLBG_l7@r]*ZI+yiDԏA/re4ӧײm"zxC1пuk;rc'ȷ&L]Ս#c}<aIҞoЇ <9n+zUaB=WUP0 ^៵}?dOui~q{r_]|?T_ ,}?]?z ^Omz4p[>!`{ܰQo14?}M9A܊3|OuQyHwB'zߏawOL6; JJQc"l M@}`z0 ~lVlB_q$UDБGy^҅d`c6MҎCsD;12'HKR4=wFK|Ntƣ%+Y5%dP8-Gu[^Ұ7 0`"J2P.q 40Qf ZV w>_rtr0D>P[EC42N4ALcSc4#&x=1iy}Cyy׏׫~G{Oqc [۾BNy|}~.|7f??uSVW'Obou*\ַ_]#e|ZrY2}rKn%GWt>)8_O2>=puUzכJھ_\ Z\ >8 @ :P Y_AF! pÂ2Z Ȃd87EjhPr#>~x+DT,a|e7X?Pe).K+bLW~> d|,NGX0 kzH3rh6`ZzYC譙hb]P>qtleE]<[;2VD7+Z/ϰoJdf0s>#0˞x[&_mmD0Q7gtчc$Ί(ݿK UW3:;l0QL Ljis.n/7:qK4v<3aYe6 %|t  \;Q`0uGXZXQ13ՙ$QB>ȩM6b5b^C8 [@T (yNUV^H) 3syjIP=a>U֮o2'j̸7a|AHs~z: _y]`C泫. G>+CP#ǢD@p|AH%CH86)#ڙyPJ|t1R'1rLDEQpJi*Q"壸f-)Z.&#K:u==kEgՑ暢fΩA>e(3{S ąas`C,c; ?n5_av.I1u/gW5j% /=pUf$;BDK,}YB$pb`nZw<PCIbݭUeY==6qLs>@۳]c:|a1ͭ~6XQ,F 2x*)C܍%oW.I:v(SFAē%2U*i*5|66.ZKg HehFeT|F BEx#1RczH bhe HYϯKKsd#:azI7L&=MG"gmXHF6o"F ( nʸ%m4*Pal7陚QL6 VMis{xp?pcĵU pg'-cr{cv𠭬K\A<9Sxb6`#nan~Mb_\hse St\'MM '_ /-ϡk)wk DO5.MX!D҂{MS7wi(=}9qgнy%M ɜ F=xg*appxN/+i{%58)S2`wk0W9*?Iw8&zT#rn]}ߝxC>('n!>?Gɸ zà93KR歃}&ѝ̟5ftiUtd J 27*k6'ؠ&Q2n5QՊ%=9], `ћP_{K?{lÒ\c*/*}[k΁􇧞=^;Ë5-1Ƥ3ki#o#s0'VĿJ*A"RP,Eעav"46:kotQ.9Wl2}L8n&D5,vC6 8`Wjvo⹋mbLH겶BS+~|Q|;)(>4e]>^4}z6͹ˤ{EYKMuGƝ}!N1rFubX+&IHFq-lO:b2q?NS %#[UGhlk= Xg!Ō=d&:Hd[<WI>pD`cbZPs}FW'>|.bլchts9 wB3 OV(2KA EVgET9"i8bsGgcZzmƐ"ε^mേļ{EUSҟ*$5k,eIP^S 1N (eu8̹fs ZYQ RqgCfXY*M_}7ί]<[=dx0U񬘺_??i'ixf;^׺n1:8i rJ,bJ-Ăs+-Vy+|!yFpk 6Ŕ+q==e^\xօT褒=j6T;H.TYz;ϰwEnj)ro0 }xe#֧qMh bx 4!;a*G"[ ׳1K<gEV0.2+zڛk7ߊڡg: 7} C)>ߤ_w?E2g5M_V;DR2Bfx\Э ciQoܡFib@(Pq3yzמ]h^d%6a/h䶢3?>ԴnSV<Ɔomy-[<]zWv+zohmʼ⟆o36j+LKJG- /4F#"% SV0Pcs^ZһI:%l CdvHirtK~aӾ)1Fj_jkh9xdC{\~1vĻgCCn\2|R?6͟W-rM`!XC^dK< W&S| < n%H_>kѴ0ш)X?;B1u4'UF%/q@ n$65&yoD+  :y*gL`μ{ 7o=SŌ? j1V}禯hWO,@kCvbњMHɷFVPt)nDMYq0ˀA@3LǶPzR/SST ˺rLp?* D4\?{C6Cy5]KhOX|ئ1y].Cl*>we+kE?𷛠ʡ$$b[Py QAP,X z J> DTORC#xTbExVUwLhZ.k)7ì-j˘)۫Xq[vгX gΛ;7-U@6Ex9u#?,m:#$T8z6pgs9ѶЇcGol'? ^u.Rf 0QZ6ʉ+QJ:Fч3m L~egU,8K:-KBN$=uuG>O^V\<߼!5գff`ﳿ8nǘ9zمY'=$4 uˀ-8 HK&rsDĄURYF;42]:U"g669i}ÇM7[W x>q9,7rLNeiѼ7Wml@w6ꋪR'`K"`0a:BuYKx>`6Ա),Gl#=ΥhOsBS}]:ߤFXmKeyfi kMw\@qShz x\uFẋ`Ռ& $Hhyh{IIc^7:GAbͧ7yh7r[,Yw")B!iHBx]2a_~(#] ;9a֜e"m-B[Ϳ *{=f\&jWV9LJC²ob,KȦ;3k'&hgf8s#׌I}L ]ya٬K_qR{P-G#B}͙>%kTO B F5SQZhz` @SYvlTn듕Rv'Ppf"X/V`P-_"~ LpTQƠa8:FܐShEd}-r4WǴ&kL:Q۲:lZP>mV1Fk7)dxԐpjp *a7n): :4 زMh0]qj7*Q&F%c &1ίxalØ0 K'oQĬ3t 6ŁWӥO/\ dRH˛R``HNiWV^m}bh+ڒoG8u"wnߚ5=, W]ÉG 3yf8$(GSȘeo f)\\bm=\F.L' ?tˁX Ly%ljyF QhM[2ic!>?^PRFֹs,Dz=Rs*z 2l.GԆ~bNZv#.x| LOȒYuU!,{Nqx8$jUqrCR -ٚn0zhCnoɣPZvdѥ (はt_ 1wm ^j[ﵴc|_2qVs{U++/,Ҿkrڀ57^TE+ ;ff"wFL=O}z(ܩ4/dRAQM3:}nn{'4ҠF^ӡfs ܒhD]D208r0-g(6Ѳ'33h,Pq( ^rrwӠL>r7_ m`Nh$bl:}g|8|:ԫ ΄vbE<{rI aiA _hkkWiW..],Jq/Gl]-fW& ;6^_DL,$N' 3Ş;eȈ:#nn"2E !h:FT1\t$ֆm.^`G.)=ȫ#cS >AVƋJRjˤzy)7px~B@5>|"F{F8pão0{h @& "5 Mv%^E~Qjs&Cf*^((¬w3331h*ubǑ'(Ͳ&dyߥ!&E]&ןi+P*{qG6E 0<  !u^CW#QZgZ/`N@Osƽp%<Smr3維 cçp&b͛K6ܝgpwߠ+0K2yDU J.Ep j{3!w,bvXK0qw݋2&cO-'ydvk EϤ? 5BR a>>'1:= (rT[T^{`ٟc1'o֠oT̾4uEoMU,G#G=W~յ-'EҎ)hN`/ oӖ$YmġIG::Ӈc(:6eFr+LA(7HY2Xܨ!&6 Jk/r17٤}}cu Zۭc{ VaO&lCxXs2nFG6ZHrnYMI%c"V8P+|@8g'A( V@VnoQ&޵{Sk=K:8kݥuO^y{ dj'/;nTu#;`c9ir\I ৴~øF>>'E*0KV,RJԪ&s?@EJFZl9S<̎ƽf-hIK h2 f >A'ۇOhQ*H z?أ9$N"`-VuT*+%8(3>0岸U;}=~JfH &AprtPg=GI?!wcTɍ _ɫT@A 8$aIs(Nlsz,}=AIyfѾ*k?yfe8kpPCBfGzpMxaP13^_D;eӎ'֧sb_h i"fIg9@~m%DuRuWm۰ΘrNW!cM멷Wkm̝XCo3:Brc0/rG1%"ʔ HHh07*(zlH3^3hP5³ma;ٰ{Stq=oU^恘 炶,em\!90,Pa""F/u˦9+إ 7lz3X6%81a.k]Իu% q`7â9%s*a#ɓKBà!x'I8  3SuJ| 0 ?{(%LqW%oiydxtvѦ<&uBӆڌ".W$a@`;)=|Q|Sأ˷%⟞~Ř\^d^| R"$2 7I^|\ƑQDF" @6h:a41%a`NPNtMQɫgfr~U$o*P* f~OظKAT˵cʕ ~(pxHo?hihOc5Gb³%do헴]sȼןw5)Q*혴aV!~) dU?2s1d/C+E1[f<1FF.#D}HBP`#isёzzY"\<-J#lS`BZ'}WL˃7)% 6},ei|!"sI'ֻ?g8+eCxʦu j<.7Z0U*u]2`4ɣH~[8 hOr]~w?Ӄ3TY<峓Ӻ" W/ǒԺ߆>/9 ݧOa=Dvt3tbh.cQ0AphBHDhiLt 0%Ԟ,NzQFN_<^*QYrO}%`m|nj5Z|QHG>&qۏ'aDmeE\>:?boO  $えJ;6#y67qX.5q@j@3ǜ ;<`erQdy(GT f#_ֆ2򱫽D̡,G8 Ģ%ʮ2L+/P>1nI pCr(f/(W%3虂Yyj$bP%rԔʼn/xMѳ4ro<{6o%[zO0Ίc*R8 Xf 0ثM'( &xXoNP-֮oTCnX@Ec.5$ ljP96ÉB4Myj֒/MԽ~i,Nx7uvfF6;*YrNJ9ocRk<(^U3woJ i4pԆF6h~M{qO~䍏6KVc#p`C<EȝN!єH't>;ez XX ݺ >JlfHj#םA#CV+.|Fj IkQ‹.\8qG( Ǝi J)n%{9+L񷎜ϘP['J6 m p-yWԐyl /„K"3ZM@^B#>LN.K_ 5:Xqh߬XmA/_ ~{&-uӠ9'uʗD޸vww0яo~Ȋ̬)S>@cx nB2:$Z"q(oVCǣdy qMHJL6B  NZ]&Sq{p 6uTYx̉K+![O_=(1;ǟJ9q0gڠ}ON׌:~=^P־^qXnNQ]`}s[Ũ2~'y}M-zDanPRPgw\-A Z> w,,Nz U!>(в6ԙyb&JR*qC_ы輱9&[@q:\*x>=xѹ[PO(ElX02+kZ9Oy|Գ٘RF*K4a>CL{-e>rր>J>8C}cMڹ|rߗMώ'&Z9a6DM8{@G^*2#,2R ՎАX7~-TQRTȓH&z+4 VϘ3$Jc)סG_h 6,Ys[mCg}w{?M}ޫڭ 㣆?~.N0"cG\[{D 2 9` K:ķH[2*֞7>~0HC+);\moEym7G >Kmo#愚4g/I#:k_Ug݅#kpmܪ^M>ˏ1/%%qsh( P3A1 Pzy=_<'; èp I`tYH]>¥7hҳA!q D'PdaY3@d' dJg8dr.37ѯEϒ:ss&9]l!'A=ֹAIԸ$m+',wa8#1{%=Ե+ gDFxm'#ıq;\()h)?|X;#X?}hF11r[',0`ønqs{6j}i>XeVVD Xj 7[)O-H8@4c鏁9A>B<" 䈈U=kPJ)U!& >㖕 CXa_vKfO/[M  Vvo+ xuc6x $[L J$ 3oٜ¾NF$ oO*{U{[ھrikgjK{ץX˅q༴& N@"s^%wی!&0s%(2@{c /ؠCyQڏ%˒/[__f`% ӗDLb˶ \ƽĤ4jF&o7L9 0Av쓚6N qO>wY֟(ߺD%sQx8:/'.m;q9_i`Yv%EOC"KdeRz J JH,uގe=w=6>5-]ZRl\Pti7y@7=ZVMÎK5'6 *w&ސ?X8bhւ 5^VciTG%x,l1@ t_rF깁NDID0F;NuiYfqM4+k&^o|xm(ϵOݿ`je͘`iZ|LCE^4=HeJdk v`C!e*AHƩ2;E0U4mNKM˒ y"kYJsmf֣-%bN*83kf=(ׇ!fsJn-{q-0UK 5Wt&XgǛ;Dn,)eV+ÚXt1j}KgS֦by` !b\ɋR# 8K^bTHj .^uo`E -wSFL_ L YM>  mG!קFc@A Rm&֕54d Km[֤kke5?/oʼ;o1k3#gi̲1agr/z\ۥz7h s\A)TMi/3 ͮ5sȢ-]d,\n(_#\ѣۉ-8IŔR^ CQLK8؇˅WN+^7UqK{wlU5g:bq` 2< Sf)koS. I}8x`}xgYg/vSߚ>0og̫vu'b*[cz=۱I" cg"L41ؔ9plW1y4"]EpcʦC'D v|LA7Z ULMf4lzm} ?TMw-A8M9$Z1XXfx!lfPp" 1MmgEi: T) \@Wp,FM_2*ƍ"}O:CU ߦPX4>wg̽XpaO?9ƽzHߗ{HZ7|˾Xua1 C+Wk,.2N]q&q"=h/vCI aq&d,Ɔ z!> V47*x"w ̿7ԁ>r<u70%qԯebaK6Ԯmǟ(6z<՞fҞQr:,Qf(:&v_0 k'A zR %PFw]8Ű|UB^/f.faɣPk)C d EV:_KjY}֜IGmvjb}،@m K`)@|z~E_aBA, h ;۳߉&8ۦ6Y6v9bۖǭr6xO|`={ƯwTرXQ7SFb[HG(ŸQ6TY!+IryqT&31vq AZWtJR]d!! Eh5S[<Ѽ`NvY 53vFPǾڴmb6[Tr1fJU&\QKDc"σ.+*馊HHgђN" VWVgz4P1Z ªfE\evX./ =e#j'>mEVmgssR(upͻ==3{i]2p]$JzE Ek4zTo %/ պ^|kD'4ĸ~%Y 2|'$0 8 J Hc8R5/:D9k" %p}0bHs[`IxbH3+gED4}Ei_ڙl`Famk1u!OU"C{̇b6t_BYMBD3NuI>bbNY+ƙJ vĂs7 drqݧ:f4fN@ @3;2;x"ti1"&OjyV}$-G C@'*hCcTnjQqK>EfvP}w5e[o}q.LS.o&˨6s.w$Z'!ĵ Km|l 1(ͦw(fP?8GVQGgJE%S*wMȄ2YPt_͡{]6=nh- pqfAPbL'qʵdG%>&a,6_/P;[ܰ8<$"or}zk<$af{hDey|)]<"ݙBLj%)VԄrdu@! oAaGYedY: *'X Gˁ; 2-Z*&K4t$=eF:ziX&¨s?*SK[^Y,B {$,:B>~U>Y(ALUGA{44}9kҧq 3 aîz旐/3tlրP5 Ӂ7pq3G-(epر]1Ȅ9O}֛ U:e[yФd1O{IxB9qDk)h+.ÏqwB K\q#Jw|Ոj<b.kSPnM"hk6$>#(ō/i,Ϯ׾O1yrŻ~y/MeHu7!c'{r~ }J뒔Ypl# I =*phVOx*@20DBwC+}ddi IMG#P"T.!z]PX"N(No[0hF .t1Y m\* -bW}AѨ]\a^bHgZJ߶!YvmZ0NX gnBdGDua0;NZ~tA@FJлv yuT/1\?&m#M/4՗&! )"HKjT() D*'ȁuhօRqJTGN|rr"3Q@TA5)N2!\HhljlmIOk~GV4cdi5}.?jg`o+0O{v}%S褐0̍  ?C:֕Ihd ֖KG,S.iYn_UE/w u1R:\triTJIh6[Z1% s L5-UK&^FFlՓ LR;%~|.A0~\I(Ovǖ^yB^cBaO/gmo8P9u> C%_"J4V,4+bh7WU+5Kǩq{BPZfc*I 5 rF)4<CI1@ԝє(n7͍ 7QCб V>8>42yc'wb3Si?tZ/Ѵʉ/"O>mfu}f2:OWZ!"@!TVc[m!Ax&q%j"+sǤ[)wRLt;,Ev: ?kZw =$ޮ5A8яQRLcˢhOa.$|%L'V!\K8æta¡I.w 挜 =pCƝmE %vXX?aR^޺|چ_>>oѣHꡭ~9keqPTx8g%t[=!/eٜ=>dWCy)wG{}U@n=To{ HLT@ح=I($rSz`{ }%ɾ/EOU2Gk ڎ&zҖ1_%AI'=X@3(t욹F,_;K9 _sԲNٙYê9_͹n@Uu}jkC5<5nw3+J `=9As폄WU7(Oq} B1ntb>wxEj2R c Wwpn1(Cl˄æ7t?C(;lA&MoLe\tT4}f"KW.\nLeB ?T M>|F&>?IxPdB5(g)>,D|/)ZeaǕȘ< zdV0Z Ô)Kg(q}3p^3EJX:dEbbs_NZ|kwISfb-o6((kQ)څ#j] (㢢2f|uK ҟ _4ݾnh>IV|!C|u/]Bδ4 3Jd3ac.(r6 MZZV?A0+2 KZU5ܣsNfe6S;ycT$|,꠹B5֗QYѐOXUr=j6|bDveԔ-ܕo@M7 , OEA߬?쵠)>M{jJU4H#MGԮ%27c-^30Xۥ{`%E l@8IeD&64q%LB$)%޺B@P-Cc^eT[{ n`Wh~2CB2h s F!Z1Ih JdHʽq0˽IU,eG1kWWz.]`BXBu`>k,V;hmNSe)0YI+$Ev pN]=w0y̷G86o &ڋjxj2gl]5ނywL)u O +/-4k/ޟsQ%7w? WtzO99dtTh+lŝ䌂kY+HbƪL,nG 8M0PJ} 5r+ "{iQ%ƽƽ~-;؉[{oqׇƽ`{D0e`ɌĸPd3Qd0}E˗{~WRN[ՄLRpȔ܉*ONɁ g#ʽ=zhPjh1T#=!3X? 4>Sk࠻o*_T?޻XS]15]zrߌ[X~ޙyw)KO랩z;3kV[+vӄΜ<7j6}tUh6يht#3ƏR.^})Y6G-3վj*>^{xr9{ރWd2H_C7>ʹ>+~9_3?f 3  ˰W2v^oA8|Yebɗof-7 BG./s爧xN`zn7':[ӯ/g^7z 0Q'A|ČCױ.AVDB%8Pr-FjqV8cdM7='#<1{dhtظN!y;-LQr4E&Bމ^;ӃV8%L!"4i&b 'f[[nE,;_WsЧq6 `;yy_O0ܫ2q]08?U^PII׎+`aOOOJB74uN'J7 F+< Y~"qGL-JE\e%܄:>Kņ?XSlWo:<ο^Vĥ@ V z8=a\<'τZ)=L3h iyxG+o?sҒ\gzC\KWtx'ZS^pb߈ . Yk> ?Xh1m2~xu)ǰiM]ZlLG/.>lLezc.Vi>/.1glIF UoYZmXxy+JXf5Ѻ—'D;#d]B#LqTEAxH-NXˣ=Ȩ)El $]Ytb<kNm#U22;VIʖg} !Δ:V;gMtL-zxI{o?uA$GnclԻ xtGO6?:y=e߽Ȟ;:їNRҫH~ 3Ku5, 1"¶Q2h&`b=LsDmތ*cxcUDdFxW">X9͡m*Dj zi:f.o fEB1*2"~K26r(Ol`!,Kŕ&n5Xaϸ믛8dU4u`V6{>nK&YBHB$!@4" rED@EDDJ)rQ(""*TT"(V-*[myg7~NfgΜyqdVJA+0@NC8 5(=Kn]b)k{䂅+R( \]z9Ѷ[T~+@iI6l`F0i6m &0#v(ȯC*{vGe!)h(h4bw>x+Vjϩ󴣓<&c`3We(@\0P'\;\!j;+|1%W3p=Wh VNϸ(R$]CnMt0 ~ @A1@C˯Ek$-ND0ޢb. 1 [lVՓ i5 "x+ cq2mBd|sJQ^%*KDD0dO7w/f/Ruυ@dS6ԠU 'DʀKXp2J>ȩQf ߞC {?ijiWKH$9XfI3pUV'`;H`q@ܑbr<>ȋAutpJQ-nsgk6ֵˎXwΪc}Zzb5ՐQu!ĥ#@⌅H$Se2r u4"E2lͣ%A_kg>^EVP?uU)hK?I$ gx&Nc*iGr^vDx`E3_lngCo$7sBݎ.ݖ }8xo+Z4+c揚6w{/L6nl^Vn'`0[`$$)k5U8G #/MSR)="u/zJ7yb WPo66^Tws)__VqZ;5+"Ęʙ(ʽ$U$/A1L[ZF0 !5 ॰XG=?#D9O:M ߝ[bKE 5]G:04ZRqGB$*80n?cC5s'B9 E;OgHZ1Is1Rتӣcֿ#[*/k*Q&a:']I'D0gv60 M{eZt`%rVpX&S!?ojd@+kО=K)B . -PUrE;4rLc_qD4R؏HZ3%=X!k&^x=44i@0Mw$:-omMX,uLb1iRﰛc"l#bjG/Uvoo~`Ԅ+7]yEw6?\߿spH}ٷ%M̫]n`Hձ=>d C 4?ŲKsTJ.z U(`,NU%}j1qUc7bBjo}_o+r1rvI 713# <̑FZ4Gw"sCFh$ uB^ rU2E:>ؓ|4N'i rq?G3yZge:BZz)zn ~g" n5l>KF9N;nk~2O&v0Ih?S^N$r-^!#q>3;Z)b}#"]W bpZWjU(6osw1ֺĭveF&> La2y <KF+ibPz ;ϏuRG:mߖ_LXf"fdx %l&Ӈ( R)ŘB|͔d'IC1(T{wJ& "z>NB1SAh"V`Cap720hCAA>a %`ODa ˀe#fE*g:GO&G"ak1q P'rV/K͟,չKkWi[ytLX0^QkPGdע koIS^WAWW@ʽyA ~!@98f^hh"(26ZxޘJB8TC lqt'"%imHFڧ;G{hodh$r[HN#88fĴ>( 2Fہ$(wq M./P$^ yN"A ab8t[҉רQs0NaIIT9"mG\ a,9Zh,QZfk1>/&>! T'4>.hO *LC9ܗdzqmUJ8nMe 97Q-^fB 5˦AJ; 7Xi`$#֠e0g ±=[Xdx iܰ'R&05F 5g"t~fr _Jڃbqo7qg2m6a8d=HWN,|U. U/bH>hڃdb0IM0Q&#cDɰC,p#"͖8M}6'pP5A¬~+]ғ"^qHPW!12GEz~ujav 0n'*&K$u#=Lk%|u7>1:$L[T 7d^m|m׉L$I|urT]Rex6e|G3=W>>?Ѯ#2*=jh@'H;dX9#hDT` T1ųr!JяsZC3~Dƍ e+GCX+.ZrhMYyuŦB/x?OIN D^1>q,,jА@Y)>c㳜}_!gaqa@%dx;q'zT+X>~Nk.FMWC>`^!p'nlOxW98&f&=D"{r la(4h_KŒEc~%]1FZǗ?&gׁ?Yq݄nKN$3^A;297QkE7[1%߾Z4:/v D.*?Ѩ>.!npb^I;q68҅@T[Yl_??X;G2֎V [qM"qEA,wSkXW;-o3m80"CȐޡ#6G|xƼ4A{:m9R$b<Ęh\Ea2AdD~ +zNλ Tnޱa4qzӨTW͟|k/MTק"O㔫E3#f֫Ez80$ֈ,irWX"%.Ph5+ j1|~Q*nf:޻GNuԙF t ѹ8Pj2(fRE$e dݥQԭF[!%ek^qݰoRt],nMlWc8R{5߲5<;?0D:i/Rg7XĀ.'\^,M` @Mci2jj+Eݤ)x3o 0~vX_AP qf\+Ɛg`W/'dqDJ hRz3[B;l`T߆I쳲lΰZ<עFqE -{?eUϪ{[O2#Kynº<8O:0(SF/|,SM'G|T쵈)ÏD9ߋIFR- Sj1<,!Lx8f֊V-O"U!"Suv ¥P| xAYu%!Tr2 9.%XɤؤɎԤU iȑB .桜W|xeS/']#xd Bg̲VxW)IL%Z?o900+ޭ|wiŋi0LDHK%HwG}ɤ 1B$'Z-TQ$&+Q.oP%u6 ,UF;N\_6IT;)󈵼(LL&Zy2O12Pf# AG@ACX+-R+WY6L/Hyvh8&5zE<5RPǃ@z߳=YlP[kw mR`Lim L Ax"#"Ed2k,73SSa{ZO̜Ef΄3aPbʦA7*FU2-MhCG^$hY$tGׂe':'HhCFSbP8ګspʍ#3O_td ijBKN)uhD {Sw&*?X(X)I\uD9x}T\<`5M<xY!,DYr =@9rgtZ[qmi\;pLd9R4vz\HUʩ>C )`'   +&jW"­m ,c5^xXcHЉV!!El8mTJP ǡb(CZH% ,L)3w>\q)%SW9aiށUKygCU#i뎜k%_3r Y"w.w_/( +)!2 InէHz,-ȿQX ,,%k#IAPsd7Ec)sSr'Eݞ)kg: h -i")/-W7wPWzP?i6>ўxJ͸eI5*AtP˩'5KEHnY<曺nk:^t7>2$*#@aEr2N>y > l s}$C 0~E|}:^>$mݻAI 흲ROBpLNk['ԙjMjpʨޗtLXw)ct7KM-pxߔ( 2+*UѮBh_+/gy˽NKInl'ȍXf'7Юt@>P e&]}4!Џ8JԚ9xqHv=d~Q$\!*"h{?BO~TTRU-"rz::Dݒ`~-iJ/6 v|^p*3E 2@{%-ۯry !SxN 6I"Xox򁜐[~1^ȼǸ-#Z߹`dc֣GD.󛺙s!(F:u5FJ1xL>(i4v*vb~4"g<\ fB*zSb"jcҒ&mrW1w&{V`XbR `&CqiDG~ 1y4G Rz_Oz nW×_٣R昱i =}3[O}P`Uv[!%L2]"q̟\7τtUwO$dq5]vM˒Xq͝7@.ڼ۞WMZ|vLd~s|m@}uܟfhEܢ%c*ڂx[y4@HJ5 hᠳE0uz,dn`5_ 4Ti9}%)5{ž]FjFJcv/ ca|3O F%X@)=X`:8T ic9=6V ^H4&II62ȀƱ!# %!4Q<:n?m6 HTi.6*ǔm^7qF1 (ʍ'gIa( J2"TM(5ER# TA3+QsQM$ːV<0pSiޖё ?705OXe[|E*tah+'3]ƕ66Y\izjPCIm/ #HWiauHwL u$:( fu?~ڛfMptiqf݄ :sT=Srd FIFo[%F h /p9%g ^^Xm 9X {Dq=qɉ|硇O5-Z.0.r@vA( M&7 3gjإ,K}X*S{&E/e!_<x[2_fn8:k sgrř%A& S$lJh tRX%aA9s,ty()"iS }oȖwm, :˘2߷cs'^yHK3۾0Z0Z9kP vAmƂ LA#ci,tvHpNqRcowr- |~}YXedWYJ_|x{[u}'|8kFW[̀]_)Dۛ5֬O& mKH[F _{/vLd?}whe?¿Oڷ?ZsnۭKovn.ʅc_4!ϗGU|}2Qr0;,ĸLTTw96[їEk#&V=A   3sxSo8(dT<[S 8"ZpDa9MoHڲ$P prUM,/v[7'm* c1xG }NGlKQlCf6m{mg8U]i"1z*,腌D= S`y 08N4 pyHg2%#gŇ06X˩ hGs 5֢y>A(Au=]rq Ǎvez# Ʃ g+eN<mcG7삠4Q|;#|}lF74މl2F8p0+S!cCJ%*S0%+A|ƃ@8 Q '̓j^4k3YyC`ÍMkJy|p`UmB*A@sX3;Ema#쎻|=0iQoM1Ω4sIĠ> skq^ .@LĄ)VS /nGpm.1`Uf8La8yz\att b8z&ӟ3 u8F:L b#:&?o$yY ˚1E,x&n+U^1Žb7!!'\C:$X⭩1?U|ͯ>uXi@CAx쨟KJz+JCF/C[ٖ," &1i(>"HhoZsk{d7 H$ЄZ@θNxK)%O>*dԌ8+`@I$$Tʊ`rmk SAwAU f̟Gf 5N`)~˴ ;f{WgDŽ{۸ókDUN +'|~:TzNL{n[бbٙuE]&/8M;:zn9ᮯxTH[{u vdODw101'C2TRx!, %ࣔԫG#@>7ʻBi-JHk!!&}TS^R]. @J^(5@'t$$ڥK2 0XHİSt15rGkG{0WȌFQ;ɷ7O+7o ^6Y޿aE7,g]z%[>r؍!ʔv:'=l7fb ,b̈=mUD(b*vb&) ēaZCC-BQ 䒷 ɮ+MJ]z9D;t<bc*GXH}MFz>Zk?/F`XymR =ưQ),ZD.+Sgv}+ >y}kVL @Ɂ=G~T{phλi2WQ*f)*8h0yН dWP*DR\s4V!8"Zipܼ "8l M Gk w,Px:xUȹ4\0X₸(kA& %427cR;+zG{IZ'Jr< ab~;b^yኞI3`1:ygHqAv)4*kA7gD#u Y#B펷Q#F:J7Os}c!51nŚ8x"J^?agYǧj-5FI1}crRWHLf<ٶ `5,rG[ֵol[߲NCX쿾mqdZ071C"oh:v*mgxI7m;"oԐ:6s]O4*s(\_;;}.?ճ"w$f+u {KCYӣ۶C㏎S!j&j6Y?n8l/{} eEq9J'g ,Za<Ƅ,|ؿw"ߗK?Q{zv>!rmINrClG^fne&4WV] }el%kG9D?Ѻ(|?F>Dχ|x'[q6Gq|O7oOmrmk7'AeVz;~dGI?F'h)7@!z~-ݿ#~㋨a=FO{~x*O7(?꺭ǬO6c% ]za*Y'U۵OxJӃrVR$'D?'=t`9ۓ`߿{2z'#O=χ)u|' 3}؞r}fl˭ZM׋_os3~7~)/O\<%CP q_>yOvF/Aq|hUJ垂1]nZtux/U/qK5Fl?}6[v9DP&A>*KchS:K̿Kf{ɨV;)}KHs?r@ +,.5ےX 3;Oz4$tlϜkh'>9'> gT(펣?W1>b^ӗYZ=bkO٨YGQG1Nt: LJĠ K,:DՅZʹ$E(i+XҦ{EwuKڴit\U%{%*y\>8ա_^*r;iF}㉓"ub|dž 5;ͺGq &xCc,e+(ز8w/6 -X ȈݴytKfT9S ~a!nJ@<U`h#f##8IEb'ӊP1dW=.W(W~~ ƧBlkxĘ׼}-}ŪGwR 88V@AcYG]QRx X#HքϣF5'}$rR."{muv>M@pJ#oխ;+cmΐs` (PY`h$k)*c-;TE객@ T^ E3km+VzY]uz͌n__u*UohYn}WXB޲ Okl->=2e`k-ԅ78H^(ԑ"oewD̻_#@*Dݸ1\S ??5ʢKh;Hd}`? "(N6 t!L,*(iM$lFqY*aH$7mE:K.1cGԔ+f˷;}ˏ>xeYPdžA{nq3z9U}^ҹa1;$AIjõ+qb&C}`LA@6fԵ6?@k)Ǣ_鈷:)?IԳ|ņ)W/g5(-{|o%%+zpύGO/(4x;V*5kҡ%X~Ihn" fÀ 0]Rн: ,ȳdIqOQ%-#pLn9'ݫ/-{zOCojѪ\Hǒ^CtWS^GlO>U.|rߢ_ve+i,=e7\T^'4z:dRj"@YT. d-[ 4SJAE4hJx>ҁv6yǁ9߈@NE@8tn 77hw2Q lɸi<'qJ lBN@܃[z8~MbᗲrCZ?yO)<~iGashճSJ%`>A'GL&eq $Zo3$<qh 1CP7&hz.9GD-kx ~$G"dz ]G͖dS W*1xo^H<:R/nBA&)z1ȀA@OTZ NW,(m8Iw+t$23R.5|H@wQCUZV>#i/fvUs#C:(*)X/.89u3Ϩ%ܸt9o<ƣEs14z]'W5{i.O4ӿٗLU;T_\Cr, P|#mAxbCese{(E Y-hإxK;Vi4nT^E E+rnFN?6Ys(\T\=iߵG*^{Ɋy7vͶsv%fuϛsfU]瀞,v+Td Rlegr] v9dMsmfb5>78@Occmrzds|]:?jI3}7|'FtרAmxeIѿMu=[wf഻J>aNA2,[Y' Sqk؎?^,X-ͭ!T|9Ged#2߯Ge+S[C0Gsx̑6K"E&a֨" GyA:dSWpmy hR{\vE&+bՆ˺]l?c^yK>m/岚sU;D~+(c/F޳A|ڡ^G4 #+P@'2j>ETEQ?<̣N_:-Z 990GxEEEHfĄVMqtlƜnى6ÿOYwQguTcq_:?ưmBLā==VQcF}ѩŶ?,؍8v8y^pEs G/:}Ȁ\Y)C3 1WQ LN?6XȮHxBjN¥Vnyp݁ k/Ѐn[?6rL~P޿sR`䘧7lu>R< 54l) V:9e'r&/RNbnD*ΨT:T'~7ofӕ=^zzfA߽ک` sF۷fW8XspWb-)XW&Y[*%C3\ B}?|n=iJ){z363ȓC\>g444-zpJ+fb5^dpT؎G:bqE {gnbf#y%;f0] ^Rl=lz؎W`WI>k< Q$&AL+9;tBus7/kGϴ< uIBǏoE\LC|g+.tL2[0G`S?T?nk׊0{Mu(4ilM)lJWR@G?M^OܯwEհS5KEXm!ACu-wRff26H#57s׻OFoYxջߊ&h|, xUPzUtp:x^i{5oǞ~Ӣƥfx;TuPp_oCU?&\H@_'C@4NԹvIv)'ʒGJom~㱼=Kл~`BX!?Ч~@b]jfڻsaﴁc9_W)d7'&+3[RwX;1Yc @~پ$jڮXhr.PPzQEٽ&cT)ݻa̩*ts(GS% |%'wNwG5/C޽@\|)C|T]-=9F}MƟjrŕ=x#3/1#HCe]vKȉNn=w\x=ljuu(S uf쳤:pyes\Ov &YrCOӲjTBN~-~|,^x2=wCJ\ _0Rj#N/XJ51 k.Y"$J"r`X;+H6V{%Z jjl\Ih >/v3˚gO3Q~F|3o vOk١߂[*x:TbdssH[#s v#K \ 4vu?T3&?wste"b'YTTQ!9ψxQFs#,s" 9jg>Ipm"c ~?b[~gYGk-e-[ $ /r|+:u\[dԲjdhꑡv*88G?mo-*]չm"irM|.r?Ev 52v\'ebL=U] St'(SwL.]8 |{ëY+FOZ|!Rf 0>P8x)ݭ8PB"! *%jpTRv(+ ~%J.(~06r<VZ2 d>wAenY8hOKawc6<S ln%GĨ`p_oW.XjC;;fSi?N.BJC S:f:ra`P׮ !ۮņHж *2+oOoX}ʯ6'깎[{~2|}f)F5_@'9%+ nNd#aUw绤; cB-eȖlA0KsB%5%YSʁ}0akXtsD[58eyO%yiT_x x0BiB,sФweP,3YI/S,Ӊ&8gB{Ȥ3 ?|Gi^#V"s@!z#/9٩[XROmCizqa<.ǢKG#}BrUٹq^V 퀒 Өm \!%h9R$V^M ݡdW:]`~nT gmgY[ {#~o_]Wx䑵u1 ׆vkm<9u^i@B6JG_ッ>JwYMcub/aqҞ5ŝzZd%:xƻ޽qfNV^EY$bŹFr H4h@r`F Bq!B2LwPqW* ]J|~3[̪E떌k0>JZ3ou+!s5,FD `qJCR?rLc5)AOe~"=N F)9 ~ Ď Ӝ3XĴ9Ht>[|%h,iz̻lA hSR$>Em 痎`<ռHdP p@C9Cē(q[Ȣ'Q:bC/ 5O=ݤ }TBTŒw.瑠_jøblۏ>dƗ~sڿhS~C!S޸Ϯղy#{خtdLwĢmG$ ݛ|@IQj,TxSZv!4$c4dc$$uoϵ-+o|(>چQޅ#!!1ĺ%`Q^QqA^@\X%h 14@+tfqncqc4,-1ƸEƸ$cvcq2CSV__qԭ9Ω[u3NەY IGֺȺ'?+6 L/?o%?o|1d1MA GO0[?ܮ;Vj8#=-{> gbd5m([ؐ(Z*K\MM-7죱Mf~,|(s6kas VJ.1 B`Y~',MB}ntZ1  P3TC &hi h+"QJ"Nlo Aj h?HR $[ "_;VB]%E{H1hȠX|%2Դ~PdP# Z$Ts% G5h#Q EX[VVaF_wi*!C ,_= ލ%JXj'(^#{~C)Al8Ϩhg{޿^6ᮗe1~z_U,^D[Ի3OqXEs#|*J6~ h*dq Qk2qb翥F4bG5@JY1❍3{{,;Sbk(P?mgC~?4 CBʃ,.ynTs(A~3̻>,8)֣2eІE+< y E':1Q xN?A;nC1֧wpV~naval?}d#Z jOU^=0\Wsv%sV:l)U!~h7 67 qe?(g瘻P5QFs(SYePTYmaMy>>d~Ot"֡ejo->AcU}v 8gT{WroNT} <ㄷAy8Gφ8x  B"Õ/Q(Y<'Տhtg_T<  tmQBva(BP|<7*b4E0W~0g@`>*~X5|Qy,,9e~|ʼn?Qqa"o|>fk8h,X5:"_<:{B!ho4 O9s6[6cN8'aE}Rqb`]T>Ή>|>;;*ƁorL-^+%!iP򉐇3)$_L `m?%̮Y~I7zC4CE:7aT®yص;G'jΆ4lHA&U慧>w& pxj2\u 敯Qf8Bx&KLXc9386,].b8u>nZܦx?.~u'AHL0(!;aKBcUgIdX ,-*K倥rrnUZֵCֳʉ'M9zČIv$U'5$J:t1IٓՓN>5O>ѐM1ܟBl:pjԳO|rO^7ym?~=uk3JgT)ӺIs-L[if̛7Wfif9gZ2=C<㗧?3Wfnܖ3:s_潧gg'&g_Ncܛ3r.]˻w+n^{2L9sF4W;пp{ѐ"}8Y\\zP,/VJHՒ’Yee7ߛo~[ .h_"͢EY _r9쥁K++[*/C˜/XҸDYm~=`uammc6m9c7[lB [k^L|M{)%K/}=/|trBW]®]]wʪWڠ|Won>ZV}Zoo\7kkz4iz/5{{;d~︽ܻp[V^;6vBm7XqѪiնVַ^{Ww{݋^{r?o<(>?sOCP4 5 G㨇'#a?#Amt]D`L Óq o'z^q|S4>?gp> /ՄOgs[*__- #ŷT/W۱ ![DITDM? ҅$t#IL!=I/қ!}I?ҟ ɣ$&'"D.+S\%_kWk |G'$!?[grBNO~~#KŔPJJjWTC@ڕn;A#'E{>/Gt }Ct0 CP:atIGp:jij&jQ41t,G 4x@-J'DD'ɰ4NSt컐Jg4:Y4}>E3ዩ-8}5&t|AߜNgh>C4\jy4PIBZDEԍ6ZJh9G[X%h/|pz  ">GХ. >OtH7t }n/m% %@++t'Et7}j{i-}#Gߢm@Hh3mQ9Zm9i*Ȗv9U6*cr&U+U$pts]?G*rlе2W" c+UY8Z$@H-rkUYv*-RvL$ #?Q?_j&渊lNL@bGۀms GT(̵+"Q%qM\$Id$.C$iq ofr'A4svg͙Q&rJBh;+(%DHBL;)he)i+v]vjqS3_5+Ow˔2g]VTh++)I2%uո;1i nLZ$`zJ:NhJ;1TRlHKِΐL\2 I2(f|EeFguT3ЗI4`f:gu/+3$]?C]rVQr(NK;C[ѭjcR769E*]SJ m%RՑLd@MI'F_4N&?[a0E飤xN~n[qĜhsRr͵ebUf ]XE*밻%-,.Y?Uj/;lKq#-xLPbfJx3Se)E|R7TB6D *#d@Ejl+.Aee$; fDd2AE6j+Sq)4ġa$+xI5 /ˤ㾦bBl/dCuE>SFk/,x_B8@RQ%֙bRw\>]R0et RЉb'p1kXw>q>$)?(2bc1ҩgH!7Z:VtrN/:Fe9gsWC\e4?A>Etro:7ܛ^XEe9rzgssssl#Bƈ1x-"d#Rƈ1"eH#RK))cDFY*(0-r ,I$be1=Mr&gܳY,k12Y0f,ce %cDQ2F%cDQ2FI ܛ7*\wTa>,ևtZNGJH/6t:+JZF5kQƖ}B)oQii4rygPF iǥuqyDM\::u]u_8G&.ar&.arf.)fii2s;qqqqVߜ!Q('XDql |>&2Dq Q\(.C!ί]"c?u\XnX.w,Ǐ?rX8>vq?q88~Ǐq?q89~?.t GE@&.r. l MYl/KI!nX2KѨer.JF)H{I)`+H#@SZĤ|I@ܗהN~@B/,GkLa^D* PQKE.y&βBER?It)+n,5$9xeCX$KX>0IXe$F%0Ԍc Յ݇aW3\Б#h@|Ny7C9l[;5EkY/P/sr'd\9\˗˯KroDcv&T׍ Bn9??O!Aζ__?"\"[PPByb=Z2R w]|tJ`_K;A2 (i HRR(ϝ ,cN^paLPGi_܋q޶I}@Rp`qQWFÎa%GZu]F~>W␌Qk dz\'gK8kSg@','#8qY$H>0A`uRiIR?kpD'ܼgl.%U$̸&::G[GG%ͼ2SGߩ|w9<*+A앂NbgsYS:J߶LHF/Tߑ6OKOɿ+@˜Mb/^rzhc[7@LLVcDA_gd`=U ^l=?<;87<9?8xp$¦@iI??7EL>6Ҏ( 0j^WAM`*|O:eI9.]Y1icJ*s~0`z_̐Q?2wlŶ8mKVycɯ77ۉjViP!`J!?纔TT+SìʮRo$5*.دzy-ekՎ .MN%.V-ѿ Ts M<4qq)eVfI`;{YMtaMjЈqQS9^\}08^Iie}ne+s/eeQYrf"35h!C *T65z%'~͞-)-8\źDgȏIm W\[ 1Go @_V-!\9пy33Xso63;s W3,IS39]Νaa֛1#^~P*tM<1<$J(KS)tcȹ^zr~ʟAH:N-i2,ʭAeTnn1"ʃғ/&6'|6g EiLTABgV937r9J)Le9sjN?Z!e9ј2ܘK~Vݪ(@E}<9mmeĢ OJUe[|*D>Cхp2 }B B=iUB5j>J*%"> -M$?=sIrNQ"Un'y>0V&=毩 vS-@N $~".h@(? %h$@\ +Q@F@7 kVFBD\%^hH $fu5Y90V Q z2V. 'OJggmpNgUfu\%kdKU.=#.GFygv('1=C|A7E`ЮtPiF7^oV[kMwa:DP͇ϔ#f 7oiPU1B </֕ŕc %znWs:B)?@Z՜ؐ{A4"a"rn[AULS ݓaL[ Hyp`Um(T`U&6Fј9;;/&C[:byn*IG?vQBv:+@GߎrT݆'^cooq_,za7غҖ>ZZ7:d4tQ00D'[@9Dߌih,;M )?T}rgU rTEr:Rg@E./Bdظơf:&5\V3Jw 15H1_J"CV0tWgLU41.ĦUVnmPrC3/0Ί ߖcU[{(HNxgݩiDJ ֛ zB3Sub:y@3DL?9G!RMzDmmq1\KO(胸>Bl|lP0;o?ڮ Ggh􊵷?Ψ*u>c}9m -ĉP)%Ĵ340M̴+i(zDnU+ dzםkdFud*5?+#>TzƓ{'&G!6j>YR)URŕI͗W~nRJfّ-K-A:Xs@ ojt(vaqӋ4KQƈLBOO\y|A/h֫]jcn- 'hDK{C'r.3@6k)!`sahd)#sg)׿D>Bobg1>zǵ|u͞ [?b W5T5Vllg}. E=>b_ ܷz?'t>\N~dbFН<b1(x7ιoRG Da~gXOl UɖLT#.#`E#Y7^= [oگE.)1@^*El;`$7S@YN^ W& ۋuvąvDzR0oNB/2JVt!zcFYB=>r<5*02\6d! lַLn{><pmgL 4(\TT HD|$$|54ΐ<&]aԳPTP-] UZכ삖Cqf=LT鵗Dڣ~u*iOZso4QPŕYVq04B jyBQK4`O3NzmBfی:],SX[]٘8sb$.$p/JX)OC1VM φ.B_~fU_A?xN/xodmÕS3dzg5?YL_^w._*ot~"oQO R 7ͱH%UJb@T ~BkF5HFqQQ4ճ;{ , dLRx6I/wI DG| VnIV!Z1ܲ<02Dlmbnɵ=2X5^== >5Ͻz#.^ +}a`0J-%-+7T@ O9 nM@Cq멂$[Gw; G;B!~N?NѩNʑ ct?Wݗ ̳Rڂ#Tq^+Jp5BewI($ZY`"S6FK0K$!,OUƈt3(Za.4ڦ. w\3x榰k3z@}kdkZU晴 μ8T+F/q!v/,ioTkױ/ET{ط`Tgn.Y,4i+B6ʼn txzl5qgˏfhҫ5+47_qhu3)X^Gq)5>JҖ:Ж@eM/d|8/5Ι7ЙV3F^9pYpM:Av Ww@s$I˼7ybӜgqRpD焌t)'χh!~^<]-Jٶzդk L!@/\\6Din?e!,DX=I3/rσ;F>&zpnz:ߖLe/ xMdq4y.tHU]~jhR)t%FLU shY_\};Vmd>=0֊׌9_C_wS^=@>?>Aplˌݶ؀ޅlֿf QydQ)oF`USZ~*=\D MgXoPޘA3ykhL\lXoUV1ܲ;6)D PU]k\EjlGZ"+zZ7hsg{s2^j2.шNYm(Rj7ߊT(tQy!q.kJ/ފRQ}7ʴ] E,K8?F.]ȄB\<±,,V_A|žAʢ 1KGֵu{U %@΂3RE},`(EnbرJ*eU@ &wtZBZD)N4]Hj9f^ %_rͺ3AˑrN0G,]t3/m ݖ$,Qj406;Lz_ o@qJTL<540̟13 ;CB- :̈rv<{KwšqSݔjJ(7oeӃP%OM>ZtQ5852𮗴yZi6E+%;XU^>8+|IPITXyFӕE ߪzC#WiEe@ 2Р'$Wtk]ដ!cW=cV5hkM{{D.~VxfmM~˿av R0+}0S+LziAq+aVpxAȻ!JJ|7 ?G° C *h)n]MY~LUEP dBrBkO  6~zVUM ed}qoK]ɌHJ#;cۅ:!2+yaIh9}ۤEHhs ;o{a2}Hb@Z/7b=L) f+=㦧jhBΆsau^XK'KԂ 3|۾{ƾ՟F晒_9 M FVfmtc1PRSyYQ ˶a Ef#HҌHIj_k))$ 4I,evaȗV+=|K )0FldH*r߇8q]s`ԣϫ.~.OY|j[č~liՄ; <Ɍz-{h7(93ټ0%><+s#JDBYH"~kͥ3HCim-FrW_O2O8E`]<*E/f\w ԇG[`3 D.h@ՊFH a-^%|+0{цSb3̺}%53I$b)4:LW>=`/_^_ghQm]f;źv*hg_&{LyA@Ajbjnϵy {W'wE1FGh!ryYTA+pƨ 3qO᭎)ݪo+Y F~x= L3aT >KAo*Zs"K,^e3Ayx|嵷b΁@~}v]48Z " q,j~m q/d y+a6׿XB==Qx]19:%L8Y{# 4p5q+xyΩdr\l#sGmawzYFꉥ#Fj)4X&OgPGO7./;p  EO i[Af_iW"*jx Am  Mb/ϚR5$`"=sZyu.7R\F#c0RS#{ [kkpN\Ȳhc֖32}<^uz)$A"\ю_`hBGL1.$_̲+zܗPy}.&jq[D\TtE $f !E-ҭeIhwF~eVOҊ aVB#Ls0N{`^2K?K57?@HA PzM> {e  lq8{zyRNޏޕk7]l@Xy@gxSDZj^ޒZp{*E^)a!1z0qaXA0Vnˡ}ˮ"П!ND}M;7~P~+jb~ yd^O-u틈pŬIe~57s!$O-0(ml-6Sӭgv2\g}}<}Oʄ>wX.n# o58+rpmpJ篇ϲF ajx+ P\O4v qp[ϥM\-&b]K{n  3b,; bIܚdFNCEDJNzߦRuBV4!O+y}r  ? qkxQ"R@5BKŋNߦ_W#[l$es} y:v>nac7./`ti̚^2>Ӌ-ҙyTn|aU>JQx fe5vp`bkMC6_!ѫΝCf[7}u J.ӚLRŞ{LqDɔv}o>X 7^;lǸ_%;к*/3dMйq9yu7!= Yή[urw?7@6 9$-Q!qsT5] B_ SOH~YW5;5U>fLb`hu 5 ~4MM{eyI+{5M2 cÕ_˓.e)FI)L(D Q{1g%s]oPC(E53d3~^GK\Qk VUz]__5*NDe vj:Vɷ9HY)αE -bj7\T#h7&o}͉'[6f9%0XC9?z4Y9]S Ұu L. niym:dP&5=)x^K\"i/wJpD`FP>NM!ɹL-8+6sg.F sJ!j_{S-2ܵR^n1oR5Lۣv]ߤ@>v2}&rbOjԒ* I}"G$K  `Ae - (UND-@)d1q*3V#ԗKyj?eh01tq [no]xt܆5RR'+ b؋dmHӍ,i,ڜt,|:$gB~h5/uYHC:؋kt)Ti<}̬c*MW_qٿC+eE6#w6 cTbp}IįhY6uס&&ɢWQ bŰTCBra; M,e^xk9Lb0M'A$:DPdyi#ٳnM^"T.|,Lm#,^itTx󏊜f>ǧeV+:r:ݍZ[ 1g+\ډqy%ki,…!d`Uܥ3^ε(ViR6iЖЄ<̐nX3% 7 w M9"+Ыfh4|%~5ϗ! "U[n!+qX6ʏ܊W֞Dlt{9TSSChmԻ{עyѮϕ>\?UΗ',{@7FGH;5##Ai6' ̹ͽY7{6|^LC>P d!z?2ֻݖ0vsXĞ+9W3c;䢀^[u~@%&(%}g Z}iqBc3%)4lۓ2ӾTO|ۖk6[uA#phSVvLX#pJs ̎.?2.Lüc5Hg6bl1Fhci@Q˳ U3g5`w;} u- J ϼjVc(Tg^\D4Z߾.$D@ H?23M092+̦?&; Pŀo?r&3lX]?͘Cvch/jb]Ɵ1߽Q3z(-v'$*0*:*Z\Up+ zZ45ېJ6++ }2^\'Zi4Ҍ`rZB,XhK|Jap1ZAFNk_1/ib}}*N\JuܶpV &L 6W]d"uqYwԇj> }cMpkvOf ,RMWC"׿Er1..pVoӴQrx~*3OD2=tQT*rZR%KE;Wy (6!7Or"\)R,nV=߻/y}a3`H챠a+vLH2֪ s?KWfP-,C4nWlU*N9:EpZ:g}swo +1nn^8c>Mlu! -qpaƥo3?S5 5&hK0NfM#.$\*$weYO݁9hQ6-{]| g+P vvO`He`}AN<$))>9 +m{ߡ xa_Awٕ7%x?%>M{vfYFZu9kU[t TgJFtAG ?ND߸hw}E^PccZvYcХe[6>_DMՑ6[QRdzlo5aMmPjW1;G 򕬦B4gL̅m7!wkI` }ܾ؋Es# 8C0Ǥ%CAhӈ)vQ0ꂯ@18Ayʒn/K@U .iШk1)(enhu::xitY:ͥcyҾK&i#Yo4MKO"75%3,NaFziu3sMXN渎≼^ C{cNَɲN'i n",%=y4-X*nFs/H͹# Z [>:ԅfK5g8o¬3:ttEdمځn)MCw|xx8}Qs&icǰDf|V:)n{PTR[Pd!G&:ysR\ cS>'".NrUq-AgfU|Fg @d2 {iLH G;V&õ~˾ć^hԄe'_}|amOKO"o7%3 vIȳЀ,BhV-W;{-6}Zz= jÅޱ5JOrcg!XVS"-}<BT>B`ɴ<,ZvZ Eg`ޙdZT3g)6y}ʒּ[^3Z߾z.k#)yֿ}w1]#~`œ~cVK귂ԲUD/Gy~BqtS17sE:g5f«3n;|סG#c1 Nў>h0rx V-ݯ3,ޥ˵E{釗JeXP&2 R zгG~(snFwtrr=JVRٌ yaM(`qHz"V?ׯfUVA+w=?Ǟ{˭WM;uąu#/?t&>J|fhV.zܮ8CoopTmaW{W/| cxu\߾hAj{^x#ݙhI/%3G/ h7 $Z8Rna5A0Z@`|}0ڇj=@e`R>]8"F+:Ln="([cfSQ1?-#Kt3?[}]9"30{H@Ιan_lJ&״5mEhQpOa̺#ZYW!plQZ9Л8Xةx^vx+?^ﴫ˻~Twzۖm)Fh>u1]X:C92NK/%cŬu`]Ҿ"HMlw|?2&U8Pz[ڔ U2/X;W35GQ۳*,y3yf?%z䎚N+^p#iLxk׃ŋk/Z~vHmg9Y;!b'簚zܫt.  7s0ɭ%XVjk<y0E3x})9bF|3Zy_:sx߭hngwZŽm"cӰ;; %O ~a8?Q}cv.:JR 'p? %3W%7 Y>?+}V=t(xtAӟ$ş1%so $a,o'rpje|y BjPJ tN}/lw/N6R}ϲڴ ڇnX}#ˋ0b*jXB#"tU~0lhNt"6+/x5spwzN܆V̬=)ˊ;Y[C %XL+k2y^ ,DKK;{Ӗh.gM\$F)c٨OldFAat}xoht;:. fW0I=?17u\dro:?g8&x l>vH'Nz7ۧ%pɍ; |[4o~: "Nm*Thdʪ3uΈKSMVsY.:wKW~(5FM6L޵s ɉJEKV^4˵+ ˖9^־J9sX?s XpǘN?AU8EH9 Ἱ\~NRĂ4Zlo…n6f%{oxyoXf4v>M ~OdusX9oYemo5NY'z0 N7 (\S,eW-itf`a<4QY$l\HbL*\<W%lpي'/qXyA],׵xqK.I$jV. I tPԕJ vWP/A@`ߖKMl2.T_ЩGN ח"zk?4f -ߐR:Gg_T>w 0?" צ k|%[bEd$]H9%˦UȒ  V7lrRVȪM_?gZrA Jʙ/ FPSgJ{S"JzT8}ܻGޯJw2zq`/УGH[PUhS u=rhWE?6o e3sI"{h`}gtduwuj?$ũ8!e+0+ @W)siCQ bwdc0x՚C/5yS/5ʛ^ͽ[9Nۊ[A_q+nfszDSٙ{S7\49V%΍1?,)6ş9U`%$^??'޾'hx{/蟴{y&p Tb'kK^vpҎ5)T~cT5ZQzD6YAa,}XSDPf 'am /N}J1 !Eŀ"b=شU҇鵱uhz%\>Z]X&ѪW4a*-X{㴧f ^S3W3 |D=_ԔsuiV ˤ5K0ׁ]F3K)+N-kc.2}"˻# t/O6fԕ#[4e [3D{z#|oZc(KlL#?{2[OK`&*x O:.YQ;#د~|WDvP;=cԃe," \2w Ý=w62ܸps#9Rbj5)n=G or(ȑ $իVs[ue7Z<4/{3k |E?swI2LBHB!܄;"Q!""",""dDEEYPVYt.*WOUw$߿O:3=z~6qF(gH絊dL G5fƤ2>< ETXb@I{=rKyKTUlX}N UŏQ0'\ ´CkwЖUtA?9Jj +桲O'~*&[l~Zhe@u0 m~x?C%酟xA6Cbg*Y? WLEϗ_\ÞEaOPl'J\cbjdˋ v_t0\px؇i(Q@9q:Nгk"Y }M|At)'HnN 1Xeآ6L3@6ZgZIQq8 ]ґ =/Ckj[ng~n*v]pMr/oAB"ط] _3Nܺv$|V泿wU7B Ǭg/~2 jqfW88iZ߆KRSxDp2j\sSAbH$Er9.|V# }?V\gCݳE+5#O1vj7RGz/7҄DkjCI:J\CNT e;Q+KF_Z+]$s2KߗQ|c9fP y"@lV<'-'*4OB$P8,(O̫X_.T#8&圠7C Frg/jd^ZoqDbɄ j-J %N+-Z8 Q ",;a0 šɚ Y)]JᐥkU"NJjlP%#ҁhaJq{ʄ&ȏ*oE-pe%7BvE2KVu<R6G-P  z#(q#Ap˙.{)KʏFTL3$γeJ&͔L κ#'~'B/ p{2rڕqQ9 *ۋ@[|"lD 5_Q d!z.D(3Kx9~ .{|Tvǜe|;nc(՘qţ )nO1mQEdM}!2ל(ps!z@(Bg'g8^1hM>V#A * ZvZ[d֫u!bat@ٜn83k5Df)3#2*ŚylwiE9s5wʴk~H{1晀 bۊ2ڐ;͙W#>}ʱ7_䑂ҹ@0aYZCΊ谷IS, N0:Xr,SŊ"]bA,bA:BetXp?z^<y6 ^A͛67q({覊*EssBbNi7LƗ4znƻίy|_8 b Rc1Br?HgR+8gig>)^NC[O'ĹijBh>Q!e`NL{. $+pRUFlQ/DƐN{>rN{f'[ι%6HD ST%WYRU.hѱjG諮˪^u6޷WMhѸ'\7}38vrJdx?L0Wso՗ Ng=roNi;]'p)쳭?NW1hQJbLz剫m9ڔ^<퇷LJ}hliCK?0={fN n^43S=vo\'7`WYr1#O"H SH-jF*&HQ6 ,<9ռ*|jT,%%(M<ˇyh|Kk 6+KS ģ:9I3F<+]RZF#'l~y9S`s7=tSootF ~wVLi4 tmoxznٝC׽zu<5ATGP.\,Fmj ,:]恝(8%^2\0HqGabydr!>ڶV)0%ΈŜnĪa׵@?MO:{K"DuV "] 0;&CfHZsRjk_34ǂWٷhﻨh޸{G|uhffyQd}xә_g߾ϢZ\7d4Ku/2o5L▩?+2.ʫ (dRϬ$tfdd^mQ>ywMxe%i5o͇ܴ`t ([GT ~lڈ'=pGөz-nGKK$;K ¹vsɜs2I2'a.'̺d7aLrkFzm5%6/D`C}5Њ;JU^1N;?mtrR['\ OLf=i pQ}3mQh#2%"><{vh>S^p5BC#J`;_Z!4)v&Av9zN1 N!"iBQ?L'mlemW;\cN&'7T( {Z*uq(,p䑘N=dC d_w|9u9eSڧf\2uׇ>finșNyOs.I5+S(3qr]2T(7묢AV#k_42>܆ƻ&a~눞7ݏACv~UyuJ,9(5CUԶv6rP]X 1f,xV=j~Zt;ħ9/G?rx{PtODۏJ60u3?@s/8&I\`݋.=¹qiY6gU;iJ8aD6@z杽fz8 ZK܎:^ԅbrwUY.d͕dx0]9u OƍFY(֋I#&Ű1*UͅsPqIîlBN9ٻM =j @phcD6Q7u(0 KD"ĩ t7-&JiJ-3@YB 1WTj6Pۨݶ=RQy@?q@D9/M;j^.͓ 9AAOϺ\~Ao0*eM]0ȇi|/}ڶ -F hE/޶{QKnB[6ܿx?{Q%'|f]֥D9Sq&(=US}\'(1e6#DN-.:q\3˥ dڊ՜-ks(R[0RDg2VtM`Y#ɖu1KTaH6|d+h \sY]gL1i|lpxY?Ẑ2qvcw4*aBG";B`n=}N cѝ[tС#e˻?E?U_ӛdڸAw\i:!v^r.?~?~Xv%?|4!Tմ퇗9NU,mk3YMv#(%8TΌؙaM qH-v8|5r:p~#^N]fNШ xu[wӑ{WPGv%" osv<<)$kd/{b`OoG3Ȳc9ѷD";#424+q"r੄E6h6fkzl132is+ tscg~iva W u7ݟMwAKnm6{>S'k1f?MIvٞc&6jBsQA7횊ZE=3Kذy8eZSsB*ˢ#G!j"VZ9u|=J6!WYTeh@gQ,M9}4F U/ML4(ǜu )mwTLu 5Z-Ngn|p4 K}qPЫ>FWBdԐ`DkQQRJ>ㆼ `#9i;Z4.ёPWuyy ˬ`QїB7r>F? #kZ Dɴ62շ}N?#>˃b)xS8h e +3O6Iel ><"a+Y`Qu3%>cZ'tfYȝ8ᾟpB M_tكvEc&wH3ƫԀ#̰-aJbdn~"Zׄ݊^+ K/;|Y7/+M-N+p{X7ft:<Μ&E XɊI!lf$4Cv kZU.bω̴5367I Jib)JO Uv_= ,N=.hڋ@FA+N]|0X\ T5u9cdpz9dP2|,.9tqJi6#] q=ѾfMF,a#/LbCQ$g!IWrLUj$^SsY@'B~=_ϧnTH6$ F~Gb$É2DY{!:r3~2T`1%n{87tx4ja{ 3%X`D{i (hXMbB;k\"R4yה(ѣ.u1hxb۽w_dD׈o..^b RɸqWL6 5b$MfZY̌.B*g6eOti@ WrSynd6s}`Plyt *IP g*ĥҼee;Bk@-ۘц$#j>ϓ\@ v( Er5P(8U6y*p q=6(6.+G XLV@tMgK_UGl R7iķ %G&֦X*pblFK>+RvOB_Ҭ˶>x4u,T_ ` _0QrTO$ik$Eȋ${~~߳hLaI ~?zb`0zAl;ѽϱ89bDvœ,R=NL#M̷t)VYگͷ!@Fn ~ ^1 t/+:H͑+5Ttwf^n֨g#ZD!徆lώ{a?gT܁s# }r*;`\Q7_7s%,EAKN#h5OH;-q9?HextBVVONNvAkGXVoJY>+Or+yJu5ɲǑW?ij0ӇO_@%^8|{S~jy,o5-̜W߯Oow.٬g-6|\k QN):jtlBL(2iREbBeA+~(PlLpceKOB*ydyV D0gue3n{lKf[9o7&xW?ؘM_8*+1{j`Ru ^2QFb@imʀ団Zt@ixX56 d)Bj mn6yh5x ptIik^5fn^/PpYc]Fٛ^>|%wLD'MtR 9+yba8)BX7݉5bn^*ߙaBrg7 c%Z݃qYK@х򸉅&7hA_~RuUak+&j"dmN c\~/4ʺ(rWF6Vf!ɋr[4S=5FZ1YEPC3LJdGWNf)hՈ6J3X1jYmmC>m*OTػKwA3OM|~]:q/yF->{f:XSؾJ';P]EiBU[iV/5d"[ihfsd_B~mxڰ`C/=Hշܰ?w//ޯ87fݼUJ~Z3SwA5c>52Fč?-N 6->5%Sq$Rr={2U+A/1؏\܍@LJsĹ,4xJNu\AQ6D5>Et*J%$RK4Aa"dF!%&YF;%  УU*O 2&MC請[žH\@θtLY Es{9O>%SꢇVJ ِ )91- eL9!{>eg!CWp_&ASB;GPDm2H-n_5M_ɽ3k3r׉}_}KQ=ȸ$SO 1MF@iX[B]?)@"/ O)$¾SQ:5YrV"%4ʭlQ6 F\UiKL9b)S#xE*rӓ)[ P2mҬv A2 ƞ\ayRAasP5l D|r_p}׌Dǯf(̈́uٿKc7oTڏ7fm O{V:/>"qpmQsDEI2z o"%#HŨ{q%1Ylh^%IteH;imEMpRtiU{W▉r*1!f{zк>CrD^iVD`)UP u_Hd!yR_X-e#O@fQIOkKJt*ܽuFO zK^d/(2W~f2,96:[ؠ,?効lc>*9yLgMS o&(4_ 30&ٳ&yrD6eSrXdЍb:'#~>:|qӧOoAeY : QSEYr'Ɣ';(A`=ENc҃n $-vSTuۣy0ߒ}ME]]TFܤ2ud$7`p!:+@Od@{ql[gwP~',%6es#.$>VaEL٩ضiUAI m|Il,~j?^]򣯩_Ygx,p)pƒ)9ޓ#1|GI?Iqm=k,h,g^ӪDS"sU.œĄvp趃emGhl+ы a; (*7›̏Y>urF_Y|j|bgZ^F2Lv˞'%Y~mK$'wd Cn&3zb}+)uǠ; G " \fƑ#2^ެչY@QC 6jɈă- #1e6vbE_1 $wD.iu$l;GHSG<`1.[c;GQw=v$HGJر ckj-bw/DJ9;J|y8eX1;@ YQko?^G$$IRYg5>i |u9Tz?s`dgo wWho2?If>Y-9gvhmNxaҿk}c}ƭEsC~V~_yrv0ͳ/e' V\)q\I{ޑ26֗hvQl-q1[P01?ck_{@>:.wL[ԯSv!NV򀌪ޘ*$g}*#Ҧ%$ ߐ#Г$eP4<J}N}͑SD PAUnN04୊ug.y+<FI (Y΢0L~(03$cEPWw _*_Jxɮ{}n7IOB,D[6/˦u+vȆ="55Щ%_2 Ja˥Gxz2, 9g~ZMh.*GQdjZfg@2dx9iFH\io/OլZ4xӲW?ѺtTU¤f?̷ mr>(/΃5U˖ʎ)PTs$ߚOJU||~E>yO,a2ڝd1#+)2EoA7_\X>OBtCgMqwxf}_;0{iAb]ˈ] ^(εKF{h.AU"D,czvkirjUڑȈ¢& C1c**iM:.(T/мʖoVKQ@#L鮅r]YY^%W,/59,aO#XѾlnMNxf,̙|lu:h[?Iu.pBu%uaÕo'P |(&tpBYg"JK'>yhK@RkNeV󨂥eڊ!Z:X^~CLX/q=q:K9VNG2el2;8E38, pPD2Cq)na2{gǭrr2JGM{6~-&毉(@DT $䩘rw>sF:Gi?얱5܍.^fϘ=އƒzip5zG ~ IZ=Yde4✙T8rg[4,5[N RS73 k=pҊJ6;K ;ɟvWvR. m*u&-Ot2:S#`ܺ7l<$VJ=4g,l k mUH!戠#0k|>K7WYy?9:YZể$34M)zQ5t"x@(ɀi2AYRDSDq2arQ$'ǡLNe.Mi]?um,wU7B;n}8W">gFX St#Pn ֐oB0 I☔"(' R ECf&Ww`(&.RH-f0џDq sm%7{2١Bt-2i!\QPk4碦tJ04/ -Ml؞l"`{t-ȿ{[_nY6h1+̶W=Cwu5`ܵɸbm;h s{_=ӚQ=X*ʚ}aoGDBC0jԴ}uݝ [#% r $**vMw@@*0wY"˾dQ.L˂ٗ\)Iѧh^){d$(Z^o<|j.cDJ 9+Ed*zv y\7g؆vfmk6LB]˵]u Z5yU~ޱaLدw9i؝ċaW Oaߑ(>Q~7ƶ!fB>bHҤ^!J3d6#HTFMK%P{,8$F$%{L^KR,XLcr,XɱXci0"erj_S /%ࢺ|Z2tАaJoEe͜:sܓO*5$a6P]RJ{ENYECvB‘BeTV5Xu]Jz58u)2~=xڬs)/8D=YuJ.5(Em|SVɺ &5A sz3}!:K,8!b^ػPU;:L$nv>hnJ1ZsB|ϓBԏQ}\_4ݨz"S8ʰ}./SVy(N""X IN_EJYO$1 VeM֎}6ODEl1SF^%5E}aT'eϫy=NK Y YP> 4]Ջ_2ݣF uGn =G}յ[ß-nU:ӧ iG~pTY'㜓+&sK0AKJx thL<ZLv "[Deo4~ai% P8(PsH2d1sR_?Ե} Nt8,{Q2GMC:4pZE@ ]|95E=|/x. XąÔ"9-ĨQ%TȠ_0ZiiQO[QD7sA+_{l %S Fwc1`C 7sCGKb c:($kbVh9@jU1fZq.|iguIl+#{8u i[kP-2RcCRRR0ʬ)6OP.1Qg}0qE#fcl%qǯ_g33??ϟ4oy z9cLaq5=?{4Ќ_كrѡh{JbCCO*\frKBe ;ԣ4#N\/b,F e:ҡH``3d޻y/!~m*O ^l{Yɻ:6`y?{`%[f]bb3lqQcQJXj5Lz-,V5T[p7Z挥#+i왹ܫM>Yf#}a Ea/Ioxg~7Ǡwyra}Uӻfؼ=s}{µM3w1jtg#z~PtէjAib=O9替P |r4]}0 #k`kMxofFzH5{/^b]-ZAZá  gمΎ2K:6vT4_yܺd쀿%+MSQ<"KOfM/.M-=VǤdi@ELJ HeVOv&Ld4^q(TfBafnFI}Oa6h!ykR+T ?$ϋV=x-oѯ}CA3v?1/Q=e=PzPgX zav<q+\QRmhxj~[9,2u|'G+ƽ>w{_IB>sJd3._T9*T|T|S1/]Kv!`ջ(s >_ A mCD\(֒qEQ 1E3Yt1D^rPD3\L \[OP^ ϽFXv+ā (R4[@N5 otnƔPLOݛF'lvc65d# vcl(2|c:c#f §'Wq r;={=~|-2ܞ2q90'm mޡu/SXvC\uG!6yZUSUoHoйs 7a:0czcIqa66̜>^ ʯ.ZΜةSQPm~sxxqQ{p3:uЙcyf(̜ڕ糸HE0ZP*-Rf5J|x,wh/2YPK.ЭPjk`Av=ҍB=.]+<" j࠮aoR S[!QA< UPtrwDLxwɶdm6 ocoR*wOm {6|I|fLQ 80e2½;B-}vBk~7g2B_W^.a zuf9+ 1 0HlhA3u)R4Ʃ^@ZN s9bեW]+ ' {QPl2lDY#'2!%FTD4Kttkm@e] d +DdvLɍww+G%21\5 }\ #k R:#Eh.vnH;H;+$sumA'BW2*Uǫ5j/0*eUJ-XQSr¨-jWa@aeT.I=ȉל3Sn [_9ޮăh]gTKUc&u#ui+A]]7dU <.%O0L)WMq|iVE~+jWMNHVoh_fj4VFT5M{=Z>o'% $d3b:Ҹ|$0֡QV0-Q(YJC6[&>#bj4=\ۺu6Gy䚽d! A|-@UH645F)Urq˗hb,Pi`g5Ry]R ~Ɍ榭~hs`>ī/y/?x; M#g 9~S:s9.5qbQZKP#JզO$^ "{0ZCB ,LNY /X$8PI<`M2/bA @kK1P WoHt) %ǑUR+憠nb|t ? S1ވ;Q' 80nqq8|vYʣOE=ƲU/ R cȹs2Ž)G[GxFH&&|W]Y?瓭@E˙pkA;L,.2( $64< ~W2NcdoL׍g'{s隧]w\KO^)Cb>Gc$K2dQ1u;hҙhҍJwX%j[SDD6M& W7IQLAvC0b=tbx[QWIFSk~=%ȉ<9vt0P'N8/?{7#KO^N3^Jqq=wqoKvG w#{2LE.>1D@Þ(j;}yeQ+Y}AoҨ.# HDG0(lAg@29?9[mo?V>uR4c`^uW oF <:Ԏnʀn(~^>qU >("IxN>8" q2&6fB,+)8cRHTE-:\ [S;迶JyI ~l),͂dS cjDV(H?`K8Ni YAO"Ms`A`‹AF%~a"tZ0(XL\@ζ"*Bke2%9x1[L<׵J^1jx 6\`s/%Vi/ zI]rGރ>A~aB,΢9p.\xA,H3&N }MFLimtU!Gԍ xe;-#QA (QJdnlq 5#3 eʶ((|E?~،gex $'|$ɹa\w ˝0DkYRsnUupyoߛg}sO:,߯ yZy H]xGgSmE gk M9 G-3)Rl*spEU?^y\yZ*05̉B3X.lkxay3&aDc\s&`c;8cwY7A *.rrS`ʻ]<{v/`SsW",6oUҲxxL=;{b>)baĽp_<*DJVU̪(41 d9[˰0WR/Z9sR"<V'd&ٚ)gJaK"mp1U0E8Z_ҷa܊M -_?lFA~⺉ _}rV_GjIiwHׅsn(=kEOcQo_-Ua]:+::Ć.lhw62x8%mQ͊uN2>9Vpv"&he"V[2nf5/3vN(Y9 =Lv $Sv)TS\ QH<~kЗ];1C w+⃢-@qf*̫3^wOMN˞q)5B_zWd]S`^i[  M0|- f(o THCWFab^%ap qdRcfܵ׋A~1q{&*v])}߮idž!ӕO4ʝHCl_T"JNP*Ag>)X7MIVrދ8e8 +gj=ȃ7˪ysZT ! 5AS_ö:ҐSI/T30IeLC@^}xed>րm՟L@dH#gDZD@E 0pvRi_2&H@iiMпrxi~qu4ٖ,ȼWܤj򓶓f\T{ S)m_ø . 񟓚BBg!Dn`MڸǓp"솸(? &*.#Tw6@.Wuvc7,p<}̣fWtq$6"y̥Vn ~aG\ç۫8<}n94XN0׮;c,>wge]{EW@7_hOvDZ=o>Yjs_WZ-VMe`LhMaHMycjdypچQ4i闖\79H򒧌Vx}$!ewKY1-*ZKdZbx/z`v#țLTwb<ғ11DHi5r0'}7h&}f~w~`kgaҪyI >XOCUlZA'nLf&f&LS>;|ٶrEf򹉐a" |#0ː`,Ywh.î}EʩvزM91XSarn79EB*&" GK!aS?fxd\Jkyԛn'KG! mZ w5z sA>OI9VdYԁ uP-HOj*\gGU>]/&HZIOFWXzSZבJBy=_;{yOo}xjƘ|b꨾tgq3}27KrM*(AonfU@1 *)ݹD.k,-y.y(% ESB1偘tz`PJ-9 _P>w?גdknPkD7 ~CoL{9>&{&5k߫ҭ#KV;R{o=+bG<- )C%gZgZ)&ﶒL x>_{`Tۧd&W * 1ARL\%' ωb_+yIH*!)d%4QM;2A޹W>xi[{U6Uҗ渲yzJdA+YJp*5Q& g99+|[@wje &"`k9 X %=6% S'|Jʯ'ϐ1J-+Yq˷6kPjb'PWw_Yǩ>!%uUd-nG['c7) z5BT>?Rd~-W@c(2Zm&OˡhxpAm }d6D&vԜK^r̎ ]5|S?DPH^rF}Dӹ)2ϗQhhzzV)B& ]E$=: K!Yo)BGz'1-@cy𿙏w86_Eq0~~:p/GJ>n qD8B>NEW8@bqpCJUM(%T|o+Mȡt=o-F[4  z@RvgxA>vje&F 31CgOm6Uq{(l v#m_tM/f%#3]':IOѐ63t PVgwPMIiOoDOr %^OMyf- a^5=#b+gڳJ}v0PݔZ ͍ʱcSf!ݛo)=+SA4 9t'Kϣ6$x#b}LDlO2`|~UڄFaJ.3 qTw T> ~!1$ۼYn)lj,371)7RFkl"k`x4 .G rm#֯1~#'h{SօiIԘ3d@UP{{@<h~.+#]2JlvFf+Uk@:*mn jnSb#G>|s^XM$S̒/'p} CK lM s9I-6LhgYy878 V򇴹A[\Z̮\6٠Щٵ1[SxNMY\Jc#\k[m+'w/1[dvoA| }ߢ׉c_ڱ{ؙ~n 8LQ{*X]tR qmNz񤃟Aڰ8g,-{`0![wܹ,P*k cK=Rt1uc+{Iݷ q_!찵3# ngF$<4Kcd8)IX9dE|Gu~73Gq{5#՘fT\_AĎF5Icq>s* 6өz3/Q>}?hX/R=F>t6t|~Ah8?9ܷ>c#?mw:O^3 e\(3l0zn@*N6t~Rd벲#N@ܝ2eCi VAv#-#8z>gT$۽*W tԓ1὏hpǭ@PN(M |~# 7^sBgL7.>%lvme`:|!Ixxx߶0aIyG9ج,e{qkƴ&ѡuKBUUfK-}?r{lvGzZLw@&TJ >K ȃ˶5A \3@9 f0Y{8mJJ N2vɻwL4o}cCHT}őgafSҭ.Ӱ\/I`b9 !:jeсXTyAv`jIN/C՝ZSZRWuc:xx~gs[l"S:FlK\67V߰1g {Uzŗʼn>mmYݫɍJbik  $X@#&{s.NtR@+T)N@0AU0]į peF\| "!c?H0,ȿ MkffVա$_JGJ(/xlB\uGfo<_9c]A{`ldt4յ*K] \L*o?FRJe3AY\_?KDX靡ɡHj%&)l$:/4~ DS)Ϯ|}OEgϭ#/~Ku/rHPCJp˞hhv:DI Uň F\Jp5Qn-fO`q,]#GF0gZ0n4r%,Z 9zLIgnτw2~3kt %~ s#PsYbn2m1Sbn Ԗ;(i{D{/Mq*tRaeNImyvaOs[Am+LiyMdi퀭bD#ZĔ>a|c!pea#0h{R$ S z>#4)B0|@J6$i1tTqX/n1. 5tzBBϡyCovvQ.yrF=yq=zd\F}UR]T}U#)AL?եʷІG+swj:\(0gI?ŀ4ajB/f9d8RW(u$.Jئ$gEd.߭~ےrczF\$_7J]E$yٸ~ے_T]}lR \QlKK=sSqa9`75^PjAoSwZw8S>O OhzOx\4c%m߄C_5݄CĔmzI>i"g*Oo3s6wDjxXmj3Q?{1S>Wi1MDy$(rQЯuP;h9-~)O_^g?^ݏR3Ɣ㸒N=f.5]s{*WkTB3G8^@8?rf1*0GIo"ϜVN~}IJCS%iSu?;R;Ǿ1jpʔ(;rtw|q^?􄅡Vâ 'd;~&f4\GU>1ɹwuftu}F+gI|&Gz^']ev#$샫x>4 +gVΎW@!CY*EJI֌C*?y:\AX/qug0*,4ڇ>4Y'׌^ۍvµyvU=tAX6E" IvHaL&<eA  n$aft>ɶL}TuPy?G1%bӳ- ^4{!"C<ם H`%S^۠|J8dI=߰׵IrX^#qGb2L KnJQ'i%ȏFO`:q!6t۫;*HMd/% 1 ZR2T'DzoR$TeN~Pٹ <UAd&/6jb0֧,༥ΙIM~98)~@j(]I|%0v0qs:Q-s2D/&⃢ [~S[-- >N}19IE:ap$i5w&Imuu{r]{w fq$$p {'%ln]%O"? P.ﮕ7Hg?[fwn@wo5?Ԕ4Fz+7иn[ üߒ[E{70^}rNeqt 79Gmpce ef_P[cFQSQ; "^Dq%%3)*dHlnXpfo`!Kޅ$9ror=-`eOY9k@vB3/*-J1lTq9V_b+xwuEN4M8tEaҘ/Yx~hҲ2rI%C ×ꍏꍏ A6Eڍ)OU0e@r&@ ٹR21~ M,5A>"ta|}4o}x_zC>ע]u9q V^V=tX+,ƈP;e;?VXw+fE t0bU@w*PUFzJU*dn> q 4bIt3 *à"6Cl.f0B:vHSNjsܯn|ҫ=kByHE Yq{fpScN:A7QlR4jb nX>s! g-@q[x!gƊmsFCnh }rIɄ}hqCy5PBab.TJ9VC (q%PQ(GjMdЩ69ZE#r H97j`CVL҆L CӬvqIXŠؚ&!\D.$+i/?~>_9{)i4'%E;55?_?o9 st?x@͕S!DSM_54ۺ@Ywe4l1gOV` 颻TtB'w+dPX^$@"?2J!0-y՞W\7KRmوB'{1"m e>| YqR%=H_Q>5k[l喉ь GcEqq \-~yE(]Бg諣,a ﱪEs#A>q6OԟxRqfqB-kŽ. sL<m5ؐA9"sۊ!9$t ;'Ńdd6UUr!ؑUɤE+%Ǧn1 =)_yu'%t#+s;^pY}g}tO4IZOS/0]J 'OYmQ}K/U`'t3G~@W*1q̖ZL ?<*P <Hԭ*WvA-QڥqLAݣކخ ~}M׷7OE襥ձ`}߉ޱz}µGiZ:  Ո-w~\WOݻw^wJx^t|mM9\+R&܃REbޕ ({Ft  }@'d~]xĶOp#Yr`\r䥬lS絮E)쑗ɬևꜟ7 ^w"5 Hئ3b" #_lӀ܌6Ibx@n dWy1@}ED3݉Iat;肿 7%Y˵l.!kXOU. EbA|<˨Mr?bP`RڷWK;:'Up|+c`,5 ÊsogzUsǪC(,.T.>pvSFط.yy笾yЍF еqVx2DLaxZ#l.smn4ҕen P ,eU^3/ W.:UxGȆ,e'9z/ oZjƈ^ٙ3 _s"@ek@1x"d_Exi,HT)E-Q$ Ked[a" *5{Jٕ p2gX!*2# o&ds.JGGNj'hk<4w| Y&9/%B*'*+a^sy-mͲ%AA-$!?I7jNmcB 1PdlPfaK<:}]N2l-oͺv{?;Ͽ7cpeU &v-VKQߕJ޳?R~A}vzeF!aGo2~Ѝ*\0#Ǩ`2VF?@Y\e4Uedp̩ػ :J8*J~K{1s00\Rw@xXyRcZbKoB݄0Rm8C$H2!1B} |=vUCٰ?g!O }q2s'k6_:BK8qao+^zy=8E)nwVػxHOP}U6!b1slYD΢Bі2\Lp"S''9ye/dx/g`+e}Edsuj{MNnڍ}g>*_?u3m;[zZo%?Kgم:rg} ڃ̭D?=c;`d Go&H5gӃ[zi&F*7K^\yaYv%yĎ?;N(_5=JXO5ʥ{}Cmt  %'Nϭ&||zq \ /i_hx bd(jz:ө}'r bM^C^Pzy??nm*גd{(LxEij[?u-RҌ%ƻdDZyLaoE2^AJwplBAk#rOݰQ/FN .5_}Z$7ݒ=t*3pm)ڣN{Ơ#Z3C]s<:vF~C.X 0rD]9`@X&~^>2r!i^}=KطvNV#谟<ޥ2yfG5\+7_osNeTA| tĹK#M<5p5+XC(1/3"-zL~~v|q[_^@Hn guza)΀ᙡ= jݵCy!?N.ֈ+E"n &:ubSVW,հAFDմaJ4>n1FJk?ͫL[ik3{Җn0@nWwnr7{7G,`sHjk7/jKxgWnă7~_K )H1\d`z(L-/5$jhI3z)bz*ch){cU1 PU7cRӬY+GY$ͲEߵlѢe+!N Oʷ7Tʐ:7|TB=b,~SF}?gvܪ تu'?OmݱQoj>+:bܷr GT4} `Q a)7GT@dzD;lXHx:'yK_ m>tg. $%L0,xY^T ҽ&hb}A'!zXSwoox];ӗbۈkOR4sEs0}JխRH|:@~}y .+J,H5(xOd)'vgz@)Z\ބ]/dlUFԦt| ^u$ p-+ p,w,h 2d!|x)IK":x5p0aSJ,梷~Ieނ7X'ceUME}qUE {G=x74ggVtP:5HI~p_| %f1KD#ߡ;$ɜQ^gzV7W.Zd|QƴI7um~&*n-=J|-c/o" 'GK'ܤC(*"' 13ǔ ފ4ӓ_A!6gm jq<lڀF.m( aw.aCDf"p&|A5q^,&TR`YuW*?ʯL*W^d{WG+;[:,)~{'jg9J !a!OAm#%gV]C0_ʑY/dٕܔ}] Q?@Y*dt4we)3 iX,%DB #yEAF|;҃.ťuUkr-Gș7C"5Cz;7/~UW~kp$.^DK&Z-Hs0+Azw2 C`njca|pA }x@:9P0U^F饫P+?_o\t{',Oo3Dcf?m2ڸ!Kߚ7;^S %NfHw`b& %A ~ @aévY}b8-vLﵧV"&+n.dM!٢qͪi] %rOȀb RH,_Pod7~'onWtCtT<0[- bIdZ'}s{΍h$I0-9;vi6k7f۫;Torς 3 כO?qfYEHDZ]"{Q 8#A0ʻH e7h:jjކT<"VB1w||ތW<죻\SwoeРAoi5Ok^2veJv̘T\dž'ַIgz4DƐŮcX ؗxc`d```5ݰ0+<f[ ?+ $ G xc`d`_rE002 xڭWH[W>yRRPDJi J: V)1DJD$D ""+!H(' RRHBqRw{/fAL9|w|;'^OTlTiާYK5"F+idъ1OƼ jʸM5Fta"^U+6X7j|H))-5&>PP;`MchOQT~Ql?@ALRB$]\o4!2)#^q1JOEZ6ROրC*z"}{b"b)b쩀hW"G#ʖ(Ɲg/f=`ހB'0u~QIV &uOT3~7VG=\j$x{px=37{fhtW\~s k{O!X'o 6%UGw]N?6f>8~5|PdE_'m9yLe/xK$:uL\ `S + 7XF*|}#안a -ᑽ'"r06ܡ:??VپW {}77QP+/8$1u*Α_qHn:Dpw%'>9 mkƙ ⃚%`ib\{V(~aGd_%*߯44Zu`4\vFb &*MU77+ͯ[C7 ANѾLdJE~\-ORT]&wJq68&mVt?lB`QcrV]AF?vmW|SVd-n((=[10:~ X"S"3߅,n˭tehM bWGs_)j۝ PjNct2!CyB3+ z~d,y\6 c@c,#57n_HWPw'3?Y7[B ]h/%(ce+VEm Щ|uXΛnap ɳ?aMg*AޱW8Ls,b0w ?m*L%USfQd7 |0.w [%л=*6d[,touqMO9WRm88&<<_goně%^Z۞q&J*KU1 _{KݶڊynN&4/!fXPl`zI`ffq Drf#E-ΎBGST0!hgs(*`NfqcTvɂcTg($+ h tk9DW VIM`BRy:q I#~#t#Mtu=sP*(>4*WX}ARw9jmVD+`q6׋ii CT6ظۤs9^ uA2i !Z$fNN饩)p)M5,dmX:VVSݵ=&-K:`o"KHR҆٤9 9rJaTA0%T65~#%O3]L*t//QlVpgԸ0KuMp9NN-<=ch5+ 0yhk 3_icֺ7f,kWԺ(Ċf}ybAPCc$ddvu'_S8% Qo-IvW##j=I%@=bbY5 kH9l`lN9d%_ ǦQ/ˍ@ N a ^!ER,+5k]f$ě}R~_lDӤvX=Q:pR};!&})qv9YR@xX`ά.P)k+c;/iJRC٪|memcm52f3&@m-W.Ǐ\jhcѩX|%7m!\4XҒ[烦b5 [FaK\a%DKTTqz]r-9^?_M%!%OwjFTG@љC ub޼br!B|8g?eln˾,VoxOPl1:ԺIB_o~'Wh* brJyW~ai~6emN]@,zTSTg)=uaV$ 9aIl0eNZ,kUu:mcN .  /UCC*WCpuSB2>e|.RecԓۆpVDhB`r馑{09bދ 1_7U7g:K)asZLK;N0RW#Šzj^'fi5nM~dmt:ENR n[U][0ꋭ&y=E8edCI||Lt Iz;*S ~Ti5n6u)ZO,lϚ'㑬^2D[Cd*"rnӌ7wPNp0s5h[IW+6-؊z +ѽt-5ATK{J /v~ uz+qFJ+xoFasNm;fdu/Ӥ[! 1f0!}Xý tDe<! @%#&@Ej!( " XEP(qIXED; ip>^GAz }g÷HTq,E6n>#\5x4Jyn}<ÿ}5׼K{6 ܕ?źf ae +ޥf  {Gߡ;anܡ= bc'&&ʓWa9ѴwI)8+hsO6c6ͯ6ߴ>Mvky8Q8U9:K=\$׊ޕлOf*~QلplW '9:_8)v_99bЎޛ 1{ASƜTȰFML%YDv9&?z ~<?7 ~\J ~lN ~| ~Lo(X8-r~ "~?oo{b=+DVxğVE<=V`22* r=IJY'&hMӯMѯy6_q.7IF\oP-빜߀Pͭ gX7aeŇ7a[D7l`#e5(hJ5J5p_pq5_5]k_`1Gh/8c}Q26Ts5CW(>Es2!Q4;hr*/>Ye lt>b3% ~Aʽ0G #*b7iOV?v{0lK}@[}x2 y!D4PbwBcq X478V|/l8zjAgPF?u yV<ΎxjjafrWCP)!8֓9!ȥ)82mk\ )40+:PxRVTX6HJST|3}ɘbTpZ9Z3 Sixm~)SaLKñd~C?hqsӮR;ֶ|,#%_ $4ZmhD;h5jhMdۮ |KgM Q(S(vk6 XV魙-Y0Ňu4`wY׳>MuZ򘌆UK-x t֦44!@KޑіW8d!aaeZ=ޜ8,ѤΤ*]֙;;Dz Z.V@5Q4C,(!hX&}}\s[٥IFL*~ϸn)*i7yR"4| #J;}%˕Ӵ O-|qjGjɼc h,/uzZ,hER+Kimef%H6mZ 2yE_䏐U3^ΠϔD6b73|O:*7t: x n{ݍ [qX:&Ӄx叆[5SqeT}l{Gƹ7S ^y?>ǯ|q$}{BtlRw6fg~8s0)HaFÒpl]R%.vK( <<ss"ViRݜi_Ke0o s-ekgWd}‚cJNo"=[F~Yj?7lYs$ӱ @F_QPie[ 5ݧ=R)hf}R4\I.^E͚͝ԗpHΖhI4Qy&p+Y3tc^>d7ڬSֻTcP]b Ȫg7U;͙-Q)Tm} H2­d&anztCIIP_b/ױCE%w}/Xh 45T%pukÖ:9.Y ꎊ""U# #uJ)n3SJ׵=ബkk)IVzV) m<1ލvKGڏLn7u[I-:uŠE>7Fw ms}yRҼsӌcM6e1یgM9bysT6;B bq_Yb8qH&B o0>]r*qXLK@,w|3D2#~W/g?Scovp+ՄyHfe=5L`\YrH] Lu_b4β`RK㘛AZTDNvYy?.OJ/?hB>D?D~LqR>&Y@"D~LY kZ HGKkCem>óp{9@7U){ YEmtjh&Sʖ;oN_E 'j列~&F{l +'?Bӱ4[dJC&{mYpugl 4Ě^FuPT"0]'O]k`Vc-?[rZƍՁxbW!-|X=:-;g/ #>[egPcOz@ÕYyd ffK]?qgENDGviv>)wSaR9=7] BYE#hRkOJJO8J^CI*aHu=# o wA!\5|MT ]X~7f}(e8δ ~W6;rR6#Q i$zMM?=%btKǹE}u hl Q~FBw鉇!W*I =We,R0HE 6}`HF_/YAw`LGw= ^fkFs`Day.SW-T]{sT#hh,PKέPK y.FGangular-1.3.9/docs/components/open-sans-fontface-1.0.4/fonts/ExtraBold/PKy.F]angular-1.3.9/docs/components/open-sans-fontface-1.0.4/fonts/ExtraBold/OpenSans-ExtraBold.eot̽yxTE7^u-tw ٺYB҄!C%l" ""*;*: ۴0n8(#8.BRy?n'D}/<[]ԩӾ9g)ê5E8 2b7 ۤߑ>AܢkOLןhvelK.eװjLg|ֈtVW\7XW{2NWGAgNBCԎOh֬/~ʰ^ϡcF_6[y|[9Ϸ`F_VZ̏Sg,v;Ra򥡔>^e?峮 %^[- Ɯj=,&պ> ܣ"gҰBf֗ aS}$gC?ׯs%9gyE}BO}RBj ;>ݮ̯RoPWkԵ:&uzAEݨnR7wg]ml+d_ٷ ;|P*skUb|R,Iݭ>FݣVݫN}L}\}wTIEzraa} ^xߴ6-{)ex< <)#{Q' sa,:`huPۣex.0z^52˽(6;׼YjW.R1,4 ~2V6A,B-\g7ٷ(!-%$pxeR|wYLSq~ |5?u-oQ2JrV媪:5zTْs)wd rByPP4+tIhpUաGC =SiP8/\YR|yr,xo&ZZi 0y%]u/kMm#께na9}s<9' 0PymNK1G01I9yͩQΉaNM---Z^n[i2eTKLqMl<1E\.eߚO4I4?ټ/{SN;>s*TT)ɯO~zɣ'4N;Ywrɡ'sIgMlglg?+,3'{#KKk=}џU!ISnf g~49qƒ y8q<٠,8 @pf:ά4̻(*p~+YOVzԳl f> e85l8FEAteAg'z65Il2T 6"c7 l#̶. ζ=cO߳'>3gO8;aOy{Q\u!\^y"v WϖWlBU[79` +@u:-`lnd]jRS{ٳ0漏PajL]d+Kvc[ئ`;~|['z>]'>1P&Ix?`tYpzfDE>e۪t5D]B]2|\]27=SO,ѵ.p$|m'LDǑuKq>dDycDg2 ąGp!g̒3ň.:ZI-#x 9ÝfaIZqxon/ѸZy /Ŭ[Y}jMsrM-kh3Ƶ|()#1]VVj+8P: ϸri=iI 3g] yZG$E].Z.g(WbcذbD+6l &5LȜdVNkˁoOoYLgX dtF1;]xg<͖\_fegMR=9t˂[VGR2nqxh<ÜkH\S,T QHcG^ҸaS(, #̋,P\߯5gZ_Vz3<vIOJsM?9B7|W?RooaqZɦ>sZ{Rߣr@z+ʈް-&F Z)ܯyn5w˰ſrΊOkĹa{%7\u_4b%?5i٨ͱ$zf[N4nP-u+N]nuH崁t,&np6f@UFF 3\U{u_;p::dWN~ttWB{ʊh -Fp[ RQXMӢ=*wE]>֊wPt>o/GW_J@湴ĩ)EH ;qz>N]{u*]vB|k[dyrLgs,NHNy@r2(Dw![V&s':ꍧ\.)P5 sy y>cdSG^G0'?jzcUF,/Jt@;3^]L#VჄe)ITSy ^5O?&/),,,((,*Qy3tp@Sw?yɬeKf͹pS~ӑ%56.ت+"˛:kX,Hp‹Or:2#Lk)5:`2I%BIeN^pŲ"&aB Weާ(*6)+Z` [H^WnȚE?\5?y_71&4\ "iI i2BܶᖛֈG!<'E8#..G )%xΟ?yМpl z[]*+ͷm$pM}-'s+{ ~ {x~G ["X&wZR-N^ZR'BX ^?"^'SC3űr_hZ)x٢qr"|, [:]zQ]);LItaC$Mbb#R̗[YeEqNbUŐ^ h6* @zKfm$ *N^6Z'uqbQƩʣC1bN`J{?pkYr>rhZR6V5\jeQS`Όy θz 3 I-_A;a0OR¼r|Uksu09h%!5&ǺlLBiXX2pD)/+"aWގU8E6o;Oa*|X/65+;t+1Z}8{IأFDKkG pa*=r8|Jk TxXd-ܣe{ר-J6ʽ(MǺƼjtL#rU${iA)\`MN錀Wt+MULje+Y|So;q]qÎJ { tD6>-$>k#圇`&cEl@x #gw,=Gu[xh :fYYnO+:X<H6o^#>= /hHȦE&yCQ{㊾5L%ߺѥg8ŕ=7{a.s u+]]2nFG`]T7c VOr:dP/GuW9]搛 ,[вIktū{hӼbWUF2/xaqwg^1yʦ[19=m 85kO7~:OrcoD ZFHdd@#1R|4$ Iwe:}FNUlE@)P mʄ.QnߨY7;v|RHˎ8o˜pj1p*t2qIpNSB 3OG$)Hw{,$oC02вi+P&n2,EO*A$/?ZEMmEBUA'W4.{eW>ߞ|AFo<^uqx;uk]w4뮘Lk<5%{-htm2')YXPrl=}B[@cl0E(֥ ;hITj 1aM[GwQsG`jR"F)*'`t@Ztd$:ј~O1O J$(z"hPe_{+/8_nzf!kΫ1qdtCʢC{|&?=~wڲ+z^P7nz٬X^c.J 70p#(-H#jT C7!'Rks8݄^# DbLkX>%˫{6ӝEM2Baa+6Uw703ϽyH]HrX8ţ|S'0V},3>IU'_'>nڔL~+Ld: X ' "NH"?̺O^EBlϠƬΞ1oYZxRc㤆YSFmU,{#AT]jrn-5K6YBriohb]93f-(h&5lhO58ooKK^nVg+%O#y8VYZ?7N )A{IU kO*CVPg9]JoV7oWxQn'a}`ZP?Ỳlp9NLų *$i-v^ꊀx~(O9`vC^mקqւ8t1I{{{倸[!ZQ5K;E~8 ?i^T;\&pI"we@.%EP]s- k.n9ej.f`m)Ê!ѱLms1zNՎm$/vG +y$)~Om>#N3'7+;hֳk1)V`y9qj_"K~:LirNHY `}xY!Bs8/sN+@K;)>‘_׊ lk0$^10%g@NFDrp)r=C.9ApY8aJLiaQĹβ8s{Tģ\ 9M50rMP IQW1hQ$URpL$Jr*B _3_G8^rɃMmR PP$՘0$t`w)B*R>$Ʉ %`MR#Lo5y{yoJ]<4@Vi*$+ oC,*S;H7pˍRX5u'//&|܃&S!~LT#aPq|tiU?.ptxaK:|78[xt!'=s}w9ͣItס=Z9 gOz;f'o!;Df3N~3|xO R%pgtHO͵QGĊ_C.ۖZNW -= MFU{Fj&q F&Kx*AV=20{p._`|@gr|[59{,>eҩѺEܧ[1nG'|G'ڤ0v@F#0A!vA !# Ɤ (gD8%|%.6MQ)Cx7ϱck;qH-q$ Q.M +6ͯ):߁:juCƥw CDJS(}; s:l$(lث́/02qCv0>6JL"`IPȝb]œ"h/gqRM h/-mo7(at-aG$1!rI! (E.Xͩ@L8WO0u9!zPyypqwML| k(3)c)qMqI״0li!t" q^;SA4@vzeU)ė[7L!|*@0wMVW`#Ԁ7†FtB#dmq5B0IbRAH=y'aNMJ#Fxs){3#ҁKEl][У|zmv`RA.o(" <dm֚o^tK_]?F|7>zo]4tfaznʬܜszs5ֺk}ֺ0qrQdC9ĜZ@xg ȵx`bEd6)ĕɞLV'C!J)xSAQĖj#)j;J#}F]Zm_SxޣN-ؾA|(l]c.'[bDF8˕Rˣ _T*(%q'fԵ\g'yh#RdīDz ?Rh>j? N غ8p@^+*̀Mfɮyrm%NTMM۫9ʾ9x3j5(_8`VS+d:w&t}L 3 ` zHJu0NR7B$c>B?\JBQ2.|E4-i TC|jv.Xe|4vيV$Mr4b*_4bCj)*!LyӋc6erȅ, Jc0EDzL!էaFL|FpG8E<# GV.6(jT 7xQY77Ԋk.4V[pq;{@9K(q}9x^6?Lp[9Y|X|2nG="Cvn?c9rcw311c>~%aF&: EgXI:3$nlvt@^#,~\B4-mUCvm}>#|˨ɓ0JMǀ&S;N sBdqa1 0 a9T\*YdLX(zpiA 6=[Uy+@qփaJa2گƶ-8t艗n>xKUNQ-İתjVd*su+i=uX.LJ<$,!\mS{In% 5=i'hT d?Ȼ '"P3r*:pO^zg=+]oe\ı6enü=sJwMm1*gr IJRdbDCZ4!镁@Vh7`!0 g!XY>;] ۶ )M'8˘( FJ9bd=(-Xr@iN{{*mAtKzӽ1mx f+Y$!P( {7aOqc2~ N**ْb+cő=)Jv$&Lyj)(65Nbr}jW՚m+śbʚ̻D>+}r݈S)Y&`l;C0döj¼٭ y&~92 PP*]xkԸG cG/za?^˰2 vv&p"6C\-( 3u?:gu!ثVaW"L m~!&BGHuǂ!_PAXH׆ T aҮHiNչ4[$AJ=#C8[ ^JJB'gɺ韼2_k;ZBA89+D/BC'yI#8]f> uK<Ԣݹr˷r1O)*'i!64urUA֗(EJr"UdKХN\wesv܅vf̯_%XC,ظn 2%_'^ؚe~ !s0a?SပLVF4}f͸(3f.rά"ƚFY 3'NBgkAds HFd{*H_* _*s2e[bt~ 6~)M`rHfETw_"JiYVړy6K]G>r[ީӞ{قyۣWmmTzߪ[[QT$bG5z,Ҏ A$5hu3lAt%66v&QNM&H&̤YlDWD*o?th+gΜድ{?|w J;jHـ5&Z[%ܒ/x4y76=mV6=k<>dH xZ7SƩJ:3 B6)i*4tH ͛L = %Ox 3SPϞSs;u>_t,DƗ,̰ADN8BsQXFpM`&iPEyu|KV9eO׿v}.wy~QHkKgݾqW'W =mKaԝj>M_(:W%UuB&,Oh5Y(:$ D)IF$eO8ZP0‚v'&}GM'&scN~aCǏ~Y]AW !~#?k{ QlאmD[#֡z)dHj:bδ H74bf`8Cم;-Py|"*3JEͯhxNDD]_c=k hi{gL;|䨲c!I91aᥤZh/NYAw4!Y4B `lEFv9׉K.џ<M΋ɶ͡<іp{7C|:R| 4?2-C(iܙ$G2bV)rZ1T”雁NP4`K%yKIx(f v1O.Sⓚ|T;`Ґa}o WّkzQu/=R r)-3XGZe:Lr :b,WB975}\E1(Z"hOeprԸLɤ|V@sM!-_aƩ;_S?mʫ~Y|!s ܹRdI!G JY/?j0qZ?F}2n^J{7.Vޗ ߳Qe-Ujm,D\%q%q fw} grɐwD[`ϙ[U*"7%Նw7mԚ2Rp4esvѕ#˦sT>z'I ʸ6JZ/q$x3v\=.aS%Gi;ovI< 8a@)%&w >f4PA"8]{;VRd){7Ҟ_j}ƌFm~w0}$ZeJ/4-"6։U`fI),O!3EoQ+ip6倧H~4# ʎZuϷ/lVhgQ7Z)epV0:` ]Zb!rpFҦy@XlQ#9O8ys *#*x Sd,ɇȖE4 Н9! Hb1yv 6tP1WZ*.Spuc/3j` OpܙsE_-mv˫ڴ.oDY]%BX3|ܯ/kv^ֵk_:ۮ}Yk;k۵hmG5lא l9IXQi*w;\&!m (\ e&'") "!/-$)KZ? }-=S.Z,8F@Zf6 ApO )EM9ڗ.]l-g+69μR{˭@s|q?1ڗlF{V478ė|p} }?S\Z֨c%AwP Zm:{dRJkaaMvHN +lܙ,՜HSQTEqL?#Q*B`|~@rGʲyrY>4YUQ2 __C[5D2rt< ,%MEq-CGذWǫ OhSNI甓WFA(DaXvV-/̀>#0gLTQˇv.3x$(dВ1N>Kt>>^k8ee^hcsZpsI8v6ۏSюs UNe.EQC3D<^wVf<< QT""E:>؜^V t!JմHvG>.!:%ˢ32u(B'[D@/$O:m!rEd5#5e]0~a 2p-\"aȞs[svҗϝcݯ/Y;r^^L}Vߦ15N)+牆un/zˬ]Ƒ{I1'ZzwX._m׾e !maU.Xi|sy^Zb A$ןvE qIJ&dL{at'al5Bt"61mFEBrUIJ"Ii疏uq`M~w,P=~ǣ5LgZƑ+|a}7xcpyڙ3Q;*f%-Pu_ ^8,HwK>]lH4Oպ%A73ZvÆHN&d:EFӕg@6'&D;zI"\7<_I;}(9|܄!CǷ^f)ε4ԫSo0yMLj$6Hj,H`TAUҗʼÒyg $wBuO ]{U xC|jNc.z;2ˮd-;g/)[wux"bu%8g2>Gk۱}5<̃GUƀQH KdOі `̘CS.4rTKyeOT"H_̈ $ס($ Ț>'(+fU;F4VGRW;K&~e͛m ZɄ^ўOu IKkhY+nW[ 䯤o'P^G[ul^-i5!UɤղL}h9I3 ̤˩rcm's>f ucm׌v9>ڣ:xv',+aƺƳEY(;BOY X 8HuUMd)PT9B$6A9'(EO+֐;RO>kTTt}P{3#\7v:vE.Òlv⭏wOoXГ ~Ziv_ɫymП?/[ ($OֿI |_ _pkil'92 3d-R%t4C<Ʒ!uϩgٿ/˼5-8rf O5OH/Smt>`|PZ/Hku+EcSoYc? ƩM'ma|#OCŒ@Ya~5 .@|LCmӅdX+}v$<)>2' i4ra\X$^V4{-o-O>Z"Q>V|z7N_h۰n`Ӿƹa7ZϊudXRm!@(ihvL>KeQlYHpS5E}gQ$K$y Has1/۟L0Uu7W%Xy7Lm+t:۹W*S"-}+aJNi#>K8V,' -Тy5׵8d~PWNZTY?ASW=SPϥH=$l(Q/m-|(j,?'wlI*&؃9PV2 n@;F*+Q;F%F:-N_M3vgj `r/ي_۠7y0hhc22kRM-3`-="^"̓ RBAl[L=?"ѕ|ڴV[òO:uxܟ,GVq4Z25b{m曩M5gNIs̽Z,zSMkukKDVo_uefՏA{RsOp>@W恁MH,+h ;:FKrYw]~!2hÖ{o~G6 }!ޔӅvG? e#IG{$s쏼-'יEȽVy]k'CV@$Z qV@&8#O_![??MF09W`|sQ r?;ajf~[xr~v{[[5s%J]aIzP‹+|ޓ>g侙1ϥmObҧulޛ{b)'@mNz";֮?Ia&jJ25?`<7ԟ>?M6~{#/1>o$Q;|{h|hR9~C'k9HaSI3o'! ie+7 ?0/-̒@[8gc,>H9Br{nB].2U`D rHlA lLJ @RuIP8J\yQ,(%O )Y5KH+e玴+2 nuUwh} ڷ2hVN1^@C?=,xJw9~! 7Z<,f`(Fl'k&Ś pޟ7/{c<_? '~2]a{Zu,C G?Wep3gJ #v䟸ܷ_T'%k6Of{xqIIΝ#eeHYe^K7ݶeB ~7*҂®]ooeuϝ5{f&FIHBad'" " IFQԺPhRR^H.N@e{{<2^P:mnjGc j:֥\ٷ0rJW>q n9Ջ.\7 EZ NlAIG !, &Gv8H"eeNc.>@7 q]  pY1m*6/@"4'(4Z3Y&TFk IAS~bKSI/H( xʘdu&'im}?Ur+J:%m%x񭟿0,Gkl. mzr{8!L"+15JYe`]]ZzȽ+x.~;y]ANL]8xk&/I w],X4[ CakjxjaMɯz-ۆ$견0d/{xG]߇὏ԳUhsm^^s3q o0su#;7>8yt<ԅ٩woܥO>g68/ƱHг ]$"^4&:MtQg0" xN39t瘺Cg:k 2|UDIaV^d?)泩e-=KW%J&ֺ 8`,Xq+@:w }nO֡.Z$ڛ~Ns/o`9jSQw%Erwz+-BM1T7 c@P$b'Aa%LB ]?pQ e<8ܕLDg(y<nOME ­nAcZmnӄīOoN`~1 ua XI 8b>+'+Wb;|9w1'\7]ozUgpߨW7 6_pĦb&M.z`^L -ok9!0[Hԥypj"ggqdV]pGtx7¸3@cmY#'7R09'I,T&(6YF@*!2>!nJGil+!R[3у;ºz?mz }}t4,!=̍[s frCnwda[#ib ;pIѬi$ǡjB! ?a6w)</aƂu0"[ֻ?fQNdͅ|r<㒸&f ±qîTO9֚b 9wzhi;r(8 T8Ux|R/سhF3O: Yj6XlTInp9eD.(mDi=lv @ WX4#X01=#:Ɔ$d> gS! QbD~$JJ$'M~|!g<"6Xj, fAO>%=,eu m2Fj.q$ʁks`wCR05^B"9vV1zujղ)KxiU(tɇvgKտq!,91,@׆`mK"iBif*`G5AjO2Á]]Jla"/ z9`" M2Z\ڧV$.)*֫ >7 '{B'MY˯Taa=pKr3CPKcDW)Й9$C\>F@ŀW>Y P2^B$1T6LP+&,rՌ |*Ԓ;P?Ԋ\cG/[Vsg'#sjWҁw~FWӧ_rM?ė},ϱaͱ |/]IwnsFXan0x.|9_9~|~鯝_ʽ]~ fs"k#P^EF 1nJmϊ96*^š) ܑt~e Ϧops|sȚm5+VLb'u~roV5ttNw~֪ %WƝ& :Tyt7^uڶ,JVq˥wGy3rsu@,? Z#O3x`.C{$7㤙y/d EazE"!`4"6 7t2/_@$H |u)NSQ1m yꘟTږ7Lٹݢ󯸴Ǎ@z~Ӿ#ҞSM_9$g_zKTνbNxrq**H4D;^TlF" m\P=;z"=s)ovw͇ԪSן\9Ja{s p4S`K fAxLt;ȝX 0j fyk9C1,)K}ƒ!=*Q{ %#dY3u7BujS_we>w8q؈w ~`"ٜ9}fMM{M?}~YmαS`Bp9BIQDB4P,dӁP1j 0IPA-[ 0N9S!>B?650*)?ϊ(?}A-Ons[',?txo?~Ftև *Oka;e;9:Y\E6{ 1 F ͺ@Z̚LHy OFeDh j@)O;fCua '^#kuh9bcH?o]wnWh PYm}=Y^qx(.KϾb_ )l,0-:O5! 0|DEag%~5Cu3)Ţ{^|ʹu!{x'%h4<(H`)T[MKXų$vVc\nmmBknO,M1,j}z3f\(GT3=uZ^TW hgBb:LeuR-;j^.YR3ǚ^Q'Rg&%{}NِGx@~31AE$IrH+"/Ҿlfe)gJNIhPu +6gp<.o8.![uaQʝ=}`m>gnѣ}*27FN>J|St{eKa>)2koq@!.WYюdFd667z IfJLԸAj߂uՠArOln+['qT͐* Tx9񄂐@m< ,)lXjLeEH Y0=*Ś'vDS8)FwkԖ,&nlzeenZq0@ "{桍>;XxC o]K'CK0Dvh4n  XU[ئ. 1hƃ C*>a;Y֎sٸ Ն9 jZTnЯD6=߹ p>k&!%8  f$BGx FHj+C7Y")(dMe,h3/416W8VT7w،~FÏЍ~}+ %[u'^2]бGt:Er >?(Ź]:&2ٚF1N^@+)kqp:}O)w7Ijq҉rH04gObQvs3ӫs=1T2K+ܼøI.Rjɫk;lyXӿ9V9RH n{7^K}&S6)*>RK٫ ԇ~47';u1璃`s%TawM&71<} ¸-KI1{`>]l`,Zc>Lb u7kz.^l&)jθmZjӊ#UU].ԣԽw)z]r=vR57jk7mVo=PRX6jUȻ@=M[&\b9&=r 6T852vy.>W4؋,L|}@HȂ_eV6+|`R*l12`D_fZB$~-ow!IV@<@&$^> `WX$J<E0` NUT]?XgrMRw;`ʊ-+nltgu,>vwĉm >伬ˆ>bf;uG6b r迖e:ˊR_v1z5X*H;="í{ _۽!?n&!>$8Hemoκcyï]\%=-Yv|q\?Y&Z[mgGtXJc :AL(,sK>lB "`\c2`iπך)p3 bl&Q^fQgW tNJ9| 5FcE.k:So|3'U[:ψ$bDo(>rsU~x~oŠK,%T3xyN.D-~Wsz"Vn[l/⃩(Ac J!ŏptN{7 TүOJzɾ1  Rc$OBj.d+YʋD,н}9zUezL^.E : %F5ؿ̏fmcЏ\-(Ǥ+Xk,>^2re;q$s%d Ur,X9OOobg_76n^yڃm]olu7"KܱR?SQnĚZ=ᗠv¬qiTcY:LǿC&N?H^ "BC * ԁ[^B@K`Ͳ{@ 0`QD#p{)? {5mYqgWEh7:zT}KDʅnj㟗UEE5kO&45:{^8ip!diAemCcj:z$'bIxZUpRK"gOt|KI\f,o9m^1/o% S NӒ=r= ggqP#{s).?c#60mօhAE`U* L['YH2ptFֳ5*\O\xrU{\w7(ņE&IFqCֆ, ؁ 0`!aUֹx`-ܑ>0\}闏U#Yg`D~瑩#t{2]DPQ"- #(.Kx*dx*w4DaV_QgT؀ KG{IJջ^+ 4n>H]xի(cB0~B šN"ؑ -I#0q9keK pO[aDHPtڭT+eܭG0ZGz/696e~-pBZVY.c`cp#0\buISCQY?c޺x^2pX溽 eNu+,㲰jLl*31W=*3~溰(a-2ٺ-{`-{} `ނRx\ S- ԭX4fc'aM2 Dx<Ȝn|ó6շ>w is'O8)"`[@z)5fLԡ9VHh{О u)mGio:[ܔY/ocV[_1d(¹Zwؿ[qW>] #H`Ii"gwFw. 8t"ˎQ *7brODmU&h}qʹ1/qdS`lQ-I`сn}%,*✠ _E ŖQXhI.VFl{EkXK3@M+&Yo%hiؚegYc3W/ k2?6|'| {Ord. #*ܻA Y!ĒbfXa0: 2rG.5|J@#ެX_gϖquw?"~kyovM^{5lM׫^7olOy"P 4!{P"G0;3>2S` ZXyXyؓDL Iyaю@{D:ںaJґ|K7?+prDW#=/eZ߈ F}}vQ=Q{7N|iV'3n^^৘N%j}-qM_̓9ԫu|e7"6`6쇲 /1ạv)!YF"ܖZ= py]^GRg驮zX|s8| PW5ЅZCFqd0( kYqzXD􋖦8vһnM9U={qoSOj^%*s:Ù٩Wk*|jީy] gl={I{ ʝ4v(_))">hV.`ELG(;IbYAt`ۀ|tBeMA;mF!W4/3庭˗̼m[?^_rwU2SEyCʂ^&5{Uzẇf?鈏gZ24[3Æ/a vFE3Xu@8ٝvտ?ujz&2w|V\U΃kև aCهYQ܁GzP\ꭅU6/'ÈQ\X a#(՛[Sڵ$xS/,wzQ*TOmaݢuiFy[r[6c z+ xѪp>!uأd;9e ]b/(9eqAGz>1юȸd+.(cYHEBRRhՑ#T(dJHbsj(*Wi}cQ[KMq~O7U: Ts~2YNhB3f3ʐs3,˾@+g[]Zf{pKƷ`;R' w|U'ukUx?s4Mїc'9;*Np1g0ҿ;J0 zݰ'`s@ (c! j rGx:X &iVnmJ@x!]l@ ^[W)$A=@ݢ? $#ⅼa"! |mVHjG̢gMD ,oq:E)# RWO>~US֑A% %_"bv\.]<ղךnL jUSF~7x=ە{n.u07)[~X#Bqh:)9p b4hE&:e`%ƻTDhG?w]/=j^R`fαѳ9lV>wi7?{ֺʮ&[cԋ#V}|nX:gܭ^n?mbwJu(XCi -K gϵc5qc"QI$%O7;Fү&t`|ǹ* HA7qawVO"B:9Ҵwf^vآp%7 W 9Ư5d-:Q|n:0F,l+u U1Z߅쇹z}/%„i}nkxmƆ{\c3/ ` Zv3AKHݺg$*FWn3gæH?(Č6~`օjѮ9M*GZQouBYXZ~-DN6ѻ1ƟM 3B%<~ 0xh`րCBsVJOǝ&Ix{e7Np[@Ի{?`)?VS'~o?6R,vm`"#g#?aqB}yg'.7&KwD7K8@;FU; g*Ǘ,lёC_ozS`CK?t{{{G y87`>p߹vLr+eyF".Sb!Y ex!*E7v'I4(@#@\D?o1^1"P;!/?3ZG6$ЗgUhw-)<@\MO=J 0g0M=oƯX }ɾI#Ee>U@!2:\1vf TX=o"rluP\Y#&y"3s?`XӀ8ixBꀶ8߯f皛<ΰjӷ}y~8SQ[/lA)pO|x@ÛUJu/N0bʔ/f-𻛱vT>/ \i ?JA 4LY wIC}^2}R--6,ٞj?Z2=ZaoPBLDTz/",12UsT#˺w\}jN8,ql ;ͦSd6BiCs|rgcA$IkAg\kҔn׌:|Uf@a+DEAθJ ٕ>{s=i?G=;8UѢ6̃=[zW{mk^UJ0hV:{8# 8}r%a5DLT,$Zd2:'%AbI'jgOIEV1( -UeUW=˦V\Io*{@شuL <55ml'FV.Jmb ny#A0]b1rdp k~W09?qAGVJBx2Tʶ` E&D5D-7O%;ׇTKBJͼQ_ߋXSXt9;rl(h-1svC#;9mR9X=y ]rpAԖUÌ {x*A75Ś957 |.dqVG_ٲz" +n\au;יg- 뜅Y/2> ]2gs76L9sCPgdI8)7" -sdeF! !җHWi;d;YLNw87om)Y׏Śa^?/*}ee7feT WJu;sGW$<<.K@ VTʵ/@wX^/!J^6|ٞ4elq~Ɏ*y@2ہ"K/2gf"XA{@"w$d1% n pi`w"*T7>~׮0@rc{֔y/cVuՄ[#{_1ۀ{_tǡc;6N [{~|pD%wN>;bh'Y`˃YQ < +~J/̆~q@UmZIyH h$лg <[" T%irEzZdjұʴL)Dܭ"<<ĭ?p&i;tKfݲW6}tm^ 2{R3o#_Xʔ{okdu MȊaP_ڱ`eVɇ"݅絋*џ].|E ?,"r}Qk0``Hj5$#m/t. c|"}\s r9ga'6-d* z#B0nx(qni0H7zlc/Ea&[e#M).)؈,B ֱ=ʶT|iu&je ; mǠ/=:pH`} t*j$z#xX=5RcYx׈]UnbXȈ&;WuFqaV>.Mj?e땵zU&u9TۑnoR6~:6qBV䝡.c}A|.1A{|:1Mo$Tyca*<-qINXиg^쮂Qlf.AWBn*jÚ|=$N4p!G!>1M_-%F,L[*MNI1jUy lʛJ~/ߠlYu $QTKC|濡>/y3;}?P]SԳg^Kjz 착SO p,,O'xK ahoq|  P?ƫ-şyyo,eždt;ۤ=Lz)*.&]?s}9ka+ng䐮]D8%rh-O1k)œ.}u.^ӥoU]y_'Uh=B:-bW @m':WĶUƖFվP/QAkiNgW`>o8ǗFWG!n?L"؎(%Qǁ(Oxps/e(Q@tu?SPһH?,;)` `qPYG5ht!L8c;/b-CŲ+ؖqa_ٷnpu+nh̡*c_t^sr~.ZۊʋeeV?s5f:+3boI:^`U˝'*Z*iГZ\{rD>CUfݻs˸#M:a`q`Vx\a(0>:\q˺sz +fe~ʟ׹Z5LYא^| Vp8[+),좺V|p2{ooݻwn,V=ԇz E++:=beaUfͤ[vO~'IS^b-7ڞ8>GSrxszNZ W Q_8i]`I6/~r<o5~PORԸ^Ůn{ <pDFxyLD x1 ?2-[,< t xrѠkNmWtեN.ܺV=qz?Ru!s9mbJxWqM6{տG۪6_~`Ï5\o`Z\S^`lRDۙflvjRl qƝ@WU~w']TߥF c˿C{:M{>pr&>Z}@<? \R~kW,޻NJ푞6uDVaCTi %! !ެf aNT0<b)_tY쾕;s=mm|DFj^}:{?Yjy_P}D2F>떇VO[]v5fAcfD}`Q/zsݎ\f۩ qI%R #B>`:쁹W¡Ѩ|P1P+PyС2%Ywm@~e(<ȫ $zke<_+weyL'op 6ϦVF{_i\)`behy020O̒2BXt_7hKKDsJ-ĸC<>v,~SDNCfޘ \x`g&w ON Gwu,t1gsj`^*ӹ7ݠ>-ȏS-mnCqqjގ[ӑW,Ï90aɂKh%WMvWyٹ92&,Y8_櫾'\`_쉋\¯=ҳ6^B@xA:P+mUe7Y2 J1H7iD "~*<T5{|ZވßC2CHZS;w<64*)ukt JLJp^96^5LasI-Rhn:+/ozw4*g +7_QrE;]Q}qcv;jF6N|dlun#GWōu9赾oo1?`cG{7TK\\zzvɱr ?0l BSj蓊Pqj(EWh9,BB;԰JHʐ1,V!SU@b,!)Jg5JsAD*[uA{_,_!.uе|H6%VugI&Ēx{yv,6f)LIüL̛0ppX yiol 3 3@z6Lƚjs?~m55l]qjh__!:np4>4R!"wݴ}% A\•p CiAО6 `v:m[/0&`+2X(~EH,lM4BZ|%jZZR 4swڦظSr%b-aE9絡".gހ< ?W@ 1|-=zvFaKNo`;`Z8t{FU>Aa{eS&h١yum}ʆXp>jy=BrVݦ~|CA8_ |7b_^׸j, +Fr`4ׇ`cN(!/MWݚ֢ ][Zl '_q^k/Tui*Өފ]C6cm2`Pa`ӍKA-avҏ&gļ . ML}^d|4@oSVe"ubͳXk;L N?GqLD> ԰v= dώ"0-\bB8ByR;р'KNYXtC Uȅ{ TcMsR*8Չa5& dj=mlr澽*=\9}[&󍾿n}CíRٺPZ]>y57f`3,f%3"VL+ӂDi,^tAB$C4 k=8=5C^'a u,҉ U0mvȂ+f̽k1n'n>>ZKy*>yIFIf^_}+Zx BC)Ц LuI0jb}$ȹc |;1j^̹w`"اJc0e?7vy$/<3*iSzsìmUOx7Wq9l39Rhrj`Dkȉћp*{CL`r#H*]5~[H68<ͦ!!0$q9o!iY v L1AØ%N\d=N1jeS !LL -LJPd@%L:pouRJJȅHA :5Bw]"TS&PD韫u ːO۱cH'q7Oճ:5?#s]*U*E p+ͅU8&UF1=*1m R3@H$( Y\ <[}dQB$I]j i766O[EnteGuK1?PmYHyoK5!7XNlvfx4vj8 t2$̹-[izډkoO.cb N2Od1\&Ne(B0 "tЦZ %aɑQfM[-8P{fa q{Ήq0 ~S̍SYU% 5:0zr8e`y]rrV {!lubL4VǙjcģㄈ) eCS~Kr۠Qe"(=-H/R^-{;-T)!fX`&c|欶_d~n|ak*z7EoSJ#e#dl3 8 ˆcl͈9ؕ*" k 2Gʢڲ(#09FˬEa)Om$pԒƑ[L&6Mq㿌CqZJY]-@Ğ@9,]γ%`6@g 4Wk| B ]D,ۋ<9'HWͅ m. %Anm9 JF͇.v+ -⒙KWaڮiR=kGﲬʻU~w#J<:Qb32xa03(DB1F+ƃFhcb?őn)c93OR\5OmlXJ$Ȳ,q:m*q٭k/$ʾLN Lӧ}z{$8Jw J C$7*oB)> (kD'Re(J?t:9-АrG+Hg%-ؑE`!G@{ɂY^6٨ 'Lgp}Q H̿R`g=}ƳS>SǏ\|ꔊGeG ng8)QWXaU-W2zcwɑW|5.""E77jrFW[;W![i{V_(D`& ýeJ(,tES@nM}-^3Ci# ?rDUʄ8 ? [`@6))x]m~ NS*j=bOMYZ"xբ)KF0b[t!\!e+|l]^Pu"Z9 C)E/ Q  g"k5cR8p“@ǷS='>r?{?{~IjzG̍]εg aB y`qbޜ/=BHcijfdPBaJ~9DNc@^1Rh#6XCxBlcjѲ\[ _zꍰv3} Ǟ9&] 8CۢOA7–H| qnb}lTr7wn|ngW@lf:7eXDAL,F?RX0 Q^S y9F?O^O1ly6Z~巄.f/V遱 a4J2*V $b_}Xr}\(3gh +G=i g2 loEV")/?6;dC#Ǔnvഇ3N!M񸜐y˜<$=BENI"EsiT&r4363c+I{4*#di~<w!e{׹?>K0>Y܆kb~e K+-+ *IGpSJ!y\u@ ;$ "kfzQݔ¥o>t:nߦ(WƔ" W9jDrŊM-!| $`^kh8qp^zW9Wo:}j ]<1N{_Z}$,.$4OE ݕ%av[<ЗC M+>擏p1".ht``"-cD؝Gfew_ mENύ0sj1PF뷏9_?~9=w=oso_tc;#Q'ܣwUzƵ=`\߭vCX1X`YB^ ] Q p.d07/EǴmX`#2M-ˤOMCn1y*s40Mj\9n-ћ{F5>a=/[q''ϫ;?F={ (00,^JgkcHXmm|92< OϠ ҹj*,l "=1=}LAO2,_G#}g}իϏfwM o.Ȉۢ 7G6mlx9Zx:x9憦\m}?$WKzХmH_N6M?I|$q|Lk9~!-bKs`3 1sj#QŔapw w B;Uc}r9ddr71 cdV1[И6};''M\Q [lDhUر3C~fsJB[$M ޓ+ +%Q+x8VܙC+d$}nā23IP H8 ؁a:T?_-4IbXQ wȑ jPG *cL>◒tg#Jه 1&CE05Tbq|p\KA8~j5_?Bm#=;}/"&Bv>ņB\z`*ƂCHBБxUȌ{!~HC~P}=o8q~E ϝ|6x|&*K u x?~P8S3*ooӧ Wy?n~DG%"3q4'HV C2>g`= xU89s\>;նJ|gGOƫ!lN/?=j<רY#@qTCS 9@tJ0P8RH#Q&.vd$#tdÇwK?gո9W^fh˛Q_Us5>qȣ͓SiOm=FO aX#9~3k\5ߥ;.&7=yc(SbdY|>~) ?g{wD'x4My@yk'-* hX1?ۚ3`\MX Dgnސ˾_Ug8y+7拧SZ5t̅}&"zBƚBOB;ZG['nHxh0tL#\y+B45def'^56V5LS}>fU˦xJfkgI~ГʵPu6-k Ͻ/ǼǷ|^u??>O}-)?ߣ&Y8]kkeuУqqVpo 75yh1Bd;ౠd "`Jxl2O4iyX`t{={6k=4ߥ߉o&_'v@3Z<)}#tWbXqi7IfYU-XT#.z ]9v%87 yxtɆq7kgNA}KIwuՇ/ׇP400ʾQO~.vV`OΉ,.8n5$_MRZ4ቋ"˧t: 4ςX1P8&kYi.N[n\|#Lbz =wMD)0\yB:[:r*mj;`wE<'.TEiK[]"plC^(2ɠ^ i?$ E1¬^lB[ywÿƛ'\(= ſ}3w nI˄Z׸=@SI Ţa|1V*ca\'aNЅ*k%kMsBQ­76 `MX(mihGچ kUpmے: c!XbH$BA+Y|I'ƇVE42)Q򿟾m K[[08g8[kZ3\Uv[ɷ@U2qJzeݐQCY/O)dw%·/ Tax&~Ğ2A[B\)pDf6I$7=a >F\[ńzZ- bpx0o !~-dF+T8ty\ԍSdCU,s1|N,l+6=-F*0Əg-~Ve+FfH`ezp/#n;|1Z}:KVB?=>h`d@{?Dl໚N`=Q4HY|pj[oKf,=zq\ₗ$CIL^ |ICHkF7 Y듮fn _OB=7G,[&{ cIDEk~@8db,-%_(!c&C^xE鯺۽w˜o)B U73Hrبn}|JGi,Int-[c1vp%/1UmGi2[Ahf #( nL+{jnuϿ]~ӻ^MQ/\Si?)s(I3k0bf܋I#Fէ]/Vw pWn^Gp;nkW# A3w?!g_]]]M~_>05n/D_T3LOCC@nzּG8c ',bv!ĒHpb@R]; ]]:/ˀށD987 &w`Poa"ZSF; [\1b:NK .-At sPs+3b2"PQoĦlvAtݯM$ gIvIvulkXIKg{_;ĹT;8|{qb'H28n@",[\Mn&Av8i ɦ@!CjtS3"!)/ż}=:Lt+囮5^?iP=' &3yEȁzLnI %$gzzu'LzBTG HA"tB$!Ŝ忟SPW h4ѣihak,L]EAJoZ&[Mp4 /%)7CE%27!+ ``* izrF#Zla"W`?F!sLܔ/:;Xϧ׊;^|;kI# Leo:?a۷2E;[XPۘi r>uL#yd/p'"!8^s {Y SD/[~P@Ӧ];d|xe"C]-$XsQ6}PH_"8P:#0b%@Ĺ?"Day10_F?I,|gl_sF^i9E;#k4#d?rbʸ^ԇxy MH2&k>ʯo7v70-uG0߉>]wߠ[E]wka)v*pt]NcnS7p_huߕ#ʴ:ѝO?7]:-#'MlR+[Зq7z#]s(QatP@as%A2n{ z4q~>݂eU[OA !Q:]> kbef0~$ ]~%u6g$B.A:G#HDK#+/̦@H&~zAlcU&?v$[?+IȏtC(?ɓw@qF|"iU)OS/O'ߏ'Sd#|rF'$Iq>O v4ϜGxzga iSn>V>,jeHڏ`10\ÚO3ua5R\?ہL3^+AO1d*AQw=Ujvu{Awta:e~jp fe:l|Xԭ|Un[]A{E~7Vq%ؔ7w5AXe)o ݐZ mTǠ,Fq@":?/f{c Q:]."h31ߘ}So:oJ};:CۨYZͩiPO%K†vn#3,W.ѓ|`@d{T) \qGAASҁշpa}9[}ߟcQΏXUr{ i3pRLPͱXyr4 π6 EqeS;X:TAa62QH~Fՙvߣ,CQ8ŤV  כ4x㲩#"\{0B(NP Y5A ^_>£h3;хfSu)imsy "c:+Rv? a1O` 9&P hWav /TjԷkGp{~FD4x<5yl>vEM:9|K|itlvg;ayMIY+re`r9R;?w[?? R4(Ԩ@?0 7* /X9Į1'?ؑgsGlC5d r>AiiֳM0$AG`J7Ng?x/Y7m)Ӛy\]=ybM߅8kXOd WeOO/?%FF&r8 K.D>ǯoooΩnS[we39Ac'({cNmKuuKLoo|HօA)& r*JTk0 g6A 3z0c1[zø;n˾Ve!* b%(;|&I9:Q17v&@%0'{j5?~RB;]~HyC(Ʒ )+XA/ly6xr]D Ouy,<&)1..1)__-3esgb=xB "l:cG.xYQ1BBZރ]A3d溽WtHGݑi2Jd>h=7p_޳ r>b<  oo݆%_6UG/5EVRH%f!!}!OnV$jEء3H ~VZwό7;m|gF 'TˮeG[;1Gь:[R%rډL5mWIް#f؎Ѣ֏zxz"}Z[$jF|?QzM9ӄM#7x/uG޶gJ\j|T84Ϗ<*$Y𹖴GV glЉ4N{4qlq{6Fb&Gf1 !y|ο~ʁ51{Gs7њĔ7ٍ(1 ؂Vkʃ_RĘ6`%^d-hЖ=avU+n&CЀ!PoGqSBdɱ];:Vye!`˙7.)*|B>,[flq3Jl[w(vKhb/H 9e'+Ǡo'.py/n #c5q=$ ZL[Y(xFdm`mf-{Aǜn1aVI(A?L|gҬM['a ;:ײ"1if0bi>+OXY3ԑ˭p\l #u;L0 3ʙ!)Ջ{Dq剳\ @@E@'R @_C7A|N,Q[Iz4 nKۼ0ېBt⿰c(n!2FwI'1Gf] (\aYWS_$'5˟aKˮ|G~?6i|ז@_X8O?ʝ+ܒ\{E 0œTY@!/5 vH=Y7DZ/{YW J O dS!6 a񘤂CpViKRǹ0PDS].̽Db!t3mvwO4Κe/7/}t*{^Aị $d:ɼ o^S%FOAV$IK,'#^4E@Oa1:BJ-l0#J1 *؞rr,#WAiT6HY*ʁ`ca_{H N o9 ډ]4W@ wãڟqآ['tqֶ b}=X@=18{;pхđwbC$u#A?}q&CbҲxVr8JW &S$u& B5LyDM^L2[)tl>d׆E@4M_8}/o~ 63TA~&ؔD'qۄ'NvTk52LjL  j Hc[O4*sdłW"$6fގ gzT`W6!@$8$7H' khؔzTbcp=êCX3ǹ= @>Y/3=aOM; tuW'؇8^~_~é})?8~ǍO!o} ;L$&/X]88" M4f#,n0H Õ-.];i!x*>" ŴgRkMZ؏NJ6ƦEXO[RZ:bSRIC-uǔ "BNǩc1Կ&Zd|;=IFwb%ObTC6"bC+=Izf0{[S?|d G O7n>ɲs&I<:_lNcS3CBGUX9g$;-m*9<ʼn"xk#1zWZޠg8_@x#LshA6} Hd#IF!<"_LBDXO;Ȟ6V^e֖/4]T/Tгm^P!DWHN =>Vyf<wi`x@h 7fcyAH?,cǁfyǍ V,$n [v~jP$\ZŞyuUFi<lCCj7C?vXU4c+A[[`Co]{Z}y1˟]4Ý^f_"ֹn#ݎc+3rP:1/Dkva iM'-=d<+~"wŷbI{.^ ,_I/Q>!f .ox/#|!*>ݕ%dLb> ̓ ӻ`YgA%!Z}C5X,Be;6!F:s_߷dƜh?xm*3X5Q; œqpZ"[ū%e`/~c+R#tc0j%#ElaՖ, T]ѿ'aqn\{i)OQvԀ+MlɺV$ бB"S&8F.$p& A.Y+uO~%3N\v#*%!zN"߼y;qoo;1>,6ىB"0a SmAoY238sm3]sşlnjA(Oxq kv bDXN#wP8&Vx? O`(ybH&^aCw;;útٚIKu&kb{'>hu}Ou룋m,W3 2lx] )|-}06|zoʭyŧLvTWLI<4q.YNb$tp/)\ @ڕ9j|n u (R `b!E7Xľ,Ol/5Žݍˬʲvf uf?qrJ/;lgLѪ+~]ι}F7QGS2n MJ R9lknSvR[kdj5؋Hum%6QϸHKbv~ߺ:6LvIv,-Cm8ߺz4-j{ ,Ё}кd6㽣ئxG/J v8Nt?ү%#UnڡfH&߶Z"2QLxăUgķm CUd4[k)"aG6߶^3elox;^E'R.Zb 5ro|y5?u^LSqC?|xc]{TrcXz+1t"{0V:Rf! , GW$7?\\0q:'mh0*JZ |'j'+d^N_WIgb]h6 {%LJV;t*XqKumݰ) 3aOAtwv6O:rcn.4b S]\ICIj)ɽ'y6# `总^&3Ma6E^ KsoY(t.Ǿ?eA"⅁K#݃deE3ognY1,[klI ;+6FB@E)s.a0= WO6TꃌgaV~"t+PQh~Òxd Dy֎ktx5anJNa5/\fL8jQao2+,7QEe&74\tKH/sxc>.םGa7=0N2j TjF^G I=DRraS^n Q.  tUտr!ۼUWE& ðƧj +Rs&|vE :Y"3y$XF$`^Nfaǟdv^jQokvy"癰_S3QSE\_ ?lG|p!% E".ցfW;LOg!{_]4Δz麺&q]=toumA֥d}}rꉛpjyw%Y^ӧ]un_vv#ZHF5´QMU^].|480|Ju4rۯݧg'Կ͏̃pI8+P]c!!wbxG߮9w~=AJo8ς{Kp-AOBla4|A"E]Zfˠ-"^-ehT=nY6r37 ICF/;v8m V9! gE6璏xN7Azź*H8-07qS-w+Kw/4G1%K ꗒRӼq<%v8,i åxG8dCybc8{^ϖonZٯ,\ʇOhG`104sA~FQm!+.* Pc7q60oq$Ct%t>0l>)lxЭjO(ƢD*n@ҲKK{ _4!oY Af\_AgrY?bByqG|m &\^a6{v>.oSwvo7vOpd~@lɕ/-2RrIhXv , @i_CYƂxD{a_Dk4ˤ)PHS=趦A[ Hء3o;{=;:|Ɋ;/k;<ڡ,찉cBga2+Thzb}ޣ+k2#Dp+& Zaè"u8+ad(4Bk0]BŜ#;%˖#>Y\|ቓYm?0_2~A/YPbK1%?(YFta>S4xB~׃Hs68k{ x7"V~ϹJROh{LGLA~o{m7`)q~77| ؝Z lBjCEj8,Z1V[  m#ў@dm5ߥ-;;wB{5߮FOtcȿO|mo+O3i!piiѬ|m-G+p}+nAZZMAh<a87&ɚzPmVma+V%|GKK;/Gk.JpǼW . us}Ph@=HG?|WsUCxh9EB5h߇v? A~HԑYDnǧ^C5w}P·]sa/)hm#ڡz\)k4JEo/1 ?f6i6UBGlbNA{aD::_ܸx{ c 19A!l";d-6c,\Vn84=xb+rs6m|O) 2K(O,Gcګ`Laާvgi Xi!96nEx힃G4%#rCxTyXUP^ Bn b^ LL_ax4Ὧf7O5Ycٍ DZk2echn0|j!\myO]SAӠqOS0~-O;ޡYj6bd͟k=xfNIuX6|@:=m4^Bz2m%WS!,8¥4{+ʁjT@{='~~Hh Z4T <<QrVnЊG-z3 "D5_ 1A@+kSnJFŢʰœfk.|'u];jNk:??;~з4oC5nfC:w ]j-D5߭vo׺|2qRA_M a< g} w!5<g:@ZřﰍCOa>!}'jM.`y>8YHkxJ0N@_7 xLcCnJK sR8Z3]4Gefj Z62\SVXg o慽x[`xckmm#jhvM_D0֒RKpూ? 29+B}e*DOk6rQ{Z vϳXSlV_oCߵ}/!Ͱa771E .HdED5F}m71bĜy5ةbWn(_bqqAqQq)q u=jq_]_%~Oc{Wr%Kؙp 5DK $|),bSbu;$nKܛ').ɖ448f'ߥ^LҼJ*Ҫfݑ&m[޴#iY\HDke[-66Vkk]7WٷۏO_dݙ--OG#ʑ(tqT:f89vlprt;N:^vr)?_Ƙk2?UAdz_~+?d:8|`{>;A}78ipÃ;!ClՐ C. 5 54eECˆNZ=t-Cw 70aE 3lⰩö =a8qŶnyon/]Sd]ɶ%n㷼p[}#kG67Ց e'+ -,-m,Wzg K?*qFӘc6yslc{twr2r;O5b1{*V|1!nBC~X4q&N:8}'L>2c/M~֌[ߺ÷+T~pL nUU UoMMzhZԴEjִ\Z[\[^;S&g_Q7oϺ;sFczckSLӪf:1ٽgW>|g's)3f9M<Ֆږ-˟fޫo]Pׅ|‘ -ܶE.zz%,p;/_Rd睡wZ.}u.۽엻yOwg}o-X~ha+bV"EɊ+Nrʌ+GvU"V%ZtUիV-XbզUWZձU`W.:muYXf{WY}qM֚;֬Xs k}.[ý\gYW3֟aӆlhpbKن7\h1tco,Xz㬍wl\qƽl|zK? nl )iS֦M7tǦ5mڻȦ7=Mlnf6gm\ys7/ۼn6n>ll--lI2xKі-S4lYeŖM[vo9c˳[^\ruekֈI[o-:ykֹ[m֟YEmmʶok}o}Ogmbǔu;67wƝ_~w|ݽwn}T?wػhOG=\>ҾܷnsɾKM?`ZhS뇒q?ia͇~~?H#/yȅ#ox}?DmZ-H3, ӯZқxu u}z5mz7nz7~YnM%Q 7t, @|!@Z(%m AV%Z2QZ48мHN52g6HC%YZ6Re(8gqǑ ц"CFDZFAd4cq 9; ;I Jx9U>~mR{rVi`A>Җk[Ũg-wfhk_}YEܜLmM,ڛ9Ϡ f=]hzvhB5{CAwD-y@uЏ!mTS[n/Ю/H2?Ek̟@r̂ Л8N_ ~4]~etbbc?K`͒X2KS4>BҙeLxe<V†aڗl8< X! Ň[HpQ뱰\y/7">y x) gcyx^'|o6>W|5Ou>7&>|[<>/ ";R ~_zofo}|;w.{C|/?a?O?VQSi~oY~gsy+U[mGc jEK|ÿ'O~?_WU~;yL纮tnͺE=u/[=u_O@W~zGQzqz_Ozznm]Ozg@}>XՇ=WPI/G0EK}^z>AoxO%[Xsx^[; m7J;Oէz^OzhtG]o]FI֛uZy|}S_?G-nQX;%R}~~\_W5=Z^}^ߠo7-Vpӷ;.}G#AQhhI??ןmz~TПԏO[rT/\ *t0ۜ3jZsSJ5jLU"04Moj\%CiZf6,W4jڴƹܯiU(T-|k.Pk F=kܯU d5"𺩫"^ӻ=or9}Ӵ3dewxu}Un(ZlskL"0P-W-![R/Q7Bչ^|D1UU׌wU"ӛkj맙J̭15{nSDP %hF#}-b)on4gnsӬq^88~*ŬjyxJ{S9T\q\  * Ao-wק"(7LEvtjanYeXtqhf]4A6/77uM96E\}3 al"{Sq]Uwԏ")>&Q-el$~ IOKThMK]o~5ݝpe$U+AAAAAAAAAAAASjP0Pz@/P @/P BP/T BP/T BP/T BP/iytwI4 ߑ&;$|GHiCͺ4 ߑ&;$|GHi U*V*[ d߭v=Bx7͗x7xמcg-#*Ox<9E(ڋPh/BoE{"E+G@x +r#/G< +r#@x +r#/G< +r#/G@x*r#+| r#/ǻ@wr#񎸂/; +r#/;r#/ǻj w$uю_t9WhG\B/LPlir B(P EU#"XE(E(Pʖ&G)Bgmj2PiY=ZkqhSzn8{sja4[if}#`XQ`w-wp ]UXnzW,447WfQP I1jS(nLH$Ymb Yq3 5DO[=<1>ǫ~{Zب~Ib%C- E ,,qa[#Rz"_F=Gtp(ck^P& ޒL"zfP4G`Y(F/Vut8WXM[\P?M00X\,Qn~ޛ riA}-MyiTz/tcjC]q3 |ǿ+1([67G] !~u}/tBPS;ϕ0ԅqyO)ɳRf54/inJicsS"(/ڦf*9 wA"24֋ ;=)9M]Sowf5%<:WͭҊ66Lh+4%VDN5p ^Mk5%NHDAj(h7TsXkEĄy1/#>DWDqciNFZPKD?APKy.F]angular-1.3.9/docs/components/open-sans-fontface-1.0.4/fonts/ExtraBold/OpenSans-ExtraBold.svgy{$Wv>Eǻ 2c#ϴ42v d'BK 22@Txn"*32s=,O\W_T_n|x͛oy/?'7_f7_zW__}gg/6_\㯾/7_w/wƯ}ê77_lxf0|3ۭ}{x {ym}a߼ͫ/7fǛ?7_;}͗6ٽ~-P7o'~~wgoW"E .;~BR5FWw%O5-xUC6tYbpϛy]O'q;,cށ2Ug ̿꾼8wSƚێ7wףdI;{f w۶%xhqSUU  rblڭ*E=vZfŸWY0M;8i6Va0Cp$_X*P8+_ϨW05[FqWkЫ7yd i~jy^k{x/fjX~sK}ܱX|Y9MMF3}?>]mؓ=~eOb_Cp+#6pK^4eֈnb<UV6 4͵36.=v@R Q mNͻ.CrGƾIF࿒ϟ,^Vb7c4l 'f~xQUغmX#h' 0=mIþŊt>s]*ɂMNu}}]@-]?U|bmǕʿ9׃!N#WCُU/˩C(>!=<Ћ;TU֍`7?Cp ō"2i}v4tEVh~`tC6AFm%ƒu`ٗ ~1eRxHM7t,{gz8 -o6X>{G^aaqCov:2+[JQ}S>3L5w=r'qLjBZ9졐B&1;YN44]yh jC(ilHA ːw[@vM|ah 4f335 r\11cx2JĂukWM{tp؜ry`/xj~ CuF8sB~նjwjjc;Lm5vwұJ(hihHzluyjzn0xXif21z,/@"zo&n₏ο:yW柊F[Md"^1j3]6I!P2;u}^?LzqnYX35WMU_ͶǷ-b_+],!> ۻ/`,| djG©pd!EHB-$M)e^U*)l_1V5<%[ #r +^p}:A"mFeL +ҝB Sc&ap7?-z(\qo! t:Xӫ~D=cO-pGahj]a>p8x,YK>nq/t^y:#sɫiA 1*~"h|pbܯQ'Y%z¶|/9x +` &sCdu-Fϰ&!tsQ%gU,qhP#"']*BVG}(%qDh +~~ˏ"ɲ*+z`)L[>H ^HY; ,I "[wAͱim>,j}Z0s0tl qݮzȁ ,\ Bc,0wFf5d>4q74#9'+[ z!ΰu'ZQӹ;P8E' m$|gHh~Ji=0+ZT)z V*z[7) SgHd],s < y'5>O?>!gBZy/RZ nnt6 _DUrR!>X{br*hŲrJܚ;&39h^Nk g7V7b£;܊].:i%:atCw7J//#mw绳(Sy{Tc] U&QO9yDbp(0%[eI$ [*֊ P?˪pUvD"?b1HXE #X@?,"dygM-<6ws* _*ރrBTs<7$9WZyQQ:F=І4̭n@Yhtb6ub,\J΀h%nT&J C3kP*V(U$R#|a]8+縹[L[qk 'YXJ`dLЂ h"izܸqPXДK$QAqlTG Jb`,_!6A9.z<*L0zp}/W¥!3@:e}.+E,WmGB(t`_PLecl۪ت/ T;q?eWV74HP:I&]=s KUlݳ(L>+4 +_h/U*M㎴d\΋dAbAp*=?.X`^9`kPr0vRq"m|修|$iPShc5zڢOa.2"F@PɡB}c8:#QWe :@!8@ľ.0smקcͼO^Y[pt,"L & 􂕭2@$ďDej4>@c])XH 3: x 7!?{J"]HHbͧ* _ #$U4nYmPsJx{iМd1#YVmº`EjkFp'8/$ U0աn*P_ԣH_"u+0nݬ@9]> 7AHm19F+S9AgKoc11e%c|2%JHM *ѱCI6awf2*7&FPH)%Zhm2+Ώߝ`}q[ $uLվ!O @B{e!jâIp`7 `), f4jXK\o4F)|1F. Ov'1+8+ oޢܯptB1H 4(vkӡzGj%A dK$;0QDH\\)WOUN:I子{ 3x}&(C̊5s^ϧ9TE"ZؖD 5$˾5Ls-|wхBInKrpKͲGlaz|Ʒ[K,_Os8X&$$O!LNs=^#Π2 с1`'!g9cerve/wY^1vC/be>iVjq<<Š3V2U[s?N-LkFTlqax%.}"-͸]8$8d!UeHm:dAڰܔ%*)"P [6 5nd/.^{c@_os)Bxxceotv#|J)"x[V߸x /?"񣬂qƣDёd۫ bU=_b#b~xJ%5AUм4apd\^X{BPI y> =N 5'Қauԅ@H zc+?cV)q邺LRx)'RO҈8}敏KV6SJN&_gGۨJF* iBS0 J0lBPMc2R L+dg$ˠN6anY«jFYULJ~חe߰E3lpt׼a vƥz52h0`l&aJI8riP 4"\x  +<z5JH)AMzHDxn,ps !.^RoOمY߰KFi žNP|_p|DKԫh  ْc::0d.SVRl?(\9 4dH*qufwB0gXƭ]+و$W1"%iUh8ޡ"Rt zwBvtP>yr/V*6҅ =uU18K\Lzڥ`)HSf4RR%p$,jʍ(S–H/a `~_msبXl⮅9bǝ$/l4lEySjܛ x-{JL4PH)),EzڈR5%1*RqP,HMoX`*vMy@2(-Ux ~L\쓠9;-%1E'l;2T'DC8j\ʂf_*ČF Haʅl*~(H'S ={N۹{..r2z3>i 1 ť(X޲71 /XŘ3[ iR -K5 &%f}TGB'$`Ma ZPqǙ{P%2(R9ju[ 587mT6*n<^: %ܩPcP*ybC%49c3**r+ ɠa<Iᑍxe iFFS!h&"#iф)!U3@Ts#ht% g]j3$AǸmEGi 1MǜTc-VvhG2pT0 Ʋq&.c\-}S\i!YD`; n9IoL&GљEXtaߔNt^_(B=P^C)`G!ŜHU)PwSS㊝ #/K8mjMsw50ؓ}ɅATwdHČ͙2l`)c ' bG)Z 1LDvcn!eG/Q6 !SX[8Y]:5'8DH=^Mh 6a{8mH#Ø;rx$Tߟh<"DQ"$ IP5S{.{,DGa$&d͘,?fJ!RCe)iH\' /u#I'B$9&l7{ؑ;sJ2y[-HzzCd"> [AG0a/LWZS@ _TTe/,'">t6n#UV"{,L@$xtEY` .r""b{?-)_ý4ʮ8|~TĬ!'1%Bd5%[#R21\:lM1m0 Fg<suFTKX|N|j9)f+X i|ҁ{ s\M+=Q |LD&V`YdC}-&?xO`\IQ~A꫽)@rf^ H>ߗ1i Y09+Ȭ̉~Nb+}\ZQ7 CC*XvxtX\u T9=uoh%bM)#O$%Ɨ0,s\t|"Ͼv$CkUCW  `qEo; B#-~ױ<&#qot mBk"(ṤhQA:'H#ư4bLoFS µ"ƴ3"лv@h?k bŕ-wa`v7邀 bZ0% NΪ 82 I-,CFx5Ef;dkXc|`R#eiy_8$9*X 8@jaALpIՓ29nBI UMJR-A|l\(ŭ:,-(Vl2< V9^bHi$E#]wo".. iwIY*Z:#Z zWtĩ-\;$eQ|CA!(s#똷$P%RN!4;rNH351WAyS/kQ`Dȸ Ug\kЦ|uJjeIvAgk6JҴBUH(|{_RU!zKk~{_~/s_Qbn1&$Ie7+|1^=}ֲuƳ{ )GSơ#K;"x*35[EI!m3[4 ^(KJlؙjbjQ:@F]a;w-q@pʈyF:s׽W3j$X,,|8qxʕ!+gߊFbb&%gĕũ f __j+/."lNp"Y%"f:D4q@}$W(eW!ɋ2=T>[VUɫr."€LK{+8NG|>O-le"ے[uABZ@1 lsz 9ژЬs2Y1Vzl6xq@@fo!z]a?m% iC%N(b!v *THT%<Ĩit*T+KӌpY$3 K*yFE+]*/ub;b>"@^aI]eu0o | HxB[vOlO8lO1ʊtRO ݺ{<ޯ0'lx@.xǧ.!() Acұ$ A Kۏ=w7,/p}ݺ43z icH?̾*CEiT(˪uX4 륥΀( S3v2gv$.!tuڌ4=bDc"; Ԍ"4<? ד IܒzrB`<( (g }n+ ܽ 'vŒٕ;istq@Z,vj H75Bi} wOKb6D_ E`#Kʜ=W,x3xl¾҅34>(0d(l]b1aSS4`@pr nT0ßhS+On<,XoƃDA:uDRi{wiyN<+0ڳ?-, W"]zFlV*Rs&0pF:6KPe\!'V4RA?NυC'a_R64f}B9G|࿊C1-t_$&zIx6yD8{)8G7[`R>ߖZ-697Kk;?h^xL{DK[[ГMC9sŠ;&QaA-x|y?>O8Xף>V7K8NSxpXᒟⱾY*;Nrb@ ,1_>y9 Z,4#,і_>q-8'C\\~,1_>=N!{H(h ymVrsB Xfwsv6NW*ΔQ/ܐ2y?*%E9ݔmDY ?Ќ4̰]kȒ6h|bI/,F? 3Rf~{ Za D+pnK@=`-f׭uovؖSAl{t2]fЋO]\|H(~q׷"Ϝq3l[Aq#?^tQ?g.]bSu̓x;f=LX* i|l;\@lmPY҃Xr'Y8<o_0}M%o= []r ָ[O'$">wTq.ښN":"uGx85^ܞc . YJhUzjnⵠV\L^53 Is@o-e;ryL*,Qߕ7d/P BDjrF$U@rrevy%sPM'!)?aږ9`&so~ik* ~Os?M3L$x+gc)M*/GϜ C$n3ƮsD dɣtPin8uIPrb~ÜY2֦?9s`ދD?|L^Q+%z'^BlλexFG-e>.QO~ ^>3FRεn>jEVHx"x)i2~`)[ΦYC\'YH} F/>N餑HJEŘ/E'xjwKsFn!y@dXQ@ ]9 %^_xRrgN)g5胔4X( 4 p:aaT9 xPǒn$rs9'cOws9.s/<_̗3ǮSUu-[AosQ끡uZ-<'Zƈ{5E[KzIv<<( b-g,dgu~vkF֜1v>{z".Z HQEI@YG\-`|We-( >(CVjqJԂ 6xP:}@`ikE!jAq<`Tv3܃Rjs"%O7wK)&{oALـYS}iP iK讴1HUZXIыRܞphW1|.=+"@/ D^5^bmo*ԮI? s!Pv _;pkl\9<϶ ?Ī9^ZjB(Ր}lgz5jx"$o8gv J 'S-?cu`> =x9w*Ȓi@)e' 7< x,Ag݅WK0Ph#E8 upNWDre9me热-?(q' WK8q5m 氮:\%6̃ l=#X%`i{'vXO|q: gviˏB?eHcW{"-FȠ!0W;t:V[qp=kJ{ "!S'6&;m _Tq'.7Ż̻MN~O|nNnFpE ?`_Ht= 9(.Qc):R1v+͸mq KgZ:Vpā(^u' u ='W4beh]VyC=$Ibc}e:e˺ q.,SPs`zr]khɆÞ6tm0$'̄!X97:|Z˕OF/̉%RTq$+ٱhp: &`gx<-ЈUpO8"bIdzy^2hx!\ia^nM<f¿bB 9f`5bd@``} Zc菀 GJ/Ag,? h.%]aW#΀`. sJVUKhY,_~Ld %uQ`s{1H%,?}T=:nT/#%`L7aJ{:RbATkSbބ4m{fki Xjg"?ʳq5  }Hy_3saܝO(6a2jQWt弤no> JWp[H$d2>ݏ[i\%"Ћ+o(U}}s6z&ovz Hh@>4˧Oopɞ񀈖.M|pwc&Z>Rb))խHIs Q8WI3ZI l+[q>eef!n?PG~_)'y e{k/P,GamL AיJ͜P7.ExºRwVRt^ІDP sx^G8nGr`snHLYc0(Hݳt Uh1S/>ñ%,/Zذ 51և}2ziewRՋɽ+VE^6_{ |^S"/$=5 ^^_}çT}p`@nJN~(]LJxΉğT,=j|<<, \%m1 k;|i dࡍEBlG XmBvRGR)F"n\_pHnbjt"~;,:xC":ӕF| v 㴴.Se4x$}.MO-bܷg hOPXԤcD M)ґs|K( j3?J h\7;.mʡXt2ɚZxrqh'u_*gEl;tDf\)5GYfv퐺rH38!6 eM'3Lx?r!@Y"BY{{>S>f4 zOjQEOWvԼr-н 5dN#hj{}ј)C* h|`- AT@! .u`x`FvAplx݄y pLNm$]IAr & =gw*ې )e 9nw -@\5L&6hxtDz1C \|F1a|BSC@A :p2v=-8?>npkVucRޏo3'$y rwK@c[3 wE?.ec("RE(P~9C#.5*RK::X&(=%fL}&Ĥ,_`R#3`ZėyEۯ|G% [sLF WzklѮҍe޶lʡbۅsVka@hW%HP [?>PJ\z.Y vKeoy}ݟ5&D[fmJeO"`nE)k1d~z5 0"8VzLfW-L,$)&WiK;C2.KcNjOr$k۹a:8es>C̯r3(U+BqIH7Jp8hEs2>Fd 8 8c!πy2H^ rk"T̘p!EdYPm_->W@榶4 yd1gz!\pȆJ[Q?j@[S?`FT;xN٠._SnLۍY84x%w+܊Ŭ52uH&ӿmNA7SXľSJ>I)Tc rB >lM`M^!,O  Z76ic0VJk[KB2Yۼ%PӒ 16^t8 UfSeg{`h(\UR Iss:){Sp`oI:b+{kyB4e:ђd-FK۟hƍs9Nr8~̟%͂K9ֱf>-!,k;)>O?A>9ѰF2faNs/8RD1){½Y/Zmx"<:Xۑ bS$&כGwLˠqQ57x2^RGUQv$\0ɼ=`X ~i p&1%j|s@ә=?x#H˛)L!xHAw]EHhPǠ[H#J ![Vٖ}lfN$DvlDdB$fښH%|ӥ:C2G pR2c$T,= l+9~¯ l L<$h~2RmjOy)tRW~YQ5)AP[GQn/- wܱ nRXOY6_mXO|o54gnK NfKgK2ޣ/U{/{ީ a JeΡu&EEi~6. pۺρtƯ=Yj~$Vt<`MmI$U9`p,RXǶoGJS(%<~6ۙvFV%\Go5C7Srua_y1yr͠w)ht$SU$ynpbV0I>B=Gh3T' ۮ%GVfZdżlD"DA+pMP% Z3ì#~*m@=6n=Xʫoczr O# KpN+l7*hT{m01jF]ۇ*\FeDlc&`AgM,1*G 2Y'v>hޙvhX)]Lt&aY`'c,%u@)>ӿ%e܋.1T?`pLj$8;!(0s:kI/aG1yaxN%\Uдáttka<zI(It eg^2ȸ`q<(^l} \QBf+ʾQ0pi)NK:`YU]'jV|z6D1"v+^[Ӭ D Ӻ ab碜315StY2,AʇZgxy=g_Y1! KAo{wc~==% KA*;Ӕkh/b6"YwX57섳/B_k-6}鸊(1%ZN6o/9c*KOt H_h_DE$Gd[M +FW1x c*{hWK á7p~+sKԆxX^d_amiFwQ*=,c}9U o9# Lz',}o+XUŽ+50BށA\YCs)6wl5chAi6E̍hй܄L/ !q9VO Zk CV4In\P!-"vTM!dž5Rϛ$iÚUv{-P5,븿-&_e8 'PozMQ:Tutz(;w,̸̑/DLynX4SQ2jc+g@h3:,`Em[g~hsaN?na|7%@)la)kynY ձù*/밐WLzN!/ .^5g((lN"vdW2JU;R7l;FIGPl 7 3RWAḘǕqܦg5 ďC pƷ^u@{Gnمh2Th$ Q:~X"|> R <:%¾S@¿ӶP)"&¿b9w*SSESh7 fY} FIu(@&mGP݂s8Mɫyΰ%I Kald{QaO+җhQU6cb!6(ЀʤDK 0 Us PӀ' 5OEᐰjY/ #]'|Ә"=H{!Z6⌳)`,w& OcdmE[:a}Z2|ŮvV]nVlFU)j@c"8WDvףz/pތ#3,ALC%w0`aTu>њCnP!Jܘ ]Yv8!No Ç#"/i,F V7#I+7GXαbrmX P=+Liᆞf"H<$:>DB@3,{ **{@Z/97^vcJ ZԕQ$Q#,ٿ º#=MV;twvף[maW61u<=yoCߩy ip=[3x1O[:S5U{he1ܫ ނ{{/&f1LcSD1XEN!% r4gS,`'8{Dya}d1)Kt6fPH> qBㅡ9'݅!L!~P6y1 6fA`PJcF 1#W23(m'>MpNq܄Hd*8 9^j/yAVb6?[)"+? Aa{:󉣗iG{{f([\Ƙ$mېC@#W%RS row2-q.`J{܅[/Hىv]H1 Qd~&\e>^`:0S\=abphY=]wu)nK0%D#d<:&h9"uov6DGIƆ>X2YL,$A)zLRALw/Iy8⊾0"c<69x<ÎYӄP(vswQ$eP?%}bD1Qy-ML}6_uIU8/eBU ix#]D~.Ń4<,ω˚ VZx6]5ܬ=P~^=[#S>|U^|Z-N&H7Kh~mi]YС C=\Ylpz kytϖ^Y9#Tcq+|Ÿ kiNC:xF(n0 4M<(9wVX%@]T$W0ߗ[VfpZl8'ݤ@&EXBM3븷ver ܳdh[?"|$o]q`,~ۚ*S/8 Zjp=5ne 7? Q DdmhOH YHBJg%nn+1O;60Jn`t 3sUr=&49L%z!J]6ԂHFLgz*r2=ocIs:AyիL9I۶ 'FE|awiBtsåi'̴ {ꏹZ٩!u { 7M;pQq|}%e= ~]a8Gx<Y#$.%o?L( JIm*Q?$YZa/!<*+O*(c0{{\-|aT6J֘gQw<%S;[-^LW #XGs!f5i^2N1nB=E(30L)1P``bd1.P!@ n̝`wFo0X8 QCS_"mXVh7Ey3ޥ,ATxrhJ߬`{4kRuk45s&|̙iW+watfVf]tE[4d_'*$7Db ~0cVi0bثl$l~=`!?èQr\ju9ZSk,O6$6D@=LƸ3S~xqeCHٗ[T)Ddِ$xt^f"oӺ#]) `2oFBi0cޒ̊kQ/{iffee~9FitL22 S`*2HF&vzWEs!y#a#rp:~MN0UNo\di3o# W.ziJw4H։cAhMQEzd/f,&Xn ow!Y&My#Ű0"Avp"o ҍ lڣ~=f/xHvJjvB7֤D^)HG-c dwŕld@rTެrAdy_^ MCR~=_8P Z|b񤋣7W<Ē|&3Z0#uT]rnC%>1c'gPP30V?%Sq1aKj{jJ>)}ʹ G+uU=^t<`Vos;)K[rp%# h`[  h0 bP.+ \峜Xjj./WwHzəWę2k`f ?sYXHT;ҶzZnۓggk6T AG ~3ΧZl67 Bk")zbE^3iaOh %n'yw^. $1 a`wx:5$@Vla\fSL^ĨF%J(0TPe+{bäy40^@ (~=יfi7/[L-0 YGqjdRu T(om;O;bz^17=Q2j \7VM~ebcr fh&n>*4iW9䷖y`bJ]jV8:9a@`~2 qKCf(XM&Je@.o$EF~mBכֿ`LJŀ@'v&C`8aB"C*0D̩3O[!-Mi{s?SG,e [(stZHJ~wqx EKxOQľura- Í q(D 683l>l.Q=,0 iӨξ\wu!AiK' Pq~H 1B~QOrfBJ& &4Zo J19Š A,h)~.rIYݑrigW$#AI(x)N!Gz7JK{ N7<10yuݣ xW7ڑ2~XwyHLAQWm.fSVLrn{ /%;MyoBn0QLj\a-cUAXEPdǠbPEmw3V_P(7ZqνKiY1y7ߪDGNGR1'0Q;u7Z<'Ҳ`i߽  ˱0Vh@E xj 3aj,@@⥫ JGb3V=4h9Vyn hkے;BsRCDb͎Hغ"' FcDHmP0``w iec :ᆋ!)iFL:!g- |-jZ6Q* R͍9RhT4h|d@ .1?[LHd/5Z"=u0jP/s,Nk \93MS 6ԔZFt& O}mlZ4-wDٓ05V{ԙT׊8gpVނVD_%N2h̉A\"-um[FfgNgץ(x-WЯ٢n[ `x]ChJ0*TbIըo@8b–|4$@9Kv#6gݡ~˰o I D.-#b~ށZk r$!tNizf{*<<.=))&=EN $;G;#TFD#0ځrK[2F#,QtmX4|lf} 6GSȕ1zkg jD\j>>h N@ܱ K`d`2K%mgpZm ]d1eoB64 Dm/GpoLXΌ:" T1wMsƧL6\x]NY_Xe7ڦRv*"'7 jS 9n;܆R ƉY%՝үYbR-Qػ~dS/VDP7&) JT2' 2|ܔCQ]EJKp| 7 @ 7Ry-#dE$]P3&s(9ل0如=tYL'朝ڴ*/`|s ;j)[x!vV 0?;*27&atG9qN(x n E 9._#<@x{:qxZ9 t,e { Ḝôbx.̈`uM!lCeߕoWiKV10ԩ# xLŘ ˒ e t] e;6{"*;ˊr&rƍ _O75_0?2DK0-HKZ魮$lf!fB0a.1;caL1;JLobE>y}Щ/Ш;|J9>әycRTђƋ6$go,QL7` a,(Ό;͉u ؜1)O\P_̲$IsZL􎢤4""X~9OE̴)ťAn;}Yͫ }V$>$I[f(5ą/.)D/DDÓ[qZjsDn]i=tgȘp_z*TIf~GWR"G 9\1 hj{| ;R?$ >]R8 ?M7AJ`DY Wa4~ifk;#KGPjC2 p@9W24i#\@mFjtb3, P|I9PkN߇ֵafT d), (4_(أ%4)<4)D(>Zqg݈`2Er^ XN!Z%ZrqiI-" g+ SG"ƫP-^oZ/8҄FۑzKx %̒ WI[s‚Z -CPLn9?j* d D?·ǸE#``^u}! tQ"Ϲ @p5K҅<1iJ|7Ap5xuKYX1 |K@ZO_~F3Еe\z3Ⱘ $'(}f4MLȰpBFwMYC9P Nv6sm_@g^pеj /'.jJ9jr+/;xD*{4+{1'<݀rgޛ6ukz}@K7Ɉ"r*BA u~wERn2RRJʡT(5q'ewyP6m k4;T7/2IC*7'Bw4É/RiCTk[T0qefpH@܀jDMn],|&`MJq|M LWg熎jWz}ؙܵc^6b0&7.saiLL&״capEkƎfQv!lz,a(KF51v/YA b3U_ZѦ}{RU GDEܕ^V:_{]d͍v)ǃxyi`^ɰ.ldBii/'0L ^`ʤ6;h'8TΙ[R9ඃ*A+8@1V|K 1Ƞq+4Qbytiy <'b-ɕ _E8=.)K^L ϩZ\Dx?hR$I$i ߧ'؅yJG2Xx(k/@mjp~nׯ +Ho|"-Ml;'SȚT$4%c/VL#N;JSQKDG,cNPpT ~CgЗRAC0FG^fDK-=a *E<(fAY%": ԑ.H&~AMo  0l5IZBBXԼ 1mD}&qe-(*6h{.1bnr !Ѧ[AC Ufcg .g/ ^|=:WkG\O獥Sg$)>$#\-5cX@ 2ċ!m 4̯D3֬!]-Y ؏dY!tM {_7QI1`t 6x+lzR}R_\sOt`acNY7;L0ʗb!Uu4ۑ`%'蕁H$aD;#}$WUU`C*UE&:X҈`6IyFj bt"|5)IYHŐ,D#$vUR..7ڟA=Pw?,S%ؘhaGlG%͉:sa'R(xWh! qq6udL$+rྉQyc"?6ϑcC 5/2( = 랓C*5xq5X6~F3NWLt*084B^H`bqa|6!*hI/aa)wJ]jcP.PAfƀh-!^3E9FG*Ӎa& VB+-ɹ& IQ($9 \A¶`7tk66+DE \m>ͮ F>ԳXkj;)mP}DHwK/7]1TV7e'yS- Ѡ@&}h.eK\#QW1hjF(e'}~ ч|J?|ӞD%o,"Чe넾ER<(aԆ(^(5Dͅ)|EX.IMOD_^+o҂4,K)pO*#7R! D䍕+23}5|!˲l &&JhrbOjNo!2&ڕ-Щ,0]|2+fJS%~9Sgw4BX+pTp#@ȸW0'EjrTQu0w}X;OYWP[=FH}v'v.ƒ1Bxv,Ⱥ3Lm-nHcuU\"1 !'@%Nb&ӳ Egeˮ74.Slㅑ=Rgx-NixEtװ/}?TzBv4(9R/^^]. Yer~z&?058I%ɉ|j~gS49cdE($MHUQ3 2KhB(J>N9fW9 G¸C56kY;_ZzPJpZ\[BFsDWЇķk10cZv!.XF(j.~Ԏۣ'I]^IWj]^qkG,}2D'؎ :K̪gNr FꭗF"E[֞kXa)HN_)Ӧݚ J: +*MA ܆@y7ڙ]a]dg|4ɭW~BĎ:p&#d՘xu-^:m7&lA)¨@0EGDuP&Du8 ܳD8)#ɂo@{zkKYpA\8L08̪뷻s7zC(OBCf5|nK i!Xm/:ˡ9ƋG5WIBv}bhAuzm 0Q NT<DQsX+x)fl;X Rt&JIm/X O,xA,ϧi33M MɕbV 0bK縭3&-qRpM\dQ_ c'@nI3w*F#熑5|"4h=KOrzbŬD|[M|dZ4oo_&H"#qLwܦC9r@--hiE+#ZdQƻ>Pqs0+ܯo6=U[fH`N MωNFF؄,9H$otOӊKbCrk?>@ r59&,%mʰqjMdFPr4uH"f.ڧ ᦕkXY{C4ssz4|xTiS\4A& W^OYɡ;?M"#8-\0}7te$Œ&&kQ/?^To,0nUapY &_MЦCE[ SIU07TwC&"ѰT 2*󿯮-MZ:V; +[=9snCPzEٵ_9s vЦU7kPLg1vIZ䁹rJZ,m!FhXsg*iHm+(. 74$-.5;u,6Pditgk +jp."*N$[|RDKz83eiiã>֕^MexU+I6d79{Ia{sޙ^t6rNƻ738 CwHBL9%+AGb>3Z E=|:V6N FE0 9TP qC2~@WSMud W}Sm'38a 5dx8 N˓>Մmٺ ]I J9ZZ<ƲI`'e7Gv$ wd3O7TU;1@ު2rf5^uFu41:pMmQbaDY,vv;y]}QlZ ͈kf1u"TޚCАT_w8_2H z `#A3hz╣M0XcvJ ?C)YG!+"%?t yanxjZkb24pfuş[N )08R}V]0̪]>Ţ@FZjQJΐ@ d _{O Ѡ^Σјnr,A6P@+Mmf }sx43g ~ـ 43bNJzgag: KsqbjfЀpٔ i9&Ԉ=h%8_ j#r&f% IP PsdLR6?A܀T&l0 !4XBFCM[sL_&Q<h=0￉{Ĝ2 U~IA<&3|2&9_Oւt4|rJtKӥI+}kqw3 *pzWFtoJ4%U#{ :zBc$K~W*u"ASlEKEj(@ٰDP ~)ZC L5UpB? gd ȅG C l56J\9~>h\FkFC$(/oFϓ*L$K3,w+0]sLo4)&ɏ@- v"o`(ۦr\'v6cfq$=Fg N.70Ѹ>qdv n+GoHp$"kF6;"s Oل ~L7v_-ȎجCKkׁ JYdB@Ze x̩hwFiO7y0)kK"ɬ8˜xA*ALR'TV`J*_,NI P;/%?" MCuE77Md4żƷ'Içfv.+ߣ* NC!xۆgԣս EꃌT!\Uc-23PX,B.E%yg0yrEHnnl/g^?/gBS׌j%[y2A{C$ZV*~@"Hn'XNX[$ySW?6mbZi5{/9xʣ9JD* H:GDh'zL1 t1!$BHBQ HIMV,RƑظ76gǵ±7մl \nĽ3ѧ43YjY㌰P#bi>ki= kj0H쉀VQXͨϨCt\'G4r_D kB U,K}?v8uH:mtb<-kRxu~"Vs'TS[ʧL0y $CkqsX.(83 Z"P#Q,sS(̐ ިd#ѭއ#3$%cFbܧYF .t WT\\riMp [Cі`T4WR8dP0>{BamUN;b#zS<y|CA}RoiKÅ<6d^ƴ:e-AB :7 ÓfẃA\wO/b#%'CLfC0$p0J8r9jYJPa6W+ITK\4nI' Rv#0CnDh$>7sfDbzZ:87l(cWS^W˛2N8ٷ{ =(zQ +97}',Ӏ q^[*LËq[E3K=U;biӁn2j~vA|0K$Dp0_y̖an}k9zd[(z1s-V!)ݫ.|)UJIh6K[\X &UmC@RZP'2 0)l̞`Ѝ5 `YE4D_:F2!Ը:yfQ^oM.F˧pEA,VD*E|, \>U84xX~n\$nJb"R%H:A3-^u$mܨT2z؁+5搕ީ$Fi_ `,g.N͖.)1h1s de݆4-G2_(ږt$ZJϹn!?M$Q%zJƱ* BA8*I۾:iߠrP7W{ q Q,sz6WMG:G-{S䵤J q0 \ӈ2Ɣl5b@Y 7;okS BۖS-󆹊/iqtdžR%E6:VєTCVUPMǫhR-R!(ٌ5? {elQǹi!WF+d]5=1Ng{^NM5N,Y"–X$ bb `c>Jr?Tȏ`7X}@-Z+W#<0aFИHfd:!6 _,^M%R+Q[,ԄyEݖO _K'i`02tk\(y^vJ;։Pu@)q(htS+={SkF/֌5u@ljuSZrxE M\BPLaqkB(^CαH%JeqoIJ) qm@Asszd?>tl[gʨg޴ocGUMlP5c]Fuܞ덌6w`(wQD<!09gO[ѭGR1Ro혂f9;ls@F#"*& v! @ *} cXq  Lwb`ۥd䱜 53-a 3EqҼ:j$r~lCL+e08>3 3tD@-f\A6N*4õT+duxʙDu?DtGE~P7sn<|V~ 8l;t4+mU5t bބ{F$'˟ <'b:#Yfuڂ 42L>B:gz+IDzCˣ&>麘䍵@@+ԉ ^&*@@Xʛ\q>dEΑ=nFzޘmH] $WXx ~7jtT mɉ {ܧ낍&F /%CMw|W\58H}wGͶ-N0Fn<|fP_ 6R (#v M](׬R}r;V{IbWH!t6Yߗ7_.o 4&2$Ce (̩2NnŻɕ D"E %sem@s >"bsLܗzB$X GB{qn@Ǿ98bmu _UAOK>i>> O@%V4`#ۑi무Sťqe"(u Koϧ0D)/?rEueQTFlZՁ2jܔ\Z1dTjsRv]%VFbfy`IK D<^jyE2i ژ w.rd{Xю%],Mr!|1X*Т-VM,0?SU<)͐bh"OeMn] (pFz˜YGZmALUh,zBia4{:z&qA:e^Fh͡02HVe# ʛk)mc$hZ qL'(PVcCJmno -ƊFY 0RV 5`-^J58oĜb =QPS4y>klxm''܋'d1>+ { _.^;]#=O}]}5MEA wgRͭYwLoުkY.{[ T i9ӈc<",v2 Rcqp#qكcviQ_M ~/n89 'yf{T~)O?{]M4̬D( ěGE8F9Rrr4}T=֐fi&I[0i`F9;z!:JZ Bq뮩\30: XE'~0d ")4ڪA%4f,%d=8X,V[eu ÐZ,>(o`ewDdiC4kGo eFed[o㖙[O-AEcoÆ;ZOBE)@$IPa%o蹊(yB^9%`03INNA%ۄ\v#b*>ث~0`s/moslr C &TӘg1߶&sĴ:vq2Tg ; `SHn C(הE@LZX>aT`QI=lH)%*`Of`@[=<54Zx436S'azZgOBbhܯGLӥ9?fmca̦O헿mV**sJ;+*{iBhEJ%:G<#`̿`IsK*ùguL0ܛ͡}BHqNhr$:f:et̅5|:sXQfNf:Td!+2)uz 6xzoepQ͜GMc\q z?-E#N@g+͟{#3#. ̤)*P06 ZPn N7{d/<SF?d5ZDYjjcţ:T8E\&bl(5̼N6kze~ <H*s(qͮ(OD 9O=\Y̸s0Tt ՚7 ql k2 Ōc$2 ѡƳޛZW|C6Eqע.&sܛ`xugaw]ZKa6#<@jƷoxo/f%bin簅ZojamxP:4 8*gtc8\tMc&Cw*1[f]7w3gi7Gq-Qs*8F;A2`bJ2 {l3"\.H(]bl5,pe<x %U[dAr0PLm6l16`g^!4&ul'p$in#6 a-fn}z>OQ0ҏdXP7ب^mDv:&sc}^!|7? 02k Pp'] dF"$gC+NX`t˜"j R2 >Ƞwډjq<jӶSF(ohݾȰr3|}e* E-Q C5QM" w |*Q a244e0wu4Op7u/- I^u=Th@"'2(Vzjtc\h֢63-mmn{PGt4 fLoXYuُ݀A*q v%[g-ސL>6'L:KÛ5M1U1ʤE–4\\2j>M$r֩c5SzXDX/0իÊ`'KQM-TF4Ӑ1+ȹA=,?6.kOTNJC+^69,ZDT3(ޚ!ʤҦuSG:7Ջd:Au>8q*Cd_Bćn.ثIORaA@I㸝*kĎ FkLq*3% Lç*X7.~́%2 ZPj4 I NMHб28:P .W㷢G0R'LiZdzIfl3{ۂů a"򀞖֓8|Hř2w]׫t}lZh!q]AH8B)㗿%L =y⦪ Jwl|$oL6*~.а͜pHsc4߁<$yX0W S")1yҀ؉/wX> y\!J]]!aG 9<3, T Wk_G'%0sJ&׬ ͐mAqW%+cs Cn@+J8' 3QsȢg7:GFt|E@O-柖3Z~apdrd{ܱ/ӟ/Zr0ːY;l^-r1<@seSSGf%R'-Y eԆӁh l6%[a!7[؆FOJf>YV oڂk4_(J;S+&@(-r+"YB U /jẌfLj5sS8o'EuG9>D_'1䔡、 ;Qr-gO@T@ӮTћŀ1"yoBe(CV8P4t0 ┧hRvq̷Aс琺zVxb%(6fHA…cK5hS>}j PYe8 u7Yp7 ă/>3SzKD<"Q H`ٵ|)Bx@b+ J OD  vh@/[[r:Dx=6*SsT"DZKwT)Q}4ASugz-٭כ[\+~zK:kВ B)A q pT(WDF/ԨW+Iwj~́MtL@Q1BSf zMObhQKa?ر3g(u)[qHr'3XQc{kEsA r o<b$D)saחj.oiR֕u{4SMϭOO2oWf2oأDƌ]J/`J-ys5Z4|ZFX!Ŏ.p4ڶa5S8G_s!΅%1cȎZՌp)%BM_pv! _i B7< ‘N-Gӫpa=|N~ ]ZiZ>0 ;) bq+ YO)[#K(R}?ks 8@\oV o\Rz#Fub])i5!k )~\I؜2o#w)/[׿ߝ#&=uO8 72n$]>*,FK_;o H[2 }" }X4%0n` 5Ѿ&1b3N4Ĥ7=ç1`6b㩪N!~$̀Wi5Δrl[k) T*Yd;ݍ' KW!ba<`\ u&e\ϭ?7#_-8Dm.(@7D(CcVSu?db9pHƂ$Vq"NB4NaH  8QN0X]/5+Dyn XZ 0É-p 8 %E~\/ 3|hu jFDF[1JL!]*c.FE.Oٖ7Ŵ](&>Lt\K4j*ƾȾs[ Z:e8QF+=_2ǐFӻ!̀%觥eg2Sf7cIDUP\3aӝ :|irs3 etbL=ܸ5P4#"O^JQZyP@&KKwdM( v5$ Y.+s6qLW~ݚVhff3N%r&6:FR8RfC{RS i4tkԧN#ZhzPĨQاrCT&hlm175`H @Y ɳ?b y=[O!5Qӂ ֺ\L`)=fБt08wap&e>HƊRwĈ{ SI)N*1sV^,Lq$ `uB^fJJ| (@~&ǖB0%cٔ8-($1y VRPϧJ\,6]߄/M I#a j< b&#| <+1h0y2-EAm)nt3CFTBʠˁk<%ŇDx}ɔ#-RD 5 d* |4znɮǑti9Bx!FFb#!t `$n>bS> !&ͪ'F#a C!vsG "G4u[tր~qdmy /i=2k\kVkxmg㙛꫽D<"W`ysi`] c·ILePb_\Z\ju4ĢIkd\d< OEeQJ|@\=]k X<XpmiDkw2t4yPsu\8ٕIt􀌀^~m#< P($ 9_D7 LH$ _$83-b##mUpӴ%v;à9JRRG%S٠EA,N(Knjψd,4Yʡ;;~&fl )!hY.j̡[3RkI)F8]ݻqy+1Jڈ(q M ;1}IR؄{GҨh\!=f =136 Vݚ2)}6O!ߧQFlnb{Sn4s֕|ECfY2O)dA-dD~V lZg3NEݔGVͰ qpO2=L*?65Ed@nmWI'PƙO G`VS +@XpH|*ad.RUۙ<_X/ QO~AJaQA2mM{7TB.XuzqĠI?ԮǙ1)\ҹ6"XDhSja7YC Yt,jR^~u(k^+QBȼ]&m^B ٚה3P rxp놟&b\nts!qA @t DeMڊMܜX)kD!z59Rӿr*R?& &ڞe# w .WU[hWFCA/BdԲA@ژOCyauP:ft~)yb&)8aBkI_;˛="6,&H9;=Ȑ*I`gnMG~a l|eY.D~3DɏSB7(s嘏F(Dj'].2/fL!_mS,(R,3^_D[=7z Z[|V;&e*w;x4æ:U> F:_% ,= ~/mL 30UcO+_s5Kf~toh^#j#) 鈎Lw_{> J2̝ZĜuﭩ C/.On T9`bA^ ̟ˈu^* ~:l ^BDK7%$_<>:'@5-꿹vŀ3џ$`,i^[pQX{k[aCg Cg?pFvO/oh/T}-+A 5yY ) {ŒbŲ ~y12e;{k)q_g0Acz fE}t"9=ς&0 &Zћ?KKKS? a^EP#1G})@n$1ذ2h0tDŪa'CO&+΋ƨzCjs5,Z \,a,-^Xo3wFB$QD1aXOujSLcVymN{yo\մH]G8.0`Ե,k6}ڰd,0)r`Eb -BJ>$?˭Ew@q] pײ{{O=4B\!JFt;$βqU=g;k&˾Xjׄ96^ >Ȃ婢 rTV%hU+L4s&fI82(GoE\I0~.J3`4!rF'w<ʹGC1}̝~)AtX 7 X*i';@i.6SJ2-㳕)6 wX 3 fp9;-F,Ry/9dx&rP'Dcm_R٬_.!4"~f9,ZȋVEVe 0W@|WRR~hۅ_W!izsHn7C߯@7Y2;H)ls5 /96d _N_N;# cAXtWކ5e4ylIr!}0|N@vdm"AtYx(ȟǗ1R@IbQ.<^x&? S,d rw/@]k=Gyxda2arcR7K¯qҨrEJ͊Zq 3UgHGטū -j3a*6 }] 8JmxhʓjBh`1u ,*82@bM0o[:vԘZ1btL: {] 5w )ݎ". l҂&Q9̯caɗ3vGܐ`tf]݅\N7 V[j>00l&2@Ē`@b6vO 2gHHFP+G7A40)Cʚ8ĀG& 1!5sxȋX\YY0au7&e 8|t vV;l[};yKlS 7-}nLz]7Svg56|É?,5cl1/D>w%B Za)j-mΞp?] YC3 ChЖ ~z6&?֣7/5<ؘͳᶉɗٟIdaGdY38uGc_"zu{&ҟKpWUQ/>똓KoHhccpv/2lEAݣn8c4i0eAhi45 GɅf\3[浮8Ƽ% u[a :KjP#Pcyl2Ƶm lr=.w5Gf= &̜GVv ZT9MQfkkccitL'% w7RL kv5ûl %<^rBkxʖSǛBk!DgR~eLRTQ"9ȂSZLlsmݗW;ԝ=D/xg'=H̭ l)8 A-B4< T.6| * D7'ncZ- AXdZc]ӣg̲|gs ]CM-x䡾ؙ6!mbWG$Qtc" 8-) ɔ܌SG5B P%DgUiOQ 9GфB2Y3Cԁ4w~`%5'W敾90d^>vVoJ`%&Yd*#'ߒdD7޿Q /L<Ǝ6 5ak _]$ *C=OCJ@c4,1^ZPJN4\,tw:-!Ȭ7uOwow;M%,F7`72b0^ԑd)mϓ[u 'r2nܔݱ Uec859lw q^B'" t(؁n/LvW?|_z2"({%@u)NQ!GǑ8D(]QM(Q [exI|q\'jc/Gq⓯ OmwmT4YS|1O%@3idbW+vG㏼@$:A)N#ֆ$ f)fAA"LN(_͖p%Ms˟ھNBeRgy{9즰6$`Lo$su?5eLk8RI%. gbna/Fi j#qv]7$ԦWüy͒j_O(I~ ׫Kvxg}l81Q <ѩП@1 QOK$u~mw??7术1C:n=/&;h]9'⪶He˘|wNcx↋`kBB 7>f9S3fWQm7ź?71œQ Wsx[G|nbA,{&8=dI:P!3IZÆ5c;##A2Ӗ~[~ DB #G8me XΐLb7ȑg}N KwE(H1I+ܶt}yA:{2Fi}h/fL֜\,: +ڝ5&W "эs̺jCΑ,$^kl%I0ULB PjDS! M J3A]idK҅;75J%fu%xÜ#UVzI?d_>5B`. إS˳#>&D ּґ@dצu7z6LD#1w?Sx^љ^Ip#!ԍRs%Y/m 3#t-/+K9:!Mz/aMw+ipNKGjS/S^8r/m㝛Zu'GG/\H&PjۜqշP_ڈ̻M?7*TgS4Fxso0 Dި~FSsB_8;-سIEo?lKc8qp`P85;خ=076sd3C2^?K:1u h|>*nln!]\Lkf4fDx71)D1)O]IeFtLӒ HYCR)Σem h~:jK.=%f>VC6E_ҜQnVblx6<]#,G!*8ivIZkd1.8 nmRxQLv̧4Z˚G?.xITrLx݃mg{4@LiR\/mb>3` m[y]_@;?"?G"/d`h^lSq+{Va4ա2<I|Ue#;m!D;΋#giOOFr˼pcwKvkIW#4j38ܪZMwP[_ې?V_X; X@mpRMj sՉJ鿶A4vdAuzgbB@Ѫ4+cp;ӝ7SpgK!^}LFxCC)>iCd MU]kWXwO]oIfQW^u7[&ʐEK>E Ø>RL{~0 B0g E`#4x]vLZ\Qa_NS OIK&̌{' m(1/s^(Y3sej 1{&RSN zq1e->W8AƔc2njߍDW?l ~ּb8NȻdnbbBV ¶ 4H/c8 iBb$$Pxed1:P\vX|/M `xX%K`Q_TZFf-(K pFr7= lvŐ}_^fՍz]|Y- p|갉ۙϷ6;o4ߘUr%so,-f ^62p3WoR3o)3^6d2RtaMxt.lŲ!ZCr?t !/5nwn f]yRz-rm{=_]C.>>.qLnX+l^kF*?^eaHzH;KBPx4\A -D!, =cR:Tn6{4 j_EĀ5w8[wc6V[&*& .@yM)N;j*F oyǕں0!r}~vl9KY;>w6XYbO?k#f/w3xZ<0E%̽6)JRr=0KxF%:7vLZߚŨz7gF:Mz[ sݼַ0R\5S. ð=&P;wdž'yu#KT_rL\%/j>xAC4r,siv1.Qz2Jy{VrlVZЦѫd5kP} ?>Jst@I.F6 6=ec(!,OM5F&Ovٯhˬst5E lC8t i<\.K,3H4^#Vx?e].kU/Y]âͰ)QHD>zLZ(fGC|A3E?F1:{៪IAR%Q˓ܤ&KCjkfT#CA7,3!+2XC}~03^Fh»="Vxz}v\&+2gȉ^B):s7xuY+77Zm grMU]#PN@P?Xes;  ^;IߓnرB`vLc5-"}d;t3Twr]7|h@BhVo1{9[K([N*c9wS%څIsZ  p^BtOgWvFͤR㡚QSiR[֬3P}"<.9[ F[`9e+vܡ Fl&HL*Eޡjx󀫱>mo)=jPrHQTxr#{,jsҾ eFhⷴAc3g; =Hr9~qcp7ᎇ0LX'NT d]+@OeE;ܭ7]$`=">oC9n` CWH` U.\RKkS-A7k7q\}7\}hH[IC/a ]W>q&(d .|0/VӺ#i! @;K-hl43p*Gl"]1(wZ!5p8+7"|۱ 7VT0__y^ x~ԖIQ(6FqERpgwlj*";RHߨTL&쬏S"T\b5Le߶{YͿ|R^| 'mشDFPdr y{G0&90>2ҝD·1ij5 3j+Rch#93BsaIzZײb[O0hƢ)\_CVVGu^ N&'ٸ B7j&x'Y#0%X8? XHYoIк_1{IQlr7@6,kO,Ћ.2OY!@~@ci>C,WA|(Xn$SluC7y,{8#UBWonEŒo rropG@/H`'oJX;klik<2 WAg{q=ӹQ^A 8@%V XQF1`T6)`K0$0vj!1b85!wҘ*N'LnLSOXn3C;;OzgZ]"y}0G.Q3I!ʎ2<%v3q™h !qk~q nPpu! womdǷh/pqzP؁zy(Xb Bk^<ɵ쒡s'{" j+< -4GHDs:,]8Ñ:zY#a=q/>/o s*0،j,ahT~uw1a j*3RE֠`– \=D!J)BJk=!5JmvR"pǚ 'v8) Y\FEȖaG@>&PD/V*aM c ~D`)+ln3,W u (%Y~'aiHe%.xƥA(ͣpy Y'^S.)>kU4*G,W?$1:T^oǛ{^C#]/])#>B^ÇW%= .bkol':?@=,k=\F"NpԀp|ۭi\zZ'f kbYMRۅD+Ggn0:$m%,ՙR|%Rn"@1lI]E-vM9p|maִy{_=?P/={ I>`}}M8#-Ͱ݀vp=AGJ<'zfuSh+ƫcN7rsz)Ll"$L# 56giٙ|5S?9Y1Xi*T(Z2|k|lWZ?4.ܮԧ6iےF|ƙ\vٚ^#:i|"%, f?~̗rۋ'[&e˸u}BFn`k%# ;?[QS$ώv:!B6e2I$Og(k@[ = Cd3S}7H vިr"caKٳ:ds{Įu1tF>flKxcf6(eAX/ݓ^19VI|ɫPPJm j&eYceLa{PO&nG|$0-Λy̮y,rL17֣J~͆^6dKDDL3!rgW7G+<a=0k J5V%/ wP-Q-jIX+b( u<;d$KP%5Iáehx{yD"HRVe"`$JQ]r:5+XoܖN_ӷ3#i}:7a4ܙU4Y+P_$St:̦~v5ERCH֦@u5~ Hx)P:Ҋ sG&wB+أT Z孽Jw3oێO]\OZ50^yr@IBD#/ӼHt+ Gmв`/H%#&vsh,4S6Rt{VPB*yJ!.Aβq`zie^`Ua.[RM̜!.@ W!תH~> ;oqS^1NbM"ڼ"=j\sR`$D'Y8r,n/f]9pz(mßnoq;SF.\Aέ$ *=<{o^3p*^5[szLR'D-b"I&"{*X #A>/VALuq%N{rDɡ"l^*G iE2A_|Cw6:/$X&~eYjH(ehNb@+ə\DI|ś-tQBOē<\^hɃ҃!kI^'X ڍ.UX10P`˄%^YKxoβI8g4L@w~R*~p$'p^#;7 5R*( ,eI>`^6 sa9ϡ00&Jz/ f;c37+ ƈ\,@ a' NXHQC՜'Z#ױwּʅ9lV|gˀ軉iP#*3پC쇓 =:=Mef L7EssP!~i.&&1; k)C[ͺ*{RPuq}x](cy%$hؙhZ{NqmgqHXsvP䆮 ryaT?PvD-}34[Iww 9pC X'UϬMX|a{ksDÎ;HCkHھx5H먳)҈LRhnj[^b1wDǧ̦*D1$P <0|yHW4O+YxCE wH..Qa:cOSKZjy~ItZ~^IO!`/k1KZ][!X֌ $cy1*N-KȻ m1R*р[ζ- e$%& J d^I.䒯@ip;qr{,5#jH\~E9>em,_>nyY6D.7A$ `quL H DdbXVhqG ֏/phS>`P .$@ؐD΃[ύ3n 2C*fGxT_ j2AQbXy1%zuȌ!ѵ3Qbޒkm7:Um yG_(IJ? +ČB?yt*h7gۯPKpY:$ $PKy.F]angular-1.3.9/docs/components/open-sans-fontface-1.0.4/fonts/ExtraBold/OpenSans-ExtraBold.ttf̽yxTE7^u-tw ٺYB҄} aB@d ,"ʢ0M*ø 0: I}??x}nuݪS~N3EcCkG]'xf ;tp?/!y<,VN)9ve~uzF]SoP׫7ԛԍ&uEECݮPwbl?nemv%};eg9>HYS~@_ s5w`I^a7#o}GԇpGET 'WT╞%4i)CO9.KU 2L-Gs;,̅X^9 gcԕ}.Hu^ ĵԨ!|Yv[\]}VT8Vծ)7|ӟ&;O\:Xٚ+FV>Cx I!?LYOt4wowο-JRRPT>QΪ\UUFRSj7YRsxN 9? 9CPN(/Tz. ]2*&p跡Öpj8- ]S'rةSSy§rN J9e?OO?y䁓'N?9dߓ}N:=iMqlg|d_d}vz?gUF$ƵLS{?4 ˜8cR@T_lP\bagE83XgV zSUʺ2V΢;d=YzKXP~?Al0Z:Uְl$:u.:;ճIMfSeil:s6-l;al߲߰߱أq{tfIg)v=Ǟg/UbAj ]^Vbv3ۭ.`K+%l[Vs}B]obسlW"u[V v~P{j_K͞Qb/^HA֨@JDe7[zmNP[N +e{Y^'%|"5| oeԈy]mg]NRG5+&,/]$VO }Ԯ%:XwJD&Kt˼l}X?D׺WÑ5d3)3=)3-I0K7顛Lu1eS&{7TUZ;VC^!]- Zaoyz.zfÓ27OO$svLOqv '*mSCaC3!_2=m .zzYq'9gnۄ0?tK M<<qifX7cA##7GLh9J6 ^Z]~L4242}+v"6o$4F6K2㎿֟8x4yf<>2  90Cozh1+K#h\RB<\&4i?X*KX w㚅%i1&n/ѸZy /Ŭ[YjMsru͖kj3Ʒ|()#1]VVj+8X`y g̼ri;y֬ fܴ ӉLCU\\,QX=AwcŊǰaVVlLk9ɬ⍝<&,U<bf)³3Y.bis,!lGt:x-F f9}L-zrrd:x9 X -@@=fǎlqf6Q ZMX6-V2=TόaXzPu-vn~iҳ i6-6FWPcH WU^W|Ng"U{99*]y=ջaޣ"H F牭%IˉK]#),' ͸Bg,1OCu{=`P5nCƵЦm!e( Q(Έ 8QqhI%p534'1[Ao|[mƾs/{q~ {x~G ["X&wZR-N^ZR§BX ^?"]+ır3_hZ)٢qr"|, %WR=騮&c$g.H6Dj'eqV iy]wyG8D1 +*ޒY[ =6ɪ{`w*׹6sb}\oR)/TxiG <'<'bR7&\Z?;quuB Kl=*aΝ9ᴙW=2qJìFuRWN2<̓0oh>ᷜ8C:mb:)iIHɃ-.0PV0%4*ѻ@ ʪyX8ļ򕷣o./Nф 8/~w1~_ 6M:l*g9!̿Dj?^(m"ђ/QC \a#N;߽Қ([ *ѲkT%e^Af`Fc^Z~:`ǪsJQ z=v^`Z.p{X^& tF@DˉE[&*&,[O\[ܰq>5l}6kbgݱޏijؼv8fP̹-gH4=#U;Ovd$ X1n+7O8yY',˃= iX]^a =k9çaU ԾhԤ4yZ8p7joXw)d҈[v=}}|x^|޼tKyݽzN{n~_a { [fLjIN U"*4K`brDX݁e+Z3IbxumBQʈQ>(;+uѣF Nތ\&qx,7Oe;jd`DF4#EG#AېqWg$TV  pܦN<>fъl@uK0[Xo>c&NTxu[MN-NAXNB&ο< xJ(a)4$8.0ttFZ5RxbÊu0# KSJwI%bˏmQSck~< >_jx㕏ķD+4~P1OPr~m+Nڣ8Ǿ:Ʀ9,OdM^ m!*68s[aIJV% f1-N_X* x,J*u)1b`$'ELXep.jLXJ(%YHPDGW6SbI򩡂V)%@O=B-ʗù,rv"kn[v~ ,tQ3'.}hYt(_ܳ-{brXWvy˕v\ܭWo:Bk, Ɠne9 }iD $@2`&B N7zH3ѭ(Ě47l*=tgQAExX؊5M<M!nZW?\E#(_3zIS_8^4kx牿>uवS o,Xx SE0v9DIjQPs//Qa9t~0oNJ8~ f K!N$ȵS Հ0AhЖsST!:fXRTAL^٠t & U$%́72=\<| 33_9g[]?#)Mo|>kl.h$_JDp35d̒h d-U5Fdkծ"k!Z>_V{=|SB<)W>:럙#,ۢGk JWOt :<=Lpe"a8>~OkB}t}|{Z~7_<٨mIlO&= a#$wH$6qˉ^+^kR{5?+8/=T98Xs|;=?8gA65i hxYyD=&NW)2 ߁T:qT3s<->-t+^fxYҼ #iUp4/DFX&Mԁ~IĆI |'qAY)Z~M9g;F;yM_Str%ͤ $ EĝXR;=$A er$Dx[RQI%|R<Suxm{a궤ߚ#!2UT(Q| )Tz0)C%údxN%tW6LyE{C՝gbvMi֔,O?hF<'_R:0F3I zҚeQJ2k&3L]Dkb8{-?ܼR:T{ t.VTyJT 06÷P.l/%Ʋb,?|&|mȣXM@h%lp^tuÆEW?gea#كvaPdySY)`Iͥ2)5C8L' {7/r))br@Y|`g47h]5__\gw6ov8euc)Ho/V w0+kKVye m wFPbGyGh~ⷺ_:R4r|f="iw%HjÔ&ԎDu+ *ٛٗg"4/2>W}v}#|6`>>.K + qX"ydđAԸ* ,ד<풃A m #d!&NWOl3'ߋL~HKc,>_;h<ؤ>&5IR C.I7 pB a-J~L2^?\֔]N(?GEVc͑GI[+>O)CdB `1 1ĢR= tJ)uUSwTL5= 'Lqaɹl6r~U5tko,j>׀>rJp͞o'LѱxpÄWvN:)ӈ>b}&qcv2IS6$JdY-ti%OQrm)$U[j>c*<ËSnx,'XzgY zA״'v˖Zȷğ {]{nٲGoM|&^XY@?.u; .l?wXw F8aM2:?F_mRpL%iJ\Y K۝vly9p{ L_=ܺţ?釟}iw7SxޣN-رQ|(l]c'[bDeBsIlbnL7ǤP!y0p ̠xEW#ԤІu:yl\-fy vhrvK,Өo\ M?nuB쐡@0z+Jg J}zJOBfF FufX@@0!Jw{A=KY4!yz`n4,Ӡ7ukJ/s[ !_{Cg/}'.o}lMvU>W6[ŸE|nUF=C0;WxЭ%)towrBR&GM%H M~D q`2Z;mD A@/s+7Nlp};>'(OakkK&TrJ{GƤIHO2}`4HK&L%N5ff…I-P-r+x^2<` zf {ap֎nXi.U]4bCj)j!LyӋc6erȅ, Jc0EDzL!է.Ye;$91pxT5G\lPr_D9yQY䱅؜7U7Ԋ/4V[x;{@ŹK~xYx^6?Lp[9Y|X|2nG="Cvn?c9rcwŪ31c?~ɒ{cF&z qA͋Έ&tgH4F*X*i4[[L$jTUo9 ,|GS&9aRٰخm勚7Jrg|ia`dJTI$R3p3șwR;Hɯ՛G$'` Is'|m+ z`y'fc^FeMNʦ||^ձ{2牸ue,=gv)W,2ދ ]Rm&wdȨ_I"Vc/!$CȈ0"郃( EDgA6L_h̶iWSH~l@$铔ʥjĉJ#o5'iDC+n(;Bba`e=A>mUϪC`+3|"'w.o}1i0'7,ct')爑`MQ9 #M~'쭫3,O>Ĵ91cg@z*iDSބ={Tƍ18dKi G(ّ=aSKyD nJU>Ӻ,o#_%SeޥbPێ)\EkG\خd=^s0aAd-vbKŒl+&khʐgB'.{m=m݅F}t0aEzHw #G]_5A9緳3ilAQ(D? e&/>Ӭ ~}>`dR m C0:JF h<  gB26D`vELCpν" bT׭ nRR=>KI Y{e硣_^Ģ[6@BݒU>UQ*ec.^ TI+R"/ro ![h{Ǯ&}T&y/`!oJ (գ#9I<LrSCE1tDWC?M:` -0?][g@K(6G"abEhh6$/i3p+׮YRԧտθafՁZ;/XwV-)Em"M7[>W+n #3S=876ƀt&N*PI@` `srͤW9ak[ogƂU⋅9y0"Ok XuⅭ\&@29&3XɔneDCg֌hX0s֢+Ξ'bji8kdDq{I*o;RdDK^UARLR)3ؚ K4)3H .l? !WP}<+i~xHfY)Nw䱻,AkoʩoyNvhg ?٠[WAJHwt+fE vrR4EMHE;^l̦JBS*i*@˨(J#m|#_~+vUI~ UuP6N'*/5m(Ws1yt v  BBvegg;xwĽ9lS?AdF"b=i9S_t,DƗ'-̰ADN8BsQXFpM`&iPEu~f ^`Oӿvc̟l`j%Sw4u?snfX۫N!'Z,Drz$F$eO8ZP0‚v'secFO'{ecMlq&qi] Bwz^bU#+VS>|b) ,c*4''Hez )ࡸL{Ia(H}1TH'JN$2¦&l hլ neޒnK/\ݔW~I4eS$'hE5#6?wJac-EZ)!P#"[ ŷ#,F7O+No矵]v5dz(ֈuD ڹ3hB. ؟vF*/Pva.>c~vD>cc=FsրYΘo}3G.>nͱAK^JtGyL?E#T˨@&.\ `Di'I|C优lKm wg3*5אI#^:Ɲ Hœz4Q/#f"5sN!LX$JsֺT2WL/apkIJ[P9N>yG! +x!U* r1 ('"8cuU!A;#$(y#r%s3\Z2O,0%_g0,.J4oLj)g%H $H=qf:~;_5ӧzǗ :w+,uK6^rϝxMCO)NyiR% 3Pt lܾLXjXo^X-l 鴧?o%G!4z#{UHL; 셂% uܔJH8_֮"p9RI-spw/ꑃd󺫾cq0:[4i{ۧ|V 9`lOD&!<O} G:2=KNy F('?U/baW~5;j's/;v\EDw}=u [~C-8$N1./,CN=.hK`9rjb]QeA䦤piVV뺛G Yl.btpBoq$ɐAR)\ %Oxa֑1n+?ld05G[U&#>2ڙmMVl96zBbX:ix@^46y#oDʈK!e H>0tg{jzEC4bf]$A T F;:ǕV,Z؋Gή5?n9+uB3f-?oּqvsD:w/6qQ@V?Dnm01;++~ײ״*k۵/omb]v 17B~6*Mn $##T!T!D1DPV2 yhHL{5+i [mArd)a.h5r0Oz>(0}7E 8[J-]ōPǶk_ѲC].Z,D;_iX-LsMhIX:QOCa,h I)]䇅6E< 9KC\$AKErHWD, J&"w^Ɋ)]s1o {L{}%+ZȔ7AܛrkF8'{A8JV?HXc~}Ji|9pvgY0E̥ RA҂ns" \@~Z[szy=w> sRitnvL#F6vbJYVq䛗XJ 4x!5ٴ%Q ܐ$dЗ=*y U9p93Ӊ sDi(F"4░/Fj_}?ͷ$>v SH劫V?/VSIWoVY\ʟ>^]GG=#/WN֎=Ӯg>"LyN.`G$xhK]fdDB⽠*Ҍc)RI.GECdPf;T-~2Y 5ĽE[cMdQ)#H7i" pQȂQQb/=L ߡ:[2 :t {u$%A\C%| ArJ= ĸJ6 G {w=wDz![7?ֿ7̮p[F9SmGMoĪ.ѫk;ع{㑜ҢҒAK^3.^ c{a`엕 zv,kikK'cDZ|^l?'MC;!c+/D<{T90zNvD .OBxY K[@^/Ļ&GiR5p\$j\^Z.?+;HFk_2S퐶0^wَ*49|j/s_bY A$ןvE qIJ&dL{at'al5Bt"61mFEBrUIJ"Ii疏wyp Oyw$P=~Ó7LgZQ+r}7~xcpxڙ3^;Jf%-Pu_ ^xI‘ip}n嵑i|9 Qu__p7ǟ݌h5 "m8PeMW:ٜ4s)'.rL|%픗F`l7fԈN6Kqo'^:^ Zh73Y fBkuk .ySUUI_~+KE(`9`2F YAlXPE }1#ZP_ DL7 kJH.e0FxO3N6ڱ^:a0L웿rt=߉]2Enrmk&XКlO& ,|KO_Z^C;b]q{OLg&%}?򪰗M=7d{ hI J&,fC+O24g&m_AUm_81o|k돸f'm{טfeY)75-noèߑzϊ_0 :-UAL"KB-ʩ J, f =/wh|+`R&wkٽX#ba&kk^n;F_X\ћjWq0[|>66%|p>`y(h7iW@c>#s)I(GE_ EŸ(nEcׂ%铈jŧ RUx;  qsֳdC0<ms;־j[ GϒA@YTi5[:TM|_jY  yC\ ŋ'pzrc]d V9Ŋ*mN;|j:zj!o_y SHOn<bd-) (y^u-s_'?@{_U'y5OUps?R`ǩh:lo4۱;JT9~=K[ $JZ00F3GFҀ `s6ꅕ k@vX+NsQJFԎQ{3DSWLcF]|*ك3X#K6hhG G'X_ ZTba%h2y_dc|О>0vРdUy`v4ˊ;0ZrANђ\VfA_! Z$[!VMg+ܮlן;yVEFUf8A5dUA]UzX8b+F.hٖ曯F̫ST+ͨ=p{&! ^/텤E{Q+Qm#38_ l2Z,qNqZ{DP߁1hT ,raR&[tr!p:$48x@qnT\ W0 )%i̖G<3U5dq~\c?ϬʥRYeןZݓ'kN6 uD@MA(<{1@K1br9f!8 40{CjWep%ΑJd{@AC 2u,g˫%t\d35f__mz)Ir;!yI /+Sؒ^mI2O$(1ur7QOhI(Oa{Y6 i'2N~%*Eʭ&OC*mP$3U j֨Z'"1ܒQYnY(o~`eǩD$8a e[BlU,XasQ#xU% `ݚ#V[9H{w.~b`y#Wu:W%h9Qy7F. еQ*]B.E`-o v@B*Æp#S5!Au HS_ey=a†oL6RM|iL5M^iMvȸ<JȍO_O&`?x!jdЧ/dBћrN;[`A'8>9c$h|d:s>xrUHy^P' 4ǿBc r22O7Ǐb|SLc\xDj9~|Wotyue3@9(ElLA3P2ȓ39ܕPb]@ I2LGMJd*By25-()OgZV!F+kk-kMs\IRWX|? ;S(.UR>I rL6'bҧulޛ"{b)'BmNz;֮?I`&jZ 5?`<7ԟ~?M6~{#/1>o$Q;|{h|hR9~C's<¦{fOCDITsq%L^v3 \??oSFk?dY.'j@z 1?a|S0 S(/:щ@v:q a"22fhwcznꮗiv?siLP{a-؇L<'~3!D! nB~oȫ0 S/e J{kAJ.0BU.beQLRCQ7uPCDv0[My7y`8kao켮^6ui>C4Th|wB&CN'.Q$QkUKv0`: PE,iLKNG\2mL8[E8@DybW<_"Sm-xw]|暡iPu!qXoDd{G͑G◲aT\3hɤBnr^R#A%Mq\Ҷv9RXJʝ5mFM=jrHSh48cq,^5~ ikM ؗ,ؤcH@Y<\:yi`=,XpAg09mP5n2`0]">i͖6k 7?-@8gc,>H9Br{nB].2U`D rHlA lLJ @RuIP8J\yQ,(%gL)Y5~X+eg+~{Sޅi칲t^;1?[ I4+a !^Ec @{V'h;JG͐-L p3Lc#5 b8Orś`/ɟ“E?ƌ0=:ʅRꫲrL3Pj;\ O\ۮ^;IeGMs/^?gRRsHYY$RVkߩDzͷ.|~EyYEFП9+”wߣ kW(iNlo6tE vhL?ծXvU`6+dd?XB"Z0g{,ej (R~U !*2TjK+(@=ooeu}g˞ɞ'@ ND@dDd)E;Xq)jqujZZֽ\9,>ːs=,y q;3a$u(!/Gzv"PDN+wm`.o&Mj^љM&~Ɛϔ ֳR7_}}w/zK'?f{1/'|J0+fGU|Vۓ`ϱto>z2|OQ$Oe#(|uB hmgO! I3F8ږ-PvwFc0vf߱'e*ڴ{z٦p`/+l\(rP]뜸%nAx %8CXM q*D=#'=\tͽ \oHmyf\ OG@ׇԌiSrO9Aa*\27[HR~^Jz`R MϾ~u.v`EId|$ wh?`CUO/'EHd#6f[I]z;Xkޫ8;?zou:^4~LQ׀<ֶmE~?.su$:k/mȞ{cj(?=|.-up "غ1,MityݞEԝЧ5I7 ]Ra3ʏ_" sԦ2ʫLƏu$ޙaӱ5O+~P(Al QC3 $.tu3P"pW2g]̢U xMO3 ܣ&ک;h{ͶaG͟&$_\|u* fѧ3O[OV9'\ E>;XR3iߝ,Odbiߘwy˿VonZK׶ϟ!`;Z+@BۄR۱TMJO"y DF`PRTr:2$Q@R A T 79~9dͶZ U`"I[̗^ .8:77?{Ն+|j cI#G<]u]{Ye Wr,OxLUһb r#g<[nY(]^dtRRp̼"/ShEآR}Tx߅"~(Ԅț^: ]/ E$Fvi>d(E6{Xr+u?߼삧ܣnT'qю Vt[Z?7Ϭq׺/=K29vv ̲C-8.'_8%0A H& emt"TZBLhVB5gTȩP2p Ƕ|V:x,I"FzkDd*PEbsh?~SRynjSw vW{? *7 HQv̐V \mgP 9K'Xju1}fJ` 焬yވ4qTDҁ-o+,cR p(ˑ[`YƉqԴ5ٗPbCZx\<?Uu**N㵏wX}ϕ~hzƑџƥt.DjR3~ضO\'PaVcٰMͨ*y>4CR3nZ{m]5hЃ4S7<:X-&H@$Wxz<DBAHH6UQ>6V<5NeEL"Y(*Ś'vDS)FwӬD9% BsI\# .m}Bse|GųT=vo|&WTS?G>NN4k{`F1̼mpz@4;/P#T _\5RftsLi&fdo=byjbn\aWfL.wc ʂEv|0g_E7-<Ɛ=*v7,޾AvWmK90h_|uFz}3.*=m┪Gqk :B!VM=O?򊊒sGX¶_=of^l!{ pw S y PffkjAk K*ra*jꭿ{>QӯMԆ+[qF,Cǂk~3i-Fi;O`Xoօтڲă\,?LCk6[S`aBdg5Yjjц&뵱qӸwѮ'ܸIU_>]>\9ޞ}K8\+BtG0l2IT7~6 l\¤Ogpg pb2d)`O @u ]Cs9-Vy:iM+VVv=PjS?n![/v @f;ݴYuDwCI|T9b"Hl&6ᘣlsM8ATf,C)8P`VbpO\طq?j0#! r|զ*IͰ˔wB NUoDON-7>qKavEtXUK9!7y0!yDIq!!$`DaWU3O5iqSXnw7LY^e O?qm甞}g_hֺOA@}Nm~i9c:o g '_B@%J{>:A(qkuV?N'@kK|vk`A1*0f̜ Ąbɢ=G d, " 3+6v xqQ7ϡ fEl&~fp0I~7-/XXC1h4&ϊ&.rYe*AxKށT:~N9C(NSKҪGjx79܏+^3W؇w.,t/dws#tcC4ωESH]`%tNOĊ3M1W0%hliqqaמ.tXuBIO8>B!@ʶP$RӨRͅ px+[r@@/GK^ݻ߀Ȁ:2ݿ*o;süƵEr9y()HQbM/#l WA@K(4q` !*K\"@8vs*@%1\H e.;C,q\' -V|cSXM}:@[[U㟩_~ڛ:TK XS4N5n:j39ˠSQvw~ ZD6x@ (u▗;+c3 :lxy|%̦#O2\^*8!wr^-X 8 8쪝ѣMF8_+W~SO`mWs}祖*OUmZƆ7V@wcXgko}T bpϢ #D CG8҉|8 ~0 <5↋'-)Þl1-,3mcSGoNp"+U9' $rDWyǘdĝo:mQa&9pQrHi9U>4-i}Zqΐ~9CU͘#Ouk<1xjd%Z:ÃX XFqI_BxS!CS >ړcq: UNlZQVpzUlأWZYhd^5H]pֆ+,cB0~B %Nؑ -I#0q9kgK pO[aDHRtڭP+eܭG70ZGZ ־FicqK(bilPJT/Be~2te'K |j@3a* 7q0h`F<x1 ;tW])>wN{%RGaZ%ߪ@z-#oS޹Uܻxu^]>v૏ݣuwjli[T.]ɹʹS2ltQ6NdЅ]9sNB|Khswb{:єGKRڦ)pLvAl:tu Fe80Vk Gv3I_cuLJ0R+д3:S}j蘖@֟:i9ޓLlOit t9i>G<nnc|n_Y͗梲ep:.D73 a1Efz[a 1 ;N B!y']4*X0{- ״`]3pLvtoBywGnY΅'Ndtx1ꔄA4Vi}S#& tKƪ|QIo']G:ݒk%H)Z1I[B- UʑPl ?~jbeĖa_$ 4ظ,l"]u򋵝6IvfK16s€̓ _@yȗA&$'I)@`8$8Y B,> F l n"#w; "X#D=͊e {Gl)W^pno3V~}{jNz<׍Q&xuv' A# % yҹ3!3 Ɵu=ILАd,tG2g$~T '[5k}oVAލkvC=Q{7N|eV '!c\nu:KnEa.<[=*xj&G0=:w$@5sX#`e$O@y@=z¢$ &%$QCqUb}Q%nLtwt̹hn7Z;7n>?W?]aځO~Jr4:d-{&8RBl^*s&FpZjY$(u8&hnZ4L7 _&+f6ȶFy ]g ɣTc`|A(+ǁqBح!8LHrug hN58t}=E,"cKӜvݍIzPsbklUϜlS=Z/Y%k^b2L;y댯=9p|zJיv띺pF[Y[E'ލ/ViPSD|c1iU6=( ?QvIJB-blCI3 5&6Uv2ۄPCx ]LZf  ;?I?WzUlseZ0u`#}$47 >OxOɇ=u뢸<`E9F1 /㹥>zgyӃw̎Q|~r {1M3O;ҔǶ[Y;VE.% )k({FXLLr'޿c<Q8R?ջ}=I|eߤFBW0PІ&KbY6HCu6lN Vpou(k~cƮm]߂=ڇKivZ uU=Ӱ7D_iҟ0(;;e¸H&+E0R<_z0 ‡,Ix's ,H`B02fعU) qt-$x1ogBxjw(ZP4uY 1v77%\Y-B_~HѷAZzi+WMЭ I='d?KJJD*%YVk;{.|7!;xqjkM~7&M5"L)#dd=7{Nv:zwK,FRQw,IklvTkbw6 *\"nNڮ.P?rsl>k,9jM>ϞnȖi&&"凞x_ >w>Ͻ=@agfP Y'ύBW1Z@Hڝs{ben*abFo4/p pHTqN#J`?@\B0㙸$ o,0[#5xu >bBݞ|GZp5hƌ<_o?==ܪ{nmٰ ]c/jmq~ɜ .7;(q .@6Y&¤ Y"bG)^7<gsn|'sG]1W)V-' e?BQ]) \Q1="<bC,Uً1oܝmIL͐hPb2jŌh#xňB ?J[@_N8yTeݖ ZλKx&. dC{8@VE1La`=!,{ߌ_/m)}Ig !Cdtb {ܳ(QD:j_yqkGLEzwm{K]b`XӀ8ixBꀶ8߯f皇<ΰjշ=y~78SQA,UM!"O%G9&/]T@ C\$EZ4P.:`@id ]y^b-<Qo\׋Rors^]Gs I\'Bl+D+@S0DC{἟Lpn,su؍j 9Ŧ<>Bޢ8 ڂxrw qJV݁4r\ch2u0 4\ѩB1.*:@;a|'# K"3N\GF8M2  뒧F8<\3,5@V: g~dԁOw{ k{ϻdMWU{{o;bw=ղ>o᭿+>zo TiU:V)SFfSіrJP4|sM*(k 130eܥ*yI7jd{Nj4onjAIqQ1.{xyqA*[\=;0 4PqLp,37Boe[gDK*>˝03;/=۟quDMJS]3WiDRu9JF/dWroqnyc;wo^T jG"90zTPYfYTB-Y4AeXu:!ـ|EDJMHfw`2*qJln=mj"W)9>v\6R{d.e26H-_42]E:A9evٞ}+B9 /f4Blp s(-*FZ7);AYgvqR0k/O<)*9mLԟv#+f5}Q|%g #X#k?NF4V 'uhosQ*$gRjظZ]ߟT F`dlQ2Panh'0^oNj"PMFS\R3u Ee{ǔcCċjMLЫʄvj[!C)~%ӧ_ !-1p}ETOge]#v2OwMAɇa!#|8\ Y컾NOR)[Y]Rܫ&Eˠݎt{趡8\o% ױ $ Mvy#UXS&a M 3gJe3s~q :zj: yE.=oHO8KcȆV'j s Zղgؾ7|w}?ڷ_U*}2 ƓJB4ފ]w+G]9tĶ+Xhb[m+c j߲`Ue( 54G'3~F+8 7£䫺fwJclG@b(YDh9\t sV|ֽw55QYY@~/,xBd>}-cM^ hss sSڅWE]}}~XjGSral2\ltH;oOQoaE|?݌FSiZ wg+Y>u= [ T̓`/έWg+վP9w6 1Ԋh_+̃+N5&TBY t%BXːn OfPx|%x<8x\F;yr€|Cd)F"M \%7(MRf@=ZYZ?c*"gT׆KgwjXKߩ\ϹԣZR:Z7w5W5׽3?Xs`’ՁKW<įsrOfMXpX櫾''\`_꜉\̯=һ>B9e@xA:X#mUE/Y6 J%1|',!Tyj:$ 5?3 Be6"jOk_ֹB|ށҪs`;oӨ`u{ ح&X29%9ezU N }u*4oBSvusy[F diU" ~w9|5_yԛUcRzO:?"Cu/uYtмU>0f׸8m`ʶJf;_{mO<᪄Q. #^sCq_1vØԞ%U5ީ]Cr\@<a ptĮpg#TܺE(J ZP.5lpR$n UȔejaHhk Xv/nVݟ^ j{ȸ FDau7_ b*Mɥ]5yҤz51;E-yvq3A=˼MdY]d>20$&5& &2gF(s['@rpE1[C @0jTێ`C3A m+DGG*$>Xᩝ6~^4=K.w8:C ړ_f#Ѯ]И$lEՀԯE FhUPKTmQz]3OjݖFpMT}N9"\v ArPdE"" "|TąGI91h!oGl) lQ5T 'x1pϨJ؇:h;Ƚ\:eRxy o[o7YN#-$g%Em9[z,yIDIf^_} ZxIBC)Ц Lu%H0j$ȹg4ԙ;qj^w` اJ,c0e?7vy$/2*iUyzγìmQOx7ϗq9l39Rhrj<`DkȉћH*{CL`r#H*]5~[H;QM!!0ߤp9k&i^ v3L1AØ$N\d=F1jeoGS< !LL3-LJpd@%QL:qouRLIʃL)C <5Bw]$T}FPD韫uKODcH'q7O3: 9j.*_UZp9JF*spҪC#ƺ8g% Ҹ)NMi dz$M,I.y.:(q{! єՆc M^EЕ."g7m:jゆ#V@*Rb>ǥ6RWi;RMjli .f|oY FJ56ƨݡLu?=I/smf˖on.vCڛ&˘,3x <3YLh"Ir/")Ey«޲%E>"92ʬi-Ejt[yGPo٠u\jKƘvJG_N۪Xw9®΃sP%6s0ˮGo]3>B@D*s ol[2zE-W$Cm>{=L'G^[ո4nlߨ^g}_oZxnQG]<ʲM(Sjye+*Xir nb 1ΐ9?v3#2I؈3p 搞L ˑΏK(S)D#Ug,P jU^=✡&L{~׎}3zW]~쒎TW I6=ڻw[c=ҵVu}EuDEY-$7@-: McqVys:x}7#4W ܧQ\\ŏzkIMw\c襰Rk8!4u`9calSXPg?g Iz#CllH_eKcMX#&")_hد +د tk#!|50yE{ Fê@w:y>x?wЋ 0PNDHaՠvF=Q#Q,O /w&g?/ `BʫI|ڣs/{Ji5 kgQΪTO C[+ c%3p\%]||>^=RiUs1p8(0&/ '<9*t|;ճ{9S*WYEիm17wq 8" 0 18$KaQzs#P !?Wp}\45BB 88m8,\yrsG+y{95QyHq` e/=Frm9F[38?E#!!$81{jBwz8&p lf<[^D"I~%aycQU $>ܹɫ^>ԒնxPkK1R`Q@0=( Ha0FRN1x<{ >Yh%Fr"b-hK۫ 2uFG8c3XG(2"ȸpZ0$"}$}cs$@T1l)X@!nRZQ|Oف#8;e4Byw6 _g̛dQVR] :0E:43L~if8dfV h=UFBӂ*{ycK;4|>}ޟd8}y |3.svVZVT1C0/q,H"lHzzQ픛ĥo{h8qp^|9Wm:}s/jr]$Z h5êr>_}6p:[ktΛ=s`$9:zE-;GlUyܴq97Vw+r\6t#T٘"9EiM-F8_p#OrEoG'?Ս3渏JbأCe?$BGϖ04"Ǧyf~{1!6H(=s0H֍Unxd + #²{>JC~\dN#Ӯ>>͕5p 0QN?ʼn b^*dV@G gj"{IzŰEQ, h$f~L yI9b65BL|25l EQJPFq:vt ~|JU?+[{Gچ{V~E ϝ|1x|&^*K u x?~H8S3;W?Nxy`~嘌~DG %"3q4'HV K2>e%b= xU89s~;պJ|똧CO+!AlN7?=jA:W;^@q6TCS 9@ur×J{8Y)dبːP;B2j2uûkܫk}fWՠ(\M&yīyb*cj?F6Hd5na͟mF໴౓oyÌ7c=eۺ?+.OϞ_~|~oqָ7. qaJt K@$9W{cB)p a% 9< U7 ( 00NIvKo_xf@kp 8+^~u޷>2d6BOXH)#W\hAtC " fDՁ+cECh6lْK~zתƟ\z׆U/r4@7pY;y W֡e->w1_$k'vy<(?~=M{k3ϻx<٬ɺYc| f_99<3홧ZDF:rKpnr;ݏl) 9oκϝN%$!ŋz|^CC蹱H:z uBI1o'h%Vp5$Y3P NޤE8}-«bj`_ /,H)6u160k/J[m/W>;T/_7+h O;zh `!SiQۡG튜G0FP[%4OұOO"5: pĮX wd< ]3K!؟Xk N+Ѳ^9h5Kݿe^M+"&Gm1{O,ZsvZH1P 68ρ2Vk.֛Y}h''8%PR:"C>{6_Rc Q CVQ[C5E?hФT#½؎w֮JNj\~C>ۻ^>5Z}aKk#Ra]8/Jf(:H)l;W1 @y-= :vXB% eC#H$ IJw.t^0}5ށ987 xd0bޘ\)0!޲ s%ptOC K:M9/4^'A}'4ψCoވE9+tw_IBZ{#쒞6ְߓ<0vs74v y6JuRYVv h+ƕ.:{oxAxZ' &3!yEHY>Ŵ`"挼s)vF^WiF=oX8ʉ!݂eU[O !Q:]1 kbeYf}$ ] KםmHn'O3` v])#.u_!Ura6F{jo* jÔԯk]SI*[~"?KW~ch1L*[&O߹w[D|S,*_O'ߏ'Sd՗#ڏxrF'$Iq>O ~4IΜGt|g iSn1V>,jex/G]ÚO3ya5{9L3.^ e >f(ޯ?AOtHKg<( ~>+ ~TW z(zr7=/y謽*yA~s(_Sꖟ){=eI/?!zR~"3 cwi{]4#FJ?c^yk y"5Z^g]M$!lSaL"?f*__2u+21>4~ WG}cE};G{]Ox}sh 5.O`x6f.jHm`:T/`1!`Q}1ۣp6Ÿ.bJB@lBB}#t`-,(/yX_VgjX('hսB TDssl~?Vs8|=y9f#2  C>s8lcj#b`O ! D3#Qz,f;m8TgI~=Cɬ@V;SG;wg/B‰ N QQVIV/W*E$hO g~}nEGI'QgSw ͠uimsy *c:P+Rv? e1 I;'?.,z8}ϭ!dKw C7$~OFOI8¹Q&T\Q0h=0p_޳ r>b<  ihoՆ%_6UG/I5:EVRIߥf!%}Oa +R"PdK8 QSl+;gFǃG|6>{o^^zeײΝhDXMB9Dvx L۽Q7H'ka Aq1޽niĭIQ_Ot'W*r:0cĂϰELK~Ge5>גVJav>1i&N/nbmḦ́M<"4OrVC9B0vv/bh&^1"E5~0݁ZTjOyЁK[*(כ #EyA'5jxPd4 M(`Js,9kGǐ1?<3dl9S%E%OׇbL_~P-nFɂmRn M R?W?Aا,QG-cQ> $VL(:$G-=ȑ|$%+6" x (tp+>}g{Ìj&B\DdXйca*%P4xIQZ7y l5 ujX rN!. O)\f`VoN _(3 A?{\s^/ѾT5cLuRgopuΓ4dII劾 Q:<=Ļv{5$$/!Nh:T`L=5,FpGF|s:Fg2\%@cBnMZ[X{0I66jy!6*^~X秙xF stڒ(O fpZцcPCqzNw pK?92 :NXF@};"9,^D ;[ZvMD(}q>hCLmÿ$w%s`aDPFp/x(N<᳐(A*(8DjF_mumx %A.fgyW;4Al BvphZ^rg9O_?>'ܖyP1ϺB':gOq."8 \N,m7/sp`]LV6pjUGIJaX$zJD`=>4d@F)HCbxWfן34ŞOۇlظX:{ܹiS Oo_f*τd#q0.5ێj"恽u 0!ѡPd7- )@BVv7h\O^ݩ=DpHD҅kjFT` +샟p_rv]vBT|zOE0-i1϶֚{cO>mIkM~VIJNI% v,:&p>v苡pgh aKߡEdiT.B)\̘AR,Hc'6Iόn/rk"畏waScYm_2cz1Yvd1B)sL3x}jfhRH\ ?d篥M1Xp88A m$>3zth6%ZlO(4RQ(P|14 ӎ>W%h?M- -lW0L=T?~&{Bꅖ v+"Jc^24`h{@h7ecyAI?,cǁfyMD ͱV,$m [\p3HV5=3jG$!69b)} sކ#`n!,,~*f NCiR"F;;L\};փc?5h;y̶E1sGw%|(Ld[{~xV> i-gE%ϊoƓ\]/&/WY,_1 zB?@:!]zQ}1F@CT/|:+.K+x9'CwQ; $&KC(.k01 xBac! $:LH]H== Mƒ]6wm)4]WKgV$7GUK C oeEy vDwb7}HYm8 Z Vgq1f4F֋?SL`ՂPިQ( 0*x b;tl*☘~$$>=^k!"x!߭؇62dk&Mՙ1@qz=5n׭.྿^0|Ȱvv);_؜{齕*z0Q]=0%y8Dg_:q3`=AξЦ%mW\=:) %,3BBb`? *֘ޫw7.+f̷ڭB55Jɗƙ"gbXlKR#-yA0u;NpSa)\?Y.|0 zΒ"*Q4Y; {ywZ8~q_.%\4fb܆.\[n]{]ѷ hlӨy$/aޗv9t_xE^B, M4f=dzF5q 51cOFxmWkPĴNwp~.1O~)1;B3Et>]w:DMɸm^L0bw4)f,0uNٌKmm7`-"׵lG="-wۡ<}r[Ԏ2Qz}&#?ı4a}j[kPѴVZ.X@AbVj>``E޾+)t>hsI~hJĎTh!V#E>00 F9َZg ""<m%mSu&MB|Za(vom1S>mqݫyEVJ/ϰ槶.݋*q}q۔R/dv[5ub6.e?/|qt5oT`F>$ ݀ҫWLL%IfTK㕸i7I]0D;`O9FzjwYtꥫ|0Rͬ,+N*INHqGKoMLKm3d35Ԗvmݼ{ʓ3MΦߚDr/k͵XzgP[<5*"*_ZgmӮ8!IL%)u:4ĤE61I%Y1y#W˜O0ll[I9GC7(+*3W˯7ֵLuܜ?xP-:ΊջWC(Ѹl%#LZ${E };ʢ3V~pN7u- 6bАx^<FjDSp(jmnd)Nc,?59,\{Rd3O:fe2D6mSп4ALr0C]l\-,^8498LFMQV4q6YÂYe>&nXЪGQ)Ql,I.P=]`f {*lfoDtJW 7=`6Ѷ%񨿟8kBg9: k^8n $͙ '%ժBdVX6oMXMjofOi7閐^Dء} \;n~3>PeUyO3@'UW>MK O9s!: B78D$DS7jF&VeOByak3xL6IÇaO=V8&Lh^e/'>t,EgJH8`IH2+?b[Z<4E3a= ,f yt ÊF~!!"JG`*V[l}M2&Yy\Rح'CoMG~uMKLx-̋N%dQ{[h}f_3ɲjqlk8-:|6d0$!LEȦiWlZᛯvw&:n} P[zs^X޳ƦF[Xe a+GX2::@{@v[äWvBY1?Φ#Mf $!*b 3Mz &#/aLId4knlO{`GIO"pav @.Yi^Xhb+Æ_ۀggkͼ|j/w8y#Αc5lL'5 Ui5'\@@Q-t Pa 3g))!ݏsG=W VWĆ!,JHJ14-tp%I䪜Űk+#&7~Ufcq;gK9~aizcTo+P MtΖ\Ҳ,#e(Ũ-Aۼ  0~ 5g,G@8hUM4K^ʽ-L6%ănoɰ3ȶ3ɬʗnc6cQS[^<΢X8f:; Zh%-/-XYGGGP/WxMXaC"s8+a(4Bk0B%#9)$˗#?Y\|ቓYm?0_2~A/YPbK1%?(YFtS?MjA!$&/fBg+~aF́| csѿ{Lk]YDTM0S+ڤ/FdPM}{@@BU{m"*-E.H a:ㄤ}b`ƀArǣ-XtkL=?27Wf|kOuۢtس= Z!%f#. 'W#f&Bx1[iEkלٯz&+Ѐ2Qf(Z9Q&m.] z RƗ!<;mLIg'v/!D&vcX%PsBƩf3iqq%2p0̛99o_zKy;xzǗ49[ZX3eRnhv>\Ų}L(痣*s'Y)NcKH1C̈neRa''&F0(A 9#!H1=OhTIc)`KwpnKfĂ2Lظ`;²ʳ! S+FxʶӿVg Wn󼕏U{{Oyl TދrijlG|4Yڶqyvi^ U_f c7i_7Cv~znKM{tÕ^Nv+DF xNAlY퐦y^Nv_?n8=A hBhcpVԼ]5U㜦\[kŸ2 %Za5-ԲZ"/{ mՊpJU+W4)"]!i9Yc|jml=JV~׹JR?1>*h 5Gn8Rcn0B$o;lBjCEj8,Z1V[ H n#Q@dm5ߥ-;;w{5߮FK5}| ́Vf.ByY?[4WEVjx7@upv޴S'kVo@{z/SaNjCp X͖vl=Z|_b^y|]XVQD]͝R[vvPvC[F0hpW;P[tB񌶠p]F 4$2/{O:D[܎t 3H. lE˩-_)EE>/Q 6GGW5;?Hש>&!/O!k ڠtD=]<>> *]_M*Rw~w~N(`>=1o@cﺥCZ}}Jgt**oD>=9g_SQU5A^vbm% : //x+|iLkxW; EY)0Ti,VH;>M:i R=^im7l~k,l5٪E>sw>+ {^HsIchqҰS+uaĸRL4&qHcy6T />:m҆O |9Ɩrbm6X9jc4@G| j+`<]mtQ[ ~66d͟k=f $!51=/}2m%WSY|qK5i" AW{&#y<KQ'5oPvR,As  iiM8/'1+=hݝ_vw'8/j!&1x~H,槱n\6 Ь{EB?ƍ@?{='~p~HhUcNib G(N+7WhXO=vȄZe"? ڔnh20#Aljg]SWN~ڹ=?D?N;~ж4oCշnfC:wཛྷ\vsbRyejd2fø280,‹pOEh? Jhmi~{7]؇ŚȪ5am\l~"x oe=_>,1oޚq[zcbn|ہ)SMyʳꭩ)SMbCԚ֚KCkkk6~3}J3f|Y7ܾ|ghLolmiZìY'f0ld9s=盹IsRry{u /Y8rẅ(tEO/d~%Kʗ3]K>٥.`erW];0^{E̊W(YQzVX2wȕW֮<*pUĪUYWzUêVڴjC:V=UjՅUWW^=k׬޶z#/Zsǚk.ݳaek7ރ,ם^~7lڰsÁ Nlxi;>K }7n1}%+6Vok6n۸w㑍Oo|ixaMM"6%mTbSYشfӶM{76MmY9bsK7O\yem޹'6͟mE⽥-i[o)Reʖ- زi-tlyv˫[>Ֆ [nl 5ik['o:w벭[_6˶mMٶbm>1{vT옲ndž;7wٸbWCܹݭ>ܞRz[w{ᨇK^އ_7pߝ{nߛ>wii~x#G*o#;9H#'ywtp`qStKZ3,·Ns/R棭SRFҖk[Ũg-wfhk_}YELmO*ڛ9 f=]hzvXB5{Bw-hyhuЎmTS[n/Ю!.H2?Ek̟@ ̂Л9N_ ~4]~elbb c?K`͒X2KAP4>BҙeLxe<^†aڗl8< X! Ç[HpQF\y/7">y x) gcyx^'|o6>W|5Ou>7&>|[<>/ ";R ~_zofo}|;w.{C|/?a?O?VQSi~oY~gsy+U[mGc fEK|ÿ'O~?_WU~;yL纮tnͺE=u/[=u_O@W~zGQzqz_Ozznm]Ozg@}>XՇ=WPI/GͰ0EK}^z>AGlDO'[xsx^[; m7J;Oէz^OzXtG]o_FI֛uZy|}S_?G-nQx؆;%R}~~\_W5=Z^}^ߠo7-VHӷ;.}G#AQXhI??ןmz~TПԏO[rT/\J*u4ۜ3jZsSJ5jLU"14Moj\%SiZf6,uW4jڴƹܷiU(T-|k.Pk F$=kܷFLMxԅ{ϛxNwz4i*n^E]zuV5iSH#TMUMFȚKҍP8˔(3u}s7DoazsMMcCUcu4SIմ5xtT" C johFnx7v{07J7Vj3iV]^8]in*ߤ*?JVI$=Fյ4NjnP2GS'CaL7Lc$2+#]u]֭Le"1QΥ&'E68UUqV-"1konl{^-ݟTӷk|^Ov4QuH<'ys8}qT]SsI?NBm-L!\e1U[sNxeר9 Us}S׽nAo4WLzGf-[Siczsռ1CwtףM2֞VNihOYsiS?GJ/j1+,Һz=Wzo*DžAO q5j` l>/{Td7NkVUYEA*QaEd[zs\dCz\Ig>p c؛swy2eŃXܚZV8Y5Id|&КfV}k}ᾓ\Ywٮ 7 |o.Xtw6nPw$GB!z-[b#w$݅??u~oz1܅w~$K2Ӽ)i^ ;,#qcmji)~S~I79)Cc(8ӳܚ=Bkz]XM/f+[zVKiEc&+"[}'87&'Wv$UOo5G9`ă)L=X(Ǟx,mz<|Qp\Xکx#\ZPK.ƌLPKy.F^angular-1.3.9/docs/components/open-sans-fontface-1.0.4/fonts/ExtraBold/OpenSans-ExtraBold.woffT{cLӶmxڶ5=m۶mۜi۶}Y>R$UqQ=Ƿɕ_U,j I(*f87pɘ5,_70ַyo=Ie[ HؚZsf#52;|wlȦVn&0 by3337}kzզ7o!|Y;~skzl u7` Ԭ]_@[scA(fk"U~|QQmA a_+{,q]533D3ܦq0b@p7ob{$oj+Y*'DƗס)S $)ˢPkCˢSz[XW4?A xE((vt{3l/}; |/VZ,.hб4$}2`eO (nwI(KUS";,4~?S0X30_},r< gAŹ|&巪NNw񜶾 GV+i럐f99̵yċ:9"9f9!\?5AÁs^^TXYV #8̚_fOhqs{Nr" >6zLyӖmȎ'UYx~G&:%Ys?Jqm: rMdO6lM_IBɒbl @<e ZLP!123;0193;21_"O GN~}Տ~+e"o@a5":ǟVTەpZwdRK Akd;J7&NMJgA7Lnzyl7T9צ?|xr>@z:Q*M>Me{ ⒬5Ljl*u©PF+pM beq;<$TTUǰ.e@_E-p`6d%%ײ:N?ϰe5ӅwLRb$|#ώSُfŸ]V!d- +KN͗d'R~wX|r41|% '|͚).-8\ƸD{+ʌnW\iZm lyƢ. bBM~tO{tܛ ~wLAEm ɸuL?nnrȩ|NkS7~} HKaM DfssMꑥ1Ϯ`˕TJE rFk 9㢦\l (۷tSqa.9Na2߶>{sk}@8BcG1[m&X]m}d[^gլ&_!<5?-3]s&Ey1Œe}eJE}dJU2:"U$ ԇ?̟┱jH*߅YʨRWRhFV))2< ނZwNft7I.)Vg.X}>Ѿ35D3-+(H7@ @@A@@A8g $@w:57VbA%F W z-!ͨ~‘)&xxXe]9`H 0,\{_%ggu?h5a;tŸha H6ImJXCH[ 2m^eaXe+P5ŖD ̢*Jp>Н?ŪR`TVE{A6眎{PaV5?d&>EF$0`Yx,DX˥^Z?>&~nUnT:95asM3Ezq(>]F<z!b!&稗D$q?^a~6KO h"jG}slrc9)ښZ?I>,|7;~y@i 4:0Y3 xhup(ܣJhr{Z\ĖTaqdIb+$)\GH @Ob' /gvcOstI?EQ^I+P T>.P{-1xB2cg /Y"\C0*:\xb_P[g!P)o~H>>xCV,ݍh̒v8t8|Xu7(>F gc.!=x s P\y U -&FG#B# :AC)v*8l6$Qy\\^yƽ%:?͓%rNʿ|%HӀk|u 1LIN;yG'{ =v9wpW|\^Lw%uzj6{id"o??=貶=O!0Dwl|x?okI˶# Z6sCѥ0eX܎n=Zwxq?&jKh r 2x"_o W_C-C Y\ *ikg͇[H ?R%t_RR6[> \\fϐ1(#+3*T6M:t[ǥ< ӧ~f\qK[rB;kũ@J?*83[v_"D])X;xh݄DnG }MO~XSvL jg>!09uJN>i<˪) ٷPײ 8kT=AvS;6݀Hm[-u,m5I6K#߆MP97yiGTO#ů|[ zPO2F8Y?68_ݦxiѧ 5؊<8zc_g,BG=] AA,S0➔l H;fg`l Rz^_վm=+ rprdr\@Fђ%Fa]j_AN6i >,6n2[#9DT6*7Y Z-|?y-{ AlPܞ[hTCq|zDRTĐd$&ZTc }a%2kF;^v m .є"Q:|"b&*VkAzn+ .ôB}W:fB%φ2oʏjRDޫ#^z#!G SȞe] ڿn`D_ ?J] nx:r(~uE )"/-ej~ i¢gEl4T׿E7>鞷ݒW~b,SVbtA(iqz2OfڈҸL!lndVy}(mu*$yR OsX4$o2bOAؓ i2=v۹}SQj-pd;KV<~q4cw a˩[VӄRB昱XgJb)ރ4|HGQ">wMJM)2")9^ q"A ߼hՒّ5 2C6ߓx\9L>WV+,6Cm畸G%=hpHp8Cc QVHA@h&OČ0 +CU⯋ 0L~ӿFm:8}3jC@G" b(qI cIrNZ ?.UK`|٬TJPx {@v|~fBʕ6v7M:uB9wy^yoah.е"B#\2j@9y\#~{<_f YOv Ry#W _=z@c0:l@4.!x6g{G[!o:EOc? _>(P zt]$EYDh7Ӿ_p՜XeUր9qfQVHEd?(ќ7t4Pcr; Je:TZ'fBezea*~w0lUHqe[f5gX5p%0nY4dA\x̋Q- (!!j+׽f|+0zBqyESxc=6k(uOoMqOMtض׍ )oYeoa̞ F@dTU9 б$,y;aa9c/c9 % ,ϯ ת5u!8z#ع kd, d{h!sY=A }O'9W8(=3u-ߡOgޟ+إ_9Rˮ"WQ 1&'Uѿ )u >]Gbe'wڎ!cJ>֪?j񵢌`0tzz9ѕ(Lj̾,7B\WKy-te^/8/TwMxyBXePAz@qTv6(ج|sF{͡V)*nGLhD|m_L\E {~"^ Vv Bb$Gg!)S\CBqiPS_VRlR츢_&!OM`еW?B#ӄmRHOQ`6!Ɏh ݄˭P"[yba4IBCd- Љ'Mm-2]4rXLC'Kh*k= nX{!/:k鉯$Ϗ55z{X)HԈX-Ɂ=n:F"| qhz3f֥m-@|As2y~$HZ3N =;_K_d}~#c[sv`z^a&f á(nz^:Z9tFryqL/s~虢O2J`nxF}5USk9g0p>$emYǗ8`B搿TAvHOAavA@ϹEhģ:^9 ygĪ+l!!d+ H~EчuYҩme]f; vE2u6:?kz˄>Oy0dkB`T`cSW9} 9_Z1YgTHȈŷ6ҳ"Wb3ßSKGZ|.O\ʭ98ΟRvoԺpڃ}=\JG Rts)DŽOxtMNnϗsS'TpXI?SRW(F~́c_p˵skDl"_S rbL@J_z'fzŰ ߰fF5j,)G30 O/m$NFzC֟<}eގ:R_]ZdP1zԤǺn~\-i߉:kFBtXW~L86g2,0릀5&o#Tʻx)#a+jWN 6ځ:eZΒV(O0z:\NMڰvU[ ,Rπz]~|[2K]Bo]X /m 횛xh&O90YdrNP#=RVEfԴ̼Q}*"SsGg"K{>VɓPg#1-*Z6Ty9K|&(+[zԃ ְ^Ҹ0S*gd)}!n(}/X7d6P57˽QUSh}'o/fߛ}jA# P;j*1$(%/)|NAƹC;T@]˚&XY'ML=m)C%Z~Ƹ0YƵ~- &~2#?%%9K8D#m$ju)֡c ;[>dQ=Sjsfm&b#.]u)ެ:WW GA>di稾853)g|km_w Ie18~WRl8:Ր@Ȯxv lEeu0$>8sad޲ik|ͧNz\<.bśܴ}sWڵWOjR:[Gބ8Ġe3IPm/8/\a>Fdy#lPyz1IPQ 8yG׊ ka9@ sM͗8M00MҰAiPH! ,Js7sI=(.Fms~gdgzx}V1ԇe[f=u4O=4PHʱRʢІenuz|>/,RԙgY^:漫ߒ8fOEK5RP|:Ə\TLj 5dQ/:J =áѴ9cpks{mUxQ+́v+ןw>>S~p 0U~@@(B:vNx;J* n1zmۛN Xp\%E!&l=V$&ǁIV\K$7z i珋LX<;2 ΜEjxO<ŐUTA[qh/GOܳ*`h# O؋ y$&+F1U9rq/ Gwpj^*Xeቛy@L#:T1$<[ 0D߸7-D,Ld;A&`i6vl(YRa7*D&{:aȝӌ[M`[d#_S ٿG'Kl͟)-Y-_|Lz؍N*>_ֺ+mst <u=@Y'Td+8 O˘&[)uou-"PcPv5xŠ4̃PH}Q&M>҅) *hא!/4hǖ9K*+IŪ bI=LLLE)[hp њolc%4#d `~qI&Y ޞ5b:2B)1~ZAic_Jij\ȶZ3m>&S(KwSN+I$УNaqx܉J> AK ycgl`.a5 ]'-n $ {^ ݦ80xE2V&7 74Ȟ1jrJ/Pn/6RC1`$pZknY8Ug^..JI9CTdgg{U_@X"6 &?\䋃) n=Gk#;$2J7H'1 Zvq15Z:-&CԖC#Uʭ|(* 2jYzz'@+|3K1qO=VքI`&\fۦıQTTI(u(=0C̕x t0AS-Oz;mcaUCeÃ=[Vܓ'U@}q=0֛VTTɰy:ހ{*kgyMw#}7)!Vu:[ZƻIN_ؕuX22d .%|TǼMCF{\:h "K :K $Sdac1vBgeB"PũsCB兩s|2(?v P?(PFܔDQ1Am֐n?dѪ׳S֍J5&ǘ~Wv@ Ԑ֥i?wAc}6dh¤ 2y Ul5')M?єjUO>WD% LK*Og˳W{k*x s{zRWо+:$ 6ջ,EȨD`[ὕzc+cD'd%hUg//K hvۣ⿔a{^(|76v$&X] !rM A_۶b4#PG{!ޢX^uH܏:5So1;bքNjzڈMqs 9M\ؗ}n^>#:z7)ԋaRB@x79)IS,&1s&  f·V@ycqV /+WK Ocו -Q9d9|AsǴbVٮeZHZؕIteϏΟM>{=1%ǐo& %I."3 pd;Cb;5} lSN4&Wbx[^z:䴴A*?[|HF#bM  z4E]wPMys݂'M"+cOFNuB(Qr沷Ld~._^j N;.{he `:sGנ[2(3d JcO#1]?ڊC4D3u;zW xS~~}g^L:N[ ,v{ l|T~+ ei*/_'ǂ,#2 ?wdԔWΌ-iZӑO#TUCA5"Mm1%UM0;tid+We,%anp:]wVwN%ov& uѷd/In#(7O6g@l:4̳93-3޵(} &=^ Lkш8yҢW%ɇO5X"c^ »iH[twjr*3u>RIhbaH(5ꏲnCv5l +}&?u kqk 1|:A-Mx߯F75}_4 #RRs?I_c[8.|kJ4]1cBPr0J{hLXz\ʍ+(]#k=A'_5^M9ތ`.Ew:WܣHs_9ɱMt([MKSP-!?KT1K(8Ҍ9Soi[gK-mNkC'ϖ۳Z6~s\ϯ0Ugv1@+8.xQځS8\3Q%[QmVdv(շlz@L3F)ٮ9HWwyf2RRLՇ~)>Ǹ5n S]SqgM_^Û^C?' c]%}VG8&r&rަGdY & 7a766 zK9Ë掴\G)4߄u4(϶<0Sj9#,(E׌#:1IѹRo̅tZ"gޛ?}TP& Y)Մd3iV %s :m 8"*LU&a9I3aZbԟ28-~/U1Ív_e hsh.7\?LqoZ s$ۛSsuAOL j= b,ԍ99NQhț0sW՜@OK-ѩ/[WWK0f%{$&?FKKI֘Y0&ܩWX*Ant/w1xΨW vČR¯_5bSBTMWec:HkU 0RjouX ,ve_wAϜ9]ٜG|)[qg ^[td>SGM0-{'|m0xomcMP~`0{hCiBk4҆s ^Ph,mt+rOX>lq{|Й+}eRi4q џHXd p2x+^mf2:`Z@wf]\ضTNظӈχF?|Ef鏴+f֒"F +_yՁ+li $/KϨN$iV-6̇ :@$%MFA d&DYxbzcoVI5L3vJ}|0mӤYXASf| vZu ,)Sɂzbv%qg;+Ix`K3!ע;_&2dnw -zfƧ&"+m_P~ueVt/nA;H/;_NzKlm*`9]rޗeIuVpze9 lL:{rXo>F/Tx/sپ |xADߠNfOEڵ'Erk"\DrxO~7ٍƉCG\9eD&]r4{04ń-ܼjUb}$̗t-фj*Mߞ?Uϸ?5ϧn푘,qYx(>.r^zY0HrFٙϬTb~Eb>($ߐ?Da<ן"Nt)6!n3V=t.INE?^KaQ,^ ? bTe1Ak0 l\9p6+3LŐ4 {0_$f5[B.oX4z(Z>rX岻T*ŷ='dbƤkO.)=i.4\N6=0=<~ $0q4^Q$|2 m^\ sZ[ /a6u+q>02)$oO̟ &O#2L̯0^^p̈́&tGA]IvMZO2%;l~oaY_]Hߞ?UkSm7$O#Wqܩ/b|i+ Kc%c[~NOLqRF=|JiujF=SX[7CH T̲;:YɆ */P#ɻd˳ҥ4L'K;vÿbWt۶x5upHV{1׌JɭV)@Y fd,>%ealvV<g{V6?QБ7P􈾿kN#dC?,_׾>]av3m"T7֊gV+de> ѭ2̾cqgЋL%~赏Nf6 b7o`o^%6E/?~kuc}Bgqy >#O[{c#kd; qXxخT:q%,Z) `4QlwP4Dt;b_iNx0>ɘxLH^TI`x$()%Iz|4DRr{r^OұkɘUEQG:u}_3/ I}t-=gu?%t K[%xrKXH4i=dpb]tT|tH'0{`&$fUL69-1d& 33Y<0'NÝ#拏'ם?M'5+-a:XߎUգPRa\b"wt?7*> Uv=?߻֒m#{|K>MЯz/ד3(kؿ&>?װ'>pm3럹>ȳ:~bCQ,L&i C}oNH?Oܕ=2,*@p+Ea15ކI4~V㽴[,o^ʛS`̦_++G_B] =V3f+vصpz@ԎInրWDeVxQLko$cyy^UFtw0R-M#?[#{Xq]RTzh鍲[X2f84/ot9AT8u N%|ѾIx/u%ߞ? {|b=dV|ALa/21+xF[)MxhNkwg9:͡IR m,B]ë5Y! ˾BM@2cikYR,҆F|(GEI'';c/klbir-`7'D&\R_)2\B۠ *=aV<ZCǫB#˖jQ,,X+hgD^Ψ?c52O_~\}1>.rY9 }ko~޽`ƍ=qۍܻDo3q"f׮NߪlĚ.}>ʐA?w}[gs}2y~}Ljͯ0dz~v> ?z|L}J β7-?{)]ˮ?e~0\՗J+ 0>U_c_#vjN]0w dTwRTeR̖b!,Z1ہ%񾋖K{!&=U~#I>eǏI;Rb&V^m}z]?֫2OΌr3>ΞSlpe:[kz&gYF3co WR܏٩ ?)B8B b%l&Įsu ϗN1*~ٛ4?q})IԣKs\ײxͶ'ZQhw T=.r&2򍈉\^Bqդ͞5ŅZfL8aFx4۾ػWnowO3sª˾O5dE7 -Tl絬y(XvQۻ?L?>BJ&i_6Jk?}aί'~^58yjơT-4`Myf{ h6X8lRK*R3lDf-bz2D2+"K+z|sgV79;/Hdm,XOaw@EE PhXXRl=7Tk*rgK8WC4E531`l(jp:X%]Ǫa@A!Y+mӃ4֟C2%E`"t.hYfVA5-,B#`Hyh/)MTƮޥHFfU?L>lr&$4K&Iљ+PN ?z{o^m7[&l)A{犙<7_=<2`/M] $MD(OH:Dzy#qx"g^?oˋIQ xnz0}RY \s^H>= xo*WPDe\o#kҭfTqWO:eӁUO:߽Z#> z'rI,@I$PPguㅞ\툇[OSIvdm玑˳u%[Vz涭8a[lٸ4NquCU~~Y?7pOHIFjk-ceJ'UM좝Wk*8s-5𸠔JMpBTG 3 X!^kWeY;rWyXAVcv|x{*Vv7٫fW]Q,PQwj xSs٠auIX5VIL`V,8beeAQvֲӮ,r>뜂P_? /s@/47[GIgla z"-l۟x7bYorSDw2=S#)=kMݏCm[끕7b/@`a Hi7}2DCv.$1<9E>mfc+.Ncg2/`zhB]D. cm|G?g0?ԃ jJjݔMNlJ4do)ϔ\x՚;lQ+7sonx/TZoB8_8s &"}MuY?;.'wΐyo_6L;~35_gC]gW ɼɚ̛G9f"LͣǑ5k F)Az!9qK2r3p|?Ќs,k!;]2yQ$v/}/HžfLtG|jg&w,<_ +2#K=uHsxc 7ԏEW>K9GPt ~u^TC`^KDȞ4J~$`ieL7{o?sgoȝk_I J 삝/u> WƟ &?s"3'Xu!.lwōxm?\{5I`'aR=_>|?y"#ƞ:d%?6Yt""eR=3SSTq 5ah w=>#?}_O|𷿝'zloaٞ'5b)vVwI]h- ;9M#Qo$C|>xf_O{3@}{s7r\wP/1C $BOCgI$#+rLt}{bNwឡ3UƳK;e-c}CLD[qҋ[t<;f?YߓQNzU JF^73b3 :rKi}"CGmm%0&zBp }%gkIσ͟bmˇ{~X -vcO@$FPLcX71C%%.rB,L3BCa 7B. F 'c|r@qPHVg"lco3mܾ巊mv ]kcM]|߿ݰ|{+|7v޳% mvp80R O)ILĽ1>\CZb=l+~a ,T',!o\n#STL҃SM&U7=NХpF^ xRF@H"4%xEY:+YӠg yyjeSa/x1JfOb!8`f͕o'Z$V1"o'+%XV;& ? #O]7}rO̽%ϒ\2z(l=DZǽĞ׏7j6/oaKj̾HIIĎ˔ wa>%܇v% n$߮53!Z'u_1]^cL^ ZOo,/,bJ텒Q.p\-XdI,_1{3$^jTp;6^KDđ?-tdⲆL쵛K>;K&3Ld2Y@B2 !%iDĀȢ "ZD̈́H+nEEH-R ZB9ޙ@Y[3vQrr I&eյ7|i}'jf#o󥕶jN =ٲ~TdIC=*,yXvylbQ^"5s AŊiͲpP/H8{- RH&jb)$I>,sayLWUopU>O6ỈS)SH s PQof C X֝x.:HTN*%a 6GTDB&[nX,# :y.}hn=~zH.Z\@ ,QT!'lC '?!<I5g;pR>ָa&I{1:.]QmZ(t7SjɬS/Ň^|a/+BH֎:|!S~Rxv/_kt |~̬yӷ,J5ǂ}SPהkgA!ˤy&F |A~$hyG'a#@7I[WzWyo=oCXtӸǎ?ϤϬ]oz2&T!҃=VC6GQE8މ)-pNEq)! ZHPL5D`5{k>xj6]VG,ԆG:>TrWɞ/VZܑh A^wSe;}Ԣ?͙ƹ1;37 =E8 BzƇD2>T=}&qu&<d̞:J1`F >H8Yy$d å9cr3tj2zVz\춿{|ټTw N :tdtC0ۆ[@H[ץhqN3K@η)݉1xvn ud>LMʚX8z vAȺWR vޝ${M?GE_b:zojAKgIMڋw̯O%;;Bt򙇴M{F|z)C-5&KQݠ8Z^=j͘Y‹T JZ\'y0!I <2(&rҼn驽=ھLqM5nYyS>Ri w&K#.Zyk35 zlQRh#34%]KqxaEC09xRcV.kqNVe3knGhCw+N˚D!.K>vX"[mƒƢgG(v2X  tа9\~Af4J:B_yq.A14cW~YC`&v>wv֝mDy敳2M5@z ;߲dʕ+o"&D@MH5|Pd 9N<\r@Cb(a?K4ka2 HELEfDE`ˊO}\{)\T*ybdQ#PVtvN s:Ĕl><+`[kqe[gk@̤p2GvErgֹ'o_0}aiC^~==SԆyMӏߊAܴ|_9~ ʛa¡}6j-Dȍhinls<\D߈.vV`Igeel9]NawDNo\~6@:{r1W|lJjY;Pˊn-O'LL>a!?]aci ,ZC5srߌ3}3a{;pgsTo@,Ui(pIJ{E*ebO\{wQ|.F Y+/ާ7ߏӏo]|MHOnZP2}h7JD{cqnևXd;%/[$+>@(!:p2kOdMIֳ}#p5D؁F->͸Rsq9 EwRdKb1=~E$ߝzc NJ2gi"a1ƹ0v2?ZSaMc u.|S#1XQژ'ؗ~%@88%HJG_v*&6XʿY#咆^_Ƀ"wyx[OudAW'ϐʻg/w߮XR@k!#.Zܫu2^ t]@I23}5#XSUULKH)MߠhE lmʤ;\A:G~>D i~iO.SrͱD(j(36 V+d#m~Fe&c;XciP$B:^Y:OZ2(_pV^>(&%{w NmsnJ'Xݖk.\|`i.]08ۼ"UtnZr#EȎ{Hن{5-jx][k,?aZzJerH萣"E:ƣ4 }h:KUpu]`xo4R]bQpD~qjΨqc&FH%3Gz1eoY8g|z@ * g뻕V& Q8QRfCm&F-DuXM`ʊƝx$It|U1)P.b(KVI1{7r6%&$7\^yVLŴf/,IEķAΚpd' IxU,G̖x6Ajc!ed Ct(AWr| M1˟G_{刔wl\ve !)ܟ.js٩ʁb)' t-BD;tNTR823ٽfhp>bp |_$@wFG˜߬[o_탷7+%5yj7ᤦ|@FWVv W0_#b6&&2g1 X6)Hy s5xHĂ2Ov]V(Aw&v=8lT%O_C/7KY[?+Lk V`ʓx4a#V-+` 8vFڝ|B{Sv.8x!7v'N6x+*q`BS|)i1`-]Hϋ++zYABy8WlW`[=K@1acNz'\&Ip-+x2M:,:U=Md3#lԙ}'u CW'/Ӄ/$]*9^Ƚ`Xjnx/ g +&YWn+u!}vيo o ~vfXg`~3؂M *^ (ܱ/dkʵ@ealx&iW .d]{^"7 gӔ9ɳɨ;*9VʠgK QB?i}sJr YnK.s[-q?_~>gS`kqUWb˜v߱ǻw]-ǎ9Whhb8B{ttQO&m%h3K-ǗAP@?ya^-!<4I miv?Kq2'͈*HKu -.~E5 b= 䀹1 2 ]Q_0ڠoܭ_СqKё"NZgaf;1I~ =G6saU }ނ}&͇^ (ؑbj [tзTb1FGNyE~/=bлEt)}ENWJۀ<|e-QJ.v@zDbHPm..]J),~Ѹ1aW8y 'l@KޭG`M []6ɅNDv^^K rL\KgEʧiJ"Wlmz($#֫٠ 5 ^4fAE܅Ox؜<4)̶8tU5n{  d Y3@`GN(#_֢_ Y"R,tjHA?&y&=HnG5;e%*kΐ.dy# -{֟G7{=~Ǧ.ɻģ Φ/ S;` rzdQ6G!i7uo䛿0ߩc=7 LW:̥/˲ǢX8GL2h *fϴ{7=DfaK#ty;yNߔ `Z:#:T#:rLfdzfrZ#9|y^y3x_y9*'KiW}(> X]CtTCRjR3< h—&~* gd {R:ԄN)f5A#l%stz/7Ξtf׳a0:\tGfI}{fHOP}DܡQ>iNIRg(88iP,f%9CaSCW\ϝ`7F_Iڗr'op>IrKLxL5g?8Pgڜ$*Cz/<-cYkC>IgCC? ;Ve/8CvsԘ.bf'6š|Dy1 r|8Lx.2{^>;3}'!{(<@؈} |^][ SV!t~be`A~7#9v d`k82FM3P R6ţ mIYEZvVd- 'XB2cܶ?Ob 5~7a=; PD8ŜCQu ޖs\v7}lKS$?d@AK%Ume?3 `'`&A*0Lyl_p&a:Tɓb ~^BV3-c5'{=xf?NCxJlW?E{+:)@nT@uۮ((a"5+d\\ h%yq-F`:D,+:yǷص~aײs /CV3-ka&Qo8~ Í8u5L5&7ɨ`~urX B]G| cBR&C}(ՉD8:m]:Fc%~R1.ݘhDBG:Ix8V+n&l(ƥ.lIC|dϕg>`n+{ϖ==Kܐ.@j/7ύu{ӈt?A3},ڡQӺΧ>-'3 /g{y, (Rl.j zqgx0w1]Ėדt|& i $hz cG{RҋԒ۹]sWO2#-:An9DǑǑ21O:#6xcYB?q鏑HcnĆW{%%DsKKƕCJ#o2e3MX}3BBaOD0TW"F>^mKTb5LeUxlhx9;o1Pk*ћ[l@|!$;mtu|WbgS9_c?vJui  X'fQ}YɝЈs&]^N tjDRD cFfw=%’Exъ"VxzM,l {з?Yv0"ȋW=muȟ${QY=2v)z|[n7`71]PωQH|OqyPasQjsԞy]f$)kx_T~ewfUc[l68.vH@=l2ng l@e pIf3[td 變wy=vEtu CUmkv%yq8ki1drK4=.2Gi^37`tuA8| )V]@RF^m{jl &Bx1};ޗ۞SKMO aCvB$@2E"@-$oI"I3/zck߁6?zn=Ar :s7OiQ[VȨoϖ}&%?|kgs,>JOWe߄az)~v-ɖGṔ {~c6q1S:|Ч?>RVZHy(J9DLM={Gyv6kBA LLQZ2-5N@eC1B!&ŃC>C]̾/eʜ~y/% o4RWoҤ~_gԹyՓw7=t'.a>M+hi/k"'^[%F\Y1zEAs`fdcNv .PL6}/Ap=/E)oǶrN~d"H?\T-}$f`7tQv^cW6kQ驚@]4X(=ɳC/N_;z qcwqhu0lSN4[G;rds ӞiVt`udFXhSC zbO:bmBIn\Qߣ2薺~Cg`lط*pgRuTEIL#j@ Sbl9HTlsXwmڵ-e̦$\ećN9ۗEzmYwX/8U9n`4OPW@o\oK縟Nym]:7g:H 2@*4+7Nu)+I}88J>%xSPI>bY&' ?r, 34W". zW 8HiUuDod &$ F?|pˤ >$Z8|TD6sPy?mU;U}I)Y;6=<:sIr$/S>eٝz)%_ߩw߲A<<= VIeaRT%.H%)侭d徭PMqh=Tl]futB뾯H@>0uM#ƺ"RG]dXz5YL%@u>r`'nB*Cis {B'@j;.}gp6^(8Dn4h21- 5g[ }~&oڰtY>cHR1'L׊>}[d_,uj9镥fT߹j43,Jmp=Q˝*!7"AOrihPq`>CMA>]aދ`G)qP3+["pV+b"VTZsYLZʶF\;4rʸiuo4njհYw]eޡ l_ֵW^qcژڛ^եO_y{=gϞl^wo9Jӣ#%A%؝MZQi%]Nesf 9^c{کC]MĤ}Pq:i}xp&_ԭ'nb;iz))@AQKM},?dk+ǥL=T1]̃`S67B3y @ wU.pv;i/ߞ9CNǵ؁sxYz͋R](zQ;172vd>dՆ0T#AHU,EWMk;wwގ=jW \ Ґ % 5jXj6`O'5sXòQIq^n7p~ݽ2-[q=}c?3n, 7uCÃM0 МM/e !y kz~P/3Z~2D__g^}慦n=HyʹY^';rؼz{;YDNWt TtGS 5 hL6u[t$?e:?d/]`ޗc?74koĚ,Q>,IY(:KF)TR @WP"`~ؔΧ?B*?.%5?•l=,lv7)77dzUj/i[ܱm!Tx%uu71mbndsRD,3<I'*j (*s//WC~k}^OosF˵myg5zNw.+}l6w!e~{iDx&Exck˝#wQκ76yuj6ӧI _VZ&[v;$[Z.b(CMx"4&g"IWW'^x^,.-ObN*ݔ욎?\3$e6"D2SlU:~C+Uon%Co4*yɥζ8aDw})ah>fP`̙?j)fscMVm1X^[!ʇjjy9'N? u!mi/D 8 O"vjd%[c@o`ަo"T)'IݻH1'9 [zNlHƻ6lldf#81t.t]1(ŋ)F'E@K1'YzU)z-ȱW ٮӛK [@;Ũ*PB†C,.!I$qڤ MK{9qV\+==OLmwtlp3|ib2D >ig`>@*~.x.45Nj:с=#Ƈbѱ6bң½O?7lܑv7N#S:vNvw1w8V \%V~W_Q37ʘC,j#!HȯqE~%py9- NZn5 Z0%5g<+`EbII"%3$"7Fb4!Q@ `mGx0 m}]sdJAKK_`}ɘqE/]_GaS!@R9ԓ9BO獵rR1ʕ\2%1,p%Z7Z(ՊЎ8xd:NkM΀L/nt{ .VdE f=QS˟c$7+'=D80s?@=oㅛǛ _7O,'ˁYJ>h)ߔ‡9f:|: +nrG2u\uqb i- % &aPk0-1YIk漢Msn\=^JIV\x),Q 2AaVC=?IS80wbQB~'=6[JT,nyAhA_Dx1JwEyI^JړOjҘz+W:v-NNAJx>3Icd'_Xd$s zŋVT3X(HN!dQDoa:^D'A a m>-dk'OčJs ZVzB~2`yuV]J`0)R^9c`ɥUThDHǔ, O^$/G.wIH82 @dy71;/r˾h2a%*[h[P*InU$: asUlLZEltRGK4 -[*^CztK^%g©qdWDZ asY~}x8 C=.4i+W]!#O\ӮD]tȔw9/ՄxtMԥk͎!nTzD屨<$ z9Ghy7ޢ,IBd|N\Ɖ2NWIv&B蔢-VxA!2]r( #?t@?:̌zRqv䆳IVdȉ~(/ŖCU,?&Ǟ ^SxN,OtmzQbߗ  )^0PXccрpP&vHa9:-'jlWf~*{qfWMB8^9,ZgY!o!sN[ϺkXl6G-r?B]JkcdC2"ͪFFaGSQ+0\*e$ )E@jA*a6/I2J$)t%uxse: t.fdmX1-]PHל!"5 3aeLdOg Bʺ;fr%:FLJ &^urTlRc;B"sW$>>K;$u @PȎXg6]%bp"Ֆ܌PbM3q9 yjP9^䐼ͣFjkΊ"fF]eɕQJY )u#.mXX+w{,=7|pڝ]eƛGL/eTW"M5z,PKRԘ3AzxJ@IkBidWg3R#ahM&P 62 9 PfeDkBhBF/+KrDA4PKm;6-{W U=;n"/C~0%ӳ}̓OkLD&v9I+So_m)ďԻC)Nbs^z+\␝BQ'b o+b~jQ| \ [C,vgP\ıǂ? am~_;so97K^)b,t|mqM|mHژeYZdqS T:L6jU)r];O]L](0$;xT⭜MS&PL#'ģ86xnS?8=/54 /CE2_+3˧N~HTd-trW!O1V2MF7nǍZu=Q%">!LaGaRDyeK'ٌ>L诙fu`=̡!̏&n{苂RV .梍3OIK +]ڍ!⣋aM3ͱag: ZCnя4D#v2"/ W#t{* G=V-e:bLS$ktr:t|PKPx]Ge#ڃo[qU~sT+/ծL fdzyuJQNFk(ju`G>tԣz]tБ>HؚڋvhI:eu/'QIPxY$̈́Ү>ՁX摵+W:*t~3ZaaBbfE㎷^E2a]9 ˄G 10?9'&3wZ7{}}q[W@VsOnjM:\r|j(~>&L "Q-BdՋ$3MBbJCsyS{EP' jE hUQp>ٻ8;&Cw69nQǣf_pLw-nbۆS#u*_=SL4Ɣ(u_ϭe.;~>W :naNMF%qC/ HBƝ4 ta_`guG_$ƚiLc#qe*`Hao*N0|dꨕcǘ**a+4 yi^{vv$dVפ-1ϣ9Byٽ'MZuŻLsgP@'e=6Kw ߾mm\ZgIyԴ\!Cȡ]U٥(}ؤp\AE&+ AA2Z #*PJ D Sn0[mγZbL+wsܣM߹Rz4=)7!O{g]}sǏSy=vȑr N}R!v/@-h [r*Ro c1(@W/l_-___oʘC{KH2ϬG%,kd/RQ8#'*{ 񴽞xҪA!/% /N+2`'!2?Al5_HS( r[ z4Gg.x@TVkx9 g'&dž!xUTxG7W腭NsonɎ#㟤_H_}O3x2dc 1Ĩ.༺z kǀF2V<;z\,zvM~3i;nէxvnOob&ʛO>EhN6P bNaq@QMk$X< 9Jo"AWM✲x Gr>ž } ؾ񚄽PW"z*(Tp<~uz͡3^{+ԉ|'rf2GMڝ`k֝19:Y19 yZVO4}cqz6FTRyOgYtc{ɸ#B4|wG_\ .kua da+̖{ר^`)N^jL割zWmF*'_W$zLU=m!>?Zҡ~I?}SaŜ3Gl>btE+&u]|"1l~_`5/Z %ISPnT-ZlB 'ZD.6'su1w"2cP F"S%j7=n#AZh:C%*;5_ҕtuC/bew ^쫗zkGtрOE< /뫊']  .CuLFIÜW'?}v/\i 6K'9OK@V\%SI eQg~f-jŧZ\ ֡rHgϷĴ_dpΖ~ǹ;'ruQ*7ku~,ڛ=bc+㜌>{1exypGRb/۳﯋MwlO5_@ 9Q? JABRm4c`͌5;wU0UFjRDE_o>9>]6{l{}OP;Am=^gC83R_o %!flGn|/O9=ϟ"|>̑j?e+8֠Sqey.{>7QMҤ _cZlJ#l\p V`MUX9ͧߑtvzd3AZq CFIp`$xIzUkЂ<Ԙ"tO*Id8zN,U81ʩe%C]*rjO+^e~\ٹy^$J"II"FЏd9KKU?KFD1#@ݡ#>a=6f`!SyGs|FGIX : -.GK POUPb4QjxՏ yםđ]('kߜZҹ[r79P7bxf.7t8/to,WKERcApyD*}{v&{ǚkcC!lqLI~#8s 5+haYӑz,2*4^`3U wCYb0<8~s ^Q7&jw݋4PE w}LLxv r%[_~=i}@kmòv&b:e[i')PFgevV2d [Pa,V,uUsbŽdγH+H7Ϥі׶]KzFu/c/%O~xPL/[Ջ_)=nVmʚJ}W0ҫ[[t2CL7m~nubVW_'mI@Q@Ȁ3&l⡶ldcFKq$}HI Y ͦ{U'6ヘKxtܧ6&u6p?[uxڠnr|sfK|>38l8.tAOs@.=Řys٦,8@ki 6LcH "1 Hk3?7/qL3䂍7f9 H~@r!] APcA*@T%G>;Lm;}J+StE'>/M398K-Cj,c4pY9cz 糵sSFI⦈q^ut(mz`qpks~kӊ|RY4?D(F?}AOzm1G0?7G2<H՞&~.|Sm}YL}gka=8UЩc'{HKn7LAG}+-`JٙQt'~Q6v"Ddg cZ ]~{j |-F}0EuR1޷U9#׍mU&E Fm1_bP:'?lF8a1OƤ ?$ ~`/9~qx>WOfo?Lc|!1?Ro凘*ڈu+p} qWGoVq=>mYe\mĺ~ :fS)hq>}Ln yq5W>pZJ4XH^׊^?7Ql o?< /cρ)y|W45͘q|/}?b^?S (!y8y?l_~hͪo3~fevL[ύPj_LFǘ6eZ<_8OIpyťX2/s?KB~9pҾ4ܛcڇgϫbh?^*}>>~W~}ܪK?MYeZ믳x=>_tRxgSg]؟l>Nzϫ(B]!!ϓ{V3y>-Eۣټ4MЄj)RJ))R*(@y\ ȏATTTQ2IScdu2U8k퓴 49}^k}sc@-s$z0>BA8!'{^u>|Cu'Qg VF|Jp"<: 8R Y4,֨瘎004Ic$&f8y:4fMOW]@7mey֏ULW呦 &돪 8TƆ2/'WJKorD-].[F̟xIWL4X/>@Z+ ugρw?v|ב_<O]yNwxX49Sv(Nnh}rپ}wt}?q›/sJǿϚ7oͼ(/|}_N`~9?*:+BcDyW3*s 7j 7)iҤxLDFR*aǶ~NO΢ߘ.y,*6q b[.9 MqDUB2䯈Y+_Mx=M•i\ZҊj8H=M+E6m,2sʖ_8MiSy_XC8旯&%FaA,N@2'`F hF R\+$Ēd,?SE#]w!"_}U6m7_'U/^ R0a."㖾4Q!Ԯ7ob:0f<"DȰvfokx ua:|w}|yXoTGLc"/* &W zI)W+(m\Ě6S"R)4[~7c57|80/1 FJ+q1`"j$IaLSaQQo / ]B8j r/:pjqCCQ6fxOA|J>Fs[Ĺ'?sws c.%)ɒ+˃: XäJI+VsP$%ȸea`*C]8d ! mK~oHyʉN%17f B尚k/**X\{\+_i' mJZ mߌoXNjr28D#_ .tOpZ,0H1{Rgt˞%%Xk"Њ5~Tg,gL-s-6mNBM%03x @ ).Pɰ L1;襀NDPPIs*9,f W˂S g-5#g/2{qb=}-VLc">O %:DU̼.j7!b) 0*M*#=\ I!U:^{l9"<:">ߓ_qJ!8p-4iRX%ئ;:hUԄIȆ^%tZ<VcT>te]X'|ȵ \`Bj TCUZzk ùI[1c [hF`b;.R`O]5-çIR=dɲ? Ѫ=X/ o\p.0HB";g1[=3Z[ TvuЇ`?L -R!vNzdi!汽!lT C"tnh1f:fM~]dB"Q[A?o^A,^xa[#MZ6MͅقkXɶHQiYMs/EUCܻZRǶ\M ?xQżh44S{@WKxN9 hFT.?6lF؆)P.?ҝ ڝOTYͼ,vڔ 8pr:cG7dlO׬]|Ly߱Hj{ґ8m^NC}QHN+;/U!1d ?Ɓ0ȶY ɭ7thK%zli\6ԕ@l9 Ae8 =,ٞt Oq>P5eejoBrhBE߶lEg^i_ˊu'}#+)ij%k iF㵓ڏɳ?s[+YTzw`>S.R| lj!o&Ѣ^b(aŴfp|]AWr%LQ59kl?jQ6yBWkh?SVHg.`ARwwxF͂ӓdc㪣#Y;4M1qNKmkLD7ڇlJ`o&ZH;Пt/ #c#o"冐1tzZנ 4dmH[\sXq}* 6Yց5>r˴aMx:}[`$ #AUgֿL\S.wowoٳ'Ϙ1}:m'UYU7g ewyAĆ!4)@IGa%i,u'D]~ F_b`%t^U\Ӫ$KWD No/u ӭX&h3Qo Ì 1XsC@ RE%|d@Mw* ,T͟;pl׵.4xueT%A%S8kP^pwwwpwrq(ozf罞qrljVy;Aie*(ҝ?~8~Hkw9zpadc,xYw{VۉL,|ySv?RN[m+JP<c[mO-OJi2q-.2-(#ZRÚOwyw_NZV{s---R7{}*}_9`х6߷VS[i(e' ť7U5 Y |`nj;TҐnк TT `9E}Me1udxf |HO:J\:"@MB]w\z( S4μVrސ{&ɆqF3&1/FjgFF@]E^:)C";l%^BxV$Q—Tn2K⢽Zi EE_9G%NVAO Of)(@KU%lV{cō[zj 䕐}͝q^!>oݓ@ˏ@mx%.Կ1N-03As^R0G#uLʫVdD}򩭯V=NcBx9WQע/iy#ٵ93^,PAD&'} I]wf l.PX=Lн!B?h~)(GkQ;6 3 )1*WEt)oUeiE!UZ"ZfO(qD3~foE+ Rlg6K#'6 YX6J|=U8 !'̣H ˄Doau4Hi1xN^s۱Fը+j3:lwLAIZ7`r b;g?! 8ԃʍ)5w)~*?gޝQC;wnų.;vµ c'\. f|^fzESF[ ,ȍI뀲)[;\@@7Gu6=sp[I*ߣI>P͏ۙĬuw\M25n'oo޽yY^Ӳw~y% UiDBފҎ9-o^IE{aU#2m*= uKq*O *-Ҙ=pV]]_3slT%6OJȇk}at_*Fәvt4ޛ '1s(I$#$6+YmćkFwW7/U._]_ȿ*RAdz}npĔQU `sk`;!:ZXb%<4Wa)yQR>Hqu9<|v뫅4v{XvŒ|3}"3ˬYK | $Z$#7zp.{Koks~x<*.ߚ40=o㾟d} 'М!|:Ӄ(Y QzL8R䆤?''IEoKx41 4ul =XsEäf}{дhȟB6zJmηB~u`9!vbLҬb9YgfpM;h[W;ü0'K.n>-s l*6xsy":2=-uO>4 шpi@WB/tam;[)cCi@sE|Mc\53XXEZ{h9iIԊ5xjG^/r eeJhX߰Q#r6jsQr⳧_Vݗr)"c&uGɫt+$ 2 U0y 30 `$B^&X zL eE4%X6Wr+w,`I`6B` ?+@Nz2{o7%m"4$cHpIdP4dby^'qL>_N|z~58Ii|$v;MВ%LwwA l$<*%?#3 IyufYb:D4xVeA<[tkl瘿5 ب}|IƸuUߏZ)fSeb }9p){5Y%)ǁtjr%fIDArexO^@`mI;塑$3#lꭶa]WR05 Ml9ON4sWtL td5̭3wRRR CO.n=رY,˒Iݟ:oe[{WH!o[^AWٯ*vX] ' -m`&au1_5vH6 :H1]Y՛ꚙ. )u6 k3tդ$,m䪻߇gU;T TZjjz8mA?=]^ 88ͼR6zoxكcGC峣ޚJ\.`xJ|$tL-dҪd=Kweh&¾rJegq氷E$jB֪ e;J;3JW=lZ=PRzOO^?&{)o'O'A%?]؎XBEGq9e~\+ii Xqk6`1o}/,e/^p?OzKֆ_)2ݛjp2+4&Ox?q;(gLQX.4@Zaϩ . 1AO^wc 6?Ar%WpvX^T颪ĥMTv?̥8 ޾zq= ODoYNraE*dWr-np̙/n1G|ct5e nd3YoGiͲ (igd68e}.0a~{8+...K_ԟvncߺ{fo#1>/>tG)뫒d6`2J<^8=G2 s;|z &x̥xćڊE?;[v@5Gw`3n$Ƥw[ XyO!GsjQ?l%"\?ӞŴFfjS}U3{p rۢu@Xo4՗*$asj6=3H/P[߻Wes9:zʜvb *O󷳏~BVmlÏ2FM?yWzI:" Ż'kw`eR W\BX+kym3l71 7qX6 # ӌ#t Ymu’DHwbΖxI0M?9uk9:LFz}Nx{{~C>7YhTkTR/mKLej2"bSW" <@j I V  _NFxZP˿BcY$Gp,ذpmF4GHق2)2i*3!]9dg8jk d34,kiKOj7ےoLɱ%#u,VIf,Pa+ztŃI@Ykٽ6I^kHfBII=]K6J)LŋDqB ƀ.KHڿWvד&ֱD oHrXEO# 1P40[8GE²­IFVUYZȮNoLQ.S+EH abmĪQ]Z];#AI*5rxM$ яԸEo1a8ߟɒ)jA _j6 MOIe,ڑrzvԊ)pΙyN5:u?ʾʸNMLMSX$OO@LݽԱVWg Tr,Zœ>b57ߜٴK2k_UoXާY 6IK,u%[RK,_GϏϻ=rrx NG\ᶲ+R 7T7 rj,ä؏na0MmnVur9;lS挛<}n޾]{S`aU-f - qp AKWCq#čǑ=fRNl4Y EHH8ٛˌ\ yϽ\ ݄\5 8~Y}ɋ)&&MYk@ F'_&sX3_i͓7]}>+Ow VOkɡ ֎R.KOwr^ mGtL8bČgAA@xW |RR02ap,2Xn4bcPAc'צ^RD}WRq3V7M>zDv=rs١ =IiE %t`##c T!:" ;)+x[7.> ◱L[p0yط1/&ٞKA Z>ݡKKKDϛ]] wȟ X}?g g{ zS6A{˿DEᧃSEN 7/|QOϷ=+ (0 B%k!!iJ 8.&Q0Y2 3aDGc͛ݏ\BQ뭧sOVo#00p00H0,0-0h06: =QCznB(`ASvDC@R`6qrtaVsCW٬Bk7]>RbmӼT>ތIU*M41쉑d+ L2n#);R>GE6δI[6ңNJEڽT󯹝o)y,z=t_[ 1 zyxA9Wx~o'PLWZۥC{Kbkq56b%sGdQ 7wr%PjҲh0 cc:XUE}8{/?-7pI>?~? ^B~$L/:k3/{5bU_e=^5M_f=V5i_G=Q5 ~_h=-bV_8n_*3ZK rno)cUv1?&=>H^.Ċ\k*8k*/$ߠ*a?`=he1@t E!lMp m rCg1C9Y`~9 ܉g{X懛_BG,z$ZC!Ň](< ӌQ{v~h!Fc ~4 e5¥5Zž#`.FWV#VFAZ t$mk@mx6̶o 6t >g >2k >݉z ^z Bz&V!K?2Zv7.cG =Mh'&&O o xXG#0'A+ s ^E_oݟDa6WD0W]uDʞDANF=]+O]mON#P'Qn6( : Tk J4Y5{^C$s1xC[=!{L=HG'T8P`"( C0f@0 {%3ѼR r]G<(ۣ(Wo߄FTFd{Gtߐ?c>?w ?…vf>"{w.`?"PC^Y8g'gQ#L7/Z#R5o[f^Ft޻IN^˅c޼z$H@^iЖR;Kؖ2BKɉD ^\SX94)s?ؓ ٳP\3%o4c,ף΂BG ,2U\CG, Ĭ \uP vL܎+ܜ+"ܵ+Dܸ+|L܉+Lܚ+rܳ+ܰ+L܁+ܒ+ܽ+ܴ+–Lܹ+어ܖ+ʖ{Ї4ʼH;nw.wŸ''9|,`ljw`> K` KvO> KfO {؇ݻDpД<.' B3~%//#.1.]0u6]u/]c#]pYׇ]^t3peӸ;/>`gԶ~'w(=J-wd Vaqm;(6{I4LALB[KpӞږgGGiDQA풥y?Lb:`_@Xܨp:r΄Ё1:=q/_o`o~n7v'^45o oq <a߈X n<77v׍ZnޥDDU[LYN#>,=͹k8** eG'F4QjZTh;( pӸET(H( swxs bc ;A%mL а]o mr!^`H횶_M2/hi+5Ĝ9nen4L BCMbR/\ b#=R*nۅZ9b{l89:{[4vbB ?$1Tւ#yՓՔeĭ0)%.jO૯ꪙExjp{OhfѺV5IFiF a Ka`o  j224L4%]j*.2f USV:, M&Ř58VRt, &E8cŁk Y0"?YAl@0iDg5ޡpqZ @{sWmsQ iaIw"1zkOӀ)L2$[ᘧ(|Nol7lh@ ڍdBF[em(G1NN NcɐފݯDA#)J2eC+Ю9NhxzF}l.OPnbK8eETa_&ʹmS\.){gVo+gE舵k\]]N5ݾN̲'l4cJMj7/2B|ptvW}"0޵uի# ~UWnvFmB;KpO'8&lWG!>yskSt}e' @wϛ ~Z{>k9:Z57 i(g݉x؊8rv(1}}~Q!cۈ&7vՄ$ o*UYx_ϼ/ +At L*vebuu|2rk~[1ϞFS/G1Ѿ [M\ļP X̸FŘme8a7DxU 71h4`.L@՟`; ʞ= 7sPKڕ\,PK y.FMangular-1.3.9/docs/components/open-sans-fontface-1.0.4/fonts/ExtraBoldItalic/PKy.Fiangular-1.3.9/docs/components/open-sans-fontface-1.0.4/fonts/ExtraBoldItalic/OpenSans-ExtraBoldItalic.eot̽yxU?|oUN;,$M– ,a}_TD}Qq]tqqeAf\㈐9w>?/:l}+u/Oy&AaAF^'FaJ38H;C?| 3zܢ[W݌q ȧ|#hm|?cev܉ϫw5iOe^d]v⤦Ҝ+V.Cg{g->a|cޜ8_y(Hm| -^u_Ɯ/Z:aƇo{?cً\fK k|K˖\3o8f,gٲsA7GbǷ.-9>Bw^wJ%`ԔUel5Z¬km؉.&=":=GFum1" 313)(A]Kc_4gђՋPc,cʆEش+8%8FتUtjD}qmQ&QFPG:KvQ+Y6O;ύ1bbcb_3 rwI>(?)T7a;β/qF:y|YA"(omxv+'}˾g'[DZ/$ff<3/F^Qy_~\> ?!?;2xQ'5FGz'/-gO:/{)˼J=4)OM?G8Wϊ1pٙ,uDZq!G˫q!q( G0&]fg6WRIղ|XYqYZ[9]o))Mq !?G&'dTmooʿRT%=/)NJ?\e$0;@?'Ll]9B@B 9 "^e  `J0 Kr\snR'7=7;7;$wF?gEۃ6OMJMoMEX[Gn?@rc6=h @m* ڴ mzmzwmkCf61RkkWZև[j:5C[Iߩoz}^y˩l-O/nbEg?9[x6t6llٔg]gZ|{g>=sL̡3 =3L389c9=tIO_vz~ N'vZi]\-_k)%4qZ_i̱DdIBn34 R007rY|B̙ά CCFb)/c,ugլzސ5eX6pă`c6u4.cc+xىMb6];`me=G>({=Ξ`A${b*X#{5{=Ϟc/!EZY(Ogky)'/b+erv[+ϕbk l?;6,~ \6'˕rG{=ٳ 2!'Cajy܏]%kAzmb;ٶB`~#Sr>Ij>Od҈!٧M8n {_×q_'LeJ~5s̓|>_I|&5xN>JeE*WWPMj$O Eޒb:ŪT4|lФ`*O cjbU)COf;)[2 p:h$qc$ fNlhX>TK* N^ TmжP`mj u Ѕw@CCB ft }[NlBd6;͢8;FVkÏHǣmcC3P x(_;> V(p,5mNh)\thBIUXSe^,;&J8e\[5W*;Ѥ$0Vf&Y|l<̺EAw~|Uֶl5u<x*ޑ7vcDS&"MJFόԳXoP>yj@3 ҙF,7h:hMNID"Q &8px%1(3hb.%f˛L+sɸkqRޔ uKKO wոNvi 0>yʵ G{v5KۏۻBMw5JoQG3F[)F{J.]Ts[}t:~QJ33Ɍ?'4fkP\dM$)?6]KKX5Gj0*X-#U!g2Wdzr8,97W?]7/߿\o^ﱟofY_Go}[۷[(}XGdjT-h|4Í<[X/WZ)&<Ʌr7FS)Õh~gj;Úy^uj843;>lTwcƤ|hgxܠgT^@I.'T`АHj[)ZDY4˭VFH$UrgHyE^-G,)~ kNyOI⡪qΡ >ڟн;vo7|?QɽgN}#}^ۨ~ykpypNC{ xϽSaLז ;:n.(ﰨfR'=b:Dh:)$EASnJZ)'6\1.- ƧKO0- ၸQDNɴpJծn- t.2 bЇCI[nCRI$Xe_Ion_wT7݆f[[<+>wQk#9+;1ƭGpk߃(+iI֯MztPR4hk9Z0Hh}H~/_8Ƽѩ|Cɣ _'keȑ_^ud|*;{oѼ=ZݤN#4 EҚuCFjĖ *b0uA6R! c0@^b:%0|jrT!\d $>_v?_'0OϵDl%Iÿ}|BaBM* x!{9o%/<ֳª{fYŗoߡG>xO~Iϙ˾U*XE4i* 6 F\8JU U*oT)tfAM.퐫ZP#.oN>Cߣ7KøK\}?§ܣb6B;ppXdȕXne^Ŵ|u}_?Vi2fRqyFd<;5RZwg~X<6  0 mu3nԌ 3|Ͳa}_+ Ka@LKG}Sq_b5s I;E4=y!X4MN8Ck`ؔ$LZVypɬBt<>|syees>:D+'t.Չejl=MvyDh䝅$apC.5r2.hxZr9h\Z5r8{Zr&i5E`eZ7Y HD$ -p>m[+,u#CjV߻b++xJrY{x%hM{ڿ3p7<ӣ6k$*6'$tV0 2o拱C te+QҬ 3ZI-VkKrlX+HU0X t! n#r*d#ү|;{Sʲrl[v_1>-Mh IcEFET,~LO:+;*0_NP]BE,.QX8rl4c³ʿ/_#dKieEБYYL`)bYGJZagvY,hO8]j&kT "n@wR-=&'&UAwԗCQi.jl4S9yrTtkbƑt!VJ*#v]u?~>_4~́C=VwW=K; >~+GOB)3+F Y,v I/G*@\/UO\KJwi9].9=,n:j;jqȩLu7qݗ)Y&co .}N֞͸[t= +yasCGWֿiez3[v7&et?,$ 5Y5Wxǥi,!hOCmժ٭蜇?r$^nk6%Wvp/mX;h3JU ͉'N+fb'?}fױ(М]Urɋ?%ڰ$ErvlvhhM1' &h!NɫDojv$.2+jJ^SbI`$1r$#Uʵoꊵ'&;*& |sQkY[vOa^cµcVM1Ӡŗ&vQƶ2>u-tC;(m*1ܥjB!\[ڔSib..Z4O.  _0@WZsL^Pӏ>5J+,\n Z<8R J*@?T[-V{zj|.1 Gta aEB#E^UX4Ot c ko]7\;}OsG.y}ܼb5=2ԟ9ti-G??߻ocv[3;74gƏnۚx}{[ZbXM∶leL, Dײ+rP(Ve\%}NdkswKJj>ܣ ug'?V”N'dQ|0¦KhIhx+,'4XK( sr15De.-}Aqi}h[7f4FRR*t{T?4IԘODB&z Tˁn5%-K)`C(2 ^}q<})c'7n@!7Ԙ?z$k֭5 8G%0}i%HEDӚ._LsѸd¾Qf!*LsT_.Jbωumؼw姹w\nѡY;oK9)nl߯ڥ;/L1o1N&ul3bx643$1J$ɬ'.ȍP4 RL%{@BQ3.7-n_9vpy`+Б(ڛ[4t$|ɚ@mV U4Ǯq^/ْ/8rlލV:dQJsy<*TWoc)(6h$fgnt.䏉F3]*?ʱߴvjZs4P_n9iЍo#/~U$kRaԼz2DĊIhR5g1k~ώdO]rx!2Ag|o߹ꃚA/K3Ush ;oտxH/ek8^|0-l8G%<H j 6-- MoLxBEH3 l [@8n~ϓ?:0$ Z3joFY7^R-eFm -g_Iu-@+9X `,ZH9Qޠ}i~\Z].0~8%6+4z}pEql~UhmV[,qps'WYaC'?[3 ',Ǡh+V14lPU!I dKNM=z~2bO)i-y*h0Tcc2F)2Ҭ Kj1MÞC@MN $*vE$)^Y-8HǡD*Hh@7Mmħ)kVFK"u'7vKW\OdMVD~B8 XY ɮp)fS5Vi -㳾 =w5gLom?_ Oh[q7vWS93ȗL&4, fh;]+l1BI zGo;=h{(7r[BB8Q},cB2OOL}fʲ!5=M~xI?g'b[Dvss "shdv SnOHfq]".ɂ$@(._\Y_>tC|s9mO>/*?++VN~{ zR6Nq?o@c/L4@8/qT?f/ldIt|phI<1}yI&T&X`id69bx of%i ]F/دt㻾rikZxf`Y =41b`¨ldi;Mvt1pkX0 W5rT; G5L!>Z؜ XsSò~؈Ԣl^ĕO[B~ak#!}3JKL{mV.RѽlǮ3_bX5a%f;)rӰy$mbj`SM"eT .ﮁ2XoppqBzxo2{EJ J"Vj%)*} R۰4B 6H "h{a#1&G:DZU͒K&Xi:EZl^Vn.NRTN[;[^u^5maK|˛=& .{ 7/M!ȖP< i -#>Gª}u"0OHoЛD!.~mƧ-a}-j&xv*a04x<13MB5wi,p=zKŒc8UGKVG&p,>K&]WNh>&ݾM-Hbp|E󾒕K_ړHb\t$Һ t9'^e1x1c\V0n2_/EN=1n}HZ-9Yw>90;e!A]c , DJ_~dޝ7JJo_r\c܊(eClh42R uZ!/6)! 4كR)2@,o5t-a0}<>q#aUc/EbRФ d1TSФjÅhC`%nᓇ4+o|qưcO_rC{&C>C{gD]";Z5Q:A⺩{Z=6}F:UbR@Z9]pB$pifҥSಔ< y iv7 "+54Y{z`os4C("@ջ#57{{>7Pn ^*xy$NZ9(pRD|46xK~9 ~]}KGJ/7rx^ڿ[sޟySXKJn*_Wb8Iۼ„y6GBo9k/C}!ȐXsg%&M&fTTCw pgb*E@5ʩd1c;_ #Ʈ'sf`< NZ癖L WIW 5k!+B9wN۠)YkwaOܽ`]>ipXcXp\܉4JRa#& 3Ƃ`;Y`vU!tH>vT$2dYȀ7]8e֪/)/n{łf/AI'6ZEeH5FśіDj">ïbDQU{.i<r Fs15҅~E]N ߡ/ݻߤ_Ϧ% @Ò/ܮtw3,Uԓi+ >3Me|pp~a2 G?F͊KL0*MþN}ED( I.όWUp=gXy| ߴ lGd8m3k? CEg--<΢22$pѱe:_5zj;(i\2 ?&a+BHn"Cs2jCjLv+;%*R(n 0 :B`$_'j 0dʢK'-By3lM0 =mbJsn" pY{߳rtkKwޖY6%g~SҐSkϭ|saQ}#;u9}E* 'vėMDb]zl9(%O8y찣Cww>9Uw.j: 9Ż(unݷ݉hy6yR7f%dED,lJiF cT 8u]Yij|ggϼ<ݯ~^C-6/~\T > 1("Ulh[,F0X u* hXubdD:jfpI4}t.'U6ȱ5̰n7o-ِoN;Zy❻yuҔ,Rw_> {%( &9a1vOhz#̰  #.eqˣC3JIosus1,6c,!XYdsC_ \R)IQV dF᠄VzNIv t jڱ5sXS Sb3S v}6HMHXH?~e( cPbi",1 Cp Crp._lt9lpA97C쓼k/:;7(G/BO o-Z>C#[7@޾w`(R K!^tA{>h̘ZC`2`Hn,47%k~e >CGuVZ3vxLy+iNlY$d_؉;#ppsDY+aDWrOh` BSV#BM-dR^,i:e]P(YSɣ@$&9ay8э|v֋%LJMJς2 !Hu[{'=B"n.$s 1V#L\k%We6<|>rW6a{ȼ|3Ѥ|sWR]4ɚ]H^?uGMT>xtx“W G[j9 5 ADbT1Zm  )EXQEg ihR@D:e1D(n()!]P9љQl3%ҙl0āzm H˜ uJD܁dsT$߰@B;͓j*aa9'f-Xmty8+<סtw.{iJ|tEceQ^&efRh ?4m~+r@ZBQ&Jąh GvZ* 9oĉ}%F ,% < §O$X]n/ΪD2 ` -º'Ä3{ul^x+O,^rΙi9oC0e#xNB;YHpm'hXzJ0adeَu>dןxL 3 8_9z(>SEV]dRՐ%ܔ͠P=rBmZX"ɕ@(!{"uXf5QRbvBUys^|e5jr[v2"R=;VgSfdNQd~ &ڞgdZ- <5#"PTX'TJid >`âF[C>FNO'LjGDfĤ2w1!:3O,(B??m\0Wb 9e2BصEM/)G\MFTTc kӒ/BHf5bKLr tJZV. K6&W- J/HZfԯac83ZwxCIjNԿvb}v}uΛ6u3:}fiST{2CD(3C&fCwuZXF`l98D#ۗIU/q`0:u?b a%X5"|6Lqs|#ŧ2NOu7w~ݍJ'4~%K+;f;# ($c#q>`yķ_zVY/ c#d1z0Ҧ}e4/Z*1&I9J c & Pq"90aw4%mJ@+67-ܭxB, 0iK7Tٜ$8؉l03W^guWOPSGS[ӈ|ܒCaÆ^_a*V|'Xy J|IMM>cgm)"%E A1KXX*a+ J @[1ݞg>%3ߕ`Đ'+5`-J#4cEhz6 vP7H8[(lM>픂HFMn".4CÍa‡i#cb'>y镶7jM׌j.)W,_(:R:af͕V\׿e7mFJ E&{MwSo~?/գ|.G[vݟ:{ɈǍߞ6IP5S``Pn(鏐Op.c(G"Ioܝ[)9\j_e)[.6dUIZ; /R[^ ej,K(q6JYOaj;zװ b0A'ޛ4C}T+#n΍S Z21{-_jى>[Ar$yji (mD(8(V]c@kV#rV$@vVg<8sYg~3葕U# O̙䌙f?32bDb U(|He[lZ%&">6:a0 L؟Bl`<rS1rgRDLkD VD1#, &e9,,F!mm񃾗Ov!O("C;tz/mJQ@n@3I vs²8@$< -Roѐ5unxfӼ&" F^֮[jT-W#rm kFl[" n82ڔnMACQ꥓',4]3d t;^z4r1Wt1T֣Wg X`]WlݷʩĂ Åc.w[x)Km>r) dk" ")__ Xt;IU {3l1"'H#&%F"dOG³6L1BO~%%.ha*L]trإ1c%O$dA.-T:KpiVD7%P/it{ 2AKja* 7mt]o^?ezn^ -w)d\wG\>$d$ A<k:bOP&mfsa'VdC_ ?܏z遗* \+s»r#oVJ)CدֹcgmZ>atpˆ^}[C#;_AZi1v׋&Q[7wzkl m ;![[^_<-<ݐ:F{H]yʆfn霿-Y+!GҠؠ9G@lPO*S@!wI_\zNulrJ+n9 ϔvcyM;G)d1Ҧ؜qQhߚYOr8ɢd['/$L|f?~oA95\#n޽V޽nRXfR^T LSȱQ2"qrrU|īz=9|a}/حs6ݜ'}G\{˯GV3bs]hyk38ef>Z[-9t?eޣpb:.(> *㠾[.U6b̄ > Gq"0ɻ*8B 4_%GB&d%) `9,TG)A7&#SU;yOGRI& -.慵gy|j⚴y^ckƮ72li oz{ڲS {aQnCLxyU{9cY6ğZwް/^:bf>iBo]^m2]6 z$֐6ڞ+%u$EB,Z/T^'W=ijc*H,AB>_F; }STݎ :`l[ װrrЭC9xV*vQ(xҥC;y]esc!#P#Xj_)%Rh &@2&"?6( &چ Qa@( >i[!}.=4 ݣekH5YKnW]c-SO SD(wkAῖVG;ϊw('_TЌh?)ylovԚL=y/!-,Y3Գ?~A~If܊luFWp S0 J |Q/b-p?ڰ+;JPyteDceؚBlff,/m؀Lf?YD=V/|_Swͺuώ]gai{gL(0}ﴜ[wf¿\O[#|0r0"FUX 4}oiL,`r?!5W7## =I02uM6HF`mT h<=鐛|r$ _iGsmY&#)Am}vϟA~wv|fI$HZ[ޖؘ /7L[<~_1\؃B%Ȯ=] Bs*lK.ޥjŠݎ]m]%N]]jLev5SΫ5Ӫ[%:mWuvm%Iu.P w@~QndU{+D pG,UĮbsb_r~ ѹÝ?U M9Gtu'>=޳{Qu7|bߥx]eÅԚ=ݺdCVky8+Xt; ){vKE0f >VE5g:+ʋWCr?^~O;}Af{J-q>FspP;ET?]k 7VwZ`:_Uc8ambRi)8L†ݵ J=5'9׵(K")5%3GrQq[ c]ѵ'i>c$  -0G)OcxǝCxAC[/bq9g7F.RV_) u;wME˦ ??wWӸ_ !氷s_>nu(_^/7Tҭu$l:im `yFo7s@c֐s ՟̿u:SSrd"~ðK88]|ag|GE.uG3rDa(#3f6'-<3Oc}k~=|kOU}囹t_,/p[9P:VϷXxˋ D"2gny VwV˛`lAy%'16";Suؼ<}`oSCg^S3G/~(m9$s'l*4!?<9F( tC[&\ՠ|bu#kL0(Āz {&2Vľ~CM^+%n;@Dӑ{\Jh̡QۗV){EGBBǣfR8sԖ5HL2l.Hm ?J*nl?tzrǃ 01kr3ɴ ktu{+ |Q؄}Oi' r[=B'6!QB+bb?#Qbk9hԟif>(UD1o'#GdW5Jo#e79S:1,.2)SGL¿Kͥ }jok+E";{h]*9Bg@<ҡ4>q_BewcI(AAB#dg,bc)}MbmoEKS_3ߤѻ1'/mh!Zs1SZݣcOF[i7S}f1f=)70^_7O,Oįm%,*?emvQHl1L^ A| {$v r~䃛-QzJ:K(>?2-/Rg%lRpV[Gn߆1/cxGj~ m@ƞ2Ŋ#۩?(SR͞W,bF2صl-_:L&mKV?lO oZn >H86>o ;=[Ǵ^`*xZ5SI9(=_%^eDzR9E$G~wiejKtSETYW|ϻޞwZ&3dJIF!BBB("U4AAvUtg&,+`/X`QY{yLݟC2}yOyނ-J`6R5//^OPNП<ڱdAg) x :I 7F Wǹ} AvsDy/М(\3gM8Hf1Ǵ_EY*s7M>)~~僣jh8R% TtE" |:-JK:(Ii4 #^x`A7(gD-=SEg{P'.5gR ~SMP?iW"ffvWsfq!^#sQ4xS\(-WmsI?h~cqy TkP2 kz'A'DA36$#nFpPnGR}a k,MXp-D8'q9 a90Tď]j(E\$R xZܔW=C'H "fD;zeץVl^/.W|?ld.=TQ+)xo 1(OO |>KK~~1}У742bϝ#Nr܏ y? =߈>!3A?ҥ˼91.}ϩP?g#NO|>Uq}z6:i1bǨ'|=4g%`To%g;yk73"n Ej`+(+ N|BHt~Dg"j6p0ņSPP\Nll8T" +=4OY6=EQ*_P ;l,- Hg!HЄ7{9I OLw_ I>Jd^'(9&$]ZCGLC'dcQġ#R3^(59ʮO(k});e&O-퍧7'ѶvkC4zC#Sn|+ϯS;;j2F/9nἫփI  o 5;A?ZRUn2Lu:yoL/?ET?߰OKf'"g)/y?@RC0NG7+ }WWS=>GE|vuؽs$/!o|?=9Řo|1j?/p5poZٿK\ֶ;(|84N*Dn܂SYG ʍD?'&v>xVmUVE>*S{(%u-`²b Of {fA]k@x-"> ڠ\(v=An"Ph3vѫWXꄘ  /pOj.z¨oUODU^Q!ȼ#w錆~#wgZG+t4EjPgHHߪɷb RU}BYdW<ͣh&ȈYQ侎 ]ZT1PpJ%tX<ðߦ~cq74 M~h=| 0U.k2ť"y"R-*w@#_D48_q%~3:DhYv(ruC.zVp1ؘqVAD.V+,xј$օ)u=x[TZD6Hr${ͱoXhsnƸ YTO438PS}\u%\U'V&cVy)d+%A?hkN6 ƁRRf3^`(HlIc!?rمWp]D7q«I{q] qeΐ WsaK¨f\|MbX Tz&#쌥p*߀;cqgl~[H e41B?`#j[Qΰo+IpZuquU4 zA_֑;I @'{x(#4Hdm Q.㦗* 5?wu˕fNzg`ʇ-ql\K\D+\rg-D J}|ٕuǜ:ׂc+{^C!f.g?4!baqEK_F]3R P+0{ n]+T14Nl =>v Q'?ycK,G^u^܎1_ d$MƜqPz NOgzd@@iwP EcX-ؾn*DDn9n2ߓL#<we>8;_koi_orÑ+,| ЁZj657[kbl Y)ĄZ+P% uĽNˬRL24eI5qE}[g̿Cygnc*$  j)bsGQƉX0L狑+RP=BM9Q-ie} |)w\p);%tC|>9:M;w;2䦊2R.:3 ťKk|m嵋^X@ tM#:ѿsiыpaCN5dQZӴlF xHHST\]` )WE*;iYΦiq$W/1ԙ-, -*h/n4hݶ̆֌E=m9vȻbќZq#x՟3vs=vF\,Q;>v!?xpHp &|?[>}>{>J#r: QV]@ %{u.[c ƌm)*yX>_ב&(`n`RFa74;)]ŽƉ tQ>dgP%i groq/f$./e"fodFZ_E.gtދ)Vsj/#S<#7-[Lpi+f3rb5Ʊ.4O~9/OI,E>'UWd{w߻]x1KNĹMω{DڗxPjωp6 SA-q*"huuHPW^X>a)' GI~OA~#NjF&~ɤjRf,D>H)\P JTZH] 6%:r$!1Tˆ3PB< dQ¨u!~T:#RD*Gw]sm|AG_rD9{AOQ*\p>ǔ/oe!<1FPKX#a p.xte# 8}X@f)Ј|5?_GzkQѱIl%I3#V(et*%M Eh'(::f8g6!6 !i ae^!I jm5LvnCv**IDLC$4ch2IaKp&,O 8U9 hfEc Th\ԟd1pf,b?ļ._3<~@ hh K Ǹ' @)xzIt]GBVE!e-˔D_?0gee306"9"Sf!|T&KHD 4lP'{\DXh:(KLtSg+6.QDDe@C9@Ը铻l(3wûN/r3פYsb}aVb1gJ֮̀ל]j”)}TwK~%/#F#EMʉqq -eaEmމ 0apPcj22O!$8s3#Ջ;S&9dSx1mIYXȞpQaIˁZ@v%tNN+/PQ]D}w|3Jʏ*_z{YLۤߊ5etMi+V+RYuEINvU~ާ ^\?9y9?#|6b܀ hLl.A`S&jΕN\M6_4*nxt 7j#) Z%B` e<>sM͓6tkrgQv8SSo/VT JS˔cCܼn5zSIA_鏅t4ɇPY-Of qQC^ 2dU5F,vtCi ƐTLO"K_rt)79v2卨~e7-O qzWW5zr&$dvIlx ; aWLPjmp$UMx0^K}~J{̤k{DtӊtKXN++>:Nxޅ&-hc4!pBjv\Pt'"Js!*UhJ$4LQU\_Y%N 7C$Œ'FpRNby#R*^ /$"gkf瓅HK`[Ll =lQ -'3vX~wuW>weðSVm}~**2PJVXPr"0A:l =E\Ag N EETjd#A4 n1uX_UZI<82^P>}T=X=g4B^n[GRR^mt4a]lJ}?֞G6Zۡ.mwHa).mHi=1]yal?@Y/?)EPWCl0P,j 01bXRTpRʨQyo'̩ڹ+K+]⾜JOBh:r jSdR0$B wpȢ#D\ԈG<ޙ@7G͝F̀m(㈥p%%x6hǛN=LGEǦ·D;,SI2B) CB5M[szNpw idRDkղW(CooSOTOY¦} r%Zv :k'(zMJ8U+\wz +x^R!]Փp>M[+,Pj`݀4<. E,k1Wep   ́]F.d9]i+ihXsNNH3"*#[92Ęhckt Ɨ+ktG>|'`;5PН  $x!O )Bbva{d|-Dm&3GDA<.Uh' 2TI02DaP{]y5I5bYOWjąb]vg,-;e V^*{һ(MrV:C|,΅ XgOQ)ʣXs)<|U>ډVcؚOk~F@<2Lgےy&"dH*؃J*! -qAZ9䗅Rt3?#s00;EhQx^+p'a:!Y6KBo@Ң6z$M  xSa!?#[I`OO3}x"kDqe̱q~s~q{֞k{?őQd׾"(lHy6DQ-5@&_W{kъh_?_(b;u`=v {J\asㅼ ;Zv͛j^Bm4eP-YND:H>Rqh#gZEҳ'CݦPA(!V Wn^-}%4HP3! pVdx;`9&X)ǮK% BQlxлIW#|TF*7?ThѾѨu$kwL> Ol7:Ic10lY+l$Fm#@="A"t;sB ty vm 5ZQ2@Q;\z벆g]¹}ͥw^d=suEu7Ȧ}Ք/ƩX@5IY($ӂɾ!PYō"oTk^*s{o\x38x9@c}?ȯD= |a/Ԅ@'i.'FA)LYn[Rmꘉco۪Ӻ7k}꣋r֓Mg[ wf#M  ZzvKPBHa,wjd6A[(552&80(Mƣ4zULݵIV]tg؍gJ1;xݲF"|PS-a d( ʞ1;*diw$3=DKyʲP]`>st%>o_[ߋs܉ T' #q@=|NyWk밿#Ȱf0 8}EJ>G0rG2xT4_Q#*7\;`.q]w9/]ge1goMU3A?+l[F/Ϟ.TD%|x4l%o7W:@[u)QMqǹsO)H#dc6ksIwm"vM $5b1R,4 #1zagڿg[[6Av$sЫWD\P~g'/Q,K32#çu̓- ׻ʲ>]r@m*LJ΄Mr5Rm)a>V[9愚a r01Bi&lm>cϬs?ΙM!m6pȇ@H'F*گDb"+V9N6 n+?p_??Pn 9)ڃ7;.:u@ޔ(//?q}?4efN7&ʗ(,2,hauxj 뒨Wl7bE"bHϊtXpiP|hs^ ipzʹATJ!{s6_&"`׺q\"8( x X2Y |}qFF^eDh8S?=KNgt.{@ikylcyBM L&^Q16GDJqe1@"Khr_q%~7˔|hz0։k{GE-kEcDe~w=ʖu<;7T7"FqCHXtN+wd2m\m.UX (-II(U"IsҫΣ DQ$' uM<KӡIHH {yN!hR|wÈ$<:[O0nɴXId /yEX;vjS۟,XCK`[jv5蘖6S&nC͊a@n;&J>>`RڷN;8kb1;vVB'fVGw;We"GFQU8:$1u@Y/~ +ۮDp¾66ː)ڍ5[~*,85#;G 8)n$reԟ f"R,b*B!FIx9nI<{&'APAK#BX}#ަ8щ2?vaUe8c {h1s6\ѬW?O{zmnygkMuV d.+U>+*hú9zØl U$2Y'&Ww%Nh,?DZGθteH#aʋ}Pm0P<~NOŢ4m5i{O4k>A-?3y nQIDvjh؇_;c?Dsďn$~tĚ_^ijtzyKl3B)3cėlEyB#~ו=;p4 b <8~JS;dz*@4R>`+ċ 麮we=)lJwݓM@ #zfj`@y dF֭r0&NؾeSL.4膷vEUCN {;'(wn|xdQaK(Kc#VWoNV)s Xk,͍o  yDmlE* % j*?2VB j26-B%p.M l3N]J}3{+#/|gVGV ǁnPQp.77'-PwO)v5_-F8f3|oH66/IOi'K8L3r7XTj#X+ɟQ3MP|i\ҹ=Jie̡yKz!mr)웏pV`seFI8%Zh𣋖%(0!o N+GTH֍5N?R)lOT f[E-\i1#FR0ɄTwϞ56zN(+ TϼwiYDN{ g\8cwwA2+ ϡwZMQ^خl闐2gBct],z{k"%^.Rs-fByi5`.=mrl^[P x(ՙ ٘ e8h i#h`+ Zg+jVvpXx滎k&N{ْZ­ϵzYJ{퇂?Eh#x/8:5dܦ$#"ʑ۟NG%j  u6t GW霣JVycb a:Qn1"NCBhv/)qX3kulQ;N (,9=' Kl[qBE0JPB^V ? ə|:C:C6k&BiGI Z8 >Bt$/+ MO YRv(_Xc& C;0#09tT1bXWo Z(A'E=~+ \trn"2S;H?g0DXPdBbz|GsOHE_;b-sSЈc3Uݷd-q^;޵YTNֱz@Np kl=i攙SvȽcX9(N-s WWZCKbm8j .֑:YIА'4WҴl9"؂WyOD-ؓMݰv\?FnҨe:e٫{Ku#D2,j=֎YݻVAj˱1ο84)$ቒI铱|!I7RҐSlyf9[4$'d"